{
  "version": 3,
  "sources": ["../node_modules/requires-port/index.js", "../node_modules/querystringify/index.js", "../node_modules/url-parse/index.js", "../node_modules/@stripe/stripe-js/dist/pure.js", "../node_modules/@stripe/stripe-js/pure/index.js", "../node_modules/htmx.org/dist/htmx.esm.js", "../node_modules/alpinejs/dist/module.esm.js", "../node_modules/@alpinejs/collapse/dist/module.esm.js", "../node_modules/@alpinejs/intersect/dist/module.esm.js", "../node_modules/@alpinejs/persist/dist/module.esm.js", "../node_modules/zod/v4/classic/external.js", "../node_modules/zod/v4/core/index.js", "../node_modules/zod/v4/core/core.js", "../node_modules/zod/v4/core/util.js", "../node_modules/zod/v4/core/errors.js", "../node_modules/zod/v4/core/parse.js", "../node_modules/zod/v4/core/regexes.js", "../node_modules/zod/v4/core/checks.js", "../node_modules/zod/v4/core/doc.js", "../node_modules/zod/v4/core/versions.js", "../node_modules/zod/v4/core/schemas.js", "../node_modules/zod/v4/locales/index.js", "../node_modules/zod/v4/locales/ar.js", "../node_modules/zod/v4/locales/az.js", "../node_modules/zod/v4/locales/be.js", "../node_modules/zod/v4/locales/bg.js", "../node_modules/zod/v4/locales/ca.js", "../node_modules/zod/v4/locales/cs.js", "../node_modules/zod/v4/locales/da.js", "../node_modules/zod/v4/locales/de.js", "../node_modules/zod/v4/locales/el.js", "../node_modules/zod/v4/locales/en.js", "../node_modules/zod/v4/locales/eo.js", "../node_modules/zod/v4/locales/es.js", "../node_modules/zod/v4/locales/fa.js", "../node_modules/zod/v4/locales/fi.js", "../node_modules/zod/v4/locales/fr.js", "../node_modules/zod/v4/locales/fr-CA.js", "../node_modules/zod/v4/locales/he.js", "../node_modules/zod/v4/locales/hr.js", "../node_modules/zod/v4/locales/hu.js", "../node_modules/zod/v4/locales/hy.js", "../node_modules/zod/v4/locales/id.js", "../node_modules/zod/v4/locales/is.js", "../node_modules/zod/v4/locales/it.js", "../node_modules/zod/v4/locales/ja.js", "../node_modules/zod/v4/locales/ka.js", "../node_modules/zod/v4/locales/km.js", "../node_modules/zod/v4/locales/kh.js", "../node_modules/zod/v4/locales/ko.js", "../node_modules/zod/v4/locales/lt.js", "../node_modules/zod/v4/locales/mk.js", "../node_modules/zod/v4/locales/ms.js", "../node_modules/zod/v4/locales/nl.js", "../node_modules/zod/v4/locales/no.js", "../node_modules/zod/v4/locales/ota.js", "../node_modules/zod/v4/locales/ps.js", "../node_modules/zod/v4/locales/pl.js", "../node_modules/zod/v4/locales/pt.js", "../node_modules/zod/v4/locales/ro.js", "../node_modules/zod/v4/locales/ru.js", "../node_modules/zod/v4/locales/sl.js", "../node_modules/zod/v4/locales/sv.js", "../node_modules/zod/v4/locales/ta.js", "../node_modules/zod/v4/locales/th.js", "../node_modules/zod/v4/locales/tr.js", "../node_modules/zod/v4/locales/uk.js", "../node_modules/zod/v4/locales/ua.js", "../node_modules/zod/v4/locales/ur.js", "../node_modules/zod/v4/locales/uz.js", "../node_modules/zod/v4/locales/vi.js", "../node_modules/zod/v4/locales/zh-CN.js", "../node_modules/zod/v4/locales/zh-TW.js", "../node_modules/zod/v4/locales/yo.js", "../node_modules/zod/v4/core/registries.js", "../node_modules/zod/v4/core/api.js", "../node_modules/zod/v4/core/to-json-schema.js", "../node_modules/zod/v4/core/json-schema-processors.js", "../node_modules/zod/v4/core/json-schema-generator.js", "../node_modules/zod/v4/core/json-schema.js", "../node_modules/zod/v4/classic/schemas.js", "../node_modules/zod/v4/classic/checks.js", "../node_modules/zod/v4/classic/iso.js", "../node_modules/zod/v4/classic/errors.js", "../node_modules/zod/v4/classic/parse.js", "../node_modules/zod/v4/classic/compat.js", "../node_modules/zod/v4/classic/from-json-schema.js", "../node_modules/zod/v4/classic/coerce.js", "../node_modules/zod/index.js", "../assets/ts/storage/upload.ts", "../assets/ts/storage/forms.ts", "../assets/ts/components/basemap.ts", "../assets/ts/components/geo.ts", "../assets/ts/components/areaselect.ts", "../assets/ts/forms/availability.ts", "../assets/ts/fetch.ts", "../assets/ts/buildpackChecklist.ts", "../assets/ts/components/buildpackshare.ts", "../assets/ts/linework/core/iso.ts", "../assets/ts/linework/core/motion.ts", "../assets/ts/linework/core/stage.ts", "../assets/ts/linework/core/styles.ts", "../assets/ts/linework/clip.ts", "../assets/ts/components/clip.ts", "../assets/ts/dates.ts", "../assets/ts/components/calendar.ts", "../node_modules/echarts/node_modules/tslib/tslib.es6.js", "../node_modules/zrender/lib/core/env.js", "../node_modules/zrender/lib/core/platform.js", "../node_modules/zrender/lib/core/util.js", "../node_modules/zrender/node_modules/tslib/tslib.es6.js", "../node_modules/zrender/lib/core/vector.js", "../node_modules/zrender/lib/mixin/Draggable.js", "../node_modules/zrender/lib/core/Eventful.js", "../node_modules/zrender/lib/core/fourPointsTransform.js", "../node_modules/zrender/lib/core/dom.js", "../node_modules/zrender/lib/core/event.js", "../node_modules/zrender/lib/core/GestureMgr.js", "../node_modules/zrender/lib/core/matrix.js", "../node_modules/zrender/lib/core/Point.js", "../node_modules/zrender/lib/core/BoundingRect.js", "../node_modules/zrender/lib/Handler.js", "../node_modules/zrender/lib/core/timsort.js", "../node_modules/zrender/lib/graphic/constants.js", "../node_modules/zrender/lib/Storage.js", "../node_modules/zrender/lib/animation/requestAnimationFrame.js", "../node_modules/zrender/lib/animation/easing.js", "../node_modules/zrender/lib/core/curve.js", "../node_modules/zrender/lib/animation/cubicEasing.js", "../node_modules/zrender/lib/animation/Clip.js", "../node_modules/zrender/lib/core/LRU.js", "../node_modules/zrender/lib/tool/color.js", "../node_modules/zrender/lib/svg/helper.js", "../node_modules/zrender/lib/animation/Animator.js", "../node_modules/zrender/lib/animation/Animation.js", "../node_modules/zrender/lib/dom/HandlerProxy.js", "../node_modules/zrender/lib/config.js", "../node_modules/zrender/lib/core/Transformable.js", "../node_modules/zrender/lib/contain/text.js", "../node_modules/zrender/lib/Element.js", "../node_modules/zrender/lib/graphic/Group.js", "../node_modules/zrender/lib/zrender.js", "../node_modules/echarts/lib/util/number.js", "../node_modules/echarts/lib/util/log.js", "../node_modules/echarts/lib/util/model.js", "../node_modules/echarts/lib/util/clazz.js", "../node_modules/echarts/lib/model/mixin/makeStyleMapper.js", "../node_modules/echarts/lib/model/mixin/areaStyle.js", "../node_modules/zrender/lib/graphic/helper/image.js", "../node_modules/zrender/lib/graphic/helper/parseText.js", "../node_modules/zrender/lib/graphic/Displayable.js", "../node_modules/zrender/lib/core/bbox.js", "../node_modules/zrender/lib/core/PathProxy.js", "../node_modules/zrender/lib/contain/line.js", "../node_modules/zrender/lib/contain/cubic.js", "../node_modules/zrender/lib/contain/quadratic.js", "../node_modules/zrender/lib/contain/util.js", "../node_modules/zrender/lib/contain/arc.js", "../node_modules/zrender/lib/contain/windingLine.js", "../node_modules/zrender/lib/contain/path.js", "../node_modules/zrender/lib/graphic/Path.js", "../node_modules/zrender/lib/graphic/TSpan.js", "../node_modules/zrender/lib/graphic/Image.js", "../node_modules/zrender/lib/graphic/helper/roundRect.js", "../node_modules/zrender/lib/graphic/helper/subPixelOptimize.js", "../node_modules/zrender/lib/graphic/shape/Rect.js", "../node_modules/zrender/lib/graphic/Text.js", "../node_modules/echarts/lib/util/innerStore.js", "../node_modules/echarts/lib/util/states.js", "../node_modules/echarts/lib/util/graphic.js", "../node_modules/zrender/lib/tool/transformPath.js", "../node_modules/zrender/lib/tool/path.js", "../node_modules/zrender/lib/graphic/shape/Circle.js", "../node_modules/zrender/lib/graphic/shape/Ellipse.js", "../node_modules/zrender/lib/graphic/helper/roundSector.js", "../node_modules/zrender/lib/graphic/shape/Sector.js", "../node_modules/zrender/lib/graphic/shape/Ring.js", "../node_modules/zrender/lib/graphic/helper/smoothBezier.js", "../node_modules/zrender/lib/graphic/helper/poly.js", "../node_modules/zrender/lib/graphic/shape/Polygon.js", "../node_modules/zrender/lib/graphic/shape/Polyline.js", "../node_modules/zrender/lib/graphic/shape/Line.js", "../node_modules/zrender/lib/graphic/shape/BezierCurve.js", "../node_modules/zrender/lib/graphic/shape/Arc.js", "../node_modules/zrender/lib/graphic/CompoundPath.js", "../node_modules/zrender/lib/graphic/Gradient.js", "../node_modules/zrender/lib/graphic/LinearGradient.js", "../node_modules/zrender/lib/graphic/RadialGradient.js", "../node_modules/zrender/lib/core/OrientedBoundingRect.js", "../node_modules/zrender/lib/graphic/IncrementalDisplayable.js", "../node_modules/echarts/lib/animation/basicTransition.js", "../node_modules/echarts/lib/label/labelStyle.js", "../node_modules/echarts/lib/model/mixin/textStyle.js", "../node_modules/echarts/lib/model/mixin/lineStyle.js", "../node_modules/echarts/lib/model/mixin/itemStyle.js", "../node_modules/echarts/lib/model/Model.js", "../node_modules/echarts/lib/util/component.js", "../node_modules/echarts/lib/i18n/langEN.js", "../node_modules/echarts/lib/i18n/langZH.js", "../node_modules/echarts/lib/core/locale.js", "../node_modules/echarts/lib/scale/break.js", "../node_modules/echarts/lib/util/time.js", "../node_modules/echarts/lib/legacy/getTextRect.js", "../node_modules/echarts/lib/util/format.js", "../node_modules/echarts/lib/core/CoordinateSystem.js", "../node_modules/echarts/lib/util/layout.js", "../node_modules/echarts/lib/model/Component.js", "../node_modules/echarts/lib/visual/tokens.js", "../node_modules/echarts/lib/model/globalDefault.js", "../node_modules/echarts/lib/util/types.js", "../node_modules/echarts/lib/data/helper/sourceHelper.js", "../node_modules/echarts/lib/model/internalComponentCreator.js", "../node_modules/echarts/lib/model/mixin/palette.js", "../node_modules/echarts/lib/model/Global.js", "../node_modules/echarts/lib/core/ExtensionAPI.js", "../node_modules/echarts/lib/model/OptionManager.js", "../node_modules/echarts/lib/preprocessor/helper/compatStyle.js", "../node_modules/echarts/lib/preprocessor/backwardCompat.js", "../node_modules/echarts/lib/processor/dataStack.js", "../node_modules/echarts/lib/data/Source.js", "../node_modules/echarts/lib/data/helper/dataProvider.js", "../node_modules/echarts/lib/model/mixin/dataFormat.js", "../node_modules/echarts/lib/core/task.js", "../node_modules/echarts/lib/data/helper/dataValueHelper.js", "../node_modules/echarts/lib/data/helper/transform.js", "../node_modules/echarts/lib/data/DataStore.js", "../node_modules/echarts/lib/data/helper/sourceManager.js", "../node_modules/echarts/lib/component/tooltip/tooltipMarkup.js", "../node_modules/echarts/lib/component/tooltip/seriesFormatTooltip.js", "../node_modules/echarts/lib/model/Series.js", "../node_modules/echarts/lib/view/Component.js", "../node_modules/echarts/lib/chart/helper/createRenderPlanner.js", "../node_modules/echarts/lib/view/Chart.js", "../node_modules/echarts/lib/util/throttle.js", "../node_modules/echarts/lib/visual/style.js", "../node_modules/echarts/lib/loading/default.js", "../node_modules/echarts/lib/core/Scheduler.js", "../node_modules/echarts/lib/theme/dark.js", "../node_modules/echarts/lib/util/ECEventProcessor.js", "../node_modules/echarts/lib/visual/symbol.js", "../node_modules/echarts/lib/visual/helper.js", "../node_modules/echarts/lib/legacy/dataSelectAction.js", "../node_modules/echarts/lib/util/event.js", "../node_modules/zrender/lib/core/WeakMap.js", "../node_modules/echarts/lib/util/symbol.js", "../node_modules/zrender/lib/canvas/helper.js", "../node_modules/zrender/lib/canvas/dashStyle.js", "../node_modules/zrender/lib/canvas/graphic.js", "../node_modules/echarts/lib/util/decal.js", "../node_modules/echarts/lib/visual/decal.js", "../node_modules/echarts/lib/core/lifecycle.js", "../node_modules/echarts/lib/core/impl.js", "../node_modules/echarts/lib/chart/custom/customSeriesRegister.js", "../node_modules/echarts/lib/core/echarts.js", "../node_modules/echarts/lib/extension.js", "../node_modules/echarts/lib/data/DataDiffer.js", "../node_modules/echarts/lib/data/helper/dimensionHelper.js", "../node_modules/echarts/lib/data/SeriesDimensionDefine.js", "../node_modules/echarts/lib/data/helper/SeriesDataSchema.js", "../node_modules/echarts/lib/data/SeriesData.js", "../node_modules/echarts/lib/data/helper/createDimensions.js", "../node_modules/echarts/lib/model/referHelper.js", "../node_modules/echarts/lib/data/helper/dataStackHelper.js", "../node_modules/echarts/lib/chart/helper/createSeriesData.js", "../node_modules/echarts/lib/scale/helper.js", "../node_modules/echarts/lib/scale/Scale.js", "../node_modules/echarts/lib/data/OrdinalMeta.js", "../node_modules/echarts/lib/scale/Ordinal.js", "../node_modules/echarts/lib/scale/Interval.js", "../node_modules/echarts/lib/util/vendor.js", "../node_modules/echarts/lib/layout/barGrid.js", "../node_modules/echarts/lib/scale/Time.js", "../node_modules/echarts/lib/scale/Log.js", "../node_modules/echarts/lib/coord/scaleRawExtentInfo.js", "../node_modules/echarts/lib/coord/axisHelper.js", "../node_modules/echarts/lib/coord/axisModelCommonMixin.js", "../node_modules/zrender/lib/contain/polygon.js", "../node_modules/echarts/lib/coord/geo/Region.js", "../node_modules/echarts/lib/coord/geo/parseGeoJson.js", "../node_modules/echarts/lib/export/api/format.js", "../node_modules/echarts/lib/coord/axisTickLabelBuilder.js", "../node_modules/echarts/lib/coord/Axis.js", "../node_modules/echarts/lib/label/labelGuideHelper.js", "../node_modules/echarts/lib/label/labelLayoutHelper.js", "../node_modules/echarts/lib/label/LabelManager.js", "../node_modules/echarts/lib/label/installLabelLayout.js", "../node_modules/zrender/lib/svg/SVGPathRebuilder.js", "../node_modules/zrender/lib/svg/mapStyleToAttrs.js", "../node_modules/zrender/lib/svg/core.js", "../node_modules/zrender/lib/svg/cssClassId.js", "../node_modules/zrender/lib/svg/cssAnimation.js", "../node_modules/zrender/lib/svg/cssEmphasis.js", "../node_modules/zrender/lib/svg/graphic.js", "../node_modules/zrender/lib/svg/domapi.js", "../node_modules/zrender/lib/svg/patch.js", "../node_modules/zrender/lib/svg/Painter.js", "../node_modules/echarts/lib/renderer/installSVGRenderer.js", "../node_modules/zrender/lib/canvas/Layer.js", "../node_modules/zrender/lib/canvas/Painter.js", "../node_modules/echarts/lib/renderer/installCanvasRenderer.js", "../node_modules/echarts/lib/chart/line/LineSeries.js", "../node_modules/echarts/lib/chart/helper/labelHelper.js", "../node_modules/echarts/lib/chart/helper/Symbol.js", "../node_modules/echarts/lib/chart/helper/SymbolDraw.js", "../node_modules/echarts/lib/chart/line/helper.js", "../node_modules/echarts/lib/chart/line/lineAnimationDiff.js", "../node_modules/echarts/lib/chart/line/poly.js", "../node_modules/echarts/lib/chart/helper/createClipPathFromCoordSys.js", "../node_modules/echarts/lib/coord/CoordinateSystem.js", "../node_modules/echarts/lib/chart/line/LineView.js", "../node_modules/echarts/lib/layout/points.js", "../node_modules/echarts/lib/processor/dataSample.js", "../node_modules/echarts/lib/chart/line/install.js", "../node_modules/echarts/lib/chart/bar/BaseBarSeries.js", "../node_modules/echarts/lib/chart/bar/BarSeries.js", "../node_modules/echarts/lib/util/shape/sausage.js", "../node_modules/echarts/lib/label/sectorLabel.js", "../node_modules/echarts/lib/chart/helper/sectorHelper.js", "../node_modules/echarts/lib/chart/bar/BarView.js", "../node_modules/echarts/lib/chart/bar/install.js", "../node_modules/echarts/lib/chart/pie/pieLayout.js", "../node_modules/echarts/lib/processor/dataFilter.js", "../node_modules/echarts/lib/chart/pie/labelLayout.js", "../node_modules/echarts/lib/chart/pie/PieView.js", "../node_modules/echarts/lib/chart/helper/createSeriesDataSimply.js", "../node_modules/echarts/lib/visual/LegendVisualProvider.js", "../node_modules/echarts/lib/chart/pie/PieSeries.js", "../node_modules/echarts/lib/processor/negativeDataFilter.js", "../node_modules/echarts/lib/chart/pie/install.js", "../node_modules/echarts/lib/chart/scatter/ScatterSeries.js", "../node_modules/echarts/lib/chart/helper/LargeSymbolDraw.js", "../node_modules/echarts/lib/chart/scatter/ScatterView.js", "../node_modules/echarts/lib/coord/cartesian/GridModel.js", "../node_modules/echarts/lib/coord/cartesian/AxisModel.js", "../node_modules/echarts/lib/coord/axisDefault.js", "../node_modules/echarts/lib/coord/axisCommonTypes.js", "../node_modules/echarts/lib/component/axis/axisBreakHelper.js", "../node_modules/echarts/lib/coord/axisModelCreator.js", "../node_modules/echarts/lib/coord/cartesian/Cartesian.js", "../node_modules/echarts/lib/coord/cartesian/Cartesian2D.js", "../node_modules/echarts/lib/coord/cartesian/Axis2D.js", "../node_modules/echarts/lib/component/axis/axisAction.js", "../node_modules/echarts/lib/component/axis/AxisBuilder.js", "../node_modules/echarts/lib/coord/cartesian/cartesianAxisHelper.js", "../node_modules/echarts/lib/coord/axisAlignTicks.js", "../node_modules/echarts/lib/coord/cartesian/Grid.js", "../node_modules/echarts/lib/component/axisPointer/modelHelper.js", "../node_modules/echarts/lib/component/axis/AxisView.js", "../node_modules/echarts/lib/component/axis/axisSplitHelper.js", "../node_modules/echarts/lib/component/axis/CartesianAxisView.js", "../node_modules/echarts/lib/component/grid/installSimple.js", "../node_modules/echarts/lib/util/jitter.js", "../node_modules/echarts/lib/chart/scatter/jitterLayout.js", "../node_modules/echarts/lib/chart/scatter/install.js", "../node_modules/echarts/lib/chart/radar/radarLayout.js", "../node_modules/echarts/lib/chart/radar/backwardCompat.js", "../node_modules/echarts/lib/chart/radar/RadarView.js", "../node_modules/echarts/lib/chart/radar/RadarSeries.js", "../node_modules/echarts/lib/coord/radar/RadarModel.js", "../node_modules/echarts/lib/component/radar/RadarView.js", "../node_modules/echarts/lib/coord/radar/IndicatorAxis.js", "../node_modules/echarts/lib/coord/radar/Radar.js", "../node_modules/echarts/lib/component/radar/install.js", "../node_modules/echarts/lib/chart/radar/install.js", "../node_modules/echarts/lib/component/helper/interactionMutex.js", "../node_modules/echarts/lib/component/helper/cursorHelper.js", "../node_modules/echarts/lib/component/helper/RoamController.js", "../node_modules/echarts/lib/component/helper/roamHelper.js", "../node_modules/zrender/lib/tool/parseXML.js", "../node_modules/zrender/lib/tool/parseSVG.js", "../node_modules/echarts/lib/coord/geo/GeoSVGResource.js", "../node_modules/echarts/lib/coord/geo/fix/nanhai.js", "../node_modules/echarts/lib/coord/geo/fix/textCoord.js", "../node_modules/echarts/lib/coord/geo/fix/diaoyuIsland.js", "../node_modules/echarts/lib/coord/geo/GeoJSONResource.js", "../node_modules/echarts/lib/coord/geo/geoSourceManager.js", "../node_modules/echarts/lib/component/helper/MapDraw.js", "../node_modules/echarts/lib/chart/map/MapView.js", "../node_modules/echarts/lib/chart/map/MapSeries.js", "../node_modules/echarts/lib/chart/map/mapDataStatistic.js", "../node_modules/echarts/lib/chart/map/mapSymbolLayout.js", "../node_modules/echarts/lib/coord/View.js", "../node_modules/echarts/lib/coord/geo/Geo.js", "../node_modules/echarts/lib/coord/geo/geoCreator.js", "../node_modules/echarts/lib/coord/geo/GeoModel.js", "../node_modules/echarts/lib/component/geo/GeoView.js", "../node_modules/echarts/lib/component/geo/install.js", "../node_modules/echarts/lib/chart/map/install.js", "../node_modules/echarts/lib/chart/tree/layoutHelper.js", "../node_modules/echarts/lib/chart/tree/TreeView.js", "../node_modules/echarts/lib/data/helper/linkSeriesData.js", "../node_modules/echarts/lib/data/Tree.js", "../node_modules/echarts/lib/chart/helper/treeHelper.js", "../node_modules/echarts/lib/chart/tree/TreeSeries.js", "../node_modules/echarts/lib/chart/tree/traversalHelper.js", "../node_modules/echarts/lib/chart/tree/treeLayout.js", "../node_modules/echarts/lib/chart/tree/treeVisual.js", "../node_modules/echarts/lib/chart/tree/treeAction.js", "../node_modules/echarts/lib/chart/tree/install.js", "../node_modules/echarts/lib/chart/treemap/treemapAction.js", "../node_modules/echarts/lib/chart/helper/enableAriaDecalForTree.js", "../node_modules/echarts/lib/chart/treemap/TreemapSeries.js", "../node_modules/echarts/lib/chart/treemap/Breadcrumb.js", "../node_modules/echarts/lib/util/animation.js", "../node_modules/echarts/lib/chart/treemap/TreemapView.js", "../node_modules/echarts/lib/visual/VisualMapping.js", "../node_modules/echarts/lib/chart/treemap/treemapVisual.js", "../node_modules/echarts/lib/chart/treemap/treemapLayout.js", "../node_modules/echarts/lib/chart/treemap/install.js", "../node_modules/echarts/lib/chart/graph/categoryFilter.js", "../node_modules/echarts/lib/chart/graph/categoryVisual.js", "../node_modules/echarts/lib/chart/graph/edgeVisual.js", "../node_modules/echarts/lib/chart/helper/multipleGraphEdgeHelper.js", "../node_modules/echarts/lib/chart/graph/simpleLayoutHelper.js", "../node_modules/echarts/lib/chart/graph/simpleLayout.js", "../node_modules/echarts/lib/chart/graph/graphHelper.js", "../node_modules/echarts/lib/chart/graph/circularLayoutHelper.js", "../node_modules/echarts/lib/chart/graph/circularLayout.js", "../node_modules/echarts/lib/chart/graph/forceHelper.js", "../node_modules/echarts/lib/chart/graph/forceLayout.js", "../node_modules/echarts/lib/chart/graph/createView.js", "../node_modules/echarts/lib/chart/helper/LinePath.js", "../node_modules/echarts/lib/chart/helper/Line.js", "../node_modules/echarts/lib/chart/helper/LineDraw.js", "../node_modules/echarts/lib/chart/graph/adjustEdge.js", "../node_modules/echarts/lib/component/helper/thumbnailBridge.js", "../node_modules/echarts/lib/chart/graph/GraphView.js", "../node_modules/echarts/lib/data/Graph.js", "../node_modules/echarts/lib/chart/helper/createGraphFromNodeEdge.js", "../node_modules/echarts/lib/chart/graph/GraphSeries.js", "../node_modules/echarts/lib/chart/graph/install.js", "../node_modules/echarts/lib/chart/chord/ChordPiece.js", "../node_modules/echarts/lib/chart/chord/ChordEdge.js", "../node_modules/echarts/lib/chart/chord/ChordView.js", "../node_modules/echarts/lib/chart/chord/ChordSeries.js", "../node_modules/echarts/lib/chart/chord/chordLayout.js", "../node_modules/echarts/lib/chart/chord/install.js", "../node_modules/echarts/lib/chart/gauge/PointerPath.js", "../node_modules/echarts/lib/chart/gauge/GaugeView.js", "../node_modules/echarts/lib/chart/gauge/GaugeSeries.js", "../node_modules/echarts/lib/chart/gauge/install.js", "../node_modules/echarts/lib/chart/funnel/FunnelView.js", "../node_modules/echarts/lib/chart/funnel/FunnelSeries.js", "../node_modules/echarts/lib/chart/funnel/funnelLayout.js", "../node_modules/echarts/lib/chart/funnel/install.js", "../node_modules/echarts/lib/chart/parallel/ParallelView.js", "../node_modules/echarts/lib/chart/parallel/ParallelSeries.js", "../node_modules/echarts/lib/chart/parallel/parallelVisual.js", "../node_modules/echarts/lib/coord/parallel/parallelPreprocessor.js", "../node_modules/echarts/lib/component/parallel/ParallelView.js", "../node_modules/echarts/lib/coord/parallel/ParallelModel.js", "../node_modules/echarts/lib/coord/parallel/ParallelAxis.js", "../node_modules/echarts/lib/component/helper/sliderMove.js", "../node_modules/echarts/lib/coord/parallel/Parallel.js", "../node_modules/echarts/lib/coord/parallel/parallelCreator.js", "../node_modules/echarts/lib/coord/parallel/AxisModel.js", "../node_modules/echarts/lib/component/helper/BrushController.js", "../node_modules/echarts/lib/component/helper/brushHelper.js", "../node_modules/echarts/lib/component/axis/ParallelAxisView.js", "../node_modules/echarts/lib/component/axis/parallelAxisAction.js", "../node_modules/echarts/lib/component/parallel/install.js", "../node_modules/echarts/lib/chart/parallel/install.js", "../node_modules/echarts/lib/chart/sankey/SankeyView.js", "../node_modules/echarts/lib/chart/sankey/SankeySeries.js", "../node_modules/echarts/lib/chart/sankey/sankeyLayout.js", "../node_modules/echarts/lib/chart/sankey/sankeyVisual.js", "../node_modules/echarts/lib/chart/sankey/install.js", "../node_modules/echarts/lib/chart/helper/whiskerBoxCommon.js", "../node_modules/echarts/lib/chart/boxplot/BoxplotSeries.js", "../node_modules/echarts/lib/chart/boxplot/BoxplotView.js", "../node_modules/echarts/lib/chart/boxplot/boxplotLayout.js", "../node_modules/echarts/lib/chart/boxplot/prepareBoxplotData.js", "../node_modules/echarts/lib/chart/boxplot/boxplotTransform.js", "../node_modules/echarts/lib/chart/boxplot/install.js", "../node_modules/echarts/lib/chart/candlestick/candlestickVisual.js", "../node_modules/echarts/lib/chart/candlestick/CandlestickView.js", "../node_modules/echarts/lib/chart/candlestick/CandlestickSeries.js", "../node_modules/echarts/lib/chart/candlestick/preprocessor.js", "../node_modules/echarts/lib/chart/candlestick/candlestickLayout.js", "../node_modules/echarts/lib/chart/candlestick/install.js", "../node_modules/echarts/lib/chart/helper/EffectSymbol.js", "../node_modules/echarts/lib/chart/effectScatter/EffectScatterView.js", "../node_modules/echarts/lib/chart/effectScatter/EffectScatterSeries.js", "../node_modules/echarts/lib/chart/effectScatter/install.js", "../node_modules/echarts/lib/chart/helper/EffectLine.js", "../node_modules/echarts/lib/chart/helper/Polyline.js", "../node_modules/echarts/lib/chart/helper/EffectPolyline.js", "../node_modules/echarts/lib/chart/helper/LargeLineDraw.js", "../node_modules/echarts/lib/chart/lines/linesLayout.js", "../node_modules/echarts/lib/chart/lines/LinesView.js", "../node_modules/echarts/lib/chart/lines/LinesSeries.js", "../node_modules/echarts/lib/chart/lines/linesVisual.js", "../node_modules/echarts/lib/chart/lines/install.js", "../node_modules/echarts/lib/chart/heatmap/HeatmapLayer.js", "../node_modules/echarts/lib/chart/heatmap/HeatmapView.js", "../node_modules/echarts/lib/chart/heatmap/HeatmapSeries.js", "../node_modules/echarts/lib/chart/heatmap/install.js", "../node_modules/echarts/lib/chart/bar/PictorialBarView.js", "../node_modules/echarts/lib/chart/bar/PictorialBarSeries.js", "../node_modules/echarts/lib/chart/bar/installPictorialBar.js", "../node_modules/echarts/lib/chart/themeRiver/ThemeRiverView.js", "../node_modules/echarts/lib/chart/themeRiver/ThemeRiverSeries.js", "../node_modules/echarts/lib/chart/themeRiver/themeRiverLayout.js", "../node_modules/echarts/lib/chart/themeRiver/install.js", "../node_modules/echarts/lib/chart/sunburst/SunburstPiece.js", "../node_modules/echarts/lib/chart/sunburst/sunburstAction.js", "../node_modules/echarts/lib/chart/sunburst/SunburstView.js", "../node_modules/echarts/lib/chart/sunburst/SunburstSeries.js", "../node_modules/echarts/lib/chart/sunburst/sunburstLayout.js", "../node_modules/echarts/lib/chart/sunburst/sunburstVisual.js", "../node_modules/echarts/lib/chart/sunburst/install.js", "../node_modules/echarts/lib/chart/custom/CustomSeries.js", "../node_modules/echarts/lib/coord/cartesian/prepareCustom.js", "../node_modules/echarts/lib/coord/geo/prepareCustom.js", "../node_modules/echarts/lib/coord/single/prepareCustom.js", "../node_modules/echarts/lib/coord/polar/prepareCustom.js", "../node_modules/echarts/lib/coord/calendar/prepareCustom.js", "../node_modules/echarts/lib/coord/matrix/prepareCustom.js", "../node_modules/echarts/lib/util/styleCompat.js", "../node_modules/echarts/lib/animation/customGraphicTransition.js", "../node_modules/echarts/lib/animation/customGraphicKeyframeAnimation.js", "../node_modules/echarts/lib/chart/custom/CustomView.js", "../node_modules/echarts/lib/chart/custom/install.js", "../node_modules/echarts/lib/component/axisPointer/BaseAxisPointer.js", "../node_modules/echarts/lib/component/axisPointer/viewHelper.js", "../node_modules/echarts/lib/component/axisPointer/CartesianAxisPointer.js", "../node_modules/echarts/lib/component/axisPointer/AxisPointerModel.js", "../node_modules/echarts/lib/component/axisPointer/globalListener.js", "../node_modules/echarts/lib/component/axisPointer/AxisPointerView.js", "../node_modules/echarts/lib/component/axisPointer/findPointFromSeries.js", "../node_modules/echarts/lib/component/axisPointer/axisTrigger.js", "../node_modules/echarts/lib/component/axisPointer/install.js", "../node_modules/echarts/lib/component/grid/install.js", "../node_modules/echarts/lib/component/axisPointer/PolarAxisPointer.js", "../node_modules/echarts/lib/coord/polar/PolarModel.js", "../node_modules/echarts/lib/coord/polar/AxisModel.js", "../node_modules/echarts/lib/coord/polar/RadiusAxis.js", "../node_modules/echarts/lib/coord/polar/AngleAxis.js", "../node_modules/echarts/lib/coord/polar/Polar.js", "../node_modules/echarts/lib/coord/polar/polarCreator.js", "../node_modules/echarts/lib/component/axis/AngleAxisView.js", "../node_modules/echarts/lib/component/axis/RadiusAxisView.js", "../node_modules/echarts/lib/layout/barPolar.js", "../node_modules/echarts/lib/component/polar/install.js", "../node_modules/echarts/lib/coord/single/singleAxisHelper.js", "../node_modules/echarts/lib/component/axis/SingleAxisView.js", "../node_modules/echarts/lib/coord/single/AxisModel.js", "../node_modules/echarts/lib/coord/single/SingleAxis.js", "../node_modules/echarts/lib/coord/single/Single.js", "../node_modules/echarts/lib/coord/single/singleCreator.js", "../node_modules/echarts/lib/component/axisPointer/SingleAxisPointer.js", "../node_modules/echarts/lib/component/singleAxis/install.js", "../node_modules/echarts/lib/coord/calendar/CalendarModel.js", "../node_modules/echarts/lib/component/calendar/CalendarView.js", "../node_modules/echarts/lib/coord/calendar/Calendar.js", "../node_modules/echarts/lib/component/calendar/install.js", "../node_modules/echarts/lib/coord/matrix/matrixCoordHelper.js", "../node_modules/echarts/lib/coord/matrix/MatrixDim.js", "../node_modules/echarts/lib/coord/matrix/MatrixBodyCorner.js", "../node_modules/echarts/lib/coord/matrix/MatrixModel.js", "../node_modules/echarts/lib/component/matrix/MatrixView.js", "../node_modules/echarts/lib/coord/matrix/Matrix.js", "../node_modules/echarts/lib/component/matrix/install.js", "../node_modules/echarts/lib/component/graphic/GraphicModel.js", "../node_modules/echarts/lib/component/graphic/GraphicView.js", "../node_modules/echarts/lib/component/graphic/install.js", "../node_modules/echarts/lib/component/dataZoom/helper.js", "../node_modules/echarts/lib/component/dataZoom/DataZoomModel.js", "../node_modules/echarts/lib/component/dataZoom/SelectZoomModel.js", "../node_modules/echarts/lib/component/dataZoom/DataZoomView.js", "../node_modules/echarts/lib/component/dataZoom/SelectZoomView.js", "../node_modules/echarts/lib/component/dataZoom/AxisProxy.js", "../node_modules/echarts/lib/component/dataZoom/dataZoomProcessor.js", "../node_modules/echarts/lib/component/dataZoom/dataZoomAction.js", "../node_modules/echarts/lib/component/dataZoom/installCommon.js", "../node_modules/echarts/lib/component/dataZoom/installDataZoomSelect.js", "../node_modules/echarts/lib/component/toolbox/featureManager.js", "../node_modules/echarts/lib/component/toolbox/ToolboxModel.js", "../node_modules/echarts/lib/component/helper/listComponent.js", "../node_modules/echarts/lib/component/toolbox/ToolboxView.js", "../node_modules/echarts/lib/component/toolbox/feature/SaveAsImage.js", "../node_modules/echarts/lib/component/toolbox/feature/MagicType.js", "../node_modules/echarts/lib/component/toolbox/feature/DataView.js", "../node_modules/echarts/lib/component/dataZoom/history.js", "../node_modules/echarts/lib/component/toolbox/feature/Restore.js", "../node_modules/echarts/lib/component/helper/BrushTargetManager.js", "../node_modules/echarts/lib/component/toolbox/feature/DataZoom.js", "../node_modules/echarts/lib/component/toolbox/install.js", "../node_modules/echarts/lib/component/tooltip/TooltipModel.js", "../node_modules/echarts/lib/component/tooltip/helper.js", "../node_modules/echarts/lib/component/tooltip/TooltipHTMLContent.js", "../node_modules/echarts/lib/component/tooltip/TooltipRichContent.js", "../node_modules/echarts/lib/component/tooltip/TooltipView.js", "../node_modules/echarts/lib/component/tooltip/install.js", "../node_modules/echarts/lib/component/brush/preprocessor.js", "../node_modules/echarts/lib/visual/visualSolution.js", "../node_modules/echarts/lib/component/brush/selector.js", "../node_modules/echarts/lib/component/brush/visualEncoding.js", "../node_modules/echarts/lib/component/brush/BrushView.js", "../node_modules/echarts/lib/component/brush/BrushModel.js", "../node_modules/echarts/lib/component/toolbox/feature/Brush.js", "../node_modules/echarts/lib/component/brush/install.js", "../node_modules/echarts/lib/component/title/install.js", "../node_modules/echarts/lib/component/timeline/TimelineModel.js", "../node_modules/echarts/lib/component/timeline/SliderTimelineModel.js", "../node_modules/echarts/lib/component/timeline/TimelineView.js", "../node_modules/echarts/lib/component/timeline/TimelineAxis.js", "../node_modules/echarts/lib/component/timeline/SliderTimelineView.js", "../node_modules/echarts/lib/component/timeline/timelineAction.js", "../node_modules/echarts/lib/component/timeline/preprocessor.js", "../node_modules/echarts/lib/component/timeline/install.js", "../node_modules/echarts/lib/component/marker/checkMarkerInSeries.js", "../node_modules/echarts/lib/component/marker/MarkerModel.js", "../node_modules/echarts/lib/component/marker/MarkPointModel.js", "../node_modules/echarts/lib/component/marker/markerHelper.js", "../node_modules/echarts/lib/component/marker/MarkerView.js", "../node_modules/echarts/lib/component/marker/MarkPointView.js", "../node_modules/echarts/lib/component/marker/installMarkPoint.js", "../node_modules/echarts/lib/component/marker/MarkLineModel.js", "../node_modules/echarts/lib/component/marker/MarkLineView.js", "../node_modules/echarts/lib/component/marker/installMarkLine.js", "../node_modules/echarts/lib/component/marker/MarkAreaModel.js", "../node_modules/echarts/lib/component/marker/MarkAreaView.js", "../node_modules/echarts/lib/component/marker/installMarkArea.js", "../node_modules/echarts/lib/component/legend/LegendModel.js", "../node_modules/echarts/lib/component/legend/LegendView.js", "../node_modules/echarts/lib/component/legend/legendFilter.js", "../node_modules/echarts/lib/component/legend/legendAction.js", "../node_modules/echarts/lib/component/legend/installLegendPlain.js", "../node_modules/echarts/lib/component/legend/ScrollableLegendModel.js", "../node_modules/echarts/lib/component/legend/ScrollableLegendView.js", "../node_modules/echarts/lib/component/legend/scrollableLegendAction.js", "../node_modules/echarts/lib/component/legend/installLegendScroll.js", "../node_modules/echarts/lib/component/legend/install.js", "../node_modules/echarts/lib/component/dataZoom/InsideZoomModel.js", "../node_modules/echarts/lib/component/dataZoom/roams.js", "../node_modules/echarts/lib/component/dataZoom/InsideZoomView.js", "../node_modules/echarts/lib/component/dataZoom/installDataZoomInside.js", "../node_modules/echarts/lib/component/dataZoom/SliderZoomModel.js", "../node_modules/echarts/lib/component/dataZoom/SliderZoomView.js", "../node_modules/echarts/lib/component/dataZoom/installDataZoomSlider.js", "../node_modules/echarts/lib/component/dataZoom/install.js", "../node_modules/echarts/lib/visual/visualDefault.js", "../node_modules/echarts/lib/component/visualMap/VisualMapModel.js", "../node_modules/echarts/lib/component/visualMap/ContinuousModel.js", "../node_modules/echarts/lib/component/visualMap/VisualMapView.js", "../node_modules/echarts/lib/component/visualMap/helper.js", "../node_modules/echarts/lib/component/visualMap/ContinuousView.js", "../node_modules/echarts/lib/component/visualMap/visualMapAction.js", "../node_modules/echarts/lib/component/visualMap/visualEncoding.js", "../node_modules/echarts/lib/component/visualMap/preprocessor.js", "../node_modules/echarts/lib/component/visualMap/installCommon.js", "../node_modules/echarts/lib/component/visualMap/installVisualMapContinuous.js", "../node_modules/echarts/lib/component/visualMap/PiecewiseModel.js", "../node_modules/echarts/lib/component/visualMap/PiecewiseView.js", "../node_modules/echarts/lib/component/visualMap/installVisualMapPiecewise.js", "../node_modules/echarts/lib/component/visualMap/install.js", "../node_modules/echarts/lib/component/thumbnail/ThumbnailBridgeImpl.js", "../node_modules/echarts/lib/component/thumbnail/ThumbnailModel.js", "../node_modules/echarts/lib/component/thumbnail/ThumbnailView.js", "../node_modules/echarts/lib/component/thumbnail/install.js", "../node_modules/echarts/lib/visual/aria.js", "../node_modules/echarts/lib/component/aria/preprocessor.js", "../node_modules/echarts/lib/component/aria/install.js", "../node_modules/echarts/lib/util/conditionalExpression.js", "../node_modules/echarts/lib/component/transform/filterTransform.js", "../node_modules/echarts/lib/component/transform/sortTransform.js", "../node_modules/echarts/lib/component/transform/install.js", "../node_modules/echarts/lib/component/dataset/install.js", "../node_modules/zrender/lib/tool/convertPath.js", "../node_modules/zrender/lib/tool/dividePath.js", "../node_modules/zrender/lib/tool/morphPath.js", "../node_modules/echarts/lib/animation/morphTransitionHelper.js", "../node_modules/echarts/lib/animation/universalTransition.js", "../node_modules/echarts/lib/scale/breakImpl.js", "../node_modules/echarts/lib/component/axis/axisBreakHelperImpl.js", "../node_modules/echarts/lib/component/axis/installBreak.js", "../node_modules/echarts/lib/coord/cartesian/legacyContainLabel.js", "../node_modules/echarts/index.js", "../assets/ts/system/chartbar.ts", "../assets/ts/system/chartpie.ts", "../assets/ts/system/date.ts", "../assets/ts/analytics/dom.ts", "../assets/ts/analytics/combined-data.ts", "../assets/ts/analytics/combined.ts", "../assets/ts/analytics/aggregate.ts", "../assets/ts/analytics/delivery.ts", "../assets/ts/analytics/pipeline-aggregate.ts", "../assets/ts/analytics/pipeline.ts", "../assets/ts/analytics/sales-aggregate.ts", "../assets/ts/analytics/sales.ts", "../assets/ts/components/datetimepicker.ts", "../assets/ts/calc/sapscore.ts", "../assets/ts/design/geometry.ts", "../assets/ts/design/ids.ts", "../assets/ts/design/faces.ts", "../assets/ts/design/topology.ts", "../assets/ts/design/openings.ts", "../assets/ts/design/scene.ts", "../assets/ts/design/snap.ts", "../assets/ts/design/draft.ts", "../assets/ts/design/freshness.ts", "../apps/twin/tables/table4b.json", "../apps/twin/tables/table10c.json", "../apps/twin/tables/table12d.json", "../apps/twin/tables/table32.json", "../apps/twin/tables/declination.json", "../apps/twin/tables/table6b.json", "../apps/twin/tables/table6c.json", "../apps/twin/tables/table6d.json", "../apps/twin/tables/tableu1.json", "../apps/twin/tables/tableu3.json", "../apps/twin/tables/tableu4.json", "../apps/twin/tables/tableu5.json", "../assets/ts/calc/numeric.ts", "../assets/ts/calc/units.ts", "../assets/ts/calc/tables.ts", "../assets/ts/calc/lighting.ts", "../assets/ts/calc/gains.ts", "../apps/twin/tariffs.json", "../assets/ts/calc/tariffs.ts", "../assets/ts/calc/rating.ts", "../assets/ts/calc/dimensions.ts", "../assets/ts/calc/fabric.ts", "../assets/ts/calc/heating.ts", "../apps/twin/tables/tableu6.json", "../assets/ts/calc/region.ts", "../apps/twin/tables/tableu2.json", "../assets/ts/calc/ventilation.ts", "../apps/twin/tables/tablej1.json", "../apps/twin/tables/tablej2.json", "../apps/twin/tables/tablej4.json", "../apps/twin/tables/tablej5.json", "../assets/ts/calc/water.ts", "../assets/ts/calc/worksheet.ts", "../assets/ts/design/emitters.ts", "../assets/ts/design/heatpumpcost.ts", "../assets/ts/design/ceiling.ts", "../assets/ts/heatload/geometry.ts", "../assets/ts/design/features.ts", "../assets/ts/design/newbuild.ts", "../assets/ts/design/orientation.ts", "../assets/ts/design/bridge.ts", "../assets/ts/design/resolve.ts", "../assets/ts/design/scenarios.ts", "../assets/ts/design/api.ts", "../assets/ts/design/fabric.ts", "../assets/ts/design/chart.ts", "../apps/design/dhdg/ventilation.json", "../assets/ts/heatload/ventilation.ts", "../apps/design/dhdg/temperatures.json", "../assets/ts/heatload/temperatures.ts", "../assets/ts/heatload/engine.ts", "../apps/design/dhdg/constructions.json", "../assets/ts/heatload/constructions.ts", "../assets/ts/heatload/ground.ts", "../assets/ts/design/heatfabric.ts", "../assets/ts/heatload/model.ts", "../assets/ts/design/setup.ts", "../assets/ts/design/heatmodel.ts", "../assets/ts/design/heatload.ts", "../assets/ts/design/chimney.ts", "../assets/ts/design/partywalls.ts", "../assets/ts/design/planchecks.ts", "../assets/ts/design/rigid.ts", "../assets/ts/design/stacking.ts", "../assets/ts/design/checks.ts", "../assets/ts/design/checklist.ts", "../assets/ts/design/gestures.ts", "../assets/ts/design/hover.ts", "../assets/ts/design/changelog.ts", "../assets/ts/design/roominspector.ts", "../assets/ts/design/tools/floor.ts", "../assets/ts/design/flooralign.ts", "../assets/ts/design/catalog.ts", "../assets/ts/design/placement.ts", "../assets/ts/design/tools/brush.ts", "../assets/ts/design/drop.ts", "../assets/ts/design/figures.ts", "../assets/ts/calc/inputs.ts", "../assets/ts/design/heatloss.ts", "../apps/twin/tolerances.json", "../assets/ts/calc/formulas.ts", "../assets/ts/calc/worksheet-flow.json", "../assets/ts/calc/worksheetlines.ts", "../assets/ts/design/worksheetview.ts", "../assets/ts/design/phases.ts", "../assets/ts/design/heatmap.ts", "../apps/twin/parto.json", "../assets/ts/overheating/parto.ts", "../assets/ts/design/overheating.ts", "../assets/ts/design/fixtureicons.ts", "../assets/ts/design/trace.ts", "../assets/ts/design/traceframe.ts", "../assets/ts/design/renderer.ts", "../assets/ts/design/three/mesh.ts", "../assets/ts/design/three/roof.ts", "../assets/ts/design/three/site.ts", "../assets/ts/design/northfit.ts", "../assets/ts/design/plotplan.ts", "../assets/ts/design/scenariomarks.ts", "../assets/ts/design/heatpump/clearance.ts", "../assets/ts/design/heatpump/models.ts", "../assets/ts/design/heatpump/noise.ts", "../assets/ts/design/heatpump/mount.ts", "../assets/ts/design/fixtures.ts", "../assets/ts/design/heatpump/cylinder.ts", "../assets/ts/design/heatpump/report.ts", "../assets/ts/design/iso.ts", "../assets/ts/design/drawings.ts", "../assets/ts/design/partofigures.ts", "../assets/ts/design/today.ts", "../assets/ts/design/packagefigures.ts", "../assets/ts/design/scenarioview.ts", "../assets/ts/design/scenelive.ts", "../assets/ts/design/scenestrip.ts", "../assets/ts/design/targets.ts", "../assets/ts/design/annotationsync.ts", "../assets/ts/design/follow.ts", "../assets/ts/design/history.ts", "../assets/ts/design/multiselect.ts", "../assets/ts/design/core.ts", "../assets/ts/design/overlay.ts", "../assets/ts/design/three/state.ts", "../assets/ts/design/outliner.ts", "../assets/ts/design/panes.ts", "../assets/ts/design/pagesize.ts", "../assets/ts/design/traces.ts", "../assets/ts/design/tools/annotate.ts", "../assets/ts/design/tools/align.ts", "../assets/ts/design/tools/calibrate.ts", "../assets/ts/design/tools/trace.ts", "../assets/ts/design/tools/opening.ts", "../assets/ts/design/tools/emitter.ts", "../assets/ts/design/tools/fixture.ts", "../assets/ts/design/tools/path.ts", "../assets/ts/design/tools/room.ts", "../assets/ts/design/tools/split.ts", "../assets/ts/design/phasing.ts", "../assets/ts/design/extension.ts", "../assets/ts/design/tools/extend.ts", "../assets/ts/design/extensionform.ts", "../assets/ts/design/proposal.ts", "../assets/ts/design/packfigures.ts", "../assets/ts/design/latewrite.ts", "../assets/ts/design/bringforward.ts", "../assets/ts/design/tools/wall.ts", "../assets/ts/design/resize.ts", "../assets/ts/design/tools/select.ts", "../assets/ts/design/viewport.ts", "../assets/ts/design/editor.ts", "../assets/ts/design/menubar.ts", "../assets/ts/design/stats.ts", "../assets/ts/design/scenecompare.ts", "../assets/ts/design/delta.ts", "../assets/ts/design/scenariocompare.ts", "../assets/ts/design/sheets/text.ts", "../assets/ts/design/sheets/draw.ts", "../assets/ts/design/sheets/model.ts", "../assets/ts/design/sheets/space.ts", "../assets/ts/design/sheets/plan.ts", "../assets/ts/design/sheets/dims.ts", "../assets/ts/design/sheets/roof.ts", "../assets/ts/design/sheets/elevation.ts", "../assets/ts/design/sheets/measures.ts", "../assets/ts/design/sheets/section.ts", "../assets/ts/design/sheets/sheet.ts", "../assets/ts/design/sheets/index.ts", "../assets/ts/design/sheets/modelroof.ts", "../assets/ts/design/sheets/dialog.ts", "../assets/ts/components/destroy.ts", "../assets/ts/components/rename.ts", "../assets/ts/components/file/drop.ts", "../assets/ts/components/uploaddropzone.ts", "../assets/ts/forms/file.ts", "../assets/ts/components/hepscore.ts", "../assets/ts/linework/figure.ts", "../assets/ts/linework/kit.ts", "../assets/ts/linework/figures/_walls.ts", "../assets/ts/linework/figures/bathroom.ts", "../assets/ts/linework/figures/battery.ts", "../assets/ts/linework/figures/_fans.ts", "../assets/ts/linework/figures/boiler.ts", "../assets/ts/linework/figures/damp.ts", "../assets/ts/linework/figures/decoration.ts", "../assets/ts/linework/figures/_openings.ts", "../assets/ts/linework/figures/door.ts", "../assets/ts/linework/figures/door-window.ts", "../assets/ts/linework/figures/draught-proofing.ts", "../assets/ts/linework/figures/_timber.ts", "../assets/ts/linework/figures/ductwork.ts", "../assets/ts/linework/figures/_roof.ts", "../assets/ts/linework/figures/extension.ts", "../assets/ts/linework/figures/flat-roof.ts", "../assets/ts/linework/figures/heat-controls.ts", "../assets/ts/linework/figures/heat-pump.ts", "../assets/ts/linework/figures/kitchen.ts", "../assets/ts/linework/figures/lighting.ts", "../assets/ts/linework/figures/loft-insulation.ts", "../assets/ts/linework/figures/loft-room.ts", "../assets/ts/linework/figures/pipework.ts", "../assets/ts/linework/figures/plans.ts", "../assets/ts/linework/figures/radiator.ts", "../assets/ts/linework/figures/scaffolding.ts", "../assets/ts/linework/figures/secondary-glazing.ts", "../assets/ts/linework/figures/solar-pv.ts", "../assets/ts/linework/figures/solar-thermal.ts", "../assets/ts/linework/figures/solid-floor.ts", "../assets/ts/linework/figures/suspended-floor.ts", "../assets/ts/linework/figures/thatch.ts", "../assets/ts/linework/figures/underfloor-heating.ts", "../assets/ts/linework/figures/ventilation.ts", "../assets/ts/linework/figures/wall-cavity.ts", "../assets/ts/linework/figures/wall-external.ts", "../assets/ts/linework/figures/wall-generic.ts", "../assets/ts/linework/figures/wall-internal.ts", "../assets/ts/linework/figures/wind-turbine.ts", "../assets/ts/linework/figures/window.ts", "../assets/ts/linework/index.ts", "../assets/ts/components/linework.ts", "../assets/ts/tracking/hubspot.ts", "../assets/ts/system/nav.ts", "../assets/ts/system/palette/rank.ts", "../assets/ts/system/palette/model.ts", "../assets/ts/system/palette.ts", "../node_modules/posthog-js/src/utils/globals.ts", "../node_modules/posthog-js/src/config.ts", "../node_modules/core/dist/gzip.mjs", "../node_modules/core/dist/utils/bot-detection.mjs", "../node_modules/core/dist/types.mjs", "../node_modules/core/dist/utils/string-utils.mjs", "../node_modules/core/dist/utils/type-utils.mjs", "../node_modules/core/dist/utils/number-utils.mjs", "../node_modules/core/dist/utils/bucketed-rate-limiter.mjs", "../node_modules/core/dist/utils/user-agent-utils.mjs", "../node_modules/core/dist/error-tracking/chunk-ids.mjs", "../node_modules/core/dist/utils/index.mjs", "../node_modules/core/dist/logs/logs-utils.mjs", "../node_modules/core/dist/error-tracking/error-properties-builder.mjs", "../node_modules/core/dist/error-tracking/parsers/base.mjs", "../node_modules/core/dist/error-tracking/parsers/safari.mjs", "../node_modules/core/dist/error-tracking/parsers/chrome.mjs", "../node_modules/core/dist/error-tracking/parsers/gecko.mjs", "../node_modules/core/dist/error-tracking/parsers/index.mjs", "../node_modules/core/dist/error-tracking/coercers/dom-exception-coercer.mjs", "../node_modules/core/dist/error-tracking/coercers/error-coercer.mjs", "../node_modules/core/dist/error-tracking/coercers/error-event-coercer.mjs", "../node_modules/core/dist/error-tracking/coercers/string-coercer.mjs", "../node_modules/core/dist/error-tracking/types.mjs", "../node_modules/core/dist/error-tracking/coercers/utils.mjs", "../node_modules/core/dist/error-tracking/coercers/object-coercer.mjs", "../node_modules/core/dist/error-tracking/coercers/event-coercer.mjs", "../node_modules/core/dist/error-tracking/coercers/primitive-coercer.mjs", "../node_modules/core/dist/error-tracking/coercers/promise-rejection-event.mjs", "../node_modules/core/dist/error-tracking/exception-steps.mjs", "../node_modules/posthog-js/src/utils/logger.ts", "../node_modules/posthog-js/src/entrypoints/external-scripts-loader.ts", "../node_modules/posthog-js/src/constants.ts", "../node_modules/posthog-js/src/utils/index.ts", "../node_modules/posthog-js/src/uuidv7.ts", "../node_modules/posthog-js/src/storage.ts", "../node_modules/posthog-js/src/consent.ts", "../node_modules/posthog-js/src/extensions/dead-clicks-autocapture.ts", "../node_modules/posthog-js/src/extensions/segment-integration.ts", "../node_modules/posthog-js/src/extensions/sentry-integration.ts", "../node_modules/posthog-js/src/page-view.ts", "../node_modules/posthog-js/src/persistence-key-transforms.ts", "../node_modules/posthog-js/src/persistence-key-policy.ts", "../node_modules/posthog-js/src/utils/request-utils.ts", "../node_modules/posthog-js/src/utils/event-utils.ts", "../node_modules/posthog-js/src/posthog-persistence.ts", "../node_modules/posthog-js/src/posthog-surveys-types.ts", "../node_modules/posthog-js/src/posthog-product-tours-types.ts", "../node_modules/posthog-js/src/rate-limiter.ts", "../node_modules/posthog-js/src/remote-config.ts", "../node_modules/posthog-js/src/types.ts", "../node_modules/.pnpm/fflate@0.4.8/node_modules/fflate/esm/browser.js", "../node_modules/posthog-js/src/request.ts", "../node_modules/posthog-js/src/utils/encode-utils.ts", "../node_modules/posthog-js/src/request-queue.ts", "../node_modules/posthog-js/src/retry-queue.ts", "../node_modules/posthog-js/src/scroll-manager.ts", "../node_modules/posthog-js/src/session-props.ts", "../node_modules/posthog-js/src/utils/simple-event-emitter.ts", "../node_modules/posthog-js/src/sessionid.ts", "../node_modules/posthog-js/src/utils/blocked-uas.ts", "../node_modules/posthog-js/src/utils/regex-utils.ts", "../node_modules/posthog-js/src/utils/property-utils.ts", "../node_modules/posthog-js/src/utils/request-router.ts", "../node_modules/posthog-js/src/utils/survey-utils.ts", "../node_modules/posthog-js/src/extensions/external-integration.ts", "../node_modules/posthog-js/src/posthog-core.ts", "../node_modules/core/dist/surveys/events.mjs", "../node_modules/posthog-js/src/utils/element-utils.ts", "../node_modules/posthog-js/src/autocapture-utils.ts", "../node_modules/posthog-js/src/extensions/rageclick.ts", "../node_modules/posthog-js/src/autocapture.ts", "../node_modules/posthog-js/src/extensions/exception-autocapture/index.ts", "../node_modules/posthog-js/src/extensions/replay/rrweb-plugins/patch.ts", "../node_modules/posthog-js/src/extensions/tracing-headers.ts", "../node_modules/posthog-js/src/extensions/web-vitals/index.ts", "../node_modules/posthog-js/src/extensions/replay/external/triggerMatching.ts", "../node_modules/posthog-js/src/extensions/replay/external/recording-strategies.ts", "../node_modules/posthog-js/src/extensions/replay/external/lazy-loaded-session-recorder.ts", "../node_modules/posthog-js/src/extensions/replay/session-recording.ts", "../node_modules/posthog-js/src/heatmaps.ts", "../node_modules/posthog-js/src/posthog-product-tours.ts", "../node_modules/posthog-js/src/site-apps.ts", "../node_modules/posthog-js/src/utils/elements-chain-utils.ts", "../node_modules/posthog-js/src/extensions/surveys/action-matcher.ts", "../node_modules/posthog-js/src/utils/event-receiver.ts", "../node_modules/posthog-js/src/utils/survey-event-receiver.ts", "../node_modules/posthog-js/src/posthog-surveys.ts", "../node_modules/posthog-js/src/extensions/toolbar.ts", "../node_modules/posthog-js/src/posthog-featureflags.ts", "../node_modules/posthog-js/src/posthog-exceptions.ts", "../node_modules/posthog-js/src/web-experiments.ts", "../node_modules/posthog-js/src/extensions/conversations/posthog-conversations.ts", "../node_modules/posthog-js/src/extensions/extension-bundles.ts", "../node_modules/posthog-js/src/extensions/history-autocapture.ts", "../node_modules/posthog-js/src/posthog-logs.ts", "../node_modules/posthog-js/src/entrypoints/default-extensions.ts", "../node_modules/posthog-js/src/entrypoints/module.no-external.es.ts", "../assets/ts/tracking/notfound.ts", "../assets/ts/components/notifications.ts", "../assets/ts/suppliers/plan.ts", "../assets/ts/tracking/posthog.ts", "../assets/ts/price.ts", "../assets/ts/components/projecttags.ts", "../assets/ts/forms/radio.ts", "../assets/ts/components/filepicker.ts", "../assets/ts/components/specchoices.ts", "../assets/ts/components/buildpackplan.ts", "../assets/ts/components/buildpackproperty.ts", "../assets/ts/components/buildpackv2.ts", "../assets/ts/components/listeditor.ts", "../assets/ts/components/saveall.ts", "../assets/ts/components/systemeditor.ts", "../assets/ts/components/systemlibrary.ts", "../assets/ts/recorder/chunkstore.ts", "../assets/ts/recorder/codec.ts", "../assets/ts/recorder/harness.ts", "../node_modules/tus-js-client/lib.esm/error.js", "../node_modules/tus-js-client/lib.esm/logger.js", "../node_modules/tus-js-client/lib.esm/noopUrlStorage.js", "../node_modules/js-base64/base64.mjs", "../node_modules/tus-js-client/lib.esm/upload.js", "../node_modules/tus-js-client/lib.esm/uuid.js", "../node_modules/tus-js-client/lib.esm/browser/isReactNative.js", "../node_modules/tus-js-client/lib.esm/browser/uriToBlob.js", "../node_modules/tus-js-client/lib.esm/browser/sources/isCordova.js", "../node_modules/tus-js-client/lib.esm/browser/sources/readAsByteArray.js", "../node_modules/tus-js-client/lib.esm/browser/sources/FileSource.js", "../node_modules/tus-js-client/lib.esm/browser/sources/StreamSource.js", "../node_modules/tus-js-client/lib.esm/browser/fileReader.js", "../node_modules/tus-js-client/lib.esm/browser/fileSignature.js", "../node_modules/tus-js-client/lib.esm/browser/httpStack.js", "../node_modules/tus-js-client/lib.esm/browser/urlStorage.js", "../node_modules/tus-js-client/lib.esm/browser/index.js", "../assets/ts/recorder/letterbox.ts", "../assets/ts/recorder/recovery.ts", "../assets/ts/recorder/statemachine.ts", "../assets/ts/recorder/recorder.ts", "../assets/ts/components/sortable.ts", "../assets/ts/assessment/stripe.ts", "../assets/ts/system/tableselectall.ts", "../assets/ts/components/taglists.ts", "../assets/ts/components/tocScrollspy.ts", "../assets/ts/components/contentsubmit.ts", "../assets/ts/components/copytoclipboard.ts", "../assets/ts/components/coveragesupply.ts", "../assets/ts/components/coveragemap.ts", "../assets/ts/tracking/tracking.ts", "../assets/ts/components/upload.ts", "../assets/ts/system/dialog.ts", "../assets/ts/storage/picked.ts", "../assets/ts/documents/model.ts", "../assets/ts/documents/browser.ts", "../assets/ts/documents/sphere.ts", "../assets/ts/documents/panorama.ts", "../assets/ts/documents/zoom.ts", "../assets/ts/system/dropdown.ts", "../assets/ts/system/command.ts", "../assets/ts/main.ts"],
  "sourcesContent": ["'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n  protocol = protocol.split(':')[0];\n  port = +port;\n\n  if (!port) return false;\n\n  switch (protocol) {\n    case 'http':\n    case 'ws':\n    return port !== 80;\n\n    case 'https':\n    case 'wss':\n    return port !== 443;\n\n    case 'ftp':\n    return port !== 21;\n\n    case 'gopher':\n    return port !== 70;\n\n    case 'file':\n    return false;\n  }\n\n  return port !== 0;\n};\n", "'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n  try {\n    return decodeURIComponent(input.replace(/\\+/g, ' '));\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n  try {\n    return encodeURIComponent(input);\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n  var parser = /([^=?#&]+)=?([^&]*)/g\n    , result = {}\n    , part;\n\n  while (part = parser.exec(query)) {\n    var key = decode(part[1])\n      , value = decode(part[2]);\n\n    //\n    // Prevent overriding of existing properties. This ensures that build-in\n    // methods like `toString` or __proto__ are not overriden by malicious\n    // querystrings.\n    //\n    // In the case if failed decoding, we want to omit the key/value pairs\n    // from the result.\n    //\n    if (key === null || value === null || key in result) continue;\n    result[key] = value;\n  }\n\n  return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n  prefix = prefix || '';\n\n  var pairs = []\n    , value\n    , key;\n\n  //\n  // Optionally prefix with a '?' if needed\n  //\n  if ('string' !== typeof prefix) prefix = '?';\n\n  for (key in obj) {\n    if (has.call(obj, key)) {\n      value = obj[key];\n\n      //\n      // Edge cases where we actually want to encode the value to an empty\n      // string instead of the stringified value.\n      //\n      if (!value && (value === null || value === undef || isNaN(value))) {\n        value = '';\n      }\n\n      key = encode(key);\n      value = encode(value);\n\n      //\n      // If we failed to encode the strings, we should bail out as we don't\n      // want to add invalid strings to the query.\n      //\n      if (key === null || value === null) continue;\n      pairs.push(key +'='+ value);\n    }\n  }\n\n  return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n", "'use strict';\n\nvar required = require('requires-port')\n  , qs = require('querystringify')\n  , controlOrWhitespace = /^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/\n  , CRHTLF = /[\\n\\r\\t]/g\n  , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//\n  , port = /:\\d+$/\n  , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i\n  , windowsDriveLetter = /^[a-zA-Z]:/;\n\n/**\n * Remove control characters and whitespace from the beginning of a string.\n *\n * @param {Object|String} str String to trim.\n * @returns {String} A new string representing `str` stripped of control\n *     characters and whitespace from its beginning.\n * @public\n */\nfunction trimLeft(str) {\n  return (str ? str : '').toString().replace(controlOrWhitespace, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n *    indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n *    the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n  ['#', 'hash'],                        // Extract from the back.\n  ['?', 'query'],                       // Extract from the back.\n  function sanitize(address, url) {     // Sanitize what is left of the address\n    return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n  },\n  ['/', 'pathname'],                    // Extract from the back.\n  ['@', 'auth', 1],                     // Extract from the front.\n  [NaN, 'host', undefined, 1, 1],       // Set left over value.\n  [/:(\\d*)$/, 'port', undefined, 1],    // RegExp the back.\n  [NaN, 'hostname', undefined, 1, 1]    // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n  var globalVar;\n\n  if (typeof window !== 'undefined') globalVar = window;\n  else if (typeof global !== 'undefined') globalVar = global;\n  else if (typeof self !== 'undefined') globalVar = self;\n  else globalVar = {};\n\n  var location = globalVar.location || {};\n  loc = loc || location;\n\n  var finaldestination = {}\n    , type = typeof loc\n    , key;\n\n  if ('blob:' === loc.protocol) {\n    finaldestination = new Url(unescape(loc.pathname), {});\n  } else if ('string' === type) {\n    finaldestination = new Url(loc, {});\n    for (key in ignore) delete finaldestination[key];\n  } else if ('object' === type) {\n    for (key in loc) {\n      if (key in ignore) continue;\n      finaldestination[key] = loc[key];\n    }\n\n    if (finaldestination.slashes === undefined) {\n      finaldestination.slashes = slashes.test(loc.href);\n    }\n  }\n\n  return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n  return (\n    scheme === 'file:' ||\n    scheme === 'ftp:' ||\n    scheme === 'http:' ||\n    scheme === 'https:' ||\n    scheme === 'ws:' ||\n    scheme === 'wss:'\n  );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n  address = trimLeft(address);\n  address = address.replace(CRHTLF, '');\n  location = location || {};\n\n  var match = protocolre.exec(address);\n  var protocol = match[1] ? match[1].toLowerCase() : '';\n  var forwardSlashes = !!match[2];\n  var otherSlashes = !!match[3];\n  var slashesCount = 0;\n  var rest;\n\n  if (forwardSlashes) {\n    if (otherSlashes) {\n      rest = match[2] + match[3] + match[4];\n      slashesCount = match[2].length + match[3].length;\n    } else {\n      rest = match[2] + match[4];\n      slashesCount = match[2].length;\n    }\n  } else {\n    if (otherSlashes) {\n      rest = match[3] + match[4];\n      slashesCount = match[3].length;\n    } else {\n      rest = match[4]\n    }\n  }\n\n  if (protocol === 'file:') {\n    if (slashesCount >= 2) {\n      rest = rest.slice(2);\n    }\n  } else if (isSpecial(protocol)) {\n    rest = match[4];\n  } else if (protocol) {\n    if (forwardSlashes) {\n      rest = rest.slice(2);\n    }\n  } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n    rest = match[4];\n  }\n\n  return {\n    protocol: protocol,\n    slashes: forwardSlashes || isSpecial(protocol),\n    slashesCount: slashesCount,\n    rest: rest\n  };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n  if (relative === '') return base;\n\n  var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n    , i = path.length\n    , last = path[i - 1]\n    , unshift = false\n    , up = 0;\n\n  while (i--) {\n    if (path[i] === '.') {\n      path.splice(i, 1);\n    } else if (path[i] === '..') {\n      path.splice(i, 1);\n      up++;\n    } else if (up) {\n      if (i === 0) unshift = true;\n      path.splice(i, 1);\n      up--;\n    }\n  }\n\n  if (unshift) path.unshift('');\n  if (last === '.' || last === '..') path.push('');\n\n  return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n  address = trimLeft(address);\n  address = address.replace(CRHTLF, '');\n\n  if (!(this instanceof Url)) {\n    return new Url(address, location, parser);\n  }\n\n  var relative, extracted, parse, instruction, index, key\n    , instructions = rules.slice()\n    , type = typeof location\n    , url = this\n    , i = 0;\n\n  //\n  // The following if statements allows this module two have compatibility with\n  // 2 different API:\n  //\n  // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n  //    where the boolean indicates that the query string should also be parsed.\n  //\n  // 2. The `URL` interface of the browser which accepts a URL, object as\n  //    arguments. The supplied object will be used as default values / fall-back\n  //    for relative paths.\n  //\n  if ('object' !== type && 'string' !== type) {\n    parser = location;\n    location = null;\n  }\n\n  if (parser && 'function' !== typeof parser) parser = qs.parse;\n\n  location = lolcation(location);\n\n  //\n  // Extract protocol information before running the instructions.\n  //\n  extracted = extractProtocol(address || '', location);\n  relative = !extracted.protocol && !extracted.slashes;\n  url.slashes = extracted.slashes || relative && location.slashes;\n  url.protocol = extracted.protocol || location.protocol || '';\n  address = extracted.rest;\n\n  //\n  // When the authority component is absent the URL starts with a path\n  // component.\n  //\n  if (\n    extracted.protocol === 'file:' && (\n      extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) ||\n    (!extracted.slashes &&\n      (extracted.protocol ||\n        extracted.slashesCount < 2 ||\n        !isSpecial(url.protocol)))\n  ) {\n    instructions[3] = [/(.*)/, 'pathname'];\n  }\n\n  for (; i < instructions.length; i++) {\n    instruction = instructions[i];\n\n    if (typeof instruction === 'function') {\n      address = instruction(address, url);\n      continue;\n    }\n\n    parse = instruction[0];\n    key = instruction[1];\n\n    if (parse !== parse) {\n      url[key] = address;\n    } else if ('string' === typeof parse) {\n      index = parse === '@'\n        ? address.lastIndexOf(parse)\n        : address.indexOf(parse);\n\n      if (~index) {\n        if ('number' === typeof instruction[2]) {\n          url[key] = address.slice(0, index);\n          address = address.slice(index + instruction[2]);\n        } else {\n          url[key] = address.slice(index);\n          address = address.slice(0, index);\n        }\n      }\n    } else if ((index = parse.exec(address))) {\n      url[key] = index[1];\n      address = address.slice(0, index.index);\n    }\n\n    url[key] = url[key] || (\n      relative && instruction[3] ? location[key] || '' : ''\n    );\n\n    //\n    // Hostname, host and protocol should be lowercased so they can be used to\n    // create a proper `origin`.\n    //\n    if (instruction[4]) url[key] = url[key].toLowerCase();\n  }\n\n  //\n  // Also parse the supplied query string in to an object. If we're supplied\n  // with a custom parser as function use that instead of the default build-in\n  // parser.\n  //\n  if (parser) url.query = parser(url.query);\n\n  //\n  // If the URL is relative, resolve the pathname against the base URL.\n  //\n  if (\n      relative\n    && location.slashes\n    && url.pathname.charAt(0) !== '/'\n    && (url.pathname !== '' || location.pathname !== '')\n  ) {\n    url.pathname = resolve(url.pathname, location.pathname);\n  }\n\n  //\n  // Default to a / for pathname if none exists. This normalizes the URL\n  // to always have a /\n  //\n  if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n    url.pathname = '/' + url.pathname;\n  }\n\n  //\n  // We should not add port numbers if they are already the default port number\n  // for a given protocol. As the host also contains the port number we're going\n  // override it with the hostname which contains no port number.\n  //\n  if (!required(url.port, url.protocol)) {\n    url.host = url.hostname;\n    url.port = '';\n  }\n\n  //\n  // Parse down the `auth` for the username and password.\n  //\n  url.username = url.password = '';\n\n  if (url.auth) {\n    index = url.auth.indexOf(':');\n\n    if (~index) {\n      url.username = url.auth.slice(0, index);\n      url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n      url.password = url.auth.slice(index + 1);\n      url.password = encodeURIComponent(decodeURIComponent(url.password))\n    } else {\n      url.username = encodeURIComponent(decodeURIComponent(url.auth));\n    }\n\n    url.auth = url.password ? url.username +':'+ url.password : url.username;\n  }\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  //\n  // The href is just the compiled result.\n  //\n  url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part          Property we need to adjust.\n * @param {Mixed} value          The newly assigned value.\n * @param {Boolean|Function} fn  When setting the query, it will be the function\n *                               used to parse the query.\n *                               When setting the protocol, double slash will be\n *                               removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n  var url = this;\n\n  switch (part) {\n    case 'query':\n      if ('string' === typeof value && value.length) {\n        value = (fn || qs.parse)(value);\n      }\n\n      url[part] = value;\n      break;\n\n    case 'port':\n      url[part] = value;\n\n      if (!required(value, url.protocol)) {\n        url.host = url.hostname;\n        url[part] = '';\n      } else if (value) {\n        url.host = url.hostname +':'+ value;\n      }\n\n      break;\n\n    case 'hostname':\n      url[part] = value;\n\n      if (url.port) value += ':'+ url.port;\n      url.host = value;\n      break;\n\n    case 'host':\n      url[part] = value;\n\n      if (port.test(value)) {\n        value = value.split(':');\n        url.port = value.pop();\n        url.hostname = value.join(':');\n      } else {\n        url.hostname = value;\n        url.port = '';\n      }\n\n      break;\n\n    case 'protocol':\n      url.protocol = value.toLowerCase();\n      url.slashes = !fn;\n      break;\n\n    case 'pathname':\n    case 'hash':\n      if (value) {\n        var char = part === 'pathname' ? '/' : '#';\n        url[part] = value.charAt(0) !== char ? char + value : value;\n      } else {\n        url[part] = value;\n      }\n      break;\n\n    case 'username':\n    case 'password':\n      url[part] = encodeURIComponent(value);\n      break;\n\n    case 'auth':\n      var index = value.indexOf(':');\n\n      if (~index) {\n        url.username = value.slice(0, index);\n        url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n        url.password = value.slice(index + 1);\n        url.password = encodeURIComponent(decodeURIComponent(url.password));\n      } else {\n        url.username = encodeURIComponent(decodeURIComponent(value));\n      }\n  }\n\n  for (var i = 0; i < rules.length; i++) {\n    var ins = rules[i];\n\n    if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n  }\n\n  url.auth = url.password ? url.username +':'+ url.password : url.username;\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  url.href = url.toString();\n\n  return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n  if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;\n\n  var query\n    , url = this\n    , host = url.host\n    , protocol = url.protocol;\n\n  if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n  var result =\n    protocol +\n    ((url.protocol && url.slashes) || isSpecial(url.protocol) ? '//' : '');\n\n  if (url.username) {\n    result += url.username;\n    if (url.password) result += ':'+ url.password;\n    result += '@';\n  } else if (url.password) {\n    result += ':'+ url.password;\n    result += '@';\n  } else if (\n    url.protocol !== 'file:' &&\n    isSpecial(url.protocol) &&\n    !host &&\n    url.pathname !== '/'\n  ) {\n    //\n    // Add back the empty userinfo, otherwise the original invalid URL\n    // might be transformed into a valid one with `url.pathname` as host.\n    //\n    result += '@';\n  }\n\n  //\n  // Trailing colon is removed from `url.host` when it is parsed. If it still\n  // ends with a colon, then add back the trailing colon that was removed. This\n  // prevents an invalid URL from being transformed into a valid one.\n  //\n  if (host[host.length - 1] === ':' || (port.test(url.hostname) && !url.port)) {\n    host += ':';\n  }\n\n  result += host + url.pathname;\n\n  query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n  if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n  if (url.hash) result += url.hash;\n\n  return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = qs;\n\nmodule.exports = Url;\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nvar RELEASE_TRAIN = 'dahlia';\n\nvar runtimeVersionToUrlVersion = function runtimeVersionToUrlVersion(version) {\n  return version === 3 ? 'v3' : version;\n};\n\nvar ORIGIN = 'https://js.stripe.com';\nvar STRIPE_JS_URL = \"\".concat(ORIGIN, \"/\").concat(RELEASE_TRAIN, \"/stripe.js\");\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar STRIPE_JS_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/(v3|[a-z]+)\\/stripe\\.js(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\n\nvar isStripeJSURL = function isStripeJSURL(url) {\n  return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url);\n};\n\nvar findScript = function findScript() {\n  var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(ORIGIN, \"\\\"]\"));\n\n  for (var i = 0; i < scripts.length; i++) {\n    var script = scripts[i];\n\n    if (!isStripeJSURL(script.src)) {\n      continue;\n    }\n\n    return script;\n  }\n\n  return null;\n};\n\nvar injectScript = function injectScript(params) {\n  var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n  var script = document.createElement('script');\n  script.src = \"\".concat(STRIPE_JS_URL).concat(queryString);\n  var headOrBody = document.head || document.body;\n\n  if (!headOrBody) {\n    throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');\n  }\n\n  headOrBody.appendChild(script);\n  return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n  if (!stripe || !stripe._registerWrapper) {\n    return;\n  }\n\n  stripe._registerWrapper({\n    name: 'stripe-js',\n    version: \"9.4.0\",\n    startTime: startTime\n  });\n};\n\nvar stripePromise = null;\nvar onErrorListener = null;\nvar onLoadListener = null;\n\nvar onError = function onError(reject) {\n  return function (cause) {\n    reject(new Error('Failed to load Stripe.js', {\n      cause: cause\n    }));\n  };\n};\n\nvar onLoad = function onLoad(resolve, reject) {\n  return function () {\n    if (window.Stripe) {\n      resolve(window.Stripe);\n    } else {\n      reject(new Error('Stripe.js not available'));\n    }\n  };\n};\n\nvar loadScript = function loadScript(params) {\n  // Ensure that we only attempt to load Stripe.js at most once\n  if (stripePromise !== null) {\n    return stripePromise;\n  }\n\n  stripePromise = new Promise(function (resolve, reject) {\n    if (typeof window === 'undefined' || typeof document === 'undefined') {\n      // Resolve to null when imported server side. This makes the module\n      // safe to import in an isomorphic code base.\n      resolve(null);\n      return;\n    }\n\n    if (window.Stripe && params) {\n      console.warn(EXISTING_SCRIPT_MESSAGE);\n    }\n\n    if (window.Stripe) {\n      resolve(window.Stripe);\n      return;\n    }\n\n    try {\n      var script = findScript();\n\n      if (script && params) {\n        console.warn(EXISTING_SCRIPT_MESSAGE);\n      } else if (!script) {\n        script = injectScript(params);\n      } else if (script && onLoadListener !== null && onErrorListener !== null) {\n        var _script$parentNode;\n\n        // remove event listeners\n        script.removeEventListener('load', onLoadListener);\n        script.removeEventListener('error', onErrorListener); // if script exists, but we are reloading due to an error,\n        // reload script to trigger 'load' event\n\n        (_script$parentNode = script.parentNode) === null || _script$parentNode === void 0 ? void 0 : _script$parentNode.removeChild(script);\n        script = injectScript(params);\n      }\n\n      onLoadListener = onLoad(resolve, reject);\n      onErrorListener = onError(reject);\n      script.addEventListener('load', onLoadListener);\n      script.addEventListener('error', onErrorListener);\n    } catch (error) {\n      reject(error);\n      return;\n    }\n  }); // Resets stripePromise on error\n\n  return stripePromise[\"catch\"](function (error) {\n    stripePromise = null;\n    return Promise.reject(error);\n  });\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n  if (maybeStripe === null) {\n    return null;\n  }\n\n  var pk = args[0];\n\n  if (typeof pk !== 'string') {\n    throw new Error(\"Expected publishable key to be of type string, got type \".concat(_typeof(pk), \" instead.\"));\n  }\n\n  var isTestKey = pk.match(/^pk_test/); // @ts-expect-error this is not publicly typed\n\n  var version = runtimeVersionToUrlVersion(maybeStripe.version);\n  var expectedVersion = RELEASE_TRAIN;\n\n  if (isTestKey && version !== expectedVersion) {\n    console.warn(\"Stripe.js@\".concat(version, \" was loaded on the page, but @stripe/stripe-js@\").concat(\"9.4.0\", \" expected Stripe.js@\").concat(expectedVersion, \". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning\"));\n  }\n\n  var stripe = maybeStripe.apply(undefined, args);\n  registerWrapper(stripe, startTime);\n  return stripe;\n}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nvar validateLoadParams = function validateLoadParams(params) {\n  var errorMessage = \"invalid load parameters; expected object of shape\\n\\n    {advancedFraudSignals: boolean}\\n\\nbut received\\n\\n    \".concat(JSON.stringify(params), \"\\n\");\n\n  if (params === null || _typeof(params) !== 'object') {\n    throw new Error(errorMessage);\n  }\n\n  if (Object.keys(params).length === 1 && typeof params.advancedFraudSignals === 'boolean') {\n    return params;\n  }\n\n  throw new Error(errorMessage);\n};\n\nvar loadParams;\nvar loadStripeCalled = false;\nvar loadStripe = function loadStripe() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  loadStripeCalled = true;\n  var startTime = Date.now();\n  return loadScript(loadParams).then(function (maybeStripe) {\n    return initStripe(maybeStripe, args, startTime);\n  });\n};\n\nloadStripe.setLoadParameters = function (params) {\n  // we won't throw an error if setLoadParameters is called with the same values as before\n  if (loadStripeCalled && loadParams) {\n    var validatedParams = validateLoadParams(params);\n    var parameterKeys = Object.keys(validatedParams);\n    var sameParameters = parameterKeys.reduce(function (previousValue, currentValue) {\n      var _loadParams;\n\n      return previousValue && params[currentValue] === ((_loadParams = loadParams) === null || _loadParams === void 0 ? void 0 : _loadParams[currentValue]);\n    }, true);\n\n    if (sameParameters) {\n      return;\n    }\n  }\n\n  if (loadStripeCalled) {\n    throw new Error('You cannot change load parameters after calling loadStripe');\n  }\n\n  loadParams = validateLoadParams(params);\n};\n\nexports.loadStripe = loadStripe;\n", "module.exports = require('../dist/pure');\n", "var htmx = (function() {\n  'use strict'\n\n  // Public API\n  const htmx = {\n    // Tsc madness here, assigning the functions directly results in an invalid TypeScript output, but reassigning is fine\n    /* Event processing */\n    /** @type {typeof onLoadHelper} */\n    onLoad: null,\n    /** @type {typeof processNode} */\n    process: null,\n    /** @type {typeof addEventListenerImpl} */\n    on: null,\n    /** @type {typeof removeEventListenerImpl} */\n    off: null,\n    /** @type {typeof triggerEvent} */\n    trigger: null,\n    /** @type {typeof ajaxHelper} */\n    ajax: null,\n    /* DOM querying helpers */\n    /** @type {typeof find} */\n    find: null,\n    /** @type {typeof findAll} */\n    findAll: null,\n    /** @type {typeof closest} */\n    closest: null,\n    /**\n     * Returns the input values that would resolve for a given element via the htmx value resolution mechanism\n     *\n     * @see https://htmx.org/api/#values\n     *\n     * @param {Element} elt the element to resolve values on\n     * @param {HttpVerb} type the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post**\n     * @returns {Object}\n     */\n    values: function(elt, type) {\n      const inputValues = getInputValues(elt, type || 'post')\n      return inputValues.values\n    },\n    /* DOM manipulation helpers */\n    /** @type {typeof removeElement} */\n    remove: null,\n    /** @type {typeof addClassToElement} */\n    addClass: null,\n    /** @type {typeof removeClassFromElement} */\n    removeClass: null,\n    /** @type {typeof toggleClassOnElement} */\n    toggleClass: null,\n    /** @type {typeof takeClassForElement} */\n    takeClass: null,\n    /** @type {typeof swap} */\n    swap: null,\n    /* Extension entrypoints */\n    /** @type {typeof defineExtension} */\n    defineExtension: null,\n    /** @type {typeof removeExtension} */\n    removeExtension: null,\n    /* Debugging */\n    /** @type {typeof logAll} */\n    logAll: null,\n    /** @type {typeof logNone} */\n    logNone: null,\n    /* Debugging */\n    /**\n     * The logger htmx uses to log with\n     *\n     * @see https://htmx.org/api/#logger\n     */\n    logger: null,\n    /**\n     * A property holding the configuration htmx uses at runtime.\n     *\n     * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties.\n     *\n     * @see https://htmx.org/api/#config\n     */\n    config: {\n      /**\n       * Whether to use history.\n       * @type boolean\n       * @default true\n       */\n      historyEnabled: true,\n      /**\n       * The number of pages to keep in **sessionStorage** for history support.\n       * @type number\n       * @default 10\n       */\n      historyCacheSize: 10,\n      /**\n       * @type boolean\n       * @default false\n       */\n      refreshOnHistoryMiss: false,\n      /**\n       * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted.\n       * @type HtmxSwapStyle\n       * @default 'innerHTML'\n       */\n      defaultSwapStyle: 'innerHTML',\n      /**\n       * The default delay between receiving a response from the server and doing the swap.\n       * @type number\n       * @default 0\n       */\n      defaultSwapDelay: 0,\n      /**\n       * The default delay between completing the content swap and settling attributes.\n       * @type number\n       * @default 20\n       */\n      defaultSettleDelay: 20,\n      /**\n       * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present.\n       * @type boolean\n       * @default true\n       */\n      includeIndicatorStyles: true,\n      /**\n       * The class to place on indicators when a request is in flight.\n       * @type string\n       * @default 'htmx-indicator'\n       */\n      indicatorClass: 'htmx-indicator',\n      /**\n       * The class to place on triggering elements when a request is in flight.\n       * @type string\n       * @default 'htmx-request'\n       */\n      requestClass: 'htmx-request',\n      /**\n       * The class to temporarily place on elements that htmx has added to the DOM.\n       * @type string\n       * @default 'htmx-added'\n       */\n      addedClass: 'htmx-added',\n      /**\n       * The class to place on target elements when htmx is in the settling phase.\n       * @type string\n       * @default 'htmx-settling'\n       */\n      settlingClass: 'htmx-settling',\n      /**\n       * The class to place on target elements when htmx is in the swapping phase.\n       * @type string\n       * @default 'htmx-swapping'\n       */\n      swappingClass: 'htmx-swapping',\n      /**\n       * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility.\n       * @type boolean\n       * @default true\n       */\n      allowEval: true,\n      /**\n       * If set to false, disables the interpretation of script tags.\n       * @type boolean\n       * @default true\n       */\n      allowScriptTags: true,\n      /**\n       * If set, the nonce will be added to inline scripts.\n       * @type string\n       * @default ''\n       */\n      inlineScriptNonce: '',\n      /**\n       * If set, the nonce will be added to inline styles.\n       * @type string\n       * @default ''\n       */\n      inlineStyleNonce: '',\n      /**\n       * The attributes to settle during the settling phase.\n       * @type string[]\n       * @default ['class', 'style', 'width', 'height']\n       */\n      attributesToSettle: ['class', 'style', 'width', 'height'],\n      /**\n       * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates.\n       * @type boolean\n       * @default false\n       */\n      withCredentials: false,\n      /**\n       * @type number\n       * @default 0\n       */\n      timeout: 0,\n      /**\n       * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**.\n       * @type {'full-jitter' | ((retryCount:number) => number)}\n       * @default \"full-jitter\"\n       */\n      wsReconnectDelay: 'full-jitter',\n      /**\n       * The type of binary data being received over the WebSocket connection\n       * @type BinaryType\n       * @default 'blob'\n       */\n      wsBinaryType: 'blob',\n      /**\n       * @type string\n       * @default '[hx-disable], [data-hx-disable]'\n       */\n      disableSelector: '[hx-disable], [data-hx-disable]',\n      /**\n       * @type {'auto' | 'instant' | 'smooth'}\n       * @default 'instant'\n       */\n      scrollBehavior: 'instant',\n      /**\n       * If the focused element should be scrolled into view.\n       * @type boolean\n       * @default false\n       */\n      defaultFocusScroll: false,\n      /**\n       * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser\n       * @type boolean\n       * @default false\n       */\n      getCacheBusterParam: false,\n      /**\n       * If set to true, htmx will use the View Transition API when swapping in new content.\n       * @type boolean\n       * @default false\n       */\n      globalViewTransitions: false,\n      /**\n       * htmx will format requests with these methods by encoding their parameters in the URL, not the request body\n       * @type {(HttpVerb)[]}\n       * @default ['get', 'delete']\n       */\n      methodsThatUseUrlParams: ['get', 'delete'],\n      /**\n       * If set to true, disables htmx-based requests to non-origin hosts.\n       * @type boolean\n       * @default false\n       */\n      selfRequestsOnly: true,\n      /**\n       * If set to true htmx will not update the title of the document when a title tag is found in new content\n       * @type boolean\n       * @default false\n       */\n      ignoreTitle: false,\n      /**\n       * Whether the target of a boosted element is scrolled into the viewport.\n       * @type boolean\n       * @default true\n       */\n      scrollIntoViewOnBoost: true,\n      /**\n       * The cache to store evaluated trigger specifications into.\n       * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy)\n       * @type {Object|null}\n       * @default null\n       */\n      triggerSpecsCache: null,\n      /** @type boolean */\n      disableInheritance: false,\n      /** @type HtmxResponseHandlingConfig[] */\n      responseHandling: [\n        { code: '204', swap: false },\n        { code: '[23]..', swap: true },\n        { code: '[45]..', swap: false, error: true }\n      ],\n      /**\n       * Whether to process OOB swaps on elements that are nested within the main response element.\n       * @type boolean\n       * @default true\n       */\n      allowNestedOobSwaps: true,\n      /**\n       * Whether to treat history cache miss full page reload requests as a \"HX-Request\" by returning this response header\n       * This should always be disabled when using HX-Request header to optionally return partial responses\n       * @type boolean\n       * @default true\n       */\n      historyRestoreAsHxRequest: true,\n      /**\n       * Whether to report input validation errors to the end user and update focus to the first input that fails validation.\n       * This should always be enabled as this matches default browser form submit behaviour\n       * @type boolean\n       * @default false\n       */\n      reportValidityOfForms: false\n    },\n    /** @type {typeof parseInterval} */\n    parseInterval: null,\n    /**\n     * proxy of window.location used for page reload functions\n     * @type location\n     */\n    location,\n    /** @type {typeof internalEval} */\n    _: null,\n    version: '2.0.10'\n  }\n  // Tsc madness part 2\n  htmx.onLoad = onLoadHelper\n  htmx.process = processNode\n  htmx.on = addEventListenerImpl\n  htmx.off = removeEventListenerImpl\n  htmx.trigger = triggerEvent\n  htmx.ajax = ajaxHelper\n  htmx.find = find\n  htmx.findAll = findAll\n  htmx.closest = closest\n  htmx.remove = removeElement\n  htmx.addClass = addClassToElement\n  htmx.removeClass = removeClassFromElement\n  htmx.toggleClass = toggleClassOnElement\n  htmx.takeClass = takeClassForElement\n  htmx.swap = swap\n  htmx.defineExtension = defineExtension\n  htmx.removeExtension = removeExtension\n  htmx.logAll = logAll\n  htmx.logNone = logNone\n  htmx.parseInterval = parseInterval\n  htmx._ = internalEval\n\n  const internalAPI = {\n    addTriggerHandler,\n    bodyContains,\n    canAccessLocalStorage,\n    findThisElement,\n    filterValues,\n    swap,\n    hasAttribute,\n    getAttributeValue,\n    getClosestAttributeValue,\n    getClosestMatch,\n    getExpressionVars,\n    getHeaders,\n    getInputValues,\n    getInternalData,\n    getSwapSpecification,\n    getTriggerSpecs,\n    getTarget,\n    makeFragment,\n    mergeObjects,\n    makeSettleInfo,\n    oobSwap,\n    querySelectorExt,\n    settleImmediately,\n    shouldCancel,\n    triggerEvent,\n    triggerErrorEvent,\n    withExtensions\n  }\n\n  const VERBS = ['get', 'post', 'put', 'delete', 'patch']\n  const VERB_SELECTOR = VERBS.map(function(verb) {\n    return '[hx-' + verb + '], [data-hx-' + verb + ']'\n  }).join(', ')\n\n  //= ===================================================================\n  // Utilities\n  //= ===================================================================\n\n  /**\n   * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes.\n   *\n   * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat**\n   *\n   * @see https://htmx.org/api/#parseInterval\n   *\n   * @param {string} str timing string\n   * @returns {number|undefined}\n   */\n  function parseInterval(str) {\n    if (str == undefined) {\n      return undefined\n    }\n\n    let interval = NaN\n    if (str.slice(-2) == 'ms') {\n      interval = parseFloat(str.slice(0, -2))\n    } else if (str.slice(-1) == 's') {\n      interval = parseFloat(str.slice(0, -1)) * 1000\n    } else if (str.slice(-1) == 'm') {\n      interval = parseFloat(str.slice(0, -1)) * 1000 * 60\n    } else {\n      interval = parseFloat(str)\n    }\n    return isNaN(interval) ? undefined : interval\n  }\n\n  /**\n   * @param {Node} elt\n   * @param {string} name\n   * @returns {(string | null)}\n   */\n  function getRawAttribute(elt, name) {\n    return elt instanceof Element && elt.getAttribute(name)\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {string} qualifiedName\n   * @returns {boolean}\n   */\n  // resolve with both hx and data-hx prefixes\n  function hasAttribute(elt, qualifiedName) {\n    return !!elt.hasAttribute && (elt.hasAttribute(qualifiedName) ||\n      elt.hasAttribute('data-' + qualifiedName))\n  }\n\n  /**\n   *\n   * @param {Node} elt\n   * @param {string} qualifiedName\n   * @returns {(string | null)}\n   */\n  function getAttributeValue(elt, qualifiedName) {\n    return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, 'data-' + qualifiedName)\n  }\n\n  /**\n   * @param {Node} elt\n   * @returns {Node | null}\n   */\n  function parentElt(elt) {\n    const parent = elt.parentElement\n    if (!parent && elt.parentNode instanceof ShadowRoot) return elt.parentNode\n    return parent\n  }\n\n  /**\n   * @returns {Document}\n   */\n  function getDocument() {\n    return document\n  }\n\n  /**\n   * @param {Node} elt\n   * @param {boolean} global\n   * @returns {Node|Document}\n   */\n  function getRootNode(elt, global) {\n    return elt.getRootNode ? elt.getRootNode({ composed: global }) : getDocument()\n  }\n\n  /**\n   * @param {Node} elt\n   * @param {(e:Node) => boolean} condition\n   * @returns {Node | null}\n   */\n  function getClosestMatch(elt, condition) {\n    while (elt && !condition(elt)) {\n      elt = parentElt(elt)\n    }\n\n    return elt || null\n  }\n\n  /**\n   * @param {Element} initialElement\n   * @param {Element} ancestor\n   * @param {string} attributeName\n   * @returns {string|null}\n   */\n  function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName) {\n    const attributeValue = getAttributeValue(ancestor, attributeName)\n    const disinherit = getAttributeValue(ancestor, 'hx-disinherit')\n    var inherit = getAttributeValue(ancestor, 'hx-inherit')\n    if (initialElement !== ancestor) {\n      if (htmx.config.disableInheritance) {\n        if (inherit && (inherit === '*' || inherit.split(' ').indexOf(attributeName) >= 0)) {\n          return attributeValue\n        } else {\n          return null\n        }\n      }\n      if (disinherit && (disinherit === '*' || disinherit.split(' ').indexOf(attributeName) >= 0)) {\n        return 'unset'\n      }\n    }\n    return attributeValue\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {string} attributeName\n   * @returns {string | null}\n   */\n  function getClosestAttributeValue(elt, attributeName) {\n    let closestAttr = null\n    getClosestMatch(elt, function(e) {\n      return !!(closestAttr = getAttributeValueWithDisinheritance(elt, asElement(e), attributeName))\n    })\n    if (closestAttr !== 'unset') {\n      return closestAttr\n    }\n  }\n\n  /**\n   * @param {Node} elt\n   * @param {string} selector\n   * @returns {boolean}\n   */\n  function matches(elt, selector) {\n    return elt instanceof Element && elt.matches(selector)\n  }\n\n  /**\n   * @param {string} str\n   * @returns {string}\n   */\n  function getStartTag(str) {\n    const tagMatcher = /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i\n    const match = tagMatcher.exec(str)\n    if (match) {\n      return match[1].toLowerCase()\n    } else {\n      return ''\n    }\n  }\n\n  /**\n   * @param {string} resp\n   * @returns {Document}\n   */\n  function parseHTML(resp) {\n    if ('parseHTMLUnsafe' in Document) {\n      return Document.parseHTMLUnsafe(resp)\n    }\n    const parser = new DOMParser()\n    return parser.parseFromString(resp, 'text/html')\n  }\n\n  /**\n   * @param {DocumentFragment} fragment\n   * @param {Node} elt\n   */\n  function takeChildrenFor(fragment, elt) {\n    while (elt.childNodes.length > 0) {\n      fragment.append(elt.childNodes[0])\n    }\n  }\n\n  /**\n   * @param {HTMLScriptElement} script\n   * @returns {HTMLScriptElement}\n   */\n  function duplicateScript(script) {\n    const newScript = getDocument().createElement('script')\n    forEach(script.attributes, function(attr) {\n      newScript.setAttribute(attr.name, attr.value)\n    })\n    newScript.textContent = script.textContent\n    newScript.async = false\n    if (htmx.config.inlineScriptNonce) {\n      newScript.nonce = htmx.config.inlineScriptNonce\n    }\n    return newScript\n  }\n\n  /**\n   * @param {HTMLScriptElement} script\n   * @returns {boolean}\n   */\n  function isJavaScriptScriptNode(script) {\n    return script.matches('script') && (script.type === 'text/javascript' || script.type === 'module' || script.type === '')\n  }\n\n  /**\n   * we have to make new copies of script tags that we are going to insert because\n   * SOME browsers (not saying who, but it involves an element and an animal) don't\n   * execute scripts created in <template> tags when they are inserted into the DOM\n   * and all the others do lmao\n   * @param {DocumentFragment} fragment\n   */\n  function normalizeScriptTags(fragment) {\n    Array.from(fragment.querySelectorAll('script')).forEach(/** @param {HTMLScriptElement} script */ (script) => {\n      if (isJavaScriptScriptNode(script)) {\n        const newScript = duplicateScript(script)\n        const parent = script.parentNode\n        try {\n          parent.insertBefore(newScript, script)\n        } catch (e) {\n          logError(e)\n        } finally {\n          script.remove()\n        }\n      }\n    })\n  }\n\n  /**\n   * @typedef {DocumentFragment & {title?: string}} DocumentFragmentWithTitle\n   * @description  a document fragment representing the response HTML, including\n   * a `title` property for any title information found\n   */\n\n  /**\n   * @param {string} response HTML\n   * @returns {DocumentFragmentWithTitle}\n   */\n  function makeFragment(response) {\n    // strip head tag to determine shape of response we are dealing with\n    const responseWithNoHead = response.replace(/<head(\\s[^>]*)?>[\\s\\S]*?<\\/head>/i, '')\n    const startTag = getStartTag(responseWithNoHead)\n    /** @type DocumentFragmentWithTitle */\n    let fragment\n    if (startTag === 'html') {\n      // if it is a full document, parse it and return the body\n      fragment = /** @type DocumentFragmentWithTitle */ (new DocumentFragment())\n      const doc = parseHTML(response)\n      takeChildrenFor(fragment, doc.body)\n      fragment.title = doc.title\n    } else if (startTag === 'body') {\n      // parse body w/o wrapping in template\n      fragment = /** @type DocumentFragmentWithTitle */ (new DocumentFragment())\n      const doc = parseHTML(responseWithNoHead)\n      takeChildrenFor(fragment, doc.body)\n      fragment.title = doc.title\n    } else {\n      // otherwise we have non-body partial HTML content, so wrap it in a template to maximize parsing flexibility\n      const doc = parseHTML('<body><template class=\"internal-htmx-wrapper\">' + responseWithNoHead + '</template></body>')\n      fragment = /** @type DocumentFragmentWithTitle */ (doc.querySelector('template').content)\n      // extract title into fragment for later processing\n      fragment.title = doc.title\n\n      // for legacy reasons we support a title tag at the root level of non-body responses, so we need to handle it\n      var titleElement = fragment.querySelector('title')\n      if (titleElement && titleElement.parentNode === fragment) {\n        titleElement.remove()\n        fragment.title = titleElement.innerText\n      }\n    }\n    if (fragment) {\n      if (htmx.config.allowScriptTags) {\n        normalizeScriptTags(fragment)\n      } else {\n        // remove all script tags if scripts are disabled\n        fragment.querySelectorAll('script').forEach((script) => script.remove())\n      }\n    }\n    return fragment\n  }\n\n  /**\n   * @param {Function} func\n   */\n  function maybeCall(func) {\n    if (func) {\n      func()\n    }\n  }\n\n  /**\n   * @param {any} o\n   * @param {string} type\n   * @returns\n   */\n  function isType(o, type) {\n    return Object.prototype.toString.call(o) === '[object ' + type + ']'\n  }\n\n  /**\n   * @param {*} o\n   * @returns {o is Function}\n   */\n  function isFunction(o) {\n    return typeof o === 'function'\n  }\n\n  /**\n   * @param {*} o\n   * @returns {o is Object}\n   */\n  function isRawObject(o) {\n    return isType(o, 'Object')\n  }\n\n  /**\n   * @typedef {Object} OnHandler\n   * @property {(keyof HTMLElementEventMap)|string} event\n   * @property {EventListener} listener\n   */\n\n  /**\n   * @typedef {Object} ListenerInfo\n   * @property {string} trigger\n   * @property {EventListener} listener\n   * @property {EventTarget} on\n   */\n\n  /**\n   * @typedef {Object} HtmxNodeInternalData\n   * Element data\n   * @property {number} [initHash]\n   * @property {boolean} [boosted]\n   * @property {OnHandler[]} [onHandlers]\n   * @property {number} [timeout]\n   * @property {ListenerInfo[]} [listenerInfos]\n   * @property {boolean} [cancelled]\n   * @property {boolean} [triggeredOnce]\n   * @property {number} [delayed]\n   * @property {number|null} [throttle]\n   * @property {WeakMap<HtmxTriggerSpecification,WeakMap<EventTarget,string>>} [lastValue]\n   * @property {boolean} [loaded]\n   * @property {string} [path]\n   * @property {string} [verb]\n   * @property {boolean} [polling]\n   * @property {HTMLButtonElement|HTMLInputElement|null} [lastButtonClicked]\n   * @property {number} [requestCount]\n   * @property {XMLHttpRequest} [xhr]\n   * @property {(() => void)[]} [queuedRequests]\n   * @property {boolean} [abortable]\n   * @property {boolean} [firstInitCompleted]\n   *\n   * Event data\n   * @property {HtmxTriggerSpecification} [triggerSpec]\n   * @property {EventTarget[]} [handledFor]\n   */\n\n  /**\n   * getInternalData retrieves \"private\" data stored by htmx within an element\n   * @param {EventTarget|Event} elt\n   * @returns {HtmxNodeInternalData}\n   */\n  function getInternalData(elt) {\n    const dataProp = 'htmx-internal-data'\n    let data = elt[dataProp]\n    if (!data) {\n      data = elt[dataProp] = {}\n    }\n    return data\n  }\n\n  /**\n   * toArray converts an ArrayLike object into a real array.\n   * @template T\n   * @param {ArrayLike<T>} arr\n   * @returns {T[]}\n   */\n  function toArray(arr) {\n    const returnArr = []\n    if (arr) {\n      for (let i = 0; i < arr.length; i++) {\n        returnArr.push(arr[i])\n      }\n    }\n    return returnArr\n  }\n\n  /**\n   * @template T\n   * @param {T[]|NamedNodeMap|HTMLCollection|HTMLFormControlsCollection|ArrayLike<T>} arr\n   * @param {(T) => void} func\n   */\n  function forEach(arr, func) {\n    if (arr) {\n      for (let i = 0; i < arr.length; i++) {\n        func(arr[i])\n      }\n    }\n  }\n\n  /**\n   * @param {Element} el\n   * @returns {boolean}\n   */\n  function isScrolledIntoView(el) {\n    const rect = el.getBoundingClientRect()\n    const elemTop = rect.top\n    const elemBottom = rect.bottom\n    return elemTop < window.innerHeight && elemBottom >= 0\n  }\n\n  /**\n   * Checks whether the element is in the document (includes shadow roots).\n   * This function this is a slight misnomer; it will return true even for elements in the head.\n   *\n   * @param {Node} elt\n   * @returns {boolean}\n   */\n  function bodyContains(elt) {\n    return elt.getRootNode({ composed: true }) === document\n  }\n\n  /**\n   * @param {string} trigger\n   * @returns {string[]}\n   */\n  function splitOnWhitespace(trigger) {\n    return trigger.trim().split(/\\s+/)\n  }\n\n  /**\n   * mergeObjects takes all the keys from\n   * obj2 and duplicates them into obj1\n   * @template T1\n   * @template T2\n   * @param {T1} obj1\n   * @param {T2} obj2\n   * @returns {T1 & T2}\n   */\n  function mergeObjects(obj1, obj2) {\n    for (const key in obj2) {\n      if (obj2.hasOwnProperty(key)) {\n        // @ts-ignore tsc doesn't seem to properly handle types merging\n        obj1[key] = obj2[key]\n      }\n    }\n    // @ts-ignore tsc doesn't seem to properly handle types merging\n    return obj1\n  }\n\n  /**\n   * @param {string} jString\n   * @returns {any|null}\n   */\n  function parseJSON(jString) {\n    try {\n      return JSON.parse(jString)\n    } catch (error) {\n      logError(error)\n      return null\n    }\n  }\n\n  /**\n   * @returns {boolean}\n   */\n  function canAccessLocalStorage() {\n    const test = 'htmx:sessionStorageTest'\n    try {\n      sessionStorage.setItem(test, test)\n      sessionStorage.removeItem(test)\n      return true\n    } catch (e) {\n      return false\n    }\n  }\n\n  /**\n   * @param {string} path\n   * @returns {string}\n   */\n  function normalizePath(path) {\n    try {\n      const url = new URL(path, window.location.href)\n      path = url.pathname + url.search\n    } catch (e) {\n      // fallback for malformed URLs\n    }\n    // remove trailing slash, unless index page\n    if (path != '/') {\n      path = path.replace(/\\/+$/, '')\n    }\n    return path\n  }\n\n  //= =========================================================================================\n  // public API\n  //= =========================================================================================\n\n  /**\n   * @param {string} str\n   * @returns {any}\n   */\n  function internalEval(str) {\n    return maybeEval(getDocument().body, function() {\n      return eval(str)\n    })\n  }\n\n  /**\n   * Adds a callback for the **htmx:load** event. This can be used to process new content, for example initializing the content with a javascript library\n   *\n   * @see https://htmx.org/api/#onLoad\n   *\n   * @param {(elt: Node) => void} callback the callback to call on newly loaded content\n   * @returns {EventListener}\n   */\n  function onLoadHelper(callback) {\n    const value = htmx.on('htmx:load', /** @param {CustomEvent} evt */ function(evt) {\n      callback(evt.detail.elt)\n    })\n    return value\n  }\n\n  /**\n   * Log all htmx events, useful for debugging.\n   *\n   * @see https://htmx.org/api/#logAll\n   */\n  function logAll() {\n    htmx.logger = function(elt, event, data) {\n      if (console) {\n        console.log(event, elt, data)\n      }\n    }\n  }\n\n  function logNone() {\n    htmx.logger = null\n  }\n\n  /**\n   * Finds an element matching the selector\n   *\n   * @see https://htmx.org/api/#find\n   *\n   * @param {ParentNode|string} eltOrSelector  the root element to find the matching element in, inclusive | the selector to match\n   * @param {string} [selector] the selector to match\n   * @returns {Element|null}\n   */\n  function find(eltOrSelector, selector) {\n    if (typeof eltOrSelector !== 'string') {\n      return eltOrSelector.querySelector(selector)\n    } else {\n      return find(getDocument(), eltOrSelector)\n    }\n  }\n\n  /**\n   * Finds all elements matching the selector\n   *\n   * @see https://htmx.org/api/#findAll\n   *\n   * @param {ParentNode|string} eltOrSelector the root element to find the matching elements in, inclusive | the selector to match\n   * @param {string} [selector] the selector to match\n   * @returns {NodeListOf<Element>}\n   */\n  function findAll(eltOrSelector, selector) {\n    if (typeof eltOrSelector !== 'string') {\n      return eltOrSelector.querySelectorAll(selector)\n    } else {\n      return findAll(getDocument(), eltOrSelector)\n    }\n  }\n\n  /**\n   * @returns Window\n   */\n  function getWindow() {\n    return window\n  }\n\n  /**\n   * Removes an element from the DOM\n   *\n   * @see https://htmx.org/api/#remove\n   *\n   * @param {Node} elt\n   * @param {number} [delay]\n   */\n  function removeElement(elt, delay) {\n    elt = resolveTarget(elt)\n    if (delay) {\n      getWindow().setTimeout(function() {\n        removeElement(elt)\n        elt = null\n      }, delay)\n    } else {\n      parentElt(elt).removeChild(elt)\n    }\n  }\n\n  /**\n   * @param {any} elt\n   * @return {Element|null}\n   */\n  function asElement(elt) {\n    return elt instanceof Element ? elt : null\n  }\n\n  /**\n   * @param {any} elt\n   * @return {HTMLElement|null}\n   */\n  function asHtmlElement(elt) {\n    return elt instanceof HTMLElement ? elt : null\n  }\n\n  /**\n   * @param {any} value\n   * @return {string|null}\n   */\n  function asString(value) {\n    return typeof value === 'string' ? value : null\n  }\n\n  /**\n   * @param {EventTarget} elt\n   * @return {ParentNode|null}\n   */\n  function asParentNode(elt) {\n    return elt instanceof Element || elt instanceof Document || elt instanceof DocumentFragment ? elt : null\n  }\n\n  /**\n   * This method adds a class to the given element.\n   *\n   * @see https://htmx.org/api/#addClass\n   *\n   * @param {Element|string} elt the element to add the class to\n   * @param {string} clazz the class to add\n   * @param {number} [delay] the delay (in milliseconds) before class is added\n   */\n  function addClassToElement(elt, clazz, delay) {\n    elt = asElement(resolveTarget(elt))\n    if (!elt) {\n      return\n    }\n    if (delay) {\n      getWindow().setTimeout(function() {\n        addClassToElement(elt, clazz)\n        elt = null\n      }, delay)\n    } else {\n      elt.classList && elt.classList.add(clazz)\n    }\n  }\n\n  /**\n   * Removes a class from the given element\n   *\n   * @see https://htmx.org/api/#removeClass\n   *\n   * @param {Node|string} node element to remove the class from\n   * @param {string} clazz the class to remove\n   * @param {number} [delay] the delay (in milliseconds before class is removed)\n   */\n  function removeClassFromElement(node, clazz, delay) {\n    let elt = asElement(resolveTarget(node))\n    if (!elt) {\n      return\n    }\n    if (delay) {\n      getWindow().setTimeout(function() {\n        removeClassFromElement(elt, clazz)\n        elt = null\n      }, delay)\n    } else {\n      if (elt.classList) {\n        elt.classList.remove(clazz)\n        // if there are no classes left, remove the class attribute\n        if (elt.classList.length === 0) {\n          elt.removeAttribute('class')\n        }\n      }\n    }\n  }\n\n  /**\n   * Toggles the given class on an element\n   *\n   * @see https://htmx.org/api/#toggleClass\n   *\n   * @param {Element|string} elt the element to toggle the class on\n   * @param {string} clazz the class to toggle\n   */\n  function toggleClassOnElement(elt, clazz) {\n    elt = resolveTarget(elt)\n    elt.classList.toggle(clazz)\n  }\n\n  /**\n   * Takes the given class from its siblings, so that among its siblings, only the given element will have the class.\n   *\n   * @see https://htmx.org/api/#takeClass\n   *\n   * @param {Node|string} elt the element that will take the class\n   * @param {string} clazz the class to take\n   */\n  function takeClassForElement(elt, clazz) {\n    elt = resolveTarget(elt)\n    forEach(elt.parentElement.children, function(child) {\n      removeClassFromElement(child, clazz)\n    })\n    addClassToElement(asElement(elt), clazz)\n  }\n\n  /**\n   * Finds the closest matching element in the given elements parentage, inclusive of the element\n   *\n   * @see https://htmx.org/api/#closest\n   *\n   * @param {Element|string} elt the element to find the selector from\n   * @param {string} selector the selector to find\n   * @returns {Element|null}\n   */\n  function closest(elt, selector) {\n    elt = asElement(resolveTarget(elt))\n    if (elt) {\n      return elt.closest(selector)\n    }\n    return null\n  }\n\n  /**\n   * @param {string} str\n   * @param {string} prefix\n   * @returns {boolean}\n   */\n  function startsWith(str, prefix) {\n    return str.substring(0, prefix.length) === prefix\n  }\n\n  /**\n   * @param {string} str\n   * @param {string} suffix\n   * @returns {boolean}\n   */\n  function endsWith(str, suffix) {\n    return str.substring(str.length - suffix.length) === suffix\n  }\n\n  /**\n   * @param {string} selector\n   * @returns {string}\n   */\n  function normalizeSelector(selector) {\n    const trimmedSelector = selector.trim()\n    if (startsWith(trimmedSelector, '<') && endsWith(trimmedSelector, '/>')) {\n      return trimmedSelector.substring(1, trimmedSelector.length - 2)\n    } else {\n      return trimmedSelector\n    }\n  }\n\n  /**\n   * @param {Node|Element|Document|string} elt\n   * @param {string} selector\n   * @param {boolean=} global\n   * @returns {(Node|Window)[]}\n   */\n  function querySelectorAllExt(elt, selector, global) {\n    if (selector.indexOf('global ') === 0) {\n      return querySelectorAllExt(elt, selector.slice(7), true)\n    }\n\n    elt = resolveTarget(elt)\n\n    const parts = []\n    {\n      let chevronsCount = 0\n      let offset = 0\n      for (let i = 0; i < selector.length; i++) {\n        const char = selector[i]\n        if (char === ',' && chevronsCount === 0) {\n          parts.push(selector.substring(offset, i))\n          offset = i + 1\n          continue\n        }\n        if (char === '<') {\n          chevronsCount++\n        } else if (char === '/' && i < selector.length - 1 && selector[i + 1] === '>') {\n          chevronsCount--\n        }\n      }\n      if (offset < selector.length) {\n        parts.push(selector.substring(offset))\n      }\n    }\n\n    const result = []\n    const unprocessedParts = []\n    while (parts.length > 0) {\n      const selector = normalizeSelector(parts.shift())\n      let item\n      if (selector.indexOf('closest ') === 0) {\n        item = closest(asElement(elt), normalizeSelector(selector.slice(8)))\n      } else if (selector.indexOf('find ') === 0) {\n        item = find(asParentNode(elt), normalizeSelector(selector.slice(5)))\n      } else if (selector === 'next' || selector === 'nextElementSibling') {\n        item = asElement(elt).nextElementSibling\n      } else if (selector.indexOf('next ') === 0) {\n        item = scanForwardQuery(elt, normalizeSelector(selector.slice(5)), !!global)\n      } else if (selector === 'previous' || selector === 'previousElementSibling') {\n        item = asElement(elt).previousElementSibling\n      } else if (selector.indexOf('previous ') === 0) {\n        item = scanBackwardsQuery(elt, normalizeSelector(selector.slice(9)), !!global)\n      } else if (selector === 'document') {\n        item = document\n      } else if (selector === 'window') {\n        item = window\n      } else if (selector === 'body') {\n        item = document.body\n      } else if (selector === 'root') {\n        item = getRootNode(elt, !!global)\n      } else if (selector === 'host') {\n        item = (/** @type ShadowRoot */(elt.getRootNode())).host\n      } else {\n        unprocessedParts.push(selector)\n      }\n\n      if (item) {\n        result.push(item)\n      }\n    }\n\n    if (unprocessedParts.length > 0) {\n      const standardSelector = unprocessedParts.join(',')\n      const rootNode = asParentNode(getRootNode(elt, !!global))\n      result.push(...toArray(rootNode.querySelectorAll(standardSelector)))\n    }\n\n    return result\n  }\n\n  /**\n   * @param {Node} start\n   * @param {string} match\n   * @param {boolean} global\n   * @returns {Element}\n   */\n  var scanForwardQuery = function(start, match, global) {\n    const results = asParentNode(getRootNode(start, global)).querySelectorAll(match)\n    for (let i = 0; i < results.length; i++) {\n      const elt = results[i]\n      if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_PRECEDING) {\n        return elt\n      }\n    }\n  }\n\n  /**\n   * @param {Node} start\n   * @param {string} match\n   * @param {boolean} global\n   * @returns {Element}\n   */\n  var scanBackwardsQuery = function(start, match, global) {\n    const results = asParentNode(getRootNode(start, global)).querySelectorAll(match)\n    for (let i = results.length - 1; i >= 0; i--) {\n      const elt = results[i]\n      if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_FOLLOWING) {\n        return elt\n      }\n    }\n  }\n\n  /**\n   * @param {Node|string} eltOrSelector\n   * @param {string=} selector\n   * @returns {Node|Window}\n   */\n  function querySelectorExt(eltOrSelector, selector) {\n    if (typeof eltOrSelector !== 'string') {\n      return querySelectorAllExt(eltOrSelector, selector)[0]\n    } else {\n      return querySelectorAllExt(getDocument().body, eltOrSelector)[0]\n    }\n  }\n\n  /**\n   * @template {EventTarget} T\n   * @param {T|string} eltOrSelector\n   * @param {T} [context]\n   * @returns {Element|T|null}\n   */\n  function resolveTarget(eltOrSelector, context) {\n    if (typeof eltOrSelector === 'string') {\n      return find(asParentNode(context) || document, eltOrSelector)\n    } else {\n      return eltOrSelector\n    }\n  }\n\n  /**\n   * @typedef {keyof HTMLElementEventMap|string} AnyEventName\n   */\n\n  /**\n   * @typedef {Object} EventArgs\n   * @property {EventTarget} target\n   * @property {AnyEventName} event\n   * @property {EventListener} listener\n   * @property {Object|boolean} options\n   */\n\n  /**\n   * @param {EventTarget|AnyEventName} arg1\n   * @param {AnyEventName|EventListener} arg2\n   * @param {EventListener|Object|boolean} [arg3]\n   * @param {Object|boolean} [arg4]\n   * @returns {EventArgs}\n   */\n  function processEventArgs(arg1, arg2, arg3, arg4) {\n    if (isFunction(arg2)) {\n      return {\n        target: getDocument().body,\n        event: asString(arg1),\n        listener: arg2,\n        options: arg3\n      }\n    } else {\n      return {\n        target: resolveTarget(arg1),\n        event: asString(arg2),\n        listener: arg3,\n        options: arg4\n      }\n    }\n  }\n\n  /**\n   * Adds an event listener to an element\n   *\n   * @see https://htmx.org/api/#on\n   *\n   * @param {EventTarget|string} arg1 the element to add the listener to | the event name to add the listener for\n   * @param {string|EventListener} arg2 the event name to add the listener for | the listener to add\n   * @param {EventListener|Object|boolean} [arg3] the listener to add | options to add\n   * @param {Object|boolean} [arg4] options to add\n   * @returns {EventListener}\n   */\n  function addEventListenerImpl(arg1, arg2, arg3, arg4) {\n    ready(function() {\n      const eventArgs = processEventArgs(arg1, arg2, arg3, arg4)\n      eventArgs.target.addEventListener(eventArgs.event, eventArgs.listener, eventArgs.options)\n    })\n    const b = isFunction(arg2)\n    return b ? arg2 : arg3\n  }\n\n  /**\n   * Removes an event listener from an element\n   *\n   * @see https://htmx.org/api/#off\n   *\n   * @param {EventTarget|string} arg1 the element to remove the listener from | the event name to remove the listener from\n   * @param {string|EventListener} arg2 the event name to remove the listener from | the listener to remove\n   * @param {EventListener} [arg3] the listener to remove\n   * @returns {EventListener}\n   */\n  function removeEventListenerImpl(arg1, arg2, arg3) {\n    ready(function() {\n      const eventArgs = processEventArgs(arg1, arg2, arg3)\n      eventArgs.target.removeEventListener(eventArgs.event, eventArgs.listener)\n    })\n    return isFunction(arg2) ? arg2 : arg3\n  }\n\n  //= ===================================================================\n  // Node processing\n  //= ===================================================================\n\n  const DUMMY_ELT = getDocument().createElement('output') // dummy element for bad selectors\n  /**\n   * @param {Element} elt\n   * @param {string} attrName\n   * @returns {(Node|Window)[]}\n   */\n  function findAttributeTargets(elt, attrName) {\n    const attrTarget = getClosestAttributeValue(elt, attrName)\n    if (attrTarget) {\n      if (attrTarget === 'this') {\n        return [findThisElement(elt, attrName)]\n      } else {\n        const result = querySelectorAllExt(elt, attrTarget)\n        // find `inherit` whole word in value, make sure it's surrounded by commas or is at the start/end of string\n        const shouldInherit = /(^|,)(\\s*)inherit(\\s*)($|,)/.test(attrTarget)\n        if (shouldInherit) {\n          const eltToInheritFrom = asElement(getClosestMatch(elt, function(parent) {\n            return parent !== elt && hasAttribute(asElement(parent), attrName)\n          }))\n          if (eltToInheritFrom) {\n            result.push(...findAttributeTargets(eltToInheritFrom, attrName))\n          }\n        }\n        if (result.length === 0) {\n          logError('The selector \"' + attrTarget + '\" on ' + attrName + ' returned no matches!')\n          return [DUMMY_ELT]\n        } else {\n          return result\n        }\n      }\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {string} attribute\n   * @returns {Element|null}\n   */\n  function findThisElement(elt, attribute) {\n    return asElement(getClosestMatch(elt, function(elt) {\n      return getAttributeValue(asElement(elt), attribute) != null\n    }))\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {Node|Window|null}\n   */\n  function getTarget(elt) {\n    const targetStr = getClosestAttributeValue(elt, 'hx-target')\n    if (targetStr) {\n      if (targetStr === 'this') {\n        return findThisElement(elt, 'hx-target')\n      } else {\n        return querySelectorExt(elt, targetStr)\n      }\n    } else {\n      const data = getInternalData(elt)\n      if (data.boosted) {\n        return getDocument().body\n      } else {\n        return elt\n      }\n    }\n  }\n\n  /**\n   * @param {string} name\n   * @returns {boolean}\n   */\n  function shouldSettleAttribute(name) {\n    return htmx.config.attributesToSettle.includes(name)\n  }\n\n  /**\n   * @param {Element} mergeTo\n   * @param {Element} mergeFrom\n   */\n  function cloneAttributes(mergeTo, mergeFrom) {\n    forEach(Array.from(mergeTo.attributes), function(attr) {\n      if (!mergeFrom.hasAttribute(attr.name) && shouldSettleAttribute(attr.name)) {\n        mergeTo.removeAttribute(attr.name)\n      }\n    })\n    forEach(mergeFrom.attributes, function(attr) {\n      if (shouldSettleAttribute(attr.name)) {\n        mergeTo.setAttribute(attr.name, attr.value)\n      }\n    })\n  }\n\n  /**\n   * @param {HtmxSwapStyle} swapStyle\n   * @param {Element} target\n   * @returns {boolean}\n   */\n  function isInlineSwap(swapStyle, target) {\n    const extensions = getExtensions(target)\n    for (let i = 0; i < extensions.length; i++) {\n      const extension = extensions[i]\n      try {\n        if (extension.isInlineSwap(swapStyle)) {\n          return true\n        }\n      } catch (e) {\n        logError(e)\n      }\n    }\n    return swapStyle === 'outerHTML'\n  }\n\n  /**\n   * @param {string} oobValue\n   * @param {Element} oobElement\n   * @param {HtmxSettleInfo} settleInfo\n   * @param {Node|Document} [rootNode]\n   * @returns\n   */\n  function oobSwap(oobValue, oobElement, settleInfo, rootNode) {\n    rootNode = rootNode || getDocument()\n    let selector = '#' + CSS.escape(getRawAttribute(oobElement, 'id'))\n    /** @type HtmxSwapStyle */\n    let swapStyle = 'outerHTML'\n    if (oobValue === 'true') {\n      // do nothing\n    } else if (oobValue.indexOf(':') > 0) {\n      swapStyle = oobValue.substring(0, oobValue.indexOf(':'))\n      selector = oobValue.substring(oobValue.indexOf(':') + 1)\n    } else {\n      swapStyle = oobValue\n    }\n    oobElement.removeAttribute('hx-swap-oob')\n    oobElement.removeAttribute('data-hx-swap-oob')\n\n    const targets = querySelectorAllExt(rootNode, selector, false)\n    if (targets.length) {\n      forEach(\n        targets,\n        function(target) {\n          let fragment\n          const oobElementClone = oobElement.cloneNode(true)\n          fragment = getDocument().createDocumentFragment()\n          fragment.appendChild(oobElementClone)\n          if (!isInlineSwap(swapStyle, target)) {\n            fragment = asParentNode(oobElementClone) // if this is not an inline swap, we use the content of the node, not the node itself\n          }\n\n          const beforeSwapDetails = { shouldSwap: true, target, fragment }\n          if (!triggerEvent(target, 'htmx:oobBeforeSwap', beforeSwapDetails)) return\n\n          target = beforeSwapDetails.target // allow re-targeting\n          if (beforeSwapDetails.shouldSwap) {\n            handlePreservedElements(fragment)\n            swapWithStyle(swapStyle, target, target, fragment, settleInfo)\n            restorePreservedElements()\n          }\n          forEach(settleInfo.elts, function(elt) {\n            triggerEvent(elt, 'htmx:oobAfterSwap', beforeSwapDetails)\n          })\n        }\n      )\n      oobElement.parentNode.removeChild(oobElement)\n    } else {\n      oobElement.parentNode.removeChild(oobElement)\n      triggerErrorEvent(getDocument().body, 'htmx:oobErrorNoTarget', { content: oobElement, target: selector })\n    }\n    return oobValue\n  }\n\n  function restorePreservedElements() {\n    const pantry = find('#--htmx-preserve-pantry--')\n    if (pantry) {\n      for (const preservedElt of [...pantry.children]) {\n        const existingElement = find('#' + preservedElt.id)\n        // @ts-ignore - use proposed moveBefore feature\n        existingElement.parentNode.moveBefore(preservedElt, existingElement)\n        existingElement.remove()\n      }\n      pantry.remove()\n    }\n  }\n\n  /**\n   * @param {DocumentFragment|ParentNode} fragment\n   */\n  function handlePreservedElements(fragment) {\n    forEach(findAll(fragment, '[hx-preserve], [data-hx-preserve]'), function(preservedElt) {\n      const id = getAttributeValue(preservedElt, 'id')\n      const existingElement = getDocument().getElementById(id)\n      if (existingElement != null) {\n        if (preservedElt.moveBefore) { // if the moveBefore API exists, use it\n          // get or create a storage spot for stuff\n          let pantry = find('#--htmx-preserve-pantry--')\n          if (pantry == null) {\n            getDocument().body.insertAdjacentHTML('afterend', \"<div id='--htmx-preserve-pantry--'></div>\")\n            pantry = find('#--htmx-preserve-pantry--')\n          }\n          // @ts-ignore - use proposed moveBefore feature\n          pantry.moveBefore(existingElement, null)\n        } else {\n          preservedElt.parentNode.replaceChild(existingElement, preservedElt)\n        }\n      }\n    })\n  }\n\n  /**\n   * @param {Node} parentNode\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function handleAttributes(parentNode, fragment, settleInfo) {\n    forEach(fragment.querySelectorAll('[id]'), function(newNode) {\n      const id = getRawAttribute(newNode, 'id')\n      if (id && id.length > 0) {\n        const parentElt = asParentNode(parentNode)\n        const oldNode = parentElt && parentElt.querySelector(CSS.escape(newNode.tagName) + '#' + CSS.escape(id))\n        if (oldNode && oldNode !== parentElt) {\n          const newAttributes = newNode.cloneNode()\n          cloneAttributes(newNode, oldNode)\n          settleInfo.tasks.push(function() {\n            cloneAttributes(newNode, newAttributes)\n          })\n        }\n      }\n    })\n  }\n\n  /**\n   * @param {Node} child\n   * @returns {HtmxSettleTask}\n   */\n  function makeAjaxLoadTask(child) {\n    return function() {\n      removeClassFromElement(child, htmx.config.addedClass)\n      processNode(asElement(child))\n      processFocus(asParentNode(child))\n      triggerEvent(child, 'htmx:load')\n    }\n  }\n\n  /**\n   * @param {ParentNode} child\n   */\n  function processFocus(child) {\n    const autofocus = '[autofocus]'\n    const autoFocusedElt = asHtmlElement(matches(child, autofocus) ? child : child.querySelector(autofocus))\n    if (autoFocusedElt != null) {\n      autoFocusedElt.focus()\n    }\n  }\n\n  /**\n   * @param {Node} parentNode\n   * @param {Node} insertBefore\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function insertNodesBefore(parentNode, insertBefore, fragment, settleInfo) {\n    handleAttributes(parentNode, fragment, settleInfo)\n    while (fragment.childNodes.length > 0) {\n      const child = fragment.firstChild\n      addClassToElement(asElement(child), htmx.config.addedClass)\n      parentNode.insertBefore(child, insertBefore)\n      if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) {\n        settleInfo.tasks.push(makeAjaxLoadTask(child))\n      }\n    }\n  }\n\n  /**\n   * based on https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0,\n   * derived from Java's string hashcode implementation\n   * @param {string} string\n   * @param {number} hash\n   * @returns {number}\n   */\n  function stringHash(string, hash) {\n    let char = 0\n    while (char < string.length) {\n      hash = (hash << 5) - hash + string.charCodeAt(char++) | 0 // bitwise or ensures we have a 32-bit int\n    }\n    return hash\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {number}\n   */\n  function attributeHash(elt) {\n    let hash = 0\n    for (let i = 0; i < elt.attributes.length; i++) {\n      const attribute = elt.attributes[i]\n      if (attribute.value) { // only include attributes w/ actual values (empty is same as non-existent)\n        hash = stringHash(attribute.name, hash)\n        hash = stringHash(attribute.value, hash)\n      }\n    }\n    return hash\n  }\n\n  /**\n   * @param {EventTarget} elt\n   */\n  function deInitOnHandlers(elt) {\n    const internalData = getInternalData(elt)\n    if (internalData.onHandlers) {\n      for (let i = 0; i < internalData.onHandlers.length; i++) {\n        const handlerInfo = internalData.onHandlers[i]\n        removeEventListenerImpl(elt, handlerInfo.event, handlerInfo.listener)\n      }\n      delete internalData.onHandlers\n    }\n  }\n\n  /**\n   * @param {Node} element\n   */\n  function deInitNode(element) {\n    const internalData = getInternalData(element)\n    if (internalData.timeout) {\n      clearTimeout(internalData.timeout)\n    }\n    if (internalData.listenerInfos) {\n      forEach(internalData.listenerInfos, function(info) {\n        if (info.on) {\n          removeEventListenerImpl(info.on, info.trigger, info.listener)\n        }\n      })\n    }\n    deInitOnHandlers(element)\n    forEach(Object.keys(internalData), function(key) { if (key !== 'firstInitCompleted') delete internalData[key] })\n  }\n\n  /**\n   * @param {Node} element\n   */\n  function cleanUpElement(element) {\n    triggerEvent(element, 'htmx:beforeCleanupElement')\n    deInitNode(element)\n    // @ts-ignore\n    forEach(element.children, function(child) { cleanUpElement(child) })\n  }\n\n  /**\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapOuterHTML(target, fragment, settleInfo) {\n    if (target.tagName === 'BODY') { // special case the body to innerHTML because DocumentFragments can't contain a body elt unfortunately\n      return swapInnerHTML(target, fragment, settleInfo)\n    }\n    /** @type {Node} */\n    let newElt\n    const eltBeforeNewContent = target.previousSibling\n    const parentNode = parentElt(target)\n    if (!parentNode) { // when parent node disappears, we can't do anything\n      return\n    }\n    insertNodesBefore(parentNode, target, fragment, settleInfo)\n    if (eltBeforeNewContent == null) {\n      newElt = parentNode.firstChild\n    } else {\n      newElt = eltBeforeNewContent.nextSibling\n    }\n    settleInfo.elts = settleInfo.elts.filter(function(e) { return e !== target })\n    // scan through all newly added content and add all elements to the settle info so we trigger\n    // events properly on them\n    while (newElt && newElt !== target) {\n      if (newElt instanceof Element) {\n        settleInfo.elts.push(newElt)\n      }\n      newElt = newElt.nextSibling\n    }\n    cleanUpElement(target)\n    target.remove()\n  }\n\n  /**\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapAfterBegin(target, fragment, settleInfo) {\n    return insertNodesBefore(target, target.firstChild, fragment, settleInfo)\n  }\n\n  /**\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapBeforeBegin(target, fragment, settleInfo) {\n    return insertNodesBefore(parentElt(target), target, fragment, settleInfo)\n  }\n\n  /**\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapBeforeEnd(target, fragment, settleInfo) {\n    return insertNodesBefore(target, null, fragment, settleInfo)\n  }\n\n  /**\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapAfterEnd(target, fragment, settleInfo) {\n    return insertNodesBefore(parentElt(target), target.nextSibling, fragment, settleInfo)\n  }\n\n  /**\n   * @param {Element} target\n   */\n  function swapDelete(target) {\n    cleanUpElement(target)\n    const parent = parentElt(target)\n    if (parent) {\n      return parent.removeChild(target)\n    }\n  }\n\n  /**\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapInnerHTML(target, fragment, settleInfo) {\n    const firstChild = target.firstChild\n    insertNodesBefore(target, firstChild, fragment, settleInfo)\n    if (firstChild) {\n      while (firstChild.nextSibling) {\n        cleanUpElement(firstChild.nextSibling)\n        target.removeChild(firstChild.nextSibling)\n      }\n      cleanUpElement(firstChild)\n      target.removeChild(firstChild)\n    }\n  }\n\n  /**\n   * @param {HtmxSwapStyle} swapStyle\n   * @param {Element} elt\n   * @param {Element} target\n   * @param {ParentNode} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   */\n  function swapWithStyle(swapStyle, elt, target, fragment, settleInfo) {\n    switch (swapStyle) {\n      case 'none':\n        return\n      case 'outerHTML':\n        swapOuterHTML(target, fragment, settleInfo)\n        return\n      case 'afterbegin':\n        swapAfterBegin(target, fragment, settleInfo)\n        return\n      case 'beforebegin':\n        swapBeforeBegin(target, fragment, settleInfo)\n        return\n      case 'beforeend':\n        swapBeforeEnd(target, fragment, settleInfo)\n        return\n      case 'afterend':\n        swapAfterEnd(target, fragment, settleInfo)\n        return\n      case 'delete':\n        swapDelete(target)\n        return\n      default:\n        var extensions = getExtensions(elt)\n        for (let i = 0; i < extensions.length; i++) {\n          const ext = extensions[i]\n          try {\n            const newElements = ext.handleSwap(swapStyle, target, fragment, settleInfo)\n            if (newElements) {\n              if (Array.isArray(newElements)) {\n                // if handleSwap returns an array (like) of elements, we handle them\n                for (let j = 0; j < newElements.length; j++) {\n                  const child = newElements[j]\n                  if (child.nodeType !== Node.TEXT_NODE && child.nodeType !== Node.COMMENT_NODE) {\n                    settleInfo.tasks.push(makeAjaxLoadTask(child))\n                  }\n                }\n              }\n              return\n            }\n          } catch (e) {\n            logError(e)\n          }\n        }\n        if (swapStyle === 'innerHTML') {\n          swapInnerHTML(target, fragment, settleInfo)\n        } else {\n          swapWithStyle(htmx.config.defaultSwapStyle, elt, target, fragment, settleInfo)\n        }\n    }\n  }\n\n  /**\n   * @param {DocumentFragment} fragment\n   * @param {HtmxSettleInfo} settleInfo\n   * @param {Node|Document} [rootNode]\n   */\n  function findAndSwapOobElements(fragment, settleInfo, rootNode) {\n    var oobElts = findAll(fragment, '[hx-swap-oob], [data-hx-swap-oob]')\n    forEach(oobElts, function(oobElement) {\n      if (htmx.config.allowNestedOobSwaps || oobElement.parentElement === null) {\n        const oobValue = getAttributeValue(oobElement, 'hx-swap-oob')\n        if (oobValue != null) {\n          oobSwap(oobValue, oobElement, settleInfo, rootNode)\n        }\n      } else {\n        oobElement.removeAttribute('hx-swap-oob')\n        oobElement.removeAttribute('data-hx-swap-oob')\n      }\n    })\n    return oobElts.length > 0\n  }\n\n  /**\n   * Implements complete swapping pipeline, including: delay, view transitions, focus and selection preservation,\n   * title updates, scroll, OOB swapping, normal swapping and settling\n   * @param {string|Element} target\n   * @param {string} content\n   * @param {HtmxSwapSpecification} swapSpec\n   * @param {SwapOptions} [swapOptions]\n   */\n  function swap(target, content, swapSpec, swapOptions) {\n    if (!swapOptions) {\n      swapOptions = {}\n    }\n    // optional transition API promise callbacks\n    let settleResolve = null\n    let settleReject = null\n\n    let doSwap = function() {\n      maybeCall(swapOptions.beforeSwapCallback)\n\n      target = resolveTarget(target)\n      const rootNode = swapOptions.contextElement ? getRootNode(swapOptions.contextElement, false) : getDocument()\n\n      // preserve focus and selection\n      const activeElt = document.activeElement\n      let selectionInfo = {}\n      selectionInfo = {\n        elt: activeElt,\n        // @ts-ignore\n        start: activeElt ? activeElt.selectionStart : null,\n        // @ts-ignore\n        end: activeElt ? activeElt.selectionEnd : null\n      }\n      const settleInfo = makeSettleInfo(target)\n\n      // For text content swaps, don't parse the response as HTML, just insert it\n      if (swapSpec.swapStyle === 'textContent') {\n        target.textContent = content\n      // Otherwise, make the fragment and process it\n      } else {\n        let fragment = makeFragment(content)\n\n        settleInfo.title = swapOptions.title || fragment.title\n        if (swapOptions.historyRequest) {\n          // @ts-ignore fragment can be a parentNode Element\n          fragment = fragment.querySelector('[hx-history-elt],[data-hx-history-elt]') || fragment\n        }\n\n        // select-oob swaps\n        if (swapOptions.selectOOB) {\n          const oobSelectValues = swapOptions.selectOOB.split(',')\n          for (let i = 0; i < oobSelectValues.length; i++) {\n            const oobSelectValue = oobSelectValues[i].split(':', 2)\n            let id = oobSelectValue[0].trim()\n            if (id.indexOf('#') === 0) {\n              id = id.substring(1)\n            }\n            const oobValue = oobSelectValue[1] || 'true'\n            const oobElement = fragment.querySelector('#' + id)\n            if (oobElement) {\n              oobSwap(oobValue, oobElement, settleInfo, rootNode)\n            }\n          }\n        }\n        // oob swaps\n        findAndSwapOobElements(fragment, settleInfo, rootNode)\n        forEach(findAll(fragment, 'template'), /** @param {HTMLTemplateElement} template */function(template) {\n          if (template.content && findAndSwapOobElements(template.content, settleInfo, rootNode)) {\n            // Avoid polluting the DOM with empty templates that were only used to encapsulate oob swap\n            template.remove()\n          }\n        })\n\n        // normal swap\n        if (swapOptions.select) {\n          const newFragment = getDocument().createDocumentFragment()\n          forEach(fragment.querySelectorAll(swapOptions.select), function(node) {\n            newFragment.appendChild(node)\n          })\n          fragment = newFragment\n        }\n        handlePreservedElements(fragment)\n        swapWithStyle(swapSpec.swapStyle, swapOptions.contextElement, target, fragment, settleInfo)\n        restorePreservedElements()\n      }\n\n      // apply saved focus and selection information to swapped content\n      if (selectionInfo.elt &&\n        !bodyContains(selectionInfo.elt) &&\n        getRawAttribute(selectionInfo.elt, 'id')) {\n        const newActiveElt = document.getElementById(getRawAttribute(selectionInfo.elt, 'id'))\n        const focusOptions = { preventScroll: swapSpec.focusScroll !== undefined ? !swapSpec.focusScroll : !htmx.config.defaultFocusScroll }\n        if (newActiveElt) {\n          // @ts-ignore\n          if (selectionInfo.start && newActiveElt.setSelectionRange) {\n            try {\n              // @ts-ignore\n              newActiveElt.setSelectionRange(selectionInfo.start, selectionInfo.end)\n            } catch (e) {\n              // the setSelectionRange method is present on fields that don't support it, so just let this fail\n            }\n          }\n          newActiveElt.focus(focusOptions)\n        }\n      }\n\n      removeClassFromElement(target, htmx.config.swappingClass)\n      forEach(settleInfo.elts, function(elt) {\n        if (elt.classList) {\n          addClassToElement(elt, htmx.config.settlingClass)\n        }\n        triggerEvent(elt, 'htmx:afterSwap', swapOptions.eventInfo)\n      })\n      maybeCall(swapOptions.afterSwapCallback)\n\n      // merge in new title after swap but before settle\n      if (!swapSpec.ignoreTitle) {\n        handleTitle(settleInfo.title)\n      }\n\n      // settle\n      const doSettle = function() {\n        forEach(settleInfo.tasks, function(task) {\n          task.call()\n        })\n        forEach(settleInfo.elts, function(elt) {\n          if (elt.classList) {\n            removeClassFromElement(elt, htmx.config.settlingClass)\n          }\n          triggerEvent(elt, 'htmx:afterSettle', swapOptions.eventInfo)\n        })\n\n        if (swapOptions.anchor) {\n          const anchorTarget = asElement(resolveTarget('#' + swapOptions.anchor))\n          if (anchorTarget) {\n            anchorTarget.scrollIntoView({ block: 'start', behavior: 'auto' })\n          }\n        }\n\n        updateScrollState(settleInfo.elts, swapSpec)\n        maybeCall(swapOptions.afterSettleCallback)\n        maybeCall(settleResolve)\n      }\n\n      if (swapSpec.settleDelay > 0) {\n        getWindow().setTimeout(doSettle, swapSpec.settleDelay)\n      } else {\n        doSettle()\n      }\n    }\n    let shouldTransition = htmx.config.globalViewTransitions\n    if (swapSpec.hasOwnProperty('transition')) {\n      shouldTransition = swapSpec.transition\n    }\n\n    const elt = swapOptions.contextElement || getDocument()\n\n    if (shouldTransition &&\n            triggerEvent(elt, 'htmx:beforeTransition', swapOptions.eventInfo) &&\n            typeof Promise !== 'undefined' &&\n            // @ts-ignore experimental feature atm\n            document.startViewTransition) {\n      const settlePromise = new Promise(function(_resolve, _reject) {\n        settleResolve = _resolve\n        settleReject = _reject\n      })\n      // wrap the original doSwap() in a call to startViewTransition()\n      const innerDoSwap = doSwap\n      doSwap = function() {\n        // @ts-ignore experimental feature atm\n        document.startViewTransition(function() {\n          innerDoSwap()\n          return settlePromise\n        })\n      }\n    }\n\n    try {\n      if (swapSpec?.swapDelay && swapSpec.swapDelay > 0) {\n        getWindow().setTimeout(doSwap, swapSpec.swapDelay)\n      } else {\n        doSwap()\n      }\n    } catch (e) {\n      triggerErrorEvent(elt, 'htmx:swapError', swapOptions.eventInfo)\n      maybeCall(settleReject)\n      throw e\n    }\n  }\n\n  /**\n   * @param {XMLHttpRequest} xhr\n   * @param {string} header\n   * @param {EventTarget} elt\n   */\n  function handleTriggerHeader(xhr, header, elt) {\n    const triggerBody = xhr.getResponseHeader(header)\n    if (triggerBody.indexOf('{') === 0) {\n      const triggers = parseJSON(triggerBody)\n      for (const eventName in triggers) {\n        if (triggers.hasOwnProperty(eventName)) {\n          let detail = triggers[eventName]\n          if (isRawObject(detail)) {\n            // @ts-ignore\n            elt = detail.target !== undefined ? detail.target : elt\n          } else {\n            detail = { value: detail }\n          }\n          triggerEvent(elt, eventName, detail)\n        }\n      }\n    } else {\n      const eventNames = triggerBody.split(',')\n      for (let i = 0; i < eventNames.length; i++) {\n        triggerEvent(elt, eventNames[i].trim(), [])\n      }\n    }\n  }\n\n  const WHITESPACE = /\\s/\n  const WHITESPACE_OR_COMMA = /[\\s,]/\n  const SYMBOL_START = /[_$a-zA-Z]/\n  const SYMBOL_CONT = /[_$a-zA-Z0-9]/\n  const STRINGISH_START = ['\"', \"'\", '/']\n  const NOT_WHITESPACE = /[^\\s]/\n  const COMBINED_SELECTOR_START = /[{(]/\n  const COMBINED_SELECTOR_END = /[})]/\n\n  /**\n   * @param {string} str\n   * @returns {string[]}\n   */\n  function tokenizeString(str) {\n    /** @type string[] */\n    const tokens = []\n    let position = 0\n    while (position < str.length) {\n      if (SYMBOL_START.exec(str.charAt(position))) {\n        var startPosition = position\n        while (SYMBOL_CONT.exec(str.charAt(position + 1))) {\n          position++\n        }\n        tokens.push(str.substring(startPosition, position + 1))\n      } else if (STRINGISH_START.indexOf(str.charAt(position)) !== -1) {\n        const startChar = str.charAt(position)\n        var startPosition = position\n        position++\n        while (position < str.length && str.charAt(position) !== startChar) {\n          if (str.charAt(position) === '\\\\') {\n            position++\n          }\n          position++\n        }\n        tokens.push(str.substring(startPosition, position + 1))\n      } else {\n        const symbol = str.charAt(position)\n        tokens.push(symbol)\n      }\n      position++\n    }\n    return tokens\n  }\n\n  /**\n   * @param {string} token\n   * @param {string|null} last\n   * @param {string} paramName\n   * @returns {boolean}\n   */\n  function isPossibleRelativeReference(token, last, paramName) {\n    return SYMBOL_START.exec(token.charAt(0)) &&\n      token !== 'true' &&\n      token !== 'false' &&\n      token !== 'this' &&\n      token !== paramName &&\n      last !== '.'\n  }\n\n  /**\n   * @param {EventTarget|string} elt\n   * @param {string[]} tokens\n   * @param {string} paramName\n   * @returns {ConditionalFunction|null}\n   */\n  function maybeGenerateConditional(elt, tokens, paramName) {\n    if (tokens[0] === '[') {\n      tokens.shift()\n      let bracketCount = 1\n      let conditionalSource = ' return (function(' + paramName + '){ return ('\n      let last = null\n      while (tokens.length > 0) {\n        const token = tokens[0]\n        // @ts-ignore For some reason tsc doesn't understand the shift call, and thinks we're comparing the same value here, i.e. '[' vs ']'\n        if (token === ']') {\n          bracketCount--\n          if (bracketCount === 0) {\n            if (last === null) {\n              conditionalSource = conditionalSource + 'true'\n            }\n            tokens.shift()\n            conditionalSource += ')})'\n            try {\n              const conditionFunction = maybeEval(elt, function() {\n                return Function(conditionalSource)()\n              },\n              function() { return true })\n              conditionFunction.source = conditionalSource\n              return conditionFunction\n            } catch (e) {\n              triggerErrorEvent(getDocument().body, 'htmx:syntax:error', { error: e, source: conditionalSource })\n              return null\n            }\n          }\n        } else if (token === '[') {\n          bracketCount++\n        }\n        if (isPossibleRelativeReference(token, last, paramName)) {\n          conditionalSource += '((' + paramName + '.' + token + ') ? (' + paramName + '.' + token + ') : (window.' + token + '))'\n        } else {\n          conditionalSource = conditionalSource + token\n        }\n        last = tokens.shift()\n      }\n    }\n  }\n\n  /**\n   * @param {string[]} tokens\n   * @param {RegExp} match\n   * @returns {string}\n   */\n  function consumeUntil(tokens, match) {\n    let result = ''\n    while (tokens.length > 0 && !match.test(tokens[0])) {\n      result += tokens.shift()\n    }\n    return result\n  }\n\n  /**\n   * @param {string[]} tokens\n   * @returns {string}\n   */\n  function consumeCSSSelector(tokens) {\n    let result\n    if (tokens.length > 0 && COMBINED_SELECTOR_START.test(tokens[0])) {\n      tokens.shift()\n      result = consumeUntil(tokens, COMBINED_SELECTOR_END).trim()\n      tokens.shift()\n    } else {\n      result = consumeUntil(tokens, WHITESPACE_OR_COMMA)\n    }\n    return result\n  }\n\n  const INPUT_SELECTOR = 'input, textarea, select'\n\n  /**\n   * @param {Element} elt\n   * @param {string} explicitTrigger\n   * @param {Object} cache for trigger specs\n   * @returns {HtmxTriggerSpecification[]}\n   */\n  function parseAndCacheTrigger(elt, explicitTrigger, cache) {\n    /** @type HtmxTriggerSpecification[] */\n    const triggerSpecs = []\n    const tokens = tokenizeString(explicitTrigger)\n    do {\n      consumeUntil(tokens, NOT_WHITESPACE)\n      const initialLength = tokens.length\n      const trigger = consumeUntil(tokens, /[,\\[\\s]/)\n      if (trigger !== '') {\n        if (trigger === 'every') {\n          /** @type HtmxTriggerSpecification */\n          const every = { trigger: 'every' }\n          consumeUntil(tokens, NOT_WHITESPACE)\n          every.pollInterval = parseInterval(consumeUntil(tokens, /[,\\[\\s]/))\n          consumeUntil(tokens, NOT_WHITESPACE)\n          var eventFilter = maybeGenerateConditional(elt, tokens, 'event')\n          if (eventFilter) {\n            every.eventFilter = eventFilter\n          }\n          triggerSpecs.push(every)\n        } else {\n          /** @type HtmxTriggerSpecification */\n          const triggerSpec = { trigger }\n          var eventFilter = maybeGenerateConditional(elt, tokens, 'event')\n          if (eventFilter) {\n            triggerSpec.eventFilter = eventFilter\n          }\n          consumeUntil(tokens, NOT_WHITESPACE)\n          while (tokens.length > 0 && tokens[0] !== ',') {\n            const token = tokens.shift()\n            if (token === 'changed') {\n              triggerSpec.changed = true\n            } else if (token === 'once') {\n              triggerSpec.once = true\n            } else if (token === 'consume') {\n              triggerSpec.consume = true\n            } else if (token === 'delay' && tokens[0] === ':') {\n              tokens.shift()\n              triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA))\n            } else if (token === 'from' && tokens[0] === ':') {\n              tokens.shift()\n              if (COMBINED_SELECTOR_START.test(tokens[0])) {\n                var from_arg = consumeCSSSelector(tokens)\n              } else {\n                var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA)\n                if (from_arg === 'closest' || from_arg === 'find' || from_arg === 'next' || from_arg === 'previous') {\n                  tokens.shift()\n                  const selector = consumeCSSSelector(tokens)\n                  // `next` and `previous` allow a selector-less syntax\n                  if (selector.length > 0) {\n                    from_arg += ' ' + selector\n                  }\n                }\n              }\n              triggerSpec.from = from_arg\n            } else if (token === 'target' && tokens[0] === ':') {\n              tokens.shift()\n              triggerSpec.target = consumeCSSSelector(tokens)\n            } else if (token === 'throttle' && tokens[0] === ':') {\n              tokens.shift()\n              triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA))\n            } else if (token === 'queue' && tokens[0] === ':') {\n              tokens.shift()\n              triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA)\n            } else if (token === 'root' && tokens[0] === ':') {\n              tokens.shift()\n              triggerSpec[token] = consumeCSSSelector(tokens)\n            } else if (token === 'threshold' && tokens[0] === ':') {\n              tokens.shift()\n              triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA)\n            } else {\n              triggerErrorEvent(elt, 'htmx:syntax:error', { token: tokens.shift() })\n            }\n            consumeUntil(tokens, NOT_WHITESPACE)\n          }\n          triggerSpecs.push(triggerSpec)\n        }\n      }\n      if (tokens.length === initialLength) {\n        triggerErrorEvent(elt, 'htmx:syntax:error', { token: tokens.shift() })\n      }\n      consumeUntil(tokens, NOT_WHITESPACE)\n    } while (tokens[0] === ',' && tokens.shift())\n    if (cache) {\n      cache[explicitTrigger] = triggerSpecs\n    }\n    return triggerSpecs\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {HtmxTriggerSpecification[]}\n   */\n  function getTriggerSpecs(elt) {\n    const explicitTrigger = getAttributeValue(elt, 'hx-trigger')\n    let triggerSpecs = []\n    if (explicitTrigger) {\n      const cache = htmx.config.triggerSpecsCache\n      triggerSpecs = (cache && cache[explicitTrigger]) || parseAndCacheTrigger(elt, explicitTrigger, cache)\n    }\n\n    if (triggerSpecs.length > 0) {\n      return triggerSpecs\n    } else if (matches(elt, 'form')) {\n      return [{ trigger: 'submit' }]\n    } else if (matches(elt, 'input[type=\"button\"], input[type=\"submit\"]')) {\n      return [{ trigger: 'click' }]\n    } else if (matches(elt, INPUT_SELECTOR)) {\n      return [{ trigger: 'change' }]\n    } else {\n      return [{ trigger: 'click' }]\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   */\n  function cancelPolling(elt) {\n    getInternalData(elt).cancelled = true\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {TriggerHandler} handler\n   * @param {HtmxTriggerSpecification} spec\n   */\n  function processPolling(elt, handler, spec) {\n    const nodeData = getInternalData(elt)\n    nodeData.timeout = getWindow().setTimeout(function() {\n      if (bodyContains(elt) && nodeData.cancelled !== true) {\n        if (!maybeFilterEvent(spec, elt, makeEvent('hx:poll:trigger', {\n          triggerSpec: spec,\n          target: elt\n        }))) {\n          handler(elt)\n        }\n        processPolling(elt, handler, spec)\n      }\n    }, spec.pollInterval)\n  }\n\n  /**\n   * @param {HTMLAnchorElement} elt\n   * @returns {boolean}\n   */\n  function isLocalLink(elt) {\n    return location.hostname === elt.hostname &&\n      getRawAttribute(elt, 'href') &&\n      getRawAttribute(elt, 'href').indexOf('#') !== 0\n  }\n\n  /**\n   * @param {Element} elt\n   */\n  function eltIsDisabled(elt) {\n    return closest(elt, htmx.config.disableSelector)\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {HtmxNodeInternalData} nodeData\n   * @param {HtmxTriggerSpecification[]} triggerSpecs\n   */\n  function boostElement(elt, nodeData, triggerSpecs) {\n    if ((elt instanceof HTMLAnchorElement && isLocalLink(elt) && (elt.target === '' || elt.target === '_self')) || (elt.tagName === 'FORM' && String(getRawAttribute(elt, 'method')).toLowerCase() !== 'dialog')) {\n      nodeData.boosted = true\n      let verb, path\n      if (elt.tagName === 'A') {\n        verb = (/** @type HttpVerb */('get'))\n        path = getRawAttribute(elt, 'href')\n      } else {\n        const rawAttribute = getRawAttribute(elt, 'method')\n        verb = (/** @type HttpVerb */(rawAttribute ? rawAttribute.toLowerCase() : 'get'))\n        path = getRawAttribute(elt, 'action')\n        if (path == null || path === '') {\n          // if there is no action attribute on the form set path to current href before the\n          // following logic to properly clear parameters on a GET (not on a POST!)\n          path = location.href\n        }\n        if (verb === 'get' && path.includes('?')) {\n          path = path.replace(/\\?[^#]+/, '')\n        }\n      }\n      triggerSpecs.forEach(function(triggerSpec) {\n        addEventListener(elt, function(node, evt) {\n          const elt = asElement(node)\n          if (eltIsDisabled(elt)) {\n            cleanUpElement(elt)\n            return\n          }\n          issueAjaxRequest(verb, path, elt, evt)\n        }, nodeData, triggerSpec, true)\n      })\n    }\n  }\n\n  /**\n   * @param {Event} evt\n   * @param {Element} elt\n   * @returns {boolean}\n   */\n  function shouldCancel(evt, elt) {\n    if (evt.type === 'submit' && elt.tagName === 'FORM') {\n      return true\n    } else if (evt.type === 'click') {\n      // find button wrapping the trigger element\n      const btn = /** @type {HTMLButtonElement|HTMLInputElement|null} */ (elt.closest('input[type=\"submit\"], button'))\n      // Do not cancel on buttons that 1) don't have a related form or 2) have a type attribute of 'reset'/'button'.\n      if (btn && btn.form && btn.type === 'submit') {\n        return true\n      }\n\n      // find link wrapping the trigger element\n      const link = elt.closest('a')\n      // Allow links with href=\"#fragment\" (anchors with content after #) to perform normal fragment navigation.\n      // Cancel default action for links with href=\"#\" (bare hash) to prevent scrolling to top and unwanted URL changes.\n      const samePageAnchor = /^#.+/\n      if (link && link.href && !samePageAnchor.test(link.getAttribute('href'))) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * @param {Node} elt\n   * @param {Event|MouseEvent|KeyboardEvent|TouchEvent} evt\n   * @returns {boolean}\n   */\n  function ignoreBoostedAnchorCtrlClick(elt, evt) {\n    return getInternalData(elt).boosted && elt instanceof HTMLAnchorElement && evt.type === 'click' &&\n      // @ts-ignore this will resolve to undefined for events that don't define those properties, which is fine\n      (evt.ctrlKey || evt.metaKey)\n  }\n\n  /**\n   * @param {HtmxTriggerSpecification} triggerSpec\n   * @param {Node} elt\n   * @param {Event} evt\n   * @returns {boolean}\n   */\n  function maybeFilterEvent(triggerSpec, elt, evt) {\n    const eventFilter = triggerSpec.eventFilter\n    if (eventFilter) {\n      try {\n        return eventFilter.call(elt, evt) !== true\n      } catch (e) {\n        const source = eventFilter.source\n        triggerErrorEvent(getDocument().body, 'htmx:eventFilter:error', { error: e, source })\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {TriggerHandler} handler\n   * @param {HtmxNodeInternalData} nodeData\n   * @param {HtmxTriggerSpecification} triggerSpec\n   * @param {boolean} [explicitCancel]\n   */\n  function addEventListener(elt, handler, nodeData, triggerSpec, explicitCancel) {\n    const elementData = getInternalData(elt)\n    /** @type {(Node|Window)[]} */\n    let eltsToListenOn\n    if (triggerSpec.from) {\n      eltsToListenOn = querySelectorAllExt(elt, triggerSpec.from)\n    } else {\n      eltsToListenOn = [elt]\n    }\n    // store the initial values of the elements, so we can tell if they change\n    if (triggerSpec.changed) {\n      if (!('lastValue' in elementData)) {\n        elementData.lastValue = new WeakMap()\n      }\n      eltsToListenOn.forEach(function(eltToListenOn) {\n        if (!elementData.lastValue.has(triggerSpec)) {\n          elementData.lastValue.set(triggerSpec, new WeakMap())\n        }\n        // @ts-ignore value will be undefined for non-input elements, which is fine\n        elementData.lastValue.get(triggerSpec).set(eltToListenOn, eltToListenOn.value)\n      })\n    }\n    forEach(eltsToListenOn, function(eltToListenOn) {\n      /** @type EventListener */\n      const eventListener = function(evt) {\n        if (!bodyContains(elt)) {\n          eltToListenOn.removeEventListener(triggerSpec.trigger, eventListener)\n          return\n        }\n        if (ignoreBoostedAnchorCtrlClick(elt, evt)) {\n          return\n        }\n        if (explicitCancel || shouldCancel(evt, eltToListenOn)) {\n          evt.preventDefault()\n        }\n        if (maybeFilterEvent(triggerSpec, elt, evt)) {\n          return\n        }\n        const eventData = getInternalData(evt)\n        eventData.triggerSpec = triggerSpec\n        if (eventData.handledFor == null) {\n          eventData.handledFor = []\n        }\n        if (eventData.handledFor.indexOf(elt) < 0) {\n          eventData.handledFor.push(elt)\n          if (triggerSpec.consume) {\n            evt.stopPropagation()\n          }\n          if (triggerSpec.target && evt.target) {\n            if (!matches(asElement(evt.target), triggerSpec.target)) {\n              return\n            }\n          }\n          if (triggerSpec.once) {\n            if (elementData.triggeredOnce) {\n              return\n            } else {\n              elementData.triggeredOnce = true\n            }\n          }\n          if (triggerSpec.changed) {\n            const node = evt.target\n            // @ts-ignore value will be undefined for non-input elements, which is fine\n            const value = node.value\n            const lastValue = elementData.lastValue.get(triggerSpec)\n            if (lastValue.has(node) && lastValue.get(node) === value) {\n              return\n            }\n            lastValue.set(node, value)\n          }\n          if (elementData.delayed) {\n            clearTimeout(elementData.delayed)\n          }\n          if (elementData.throttle) {\n            return\n          }\n\n          if (triggerSpec.throttle > 0) {\n            if (!elementData.throttle) {\n              triggerEvent(elt, 'htmx:trigger')\n              handler(elt, evt)\n              elementData.throttle = getWindow().setTimeout(function() {\n                elementData.throttle = null\n              }, triggerSpec.throttle)\n            }\n          } else if (triggerSpec.delay > 0) {\n            elementData.delayed = getWindow().setTimeout(function() {\n              triggerEvent(elt, 'htmx:trigger')\n              handler(elt, evt)\n            }, triggerSpec.delay)\n          } else {\n            triggerEvent(elt, 'htmx:trigger')\n            handler(elt, evt)\n          }\n        }\n      }\n      if (nodeData.listenerInfos == null) {\n        nodeData.listenerInfos = []\n      }\n      nodeData.listenerInfos.push({\n        trigger: triggerSpec.trigger,\n        listener: eventListener,\n        on: eltToListenOn\n      })\n      eltToListenOn.addEventListener(triggerSpec.trigger, eventListener)\n    })\n  }\n\n  let windowIsScrolling = false // used by initScrollHandler\n  let scrollHandler = null\n  function initScrollHandler() {\n    if (!scrollHandler) {\n      scrollHandler = function() {\n        windowIsScrolling = true\n      }\n      window.addEventListener('scroll', scrollHandler)\n      window.addEventListener('resize', scrollHandler)\n      setInterval(function() {\n        if (windowIsScrolling) {\n          windowIsScrolling = false\n          forEach(getDocument().querySelectorAll(\"[hx-trigger*='revealed'],[data-hx-trigger*='revealed']\"), function(elt) {\n            maybeReveal(elt)\n          })\n        }\n      }, 200)\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   */\n  function maybeReveal(elt) {\n    if (!hasAttribute(elt, 'data-hx-revealed') && isScrolledIntoView(elt)) {\n      elt.setAttribute('data-hx-revealed', 'true')\n      const nodeData = getInternalData(elt)\n      if (nodeData.initHash) {\n        triggerEvent(elt, 'revealed')\n      } else {\n        // if the node isn't initialized, wait for it before triggering the request\n        elt.addEventListener('htmx:afterProcessNode', function() { triggerEvent(elt, 'revealed') }, { once: true })\n      }\n    }\n  }\n\n  //= ===================================================================\n\n  /**\n   * @param {Element} elt\n   * @param {TriggerHandler} handler\n   * @param {HtmxNodeInternalData} nodeData\n   * @param {number} delay\n   */\n  function loadImmediately(elt, handler, nodeData, delay) {\n    const load = function() {\n      if (!nodeData.loaded) {\n        nodeData.loaded = true\n        triggerEvent(elt, 'htmx:trigger')\n        handler(elt)\n      }\n    }\n    if (delay > 0) {\n      getWindow().setTimeout(load, delay)\n    } else {\n      load()\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {HtmxNodeInternalData} nodeData\n   * @param {HtmxTriggerSpecification[]} triggerSpecs\n   * @returns {boolean}\n   */\n  function processVerbs(elt, nodeData, triggerSpecs) {\n    let explicitAction = false\n    forEach(VERBS, function(verb) {\n      if (hasAttribute(elt, 'hx-' + verb)) {\n        const path = getAttributeValue(elt, 'hx-' + verb)\n        explicitAction = true\n        nodeData.path = path\n        nodeData.verb = verb\n        triggerSpecs.forEach(function(triggerSpec) {\n          addTriggerHandler(elt, triggerSpec, nodeData, function(node, evt) {\n            const elt = asElement(node)\n            if (eltIsDisabled(elt)) {\n              cleanUpElement(elt)\n              return\n            }\n            issueAjaxRequest(verb, path, elt, evt)\n          })\n        })\n      }\n    })\n    return explicitAction\n  }\n\n  /**\n   * @callback TriggerHandler\n   * @param {Element} elt\n   * @param {Event} [evt]\n   */\n\n  /**\n   * @param {Element} elt\n   * @param {HtmxTriggerSpecification} triggerSpec\n   * @param {HtmxNodeInternalData} nodeData\n   * @param {TriggerHandler} handler\n   */\n  function addTriggerHandler(elt, triggerSpec, nodeData, handler) {\n    if (triggerSpec.trigger === 'revealed') {\n      initScrollHandler()\n      addEventListener(elt, handler, nodeData, triggerSpec)\n      maybeReveal(asElement(elt))\n    } else if (triggerSpec.trigger === 'intersect') {\n      const observerOptions = {}\n      if (triggerSpec.root) {\n        observerOptions.root = querySelectorExt(elt, triggerSpec.root)\n      }\n      if (triggerSpec.threshold) {\n        observerOptions.threshold = parseFloat(triggerSpec.threshold)\n      }\n      const observer = new IntersectionObserver(function(entries) {\n        for (let i = 0; i < entries.length; i++) {\n          const entry = entries[i]\n          if (entry.isIntersecting) {\n            triggerEvent(elt, 'intersect')\n            break\n          }\n        }\n      }, observerOptions)\n      observer.observe(asElement(elt))\n      addEventListener(asElement(elt), handler, nodeData, triggerSpec)\n    } else if (!nodeData.firstInitCompleted && triggerSpec.trigger === 'load') {\n      if (!maybeFilterEvent(triggerSpec, elt, makeEvent('load', { elt }))) {\n        loadImmediately(asElement(elt), handler, nodeData, triggerSpec.delay)\n      }\n    } else if (triggerSpec.pollInterval > 0) {\n      nodeData.polling = true\n      processPolling(asElement(elt), handler, triggerSpec)\n    } else {\n      addEventListener(elt, handler, nodeData, triggerSpec)\n    }\n  }\n\n  /**\n   * @param {Node} node\n   * @returns {boolean}\n   */\n  function shouldProcessHxOn(node) {\n    const elt = asElement(node)\n    if (!elt) {\n      return false\n    }\n    const attributes = elt.attributes\n    for (let j = 0; j < attributes.length; j++) {\n      const attrName = attributes[j].name\n      if (startsWith(attrName, 'hx-on:') || startsWith(attrName, 'data-hx-on:') ||\n        startsWith(attrName, 'hx-on-') || startsWith(attrName, 'data-hx-on-')) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * @param {Node} elt\n   * @returns {Element[]}\n   */\n  const HX_ON_QUERY = new XPathEvaluator()\n    .createExpression('.//*[@*[ starts-with(name(), \"hx-on:\") or starts-with(name(), \"data-hx-on:\") or' +\n      ' starts-with(name(), \"hx-on-\") or starts-with(name(), \"data-hx-on-\") ]]')\n\n  function processHXOnRoot(elt, elements) {\n    if (shouldProcessHxOn(elt)) {\n      elements.push(asElement(elt))\n    }\n    const iter = HX_ON_QUERY.evaluate(elt)\n    let node = null\n    while (node = iter.iterateNext()) elements.push(asElement(node))\n  }\n\n  function findHxOnWildcardElements(elt) {\n    /** @type {Element[]} */\n    const elements = []\n    if (elt instanceof DocumentFragment) {\n      for (const child of elt.childNodes) {\n        processHXOnRoot(child, elements)\n      }\n    } else {\n      processHXOnRoot(elt, elements)\n    }\n    return elements\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {NodeListOf<Element>|[]}\n   */\n  function findElementsToProcess(elt) {\n    if (elt.querySelectorAll) {\n      const boostedSelector = ', [hx-boost] a, [data-hx-boost] a, a[hx-boost], a[data-hx-boost]'\n\n      const extensionSelectors = []\n      for (const e in extensions) {\n        const extension = extensions[e]\n        if (extension.getSelectors) {\n          var selectors = extension.getSelectors()\n          if (selectors) {\n            extensionSelectors.push(selectors)\n          }\n        }\n      }\n\n      const results = elt.querySelectorAll(VERB_SELECTOR + boostedSelector + \", form, [type='submit'],\" +\n        ' [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger]' + extensionSelectors.flat().map(s => ', ' + s).join(''))\n\n      return results\n    } else {\n      return []\n    }\n  }\n\n  /**\n   * Handle submit buttons/inputs that have the form attribute set\n   * see https://developer.mozilla.org/docs/Web/HTML/Element/button\n   * @param {Event} evt\n   */\n  function maybeSetLastButtonClicked(evt) {\n    const elt = getTargetButton(evt.target)\n    const internalData = getRelatedFormData(evt)\n    if (internalData) {\n      internalData.lastButtonClicked = elt\n    }\n  }\n\n  /**\n   * @param {Event} evt\n   */\n  function maybeUnsetLastButtonClicked(evt) {\n    const internalData = getRelatedFormData(evt)\n    if (internalData) {\n      internalData.lastButtonClicked = null\n    }\n  }\n\n  /**\n   * @param {EventTarget} target\n   * @returns {HTMLButtonElement|HTMLInputElement|null}\n   */\n  function getTargetButton(target) {\n    return /** @type {HTMLButtonElement|HTMLInputElement|null} */ (closest(asElement(target), \"button, input[type='submit']\"))\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {HTMLFormElement|null}\n   */\n  function getRelatedForm(elt) {\n    // @ts-ignore Get the related form if available, else find the closest parent form\n    return elt.form || closest(elt, 'form')\n  }\n\n  /**\n   * @param {Event} evt\n   * @returns {HtmxNodeInternalData|undefined}\n   */\n  function getRelatedFormData(evt) {\n    const elt = getTargetButton(evt.target)\n    if (!elt) {\n      return\n    }\n    const form = getRelatedForm(elt)\n    if (!form) {\n      return\n    }\n    return getInternalData(form)\n  }\n\n  /**\n   * @param {EventTarget} elt\n   */\n  function initButtonTracking(elt) {\n    // need to handle both click and focus in:\n    //   focusin - in case someone tabs in to a button and hits the space bar\n    //   click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724\n    elt.addEventListener('click', maybeSetLastButtonClicked)\n    elt.addEventListener('focusin', maybeSetLastButtonClicked)\n    elt.addEventListener('focusout', maybeUnsetLastButtonClicked)\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {string} eventName\n   * @param {string} code\n   */\n  function addHxOnEventHandler(elt, eventName, code) {\n    const nodeData = getInternalData(elt)\n    if (!Array.isArray(nodeData.onHandlers)) {\n      nodeData.onHandlers = []\n    }\n    let func\n    /** @type EventListener */\n    const listener = function(e) {\n      maybeEval(elt, function() {\n        if (eltIsDisabled(elt)) {\n          return\n        }\n        if (!func) {\n          func = new Function('event', code)\n        }\n        func.call(elt, e)\n      })\n    }\n    elt.addEventListener(eventName, listener)\n    nodeData.onHandlers.push({ event: eventName, listener })\n  }\n\n  /**\n   * @param {Element} elt\n   */\n  function processHxOnWildcard(elt) {\n    // wipe any previous on handlers so that this function takes precedence\n    deInitOnHandlers(elt)\n\n    for (let i = 0; i < elt.attributes.length; i++) {\n      const name = elt.attributes[i].name\n      const value = elt.attributes[i].value\n      if (startsWith(name, 'hx-on') || startsWith(name, 'data-hx-on')) {\n        const afterOnPosition = name.indexOf('-on') + 3\n        const nextChar = name.slice(afterOnPosition, afterOnPosition + 1)\n        if (nextChar === '-' || nextChar === ':') {\n          let eventName = name.slice(afterOnPosition + 1)\n          // if the eventName starts with a colon or dash, prepend \"htmx\" for shorthand support\n          if (startsWith(eventName, ':')) {\n            eventName = 'htmx' + eventName\n          } else if (startsWith(eventName, '-')) {\n            eventName = 'htmx:' + eventName.slice(1)\n          } else if (startsWith(eventName, 'htmx-')) {\n            eventName = 'htmx:' + eventName.slice(5)\n          }\n\n          addHxOnEventHandler(elt, eventName, value)\n        }\n      }\n    }\n  }\n\n  /**\n   * @param {Element|HTMLInputElement} elt\n   */\n  function initNode(elt) {\n    triggerEvent(elt, 'htmx:beforeProcessNode')\n\n    const nodeData = getInternalData(elt)\n    const triggerSpecs = getTriggerSpecs(elt)\n    const hasExplicitHttpAction = processVerbs(elt, nodeData, triggerSpecs)\n\n    if (!hasExplicitHttpAction) {\n      if (getClosestAttributeValue(elt, 'hx-boost') === 'true') {\n        boostElement(elt, nodeData, triggerSpecs)\n      } else if (hasAttribute(elt, 'hx-trigger')) {\n        triggerSpecs.forEach(function(triggerSpec) {\n          // For \"naked\" triggers, don't do anything at all\n          addTriggerHandler(elt, triggerSpec, nodeData, function() {\n          })\n        })\n      }\n    }\n\n    // Handle submit buttons/inputs that have the form attribute set\n    // see https://developer.mozilla.org/docs/Web/HTML/Element/button\n    if (elt.tagName === 'FORM' || (getRawAttribute(elt, 'type') === 'submit' && hasAttribute(elt, 'form'))) {\n      initButtonTracking(elt)\n    }\n\n    nodeData.firstInitCompleted = true\n    triggerEvent(elt, 'htmx:afterProcessNode')\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {boolean}\n   */\n  function maybeDeInitAndHash(elt) {\n    // Ensure only valid Elements and not shadow DOM roots are inited\n    if (!(elt instanceof Element)) {\n      return false\n    }\n\n    const nodeData = getInternalData(elt)\n    const hash = attributeHash(elt)\n    if (nodeData.initHash !== hash) {\n      deInitNode(elt)\n      nodeData.initHash = hash\n      return true\n    }\n    return false\n  }\n\n  /**\n   * Processes new content, enabling htmx behavior. This can be useful if you have content that is added to the DOM outside of the normal htmx request cycle but still want htmx attributes to work.\n   *\n   * @see https://htmx.org/api/#process\n   *\n   * @param {Element|string} elt element to process\n   */\n  function processNode(elt) {\n    elt = resolveTarget(elt)\n    if (eltIsDisabled(elt)) {\n      cleanUpElement(elt)\n      return\n    }\n\n    const elementsToInit = []\n    if (maybeDeInitAndHash(elt)) {\n      elementsToInit.push(elt)\n    }\n    forEach(findElementsToProcess(elt), function(child) {\n      if (eltIsDisabled(child)) {\n        cleanUpElement(child)\n        return\n      }\n      if (maybeDeInitAndHash(child)) {\n        elementsToInit.push(child)\n      }\n    })\n\n    forEach(findHxOnWildcardElements(elt), processHxOnWildcard)\n    forEach(elementsToInit, initNode)\n  }\n\n  //= ===================================================================\n  // Event/Log Support\n  //= ===================================================================\n\n  /**\n   * @param {string} str\n   * @returns {string}\n   */\n  function kebabEventName(str) {\n    return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {any} detail\n   * @returns {CustomEvent}\n   */\n  function makeEvent(eventName, detail) {\n    // TODO: `composed: true` here is a hack to make global event handlers work with events in shadow DOM\n    // This breaks expected encapsulation but needs to be here until decided otherwise by core devs\n    return new CustomEvent(eventName, { bubbles: true, cancelable: true, composed: true, detail })\n  }\n\n  /**\n   * @param {EventTarget|string} elt\n   * @param {string} eventName\n   * @param {any=} detail\n   */\n  function triggerErrorEvent(elt, eventName, detail) {\n    triggerEvent(elt, eventName, mergeObjects({ error: eventName }, detail))\n  }\n\n  /**\n   * @param {string} eventName\n   * @returns {boolean}\n   */\n  function ignoreEventForLogging(eventName) {\n    return eventName === 'htmx:afterProcessNode'\n  }\n\n  /**\n   * `withExtensions` locates all active extensions for a provided element, then\n   * executes the provided function using each of the active extensions. You can filter\n   * the element's extensions by giving it a list of extensions to ignore. It should\n   * be called internally at every extendable execution point in htmx.\n   *\n   * @param {Element} elt\n   * @param {(extension:HtmxExtension) => void} toDo\n   * @param {string[]=} extensionsToIgnore\n   * @returns void\n   */\n  function withExtensions(elt, toDo, extensionsToIgnore) {\n    forEach(getExtensions(elt, [], extensionsToIgnore), function(extension) {\n      try {\n        toDo(extension)\n      } catch (e) {\n        logError(e)\n      }\n    })\n  }\n\n  function logError(msg) {\n    console.error(msg)\n  }\n\n  /**\n   * Triggers a given event on an element\n   *\n   * @see https://htmx.org/api/#trigger\n   *\n   * @param {EventTarget|string} elt the element to trigger the event on\n   * @param {string} eventName the name of the event to trigger\n   * @param {any=} detail details for the event\n   * @returns {boolean}\n   */\n  function triggerEvent(elt, eventName, detail) {\n    elt = resolveTarget(elt)\n    if (detail == null) {\n      detail = {}\n    }\n    detail.elt = elt\n    const event = makeEvent(eventName, detail)\n    if (htmx.logger && !ignoreEventForLogging(eventName)) {\n      htmx.logger(elt, eventName, detail)\n    }\n    if (detail.error) {\n      logError(detail.error + (detail.target ? ', ' + detail.target : ''))\n      triggerEvent(elt, 'htmx:error', { errorInfo: detail })\n    }\n    let eventResult = elt.dispatchEvent(event)\n    const kebabName = kebabEventName(eventName)\n    if (eventResult && kebabName !== eventName) {\n      const kebabedEvent = makeEvent(kebabName, event.detail)\n      eventResult = eventResult && elt.dispatchEvent(kebabedEvent)\n    }\n    withExtensions(asElement(elt), function(extension) {\n      eventResult = eventResult && (extension.onEvent(eventName, event) !== false && !event.defaultPrevented)\n    })\n    return eventResult\n  }\n\n  //= ===================================================================\n  // History Support\n  //= ===================================================================\n  let currentPathForHistory\n\n  /**\n   * @param {string} path\n   */\n  function setCurrentPathForHistory(path) {\n    currentPathForHistory = path\n    if (canAccessLocalStorage()) {\n      sessionStorage.setItem('htmx-current-path-for-history', path)\n    }\n  }\n\n  setCurrentPathForHistory(location.pathname + location.search)\n\n  /**\n   * @returns {Element}\n   */\n  function getHistoryElement() {\n    const historyElt = getDocument().querySelector('[hx-history-elt],[data-hx-history-elt]')\n    return historyElt || getDocument().body\n  }\n\n  /**\n   * @param {string} url\n   * @param {Element} rootElt\n   */\n  function saveToHistoryCache(url, rootElt) {\n    if (!canAccessLocalStorage()) {\n      return\n    }\n\n    // get state to save\n    const innerHTML = cleanInnerHtmlForHistory(rootElt)\n    const title = getDocument().title\n    const scroll = window.scrollY\n\n    if (htmx.config.historyCacheSize <= 0) {\n      // make sure that an eventually already existing cache is purged\n      sessionStorage.removeItem('htmx-history-cache')\n      return\n    }\n\n    url = normalizePath(url)\n\n    const historyCache = parseJSON(sessionStorage.getItem('htmx-history-cache')) || []\n    for (let i = 0; i < historyCache.length; i++) {\n      if (historyCache[i].url === url) {\n        historyCache.splice(i, 1)\n        break\n      }\n    }\n\n    /** @type HtmxHistoryItem */\n    const newHistoryItem = { url, content: innerHTML, title, scroll }\n\n    triggerEvent(getDocument().body, 'htmx:historyItemCreated', { item: newHistoryItem, cache: historyCache })\n\n    historyCache.push(newHistoryItem)\n    while (historyCache.length > htmx.config.historyCacheSize) {\n      historyCache.shift()\n    }\n\n    // keep trying to save the cache until it succeeds or is empty\n    while (historyCache.length > 0) {\n      try {\n        sessionStorage.setItem('htmx-history-cache', JSON.stringify(historyCache))\n        break\n      } catch (e) {\n        triggerErrorEvent(getDocument().body, 'htmx:historyCacheError', { cause: e, cache: historyCache })\n        historyCache.shift() // shrink the cache and retry\n      }\n    }\n  }\n\n  /**\n   * @typedef {Object} HtmxHistoryItem\n   * @property {string} url\n   * @property {string} content\n   * @property {string} title\n   * @property {number} scroll\n   */\n\n  /**\n   * @param {string} url\n   * @returns {HtmxHistoryItem|null}\n   */\n  function getCachedHistory(url) {\n    if (!canAccessLocalStorage()) {\n      return null\n    }\n\n    url = normalizePath(url)\n\n    const historyCache = parseJSON(sessionStorage.getItem('htmx-history-cache')) || []\n    for (let i = 0; i < historyCache.length; i++) {\n      if (historyCache[i].url === url) {\n        return historyCache[i]\n      }\n    }\n    return null\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {string}\n   */\n  function cleanInnerHtmlForHistory(elt) {\n    const className = htmx.config.requestClass\n    const clone = /** @type Element */ (elt.cloneNode(true))\n    forEach(findAll(clone, '.' + className), function(child) {\n      removeClassFromElement(child, className)\n    })\n    // remove the disabled attribute for any element disabled due to an htmx request\n    forEach(findAll(clone, '[data-disabled-by-htmx]'), function(child) {\n      child.removeAttribute('disabled')\n    })\n    return clone.innerHTML\n  }\n\n  function saveCurrentPageToHistory() {\n    const elt = getHistoryElement()\n    let path = currentPathForHistory\n    if (canAccessLocalStorage()) {\n      path = sessionStorage.getItem('htmx-current-path-for-history')\n    }\n    path = path || location.pathname + location.search\n\n    // Allow history snapshot feature to be disabled where hx-history=\"false\"\n    // is present *anywhere* in the current document we're about to save,\n    // so we can prevent privileged data entering the cache.\n    // The page will still be reachable as a history entry, but htmx will fetch it\n    // live from the server onpopstate rather than look in the sessionStorage cache\n    const disableHistoryCache = getDocument().querySelector('[hx-history=\"false\" i],[data-hx-history=\"false\" i]')\n    if (!disableHistoryCache) {\n      triggerEvent(getDocument().body, 'htmx:beforeHistorySave', { path, historyElt: elt })\n      saveToHistoryCache(path, elt)\n    }\n\n    if (htmx.config.historyEnabled) history.replaceState({ htmx: true }, getDocument().title, location.href)\n  }\n\n  /**\n   * @param {string} path\n   */\n  function pushUrlIntoHistory(path) {\n  // remove the cache buster parameter, if any\n    if (htmx.config.getCacheBusterParam) {\n      path = path.replace(/org\\.htmx\\.cache-buster=[^&]*&?/, '')\n      if (endsWith(path, '&') || endsWith(path, '?')) {\n        path = path.slice(0, -1)\n      }\n    }\n    if (htmx.config.historyEnabled) {\n      history.pushState({ htmx: true }, '', path)\n    }\n    setCurrentPathForHistory(path)\n  }\n\n  /**\n   * @param {string} path\n   */\n  function replaceUrlInHistory(path) {\n    if (htmx.config.historyEnabled) history.replaceState({ htmx: true }, '', path)\n    setCurrentPathForHistory(path)\n  }\n\n  /**\n   * @param {HtmxSettleTask[]} tasks\n   */\n  function settleImmediately(tasks) {\n    forEach(tasks, function(task) {\n      task.call(undefined)\n    })\n  }\n\n  /**\n   * @param {string} path\n   */\n  function loadHistoryFromServer(path) {\n    const request = new XMLHttpRequest()\n    const swapSpec = { swapStyle: 'innerHTML', swapDelay: 0, settleDelay: 0 }\n    const details = { path, xhr: request, historyElt: getHistoryElement(), swapSpec }\n    request.open('GET', path, true)\n    if (htmx.config.historyRestoreAsHxRequest) {\n      request.setRequestHeader('HX-Request', 'true')\n    }\n    request.setRequestHeader('HX-History-Restore-Request', 'true')\n    request.setRequestHeader('HX-Current-URL', location.href)\n    request.onload = function() {\n      if (this.status >= 200 && this.status < 400) {\n        details.response = this.response\n        triggerEvent(getDocument().body, 'htmx:historyCacheMissLoad', details)\n        swap(details.historyElt, details.response, swapSpec, {\n          contextElement: details.historyElt,\n          historyRequest: true\n        })\n        setCurrentPathForHistory(details.path)\n        triggerEvent(getDocument().body, 'htmx:historyRestore', { path, cacheMiss: true, serverResponse: details.response })\n      } else {\n        triggerErrorEvent(getDocument().body, 'htmx:historyCacheMissLoadError', details)\n      }\n    }\n    if (triggerEvent(getDocument().body, 'htmx:historyCacheMiss', details)) {\n      request.send() // only send request if event not prevented\n    }\n  }\n\n  /**\n   * @param {string} [path]\n   */\n  function restoreHistory(path) {\n    saveCurrentPageToHistory()\n    path = path || location.pathname + location.search\n    const cached = getCachedHistory(path)\n    if (cached) {\n      const swapSpec = { swapStyle: 'innerHTML', swapDelay: 0, settleDelay: 0, scroll: cached.scroll }\n      const details = { path, item: cached, historyElt: getHistoryElement(), swapSpec }\n      if (triggerEvent(getDocument().body, 'htmx:historyCacheHit', details)) {\n        swap(details.historyElt, cached.content, swapSpec, {\n          contextElement: details.historyElt,\n          title: cached.title\n        })\n        setCurrentPathForHistory(details.path)\n        triggerEvent(getDocument().body, 'htmx:historyRestore', details)\n      }\n    } else {\n      if (htmx.config.refreshOnHistoryMiss) {\n        // @ts-ignore: optional parameter in reload() function throws error\n        // noinspection JSUnresolvedReference\n        htmx.location.reload(true)\n      } else {\n        loadHistoryFromServer(path)\n      }\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {Element[]}\n   */\n  function addRequestIndicatorClasses(elt) {\n    let indicators = /** @type Element[] */ (findAttributeTargets(elt, 'hx-indicator'))\n    if (indicators == null) {\n      indicators = [elt]\n    }\n    forEach(indicators, function(ic) {\n      const internalData = getInternalData(ic)\n      internalData.requestCount = (internalData.requestCount || 0) + 1\n      addClassToElement(ic, htmx.config.requestClass)\n    })\n    return indicators\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {Element[]}\n   */\n  function disableElements(elt) {\n    let disabledElts = /** @type Element[] */ (findAttributeTargets(elt, 'hx-disabled-elt'))\n    if (disabledElts == null) {\n      disabledElts = []\n    }\n    forEach(disabledElts, function(disabledElement) {\n      const internalData = getInternalData(disabledElement)\n      internalData.requestCount = (internalData.requestCount || 0) + 1\n      if (!disabledElement.hasAttribute('disabled')) {\n        disabledElement.setAttribute('disabled', '')\n        disabledElement.setAttribute('data-disabled-by-htmx', '')\n      }\n    })\n    return disabledElts\n  }\n\n  /**\n   * @param {Element[]} indicators\n   * @param {Element[]} disabled\n   */\n  function removeRequestIndicators(indicators, disabled) {\n    forEach(indicators.concat(disabled), function(ele) {\n      const internalData = getInternalData(ele)\n      internalData.requestCount = (internalData.requestCount || 1) - 1\n    })\n    forEach(indicators, function(ic) {\n      const internalData = getInternalData(ic)\n      if (internalData.requestCount === 0) {\n        removeClassFromElement(ic, htmx.config.requestClass)\n      }\n    })\n    forEach(disabled, function(disabledElement) {\n      const internalData = getInternalData(disabledElement)\n      if (internalData.requestCount === 0 && disabledElement.hasAttribute('data-disabled-by-htmx')) {\n        disabledElement.removeAttribute('disabled')\n        disabledElement.removeAttribute('data-disabled-by-htmx')\n      }\n    })\n  }\n\n  //= ===================================================================\n  // Input Value Processing\n  //= ===================================================================\n\n  /**\n   * @param {Element[]} processed\n   * @param {Element} elt\n   * @returns {boolean}\n   */\n  function haveSeenNode(processed, elt) {\n    for (let i = 0; i < processed.length; i++) {\n      const node = processed[i]\n      if (node.isSameNode(elt)) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * @param {Element} element\n   * @return {boolean}\n   */\n  function shouldInclude(element) {\n    // Cast to trick tsc, undefined values will work fine here\n    const elt = /** @type {HTMLInputElement} */ (element)\n    if (elt.name === '' || elt.name == null || elt.disabled || closest(elt, 'fieldset[disabled]')) {\n      return false\n    }\n    // ignore \"submitter\" types (see jQuery src/serialize.js)\n    if (elt.type === 'button' || elt.type === 'submit' || elt.tagName === 'image' || elt.tagName === 'reset' || elt.tagName === 'file') {\n      return false\n    }\n    if (elt.type === 'checkbox' || elt.type === 'radio') {\n      return elt.checked\n    }\n    return true\n  }\n\n  /**\n   * @param {string} name\n   * @param {string|Array|FormDataEntryValue} value\n   * @param {FormData} formData */\n  function addValueToFormData(name, value, formData) {\n    if (name != null && value != null) {\n      if (Array.isArray(value)) {\n        value.forEach(function(v) { formData.append(name, v) })\n      } else {\n        formData.append(name, value)\n      }\n    }\n  }\n\n  /**\n   * @param {string} name\n   * @param {string|Array} value\n   * @param {FormData} formData */\n  function removeValueFromFormData(name, value, formData) {\n    if (name != null && value != null) {\n      let values = formData.getAll(name)\n      if (Array.isArray(value)) {\n        values = values.filter(v => value.indexOf(v) < 0)\n      } else {\n        values = values.filter(v => v !== value)\n      }\n      formData.delete(name)\n      forEach(values, v => formData.append(name, v))\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @returns {string|Array}\n   */\n  function getValueFromInput(elt) {\n    if (elt instanceof HTMLSelectElement && elt.multiple) {\n      return toArray(elt.querySelectorAll('option:checked')).map(function(e) { return (/** @type HTMLOptionElement */(e)).value })\n    }\n    // include file inputs\n    if (elt instanceof HTMLInputElement && elt.files) {\n      return toArray(elt.files)\n    }\n    // @ts-ignore value will be undefined for non-input elements, which is fine\n    return elt.value\n  }\n\n  /**\n   * @param {Element[]} processed\n   * @param {FormData} formData\n   * @param {HtmxElementValidationError[]} errors\n   * @param {Element|HTMLInputElement|HTMLSelectElement|HTMLFormElement} elt\n   * @param {boolean} validate\n   */\n  function processInputValue(processed, formData, errors, elt, validate) {\n    if (elt == null || haveSeenNode(processed, elt)) {\n      return\n    } else {\n      processed.push(elt)\n    }\n    if (shouldInclude(elt)) {\n      const name = getRawAttribute(elt, 'name')\n      addValueToFormData(name, getValueFromInput(elt), formData)\n      if (validate) {\n        validateElement(elt, errors)\n      }\n    }\n    if (elt instanceof HTMLFormElement) {\n      forEach(elt.elements, function(input) {\n        if (processed.indexOf(input) >= 0) {\n          // The input has already been processed and added to the values, but the FormData that will be\n          //  constructed right after on the form, will include it once again. So remove that input's value\n          //  now to avoid duplicates\n          removeValueFromFormData(input.name, getValueFromInput(input), formData)\n        } else {\n          processed.push(input)\n        }\n        if (validate) {\n          validateElement(input, errors)\n        }\n      })\n      new FormData(elt).forEach(function(value, name) {\n        if (value instanceof File && value.name === '') {\n          return // ignore no-name files\n        }\n        addValueToFormData(name, value, formData)\n      })\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {HtmxElementValidationError[]} errors\n   */\n  function validateElement(elt, errors) {\n    const element = /** @type {HTMLElement & ElementInternals} */ (elt)\n    if (element.willValidate) {\n      triggerEvent(element, 'htmx:validation:validate')\n      if (!element.checkValidity()) {\n        if (\n          triggerEvent(element, 'htmx:validation:failed', {\n            message: element.validationMessage,\n            validity: element.validity\n          }) &&\n          !errors.length &&\n          htmx.config.reportValidityOfForms\n        ) {\n          element.reportValidity()\n        }\n        errors.push({ elt: element, message: element.validationMessage, validity: element.validity })\n      }\n    }\n  }\n\n  /**\n   * Override values in the one FormData with those from another.\n   * @param {FormData} receiver the formdata that will be mutated\n   * @param {FormData} donor the formdata that will provide the overriding values\n   * @returns {FormData} the {@linkcode receiver}\n   */\n  function overrideFormData(receiver, donor) {\n    for (const key of donor.keys()) {\n      receiver.delete(key)\n    }\n    donor.forEach(function(value, key) {\n      receiver.append(key, value)\n    })\n    return receiver\n  }\n\n  /**\n * @param {Element|HTMLFormElement} elt\n * @param {HttpVerb} verb\n * @returns {{errors: HtmxElementValidationError[], formData: FormData, values: Object}}\n */\n  function getInputValues(elt, verb) {\n    /** @type Element[] */\n    const processed = []\n    const formData = new FormData()\n    const priorityFormData = new FormData()\n    /** @type HtmxElementValidationError[] */\n    const errors = []\n    const internalData = getInternalData(elt)\n    if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) {\n      internalData.lastButtonClicked = null\n    }\n\n    // only validate when form is directly submitted and novalidate or formnovalidate are not set\n    // or if the element has an explicit hx-validate=\"true\" on it\n    let validate = (elt instanceof HTMLFormElement && elt.noValidate !== true) || getAttributeValue(elt, 'hx-validate') === 'true'\n    if (internalData.lastButtonClicked) {\n      validate = validate && internalData.lastButtonClicked.formNoValidate !== true\n    }\n\n    // for a non-GET include the related form, which may or may not be a parent element of elt\n    if (verb !== 'get') {\n      processInputValue(processed, priorityFormData, errors, getRelatedForm(elt), validate)\n    }\n\n    // include the element itself\n    processInputValue(processed, formData, errors, elt, validate)\n\n    // if a button or submit was clicked last, include its value\n    if (internalData.lastButtonClicked || elt.tagName === 'BUTTON' ||\n    (elt.tagName === 'INPUT' && getRawAttribute(elt, 'type') === 'submit')) {\n      const button = internalData.lastButtonClicked || (/** @type HTMLInputElement|HTMLButtonElement */(elt))\n      const name = getRawAttribute(button, 'name')\n      addValueToFormData(name, button.value, priorityFormData)\n    }\n\n    // include any explicit includes\n    const includes = findAttributeTargets(elt, 'hx-include')\n    forEach(includes, function(node) {\n      processInputValue(processed, formData, errors, asElement(node), validate)\n      // if a non-form is included, include any input values within it\n      if (!matches(node, 'form')) {\n        forEach(asParentNode(node).querySelectorAll(INPUT_SELECTOR), function(descendant) {\n          processInputValue(processed, formData, errors, descendant, validate)\n        })\n      }\n    })\n\n    // values from a <form> take precedence, overriding the regular values\n    overrideFormData(formData, priorityFormData)\n\n    return { errors, formData, values: formDataProxy(formData) }\n  }\n\n  /**\n   * @param {string} returnStr\n   * @param {string} name\n   * @param {any} realValue\n   * @returns {string}\n   */\n  function appendParam(returnStr, name, realValue) {\n    if (returnStr !== '') {\n      returnStr += '&'\n    }\n    if (String(realValue) === '[object Object]') {\n      realValue = JSON.stringify(realValue)\n    }\n    const s = encodeURIComponent(realValue)\n    returnStr += encodeURIComponent(name) + '=' + s\n    return returnStr\n  }\n\n  /**\n   * @param {FormData|Object} values\n   * @returns string\n   */\n  function urlEncode(values) {\n    values = formDataFromObject(values)\n    let returnStr = ''\n    values.forEach(function(value, key) {\n      returnStr = appendParam(returnStr, key, value)\n    })\n    return returnStr\n  }\n\n  //= ===================================================================\n  // Ajax\n  //= ===================================================================\n\n  /**\n * @param {Element} elt\n * @param {Element} target\n * @param {string} prompt\n * @returns {HtmxHeaderSpecification}\n */\n  function getHeaders(elt, target, prompt) {\n    /** @type HtmxHeaderSpecification */\n    const headers = {\n      'HX-Request': 'true',\n      'HX-Trigger': getRawAttribute(elt, 'id'),\n      'HX-Trigger-Name': getRawAttribute(elt, 'name'),\n      'HX-Target': getAttributeValue(target, 'id'),\n      'HX-Current-URL': location.href\n    }\n    getValuesForElement(elt, 'hx-headers', false, headers)\n    if (prompt !== undefined) {\n      headers['HX-Prompt'] = prompt\n    }\n    if (getInternalData(elt).boosted) {\n      headers['HX-Boosted'] = 'true'\n    }\n    return headers\n  }\n\n  /**\n * filterValues takes an object containing form input values\n * and returns a new object that only contains keys that are\n * specified by the closest \"hx-params\" attribute\n * @param {FormData} inputValues\n * @param {Element} elt\n * @returns {FormData}\n */\n  function filterValues(inputValues, elt) {\n    const paramsValue = getClosestAttributeValue(elt, 'hx-params')\n    if (paramsValue) {\n      if (paramsValue === 'none') {\n        return new FormData()\n      } else if (paramsValue === '*') {\n        return inputValues\n      } else if (paramsValue.indexOf('not ') === 0) {\n        forEach(paramsValue.slice(4).split(','), function(name) {\n          name = name.trim()\n          inputValues.delete(name)\n        })\n        return inputValues\n      } else {\n        const newValues = new FormData()\n        forEach(paramsValue.split(','), function(name) {\n          name = name.trim()\n          if (inputValues.has(name)) {\n            inputValues.getAll(name).forEach(function(value) { newValues.append(name, value) })\n          }\n        })\n        return newValues\n      }\n    } else {\n      return inputValues\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @return {boolean}\n   */\n  function isAnchorLink(elt) {\n    return !!getRawAttribute(elt, 'href') && getRawAttribute(elt, 'href').indexOf('#') >= 0\n  }\n\n  /**\n * @param {Element} elt\n * @param {HtmxSwapStyle} [swapInfoOverride]\n * @returns {HtmxSwapSpecification}\n */\n  function getSwapSpecification(elt, swapInfoOverride) {\n    const swapInfo = swapInfoOverride || getClosestAttributeValue(elt, 'hx-swap')\n    /** @type HtmxSwapSpecification */\n    const swapSpec = {\n      swapStyle: getInternalData(elt).boosted ? 'innerHTML' : htmx.config.defaultSwapStyle,\n      swapDelay: htmx.config.defaultSwapDelay,\n      settleDelay: htmx.config.defaultSettleDelay\n    }\n    if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) {\n      swapSpec.show = 'top'\n    }\n    if (swapInfo) {\n      const split = splitOnWhitespace(swapInfo)\n      if (split.length > 0) {\n        for (let i = 0; i < split.length; i++) {\n          const value = split[i]\n          if (value.indexOf('swap:') === 0) {\n            swapSpec.swapDelay = parseInterval(value.slice(5))\n          } else if (value.indexOf('settle:') === 0) {\n            swapSpec.settleDelay = parseInterval(value.slice(7))\n          } else if (value.indexOf('transition:') === 0) {\n            swapSpec.transition = value.slice(11) === 'true'\n          } else if (value.indexOf('ignoreTitle:') === 0) {\n            swapSpec.ignoreTitle = value.slice(12) === 'true'\n          } else if (value.indexOf('scroll:') === 0) {\n            const scrollSpec = value.slice(7)\n            var splitSpec = scrollSpec.split(':')\n            const scrollVal = splitSpec.pop()\n            var selectorVal = splitSpec.length > 0 ? splitSpec.join(':') : null\n            // @ts-ignore\n            swapSpec.scroll = scrollVal\n            swapSpec.scrollTarget = selectorVal\n          } else if (value.indexOf('show:') === 0) {\n            const showSpec = value.slice(5)\n            var splitSpec = showSpec.split(':')\n            const showVal = splitSpec.pop()\n            var selectorVal = splitSpec.length > 0 ? splitSpec.join(':') : null\n            swapSpec.show = showVal\n            swapSpec.showTarget = selectorVal\n          } else if (value.indexOf('focus-scroll:') === 0) {\n            const focusScrollVal = value.slice('focus-scroll:'.length)\n            swapSpec.focusScroll = focusScrollVal == 'true'\n          } else if (i == 0) {\n            swapSpec.swapStyle = value\n          } else {\n            logError('Unknown modifier in hx-swap: ' + value)\n          }\n        }\n      }\n    }\n    return swapSpec\n  }\n\n  /**\n   * @param {Element} elt\n   * @return {boolean}\n   */\n  function usesFormData(elt) {\n    return getClosestAttributeValue(elt, 'hx-encoding') === 'multipart/form-data' ||\n    (matches(elt, 'form') && getRawAttribute(elt, 'enctype') === 'multipart/form-data')\n  }\n\n  /**\n   * @param {XMLHttpRequest} xhr\n   * @param {Element} elt\n   * @param {FormData} filteredParameters\n   * @returns {*|string|null}\n   */\n  function encodeParamsForBody(xhr, elt, filteredParameters) {\n    let encodedParameters = null\n    withExtensions(elt, function(extension) {\n      if (encodedParameters == null) {\n        encodedParameters = extension.encodeParameters(xhr, filteredParameters, elt)\n      }\n    })\n    if (encodedParameters != null) {\n      return encodedParameters\n    } else {\n      if (usesFormData(elt)) {\n        // Force conversion to an actual FormData object in case filteredParameters is a formDataProxy\n        // See https://github.com/bigskysoftware/htmx/issues/2317\n        return overrideFormData(new FormData(), formDataFromObject(filteredParameters))\n      } else {\n        return urlEncode(filteredParameters)\n      }\n    }\n  }\n\n  /**\n *\n * @param {Element} target\n * @returns {HtmxSettleInfo}\n */\n  function makeSettleInfo(target) {\n    return { tasks: [], elts: [target] }\n  }\n\n  /**\n   * @param {Element[]} content\n   * @param {HtmxSwapSpecification} swapSpec\n   */\n  function updateScrollState(content, swapSpec) {\n    const first = content[0]\n    const last = content[content.length - 1]\n    if (swapSpec.scroll) {\n      var target = null\n      if (swapSpec.scrollTarget) {\n        target = asElement(querySelectorExt(first, swapSpec.scrollTarget))\n      }\n      if (swapSpec.scroll === 'top' && (first || target)) {\n        target = target || first\n        target.scrollTop = 0\n      }\n      if (swapSpec.scroll === 'bottom' && (last || target)) {\n        target = target || last\n        target.scrollTop = target.scrollHeight\n      }\n      if (typeof swapSpec.scroll === 'number') {\n        getWindow().setTimeout(function() {\n          window.scrollTo(0, /** @type number */ (swapSpec.scroll))\n        }, 0) // next 'tick', so browser has time to render layout\n      }\n    }\n    if (swapSpec.show) {\n      var target = null\n      if (swapSpec.showTarget) {\n        let targetStr = swapSpec.showTarget\n        if (swapSpec.showTarget === 'window') {\n          targetStr = 'body'\n        }\n        target = asElement(querySelectorExt(first, targetStr))\n      }\n      if (swapSpec.show === 'top' && (first || target)) {\n        target = target || first\n        // @ts-ignore For some reason tsc doesn't recognize \"instant\" as a valid option for now\n        target.scrollIntoView({ block: 'start', behavior: htmx.config.scrollBehavior })\n      }\n      if (swapSpec.show === 'bottom' && (last || target)) {\n        target = target || last\n        // @ts-ignore For some reason tsc doesn't recognize \"instant\" as a valid option for now\n        target.scrollIntoView({ block: 'end', behavior: htmx.config.scrollBehavior })\n      }\n    }\n  }\n\n  /**\n * @param {Element} elt\n * @param {string} attr\n * @param {boolean=} evalAsDefault\n * @param {Object=} values\n * @param {Event=} event\n * @returns {Object}\n */\n  function getValuesForElement(elt, attr, evalAsDefault, values, event) {\n    if (values == null) {\n      values = {}\n    }\n    if (elt == null) {\n      return values\n    }\n    const attributeValue = getAttributeValue(elt, attr)\n    if (attributeValue) {\n      let str = attributeValue.trim()\n      let evaluateValue = evalAsDefault\n      if (str === 'unset') {\n        return null\n      }\n      if (str.indexOf('javascript:') === 0) {\n        str = str.slice(11)\n        evaluateValue = true\n      } else if (str.indexOf('js:') === 0) {\n        str = str.slice(3)\n        evaluateValue = true\n      }\n      if (str.indexOf('{') !== 0) {\n        str = '{' + str + '}'\n      }\n      let varsValues\n      if (evaluateValue) {\n        varsValues = maybeEval(elt, function() {\n          if (event) {\n            return Function('event', 'return (' + str + ')').call(elt, event)\n          } else { // allow window.event to be accessible\n            return Function('return (' + str + ')').call(elt)\n          }\n        }, {})\n      } else {\n        varsValues = parseJSON(str)\n      }\n      for (const key in varsValues) {\n        if (varsValues.hasOwnProperty(key)) {\n          if (values[key] == null) {\n            values[key] = varsValues[key]\n          }\n        }\n      }\n    }\n    return getValuesForElement(asElement(parentElt(elt)), attr, evalAsDefault, values, event)\n  }\n\n  /**\n   * @param {EventTarget|string} elt\n   * @param {() => any} toEval\n   * @param {any=} defaultVal\n   * @returns {any}\n   */\n  function maybeEval(elt, toEval, defaultVal) {\n    if (htmx.config.allowEval) {\n      return toEval()\n    } else {\n      triggerErrorEvent(elt, 'htmx:evalDisallowedError')\n      return defaultVal\n    }\n  }\n\n  /**\n * @param {Element} elt\n * @param {Event=} event\n * @param {*?=} expressionVars\n * @returns\n */\n  function getHXVarsForElement(elt, event, expressionVars) {\n    return getValuesForElement(elt, 'hx-vars', true, expressionVars, event)\n  }\n\n  /**\n * @param {Element} elt\n * @param {Event=} event\n * @param {*?=} expressionVars\n * @returns\n */\n  function getHXValsForElement(elt, event, expressionVars) {\n    return getValuesForElement(elt, 'hx-vals', false, expressionVars, event)\n  }\n\n  /**\n * @param {Element} elt\n * @param {Event=} event\n * @returns {FormData}\n */\n  function getExpressionVars(elt, event) {\n    return mergeObjects(getHXVarsForElement(elt, event), getHXValsForElement(elt, event))\n  }\n\n  /**\n   * @param {XMLHttpRequest} xhr\n   * @param {string} header\n   * @param {string|null} headerValue\n   */\n  function safelySetHeaderValue(xhr, header, headerValue) {\n    if (headerValue !== null) {\n      try {\n        xhr.setRequestHeader(header, headerValue)\n      } catch (e) {\n      // On an exception, try to set the header URI encoded instead\n        xhr.setRequestHeader(header, encodeURIComponent(headerValue))\n        xhr.setRequestHeader(header + '-URI-AutoEncoded', 'true')\n      }\n    }\n  }\n\n  /**\n   * @param {XMLHttpRequest} xhr\n   * @return {string}\n   */\n  function getPathFromResponse(xhr) {\n    if (xhr.responseURL) {\n      try {\n        const url = new URL(xhr.responseURL)\n        return url.pathname + url.search\n      } catch (e) {\n        triggerErrorEvent(getDocument().body, 'htmx:badResponseUrl', { url: xhr.responseURL })\n      }\n    }\n  }\n\n  /**\n   * @param {XMLHttpRequest} xhr\n   * @param {RegExp} regexp\n   * @return {boolean}\n   */\n  function hasHeader(xhr, regexp) {\n    return regexp.test(xhr.getAllResponseHeaders())\n  }\n\n  /**\n   * Issues an htmx-style AJAX request\n   *\n   * @see https://htmx.org/api/#ajax\n   *\n   * @param {HttpVerb} verb\n   * @param {string} path the URL path to make the AJAX\n   * @param {Element|string|HtmxAjaxHelperContext} context the element to target (defaults to the **body**) | a selector for the target | a context object that contains any of the following\n   * @return {Promise<void>} Promise that resolves immediately if no request is sent, or when the request is complete\n   */\n  function ajaxHelper(verb, path, context) {\n    verb = (/** @type HttpVerb */(verb.toLowerCase()))\n    if (context) {\n      if (context instanceof Element || typeof context === 'string') {\n        return issueAjaxRequest(verb, path, null, null, {\n          targetOverride: resolveTarget(context) || DUMMY_ELT,\n          returnPromise: true\n        })\n      } else {\n        let resolvedTarget = resolveTarget(context.target)\n        // If target is supplied but can't resolve OR source is supplied but both target and source can't be resolved\n        // then use DUMMY_ELT to abort the request with htmx:targetError to avoid it replacing body by mistake\n        if ((context.target && !resolvedTarget) || (context.source && !resolvedTarget && !resolveTarget(context.source))) {\n          resolvedTarget = DUMMY_ELT\n        }\n        return issueAjaxRequest(verb, path, resolveTarget(context.source), context.event,\n          {\n            handler: context.handler,\n            headers: context.headers,\n            values: context.values,\n            targetOverride: resolvedTarget,\n            swapOverride: context.swap,\n            select: context.select,\n            returnPromise: true,\n            push: context.push,\n            replace: context.replace,\n            selectOOB: context.selectOOB\n          })\n      }\n    } else {\n      return issueAjaxRequest(verb, path, null, null, {\n        returnPromise: true\n      })\n    }\n  }\n\n  /**\n   * @param {Element} elt\n   * @return {Element[]}\n   */\n  function hierarchyForElt(elt) {\n    const arr = []\n    while (elt) {\n      arr.push(elt)\n      elt = elt.parentElement\n    }\n    return arr\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {string} path\n   * @param {HtmxRequestConfig} requestConfig\n   * @return {boolean}\n   */\n  function verifyPath(elt, path, requestConfig) {\n    const url = new URL(path, location.protocol !== 'about:' ? location.href : window.origin)\n    const origin = location.protocol !== 'about:' ? location.origin : window.origin\n    const sameHost = origin === url.origin\n\n    if (htmx.config.selfRequestsOnly) {\n      if (!sameHost) {\n        return false\n      }\n    }\n    return triggerEvent(elt, 'htmx:validateUrl', mergeObjects({ url, sameHost }, requestConfig))\n  }\n\n  /**\n   * @param {Object|FormData} obj\n   * @return {FormData}\n   */\n  function formDataFromObject(obj) {\n    if (obj instanceof FormData) return obj\n    const formData = new FormData()\n    for (const key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        if (obj[key] && typeof obj[key].forEach === 'function') {\n          obj[key].forEach(function(v) { formData.append(key, v) })\n        } else if (typeof obj[key] === 'object' && !(obj[key] instanceof Blob)) {\n          formData.append(key, JSON.stringify(obj[key]))\n        } else {\n          formData.append(key, obj[key])\n        }\n      }\n    }\n    return formData\n  }\n\n  /**\n   * @param {FormData} formData\n   * @param {string} name\n   * @param {Array} array\n   * @returns {Array}\n   */\n  function formDataArrayProxy(formData, name, array) {\n    // mutating the array should mutate the underlying form data\n    return new Proxy(array, {\n      get: function(target, key) {\n        if (typeof key === 'number') return target[key]\n        if (key === 'length') return target.length\n        if (key === 'push') {\n          return function(value) {\n            target.push(value)\n            formData.append(name, value)\n          }\n        }\n        if (typeof target[key] === 'function') {\n          return function() {\n            target[key].apply(target, arguments)\n            formData.delete(name)\n            target.forEach(function(v) { formData.append(name, v) })\n          }\n        }\n\n        if (target[key] && target[key].length === 1) {\n          return target[key][0]\n        } else {\n          return target[key]\n        }\n      },\n      set: function(target, index, value) {\n        target[index] = value\n        formData.delete(name)\n        target.forEach(function(v) { formData.append(name, v) })\n        return true\n      }\n    })\n  }\n\n  /**\n   * @param {FormData} formData\n   * @returns {Object}\n   */\n  function formDataProxy(formData) {\n    return new Proxy(formData, {\n      get: function(target, name) {\n        if (typeof name === 'symbol') {\n          // Forward symbol calls to the FormData itself directly\n          const result = Reflect.get(target, name)\n          // Wrap in function with apply to correctly bind the FormData context, as a direct call would result in an illegal invocation error\n          if (typeof result === 'function') {\n            return function() {\n              return result.apply(formData, arguments)\n            }\n          } else {\n            return result\n          }\n        }\n        if (name === 'toJSON') {\n          // Support JSON.stringify call on proxy\n          return () => Object.fromEntries(formData)\n        }\n        if (name in target) {\n          // Wrap in function with apply to correctly bind the FormData context, as a direct call would result in an illegal invocation error\n          if (typeof target[name] === 'function') {\n            return function() {\n              return formData[name].apply(formData, arguments)\n            }\n          }\n        }\n        const array = formData.getAll(name)\n        // Those 2 undefined & single value returns are for retro-compatibility as we weren't using FormData before\n        if (array.length === 0) {\n          return undefined\n        } else if (array.length === 1) {\n          return array[0]\n        } else {\n          return formDataArrayProxy(target, name, array)\n        }\n      },\n      set: function(target, name, value) {\n        if (typeof name !== 'string') {\n          return false\n        }\n        target.delete(name)\n        if (value && typeof value.forEach === 'function') {\n          value.forEach(function(v) { target.append(name, v) })\n        } else if (typeof value === 'object' && !(value instanceof Blob)) {\n          target.append(name, JSON.stringify(value))\n        } else {\n          target.append(name, value)\n        }\n        return true\n      },\n      deleteProperty: function(target, name) {\n        if (typeof name === 'string') {\n          target.delete(name)\n        }\n        return true\n      },\n      // Support Object.assign call from proxy\n      ownKeys: function(target) {\n        return Reflect.ownKeys(Object.fromEntries(target))\n      },\n      getOwnPropertyDescriptor: function(target, prop) {\n        return Reflect.getOwnPropertyDescriptor(Object.fromEntries(target), prop)\n      }\n    })\n  }\n\n  /**\n   * @param {HttpVerb} verb\n   * @param {string} path\n   * @param {Element} elt\n   * @param {Event} event\n   * @param {HtmxAjaxEtc} [etc]\n   * @param {boolean} [confirmed]\n   * @return {Promise<void>}\n   */\n  function issueAjaxRequest(verb, path, elt, event, etc, confirmed) {\n    let resolve = null\n    let reject = null\n    etc = etc != null ? etc : {}\n    if (etc.returnPromise && typeof Promise !== 'undefined') {\n      var promise = new Promise(function(_resolve, _reject) {\n        resolve = _resolve\n        reject = _reject\n      })\n    }\n    if (elt == null) {\n      elt = getDocument().body\n    }\n    const responseHandler = etc.handler || handleAjaxResponse\n    const select = etc.select || null\n\n    if (!bodyContains(elt)) {\n    // do not issue requests for elements removed from the DOM\n      maybeCall(resolve)\n      return promise\n    }\n    const target = etc.targetOverride || asElement(getTarget(elt))\n    if (target == null || target == DUMMY_ELT) {\n      triggerErrorEvent(elt, 'htmx:targetError', { target: getClosestAttributeValue(elt, 'hx-target') })\n      maybeCall(reject)\n      return promise\n    }\n\n    let eltData = getInternalData(elt)\n    const submitter = eltData.lastButtonClicked\n\n    if (submitter) {\n      const buttonPath = getRawAttribute(submitter, 'formaction')\n      if (buttonPath != null) {\n        path = buttonPath\n      }\n\n      const buttonVerb = getRawAttribute(submitter, 'formmethod')\n      if (buttonVerb != null) {\n        if (VERBS.includes(buttonVerb.toLowerCase())) {\n          verb = (/** @type HttpVerb */(buttonVerb))\n        } else {\n          maybeCall(resolve)\n          return promise\n        }\n      }\n    }\n\n    const confirmQuestion = getClosestAttributeValue(elt, 'hx-confirm')\n    // allow event-based confirmation w/ a callback\n    if (confirmed === undefined) {\n      const issueRequest = function(skipConfirmation) {\n        return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation)\n      }\n      const confirmDetails = { target, elt, path, verb, triggeringEvent: event, etc, issueRequest, question: confirmQuestion }\n      if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) {\n        maybeCall(resolve)\n        return promise\n      }\n    }\n\n    let syncElt = elt\n    let syncStrategy = getClosestAttributeValue(elt, 'hx-sync')\n    let queueStrategy = null\n    let abortable = false\n    if (syncStrategy) {\n      const syncStrings = syncStrategy.split(':')\n      const selector = syncStrings[0].trim()\n      if (selector === 'this') {\n        syncElt = findThisElement(elt, 'hx-sync')\n      } else {\n        syncElt = asElement(querySelectorExt(elt, selector))\n      }\n      // default to the drop strategy\n      syncStrategy = (syncStrings[1] || 'drop').trim()\n      eltData = getInternalData(syncElt)\n      if (syncStrategy === 'drop' && eltData.xhr && eltData.abortable !== true) {\n        maybeCall(resolve)\n        return promise\n      } else if (syncStrategy === 'abort') {\n        if (eltData.xhr) {\n          maybeCall(resolve)\n          return promise\n        } else {\n          abortable = true\n        }\n      } else if (syncStrategy === 'replace') {\n        triggerEvent(syncElt, 'htmx:abort') // abort the current request and continue\n      } else if (syncStrategy.indexOf('queue') === 0) {\n        const queueStrArray = syncStrategy.split(' ')\n        queueStrategy = (queueStrArray[1] || 'last').trim()\n      }\n    }\n\n    if (eltData.xhr) {\n      if (eltData.abortable) {\n        triggerEvent(syncElt, 'htmx:abort') // abort the current request and continue\n      } else {\n        if (queueStrategy == null) {\n          if (event) {\n            const eventData = getInternalData(event)\n            if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) {\n              queueStrategy = eventData.triggerSpec.queue\n            }\n          }\n          if (queueStrategy == null) {\n            queueStrategy = 'last'\n          }\n        }\n        if (eltData.queuedRequests == null) {\n          eltData.queuedRequests = []\n        }\n        if (queueStrategy === 'first' && eltData.queuedRequests.length === 0) {\n          eltData.queuedRequests.push(function() {\n            issueAjaxRequest(verb, path, elt, event, etc)\n          })\n        } else if (queueStrategy === 'all') {\n          eltData.queuedRequests.push(function() {\n            issueAjaxRequest(verb, path, elt, event, etc)\n          })\n        } else if (queueStrategy === 'last') {\n          eltData.queuedRequests = [] // dump existing queue\n          eltData.queuedRequests.push(function() {\n            issueAjaxRequest(verb, path, elt, event, etc)\n          })\n        }\n        maybeCall(resolve)\n        return promise\n      }\n    }\n\n    const xhr = new XMLHttpRequest()\n    eltData.xhr = xhr\n    eltData.abortable = abortable\n    const endRequestLock = function() {\n      eltData.xhr = null\n      eltData.abortable = false\n      if (eltData.queuedRequests != null &&\n      eltData.queuedRequests.length > 0) {\n        const queuedRequest = eltData.queuedRequests.shift()\n        queuedRequest()\n      }\n    }\n    const promptQuestion = getClosestAttributeValue(elt, 'hx-prompt')\n    if (promptQuestion) {\n      var promptResponse = prompt(promptQuestion)\n      // prompt returns null if cancelled and empty string if accepted with no entry\n      if (promptResponse === null ||\n      !triggerEvent(elt, 'htmx:prompt', { prompt: promptResponse, target })) {\n        maybeCall(resolve)\n        endRequestLock()\n        return promise\n      }\n    }\n\n    if (confirmQuestion && !confirmed) {\n      if (!confirm(confirmQuestion)) {\n        maybeCall(resolve)\n        endRequestLock()\n        return promise\n      }\n    }\n\n    let headers = getHeaders(elt, target, promptResponse)\n\n    if (verb !== 'get' && !usesFormData(elt)) {\n      headers['Content-Type'] = 'application/x-www-form-urlencoded'\n    }\n\n    if (etc.headers) {\n      headers = mergeObjects(headers, etc.headers)\n    }\n    const results = getInputValues(elt, verb)\n    let errors = results.errors\n    const rawFormData = results.formData\n    if (etc.values) {\n      overrideFormData(rawFormData, formDataFromObject(etc.values))\n    }\n    const expressionVars = formDataFromObject(getExpressionVars(elt, event))\n    const allFormData = overrideFormData(rawFormData, expressionVars)\n    let filteredFormData = filterValues(allFormData, elt)\n\n    if (htmx.config.getCacheBusterParam && verb === 'get') {\n      filteredFormData.set('org.htmx.cache-buster', getRawAttribute(target, 'id') || 'true')\n    }\n\n    // behavior of anchors w/ empty href is to use the current URL\n    if (path == null || path === '') {\n      path = location.href\n    }\n\n    /**\n     * @type {Object}\n     * @property {boolean} [credentials]\n     * @property {number} [timeout]\n     * @property {boolean} [noHeaders]\n     */\n    const requestAttrValues = getValuesForElement(elt, 'hx-request')\n\n    const eltIsBoosted = getInternalData(elt).boosted\n\n    let useUrlParams = htmx.config.methodsThatUseUrlParams.indexOf(verb) >= 0\n\n    /** @type HtmxRequestConfig */\n    const requestConfig = {\n      boosted: eltIsBoosted,\n      useUrlParams,\n      formData: filteredFormData,\n      parameters: formDataProxy(filteredFormData),\n      unfilteredFormData: allFormData,\n      unfilteredParameters: formDataProxy(allFormData),\n      headers,\n      elt,\n      target,\n      verb,\n      errors,\n      withCredentials: etc.credentials || requestAttrValues.credentials || htmx.config.withCredentials,\n      timeout: etc.timeout || requestAttrValues.timeout || htmx.config.timeout,\n      path,\n      triggeringEvent: event\n    }\n\n    if (!triggerEvent(elt, 'htmx:configRequest', requestConfig)) {\n      maybeCall(resolve)\n      endRequestLock()\n      return promise\n    }\n\n    // copy out in case the object was overwritten\n    path = requestConfig.path\n    verb = requestConfig.verb\n    headers = requestConfig.headers\n    filteredFormData = formDataFromObject(requestConfig.parameters)\n    errors = requestConfig.errors\n    useUrlParams = requestConfig.useUrlParams\n\n    if (errors && errors.length > 0) {\n      triggerEvent(elt, 'htmx:validation:halted', requestConfig)\n      maybeCall(resolve)\n      endRequestLock()\n      return promise\n    }\n\n    const splitPath = path.split('#')\n    const pathNoAnchor = splitPath[0]\n    const anchor = splitPath[1]\n\n    let finalPath = path\n    if (useUrlParams) {\n      finalPath = pathNoAnchor\n      const hasValues = !filteredFormData.keys().next().done\n      if (hasValues) {\n        if (finalPath.indexOf('?') < 0) {\n          finalPath += '?'\n        } else {\n          finalPath += '&'\n        }\n        finalPath += urlEncode(filteredFormData)\n        if (anchor) {\n          finalPath += '#' + anchor\n        }\n      }\n    }\n\n    if (!verifyPath(elt, finalPath, requestConfig)) {\n      triggerErrorEvent(elt, 'htmx:invalidPath', requestConfig)\n      maybeCall(reject)\n      endRequestLock()\n      return promise\n    }\n\n    xhr.open(verb.toUpperCase(), finalPath, true)\n    xhr.overrideMimeType('text/html')\n    xhr.withCredentials = requestConfig.withCredentials\n    xhr.timeout = requestConfig.timeout\n\n    // request headers\n    if (requestAttrValues.noHeaders) {\n    // ignore all headers\n    } else {\n      for (const header in headers) {\n        if (headers.hasOwnProperty(header)) {\n          const headerValue = headers[header]\n          safelySetHeaderValue(xhr, header, headerValue)\n        }\n      }\n    }\n\n    /** @type {HtmxResponseInfo} */\n    const responseInfo = {\n      xhr,\n      target,\n      requestConfig,\n      etc,\n      boosted: eltIsBoosted,\n      select,\n      pathInfo: {\n        requestPath: path,\n        finalRequestPath: finalPath,\n        responsePath: null,\n        anchor\n      }\n    }\n\n    xhr.onload = function() {\n      try {\n        const hierarchy = hierarchyForElt(elt)\n        responseInfo.pathInfo.responsePath = getPathFromResponse(xhr)\n        responseHandler(elt, responseInfo)\n        if (responseInfo.keepIndicators !== true) {\n          removeRequestIndicators(indicators, disableElts)\n        }\n        triggerEvent(elt, 'htmx:afterRequest', responseInfo)\n        triggerEvent(elt, 'htmx:afterOnLoad', responseInfo)\n        // if the body no longer contains the element, trigger the event on the closest parent\n        // remaining in the DOM\n        if (!bodyContains(elt)) {\n          let secondaryTriggerElt = null\n          while (hierarchy.length > 0 && secondaryTriggerElt == null) {\n            const parentEltInHierarchy = hierarchy.shift()\n            if (bodyContains(parentEltInHierarchy)) {\n              secondaryTriggerElt = parentEltInHierarchy\n            }\n          }\n          if (secondaryTriggerElt) {\n            triggerEvent(secondaryTriggerElt, 'htmx:afterRequest', responseInfo)\n            triggerEvent(secondaryTriggerElt, 'htmx:afterOnLoad', responseInfo)\n          }\n        }\n        maybeCall(resolve)\n      } catch (e) {\n        triggerErrorEvent(elt, 'htmx:onLoadError', mergeObjects({ error: e }, responseInfo))\n        throw e\n      } finally {\n        endRequestLock()\n      }\n    }\n    xhr.onerror = function() {\n      removeRequestIndicators(indicators, disableElts)\n      triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo)\n      triggerErrorEvent(elt, 'htmx:sendError', responseInfo)\n      maybeCall(reject)\n      endRequestLock()\n    }\n    xhr.onabort = function() {\n      removeRequestIndicators(indicators, disableElts)\n      triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo)\n      triggerErrorEvent(elt, 'htmx:sendAbort', responseInfo)\n      maybeCall(reject)\n      endRequestLock()\n    }\n    xhr.ontimeout = function() {\n      removeRequestIndicators(indicators, disableElts)\n      triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo)\n      triggerErrorEvent(elt, 'htmx:timeout', responseInfo)\n      maybeCall(reject)\n      endRequestLock()\n    }\n    if (!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)) {\n      maybeCall(resolve)\n      endRequestLock()\n      return promise\n    }\n    var indicators = addRequestIndicatorClasses(elt)\n    var disableElts = disableElements(elt)\n\n    forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) {\n      forEach([xhr, xhr.upload], function(target) {\n        target.addEventListener(eventName, function(event) {\n          triggerEvent(elt, 'htmx:xhr:' + eventName, {\n            lengthComputable: event.lengthComputable,\n            loaded: event.loaded,\n            total: event.total\n          })\n        })\n      })\n    })\n    triggerEvent(elt, 'htmx:beforeSend', responseInfo)\n    const params = useUrlParams ? null : encodeParamsForBody(xhr, elt, filteredFormData)\n    xhr.send(params)\n    return promise\n  }\n\n  /**\n   * @typedef {Object} HtmxHistoryUpdate\n   * @property {string|null} [type]\n   * @property {string|null} [path]\n   */\n\n  /**\n   * @param {Element} elt\n   * @param {HtmxResponseInfo} responseInfo\n   * @return {HtmxHistoryUpdate}\n   */\n  function determineHistoryUpdates(elt, responseInfo) {\n    const xhr = responseInfo.xhr\n\n    //= ==========================================\n    // First consult response headers\n    //= ==========================================\n    let pathFromHeaders = null\n    let typeFromHeaders = null\n    if (hasHeader(xhr, /HX-Push:/i)) {\n      pathFromHeaders = xhr.getResponseHeader('HX-Push')\n      typeFromHeaders = 'push'\n    } else if (hasHeader(xhr, /HX-Push-Url:/i)) {\n      pathFromHeaders = xhr.getResponseHeader('HX-Push-Url')\n      typeFromHeaders = 'push'\n    } else if (hasHeader(xhr, /HX-Replace-Url:/i)) {\n      pathFromHeaders = xhr.getResponseHeader('HX-Replace-Url')\n      typeFromHeaders = 'replace'\n    }\n\n    // if there was a response header, that has priority\n    if (pathFromHeaders) {\n      if (pathFromHeaders === 'false') {\n        return {}\n      } else {\n        return {\n          type: typeFromHeaders,\n          path: pathFromHeaders\n        }\n      }\n    }\n\n    //= ==========================================\n    // Next resolve via DOM values\n    //= ==========================================\n    const requestPath = responseInfo.pathInfo.finalRequestPath\n    const responsePath = responseInfo.pathInfo.responsePath\n\n    let pushUrl = responseInfo.etc.push || getClosestAttributeValue(elt, 'hx-push-url')\n    let replaceUrl = responseInfo.etc.replace || getClosestAttributeValue(elt, 'hx-replace-url')\n    if (pushUrl === 'false') pushUrl = null\n    if (replaceUrl === 'false') replaceUrl = null\n    const elementIsBoosted = getInternalData(elt).boosted\n\n    let saveType = null\n    let path = null\n\n    if (pushUrl) {\n      saveType = 'push'\n      path = pushUrl\n    } else if (replaceUrl) {\n      saveType = 'replace'\n      path = replaceUrl\n    } else if (elementIsBoosted) {\n      saveType = 'push'\n      path = responsePath || requestPath // if there is no response path, go with the original request path\n    }\n\n    if (path) {\n      // true indicates we want to follow wherever the server ended up sending us\n      if (path === 'true') {\n        path = responsePath || requestPath // if there is no response path, go with the original request path\n      }\n\n      // restore any anchor associated with the request\n      if (responseInfo.pathInfo.anchor && path.indexOf('#') === -1) {\n        path = path + '#' + responseInfo.pathInfo.anchor\n      }\n\n      return {\n        type: saveType,\n        path\n      }\n    } else {\n      return {}\n    }\n  }\n\n  /**\n   * @param {HtmxResponseHandlingConfig} responseHandlingConfig\n   * @param {number} status\n   * @return {boolean}\n   */\n  function codeMatches(responseHandlingConfig, status) {\n    var regExp = new RegExp(responseHandlingConfig.code)\n    return regExp.test(status.toString(10))\n  }\n\n  /**\n   * @param {XMLHttpRequest} xhr\n   * @return {HtmxResponseHandlingConfig}\n   */\n  function resolveResponseHandling(xhr) {\n    for (var i = 0; i < htmx.config.responseHandling.length; i++) {\n      /** @type HtmxResponseHandlingConfig */\n      var responseHandlingElement = htmx.config.responseHandling[i]\n      if (codeMatches(responseHandlingElement, xhr.status)) {\n        return responseHandlingElement\n      }\n    }\n    // no matches, return no swap\n    return {\n      swap: false\n    }\n  }\n\n  /**\n   * @param {string} title\n   */\n  function handleTitle(title) {\n    if (title) {\n      const titleElt = find('title')\n      if (titleElt) {\n        titleElt.textContent = title\n      } else {\n        window.document.title = title\n      }\n    }\n  }\n\n  /**\n   * Resove the Retarget selector and throw if not found\n   * @param {Element} elt\n   * @param {String} target\n   * @returns {Element}\n   */\n  function resolveRetarget(elt, target) {\n    if (target === 'this') {\n      return elt\n    }\n    const resolvedTarget = asElement(querySelectorExt(elt, target))\n    if (resolvedTarget == null) {\n      triggerErrorEvent(elt, 'htmx:targetError', { target })\n      throw new Error(`Invalid re-target ${target}`)\n    }\n    return resolvedTarget\n  }\n\n  /**\n   * @param {Element} elt\n   * @param {HtmxResponseInfo} responseInfo\n   */\n  function handleAjaxResponse(elt, responseInfo) {\n    const xhr = responseInfo.xhr\n    let target = responseInfo.target\n    const etc = responseInfo.etc\n    const responseInfoSelect = responseInfo.select\n\n    if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return\n\n    if (hasHeader(xhr, /HX-Trigger:/i)) {\n      handleTriggerHeader(xhr, 'HX-Trigger', elt)\n    }\n\n    if (hasHeader(xhr, /HX-Location:/i)) {\n      let redirectPath = xhr.getResponseHeader('HX-Location')\n      /** @type {HtmxAjaxHelperContext&{path?:string}} */\n      var redirectSwapSpec = {}\n      if (redirectPath.indexOf('{') === 0) {\n        redirectSwapSpec = parseJSON(redirectPath)\n        // what's the best way to throw an error if the user didn't include this\n        redirectPath = redirectSwapSpec.path\n        delete redirectSwapSpec.path\n      }\n      redirectSwapSpec.push = redirectSwapSpec.push ?? 'true'\n      ajaxHelper('get', redirectPath, redirectSwapSpec)\n      return\n    }\n\n    const shouldRefresh = hasHeader(xhr, /HX-Refresh:/i) && xhr.getResponseHeader('HX-Refresh') === 'true'\n\n    if (hasHeader(xhr, /HX-Redirect:/i)) {\n      responseInfo.keepIndicators = true\n      htmx.location.href = xhr.getResponseHeader('HX-Redirect')\n      shouldRefresh && htmx.location.reload()\n      return\n    }\n\n    if (shouldRefresh) {\n      responseInfo.keepIndicators = true\n      htmx.location.reload()\n      return\n    }\n\n    const historyUpdate = determineHistoryUpdates(elt, responseInfo)\n\n    const responseHandling = resolveResponseHandling(xhr)\n    const shouldSwap = responseHandling.swap\n    let isError = !!responseHandling.error\n    let ignoreTitle = htmx.config.ignoreTitle || responseHandling.ignoreTitle\n    let selectOverride = responseHandling.select\n    if (responseHandling.target) {\n      responseInfo.target = resolveRetarget(elt, responseHandling.target)\n    }\n    var swapOverride = etc.swapOverride\n    if (swapOverride == null && responseHandling.swapOverride) {\n      swapOverride = responseHandling.swapOverride\n    }\n\n    // response headers override response handling config\n    if (hasHeader(xhr, /HX-Retarget:/i)) {\n      responseInfo.target = resolveRetarget(elt, xhr.getResponseHeader('HX-Retarget'))\n    }\n\n    if (hasHeader(xhr, /HX-Reswap:/i)) {\n      swapOverride = xhr.getResponseHeader('HX-Reswap')\n    }\n\n    var serverResponse = xhr.response\n    /** @type HtmxBeforeSwapDetails */\n    var beforeSwapDetails = mergeObjects({\n      shouldSwap,\n      serverResponse,\n      isError,\n      ignoreTitle,\n      selectOverride,\n      swapOverride\n    }, responseInfo)\n\n    if (responseHandling.event && !triggerEvent(target, responseHandling.event, beforeSwapDetails)) return\n\n    if (!triggerEvent(target, 'htmx:beforeSwap', beforeSwapDetails)) return\n\n    target = beforeSwapDetails.target // allow re-targeting\n    serverResponse = beforeSwapDetails.serverResponse // allow updating content\n    isError = beforeSwapDetails.isError // allow updating error\n    ignoreTitle = beforeSwapDetails.ignoreTitle // allow updating ignoring title\n    selectOverride = beforeSwapDetails.selectOverride // allow updating select override\n    swapOverride = beforeSwapDetails.swapOverride // allow updating swap override\n\n    responseInfo.target = target // Make updated target available to response events\n    responseInfo.failed = isError // Make failed property available to response events\n    responseInfo.successful = !isError // Make successful property available to response events\n\n    if (beforeSwapDetails.shouldSwap) {\n      if (xhr.status === 286) {\n        cancelPolling(elt)\n      }\n\n      withExtensions(elt, function(extension) {\n        serverResponse = extension.transformResponse(serverResponse, xhr, elt)\n      })\n\n      // Save current page if there will be a history update\n      if (historyUpdate.type) {\n        saveCurrentPageToHistory()\n      }\n\n      var swapSpec = getSwapSpecification(elt, swapOverride)\n\n      if (!swapSpec.hasOwnProperty('ignoreTitle')) {\n        swapSpec.ignoreTitle = ignoreTitle\n      }\n\n      addClassToElement(target, htmx.config.swappingClass)\n\n      if (responseInfoSelect) {\n        selectOverride = responseInfoSelect\n      }\n\n      if (hasHeader(xhr, /HX-Reselect:/i)) {\n        selectOverride = xhr.getResponseHeader('HX-Reselect')\n      }\n\n      const selectOOB = etc.selectOOB || getClosestAttributeValue(elt, 'hx-select-oob')\n      const select = getClosestAttributeValue(elt, 'hx-select')\n\n      swap(target, serverResponse, swapSpec, {\n        select: selectOverride === 'unset' ? null : selectOverride || select,\n        selectOOB,\n        eventInfo: responseInfo,\n        anchor: responseInfo.pathInfo.anchor,\n        contextElement: elt,\n        afterSwapCallback: function() {\n          if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) {\n            let finalElt = elt\n            if (!bodyContains(elt)) {\n              finalElt = getDocument().body\n            }\n            handleTriggerHeader(xhr, 'HX-Trigger-After-Swap', finalElt)\n          }\n        },\n        afterSettleCallback: function() {\n          if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) {\n            let finalElt = elt\n            if (!bodyContains(elt)) {\n              finalElt = getDocument().body\n            }\n            handleTriggerHeader(xhr, 'HX-Trigger-After-Settle', finalElt)\n          }\n        },\n        beforeSwapCallback: function() {\n          // if we need to save history, do so, before swapping so that relative resources have the correct base URL\n          if (historyUpdate.type) {\n            triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo))\n            if (historyUpdate.type === 'push') {\n              pushUrlIntoHistory(historyUpdate.path)\n              triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', { path: historyUpdate.path })\n            } else {\n              replaceUrlInHistory(historyUpdate.path)\n              triggerEvent(getDocument().body, 'htmx:replacedInHistory', { path: historyUpdate.path })\n            }\n          }\n        }\n      })\n    }\n    if (isError) {\n      triggerErrorEvent(elt, 'htmx:responseError', mergeObjects({ error: 'Response Status Error Code ' + xhr.status + ' from ' + responseInfo.pathInfo.requestPath }, responseInfo))\n    }\n  }\n\n  //= ===================================================================\n  // Extensions API\n  //= ===================================================================\n\n  /** @type {Object<string, HtmxExtension>} */\n  const extensions = {}\n\n  /**\n   * extensionBase defines the default functions for all extensions.\n   * @returns {HtmxExtension}\n   */\n  function extensionBase() {\n    return {\n      init: function(api) { return null },\n      getSelectors: function() { return null },\n      onEvent: function(name, evt) { return true },\n      transformResponse: function(text, xhr, elt) { return text },\n      isInlineSwap: function(swapStyle) { return false },\n      handleSwap: function(swapStyle, target, fragment, settleInfo) { return false },\n      encodeParameters: function(xhr, parameters, elt) { return null }\n    }\n  }\n\n  /**\n   * defineExtension initializes the extension and adds it to the htmx registry\n   *\n   * @see https://htmx.org/api/#defineExtension\n   *\n   * @param {string} name the extension name\n   * @param {Partial<HtmxExtension>} extension the extension definition\n   */\n  function defineExtension(name, extension) {\n    if (extension.init) {\n      extension.init(internalAPI)\n    }\n    extensions[name] = mergeObjects(extensionBase(), extension)\n  }\n\n  /**\n   * removeExtension removes an extension from the htmx registry\n   *\n   * @see https://htmx.org/api/#removeExtension\n   *\n   * @param {string} name\n   */\n  function removeExtension(name) {\n    delete extensions[name]\n  }\n\n  /**\n   * getExtensions searches up the DOM tree to return all extensions that can be applied to a given element\n   *\n   * @param {Element} elt\n   * @param {HtmxExtension[]=} extensionsToReturn\n   * @param {string[]=} extensionsToIgnore\n   * @returns {HtmxExtension[]}\n   */\n  function getExtensions(elt, extensionsToReturn, extensionsToIgnore) {\n    if (extensionsToReturn == undefined) {\n      extensionsToReturn = []\n    }\n    if (elt == undefined) {\n      return extensionsToReturn\n    }\n    if (extensionsToIgnore == undefined) {\n      extensionsToIgnore = []\n    }\n    const extensionsForElement = getAttributeValue(elt, 'hx-ext')\n    if (extensionsForElement) {\n      forEach(extensionsForElement.split(','), function(extensionName) {\n        extensionName = extensionName.replace(/ /g, '')\n        if (extensionName.slice(0, 7) == 'ignore:') {\n          extensionsToIgnore.push(extensionName.slice(7))\n          return\n        }\n        if (extensionsToIgnore.indexOf(extensionName) < 0) {\n          const extension = extensions[extensionName]\n          if (extension && extensionsToReturn.indexOf(extension) < 0) {\n            extensionsToReturn.push(extension)\n          }\n        }\n      })\n    }\n    return getExtensions(asElement(parentElt(elt)), extensionsToReturn, extensionsToIgnore)\n  }\n\n  //= ===================================================================\n  // Initialization\n  //= ===================================================================\n  var isReady = false\n  getDocument().addEventListener('DOMContentLoaded', function() {\n    isReady = true\n  })\n\n  /**\n   * Execute a function now if DOMContentLoaded has fired, otherwise listen for it.\n   *\n   * This function uses isReady because there is no reliable way to ask the browser whether\n   * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded\n   * firing and readystate=complete.\n   */\n  function ready(fn) {\n    // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by\n    // some means other than the initial page load.\n    if (isReady || getDocument().readyState === 'complete') {\n      fn()\n    } else {\n      getDocument().addEventListener('DOMContentLoaded', fn)\n    }\n  }\n\n  function insertIndicatorStyles() {\n    if (htmx.config.includeIndicatorStyles !== false) {\n      const nonceAttribute = htmx.config.inlineStyleNonce ? ` nonce=\"${htmx.config.inlineStyleNonce}\"` : ''\n      const indicator = htmx.config.indicatorClass\n      const request = htmx.config.requestClass\n      getDocument().head.insertAdjacentHTML('beforeend',\n        `<style${nonceAttribute}>` +\n        `.${indicator}{opacity:0;visibility: hidden} ` +\n        `.${request} .${indicator}, .${request}.${indicator}{opacity:1;visibility: visible;transition: opacity 200ms ease-in}` +\n        '</style>'\n      )\n    }\n  }\n\n  function getMetaConfig() {\n    /** @type HTMLMetaElement */\n    const element = getDocument().querySelector('meta[name=\"htmx-config\"]')\n    if (element) {\n      return parseJSON(element.content)\n    } else {\n      return null\n    }\n  }\n\n  function mergeMetaConfig() {\n    const metaConfig = getMetaConfig()\n    if (metaConfig) {\n      htmx.config = mergeObjects(htmx.config, metaConfig)\n    }\n  }\n\n  // initialize the document\n  ready(function() {\n    mergeMetaConfig()\n    insertIndicatorStyles()\n    let body = getDocument().body\n    processNode(body)\n    const restoredElts = getDocument().querySelectorAll(\n      \"[hx-trigger='restored'],[data-hx-trigger='restored']\"\n    )\n    body.addEventListener('htmx:abort', function(evt) {\n      const target = (/** @type {CustomEvent} */(evt)).detail.elt || evt.target\n      const internalData = getInternalData(target)\n      if (internalData && internalData.xhr) {\n        internalData.xhr.abort()\n      }\n    })\n    /** @type {(ev: PopStateEvent) => any} */\n    const originalPopstate = window.onpopstate ? window.onpopstate.bind(window) : null\n    /** @type {(ev: PopStateEvent) => any} */\n    window.onpopstate = function(event) {\n      if (event.state && event.state.htmx) {\n        restoreHistory()\n        forEach(restoredElts, function(elt) {\n          triggerEvent(elt, 'htmx:restored', {\n            document: getDocument(),\n            triggerEvent\n          })\n        })\n      } else {\n        if (originalPopstate) {\n          originalPopstate(event)\n        }\n      }\n    }\n    getWindow().setTimeout(function() {\n      triggerEvent(body, 'htmx:load', {}) // give ready handlers a chance to load up before firing this event\n      body = null // kill reference for gc\n    }, 0)\n  })\n\n  return htmx\n})()\n\n/** @typedef {'get'|'head'|'post'|'put'|'delete'|'connect'|'options'|'trace'|'patch'} HttpVerb */\n\n/**\n * @typedef {Object} SwapOptions\n * @property {string} [select]\n * @property {string} [selectOOB]\n * @property {*} [eventInfo]\n * @property {string} [anchor]\n * @property {Element} [contextElement]\n * @property {swapCallback} [afterSwapCallback]\n * @property {swapCallback} [afterSettleCallback]\n * @property {swapCallback} [beforeSwapCallback]\n * @property {string} [title]\n * @property {boolean} [historyRequest]\n */\n\n/**\n * @callback swapCallback\n */\n\n/**\n * @typedef {'innerHTML' | 'outerHTML' | 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend' | 'delete' | 'none' | string} HtmxSwapStyle\n */\n\n/**\n * @typedef HtmxSwapSpecification\n * @property {HtmxSwapStyle} swapStyle\n * @property {number} swapDelay\n * @property {number} settleDelay\n * @property {boolean} [transition]\n * @property {boolean} [ignoreTitle]\n * @property {string} [head]\n * @property {'top' | 'bottom' | number } [scroll]\n * @property {string} [scrollTarget]\n * @property {string} [show]\n * @property {string} [showTarget]\n * @property {boolean} [focusScroll]\n */\n\n/**\n * @typedef {((this:Node, evt:Event) => boolean) & {source: string}} ConditionalFunction\n */\n\n/**\n * @typedef {Object} HtmxTriggerSpecification\n * @property {string} trigger\n * @property {number} [pollInterval]\n * @property {ConditionalFunction} [eventFilter]\n * @property {boolean} [changed]\n * @property {boolean} [once]\n * @property {boolean} [consume]\n * @property {number} [delay]\n * @property {string} [from]\n * @property {string} [target]\n * @property {number} [throttle]\n * @property {string} [queue]\n * @property {string} [root]\n * @property {string} [threshold]\n */\n\n/**\n * @typedef {{elt: Element, message: string, validity: ValidityState}} HtmxElementValidationError\n */\n\n/**\n * @typedef {Record<string, string>} HtmxHeaderSpecification\n * @property {'true'} HX-Request\n * @property {string|null} HX-Trigger\n * @property {string|null} HX-Trigger-Name\n * @property {string|null} HX-Target\n * @property {string} HX-Current-URL\n * @property {string} [HX-Prompt]\n * @property {'true'} [HX-Boosted]\n * @property {string} [Content-Type]\n * @property {'true'} [HX-History-Restore-Request]\n */\n\n/**\n * @typedef HtmxAjaxHelperContext\n * @property {Element|string} [source]\n * @property {Event} [event]\n * @property {HtmxAjaxHandler} [handler]\n * @property {Element|string} [target]\n * @property {HtmxSwapStyle} [swap]\n * @property {Object|FormData} [values]\n * @property {Record<string,string>} [headers]\n * @property {string} [select]\n * @property {string} [push]\n * @property {string} [replace]\n * @property {string} [selectOOB]\n */\n\n/**\n * @typedef {Object} HtmxRequestConfig\n * @property {boolean} boosted\n * @property {boolean} useUrlParams\n * @property {FormData} formData\n * @property {Object} parameters formData proxy\n * @property {FormData} unfilteredFormData\n * @property {Object} unfilteredParameters unfilteredFormData proxy\n * @property {HtmxHeaderSpecification} headers\n * @property {Element} elt\n * @property {Element} target\n * @property {HttpVerb} verb\n * @property {HtmxElementValidationError[]} errors\n * @property {boolean} withCredentials\n * @property {number} timeout\n * @property {string} path\n * @property {Event} triggeringEvent\n */\n\n/**\n * @typedef {Object} HtmxResponseInfo\n * @property {XMLHttpRequest} xhr\n * @property {Element} target\n * @property {HtmxRequestConfig} requestConfig\n * @property {HtmxAjaxEtc} etc\n * @property {boolean} boosted\n * @property {string} select\n * @property {{requestPath: string, finalRequestPath: string, responsePath: string|null, anchor: string}} pathInfo\n * @property {boolean} [failed]\n * @property {boolean} [successful]\n * @property {boolean} [keepIndicators]\n */\n\n/**\n * @typedef {Object} HtmxAjaxEtc\n * @property {boolean} [returnPromise]\n * @property {HtmxAjaxHandler} [handler]\n * @property {string} [select]\n * @property {Element} [targetOverride]\n * @property {HtmxSwapStyle} [swapOverride]\n * @property {Record<string,string>} [headers]\n * @property {Object|FormData} [values]\n * @property {boolean} [credentials]\n * @property {number} [timeout]\n * @property {string} [push]\n * @property {string} [replace]\n * @property {string} [selectOOB]\n */\n\n/**\n * @typedef {Object} HtmxResponseHandlingConfig\n * @property {string} [code]\n * @property {boolean} swap\n * @property {boolean} [error]\n * @property {boolean} [ignoreTitle]\n * @property {string} [select]\n * @property {string} [target]\n * @property {string} [swapOverride]\n * @property {string} [event]\n */\n\n/**\n * @typedef {HtmxResponseInfo & {shouldSwap: boolean, serverResponse: any, isError: boolean, ignoreTitle: boolean, selectOverride:string, swapOverride:string}} HtmxBeforeSwapDetails\n */\n\n/**\n * @callback HtmxAjaxHandler\n * @param {Element} elt\n * @param {HtmxResponseInfo} responseInfo\n */\n\n/**\n * @typedef {(() => void)} HtmxSettleTask\n */\n\n/**\n * @typedef {Object} HtmxSettleInfo\n * @property {HtmxSettleTask[]} tasks\n * @property {Element[]} elts\n * @property {string} [title]\n */\n\n/**\n * @see https://github.com/bigskysoftware/htmx-extensions/blob/main/README.md\n * @typedef {Object} HtmxExtension\n * @property {(api: any) => void} init\n * @property {(name: string, event: CustomEvent) => boolean} onEvent\n * @property {(text: string, xhr: XMLHttpRequest, elt: Element) => string} transformResponse\n * @property {(swapStyle: HtmxSwapStyle) => boolean} isInlineSwap\n * @property {(swapStyle: HtmxSwapStyle, target: Node, fragment: Node, settleInfo: HtmxSettleInfo) => boolean|Node[]} handleSwap\n * @property {(xhr: XMLHttpRequest, parameters: FormData, elt: Node) => *|string|null} encodeParameters\n * @property {() => string[]|null} getSelectors\n */\nexport default htmx\n", "// packages/alpinejs/src/scheduler.js\nvar flushPending = false;\nvar flushing = false;\nvar queue = [];\nvar lastFlushedIndex = -1;\nvar transactionActive = false;\nfunction scheduler(callback) {\n  queueJob(callback);\n}\nfunction startTransaction() {\n  transactionActive = true;\n}\nfunction commitTransaction() {\n  transactionActive = false;\n  queueFlush();\n}\nfunction queueJob(job) {\n  if (!queue.includes(job))\n    queue.push(job);\n  queueFlush();\n}\nfunction dequeueJob(job) {\n  let index = queue.indexOf(job);\n  if (index !== -1 && index > lastFlushedIndex)\n    queue.splice(index, 1);\n}\nfunction queueFlush() {\n  if (!flushing && !flushPending) {\n    if (transactionActive)\n      return;\n    flushPending = true;\n    queueMicrotask(flushJobs);\n  }\n}\nfunction flushJobs() {\n  flushPending = false;\n  flushing = true;\n  for (let i = 0; i < queue.length; i++) {\n    queue[i]();\n    lastFlushedIndex = i;\n  }\n  queue.length = 0;\n  lastFlushedIndex = -1;\n  flushing = false;\n}\n\n// packages/alpinejs/src/reactivity.js\nvar reactive;\nvar effect;\nvar release;\nvar raw;\nvar shouldSchedule = true;\nfunction disableEffectScheduling(callback) {\n  shouldSchedule = false;\n  callback();\n  shouldSchedule = true;\n}\nfunction setReactivityEngine(engine) {\n  reactive = engine.reactive;\n  release = engine.release;\n  effect = (callback) => engine.effect(callback, { scheduler: (task) => {\n    if (shouldSchedule) {\n      scheduler(task);\n    } else {\n      task();\n    }\n  } });\n  raw = engine.raw;\n}\nfunction overrideEffect(override) {\n  effect = override;\n}\nfunction elementBoundEffect(el) {\n  let cleanup2 = () => {\n  };\n  let wrappedEffect = (callback) => {\n    let effectReference = effect(callback);\n    if (!el._x_effects) {\n      el._x_effects = /* @__PURE__ */ new Set();\n      el._x_runEffects = () => {\n        el._x_effects.forEach((i) => i());\n      };\n    }\n    el._x_effects.add(effectReference);\n    cleanup2 = () => {\n      if (effectReference === void 0)\n        return;\n      el._x_effects.delete(effectReference);\n      release(effectReference);\n    };\n    return effectReference;\n  };\n  return [wrappedEffect, () => {\n    cleanup2();\n  }];\n}\nfunction watch(getter, callback) {\n  let firstTime = true;\n  let oldValue;\n  let oldValueJSON;\n  let effectReference = effect(() => {\n    let value = getter();\n    let newJSON = JSON.stringify(value);\n    if (!firstTime) {\n      if (typeof value === \"object\" || value !== oldValue) {\n        let previousValue = typeof oldValue === \"object\" ? JSON.parse(oldValueJSON) : oldValue;\n        queueMicrotask(() => {\n          callback(value, previousValue);\n        });\n      }\n    }\n    oldValue = value;\n    oldValueJSON = newJSON;\n    firstTime = false;\n  });\n  return () => release(effectReference);\n}\nasync function transaction(callback) {\n  startTransaction();\n  try {\n    await callback();\n    await Promise.resolve();\n  } finally {\n    commitTransaction();\n  }\n}\n\n// packages/alpinejs/src/mutation.js\nvar onAttributeAddeds = [];\nvar onElRemoveds = [];\nvar onElAddeds = [];\nfunction onElAdded(callback) {\n  onElAddeds.push(callback);\n}\nfunction onElRemoved(el, callback) {\n  if (typeof callback === \"function\") {\n    if (!el._x_cleanups)\n      el._x_cleanups = [];\n    el._x_cleanups.push(callback);\n  } else {\n    callback = el;\n    onElRemoveds.push(callback);\n  }\n}\nfunction onAttributesAdded(callback) {\n  onAttributeAddeds.push(callback);\n}\nfunction onAttributeRemoved(el, name, callback) {\n  if (!el._x_attributeCleanups)\n    el._x_attributeCleanups = {};\n  if (!el._x_attributeCleanups[name])\n    el._x_attributeCleanups[name] = [];\n  el._x_attributeCleanups[name].push(callback);\n}\nfunction cleanupAttributes(el, names) {\n  if (!el._x_attributeCleanups)\n    return;\n  Object.entries(el._x_attributeCleanups).forEach(([name, value]) => {\n    if (names === void 0 || names.includes(name)) {\n      value.forEach((i) => i());\n      delete el._x_attributeCleanups[name];\n    }\n  });\n}\nfunction cleanupElement(el) {\n  el._x_effects?.forEach(dequeueJob);\n  while (el._x_cleanups?.length)\n    el._x_cleanups.pop()();\n}\nvar observer = new MutationObserver(onMutate);\nvar currentlyObserving = false;\nfunction startObservingMutations() {\n  observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n  currentlyObserving = true;\n}\nfunction stopObservingMutations() {\n  flushObserver();\n  observer.disconnect();\n  currentlyObserving = false;\n}\nvar queuedMutations = [];\nfunction flushObserver() {\n  let records = observer.takeRecords();\n  queuedMutations.push(() => records.length > 0 && onMutate(records));\n  let queueLengthWhenTriggered = queuedMutations.length;\n  queueMicrotask(() => {\n    if (queuedMutations.length === queueLengthWhenTriggered) {\n      while (queuedMutations.length > 0)\n        queuedMutations.shift()();\n    }\n  });\n}\nfunction mutateDom(callback) {\n  if (!currentlyObserving)\n    return callback();\n  stopObservingMutations();\n  let result = callback();\n  startObservingMutations();\n  return result;\n}\nvar isCollecting = false;\nvar deferredMutations = [];\nfunction deferMutations() {\n  isCollecting = true;\n}\nfunction flushAndStopDeferringMutations() {\n  isCollecting = false;\n  onMutate(deferredMutations);\n  deferredMutations = [];\n}\nfunction onMutate(mutations) {\n  if (isCollecting) {\n    deferredMutations = deferredMutations.concat(mutations);\n    return;\n  }\n  let addedNodes = [];\n  let removedNodes = /* @__PURE__ */ new Set();\n  let addedAttributes = /* @__PURE__ */ new Map();\n  let removedAttributes = /* @__PURE__ */ new Map();\n  for (let i = 0; i < mutations.length; i++) {\n    if (mutations[i].target._x_ignoreMutationObserver)\n      continue;\n    if (mutations[i].type === \"childList\") {\n      mutations[i].removedNodes.forEach((node) => {\n        if (node.nodeType !== 1)\n          return;\n        if (!node._x_marker)\n          return;\n        removedNodes.add(node);\n      });\n      mutations[i].addedNodes.forEach((node) => {\n        if (node.nodeType !== 1)\n          return;\n        if (removedNodes.has(node)) {\n          removedNodes.delete(node);\n          return;\n        }\n        if (node._x_marker)\n          return;\n        addedNodes.push(node);\n      });\n    }\n    if (mutations[i].type === \"attributes\") {\n      let el = mutations[i].target;\n      let name = mutations[i].attributeName;\n      let oldValue = mutations[i].oldValue;\n      let add2 = () => {\n        if (!addedAttributes.has(el))\n          addedAttributes.set(el, []);\n        addedAttributes.get(el).push({ name, value: el.getAttribute(name) });\n      };\n      let remove = () => {\n        if (!removedAttributes.has(el))\n          removedAttributes.set(el, []);\n        removedAttributes.get(el).push(name);\n      };\n      if (el.hasAttribute(name) && oldValue === null) {\n        add2();\n      } else if (el.hasAttribute(name)) {\n        remove();\n        add2();\n      } else {\n        remove();\n      }\n    }\n  }\n  removedAttributes.forEach((attrs, el) => {\n    cleanupAttributes(el, attrs);\n  });\n  addedAttributes.forEach((attrs, el) => {\n    onAttributeAddeds.forEach((i) => i(el, attrs));\n  });\n  for (let node of removedNodes) {\n    if (addedNodes.some((i) => i.contains(node)))\n      continue;\n    onElRemoveds.forEach((i) => i(node));\n  }\n  for (let node of addedNodes) {\n    if (!node.isConnected)\n      continue;\n    onElAddeds.forEach((i) => i(node));\n  }\n  addedNodes = null;\n  removedNodes = null;\n  addedAttributes = null;\n  removedAttributes = null;\n}\n\n// packages/alpinejs/src/scope.js\nfunction scope(node) {\n  return mergeProxies(closestDataStack(node));\n}\nfunction addScopeToNode(node, data2, referenceNode) {\n  node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)];\n  return () => {\n    node._x_dataStack = node._x_dataStack.filter((i) => i !== data2);\n  };\n}\nfunction closestDataStack(node) {\n  if (node._x_dataStack)\n    return node._x_dataStack;\n  if (typeof ShadowRoot === \"function\" && node instanceof ShadowRoot) {\n    return closestDataStack(node.host);\n  }\n  if (!node.parentNode) {\n    return [];\n  }\n  return closestDataStack(node.parentNode);\n}\nfunction mergeProxies(objects) {\n  return new Proxy({ objects }, mergeProxyTrap);\n}\nfunction keyInPrototypeChain(obj, key) {\n  if (obj === null || obj === Object.prototype)\n    return null;\n  if (Object.prototype.hasOwnProperty.call(obj, key))\n    return obj;\n  return keyInPrototypeChain(Object.getPrototypeOf(obj), key);\n}\nvar mergeProxyTrap = {\n  ownKeys({ objects }) {\n    return Array.from(\n      new Set(objects.flatMap((i) => Object.keys(i)))\n    );\n  },\n  has({ objects }, name) {\n    if (name == Symbol.unscopables)\n      return false;\n    return objects.some(\n      (obj) => Object.prototype.hasOwnProperty.call(obj, name) || Reflect.has(obj, name)\n    );\n  },\n  get({ objects }, name, thisProxy) {\n    if (name == \"toJSON\")\n      return collapseProxies;\n    return Reflect.get(\n      objects.find(\n        (obj) => Reflect.has(obj, name)\n      ) || {},\n      name,\n      thisProxy\n    );\n  },\n  set({ objects }, name, value, thisProxy) {\n    let target;\n    for (const obj of objects) {\n      target = keyInPrototypeChain(obj, name);\n      if (target)\n        break;\n    }\n    if (!target)\n      target = objects[objects.length - 1];\n    const descriptor = Object.getOwnPropertyDescriptor(target, name);\n    if (descriptor?.set && descriptor?.get)\n      return descriptor.set.call(thisProxy, value) || true;\n    return Reflect.set(target, name, value);\n  }\n};\nfunction collapseProxies() {\n  let keys = Reflect.ownKeys(this);\n  return keys.reduce((acc, key) => {\n    acc[key] = Reflect.get(this, key);\n    return acc;\n  }, {});\n}\n\n// packages/alpinejs/src/interceptor.js\nfunction initInterceptors(data2) {\n  let isObject3 = (val) => typeof val === \"object\" && !Array.isArray(val) && val !== null;\n  let recurse = (obj, basePath = \"\") => {\n    Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => {\n      if (enumerable === false || value === void 0)\n        return;\n      if (typeof value === \"object\" && value !== null && value.__v_skip)\n        return;\n      let path = basePath === \"\" ? key : `${basePath}.${key}`;\n      if (typeof value === \"object\" && value !== null && value._x_interceptor) {\n        obj[key] = value.initialize(data2, path, key);\n      } else {\n        if (isObject3(value) && value !== obj && !(value instanceof Element)) {\n          recurse(value, path);\n        }\n      }\n    });\n  };\n  return recurse(data2);\n}\nfunction interceptor(callback, mutateObj = () => {\n}) {\n  let obj = {\n    initialValue: void 0,\n    _x_interceptor: true,\n    initialize(data2, path, key) {\n      return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key);\n    }\n  };\n  mutateObj(obj);\n  return (initialValue) => {\n    if (typeof initialValue === \"object\" && initialValue !== null && initialValue._x_interceptor) {\n      let initialize = obj.initialize.bind(obj);\n      obj.initialize = (data2, path, key) => {\n        let innerValue = initialValue.initialize(data2, path, key);\n        obj.initialValue = innerValue;\n        return initialize(data2, path, key);\n      };\n    } else {\n      obj.initialValue = initialValue;\n    }\n    return obj;\n  };\n}\nfunction get(obj, path) {\n  return path.split(\".\").reduce((carry, segment) => carry[segment], obj);\n}\nfunction set(obj, path, value) {\n  if (typeof path === \"string\")\n    path = path.split(\".\");\n  if (path.length === 1)\n    obj[path[0]] = value;\n  else if (path.length === 0)\n    throw error;\n  else {\n    if (obj[path[0]])\n      return set(obj[path[0]], path.slice(1), value);\n    else {\n      obj[path[0]] = {};\n      return set(obj[path[0]], path.slice(1), value);\n    }\n  }\n}\n\n// packages/alpinejs/src/magics.js\nvar magics = {};\nfunction magic(name, callback) {\n  magics[name] = callback;\n}\nfunction injectMagics(obj, el) {\n  let memoizedUtilities = getUtilities(el);\n  Object.entries(magics).forEach(([name, callback]) => {\n    Object.defineProperty(obj, `$${name}`, {\n      get() {\n        return callback(el, memoizedUtilities);\n      },\n      enumerable: false\n    });\n  });\n  return obj;\n}\nfunction getUtilities(el) {\n  let [utilities, cleanup2] = getElementBoundUtilities(el);\n  let utils = { interceptor, ...utilities };\n  onElRemoved(el, cleanup2);\n  return utils;\n}\n\n// packages/alpinejs/src/utils/error.js\nfunction tryCatch(el, expression, callback, ...args) {\n  try {\n    return callback(...args);\n  } catch (e) {\n    handleError(e, el, expression);\n  }\n}\nfunction handleError(...args) {\n  return errorHandler(...args);\n}\nvar errorHandler = normalErrorHandler;\nfunction setErrorHandler(handler4) {\n  errorHandler = handler4;\n}\nfunction normalErrorHandler(error2, el, expression = void 0) {\n  error2 = Object.assign(\n    error2 ?? { message: \"No error message given.\" },\n    { el, expression }\n  );\n  console.warn(`Alpine Expression Error: ${error2.message}\n\n${expression ? 'Expression: \"' + expression + '\"\\n\\n' : \"\"}`, el);\n  setTimeout(() => {\n    throw error2;\n  }, 0);\n}\n\n// packages/alpinejs/src/evaluator.js\nvar shouldAutoEvaluateFunctions = true;\nfunction dontAutoEvaluateFunctions(callback) {\n  let cache = shouldAutoEvaluateFunctions;\n  shouldAutoEvaluateFunctions = false;\n  let result = callback();\n  shouldAutoEvaluateFunctions = cache;\n  return result;\n}\nfunction evaluate(el, expression, extras = {}) {\n  let result;\n  evaluateLater(el, expression)((value) => result = value, extras);\n  return result;\n}\nfunction evaluateLater(...args) {\n  return theEvaluatorFunction(...args);\n}\nvar theEvaluatorFunction = () => {\n};\nfunction setEvaluator(newEvaluator) {\n  theEvaluatorFunction = newEvaluator;\n}\nvar theRawEvaluatorFunction;\nfunction setRawEvaluator(newEvaluator) {\n  theRawEvaluatorFunction = newEvaluator;\n}\nfunction normalEvaluator(el, expression) {\n  let overriddenMagics = {};\n  injectMagics(overriddenMagics, el);\n  let dataStack = [overriddenMagics, ...closestDataStack(el)];\n  let evaluator = typeof expression === \"function\" ? generateEvaluatorFromFunction(dataStack, expression) : generateEvaluatorFromString(dataStack, expression, el);\n  return tryCatch.bind(null, el, expression, evaluator);\n}\nfunction generateEvaluatorFromFunction(dataStack, func) {\n  return (receiver = () => {\n  }, { scope: scope2 = {}, params = [], context } = {}) => {\n    if (!shouldAutoEvaluateFunctions) {\n      runIfTypeOfFunction(receiver, func, mergeProxies([scope2, ...dataStack]), params);\n      return;\n    }\n    let result = func.apply(mergeProxies([scope2, ...dataStack]), params);\n    runIfTypeOfFunction(receiver, result);\n  };\n}\nvar evaluatorMemo = {};\nfunction generateFunctionFromString(expression, el) {\n  if (evaluatorMemo[expression]) {\n    return evaluatorMemo[expression];\n  }\n  let AsyncFunction = Object.getPrototypeOf(async function() {\n  }).constructor;\n  let rightSideSafeExpression = /^[\\n\\s]*if.*\\(.*\\)/.test(expression.trim()) || /^(let|const)\\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;\n  const safeAsyncFunction = () => {\n    try {\n      let func2 = new AsyncFunction(\n        [\"__self\", \"scope\"],\n        `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`\n      );\n      Object.defineProperty(func2, \"name\", {\n        value: `[Alpine] ${expression}`\n      });\n      return func2;\n    } catch (error2) {\n      handleError(error2, el, expression);\n      return Promise.resolve();\n    }\n  };\n  let func = safeAsyncFunction();\n  evaluatorMemo[expression] = func;\n  return func;\n}\nfunction generateEvaluatorFromString(dataStack, expression, el) {\n  let func = generateFunctionFromString(expression, el);\n  return (receiver = () => {\n  }, { scope: scope2 = {}, params = [], context } = {}) => {\n    func.result = void 0;\n    func.finished = false;\n    let completeScope = mergeProxies([scope2, ...dataStack]);\n    if (typeof func === \"function\") {\n      let promise = func.call(context, func, completeScope).catch((error2) => handleError(error2, el, expression));\n      if (func.finished) {\n        runIfTypeOfFunction(receiver, func.result, completeScope, params, el);\n        func.result = void 0;\n      } else {\n        promise.then((result) => {\n          runIfTypeOfFunction(receiver, result, completeScope, params, el);\n        }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0);\n      }\n    }\n  };\n}\nfunction runIfTypeOfFunction(receiver, value, scope2, params, el) {\n  if (shouldAutoEvaluateFunctions && typeof value === \"function\") {\n    let result = value.apply(scope2, params);\n    if (result instanceof Promise) {\n      result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value));\n    } else {\n      receiver(result);\n    }\n  } else if (typeof value === \"object\" && value instanceof Promise) {\n    value.then((i) => receiver(i));\n  } else {\n    receiver(value);\n  }\n}\nfunction evaluateRaw(...args) {\n  return theRawEvaluatorFunction(...args);\n}\nfunction normalRawEvaluator(el, expression, extras = {}) {\n  let overriddenMagics = {};\n  injectMagics(overriddenMagics, el);\n  let dataStack = [overriddenMagics, ...closestDataStack(el)];\n  let scope2 = mergeProxies([extras.scope ?? {}, ...dataStack]);\n  let params = extras.params ?? [];\n  if (expression.includes(\"await\")) {\n    let AsyncFunction = Object.getPrototypeOf(async function() {\n    }).constructor;\n    let rightSideSafeExpression = /^[\\n\\s]*if.*\\(.*\\)/.test(expression.trim()) || /^(let|const)\\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;\n    let func = new AsyncFunction(\n      [\"scope\"],\n      `with (scope) { let __result = ${rightSideSafeExpression}; return __result }`\n    );\n    let result = func.call(extras.context, scope2);\n    return result;\n  } else {\n    let rightSideSafeExpression = /^[\\n\\s]*if.*\\(.*\\)/.test(expression.trim()) || /^(let|const)\\s/.test(expression.trim()) ? `(()=>{ ${expression} })()` : expression;\n    let func = new Function(\n      [\"scope\"],\n      `with (scope) { let __result = ${rightSideSafeExpression}; return __result }`\n    );\n    let result = func.call(extras.context, scope2);\n    if (typeof result === \"function\" && shouldAutoEvaluateFunctions) {\n      return result.apply(scope2, params);\n    }\n    return result;\n  }\n}\n\n// packages/alpinejs/src/directives.js\nvar prefixAsString = \"x-\";\nfunction prefix(subject = \"\") {\n  return prefixAsString + subject;\n}\nfunction setPrefix(newPrefix) {\n  prefixAsString = newPrefix;\n}\nvar directiveHandlers = {};\nfunction directive(name, callback) {\n  directiveHandlers[name] = callback;\n  return {\n    before(directive2) {\n      if (!directiveHandlers[directive2]) {\n        console.warn(String.raw`Cannot find directive \\`${directive2}\\`. \\`${name}\\` will use the default order of execution`);\n        return;\n      }\n      const pos = directiveOrder.indexOf(directive2);\n      directiveOrder.splice(pos >= 0 ? pos : directiveOrder.indexOf(\"DEFAULT\"), 0, name);\n    }\n  };\n}\nfunction directiveExists(name) {\n  return Object.keys(directiveHandlers).includes(name);\n}\nfunction directives(el, attributes, originalAttributeOverride) {\n  attributes = Array.from(attributes);\n  if (el._x_virtualDirectives) {\n    let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value }));\n    let staticAttributes = attributesOnly(vAttributes);\n    vAttributes = vAttributes.map((attribute) => {\n      if (staticAttributes.find((attr) => attr.name === attribute.name)) {\n        return {\n          name: `x-bind:${attribute.name}`,\n          value: `\"${attribute.value}\"`\n        };\n      }\n      return attribute;\n    });\n    attributes = attributes.concat(vAttributes);\n  }\n  let transformedAttributeMap = {};\n  let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority);\n  return directives2.map((directive2) => {\n    return getDirectiveHandler(el, directive2);\n  });\n}\nfunction attributesOnly(attributes) {\n  return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr));\n}\nvar isDeferringHandlers = false;\nvar directiveHandlerStacks = /* @__PURE__ */ new Map();\nvar currentHandlerStackKey = Symbol();\nfunction deferHandlingDirectives(callback) {\n  isDeferringHandlers = true;\n  let key = Symbol();\n  currentHandlerStackKey = key;\n  directiveHandlerStacks.set(key, []);\n  let flushHandlers = () => {\n    while (directiveHandlerStacks.get(key).length)\n      directiveHandlerStacks.get(key).shift()();\n    directiveHandlerStacks.delete(key);\n  };\n  let stopDeferring = () => {\n    isDeferringHandlers = false;\n    flushHandlers();\n  };\n  callback(flushHandlers);\n  stopDeferring();\n}\nfunction getElementBoundUtilities(el) {\n  let cleanups = [];\n  let cleanup2 = (callback) => cleanups.push(callback);\n  let [effect3, cleanupEffect] = elementBoundEffect(el);\n  cleanups.push(cleanupEffect);\n  let utilities = {\n    Alpine: alpine_default,\n    effect: effect3,\n    cleanup: cleanup2,\n    evaluateLater: evaluateLater.bind(evaluateLater, el),\n    evaluate: evaluate.bind(evaluate, el)\n  };\n  let doCleanup = () => cleanups.forEach((i) => i());\n  return [utilities, doCleanup];\n}\nfunction getDirectiveHandler(el, directive2) {\n  let noop = () => {\n  };\n  let handler4 = directiveHandlers[directive2.type] || noop;\n  let [utilities, cleanup2] = getElementBoundUtilities(el);\n  onAttributeRemoved(el, directive2.original, cleanup2);\n  let fullHandler = () => {\n    if (el._x_ignore || el._x_ignoreSelf)\n      return;\n    handler4.inline && handler4.inline(el, directive2, utilities);\n    handler4 = handler4.bind(handler4, el, directive2, utilities);\n    isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler4) : handler4();\n  };\n  fullHandler.runCleanups = cleanup2;\n  return fullHandler;\n}\nvar startingWith = (subject, replacement) => ({ name, value }) => {\n  if (name.startsWith(subject))\n    name = name.replace(subject, replacement);\n  return { name, value };\n};\nvar into = (i) => i;\nfunction toTransformedAttributes(callback = () => {\n}) {\n  return ({ name, value }) => {\n    let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => {\n      return transform(carry);\n    }, { name, value });\n    if (newName !== name)\n      callback(newName, name);\n    return { name: newName, value: newValue };\n  };\n}\nvar attributeTransformers = [];\nfunction mapAttributes(callback) {\n  attributeTransformers.push(callback);\n}\nfunction outNonAlpineAttributes({ name }) {\n  return alpineAttributeRegex().test(name);\n}\nvar alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\\\b`);\nfunction toParsedDirectives(transformedAttributeMap, originalAttributeOverride) {\n  return ({ name, value }) => {\n    if (name === value)\n      value = \"\";\n    let typeMatch = name.match(alpineAttributeRegex());\n    let valueMatch = name.match(/:([a-zA-Z0-9\\-_:]+)/);\n    let modifiers = name.match(/\\.[^.\\]]+(?=[^\\]]*$)/g) || [];\n    let original = originalAttributeOverride || transformedAttributeMap[name] || name;\n    return {\n      type: typeMatch ? typeMatch[1] : null,\n      value: valueMatch ? valueMatch[1] : null,\n      modifiers: modifiers.map((i) => i.replace(\".\", \"\")),\n      expression: value,\n      original\n    };\n  };\n}\nvar DEFAULT = \"DEFAULT\";\nvar directiveOrder = [\n  \"ignore\",\n  \"ref\",\n  \"id\",\n  \"data\",\n  \"anchor\",\n  \"bind\",\n  \"init\",\n  \"for\",\n  \"model\",\n  \"modelable\",\n  \"transition\",\n  \"show\",\n  \"if\",\n  DEFAULT,\n  \"teleport\"\n];\nfunction byPriority(a, b) {\n  let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type;\n  let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type;\n  return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB);\n}\n\n// packages/alpinejs/src/utils/dispatch.js\nfunction dispatch(el, name, detail = {}, options = {}) {\n  return el.dispatchEvent(\n    new CustomEvent(name, {\n      detail,\n      bubbles: true,\n      // Allows events to pass the shadow DOM barrier.\n      composed: true,\n      cancelable: true,\n      // Allows overriding the default event options.\n      ...options\n    })\n  );\n}\n\n// packages/alpinejs/src/utils/walk.js\nfunction walk(el, callback) {\n  if (typeof ShadowRoot === \"function\" && el instanceof ShadowRoot) {\n    Array.from(el.children).forEach((el2) => walk(el2, callback));\n    return;\n  }\n  let skip = false;\n  callback(el, () => skip = true);\n  if (skip)\n    return;\n  let node = el.firstElementChild;\n  while (node) {\n    walk(node, callback, false);\n    node = node.nextElementSibling;\n  }\n}\n\n// packages/alpinejs/src/utils/warn.js\nfunction warn(message, ...args) {\n  console.warn(`Alpine Warning: ${message}`, ...args);\n}\n\n// packages/alpinejs/src/lifecycle.js\nvar started = false;\nfunction start() {\n  if (started)\n    warn(\"Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems.\");\n  started = true;\n  if (!document.body)\n    warn(\"Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?\");\n  dispatch(document, \"alpine:init\");\n  dispatch(document, \"alpine:initializing\");\n  startObservingMutations();\n  onElAdded((el) => initTree(el, walk));\n  onElRemoved((el) => destroyTree(el));\n  onAttributesAdded((el, attrs) => {\n    directives(el, attrs).forEach((handle) => handle());\n  });\n  let outNestedComponents = (el) => !closestRoot(el.parentElement, true);\n  Array.from(document.querySelectorAll(allSelectors().join(\",\"))).filter(outNestedComponents).forEach((el) => {\n    initTree(el);\n  });\n  dispatch(document, \"alpine:initialized\");\n  setTimeout(() => {\n    warnAboutMissingPlugins();\n  });\n}\nvar rootSelectorCallbacks = [];\nvar initSelectorCallbacks = [];\nfunction rootSelectors() {\n  return rootSelectorCallbacks.map((fn) => fn());\n}\nfunction allSelectors() {\n  return rootSelectorCallbacks.concat(initSelectorCallbacks).map((fn) => fn());\n}\nfunction addRootSelector(selectorCallback) {\n  rootSelectorCallbacks.push(selectorCallback);\n}\nfunction addInitSelector(selectorCallback) {\n  initSelectorCallbacks.push(selectorCallback);\n}\nfunction closestRoot(el, includeInitSelectors = false) {\n  return findClosest(el, (element) => {\n    const selectors = includeInitSelectors ? allSelectors() : rootSelectors();\n    if (selectors.some((selector) => element.matches(selector)))\n      return true;\n  });\n}\nfunction findClosest(el, callback) {\n  if (!el)\n    return;\n  if (callback(el))\n    return el;\n  if (el._x_teleportBack)\n    return findClosest(el._x_teleportBack, callback);\n  if (el.parentNode instanceof ShadowRoot) {\n    return findClosest(el.parentNode.host, callback);\n  }\n  if (!el.parentElement)\n    return;\n  return findClosest(el.parentElement, callback);\n}\nfunction isRoot(el) {\n  return rootSelectors().some((selector) => el.matches(selector));\n}\nvar initInterceptors2 = [];\nfunction interceptInit(callback) {\n  initInterceptors2.push(callback);\n}\nvar markerDispenser = 1;\nfunction initTree(el, walker = walk, intercept = () => {\n}) {\n  if (findClosest(el, (i) => i._x_ignore))\n    return;\n  deferHandlingDirectives(() => {\n    walker(el, (el2, skip) => {\n      if (el2._x_marker)\n        return;\n      intercept(el2, skip);\n      initInterceptors2.forEach((i) => i(el2, skip));\n      directives(el2, el2.attributes).forEach((handle) => handle());\n      if (!el2._x_ignore)\n        el2._x_marker = markerDispenser++;\n      el2._x_ignore && skip();\n    });\n  });\n}\nfunction destroyTree(root, walker = walk) {\n  walker(root, (el) => {\n    cleanupElement(el);\n    cleanupAttributes(el);\n    delete el._x_marker;\n  });\n}\nfunction warnAboutMissingPlugins() {\n  let pluginDirectives = [\n    [\"ui\", \"dialog\", [\"[x-dialog], [x-popover]\"]],\n    [\"anchor\", \"anchor\", [\"[x-anchor]\"]],\n    [\"sort\", \"sort\", [\"[x-sort]\"]]\n  ];\n  pluginDirectives.forEach(([plugin2, directive2, selectors]) => {\n    if (directiveExists(directive2))\n      return;\n    selectors.some((selector) => {\n      if (document.querySelector(selector)) {\n        warn(`found \"${selector}\", but missing ${plugin2} plugin`);\n        return true;\n      }\n    });\n  });\n}\n\n// packages/alpinejs/src/nextTick.js\nvar tickStack = [];\nvar isHolding = false;\nfunction nextTick(callback = () => {\n}) {\n  queueMicrotask(() => {\n    isHolding || setTimeout(() => {\n      releaseNextTicks();\n    });\n  });\n  return new Promise((res) => {\n    tickStack.push(() => {\n      callback();\n      res();\n    });\n  });\n}\nfunction releaseNextTicks() {\n  isHolding = false;\n  while (tickStack.length)\n    tickStack.shift()();\n}\nfunction holdNextTicks() {\n  isHolding = true;\n}\n\n// packages/alpinejs/src/utils/classes.js\nfunction setClasses(el, value) {\n  if (Array.isArray(value)) {\n    return setClassesFromString(el, value.join(\" \"));\n  } else if (typeof value === \"object\" && value !== null) {\n    return setClassesFromObject(el, value);\n  } else if (typeof value === \"function\") {\n    return setClasses(el, value());\n  }\n  return setClassesFromString(el, value);\n}\nfunction splitClasses(classString) {\n  return classString.split(/\\s/).filter(Boolean);\n}\nfunction setClassesFromString(el, classString) {\n  let missingClasses = (classString2) => splitClasses(classString2).filter((i) => !el.classList.contains(i)).filter(Boolean);\n  let addClassesAndReturnUndo = (classes) => {\n    el.classList.add(...classes);\n    return () => {\n      el.classList.remove(...classes);\n    };\n  };\n  classString = classString === true ? classString = \"\" : classString || \"\";\n  return addClassesAndReturnUndo(missingClasses(classString));\n}\nfunction setClassesFromObject(el, classObject) {\n  let forAdd = Object.entries(classObject).flatMap(([classString, bool]) => bool ? splitClasses(classString) : false).filter(Boolean);\n  let forRemove = Object.entries(classObject).flatMap(([classString, bool]) => !bool ? splitClasses(classString) : false).filter(Boolean);\n  let added = [];\n  let removed = [];\n  forRemove.forEach((i) => {\n    if (el.classList.contains(i)) {\n      el.classList.remove(i);\n      removed.push(i);\n    }\n  });\n  forAdd.forEach((i) => {\n    if (!el.classList.contains(i)) {\n      el.classList.add(i);\n      added.push(i);\n    }\n  });\n  return () => {\n    removed.forEach((i) => el.classList.add(i));\n    added.forEach((i) => el.classList.remove(i));\n  };\n}\n\n// packages/alpinejs/src/utils/styles.js\nfunction setStyles(el, value) {\n  if (typeof value === \"object\" && value !== null) {\n    return setStylesFromObject(el, value);\n  }\n  return setStylesFromString(el, value);\n}\nfunction setStylesFromObject(el, value) {\n  let previousStyles = {};\n  Object.entries(value).forEach(([key, value2]) => {\n    previousStyles[key] = el.style[key];\n    if (!key.startsWith(\"--\")) {\n      key = kebabCase(key);\n    }\n    el.style.setProperty(key, value2);\n  });\n  setTimeout(() => {\n    if (el.style.length === 0) {\n      el.removeAttribute(\"style\");\n    }\n  });\n  return () => {\n    setStyles(el, previousStyles);\n  };\n}\nfunction setStylesFromString(el, value) {\n  let cache = el.getAttribute(\"style\", value);\n  el.setAttribute(\"style\", value);\n  return () => {\n    el.setAttribute(\"style\", cache || \"\");\n  };\n}\nfunction kebabCase(subject) {\n  return subject.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\n// packages/alpinejs/src/utils/once.js\nfunction once(callback, fallback = () => {\n}) {\n  let called = false;\n  return function() {\n    if (!called) {\n      called = true;\n      callback.apply(this, arguments);\n    } else {\n      fallback.apply(this, arguments);\n    }\n  };\n}\n\n// packages/alpinejs/src/directives/x-transition.js\ndirective(\"transition\", (el, { value, modifiers, expression }, { evaluate: evaluate2 }) => {\n  if (typeof expression === \"function\")\n    expression = evaluate2(expression);\n  if (expression === false)\n    return;\n  if (!expression || typeof expression === \"boolean\") {\n    registerTransitionsFromHelper(el, modifiers, value);\n  } else {\n    registerTransitionsFromClassString(el, expression, value);\n  }\n});\nfunction registerTransitionsFromClassString(el, classString, stage) {\n  registerTransitionObject(el, setClasses, \"\");\n  let directiveStorageMap = {\n    \"enter\": (classes) => {\n      el._x_transition.enter.during = classes;\n    },\n    \"enter-start\": (classes) => {\n      el._x_transition.enter.start = classes;\n    },\n    \"enter-end\": (classes) => {\n      el._x_transition.enter.end = classes;\n    },\n    \"leave\": (classes) => {\n      el._x_transition.leave.during = classes;\n    },\n    \"leave-start\": (classes) => {\n      el._x_transition.leave.start = classes;\n    },\n    \"leave-end\": (classes) => {\n      el._x_transition.leave.end = classes;\n    }\n  };\n  directiveStorageMap[stage](classString);\n}\nfunction registerTransitionsFromHelper(el, modifiers, stage) {\n  registerTransitionObject(el, setStyles);\n  let doesntSpecify = !modifiers.includes(\"in\") && !modifiers.includes(\"out\") && !stage;\n  let transitioningIn = doesntSpecify || modifiers.includes(\"in\") || [\"enter\"].includes(stage);\n  let transitioningOut = doesntSpecify || modifiers.includes(\"out\") || [\"leave\"].includes(stage);\n  if (modifiers.includes(\"in\") && !doesntSpecify) {\n    modifiers = modifiers.filter((i, index) => index < modifiers.indexOf(\"out\"));\n  }\n  if (modifiers.includes(\"out\") && !doesntSpecify) {\n    modifiers = modifiers.filter((i, index) => index > modifiers.indexOf(\"out\"));\n  }\n  let wantsAll = !modifiers.includes(\"opacity\") && !modifiers.includes(\"scale\");\n  let wantsOpacity = wantsAll || modifiers.includes(\"opacity\");\n  let wantsScale = wantsAll || modifiers.includes(\"scale\");\n  let opacityValue = wantsOpacity ? 0 : 1;\n  let scaleValue = wantsScale ? modifierValue(modifiers, \"scale\", 95) / 100 : 1;\n  let delay = modifierValue(modifiers, \"delay\", 0) / 1e3;\n  let origin = modifierValue(modifiers, \"origin\", \"center\");\n  let property = \"opacity, transform\";\n  let durationIn = modifierValue(modifiers, \"duration\", 150) / 1e3;\n  let durationOut = modifierValue(modifiers, \"duration\", 75) / 1e3;\n  let easing = `cubic-bezier(0.4, 0.0, 0.2, 1)`;\n  if (transitioningIn) {\n    el._x_transition.enter.during = {\n      transformOrigin: origin,\n      transitionDelay: `${delay}s`,\n      transitionProperty: property,\n      transitionDuration: `${durationIn}s`,\n      transitionTimingFunction: easing\n    };\n    el._x_transition.enter.start = {\n      opacity: opacityValue,\n      transform: `scale(${scaleValue})`\n    };\n    el._x_transition.enter.end = {\n      opacity: 1,\n      transform: `scale(1)`\n    };\n  }\n  if (transitioningOut) {\n    el._x_transition.leave.during = {\n      transformOrigin: origin,\n      transitionDelay: `${delay}s`,\n      transitionProperty: property,\n      transitionDuration: `${durationOut}s`,\n      transitionTimingFunction: easing\n    };\n    el._x_transition.leave.start = {\n      opacity: 1,\n      transform: `scale(1)`\n    };\n    el._x_transition.leave.end = {\n      opacity: opacityValue,\n      transform: `scale(${scaleValue})`\n    };\n  }\n}\nfunction registerTransitionObject(el, setFunction, defaultValue = {}) {\n  if (!el._x_transition)\n    el._x_transition = {\n      enter: { during: defaultValue, start: defaultValue, end: defaultValue },\n      leave: { during: defaultValue, start: defaultValue, end: defaultValue },\n      in(before = () => {\n      }, after = () => {\n      }) {\n        transition(el, setFunction, {\n          during: this.enter.during,\n          start: this.enter.start,\n          end: this.enter.end\n        }, before, after);\n      },\n      out(before = () => {\n      }, after = () => {\n      }) {\n        transition(el, setFunction, {\n          during: this.leave.during,\n          start: this.leave.start,\n          end: this.leave.end\n        }, before, after);\n      }\n    };\n}\nwindow.Element.prototype._x_toggleAndCascadeWithTransitions = function(el, value, show, hide) {\n  const nextTick2 = document.visibilityState === \"visible\" ? requestAnimationFrame : setTimeout;\n  let clickAwayCompatibleShow = () => nextTick2(show);\n  if (value) {\n    if (el._x_transition && (el._x_transition.enter || el._x_transition.leave)) {\n      el._x_transition.enter && (Object.entries(el._x_transition.enter.during).length || Object.entries(el._x_transition.enter.start).length || Object.entries(el._x_transition.enter.end).length) ? el._x_transition.in(show) : clickAwayCompatibleShow();\n    } else {\n      el._x_transition ? el._x_transition.in(show) : clickAwayCompatibleShow();\n    }\n    return;\n  }\n  el._x_hidePromise = el._x_transition ? new Promise((resolve, reject) => {\n    el._x_transition.out(() => {\n    }, () => resolve(hide));\n    el._x_transitioning && el._x_transitioning.beforeCancel(() => reject({ isFromCancelledTransition: true }));\n  }) : Promise.resolve(hide);\n  queueMicrotask(() => {\n    let closest = closestHide(el);\n    if (closest) {\n      if (!closest._x_hideChildren)\n        closest._x_hideChildren = [];\n      closest._x_hideChildren.push(el);\n    } else {\n      nextTick2(() => {\n        let hideAfterChildren = (el2) => {\n          let carry = Promise.all([\n            el2._x_hidePromise,\n            ...(el2._x_hideChildren || []).map(hideAfterChildren)\n          ]).then(([i]) => i?.());\n          delete el2._x_hidePromise;\n          delete el2._x_hideChildren;\n          return carry;\n        };\n        hideAfterChildren(el).catch((e) => {\n          if (!e.isFromCancelledTransition)\n            throw e;\n        });\n      });\n    }\n  });\n};\nfunction closestHide(el) {\n  let parent = el.parentNode;\n  if (!parent)\n    return;\n  return parent._x_hidePromise ? parent : closestHide(parent);\n}\nfunction transition(el, setFunction, { during, start: start2, end } = {}, before = () => {\n}, after = () => {\n}) {\n  if (el._x_transitioning)\n    el._x_transitioning.cancel();\n  if (Object.keys(during).length === 0 && Object.keys(start2).length === 0 && Object.keys(end).length === 0) {\n    before();\n    after();\n    return;\n  }\n  let undoStart, undoDuring, undoEnd;\n  performTransition(el, {\n    start() {\n      undoStart = setFunction(el, start2);\n    },\n    during() {\n      undoDuring = setFunction(el, during);\n    },\n    before,\n    end() {\n      undoStart();\n      undoEnd = setFunction(el, end);\n    },\n    after,\n    cleanup() {\n      undoDuring();\n      undoEnd();\n    }\n  });\n}\nfunction performTransition(el, stages) {\n  let interrupted, reachedBefore, reachedEnd;\n  let finish = once(() => {\n    mutateDom(() => {\n      interrupted = true;\n      if (!reachedBefore)\n        stages.before();\n      if (!reachedEnd) {\n        stages.end();\n        releaseNextTicks();\n      }\n      stages.after();\n      if (el.isConnected)\n        stages.cleanup();\n      delete el._x_transitioning;\n    });\n  });\n  el._x_transitioning = {\n    beforeCancels: [],\n    beforeCancel(callback) {\n      this.beforeCancels.push(callback);\n    },\n    cancel: once(function() {\n      while (this.beforeCancels.length) {\n        this.beforeCancels.shift()();\n      }\n      ;\n      finish();\n    }),\n    finish\n  };\n  mutateDom(() => {\n    stages.start();\n    stages.during();\n  });\n  holdNextTicks();\n  requestAnimationFrame(() => {\n    if (interrupted)\n      return;\n    let duration = Number(getComputedStyle(el).transitionDuration.replace(/,.*/, \"\").replace(\"s\", \"\")) * 1e3;\n    let delay = Number(getComputedStyle(el).transitionDelay.replace(/,.*/, \"\").replace(\"s\", \"\")) * 1e3;\n    if (duration === 0)\n      duration = Number(getComputedStyle(el).animationDuration.replace(\"s\", \"\")) * 1e3;\n    mutateDom(() => {\n      stages.before();\n    });\n    reachedBefore = true;\n    requestAnimationFrame(() => {\n      if (interrupted)\n        return;\n      mutateDom(() => {\n        stages.end();\n      });\n      releaseNextTicks();\n      setTimeout(el._x_transitioning.finish, duration + delay);\n      reachedEnd = true;\n    });\n  });\n}\nfunction modifierValue(modifiers, key, fallback) {\n  if (modifiers.indexOf(key) === -1)\n    return fallback;\n  const rawValue = modifiers[modifiers.indexOf(key) + 1];\n  if (!rawValue)\n    return fallback;\n  if (key === \"scale\") {\n    if (isNaN(rawValue))\n      return fallback;\n  }\n  if (key === \"duration\" || key === \"delay\") {\n    let match = rawValue.match(/([0-9]+)ms/);\n    if (match)\n      return match[1];\n  }\n  if (key === \"origin\") {\n    if ([\"top\", \"right\", \"left\", \"center\", \"bottom\"].includes(modifiers[modifiers.indexOf(key) + 2])) {\n      return [rawValue, modifiers[modifiers.indexOf(key) + 2]].join(\" \");\n    }\n  }\n  return rawValue;\n}\n\n// packages/alpinejs/src/clone.js\nvar isCloning = false;\nfunction skipDuringClone(callback, fallback = () => {\n}) {\n  return (...args) => isCloning ? fallback(...args) : callback(...args);\n}\nfunction onlyDuringClone(callback) {\n  return (...args) => isCloning && callback(...args);\n}\nvar interceptors = [];\nfunction interceptClone(callback) {\n  interceptors.push(callback);\n}\nfunction cloneNode(from, to) {\n  interceptors.forEach((i) => i(from, to));\n  isCloning = true;\n  dontRegisterReactiveSideEffects(() => {\n    initTree(to, (el, callback) => {\n      callback(el, () => {\n      });\n    });\n  });\n  isCloning = false;\n}\nvar isCloningLegacy = false;\nfunction clone(oldEl, newEl) {\n  if (!newEl._x_dataStack)\n    newEl._x_dataStack = oldEl._x_dataStack;\n  isCloning = true;\n  isCloningLegacy = true;\n  dontRegisterReactiveSideEffects(() => {\n    cloneTree(newEl);\n  });\n  isCloning = false;\n  isCloningLegacy = false;\n}\nfunction cloneTree(el) {\n  let hasRunThroughFirstEl = false;\n  let shallowWalker = (el2, callback) => {\n    walk(el2, (el3, skip) => {\n      if (hasRunThroughFirstEl && isRoot(el3))\n        return skip();\n      hasRunThroughFirstEl = true;\n      callback(el3, skip);\n    });\n  };\n  initTree(el, shallowWalker);\n}\nfunction dontRegisterReactiveSideEffects(callback) {\n  let cache = effect;\n  overrideEffect((callback2, el) => {\n    let storedEffect = cache(callback2);\n    release(storedEffect);\n    return () => {\n    };\n  });\n  callback();\n  overrideEffect(cache);\n}\n\n// packages/alpinejs/src/utils/bind.js\nfunction bind(el, name, value, modifiers = []) {\n  if (!el._x_bindings)\n    el._x_bindings = reactive({});\n  el._x_bindings[name] = value;\n  name = modifiers.includes(\"camel\") ? camelCase(name) : name;\n  switch (name) {\n    case \"value\":\n      bindInputValue(el, value);\n      break;\n    case \"style\":\n      bindStyles(el, value);\n      break;\n    case \"class\":\n      bindClasses(el, value);\n      break;\n    case \"selected\":\n    case \"checked\":\n      bindAttributeAndProperty(el, name, value);\n      break;\n    default:\n      bindAttribute(el, name, value);\n      break;\n  }\n}\nfunction bindInputValue(el, value) {\n  if (isRadio(el)) {\n    if (el.attributes.value === void 0) {\n      el.value = value;\n    }\n  } else if (isCheckbox(el)) {\n    if (Number.isInteger(value)) {\n      el.value = value;\n    } else if (!Array.isArray(value) && typeof value !== \"boolean\" && ![null, void 0].includes(value)) {\n      el.value = String(value);\n    } else {\n      if (Array.isArray(value)) {\n        el.checked = value.some((val) => checkedAttrLooseCompare(val, el.value));\n      } else {\n        el.checked = !!value;\n      }\n    }\n  } else if (el.tagName === \"SELECT\") {\n    updateSelect(el, value);\n  } else {\n    if (el.value === value)\n      return;\n    el.value = value === void 0 ? \"\" : value;\n  }\n}\nfunction bindClasses(el, value) {\n  if (el._x_undoAddedClasses)\n    el._x_undoAddedClasses();\n  el._x_undoAddedClasses = setClasses(el, value);\n}\nfunction bindStyles(el, value) {\n  if (el._x_undoAddedStyles)\n    el._x_undoAddedStyles();\n  el._x_undoAddedStyles = setStyles(el, value);\n}\nfunction bindAttributeAndProperty(el, name, value) {\n  bindAttribute(el, name, value);\n  setPropertyIfChanged(el, name, value);\n}\nfunction bindAttribute(el, name, value) {\n  if ([null, void 0, false].includes(value) && attributeShouldntBePreservedIfFalsy(name)) {\n    el.removeAttribute(name);\n  } else {\n    if (isBooleanAttr(name))\n      value = name;\n    setIfChanged(el, name, value);\n  }\n}\nfunction setIfChanged(el, attrName, value) {\n  if (el.getAttribute(attrName) != value) {\n    el.setAttribute(attrName, value);\n  }\n}\nfunction setPropertyIfChanged(el, propName, value) {\n  if (el[propName] !== value) {\n    el[propName] = value;\n  }\n}\nfunction updateSelect(el, value) {\n  const arrayWrappedValue = [].concat(value).map((value2) => {\n    return value2 + \"\";\n  });\n  Array.from(el.options).forEach((option) => {\n    option.selected = arrayWrappedValue.includes(option.value);\n  });\n}\nfunction camelCase(subject) {\n  return subject.toLowerCase().replace(/-(\\w)/g, (match, char) => char.toUpperCase());\n}\nfunction checkedAttrLooseCompare(valueA, valueB) {\n  return valueA == valueB;\n}\nfunction safeParseBoolean(rawValue) {\n  if ([1, \"1\", \"true\", \"on\", \"yes\", true].includes(rawValue)) {\n    return true;\n  }\n  if ([0, \"0\", \"false\", \"off\", \"no\", false].includes(rawValue)) {\n    return false;\n  }\n  return rawValue ? Boolean(rawValue) : null;\n}\nvar booleanAttributes = /* @__PURE__ */ new Set([\n  \"allowfullscreen\",\n  \"async\",\n  \"autofocus\",\n  \"autoplay\",\n  \"checked\",\n  \"controls\",\n  \"default\",\n  \"defer\",\n  \"disabled\",\n  \"formnovalidate\",\n  \"inert\",\n  \"ismap\",\n  \"itemscope\",\n  \"loop\",\n  \"multiple\",\n  \"muted\",\n  \"nomodule\",\n  \"novalidate\",\n  \"open\",\n  \"playsinline\",\n  \"readonly\",\n  \"required\",\n  \"reversed\",\n  \"selected\",\n  \"shadowrootclonable\",\n  \"shadowrootdelegatesfocus\",\n  \"shadowrootserializable\"\n]);\nfunction isBooleanAttr(attrName) {\n  return booleanAttributes.has(attrName);\n}\nfunction attributeShouldntBePreservedIfFalsy(name) {\n  return ![\"aria-pressed\", \"aria-checked\", \"aria-expanded\", \"aria-selected\"].includes(name);\n}\nfunction getBinding(el, name, fallback) {\n  if (el._x_bindings && el._x_bindings[name] !== void 0)\n    return el._x_bindings[name];\n  return getAttributeBinding(el, name, fallback);\n}\nfunction extractProp(el, name, fallback, extract = true) {\n  if (el._x_bindings && el._x_bindings[name] !== void 0)\n    return el._x_bindings[name];\n  if (el._x_inlineBindings && el._x_inlineBindings[name] !== void 0) {\n    let binding = el._x_inlineBindings[name];\n    binding.extract = extract;\n    return dontAutoEvaluateFunctions(() => {\n      return evaluate(el, binding.expression);\n    });\n  }\n  return getAttributeBinding(el, name, fallback);\n}\nfunction getAttributeBinding(el, name, fallback) {\n  let attr = el.getAttribute(name);\n  if (attr === null)\n    return typeof fallback === \"function\" ? fallback() : fallback;\n  if (attr === \"\")\n    return true;\n  if (isBooleanAttr(name)) {\n    return !![name, \"true\"].includes(attr);\n  }\n  return attr;\n}\nfunction isCheckbox(el) {\n  return el.type === \"checkbox\" || el.localName === \"ui-checkbox\" || el.localName === \"ui-switch\";\n}\nfunction isRadio(el) {\n  return el.type === \"radio\" || el.localName === \"ui-radio\";\n}\n\n// packages/alpinejs/src/utils/debounce.js\nfunction debounce(func, wait) {\n  let timeout;\n  return function() {\n    const context = this, args = arguments;\n    const later = function() {\n      timeout = null;\n      func.apply(context, args);\n    };\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n  };\n}\n\n// packages/alpinejs/src/utils/throttle.js\nfunction throttle(func, limit) {\n  let inThrottle;\n  return function() {\n    let context = this, args = arguments;\n    if (!inThrottle) {\n      func.apply(context, args);\n      inThrottle = true;\n      setTimeout(() => inThrottle = false, limit);\n    }\n  };\n}\n\n// packages/alpinejs/src/entangle.js\nfunction entangle({ get: outerGet, set: outerSet }, { get: innerGet, set: innerSet }) {\n  let firstRun = true;\n  let outerHash;\n  let innerHash;\n  let reference = effect(() => {\n    let outer = outerGet();\n    let inner = innerGet();\n    if (firstRun) {\n      innerSet(cloneIfObject(outer));\n      firstRun = false;\n    } else {\n      let outerHashLatest = JSON.stringify(outer);\n      let innerHashLatest = JSON.stringify(inner);\n      if (outerHashLatest !== outerHash) {\n        innerSet(cloneIfObject(outer));\n      } else if (outerHashLatest !== innerHashLatest) {\n        outerSet(cloneIfObject(inner));\n      } else {\n      }\n    }\n    outerHash = JSON.stringify(outerGet());\n    innerHash = JSON.stringify(innerGet());\n  });\n  return () => {\n    release(reference);\n  };\n}\nfunction cloneIfObject(value) {\n  return typeof value === \"object\" ? JSON.parse(JSON.stringify(value)) : value;\n}\n\n// packages/alpinejs/src/plugin.js\nfunction plugin(callback) {\n  let callbacks = Array.isArray(callback) ? callback : [callback];\n  callbacks.forEach((i) => i(alpine_default));\n}\n\n// packages/alpinejs/src/store.js\nvar stores = {};\nvar isReactive = false;\nfunction store(name, value) {\n  if (!isReactive) {\n    stores = reactive(stores);\n    isReactive = true;\n  }\n  if (value === void 0) {\n    return stores[name];\n  }\n  stores[name] = value;\n  initInterceptors(stores[name]);\n  if (typeof value === \"object\" && value !== null && value.hasOwnProperty(\"init\") && typeof value.init === \"function\") {\n    stores[name].init();\n  }\n}\nfunction getStores() {\n  return stores;\n}\n\n// packages/alpinejs/src/binds.js\nvar binds = {};\nfunction bind2(name, bindings) {\n  let getBindings = typeof bindings !== \"function\" ? () => bindings : bindings;\n  if (name instanceof Element) {\n    return applyBindingsObject(name, getBindings());\n  } else {\n    binds[name] = getBindings;\n  }\n  return () => {\n  };\n}\nfunction injectBindingProviders(obj) {\n  Object.entries(binds).forEach(([name, callback]) => {\n    Object.defineProperty(obj, name, {\n      get() {\n        return (...args) => {\n          return callback(...args);\n        };\n      }\n    });\n  });\n  return obj;\n}\nfunction applyBindingsObject(el, obj, original) {\n  let cleanupRunners = [];\n  while (cleanupRunners.length)\n    cleanupRunners.pop()();\n  let attributes = Object.entries(obj).map(([name, value]) => ({ name, value }));\n  let staticAttributes = attributesOnly(attributes);\n  attributes = attributes.map((attribute) => {\n    if (staticAttributes.find((attr) => attr.name === attribute.name)) {\n      return {\n        name: `x-bind:${attribute.name}`,\n        value: `\"${attribute.value}\"`\n      };\n    }\n    return attribute;\n  });\n  directives(el, attributes, original).map((handle) => {\n    cleanupRunners.push(handle.runCleanups);\n    handle();\n  });\n  return () => {\n    while (cleanupRunners.length)\n      cleanupRunners.pop()();\n  };\n}\n\n// packages/alpinejs/src/datas.js\nvar datas = {};\nfunction data(name, callback) {\n  datas[name] = callback;\n}\nfunction injectDataProviders(obj, context) {\n  Object.entries(datas).forEach(([name, callback]) => {\n    Object.defineProperty(obj, name, {\n      get() {\n        return (...args) => {\n          return callback.bind(context)(...args);\n        };\n      },\n      enumerable: false\n    });\n  });\n  return obj;\n}\n\n// packages/alpinejs/src/alpine.js\nvar Alpine = {\n  get reactive() {\n    return reactive;\n  },\n  get release() {\n    return release;\n  },\n  get effect() {\n    return effect;\n  },\n  get raw() {\n    return raw;\n  },\n  get transaction() {\n    return transaction;\n  },\n  version: \"3.15.12\",\n  flushAndStopDeferringMutations,\n  dontAutoEvaluateFunctions,\n  disableEffectScheduling,\n  startObservingMutations,\n  stopObservingMutations,\n  setReactivityEngine,\n  onAttributeRemoved,\n  onAttributesAdded,\n  closestDataStack,\n  skipDuringClone,\n  onlyDuringClone,\n  addRootSelector,\n  addInitSelector,\n  setErrorHandler,\n  interceptClone,\n  addScopeToNode,\n  deferMutations,\n  mapAttributes,\n  evaluateLater,\n  interceptInit,\n  initInterceptors,\n  injectMagics,\n  setEvaluator,\n  setRawEvaluator,\n  mergeProxies,\n  extractProp,\n  findClosest,\n  onElRemoved,\n  closestRoot,\n  destroyTree,\n  interceptor,\n  // INTERNAL: not public API and is subject to change without major release.\n  transition,\n  // INTERNAL\n  setStyles,\n  // INTERNAL\n  mutateDom,\n  directive,\n  entangle,\n  throttle,\n  debounce,\n  evaluate,\n  evaluateRaw,\n  initTree,\n  nextTick,\n  prefixed: prefix,\n  prefix: setPrefix,\n  plugin,\n  magic,\n  store,\n  start,\n  clone,\n  // INTERNAL\n  cloneNode,\n  // INTERNAL\n  bound: getBinding,\n  $data: scope,\n  watch,\n  walk,\n  data,\n  bind: bind2\n};\nvar alpine_default = Alpine;\n\n// node_modules/@vue/shared/dist/shared.esm-bundler.js\nfunction makeMap(str, expectsLowerCase) {\n  const map = /* @__PURE__ */ Object.create(null);\n  const list = str.split(\",\");\n  for (let i = 0; i < list.length; i++) {\n    map[list[i]] = true;\n  }\n  return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];\n}\nvar specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nvar isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`);\nvar EMPTY_OBJ = true ? Object.freeze({}) : {};\nvar EMPTY_ARR = true ? Object.freeze([]) : [];\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar hasOwn = (val, key) => hasOwnProperty.call(val, key);\nvar isArray = Array.isArray;\nvar isMap = (val) => toTypeString(val) === \"[object Map]\";\nvar isString = (val) => typeof val === \"string\";\nvar isSymbol = (val) => typeof val === \"symbol\";\nvar isObject = (val) => val !== null && typeof val === \"object\";\nvar objectToString = Object.prototype.toString;\nvar toTypeString = (value) => objectToString.call(value);\nvar toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nvar isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nvar cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n};\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cacheStringFunction((str) => {\n  return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nvar capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));\nvar toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);\nvar hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);\n\n// node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js\nvar targetMap = /* @__PURE__ */ new WeakMap();\nvar effectStack = [];\nvar activeEffect;\nvar ITERATE_KEY = Symbol(true ? \"iterate\" : \"\");\nvar MAP_KEY_ITERATE_KEY = Symbol(true ? \"Map key iterate\" : \"\");\nfunction isEffect(fn) {\n  return fn && fn._isEffect === true;\n}\nfunction effect2(fn, options = EMPTY_OBJ) {\n  if (isEffect(fn)) {\n    fn = fn.raw;\n  }\n  const effect3 = createReactiveEffect(fn, options);\n  if (!options.lazy) {\n    effect3();\n  }\n  return effect3;\n}\nfunction stop(effect3) {\n  if (effect3.active) {\n    cleanup(effect3);\n    if (effect3.options.onStop) {\n      effect3.options.onStop();\n    }\n    effect3.active = false;\n  }\n}\nvar uid = 0;\nfunction createReactiveEffect(fn, options) {\n  const effect3 = function reactiveEffect() {\n    if (!effect3.active) {\n      return fn();\n    }\n    if (!effectStack.includes(effect3)) {\n      cleanup(effect3);\n      try {\n        enableTracking();\n        effectStack.push(effect3);\n        activeEffect = effect3;\n        return fn();\n      } finally {\n        effectStack.pop();\n        resetTracking();\n        activeEffect = effectStack[effectStack.length - 1];\n      }\n    }\n  };\n  effect3.id = uid++;\n  effect3.allowRecurse = !!options.allowRecurse;\n  effect3._isEffect = true;\n  effect3.active = true;\n  effect3.raw = fn;\n  effect3.deps = [];\n  effect3.options = options;\n  return effect3;\n}\nfunction cleanup(effect3) {\n  const { deps } = effect3;\n  if (deps.length) {\n    for (let i = 0; i < deps.length; i++) {\n      deps[i].delete(effect3);\n    }\n    deps.length = 0;\n  }\n}\nvar shouldTrack = true;\nvar trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction track(target, type, key) {\n  if (!shouldTrack || activeEffect === void 0) {\n    return;\n  }\n  let depsMap = targetMap.get(target);\n  if (!depsMap) {\n    targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n  }\n  let dep = depsMap.get(key);\n  if (!dep) {\n    depsMap.set(key, dep = /* @__PURE__ */ new Set());\n  }\n  if (!dep.has(activeEffect)) {\n    dep.add(activeEffect);\n    activeEffect.deps.push(dep);\n    if (activeEffect.options.onTrack) {\n      activeEffect.options.onTrack({\n        effect: activeEffect,\n        target,\n        type,\n        key\n      });\n    }\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    return;\n  }\n  const effects = /* @__PURE__ */ new Set();\n  const add2 = (effectsToAdd) => {\n    if (effectsToAdd) {\n      effectsToAdd.forEach((effect3) => {\n        if (effect3 !== activeEffect || effect3.allowRecurse) {\n          effects.add(effect3);\n        }\n      });\n    }\n  };\n  if (type === \"clear\") {\n    depsMap.forEach(add2);\n  } else if (key === \"length\" && isArray(target)) {\n    depsMap.forEach((dep, key2) => {\n      if (key2 === \"length\" || key2 >= newValue) {\n        add2(dep);\n      }\n    });\n  } else {\n    if (key !== void 0) {\n      add2(depsMap.get(key));\n    }\n    switch (type) {\n      case \"add\":\n        if (!isArray(target)) {\n          add2(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            add2(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        } else if (isIntegerKey(key)) {\n          add2(depsMap.get(\"length\"));\n        }\n        break;\n      case \"delete\":\n        if (!isArray(target)) {\n          add2(depsMap.get(ITERATE_KEY));\n          if (isMap(target)) {\n            add2(depsMap.get(MAP_KEY_ITERATE_KEY));\n          }\n        }\n        break;\n      case \"set\":\n        if (isMap(target)) {\n          add2(depsMap.get(ITERATE_KEY));\n        }\n        break;\n    }\n  }\n  const run = (effect3) => {\n    if (effect3.options.onTrigger) {\n      effect3.options.onTrigger({\n        effect: effect3,\n        target,\n        key,\n        type,\n        newValue,\n        oldValue,\n        oldTarget\n      });\n    }\n    if (effect3.options.scheduler) {\n      effect3.options.scheduler(effect3);\n    } else {\n      effect3();\n    }\n  };\n  effects.forEach(run);\n}\nvar isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nvar builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(isSymbol));\nvar get2 = /* @__PURE__ */ createGetter();\nvar readonlyGet = /* @__PURE__ */ createGetter(true);\nvar arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n  const instrumentations = {};\n  [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      const arr = toRaw(this);\n      for (let i = 0, l = this.length; i < l; i++) {\n        track(arr, \"get\", i + \"\");\n      }\n      const res = arr[key](...args);\n      if (res === -1 || res === false) {\n        return arr[key](...args.map(toRaw));\n      } else {\n        return res;\n      }\n    };\n  });\n  [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n    instrumentations[key] = function(...args) {\n      pauseTracking();\n      const res = toRaw(this)[key].apply(this, args);\n      resetTracking();\n      return res;\n    };\n  });\n  return instrumentations;\n}\nfunction createGetter(isReadonly = false, shallow = false) {\n  return function get3(target, key, receiver) {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly;\n    } else if (key === \"__v_raw\" && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {\n      return target;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {\n      return Reflect.get(arrayInstrumentations, key, receiver);\n    }\n    const res = Reflect.get(target, key, receiver);\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly) {\n      track(target, \"get\", key);\n    }\n    if (shallow) {\n      return res;\n    }\n    if (isRef(res)) {\n      const shouldUnwrap = !targetIsArray || !isIntegerKey(key);\n      return shouldUnwrap ? res.value : res;\n    }\n    if (isObject(res)) {\n      return isReadonly ? readonly(res) : reactive2(res);\n    }\n    return res;\n  };\n}\nvar set2 = /* @__PURE__ */ createSetter();\nfunction createSetter(shallow = false) {\n  return function set3(target, key, value, receiver) {\n    let oldValue = target[key];\n    if (!shallow) {\n      value = toRaw(value);\n      oldValue = toRaw(oldValue);\n      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n        oldValue.value = value;\n        return true;\n      }\n    }\n    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(target, key, value, receiver);\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  };\n}\nfunction deleteProperty(target, key) {\n  const hadKey = hasOwn(target, key);\n  const oldValue = target[key];\n  const result = Reflect.deleteProperty(target, key);\n  if (result && hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction has(target, key) {\n  const result = Reflect.has(target, key);\n  if (!isSymbol(key) || !builtInSymbols.has(key)) {\n    track(target, \"has\", key);\n  }\n  return result;\n}\nfunction ownKeys(target) {\n  track(target, \"iterate\", isArray(target) ? \"length\" : ITERATE_KEY);\n  return Reflect.ownKeys(target);\n}\nvar mutableHandlers = {\n  get: get2,\n  set: set2,\n  deleteProperty,\n  has,\n  ownKeys\n};\nvar readonlyHandlers = {\n  get: readonlyGet,\n  set(target, key) {\n    if (true) {\n      console.warn(`Set operation on key \"${String(key)}\" failed: target is readonly.`, target);\n    }\n    return true;\n  },\n  deleteProperty(target, key) {\n    if (true) {\n      console.warn(`Delete operation on key \"${String(key)}\" failed: target is readonly.`, target);\n    }\n    return true;\n  }\n};\nvar toReactive = (value) => isObject(value) ? reactive2(value) : value;\nvar toReadonly = (value) => isObject(value) ? readonly(value) : value;\nvar toShallow = (value) => value;\nvar getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get$1(target, key, isReadonly = false, isShallow = false) {\n  target = target[\n    \"__v_raw\"\n    /* RAW */\n  ];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (key !== rawKey) {\n    !isReadonly && track(rawTarget, \"get\", key);\n  }\n  !isReadonly && track(rawTarget, \"get\", rawKey);\n  const { has: has2 } = getProto(rawTarget);\n  const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n  if (has2.call(rawTarget, key)) {\n    return wrap(target.get(key));\n  } else if (has2.call(rawTarget, rawKey)) {\n    return wrap(target.get(rawKey));\n  } else if (target !== rawTarget) {\n    target.get(key);\n  }\n}\nfunction has$1(key, isReadonly = false) {\n  const target = this[\n    \"__v_raw\"\n    /* RAW */\n  ];\n  const rawTarget = toRaw(target);\n  const rawKey = toRaw(key);\n  if (key !== rawKey) {\n    !isReadonly && track(rawTarget, \"has\", key);\n  }\n  !isReadonly && track(rawTarget, \"has\", rawKey);\n  return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n  target = target[\n    \"__v_raw\"\n    /* RAW */\n  ];\n  !isReadonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n  return Reflect.get(target, \"size\", target);\n}\nfunction add(value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const proto = getProto(target);\n  const hadKey = proto.has.call(target, value);\n  if (!hadKey) {\n    target.add(value);\n    trigger(target, \"add\", value, value);\n  }\n  return this;\n}\nfunction set$1(key, value) {\n  value = toRaw(value);\n  const target = toRaw(this);\n  const { has: has2, get: get3 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (true) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get3.call(target, key);\n  target.set(key, value);\n  if (!hadKey) {\n    trigger(target, \"add\", key, value);\n  } else if (hasChanged(value, oldValue)) {\n    trigger(target, \"set\", key, value, oldValue);\n  }\n  return this;\n}\nfunction deleteEntry(key) {\n  const target = toRaw(this);\n  const { has: has2, get: get3 } = getProto(target);\n  let hadKey = has2.call(target, key);\n  if (!hadKey) {\n    key = toRaw(key);\n    hadKey = has2.call(target, key);\n  } else if (true) {\n    checkIdentityKeys(target, has2, key);\n  }\n  const oldValue = get3 ? get3.call(target, key) : void 0;\n  const result = target.delete(key);\n  if (hadKey) {\n    trigger(target, \"delete\", key, void 0, oldValue);\n  }\n  return result;\n}\nfunction clear() {\n  const target = toRaw(this);\n  const hadItems = target.size !== 0;\n  const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n  const result = target.clear();\n  if (hadItems) {\n    trigger(target, \"clear\", void 0, void 0, oldTarget);\n  }\n  return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n  return function forEach(callback, thisArg) {\n    const observed = this;\n    const target = observed[\n      \"__v_raw\"\n      /* RAW */\n    ];\n    const rawTarget = toRaw(target);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n    return target.forEach((value, key) => {\n      return callback.call(thisArg, wrap(value), wrap(key), observed);\n    });\n  };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n  return function(...args) {\n    const target = this[\n      \"__v_raw\"\n      /* RAW */\n    ];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n    !isReadonly && track(rawTarget, \"iterate\", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);\n    return {\n      // iterator protocol\n      next() {\n        const { value, done } = innerIterator.next();\n        return done ? { value, done } : {\n          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n          done\n        };\n      },\n      // iterable protocol\n      [Symbol.iterator]() {\n        return this;\n      }\n    };\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (true) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this));\n    }\n    return type === \"delete\" ? false : this;\n  };\n}\nfunction createInstrumentations() {\n  const mutableInstrumentations2 = {\n    get(key) {\n      return get$1(this, key);\n    },\n    get size() {\n      return size(this);\n    },\n    has: has$1,\n    add,\n    set: set$1,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, false)\n  };\n  const shallowInstrumentations2 = {\n    get(key) {\n      return get$1(this, key, false, true);\n    },\n    get size() {\n      return size(this);\n    },\n    has: has$1,\n    add,\n    set: set$1,\n    delete: deleteEntry,\n    clear,\n    forEach: createForEach(false, true)\n  };\n  const readonlyInstrumentations2 = {\n    get(key) {\n      return get$1(this, key, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has$1.call(this, key, true);\n    },\n    add: createReadonlyMethod(\n      \"add\"\n      /* ADD */\n    ),\n    set: createReadonlyMethod(\n      \"set\"\n      /* SET */\n    ),\n    delete: createReadonlyMethod(\n      \"delete\"\n      /* DELETE */\n    ),\n    clear: createReadonlyMethod(\n      \"clear\"\n      /* CLEAR */\n    ),\n    forEach: createForEach(true, false)\n  };\n  const shallowReadonlyInstrumentations2 = {\n    get(key) {\n      return get$1(this, key, true, true);\n    },\n    get size() {\n      return size(this, true);\n    },\n    has(key) {\n      return has$1.call(this, key, true);\n    },\n    add: createReadonlyMethod(\n      \"add\"\n      /* ADD */\n    ),\n    set: createReadonlyMethod(\n      \"set\"\n      /* SET */\n    ),\n    delete: createReadonlyMethod(\n      \"delete\"\n      /* DELETE */\n    ),\n    clear: createReadonlyMethod(\n      \"clear\"\n      /* CLEAR */\n    ),\n    forEach: createForEach(true, true)\n  };\n  const iteratorMethods = [\"keys\", \"values\", \"entries\", Symbol.iterator];\n  iteratorMethods.forEach((method) => {\n    mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n    readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n    shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n    shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true);\n  });\n  return [\n    mutableInstrumentations2,\n    readonlyInstrumentations2,\n    shallowInstrumentations2,\n    shallowReadonlyInstrumentations2\n  ];\n}\nvar [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n  const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);\n  };\n}\nvar mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nvar readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nfunction checkIdentityKeys(target, has2, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has2.call(target, rawKey)) {\n    const type = toRawType(target);\n    console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`);\n  }\n}\nvar reactiveMap = /* @__PURE__ */ new WeakMap();\nvar shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nvar readonlyMap = /* @__PURE__ */ new WeakMap();\nvar shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2;\n    default:\n      return 0;\n  }\n}\nfunction getTargetType(value) {\n  return value[\n    \"__v_skip\"\n    /* SKIP */\n  ] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value));\n}\nfunction reactive2(target) {\n  if (target && target[\n    \"__v_isReadonly\"\n    /* IS_READONLY */\n  ]) {\n    return target;\n  }\n  return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);\n}\nfunction readonly(target) {\n  return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);\n}\nfunction createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (true) {\n      console.warn(`value cannot be made reactive: ${String(target)}`);\n    }\n    return target;\n  }\n  if (target[\n    \"__v_raw\"\n    /* RAW */\n  ] && !(isReadonly && target[\n    \"__v_isReactive\"\n    /* IS_REACTIVE */\n  ])) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0) {\n    return target;\n  }\n  const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);\n  proxyMap.set(target, proxy);\n  return proxy;\n}\nfunction toRaw(observed) {\n  return observed && toRaw(observed[\n    \"__v_raw\"\n    /* RAW */\n  ]) || observed;\n}\nfunction isRef(r) {\n  return Boolean(r && r.__v_isRef === true);\n}\n\n// packages/alpinejs/src/magics/$nextTick.js\nmagic(\"nextTick\", () => nextTick);\n\n// packages/alpinejs/src/magics/$dispatch.js\nmagic(\"dispatch\", (el) => dispatch.bind(dispatch, el));\n\n// packages/alpinejs/src/magics/$watch.js\nmagic(\"watch\", (el, { evaluateLater: evaluateLater2, cleanup: cleanup2 }) => (key, callback) => {\n  let evaluate2 = evaluateLater2(key);\n  let getter = () => {\n    let value;\n    evaluate2((i) => value = i);\n    return value;\n  };\n  let unwatch = watch(getter, callback);\n  cleanup2(unwatch);\n});\n\n// packages/alpinejs/src/magics/$store.js\nmagic(\"store\", getStores);\n\n// packages/alpinejs/src/magics/$data.js\nmagic(\"data\", (el) => scope(el));\n\n// packages/alpinejs/src/magics/$root.js\nmagic(\"root\", (el) => closestRoot(el));\n\n// packages/alpinejs/src/magics/$refs.js\nmagic(\"refs\", (el) => {\n  if (el._x_refs_proxy)\n    return el._x_refs_proxy;\n  el._x_refs_proxy = mergeProxies(getArrayOfRefObject(el));\n  return el._x_refs_proxy;\n});\nfunction getArrayOfRefObject(el) {\n  let refObjects = [];\n  findClosest(el, (i) => {\n    if (i._x_refs)\n      refObjects.push(i._x_refs);\n  });\n  return refObjects;\n}\n\n// packages/alpinejs/src/ids.js\nvar globalIdMemo = {};\nfunction findAndIncrementId(name) {\n  if (!globalIdMemo[name])\n    globalIdMemo[name] = 0;\n  return ++globalIdMemo[name];\n}\nfunction closestIdRoot(el, name) {\n  return findClosest(el, (element) => {\n    if (element._x_ids && element._x_ids[name])\n      return true;\n  });\n}\nfunction setIdRoot(el, name) {\n  if (!el._x_ids)\n    el._x_ids = {};\n  if (!el._x_ids[name])\n    el._x_ids[name] = findAndIncrementId(name);\n}\n\n// packages/alpinejs/src/magics/$id.js\nmagic(\"id\", (el, { cleanup: cleanup2 }) => (name, key = null) => {\n  let cacheKey = `${name}${key ? `-${key}` : \"\"}`;\n  return cacheIdByNameOnElement(el, cacheKey, cleanup2, () => {\n    let root = closestIdRoot(el, name);\n    let id = root ? root._x_ids[name] : findAndIncrementId(name);\n    return key ? `${name}-${id}-${key}` : `${name}-${id}`;\n  });\n});\ninterceptClone((from, to) => {\n  if (from._x_id) {\n    to._x_id = from._x_id;\n  }\n});\nfunction cacheIdByNameOnElement(el, cacheKey, cleanup2, callback) {\n  if (!el._x_id)\n    el._x_id = {};\n  if (el._x_id[cacheKey])\n    return el._x_id[cacheKey];\n  let output = callback();\n  el._x_id[cacheKey] = output;\n  cleanup2(() => {\n    delete el._x_id[cacheKey];\n  });\n  return output;\n}\n\n// packages/alpinejs/src/magics/$el.js\nmagic(\"el\", (el) => el);\n\n// packages/alpinejs/src/magics/index.js\nwarnMissingPluginMagic(\"Focus\", \"focus\", \"focus\");\nwarnMissingPluginMagic(\"Persist\", \"persist\", \"persist\");\nfunction warnMissingPluginMagic(name, magicName, slug) {\n  magic(magicName, (el) => warn(`You can't use [$${magicName}] without first installing the \"${name}\" plugin here: https://alpinejs.dev/plugins/${slug}`, el));\n}\n\n// packages/alpinejs/src/directives/x-modelable.js\ndirective(\"modelable\", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2, cleanup: cleanup2 }) => {\n  let func = evaluateLater2(expression);\n  let innerGet = () => {\n    let result;\n    func((i) => result = i);\n    return result;\n  };\n  let evaluateInnerSet = evaluateLater2(`${expression} = __placeholder`);\n  let innerSet = (val) => evaluateInnerSet(() => {\n  }, { scope: { \"__placeholder\": val } });\n  let initialValue = innerGet();\n  innerSet(initialValue);\n  queueMicrotask(() => {\n    if (!el._x_model)\n      return;\n    el._x_removeModelListeners[\"default\"]();\n    let outerGet = el._x_model.get;\n    let outerSet = el._x_model.setWithModifiers;\n    let releaseEntanglement = entangle(\n      {\n        get() {\n          return outerGet();\n        },\n        set(value) {\n          outerSet(value);\n        }\n      },\n      {\n        get() {\n          return innerGet();\n        },\n        set(value) {\n          innerSet(value);\n        }\n      }\n    );\n    cleanup2(releaseEntanglement);\n  });\n});\n\n// packages/alpinejs/src/directives/x-teleport.js\ndirective(\"teleport\", (el, { modifiers, expression }, { cleanup: cleanup2 }) => {\n  if (el.tagName.toLowerCase() !== \"template\")\n    warn(\"x-teleport can only be used on a <template> tag\", el);\n  let target = getTarget(expression);\n  let clone2 = el.content.cloneNode(true).firstElementChild;\n  el._x_teleport = clone2;\n  clone2._x_teleportBack = el;\n  el.setAttribute(\"data-teleport-template\", true);\n  clone2.setAttribute(\"data-teleport-target\", true);\n  if (el._x_forwardEvents) {\n    el._x_forwardEvents.forEach((eventName) => {\n      clone2.addEventListener(eventName, (e) => {\n        e.stopPropagation();\n        el.dispatchEvent(new e.constructor(e.type, e));\n      });\n    });\n  }\n  addScopeToNode(clone2, {}, el);\n  let placeInDom = (clone3, target2, modifiers2) => {\n    if (modifiers2.includes(\"prepend\")) {\n      target2.parentNode.insertBefore(clone3, target2);\n    } else if (modifiers2.includes(\"append\")) {\n      target2.parentNode.insertBefore(clone3, target2.nextSibling);\n    } else {\n      target2.appendChild(clone3);\n    }\n  };\n  mutateDom(() => {\n    skipDuringClone(() => {\n      placeInDom(clone2, target, modifiers);\n      initTree(clone2);\n    })();\n  });\n  el._x_teleportPutBack = () => {\n    let target2 = getTarget(expression);\n    mutateDom(() => {\n      placeInDom(el._x_teleport, target2, modifiers);\n    });\n  };\n  cleanup2(\n    () => mutateDom(() => {\n      clone2.remove();\n      destroyTree(clone2);\n    })\n  );\n});\nvar teleportContainerDuringClone = document.createElement(\"div\");\nfunction getTarget(expression) {\n  let target = skipDuringClone(() => {\n    return document.querySelector(expression);\n  }, () => {\n    return teleportContainerDuringClone;\n  })();\n  if (!target)\n    warn(`Cannot find x-teleport element for selector: \"${expression}\"`);\n  return target;\n}\n\n// packages/alpinejs/src/directives/x-ignore.js\nvar handler = () => {\n};\nhandler.inline = (el, { modifiers }, { cleanup: cleanup2 }) => {\n  modifiers.includes(\"self\") ? el._x_ignoreSelf = true : el._x_ignore = true;\n  cleanup2(() => {\n    modifiers.includes(\"self\") ? delete el._x_ignoreSelf : delete el._x_ignore;\n  });\n};\ndirective(\"ignore\", handler);\n\n// packages/alpinejs/src/directives/x-effect.js\ndirective(\"effect\", skipDuringClone((el, { expression }, { effect: effect3 }) => {\n  effect3(evaluateLater(el, expression));\n}));\n\n// packages/alpinejs/src/utils/on.js\nfunction on(el, event, modifiers, callback) {\n  let listenerTarget = el;\n  let handler4 = (e) => callback(e);\n  let options = {};\n  let wrapHandler = (callback2, wrapper) => (e) => wrapper(callback2, e);\n  if (modifiers.includes(\"dot\"))\n    event = dotSyntax(event);\n  if (modifiers.includes(\"camel\"))\n    event = camelCase2(event);\n  if (modifiers.includes(\"capture\"))\n    options.capture = true;\n  if (modifiers.includes(\"window\"))\n    listenerTarget = window;\n  if (modifiers.includes(\"document\"))\n    listenerTarget = document;\n  if (modifiers.includes(\"passive\")) {\n    options.passive = modifiers[modifiers.indexOf(\"passive\") + 1] !== \"false\";\n  }\n  handler4 = addDebounceOrThrottle(modifiers, handler4);\n  if (modifiers.includes(\"prevent\"))\n    handler4 = wrapHandler(handler4, (next, e) => {\n      e.preventDefault();\n      next(e);\n    });\n  if (modifiers.includes(\"stop\"))\n    handler4 = wrapHandler(handler4, (next, e) => {\n      e.stopPropagation();\n      next(e);\n    });\n  if (modifiers.includes(\"once\")) {\n    handler4 = wrapHandler(handler4, (next, e) => {\n      next(e);\n      listenerTarget.removeEventListener(event, handler4, options);\n    });\n  }\n  if (modifiers.includes(\"away\") || modifiers.includes(\"outside\")) {\n    listenerTarget = document;\n    handler4 = wrapHandler(handler4, (next, e) => {\n      if (el.contains(e.target))\n        return;\n      if (e.target.isConnected === false)\n        return;\n      if (el.offsetWidth < 1 && el.offsetHeight < 1)\n        return;\n      if (el._x_isShown === false)\n        return;\n      next(e);\n    });\n  }\n  if (modifiers.includes(\"self\"))\n    handler4 = wrapHandler(handler4, (next, e) => {\n      e.target === el && next(e);\n    });\n  if (event === \"submit\") {\n    handler4 = wrapHandler(handler4, (next, e) => {\n      if (e.target._x_pendingModelUpdates) {\n        e.target._x_pendingModelUpdates.forEach((fn) => fn());\n      }\n      next(e);\n    });\n  }\n  if (isKeyEvent(event) || isClickEvent(event)) {\n    handler4 = wrapHandler(handler4, (next, e) => {\n      if (isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers)) {\n        return;\n      }\n      next(e);\n    });\n  }\n  listenerTarget.addEventListener(event, handler4, options);\n  return () => {\n    listenerTarget.removeEventListener(event, handler4, options);\n  };\n}\nfunction addDebounceOrThrottle(modifiers, handler4) {\n  if (modifiers.includes(\"debounce\")) {\n    let nextModifier = modifiers[modifiers.indexOf(\"debounce\") + 1] || \"invalid-wait\";\n    let wait = isNumeric(nextModifier.split(\"ms\")[0]) ? Number(nextModifier.split(\"ms\")[0]) : 250;\n    handler4 = debounce(handler4, wait);\n  }\n  if (modifiers.includes(\"throttle\")) {\n    let nextModifier = modifiers[modifiers.indexOf(\"throttle\") + 1] || \"invalid-wait\";\n    let wait = isNumeric(nextModifier.split(\"ms\")[0]) ? Number(nextModifier.split(\"ms\")[0]) : 250;\n    handler4 = throttle(handler4, wait);\n  }\n  return handler4;\n}\nfunction dotSyntax(subject) {\n  return subject.replace(/-/g, \".\");\n}\nfunction camelCase2(subject) {\n  return subject.toLowerCase().replace(/-(\\w)/g, (match, char) => char.toUpperCase());\n}\nfunction isNumeric(subject) {\n  return !Array.isArray(subject) && !isNaN(subject);\n}\nfunction kebabCase2(subject) {\n  if ([\" \", \"_\"].includes(\n    subject\n  ))\n    return subject;\n  return subject.replace(/([a-z])([A-Z])/g, \"$1-$2\").replace(/[_\\s]/, \"-\").toLowerCase();\n}\nfunction isKeyEvent(event) {\n  return [\"keydown\", \"keyup\"].includes(event);\n}\nfunction isClickEvent(event) {\n  return [\"contextmenu\", \"click\", \"mouse\"].some((i) => event.includes(i));\n}\nfunction isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers) {\n  let keyModifiers = modifiers.filter((i) => {\n    return ![\"window\", \"document\", \"prevent\", \"stop\", \"once\", \"capture\", \"self\", \"away\", \"outside\", \"passive\", \"preserve-scroll\", \"blur\", \"change\", \"lazy\"].includes(i);\n  });\n  if (keyModifiers.includes(\"debounce\")) {\n    let debounceIndex = keyModifiers.indexOf(\"debounce\");\n    keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || \"invalid-wait\").split(\"ms\")[0]) ? 2 : 1);\n  }\n  if (keyModifiers.includes(\"throttle\")) {\n    let debounceIndex = keyModifiers.indexOf(\"throttle\");\n    keyModifiers.splice(debounceIndex, isNumeric((keyModifiers[debounceIndex + 1] || \"invalid-wait\").split(\"ms\")[0]) ? 2 : 1);\n  }\n  if (keyModifiers.length === 0)\n    return false;\n  if (keyModifiers.length === 1 && keyToModifiers(e.key).includes(keyModifiers[0]))\n    return false;\n  const systemKeyModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\", \"cmd\", \"super\"];\n  const selectedSystemKeyModifiers = systemKeyModifiers.filter((modifier) => keyModifiers.includes(modifier));\n  keyModifiers = keyModifiers.filter((i) => !selectedSystemKeyModifiers.includes(i));\n  if (selectedSystemKeyModifiers.length > 0) {\n    const activelyPressedKeyModifiers = selectedSystemKeyModifiers.filter((modifier) => {\n      if (modifier === \"cmd\" || modifier === \"super\")\n        modifier = \"meta\";\n      return e[`${modifier}Key`];\n    });\n    if (activelyPressedKeyModifiers.length === selectedSystemKeyModifiers.length) {\n      if (isClickEvent(e.type))\n        return false;\n      if (keyToModifiers(e.key).includes(keyModifiers[0]))\n        return false;\n    }\n  }\n  return true;\n}\nfunction keyToModifiers(key) {\n  if (!key)\n    return [];\n  key = kebabCase2(key);\n  let modifierToKeyMap = {\n    \"ctrl\": \"control\",\n    \"slash\": \"/\",\n    \"space\": \" \",\n    \"spacebar\": \" \",\n    \"cmd\": \"meta\",\n    \"esc\": \"escape\",\n    \"up\": \"arrow-up\",\n    \"down\": \"arrow-down\",\n    \"left\": \"arrow-left\",\n    \"right\": \"arrow-right\",\n    \"period\": \".\",\n    \"comma\": \",\",\n    \"equal\": \"=\",\n    \"minus\": \"-\",\n    \"underscore\": \"_\"\n  };\n  modifierToKeyMap[key] = key;\n  return Object.keys(modifierToKeyMap).map((modifier) => {\n    if (modifierToKeyMap[modifier] === key)\n      return modifier;\n  }).filter((modifier) => modifier);\n}\n\n// packages/alpinejs/src/directives/x-model.js\ndirective(\"model\", (el, { modifiers, expression }, { effect: effect3, cleanup: cleanup2 }) => {\n  let scopeTarget = el;\n  if (modifiers.includes(\"parent\")) {\n    scopeTarget = findClosest(el, (element) => element !== el);\n  }\n  let evaluateGet = evaluateLater(scopeTarget, expression);\n  let evaluateSet;\n  if (typeof expression === \"string\") {\n    evaluateSet = evaluateLater(scopeTarget, `${expression} = __placeholder`);\n  } else if (typeof expression === \"function\" && typeof expression() === \"string\") {\n    evaluateSet = evaluateLater(scopeTarget, `${expression()} = __placeholder`);\n  } else {\n    evaluateSet = () => {\n    };\n  }\n  let getValue = () => {\n    let result;\n    evaluateGet((value) => result = value);\n    return isGetterSetter(result) ? result.get() : result;\n  };\n  let setValue = (value) => {\n    let result;\n    evaluateGet((value2) => result = value2);\n    if (isGetterSetter(result)) {\n      result.set(value);\n    } else {\n      evaluateSet(() => {\n      }, {\n        scope: { \"__placeholder\": value }\n      });\n    }\n  };\n  if (typeof expression === \"string\" && el.type === \"radio\") {\n    mutateDom(() => {\n      if (!el.hasAttribute(\"name\"))\n        el.setAttribute(\"name\", expression);\n    });\n  }\n  let hasChangeModifier = modifiers.includes(\"change\") || modifiers.includes(\"lazy\");\n  let hasBlurModifier = modifiers.includes(\"blur\");\n  let hasEnterModifier = modifiers.includes(\"enter\");\n  let hasExplicitEventModifiers = hasChangeModifier || hasBlurModifier || hasEnterModifier;\n  let removeListener;\n  if (isCloning) {\n    removeListener = () => {\n    };\n  } else if (hasExplicitEventModifiers) {\n    let listeners = [];\n    let syncValue = (e) => setValue(getInputValue(el, modifiers, e, getValue()));\n    if (hasChangeModifier) {\n      listeners.push(on(el, \"change\", modifiers, syncValue));\n    }\n    if (hasBlurModifier) {\n      listeners.push(on(el, \"blur\", modifiers, syncValue));\n      if (el.form) {\n        let form = el.form;\n        let syncCallback = () => syncValue({ target: el });\n        if (!form._x_pendingModelUpdates)\n          form._x_pendingModelUpdates = [];\n        form._x_pendingModelUpdates.push(syncCallback);\n        cleanup2(() => {\n          if (form._x_pendingModelUpdates) {\n            form._x_pendingModelUpdates.splice(form._x_pendingModelUpdates.indexOf(syncCallback), 1);\n          }\n        });\n      }\n    }\n    if (hasEnterModifier) {\n      listeners.push(on(el, \"keydown\", modifiers, (e) => {\n        if (e.key === \"Enter\")\n          syncValue(e);\n      }));\n    }\n    removeListener = () => listeners.forEach((remove) => remove());\n  } else {\n    let event = el.tagName.toLowerCase() === \"select\" || [\"checkbox\", \"radio\"].includes(el.type) ? \"change\" : \"input\";\n    removeListener = on(el, event, modifiers, (e) => {\n      setValue(getInputValue(el, modifiers, e, getValue()));\n    });\n  }\n  if (modifiers.includes(\"fill\")) {\n    if ([void 0, null, \"\"].includes(getValue()) || isCheckbox(el) && Array.isArray(getValue()) || el.tagName.toLowerCase() === \"select\" && el.multiple) {\n      setValue(\n        getInputValue(el, modifiers, { target: el }, getValue())\n      );\n    }\n  }\n  if (!el._x_removeModelListeners)\n    el._x_removeModelListeners = {};\n  el._x_removeModelListeners[\"default\"] = removeListener;\n  cleanup2(() => el._x_removeModelListeners[\"default\"]());\n  if (el.form) {\n    let removeResetListener = on(el.form, \"reset\", [], (e) => {\n      nextTick(() => el._x_model && el._x_model.set(getInputValue(el, modifiers, { target: el }, getValue())));\n    });\n    cleanup2(() => removeResetListener());\n  }\n  el._x_model = {\n    get() {\n      return getValue();\n    },\n    set(value) {\n      setValue(value);\n    },\n    setWithModifiers: addDebounceOrThrottle(modifiers, setValue)\n  };\n  el._x_forceModelUpdate = (value) => {\n    if (value === void 0 && typeof expression === \"string\" && expression.match(/\\./))\n      value = \"\";\n    mutateDom(() => {\n      if (isCheckbox(el)) {\n        if (Array.isArray(value)) {\n          el.checked = value.some((val) => val == el.value);\n        } else {\n          el.checked = !!value;\n        }\n      } else if (isRadio(el)) {\n        if (typeof value === \"boolean\") {\n          el.checked = safeParseBoolean(el.value) === value;\n        } else {\n          el.checked = el.value == value;\n        }\n      } else {\n        bind(el, \"value\", value);\n      }\n    });\n  };\n  effect3(() => {\n    let value = getValue();\n    if (modifiers.includes(\"unintrusive\") && document.activeElement.isSameNode(el))\n      return;\n    el._x_forceModelUpdate(value);\n  });\n});\nfunction getInputValue(el, modifiers, event, currentValue) {\n  return mutateDom(() => {\n    if (event instanceof CustomEvent && event.detail !== void 0)\n      return event.detail !== null && event.detail !== void 0 ? event.detail : event.target.value;\n    else if (isCheckbox(el)) {\n      if (Array.isArray(currentValue)) {\n        let newValue = null;\n        if (modifiers.includes(\"number\")) {\n          newValue = safeParseNumber(event.target.value);\n        } else if (modifiers.includes(\"boolean\")) {\n          newValue = safeParseBoolean(event.target.value);\n        } else {\n          newValue = event.target.value;\n        }\n        return event.target.checked ? currentValue.includes(newValue) ? currentValue : currentValue.concat([newValue]) : currentValue.filter((el2) => !checkedAttrLooseCompare2(el2, newValue));\n      } else {\n        return event.target.checked;\n      }\n    } else if (el.tagName.toLowerCase() === \"select\" && el.multiple) {\n      if (modifiers.includes(\"number\")) {\n        return Array.from(event.target.selectedOptions).map((option) => {\n          let rawValue = option.value || option.text;\n          return safeParseNumber(rawValue);\n        });\n      } else if (modifiers.includes(\"boolean\")) {\n        return Array.from(event.target.selectedOptions).map((option) => {\n          let rawValue = option.value || option.text;\n          return safeParseBoolean(rawValue);\n        });\n      }\n      return Array.from(event.target.selectedOptions).map((option) => {\n        return option.value || option.text;\n      });\n    } else {\n      let newValue;\n      if (isRadio(el)) {\n        if (event.target.checked) {\n          newValue = event.target.value;\n        } else {\n          newValue = currentValue;\n        }\n      } else {\n        newValue = event.target.value;\n      }\n      if (modifiers.includes(\"number\")) {\n        return safeParseNumber(newValue);\n      } else if (modifiers.includes(\"boolean\")) {\n        return safeParseBoolean(newValue);\n      } else if (modifiers.includes(\"trim\")) {\n        return newValue.trim();\n      } else {\n        return newValue;\n      }\n    }\n  });\n}\nfunction safeParseNumber(rawValue) {\n  let number = rawValue ? parseFloat(rawValue) : null;\n  return isNumeric2(number) ? number : rawValue;\n}\nfunction checkedAttrLooseCompare2(valueA, valueB) {\n  return valueA == valueB;\n}\nfunction isNumeric2(subject) {\n  return !Array.isArray(subject) && !isNaN(subject);\n}\nfunction isGetterSetter(value) {\n  return value !== null && typeof value === \"object\" && typeof value.get === \"function\" && typeof value.set === \"function\";\n}\n\n// packages/alpinejs/src/directives/x-cloak.js\ndirective(\"cloak\", (el) => queueMicrotask(() => mutateDom(() => el.removeAttribute(prefix(\"cloak\")))));\n\n// packages/alpinejs/src/directives/x-init.js\naddInitSelector(() => `[${prefix(\"init\")}]`);\ndirective(\"init\", skipDuringClone((el, { expression }, { evaluate: evaluate2 }) => {\n  if (typeof expression === \"string\") {\n    return !!expression.trim() && evaluate2(expression, {}, false);\n  }\n  return evaluate2(expression, {}, false);\n}));\n\n// packages/alpinejs/src/directives/x-text.js\ndirective(\"text\", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => {\n  let evaluate2 = evaluateLater2(expression);\n  effect3(() => {\n    evaluate2((value) => {\n      mutateDom(() => {\n        el.textContent = value;\n      });\n    });\n  });\n});\n\n// packages/alpinejs/src/directives/x-html.js\ndirective(\"html\", (el, { expression }, { effect: effect3, evaluateLater: evaluateLater2 }) => {\n  let evaluate2 = evaluateLater2(expression);\n  effect3(() => {\n    evaluate2((value) => {\n      mutateDom(() => {\n        el.innerHTML = value ?? \"\";\n        el._x_ignoreSelf = true;\n        initTree(el);\n        delete el._x_ignoreSelf;\n      });\n    });\n  });\n});\n\n// packages/alpinejs/src/directives/x-bind.js\nmapAttributes(startingWith(\":\", into(prefix(\"bind:\"))));\nvar handler2 = (el, { value, modifiers, expression, original }, { effect: effect3, cleanup: cleanup2 }) => {\n  if (!value) {\n    let bindingProviders = {};\n    injectBindingProviders(bindingProviders);\n    let getBindings = evaluateLater(el, expression);\n    getBindings((bindings) => {\n      applyBindingsObject(el, bindings, original);\n    }, { scope: bindingProviders });\n    return;\n  }\n  if (value === \"key\")\n    return storeKeyForXFor(el, expression);\n  if (el._x_inlineBindings && el._x_inlineBindings[value] && el._x_inlineBindings[value].extract) {\n    return;\n  }\n  let evaluate2 = evaluateLater(el, expression);\n  effect3(() => evaluate2((result) => {\n    if (result === void 0 && typeof expression === \"string\" && expression.match(/\\./)) {\n      result = \"\";\n    }\n    mutateDom(() => bind(el, value, result, modifiers));\n  }));\n  cleanup2(() => {\n    el._x_undoAddedClasses && el._x_undoAddedClasses();\n    el._x_undoAddedStyles && el._x_undoAddedStyles();\n  });\n};\nhandler2.inline = (el, { value, modifiers, expression }) => {\n  if (!value)\n    return;\n  if (!el._x_inlineBindings)\n    el._x_inlineBindings = {};\n  el._x_inlineBindings[value] = { expression, extract: false };\n};\ndirective(\"bind\", handler2);\nfunction storeKeyForXFor(el, expression) {\n  el._x_keyExpression = expression;\n}\n\n// packages/alpinejs/src/directives/x-data.js\naddRootSelector(() => `[${prefix(\"data\")}]`);\ndirective(\"data\", (el, { expression }, { cleanup: cleanup2 }) => {\n  if (shouldSkipRegisteringDataDuringClone(el))\n    return;\n  expression = expression === \"\" ? \"{}\" : expression;\n  let magicContext = {};\n  injectMagics(magicContext, el);\n  let dataProviderContext = {};\n  injectDataProviders(dataProviderContext, magicContext);\n  let data2 = evaluate(el, expression, { scope: dataProviderContext });\n  if (data2 === void 0 || data2 === true)\n    data2 = {};\n  injectMagics(data2, el);\n  let reactiveData = reactive(data2);\n  initInterceptors(reactiveData);\n  let undo = addScopeToNode(el, reactiveData);\n  reactiveData[\"init\"] && evaluate(el, reactiveData[\"init\"]);\n  cleanup2(() => {\n    reactiveData[\"destroy\"] && evaluate(el, reactiveData[\"destroy\"]);\n    undo();\n  });\n});\ninterceptClone((from, to) => {\n  if (from._x_dataStack) {\n    to._x_dataStack = from._x_dataStack;\n    to.setAttribute(\"data-has-alpine-state\", true);\n  }\n});\nfunction shouldSkipRegisteringDataDuringClone(el) {\n  if (!isCloning)\n    return false;\n  if (isCloningLegacy)\n    return true;\n  return el.hasAttribute(\"data-has-alpine-state\");\n}\n\n// packages/alpinejs/src/directives/x-show.js\ndirective(\"show\", (el, { modifiers, expression }, { effect: effect3 }) => {\n  let evaluate2 = evaluateLater(el, expression);\n  if (!el._x_doHide)\n    el._x_doHide = () => {\n      mutateDom(() => {\n        el.style.setProperty(\"display\", \"none\", modifiers.includes(\"important\") ? \"important\" : void 0);\n      });\n    };\n  if (!el._x_doShow)\n    el._x_doShow = () => {\n      mutateDom(() => {\n        if (el.style.length === 1 && el.style.display === \"none\") {\n          el.removeAttribute(\"style\");\n        } else {\n          el.style.removeProperty(\"display\");\n        }\n      });\n    };\n  let hide = () => {\n    el._x_doHide();\n    el._x_isShown = false;\n  };\n  let show = () => {\n    el._x_doShow();\n    el._x_isShown = true;\n  };\n  let clickAwayCompatibleShow = () => setTimeout(show);\n  let toggle = once(\n    (value) => value ? show() : hide(),\n    (value) => {\n      if (typeof el._x_toggleAndCascadeWithTransitions === \"function\") {\n        el._x_toggleAndCascadeWithTransitions(el, value, show, hide);\n      } else {\n        value ? clickAwayCompatibleShow() : hide();\n      }\n    }\n  );\n  let oldValue;\n  let firstTime = true;\n  effect3(() => evaluate2((value) => {\n    if (!firstTime && value === oldValue)\n      return;\n    if (modifiers.includes(\"immediate\"))\n      value ? clickAwayCompatibleShow() : hide();\n    toggle(value);\n    oldValue = value;\n    firstTime = false;\n  }));\n});\n\n// packages/alpinejs/src/directives/x-for.js\ndirective(\"for\", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => {\n  let iteratorNames = parseForExpression(expression);\n  let evaluateItems = evaluateLater(el, iteratorNames.items);\n  let evaluateKey = evaluateLater(\n    el,\n    // the x-bind:key expression is stored for our use instead of evaluated.\n    el._x_keyExpression || \"index\"\n  );\n  el._x_lookup = /* @__PURE__ */ new Map();\n  effect3(() => loop(el, iteratorNames, evaluateItems, evaluateKey));\n  cleanup2(() => {\n    el._x_lookup.forEach(\n      (el2) => mutateDom(() => {\n        destroyTree(el2);\n        el2.remove();\n      })\n    );\n    delete el._x_lookup;\n  });\n});\nfunction refreshScope(scope2) {\n  return (newScope) => {\n    Object.entries(newScope).forEach(([key, value]) => {\n      scope2[key] = value;\n    });\n  };\n}\nfunction loop(templateEl, iteratorNames, evaluateItems, evaluateKey) {\n  evaluateItems((items) => {\n    if (isNumeric3(items))\n      items = Array.from({ length: items }, (_, i) => i + 1);\n    if (items === void 0 || items === null)\n      items = [];\n    if (items instanceof Set)\n      items = Array.from(items);\n    if (items instanceof Map)\n      items = Array.from(items);\n    let oldLookup = templateEl._x_lookup;\n    let lookup = /* @__PURE__ */ new Map();\n    templateEl._x_lookup = lookup;\n    let hasStringKeys = isObject2(items);\n    let scopeEntries = Object.entries(items).map(([index, item]) => {\n      if (!hasStringKeys)\n        index = parseInt(index);\n      let scope2 = getIterationScopeVariables(iteratorNames, item, index, items);\n      let key;\n      evaluateKey((innerKey) => {\n        if (typeof innerKey === \"object\")\n          warn(\"x-for key cannot be an object, it must be a string or an integer\", templateEl);\n        if (oldLookup.has(innerKey)) {\n          lookup.set(innerKey, oldLookup.get(innerKey));\n          oldLookup.delete(innerKey);\n        }\n        key = innerKey;\n      }, { scope: { index, ...scope2 } });\n      return [key, scope2];\n    });\n    mutateDom(() => {\n      oldLookup.forEach((el) => {\n        destroyTree(el);\n        el.remove();\n      });\n      let added = /* @__PURE__ */ new Set();\n      let prev = templateEl;\n      scopeEntries.forEach(([key, scope2]) => {\n        if (lookup.has(key)) {\n          let el = lookup.get(key);\n          el._x_refreshXForScope(scope2);\n          if (prev.nextElementSibling !== el) {\n            if (prev.nextElementSibling)\n              el.replaceWith(prev.nextElementSibling);\n            prev.after(el);\n          }\n          prev = el;\n          if (el._x_currentIfEl) {\n            if (el.nextElementSibling !== el._x_currentIfEl)\n              prev.after(el._x_currentIfEl);\n            prev = el._x_currentIfEl;\n          }\n          return;\n        }\n        if (templateEl.content.children.length > 1)\n          warn(\"x-for templates require a single root element, additional elements will be ignored.\", templateEl);\n        let clone2 = document.importNode(templateEl.content, true).firstElementChild;\n        let reactiveScope = reactive(scope2);\n        addScopeToNode(clone2, reactiveScope, templateEl);\n        clone2._x_refreshXForScope = refreshScope(reactiveScope);\n        lookup.set(key, clone2);\n        added.add(clone2);\n        prev.after(clone2);\n        prev = clone2;\n      });\n      skipDuringClone(() => added.forEach((clone2) => initTree(clone2)))();\n    });\n  });\n}\nfunction parseForExpression(expression) {\n  let forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\n  let stripParensRE = /^\\s*\\(|\\)\\s*$/g;\n  let forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\n  let inMatch = expression.match(forAliasRE);\n  if (!inMatch)\n    return;\n  let res = {};\n  res.items = inMatch[2].trim();\n  let item = inMatch[1].replace(stripParensRE, \"\").trim();\n  let iteratorMatch = item.match(forIteratorRE);\n  if (iteratorMatch) {\n    res.item = item.replace(forIteratorRE, \"\").trim();\n    res.index = iteratorMatch[1].trim();\n    if (iteratorMatch[2]) {\n      res.collection = iteratorMatch[2].trim();\n    }\n  } else {\n    res.item = item;\n  }\n  return res;\n}\nfunction getIterationScopeVariables(iteratorNames, item, index, items) {\n  let scopeVariables = {};\n  if (/^\\[.*\\]$/.test(iteratorNames.item) && Array.isArray(item)) {\n    let names = iteratorNames.item.replace(\"[\", \"\").replace(\"]\", \"\").split(\",\").map((i) => i.trim());\n    names.forEach((name, i) => {\n      scopeVariables[name] = item[i];\n    });\n  } else if (/^\\{.*\\}$/.test(iteratorNames.item) && !Array.isArray(item) && typeof item === \"object\") {\n    let names = iteratorNames.item.replace(\"{\", \"\").replace(\"}\", \"\").split(\",\").map((i) => i.trim());\n    names.forEach((name) => {\n      scopeVariables[name] = item[name];\n    });\n  } else {\n    scopeVariables[iteratorNames.item] = item;\n  }\n  if (iteratorNames.index)\n    scopeVariables[iteratorNames.index] = index;\n  if (iteratorNames.collection)\n    scopeVariables[iteratorNames.collection] = items;\n  return scopeVariables;\n}\nfunction isNumeric3(subject) {\n  return typeof subject !== \"object\" && !isNaN(subject);\n}\nfunction isObject2(subject) {\n  return typeof subject === \"object\" && !Array.isArray(subject);\n}\n\n// packages/alpinejs/src/directives/x-ref.js\nfunction handler3() {\n}\nhandler3.inline = (el, { expression }, { cleanup: cleanup2 }) => {\n  let root = closestRoot(el);\n  if (!root)\n    return;\n  if (!root._x_refs)\n    root._x_refs = {};\n  root._x_refs[expression] = el;\n  cleanup2(() => delete root._x_refs[expression]);\n};\ndirective(\"ref\", handler3);\n\n// packages/alpinejs/src/directives/x-if.js\ndirective(\"if\", (el, { expression }, { effect: effect3, cleanup: cleanup2 }) => {\n  if (el.tagName.toLowerCase() !== \"template\")\n    warn(\"x-if can only be used on a <template> tag\", el);\n  let evaluate2 = evaluateLater(el, expression);\n  let show = () => {\n    if (el._x_currentIfEl)\n      return el._x_currentIfEl;\n    let clone2 = el.content.cloneNode(true).firstElementChild;\n    addScopeToNode(clone2, {}, el);\n    mutateDom(() => {\n      el.after(clone2);\n      skipDuringClone(() => initTree(clone2))();\n    });\n    el._x_currentIfEl = clone2;\n    el._x_undoIf = () => {\n      mutateDom(() => {\n        destroyTree(clone2);\n        clone2.remove();\n      });\n      delete el._x_currentIfEl;\n    };\n    return clone2;\n  };\n  let hide = () => {\n    if (!el._x_undoIf)\n      return;\n    el._x_undoIf();\n    delete el._x_undoIf;\n  };\n  effect3(() => evaluate2((value) => {\n    value ? show() : hide();\n  }));\n  cleanup2(() => el._x_undoIf && el._x_undoIf());\n});\n\n// packages/alpinejs/src/directives/x-id.js\ndirective(\"id\", (el, { expression }, { evaluate: evaluate2 }) => {\n  let names = evaluate2(expression);\n  names.forEach((name) => setIdRoot(el, name));\n});\ninterceptClone((from, to) => {\n  if (from._x_ids) {\n    to._x_ids = from._x_ids;\n  }\n});\n\n// packages/alpinejs/src/directives/x-on.js\nmapAttributes(startingWith(\"@\", into(prefix(\"on:\"))));\ndirective(\"on\", skipDuringClone((el, { value, modifiers, expression }, { cleanup: cleanup2 }) => {\n  let evaluate2 = expression ? evaluateLater(el, expression) : () => {\n  };\n  if (el.tagName.toLowerCase() === \"template\") {\n    if (!el._x_forwardEvents)\n      el._x_forwardEvents = [];\n    if (!el._x_forwardEvents.includes(value))\n      el._x_forwardEvents.push(value);\n  }\n  let removeListener = on(el, value, modifiers, (e) => {\n    evaluate2(() => {\n    }, { scope: { \"$event\": e }, params: [e] });\n  });\n  cleanup2(() => removeListener());\n}));\n\n// packages/alpinejs/src/directives/index.js\nwarnMissingPluginDirective(\"Collapse\", \"collapse\", \"collapse\");\nwarnMissingPluginDirective(\"Intersect\", \"intersect\", \"intersect\");\nwarnMissingPluginDirective(\"Focus\", \"trap\", \"focus\");\nwarnMissingPluginDirective(\"Mask\", \"mask\", \"mask\");\nfunction warnMissingPluginDirective(name, directiveName, slug) {\n  directive(directiveName, (el) => warn(`You can't use [x-${directiveName}] without first installing the \"${name}\" plugin here: https://alpinejs.dev/plugins/${slug}`, el));\n}\n\n// packages/alpinejs/src/index.js\nalpine_default.setEvaluator(normalEvaluator);\nalpine_default.setRawEvaluator(normalRawEvaluator);\nalpine_default.setReactivityEngine({ reactive: reactive2, effect: effect2, release: stop, raw: toRaw });\nvar src_default = alpine_default;\n\n// packages/alpinejs/builds/module.js\nvar module_default = src_default;\nexport {\n  src_default as Alpine,\n  module_default as default\n};\n", "// packages/collapse/src/index.js\nfunction src_default(Alpine) {\n  Alpine.directive(\"collapse\", collapse);\n  collapse.inline = (el, { modifiers }) => {\n    if (!modifiers.includes(\"min\"))\n      return;\n    el._x_doShow = () => {\n    };\n    el._x_doHide = () => {\n    };\n  };\n  function collapse(el, { modifiers }) {\n    let duration = modifierValue(modifiers, \"duration\", 250) / 1e3;\n    let floor = modifierValue(modifiers, \"min\", 0);\n    let fullyHide = !modifiers.includes(\"min\");\n    if (!el._x_isShown)\n      el.style.height = `${floor}px`;\n    if (!el._x_isShown && fullyHide)\n      el.hidden = true;\n    if (!el._x_isShown)\n      el.style.overflow = \"hidden\";\n    let setFunction = (el2, styles) => {\n      let revertFunction = Alpine.setStyles(el2, styles);\n      return styles.height ? () => {\n      } : revertFunction;\n    };\n    let transitionStyles = {\n      transitionProperty: \"height\",\n      transitionDuration: `${duration}s`,\n      transitionTimingFunction: \"cubic-bezier(0.4, 0.0, 0.2, 1)\"\n    };\n    el._x_transition = {\n      in(before = () => {\n      }, after = () => {\n      }) {\n        if (fullyHide)\n          el.hidden = false;\n        if (fullyHide)\n          el.style.display = null;\n        let current = el.getBoundingClientRect().height;\n        el.style.height = \"auto\";\n        let full = el.getBoundingClientRect().height;\n        if (current === full) {\n          current = floor;\n        }\n        Alpine.transition(el, Alpine.setStyles, {\n          during: transitionStyles,\n          start: { height: current + \"px\" },\n          end: { height: full + \"px\" }\n        }, () => el._x_isShown = true, () => {\n          if (Math.abs(el.getBoundingClientRect().height - full) < 1) {\n            el.style.overflow = null;\n          }\n        });\n      },\n      out(before = () => {\n      }, after = () => {\n      }) {\n        let full = el.getBoundingClientRect().height;\n        Alpine.transition(el, setFunction, {\n          during: transitionStyles,\n          start: { height: full + \"px\" },\n          end: { height: floor + \"px\" }\n        }, () => el.style.overflow = \"hidden\", () => {\n          el._x_isShown = false;\n          if (el.style.height == `${floor}px` && fullyHide) {\n            el.style.display = \"none\";\n            el.hidden = true;\n          }\n        });\n      }\n    };\n  }\n}\nfunction modifierValue(modifiers, key, fallback) {\n  if (modifiers.indexOf(key) === -1)\n    return fallback;\n  const rawValue = modifiers[modifiers.indexOf(key) + 1];\n  if (!rawValue)\n    return fallback;\n  if (key === \"duration\") {\n    let match = rawValue.match(/([0-9]+)ms/);\n    if (match)\n      return match[1];\n  }\n  if (key === \"min\") {\n    let match = rawValue.match(/([0-9]+)px/);\n    if (match)\n      return match[1];\n  }\n  return rawValue;\n}\n\n// packages/collapse/builds/module.js\nvar module_default = src_default;\nexport {\n  src_default as collapse,\n  module_default as default\n};\n", "// packages/intersect/src/index.js\nfunction src_default(Alpine) {\n  Alpine.directive(\"intersect\", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {\n    let evaluate = evaluateLater(expression);\n    let options = {\n      rootMargin: getRootMargin(modifiers),\n      threshold: getThreshold(modifiers)\n    };\n    let observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting === (value === \"leave\"))\n          return;\n        evaluate();\n        modifiers.includes(\"once\") && observer.disconnect();\n      });\n    }, options);\n    observer.observe(el);\n    cleanup(() => {\n      observer.disconnect();\n    });\n  }));\n}\nfunction getThreshold(modifiers) {\n  if (modifiers.includes(\"full\"))\n    return 0.99;\n  if (modifiers.includes(\"half\"))\n    return 0.5;\n  if (!modifiers.includes(\"threshold\"))\n    return 0;\n  let threshold = modifiers[modifiers.indexOf(\"threshold\") + 1];\n  if (threshold === \"100\")\n    return 1;\n  if (threshold === \"0\")\n    return 0;\n  return Number(`.${threshold}`);\n}\nfunction getLengthValue(rawValue) {\n  let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/);\n  return match ? match[1] + (match[2] || \"px\") : void 0;\n}\nfunction getRootMargin(modifiers) {\n  const key = \"margin\";\n  const fallback = \"0px 0px 0px 0px\";\n  const index = modifiers.indexOf(key);\n  if (index === -1)\n    return fallback;\n  let values = [];\n  for (let i = 1; i < 5; i++) {\n    values.push(getLengthValue(modifiers[index + i] || \"\"));\n  }\n  values = values.filter((v) => v !== void 0);\n  return values.length ? values.join(\" \").trim() : fallback;\n}\n\n// packages/intersect/builds/module.js\nvar module_default = src_default;\nexport {\n  module_default as default,\n  src_default as intersect\n};\n", "// packages/persist/src/index.js\nfunction src_default(Alpine) {\n  let persist = () => {\n    let alias;\n    let storage;\n    try {\n      storage = localStorage;\n    } catch (e) {\n      console.error(e);\n      console.warn(\"Alpine: $persist is using temporary storage since localStorage is unavailable.\");\n      let dummy = /* @__PURE__ */ new Map();\n      storage = {\n        getItem: dummy.get.bind(dummy),\n        setItem: dummy.set.bind(dummy)\n      };\n    }\n    return Alpine.interceptor((initialValue, getter, setter, path, key) => {\n      let lookup = alias || `_x_${path}`;\n      let initial = storageHas(lookup, storage) ? storageGet(lookup, storage) : initialValue;\n      setter(initial);\n      Alpine.effect(() => {\n        let value = getter();\n        storageSet(lookup, value, storage);\n        setter(value);\n      });\n      return initial;\n    }, (func) => {\n      func.as = (key) => {\n        alias = key;\n        return func;\n      }, func.using = (target) => {\n        storage = target;\n        return func;\n      };\n    });\n  };\n  Object.defineProperty(Alpine, \"$persist\", { get: () => persist() });\n  Alpine.magic(\"persist\", persist);\n  Alpine.persist = (key, { get, set }, storage = localStorage) => {\n    let initial = storageHas(key, storage) ? storageGet(key, storage) : get();\n    set(initial);\n    Alpine.effect(() => {\n      let value = get();\n      storageSet(key, value, storage);\n      set(value);\n    });\n  };\n}\nfunction storageHas(key, storage) {\n  return storage.getItem(key) !== null;\n}\nfunction storageGet(key, storage) {\n  let value = storage.getItem(key);\n  if (value === void 0)\n    return;\n  return JSON.parse(value);\n}\nfunction storageSet(key, value, storage) {\n  storage.setItem(key, JSON.stringify(value));\n}\n\n// packages/persist/builds/module.js\nvar module_default = src_default;\nexport {\n  module_default as default,\n  src_default as persist\n};\n", "export * as core from \"../core/index.js\";\nexport * from \"./schemas.js\";\nexport * from \"./checks.js\";\nexport * from \"./errors.js\";\nexport * from \"./parse.js\";\nexport * from \"./compat.js\";\n// zod-specified\nimport { config } from \"../core/index.js\";\nimport en from \"../locales/en.js\";\nconfig(en());\nexport { globalRegistry, registry, config, $output, $input, $brand, clone, regexes, treeifyError, prettifyError, formatError, flattenError, TimePrecision, util, NEVER, } from \"../core/index.js\";\nexport { toJSONSchema } from \"../core/json-schema-processors.js\";\nexport { fromJSONSchema } from \"./from-json-schema.js\";\nexport * as locales from \"../locales/index.js\";\n// iso\n// must be exported from top-level\n// https://github.com/colinhacks/zod/issues/4491\nexport { ZodISODateTime, ZodISODate, ZodISOTime, ZodISODuration } from \"./iso.js\";\nexport * as iso from \"./iso.js\";\nexport * as coerce from \"./coerce.js\";\n", "export * from \"./core.js\";\nexport * from \"./parse.js\";\nexport * from \"./errors.js\";\nexport * from \"./schemas.js\";\nexport * from \"./checks.js\";\nexport * from \"./versions.js\";\nexport * as util from \"./util.js\";\nexport * as regexes from \"./regexes.js\";\nexport * as locales from \"../locales/index.js\";\nexport * from \"./registries.js\";\nexport * from \"./doc.js\";\nexport * from \"./api.js\";\nexport * from \"./to-json-schema.js\";\nexport { toJSONSchema } from \"./json-schema-processors.js\";\nexport { JSONSchemaGenerator } from \"./json-schema-generator.js\";\nexport * as JSONSchema from \"./json-schema.js\";\n", "var _a;\n/** A special constant with type `never` */\nexport const NEVER = /*@__PURE__*/ Object.freeze({\n    status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n    function init(inst, def) {\n        if (!inst._zod) {\n            Object.defineProperty(inst, \"_zod\", {\n                value: {\n                    def,\n                    constr: _,\n                    traits: new Set(),\n                },\n                enumerable: false,\n            });\n        }\n        if (inst._zod.traits.has(name)) {\n            return;\n        }\n        inst._zod.traits.add(name);\n        initializer(inst, def);\n        // support prototype modifications\n        const proto = _.prototype;\n        const keys = Object.keys(proto);\n        for (let i = 0; i < keys.length; i++) {\n            const k = keys[i];\n            if (!(k in inst)) {\n                inst[k] = proto[k].bind(inst);\n            }\n        }\n    }\n    // doesn't work if Parent has a constructor with arguments\n    const Parent = params?.Parent ?? Object;\n    class Definition extends Parent {\n    }\n    Object.defineProperty(Definition, \"name\", { value: name });\n    function _(def) {\n        var _a;\n        const inst = params?.Parent ? new Definition() : this;\n        init(inst, def);\n        (_a = inst._zod).deferred ?? (_a.deferred = []);\n        for (const fn of inst._zod.deferred) {\n            fn();\n        }\n        return inst;\n    }\n    Object.defineProperty(_, \"init\", { value: init });\n    Object.defineProperty(_, Symbol.hasInstance, {\n        value: (inst) => {\n            if (params?.Parent && inst instanceof params.Parent)\n                return true;\n            return inst?._zod?.traits?.has(name);\n        },\n    });\n    Object.defineProperty(_, \"name\", { value: name });\n    return _;\n}\n//////////////////////////////   UTILITIES   ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n    constructor() {\n        super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n    }\n}\nexport class $ZodEncodeError extends Error {\n    constructor(name) {\n        super(`Encountered unidirectional transform during encode: ${name}`);\n        this.name = \"ZodEncodeError\";\n    }\n}\n(_a = globalThis).__zod_globalConfig ?? (_a.__zod_globalConfig = {});\nexport const globalConfig = globalThis.__zod_globalConfig;\nexport function config(newConfig) {\n    if (newConfig)\n        Object.assign(globalConfig, newConfig);\n    return globalConfig;\n}\n", "import { globalConfig } from \"./core.js\";\n// functions\nexport function assertEqual(val) {\n    return val;\n}\nexport function assertNotEqual(val) {\n    return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n    throw new Error(\"Unexpected value in exhaustive check\");\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n    const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n    const values = Object.entries(entries)\n        .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n        .map(([_, v]) => v);\n    return values;\n}\nexport function joinValues(array, separator = \"|\") {\n    return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n    if (typeof value === \"bigint\")\n        return value.toString();\n    return value;\n}\nexport function cached(getter) {\n    const set = false;\n    return {\n        get value() {\n            if (!set) {\n                const value = getter();\n                Object.defineProperty(this, \"value\", { value });\n                return value;\n            }\n            throw new Error(\"cached value already set\");\n        },\n    };\n}\nexport function nullish(input) {\n    return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n    const start = source.startsWith(\"^\") ? 1 : 0;\n    const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n    return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n    const ratio = val / step;\n    const roundedRatio = Math.round(ratio);\n    // Use a relative epsilon scaled to the magnitude of the result\n    const tolerance = Number.EPSILON * Math.max(Math.abs(ratio), 1);\n    if (Math.abs(ratio - roundedRatio) < tolerance)\n        return 0;\n    return ratio - roundedRatio;\n}\nconst EVALUATING = /* @__PURE__*/ Symbol(\"evaluating\");\nexport function defineLazy(object, key, getter) {\n    let value = undefined;\n    Object.defineProperty(object, key, {\n        get() {\n            if (value === EVALUATING) {\n                // Circular reference detected, return undefined to break the cycle\n                return undefined;\n            }\n            if (value === undefined) {\n                value = EVALUATING;\n                value = getter();\n            }\n            return value;\n        },\n        set(v) {\n            Object.defineProperty(object, key, {\n                value: v,\n                // configurable: true,\n            });\n            // object[key] = v;\n        },\n        configurable: true,\n    });\n}\nexport function objectClone(obj) {\n    return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));\n}\nexport function assignProp(target, prop, value) {\n    Object.defineProperty(target, prop, {\n        value,\n        writable: true,\n        enumerable: true,\n        configurable: true,\n    });\n}\nexport function mergeDefs(...defs) {\n    const mergedDescriptors = {};\n    for (const def of defs) {\n        const descriptors = Object.getOwnPropertyDescriptors(def);\n        Object.assign(mergedDescriptors, descriptors);\n    }\n    return Object.defineProperties({}, mergedDescriptors);\n}\nexport function cloneDef(schema) {\n    return mergeDefs(schema._zod.def);\n}\nexport function getElementAtPath(obj, path) {\n    if (!path)\n        return obj;\n    return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n    const keys = Object.keys(promisesObj);\n    const promises = keys.map((key) => promisesObj[key]);\n    return Promise.all(promises).then((results) => {\n        const resolvedObj = {};\n        for (let i = 0; i < keys.length; i++) {\n            resolvedObj[keys[i]] = results[i];\n        }\n        return resolvedObj;\n    });\n}\nexport function randomString(length = 10) {\n    const chars = \"abcdefghijklmnopqrstuvwxyz\";\n    let str = \"\";\n    for (let i = 0; i < length; i++) {\n        str += chars[Math.floor(Math.random() * chars.length)];\n    }\n    return str;\n}\nexport function esc(str) {\n    return JSON.stringify(str);\n}\nexport function slugify(input) {\n    return input\n        .toLowerCase()\n        .trim()\n        .replace(/[^\\w\\s-]/g, \"\")\n        .replace(/[\\s_-]+/g, \"-\")\n        .replace(/^-+|-+$/g, \"\");\n}\nexport const captureStackTrace = (\"captureStackTrace\" in Error ? Error.captureStackTrace : (..._args) => { });\nexport function isObject(data) {\n    return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = /* @__PURE__*/ cached(() => {\n    // Skip the probe under `jitless`: strict CSPs report the caught `new Function`\n    // as a `securitypolicyviolation` even though the throw is swallowed.\n    if (globalConfig.jitless) {\n        return false;\n    }\n    // @ts-ignore\n    if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n        return false;\n    }\n    try {\n        const F = Function;\n        new F(\"\");\n        return true;\n    }\n    catch (_) {\n        return false;\n    }\n});\nexport function isPlainObject(o) {\n    if (isObject(o) === false)\n        return false;\n    // modified constructor\n    const ctor = o.constructor;\n    if (ctor === undefined)\n        return true;\n    if (typeof ctor !== \"function\")\n        return true;\n    // modified prototype\n    const prot = ctor.prototype;\n    if (isObject(prot) === false)\n        return false;\n    // ctor doesn't have static `isPrototypeOf`\n    if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n        return false;\n    }\n    return true;\n}\nexport function shallowClone(o) {\n    if (isPlainObject(o))\n        return { ...o };\n    if (Array.isArray(o))\n        return [...o];\n    if (o instanceof Map)\n        return new Map(o);\n    if (o instanceof Set)\n        return new Set(o);\n    return o;\n}\nexport function numKeys(data) {\n    let keyCount = 0;\n    for (const key in data) {\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\n            keyCount++;\n        }\n    }\n    return keyCount;\n}\nexport const getParsedType = (data) => {\n    const t = typeof data;\n    switch (t) {\n        case \"undefined\":\n            return \"undefined\";\n        case \"string\":\n            return \"string\";\n        case \"number\":\n            return Number.isNaN(data) ? \"nan\" : \"number\";\n        case \"boolean\":\n            return \"boolean\";\n        case \"function\":\n            return \"function\";\n        case \"bigint\":\n            return \"bigint\";\n        case \"symbol\":\n            return \"symbol\";\n        case \"object\":\n            if (Array.isArray(data)) {\n                return \"array\";\n            }\n            if (data === null) {\n                return \"null\";\n            }\n            if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n                return \"promise\";\n            }\n            if (typeof Map !== \"undefined\" && data instanceof Map) {\n                return \"map\";\n            }\n            if (typeof Set !== \"undefined\" && data instanceof Set) {\n                return \"set\";\n            }\n            if (typeof Date !== \"undefined\" && data instanceof Date) {\n                return \"date\";\n            }\n            // @ts-ignore\n            if (typeof File !== \"undefined\" && data instanceof File) {\n                return \"file\";\n            }\n            return \"object\";\n        default:\n            throw new Error(`Unknown data type: ${t}`);\n    }\n};\nexport const propertyKeyTypes = /* @__PURE__*/ new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = /* @__PURE__*/ new Set([\n    \"string\",\n    \"number\",\n    \"bigint\",\n    \"boolean\",\n    \"symbol\",\n    \"undefined\",\n]);\nexport function escapeRegex(str) {\n    return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n    const cl = new inst._zod.constr(def ?? inst._zod.def);\n    if (!def || params?.parent)\n        cl._zod.parent = inst;\n    return cl;\n}\nexport function normalizeParams(_params) {\n    const params = _params;\n    if (!params)\n        return {};\n    if (typeof params === \"string\")\n        return { error: () => params };\n    if (params?.message !== undefined) {\n        if (params?.error !== undefined)\n            throw new Error(\"Cannot specify both `message` and `error` params\");\n        params.error = params.message;\n    }\n    delete params.message;\n    if (typeof params.error === \"string\")\n        return { ...params, error: () => params.error };\n    return params;\n}\nexport function createTransparentProxy(getter) {\n    let target;\n    return new Proxy({}, {\n        get(_, prop, receiver) {\n            target ?? (target = getter());\n            return Reflect.get(target, prop, receiver);\n        },\n        set(_, prop, value, receiver) {\n            target ?? (target = getter());\n            return Reflect.set(target, prop, value, receiver);\n        },\n        has(_, prop) {\n            target ?? (target = getter());\n            return Reflect.has(target, prop);\n        },\n        deleteProperty(_, prop) {\n            target ?? (target = getter());\n            return Reflect.deleteProperty(target, prop);\n        },\n        ownKeys(_) {\n            target ?? (target = getter());\n            return Reflect.ownKeys(target);\n        },\n        getOwnPropertyDescriptor(_, prop) {\n            target ?? (target = getter());\n            return Reflect.getOwnPropertyDescriptor(target, prop);\n        },\n        defineProperty(_, prop, descriptor) {\n            target ?? (target = getter());\n            return Reflect.defineProperty(target, prop, descriptor);\n        },\n    });\n}\nexport function stringifyPrimitive(value) {\n    if (typeof value === \"bigint\")\n        return value.toString() + \"n\";\n    if (typeof value === \"string\")\n        return `\"${value}\"`;\n    return `${value}`;\n}\nexport function optionalKeys(shape) {\n    return Object.keys(shape).filter((k) => {\n        return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n    });\n}\nexport const NUMBER_FORMAT_RANGES = {\n    safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n    int32: [-2147483648, 2147483647],\n    uint32: [0, 4294967295],\n    float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n    float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n    int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n    uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n    const currDef = schema._zod.def;\n    const checks = currDef.checks;\n    const hasChecks = checks && checks.length > 0;\n    if (hasChecks) {\n        throw new Error(\".pick() cannot be used on object schemas containing refinements\");\n    }\n    const def = mergeDefs(schema._zod.def, {\n        get shape() {\n            const newShape = {};\n            for (const key in mask) {\n                if (!(key in currDef.shape)) {\n                    throw new Error(`Unrecognized key: \"${key}\"`);\n                }\n                if (!mask[key])\n                    continue;\n                newShape[key] = currDef.shape[key];\n            }\n            assignProp(this, \"shape\", newShape); // self-caching\n            return newShape;\n        },\n        checks: [],\n    });\n    return clone(schema, def);\n}\nexport function omit(schema, mask) {\n    const currDef = schema._zod.def;\n    const checks = currDef.checks;\n    const hasChecks = checks && checks.length > 0;\n    if (hasChecks) {\n        throw new Error(\".omit() cannot be used on object schemas containing refinements\");\n    }\n    const def = mergeDefs(schema._zod.def, {\n        get shape() {\n            const newShape = { ...schema._zod.def.shape };\n            for (const key in mask) {\n                if (!(key in currDef.shape)) {\n                    throw new Error(`Unrecognized key: \"${key}\"`);\n                }\n                if (!mask[key])\n                    continue;\n                delete newShape[key];\n            }\n            assignProp(this, \"shape\", newShape); // self-caching\n            return newShape;\n        },\n        checks: [],\n    });\n    return clone(schema, def);\n}\nexport function extend(schema, shape) {\n    if (!isPlainObject(shape)) {\n        throw new Error(\"Invalid input to extend: expected a plain object\");\n    }\n    const checks = schema._zod.def.checks;\n    const hasChecks = checks && checks.length > 0;\n    if (hasChecks) {\n        // Only throw if new shape overlaps with existing shape\n        // Use getOwnPropertyDescriptor to check key existence without accessing values\n        const existingShape = schema._zod.def.shape;\n        for (const key in shape) {\n            if (Object.getOwnPropertyDescriptor(existingShape, key) !== undefined) {\n                throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\");\n            }\n        }\n    }\n    const def = mergeDefs(schema._zod.def, {\n        get shape() {\n            const _shape = { ...schema._zod.def.shape, ...shape };\n            assignProp(this, \"shape\", _shape); // self-caching\n            return _shape;\n        },\n    });\n    return clone(schema, def);\n}\nexport function safeExtend(schema, shape) {\n    if (!isPlainObject(shape)) {\n        throw new Error(\"Invalid input to safeExtend: expected a plain object\");\n    }\n    const def = mergeDefs(schema._zod.def, {\n        get shape() {\n            const _shape = { ...schema._zod.def.shape, ...shape };\n            assignProp(this, \"shape\", _shape); // self-caching\n            return _shape;\n        },\n    });\n    return clone(schema, def);\n}\nexport function merge(a, b) {\n    if (a._zod.def.checks?.length) {\n        throw new Error(\".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.\");\n    }\n    const def = mergeDefs(a._zod.def, {\n        get shape() {\n            const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n            assignProp(this, \"shape\", _shape); // self-caching\n            return _shape;\n        },\n        get catchall() {\n            return b._zod.def.catchall;\n        },\n        checks: b._zod.def.checks ?? [],\n    });\n    return clone(a, def);\n}\nexport function partial(Class, schema, mask) {\n    const currDef = schema._zod.def;\n    const checks = currDef.checks;\n    const hasChecks = checks && checks.length > 0;\n    if (hasChecks) {\n        throw new Error(\".partial() cannot be used on object schemas containing refinements\");\n    }\n    const def = mergeDefs(schema._zod.def, {\n        get shape() {\n            const oldShape = schema._zod.def.shape;\n            const shape = { ...oldShape };\n            if (mask) {\n                for (const key in mask) {\n                    if (!(key in oldShape)) {\n                        throw new Error(`Unrecognized key: \"${key}\"`);\n                    }\n                    if (!mask[key])\n                        continue;\n                    // if (oldShape[key]!._zod.optin === \"optional\") continue;\n                    shape[key] = Class\n                        ? new Class({\n                            type: \"optional\",\n                            innerType: oldShape[key],\n                        })\n                        : oldShape[key];\n                }\n            }\n            else {\n                for (const key in oldShape) {\n                    // if (oldShape[key]!._zod.optin === \"optional\") continue;\n                    shape[key] = Class\n                        ? new Class({\n                            type: \"optional\",\n                            innerType: oldShape[key],\n                        })\n                        : oldShape[key];\n                }\n            }\n            assignProp(this, \"shape\", shape); // self-caching\n            return shape;\n        },\n        checks: [],\n    });\n    return clone(schema, def);\n}\nexport function required(Class, schema, mask) {\n    const def = mergeDefs(schema._zod.def, {\n        get shape() {\n            const oldShape = schema._zod.def.shape;\n            const shape = { ...oldShape };\n            if (mask) {\n                for (const key in mask) {\n                    if (!(key in shape)) {\n                        throw new Error(`Unrecognized key: \"${key}\"`);\n                    }\n                    if (!mask[key])\n                        continue;\n                    // overwrite with non-optional\n                    shape[key] = new Class({\n                        type: \"nonoptional\",\n                        innerType: oldShape[key],\n                    });\n                }\n            }\n            else {\n                for (const key in oldShape) {\n                    // overwrite with non-optional\n                    shape[key] = new Class({\n                        type: \"nonoptional\",\n                        innerType: oldShape[key],\n                    });\n                }\n            }\n            assignProp(this, \"shape\", shape); // self-caching\n            return shape;\n        },\n    });\n    return clone(schema, def);\n}\n// invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom\nexport function aborted(x, startIndex = 0) {\n    if (x.aborted === true)\n        return true;\n    for (let i = startIndex; i < x.issues.length; i++) {\n        if (x.issues[i]?.continue !== true) {\n            return true;\n        }\n    }\n    return false;\n}\n// Checks for explicit abort (continue === false), as opposed to implicit abort (continue === undefined).\n// Used to respect `abort: true` in .refine() even for checks that have a `when` function.\nexport function explicitlyAborted(x, startIndex = 0) {\n    if (x.aborted === true)\n        return true;\n    for (let i = startIndex; i < x.issues.length; i++) {\n        if (x.issues[i]?.continue === false) {\n            return true;\n        }\n    }\n    return false;\n}\nexport function prefixIssues(path, issues) {\n    return issues.map((iss) => {\n        var _a;\n        (_a = iss).path ?? (_a.path = []);\n        iss.path.unshift(path);\n        return iss;\n    });\n}\nexport function unwrapMessage(message) {\n    return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n    const message = iss.message\n        ? iss.message\n        : (unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n            unwrapMessage(ctx?.error?.(iss)) ??\n            unwrapMessage(config.customError?.(iss)) ??\n            unwrapMessage(config.localeError?.(iss)) ??\n            \"Invalid input\");\n    const { inst: _inst, continue: _continue, input: _input, ...rest } = iss;\n    rest.path ?? (rest.path = []);\n    rest.message = message;\n    if (ctx?.reportInput) {\n        rest.input = _input;\n    }\n    return rest;\n}\nexport function getSizableOrigin(input) {\n    if (input instanceof Set)\n        return \"set\";\n    if (input instanceof Map)\n        return \"map\";\n    // @ts-ignore\n    if (input instanceof File)\n        return \"file\";\n    return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n    if (Array.isArray(input))\n        return \"array\";\n    if (typeof input === \"string\")\n        return \"string\";\n    return \"unknown\";\n}\nexport function parsedType(data) {\n    const t = typeof data;\n    switch (t) {\n        case \"number\": {\n            return Number.isNaN(data) ? \"nan\" : \"number\";\n        }\n        case \"object\": {\n            if (data === null) {\n                return \"null\";\n            }\n            if (Array.isArray(data)) {\n                return \"array\";\n            }\n            const obj = data;\n            if (obj && Object.getPrototypeOf(obj) !== Object.prototype && \"constructor\" in obj && obj.constructor) {\n                return obj.constructor.name;\n            }\n        }\n    }\n    return t;\n}\nexport function issue(...args) {\n    const [iss, input, inst] = args;\n    if (typeof iss === \"string\") {\n        return {\n            message: iss,\n            code: \"custom\",\n            input,\n            inst,\n        };\n    }\n    return { ...iss };\n}\nexport function cleanEnum(obj) {\n    return Object.entries(obj)\n        .filter(([k, _]) => {\n        // return true if NaN, meaning it's not a number, thus a string key\n        return Number.isNaN(Number.parseInt(k, 10));\n    })\n        .map((el) => el[1]);\n}\n// Codec utility functions\nexport function base64ToUint8Array(base64) {\n    const binaryString = atob(base64);\n    const bytes = new Uint8Array(binaryString.length);\n    for (let i = 0; i < binaryString.length; i++) {\n        bytes[i] = binaryString.charCodeAt(i);\n    }\n    return bytes;\n}\nexport function uint8ArrayToBase64(bytes) {\n    let binaryString = \"\";\n    for (let i = 0; i < bytes.length; i++) {\n        binaryString += String.fromCharCode(bytes[i]);\n    }\n    return btoa(binaryString);\n}\nexport function base64urlToUint8Array(base64url) {\n    const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n    return base64ToUint8Array(base64 + padding);\n}\nexport function uint8ArrayToBase64url(bytes) {\n    return uint8ArrayToBase64(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\nexport function hexToUint8Array(hex) {\n    const cleanHex = hex.replace(/^0x/, \"\");\n    if (cleanHex.length % 2 !== 0) {\n        throw new Error(\"Invalid hex string length\");\n    }\n    const bytes = new Uint8Array(cleanHex.length / 2);\n    for (let i = 0; i < cleanHex.length; i += 2) {\n        bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);\n    }\n    return bytes;\n}\nexport function uint8ArrayToHex(bytes) {\n    return Array.from(bytes)\n        .map((b) => b.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n}\n// instanceof\nexport class Class {\n    constructor(..._args) { }\n}\n", "import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n    inst.name = \"$ZodError\";\n    Object.defineProperty(inst, \"_zod\", {\n        value: inst._zod,\n        enumerable: false,\n    });\n    Object.defineProperty(inst, \"issues\", {\n        value: def,\n        enumerable: false,\n    });\n    inst.message = JSON.stringify(def, util.jsonStringifyReplacer, 2);\n    Object.defineProperty(inst, \"toString\", {\n        value: () => inst.message,\n        enumerable: false,\n    });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n    const fieldErrors = {};\n    const formErrors = [];\n    for (const sub of error.issues) {\n        if (sub.path.length > 0) {\n            fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n            fieldErrors[sub.path[0]].push(mapper(sub));\n        }\n        else {\n            formErrors.push(mapper(sub));\n        }\n    }\n    return { formErrors, fieldErrors };\n}\nexport function formatError(error, mapper = (issue) => issue.message) {\n    const fieldErrors = { _errors: [] };\n    const processError = (error, path = []) => {\n        for (const issue of error.issues) {\n            if (issue.code === \"invalid_union\" && issue.errors.length) {\n                issue.errors.map((issues) => processError({ issues }, [...path, ...issue.path]));\n            }\n            else if (issue.code === \"invalid_key\") {\n                processError({ issues: issue.issues }, [...path, ...issue.path]);\n            }\n            else if (issue.code === \"invalid_element\") {\n                processError({ issues: issue.issues }, [...path, ...issue.path]);\n            }\n            else {\n                const fullpath = [...path, ...issue.path];\n                if (fullpath.length === 0) {\n                    fieldErrors._errors.push(mapper(issue));\n                }\n                else {\n                    let curr = fieldErrors;\n                    let i = 0;\n                    while (i < fullpath.length) {\n                        const el = fullpath[i];\n                        const terminal = i === fullpath.length - 1;\n                        if (!terminal) {\n                            curr[el] = curr[el] || { _errors: [] };\n                        }\n                        else {\n                            curr[el] = curr[el] || { _errors: [] };\n                            curr[el]._errors.push(mapper(issue));\n                        }\n                        curr = curr[el];\n                        i++;\n                    }\n                }\n            }\n        }\n    };\n    processError(error);\n    return fieldErrors;\n}\nexport function treeifyError(error, mapper = (issue) => issue.message) {\n    const result = { errors: [] };\n    const processError = (error, path = []) => {\n        var _a, _b;\n        for (const issue of error.issues) {\n            if (issue.code === \"invalid_union\" && issue.errors.length) {\n                // regular union error\n                issue.errors.map((issues) => processError({ issues }, [...path, ...issue.path]));\n            }\n            else if (issue.code === \"invalid_key\") {\n                processError({ issues: issue.issues }, [...path, ...issue.path]);\n            }\n            else if (issue.code === \"invalid_element\") {\n                processError({ issues: issue.issues }, [...path, ...issue.path]);\n            }\n            else {\n                const fullpath = [...path, ...issue.path];\n                if (fullpath.length === 0) {\n                    result.errors.push(mapper(issue));\n                    continue;\n                }\n                let curr = result;\n                let i = 0;\n                while (i < fullpath.length) {\n                    const el = fullpath[i];\n                    const terminal = i === fullpath.length - 1;\n                    if (typeof el === \"string\") {\n                        curr.properties ?? (curr.properties = {});\n                        (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n                        curr = curr.properties[el];\n                    }\n                    else {\n                        curr.items ?? (curr.items = []);\n                        (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n                        curr = curr.items[el];\n                    }\n                    if (terminal) {\n                        curr.errors.push(mapper(issue));\n                    }\n                    i++;\n                }\n            }\n        }\n    };\n    processError(error);\n    return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n *   issues: [\n *     {\n *       expected: 'string',\n *       code: 'invalid_type',\n *       path: [ 'username' ],\n *       message: 'Invalid input: expected string'\n *     },\n *     {\n *       expected: 'number',\n *       code: 'invalid_type',\n *       path: [ 'favoriteNumbers', 1 ],\n *       message: 'Invalid input: expected number'\n *     }\n *   ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n *   \u2716 Expected number, received string at \"username\n * favoriteNumbers[0]\n *   \u2716 Invalid input: expected number\n * ```\n */\nexport function toDotPath(_path) {\n    const segs = [];\n    const path = _path.map((seg) => (typeof seg === \"object\" ? seg.key : seg));\n    for (const seg of path) {\n        if (typeof seg === \"number\")\n            segs.push(`[${seg}]`);\n        else if (typeof seg === \"symbol\")\n            segs.push(`[${JSON.stringify(String(seg))}]`);\n        else if (/[^\\w$]/.test(seg))\n            segs.push(`[${JSON.stringify(seg)}]`);\n        else {\n            if (segs.length)\n                segs.push(\".\");\n            segs.push(seg);\n        }\n    }\n    return segs.join(\"\");\n}\nexport function prettifyError(error) {\n    const lines = [];\n    // sort by path length\n    const issues = [...error.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length);\n    // Process each issue\n    for (const issue of issues) {\n        lines.push(`\u2716 ${issue.message}`);\n        if (issue.path?.length)\n            lines.push(`  \u2192 at ${toDotPath(issue.path)}`);\n    }\n    // Convert Map to formatted string\n    return lines.join(\"\\n\");\n}\n", "import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n    const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n    const result = schema._zod.run({ value, issues: [] }, ctx);\n    if (result instanceof Promise) {\n        throw new core.$ZodAsyncError();\n    }\n    if (result.issues.length) {\n        const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n        util.captureStackTrace(e, _params?.callee);\n        throw e;\n    }\n    return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n    const ctx = _ctx ? { ..._ctx, async: true } : { async: true };\n    let result = schema._zod.run({ value, issues: [] }, ctx);\n    if (result instanceof Promise)\n        result = await result;\n    if (result.issues.length) {\n        const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n        util.captureStackTrace(e, params?.callee);\n        throw e;\n    }\n    return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n    const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n    const result = schema._zod.run({ value, issues: [] }, ctx);\n    if (result instanceof Promise) {\n        throw new core.$ZodAsyncError();\n    }\n    return result.issues.length\n        ? {\n            success: false,\n            error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n        }\n        : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n    const ctx = _ctx ? { ..._ctx, async: true } : { async: true };\n    let result = schema._zod.run({ value, issues: [] }, ctx);\n    if (result instanceof Promise)\n        result = await result;\n    return result.issues.length\n        ? {\n            success: false,\n            error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n        }\n        : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\nexport const _encode = (_Err) => (schema, value, _ctx) => {\n    const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n    return _parse(_Err)(schema, value, ctx);\n};\nexport const encode = /* @__PURE__*/ _encode(errors.$ZodRealError);\nexport const _decode = (_Err) => (schema, value, _ctx) => {\n    return _parse(_Err)(schema, value, _ctx);\n};\nexport const decode = /* @__PURE__*/ _decode(errors.$ZodRealError);\nexport const _encodeAsync = (_Err) => async (schema, value, _ctx) => {\n    const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n    return _parseAsync(_Err)(schema, value, ctx);\n};\nexport const encodeAsync = /* @__PURE__*/ _encodeAsync(errors.$ZodRealError);\nexport const _decodeAsync = (_Err) => async (schema, value, _ctx) => {\n    return _parseAsync(_Err)(schema, value, _ctx);\n};\nexport const decodeAsync = /* @__PURE__*/ _decodeAsync(errors.$ZodRealError);\nexport const _safeEncode = (_Err) => (schema, value, _ctx) => {\n    const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n    return _safeParse(_Err)(schema, value, ctx);\n};\nexport const safeEncode = /* @__PURE__*/ _safeEncode(errors.$ZodRealError);\nexport const _safeDecode = (_Err) => (schema, value, _ctx) => {\n    return _safeParse(_Err)(schema, value, _ctx);\n};\nexport const safeDecode = /* @__PURE__*/ _safeDecode(errors.$ZodRealError);\nexport const _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => {\n    const ctx = _ctx ? { ..._ctx, direction: \"backward\" } : { direction: \"backward\" };\n    return _safeParseAsync(_Err)(schema, value, ctx);\n};\nexport const safeEncodeAsync = /* @__PURE__*/ _safeEncodeAsync(errors.$ZodRealError);\nexport const _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {\n    return _safeParseAsync(_Err)(schema, value, _ctx);\n};\nexport const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync(errors.$ZodRealError);\n", "import * as util from \"./util.js\";\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link cuid2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport const cuid = /^[cC][0-9a-z]{6,}$/;\nexport const cuid2 = /^[0-9a-z]+$/;\nexport const ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;\nexport const xid = /^[0-9a-vA-V]{20}$/;\nexport const ksuid = /^[A-Za-z0-9]{27}$/;\nexport const nanoid = /^[a-zA-Z0-9_-]{21}$/;\n/** ISO 8601-1 duration regex. Does not support the 8601-2 extensions like negative durations or fractional/negative components. */\nexport const duration = /^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$/;\n/** Implements ISO 8601-2 extensions like explicit +- prefixes, mixing weeks with other units, and fractional/negative components. */\nexport const extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n/** A regex for any UUID-like identifier: 8-4-4-4-12 hex pattern */\nexport const guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n/** Returns a regex for validating an RFC 9562/4122 UUID.\n *\n * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */\nexport const uuid = (version) => {\n    if (!version)\n        return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;\n    return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);\n};\nexport const uuid4 = /*@__PURE__*/ uuid(4);\nexport const uuid6 = /*@__PURE__*/ uuid(6);\nexport const uuid7 = /*@__PURE__*/ uuid(7);\n/** Practical email validation */\nexport const email = /^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/;\n/** Equivalent to the HTML5 input[type=email] validation implemented by browsers. Source: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email */\nexport const html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n/** The classic emailregex.com regex for RFC 5322-compliant emails */\nexport const rfc5322Email = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/** A loose regex that allows Unicode characters, enforces length limits, and that's about it. */\nexport const unicodeEmail = /^[^\\s@\"]{1,64}@[^\\s@]{1,255}$/u;\nexport const idnEmail = unicodeEmail;\nexport const browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emoji = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nexport function emoji() {\n    return new RegExp(_emoji, \"u\");\n}\nexport const ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nexport const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;\nexport const mac = (delimiter) => {\n    const escapedDelim = util.escapeRegex(delimiter ?? \":\");\n    return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);\n};\nexport const cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$/;\nexport const cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nexport const base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;\nexport const base64url = /^[A-Za-z0-9_-]*$/;\n// based on https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address\n// export const hostname: RegExp = /^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$/;\nexport const hostname = /^(?=.{1,253}\\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\\.?$/;\nexport const domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/;\nexport const httpProtocol = /^https?$/;\n// https://blog.stevenlevithan.com/archives/validate-phone-number#r4-3 (regex sans spaces)\n// E.164: leading digit must be 1-9; total digits (excluding '+') between 7-15\nexport const e164 = /^\\+[1-9]\\d{6,14}$/;\n// const dateSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateSource = `(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))`;\nexport const date = /*@__PURE__*/ new RegExp(`^${dateSource}$`);\nfunction timeSource(args) {\n    const hhmm = `(?:[01]\\\\d|2[0-3]):[0-5]\\\\d`;\n    const regex = typeof args.precision === \"number\"\n        ? args.precision === -1\n            ? `${hhmm}`\n            : args.precision === 0\n                ? `${hhmm}:[0-5]\\\\d`\n                : `${hhmm}:[0-5]\\\\d\\\\.\\\\d{${args.precision}}`\n        : `${hhmm}(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?`;\n    return regex;\n}\nexport function time(args) {\n    return new RegExp(`^${timeSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetime(args) {\n    const time = timeSource({ precision: args.precision });\n    const opts = [\"Z\"];\n    if (args.local)\n        opts.push(\"\");\n    // if (args.offset) opts.push(`([+-]\\\\d{2}:\\\\d{2})`);\n    if (args.offset)\n        opts.push(`([+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)`);\n    const timeRegex = `${time}(?:${opts.join(\"|\")})`;\n    return new RegExp(`^${dateSource}T(?:${timeRegex})$`);\n}\nexport const string = (params) => {\n    const regex = params ? `[\\\\s\\\\S]{${params?.minimum ?? 0},${params?.maximum ?? \"\"}}` : `[\\\\s\\\\S]*`;\n    return new RegExp(`^${regex}$`);\n};\nexport const bigint = /^-?\\d+n?$/;\nexport const integer = /^-?\\d+$/;\nexport const number = /^-?\\d+(?:\\.\\d+)?$/;\nexport const boolean = /^(?:true|false)$/i;\nconst _null = /^null$/i;\nexport { _null as null };\nconst _undefined = /^undefined$/i;\nexport { _undefined as undefined };\n// regex for string with no uppercase letters\nexport const lowercase = /^[^A-Z]*$/;\n// regex for string with no lowercase letters\nexport const uppercase = /^[^a-z]*$/;\n// regex for hexadecimal strings (any length)\nexport const hex = /^[0-9a-fA-F]*$/;\n// Hash regexes for different algorithms and encodings\n// Helper function to create base64 regex with exact length and padding\nfunction fixedBase64(bodyLength, padding) {\n    return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`);\n}\n// Helper function to create base64url regex with exact length (no padding)\nfunction fixedBase64url(length) {\n    return new RegExp(`^[A-Za-z0-9_-]{${length}}$`);\n}\n// MD5 (16 bytes): base64 = 24 chars total (22 + \"==\")\nexport const md5_hex = /^[0-9a-fA-F]{32}$/;\nexport const md5_base64 = /*@__PURE__*/ fixedBase64(22, \"==\");\nexport const md5_base64url = /*@__PURE__*/ fixedBase64url(22);\n// SHA1 (20 bytes): base64 = 28 chars total (27 + \"=\")\nexport const sha1_hex = /^[0-9a-fA-F]{40}$/;\nexport const sha1_base64 = /*@__PURE__*/ fixedBase64(27, \"=\");\nexport const sha1_base64url = /*@__PURE__*/ fixedBase64url(27);\n// SHA256 (32 bytes): base64 = 44 chars total (43 + \"=\")\nexport const sha256_hex = /^[0-9a-fA-F]{64}$/;\nexport const sha256_base64 = /*@__PURE__*/ fixedBase64(43, \"=\");\nexport const sha256_base64url = /*@__PURE__*/ fixedBase64url(43);\n// SHA384 (48 bytes): base64 = 64 chars total (no padding)\nexport const sha384_hex = /^[0-9a-fA-F]{96}$/;\nexport const sha384_base64 = /*@__PURE__*/ fixedBase64(64, \"\");\nexport const sha384_base64url = /*@__PURE__*/ fixedBase64url(64);\n// SHA512 (64 bytes): base64 = 88 chars total (86 + \"==\")\nexport const sha512_hex = /^[0-9a-fA-F]{128}$/;\nexport const sha512_base64 = /*@__PURE__*/ fixedBase64(86, \"==\");\nexport const sha512_base64url = /*@__PURE__*/ fixedBase64url(86);\n", "// import { $ZodType } from \"./schemas.js\";\nimport * as core from \"./core.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nexport const $ZodCheck = /*@__PURE__*/ core.$constructor(\"$ZodCheck\", (inst, def) => {\n    var _a;\n    inst._zod ?? (inst._zod = {});\n    inst._zod.def = def;\n    (_a = inst._zod).onattach ?? (_a.onattach = []);\n});\nconst numericOriginMap = {\n    number: \"number\",\n    bigint: \"bigint\",\n    object: \"date\",\n};\nexport const $ZodCheckLessThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckLessThan\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    const origin = numericOriginMap[typeof def.value];\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY;\n        if (def.value < curr) {\n            if (def.inclusive)\n                bag.maximum = def.value;\n            else\n                bag.exclusiveMaximum = def.value;\n        }\n    });\n    inst._zod.check = (payload) => {\n        if (def.inclusive ? payload.value <= def.value : payload.value < def.value) {\n            return;\n        }\n        payload.issues.push({\n            origin,\n            code: \"too_big\",\n            maximum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n            input: payload.value,\n            inclusive: def.inclusive,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckGreaterThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckGreaterThan\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    const origin = numericOriginMap[typeof def.value];\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY;\n        if (def.value > curr) {\n            if (def.inclusive)\n                bag.minimum = def.value;\n            else\n                bag.exclusiveMinimum = def.value;\n        }\n    });\n    inst._zod.check = (payload) => {\n        if (def.inclusive ? payload.value >= def.value : payload.value > def.value) {\n            return;\n        }\n        payload.issues.push({\n            origin,\n            code: \"too_small\",\n            minimum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n            input: payload.value,\n            inclusive: def.inclusive,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckMultipleOf = \n/*@__PURE__*/ core.$constructor(\"$ZodCheckMultipleOf\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    inst._zod.onattach.push((inst) => {\n        var _a;\n        (_a = inst._zod.bag).multipleOf ?? (_a.multipleOf = def.value);\n    });\n    inst._zod.check = (payload) => {\n        if (typeof payload.value !== typeof def.value)\n            throw new Error(\"Cannot mix number and bigint in multiple_of check.\");\n        const isMultiple = typeof payload.value === \"bigint\"\n            ? payload.value % def.value === BigInt(0)\n            : util.floatSafeRemainder(payload.value, def.value) === 0;\n        if (isMultiple)\n            return;\n        payload.issues.push({\n            origin: typeof payload.value,\n            code: \"not_multiple_of\",\n            divisor: def.value,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckNumberFormat\", (inst, def) => {\n    $ZodCheck.init(inst, def); // no format checks\n    def.format = def.format || \"float64\";\n    const isInt = def.format?.includes(\"int\");\n    const origin = isInt ? \"int\" : \"number\";\n    const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format];\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.format = def.format;\n        bag.minimum = minimum;\n        bag.maximum = maximum;\n        if (isInt)\n            bag.pattern = regexes.integer;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        if (isInt) {\n            if (!Number.isInteger(input)) {\n                // invalid_format issue\n                // payload.issues.push({\n                //   expected: def.format,\n                //   format: def.format,\n                //   code: \"invalid_format\",\n                //   input,\n                //   inst,\n                // });\n                // invalid_type issue\n                payload.issues.push({\n                    expected: origin,\n                    format: def.format,\n                    code: \"invalid_type\",\n                    continue: false,\n                    input,\n                    inst,\n                });\n                return;\n                // not_multiple_of issue\n                // payload.issues.push({\n                //   code: \"not_multiple_of\",\n                //   origin: \"number\",\n                //   input,\n                //   inst,\n                //   divisor: 1,\n                // });\n            }\n            if (!Number.isSafeInteger(input)) {\n                if (input > 0) {\n                    // too_big\n                    payload.issues.push({\n                        input,\n                        code: \"too_big\",\n                        maximum: Number.MAX_SAFE_INTEGER,\n                        note: \"Integers must be within the safe integer range.\",\n                        inst,\n                        origin,\n                        inclusive: true,\n                        continue: !def.abort,\n                    });\n                }\n                else {\n                    // too_small\n                    payload.issues.push({\n                        input,\n                        code: \"too_small\",\n                        minimum: Number.MIN_SAFE_INTEGER,\n                        note: \"Integers must be within the safe integer range.\",\n                        inst,\n                        origin,\n                        inclusive: true,\n                        continue: !def.abort,\n                    });\n                }\n                return;\n            }\n        }\n        if (input < minimum) {\n            payload.issues.push({\n                origin: \"number\",\n                input,\n                code: \"too_small\",\n                minimum,\n                inclusive: true,\n                inst,\n                continue: !def.abort,\n            });\n        }\n        if (input > maximum) {\n            payload.issues.push({\n                origin: \"number\",\n                input,\n                code: \"too_big\",\n                maximum,\n                inclusive: true,\n                inst,\n                continue: !def.abort,\n            });\n        }\n    };\n});\nexport const $ZodCheckBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckBigIntFormat\", (inst, def) => {\n    $ZodCheck.init(inst, def); // no format checks\n    const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format];\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.format = def.format;\n        bag.minimum = minimum;\n        bag.maximum = maximum;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        if (input < minimum) {\n            payload.issues.push({\n                origin: \"bigint\",\n                input,\n                code: \"too_small\",\n                minimum: minimum,\n                inclusive: true,\n                inst,\n                continue: !def.abort,\n            });\n        }\n        if (input > maximum) {\n            payload.issues.push({\n                origin: \"bigint\",\n                input,\n                code: \"too_big\",\n                maximum,\n                inclusive: true,\n                inst,\n                continue: !def.abort,\n            });\n        }\n    };\n});\nexport const $ZodCheckMaxSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxSize\", (inst, def) => {\n    var _a;\n    $ZodCheck.init(inst, def);\n    (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n        const val = payload.value;\n        return !util.nullish(val) && val.size !== undefined;\n    });\n    inst._zod.onattach.push((inst) => {\n        const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n        if (def.maximum < curr)\n            inst._zod.bag.maximum = def.maximum;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const size = input.size;\n        if (size <= def.maximum)\n            return;\n        payload.issues.push({\n            origin: util.getSizableOrigin(input),\n            code: \"too_big\",\n            maximum: def.maximum,\n            inclusive: true,\n            input,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckMinSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinSize\", (inst, def) => {\n    var _a;\n    $ZodCheck.init(inst, def);\n    (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n        const val = payload.value;\n        return !util.nullish(val) && val.size !== undefined;\n    });\n    inst._zod.onattach.push((inst) => {\n        const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n        if (def.minimum > curr)\n            inst._zod.bag.minimum = def.minimum;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const size = input.size;\n        if (size >= def.minimum)\n            return;\n        payload.issues.push({\n            origin: util.getSizableOrigin(input),\n            code: \"too_small\",\n            minimum: def.minimum,\n            inclusive: true,\n            input,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckSizeEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckSizeEquals\", (inst, def) => {\n    var _a;\n    $ZodCheck.init(inst, def);\n    (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n        const val = payload.value;\n        return !util.nullish(val) && val.size !== undefined;\n    });\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.minimum = def.size;\n        bag.maximum = def.size;\n        bag.size = def.size;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const size = input.size;\n        if (size === def.size)\n            return;\n        const tooBig = size > def.size;\n        payload.issues.push({\n            origin: util.getSizableOrigin(input),\n            ...(tooBig ? { code: \"too_big\", maximum: def.size } : { code: \"too_small\", minimum: def.size }),\n            inclusive: true,\n            exact: true,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckMaxLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxLength\", (inst, def) => {\n    var _a;\n    $ZodCheck.init(inst, def);\n    (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n        const val = payload.value;\n        return !util.nullish(val) && val.length !== undefined;\n    });\n    inst._zod.onattach.push((inst) => {\n        const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n        if (def.maximum < curr)\n            inst._zod.bag.maximum = def.maximum;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const length = input.length;\n        if (length <= def.maximum)\n            return;\n        const origin = util.getLengthableOrigin(input);\n        payload.issues.push({\n            origin,\n            code: \"too_big\",\n            maximum: def.maximum,\n            inclusive: true,\n            input,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckMinLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinLength\", (inst, def) => {\n    var _a;\n    $ZodCheck.init(inst, def);\n    (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n        const val = payload.value;\n        return !util.nullish(val) && val.length !== undefined;\n    });\n    inst._zod.onattach.push((inst) => {\n        const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n        if (def.minimum > curr)\n            inst._zod.bag.minimum = def.minimum;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const length = input.length;\n        if (length >= def.minimum)\n            return;\n        const origin = util.getLengthableOrigin(input);\n        payload.issues.push({\n            origin,\n            code: \"too_small\",\n            minimum: def.minimum,\n            inclusive: true,\n            input,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckLengthEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckLengthEquals\", (inst, def) => {\n    var _a;\n    $ZodCheck.init(inst, def);\n    (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n        const val = payload.value;\n        return !util.nullish(val) && val.length !== undefined;\n    });\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.minimum = def.length;\n        bag.maximum = def.length;\n        bag.length = def.length;\n    });\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const length = input.length;\n        if (length === def.length)\n            return;\n        const origin = util.getLengthableOrigin(input);\n        const tooBig = length > def.length;\n        payload.issues.push({\n            origin,\n            ...(tooBig ? { code: \"too_big\", maximum: def.length } : { code: \"too_small\", minimum: def.length }),\n            inclusive: true,\n            exact: true,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckStringFormat\", (inst, def) => {\n    var _a, _b;\n    $ZodCheck.init(inst, def);\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.format = def.format;\n        if (def.pattern) {\n            bag.patterns ?? (bag.patterns = new Set());\n            bag.patterns.add(def.pattern);\n        }\n    });\n    if (def.pattern)\n        (_a = inst._zod).check ?? (_a.check = (payload) => {\n            def.pattern.lastIndex = 0;\n            if (def.pattern.test(payload.value))\n                return;\n            payload.issues.push({\n                origin: \"string\",\n                code: \"invalid_format\",\n                format: def.format,\n                input: payload.value,\n                ...(def.pattern ? { pattern: def.pattern.toString() } : {}),\n                inst,\n                continue: !def.abort,\n            });\n        });\n    else\n        (_b = inst._zod).check ?? (_b.check = () => { });\n});\nexport const $ZodCheckRegex = /*@__PURE__*/ core.$constructor(\"$ZodCheckRegex\", (inst, def) => {\n    $ZodCheckStringFormat.init(inst, def);\n    inst._zod.check = (payload) => {\n        def.pattern.lastIndex = 0;\n        if (def.pattern.test(payload.value))\n            return;\n        payload.issues.push({\n            origin: \"string\",\n            code: \"invalid_format\",\n            format: \"regex\",\n            input: payload.value,\n            pattern: def.pattern.toString(),\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckLowerCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckLowerCase\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.lowercase);\n    $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckUpperCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckUpperCase\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.uppercase);\n    $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckIncludes = /*@__PURE__*/ core.$constructor(\"$ZodCheckIncludes\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    const escapedRegex = util.escapeRegex(def.includes);\n    const pattern = new RegExp(typeof def.position === \"number\" ? `^.{${def.position}}${escapedRegex}` : escapedRegex);\n    def.pattern = pattern;\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.patterns ?? (bag.patterns = new Set());\n        bag.patterns.add(pattern);\n    });\n    inst._zod.check = (payload) => {\n        if (payload.value.includes(def.includes, def.position))\n            return;\n        payload.issues.push({\n            origin: \"string\",\n            code: \"invalid_format\",\n            format: \"includes\",\n            includes: def.includes,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckStartsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckStartsWith\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`);\n    def.pattern ?? (def.pattern = pattern);\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.patterns ?? (bag.patterns = new Set());\n        bag.patterns.add(pattern);\n    });\n    inst._zod.check = (payload) => {\n        if (payload.value.startsWith(def.prefix))\n            return;\n        payload.issues.push({\n            origin: \"string\",\n            code: \"invalid_format\",\n            format: \"starts_with\",\n            prefix: def.prefix,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckEndsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckEndsWith\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`);\n    def.pattern ?? (def.pattern = pattern);\n    inst._zod.onattach.push((inst) => {\n        const bag = inst._zod.bag;\n        bag.patterns ?? (bag.patterns = new Set());\n        bag.patterns.add(pattern);\n    });\n    inst._zod.check = (payload) => {\n        if (payload.value.endsWith(def.suffix))\n            return;\n        payload.issues.push({\n            origin: \"string\",\n            code: \"invalid_format\",\n            format: \"ends_with\",\n            suffix: def.suffix,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\n///////////////////////////////////\n/////    $ZodCheckProperty    /////\n///////////////////////////////////\nfunction handleCheckPropertyResult(result, payload, property) {\n    if (result.issues.length) {\n        payload.issues.push(...util.prefixIssues(property, result.issues));\n    }\n}\nexport const $ZodCheckProperty = /*@__PURE__*/ core.$constructor(\"$ZodCheckProperty\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    inst._zod.check = (payload) => {\n        const result = def.schema._zod.run({\n            value: payload.value[def.property],\n            issues: [],\n        }, {});\n        if (result instanceof Promise) {\n            return result.then((result) => handleCheckPropertyResult(result, payload, def.property));\n        }\n        handleCheckPropertyResult(result, payload, def.property);\n        return;\n    };\n});\nexport const $ZodCheckMimeType = /*@__PURE__*/ core.$constructor(\"$ZodCheckMimeType\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    const mimeSet = new Set(def.mime);\n    inst._zod.onattach.push((inst) => {\n        inst._zod.bag.mime = def.mime;\n    });\n    inst._zod.check = (payload) => {\n        if (mimeSet.has(payload.value.type))\n            return;\n        payload.issues.push({\n            code: \"invalid_value\",\n            values: def.mime,\n            input: payload.value.type,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCheckOverwrite = /*@__PURE__*/ core.$constructor(\"$ZodCheckOverwrite\", (inst, def) => {\n    $ZodCheck.init(inst, def);\n    inst._zod.check = (payload) => {\n        payload.value = def.tx(payload.value);\n    };\n});\n", "export class Doc {\n    constructor(args = []) {\n        this.content = [];\n        this.indent = 0;\n        if (this)\n            this.args = args;\n    }\n    indented(fn) {\n        this.indent += 1;\n        fn(this);\n        this.indent -= 1;\n    }\n    write(arg) {\n        if (typeof arg === \"function\") {\n            arg(this, { execution: \"sync\" });\n            arg(this, { execution: \"async\" });\n            return;\n        }\n        const content = arg;\n        const lines = content.split(\"\\n\").filter((x) => x);\n        const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length));\n        const dedented = lines.map((x) => x.slice(minIndent)).map((x) => \" \".repeat(this.indent * 2) + x);\n        for (const line of dedented) {\n            this.content.push(line);\n        }\n    }\n    compile() {\n        const F = Function;\n        const args = this?.args;\n        const content = this?.content ?? [``];\n        const lines = [...content.map((x) => `  ${x}`)];\n        // console.log(lines.join(\"\\n\"));\n        return new F(...args, lines.join(\"\\n\"));\n    }\n}\n", "export const version = {\n    major: 4,\n    minor: 4,\n    patch: 3,\n};\n", "import * as checks from \"./checks.js\";\nimport * as core from \"./core.js\";\nimport { Doc } from \"./doc.js\";\nimport { parse, parseAsync, safeParse, safeParseAsync } from \"./parse.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nimport { version } from \"./versions.js\";\nexport const $ZodType = /*@__PURE__*/ core.$constructor(\"$ZodType\", (inst, def) => {\n    var _a;\n    inst ?? (inst = {});\n    inst._zod.def = def; // set _def property\n    inst._zod.bag = inst._zod.bag || {}; // initialize _bag object\n    inst._zod.version = version;\n    const checks = [...(inst._zod.def.checks ?? [])];\n    // if inst is itself a checks.$ZodCheck, run it as a check\n    if (inst._zod.traits.has(\"$ZodCheck\")) {\n        checks.unshift(inst);\n    }\n    for (const ch of checks) {\n        for (const fn of ch._zod.onattach) {\n            fn(inst);\n        }\n    }\n    if (checks.length === 0) {\n        // deferred initializer\n        // inst._zod.parse is not yet defined\n        (_a = inst._zod).deferred ?? (_a.deferred = []);\n        inst._zod.deferred?.push(() => {\n            inst._zod.run = inst._zod.parse;\n        });\n    }\n    else {\n        const runChecks = (payload, checks, ctx) => {\n            let isAborted = util.aborted(payload);\n            let asyncResult;\n            for (const ch of checks) {\n                if (ch._zod.def.when) {\n                    if (util.explicitlyAborted(payload))\n                        continue;\n                    const shouldRun = ch._zod.def.when(payload);\n                    if (!shouldRun)\n                        continue;\n                }\n                else if (isAborted) {\n                    continue;\n                }\n                const currLen = payload.issues.length;\n                const _ = ch._zod.check(payload);\n                if (_ instanceof Promise && ctx?.async === false) {\n                    throw new core.$ZodAsyncError();\n                }\n                if (asyncResult || _ instanceof Promise) {\n                    asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {\n                        await _;\n                        const nextLen = payload.issues.length;\n                        if (nextLen === currLen)\n                            return;\n                        if (!isAborted)\n                            isAborted = util.aborted(payload, currLen);\n                    });\n                }\n                else {\n                    const nextLen = payload.issues.length;\n                    if (nextLen === currLen)\n                        continue;\n                    if (!isAborted)\n                        isAborted = util.aborted(payload, currLen);\n                }\n            }\n            if (asyncResult) {\n                return asyncResult.then(() => {\n                    return payload;\n                });\n            }\n            return payload;\n        };\n        const handleCanaryResult = (canary, payload, ctx) => {\n            // abort if the canary is aborted\n            if (util.aborted(canary)) {\n                canary.aborted = true;\n                return canary;\n            }\n            // run checks first, then\n            const checkResult = runChecks(payload, checks, ctx);\n            if (checkResult instanceof Promise) {\n                if (ctx.async === false)\n                    throw new core.$ZodAsyncError();\n                return checkResult.then((checkResult) => inst._zod.parse(checkResult, ctx));\n            }\n            return inst._zod.parse(checkResult, ctx);\n        };\n        inst._zod.run = (payload, ctx) => {\n            if (ctx.skipChecks) {\n                return inst._zod.parse(payload, ctx);\n            }\n            if (ctx.direction === \"backward\") {\n                // run canary\n                // initial pass (no checks)\n                const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true });\n                if (canary instanceof Promise) {\n                    return canary.then((canary) => {\n                        return handleCanaryResult(canary, payload, ctx);\n                    });\n                }\n                return handleCanaryResult(canary, payload, ctx);\n            }\n            // forward\n            const result = inst._zod.parse(payload, ctx);\n            if (result instanceof Promise) {\n                if (ctx.async === false)\n                    throw new core.$ZodAsyncError();\n                return result.then((result) => runChecks(result, checks, ctx));\n            }\n            return runChecks(result, checks, ctx);\n        };\n    }\n    // Lazy initialize ~standard to avoid creating objects for every schema\n    util.defineLazy(inst, \"~standard\", () => ({\n        validate: (value) => {\n            try {\n                const r = safeParse(inst, value);\n                return r.success ? { value: r.data } : { issues: r.error?.issues };\n            }\n            catch (_) {\n                return safeParseAsync(inst, value).then((r) => (r.success ? { value: r.data } : { issues: r.error?.issues }));\n            }\n        },\n        vendor: \"zod\",\n        version: 1,\n    }));\n});\nexport { clone } from \"./util.js\";\nexport const $ZodString = /*@__PURE__*/ core.$constructor(\"$ZodString\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.pattern = [...(inst?._zod.bag?.patterns ?? [])].pop() ?? regexes.string(inst._zod.bag);\n    inst._zod.parse = (payload, _) => {\n        if (def.coerce)\n            try {\n                payload.value = String(payload.value);\n            }\n            catch (_) { }\n        if (typeof payload.value === \"string\")\n            return payload;\n        payload.issues.push({\n            expected: \"string\",\n            code: \"invalid_type\",\n            input: payload.value,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodStringFormat\", (inst, def) => {\n    // check initialization must come first\n    checks.$ZodCheckStringFormat.init(inst, def);\n    $ZodString.init(inst, def);\n});\nexport const $ZodGUID = /*@__PURE__*/ core.$constructor(\"$ZodGUID\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.guid);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodUUID = /*@__PURE__*/ core.$constructor(\"$ZodUUID\", (inst, def) => {\n    if (def.version) {\n        const versionMap = {\n            v1: 1,\n            v2: 2,\n            v3: 3,\n            v4: 4,\n            v5: 5,\n            v6: 6,\n            v7: 7,\n            v8: 8,\n        };\n        const v = versionMap[def.version];\n        if (v === undefined)\n            throw new Error(`Invalid UUID version: \"${def.version}\"`);\n        def.pattern ?? (def.pattern = regexes.uuid(v));\n    }\n    else\n        def.pattern ?? (def.pattern = regexes.uuid());\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodEmail = /*@__PURE__*/ core.$constructor(\"$ZodEmail\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.email);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodURL = /*@__PURE__*/ core.$constructor(\"$ZodURL\", (inst, def) => {\n    $ZodStringFormat.init(inst, def);\n    inst._zod.check = (payload) => {\n        try {\n            // Trim whitespace from input\n            const trimmed = payload.value.trim();\n            // When normalize is off, require :// for http/https URLs\n            // This prevents strings like \"http:example.com\" or \"https:/path\" from being silently accepted\n            if (!def.normalize && def.protocol?.source === regexes.httpProtocol.source) {\n                if (!/^https?:\\/\\//i.test(trimmed)) {\n                    payload.issues.push({\n                        code: \"invalid_format\",\n                        format: \"url\",\n                        note: \"Invalid URL format\",\n                        input: payload.value,\n                        inst,\n                        continue: !def.abort,\n                    });\n                    return;\n                }\n            }\n            // @ts-ignore\n            const url = new URL(trimmed);\n            if (def.hostname) {\n                def.hostname.lastIndex = 0;\n                if (!def.hostname.test(url.hostname)) {\n                    payload.issues.push({\n                        code: \"invalid_format\",\n                        format: \"url\",\n                        note: \"Invalid hostname\",\n                        pattern: def.hostname.source,\n                        input: payload.value,\n                        inst,\n                        continue: !def.abort,\n                    });\n                }\n            }\n            if (def.protocol) {\n                def.protocol.lastIndex = 0;\n                if (!def.protocol.test(url.protocol.endsWith(\":\") ? url.protocol.slice(0, -1) : url.protocol)) {\n                    payload.issues.push({\n                        code: \"invalid_format\",\n                        format: \"url\",\n                        note: \"Invalid protocol\",\n                        pattern: def.protocol.source,\n                        input: payload.value,\n                        inst,\n                        continue: !def.abort,\n                    });\n                }\n            }\n            // Set the output value based on normalize flag\n            if (def.normalize) {\n                // Use normalized URL\n                payload.value = url.href;\n            }\n            else {\n                // Preserve the original input (trimmed)\n                payload.value = trimmed;\n            }\n            return;\n        }\n        catch (_) {\n            payload.issues.push({\n                code: \"invalid_format\",\n                format: \"url\",\n                input: payload.value,\n                inst,\n                continue: !def.abort,\n            });\n        }\n    };\n});\nexport const $ZodEmoji = /*@__PURE__*/ core.$constructor(\"$ZodEmoji\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.emoji());\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodNanoID = /*@__PURE__*/ core.$constructor(\"$ZodNanoID\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.nanoid);\n    $ZodStringFormat.init(inst, def);\n});\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link $ZodCUID2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport const $ZodCUID = /*@__PURE__*/ core.$constructor(\"$ZodCUID\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.cuid);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID2 = /*@__PURE__*/ core.$constructor(\"$ZodCUID2\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.cuid2);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodULID = /*@__PURE__*/ core.$constructor(\"$ZodULID\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.ulid);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodXID = /*@__PURE__*/ core.$constructor(\"$ZodXID\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.xid);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodKSUID = /*@__PURE__*/ core.$constructor(\"$ZodKSUID\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.ksuid);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODateTime = /*@__PURE__*/ core.$constructor(\"$ZodISODateTime\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.datetime(def));\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODate = /*@__PURE__*/ core.$constructor(\"$ZodISODate\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.date);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISOTime = /*@__PURE__*/ core.$constructor(\"$ZodISOTime\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.time(def));\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODuration = /*@__PURE__*/ core.$constructor(\"$ZodISODuration\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.duration);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodIPv4 = /*@__PURE__*/ core.$constructor(\"$ZodIPv4\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.ipv4);\n    $ZodStringFormat.init(inst, def);\n    inst._zod.bag.format = `ipv4`;\n});\nexport const $ZodIPv6 = /*@__PURE__*/ core.$constructor(\"$ZodIPv6\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.ipv6);\n    $ZodStringFormat.init(inst, def);\n    inst._zod.bag.format = `ipv6`;\n    inst._zod.check = (payload) => {\n        try {\n            // @ts-ignore\n            new URL(`http://[${payload.value}]`);\n            // return;\n        }\n        catch {\n            payload.issues.push({\n                code: \"invalid_format\",\n                format: \"ipv6\",\n                input: payload.value,\n                inst,\n                continue: !def.abort,\n            });\n        }\n    };\n});\nexport const $ZodMAC = /*@__PURE__*/ core.$constructor(\"$ZodMAC\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.mac(def.delimiter));\n    $ZodStringFormat.init(inst, def);\n    inst._zod.bag.format = `mac`;\n});\nexport const $ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv4\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.cidrv4);\n    $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv6\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.cidrv6); // not used for validation\n    $ZodStringFormat.init(inst, def);\n    inst._zod.check = (payload) => {\n        const parts = payload.value.split(\"/\");\n        try {\n            if (parts.length !== 2)\n                throw new Error();\n            const [address, prefix] = parts;\n            if (!prefix)\n                throw new Error();\n            const prefixNum = Number(prefix);\n            if (`${prefixNum}` !== prefix)\n                throw new Error();\n            if (prefixNum < 0 || prefixNum > 128)\n                throw new Error();\n            // @ts-ignore\n            new URL(`http://[${address}]`);\n        }\n        catch {\n            payload.issues.push({\n                code: \"invalid_format\",\n                format: \"cidrv6\",\n                input: payload.value,\n                inst,\n                continue: !def.abort,\n            });\n        }\n    };\n});\n//////////////////////////////   ZodBase64   //////////////////////////////\nexport function isValidBase64(data) {\n    if (data === \"\")\n        return true;\n    // atob ignores whitespace, so reject it up front.\n    if (/\\s/.test(data))\n        return false;\n    if (data.length % 4 !== 0)\n        return false;\n    try {\n        // @ts-ignore\n        atob(data);\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\nexport const $ZodBase64 = /*@__PURE__*/ core.$constructor(\"$ZodBase64\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.base64);\n    $ZodStringFormat.init(inst, def);\n    inst._zod.bag.contentEncoding = \"base64\";\n    inst._zod.check = (payload) => {\n        if (isValidBase64(payload.value))\n            return;\n        payload.issues.push({\n            code: \"invalid_format\",\n            format: \"base64\",\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\n//////////////////////////////   ZodBase64   //////////////////////////////\nexport function isValidBase64URL(data) {\n    if (!regexes.base64url.test(data))\n        return false;\n    const base64 = data.replace(/[-_]/g, (c) => (c === \"-\" ? \"+\" : \"/\"));\n    const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n    return isValidBase64(padded);\n}\nexport const $ZodBase64URL = /*@__PURE__*/ core.$constructor(\"$ZodBase64URL\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.base64url);\n    $ZodStringFormat.init(inst, def);\n    inst._zod.bag.contentEncoding = \"base64url\";\n    inst._zod.check = (payload) => {\n        if (isValidBase64URL(payload.value))\n            return;\n        payload.issues.push({\n            code: \"invalid_format\",\n            format: \"base64url\",\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodE164 = /*@__PURE__*/ core.$constructor(\"$ZodE164\", (inst, def) => {\n    def.pattern ?? (def.pattern = regexes.e164);\n    $ZodStringFormat.init(inst, def);\n});\n//////////////////////////////   ZodJWT   //////////////////////////////\nexport function isValidJWT(token, algorithm = null) {\n    try {\n        const tokensParts = token.split(\".\");\n        if (tokensParts.length !== 3)\n            return false;\n        const [header] = tokensParts;\n        if (!header)\n            return false;\n        // @ts-ignore\n        const parsedHeader = JSON.parse(atob(header));\n        if (\"typ\" in parsedHeader && parsedHeader?.typ !== \"JWT\")\n            return false;\n        if (!parsedHeader.alg)\n            return false;\n        if (algorithm && (!(\"alg\" in parsedHeader) || parsedHeader.alg !== algorithm))\n            return false;\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\nexport const $ZodJWT = /*@__PURE__*/ core.$constructor(\"$ZodJWT\", (inst, def) => {\n    $ZodStringFormat.init(inst, def);\n    inst._zod.check = (payload) => {\n        if (isValidJWT(payload.value, def.alg))\n            return;\n        payload.issues.push({\n            code: \"invalid_format\",\n            format: \"jwt\",\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCustomStringFormat\", (inst, def) => {\n    $ZodStringFormat.init(inst, def);\n    inst._zod.check = (payload) => {\n        if (def.fn(payload.value))\n            return;\n        payload.issues.push({\n            code: \"invalid_format\",\n            format: def.format,\n            input: payload.value,\n            inst,\n            continue: !def.abort,\n        });\n    };\n});\nexport const $ZodNumber = /*@__PURE__*/ core.$constructor(\"$ZodNumber\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.pattern = inst._zod.bag.pattern ?? regexes.number;\n    inst._zod.parse = (payload, _ctx) => {\n        if (def.coerce)\n            try {\n                payload.value = Number(payload.value);\n            }\n            catch (_) { }\n        const input = payload.value;\n        if (typeof input === \"number\" && !Number.isNaN(input) && Number.isFinite(input)) {\n            return payload;\n        }\n        const received = typeof input === \"number\"\n            ? Number.isNaN(input)\n                ? \"NaN\"\n                : !Number.isFinite(input)\n                    ? \"Infinity\"\n                    : undefined\n            : undefined;\n        payload.issues.push({\n            expected: \"number\",\n            code: \"invalid_type\",\n            input,\n            inst,\n            ...(received ? { received } : {}),\n        });\n        return payload;\n    };\n});\nexport const $ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodNumberFormat\", (inst, def) => {\n    checks.$ZodCheckNumberFormat.init(inst, def);\n    $ZodNumber.init(inst, def); // no format checks\n});\nexport const $ZodBoolean = /*@__PURE__*/ core.$constructor(\"$ZodBoolean\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.pattern = regexes.boolean;\n    inst._zod.parse = (payload, _ctx) => {\n        if (def.coerce)\n            try {\n                payload.value = Boolean(payload.value);\n            }\n            catch (_) { }\n        const input = payload.value;\n        if (typeof input === \"boolean\")\n            return payload;\n        payload.issues.push({\n            expected: \"boolean\",\n            code: \"invalid_type\",\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodBigInt = /*@__PURE__*/ core.$constructor(\"$ZodBigInt\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.pattern = regexes.bigint;\n    inst._zod.parse = (payload, _ctx) => {\n        if (def.coerce)\n            try {\n                payload.value = BigInt(payload.value);\n            }\n            catch (_) { }\n        if (typeof payload.value === \"bigint\")\n            return payload;\n        payload.issues.push({\n            expected: \"bigint\",\n            code: \"invalid_type\",\n            input: payload.value,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodBigIntFormat\", (inst, def) => {\n    checks.$ZodCheckBigIntFormat.init(inst, def);\n    $ZodBigInt.init(inst, def); // no format checks\n});\nexport const $ZodSymbol = /*@__PURE__*/ core.$constructor(\"$ZodSymbol\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        if (typeof input === \"symbol\")\n            return payload;\n        payload.issues.push({\n            expected: \"symbol\",\n            code: \"invalid_type\",\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodUndefined = /*@__PURE__*/ core.$constructor(\"$ZodUndefined\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.pattern = regexes.undefined;\n    inst._zod.values = new Set([undefined]);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        if (typeof input === \"undefined\")\n            return payload;\n        payload.issues.push({\n            expected: \"undefined\",\n            code: \"invalid_type\",\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodNull = /*@__PURE__*/ core.$constructor(\"$ZodNull\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.pattern = regexes.null;\n    inst._zod.values = new Set([null]);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        if (input === null)\n            return payload;\n        payload.issues.push({\n            expected: \"null\",\n            code: \"invalid_type\",\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodAny = /*@__PURE__*/ core.$constructor(\"$ZodAny\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload) => payload;\n});\nexport const $ZodUnknown = /*@__PURE__*/ core.$constructor(\"$ZodUnknown\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload) => payload;\n});\nexport const $ZodNever = /*@__PURE__*/ core.$constructor(\"$ZodNever\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _ctx) => {\n        payload.issues.push({\n            expected: \"never\",\n            code: \"invalid_type\",\n            input: payload.value,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodVoid = /*@__PURE__*/ core.$constructor(\"$ZodVoid\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        if (typeof input === \"undefined\")\n            return payload;\n        payload.issues.push({\n            expected: \"void\",\n            code: \"invalid_type\",\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodDate = /*@__PURE__*/ core.$constructor(\"$ZodDate\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _ctx) => {\n        if (def.coerce) {\n            try {\n                payload.value = new Date(payload.value);\n            }\n            catch (_err) { }\n        }\n        const input = payload.value;\n        const isDate = input instanceof Date;\n        const isValidDate = isDate && !Number.isNaN(input.getTime());\n        if (isValidDate)\n            return payload;\n        payload.issues.push({\n            expected: \"date\",\n            code: \"invalid_type\",\n            input,\n            ...(isDate ? { received: \"Invalid Date\" } : {}),\n            inst,\n        });\n        return payload;\n    };\n});\nfunction handleArrayResult(result, final, index) {\n    if (result.issues.length) {\n        final.issues.push(...util.prefixIssues(index, result.issues));\n    }\n    final.value[index] = result.value;\n}\nexport const $ZodArray = /*@__PURE__*/ core.$constructor(\"$ZodArray\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        if (!Array.isArray(input)) {\n            payload.issues.push({\n                expected: \"array\",\n                code: \"invalid_type\",\n                input,\n                inst,\n            });\n            return payload;\n        }\n        payload.value = Array(input.length);\n        const proms = [];\n        for (let i = 0; i < input.length; i++) {\n            const item = input[i];\n            const result = def.element._zod.run({\n                value: item,\n                issues: [],\n            }, ctx);\n            if (result instanceof Promise) {\n                proms.push(result.then((result) => handleArrayResult(result, payload, i)));\n            }\n            else {\n                handleArrayResult(result, payload, i);\n            }\n        }\n        if (proms.length) {\n            return Promise.all(proms).then(() => payload);\n        }\n        return payload; //handleArrayResultsAsync(parseResults, final);\n    };\n});\nfunction handlePropertyResult(result, final, key, input, isOptionalIn, isOptionalOut) {\n    const isPresent = key in input;\n    if (result.issues.length) {\n        // For optional-in/out schemas, ignore errors on absent keys.\n        if (isOptionalIn && isOptionalOut && !isPresent) {\n            return;\n        }\n        final.issues.push(...util.prefixIssues(key, result.issues));\n    }\n    if (!isPresent && !isOptionalIn) {\n        if (!result.issues.length) {\n            final.issues.push({\n                code: \"invalid_type\",\n                expected: \"nonoptional\",\n                input: undefined,\n                path: [key],\n            });\n        }\n        return;\n    }\n    if (result.value === undefined) {\n        if (isPresent) {\n            final.value[key] = undefined;\n        }\n    }\n    else {\n        final.value[key] = result.value;\n    }\n}\nfunction normalizeDef(def) {\n    const keys = Object.keys(def.shape);\n    for (const k of keys) {\n        if (!def.shape?.[k]?._zod?.traits?.has(\"$ZodType\")) {\n            throw new Error(`Invalid element at key \"${k}\": expected a Zod schema`);\n        }\n    }\n    const okeys = util.optionalKeys(def.shape);\n    return {\n        ...def,\n        keys,\n        keySet: new Set(keys),\n        numKeys: keys.length,\n        optionalKeys: new Set(okeys),\n    };\n}\nfunction handleCatchall(proms, input, payload, ctx, def, inst) {\n    const unrecognized = [];\n    const keySet = def.keySet;\n    const _catchall = def.catchall._zod;\n    const t = _catchall.def.type;\n    const isOptionalIn = _catchall.optin === \"optional\";\n    const isOptionalOut = _catchall.optout === \"optional\";\n    for (const key in input) {\n        // skip __proto__ so it can't replace the result prototype via the\n        // assignment setter on the plain {} we build into\n        if (key === \"__proto__\")\n            continue;\n        if (keySet.has(key))\n            continue;\n        if (t === \"never\") {\n            unrecognized.push(key);\n            continue;\n        }\n        const r = _catchall.run({ value: input[key], issues: [] }, ctx);\n        if (r instanceof Promise) {\n            proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut)));\n        }\n        else {\n            handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut);\n        }\n    }\n    if (unrecognized.length) {\n        payload.issues.push({\n            code: \"unrecognized_keys\",\n            keys: unrecognized,\n            input,\n            inst,\n        });\n    }\n    if (!proms.length)\n        return payload;\n    return Promise.all(proms).then(() => {\n        return payload;\n    });\n}\nexport const $ZodObject = /*@__PURE__*/ core.$constructor(\"$ZodObject\", (inst, def) => {\n    // requires cast because technically $ZodObject doesn't extend\n    $ZodType.init(inst, def);\n    // const sh = def.shape;\n    const desc = Object.getOwnPropertyDescriptor(def, \"shape\");\n    if (!desc?.get) {\n        const sh = def.shape;\n        Object.defineProperty(def, \"shape\", {\n            get: () => {\n                const newSh = { ...sh };\n                Object.defineProperty(def, \"shape\", {\n                    value: newSh,\n                });\n                return newSh;\n            },\n        });\n    }\n    const _normalized = util.cached(() => normalizeDef(def));\n    util.defineLazy(inst._zod, \"propValues\", () => {\n        const shape = def.shape;\n        const propValues = {};\n        for (const key in shape) {\n            const field = shape[key]._zod;\n            if (field.values) {\n                propValues[key] ?? (propValues[key] = new Set());\n                for (const v of field.values)\n                    propValues[key].add(v);\n            }\n        }\n        return propValues;\n    });\n    const isObject = util.isObject;\n    const catchall = def.catchall;\n    let value;\n    inst._zod.parse = (payload, ctx) => {\n        value ?? (value = _normalized.value);\n        const input = payload.value;\n        if (!isObject(input)) {\n            payload.issues.push({\n                expected: \"object\",\n                code: \"invalid_type\",\n                input,\n                inst,\n            });\n            return payload;\n        }\n        payload.value = {};\n        const proms = [];\n        const shape = value.shape;\n        for (const key of value.keys) {\n            const el = shape[key];\n            const isOptionalIn = el._zod.optin === \"optional\";\n            const isOptionalOut = el._zod.optout === \"optional\";\n            const r = el._zod.run({ value: input[key], issues: [] }, ctx);\n            if (r instanceof Promise) {\n                proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut)));\n            }\n            else {\n                handlePropertyResult(r, payload, key, input, isOptionalIn, isOptionalOut);\n            }\n        }\n        if (!catchall) {\n            return proms.length ? Promise.all(proms).then(() => payload) : payload;\n        }\n        return handleCatchall(proms, input, payload, ctx, _normalized.value, inst);\n    };\n});\nexport const $ZodObjectJIT = /*@__PURE__*/ core.$constructor(\"$ZodObjectJIT\", (inst, def) => {\n    // requires cast because technically $ZodObject doesn't extend\n    $ZodObject.init(inst, def);\n    const superParse = inst._zod.parse;\n    const _normalized = util.cached(() => normalizeDef(def));\n    const generateFastpass = (shape) => {\n        const doc = new Doc([\"shape\", \"payload\", \"ctx\"]);\n        const normalized = _normalized.value;\n        const parseStr = (key) => {\n            const k = util.esc(key);\n            return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;\n        };\n        doc.write(`const input = payload.value;`);\n        const ids = Object.create(null);\n        let counter = 0;\n        for (const key of normalized.keys) {\n            ids[key] = `key_${counter++}`;\n        }\n        // A: preserve key order {\n        doc.write(`const newResult = {};`);\n        for (const key of normalized.keys) {\n            const id = ids[key];\n            const k = util.esc(key);\n            const schema = shape[key];\n            const isOptionalIn = schema?._zod?.optin === \"optional\";\n            const isOptionalOut = schema?._zod?.optout === \"optional\";\n            doc.write(`const ${id} = ${parseStr(key)};`);\n            if (isOptionalIn && isOptionalOut) {\n                // For optional-in/out schemas, ignore errors on absent keys\n                doc.write(`\n        if (${id}.issues.length) {\n          if (${k} in input) {\n            payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n              ...iss,\n              path: iss.path ? [${k}, ...iss.path] : [${k}]\n            })));\n          }\n        }\n        \n        if (${id}.value === undefined) {\n          if (${k} in input) {\n            newResult[${k}] = undefined;\n          }\n        } else {\n          newResult[${k}] = ${id}.value;\n        }\n        \n      `);\n            }\n            else if (!isOptionalIn) {\n                doc.write(`\n        const ${id}_present = ${k} in input;\n        if (${id}.issues.length) {\n          payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n            ...iss,\n            path: iss.path ? [${k}, ...iss.path] : [${k}]\n          })));\n        }\n        if (!${id}_present && !${id}.issues.length) {\n          payload.issues.push({\n            code: \"invalid_type\",\n            expected: \"nonoptional\",\n            input: undefined,\n            path: [${k}]\n          });\n        }\n\n        if (${id}_present) {\n          if (${id}.value === undefined) {\n            newResult[${k}] = undefined;\n          } else {\n            newResult[${k}] = ${id}.value;\n          }\n        }\n\n      `);\n            }\n            else {\n                doc.write(`\n        if (${id}.issues.length) {\n          payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n            ...iss,\n            path: iss.path ? [${k}, ...iss.path] : [${k}]\n          })));\n        }\n        \n        if (${id}.value === undefined) {\n          if (${k} in input) {\n            newResult[${k}] = undefined;\n          }\n        } else {\n          newResult[${k}] = ${id}.value;\n        }\n        \n      `);\n            }\n        }\n        doc.write(`payload.value = newResult;`);\n        doc.write(`return payload;`);\n        const fn = doc.compile();\n        return (payload, ctx) => fn(shape, payload, ctx);\n    };\n    let fastpass;\n    const isObject = util.isObject;\n    const jit = !core.globalConfig.jitless;\n    const allowsEval = util.allowsEval;\n    const fastEnabled = jit && allowsEval.value; // && !def.catchall;\n    const catchall = def.catchall;\n    let value;\n    inst._zod.parse = (payload, ctx) => {\n        value ?? (value = _normalized.value);\n        const input = payload.value;\n        if (!isObject(input)) {\n            payload.issues.push({\n                expected: \"object\",\n                code: \"invalid_type\",\n                input,\n                inst,\n            });\n            return payload;\n        }\n        if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) {\n            // always synchronous\n            if (!fastpass)\n                fastpass = generateFastpass(def.shape);\n            payload = fastpass(payload, ctx);\n            if (!catchall)\n                return payload;\n            return handleCatchall([], input, payload, ctx, value, inst);\n        }\n        return superParse(payload, ctx);\n    };\n});\nfunction handleUnionResults(results, final, inst, ctx) {\n    for (const result of results) {\n        if (result.issues.length === 0) {\n            final.value = result.value;\n            return final;\n        }\n    }\n    const nonaborted = results.filter((r) => !util.aborted(r));\n    if (nonaborted.length === 1) {\n        final.value = nonaborted[0].value;\n        return nonaborted[0];\n    }\n    final.issues.push({\n        code: \"invalid_union\",\n        input: final.value,\n        inst,\n        errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n    });\n    return final;\n}\nexport const $ZodUnion = /*@__PURE__*/ core.$constructor(\"$ZodUnion\", (inst, def) => {\n    $ZodType.init(inst, def);\n    util.defineLazy(inst._zod, \"optin\", () => def.options.some((o) => o._zod.optin === \"optional\") ? \"optional\" : undefined);\n    util.defineLazy(inst._zod, \"optout\", () => def.options.some((o) => o._zod.optout === \"optional\") ? \"optional\" : undefined);\n    util.defineLazy(inst._zod, \"values\", () => {\n        if (def.options.every((o) => o._zod.values)) {\n            return new Set(def.options.flatMap((option) => Array.from(option._zod.values)));\n        }\n        return undefined;\n    });\n    util.defineLazy(inst._zod, \"pattern\", () => {\n        if (def.options.every((o) => o._zod.pattern)) {\n            const patterns = def.options.map((o) => o._zod.pattern);\n            return new RegExp(`^(${patterns.map((p) => util.cleanRegex(p.source)).join(\"|\")})$`);\n        }\n        return undefined;\n    });\n    const first = def.options.length === 1 ? def.options[0]._zod.run : null;\n    inst._zod.parse = (payload, ctx) => {\n        if (first) {\n            return first(payload, ctx);\n        }\n        let async = false;\n        const results = [];\n        for (const option of def.options) {\n            const result = option._zod.run({\n                value: payload.value,\n                issues: [],\n            }, ctx);\n            if (result instanceof Promise) {\n                results.push(result);\n                async = true;\n            }\n            else {\n                if (result.issues.length === 0)\n                    return result;\n                results.push(result);\n            }\n        }\n        if (!async)\n            return handleUnionResults(results, payload, inst, ctx);\n        return Promise.all(results).then((results) => {\n            return handleUnionResults(results, payload, inst, ctx);\n        });\n    };\n});\nfunction handleExclusiveUnionResults(results, final, inst, ctx) {\n    const successes = results.filter((r) => r.issues.length === 0);\n    if (successes.length === 1) {\n        final.value = successes[0].value;\n        return final;\n    }\n    if (successes.length === 0) {\n        // No matches - same as regular union\n        final.issues.push({\n            code: \"invalid_union\",\n            input: final.value,\n            inst,\n            errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n        });\n    }\n    else {\n        // Multiple matches - exclusive union failure\n        final.issues.push({\n            code: \"invalid_union\",\n            input: final.value,\n            inst,\n            errors: [],\n            inclusive: false,\n        });\n    }\n    return final;\n}\nexport const $ZodXor = /*@__PURE__*/ core.$constructor(\"$ZodXor\", (inst, def) => {\n    $ZodUnion.init(inst, def);\n    def.inclusive = false;\n    const first = def.options.length === 1 ? def.options[0]._zod.run : null;\n    inst._zod.parse = (payload, ctx) => {\n        if (first) {\n            return first(payload, ctx);\n        }\n        let async = false;\n        const results = [];\n        for (const option of def.options) {\n            const result = option._zod.run({\n                value: payload.value,\n                issues: [],\n            }, ctx);\n            if (result instanceof Promise) {\n                results.push(result);\n                async = true;\n            }\n            else {\n                results.push(result);\n            }\n        }\n        if (!async)\n            return handleExclusiveUnionResults(results, payload, inst, ctx);\n        return Promise.all(results).then((results) => {\n            return handleExclusiveUnionResults(results, payload, inst, ctx);\n        });\n    };\n});\nexport const $ZodDiscriminatedUnion = \n/*@__PURE__*/\ncore.$constructor(\"$ZodDiscriminatedUnion\", (inst, def) => {\n    def.inclusive = false;\n    $ZodUnion.init(inst, def);\n    const _super = inst._zod.parse;\n    util.defineLazy(inst._zod, \"propValues\", () => {\n        const propValues = {};\n        for (const option of def.options) {\n            const pv = option._zod.propValues;\n            if (!pv || Object.keys(pv).length === 0)\n                throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(option)}\"`);\n            for (const [k, v] of Object.entries(pv)) {\n                if (!propValues[k])\n                    propValues[k] = new Set();\n                for (const val of v) {\n                    propValues[k].add(val);\n                }\n            }\n        }\n        return propValues;\n    });\n    const disc = util.cached(() => {\n        const opts = def.options;\n        const map = new Map();\n        for (const o of opts) {\n            const values = o._zod.propValues?.[def.discriminator];\n            if (!values || values.size === 0)\n                throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(o)}\"`);\n            for (const v of values) {\n                if (map.has(v)) {\n                    throw new Error(`Duplicate discriminator value \"${String(v)}\"`);\n                }\n                map.set(v, o);\n            }\n        }\n        return map;\n    });\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        if (!util.isObject(input)) {\n            payload.issues.push({\n                code: \"invalid_type\",\n                expected: \"object\",\n                input,\n                inst,\n            });\n            return payload;\n        }\n        const opt = disc.value.get(input?.[def.discriminator]);\n        if (opt) {\n            return opt._zod.run(payload, ctx);\n        }\n        // Fall back to union matching when the fast discriminator path fails:\n        // - explicitly enabled via unionFallback, or\n        // - during backward direction (encode), since codec-based discriminators\n        //   have different values in forward vs backward directions\n        if (def.unionFallback || ctx.direction === \"backward\") {\n            return _super(payload, ctx);\n        }\n        // no matching discriminator\n        payload.issues.push({\n            code: \"invalid_union\",\n            errors: [],\n            note: \"No matching discriminator\",\n            discriminator: def.discriminator,\n            options: Array.from(disc.value.keys()),\n            input,\n            path: [def.discriminator],\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodIntersection = /*@__PURE__*/ core.$constructor(\"$ZodIntersection\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        const left = def.left._zod.run({ value: input, issues: [] }, ctx);\n        const right = def.right._zod.run({ value: input, issues: [] }, ctx);\n        const async = left instanceof Promise || right instanceof Promise;\n        if (async) {\n            return Promise.all([left, right]).then(([left, right]) => {\n                return handleIntersectionResults(payload, left, right);\n            });\n        }\n        return handleIntersectionResults(payload, left, right);\n    };\n});\nfunction mergeValues(a, b) {\n    // const aType = parse.t(a);\n    // const bType = parse.t(b);\n    if (a === b) {\n        return { valid: true, data: a };\n    }\n    if (a instanceof Date && b instanceof Date && +a === +b) {\n        return { valid: true, data: a };\n    }\n    if (util.isPlainObject(a) && util.isPlainObject(b)) {\n        const bKeys = Object.keys(b);\n        const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1);\n        const newObj = { ...a, ...b };\n        for (const key of sharedKeys) {\n            const sharedValue = mergeValues(a[key], b[key]);\n            if (!sharedValue.valid) {\n                return {\n                    valid: false,\n                    mergeErrorPath: [key, ...sharedValue.mergeErrorPath],\n                };\n            }\n            newObj[key] = sharedValue.data;\n        }\n        return { valid: true, data: newObj };\n    }\n    if (Array.isArray(a) && Array.isArray(b)) {\n        if (a.length !== b.length) {\n            return { valid: false, mergeErrorPath: [] };\n        }\n        const newArray = [];\n        for (let index = 0; index < a.length; index++) {\n            const itemA = a[index];\n            const itemB = b[index];\n            const sharedValue = mergeValues(itemA, itemB);\n            if (!sharedValue.valid) {\n                return {\n                    valid: false,\n                    mergeErrorPath: [index, ...sharedValue.mergeErrorPath],\n                };\n            }\n            newArray.push(sharedValue.data);\n        }\n        return { valid: true, data: newArray };\n    }\n    return { valid: false, mergeErrorPath: [] };\n}\nfunction handleIntersectionResults(result, left, right) {\n    // Track which side(s) report each key as unrecognized\n    const unrecKeys = new Map();\n    let unrecIssue;\n    for (const iss of left.issues) {\n        if (iss.code === \"unrecognized_keys\") {\n            unrecIssue ?? (unrecIssue = iss);\n            for (const k of iss.keys) {\n                if (!unrecKeys.has(k))\n                    unrecKeys.set(k, {});\n                unrecKeys.get(k).l = true;\n            }\n        }\n        else {\n            result.issues.push(iss);\n        }\n    }\n    for (const iss of right.issues) {\n        if (iss.code === \"unrecognized_keys\") {\n            for (const k of iss.keys) {\n                if (!unrecKeys.has(k))\n                    unrecKeys.set(k, {});\n                unrecKeys.get(k).r = true;\n            }\n        }\n        else {\n            result.issues.push(iss);\n        }\n    }\n    // Report only keys unrecognized by BOTH sides\n    const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k);\n    if (bothKeys.length && unrecIssue) {\n        result.issues.push({ ...unrecIssue, keys: bothKeys });\n    }\n    if (util.aborted(result))\n        return result;\n    const merged = mergeValues(left.value, right.value);\n    if (!merged.valid) {\n        throw new Error(`Unmergable intersection. Error path: ` + `${JSON.stringify(merged.mergeErrorPath)}`);\n    }\n    result.value = merged.data;\n    return result;\n}\nexport const $ZodTuple = /*@__PURE__*/ core.$constructor(\"$ZodTuple\", (inst, def) => {\n    $ZodType.init(inst, def);\n    const items = def.items;\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        if (!Array.isArray(input)) {\n            payload.issues.push({\n                input,\n                inst,\n                expected: \"tuple\",\n                code: \"invalid_type\",\n            });\n            return payload;\n        }\n        payload.value = [];\n        const proms = [];\n        const optinStart = getTupleOptStart(items, \"optin\");\n        const optoutStart = getTupleOptStart(items, \"optout\");\n        if (!def.rest) {\n            if (input.length < optinStart) {\n                payload.issues.push({\n                    code: \"too_small\",\n                    minimum: optinStart,\n                    inclusive: true,\n                    input,\n                    inst,\n                    origin: \"array\",\n                });\n                return payload;\n            }\n            if (input.length > items.length) {\n                payload.issues.push({\n                    code: \"too_big\",\n                    maximum: items.length,\n                    inclusive: true,\n                    input,\n                    inst,\n                    origin: \"array\",\n                });\n            }\n        }\n        // Run every item in parallel, collecting results into an indexed\n        // array. The post-processing in `handleTupleResults` walks them in\n        // order so it can decide whether an absent optional-output error can\n        // truncate the tail or must be reported to preserve required output.\n        const itemResults = new Array(items.length);\n        for (let i = 0; i < items.length; i++) {\n            const r = items[i]._zod.run({ value: input[i], issues: [] }, ctx);\n            if (r instanceof Promise) {\n                proms.push(r.then((rr) => {\n                    itemResults[i] = rr;\n                }));\n            }\n            else {\n                itemResults[i] = r;\n            }\n        }\n        if (def.rest) {\n            let i = items.length - 1;\n            const rest = input.slice(items.length);\n            for (const el of rest) {\n                i++;\n                const result = def.rest._zod.run({ value: el, issues: [] }, ctx);\n                if (result instanceof Promise) {\n                    proms.push(result.then((r) => handleTupleResult(r, payload, i)));\n                }\n                else {\n                    handleTupleResult(result, payload, i);\n                }\n            }\n        }\n        if (proms.length) {\n            return Promise.all(proms).then(() => handleTupleResults(itemResults, payload, items, input, optoutStart));\n        }\n        return handleTupleResults(itemResults, payload, items, input, optoutStart);\n    };\n});\nfunction getTupleOptStart(items, key) {\n    for (let i = items.length - 1; i >= 0; i--) {\n        if (items[i]._zod[key] !== \"optional\")\n            return i + 1;\n    }\n    return 0;\n}\nfunction handleTupleResult(result, final, index) {\n    if (result.issues.length) {\n        final.issues.push(...util.prefixIssues(index, result.issues));\n    }\n    final.value[index] = result.value;\n}\nfunction handleTupleResults(itemResults, final, items, input, optoutStart) {\n    // Walk results in order. Mirror $ZodObject's swallow-on-absent-optional\n    // rule, but only after `optoutStart`: the first index where the output\n    // tuple tail can be absent.\n    for (let i = 0; i < items.length; i++) {\n        const r = itemResults[i];\n        const isPresent = i < input.length;\n        if (r.issues.length) {\n            if (!isPresent && i >= optoutStart) {\n                final.value.length = i;\n                break;\n            }\n            final.issues.push(...util.prefixIssues(i, r.issues));\n        }\n        final.value[i] = r.value;\n    }\n    // Drop trailing slots that produced `undefined` for absent input\n    // (the array analog of an absent optional key on an object). The\n    // `i >= input.length` floor is critical: an explicit `undefined`\n    // *inside* the input must be preserved even when the schema is\n    // optional-out (e.g. `z.string().or(z.undefined())` accepting an\n    // explicit undefined value).\n    for (let i = final.value.length - 1; i >= input.length; i--) {\n        if (items[i]._zod.optout === \"optional\" && final.value[i] === undefined) {\n            final.value.length = i;\n        }\n        else {\n            break;\n        }\n    }\n    return final;\n}\nexport const $ZodRecord = /*@__PURE__*/ core.$constructor(\"$ZodRecord\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        if (!util.isPlainObject(input)) {\n            payload.issues.push({\n                expected: \"record\",\n                code: \"invalid_type\",\n                input,\n                inst,\n            });\n            return payload;\n        }\n        const proms = [];\n        const values = def.keyType._zod.values;\n        if (values) {\n            payload.value = {};\n            const recordKeys = new Set();\n            for (const key of values) {\n                if (typeof key === \"string\" || typeof key === \"number\" || typeof key === \"symbol\") {\n                    recordKeys.add(typeof key === \"number\" ? key.toString() : key);\n                    const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n                    if (keyResult instanceof Promise) {\n                        throw new Error(\"Async schemas not supported in object keys currently\");\n                    }\n                    if (keyResult.issues.length) {\n                        payload.issues.push({\n                            code: \"invalid_key\",\n                            origin: \"record\",\n                            issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n                            input: key,\n                            path: [key],\n                            inst,\n                        });\n                        continue;\n                    }\n                    const outKey = keyResult.value;\n                    const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n                    if (result instanceof Promise) {\n                        proms.push(result.then((result) => {\n                            if (result.issues.length) {\n                                payload.issues.push(...util.prefixIssues(key, result.issues));\n                            }\n                            payload.value[outKey] = result.value;\n                        }));\n                    }\n                    else {\n                        if (result.issues.length) {\n                            payload.issues.push(...util.prefixIssues(key, result.issues));\n                        }\n                        payload.value[outKey] = result.value;\n                    }\n                }\n            }\n            let unrecognized;\n            for (const key in input) {\n                if (!recordKeys.has(key)) {\n                    unrecognized = unrecognized ?? [];\n                    unrecognized.push(key);\n                }\n            }\n            if (unrecognized && unrecognized.length > 0) {\n                payload.issues.push({\n                    code: \"unrecognized_keys\",\n                    input,\n                    inst,\n                    keys: unrecognized,\n                });\n            }\n        }\n        else {\n            payload.value = {};\n            // Reflect.ownKeys for Symbol-key support; filter non-enumerable to match z.object()\n            for (const key of Reflect.ownKeys(input)) {\n                if (key === \"__proto__\")\n                    continue;\n                if (!Object.prototype.propertyIsEnumerable.call(input, key))\n                    continue;\n                let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n                if (keyResult instanceof Promise) {\n                    throw new Error(\"Async schemas not supported in object keys currently\");\n                }\n                // Numeric string fallback: if key is a numeric string and failed, retry with Number(key)\n                // This handles z.number(), z.literal([1, 2, 3]), and unions containing numeric literals\n                const checkNumericKey = typeof key === \"string\" && regexes.number.test(key) && keyResult.issues.length;\n                if (checkNumericKey) {\n                    const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);\n                    if (retryResult instanceof Promise) {\n                        throw new Error(\"Async schemas not supported in object keys currently\");\n                    }\n                    if (retryResult.issues.length === 0) {\n                        keyResult = retryResult;\n                    }\n                }\n                if (keyResult.issues.length) {\n                    if (def.mode === \"loose\") {\n                        // Pass through unchanged\n                        payload.value[key] = input[key];\n                    }\n                    else {\n                        // Default \"strict\" behavior: error on invalid key\n                        payload.issues.push({\n                            code: \"invalid_key\",\n                            origin: \"record\",\n                            issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n                            input: key,\n                            path: [key],\n                            inst,\n                        });\n                    }\n                    continue;\n                }\n                const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n                if (result instanceof Promise) {\n                    proms.push(result.then((result) => {\n                        if (result.issues.length) {\n                            payload.issues.push(...util.prefixIssues(key, result.issues));\n                        }\n                        payload.value[keyResult.value] = result.value;\n                    }));\n                }\n                else {\n                    if (result.issues.length) {\n                        payload.issues.push(...util.prefixIssues(key, result.issues));\n                    }\n                    payload.value[keyResult.value] = result.value;\n                }\n            }\n        }\n        if (proms.length) {\n            return Promise.all(proms).then(() => payload);\n        }\n        return payload;\n    };\n});\nexport const $ZodMap = /*@__PURE__*/ core.$constructor(\"$ZodMap\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        if (!(input instanceof Map)) {\n            payload.issues.push({\n                expected: \"map\",\n                code: \"invalid_type\",\n                input,\n                inst,\n            });\n            return payload;\n        }\n        const proms = [];\n        payload.value = new Map();\n        for (const [key, value] of input) {\n            const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n            const valueResult = def.valueType._zod.run({ value: value, issues: [] }, ctx);\n            if (keyResult instanceof Promise || valueResult instanceof Promise) {\n                proms.push(Promise.all([keyResult, valueResult]).then(([keyResult, valueResult]) => {\n                    handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n                }));\n            }\n            else {\n                handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n            }\n        }\n        if (proms.length)\n            return Promise.all(proms).then(() => payload);\n        return payload;\n    };\n});\nfunction handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {\n    if (keyResult.issues.length) {\n        if (util.propertyKeyTypes.has(typeof key)) {\n            final.issues.push(...util.prefixIssues(key, keyResult.issues));\n        }\n        else {\n            final.issues.push({\n                code: \"invalid_key\",\n                origin: \"map\",\n                input,\n                inst,\n                issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n            });\n        }\n    }\n    if (valueResult.issues.length) {\n        if (util.propertyKeyTypes.has(typeof key)) {\n            final.issues.push(...util.prefixIssues(key, valueResult.issues));\n        }\n        else {\n            final.issues.push({\n                origin: \"map\",\n                code: \"invalid_element\",\n                input,\n                inst,\n                key: key,\n                issues: valueResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n            });\n        }\n    }\n    final.value.set(keyResult.value, valueResult.value);\n}\nexport const $ZodSet = /*@__PURE__*/ core.$constructor(\"$ZodSet\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        const input = payload.value;\n        if (!(input instanceof Set)) {\n            payload.issues.push({\n                input,\n                inst,\n                expected: \"set\",\n                code: \"invalid_type\",\n            });\n            return payload;\n        }\n        const proms = [];\n        payload.value = new Set();\n        for (const item of input) {\n            const result = def.valueType._zod.run({ value: item, issues: [] }, ctx);\n            if (result instanceof Promise) {\n                proms.push(result.then((result) => handleSetResult(result, payload)));\n            }\n            else\n                handleSetResult(result, payload);\n        }\n        if (proms.length)\n            return Promise.all(proms).then(() => payload);\n        return payload;\n    };\n});\nfunction handleSetResult(result, final) {\n    if (result.issues.length) {\n        final.issues.push(...result.issues);\n    }\n    final.value.add(result.value);\n}\nexport const $ZodEnum = /*@__PURE__*/ core.$constructor(\"$ZodEnum\", (inst, def) => {\n    $ZodType.init(inst, def);\n    const values = util.getEnumValues(def.entries);\n    const valuesSet = new Set(values);\n    inst._zod.values = valuesSet;\n    inst._zod.pattern = new RegExp(`^(${values\n        .filter((k) => util.propertyKeyTypes.has(typeof k))\n        .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o.toString()))\n        .join(\"|\")})$`);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        if (valuesSet.has(input)) {\n            return payload;\n        }\n        payload.issues.push({\n            code: \"invalid_value\",\n            values,\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodLiteral = /*@__PURE__*/ core.$constructor(\"$ZodLiteral\", (inst, def) => {\n    $ZodType.init(inst, def);\n    if (def.values.length === 0) {\n        throw new Error(\"Cannot create literal schema with no valid values\");\n    }\n    const values = new Set(def.values);\n    inst._zod.values = values;\n    inst._zod.pattern = new RegExp(`^(${def.values\n        .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))\n        .join(\"|\")})$`);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        if (values.has(input)) {\n            return payload;\n        }\n        payload.issues.push({\n            code: \"invalid_value\",\n            values: def.values,\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodFile = /*@__PURE__*/ core.$constructor(\"$ZodFile\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _ctx) => {\n        const input = payload.value;\n        // @ts-ignore\n        if (input instanceof File)\n            return payload;\n        payload.issues.push({\n            expected: \"file\",\n            code: \"invalid_type\",\n            input,\n            inst,\n        });\n        return payload;\n    };\n});\nexport const $ZodTransform = /*@__PURE__*/ core.$constructor(\"$ZodTransform\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.optin = \"optional\";\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            throw new core.$ZodEncodeError(inst.constructor.name);\n        }\n        const _out = def.transform(payload.value, payload);\n        if (ctx.async) {\n            const output = _out instanceof Promise ? _out : Promise.resolve(_out);\n            return output.then((output) => {\n                payload.value = output;\n                payload.fallback = true;\n                return payload;\n            });\n        }\n        if (_out instanceof Promise) {\n            throw new core.$ZodAsyncError();\n        }\n        payload.value = _out;\n        payload.fallback = true;\n        return payload;\n    };\n});\nfunction handleOptionalResult(result, input) {\n    if (input === undefined && (result.issues.length || result.fallback)) {\n        return { issues: [], value: undefined };\n    }\n    return result;\n}\nexport const $ZodOptional = /*@__PURE__*/ core.$constructor(\"$ZodOptional\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.optin = \"optional\";\n    inst._zod.optout = \"optional\";\n    util.defineLazy(inst._zod, \"values\", () => {\n        return def.innerType._zod.values ? new Set([...def.innerType._zod.values, undefined]) : undefined;\n    });\n    util.defineLazy(inst._zod, \"pattern\", () => {\n        const pattern = def.innerType._zod.pattern;\n        return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)})?$`) : undefined;\n    });\n    inst._zod.parse = (payload, ctx) => {\n        if (def.innerType._zod.optin === \"optional\") {\n            const input = payload.value;\n            const result = def.innerType._zod.run(payload, ctx);\n            if (result instanceof Promise)\n                return result.then((r) => handleOptionalResult(r, input));\n            return handleOptionalResult(result, input);\n        }\n        if (payload.value === undefined) {\n            return payload;\n        }\n        return def.innerType._zod.run(payload, ctx);\n    };\n});\nexport const $ZodExactOptional = /*@__PURE__*/ core.$constructor(\"$ZodExactOptional\", (inst, def) => {\n    // Call parent init - inherits optin/optout = \"optional\"\n    $ZodOptional.init(inst, def);\n    // Override values/pattern to NOT add undefined\n    util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n    util.defineLazy(inst._zod, \"pattern\", () => def.innerType._zod.pattern);\n    // Override parse to just delegate (no undefined handling)\n    inst._zod.parse = (payload, ctx) => {\n        return def.innerType._zod.run(payload, ctx);\n    };\n});\nexport const $ZodNullable = /*@__PURE__*/ core.$constructor(\"$ZodNullable\", (inst, def) => {\n    $ZodType.init(inst, def);\n    util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n    util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n    util.defineLazy(inst._zod, \"pattern\", () => {\n        const pattern = def.innerType._zod.pattern;\n        return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)}|null)$`) : undefined;\n    });\n    util.defineLazy(inst._zod, \"values\", () => {\n        return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : undefined;\n    });\n    inst._zod.parse = (payload, ctx) => {\n        // Forward direction (decode): allow null to pass through\n        if (payload.value === null)\n            return payload;\n        return def.innerType._zod.run(payload, ctx);\n    };\n});\nexport const $ZodDefault = /*@__PURE__*/ core.$constructor(\"$ZodDefault\", (inst, def) => {\n    $ZodType.init(inst, def);\n    // inst._zod.qin = \"true\";\n    inst._zod.optin = \"optional\";\n    util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            return def.innerType._zod.run(payload, ctx);\n        }\n        // Forward direction (decode): apply defaults for undefined input\n        if (payload.value === undefined) {\n            payload.value = def.defaultValue;\n            /**\n             * $ZodDefault returns the default value immediately in forward direction.\n             * It doesn't pass the default value into the validator (\"prefault\"). There's no reason to pass the default value through validation. The validity of the default is enforced by TypeScript statically. Otherwise, it's the responsibility of the user to ensure the default is valid. In the case of pipes with divergent in/out types, you can specify the default on the `in` schema of your ZodPipe to set a \"prefault\" for the pipe.   */\n            return payload;\n        }\n        // Forward direction: continue with default handling\n        const result = def.innerType._zod.run(payload, ctx);\n        if (result instanceof Promise) {\n            return result.then((result) => handleDefaultResult(result, def));\n        }\n        return handleDefaultResult(result, def);\n    };\n});\nfunction handleDefaultResult(payload, def) {\n    if (payload.value === undefined) {\n        payload.value = def.defaultValue;\n    }\n    return payload;\n}\nexport const $ZodPrefault = /*@__PURE__*/ core.$constructor(\"$ZodPrefault\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.optin = \"optional\";\n    util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            return def.innerType._zod.run(payload, ctx);\n        }\n        // Forward direction (decode): apply prefault for undefined input\n        if (payload.value === undefined) {\n            payload.value = def.defaultValue;\n        }\n        return def.innerType._zod.run(payload, ctx);\n    };\n});\nexport const $ZodNonOptional = /*@__PURE__*/ core.$constructor(\"$ZodNonOptional\", (inst, def) => {\n    $ZodType.init(inst, def);\n    util.defineLazy(inst._zod, \"values\", () => {\n        const v = def.innerType._zod.values;\n        return v ? new Set([...v].filter((x) => x !== undefined)) : undefined;\n    });\n    inst._zod.parse = (payload, ctx) => {\n        const result = def.innerType._zod.run(payload, ctx);\n        if (result instanceof Promise) {\n            return result.then((result) => handleNonOptionalResult(result, inst));\n        }\n        return handleNonOptionalResult(result, inst);\n    };\n});\nfunction handleNonOptionalResult(payload, inst) {\n    if (!payload.issues.length && payload.value === undefined) {\n        payload.issues.push({\n            code: \"invalid_type\",\n            expected: \"nonoptional\",\n            input: payload.value,\n            inst,\n        });\n    }\n    return payload;\n}\nexport const $ZodSuccess = /*@__PURE__*/ core.$constructor(\"$ZodSuccess\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            throw new core.$ZodEncodeError(\"ZodSuccess\");\n        }\n        const result = def.innerType._zod.run(payload, ctx);\n        if (result instanceof Promise) {\n            return result.then((result) => {\n                payload.value = result.issues.length === 0;\n                return payload;\n            });\n        }\n        payload.value = result.issues.length === 0;\n        return payload;\n    };\n});\nexport const $ZodCatch = /*@__PURE__*/ core.$constructor(\"$ZodCatch\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.optin = \"optional\";\n    util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n    util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            return def.innerType._zod.run(payload, ctx);\n        }\n        // Forward direction (decode): apply catch logic\n        const result = def.innerType._zod.run(payload, ctx);\n        if (result instanceof Promise) {\n            return result.then((result) => {\n                payload.value = result.value;\n                if (result.issues.length) {\n                    payload.value = def.catchValue({\n                        ...payload,\n                        error: {\n                            issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n                        },\n                        input: payload.value,\n                    });\n                    payload.issues = [];\n                    payload.fallback = true;\n                }\n                return payload;\n            });\n        }\n        payload.value = result.value;\n        if (result.issues.length) {\n            payload.value = def.catchValue({\n                ...payload,\n                error: {\n                    issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n                },\n                input: payload.value,\n            });\n            payload.issues = [];\n            payload.fallback = true;\n        }\n        return payload;\n    };\n});\nexport const $ZodNaN = /*@__PURE__*/ core.$constructor(\"$ZodNaN\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _ctx) => {\n        if (typeof payload.value !== \"number\" || !Number.isNaN(payload.value)) {\n            payload.issues.push({\n                input: payload.value,\n                inst,\n                expected: \"nan\",\n                code: \"invalid_type\",\n            });\n            return payload;\n        }\n        return payload;\n    };\n});\nexport const $ZodPipe = /*@__PURE__*/ core.$constructor(\"$ZodPipe\", (inst, def) => {\n    $ZodType.init(inst, def);\n    util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n    util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n    util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n    util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            const right = def.out._zod.run(payload, ctx);\n            if (right instanceof Promise) {\n                return right.then((right) => handlePipeResult(right, def.in, ctx));\n            }\n            return handlePipeResult(right, def.in, ctx);\n        }\n        const left = def.in._zod.run(payload, ctx);\n        if (left instanceof Promise) {\n            return left.then((left) => handlePipeResult(left, def.out, ctx));\n        }\n        return handlePipeResult(left, def.out, ctx);\n    };\n});\nfunction handlePipeResult(left, next, ctx) {\n    if (left.issues.length) {\n        // prevent further checks\n        left.aborted = true;\n        return left;\n    }\n    return next._zod.run({ value: left.value, issues: left.issues, fallback: left.fallback }, ctx);\n}\nexport const $ZodCodec = /*@__PURE__*/ core.$constructor(\"$ZodCodec\", (inst, def) => {\n    $ZodType.init(inst, def);\n    util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n    util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n    util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n    util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n    inst._zod.parse = (payload, ctx) => {\n        const direction = ctx.direction || \"forward\";\n        if (direction === \"forward\") {\n            const left = def.in._zod.run(payload, ctx);\n            if (left instanceof Promise) {\n                return left.then((left) => handleCodecAResult(left, def, ctx));\n            }\n            return handleCodecAResult(left, def, ctx);\n        }\n        else {\n            const right = def.out._zod.run(payload, ctx);\n            if (right instanceof Promise) {\n                return right.then((right) => handleCodecAResult(right, def, ctx));\n            }\n            return handleCodecAResult(right, def, ctx);\n        }\n    };\n});\nfunction handleCodecAResult(result, def, ctx) {\n    if (result.issues.length) {\n        // prevent further checks\n        result.aborted = true;\n        return result;\n    }\n    const direction = ctx.direction || \"forward\";\n    if (direction === \"forward\") {\n        const transformed = def.transform(result.value, result);\n        if (transformed instanceof Promise) {\n            return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx));\n        }\n        return handleCodecTxResult(result, transformed, def.out, ctx);\n    }\n    else {\n        const transformed = def.reverseTransform(result.value, result);\n        if (transformed instanceof Promise) {\n            return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx));\n        }\n        return handleCodecTxResult(result, transformed, def.in, ctx);\n    }\n}\nfunction handleCodecTxResult(left, value, nextSchema, ctx) {\n    // Check if transform added any issues\n    if (left.issues.length) {\n        left.aborted = true;\n        return left;\n    }\n    return nextSchema._zod.run({ value, issues: left.issues }, ctx);\n}\nexport const $ZodPreprocess = /*@__PURE__*/ core.$constructor(\"$ZodPreprocess\", (inst, def) => {\n    $ZodPipe.init(inst, def);\n});\nexport const $ZodReadonly = /*@__PURE__*/ core.$constructor(\"$ZodReadonly\", (inst, def) => {\n    $ZodType.init(inst, def);\n    util.defineLazy(inst._zod, \"propValues\", () => def.innerType._zod.propValues);\n    util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n    util.defineLazy(inst._zod, \"optin\", () => def.innerType?._zod?.optin);\n    util.defineLazy(inst._zod, \"optout\", () => def.innerType?._zod?.optout);\n    inst._zod.parse = (payload, ctx) => {\n        if (ctx.direction === \"backward\") {\n            return def.innerType._zod.run(payload, ctx);\n        }\n        const result = def.innerType._zod.run(payload, ctx);\n        if (result instanceof Promise) {\n            return result.then(handleReadonlyResult);\n        }\n        return handleReadonlyResult(result);\n    };\n});\nfunction handleReadonlyResult(payload) {\n    payload.value = Object.freeze(payload.value);\n    return payload;\n}\nexport const $ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"$ZodTemplateLiteral\", (inst, def) => {\n    $ZodType.init(inst, def);\n    const regexParts = [];\n    for (const part of def.parts) {\n        if (typeof part === \"object\" && part !== null) {\n            // is Zod schema\n            if (!part._zod.pattern) {\n                // if (!source)\n                throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);\n            }\n            const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n            if (!source)\n                throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n            const start = source.startsWith(\"^\") ? 1 : 0;\n            const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n            regexParts.push(source.slice(start, end));\n        }\n        else if (part === null || util.primitiveTypes.has(typeof part)) {\n            regexParts.push(util.escapeRegex(`${part}`));\n        }\n        else {\n            throw new Error(`Invalid template literal part: ${part}`);\n        }\n    }\n    inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n    inst._zod.parse = (payload, _ctx) => {\n        if (typeof payload.value !== \"string\") {\n            payload.issues.push({\n                input: payload.value,\n                inst,\n                expected: \"string\",\n                code: \"invalid_type\",\n            });\n            return payload;\n        }\n        inst._zod.pattern.lastIndex = 0;\n        if (!inst._zod.pattern.test(payload.value)) {\n            payload.issues.push({\n                input: payload.value,\n                inst,\n                code: \"invalid_format\",\n                format: def.format ?? \"template_literal\",\n                pattern: inst._zod.pattern.source,\n            });\n            return payload;\n        }\n        return payload;\n    };\n});\nexport const $ZodFunction = /*@__PURE__*/ core.$constructor(\"$ZodFunction\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._def = def;\n    inst._zod.def = def;\n    inst.implement = (func) => {\n        if (typeof func !== \"function\") {\n            throw new Error(\"implement() must be called with a function\");\n        }\n        return function (...args) {\n            const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args;\n            const result = Reflect.apply(func, this, parsedArgs);\n            if (inst._def.output) {\n                return parse(inst._def.output, result);\n            }\n            return result;\n        };\n    };\n    inst.implementAsync = (func) => {\n        if (typeof func !== \"function\") {\n            throw new Error(\"implementAsync() must be called with a function\");\n        }\n        return async function (...args) {\n            const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args;\n            const result = await Reflect.apply(func, this, parsedArgs);\n            if (inst._def.output) {\n                return await parseAsync(inst._def.output, result);\n            }\n            return result;\n        };\n    };\n    inst._zod.parse = (payload, _ctx) => {\n        if (typeof payload.value !== \"function\") {\n            payload.issues.push({\n                code: \"invalid_type\",\n                expected: \"function\",\n                input: payload.value,\n                inst,\n            });\n            return payload;\n        }\n        // Check if output is a promise type to determine if we should use async implementation\n        const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === \"promise\";\n        if (hasPromiseOutput) {\n            payload.value = inst.implementAsync(payload.value);\n        }\n        else {\n            payload.value = inst.implement(payload.value);\n        }\n        return payload;\n    };\n    inst.input = (...args) => {\n        const F = inst.constructor;\n        if (Array.isArray(args[0])) {\n            return new F({\n                type: \"function\",\n                input: new $ZodTuple({\n                    type: \"tuple\",\n                    items: args[0],\n                    rest: args[1],\n                }),\n                output: inst._def.output,\n            });\n        }\n        return new F({\n            type: \"function\",\n            input: args[0],\n            output: inst._def.output,\n        });\n    };\n    inst.output = (output) => {\n        const F = inst.constructor;\n        return new F({\n            type: \"function\",\n            input: inst._def.input,\n            output,\n        });\n    };\n    return inst;\n});\nexport const $ZodPromise = /*@__PURE__*/ core.$constructor(\"$ZodPromise\", (inst, def) => {\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, ctx) => {\n        return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx));\n    };\n});\nexport const $ZodLazy = /*@__PURE__*/ core.$constructor(\"$ZodLazy\", (inst, def) => {\n    $ZodType.init(inst, def);\n    // Cache the resolved inner type on the shared `def` so all clones of this\n    // lazy (e.g. via `.describe()`/`.meta()`) share the same inner instance,\n    // preserving identity for cycle detection on recursive schemas.\n    util.defineLazy(inst._zod, \"innerType\", () => {\n        const d = def;\n        if (!d._cachedInner)\n            d._cachedInner = def.getter();\n        return d._cachedInner;\n    });\n    util.defineLazy(inst._zod, \"pattern\", () => inst._zod.innerType?._zod?.pattern);\n    util.defineLazy(inst._zod, \"propValues\", () => inst._zod.innerType?._zod?.propValues);\n    util.defineLazy(inst._zod, \"optin\", () => inst._zod.innerType?._zod?.optin ?? undefined);\n    util.defineLazy(inst._zod, \"optout\", () => inst._zod.innerType?._zod?.optout ?? undefined);\n    inst._zod.parse = (payload, ctx) => {\n        const inner = inst._zod.innerType;\n        return inner._zod.run(payload, ctx);\n    };\n});\nexport const $ZodCustom = /*@__PURE__*/ core.$constructor(\"$ZodCustom\", (inst, def) => {\n    checks.$ZodCheck.init(inst, def);\n    $ZodType.init(inst, def);\n    inst._zod.parse = (payload, _) => {\n        return payload;\n    };\n    inst._zod.check = (payload) => {\n        const input = payload.value;\n        const r = def.fn(input);\n        if (r instanceof Promise) {\n            return r.then((r) => handleRefineResult(r, payload, input, inst));\n        }\n        handleRefineResult(r, payload, input, inst);\n        return;\n    };\n});\nfunction handleRefineResult(result, payload, input, inst) {\n    if (!result) {\n        const _iss = {\n            code: \"custom\",\n            input,\n            inst, // incorporates params.error into issue reporting\n            path: [...(inst._zod.def.path ?? [])], // incorporates params.error into issue reporting\n            continue: !inst._zod.def.abort,\n            // params: inst._zod.def.params,\n        };\n        if (inst._zod.def.params)\n            _iss.params = inst._zod.def.params;\n        payload.issues.push(util.issue(_iss));\n    }\n}\n", "export { default as ar } from \"./ar.js\";\nexport { default as az } from \"./az.js\";\nexport { default as be } from \"./be.js\";\nexport { default as bg } from \"./bg.js\";\nexport { default as ca } from \"./ca.js\";\nexport { default as cs } from \"./cs.js\";\nexport { default as da } from \"./da.js\";\nexport { default as de } from \"./de.js\";\nexport { default as el } from \"./el.js\";\nexport { default as en } from \"./en.js\";\nexport { default as eo } from \"./eo.js\";\nexport { default as es } from \"./es.js\";\nexport { default as fa } from \"./fa.js\";\nexport { default as fi } from \"./fi.js\";\nexport { default as fr } from \"./fr.js\";\nexport { default as frCA } from \"./fr-CA.js\";\nexport { default as he } from \"./he.js\";\nexport { default as hr } from \"./hr.js\";\nexport { default as hu } from \"./hu.js\";\nexport { default as hy } from \"./hy.js\";\nexport { default as id } from \"./id.js\";\nexport { default as is } from \"./is.js\";\nexport { default as it } from \"./it.js\";\nexport { default as ja } from \"./ja.js\";\nexport { default as ka } from \"./ka.js\";\nexport { default as kh } from \"./kh.js\";\nexport { default as km } from \"./km.js\";\nexport { default as ko } from \"./ko.js\";\nexport { default as lt } from \"./lt.js\";\nexport { default as mk } from \"./mk.js\";\nexport { default as ms } from \"./ms.js\";\nexport { default as nl } from \"./nl.js\";\nexport { default as no } from \"./no.js\";\nexport { default as ota } from \"./ota.js\";\nexport { default as ps } from \"./ps.js\";\nexport { default as pl } from \"./pl.js\";\nexport { default as pt } from \"./pt.js\";\nexport { default as ro } from \"./ro.js\";\nexport { default as ru } from \"./ru.js\";\nexport { default as sl } from \"./sl.js\";\nexport { default as sv } from \"./sv.js\";\nexport { default as ta } from \"./ta.js\";\nexport { default as th } from \"./th.js\";\nexport { default as tr } from \"./tr.js\";\nexport { default as ua } from \"./ua.js\";\nexport { default as uk } from \"./uk.js\";\nexport { default as ur } from \"./ur.js\";\nexport { default as uz } from \"./uz.js\";\nexport { default as vi } from \"./vi.js\";\nexport { default as zhCN } from \"./zh-CN.js\";\nexport { default as zhTW } from \"./zh-TW.js\";\nexport { default as yo } from \"./yo.js\";\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u062D\u0631\u0641\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n        file: { unit: \"\u0628\u0627\u064A\u062A\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n        array: { unit: \"\u0639\u0646\u0635\u0631\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n        set: { unit: \"\u0639\u0646\u0635\u0631\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0645\u062F\u062E\u0644\",\n        email: \"\u0628\u0631\u064A\u062F \u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A\",\n        url: \"\u0631\u0627\u0628\u0637\",\n        emoji: \"\u0625\u064A\u0645\u0648\u062C\u064A\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u062A\u0627\u0631\u064A\u062E \u0648\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n        date: \"\u062A\u0627\u0631\u064A\u062E \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n        time: \"\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n        duration: \"\u0645\u062F\u0629 \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n        ipv4: \"\u0639\u0646\u0648\u0627\u0646 IPv4\",\n        ipv6: \"\u0639\u0646\u0648\u0627\u0646 IPv6\",\n        cidrv4: \"\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv4\",\n        cidrv6: \"\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv6\",\n        base64: \"\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64-encoded\",\n        base64url: \"\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64url-encoded\",\n        json_string: \"\u0646\u064E\u0635 \u0639\u0644\u0649 \u0647\u064A\u0626\u0629 JSON\",\n        e164: \"\u0631\u0642\u0645 \u0647\u0627\u062A\u0641 \u0628\u0645\u0639\u064A\u0627\u0631 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u0645\u062F\u062E\u0644\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 instanceof ${issue.expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${received}`;\n                }\n                return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u0627\u062E\u062A\u064A\u0627\u0631 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062A\u0648\u0642\u0639 \u0627\u0646\u062A\u0642\u0627\u0621 \u0623\u062D\u062F \u0647\u0630\u0647 \u0627\u0644\u062E\u064A\u0627\u0631\u0627\u062A: ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return ` \u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue.origin ?? \"\u0627\u0644\u0642\u064A\u0645\u0629\"} ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0635\u0631\"}`;\n                return `\u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue.origin ?? \"\u0627\u0644\u0642\u064A\u0645\u0629\"} ${adj} ${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0628\u062F\u0623 \u0628\u0640 \"${issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0646\u062A\u0647\u064A \u0628\u0640 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u062A\u0636\u0645\u0651\u064E\u0646 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0637\u0627\u0628\u0642 \u0627\u0644\u0646\u0645\u0637 ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644`;\n            }\n            case \"not_multiple_of\":\n                return `\u0631\u0642\u0645 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0645\u0646 \u0645\u0636\u0627\u0639\u0641\u0627\u062A ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u0645\u0639\u0631\u0641${issue.keys.length > 1 ? \"\u0627\u062A\" : \"\"} \u063A\u0631\u064A\u0628${issue.keys.length > 1 ? \"\u0629\" : \"\"}: ${util.joinValues(issue.keys, \"\u060C \")}`;\n            case \"invalid_key\":\n                return `\u0645\u0639\u0631\u0641 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\";\n            case \"invalid_element\":\n                return `\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue.origin}`;\n            default:\n                return \"\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\";\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"simvol\", verb: \"olmal\u0131d\u0131r\" },\n        file: { unit: \"bayt\", verb: \"olmal\u0131d\u0131r\" },\n        array: { unit: \"element\", verb: \"olmal\u0131d\u0131r\" },\n        set: { unit: \"element\", verb: \"olmal\u0131d\u0131r\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"email address\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO datetime\",\n        date: \"ISO date\",\n        time: \"ISO time\",\n        duration: \"ISO duration\",\n        ipv4: \"IPv4 address\",\n        ipv6: \"IPv6 address\",\n        cidrv4: \"IPv4 range\",\n        cidrv6: \"IPv6 range\",\n        base64: \"base64-encoded string\",\n        base64url: \"base64url-encoded string\",\n        json_string: \"JSON string\",\n        e164: \"E.164 number\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Yanl\u0131\u015F d\u0259y\u0259r: g\u00F6zl\u0259nil\u0259n instanceof ${issue.expected}, daxil olan ${received}`;\n                }\n                return `Yanl\u0131\u015F d\u0259y\u0259r: g\u00F6zl\u0259nil\u0259n ${expected}, daxil olan ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Yanl\u0131\u015F d\u0259y\u0259r: g\u00F6zl\u0259nil\u0259n ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Yanl\u0131\u015F se\u00E7im: a\u015Fa\u011F\u0131dak\u0131lardan biri olmal\u0131d\u0131r: ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u00C7ox b\u00F6y\u00FCk: g\u00F6zl\u0259nil\u0259n ${issue.origin ?? \"d\u0259y\u0259r\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"element\"}`;\n                return `\u00C7ox b\u00F6y\u00FCk: g\u00F6zl\u0259nil\u0259n ${issue.origin ?? \"d\u0259y\u0259r\"} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u00C7ox ki\u00E7ik: g\u00F6zl\u0259nil\u0259n ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                return `\u00C7ox ki\u00E7ik: g\u00F6zl\u0259nil\u0259n ${issue.origin} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Yanl\u0131\u015F m\u0259tn: \"${_issue.prefix}\" il\u0259 ba\u015Flamal\u0131d\u0131r`;\n                if (_issue.format === \"ends_with\")\n                    return `Yanl\u0131\u015F m\u0259tn: \"${_issue.suffix}\" il\u0259 bitm\u0259lidir`;\n                if (_issue.format === \"includes\")\n                    return `Yanl\u0131\u015F m\u0259tn: \"${_issue.includes}\" daxil olmal\u0131d\u0131r`;\n                if (_issue.format === \"regex\")\n                    return `Yanl\u0131\u015F m\u0259tn: ${_issue.pattern} \u015Fablonuna uy\u011Fun olmal\u0131d\u0131r`;\n                return `Yanl\u0131\u015F ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Yanl\u0131\u015F \u0259d\u0259d: ${issue.divisor} il\u0259 b\u00F6l\u00FCn\u0259 bil\u0259n olmal\u0131d\u0131r`;\n            case \"unrecognized_keys\":\n                return `Tan\u0131nmayan a\u00E7ar${issue.keys.length > 1 ? \"lar\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} daxilind\u0259 yanl\u0131\u015F a\u00E7ar`;\n            case \"invalid_union\":\n                return \"Yanl\u0131\u015F d\u0259y\u0259r\";\n            case \"invalid_element\":\n                return `${issue.origin} daxilind\u0259 yanl\u0131\u015F d\u0259y\u0259r`;\n            default:\n                return `Yanl\u0131\u015F d\u0259y\u0259r`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nfunction getBelarusianPlural(count, one, few, many) {\n    const absCount = Math.abs(count);\n    const lastDigit = absCount % 10;\n    const lastTwoDigits = absCount % 100;\n    if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {\n        return many;\n    }\n    if (lastDigit === 1) {\n        return one;\n    }\n    if (lastDigit >= 2 && lastDigit <= 4) {\n        return few;\n    }\n    return many;\n}\nconst error = () => {\n    const Sizable = {\n        string: {\n            unit: {\n                one: \"\u0441\u0456\u043C\u0432\u0430\u043B\",\n                few: \"\u0441\u0456\u043C\u0432\u0430\u043B\u044B\",\n                many: \"\u0441\u0456\u043C\u0432\u0430\u043B\u0430\u045E\",\n            },\n            verb: \"\u043C\u0435\u0446\u044C\",\n        },\n        array: {\n            unit: {\n                one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n                few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B\",\n                many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E\",\n            },\n            verb: \"\u043C\u0435\u0446\u044C\",\n        },\n        set: {\n            unit: {\n                one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n                few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B\",\n                many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E\",\n            },\n            verb: \"\u043C\u0435\u0446\u044C\",\n        },\n        file: {\n            unit: {\n                one: \"\u0431\u0430\u0439\u0442\",\n                few: \"\u0431\u0430\u0439\u0442\u044B\",\n                many: \"\u0431\u0430\u0439\u0442\u0430\u045E\",\n            },\n            verb: \"\u043C\u0435\u0446\u044C\",\n        },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0443\u0432\u043E\u0434\",\n        email: \"email \u0430\u0434\u0440\u0430\u0441\",\n        url: \"URL\",\n        emoji: \"\u044D\u043C\u043E\u0434\u0437\u0456\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u0434\u0430\u0442\u0430 \u0456 \u0447\u0430\u0441\",\n        date: \"ISO \u0434\u0430\u0442\u0430\",\n        time: \"ISO \u0447\u0430\u0441\",\n        duration: \"ISO \u043F\u0440\u0430\u0446\u044F\u0433\u043B\u0430\u0441\u0446\u044C\",\n        ipv4: \"IPv4 \u0430\u0434\u0440\u0430\u0441\",\n        ipv6: \"IPv6 \u0430\u0434\u0440\u0430\u0441\",\n        cidrv4: \"IPv4 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D\",\n        cidrv6: \"IPv6 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D\",\n        base64: \"\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64\",\n        base64url: \"\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64url\",\n        json_string: \"JSON \u0440\u0430\u0434\u043E\u043A\",\n        e164: \"\u043D\u0443\u043C\u0430\u0440 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u0443\u0432\u043E\u0434\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u043B\u0456\u043A\",\n        array: \"\u043C\u0430\u0441\u0456\u045E\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F instanceof ${issue.expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${received}`;\n                }\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F ${expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0432\u0430\u0440\u044B\u044F\u043D\u0442: \u0447\u0430\u043A\u0430\u045E\u0441\u044F \u0430\u0434\u0437\u0456\u043D \u0437 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    const maxValue = Number(issue.maximum);\n                    const unit = getBelarusianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n                    return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435\"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue.maximum.toString()} ${unit}`;\n                }\n                return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435\"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    const minValue = Number(issue.minimum);\n                    const unit = getBelarusianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n                    return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue.minimum.toString()} ${unit}`;\n                }\n                return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u043F\u0430\u0447\u044B\u043D\u0430\u0446\u0446\u0430 \u0437 \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u0430\u043A\u0430\u043D\u0447\u0432\u0430\u0446\u0446\u0430 \u043D\u0430 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u043C\u044F\u0448\u0447\u0430\u0446\u044C \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0430\u0434\u043F\u0430\u0432\u044F\u0434\u0430\u0446\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`;\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043B\u0456\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0431\u044B\u0446\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u041D\u0435\u0440\u0430\u0441\u043F\u0430\u0437\u043D\u0430\u043D\u044B ${issue.keys.length > 1 ? \"\u043A\u043B\u044E\u0447\u044B\" : \"\u043A\u043B\u044E\u0447\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043A\u043B\u044E\u0447 \u0443 ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434\";\n            case \"invalid_element\":\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u0430\u0435 \u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435 \u045E ${issue.origin}`;\n            default:\n                return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u0441\u0438\u043C\u0432\u043E\u043B\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n        file: { unit: \"\u0431\u0430\u0439\u0442\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n        array: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n        set: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0432\u0445\u043E\u0434\",\n        email: \"\u0438\u043C\u0435\u0439\u043B \u0430\u0434\u0440\u0435\u0441\",\n        url: \"URL\",\n        emoji: \"\u0435\u043C\u043E\u0434\u0436\u0438\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u0432\u0440\u0435\u043C\u0435\",\n        date: \"ISO \u0434\u0430\u0442\u0430\",\n        time: \"ISO \u0432\u0440\u0435\u043C\u0435\",\n        duration: \"ISO \u043F\u0440\u043E\u0434\u044A\u043B\u0436\u0438\u0442\u0435\u043B\u043D\u043E\u0441\u0442\",\n        ipv4: \"IPv4 \u0430\u0434\u0440\u0435\u0441\",\n        ipv6: \"IPv6 \u0430\u0434\u0440\u0435\u0441\",\n        cidrv4: \"IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n        cidrv6: \"IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n        base64: \"base64-\u043A\u043E\u0434\u0438\u0440\u0430\u043D \u043D\u0438\u0437\",\n        base64url: \"base64url-\u043A\u043E\u0434\u0438\u0440\u0430\u043D \u043D\u0438\u0437\",\n        json_string: \"JSON \u043D\u0438\u0437\",\n        e164: \"E.164 \u043D\u043E\u043C\u0435\u0440\",\n        jwt: \"JWT\",\n        template_literal: \"\u0432\u0445\u043E\u0434\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0447\u0438\u0441\u043B\u043E\",\n        array: \"\u043C\u0430\u0441\u0438\u0432\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D instanceof ${issue.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D ${received}`;\n                }\n                return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D ${expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u043E\u043F\u0446\u0438\u044F: \u043E\u0447\u0430\u043A\u0432\u0430\u043D\u043E \u0435\u0434\u043D\u043E \u043E\u0442 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u0422\u0432\u044A\u0440\u0434\u0435 \u0433\u043E\u043B\u044F\u043C\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin ?? \"\u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442\"} \u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430\"}`;\n                return `\u0422\u0432\u044A\u0440\u0434\u0435 \u0433\u043E\u043B\u044F\u043C\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin ?? \"\u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442\"} \u0434\u0430 \u0431\u044A\u0434\u0435 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0422\u0432\u044A\u0440\u0434\u0435 \u043C\u0430\u043B\u043A\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin} \u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430 ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u0422\u0432\u044A\u0440\u0434\u0435 \u043C\u0430\u043B\u043A\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin} \u0434\u0430 \u0431\u044A\u0434\u0435 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u0432\u0430 \u0441 \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u0432\u044A\u0440\u0448\u0432\u0430 \u0441 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0432\u0430 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0441\u044A\u0432\u043F\u0430\u0434\u0430 \u0441 ${_issue.pattern}`;\n                let invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D\";\n                if (_issue.format === \"emoji\")\n                    invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E\";\n                if (_issue.format === \"datetime\")\n                    invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E\";\n                if (_issue.format === \"date\")\n                    invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430\";\n                if (_issue.format === \"time\")\n                    invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E\";\n                if (_issue.format === \"duration\")\n                    invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430\";\n                return `${invalid_adj} ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E \u0447\u0438\u0441\u043B\u043E: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0431\u044A\u0434\u0435 \u043A\u0440\u0430\u0442\u043D\u043E \u043D\u0430 ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u041D\u0435\u0440\u0430\u0437\u043F\u043E\u0437\u043D\u0430\u0442${issue.keys.length > 1 ? \"\u0438\" : \"\"} \u043A\u043B\u044E\u0447${issue.keys.length > 1 ? \"\u043E\u0432\u0435\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043A\u043B\u044E\u0447 \u0432 ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434\";\n            case \"invalid_element\":\n                return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442 \u0432 ${issue.origin}`;\n            default:\n                return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"car\u00E0cters\", verb: \"contenir\" },\n        file: { unit: \"bytes\", verb: \"contenir\" },\n        array: { unit: \"elements\", verb: \"contenir\" },\n        set: { unit: \"elements\", verb: \"contenir\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"entrada\",\n        email: \"adre\u00E7a electr\u00F2nica\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"data i hora ISO\",\n        date: \"data ISO\",\n        time: \"hora ISO\",\n        duration: \"durada ISO\",\n        ipv4: \"adre\u00E7a IPv4\",\n        ipv6: \"adre\u00E7a IPv6\",\n        cidrv4: \"rang IPv4\",\n        cidrv6: \"rang IPv6\",\n        base64: \"cadena codificada en base64\",\n        base64url: \"cadena codificada en base64url\",\n        json_string: \"cadena JSON\",\n        e164: \"n\u00FAmero E.164\",\n        jwt: \"JWT\",\n        template_literal: \"entrada\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Tipus inv\u00E0lid: s'esperava instanceof ${issue.expected}, s'ha rebut ${received}`;\n                }\n                return `Tipus inv\u00E0lid: s'esperava ${expected}, s'ha rebut ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Valor inv\u00E0lid: s'esperava ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Opci\u00F3 inv\u00E0lida: s'esperava una de ${util.joinValues(issue.values, \" o \")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"com a m\u00E0xim\" : \"menys de\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Massa gran: s'esperava que ${issue.origin ?? \"el valor\"} contingu\u00E9s ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"elements\"}`;\n                return `Massa gran: s'esperava que ${issue.origin ?? \"el valor\"} fos ${adj} ${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \"com a m\u00EDnim\" : \"m\u00E9s de\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Massa petit: s'esperava que ${issue.origin} contingu\u00E9s ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Massa petit: s'esperava que ${issue.origin} fos ${adj} ${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Format inv\u00E0lid: ha de comen\u00E7ar amb \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Format inv\u00E0lid: ha d'acabar amb \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Format inv\u00E0lid: ha d'incloure \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Format inv\u00E0lid: ha de coincidir amb el patr\u00F3 ${_issue.pattern}`;\n                return `Format inv\u00E0lid per a ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `N\u00FAmero inv\u00E0lid: ha de ser m\u00FAltiple de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Clau${issue.keys.length > 1 ? \"s\" : \"\"} no reconeguda${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Clau inv\u00E0lida a ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Entrada inv\u00E0lida\"; // Could also be \"Tipus d'uni\u00F3 inv\u00E0lid\" but \"Entrada inv\u00E0lida\" is more general\n            case \"invalid_element\":\n                return `Element inv\u00E0lid a ${issue.origin}`;\n            default:\n                return `Entrada inv\u00E0lida`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"znak\u016F\", verb: \"m\u00EDt\" },\n        file: { unit: \"bajt\u016F\", verb: \"m\u00EDt\" },\n        array: { unit: \"prvk\u016F\", verb: \"m\u00EDt\" },\n        set: { unit: \"prvk\u016F\", verb: \"m\u00EDt\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"regul\u00E1rn\u00ED v\u00FDraz\",\n        email: \"e-mailov\u00E1 adresa\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"datum a \u010Das ve form\u00E1tu ISO\",\n        date: \"datum ve form\u00E1tu ISO\",\n        time: \"\u010Das ve form\u00E1tu ISO\",\n        duration: \"doba trv\u00E1n\u00ED ISO\",\n        ipv4: \"IPv4 adresa\",\n        ipv6: \"IPv6 adresa\",\n        cidrv4: \"rozsah IPv4\",\n        cidrv6: \"rozsah IPv6\",\n        base64: \"\u0159et\u011Bzec zak\u00F3dovan\u00FD ve form\u00E1tu base64\",\n        base64url: \"\u0159et\u011Bzec zak\u00F3dovan\u00FD ve form\u00E1tu base64url\",\n        json_string: \"\u0159et\u011Bzec ve form\u00E1tu JSON\",\n        e164: \"\u010D\u00EDslo E.164\",\n        jwt: \"JWT\",\n        template_literal: \"vstup\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u010D\u00EDslo\",\n        string: \"\u0159et\u011Bzec\",\n        function: \"funkce\",\n        array: \"pole\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Neplatn\u00FD vstup: o\u010Dek\u00E1v\u00E1no instanceof ${issue.expected}, obdr\u017Eeno ${received}`;\n                }\n                return `Neplatn\u00FD vstup: o\u010Dek\u00E1v\u00E1no ${expected}, obdr\u017Eeno ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Neplatn\u00FD vstup: o\u010Dek\u00E1v\u00E1no ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Neplatn\u00E1 mo\u017Enost: o\u010Dek\u00E1v\u00E1na jedna z hodnot ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Hodnota je p\u0159\u00EDli\u0161 velk\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED m\u00EDt ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"prvk\u016F\"}`;\n                }\n                return `Hodnota je p\u0159\u00EDli\u0161 velk\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED b\u00FDt ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Hodnota je p\u0159\u00EDli\u0161 mal\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED m\u00EDt ${adj}${issue.minimum.toString()} ${sizing.unit ?? \"prvk\u016F\"}`;\n                }\n                return `Hodnota je p\u0159\u00EDli\u0161 mal\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED b\u00FDt ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED za\u010D\u00EDnat na \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED kon\u010Dit na \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED obsahovat \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED odpov\u00EDdat vzoru ${_issue.pattern}`;\n                return `Neplatn\u00FD form\u00E1t ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Neplatn\u00E9 \u010D\u00EDslo: mus\u00ED b\u00FDt n\u00E1sobkem ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Nezn\u00E1m\u00E9 kl\u00ED\u010De: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Neplatn\u00FD kl\u00ED\u010D v ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Neplatn\u00FD vstup\";\n            case \"invalid_element\":\n                return `Neplatn\u00E1 hodnota v ${issue.origin}`;\n            default:\n                return `Neplatn\u00FD vstup`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"tegn\", verb: \"havde\" },\n        file: { unit: \"bytes\", verb: \"havde\" },\n        array: { unit: \"elementer\", verb: \"indeholdt\" },\n        set: { unit: \"elementer\", verb: \"indeholdt\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"e-mailadresse\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO dato- og klokkesl\u00E6t\",\n        date: \"ISO-dato\",\n        time: \"ISO-klokkesl\u00E6t\",\n        duration: \"ISO-varighed\",\n        ipv4: \"IPv4-omr\u00E5de\",\n        ipv6: \"IPv6-omr\u00E5de\",\n        cidrv4: \"IPv4-spektrum\",\n        cidrv6: \"IPv6-spektrum\",\n        base64: \"base64-kodet streng\",\n        base64url: \"base64url-kodet streng\",\n        json_string: \"JSON-streng\",\n        e164: \"E.164-nummer\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        string: \"streng\",\n        number: \"tal\",\n        boolean: \"boolean\",\n        array: \"liste\",\n        object: \"objekt\",\n        set: \"s\u00E6t\",\n        file: \"fil\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Ugyldigt input: forventede instanceof ${issue.expected}, fik ${received}`;\n                }\n                return `Ugyldigt input: forventede ${expected}, fik ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Ugyldig v\u00E6rdi: forventede ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Ugyldigt valg: forventede en af f\u00F8lgende ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                if (sizing)\n                    return `For stor: forventede ${origin ?? \"value\"} ${sizing.verb} ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"elementer\"}`;\n                return `For stor: forventede ${origin ?? \"value\"} havde ${adj} ${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                if (sizing) {\n                    return `For lille: forventede ${origin} ${sizing.verb} ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `For lille: forventede ${origin} havde ${adj} ${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Ugyldig streng: skal starte med \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Ugyldig streng: skal ende med \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Ugyldig streng: skal indeholde \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Ugyldig streng: skal matche m\u00F8nsteret ${_issue.pattern}`;\n                return `Ugyldig ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Ugyldigt tal: skal v\u00E6re deleligt med ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `${issue.keys.length > 1 ? \"Ukendte n\u00F8gler\" : \"Ukendt n\u00F8gle\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Ugyldig n\u00F8gle i ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Ugyldigt input: matcher ingen af de tilladte typer\";\n            case \"invalid_element\":\n                return `Ugyldig v\u00E6rdi i ${issue.origin}`;\n            default:\n                return `Ugyldigt input`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"Zeichen\", verb: \"zu haben\" },\n        file: { unit: \"Bytes\", verb: \"zu haben\" },\n        array: { unit: \"Elemente\", verb: \"zu haben\" },\n        set: { unit: \"Elemente\", verb: \"zu haben\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"Eingabe\",\n        email: \"E-Mail-Adresse\",\n        url: \"URL\",\n        emoji: \"Emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO-Datum und -Uhrzeit\",\n        date: \"ISO-Datum\",\n        time: \"ISO-Uhrzeit\",\n        duration: \"ISO-Dauer\",\n        ipv4: \"IPv4-Adresse\",\n        ipv6: \"IPv6-Adresse\",\n        cidrv4: \"IPv4-Bereich\",\n        cidrv6: \"IPv6-Bereich\",\n        base64: \"Base64-codierter String\",\n        base64url: \"Base64-URL-codierter String\",\n        json_string: \"JSON-String\",\n        e164: \"E.164-Nummer\",\n        jwt: \"JWT\",\n        template_literal: \"Eingabe\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"Zahl\",\n        array: \"Array\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Ung\u00FCltige Eingabe: erwartet instanceof ${issue.expected}, erhalten ${received}`;\n                }\n                return `Ung\u00FCltige Eingabe: erwartet ${expected}, erhalten ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Ung\u00FCltige Eingabe: erwartet ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Ung\u00FCltige Option: erwartet eine von ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Zu gro\u00DF: erwartet, dass ${issue.origin ?? \"Wert\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"Elemente\"} hat`;\n                return `Zu gro\u00DF: erwartet, dass ${issue.origin ?? \"Wert\"} ${adj}${issue.maximum.toString()} ist`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Zu klein: erwartet, dass ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} hat`;\n                }\n                return `Zu klein: erwartet, dass ${issue.origin} ${adj}${issue.minimum.toString()} ist`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Ung\u00FCltiger String: muss mit \"${_issue.prefix}\" beginnen`;\n                if (_issue.format === \"ends_with\")\n                    return `Ung\u00FCltiger String: muss mit \"${_issue.suffix}\" enden`;\n                if (_issue.format === \"includes\")\n                    return `Ung\u00FCltiger String: muss \"${_issue.includes}\" enthalten`;\n                if (_issue.format === \"regex\")\n                    return `Ung\u00FCltiger String: muss dem Muster ${_issue.pattern} entsprechen`;\n                return `Ung\u00FCltig: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Ung\u00FCltige Zahl: muss ein Vielfaches von ${issue.divisor} sein`;\n            case \"unrecognized_keys\":\n                return `${issue.keys.length > 1 ? \"Unbekannte Schl\u00FCssel\" : \"Unbekannter Schl\u00FCssel\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Ung\u00FCltiger Schl\u00FCssel in ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Ung\u00FCltige Eingabe\";\n            case \"invalid_element\":\n                return `Ung\u00FCltiger Wert in ${issue.origin}`;\n            default:\n                return `Ung\u00FCltige Eingabe`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03B5\u03C2\", verb: \"\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9\" },\n        file: { unit: \"bytes\", verb: \"\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9\" },\n        array: { unit: \"\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1\", verb: \"\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9\" },\n        set: { unit: \"\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1\", verb: \"\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9\" },\n        map: { unit: \"\u03BA\u03B1\u03C4\u03B1\u03C7\u03C9\u03C1\u03AE\u03C3\u03B5\u03B9\u03C2\", verb: \"\u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2\",\n        email: \"\u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 email\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03BA\u03B1\u03B9 \u03CE\u03C1\u03B1\",\n        date: \"ISO \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1\",\n        time: \"ISO \u03CE\u03C1\u03B1\",\n        duration: \"ISO \u03B4\u03B9\u03AC\u03C1\u03BA\u03B5\u03B9\u03B1\",\n        ipv4: \"\u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 IPv4\",\n        ipv6: \"\u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 IPv6\",\n        mac: \"\u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 MAC\",\n        cidrv4: \"\u03B5\u03CD\u03C1\u03BF\u03C2 IPv4\",\n        cidrv6: \"\u03B5\u03CD\u03C1\u03BF\u03C2 IPv6\",\n        base64: \"\u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03B7 \u03C3\u03B5 base64\",\n        base64url: \"\u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03B7 \u03C3\u03B5 base64url\",\n        json_string: \"\u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC JSON\",\n        e164: \"\u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (typeof issue.expected === \"string\" && /^[A-Z]/.test(issue.expected)) {\n                    return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD instanceof ${issue.expected}, \u03BB\u03AE\u03C6\u03B8\u03B7\u03BA\u03B5 ${received}`;\n                }\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD ${expected}, \u03BB\u03AE\u03C6\u03B8\u03B7\u03BA\u03B5 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD \u03AD\u03BD\u03B1 \u03B1\u03C0\u03CC ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u03A0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD ${issue.origin ?? \"\u03C4\u03B9\u03BC\u03AE\"} \u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1\"}`;\n                return `\u03A0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD ${issue.origin ?? \"\u03C4\u03B9\u03BC\u03AE\"} \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u03A0\u03BF\u03BB\u03CD \u03BC\u03B9\u03BA\u03C1\u03CC: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD ${issue.origin} \u03BD\u03B1 \u03AD\u03C7\u03B5\u03B9 ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u03A0\u03BF\u03BB\u03CD \u03BC\u03B9\u03BA\u03C1\u03CC: \u03B1\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03C4\u03B1\u03BD ${issue.origin} \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC: \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03BE\u03B5\u03BA\u03B9\u03BD\u03AC \u03BC\u03B5 \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC: \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03B5\u03BB\u03B5\u03B9\u03CE\u03BD\u03B5\u03B9 \u03BC\u03B5 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC: \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03C3\u03C5\u03BC\u03B2\u03BF\u03BB\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC: \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03B1\u03B9\u03C1\u03B9\u03AC\u03B6\u03B5\u03B9 \u03BC\u03B5 \u03C4\u03BF \u03BC\u03BF\u03C4\u03AF\u03B2\u03BF ${_issue.pattern}`;\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF\u03C2 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2: \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03AC\u03C3\u03B9\u03BF \u03C4\u03BF\u03C5 ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u0386\u03B3\u03BD\u03C9\u03C3\u03C4${issue.keys.length > 1 ? \"\u03B1\" : \"\u03BF\"} \u03BA\u03BB\u03B5\u03B9\u03B4${issue.keys.length > 1 ? \"\u03B9\u03AC\" : \"\u03AF\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF \u03BA\u03BB\u03B5\u03B9\u03B4\u03AF \u03C3\u03C4\u03BF ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2\";\n            case \"invalid_element\":\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03C4\u03B9\u03BC\u03AE \u03C3\u03C4\u03BF ${issue.origin}`;\n            default:\n                return `\u039C\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03B7 \u03B5\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"characters\", verb: \"to have\" },\n        file: { unit: \"bytes\", verb: \"to have\" },\n        array: { unit: \"items\", verb: \"to have\" },\n        set: { unit: \"items\", verb: \"to have\" },\n        map: { unit: \"entries\", verb: \"to have\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"email address\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO datetime\",\n        date: \"ISO date\",\n        time: \"ISO time\",\n        duration: \"ISO duration\",\n        ipv4: \"IPv4 address\",\n        ipv6: \"IPv6 address\",\n        mac: \"MAC address\",\n        cidrv4: \"IPv4 range\",\n        cidrv6: \"IPv6 range\",\n        base64: \"base64-encoded string\",\n        base64url: \"base64url-encoded string\",\n        json_string: \"JSON string\",\n        e164: \"E.164 number\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    // type names: missing keys = do not translate (use raw value via ?? fallback)\n    const TypeDictionary = {\n        // Compatibility: \"nan\" -> \"NaN\" for display\n        nan: \"NaN\",\n        // All other type names omitted - they fall back to raw values via ?? operator\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                return `Invalid input: expected ${expected}, received ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Invalid input: expected ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Invalid option: expected one of ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Too big: expected ${issue.origin ?? \"value\"} to have ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elements\"}`;\n                return `Too big: expected ${issue.origin ?? \"value\"} to be ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Too small: expected ${issue.origin} to have ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Too small: expected ${issue.origin} to be ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Invalid string: must start with \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Invalid string: must end with \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Invalid string: must include \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Invalid string: must match pattern ${_issue.pattern}`;\n                return `Invalid ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Invalid number: must be a multiple of ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Unrecognized key${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Invalid key in ${issue.origin}`;\n            case \"invalid_union\":\n                if (issue.options && Array.isArray(issue.options) && issue.options.length > 0) {\n                    const opts = issue.options.map((o) => `'${o}'`).join(\" | \");\n                    return `Invalid discriminator value. Expected ${opts}`;\n                }\n                return \"Invalid input\";\n            case \"invalid_element\":\n                return `Invalid value in ${issue.origin}`;\n            default:\n                return `Invalid input`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"karaktrojn\", verb: \"havi\" },\n        file: { unit: \"bajtojn\", verb: \"havi\" },\n        array: { unit: \"elementojn\", verb: \"havi\" },\n        set: { unit: \"elementojn\", verb: \"havi\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"enigo\",\n        email: \"retadreso\",\n        url: \"URL\",\n        emoji: \"emo\u011Dio\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO-datotempo\",\n        date: \"ISO-dato\",\n        time: \"ISO-tempo\",\n        duration: \"ISO-da\u016Dro\",\n        ipv4: \"IPv4-adreso\",\n        ipv6: \"IPv6-adreso\",\n        cidrv4: \"IPv4-rango\",\n        cidrv6: \"IPv6-rango\",\n        base64: \"64-ume kodita karaktraro\",\n        base64url: \"URL-64-ume kodita karaktraro\",\n        json_string: \"JSON-karaktraro\",\n        e164: \"E.164-nombro\",\n        jwt: \"JWT\",\n        template_literal: \"enigo\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"nombro\",\n        array: \"tabelo\",\n        null: \"senvalora\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Nevalida enigo: atendi\u011Dis instanceof ${issue.expected}, ricevi\u011Dis ${received}`;\n                }\n                return `Nevalida enigo: atendi\u011Dis ${expected}, ricevi\u011Dis ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Nevalida enigo: atendi\u011Dis ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Nevalida opcio: atendi\u011Dis unu el ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Tro granda: atendi\u011Dis ke ${issue.origin ?? \"valoro\"} havu ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementojn\"}`;\n                return `Tro granda: atendi\u011Dis ke ${issue.origin ?? \"valoro\"} havu ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Tro malgranda: atendi\u011Dis ke ${issue.origin} havu ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Tro malgranda: atendi\u011Dis ke ${issue.origin} estu ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Nevalida karaktraro: devas komenci\u011Di per \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Nevalida karaktraro: devas fini\u011Di per \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Nevalida karaktraro: devas inkluzivi \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Nevalida karaktraro: devas kongrui kun la modelo ${_issue.pattern}`;\n                return `Nevalida ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Nevalida nombro: devas esti oblo de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Nekonata${issue.keys.length > 1 ? \"j\" : \"\"} \u015Dlosilo${issue.keys.length > 1 ? \"j\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Nevalida \u015Dlosilo en ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Nevalida enigo\";\n            case \"invalid_element\":\n                return `Nevalida valoro en ${issue.origin}`;\n            default:\n                return `Nevalida enigo`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"caracteres\", verb: \"tener\" },\n        file: { unit: \"bytes\", verb: \"tener\" },\n        array: { unit: \"elementos\", verb: \"tener\" },\n        set: { unit: \"elementos\", verb: \"tener\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"entrada\",\n        email: \"direcci\u00F3n de correo electr\u00F3nico\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"fecha y hora ISO\",\n        date: \"fecha ISO\",\n        time: \"hora ISO\",\n        duration: \"duraci\u00F3n ISO\",\n        ipv4: \"direcci\u00F3n IPv4\",\n        ipv6: \"direcci\u00F3n IPv6\",\n        cidrv4: \"rango IPv4\",\n        cidrv6: \"rango IPv6\",\n        base64: \"cadena codificada en base64\",\n        base64url: \"URL codificada en base64\",\n        json_string: \"cadena JSON\",\n        e164: \"n\u00FAmero E.164\",\n        jwt: \"JWT\",\n        template_literal: \"entrada\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        string: \"texto\",\n        number: \"n\u00FAmero\",\n        boolean: \"booleano\",\n        array: \"arreglo\",\n        object: \"objeto\",\n        set: \"conjunto\",\n        file: \"archivo\",\n        date: \"fecha\",\n        bigint: \"n\u00FAmero grande\",\n        symbol: \"s\u00EDmbolo\",\n        undefined: \"indefinido\",\n        null: \"nulo\",\n        function: \"funci\u00F3n\",\n        map: \"mapa\",\n        record: \"registro\",\n        tuple: \"tupla\",\n        enum: \"enumeraci\u00F3n\",\n        union: \"uni\u00F3n\",\n        literal: \"literal\",\n        promise: \"promesa\",\n        void: \"vac\u00EDo\",\n        never: \"nunca\",\n        unknown: \"desconocido\",\n        any: \"cualquiera\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Entrada inv\u00E1lida: se esperaba instanceof ${issue.expected}, recibido ${received}`;\n                }\n                return `Entrada inv\u00E1lida: se esperaba ${expected}, recibido ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Entrada inv\u00E1lida: se esperaba ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Opci\u00F3n inv\u00E1lida: se esperaba una de ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                if (sizing)\n                    return `Demasiado grande: se esperaba que ${origin ?? \"valor\"} tuviera ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementos\"}`;\n                return `Demasiado grande: se esperaba que ${origin ?? \"valor\"} fuera ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                if (sizing) {\n                    return `Demasiado peque\u00F1o: se esperaba que ${origin} tuviera ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Demasiado peque\u00F1o: se esperaba que ${origin} fuera ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Cadena inv\u00E1lida: debe comenzar con \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Cadena inv\u00E1lida: debe terminar en \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Cadena inv\u00E1lida: debe incluir \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Cadena inv\u00E1lida: debe coincidir con el patr\u00F3n ${_issue.pattern}`;\n                return `Inv\u00E1lido ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `N\u00FAmero inv\u00E1lido: debe ser m\u00FAltiplo de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Llave${issue.keys.length > 1 ? \"s\" : \"\"} desconocida${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Llave inv\u00E1lida en ${TypeDictionary[issue.origin] ?? issue.origin}`;\n            case \"invalid_union\":\n                return \"Entrada inv\u00E1lida\";\n            case \"invalid_element\":\n                return `Valor inv\u00E1lido en ${TypeDictionary[issue.origin] ?? issue.origin}`;\n            default:\n                return `Entrada inv\u00E1lida`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n        file: { unit: \"\u0628\u0627\u06CC\u062A\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n        array: { unit: \"\u0622\u06CC\u062A\u0645\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n        set: { unit: \"\u0622\u06CC\u062A\u0645\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0648\u0631\u0648\u062F\u06CC\",\n        email: \"\u0622\u062F\u0631\u0633 \u0627\u06CC\u0645\u06CC\u0644\",\n        url: \"URL\",\n        emoji: \"\u0627\u06CC\u0645\u0648\u062C\u06CC\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648\",\n        date: \"\u062A\u0627\u0631\u06CC\u062E \u0627\u06CC\u0632\u0648\",\n        time: \"\u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648\",\n        duration: \"\u0645\u062F\u062A \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648\",\n        ipv4: \"IPv4 \u0622\u062F\u0631\u0633\",\n        ipv6: \"IPv6 \u0622\u062F\u0631\u0633\",\n        cidrv4: \"IPv4 \u062F\u0627\u0645\u0646\u0647\",\n        cidrv6: \"IPv6 \u062F\u0627\u0645\u0646\u0647\",\n        base64: \"base64-encoded \u0631\u0634\u062A\u0647\",\n        base64url: \"base64url-encoded \u0631\u0634\u062A\u0647\",\n        json_string: \"JSON \u0631\u0634\u062A\u0647\",\n        e164: \"E.164 \u0639\u062F\u062F\",\n        jwt: \"JWT\",\n        template_literal: \"\u0648\u0631\u0648\u062F\u06CC\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0639\u062F\u062F\",\n        array: \"\u0622\u0631\u0627\u06CC\u0647\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A instanceof ${issue.expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${received} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`;\n                }\n                return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${received} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1) {\n                    return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${util.stringifyPrimitive(issue.values[0])} \u0645\u06CC\u200C\u0628\u0648\u062F`;\n                }\n                return `\u06AF\u0632\u06CC\u0646\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A \u06CC\u06A9\u06CC \u0627\u0632 ${util.joinValues(issue.values, \"|\")} \u0645\u06CC\u200C\u0628\u0648\u062F`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue.origin ?? \"\u0645\u0642\u062F\u0627\u0631\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0635\u0631\"} \u0628\u0627\u0634\u062F`;\n                }\n                return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue.origin ?? \"\u0645\u0642\u062F\u0627\u0631\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} \u0628\u0627\u0634\u062F`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} ${sizing.unit} \u0628\u0627\u0634\u062F`;\n                }\n                return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} \u0628\u0627\u0634\u062F`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \"${_issue.prefix}\" \u0634\u0631\u0648\u0639 \u0634\u0648\u062F`;\n                }\n                if (_issue.format === \"ends_with\") {\n                    return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \"${_issue.suffix}\" \u062A\u0645\u0627\u0645 \u0634\u0648\u062F`;\n                }\n                if (_issue.format === \"includes\") {\n                    return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0634\u0627\u0645\u0644 \"${_issue.includes}\" \u0628\u0627\u0634\u062F`;\n                }\n                if (_issue.format === \"regex\") {\n                    return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \u0627\u0644\u06AF\u0648\u06CC ${_issue.pattern} \u0645\u0637\u0627\u0628\u0642\u062A \u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F`;\n                }\n                return `${FormatDictionary[_issue.format] ?? issue.format} \u0646\u0627\u0645\u0639\u062A\u0628\u0631`;\n            }\n            case \"not_multiple_of\":\n                return `\u0639\u062F\u062F \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0645\u0636\u0631\u0628 ${issue.divisor} \u0628\u0627\u0634\u062F`;\n            case \"unrecognized_keys\":\n                return `\u06A9\u0644\u06CC\u062F${issue.keys.length > 1 ? \"\u0647\u0627\u06CC\" : \"\"} \u0646\u0627\u0634\u0646\u0627\u0633: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u06A9\u0644\u06CC\u062F \u0646\u0627\u0634\u0646\u0627\u0633 \u062F\u0631 ${issue.origin}`;\n            case \"invalid_union\":\n                return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`;\n            case \"invalid_element\":\n                return `\u0645\u0642\u062F\u0627\u0631 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u062F\u0631 ${issue.origin}`;\n            default:\n                return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"merkki\u00E4\", subject: \"merkkijonon\" },\n        file: { unit: \"tavua\", subject: \"tiedoston\" },\n        array: { unit: \"alkiota\", subject: \"listan\" },\n        set: { unit: \"alkiota\", subject: \"joukon\" },\n        number: { unit: \"\", subject: \"luvun\" },\n        bigint: { unit: \"\", subject: \"suuren kokonaisluvun\" },\n        int: { unit: \"\", subject: \"kokonaisluvun\" },\n        date: { unit: \"\", subject: \"p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4n\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"s\u00E4\u00E4nn\u00F6llinen lauseke\",\n        email: \"s\u00E4hk\u00F6postiosoite\",\n        url: \"URL-osoite\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO-aikaleima\",\n        date: \"ISO-p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4\",\n        time: \"ISO-aika\",\n        duration: \"ISO-kesto\",\n        ipv4: \"IPv4-osoite\",\n        ipv6: \"IPv6-osoite\",\n        cidrv4: \"IPv4-alue\",\n        cidrv6: \"IPv6-alue\",\n        base64: \"base64-koodattu merkkijono\",\n        base64url: \"base64url-koodattu merkkijono\",\n        json_string: \"JSON-merkkijono\",\n        e164: \"E.164-luku\",\n        jwt: \"JWT\",\n        template_literal: \"templaattimerkkijono\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Virheellinen tyyppi: odotettiin instanceof ${issue.expected}, oli ${received}`;\n                }\n                return `Virheellinen tyyppi: odotettiin ${expected}, oli ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Virheellinen sy\u00F6te: t\u00E4ytyy olla ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Virheellinen valinta: t\u00E4ytyy olla yksi seuraavista: ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Liian suuri: ${sizing.subject} t\u00E4ytyy olla ${adj}${issue.maximum.toString()} ${sizing.unit}`.trim();\n                }\n                return `Liian suuri: arvon t\u00E4ytyy olla ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Liian pieni: ${sizing.subject} t\u00E4ytyy olla ${adj}${issue.minimum.toString()} ${sizing.unit}`.trim();\n                }\n                return `Liian pieni: arvon t\u00E4ytyy olla ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Virheellinen sy\u00F6te: t\u00E4ytyy alkaa \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Virheellinen sy\u00F6te: t\u00E4ytyy loppua \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Virheellinen sy\u00F6te: t\u00E4ytyy sis\u00E4lt\u00E4\u00E4 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\") {\n                    return `Virheellinen sy\u00F6te: t\u00E4ytyy vastata s\u00E4\u00E4nn\u00F6llist\u00E4 lauseketta ${_issue.pattern}`;\n                }\n                return `Virheellinen ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Virheellinen luku: t\u00E4ytyy olla luvun ${issue.divisor} monikerta`;\n            case \"unrecognized_keys\":\n                return `${issue.keys.length > 1 ? \"Tuntemattomat avaimet\" : \"Tuntematon avain\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return \"Virheellinen avain tietueessa\";\n            case \"invalid_union\":\n                return \"Virheellinen unioni\";\n            case \"invalid_element\":\n                return \"Virheellinen arvo joukossa\";\n            default:\n                return `Virheellinen sy\u00F6te`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"caract\u00E8res\", verb: \"avoir\" },\n        file: { unit: \"octets\", verb: \"avoir\" },\n        array: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n        set: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"entr\u00E9e\",\n        email: \"adresse e-mail\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"date et heure ISO\",\n        date: \"date ISO\",\n        time: \"heure ISO\",\n        duration: \"dur\u00E9e ISO\",\n        ipv4: \"adresse IPv4\",\n        ipv6: \"adresse IPv6\",\n        cidrv4: \"plage IPv4\",\n        cidrv6: \"plage IPv6\",\n        base64: \"cha\u00EEne encod\u00E9e en base64\",\n        base64url: \"cha\u00EEne encod\u00E9e en base64url\",\n        json_string: \"cha\u00EEne JSON\",\n        e164: \"num\u00E9ro E.164\",\n        jwt: \"JWT\",\n        template_literal: \"entr\u00E9e\",\n    };\n    const TypeDictionary = {\n        string: \"cha\u00EEne\",\n        number: \"nombre\",\n        int: \"entier\",\n        boolean: \"bool\u00E9en\",\n        bigint: \"grand entier\",\n        symbol: \"symbole\",\n        undefined: \"ind\u00E9fini\",\n        null: \"null\",\n        never: \"jamais\",\n        void: \"vide\",\n        date: \"date\",\n        array: \"tableau\",\n        object: \"objet\",\n        tuple: \"tuple\",\n        record: \"enregistrement\",\n        map: \"carte\",\n        set: \"ensemble\",\n        file: \"fichier\",\n        nonoptional: \"non-optionnel\",\n        nan: \"NaN\",\n        function: \"fonction\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Entr\u00E9e invalide : instanceof ${issue.expected} attendu, ${received} re\u00E7u`;\n                }\n                return `Entr\u00E9e invalide : ${expected} attendu, ${received} re\u00E7u`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Entr\u00E9e invalide : ${util.stringifyPrimitive(issue.values[0])} attendu`;\n                return `Option invalide : une valeur parmi ${util.joinValues(issue.values, \"|\")} attendue`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Trop grand : ${TypeDictionary[issue.origin] ?? \"valeur\"} doit ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u00E9l\u00E9ment(s)\"}`;\n                return `Trop grand : ${TypeDictionary[issue.origin] ?? \"valeur\"} doit \u00EAtre ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Trop petit : ${TypeDictionary[issue.origin] ?? \"valeur\"} doit ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                return `Trop petit : ${TypeDictionary[issue.origin] ?? \"valeur\"} doit \u00EAtre ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Cha\u00EEne invalide : doit commencer par \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Cha\u00EEne invalide : doit se terminer par \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Cha\u00EEne invalide : doit inclure \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Cha\u00EEne invalide : doit correspondre au mod\u00E8le ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} invalide`;\n            }\n            case \"not_multiple_of\":\n                return `Nombre invalide : doit \u00EAtre un multiple de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Cl\u00E9${issue.keys.length > 1 ? \"s\" : \"\"} non reconnue${issue.keys.length > 1 ? \"s\" : \"\"} : ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Cl\u00E9 invalide dans ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Entr\u00E9e invalide\";\n            case \"invalid_element\":\n                return `Valeur invalide dans ${issue.origin}`;\n            default:\n                return `Entr\u00E9e invalide`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"caract\u00E8res\", verb: \"avoir\" },\n        file: { unit: \"octets\", verb: \"avoir\" },\n        array: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n        set: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"entr\u00E9e\",\n        email: \"adresse courriel\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"date-heure ISO\",\n        date: \"date ISO\",\n        time: \"heure ISO\",\n        duration: \"dur\u00E9e ISO\",\n        ipv4: \"adresse IPv4\",\n        ipv6: \"adresse IPv6\",\n        cidrv4: \"plage IPv4\",\n        cidrv6: \"plage IPv6\",\n        base64: \"cha\u00EEne encod\u00E9e en base64\",\n        base64url: \"cha\u00EEne encod\u00E9e en base64url\",\n        json_string: \"cha\u00EEne JSON\",\n        e164: \"num\u00E9ro E.164\",\n        jwt: \"JWT\",\n        template_literal: \"entr\u00E9e\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Entr\u00E9e invalide : attendu instanceof ${issue.expected}, re\u00E7u ${received}`;\n                }\n                return `Entr\u00E9e invalide : attendu ${expected}, re\u00E7u ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Entr\u00E9e invalide : attendu ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Option invalide : attendu l'une des valeurs suivantes ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"\u2264\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Trop grand : attendu que ${issue.origin ?? \"la valeur\"} ait ${adj}${issue.maximum.toString()} ${sizing.unit}`;\n                return `Trop grand : attendu que ${issue.origin ?? \"la valeur\"} soit ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \"\u2265\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Trop petit : attendu que ${issue.origin} ait ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Trop petit : attendu que ${issue.origin} soit ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Cha\u00EEne invalide : doit commencer par \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Cha\u00EEne invalide : doit se terminer par \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Cha\u00EEne invalide : doit inclure \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Cha\u00EEne invalide : doit correspondre au motif ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} invalide`;\n            }\n            case \"not_multiple_of\":\n                return `Nombre invalide : doit \u00EAtre un multiple de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Cl\u00E9${issue.keys.length > 1 ? \"s\" : \"\"} non reconnue${issue.keys.length > 1 ? \"s\" : \"\"} : ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Cl\u00E9 invalide dans ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Entr\u00E9e invalide\";\n            case \"invalid_element\":\n                return `Valeur invalide dans ${issue.origin}`;\n            default:\n                return `Entr\u00E9e invalide`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    // Hebrew labels + grammatical gender\n    const TypeNames = {\n        string: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA\", gender: \"f\" },\n        number: { label: \"\u05DE\u05E1\u05E4\u05E8\", gender: \"m\" },\n        boolean: { label: \"\u05E2\u05E8\u05DA \u05D1\u05D5\u05DC\u05D9\u05D0\u05E0\u05D9\", gender: \"m\" },\n        bigint: { label: \"BigInt\", gender: \"m\" },\n        date: { label: \"\u05EA\u05D0\u05E8\u05D9\u05DA\", gender: \"m\" },\n        array: { label: \"\u05DE\u05E2\u05E8\u05DA\", gender: \"m\" },\n        object: { label: \"\u05D0\u05D5\u05D1\u05D9\u05D9\u05E7\u05D8\", gender: \"m\" },\n        null: { label: \"\u05E2\u05E8\u05DA \u05E8\u05D9\u05E7 (null)\", gender: \"m\" },\n        undefined: { label: \"\u05E2\u05E8\u05DA \u05DC\u05D0 \u05DE\u05D5\u05D2\u05D3\u05E8 (undefined)\", gender: \"m\" },\n        symbol: { label: \"\u05E1\u05D9\u05DE\u05D1\u05D5\u05DC (Symbol)\", gender: \"m\" },\n        function: { label: \"\u05E4\u05D5\u05E0\u05E7\u05E6\u05D9\u05D4\", gender: \"f\" },\n        map: { label: \"\u05DE\u05E4\u05D4 (Map)\", gender: \"f\" },\n        set: { label: \"\u05E7\u05D1\u05D5\u05E6\u05D4 (Set)\", gender: \"f\" },\n        file: { label: \"\u05E7\u05D5\u05D1\u05E5\", gender: \"m\" },\n        promise: { label: \"Promise\", gender: \"m\" },\n        NaN: { label: \"NaN\", gender: \"m\" },\n        unknown: { label: \"\u05E2\u05E8\u05DA \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2\", gender: \"m\" },\n        value: { label: \"\u05E2\u05E8\u05DA\", gender: \"m\" },\n    };\n    // Sizing units for size-related messages + localized origin labels\n    const Sizable = {\n        string: { unit: \"\u05EA\u05D5\u05D5\u05D9\u05DD\", shortLabel: \"\u05E7\u05E6\u05E8\", longLabel: \"\u05D0\u05E8\u05D5\u05DA\" },\n        file: { unit: \"\u05D1\u05D9\u05D9\u05D8\u05D9\u05DD\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" },\n        array: { unit: \"\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" },\n        set: { unit: \"\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" },\n        number: { unit: \"\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" }, // no unit\n    };\n    // Helpers \u2014 labels, articles, and verbs\n    const typeEntry = (t) => (t ? TypeNames[t] : undefined);\n    const typeLabel = (t) => {\n        const e = typeEntry(t);\n        if (e)\n            return e.label;\n        // fallback: show raw string if unknown\n        return t ?? TypeNames.unknown.label;\n    };\n    const withDefinite = (t) => `\u05D4${typeLabel(t)}`;\n    const verbFor = (t) => {\n        const e = typeEntry(t);\n        const gender = e?.gender ?? \"m\";\n        return gender === \"f\" ? \"\u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05D9\u05D5\u05EA\" : \"\u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA\";\n    };\n    const getSizing = (origin) => {\n        if (!origin)\n            return null;\n        return Sizable[origin] ?? null;\n    };\n    const FormatDictionary = {\n        regex: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n        email: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC\", gender: \"f\" },\n        url: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA \u05E8\u05E9\u05EA\", gender: \"f\" },\n        emoji: { label: \"\u05D0\u05D9\u05DE\u05D5\u05D2'\u05D9\", gender: \"m\" },\n        uuid: { label: \"UUID\", gender: \"m\" },\n        nanoid: { label: \"nanoid\", gender: \"m\" },\n        guid: { label: \"GUID\", gender: \"m\" },\n        cuid: { label: \"cuid\", gender: \"m\" },\n        cuid2: { label: \"cuid2\", gender: \"m\" },\n        ulid: { label: \"ULID\", gender: \"m\" },\n        xid: { label: \"XID\", gender: \"m\" },\n        ksuid: { label: \"KSUID\", gender: \"m\" },\n        datetime: { label: \"\u05EA\u05D0\u05E8\u05D9\u05DA \u05D5\u05D6\u05DE\u05DF ISO\", gender: \"m\" },\n        date: { label: \"\u05EA\u05D0\u05E8\u05D9\u05DA ISO\", gender: \"m\" },\n        time: { label: \"\u05D6\u05DE\u05DF ISO\", gender: \"m\" },\n        duration: { label: \"\u05DE\u05E9\u05DA \u05D6\u05DE\u05DF ISO\", gender: \"m\" },\n        ipv4: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA IPv4\", gender: \"f\" },\n        ipv6: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA IPv6\", gender: \"f\" },\n        cidrv4: { label: \"\u05D8\u05D5\u05D5\u05D7 IPv4\", gender: \"m\" },\n        cidrv6: { label: \"\u05D8\u05D5\u05D5\u05D7 IPv6\", gender: \"m\" },\n        base64: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64\", gender: \"f\" },\n        base64url: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64 \u05DC\u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05E8\u05E9\u05EA\", gender: \"f\" },\n        json_string: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA JSON\", gender: \"f\" },\n        e164: { label: \"\u05DE\u05E1\u05E4\u05E8 E.164\", gender: \"m\" },\n        jwt: { label: \"JWT\", gender: \"m\" },\n        ends_with: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n        includes: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n        lowercase: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n        starts_with: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n        uppercase: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                // Expected type: show without definite article for clearer Hebrew\n                const expectedKey = issue.expected;\n                const expected = TypeDictionary[expectedKey ?? \"\"] ?? typeLabel(expectedKey);\n                // Received: show localized label if known, otherwise constructor/raw\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? TypeNames[receivedType]?.label ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA instanceof ${issue.expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${received}`;\n                }\n                return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${received}`;\n            }\n            case \"invalid_value\": {\n                if (issue.values.length === 1) {\n                    return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05E2\u05E8\u05DA \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA ${util.stringifyPrimitive(issue.values[0])}`;\n                }\n                // Join values with proper Hebrew formatting\n                const stringified = issue.values.map((v) => util.stringifyPrimitive(v));\n                if (issue.values.length === 2) {\n                    return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${stringified[0]} \u05D0\u05D5 ${stringified[1]}`;\n                }\n                // For 3+ values: \"a\", \"b\" \u05D0\u05D5 \"c\"\n                const lastValue = stringified[stringified.length - 1];\n                const restValues = stringified.slice(0, -1).join(\", \");\n                return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${restValues} \u05D0\u05D5 ${lastValue}`;\n            }\n            case \"too_big\": {\n                const sizing = getSizing(issue.origin);\n                const subject = withDefinite(issue.origin ?? \"value\");\n                if (issue.origin === \"string\") {\n                    // Special handling for strings - more natural Hebrew\n                    return `${sizing?.longLabel ?? \"\u05D0\u05E8\u05D5\u05DA\"} \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05DB\u05D9\u05DC ${issue.maximum.toString()} ${sizing?.unit ?? \"\"} ${issue.inclusive ? \"\u05D0\u05D5 \u05E4\u05D7\u05D5\u05EA\" : \"\u05DC\u05DB\u05DC \u05D4\u05D9\u05D5\u05EA\u05E8\"}`.trim();\n                }\n                if (issue.origin === \"number\") {\n                    // Natural Hebrew for numbers\n                    const comparison = issue.inclusive ? `\u05E7\u05D8\u05DF \u05D0\u05D5 \u05E9\u05D5\u05D5\u05D4 \u05DC-${issue.maximum}` : `\u05E7\u05D8\u05DF \u05DE-${issue.maximum}`;\n                    return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${comparison}`;\n                }\n                if (issue.origin === \"array\" || issue.origin === \"set\") {\n                    // Natural Hebrew for arrays and sets\n                    const verb = issue.origin === \"set\" ? \"\u05E6\u05E8\u05D9\u05DB\u05D4\" : \"\u05E6\u05E8\u05D9\u05DA\";\n                    const comparison = issue.inclusive\n                        ? `${issue.maximum} ${sizing?.unit ?? \"\"} \u05D0\u05D5 \u05E4\u05D7\u05D5\u05EA`\n                        : `\u05E4\u05D7\u05D5\u05EA \u05DE-${issue.maximum} ${sizing?.unit ?? \"\"}`;\n                    return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${comparison}`.trim();\n                }\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const be = verbFor(issue.origin ?? \"value\");\n                if (sizing?.unit) {\n                    return `${sizing.longLabel} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.maximum.toString()} ${sizing.unit}`;\n                }\n                return `${sizing?.longLabel ?? \"\u05D2\u05D3\u05D5\u05DC\"} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const sizing = getSizing(issue.origin);\n                const subject = withDefinite(issue.origin ?? \"value\");\n                if (issue.origin === \"string\") {\n                    // Special handling for strings - more natural Hebrew\n                    return `${sizing?.shortLabel ?? \"\u05E7\u05E6\u05E8\"} \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05DB\u05D9\u05DC ${issue.minimum.toString()} ${sizing?.unit ?? \"\"} ${issue.inclusive ? \"\u05D0\u05D5 \u05D9\u05D5\u05EA\u05E8\" : \"\u05DC\u05E4\u05D7\u05D5\u05EA\"}`.trim();\n                }\n                if (issue.origin === \"number\") {\n                    // Natural Hebrew for numbers\n                    const comparison = issue.inclusive ? `\u05D2\u05D3\u05D5\u05DC \u05D0\u05D5 \u05E9\u05D5\u05D5\u05D4 \u05DC-${issue.minimum}` : `\u05D2\u05D3\u05D5\u05DC \u05DE-${issue.minimum}`;\n                    return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${comparison}`;\n                }\n                if (issue.origin === \"array\" || issue.origin === \"set\") {\n                    // Natural Hebrew for arrays and sets\n                    const verb = issue.origin === \"set\" ? \"\u05E6\u05E8\u05D9\u05DB\u05D4\" : \"\u05E6\u05E8\u05D9\u05DA\";\n                    // Special case for singular (minimum === 1)\n                    if (issue.minimum === 1 && issue.inclusive) {\n                        const singularPhrase = issue.origin === \"set\" ? \"\u05DC\u05E4\u05D7\u05D5\u05EA \u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3\" : \"\u05DC\u05E4\u05D7\u05D5\u05EA \u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3\";\n                        return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${singularPhrase}`;\n                    }\n                    const comparison = issue.inclusive\n                        ? `${issue.minimum} ${sizing?.unit ?? \"\"} \u05D0\u05D5 \u05D9\u05D5\u05EA\u05E8`\n                        : `\u05D9\u05D5\u05EA\u05E8 \u05DE-${issue.minimum} ${sizing?.unit ?? \"\"}`;\n                    return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${comparison}`.trim();\n                }\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const be = verbFor(issue.origin ?? \"value\");\n                if (sizing?.unit) {\n                    return `${sizing.shortLabel} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `${sizing?.shortLabel ?? \"\u05E7\u05D8\u05DF\"} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                // These apply to strings \u2014 use feminine grammar + \u05D4\u05F3 \u05D4\u05D9\u05D3\u05D9\u05E2\u05D4\n                if (_issue.format === \"starts_with\")\n                    return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D1 \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05E1\u05EA\u05D9\u05D9\u05DD \u05D1 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05DB\u05DC\u05D5\u05DC \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D0\u05D9\u05DD \u05DC\u05EA\u05D1\u05E0\u05D9\u05EA ${_issue.pattern}`;\n                // Handle gender agreement for formats\n                const nounEntry = FormatDictionary[_issue.format];\n                const noun = nounEntry?.label ?? _issue.format;\n                const gender = nounEntry?.gender ?? \"m\";\n                const adjective = gender === \"f\" ? \"\u05EA\u05E7\u05D9\u05E0\u05D4\" : \"\u05EA\u05E7\u05D9\u05DF\";\n                return `${noun} \u05DC\u05D0 ${adjective}`;\n            }\n            case \"not_multiple_of\":\n                return `\u05DE\u05E1\u05E4\u05E8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05DB\u05E4\u05DC\u05D4 \u05E9\u05DC ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u05DE\u05E4\u05EA\u05D7${issue.keys.length > 1 ? \"\u05D5\u05EA\" : \"\"} \u05DC\u05D0 \u05DE\u05D6\u05D5\u05D4${issue.keys.length > 1 ? \"\u05D9\u05DD\" : \"\u05D4\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\": {\n                return `\u05E9\u05D3\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1\u05D0\u05D5\u05D1\u05D9\u05D9\u05E7\u05D8`;\n            }\n            case \"invalid_union\":\n                return \"\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF\";\n            case \"invalid_element\": {\n                const place = withDefinite(issue.origin ?? \"array\");\n                return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${place}`;\n            }\n            default:\n                return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"znakova\", verb: \"imati\" },\n        file: { unit: \"bajtova\", verb: \"imati\" },\n        array: { unit: \"stavki\", verb: \"imati\" },\n        set: { unit: \"stavki\", verb: \"imati\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"unos\",\n        email: \"email adresa\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO datum i vrijeme\",\n        date: \"ISO datum\",\n        time: \"ISO vrijeme\",\n        duration: \"ISO trajanje\",\n        ipv4: \"IPv4 adresa\",\n        ipv6: \"IPv6 adresa\",\n        cidrv4: \"IPv4 raspon\",\n        cidrv6: \"IPv6 raspon\",\n        base64: \"base64 kodirani tekst\",\n        base64url: \"base64url kodirani tekst\",\n        json_string: \"JSON tekst\",\n        e164: \"E.164 broj\",\n        jwt: \"JWT\",\n        template_literal: \"unos\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        string: \"tekst\",\n        number: \"broj\",\n        boolean: \"boolean\",\n        array: \"niz\",\n        object: \"objekt\",\n        set: \"skup\",\n        file: \"datoteka\",\n        date: \"datum\",\n        bigint: \"bigint\",\n        symbol: \"simbol\",\n        undefined: \"undefined\",\n        null: \"null\",\n        function: \"funkcija\",\n        map: \"mapa\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Neispravan unos: o\u010Dekuje se instanceof ${issue.expected}, a primljeno je ${received}`;\n                }\n                return `Neispravan unos: o\u010Dekuje se ${expected}, a primljeno je ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Neispravna vrijednost: o\u010Dekivano ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Neispravna opcija: o\u010Dekivano jedno od ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                if (sizing)\n                    return `Preveliko: o\u010Dekivano da ${origin ?? \"vrijednost\"} ima ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elemenata\"}`;\n                return `Preveliko: o\u010Dekivano da ${origin ?? \"vrijednost\"} bude ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                if (sizing) {\n                    return `Premalo: o\u010Dekivano da ${origin} ima ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Premalo: o\u010Dekivano da ${origin} bude ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Neispravan tekst: mora zapo\u010Dinjati s \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Neispravan tekst: mora zavr\u0161avati s \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Neispravan tekst: mora sadr\u017Eavati \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Neispravan tekst: mora odgovarati uzorku ${_issue.pattern}`;\n                return `Neispravna ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Neispravan broj: mora biti vi\u0161ekratnik od ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Neprepoznat${issue.keys.length > 1 ? \"i klju\u010Devi\" : \" klju\u010D\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Neispravan klju\u010D u ${TypeDictionary[issue.origin] ?? issue.origin}`;\n            case \"invalid_union\":\n                return \"Neispravan unos\";\n            case \"invalid_element\":\n                return `Neispravna vrijednost u ${TypeDictionary[issue.origin] ?? issue.origin}`;\n            default:\n                return `Neispravan unos`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"karakter\", verb: \"legyen\" },\n        file: { unit: \"byte\", verb: \"legyen\" },\n        array: { unit: \"elem\", verb: \"legyen\" },\n        set: { unit: \"elem\", verb: \"legyen\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"bemenet\",\n        email: \"email c\u00EDm\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO id\u0151b\u00E9lyeg\",\n        date: \"ISO d\u00E1tum\",\n        time: \"ISO id\u0151\",\n        duration: \"ISO id\u0151intervallum\",\n        ipv4: \"IPv4 c\u00EDm\",\n        ipv6: \"IPv6 c\u00EDm\",\n        cidrv4: \"IPv4 tartom\u00E1ny\",\n        cidrv6: \"IPv6 tartom\u00E1ny\",\n        base64: \"base64-k\u00F3dolt string\",\n        base64url: \"base64url-k\u00F3dolt string\",\n        json_string: \"JSON string\",\n        e164: \"E.164 sz\u00E1m\",\n        jwt: \"JWT\",\n        template_literal: \"bemenet\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"sz\u00E1m\",\n        array: \"t\u00F6mb\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u00C9rv\u00E9nytelen bemenet: a v\u00E1rt \u00E9rt\u00E9k instanceof ${issue.expected}, a kapott \u00E9rt\u00E9k ${received}`;\n                }\n                return `\u00C9rv\u00E9nytelen bemenet: a v\u00E1rt \u00E9rt\u00E9k ${expected}, a kapott \u00E9rt\u00E9k ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u00C9rv\u00E9nytelen bemenet: a v\u00E1rt \u00E9rt\u00E9k ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u00C9rv\u00E9nytelen opci\u00F3: valamelyik \u00E9rt\u00E9k v\u00E1rt ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `T\u00FAl nagy: ${issue.origin ?? \"\u00E9rt\u00E9k\"} m\u00E9rete t\u00FAl nagy ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elem\"}`;\n                return `T\u00FAl nagy: a bemeneti \u00E9rt\u00E9k ${issue.origin ?? \"\u00E9rt\u00E9k\"} t\u00FAl nagy: ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `T\u00FAl kicsi: a bemeneti \u00E9rt\u00E9k ${issue.origin} m\u00E9rete t\u00FAl kicsi ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `T\u00FAl kicsi: a bemeneti \u00E9rt\u00E9k ${issue.origin} t\u00FAl kicsi ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u00C9rv\u00E9nytelen string: \"${_issue.prefix}\" \u00E9rt\u00E9kkel kell kezd\u0151dnie`;\n                if (_issue.format === \"ends_with\")\n                    return `\u00C9rv\u00E9nytelen string: \"${_issue.suffix}\" \u00E9rt\u00E9kkel kell v\u00E9gz\u0151dnie`;\n                if (_issue.format === \"includes\")\n                    return `\u00C9rv\u00E9nytelen string: \"${_issue.includes}\" \u00E9rt\u00E9ket kell tartalmaznia`;\n                if (_issue.format === \"regex\")\n                    return `\u00C9rv\u00E9nytelen string: ${_issue.pattern} mint\u00E1nak kell megfelelnie`;\n                return `\u00C9rv\u00E9nytelen ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u00C9rv\u00E9nytelen sz\u00E1m: ${issue.divisor} t\u00F6bbsz\u00F6r\u00F6s\u00E9nek kell lennie`;\n            case \"unrecognized_keys\":\n                return `Ismeretlen kulcs${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u00C9rv\u00E9nytelen kulcs ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u00C9rv\u00E9nytelen bemenet\";\n            case \"invalid_element\":\n                return `\u00C9rv\u00E9nytelen \u00E9rt\u00E9k: ${issue.origin}`;\n            default:\n                return `\u00C9rv\u00E9nytelen bemenet`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nfunction getArmenianPlural(count, one, many) {\n    return Math.abs(count) === 1 ? one : many;\n}\nfunction withDefiniteArticle(word) {\n    if (!word)\n        return \"\";\n    const vowels = [\"\u0561\", \"\u0565\", \"\u0568\", \"\u056B\", \"\u0578\", \"\u0578\u0582\", \"\u0585\"];\n    const lastChar = word[word.length - 1];\n    return word + (vowels.includes(lastChar) ? \"\u0576\" : \"\u0568\");\n}\nconst error = () => {\n    const Sizable = {\n        string: {\n            unit: {\n                one: \"\u0576\u0577\u0561\u0576\",\n                many: \"\u0576\u0577\u0561\u0576\u0576\u0565\u0580\",\n            },\n            verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n        },\n        file: {\n            unit: {\n                one: \"\u0562\u0561\u0575\u0569\",\n                many: \"\u0562\u0561\u0575\u0569\u0565\u0580\",\n            },\n            verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n        },\n        array: {\n            unit: {\n                one: \"\u057F\u0561\u0580\u0580\",\n                many: \"\u057F\u0561\u0580\u0580\u0565\u0580\",\n            },\n            verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n        },\n        set: {\n            unit: {\n                one: \"\u057F\u0561\u0580\u0580\",\n                many: \"\u057F\u0561\u0580\u0580\u0565\u0580\",\n            },\n            verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n        },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0574\u0578\u0582\u057F\u0584\",\n        email: \"\u0567\u056C. \u0570\u0561\u057D\u0581\u0565\",\n        url: \"URL\",\n        emoji: \"\u0567\u0574\u0578\u057B\u056B\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u0561\u0574\u057D\u0561\u0569\u056B\u057E \u0587 \u056A\u0561\u0574\",\n        date: \"ISO \u0561\u0574\u057D\u0561\u0569\u056B\u057E\",\n        time: \"ISO \u056A\u0561\u0574\",\n        duration: \"ISO \u057F\u0587\u0578\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576\",\n        ipv4: \"IPv4 \u0570\u0561\u057D\u0581\u0565\",\n        ipv6: \"IPv6 \u0570\u0561\u057D\u0581\u0565\",\n        cidrv4: \"IPv4 \u0574\u056B\u057B\u0561\u056F\u0561\u0575\u0584\",\n        cidrv6: \"IPv6 \u0574\u056B\u057B\u0561\u056F\u0561\u0575\u0584\",\n        base64: \"base64 \u0571\u0587\u0561\u0579\u0561\u0583\u0578\u057E \u057F\u0578\u0572\",\n        base64url: \"base64url \u0571\u0587\u0561\u0579\u0561\u0583\u0578\u057E \u057F\u0578\u0572\",\n        json_string: \"JSON \u057F\u0578\u0572\",\n        e164: \"E.164 \u0570\u0561\u0574\u0561\u0580\",\n        jwt: \"JWT\",\n        template_literal: \"\u0574\u0578\u0582\u057F\u0584\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0569\u056B\u057E\",\n        array: \"\u0566\u0561\u0576\u0563\u057E\u0561\u056E\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 instanceof ${issue.expected}, \u057D\u057F\u0561\u0581\u057E\u0565\u056C \u0567 ${received}`;\n                }\n                return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 ${expected}, \u057D\u057F\u0561\u0581\u057E\u0565\u056C \u0567 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 ${util.stringifyPrimitive(issue.values[1])}`;\n                return `\u054D\u056D\u0561\u056C \u057F\u0561\u0580\u0562\u0565\u0580\u0561\u056F\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 \u0570\u0565\u057F\u0587\u0575\u0561\u056C\u0576\u0565\u0580\u056B\u0581 \u0574\u0565\u056F\u0568\u055D ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    const maxValue = Number(issue.maximum);\n                    const unit = getArmenianPlural(maxValue, sizing.unit.one, sizing.unit.many);\n                    return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0574\u0565\u056E \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin ?? \"\u0561\u0580\u056A\u0565\u0584\")} \u056F\u0578\u0582\u0576\u0565\u0576\u0561 ${adj}${issue.maximum.toString()} ${unit}`;\n                }\n                return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0574\u0565\u056E \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin ?? \"\u0561\u0580\u056A\u0565\u0584\")} \u056C\u056B\u0576\u056B ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    const minValue = Number(issue.minimum);\n                    const unit = getArmenianPlural(minValue, sizing.unit.one, sizing.unit.many);\n                    return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0583\u0578\u0584\u0580 \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin)} \u056F\u0578\u0582\u0576\u0565\u0576\u0561 ${adj}${issue.minimum.toString()} ${unit}`;\n                }\n                return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0583\u0578\u0584\u0580 \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin)} \u056C\u056B\u0576\u056B ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u057D\u056F\u057D\u057E\u056B \"${_issue.prefix}\"-\u0578\u057E`;\n                if (_issue.format === \"ends_with\")\n                    return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0561\u057E\u0561\u0580\u057F\u057E\u056B \"${_issue.suffix}\"-\u0578\u057E`;\n                if (_issue.format === \"includes\")\n                    return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u057A\u0561\u0580\u0578\u0582\u0576\u0561\u056F\u056B \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0570\u0561\u0574\u0561\u057A\u0561\u057F\u0561\u057D\u056D\u0561\u0576\u056B ${_issue.pattern} \u0571\u0587\u0561\u0579\u0561\u0583\u056B\u0576`;\n                return `\u054D\u056D\u0561\u056C ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u054D\u056D\u0561\u056C \u0569\u056B\u057E\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0562\u0561\u0566\u0574\u0561\u057A\u0561\u057F\u056B\u056F \u056C\u056B\u0576\u056B ${issue.divisor}-\u056B`;\n            case \"unrecognized_keys\":\n                return `\u0549\u0573\u0561\u0576\u0561\u0579\u057E\u0561\u056E \u0562\u0561\u0576\u0561\u056C\u056B${issue.keys.length > 1 ? \"\u0576\u0565\u0580\" : \"\"}. ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u054D\u056D\u0561\u056C \u0562\u0561\u0576\u0561\u056C\u056B ${withDefiniteArticle(issue.origin)}-\u0578\u0582\u0574`;\n            case \"invalid_union\":\n                return \"\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\";\n            case \"invalid_element\":\n                return `\u054D\u056D\u0561\u056C \u0561\u0580\u056A\u0565\u0584 ${withDefiniteArticle(issue.origin)}-\u0578\u0582\u0574`;\n            default:\n                return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"karakter\", verb: \"memiliki\" },\n        file: { unit: \"byte\", verb: \"memiliki\" },\n        array: { unit: \"item\", verb: \"memiliki\" },\n        set: { unit: \"item\", verb: \"memiliki\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"alamat email\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"tanggal dan waktu format ISO\",\n        date: \"tanggal format ISO\",\n        time: \"jam format ISO\",\n        duration: \"durasi format ISO\",\n        ipv4: \"alamat IPv4\",\n        ipv6: \"alamat IPv6\",\n        cidrv4: \"rentang alamat IPv4\",\n        cidrv6: \"rentang alamat IPv6\",\n        base64: \"string dengan enkode base64\",\n        base64url: \"string dengan enkode base64url\",\n        json_string: \"string JSON\",\n        e164: \"angka E.164\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Input tidak valid: diharapkan instanceof ${issue.expected}, diterima ${received}`;\n                }\n                return `Input tidak valid: diharapkan ${expected}, diterima ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Input tidak valid: diharapkan ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Pilihan tidak valid: diharapkan salah satu dari ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Terlalu besar: diharapkan ${issue.origin ?? \"value\"} memiliki ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elemen\"}`;\n                return `Terlalu besar: diharapkan ${issue.origin ?? \"value\"} menjadi ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Terlalu kecil: diharapkan ${issue.origin} memiliki ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Terlalu kecil: diharapkan ${issue.origin} menjadi ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `String tidak valid: harus dimulai dengan \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `String tidak valid: harus berakhir dengan \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `String tidak valid: harus menyertakan \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `String tidak valid: harus sesuai pola ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} tidak valid`;\n            }\n            case \"not_multiple_of\":\n                return `Angka tidak valid: harus kelipatan dari ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Kunci tidak dikenali ${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Kunci tidak valid di ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Input tidak valid\";\n            case \"invalid_element\":\n                return `Nilai tidak valid di ${issue.origin}`;\n            default:\n                return `Input tidak valid`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"stafi\", verb: \"a\u00F0 hafa\" },\n        file: { unit: \"b\u00E6ti\", verb: \"a\u00F0 hafa\" },\n        array: { unit: \"hluti\", verb: \"a\u00F0 hafa\" },\n        set: { unit: \"hluti\", verb: \"a\u00F0 hafa\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"gildi\",\n        email: \"netfang\",\n        url: \"vefsl\u00F3\u00F0\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO dagsetning og t\u00EDmi\",\n        date: \"ISO dagsetning\",\n        time: \"ISO t\u00EDmi\",\n        duration: \"ISO t\u00EDmalengd\",\n        ipv4: \"IPv4 address\",\n        ipv6: \"IPv6 address\",\n        cidrv4: \"IPv4 range\",\n        cidrv6: \"IPv6 range\",\n        base64: \"base64-encoded strengur\",\n        base64url: \"base64url-encoded strengur\",\n        json_string: \"JSON strengur\",\n        e164: \"E.164 t\u00F6lugildi\",\n        jwt: \"JWT\",\n        template_literal: \"gildi\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"n\u00FAmer\",\n        array: \"fylki\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Rangt gildi: \u00DE\u00FA sl\u00F3st inn ${received} \u00FEar sem \u00E1 a\u00F0 vera instanceof ${issue.expected}`;\n                }\n                return `Rangt gildi: \u00DE\u00FA sl\u00F3st inn ${received} \u00FEar sem \u00E1 a\u00F0 vera ${expected}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Rangt gildi: gert r\u00E1\u00F0 fyrir ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u00D3gilt val: m\u00E1 vera eitt af eftirfarandi ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Of st\u00F3rt: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin ?? \"gildi\"} hafi ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"hluti\"}`;\n                return `Of st\u00F3rt: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin ?? \"gildi\"} s\u00E9 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Of l\u00EDti\u00F0: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin} hafi ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Of l\u00EDti\u00F0: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin} s\u00E9 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 byrja \u00E1 \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 enda \u00E1 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 innihalda \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 fylgja mynstri ${_issue.pattern}`;\n                return `Rangt ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `R\u00F6ng tala: ver\u00F0ur a\u00F0 vera margfeldi af ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u00D3\u00FEekkt ${issue.keys.length > 1 ? \"ir lyklar\" : \"ur lykill\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Rangur lykill \u00ED ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Rangt gildi\";\n            case \"invalid_element\":\n                return `Rangt gildi \u00ED ${issue.origin}`;\n            default:\n                return `Rangt gildi`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"caratteri\", verb: \"avere\" },\n        file: { unit: \"byte\", verb: \"avere\" },\n        array: { unit: \"elementi\", verb: \"avere\" },\n        set: { unit: \"elementi\", verb: \"avere\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"indirizzo email\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"data e ora ISO\",\n        date: \"data ISO\",\n        time: \"ora ISO\",\n        duration: \"durata ISO\",\n        ipv4: \"indirizzo IPv4\",\n        ipv6: \"indirizzo IPv6\",\n        cidrv4: \"intervallo IPv4\",\n        cidrv6: \"intervallo IPv6\",\n        base64: \"stringa codificata in base64\",\n        base64url: \"URL codificata in base64\",\n        json_string: \"stringa JSON\",\n        e164: \"numero E.164\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"numero\",\n        array: \"vettore\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Input non valido: atteso instanceof ${issue.expected}, ricevuto ${received}`;\n                }\n                return `Input non valido: atteso ${expected}, ricevuto ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Input non valido: atteso ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Opzione non valida: atteso uno tra ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Troppo grande: ${issue.origin ?? \"valore\"} deve avere ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementi\"}`;\n                return `Troppo grande: ${issue.origin ?? \"valore\"} deve essere ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Troppo piccolo: ${issue.origin} deve avere ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Troppo piccolo: ${issue.origin} deve essere ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Stringa non valida: deve iniziare con \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Stringa non valida: deve terminare con \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Stringa non valida: deve includere \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Stringa non valida: deve corrispondere al pattern ${_issue.pattern}`;\n                return `Input non valido: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Numero non valido: deve essere un multiplo di ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Chiav${issue.keys.length > 1 ? \"i\" : \"e\"} non riconosciut${issue.keys.length > 1 ? \"e\" : \"a\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Chiave non valida in ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Input non valido\";\n            case \"invalid_element\":\n                return `Valore non valido in ${issue.origin}`;\n            default:\n                return `Input non valido`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u6587\u5B57\", verb: \"\u3067\u3042\u308B\" },\n        file: { unit: \"\u30D0\u30A4\u30C8\", verb: \"\u3067\u3042\u308B\" },\n        array: { unit: \"\u8981\u7D20\", verb: \"\u3067\u3042\u308B\" },\n        set: { unit: \"\u8981\u7D20\", verb: \"\u3067\u3042\u308B\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u5165\u529B\u5024\",\n        email: \"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\",\n        url: \"URL\",\n        emoji: \"\u7D75\u6587\u5B57\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO\u65E5\u6642\",\n        date: \"ISO\u65E5\u4ED8\",\n        time: \"ISO\u6642\u523B\",\n        duration: \"ISO\u671F\u9593\",\n        ipv4: \"IPv4\u30A2\u30C9\u30EC\u30B9\",\n        ipv6: \"IPv6\u30A2\u30C9\u30EC\u30B9\",\n        cidrv4: \"IPv4\u7BC4\u56F2\",\n        cidrv6: \"IPv6\u7BC4\u56F2\",\n        base64: \"base64\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217\",\n        base64url: \"base64url\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217\",\n        json_string: \"JSON\u6587\u5B57\u5217\",\n        e164: \"E.164\u756A\u53F7\",\n        jwt: \"JWT\",\n        template_literal: \"\u5165\u529B\u5024\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u6570\u5024\",\n        array: \"\u914D\u5217\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u7121\u52B9\u306A\u5165\u529B: instanceof ${issue.expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${received}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`;\n                }\n                return `\u7121\u52B9\u306A\u5165\u529B: ${expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${received}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u7121\u52B9\u306A\u5165\u529B: ${util.stringifyPrimitive(issue.values[0])}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F`;\n                return `\u7121\u52B9\u306A\u9078\u629E: ${util.joinValues(issue.values, \"\u3001\")}\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"\u4EE5\u4E0B\u3067\u3042\u308B\" : \"\u3088\u308A\u5C0F\u3055\u3044\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue.origin ?? \"\u5024\"}\u306F${issue.maximum.toString()}${sizing.unit ?? \"\u8981\u7D20\"}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n                return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue.origin ?? \"\u5024\"}\u306F${issue.maximum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \"\u4EE5\u4E0A\u3067\u3042\u308B\" : \"\u3088\u308A\u5927\u304D\u3044\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue.origin}\u306F${issue.minimum.toString()}${sizing.unit}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n                return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue.origin}\u306F${issue.minimum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \"${_issue.prefix}\"\u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n                if (_issue.format === \"ends_with\")\n                    return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \"${_issue.suffix}\"\u3067\u7D42\u308F\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n                if (_issue.format === \"includes\")\n                    return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \"${_issue.includes}\"\u3092\u542B\u3080\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n                if (_issue.format === \"regex\")\n                    return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \u30D1\u30BF\u30FC\u30F3${_issue.pattern}\u306B\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n                return `\u7121\u52B9\u306A${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u7121\u52B9\u306A\u6570\u5024: ${issue.divisor}\u306E\u500D\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n            case \"unrecognized_keys\":\n                return `\u8A8D\u8B58\u3055\u308C\u3066\u3044\u306A\u3044\u30AD\u30FC${issue.keys.length > 1 ? \"\u7FA4\" : \"\"}: ${util.joinValues(issue.keys, \"\u3001\")}`;\n            case \"invalid_key\":\n                return `${issue.origin}\u5185\u306E\u7121\u52B9\u306A\u30AD\u30FC`;\n            case \"invalid_union\":\n                return \"\u7121\u52B9\u306A\u5165\u529B\";\n            case \"invalid_element\":\n                return `${issue.origin}\u5185\u306E\u7121\u52B9\u306A\u5024`;\n            default:\n                return `\u7121\u52B9\u306A\u5165\u529B`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n        file: { unit: \"\u10D1\u10D0\u10D8\u10E2\u10D8\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n        array: { unit: \"\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n        set: { unit: \"\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0\",\n        email: \"\u10D4\u10DA-\u10E4\u10DD\u10E1\u10E2\u10D8\u10E1 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\",\n        url: \"URL\",\n        emoji: \"\u10D4\u10DB\u10DD\u10EF\u10D8\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8-\u10D3\u10E0\u10DD\",\n        date: \"\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8\",\n        time: \"\u10D3\u10E0\u10DD\",\n        duration: \"\u10EE\u10D0\u10DC\u10D2\u10E0\u10EB\u10DA\u10D8\u10D5\u10DD\u10D1\u10D0\",\n        ipv4: \"IPv4 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\",\n        ipv6: \"IPv6 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\",\n        cidrv4: \"IPv4 \u10D3\u10D8\u10D0\u10DE\u10D0\u10D6\u10DD\u10DC\u10D8\",\n        cidrv6: \"IPv6 \u10D3\u10D8\u10D0\u10DE\u10D0\u10D6\u10DD\u10DC\u10D8\",\n        base64: \"base64-\u10D9\u10DD\u10D3\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10D5\u10D4\u10DA\u10D8\",\n        base64url: \"base64url-\u10D9\u10DD\u10D3\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10D5\u10D4\u10DA\u10D8\",\n        json_string: \"JSON \u10D5\u10D4\u10DA\u10D8\",\n        e164: \"E.164 \u10DC\u10DD\u10DB\u10D4\u10E0\u10D8\",\n        jwt: \"JWT\",\n        template_literal: \"\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u10E0\u10D8\u10EA\u10EE\u10D5\u10D8\",\n        string: \"\u10D5\u10D4\u10DA\u10D8\",\n        boolean: \"\u10D1\u10E3\u10DA\u10D4\u10D0\u10DC\u10D8\",\n        function: \"\u10E4\u10E3\u10DC\u10E5\u10EA\u10D8\u10D0\",\n        array: \"\u10DB\u10D0\u10E1\u10D8\u10D5\u10D8\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 instanceof ${issue.expected}, \u10DB\u10D8\u10E6\u10D4\u10D1\u10E3\u10DA\u10D8 ${received}`;\n                }\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${expected}, \u10DB\u10D8\u10E6\u10D4\u10D1\u10E3\u10DA\u10D8 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D0\u10E0\u10D8\u10D0\u10DC\u10E2\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8\u10D0 \u10D4\u10E0\u10D7-\u10D4\u10E0\u10D7\u10D8 ${util.joinValues(issue.values, \"|\")}-\u10D3\u10D0\u10DC`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10D3\u10D8\u10D3\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin ?? \"\u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit}`;\n                return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10D3\u10D8\u10D3\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin ?? \"\u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0\"} \u10D8\u10E7\u10DD\u10E1 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10DE\u10D0\u10E2\u10D0\u10E0\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10DE\u10D0\u10E2\u10D0\u10E0\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin} \u10D8\u10E7\u10DD\u10E1 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D4\u10DA\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10D8\u10EC\u10E7\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \"${_issue.prefix}\"-\u10D8\u10D7`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D4\u10DA\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10DB\u10D7\u10D0\u10D5\u10E0\u10D3\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \"${_issue.suffix}\"-\u10D8\u10D7`;\n                if (_issue.format === \"includes\")\n                    return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D4\u10DA\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1 \"${_issue.includes}\"-\u10E1`;\n                if (_issue.format === \"regex\")\n                    return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D4\u10DA\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D4\u10E1\u10D0\u10D1\u10D0\u10DB\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \u10E8\u10D0\u10D1\u10DA\u10DD\u10DC\u10E1 ${_issue.pattern}`;\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E0\u10D8\u10EA\u10EE\u10D5\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10D8\u10E7\u10DD\u10E1 ${issue.divisor}-\u10D8\u10E1 \u10EF\u10D4\u10E0\u10D0\u10D3\u10D8`;\n            case \"unrecognized_keys\":\n                return `\u10E3\u10EA\u10DC\u10DD\u10D1\u10D8 \u10D2\u10D0\u10E1\u10D0\u10E6\u10D4\u10D1${issue.keys.length > 1 ? \"\u10D4\u10D1\u10D8\" : \"\u10D8\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D2\u10D0\u10E1\u10D0\u10E6\u10D4\u10D1\u10D8 ${issue.origin}-\u10E8\u10D8`;\n            case \"invalid_union\":\n                return \"\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0\";\n            case \"invalid_element\":\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0 ${issue.origin}-\u10E8\u10D8`;\n            default:\n                return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n        file: { unit: \"\u1794\u17C3\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n        array: { unit: \"\u1792\u17B6\u178F\u17BB\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n        set: { unit: \"\u1792\u17B6\u178F\u17BB\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\",\n        email: \"\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793\u17A2\u17CA\u17B8\u1798\u17C2\u179B\",\n        url: \"URL\",\n        emoji: \"\u179F\u1789\u17D2\u1789\u17B6\u17A2\u17B6\u179A\u1798\u17D2\u1798\u178E\u17CD\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 \u1793\u17B7\u1784\u1798\u17C9\u17C4\u1784 ISO\",\n        date: \"\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 ISO\",\n        time: \"\u1798\u17C9\u17C4\u1784 ISO\",\n        duration: \"\u179A\u1799\u17C8\u1796\u17C1\u179B ISO\",\n        ipv4: \"\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4\",\n        ipv6: \"\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6\",\n        cidrv4: \"\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4\",\n        cidrv6: \"\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6\",\n        base64: \"\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64\",\n        base64url: \"\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64url\",\n        json_string: \"\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A JSON\",\n        e164: \"\u179B\u17C1\u1781 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u179B\u17C1\u1781\",\n        array: \"\u17A2\u17B6\u179A\u17C1 (Array)\",\n        null: \"\u1782\u17D2\u1798\u17B6\u1793\u178F\u1798\u17D2\u179B\u17C3 (null)\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A instanceof ${issue.expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${received}`;\n                }\n                return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u1787\u1798\u17D2\u179A\u17BE\u179F\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1787\u17B6\u1798\u17BD\u1799\u1780\u17D2\u1793\u17BB\u1784\u1785\u17C6\u178E\u17C4\u1798 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin ?? \"\u178F\u1798\u17D2\u179B\u17C3\"} ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"\u1792\u17B6\u178F\u17BB\"}`;\n                return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin ?? \"\u178F\u1798\u17D2\u179B\u17C3\"} ${adj} ${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin} ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin} ${adj} ${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1785\u17B6\u1794\u17CB\u1795\u17D2\u178F\u17BE\u1798\u178A\u17C4\u1799 \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1794\u1789\u17D2\u1785\u1794\u17CB\u178A\u17C4\u1799 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1798\u17B6\u1793 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1795\u17D2\u1782\u17BC\u1795\u17D2\u1782\u1784\u1793\u17B9\u1784\u1791\u1798\u17D2\u179A\u1784\u17CB\u178A\u17C2\u179B\u1794\u17B6\u1793\u1780\u17C6\u178E\u178F\u17CB ${_issue.pattern}`;\n                return `\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u179B\u17C1\u1781\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1787\u17B6\u1796\u17A0\u17BB\u1782\u17BB\u178E\u1793\u17C3 ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u179A\u1780\u1783\u17BE\u1789\u179F\u17C4\u1798\u17B7\u1793\u179F\u17D2\u1782\u17B6\u179B\u17CB\u17D6 ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u179F\u17C4\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue.origin}`;\n            case \"invalid_union\":\n                return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`;\n            case \"invalid_element\":\n                return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue.origin}`;\n            default:\n                return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import km from \"./km.js\";\n/** @deprecated Use `km` instead. */\nexport default function () {\n    return km();\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\uBB38\uC790\", verb: \"to have\" },\n        file: { unit: \"\uBC14\uC774\uD2B8\", verb: \"to have\" },\n        array: { unit: \"\uAC1C\", verb: \"to have\" },\n        set: { unit: \"\uAC1C\", verb: \"to have\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\uC785\uB825\",\n        email: \"\uC774\uBA54\uC77C \uC8FC\uC18C\",\n        url: \"URL\",\n        emoji: \"\uC774\uBAA8\uC9C0\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \uB0A0\uC9DC\uC2DC\uAC04\",\n        date: \"ISO \uB0A0\uC9DC\",\n        time: \"ISO \uC2DC\uAC04\",\n        duration: \"ISO \uAE30\uAC04\",\n        ipv4: \"IPv4 \uC8FC\uC18C\",\n        ipv6: \"IPv6 \uC8FC\uC18C\",\n        cidrv4: \"IPv4 \uBC94\uC704\",\n        cidrv6: \"IPv6 \uBC94\uC704\",\n        base64: \"base64 \uC778\uCF54\uB529 \uBB38\uC790\uC5F4\",\n        base64url: \"base64url \uC778\uCF54\uB529 \uBB38\uC790\uC5F4\",\n        json_string: \"JSON \uBB38\uC790\uC5F4\",\n        e164: \"E.164 \uBC88\uD638\",\n        jwt: \"JWT\",\n        template_literal: \"\uC785\uB825\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 instanceof ${issue.expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${received}\uC785\uB2C8\uB2E4`;\n                }\n                return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 ${expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${received}\uC785\uB2C8\uB2E4`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\uC798\uBABB\uB41C \uC785\uB825: \uAC12\uC740 ${util.stringifyPrimitive(issue.values[0])} \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`;\n                return `\uC798\uBABB\uB41C \uC635\uC158: ${util.joinValues(issue.values, \"\uB610\uB294 \")} \uC911 \uD558\uB098\uC5EC\uC57C \uD569\uB2C8\uB2E4`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"\uC774\uD558\" : \"\uBBF8\uB9CC\";\n                const suffix = adj === \"\uBBF8\uB9CC\" ? \"\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4\" : \"\uC5EC\uC57C \uD569\uB2C8\uB2E4\";\n                const sizing = getSizing(issue.origin);\n                const unit = sizing?.unit ?? \"\uC694\uC18C\";\n                if (sizing)\n                    return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue.maximum.toString()}${unit} ${adj}${suffix}`;\n                return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue.maximum.toString()} ${adj}${suffix}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \"\uC774\uC0C1\" : \"\uCD08\uACFC\";\n                const suffix = adj === \"\uC774\uC0C1\" ? \"\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4\" : \"\uC5EC\uC57C \uD569\uB2C8\uB2E4\";\n                const sizing = getSizing(issue.origin);\n                const unit = sizing?.unit ?? \"\uC694\uC18C\";\n                if (sizing) {\n                    return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue.minimum.toString()}${unit} ${adj}${suffix}`;\n                }\n                return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue.minimum.toString()} ${adj}${suffix}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \"${_issue.prefix}\"(\uC73C)\uB85C \uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \"${_issue.suffix}\"(\uC73C)\uB85C \uB05D\uB098\uC57C \uD569\uB2C8\uB2E4`;\n                if (_issue.format === \"includes\")\n                    return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \"${_issue.includes}\"\uC744(\uB97C) \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4`;\n                if (_issue.format === \"regex\")\n                    return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \uC815\uADDC\uC2DD ${_issue.pattern} \uD328\uD134\uACFC \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4`;\n                return `\uC798\uBABB\uB41C ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\uC798\uBABB\uB41C \uC22B\uC790: ${issue.divisor}\uC758 \uBC30\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4`;\n            case \"unrecognized_keys\":\n                return `\uC778\uC2DD\uD560 \uC218 \uC5C6\uB294 \uD0A4: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\uC798\uBABB\uB41C \uD0A4: ${issue.origin}`;\n            case \"invalid_union\":\n                return `\uC798\uBABB\uB41C \uC785\uB825`;\n            case \"invalid_element\":\n                return `\uC798\uBABB\uB41C \uAC12: ${issue.origin}`;\n            default:\n                return `\uC798\uBABB\uB41C \uC785\uB825`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst capitalizeFirstCharacter = (text) => {\n    return text.charAt(0).toUpperCase() + text.slice(1);\n};\nfunction getUnitTypeFromNumber(number) {\n    const abs = Math.abs(number);\n    const last = abs % 10;\n    const last2 = abs % 100;\n    if ((last2 >= 11 && last2 <= 19) || last === 0)\n        return \"many\";\n    if (last === 1)\n        return \"one\";\n    return \"few\";\n}\nconst error = () => {\n    const Sizable = {\n        string: {\n            unit: {\n                one: \"simbolis\",\n                few: \"simboliai\",\n                many: \"simboli\u0173\",\n            },\n            verb: {\n                smaller: {\n                    inclusive: \"turi b\u016Bti ne ilgesn\u0117 kaip\",\n                    notInclusive: \"turi b\u016Bti trumpesn\u0117 kaip\",\n                },\n                bigger: {\n                    inclusive: \"turi b\u016Bti ne trumpesn\u0117 kaip\",\n                    notInclusive: \"turi b\u016Bti ilgesn\u0117 kaip\",\n                },\n            },\n        },\n        file: {\n            unit: {\n                one: \"baitas\",\n                few: \"baitai\",\n                many: \"bait\u0173\",\n            },\n            verb: {\n                smaller: {\n                    inclusive: \"turi b\u016Bti ne didesnis kaip\",\n                    notInclusive: \"turi b\u016Bti ma\u017Eesnis kaip\",\n                },\n                bigger: {\n                    inclusive: \"turi b\u016Bti ne ma\u017Eesnis kaip\",\n                    notInclusive: \"turi b\u016Bti didesnis kaip\",\n                },\n            },\n        },\n        array: {\n            unit: {\n                one: \"element\u0105\",\n                few: \"elementus\",\n                many: \"element\u0173\",\n            },\n            verb: {\n                smaller: {\n                    inclusive: \"turi tur\u0117ti ne daugiau kaip\",\n                    notInclusive: \"turi tur\u0117ti ma\u017Eiau kaip\",\n                },\n                bigger: {\n                    inclusive: \"turi tur\u0117ti ne ma\u017Eiau kaip\",\n                    notInclusive: \"turi tur\u0117ti daugiau kaip\",\n                },\n            },\n        },\n        set: {\n            unit: {\n                one: \"element\u0105\",\n                few: \"elementus\",\n                many: \"element\u0173\",\n            },\n            verb: {\n                smaller: {\n                    inclusive: \"turi tur\u0117ti ne daugiau kaip\",\n                    notInclusive: \"turi tur\u0117ti ma\u017Eiau kaip\",\n                },\n                bigger: {\n                    inclusive: \"turi tur\u0117ti ne ma\u017Eiau kaip\",\n                    notInclusive: \"turi tur\u0117ti daugiau kaip\",\n                },\n            },\n        },\n    };\n    function getSizing(origin, unitType, inclusive, targetShouldBe) {\n        const result = Sizable[origin] ?? null;\n        if (result === null)\n            return result;\n        return {\n            unit: result.unit[unitType],\n            verb: result.verb[targetShouldBe][inclusive ? \"inclusive\" : \"notInclusive\"],\n        };\n    }\n    const FormatDictionary = {\n        regex: \"\u012Fvestis\",\n        email: \"el. pa\u0161to adresas\",\n        url: \"URL\",\n        emoji: \"jaustukas\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO data ir laikas\",\n        date: \"ISO data\",\n        time: \"ISO laikas\",\n        duration: \"ISO trukm\u0117\",\n        ipv4: \"IPv4 adresas\",\n        ipv6: \"IPv6 adresas\",\n        cidrv4: \"IPv4 tinklo prefiksas (CIDR)\",\n        cidrv6: \"IPv6 tinklo prefiksas (CIDR)\",\n        base64: \"base64 u\u017Ekoduota eilut\u0117\",\n        base64url: \"base64url u\u017Ekoduota eilut\u0117\",\n        json_string: \"JSON eilut\u0117\",\n        e164: \"E.164 numeris\",\n        jwt: \"JWT\",\n        template_literal: \"\u012Fvestis\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"skai\u010Dius\",\n        bigint: \"sveikasis skai\u010Dius\",\n        string: \"eilut\u0117\",\n        boolean: \"login\u0117 reik\u0161m\u0117\",\n        undefined: \"neapibr\u0117\u017Eta reik\u0161m\u0117\",\n        function: \"funkcija\",\n        symbol: \"simbolis\",\n        array: \"masyvas\",\n        object: \"objektas\",\n        null: \"nulin\u0117 reik\u0161m\u0117\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Gautas tipas ${received}, o tik\u0117tasi - instanceof ${issue.expected}`;\n                }\n                return `Gautas tipas ${received}, o tik\u0117tasi - ${expected}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Privalo b\u016Bti ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Privalo b\u016Bti vienas i\u0161 ${util.joinValues(issue.values, \"|\")} pasirinkim\u0173`;\n            case \"too_big\": {\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                const sizing = getSizing(issue.origin, getUnitTypeFromNumber(Number(issue.maximum)), issue.inclusive ?? false, \"smaller\");\n                if (sizing?.verb)\n                    return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} ${sizing.verb} ${issue.maximum.toString()} ${sizing.unit ?? \"element\u0173\"}`;\n                const adj = issue.inclusive ? \"ne didesnis kaip\" : \"ma\u017Eesnis kaip\";\n                return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} turi b\u016Bti ${adj} ${issue.maximum.toString()} ${sizing?.unit}`;\n            }\n            case \"too_small\": {\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                const sizing = getSizing(issue.origin, getUnitTypeFromNumber(Number(issue.minimum)), issue.inclusive ?? false, \"bigger\");\n                if (sizing?.verb)\n                    return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} ${sizing.verb} ${issue.minimum.toString()} ${sizing.unit ?? \"element\u0173\"}`;\n                const adj = issue.inclusive ? \"ne ma\u017Eesnis kaip\" : \"didesnis kaip\";\n                return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} turi b\u016Bti ${adj} ${issue.minimum.toString()} ${sizing?.unit}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Eilut\u0117 privalo prasid\u0117ti \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Eilut\u0117 privalo pasibaigti \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Eilut\u0117 privalo \u012Ftraukti \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Eilut\u0117 privalo atitikti ${_issue.pattern}`;\n                return `Neteisingas ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Skai\u010Dius privalo b\u016Bti ${issue.divisor} kartotinis.`;\n            case \"unrecognized_keys\":\n                return `Neatpa\u017Eint${issue.keys.length > 1 ? \"i\" : \"as\"} rakt${issue.keys.length > 1 ? \"ai\" : \"as\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return \"Rastas klaidingas raktas\";\n            case \"invalid_union\":\n                return \"Klaidinga \u012Fvestis\";\n            case \"invalid_element\": {\n                const origin = TypeDictionary[issue.origin] ?? issue.origin;\n                return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} turi klaiding\u0105 \u012Fvest\u012F`;\n            }\n            default:\n                return \"Klaidinga \u012Fvestis\";\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u0437\u043D\u0430\u0446\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n        file: { unit: \"\u0431\u0430\u0458\u0442\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n        array: { unit: \"\u0441\u0442\u0430\u0432\u043A\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n        set: { unit: \"\u0441\u0442\u0430\u0432\u043A\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0432\u043D\u0435\u0441\",\n        email: \"\u0430\u0434\u0440\u0435\u0441\u0430 \u043D\u0430 \u0435-\u043F\u043E\u0448\u0442\u0430\",\n        url: \"URL\",\n        emoji: \"\u0435\u043C\u043E\u045F\u0438\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u0434\u0430\u0442\u0443\u043C \u0438 \u0432\u0440\u0435\u043C\u0435\",\n        date: \"ISO \u0434\u0430\u0442\u0443\u043C\",\n        time: \"ISO \u0432\u0440\u0435\u043C\u0435\",\n        duration: \"ISO \u0432\u0440\u0435\u043C\u0435\u0442\u0440\u0430\u0435\u045A\u0435\",\n        ipv4: \"IPv4 \u0430\u0434\u0440\u0435\u0441\u0430\",\n        ipv6: \"IPv6 \u0430\u0434\u0440\u0435\u0441\u0430\",\n        cidrv4: \"IPv4 \u043E\u043F\u0441\u0435\u0433\",\n        cidrv6: \"IPv6 \u043E\u043F\u0441\u0435\u0433\",\n        base64: \"base64-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430\",\n        base64url: \"base64url-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430\",\n        json_string: \"JSON \u043D\u0438\u0437\u0430\",\n        e164: \"E.164 \u0431\u0440\u043E\u0458\",\n        jwt: \"JWT\",\n        template_literal: \"\u0432\u043D\u0435\u0441\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0431\u0440\u043E\u0458\",\n        array: \"\u043D\u0438\u0437\u0430\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 instanceof ${issue.expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${received}`;\n                }\n                return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Invalid input: expected ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u0413\u0440\u0435\u0448\u0430\u043D\u0430 \u043E\u043F\u0446\u0438\u0458\u0430: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 \u0435\u0434\u043D\u0430 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin ?? \"\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430\"} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0438\"}`;\n                return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin ?? \"\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430\"} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u043D\u0443\u0432\u0430 \u0441\u043E \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u0432\u0440\u0448\u0443\u0432\u0430 \u0441\u043E \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0432\u043A\u043B\u0443\u0447\u0443\u0432\u0430 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u043E\u0434\u0433\u043E\u0430\u0440\u0430 \u043D\u0430 \u043F\u0430\u0442\u0435\u0440\u043D\u043E\u0442 ${_issue.pattern}`;\n                return `Invalid ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u0413\u0440\u0435\u0448\u0435\u043D \u0431\u0440\u043E\u0458: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0431\u0438\u0434\u0435 \u0434\u0435\u043B\u0438\u0432 \u0441\u043E ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `${issue.keys.length > 1 ? \"\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D\u0438 \u043A\u043B\u0443\u0447\u0435\u0432\u0438\" : \"\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D \u043A\u043B\u0443\u0447\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u0413\u0440\u0435\u0448\u0435\u043D \u043A\u043B\u0443\u0447 \u0432\u043E ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441\";\n            case \"invalid_element\":\n                return `\u0413\u0440\u0435\u0448\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0432\u043E ${issue.origin}`;\n            default:\n                return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"aksara\", verb: \"mempunyai\" },\n        file: { unit: \"bait\", verb: \"mempunyai\" },\n        array: { unit: \"elemen\", verb: \"mempunyai\" },\n        set: { unit: \"elemen\", verb: \"mempunyai\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"alamat e-mel\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"tarikh masa ISO\",\n        date: \"tarikh ISO\",\n        time: \"masa ISO\",\n        duration: \"tempoh ISO\",\n        ipv4: \"alamat IPv4\",\n        ipv6: \"alamat IPv6\",\n        cidrv4: \"julat IPv4\",\n        cidrv6: \"julat IPv6\",\n        base64: \"string dikodkan base64\",\n        base64url: \"string dikodkan base64url\",\n        json_string: \"string JSON\",\n        e164: \"nombor E.164\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"nombor\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Input tidak sah: dijangka instanceof ${issue.expected}, diterima ${received}`;\n                }\n                return `Input tidak sah: dijangka ${expected}, diterima ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Input tidak sah: dijangka ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Pilihan tidak sah: dijangka salah satu daripada ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Terlalu besar: dijangka ${issue.origin ?? \"nilai\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elemen\"}`;\n                return `Terlalu besar: dijangka ${issue.origin ?? \"nilai\"} adalah ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Terlalu kecil: dijangka ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Terlalu kecil: dijangka ${issue.origin} adalah ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `String tidak sah: mesti bermula dengan \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `String tidak sah: mesti berakhir dengan \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `String tidak sah: mesti mengandungi \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `String tidak sah: mesti sepadan dengan corak ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} tidak sah`;\n            }\n            case \"not_multiple_of\":\n                return `Nombor tidak sah: perlu gandaan ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Kunci tidak dikenali: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Kunci tidak sah dalam ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Input tidak sah\";\n            case \"invalid_element\":\n                return `Nilai tidak sah dalam ${issue.origin}`;\n            default:\n                return `Input tidak sah`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"tekens\", verb: \"heeft\" },\n        file: { unit: \"bytes\", verb: \"heeft\" },\n        array: { unit: \"elementen\", verb: \"heeft\" },\n        set: { unit: \"elementen\", verb: \"heeft\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"invoer\",\n        email: \"emailadres\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO datum en tijd\",\n        date: \"ISO datum\",\n        time: \"ISO tijd\",\n        duration: \"ISO duur\",\n        ipv4: \"IPv4-adres\",\n        ipv6: \"IPv6-adres\",\n        cidrv4: \"IPv4-bereik\",\n        cidrv6: \"IPv6-bereik\",\n        base64: \"base64-gecodeerde tekst\",\n        base64url: \"base64 URL-gecodeerde tekst\",\n        json_string: \"JSON string\",\n        e164: \"E.164-nummer\",\n        jwt: \"JWT\",\n        template_literal: \"invoer\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"getal\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Ongeldige invoer: verwacht instanceof ${issue.expected}, ontving ${received}`;\n                }\n                return `Ongeldige invoer: verwacht ${expected}, ontving ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Ongeldige invoer: verwacht ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Ongeldige optie: verwacht \u00E9\u00E9n van ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                const longName = issue.origin === \"date\" ? \"laat\" : issue.origin === \"string\" ? \"lang\" : \"groot\";\n                if (sizing)\n                    return `Te ${longName}: verwacht dat ${issue.origin ?? \"waarde\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementen\"} ${sizing.verb}`;\n                return `Te ${longName}: verwacht dat ${issue.origin ?? \"waarde\"} ${adj}${issue.maximum.toString()} is`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                const shortName = issue.origin === \"date\" ? \"vroeg\" : issue.origin === \"string\" ? \"kort\" : \"klein\";\n                if (sizing) {\n                    return `Te ${shortName}: verwacht dat ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} ${sizing.verb}`;\n                }\n                return `Te ${shortName}: verwacht dat ${issue.origin} ${adj}${issue.minimum.toString()} is`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Ongeldige tekst: moet met \"${_issue.prefix}\" beginnen`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Ongeldige tekst: moet op \"${_issue.suffix}\" eindigen`;\n                if (_issue.format === \"includes\")\n                    return `Ongeldige tekst: moet \"${_issue.includes}\" bevatten`;\n                if (_issue.format === \"regex\")\n                    return `Ongeldige tekst: moet overeenkomen met patroon ${_issue.pattern}`;\n                return `Ongeldig: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Ongeldig getal: moet een veelvoud van ${issue.divisor} zijn`;\n            case \"unrecognized_keys\":\n                return `Onbekende key${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Ongeldige key in ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Ongeldige invoer\";\n            case \"invalid_element\":\n                return `Ongeldige waarde in ${issue.origin}`;\n            default:\n                return `Ongeldige invoer`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"tegn\", verb: \"\u00E5 ha\" },\n        file: { unit: \"bytes\", verb: \"\u00E5 ha\" },\n        array: { unit: \"elementer\", verb: \"\u00E5 inneholde\" },\n        set: { unit: \"elementer\", verb: \"\u00E5 inneholde\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"input\",\n        email: \"e-postadresse\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO dato- og klokkeslett\",\n        date: \"ISO-dato\",\n        time: \"ISO-klokkeslett\",\n        duration: \"ISO-varighet\",\n        ipv4: \"IPv4-omr\u00E5de\",\n        ipv6: \"IPv6-omr\u00E5de\",\n        cidrv4: \"IPv4-spekter\",\n        cidrv6: \"IPv6-spekter\",\n        base64: \"base64-enkodet streng\",\n        base64url: \"base64url-enkodet streng\",\n        json_string: \"JSON-streng\",\n        e164: \"E.164-nummer\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"tall\",\n        array: \"liste\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Ugyldig input: forventet instanceof ${issue.expected}, fikk ${received}`;\n                }\n                return `Ugyldig input: forventet ${expected}, fikk ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Ugyldig verdi: forventet ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Ugyldig valg: forventet en av ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `For stor(t): forventet ${issue.origin ?? \"value\"} til \u00E5 ha ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementer\"}`;\n                return `For stor(t): forventet ${issue.origin ?? \"value\"} til \u00E5 ha ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `For lite(n): forventet ${issue.origin} til \u00E5 ha ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `For lite(n): forventet ${issue.origin} til \u00E5 ha ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Ugyldig streng: m\u00E5 starte med \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Ugyldig streng: m\u00E5 ende med \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Ugyldig streng: m\u00E5 inneholde \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Ugyldig streng: m\u00E5 matche m\u00F8nsteret ${_issue.pattern}`;\n                return `Ugyldig ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Ugyldig tall: m\u00E5 v\u00E6re et multiplum av ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `${issue.keys.length > 1 ? \"Ukjente n\u00F8kler\" : \"Ukjent n\u00F8kkel\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Ugyldig n\u00F8kkel i ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Ugyldig input\";\n            case \"invalid_element\":\n                return `Ugyldig verdi i ${issue.origin}`;\n            default:\n                return `Ugyldig input`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"harf\", verb: \"olmal\u0131d\u0131r\" },\n        file: { unit: \"bayt\", verb: \"olmal\u0131d\u0131r\" },\n        array: { unit: \"unsur\", verb: \"olmal\u0131d\u0131r\" },\n        set: { unit: \"unsur\", verb: \"olmal\u0131d\u0131r\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"giren\",\n        email: \"epostag\u00E2h\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO heng\u00E2m\u0131\",\n        date: \"ISO tarihi\",\n        time: \"ISO zaman\u0131\",\n        duration: \"ISO m\u00FCddeti\",\n        ipv4: \"IPv4 ni\u015F\u00E2n\u0131\",\n        ipv6: \"IPv6 ni\u015F\u00E2n\u0131\",\n        cidrv4: \"IPv4 menzili\",\n        cidrv6: \"IPv6 menzili\",\n        base64: \"base64-\u015Fifreli metin\",\n        base64url: \"base64url-\u015Fifreli metin\",\n        json_string: \"JSON metin\",\n        e164: \"E.164 say\u0131s\u0131\",\n        jwt: \"JWT\",\n        template_literal: \"giren\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"numara\",\n        array: \"saf\",\n        null: \"gayb\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `F\u00E2sit giren: umulan instanceof ${issue.expected}, al\u0131nan ${received}`;\n                }\n                return `F\u00E2sit giren: umulan ${expected}, al\u0131nan ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `F\u00E2sit giren: umulan ${util.stringifyPrimitive(issue.values[0])}`;\n                return `F\u00E2sit tercih: m\u00FBteberler ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Fazla b\u00FCy\u00FCk: ${issue.origin ?? \"value\"}, ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elements\"} sahip olmal\u0131yd\u0131.`;\n                return `Fazla b\u00FCy\u00FCk: ${issue.origin ?? \"value\"}, ${adj}${issue.maximum.toString()} olmal\u0131yd\u0131.`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Fazla k\u00FC\u00E7\u00FCk: ${issue.origin}, ${adj}${issue.minimum.toString()} ${sizing.unit} sahip olmal\u0131yd\u0131.`;\n                }\n                return `Fazla k\u00FC\u00E7\u00FCk: ${issue.origin}, ${adj}${issue.minimum.toString()} olmal\u0131yd\u0131.`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `F\u00E2sit metin: \"${_issue.prefix}\" ile ba\u015Flamal\u0131.`;\n                if (_issue.format === \"ends_with\")\n                    return `F\u00E2sit metin: \"${_issue.suffix}\" ile bitmeli.`;\n                if (_issue.format === \"includes\")\n                    return `F\u00E2sit metin: \"${_issue.includes}\" ihtiv\u00E2 etmeli.`;\n                if (_issue.format === \"regex\")\n                    return `F\u00E2sit metin: ${_issue.pattern} nak\u015F\u0131na uymal\u0131.`;\n                return `F\u00E2sit ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `F\u00E2sit say\u0131: ${issue.divisor} kat\u0131 olmal\u0131yd\u0131.`;\n            case \"unrecognized_keys\":\n                return `Tan\u0131nmayan anahtar ${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} i\u00E7in tan\u0131nmayan anahtar var.`;\n            case \"invalid_union\":\n                return \"Giren tan\u0131namad\u0131.\";\n            case \"invalid_element\":\n                return `${issue.origin} i\u00E7in tan\u0131nmayan k\u0131ymet var.`;\n            default:\n                return `K\u0131ymet tan\u0131namad\u0131.`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u062A\u0648\u06A9\u064A\", verb: \"\u0648\u0644\u0631\u064A\" },\n        file: { unit: \"\u0628\u0627\u06CC\u067C\u0633\", verb: \"\u0648\u0644\u0631\u064A\" },\n        array: { unit: \"\u062A\u0648\u06A9\u064A\", verb: \"\u0648\u0644\u0631\u064A\" },\n        set: { unit: \"\u062A\u0648\u06A9\u064A\", verb: \"\u0648\u0644\u0631\u064A\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0648\u0631\u0648\u062F\u064A\",\n        email: \"\u0628\u0631\u06CC\u069A\u0646\u0627\u0644\u06CC\u06A9\",\n        url: \"\u06CC\u0648 \u0622\u0631 \u0627\u0644\",\n        emoji: \"\u0627\u06CC\u0645\u0648\u062C\u064A\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u0646\u06CC\u067C\u0647 \u0627\u0648 \u0648\u062E\u062A\",\n        date: \"\u0646\u06D0\u067C\u0647\",\n        time: \"\u0648\u062E\u062A\",\n        duration: \"\u0645\u0648\u062F\u0647\",\n        ipv4: \"\u062F IPv4 \u067E\u062A\u0647\",\n        ipv6: \"\u062F IPv6 \u067E\u062A\u0647\",\n        cidrv4: \"\u062F IPv4 \u0633\u0627\u062D\u0647\",\n        cidrv6: \"\u062F IPv6 \u0633\u0627\u062D\u0647\",\n        base64: \"base64-encoded \u0645\u062A\u0646\",\n        base64url: \"base64url-encoded \u0645\u062A\u0646\",\n        json_string: \"JSON \u0645\u062A\u0646\",\n        e164: \"\u062F E.164 \u0634\u0645\u06D0\u0631\u0647\",\n        jwt: \"JWT\",\n        template_literal: \"\u0648\u0631\u0648\u062F\u064A\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0639\u062F\u062F\",\n        array: \"\u0627\u0631\u06D0\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F instanceof ${issue.expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${received} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`;\n                }\n                return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${received} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1) {\n                    return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${util.stringifyPrimitive(issue.values[0])} \u0648\u0627\u06CC`;\n                }\n                return `\u0646\u0627\u0633\u0645 \u0627\u0646\u062A\u062E\u0627\u0628: \u0628\u0627\u06CC\u062F \u06CC\u0648 \u0644\u0647 ${util.joinValues(issue.values, \"|\")} \u0685\u062E\u0647 \u0648\u0627\u06CC`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue.origin ?? \"\u0627\u0631\u0632\u069A\u062A\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0635\u0631\u0648\u0646\u0647\"} \u0648\u0644\u0631\u064A`;\n                }\n                return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue.origin ?? \"\u0627\u0631\u0632\u069A\u062A\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} \u0648\u064A`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} ${sizing.unit} \u0648\u0644\u0631\u064A`;\n                }\n                return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} \u0648\u064A`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F \"${_issue.prefix}\" \u0633\u0631\u0647 \u067E\u06CC\u0644 \u0634\u064A`;\n                }\n                if (_issue.format === \"ends_with\") {\n                    return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F \"${_issue.suffix}\" \u0633\u0631\u0647 \u067E\u0627\u06CC \u062A\u0647 \u0648\u0631\u0633\u064A\u0696\u064A`;\n                }\n                if (_issue.format === \"includes\") {\n                    return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \"${_issue.includes}\" \u0648\u0644\u0631\u064A`;\n                }\n                if (_issue.format === \"regex\") {\n                    return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F ${_issue.pattern} \u0633\u0631\u0647 \u0645\u0637\u0627\u0628\u0642\u062A \u0648\u0644\u0631\u064A`;\n                }\n                return `${FormatDictionary[_issue.format] ?? issue.format} \u0646\u0627\u0633\u0645 \u062F\u06CC`;\n            }\n            case \"not_multiple_of\":\n                return `\u0646\u0627\u0633\u0645 \u0639\u062F\u062F: \u0628\u0627\u06CC\u062F \u062F ${issue.divisor} \u0645\u0636\u0631\u0628 \u0648\u064A`;\n            case \"unrecognized_keys\":\n                return `\u0646\u0627\u0633\u0645 ${issue.keys.length > 1 ? \"\u06A9\u0644\u06CC\u0689\u0648\u0646\u0647\" : \"\u06A9\u0644\u06CC\u0689\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u0646\u0627\u0633\u0645 \u06A9\u0644\u06CC\u0689 \u067E\u0647 ${issue.origin} \u06A9\u06D0`;\n            case \"invalid_union\":\n                return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`;\n            case \"invalid_element\":\n                return `\u0646\u0627\u0633\u0645 \u0639\u0646\u0635\u0631 \u067E\u0647 ${issue.origin} \u06A9\u06D0`;\n            default:\n                return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"znak\u00F3w\", verb: \"mie\u0107\" },\n        file: { unit: \"bajt\u00F3w\", verb: \"mie\u0107\" },\n        array: { unit: \"element\u00F3w\", verb: \"mie\u0107\" },\n        set: { unit: \"element\u00F3w\", verb: \"mie\u0107\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"wyra\u017Cenie\",\n        email: \"adres email\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"data i godzina w formacie ISO\",\n        date: \"data w formacie ISO\",\n        time: \"godzina w formacie ISO\",\n        duration: \"czas trwania ISO\",\n        ipv4: \"adres IPv4\",\n        ipv6: \"adres IPv6\",\n        cidrv4: \"zakres IPv4\",\n        cidrv6: \"zakres IPv6\",\n        base64: \"ci\u0105g znak\u00F3w zakodowany w formacie base64\",\n        base64url: \"ci\u0105g znak\u00F3w zakodowany w formacie base64url\",\n        json_string: \"ci\u0105g znak\u00F3w w formacie JSON\",\n        e164: \"liczba E.164\",\n        jwt: \"JWT\",\n        template_literal: \"wej\u015Bcie\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"liczba\",\n        array: \"tablica\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano instanceof ${issue.expected}, otrzymano ${received}`;\n                }\n                return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${expected}, otrzymano ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Nieprawid\u0142owa opcja: oczekiwano jednej z warto\u015Bci ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Za du\u017Ca warto\u015B\u0107: oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie mie\u0107 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"element\u00F3w\"}`;\n                }\n                return `Zbyt du\u017C(y/a/e): oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie wynosi\u0107 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Za ma\u0142a warto\u015B\u0107: oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie mie\u0107 ${adj}${issue.minimum.toString()} ${sizing.unit ?? \"element\u00F3w\"}`;\n                }\n                return `Zbyt ma\u0142(y/a/e): oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie wynosi\u0107 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi zaczyna\u0107 si\u0119 od \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi ko\u0144czy\u0107 si\u0119 na \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi zawiera\u0107 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi odpowiada\u0107 wzorcowi ${_issue.pattern}`;\n                return `Nieprawid\u0142ow(y/a/e) ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Nieprawid\u0142owa liczba: musi by\u0107 wielokrotno\u015Bci\u0105 ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Nierozpoznane klucze${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Nieprawid\u0142owy klucz w ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Nieprawid\u0142owe dane wej\u015Bciowe\";\n            case \"invalid_element\":\n                return `Nieprawid\u0142owa warto\u015B\u0107 w ${issue.origin}`;\n            default:\n                return `Nieprawid\u0142owe dane wej\u015Bciowe`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"caracteres\", verb: \"ter\" },\n        file: { unit: \"bytes\", verb: \"ter\" },\n        array: { unit: \"itens\", verb: \"ter\" },\n        set: { unit: \"itens\", verb: \"ter\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"padr\u00E3o\",\n        email: \"endere\u00E7o de e-mail\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"data e hora ISO\",\n        date: \"data ISO\",\n        time: \"hora ISO\",\n        duration: \"dura\u00E7\u00E3o ISO\",\n        ipv4: \"endere\u00E7o IPv4\",\n        ipv6: \"endere\u00E7o IPv6\",\n        cidrv4: \"faixa de IPv4\",\n        cidrv6: \"faixa de IPv6\",\n        base64: \"texto codificado em base64\",\n        base64url: \"URL codificada em base64\",\n        json_string: \"texto JSON\",\n        e164: \"n\u00FAmero E.164\",\n        jwt: \"JWT\",\n        template_literal: \"entrada\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"n\u00FAmero\",\n        null: \"nulo\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Tipo inv\u00E1lido: esperado instanceof ${issue.expected}, recebido ${received}`;\n                }\n                return `Tipo inv\u00E1lido: esperado ${expected}, recebido ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Entrada inv\u00E1lida: esperado ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Op\u00E7\u00E3o inv\u00E1lida: esperada uma das ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Muito grande: esperado que ${issue.origin ?? \"valor\"} tivesse ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementos\"}`;\n                return `Muito grande: esperado que ${issue.origin ?? \"valor\"} fosse ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Muito pequeno: esperado que ${issue.origin} tivesse ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Muito pequeno: esperado que ${issue.origin} fosse ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Texto inv\u00E1lido: deve come\u00E7ar com \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Texto inv\u00E1lido: deve terminar com \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Texto inv\u00E1lido: deve incluir \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Texto inv\u00E1lido: deve corresponder ao padr\u00E3o ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} inv\u00E1lido`;\n            }\n            case \"not_multiple_of\":\n                return `N\u00FAmero inv\u00E1lido: deve ser m\u00FAltiplo de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Chave${issue.keys.length > 1 ? \"s\" : \"\"} desconhecida${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Chave inv\u00E1lida em ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Entrada inv\u00E1lida\";\n            case \"invalid_element\":\n                return `Valor inv\u00E1lido em ${issue.origin}`;\n            default:\n                return `Campo inv\u00E1lido`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"caractere\", verb: \"s\u0103 aib\u0103\" },\n        file: { unit: \"octe\u021Bi\", verb: \"s\u0103 aib\u0103\" },\n        array: { unit: \"elemente\", verb: \"s\u0103 aib\u0103\" },\n        set: { unit: \"elemente\", verb: \"s\u0103 aib\u0103\" },\n        map: { unit: \"intr\u0103ri\", verb: \"s\u0103 aib\u0103\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"intrare\",\n        email: \"adres\u0103 de email\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"dat\u0103 \u0219i or\u0103 ISO\",\n        date: \"dat\u0103 ISO\",\n        time: \"or\u0103 ISO\",\n        duration: \"durat\u0103 ISO\",\n        ipv4: \"adres\u0103 IPv4\",\n        ipv6: \"adres\u0103 IPv6\",\n        mac: \"adres\u0103 MAC\",\n        cidrv4: \"interval IPv4\",\n        cidrv6: \"interval IPv6\",\n        base64: \"\u0219ir codat base64\",\n        base64url: \"\u0219ir codat base64url\",\n        json_string: \"\u0219ir JSON\",\n        e164: \"num\u0103r E.164\",\n        jwt: \"JWT\",\n        template_literal: \"intrare\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        string: \"\u0219ir\",\n        number: \"num\u0103r\",\n        boolean: \"boolean\",\n        function: \"func\u021Bie\",\n        array: \"matrice\",\n        object: \"obiect\",\n        undefined: \"nedefinit\",\n        symbol: \"simbol\",\n        bigint: \"num\u0103r mare\",\n        void: \"void\",\n        never: \"never\",\n        map: \"hart\u0103\",\n        set: \"set\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                return `Intrare invalid\u0103: a\u0219teptat ${expected}, primit ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Intrare invalid\u0103: a\u0219teptat ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Op\u021Biune invalid\u0103: a\u0219teptat una dintre ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Prea mare: a\u0219teptat ca ${issue.origin ?? \"valoarea\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elemente\"}`;\n                return `Prea mare: a\u0219teptat ca ${issue.origin ?? \"valoarea\"} s\u0103 fie ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Prea mic: a\u0219teptat ca ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Prea mic: a\u0219teptat ca ${issue.origin} s\u0103 fie ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u0218ir invalid: trebuie s\u0103 \u00EEnceap\u0103 cu \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u0218ir invalid: trebuie s\u0103 se termine cu \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u0218ir invalid: trebuie s\u0103 includ\u0103 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u0218ir invalid: trebuie s\u0103 se potriveasc\u0103 cu modelul ${_issue.pattern}`;\n                return `Format invalid: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Num\u0103r invalid: trebuie s\u0103 fie multiplu de ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Chei nerecunoscute: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Cheie invalid\u0103 \u00EEn ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Intrare invalid\u0103\";\n            case \"invalid_element\":\n                return `Valoare invalid\u0103 \u00EEn ${issue.origin}`;\n            default:\n                return `Intrare invalid\u0103`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nfunction getRussianPlural(count, one, few, many) {\n    const absCount = Math.abs(count);\n    const lastDigit = absCount % 10;\n    const lastTwoDigits = absCount % 100;\n    if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {\n        return many;\n    }\n    if (lastDigit === 1) {\n        return one;\n    }\n    if (lastDigit >= 2 && lastDigit <= 4) {\n        return few;\n    }\n    return many;\n}\nconst error = () => {\n    const Sizable = {\n        string: {\n            unit: {\n                one: \"\u0441\u0438\u043C\u0432\u043E\u043B\",\n                few: \"\u0441\u0438\u043C\u0432\u043E\u043B\u0430\",\n                many: \"\u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432\",\n            },\n            verb: \"\u0438\u043C\u0435\u0442\u044C\",\n        },\n        file: {\n            unit: {\n                one: \"\u0431\u0430\u0439\u0442\",\n                few: \"\u0431\u0430\u0439\u0442\u0430\",\n                many: \"\u0431\u0430\u0439\u0442\",\n            },\n            verb: \"\u0438\u043C\u0435\u0442\u044C\",\n        },\n        array: {\n            unit: {\n                one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n                few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\",\n                many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432\",\n            },\n            verb: \"\u0438\u043C\u0435\u0442\u044C\",\n        },\n        set: {\n            unit: {\n                one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n                few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\",\n                many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432\",\n            },\n            verb: \"\u0438\u043C\u0435\u0442\u044C\",\n        },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0432\u0432\u043E\u0434\",\n        email: \"email \u0430\u0434\u0440\u0435\u0441\",\n        url: \"URL\",\n        emoji: \"\u044D\u043C\u043E\u0434\u0437\u0438\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F\",\n        date: \"ISO \u0434\u0430\u0442\u0430\",\n        time: \"ISO \u0432\u0440\u0435\u043C\u044F\",\n        duration: \"ISO \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\",\n        ipv4: \"IPv4 \u0430\u0434\u0440\u0435\u0441\",\n        ipv6: \"IPv6 \u0430\u0434\u0440\u0435\u0441\",\n        cidrv4: \"IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n        cidrv6: \"IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n        base64: \"\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64\",\n        base64url: \"\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64url\",\n        json_string: \"JSON \u0441\u0442\u0440\u043E\u043A\u0430\",\n        e164: \"\u043D\u043E\u043C\u0435\u0440 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u0432\u0432\u043E\u0434\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0447\u0438\u0441\u043B\u043E\",\n        array: \"\u043C\u0430\u0441\u0441\u0438\u0432\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C instanceof ${issue.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${received}`;\n                }\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0434\u043D\u043E \u0438\u0437 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    const maxValue = Number(issue.maximum);\n                    const unit = getRussianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n                    return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\"} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue.maximum.toString()} ${unit}`;\n                }\n                return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\"} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    const minValue = Number(issue.minimum);\n                    const unit = getRussianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n                    return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue.minimum.toString()} ${unit}`;\n                }\n                return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`;\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E: \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u041D\u0435\u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u043D\u043D${issue.keys.length > 1 ? \"\u044B\u0435\" : \"\u044B\u0439\"} \u043A\u043B\u044E\u0447${issue.keys.length > 1 ? \"\u0438\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u0432 ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\";\n            case \"invalid_element\":\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432 ${issue.origin}`;\n            default:\n                return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"znakov\", verb: \"imeti\" },\n        file: { unit: \"bajtov\", verb: \"imeti\" },\n        array: { unit: \"elementov\", verb: \"imeti\" },\n        set: { unit: \"elementov\", verb: \"imeti\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"vnos\",\n        email: \"e-po\u0161tni naslov\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO datum in \u010Das\",\n        date: \"ISO datum\",\n        time: \"ISO \u010Das\",\n        duration: \"ISO trajanje\",\n        ipv4: \"IPv4 naslov\",\n        ipv6: \"IPv6 naslov\",\n        cidrv4: \"obseg IPv4\",\n        cidrv6: \"obseg IPv6\",\n        base64: \"base64 kodiran niz\",\n        base64url: \"base64url kodiran niz\",\n        json_string: \"JSON niz\",\n        e164: \"E.164 \u0161tevilka\",\n        jwt: \"JWT\",\n        template_literal: \"vnos\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0161tevilo\",\n        array: \"tabela\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Neveljaven vnos: pri\u010Dakovano instanceof ${issue.expected}, prejeto ${received}`;\n                }\n                return `Neveljaven vnos: pri\u010Dakovano ${expected}, prejeto ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Neveljaven vnos: pri\u010Dakovano ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Neveljavna mo\u017Enost: pri\u010Dakovano eno izmed ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Preveliko: pri\u010Dakovano, da bo ${issue.origin ?? \"vrednost\"} imelo ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementov\"}`;\n                return `Preveliko: pri\u010Dakovano, da bo ${issue.origin ?? \"vrednost\"} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Premajhno: pri\u010Dakovano, da bo ${issue.origin} imelo ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Premajhno: pri\u010Dakovano, da bo ${issue.origin} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Neveljaven niz: mora se za\u010Deti z \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Neveljaven niz: mora se kon\u010Dati z \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Neveljaven niz: mora vsebovati \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Neveljaven niz: mora ustrezati vzorcu ${_issue.pattern}`;\n                return `Neveljaven ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Neveljavno \u0161tevilo: mora biti ve\u010Dkratnik ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Neprepoznan${issue.keys.length > 1 ? \"i klju\u010Di\" : \" klju\u010D\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Neveljaven klju\u010D v ${issue.origin}`;\n            case \"invalid_union\":\n                return \"Neveljaven vnos\";\n            case \"invalid_element\":\n                return `Neveljavna vrednost v ${issue.origin}`;\n            default:\n                return \"Neveljaven vnos\";\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"tecken\", verb: \"att ha\" },\n        file: { unit: \"bytes\", verb: \"att ha\" },\n        array: { unit: \"objekt\", verb: \"att inneh\u00E5lla\" },\n        set: { unit: \"objekt\", verb: \"att inneh\u00E5lla\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"regulj\u00E4rt uttryck\",\n        email: \"e-postadress\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO-datum och tid\",\n        date: \"ISO-datum\",\n        time: \"ISO-tid\",\n        duration: \"ISO-varaktighet\",\n        ipv4: \"IPv4-intervall\",\n        ipv6: \"IPv6-intervall\",\n        cidrv4: \"IPv4-spektrum\",\n        cidrv6: \"IPv6-spektrum\",\n        base64: \"base64-kodad str\u00E4ng\",\n        base64url: \"base64url-kodad str\u00E4ng\",\n        json_string: \"JSON-str\u00E4ng\",\n        e164: \"E.164-nummer\",\n        jwt: \"JWT\",\n        template_literal: \"mall-literal\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"antal\",\n        array: \"lista\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Ogiltig inmatning: f\u00F6rv\u00E4ntat instanceof ${issue.expected}, fick ${received}`;\n                }\n                return `Ogiltig inmatning: f\u00F6rv\u00E4ntat ${expected}, fick ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Ogiltig inmatning: f\u00F6rv\u00E4ntat ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Ogiltigt val: f\u00F6rv\u00E4ntade en av ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `F\u00F6r stor(t): f\u00F6rv\u00E4ntade ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"element\"}`;\n                }\n                return `F\u00F6r stor(t): f\u00F6rv\u00E4ntat ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `F\u00F6r lite(t): f\u00F6rv\u00E4ntade ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `F\u00F6r lite(t): f\u00F6rv\u00E4ntade ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `Ogiltig str\u00E4ng: m\u00E5ste b\u00F6rja med \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `Ogiltig str\u00E4ng: m\u00E5ste sluta med \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Ogiltig str\u00E4ng: m\u00E5ste inneh\u00E5lla \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Ogiltig str\u00E4ng: m\u00E5ste matcha m\u00F6nstret \"${_issue.pattern}\"`;\n                return `Ogiltig(t) ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Ogiltigt tal: m\u00E5ste vara en multipel av ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `${issue.keys.length > 1 ? \"Ok\u00E4nda nycklar\" : \"Ok\u00E4nd nyckel\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Ogiltig nyckel i ${issue.origin ?? \"v\u00E4rdet\"}`;\n            case \"invalid_union\":\n                return \"Ogiltig input\";\n            case \"invalid_element\":\n                return `Ogiltigt v\u00E4rde i ${issue.origin ?? \"v\u00E4rdet\"}`;\n            default:\n                return `Ogiltig input`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n        file: { unit: \"\u0BAA\u0BC8\u0B9F\u0BCD\u0B9F\u0BC1\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n        array: { unit: \"\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n        set: { unit: \"\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1\",\n        email: \"\u0BAE\u0BBF\u0BA9\u0BCD\u0BA9\u0B9E\u0BCD\u0B9A\u0BB2\u0BCD \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u0BA4\u0BC7\u0BA4\u0BBF \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD\",\n        date: \"ISO \u0BA4\u0BC7\u0BA4\u0BBF\",\n        time: \"ISO \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD\",\n        duration: \"ISO \u0B95\u0BBE\u0BB2 \u0B85\u0BB3\u0BB5\u0BC1\",\n        ipv4: \"IPv4 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\",\n        ipv6: \"IPv6 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\",\n        cidrv4: \"IPv4 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1\",\n        cidrv6: \"IPv6 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1\",\n        base64: \"base64-encoded \u0B9A\u0BB0\u0BAE\u0BCD\",\n        base64url: \"base64url-encoded \u0B9A\u0BB0\u0BAE\u0BCD\",\n        json_string: \"JSON \u0B9A\u0BB0\u0BAE\u0BCD\",\n        e164: \"E.164 \u0B8E\u0BA3\u0BCD\",\n        jwt: \"JWT\",\n        template_literal: \"input\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0B8E\u0BA3\u0BCD\",\n        array: \"\u0B85\u0BA3\u0BBF\",\n        null: \"\u0BB5\u0BC6\u0BB1\u0BC1\u0BAE\u0BC8\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 instanceof ${issue.expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${received}`;\n                }\n                return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${util.joinValues(issue.values, \"|\")} \u0B87\u0BB2\u0BCD \u0B92\u0BA9\u0BCD\u0BB1\u0BC1`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin ?? \"\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD\"} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n                }\n                return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin ?? \"\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\"} ${adj}${issue.maximum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; //\n                }\n                return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin} ${adj}${issue.minimum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: \"${_issue.prefix}\" \u0B87\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n                if (_issue.format === \"ends_with\")\n                    return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: \"${_issue.suffix}\" \u0B87\u0BB2\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0B9F\u0BC8\u0BAF \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n                if (_issue.format === \"includes\")\n                    return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: \"${_issue.includes}\" \u0B90 \u0B89\u0BB3\u0BCD\u0BB3\u0B9F\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n                if (_issue.format === \"regex\")\n                    return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: ${_issue.pattern} \u0BAE\u0BC1\u0BB1\u0BC8\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B9F\u0BA9\u0BCD \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n                return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B8E\u0BA3\u0BCD: ${issue.divisor} \u0B87\u0BA9\u0BCD \u0BAA\u0BB2\u0BAE\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n            case \"unrecognized_keys\":\n                return `\u0B85\u0B9F\u0BC8\u0BAF\u0BBE\u0BB3\u0BAE\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BBE\u0BA4 \u0BB5\u0BBF\u0B9A\u0BC8${issue.keys.length > 1 ? \"\u0B95\u0BB3\u0BCD\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0B9A\u0BC8`;\n            case \"invalid_union\":\n                return \"\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1\";\n            case \"invalid_element\":\n                return `${issue.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1`;\n            default:\n                return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n        file: { unit: \"\u0E44\u0E1A\u0E15\u0E4C\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n        array: { unit: \"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n        set: { unit: \"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19\",\n        email: \"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E2D\u0E35\u0E40\u0E21\u0E25\",\n        url: \"URL\",\n        emoji: \"\u0E2D\u0E34\u0E42\u0E21\u0E08\u0E34\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO\",\n        date: \"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E41\u0E1A\u0E1A ISO\",\n        time: \"\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO\",\n        duration: \"\u0E0A\u0E48\u0E27\u0E07\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO\",\n        ipv4: \"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv4\",\n        ipv6: \"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv6\",\n        cidrv4: \"\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv4\",\n        cidrv6: \"\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv6\",\n        base64: \"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64\",\n        base64url: \"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64 \u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A URL\",\n        json_string: \"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A JSON\",\n        e164: \"\u0E40\u0E1A\u0E2D\u0E23\u0E4C\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E23\u0E30\u0E2B\u0E27\u0E48\u0E32\u0E07\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28 (E.164)\",\n        jwt: \"\u0E42\u0E17\u0E40\u0E04\u0E19 JWT\",\n        template_literal: \"\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02\",\n        array: \"\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E23\u0E22\u0E4C (Array)\",\n        null: \"\u0E44\u0E21\u0E48\u0E21\u0E35\u0E04\u0E48\u0E32 (null)\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 instanceof ${issue.expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${received}`;\n                }\n                return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u0E04\u0E48\u0E32\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19\u0E2B\u0E19\u0E36\u0E48\u0E07\u0E43\u0E19 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19\" : \"\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin ?? \"\u0E04\u0E48\u0E32\"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\"}`;\n                return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin ?? \"\u0E04\u0E48\u0E32\"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \"\u0E2D\u0E22\u0E48\u0E32\u0E07\u0E19\u0E49\u0E2D\u0E22\" : \"\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E02\u0E36\u0E49\u0E19\u0E15\u0E49\u0E19\u0E14\u0E49\u0E27\u0E22 \"${_issue.prefix}\"`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E25\u0E07\u0E17\u0E49\u0E32\u0E22\u0E14\u0E49\u0E27\u0E22 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E21\u0E35 \"${_issue.includes}\" \u0E2D\u0E22\u0E39\u0E48\u0E43\u0E19\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21`;\n                if (_issue.format === \"regex\")\n                    return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14 ${_issue.pattern}`;\n                return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E08\u0E33\u0E19\u0E27\u0E19\u0E17\u0E35\u0E48\u0E2B\u0E32\u0E23\u0E14\u0E49\u0E27\u0E22 ${issue.divisor} \u0E44\u0E14\u0E49\u0E25\u0E07\u0E15\u0E31\u0E27`;\n            case \"unrecognized_keys\":\n                return `\u0E1E\u0E1A\u0E04\u0E35\u0E22\u0E4C\u0E17\u0E35\u0E48\u0E44\u0E21\u0E48\u0E23\u0E39\u0E49\u0E08\u0E31\u0E01: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u0E04\u0E35\u0E22\u0E4C\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E44\u0E21\u0E48\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E22\u0E39\u0E40\u0E19\u0E35\u0E22\u0E19\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E44\u0E27\u0E49\";\n            case \"invalid_element\":\n                return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue.origin}`;\n            default:\n                return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"karakter\", verb: \"olmal\u0131\" },\n        file: { unit: \"bayt\", verb: \"olmal\u0131\" },\n        array: { unit: \"\u00F6\u011Fe\", verb: \"olmal\u0131\" },\n        set: { unit: \"\u00F6\u011Fe\", verb: \"olmal\u0131\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"girdi\",\n        email: \"e-posta adresi\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO tarih ve saat\",\n        date: \"ISO tarih\",\n        time: \"ISO saat\",\n        duration: \"ISO s\u00FCre\",\n        ipv4: \"IPv4 adresi\",\n        ipv6: \"IPv6 adresi\",\n        cidrv4: \"IPv4 aral\u0131\u011F\u0131\",\n        cidrv6: \"IPv6 aral\u0131\u011F\u0131\",\n        base64: \"base64 ile \u015Fifrelenmi\u015F metin\",\n        base64url: \"base64url ile \u015Fifrelenmi\u015F metin\",\n        json_string: \"JSON dizesi\",\n        e164: \"E.164 say\u0131s\u0131\",\n        jwt: \"JWT\",\n        template_literal: \"\u015Eablon dizesi\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Ge\u00E7ersiz de\u011Fer: beklenen instanceof ${issue.expected}, al\u0131nan ${received}`;\n                }\n                return `Ge\u00E7ersiz de\u011Fer: beklenen ${expected}, al\u0131nan ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Ge\u00E7ersiz de\u011Fer: beklenen ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Ge\u00E7ersiz se\u00E7enek: a\u015Fa\u011F\u0131dakilerden biri olmal\u0131: ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u00C7ok b\u00FCy\u00FCk: beklenen ${issue.origin ?? \"de\u011Fer\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u00F6\u011Fe\"}`;\n                return `\u00C7ok b\u00FCy\u00FCk: beklenen ${issue.origin ?? \"de\u011Fer\"} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u00C7ok k\u00FC\u00E7\u00FCk: beklenen ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                return `\u00C7ok k\u00FC\u00E7\u00FCk: beklenen ${issue.origin} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Ge\u00E7ersiz metin: \"${_issue.prefix}\" ile ba\u015Flamal\u0131`;\n                if (_issue.format === \"ends_with\")\n                    return `Ge\u00E7ersiz metin: \"${_issue.suffix}\" ile bitmeli`;\n                if (_issue.format === \"includes\")\n                    return `Ge\u00E7ersiz metin: \"${_issue.includes}\" i\u00E7ermeli`;\n                if (_issue.format === \"regex\")\n                    return `Ge\u00E7ersiz metin: ${_issue.pattern} desenine uymal\u0131`;\n                return `Ge\u00E7ersiz ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Ge\u00E7ersiz say\u0131: ${issue.divisor} ile tam b\u00F6l\u00FCnebilmeli`;\n            case \"unrecognized_keys\":\n                return `Tan\u0131nmayan anahtar${issue.keys.length > 1 ? \"lar\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} i\u00E7inde ge\u00E7ersiz anahtar`;\n            case \"invalid_union\":\n                return \"Ge\u00E7ersiz de\u011Fer\";\n            case \"invalid_element\":\n                return `${issue.origin} i\u00E7inde ge\u00E7ersiz de\u011Fer`;\n            default:\n                return `Ge\u00E7ersiz de\u011Fer`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n        file: { unit: \"\u0431\u0430\u0439\u0442\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n        array: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n        set: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456\",\n        email: \"\u0430\u0434\u0440\u0435\u0441\u0430 \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0457 \u043F\u043E\u0448\u0442\u0438\",\n        url: \"URL\",\n        emoji: \"\u0435\u043C\u043E\u0434\u0437\u0456\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u0434\u0430\u0442\u0430 \u0442\u0430 \u0447\u0430\u0441 ISO\",\n        date: \"\u0434\u0430\u0442\u0430 ISO\",\n        time: \"\u0447\u0430\u0441 ISO\",\n        duration: \"\u0442\u0440\u0438\u0432\u0430\u043B\u0456\u0441\u0442\u044C ISO\",\n        ipv4: \"\u0430\u0434\u0440\u0435\u0441\u0430 IPv4\",\n        ipv6: \"\u0430\u0434\u0440\u0435\u0441\u0430 IPv6\",\n        cidrv4: \"\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv4\",\n        cidrv6: \"\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv6\",\n        base64: \"\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64\",\n        base64url: \"\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64url\",\n        json_string: \"\u0440\u044F\u0434\u043E\u043A JSON\",\n        e164: \"\u043D\u043E\u043C\u0435\u0440 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0447\u0438\u0441\u043B\u043E\",\n        array: \"\u043C\u0430\u0441\u0438\u0432\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F instanceof ${issue.expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${received}`;\n                }\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430 \u043E\u043F\u0446\u0456\u044F: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F \u043E\u0434\u043D\u0435 \u0437 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432\"}`;\n                return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\"} \u0431\u0443\u0434\u0435 ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin} \u0431\u0443\u0434\u0435 ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043F\u043E\u0447\u0438\u043D\u0430\u0442\u0438\u0441\u044F \u0437 \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0437\u0430\u043A\u0456\u043D\u0447\u0443\u0432\u0430\u0442\u0438\u0441\u044F \u043D\u0430 \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043C\u0456\u0441\u0442\u0438\u0442\u0438 \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0442\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`;\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0447\u0438\u0441\u043B\u043E: \u043F\u043E\u0432\u0438\u043D\u043D\u043E \u0431\u0443\u0442\u0438 \u043A\u0440\u0430\u0442\u043D\u0438\u043C ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `\u041D\u0435\u0440\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u043D\u0438\u0439 \u043A\u043B\u044E\u0447${issue.keys.length > 1 ? \"\u0456\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0443 ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456\";\n            case \"invalid_element\":\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0443 ${issue.origin}`;\n            default:\n                return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import uk from \"./uk.js\";\n/** @deprecated Use `uk` instead. */\nexport default function () {\n    return uk();\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u062D\u0631\u0648\u0641\", verb: \"\u06C1\u0648\u0646\u0627\" },\n        file: { unit: \"\u0628\u0627\u0626\u0679\u0633\", verb: \"\u06C1\u0648\u0646\u0627\" },\n        array: { unit: \"\u0622\u0626\u0679\u0645\u0632\", verb: \"\u06C1\u0648\u0646\u0627\" },\n        set: { unit: \"\u0622\u0626\u0679\u0645\u0632\", verb: \"\u06C1\u0648\u0646\u0627\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0627\u0646 \u067E\u0679\",\n        email: \"\u0627\u06CC \u0645\u06CC\u0644 \u0627\u06CC\u0688\u0631\u06CC\u0633\",\n        url: \"\u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644\",\n        emoji: \"\u0627\u06CC\u0645\u0648\u062C\u06CC\",\n        uuid: \"\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n        uuidv4: \"\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 4\",\n        uuidv6: \"\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 6\",\n        nanoid: \"\u0646\u06CC\u0646\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n        guid: \"\u062C\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n        cuid: \"\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n        cuid2: \"\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC 2\",\n        ulid: \"\u06CC\u0648 \u0627\u06CC\u0644 \u0622\u0626\u06CC \u0688\u06CC\",\n        xid: \"\u0627\u06CC\u06A9\u0633 \u0622\u0626\u06CC \u0688\u06CC\",\n        ksuid: \"\u06A9\u06D2 \u0627\u06CC\u0633 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n        datetime: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0688\u06CC\u0679 \u0679\u0627\u0626\u0645\",\n        date: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u062A\u0627\u0631\u06CC\u062E\",\n        time: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0648\u0642\u062A\",\n        duration: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0645\u062F\u062A\",\n        ipv4: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0627\u06CC\u0688\u0631\u06CC\u0633\",\n        ipv6: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0627\u06CC\u0688\u0631\u06CC\u0633\",\n        cidrv4: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0631\u06CC\u0646\u062C\",\n        cidrv6: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0631\u06CC\u0646\u062C\",\n        base64: \"\u0628\u06CC\u0633 64 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF\",\n        base64url: \"\u0628\u06CC\u0633 64 \u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF\",\n        json_string: \"\u062C\u06D2 \u0627\u06CC\u0633 \u0627\u0648 \u0627\u06CC\u0646 \u0633\u0679\u0631\u0646\u06AF\",\n        e164: \"\u0627\u06CC 164 \u0646\u0645\u0628\u0631\",\n        jwt: \"\u062C\u06D2 \u0688\u0628\u0644\u06CC\u0648 \u0679\u06CC\",\n        template_literal: \"\u0627\u0646 \u067E\u0679\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u0646\u0645\u0628\u0631\",\n        array: \"\u0622\u0631\u06D2\",\n        null: \"\u0646\u0644\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: instanceof ${issue.expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${received} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`;\n                }\n                return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${received} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${util.stringifyPrimitive(issue.values[0])} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n                return `\u063A\u0644\u0637 \u0622\u067E\u0634\u0646: ${util.joinValues(issue.values, \"|\")} \u0645\u06CC\u06BA \u0633\u06D2 \u0627\u06CC\u06A9 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue.origin ?? \"\u0648\u06CC\u0644\u06CC\u0648\"} \u06A9\u06D2 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0627\u0635\u0631\"} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`;\n                return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue.origin ?? \"\u0648\u06CC\u0644\u06CC\u0648\"} \u06A9\u0627 ${adj}${issue.maximum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue.origin} \u06A9\u06D2 ${adj}${issue.minimum.toString()} ${sizing.unit} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`;\n                }\n                return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue.origin} \u06A9\u0627 ${adj}${issue.minimum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \"${_issue.prefix}\" \u0633\u06D2 \u0634\u0631\u0648\u0639 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \"${_issue.suffix}\" \u067E\u0631 \u062E\u062A\u0645 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n                if (_issue.format === \"includes\")\n                    return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \"${_issue.includes}\" \u0634\u0627\u0645\u0644 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n                if (_issue.format === \"regex\")\n                    return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \u067E\u06CC\u0679\u0631\u0646 ${_issue.pattern} \u0633\u06D2 \u0645\u06CC\u0686 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n                return `\u063A\u0644\u0637 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u063A\u0644\u0637 \u0646\u0645\u0628\u0631: ${issue.divisor} \u06A9\u0627 \u0645\u0636\u0627\u0639\u0641 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n            case \"unrecognized_keys\":\n                return `\u063A\u06CC\u0631 \u062A\u0633\u0644\u06CC\u0645 \u0634\u062F\u06C1 \u06A9\u06CC${issue.keys.length > 1 ? \"\u0632\" : \"\"}: ${util.joinValues(issue.keys, \"\u060C \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u06A9\u06CC`;\n            case \"invalid_union\":\n                return \"\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679\";\n            case \"invalid_element\":\n                return `${issue.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u0648\u06CC\u0644\u06CC\u0648`;\n            default:\n                return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"belgi\", verb: \"bo\u2018lishi kerak\" },\n        file: { unit: \"bayt\", verb: \"bo\u2018lishi kerak\" },\n        array: { unit: \"element\", verb: \"bo\u2018lishi kerak\" },\n        set: { unit: \"element\", verb: \"bo\u2018lishi kerak\" },\n        map: { unit: \"yozuv\", verb: \"bo\u2018lishi kerak\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"kirish\",\n        email: \"elektron pochta manzili\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO sana va vaqti\",\n        date: \"ISO sana\",\n        time: \"ISO vaqt\",\n        duration: \"ISO davomiylik\",\n        ipv4: \"IPv4 manzil\",\n        ipv6: \"IPv6 manzil\",\n        mac: \"MAC manzil\",\n        cidrv4: \"IPv4 diapazon\",\n        cidrv6: \"IPv6 diapazon\",\n        base64: \"base64 kodlangan satr\",\n        base64url: \"base64url kodlangan satr\",\n        json_string: \"JSON satr\",\n        e164: \"E.164 raqam\",\n        jwt: \"JWT\",\n        template_literal: \"kirish\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"raqam\",\n        array: \"massiv\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `Noto\u2018g\u2018ri kirish: kutilgan instanceof ${issue.expected}, qabul qilingan ${received}`;\n                }\n                return `Noto\u2018g\u2018ri kirish: kutilgan ${expected}, qabul qilingan ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `Noto\u2018g\u2018ri kirish: kutilgan ${util.stringifyPrimitive(issue.values[0])}`;\n                return `Noto\u2018g\u2018ri variant: quyidagilardan biri kutilgan ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Juda katta: kutilgan ${issue.origin ?? \"qiymat\"} ${adj}${issue.maximum.toString()} ${sizing.unit} ${sizing.verb}`;\n                return `Juda katta: kutilgan ${issue.origin ?? \"qiymat\"} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Juda kichik: kutilgan ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} ${sizing.verb}`;\n                }\n                return `Juda kichik: kutilgan ${issue.origin} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Noto\u2018g\u2018ri satr: \"${_issue.prefix}\" bilan boshlanishi kerak`;\n                if (_issue.format === \"ends_with\")\n                    return `Noto\u2018g\u2018ri satr: \"${_issue.suffix}\" bilan tugashi kerak`;\n                if (_issue.format === \"includes\")\n                    return `Noto\u2018g\u2018ri satr: \"${_issue.includes}\" ni o\u2018z ichiga olishi kerak`;\n                if (_issue.format === \"regex\")\n                    return `Noto\u2018g\u2018ri satr: ${_issue.pattern} shabloniga mos kelishi kerak`;\n                return `Noto\u2018g\u2018ri ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `Noto\u2018g\u2018ri raqam: ${issue.divisor} ning karralisi bo\u2018lishi kerak`;\n            case \"unrecognized_keys\":\n                return `Noma\u2019lum kalit${issue.keys.length > 1 ? \"lar\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} dagi kalit noto\u2018g\u2018ri`;\n            case \"invalid_union\":\n                return \"Noto\u2018g\u2018ri kirish\";\n            case \"invalid_element\":\n                return `${issue.origin} da noto\u2018g\u2018ri qiymat`;\n            default:\n                return `Noto\u2018g\u2018ri kirish`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"k\u00FD t\u1EF1\", verb: \"c\u00F3\" },\n        file: { unit: \"byte\", verb: \"c\u00F3\" },\n        array: { unit: \"ph\u1EA7n t\u1EED\", verb: \"c\u00F3\" },\n        set: { unit: \"ph\u1EA7n t\u1EED\", verb: \"c\u00F3\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u0111\u1EA7u v\u00E0o\",\n        email: \"\u0111\u1ECBa ch\u1EC9 email\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ng\u00E0y gi\u1EDD ISO\",\n        date: \"ng\u00E0y ISO\",\n        time: \"gi\u1EDD ISO\",\n        duration: \"kho\u1EA3ng th\u1EDDi gian ISO\",\n        ipv4: \"\u0111\u1ECBa ch\u1EC9 IPv4\",\n        ipv6: \"\u0111\u1ECBa ch\u1EC9 IPv6\",\n        cidrv4: \"d\u1EA3i IPv4\",\n        cidrv6: \"d\u1EA3i IPv6\",\n        base64: \"chu\u1ED7i m\u00E3 h\u00F3a base64\",\n        base64url: \"chu\u1ED7i m\u00E3 h\u00F3a base64url\",\n        json_string: \"chu\u1ED7i JSON\",\n        e164: \"s\u1ED1 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u0111\u1EA7u v\u00E0o\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"s\u1ED1\",\n        array: \"m\u1EA3ng\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i instanceof ${issue.expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${received}`;\n                }\n                return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${util.stringifyPrimitive(issue.values[0])}`;\n                return `T\u00F9y ch\u1ECDn kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i m\u1ED9t trong c\u00E1c gi\u00E1 tr\u1ECB ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `Qu\u00E1 l\u1EDBn: mong \u0111\u1EE3i ${issue.origin ?? \"gi\u00E1 tr\u1ECB\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"ph\u1EA7n t\u1EED\"}`;\n                return `Qu\u00E1 l\u1EDBn: mong \u0111\u1EE3i ${issue.origin ?? \"gi\u00E1 tr\u1ECB\"} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `Qu\u00E1 nh\u1ECF: mong \u0111\u1EE3i ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `Qu\u00E1 nh\u1ECF: mong \u0111\u1EE3i ${issue.origin} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i k\u1EBFt th\u00FAc b\u1EB1ng \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i bao g\u1ED3m \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i kh\u1EDBp v\u1EDBi m\u1EABu ${_issue.pattern}`;\n                return `${FormatDictionary[_issue.format] ?? issue.format} kh\u00F4ng h\u1EE3p l\u1EC7`;\n            }\n            case \"not_multiple_of\":\n                return `S\u1ED1 kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i l\u00E0 b\u1ED9i s\u1ED1 c\u1EE7a ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `Kh\u00F3a kh\u00F4ng \u0111\u01B0\u1EE3c nh\u1EADn d\u1EA1ng: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `Kh\u00F3a kh\u00F4ng h\u1EE3p l\u1EC7 trong ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7\";\n            case \"invalid_element\":\n                return `Gi\u00E1 tr\u1ECB kh\u00F4ng h\u1EE3p l\u1EC7 trong ${issue.origin}`;\n            default:\n                return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u5B57\u7B26\", verb: \"\u5305\u542B\" },\n        file: { unit: \"\u5B57\u8282\", verb: \"\u5305\u542B\" },\n        array: { unit: \"\u9879\", verb: \"\u5305\u542B\" },\n        set: { unit: \"\u9879\", verb: \"\u5305\u542B\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u8F93\u5165\",\n        email: \"\u7535\u5B50\u90AE\u4EF6\",\n        url: \"URL\",\n        emoji: \"\u8868\u60C5\u7B26\u53F7\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO\u65E5\u671F\u65F6\u95F4\",\n        date: \"ISO\u65E5\u671F\",\n        time: \"ISO\u65F6\u95F4\",\n        duration: \"ISO\u65F6\u957F\",\n        ipv4: \"IPv4\u5730\u5740\",\n        ipv6: \"IPv6\u5730\u5740\",\n        cidrv4: \"IPv4\u7F51\u6BB5\",\n        cidrv6: \"IPv6\u7F51\u6BB5\",\n        base64: \"base64\u7F16\u7801\u5B57\u7B26\u4E32\",\n        base64url: \"base64url\u7F16\u7801\u5B57\u7B26\u4E32\",\n        json_string: \"JSON\u5B57\u7B26\u4E32\",\n        e164: \"E.164\u53F7\u7801\",\n        jwt: \"JWT\",\n        template_literal: \"\u8F93\u5165\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"\u6570\u5B57\",\n        array: \"\u6570\u7EC4\",\n        null: \"\u7A7A\u503C(null)\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B instanceof ${issue.expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${received}`;\n                }\n                return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u65E0\u6548\u9009\u9879\uFF1A\u671F\u671B\u4EE5\u4E0B\u4E4B\u4E00 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue.origin ?? \"\u503C\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u4E2A\u5143\u7D20\"}`;\n                return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue.origin ?? \"\u503C\"} ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue.origin} ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 \"${_issue.prefix}\" \u5F00\u5934`;\n                if (_issue.format === \"ends_with\")\n                    return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 \"${_issue.suffix}\" \u7ED3\u5C3E`;\n                if (_issue.format === \"includes\")\n                    return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u5305\u542B \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u6EE1\u8DB3\u6B63\u5219\u8868\u8FBE\u5F0F ${_issue.pattern}`;\n                return `\u65E0\u6548${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u65E0\u6548\u6570\u5B57\uFF1A\u5FC5\u987B\u662F ${issue.divisor} \u7684\u500D\u6570`;\n            case \"unrecognized_keys\":\n                return `\u51FA\u73B0\u672A\u77E5\u7684\u952E(key): ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `${issue.origin} \u4E2D\u7684\u952E(key)\u65E0\u6548`;\n            case \"invalid_union\":\n                return \"\u65E0\u6548\u8F93\u5165\";\n            case \"invalid_element\":\n                return `${issue.origin} \u4E2D\u5305\u542B\u65E0\u6548\u503C(value)`;\n            default:\n                return `\u65E0\u6548\u8F93\u5165`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u5B57\u5143\", verb: \"\u64C1\u6709\" },\n        file: { unit: \"\u4F4D\u5143\u7D44\", verb: \"\u64C1\u6709\" },\n        array: { unit: \"\u9805\u76EE\", verb: \"\u64C1\u6709\" },\n        set: { unit: \"\u9805\u76EE\", verb: \"\u64C1\u6709\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u8F38\u5165\",\n        email: \"\u90F5\u4EF6\u5730\u5740\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"ISO \u65E5\u671F\u6642\u9593\",\n        date: \"ISO \u65E5\u671F\",\n        time: \"ISO \u6642\u9593\",\n        duration: \"ISO \u671F\u9593\",\n        ipv4: \"IPv4 \u4F4D\u5740\",\n        ipv6: \"IPv6 \u4F4D\u5740\",\n        cidrv4: \"IPv4 \u7BC4\u570D\",\n        cidrv6: \"IPv6 \u7BC4\u570D\",\n        base64: \"base64 \u7DE8\u78BC\u5B57\u4E32\",\n        base64url: \"base64url \u7DE8\u78BC\u5B57\u4E32\",\n        json_string: \"JSON \u5B57\u4E32\",\n        e164: \"E.164 \u6578\u503C\",\n        jwt: \"JWT\",\n        template_literal: \"\u8F38\u5165\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA instanceof ${issue.expected}\uFF0C\u4F46\u6536\u5230 ${received}`;\n                }\n                return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${expected}\uFF0C\u4F46\u6536\u5230 ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u7121\u6548\u7684\u9078\u9805\uFF1A\u9810\u671F\u70BA\u4EE5\u4E0B\u5176\u4E2D\u4E4B\u4E00 ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue.origin ?? \"\u503C\"} \u61C9\u70BA ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u500B\u5143\u7D20\"}`;\n                return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue.origin ?? \"\u503C\"} \u61C9\u70BA ${adj}${issue.maximum.toString()}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing) {\n                    return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue.origin} \u61C9\u70BA ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n                }\n                return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue.origin} \u61C9\u70BA ${adj}${issue.minimum.toString()}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\") {\n                    return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 \"${_issue.prefix}\" \u958B\u982D`;\n                }\n                if (_issue.format === \"ends_with\")\n                    return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 \"${_issue.suffix}\" \u7D50\u5C3E`;\n                if (_issue.format === \"includes\")\n                    return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u5305\u542B \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u7B26\u5408\u683C\u5F0F ${_issue.pattern}`;\n                return `\u7121\u6548\u7684 ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `\u7121\u6548\u7684\u6578\u5B57\uFF1A\u5FC5\u9808\u70BA ${issue.divisor} \u7684\u500D\u6578`;\n            case \"unrecognized_keys\":\n                return `\u7121\u6CD5\u8B58\u5225\u7684\u9375\u503C${issue.keys.length > 1 ? \"\u5011\" : \"\"}\uFF1A${util.joinValues(issue.keys, \"\u3001\")}`;\n            case \"invalid_key\":\n                return `${issue.origin} \u4E2D\u6709\u7121\u6548\u7684\u9375\u503C`;\n            case \"invalid_union\":\n                return \"\u7121\u6548\u7684\u8F38\u5165\u503C\";\n            case \"invalid_element\":\n                return `${issue.origin} \u4E2D\u6709\u7121\u6548\u7684\u503C`;\n            default:\n                return `\u7121\u6548\u7684\u8F38\u5165\u503C`;\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n    const Sizable = {\n        string: { unit: \"\u00E0mi\", verb: \"n\u00ED\" },\n        file: { unit: \"bytes\", verb: \"n\u00ED\" },\n        array: { unit: \"nkan\", verb: \"n\u00ED\" },\n        set: { unit: \"nkan\", verb: \"n\u00ED\" },\n    };\n    function getSizing(origin) {\n        return Sizable[origin] ?? null;\n    }\n    const FormatDictionary = {\n        regex: \"\u1EB9\u0300r\u1ECD \u00ECb\u00E1w\u1ECDl\u00E9\",\n        email: \"\u00E0d\u00EDr\u1EB9\u0301s\u00EC \u00ECm\u1EB9\u0301l\u00EC\",\n        url: \"URL\",\n        emoji: \"emoji\",\n        uuid: \"UUID\",\n        uuidv4: \"UUIDv4\",\n        uuidv6: \"UUIDv6\",\n        nanoid: \"nanoid\",\n        guid: \"GUID\",\n        cuid: \"cuid\",\n        cuid2: \"cuid2\",\n        ulid: \"ULID\",\n        xid: \"XID\",\n        ksuid: \"KSUID\",\n        datetime: \"\u00E0k\u00F3k\u00F2 ISO\",\n        date: \"\u1ECDj\u1ECD\u0301 ISO\",\n        time: \"\u00E0k\u00F3k\u00F2 ISO\",\n        duration: \"\u00E0k\u00F3k\u00F2 t\u00F3 p\u00E9 ISO\",\n        ipv4: \"\u00E0d\u00EDr\u1EB9\u0301s\u00EC IPv4\",\n        ipv6: \"\u00E0d\u00EDr\u1EB9\u0301s\u00EC IPv6\",\n        cidrv4: \"\u00E0gb\u00E8gb\u00E8 IPv4\",\n        cidrv6: \"\u00E0gb\u00E8gb\u00E8 IPv6\",\n        base64: \"\u1ECD\u0300r\u1ECD\u0300 t\u00ED a k\u1ECD\u0301 n\u00ED base64\",\n        base64url: \"\u1ECD\u0300r\u1ECD\u0300 base64url\",\n        json_string: \"\u1ECD\u0300r\u1ECD\u0300 JSON\",\n        e164: \"n\u1ECD\u0301mb\u00E0 E.164\",\n        jwt: \"JWT\",\n        template_literal: \"\u1EB9\u0300r\u1ECD \u00ECb\u00E1w\u1ECDl\u00E9\",\n    };\n    const TypeDictionary = {\n        nan: \"NaN\",\n        number: \"n\u1ECD\u0301mb\u00E0\",\n        array: \"akop\u1ECD\",\n    };\n    return (issue) => {\n        switch (issue.code) {\n            case \"invalid_type\": {\n                const expected = TypeDictionary[issue.expected] ?? issue.expected;\n                const receivedType = util.parsedType(issue.input);\n                const received = TypeDictionary[receivedType] ?? receivedType;\n                if (/^[A-Z]/.test(issue.expected)) {\n                    return `\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e: a n\u00ED l\u00E1ti fi instanceof ${issue.expected}, \u00E0m\u1ECD\u0300 a r\u00ED ${received}`;\n                }\n                return `\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e: a n\u00ED l\u00E1ti fi ${expected}, \u00E0m\u1ECD\u0300 a r\u00ED ${received}`;\n            }\n            case \"invalid_value\":\n                if (issue.values.length === 1)\n                    return `\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e: a n\u00ED l\u00E1ti fi ${util.stringifyPrimitive(issue.values[0])}`;\n                return `\u00C0\u1E63\u00E0y\u00E0n a\u1E63\u00EC\u1E63e: yan \u1ECD\u0300kan l\u00E1ra ${util.joinValues(issue.values, \"|\")}`;\n            case \"too_big\": {\n                const adj = issue.inclusive ? \"<=\" : \"<\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `T\u00F3 p\u1ECD\u0300 j\u00F9: a n\u00ED l\u00E1ti j\u1EB9\u0301 p\u00E9 ${issue.origin ?? \"iye\"} ${sizing.verb} ${adj}${issue.maximum} ${sizing.unit}`;\n                return `T\u00F3 p\u1ECD\u0300 j\u00F9: a n\u00ED l\u00E1ti j\u1EB9\u0301 ${adj}${issue.maximum}`;\n            }\n            case \"too_small\": {\n                const adj = issue.inclusive ? \">=\" : \">\";\n                const sizing = getSizing(issue.origin);\n                if (sizing)\n                    return `K\u00E9r\u00E9 ju: a n\u00ED l\u00E1ti j\u1EB9\u0301 p\u00E9 ${issue.origin} ${sizing.verb} ${adj}${issue.minimum} ${sizing.unit}`;\n                return `K\u00E9r\u00E9 ju: a n\u00ED l\u00E1ti j\u1EB9\u0301 ${adj}${issue.minimum}`;\n            }\n            case \"invalid_format\": {\n                const _issue = issue;\n                if (_issue.format === \"starts_with\")\n                    return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 b\u1EB9\u0300r\u1EB9\u0300 p\u1EB9\u0300l\u00FA \"${_issue.prefix}\"`;\n                if (_issue.format === \"ends_with\")\n                    return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 par\u00ED p\u1EB9\u0300l\u00FA \"${_issue.suffix}\"`;\n                if (_issue.format === \"includes\")\n                    return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 n\u00ED \"${_issue.includes}\"`;\n                if (_issue.format === \"regex\")\n                    return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 b\u00E1 \u00E0p\u1EB9\u1EB9r\u1EB9 mu ${_issue.pattern}`;\n                return `A\u1E63\u00EC\u1E63e: ${FormatDictionary[_issue.format] ?? issue.format}`;\n            }\n            case \"not_multiple_of\":\n                return `N\u1ECD\u0301mb\u00E0 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 j\u1EB9\u0301 \u00E8y\u00E0 p\u00EDp\u00EDn ti ${issue.divisor}`;\n            case \"unrecognized_keys\":\n                return `B\u1ECDt\u00ECn\u00EC \u00E0\u00ECm\u1ECD\u0300: ${util.joinValues(issue.keys, \", \")}`;\n            case \"invalid_key\":\n                return `B\u1ECDt\u00ECn\u00EC a\u1E63\u00EC\u1E63e n\u00EDn\u00FA ${issue.origin}`;\n            case \"invalid_union\":\n                return \"\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e\";\n            case \"invalid_element\":\n                return `Iye a\u1E63\u00EC\u1E63e n\u00EDn\u00FA ${issue.origin}`;\n            default:\n                return \"\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e\";\n        }\n    };\n};\nexport default function () {\n    return {\n        localeError: error(),\n    };\n}\n", "var _a;\nexport const $output = Symbol(\"ZodOutput\");\nexport const $input = Symbol(\"ZodInput\");\nexport class $ZodRegistry {\n    constructor() {\n        this._map = new WeakMap();\n        this._idmap = new Map();\n    }\n    add(schema, ..._meta) {\n        const meta = _meta[0];\n        this._map.set(schema, meta);\n        if (meta && typeof meta === \"object\" && \"id\" in meta) {\n            this._idmap.set(meta.id, schema);\n        }\n        return this;\n    }\n    clear() {\n        this._map = new WeakMap();\n        this._idmap = new Map();\n        return this;\n    }\n    remove(schema) {\n        const meta = this._map.get(schema);\n        if (meta && typeof meta === \"object\" && \"id\" in meta) {\n            this._idmap.delete(meta.id);\n        }\n        this._map.delete(schema);\n        return this;\n    }\n    get(schema) {\n        // return this._map.get(schema) as any;\n        // inherit metadata\n        const p = schema._zod.parent;\n        if (p) {\n            const pm = { ...(this.get(p) ?? {}) };\n            delete pm.id; // do not inherit id\n            const f = { ...pm, ...this._map.get(schema) };\n            return Object.keys(f).length ? f : undefined;\n        }\n        return this._map.get(schema);\n    }\n    has(schema) {\n        return this._map.has(schema);\n    }\n}\n// registries\nexport function registry() {\n    return new $ZodRegistry();\n}\n(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());\nexport const globalRegistry = globalThis.__zod_globalRegistry;\n", "import * as checks from \"./checks.js\";\nimport * as registries from \"./registries.js\";\nimport * as schemas from \"./schemas.js\";\nimport * as util from \"./util.js\";\n// @__NO_SIDE_EFFECTS__\nexport function _string(Class, params) {\n    return new Class({\n        type: \"string\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedString(Class, params) {\n    return new Class({\n        type: \"string\",\n        coerce: true,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _email(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"email\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _guid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"guid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"uuid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv4(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"uuid\",\n        check: \"string_format\",\n        abort: false,\n        version: \"v4\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv6(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"uuid\",\n        check: \"string_format\",\n        abort: false,\n        version: \"v6\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv7(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"uuid\",\n        check: \"string_format\",\n        abort: false,\n        version: \"v7\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _url(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"url\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _emoji(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"emoji\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nanoid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"nanoid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link _cuid2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\n// @__NO_SIDE_EFFECTS__\nexport function _cuid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"cuid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid2(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"cuid2\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ulid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"ulid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _xid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"xid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ksuid(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"ksuid\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv4(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"ipv4\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv6(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"ipv6\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mac(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"mac\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv4(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"cidrv4\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv6(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"cidrv6\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"base64\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64url(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"base64url\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _e164(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"e164\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _jwt(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"jwt\",\n        check: \"string_format\",\n        abort: false,\n        ...util.normalizeParams(params),\n    });\n}\nexport const TimePrecision = {\n    Any: null,\n    Minute: -1,\n    Second: 0,\n    Millisecond: 3,\n    Microsecond: 6,\n};\n// @__NO_SIDE_EFFECTS__\nexport function _isoDateTime(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"datetime\",\n        check: \"string_format\",\n        offset: false,\n        local: false,\n        precision: null,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDate(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"date\",\n        check: \"string_format\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoTime(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"time\",\n        check: \"string_format\",\n        precision: null,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDuration(Class, params) {\n    return new Class({\n        type: \"string\",\n        format: \"duration\",\n        check: \"string_format\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _number(Class, params) {\n    return new Class({\n        type: \"number\",\n        checks: [],\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedNumber(Class, params) {\n    return new Class({\n        type: \"number\",\n        coerce: true,\n        checks: [],\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int(Class, params) {\n    return new Class({\n        type: \"number\",\n        check: \"number_format\",\n        abort: false,\n        format: \"safeint\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float32(Class, params) {\n    return new Class({\n        type: \"number\",\n        check: \"number_format\",\n        abort: false,\n        format: \"float32\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float64(Class, params) {\n    return new Class({\n        type: \"number\",\n        check: \"number_format\",\n        abort: false,\n        format: \"float64\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int32(Class, params) {\n    return new Class({\n        type: \"number\",\n        check: \"number_format\",\n        abort: false,\n        format: \"int32\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint32(Class, params) {\n    return new Class({\n        type: \"number\",\n        check: \"number_format\",\n        abort: false,\n        format: \"uint32\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _boolean(Class, params) {\n    return new Class({\n        type: \"boolean\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBoolean(Class, params) {\n    return new Class({\n        type: \"boolean\",\n        coerce: true,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _bigint(Class, params) {\n    return new Class({\n        type: \"bigint\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBigint(Class, params) {\n    return new Class({\n        type: \"bigint\",\n        coerce: true,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int64(Class, params) {\n    return new Class({\n        type: \"bigint\",\n        check: \"bigint_format\",\n        abort: false,\n        format: \"int64\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint64(Class, params) {\n    return new Class({\n        type: \"bigint\",\n        check: \"bigint_format\",\n        abort: false,\n        format: \"uint64\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _symbol(Class, params) {\n    return new Class({\n        type: \"symbol\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _undefined(Class, params) {\n    return new Class({\n        type: \"undefined\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _null(Class, params) {\n    return new Class({\n        type: \"null\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _any(Class) {\n    return new Class({\n        type: \"any\",\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _unknown(Class) {\n    return new Class({\n        type: \"unknown\",\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _never(Class, params) {\n    return new Class({\n        type: \"never\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _void(Class, params) {\n    return new Class({\n        type: \"void\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _date(Class, params) {\n    return new Class({\n        type: \"date\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedDate(Class, params) {\n    return new Class({\n        type: \"date\",\n        coerce: true,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nan(Class, params) {\n    return new Class({\n        type: \"nan\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lt(value, params) {\n    return new checks.$ZodCheckLessThan({\n        check: \"less_than\",\n        ...util.normalizeParams(params),\n        value,\n        inclusive: false,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lte(value, params) {\n    return new checks.$ZodCheckLessThan({\n        check: \"less_than\",\n        ...util.normalizeParams(params),\n        value,\n        inclusive: true,\n    });\n}\nexport { \n/** @deprecated Use `z.lte()` instead. */\n_lte as _max, };\n// @__NO_SIDE_EFFECTS__\nexport function _gt(value, params) {\n    return new checks.$ZodCheckGreaterThan({\n        check: \"greater_than\",\n        ...util.normalizeParams(params),\n        value,\n        inclusive: false,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _gte(value, params) {\n    return new checks.$ZodCheckGreaterThan({\n        check: \"greater_than\",\n        ...util.normalizeParams(params),\n        value,\n        inclusive: true,\n    });\n}\nexport { \n/** @deprecated Use `z.gte()` instead. */\n_gte as _min, };\n// @__NO_SIDE_EFFECTS__\nexport function _positive(params) {\n    return _gt(0, params);\n}\n// negative\n// @__NO_SIDE_EFFECTS__\nexport function _negative(params) {\n    return _lt(0, params);\n}\n// nonpositive\n// @__NO_SIDE_EFFECTS__\nexport function _nonpositive(params) {\n    return _lte(0, params);\n}\n// nonnegative\n// @__NO_SIDE_EFFECTS__\nexport function _nonnegative(params) {\n    return _gte(0, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function _multipleOf(value, params) {\n    return new checks.$ZodCheckMultipleOf({\n        check: \"multiple_of\",\n        ...util.normalizeParams(params),\n        value,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxSize(maximum, params) {\n    return new checks.$ZodCheckMaxSize({\n        check: \"max_size\",\n        ...util.normalizeParams(params),\n        maximum,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minSize(minimum, params) {\n    return new checks.$ZodCheckMinSize({\n        check: \"min_size\",\n        ...util.normalizeParams(params),\n        minimum,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _size(size, params) {\n    return new checks.$ZodCheckSizeEquals({\n        check: \"size_equals\",\n        ...util.normalizeParams(params),\n        size,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxLength(maximum, params) {\n    const ch = new checks.$ZodCheckMaxLength({\n        check: \"max_length\",\n        ...util.normalizeParams(params),\n        maximum,\n    });\n    return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minLength(minimum, params) {\n    return new checks.$ZodCheckMinLength({\n        check: \"min_length\",\n        ...util.normalizeParams(params),\n        minimum,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _length(length, params) {\n    return new checks.$ZodCheckLengthEquals({\n        check: \"length_equals\",\n        ...util.normalizeParams(params),\n        length,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _regex(pattern, params) {\n    return new checks.$ZodCheckRegex({\n        check: \"string_format\",\n        format: \"regex\",\n        ...util.normalizeParams(params),\n        pattern,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lowercase(params) {\n    return new checks.$ZodCheckLowerCase({\n        check: \"string_format\",\n        format: \"lowercase\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uppercase(params) {\n    return new checks.$ZodCheckUpperCase({\n        check: \"string_format\",\n        format: \"uppercase\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _includes(includes, params) {\n    return new checks.$ZodCheckIncludes({\n        check: \"string_format\",\n        format: \"includes\",\n        ...util.normalizeParams(params),\n        includes,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _startsWith(prefix, params) {\n    return new checks.$ZodCheckStartsWith({\n        check: \"string_format\",\n        format: \"starts_with\",\n        ...util.normalizeParams(params),\n        prefix,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _endsWith(suffix, params) {\n    return new checks.$ZodCheckEndsWith({\n        check: \"string_format\",\n        format: \"ends_with\",\n        ...util.normalizeParams(params),\n        suffix,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _property(property, schema, params) {\n    return new checks.$ZodCheckProperty({\n        check: \"property\",\n        property,\n        schema,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mime(types, params) {\n    return new checks.$ZodCheckMimeType({\n        check: \"mime_type\",\n        mime: types,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _overwrite(tx) {\n    return new checks.$ZodCheckOverwrite({\n        check: \"overwrite\",\n        tx,\n    });\n}\n// normalize\n// @__NO_SIDE_EFFECTS__\nexport function _normalize(form) {\n    return _overwrite((input) => input.normalize(form));\n}\n// trim\n// @__NO_SIDE_EFFECTS__\nexport function _trim() {\n    return _overwrite((input) => input.trim());\n}\n// toLowerCase\n// @__NO_SIDE_EFFECTS__\nexport function _toLowerCase() {\n    return _overwrite((input) => input.toLowerCase());\n}\n// toUpperCase\n// @__NO_SIDE_EFFECTS__\nexport function _toUpperCase() {\n    return _overwrite((input) => input.toUpperCase());\n}\n// slugify\n// @__NO_SIDE_EFFECTS__\nexport function _slugify() {\n    return _overwrite((input) => util.slugify(input));\n}\n// @__NO_SIDE_EFFECTS__\nexport function _array(Class, element, params) {\n    return new Class({\n        type: \"array\",\n        element,\n        // get element() {\n        //   return element;\n        // },\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _union(Class, options, params) {\n    return new Class({\n        type: \"union\",\n        options,\n        ...util.normalizeParams(params),\n    });\n}\nexport function _xor(Class, options, params) {\n    return new Class({\n        type: \"union\",\n        options,\n        inclusive: false,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _discriminatedUnion(Class, discriminator, options, params) {\n    return new Class({\n        type: \"union\",\n        options,\n        discriminator,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _intersection(Class, left, right) {\n    return new Class({\n        type: \"intersection\",\n        left,\n        right,\n    });\n}\n// export function _tuple(\n//   Class: util.SchemaClass<schemas.$ZodTuple>,\n//   items: [],\n//   params?: string | $ZodTupleParams\n// ): schemas.$ZodTuple<[], null>;\n// @__NO_SIDE_EFFECTS__\nexport function _tuple(Class, items, _paramsOrRest, _params) {\n    const hasRest = _paramsOrRest instanceof schemas.$ZodType;\n    const params = hasRest ? _params : _paramsOrRest;\n    const rest = hasRest ? _paramsOrRest : null;\n    return new Class({\n        type: \"tuple\",\n        items,\n        rest,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _record(Class, keyType, valueType, params) {\n    return new Class({\n        type: \"record\",\n        keyType,\n        valueType,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _map(Class, keyType, valueType, params) {\n    return new Class({\n        type: \"map\",\n        keyType,\n        valueType,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _set(Class, valueType, params) {\n    return new Class({\n        type: \"set\",\n        valueType,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _enum(Class, values, params) {\n    const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n    // if (Array.isArray(values)) {\n    //   for (const value of values) {\n    //     entries[value] = value;\n    //   }\n    // } else {\n    //   Object.assign(entries, values);\n    // }\n    // const entries: util.EnumLike = {};\n    // for (const val of values) {\n    //   entries[val] = val;\n    // }\n    return new Class({\n        type: \"enum\",\n        entries,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function _nativeEnum(Class, entries, params) {\n    return new Class({\n        type: \"enum\",\n        entries,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _literal(Class, value, params) {\n    return new Class({\n        type: \"literal\",\n        values: Array.isArray(value) ? value : [value],\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _file(Class, params) {\n    return new Class({\n        type: \"file\",\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _transform(Class, fn) {\n    return new Class({\n        type: \"transform\",\n        transform: fn,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _optional(Class, innerType) {\n    return new Class({\n        type: \"optional\",\n        innerType,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nullable(Class, innerType) {\n    return new Class({\n        type: \"nullable\",\n        innerType,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _default(Class, innerType, defaultValue) {\n    return new Class({\n        type: \"default\",\n        innerType,\n        get defaultValue() {\n            return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n        },\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nonoptional(Class, innerType, params) {\n    return new Class({\n        type: \"nonoptional\",\n        innerType,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _success(Class, innerType) {\n    return new Class({\n        type: \"success\",\n        innerType,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _catch(Class, innerType, catchValue) {\n    return new Class({\n        type: \"catch\",\n        innerType,\n        catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _pipe(Class, in_, out) {\n    return new Class({\n        type: \"pipe\",\n        in: in_,\n        out,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _readonly(Class, innerType) {\n    return new Class({\n        type: \"readonly\",\n        innerType,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _templateLiteral(Class, parts, params) {\n    return new Class({\n        type: \"template_literal\",\n        parts,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lazy(Class, getter) {\n    return new Class({\n        type: \"lazy\",\n        getter,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _promise(Class, innerType) {\n    return new Class({\n        type: \"promise\",\n        innerType,\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _custom(Class, fn, _params) {\n    const norm = util.normalizeParams(_params);\n    norm.abort ?? (norm.abort = true); // default to abort:false\n    const schema = new Class({\n        type: \"custom\",\n        check: \"custom\",\n        fn: fn,\n        ...norm,\n    });\n    return schema;\n}\n// same as _custom but defaults to abort:false\n// @__NO_SIDE_EFFECTS__\nexport function _refine(Class, fn, _params) {\n    const schema = new Class({\n        type: \"custom\",\n        check: \"custom\",\n        fn: fn,\n        ...util.normalizeParams(_params),\n    });\n    return schema;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _superRefine(fn, params) {\n    const ch = _check((payload) => {\n        payload.addIssue = (issue) => {\n            if (typeof issue === \"string\") {\n                payload.issues.push(util.issue(issue, payload.value, ch._zod.def));\n            }\n            else {\n                // for Zod 3 backwards compatibility\n                const _issue = issue;\n                if (_issue.fatal)\n                    _issue.continue = false;\n                _issue.code ?? (_issue.code = \"custom\");\n                _issue.input ?? (_issue.input = payload.value);\n                _issue.inst ?? (_issue.inst = ch);\n                _issue.continue ?? (_issue.continue = !ch._zod.def.abort); // abort is always undefined, so this is always true...\n                payload.issues.push(util.issue(_issue));\n            }\n        };\n        return fn(payload.value, payload);\n    }, params);\n    return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _check(fn, params) {\n    const ch = new checks.$ZodCheck({\n        check: \"custom\",\n        ...util.normalizeParams(params),\n    });\n    ch._zod.check = fn;\n    return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function describe(description) {\n    const ch = new checks.$ZodCheck({ check: \"describe\" });\n    ch._zod.onattach = [\n        (inst) => {\n            const existing = registries.globalRegistry.get(inst) ?? {};\n            registries.globalRegistry.add(inst, { ...existing, description });\n        },\n    ];\n    ch._zod.check = () => { }; // no-op check\n    return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function meta(metadata) {\n    const ch = new checks.$ZodCheck({ check: \"meta\" });\n    ch._zod.onattach = [\n        (inst) => {\n            const existing = registries.globalRegistry.get(inst) ?? {};\n            registries.globalRegistry.add(inst, { ...existing, ...metadata });\n        },\n    ];\n    ch._zod.check = () => { }; // no-op check\n    return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringbool(Classes, _params) {\n    const params = util.normalizeParams(_params);\n    let truthyArray = params.truthy ?? [\"true\", \"1\", \"yes\", \"on\", \"y\", \"enabled\"];\n    let falsyArray = params.falsy ?? [\"false\", \"0\", \"no\", \"off\", \"n\", \"disabled\"];\n    if (params.case !== \"sensitive\") {\n        truthyArray = truthyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n        falsyArray = falsyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n    }\n    const truthySet = new Set(truthyArray);\n    const falsySet = new Set(falsyArray);\n    const _Codec = Classes.Codec ?? schemas.$ZodCodec;\n    const _Boolean = Classes.Boolean ?? schemas.$ZodBoolean;\n    const _String = Classes.String ?? schemas.$ZodString;\n    const stringSchema = new _String({ type: \"string\", error: params.error });\n    const booleanSchema = new _Boolean({ type: \"boolean\", error: params.error });\n    const codec = new _Codec({\n        type: \"pipe\",\n        in: stringSchema,\n        out: booleanSchema,\n        transform: ((input, payload) => {\n            let data = input;\n            if (params.case !== \"sensitive\")\n                data = data.toLowerCase();\n            if (truthySet.has(data)) {\n                return true;\n            }\n            else if (falsySet.has(data)) {\n                return false;\n            }\n            else {\n                payload.issues.push({\n                    code: \"invalid_value\",\n                    expected: \"stringbool\",\n                    values: [...truthySet, ...falsySet],\n                    input: payload.value,\n                    inst: codec,\n                    continue: false,\n                });\n                return {};\n            }\n        }),\n        reverseTransform: ((input, _payload) => {\n            if (input === true) {\n                return truthyArray[0] || \"true\";\n            }\n            else {\n                return falsyArray[0] || \"false\";\n            }\n        }),\n        error: params.error,\n    });\n    return codec;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringFormat(Class, format, fnOrRegex, _params = {}) {\n    const params = util.normalizeParams(_params);\n    const def = {\n        ...util.normalizeParams(_params),\n        check: \"string_format\",\n        type: \"string\",\n        format,\n        fn: typeof fnOrRegex === \"function\" ? fnOrRegex : (val) => fnOrRegex.test(val),\n        ...params,\n    };\n    if (fnOrRegex instanceof RegExp) {\n        def.pattern = fnOrRegex;\n    }\n    const inst = new Class(def);\n    return inst;\n}\n", "import { globalRegistry } from \"./registries.js\";\n// function initializeContext<T extends schemas.$ZodType>(inputs: JSONSchemaGeneratorParams<T>): ToJSONSchemaContext<T> {\n//   return {\n//     processor: inputs.processor,\n//     metadataRegistry: inputs.metadata ?? globalRegistry,\n//     target: inputs.target ?? \"draft-2020-12\",\n//     unrepresentable: inputs.unrepresentable ?? \"throw\",\n//   };\n// }\nexport function initializeContext(params) {\n    // Normalize target: convert old non-hyphenated versions to hyphenated versions\n    let target = params?.target ?? \"draft-2020-12\";\n    if (target === \"draft-4\")\n        target = \"draft-04\";\n    if (target === \"draft-7\")\n        target = \"draft-07\";\n    return {\n        processors: params.processors ?? {},\n        metadataRegistry: params?.metadata ?? globalRegistry,\n        target,\n        unrepresentable: params?.unrepresentable ?? \"throw\",\n        override: params?.override ?? (() => { }),\n        io: params?.io ?? \"output\",\n        counter: 0,\n        seen: new Map(),\n        cycles: params?.cycles ?? \"ref\",\n        reused: params?.reused ?? \"inline\",\n        external: params?.external ?? undefined,\n    };\n}\nexport function process(schema, ctx, _params = { path: [], schemaPath: [] }) {\n    var _a;\n    const def = schema._zod.def;\n    // check for schema in seens\n    const seen = ctx.seen.get(schema);\n    if (seen) {\n        seen.count++;\n        // check if cycle\n        const isCycle = _params.schemaPath.includes(schema);\n        if (isCycle) {\n            seen.cycle = _params.path;\n        }\n        return seen.schema;\n    }\n    // initialize\n    const result = { schema: {}, count: 1, cycle: undefined, path: _params.path };\n    ctx.seen.set(schema, result);\n    // custom method overrides default behavior\n    const overrideSchema = schema._zod.toJSONSchema?.();\n    if (overrideSchema) {\n        result.schema = overrideSchema;\n    }\n    else {\n        const params = {\n            ..._params,\n            schemaPath: [..._params.schemaPath, schema],\n            path: _params.path,\n        };\n        if (schema._zod.processJSONSchema) {\n            schema._zod.processJSONSchema(ctx, result.schema, params);\n        }\n        else {\n            const _json = result.schema;\n            const processor = ctx.processors[def.type];\n            if (!processor) {\n                throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`);\n            }\n            processor(schema, ctx, _json, params);\n        }\n        const parent = schema._zod.parent;\n        if (parent) {\n            // Also set ref if processor didn't (for inheritance)\n            if (!result.ref)\n                result.ref = parent;\n            process(parent, ctx, params);\n            ctx.seen.get(parent).isParent = true;\n        }\n    }\n    // metadata\n    const meta = ctx.metadataRegistry.get(schema);\n    if (meta)\n        Object.assign(result.schema, meta);\n    if (ctx.io === \"input\" && isTransforming(schema)) {\n        // examples/defaults only apply to output type of pipe\n        delete result.schema.examples;\n        delete result.schema.default;\n    }\n    // set prefault as default\n    if (ctx.io === \"input\" && \"_prefault\" in result.schema)\n        (_a = result.schema).default ?? (_a.default = result.schema._prefault);\n    delete result.schema._prefault;\n    // pulling fresh from ctx.seen in case it was overwritten\n    const _result = ctx.seen.get(schema);\n    return _result.schema;\n}\nexport function extractDefs(ctx, schema\n// params: EmitParams\n) {\n    // iterate over seen map;\n    const root = ctx.seen.get(schema);\n    if (!root)\n        throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n    // Track ids to detect duplicates across different schemas\n    const idToSchema = new Map();\n    for (const entry of ctx.seen.entries()) {\n        const id = ctx.metadataRegistry.get(entry[0])?.id;\n        if (id) {\n            const existing = idToSchema.get(id);\n            if (existing && existing !== entry[0]) {\n                throw new Error(`Duplicate schema id \"${id}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);\n            }\n            idToSchema.set(id, entry[0]);\n        }\n    }\n    // returns a ref to the schema\n    // defId will be empty if the ref points to an external schema (or #)\n    const makeURI = (entry) => {\n        // comparing the seen objects because sometimes\n        // multiple schemas map to the same seen object.\n        // e.g. lazy\n        // external is configured\n        const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n        if (ctx.external) {\n            const externalId = ctx.external.registry.get(entry[0])?.id; // ?? \"__shared\";// `__schema${ctx.counter++}`;\n            // check if schema is in the external registry\n            const uriGenerator = ctx.external.uri ?? ((id) => id);\n            if (externalId) {\n                return { ref: uriGenerator(externalId) };\n            }\n            // otherwise, add to __shared\n            const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`;\n            entry[1].defId = id; // set defId so it will be reused if needed\n            return { defId: id, ref: `${uriGenerator(\"__shared\")}#/${defsSegment}/${id}` };\n        }\n        if (entry[1] === root) {\n            return { ref: \"#\" };\n        }\n        // self-contained schema\n        const uriPrefix = `#`;\n        const defUriPrefix = `${uriPrefix}/${defsSegment}/`;\n        const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`;\n        return { defId, ref: defUriPrefix + defId };\n    };\n    // stored cached version in `def` property\n    // remove all properties, set $ref\n    const extractToDef = (entry) => {\n        // if the schema is already a reference, do not extract it\n        if (entry[1].schema.$ref) {\n            return;\n        }\n        const seen = entry[1];\n        const { ref, defId } = makeURI(entry);\n        seen.def = { ...seen.schema };\n        // defId won't be set if the schema is a reference to an external schema\n        // or if the schema is the root schema\n        if (defId)\n            seen.defId = defId;\n        // wipe away all properties except $ref\n        const schema = seen.schema;\n        for (const key in schema) {\n            delete schema[key];\n        }\n        schema.$ref = ref;\n    };\n    // throw on cycles\n    // break cycles\n    if (ctx.cycles === \"throw\") {\n        for (const entry of ctx.seen.entries()) {\n            const seen = entry[1];\n            if (seen.cycle) {\n                throw new Error(\"Cycle detected: \" +\n                    `#/${seen.cycle?.join(\"/\")}/<root>` +\n                    '\\n\\nSet the `cycles` parameter to `\"ref\"` to resolve cyclical schemas with defs.');\n            }\n        }\n    }\n    // extract schemas into $defs\n    for (const entry of ctx.seen.entries()) {\n        const seen = entry[1];\n        // convert root schema to # $ref\n        if (schema === entry[0]) {\n            extractToDef(entry); // this has special handling for the root schema\n            continue;\n        }\n        // extract schemas that are in the external registry\n        if (ctx.external) {\n            const ext = ctx.external.registry.get(entry[0])?.id;\n            if (schema !== entry[0] && ext) {\n                extractToDef(entry);\n                continue;\n            }\n        }\n        // extract schemas with `id` meta\n        const id = ctx.metadataRegistry.get(entry[0])?.id;\n        if (id) {\n            extractToDef(entry);\n            continue;\n        }\n        // break cycles\n        if (seen.cycle) {\n            // any\n            extractToDef(entry);\n            continue;\n        }\n        // extract reused schemas\n        if (seen.count > 1) {\n            if (ctx.reused === \"ref\") {\n                extractToDef(entry);\n                // biome-ignore lint:\n                continue;\n            }\n        }\n    }\n}\nexport function finalize(ctx, schema) {\n    const root = ctx.seen.get(schema);\n    if (!root)\n        throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n    // flatten refs - inherit properties from parent schemas\n    const flattenRef = (zodSchema) => {\n        const seen = ctx.seen.get(zodSchema);\n        // already processed\n        if (seen.ref === null)\n            return;\n        const schema = seen.def ?? seen.schema;\n        const _cached = { ...schema };\n        const ref = seen.ref;\n        seen.ref = null; // prevent infinite recursion\n        if (ref) {\n            flattenRef(ref);\n            const refSeen = ctx.seen.get(ref);\n            const refSchema = refSeen.schema;\n            // merge referenced schema into current\n            if (refSchema.$ref && (ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\")) {\n                // older drafts can't combine $ref with other properties\n                schema.allOf = schema.allOf ?? [];\n                schema.allOf.push(refSchema);\n            }\n            else {\n                Object.assign(schema, refSchema);\n            }\n            // restore child's own properties (child wins)\n            Object.assign(schema, _cached);\n            const isParentRef = zodSchema._zod.parent === ref;\n            // For parent chain, child is a refinement - remove parent-only properties\n            if (isParentRef) {\n                for (const key in schema) {\n                    if (key === \"$ref\" || key === \"allOf\")\n                        continue;\n                    if (!(key in _cached)) {\n                        delete schema[key];\n                    }\n                }\n            }\n            // When ref was extracted to $defs, remove properties that match the definition\n            if (refSchema.$ref && refSeen.def) {\n                for (const key in schema) {\n                    if (key === \"$ref\" || key === \"allOf\")\n                        continue;\n                    if (key in refSeen.def && JSON.stringify(schema[key]) === JSON.stringify(refSeen.def[key])) {\n                        delete schema[key];\n                    }\n                }\n            }\n        }\n        // If parent was extracted (has $ref), propagate $ref to this schema\n        // This handles cases like: readonly().meta({id}).describe()\n        // where processor sets ref to innerType but parent should be referenced\n        const parent = zodSchema._zod.parent;\n        if (parent && parent !== ref) {\n            // Ensure parent is processed first so its def has inherited properties\n            flattenRef(parent);\n            const parentSeen = ctx.seen.get(parent);\n            if (parentSeen?.schema.$ref) {\n                schema.$ref = parentSeen.schema.$ref;\n                // De-duplicate with parent's definition\n                if (parentSeen.def) {\n                    for (const key in schema) {\n                        if (key === \"$ref\" || key === \"allOf\")\n                            continue;\n                        if (key in parentSeen.def && JSON.stringify(schema[key]) === JSON.stringify(parentSeen.def[key])) {\n                            delete schema[key];\n                        }\n                    }\n                }\n            }\n        }\n        // execute overrides\n        ctx.override({\n            zodSchema: zodSchema,\n            jsonSchema: schema,\n            path: seen.path ?? [],\n        });\n    };\n    for (const entry of [...ctx.seen.entries()].reverse()) {\n        flattenRef(entry[0]);\n    }\n    const result = {};\n    if (ctx.target === \"draft-2020-12\") {\n        result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n    }\n    else if (ctx.target === \"draft-07\") {\n        result.$schema = \"http://json-schema.org/draft-07/schema#\";\n    }\n    else if (ctx.target === \"draft-04\") {\n        result.$schema = \"http://json-schema.org/draft-04/schema#\";\n    }\n    else if (ctx.target === \"openapi-3.0\") {\n        // OpenAPI 3.0 schema objects should not include a $schema property\n    }\n    else {\n        // Arbitrary string values are allowed but won't have a $schema property set\n    }\n    if (ctx.external?.uri) {\n        const id = ctx.external.registry.get(schema)?.id;\n        if (!id)\n            throw new Error(\"Schema is missing an `id` property\");\n        result.$id = ctx.external.uri(id);\n    }\n    Object.assign(result, root.def ?? root.schema);\n    // The `id` in `.meta()` is a Zod-specific registration tag used to extract\n    // schemas into $defs \u2014 it is not user-facing JSON Schema metadata. Strip it\n    // from the output body where it would otherwise leak. The id is preserved\n    // implicitly via the $defs key (and via $ref paths).\n    const rootMetaId = ctx.metadataRegistry.get(schema)?.id;\n    if (rootMetaId !== undefined && result.id === rootMetaId)\n        delete result.id;\n    // build defs object\n    const defs = ctx.external?.defs ?? {};\n    for (const entry of ctx.seen.entries()) {\n        const seen = entry[1];\n        if (seen.def && seen.defId) {\n            if (seen.def.id === seen.defId)\n                delete seen.def.id;\n            defs[seen.defId] = seen.def;\n        }\n    }\n    // set definitions in result\n    if (ctx.external) {\n    }\n    else {\n        if (Object.keys(defs).length > 0) {\n            if (ctx.target === \"draft-2020-12\") {\n                result.$defs = defs;\n            }\n            else {\n                result.definitions = defs;\n            }\n        }\n    }\n    try {\n        // this \"finalizes\" this schema and ensures all cycles are removed\n        // each call to finalize() is functionally independent\n        // though the seen map is shared\n        const finalized = JSON.parse(JSON.stringify(result));\n        Object.defineProperty(finalized, \"~standard\", {\n            value: {\n                ...schema[\"~standard\"],\n                jsonSchema: {\n                    input: createStandardJSONSchemaMethod(schema, \"input\", ctx.processors),\n                    output: createStandardJSONSchemaMethod(schema, \"output\", ctx.processors),\n                },\n            },\n            enumerable: false,\n            writable: false,\n        });\n        return finalized;\n    }\n    catch (_err) {\n        throw new Error(\"Error converting schema to JSON.\");\n    }\n}\nfunction isTransforming(_schema, _ctx) {\n    const ctx = _ctx ?? { seen: new Set() };\n    if (ctx.seen.has(_schema))\n        return false;\n    ctx.seen.add(_schema);\n    const def = _schema._zod.def;\n    if (def.type === \"transform\")\n        return true;\n    if (def.type === \"array\")\n        return isTransforming(def.element, ctx);\n    if (def.type === \"set\")\n        return isTransforming(def.valueType, ctx);\n    if (def.type === \"lazy\")\n        return isTransforming(def.getter(), ctx);\n    if (def.type === \"promise\" ||\n        def.type === \"optional\" ||\n        def.type === \"nonoptional\" ||\n        def.type === \"nullable\" ||\n        def.type === \"readonly\" ||\n        def.type === \"default\" ||\n        def.type === \"prefault\") {\n        return isTransforming(def.innerType, ctx);\n    }\n    if (def.type === \"intersection\") {\n        return isTransforming(def.left, ctx) || isTransforming(def.right, ctx);\n    }\n    if (def.type === \"record\" || def.type === \"map\") {\n        return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx);\n    }\n    if (def.type === \"pipe\") {\n        if (_schema._zod.traits.has(\"$ZodCodec\"))\n            return true;\n        return isTransforming(def.in, ctx) || isTransforming(def.out, ctx);\n    }\n    if (def.type === \"object\") {\n        for (const key in def.shape) {\n            if (isTransforming(def.shape[key], ctx))\n                return true;\n        }\n        return false;\n    }\n    if (def.type === \"union\") {\n        for (const option of def.options) {\n            if (isTransforming(option, ctx))\n                return true;\n        }\n        return false;\n    }\n    if (def.type === \"tuple\") {\n        for (const item of def.items) {\n            if (isTransforming(item, ctx))\n                return true;\n        }\n        if (def.rest && isTransforming(def.rest, ctx))\n            return true;\n        return false;\n    }\n    return false;\n}\n/**\n * Creates a toJSONSchema method for a schema instance.\n * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing.\n */\nexport const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {\n    const ctx = initializeContext({ ...params, processors });\n    process(schema, ctx);\n    extractDefs(ctx, schema);\n    return finalize(ctx, schema);\n};\nexport const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => {\n    const { libraryOptions, target } = params ?? {};\n    const ctx = initializeContext({ ...(libraryOptions ?? {}), target, io, processors });\n    process(schema, ctx);\n    extractDefs(ctx, schema);\n    return finalize(ctx, schema);\n};\n", "import { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\nimport { getEnumValues } from \"./util.js\";\nconst formatMap = {\n    guid: \"uuid\",\n    url: \"uri\",\n    datetime: \"date-time\",\n    json_string: \"json-string\",\n    regex: \"\", // do not set\n};\n// ==================== SIMPLE TYPE PROCESSORS ====================\nexport const stringProcessor = (schema, ctx, _json, _params) => {\n    const json = _json;\n    json.type = \"string\";\n    const { minimum, maximum, format, patterns, contentEncoding } = schema._zod\n        .bag;\n    if (typeof minimum === \"number\")\n        json.minLength = minimum;\n    if (typeof maximum === \"number\")\n        json.maxLength = maximum;\n    // custom pattern overrides format\n    if (format) {\n        json.format = formatMap[format] ?? format;\n        if (json.format === \"\")\n            delete json.format; // empty format is not valid\n        // JSON Schema format: \"time\" requires a full time with offset or Z\n        // z.iso.time() does not include timezone information, so format: \"time\" should never be used\n        if (format === \"time\") {\n            delete json.format;\n        }\n    }\n    if (contentEncoding)\n        json.contentEncoding = contentEncoding;\n    if (patterns && patterns.size > 0) {\n        const regexes = [...patterns];\n        if (regexes.length === 1)\n            json.pattern = regexes[0].source;\n        else if (regexes.length > 1) {\n            json.allOf = [\n                ...regexes.map((regex) => ({\n                    ...(ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\"\n                        ? { type: \"string\" }\n                        : {}),\n                    pattern: regex.source,\n                })),\n            ];\n        }\n    }\n};\nexport const numberProcessor = (schema, ctx, _json, _params) => {\n    const json = _json;\n    const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag;\n    if (typeof format === \"string\" && format.includes(\"int\"))\n        json.type = \"integer\";\n    else\n        json.type = \"number\";\n    // when both minimum and exclusiveMinimum exist, pick the more restrictive one\n    const exMin = typeof exclusiveMinimum === \"number\" && exclusiveMinimum >= (minimum ?? Number.NEGATIVE_INFINITY);\n    const exMax = typeof exclusiveMaximum === \"number\" && exclusiveMaximum <= (maximum ?? Number.POSITIVE_INFINITY);\n    const legacy = ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\";\n    if (exMin) {\n        if (legacy) {\n            json.minimum = exclusiveMinimum;\n            json.exclusiveMinimum = true;\n        }\n        else {\n            json.exclusiveMinimum = exclusiveMinimum;\n        }\n    }\n    else if (typeof minimum === \"number\") {\n        json.minimum = minimum;\n    }\n    if (exMax) {\n        if (legacy) {\n            json.maximum = exclusiveMaximum;\n            json.exclusiveMaximum = true;\n        }\n        else {\n            json.exclusiveMaximum = exclusiveMaximum;\n        }\n    }\n    else if (typeof maximum === \"number\") {\n        json.maximum = maximum;\n    }\n    if (typeof multipleOf === \"number\")\n        json.multipleOf = multipleOf;\n};\nexport const booleanProcessor = (_schema, _ctx, json, _params) => {\n    json.type = \"boolean\";\n};\nexport const bigintProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"BigInt cannot be represented in JSON Schema\");\n    }\n};\nexport const symbolProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Symbols cannot be represented in JSON Schema\");\n    }\n};\nexport const nullProcessor = (_schema, ctx, json, _params) => {\n    if (ctx.target === \"openapi-3.0\") {\n        json.type = \"string\";\n        json.nullable = true;\n        json.enum = [null];\n    }\n    else {\n        json.type = \"null\";\n    }\n};\nexport const undefinedProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Undefined cannot be represented in JSON Schema\");\n    }\n};\nexport const voidProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Void cannot be represented in JSON Schema\");\n    }\n};\nexport const neverProcessor = (_schema, _ctx, json, _params) => {\n    json.not = {};\n};\nexport const anyProcessor = (_schema, _ctx, _json, _params) => {\n    // empty schema accepts anything\n};\nexport const unknownProcessor = (_schema, _ctx, _json, _params) => {\n    // empty schema accepts anything\n};\nexport const dateProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Date cannot be represented in JSON Schema\");\n    }\n};\nexport const enumProcessor = (schema, _ctx, json, _params) => {\n    const def = schema._zod.def;\n    const values = getEnumValues(def.entries);\n    // Number enums can have both string and number values\n    if (values.every((v) => typeof v === \"number\"))\n        json.type = \"number\";\n    if (values.every((v) => typeof v === \"string\"))\n        json.type = \"string\";\n    json.enum = values;\n};\nexport const literalProcessor = (schema, ctx, json, _params) => {\n    const def = schema._zod.def;\n    const vals = [];\n    for (const val of def.values) {\n        if (val === undefined) {\n            if (ctx.unrepresentable === \"throw\") {\n                throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\");\n            }\n            else {\n                // do not add to vals\n            }\n        }\n        else if (typeof val === \"bigint\") {\n            if (ctx.unrepresentable === \"throw\") {\n                throw new Error(\"BigInt literals cannot be represented in JSON Schema\");\n            }\n            else {\n                vals.push(Number(val));\n            }\n        }\n        else {\n            vals.push(val);\n        }\n    }\n    if (vals.length === 0) {\n        // do nothing (an undefined literal was stripped)\n    }\n    else if (vals.length === 1) {\n        const val = vals[0];\n        json.type = val === null ? \"null\" : typeof val;\n        if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n            json.enum = [val];\n        }\n        else {\n            json.const = val;\n        }\n    }\n    else {\n        if (vals.every((v) => typeof v === \"number\"))\n            json.type = \"number\";\n        if (vals.every((v) => typeof v === \"string\"))\n            json.type = \"string\";\n        if (vals.every((v) => typeof v === \"boolean\"))\n            json.type = \"boolean\";\n        if (vals.every((v) => v === null))\n            json.type = \"null\";\n        json.enum = vals;\n    }\n};\nexport const nanProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"NaN cannot be represented in JSON Schema\");\n    }\n};\nexport const templateLiteralProcessor = (schema, _ctx, json, _params) => {\n    const _json = json;\n    const pattern = schema._zod.pattern;\n    if (!pattern)\n        throw new Error(\"Pattern not found in template literal\");\n    _json.type = \"string\";\n    _json.pattern = pattern.source;\n};\nexport const fileProcessor = (schema, _ctx, json, _params) => {\n    const _json = json;\n    const file = {\n        type: \"string\",\n        format: \"binary\",\n        contentEncoding: \"binary\",\n    };\n    const { minimum, maximum, mime } = schema._zod.bag;\n    if (minimum !== undefined)\n        file.minLength = minimum;\n    if (maximum !== undefined)\n        file.maxLength = maximum;\n    if (mime) {\n        if (mime.length === 1) {\n            file.contentMediaType = mime[0];\n            Object.assign(_json, file);\n        }\n        else {\n            Object.assign(_json, file); // shared props at root\n            _json.anyOf = mime.map((m) => ({ contentMediaType: m })); // only contentMediaType differs\n        }\n    }\n    else {\n        Object.assign(_json, file);\n    }\n};\nexport const successProcessor = (_schema, _ctx, json, _params) => {\n    json.type = \"boolean\";\n};\nexport const customProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Custom types cannot be represented in JSON Schema\");\n    }\n};\nexport const functionProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Function types cannot be represented in JSON Schema\");\n    }\n};\nexport const transformProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Transforms cannot be represented in JSON Schema\");\n    }\n};\nexport const mapProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Map cannot be represented in JSON Schema\");\n    }\n};\nexport const setProcessor = (_schema, ctx, _json, _params) => {\n    if (ctx.unrepresentable === \"throw\") {\n        throw new Error(\"Set cannot be represented in JSON Schema\");\n    }\n};\n// ==================== COMPOSITE TYPE PROCESSORS ====================\nexport const arrayProcessor = (schema, ctx, _json, params) => {\n    const json = _json;\n    const def = schema._zod.def;\n    const { minimum, maximum } = schema._zod.bag;\n    if (typeof minimum === \"number\")\n        json.minItems = minimum;\n    if (typeof maximum === \"number\")\n        json.maxItems = maximum;\n    json.type = \"array\";\n    json.items = process(def.element, ctx, {\n        ...params,\n        path: [...params.path, \"items\"],\n    });\n};\nexport const objectProcessor = (schema, ctx, _json, params) => {\n    const json = _json;\n    const def = schema._zod.def;\n    json.type = \"object\";\n    json.properties = {};\n    const shape = def.shape;\n    for (const key in shape) {\n        json.properties[key] = process(shape[key], ctx, {\n            ...params,\n            path: [...params.path, \"properties\", key],\n        });\n    }\n    // required keys\n    const allKeys = new Set(Object.keys(shape));\n    const requiredKeys = new Set([...allKeys].filter((key) => {\n        const v = def.shape[key]._zod;\n        if (ctx.io === \"input\") {\n            return v.optin === undefined;\n        }\n        else {\n            return v.optout === undefined;\n        }\n    }));\n    if (requiredKeys.size > 0) {\n        json.required = Array.from(requiredKeys);\n    }\n    // catchall\n    if (def.catchall?._zod.def.type === \"never\") {\n        // strict\n        json.additionalProperties = false;\n    }\n    else if (!def.catchall) {\n        // regular\n        if (ctx.io === \"output\")\n            json.additionalProperties = false;\n    }\n    else if (def.catchall) {\n        json.additionalProperties = process(def.catchall, ctx, {\n            ...params,\n            path: [...params.path, \"additionalProperties\"],\n        });\n    }\n};\nexport const unionProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    // Exclusive unions (inclusive === false) use oneOf (exactly one match) instead of anyOf (one or more matches)\n    // This includes both z.xor() and discriminated unions\n    const isExclusive = def.inclusive === false;\n    const options = def.options.map((x, i) => process(x, ctx, {\n        ...params,\n        path: [...params.path, isExclusive ? \"oneOf\" : \"anyOf\", i],\n    }));\n    if (isExclusive) {\n        json.oneOf = options;\n    }\n    else {\n        json.anyOf = options;\n    }\n};\nexport const intersectionProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    const a = process(def.left, ctx, {\n        ...params,\n        path: [...params.path, \"allOf\", 0],\n    });\n    const b = process(def.right, ctx, {\n        ...params,\n        path: [...params.path, \"allOf\", 1],\n    });\n    const isSimpleIntersection = (val) => \"allOf\" in val && Object.keys(val).length === 1;\n    const allOf = [\n        ...(isSimpleIntersection(a) ? a.allOf : [a]),\n        ...(isSimpleIntersection(b) ? b.allOf : [b]),\n    ];\n    json.allOf = allOf;\n};\nexport const tupleProcessor = (schema, ctx, _json, params) => {\n    const json = _json;\n    const def = schema._zod.def;\n    json.type = \"array\";\n    const prefixPath = ctx.target === \"draft-2020-12\" ? \"prefixItems\" : \"items\";\n    const restPath = ctx.target === \"draft-2020-12\" ? \"items\" : ctx.target === \"openapi-3.0\" ? \"items\" : \"additionalItems\";\n    const prefixItems = def.items.map((x, i) => process(x, ctx, {\n        ...params,\n        path: [...params.path, prefixPath, i],\n    }));\n    const rest = def.rest\n        ? process(def.rest, ctx, {\n            ...params,\n            path: [...params.path, restPath, ...(ctx.target === \"openapi-3.0\" ? [def.items.length] : [])],\n        })\n        : null;\n    if (ctx.target === \"draft-2020-12\") {\n        json.prefixItems = prefixItems;\n        if (rest) {\n            json.items = rest;\n        }\n    }\n    else if (ctx.target === \"openapi-3.0\") {\n        json.items = {\n            anyOf: prefixItems,\n        };\n        if (rest) {\n            json.items.anyOf.push(rest);\n        }\n        json.minItems = prefixItems.length;\n        if (!rest) {\n            json.maxItems = prefixItems.length;\n        }\n    }\n    else {\n        json.items = prefixItems;\n        if (rest) {\n            json.additionalItems = rest;\n        }\n    }\n    // length\n    const { minimum, maximum } = schema._zod.bag;\n    if (typeof minimum === \"number\")\n        json.minItems = minimum;\n    if (typeof maximum === \"number\")\n        json.maxItems = maximum;\n};\nexport const recordProcessor = (schema, ctx, _json, params) => {\n    const json = _json;\n    const def = schema._zod.def;\n    json.type = \"object\";\n    // For looseRecord with regex patterns, use patternProperties\n    // This correctly represents \"only validate keys matching the pattern\" semantics\n    // and composes well with allOf (intersections)\n    const keyType = def.keyType;\n    const keyBag = keyType._zod.bag;\n    const patterns = keyBag?.patterns;\n    if (def.mode === \"loose\" && patterns && patterns.size > 0) {\n        // Use patternProperties for looseRecord with regex patterns\n        const valueSchema = process(def.valueType, ctx, {\n            ...params,\n            path: [...params.path, \"patternProperties\", \"*\"],\n        });\n        json.patternProperties = {};\n        for (const pattern of patterns) {\n            json.patternProperties[pattern.source] = valueSchema;\n        }\n    }\n    else {\n        // Default behavior: use propertyNames + additionalProperties\n        if (ctx.target === \"draft-07\" || ctx.target === \"draft-2020-12\") {\n            json.propertyNames = process(def.keyType, ctx, {\n                ...params,\n                path: [...params.path, \"propertyNames\"],\n            });\n        }\n        json.additionalProperties = process(def.valueType, ctx, {\n            ...params,\n            path: [...params.path, \"additionalProperties\"],\n        });\n    }\n    // Add required for keys with discrete values (enum, literal, etc.)\n    const keyValues = keyType._zod.values;\n    if (keyValues) {\n        const validKeyValues = [...keyValues].filter((v) => typeof v === \"string\" || typeof v === \"number\");\n        if (validKeyValues.length > 0) {\n            json.required = validKeyValues;\n        }\n    }\n};\nexport const nullableProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    const inner = process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    if (ctx.target === \"openapi-3.0\") {\n        seen.ref = def.innerType;\n        json.nullable = true;\n    }\n    else {\n        json.anyOf = [inner, { type: \"null\" }];\n    }\n};\nexport const nonoptionalProcessor = (schema, ctx, _json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n};\nexport const defaultProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n    json.default = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const prefaultProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n    if (ctx.io === \"input\")\n        json._prefault = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const catchProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n    let catchValue;\n    try {\n        catchValue = def.catchValue(undefined);\n    }\n    catch {\n        throw new Error(\"Dynamic catch values are not supported in JSON Schema\");\n    }\n    json.default = catchValue;\n};\nexport const pipeProcessor = (schema, ctx, _json, params) => {\n    const def = schema._zod.def;\n    const inIsTransform = def.in._zod.traits.has(\"$ZodTransform\");\n    const innerType = ctx.io === \"input\" ? (inIsTransform ? def.out : def.in) : def.out;\n    process(innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = innerType;\n};\nexport const readonlyProcessor = (schema, ctx, json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n    json.readOnly = true;\n};\nexport const promiseProcessor = (schema, ctx, _json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n};\nexport const optionalProcessor = (schema, ctx, _json, params) => {\n    const def = schema._zod.def;\n    process(def.innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = def.innerType;\n};\nexport const lazyProcessor = (schema, ctx, _json, params) => {\n    const innerType = schema._zod.innerType;\n    process(innerType, ctx, params);\n    const seen = ctx.seen.get(schema);\n    seen.ref = innerType;\n};\n// ==================== ALL PROCESSORS ====================\nexport const allProcessors = {\n    string: stringProcessor,\n    number: numberProcessor,\n    boolean: booleanProcessor,\n    bigint: bigintProcessor,\n    symbol: symbolProcessor,\n    null: nullProcessor,\n    undefined: undefinedProcessor,\n    void: voidProcessor,\n    never: neverProcessor,\n    any: anyProcessor,\n    unknown: unknownProcessor,\n    date: dateProcessor,\n    enum: enumProcessor,\n    literal: literalProcessor,\n    nan: nanProcessor,\n    template_literal: templateLiteralProcessor,\n    file: fileProcessor,\n    success: successProcessor,\n    custom: customProcessor,\n    function: functionProcessor,\n    transform: transformProcessor,\n    map: mapProcessor,\n    set: setProcessor,\n    array: arrayProcessor,\n    object: objectProcessor,\n    union: unionProcessor,\n    intersection: intersectionProcessor,\n    tuple: tupleProcessor,\n    record: recordProcessor,\n    nullable: nullableProcessor,\n    nonoptional: nonoptionalProcessor,\n    default: defaultProcessor,\n    prefault: prefaultProcessor,\n    catch: catchProcessor,\n    pipe: pipeProcessor,\n    readonly: readonlyProcessor,\n    promise: promiseProcessor,\n    optional: optionalProcessor,\n    lazy: lazyProcessor,\n};\nexport function toJSONSchema(input, params) {\n    if (\"_idmap\" in input) {\n        // Registry case\n        const registry = input;\n        const ctx = initializeContext({ ...params, processors: allProcessors });\n        const defs = {};\n        // First pass: process all schemas to build the seen map\n        for (const entry of registry._idmap.entries()) {\n            const [_, schema] = entry;\n            process(schema, ctx);\n        }\n        const schemas = {};\n        const external = {\n            registry,\n            uri: params?.uri,\n            defs,\n        };\n        // Update the context with external configuration\n        ctx.external = external;\n        // Second pass: emit each schema\n        for (const entry of registry._idmap.entries()) {\n            const [key, schema] = entry;\n            extractDefs(ctx, schema);\n            schemas[key] = finalize(ctx, schema);\n        }\n        if (Object.keys(defs).length > 0) {\n            const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n            schemas.__shared = {\n                [defsSegment]: defs,\n            };\n        }\n        return { schemas };\n    }\n    // Single schema case\n    const ctx = initializeContext({ ...params, processors: allProcessors });\n    process(input, ctx);\n    extractDefs(ctx, input);\n    return finalize(ctx, input);\n}\n", "import { allProcessors } from \"./json-schema-processors.js\";\nimport { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\n/**\n * Legacy class-based interface for JSON Schema generation.\n * This class wraps the new functional implementation to provide backward compatibility.\n *\n * @deprecated Use the `toJSONSchema` function instead for new code.\n *\n * @example\n * ```typescript\n * // Legacy usage (still supported)\n * const gen = new JSONSchemaGenerator({ target: \"draft-07\" });\n * gen.process(schema);\n * const result = gen.emit(schema);\n *\n * // Preferred modern usage\n * const result = toJSONSchema(schema, { target: \"draft-07\" });\n * ```\n */\nexport class JSONSchemaGenerator {\n    /** @deprecated Access via ctx instead */\n    get metadataRegistry() {\n        return this.ctx.metadataRegistry;\n    }\n    /** @deprecated Access via ctx instead */\n    get target() {\n        return this.ctx.target;\n    }\n    /** @deprecated Access via ctx instead */\n    get unrepresentable() {\n        return this.ctx.unrepresentable;\n    }\n    /** @deprecated Access via ctx instead */\n    get override() {\n        return this.ctx.override;\n    }\n    /** @deprecated Access via ctx instead */\n    get io() {\n        return this.ctx.io;\n    }\n    /** @deprecated Access via ctx instead */\n    get counter() {\n        return this.ctx.counter;\n    }\n    set counter(value) {\n        this.ctx.counter = value;\n    }\n    /** @deprecated Access via ctx instead */\n    get seen() {\n        return this.ctx.seen;\n    }\n    constructor(params) {\n        // Normalize target for internal context\n        let normalizedTarget = params?.target ?? \"draft-2020-12\";\n        if (normalizedTarget === \"draft-4\")\n            normalizedTarget = \"draft-04\";\n        if (normalizedTarget === \"draft-7\")\n            normalizedTarget = \"draft-07\";\n        this.ctx = initializeContext({\n            processors: allProcessors,\n            target: normalizedTarget,\n            ...(params?.metadata && { metadata: params.metadata }),\n            ...(params?.unrepresentable && { unrepresentable: params.unrepresentable }),\n            ...(params?.override && { override: params.override }),\n            ...(params?.io && { io: params.io }),\n        });\n    }\n    /**\n     * Process a schema to prepare it for JSON Schema generation.\n     * This must be called before emit().\n     */\n    process(schema, _params = { path: [], schemaPath: [] }) {\n        return process(schema, this.ctx, _params);\n    }\n    /**\n     * Emit the final JSON Schema after processing.\n     * Must call process() first.\n     */\n    emit(schema, _params) {\n        // Apply emit params to the context\n        if (_params) {\n            if (_params.cycles)\n                this.ctx.cycles = _params.cycles;\n            if (_params.reused)\n                this.ctx.reused = _params.reused;\n            if (_params.external)\n                this.ctx.external = _params.external;\n        }\n        extractDefs(this.ctx, schema);\n        const result = finalize(this.ctx, schema);\n        // Strip ~standard property to match old implementation's return type\n        const { \"~standard\": _, ...plainResult } = result;\n        return plainResult;\n    }\n}\n", "export {};\n", "import * as core from \"../core/index.js\";\nimport { util } from \"../core/index.js\";\nimport * as processors from \"../core/json-schema-processors.js\";\nimport { createStandardJSONSchemaMethod, createToJSONSchemaMethod } from \"../core/to-json-schema.js\";\nimport * as checks from \"./checks.js\";\nimport * as iso from \"./iso.js\";\nimport * as parse from \"./parse.js\";\n// Lazy-bind builder methods.\n//\n// Builder methods (`.optional`, `.array`, `.refine`, ...) live as\n// non-enumerable getters on each concrete schema constructor's\n// prototype. On first access from an instance the getter allocates\n// `fn.bind(this)` and caches it as an own property on that instance,\n// so detached usage (`const m = schema.optional; m()`) still works\n// and the per-instance allocation only happens for methods actually\n// touched.\n//\n// One install per (prototype, group), memoized by `_installedGroups`.\nconst _installedGroups = /* @__PURE__ */ new WeakMap();\nfunction _installLazyMethods(inst, group, methods) {\n    const proto = Object.getPrototypeOf(inst);\n    let installed = _installedGroups.get(proto);\n    if (!installed) {\n        installed = new Set();\n        _installedGroups.set(proto, installed);\n    }\n    if (installed.has(group))\n        return;\n    installed.add(group);\n    for (const key in methods) {\n        const fn = methods[key];\n        Object.defineProperty(proto, key, {\n            configurable: true,\n            enumerable: false,\n            get() {\n                const bound = fn.bind(this);\n                Object.defineProperty(this, key, {\n                    configurable: true,\n                    writable: true,\n                    enumerable: true,\n                    value: bound,\n                });\n                return bound;\n            },\n            set(v) {\n                Object.defineProperty(this, key, {\n                    configurable: true,\n                    writable: true,\n                    enumerable: true,\n                    value: v,\n                });\n            },\n        });\n    }\n}\nexport const ZodType = /*@__PURE__*/ core.$constructor(\"ZodType\", (inst, def) => {\n    core.$ZodType.init(inst, def);\n    Object.assign(inst[\"~standard\"], {\n        jsonSchema: {\n            input: createStandardJSONSchemaMethod(inst, \"input\"),\n            output: createStandardJSONSchemaMethod(inst, \"output\"),\n        },\n    });\n    inst.toJSONSchema = createToJSONSchemaMethod(inst, {});\n    inst.def = def;\n    inst.type = def.type;\n    Object.defineProperty(inst, \"_def\", { value: def });\n    // Parse-family is intentionally kept as per-instance closures: these are\n    // the hot path AND the most-detached methods (`arr.map(schema.parse)`,\n    // `const { parse } = schema`, etc.). Eager closures here mean callers pay\n    // ~12 closure allocations per schema but get monomorphic call sites and\n    // detached usage that \"just works\".\n    inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n    inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n    inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n    inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n    inst.spa = inst.safeParseAsync;\n    inst.encode = (data, params) => parse.encode(inst, data, params);\n    inst.decode = (data, params) => parse.decode(inst, data, params);\n    inst.encodeAsync = async (data, params) => parse.encodeAsync(inst, data, params);\n    inst.decodeAsync = async (data, params) => parse.decodeAsync(inst, data, params);\n    inst.safeEncode = (data, params) => parse.safeEncode(inst, data, params);\n    inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);\n    inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);\n    inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);\n    // All builder methods are placed on the internal prototype as lazy-bind\n    // getters. On first access per-instance, a bound thunk is allocated and\n    // cached as an own property; subsequent accesses skip the getter. This\n    // means: no per-instance allocation for unused methods, full\n    // detachability preserved (`const m = schema.optional; m()` works), and\n    // shared underlying function references across all instances.\n    _installLazyMethods(inst, \"ZodType\", {\n        check(...chks) {\n            const def = this.def;\n            return this.clone(util.mergeDefs(def, {\n                checks: [\n                    ...(def.checks ?? []),\n                    ...chks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n                ],\n            }), { parent: true });\n        },\n        with(...chks) {\n            return this.check(...chks);\n        },\n        clone(def, params) {\n            return core.clone(this, def, params);\n        },\n        brand() {\n            return this;\n        },\n        register(reg, meta) {\n            reg.add(this, meta);\n            return this;\n        },\n        refine(check, params) {\n            return this.check(refine(check, params));\n        },\n        superRefine(refinement, params) {\n            return this.check(superRefine(refinement, params));\n        },\n        overwrite(fn) {\n            return this.check(checks.overwrite(fn));\n        },\n        optional() {\n            return optional(this);\n        },\n        exactOptional() {\n            return exactOptional(this);\n        },\n        nullable() {\n            return nullable(this);\n        },\n        nullish() {\n            return optional(nullable(this));\n        },\n        nonoptional(params) {\n            return nonoptional(this, params);\n        },\n        array() {\n            return array(this);\n        },\n        or(arg) {\n            return union([this, arg]);\n        },\n        and(arg) {\n            return intersection(this, arg);\n        },\n        transform(tx) {\n            return pipe(this, transform(tx));\n        },\n        default(d) {\n            return _default(this, d);\n        },\n        prefault(d) {\n            return prefault(this, d);\n        },\n        catch(params) {\n            return _catch(this, params);\n        },\n        pipe(target) {\n            return pipe(this, target);\n        },\n        readonly() {\n            return readonly(this);\n        },\n        describe(description) {\n            const cl = this.clone();\n            core.globalRegistry.add(cl, { description });\n            return cl;\n        },\n        meta(...args) {\n            // overloaded: meta() returns the registered metadata, meta(data)\n            // returns a clone with `data` registered. The mapped type picks\n            // up the second overload, so we accept variadic any-args and\n            // return `any` to satisfy both at runtime.\n            if (args.length === 0)\n                return core.globalRegistry.get(this);\n            const cl = this.clone();\n            core.globalRegistry.add(cl, args[0]);\n            return cl;\n        },\n        isOptional() {\n            return this.safeParse(undefined).success;\n        },\n        isNullable() {\n            return this.safeParse(null).success;\n        },\n        apply(fn) {\n            return fn(this);\n        },\n    });\n    Object.defineProperty(inst, \"description\", {\n        get() {\n            return core.globalRegistry.get(inst)?.description;\n        },\n        configurable: true,\n    });\n    return inst;\n});\n/** @internal */\nexport const _ZodString = /*@__PURE__*/ core.$constructor(\"_ZodString\", (inst, def) => {\n    core.$ZodString.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);\n    const bag = inst._zod.bag;\n    inst.format = bag.format ?? null;\n    inst.minLength = bag.minimum ?? null;\n    inst.maxLength = bag.maximum ?? null;\n    _installLazyMethods(inst, \"_ZodString\", {\n        regex(...args) {\n            return this.check(checks.regex(...args));\n        },\n        includes(...args) {\n            return this.check(checks.includes(...args));\n        },\n        startsWith(...args) {\n            return this.check(checks.startsWith(...args));\n        },\n        endsWith(...args) {\n            return this.check(checks.endsWith(...args));\n        },\n        min(...args) {\n            return this.check(checks.minLength(...args));\n        },\n        max(...args) {\n            return this.check(checks.maxLength(...args));\n        },\n        length(...args) {\n            return this.check(checks.length(...args));\n        },\n        nonempty(...args) {\n            return this.check(checks.minLength(1, ...args));\n        },\n        lowercase(params) {\n            return this.check(checks.lowercase(params));\n        },\n        uppercase(params) {\n            return this.check(checks.uppercase(params));\n        },\n        trim() {\n            return this.check(checks.trim());\n        },\n        normalize(...args) {\n            return this.check(checks.normalize(...args));\n        },\n        toLowerCase() {\n            return this.check(checks.toLowerCase());\n        },\n        toUpperCase() {\n            return this.check(checks.toUpperCase());\n        },\n        slugify() {\n            return this.check(checks.slugify());\n        },\n    });\n});\nexport const ZodString = /*@__PURE__*/ core.$constructor(\"ZodString\", (inst, def) => {\n    core.$ZodString.init(inst, def);\n    _ZodString.init(inst, def);\n    inst.email = (params) => inst.check(core._email(ZodEmail, params));\n    inst.url = (params) => inst.check(core._url(ZodURL, params));\n    inst.jwt = (params) => inst.check(core._jwt(ZodJWT, params));\n    inst.emoji = (params) => inst.check(core._emoji(ZodEmoji, params));\n    inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n    inst.uuid = (params) => inst.check(core._uuid(ZodUUID, params));\n    inst.uuidv4 = (params) => inst.check(core._uuidv4(ZodUUID, params));\n    inst.uuidv6 = (params) => inst.check(core._uuidv6(ZodUUID, params));\n    inst.uuidv7 = (params) => inst.check(core._uuidv7(ZodUUID, params));\n    inst.nanoid = (params) => inst.check(core._nanoid(ZodNanoID, params));\n    inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n    inst.cuid = (params) => inst.check(core._cuid(ZodCUID, params));\n    inst.cuid2 = (params) => inst.check(core._cuid2(ZodCUID2, params));\n    inst.ulid = (params) => inst.check(core._ulid(ZodULID, params));\n    inst.base64 = (params) => inst.check(core._base64(ZodBase64, params));\n    inst.base64url = (params) => inst.check(core._base64url(ZodBase64URL, params));\n    inst.xid = (params) => inst.check(core._xid(ZodXID, params));\n    inst.ksuid = (params) => inst.check(core._ksuid(ZodKSUID, params));\n    inst.ipv4 = (params) => inst.check(core._ipv4(ZodIPv4, params));\n    inst.ipv6 = (params) => inst.check(core._ipv6(ZodIPv6, params));\n    inst.cidrv4 = (params) => inst.check(core._cidrv4(ZodCIDRv4, params));\n    inst.cidrv6 = (params) => inst.check(core._cidrv6(ZodCIDRv6, params));\n    inst.e164 = (params) => inst.check(core._e164(ZodE164, params));\n    // iso\n    inst.datetime = (params) => inst.check(iso.datetime(params));\n    inst.date = (params) => inst.check(iso.date(params));\n    inst.time = (params) => inst.check(iso.time(params));\n    inst.duration = (params) => inst.check(iso.duration(params));\n});\nexport function string(params) {\n    return core._string(ZodString, params);\n}\nexport const ZodStringFormat = /*@__PURE__*/ core.$constructor(\"ZodStringFormat\", (inst, def) => {\n    core.$ZodStringFormat.init(inst, def);\n    _ZodString.init(inst, def);\n});\nexport const ZodEmail = /*@__PURE__*/ core.$constructor(\"ZodEmail\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodEmail.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function email(params) {\n    return core._email(ZodEmail, params);\n}\nexport const ZodGUID = /*@__PURE__*/ core.$constructor(\"ZodGUID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodGUID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function guid(params) {\n    return core._guid(ZodGUID, params);\n}\nexport const ZodUUID = /*@__PURE__*/ core.$constructor(\"ZodUUID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodUUID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function uuid(params) {\n    return core._uuid(ZodUUID, params);\n}\nexport function uuidv4(params) {\n    return core._uuidv4(ZodUUID, params);\n}\n// ZodUUIDv6\nexport function uuidv6(params) {\n    return core._uuidv6(ZodUUID, params);\n}\n// ZodUUIDv7\nexport function uuidv7(params) {\n    return core._uuidv7(ZodUUID, params);\n}\nexport const ZodURL = /*@__PURE__*/ core.$constructor(\"ZodURL\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodURL.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function url(params) {\n    return core._url(ZodURL, params);\n}\nexport function httpUrl(params) {\n    return core._url(ZodURL, {\n        protocol: core.regexes.httpProtocol,\n        hostname: core.regexes.domain,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodEmoji = /*@__PURE__*/ core.$constructor(\"ZodEmoji\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodEmoji.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function emoji(params) {\n    return core._emoji(ZodEmoji, params);\n}\nexport const ZodNanoID = /*@__PURE__*/ core.$constructor(\"ZodNanoID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodNanoID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function nanoid(params) {\n    return core._nanoid(ZodNanoID, params);\n}\n/**\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link ZodCUID2} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport const ZodCUID = /*@__PURE__*/ core.$constructor(\"ZodCUID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodCUID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\n/**\n * Validates a CUID v1 string.\n *\n * @deprecated CUID v1 is deprecated by its authors due to information leakage\n * (timestamps embedded in the id). Use {@link cuid2 | `z.cuid2()`} instead.\n * See https://github.com/paralleldrive/cuid.\n */\nexport function cuid(params) {\n    return core._cuid(ZodCUID, params);\n}\nexport const ZodCUID2 = /*@__PURE__*/ core.$constructor(\"ZodCUID2\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodCUID2.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function cuid2(params) {\n    return core._cuid2(ZodCUID2, params);\n}\nexport const ZodULID = /*@__PURE__*/ core.$constructor(\"ZodULID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodULID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function ulid(params) {\n    return core._ulid(ZodULID, params);\n}\nexport const ZodXID = /*@__PURE__*/ core.$constructor(\"ZodXID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodXID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function xid(params) {\n    return core._xid(ZodXID, params);\n}\nexport const ZodKSUID = /*@__PURE__*/ core.$constructor(\"ZodKSUID\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodKSUID.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function ksuid(params) {\n    return core._ksuid(ZodKSUID, params);\n}\nexport const ZodIPv4 = /*@__PURE__*/ core.$constructor(\"ZodIPv4\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodIPv4.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function ipv4(params) {\n    return core._ipv4(ZodIPv4, params);\n}\nexport const ZodMAC = /*@__PURE__*/ core.$constructor(\"ZodMAC\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodMAC.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function mac(params) {\n    return core._mac(ZodMAC, params);\n}\nexport const ZodIPv6 = /*@__PURE__*/ core.$constructor(\"ZodIPv6\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodIPv6.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function ipv6(params) {\n    return core._ipv6(ZodIPv6, params);\n}\nexport const ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv4\", (inst, def) => {\n    core.$ZodCIDRv4.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function cidrv4(params) {\n    return core._cidrv4(ZodCIDRv4, params);\n}\nexport const ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv6\", (inst, def) => {\n    core.$ZodCIDRv6.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function cidrv6(params) {\n    return core._cidrv6(ZodCIDRv6, params);\n}\nexport const ZodBase64 = /*@__PURE__*/ core.$constructor(\"ZodBase64\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodBase64.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function base64(params) {\n    return core._base64(ZodBase64, params);\n}\nexport const ZodBase64URL = /*@__PURE__*/ core.$constructor(\"ZodBase64URL\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodBase64URL.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function base64url(params) {\n    return core._base64url(ZodBase64URL, params);\n}\nexport const ZodE164 = /*@__PURE__*/ core.$constructor(\"ZodE164\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodE164.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function e164(params) {\n    return core._e164(ZodE164, params);\n}\nexport const ZodJWT = /*@__PURE__*/ core.$constructor(\"ZodJWT\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodJWT.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function jwt(params) {\n    return core._jwt(ZodJWT, params);\n}\nexport const ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodCustomStringFormat\", (inst, def) => {\n    // ZodStringFormat.init(inst, def);\n    core.$ZodCustomStringFormat.init(inst, def);\n    ZodStringFormat.init(inst, def);\n});\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n    return core._stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);\n}\nexport function hostname(_params) {\n    return core._stringFormat(ZodCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\nexport function hex(_params) {\n    return core._stringFormat(ZodCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\nexport function hash(alg, params) {\n    const enc = params?.enc ?? \"hex\";\n    const format = `${alg}_${enc}`;\n    const regex = core.regexes[format];\n    if (!regex)\n        throw new Error(`Unrecognized hash format: ${format}`);\n    return core._stringFormat(ZodCustomStringFormat, format, regex, params);\n}\nexport const ZodNumber = /*@__PURE__*/ core.$constructor(\"ZodNumber\", (inst, def) => {\n    core.$ZodNumber.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);\n    _installLazyMethods(inst, \"ZodNumber\", {\n        gt(value, params) {\n            return this.check(checks.gt(value, params));\n        },\n        gte(value, params) {\n            return this.check(checks.gte(value, params));\n        },\n        min(value, params) {\n            return this.check(checks.gte(value, params));\n        },\n        lt(value, params) {\n            return this.check(checks.lt(value, params));\n        },\n        lte(value, params) {\n            return this.check(checks.lte(value, params));\n        },\n        max(value, params) {\n            return this.check(checks.lte(value, params));\n        },\n        int(params) {\n            return this.check(int(params));\n        },\n        safe(params) {\n            return this.check(int(params));\n        },\n        positive(params) {\n            return this.check(checks.gt(0, params));\n        },\n        nonnegative(params) {\n            return this.check(checks.gte(0, params));\n        },\n        negative(params) {\n            return this.check(checks.lt(0, params));\n        },\n        nonpositive(params) {\n            return this.check(checks.lte(0, params));\n        },\n        multipleOf(value, params) {\n            return this.check(checks.multipleOf(value, params));\n        },\n        step(value, params) {\n            return this.check(checks.multipleOf(value, params));\n        },\n        finite() {\n            return this;\n        },\n    });\n    const bag = inst._zod.bag;\n    inst.minValue =\n        Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;\n    inst.maxValue =\n        Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;\n    inst.isInt = (bag.format ?? \"\").includes(\"int\") || Number.isSafeInteger(bag.multipleOf ?? 0.5);\n    inst.isFinite = true;\n    inst.format = bag.format ?? null;\n});\nexport function number(params) {\n    return core._number(ZodNumber, params);\n}\nexport const ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodNumberFormat\", (inst, def) => {\n    core.$ZodNumberFormat.init(inst, def);\n    ZodNumber.init(inst, def);\n});\nexport function int(params) {\n    return core._int(ZodNumberFormat, params);\n}\nexport function float32(params) {\n    return core._float32(ZodNumberFormat, params);\n}\nexport function float64(params) {\n    return core._float64(ZodNumberFormat, params);\n}\nexport function int32(params) {\n    return core._int32(ZodNumberFormat, params);\n}\nexport function uint32(params) {\n    return core._uint32(ZodNumberFormat, params);\n}\nexport const ZodBoolean = /*@__PURE__*/ core.$constructor(\"ZodBoolean\", (inst, def) => {\n    core.$ZodBoolean.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.booleanProcessor(inst, ctx, json, params);\n});\nexport function boolean(params) {\n    return core._boolean(ZodBoolean, params);\n}\nexport const ZodBigInt = /*@__PURE__*/ core.$constructor(\"ZodBigInt\", (inst, def) => {\n    core.$ZodBigInt.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);\n    inst.gte = (value, params) => inst.check(checks.gte(value, params));\n    inst.min = (value, params) => inst.check(checks.gte(value, params));\n    inst.gt = (value, params) => inst.check(checks.gt(value, params));\n    inst.gte = (value, params) => inst.check(checks.gte(value, params));\n    inst.min = (value, params) => inst.check(checks.gte(value, params));\n    inst.lt = (value, params) => inst.check(checks.lt(value, params));\n    inst.lte = (value, params) => inst.check(checks.lte(value, params));\n    inst.max = (value, params) => inst.check(checks.lte(value, params));\n    inst.positive = (params) => inst.check(checks.gt(BigInt(0), params));\n    inst.negative = (params) => inst.check(checks.lt(BigInt(0), params));\n    inst.nonpositive = (params) => inst.check(checks.lte(BigInt(0), params));\n    inst.nonnegative = (params) => inst.check(checks.gte(BigInt(0), params));\n    inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n    const bag = inst._zod.bag;\n    inst.minValue = bag.minimum ?? null;\n    inst.maxValue = bag.maximum ?? null;\n    inst.format = bag.format ?? null;\n});\nexport function bigint(params) {\n    return core._bigint(ZodBigInt, params);\n}\nexport const ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodBigIntFormat\", (inst, def) => {\n    core.$ZodBigIntFormat.init(inst, def);\n    ZodBigInt.init(inst, def);\n});\n// int64\nexport function int64(params) {\n    return core._int64(ZodBigIntFormat, params);\n}\n// uint64\nexport function uint64(params) {\n    return core._uint64(ZodBigIntFormat, params);\n}\nexport const ZodSymbol = /*@__PURE__*/ core.$constructor(\"ZodSymbol\", (inst, def) => {\n    core.$ZodSymbol.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.symbolProcessor(inst, ctx, json, params);\n});\nexport function symbol(params) {\n    return core._symbol(ZodSymbol, params);\n}\nexport const ZodUndefined = /*@__PURE__*/ core.$constructor(\"ZodUndefined\", (inst, def) => {\n    core.$ZodUndefined.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.undefinedProcessor(inst, ctx, json, params);\n});\nfunction _undefined(params) {\n    return core._undefined(ZodUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodNull = /*@__PURE__*/ core.$constructor(\"ZodNull\", (inst, def) => {\n    core.$ZodNull.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.nullProcessor(inst, ctx, json, params);\n});\nfunction _null(params) {\n    return core._null(ZodNull, params);\n}\nexport { _null as null };\nexport const ZodAny = /*@__PURE__*/ core.$constructor(\"ZodAny\", (inst, def) => {\n    core.$ZodAny.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.anyProcessor(inst, ctx, json, params);\n});\nexport function any() {\n    return core._any(ZodAny);\n}\nexport const ZodUnknown = /*@__PURE__*/ core.$constructor(\"ZodUnknown\", (inst, def) => {\n    core.$ZodUnknown.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.unknownProcessor(inst, ctx, json, params);\n});\nexport function unknown() {\n    return core._unknown(ZodUnknown);\n}\nexport const ZodNever = /*@__PURE__*/ core.$constructor(\"ZodNever\", (inst, def) => {\n    core.$ZodNever.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.neverProcessor(inst, ctx, json, params);\n});\nexport function never(params) {\n    return core._never(ZodNever, params);\n}\nexport const ZodVoid = /*@__PURE__*/ core.$constructor(\"ZodVoid\", (inst, def) => {\n    core.$ZodVoid.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.voidProcessor(inst, ctx, json, params);\n});\nfunction _void(params) {\n    return core._void(ZodVoid, params);\n}\nexport { _void as void };\nexport const ZodDate = /*@__PURE__*/ core.$constructor(\"ZodDate\", (inst, def) => {\n    core.$ZodDate.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);\n    inst.min = (value, params) => inst.check(checks.gte(value, params));\n    inst.max = (value, params) => inst.check(checks.lte(value, params));\n    const c = inst._zod.bag;\n    inst.minDate = c.minimum ? new Date(c.minimum) : null;\n    inst.maxDate = c.maximum ? new Date(c.maximum) : null;\n});\nexport function date(params) {\n    return core._date(ZodDate, params);\n}\nexport const ZodArray = /*@__PURE__*/ core.$constructor(\"ZodArray\", (inst, def) => {\n    core.$ZodArray.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.arrayProcessor(inst, ctx, json, params);\n    inst.element = def.element;\n    _installLazyMethods(inst, \"ZodArray\", {\n        min(n, params) {\n            return this.check(checks.minLength(n, params));\n        },\n        nonempty(params) {\n            return this.check(checks.minLength(1, params));\n        },\n        max(n, params) {\n            return this.check(checks.maxLength(n, params));\n        },\n        length(n, params) {\n            return this.check(checks.length(n, params));\n        },\n        unwrap() {\n            return this.element;\n        },\n    });\n});\nexport function array(element, params) {\n    return core._array(ZodArray, element, params);\n}\n// .keyof\nexport function keyof(schema) {\n    const shape = schema._zod.def.shape;\n    return _enum(Object.keys(shape));\n}\nexport const ZodObject = /*@__PURE__*/ core.$constructor(\"ZodObject\", (inst, def) => {\n    core.$ZodObjectJIT.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.objectProcessor(inst, ctx, json, params);\n    util.defineLazy(inst, \"shape\", () => {\n        return def.shape;\n    });\n    _installLazyMethods(inst, \"ZodObject\", {\n        keyof() {\n            return _enum(Object.keys(this._zod.def.shape));\n        },\n        catchall(catchall) {\n            return this.clone({ ...this._zod.def, catchall: catchall });\n        },\n        passthrough() {\n            return this.clone({ ...this._zod.def, catchall: unknown() });\n        },\n        loose() {\n            return this.clone({ ...this._zod.def, catchall: unknown() });\n        },\n        strict() {\n            return this.clone({ ...this._zod.def, catchall: never() });\n        },\n        strip() {\n            return this.clone({ ...this._zod.def, catchall: undefined });\n        },\n        extend(incoming) {\n            return util.extend(this, incoming);\n        },\n        safeExtend(incoming) {\n            return util.safeExtend(this, incoming);\n        },\n        merge(other) {\n            return util.merge(this, other);\n        },\n        pick(mask) {\n            return util.pick(this, mask);\n        },\n        omit(mask) {\n            return util.omit(this, mask);\n        },\n        partial(...args) {\n            return util.partial(ZodOptional, this, args[0]);\n        },\n        required(...args) {\n            return util.required(ZodNonOptional, this, args[0]);\n        },\n    });\n});\nexport function object(shape, params) {\n    const def = {\n        type: \"object\",\n        shape: shape ?? {},\n        ...util.normalizeParams(params),\n    };\n    return new ZodObject(def);\n}\n// strictObject\nexport function strictObject(shape, params) {\n    return new ZodObject({\n        type: \"object\",\n        shape,\n        catchall: never(),\n        ...util.normalizeParams(params),\n    });\n}\n// looseObject\nexport function looseObject(shape, params) {\n    return new ZodObject({\n        type: \"object\",\n        shape,\n        catchall: unknown(),\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodUnion = /*@__PURE__*/ core.$constructor(\"ZodUnion\", (inst, def) => {\n    core.$ZodUnion.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n    inst.options = def.options;\n});\nexport function union(options, params) {\n    return new ZodUnion({\n        type: \"union\",\n        options: options,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodXor = /*@__PURE__*/ core.$constructor(\"ZodXor\", (inst, def) => {\n    ZodUnion.init(inst, def);\n    core.$ZodXor.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n    inst.options = def.options;\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n    return new ZodXor({\n        type: \"union\",\n        options: options,\n        inclusive: false,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodDiscriminatedUnion\", (inst, def) => {\n    ZodUnion.init(inst, def);\n    core.$ZodDiscriminatedUnion.init(inst, def);\n});\nexport function discriminatedUnion(discriminator, options, params) {\n    // const [options, params] = args;\n    return new ZodDiscriminatedUnion({\n        type: \"union\",\n        options,\n        discriminator,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodIntersection = /*@__PURE__*/ core.$constructor(\"ZodIntersection\", (inst, def) => {\n    core.$ZodIntersection.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.intersectionProcessor(inst, ctx, json, params);\n});\nexport function intersection(left, right) {\n    return new ZodIntersection({\n        type: \"intersection\",\n        left: left,\n        right: right,\n    });\n}\nexport const ZodTuple = /*@__PURE__*/ core.$constructor(\"ZodTuple\", (inst, def) => {\n    core.$ZodTuple.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.tupleProcessor(inst, ctx, json, params);\n    inst.rest = (rest) => inst.clone({\n        ...inst._zod.def,\n        rest: rest,\n    });\n});\nexport function tuple(items, _paramsOrRest, _params) {\n    const hasRest = _paramsOrRest instanceof core.$ZodType;\n    const params = hasRest ? _params : _paramsOrRest;\n    const rest = hasRest ? _paramsOrRest : null;\n    return new ZodTuple({\n        type: \"tuple\",\n        items: items,\n        rest,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodRecord = /*@__PURE__*/ core.$constructor(\"ZodRecord\", (inst, def) => {\n    core.$ZodRecord.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.recordProcessor(inst, ctx, json, params);\n    inst.keyType = def.keyType;\n    inst.valueType = def.valueType;\n});\nexport function record(keyType, valueType, params) {\n    // v3-compat: z.record(valueType, params?) \u2014 defaults keyType to z.string()\n    if (!valueType || !valueType._zod) {\n        return new ZodRecord({\n            type: \"record\",\n            keyType: string(),\n            valueType: keyType,\n            ...util.normalizeParams(valueType),\n        });\n    }\n    return new ZodRecord({\n        type: \"record\",\n        keyType,\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\n// type alksjf = core.output<core.$ZodRecordKey>;\nexport function partialRecord(keyType, valueType, params) {\n    const k = core.clone(keyType);\n    k._zod.values = undefined;\n    return new ZodRecord({\n        type: \"record\",\n        keyType: k,\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\nexport function looseRecord(keyType, valueType, params) {\n    return new ZodRecord({\n        type: \"record\",\n        keyType,\n        valueType: valueType,\n        mode: \"loose\",\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMap = /*@__PURE__*/ core.$constructor(\"ZodMap\", (inst, def) => {\n    core.$ZodMap.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.mapProcessor(inst, ctx, json, params);\n    inst.keyType = def.keyType;\n    inst.valueType = def.valueType;\n    inst.min = (...args) => inst.check(core._minSize(...args));\n    inst.nonempty = (params) => inst.check(core._minSize(1, params));\n    inst.max = (...args) => inst.check(core._maxSize(...args));\n    inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function map(keyType, valueType, params) {\n    return new ZodMap({\n        type: \"map\",\n        keyType: keyType,\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodSet = /*@__PURE__*/ core.$constructor(\"ZodSet\", (inst, def) => {\n    core.$ZodSet.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.setProcessor(inst, ctx, json, params);\n    inst.min = (...args) => inst.check(core._minSize(...args));\n    inst.nonempty = (params) => inst.check(core._minSize(1, params));\n    inst.max = (...args) => inst.check(core._maxSize(...args));\n    inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function set(valueType, params) {\n    return new ZodSet({\n        type: \"set\",\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodEnum = /*@__PURE__*/ core.$constructor(\"ZodEnum\", (inst, def) => {\n    core.$ZodEnum.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);\n    inst.enum = def.entries;\n    inst.options = Object.values(def.entries);\n    const keys = new Set(Object.keys(def.entries));\n    inst.extract = (values, params) => {\n        const newEntries = {};\n        for (const value of values) {\n            if (keys.has(value)) {\n                newEntries[value] = def.entries[value];\n            }\n            else\n                throw new Error(`Key ${value} not found in enum`);\n        }\n        return new ZodEnum({\n            ...def,\n            checks: [],\n            ...util.normalizeParams(params),\n            entries: newEntries,\n        });\n    };\n    inst.exclude = (values, params) => {\n        const newEntries = { ...def.entries };\n        for (const value of values) {\n            if (keys.has(value)) {\n                delete newEntries[value];\n            }\n            else\n                throw new Error(`Key ${value} not found in enum`);\n        }\n        return new ZodEnum({\n            ...def,\n            checks: [],\n            ...util.normalizeParams(params),\n            entries: newEntries,\n        });\n    };\n});\nfunction _enum(values, params) {\n    const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n    return new ZodEnum({\n        type: \"enum\",\n        entries,\n        ...util.normalizeParams(params),\n    });\n}\nexport { _enum as enum };\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n    return new ZodEnum({\n        type: \"enum\",\n        entries,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodLiteral = /*@__PURE__*/ core.$constructor(\"ZodLiteral\", (inst, def) => {\n    core.$ZodLiteral.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.literalProcessor(inst, ctx, json, params);\n    inst.values = new Set(def.values);\n    Object.defineProperty(inst, \"value\", {\n        get() {\n            if (def.values.length > 1) {\n                throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");\n            }\n            return def.values[0];\n        },\n    });\n});\nexport function literal(value, params) {\n    return new ZodLiteral({\n        type: \"literal\",\n        values: Array.isArray(value) ? value : [value],\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodFile = /*@__PURE__*/ core.$constructor(\"ZodFile\", (inst, def) => {\n    core.$ZodFile.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.fileProcessor(inst, ctx, json, params);\n    inst.min = (size, params) => inst.check(core._minSize(size, params));\n    inst.max = (size, params) => inst.check(core._maxSize(size, params));\n    inst.mime = (types, params) => inst.check(core._mime(Array.isArray(types) ? types : [types], params));\n});\nexport function file(params) {\n    return core._file(ZodFile, params);\n}\nexport const ZodTransform = /*@__PURE__*/ core.$constructor(\"ZodTransform\", (inst, def) => {\n    core.$ZodTransform.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.transformProcessor(inst, ctx, json, params);\n    inst._zod.parse = (payload, _ctx) => {\n        if (_ctx.direction === \"backward\") {\n            throw new core.$ZodEncodeError(inst.constructor.name);\n        }\n        payload.addIssue = (issue) => {\n            if (typeof issue === \"string\") {\n                payload.issues.push(util.issue(issue, payload.value, def));\n            }\n            else {\n                // for Zod 3 backwards compatibility\n                const _issue = issue;\n                if (_issue.fatal)\n                    _issue.continue = false;\n                _issue.code ?? (_issue.code = \"custom\");\n                _issue.input ?? (_issue.input = payload.value);\n                _issue.inst ?? (_issue.inst = inst);\n                // _issue.continue ??= true;\n                payload.issues.push(util.issue(_issue));\n            }\n        };\n        const output = def.transform(payload.value, payload);\n        if (output instanceof Promise) {\n            return output.then((output) => {\n                payload.value = output;\n                payload.fallback = true;\n                return payload;\n            });\n        }\n        payload.value = output;\n        payload.fallback = true;\n        return payload;\n    };\n});\nexport function transform(fn) {\n    return new ZodTransform({\n        type: \"transform\",\n        transform: fn,\n    });\n}\nexport const ZodOptional = /*@__PURE__*/ core.$constructor(\"ZodOptional\", (inst, def) => {\n    core.$ZodOptional.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function optional(innerType) {\n    return new ZodOptional({\n        type: \"optional\",\n        innerType: innerType,\n    });\n}\nexport const ZodExactOptional = /*@__PURE__*/ core.$constructor(\"ZodExactOptional\", (inst, def) => {\n    core.$ZodExactOptional.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function exactOptional(innerType) {\n    return new ZodExactOptional({\n        type: \"optional\",\n        innerType: innerType,\n    });\n}\nexport const ZodNullable = /*@__PURE__*/ core.$constructor(\"ZodNullable\", (inst, def) => {\n    core.$ZodNullable.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.nullableProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nullable(innerType) {\n    return new ZodNullable({\n        type: \"nullable\",\n        innerType: innerType,\n    });\n}\n// nullish\nexport function nullish(innerType) {\n    return optional(nullable(innerType));\n}\nexport const ZodDefault = /*@__PURE__*/ core.$constructor(\"ZodDefault\", (inst, def) => {\n    core.$ZodDefault.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.defaultProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n    inst.removeDefault = inst.unwrap;\n});\nexport function _default(innerType, defaultValue) {\n    return new ZodDefault({\n        type: \"default\",\n        innerType: innerType,\n        get defaultValue() {\n            return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n        },\n    });\n}\nexport const ZodPrefault = /*@__PURE__*/ core.$constructor(\"ZodPrefault\", (inst, def) => {\n    core.$ZodPrefault.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.prefaultProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function prefault(innerType, defaultValue) {\n    return new ZodPrefault({\n        type: \"prefault\",\n        innerType: innerType,\n        get defaultValue() {\n            return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n        },\n    });\n}\nexport const ZodNonOptional = /*@__PURE__*/ core.$constructor(\"ZodNonOptional\", (inst, def) => {\n    core.$ZodNonOptional.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.nonoptionalProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nonoptional(innerType, params) {\n    return new ZodNonOptional({\n        type: \"nonoptional\",\n        innerType: innerType,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodSuccess = /*@__PURE__*/ core.$constructor(\"ZodSuccess\", (inst, def) => {\n    core.$ZodSuccess.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.successProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function success(innerType) {\n    return new ZodSuccess({\n        type: \"success\",\n        innerType: innerType,\n    });\n}\nexport const ZodCatch = /*@__PURE__*/ core.$constructor(\"ZodCatch\", (inst, def) => {\n    core.$ZodCatch.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.catchProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n    inst.removeCatch = inst.unwrap;\n});\nfunction _catch(innerType, catchValue) {\n    return new ZodCatch({\n        type: \"catch\",\n        innerType: innerType,\n        catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n    });\n}\nexport { _catch as catch };\nexport const ZodNaN = /*@__PURE__*/ core.$constructor(\"ZodNaN\", (inst, def) => {\n    core.$ZodNaN.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.nanProcessor(inst, ctx, json, params);\n});\nexport function nan(params) {\n    return core._nan(ZodNaN, params);\n}\nexport const ZodPipe = /*@__PURE__*/ core.$constructor(\"ZodPipe\", (inst, def) => {\n    core.$ZodPipe.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.pipeProcessor(inst, ctx, json, params);\n    inst.in = def.in;\n    inst.out = def.out;\n});\nexport function pipe(in_, out) {\n    return new ZodPipe({\n        type: \"pipe\",\n        in: in_,\n        out: out,\n        // ...util.normalizeParams(params),\n    });\n}\nexport const ZodCodec = /*@__PURE__*/ core.$constructor(\"ZodCodec\", (inst, def) => {\n    ZodPipe.init(inst, def);\n    core.$ZodCodec.init(inst, def);\n});\nexport function codec(in_, out, params) {\n    return new ZodCodec({\n        type: \"pipe\",\n        in: in_,\n        out: out,\n        transform: params.decode,\n        reverseTransform: params.encode,\n    });\n}\nexport function invertCodec(codec) {\n    const def = codec._zod.def;\n    return new ZodCodec({\n        type: \"pipe\",\n        in: def.out,\n        out: def.in,\n        transform: def.reverseTransform,\n        reverseTransform: def.transform,\n    });\n}\nexport const ZodPreprocess = /*@__PURE__*/ core.$constructor(\"ZodPreprocess\", (inst, def) => {\n    ZodPipe.init(inst, def);\n    core.$ZodPreprocess.init(inst, def);\n});\nexport const ZodReadonly = /*@__PURE__*/ core.$constructor(\"ZodReadonly\", (inst, def) => {\n    core.$ZodReadonly.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.readonlyProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function readonly(innerType) {\n    return new ZodReadonly({\n        type: \"readonly\",\n        innerType: innerType,\n    });\n}\nexport const ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodTemplateLiteral\", (inst, def) => {\n    core.$ZodTemplateLiteral.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.templateLiteralProcessor(inst, ctx, json, params);\n});\nexport function templateLiteral(parts, params) {\n    return new ZodTemplateLiteral({\n        type: \"template_literal\",\n        parts,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodLazy = /*@__PURE__*/ core.$constructor(\"ZodLazy\", (inst, def) => {\n    core.$ZodLazy.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.lazyProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.getter();\n});\nexport function lazy(getter) {\n    return new ZodLazy({\n        type: \"lazy\",\n        getter: getter,\n    });\n}\nexport const ZodPromise = /*@__PURE__*/ core.$constructor(\"ZodPromise\", (inst, def) => {\n    core.$ZodPromise.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.promiseProcessor(inst, ctx, json, params);\n    inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function promise(innerType) {\n    return new ZodPromise({\n        type: \"promise\",\n        innerType: innerType,\n    });\n}\nexport const ZodFunction = /*@__PURE__*/ core.$constructor(\"ZodFunction\", (inst, def) => {\n    core.$ZodFunction.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.functionProcessor(inst, ctx, json, params);\n});\nexport function _function(params) {\n    return new ZodFunction({\n        type: \"function\",\n        input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n        output: params?.output ?? unknown(),\n    });\n}\nexport { _function as function };\nexport const ZodCustom = /*@__PURE__*/ core.$constructor(\"ZodCustom\", (inst, def) => {\n    core.$ZodCustom.init(inst, def);\n    ZodType.init(inst, def);\n    inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);\n});\n// custom checks\nexport function check(fn) {\n    const ch = new core.$ZodCheck({\n        check: \"custom\",\n        // ...util.normalizeParams(params),\n    });\n    ch._zod.check = fn;\n    return ch;\n}\nexport function custom(fn, _params) {\n    return core._custom(ZodCustom, fn ?? (() => true), _params);\n}\nexport function refine(fn, _params = {}) {\n    return core._refine(ZodCustom, fn, _params);\n}\n// superRefine\nexport function superRefine(fn, params) {\n    return core._superRefine(fn, params);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\nfunction _instanceof(cls, params = {}) {\n    const inst = new ZodCustom({\n        type: \"custom\",\n        check: \"custom\",\n        fn: (data) => data instanceof cls,\n        abort: true,\n        ...util.normalizeParams(params),\n    });\n    inst._zod.bag.Class = cls;\n    // Override check to emit invalid_type instead of custom\n    inst._zod.check = (payload) => {\n        if (!(payload.value instanceof cls)) {\n            payload.issues.push({\n                code: \"invalid_type\",\n                expected: cls.name,\n                input: payload.value,\n                inst,\n                path: [...(inst._zod.def.path ?? [])],\n            });\n        }\n    };\n    return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n    Codec: ZodCodec,\n    Boolean: ZodBoolean,\n    String: ZodString,\n}, ...args);\nexport function json(params) {\n    const jsonSchema = lazy(() => {\n        return union([string(params), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n    });\n    return jsonSchema;\n}\n// preprocess\nexport function preprocess(fn, schema) {\n    return new ZodPreprocess({\n        type: \"pipe\",\n        in: transform(fn),\n        out: schema,\n    });\n}\n", "export { _lt as lt, _lte as lte, _gt as gt, _gte as gte, _positive as positive, _negative as negative, _nonpositive as nonpositive, _nonnegative as nonnegative, _multipleOf as multipleOf, _maxSize as maxSize, _minSize as minSize, _size as size, _maxLength as maxLength, _minLength as minLength, _length as length, _regex as regex, _lowercase as lowercase, _uppercase as uppercase, _includes as includes, _startsWith as startsWith, _endsWith as endsWith, _property as property, _mime as mime, _overwrite as overwrite, _normalize as normalize, _trim as trim, _toLowerCase as toLowerCase, _toUpperCase as toUpperCase, _slugify as slugify, } from \"../core/index.js\";\n", "import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport const ZodISODateTime = /*@__PURE__*/ core.$constructor(\"ZodISODateTime\", (inst, def) => {\n    core.$ZodISODateTime.init(inst, def);\n    schemas.ZodStringFormat.init(inst, def);\n});\nexport function datetime(params) {\n    return core._isoDateTime(ZodISODateTime, params);\n}\nexport const ZodISODate = /*@__PURE__*/ core.$constructor(\"ZodISODate\", (inst, def) => {\n    core.$ZodISODate.init(inst, def);\n    schemas.ZodStringFormat.init(inst, def);\n});\nexport function date(params) {\n    return core._isoDate(ZodISODate, params);\n}\nexport const ZodISOTime = /*@__PURE__*/ core.$constructor(\"ZodISOTime\", (inst, def) => {\n    core.$ZodISOTime.init(inst, def);\n    schemas.ZodStringFormat.init(inst, def);\n});\nexport function time(params) {\n    return core._isoTime(ZodISOTime, params);\n}\nexport const ZodISODuration = /*@__PURE__*/ core.$constructor(\"ZodISODuration\", (inst, def) => {\n    core.$ZodISODuration.init(inst, def);\n    schemas.ZodStringFormat.init(inst, def);\n});\nexport function duration(params) {\n    return core._isoDuration(ZodISODuration, params);\n}\n", "import * as core from \"../core/index.js\";\nimport { $ZodError } from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nconst initializer = (inst, issues) => {\n    $ZodError.init(inst, issues);\n    inst.name = \"ZodError\";\n    Object.defineProperties(inst, {\n        format: {\n            value: (mapper) => core.formatError(inst, mapper),\n            // enumerable: false,\n        },\n        flatten: {\n            value: (mapper) => core.flattenError(inst, mapper),\n            // enumerable: false,\n        },\n        addIssue: {\n            value: (issue) => {\n                inst.issues.push(issue);\n                inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n            },\n            // enumerable: false,\n        },\n        addIssues: {\n            value: (issues) => {\n                inst.issues.push(...issues);\n                inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n            },\n            // enumerable: false,\n        },\n        isEmpty: {\n            get() {\n                return inst.issues.length === 0;\n            },\n            // enumerable: false,\n        },\n    });\n    // Object.defineProperty(inst, \"isEmpty\", {\n    //   get() {\n    //     return inst.issues.length === 0;\n    //   },\n    // });\n};\nexport const ZodError = /*@__PURE__*/ core.$constructor(\"ZodError\", initializer);\nexport const ZodRealError = /*@__PURE__*/ core.$constructor(\"ZodError\", initializer, {\n    Parent: Error,\n});\n// /** @deprecated Use `z.core.$ZodErrorMapCtx` instead. */\n// export type ErrorMapCtx = core.$ZodErrorMapCtx;\n", "import * as core from \"../core/index.js\";\nimport { ZodRealError } from \"./errors.js\";\nexport const parse = /* @__PURE__ */ core._parse(ZodRealError);\nexport const parseAsync = /* @__PURE__ */ core._parseAsync(ZodRealError);\nexport const safeParse = /* @__PURE__ */ core._safeParse(ZodRealError);\nexport const safeParseAsync = /* @__PURE__ */ core._safeParseAsync(ZodRealError);\n// Codec functions\nexport const encode = /* @__PURE__ */ core._encode(ZodRealError);\nexport const decode = /* @__PURE__ */ core._decode(ZodRealError);\nexport const encodeAsync = /* @__PURE__ */ core._encodeAsync(ZodRealError);\nexport const decodeAsync = /* @__PURE__ */ core._decodeAsync(ZodRealError);\nexport const safeEncode = /* @__PURE__ */ core._safeEncode(ZodRealError);\nexport const safeDecode = /* @__PURE__ */ core._safeDecode(ZodRealError);\nexport const safeEncodeAsync = /* @__PURE__ */ core._safeEncodeAsync(ZodRealError);\nexport const safeDecodeAsync = /* @__PURE__ */ core._safeDecodeAsync(ZodRealError);\n", "// Zod 3 compat layer\nimport * as core from \"../core/index.js\";\n/** @deprecated Use the raw string literal codes instead, e.g. \"invalid_type\". */\nexport const ZodIssueCode = {\n    invalid_type: \"invalid_type\",\n    too_big: \"too_big\",\n    too_small: \"too_small\",\n    invalid_format: \"invalid_format\",\n    not_multiple_of: \"not_multiple_of\",\n    unrecognized_keys: \"unrecognized_keys\",\n    invalid_union: \"invalid_union\",\n    invalid_key: \"invalid_key\",\n    invalid_element: \"invalid_element\",\n    invalid_value: \"invalid_value\",\n    custom: \"custom\",\n};\nexport { $brand, config } from \"../core/index.js\";\n/** @deprecated Use `z.config(params)` instead. */\nexport function setErrorMap(map) {\n    core.config({\n        customError: map,\n    });\n}\n/** @deprecated Use `z.config()` instead. */\nexport function getErrorMap() {\n    return core.config().customError;\n}\n/** @deprecated Do not use. Stub definition, only included for zod-to-json-schema compatibility. */\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n", "import { globalRegistry } from \"../core/registries.js\";\nimport * as _checks from \"./checks.js\";\nimport * as _iso from \"./iso.js\";\nimport * as _schemas from \"./schemas.js\";\n// Local z object to avoid circular dependency with ../index.js\nconst z = {\n    ..._schemas,\n    ..._checks,\n    iso: _iso,\n};\n// Keys that are recognized and handled by the conversion logic\nconst RECOGNIZED_KEYS = /*@__PURE__*/ new Set([\n    // Schema identification\n    \"$schema\",\n    \"$ref\",\n    \"$defs\",\n    \"definitions\",\n    // Core schema keywords\n    \"$id\",\n    \"id\",\n    \"$comment\",\n    \"$anchor\",\n    \"$vocabulary\",\n    \"$dynamicRef\",\n    \"$dynamicAnchor\",\n    // Type\n    \"type\",\n    \"enum\",\n    \"const\",\n    // Composition\n    \"anyOf\",\n    \"oneOf\",\n    \"allOf\",\n    \"not\",\n    // Object\n    \"properties\",\n    \"required\",\n    \"additionalProperties\",\n    \"patternProperties\",\n    \"propertyNames\",\n    \"minProperties\",\n    \"maxProperties\",\n    // Array\n    \"items\",\n    \"prefixItems\",\n    \"additionalItems\",\n    \"minItems\",\n    \"maxItems\",\n    \"uniqueItems\",\n    \"contains\",\n    \"minContains\",\n    \"maxContains\",\n    // String\n    \"minLength\",\n    \"maxLength\",\n    \"pattern\",\n    \"format\",\n    // Number\n    \"minimum\",\n    \"maximum\",\n    \"exclusiveMinimum\",\n    \"exclusiveMaximum\",\n    \"multipleOf\",\n    // Already handled metadata\n    \"description\",\n    \"default\",\n    // Content\n    \"contentEncoding\",\n    \"contentMediaType\",\n    \"contentSchema\",\n    // Unsupported (error-throwing)\n    \"unevaluatedItems\",\n    \"unevaluatedProperties\",\n    \"if\",\n    \"then\",\n    \"else\",\n    \"dependentSchemas\",\n    \"dependentRequired\",\n    // OpenAPI\n    \"nullable\",\n    \"readOnly\",\n]);\nfunction detectVersion(schema, defaultTarget) {\n    const $schema = schema.$schema;\n    if ($schema === \"https://json-schema.org/draft/2020-12/schema\") {\n        return \"draft-2020-12\";\n    }\n    if ($schema === \"http://json-schema.org/draft-07/schema#\") {\n        return \"draft-7\";\n    }\n    if ($schema === \"http://json-schema.org/draft-04/schema#\") {\n        return \"draft-4\";\n    }\n    // Use defaultTarget if provided, otherwise default to draft-2020-12\n    return defaultTarget ?? \"draft-2020-12\";\n}\nfunction resolveRef(ref, ctx) {\n    if (!ref.startsWith(\"#\")) {\n        throw new Error(\"External $ref is not supported, only local refs (#/...) are allowed\");\n    }\n    const path = ref.slice(1).split(\"/\").filter(Boolean);\n    // Handle root reference \"#\"\n    if (path.length === 0) {\n        return ctx.rootSchema;\n    }\n    const defsKey = ctx.version === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n    if (path[0] === defsKey) {\n        const key = path[1];\n        if (!key || !ctx.defs[key]) {\n            throw new Error(`Reference not found: ${ref}`);\n        }\n        return ctx.defs[key];\n    }\n    throw new Error(`Reference not found: ${ref}`);\n}\nfunction convertBaseSchema(schema, ctx) {\n    // Handle unsupported features\n    if (schema.not !== undefined) {\n        // Special case: { not: {} } represents never\n        if (typeof schema.not === \"object\" && Object.keys(schema.not).length === 0) {\n            return z.never();\n        }\n        throw new Error(\"not is not supported in Zod (except { not: {} } for never)\");\n    }\n    if (schema.unevaluatedItems !== undefined) {\n        throw new Error(\"unevaluatedItems is not supported\");\n    }\n    if (schema.unevaluatedProperties !== undefined) {\n        throw new Error(\"unevaluatedProperties is not supported\");\n    }\n    if (schema.if !== undefined || schema.then !== undefined || schema.else !== undefined) {\n        throw new Error(\"Conditional schemas (if/then/else) are not supported\");\n    }\n    if (schema.dependentSchemas !== undefined || schema.dependentRequired !== undefined) {\n        throw new Error(\"dependentSchemas and dependentRequired are not supported\");\n    }\n    // Handle $ref\n    if (schema.$ref) {\n        const refPath = schema.$ref;\n        if (ctx.refs.has(refPath)) {\n            return ctx.refs.get(refPath);\n        }\n        if (ctx.processing.has(refPath)) {\n            // Circular reference - use lazy\n            return z.lazy(() => {\n                if (!ctx.refs.has(refPath)) {\n                    throw new Error(`Circular reference not resolved: ${refPath}`);\n                }\n                return ctx.refs.get(refPath);\n            });\n        }\n        ctx.processing.add(refPath);\n        const resolved = resolveRef(refPath, ctx);\n        const zodSchema = convertSchema(resolved, ctx);\n        ctx.refs.set(refPath, zodSchema);\n        ctx.processing.delete(refPath);\n        return zodSchema;\n    }\n    // Handle enum\n    if (schema.enum !== undefined) {\n        const enumValues = schema.enum;\n        // Special case: OpenAPI 3.0 null representation { type: \"string\", nullable: true, enum: [null] }\n        if (ctx.version === \"openapi-3.0\" &&\n            schema.nullable === true &&\n            enumValues.length === 1 &&\n            enumValues[0] === null) {\n            return z.null();\n        }\n        if (enumValues.length === 0) {\n            return z.never();\n        }\n        if (enumValues.length === 1) {\n            return z.literal(enumValues[0]);\n        }\n        // Check if all values are strings\n        if (enumValues.every((v) => typeof v === \"string\")) {\n            return z.enum(enumValues);\n        }\n        // Mixed types - use union of literals\n        const literalSchemas = enumValues.map((v) => z.literal(v));\n        if (literalSchemas.length < 2) {\n            return literalSchemas[0];\n        }\n        return z.union([literalSchemas[0], literalSchemas[1], ...literalSchemas.slice(2)]);\n    }\n    // Handle const\n    if (schema.const !== undefined) {\n        return z.literal(schema.const);\n    }\n    // Handle type\n    const type = schema.type;\n    if (Array.isArray(type)) {\n        // Expand type array into anyOf union\n        const typeSchemas = type.map((t) => {\n            const typeSchema = { ...schema, type: t };\n            return convertBaseSchema(typeSchema, ctx);\n        });\n        if (typeSchemas.length === 0) {\n            return z.never();\n        }\n        if (typeSchemas.length === 1) {\n            return typeSchemas[0];\n        }\n        return z.union(typeSchemas);\n    }\n    if (!type) {\n        // No type specified - empty schema (any)\n        return z.any();\n    }\n    let zodSchema;\n    switch (type) {\n        case \"string\": {\n            let stringSchema = z.string();\n            // Apply format using .check() with Zod format functions\n            if (schema.format) {\n                const format = schema.format;\n                // Map common formats to Zod check functions\n                if (format === \"email\") {\n                    stringSchema = stringSchema.check(z.email());\n                }\n                else if (format === \"uri\" || format === \"uri-reference\") {\n                    stringSchema = stringSchema.check(z.url());\n                }\n                else if (format === \"uuid\" || format === \"guid\") {\n                    stringSchema = stringSchema.check(z.uuid());\n                }\n                else if (format === \"date-time\") {\n                    stringSchema = stringSchema.check(z.iso.datetime());\n                }\n                else if (format === \"date\") {\n                    stringSchema = stringSchema.check(z.iso.date());\n                }\n                else if (format === \"time\") {\n                    stringSchema = stringSchema.check(z.iso.time());\n                }\n                else if (format === \"duration\") {\n                    stringSchema = stringSchema.check(z.iso.duration());\n                }\n                else if (format === \"ipv4\") {\n                    stringSchema = stringSchema.check(z.ipv4());\n                }\n                else if (format === \"ipv6\") {\n                    stringSchema = stringSchema.check(z.ipv6());\n                }\n                else if (format === \"mac\") {\n                    stringSchema = stringSchema.check(z.mac());\n                }\n                else if (format === \"cidr\") {\n                    stringSchema = stringSchema.check(z.cidrv4());\n                }\n                else if (format === \"cidr-v6\") {\n                    stringSchema = stringSchema.check(z.cidrv6());\n                }\n                else if (format === \"base64\") {\n                    stringSchema = stringSchema.check(z.base64());\n                }\n                else if (format === \"base64url\") {\n                    stringSchema = stringSchema.check(z.base64url());\n                }\n                else if (format === \"e164\") {\n                    stringSchema = stringSchema.check(z.e164());\n                }\n                else if (format === \"jwt\") {\n                    stringSchema = stringSchema.check(z.jwt());\n                }\n                else if (format === \"emoji\") {\n                    stringSchema = stringSchema.check(z.emoji());\n                }\n                else if (format === \"nanoid\") {\n                    stringSchema = stringSchema.check(z.nanoid());\n                }\n                else if (format === \"cuid\") {\n                    stringSchema = stringSchema.check(z.cuid());\n                }\n                else if (format === \"cuid2\") {\n                    stringSchema = stringSchema.check(z.cuid2());\n                }\n                else if (format === \"ulid\") {\n                    stringSchema = stringSchema.check(z.ulid());\n                }\n                else if (format === \"xid\") {\n                    stringSchema = stringSchema.check(z.xid());\n                }\n                else if (format === \"ksuid\") {\n                    stringSchema = stringSchema.check(z.ksuid());\n                }\n                // Note: json-string format is not currently supported by Zod\n                // Custom formats are ignored - keep as plain string\n            }\n            // Apply constraints\n            if (typeof schema.minLength === \"number\") {\n                stringSchema = stringSchema.min(schema.minLength);\n            }\n            if (typeof schema.maxLength === \"number\") {\n                stringSchema = stringSchema.max(schema.maxLength);\n            }\n            if (schema.pattern) {\n                // JSON Schema patterns are not implicitly anchored (match anywhere in string)\n                stringSchema = stringSchema.regex(new RegExp(schema.pattern));\n            }\n            zodSchema = stringSchema;\n            break;\n        }\n        case \"number\":\n        case \"integer\": {\n            let numberSchema = type === \"integer\" ? z.number().int() : z.number();\n            // Apply constraints\n            if (typeof schema.minimum === \"number\") {\n                numberSchema = numberSchema.min(schema.minimum);\n            }\n            if (typeof schema.maximum === \"number\") {\n                numberSchema = numberSchema.max(schema.maximum);\n            }\n            if (typeof schema.exclusiveMinimum === \"number\") {\n                numberSchema = numberSchema.gt(schema.exclusiveMinimum);\n            }\n            else if (schema.exclusiveMinimum === true && typeof schema.minimum === \"number\") {\n                numberSchema = numberSchema.gt(schema.minimum);\n            }\n            if (typeof schema.exclusiveMaximum === \"number\") {\n                numberSchema = numberSchema.lt(schema.exclusiveMaximum);\n            }\n            else if (schema.exclusiveMaximum === true && typeof schema.maximum === \"number\") {\n                numberSchema = numberSchema.lt(schema.maximum);\n            }\n            if (typeof schema.multipleOf === \"number\") {\n                numberSchema = numberSchema.multipleOf(schema.multipleOf);\n            }\n            zodSchema = numberSchema;\n            break;\n        }\n        case \"boolean\": {\n            zodSchema = z.boolean();\n            break;\n        }\n        case \"null\": {\n            zodSchema = z.null();\n            break;\n        }\n        case \"object\": {\n            const shape = {};\n            const properties = schema.properties || {};\n            const requiredSet = new Set(schema.required || []);\n            // Convert properties - mark optional ones\n            for (const [key, propSchema] of Object.entries(properties)) {\n                const propZodSchema = convertSchema(propSchema, ctx);\n                // If not in required array, make it optional\n                shape[key] = requiredSet.has(key) ? propZodSchema : propZodSchema.optional();\n            }\n            // Handle propertyNames\n            if (schema.propertyNames) {\n                const keySchema = convertSchema(schema.propertyNames, ctx);\n                const valueSchema = schema.additionalProperties && typeof schema.additionalProperties === \"object\"\n                    ? convertSchema(schema.additionalProperties, ctx)\n                    : z.any();\n                // Case A: No properties (pure record)\n                if (Object.keys(shape).length === 0) {\n                    zodSchema = z.record(keySchema, valueSchema);\n                    break;\n                }\n                // Case B: With properties (intersection of object and looseRecord)\n                const objectSchema = z.object(shape).passthrough();\n                const recordSchema = z.looseRecord(keySchema, valueSchema);\n                zodSchema = z.intersection(objectSchema, recordSchema);\n                break;\n            }\n            // Handle patternProperties\n            if (schema.patternProperties) {\n                // patternProperties: keys matching pattern must satisfy corresponding schema\n                // Use loose records so non-matching keys pass through\n                const patternProps = schema.patternProperties;\n                const patternKeys = Object.keys(patternProps);\n                const looseRecords = [];\n                for (const pattern of patternKeys) {\n                    const patternValue = convertSchema(patternProps[pattern], ctx);\n                    const keySchema = z.string().regex(new RegExp(pattern));\n                    looseRecords.push(z.looseRecord(keySchema, patternValue));\n                }\n                // Build intersection: object schema + all pattern property records\n                const schemasToIntersect = [];\n                if (Object.keys(shape).length > 0) {\n                    // Use passthrough so patternProperties can validate additional keys\n                    schemasToIntersect.push(z.object(shape).passthrough());\n                }\n                schemasToIntersect.push(...looseRecords);\n                if (schemasToIntersect.length === 0) {\n                    zodSchema = z.object({}).passthrough();\n                }\n                else if (schemasToIntersect.length === 1) {\n                    zodSchema = schemasToIntersect[0];\n                }\n                else {\n                    // Chain intersections: (A & B) & C & D ...\n                    let result = z.intersection(schemasToIntersect[0], schemasToIntersect[1]);\n                    for (let i = 2; i < schemasToIntersect.length; i++) {\n                        result = z.intersection(result, schemasToIntersect[i]);\n                    }\n                    zodSchema = result;\n                }\n                break;\n            }\n            // Handle additionalProperties\n            // In JSON Schema, additionalProperties defaults to true (allow any extra properties)\n            // In Zod, objects strip unknown keys by default, so we need to handle this explicitly\n            const objectSchema = z.object(shape);\n            if (schema.additionalProperties === false) {\n                // Strict mode - no extra properties allowed\n                zodSchema = objectSchema.strict();\n            }\n            else if (typeof schema.additionalProperties === \"object\") {\n                // Extra properties must match the specified schema\n                zodSchema = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx));\n            }\n            else {\n                // additionalProperties is true or undefined - allow any extra properties (passthrough)\n                zodSchema = objectSchema.passthrough();\n            }\n            break;\n        }\n        case \"array\": {\n            // TODO: uniqueItems is not supported\n            // TODO: contains/minContains/maxContains are not supported\n            // Check if this is a tuple (prefixItems or items as array)\n            const prefixItems = schema.prefixItems;\n            const items = schema.items;\n            if (prefixItems && Array.isArray(prefixItems)) {\n                // Tuple with prefixItems (draft-2020-12)\n                const tupleItems = prefixItems.map((item) => convertSchema(item, ctx));\n                const rest = items && typeof items === \"object\" && !Array.isArray(items)\n                    ? convertSchema(items, ctx)\n                    : undefined;\n                if (rest) {\n                    zodSchema = z.tuple(tupleItems).rest(rest);\n                }\n                else {\n                    zodSchema = z.tuple(tupleItems);\n                }\n                // Apply minItems/maxItems constraints to tuples\n                if (typeof schema.minItems === \"number\") {\n                    zodSchema = zodSchema.check(z.minLength(schema.minItems));\n                }\n                if (typeof schema.maxItems === \"number\") {\n                    zodSchema = zodSchema.check(z.maxLength(schema.maxItems));\n                }\n            }\n            else if (Array.isArray(items)) {\n                // Tuple with items array (draft-7)\n                const tupleItems = items.map((item) => convertSchema(item, ctx));\n                const rest = schema.additionalItems && typeof schema.additionalItems === \"object\"\n                    ? convertSchema(schema.additionalItems, ctx)\n                    : undefined; // additionalItems: false means no rest, handled by default tuple behavior\n                if (rest) {\n                    zodSchema = z.tuple(tupleItems).rest(rest);\n                }\n                else {\n                    zodSchema = z.tuple(tupleItems);\n                }\n                // Apply minItems/maxItems constraints to tuples\n                if (typeof schema.minItems === \"number\") {\n                    zodSchema = zodSchema.check(z.minLength(schema.minItems));\n                }\n                if (typeof schema.maxItems === \"number\") {\n                    zodSchema = zodSchema.check(z.maxLength(schema.maxItems));\n                }\n            }\n            else if (items !== undefined) {\n                // Regular array\n                const element = convertSchema(items, ctx);\n                let arraySchema = z.array(element);\n                // Apply constraints\n                if (typeof schema.minItems === \"number\") {\n                    arraySchema = arraySchema.min(schema.minItems);\n                }\n                if (typeof schema.maxItems === \"number\") {\n                    arraySchema = arraySchema.max(schema.maxItems);\n                }\n                zodSchema = arraySchema;\n            }\n            else {\n                // No items specified - array of any\n                zodSchema = z.array(z.any());\n            }\n            break;\n        }\n        default:\n            throw new Error(`Unsupported type: ${type}`);\n    }\n    return zodSchema;\n}\nfunction convertSchema(schema, ctx) {\n    if (typeof schema === \"boolean\") {\n        return schema ? z.any() : z.never();\n    }\n    // Convert base schema first (ignoring composition keywords)\n    let baseSchema = convertBaseSchema(schema, ctx);\n    const hasExplicitType = schema.type || schema.enum !== undefined || schema.const !== undefined;\n    // Process composition keywords LAST (they can appear together)\n    // Handle anyOf - wrap base schema with union\n    if (schema.anyOf && Array.isArray(schema.anyOf)) {\n        const options = schema.anyOf.map((s) => convertSchema(s, ctx));\n        const anyOfUnion = z.union(options);\n        baseSchema = hasExplicitType ? z.intersection(baseSchema, anyOfUnion) : anyOfUnion;\n    }\n    // Handle oneOf - exclusive union (exactly one must match)\n    if (schema.oneOf && Array.isArray(schema.oneOf)) {\n        const options = schema.oneOf.map((s) => convertSchema(s, ctx));\n        const oneOfUnion = z.xor(options);\n        baseSchema = hasExplicitType ? z.intersection(baseSchema, oneOfUnion) : oneOfUnion;\n    }\n    // Handle allOf - wrap base schema with intersection\n    if (schema.allOf && Array.isArray(schema.allOf)) {\n        if (schema.allOf.length === 0) {\n            baseSchema = hasExplicitType ? baseSchema : z.any();\n        }\n        else {\n            let result = hasExplicitType ? baseSchema : convertSchema(schema.allOf[0], ctx);\n            const startIdx = hasExplicitType ? 0 : 1;\n            for (let i = startIdx; i < schema.allOf.length; i++) {\n                result = z.intersection(result, convertSchema(schema.allOf[i], ctx));\n            }\n            baseSchema = result;\n        }\n    }\n    // Handle nullable (OpenAPI 3.0)\n    if (schema.nullable === true && ctx.version === \"openapi-3.0\") {\n        baseSchema = z.nullable(baseSchema);\n    }\n    // Handle readOnly\n    if (schema.readOnly === true) {\n        baseSchema = z.readonly(baseSchema);\n    }\n    // Apply `default` so it wraps the fully-composed schema. This ensures\n    // `parse(undefined) -> default` works regardless of which branch of\n    // `convertBaseSchema` produced the inner schema (enum/const/not/typed/etc.).\n    if (schema.default !== undefined) {\n        baseSchema = baseSchema.default(schema.default);\n    }\n    // Collect non-description annotation metadata into the user-supplied\n    // registry. Description is handled separately below via `.describe()` to\n    // preserve the contract that `schema.description` reads from globalRegistry.\n    const extraMeta = {};\n    const coreMetadataKeys = [\"$id\", \"id\", \"$comment\", \"$anchor\", \"$vocabulary\", \"$dynamicRef\", \"$dynamicAnchor\"];\n    for (const key of coreMetadataKeys) {\n        if (key in schema) {\n            extraMeta[key] = schema[key];\n        }\n    }\n    const contentMetadataKeys = [\"contentEncoding\", \"contentMediaType\", \"contentSchema\"];\n    for (const key of contentMetadataKeys) {\n        if (key in schema) {\n            extraMeta[key] = schema[key];\n        }\n    }\n    for (const key of Object.keys(schema)) {\n        if (!RECOGNIZED_KEYS.has(key)) {\n            extraMeta[key] = schema[key];\n        }\n    }\n    if (Object.keys(extraMeta).length > 0) {\n        ctx.registry.add(baseSchema, extraMeta);\n    }\n    // Apply description last. `.describe()` clones the schema and sets\n    // `_zod.parent` on the clone, so registry lookups on the returned reference\n    // still resolve `extraMeta` via parent inheritance.\n    if (schema.description) {\n        baseSchema = baseSchema.describe(schema.description);\n    }\n    return baseSchema;\n}\n/**\n * Converts a JSON Schema to a Zod schema. This function should be considered semi-experimental. It's behavior is liable to change. */\nexport function fromJSONSchema(schema, params) {\n    // Handle boolean schemas\n    if (typeof schema === \"boolean\") {\n        return schema ? z.any() : z.never();\n    }\n    // Normalize input via a JSON round-trip. This guarantees the converter\n    // walks a plain, finite, JSON-valid object graph: cyclic inputs fail here,\n    // getter/Proxy-based properties are materialized into static values, and\n    // class instances collapse to plain objects.\n    let normalized;\n    try {\n        normalized = JSON.parse(JSON.stringify(schema));\n    }\n    catch {\n        throw new Error(\"fromJSONSchema input is not valid JSON (possibly cyclic); use $defs/$ref for recursive schemas\");\n    }\n    const version = detectVersion(normalized, params?.defaultTarget);\n    const defs = (normalized.$defs || normalized.definitions || {});\n    const ctx = {\n        version,\n        defs,\n        refs: new Map(),\n        processing: new Set(),\n        rootSchema: normalized,\n        registry: params?.registry ?? globalRegistry,\n    };\n    return convertSchema(normalized, ctx);\n}\n", "import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport function string(params) {\n    return core._coercedString(schemas.ZodString, params);\n}\nexport function number(params) {\n    return core._coercedNumber(schemas.ZodNumber, params);\n}\nexport function boolean(params) {\n    return core._coercedBoolean(schemas.ZodBoolean, params);\n}\nexport function bigint(params) {\n    return core._coercedBigint(schemas.ZodBigInt, params);\n}\nexport function date(params) {\n    return core._coercedDate(schemas.ZodDate, params);\n}\n", "import * as z from \"./v4/classic/external.js\";\nexport * from \"./v4/classic/external.js\";\nexport { z };\nexport default z;\n", "import { z } from \"zod\";\n\nconst FILES_AT_ONCE = 3;\n\nconst PARTS_AT_ONCE = 4;\n\nconst ATTEMPTS = 3;\n\nconst Started = z.object({\n  upload: z.string(),\n  part_size: z.number().int().positive(),\n  urls: z.array(z.string()).min(1),\n});\n\nconst Completed = z.object({\n  reference: z.string(),\n});\n\nexport class UploadError extends Error {\n  constructor(\n    message: string,\n    readonly status?: number,\n  ) {\n    super(message);\n  }\n\n  get unavailable(): boolean {\n    return this.status === 401 || this.status === 403;\n  }\n}\n\nexport const csrfToken = (form: HTMLFormElement): string => {\n  const input = form.querySelector('input[name=\"csrfmiddlewaretoken\"]');\n  if (input instanceof HTMLInputElement) {\n    return input.value;\n  }\n  const cookie = document.cookie\n    .split(\"; \")\n    .find((x) => x.startsWith(\"csrftoken=\"));\n  return cookie?.split(\"=\")[1] ?? \"\";\n};\n\nconst sleep = (ms: number): Promise<void> =>\n  new Promise((resolve) => setTimeout(resolve, ms));\n\nexport const pool = async <T, R>(\n  items: T[],\n  limit: number,\n  work: (item: T, index: number) => Promise<R>,\n): Promise<R[]> => {\n  const results: R[] = [];\n  let next = 0;\n  const worker = async (): Promise<void> => {\n    while (next < items.length) {\n      const index = next++;\n      results[index] = await work(items[index] as T, index);\n    }\n  };\n  await Promise.all(Array.from({ length: limit }, worker));\n  return results;\n};\n\nconst post = async (\n  url: string,\n  body: unknown,\n  csrf: string,\n): Promise<unknown> => {\n  const response = await fetch(url, {\n    method: \"POST\",\n    headers: {\n      Accept: \"application/json\",\n      \"Content-Type\": \"application/json\",\n      \"X-CSRFToken\": csrf,\n    },\n    body: JSON.stringify(body),\n  });\n  if (!response.ok) {\n    throw new UploadError(\n      `Upload failed (${response.status})`,\n      response.status,\n    );\n  }\n  return response.json();\n};\n\nconst put = async (url: string, body: Blob): Promise<string> => {\n  for (let attempt = 1; ; attempt++) {\n    try {\n      const response = await fetch(url, { method: \"PUT\", body });\n      const etag = response.headers.get(\"ETag\");\n      if (response.ok && etag) {\n        return etag;\n      }\n      throw new UploadError(`Part upload failed (${response.status})`);\n    } catch (error) {\n      if (attempt === ATTEMPTS) {\n        throw error;\n      }\n      await sleep(1000 * 2 ** attempt);\n    }\n  }\n};\n\nexport const uploadFile = async (file: File, csrf: string): Promise<string> => {\n  const started = Started.parse(\n    await post(\n      \"/storage/uploads/\",\n      {\n        name: file.name,\n        type: file.type || \"application/octet-stream\",\n        size: file.size,\n      },\n      csrf,\n    ),\n  );\n  const size = started.part_size;\n  const etags = await pool(started.urls, PARTS_AT_ONCE, (url, index) =>\n    put(url, file.slice(index * size, (index + 1) * size)),\n  );\n  const completed = Completed.parse(\n    await post(\n      \"/storage/uploads/complete/\",\n      { upload: started.upload, etags },\n      csrf,\n    ),\n  );\n  return completed.reference;\n};\n\nexport const uploadFiles = (\n  files: File[],\n  csrf: string,\n  progress: (done: number, total: number) => void = () => undefined,\n): Promise<string[]> => {\n  let done = 0;\n  progress(done, files.length);\n  return pool(files, FILES_AT_ONCE, async (file) => {\n    const reference = await uploadFile(file, csrf);\n    progress(++done, files.length);\n    return reference;\n  });\n};\n\nexport const uploadable = (value: FormDataEntryValue): value is File =>\n  value instanceof File && value.size > 0;\n\nexport const replaceFiles = async (\n  data: FormData,\n  csrf: string,\n): Promise<FormData> => {\n  const entries = [...data.entries()];\n  const files = entries.map(([, value]) => value).filter(uploadable);\n  if (files.length === 0) {\n    return data;\n  }\n  let references: string[];\n  try {\n    references = await uploadFiles(files, csrf);\n  } catch (error) {\n    if (error instanceof UploadError && error.unavailable) {\n      return data;\n    }\n    throw error;\n  }\n  const result = new FormData();\n  for (const [name, value] of entries) {\n    const index = uploadable(value) ? files.indexOf(value) : -1;\n    result.append(name, index === -1 ? value : (references[index] as string));\n  }\n  return result;\n};\n", "import { csrfToken, UploadError, uploadable, uploadFiles } from \"./upload\";\n\nconst busy = new WeakSet<HTMLFormElement>();\n\nconst uploaded = new WeakSet<HTMLFormElement>();\n\nlet restores: (() => void)[] = [];\n\nconst fileInputs = (form: HTMLFormElement): HTMLInputElement[] =>\n  [...form.elements].filter(\n    (element): element is HTMLInputElement =>\n      element instanceof HTMLInputElement &&\n      element.type === \"file\" &&\n      !element.disabled &&\n      element.name !== \"\" &&\n      [...(element.files ?? [])].some(uploadable),\n  );\n\nconst statusFor = (form: HTMLFormElement): HTMLElement => {\n  const existing = form.querySelector(\"[data-upload-status]\");\n  if (existing instanceof HTMLElement) {\n    return existing;\n  }\n  const status = document.createElement(\"p\");\n  status.dataset[\"uploadStatus\"] = \"\";\n  status.setAttribute(\"aria-live\", \"polite\");\n  status.className = \"text-gray-600 text-sm\";\n  form.append(status);\n  return status;\n};\n\nconst resubmit = (form: HTMLFormElement, submitter: HTMLElement | null) => {\n  uploaded.add(form);\n  form.requestSubmit(submitter);\n};\n\nconst upload = async (form: HTMLFormElement, event: SubmitEvent) => {\n  const inputs = fileInputs(form);\n  if (inputs.length === 0) {\n    return;\n  }\n  event.preventDefault();\n  if (busy.has(form)) {\n    return;\n  }\n  busy.add(form);\n\n  const pairs = inputs.flatMap((input) =>\n    [...(input.files ?? [])]\n      .filter(uploadable)\n      .map((file) => ({ input, file })),\n  );\n  const status = statusFor(form);\n\n  try {\n    const references = await uploadFiles(\n      pairs.map(({ file }) => file),\n      csrfToken(form),\n      (done, total) => {\n        status.textContent = `Uploading ${done} of ${total} files\u2026`;\n      },\n    );\n    const hiddens = pairs.map(({ input }, index) => {\n      const hidden = document.createElement(\"input\");\n      hidden.type = \"hidden\";\n      hidden.name = input.name;\n      hidden.value = references[index] as string;\n      return hidden;\n    });\n    form.append(...hiddens);\n    for (const input of inputs) {\n      input.disabled = true;\n    }\n    restores.push(() => {\n      for (const hidden of hiddens) {\n        hidden.remove();\n      }\n      for (const input of inputs) {\n        input.disabled = false;\n      }\n      status.remove();\n    });\n    resubmit(form, event.submitter);\n  } catch (error) {\n    if (error instanceof UploadError && error.unavailable) {\n      status.remove();\n      resubmit(form, event.submitter);\n      return;\n    }\n    status.textContent = \"Upload failed. Please try again.\";\n  } finally {\n    busy.delete(form);\n  }\n};\n\nexport default (): void => {\n  document.addEventListener(\"submit\", (event) => {\n    const form = event.target;\n    if (\n      !(form instanceof HTMLFormElement) ||\n      event.defaultPrevented ||\n      form.enctype !== \"multipart/form-data\"\n    ) {\n      return;\n    }\n    if (uploaded.has(form)) {\n      uploaded.delete(form);\n      return;\n    }\n    void upload(form, event);\n  });\n\n  window.addEventListener(\"pageshow\", (event) => {\n    if (event.persisted) {\n      for (const restore of restores) {\n        restore();\n      }\n      restores = [];\n    }\n  });\n};\n", "import type { FeatureCollection } from \"geojson\";\nimport type * as MapLibre from \"maplibre-gl\";\nimport type {\n  ExpressionSpecification,\n  LayerSpecification,\n  StyleSpecification,\n} from \"maplibre-gl\";\n\n// The ops maps that shade postcode areas, drawn by MapLibre on the GPU\n// (#3653): the canvas maps before it took Firefox down when zoomed out.\n// Under the shading is our own copy of OpenStreetMap, VersaTiles' vector\n// tiles of the UK (#3649), muted so the shading reads over it, with label\n// glyphs we serve ourselves. Never a public tile server: CARTO wants a key and\n// OpenStreetMap's own are not for apps like ours. Without our tiles the\n// polygons are the map, on a plain sea.\n\nexport type Lib = typeof MapLibre;\n\n// Tailwind's sky-100, the maps' own background.\nconst SEA = \"#e0f2fe\";\nconst LAND = \"#f8fafc\";\nconst WOOD = \"#ecf3e8\";\nconst ROAD = \"#cbd5e1\";\nconst BORDER = \"#94a3b8\";\nconst TEXT = \"#334155\";\n\n// The extract's extent. Inside it our tiles draw the sea; outside it there\n// are no tiles, and the background is sea.\nconst EXTRACT: [number, number, number, number] = [-8.7, 49.8, 1.9, 60.95];\n\n// Far enough round the UK to frame it beside the panels, never the world.\nconst LIMITS: MapLibre.LngLatBoundsLike = [\n  [-26, 45],\n  [16, 64],\n];\n\nconst OSM =\n  '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors';\n\n// The one font the labels use (static/maps/fonts).\nexport const FONT = \"open_sans_semibold\";\n\nconst kind = [\"get\", \"kind\"] satisfies ExpressionSpecification;\n\n// Main roads only at a distance, the rest as you come in.\nconst ROADS: [string[], number][] = [\n  [[\"motorway\", \"trunk\"], 5],\n  [[\"primary\"], 8],\n  [[\"secondary\", \"tertiary\"], 10],\n  [[\"unclassified\", \"residential\", \"living_street\"], 12],\n];\n\nconst place = (\n  kinds: string[],\n  minzoom: number,\n  size: number,\n): LayerSpecification => ({\n  id: `places-${kinds[0]}`,\n  type: \"symbol\",\n  source: \"osm\",\n  \"source-layer\": \"place_labels\",\n  minzoom,\n  filter: [\"in\", kind, [\"literal\", kinds]],\n  layout: {\n    \"text-field\": [\"get\", \"name\"],\n    \"text-font\": [FONT],\n    \"text-size\": size,\n  },\n  paint: {\n    \"text-color\": TEXT,\n    \"text-halo-color\": \"#ffffff\",\n    \"text-halo-width\": 1.5,\n  },\n});\n\nconst BASEMAP: LayerSpecification[] = [\n  {\n    id: \"extract\",\n    type: \"fill\",\n    source: \"extract\",\n    paint: { \"fill-color\": LAND },\n  },\n  {\n    id: \"ocean\",\n    type: \"fill\",\n    source: \"osm\",\n    \"source-layer\": \"ocean\",\n    paint: { \"fill-color\": SEA },\n  },\n  {\n    id: \"water\",\n    type: \"fill\",\n    source: \"osm\",\n    \"source-layer\": \"water_polygons\",\n    paint: { \"fill-color\": SEA },\n  },\n  {\n    id: \"woods\",\n    type: \"fill\",\n    source: \"osm\",\n    \"source-layer\": \"land\",\n    minzoom: 7,\n    filter: [\"in\", kind, [\"literal\", [\"forest\", \"wood\"]]],\n    paint: { \"fill-color\": WOOD },\n  },\n  {\n    id: \"rivers\",\n    type: \"line\",\n    source: \"osm\",\n    \"source-layer\": \"water_lines\",\n    minzoom: 9,\n    filter: [\"in\", kind, [\"literal\", [\"river\", \"canal\"]]],\n    paint: { \"line-color\": SEA, \"line-width\": 1.5 },\n  },\n  ...ROADS.map(\n    ([kinds, minzoom]): LayerSpecification => ({\n      id: `roads-${kinds[0]}`,\n      type: \"line\",\n      source: \"osm\",\n      \"source-layer\": \"streets\",\n      minzoom,\n      filter: [\n        \"all\",\n        [\"in\", kind, [\"literal\", kinds]],\n        [\"!\", [\"to-boolean\", [\"get\", \"tunnel\"]]],\n      ],\n      paint: {\n        \"line-color\": ROAD,\n        \"line-width\": [\"step\", [\"zoom\"], 0.6, 9, 1.2, 12, 2],\n      },\n    }),\n  ),\n  {\n    id: \"borders\",\n    type: \"line\",\n    source: \"osm\",\n    \"source-layer\": \"boundaries\",\n    filter: [\n      \"all\",\n      [\"<=\", [\"to-number\", [\"get\", \"admin_level\"]], 4],\n      [\"!\", [\"to-boolean\", [\"get\", \"maritime\"]]],\n    ],\n    paint: {\n      \"line-color\": BORDER,\n      \"line-width\": 1,\n      \"line-dasharray\": [3, 2],\n    },\n  },\n  place([\"capital\", \"state_capital\", \"city\"], 5, 13),\n  place([\"town\"], 8, 11),\n  place([\"village\", \"suburb\"], 11, 11),\n];\n\n/** The first label layer: the maps put their shading under it, so the place\n * names read over the districts. Undefined without our tiles. */\nexport const LABELS = \"places-capital\";\n\n// \"/static/x/{z}\" \u2192 \"https://host/static/x/{z}\". MapLibre wants whole URLs,\n// and new URL() would escape the braces.\nconst whole = (url: string): string =>\n  url.startsWith(\"/\") ? `${window.location.origin}${url}` : url;\n\nconst style = (tiles: string, glyphs: string): StyleSpecification =>\n  tiles\n    ? {\n        version: 8,\n        glyphs: whole(glyphs),\n        sources: {\n          osm: {\n            type: \"vector\",\n            tiles: [whole(tiles)],\n            minzoom: 0,\n            maxzoom: 14,\n            bounds: EXTRACT,\n            attribution: OSM,\n          },\n          extract: {\n            type: \"geojson\",\n            data: {\n              type: \"Polygon\",\n              coordinates: [\n                [\n                  [EXTRACT[0], EXTRACT[1]],\n                  [EXTRACT[2], EXTRACT[1]],\n                  [EXTRACT[2], EXTRACT[3]],\n                  [EXTRACT[0], EXTRACT[3]],\n                  [EXTRACT[0], EXTRACT[1]],\n                ],\n              ],\n            },\n          },\n        },\n        layers: [\n          { id: \"sea\", type: \"background\", paint: { \"background-color\": SEA } },\n          ...BASEMAP,\n        ],\n      }\n    : {\n        version: 8,\n        sources: {},\n        layers: [\n          { id: \"sea\", type: \"background\", paint: { \"background-color\": SEA } },\n        ],\n      };\n\nlet loading: Promise<Lib> | null = null;\n\n/** MapLibre's bundle (static/maps.js), fetched the first time a map opens. */\nconst load = (src: string): Promise<Lib> => {\n  if (window.furbnowMaps) {\n    return Promise.resolve(window.furbnowMaps);\n  }\n  loading ??= new Promise((resolve, reject) => {\n    const script = document.createElement(\"script\");\n    script.src = src;\n    script.async = true;\n    script.onload = () =>\n      window.furbnowMaps\n        ? resolve(window.furbnowMaps)\n        : reject(new Error(\"The map didn't load.\"));\n    script.onerror = () => {\n      loading = null;\n      reject(new Error(\"The map didn't load.\"));\n    };\n    document.head.appendChild(script);\n  });\n  return loading;\n};\n\nexport interface Basemap {\n  map: MapLibre.Map;\n  lib: Lib;\n  /** Whether our tiles are drawn under the shading. */\n  tiles: boolean;\n}\n\n/** Opens a map in `target`, configured by the data-* attributes on `config`:\n * maps-src and maps-worker (MapLibre's bundles), glyphs-url, and tiles-url\n * (`{z}/{x}/{y}`, or \"\" for no tiles). Resolves once the map has drawn. */\nexport const openMap = async (\n  target: HTMLElement,\n  config: DOMStringMap,\n  options: Partial<MapLibre.MapOptions> = {},\n): Promise<Basemap> => {\n  const lib = await load(config[\"mapsSrc\"] ?? \"\");\n  lib.setWorkerUrl(whole(config[\"mapsWorker\"] ?? \"\"));\n  const tiles = config[\"tilesUrl\"] ?? \"\";\n  const map = new lib.Map({\n    container: target,\n    style: style(tiles, config[\"glyphsUrl\"] ?? \"\"),\n    attributionControl: false,\n    renderWorldCopies: false,\n    maxBounds: LIMITS,\n    minZoom: 4,\n    maxZoom: 16,\n    dragRotate: false,\n    pitchWithRotate: false,\n    touchPitch: false,\n    ...options,\n  });\n  map.touchZoomRotate.disableRotation();\n  map.keyboard.disableRotation();\n  map.addControl(\n    new lib.AttributionControl({\n      compact: true,\n      customAttribution: \"Boundaries: Wikipedia (CC BY-SA 3.0)\",\n    }),\n  );\n  await map.once(\"load\");\n  return { map, lib, tiles: tiles !== \"\" };\n};\n\n/** A tooltip that follows the pointer. */\nexport const tooltip = (lib: Lib): MapLibre.Popup =>\n  new lib.Popup({\n    closeButton: false,\n    closeOnClick: false,\n    className: \"map-tooltip\",\n    offset: 12,\n    maxWidth: \"24rem\",\n  });\n\n/** How one postcode district or area is shaded: Leaflet's path options,\n * which the maps were first written with. */\nexport interface Shade {\n  color: string;\n  fillColor: string;\n  fillOpacity: number;\n  opacity?: number;\n  weight?: number;\n}\n\n/** Adds polygons keyed by their `code` property as `id`, with `${id}-fill`\n * and `${id}-line` layers under the place names, shaded one by one with\n * shade(). */\nexport const addShading = (\n  map: MapLibre.Map,\n  id: string,\n  data: FeatureCollection,\n): void => {\n  map.addSource(id, { type: \"geojson\", data, promoteId: \"code\" });\n  const below = map.getLayer(LABELS) ? LABELS : undefined;\n  map.addLayer(\n    {\n      id: `${id}-fill`,\n      type: \"fill\",\n      source: id,\n      paint: {\n        \"fill-color\": [\"coalesce\", [\"feature-state\", \"fill\"], \"#ffffff\"],\n        \"fill-opacity\": [\"coalesce\", [\"feature-state\", \"fillOpacity\"], 0],\n      },\n    },\n    below,\n  );\n  map.addLayer(\n    {\n      id: `${id}-line`,\n      type: \"line\",\n      source: id,\n      paint: {\n        \"line-color\": [\"coalesce\", [\"feature-state\", \"line\"], BORDER],\n        \"line-opacity\": [\"coalesce\", [\"feature-state\", \"lineOpacity\"], 1],\n        \"line-width\": [\"coalesce\", [\"feature-state\", \"width\"], 0.5],\n      },\n    },\n    below,\n  );\n};\n\nexport const shade = (\n  map: MapLibre.Map,\n  source: string,\n  code: string,\n  style: Shade,\n): void => {\n  map.setFeatureState(\n    { source, id: code },\n    {\n      fill: style.fillColor,\n      fillOpacity: style.fillOpacity,\n      line: style.color,\n      lineOpacity: style.opacity ?? 1,\n      width: style.weight ?? 1,\n    },\n  );\n};\n\n/** Shows `tip(feature)` beside the pointer over the topmost feature in\n * `layers()`, and calls `click(feature)` when it's clicked. */\nexport const pointer = (\n  { map, lib }: Basemap,\n  layers: () => string[],\n  tip: (feature: MapLibre.MapGeoJSONFeature) => string,\n  click: (feature: MapLibre.MapGeoJSONFeature) => void,\n): void => {\n  const popup = tooltip(lib);\n  const under = (\n    point: MapLibre.PointLike,\n  ): MapLibre.MapGeoJSONFeature | undefined => {\n    const shown = layers().filter((x) => map.getLayer(x));\n    return shown.length > 0\n      ? map.queryRenderedFeatures(point, { layers: shown })[0]\n      : undefined;\n  };\n  map.on(\"mousemove\", (event) => {\n    const feature = under(event.point);\n    map.getCanvas().style.cursor = feature ? \"pointer\" : \"\";\n    if (!feature) {\n      popup.remove();\n      return;\n    }\n    popup.setLngLat(event.lngLat).setHTML(tip(feature)).addTo(map);\n  });\n  map.on(\"mouseout\", () => {\n    popup.remove();\n  });\n  map.on(\"click\", (event) => {\n    const feature = under(event.point);\n    if (feature) {\n      popup.remove();\n      click(feature);\n    }\n  });\n};\n", "// Small geometry for the ops maps: what Leaflet's layers used to work out.\n\nimport type { Geometry, Polygon, Position } from \"geojson\";\nimport type { Point } from \"./coveragesupply\";\n\n/** West, south, east, north. */\nexport type Box = [number, number, number, number];\n\nconst positions = (geometry: Geometry): Position[] => {\n  switch (geometry.type) {\n    case \"Point\":\n      return [geometry.coordinates];\n    case \"MultiPoint\":\n    case \"LineString\":\n      return geometry.coordinates;\n    case \"MultiLineString\":\n    case \"Polygon\":\n      return geometry.coordinates.flat();\n    case \"MultiPolygon\":\n      return geometry.coordinates.flat(2);\n    case \"GeometryCollection\":\n      return geometry.geometries.flatMap(positions);\n  }\n};\n\n/** The box around a geometry, or null for an empty one. */\nexport const box = (geometry: Geometry): Box | null => {\n  let west = Number.POSITIVE_INFINITY;\n  let south = Number.POSITIVE_INFINITY;\n  let east = Number.NEGATIVE_INFINITY;\n  let north = Number.NEGATIVE_INFINITY;\n  for (const [lng = 0, lat = 0] of positions(geometry)) {\n    west = Math.min(west, lng);\n    east = Math.max(east, lng);\n    south = Math.min(south, lat);\n    north = Math.max(north, lat);\n  }\n  return west > east ? null : [west, south, east, north];\n};\n\n/** The middle of a box: close enough to a district's middle to measure\n * reach from. */\nexport const middle = ([west, south, east, north]: Box): Point => ({\n  lat: (south + north) / 2,\n  lng: (west + east) / 2,\n});\n\nconst EARTH_KM = 6371;\n\n/** A circle on the ground as a polygon, for a reach of `km` around `centre`. */\nexport const circle = (centre: Point, km: number, sides = 64): Polygon => {\n  const lat = (centre.lat * Math.PI) / 180;\n  const lng = (centre.lng * Math.PI) / 180;\n  const angle = km / EARTH_KM;\n  const ring: Position[] = [];\n  for (let i = 0; i <= sides; i++) {\n    const bearing = (2 * Math.PI * (i % sides)) / sides;\n    const to = Math.asin(\n      Math.sin(lat) * Math.cos(angle) +\n        Math.cos(lat) * Math.sin(angle) * Math.cos(bearing),\n    );\n    const across =\n      lng +\n      Math.atan2(\n        Math.sin(bearing) * Math.sin(angle) * Math.cos(lat),\n        Math.cos(angle) - Math.sin(lat) * Math.sin(to),\n      );\n    ring.push([(across * 180) / Math.PI, (to * 180) / Math.PI]);\n  }\n  return { type: \"Polygon\", coordinates: [ring] };\n};\n\n/** Text for a map tooltip, which is HTML. */\nexport const escapeHtml = (text: string): string =>\n  text\n    .replaceAll(\"&\", \"&amp;\")\n    .replaceAll(\"<\", \"&lt;\")\n    .replaceAll(\">\", \"&gt;\")\n    .replaceAll('\"', \"&quot;\");\n", "import { AlpineComponent } from \"alpinejs\";\nimport type { Feature, FeatureCollection } from \"geojson\";\nimport type { Map as MapLibreMap } from \"maplibre-gl\";\nimport { addShading, openMap, pointer, type Shade, shade } from \"./basemap\";\nimport { escapeHtml } from \"./geo\";\n\ninterface State extends Record<string | symbol, unknown> {\n  selected: string[];\n  loading: boolean;\n  error: string;\n  entry: string;\n  codes: string[];\n  paint(area: string): void;\n  toggle(area: string): void;\n  add(): void;\n}\n\nconst SELECTED: Shade = {\n  color: \"#15803d\",\n  fillColor: \"#22c55e\",\n  fillOpacity: 0.4,\n};\n// No tiles under the map, so an area not selected is drawn as plain land.\nconst UNSELECTED: Shade = {\n  color: \"#94a3b8\",\n  fillColor: \"#ffffff\",\n  fillOpacity: 0.9,\n};\n// Over our basemap, the land is already drawn: just the area's outline.\nconst OVER_TILES: Shade = {\n  color: \"#64748b\",\n  opacity: 0.6,\n  fillColor: \"#ffffff\",\n  fillOpacity: 0,\n};\n\nconst code = (feature: Feature | undefined): string =>\n  typeof feature?.properties?.[\"code\"] === \"string\"\n    ? feature.properties[\"code\"]\n    : \"\";\n\n// Map-based selector for a surveyor's coverage areas. Renders one hidden\n// `coverage` input per selected area inside the surrounding form, so the\n// existing operations:coverage-coverage endpoint keeps working unchanged.\n// Config: data-areas-geojson-url and the maps' (templates/operations/system/\n// maps.py); initial selection via the `selected` arg.\nexport default (selected: unknown): AlpineComponent<State> => {\n  // MapLibre stays out of the reactive state: Alpine's proxies would wrap it.\n  let map: MapLibreMap | undefined;\n  let unselected = UNSELECTED;\n\n  return {\n    selected: Array.isArray(selected)\n      ? selected.filter((x): x is string => typeof x === \"string\")\n      : [],\n    loading: true,\n    error: \"\",\n    entry: \"\",\n    codes: [],\n\n    async init() {\n      const target = this.$refs[\"map\"];\n      if (!(target instanceof HTMLElement)) {\n        return;\n      }\n      const config = this.$el.dataset;\n      try {\n        const [opened, areas] = await Promise.all([\n          openMap(target, config, { center: [-2.8, 54.2], zoom: 5 }),\n          fetch(config[\"areasGeojsonUrl\"] ?? \"\").then(\n            (x) => x.json() as Promise<FeatureCollection>,\n          ),\n        ]);\n        map = opened.map;\n        if (opened.tiles) {\n          unselected = OVER_TILES;\n        }\n        this.codes = areas.features.map((x) => code(x)).sort();\n        addShading(map, \"areas\", areas);\n        for (const x of this.codes) {\n          this.paint(x);\n        }\n        pointer(\n          opened,\n          () => [\"areas-fill\"],\n          (feature) => {\n            const state = this.selected.includes(code(feature))\n              ? \"covered\"\n              : \"not covered\";\n            return `<strong>${escapeHtml(code(feature))}</strong> \u2014 ${state}`;\n          },\n          (feature) => {\n            this.toggle(code(feature));\n          },\n        );\n      } catch {\n        this.error = \"Couldn't draw the map \u2014 add areas by code below.\";\n      } finally {\n        this.loading = false;\n      }\n    },\n\n    paint(area: string) {\n      if (map) {\n        shade(map, \"areas\", area, {\n          weight: 1.5,\n          ...(this.selected.includes(area) ? SELECTED : unselected),\n        });\n      }\n    },\n\n    toggle(area: string) {\n      this.selected = this.selected.includes(area)\n        ? this.selected.filter((x) => x !== area)\n        : [...this.selected, area].sort();\n      this.paint(area);\n    },\n\n    add() {\n      const area = this.entry.trim().toUpperCase();\n      if (this.codes.includes(area) && !this.selected.includes(area)) {\n        this.toggle(area);\n      }\n      this.entry = \"\";\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface Slot {\n  date: string;\n  am: boolean;\n  pm: boolean;\n}\n\ninterface Day {\n  date: string;\n  label: number;\n  inMonth: boolean;\n  selectable: boolean;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  slots: Slot[];\n  minDate: string;\n  minimum: number;\n  showErrors: boolean;\n  month: string;\n  weekdays: string[];\n}\n\ninterface Methods {\n  invalid(): void;\n  remaining(): number;\n  submit(event: Event): void;\n  tooEarly(slot: Slot): boolean;\n  onWeekend(slot: Slot): boolean;\n  isSelected(date: string): boolean;\n  canGoBack(): boolean;\n}\n\nconst WEEKDAYS = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nconst MINIMUM = 5;\n\n// TEMPORARY: only allow survey dates from 1 September 2026 onwards.\n// Remove this floor (and its use in computeMinDate) once no longer needed.\nconst EARLIEST_DATE = \"2026-09-01\";\n\nconst parseSlots = (raw: string | undefined): Slot[] => {\n  if (!raw) {\n    return [];\n  }\n\n  try {\n    const data = JSON.parse(raw) as unknown;\n\n    if (!Array.isArray(data)) {\n      return [];\n    }\n\n    return data\n      .map((item: unknown): Slot | null => {\n        if (typeof item !== \"object\" || item === null) {\n          return null;\n        }\n\n        const record = item as Record<string, unknown>;\n\n        const date = typeof record[\"date\"] === \"string\" ? record[\"date\"] : \"\";\n\n        return {\n          date,\n          am: Boolean(record[\"am\"]),\n          pm: Boolean(record[\"pm\"]),\n        };\n      })\n      .filter((slot: Slot | null): slot is Slot => slot !== null);\n  } catch {\n    return [];\n  }\n};\n\nconst computeMinDate = (leadtime: number): string => {\n  const now = new Date();\n  now.setDate(now.getDate() + leadtime);\n  const leadtimeDate = now.toISOString().slice(0, 10);\n  return leadtimeDate > EARLIEST_DATE ? leadtimeDate : EARLIEST_DATE;\n};\n\nconst isTooEarly = (slot: Slot, minDate: string): boolean =>\n  Boolean(slot.date) && slot.date < minDate;\n\nconst toUTCDate = (value: string): Date | null => {\n  const [year, month, day] = value.split(\"-\").map(Number);\n  if (!year || !month || !day) {\n    return null;\n  }\n  return new Date(Date.UTC(year, month - 1, day));\n};\n\nconst isWeekend = (value: string): boolean => {\n  const day = toUTCDate(value)?.getUTCDay();\n  return day === 0 || day === 6;\n};\n\nconst isValid = (slot: Slot, minDate: string): boolean =>\n  Boolean(slot.date) &&\n  !isTooEarly(slot, minDate) &&\n  !isWeekend(slot.date) &&\n  (slot.am || slot.pm);\n\nconst toISODate = (value: Date): string => value.toISOString().slice(0, 10);\n\nconst formatDate = (value: string): string => {\n  const date = toUTCDate(value);\n  if (date === null) {\n    return value;\n  }\n  return new Intl.DateTimeFormat(\"en-GB\", {\n    day: \"numeric\",\n    month: \"long\",\n    year: \"numeric\",\n  }).format(date);\n};\n\nconst formatDateWithWeekday = (value: string, withYear: boolean): string => {\n  const date = toUTCDate(value);\n  if (date === null) {\n    return value;\n  }\n  return new Intl.DateTimeFormat(\"en-GB\", {\n    weekday: \"short\",\n    day: \"numeric\",\n    month: \"short\",\n    ...(withYear ? { year: \"numeric\" } : {}),\n  }).format(date);\n};\n\nconst addMonths = (month: string, delta: number): string => {\n  const date = toUTCDate(`${month}-01`);\n  if (date === null) {\n    return month;\n  }\n  date.setUTCMonth(date.getUTCMonth() + delta);\n  return toISODate(date).slice(0, 7);\n};\n\n// Monday-led weeks covering the given YYYY-MM month.\nconst monthGrid = (month: string, minDate: string): Day[] => {\n  const first = toUTCDate(`${month}-01`);\n  if (first === null) {\n    return [];\n  }\n  const offset = (first.getUTCDay() + 6) % 7;\n  const start = new Date(first);\n  start.setUTCDate(1 - offset);\n  const daysInMonth = new Date(\n    Date.UTC(first.getUTCFullYear(), first.getUTCMonth() + 1, 0),\n  ).getUTCDate();\n  const cells = Math.ceil((offset + daysInMonth) / 7) * 7;\n\n  return [...Array(cells).keys()].map((index) => {\n    const current = new Date(start);\n    current.setUTCDate(start.getUTCDate() + index);\n    const date = toISODate(current);\n    const inMonth = date.slice(0, 7) === month;\n    return {\n      date,\n      label: current.getUTCDate(),\n      inMonth,\n      selectable: inMonth && date >= minDate && !isWeekend(date),\n    };\n  });\n};\n\nexport default (): AlpineComponent<State & Methods> => ({\n  slots: [],\n  minDate: \"\",\n  minimum: MINIMUM,\n  showErrors: false,\n  month: \"\",\n  weekdays: WEEKDAYS,\n\n  init() {\n    if (!(this.$el instanceof HTMLElement)) {\n      return;\n    }\n\n    const leadtime = parseInt(this.$el.dataset[\"leadtime\"] ?? \"7\", 10);\n    this.minDate = computeMinDate(leadtime);\n    this.month = this.minDate.slice(0, 7);\n    this.slots = parseSlots(this.$el.dataset[\"currentslots\"])\n      .filter((slot) => slot.date)\n      .sort((a, b) => a.date.localeCompare(b.date));\n\n    this.$el.addEventListener(\n      \"invalid\",\n      (event) => {\n        event.preventDefault();\n        this.invalid();\n      },\n      true,\n    );\n\n    this.$el\n      .closest(\"form\")\n      ?.addEventListener(\"submit\", (event) => this.submit(event));\n  },\n\n  days(): Day[] {\n    return monthGrid(this.month, this.minDate);\n  },\n\n  monthTitle(): string {\n    const date = toUTCDate(`${this.month}-01`);\n    if (date === null) {\n      return \"\";\n    }\n    return new Intl.DateTimeFormat(\"en-GB\", {\n      month: \"long\",\n      year: \"numeric\",\n    }).format(date);\n  },\n\n  canGoBack(): boolean {\n    return this.month > this.minDate.slice(0, 7);\n  },\n\n  prev() {\n    if (this.canGoBack()) {\n      this.month = addMonths(this.month, -1);\n    }\n  },\n\n  next() {\n    this.month = addMonths(this.month, 1);\n  },\n\n  isSelected(date: string): boolean {\n    return this.slots.some((slot) => slot.date === date);\n  },\n\n  toggle(day: Day) {\n    if (!day.selectable) {\n      return;\n    }\n    if (this.isSelected(day.date)) {\n      this.slots = this.slots.filter((slot) => slot.date !== day.date);\n      return;\n    }\n    this.slots = [...this.slots, { date: day.date, am: true, pm: true }].sort(\n      (a, b) => a.date.localeCompare(b.date),\n    );\n  },\n\n  dayClasses(day: Day): string {\n    if (!day.inMonth) {\n      return \"invisible\";\n    }\n    if (!day.selectable) {\n      return \"text-gray-300 line-through cursor-not-allowed\";\n    }\n    if (this.isSelected(day.date)) {\n      return \"bg-blue-600 text-white font-semibold hover:bg-blue-700\";\n    }\n    return \"bg-white text-gray-900 hover:bg-blue-50 ring-1 ring-gray-200\";\n  },\n\n  remove(index: number) {\n    this.slots.splice(index, 1);\n  },\n\n  formatSlotDate(slot: Slot): string {\n    const years = new Set(this.slots.map((s) => s.date.slice(0, 4)));\n    years.add(this.minDate.slice(0, 4));\n    return formatDateWithWeekday(slot.date, years.size > 1);\n  },\n\n  formatDate(value: string): string {\n    return formatDate(value);\n  },\n\n  formatValue(slot: Slot): string {\n    const am = slot.am ? \"-AM\" : \"\";\n    const pm = slot.pm ? \"-PM\" : \"\";\n    return `${slot.date} ${am} ${pm}`;\n  },\n\n  isValid(slot: Slot): boolean {\n    return isValid(slot, this.minDate);\n  },\n\n  tooEarly(slot: Slot): boolean {\n    return isTooEarly(slot, this.minDate);\n  },\n\n  onWeekend(slot: Slot): boolean {\n    return Boolean(slot.date) && isWeekend(slot.date);\n  },\n\n  slotError(slot: Slot): string {\n    if (this.tooEarly(slot)) {\n      return `The earliest available date is ${formatDate(this.minDate)}. Please choose a later date.`;\n    }\n    if (this.onWeekend(slot)) {\n      return \"We don't survey at weekends. Please choose a weekday.\";\n    }\n    if (this.showErrors && slot.date && !slot.am && !slot.pm) {\n      return \"Tick AM, PM or both for this date.\";\n    }\n    return \"\";\n  },\n\n  countError(): string {\n    if (!this.showErrors) {\n      return \"\";\n    }\n    const remaining = this.remaining();\n    if (remaining === 0) {\n      return this.slots.some((slot) => !isValid(slot, this.minDate))\n        ? \"Tick AM or PM for each chosen day, or remove it.\"\n        : \"\";\n    }\n    return remaining === MINIMUM\n      ? \"Please choose at least 5 days when you're available.\"\n      : `Please choose ${remaining} more ${remaining === 1 ? \"day\" : \"days\"} when you're available.`;\n  },\n\n  invalid() {\n    this.showErrors = true;\n    if (this.$el instanceof HTMLElement) {\n      this.$el.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n    }\n  },\n\n  submit(event: Event) {\n    const incomplete = this.slots.some((slot) => !isValid(slot, this.minDate));\n    if (this.remaining() === 0 && !incomplete) {\n      return;\n    }\n    event.preventDefault();\n    this.invalid();\n  },\n\n  selectedCount(): number {\n    return this.slots.filter((slot) => isValid(slot, this.minDate)).length;\n  },\n\n  remaining(): number {\n    return Math.max(\n      0,\n      MINIMUM - this.slots.filter((slot) => isValid(slot, this.minDate)).length,\n    );\n  },\n});\n", "export type Result<T, E> = { ok: true; value: T } | { ok: false; error: E };\n\nexport const call = async (\n  url: string,\n  options: RequestInit = {},\n): Promise<Result<unknown, unknown>> => {\n  try {\n    const response = await fetch(url, options);\n\n    if (response.status === 204) {\n      return { ok: true, value: undefined };\n    }\n\n    const value: unknown = await response.json();\n\n    return { ok: true, value };\n  } catch (error) {\n    return { ok: false, error };\n  }\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\nimport { call } from \"./fetch\";\n\ninterface State extends Record<string | symbol, unknown> {\n  saving: boolean;\n}\n\nexport default (): AlpineComponent<State> => ({\n  saving: false,\n  async submit(event: Event) {\n    event.preventDefault();\n\n    if (!(event.target instanceof HTMLElement)) {\n      return;\n    }\n\n    const form = event.target.closest(\"form\");\n    if (!form) {\n      return;\n    }\n\n    const body = new FormData(form);\n\n    const csrf = body.get(\"csrfmiddlewaretoken\");\n    if (typeof csrf !== \"string\") {\n      return;\n    }\n\n    this.saving = true;\n    await call(form.action, {\n      body,\n      headers: {\n        Accept: \"application/json\",\n        \"X-CSRFToken\": csrf,\n      },\n      method: \"POST\",\n    });\n    this.saving = false;\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface ShareLink {\n  token: string;\n  url: string;\n  audience: string;\n  audience_label: string;\n  measures: string[];\n  created: string;\n  expires: string;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  links: ShareLink[];\n  unshareUrl: string;\n  creating: boolean;\n  error: string;\n  copiedUrl: string | null;\n  pendingDelete: ShareLink | null;\n  init(): void;\n  submit(event: SubmitEvent): Promise<void>;\n  copy(url: string): void;\n  askRemove(link: ShareLink): void;\n  cancelRemove(): void;\n  remove(): Promise<void>;\n  pendingLabel(): string;\n  fullUrl(url: string): string;\n  linkMeta(link: ShareLink): string;\n}\n\n// Posts the \"Create share link\" form without leaving the page and lists the\n// resulting links (seeded with any that already exist) with copy and delete\n// buttons; deleting goes through a confirmation dialog (pendingDelete). The\n// share endpoint returns JSON {token, url, audience, audience_label,\n// measures, created, expires}; existing links are seeded server-side via\n// data-links, and data-unshare-url is the endpoint that revokes a token.\nexport default (): AlpineComponent<State> => ({\n  links: [],\n  unshareUrl: \"\",\n  creating: false,\n  error: \"\",\n  copiedUrl: null,\n  pendingDelete: null,\n\n  init() {\n    const seeded = this.$root.dataset[\"links\"];\n    if (seeded) {\n      this.links = JSON.parse(seeded) as ShareLink[];\n    }\n    this.unshareUrl = this.$root.dataset[\"unshareUrl\"] ?? \"\";\n  },\n\n  async submit(event: SubmitEvent) {\n    if (!(event.target instanceof HTMLFormElement)) {\n      return;\n    }\n    event.preventDefault();\n    if (this.creating) {\n      return;\n    }\n    this.creating = true;\n    this.error = \"\";\n    const form = event.target;\n    let response;\n    try {\n      response = await fetch(form.action, {\n        body: new FormData(form),\n        headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n        method: \"POST\",\n      });\n    } catch {\n      this.creating = false;\n      this.error = \"Could not create share link: network error.\";\n      return;\n    }\n    this.creating = false;\n    if (!response.ok) {\n      this.error = \"Could not create share link.\";\n      return;\n    }\n    const link = (await response.json()) as ShareLink;\n    this.links = [link, ...this.links];\n  },\n\n  copy(url: string) {\n    navigator.clipboard.writeText(this.fullUrl(url)).then(() => {\n      this.copiedUrl = url;\n      setTimeout(() => {\n        this.copiedUrl = null;\n      }, 2000);\n    });\n  },\n\n  askRemove(link: ShareLink) {\n    this.pendingDelete = link;\n  },\n\n  cancelRemove() {\n    this.pendingDelete = null;\n  },\n\n  // Deletes the link confirmed in the dialog (this.pendingDelete).\n  async remove() {\n    const link = this.pendingDelete;\n    if (!link) {\n      return;\n    }\n    this.pendingDelete = null;\n    const csrf = this.$root.querySelector<HTMLInputElement>(\n      'input[name=\"csrfmiddlewaretoken\"]',\n    );\n    const body = new FormData();\n    body.append(\"csrfmiddlewaretoken\", csrf?.value ?? \"\");\n    body.append(\"token\", link.token);\n    let response;\n    try {\n      response = await fetch(this.unshareUrl, {\n        body,\n        headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n        method: \"POST\",\n      });\n    } catch {\n      this.error = \"Could not delete share link: network error.\";\n      return;\n    }\n    if (!response.ok) {\n      this.error = \"Could not delete share link.\";\n      return;\n    }\n    this.links = this.links.filter((l) => l.token !== link.token);\n  },\n\n  pendingLabel(): string {\n    return this.pendingDelete ? this.fullUrl(this.pendingDelete.url) : \"\";\n  },\n\n  fullUrl(url: string): string {\n    return new URL(url, window.location.origin).href;\n  },\n\n  linkMeta(link: ShareLink): string {\n    const expires = link.expires ? `expires ${link.expires}` : \"\";\n    return [link.audience_label, link.created, expires]\n      .filter(Boolean)\n      .join(\" \u00B7 \");\n  },\n});\n", "/**\n * Linework \u2014 the drawing maths every figure shares, with no DOM.\n *\n * Adapted from @lucasmarkes/hairline's src/core/iso.ts (MIT, see LICENSE in\n * this folder) for this repo's strict tsconfig.\n *\n * Everything is in viewBox units: every figure is drawn in a 400 \u00D7 320 box and\n * scaled to its column by the svg. World space is x/y on the ground and z up;\n * the camera turns the ground by an azimuth, then squashes y by sin(el) and\n * lifts z by cos(el). There is no perspective and no hidden-line removal:\n * plates are filled with the ground colour and painted back to front, so a\n * nearer one simply covers.\n */\n\nexport type Vec2 = [number, number];\nexport type Vec3 = [number, number, number];\n\n/** A sample on a rounded outline, with its outward normal on the ground plane. */\nexport type Sample = { u: number; v: number; nu: number; nv: number };\nexport type Ring = Sample[];\n\n/** An orthographic camera: azimuth in radians, k = sin(elevation), scale, and the offset `fit` sets. */\nexport type Camera = {\n  az: number;\n  k: number;\n  S: number;\n  ox: number;\n  oy: number;\n};\nexport type Projector = (x: number, y: number, z: number) => Vec2;\n\n/** Two lines of a solid: its silhouette and the one dim crease inside it. */\nexport type PrismPaths = { sil: string; crease: string };\n\nexport const clamp = (v: number, a: number, b: number) =>\n  Math.max(a, Math.min(b, v));\nexport const lerp = (a: number, b: number, t: number) => a + (b - a) * t;\nexport const rad = (d: number) => (d * Math.PI) / 180;\n/** Two decimals: enough for a hairline at any zoom, and path strings stay short. */\nexport const r2 = (n: number) => Math.round(n * 100) / 100;\n\nconst pt = (p: Vec2) => `${r2(p[0])} ${r2(p[1])}`;\n/** A closed path through the points. */\nexport const poly = (pts: readonly Vec2[]) =>\n  pts.length < 2 ? \"\" : `M${pts.map(pt).join(\"L\")}Z`;\n/** One straight segment, as its own subpath, so several can be joined into one `d`. */\nexport const seg = (a: Vec2, b: Vec2) => `M${pt(a)}L${pt(b)}`;\n/** An open polyline; empty for fewer than two points. */\nexport const open = (pts: readonly Vec2[]) =>\n  pts.length < 2 ? \"\" : `M${pts.map(pt).join(\"L\")}`;\n\n/* ---------- projection ---------- */\n\nexport const Cam = (azDeg: number, k: number, S: number): Camera => ({\n  az: rad(azDeg),\n  k,\n  S,\n  ox: 0,\n  oy: 0,\n});\n\n/** The projector for the camera as it is now. */\nexport function proj(C: Camera): Projector {\n  const c = Math.cos(C.az);\n  const s = Math.sin(C.az);\n  const zf = Math.sqrt(1 - C.k * C.k);\n  return (x, y, z) => {\n    const X = x * c - y * s;\n    const Y = x * s + y * c;\n    return [C.ox + C.S * X, C.oy + C.S * (Y * C.k - z * zf)];\n  };\n}\n\n/**\n * The world x/y under a screen point, on the plane at height z. Hover is\n * tested in world units against a plane that never moves, never in pixels.\n */\nexport function unproj(C: Camera, sx: number, sy: number, z: number): Vec2 {\n  const c = Math.cos(C.az);\n  const s = Math.sin(C.az);\n  const zf = Math.sqrt(1 - C.k * C.k);\n  const X = (sx - C.ox) / C.S;\n  const Y = ((sy - C.oy) / C.S + z * zf) / C.k;\n  return [X * c + Y * s, -X * s + Y * c];\n}\n\n/**\n * The world point (a, z) on a vertical plane under a screen point. The plane\n * holds `origin` and runs along `along` (a unit vector on the ground).\n */\nexport function onWall(P: Projector, origin: Vec3, along: Vec2, p: Vec2): Vec2 {\n  const o = P(...origin);\n  const a = P(origin[0] + along[0], origin[1] + along[1], origin[2]);\n  const b = P(origin[0], origin[1], origin[2] + 1);\n  const ex = [a[0] - o[0], a[1] - o[1]] as const;\n  const ez = [b[0] - o[0], b[1] - o[1]] as const;\n  const det = ex[0] * ez[1] - ex[1] * ez[0];\n  const qx = p[0] - o[0];\n  const qy = p[1] - o[1];\n  return [(qx * ez[1] - qy * ez[0]) / det, (ex[0] * qy - ex[1] * qx) / det];\n}\n\n/** Sets the camera's offset so the bounding box of `pts` is centred on (cx, cy). */\nexport function fit(C: Camera, pts: readonly Vec3[], cx = 200, cy = 166) {\n  C.ox = 0;\n  C.oy = 0;\n  const P = proj(C);\n  let a = 1e9;\n  let b = -1e9;\n  let c = 1e9;\n  let d = -1e9;\n  for (const p of pts) {\n    const q = P(p[0], p[1], p[2]);\n    a = Math.min(a, q[0]);\n    b = Math.max(b, q[0]);\n    c = Math.min(c, q[1]);\n    d = Math.max(d, q[1]);\n  }\n  C.ox = cx - (a + b) / 2;\n  C.oy = cy - (c + d) / 2;\n}\n\n/** The eight corners of a box, for `fit`. */\nexport const corners = (\n  x0: number,\n  y0: number,\n  z0: number,\n  x1: number,\n  y1: number,\n  z1: number,\n): Vec3[] => [\n  [x0, y0, z0],\n  [x1, y0, z0],\n  [x0, y1, z0],\n  [x1, y1, z0],\n  [x0, y0, z1],\n  [x1, y0, z1],\n  [x0, y1, z1],\n  [x1, y1, z1],\n];\n\n/* ---------- rounded solids ---------- */\n\n/** A rounded rectangle, sampled, each sample with its outward normal. `n` samples per corner. */\nexport function rrect(\n  u0: number,\n  v0: number,\n  u1: number,\n  v1: number,\n  r: number,\n  n = 4,\n): Ring {\n  const rr = Math.max(0, Math.min(r, (u1 - u0) / 2, (v1 - v0) / 2));\n  const out: Ring = [];\n  const quads: Array<[number, number, number]> = [\n    [u1 - rr, v1 - rr, 0],\n    [u0 + rr, v1 - rr, 90],\n    [u0 + rr, v0 + rr, 180],\n    [u1 - rr, v0 + rr, 270],\n  ];\n  for (const [cu, cv, a0] of quads)\n    for (let k = 0; k <= n; k++) {\n      const a = rad(a0 + (90 * k) / n);\n      const ca = Math.cos(a);\n      const sa = Math.sin(a);\n      out.push({ u: cu + rr * ca, v: cv + rr * sa, nu: ca, nv: sa });\n    }\n  return out;\n}\n\n/** A circle of radius R about (cu, cv), sampled the same way. */\nexport function circ(R: number, n = 64, cu = 0, cv = 0): Ring {\n  const out: Ring = [];\n  for (let k = 0; k < n; k++) {\n    const a = (k / n) * Math.PI * 2;\n    const ca = Math.cos(a);\n    const sa = Math.sin(a);\n    out.push({ u: cu + R * ca, v: cv + R * sa, nu: ca, nv: sa });\n  }\n  return out;\n}\n\n/** Convex hull (monotone chain), counter-clockwise in screen space. */\nexport function hull(input: readonly Vec2[]): Vec2[] {\n  const pts = input.slice().sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n  const x = (o: Vec2, a: Vec2, b: Vec2) =>\n    (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);\n  const lo: Vec2[] = [];\n  const up: Vec2[] = [];\n  for (const p of pts) {\n    while (lo.length > 1 && x(lo[lo.length - 2]!, lo[lo.length - 1]!, p) <= 0)\n      lo.pop();\n    lo.push(p);\n  }\n  for (let i = pts.length - 1; i >= 0; i--) {\n    const p = pts[i]!;\n    while (up.length > 1 && x(up[up.length - 2]!, up[up.length - 1]!, p) <= 0)\n      up.pop();\n    up.push(p);\n  }\n  lo.pop();\n  up.pop();\n  return lo.concat(up);\n}\n\n/** A ring laid flat at height z, projected. */\nexport const ringAt = (\n  P: Projector,\n  ring: readonly Sample[],\n  z: number,\n): Vec2[] => ring.map((q) => P(q.u, q.v, z));\n\n/** Whether a ring sample faces the camera: screen-down is (sin az, cos az) on the ground. */\nexport const facing = (C: Camera) => {\n  const s = Math.sin(C.az);\n  const c = Math.cos(C.az);\n  return (q: Sample) => q.nu * s + q.nv * c >= -1e-6;\n};\n\n/** The one cyclic run of samples that pass `keep`, in ring order. */\nexport function run(\n  ring: readonly Sample[],\n  keep: (q: Sample) => boolean,\n): Ring {\n  const n = ring.length;\n  const at = (i: number) => ring[((i % n) + n) % n]!;\n  let s = -1;\n  for (let i = 0; i < n; i++)\n    if (keep(at(i)) && !keep(at(i - 1))) {\n      s = i;\n      break;\n    }\n  if (s < 0) return n && keep(at(0)) ? ring.slice() : [];\n  const out: Ring = [];\n  for (let k = 0; k < n && keep(at(s + k)); k++) out.push(at(s + k));\n  return out;\n}\n\n/**\n * A prism standing from z0 to z1. Its silhouette is the hull of the two rings,\n * so the vertical corners are never drawn; its only inner line is the crease,\n * the front run of an inset ring on the lid, which reads as a bevel.\n */\nexport function prism(\n  P: Projector,\n  front: (q: Sample) => boolean,\n  ring: readonly Sample[],\n  inner: readonly Sample[] | null,\n  z0: number,\n  z1: number,\n): PrismPaths {\n  return {\n    sil: poly(hull(ringAt(P, ring, z1).concat(ringAt(P, ring, z0)))),\n    crease: inner ? open(ringAt(P, run(inner, front), z1)) : \"\",\n  };\n}\n\n/** A rounded footprint and its crease ring, inset by b. */\nexport const rings = (\n  x0: number,\n  y0: number,\n  x1: number,\n  y1: number,\n  r: number,\n  b: number,\n): [Ring, Ring] => [\n  rrect(x0, y0, x1, y1, r),\n  rrect(x0 + b, y0 + b, x1 - b, y1 - b, Math.max(0.3, r - b)),\n];\n\n/** Rounds every vertex of a closed polygon with a quadratic through the vertex; one radius per vertex. */\nexport function fillet(\n  pts: readonly Vec2[],\n  rs: readonly number[] | number,\n  n = 4,\n): Vec2[] {\n  const m = pts.length;\n  const out: Vec2[] = [];\n  for (let i = 0; i < m; i++) {\n    const a = pts[(i + m - 1) % m]!;\n    const p = pts[i]!;\n    const b = pts[(i + 1) % m]!;\n    const la = Math.hypot(a[0] - p[0], a[1] - p[1]);\n    const lb = Math.hypot(b[0] - p[0], b[1] - p[1]);\n    const r = typeof rs === \"number\" ? rs : (rs[i] ?? 0);\n    const t = Math.min(r, la / 2, lb / 2);\n    if (t <= 0) {\n      out.push(p);\n      continue;\n    }\n    const p1 = [\n      p[0] + ((a[0] - p[0]) / la) * t,\n      p[1] + ((a[1] - p[1]) / la) * t,\n    ] as const;\n    const p2 = [\n      p[0] + ((b[0] - p[0]) / lb) * t,\n      p[1] + ((b[1] - p[1]) / lb) * t,\n    ] as const;\n    for (let k = 0; k <= n; k++) {\n      const s = k / n;\n      const w = 1 - s;\n      out.push([\n        w * w * p1[0] + 2 * w * s * p[0] + s * s * p2[0],\n        w * w * p1[1] + 2 * w * s * p[1] + s * s * p2[1],\n      ]);\n    }\n  }\n  return out;\n}\n", "import { clamp } from \"./iso\";\n\n/**\n * Linework \u2014 the two clocks, with no DOM. A discrete change (which layer)\n * gets a long ease-out on a tween; a continuous input (where the pointer is)\n * gets a spring, because its target moves every frame and a timed ease would\n * always be chasing it.\n *\n * Adapted from @lucasmarkes/hairline's src/core/motion.ts (MIT, see LICENSE).\n *\n * Reduced motion is one flag here rather than a `matchMedia` call, so this\n * file stays pure and a test can flip it. stage.ts owns the only media query.\n * With it on, springs and tweens land on their target in one step.\n */\n\nlet reduced = false;\nexport const setReducedMotion = (on: boolean) => {\n  reduced = on;\n};\nexport const reducedMotion = () => reduced;\n\nexport type Spring = {\n  x: number;\n  v: number;\n  t: number;\n  k: number;\n  c: number;\n  m: number;\n  eps: number;\n};\nexport type SpringOptions = {\n  k?: number;\n  c?: number;\n  m?: number;\n  eps?: number;\n};\n\n/** A spring at rest on x. k 100 \u00B7 c 18 \u00B7 m 1 unless told otherwise; `eps` is when it counts as settled. */\nexport function spring(x: number, o: SpringOptions = {}): Spring {\n  return {\n    x,\n    v: 0,\n    t: x,\n    k: o.k ?? 100,\n    c: o.c ?? 18,\n    m: o.m ?? 1,\n    eps: o.eps ?? 0.01,\n  };\n}\n\n/**\n * Advances a spring by dt seconds toward `sp.t`, substepped at 240 Hz so a\n * long frame can't make it overshoot. Returns whether it is still moving.\n */\nexport function stepS(sp: Spring, dt: number): boolean {\n  if (reduced) {\n    sp.x = sp.t;\n    sp.v = 0;\n    return false;\n  }\n  const n = Math.max(1, Math.ceil(dt * 240)),\n    h = dt / n;\n  for (let i = 0; i < n; i++) {\n    const a = (-sp.k * (sp.x - sp.t) - sp.c * sp.v) / sp.m;\n    sp.v += a * h;\n    sp.x += sp.v * h;\n  }\n  if (Math.abs(sp.x - sp.t) < sp.eps && Math.abs(sp.v) < sp.eps * 10) {\n    sp.x = sp.t;\n    sp.v = 0;\n    return false;\n  }\n  return true;\n}\n\n/** A CSS cubic-bezier as a function of progress: Newton first, bisection if it strays. */\nexport function bezier(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n): (t: number) => number {\n  const cx = 3 * x1,\n    bx = 3 * (x2 - x1) - cx,\n    ax = 1 - cx - bx;\n  const cy = 3 * y1,\n    by = 3 * (y2 - y1) - cy,\n    ay = 1 - cy - by;\n  const X = (u: number) => ((ax * u + bx) * u + cx) * u;\n  const Y = (u: number) => ((ay * u + by) * u + cy) * u;\n  const dX = (u: number) => (3 * ax * u + 2 * bx) * u + cx;\n  return (t) => {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    let u = t;\n    for (let i = 0; i < 8; i++) {\n      const e = X(u) - t;\n      if (Math.abs(e) < 1e-5) break;\n      const d = dX(u);\n      if (Math.abs(d) < 1e-6) break;\n      u -= e / d;\n    }\n    if (!(u >= 0 && u <= 1) || Math.abs(X(u) - t) > 1e-4) {\n      let lo = 0,\n        hi = 1;\n      u = t;\n      for (let i = 0; i < 24; i++) {\n        if (X(u) < t) lo = u;\n        else hi = u;\n        u = (lo + hi) / 2;\n      }\n    }\n    return Y(u);\n  };\n}\n\n/** Linear's lift curve, 700ms (.32, .72, 0, 1): the discrete clock. */\nexport const EASE_LIFT = bezier(0.32, 0.72, 0, 1);\n\n/**\n * A tween on EASE_LIFT. `t0` is when it starts (it may be in the future: that\n * is how a stagger delays it), `dur` how long it runs, in ms of `now`.\n */\nexport type Tween = { from: number; to: number; t0: number; dur: number };\nexport const tween = (v: number, dur = 700): Tween => ({\n  from: v,\n  to: v,\n  t0: -1e9,\n  dur,\n});\n/** Where the tween is at `now`. */\nexport const tval = (tw: Tween, now: number) => {\n  const p = clamp((now - tw.t0) / tw.dur, 0, 1);\n  return tw.from + (tw.to - tw.from) * (reduced ? 1 : EASE_LIFT(p));\n};\n/** Retargets from wherever it is now, starting after `delay` ms. A no-op if the target is unchanged. */\nexport const tset = (tw: Tween, to: number, now: number, delay: number) => {\n  if (tw.to === to) return;\n  tw.from = tval(tw, now);\n  tw.to = to;\n  tw.t0 = now + delay;\n};\nexport const tdone = (tw: Tween, now: number) =>\n  reduced || now >= tw.t0 + tw.dur;\n", "import { r2, type Vec2 } from \"./iso\";\nimport { setReducedMotion } from \"./motion\";\n\n/**\n * Linework \u2014 the DOM side every figure shares: making svg nodes, one frame\n * loop for every figure on the page, the pointer, and the only reduced-motion\n * query.\n *\n * Adapted from @lucasmarkes/hairline's src/core/stage.ts (MIT, see LICENSE).\n *\n * Everything comes apart: `register` hands back an unregister, `pointer` a\n * disposer, and `disposer()` collects them so a figure's `destroy` is one\n * call. Once the last figure is unregistered no frame, observer or media\n * listener is left behind.\n */\n\n/* ---------- the contract ---------- */\n\n/** Where an engine writes its caption. */\nexport type Readout = { textContent: string | null };\nexport type FigureEls = {\n  stage: HTMLElement;\n  svg: SVGSVGElement;\n  read: Readout;\n};\nexport type FigureHandle = { set(value: number): void; destroy(): void };\n/** An engine: draws into `svg`, answers the pointer on `stage`, and takes the slider's number. */\nexport type FigureMount = (els: FigureEls, value: number) => FigureHandle;\n\n/* ---------- svg ---------- */\n\nconst NS = \"http://www.w3.org/2000/svg\";\nexport type Attrs = Record<string, string | number>;\n\n/** One svg element, with its attributes, appended to `parent` when there is one. */\nexport function mk<K extends keyof SVGElementTagNameMap>(\n  tag: K,\n  attrs?: Attrs | null,\n  parent?: Element | null,\n): SVGElementTagNameMap[K] {\n  const e = document.createElementNS(NS, tag);\n  if (attrs) for (const k in attrs) e.setAttribute(k, String(attrs[k]));\n  if (parent) parent.appendChild(e);\n  return e;\n}\n\n/** A path with a class, appended to `parent`. */\nexport const path = (parent: Element, cls = \"\", d = \"\") =>\n  mk(\"path\", { class: cls, d }, parent);\n\n/** Sets a path's `d` only when it changed, so a settled frame writes nothing. */\nexport function draw(el: SVGPathElement, d: string) {\n  if (el.getAttribute(\"d\") !== d) el.setAttribute(\"d\", d);\n}\n\n/** A solid's two paths in one group: the silhouette (`.sil`) and its crease (`.nf.lo`). */\nexport type Solid = { g: SVGGElement; sil: SVGPathElement; cr: SVGPathElement };\nexport function solid(parent: Element): Solid {\n  const g = mk(\"g\", {}, parent);\n  return {\n    g,\n    sil: mk(\"path\", { class: \"sil\" }, g),\n    cr: mk(\"path\", { class: \"nf lo\" }, g),\n  };\n}\n/** Writes a prism's paths into a solid. */\nexport const put = (el: Solid, s: { sil: string; crease: string }) => {\n  draw(el.sil, s.sil);\n  draw(el.cr, s.crease);\n};\n\n/** A round dot. Position it with `place`. */\nexport const dot = (parent: Element, r: number, cls = \"dot\") =>\n  mk(\"ellipse\", { rx: r2(r), ry: r2(r), class: cls }, parent);\nexport const place = (el: SVGElement, q: Vec2) => {\n  el.setAttribute(\"cx\", String(r2(q[0])));\n  el.setAttribute(\"cy\", String(r2(q[1])));\n};\n\n/* ---------- one loop, asleep offscreen ---------- */\n\n/** A figure's frame: dt in seconds (capped at 50ms), now in ms. Returns whether it wants another frame. */\nexport type Tick = (dt: number, now: number) => boolean | undefined;\nexport type Loop = {\n  /** Ask for frames again after input; the loop runs until the tick returns false. */\n  wake(): void;\n  /** Leave the loop and the observer. Idempotent. */\n  unregister(): void;\n};\ntype Board = { stage: Element; tick: Tick; vis: boolean; awake: boolean };\n\nlet boards: Board[] = [];\nconst byStage = new Map<Element, Board>();\nlet raf = 0;\nlet last = 0;\nlet io: IntersectionObserver | null = null;\nlet rm: MediaQueryList | null = null;\n\nfunction frame(now: number) {\n  const dt = Math.min(0.05, Math.max(0, (now - last) / 1000));\n  last = now;\n  let any = false;\n  for (const b of boards.slice())\n    if (b.vis && b.awake) {\n      b.awake = !!b.tick(dt, now);\n      any = any || b.awake;\n    }\n  raf = any ? requestAnimationFrame(frame) : 0;\n}\n\nfunction wake(b: Board) {\n  b.awake = true;\n  if (!raf) {\n    last = performance.now();\n    raf = requestAnimationFrame(frame);\n  }\n}\n\nconst onMotion = () => {\n  setReducedMotion(!!rm?.matches);\n  boards.forEach(wake);\n};\n\nfunction start(): IntersectionObserver {\n  if (io) return io;\n  io = new IntersectionObserver(\n    (es) => {\n      for (const e of es) {\n        const b = byStage.get(e.target);\n        if (!b) continue;\n        b.vis = e.isIntersecting;\n        if (b.vis) wake(b);\n      }\n    },\n    { rootMargin: \"80px\" },\n  );\n  rm = matchMedia(\"(prefers-reduced-motion: reduce)\");\n  setReducedMotion(rm.matches);\n  rm.addEventListener(\"change\", onMotion);\n  return io;\n}\n\nfunction stop() {\n  if (raf) cancelAnimationFrame(raf);\n  raf = 0;\n  io?.disconnect();\n  io = null;\n  rm?.removeEventListener(\"change\", onMotion);\n  rm = null;\n}\n\n/**\n * Joins the shared loop. The tick runs once now, so the figure is drawn\n * before it is ever on screen, then on every frame while its stage is within\n * 80px of the viewport and it keeps returning true. Offscreen it sleeps.\n */\nexport function register(stage: Element, tick: Tick): Loop {\n  const observer = start();\n  const b: Board = { stage, tick, vis: false, awake: true };\n  boards.push(b);\n  byStage.set(stage, b);\n  observer.observe(stage);\n  tick(0, performance.now());\n  let gone = false;\n  return {\n    wake: () => {\n      if (!gone) wake(b);\n    },\n    unregister: () => {\n      if (gone) return;\n      gone = true;\n      boards = boards.filter((x) => x !== b);\n      if (byStage.get(stage) === b) {\n        byStage.delete(stage);\n        io?.unobserve(stage);\n      }\n      if (!boards.length) stop();\n    },\n  };\n}\n\n/* ---------- pointer ---------- */\n\nexport type PointerHandlers = {\n  /** The pointer in viewBox units (400 \u00D7 320). */\n  move(p: Vec2, e: PointerEvent): void;\n  leave(e: PointerEvent): void;\n};\n\n/**\n * Pointer input in viewBox units. A mouse leaving acts at once; a finger\n * lifting holds the pose for 1.4s first, so a tap reads as a look rather than\n * a flash. Returns the disposer.\n */\nexport function pointer(stage: HTMLElement, on: PointerHandlers): () => void {\n  let tm = 0;\n  const pt = (e: PointerEvent): Vec2 => {\n    const r = stage.getBoundingClientRect();\n    return [\n      ((e.clientX - r.left) / r.width) * 400,\n      ((e.clientY - r.top) / r.height) * 320,\n    ];\n  };\n  const move = (e: PointerEvent) => {\n    clearTimeout(tm);\n    on.move(pt(e), e);\n  };\n  const down = (e: PointerEvent) => {\n    clearTimeout(tm);\n    if (e.pointerType !== \"mouse\") stage.releasePointerCapture?.(e.pointerId);\n    on.move(pt(e), e);\n  };\n  const leave = (e: PointerEvent) => {\n    clearTimeout(tm);\n    tm = window.setTimeout(\n      () => on.leave(e),\n      e.pointerType === \"mouse\" ? 0 : 1400,\n    );\n  };\n  stage.addEventListener(\"pointermove\", move);\n  stage.addEventListener(\"pointerdown\", down);\n  stage.addEventListener(\"pointerleave\", leave);\n  return () => {\n    clearTimeout(tm);\n    stage.removeEventListener(\"pointermove\", move);\n    stage.removeEventListener(\"pointerdown\", down);\n    stage.removeEventListener(\"pointerleave\", leave);\n  };\n}\n\n/* ---------- tear-down ---------- */\n\nexport type Disposer = {\n  /** Something to run on dispose: a Loop's unregister, pointer()'s return. */\n  add(fn: () => void): void;\n  /** Runs everything added, last first, once. */\n  dispose(): void;\n};\n\nexport function disposer(): Disposer {\n  let fns: Array<() => void> = [];\n  return {\n    add: (fn) => {\n      fns.push(fn);\n    },\n    dispose: () => {\n      const all = fns;\n      fns = [];\n      for (let i = all.length - 1; i >= 0; i--) all[i]?.();\n    },\n  };\n}\n", "/**\n * Linework \u2014 the stylesheet, and the one function that puts it in a document.\n *\n * Adapted from @lucasmarkes/hairline's src/core/styles.ts (MIT, see LICENSE),\n * with Furbnow's palette: one orange stroke is the only highlight, every\n * other line is a slate grey in three weights.\n *\n * Every selector is inside `:where()`, so each rule has zero specificity and a\n * rule of the page's always wins. The `--linework-*` properties are the\n * public theme; set `--linework-plate` to the background the figure sits on.\n */\n\nconst LIGHT = {\n  plate: \"#ffffff\",\n  hi: \"#ff6338\",\n  edge: \"#8b93a1\",\n  mid: \"#c3c9d2\",\n  lo: \"#e2e6eb\",\n};\nconst DARK = {\n  plate: \"#1d242f\",\n  hi: \"#ff7a55\",\n  edge: \"#8a94a6\",\n  mid: \"#4b5566\",\n  lo: \"#333c4a\",\n};\nconst KEYS = [\"plate\", \"hi\", \"edge\", \"mid\", \"lo\"] as const;\ntype Palette = Record<(typeof KEYS)[number], string>;\n\nconst vars = (p: Palette) =>\n  KEYS.map((k) => `--lw-${k}:var(--linework-${k},${p[k]});`).join(\"\");\nconst EASE = \"cubic-bezier(0.5,0,0.1,1)\";\nconst SVG = \":where([data-linework]>svg)\";\n\nexport function css(): string {\n  return [\n    `:where([data-linework]){display:block;position:relative;aspect-ratio:5/4;touch-action:pan-y;user-select:none;-webkit-user-select:none;--lw-sw:var(--linework-stroke,0.9);${vars(LIGHT)}}`,\n    `:where(.dark,[data-theme=\"dark\"]) :where([data-linework]){${vars(DARK)}}`,\n    `:where([data-linework][data-linework-theme=\"light\"]){${vars(LIGHT)}}`,\n    `:where([data-linework][data-linework-theme=\"dark\"]){${vars(DARK)}}`,\n    `${SVG}{position:absolute;inset:0;width:100%;height:100%;display:block;overflow:visible}`,\n    `${SVG} :where(path,polygon,ellipse,line){fill:var(--lw-plate);stroke:var(--lw-mid);stroke-width:var(--lw-sw);vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round;transition:stroke 260ms ${EASE}}`,\n    `${SVG} :where(.nf){fill:none}`,\n    `${SVG} :where(.fo){stroke:none}`,\n    `${SVG} :where(.sil){stroke:var(--lw-edge)}`,\n    `${SVG} :where(.hi){stroke:var(--lw-hi)}`,\n    `${SVG} :where(.lo){stroke:var(--lw-lo)}`,\n    `${SVG} :where(.dash){stroke-dasharray:1 3}`,\n    `${SVG} :where(.dot){stroke:none;fill:var(--lw-hi);transition:fill 260ms ${EASE}}`,\n    `${SVG} :where(.dot.m){fill:var(--lw-edge)}`,\n    `${SVG} :where(.dot.off){fill:var(--lw-mid)}`,\n  ].join(\"\");\n}\n\n/** Puts the stylesheet in the document, once. */\nexport function inject(doc: Document): void {\n  if (doc.querySelector(\"style[data-linework-style]\")) return;\n  const style = doc.createElement(\"style\");\n  style.setAttribute(\"data-linework-style\", \"\");\n  style.textContent = css();\n  doc.head.appendChild(style);\n}\n", "import { clamp, lerp, open, r2, type Vec2 } from \"./core/iso\";\nimport { EASE_LIFT, reducedMotion, spring, stepS } from \"./core/motion\";\nimport { disposer, draw, mk, path, register } from \"./core/stage\";\nimport { inject } from \"./core/styles\";\n\n/**\n * Clip \u2014 the ops Home assistant, drawn in linework's hairline style. Not a\n * measure figure (it isn't in FIGURES or LINEWORK): a flat 100 \u00D7 140 drawing\n * whose one line redraws itself from shape to shape, with two eyes that ride\n * along and follow the pointer.\n *\n * Every shape is a main stroke, an optional second stroke, an optional dot\n * and where the eyes sit. Strokes are resampled to fixed point counts, so a\n * morph is point-to-point interpolation on the 700ms lift curve, swept a\n * little along the line. A missing second stroke shrinks into the end of the\n * main one; a missing dot shrinks to nothing.\n */\n\nexport type Shape = {\n  main: readonly Vec2[];\n  sub?: readonly Vec2[];\n  dot?: Vec2;\n  eyes: readonly [Vec2, Vec2];\n  /** Draw the strokes in Furbnow orange rather than the edge grey. */\n  hi?: boolean;\n};\n\nconst deg = (d: number) => (d * Math.PI) / 180;\n\n/** Points along a circle from a0 to a1 degrees (y down, so 270 is the top). */\nexport function arc(\n  cx: number,\n  cy: number,\n  r: number,\n  a0: number,\n  a1: number,\n  n = 32,\n): Vec2[] {\n  const pts: Vec2[] = [];\n  for (let i = 0; i <= n; i++) {\n    const a = deg(lerp(a0, a1, i / n));\n    pts.push([cx + r * Math.cos(a), cy + r * Math.sin(a)]);\n  }\n  return pts;\n}\n\nfunction star(cx: number, cy: number, R: number, r: number): Vec2[] {\n  const pts: Vec2[] = [];\n  for (let i = 0; i <= 10; i++) {\n    const a = deg(-90 + i * 36);\n    const k = i % 2 ? r : R;\n    pts.push([cx + k * Math.cos(a), cy + k * Math.sin(a)]);\n  }\n  return pts;\n}\n\nfunction heart(cx: number, cy: number, s: number): Vec2[] {\n  const pts: Vec2[] = [];\n  for (let i = 0; i <= 64; i++) {\n    const t = (i / 64) * Math.PI * 2;\n    const x = 16 * Math.sin(t) ** 3;\n    const y =\n      13 * Math.cos(t) -\n      5 * Math.cos(2 * t) -\n      2 * Math.cos(3 * t) -\n      Math.cos(4 * t);\n    pts.push([cx + x * s, cy - y * s]);\n  }\n  return pts;\n}\n\nconst corner = (cx: number, cy: number, r: number, a: number): Vec2 => [\n  cx + r * Math.cos(deg(a)),\n  cy + r * Math.sin(deg(a)),\n];\n\nexport const SHAPES = {\n  clip: {\n    main: [\n      [40, 100],\n      ...arc(52, 40, 12, 180, 360),\n      ...arc(45, 105, 19, 0, 180),\n      [26, 52],\n    ],\n    eyes: [\n      [37, 50],\n      [59, 46],\n    ],\n  },\n  question: {\n    main: [...arc(50, 46, 20, 180, 405), [50, 76], [50, 92]],\n    dot: [50, 112],\n    eyes: [\n      [43, 44],\n      [57, 44],\n    ],\n  },\n  exclamation: {\n    main: [\n      [44, 24],\n      [56, 24],\n      [53, 90],\n      [47, 90],\n      [44, 24],\n    ],\n    dot: [50, 112],\n    eyes: [\n      [40, 46],\n      [60, 46],\n    ],\n  },\n  star: {\n    main: star(50, 74, 42, 18),\n    eyes: [\n      [43, 72],\n      [57, 72],\n    ],\n    hi: true,\n  },\n  logo: {\n    main: [\n      [14, 120],\n      [14, 64],\n      [40, 46],\n      [60, 60],\n    ],\n    sub: [\n      [50, 120],\n      [50, 82],\n      [71, 67],\n      [92, 82],\n      [92, 120],\n    ],\n    eyes: [\n      [64, 92],\n      [78, 92],\n    ],\n    hi: true,\n  },\n  lightbulb: {\n    main: [[42, 98], ...arc(50, 58, 26, 125, 415), [58, 98]],\n    sub: [\n      [42, 104],\n      [58, 104],\n      [56, 114],\n      [44, 114],\n      [42, 104],\n    ],\n    eyes: [\n      [42, 58],\n      [58, 58],\n    ],\n    hi: true,\n  },\n  tick: {\n    main: [\n      [18, 78],\n      [40, 102],\n      [84, 42],\n    ],\n    eyes: [\n      [30, 52],\n      [46, 52],\n    ],\n    hi: true,\n  },\n  heart: {\n    main: heart(50, 68, 2.5),\n    eyes: [\n      [38, 60],\n      [62, 60],\n    ],\n    hi: true,\n  },\n  house: {\n    main: [\n      [22, 118],\n      [22, 68],\n      [50, 40],\n      [78, 68],\n      [78, 118],\n      [58, 118],\n      [58, 94],\n      [42, 94],\n      [42, 118],\n      [22, 118],\n    ],\n    dot: [50, 62],\n    eyes: [\n      [40, 80],\n      [60, 80],\n    ],\n  },\n  magnifier: {\n    main: [...arc(44, 60, 24, 45, 405), corner(44, 60, 24, 45), [82, 100]],\n    eyes: [\n      [37, 58],\n      [51, 58],\n    ],\n  },\n  hourglass: {\n    main: [\n      [28, 26],\n      [72, 26],\n      [72, 30],\n      [54, 70],\n      [72, 110],\n      [72, 114],\n      [28, 114],\n      [28, 110],\n      [46, 70],\n      [28, 30],\n      [28, 26],\n    ],\n    dot: [50, 102],\n    eyes: [\n      [44, 42],\n      [56, 42],\n    ],\n  },\n} as const satisfies Record<string, Shape>;\n\nexport type ShapeId = keyof typeof SHAPES;\n\nexport const isShapeId = (id: string): id is ShapeId =>\n  Object.hasOwn(SHAPES, id);\n\nexport const W = 100;\nexport const H = 140;\nexport const MAIN = 120;\nexport const SUB = 40;\nconst DOT = 4;\nconst EYE = 7;\nconst PUPIL = 2.6;\nconst LOOK = 2.2;\nconst DUR = 700;\nconst SWEEP = 180;\n\nconst at = (pts: readonly Vec2[], i: number): Vec2 => pts[i] ?? [0, 0];\n\n/** `n` points evenly spaced along the polyline by length. */\nexport function resample(pts: readonly Vec2[], n: number): Vec2[] {\n  const lens = [0];\n  for (let i = 1; i < pts.length; i++) {\n    const [ax, ay] = at(pts, i - 1);\n    const [bx, by] = at(pts, i);\n    lens.push((lens[i - 1] ?? 0) + Math.hypot(bx - ax, by - ay));\n  }\n  const total = lens[lens.length - 1] ?? 0;\n  const out: Vec2[] = [];\n  let j = 0;\n  for (let k = 0; k < n; k++) {\n    const s = n > 1 ? (total * k) / (n - 1) : 0;\n    while (j < pts.length - 2 && (lens[j + 1] ?? 0) < s) j++;\n    const l0 = lens[j] ?? 0;\n    const span = (lens[j + 1] ?? l0) - l0;\n    const t = span > 0 ? clamp((s - l0) / span, 0, 1) : 0;\n    const [ax, ay] = at(pts, j);\n    const [bx, by] = at(pts, Math.min(j + 1, pts.length - 1));\n    out.push([lerp(ax, bx, t), lerp(ay, by, t)]);\n  }\n  return out;\n}\n\ntype Pose = {\n  main: Vec2[];\n  sub: Vec2[];\n  dot: Vec2;\n  r: number;\n  eyes: [Vec2, Vec2];\n};\n\n/** A shape as fixed-length point lists: what a morph interpolates between. */\nexport function pose(shape: Shape): Pose {\n  const main = resample(shape.main, MAIN);\n  const end = at(main, MAIN - 1);\n  const sub = shape.sub\n    ? resample(shape.sub, SUB)\n    : Array.from({ length: SUB }, (): Vec2 => [end[0], end[1]]);\n  return {\n    main,\n    sub,\n    dot: shape.dot ? [shape.dot[0], shape.dot[1]] : [end[0], end[1]],\n    r: shape.dot ? DOT : 0,\n    eyes: [\n      [shape.eyes[0][0], shape.eyes[0][1]],\n      [shape.eyes[1][0], shape.eyes[1][1]],\n    ],\n  };\n}\n\nconst mix = (a: Vec2, b: Vec2, t: number): Vec2 => [\n  lerp(a[0], b[0], t),\n  lerp(a[1], b[1], t),\n];\nconst collapsed = (pts: readonly Vec2[]) => {\n  const [x0, y0] = at(pts, 0);\n  return pts.every(([x, y]) => Math.abs(x - x0) + Math.abs(y - y0) < 0.05);\n};\n\nexport type Clip = {\n  morph(id: ShapeId): void;\n  destroy(): void;\n};\n\n/** Draws Clip into `el`, resting as `start`. */\nexport function mountClip(el: HTMLElement, start: ShapeId = \"clip\"): Clip {\n  inject(el.ownerDocument);\n  const bag = disposer();\n  el.setAttribute(\"data-linework\", \"clip\");\n  el.style.aspectRatio = `${W} / ${H}`;\n\n  const svg = mk(\"svg\", { viewBox: `0 0 ${W} ${H}`, \"aria-hidden\": \"true\" });\n  el.appendChild(svg);\n  const main = path(svg, \"nf sil\");\n  const sub = path(svg, \"nf sil\");\n  const dot = mk(\"ellipse\", { class: \"dot\", rx: 0, ry: 0 }, svg);\n  const eyes = [0, 1].map(() => ({\n    white: mk(\"ellipse\", { class: \"sil\", rx: EYE, ry: EYE + 1 }, svg),\n    pupil: mk(\"ellipse\", { class: \"dot m\", rx: PUPIL, ry: PUPIL }, svg),\n  }));\n\n  let cur = pose(SHAPES[start]);\n  let from = cur;\n  let to = cur;\n  let t0 = -1e9;\n  let morphing = true;\n  const look = { x: spring(0), y: spring(0) };\n\n  const paint = () => {\n    draw(main, open(cur.main));\n    draw(sub, collapsed(cur.sub) ? \"\" : open(cur.sub));\n    const r = cur.r < 0.2 ? 0 : r2(cur.r);\n    dot.setAttribute(\"rx\", String(r));\n    dot.setAttribute(\"ry\", String(r));\n    dot.setAttribute(\"cx\", String(r2(cur.dot[0])));\n    dot.setAttribute(\"cy\", String(r2(cur.dot[1])));\n    eyes.forEach(({ white, pupil }, i) => {\n      const [x, y] = cur.eyes[i as 0 | 1];\n      white.setAttribute(\"cx\", String(r2(x)));\n      white.setAttribute(\"cy\", String(r2(y)));\n      pupil.setAttribute(\"cx\", String(r2(x + look.x.x)));\n      pupil.setAttribute(\"cy\", String(r2(y + look.y.x)));\n    });\n  };\n\n  const tick = (dt: number, now: number) => {\n    let moving = stepS(look.x, dt);\n    moving = stepS(look.y, dt) || moving;\n    if (morphing) {\n      const ease = (delay: number) =>\n        reducedMotion() ? 1 : EASE_LIFT(clamp((now - t0 - delay) / DUR, 0, 1));\n      const p = ease(0);\n      cur = {\n        main: to.main.map((q, i) =>\n          mix(at(from.main, i), q, ease((i / MAIN) * SWEEP)),\n        ),\n        sub: to.sub.map((q, i) => mix(at(from.sub, i), q, ease(SWEEP))),\n        dot: to.r > 0 && from.r === 0 ? to.dot : mix(from.dot, to.dot, p),\n        r: lerp(from.r, to.r, p),\n        eyes: [\n          mix(from.eyes[0], to.eyes[0], p),\n          mix(from.eyes[1], to.eyes[1], p),\n        ],\n      };\n      morphing = !reducedMotion() && now < t0 + DUR + SWEEP;\n      moving = moving || morphing;\n    }\n    paint();\n    return moving;\n  };\n  const loop = register(el, tick);\n  bag.add(loop.unregister);\n\n  const onMove = (e: PointerEvent) => {\n    const box = el.getBoundingClientRect();\n    if (!box.width) return;\n    const dx = e.clientX - (box.left + box.width / 2);\n    const dy = e.clientY - (box.top + box.height / 2);\n    const len = Math.hypot(dx, dy) || 1;\n    const k = Math.min(1, len / 160) * LOOK;\n    look.x.t = (dx / len) * k;\n    look.y.t = (dy / len) * k;\n    loop.wake();\n  };\n  window.addEventListener(\"pointermove\", onMove, { passive: true });\n  bag.add(() => window.removeEventListener(\"pointermove\", onMove));\n  bag.add(() => svg.remove());\n\n  let shape: ShapeId = start;\n  const colour = (id: ShapeId) => {\n    const hi = \"hi\" in SHAPES[id];\n    for (const p of [main, sub]) {\n      p.classList.toggle(\"hi\", hi);\n      p.classList.toggle(\"sil\", !hi);\n    }\n  };\n  colour(start);\n\n  return {\n    morph(id) {\n      if (id === shape) return;\n      shape = id;\n      colour(id);\n      from = cur;\n      to = pose(SHAPES[id]);\n      t0 = performance.now();\n      morphing = true;\n      loop.wake();\n    },\n    destroy: bag.dispose,\n  };\n}\n", "import type { AlpineComponent } from \"alpinejs\";\nimport { call } from \"../fetch\";\nimport { type Clip, mountClip, type ShapeId } from \"../linework/clip\";\n\ninterface State extends Record<string | symbol, unknown> {\n  open: boolean;\n  minimised: boolean;\n  init(): void;\n  destroy(): void;\n  show(): void;\n  hide(): void;\n  minimise(): void;\n  summon(): void;\n}\n\n/** What Clip turns into now and then, unprompted. */\nconst WHIMS: readonly ShapeId[] = [\n  \"star\",\n  \"heart\",\n  \"house\",\n  \"logo\",\n  \"tick\",\n  \"question\",\n  \"exclamation\",\n  \"lightbulb\",\n];\nconst HOLD = 2400;\nconst THINK = 5000;\n/** An unprompted shape comes every one to three minutes. */\nconst idleDelay = () => 60_000 + Math.random() * 120_000;\n\nconst save = (root: HTMLElement, minimised: boolean) => {\n  const url = root.dataset[\"minimiseUrl\"];\n  const csrf = root.dataset[\"csrf\"];\n  if (!url || !csrf) return;\n  const body = new FormData();\n  body.set(\"minimised\", minimised ? \"1\" : \"0\");\n  void call(url, { body, headers: { \"X-CSRFToken\": csrf }, method: \"POST\" });\n};\n\n/**\n * Clip on ops Home: mounts the linework drawing into `x-ref=\"launcher\"` and\n * `x-ref=\"face\"` and changes its shape as the conversation goes. A question\n * when the panel opens, a magnifier and an hourglass while an answer is\n * pending, a lightbulb when it lands (an exclamation mark if it failed), and\n * an occasional whim when nothing is happening. Each shape is held briefly\n * before Clip goes back to being a paperclip.\n *\n * Minimised, Clip is a small pill that summons it again; the choice is saved\n * for the user at `data-minimise-url`, and nothing changes shape meanwhile.\n */\nexport default (minimised = false): AlpineComponent<State> => {\n  const figures: Clip[] = [];\n  let back = 0;\n  let idle = 0;\n  let think = 0;\n  let busy = false;\n\n  const morph = (id: ShapeId) => {\n    for (const figure of figures) figure.morph(id);\n  };\n  const flash = (id: ShapeId, ms = HOLD) => {\n    window.clearTimeout(back);\n    morph(id);\n    back = window.setTimeout(() => morph(busy ? \"magnifier\" : \"clip\"), ms);\n  };\n  const settle = (id: ShapeId) => {\n    busy = false;\n    window.clearInterval(think);\n    flash(id);\n  };\n\n  return {\n    open: false,\n    minimised,\n    init() {\n      for (const name of [\"launcher\", \"face\", \"tab\"]) {\n        const el = this.$refs[name];\n        if (el instanceof HTMLElement) figures.push(mountClip(el));\n      }\n      const root = this.$root;\n\n      const whim = () => {\n        idle = window.setTimeout(() => {\n          if (!busy && !document.hidden && !this.minimised) {\n            const id = WHIMS[Math.floor(Math.random() * WHIMS.length)];\n            if (id) flash(id);\n          }\n          whim();\n        }, idleDelay());\n      };\n      whim();\n\n      root.addEventListener(\"htmx:before-request\", (event) => {\n        if (!(event.target instanceof HTMLFormElement)) return;\n        busy = true;\n        window.clearTimeout(back);\n        morph(\"magnifier\");\n        window.clearInterval(think);\n        let n = 0;\n        think = window.setInterval(() => {\n          n += 1;\n          morph(n % 2 ? \"hourglass\" : \"magnifier\");\n        }, THINK);\n      });\n      for (const name of [\"htmx:response-error\", \"htmx:send-error\"]) {\n        root.addEventListener(name, () => {\n          if (busy) settle(\"exclamation\");\n        });\n      }\n      root.addEventListener(\"htmx:after-settle\", () => {\n        if (!busy) return;\n        const all = [\n          ...root.querySelectorAll<HTMLElement>(\"[data-clip-status]\"),\n        ];\n        const status = (el: HTMLElement | undefined) =>\n          el?.dataset[\"clipStatus\"];\n        if (all.some((el) => status(el) === \"pending\")) return;\n        settle(status(all.at(-1)) === \"failed\" ? \"exclamation\" : \"lightbulb\");\n      });\n    },\n    destroy() {\n      window.clearTimeout(back);\n      window.clearTimeout(idle);\n      window.clearInterval(think);\n      for (const figure of figures) figure.destroy();\n      figures.length = 0;\n    },\n    show() {\n      this.open = true;\n      if (!busy) flash(\"question\", 1800);\n    },\n    hide() {\n      this.open = false;\n    },\n    minimise() {\n      this.open = false;\n      this.minimised = true;\n      save(this.$root, true);\n    },\n    summon() {\n      this.minimised = false;\n      save(this.$root, false);\n      this.open = true;\n      if (!busy) flash(\"star\", 1800);\n    },\n  };\n};\n", "export const TIMEZONE = \"Europe/London\";\n\nconst zoneOffset = (value: Date) =>\n  new Date(value.toLocaleString(\"en-US\", { timeZone: TIMEZONE })).valueOf() -\n  new Date(value.toLocaleString(\"en-US\", { timeZone: \"UTC\" })).valueOf();\n\n/** The UTC midnight marking the Furbnow-local day containing `value`. */\nexport const startOfDay = (value: Date) =>\n  new Date(\n    `${new Intl.DateTimeFormat(\"en-CA\", {\n      timeZone: TIMEZONE,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n    }).format(value)}T00:00:00Z`,\n  );\n\n/** The instant `seconds` into the Furbnow-local day marked by `day`. */\nexport const timeOfDay = (day: Date, seconds: number) => {\n  const wall = new Date(day.valueOf() + seconds * 1000);\n\n  return new Date(wall.valueOf() - zoneOffset(wall));\n};\n\nexport const equalMonth = (a: Date, b: Date) => {\n  if (a.getUTCFullYear() !== b.getUTCFullYear()) {\n    return false;\n  }\n\n  if (a.getUTCMonth() !== b.getUTCMonth()) {\n    return false;\n  }\n\n  return true;\n};\n\nexport const equalDate = (a: Date, b: Date) => {\n  if (!equalMonth(a, b)) {\n    return false;\n  }\n\n  if (a.getUTCDate() !== b.getUTCDate()) {\n    return false;\n  }\n\n  return true;\n};\n\nexport const equalTime = (a: Date, b: Date) => {\n  if (!equalDate(a, b)) {\n    return false;\n  }\n\n  if (a.getUTCHours() !== b.getUTCHours()) {\n    return false;\n  }\n\n  if (a.getUTCMinutes() !== b.getUTCMinutes()) {\n    return false;\n  }\n\n  if (a.getUTCSeconds() !== b.getUTCSeconds()) {\n    return false;\n  }\n\n  return true;\n};\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\n\nimport {\n  TIMEZONE,\n  equalDate,\n  equalMonth,\n  equalTime,\n  startOfDay,\n  timeOfDay,\n} from \"../dates\";\n\ninterface State extends Record<string | symbol, unknown> {\n  availability: Duration[];\n  current: Date;\n  now: Date;\n  selected: Date;\n  start: Date | null;\n  end: Date | null;\n  output: Duration | null;\n}\n\ninterface Methods {\n  month(): Date[];\n  slots(): Duration[];\n  week(): Date[];\n}\n\nconst Duration = z.object({\n  start: z.coerce.date(),\n  length: z.number(),\n});\n\ntype Duration = z.infer<typeof Duration>;\n\nexport default (value: unknown): AlpineComponent<State & Methods> => {\n  const result = z\n    .array(Duration)\n    .safeParse(JSON.parse(typeof value === \"string\" ? value : \"\"));\n\n  const availability = result.success ? result.data : [];\n\n  const now = startOfDay(new Date());\n  const selected = now;\n  const current = new Date(new Date(now).setUTCDate(1));\n\n  return {\n    availability,\n    current,\n    now,\n    selected,\n    start: null,\n    end: null,\n    output: null,\n    next(event: Event) {\n      event.preventDefault();\n\n      this.current = new Date(\n        new Date(this.current).setUTCMonth(this.current.getUTCMonth() + 1),\n      );\n    },\n    prev(event: Event) {\n      event.preventDefault();\n\n      this.current = new Date(\n        new Date(this.current).setUTCMonth(this.current.getUTCMonth() - 1),\n      );\n    },\n    month() {\n      const start = new Date(\n        new Date(this.current).setUTCDate(startOfWeekOffset(this.current)),\n      );\n\n      return [...Array(35).keys()].map(\n        (x) => new Date(new Date(start).setUTCDate(start.getUTCDate() + x)),\n      );\n    },\n    slots() {\n      return [...Array(16).keys()].map((x) => ({\n        start: timeOfDay(this.selected, 9 * 60 * 60 + x * 30 * 60),\n        length: 30 * 60,\n      }));\n    },\n    week() {\n      return [...Array(7).keys()].map(\n        (x) =>\n          new Date(\n            new Date(this.selected).setUTCDate(\n              this.selected.getUTCDate() + x - 3,\n            ),\n          ),\n      );\n    },\n    pick(value: unknown) {\n      const result = Duration.safeParse(value);\n\n      if (!result.success) {\n        return;\n      }\n\n      const slot = result.data;\n\n      if (!slotAvailable(slot, this.availability)) {\n        return;\n      }\n\n      if (\n        this.start !== null &&\n        this.end === null &&\n        equalTime(this.start, slot.start)\n      ) {\n        return;\n      }\n\n      if (this.start === null || this.end !== null) {\n        this.start = slot.start;\n        this.end = null;\n        this.output = null;\n      } else {\n        if (slot.start < this.start) {\n          this.end = this.start;\n          this.start = slot.start;\n        } else {\n          this.end = slot.start;\n        }\n        this.output = {\n          start: this.start,\n          length:\n            (this.end.valueOf() - this.start.valueOf()) / 1000 + slot.length,\n        };\n      }\n    },\n    select(value: unknown): void {\n      if (!(value instanceof Date)) {\n        return;\n      }\n\n      this.selected = value;\n    },\n    monthdayButtonClasses(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      const classes = [];\n\n      if (equalMonth(this.current, value)) {\n        if (this.availability.some((x) => equalDate(x.start, value))) {\n          classes.push(\"bg-green-100\");\n        } else {\n          classes.push(\"bg-white\");\n        }\n      } else {\n        classes.push(\"bg-gray-50\");\n      }\n\n      if (equalDate(this.selected, value) || equalDate(this.now, value)) {\n        classes.push(\"font-semibold\");\n      }\n\n      if (equalDate(this.selected, value)) {\n        classes.push(\"text-white\");\n      }\n\n      if (\n        !equalDate(this.selected, value) &&\n        !equalDate(this.now, value) &&\n        equalMonth(this.current, value)\n      ) {\n        classes.push(\"text-gray-900\");\n      }\n\n      if (\n        !equalDate(this.selected, value) &&\n        !equalDate(this.now, value) &&\n        !equalMonth(this.current, value)\n      ) {\n        classes.push(\"text-gray-400\");\n      }\n\n      if (!equalDate(this.selected, value) && equalDate(this.now, value)) {\n        classes.push(\"text-indigo-600\");\n      }\n\n      if (this.month().indexOf(value) === 0) {\n        classes.push(\"rounded-tl-lg\");\n      }\n\n      if (this.month().indexOf(value) === 6) {\n        classes.push(\"rounded-tr-lg\");\n      }\n\n      if (this.month().indexOf(value) === 28) {\n        classes.push(\"rounded-bl-lg\");\n      }\n\n      if (this.month().indexOf(value) === 34) {\n        classes.push(\"rounded-br-lg\");\n      }\n\n      return classes.join(\" \");\n    },\n    monthdayClasses(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      if (equalDate(this.selected, value)) {\n        if (equalDate(this.now, value)) {\n          return \"bg-indigo-600\";\n        } else {\n          return \"bg-gray-900\";\n        }\n      }\n\n      return \"\";\n    },\n    monthdayTitle(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        day: \"numeric\",\n      }).format(value);\n    },\n    monthviewTitle(): string {\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        month: \"long\",\n        year: \"numeric\",\n      }).format(this.current);\n    },\n    containerTitle(): string {\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        month: \"long\",\n        day: \"numeric\",\n        year: \"numeric\",\n      }).format(this.selected);\n    },\n    containerWeekday(): string {\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        weekday: \"long\",\n      }).format(this.selected);\n    },\n    dayviewClasses(value: unknown) {\n      const result = Duration.safeParse(value);\n\n      if (!result.success) {\n        return;\n      }\n\n      const slot = result.data;\n\n      if (slotAvailable(slot, this.availability)) {\n        if (this.start !== null && equalTime(this.start, slot.start)) {\n          return \"bg-green-100 cursor-pointer\";\n        }\n\n        if (this.end !== null && equalTime(this.end, slot.start)) {\n          return \"bg-green-100 cursor-pointer\";\n        }\n\n        if (this.start !== null && this.end !== null) {\n          if (slot.start.valueOf() < this.end.valueOf()) {\n            if (slot.start.valueOf() > this.start.valueOf()) {\n              return \"bg-green-100 cursor-pointer\";\n            }\n          }\n        }\n\n        return \"bg-green-50 cursor-pointer\";\n      }\n      return \"bg-red-50 cursor-auto\";\n    },\n    dayviewText(value: unknown) {\n      const result = Duration.safeParse(value);\n\n      if (!result.success) {\n        return;\n      }\n\n      const slot = result.data;\n\n      if (slotAvailable(slot, this.availability)) {\n        return \"Available\";\n      }\n      return \"Unavailable\";\n    },\n    dayviewRows(value: unknown) {\n      if (typeof value !== \"number\") {\n        return \"\";\n      }\n\n      return `grid-template-rows: repeat(${value}, minmax(3.5rem, 1fr))`;\n    },\n    dayviewTime(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        hour: \"numeric\",\n        minute: \"numeric\",\n      }).format(value);\n    },\n    weekviewClasses(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      const available = this.availability.some((x) =>\n        equalDate(x.start, value),\n      );\n\n      const classes = [];\n\n      if (\n        !available &&\n        equalDate(this.now, value) &&\n        !equalDate(this.selected, value)\n      ) {\n        classes.push(\"text-indigo-600\");\n      }\n\n      if (\n        !available &&\n        equalDate(this.now, value) &&\n        equalDate(this.selected, value)\n      ) {\n        classes.push(\"bg-indigo-600\", \"text-white\");\n      }\n\n      if (\n        !available &&\n        !equalDate(this.now, value) &&\n        equalDate(this.selected, value)\n      ) {\n        classes.push(\"bg-gray-900\", \"text-white\");\n      }\n\n      if (!equalDate(this.now, value) && !equalDate(this.selected, value)) {\n        classes.push(\"text-gray-900\");\n      }\n\n      if (available && equalDate(this.selected, value)) {\n        classes.push(\"bg-green-400 text-gray-900\");\n      }\n\n      if (available && !equalDate(this.selected, value)) {\n        classes.push(\"bg-green-100\");\n      }\n\n      return classes.join(\" \");\n    },\n    weekviewTitle(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        day: \"numeric\",\n      }).format(value);\n    },\n    weekviewWeekday(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        weekday: \"narrow\",\n      }).format(value);\n    },\n  };\n};\n\nconst startOfWeekOffset = (value: Date): number => {\n  const day = value.getUTCDay();\n  const date = value.getUTCDate();\n\n  if (day === 0) {\n    return date - 6;\n  } else if (day === 1) {\n    return date;\n  } else if (day === 2) {\n    return date - 1;\n  } else if (day === 3) {\n    return date - 2;\n  } else if (day === 4) {\n    return date - 3;\n  } else if (day === 5) {\n    return date - 4;\n  } else if (day === 6) {\n    return date - 5;\n  }\n\n  return date;\n};\n\nconst slotAvailable = (slot: Duration, availability: Duration[]): boolean => {\n  return availability.some((x) => {\n    if (slot.start.valueOf() < x.start.valueOf()) {\n      return false;\n    }\n\n    if (\n      slot.start.valueOf() + 1000 * slot.length >\n      x.start.valueOf() + 1000 * x.length\n    ) {\n      return false;\n    }\n\n    return true;\n  });\n};\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "var Browser = (function () {\n    function Browser() {\n        this.firefox = false;\n        this.ie = false;\n        this.edge = false;\n        this.newEdge = false;\n        this.weChat = false;\n    }\n    return Browser;\n}());\nvar Env = (function () {\n    function Env() {\n        this.browser = new Browser();\n        this.node = false;\n        this.wxa = false;\n        this.worker = false;\n        this.svgSupported = false;\n        this.touchEventsSupported = false;\n        this.pointerEventsSupported = false;\n        this.domSupported = false;\n        this.transformSupported = false;\n        this.transform3dSupported = false;\n        this.hasGlobalWindow = typeof window !== 'undefined';\n    }\n    return Env;\n}());\nvar env = new Env();\nif (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {\n    env.wxa = true;\n    env.touchEventsSupported = true;\n}\nelse if (typeof document === 'undefined' && typeof self !== 'undefined') {\n    env.worker = true;\n}\nelse if (!env.hasGlobalWindow\n    || 'Deno' in window\n    || (typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string'\n        && navigator.userAgent.indexOf('Node.js') > -1)) {\n    env.node = true;\n    env.svgSupported = true;\n}\nelse {\n    detect(navigator.userAgent, env);\n}\nfunction detect(ua, env) {\n    var browser = env.browser;\n    var firefox = ua.match(/Firefox\\/([\\d.]+)/);\n    var ie = ua.match(/MSIE\\s([\\d.]+)/)\n        || ua.match(/Trident\\/.+?rv:(([\\d.]+))/);\n    var edge = ua.match(/Edge?\\/([\\d.]+)/);\n    var weChat = (/micromessenger/i).test(ua);\n    if (firefox) {\n        browser.firefox = true;\n        browser.version = firefox[1];\n    }\n    if (ie) {\n        browser.ie = true;\n        browser.version = ie[1];\n    }\n    if (edge) {\n        browser.edge = true;\n        browser.version = edge[1];\n        browser.newEdge = +edge[1].split('.')[0] > 18;\n    }\n    if (weChat) {\n        browser.weChat = true;\n    }\n    env.svgSupported = typeof SVGRect !== 'undefined';\n    env.touchEventsSupported = 'ontouchstart' in window && !browser.ie && !browser.edge;\n    env.pointerEventsSupported = 'onpointerdown' in window\n        && (browser.edge || (browser.ie && +browser.version >= 11));\n    var domSupported = env.domSupported = typeof document !== 'undefined';\n    if (domSupported) {\n        var style = document.documentElement.style;\n        env.transform3dSupported = ((browser.ie && 'transition' in style)\n            || browser.edge\n            || (('WebKitCSSMatrix' in window) && ('m11' in new WebKitCSSMatrix()))\n            || 'MozPerspective' in style)\n            && !('OTransition' in style);\n        env.transformSupported = env.transform3dSupported\n            || (browser.ie && +browser.version >= 9);\n    }\n}\nexport default env;\n", "export var DEFAULT_FONT_SIZE = 12;\nexport var DEFAULT_FONT_FAMILY = 'sans-serif';\nexport var DEFAULT_FONT = DEFAULT_FONT_SIZE + \"px \" + DEFAULT_FONT_FAMILY;\nvar OFFSET = 20;\nvar SCALE = 100;\nvar defaultWidthMapStr = \"007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\\\\\WQb\\\\0FWLg\\\\bWb\\\\WQ\\\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\\\FFF5.5N\";\nfunction getTextWidthMap(mapStr) {\n    var map = {};\n    if (typeof JSON === 'undefined') {\n        return map;\n    }\n    for (var i = 0; i < mapStr.length; i++) {\n        var char = String.fromCharCode(i + 32);\n        var size = (mapStr.charCodeAt(i) - OFFSET) / SCALE;\n        map[char] = size;\n    }\n    return map;\n}\nexport var DEFAULT_TEXT_WIDTH_MAP = getTextWidthMap(defaultWidthMapStr);\nexport var platformApi = {\n    createCanvas: function () {\n        return typeof document !== 'undefined'\n            && document.createElement('canvas');\n    },\n    measureText: (function () {\n        var _ctx;\n        var _cachedFont;\n        return function (text, font) {\n            if (!_ctx) {\n                var canvas = platformApi.createCanvas();\n                _ctx = canvas && canvas.getContext('2d');\n            }\n            if (_ctx) {\n                if (_cachedFont !== font) {\n                    _cachedFont = _ctx.font = font || DEFAULT_FONT;\n                }\n                return _ctx.measureText(text);\n            }\n            else {\n                text = text || '';\n                font = font || DEFAULT_FONT;\n                var res = /((?:\\d+)?\\.?\\d*)px/.exec(font);\n                var fontSize = res && +res[1] || DEFAULT_FONT_SIZE;\n                var width = 0;\n                if (font.indexOf('mono') >= 0) {\n                    width = fontSize * text.length;\n                }\n                else {\n                    for (var i = 0; i < text.length; i++) {\n                        var preCalcWidth = DEFAULT_TEXT_WIDTH_MAP[text[i]];\n                        width += preCalcWidth == null ? fontSize : (preCalcWidth * fontSize);\n                    }\n                }\n                return { width: width };\n            }\n        };\n    })(),\n    loadImage: function (src, onload, onerror) {\n        var image = new Image();\n        image.onload = onload;\n        image.onerror = onerror;\n        image.src = src;\n        return image;\n    }\n};\nexport function setPlatformAPI(newPlatformApis) {\n    for (var key in platformApi) {\n        if (newPlatformApis[key]) {\n            platformApi[key] = newPlatformApis[key];\n        }\n    }\n}\n", "import { platformApi } from './platform.js';\nvar BUILTIN_OBJECT = reduce([\n    'Function',\n    'RegExp',\n    'Date',\n    'Error',\n    'CanvasGradient',\n    'CanvasPattern',\n    'Image',\n    'Canvas'\n], function (obj, val) {\n    obj['[object ' + val + ']'] = true;\n    return obj;\n}, {});\nvar TYPED_ARRAY = reduce([\n    'Int8',\n    'Uint8',\n    'Uint8Clamped',\n    'Int16',\n    'Uint16',\n    'Int32',\n    'Uint32',\n    'Float32',\n    'Float64'\n], function (obj, val) {\n    obj['[object ' + val + 'Array]'] = true;\n    return obj;\n}, {});\nvar objToString = Object.prototype.toString;\nvar arrayProto = Array.prototype;\nvar nativeForEach = arrayProto.forEach;\nvar nativeFilter = arrayProto.filter;\nvar nativeSlice = arrayProto.slice;\nvar nativeMap = arrayProto.map;\nvar ctorFunction = function () { }.constructor;\nvar protoFunction = ctorFunction ? ctorFunction.prototype : null;\nvar protoKey = '__proto__';\nvar idStart = 0x0907;\nexport function guid() {\n    return idStart++;\n}\nexport function logError() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    if (typeof console !== 'undefined') {\n        console.error.apply(console, args);\n    }\n}\nexport function clone(source) {\n    if (source == null || typeof source !== 'object') {\n        return source;\n    }\n    var result = source;\n    var typeStr = objToString.call(source);\n    if (typeStr === '[object Array]') {\n        if (!isPrimitive(source)) {\n            result = [];\n            for (var i = 0, len = source.length; i < len; i++) {\n                result[i] = clone(source[i]);\n            }\n        }\n    }\n    else if (TYPED_ARRAY[typeStr]) {\n        if (!isPrimitive(source)) {\n            var Ctor = source.constructor;\n            if (Ctor.from) {\n                result = Ctor.from(source);\n            }\n            else {\n                result = new Ctor(source.length);\n                for (var i = 0, len = source.length; i < len; i++) {\n                    result[i] = source[i];\n                }\n            }\n        }\n    }\n    else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {\n        result = {};\n        for (var key in source) {\n            if (source.hasOwnProperty(key) && key !== protoKey) {\n                result[key] = clone(source[key]);\n            }\n        }\n    }\n    return result;\n}\nexport function merge(target, source, overwrite) {\n    if (!isObject(source) || !isObject(target)) {\n        return overwrite ? clone(source) : target;\n    }\n    for (var key in source) {\n        if (source.hasOwnProperty(key) && key !== protoKey) {\n            var targetProp = target[key];\n            var sourceProp = source[key];\n            if (isObject(sourceProp)\n                && isObject(targetProp)\n                && !isArray(sourceProp)\n                && !isArray(targetProp)\n                && !isDom(sourceProp)\n                && !isDom(targetProp)\n                && !isBuiltInObject(sourceProp)\n                && !isBuiltInObject(targetProp)\n                && !isPrimitive(sourceProp)\n                && !isPrimitive(targetProp)) {\n                merge(targetProp, sourceProp, overwrite);\n            }\n            else if (overwrite || !(key in target)) {\n                target[key] = clone(source[key]);\n            }\n        }\n    }\n    return target;\n}\nexport function mergeAll(targetAndSources, overwrite) {\n    var result = targetAndSources[0];\n    for (var i = 1, len = targetAndSources.length; i < len; i++) {\n        result = merge(result, targetAndSources[i], overwrite);\n    }\n    return result;\n}\nexport function extend(target, source) {\n    if (Object.assign) {\n        Object.assign(target, source);\n    }\n    else {\n        for (var key in source) {\n            if (source.hasOwnProperty(key) && key !== protoKey) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\nexport function defaults(target, source, overlay) {\n    var keysArr = keys(source);\n    for (var i = 0, len = keysArr.length; i < len; i++) {\n        var key = keysArr[i];\n        if ((overlay ? source[key] != null : target[key] == null)) {\n            target[key] = source[key];\n        }\n    }\n    return target;\n}\nexport var createCanvas = platformApi.createCanvas;\nexport function indexOf(array, value) {\n    if (array) {\n        if (array.indexOf) {\n            return array.indexOf(value);\n        }\n        for (var i = 0, len = array.length; i < len; i++) {\n            if (array[i] === value) {\n                return i;\n            }\n        }\n    }\n    return -1;\n}\nexport function inherits(clazz, baseClazz) {\n    var clazzPrototype = clazz.prototype;\n    function F() { }\n    F.prototype = baseClazz.prototype;\n    clazz.prototype = new F();\n    for (var prop in clazzPrototype) {\n        if (clazzPrototype.hasOwnProperty(prop)) {\n            clazz.prototype[prop] = clazzPrototype[prop];\n        }\n    }\n    clazz.prototype.constructor = clazz;\n    clazz.superClass = baseClazz;\n}\nexport function mixin(target, source, override) {\n    target = 'prototype' in target ? target.prototype : target;\n    source = 'prototype' in source ? source.prototype : source;\n    if (Object.getOwnPropertyNames) {\n        var keyList = Object.getOwnPropertyNames(source);\n        for (var i = 0; i < keyList.length; i++) {\n            var key = keyList[i];\n            if (key !== 'constructor') {\n                if ((override ? source[key] != null : target[key] == null)) {\n                    target[key] = source[key];\n                }\n            }\n        }\n    }\n    else {\n        defaults(target, source, override);\n    }\n}\nexport function isArrayLike(data) {\n    if (!data) {\n        return false;\n    }\n    if (typeof data === 'string') {\n        return false;\n    }\n    return typeof data.length === 'number';\n}\nexport function each(arr, cb, context) {\n    if (!(arr && cb)) {\n        return;\n    }\n    if (arr.forEach && arr.forEach === nativeForEach) {\n        arr.forEach(cb, context);\n    }\n    else if (arr.length === +arr.length) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            cb.call(context, arr[i], i, arr);\n        }\n    }\n    else {\n        for (var key in arr) {\n            if (arr.hasOwnProperty(key)) {\n                cb.call(context, arr[key], key, arr);\n            }\n        }\n    }\n}\nexport function map(arr, cb, context) {\n    if (!arr) {\n        return [];\n    }\n    if (!cb) {\n        return slice(arr);\n    }\n    if (arr.map && arr.map === nativeMap) {\n        return arr.map(cb, context);\n    }\n    else {\n        var result = [];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            result.push(cb.call(context, arr[i], i, arr));\n        }\n        return result;\n    }\n}\nexport function reduce(arr, cb, memo, context) {\n    if (!(arr && cb)) {\n        return;\n    }\n    for (var i = 0, len = arr.length; i < len; i++) {\n        memo = cb.call(context, memo, arr[i], i, arr);\n    }\n    return memo;\n}\nexport function filter(arr, cb, context) {\n    if (!arr) {\n        return [];\n    }\n    if (!cb) {\n        return slice(arr);\n    }\n    if (arr.filter && arr.filter === nativeFilter) {\n        return arr.filter(cb, context);\n    }\n    else {\n        var result = [];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (cb.call(context, arr[i], i, arr)) {\n                result.push(arr[i]);\n            }\n        }\n        return result;\n    }\n}\nexport function find(arr, cb, context) {\n    if (!(arr && cb)) {\n        return;\n    }\n    for (var i = 0, len = arr.length; i < len; i++) {\n        if (cb.call(context, arr[i], i, arr)) {\n            return arr[i];\n        }\n    }\n}\nexport function keys(obj) {\n    if (!obj) {\n        return [];\n    }\n    if (Object.keys) {\n        return Object.keys(obj);\n    }\n    var keyList = [];\n    for (var key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            keyList.push(key);\n        }\n    }\n    return keyList;\n}\nfunction bindPolyfill(func, context) {\n    var args = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        args[_i - 2] = arguments[_i];\n    }\n    return function () {\n        return func.apply(context, args.concat(nativeSlice.call(arguments)));\n    };\n}\nexport var bind = (protoFunction && isFunction(protoFunction.bind))\n    ? protoFunction.call.bind(protoFunction.bind)\n    : bindPolyfill;\nfunction curry(func) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    return function () {\n        return func.apply(this, args.concat(nativeSlice.call(arguments)));\n    };\n}\nexport { curry };\nexport function isArray(value) {\n    if (Array.isArray) {\n        return Array.isArray(value);\n    }\n    return objToString.call(value) === '[object Array]';\n}\nexport function isFunction(value) {\n    return typeof value === 'function';\n}\nexport function isString(value) {\n    return typeof value === 'string';\n}\nexport function isStringSafe(value) {\n    return objToString.call(value) === '[object String]';\n}\nexport function isNumber(value) {\n    return typeof value === 'number';\n}\nexport function isObject(value) {\n    var type = typeof value;\n    return type === 'function' || (!!value && type === 'object');\n}\nexport function isBuiltInObject(value) {\n    return !!BUILTIN_OBJECT[objToString.call(value)];\n}\nexport function isTypedArray(value) {\n    return !!TYPED_ARRAY[objToString.call(value)];\n}\nexport function isDom(value) {\n    return typeof value === 'object'\n        && typeof value.nodeType === 'number'\n        && typeof value.ownerDocument === 'object';\n}\nexport function isGradientObject(value) {\n    return value.colorStops != null;\n}\nexport function isImagePatternObject(value) {\n    return value.image != null;\n}\nexport function isRegExp(value) {\n    return objToString.call(value) === '[object RegExp]';\n}\nexport function eqNaN(value) {\n    return value !== value;\n}\nexport function retrieve() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    for (var i = 0, len = args.length; i < len; i++) {\n        if (args[i] != null) {\n            return args[i];\n        }\n    }\n}\nexport function retrieve2(value0, value1) {\n    return value0 != null\n        ? value0\n        : value1;\n}\nexport function retrieve3(value0, value1, value2) {\n    return value0 != null\n        ? value0\n        : value1 != null\n            ? value1\n            : value2;\n}\nexport function slice(arr) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n        args[_i - 1] = arguments[_i];\n    }\n    return nativeSlice.apply(arr, args);\n}\nexport function normalizeCssArray(val) {\n    if (typeof (val) === 'number') {\n        return [val, val, val, val];\n    }\n    var len = val.length;\n    if (len === 2) {\n        return [val[0], val[1], val[0], val[1]];\n    }\n    else if (len === 3) {\n        return [val[0], val[1], val[2], val[1]];\n    }\n    return val;\n}\nexport function assert(condition, message) {\n    if (!condition) {\n        throw new Error(message);\n    }\n}\nexport function trim(str) {\n    if (str == null) {\n        return null;\n    }\n    else if (typeof str.trim === 'function') {\n        return str.trim();\n    }\n    else {\n        return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n    }\n}\nvar primitiveKey = '__ec_primitive__';\nexport function setAsPrimitive(obj) {\n    obj[primitiveKey] = true;\n}\nexport function isPrimitive(obj) {\n    return obj[primitiveKey];\n}\nvar MapPolyfill = (function () {\n    function MapPolyfill() {\n        this.data = {};\n    }\n    MapPolyfill.prototype[\"delete\"] = function (key) {\n        var existed = this.has(key);\n        if (existed) {\n            delete this.data[key];\n        }\n        return existed;\n    };\n    MapPolyfill.prototype.has = function (key) {\n        return this.data.hasOwnProperty(key);\n    };\n    MapPolyfill.prototype.get = function (key) {\n        return this.data[key];\n    };\n    MapPolyfill.prototype.set = function (key, value) {\n        this.data[key] = value;\n        return this;\n    };\n    MapPolyfill.prototype.keys = function () {\n        return keys(this.data);\n    };\n    MapPolyfill.prototype.forEach = function (callback) {\n        var data = this.data;\n        for (var key in data) {\n            if (data.hasOwnProperty(key)) {\n                callback(data[key], key);\n            }\n        }\n    };\n    return MapPolyfill;\n}());\nvar isNativeMapSupported = typeof Map === 'function';\nfunction maybeNativeMap() {\n    return (isNativeMapSupported ? new Map() : new MapPolyfill());\n}\nvar HashMap = (function () {\n    function HashMap(obj) {\n        var isArr = isArray(obj);\n        this.data = maybeNativeMap();\n        var thisMap = this;\n        (obj instanceof HashMap)\n            ? obj.each(visit)\n            : (obj && each(obj, visit));\n        function visit(value, key) {\n            isArr ? thisMap.set(value, key) : thisMap.set(key, value);\n        }\n    }\n    HashMap.prototype.hasKey = function (key) {\n        return this.data.has(key);\n    };\n    HashMap.prototype.get = function (key) {\n        return this.data.get(key);\n    };\n    HashMap.prototype.set = function (key, value) {\n        this.data.set(key, value);\n        return value;\n    };\n    HashMap.prototype.each = function (cb, context) {\n        this.data.forEach(function (value, key) {\n            cb.call(context, value, key);\n        });\n    };\n    HashMap.prototype.keys = function () {\n        var keys = this.data.keys();\n        return isNativeMapSupported\n            ? Array.from(keys)\n            : keys;\n    };\n    HashMap.prototype.removeKey = function (key) {\n        this.data[\"delete\"](key);\n    };\n    return HashMap;\n}());\nexport { HashMap };\nexport function createHashMap(obj) {\n    return new HashMap(obj);\n}\nexport function concatArray(a, b) {\n    var newArray = new a.constructor(a.length + b.length);\n    for (var i = 0; i < a.length; i++) {\n        newArray[i] = a[i];\n    }\n    var offset = a.length;\n    for (var i = 0; i < b.length; i++) {\n        newArray[i + offset] = b[i];\n    }\n    return newArray;\n}\nexport function createObject(proto, properties) {\n    var obj;\n    if (Object.create) {\n        obj = Object.create(proto);\n    }\n    else {\n        var StyleCtor = function () { };\n        StyleCtor.prototype = proto;\n        obj = new StyleCtor();\n    }\n    if (properties) {\n        extend(obj, properties);\n    }\n    return obj;\n}\nexport function disableUserSelect(dom) {\n    var domStyle = dom.style;\n    domStyle.webkitUserSelect = 'none';\n    domStyle.userSelect = 'none';\n    domStyle.webkitTapHighlightColor = 'rgba(0,0,0,0)';\n    domStyle['-webkit-touch-callout'] = 'none';\n}\nexport function hasOwn(own, prop) {\n    return own.hasOwnProperty(prop);\n}\nexport function noop() { }\nexport var RADIAN_TO_DEGREE = 180 / Math.PI;\nexport var EPSILON = Number.EPSILON || Math.pow(2, -52);\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "export function create(x, y) {\n    if (x == null) {\n        x = 0;\n    }\n    if (y == null) {\n        y = 0;\n    }\n    return [x, y];\n}\nexport function copy(out, v) {\n    out[0] = v[0];\n    out[1] = v[1];\n    return out;\n}\nexport function clone(v) {\n    return [v[0], v[1]];\n}\nexport function set(out, a, b) {\n    out[0] = a;\n    out[1] = b;\n    return out;\n}\nexport function add(out, v1, v2) {\n    out[0] = v1[0] + v2[0];\n    out[1] = v1[1] + v2[1];\n    return out;\n}\nexport function scaleAndAdd(out, v1, v2, a) {\n    out[0] = v1[0] + v2[0] * a;\n    out[1] = v1[1] + v2[1] * a;\n    return out;\n}\nexport function sub(out, v1, v2) {\n    out[0] = v1[0] - v2[0];\n    out[1] = v1[1] - v2[1];\n    return out;\n}\nexport function len(v) {\n    return Math.sqrt(lenSquare(v));\n}\nexport var length = len;\nexport function lenSquare(v) {\n    return v[0] * v[0] + v[1] * v[1];\n}\nexport var lengthSquare = lenSquare;\nexport function mul(out, v1, v2) {\n    out[0] = v1[0] * v2[0];\n    out[1] = v1[1] * v2[1];\n    return out;\n}\nexport function div(out, v1, v2) {\n    out[0] = v1[0] / v2[0];\n    out[1] = v1[1] / v2[1];\n    return out;\n}\nexport function dot(v1, v2) {\n    return v1[0] * v2[0] + v1[1] * v2[1];\n}\nexport function scale(out, v, s) {\n    out[0] = v[0] * s;\n    out[1] = v[1] * s;\n    return out;\n}\nexport function normalize(out, v) {\n    var d = len(v);\n    if (d === 0) {\n        out[0] = 0;\n        out[1] = 0;\n    }\n    else {\n        out[0] = v[0] / d;\n        out[1] = v[1] / d;\n    }\n    return out;\n}\nexport function distance(v1, v2) {\n    return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0])\n        + (v1[1] - v2[1]) * (v1[1] - v2[1]));\n}\nexport var dist = distance;\nexport function distanceSquare(v1, v2) {\n    return (v1[0] - v2[0]) * (v1[0] - v2[0])\n        + (v1[1] - v2[1]) * (v1[1] - v2[1]);\n}\nexport var distSquare = distanceSquare;\nexport function negate(out, v) {\n    out[0] = -v[0];\n    out[1] = -v[1];\n    return out;\n}\nexport function lerp(out, v1, v2, t) {\n    out[0] = v1[0] + t * (v2[0] - v1[0]);\n    out[1] = v1[1] + t * (v2[1] - v1[1]);\n    return out;\n}\nexport function applyTransform(out, v, m) {\n    var x = v[0];\n    var y = v[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n}\nexport function min(out, v1, v2) {\n    out[0] = Math.min(v1[0], v2[0]);\n    out[1] = Math.min(v1[1], v2[1]);\n    return out;\n}\nexport function max(out, v1, v2) {\n    out[0] = Math.max(v1[0], v2[0]);\n    out[1] = Math.max(v1[1], v2[1]);\n    return out;\n}\n", "var Param = (function () {\n    function Param(target, e) {\n        this.target = target;\n        this.topTarget = e && e.topTarget;\n    }\n    return Param;\n}());\nvar Draggable = (function () {\n    function Draggable(handler) {\n        this.handler = handler;\n        handler.on('mousedown', this._dragStart, this);\n        handler.on('mousemove', this._drag, this);\n        handler.on('mouseup', this._dragEnd, this);\n    }\n    Draggable.prototype._dragStart = function (e) {\n        var draggingTarget = e.target;\n        while (draggingTarget && !draggingTarget.draggable) {\n            draggingTarget = draggingTarget.parent || draggingTarget.__hostTarget;\n        }\n        if (draggingTarget) {\n            this._draggingTarget = draggingTarget;\n            draggingTarget.dragging = true;\n            this._x = e.offsetX;\n            this._y = e.offsetY;\n            this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragstart', e.event);\n        }\n    };\n    Draggable.prototype._drag = function (e) {\n        var draggingTarget = this._draggingTarget;\n        if (draggingTarget) {\n            var x = e.offsetX;\n            var y = e.offsetY;\n            var dx = x - this._x;\n            var dy = y - this._y;\n            this._x = x;\n            this._y = y;\n            draggingTarget.drift(dx, dy, e);\n            this.handler.dispatchToElement(new Param(draggingTarget, e), 'drag', e.event);\n            var dropTarget = this.handler.findHover(x, y, draggingTarget).target;\n            var lastDropTarget = this._dropTarget;\n            this._dropTarget = dropTarget;\n            if (draggingTarget !== dropTarget) {\n                if (lastDropTarget && dropTarget !== lastDropTarget) {\n                    this.handler.dispatchToElement(new Param(lastDropTarget, e), 'dragleave', e.event);\n                }\n                if (dropTarget && dropTarget !== lastDropTarget) {\n                    this.handler.dispatchToElement(new Param(dropTarget, e), 'dragenter', e.event);\n                }\n            }\n        }\n    };\n    Draggable.prototype._dragEnd = function (e) {\n        var draggingTarget = this._draggingTarget;\n        if (draggingTarget) {\n            draggingTarget.dragging = false;\n        }\n        this.handler.dispatchToElement(new Param(draggingTarget, e), 'dragend', e.event);\n        if (this._dropTarget) {\n            this.handler.dispatchToElement(new Param(this._dropTarget, e), 'drop', e.event);\n        }\n        this._draggingTarget = null;\n        this._dropTarget = null;\n    };\n    return Draggable;\n}());\nexport default Draggable;\n", "var Eventful = (function () {\n    function Eventful(eventProcessors) {\n        if (eventProcessors) {\n            this._$eventProcessor = eventProcessors;\n        }\n    }\n    Eventful.prototype.on = function (event, query, handler, context) {\n        if (!this._$handlers) {\n            this._$handlers = {};\n        }\n        var _h = this._$handlers;\n        if (typeof query === 'function') {\n            context = handler;\n            handler = query;\n            query = null;\n        }\n        if (!handler || !event) {\n            return this;\n        }\n        var eventProcessor = this._$eventProcessor;\n        if (query != null && eventProcessor && eventProcessor.normalizeQuery) {\n            query = eventProcessor.normalizeQuery(query);\n        }\n        if (!_h[event]) {\n            _h[event] = [];\n        }\n        for (var i = 0; i < _h[event].length; i++) {\n            if (_h[event][i].h === handler) {\n                return this;\n            }\n        }\n        var wrap = {\n            h: handler,\n            query: query,\n            ctx: (context || this),\n            callAtLast: handler.zrEventfulCallAtLast\n        };\n        var lastIndex = _h[event].length - 1;\n        var lastWrap = _h[event][lastIndex];\n        (lastWrap && lastWrap.callAtLast)\n            ? _h[event].splice(lastIndex, 0, wrap)\n            : _h[event].push(wrap);\n        return this;\n    };\n    Eventful.prototype.isSilent = function (eventName) {\n        var _h = this._$handlers;\n        return !_h || !_h[eventName] || !_h[eventName].length;\n    };\n    Eventful.prototype.off = function (eventType, handler) {\n        var _h = this._$handlers;\n        if (!_h) {\n            return this;\n        }\n        if (!eventType) {\n            this._$handlers = {};\n            return this;\n        }\n        if (handler) {\n            if (_h[eventType]) {\n                var newList = [];\n                for (var i = 0, l = _h[eventType].length; i < l; i++) {\n                    if (_h[eventType][i].h !== handler) {\n                        newList.push(_h[eventType][i]);\n                    }\n                }\n                _h[eventType] = newList;\n            }\n            if (_h[eventType] && _h[eventType].length === 0) {\n                delete _h[eventType];\n            }\n        }\n        else {\n            delete _h[eventType];\n        }\n        return this;\n    };\n    Eventful.prototype.trigger = function (eventType) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        if (!this._$handlers) {\n            return this;\n        }\n        var _h = this._$handlers[eventType];\n        var eventProcessor = this._$eventProcessor;\n        if (_h) {\n            var argLen = args.length;\n            var len = _h.length;\n            for (var i = 0; i < len; i++) {\n                var hItem = _h[i];\n                if (eventProcessor\n                    && eventProcessor.filter\n                    && hItem.query != null\n                    && !eventProcessor.filter(eventType, hItem.query)) {\n                    continue;\n                }\n                switch (argLen) {\n                    case 0:\n                        hItem.h.call(hItem.ctx);\n                        break;\n                    case 1:\n                        hItem.h.call(hItem.ctx, args[0]);\n                        break;\n                    case 2:\n                        hItem.h.call(hItem.ctx, args[0], args[1]);\n                        break;\n                    default:\n                        hItem.h.apply(hItem.ctx, args);\n                        break;\n                }\n            }\n        }\n        eventProcessor && eventProcessor.afterTrigger\n            && eventProcessor.afterTrigger(eventType);\n        return this;\n    };\n    Eventful.prototype.triggerWithContext = function (type) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        if (!this._$handlers) {\n            return this;\n        }\n        var _h = this._$handlers[type];\n        var eventProcessor = this._$eventProcessor;\n        if (_h) {\n            var argLen = args.length;\n            var ctx = args[argLen - 1];\n            var len = _h.length;\n            for (var i = 0; i < len; i++) {\n                var hItem = _h[i];\n                if (eventProcessor\n                    && eventProcessor.filter\n                    && hItem.query != null\n                    && !eventProcessor.filter(type, hItem.query)) {\n                    continue;\n                }\n                switch (argLen) {\n                    case 0:\n                        hItem.h.call(ctx);\n                        break;\n                    case 1:\n                        hItem.h.call(ctx, args[0]);\n                        break;\n                    case 2:\n                        hItem.h.call(ctx, args[0], args[1]);\n                        break;\n                    default:\n                        hItem.h.apply(ctx, args.slice(1, argLen - 1));\n                        break;\n                }\n            }\n        }\n        eventProcessor && eventProcessor.afterTrigger\n            && eventProcessor.afterTrigger(type);\n        return this;\n    };\n    return Eventful;\n}());\nexport default Eventful;\n", "var LN2 = Math.log(2);\nfunction determinant(rows, rank, rowStart, rowMask, colMask, detCache) {\n    var cacheKey = rowMask + '-' + colMask;\n    var fullRank = rows.length;\n    if (detCache.hasOwnProperty(cacheKey)) {\n        return detCache[cacheKey];\n    }\n    if (rank === 1) {\n        var colStart = Math.round(Math.log(((1 << fullRank) - 1) & ~colMask) / LN2);\n        return rows[rowStart][colStart];\n    }\n    var subRowMask = rowMask | (1 << rowStart);\n    var subRowStart = rowStart + 1;\n    while (rowMask & (1 << subRowStart)) {\n        subRowStart++;\n    }\n    var sum = 0;\n    for (var j = 0, colLocalIdx = 0; j < fullRank; j++) {\n        var colTag = 1 << j;\n        if (!(colTag & colMask)) {\n            sum += (colLocalIdx % 2 ? -1 : 1) * rows[rowStart][j]\n                * determinant(rows, rank - 1, subRowStart, subRowMask, colMask | colTag, detCache);\n            colLocalIdx++;\n        }\n    }\n    detCache[cacheKey] = sum;\n    return sum;\n}\nexport function buildTransformer(src, dest) {\n    var mA = [\n        [src[0], src[1], 1, 0, 0, 0, -dest[0] * src[0], -dest[0] * src[1]],\n        [0, 0, 0, src[0], src[1], 1, -dest[1] * src[0], -dest[1] * src[1]],\n        [src[2], src[3], 1, 0, 0, 0, -dest[2] * src[2], -dest[2] * src[3]],\n        [0, 0, 0, src[2], src[3], 1, -dest[3] * src[2], -dest[3] * src[3]],\n        [src[4], src[5], 1, 0, 0, 0, -dest[4] * src[4], -dest[4] * src[5]],\n        [0, 0, 0, src[4], src[5], 1, -dest[5] * src[4], -dest[5] * src[5]],\n        [src[6], src[7], 1, 0, 0, 0, -dest[6] * src[6], -dest[6] * src[7]],\n        [0, 0, 0, src[6], src[7], 1, -dest[7] * src[6], -dest[7] * src[7]]\n    ];\n    var detCache = {};\n    var det = determinant(mA, 8, 0, 0, 0, detCache);\n    if (det === 0) {\n        return;\n    }\n    var vh = [];\n    for (var i = 0; i < 8; i++) {\n        for (var j = 0; j < 8; j++) {\n            vh[j] == null && (vh[j] = 0);\n            vh[j] += ((i + j) % 2 ? -1 : 1)\n                * determinant(mA, 7, i === 0 ? 1 : 0, 1 << i, 1 << j, detCache)\n                / det * dest[i];\n        }\n    }\n    return function (out, srcPointX, srcPointY) {\n        var pk = srcPointX * vh[6] + srcPointY * vh[7] + 1;\n        out[0] = (srcPointX * vh[0] + srcPointY * vh[1] + vh[2]) / pk;\n        out[1] = (srcPointX * vh[3] + srcPointY * vh[4] + vh[5]) / pk;\n    };\n}\n", "import env from './env.js';\nimport { buildTransformer } from './fourPointsTransform.js';\nimport { each } from './util.js';\nvar EVENT_SAVED_PROP = '___zrEVENTSAVED';\nvar _calcOut = [];\nexport function transformLocalCoord(out, elFrom, elTarget, inX, inY) {\n    return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true)\n        && transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]);\n}\nexport function transformLocalCoordClear(elFrom, elTarget) {\n    elFrom && dealClear(elFrom);\n    elTarget && dealClear(elTarget);\n    function dealClear(el) {\n        var saved = el[EVENT_SAVED_PROP];\n        if (saved) {\n            saved.clearMarkers && saved.clearMarkers();\n            delete el[EVENT_SAVED_PROP];\n        }\n    }\n}\nexport function transformCoordWithViewport(out, el, inX, inY, inverse) {\n    if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) {\n        var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});\n        var markers = prepareCoordMarkers(el, saved);\n        var transformer = preparePointerTransformer(markers, saved, inverse);\n        if (transformer) {\n            transformer(out, inX, inY);\n            return true;\n        }\n    }\n    return false;\n}\nfunction prepareCoordMarkers(el, saved) {\n    var markers = saved.markers;\n    if (markers) {\n        return markers;\n    }\n    markers = saved.markers = [];\n    var propLR = ['left', 'right'];\n    var propTB = ['top', 'bottom'];\n    for (var i = 0; i < 4; i++) {\n        var marker = document.createElement('div');\n        var stl = marker.style;\n        var idxLR = i % 2;\n        var idxTB = (i >> 1) % 2;\n        stl.cssText = [\n            'position: absolute',\n            'visibility: hidden',\n            'padding: 0',\n            'margin: 0',\n            'border-width: 0',\n            'user-select: none',\n            'width:0',\n            'height:0',\n            propLR[idxLR] + ':0',\n            propTB[idxTB] + ':0',\n            propLR[1 - idxLR] + ':auto',\n            propTB[1 - idxTB] + ':auto',\n            ''\n        ].join('!important;');\n        el.appendChild(marker);\n        markers.push(marker);\n    }\n    saved.clearMarkers = function () {\n        each(markers, function (marker) {\n            marker.parentNode && marker.parentNode.removeChild(marker);\n        });\n    };\n    return markers;\n}\nfunction preparePointerTransformer(markers, saved, inverse) {\n    var transformerName = inverse ? 'invTrans' : 'trans';\n    var transformer = saved[transformerName];\n    var oldSrcCoords = saved.srcCoords;\n    var srcCoords = [];\n    var destCoords = [];\n    var oldCoordTheSame = true;\n    for (var i = 0; i < 4; i++) {\n        var rect = markers[i].getBoundingClientRect();\n        var ii = 2 * i;\n        var x = rect.left;\n        var y = rect.top;\n        srcCoords.push(x, y);\n        oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];\n        destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);\n    }\n    return (oldCoordTheSame && transformer)\n        ? transformer\n        : (saved.srcCoords = srcCoords,\n            saved[transformerName] = inverse\n                ? buildTransformer(destCoords, srcCoords)\n                : buildTransformer(srcCoords, destCoords));\n}\nexport function isCanvasEl(el) {\n    return el.nodeName.toUpperCase() === 'CANVAS';\n}\nvar replaceReg = /([&<>\"'])/g;\nvar replaceMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#39;'\n};\nexport function encodeHTML(source) {\n    return source == null\n        ? ''\n        : (source + '').replace(replaceReg, function (str, c) {\n            return replaceMap[c];\n        });\n}\n", "import Eventful from './Eventful.js';\nimport env from './env.js';\nimport { isCanvasEl, transformCoordWithViewport } from './dom.js';\nvar MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;\nvar _calcOut = [];\nvar firefoxNotSupportOffsetXY = env.browser.firefox\n    && +env.browser.version.split('.')[0] < 39;\nexport function clientToLocal(el, e, out, calculate) {\n    out = out || {};\n    if (calculate) {\n        calculateZrXY(el, e, out);\n    }\n    else if (firefoxNotSupportOffsetXY\n        && e.layerX != null\n        && e.layerX !== e.offsetX) {\n        out.zrX = e.layerX;\n        out.zrY = e.layerY;\n    }\n    else if (e.offsetX != null) {\n        out.zrX = e.offsetX;\n        out.zrY = e.offsetY;\n    }\n    else {\n        calculateZrXY(el, e, out);\n    }\n    return out;\n}\nfunction calculateZrXY(el, e, out) {\n    if (env.domSupported && el.getBoundingClientRect) {\n        var ex = e.clientX;\n        var ey = e.clientY;\n        if (isCanvasEl(el)) {\n            var box = el.getBoundingClientRect();\n            out.zrX = ex - box.left;\n            out.zrY = ey - box.top;\n            return;\n        }\n        else {\n            if (transformCoordWithViewport(_calcOut, el, ex, ey)) {\n                out.zrX = _calcOut[0];\n                out.zrY = _calcOut[1];\n                return;\n            }\n        }\n    }\n    out.zrX = out.zrY = 0;\n}\nexport function getNativeEvent(e) {\n    return e\n        || window.event;\n}\nexport function normalizeEvent(el, e, calculate) {\n    e = getNativeEvent(e);\n    if (e.zrX != null) {\n        return e;\n    }\n    var eventType = e.type;\n    var isTouch = eventType && eventType.indexOf('touch') >= 0;\n    if (!isTouch) {\n        clientToLocal(el, e, e, calculate);\n        var wheelDelta = getWheelDeltaMayPolyfill(e);\n        e.zrDelta = wheelDelta ? wheelDelta / 120 : -(e.detail || 0) / 3;\n    }\n    else {\n        var touch = eventType !== 'touchend'\n            ? e.targetTouches[0]\n            : e.changedTouches[0];\n        touch && clientToLocal(el, touch, e, calculate);\n    }\n    var button = e.button;\n    if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {\n        e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));\n    }\n    return e;\n}\nfunction getWheelDeltaMayPolyfill(e) {\n    var rawWheelDelta = e.wheelDelta;\n    if (rawWheelDelta) {\n        return rawWheelDelta;\n    }\n    var deltaX = e.deltaX;\n    var deltaY = e.deltaY;\n    if (deltaX == null || deltaY == null) {\n        return rawWheelDelta;\n    }\n    var delta = deltaY !== 0 ? Math.abs(deltaY) : Math.abs(deltaX);\n    var sign = deltaY > 0 ? -1\n        : deltaY < 0 ? 1\n            : deltaX > 0 ? -1\n                : 1;\n    return 3 * delta * sign;\n}\nexport function addEventListener(el, name, handler, opt) {\n    el.addEventListener(name, handler, opt);\n}\nexport function removeEventListener(el, name, handler, opt) {\n    el.removeEventListener(name, handler, opt);\n}\nexport var stop = function (e) {\n    e.preventDefault();\n    e.stopPropagation();\n    e.cancelBubble = true;\n};\nexport function isMiddleOrRightButtonOnMouseUpDown(e) {\n    return e.which === 2 || e.which === 3;\n}\nexport { Eventful as Dispatcher };\n", "import * as eventUtil from './event.js';\nvar GestureMgr = (function () {\n    function GestureMgr() {\n        this._track = [];\n    }\n    GestureMgr.prototype.recognize = function (event, target, root) {\n        this._doTrack(event, target, root);\n        return this._recognize(event);\n    };\n    GestureMgr.prototype.clear = function () {\n        this._track.length = 0;\n        return this;\n    };\n    GestureMgr.prototype._doTrack = function (event, target, root) {\n        var touches = event.touches;\n        if (!touches) {\n            return;\n        }\n        var trackItem = {\n            points: [],\n            touches: [],\n            target: target,\n            event: event\n        };\n        for (var i = 0, len = touches.length; i < len; i++) {\n            var touch = touches[i];\n            var pos = eventUtil.clientToLocal(root, touch, {});\n            trackItem.points.push([pos.zrX, pos.zrY]);\n            trackItem.touches.push(touch);\n        }\n        this._track.push(trackItem);\n    };\n    GestureMgr.prototype._recognize = function (event) {\n        for (var eventName in recognizers) {\n            if (recognizers.hasOwnProperty(eventName)) {\n                var gestureInfo = recognizers[eventName](this._track, event);\n                if (gestureInfo) {\n                    return gestureInfo;\n                }\n            }\n        }\n    };\n    return GestureMgr;\n}());\nexport { GestureMgr };\nfunction dist(pointPair) {\n    var dx = pointPair[1][0] - pointPair[0][0];\n    var dy = pointPair[1][1] - pointPair[0][1];\n    return Math.sqrt(dx * dx + dy * dy);\n}\nfunction center(pointPair) {\n    return [\n        (pointPair[0][0] + pointPair[1][0]) / 2,\n        (pointPair[0][1] + pointPair[1][1]) / 2\n    ];\n}\nvar recognizers = {\n    pinch: function (tracks, event) {\n        var trackLen = tracks.length;\n        if (!trackLen) {\n            return;\n        }\n        var pinchEnd = (tracks[trackLen - 1] || {}).points;\n        var pinchPre = (tracks[trackLen - 2] || {}).points || pinchEnd;\n        if (pinchPre\n            && pinchPre.length > 1\n            && pinchEnd\n            && pinchEnd.length > 1) {\n            var pinchScale = dist(pinchEnd) / dist(pinchPre);\n            !isFinite(pinchScale) && (pinchScale = 1);\n            event.pinchScale = pinchScale;\n            var pinchCenter = center(pinchEnd);\n            event.pinchX = pinchCenter[0];\n            event.pinchY = pinchCenter[1];\n            return {\n                type: 'pinch',\n                target: tracks[0].target,\n                event: event\n            };\n        }\n    }\n};\n", "export function create() {\n    return [1, 0, 0, 1, 0, 0];\n}\nexport function identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\nexport function copy(out, m) {\n    out[0] = m[0];\n    out[1] = m[1];\n    out[2] = m[2];\n    out[3] = m[3];\n    out[4] = m[4];\n    out[5] = m[5];\n    return out;\n}\nexport function mul(out, m1, m2) {\n    var out0 = m1[0] * m2[0] + m1[2] * m2[1];\n    var out1 = m1[1] * m2[0] + m1[3] * m2[1];\n    var out2 = m1[0] * m2[2] + m1[2] * m2[3];\n    var out3 = m1[1] * m2[2] + m1[3] * m2[3];\n    var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];\n    var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = out3;\n    out[4] = out4;\n    out[5] = out5;\n    return out;\n}\nexport function translate(out, a, v) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4] + v[0];\n    out[5] = a[5] + v[1];\n    return out;\n}\nexport function rotate(out, a, rad, pivot) {\n    if (pivot === void 0) { pivot = [0, 0]; }\n    var aa = a[0];\n    var ac = a[2];\n    var atx = a[4];\n    var ab = a[1];\n    var ad = a[3];\n    var aty = a[5];\n    var st = Math.sin(rad);\n    var ct = Math.cos(rad);\n    out[0] = aa * ct + ab * st;\n    out[1] = -aa * st + ab * ct;\n    out[2] = ac * ct + ad * st;\n    out[3] = -ac * st + ct * ad;\n    out[4] = ct * (atx - pivot[0]) + st * (aty - pivot[1]) + pivot[0];\n    out[5] = ct * (aty - pivot[1]) - st * (atx - pivot[0]) + pivot[1];\n    return out;\n}\nexport function scale(out, a, v) {\n    var vx = v[0];\n    var vy = v[1];\n    out[0] = a[0] * vx;\n    out[1] = a[1] * vy;\n    out[2] = a[2] * vx;\n    out[3] = a[3] * vy;\n    out[4] = a[4] * vx;\n    out[5] = a[5] * vy;\n    return out;\n}\nexport function invert(out, a) {\n    var aa = a[0];\n    var ac = a[2];\n    var atx = a[4];\n    var ab = a[1];\n    var ad = a[3];\n    var aty = a[5];\n    var det = aa * ad - ab * ac;\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n    out[0] = ad * det;\n    out[1] = -ab * det;\n    out[2] = -ac * det;\n    out[3] = aa * det;\n    out[4] = (ac * aty - ad * atx) * det;\n    out[5] = (ab * atx - aa * aty) * det;\n    return out;\n}\nexport function clone(a) {\n    var b = create();\n    copy(b, a);\n    return b;\n}\n", "var Point = (function () {\n    function Point(x, y) {\n        this.x = x || 0;\n        this.y = y || 0;\n    }\n    Point.prototype.copy = function (other) {\n        this.x = other.x;\n        this.y = other.y;\n        return this;\n    };\n    Point.prototype.clone = function () {\n        return new Point(this.x, this.y);\n    };\n    Point.prototype.set = function (x, y) {\n        this.x = x;\n        this.y = y;\n        return this;\n    };\n    Point.prototype.equal = function (other) {\n        return other.x === this.x && other.y === this.y;\n    };\n    Point.prototype.add = function (other) {\n        this.x += other.x;\n        this.y += other.y;\n        return this;\n    };\n    Point.prototype.scale = function (scalar) {\n        this.x *= scalar;\n        this.y *= scalar;\n    };\n    Point.prototype.scaleAndAdd = function (other, scalar) {\n        this.x += other.x * scalar;\n        this.y += other.y * scalar;\n    };\n    Point.prototype.sub = function (other) {\n        this.x -= other.x;\n        this.y -= other.y;\n        return this;\n    };\n    Point.prototype.dot = function (other) {\n        return this.x * other.x + this.y * other.y;\n    };\n    Point.prototype.len = function () {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    };\n    Point.prototype.lenSquare = function () {\n        return this.x * this.x + this.y * this.y;\n    };\n    Point.prototype.normalize = function () {\n        var len = this.len();\n        this.x /= len;\n        this.y /= len;\n        return this;\n    };\n    Point.prototype.distance = function (other) {\n        var dx = this.x - other.x;\n        var dy = this.y - other.y;\n        return Math.sqrt(dx * dx + dy * dy);\n    };\n    Point.prototype.distanceSquare = function (other) {\n        var dx = this.x - other.x;\n        var dy = this.y - other.y;\n        return dx * dx + dy * dy;\n    };\n    Point.prototype.negate = function () {\n        this.x = -this.x;\n        this.y = -this.y;\n        return this;\n    };\n    Point.prototype.transform = function (m) {\n        if (!m) {\n            return;\n        }\n        var x = this.x;\n        var y = this.y;\n        this.x = m[0] * x + m[2] * y + m[4];\n        this.y = m[1] * x + m[3] * y + m[5];\n        return this;\n    };\n    Point.prototype.toArray = function (out) {\n        out[0] = this.x;\n        out[1] = this.y;\n        return out;\n    };\n    Point.prototype.fromArray = function (input) {\n        this.x = input[0];\n        this.y = input[1];\n    };\n    Point.set = function (p, x, y) {\n        p.x = x;\n        p.y = y;\n    };\n    Point.copy = function (p, p2) {\n        p.x = p2.x;\n        p.y = p2.y;\n    };\n    Point.len = function (p) {\n        return Math.sqrt(p.x * p.x + p.y * p.y);\n    };\n    Point.lenSquare = function (p) {\n        return p.x * p.x + p.y * p.y;\n    };\n    Point.dot = function (p0, p1) {\n        return p0.x * p1.x + p0.y * p1.y;\n    };\n    Point.add = function (out, p0, p1) {\n        out.x = p0.x + p1.x;\n        out.y = p0.y + p1.y;\n    };\n    Point.sub = function (out, p0, p1) {\n        out.x = p0.x - p1.x;\n        out.y = p0.y - p1.y;\n    };\n    Point.scale = function (out, p0, scalar) {\n        out.x = p0.x * scalar;\n        out.y = p0.y * scalar;\n    };\n    Point.scaleAndAdd = function (out, p0, p1, scalar) {\n        out.x = p0.x + p1.x * scalar;\n        out.y = p0.y + p1.y * scalar;\n    };\n    Point.lerp = function (out, p0, p1, t) {\n        var onet = 1 - t;\n        out.x = onet * p0.x + t * p1.x;\n        out.y = onet * p0.y + t * p1.y;\n    };\n    return Point;\n}());\nexport default Point;\n", "import * as matrix from './matrix.js';\nimport Point from './Point.js';\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathAbs = Math.abs;\nvar XY = ['x', 'y'];\nvar WH = ['width', 'height'];\nvar lt = new Point();\nvar rb = new Point();\nvar lb = new Point();\nvar rt = new Point();\nvar _intersectCtx = createIntersectContext();\nvar _minTv = _intersectCtx.minTv;\nvar _maxTv = _intersectCtx.maxTv;\nvar _lenMinMax = [0, 0];\nvar BoundingRect = (function () {\n    function BoundingRect(x, y, width, height) {\n        BoundingRect.set(this, x, y, width, height);\n    }\n    BoundingRect.set = function (target, x, y, width, height) {\n        if (width < 0) {\n            x = x + width;\n            width = -width;\n        }\n        if (height < 0) {\n            y = y + height;\n            height = -height;\n        }\n        target.x = x;\n        target.y = y;\n        target.width = width;\n        target.height = height;\n        return target;\n    };\n    BoundingRect.prototype.union = function (other) {\n        var x = mathMin(other.x, this.x);\n        var y = mathMin(other.y, this.y);\n        if (isFinite(this.x) && isFinite(this.width)) {\n            this.width = mathMax(other.x + other.width, this.x + this.width) - x;\n        }\n        else {\n            this.width = other.width;\n        }\n        if (isFinite(this.y) && isFinite(this.height)) {\n            this.height = mathMax(other.y + other.height, this.y + this.height) - y;\n        }\n        else {\n            this.height = other.height;\n        }\n        this.x = x;\n        this.y = y;\n    };\n    BoundingRect.prototype.applyTransform = function (m) {\n        BoundingRect.applyTransform(this, this, m);\n    };\n    BoundingRect.prototype.calculateTransform = function (b) {\n        var a = this;\n        var sx = b.width / a.width;\n        var sy = b.height / a.height;\n        var m = matrix.create();\n        matrix.translate(m, m, [-a.x, -a.y]);\n        matrix.scale(m, m, [sx, sy]);\n        matrix.translate(m, m, [b.x, b.y]);\n        return m;\n    };\n    BoundingRect.prototype.intersect = function (b, mtv, opt) {\n        return BoundingRect.intersect(this, b, mtv, opt);\n    };\n    BoundingRect.intersect = function (a, b, mtv, opt) {\n        if (mtv) {\n            Point.set(mtv, 0, 0);\n        }\n        var outIntersectRect = opt && opt.outIntersectRect || null;\n        var clamp = opt && opt.clamp;\n        if (outIntersectRect) {\n            outIntersectRect.x = outIntersectRect.y = outIntersectRect.width = outIntersectRect.height = NaN;\n        }\n        if (!a || !b) {\n            return false;\n        }\n        if (!(a instanceof BoundingRect)) {\n            a = BoundingRect.set(_tmpIntersectA, a.x, a.y, a.width, a.height);\n        }\n        if (!(b instanceof BoundingRect)) {\n            b = BoundingRect.set(_tmpIntersectB, b.x, b.y, b.width, b.height);\n        }\n        var useMTV = !!mtv;\n        _intersectCtx.reset(opt, useMTV);\n        var touchThreshold = _intersectCtx.touchThreshold;\n        var ax0 = a.x + touchThreshold;\n        var ax1 = a.x + a.width - touchThreshold;\n        var ay0 = a.y + touchThreshold;\n        var ay1 = a.y + a.height - touchThreshold;\n        var bx0 = b.x + touchThreshold;\n        var bx1 = b.x + b.width - touchThreshold;\n        var by0 = b.y + touchThreshold;\n        var by1 = b.y + b.height - touchThreshold;\n        if (ax0 > ax1 || ay0 > ay1 || bx0 > bx1 || by0 > by1) {\n            return false;\n        }\n        var overlap = !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);\n        if (useMTV || outIntersectRect) {\n            _lenMinMax[0] = Infinity;\n            _lenMinMax[1] = 0;\n            intersectOneDim(ax0, ax1, bx0, bx1, 0, useMTV, outIntersectRect, clamp);\n            intersectOneDim(ay0, ay1, by0, by1, 1, useMTV, outIntersectRect, clamp);\n            if (useMTV) {\n                Point.copy(mtv, overlap\n                    ? (_intersectCtx.useDir ? _intersectCtx.dirMinTv : _minTv)\n                    : _maxTv);\n            }\n        }\n        return overlap;\n    };\n    BoundingRect.contain = function (rect, x, y) {\n        return x >= rect.x\n            && x <= (rect.x + rect.width)\n            && y >= rect.y\n            && y <= (rect.y + rect.height);\n    };\n    BoundingRect.prototype.contain = function (x, y) {\n        return BoundingRect.contain(this, x, y);\n    };\n    BoundingRect.prototype.clone = function () {\n        return new BoundingRect(this.x, this.y, this.width, this.height);\n    };\n    BoundingRect.prototype.copy = function (other) {\n        BoundingRect.copy(this, other);\n    };\n    BoundingRect.prototype.plain = function () {\n        return {\n            x: this.x,\n            y: this.y,\n            width: this.width,\n            height: this.height\n        };\n    };\n    BoundingRect.prototype.isFinite = function () {\n        return isFinite(this.x)\n            && isFinite(this.y)\n            && isFinite(this.width)\n            && isFinite(this.height);\n    };\n    BoundingRect.prototype.isZero = function () {\n        return this.width === 0 || this.height === 0;\n    };\n    BoundingRect.create = function (rect) {\n        return new BoundingRect(rect.x, rect.y, rect.width, rect.height);\n    };\n    BoundingRect.copy = function (target, source) {\n        target.x = source.x;\n        target.y = source.y;\n        target.width = source.width;\n        target.height = source.height;\n        return target;\n    };\n    BoundingRect.applyTransform = function (target, source, m) {\n        if (!m) {\n            if (target !== source) {\n                BoundingRect.copy(target, source);\n            }\n            return;\n        }\n        if (m[1] < 1e-5 && m[1] > -1e-5 && m[2] < 1e-5 && m[2] > -1e-5) {\n            var sx = m[0];\n            var sy = m[3];\n            var tx = m[4];\n            var ty = m[5];\n            target.x = source.x * sx + tx;\n            target.y = source.y * sy + ty;\n            target.width = source.width * sx;\n            target.height = source.height * sy;\n            if (target.width < 0) {\n                target.x += target.width;\n                target.width = -target.width;\n            }\n            if (target.height < 0) {\n                target.y += target.height;\n                target.height = -target.height;\n            }\n            return;\n        }\n        lt.x = lb.x = source.x;\n        lt.y = rt.y = source.y;\n        rb.x = rt.x = source.x + source.width;\n        rb.y = lb.y = source.y + source.height;\n        lt.transform(m);\n        rt.transform(m);\n        rb.transform(m);\n        lb.transform(m);\n        target.x = mathMin(lt.x, rb.x, lb.x, rt.x);\n        target.y = mathMin(lt.y, rb.y, lb.y, rt.y);\n        var maxX = mathMax(lt.x, rb.x, lb.x, rt.x);\n        var maxY = mathMax(lt.y, rb.y, lb.y, rt.y);\n        target.width = maxX - target.x;\n        target.height = maxY - target.y;\n    };\n    return BoundingRect;\n}());\nvar _tmpIntersectA = new BoundingRect(0, 0, 0, 0);\nvar _tmpIntersectB = new BoundingRect(0, 0, 0, 0);\nfunction intersectOneDim(a0, a1, b0, b1, updateDimIdx, useMTV, outIntersectRect, clamp) {\n    var d0 = mathAbs(a1 - b0);\n    var d1 = mathAbs(b1 - a0);\n    var d01min = mathMin(d0, d1);\n    var updateDim = XY[updateDimIdx];\n    var zeroDim = XY[1 - updateDimIdx];\n    var wh = WH[updateDimIdx];\n    if (a1 < b0 || b1 < a0) {\n        if (d0 < d1) {\n            if (useMTV) {\n                _maxTv[updateDim] = -d0;\n            }\n            if (clamp) {\n                outIntersectRect[updateDim] = a1;\n                outIntersectRect[wh] = 0;\n            }\n        }\n        else {\n            if (useMTV) {\n                _maxTv[updateDim] = d1;\n            }\n            if (clamp) {\n                outIntersectRect[updateDim] = a0;\n                outIntersectRect[wh] = 0;\n            }\n        }\n    }\n    else {\n        if (outIntersectRect) {\n            outIntersectRect[updateDim] = mathMax(a0, b0);\n            outIntersectRect[wh] = mathMin(a1, b1) - outIntersectRect[updateDim];\n        }\n        if (useMTV) {\n            if (d01min < _lenMinMax[0] || _intersectCtx.useDir) {\n                _lenMinMax[0] = mathMin(d01min, _lenMinMax[0]);\n                if (d0 < d1 || !_intersectCtx.bidirectional) {\n                    _minTv[updateDim] = d0;\n                    _minTv[zeroDim] = 0;\n                    if (_intersectCtx.useDir) {\n                        _intersectCtx.calcDirMTV();\n                    }\n                }\n                if (d0 >= d1 || !_intersectCtx.bidirectional) {\n                    _minTv[updateDim] = -d1;\n                    _minTv[zeroDim] = 0;\n                    if (_intersectCtx.useDir) {\n                        _intersectCtx.calcDirMTV();\n                    }\n                }\n            }\n        }\n    }\n}\nexport function createIntersectContext() {\n    var _direction = 0;\n    var _dirCheckVec = new Point();\n    var _dirTmp = new Point();\n    var _ctx = {\n        minTv: new Point(),\n        maxTv: new Point(),\n        useDir: false,\n        dirMinTv: new Point(),\n        touchThreshold: 0,\n        bidirectional: true,\n        negativeSize: false,\n        reset: function (opt, useMTV) {\n            _ctx.touchThreshold = 0;\n            if (opt && opt.touchThreshold != null) {\n                _ctx.touchThreshold = mathMax(0, opt.touchThreshold);\n            }\n            _ctx.negativeSize = false;\n            if (!useMTV) {\n                return;\n            }\n            _ctx.minTv.set(Infinity, Infinity);\n            _ctx.maxTv.set(0, 0);\n            _ctx.useDir = false;\n            if (opt && opt.direction != null) {\n                _ctx.useDir = true;\n                _ctx.dirMinTv.copy(_ctx.minTv);\n                _dirTmp.copy(_ctx.minTv);\n                _direction = opt.direction;\n                _ctx.bidirectional = opt.bidirectional == null || !!opt.bidirectional;\n                if (!_ctx.bidirectional) {\n                    _dirCheckVec.set(Math.cos(_direction), Math.sin(_direction));\n                }\n            }\n        },\n        calcDirMTV: function () {\n            var minTv = _ctx.minTv;\n            var dirMinTv = _ctx.dirMinTv;\n            var squareMag = minTv.y * minTv.y + minTv.x * minTv.x;\n            var dirSin = Math.sin(_direction);\n            var dirCos = Math.cos(_direction);\n            var dotProd = dirSin * minTv.y + dirCos * minTv.x;\n            if (nearZero(dotProd)) {\n                if (nearZero(minTv.x) && nearZero(minTv.y)) {\n                    dirMinTv.set(0, 0);\n                }\n                return;\n            }\n            _dirTmp.x = squareMag * dirCos / dotProd;\n            _dirTmp.y = squareMag * dirSin / dotProd;\n            if (nearZero(_dirTmp.x) && nearZero(_dirTmp.y)) {\n                dirMinTv.set(0, 0);\n                return;\n            }\n            if ((_ctx.bidirectional\n                || _dirCheckVec.dot(_dirTmp) > 0)\n                && _dirTmp.len() < dirMinTv.len()) {\n                dirMinTv.copy(_dirTmp);\n            }\n        }\n    };\n    function nearZero(val) {\n        return mathAbs(val) < 1e-10;\n    }\n    return _ctx;\n}\nexport default BoundingRect;\n", "import { __extends } from \"tslib\";\nimport * as util from './core/util.js';\nimport * as vec2 from './core/vector.js';\nimport Draggable from './mixin/Draggable.js';\nimport Eventful from './core/Eventful.js';\nimport * as eventTool from './core/event.js';\nimport { GestureMgr } from './core/GestureMgr.js';\nimport BoundingRect from './core/BoundingRect.js';\nvar SILENT = 'silent';\nfunction makeEventPacket(eveType, targetInfo, event) {\n    return {\n        type: eveType,\n        event: event,\n        target: targetInfo.target,\n        topTarget: targetInfo.topTarget,\n        cancelBubble: false,\n        offsetX: event.zrX,\n        offsetY: event.zrY,\n        gestureEvent: event.gestureEvent,\n        pinchX: event.pinchX,\n        pinchY: event.pinchY,\n        pinchScale: event.pinchScale,\n        wheelDelta: event.zrDelta,\n        zrByTouch: event.zrByTouch,\n        which: event.which,\n        stop: stopEvent\n    };\n}\nfunction stopEvent() {\n    eventTool.stop(this.event);\n}\nvar EmptyProxy = (function (_super) {\n    __extends(EmptyProxy, _super);\n    function EmptyProxy() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.handler = null;\n        return _this;\n    }\n    EmptyProxy.prototype.dispose = function () { };\n    EmptyProxy.prototype.setCursor = function () { };\n    return EmptyProxy;\n}(Eventful));\nvar HoveredResult = (function () {\n    function HoveredResult(x, y) {\n        this.x = x;\n        this.y = y;\n    }\n    return HoveredResult;\n}());\nvar handlerNames = [\n    'click', 'dblclick', 'mousewheel', 'mouseout',\n    'mouseup', 'mousedown', 'mousemove', 'contextmenu'\n];\nvar tmpRect = new BoundingRect(0, 0, 0, 0);\nvar Handler = (function (_super) {\n    __extends(Handler, _super);\n    function Handler(storage, painter, proxy, painterRoot, pointerSize) {\n        var _this = _super.call(this) || this;\n        _this._hovered = new HoveredResult(0, 0);\n        _this.storage = storage;\n        _this.painter = painter;\n        _this.painterRoot = painterRoot;\n        _this._pointerSize = pointerSize;\n        proxy = proxy || new EmptyProxy();\n        _this.proxy = null;\n        _this.setHandlerProxy(proxy);\n        _this._draggingMgr = new Draggable(_this);\n        return _this;\n    }\n    Handler.prototype.setHandlerProxy = function (proxy) {\n        if (this.proxy) {\n            this.proxy.dispose();\n        }\n        if (proxy) {\n            util.each(handlerNames, function (name) {\n                proxy.on && proxy.on(name, this[name], this);\n            }, this);\n            proxy.handler = this;\n        }\n        this.proxy = proxy;\n    };\n    Handler.prototype.mousemove = function (event) {\n        var x = event.zrX;\n        var y = event.zrY;\n        var isOutside = isOutsideBoundary(this, x, y);\n        var lastHovered = this._hovered;\n        var lastHoveredTarget = lastHovered.target;\n        if (lastHoveredTarget && !lastHoveredTarget.__zr) {\n            lastHovered = this.findHover(lastHovered.x, lastHovered.y);\n            lastHoveredTarget = lastHovered.target;\n        }\n        var hovered = this._hovered = isOutside ? new HoveredResult(x, y) : this.findHover(x, y);\n        var hoveredTarget = hovered.target;\n        var proxy = this.proxy;\n        proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default');\n        if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) {\n            this.dispatchToElement(lastHovered, 'mouseout', event);\n        }\n        this.dispatchToElement(hovered, 'mousemove', event);\n        if (hoveredTarget && hoveredTarget !== lastHoveredTarget) {\n            this.dispatchToElement(hovered, 'mouseover', event);\n        }\n    };\n    Handler.prototype.mouseout = function (event) {\n        var eventControl = event.zrEventControl;\n        if (eventControl !== 'only_globalout') {\n            this.dispatchToElement(this._hovered, 'mouseout', event);\n        }\n        if (eventControl !== 'no_globalout') {\n            this.trigger('globalout', { type: 'globalout', event: event });\n        }\n    };\n    Handler.prototype.resize = function () {\n        this._hovered = new HoveredResult(0, 0);\n    };\n    Handler.prototype.dispatch = function (eventName, eventArgs) {\n        var handler = this[eventName];\n        handler && handler.call(this, eventArgs);\n    };\n    Handler.prototype.dispose = function () {\n        this.proxy.dispose();\n        this.storage = null;\n        this.proxy = null;\n        this.painter = null;\n    };\n    Handler.prototype.setCursorStyle = function (cursorStyle) {\n        var proxy = this.proxy;\n        proxy.setCursor && proxy.setCursor(cursorStyle);\n    };\n    Handler.prototype.dispatchToElement = function (targetInfo, eventName, event) {\n        targetInfo = targetInfo || {};\n        var el = targetInfo.target;\n        if (el && el.silent) {\n            return;\n        }\n        var eventKey = ('on' + eventName);\n        var eventPacket = makeEventPacket(eventName, targetInfo, event);\n        while (el) {\n            el[eventKey]\n                && (eventPacket.cancelBubble = !!el[eventKey].call(el, eventPacket));\n            el.trigger(eventName, eventPacket);\n            el = el.__hostTarget ? el.__hostTarget : el.parent;\n            if (eventPacket.cancelBubble) {\n                break;\n            }\n        }\n        if (!eventPacket.cancelBubble) {\n            this.trigger(eventName, eventPacket);\n            if (this.painter && this.painter.eachOtherLayer) {\n                this.painter.eachOtherLayer(function (layer) {\n                    if (typeof (layer[eventKey]) === 'function') {\n                        layer[eventKey].call(layer, eventPacket);\n                    }\n                    if (layer.trigger) {\n                        layer.trigger(eventName, eventPacket);\n                    }\n                });\n            }\n        }\n    };\n    Handler.prototype.findHover = function (x, y, exclude) {\n        var list = this.storage.getDisplayList();\n        var out = new HoveredResult(x, y);\n        setHoverTarget(list, out, x, y, exclude);\n        if (this._pointerSize && !out.target) {\n            var candidates = [];\n            var pointerSize = this._pointerSize;\n            var targetSizeHalf = pointerSize / 2;\n            var pointerRect = new BoundingRect(x - targetSizeHalf, y - targetSizeHalf, pointerSize, pointerSize);\n            for (var i = list.length - 1; i >= 0; i--) {\n                var el = list[i];\n                if (el !== exclude\n                    && !el.ignore\n                    && !el.ignoreCoarsePointer\n                    && (!el.parent || !el.parent.ignoreCoarsePointer)) {\n                    tmpRect.copy(el.getBoundingRect());\n                    if (el.transform) {\n                        tmpRect.applyTransform(el.transform);\n                    }\n                    if (tmpRect.intersect(pointerRect)) {\n                        candidates.push(el);\n                    }\n                }\n            }\n            if (candidates.length) {\n                var rStep = 4;\n                var thetaStep = Math.PI / 12;\n                var PI2 = Math.PI * 2;\n                for (var r = 0; r < targetSizeHalf; r += rStep) {\n                    for (var theta = 0; theta < PI2; theta += thetaStep) {\n                        var x1 = x + r * Math.cos(theta);\n                        var y1 = y + r * Math.sin(theta);\n                        setHoverTarget(candidates, out, x1, y1, exclude);\n                        if (out.target) {\n                            return out;\n                        }\n                    }\n                }\n            }\n        }\n        return out;\n    };\n    Handler.prototype.processGesture = function (event, stage) {\n        if (!this._gestureMgr) {\n            this._gestureMgr = new GestureMgr();\n        }\n        var gestureMgr = this._gestureMgr;\n        stage === 'start' && gestureMgr.clear();\n        var gestureInfo = gestureMgr.recognize(event, this.findHover(event.zrX, event.zrY, null).target, this.proxy.dom);\n        stage === 'end' && gestureMgr.clear();\n        if (gestureInfo) {\n            var type = gestureInfo.type;\n            event.gestureEvent = type;\n            var res = new HoveredResult();\n            res.target = gestureInfo.target;\n            this.dispatchToElement(res, type, gestureInfo.event);\n        }\n    };\n    return Handler;\n}(Eventful));\nutil.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {\n    Handler.prototype[name] = function (event) {\n        var x = event.zrX;\n        var y = event.zrY;\n        var isOutside = isOutsideBoundary(this, x, y);\n        var hovered;\n        var hoveredTarget;\n        if (name !== 'mouseup' || !isOutside) {\n            hovered = this.findHover(x, y);\n            hoveredTarget = hovered.target;\n        }\n        if (name === 'mousedown') {\n            this._downEl = hoveredTarget;\n            this._downPoint = [event.zrX, event.zrY];\n            this._upEl = hoveredTarget;\n        }\n        else if (name === 'mouseup') {\n            this._upEl = hoveredTarget;\n        }\n        else if (name === 'click') {\n            if (this._downEl !== this._upEl\n                || !this._downPoint\n                || vec2.dist(this._downPoint, [event.zrX, event.zrY]) > 4) {\n                return;\n            }\n            this._downPoint = null;\n        }\n        this.dispatchToElement(hovered, name, event);\n    };\n});\nfunction isHover(displayable, x, y) {\n    if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) {\n        var el = displayable;\n        var isSilent = void 0;\n        var ignoreClip = false;\n        while (el) {\n            if (el.ignoreClip) {\n                ignoreClip = true;\n            }\n            if (!ignoreClip) {\n                var clipPath = el.getClipPath();\n                if (clipPath && !clipPath.contain(x, y)) {\n                    return false;\n                }\n            }\n            if (el.silent) {\n                isSilent = true;\n            }\n            var hostEl = el.__hostTarget;\n            el = hostEl ? (el.ignoreHostSilent ? null : hostEl) : el.parent;\n        }\n        return isSilent ? SILENT : true;\n    }\n    return false;\n}\nfunction setHoverTarget(list, out, x, y, exclude) {\n    for (var i = list.length - 1; i >= 0; i--) {\n        var el = list[i];\n        var hoverCheckResult = void 0;\n        if (el !== exclude\n            && !el.ignore\n            && (hoverCheckResult = isHover(el, x, y))) {\n            !out.topTarget && (out.topTarget = el);\n            if (hoverCheckResult !== SILENT) {\n                out.target = el;\n                break;\n            }\n        }\n    }\n}\nfunction isOutsideBoundary(handlerInstance, x, y) {\n    var painter = handlerInstance.painter;\n    return x < 0 || x > painter.getWidth() || y < 0 || y > painter.getHeight();\n}\nexport default Handler;\n", "var DEFAULT_MIN_MERGE = 32;\nvar DEFAULT_MIN_GALLOPING = 7;\nfunction minRunLength(n) {\n    var r = 0;\n    while (n >= DEFAULT_MIN_MERGE) {\n        r |= n & 1;\n        n >>= 1;\n    }\n    return n + r;\n}\nfunction makeAscendingRun(array, lo, hi, compare) {\n    var runHi = lo + 1;\n    if (runHi === hi) {\n        return 1;\n    }\n    if (compare(array[runHi++], array[lo]) < 0) {\n        while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {\n            runHi++;\n        }\n        reverseRun(array, lo, runHi);\n    }\n    else {\n        while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {\n            runHi++;\n        }\n    }\n    return runHi - lo;\n}\nfunction reverseRun(array, lo, hi) {\n    hi--;\n    while (lo < hi) {\n        var t = array[lo];\n        array[lo++] = array[hi];\n        array[hi--] = t;\n    }\n}\nfunction binaryInsertionSort(array, lo, hi, start, compare) {\n    if (start === lo) {\n        start++;\n    }\n    for (; start < hi; start++) {\n        var pivot = array[start];\n        var left = lo;\n        var right = start;\n        var mid;\n        while (left < right) {\n            mid = left + right >>> 1;\n            if (compare(pivot, array[mid]) < 0) {\n                right = mid;\n            }\n            else {\n                left = mid + 1;\n            }\n        }\n        var n = start - left;\n        switch (n) {\n            case 3:\n                array[left + 3] = array[left + 2];\n            case 2:\n                array[left + 2] = array[left + 1];\n            case 1:\n                array[left + 1] = array[left];\n                break;\n            default:\n                while (n > 0) {\n                    array[left + n] = array[left + n - 1];\n                    n--;\n                }\n        }\n        array[left] = pivot;\n    }\n}\nfunction gallopLeft(value, array, start, length, hint, compare) {\n    var lastOffset = 0;\n    var maxOffset = 0;\n    var offset = 1;\n    if (compare(value, array[start + hint]) > 0) {\n        maxOffset = length - hint;\n        while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n        lastOffset += hint;\n        offset += hint;\n    }\n    else {\n        maxOffset = hint + 1;\n        while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n        var tmp = lastOffset;\n        lastOffset = hint - offset;\n        offset = hint - tmp;\n    }\n    lastOffset++;\n    while (lastOffset < offset) {\n        var m = lastOffset + (offset - lastOffset >>> 1);\n        if (compare(value, array[start + m]) > 0) {\n            lastOffset = m + 1;\n        }\n        else {\n            offset = m;\n        }\n    }\n    return offset;\n}\nfunction gallopRight(value, array, start, length, hint, compare) {\n    var lastOffset = 0;\n    var maxOffset = 0;\n    var offset = 1;\n    if (compare(value, array[start + hint]) < 0) {\n        maxOffset = hint + 1;\n        while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n        var tmp = lastOffset;\n        lastOffset = hint - offset;\n        offset = hint - tmp;\n    }\n    else {\n        maxOffset = length - hint;\n        while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {\n            lastOffset = offset;\n            offset = (offset << 1) + 1;\n            if (offset <= 0) {\n                offset = maxOffset;\n            }\n        }\n        if (offset > maxOffset) {\n            offset = maxOffset;\n        }\n        lastOffset += hint;\n        offset += hint;\n    }\n    lastOffset++;\n    while (lastOffset < offset) {\n        var m = lastOffset + (offset - lastOffset >>> 1);\n        if (compare(value, array[start + m]) < 0) {\n            offset = m;\n        }\n        else {\n            lastOffset = m + 1;\n        }\n    }\n    return offset;\n}\nfunction TimSort(array, compare) {\n    var minGallop = DEFAULT_MIN_GALLOPING;\n    var runStart;\n    var runLength;\n    var stackSize = 0;\n    var tmp = [];\n    runStart = [];\n    runLength = [];\n    function pushRun(_runStart, _runLength) {\n        runStart[stackSize] = _runStart;\n        runLength[stackSize] = _runLength;\n        stackSize += 1;\n    }\n    function mergeRuns() {\n        while (stackSize > 1) {\n            var n = stackSize - 2;\n            if ((n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1])\n                || (n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1])) {\n                if (runLength[n - 1] < runLength[n + 1]) {\n                    n--;\n                }\n            }\n            else if (runLength[n] > runLength[n + 1]) {\n                break;\n            }\n            mergeAt(n);\n        }\n    }\n    function forceMergeRuns() {\n        while (stackSize > 1) {\n            var n = stackSize - 2;\n            if (n > 0 && runLength[n - 1] < runLength[n + 1]) {\n                n--;\n            }\n            mergeAt(n);\n        }\n    }\n    function mergeAt(i) {\n        var start1 = runStart[i];\n        var length1 = runLength[i];\n        var start2 = runStart[i + 1];\n        var length2 = runLength[i + 1];\n        runLength[i] = length1 + length2;\n        if (i === stackSize - 3) {\n            runStart[i + 1] = runStart[i + 2];\n            runLength[i + 1] = runLength[i + 2];\n        }\n        stackSize--;\n        var k = gallopRight(array[start2], array, start1, length1, 0, compare);\n        start1 += k;\n        length1 -= k;\n        if (length1 === 0) {\n            return;\n        }\n        length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);\n        if (length2 === 0) {\n            return;\n        }\n        if (length1 <= length2) {\n            mergeLow(start1, length1, start2, length2);\n        }\n        else {\n            mergeHigh(start1, length1, start2, length2);\n        }\n    }\n    function mergeLow(start1, length1, start2, length2) {\n        var i = 0;\n        for (i = 0; i < length1; i++) {\n            tmp[i] = array[start1 + i];\n        }\n        var cursor1 = 0;\n        var cursor2 = start2;\n        var dest = start1;\n        array[dest++] = array[cursor2++];\n        if (--length2 === 0) {\n            for (i = 0; i < length1; i++) {\n                array[dest + i] = tmp[cursor1 + i];\n            }\n            return;\n        }\n        if (length1 === 1) {\n            for (i = 0; i < length2; i++) {\n                array[dest + i] = array[cursor2 + i];\n            }\n            array[dest + length2] = tmp[cursor1];\n            return;\n        }\n        var _minGallop = minGallop;\n        var count1;\n        var count2;\n        var exit;\n        while (1) {\n            count1 = 0;\n            count2 = 0;\n            exit = false;\n            do {\n                if (compare(array[cursor2], tmp[cursor1]) < 0) {\n                    array[dest++] = array[cursor2++];\n                    count2++;\n                    count1 = 0;\n                    if (--length2 === 0) {\n                        exit = true;\n                        break;\n                    }\n                }\n                else {\n                    array[dest++] = tmp[cursor1++];\n                    count1++;\n                    count2 = 0;\n                    if (--length1 === 1) {\n                        exit = true;\n                        break;\n                    }\n                }\n            } while ((count1 | count2) < _minGallop);\n            if (exit) {\n                break;\n            }\n            do {\n                count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);\n                if (count1 !== 0) {\n                    for (i = 0; i < count1; i++) {\n                        array[dest + i] = tmp[cursor1 + i];\n                    }\n                    dest += count1;\n                    cursor1 += count1;\n                    length1 -= count1;\n                    if (length1 <= 1) {\n                        exit = true;\n                        break;\n                    }\n                }\n                array[dest++] = array[cursor2++];\n                if (--length2 === 0) {\n                    exit = true;\n                    break;\n                }\n                count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);\n                if (count2 !== 0) {\n                    for (i = 0; i < count2; i++) {\n                        array[dest + i] = array[cursor2 + i];\n                    }\n                    dest += count2;\n                    cursor2 += count2;\n                    length2 -= count2;\n                    if (length2 === 0) {\n                        exit = true;\n                        break;\n                    }\n                }\n                array[dest++] = tmp[cursor1++];\n                if (--length1 === 1) {\n                    exit = true;\n                    break;\n                }\n                _minGallop--;\n            } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n            if (exit) {\n                break;\n            }\n            if (_minGallop < 0) {\n                _minGallop = 0;\n            }\n            _minGallop += 2;\n        }\n        minGallop = _minGallop;\n        minGallop < 1 && (minGallop = 1);\n        if (length1 === 1) {\n            for (i = 0; i < length2; i++) {\n                array[dest + i] = array[cursor2 + i];\n            }\n            array[dest + length2] = tmp[cursor1];\n        }\n        else if (length1 === 0) {\n            throw new Error();\n        }\n        else {\n            for (i = 0; i < length1; i++) {\n                array[dest + i] = tmp[cursor1 + i];\n            }\n        }\n    }\n    function mergeHigh(start1, length1, start2, length2) {\n        var i = 0;\n        for (i = 0; i < length2; i++) {\n            tmp[i] = array[start2 + i];\n        }\n        var cursor1 = start1 + length1 - 1;\n        var cursor2 = length2 - 1;\n        var dest = start2 + length2 - 1;\n        var customCursor = 0;\n        var customDest = 0;\n        array[dest--] = array[cursor1--];\n        if (--length1 === 0) {\n            customCursor = dest - (length2 - 1);\n            for (i = 0; i < length2; i++) {\n                array[customCursor + i] = tmp[i];\n            }\n            return;\n        }\n        if (length2 === 1) {\n            dest -= length1;\n            cursor1 -= length1;\n            customDest = dest + 1;\n            customCursor = cursor1 + 1;\n            for (i = length1 - 1; i >= 0; i--) {\n                array[customDest + i] = array[customCursor + i];\n            }\n            array[dest] = tmp[cursor2];\n            return;\n        }\n        var _minGallop = minGallop;\n        while (true) {\n            var count1 = 0;\n            var count2 = 0;\n            var exit = false;\n            do {\n                if (compare(tmp[cursor2], array[cursor1]) < 0) {\n                    array[dest--] = array[cursor1--];\n                    count1++;\n                    count2 = 0;\n                    if (--length1 === 0) {\n                        exit = true;\n                        break;\n                    }\n                }\n                else {\n                    array[dest--] = tmp[cursor2--];\n                    count2++;\n                    count1 = 0;\n                    if (--length2 === 1) {\n                        exit = true;\n                        break;\n                    }\n                }\n            } while ((count1 | count2) < _minGallop);\n            if (exit) {\n                break;\n            }\n            do {\n                count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);\n                if (count1 !== 0) {\n                    dest -= count1;\n                    cursor1 -= count1;\n                    length1 -= count1;\n                    customDest = dest + 1;\n                    customCursor = cursor1 + 1;\n                    for (i = count1 - 1; i >= 0; i--) {\n                        array[customDest + i] = array[customCursor + i];\n                    }\n                    if (length1 === 0) {\n                        exit = true;\n                        break;\n                    }\n                }\n                array[dest--] = tmp[cursor2--];\n                if (--length2 === 1) {\n                    exit = true;\n                    break;\n                }\n                count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);\n                if (count2 !== 0) {\n                    dest -= count2;\n                    cursor2 -= count2;\n                    length2 -= count2;\n                    customDest = dest + 1;\n                    customCursor = cursor2 + 1;\n                    for (i = 0; i < count2; i++) {\n                        array[customDest + i] = tmp[customCursor + i];\n                    }\n                    if (length2 <= 1) {\n                        exit = true;\n                        break;\n                    }\n                }\n                array[dest--] = array[cursor1--];\n                if (--length1 === 0) {\n                    exit = true;\n                    break;\n                }\n                _minGallop--;\n            } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);\n            if (exit) {\n                break;\n            }\n            if (_minGallop < 0) {\n                _minGallop = 0;\n            }\n            _minGallop += 2;\n        }\n        minGallop = _minGallop;\n        if (minGallop < 1) {\n            minGallop = 1;\n        }\n        if (length2 === 1) {\n            dest -= length1;\n            cursor1 -= length1;\n            customDest = dest + 1;\n            customCursor = cursor1 + 1;\n            for (i = length1 - 1; i >= 0; i--) {\n                array[customDest + i] = array[customCursor + i];\n            }\n            array[dest] = tmp[cursor2];\n        }\n        else if (length2 === 0) {\n            throw new Error();\n        }\n        else {\n            customCursor = dest - (length2 - 1);\n            for (i = 0; i < length2; i++) {\n                array[customCursor + i] = tmp[i];\n            }\n        }\n    }\n    return {\n        mergeRuns: mergeRuns,\n        forceMergeRuns: forceMergeRuns,\n        pushRun: pushRun\n    };\n}\nexport default function sort(array, compare, lo, hi) {\n    if (!lo) {\n        lo = 0;\n    }\n    if (!hi) {\n        hi = array.length;\n    }\n    var remaining = hi - lo;\n    if (remaining < 2) {\n        return;\n    }\n    var runLength = 0;\n    if (remaining < DEFAULT_MIN_MERGE) {\n        runLength = makeAscendingRun(array, lo, hi, compare);\n        binaryInsertionSort(array, lo, hi, lo + runLength, compare);\n        return;\n    }\n    var ts = TimSort(array, compare);\n    var minRun = minRunLength(remaining);\n    do {\n        runLength = makeAscendingRun(array, lo, hi, compare);\n        if (runLength < minRun) {\n            var force = remaining;\n            if (force > minRun) {\n                force = minRun;\n            }\n            binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);\n            runLength = force;\n        }\n        ts.pushRun(lo, runLength);\n        ts.mergeRuns();\n        remaining -= runLength;\n        lo += runLength;\n    } while (remaining !== 0);\n    ts.forceMergeRuns();\n}\n", "export var REDRAW_BIT = 1;\nexport var STYLE_CHANGED_BIT = 2;\nexport var SHAPE_CHANGED_BIT = 4;\n", "import * as util from './core/util.js';\nimport timsort from './core/timsort.js';\nimport { REDRAW_BIT } from './graphic/constants.js';\nvar invalidZErrorLogged = false;\nfunction logInvalidZError() {\n    if (invalidZErrorLogged) {\n        return;\n    }\n    invalidZErrorLogged = true;\n    console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors');\n}\nfunction shapeCompareFunc(a, b) {\n    if (a.zlevel === b.zlevel) {\n        if (a.z === b.z) {\n            return a.z2 - b.z2;\n        }\n        return a.z - b.z;\n    }\n    return a.zlevel - b.zlevel;\n}\nvar Storage = (function () {\n    function Storage() {\n        this._roots = [];\n        this._displayList = [];\n        this._displayListLen = 0;\n        this.displayableSortFunc = shapeCompareFunc;\n    }\n    Storage.prototype.traverse = function (cb, context) {\n        for (var i = 0; i < this._roots.length; i++) {\n            this._roots[i].traverse(cb, context);\n        }\n    };\n    Storage.prototype.getDisplayList = function (update, includeIgnore) {\n        includeIgnore = includeIgnore || false;\n        var displayList = this._displayList;\n        if (update || !displayList.length) {\n            this.updateDisplayList(includeIgnore);\n        }\n        return displayList;\n    };\n    Storage.prototype.updateDisplayList = function (includeIgnore) {\n        this._displayListLen = 0;\n        var roots = this._roots;\n        var displayList = this._displayList;\n        for (var i = 0, len = roots.length; i < len; i++) {\n            this._updateAndAddDisplayable(roots[i], null, includeIgnore);\n        }\n        displayList.length = this._displayListLen;\n        timsort(displayList, shapeCompareFunc);\n    };\n    Storage.prototype._updateAndAddDisplayable = function (el, parentClipPaths, includeIgnore) {\n        if (el.ignore && !includeIgnore) {\n            return;\n        }\n        el.beforeUpdate();\n        el.update();\n        el.afterUpdate();\n        var userSetClipPath = el.getClipPath();\n        var parentHasClipPaths = parentClipPaths && parentClipPaths.length;\n        var clipPathIdx = 0;\n        var thisClipPaths = el.__clipPaths;\n        if (!el.ignoreClip\n            && (parentHasClipPaths || userSetClipPath)) {\n            if (!thisClipPaths) {\n                thisClipPaths = el.__clipPaths = [];\n            }\n            if (parentHasClipPaths) {\n                for (var idx = 0; idx < parentClipPaths.length; idx++) {\n                    thisClipPaths[clipPathIdx++] = parentClipPaths[idx];\n                }\n            }\n            var currentClipPath = userSetClipPath;\n            var parentClipPath = el;\n            while (currentClipPath) {\n                currentClipPath.parent = parentClipPath;\n                currentClipPath.updateTransform();\n                thisClipPaths[clipPathIdx++] = currentClipPath;\n                parentClipPath = currentClipPath;\n                currentClipPath = currentClipPath.getClipPath();\n            }\n        }\n        if (thisClipPaths) {\n            thisClipPaths.length = clipPathIdx;\n        }\n        if (el.childrenRef) {\n            var children = el.childrenRef();\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n                if (el.__dirty) {\n                    child.__dirty |= REDRAW_BIT;\n                }\n                this._updateAndAddDisplayable(child, thisClipPaths, includeIgnore);\n            }\n            el.__dirty = 0;\n        }\n        else {\n            var disp = el;\n            if (isNaN(disp.z)) {\n                logInvalidZError();\n                disp.z = 0;\n            }\n            if (isNaN(disp.z2)) {\n                logInvalidZError();\n                disp.z2 = 0;\n            }\n            if (isNaN(disp.zlevel)) {\n                logInvalidZError();\n                disp.zlevel = 0;\n            }\n            this._displayList[this._displayListLen++] = disp;\n        }\n        var decalEl = el.getDecalElement && el.getDecalElement();\n        if (decalEl) {\n            this._updateAndAddDisplayable(decalEl, thisClipPaths, includeIgnore);\n        }\n        var textGuide = el.getTextGuideLine();\n        if (textGuide) {\n            this._updateAndAddDisplayable(textGuide, thisClipPaths, includeIgnore);\n        }\n        var textEl = el.getTextContent();\n        if (textEl) {\n            this._updateAndAddDisplayable(textEl, thisClipPaths, includeIgnore);\n        }\n    };\n    Storage.prototype.addRoot = function (el) {\n        if (el.__zr && el.__zr.storage === this) {\n            return;\n        }\n        this._roots.push(el);\n    };\n    Storage.prototype.delRoot = function (el) {\n        if (el instanceof Array) {\n            for (var i = 0, l = el.length; i < l; i++) {\n                this.delRoot(el[i]);\n            }\n            return;\n        }\n        var idx = util.indexOf(this._roots, el);\n        if (idx >= 0) {\n            this._roots.splice(idx, 1);\n        }\n    };\n    Storage.prototype.delAllRoots = function () {\n        this._roots = [];\n        this._displayList = [];\n        this._displayListLen = 0;\n        return;\n    };\n    Storage.prototype.getRoots = function () {\n        return this._roots;\n    };\n    Storage.prototype.dispose = function () {\n        this._displayList = null;\n        this._roots = null;\n    };\n    return Storage;\n}());\nexport default Storage;\n", "import env from '../core/env.js';\nvar requestAnimationFrame;\nrequestAnimationFrame = (env.hasGlobalWindow\n    && ((window.requestAnimationFrame && window.requestAnimationFrame.bind(window))\n        || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window))\n        || window.mozRequestAnimationFrame\n        || window.webkitRequestAnimationFrame)) || function (func) {\n    return setTimeout(func, 16);\n};\nexport default requestAnimationFrame;\n", "var easingFuncs = {\n    linear: function (k) {\n        return k;\n    },\n    quadraticIn: function (k) {\n        return k * k;\n    },\n    quadraticOut: function (k) {\n        return k * (2 - k);\n    },\n    quadraticInOut: function (k) {\n        if ((k *= 2) < 1) {\n            return 0.5 * k * k;\n        }\n        return -0.5 * (--k * (k - 2) - 1);\n    },\n    cubicIn: function (k) {\n        return k * k * k;\n    },\n    cubicOut: function (k) {\n        return --k * k * k + 1;\n    },\n    cubicInOut: function (k) {\n        if ((k *= 2) < 1) {\n            return 0.5 * k * k * k;\n        }\n        return 0.5 * ((k -= 2) * k * k + 2);\n    },\n    quarticIn: function (k) {\n        return k * k * k * k;\n    },\n    quarticOut: function (k) {\n        return 1 - (--k * k * k * k);\n    },\n    quarticInOut: function (k) {\n        if ((k *= 2) < 1) {\n            return 0.5 * k * k * k * k;\n        }\n        return -0.5 * ((k -= 2) * k * k * k - 2);\n    },\n    quinticIn: function (k) {\n        return k * k * k * k * k;\n    },\n    quinticOut: function (k) {\n        return --k * k * k * k * k + 1;\n    },\n    quinticInOut: function (k) {\n        if ((k *= 2) < 1) {\n            return 0.5 * k * k * k * k * k;\n        }\n        return 0.5 * ((k -= 2) * k * k * k * k + 2);\n    },\n    sinusoidalIn: function (k) {\n        return 1 - Math.cos(k * Math.PI / 2);\n    },\n    sinusoidalOut: function (k) {\n        return Math.sin(k * Math.PI / 2);\n    },\n    sinusoidalInOut: function (k) {\n        return 0.5 * (1 - Math.cos(Math.PI * k));\n    },\n    exponentialIn: function (k) {\n        return k === 0 ? 0 : Math.pow(1024, k - 1);\n    },\n    exponentialOut: function (k) {\n        return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);\n    },\n    exponentialInOut: function (k) {\n        if (k === 0) {\n            return 0;\n        }\n        if (k === 1) {\n            return 1;\n        }\n        if ((k *= 2) < 1) {\n            return 0.5 * Math.pow(1024, k - 1);\n        }\n        return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);\n    },\n    circularIn: function (k) {\n        return 1 - Math.sqrt(1 - k * k);\n    },\n    circularOut: function (k) {\n        return Math.sqrt(1 - (--k * k));\n    },\n    circularInOut: function (k) {\n        if ((k *= 2) < 1) {\n            return -0.5 * (Math.sqrt(1 - k * k) - 1);\n        }\n        return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);\n    },\n    elasticIn: function (k) {\n        var s;\n        var a = 0.1;\n        var p = 0.4;\n        if (k === 0) {\n            return 0;\n        }\n        if (k === 1) {\n            return 1;\n        }\n        if (!a || a < 1) {\n            a = 1;\n            s = p / 4;\n        }\n        else {\n            s = p * Math.asin(1 / a) / (2 * Math.PI);\n        }\n        return -(a * Math.pow(2, 10 * (k -= 1))\n            * Math.sin((k - s) * (2 * Math.PI) / p));\n    },\n    elasticOut: function (k) {\n        var s;\n        var a = 0.1;\n        var p = 0.4;\n        if (k === 0) {\n            return 0;\n        }\n        if (k === 1) {\n            return 1;\n        }\n        if (!a || a < 1) {\n            a = 1;\n            s = p / 4;\n        }\n        else {\n            s = p * Math.asin(1 / a) / (2 * Math.PI);\n        }\n        return (a * Math.pow(2, -10 * k)\n            * Math.sin((k - s) * (2 * Math.PI) / p) + 1);\n    },\n    elasticInOut: function (k) {\n        var s;\n        var a = 0.1;\n        var p = 0.4;\n        if (k === 0) {\n            return 0;\n        }\n        if (k === 1) {\n            return 1;\n        }\n        if (!a || a < 1) {\n            a = 1;\n            s = p / 4;\n        }\n        else {\n            s = p * Math.asin(1 / a) / (2 * Math.PI);\n        }\n        if ((k *= 2) < 1) {\n            return -0.5 * (a * Math.pow(2, 10 * (k -= 1))\n                * Math.sin((k - s) * (2 * Math.PI) / p));\n        }\n        return a * Math.pow(2, -10 * (k -= 1))\n            * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1;\n    },\n    backIn: function (k) {\n        var s = 1.70158;\n        return k * k * ((s + 1) * k - s);\n    },\n    backOut: function (k) {\n        var s = 1.70158;\n        return --k * k * ((s + 1) * k + s) + 1;\n    },\n    backInOut: function (k) {\n        var s = 1.70158 * 1.525;\n        if ((k *= 2) < 1) {\n            return 0.5 * (k * k * ((s + 1) * k - s));\n        }\n        return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);\n    },\n    bounceIn: function (k) {\n        return 1 - easingFuncs.bounceOut(1 - k);\n    },\n    bounceOut: function (k) {\n        if (k < (1 / 2.75)) {\n            return 7.5625 * k * k;\n        }\n        else if (k < (2 / 2.75)) {\n            return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75;\n        }\n        else if (k < (2.5 / 2.75)) {\n            return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375;\n        }\n        else {\n            return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375;\n        }\n    },\n    bounceInOut: function (k) {\n        if (k < 0.5) {\n            return easingFuncs.bounceIn(k * 2) * 0.5;\n        }\n        return easingFuncs.bounceOut(k * 2 - 1) * 0.5 + 0.5;\n    }\n};\nexport default easingFuncs;\n", "import { create as v2Create, distSquare as v2DistSquare } from './vector.js';\nvar mathPow = Math.pow;\nvar mathSqrt = Math.sqrt;\nvar EPSILON = 1e-8;\nvar EPSILON_NUMERIC = 1e-4;\nvar THREE_SQRT = mathSqrt(3);\nvar ONE_THIRD = 1 / 3;\nvar _v0 = v2Create();\nvar _v1 = v2Create();\nvar _v2 = v2Create();\nfunction isAroundZero(val) {\n    return val > -EPSILON && val < EPSILON;\n}\nfunction isNotAroundZero(val) {\n    return val > EPSILON || val < -EPSILON;\n}\nexport function cubicAt(p0, p1, p2, p3, t) {\n    var onet = 1 - t;\n    return onet * onet * (onet * p0 + 3 * t * p1)\n        + t * t * (t * p3 + 3 * onet * p2);\n}\nexport function cubicDerivativeAt(p0, p1, p2, p3, t) {\n    var onet = 1 - t;\n    return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet\n        + (p3 - p2) * t * t);\n}\nexport function cubicRootAt(p0, p1, p2, p3, val, roots) {\n    var a = p3 + 3 * (p1 - p2) - p0;\n    var b = 3 * (p2 - p1 * 2 + p0);\n    var c = 3 * (p1 - p0);\n    var d = p0 - val;\n    var A = b * b - 3 * a * c;\n    var B = b * c - 9 * a * d;\n    var C = c * c - 3 * b * d;\n    var n = 0;\n    if (isAroundZero(A) && isAroundZero(B)) {\n        if (isAroundZero(b)) {\n            roots[0] = 0;\n        }\n        else {\n            var t1 = -c / b;\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n        }\n    }\n    else {\n        var disc = B * B - 4 * A * C;\n        if (isAroundZero(disc)) {\n            var K = B / A;\n            var t1 = -b / a + K;\n            var t2 = -K / 2;\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n            if (t2 >= 0 && t2 <= 1) {\n                roots[n++] = t2;\n            }\n        }\n        else if (disc > 0) {\n            var discSqrt = mathSqrt(disc);\n            var Y1 = A * b + 1.5 * a * (-B + discSqrt);\n            var Y2 = A * b + 1.5 * a * (-B - discSqrt);\n            if (Y1 < 0) {\n                Y1 = -mathPow(-Y1, ONE_THIRD);\n            }\n            else {\n                Y1 = mathPow(Y1, ONE_THIRD);\n            }\n            if (Y2 < 0) {\n                Y2 = -mathPow(-Y2, ONE_THIRD);\n            }\n            else {\n                Y2 = mathPow(Y2, ONE_THIRD);\n            }\n            var t1 = (-b - (Y1 + Y2)) / (3 * a);\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n        }\n        else {\n            var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A));\n            var theta = Math.acos(T) / 3;\n            var ASqrt = mathSqrt(A);\n            var tmp = Math.cos(theta);\n            var t1 = (-b - 2 * ASqrt * tmp) / (3 * a);\n            var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a);\n            var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a);\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n            if (t2 >= 0 && t2 <= 1) {\n                roots[n++] = t2;\n            }\n            if (t3 >= 0 && t3 <= 1) {\n                roots[n++] = t3;\n            }\n        }\n    }\n    return n;\n}\nexport function cubicExtrema(p0, p1, p2, p3, extrema) {\n    var b = 6 * p2 - 12 * p1 + 6 * p0;\n    var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2;\n    var c = 3 * p1 - 3 * p0;\n    var n = 0;\n    if (isAroundZero(a)) {\n        if (isNotAroundZero(b)) {\n            var t1 = -c / b;\n            if (t1 >= 0 && t1 <= 1) {\n                extrema[n++] = t1;\n            }\n        }\n    }\n    else {\n        var disc = b * b - 4 * a * c;\n        if (isAroundZero(disc)) {\n            extrema[0] = -b / (2 * a);\n        }\n        else if (disc > 0) {\n            var discSqrt = mathSqrt(disc);\n            var t1 = (-b + discSqrt) / (2 * a);\n            var t2 = (-b - discSqrt) / (2 * a);\n            if (t1 >= 0 && t1 <= 1) {\n                extrema[n++] = t1;\n            }\n            if (t2 >= 0 && t2 <= 1) {\n                extrema[n++] = t2;\n            }\n        }\n    }\n    return n;\n}\nexport function cubicSubdivide(p0, p1, p2, p3, t, out) {\n    var p01 = (p1 - p0) * t + p0;\n    var p12 = (p2 - p1) * t + p1;\n    var p23 = (p3 - p2) * t + p2;\n    var p012 = (p12 - p01) * t + p01;\n    var p123 = (p23 - p12) * t + p12;\n    var p0123 = (p123 - p012) * t + p012;\n    out[0] = p0;\n    out[1] = p01;\n    out[2] = p012;\n    out[3] = p0123;\n    out[4] = p0123;\n    out[5] = p123;\n    out[6] = p23;\n    out[7] = p3;\n}\nexport function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) {\n    var t;\n    var interval = 0.005;\n    var d = Infinity;\n    var prev;\n    var next;\n    var d1;\n    var d2;\n    _v0[0] = x;\n    _v0[1] = y;\n    for (var _t = 0; _t < 1; _t += 0.05) {\n        _v1[0] = cubicAt(x0, x1, x2, x3, _t);\n        _v1[1] = cubicAt(y0, y1, y2, y3, _t);\n        d1 = v2DistSquare(_v0, _v1);\n        if (d1 < d) {\n            t = _t;\n            d = d1;\n        }\n    }\n    d = Infinity;\n    for (var i = 0; i < 32; i++) {\n        if (interval < EPSILON_NUMERIC) {\n            break;\n        }\n        prev = t - interval;\n        next = t + interval;\n        _v1[0] = cubicAt(x0, x1, x2, x3, prev);\n        _v1[1] = cubicAt(y0, y1, y2, y3, prev);\n        d1 = v2DistSquare(_v1, _v0);\n        if (prev >= 0 && d1 < d) {\n            t = prev;\n            d = d1;\n        }\n        else {\n            _v2[0] = cubicAt(x0, x1, x2, x3, next);\n            _v2[1] = cubicAt(y0, y1, y2, y3, next);\n            d2 = v2DistSquare(_v2, _v0);\n            if (next <= 1 && d2 < d) {\n                t = next;\n                d = d2;\n            }\n            else {\n                interval *= 0.5;\n            }\n        }\n    }\n    if (out) {\n        out[0] = cubicAt(x0, x1, x2, x3, t);\n        out[1] = cubicAt(y0, y1, y2, y3, t);\n    }\n    return mathSqrt(d);\n}\nexport function cubicLength(x0, y0, x1, y1, x2, y2, x3, y3, iteration) {\n    var px = x0;\n    var py = y0;\n    var d = 0;\n    var step = 1 / iteration;\n    for (var i = 1; i <= iteration; i++) {\n        var t = i * step;\n        var x = cubicAt(x0, x1, x2, x3, t);\n        var y = cubicAt(y0, y1, y2, y3, t);\n        var dx = x - px;\n        var dy = y - py;\n        d += Math.sqrt(dx * dx + dy * dy);\n        px = x;\n        py = y;\n    }\n    return d;\n}\nexport function quadraticAt(p0, p1, p2, t) {\n    var onet = 1 - t;\n    return onet * (onet * p0 + 2 * t * p1) + t * t * p2;\n}\nexport function quadraticDerivativeAt(p0, p1, p2, t) {\n    return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));\n}\nexport function quadraticRootAt(p0, p1, p2, val, roots) {\n    var a = p0 - 2 * p1 + p2;\n    var b = 2 * (p1 - p0);\n    var c = p0 - val;\n    var n = 0;\n    if (isAroundZero(a)) {\n        if (isNotAroundZero(b)) {\n            var t1 = -c / b;\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n        }\n    }\n    else {\n        var disc = b * b - 4 * a * c;\n        if (isAroundZero(disc)) {\n            var t1 = -b / (2 * a);\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n        }\n        else if (disc > 0) {\n            var discSqrt = mathSqrt(disc);\n            var t1 = (-b + discSqrt) / (2 * a);\n            var t2 = (-b - discSqrt) / (2 * a);\n            if (t1 >= 0 && t1 <= 1) {\n                roots[n++] = t1;\n            }\n            if (t2 >= 0 && t2 <= 1) {\n                roots[n++] = t2;\n            }\n        }\n    }\n    return n;\n}\nexport function quadraticExtremum(p0, p1, p2) {\n    var divider = p0 + p2 - 2 * p1;\n    if (divider === 0) {\n        return 0.5;\n    }\n    else {\n        return (p0 - p1) / divider;\n    }\n}\nexport function quadraticSubdivide(p0, p1, p2, t, out) {\n    var p01 = (p1 - p0) * t + p0;\n    var p12 = (p2 - p1) * t + p1;\n    var p012 = (p12 - p01) * t + p01;\n    out[0] = p0;\n    out[1] = p01;\n    out[2] = p012;\n    out[3] = p012;\n    out[4] = p12;\n    out[5] = p2;\n}\nexport function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) {\n    var t;\n    var interval = 0.005;\n    var d = Infinity;\n    _v0[0] = x;\n    _v0[1] = y;\n    for (var _t = 0; _t < 1; _t += 0.05) {\n        _v1[0] = quadraticAt(x0, x1, x2, _t);\n        _v1[1] = quadraticAt(y0, y1, y2, _t);\n        var d1 = v2DistSquare(_v0, _v1);\n        if (d1 < d) {\n            t = _t;\n            d = d1;\n        }\n    }\n    d = Infinity;\n    for (var i = 0; i < 32; i++) {\n        if (interval < EPSILON_NUMERIC) {\n            break;\n        }\n        var prev = t - interval;\n        var next = t + interval;\n        _v1[0] = quadraticAt(x0, x1, x2, prev);\n        _v1[1] = quadraticAt(y0, y1, y2, prev);\n        var d1 = v2DistSquare(_v1, _v0);\n        if (prev >= 0 && d1 < d) {\n            t = prev;\n            d = d1;\n        }\n        else {\n            _v2[0] = quadraticAt(x0, x1, x2, next);\n            _v2[1] = quadraticAt(y0, y1, y2, next);\n            var d2 = v2DistSquare(_v2, _v0);\n            if (next <= 1 && d2 < d) {\n                t = next;\n                d = d2;\n            }\n            else {\n                interval *= 0.5;\n            }\n        }\n    }\n    if (out) {\n        out[0] = quadraticAt(x0, x1, x2, t);\n        out[1] = quadraticAt(y0, y1, y2, t);\n    }\n    return mathSqrt(d);\n}\nexport function quadraticLength(x0, y0, x1, y1, x2, y2, iteration) {\n    var px = x0;\n    var py = y0;\n    var d = 0;\n    var step = 1 / iteration;\n    for (var i = 1; i <= iteration; i++) {\n        var t = i * step;\n        var x = quadraticAt(x0, x1, x2, t);\n        var y = quadraticAt(y0, y1, y2, t);\n        var dx = x - px;\n        var dy = y - py;\n        d += Math.sqrt(dx * dx + dy * dy);\n        px = x;\n        py = y;\n    }\n    return d;\n}\n", "import { cubicAt, cubicRootAt } from '../core/curve.js';\nimport { trim } from '../core/util.js';\nvar regexp = /cubic-bezier\\(([0-9,\\.e ]+)\\)/;\nexport function createCubicEasingFunc(cubicEasingStr) {\n    var cubic = cubicEasingStr && regexp.exec(cubicEasingStr);\n    if (cubic) {\n        var points = cubic[1].split(',');\n        var a_1 = +trim(points[0]);\n        var b_1 = +trim(points[1]);\n        var c_1 = +trim(points[2]);\n        var d_1 = +trim(points[3]);\n        if (isNaN(a_1 + b_1 + c_1 + d_1)) {\n            return;\n        }\n        var roots_1 = [];\n        return function (p) {\n            return p <= 0\n                ? 0 : p >= 1\n                ? 1\n                : cubicRootAt(0, a_1, c_1, 1, p, roots_1) && cubicAt(0, b_1, d_1, 1, roots_1[0]);\n        };\n    }\n}\n", "import easingFuncs from './easing.js';\nimport { isFunction, noop } from '../core/util.js';\nimport { createCubicEasingFunc } from './cubicEasing.js';\nvar Clip = (function () {\n    function Clip(opts) {\n        this._inited = false;\n        this._startTime = 0;\n        this._pausedTime = 0;\n        this._paused = false;\n        this._life = opts.life || 1000;\n        this._delay = opts.delay || 0;\n        this.loop = opts.loop || false;\n        this.onframe = opts.onframe || noop;\n        this.ondestroy = opts.ondestroy || noop;\n        this.onrestart = opts.onrestart || noop;\n        opts.easing && this.setEasing(opts.easing);\n    }\n    Clip.prototype.step = function (globalTime, deltaTime) {\n        if (!this._inited) {\n            this._startTime = globalTime + this._delay;\n            this._inited = true;\n        }\n        if (this._paused) {\n            this._pausedTime += deltaTime;\n            return;\n        }\n        var life = this._life;\n        var elapsedTime = globalTime - this._startTime - this._pausedTime;\n        var percent = elapsedTime / life;\n        if (percent < 0) {\n            percent = 0;\n        }\n        percent = Math.min(percent, 1);\n        var easingFunc = this.easingFunc;\n        var schedule = easingFunc ? easingFunc(percent) : percent;\n        this.onframe(schedule);\n        if (percent === 1) {\n            if (this.loop) {\n                var remainder = elapsedTime % life;\n                this._startTime = globalTime - remainder;\n                this._pausedTime = 0;\n                this.onrestart();\n            }\n            else {\n                return true;\n            }\n        }\n        return false;\n    };\n    Clip.prototype.pause = function () {\n        this._paused = true;\n    };\n    Clip.prototype.resume = function () {\n        this._paused = false;\n    };\n    Clip.prototype.setEasing = function (easing) {\n        this.easing = easing;\n        this.easingFunc = isFunction(easing)\n            ? easing\n            : easingFuncs[easing] || createCubicEasingFunc(easing);\n    };\n    return Clip;\n}());\nexport default Clip;\n", "var Entry = (function () {\n    function Entry(val) {\n        this.value = val;\n    }\n    return Entry;\n}());\nexport { Entry };\nvar LinkedList = (function () {\n    function LinkedList() {\n        this._len = 0;\n    }\n    LinkedList.prototype.insert = function (val) {\n        var entry = new Entry(val);\n        this.insertEntry(entry);\n        return entry;\n    };\n    LinkedList.prototype.insertEntry = function (entry) {\n        if (!this.head) {\n            this.head = this.tail = entry;\n        }\n        else {\n            this.tail.next = entry;\n            entry.prev = this.tail;\n            entry.next = null;\n            this.tail = entry;\n        }\n        this._len++;\n    };\n    LinkedList.prototype.remove = function (entry) {\n        var prev = entry.prev;\n        var next = entry.next;\n        if (prev) {\n            prev.next = next;\n        }\n        else {\n            this.head = next;\n        }\n        if (next) {\n            next.prev = prev;\n        }\n        else {\n            this.tail = prev;\n        }\n        entry.next = entry.prev = null;\n        this._len--;\n    };\n    LinkedList.prototype.len = function () {\n        return this._len;\n    };\n    LinkedList.prototype.clear = function () {\n        this.head = this.tail = null;\n        this._len = 0;\n    };\n    return LinkedList;\n}());\nexport { LinkedList };\nvar LRU = (function () {\n    function LRU(maxSize) {\n        this._list = new LinkedList();\n        this._maxSize = 10;\n        this._map = {};\n        this._maxSize = maxSize;\n    }\n    LRU.prototype.put = function (key, value) {\n        var list = this._list;\n        var map = this._map;\n        var removed = null;\n        if (map[key] == null) {\n            var len = list.len();\n            var entry = this._lastRemovedEntry;\n            if (len >= this._maxSize && len > 0) {\n                var leastUsedEntry = list.head;\n                list.remove(leastUsedEntry);\n                delete map[leastUsedEntry.key];\n                removed = leastUsedEntry.value;\n                this._lastRemovedEntry = leastUsedEntry;\n            }\n            if (entry) {\n                entry.value = value;\n            }\n            else {\n                entry = new Entry(value);\n            }\n            entry.key = key;\n            list.insertEntry(entry);\n            map[key] = entry;\n        }\n        return removed;\n    };\n    LRU.prototype.get = function (key) {\n        var entry = this._map[key];\n        var list = this._list;\n        if (entry != null) {\n            if (entry !== list.tail) {\n                list.remove(entry);\n                list.insertEntry(entry);\n            }\n            return entry.value;\n        }\n    };\n    LRU.prototype.clear = function () {\n        this._list.clear();\n        this._map = {};\n    };\n    LRU.prototype.len = function () {\n        return this._list.len();\n    };\n    return LRU;\n}());\nexport default LRU;\n", "import LRU from '../core/LRU.js';\nimport { extend, isFunction, isGradientObject, isString, map } from '../core/util.js';\nvar kCSSColorTable = {\n    'transparent': [0, 0, 0, 0], 'aliceblue': [240, 248, 255, 1],\n    'antiquewhite': [250, 235, 215, 1], 'aqua': [0, 255, 255, 1],\n    'aquamarine': [127, 255, 212, 1], 'azure': [240, 255, 255, 1],\n    'beige': [245, 245, 220, 1], 'bisque': [255, 228, 196, 1],\n    'black': [0, 0, 0, 1], 'blanchedalmond': [255, 235, 205, 1],\n    'blue': [0, 0, 255, 1], 'blueviolet': [138, 43, 226, 1],\n    'brown': [165, 42, 42, 1], 'burlywood': [222, 184, 135, 1],\n    'cadetblue': [95, 158, 160, 1], 'chartreuse': [127, 255, 0, 1],\n    'chocolate': [210, 105, 30, 1], 'coral': [255, 127, 80, 1],\n    'cornflowerblue': [100, 149, 237, 1], 'cornsilk': [255, 248, 220, 1],\n    'crimson': [220, 20, 60, 1], 'cyan': [0, 255, 255, 1],\n    'darkblue': [0, 0, 139, 1], 'darkcyan': [0, 139, 139, 1],\n    'darkgoldenrod': [184, 134, 11, 1], 'darkgray': [169, 169, 169, 1],\n    'darkgreen': [0, 100, 0, 1], 'darkgrey': [169, 169, 169, 1],\n    'darkkhaki': [189, 183, 107, 1], 'darkmagenta': [139, 0, 139, 1],\n    'darkolivegreen': [85, 107, 47, 1], 'darkorange': [255, 140, 0, 1],\n    'darkorchid': [153, 50, 204, 1], 'darkred': [139, 0, 0, 1],\n    'darksalmon': [233, 150, 122, 1], 'darkseagreen': [143, 188, 143, 1],\n    'darkslateblue': [72, 61, 139, 1], 'darkslategray': [47, 79, 79, 1],\n    'darkslategrey': [47, 79, 79, 1], 'darkturquoise': [0, 206, 209, 1],\n    'darkviolet': [148, 0, 211, 1], 'deeppink': [255, 20, 147, 1],\n    'deepskyblue': [0, 191, 255, 1], 'dimgray': [105, 105, 105, 1],\n    'dimgrey': [105, 105, 105, 1], 'dodgerblue': [30, 144, 255, 1],\n    'firebrick': [178, 34, 34, 1], 'floralwhite': [255, 250, 240, 1],\n    'forestgreen': [34, 139, 34, 1], 'fuchsia': [255, 0, 255, 1],\n    'gainsboro': [220, 220, 220, 1], 'ghostwhite': [248, 248, 255, 1],\n    'gold': [255, 215, 0, 1], 'goldenrod': [218, 165, 32, 1],\n    'gray': [128, 128, 128, 1], 'green': [0, 128, 0, 1],\n    'greenyellow': [173, 255, 47, 1], 'grey': [128, 128, 128, 1],\n    'honeydew': [240, 255, 240, 1], 'hotpink': [255, 105, 180, 1],\n    'indianred': [205, 92, 92, 1], 'indigo': [75, 0, 130, 1],\n    'ivory': [255, 255, 240, 1], 'khaki': [240, 230, 140, 1],\n    'lavender': [230, 230, 250, 1], 'lavenderblush': [255, 240, 245, 1],\n    'lawngreen': [124, 252, 0, 1], 'lemonchiffon': [255, 250, 205, 1],\n    'lightblue': [173, 216, 230, 1], 'lightcoral': [240, 128, 128, 1],\n    'lightcyan': [224, 255, 255, 1], 'lightgoldenrodyellow': [250, 250, 210, 1],\n    'lightgray': [211, 211, 211, 1], 'lightgreen': [144, 238, 144, 1],\n    'lightgrey': [211, 211, 211, 1], 'lightpink': [255, 182, 193, 1],\n    'lightsalmon': [255, 160, 122, 1], 'lightseagreen': [32, 178, 170, 1],\n    'lightskyblue': [135, 206, 250, 1], 'lightslategray': [119, 136, 153, 1],\n    'lightslategrey': [119, 136, 153, 1], 'lightsteelblue': [176, 196, 222, 1],\n    'lightyellow': [255, 255, 224, 1], 'lime': [0, 255, 0, 1],\n    'limegreen': [50, 205, 50, 1], 'linen': [250, 240, 230, 1],\n    'magenta': [255, 0, 255, 1], 'maroon': [128, 0, 0, 1],\n    'mediumaquamarine': [102, 205, 170, 1], 'mediumblue': [0, 0, 205, 1],\n    'mediumorchid': [186, 85, 211, 1], 'mediumpurple': [147, 112, 219, 1],\n    'mediumseagreen': [60, 179, 113, 1], 'mediumslateblue': [123, 104, 238, 1],\n    'mediumspringgreen': [0, 250, 154, 1], 'mediumturquoise': [72, 209, 204, 1],\n    'mediumvioletred': [199, 21, 133, 1], 'midnightblue': [25, 25, 112, 1],\n    'mintcream': [245, 255, 250, 1], 'mistyrose': [255, 228, 225, 1],\n    'moccasin': [255, 228, 181, 1], 'navajowhite': [255, 222, 173, 1],\n    'navy': [0, 0, 128, 1], 'oldlace': [253, 245, 230, 1],\n    'olive': [128, 128, 0, 1], 'olivedrab': [107, 142, 35, 1],\n    'orange': [255, 165, 0, 1], 'orangered': [255, 69, 0, 1],\n    'orchid': [218, 112, 214, 1], 'palegoldenrod': [238, 232, 170, 1],\n    'palegreen': [152, 251, 152, 1], 'paleturquoise': [175, 238, 238, 1],\n    'palevioletred': [219, 112, 147, 1], 'papayawhip': [255, 239, 213, 1],\n    'peachpuff': [255, 218, 185, 1], 'peru': [205, 133, 63, 1],\n    'pink': [255, 192, 203, 1], 'plum': [221, 160, 221, 1],\n    'powderblue': [176, 224, 230, 1], 'purple': [128, 0, 128, 1],\n    'red': [255, 0, 0, 1], 'rosybrown': [188, 143, 143, 1],\n    'royalblue': [65, 105, 225, 1], 'saddlebrown': [139, 69, 19, 1],\n    'salmon': [250, 128, 114, 1], 'sandybrown': [244, 164, 96, 1],\n    'seagreen': [46, 139, 87, 1], 'seashell': [255, 245, 238, 1],\n    'sienna': [160, 82, 45, 1], 'silver': [192, 192, 192, 1],\n    'skyblue': [135, 206, 235, 1], 'slateblue': [106, 90, 205, 1],\n    'slategray': [112, 128, 144, 1], 'slategrey': [112, 128, 144, 1],\n    'snow': [255, 250, 250, 1], 'springgreen': [0, 255, 127, 1],\n    'steelblue': [70, 130, 180, 1], 'tan': [210, 180, 140, 1],\n    'teal': [0, 128, 128, 1], 'thistle': [216, 191, 216, 1],\n    'tomato': [255, 99, 71, 1], 'turquoise': [64, 224, 208, 1],\n    'violet': [238, 130, 238, 1], 'wheat': [245, 222, 179, 1],\n    'white': [255, 255, 255, 1], 'whitesmoke': [245, 245, 245, 1],\n    'yellow': [255, 255, 0, 1], 'yellowgreen': [154, 205, 50, 1]\n};\nfunction clampCssByte(i) {\n    i = Math.round(i);\n    return i < 0 ? 0 : i > 255 ? 255 : i;\n}\nfunction clampCssAngle(i) {\n    i = Math.round(i);\n    return i < 0 ? 0 : i > 360 ? 360 : i;\n}\nfunction clampCssFloat(f) {\n    return f < 0 ? 0 : f > 1 ? 1 : f;\n}\nexport function parseCssInt(val) {\n    var str = val;\n    if (str.length && str.charAt(str.length - 1) === '%') {\n        return clampCssByte(parseFloat(str) / 100 * 255);\n    }\n    return clampCssByte(parseInt(str, 10));\n}\nexport function parseCssFloat(val) {\n    var str = val;\n    if (str.length && str.charAt(str.length - 1) === '%') {\n        return clampCssFloat(parseFloat(str) / 100);\n    }\n    return clampCssFloat(parseFloat(str));\n}\nfunction cssHueToRgb(m1, m2, h) {\n    if (h < 0) {\n        h += 1;\n    }\n    else if (h > 1) {\n        h -= 1;\n    }\n    if (h * 6 < 1) {\n        return m1 + (m2 - m1) * h * 6;\n    }\n    if (h * 2 < 1) {\n        return m2;\n    }\n    if (h * 3 < 2) {\n        return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n    }\n    return m1;\n}\nfunction lerpNumber(a, b, p) {\n    return a + (b - a) * p;\n}\nfunction setRgba(out, r, g, b, a) {\n    out[0] = r;\n    out[1] = g;\n    out[2] = b;\n    out[3] = a;\n    return out;\n}\nfunction copyRgba(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nvar colorCache = new LRU(20);\nvar lastRemovedArr = null;\nfunction putToCache(colorStr, rgbaArr) {\n    if (lastRemovedArr) {\n        copyRgba(lastRemovedArr, rgbaArr);\n    }\n    lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice()));\n}\nexport function parse(colorStr, rgbaArr) {\n    if (!colorStr) {\n        return;\n    }\n    rgbaArr = rgbaArr || [];\n    var cached = colorCache.get(colorStr);\n    if (cached) {\n        return copyRgba(rgbaArr, cached);\n    }\n    colorStr = colorStr + '';\n    var str = colorStr.replace(/ /g, '').toLowerCase();\n    if (str in kCSSColorTable) {\n        copyRgba(rgbaArr, kCSSColorTable[str]);\n        putToCache(colorStr, rgbaArr);\n        return rgbaArr;\n    }\n    var strLen = str.length;\n    if (str.charAt(0) === '#') {\n        if (strLen === 4 || strLen === 5) {\n            var iv = parseInt(str.slice(1, 4), 16);\n            if (!(iv >= 0 && iv <= 0xfff)) {\n                setRgba(rgbaArr, 0, 0, 0, 1);\n                return;\n            }\n            setRgba(rgbaArr, ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), (iv & 0xf0) | ((iv & 0xf0) >> 4), (iv & 0xf) | ((iv & 0xf) << 4), strLen === 5 ? parseInt(str.slice(4), 16) / 0xf : 1);\n            putToCache(colorStr, rgbaArr);\n            return rgbaArr;\n        }\n        else if (strLen === 7 || strLen === 9) {\n            var iv = parseInt(str.slice(1, 7), 16);\n            if (!(iv >= 0 && iv <= 0xffffff)) {\n                setRgba(rgbaArr, 0, 0, 0, 1);\n                return;\n            }\n            setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, strLen === 9 ? parseInt(str.slice(7), 16) / 0xff : 1);\n            putToCache(colorStr, rgbaArr);\n            return rgbaArr;\n        }\n        return;\n    }\n    var op = str.indexOf('(');\n    var ep = str.indexOf(')');\n    if (op !== -1 && ep + 1 === strLen) {\n        var fname = str.substr(0, op);\n        var params = str.substr(op + 1, ep - (op + 1)).split(',');\n        var alpha = 1;\n        switch (fname) {\n            case 'rgba':\n                if (params.length !== 4) {\n                    return params.length === 3\n                        ? setRgba(rgbaArr, +params[0], +params[1], +params[2], 1)\n                        : setRgba(rgbaArr, 0, 0, 0, 1);\n                }\n                alpha = parseCssFloat(params.pop());\n            case 'rgb':\n                if (params.length >= 3) {\n                    setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), params.length === 3 ? alpha : parseCssFloat(params[3]));\n                    putToCache(colorStr, rgbaArr);\n                    return rgbaArr;\n                }\n                else {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n            case 'hsla':\n                if (params.length !== 4) {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n                params[3] = parseCssFloat(params[3]);\n                hsla2rgba(params, rgbaArr);\n                putToCache(colorStr, rgbaArr);\n                return rgbaArr;\n            case 'hsl':\n                if (params.length !== 3) {\n                    setRgba(rgbaArr, 0, 0, 0, 1);\n                    return;\n                }\n                hsla2rgba(params, rgbaArr);\n                putToCache(colorStr, rgbaArr);\n                return rgbaArr;\n            default:\n                return;\n        }\n    }\n    setRgba(rgbaArr, 0, 0, 0, 1);\n    return;\n}\nfunction hsla2rgba(hsla, rgba) {\n    var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360;\n    var s = parseCssFloat(hsla[1]);\n    var l = parseCssFloat(hsla[2]);\n    var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n    var m1 = l * 2 - m2;\n    rgba = rgba || [];\n    setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1);\n    if (hsla.length === 4) {\n        rgba[3] = hsla[3];\n    }\n    return rgba;\n}\nfunction rgba2hsla(rgba) {\n    if (!rgba) {\n        return;\n    }\n    var R = rgba[0] / 255;\n    var G = rgba[1] / 255;\n    var B = rgba[2] / 255;\n    var vMin = Math.min(R, G, B);\n    var vMax = Math.max(R, G, B);\n    var delta = vMax - vMin;\n    var L = (vMax + vMin) / 2;\n    var H;\n    var S;\n    if (delta === 0) {\n        H = 0;\n        S = 0;\n    }\n    else {\n        if (L < 0.5) {\n            S = delta / (vMax + vMin);\n        }\n        else {\n            S = delta / (2 - vMax - vMin);\n        }\n        var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta;\n        var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta;\n        var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta;\n        if (R === vMax) {\n            H = deltaB - deltaG;\n        }\n        else if (G === vMax) {\n            H = (1 / 3) + deltaR - deltaB;\n        }\n        else if (B === vMax) {\n            H = (2 / 3) + deltaG - deltaR;\n        }\n        if (H < 0) {\n            H += 1;\n        }\n        if (H > 1) {\n            H -= 1;\n        }\n    }\n    var hsla = [H * 360, S, L];\n    if (rgba[3] != null) {\n        hsla.push(rgba[3]);\n    }\n    return hsla;\n}\nexport function lift(color, level) {\n    var colorArr = parse(color);\n    if (colorArr) {\n        for (var i = 0; i < 3; i++) {\n            if (level < 0) {\n                colorArr[i] = colorArr[i] * (1 - level) | 0;\n            }\n            else {\n                colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0;\n            }\n            if (colorArr[i] > 255) {\n                colorArr[i] = 255;\n            }\n            else if (colorArr[i] < 0) {\n                colorArr[i] = 0;\n            }\n        }\n        return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb');\n    }\n}\nexport function toHex(color) {\n    var colorArr = parse(color);\n    if (colorArr) {\n        return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1);\n    }\n}\nexport function fastLerp(normalizedValue, colors, out) {\n    if (!(colors && colors.length)\n        || !(normalizedValue >= 0 && normalizedValue <= 1)) {\n        return;\n    }\n    out = out || [];\n    var value = normalizedValue * (colors.length - 1);\n    var leftIndex = Math.floor(value);\n    var rightIndex = Math.ceil(value);\n    var leftColor = colors[leftIndex];\n    var rightColor = colors[rightIndex];\n    var dv = value - leftIndex;\n    out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv));\n    out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv));\n    out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv));\n    out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv));\n    return out;\n}\nexport var fastMapToColor = fastLerp;\nexport function lerp(normalizedValue, colors, fullOutput) {\n    if (!(colors && colors.length)\n        || !(normalizedValue >= 0 && normalizedValue <= 1)) {\n        return;\n    }\n    var value = normalizedValue * (colors.length - 1);\n    var leftIndex = Math.floor(value);\n    var rightIndex = Math.ceil(value);\n    var leftColor = parse(colors[leftIndex]);\n    var rightColor = parse(colors[rightIndex]);\n    var dv = value - leftIndex;\n    var color = stringify([\n        clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)),\n        clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)),\n        clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)),\n        clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv))\n    ], 'rgba');\n    return fullOutput\n        ? {\n            color: color,\n            leftIndex: leftIndex,\n            rightIndex: rightIndex,\n            value: value\n        }\n        : color;\n}\nexport var mapToColor = lerp;\nexport function modifyHSL(color, h, s, l) {\n    var colorArr = parse(color);\n    if (color) {\n        colorArr = rgba2hsla(colorArr);\n        h != null && (colorArr[0] = clampCssAngle(isFunction(h) ? h(colorArr[0]) : h));\n        s != null && (colorArr[1] = parseCssFloat(isFunction(s) ? s(colorArr[1]) : s));\n        l != null && (colorArr[2] = parseCssFloat(isFunction(l) ? l(colorArr[2]) : l));\n        return stringify(hsla2rgba(colorArr), 'rgba');\n    }\n}\nexport function modifyAlpha(color, alpha) {\n    var colorArr = parse(color);\n    if (colorArr && alpha != null) {\n        colorArr[3] = clampCssFloat(alpha);\n        return stringify(colorArr, 'rgba');\n    }\n}\nexport function stringify(arrColor, type) {\n    if (!arrColor || !arrColor.length) {\n        return;\n    }\n    var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2];\n    if (type === 'rgba' || type === 'hsva' || type === 'hsla') {\n        colorStr += ',' + arrColor[3];\n    }\n    return type + '(' + colorStr + ')';\n}\nexport function lum(color, backgroundLum) {\n    var arr = parse(color);\n    return arr\n        ? (0.299 * arr[0] + 0.587 * arr[1] + 0.114 * arr[2]) * arr[3] / 255\n            + (1 - arr[3]) * backgroundLum\n        : 0;\n}\nexport function random() {\n    return stringify([\n        Math.round(Math.random() * 255),\n        Math.round(Math.random() * 255),\n        Math.round(Math.random() * 255)\n    ], 'rgb');\n}\nvar liftedColorCache = new LRU(100);\nexport function liftColor(color) {\n    if (isString(color)) {\n        var liftedColor = liftedColorCache.get(color);\n        if (!liftedColor) {\n            liftedColor = lift(color, -0.1);\n            liftedColorCache.put(color, liftedColor);\n        }\n        return liftedColor;\n    }\n    else if (isGradientObject(color)) {\n        var ret = extend({}, color);\n        ret.colorStops = map(color.colorStops, function (stop) { return ({\n            offset: stop.offset,\n            color: lift(stop.color, -0.1)\n        }); });\n        return ret;\n    }\n    return color;\n}\n", "import { RADIAN_TO_DEGREE, retrieve2, logError, isFunction } from '../core/util.js';\nimport { parse } from '../tool/color.js';\nimport env from '../core/env.js';\nvar mathRound = Math.round;\nexport function normalizeColor(color) {\n    var opacity;\n    if (!color || color === 'transparent') {\n        color = 'none';\n    }\n    else if (typeof color === 'string' && color.indexOf('rgba') > -1) {\n        var arr = parse(color);\n        if (arr) {\n            color = 'rgb(' + arr[0] + ',' + arr[1] + ',' + arr[2] + ')';\n            opacity = arr[3];\n        }\n    }\n    return {\n        color: color,\n        opacity: opacity == null ? 1 : opacity\n    };\n}\nvar EPSILON = 1e-4;\nexport function isAroundZero(transform) {\n    return transform < EPSILON && transform > -EPSILON;\n}\nexport function round3(transform) {\n    return mathRound(transform * 1e3) / 1e3;\n}\nexport function round4(transform) {\n    return mathRound(transform * 1e4) / 1e4;\n}\nexport function round1(transform) {\n    return mathRound(transform * 10) / 10;\n}\nexport function getMatrixStr(m) {\n    return 'matrix('\n        + round3(m[0]) + ','\n        + round3(m[1]) + ','\n        + round3(m[2]) + ','\n        + round3(m[3]) + ','\n        + round4(m[4]) + ','\n        + round4(m[5])\n        + ')';\n}\nexport var TEXT_ALIGN_TO_ANCHOR = {\n    left: 'start',\n    right: 'end',\n    center: 'middle',\n    middle: 'middle'\n};\nexport function adjustTextY(y, lineHeight, textBaseline) {\n    if (textBaseline === 'top') {\n        y += lineHeight / 2;\n    }\n    else if (textBaseline === 'bottom') {\n        y -= lineHeight / 2;\n    }\n    return y;\n}\nexport function hasShadow(style) {\n    return style\n        && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY);\n}\nexport function getShadowKey(displayable) {\n    var style = displayable.style;\n    var globalScale = displayable.getGlobalScale();\n    return [\n        style.shadowColor,\n        (style.shadowBlur || 0).toFixed(2),\n        (style.shadowOffsetX || 0).toFixed(2),\n        (style.shadowOffsetY || 0).toFixed(2),\n        globalScale[0],\n        globalScale[1]\n    ].join(',');\n}\nexport function getClipPathsKey(clipPaths) {\n    var key = [];\n    if (clipPaths) {\n        for (var i = 0; i < clipPaths.length; i++) {\n            var clipPath = clipPaths[i];\n            key.push(clipPath.id);\n        }\n    }\n    return key.join(',');\n}\nexport function isImagePattern(val) {\n    return val && (!!val.image);\n}\nexport function isSVGPattern(val) {\n    return val && (!!val.svgElement);\n}\nexport function isPattern(val) {\n    return isImagePattern(val) || isSVGPattern(val);\n}\nexport function isLinearGradient(val) {\n    return val.type === 'linear';\n}\nexport function isRadialGradient(val) {\n    return val.type === 'radial';\n}\nexport function isGradient(val) {\n    return val && (val.type === 'linear'\n        || val.type === 'radial');\n}\nexport function getIdURL(id) {\n    return \"url(#\" + id + \")\";\n}\nexport function getPathPrecision(el) {\n    var scale = el.getGlobalScale();\n    var size = Math.max(scale[0], scale[1]);\n    return Math.max(Math.ceil(Math.log(size) / Math.log(10)), 1);\n}\nexport function getSRTTransformString(transform) {\n    var x = transform.x || 0;\n    var y = transform.y || 0;\n    var rotation = (transform.rotation || 0) * RADIAN_TO_DEGREE;\n    var scaleX = retrieve2(transform.scaleX, 1);\n    var scaleY = retrieve2(transform.scaleY, 1);\n    var skewX = transform.skewX || 0;\n    var skewY = transform.skewY || 0;\n    var res = [];\n    if (x || y) {\n        res.push(\"translate(\" + x + \"px,\" + y + \"px)\");\n    }\n    if (rotation) {\n        res.push(\"rotate(\" + rotation + \")\");\n    }\n    if (scaleX !== 1 || scaleY !== 1) {\n        res.push(\"scale(\" + scaleX + \",\" + scaleY + \")\");\n    }\n    if (skewX || skewY) {\n        res.push(\"skew(\" + mathRound(skewX * RADIAN_TO_DEGREE) + \"deg, \" + mathRound(skewY * RADIAN_TO_DEGREE) + \"deg)\");\n    }\n    return res.join(' ');\n}\nexport var encodeBase64 = (function () {\n    if (env.hasGlobalWindow && isFunction(window.btoa)) {\n        return function (str) {\n            return window.btoa(unescape(encodeURIComponent(str)));\n        };\n    }\n    if (typeof Buffer !== 'undefined') {\n        return function (str) {\n            return Buffer.from(str).toString('base64');\n        };\n    }\n    return function (str) {\n        if (process.env.NODE_ENV !== 'production') {\n            logError('Base64 isn\\'t natively supported in the current environment.');\n        }\n        return null;\n    };\n})();\n", "import Clip from './Clip.js';\nimport * as color from '../tool/color.js';\nimport { eqNaN, extend, isArrayLike, isFunction, isGradientObject, isNumber, isString, keys, logError, map } from '../core/util.js';\nimport easingFuncs from './easing.js';\nimport { createCubicEasingFunc } from './cubicEasing.js';\nimport { isLinearGradient, isRadialGradient } from '../svg/helper.js';\n;\nvar arraySlice = Array.prototype.slice;\nfunction interpolateNumber(p0, p1, percent) {\n    return (p1 - p0) * percent + p0;\n}\nfunction interpolate1DArray(out, p0, p1, percent) {\n    var len = p0.length;\n    for (var i = 0; i < len; i++) {\n        out[i] = interpolateNumber(p0[i], p1[i], percent);\n    }\n    return out;\n}\nfunction interpolate2DArray(out, p0, p1, percent) {\n    var len = p0.length;\n    var len2 = len && p0[0].length;\n    for (var i = 0; i < len; i++) {\n        if (!out[i]) {\n            out[i] = [];\n        }\n        for (var j = 0; j < len2; j++) {\n            out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);\n        }\n    }\n    return out;\n}\nfunction add1DArray(out, p0, p1, sign) {\n    var len = p0.length;\n    for (var i = 0; i < len; i++) {\n        out[i] = p0[i] + p1[i] * sign;\n    }\n    return out;\n}\nfunction add2DArray(out, p0, p1, sign) {\n    var len = p0.length;\n    var len2 = len && p0[0].length;\n    for (var i = 0; i < len; i++) {\n        if (!out[i]) {\n            out[i] = [];\n        }\n        for (var j = 0; j < len2; j++) {\n            out[i][j] = p0[i][j] + p1[i][j] * sign;\n        }\n    }\n    return out;\n}\nfunction fillColorStops(val0, val1) {\n    var len0 = val0.length;\n    var len1 = val1.length;\n    var shorterArr = len0 > len1 ? val1 : val0;\n    var shorterLen = Math.min(len0, len1);\n    var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 };\n    for (var i = shorterLen; i < Math.max(len0, len1); i++) {\n        shorterArr.push({\n            offset: last.offset,\n            color: last.color.slice()\n        });\n    }\n}\nfunction fillArray(val0, val1, arrDim) {\n    var arr0 = val0;\n    var arr1 = val1;\n    if (!arr0.push || !arr1.push) {\n        return;\n    }\n    var arr0Len = arr0.length;\n    var arr1Len = arr1.length;\n    if (arr0Len !== arr1Len) {\n        var isPreviousLarger = arr0Len > arr1Len;\n        if (isPreviousLarger) {\n            arr0.length = arr1Len;\n        }\n        else {\n            for (var i = arr0Len; i < arr1Len; i++) {\n                arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]));\n            }\n        }\n    }\n    var len2 = arr0[0] && arr0[0].length;\n    for (var i = 0; i < arr0.length; i++) {\n        if (arrDim === 1) {\n            if (isNaN(arr0[i])) {\n                arr0[i] = arr1[i];\n            }\n        }\n        else {\n            for (var j = 0; j < len2; j++) {\n                if (isNaN(arr0[i][j])) {\n                    arr0[i][j] = arr1[i][j];\n                }\n            }\n        }\n    }\n}\nexport function cloneValue(value) {\n    if (isArrayLike(value)) {\n        var len = value.length;\n        if (isArrayLike(value[0])) {\n            var ret = [];\n            for (var i = 0; i < len; i++) {\n                ret.push(arraySlice.call(value[i]));\n            }\n            return ret;\n        }\n        return arraySlice.call(value);\n    }\n    return value;\n}\nfunction rgba2String(rgba) {\n    rgba[0] = Math.floor(rgba[0]) || 0;\n    rgba[1] = Math.floor(rgba[1]) || 0;\n    rgba[2] = Math.floor(rgba[2]) || 0;\n    rgba[3] = rgba[3] == null ? 1 : rgba[3];\n    return 'rgba(' + rgba.join(',') + ')';\n}\nfunction guessArrayDim(value) {\n    return isArrayLike(value && value[0]) ? 2 : 1;\n}\nvar VALUE_TYPE_NUMBER = 0;\nvar VALUE_TYPE_1D_ARRAY = 1;\nvar VALUE_TYPE_2D_ARRAY = 2;\nvar VALUE_TYPE_COLOR = 3;\nvar VALUE_TYPE_LINEAR_GRADIENT = 4;\nvar VALUE_TYPE_RADIAL_GRADIENT = 5;\nvar VALUE_TYPE_UNKOWN = 6;\nfunction isGradientValueType(valType) {\n    return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT;\n}\nfunction isArrayValueType(valType) {\n    return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY;\n}\nvar tmpRgba = [0, 0, 0, 0];\nvar Track = (function () {\n    function Track(propName) {\n        this.keyframes = [];\n        this.discrete = false;\n        this._invalid = false;\n        this._needsSort = false;\n        this._lastFr = 0;\n        this._lastFrP = 0;\n        this.propName = propName;\n    }\n    Track.prototype.isFinished = function () {\n        return this._finished;\n    };\n    Track.prototype.setFinished = function () {\n        this._finished = true;\n        if (this._additiveTrack) {\n            this._additiveTrack.setFinished();\n        }\n    };\n    Track.prototype.needsAnimate = function () {\n        return this.keyframes.length >= 1;\n    };\n    Track.prototype.getAdditiveTrack = function () {\n        return this._additiveTrack;\n    };\n    Track.prototype.addKeyframe = function (time, rawValue, easing) {\n        this._needsSort = true;\n        var keyframes = this.keyframes;\n        var len = keyframes.length;\n        var discrete = false;\n        var valType = VALUE_TYPE_UNKOWN;\n        var value = rawValue;\n        if (isArrayLike(rawValue)) {\n            var arrayDim = guessArrayDim(rawValue);\n            valType = arrayDim;\n            if (arrayDim === 1 && !isNumber(rawValue[0])\n                || arrayDim === 2 && !isNumber(rawValue[0][0])) {\n                discrete = true;\n            }\n        }\n        else {\n            if (isNumber(rawValue) && !eqNaN(rawValue)) {\n                valType = VALUE_TYPE_NUMBER;\n            }\n            else if (isString(rawValue)) {\n                if (!isNaN(+rawValue)) {\n                    valType = VALUE_TYPE_NUMBER;\n                }\n                else {\n                    var colorArray = color.parse(rawValue);\n                    if (colorArray) {\n                        value = colorArray;\n                        valType = VALUE_TYPE_COLOR;\n                    }\n                }\n            }\n            else if (isGradientObject(rawValue)) {\n                var parsedGradient = extend({}, value);\n                parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { return ({\n                    offset: colorStop.offset,\n                    color: color.parse(colorStop.color)\n                }); });\n                if (isLinearGradient(rawValue)) {\n                    valType = VALUE_TYPE_LINEAR_GRADIENT;\n                }\n                else if (isRadialGradient(rawValue)) {\n                    valType = VALUE_TYPE_RADIAL_GRADIENT;\n                }\n                value = parsedGradient;\n            }\n        }\n        if (len === 0) {\n            this.valType = valType;\n        }\n        else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) {\n            discrete = true;\n        }\n        this.discrete = this.discrete || discrete;\n        var kf = {\n            time: time,\n            value: value,\n            rawValue: rawValue,\n            percent: 0\n        };\n        if (easing) {\n            kf.easing = easing;\n            kf.easingFunc = isFunction(easing)\n                ? easing\n                : easingFuncs[easing] || createCubicEasingFunc(easing);\n        }\n        keyframes.push(kf);\n        return kf;\n    };\n    Track.prototype.prepare = function (maxTime, additiveTrack) {\n        var kfs = this.keyframes;\n        if (this._needsSort) {\n            kfs.sort(function (a, b) {\n                return a.time - b.time;\n            });\n        }\n        var valType = this.valType;\n        var kfsLen = kfs.length;\n        var lastKf = kfs[kfsLen - 1];\n        var isDiscrete = this.discrete;\n        var isArr = isArrayValueType(valType);\n        var isGradient = isGradientValueType(valType);\n        for (var i = 0; i < kfsLen; i++) {\n            var kf = kfs[i];\n            var value = kf.value;\n            var lastValue = lastKf.value;\n            kf.percent = kf.time / maxTime;\n            if (!isDiscrete) {\n                if (isArr && i !== kfsLen - 1) {\n                    fillArray(value, lastValue, valType);\n                }\n                else if (isGradient) {\n                    fillColorStops(value.colorStops, lastValue.colorStops);\n                }\n            }\n        }\n        if (!isDiscrete\n            && valType !== VALUE_TYPE_RADIAL_GRADIENT\n            && additiveTrack\n            && this.needsAnimate()\n            && additiveTrack.needsAnimate()\n            && valType === additiveTrack.valType\n            && !additiveTrack._finished) {\n            this._additiveTrack = additiveTrack;\n            var startValue = kfs[0].value;\n            for (var i = 0; i < kfsLen; i++) {\n                if (valType === VALUE_TYPE_NUMBER) {\n                    kfs[i].additiveValue = kfs[i].value - startValue;\n                }\n                else if (valType === VALUE_TYPE_COLOR) {\n                    kfs[i].additiveValue =\n                        add1DArray([], kfs[i].value, startValue, -1);\n                }\n                else if (isArrayValueType(valType)) {\n                    kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY\n                        ? add1DArray([], kfs[i].value, startValue, -1)\n                        : add2DArray([], kfs[i].value, startValue, -1);\n                }\n            }\n        }\n    };\n    Track.prototype.step = function (target, percent) {\n        if (this._finished) {\n            return;\n        }\n        if (this._additiveTrack && this._additiveTrack._finished) {\n            this._additiveTrack = null;\n        }\n        var isAdditive = this._additiveTrack != null;\n        var valueKey = isAdditive ? 'additiveValue' : 'value';\n        var valType = this.valType;\n        var keyframes = this.keyframes;\n        var kfsNum = keyframes.length;\n        var propName = this.propName;\n        var isValueColor = valType === VALUE_TYPE_COLOR;\n        var frameIdx;\n        var lastFrame = this._lastFr;\n        var mathMin = Math.min;\n        var frame;\n        var nextFrame;\n        if (kfsNum === 1) {\n            frame = nextFrame = keyframes[0];\n        }\n        else {\n            if (percent < 0) {\n                frameIdx = 0;\n            }\n            else if (percent < this._lastFrP) {\n                var start = mathMin(lastFrame + 1, kfsNum - 1);\n                for (frameIdx = start; frameIdx >= 0; frameIdx--) {\n                    if (keyframes[frameIdx].percent <= percent) {\n                        break;\n                    }\n                }\n                frameIdx = mathMin(frameIdx, kfsNum - 2);\n            }\n            else {\n                for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) {\n                    if (keyframes[frameIdx].percent > percent) {\n                        break;\n                    }\n                }\n                frameIdx = mathMin(frameIdx - 1, kfsNum - 2);\n            }\n            nextFrame = keyframes[frameIdx + 1];\n            frame = keyframes[frameIdx];\n        }\n        if (!(frame && nextFrame)) {\n            return;\n        }\n        this._lastFr = frameIdx;\n        this._lastFrP = percent;\n        var interval = (nextFrame.percent - frame.percent);\n        var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1);\n        if (nextFrame.easingFunc) {\n            w = nextFrame.easingFunc(w);\n        }\n        var targetArr = isAdditive ? this._additiveValue\n            : (isValueColor ? tmpRgba : target[propName]);\n        if ((isArrayValueType(valType) || isValueColor) && !targetArr) {\n            targetArr = this._additiveValue = [];\n        }\n        if (this.discrete) {\n            target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue;\n        }\n        else if (isArrayValueType(valType)) {\n            valType === VALUE_TYPE_1D_ARRAY\n                ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w)\n                : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w);\n        }\n        else if (isGradientValueType(valType)) {\n            var val = frame[valueKey];\n            var nextVal_1 = nextFrame[valueKey];\n            var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT;\n            target[propName] = {\n                type: isLinearGradient_1 ? 'linear' : 'radial',\n                x: interpolateNumber(val.x, nextVal_1.x, w),\n                y: interpolateNumber(val.y, nextVal_1.y, w),\n                colorStops: map(val.colorStops, function (colorStop, idx) {\n                    var nextColorStop = nextVal_1.colorStops[idx];\n                    return {\n                        offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w),\n                        color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w))\n                    };\n                }),\n                global: nextVal_1.global\n            };\n            if (isLinearGradient_1) {\n                target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w);\n                target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w);\n            }\n            else {\n                target[propName].r = interpolateNumber(val.r, nextVal_1.r, w);\n            }\n        }\n        else if (isValueColor) {\n            interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w);\n            if (!isAdditive) {\n                target[propName] = rgba2String(targetArr);\n            }\n        }\n        else {\n            var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w);\n            if (isAdditive) {\n                this._additiveValue = value;\n            }\n            else {\n                target[propName] = value;\n            }\n        }\n        if (isAdditive) {\n            this._addToTarget(target);\n        }\n    };\n    Track.prototype._addToTarget = function (target) {\n        var valType = this.valType;\n        var propName = this.propName;\n        var additiveValue = this._additiveValue;\n        if (valType === VALUE_TYPE_NUMBER) {\n            target[propName] = target[propName] + additiveValue;\n        }\n        else if (valType === VALUE_TYPE_COLOR) {\n            color.parse(target[propName], tmpRgba);\n            add1DArray(tmpRgba, tmpRgba, additiveValue, 1);\n            target[propName] = rgba2String(tmpRgba);\n        }\n        else if (valType === VALUE_TYPE_1D_ARRAY) {\n            add1DArray(target[propName], target[propName], additiveValue, 1);\n        }\n        else if (valType === VALUE_TYPE_2D_ARRAY) {\n            add2DArray(target[propName], target[propName], additiveValue, 1);\n        }\n    };\n    return Track;\n}());\nvar Animator = (function () {\n    function Animator(target, loop, allowDiscreteAnimation, additiveTo) {\n        this._tracks = {};\n        this._trackKeys = [];\n        this._maxTime = 0;\n        this._started = 0;\n        this._clip = null;\n        this._target = target;\n        this._loop = loop;\n        if (loop && additiveTo) {\n            logError('Can\\' use additive animation on looped animation.');\n            return;\n        }\n        this._additiveAnimators = additiveTo;\n        this._allowDiscrete = allowDiscreteAnimation;\n    }\n    Animator.prototype.getMaxTime = function () {\n        return this._maxTime;\n    };\n    Animator.prototype.getDelay = function () {\n        return this._delay;\n    };\n    Animator.prototype.getLoop = function () {\n        return this._loop;\n    };\n    Animator.prototype.getTarget = function () {\n        return this._target;\n    };\n    Animator.prototype.changeTarget = function (target) {\n        this._target = target;\n    };\n    Animator.prototype.when = function (time, props, easing) {\n        return this.whenWithKeys(time, props, keys(props), easing);\n    };\n    Animator.prototype.whenWithKeys = function (time, props, propNames, easing) {\n        var tracks = this._tracks;\n        for (var i = 0; i < propNames.length; i++) {\n            var propName = propNames[i];\n            var track = tracks[propName];\n            if (!track) {\n                track = tracks[propName] = new Track(propName);\n                var initialValue = void 0;\n                var additiveTrack = this._getAdditiveTrack(propName);\n                if (additiveTrack) {\n                    var addtiveTrackKfs = additiveTrack.keyframes;\n                    var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1];\n                    initialValue = lastFinalKf && lastFinalKf.value;\n                    if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) {\n                        initialValue = rgba2String(initialValue);\n                    }\n                }\n                else {\n                    initialValue = this._target[propName];\n                }\n                if (initialValue == null) {\n                    continue;\n                }\n                if (time > 0) {\n                    track.addKeyframe(0, cloneValue(initialValue), easing);\n                }\n                this._trackKeys.push(propName);\n            }\n            track.addKeyframe(time, cloneValue(props[propName]), easing);\n        }\n        this._maxTime = Math.max(this._maxTime, time);\n        return this;\n    };\n    Animator.prototype.pause = function () {\n        this._clip.pause();\n        this._paused = true;\n    };\n    Animator.prototype.resume = function () {\n        this._clip.resume();\n        this._paused = false;\n    };\n    Animator.prototype.isPaused = function () {\n        return !!this._paused;\n    };\n    Animator.prototype.duration = function (duration) {\n        this._maxTime = duration;\n        this._force = true;\n        return this;\n    };\n    Animator.prototype._doneCallback = function () {\n        this._setTracksFinished();\n        this._clip = null;\n        var doneList = this._doneCbs;\n        if (doneList) {\n            var len = doneList.length;\n            for (var i = 0; i < len; i++) {\n                doneList[i].call(this);\n            }\n        }\n    };\n    Animator.prototype._abortedCallback = function () {\n        this._setTracksFinished();\n        var animation = this.animation;\n        var abortedList = this._abortedCbs;\n        if (animation) {\n            animation.removeClip(this._clip);\n        }\n        this._clip = null;\n        if (abortedList) {\n            for (var i = 0; i < abortedList.length; i++) {\n                abortedList[i].call(this);\n            }\n        }\n    };\n    Animator.prototype._setTracksFinished = function () {\n        var tracks = this._tracks;\n        var tracksKeys = this._trackKeys;\n        for (var i = 0; i < tracksKeys.length; i++) {\n            tracks[tracksKeys[i]].setFinished();\n        }\n    };\n    Animator.prototype._getAdditiveTrack = function (trackName) {\n        var additiveTrack;\n        var additiveAnimators = this._additiveAnimators;\n        if (additiveAnimators) {\n            for (var i = 0; i < additiveAnimators.length; i++) {\n                var track = additiveAnimators[i].getTrack(trackName);\n                if (track) {\n                    additiveTrack = track;\n                }\n            }\n        }\n        return additiveTrack;\n    };\n    Animator.prototype.start = function (easing) {\n        if (this._started > 0) {\n            return;\n        }\n        this._started = 1;\n        var self = this;\n        var tracks = [];\n        var maxTime = this._maxTime || 0;\n        for (var i = 0; i < this._trackKeys.length; i++) {\n            var propName = this._trackKeys[i];\n            var track = this._tracks[propName];\n            var additiveTrack = this._getAdditiveTrack(propName);\n            var kfs = track.keyframes;\n            var kfsNum = kfs.length;\n            track.prepare(maxTime, additiveTrack);\n            if (track.needsAnimate()) {\n                if (!this._allowDiscrete && track.discrete) {\n                    var lastKf = kfs[kfsNum - 1];\n                    if (lastKf) {\n                        self._target[track.propName] = lastKf.rawValue;\n                    }\n                    track.setFinished();\n                }\n                else {\n                    tracks.push(track);\n                }\n            }\n        }\n        if (tracks.length || this._force) {\n            var clip = new Clip({\n                life: maxTime,\n                loop: this._loop,\n                delay: this._delay || 0,\n                onframe: function (percent) {\n                    self._started = 2;\n                    var additiveAnimators = self._additiveAnimators;\n                    if (additiveAnimators) {\n                        var stillHasAdditiveAnimator = false;\n                        for (var i = 0; i < additiveAnimators.length; i++) {\n                            if (additiveAnimators[i]._clip) {\n                                stillHasAdditiveAnimator = true;\n                                break;\n                            }\n                        }\n                        if (!stillHasAdditiveAnimator) {\n                            self._additiveAnimators = null;\n                        }\n                    }\n                    for (var i = 0; i < tracks.length; i++) {\n                        tracks[i].step(self._target, percent);\n                    }\n                    var onframeList = self._onframeCbs;\n                    if (onframeList) {\n                        for (var i = 0; i < onframeList.length; i++) {\n                            onframeList[i](self._target, percent);\n                        }\n                    }\n                },\n                ondestroy: function () {\n                    self._doneCallback();\n                }\n            });\n            this._clip = clip;\n            if (this.animation) {\n                this.animation.addClip(clip);\n            }\n            if (easing) {\n                clip.setEasing(easing);\n            }\n        }\n        else {\n            this._doneCallback();\n        }\n        return this;\n    };\n    Animator.prototype.stop = function (forwardToLast) {\n        if (!this._clip) {\n            return;\n        }\n        var clip = this._clip;\n        if (forwardToLast) {\n            clip.onframe(1);\n        }\n        this._abortedCallback();\n    };\n    Animator.prototype.delay = function (time) {\n        this._delay = time;\n        return this;\n    };\n    Animator.prototype.during = function (cb) {\n        if (cb) {\n            if (!this._onframeCbs) {\n                this._onframeCbs = [];\n            }\n            this._onframeCbs.push(cb);\n        }\n        return this;\n    };\n    Animator.prototype.done = function (cb) {\n        if (cb) {\n            if (!this._doneCbs) {\n                this._doneCbs = [];\n            }\n            this._doneCbs.push(cb);\n        }\n        return this;\n    };\n    Animator.prototype.aborted = function (cb) {\n        if (cb) {\n            if (!this._abortedCbs) {\n                this._abortedCbs = [];\n            }\n            this._abortedCbs.push(cb);\n        }\n        return this;\n    };\n    Animator.prototype.getClip = function () {\n        return this._clip;\n    };\n    Animator.prototype.getTrack = function (propName) {\n        return this._tracks[propName];\n    };\n    Animator.prototype.getTracks = function () {\n        var _this = this;\n        return map(this._trackKeys, function (key) { return _this._tracks[key]; });\n    };\n    Animator.prototype.stopTracks = function (propNames, forwardToLast) {\n        if (!propNames.length || !this._clip) {\n            return true;\n        }\n        var tracks = this._tracks;\n        var tracksKeys = this._trackKeys;\n        for (var i = 0; i < propNames.length; i++) {\n            var track = tracks[propNames[i]];\n            if (track && !track.isFinished()) {\n                if (forwardToLast) {\n                    track.step(this._target, 1);\n                }\n                else if (this._started === 1) {\n                    track.step(this._target, 0);\n                }\n                track.setFinished();\n            }\n        }\n        var allAborted = true;\n        for (var i = 0; i < tracksKeys.length; i++) {\n            if (!tracks[tracksKeys[i]].isFinished()) {\n                allAborted = false;\n                break;\n            }\n        }\n        if (allAborted) {\n            this._abortedCallback();\n        }\n        return allAborted;\n    };\n    Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) {\n        if (!target) {\n            return;\n        }\n        trackKeys = trackKeys || this._trackKeys;\n        for (var i = 0; i < trackKeys.length; i++) {\n            var propName = trackKeys[i];\n            var track = this._tracks[propName];\n            if (!track || track.isFinished()) {\n                continue;\n            }\n            var kfs = track.keyframes;\n            var kf = kfs[firstOrLast ? 0 : kfs.length - 1];\n            if (kf) {\n                target[propName] = cloneValue(kf.rawValue);\n            }\n        }\n    };\n    Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) {\n        trackKeys = trackKeys || keys(finalProps);\n        for (var i = 0; i < trackKeys.length; i++) {\n            var propName = trackKeys[i];\n            var track = this._tracks[propName];\n            if (!track) {\n                continue;\n            }\n            var kfs = track.keyframes;\n            if (kfs.length > 1) {\n                var lastKf = kfs.pop();\n                track.addKeyframe(lastKf.time, finalProps[propName]);\n                track.prepare(this._maxTime, track.getAdditiveTrack());\n            }\n        }\n    };\n    return Animator;\n}());\nexport default Animator;\n", "import { __extends } from \"tslib\";\nimport Eventful from '../core/Eventful.js';\nimport requestAnimationFrame from './requestAnimationFrame.js';\nimport Animator from './Animator.js';\nexport function getTime() {\n    return new Date().getTime();\n}\nvar Animation = (function (_super) {\n    __extends(Animation, _super);\n    function Animation(opts) {\n        var _this = _super.call(this) || this;\n        _this._running = false;\n        _this._time = 0;\n        _this._pausedTime = 0;\n        _this._pauseStart = 0;\n        _this._paused = false;\n        opts = opts || {};\n        _this.stage = opts.stage || {};\n        return _this;\n    }\n    Animation.prototype.addClip = function (clip) {\n        if (clip.animation) {\n            this.removeClip(clip);\n        }\n        if (!this._head) {\n            this._head = this._tail = clip;\n        }\n        else {\n            this._tail.next = clip;\n            clip.prev = this._tail;\n            clip.next = null;\n            this._tail = clip;\n        }\n        clip.animation = this;\n    };\n    Animation.prototype.addAnimator = function (animator) {\n        animator.animation = this;\n        var clip = animator.getClip();\n        if (clip) {\n            this.addClip(clip);\n        }\n    };\n    Animation.prototype.removeClip = function (clip) {\n        if (!clip.animation) {\n            return;\n        }\n        var prev = clip.prev;\n        var next = clip.next;\n        if (prev) {\n            prev.next = next;\n        }\n        else {\n            this._head = next;\n        }\n        if (next) {\n            next.prev = prev;\n        }\n        else {\n            this._tail = prev;\n        }\n        clip.next = clip.prev = clip.animation = null;\n    };\n    Animation.prototype.removeAnimator = function (animator) {\n        var clip = animator.getClip();\n        if (clip) {\n            this.removeClip(clip);\n        }\n        animator.animation = null;\n    };\n    Animation.prototype.update = function (notTriggerFrameAndStageUpdate) {\n        var time = getTime() - this._pausedTime;\n        var delta = time - this._time;\n        var clip = this._head;\n        while (clip) {\n            var nextClip = clip.next;\n            var finished = clip.step(time, delta);\n            if (finished) {\n                clip.ondestroy();\n                this.removeClip(clip);\n                clip = nextClip;\n            }\n            else {\n                clip = nextClip;\n            }\n        }\n        this._time = time;\n        if (!notTriggerFrameAndStageUpdate) {\n            this.trigger('frame', delta);\n            this.stage.update && this.stage.update();\n        }\n    };\n    Animation.prototype._startLoop = function () {\n        var self = this;\n        this._running = true;\n        function step() {\n            if (self._running) {\n                requestAnimationFrame(step);\n                !self._paused && self.update();\n            }\n        }\n        requestAnimationFrame(step);\n    };\n    Animation.prototype.start = function () {\n        if (this._running) {\n            return;\n        }\n        this._time = getTime();\n        this._pausedTime = 0;\n        this._startLoop();\n    };\n    Animation.prototype.stop = function () {\n        this._running = false;\n    };\n    Animation.prototype.pause = function () {\n        if (!this._paused) {\n            this._pauseStart = getTime();\n            this._paused = true;\n        }\n    };\n    Animation.prototype.resume = function () {\n        if (this._paused) {\n            this._pausedTime += getTime() - this._pauseStart;\n            this._paused = false;\n        }\n    };\n    Animation.prototype.clear = function () {\n        var clip = this._head;\n        while (clip) {\n            var nextClip = clip.next;\n            clip.prev = clip.next = clip.animation = null;\n            clip = nextClip;\n        }\n        this._head = this._tail = null;\n    };\n    Animation.prototype.isFinished = function () {\n        return this._head == null;\n    };\n    Animation.prototype.animate = function (target, options) {\n        options = options || {};\n        this.start();\n        var animator = new Animator(target, options.loop);\n        this.addAnimator(animator);\n        return animator;\n    };\n    return Animation;\n}(Eventful));\nexport default Animation;\n", "import { __extends } from \"tslib\";\nimport { addEventListener, removeEventListener, normalizeEvent, getNativeEvent } from '../core/event.js';\nimport * as zrUtil from '../core/util.js';\nimport Eventful from '../core/Eventful.js';\nimport env from '../core/env.js';\nvar TOUCH_CLICK_DELAY = 300;\nvar globalEventSupported = env.domSupported;\nvar localNativeListenerNames = (function () {\n    var mouseHandlerNames = [\n        'click', 'dblclick', 'mousewheel', 'wheel', 'mouseout',\n        'mouseup', 'mousedown', 'mousemove', 'contextmenu'\n    ];\n    var touchHandlerNames = [\n        'touchstart', 'touchend', 'touchmove'\n    ];\n    var pointerEventNameMap = {\n        pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1\n    };\n    var pointerHandlerNames = zrUtil.map(mouseHandlerNames, function (name) {\n        var nm = name.replace('mouse', 'pointer');\n        return pointerEventNameMap.hasOwnProperty(nm) ? nm : name;\n    });\n    return {\n        mouse: mouseHandlerNames,\n        touch: touchHandlerNames,\n        pointer: pointerHandlerNames\n    };\n})();\nvar globalNativeListenerNames = {\n    mouse: ['mousemove', 'mouseup'],\n    pointer: ['pointermove', 'pointerup']\n};\nvar wheelEventSupported = false;\nfunction isPointerFromTouch(event) {\n    var pointerType = event.pointerType;\n    return pointerType === 'pen' || pointerType === 'touch';\n}\nfunction setTouchTimer(scope) {\n    scope.touching = true;\n    if (scope.touchTimer != null) {\n        clearTimeout(scope.touchTimer);\n        scope.touchTimer = null;\n    }\n    scope.touchTimer = setTimeout(function () {\n        scope.touching = false;\n        scope.touchTimer = null;\n    }, 700);\n}\nfunction markTouch(event) {\n    event && (event.zrByTouch = true);\n}\nfunction normalizeGlobalEvent(instance, event) {\n    return normalizeEvent(instance.dom, new FakeGlobalEvent(instance, event), true);\n}\nfunction isLocalEl(instance, el) {\n    var elTmp = el;\n    var isLocal = false;\n    while (elTmp && elTmp.nodeType !== 9\n        && !(isLocal = elTmp.domBelongToZr\n            || (elTmp !== el && elTmp === instance.painterRoot))) {\n        elTmp = elTmp.parentNode;\n    }\n    return isLocal;\n}\nvar FakeGlobalEvent = (function () {\n    function FakeGlobalEvent(instance, event) {\n        this.stopPropagation = zrUtil.noop;\n        this.stopImmediatePropagation = zrUtil.noop;\n        this.preventDefault = zrUtil.noop;\n        this.type = event.type;\n        this.target = this.currentTarget = instance.dom;\n        this.pointerType = event.pointerType;\n        this.clientX = event.clientX;\n        this.clientY = event.clientY;\n    }\n    return FakeGlobalEvent;\n}());\nvar localDOMHandlers = {\n    mousedown: function (event) {\n        event = normalizeEvent(this.dom, event);\n        this.__mayPointerCapture = [event.zrX, event.zrY];\n        this.trigger('mousedown', event);\n    },\n    mousemove: function (event) {\n        event = normalizeEvent(this.dom, event);\n        var downPoint = this.__mayPointerCapture;\n        if (downPoint && (event.zrX !== downPoint[0] || event.zrY !== downPoint[1])) {\n            this.__togglePointerCapture(true);\n        }\n        this.trigger('mousemove', event);\n    },\n    mouseup: function (event) {\n        event = normalizeEvent(this.dom, event);\n        this.__togglePointerCapture(false);\n        this.trigger('mouseup', event);\n    },\n    mouseout: function (event) {\n        event = normalizeEvent(this.dom, event);\n        var element = event.toElement || event.relatedTarget;\n        if (!isLocalEl(this, element)) {\n            if (this.__pointerCapturing) {\n                event.zrEventControl = 'no_globalout';\n            }\n            this.trigger('mouseout', event);\n        }\n    },\n    wheel: function (event) {\n        wheelEventSupported = true;\n        event = normalizeEvent(this.dom, event);\n        this.trigger('mousewheel', event);\n    },\n    mousewheel: function (event) {\n        if (wheelEventSupported) {\n            return;\n        }\n        event = normalizeEvent(this.dom, event);\n        this.trigger('mousewheel', event);\n    },\n    touchstart: function (event) {\n        event = normalizeEvent(this.dom, event);\n        markTouch(event);\n        this.__lastTouchMoment = new Date();\n        this.handler.processGesture(event, 'start');\n        localDOMHandlers.mousemove.call(this, event);\n        localDOMHandlers.mousedown.call(this, event);\n    },\n    touchmove: function (event) {\n        event = normalizeEvent(this.dom, event);\n        markTouch(event);\n        this.handler.processGesture(event, 'change');\n        localDOMHandlers.mousemove.call(this, event);\n    },\n    touchend: function (event) {\n        event = normalizeEvent(this.dom, event);\n        markTouch(event);\n        this.handler.processGesture(event, 'end');\n        localDOMHandlers.mouseup.call(this, event);\n        if (+new Date() - (+this.__lastTouchMoment) < TOUCH_CLICK_DELAY) {\n            localDOMHandlers.click.call(this, event);\n        }\n    },\n    pointerdown: function (event) {\n        localDOMHandlers.mousedown.call(this, event);\n    },\n    pointermove: function (event) {\n        if (!isPointerFromTouch(event)) {\n            localDOMHandlers.mousemove.call(this, event);\n        }\n    },\n    pointerup: function (event) {\n        localDOMHandlers.mouseup.call(this, event);\n    },\n    pointerout: function (event) {\n        if (!isPointerFromTouch(event)) {\n            localDOMHandlers.mouseout.call(this, event);\n        }\n    }\n};\nzrUtil.each(['click', 'dblclick', 'contextmenu'], function (name) {\n    localDOMHandlers[name] = function (event) {\n        event = normalizeEvent(this.dom, event);\n        this.trigger(name, event);\n    };\n});\nvar globalDOMHandlers = {\n    pointermove: function (event) {\n        if (!isPointerFromTouch(event)) {\n            globalDOMHandlers.mousemove.call(this, event);\n        }\n    },\n    pointerup: function (event) {\n        globalDOMHandlers.mouseup.call(this, event);\n    },\n    mousemove: function (event) {\n        this.trigger('mousemove', event);\n    },\n    mouseup: function (event) {\n        var pointerCaptureReleasing = this.__pointerCapturing;\n        this.__togglePointerCapture(false);\n        this.trigger('mouseup', event);\n        if (pointerCaptureReleasing) {\n            event.zrEventControl = 'only_globalout';\n            this.trigger('mouseout', event);\n        }\n    }\n};\nfunction mountLocalDOMEventListeners(instance, scope) {\n    var domHandlers = scope.domHandlers;\n    if (env.pointerEventsSupported) {\n        zrUtil.each(localNativeListenerNames.pointer, function (nativeEventName) {\n            mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n                domHandlers[nativeEventName].call(instance, event);\n            });\n        });\n    }\n    else {\n        if (env.touchEventsSupported) {\n            zrUtil.each(localNativeListenerNames.touch, function (nativeEventName) {\n                mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n                    domHandlers[nativeEventName].call(instance, event);\n                    setTouchTimer(scope);\n                });\n            });\n        }\n        zrUtil.each(localNativeListenerNames.mouse, function (nativeEventName) {\n            mountSingleDOMEventListener(scope, nativeEventName, function (event) {\n                event = getNativeEvent(event);\n                if (!scope.touching) {\n                    domHandlers[nativeEventName].call(instance, event);\n                }\n            });\n        });\n    }\n}\nfunction mountGlobalDOMEventListeners(instance, scope) {\n    if (env.pointerEventsSupported) {\n        zrUtil.each(globalNativeListenerNames.pointer, mount);\n    }\n    else if (!env.touchEventsSupported) {\n        zrUtil.each(globalNativeListenerNames.mouse, mount);\n    }\n    function mount(nativeEventName) {\n        function nativeEventListener(event) {\n            event = getNativeEvent(event);\n            if (!isLocalEl(instance, event.target)) {\n                event = normalizeGlobalEvent(instance, event);\n                scope.domHandlers[nativeEventName].call(instance, event);\n            }\n        }\n        mountSingleDOMEventListener(scope, nativeEventName, nativeEventListener, { capture: true });\n    }\n}\nfunction mountSingleDOMEventListener(scope, nativeEventName, listener, opt) {\n    scope.mounted[nativeEventName] = listener;\n    scope.listenerOpts[nativeEventName] = opt;\n    addEventListener(scope.domTarget, nativeEventName, listener, opt);\n}\nfunction unmountDOMEventListeners(scope) {\n    var mounted = scope.mounted;\n    for (var nativeEventName in mounted) {\n        if (mounted.hasOwnProperty(nativeEventName)) {\n            removeEventListener(scope.domTarget, nativeEventName, mounted[nativeEventName], scope.listenerOpts[nativeEventName]);\n        }\n    }\n    scope.mounted = {};\n}\nvar DOMHandlerScope = (function () {\n    function DOMHandlerScope(domTarget, domHandlers) {\n        this.mounted = {};\n        this.listenerOpts = {};\n        this.touching = false;\n        this.domTarget = domTarget;\n        this.domHandlers = domHandlers;\n    }\n    return DOMHandlerScope;\n}());\nvar HandlerDomProxy = (function (_super) {\n    __extends(HandlerDomProxy, _super);\n    function HandlerDomProxy(dom, painterRoot) {\n        var _this = _super.call(this) || this;\n        _this.__pointerCapturing = false;\n        _this.dom = dom;\n        _this.painterRoot = painterRoot;\n        _this._localHandlerScope = new DOMHandlerScope(dom, localDOMHandlers);\n        if (globalEventSupported) {\n            _this._globalHandlerScope = new DOMHandlerScope(document, globalDOMHandlers);\n        }\n        mountLocalDOMEventListeners(_this, _this._localHandlerScope);\n        return _this;\n    }\n    HandlerDomProxy.prototype.dispose = function () {\n        unmountDOMEventListeners(this._localHandlerScope);\n        if (globalEventSupported) {\n            unmountDOMEventListeners(this._globalHandlerScope);\n        }\n    };\n    HandlerDomProxy.prototype.setCursor = function (cursorStyle) {\n        this.dom.style && (this.dom.style.cursor = cursorStyle || 'default');\n    };\n    HandlerDomProxy.prototype.__togglePointerCapture = function (isPointerCapturing) {\n        this.__mayPointerCapture = null;\n        if (globalEventSupported\n            && ((+this.__pointerCapturing) ^ (+isPointerCapturing))) {\n            this.__pointerCapturing = isPointerCapturing;\n            var globalHandlerScope = this._globalHandlerScope;\n            isPointerCapturing\n                ? mountGlobalDOMEventListeners(this, globalHandlerScope)\n                : unmountDOMEventListeners(globalHandlerScope);\n        }\n    };\n    return HandlerDomProxy;\n}(Eventful));\nexport default HandlerDomProxy;\n", "import env from './core/env.js';\nvar dpr = 1;\nif (env.hasGlobalWindow) {\n    dpr = Math.max(window.devicePixelRatio\n        || (window.screen && window.screen.deviceXDPI / window.screen.logicalXDPI)\n        || 1, 1);\n}\nexport var debugMode = 0;\nexport var devicePixelRatio = dpr;\nexport var DARK_MODE_THRESHOLD = 0.4;\nexport var DARK_LABEL_COLOR = '#333';\nexport var LIGHT_LABEL_COLOR = '#ccc';\nexport var LIGHTER_LABEL_COLOR = '#eee';\n", "import * as matrix from './matrix.js';\nimport * as vector from './vector.js';\nvar mIdentity = matrix.identity;\nvar EPSILON = 5e-5;\nfunction isNotAroundZero(val) {\n    return val > EPSILON || val < -EPSILON;\n}\nvar scaleTmp = [];\nvar tmpTransform = [];\nvar originTransform = matrix.create();\nvar abs = Math.abs;\nvar Transformable = (function () {\n    function Transformable() {\n    }\n    Transformable.prototype.getLocalTransform = function (m) {\n        return Transformable.getLocalTransform(this, m);\n    };\n    Transformable.prototype.setPosition = function (arr) {\n        this.x = arr[0];\n        this.y = arr[1];\n    };\n    Transformable.prototype.setScale = function (arr) {\n        this.scaleX = arr[0];\n        this.scaleY = arr[1];\n    };\n    Transformable.prototype.setSkew = function (arr) {\n        this.skewX = arr[0];\n        this.skewY = arr[1];\n    };\n    Transformable.prototype.setOrigin = function (arr) {\n        this.originX = arr[0];\n        this.originY = arr[1];\n    };\n    Transformable.prototype.needLocalTransform = function () {\n        return isNotAroundZero(this.rotation)\n            || isNotAroundZero(this.x)\n            || isNotAroundZero(this.y)\n            || isNotAroundZero(this.scaleX - 1)\n            || isNotAroundZero(this.scaleY - 1)\n            || isNotAroundZero(this.skewX)\n            || isNotAroundZero(this.skewY);\n    };\n    Transformable.prototype.updateTransform = function () {\n        var parentTransform = this.parent && this.parent.transform;\n        var needLocalTransform = this.needLocalTransform();\n        var m = this.transform;\n        if (!(needLocalTransform || parentTransform)) {\n            if (m) {\n                mIdentity(m);\n                this.invTransform = null;\n            }\n            return;\n        }\n        m = m || matrix.create();\n        if (needLocalTransform) {\n            this.getLocalTransform(m);\n        }\n        else {\n            mIdentity(m);\n        }\n        if (parentTransform) {\n            if (needLocalTransform) {\n                matrix.mul(m, parentTransform, m);\n            }\n            else {\n                matrix.copy(m, parentTransform);\n            }\n        }\n        this.transform = m;\n        this._resolveGlobalScaleRatio(m);\n    };\n    Transformable.prototype._resolveGlobalScaleRatio = function (m) {\n        var globalScaleRatio = this.globalScaleRatio;\n        if (globalScaleRatio != null && globalScaleRatio !== 1) {\n            this.getGlobalScale(scaleTmp);\n            var relX = scaleTmp[0] < 0 ? -1 : 1;\n            var relY = scaleTmp[1] < 0 ? -1 : 1;\n            var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0;\n            var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0;\n            m[0] *= sx;\n            m[1] *= sx;\n            m[2] *= sy;\n            m[3] *= sy;\n        }\n        this.invTransform = this.invTransform || matrix.create();\n        matrix.invert(this.invTransform, m);\n    };\n    Transformable.prototype.getComputedTransform = function () {\n        var transformNode = this;\n        var ancestors = [];\n        while (transformNode) {\n            ancestors.push(transformNode);\n            transformNode = transformNode.parent;\n        }\n        while (transformNode = ancestors.pop()) {\n            transformNode.updateTransform();\n        }\n        return this.transform;\n    };\n    Transformable.prototype.setLocalTransform = function (m) {\n        if (!m) {\n            return;\n        }\n        var sx = m[0] * m[0] + m[1] * m[1];\n        var sy = m[2] * m[2] + m[3] * m[3];\n        var rotation = Math.atan2(m[1], m[0]);\n        var shearX = Math.PI / 2 + rotation - Math.atan2(m[3], m[2]);\n        sy = Math.sqrt(sy) * Math.cos(shearX);\n        sx = Math.sqrt(sx);\n        this.skewX = shearX;\n        this.skewY = 0;\n        this.rotation = -rotation;\n        this.x = +m[4];\n        this.y = +m[5];\n        this.scaleX = sx;\n        this.scaleY = sy;\n        this.originX = 0;\n        this.originY = 0;\n    };\n    Transformable.prototype.decomposeTransform = function () {\n        if (!this.transform) {\n            return;\n        }\n        var parent = this.parent;\n        var m = this.transform;\n        if (parent && parent.transform) {\n            parent.invTransform = parent.invTransform || matrix.create();\n            matrix.mul(tmpTransform, parent.invTransform, m);\n            m = tmpTransform;\n        }\n        var ox = this.originX;\n        var oy = this.originY;\n        if (ox || oy) {\n            originTransform[4] = ox;\n            originTransform[5] = oy;\n            matrix.mul(tmpTransform, m, originTransform);\n            tmpTransform[4] -= ox;\n            tmpTransform[5] -= oy;\n            m = tmpTransform;\n        }\n        this.setLocalTransform(m);\n    };\n    Transformable.prototype.getGlobalScale = function (out) {\n        var m = this.transform;\n        out = out || [];\n        if (!m) {\n            out[0] = 1;\n            out[1] = 1;\n            return out;\n        }\n        out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]);\n        out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]);\n        if (m[0] < 0) {\n            out[0] = -out[0];\n        }\n        if (m[3] < 0) {\n            out[1] = -out[1];\n        }\n        return out;\n    };\n    Transformable.prototype.transformCoordToLocal = function (x, y) {\n        var v2 = [x, y];\n        var invTransform = this.invTransform;\n        if (invTransform) {\n            vector.applyTransform(v2, v2, invTransform);\n        }\n        return v2;\n    };\n    Transformable.prototype.transformCoordToGlobal = function (x, y) {\n        var v2 = [x, y];\n        var transform = this.transform;\n        if (transform) {\n            vector.applyTransform(v2, v2, transform);\n        }\n        return v2;\n    };\n    Transformable.prototype.getLineScale = function () {\n        var m = this.transform;\n        return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10\n            ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1]))\n            : 1;\n    };\n    Transformable.prototype.copyTransform = function (source) {\n        copyTransform(this, source);\n    };\n    Transformable.getLocalTransform = function (target, m) {\n        m = m || [];\n        var ox = target.originX || 0;\n        var oy = target.originY || 0;\n        var sx = target.scaleX;\n        var sy = target.scaleY;\n        var ax = target.anchorX;\n        var ay = target.anchorY;\n        var rotation = target.rotation || 0;\n        var x = target.x;\n        var y = target.y;\n        var skewX = target.skewX ? Math.tan(target.skewX) : 0;\n        var skewY = target.skewY ? Math.tan(-target.skewY) : 0;\n        if (ox || oy || ax || ay) {\n            var dx = ox + ax;\n            var dy = oy + ay;\n            m[4] = -dx * sx - skewX * dy * sy;\n            m[5] = -dy * sy - skewY * dx * sx;\n        }\n        else {\n            m[4] = m[5] = 0;\n        }\n        m[0] = sx;\n        m[3] = sy;\n        m[1] = skewY * sx;\n        m[2] = skewX * sy;\n        rotation && matrix.rotate(m, m, rotation);\n        m[4] += ox + x;\n        m[5] += oy + y;\n        return m;\n    };\n    Transformable.initDefaultProps = (function () {\n        var proto = Transformable.prototype;\n        proto.scaleX =\n            proto.scaleY =\n                proto.globalScaleRatio = 1;\n        proto.x =\n            proto.y =\n                proto.originX =\n                    proto.originY =\n                        proto.skewX =\n                            proto.skewY =\n                                proto.rotation =\n                                    proto.anchorX =\n                                        proto.anchorY = 0;\n    })();\n    return Transformable;\n}());\n;\nexport var TRANSFORMABLE_PROPS = [\n    'x', 'y', 'originX', 'originY', 'anchorX', 'anchorY', 'rotation', 'scaleX', 'scaleY', 'skewX', 'skewY'\n];\nexport function copyTransform(target, source) {\n    for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) {\n        var propName = TRANSFORMABLE_PROPS[i];\n        target[propName] = source[propName];\n    }\n}\nexport default Transformable;\n", "import BoundingRect from '../core/BoundingRect.js';\nimport LRU from '../core/LRU.js';\nimport { DEFAULT_FONT, platformApi } from '../core/platform.js';\nexport function getWidth(text, font) {\n    return measureWidth(ensureFontMeasureInfo(font), text);\n}\nexport function ensureFontMeasureInfo(font) {\n    if (!_fontMeasureInfoCache) {\n        _fontMeasureInfoCache = new LRU(100);\n    }\n    font = font || DEFAULT_FONT;\n    var measureInfo = _fontMeasureInfoCache.get(font);\n    if (!measureInfo) {\n        measureInfo = {\n            font: font,\n            strWidthCache: new LRU(500),\n            asciiWidthMap: null,\n            asciiWidthMapTried: false,\n            stWideCharWidth: platformApi.measureText('\u56FD', font).width,\n            asciiCharWidth: platformApi.measureText('a', font).width\n        };\n        _fontMeasureInfoCache.put(font, measureInfo);\n    }\n    return measureInfo;\n}\nvar _fontMeasureInfoCache;\nfunction tryCreateASCIIWidthMap(font) {\n    if (_getASCIIWidthMapLongCount >= GET_ASCII_WIDTH_LONG_COUNT_MAX) {\n        return;\n    }\n    font = font || DEFAULT_FONT;\n    var asciiWidthMap = [];\n    var start = +(new Date());\n    for (var code = 0; code <= 127; code++) {\n        asciiWidthMap[code] = platformApi.measureText(String.fromCharCode(code), font).width;\n    }\n    var cost = +(new Date()) - start;\n    if (cost > 16) {\n        _getASCIIWidthMapLongCount = GET_ASCII_WIDTH_LONG_COUNT_MAX;\n    }\n    else if (cost > 2) {\n        _getASCIIWidthMapLongCount++;\n    }\n    return asciiWidthMap;\n}\nvar _getASCIIWidthMapLongCount = 0;\nvar GET_ASCII_WIDTH_LONG_COUNT_MAX = 5;\nexport function measureCharWidth(fontMeasureInfo, charCode) {\n    if (!fontMeasureInfo.asciiWidthMapTried) {\n        fontMeasureInfo.asciiWidthMap = tryCreateASCIIWidthMap(fontMeasureInfo.font);\n        fontMeasureInfo.asciiWidthMapTried = true;\n    }\n    return (0 <= charCode && charCode <= 127)\n        ? (fontMeasureInfo.asciiWidthMap != null\n            ? fontMeasureInfo.asciiWidthMap[charCode]\n            : fontMeasureInfo.asciiCharWidth)\n        : fontMeasureInfo.stWideCharWidth;\n}\nexport function measureWidth(fontMeasureInfo, text) {\n    var strWidthCache = fontMeasureInfo.strWidthCache;\n    var width = strWidthCache.get(text);\n    if (width == null) {\n        width = platformApi.measureText(text, fontMeasureInfo.font).width;\n        strWidthCache.put(text, width);\n    }\n    return width;\n}\nexport function innerGetBoundingRect(text, font, textAlign, textBaseline) {\n    var width = measureWidth(ensureFontMeasureInfo(font), text);\n    var height = getLineHeight(font);\n    var x = adjustTextX(0, width, textAlign);\n    var y = adjustTextY(0, height, textBaseline);\n    var rect = new BoundingRect(x, y, width, height);\n    return rect;\n}\nexport function getBoundingRect(text, font, textAlign, textBaseline) {\n    var textLines = ((text || '') + '').split('\\n');\n    var len = textLines.length;\n    if (len === 1) {\n        return innerGetBoundingRect(textLines[0], font, textAlign, textBaseline);\n    }\n    else {\n        var uniondRect = new BoundingRect(0, 0, 0, 0);\n        for (var i = 0; i < textLines.length; i++) {\n            var rect = innerGetBoundingRect(textLines[i], font, textAlign, textBaseline);\n            i === 0 ? uniondRect.copy(rect) : uniondRect.union(rect);\n        }\n        return uniondRect;\n    }\n}\nexport function adjustTextX(x, width, textAlign, inverse) {\n    if (textAlign === 'right') {\n        !inverse ? (x -= width) : (x += width);\n    }\n    else if (textAlign === 'center') {\n        !inverse ? (x -= width / 2) : (x += width / 2);\n    }\n    return x;\n}\nexport function adjustTextY(y, height, verticalAlign, inverse) {\n    if (verticalAlign === 'middle') {\n        !inverse ? (y -= height / 2) : (y += height / 2);\n    }\n    else if (verticalAlign === 'bottom') {\n        !inverse ? (y -= height) : (y += height);\n    }\n    return y;\n}\nexport function getLineHeight(font) {\n    return ensureFontMeasureInfo(font).stWideCharWidth;\n}\nexport function measureText(text, font) {\n    return platformApi.measureText(text, font);\n}\nexport function parsePercent(value, maxValue) {\n    if (typeof value === 'string') {\n        if (value.lastIndexOf('%') >= 0) {\n            return parseFloat(value) / 100 * maxValue;\n        }\n        return parseFloat(value);\n    }\n    return value;\n}\nexport function calculateTextPosition(out, opts, rect) {\n    var textPosition = opts.position || 'inside';\n    var distance = opts.distance != null ? opts.distance : 5;\n    var height = rect.height;\n    var width = rect.width;\n    var halfHeight = height / 2;\n    var x = rect.x;\n    var y = rect.y;\n    var textAlign = 'left';\n    var textVerticalAlign = 'top';\n    if (textPosition instanceof Array) {\n        x += parsePercent(textPosition[0], rect.width);\n        y += parsePercent(textPosition[1], rect.height);\n        textAlign = null;\n        textVerticalAlign = null;\n    }\n    else {\n        switch (textPosition) {\n            case 'left':\n                x -= distance;\n                y += halfHeight;\n                textAlign = 'right';\n                textVerticalAlign = 'middle';\n                break;\n            case 'right':\n                x += distance + width;\n                y += halfHeight;\n                textVerticalAlign = 'middle';\n                break;\n            case 'top':\n                x += width / 2;\n                y -= distance;\n                textAlign = 'center';\n                textVerticalAlign = 'bottom';\n                break;\n            case 'bottom':\n                x += width / 2;\n                y += height + distance;\n                textAlign = 'center';\n                break;\n            case 'inside':\n                x += width / 2;\n                y += halfHeight;\n                textAlign = 'center';\n                textVerticalAlign = 'middle';\n                break;\n            case 'insideLeft':\n                x += distance;\n                y += halfHeight;\n                textVerticalAlign = 'middle';\n                break;\n            case 'insideRight':\n                x += width - distance;\n                y += halfHeight;\n                textAlign = 'right';\n                textVerticalAlign = 'middle';\n                break;\n            case 'insideTop':\n                x += width / 2;\n                y += distance;\n                textAlign = 'center';\n                break;\n            case 'insideBottom':\n                x += width / 2;\n                y += height - distance;\n                textAlign = 'center';\n                textVerticalAlign = 'bottom';\n                break;\n            case 'insideTopLeft':\n                x += distance;\n                y += distance;\n                break;\n            case 'insideTopRight':\n                x += width - distance;\n                y += distance;\n                textAlign = 'right';\n                break;\n            case 'insideBottomLeft':\n                x += distance;\n                y += height - distance;\n                textVerticalAlign = 'bottom';\n                break;\n            case 'insideBottomRight':\n                x += width - distance;\n                y += height - distance;\n                textAlign = 'right';\n                textVerticalAlign = 'bottom';\n                break;\n        }\n    }\n    out = out || {};\n    out.x = x;\n    out.y = y;\n    out.align = textAlign;\n    out.verticalAlign = textVerticalAlign;\n    return out;\n}\n", "import Transformable, { TRANSFORMABLE_PROPS } from './core/Transformable.js';\nimport Animator, { cloneValue } from './animation/Animator.js';\nimport BoundingRect from './core/BoundingRect.js';\nimport Eventful from './core/Eventful.js';\nimport { calculateTextPosition, parsePercent } from './contain/text.js';\nimport { guid, isObject, keys, extend, indexOf, logError, mixin, isArrayLike, isTypedArray, isGradientObject, filter, reduce } from './core/util.js';\nimport { LIGHT_LABEL_COLOR, DARK_LABEL_COLOR } from './config.js';\nimport { parse, stringify } from './tool/color.js';\nimport { REDRAW_BIT } from './graphic/constants.js';\nimport { invert } from './core/matrix.js';\nexport var PRESERVED_NORMAL_STATE = '__zr_normal__';\nvar PRIMARY_STATES_KEYS = TRANSFORMABLE_PROPS.concat(['ignore']);\nvar DEFAULT_ANIMATABLE_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) {\n    obj[key] = true;\n    return obj;\n}, { ignore: false });\nvar tmpTextPosCalcRes = {};\nvar tmpBoundingRect = new BoundingRect(0, 0, 0, 0);\nvar tmpInnerTextTrans = [];\nvar Element = (function () {\n    function Element(props) {\n        this.id = guid();\n        this.animators = [];\n        this.currentStates = [];\n        this.states = {};\n        this._init(props);\n    }\n    Element.prototype._init = function (props) {\n        this.attr(props);\n    };\n    Element.prototype.drift = function (dx, dy, e) {\n        switch (this.draggable) {\n            case 'horizontal':\n                dy = 0;\n                break;\n            case 'vertical':\n                dx = 0;\n                break;\n        }\n        var m = this.transform;\n        if (!m) {\n            m = this.transform = [1, 0, 0, 1, 0, 0];\n        }\n        m[4] += dx;\n        m[5] += dy;\n        this.decomposeTransform();\n        this.markRedraw();\n    };\n    Element.prototype.beforeUpdate = function () { };\n    Element.prototype.afterUpdate = function () { };\n    Element.prototype.update = function () {\n        this.updateTransform();\n        if (this.__dirty) {\n            this.updateInnerText();\n        }\n    };\n    Element.prototype.updateInnerText = function (forceUpdate) {\n        var textEl = this._textContent;\n        if (textEl && (!textEl.ignore || forceUpdate)) {\n            if (!this.textConfig) {\n                this.textConfig = {};\n            }\n            var textConfig = this.textConfig;\n            var isLocal = textConfig.local;\n            var innerTransformable = textEl.innerTransformable;\n            var textAlign = void 0;\n            var textVerticalAlign = void 0;\n            var textStyleChanged = false;\n            innerTransformable.parent = isLocal ? this : null;\n            var innerOrigin = false;\n            innerTransformable.copyTransform(textEl);\n            var hasPosition = textConfig.position != null;\n            var autoOverflowArea = textConfig.autoOverflowArea;\n            var layoutRect = void 0;\n            if (autoOverflowArea || hasPosition) {\n                layoutRect = tmpBoundingRect;\n                if (textConfig.layoutRect) {\n                    layoutRect.copy(textConfig.layoutRect);\n                }\n                else {\n                    layoutRect.copy(this.getBoundingRect());\n                }\n                if (!isLocal) {\n                    layoutRect.applyTransform(this.transform);\n                }\n            }\n            if (hasPosition) {\n                if (this.calculateTextPosition) {\n                    this.calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect);\n                }\n                else {\n                    calculateTextPosition(tmpTextPosCalcRes, textConfig, layoutRect);\n                }\n                innerTransformable.x = tmpTextPosCalcRes.x;\n                innerTransformable.y = tmpTextPosCalcRes.y;\n                textAlign = tmpTextPosCalcRes.align;\n                textVerticalAlign = tmpTextPosCalcRes.verticalAlign;\n                var textOrigin = textConfig.origin;\n                if (textOrigin && textConfig.rotation != null) {\n                    var relOriginX = void 0;\n                    var relOriginY = void 0;\n                    if (textOrigin === 'center') {\n                        relOriginX = layoutRect.width * 0.5;\n                        relOriginY = layoutRect.height * 0.5;\n                    }\n                    else {\n                        relOriginX = parsePercent(textOrigin[0], layoutRect.width);\n                        relOriginY = parsePercent(textOrigin[1], layoutRect.height);\n                    }\n                    innerOrigin = true;\n                    innerTransformable.originX = -innerTransformable.x + relOriginX + (isLocal ? 0 : layoutRect.x);\n                    innerTransformable.originY = -innerTransformable.y + relOriginY + (isLocal ? 0 : layoutRect.y);\n                }\n            }\n            if (textConfig.rotation != null) {\n                innerTransformable.rotation = textConfig.rotation;\n            }\n            var textOffset = textConfig.offset;\n            if (textOffset) {\n                innerTransformable.x += textOffset[0];\n                innerTransformable.y += textOffset[1];\n                if (!innerOrigin) {\n                    innerTransformable.originX = -textOffset[0];\n                    innerTransformable.originY = -textOffset[1];\n                }\n            }\n            var innerTextDefaultStyle = this._innerTextDefaultStyle || (this._innerTextDefaultStyle = {});\n            if (autoOverflowArea) {\n                var overflowRect = innerTextDefaultStyle.overflowRect =\n                    innerTextDefaultStyle.overflowRect || new BoundingRect(0, 0, 0, 0);\n                innerTransformable.getLocalTransform(tmpInnerTextTrans);\n                invert(tmpInnerTextTrans, tmpInnerTextTrans);\n                BoundingRect.copy(overflowRect, layoutRect);\n                overflowRect.applyTransform(tmpInnerTextTrans);\n            }\n            else {\n                innerTextDefaultStyle.overflowRect = null;\n            }\n            var isInside = textConfig.inside == null\n                ? (typeof textConfig.position === 'string' && textConfig.position.indexOf('inside') >= 0)\n                : textConfig.inside;\n            var textFill = void 0;\n            var textStroke = void 0;\n            var autoStroke = void 0;\n            if (isInside && this.canBeInsideText()) {\n                textFill = textConfig.insideFill;\n                textStroke = textConfig.insideStroke;\n                if (textFill == null || textFill === 'auto') {\n                    textFill = this.getInsideTextFill();\n                }\n                if (textStroke == null || textStroke === 'auto') {\n                    textStroke = this.getInsideTextStroke(textFill);\n                    autoStroke = true;\n                }\n            }\n            else {\n                textFill = textConfig.outsideFill;\n                textStroke = textConfig.outsideStroke;\n                if (textFill == null || textFill === 'auto') {\n                    textFill = this.getOutsideFill();\n                }\n                if (textStroke == null || textStroke === 'auto') {\n                    textStroke = this.getOutsideStroke(textFill);\n                    autoStroke = true;\n                }\n            }\n            textFill = textFill || '#000';\n            if (textFill !== innerTextDefaultStyle.fill\n                || textStroke !== innerTextDefaultStyle.stroke\n                || autoStroke !== innerTextDefaultStyle.autoStroke\n                || textAlign !== innerTextDefaultStyle.align\n                || textVerticalAlign !== innerTextDefaultStyle.verticalAlign) {\n                textStyleChanged = true;\n                innerTextDefaultStyle.fill = textFill;\n                innerTextDefaultStyle.stroke = textStroke;\n                innerTextDefaultStyle.autoStroke = autoStroke;\n                innerTextDefaultStyle.align = textAlign;\n                innerTextDefaultStyle.verticalAlign = textVerticalAlign;\n                textEl.setDefaultTextStyle(innerTextDefaultStyle);\n            }\n            textEl.__dirty |= REDRAW_BIT;\n            if (textStyleChanged) {\n                textEl.dirtyStyle(true);\n            }\n        }\n    };\n    Element.prototype.canBeInsideText = function () {\n        return true;\n    };\n    Element.prototype.getInsideTextFill = function () {\n        return '#fff';\n    };\n    Element.prototype.getInsideTextStroke = function (textFill) {\n        return '#000';\n    };\n    Element.prototype.getOutsideFill = function () {\n        return this.__zr && this.__zr.isDarkMode() ? LIGHT_LABEL_COLOR : DARK_LABEL_COLOR;\n    };\n    Element.prototype.getOutsideStroke = function (textFill) {\n        var backgroundColor = this.__zr && this.__zr.getBackgroundColor();\n        var colorArr = typeof backgroundColor === 'string' && parse(backgroundColor);\n        if (!colorArr) {\n            colorArr = [255, 255, 255, 1];\n        }\n        var alpha = colorArr[3];\n        var isDark = this.__zr.isDarkMode();\n        for (var i = 0; i < 3; i++) {\n            colorArr[i] = colorArr[i] * alpha + (isDark ? 0 : 255) * (1 - alpha);\n        }\n        colorArr[3] = 1;\n        return stringify(colorArr, 'rgba');\n    };\n    Element.prototype.traverse = function (cb, context) { };\n    Element.prototype.attrKV = function (key, value) {\n        if (key === 'textConfig') {\n            this.setTextConfig(value);\n        }\n        else if (key === 'textContent') {\n            this.setTextContent(value);\n        }\n        else if (key === 'clipPath') {\n            this.setClipPath(value);\n        }\n        else if (key === 'extra') {\n            this.extra = this.extra || {};\n            extend(this.extra, value);\n        }\n        else {\n            this[key] = value;\n        }\n    };\n    Element.prototype.hide = function () {\n        this.ignore = true;\n        this.markRedraw();\n    };\n    Element.prototype.show = function () {\n        this.ignore = false;\n        this.markRedraw();\n    };\n    Element.prototype.attr = function (keyOrObj, value) {\n        if (typeof keyOrObj === 'string') {\n            this.attrKV(keyOrObj, value);\n        }\n        else if (isObject(keyOrObj)) {\n            var obj = keyOrObj;\n            var keysArr = keys(obj);\n            for (var i = 0; i < keysArr.length; i++) {\n                var key = keysArr[i];\n                this.attrKV(key, keyOrObj[key]);\n            }\n        }\n        this.markRedraw();\n        return this;\n    };\n    Element.prototype.saveCurrentToNormalState = function (toState) {\n        this._innerSaveToNormal(toState);\n        var normalState = this._normalState;\n        for (var i = 0; i < this.animators.length; i++) {\n            var animator = this.animators[i];\n            var fromStateTransition = animator.__fromStateTransition;\n            if (animator.getLoop() || fromStateTransition && fromStateTransition !== PRESERVED_NORMAL_STATE) {\n                continue;\n            }\n            var targetName = animator.targetName;\n            var target = targetName\n                ? normalState[targetName] : normalState;\n            animator.saveTo(target);\n        }\n    };\n    Element.prototype._innerSaveToNormal = function (toState) {\n        var normalState = this._normalState;\n        if (!normalState) {\n            normalState = this._normalState = {};\n        }\n        if (toState.textConfig && !normalState.textConfig) {\n            normalState.textConfig = this.textConfig;\n        }\n        this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS);\n    };\n    Element.prototype._savePrimaryToNormal = function (toState, normalState, primaryKeys) {\n        for (var i = 0; i < primaryKeys.length; i++) {\n            var key = primaryKeys[i];\n            if (toState[key] != null && !(key in normalState)) {\n                normalState[key] = this[key];\n            }\n        }\n    };\n    Element.prototype.hasState = function () {\n        return this.currentStates.length > 0;\n    };\n    Element.prototype.getState = function (name) {\n        return this.states[name];\n    };\n    Element.prototype.ensureState = function (name) {\n        var states = this.states;\n        if (!states[name]) {\n            states[name] = {};\n        }\n        return states[name];\n    };\n    Element.prototype.clearStates = function (noAnimation) {\n        this.useState(PRESERVED_NORMAL_STATE, false, noAnimation);\n    };\n    Element.prototype.useState = function (stateName, keepCurrentStates, noAnimation, forceUseHoverLayer) {\n        var toNormalState = stateName === PRESERVED_NORMAL_STATE;\n        var hasStates = this.hasState();\n        if (!hasStates && toNormalState) {\n            return;\n        }\n        var currentStates = this.currentStates;\n        var animationCfg = this.stateTransition;\n        if (indexOf(currentStates, stateName) >= 0 && (keepCurrentStates || currentStates.length === 1)) {\n            return;\n        }\n        var state;\n        if (this.stateProxy && !toNormalState) {\n            state = this.stateProxy(stateName);\n        }\n        if (!state) {\n            state = (this.states && this.states[stateName]);\n        }\n        if (!state && !toNormalState) {\n            logError(\"State \" + stateName + \" not exists.\");\n            return;\n        }\n        if (!toNormalState) {\n            this.saveCurrentToNormalState(state);\n        }\n        var useHoverLayer = !!((state && state.hoverLayer) || forceUseHoverLayer);\n        if (useHoverLayer) {\n            this._toggleHoverLayerFlag(true);\n        }\n        this._applyStateObj(stateName, state, this._normalState, keepCurrentStates, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg);\n        var textContent = this._textContent;\n        var textGuide = this._textGuide;\n        if (textContent) {\n            textContent.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);\n        }\n        if (textGuide) {\n            textGuide.useState(stateName, keepCurrentStates, noAnimation, useHoverLayer);\n        }\n        if (toNormalState) {\n            this.currentStates = [];\n            this._normalState = {};\n        }\n        else {\n            if (!keepCurrentStates) {\n                this.currentStates = [stateName];\n            }\n            else {\n                this.currentStates.push(stateName);\n            }\n        }\n        this._updateAnimationTargets();\n        this.markRedraw();\n        if (!useHoverLayer && this.__inHover) {\n            this._toggleHoverLayerFlag(false);\n            this.__dirty &= ~REDRAW_BIT;\n        }\n        return state;\n    };\n    Element.prototype.useStates = function (states, noAnimation, forceUseHoverLayer) {\n        if (!states.length) {\n            this.clearStates();\n        }\n        else {\n            var stateObjects = [];\n            var currentStates = this.currentStates;\n            var len = states.length;\n            var notChange = len === currentStates.length;\n            if (notChange) {\n                for (var i = 0; i < len; i++) {\n                    if (states[i] !== currentStates[i]) {\n                        notChange = false;\n                        break;\n                    }\n                }\n            }\n            if (notChange) {\n                return;\n            }\n            for (var i = 0; i < len; i++) {\n                var stateName = states[i];\n                var stateObj = void 0;\n                if (this.stateProxy) {\n                    stateObj = this.stateProxy(stateName, states);\n                }\n                if (!stateObj) {\n                    stateObj = this.states[stateName];\n                }\n                if (stateObj) {\n                    stateObjects.push(stateObj);\n                }\n            }\n            var lastStateObj = stateObjects[len - 1];\n            var useHoverLayer = !!((lastStateObj && lastStateObj.hoverLayer) || forceUseHoverLayer);\n            if (useHoverLayer) {\n                this._toggleHoverLayerFlag(true);\n            }\n            var mergedState = this._mergeStates(stateObjects);\n            var animationCfg = this.stateTransition;\n            this.saveCurrentToNormalState(mergedState);\n            this._applyStateObj(states.join(','), mergedState, this._normalState, false, !noAnimation && !this.__inHover && animationCfg && animationCfg.duration > 0, animationCfg);\n            var textContent = this._textContent;\n            var textGuide = this._textGuide;\n            if (textContent) {\n                textContent.useStates(states, noAnimation, useHoverLayer);\n            }\n            if (textGuide) {\n                textGuide.useStates(states, noAnimation, useHoverLayer);\n            }\n            this._updateAnimationTargets();\n            this.currentStates = states.slice();\n            this.markRedraw();\n            if (!useHoverLayer && this.__inHover) {\n                this._toggleHoverLayerFlag(false);\n                this.__dirty &= ~REDRAW_BIT;\n            }\n        }\n    };\n    Element.prototype.isSilent = function () {\n        var el = this;\n        while (el) {\n            if (el.silent) {\n                return true;\n            }\n            var hostEl = el.__hostTarget;\n            el = hostEl ? (el.ignoreHostSilent ? null : hostEl) : el.parent;\n        }\n        return false;\n    };\n    Element.prototype._updateAnimationTargets = function () {\n        for (var i = 0; i < this.animators.length; i++) {\n            var animator = this.animators[i];\n            if (animator.targetName) {\n                animator.changeTarget(this[animator.targetName]);\n            }\n        }\n    };\n    Element.prototype.removeState = function (state) {\n        var idx = indexOf(this.currentStates, state);\n        if (idx >= 0) {\n            var currentStates = this.currentStates.slice();\n            currentStates.splice(idx, 1);\n            this.useStates(currentStates);\n        }\n    };\n    Element.prototype.replaceState = function (oldState, newState, forceAdd) {\n        var currentStates = this.currentStates.slice();\n        var idx = indexOf(currentStates, oldState);\n        var newStateExists = indexOf(currentStates, newState) >= 0;\n        if (idx >= 0) {\n            if (!newStateExists) {\n                currentStates[idx] = newState;\n            }\n            else {\n                currentStates.splice(idx, 1);\n            }\n        }\n        else if (forceAdd && !newStateExists) {\n            currentStates.push(newState);\n        }\n        this.useStates(currentStates);\n    };\n    Element.prototype.toggleState = function (state, enable) {\n        if (enable) {\n            this.useState(state, true);\n        }\n        else {\n            this.removeState(state);\n        }\n    };\n    Element.prototype._mergeStates = function (states) {\n        var mergedState = {};\n        var mergedTextConfig;\n        for (var i = 0; i < states.length; i++) {\n            var state = states[i];\n            extend(mergedState, state);\n            if (state.textConfig) {\n                mergedTextConfig = mergedTextConfig || {};\n                extend(mergedTextConfig, state.textConfig);\n            }\n        }\n        if (mergedTextConfig) {\n            mergedState.textConfig = mergedTextConfig;\n        }\n        return mergedState;\n    };\n    Element.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {\n        var needsRestoreToNormal = !(state && keepCurrentStates);\n        if (state && state.textConfig) {\n            this.textConfig = extend({}, keepCurrentStates ? this.textConfig : normalState.textConfig);\n            extend(this.textConfig, state.textConfig);\n        }\n        else if (needsRestoreToNormal) {\n            if (normalState.textConfig) {\n                this.textConfig = normalState.textConfig;\n            }\n        }\n        var transitionTarget = {};\n        var hasTransition = false;\n        for (var i = 0; i < PRIMARY_STATES_KEYS.length; i++) {\n            var key = PRIMARY_STATES_KEYS[i];\n            var propNeedsTransition = transition && DEFAULT_ANIMATABLE_MAP[key];\n            if (state && state[key] != null) {\n                if (propNeedsTransition) {\n                    hasTransition = true;\n                    transitionTarget[key] = state[key];\n                }\n                else {\n                    this[key] = state[key];\n                }\n            }\n            else if (needsRestoreToNormal) {\n                if (normalState[key] != null) {\n                    if (propNeedsTransition) {\n                        hasTransition = true;\n                        transitionTarget[key] = normalState[key];\n                    }\n                    else {\n                        this[key] = normalState[key];\n                    }\n                }\n            }\n        }\n        if (!transition) {\n            for (var i = 0; i < this.animators.length; i++) {\n                var animator = this.animators[i];\n                var targetName = animator.targetName;\n                if (!animator.getLoop()) {\n                    animator.__changeFinalValue(targetName\n                        ? (state || normalState)[targetName]\n                        : (state || normalState));\n                }\n            }\n        }\n        if (hasTransition) {\n            this._transitionState(stateName, transitionTarget, animationCfg);\n        }\n    };\n    Element.prototype._attachComponent = function (componentEl) {\n        if (componentEl.__zr && !componentEl.__hostTarget) {\n            if (process.env.NODE_ENV !== 'production') {\n                throw new Error('Text element has been added to zrender.');\n            }\n            return;\n        }\n        if (componentEl === this) {\n            if (process.env.NODE_ENV !== 'production') {\n                throw new Error('Recursive component attachment.');\n            }\n            return;\n        }\n        var zr = this.__zr;\n        if (zr) {\n            componentEl.addSelfToZr(zr);\n        }\n        componentEl.__zr = zr;\n        componentEl.__hostTarget = this;\n    };\n    Element.prototype._detachComponent = function (componentEl) {\n        if (componentEl.__zr) {\n            componentEl.removeSelfFromZr(componentEl.__zr);\n        }\n        componentEl.__zr = null;\n        componentEl.__hostTarget = null;\n    };\n    Element.prototype.getClipPath = function () {\n        return this._clipPath;\n    };\n    Element.prototype.setClipPath = function (clipPath) {\n        if (this._clipPath && this._clipPath !== clipPath) {\n            this.removeClipPath();\n        }\n        this._attachComponent(clipPath);\n        this._clipPath = clipPath;\n        this.markRedraw();\n    };\n    Element.prototype.removeClipPath = function () {\n        var clipPath = this._clipPath;\n        if (clipPath) {\n            this._detachComponent(clipPath);\n            this._clipPath = null;\n            this.markRedraw();\n        }\n    };\n    Element.prototype.getTextContent = function () {\n        return this._textContent;\n    };\n    Element.prototype.setTextContent = function (textEl) {\n        var previousTextContent = this._textContent;\n        if (previousTextContent === textEl) {\n            return;\n        }\n        if (previousTextContent && previousTextContent !== textEl) {\n            this.removeTextContent();\n        }\n        if (process.env.NODE_ENV !== 'production') {\n            if (textEl.__zr && !textEl.__hostTarget) {\n                throw new Error('Text element has been added to zrender.');\n            }\n        }\n        textEl.innerTransformable = new Transformable();\n        this._attachComponent(textEl);\n        this._textContent = textEl;\n        this.markRedraw();\n    };\n    Element.prototype.setTextConfig = function (cfg) {\n        if (!this.textConfig) {\n            this.textConfig = {};\n        }\n        extend(this.textConfig, cfg);\n        this.markRedraw();\n    };\n    Element.prototype.removeTextConfig = function () {\n        this.textConfig = null;\n        this.markRedraw();\n    };\n    Element.prototype.removeTextContent = function () {\n        var textEl = this._textContent;\n        if (textEl) {\n            textEl.innerTransformable = null;\n            this._detachComponent(textEl);\n            this._textContent = null;\n            this._innerTextDefaultStyle = null;\n            this.markRedraw();\n        }\n    };\n    Element.prototype.getTextGuideLine = function () {\n        return this._textGuide;\n    };\n    Element.prototype.setTextGuideLine = function (guideLine) {\n        if (this._textGuide && this._textGuide !== guideLine) {\n            this.removeTextGuideLine();\n        }\n        this._attachComponent(guideLine);\n        this._textGuide = guideLine;\n        this.markRedraw();\n    };\n    Element.prototype.removeTextGuideLine = function () {\n        var textGuide = this._textGuide;\n        if (textGuide) {\n            this._detachComponent(textGuide);\n            this._textGuide = null;\n            this.markRedraw();\n        }\n    };\n    Element.prototype.markRedraw = function () {\n        this.__dirty |= REDRAW_BIT;\n        var zr = this.__zr;\n        if (zr) {\n            if (this.__inHover) {\n                zr.refreshHover();\n            }\n            else {\n                zr.refresh();\n            }\n        }\n        if (this.__hostTarget) {\n            this.__hostTarget.markRedraw();\n        }\n    };\n    Element.prototype.dirty = function () {\n        this.markRedraw();\n    };\n    Element.prototype._toggleHoverLayerFlag = function (inHover) {\n        this.__inHover = inHover;\n        var textContent = this._textContent;\n        var textGuide = this._textGuide;\n        if (textContent) {\n            textContent.__inHover = inHover;\n        }\n        if (textGuide) {\n            textGuide.__inHover = inHover;\n        }\n    };\n    Element.prototype.addSelfToZr = function (zr) {\n        if (this.__zr === zr) {\n            return;\n        }\n        this.__zr = zr;\n        var animators = this.animators;\n        if (animators) {\n            for (var i = 0; i < animators.length; i++) {\n                zr.animation.addAnimator(animators[i]);\n            }\n        }\n        if (this._clipPath) {\n            this._clipPath.addSelfToZr(zr);\n        }\n        if (this._textContent) {\n            this._textContent.addSelfToZr(zr);\n        }\n        if (this._textGuide) {\n            this._textGuide.addSelfToZr(zr);\n        }\n    };\n    Element.prototype.removeSelfFromZr = function (zr) {\n        if (!this.__zr) {\n            return;\n        }\n        this.__zr = null;\n        var animators = this.animators;\n        if (animators) {\n            for (var i = 0; i < animators.length; i++) {\n                zr.animation.removeAnimator(animators[i]);\n            }\n        }\n        if (this._clipPath) {\n            this._clipPath.removeSelfFromZr(zr);\n        }\n        if (this._textContent) {\n            this._textContent.removeSelfFromZr(zr);\n        }\n        if (this._textGuide) {\n            this._textGuide.removeSelfFromZr(zr);\n        }\n    };\n    Element.prototype.animate = function (key, loop, allowDiscreteAnimation) {\n        var target = key ? this[key] : this;\n        if (process.env.NODE_ENV !== 'production') {\n            if (!target) {\n                logError('Property \"'\n                    + key\n                    + '\" is not existed in element '\n                    + this.id);\n                return;\n            }\n        }\n        var animator = new Animator(target, loop, allowDiscreteAnimation);\n        key && (animator.targetName = key);\n        this.addAnimator(animator, key);\n        return animator;\n    };\n    Element.prototype.addAnimator = function (animator, key) {\n        var zr = this.__zr;\n        var el = this;\n        animator.during(function () {\n            el.updateDuringAnimation(key);\n        }).done(function () {\n            var animators = el.animators;\n            var idx = indexOf(animators, animator);\n            if (idx >= 0) {\n                animators.splice(idx, 1);\n            }\n        });\n        this.animators.push(animator);\n        if (zr) {\n            zr.animation.addAnimator(animator);\n        }\n        zr && zr.wakeUp();\n    };\n    Element.prototype.updateDuringAnimation = function (key) {\n        this.markRedraw();\n    };\n    Element.prototype.stopAnimation = function (scope, forwardToLast) {\n        var animators = this.animators;\n        var len = animators.length;\n        var leftAnimators = [];\n        for (var i = 0; i < len; i++) {\n            var animator = animators[i];\n            if (!scope || scope === animator.scope) {\n                animator.stop(forwardToLast);\n            }\n            else {\n                leftAnimators.push(animator);\n            }\n        }\n        this.animators = leftAnimators;\n        return this;\n    };\n    Element.prototype.animateTo = function (target, cfg, animationProps) {\n        animateTo(this, target, cfg, animationProps);\n    };\n    Element.prototype.animateFrom = function (target, cfg, animationProps) {\n        animateTo(this, target, cfg, animationProps, true);\n    };\n    Element.prototype._transitionState = function (stateName, target, cfg, animationProps) {\n        var animators = animateTo(this, target, cfg, animationProps);\n        for (var i = 0; i < animators.length; i++) {\n            animators[i].__fromStateTransition = stateName;\n        }\n    };\n    Element.prototype.getBoundingRect = function () {\n        return null;\n    };\n    Element.prototype.getPaintRect = function () {\n        return null;\n    };\n    Element.initDefaultProps = (function () {\n        var elProto = Element.prototype;\n        elProto.type = 'element';\n        elProto.name = '';\n        elProto.ignore =\n            elProto.silent =\n                elProto.ignoreHostSilent =\n                    elProto.isGroup =\n                        elProto.draggable =\n                            elProto.dragging =\n                                elProto.ignoreClip =\n                                    elProto.__inHover = false;\n        elProto.__dirty = REDRAW_BIT;\n        var logs = {};\n        function logDeprecatedError(key, xKey, yKey) {\n            if (!logs[key + xKey + yKey]) {\n                console.warn(\"DEPRECATED: '\" + key + \"' has been deprecated. use '\" + xKey + \"', '\" + yKey + \"' instead\");\n                logs[key + xKey + yKey] = true;\n            }\n        }\n        function createLegacyProperty(key, privateKey, xKey, yKey) {\n            Object.defineProperty(elProto, key, {\n                get: function () {\n                    if (process.env.NODE_ENV !== 'production') {\n                        logDeprecatedError(key, xKey, yKey);\n                    }\n                    if (!this[privateKey]) {\n                        var pos = this[privateKey] = [];\n                        enhanceArray(this, pos);\n                    }\n                    return this[privateKey];\n                },\n                set: function (pos) {\n                    if (process.env.NODE_ENV !== 'production') {\n                        logDeprecatedError(key, xKey, yKey);\n                    }\n                    this[xKey] = pos[0];\n                    this[yKey] = pos[1];\n                    this[privateKey] = pos;\n                    enhanceArray(this, pos);\n                }\n            });\n            function enhanceArray(self, pos) {\n                Object.defineProperty(pos, 0, {\n                    get: function () {\n                        return self[xKey];\n                    },\n                    set: function (val) {\n                        self[xKey] = val;\n                    }\n                });\n                Object.defineProperty(pos, 1, {\n                    get: function () {\n                        return self[yKey];\n                    },\n                    set: function (val) {\n                        self[yKey] = val;\n                    }\n                });\n            }\n        }\n        if (Object.defineProperty) {\n            createLegacyProperty('position', '_legacyPos', 'x', 'y');\n            createLegacyProperty('scale', '_legacyScale', 'scaleX', 'scaleY');\n            createLegacyProperty('origin', '_legacyOrigin', 'originX', 'originY');\n        }\n    })();\n    return Element;\n}());\nmixin(Element, Eventful);\nmixin(Element, Transformable);\nfunction animateTo(animatable, target, cfg, animationProps, reverse) {\n    cfg = cfg || {};\n    var animators = [];\n    animateToShallow(animatable, '', animatable, target, cfg, animationProps, animators, reverse);\n    var finishCount = animators.length;\n    var doneHappened = false;\n    var cfgDone = cfg.done;\n    var cfgAborted = cfg.aborted;\n    var doneCb = function () {\n        doneHappened = true;\n        finishCount--;\n        if (finishCount <= 0) {\n            doneHappened\n                ? (cfgDone && cfgDone())\n                : (cfgAborted && cfgAborted());\n        }\n    };\n    var abortedCb = function () {\n        finishCount--;\n        if (finishCount <= 0) {\n            doneHappened\n                ? (cfgDone && cfgDone())\n                : (cfgAborted && cfgAborted());\n        }\n    };\n    if (!finishCount) {\n        cfgDone && cfgDone();\n    }\n    if (animators.length > 0 && cfg.during) {\n        animators[0].during(function (target, percent) {\n            cfg.during(percent);\n        });\n    }\n    for (var i = 0; i < animators.length; i++) {\n        var animator = animators[i];\n        if (doneCb) {\n            animator.done(doneCb);\n        }\n        if (abortedCb) {\n            animator.aborted(abortedCb);\n        }\n        if (cfg.force) {\n            animator.duration(cfg.duration);\n        }\n        animator.start(cfg.easing);\n    }\n    return animators;\n}\nfunction copyArrShallow(source, target, len) {\n    for (var i = 0; i < len; i++) {\n        source[i] = target[i];\n    }\n}\nfunction is2DArray(value) {\n    return isArrayLike(value[0]);\n}\nfunction copyValue(target, source, key) {\n    if (isArrayLike(source[key])) {\n        if (!isArrayLike(target[key])) {\n            target[key] = [];\n        }\n        if (isTypedArray(source[key])) {\n            var len = source[key].length;\n            if (target[key].length !== len) {\n                target[key] = new (source[key].constructor)(len);\n                copyArrShallow(target[key], source[key], len);\n            }\n        }\n        else {\n            var sourceArr = source[key];\n            var targetArr = target[key];\n            var len0 = sourceArr.length;\n            if (is2DArray(sourceArr)) {\n                var len1 = sourceArr[0].length;\n                for (var i = 0; i < len0; i++) {\n                    if (!targetArr[i]) {\n                        targetArr[i] = Array.prototype.slice.call(sourceArr[i]);\n                    }\n                    else {\n                        copyArrShallow(targetArr[i], sourceArr[i], len1);\n                    }\n                }\n            }\n            else {\n                copyArrShallow(targetArr, sourceArr, len0);\n            }\n            targetArr.length = sourceArr.length;\n        }\n    }\n    else {\n        target[key] = source[key];\n    }\n}\nfunction isValueSame(val1, val2) {\n    return val1 === val2\n        || isArrayLike(val1) && isArrayLike(val2) && is1DArraySame(val1, val2);\n}\nfunction is1DArraySame(arr0, arr1) {\n    var len = arr0.length;\n    if (len !== arr1.length) {\n        return false;\n    }\n    for (var i = 0; i < len; i++) {\n        if (arr0[i] !== arr1[i]) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction animateToShallow(animatable, topKey, animateObj, target, cfg, animationProps, animators, reverse) {\n    var targetKeys = keys(target);\n    var duration = cfg.duration;\n    var delay = cfg.delay;\n    var additive = cfg.additive;\n    var setToFinal = cfg.setToFinal;\n    var animateAll = !isObject(animationProps);\n    var existsAnimators = animatable.animators;\n    var animationKeys = [];\n    for (var k = 0; k < targetKeys.length; k++) {\n        var innerKey = targetKeys[k];\n        var targetVal = target[innerKey];\n        if (targetVal != null && animateObj[innerKey] != null\n            && (animateAll || animationProps[innerKey])) {\n            if (isObject(targetVal)\n                && !isArrayLike(targetVal)\n                && !isGradientObject(targetVal)) {\n                if (topKey) {\n                    if (!reverse) {\n                        animateObj[innerKey] = targetVal;\n                        animatable.updateDuringAnimation(topKey);\n                    }\n                    continue;\n                }\n                animateToShallow(animatable, innerKey, animateObj[innerKey], targetVal, cfg, animationProps && animationProps[innerKey], animators, reverse);\n            }\n            else {\n                animationKeys.push(innerKey);\n            }\n        }\n        else if (!reverse) {\n            animateObj[innerKey] = targetVal;\n            animatable.updateDuringAnimation(topKey);\n            animationKeys.push(innerKey);\n        }\n    }\n    var keyLen = animationKeys.length;\n    if (!additive && keyLen) {\n        for (var i = 0; i < existsAnimators.length; i++) {\n            var animator = existsAnimators[i];\n            if (animator.targetName === topKey) {\n                var allAborted = animator.stopTracks(animationKeys);\n                if (allAborted) {\n                    var idx = indexOf(existsAnimators, animator);\n                    existsAnimators.splice(idx, 1);\n                }\n            }\n        }\n    }\n    if (!cfg.force) {\n        animationKeys = filter(animationKeys, function (key) { return !isValueSame(target[key], animateObj[key]); });\n        keyLen = animationKeys.length;\n    }\n    if (keyLen > 0\n        || (cfg.force && !animators.length)) {\n        var revertedSource = void 0;\n        var reversedTarget = void 0;\n        var sourceClone = void 0;\n        if (reverse) {\n            reversedTarget = {};\n            if (setToFinal) {\n                revertedSource = {};\n            }\n            for (var i = 0; i < keyLen; i++) {\n                var innerKey = animationKeys[i];\n                reversedTarget[innerKey] = animateObj[innerKey];\n                if (setToFinal) {\n                    revertedSource[innerKey] = target[innerKey];\n                }\n                else {\n                    animateObj[innerKey] = target[innerKey];\n                }\n            }\n        }\n        else if (setToFinal) {\n            sourceClone = {};\n            for (var i = 0; i < keyLen; i++) {\n                var innerKey = animationKeys[i];\n                sourceClone[innerKey] = cloneValue(animateObj[innerKey]);\n                copyValue(animateObj, target, innerKey);\n            }\n        }\n        var animator = new Animator(animateObj, false, false, additive ? filter(existsAnimators, function (animator) { return animator.targetName === topKey; }) : null);\n        animator.targetName = topKey;\n        if (cfg.scope) {\n            animator.scope = cfg.scope;\n        }\n        if (setToFinal && revertedSource) {\n            animator.whenWithKeys(0, revertedSource, animationKeys);\n        }\n        if (sourceClone) {\n            animator.whenWithKeys(0, sourceClone, animationKeys);\n        }\n        animator.whenWithKeys(duration == null ? 500 : duration, reverse ? reversedTarget : target, animationKeys).delay(delay || 0);\n        animatable.addAnimator(animator, topKey);\n        animators.push(animator);\n    }\n}\nexport default Element;\n", "import { __extends } from \"tslib\";\nimport * as zrUtil from '../core/util.js';\nimport Element from '../Element.js';\nimport BoundingRect from '../core/BoundingRect.js';\nvar Group = (function (_super) {\n    __extends(Group, _super);\n    function Group(opts) {\n        var _this = _super.call(this) || this;\n        _this.isGroup = true;\n        _this._children = [];\n        _this.attr(opts);\n        return _this;\n    }\n    Group.prototype.childrenRef = function () {\n        return this._children;\n    };\n    Group.prototype.children = function () {\n        return this._children.slice();\n    };\n    Group.prototype.childAt = function (idx) {\n        return this._children[idx];\n    };\n    Group.prototype.childOfName = function (name) {\n        var children = this._children;\n        for (var i = 0; i < children.length; i++) {\n            if (children[i].name === name) {\n                return children[i];\n            }\n        }\n    };\n    Group.prototype.childCount = function () {\n        return this._children.length;\n    };\n    Group.prototype.add = function (child) {\n        if (child) {\n            if (child !== this && child.parent !== this) {\n                this._children.push(child);\n                this._doAdd(child);\n            }\n            if (process.env.NODE_ENV !== 'production') {\n                if (child.__hostTarget) {\n                    throw 'This elemenet has been used as an attachment';\n                }\n            }\n        }\n        return this;\n    };\n    Group.prototype.addBefore = function (child, nextSibling) {\n        if (child && child !== this && child.parent !== this\n            && nextSibling && nextSibling.parent === this) {\n            var children = this._children;\n            var idx = children.indexOf(nextSibling);\n            if (idx >= 0) {\n                children.splice(idx, 0, child);\n                this._doAdd(child);\n            }\n        }\n        return this;\n    };\n    Group.prototype.replace = function (oldChild, newChild) {\n        var idx = zrUtil.indexOf(this._children, oldChild);\n        if (idx >= 0) {\n            this.replaceAt(newChild, idx);\n        }\n        return this;\n    };\n    Group.prototype.replaceAt = function (child, index) {\n        var children = this._children;\n        var old = children[index];\n        if (child && child !== this && child.parent !== this && child !== old) {\n            children[index] = child;\n            old.parent = null;\n            var zr = this.__zr;\n            if (zr) {\n                old.removeSelfFromZr(zr);\n            }\n            this._doAdd(child);\n        }\n        return this;\n    };\n    Group.prototype._doAdd = function (child) {\n        if (child.parent) {\n            child.parent.remove(child);\n        }\n        child.parent = this;\n        var zr = this.__zr;\n        if (zr && zr !== child.__zr) {\n            child.addSelfToZr(zr);\n        }\n        zr && zr.refresh();\n    };\n    Group.prototype.remove = function (child) {\n        var zr = this.__zr;\n        var children = this._children;\n        var idx = zrUtil.indexOf(children, child);\n        if (idx < 0) {\n            return this;\n        }\n        children.splice(idx, 1);\n        child.parent = null;\n        if (zr) {\n            child.removeSelfFromZr(zr);\n        }\n        zr && zr.refresh();\n        return this;\n    };\n    Group.prototype.removeAll = function () {\n        var children = this._children;\n        var zr = this.__zr;\n        for (var i = 0; i < children.length; i++) {\n            var child = children[i];\n            if (zr) {\n                child.removeSelfFromZr(zr);\n            }\n            child.parent = null;\n        }\n        children.length = 0;\n        return this;\n    };\n    Group.prototype.eachChild = function (cb, context) {\n        var children = this._children;\n        for (var i = 0; i < children.length; i++) {\n            var child = children[i];\n            cb.call(context, child, i);\n        }\n        return this;\n    };\n    Group.prototype.traverse = function (cb, context) {\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            var stopped = cb.call(context, child);\n            if (child.isGroup && !stopped) {\n                child.traverse(cb, context);\n            }\n        }\n        return this;\n    };\n    Group.prototype.addSelfToZr = function (zr) {\n        _super.prototype.addSelfToZr.call(this, zr);\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            child.addSelfToZr(zr);\n        }\n    };\n    Group.prototype.removeSelfFromZr = function (zr) {\n        _super.prototype.removeSelfFromZr.call(this, zr);\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            child.removeSelfFromZr(zr);\n        }\n    };\n    Group.prototype.getBoundingRect = function (includeChildren) {\n        var tmpRect = new BoundingRect(0, 0, 0, 0);\n        var children = includeChildren || this._children;\n        var tmpMat = [];\n        var rect = null;\n        for (var i = 0; i < children.length; i++) {\n            var child = children[i];\n            if (child.ignore || child.invisible) {\n                continue;\n            }\n            var childRect = child.getBoundingRect();\n            var transform = child.getLocalTransform(tmpMat);\n            if (transform) {\n                BoundingRect.applyTransform(tmpRect, childRect, transform);\n                rect = rect || tmpRect.clone();\n                rect.union(tmpRect);\n            }\n            else {\n                rect = rect || childRect.clone();\n                rect.union(childRect);\n            }\n        }\n        return rect || tmpRect;\n    };\n    return Group;\n}(Element));\nGroup.prototype.type = 'group';\nexport default Group;\n", "/*!\n* ZRender, a high performance 2d drawing library.\n*\n* Copyright (c) 2013, Baidu Inc.\n* All rights reserved.\n*\n* LICENSE\n* https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n*/\nimport env from './core/env.js';\nimport * as zrUtil from './core/util.js';\nimport Handler from './Handler.js';\nimport Storage from './Storage.js';\nimport Animation, { getTime } from './animation/Animation.js';\nimport HandlerProxy from './dom/HandlerProxy.js';\nimport { lum } from './tool/color.js';\nimport { DARK_MODE_THRESHOLD } from './config.js';\nimport Group from './graphic/Group.js';\nvar painterCtors = {};\nvar instances = {};\nfunction delInstance(id) {\n    delete instances[id];\n}\nfunction isDarkMode(backgroundColor) {\n    if (!backgroundColor) {\n        return false;\n    }\n    if (typeof backgroundColor === 'string') {\n        return lum(backgroundColor, 1) < DARK_MODE_THRESHOLD;\n    }\n    else if (backgroundColor.colorStops) {\n        var colorStops = backgroundColor.colorStops;\n        var totalLum = 0;\n        var len = colorStops.length;\n        for (var i = 0; i < len; i++) {\n            totalLum += lum(colorStops[i].color, 1);\n        }\n        totalLum /= len;\n        return totalLum < DARK_MODE_THRESHOLD;\n    }\n    return false;\n}\nvar ZRender = (function () {\n    function ZRender(id, dom, opts) {\n        var _this = this;\n        this._sleepAfterStill = 10;\n        this._stillFrameAccum = 0;\n        this._needsRefresh = true;\n        this._needsRefreshHover = true;\n        this._darkMode = false;\n        opts = opts || {};\n        this.dom = dom;\n        this.id = id;\n        var storage = new Storage();\n        var rendererType = opts.renderer || 'canvas';\n        if (!painterCtors[rendererType]) {\n            rendererType = zrUtil.keys(painterCtors)[0];\n        }\n        if (process.env.NODE_ENV !== 'production') {\n            if (!painterCtors[rendererType]) {\n                throw new Error(\"Renderer '\" + rendererType + \"' is not imported. Please import it first.\");\n            }\n        }\n        opts.useDirtyRect = opts.useDirtyRect == null\n            ? false\n            : opts.useDirtyRect;\n        var painter = new painterCtors[rendererType](dom, storage, opts, id);\n        var ssrMode = opts.ssr || painter.ssrOnly;\n        this.storage = storage;\n        this.painter = painter;\n        var handlerProxy = (!env.node && !env.worker && !ssrMode)\n            ? new HandlerProxy(painter.getViewportRoot(), painter.root)\n            : null;\n        var useCoarsePointer = opts.useCoarsePointer;\n        var usePointerSize = (useCoarsePointer == null || useCoarsePointer === 'auto')\n            ? env.touchEventsSupported\n            : !!useCoarsePointer;\n        var defaultPointerSize = 44;\n        var pointerSize;\n        if (usePointerSize) {\n            pointerSize = zrUtil.retrieve2(opts.pointerSize, defaultPointerSize);\n        }\n        this.handler = new Handler(storage, painter, handlerProxy, painter.root, pointerSize);\n        this.animation = new Animation({\n            stage: {\n                update: ssrMode ? null : function () { return _this._flush(true); }\n            }\n        });\n        if (!ssrMode) {\n            this.animation.start();\n        }\n    }\n    ZRender.prototype.add = function (el) {\n        if (this._disposed || !el) {\n            return;\n        }\n        this.storage.addRoot(el);\n        el.addSelfToZr(this);\n        this.refresh();\n    };\n    ZRender.prototype.remove = function (el) {\n        if (this._disposed || !el) {\n            return;\n        }\n        this.storage.delRoot(el);\n        el.removeSelfFromZr(this);\n        this.refresh();\n    };\n    ZRender.prototype.configLayer = function (zLevel, config) {\n        if (this._disposed) {\n            return;\n        }\n        if (this.painter.configLayer) {\n            this.painter.configLayer(zLevel, config);\n        }\n        this.refresh();\n    };\n    ZRender.prototype.setBackgroundColor = function (backgroundColor) {\n        if (this._disposed) {\n            return;\n        }\n        if (this.painter.setBackgroundColor) {\n            this.painter.setBackgroundColor(backgroundColor);\n        }\n        this.refresh();\n        this._backgroundColor = backgroundColor;\n        this._darkMode = isDarkMode(backgroundColor);\n    };\n    ZRender.prototype.getBackgroundColor = function () {\n        return this._backgroundColor;\n    };\n    ZRender.prototype.setDarkMode = function (darkMode) {\n        this._darkMode = darkMode;\n    };\n    ZRender.prototype.isDarkMode = function () {\n        return this._darkMode;\n    };\n    ZRender.prototype.refreshImmediately = function (fromInside) {\n        if (this._disposed) {\n            return;\n        }\n        if (!fromInside) {\n            this.animation.update(true);\n        }\n        this._needsRefresh = false;\n        this.painter.refresh();\n        this._needsRefresh = false;\n    };\n    ZRender.prototype.refresh = function () {\n        if (this._disposed) {\n            return;\n        }\n        this._needsRefresh = true;\n        this.animation.start();\n    };\n    ZRender.prototype.flush = function () {\n        if (this._disposed) {\n            return;\n        }\n        this._flush(false);\n    };\n    ZRender.prototype._flush = function (fromInside) {\n        var triggerRendered;\n        var start = getTime();\n        if (this._needsRefresh) {\n            triggerRendered = true;\n            this.refreshImmediately(fromInside);\n        }\n        if (this._needsRefreshHover) {\n            triggerRendered = true;\n            this.refreshHoverImmediately();\n        }\n        var end = getTime();\n        if (triggerRendered) {\n            this._stillFrameAccum = 0;\n            this.trigger('rendered', {\n                elapsedTime: end - start\n            });\n        }\n        else if (this._sleepAfterStill > 0) {\n            this._stillFrameAccum++;\n            if (this._stillFrameAccum > this._sleepAfterStill) {\n                this.animation.stop();\n            }\n        }\n    };\n    ZRender.prototype.setSleepAfterStill = function (stillFramesCount) {\n        this._sleepAfterStill = stillFramesCount;\n    };\n    ZRender.prototype.wakeUp = function () {\n        if (this._disposed) {\n            return;\n        }\n        this.animation.start();\n        this._stillFrameAccum = 0;\n    };\n    ZRender.prototype.refreshHover = function () {\n        this._needsRefreshHover = true;\n    };\n    ZRender.prototype.refreshHoverImmediately = function () {\n        if (this._disposed) {\n            return;\n        }\n        this._needsRefreshHover = false;\n        if (this.painter.refreshHover && this.painter.getType() === 'canvas') {\n            this.painter.refreshHover();\n        }\n    };\n    ZRender.prototype.resize = function (opts) {\n        if (this._disposed) {\n            return;\n        }\n        opts = opts || {};\n        this.painter.resize(opts.width, opts.height);\n        this.handler.resize();\n    };\n    ZRender.prototype.clearAnimation = function () {\n        if (this._disposed) {\n            return;\n        }\n        this.animation.clear();\n    };\n    ZRender.prototype.getWidth = function () {\n        if (this._disposed) {\n            return;\n        }\n        return this.painter.getWidth();\n    };\n    ZRender.prototype.getHeight = function () {\n        if (this._disposed) {\n            return;\n        }\n        return this.painter.getHeight();\n    };\n    ZRender.prototype.setCursorStyle = function (cursorStyle) {\n        if (this._disposed) {\n            return;\n        }\n        this.handler.setCursorStyle(cursorStyle);\n    };\n    ZRender.prototype.findHover = function (x, y) {\n        if (this._disposed) {\n            return;\n        }\n        return this.handler.findHover(x, y);\n    };\n    ZRender.prototype.on = function (eventName, eventHandler, context) {\n        if (!this._disposed) {\n            this.handler.on(eventName, eventHandler, context);\n        }\n        return this;\n    };\n    ZRender.prototype.off = function (eventName, eventHandler) {\n        if (this._disposed) {\n            return;\n        }\n        this.handler.off(eventName, eventHandler);\n    };\n    ZRender.prototype.trigger = function (eventName, event) {\n        if (this._disposed) {\n            return;\n        }\n        this.handler.trigger(eventName, event);\n    };\n    ZRender.prototype.clear = function () {\n        if (this._disposed) {\n            return;\n        }\n        var roots = this.storage.getRoots();\n        for (var i = 0; i < roots.length; i++) {\n            if (roots[i] instanceof Group) {\n                roots[i].removeSelfFromZr(this);\n            }\n        }\n        this.storage.delAllRoots();\n        this.painter.clear();\n    };\n    ZRender.prototype.dispose = function () {\n        if (this._disposed) {\n            return;\n        }\n        this.animation.stop();\n        this.clear();\n        this.storage.dispose();\n        this.painter.dispose();\n        this.handler.dispose();\n        this.animation =\n            this.storage =\n                this.painter =\n                    this.handler = null;\n        this._disposed = true;\n        delInstance(this.id);\n    };\n    return ZRender;\n}());\nexport function init(dom, opts) {\n    var zr = new ZRender(zrUtil.guid(), dom, opts);\n    instances[zr.id] = zr;\n    return zr;\n}\nexport function dispose(zr) {\n    zr.dispose();\n}\nexport function disposeAll() {\n    for (var key in instances) {\n        if (instances.hasOwnProperty(key)) {\n            instances[key].dispose();\n        }\n    }\n    instances = {};\n}\nexport function getInstance(id) {\n    return instances[id];\n}\nexport function registerPainter(name, Ctor) {\n    painterCtors[name] = Ctor;\n}\nvar ssrDataGetter;\nexport function getElementSSRData(el) {\n    if (typeof ssrDataGetter === 'function') {\n        return ssrDataGetter(el);\n    }\n}\nexport function registerSSRDataGetter(getter) {\n    ssrDataGetter = getter;\n}\nexport var version = '6.0.0';\n;\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/*\n* A third-party license is embedded for some of the code in this file:\n* The method \"quantile\" was copied from \"d3.js\".\n* (See more details in the comment of the method below.)\n* The use of the source code of this file is also subject to the terms\n* and consitions of the license of \"d3.js\" (BSD-3Clause, see\n* </licenses/LICENSE-d3>).\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar RADIAN_EPSILON = 1e-4;\n// Although chrome already enlarge this number to 100 for `toFixed`, but\n// we sill follow the spec for compatibility.\nvar ROUND_SUPPORTED_PRECISION_MAX = 20;\nfunction _trim(str) {\n  return str.replace(/^\\s+|\\s+$/g, '');\n}\nexport var mathMin = Math.min;\nexport var mathMax = Math.max;\nexport var mathAbs = Math.abs;\n/**\n * Linear mapping a value from domain to range\n * @param  val\n * @param  domain Domain extent domain[0] can be bigger than domain[1]\n * @param  range  Range extent range[0] can be bigger than range[1]\n * @param  clamp Default to be false\n */\nexport function linearMap(val, domain, range, clamp) {\n  var d0 = domain[0];\n  var d1 = domain[1];\n  var r0 = range[0];\n  var r1 = range[1];\n  var subDomain = d1 - d0;\n  var subRange = r1 - r0;\n  if (subDomain === 0) {\n    return subRange === 0 ? r0 : (r0 + r1) / 2;\n  }\n  // Avoid accuracy problem in edge, such as\n  // 146.39 - 62.83 === 83.55999999999999.\n  // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError\n  // It is a little verbose for efficiency considering this method\n  // is a hotspot.\n  if (clamp) {\n    if (subDomain > 0) {\n      if (val <= d0) {\n        return r0;\n      } else if (val >= d1) {\n        return r1;\n      }\n    } else {\n      if (val >= d0) {\n        return r0;\n      } else if (val <= d1) {\n        return r1;\n      }\n    }\n  } else {\n    if (val === d0) {\n      return r0;\n    }\n    if (val === d1) {\n      return r1;\n    }\n  }\n  return (val - d0) / subDomain * subRange + r0;\n}\n/**\n * Preserve the name `parsePercent` for backward compatibility,\n * and it's effectively published as `echarts.number.parsePercent`.\n */\nexport var parsePercent = parsePositionOption;\n/**\n * @see {parsePositionSizeOption} and also accept a string preset.\n * @see {PositionSizeOption}\n */\nexport function parsePositionOption(option, percentBase, percentOffset) {\n  switch (option) {\n    case 'center':\n    case 'middle':\n      option = '50%';\n      break;\n    case 'left':\n    case 'top':\n      option = '0%';\n      break;\n    case 'right':\n    case 'bottom':\n      option = '100%';\n      break;\n  }\n  return parsePositionSizeOption(option, percentBase, percentOffset);\n}\n/**\n * Accept number, or numeric stirng (`'123'`), or percentage ('100%'), as x/y/width/height pixel number.\n * If null/undefined or invalid, return NaN.\n * (But allow JS type coercion (`+option`) due to backward compatibility)\n * @see {PositionSizeOption}\n */\nexport function parsePositionSizeOption(option, percentBase, percentOffset) {\n  if (zrUtil.isString(option)) {\n    if (_trim(option).match(/%$/)) {\n      return parseFloat(option) / 100 * percentBase + (percentOffset || 0);\n    }\n    return parseFloat(option);\n  }\n  // Allow flexible input due to backward compatibility.\n  return option == null ? NaN : +option;\n}\nexport function round(x, precision, returnStr) {\n  if (precision == null) {\n    // FIXME: the default precision should not be provided, since there is no universally adaptable\n    //  precision. The caller need to input a precision according to the scenarios.\n    precision = 10;\n  }\n  // Avoid range error\n  precision = Math.min(Math.max(0, precision), ROUND_SUPPORTED_PRECISION_MAX);\n  // PENDING: 1.005.toFixed(2) is '1.00' rather than '1.01'\n  x = (+x).toFixed(precision);\n  return returnStr ? x : +x;\n}\n/**\n * Inplacd asc sort arr.\n * The input arr will be modified.\n */\nexport function asc(arr) {\n  arr.sort(function (a, b) {\n    return a - b;\n  });\n  return arr;\n}\n/**\n * Get precision.\n */\nexport function getPrecision(val) {\n  val = +val;\n  if (isNaN(val)) {\n    return 0;\n  }\n  // It is much faster than methods converting number to string as follows\n  //      let tmp = val.toString();\n  //      return tmp.length - 1 - tmp.indexOf('.');\n  // especially when precision is low\n  // Notice:\n  // (1) If the loop count is over about 20, it is slower than `getPrecisionSafe`.\n  //     (see https://jsbench.me/2vkpcekkvw/1)\n  // (2) If the val is less than for example 1e-15, the result may be incorrect.\n  //     (see test/ut/spec/util/number.test.ts `getPrecision_equal_random`)\n  if (val > 1e-14) {\n    var e = 1;\n    for (var i = 0; i < 15; i++, e *= 10) {\n      if (Math.round(val * e) / e === val) {\n        return i;\n      }\n    }\n  }\n  return getPrecisionSafe(val);\n}\n/**\n * Get precision with slow but safe method\n */\nexport function getPrecisionSafe(val) {\n  // toLowerCase for: '3.4E-12'\n  var str = val.toString().toLowerCase();\n  // Consider scientific notation: '3.4e-12' '3.4e+12'\n  var eIndex = str.indexOf('e');\n  var exp = eIndex > 0 ? +str.slice(eIndex + 1) : 0;\n  var significandPartLen = eIndex > 0 ? eIndex : str.length;\n  var dotIndex = str.indexOf('.');\n  var decimalPartLen = dotIndex < 0 ? 0 : significandPartLen - 1 - dotIndex;\n  return Math.max(0, decimalPartLen - exp);\n}\n/**\n * Minimal dicernible data precisioin according to a single pixel.\n */\nexport function getPixelPrecision(dataExtent, pixelExtent) {\n  var log = Math.log;\n  var LN10 = Math.LN10;\n  var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10);\n  var sizeQuantity = Math.round(log(mathAbs(pixelExtent[1] - pixelExtent[0])) / LN10);\n  // toFixed() digits argument must be between 0 and 20.\n  var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);\n  return !isFinite(precision) ? 20 : precision;\n}\n/**\n * Get a data of given precision, assuring the sum of percentages\n * in valueList is 1.\n * The largest remainder method is used.\n * https://en.wikipedia.org/wiki/Largest_remainder_method\n *\n * @param valueList a list of all data\n * @param idx index of the data to be processed in valueList\n * @param precision integer number showing digits of precision\n * @return percent ranging from 0 to 100\n */\nexport function getPercentWithPrecision(valueList, idx, precision) {\n  if (!valueList[idx]) {\n    return 0;\n  }\n  var seats = getPercentSeats(valueList, precision);\n  return seats[idx] || 0;\n}\n/**\n * Get a data of given precision, assuring the sum of percentages\n * in valueList is 1.\n * The largest remainder method is used.\n * https://en.wikipedia.org/wiki/Largest_remainder_method\n *\n * @param valueList a list of all data\n * @param precision integer number showing digits of precision\n * @return {Array<number>}\n */\nexport function getPercentSeats(valueList, precision) {\n  var sum = zrUtil.reduce(valueList, function (acc, val) {\n    return acc + (isNaN(val) ? 0 : val);\n  }, 0);\n  if (sum === 0) {\n    return [];\n  }\n  var digits = Math.pow(10, precision);\n  var votesPerQuota = zrUtil.map(valueList, function (val) {\n    return (isNaN(val) ? 0 : val) / sum * digits * 100;\n  });\n  var targetSeats = digits * 100;\n  var seats = zrUtil.map(votesPerQuota, function (votes) {\n    // Assign automatic seats.\n    return Math.floor(votes);\n  });\n  var currentSum = zrUtil.reduce(seats, function (acc, val) {\n    return acc + val;\n  }, 0);\n  var remainder = zrUtil.map(votesPerQuota, function (votes, idx) {\n    return votes - seats[idx];\n  });\n  // Has remainding votes.\n  while (currentSum < targetSeats) {\n    // Find next largest remainder.\n    var max = Number.NEGATIVE_INFINITY;\n    var maxId = null;\n    for (var i = 0, len = remainder.length; i < len; ++i) {\n      if (remainder[i] > max) {\n        max = remainder[i];\n        maxId = i;\n      }\n    }\n    // Add a vote to max remainder.\n    ++seats[maxId];\n    remainder[maxId] = 0;\n    ++currentSum;\n  }\n  return zrUtil.map(seats, function (seat) {\n    return seat / digits;\n  });\n}\n/**\n * Solve the floating point adding problem like 0.1 + 0.2 === 0.30000000000000004\n * See <http://0.30000000000000004.com/>\n */\nexport function addSafe(val0, val1) {\n  var maxPrecision = Math.max(getPrecision(val0), getPrecision(val1));\n  // const multiplier = Math.pow(10, maxPrecision);\n  // return (Math.round(val0 * multiplier) + Math.round(val1 * multiplier)) / multiplier;\n  var sum = val0 + val1;\n  // // PENDING: support more?\n  return maxPrecision > ROUND_SUPPORTED_PRECISION_MAX ? sum : round(sum, maxPrecision);\n}\n// Number.MAX_SAFE_INTEGER, ie do not support.\nexport var MAX_SAFE_INTEGER = 9007199254740991;\n/**\n * To 0 - 2 * PI, considering negative radian.\n */\nexport function remRadian(radian) {\n  var pi2 = Math.PI * 2;\n  return (radian % pi2 + pi2) % pi2;\n}\n/**\n * @param {type} radian\n * @return {boolean}\n */\nexport function isRadianAroundZero(val) {\n  return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;\n}\n// eslint-disable-next-line\nvar TIME_REG = /^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2})(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/; // jshint ignore:line\n/**\n * @param value valid type: number | string | Date, otherwise return `new Date(NaN)`\n *   These values can be accepted:\n *   + An instance of Date, represent a time in its own time zone.\n *   + Or string in a subset of ISO 8601, only including:\n *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',\n *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',\n *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',\n *     all of which will be treated as local time if time zone is not specified\n *     (see <https://momentjs.com/>).\n *   + Or other string format, including (all of which will be treated as local time):\n *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',\n *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'\n *   + a timestamp, which represent a time in UTC.\n * @return date Never be null/undefined. If invalid, return `new Date(NaN)`.\n */\nexport function parseDate(value) {\n  if (value instanceof Date) {\n    return value;\n  } else if (zrUtil.isString(value)) {\n    // Different browsers parse date in different way, so we parse it manually.\n    // Some other issues:\n    // new Date('1970-01-01') is UTC,\n    // new Date('1970/01/01') and new Date('1970-1-01') is local.\n    // See issue #3623\n    var match = TIME_REG.exec(value);\n    if (!match) {\n      // return Invalid Date.\n      return new Date(NaN);\n    }\n    // Use local time when no timezone offset is specified.\n    if (!match[8]) {\n      // match[n] can only be string or undefined.\n      // But take care of '12' + 1 => '121'.\n      return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0);\n    }\n    // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time,\n    // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment).\n    // For example, system timezone is set as \"Time Zone: America/Toronto\",\n    // then these code will get different result:\n    // `new Date(1478411999999).getTimezoneOffset();  // get 240`\n    // `new Date(1478412000000).getTimezoneOffset();  // get 300`\n    // So we should not use `new Date`, but use `Date.UTC`.\n    else {\n      var hour = +match[4] || 0;\n      if (match[8].toUpperCase() !== 'Z') {\n        hour -= +match[8].slice(0, 3);\n      }\n      return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, match[7] ? +match[7].substring(0, 3) : 0));\n    }\n  } else if (value == null) {\n    return new Date(NaN);\n  }\n  return new Date(Math.round(value));\n}\n/**\n * Quantity of a number. e.g. 0.1, 1, 10, 100\n *\n * @param val\n * @return\n */\nexport function quantity(val) {\n  return Math.pow(10, quantityExponent(val));\n}\n/**\n * Exponent of the quantity of a number\n * e.g., 1234 equals to 1.234*10^3, so quantityExponent(1234) is 3\n *\n * @param val non-negative value\n * @return\n */\nexport function quantityExponent(val) {\n  if (val === 0) {\n    return 0;\n  }\n  var exp = Math.floor(Math.log(val) / Math.LN10);\n  /**\n   * exp is expected to be the rounded-down result of the base-10 log of val.\n   * But due to the precision loss with Math.log(val), we need to restore it\n   * using 10^exp to make sure we can get val back from exp. #11249\n   */\n  if (val / Math.pow(10, exp) >= 10) {\n    exp++;\n  }\n  return exp;\n}\n/**\n * find a \u201Cnice\u201D number approximately equal to x. Round the number if round = true,\n * take ceiling if round = false. The primary observation is that the \u201Cnicest\u201D\n * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.\n *\n * See \"Nice Numbers for Graph Labels\" of Graphic Gems.\n *\n * @param  val Non-negative value.\n * @param  round\n * @return Niced number\n */\nexport function nice(val, round) {\n  var exponent = quantityExponent(val);\n  var exp10 = Math.pow(10, exponent);\n  var f = val / exp10; // 1 <= f < 10\n  var nf;\n  if (round) {\n    if (f < 1.5) {\n      nf = 1;\n    } else if (f < 2.5) {\n      nf = 2;\n    } else if (f < 4) {\n      nf = 3;\n    } else if (f < 7) {\n      nf = 5;\n    } else {\n      nf = 10;\n    }\n  } else {\n    if (f < 1) {\n      nf = 1;\n    } else if (f < 2) {\n      nf = 2;\n    } else if (f < 3) {\n      nf = 3;\n    } else if (f < 5) {\n      nf = 5;\n    } else {\n      nf = 10;\n    }\n  }\n  val = nf * exp10;\n  // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754).\n  // 20 is the uppper bound of toFixed.\n  return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;\n}\n/**\n * This code was copied from \"d3.js\"\n * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/arrays/quantile.js>.\n * See the license statement at the head of this file.\n * @param ascArr\n */\nexport function quantile(ascArr, p) {\n  var H = (ascArr.length - 1) * p + 1;\n  var h = Math.floor(H);\n  var v = +ascArr[h - 1];\n  var e = H - h;\n  return e ? v + e * (ascArr[h] - v) : v;\n}\n/**\n * Order intervals asc, and split them when overlap.\n * expect(numberUtil.reformIntervals([\n *     {interval: [18, 62], close: [1, 1]},\n *     {interval: [-Infinity, -70], close: [0, 0]},\n *     {interval: [-70, -26], close: [1, 1]},\n *     {interval: [-26, 18], close: [1, 1]},\n *     {interval: [62, 150], close: [1, 1]},\n *     {interval: [106, 150], close: [1, 1]},\n *     {interval: [150, Infinity], close: [0, 0]}\n * ])).toEqual([\n *     {interval: [-Infinity, -70], close: [0, 0]},\n *     {interval: [-70, -26], close: [1, 1]},\n *     {interval: [-26, 18], close: [0, 1]},\n *     {interval: [18, 62], close: [0, 1]},\n *     {interval: [62, 150], close: [0, 1]},\n *     {interval: [150, Infinity], close: [0, 0]}\n * ]);\n * @param list, where `close` mean open or close\n *        of the interval, and Infinity can be used.\n * @return The origin list, which has been reformed.\n */\nexport function reformIntervals(list) {\n  list.sort(function (a, b) {\n    return littleThan(a, b, 0) ? -1 : 1;\n  });\n  var curr = -Infinity;\n  var currClose = 1;\n  for (var i = 0; i < list.length;) {\n    var interval = list[i].interval;\n    var close_1 = list[i].close;\n    for (var lg = 0; lg < 2; lg++) {\n      if (interval[lg] <= curr) {\n        interval[lg] = curr;\n        close_1[lg] = !lg ? 1 - currClose : 1;\n      }\n      curr = interval[lg];\n      currClose = close_1[lg];\n    }\n    if (interval[0] === interval[1] && close_1[0] * close_1[1] !== 1) {\n      list.splice(i, 1);\n    } else {\n      i++;\n    }\n  }\n  return list;\n  function littleThan(a, b, lg) {\n    return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1));\n  }\n}\n/**\n * [Numeric is defined as]:\n *     `parseFloat(val) == val`\n * For example:\n * numeric:\n *     typeof number except NaN, '-123', '123', '2e3', '-2e3', '011', 'Infinity', Infinity,\n *     and they rounded by white-spaces or line-terminal like ' -123 \\n ' (see es spec)\n * not-numeric:\n *     null, undefined, [], {}, true, false, 'NaN', NaN, '123ab',\n *     empty string, string with only white-spaces or line-terminal (see es spec),\n *     0x12, '0x12', '-0x12', 012, '012', '-012',\n *     non-string, ...\n *\n * @test See full test cases in `test/ut/spec/util/number.js`.\n * @return Must be a typeof number. If not numeric, return NaN.\n */\nexport function numericToNumber(val) {\n  var valFloat = parseFloat(val);\n  return valFloat == val // eslint-disable-line eqeqeq\n  && (valFloat !== 0 || !zrUtil.isString(val) || val.indexOf('x') <= 0) // For case ' 0x0 '.\n  ? valFloat : NaN;\n}\n/**\n * Definition of \"numeric\": see `numericToNumber`.\n */\nexport function isNumeric(val) {\n  return !isNaN(numericToNumber(val));\n}\n/**\n * Use random base to prevent users hard code depending on\n * this auto generated marker id.\n * @return An positive integer.\n */\nexport function getRandomIdBase() {\n  return Math.round(Math.random() * 9);\n}\n/**\n * Get the greatest common divisor.\n *\n * @param {number} a one number\n * @param {number} b the other number\n */\nexport function getGreatestCommonDividor(a, b) {\n  if (b === 0) {\n    return a;\n  }\n  return getGreatestCommonDividor(b, a % b);\n}\n/**\n * Get the least common multiple.\n *\n * @param {number} a one number\n * @param {number} b the other number\n */\nexport function getLeastCommonMultiple(a, b) {\n  if (a == null) {\n    return b;\n  }\n  if (b == null) {\n    return a;\n  }\n  return a * b / getGreatestCommonDividor(a, b);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { map, isString, isFunction, eqNaN, isRegExp } from 'zrender/lib/core/util.js';\nvar ECHARTS_PREFIX = '[ECharts] ';\nvar storedLogs = {};\nvar hasConsole = typeof console !== 'undefined'\n// eslint-disable-next-line\n&& console.warn && console.log;\nfunction outputLog(type, str, onlyOnce) {\n  if (hasConsole) {\n    if (onlyOnce) {\n      if (storedLogs[str]) {\n        return;\n      }\n      storedLogs[str] = true;\n    }\n    // eslint-disable-next-line\n    console[type](ECHARTS_PREFIX + str);\n  }\n}\nexport function log(str, onlyOnce) {\n  outputLog('log', str, onlyOnce);\n}\nexport function warn(str, onlyOnce) {\n  outputLog('warn', str, onlyOnce);\n}\nexport function error(str, onlyOnce) {\n  outputLog('error', str, onlyOnce);\n}\nexport function deprecateLog(str) {\n  if (process.env.NODE_ENV !== 'production') {\n    // Not display duplicate message.\n    outputLog('warn', 'DEPRECATED: ' + str, true);\n  }\n}\nexport function deprecateReplaceLog(oldOpt, newOpt, scope) {\n  if (process.env.NODE_ENV !== 'production') {\n    deprecateLog((scope ? \"[\" + scope + \"]\" : '') + (oldOpt + \" is deprecated; use \" + newOpt + \" instead.\"));\n  }\n}\n/**\n * If in __DEV__ environment, get console printable message for users hint.\n * Parameters are separated by ' '.\n * @usage\n * makePrintable('This is an error on', someVar, someObj);\n *\n * @param hintInfo anything about the current execution context to hint users.\n * @throws Error\n */\nexport function makePrintable() {\n  var hintInfo = [];\n  for (var _i = 0; _i < arguments.length; _i++) {\n    hintInfo[_i] = arguments[_i];\n  }\n  var msg = '';\n  if (process.env.NODE_ENV !== 'production') {\n    // Fuzzy stringify for print.\n    // This code only exist in dev environment.\n    var makePrintableStringIfPossible_1 = function (val) {\n      return val === void 0 ? 'undefined' : val === Infinity ? 'Infinity' : val === -Infinity ? '-Infinity' : eqNaN(val) ? 'NaN' : val instanceof Date ? 'Date(' + val.toISOString() + ')' : isFunction(val) ? 'function () { ... }' : isRegExp(val) ? val + '' : null;\n    };\n    msg = map(hintInfo, function (arg) {\n      if (isString(arg)) {\n        // Print without quotation mark for some statement.\n        return arg;\n      } else {\n        var printableStr = makePrintableStringIfPossible_1(arg);\n        if (printableStr != null) {\n          return printableStr;\n        } else if (typeof JSON !== 'undefined' && JSON.stringify) {\n          try {\n            return JSON.stringify(arg, function (n, val) {\n              var printableStr = makePrintableStringIfPossible_1(val);\n              return printableStr == null ? val : printableStr;\n            });\n            // In most cases the info object is small, so do not line break.\n          } catch (err) {\n            return '?';\n          }\n        } else {\n          return '?';\n        }\n      }\n    }).join(' ');\n  }\n  return msg;\n}\n/**\n * @throws Error\n */\nexport function throwError(msg) {\n  throw new Error(msg);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, isObject, isArray, createHashMap, map, assert, isString, indexOf, isStringSafe, isNumber } from 'zrender/lib/core/util.js';\nimport env from 'zrender/lib/core/env.js';\nimport { isNumeric, getRandomIdBase, getPrecision, round } from './number.js';\nimport { error, warn } from './log.js';\nfunction interpolateNumber(p0, p1, percent) {\n  return (p1 - p0) * percent + p0;\n}\n/**\n * Make the name displayable. But we should\n * make sure it is not duplicated with user\n * specified name, so use '\\0';\n */\nvar DUMMY_COMPONENT_NAME_PREFIX = 'series\\0';\nvar INTERNAL_COMPONENT_ID_PREFIX = '\\0_ec_\\0';\n/**\n * If value is not array, then translate it to array.\n * @param  {*} value\n * @return {Array} [value] or value\n */\nexport function normalizeToArray(value) {\n  return value instanceof Array ? value : value == null ? [] : [value];\n}\n/**\n * Sync default option between normal and emphasis like `position` and `show`\n * In case some one will write code like\n *     label: {\n *          show: false,\n *          position: 'outside',\n *          fontSize: 18\n *     },\n *     emphasis: {\n *          label: { show: true }\n *     }\n */\nexport function defaultEmphasis(opt, key, subOpts) {\n  // Caution: performance sensitive.\n  if (opt) {\n    opt[key] = opt[key] || {};\n    opt.emphasis = opt.emphasis || {};\n    opt.emphasis[key] = opt.emphasis[key] || {};\n    // Default emphasis option from normal\n    for (var i = 0, len = subOpts.length; i < len; i++) {\n      var subOptName = subOpts[i];\n      if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) {\n        opt.emphasis[key][subOptName] = opt[key][subOptName];\n      }\n    }\n  }\n}\nexport var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding'];\n// modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([\n//     'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter',\n//     'fontStyle', 'fontWeight', 'fontSize', 'fontFamily',\n//     // FIXME: deprecated, check and remove it.\n//     'textStyle'\n// ]);\n/**\n * The method does not ensure performance.\n * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\n * This helper method retrieves value from data.\n */\nexport function getDataItemValue(dataItem) {\n  return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem;\n}\n/**\n * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\n * This helper method determine if dataItem has extra option besides value\n */\nexport function isDataItemOption(dataItem) {\n  return isObject(dataItem) && !(dataItem instanceof Array);\n  // // markLine data can be array\n  // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array));\n}\n;\n/**\n * Mapping to existings for merge.\n *\n * Mode \"normalMege\":\n *     The mapping result (merge result) will keep the order of the existing\n *     component, rather than the order of new option. Because we should ensure\n *     some specified index reference (like xAxisIndex) keep work.\n *     And in most cases, \"merge option\" is used to update partial option but not\n *     be expected to change the order.\n *\n * Mode \"replaceMege\":\n *     (1) Only the id mapped components will be merged.\n *     (2) Other existing components (except internal components) will be removed.\n *     (3) Other new options will be used to create new component.\n *     (4) The index of the existing components will not be modified.\n *     That means their might be \"hole\" after the removal.\n *     The new components are created first at those available index.\n *\n * Mode \"replaceAll\":\n *     This mode try to support that reproduce an echarts instance from another\n *     echarts instance (via `getOption`) in some simple cases.\n *     In this scenario, the `result` index are exactly the consistent with the `newCmptOptions`,\n *     which ensures the component index referring (like `xAxisIndex: ?`) corrent. That is,\n *     the \"hole\" in `newCmptOptions` will also be kept.\n *     On the contrary, other modes try best to eliminate holes.\n *     PENDING: This is an experimental mode yet.\n *\n * @return See the comment of <MappingResult>.\n */\nexport function mappingToExists(existings, newCmptOptions, mode) {\n  var isNormalMergeMode = mode === 'normalMerge';\n  var isReplaceMergeMode = mode === 'replaceMerge';\n  var isReplaceAllMode = mode === 'replaceAll';\n  existings = existings || [];\n  newCmptOptions = (newCmptOptions || []).slice();\n  var existingIdIdxMap = createHashMap();\n  // Validate id and name on user input option.\n  each(newCmptOptions, function (cmptOption, index) {\n    if (!isObject(cmptOption)) {\n      newCmptOptions[index] = null;\n      return;\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      // There is some legacy case that name is set as `false`.\n      // But should work normally rather than throw error.\n      if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) {\n        warnInvalidateIdOrName(cmptOption.id);\n      }\n      if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) {\n        warnInvalidateIdOrName(cmptOption.name);\n      }\n    }\n  });\n  var result = prepareResult(existings, existingIdIdxMap, mode);\n  if (isNormalMergeMode || isReplaceMergeMode) {\n    mappingById(result, existings, existingIdIdxMap, newCmptOptions);\n  }\n  if (isNormalMergeMode) {\n    mappingByName(result, newCmptOptions);\n  }\n  if (isNormalMergeMode || isReplaceMergeMode) {\n    mappingByIndex(result, newCmptOptions, isReplaceMergeMode);\n  } else if (isReplaceAllMode) {\n    mappingInReplaceAllMode(result, newCmptOptions);\n  }\n  makeIdAndName(result);\n  // The array `result` MUST NOT contain elided items, otherwise the\n  // forEach will omit those items and result in incorrect result.\n  return result;\n}\nfunction prepareResult(existings, existingIdIdxMap, mode) {\n  var result = [];\n  if (mode === 'replaceAll') {\n    return result;\n  }\n  // Do not use native `map` to in case that the array `existings`\n  // contains elided items, which will be omitted.\n  for (var index = 0; index < existings.length; index++) {\n    var existing = existings[index];\n    // Because of replaceMerge, `existing` may be null/undefined.\n    if (existing && existing.id != null) {\n      existingIdIdxMap.set(existing.id, index);\n    }\n    // For non-internal-componnets:\n    //     Mode \"normalMerge\": all existings kept.\n    //     Mode \"replaceMerge\": all existing removed unless mapped by id.\n    // For internal-components:\n    //     go with \"replaceMerge\" approach in both mode.\n    result.push({\n      existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing,\n      newOption: null,\n      keyInfo: null,\n      brandNew: null\n    });\n  }\n  return result;\n}\nfunction mappingById(result, existings, existingIdIdxMap, newCmptOptions) {\n  // Mapping by id if specified.\n  each(newCmptOptions, function (cmptOption, index) {\n    if (!cmptOption || cmptOption.id == null) {\n      return;\n    }\n    var optionId = makeComparableKey(cmptOption.id);\n    var existingIdx = existingIdIdxMap.get(optionId);\n    if (existingIdx != null) {\n      var resultItem = result[existingIdx];\n      assert(!resultItem.newOption, 'Duplicated option on id \"' + optionId + '\".');\n      resultItem.newOption = cmptOption;\n      // In both mode, if id matched, new option will be merged to\n      // the existings rather than creating new component model.\n      resultItem.existing = existings[existingIdx];\n      newCmptOptions[index] = null;\n    }\n  });\n}\nfunction mappingByName(result, newCmptOptions) {\n  // Mapping by name if specified.\n  each(newCmptOptions, function (cmptOption, index) {\n    if (!cmptOption || cmptOption.name == null) {\n      return;\n    }\n    for (var i = 0; i < result.length; i++) {\n      var existing = result[i].existing;\n      if (!result[i].newOption // Consider name: two map to one.\n      // Can not match when both ids existing but different.\n      && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) {\n        result[i].newOption = cmptOption;\n        newCmptOptions[index] = null;\n        return;\n      }\n    }\n  });\n}\nfunction mappingByIndex(result, newCmptOptions, brandNew) {\n  each(newCmptOptions, function (cmptOption) {\n    if (!cmptOption) {\n      return;\n    }\n    // Find the first place that not mapped by id and not internal component (consider the \"hole\").\n    var resultItem;\n    var nextIdx = 0;\n    while (\n    // Be `!resultItem` only when `nextIdx >= result.length`.\n    (resultItem = result[nextIdx]\n    // (1) Existing models that already have id should be able to mapped to. Because\n    // after mapping performed, model will always be assigned with an id if user not given.\n    // After that all models have id.\n    // (2) If new option has id, it can only set to a hole or append to the last. It should\n    // not be merged to the existings with different id. Because id should not be overwritten.\n    // (3) Name can be overwritten, because axis use name as 'show label text'.\n    ) && (resultItem.newOption || isComponentIdInternal(resultItem.existing) ||\n    // In mode \"replaceMerge\", here no not-mapped-non-internal-existing.\n    resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) {\n      nextIdx++;\n    }\n    if (resultItem) {\n      resultItem.newOption = cmptOption;\n      resultItem.brandNew = brandNew;\n    } else {\n      result.push({\n        newOption: cmptOption,\n        brandNew: brandNew,\n        existing: null,\n        keyInfo: null\n      });\n    }\n    nextIdx++;\n  });\n}\nfunction mappingInReplaceAllMode(result, newCmptOptions) {\n  each(newCmptOptions, function (cmptOption) {\n    // The feature \"reproduce\" requires \"hole\" will also reproduced\n    // in case that component index referring are broken.\n    result.push({\n      newOption: cmptOption,\n      brandNew: true,\n      existing: null,\n      keyInfo: null\n    });\n  });\n}\n/**\n * Make id and name for mapping result (result of mappingToExists)\n * into `keyInfo` field.\n */\nfunction makeIdAndName(mapResult) {\n  // We use this id to hash component models and view instances\n  // in echarts. id can be specified by user, or auto generated.\n  // The id generation rule ensures new view instance are able\n  // to mapped to old instance when setOption are called in\n  // no-merge mode. So we generate model id by name and plus\n  // type in view id.\n  // name can be duplicated among components, which is convenient\n  // to specify multi components (like series) by one name.\n  // Ensure that each id is distinct.\n  var idMap = createHashMap();\n  each(mapResult, function (item) {\n    var existing = item.existing;\n    existing && idMap.set(existing.id, item);\n  });\n  each(mapResult, function (item) {\n    var opt = item.newOption;\n    // Force ensure id not duplicated.\n    assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id));\n    opt && opt.id != null && idMap.set(opt.id, item);\n    !item.keyInfo && (item.keyInfo = {});\n  });\n  // Make name and id.\n  each(mapResult, function (item, index) {\n    var existing = item.existing;\n    var opt = item.newOption;\n    var keyInfo = item.keyInfo;\n    if (!isObject(opt)) {\n      return;\n    }\n    // Name can be overwritten. Consider case: axis.name = '20km'.\n    // But id generated by name will not be changed, which affect\n    // only in that case: setOption with 'not merge mode' and view\n    // instance will be recreated, which can be accepted.\n    keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name\n    // Avoid that different series has the same name,\n    // because name may be used like in color pallet.\n    : DUMMY_COMPONENT_NAME_PREFIX + index;\n    if (existing) {\n      keyInfo.id = makeComparableKey(existing.id);\n    } else if (opt.id != null) {\n      keyInfo.id = makeComparableKey(opt.id);\n    } else {\n      // Consider this situatoin:\n      //  optionA: [{name: 'a'}, {name: 'a'}, {..}]\n      //  optionB [{..}, {name: 'a'}, {name: 'a'}]\n      // Series with the same name between optionA and optionB\n      // should be mapped.\n      var idNum = 0;\n      do {\n        keyInfo.id = '\\0' + keyInfo.name + '\\0' + idNum++;\n      } while (idMap.get(keyInfo.id));\n    }\n    idMap.set(keyInfo.id, item);\n  });\n}\nfunction keyExistAndEqual(attr, obj1, obj2) {\n  var key1 = convertOptionIdName(obj1[attr], null);\n  var key2 = convertOptionIdName(obj2[attr], null);\n  // See `MappingExistingItem`. `id` and `name` trade string equals to number.\n  return key1 != null && key2 != null && key1 === key2;\n}\n/**\n * @return return null if not exist.\n */\nfunction makeComparableKey(val) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (val == null) {\n      throw new Error();\n    }\n  }\n  return convertOptionIdName(val, '');\n}\nexport function convertOptionIdName(idOrName, defaultValue) {\n  if (idOrName == null) {\n    return defaultValue;\n  }\n  return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + '' : defaultValue;\n}\nfunction warnInvalidateIdOrName(idOrName) {\n  if (process.env.NODE_ENV !== 'production') {\n    warn('`' + idOrName + '` is invalid id or name. Must be a string or number.');\n  }\n}\nfunction isValidIdOrName(idOrName) {\n  return isStringSafe(idOrName) || isNumeric(idOrName);\n}\nexport function isNameSpecified(componentModel) {\n  var name = componentModel.name;\n  // Is specified when `indexOf` get -1 or > 0.\n  return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX));\n}\n/**\n * @public\n * @param {Object} cmptOption\n * @return {boolean}\n */\nexport function isComponentIdInternal(cmptOption) {\n  return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0;\n}\nexport function makeInternalComponentId(idSuffix) {\n  return INTERNAL_COMPONENT_ID_PREFIX + idSuffix;\n}\nexport function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) {\n  // Set mainType and complete subType.\n  each(mappingResult, function (item) {\n    var newOption = item.newOption;\n    if (isObject(newOption)) {\n      item.keyInfo.mainType = mainType;\n      item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor);\n    }\n  });\n}\nfunction determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) {\n  var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType\n  // Use determineSubType only when there is no existComponent.\n  : componentModelCtor.determineSubType(mainType, newCmptOption);\n  // tooltip, markline, markpoint may always has no subType\n  return subType;\n}\n/**\n * A helper for removing duplicate items between batchA and batchB,\n * and in themselves, and categorize by series.\n *\n * @param batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\n * @param batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\n * @return result: [resultBatchA, resultBatchB]\n */\nexport function compressBatches(batchA, batchB) {\n  var mapA = {};\n  var mapB = {};\n  makeMap(batchA || [], mapA);\n  makeMap(batchB || [], mapB, mapA);\n  return [mapToArray(mapA), mapToArray(mapB)];\n  function makeMap(sourceBatch, map, otherMap) {\n    for (var i = 0, len = sourceBatch.length; i < len; i++) {\n      var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null);\n      if (seriesId == null) {\n        return;\n      }\n      var dataIndices = normalizeToArray(sourceBatch[i].dataIndex);\n      var otherDataIndices = otherMap && otherMap[seriesId];\n      for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {\n        var dataIndex = dataIndices[j];\n        if (otherDataIndices && otherDataIndices[dataIndex]) {\n          otherDataIndices[dataIndex] = null;\n        } else {\n          (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1;\n        }\n      }\n    }\n  }\n  function mapToArray(map, isData) {\n    var result = [];\n    for (var i in map) {\n      if (map.hasOwnProperty(i) && map[i] != null) {\n        if (isData) {\n          result.push(+i);\n        } else {\n          var dataIndices = mapToArray(map[i], true);\n          dataIndices.length && result.push({\n            seriesId: i,\n            dataIndex: dataIndices\n          });\n        }\n      }\n    }\n    return result;\n  }\n}\n/**\n * @param payload Contains dataIndex (means rawIndex) / dataIndexInside / name\n *                         each of which can be Array or primary type.\n * @return dataIndex If not found, return undefined/null.\n */\nexport function queryDataIndex(data, payload) {\n  if (payload.dataIndexInside != null) {\n    return payload.dataIndexInside;\n  } else if (payload.dataIndex != null) {\n    return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) {\n      return data.indexOfRawIndex(value);\n    }) : data.indexOfRawIndex(payload.dataIndex);\n  } else if (payload.name != null) {\n    return isArray(payload.name) ? map(payload.name, function (value) {\n      return data.indexOfName(value);\n    }) : data.indexOfName(payload.name);\n  }\n}\n/**\n * Enable property storage to any host object.\n * Notice: Serialization is not supported.\n *\n * For example:\n * let inner = zrUitl.makeInner();\n *\n * function some1(hostObj) {\n *      inner(hostObj).someProperty = 1212;\n *      ...\n * }\n * function some2() {\n *      let fields = inner(this);\n *      fields.someProperty1 = 1212;\n *      fields.someProperty2 = 'xx';\n *      ...\n * }\n *\n * @return {Function}\n */\nexport function makeInner() {\n  var key = '__ec_inner_' + innerUniqueIndex++;\n  return function (hostObj) {\n    return hostObj[key] || (hostObj[key] = {});\n  };\n}\nvar innerUniqueIndex = getRandomIdBase();\n/**\n * The same behavior as `component.getReferringComponents`.\n */\nexport function parseFinder(ecModel, finderInput, opt) {\n  var _a = preParseFinder(finderInput, opt),\n    mainTypeSpecified = _a.mainTypeSpecified,\n    queryOptionMap = _a.queryOptionMap,\n    others = _a.others;\n  var result = others;\n  var defaultMainType = opt ? opt.defaultMainType : null;\n  if (!mainTypeSpecified && defaultMainType) {\n    queryOptionMap.set(defaultMainType, {});\n  }\n  queryOptionMap.each(function (queryOption, mainType) {\n    var queryResult = queryReferringComponents(ecModel, mainType, queryOption, {\n      useDefault: defaultMainType === mainType,\n      enableAll: opt && opt.enableAll != null ? opt.enableAll : true,\n      enableNone: opt && opt.enableNone != null ? opt.enableNone : true\n    });\n    result[mainType + 'Models'] = queryResult.models;\n    result[mainType + 'Model'] = queryResult.models[0];\n  });\n  return result;\n}\nexport function preParseFinder(finderInput, opt) {\n  var finder;\n  if (isString(finderInput)) {\n    var obj = {};\n    obj[finderInput + 'Index'] = 0;\n    finder = obj;\n  } else {\n    finder = finderInput;\n  }\n  var queryOptionMap = createHashMap();\n  var others = {};\n  var mainTypeSpecified = false;\n  each(finder, function (value, key) {\n    // Exclude 'dataIndex' and other illegal keys.\n    if (key === 'dataIndex' || key === 'dataIndexInside') {\n      others[key] = value;\n      return;\n    }\n    var parsedKey = key.match(/^(\\w+)(Index|Id|Name)$/) || [];\n    var mainType = parsedKey[1];\n    var queryType = (parsedKey[2] || '').toLowerCase();\n    if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) {\n      return;\n    }\n    mainTypeSpecified = mainTypeSpecified || !!mainType;\n    var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {});\n    queryOption[queryType] = value;\n  });\n  return {\n    mainTypeSpecified: mainTypeSpecified,\n    queryOptionMap: queryOptionMap,\n    others: others\n  };\n}\nexport var SINGLE_REFERRING = {\n  useDefault: true,\n  enableAll: false,\n  enableNone: false\n};\nexport var MULTIPLE_REFERRING = {\n  useDefault: false,\n  enableAll: true,\n  enableNone: true\n};\nexport function queryReferringComponents(ecModel, mainType, userOption, opt) {\n  opt = opt || SINGLE_REFERRING;\n  var indexOption = userOption.index;\n  var idOption = userOption.id;\n  var nameOption = userOption.name;\n  var result = {\n    models: null,\n    specified: indexOption != null || idOption != null || nameOption != null\n  };\n  if (!result.specified) {\n    // Use the first as default if `useDefault`.\n    var firstCmpt = void 0;\n    result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : [];\n    return result;\n  }\n  if (indexOption === 'none' || indexOption === false) {\n    if (opt.enableNone) {\n      result.models = [];\n      return result;\n    } else {\n      // Do not throw; consider if some component previously does not use this method,\n      // and start to use it, need to be fault-tolerant for backward compatibility.\n      if (process.env.NODE_ENV !== 'production') {\n        error('`\"none\"` or `false` is not a valid value on index option.');\n      }\n      indexOption = -1; // Can not query by index but may still query by id/name if specified.\n    }\n  }\n  // `queryComponents` will return all components if\n  // both all of index/id/name are null/undefined.\n  if (indexOption === 'all') {\n    if (opt.enableAll) {\n      indexOption = idOption = nameOption = null;\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        error('`\"all\"` is not a valid value on index option.');\n      }\n      indexOption = -1;\n    }\n  }\n  result.models = ecModel.queryComponents({\n    mainType: mainType,\n    index: indexOption,\n    id: idOption,\n    name: nameOption\n  });\n  return result;\n}\nexport function setAttribute(dom, key, value) {\n  dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value;\n}\nexport function getAttribute(dom, key) {\n  return dom.getAttribute ? dom.getAttribute(key) : dom[key];\n}\nexport function getTooltipRenderMode(renderModeOption) {\n  if (renderModeOption === 'auto') {\n    // Using html when `document` exists, use richText otherwise\n    return env.domSupported ? 'html' : 'richText';\n  } else {\n    return renderModeOption || 'html';\n  }\n}\n/**\n * Group a list by key.\n */\nexport function groupData(array, getKey // return key\n) {\n  var buckets = createHashMap();\n  var keys = [];\n  each(array, function (item) {\n    var key = getKey(item);\n    (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item);\n  });\n  return {\n    keys: keys,\n    buckets: buckets\n  };\n}\n/**\n * Interpolate raw values of a series with percent\n *\n * @param data         data\n * @param labelModel   label model of the text element\n * @param sourceValue  start value. May be null/undefined when init.\n * @param targetValue  end value\n * @param percent      0~1 percentage; 0 uses start value while 1 uses end value\n * @return             interpolated values\n *                     If `sourceValue` and `targetValue` are `number`, return `number`.\n *                     If `sourceValue` and `targetValue` are `string`, return `string`.\n *                     If `sourceValue` and `targetValue` are `(string | number)[]`, return `(string | number)[]`.\n *                     Other cases do not supported.\n */\nexport function interpolateRawValues(data, precision, sourceValue, targetValue, percent) {\n  var isAutoPrecision = precision == null || precision === 'auto';\n  if (targetValue == null) {\n    return targetValue;\n  }\n  if (isNumber(targetValue)) {\n    var value = interpolateNumber(sourceValue || 0, targetValue, percent);\n    return round(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision);\n  } else if (isString(targetValue)) {\n    return percent < 1 ? sourceValue : targetValue;\n  } else {\n    var interpolated = [];\n    var leftArr = sourceValue;\n    var rightArr = targetValue;\n    var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length);\n    for (var i = 0; i < length_1; ++i) {\n      var info = data.getDimensionInfo(i);\n      // Don't interpolate ordinal dims\n      if (info && info.type === 'ordinal') {\n        // In init, there is no `sourceValue`, but should better not to get undefined result.\n        interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i];\n      } else {\n        var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0;\n        var rightVal = rightArr[i];\n        var value = interpolateNumber(leftVal, rightVal, percent);\n        interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision);\n      }\n    }\n    return interpolated;\n  }\n}\n/**\n * Use an iterator to avoid exposing the internal list or duplicating it\n * for the outside traveller, and no extra heap allocation.\n * @usage\n *  for (const it = resetIterator(); it.next();) {\n *      const item = it.item;\n *      const key = it.key;\n *      const itIdx = it.itIdx;\n *      // ...\n *  }\n * @usage\n *  const it = resetIterator();\n *  while (it.next()) { ... }\n * @usage\n *  for (resetIterator(it); it.next();) { ... }\n */\nvar ListIterator = /** @class */function () {\n  function ListIterator() {}\n  /**\n   * The loop condition is `idx < end` if `step > 0`;\n   * The loop condition is `idx >= end` if `step < 0`.\n   *\n   * @param end By default `list.length` if `step > 0`; `0` if `step < 0`.\n   * @param step By default `1`.\n   */\n  ListIterator.prototype.reset = function (list, start, end, step) {\n    this._list = list;\n    this._step = step = step || 1;\n    this._idx = start;\n    this._end = end != null ? end : step > 0 ? list.length : 0;\n    this.item = null;\n    this.key = NaN;\n    return this;\n  };\n  ListIterator.prototype.next = function () {\n    if (this._step > 0 ? this._idx < this._end : this._idx >= this._end) {\n      this.item = this._list[this._idx];\n      this.key = this._idx = this._idx + this._step;\n      return true;\n    }\n    return false;\n  };\n  return ListIterator;\n}();\nexport { ListIterator };\nexport function clearTmpModel(model) {\n  // Clear to avoid memory leak.\n  model.option = model.parentModel = model.ecModel = null;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar TYPE_DELIMITER = '.';\nvar IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';\nvar IS_EXTENDED_CLASS = '___EC__EXTENDED_CLASS___';\n/**\n * Notice, parseClassType('') should returns {main: '', sub: ''}\n * @public\n */\nexport function parseClassType(componentType) {\n  var ret = {\n    main: '',\n    sub: ''\n  };\n  if (componentType) {\n    var typeArr = componentType.split(TYPE_DELIMITER);\n    ret.main = typeArr[0] || '';\n    ret.sub = typeArr[1] || '';\n  }\n  return ret;\n}\n/**\n * @public\n */\nfunction checkClassType(componentType) {\n  zrUtil.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType \"' + componentType + '\" illegal');\n}\nexport function isExtendedClass(clz) {\n  return !!(clz && clz[IS_EXTENDED_CLASS]);\n}\n/**\n * Implements `ExtendableConstructor` for `rootClz`.\n *\n * @usage\n * ```ts\n * class Xxx {}\n * type XxxConstructor = typeof Xxx & ExtendableConstructor\n * enableClassExtend(Xxx as XxxConstructor);\n * ```\n */\nexport function enableClassExtend(rootClz, mandatoryMethods) {\n  rootClz.$constructor = rootClz; // FIXME: not necessary?\n  rootClz.extend = function (proto) {\n    if (process.env.NODE_ENV !== 'production') {\n      zrUtil.each(mandatoryMethods, function (method) {\n        if (!proto[method]) {\n          console.warn('Method `' + method + '` should be implemented' + (proto.type ? ' in ' + proto.type : '') + '.');\n        }\n      });\n    }\n    var superClass = this;\n    var ExtendedClass;\n    if (isESClass(superClass)) {\n      ExtendedClass = /** @class */function (_super) {\n        __extends(class_1, _super);\n        function class_1() {\n          return _super.apply(this, arguments) || this;\n        }\n        return class_1;\n      }(superClass);\n    } else {\n      // For backward compat, we both support ts class inheritance and this\n      // \"extend\" approach.\n      // The constructor should keep the same behavior as ts class inheritance:\n      // If this constructor/$constructor is not declared, auto invoke the super\n      // constructor.\n      // If this constructor/$constructor is declared, it is responsible for\n      // calling the super constructor.\n      ExtendedClass = function () {\n        (proto.$constructor || superClass).apply(this, arguments);\n      };\n      zrUtil.inherits(ExtendedClass, this);\n    }\n    zrUtil.extend(ExtendedClass.prototype, proto);\n    ExtendedClass[IS_EXTENDED_CLASS] = true;\n    ExtendedClass.extend = this.extend;\n    ExtendedClass.superCall = superCall;\n    ExtendedClass.superApply = superApply;\n    ExtendedClass.superClass = superClass;\n    return ExtendedClass;\n  };\n}\nfunction isESClass(fn) {\n  return zrUtil.isFunction(fn) && /^class\\s/.test(Function.prototype.toString.call(fn));\n}\n/**\n * A work around to both support ts extend and this extend mechanism.\n * on sub-class.\n * @usage\n * ```ts\n * class Component { ... }\n * classUtil.enableClassExtend(Component);\n * classUtil.enableClassManagement(Component, {registerWhenExtend: true});\n *\n * class Series extends Component { ... }\n * // Without calling `markExtend`, `registerWhenExtend` will not work.\n * Component.markExtend(Series);\n * ```\n */\nexport function mountExtend(SubClz, SupperClz) {\n  SubClz.extend = SupperClz.extend;\n}\n// A random offset.\nvar classBase = Math.round(Math.random() * 10);\n/**\n * Implements `CheckableConstructor` for `target`.\n * Can not use instanceof, consider different scope by\n * cross domain or es module import in ec extensions.\n * Mount a method \"isInstance()\" to Clz.\n *\n * @usage\n * ```ts\n * class Xxx {}\n * type XxxConstructor = typeof Xxx & CheckableConstructor;\n * enableClassCheck(Xxx as XxxConstructor)\n * ```\n */\nexport function enableClassCheck(target) {\n  var classAttr = ['__\\0is_clz', classBase++].join('_');\n  target.prototype[classAttr] = true;\n  if (process.env.NODE_ENV !== 'production') {\n    zrUtil.assert(!target.isInstance, 'The method \"is\" can not be defined.');\n  }\n  target.isInstance = function (obj) {\n    return !!(obj && obj[classAttr]);\n  };\n}\n// superCall should have class info, which can not be fetched from 'this'.\n// Consider this case:\n// class A has method f,\n// class B inherits class A, overrides method f, f call superApply('f'),\n// class C inherits class B, does not override method f,\n// then when method of class C is called, dead loop occurred.\nfunction superCall(context, methodName) {\n  var args = [];\n  for (var _i = 2; _i < arguments.length; _i++) {\n    args[_i - 2] = arguments[_i];\n  }\n  return this.superClass.prototype[methodName].apply(context, args);\n}\nfunction superApply(context, methodName, args) {\n  return this.superClass.prototype[methodName].apply(context, args);\n}\n/**\n * Implements `ClassManager` for `target`\n *\n * @usage\n * ```ts\n * class Xxx {}\n * type XxxConstructor = typeof Xxx & ClassManager\n * enableClassManagement(Xxx as XxxConstructor);\n * ```\n */\nexport function enableClassManagement(target) {\n  /**\n   * Component model classes\n   * key: componentType,\n   * value:\n   *     componentClass, when componentType is 'a'\n   *     or Object.<subKey, componentClass>, when componentType is 'a.b'\n   */\n  var storage = {};\n  target.registerClass = function (clz) {\n    // `type` should not be a \"instance member\".\n    // If using TS class, should better declared as `static type = 'series.pie'`.\n    // otherwise users have to mount `type` on prototype manually.\n    // For backward compat and enable instance visit type via `this.type`,\n    // we still support fetch `type` from prototype.\n    var componentFullType = clz.type || clz.prototype.type;\n    if (componentFullType) {\n      checkClassType(componentFullType);\n      // If only static type declared, we assign it to prototype mandatorily.\n      clz.prototype.type = componentFullType;\n      var componentTypeInfo = parseClassType(componentFullType);\n      if (!componentTypeInfo.sub) {\n        if (process.env.NODE_ENV !== 'production') {\n          if (storage[componentTypeInfo.main]) {\n            console.warn(componentTypeInfo.main + ' exists.');\n          }\n        }\n        storage[componentTypeInfo.main] = clz;\n      } else if (componentTypeInfo.sub !== IS_CONTAINER) {\n        var container = makeContainer(componentTypeInfo);\n        container[componentTypeInfo.sub] = clz;\n      }\n    }\n    return clz;\n  };\n  target.getClass = function (mainType, subType, throwWhenNotFound) {\n    var clz = storage[mainType];\n    if (clz && clz[IS_CONTAINER]) {\n      clz = subType ? clz[subType] : null;\n    }\n    if (throwWhenNotFound && !clz) {\n      throw new Error(!subType ? mainType + '.' + 'type should be specified.' : 'Component ' + mainType + '.' + (subType || '') + ' is used but not imported.');\n    }\n    return clz;\n  };\n  target.getClassesByMainType = function (componentType) {\n    var componentTypeInfo = parseClassType(componentType);\n    var result = [];\n    var obj = storage[componentTypeInfo.main];\n    if (obj && obj[IS_CONTAINER]) {\n      zrUtil.each(obj, function (o, type) {\n        type !== IS_CONTAINER && result.push(o);\n      });\n    } else {\n      result.push(obj);\n    }\n    return result;\n  };\n  target.hasClass = function (componentType) {\n    // Just consider componentType.main.\n    var componentTypeInfo = parseClassType(componentType);\n    return !!storage[componentTypeInfo.main];\n  };\n  /**\n   * @return Like ['aa', 'bb'], but can not be ['aa.xx']\n   */\n  target.getAllClassMainTypes = function () {\n    var types = [];\n    zrUtil.each(storage, function (obj, type) {\n      types.push(type);\n    });\n    return types;\n  };\n  /**\n   * If a main type is container and has sub types\n   */\n  target.hasSubTypes = function (componentType) {\n    var componentTypeInfo = parseClassType(componentType);\n    var obj = storage[componentTypeInfo.main];\n    return obj && obj[IS_CONTAINER];\n  };\n  function makeContainer(componentTypeInfo) {\n    var container = storage[componentTypeInfo.main];\n    if (!container || !container[IS_CONTAINER]) {\n      container = storage[componentTypeInfo.main] = {};\n      container[IS_CONTAINER] = true;\n    }\n    return container;\n  }\n}\n// /**\n//  * @param {string|Array.<string>} properties\n//  */\n// export function setReadOnly(obj, properties) {\n// FIXME It seems broken in IE8 simulation of IE11\n// if (!zrUtil.isArray(properties)) {\n//     properties = properties != null ? [properties] : [];\n// }\n// zrUtil.each(properties, function (prop) {\n//     let value = obj[prop];\n//     Object.defineProperty\n//         && Object.defineProperty(obj, prop, {\n//             value: value, writable: false\n//         });\n//     zrUtil.isArray(obj[prop])\n//         && Object.freeze\n//         && Object.freeze(obj[prop]);\n// });\n// }", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// TODO Parse shadow style\n// TODO Only shallow path support\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function makeStyleMapper(properties, ignoreParent) {\n  // Normalize\n  for (var i = 0; i < properties.length; i++) {\n    if (!properties[i][1]) {\n      properties[i][1] = properties[i][0];\n    }\n  }\n  ignoreParent = ignoreParent || false;\n  return function (model, excludes, includes) {\n    var style = {};\n    for (var i = 0; i < properties.length; i++) {\n      var propName = properties[i][1];\n      if (excludes && zrUtil.indexOf(excludes, propName) >= 0 || includes && zrUtil.indexOf(includes, propName) < 0) {\n        continue;\n      }\n      var val = model.getShallow(propName, ignoreParent);\n      if (val != null) {\n        style[properties[i][0]] = val;\n      }\n    }\n    // TODO Text or image?\n    return style;\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport makeStyleMapper from './makeStyleMapper.js';\nexport var AREA_STYLE_KEY_MAP = [['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor']\n// Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n// So do not transfer decal directly.\n];\nvar getAreaStyle = makeStyleMapper(AREA_STYLE_KEY_MAP);\nvar AreaStyleMixin = /** @class */function () {\n  function AreaStyleMixin() {}\n  AreaStyleMixin.prototype.getAreaStyle = function (excludes, includes) {\n    return getAreaStyle(this, excludes, includes);\n  };\n  return AreaStyleMixin;\n}();\n;\nexport { AreaStyleMixin };", "import LRU from '../../core/LRU.js';\nimport { platformApi } from '../../core/platform.js';\nvar globalImageCache = new LRU(50);\nexport function findExistImage(newImageOrSrc) {\n    if (typeof newImageOrSrc === 'string') {\n        var cachedImgObj = globalImageCache.get(newImageOrSrc);\n        return cachedImgObj && cachedImgObj.image;\n    }\n    else {\n        return newImageOrSrc;\n    }\n}\nexport function createOrUpdateImage(newImageOrSrc, image, hostEl, onload, cbPayload) {\n    if (!newImageOrSrc) {\n        return image;\n    }\n    else if (typeof newImageOrSrc === 'string') {\n        if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) {\n            return image;\n        }\n        var cachedImgObj = globalImageCache.get(newImageOrSrc);\n        var pendingWrap = { hostEl: hostEl, cb: onload, cbPayload: cbPayload };\n        if (cachedImgObj) {\n            image = cachedImgObj.image;\n            !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);\n        }\n        else {\n            image = platformApi.loadImage(newImageOrSrc, imageOnLoad, imageOnLoad);\n            image.__zrImageSrc = newImageOrSrc;\n            globalImageCache.put(newImageOrSrc, image.__cachedImgObj = {\n                image: image,\n                pending: [pendingWrap]\n            });\n        }\n        return image;\n    }\n    else {\n        return newImageOrSrc;\n    }\n}\nfunction imageOnLoad() {\n    var cachedImgObj = this.__cachedImgObj;\n    this.onload = this.onerror = this.__cachedImgObj = null;\n    for (var i = 0; i < cachedImgObj.pending.length; i++) {\n        var pendingWrap = cachedImgObj.pending[i];\n        var cb = pendingWrap.cb;\n        cb && cb(this, pendingWrap.cbPayload);\n        pendingWrap.hostEl.dirty();\n    }\n    cachedImgObj.pending.length = 0;\n}\nexport function isImageReady(image) {\n    return image && image.width && image.height;\n}\n", "import * as imageHelper from '../helper/image.js';\nimport { extend, retrieve2, retrieve3, reduce, } from '../../core/util.js';\nimport { adjustTextX, adjustTextY, ensureFontMeasureInfo, getLineHeight, measureCharWidth, measureWidth, parsePercent, } from '../../contain/text.js';\nimport BoundingRect from '../../core/BoundingRect.js';\nvar STYLE_REG = /\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g;\nexport function truncateText(text, containerWidth, font, ellipsis, options) {\n    var out = {};\n    truncateText2(out, text, containerWidth, font, ellipsis, options);\n    return out.text;\n}\nfunction truncateText2(out, text, containerWidth, font, ellipsis, options) {\n    if (!containerWidth) {\n        out.text = '';\n        out.isTruncated = false;\n        return;\n    }\n    var textLines = (text + '').split('\\n');\n    options = prepareTruncateOptions(containerWidth, font, ellipsis, options);\n    var isTruncated = false;\n    var truncateOut = {};\n    for (var i = 0, len = textLines.length; i < len; i++) {\n        truncateSingleLine(truncateOut, textLines[i], options);\n        textLines[i] = truncateOut.textLine;\n        isTruncated = isTruncated || truncateOut.isTruncated;\n    }\n    out.text = textLines.join('\\n');\n    out.isTruncated = isTruncated;\n}\nfunction prepareTruncateOptions(containerWidth, font, ellipsis, options) {\n    options = options || {};\n    var preparedOpts = extend({}, options);\n    ellipsis = retrieve2(ellipsis, '...');\n    preparedOpts.maxIterations = retrieve2(options.maxIterations, 2);\n    var minChar = preparedOpts.minChar = retrieve2(options.minChar, 0);\n    var fontMeasureInfo = preparedOpts.fontMeasureInfo = ensureFontMeasureInfo(font);\n    var ascCharWidth = fontMeasureInfo.asciiCharWidth;\n    preparedOpts.placeholder = retrieve2(options.placeholder, '');\n    var contentWidth = containerWidth = Math.max(0, containerWidth - 1);\n    for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) {\n        contentWidth -= ascCharWidth;\n    }\n    var ellipsisWidth = measureWidth(fontMeasureInfo, ellipsis);\n    if (ellipsisWidth > contentWidth) {\n        ellipsis = '';\n        ellipsisWidth = 0;\n    }\n    contentWidth = containerWidth - ellipsisWidth;\n    preparedOpts.ellipsis = ellipsis;\n    preparedOpts.ellipsisWidth = ellipsisWidth;\n    preparedOpts.contentWidth = contentWidth;\n    preparedOpts.containerWidth = containerWidth;\n    return preparedOpts;\n}\nfunction truncateSingleLine(out, textLine, options) {\n    var containerWidth = options.containerWidth;\n    var contentWidth = options.contentWidth;\n    var fontMeasureInfo = options.fontMeasureInfo;\n    if (!containerWidth) {\n        out.textLine = '';\n        out.isTruncated = false;\n        return;\n    }\n    var lineWidth = measureWidth(fontMeasureInfo, textLine);\n    if (lineWidth <= containerWidth) {\n        out.textLine = textLine;\n        out.isTruncated = false;\n        return;\n    }\n    for (var j = 0;; j++) {\n        if (lineWidth <= contentWidth || j >= options.maxIterations) {\n            textLine += options.ellipsis;\n            break;\n        }\n        var subLength = j === 0\n            ? estimateLength(textLine, contentWidth, fontMeasureInfo)\n            : lineWidth > 0\n                ? Math.floor(textLine.length * contentWidth / lineWidth)\n                : 0;\n        textLine = textLine.substr(0, subLength);\n        lineWidth = measureWidth(fontMeasureInfo, textLine);\n    }\n    if (textLine === '') {\n        textLine = options.placeholder;\n    }\n    out.textLine = textLine;\n    out.isTruncated = true;\n}\nfunction estimateLength(text, contentWidth, fontMeasureInfo) {\n    var width = 0;\n    var i = 0;\n    for (var len = text.length; i < len && width < contentWidth; i++) {\n        width += measureCharWidth(fontMeasureInfo, text.charCodeAt(i));\n    }\n    return i;\n}\nexport function parsePlainText(rawText, style, defaultOuterWidth, defaultOuterHeight) {\n    var text = formatText(rawText);\n    var overflow = style.overflow;\n    var padding = style.padding;\n    var paddingH = padding ? padding[1] + padding[3] : 0;\n    var paddingV = padding ? padding[0] + padding[2] : 0;\n    var font = style.font;\n    var truncate = overflow === 'truncate';\n    var calculatedLineHeight = getLineHeight(font);\n    var lineHeight = retrieve2(style.lineHeight, calculatedLineHeight);\n    var truncateLineOverflow = style.lineOverflow === 'truncate';\n    var isTruncated = false;\n    var width = style.width;\n    if (width == null && defaultOuterWidth != null) {\n        width = defaultOuterWidth - paddingH;\n    }\n    var height = style.height;\n    if (height == null && defaultOuterHeight != null) {\n        height = defaultOuterHeight - paddingV;\n    }\n    var lines;\n    if (width != null && (overflow === 'break' || overflow === 'breakAll')) {\n        lines = text ? wrapText(text, style.font, width, overflow === 'breakAll', 0).lines : [];\n    }\n    else {\n        lines = text ? text.split('\\n') : [];\n    }\n    var contentHeight = lines.length * lineHeight;\n    if (height == null) {\n        height = contentHeight;\n    }\n    if (contentHeight > height && truncateLineOverflow) {\n        var lineCount = Math.floor(height / lineHeight);\n        isTruncated = isTruncated || (lines.length > lineCount);\n        lines = lines.slice(0, lineCount);\n        contentHeight = lines.length * lineHeight;\n    }\n    if (text && truncate && width != null) {\n        var options = prepareTruncateOptions(width, font, style.ellipsis, {\n            minChar: style.truncateMinChar,\n            placeholder: style.placeholder\n        });\n        var singleOut = {};\n        for (var i = 0; i < lines.length; i++) {\n            truncateSingleLine(singleOut, lines[i], options);\n            lines[i] = singleOut.textLine;\n            isTruncated = isTruncated || singleOut.isTruncated;\n        }\n    }\n    var outerHeight = height;\n    var contentWidth = 0;\n    var fontMeasureInfo = ensureFontMeasureInfo(font);\n    for (var i = 0; i < lines.length; i++) {\n        contentWidth = Math.max(measureWidth(fontMeasureInfo, lines[i]), contentWidth);\n    }\n    if (width == null) {\n        width = contentWidth;\n    }\n    var outerWidth = width;\n    outerHeight += paddingV;\n    outerWidth += paddingH;\n    return {\n        lines: lines,\n        height: height,\n        outerWidth: outerWidth,\n        outerHeight: outerHeight,\n        lineHeight: lineHeight,\n        calculatedLineHeight: calculatedLineHeight,\n        contentWidth: contentWidth,\n        contentHeight: contentHeight,\n        width: width,\n        isTruncated: isTruncated\n    };\n}\nvar RichTextToken = (function () {\n    function RichTextToken() {\n    }\n    return RichTextToken;\n}());\nvar RichTextLine = (function () {\n    function RichTextLine(tokens) {\n        this.tokens = [];\n        if (tokens) {\n            this.tokens = tokens;\n        }\n    }\n    return RichTextLine;\n}());\nvar RichTextContentBlock = (function () {\n    function RichTextContentBlock() {\n        this.width = 0;\n        this.height = 0;\n        this.contentWidth = 0;\n        this.contentHeight = 0;\n        this.outerWidth = 0;\n        this.outerHeight = 0;\n        this.lines = [];\n        this.isTruncated = false;\n    }\n    return RichTextContentBlock;\n}());\nexport { RichTextContentBlock };\nexport function parseRichText(rawText, style, defaultOuterWidth, defaultOuterHeight, topTextAlign) {\n    var contentBlock = new RichTextContentBlock();\n    var text = formatText(rawText);\n    if (!text) {\n        return contentBlock;\n    }\n    var stlPadding = style.padding;\n    var stlPaddingH = stlPadding ? stlPadding[1] + stlPadding[3] : 0;\n    var stlPaddingV = stlPadding ? stlPadding[0] + stlPadding[2] : 0;\n    var topWidth = style.width;\n    if (topWidth == null && defaultOuterWidth != null) {\n        topWidth = defaultOuterWidth - stlPaddingH;\n    }\n    var topHeight = style.height;\n    if (topHeight == null && defaultOuterHeight != null) {\n        topHeight = defaultOuterHeight - stlPaddingV;\n    }\n    var overflow = style.overflow;\n    var wrapInfo = (overflow === 'break' || overflow === 'breakAll') && topWidth != null\n        ? { width: topWidth, accumWidth: 0, breakAll: overflow === 'breakAll' }\n        : null;\n    var lastIndex = STYLE_REG.lastIndex = 0;\n    var result;\n    while ((result = STYLE_REG.exec(text)) != null) {\n        var matchedIndex = result.index;\n        if (matchedIndex > lastIndex) {\n            pushTokens(contentBlock, text.substring(lastIndex, matchedIndex), style, wrapInfo);\n        }\n        pushTokens(contentBlock, result[2], style, wrapInfo, result[1]);\n        lastIndex = STYLE_REG.lastIndex;\n    }\n    if (lastIndex < text.length) {\n        pushTokens(contentBlock, text.substring(lastIndex, text.length), style, wrapInfo);\n    }\n    var pendingList = [];\n    var calculatedHeight = 0;\n    var calculatedWidth = 0;\n    var truncate = overflow === 'truncate';\n    var truncateLine = style.lineOverflow === 'truncate';\n    var tmpTruncateOut = {};\n    function finishLine(line, lineWidth, lineHeight) {\n        line.width = lineWidth;\n        line.lineHeight = lineHeight;\n        calculatedHeight += lineHeight;\n        calculatedWidth = Math.max(calculatedWidth, lineWidth);\n    }\n    outer: for (var i = 0; i < contentBlock.lines.length; i++) {\n        var line = contentBlock.lines[i];\n        var lineHeight = 0;\n        var lineWidth = 0;\n        for (var j = 0; j < line.tokens.length; j++) {\n            var token = line.tokens[j];\n            var tokenStyle = token.styleName && style.rich[token.styleName] || {};\n            var textPadding = token.textPadding = tokenStyle.padding;\n            var paddingH = textPadding ? textPadding[1] + textPadding[3] : 0;\n            var font = token.font = tokenStyle.font || style.font;\n            token.contentHeight = getLineHeight(font);\n            var tokenHeight = retrieve2(tokenStyle.height, token.contentHeight);\n            token.innerHeight = tokenHeight;\n            textPadding && (tokenHeight += textPadding[0] + textPadding[2]);\n            token.height = tokenHeight;\n            token.lineHeight = retrieve3(tokenStyle.lineHeight, style.lineHeight, tokenHeight);\n            token.align = tokenStyle && tokenStyle.align || topTextAlign;\n            token.verticalAlign = tokenStyle && tokenStyle.verticalAlign || 'middle';\n            if (truncateLine && topHeight != null && calculatedHeight + token.lineHeight > topHeight) {\n                var originalLength = contentBlock.lines.length;\n                if (j > 0) {\n                    line.tokens = line.tokens.slice(0, j);\n                    finishLine(line, lineWidth, lineHeight);\n                    contentBlock.lines = contentBlock.lines.slice(0, i + 1);\n                }\n                else {\n                    contentBlock.lines = contentBlock.lines.slice(0, i);\n                }\n                contentBlock.isTruncated = contentBlock.isTruncated || (contentBlock.lines.length < originalLength);\n                break outer;\n            }\n            var styleTokenWidth = tokenStyle.width;\n            var tokenWidthNotSpecified = styleTokenWidth == null || styleTokenWidth === 'auto';\n            if (typeof styleTokenWidth === 'string' && styleTokenWidth.charAt(styleTokenWidth.length - 1) === '%') {\n                token.percentWidth = styleTokenWidth;\n                pendingList.push(token);\n                token.contentWidth = measureWidth(ensureFontMeasureInfo(font), token.text);\n            }\n            else {\n                if (tokenWidthNotSpecified) {\n                    var textBackgroundColor = tokenStyle.backgroundColor;\n                    var bgImg = textBackgroundColor && textBackgroundColor.image;\n                    if (bgImg) {\n                        bgImg = imageHelper.findExistImage(bgImg);\n                        if (imageHelper.isImageReady(bgImg)) {\n                            token.width = Math.max(token.width, bgImg.width * tokenHeight / bgImg.height);\n                        }\n                    }\n                }\n                var remainTruncWidth = truncate && topWidth != null\n                    ? topWidth - lineWidth : null;\n                if (remainTruncWidth != null && remainTruncWidth < token.width) {\n                    if (!tokenWidthNotSpecified || remainTruncWidth < paddingH) {\n                        token.text = '';\n                        token.width = token.contentWidth = 0;\n                    }\n                    else {\n                        truncateText2(tmpTruncateOut, token.text, remainTruncWidth - paddingH, font, style.ellipsis, { minChar: style.truncateMinChar });\n                        token.text = tmpTruncateOut.text;\n                        contentBlock.isTruncated = contentBlock.isTruncated || tmpTruncateOut.isTruncated;\n                        token.width = token.contentWidth = measureWidth(ensureFontMeasureInfo(font), token.text);\n                    }\n                }\n                else {\n                    token.contentWidth = measureWidth(ensureFontMeasureInfo(font), token.text);\n                }\n            }\n            token.width += paddingH;\n            lineWidth += token.width;\n            tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight));\n        }\n        finishLine(line, lineWidth, lineHeight);\n    }\n    contentBlock.outerWidth = contentBlock.width = retrieve2(topWidth, calculatedWidth);\n    contentBlock.outerHeight = contentBlock.height = retrieve2(topHeight, calculatedHeight);\n    contentBlock.contentHeight = calculatedHeight;\n    contentBlock.contentWidth = calculatedWidth;\n    contentBlock.outerWidth += stlPaddingH;\n    contentBlock.outerHeight += stlPaddingV;\n    for (var i = 0; i < pendingList.length; i++) {\n        var token = pendingList[i];\n        var percentWidth = token.percentWidth;\n        token.width = parseInt(percentWidth, 10) / 100 * contentBlock.width;\n    }\n    return contentBlock;\n}\nfunction pushTokens(block, str, style, wrapInfo, styleName) {\n    var isEmptyStr = str === '';\n    var tokenStyle = styleName && style.rich[styleName] || {};\n    var lines = block.lines;\n    var font = tokenStyle.font || style.font;\n    var newLine = false;\n    var strLines;\n    var linesWidths;\n    if (wrapInfo) {\n        var tokenPadding = tokenStyle.padding;\n        var tokenPaddingH = tokenPadding ? tokenPadding[1] + tokenPadding[3] : 0;\n        if (tokenStyle.width != null && tokenStyle.width !== 'auto') {\n            var outerWidth_1 = parsePercent(tokenStyle.width, wrapInfo.width) + tokenPaddingH;\n            if (lines.length > 0) {\n                if (outerWidth_1 + wrapInfo.accumWidth > wrapInfo.width) {\n                    strLines = str.split('\\n');\n                    newLine = true;\n                }\n            }\n            wrapInfo.accumWidth = outerWidth_1;\n        }\n        else {\n            var res = wrapText(str, font, wrapInfo.width, wrapInfo.breakAll, wrapInfo.accumWidth);\n            wrapInfo.accumWidth = res.accumWidth + tokenPaddingH;\n            linesWidths = res.linesWidths;\n            strLines = res.lines;\n        }\n    }\n    if (!strLines) {\n        strLines = str.split('\\n');\n    }\n    var fontMeasureInfo = ensureFontMeasureInfo(font);\n    for (var i = 0; i < strLines.length; i++) {\n        var text = strLines[i];\n        var token = new RichTextToken();\n        token.styleName = styleName;\n        token.text = text;\n        token.isLineHolder = !text && !isEmptyStr;\n        if (typeof tokenStyle.width === 'number') {\n            token.width = tokenStyle.width;\n        }\n        else {\n            token.width = linesWidths\n                ? linesWidths[i]\n                : measureWidth(fontMeasureInfo, text);\n        }\n        if (!i && !newLine) {\n            var tokens = (lines[lines.length - 1] || (lines[0] = new RichTextLine())).tokens;\n            var tokensLen = tokens.length;\n            (tokensLen === 1 && tokens[0].isLineHolder)\n                ? (tokens[0] = token)\n                : ((text || !tokensLen || isEmptyStr) && tokens.push(token));\n        }\n        else {\n            lines.push(new RichTextLine([token]));\n        }\n    }\n}\nfunction isAlphabeticLetter(ch) {\n    var code = ch.charCodeAt(0);\n    return code >= 0x20 && code <= 0x24F\n        || code >= 0x370 && code <= 0x10FF\n        || code >= 0x1200 && code <= 0x13FF\n        || code >= 0x1E00 && code <= 0x206F;\n}\nvar breakCharMap = reduce(',&?/;] '.split(''), function (obj, ch) {\n    obj[ch] = true;\n    return obj;\n}, {});\nfunction isWordBreakChar(ch) {\n    if (isAlphabeticLetter(ch)) {\n        if (breakCharMap[ch]) {\n            return true;\n        }\n        return false;\n    }\n    return true;\n}\nfunction wrapText(text, font, lineWidth, isBreakAll, lastAccumWidth) {\n    var lines = [];\n    var linesWidths = [];\n    var line = '';\n    var currentWord = '';\n    var currentWordWidth = 0;\n    var accumWidth = 0;\n    var fontMeasureInfo = ensureFontMeasureInfo(font);\n    for (var i = 0; i < text.length; i++) {\n        var ch = text.charAt(i);\n        if (ch === '\\n') {\n            if (currentWord) {\n                line += currentWord;\n                accumWidth += currentWordWidth;\n            }\n            lines.push(line);\n            linesWidths.push(accumWidth);\n            line = '';\n            currentWord = '';\n            currentWordWidth = 0;\n            accumWidth = 0;\n            continue;\n        }\n        var chWidth = measureCharWidth(fontMeasureInfo, ch.charCodeAt(0));\n        var inWord = isBreakAll ? false : !isWordBreakChar(ch);\n        if (!lines.length\n            ? lastAccumWidth + accumWidth + chWidth > lineWidth\n            : accumWidth + chWidth > lineWidth) {\n            if (!accumWidth) {\n                if (inWord) {\n                    lines.push(currentWord);\n                    linesWidths.push(currentWordWidth);\n                    currentWord = ch;\n                    currentWordWidth = chWidth;\n                }\n                else {\n                    lines.push(ch);\n                    linesWidths.push(chWidth);\n                }\n            }\n            else if (line || currentWord) {\n                if (inWord) {\n                    if (!line) {\n                        line = currentWord;\n                        currentWord = '';\n                        currentWordWidth = 0;\n                        accumWidth = currentWordWidth;\n                    }\n                    lines.push(line);\n                    linesWidths.push(accumWidth - currentWordWidth);\n                    currentWord += ch;\n                    currentWordWidth += chWidth;\n                    line = '';\n                    accumWidth = currentWordWidth;\n                }\n                else {\n                    if (currentWord) {\n                        line += currentWord;\n                        currentWord = '';\n                        currentWordWidth = 0;\n                    }\n                    lines.push(line);\n                    linesWidths.push(accumWidth);\n                    line = ch;\n                    accumWidth = chWidth;\n                }\n            }\n            continue;\n        }\n        accumWidth += chWidth;\n        if (inWord) {\n            currentWord += ch;\n            currentWordWidth += chWidth;\n        }\n        else {\n            if (currentWord) {\n                line += currentWord;\n                currentWord = '';\n                currentWordWidth = 0;\n            }\n            line += ch;\n        }\n    }\n    if (currentWord) {\n        line += currentWord;\n    }\n    if (line) {\n        lines.push(line);\n        linesWidths.push(accumWidth);\n    }\n    if (lines.length === 1) {\n        accumWidth += lastAccumWidth;\n    }\n    return {\n        accumWidth: accumWidth,\n        lines: lines,\n        linesWidths: linesWidths\n    };\n}\nexport function calcInnerTextOverflowArea(out, overflowRect, baseX, baseY, textAlign, textVerticalAlign) {\n    out.baseX = baseX;\n    out.baseY = baseY;\n    out.outerWidth = out.outerHeight = null;\n    if (!overflowRect) {\n        return;\n    }\n    var textWidth = overflowRect.width * 2;\n    var textHeight = overflowRect.height * 2;\n    BoundingRect.set(tmpCITCTextRect, adjustTextX(baseX, textWidth, textAlign), adjustTextY(baseY, textHeight, textVerticalAlign), textWidth, textHeight);\n    BoundingRect.intersect(overflowRect, tmpCITCTextRect, null, tmpCITCIntersectRectOpt);\n    var outIntersectRect = tmpCITCIntersectRectOpt.outIntersectRect;\n    out.outerWidth = outIntersectRect.width;\n    out.outerHeight = outIntersectRect.height;\n    out.baseX = adjustTextX(outIntersectRect.x, outIntersectRect.width, textAlign, true);\n    out.baseY = adjustTextY(outIntersectRect.y, outIntersectRect.height, textVerticalAlign, true);\n}\nvar tmpCITCTextRect = new BoundingRect(0, 0, 0, 0);\nvar tmpCITCIntersectRectOpt = { outIntersectRect: {}, clamp: true };\nfunction formatText(text) {\n    return text != null ? (text += '') : (text = '');\n}\nexport function tSpanCreateBoundingRect(style) {\n    var text = formatText(style.text);\n    var font = style.font;\n    var contentWidth = measureWidth(ensureFontMeasureInfo(font), text);\n    var contentHeight = getLineHeight(font);\n    return tSpanCreateBoundingRect2(style, contentWidth, contentHeight, null);\n}\nexport function tSpanCreateBoundingRect2(style, contentWidth, contentHeight, forceLineWidth) {\n    var rect = new BoundingRect(adjustTextX(style.x || 0, contentWidth, style.textAlign), adjustTextY(style.y || 0, contentHeight, style.textBaseline), contentWidth, contentHeight);\n    var lineWidth = forceLineWidth != null\n        ? forceLineWidth\n        : (tSpanHasStroke(style) ? style.lineWidth : 0);\n    if (lineWidth > 0) {\n        rect.x -= lineWidth / 2;\n        rect.y -= lineWidth / 2;\n        rect.width += lineWidth;\n        rect.height += lineWidth;\n    }\n    return rect;\n}\nexport function tSpanHasStroke(style) {\n    var stroke = style.stroke;\n    return stroke != null && stroke !== 'none' && style.lineWidth > 0;\n}\n", "import { __extends } from \"tslib\";\nimport Element from '../Element.js';\nimport BoundingRect from '../core/BoundingRect.js';\nimport { keys, extend, createObject } from '../core/util.js';\nimport { REDRAW_BIT, STYLE_CHANGED_BIT } from './constants.js';\nvar STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10));\nexport var DEFAULT_COMMON_STYLE = {\n    shadowBlur: 0,\n    shadowOffsetX: 0,\n    shadowOffsetY: 0,\n    shadowColor: '#000',\n    opacity: 1,\n    blend: 'source-over'\n};\nexport var DEFAULT_COMMON_ANIMATION_PROPS = {\n    style: {\n        shadowBlur: true,\n        shadowOffsetX: true,\n        shadowOffsetY: true,\n        shadowColor: true,\n        opacity: true\n    }\n};\nDEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true;\nvar PRIMARY_STATES_KEYS = ['z', 'z2', 'invisible'];\nvar PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible'];\nvar Displayable = (function (_super) {\n    __extends(Displayable, _super);\n    function Displayable(props) {\n        return _super.call(this, props) || this;\n    }\n    Displayable.prototype._init = function (props) {\n        var keysArr = keys(props);\n        for (var i = 0; i < keysArr.length; i++) {\n            var key = keysArr[i];\n            if (key === 'style') {\n                this.useStyle(props[key]);\n            }\n            else {\n                _super.prototype.attrKV.call(this, key, props[key]);\n            }\n        }\n        if (!this.style) {\n            this.useStyle({});\n        }\n    };\n    Displayable.prototype.beforeBrush = function () { };\n    Displayable.prototype.afterBrush = function () { };\n    Displayable.prototype.innerBeforeBrush = function () { };\n    Displayable.prototype.innerAfterBrush = function () { };\n    Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) {\n        var m = this.transform;\n        if (this.ignore\n            || this.invisible\n            || this.style.opacity === 0\n            || (this.culling\n                && isDisplayableCulled(this, viewWidth, viewHeight))\n            || (m && !m[0] && !m[3])) {\n            return false;\n        }\n        if (considerClipPath && this.__clipPaths && this.__clipPaths.length) {\n            for (var i = 0; i < this.__clipPaths.length; ++i) {\n                if (this.__clipPaths[i].isZeroArea()) {\n                    return false;\n                }\n            }\n        }\n        if (considerAncestors && this.parent) {\n            var parent_1 = this.parent;\n            while (parent_1) {\n                if (parent_1.ignore) {\n                    return false;\n                }\n                parent_1 = parent_1.parent;\n            }\n        }\n        return true;\n    };\n    Displayable.prototype.contain = function (x, y) {\n        return this.rectContain(x, y);\n    };\n    Displayable.prototype.traverse = function (cb, context) {\n        cb.call(context, this);\n    };\n    Displayable.prototype.rectContain = function (x, y) {\n        var coord = this.transformCoordToLocal(x, y);\n        var rect = this.getBoundingRect();\n        return rect.contain(coord[0], coord[1]);\n    };\n    Displayable.prototype.getPaintRect = function () {\n        var rect = this._paintRect;\n        if (!this._paintRect || this.__dirty) {\n            var transform = this.transform;\n            var elRect = this.getBoundingRect();\n            var style = this.style;\n            var shadowSize = style.shadowBlur || 0;\n            var shadowOffsetX = style.shadowOffsetX || 0;\n            var shadowOffsetY = style.shadowOffsetY || 0;\n            rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0));\n            if (transform) {\n                BoundingRect.applyTransform(rect, elRect, transform);\n            }\n            else {\n                rect.copy(elRect);\n            }\n            if (shadowSize || shadowOffsetX || shadowOffsetY) {\n                rect.width += shadowSize * 2 + Math.abs(shadowOffsetX);\n                rect.height += shadowSize * 2 + Math.abs(shadowOffsetY);\n                rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize);\n                rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize);\n            }\n            var tolerance = this.dirtyRectTolerance;\n            if (!rect.isZero()) {\n                rect.x = Math.floor(rect.x - tolerance);\n                rect.y = Math.floor(rect.y - tolerance);\n                rect.width = Math.ceil(rect.width + 1 + tolerance * 2);\n                rect.height = Math.ceil(rect.height + 1 + tolerance * 2);\n            }\n        }\n        return rect;\n    };\n    Displayable.prototype.setPrevPaintRect = function (paintRect) {\n        if (paintRect) {\n            this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0);\n            this._prevPaintRect.copy(paintRect);\n        }\n        else {\n            this._prevPaintRect = null;\n        }\n    };\n    Displayable.prototype.getPrevPaintRect = function () {\n        return this._prevPaintRect;\n    };\n    Displayable.prototype.animateStyle = function (loop) {\n        return this.animate('style', loop);\n    };\n    Displayable.prototype.updateDuringAnimation = function (targetKey) {\n        if (targetKey === 'style') {\n            this.dirtyStyle();\n        }\n        else {\n            this.markRedraw();\n        }\n    };\n    Displayable.prototype.attrKV = function (key, value) {\n        if (key !== 'style') {\n            _super.prototype.attrKV.call(this, key, value);\n        }\n        else {\n            if (!this.style) {\n                this.useStyle(value);\n            }\n            else {\n                this.setStyle(value);\n            }\n        }\n    };\n    Displayable.prototype.setStyle = function (keyOrObj, value) {\n        if (typeof keyOrObj === 'string') {\n            this.style[keyOrObj] = value;\n        }\n        else {\n            extend(this.style, keyOrObj);\n        }\n        this.dirtyStyle();\n        return this;\n    };\n    Displayable.prototype.dirtyStyle = function (notRedraw) {\n        if (!notRedraw) {\n            this.markRedraw();\n        }\n        this.__dirty |= STYLE_CHANGED_BIT;\n        if (this._rect) {\n            this._rect = null;\n        }\n    };\n    Displayable.prototype.dirty = function () {\n        this.dirtyStyle();\n    };\n    Displayable.prototype.styleChanged = function () {\n        return !!(this.__dirty & STYLE_CHANGED_BIT);\n    };\n    Displayable.prototype.styleUpdated = function () {\n        this.__dirty &= ~STYLE_CHANGED_BIT;\n    };\n    Displayable.prototype.createStyle = function (obj) {\n        return createObject(DEFAULT_COMMON_STYLE, obj);\n    };\n    Displayable.prototype.useStyle = function (obj) {\n        if (!obj[STYLE_MAGIC_KEY]) {\n            obj = this.createStyle(obj);\n        }\n        if (this.__inHover) {\n            this.__hoverStyle = obj;\n        }\n        else {\n            this.style = obj;\n        }\n        this.dirtyStyle();\n    };\n    Displayable.prototype.isStyleObject = function (obj) {\n        return obj[STYLE_MAGIC_KEY];\n    };\n    Displayable.prototype._innerSaveToNormal = function (toState) {\n        _super.prototype._innerSaveToNormal.call(this, toState);\n        var normalState = this._normalState;\n        if (toState.style && !normalState.style) {\n            normalState.style = this._mergeStyle(this.createStyle(), this.style);\n        }\n        this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS);\n    };\n    Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {\n        _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);\n        var needsRestoreToNormal = !(state && keepCurrentStates);\n        var targetStyle;\n        if (state && state.style) {\n            if (transition) {\n                if (keepCurrentStates) {\n                    targetStyle = state.style;\n                }\n                else {\n                    targetStyle = this._mergeStyle(this.createStyle(), normalState.style);\n                    this._mergeStyle(targetStyle, state.style);\n                }\n            }\n            else {\n                targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style);\n                this._mergeStyle(targetStyle, state.style);\n            }\n        }\n        else if (needsRestoreToNormal) {\n            targetStyle = normalState.style;\n        }\n        if (targetStyle) {\n            if (transition) {\n                var sourceStyle = this.style;\n                this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle);\n                if (needsRestoreToNormal) {\n                    var changedKeys = keys(sourceStyle);\n                    for (var i = 0; i < changedKeys.length; i++) {\n                        var key = changedKeys[i];\n                        if (key in targetStyle) {\n                            targetStyle[key] = targetStyle[key];\n                            this.style[key] = sourceStyle[key];\n                        }\n                    }\n                }\n                var targetKeys = keys(targetStyle);\n                for (var i = 0; i < targetKeys.length; i++) {\n                    var key = targetKeys[i];\n                    this.style[key] = this.style[key];\n                }\n                this._transitionState(stateName, {\n                    style: targetStyle\n                }, animationCfg, this.getAnimationStyleProps());\n            }\n            else {\n                this.useStyle(targetStyle);\n            }\n        }\n        var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS;\n        for (var i = 0; i < statesKeys.length; i++) {\n            var key = statesKeys[i];\n            if (state && state[key] != null) {\n                this[key] = state[key];\n            }\n            else if (needsRestoreToNormal) {\n                if (normalState[key] != null) {\n                    this[key] = normalState[key];\n                }\n            }\n        }\n    };\n    Displayable.prototype._mergeStates = function (states) {\n        var mergedState = _super.prototype._mergeStates.call(this, states);\n        var mergedStyle;\n        for (var i = 0; i < states.length; i++) {\n            var state = states[i];\n            if (state.style) {\n                mergedStyle = mergedStyle || {};\n                this._mergeStyle(mergedStyle, state.style);\n            }\n        }\n        if (mergedStyle) {\n            mergedState.style = mergedStyle;\n        }\n        return mergedState;\n    };\n    Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) {\n        extend(targetStyle, sourceStyle);\n        return targetStyle;\n    };\n    Displayable.prototype.getAnimationStyleProps = function () {\n        return DEFAULT_COMMON_ANIMATION_PROPS;\n    };\n    Displayable.initDefaultProps = (function () {\n        var dispProto = Displayable.prototype;\n        dispProto.type = 'displayable';\n        dispProto.invisible = false;\n        dispProto.z = 0;\n        dispProto.z2 = 0;\n        dispProto.zlevel = 0;\n        dispProto.culling = false;\n        dispProto.cursor = 'pointer';\n        dispProto.rectHover = false;\n        dispProto.incremental = false;\n        dispProto._rect = null;\n        dispProto.dirtyRectTolerance = 0;\n        dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT;\n    })();\n    return Displayable;\n}(Element));\nvar tmpRect = new BoundingRect(0, 0, 0, 0);\nvar viewRect = new BoundingRect(0, 0, 0, 0);\nfunction isDisplayableCulled(el, width, height) {\n    tmpRect.copy(el.getBoundingRect());\n    if (el.transform) {\n        tmpRect.applyTransform(el.transform);\n    }\n    viewRect.width = width;\n    viewRect.height = height;\n    return !tmpRect.intersect(viewRect);\n}\nexport default Displayable;\n", "import * as vec2 from './vector.js';\nimport * as curve from './curve.js';\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI2 = Math.PI * 2;\nvar start = vec2.create();\nvar end = vec2.create();\nvar extremity = vec2.create();\nexport function fromPoints(points, min, max) {\n    if (points.length === 0) {\n        return;\n    }\n    var p = points[0];\n    var left = p[0];\n    var right = p[0];\n    var top = p[1];\n    var bottom = p[1];\n    for (var i = 1; i < points.length; i++) {\n        p = points[i];\n        left = mathMin(left, p[0]);\n        right = mathMax(right, p[0]);\n        top = mathMin(top, p[1]);\n        bottom = mathMax(bottom, p[1]);\n    }\n    min[0] = left;\n    min[1] = top;\n    max[0] = right;\n    max[1] = bottom;\n}\nexport function fromLine(x0, y0, x1, y1, min, max) {\n    min[0] = mathMin(x0, x1);\n    min[1] = mathMin(y0, y1);\n    max[0] = mathMax(x0, x1);\n    max[1] = mathMax(y0, y1);\n}\nvar xDim = [];\nvar yDim = [];\nexport function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) {\n    var cubicExtrema = curve.cubicExtrema;\n    var cubicAt = curve.cubicAt;\n    var n = cubicExtrema(x0, x1, x2, x3, xDim);\n    min[0] = Infinity;\n    min[1] = Infinity;\n    max[0] = -Infinity;\n    max[1] = -Infinity;\n    for (var i = 0; i < n; i++) {\n        var x = cubicAt(x0, x1, x2, x3, xDim[i]);\n        min[0] = mathMin(x, min[0]);\n        max[0] = mathMax(x, max[0]);\n    }\n    n = cubicExtrema(y0, y1, y2, y3, yDim);\n    for (var i = 0; i < n; i++) {\n        var y = cubicAt(y0, y1, y2, y3, yDim[i]);\n        min[1] = mathMin(y, min[1]);\n        max[1] = mathMax(y, max[1]);\n    }\n    min[0] = mathMin(x0, min[0]);\n    max[0] = mathMax(x0, max[0]);\n    min[0] = mathMin(x3, min[0]);\n    max[0] = mathMax(x3, max[0]);\n    min[1] = mathMin(y0, min[1]);\n    max[1] = mathMax(y0, max[1]);\n    min[1] = mathMin(y3, min[1]);\n    max[1] = mathMax(y3, max[1]);\n}\nexport function fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) {\n    var quadraticExtremum = curve.quadraticExtremum;\n    var quadraticAt = curve.quadraticAt;\n    var tx = mathMax(mathMin(quadraticExtremum(x0, x1, x2), 1), 0);\n    var ty = mathMax(mathMin(quadraticExtremum(y0, y1, y2), 1), 0);\n    var x = quadraticAt(x0, x1, x2, tx);\n    var y = quadraticAt(y0, y1, y2, ty);\n    min[0] = mathMin(x0, x2, x);\n    min[1] = mathMin(y0, y2, y);\n    max[0] = mathMax(x0, x2, x);\n    max[1] = mathMax(y0, y2, y);\n}\nexport function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max) {\n    var vec2Min = vec2.min;\n    var vec2Max = vec2.max;\n    var diff = Math.abs(startAngle - endAngle);\n    if (diff % PI2 < 1e-4 && diff > 1e-4) {\n        min[0] = x - rx;\n        min[1] = y - ry;\n        max[0] = x + rx;\n        max[1] = y + ry;\n        return;\n    }\n    start[0] = mathCos(startAngle) * rx + x;\n    start[1] = mathSin(startAngle) * ry + y;\n    end[0] = mathCos(endAngle) * rx + x;\n    end[1] = mathSin(endAngle) * ry + y;\n    vec2Min(min, start, end);\n    vec2Max(max, start, end);\n    startAngle = startAngle % (PI2);\n    if (startAngle < 0) {\n        startAngle = startAngle + PI2;\n    }\n    endAngle = endAngle % (PI2);\n    if (endAngle < 0) {\n        endAngle = endAngle + PI2;\n    }\n    if (startAngle > endAngle && !anticlockwise) {\n        endAngle += PI2;\n    }\n    else if (startAngle < endAngle && anticlockwise) {\n        startAngle += PI2;\n    }\n    if (anticlockwise) {\n        var tmp = endAngle;\n        endAngle = startAngle;\n        startAngle = tmp;\n    }\n    for (var angle = 0; angle < endAngle; angle += Math.PI / 2) {\n        if (angle > startAngle) {\n            extremity[0] = mathCos(angle) * rx + x;\n            extremity[1] = mathSin(angle) * ry + y;\n            vec2Min(min, extremity, min);\n            vec2Max(max, extremity, max);\n        }\n    }\n}\n", "import * as vec2 from './vector.js';\nimport BoundingRect from './BoundingRect.js';\nimport { devicePixelRatio as dpr } from '../config.js';\nimport { fromLine, fromCubic, fromQuadratic, fromArc } from './bbox.js';\nimport { cubicLength, cubicSubdivide, quadraticLength, quadraticSubdivide } from './curve.js';\nvar CMD = {\n    M: 1,\n    L: 2,\n    C: 3,\n    Q: 4,\n    A: 5,\n    Z: 6,\n    R: 7\n};\nvar tmpOutX = [];\nvar tmpOutY = [];\nvar min = [];\nvar max = [];\nvar min2 = [];\nvar max2 = [];\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathCos = Math.cos;\nvar mathSin = Math.sin;\nvar mathAbs = Math.abs;\nvar PI = Math.PI;\nvar PI2 = PI * 2;\nvar hasTypedArray = typeof Float32Array !== 'undefined';\nvar tmpAngles = [];\nfunction modPI2(radian) {\n    var n = Math.round(radian / PI * 1e8) / 1e8;\n    return (n % 2) * PI;\n}\nexport function normalizeArcAngles(angles, anticlockwise) {\n    var newStartAngle = modPI2(angles[0]);\n    if (newStartAngle < 0) {\n        newStartAngle += PI2;\n    }\n    var delta = newStartAngle - angles[0];\n    var newEndAngle = angles[1];\n    newEndAngle += delta;\n    if (!anticlockwise && newEndAngle - newStartAngle >= PI2) {\n        newEndAngle = newStartAngle + PI2;\n    }\n    else if (anticlockwise && newStartAngle - newEndAngle >= PI2) {\n        newEndAngle = newStartAngle - PI2;\n    }\n    else if (!anticlockwise && newStartAngle > newEndAngle) {\n        newEndAngle = newStartAngle + (PI2 - modPI2(newStartAngle - newEndAngle));\n    }\n    else if (anticlockwise && newStartAngle < newEndAngle) {\n        newEndAngle = newStartAngle - (PI2 - modPI2(newEndAngle - newStartAngle));\n    }\n    angles[0] = newStartAngle;\n    angles[1] = newEndAngle;\n}\nvar PathProxy = (function () {\n    function PathProxy(notSaveData) {\n        this.dpr = 1;\n        this._xi = 0;\n        this._yi = 0;\n        this._x0 = 0;\n        this._y0 = 0;\n        this._len = 0;\n        if (notSaveData) {\n            this._saveData = false;\n        }\n        if (this._saveData) {\n            this.data = [];\n        }\n    }\n    PathProxy.prototype.increaseVersion = function () {\n        this._version++;\n    };\n    PathProxy.prototype.getVersion = function () {\n        return this._version;\n    };\n    PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) {\n        segmentIgnoreThreshold = segmentIgnoreThreshold || 0;\n        if (segmentIgnoreThreshold > 0) {\n            this._ux = mathAbs(segmentIgnoreThreshold / dpr / sx) || 0;\n            this._uy = mathAbs(segmentIgnoreThreshold / dpr / sy) || 0;\n        }\n    };\n    PathProxy.prototype.setDPR = function (dpr) {\n        this.dpr = dpr;\n    };\n    PathProxy.prototype.setContext = function (ctx) {\n        this._ctx = ctx;\n    };\n    PathProxy.prototype.getContext = function () {\n        return this._ctx;\n    };\n    PathProxy.prototype.beginPath = function () {\n        this._ctx && this._ctx.beginPath();\n        this.reset();\n        return this;\n    };\n    PathProxy.prototype.reset = function () {\n        if (this._saveData) {\n            this._len = 0;\n        }\n        if (this._pathSegLen) {\n            this._pathSegLen = null;\n            this._pathLen = 0;\n        }\n        this._version++;\n    };\n    PathProxy.prototype.moveTo = function (x, y) {\n        this._drawPendingPt();\n        this.addData(CMD.M, x, y);\n        this._ctx && this._ctx.moveTo(x, y);\n        this._x0 = x;\n        this._y0 = y;\n        this._xi = x;\n        this._yi = y;\n        return this;\n    };\n    PathProxy.prototype.lineTo = function (x, y) {\n        var dx = mathAbs(x - this._xi);\n        var dy = mathAbs(y - this._yi);\n        var exceedUnit = dx > this._ux || dy > this._uy;\n        this.addData(CMD.L, x, y);\n        if (this._ctx && exceedUnit) {\n            this._ctx.lineTo(x, y);\n        }\n        if (exceedUnit) {\n            this._xi = x;\n            this._yi = y;\n            this._pendingPtDist = 0;\n        }\n        else {\n            var d2 = dx * dx + dy * dy;\n            if (d2 > this._pendingPtDist) {\n                this._pendingPtX = x;\n                this._pendingPtY = y;\n                this._pendingPtDist = d2;\n            }\n        }\n        return this;\n    };\n    PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) {\n        this._drawPendingPt();\n        this.addData(CMD.C, x1, y1, x2, y2, x3, y3);\n        if (this._ctx) {\n            this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n        }\n        this._xi = x3;\n        this._yi = y3;\n        return this;\n    };\n    PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) {\n        this._drawPendingPt();\n        this.addData(CMD.Q, x1, y1, x2, y2);\n        if (this._ctx) {\n            this._ctx.quadraticCurveTo(x1, y1, x2, y2);\n        }\n        this._xi = x2;\n        this._yi = y2;\n        return this;\n    };\n    PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n        this._drawPendingPt();\n        tmpAngles[0] = startAngle;\n        tmpAngles[1] = endAngle;\n        normalizeArcAngles(tmpAngles, anticlockwise);\n        startAngle = tmpAngles[0];\n        endAngle = tmpAngles[1];\n        var delta = endAngle - startAngle;\n        this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1);\n        this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n        this._xi = mathCos(endAngle) * r + cx;\n        this._yi = mathSin(endAngle) * r + cy;\n        return this;\n    };\n    PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) {\n        this._drawPendingPt();\n        if (this._ctx) {\n            this._ctx.arcTo(x1, y1, x2, y2, radius);\n        }\n        return this;\n    };\n    PathProxy.prototype.rect = function (x, y, w, h) {\n        this._drawPendingPt();\n        this._ctx && this._ctx.rect(x, y, w, h);\n        this.addData(CMD.R, x, y, w, h);\n        return this;\n    };\n    PathProxy.prototype.closePath = function () {\n        this._drawPendingPt();\n        this.addData(CMD.Z);\n        var ctx = this._ctx;\n        var x0 = this._x0;\n        var y0 = this._y0;\n        if (ctx) {\n            ctx.closePath();\n        }\n        this._xi = x0;\n        this._yi = y0;\n        return this;\n    };\n    PathProxy.prototype.fill = function (ctx) {\n        ctx && ctx.fill();\n        this.toStatic();\n    };\n    PathProxy.prototype.stroke = function (ctx) {\n        ctx && ctx.stroke();\n        this.toStatic();\n    };\n    PathProxy.prototype.len = function () {\n        return this._len;\n    };\n    PathProxy.prototype.setData = function (data) {\n        if (!this._saveData) {\n            return;\n        }\n        var len = data.length;\n        if (!(this.data && this.data.length === len) && hasTypedArray) {\n            this.data = new Float32Array(len);\n        }\n        for (var i = 0; i < len; i++) {\n            this.data[i] = data[i];\n        }\n        this._len = len;\n    };\n    PathProxy.prototype.appendPath = function (path) {\n        if (!this._saveData) {\n            return;\n        }\n        if (!(path instanceof Array)) {\n            path = [path];\n        }\n        var len = path.length;\n        var appendSize = 0;\n        var offset = this._len;\n        for (var i = 0; i < len; i++) {\n            appendSize += path[i].len();\n        }\n        var oldData = this.data;\n        if (hasTypedArray && (oldData instanceof Float32Array || !oldData)) {\n            this.data = new Float32Array(offset + appendSize);\n            if (offset > 0 && oldData) {\n                for (var k = 0; k < offset; k++) {\n                    this.data[k] = oldData[k];\n                }\n            }\n        }\n        for (var i = 0; i < len; i++) {\n            var appendPathData = path[i].data;\n            for (var k = 0; k < appendPathData.length; k++) {\n                this.data[offset++] = appendPathData[k];\n            }\n        }\n        this._len = offset;\n    };\n    PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) {\n        if (!this._saveData) {\n            return;\n        }\n        var data = this.data;\n        if (this._len + arguments.length > data.length) {\n            this._expandData();\n            data = this.data;\n        }\n        for (var i = 0; i < arguments.length; i++) {\n            data[this._len++] = arguments[i];\n        }\n    };\n    PathProxy.prototype._drawPendingPt = function () {\n        if (this._pendingPtDist > 0) {\n            this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY);\n            this._pendingPtDist = 0;\n        }\n    };\n    PathProxy.prototype._expandData = function () {\n        if (!(this.data instanceof Array)) {\n            var newData = [];\n            for (var i = 0; i < this._len; i++) {\n                newData[i] = this.data[i];\n            }\n            this.data = newData;\n        }\n    };\n    PathProxy.prototype.toStatic = function () {\n        if (!this._saveData) {\n            return;\n        }\n        this._drawPendingPt();\n        var data = this.data;\n        if (data instanceof Array) {\n            data.length = this._len;\n            if (hasTypedArray && this._len > 11) {\n                this.data = new Float32Array(data);\n            }\n        }\n    };\n    PathProxy.prototype.getBoundingRect = function () {\n        min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE;\n        max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE;\n        var data = this.data;\n        var xi = 0;\n        var yi = 0;\n        var x0 = 0;\n        var y0 = 0;\n        var i;\n        for (i = 0; i < this._len;) {\n            var cmd = data[i++];\n            var isFirst = i === 1;\n            if (isFirst) {\n                xi = data[i];\n                yi = data[i + 1];\n                x0 = xi;\n                y0 = yi;\n            }\n            switch (cmd) {\n                case CMD.M:\n                    xi = x0 = data[i++];\n                    yi = y0 = data[i++];\n                    min2[0] = x0;\n                    min2[1] = y0;\n                    max2[0] = x0;\n                    max2[1] = y0;\n                    break;\n                case CMD.L:\n                    fromLine(xi, yi, data[i], data[i + 1], min2, max2);\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD.C:\n                    fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2);\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD.Q:\n                    fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2);\n                    xi = data[i++];\n                    yi = data[i++];\n                    break;\n                case CMD.A:\n                    var cx = data[i++];\n                    var cy = data[i++];\n                    var rx = data[i++];\n                    var ry = data[i++];\n                    var startAngle = data[i++];\n                    var endAngle = data[i++] + startAngle;\n                    i += 1;\n                    var anticlockwise = !data[i++];\n                    if (isFirst) {\n                        x0 = mathCos(startAngle) * rx + cx;\n                        y0 = mathSin(startAngle) * ry + cy;\n                    }\n                    fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2);\n                    xi = mathCos(endAngle) * rx + cx;\n                    yi = mathSin(endAngle) * ry + cy;\n                    break;\n                case CMD.R:\n                    x0 = xi = data[i++];\n                    y0 = yi = data[i++];\n                    var width = data[i++];\n                    var height = data[i++];\n                    fromLine(x0, y0, x0 + width, y0 + height, min2, max2);\n                    break;\n                case CMD.Z:\n                    xi = x0;\n                    yi = y0;\n                    break;\n            }\n            vec2.min(min, min, min2);\n            vec2.max(max, max, max2);\n        }\n        if (i === 0) {\n            min[0] = min[1] = max[0] = max[1] = 0;\n        }\n        return new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n    };\n    PathProxy.prototype._calculateLength = function () {\n        var data = this.data;\n        var len = this._len;\n        var ux = this._ux;\n        var uy = this._uy;\n        var xi = 0;\n        var yi = 0;\n        var x0 = 0;\n        var y0 = 0;\n        if (!this._pathSegLen) {\n            this._pathSegLen = [];\n        }\n        var pathSegLen = this._pathSegLen;\n        var pathTotalLen = 0;\n        var segCount = 0;\n        for (var i = 0; i < len;) {\n            var cmd = data[i++];\n            var isFirst = i === 1;\n            if (isFirst) {\n                xi = data[i];\n                yi = data[i + 1];\n                x0 = xi;\n                y0 = yi;\n            }\n            var l = -1;\n            switch (cmd) {\n                case CMD.M:\n                    xi = x0 = data[i++];\n                    yi = y0 = data[i++];\n                    break;\n                case CMD.L: {\n                    var x2 = data[i++];\n                    var y2 = data[i++];\n                    var dx = x2 - xi;\n                    var dy = y2 - yi;\n                    if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) {\n                        l = Math.sqrt(dx * dx + dy * dy);\n                        xi = x2;\n                        yi = y2;\n                    }\n                    break;\n                }\n                case CMD.C: {\n                    var x1 = data[i++];\n                    var y1 = data[i++];\n                    var x2 = data[i++];\n                    var y2 = data[i++];\n                    var x3 = data[i++];\n                    var y3 = data[i++];\n                    l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10);\n                    xi = x3;\n                    yi = y3;\n                    break;\n                }\n                case CMD.Q: {\n                    var x1 = data[i++];\n                    var y1 = data[i++];\n                    var x2 = data[i++];\n                    var y2 = data[i++];\n                    l = quadraticLength(xi, yi, x1, y1, x2, y2, 10);\n                    xi = x2;\n                    yi = y2;\n                    break;\n                }\n                case CMD.A:\n                    var cx = data[i++];\n                    var cy = data[i++];\n                    var rx = data[i++];\n                    var ry = data[i++];\n                    var startAngle = data[i++];\n                    var delta = data[i++];\n                    var endAngle = delta + startAngle;\n                    i += 1;\n                    if (isFirst) {\n                        x0 = mathCos(startAngle) * rx + cx;\n                        y0 = mathSin(startAngle) * ry + cy;\n                    }\n                    l = mathMax(rx, ry) * mathMin(PI2, Math.abs(delta));\n                    xi = mathCos(endAngle) * rx + cx;\n                    yi = mathSin(endAngle) * ry + cy;\n                    break;\n                case CMD.R: {\n                    x0 = xi = data[i++];\n                    y0 = yi = data[i++];\n                    var width = data[i++];\n                    var height = data[i++];\n                    l = width * 2 + height * 2;\n                    break;\n                }\n                case CMD.Z: {\n                    var dx = x0 - xi;\n                    var dy = y0 - yi;\n                    l = Math.sqrt(dx * dx + dy * dy);\n                    xi = x0;\n                    yi = y0;\n                    break;\n                }\n            }\n            if (l >= 0) {\n                pathSegLen[segCount++] = l;\n                pathTotalLen += l;\n            }\n        }\n        this._pathLen = pathTotalLen;\n        return pathTotalLen;\n    };\n    PathProxy.prototype.rebuildPath = function (ctx, percent) {\n        var d = this.data;\n        var ux = this._ux;\n        var uy = this._uy;\n        var len = this._len;\n        var x0;\n        var y0;\n        var xi;\n        var yi;\n        var x;\n        var y;\n        var drawPart = percent < 1;\n        var pathSegLen;\n        var pathTotalLen;\n        var accumLength = 0;\n        var segCount = 0;\n        var displayedLength;\n        var pendingPtDist = 0;\n        var pendingPtX;\n        var pendingPtY;\n        if (drawPart) {\n            if (!this._pathSegLen) {\n                this._calculateLength();\n            }\n            pathSegLen = this._pathSegLen;\n            pathTotalLen = this._pathLen;\n            displayedLength = percent * pathTotalLen;\n            if (!displayedLength) {\n                return;\n            }\n        }\n        lo: for (var i = 0; i < len;) {\n            var cmd = d[i++];\n            var isFirst = i === 1;\n            if (isFirst) {\n                xi = d[i];\n                yi = d[i + 1];\n                x0 = xi;\n                y0 = yi;\n            }\n            if (cmd !== CMD.L && pendingPtDist > 0) {\n                ctx.lineTo(pendingPtX, pendingPtY);\n                pendingPtDist = 0;\n            }\n            switch (cmd) {\n                case CMD.M:\n                    x0 = xi = d[i++];\n                    y0 = yi = d[i++];\n                    ctx.moveTo(xi, yi);\n                    break;\n                case CMD.L: {\n                    x = d[i++];\n                    y = d[i++];\n                    var dx = mathAbs(x - xi);\n                    var dy = mathAbs(y - yi);\n                    if (dx > ux || dy > uy) {\n                        if (drawPart) {\n                            var l = pathSegLen[segCount++];\n                            if (accumLength + l > displayedLength) {\n                                var t = (displayedLength - accumLength) / l;\n                                ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t);\n                                break lo;\n                            }\n                            accumLength += l;\n                        }\n                        ctx.lineTo(x, y);\n                        xi = x;\n                        yi = y;\n                        pendingPtDist = 0;\n                    }\n                    else {\n                        var d2 = dx * dx + dy * dy;\n                        if (d2 > pendingPtDist) {\n                            pendingPtX = x;\n                            pendingPtY = y;\n                            pendingPtDist = d2;\n                        }\n                    }\n                    break;\n                }\n                case CMD.C: {\n                    var x1 = d[i++];\n                    var y1 = d[i++];\n                    var x2 = d[i++];\n                    var y2 = d[i++];\n                    var x3 = d[i++];\n                    var y3 = d[i++];\n                    if (drawPart) {\n                        var l = pathSegLen[segCount++];\n                        if (accumLength + l > displayedLength) {\n                            var t = (displayedLength - accumLength) / l;\n                            cubicSubdivide(xi, x1, x2, x3, t, tmpOutX);\n                            cubicSubdivide(yi, y1, y2, y3, t, tmpOutY);\n                            ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]);\n                            break lo;\n                        }\n                        accumLength += l;\n                    }\n                    ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n                    xi = x3;\n                    yi = y3;\n                    break;\n                }\n                case CMD.Q: {\n                    var x1 = d[i++];\n                    var y1 = d[i++];\n                    var x2 = d[i++];\n                    var y2 = d[i++];\n                    if (drawPart) {\n                        var l = pathSegLen[segCount++];\n                        if (accumLength + l > displayedLength) {\n                            var t = (displayedLength - accumLength) / l;\n                            quadraticSubdivide(xi, x1, x2, t, tmpOutX);\n                            quadraticSubdivide(yi, y1, y2, t, tmpOutY);\n                            ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]);\n                            break lo;\n                        }\n                        accumLength += l;\n                    }\n                    ctx.quadraticCurveTo(x1, y1, x2, y2);\n                    xi = x2;\n                    yi = y2;\n                    break;\n                }\n                case CMD.A:\n                    var cx = d[i++];\n                    var cy = d[i++];\n                    var rx = d[i++];\n                    var ry = d[i++];\n                    var startAngle = d[i++];\n                    var delta = d[i++];\n                    var psi = d[i++];\n                    var anticlockwise = !d[i++];\n                    var r = (rx > ry) ? rx : ry;\n                    var isEllipse = mathAbs(rx - ry) > 1e-3;\n                    var endAngle = startAngle + delta;\n                    var breakBuild = false;\n                    if (drawPart) {\n                        var l = pathSegLen[segCount++];\n                        if (accumLength + l > displayedLength) {\n                            endAngle = startAngle + delta * (displayedLength - accumLength) / l;\n                            breakBuild = true;\n                        }\n                        accumLength += l;\n                    }\n                    if (isEllipse && ctx.ellipse) {\n                        ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise);\n                    }\n                    else {\n                        ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n                    }\n                    if (breakBuild) {\n                        break lo;\n                    }\n                    if (isFirst) {\n                        x0 = mathCos(startAngle) * rx + cx;\n                        y0 = mathSin(startAngle) * ry + cy;\n                    }\n                    xi = mathCos(endAngle) * rx + cx;\n                    yi = mathSin(endAngle) * ry + cy;\n                    break;\n                case CMD.R:\n                    x0 = xi = d[i];\n                    y0 = yi = d[i + 1];\n                    x = d[i++];\n                    y = d[i++];\n                    var width = d[i++];\n                    var height = d[i++];\n                    if (drawPart) {\n                        var l = pathSegLen[segCount++];\n                        if (accumLength + l > displayedLength) {\n                            var d_1 = displayedLength - accumLength;\n                            ctx.moveTo(x, y);\n                            ctx.lineTo(x + mathMin(d_1, width), y);\n                            d_1 -= width;\n                            if (d_1 > 0) {\n                                ctx.lineTo(x + width, y + mathMin(d_1, height));\n                            }\n                            d_1 -= height;\n                            if (d_1 > 0) {\n                                ctx.lineTo(x + mathMax(width - d_1, 0), y + height);\n                            }\n                            d_1 -= width;\n                            if (d_1 > 0) {\n                                ctx.lineTo(x, y + mathMax(height - d_1, 0));\n                            }\n                            break lo;\n                        }\n                        accumLength += l;\n                    }\n                    ctx.rect(x, y, width, height);\n                    break;\n                case CMD.Z:\n                    if (drawPart) {\n                        var l = pathSegLen[segCount++];\n                        if (accumLength + l > displayedLength) {\n                            var t = (displayedLength - accumLength) / l;\n                            ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t);\n                            break lo;\n                        }\n                        accumLength += l;\n                    }\n                    ctx.closePath();\n                    xi = x0;\n                    yi = y0;\n            }\n        }\n    };\n    PathProxy.prototype.clone = function () {\n        var newProxy = new PathProxy();\n        var data = this.data;\n        newProxy.data = data.slice ? data.slice()\n            : Array.prototype.slice.call(data);\n        newProxy._len = this._len;\n        return newProxy;\n    };\n    PathProxy.prototype.canSave = function () {\n        return !!this._saveData;\n    };\n    PathProxy.CMD = CMD;\n    PathProxy.initDefaultProps = (function () {\n        var proto = PathProxy.prototype;\n        proto._saveData = true;\n        proto._ux = 0;\n        proto._uy = 0;\n        proto._pendingPtDist = 0;\n        proto._version = 0;\n    })();\n    return PathProxy;\n}());\nexport default PathProxy;\n", "export function containStroke(x0, y0, x1, y1, lineWidth, x, y) {\n    if (lineWidth === 0) {\n        return false;\n    }\n    var _l = lineWidth;\n    var _a = 0;\n    var _b = x0;\n    if ((y > y0 + _l && y > y1 + _l)\n        || (y < y0 - _l && y < y1 - _l)\n        || (x > x0 + _l && x > x1 + _l)\n        || (x < x0 - _l && x < x1 - _l)) {\n        return false;\n    }\n    if (x0 !== x1) {\n        _a = (y0 - y1) / (x0 - x1);\n        _b = (x0 * y1 - x1 * y0) / (x0 - x1);\n    }\n    else {\n        return Math.abs(x - x0) <= _l / 2;\n    }\n    var tmp = _a * x - y + _b;\n    var _s = tmp * tmp / (_a * _a + 1);\n    return _s <= _l / 2 * _l / 2;\n}\n", "import * as curve from '../core/curve.js';\nexport function containStroke(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) {\n    if (lineWidth === 0) {\n        return false;\n    }\n    var _l = lineWidth;\n    if ((y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l)\n        || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l)\n        || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l)\n        || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l)) {\n        return false;\n    }\n    var d = curve.cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null);\n    return d <= _l / 2;\n}\n", "import { quadraticProjectPoint } from '../core/curve.js';\nexport function containStroke(x0, y0, x1, y1, x2, y2, lineWidth, x, y) {\n    if (lineWidth === 0) {\n        return false;\n    }\n    var _l = lineWidth;\n    if ((y > y0 + _l && y > y1 + _l && y > y2 + _l)\n        || (y < y0 - _l && y < y1 - _l && y < y2 - _l)\n        || (x > x0 + _l && x > x1 + _l && x > x2 + _l)\n        || (x < x0 - _l && x < x1 - _l && x < x2 - _l)) {\n        return false;\n    }\n    var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null);\n    return d <= _l / 2;\n}\n", "var PI2 = Math.PI * 2;\nexport function normalizeRadian(angle) {\n    angle %= PI2;\n    if (angle < 0) {\n        angle += PI2;\n    }\n    return angle;\n}\n", "import { normalizeRadian } from './util.js';\nvar PI2 = Math.PI * 2;\nexport function containStroke(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) {\n    if (lineWidth === 0) {\n        return false;\n    }\n    var _l = lineWidth;\n    x -= cx;\n    y -= cy;\n    var d = Math.sqrt(x * x + y * y);\n    if ((d - _l > r) || (d + _l < r)) {\n        return false;\n    }\n    if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) {\n        return true;\n    }\n    if (anticlockwise) {\n        var tmp = startAngle;\n        startAngle = normalizeRadian(endAngle);\n        endAngle = normalizeRadian(tmp);\n    }\n    else {\n        startAngle = normalizeRadian(startAngle);\n        endAngle = normalizeRadian(endAngle);\n    }\n    if (startAngle > endAngle) {\n        endAngle += PI2;\n    }\n    var angle = Math.atan2(y, x);\n    if (angle < 0) {\n        angle += PI2;\n    }\n    return (angle >= startAngle && angle <= endAngle)\n        || (angle + PI2 >= startAngle && angle + PI2 <= endAngle);\n}\n", "export default function windingLine(x0, y0, x1, y1, x, y) {\n    if ((y > y0 && y > y1) || (y < y0 && y < y1)) {\n        return 0;\n    }\n    if (y1 === y0) {\n        return 0;\n    }\n    var t = (y - y0) / (y1 - y0);\n    var dir = y1 < y0 ? 1 : -1;\n    if (t === 1 || t === 0) {\n        dir = y1 < y0 ? 0.5 : -0.5;\n    }\n    var x_ = t * (x1 - x0) + x0;\n    return x_ === x ? Infinity : x_ > x ? dir : 0;\n}\n", "import PathProxy from '../core/PathProxy.js';\nimport * as line from './line.js';\nimport * as cubic from './cubic.js';\nimport * as quadratic from './quadratic.js';\nimport * as arc from './arc.js';\nimport * as curve from '../core/curve.js';\nimport windingLine from './windingLine.js';\nvar CMD = PathProxy.CMD;\nvar PI2 = Math.PI * 2;\nvar EPSILON = 1e-4;\nfunction isAroundEqual(a, b) {\n    return Math.abs(a - b) < EPSILON;\n}\nvar roots = [-1, -1, -1];\nvar extrema = [-1, -1];\nfunction swapExtrema() {\n    var tmp = extrema[0];\n    extrema[0] = extrema[1];\n    extrema[1] = tmp;\n}\nfunction windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) {\n    if ((y > y0 && y > y1 && y > y2 && y > y3)\n        || (y < y0 && y < y1 && y < y2 && y < y3)) {\n        return 0;\n    }\n    var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots);\n    if (nRoots === 0) {\n        return 0;\n    }\n    else {\n        var w = 0;\n        var nExtrema = -1;\n        var y0_ = void 0;\n        var y1_ = void 0;\n        for (var i = 0; i < nRoots; i++) {\n            var t = roots[i];\n            var unit = (t === 0 || t === 1) ? 0.5 : 1;\n            var x_ = curve.cubicAt(x0, x1, x2, x3, t);\n            if (x_ < x) {\n                continue;\n            }\n            if (nExtrema < 0) {\n                nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema);\n                if (extrema[1] < extrema[0] && nExtrema > 1) {\n                    swapExtrema();\n                }\n                y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]);\n                if (nExtrema > 1) {\n                    y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]);\n                }\n            }\n            if (nExtrema === 2) {\n                if (t < extrema[0]) {\n                    w += y0_ < y0 ? unit : -unit;\n                }\n                else if (t < extrema[1]) {\n                    w += y1_ < y0_ ? unit : -unit;\n                }\n                else {\n                    w += y3 < y1_ ? unit : -unit;\n                }\n            }\n            else {\n                if (t < extrema[0]) {\n                    w += y0_ < y0 ? unit : -unit;\n                }\n                else {\n                    w += y3 < y0_ ? unit : -unit;\n                }\n            }\n        }\n        return w;\n    }\n}\nfunction windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) {\n    if ((y > y0 && y > y1 && y > y2)\n        || (y < y0 && y < y1 && y < y2)) {\n        return 0;\n    }\n    var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots);\n    if (nRoots === 0) {\n        return 0;\n    }\n    else {\n        var t = curve.quadraticExtremum(y0, y1, y2);\n        if (t >= 0 && t <= 1) {\n            var w = 0;\n            var y_ = curve.quadraticAt(y0, y1, y2, t);\n            for (var i = 0; i < nRoots; i++) {\n                var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1;\n                var x_ = curve.quadraticAt(x0, x1, x2, roots[i]);\n                if (x_ < x) {\n                    continue;\n                }\n                if (roots[i] < t) {\n                    w += y_ < y0 ? unit : -unit;\n                }\n                else {\n                    w += y2 < y_ ? unit : -unit;\n                }\n            }\n            return w;\n        }\n        else {\n            var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1;\n            var x_ = curve.quadraticAt(x0, x1, x2, roots[0]);\n            if (x_ < x) {\n                return 0;\n            }\n            return y2 < y0 ? unit : -unit;\n        }\n    }\n}\nfunction windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) {\n    y -= cy;\n    if (y > r || y < -r) {\n        return 0;\n    }\n    var tmp = Math.sqrt(r * r - y * y);\n    roots[0] = -tmp;\n    roots[1] = tmp;\n    var dTheta = Math.abs(startAngle - endAngle);\n    if (dTheta < 1e-4) {\n        return 0;\n    }\n    if (dTheta >= PI2 - 1e-4) {\n        startAngle = 0;\n        endAngle = PI2;\n        var dir = anticlockwise ? 1 : -1;\n        if (x >= roots[0] + cx && x <= roots[1] + cx) {\n            return dir;\n        }\n        else {\n            return 0;\n        }\n    }\n    if (startAngle > endAngle) {\n        var tmp_1 = startAngle;\n        startAngle = endAngle;\n        endAngle = tmp_1;\n    }\n    if (startAngle < 0) {\n        startAngle += PI2;\n        endAngle += PI2;\n    }\n    var w = 0;\n    for (var i = 0; i < 2; i++) {\n        var x_ = roots[i];\n        if (x_ + cx > x) {\n            var angle = Math.atan2(y, x_);\n            var dir = anticlockwise ? 1 : -1;\n            if (angle < 0) {\n                angle = PI2 + angle;\n            }\n            if ((angle >= startAngle && angle <= endAngle)\n                || (angle + PI2 >= startAngle && angle + PI2 <= endAngle)) {\n                if (angle > Math.PI / 2 && angle < Math.PI * 1.5) {\n                    dir = -dir;\n                }\n                w += dir;\n            }\n        }\n    }\n    return w;\n}\nfunction containPath(path, lineWidth, isStroke, x, y) {\n    var data = path.data;\n    var len = path.len();\n    var w = 0;\n    var xi = 0;\n    var yi = 0;\n    var x0 = 0;\n    var y0 = 0;\n    var x1;\n    var y1;\n    for (var i = 0; i < len;) {\n        var cmd = data[i++];\n        var isFirst = i === 1;\n        if (cmd === CMD.M && i > 1) {\n            if (!isStroke) {\n                w += windingLine(xi, yi, x0, y0, x, y);\n            }\n        }\n        if (isFirst) {\n            xi = data[i];\n            yi = data[i + 1];\n            x0 = xi;\n            y0 = yi;\n        }\n        switch (cmd) {\n            case CMD.M:\n                x0 = data[i++];\n                y0 = data[i++];\n                xi = x0;\n                yi = y0;\n                break;\n            case CMD.L:\n                if (isStroke) {\n                    if (line.containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0;\n                }\n                xi = data[i++];\n                yi = data[i++];\n                break;\n            case CMD.C:\n                if (isStroke) {\n                    if (cubic.containStroke(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0;\n                }\n                xi = data[i++];\n                yi = data[i++];\n                break;\n            case CMD.Q:\n                if (isStroke) {\n                    if (quadratic.containStroke(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0;\n                }\n                xi = data[i++];\n                yi = data[i++];\n                break;\n            case CMD.A:\n                var cx = data[i++];\n                var cy = data[i++];\n                var rx = data[i++];\n                var ry = data[i++];\n                var theta = data[i++];\n                var dTheta = data[i++];\n                i += 1;\n                var anticlockwise = !!(1 - data[i++]);\n                x1 = Math.cos(theta) * rx + cx;\n                y1 = Math.sin(theta) * ry + cy;\n                if (!isFirst) {\n                    w += windingLine(xi, yi, x1, y1, x, y);\n                }\n                else {\n                    x0 = x1;\n                    y0 = y1;\n                }\n                var _x = (x - cx) * ry / rx + cx;\n                if (isStroke) {\n                    if (arc.containStroke(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y);\n                }\n                xi = Math.cos(theta + dTheta) * rx + cx;\n                yi = Math.sin(theta + dTheta) * ry + cy;\n                break;\n            case CMD.R:\n                x0 = xi = data[i++];\n                y0 = yi = data[i++];\n                var width = data[i++];\n                var height = data[i++];\n                x1 = x0 + width;\n                y1 = y0 + height;\n                if (isStroke) {\n                    if (line.containStroke(x0, y0, x1, y0, lineWidth, x, y)\n                        || line.containStroke(x1, y0, x1, y1, lineWidth, x, y)\n                        || line.containStroke(x1, y1, x0, y1, lineWidth, x, y)\n                        || line.containStroke(x0, y1, x0, y0, lineWidth, x, y)) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingLine(x1, y0, x1, y1, x, y);\n                    w += windingLine(x0, y1, x0, y0, x, y);\n                }\n                break;\n            case CMD.Z:\n                if (isStroke) {\n                    if (line.containStroke(xi, yi, x0, y0, lineWidth, x, y)) {\n                        return true;\n                    }\n                }\n                else {\n                    w += windingLine(xi, yi, x0, y0, x, y);\n                }\n                xi = x0;\n                yi = y0;\n                break;\n        }\n    }\n    if (!isStroke && !isAroundEqual(yi, y0)) {\n        w += windingLine(xi, yi, x0, y0, x, y) || 0;\n    }\n    return w !== 0;\n}\nexport function contain(pathProxy, x, y) {\n    return containPath(pathProxy, 0, false, x, y);\n}\nexport function containStroke(pathProxy, lineWidth, x, y) {\n    return containPath(pathProxy, lineWidth, true, x, y);\n}\n", "import { __extends } from \"tslib\";\nimport Displayable, { DEFAULT_COMMON_STYLE, DEFAULT_COMMON_ANIMATION_PROPS } from './Displayable.js';\nimport PathProxy from '../core/PathProxy.js';\nimport * as pathContain from '../contain/path.js';\nimport { defaults, keys, extend, clone, isString, createObject } from '../core/util.js';\nimport { lum } from '../tool/color.js';\nimport { DARK_LABEL_COLOR, LIGHT_LABEL_COLOR, DARK_MODE_THRESHOLD, LIGHTER_LABEL_COLOR } from '../config.js';\nimport { REDRAW_BIT, SHAPE_CHANGED_BIT, STYLE_CHANGED_BIT } from './constants.js';\nimport { TRANSFORMABLE_PROPS } from '../core/Transformable.js';\nexport var DEFAULT_PATH_STYLE = defaults({\n    fill: '#000',\n    stroke: null,\n    strokePercent: 1,\n    fillOpacity: 1,\n    strokeOpacity: 1,\n    lineDashOffset: 0,\n    lineWidth: 1,\n    lineCap: 'butt',\n    miterLimit: 10,\n    strokeNoScale: false,\n    strokeFirst: false\n}, DEFAULT_COMMON_STYLE);\nexport var DEFAULT_PATH_ANIMATION_PROPS = {\n    style: defaults({\n        fill: true,\n        stroke: true,\n        strokePercent: true,\n        fillOpacity: true,\n        strokeOpacity: true,\n        lineDashOffset: true,\n        lineWidth: true,\n        miterLimit: true\n    }, DEFAULT_COMMON_ANIMATION_PROPS.style)\n};\nvar pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible',\n    'culling', 'z', 'z2', 'zlevel', 'parent'\n]);\nvar Path = (function (_super) {\n    __extends(Path, _super);\n    function Path(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Path.prototype.update = function () {\n        var _this = this;\n        _super.prototype.update.call(this);\n        var style = this.style;\n        if (style.decal) {\n            var decalEl = this._decalEl = this._decalEl || new Path();\n            if (decalEl.buildPath === Path.prototype.buildPath) {\n                decalEl.buildPath = function (ctx) {\n                    _this.buildPath(ctx, _this.shape);\n                };\n            }\n            decalEl.silent = true;\n            var decalElStyle = decalEl.style;\n            for (var key in style) {\n                if (decalElStyle[key] !== style[key]) {\n                    decalElStyle[key] = style[key];\n                }\n            }\n            decalElStyle.fill = style.fill ? style.decal : null;\n            decalElStyle.decal = null;\n            decalElStyle.shadowColor = null;\n            style.strokeFirst && (decalElStyle.stroke = null);\n            for (var i = 0; i < pathCopyParams.length; ++i) {\n                decalEl[pathCopyParams[i]] = this[pathCopyParams[i]];\n            }\n            decalEl.__dirty |= REDRAW_BIT;\n        }\n        else if (this._decalEl) {\n            this._decalEl = null;\n        }\n    };\n    Path.prototype.getDecalElement = function () {\n        return this._decalEl;\n    };\n    Path.prototype._init = function (props) {\n        var keysArr = keys(props);\n        this.shape = this.getDefaultShape();\n        var defaultStyle = this.getDefaultStyle();\n        if (defaultStyle) {\n            this.useStyle(defaultStyle);\n        }\n        for (var i = 0; i < keysArr.length; i++) {\n            var key = keysArr[i];\n            var value = props[key];\n            if (key === 'style') {\n                if (!this.style) {\n                    this.useStyle(value);\n                }\n                else {\n                    extend(this.style, value);\n                }\n            }\n            else if (key === 'shape') {\n                extend(this.shape, value);\n            }\n            else {\n                _super.prototype.attrKV.call(this, key, value);\n            }\n        }\n        if (!this.style) {\n            this.useStyle({});\n        }\n    };\n    Path.prototype.getDefaultStyle = function () {\n        return null;\n    };\n    Path.prototype.getDefaultShape = function () {\n        return {};\n    };\n    Path.prototype.canBeInsideText = function () {\n        return this.hasFill();\n    };\n    Path.prototype.getInsideTextFill = function () {\n        var pathFill = this.style.fill;\n        if (pathFill !== 'none') {\n            if (isString(pathFill)) {\n                var fillLum = lum(pathFill, 0);\n                if (fillLum > 0.5) {\n                    return DARK_LABEL_COLOR;\n                }\n                else if (fillLum > 0.2) {\n                    return LIGHTER_LABEL_COLOR;\n                }\n                return LIGHT_LABEL_COLOR;\n            }\n            else if (pathFill) {\n                return LIGHT_LABEL_COLOR;\n            }\n        }\n        return DARK_LABEL_COLOR;\n    };\n    Path.prototype.getInsideTextStroke = function (textFill) {\n        var pathFill = this.style.fill;\n        if (isString(pathFill)) {\n            var zr = this.__zr;\n            var isDarkMode = !!(zr && zr.isDarkMode());\n            var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD;\n            if (isDarkMode === isDarkLabel) {\n                return pathFill;\n            }\n        }\n    };\n    Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { };\n    Path.prototype.pathUpdated = function () {\n        this.__dirty &= ~SHAPE_CHANGED_BIT;\n    };\n    Path.prototype.getUpdatedPathProxy = function (inBatch) {\n        !this.path && this.createPathProxy();\n        this.path.beginPath();\n        this.buildPath(this.path, this.shape, inBatch);\n        return this.path;\n    };\n    Path.prototype.createPathProxy = function () {\n        this.path = new PathProxy(false);\n    };\n    Path.prototype.hasStroke = function () {\n        var style = this.style;\n        var stroke = style.stroke;\n        return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));\n    };\n    Path.prototype.hasFill = function () {\n        var style = this.style;\n        var fill = style.fill;\n        return fill != null && fill !== 'none';\n    };\n    Path.prototype.getBoundingRect = function () {\n        var rect = this._rect;\n        var style = this.style;\n        var needsUpdateRect = !rect;\n        if (needsUpdateRect) {\n            var firstInvoke = false;\n            if (!this.path) {\n                firstInvoke = true;\n                this.createPathProxy();\n            }\n            var path = this.path;\n            if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) {\n                path.beginPath();\n                this.buildPath(path, this.shape, false);\n                this.pathUpdated();\n            }\n            rect = path.getBoundingRect();\n        }\n        this._rect = rect;\n        if (this.hasStroke() && this.path && this.path.len() > 0) {\n            var rectStroke = this._rectStroke || (this._rectStroke = rect.clone());\n            if (this.__dirty || needsUpdateRect) {\n                rectStroke.copy(rect);\n                var lineScale = style.strokeNoScale ? this.getLineScale() : 1;\n                var w = style.lineWidth;\n                if (!this.hasFill()) {\n                    var strokeContainThreshold = this.strokeContainThreshold;\n                    w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold);\n                }\n                if (lineScale > 1e-10) {\n                    rectStroke.width += w / lineScale;\n                    rectStroke.height += w / lineScale;\n                    rectStroke.x -= w / lineScale / 2;\n                    rectStroke.y -= w / lineScale / 2;\n                }\n            }\n            return rectStroke;\n        }\n        return rect;\n    };\n    Path.prototype.contain = function (x, y) {\n        var localPos = this.transformCoordToLocal(x, y);\n        var rect = this.getBoundingRect();\n        var style = this.style;\n        x = localPos[0];\n        y = localPos[1];\n        if (rect.contain(x, y)) {\n            var pathProxy = this.path;\n            if (this.hasStroke()) {\n                var lineWidth = style.lineWidth;\n                var lineScale = style.strokeNoScale ? this.getLineScale() : 1;\n                if (lineScale > 1e-10) {\n                    if (!this.hasFill()) {\n                        lineWidth = Math.max(lineWidth, this.strokeContainThreshold);\n                    }\n                    if (pathContain.containStroke(pathProxy, lineWidth / lineScale, x, y)) {\n                        return true;\n                    }\n                }\n            }\n            if (this.hasFill()) {\n                return pathContain.contain(pathProxy, x, y);\n            }\n        }\n        return false;\n    };\n    Path.prototype.dirtyShape = function () {\n        this.__dirty |= SHAPE_CHANGED_BIT;\n        if (this._rect) {\n            this._rect = null;\n        }\n        if (this._decalEl) {\n            this._decalEl.dirtyShape();\n        }\n        this.markRedraw();\n    };\n    Path.prototype.dirty = function () {\n        this.dirtyStyle();\n        this.dirtyShape();\n    };\n    Path.prototype.animateShape = function (loop) {\n        return this.animate('shape', loop);\n    };\n    Path.prototype.updateDuringAnimation = function (targetKey) {\n        if (targetKey === 'style') {\n            this.dirtyStyle();\n        }\n        else if (targetKey === 'shape') {\n            this.dirtyShape();\n        }\n        else {\n            this.markRedraw();\n        }\n    };\n    Path.prototype.attrKV = function (key, value) {\n        if (key === 'shape') {\n            this.setShape(value);\n        }\n        else {\n            _super.prototype.attrKV.call(this, key, value);\n        }\n    };\n    Path.prototype.setShape = function (keyOrObj, value) {\n        var shape = this.shape;\n        if (!shape) {\n            shape = this.shape = {};\n        }\n        if (typeof keyOrObj === 'string') {\n            shape[keyOrObj] = value;\n        }\n        else {\n            extend(shape, keyOrObj);\n        }\n        this.dirtyShape();\n        return this;\n    };\n    Path.prototype.shapeChanged = function () {\n        return !!(this.__dirty & SHAPE_CHANGED_BIT);\n    };\n    Path.prototype.createStyle = function (obj) {\n        return createObject(DEFAULT_PATH_STYLE, obj);\n    };\n    Path.prototype._innerSaveToNormal = function (toState) {\n        _super.prototype._innerSaveToNormal.call(this, toState);\n        var normalState = this._normalState;\n        if (toState.shape && !normalState.shape) {\n            normalState.shape = extend({}, this.shape);\n        }\n    };\n    Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {\n        _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);\n        var needsRestoreToNormal = !(state && keepCurrentStates);\n        var targetShape;\n        if (state && state.shape) {\n            if (transition) {\n                if (keepCurrentStates) {\n                    targetShape = state.shape;\n                }\n                else {\n                    targetShape = extend({}, normalState.shape);\n                    extend(targetShape, state.shape);\n                }\n            }\n            else {\n                targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape);\n                extend(targetShape, state.shape);\n            }\n        }\n        else if (needsRestoreToNormal) {\n            targetShape = normalState.shape;\n        }\n        if (targetShape) {\n            if (transition) {\n                this.shape = extend({}, this.shape);\n                var targetShapePrimaryProps = {};\n                var shapeKeys = keys(targetShape);\n                for (var i = 0; i < shapeKeys.length; i++) {\n                    var key = shapeKeys[i];\n                    if (typeof targetShape[key] === 'object') {\n                        this.shape[key] = targetShape[key];\n                    }\n                    else {\n                        targetShapePrimaryProps[key] = targetShape[key];\n                    }\n                }\n                this._transitionState(stateName, {\n                    shape: targetShapePrimaryProps\n                }, animationCfg);\n            }\n            else {\n                this.shape = targetShape;\n                this.dirtyShape();\n            }\n        }\n    };\n    Path.prototype._mergeStates = function (states) {\n        var mergedState = _super.prototype._mergeStates.call(this, states);\n        var mergedShape;\n        for (var i = 0; i < states.length; i++) {\n            var state = states[i];\n            if (state.shape) {\n                mergedShape = mergedShape || {};\n                this._mergeStyle(mergedShape, state.shape);\n            }\n        }\n        if (mergedShape) {\n            mergedState.shape = mergedShape;\n        }\n        return mergedState;\n    };\n    Path.prototype.getAnimationStyleProps = function () {\n        return DEFAULT_PATH_ANIMATION_PROPS;\n    };\n    Path.prototype.isZeroArea = function () {\n        return false;\n    };\n    Path.extend = function (defaultProps) {\n        var Sub = (function (_super) {\n            __extends(Sub, _super);\n            function Sub(opts) {\n                var _this = _super.call(this, opts) || this;\n                defaultProps.init && defaultProps.init.call(_this, opts);\n                return _this;\n            }\n            Sub.prototype.getDefaultStyle = function () {\n                return clone(defaultProps.style);\n            };\n            Sub.prototype.getDefaultShape = function () {\n                return clone(defaultProps.shape);\n            };\n            return Sub;\n        }(Path));\n        for (var key in defaultProps) {\n            if (typeof defaultProps[key] === 'function') {\n                Sub.prototype[key] = defaultProps[key];\n            }\n        }\n        return Sub;\n    };\n    Path.initDefaultProps = (function () {\n        var pathProto = Path.prototype;\n        pathProto.type = 'path';\n        pathProto.strokeContainThreshold = 5;\n        pathProto.segmentIgnoreThreshold = 0;\n        pathProto.subPixelOptimize = false;\n        pathProto.autoBatch = false;\n        pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT;\n    })();\n    return Path;\n}(Displayable));\nexport default Path;\n", "import { __extends } from \"tslib\";\nimport Displayable from './Displayable.js';\nimport { DEFAULT_PATH_STYLE } from './Path.js';\nimport { createObject, defaults } from '../core/util.js';\nimport { DEFAULT_FONT } from '../core/platform.js';\nimport { tSpanCreateBoundingRect, tSpanHasStroke } from './helper/parseText.js';\nexport var DEFAULT_TSPAN_STYLE = defaults({\n    strokeFirst: true,\n    font: DEFAULT_FONT,\n    x: 0,\n    y: 0,\n    textAlign: 'left',\n    textBaseline: 'top',\n    miterLimit: 2\n}, DEFAULT_PATH_STYLE);\nvar TSpan = (function (_super) {\n    __extends(TSpan, _super);\n    function TSpan() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    TSpan.prototype.hasStroke = function () {\n        return tSpanHasStroke(this.style);\n    };\n    TSpan.prototype.hasFill = function () {\n        var style = this.style;\n        var fill = style.fill;\n        return fill != null && fill !== 'none';\n    };\n    TSpan.prototype.createStyle = function (obj) {\n        return createObject(DEFAULT_TSPAN_STYLE, obj);\n    };\n    TSpan.prototype.setBoundingRect = function (rect) {\n        this._rect = rect;\n    };\n    TSpan.prototype.getBoundingRect = function () {\n        if (!this._rect) {\n            this._rect = tSpanCreateBoundingRect(this.style);\n        }\n        return this._rect;\n    };\n    TSpan.initDefaultProps = (function () {\n        var tspanProto = TSpan.prototype;\n        tspanProto.dirtyRectTolerance = 10;\n    })();\n    return TSpan;\n}(Displayable));\nTSpan.prototype.type = 'tspan';\nexport default TSpan;\n", "import { __extends } from \"tslib\";\nimport Displayable, { DEFAULT_COMMON_STYLE, DEFAULT_COMMON_ANIMATION_PROPS } from './Displayable.js';\nimport BoundingRect from '../core/BoundingRect.js';\nimport { defaults, createObject } from '../core/util.js';\nexport var DEFAULT_IMAGE_STYLE = defaults({\n    x: 0,\n    y: 0\n}, DEFAULT_COMMON_STYLE);\nexport var DEFAULT_IMAGE_ANIMATION_PROPS = {\n    style: defaults({\n        x: true,\n        y: true,\n        width: true,\n        height: true,\n        sx: true,\n        sy: true,\n        sWidth: true,\n        sHeight: true\n    }, DEFAULT_COMMON_ANIMATION_PROPS.style)\n};\nfunction isImageLike(source) {\n    return !!(source\n        && typeof source !== 'string'\n        && source.width && source.height);\n}\nvar ZRImage = (function (_super) {\n    __extends(ZRImage, _super);\n    function ZRImage() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    ZRImage.prototype.createStyle = function (obj) {\n        return createObject(DEFAULT_IMAGE_STYLE, obj);\n    };\n    ZRImage.prototype._getSize = function (dim) {\n        var style = this.style;\n        var size = style[dim];\n        if (size != null) {\n            return size;\n        }\n        var imageSource = isImageLike(style.image)\n            ? style.image : this.__image;\n        if (!imageSource) {\n            return 0;\n        }\n        var otherDim = dim === 'width' ? 'height' : 'width';\n        var otherDimSize = style[otherDim];\n        if (otherDimSize == null) {\n            return imageSource[dim];\n        }\n        else {\n            return imageSource[dim] / imageSource[otherDim] * otherDimSize;\n        }\n    };\n    ZRImage.prototype.getWidth = function () {\n        return this._getSize('width');\n    };\n    ZRImage.prototype.getHeight = function () {\n        return this._getSize('height');\n    };\n    ZRImage.prototype.getAnimationStyleProps = function () {\n        return DEFAULT_IMAGE_ANIMATION_PROPS;\n    };\n    ZRImage.prototype.getBoundingRect = function () {\n        var style = this.style;\n        if (!this._rect) {\n            this._rect = new BoundingRect(style.x || 0, style.y || 0, this.getWidth(), this.getHeight());\n        }\n        return this._rect;\n    };\n    return ZRImage;\n}(Displayable));\nZRImage.prototype.type = 'image';\nexport default ZRImage;\n", "export function buildPath(ctx, shape) {\n    var x = shape.x;\n    var y = shape.y;\n    var width = shape.width;\n    var height = shape.height;\n    var r = shape.r;\n    var r1;\n    var r2;\n    var r3;\n    var r4;\n    if (width < 0) {\n        x = x + width;\n        width = -width;\n    }\n    if (height < 0) {\n        y = y + height;\n        height = -height;\n    }\n    if (typeof r === 'number') {\n        r1 = r2 = r3 = r4 = r;\n    }\n    else if (r instanceof Array) {\n        if (r.length === 1) {\n            r1 = r2 = r3 = r4 = r[0];\n        }\n        else if (r.length === 2) {\n            r1 = r3 = r[0];\n            r2 = r4 = r[1];\n        }\n        else if (r.length === 3) {\n            r1 = r[0];\n            r2 = r4 = r[1];\n            r3 = r[2];\n        }\n        else {\n            r1 = r[0];\n            r2 = r[1];\n            r3 = r[2];\n            r4 = r[3];\n        }\n    }\n    else {\n        r1 = r2 = r3 = r4 = 0;\n    }\n    var total;\n    if (r1 + r2 > width) {\n        total = r1 + r2;\n        r1 *= width / total;\n        r2 *= width / total;\n    }\n    if (r3 + r4 > width) {\n        total = r3 + r4;\n        r3 *= width / total;\n        r4 *= width / total;\n    }\n    if (r2 + r3 > height) {\n        total = r2 + r3;\n        r2 *= height / total;\n        r3 *= height / total;\n    }\n    if (r1 + r4 > height) {\n        total = r1 + r4;\n        r1 *= height / total;\n        r4 *= height / total;\n    }\n    ctx.moveTo(x + r1, y);\n    ctx.lineTo(x + width - r2, y);\n    r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0);\n    ctx.lineTo(x + width, y + height - r3);\n    r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2);\n    ctx.lineTo(x + r4, y + height);\n    r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI);\n    ctx.lineTo(x, y + r1);\n    r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5);\n}\n", "var round = Math.round;\nexport function subPixelOptimizeLine(outputShape, inputShape, style) {\n    if (!inputShape) {\n        return;\n    }\n    var x1 = inputShape.x1;\n    var x2 = inputShape.x2;\n    var y1 = inputShape.y1;\n    var y2 = inputShape.y2;\n    outputShape.x1 = x1;\n    outputShape.x2 = x2;\n    outputShape.y1 = y1;\n    outputShape.y2 = y2;\n    var lineWidth = style && style.lineWidth;\n    if (!lineWidth) {\n        return outputShape;\n    }\n    if (round(x1 * 2) === round(x2 * 2)) {\n        outputShape.x1 = outputShape.x2 = subPixelOptimize(x1, lineWidth, true);\n    }\n    if (round(y1 * 2) === round(y2 * 2)) {\n        outputShape.y1 = outputShape.y2 = subPixelOptimize(y1, lineWidth, true);\n    }\n    return outputShape;\n}\nexport function subPixelOptimizeRect(outputShape, inputShape, style) {\n    if (!inputShape) {\n        return;\n    }\n    var originX = inputShape.x;\n    var originY = inputShape.y;\n    var originWidth = inputShape.width;\n    var originHeight = inputShape.height;\n    outputShape.x = originX;\n    outputShape.y = originY;\n    outputShape.width = originWidth;\n    outputShape.height = originHeight;\n    var lineWidth = style && style.lineWidth;\n    if (!lineWidth) {\n        return outputShape;\n    }\n    outputShape.x = subPixelOptimize(originX, lineWidth, true);\n    outputShape.y = subPixelOptimize(originY, lineWidth, true);\n    outputShape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - outputShape.x, originWidth === 0 ? 0 : 1);\n    outputShape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - outputShape.y, originHeight === 0 ? 0 : 1);\n    return outputShape;\n}\nexport function subPixelOptimize(position, lineWidth, positiveOrNegative) {\n    if (!lineWidth) {\n        return position;\n    }\n    var doubledPosition = round(position * 2);\n    return (doubledPosition + round(lineWidth)) % 2 === 0\n        ? doubledPosition / 2\n        : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;\n}\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nimport * as roundRectHelper from '../helper/roundRect.js';\nimport { subPixelOptimizeRect } from '../helper/subPixelOptimize.js';\nvar RectShape = (function () {\n    function RectShape() {\n        this.x = 0;\n        this.y = 0;\n        this.width = 0;\n        this.height = 0;\n    }\n    return RectShape;\n}());\nexport { RectShape };\nvar subPixelOptimizeOutputShape = {};\nvar Rect = (function (_super) {\n    __extends(Rect, _super);\n    function Rect(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Rect.prototype.getDefaultShape = function () {\n        return new RectShape();\n    };\n    Rect.prototype.buildPath = function (ctx, shape) {\n        var x;\n        var y;\n        var width;\n        var height;\n        if (this.subPixelOptimize) {\n            var optimizedShape = subPixelOptimizeRect(subPixelOptimizeOutputShape, shape, this.style);\n            x = optimizedShape.x;\n            y = optimizedShape.y;\n            width = optimizedShape.width;\n            height = optimizedShape.height;\n            optimizedShape.r = shape.r;\n            shape = optimizedShape;\n        }\n        else {\n            x = shape.x;\n            y = shape.y;\n            width = shape.width;\n            height = shape.height;\n        }\n        if (!shape.r) {\n            ctx.rect(x, y, width, height);\n        }\n        else {\n            roundRectHelper.buildPath(ctx, shape);\n        }\n    };\n    Rect.prototype.isZeroArea = function () {\n        return !this.shape.width || !this.shape.height;\n    };\n    return Rect;\n}(Path));\nRect.prototype.type = 'rect';\nexport default Rect;\n", "import { __extends } from \"tslib\";\nimport { parseRichText, parsePlainText, calcInnerTextOverflowArea, tSpanCreateBoundingRect2, } from './helper/parseText.js';\nimport TSpan from './TSpan.js';\nimport { retrieve2, each, normalizeCssArray, trim, retrieve3, extend, keys, defaults } from '../core/util.js';\nimport { adjustTextX, adjustTextY } from '../contain/text.js';\nimport ZRImage from './Image.js';\nimport Rect from './shape/Rect.js';\nimport BoundingRect from '../core/BoundingRect.js';\nimport Displayable, { DEFAULT_COMMON_ANIMATION_PROPS } from './Displayable.js';\nimport { DEFAULT_FONT, DEFAULT_FONT_SIZE } from '../core/platform.js';\nvar DEFAULT_RICH_TEXT_COLOR = {\n    fill: '#000'\n};\nvar DEFAULT_STROKE_LINE_WIDTH = 2;\nvar tmpCITOverflowAreaOut = {};\nexport var DEFAULT_TEXT_ANIMATION_PROPS = {\n    style: defaults({\n        fill: true,\n        stroke: true,\n        fillOpacity: true,\n        strokeOpacity: true,\n        lineWidth: true,\n        fontSize: true,\n        lineHeight: true,\n        width: true,\n        height: true,\n        textShadowColor: true,\n        textShadowBlur: true,\n        textShadowOffsetX: true,\n        textShadowOffsetY: true,\n        backgroundColor: true,\n        padding: true,\n        borderColor: true,\n        borderWidth: true,\n        borderRadius: true\n    }, DEFAULT_COMMON_ANIMATION_PROPS.style)\n};\nvar ZRText = (function (_super) {\n    __extends(ZRText, _super);\n    function ZRText(opts) {\n        var _this = _super.call(this) || this;\n        _this.type = 'text';\n        _this._children = [];\n        _this._defaultStyle = DEFAULT_RICH_TEXT_COLOR;\n        _this.attr(opts);\n        return _this;\n    }\n    ZRText.prototype.childrenRef = function () {\n        return this._children;\n    };\n    ZRText.prototype.update = function () {\n        _super.prototype.update.call(this);\n        if (this.styleChanged()) {\n            this._updateSubTexts();\n        }\n        for (var i = 0; i < this._children.length; i++) {\n            var child = this._children[i];\n            child.zlevel = this.zlevel;\n            child.z = this.z;\n            child.z2 = this.z2;\n            child.culling = this.culling;\n            child.cursor = this.cursor;\n            child.invisible = this.invisible;\n        }\n    };\n    ZRText.prototype.updateTransform = function () {\n        var innerTransformable = this.innerTransformable;\n        if (innerTransformable) {\n            innerTransformable.updateTransform();\n            if (innerTransformable.transform) {\n                this.transform = innerTransformable.transform;\n            }\n        }\n        else {\n            _super.prototype.updateTransform.call(this);\n        }\n    };\n    ZRText.prototype.getLocalTransform = function (m) {\n        var innerTransformable = this.innerTransformable;\n        return innerTransformable\n            ? innerTransformable.getLocalTransform(m)\n            : _super.prototype.getLocalTransform.call(this, m);\n    };\n    ZRText.prototype.getComputedTransform = function () {\n        if (this.__hostTarget) {\n            this.__hostTarget.getComputedTransform();\n            this.__hostTarget.updateInnerText(true);\n        }\n        return _super.prototype.getComputedTransform.call(this);\n    };\n    ZRText.prototype._updateSubTexts = function () {\n        this._childCursor = 0;\n        normalizeTextStyle(this.style);\n        this.style.rich\n            ? this._updateRichTexts()\n            : this._updatePlainTexts();\n        this._children.length = this._childCursor;\n        this.styleUpdated();\n    };\n    ZRText.prototype.addSelfToZr = function (zr) {\n        _super.prototype.addSelfToZr.call(this, zr);\n        for (var i = 0; i < this._children.length; i++) {\n            this._children[i].__zr = zr;\n        }\n    };\n    ZRText.prototype.removeSelfFromZr = function (zr) {\n        _super.prototype.removeSelfFromZr.call(this, zr);\n        for (var i = 0; i < this._children.length; i++) {\n            this._children[i].__zr = null;\n        }\n    };\n    ZRText.prototype.getBoundingRect = function () {\n        if (this.styleChanged()) {\n            this._updateSubTexts();\n        }\n        if (!this._rect) {\n            var tmpRect = new BoundingRect(0, 0, 0, 0);\n            var children = this._children;\n            var tmpMat = [];\n            var rect = null;\n            for (var i = 0; i < children.length; i++) {\n                var child = children[i];\n                var childRect = child.getBoundingRect();\n                var transform = child.getLocalTransform(tmpMat);\n                if (transform) {\n                    tmpRect.copy(childRect);\n                    tmpRect.applyTransform(transform);\n                    rect = rect || tmpRect.clone();\n                    rect.union(tmpRect);\n                }\n                else {\n                    rect = rect || childRect.clone();\n                    rect.union(childRect);\n                }\n            }\n            this._rect = rect || tmpRect;\n        }\n        return this._rect;\n    };\n    ZRText.prototype.setDefaultTextStyle = function (defaultTextStyle) {\n        this._defaultStyle = defaultTextStyle || DEFAULT_RICH_TEXT_COLOR;\n    };\n    ZRText.prototype.setTextContent = function (textContent) {\n        if (process.env.NODE_ENV !== 'production') {\n            throw new Error('Can\\'t attach text on another text');\n        }\n    };\n    ZRText.prototype._mergeStyle = function (targetStyle, sourceStyle) {\n        if (!sourceStyle) {\n            return targetStyle;\n        }\n        var sourceRich = sourceStyle.rich;\n        var targetRich = targetStyle.rich || (sourceRich && {});\n        extend(targetStyle, sourceStyle);\n        if (sourceRich && targetRich) {\n            this._mergeRich(targetRich, sourceRich);\n            targetStyle.rich = targetRich;\n        }\n        else if (targetRich) {\n            targetStyle.rich = targetRich;\n        }\n        return targetStyle;\n    };\n    ZRText.prototype._mergeRich = function (targetRich, sourceRich) {\n        var richNames = keys(sourceRich);\n        for (var i = 0; i < richNames.length; i++) {\n            var richName = richNames[i];\n            targetRich[richName] = targetRich[richName] || {};\n            extend(targetRich[richName], sourceRich[richName]);\n        }\n    };\n    ZRText.prototype.getAnimationStyleProps = function () {\n        return DEFAULT_TEXT_ANIMATION_PROPS;\n    };\n    ZRText.prototype._getOrCreateChild = function (Ctor) {\n        var child = this._children[this._childCursor];\n        if (!child || !(child instanceof Ctor)) {\n            child = new Ctor();\n        }\n        this._children[this._childCursor++] = child;\n        child.__zr = this.__zr;\n        child.parent = this;\n        return child;\n    };\n    ZRText.prototype._updatePlainTexts = function () {\n        var style = this.style;\n        var textFont = style.font || DEFAULT_FONT;\n        var textPadding = style.padding;\n        var defaultStyle = this._defaultStyle;\n        var baseX = style.x || 0;\n        var baseY = style.y || 0;\n        var textAlign = style.align || defaultStyle.align || 'left';\n        var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign || 'top';\n        calcInnerTextOverflowArea(tmpCITOverflowAreaOut, defaultStyle.overflowRect, baseX, baseY, textAlign, verticalAlign);\n        baseX = tmpCITOverflowAreaOut.baseX;\n        baseY = tmpCITOverflowAreaOut.baseY;\n        var text = getStyleText(style);\n        var contentBlock = parsePlainText(text, style, tmpCITOverflowAreaOut.outerWidth, tmpCITOverflowAreaOut.outerHeight);\n        var needDrawBg = needDrawBackground(style);\n        var bgColorDrawn = !!(style.backgroundColor);\n        var outerHeight = contentBlock.outerHeight;\n        var outerWidth = contentBlock.outerWidth;\n        var textLines = contentBlock.lines;\n        var lineHeight = contentBlock.lineHeight;\n        this.isTruncated = !!contentBlock.isTruncated;\n        var textX = baseX;\n        var textY = adjustTextY(baseY, contentBlock.contentHeight, verticalAlign);\n        if (needDrawBg || textPadding) {\n            var boxX = adjustTextX(baseX, outerWidth, textAlign);\n            var boxY = adjustTextY(baseY, outerHeight, verticalAlign);\n            needDrawBg && this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight);\n        }\n        textY += lineHeight / 2;\n        if (textPadding) {\n            textX = getTextXForPadding(baseX, textAlign, textPadding);\n            if (verticalAlign === 'top') {\n                textY += textPadding[0];\n            }\n            else if (verticalAlign === 'bottom') {\n                textY -= textPadding[2];\n            }\n        }\n        var defaultLineWidth = 0;\n        var usingDefaultStroke = false;\n        var useDefaultFill = false;\n        var textFill = getFill('fill' in style\n            ? style.fill\n            : (useDefaultFill = true, defaultStyle.fill));\n        var textStroke = getStroke('stroke' in style\n            ? style.stroke\n            : (!bgColorDrawn\n                && (!defaultStyle.autoStroke || useDefaultFill))\n                ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, usingDefaultStroke = true, defaultStyle.stroke)\n                : null);\n        var hasShadow = style.textShadowBlur > 0;\n        for (var i = 0; i < textLines.length; i++) {\n            var el = this._getOrCreateChild(TSpan);\n            var subElStyle = el.createStyle();\n            el.useStyle(subElStyle);\n            subElStyle.text = textLines[i];\n            subElStyle.x = textX;\n            subElStyle.y = textY;\n            if (textAlign) {\n                subElStyle.textAlign = textAlign;\n            }\n            subElStyle.textBaseline = 'middle';\n            subElStyle.opacity = style.opacity;\n            subElStyle.strokeFirst = true;\n            if (hasShadow) {\n                subElStyle.shadowBlur = style.textShadowBlur || 0;\n                subElStyle.shadowColor = style.textShadowColor || 'transparent';\n                subElStyle.shadowOffsetX = style.textShadowOffsetX || 0;\n                subElStyle.shadowOffsetY = style.textShadowOffsetY || 0;\n            }\n            subElStyle.stroke = textStroke;\n            subElStyle.fill = textFill;\n            if (textStroke) {\n                subElStyle.lineWidth = style.lineWidth || defaultLineWidth;\n                subElStyle.lineDash = style.lineDash;\n                subElStyle.lineDashOffset = style.lineDashOffset || 0;\n            }\n            subElStyle.font = textFont;\n            setSeparateFont(subElStyle, style);\n            textY += lineHeight;\n            el.setBoundingRect(tSpanCreateBoundingRect2(subElStyle, contentBlock.contentWidth, contentBlock.calculatedLineHeight, usingDefaultStroke ? 0 : null));\n        }\n    };\n    ZRText.prototype._updateRichTexts = function () {\n        var style = this.style;\n        var defaultStyle = this._defaultStyle;\n        var textAlign = style.align || defaultStyle.align;\n        var verticalAlign = style.verticalAlign || defaultStyle.verticalAlign;\n        var baseX = style.x || 0;\n        var baseY = style.y || 0;\n        calcInnerTextOverflowArea(tmpCITOverflowAreaOut, defaultStyle.overflowRect, baseX, baseY, textAlign, verticalAlign);\n        baseX = tmpCITOverflowAreaOut.baseX;\n        baseY = tmpCITOverflowAreaOut.baseY;\n        var text = getStyleText(style);\n        var contentBlock = parseRichText(text, style, tmpCITOverflowAreaOut.outerWidth, tmpCITOverflowAreaOut.outerHeight, textAlign);\n        var contentWidth = contentBlock.width;\n        var outerWidth = contentBlock.outerWidth;\n        var outerHeight = contentBlock.outerHeight;\n        var textPadding = style.padding;\n        this.isTruncated = !!contentBlock.isTruncated;\n        var boxX = adjustTextX(baseX, outerWidth, textAlign);\n        var boxY = adjustTextY(baseY, outerHeight, verticalAlign);\n        var xLeft = boxX;\n        var lineTop = boxY;\n        if (textPadding) {\n            xLeft += textPadding[3];\n            lineTop += textPadding[0];\n        }\n        var xRight = xLeft + contentWidth;\n        if (needDrawBackground(style)) {\n            this._renderBackground(style, style, boxX, boxY, outerWidth, outerHeight);\n        }\n        var bgColorDrawn = !!(style.backgroundColor);\n        for (var i = 0; i < contentBlock.lines.length; i++) {\n            var line = contentBlock.lines[i];\n            var tokens = line.tokens;\n            var tokenCount = tokens.length;\n            var lineHeight = line.lineHeight;\n            var remainedWidth = line.width;\n            var leftIndex = 0;\n            var lineXLeft = xLeft;\n            var lineXRight = xRight;\n            var rightIndex = tokenCount - 1;\n            var token = void 0;\n            while (leftIndex < tokenCount\n                && (token = tokens[leftIndex], !token.align || token.align === 'left')) {\n                this._placeToken(token, style, lineHeight, lineTop, lineXLeft, 'left', bgColorDrawn);\n                remainedWidth -= token.width;\n                lineXLeft += token.width;\n                leftIndex++;\n            }\n            while (rightIndex >= 0\n                && (token = tokens[rightIndex], token.align === 'right')) {\n                this._placeToken(token, style, lineHeight, lineTop, lineXRight, 'right', bgColorDrawn);\n                remainedWidth -= token.width;\n                lineXRight -= token.width;\n                rightIndex--;\n            }\n            lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - remainedWidth) / 2;\n            while (leftIndex <= rightIndex) {\n                token = tokens[leftIndex];\n                this._placeToken(token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center', bgColorDrawn);\n                lineXLeft += token.width;\n                leftIndex++;\n            }\n            lineTop += lineHeight;\n        }\n    };\n    ZRText.prototype._placeToken = function (token, style, lineHeight, lineTop, x, textAlign, parentBgColorDrawn) {\n        var tokenStyle = style.rich[token.styleName] || {};\n        tokenStyle.text = token.text;\n        var verticalAlign = token.verticalAlign;\n        var y = lineTop + lineHeight / 2;\n        if (verticalAlign === 'top') {\n            y = lineTop + token.height / 2;\n        }\n        else if (verticalAlign === 'bottom') {\n            y = lineTop + lineHeight - token.height / 2;\n        }\n        var needDrawBg = !token.isLineHolder && needDrawBackground(tokenStyle);\n        needDrawBg && this._renderBackground(tokenStyle, style, textAlign === 'right'\n            ? x - token.width\n            : textAlign === 'center'\n                ? x - token.width / 2\n                : x, y - token.height / 2, token.width, token.height);\n        var bgColorDrawn = !!tokenStyle.backgroundColor;\n        var textPadding = token.textPadding;\n        if (textPadding) {\n            x = getTextXForPadding(x, textAlign, textPadding);\n            y -= token.height / 2 - textPadding[0] - token.innerHeight / 2;\n        }\n        var el = this._getOrCreateChild(TSpan);\n        var subElStyle = el.createStyle();\n        el.useStyle(subElStyle);\n        var defaultStyle = this._defaultStyle;\n        var useDefaultFill = false;\n        var defaultLineWidth = 0;\n        var usingDefaultStroke = false;\n        var textFill = getFill('fill' in tokenStyle ? tokenStyle.fill\n            : 'fill' in style ? style.fill\n                : (useDefaultFill = true, defaultStyle.fill));\n        var textStroke = getStroke('stroke' in tokenStyle ? tokenStyle.stroke\n            : 'stroke' in style ? style.stroke\n                : (!bgColorDrawn\n                    && !parentBgColorDrawn\n                    && (!defaultStyle.autoStroke || useDefaultFill)) ? (defaultLineWidth = DEFAULT_STROKE_LINE_WIDTH, usingDefaultStroke = true, defaultStyle.stroke)\n                    : null);\n        var hasShadow = tokenStyle.textShadowBlur > 0\n            || style.textShadowBlur > 0;\n        subElStyle.text = token.text;\n        subElStyle.x = x;\n        subElStyle.y = y;\n        if (hasShadow) {\n            subElStyle.shadowBlur = tokenStyle.textShadowBlur || style.textShadowBlur || 0;\n            subElStyle.shadowColor = tokenStyle.textShadowColor || style.textShadowColor || 'transparent';\n            subElStyle.shadowOffsetX = tokenStyle.textShadowOffsetX || style.textShadowOffsetX || 0;\n            subElStyle.shadowOffsetY = tokenStyle.textShadowOffsetY || style.textShadowOffsetY || 0;\n        }\n        subElStyle.textAlign = textAlign;\n        subElStyle.textBaseline = 'middle';\n        subElStyle.font = token.font || DEFAULT_FONT;\n        subElStyle.opacity = retrieve3(tokenStyle.opacity, style.opacity, 1);\n        setSeparateFont(subElStyle, tokenStyle);\n        if (textStroke) {\n            subElStyle.lineWidth = retrieve3(tokenStyle.lineWidth, style.lineWidth, defaultLineWidth);\n            subElStyle.lineDash = retrieve2(tokenStyle.lineDash, style.lineDash);\n            subElStyle.lineDashOffset = style.lineDashOffset || 0;\n            subElStyle.stroke = textStroke;\n        }\n        if (textFill) {\n            subElStyle.fill = textFill;\n        }\n        el.setBoundingRect(tSpanCreateBoundingRect2(subElStyle, token.contentWidth, token.contentHeight, usingDefaultStroke ? 0 : null));\n    };\n    ZRText.prototype._renderBackground = function (style, topStyle, x, y, width, height) {\n        var textBackgroundColor = style.backgroundColor;\n        var textBorderWidth = style.borderWidth;\n        var textBorderColor = style.borderColor;\n        var isImageBg = textBackgroundColor && textBackgroundColor.image;\n        var isPlainOrGradientBg = textBackgroundColor && !isImageBg;\n        var textBorderRadius = style.borderRadius;\n        var self = this;\n        var rectEl;\n        var imgEl;\n        if (isPlainOrGradientBg || style.lineHeight || (textBorderWidth && textBorderColor)) {\n            rectEl = this._getOrCreateChild(Rect);\n            rectEl.useStyle(rectEl.createStyle());\n            rectEl.style.fill = null;\n            var rectShape = rectEl.shape;\n            rectShape.x = x;\n            rectShape.y = y;\n            rectShape.width = width;\n            rectShape.height = height;\n            rectShape.r = textBorderRadius;\n            rectEl.dirtyShape();\n        }\n        if (isPlainOrGradientBg) {\n            var rectStyle = rectEl.style;\n            rectStyle.fill = textBackgroundColor || null;\n            rectStyle.fillOpacity = retrieve2(style.fillOpacity, 1);\n        }\n        else if (isImageBg) {\n            imgEl = this._getOrCreateChild(ZRImage);\n            imgEl.onload = function () {\n                self.dirtyStyle();\n            };\n            var imgStyle = imgEl.style;\n            imgStyle.image = textBackgroundColor.image;\n            imgStyle.x = x;\n            imgStyle.y = y;\n            imgStyle.width = width;\n            imgStyle.height = height;\n        }\n        if (textBorderWidth && textBorderColor) {\n            var rectStyle = rectEl.style;\n            rectStyle.lineWidth = textBorderWidth;\n            rectStyle.stroke = textBorderColor;\n            rectStyle.strokeOpacity = retrieve2(style.strokeOpacity, 1);\n            rectStyle.lineDash = style.borderDash;\n            rectStyle.lineDashOffset = style.borderDashOffset || 0;\n            rectEl.strokeContainThreshold = 0;\n            if (rectEl.hasFill() && rectEl.hasStroke()) {\n                rectStyle.strokeFirst = true;\n                rectStyle.lineWidth *= 2;\n            }\n        }\n        var commonStyle = (rectEl || imgEl).style;\n        commonStyle.shadowBlur = style.shadowBlur || 0;\n        commonStyle.shadowColor = style.shadowColor || 'transparent';\n        commonStyle.shadowOffsetX = style.shadowOffsetX || 0;\n        commonStyle.shadowOffsetY = style.shadowOffsetY || 0;\n        commonStyle.opacity = retrieve3(style.opacity, topStyle.opacity, 1);\n    };\n    ZRText.makeFont = function (style) {\n        var font = '';\n        if (hasSeparateFont(style)) {\n            font = [\n                style.fontStyle,\n                style.fontWeight,\n                parseFontSize(style.fontSize),\n                style.fontFamily || 'sans-serif'\n            ].join(' ');\n        }\n        return font && trim(font) || style.textFont || style.font;\n    };\n    return ZRText;\n}(Displayable));\nvar VALID_TEXT_ALIGN = { left: true, right: 1, center: 1 };\nvar VALID_TEXT_VERTICAL_ALIGN = { top: 1, bottom: 1, middle: 1 };\nvar FONT_PARTS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily'];\nexport function parseFontSize(fontSize) {\n    if (typeof fontSize === 'string'\n        && (fontSize.indexOf('px') !== -1\n            || fontSize.indexOf('rem') !== -1\n            || fontSize.indexOf('em') !== -1)) {\n        return fontSize;\n    }\n    else if (!isNaN(+fontSize)) {\n        return fontSize + 'px';\n    }\n    else {\n        return DEFAULT_FONT_SIZE + 'px';\n    }\n}\nfunction setSeparateFont(targetStyle, sourceStyle) {\n    for (var i = 0; i < FONT_PARTS.length; i++) {\n        var fontProp = FONT_PARTS[i];\n        var val = sourceStyle[fontProp];\n        if (val != null) {\n            targetStyle[fontProp] = val;\n        }\n    }\n}\nexport function hasSeparateFont(style) {\n    return style.fontSize != null || style.fontFamily || style.fontWeight;\n}\nexport function normalizeTextStyle(style) {\n    normalizeStyle(style);\n    each(style.rich, normalizeStyle);\n    return style;\n}\nfunction normalizeStyle(style) {\n    if (style) {\n        style.font = ZRText.makeFont(style);\n        var textAlign = style.align;\n        textAlign === 'middle' && (textAlign = 'center');\n        style.align = (textAlign == null || VALID_TEXT_ALIGN[textAlign]) ? textAlign : 'left';\n        var verticalAlign = style.verticalAlign;\n        verticalAlign === 'center' && (verticalAlign = 'middle');\n        style.verticalAlign = (verticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[verticalAlign]) ? verticalAlign : 'top';\n        var textPadding = style.padding;\n        if (textPadding) {\n            style.padding = normalizeCssArray(style.padding);\n        }\n    }\n}\nfunction getStroke(stroke, lineWidth) {\n    return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none')\n        ? null\n        : (stroke.image || stroke.colorStops)\n            ? '#000'\n            : stroke;\n}\nfunction getFill(fill) {\n    return (fill == null || fill === 'none')\n        ? null\n        : (fill.image || fill.colorStops)\n            ? '#000'\n            : fill;\n}\nfunction getTextXForPadding(x, textAlign, textPadding) {\n    return textAlign === 'right'\n        ? (x - textPadding[1])\n        : textAlign === 'center'\n            ? (x + textPadding[3] / 2 - textPadding[1] / 2)\n            : (x + textPadding[3]);\n}\nfunction getStyleText(style) {\n    var text = style.text;\n    text != null && (text += '');\n    return text;\n}\nfunction needDrawBackground(style) {\n    return !!(style.backgroundColor\n        || style.lineHeight\n        || (style.borderWidth && style.borderColor));\n}\nexport default ZRText;\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner } from './model.js';\nexport var getECData = makeInner();\nexport var setCommonECData = function (seriesIndex, dataType, dataIdx, el) {\n  if (el) {\n    var ecData = getECData(el);\n    // Add data index and series index for indexing the data by element\n    // Useful in tooltip\n    ecData.dataIndex = dataIdx;\n    ecData.dataType = dataType;\n    ecData.seriesIndex = seriesIndex;\n    ecData.ssrType = 'chart';\n    // TODO: not store dataIndex on children.\n    if (el.type === 'group') {\n      el.traverse(function (child) {\n        var childECData = getECData(child);\n        childECData.seriesIndex = seriesIndex;\n        childECData.dataIndex = dataIdx;\n        childECData.dataType = dataType;\n        childECData.ssrType = 'chart';\n      });\n    }\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend, indexOf, isArrayLike, isObject, keys, isArray, each } from 'zrender/lib/core/util.js';\nimport { getECData } from './innerStore.js';\nimport { liftColor } from 'zrender/lib/tool/color.js';\nimport { queryDataIndex, makeInner } from './model.js';\nimport Path from 'zrender/lib/graphic/Path.js';\nimport { error } from './log.js';\n// Reserve 0 as default.\nvar _highlightNextDigit = 1;\nvar _highlightKeyMap = {};\nvar getSavedStates = makeInner();\nvar getComponentStates = makeInner();\nexport var HOVER_STATE_NORMAL = 0;\nexport var HOVER_STATE_BLUR = 1;\nexport var HOVER_STATE_EMPHASIS = 2;\nexport var SPECIAL_STATES = ['emphasis', 'blur', 'select'];\nexport var DISPLAY_STATES = ['normal', 'emphasis', 'blur', 'select'];\nexport var Z2_EMPHASIS_LIFT = 10;\nexport var Z2_SELECT_LIFT = 9;\nexport var HIGHLIGHT_ACTION_TYPE = 'highlight';\nexport var DOWNPLAY_ACTION_TYPE = 'downplay';\nexport var SELECT_ACTION_TYPE = 'select';\nexport var UNSELECT_ACTION_TYPE = 'unselect';\nexport var TOGGLE_SELECT_ACTION_TYPE = 'toggleSelect';\nexport var SELECT_CHANGED_EVENT_TYPE = 'selectchanged';\nfunction hasFillOrStroke(fillOrStroke) {\n  return fillOrStroke != null && fillOrStroke !== 'none';\n}\nfunction doChangeHoverState(el, stateName, hoverStateEnum) {\n  if (el.onHoverStateChange && (el.hoverState || 0) !== hoverStateEnum) {\n    el.onHoverStateChange(stateName);\n  }\n  el.hoverState = hoverStateEnum;\n}\nfunction singleEnterEmphasis(el) {\n  // Only mark the flag.\n  // States will be applied in the echarts.ts in next frame.\n  doChangeHoverState(el, 'emphasis', HOVER_STATE_EMPHASIS);\n}\nfunction singleLeaveEmphasis(el) {\n  // Only mark the flag.\n  // States will be applied in the echarts.ts in next frame.\n  if (el.hoverState === HOVER_STATE_EMPHASIS) {\n    doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL);\n  }\n}\nfunction singleEnterBlur(el) {\n  doChangeHoverState(el, 'blur', HOVER_STATE_BLUR);\n}\nfunction singleLeaveBlur(el) {\n  if (el.hoverState === HOVER_STATE_BLUR) {\n    doChangeHoverState(el, 'normal', HOVER_STATE_NORMAL);\n  }\n}\nfunction singleEnterSelect(el) {\n  el.selected = true;\n}\nfunction singleLeaveSelect(el) {\n  el.selected = false;\n}\nfunction updateElementState(el, updater, commonParam) {\n  updater(el, commonParam);\n}\nfunction traverseUpdateState(el, updater, commonParam) {\n  updateElementState(el, updater, commonParam);\n  el.isGroup && el.traverse(function (child) {\n    updateElementState(child, updater, commonParam);\n  });\n}\nexport function setStatesFlag(el, stateName) {\n  switch (stateName) {\n    case 'emphasis':\n      el.hoverState = HOVER_STATE_EMPHASIS;\n      break;\n    case 'normal':\n      el.hoverState = HOVER_STATE_NORMAL;\n      break;\n    case 'blur':\n      el.hoverState = HOVER_STATE_BLUR;\n      break;\n    case 'select':\n      el.selected = true;\n  }\n}\n/**\n * If we reuse elements when rerender.\n * DON'T forget to clearStates before we update the style and shape.\n * Or we may update on the wrong state instead of normal state.\n */\nexport function clearStates(el) {\n  if (el.isGroup) {\n    el.traverse(function (child) {\n      child.clearStates();\n    });\n  } else {\n    el.clearStates();\n  }\n}\nfunction getFromStateStyle(el, props, toStateName, defaultValue) {\n  var style = el.style;\n  var fromState = {};\n  for (var i = 0; i < props.length; i++) {\n    var propName = props[i];\n    var val = style[propName];\n    fromState[propName] = val == null ? defaultValue && defaultValue[propName] : val;\n  }\n  for (var i = 0; i < el.animators.length; i++) {\n    var animator = el.animators[i];\n    if (animator.__fromStateTransition\n    // Don't consider the animation to emphasis state.\n    && animator.__fromStateTransition.indexOf(toStateName) < 0 && animator.targetName === 'style') {\n      animator.saveTo(fromState, props);\n    }\n  }\n  return fromState;\n}\nfunction createEmphasisDefaultState(el, stateName, targetStates, state) {\n  var hasSelect = targetStates && indexOf(targetStates, 'select') >= 0;\n  var cloned = false;\n  if (el instanceof Path) {\n    var store = getSavedStates(el);\n    var fromFill = hasSelect ? store.selectFill || store.normalFill : store.normalFill;\n    var fromStroke = hasSelect ? store.selectStroke || store.normalStroke : store.normalStroke;\n    if (hasFillOrStroke(fromFill) || hasFillOrStroke(fromStroke)) {\n      state = state || {};\n      var emphasisStyle = state.style || {};\n      // inherit case\n      if (emphasisStyle.fill === 'inherit') {\n        cloned = true;\n        state = extend({}, state);\n        emphasisStyle = extend({}, emphasisStyle);\n        emphasisStyle.fill = fromFill;\n      }\n      // Apply default color lift\n      else if (!hasFillOrStroke(emphasisStyle.fill) && hasFillOrStroke(fromFill)) {\n        cloned = true;\n        // Not modify the original value.\n        state = extend({}, state);\n        emphasisStyle = extend({}, emphasisStyle);\n        // Already being applied 'emphasis'. DON'T lift color multiple times.\n        emphasisStyle.fill = liftColor(fromFill);\n      }\n      // Not highlight stroke if fill has been highlighted.\n      else if (!hasFillOrStroke(emphasisStyle.stroke) && hasFillOrStroke(fromStroke)) {\n        if (!cloned) {\n          state = extend({}, state);\n          emphasisStyle = extend({}, emphasisStyle);\n        }\n        emphasisStyle.stroke = liftColor(fromStroke);\n      }\n      state.style = emphasisStyle;\n    }\n  }\n  if (state) {\n    // TODO Share with textContent?\n    if (state.z2 == null) {\n      if (!cloned) {\n        state = extend({}, state);\n      }\n      var z2EmphasisLift = el.z2EmphasisLift;\n      state.z2 = el.z2 + (z2EmphasisLift != null ? z2EmphasisLift : Z2_EMPHASIS_LIFT);\n    }\n  }\n  return state;\n}\nfunction createSelectDefaultState(el, stateName, state) {\n  // const hasSelect = indexOf(el.currentStates, stateName) >= 0;\n  if (state) {\n    // TODO Share with textContent?\n    if (state.z2 == null) {\n      state = extend({}, state);\n      var z2SelectLift = el.z2SelectLift;\n      state.z2 = el.z2 + (z2SelectLift != null ? z2SelectLift : Z2_SELECT_LIFT);\n    }\n  }\n  return state;\n}\nfunction createBlurDefaultState(el, stateName, state) {\n  var hasBlur = indexOf(el.currentStates, stateName) >= 0;\n  var currentOpacity = el.style.opacity;\n  var fromState = !hasBlur ? getFromStateStyle(el, ['opacity'], stateName, {\n    opacity: 1\n  }) : null;\n  state = state || {};\n  var blurStyle = state.style || {};\n  if (blurStyle.opacity == null) {\n    // clone state\n    state = extend({}, state);\n    blurStyle = extend({\n      // Already being applied 'emphasis'. DON'T mul opacity multiple times.\n      opacity: hasBlur ? currentOpacity : fromState.opacity * 0.1\n    }, blurStyle);\n    state.style = blurStyle;\n  }\n  return state;\n}\nfunction elementStateProxy(stateName, targetStates) {\n  var state = this.states[stateName];\n  if (this.style) {\n    if (stateName === 'emphasis') {\n      return createEmphasisDefaultState(this, stateName, targetStates, state);\n    } else if (stateName === 'blur') {\n      return createBlurDefaultState(this, stateName, state);\n    } else if (stateName === 'select') {\n      return createSelectDefaultState(this, stateName, state);\n    }\n  }\n  return state;\n}\n/**\n * Set hover style (namely \"emphasis style\") of element.\n * @param el Should not be `zrender/graphic/Group`.\n * @param focus 'self' | 'selfInSeries' | 'series'\n */\nexport function setDefaultStateProxy(el) {\n  el.stateProxy = elementStateProxy;\n  var textContent = el.getTextContent();\n  var textGuide = el.getTextGuideLine();\n  if (textContent) {\n    textContent.stateProxy = elementStateProxy;\n  }\n  if (textGuide) {\n    textGuide.stateProxy = elementStateProxy;\n  }\n}\nexport function enterEmphasisWhenMouseOver(el, e) {\n  !shouldSilent(el, e)\n  // \"emphasis\" event highlight has higher priority than mouse highlight.\n  && !el.__highByOuter && traverseUpdateState(el, singleEnterEmphasis);\n}\nexport function leaveEmphasisWhenMouseOut(el, e) {\n  !shouldSilent(el, e)\n  // \"emphasis\" event highlight has higher priority than mouse highlight.\n  && !el.__highByOuter && traverseUpdateState(el, singleLeaveEmphasis);\n}\nexport function enterEmphasis(el, highlightDigit) {\n  el.__highByOuter |= 1 << (highlightDigit || 0);\n  traverseUpdateState(el, singleEnterEmphasis);\n}\nexport function leaveEmphasis(el, highlightDigit) {\n  !(el.__highByOuter &= ~(1 << (highlightDigit || 0))) && traverseUpdateState(el, singleLeaveEmphasis);\n}\nexport function enterBlur(el) {\n  traverseUpdateState(el, singleEnterBlur);\n}\nexport function leaveBlur(el) {\n  traverseUpdateState(el, singleLeaveBlur);\n}\nexport function enterSelect(el) {\n  traverseUpdateState(el, singleEnterSelect);\n}\nexport function leaveSelect(el) {\n  traverseUpdateState(el, singleLeaveSelect);\n}\nfunction shouldSilent(el, e) {\n  return el.__highDownSilentOnTouch && e.zrByTouch;\n}\nexport function allLeaveBlur(api) {\n  var model = api.getModel();\n  var leaveBlurredSeries = [];\n  var allComponentViews = [];\n  model.eachComponent(function (componentType, componentModel) {\n    var componentStates = getComponentStates(componentModel);\n    var isSeries = componentType === 'series';\n    var view = isSeries ? api.getViewOfSeriesModel(componentModel) : api.getViewOfComponentModel(componentModel);\n    !isSeries && allComponentViews.push(view);\n    if (componentStates.isBlured) {\n      // Leave blur anyway\n      view.group.traverse(function (child) {\n        singleLeaveBlur(child);\n      });\n      isSeries && leaveBlurredSeries.push(componentModel);\n    }\n    componentStates.isBlured = false;\n  });\n  each(allComponentViews, function (view) {\n    if (view && view.toggleBlurSeries) {\n      view.toggleBlurSeries(leaveBlurredSeries, false, model);\n    }\n  });\n}\nexport function blurSeries(targetSeriesIndex, focus, blurScope, api) {\n  var ecModel = api.getModel();\n  blurScope = blurScope || 'coordinateSystem';\n  function leaveBlurOfIndices(data, dataIndices) {\n    for (var i = 0; i < dataIndices.length; i++) {\n      var itemEl = data.getItemGraphicEl(dataIndices[i]);\n      itemEl && leaveBlur(itemEl);\n    }\n  }\n  if (targetSeriesIndex == null) {\n    return;\n  }\n  if (!focus || focus === 'none') {\n    return;\n  }\n  var targetSeriesModel = ecModel.getSeriesByIndex(targetSeriesIndex);\n  var targetCoordSys = targetSeriesModel.coordinateSystem;\n  if (targetCoordSys && targetCoordSys.master) {\n    targetCoordSys = targetCoordSys.master;\n  }\n  var blurredSeries = [];\n  ecModel.eachSeries(function (seriesModel) {\n    var sameSeries = targetSeriesModel === seriesModel;\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && coordSys.master) {\n      coordSys = coordSys.master;\n    }\n    var sameCoordSys = coordSys && targetCoordSys ? coordSys === targetCoordSys : sameSeries; // If there is no coordinate system. use sameSeries instead.\n    if (!(\n    // Not blur other series if blurScope series\n    blurScope === 'series' && !sameSeries\n    // Not blur other coordinate system if blurScope is coordinateSystem\n    || blurScope === 'coordinateSystem' && !sameCoordSys\n    // Not blur self series if focus is series.\n    || focus === 'series' && sameSeries\n    // TODO blurScope: coordinate system\n    )) {\n      var view = api.getViewOfSeriesModel(seriesModel);\n      view.group.traverse(function (child) {\n        // For the elements that have been triggered by other components,\n        // and are still required to be highlighted,\n        // because the current is directly forced to blur the element,\n        // it will cause the focus self to be unable to highlight, so skip the blur of this element.\n        if (child.__highByOuter && sameSeries && focus === 'self') {\n          return;\n        }\n        singleEnterBlur(child);\n      });\n      if (isArrayLike(focus)) {\n        leaveBlurOfIndices(seriesModel.getData(), focus);\n      } else if (isObject(focus)) {\n        var dataTypes = keys(focus);\n        for (var d = 0; d < dataTypes.length; d++) {\n          leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), focus[dataTypes[d]]);\n        }\n      }\n      blurredSeries.push(seriesModel);\n      getComponentStates(seriesModel).isBlured = true;\n    }\n  });\n  ecModel.eachComponent(function (componentType, componentModel) {\n    if (componentType === 'series') {\n      return;\n    }\n    var view = api.getViewOfComponentModel(componentModel);\n    if (view && view.toggleBlurSeries) {\n      view.toggleBlurSeries(blurredSeries, true, ecModel);\n    }\n  });\n}\nexport function blurComponent(componentMainType, componentIndex, api) {\n  if (componentMainType == null || componentIndex == null) {\n    return;\n  }\n  var componentModel = api.getModel().getComponent(componentMainType, componentIndex);\n  if (!componentModel) {\n    return;\n  }\n  getComponentStates(componentModel).isBlured = true;\n  var view = api.getViewOfComponentModel(componentModel);\n  if (!view || !view.focusBlurEnabled) {\n    return;\n  }\n  view.group.traverse(function (child) {\n    singleEnterBlur(child);\n  });\n}\nexport function blurSeriesFromHighlightPayload(seriesModel, payload, api) {\n  var seriesIndex = seriesModel.seriesIndex;\n  var data = seriesModel.getData(payload.dataType);\n  if (!data) {\n    if (process.env.NODE_ENV !== 'production') {\n      error(\"Unknown dataType \" + payload.dataType);\n    }\n    return;\n  }\n  var dataIndex = queryDataIndex(data, payload);\n  // Pick the first one if there is multiple/none exists.\n  dataIndex = (isArray(dataIndex) ? dataIndex[0] : dataIndex) || 0;\n  var el = data.getItemGraphicEl(dataIndex);\n  if (!el) {\n    var count = data.count();\n    var current = 0;\n    // If data on dataIndex is NaN.\n    while (!el && current < count) {\n      el = data.getItemGraphicEl(current++);\n    }\n  }\n  if (el) {\n    var ecData = getECData(el);\n    blurSeries(seriesIndex, ecData.focus, ecData.blurScope, api);\n  } else {\n    // If there is no element put on the data. Try getting it from raw option\n    // TODO Should put it on seriesModel?\n    var focus_1 = seriesModel.get(['emphasis', 'focus']);\n    var blurScope = seriesModel.get(['emphasis', 'blurScope']);\n    if (focus_1 != null) {\n      blurSeries(seriesIndex, focus_1, blurScope, api);\n    }\n  }\n}\nexport function findComponentHighDownDispatchers(componentMainType, componentIndex, name, api) {\n  var ret = {\n    focusSelf: false,\n    dispatchers: null\n  };\n  if (componentMainType == null || componentMainType === 'series' || componentIndex == null || name == null) {\n    return ret;\n  }\n  var componentModel = api.getModel().getComponent(componentMainType, componentIndex);\n  if (!componentModel) {\n    return ret;\n  }\n  var view = api.getViewOfComponentModel(componentModel);\n  if (!view || !view.findHighDownDispatchers) {\n    return ret;\n  }\n  var dispatchers = view.findHighDownDispatchers(name);\n  // At presnet, the component (like Geo) only blur inside itself.\n  // So we do not use `blurScope` in component.\n  var focusSelf;\n  for (var i = 0; i < dispatchers.length; i++) {\n    if (process.env.NODE_ENV !== 'production' && !isHighDownDispatcher(dispatchers[i])) {\n      error('param should be highDownDispatcher');\n    }\n    if (getECData(dispatchers[i]).focus === 'self') {\n      focusSelf = true;\n      break;\n    }\n  }\n  return {\n    focusSelf: focusSelf,\n    dispatchers: dispatchers\n  };\n}\nexport function handleGlobalMouseOverForHighDown(dispatcher, e, api) {\n  if (process.env.NODE_ENV !== 'production' && !isHighDownDispatcher(dispatcher)) {\n    error('param should be highDownDispatcher');\n  }\n  var ecData = getECData(dispatcher);\n  var _a = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api),\n    dispatchers = _a.dispatchers,\n    focusSelf = _a.focusSelf;\n  // If `findHighDownDispatchers` is supported on the component,\n  // highlight/downplay elements with the same name.\n  if (dispatchers) {\n    if (focusSelf) {\n      blurComponent(ecData.componentMainType, ecData.componentIndex, api);\n    }\n    each(dispatchers, function (dispatcher) {\n      return enterEmphasisWhenMouseOver(dispatcher, e);\n    });\n  } else {\n    // Try blur all in the related series. Then emphasis the hoverred.\n    // TODO. progressive mode.\n    blurSeries(ecData.seriesIndex, ecData.focus, ecData.blurScope, api);\n    if (ecData.focus === 'self') {\n      blurComponent(ecData.componentMainType, ecData.componentIndex, api);\n    }\n    // Other than series, component that not support `findHighDownDispatcher` will\n    // also use it. But in this case, highlight/downplay are only supported in\n    // mouse hover but not in dispatchAction.\n    enterEmphasisWhenMouseOver(dispatcher, e);\n  }\n}\nexport function handleGlobalMouseOutForHighDown(dispatcher, e, api) {\n  if (process.env.NODE_ENV !== 'production' && !isHighDownDispatcher(dispatcher)) {\n    error('param should be highDownDispatcher');\n  }\n  allLeaveBlur(api);\n  var ecData = getECData(dispatcher);\n  var dispatchers = findComponentHighDownDispatchers(ecData.componentMainType, ecData.componentIndex, ecData.componentHighDownName, api).dispatchers;\n  if (dispatchers) {\n    each(dispatchers, function (dispatcher) {\n      return leaveEmphasisWhenMouseOut(dispatcher, e);\n    });\n  } else {\n    leaveEmphasisWhenMouseOut(dispatcher, e);\n  }\n}\nexport function toggleSelectionFromPayload(seriesModel, payload, api) {\n  if (!isSelectChangePayload(payload)) {\n    return;\n  }\n  var dataType = payload.dataType;\n  var data = seriesModel.getData(dataType);\n  var dataIndex = queryDataIndex(data, payload);\n  if (!isArray(dataIndex)) {\n    dataIndex = [dataIndex];\n  }\n  seriesModel[payload.type === TOGGLE_SELECT_ACTION_TYPE ? 'toggleSelect' : payload.type === SELECT_ACTION_TYPE ? 'select' : 'unselect'](dataIndex, dataType);\n}\nexport function updateSeriesElementSelection(seriesModel) {\n  var allData = seriesModel.getAllData();\n  each(allData, function (_a) {\n    var data = _a.data,\n      type = _a.type;\n    data.eachItemGraphicEl(function (el, idx) {\n      seriesModel.isSelected(idx, type) ? enterSelect(el) : leaveSelect(el);\n    });\n  });\n}\nexport function getAllSelectedIndices(ecModel) {\n  var ret = [];\n  ecModel.eachSeries(function (seriesModel) {\n    var allData = seriesModel.getAllData();\n    each(allData, function (_a) {\n      var data = _a.data,\n        type = _a.type;\n      var dataIndices = seriesModel.getSelectedDataIndices();\n      if (dataIndices.length > 0) {\n        var item = {\n          dataIndex: dataIndices,\n          seriesIndex: seriesModel.seriesIndex\n        };\n        if (type != null) {\n          item.dataType = type;\n        }\n        ret.push(item);\n      }\n    });\n  });\n  return ret;\n}\n/**\n * Enable the function that mouseover will trigger the emphasis state.\n *\n * NOTE:\n * This function should be used on the element with dataIndex, seriesIndex.\n *\n */\nexport function enableHoverEmphasis(el, focus, blurScope) {\n  setAsHighDownDispatcher(el, true);\n  traverseUpdateState(el, setDefaultStateProxy);\n  enableHoverFocus(el, focus, blurScope);\n}\nexport function disableHoverEmphasis(el) {\n  setAsHighDownDispatcher(el, false);\n}\nexport function toggleHoverEmphasis(el, focus, blurScope, isDisabled) {\n  isDisabled ? disableHoverEmphasis(el) : enableHoverEmphasis(el, focus, blurScope);\n}\nexport function enableHoverFocus(el, focus, blurScope) {\n  var ecData = getECData(el);\n  if (focus != null) {\n    // TODO dataIndex may be set after this function. This check is not useful.\n    // if (ecData.dataIndex == null) {\n    //     if (__DEV__) {\n    //         console.warn('focus can only been set on element with dataIndex');\n    //     }\n    // }\n    // else {\n    ecData.focus = focus;\n    ecData.blurScope = blurScope;\n    // }\n  } else if (ecData.focus) {\n    ecData.focus = null;\n  }\n}\nvar OTHER_STATES = ['emphasis', 'blur', 'select'];\nvar defaultStyleGetterMap = {\n  itemStyle: 'getItemStyle',\n  lineStyle: 'getLineStyle',\n  areaStyle: 'getAreaStyle'\n};\n/**\n * Set emphasis/blur/selected states of element.\n */\nexport function setStatesStylesFromModel(el, itemModel, styleType,\n// default itemStyle\ngetter) {\n  styleType = styleType || 'itemStyle';\n  for (var i = 0; i < OTHER_STATES.length; i++) {\n    var stateName = OTHER_STATES[i];\n    var model = itemModel.getModel([stateName, styleType]);\n    var state = el.ensureState(stateName);\n    // Let it throw error if getterType is not found.\n    state.style = getter ? getter(model) : model[defaultStyleGetterMap[styleType]]();\n  }\n}\n/**\n *\n * Set element as highlight / downplay dispatcher.\n * It will be checked when element received mouseover event or from highlight action.\n * It's in change of all highlight/downplay behavior of it's children.\n *\n * @param el\n * @param el.highDownSilentOnTouch\n *        In touch device, mouseover event will be trigger on touchstart event\n *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can\n *        conveniently use hoverStyle when tap on touch screen without additional\n *        code for compatibility.\n *        But if the chart/component has select feature, which usually also use\n *        hoverStyle, there might be conflict between 'select-highlight' and\n *        'hover-highlight' especially when roam is enabled (see geo for example).\n *        In this case, `highDownSilentOnTouch` should be used to disable\n *        hover-highlight on touch device.\n * @param asDispatcher If `false`, do not set as \"highDownDispatcher\".\n */\nexport function setAsHighDownDispatcher(el, asDispatcher) {\n  var disable = asDispatcher === false;\n  var extendedEl = el;\n  // Make `highDownSilentOnTouch` and `onStateChange` only work after\n  // `setAsHighDownDispatcher` called. Avoid it is modified by user unexpectedly.\n  if (el.highDownSilentOnTouch) {\n    extendedEl.__highDownSilentOnTouch = el.highDownSilentOnTouch;\n  }\n  // Simple optimize, since this method might be\n  // called for each elements of a group in some cases.\n  if (!disable || extendedEl.__highDownDispatcher) {\n    // Emphasis, normal can be triggered manually by API or other components like hover link.\n    // el[method]('emphasis', onElementEmphasisEvent)[method]('normal', onElementNormalEvent);\n    // Also keep previous record.\n    extendedEl.__highByOuter = extendedEl.__highByOuter || 0;\n    extendedEl.__highDownDispatcher = !disable;\n  }\n}\nexport function isHighDownDispatcher(el) {\n  return !!(el && el.__highDownDispatcher);\n}\n/**\n * Enable component highlight/downplay features:\n * + hover link (within the same name)\n * + focus blur in component\n */\nexport function enableComponentHighDownFeatures(el, componentModel, componentHighDownName) {\n  var ecData = getECData(el);\n  ecData.componentMainType = componentModel.mainType;\n  ecData.componentIndex = componentModel.componentIndex;\n  ecData.componentHighDownName = componentHighDownName;\n}\n/**\n * Support highlight/downplay record on each elements.\n * For the case: hover highlight/downplay (legend, visualMap, ...) and\n * user triggered highlight/downplay should not conflict.\n * Only all of the highlightDigit cleared, return to normal.\n * @param {string} highlightKey\n * @return {number} highlightDigit\n */\nexport function getHighlightDigit(highlightKey) {\n  var highlightDigit = _highlightKeyMap[highlightKey];\n  if (highlightDigit == null && _highlightNextDigit <= 32) {\n    highlightDigit = _highlightKeyMap[highlightKey] = _highlightNextDigit++;\n  }\n  return highlightDigit;\n}\nexport function isSelectChangePayload(payload) {\n  var payloadType = payload.type;\n  return payloadType === SELECT_ACTION_TYPE || payloadType === UNSELECT_ACTION_TYPE || payloadType === TOGGLE_SELECT_ACTION_TYPE;\n}\nexport function isHighDownPayload(payload) {\n  var payloadType = payload.type;\n  return payloadType === HIGHLIGHT_ACTION_TYPE || payloadType === DOWNPLAY_ACTION_TYPE;\n}\nexport function savePathStates(el) {\n  var store = getSavedStates(el);\n  store.normalFill = el.style.fill;\n  store.normalStroke = el.style.stroke;\n  var selectState = el.states.select || {};\n  store.selectFill = selectState.style && selectState.style.fill || null;\n  store.selectStroke = selectState.style && selectState.style.stroke || null;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as pathTool from 'zrender/lib/tool/path.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport * as vector from 'zrender/lib/core/vector.js';\nimport Path from 'zrender/lib/graphic/Path.js';\nimport Transformable from 'zrender/lib/core/Transformable.js';\nimport ZRImage from 'zrender/lib/graphic/Image.js';\nimport Group from 'zrender/lib/graphic/Group.js';\nimport ZRText from 'zrender/lib/graphic/Text.js';\nimport Circle from 'zrender/lib/graphic/shape/Circle.js';\nimport Ellipse from 'zrender/lib/graphic/shape/Ellipse.js';\nimport Sector from 'zrender/lib/graphic/shape/Sector.js';\nimport Ring from 'zrender/lib/graphic/shape/Ring.js';\nimport Polygon from 'zrender/lib/graphic/shape/Polygon.js';\nimport Polyline from 'zrender/lib/graphic/shape/Polyline.js';\nimport Rect from 'zrender/lib/graphic/shape/Rect.js';\nimport Line from 'zrender/lib/graphic/shape/Line.js';\nimport BezierCurve from 'zrender/lib/graphic/shape/BezierCurve.js';\nimport Arc from 'zrender/lib/graphic/shape/Arc.js';\nimport CompoundPath from 'zrender/lib/graphic/CompoundPath.js';\nimport LinearGradient from 'zrender/lib/graphic/LinearGradient.js';\nimport RadialGradient from 'zrender/lib/graphic/RadialGradient.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport OrientedBoundingRect from 'zrender/lib/core/OrientedBoundingRect.js';\nimport Point from 'zrender/lib/core/Point.js';\nimport IncrementalDisplayable from 'zrender/lib/graphic/IncrementalDisplayable.js';\nimport * as subPixelOptimizeUtil from 'zrender/lib/graphic/helper/subPixelOptimize.js';\nimport { extend, isArrayLike, map, defaults, isString, keys, each, hasOwn, isArray, isNumber, clone, assert } from 'zrender/lib/core/util.js';\nimport { getECData } from './innerStore.js';\nimport { updateProps, initProps, removeElement, removeElementWithFadeOut, isElementRemoved } from '../animation/basicTransition.js';\nimport { mathMin, mathMax, mathAbs } from './number.js';\n/**\n * @deprecated export for compatitable reason\n */\nexport { updateProps, initProps, removeElement, removeElementWithFadeOut, isElementRemoved };\nvar _customShapeMap = {};\nexport var XY = ['x', 'y'];\nexport var WH = ['width', 'height'];\n/**\n * Extend shape with parameters\n */\nexport function extendShape(opts) {\n  return Path.extend(opts);\n}\nvar extendPathFromString = pathTool.extendFromString;\n/**\n * Extend path\n */\nexport function extendPath(pathData, opts) {\n  return extendPathFromString(pathData, opts);\n}\n/**\n * Register a user defined shape.\n * The shape class can be fetched by `getShapeClass`\n * This method will overwrite the registered shapes, including\n * the registered built-in shapes, if using the same `name`.\n * The shape can be used in `custom series` and\n * `graphic component` by declaring `{type: name}`.\n *\n * @param name\n * @param ShapeClass Can be generated by `extendShape`.\n */\nexport function registerShape(name, ShapeClass) {\n  _customShapeMap[name] = ShapeClass;\n}\n/**\n * Find shape class registered by `registerShape`. Usually used in\n * fetching user defined shape.\n *\n * [Caution]:\n * (1) This method **MUST NOT be used inside echarts !!!**, unless it is prepared\n * to use user registered shapes.\n * Because the built-in shape (see `getBuiltInShape`) will be registered by\n * `registerShape` by default. That enables users to get both built-in\n * shapes as well as the shapes belonging to themsleves. But users can overwrite\n * the built-in shapes by using names like 'circle', 'rect' via calling\n * `registerShape`. So the echarts inner featrues should not fetch shapes from here\n * in case that it is overwritten by users, except that some features, like\n * `custom series`, `graphic component`, do it deliberately.\n *\n * (2) In the features like `custom series`, `graphic component`, the user input\n * `{tpye: 'xxx'}` does not only specify shapes but also specify other graphic\n * elements like `'group'`, `'text'`, `'image'` or event `'path'`. Those names\n * are reserved names, that is, if some user registers a shape named `'image'`,\n * the shape will not be used. If we intending to add some more reserved names\n * in feature, that might bring break changes (disable some existing user shape\n * names). But that case probably rarely happens. So we don't make more mechanism\n * to resolve this issue here.\n *\n * @param name\n * @return The shape class. If not found, return nothing.\n */\nexport function getShapeClass(name) {\n  if (_customShapeMap.hasOwnProperty(name)) {\n    return _customShapeMap[name];\n  }\n}\n/**\n * Create a path element from path data string\n * @param pathData\n * @param opts\n * @param rect\n * @param layout 'center' or 'cover' default to be cover\n */\nexport function makePath(pathData, opts, rect, layout) {\n  var path = pathTool.createFromString(pathData, opts);\n  if (rect) {\n    if (layout === 'center') {\n      rect = centerGraphic(rect, path.getBoundingRect());\n    }\n    resizePath(path, rect);\n  }\n  return path;\n}\n/**\n * Create a image element from image url\n * @param imageUrl image url\n * @param opts options\n * @param rect constrain rect\n * @param layout 'center' or 'cover'. Default to be 'cover'\n */\nexport function makeImage(imageUrl, rect, layout) {\n  var zrImg = new ZRImage({\n    style: {\n      image: imageUrl,\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height\n    },\n    onload: function (img) {\n      if (layout === 'center') {\n        var boundingRect = {\n          width: img.width,\n          height: img.height\n        };\n        zrImg.setStyle(centerGraphic(rect, boundingRect));\n      }\n    }\n  });\n  return zrImg;\n}\n/**\n * Get position of centered element in bounding box.\n *\n * @param  rect         element local bounding box\n * @param  boundingRect constraint bounding box\n * @return element position containing x, y, width, and height\n */\nfunction centerGraphic(rect, boundingRect) {\n  // Set rect to center, keep width / height ratio.\n  var aspect = boundingRect.width / boundingRect.height;\n  var width = rect.height * aspect;\n  var height;\n  if (width <= rect.width) {\n    height = rect.height;\n  } else {\n    width = rect.width;\n    height = width / aspect;\n  }\n  var cx = rect.x + rect.width / 2;\n  var cy = rect.y + rect.height / 2;\n  return {\n    x: cx - width / 2,\n    y: cy - height / 2,\n    width: width,\n    height: height\n  };\n}\nexport var mergePath = pathTool.mergePath;\n/**\n * Resize a path to fit the rect\n * @param path\n * @param rect\n */\nexport function resizePath(path, rect) {\n  if (!path.applyTransform) {\n    return;\n  }\n  var pathRect = path.getBoundingRect();\n  var m = pathRect.calculateTransform(rect);\n  path.applyTransform(m);\n}\n/**\n * Sub pixel optimize line for canvas\n */\nexport function subPixelOptimizeLine(shape, lineWidth) {\n  subPixelOptimizeUtil.subPixelOptimizeLine(shape, shape, {\n    lineWidth: lineWidth\n  });\n  return shape;\n}\n/**\n * Sub pixel optimize rect for canvas\n */\nexport function subPixelOptimizeRect(shape, style) {\n  subPixelOptimizeUtil.subPixelOptimizeRect(shape, shape, style);\n  return shape;\n}\n/**\n * Sub pixel optimize for canvas\n *\n * @param position Coordinate, such as x, y\n * @param lineWidth Should be nonnegative integer.\n * @param positiveOrNegative Default false (negative).\n * @return Optimized position.\n */\nexport var subPixelOptimize = subPixelOptimizeUtil.subPixelOptimize;\n/**\n * Get transform matrix of target (param target),\n * in coordinate of its ancestor (param ancestor)\n *\n * @param target\n * @param [ancestor]\n */\nexport function getTransform(target, ancestor) {\n  var mat = matrix.identity([]);\n  while (target && target !== ancestor) {\n    matrix.mul(mat, target.getLocalTransform(), mat);\n    target = target.parent;\n  }\n  return mat;\n}\n/**\n * Apply transform to an vertex.\n * @param target [x, y]\n * @param transform Can be:\n *      + Transform matrix: like [1, 0, 0, 1, 0, 0]\n *      + {position, rotation, scale}, the same as `zrender/Transformable`.\n * @param invert Whether use invert matrix.\n * @return [x, y]\n */\nexport function applyTransform(target, transform, invert) {\n  if (transform && !isArrayLike(transform)) {\n    transform = Transformable.getLocalTransform(transform);\n  }\n  if (invert) {\n    transform = matrix.invert([], transform);\n  }\n  return vector.applyTransform([], target, transform);\n}\n/**\n * @param direction 'left' 'right' 'top' 'bottom'\n * @param transform Transform matrix: like [1, 0, 0, 1, 0, 0]\n * @param invert Whether use invert matrix.\n * @return Transformed direction. 'left' 'right' 'top' 'bottom'\n */\nexport function transformDirection(direction, transform, invert) {\n  // Pick a base, ensure that transform result will not be (0, 0).\n  var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : mathAbs(2 * transform[4] / transform[0]);\n  var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : mathAbs(2 * transform[4] / transform[2]);\n  var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0];\n  vertex = applyTransform(vertex, transform, invert);\n  return mathAbs(vertex[0]) > mathAbs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top';\n}\nfunction isNotGroup(el) {\n  return !el.isGroup;\n}\nfunction isPath(el) {\n  return el.shape != null;\n}\n/**\n * Apply group transition animation from g1 to g2.\n * If no animatableModel, no animation.\n */\nexport function groupTransition(g1, g2, animatableModel) {\n  if (!g1 || !g2) {\n    return;\n  }\n  function getElMap(g) {\n    var elMap = {};\n    g.traverse(function (el) {\n      if (isNotGroup(el) && el.anid) {\n        elMap[el.anid] = el;\n      }\n    });\n    return elMap;\n  }\n  function getAnimatableProps(el) {\n    var obj = {\n      x: el.x,\n      y: el.y,\n      rotation: el.rotation\n    };\n    if (isPath(el)) {\n      obj.shape = clone(el.shape);\n    }\n    return obj;\n  }\n  var elMap1 = getElMap(g1);\n  g2.traverse(function (el) {\n    if (isNotGroup(el) && el.anid) {\n      var oldEl = elMap1[el.anid];\n      if (oldEl) {\n        var newProp = getAnimatableProps(el);\n        el.attr(getAnimatableProps(oldEl));\n        updateProps(el, newProp, animatableModel, getECData(el).dataIndex);\n      }\n    }\n  });\n}\nexport function clipPointsByRect(points, rect) {\n  // FIXME: This way might be incorrect when graphic clipped by a corner\n  // and when element has a border.\n  return map(points, function (point) {\n    var x = point[0];\n    x = mathMax(x, rect.x);\n    x = mathMin(x, rect.x + rect.width);\n    var y = point[1];\n    y = mathMax(y, rect.y);\n    y = mathMin(y, rect.y + rect.height);\n    return [x, y];\n  });\n}\n/**\n * Return a new clipped rect. If rect size are negative, return undefined.\n */\nexport function clipRectByRect(targetRect, rect) {\n  var x = mathMax(targetRect.x, rect.x);\n  var x2 = mathMin(targetRect.x + targetRect.width, rect.x + rect.width);\n  var y = mathMax(targetRect.y, rect.y);\n  var y2 = mathMin(targetRect.y + targetRect.height, rect.y + rect.height);\n  // If the total rect is cliped, nothing, including the border,\n  // should be painted. So return undefined.\n  if (x2 >= x && y2 >= y) {\n    return {\n      x: x,\n      y: y,\n      width: x2 - x,\n      height: y2 - y\n    };\n  }\n}\nexport function createIcon(iconStr,\n// Support 'image://' or 'path://' or direct svg path.\nopt, rect) {\n  var innerOpts = extend({\n    rectHover: true\n  }, opt);\n  var style = innerOpts.style = {\n    strokeNoScale: true\n  };\n  rect = rect || {\n    x: -1,\n    y: -1,\n    width: 2,\n    height: 2\n  };\n  if (iconStr) {\n    return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZRImage(innerOpts)) : makePath(iconStr.replace('path://', ''), innerOpts, rect, 'center');\n  }\n}\n/**\n * Return `true` if the given line (line `a`) and the given polygon\n * are intersect.\n * Note that we do not count colinear as intersect here because no\n * requirement for that. We could do that if required in future.\n */\nexport function linePolygonIntersect(a1x, a1y, a2x, a2y, points) {\n  for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) {\n    var p = points[i];\n    if (lineLineIntersect(a1x, a1y, a2x, a2y, p[0], p[1], p2[0], p2[1])) {\n      return true;\n    }\n    p2 = p;\n  }\n}\n/**\n * Return `true` if the given two lines (line `a` and line `b`)\n * are intersect.\n * Note that we do not count colinear as intersect here because no\n * requirement for that. We could do that if required in future.\n */\nexport function lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n  // let `vec_m` to be `vec_a2 - vec_a1` and `vec_n` to be `vec_b2 - vec_b1`.\n  var mx = a2x - a1x;\n  var my = a2y - a1y;\n  var nx = b2x - b1x;\n  var ny = b2y - b1y;\n  // `vec_m` and `vec_n` are parallel iff\n  //     existing `k` such that `vec_m = k \u00B7 vec_n`, equivalent to `vec_m X vec_n = 0`.\n  var nmCrossProduct = crossProduct2d(nx, ny, mx, my);\n  if (nearZero(nmCrossProduct)) {\n    return false;\n  }\n  // `vec_m` and `vec_n` are intersect iff\n  //     existing `p` and `q` in [0, 1] such that `vec_a1 + p * vec_m = vec_b1 + q * vec_n`,\n  //     such that `q = ((vec_a1 - vec_b1) X vec_m) / (vec_n X vec_m)`\n  //           and `p = ((vec_a1 - vec_b1) X vec_n) / (vec_n X vec_m)`.\n  var b1a1x = a1x - b1x;\n  var b1a1y = a1y - b1y;\n  var q = crossProduct2d(b1a1x, b1a1y, mx, my) / nmCrossProduct;\n  if (q < 0 || q > 1) {\n    return false;\n  }\n  var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct;\n  if (p < 0 || p > 1) {\n    return false;\n  }\n  return true;\n}\n/**\n * Cross product of 2-dimension vector.\n */\nfunction crossProduct2d(x1, y1, x2, y2) {\n  return x1 * y2 - x2 * y1;\n}\nfunction nearZero(val) {\n  return val <= 1e-6 && val >= -1e-6;\n}\n/**\n * NOTE:\n *  A negative-width/height rect (due to negative margins) is not supported;\n *  it will be clampped to zero width/height.\n *  Although negative-width/height rects can be defined reasonably following the\n *  similar sense in CSS, but they are rarely used, hard to understand and complicated.\n *\n * @param rect Assume its width/height >= 0 if existing.\n *  x/y/width/height is allowed to be NaN,\n *  for the case that only x/width or y/height is intended to be computed.\n * @param delta\n *  If be `number[]`, should be `[top, right, bottom, left]`,\n *      which can be used in padding or margin case.\n *      @see `normalizeCssArray` in `util/format.ts`\n *  If be `number`, it means [delta, delta, delta, delta],\n *      which can be used in lineWidth (borderWith) case,\n *      [NOTICE]: commonly pass lineWidth / 2, following the convention that border is\n *      half inside half outside of the rect.\n * @param shrinkOrExpand\n *  `true` - shrink if `delta[i]` is positive, commmonly used in `padding` case.\n *  `false` - expand if `delta[i]` is positive, commmonly used in `margin` case. (default)\n * @param noNegative\n *  `true` - negative `delta[i]` will be clampped to 0.\n *  `false` - No clamp to `delta`. (default).\n * @return The input `rect`.\n */\nexport function expandOrShrinkRect(rect, delta, shrinkOrExpand, noNegative, minSize // by default [0, 0].\n) {\n  if (delta == null) {\n    return rect;\n  } else if (isNumber(delta)) {\n    _tmpExpandRectDelta[0] = _tmpExpandRectDelta[1] = _tmpExpandRectDelta[2] = _tmpExpandRectDelta[3] = delta;\n  } else {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(delta.length === 4);\n    }\n    _tmpExpandRectDelta[0] = delta[0];\n    _tmpExpandRectDelta[1] = delta[1];\n    _tmpExpandRectDelta[2] = delta[2];\n    _tmpExpandRectDelta[3] = delta[3];\n  }\n  if (noNegative) {\n    _tmpExpandRectDelta[0] = mathMax(0, _tmpExpandRectDelta[0]);\n    _tmpExpandRectDelta[1] = mathMax(0, _tmpExpandRectDelta[1]);\n    _tmpExpandRectDelta[2] = mathMax(0, _tmpExpandRectDelta[2]);\n    _tmpExpandRectDelta[3] = mathMax(0, _tmpExpandRectDelta[3]);\n  }\n  if (shrinkOrExpand) {\n    _tmpExpandRectDelta[0] = -_tmpExpandRectDelta[0];\n    _tmpExpandRectDelta[1] = -_tmpExpandRectDelta[1];\n    _tmpExpandRectDelta[2] = -_tmpExpandRectDelta[2];\n    _tmpExpandRectDelta[3] = -_tmpExpandRectDelta[3];\n  }\n  expandRectOnOneDimension(rect, _tmpExpandRectDelta, 'x', 'width', 3, 1, minSize && minSize[0] || 0);\n  expandRectOnOneDimension(rect, _tmpExpandRectDelta, 'y', 'height', 0, 2, minSize && minSize[1] || 0);\n  return rect;\n}\nvar _tmpExpandRectDelta = [0, 0, 0, 0];\nfunction expandRectOnOneDimension(rect, delta, xy, wh, ltIdx, rbIdx, minSize) {\n  var deltaSum = delta[rbIdx] + delta[ltIdx];\n  var oldSize = rect[wh];\n  rect[wh] += deltaSum;\n  minSize = mathMax(0, mathMin(minSize, oldSize));\n  if (rect[wh] < minSize) {\n    rect[wh] = minSize;\n    // Try to make the position of the zero rect reasonable in most visual cases.\n    rect[xy] += delta[ltIdx] >= 0 ? -delta[ltIdx] : delta[rbIdx] >= 0 ? oldSize + delta[rbIdx] : mathAbs(deltaSum) > 1e-8 ? (oldSize - minSize) * delta[ltIdx] / deltaSum : 0;\n  } else {\n    rect[xy] -= delta[ltIdx];\n  }\n}\nexport function setTooltipConfig(opt) {\n  var itemTooltipOption = opt.itemTooltipOption;\n  var componentModel = opt.componentModel;\n  var itemName = opt.itemName;\n  var itemTooltipOptionObj = isString(itemTooltipOption) ? {\n    formatter: itemTooltipOption\n  } : itemTooltipOption;\n  var mainType = componentModel.mainType;\n  var componentIndex = componentModel.componentIndex;\n  var formatterParams = {\n    componentType: mainType,\n    name: itemName,\n    $vars: ['name']\n  };\n  formatterParams[mainType + 'Index'] = componentIndex;\n  var formatterParamsExtra = opt.formatterParamsExtra;\n  if (formatterParamsExtra) {\n    each(keys(formatterParamsExtra), function (key) {\n      if (!hasOwn(formatterParams, key)) {\n        formatterParams[key] = formatterParamsExtra[key];\n        formatterParams.$vars.push(key);\n      }\n    });\n  }\n  var ecData = getECData(opt.el);\n  ecData.componentMainType = mainType;\n  ecData.componentIndex = componentIndex;\n  ecData.tooltipConfig = {\n    name: itemName,\n    option: defaults({\n      content: itemName,\n      encodeHTMLContent: true,\n      formatterParams: formatterParams\n    }, itemTooltipOptionObj)\n  };\n}\nfunction traverseElement(el, cb) {\n  var stopped;\n  // TODO\n  // Polyfill for fixing zrender group traverse don't visit it's root issue.\n  if (el.isGroup) {\n    stopped = cb(el);\n  }\n  if (!stopped) {\n    el.traverse(cb);\n  }\n}\nexport function traverseElements(els, cb) {\n  if (els) {\n    if (isArray(els)) {\n      for (var i = 0; i < els.length; i++) {\n        traverseElement(els[i], cb);\n      }\n    } else {\n      traverseElement(els, cb);\n    }\n  }\n}\n/**\n * After a boundingRect applying a `transform`, whether to be still parallel screen X and Y.\n */\nexport function isBoundingRectAxisAligned(transform) {\n  return !transform || mathAbs(transform[1]) < AXIS_ALIGN_EPSILON && mathAbs(transform[2]) < AXIS_ALIGN_EPSILON || mathAbs(transform[0]) < AXIS_ALIGN_EPSILON && mathAbs(transform[3]) < AXIS_ALIGN_EPSILON;\n}\nvar AXIS_ALIGN_EPSILON = 1e-5;\n/**\n * Create or copy to the existing bounding rect to avoid modifying `source`.\n *\n * @usage\n *  out.rect = ensureCopyRect(out.rect, sourceRect);\n */\nexport function ensureCopyRect(target, source) {\n  return target ? BoundingRect.copy(target, source) : source.clone();\n}\n/**\n * Create or copy to the existing transform to avoid modifying `source`.\n *\n * [CAUTION]: transform is `NullUndefined` if no transform, following convention of zrender,\n *  and enable to bypass some unnecessary calculation, since in most cases there is no transform.\n *\n * @usage\n *  out.transform = ensureCopyTransform(out.transform, sourceTransform);\n */\nexport function ensureCopyTransform(target, source) {\n  return source ? matrix.copy(target || matrix.create(), source) : undefined;\n}\nexport function retrieveZInfo(model) {\n  return {\n    z: model.get('z') || 0,\n    zlevel: model.get('zlevel') || 0\n  };\n}\n/**\n * Assume all of the elements has the same `z` and `zlevel`.\n */\nexport function calcZ2Range(el) {\n  var max = -Infinity;\n  var min = Infinity;\n  traverseElement(el, function (el) {\n    visitEl(el);\n    visitEl(el.getTextContent());\n    visitEl(el.getTextGuideLine());\n  });\n  function visitEl(el) {\n    if (!el || el.isGroup) {\n      return;\n    }\n    var currentStates = el.currentStates;\n    if (currentStates.length) {\n      for (var idx = 0; idx < currentStates.length; idx++) {\n        calcZ2(el.states[currentStates[idx]]);\n      }\n    }\n    calcZ2(el);\n  }\n  function calcZ2(entity) {\n    if (entity) {\n      var z2 = entity.z2;\n      // Consider z2 may be NullUndefined\n      if (z2 > max) {\n        max = z2;\n      }\n      if (z2 < min) {\n        min = z2;\n      }\n    }\n  }\n  if (min > max) {\n    min = max = 0;\n  }\n  return {\n    min: min,\n    max: max\n  };\n}\nexport function traverseUpdateZ(el, z, zlevel) {\n  doUpdateZ(el, z, zlevel, -Infinity);\n}\nfunction doUpdateZ(el, z, zlevel,\n// FIXME: Ideally all the labels should be above all the glyphs by default,\n//  e.g. in graph, edge labels should be above node elements.\n//  Currently impl does not guarantee that.\nmaxZ2) {\n  // `ignoreModelZ` is used to intentionally lift elements to cover other elements,\n  // where maxZ2 (for label.z2) should also not be counted for its parents.\n  if (el.ignoreModelZ) {\n    return maxZ2;\n  }\n  // Group may also have textContent\n  var label = el.getTextContent();\n  var labelLine = el.getTextGuideLine();\n  var isGroup = el.isGroup;\n  if (isGroup) {\n    // set z & zlevel of children elements of Group\n    var children = el.childrenRef();\n    for (var i = 0; i < children.length; i++) {\n      maxZ2 = mathMax(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2);\n    }\n  } else {\n    // not Group\n    el.z = z;\n    el.zlevel = zlevel;\n    maxZ2 = mathMax(el.z2 || 0, maxZ2);\n  }\n  // always set z and zlevel if label/labelLine exists\n  if (label) {\n    label.z = z;\n    label.zlevel = zlevel;\n    // lift z2 of text content\n    // TODO if el.emphasis.z2 is spcefied, what about textContent.\n    isFinite(maxZ2) && (label.z2 = maxZ2 + 2);\n  }\n  if (labelLine) {\n    var textGuideLineConfig = el.textGuideLineConfig;\n    labelLine.z = z;\n    labelLine.zlevel = zlevel;\n    isFinite(maxZ2) && (labelLine.z2 = maxZ2 + (textGuideLineConfig && textGuideLineConfig.showAbove ? 1 : -1));\n  }\n  return maxZ2;\n}\n// Register built-in shapes. These shapes might be overwritten\n// by users, although we do not recommend that.\nregisterShape('circle', Circle);\nregisterShape('ellipse', Ellipse);\nregisterShape('sector', Sector);\nregisterShape('ring', Ring);\nregisterShape('polygon', Polygon);\nregisterShape('polyline', Polyline);\nregisterShape('rect', Rect);\nregisterShape('line', Line);\nregisterShape('bezierCurve', BezierCurve);\nregisterShape('arc', Arc);\nexport { Group, ZRImage as Image, ZRText as Text, Circle, Ellipse, Sector, Ring, Polygon, Polyline, Rect, Line, BezierCurve, Arc, IncrementalDisplayable, CompoundPath, LinearGradient, RadialGradient, BoundingRect, OrientedBoundingRect, Point, Path };", "import PathProxy from '../core/PathProxy.js';\nimport { applyTransform as v2ApplyTransform } from '../core/vector.js';\nvar CMD = PathProxy.CMD;\nvar points = [[], [], []];\nvar mathSqrt = Math.sqrt;\nvar mathAtan2 = Math.atan2;\nexport default function transformPath(path, m) {\n    if (!m) {\n        return;\n    }\n    var data = path.data;\n    var len = path.len();\n    var cmd;\n    var nPoint;\n    var i;\n    var j;\n    var k;\n    var p;\n    var M = CMD.M;\n    var C = CMD.C;\n    var L = CMD.L;\n    var R = CMD.R;\n    var A = CMD.A;\n    var Q = CMD.Q;\n    for (i = 0, j = 0; i < len;) {\n        cmd = data[i++];\n        j = i;\n        nPoint = 0;\n        switch (cmd) {\n            case M:\n                nPoint = 1;\n                break;\n            case L:\n                nPoint = 1;\n                break;\n            case C:\n                nPoint = 3;\n                break;\n            case Q:\n                nPoint = 2;\n                break;\n            case A:\n                var x = m[4];\n                var y = m[5];\n                var sx = mathSqrt(m[0] * m[0] + m[1] * m[1]);\n                var sy = mathSqrt(m[2] * m[2] + m[3] * m[3]);\n                var angle = mathAtan2(-m[1] / sy, m[0] / sx);\n                data[i] *= sx;\n                data[i++] += x;\n                data[i] *= sy;\n                data[i++] += y;\n                data[i++] *= sx;\n                data[i++] *= sy;\n                data[i++] += angle;\n                data[i++] += angle;\n                i += 2;\n                j = i;\n                break;\n            case R:\n                p[0] = data[i++];\n                p[1] = data[i++];\n                v2ApplyTransform(p, p, m);\n                data[j++] = p[0];\n                data[j++] = p[1];\n                p[0] += data[i++];\n                p[1] += data[i++];\n                v2ApplyTransform(p, p, m);\n                data[j++] = p[0];\n                data[j++] = p[1];\n        }\n        for (k = 0; k < nPoint; k++) {\n            var p_1 = points[k];\n            p_1[0] = data[i++];\n            p_1[1] = data[i++];\n            v2ApplyTransform(p_1, p_1, m);\n            data[j++] = p_1[0];\n            data[j++] = p_1[1];\n        }\n    }\n    path.increaseVersion();\n}\n", "import { __extends } from \"tslib\";\nimport Path from '../graphic/Path.js';\nimport PathProxy from '../core/PathProxy.js';\nimport transformPath from './transformPath.js';\nimport { extend } from '../core/util.js';\nvar mathSqrt = Math.sqrt;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI = Math.PI;\nfunction vMag(v) {\n    return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n}\n;\nfunction vRatio(u, v) {\n    return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));\n}\n;\nfunction vAngle(u, v) {\n    return (u[0] * v[1] < u[1] * v[0] ? -1 : 1)\n        * Math.acos(vRatio(u, v));\n}\n;\nfunction processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {\n    var psi = psiDeg * (PI / 180.0);\n    var xp = mathCos(psi) * (x1 - x2) / 2.0\n        + mathSin(psi) * (y1 - y2) / 2.0;\n    var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0\n        + mathCos(psi) * (y1 - y2) / 2.0;\n    var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);\n    if (lambda > 1) {\n        rx *= mathSqrt(lambda);\n        ry *= mathSqrt(lambda);\n    }\n    var f = (fa === fs ? -1 : 1)\n        * mathSqrt((((rx * rx) * (ry * ry))\n            - ((rx * rx) * (yp * yp))\n            - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp)\n            + (ry * ry) * (xp * xp))) || 0;\n    var cxp = f * rx * yp / ry;\n    var cyp = f * -ry * xp / rx;\n    var cx = (x1 + x2) / 2.0\n        + mathCos(psi) * cxp\n        - mathSin(psi) * cyp;\n    var cy = (y1 + y2) / 2.0\n        + mathSin(psi) * cxp\n        + mathCos(psi) * cyp;\n    var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);\n    var u = [(xp - cxp) / rx, (yp - cyp) / ry];\n    var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];\n    var dTheta = vAngle(u, v);\n    if (vRatio(u, v) <= -1) {\n        dTheta = PI;\n    }\n    if (vRatio(u, v) >= 1) {\n        dTheta = 0;\n    }\n    if (dTheta < 0) {\n        var n = Math.round(dTheta / PI * 1e6) / 1e6;\n        dTheta = PI * 2 + (n % 2) * PI;\n    }\n    path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);\n}\nvar commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig;\nvar numberReg = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;\nfunction createPathProxyFromString(data) {\n    var path = new PathProxy();\n    if (!data) {\n        return path;\n    }\n    var cpx = 0;\n    var cpy = 0;\n    var subpathX = cpx;\n    var subpathY = cpy;\n    var prevCmd;\n    var CMD = PathProxy.CMD;\n    var cmdList = data.match(commandReg);\n    if (!cmdList) {\n        return path;\n    }\n    for (var l = 0; l < cmdList.length; l++) {\n        var cmdText = cmdList[l];\n        var cmdStr = cmdText.charAt(0);\n        var cmd = void 0;\n        var p = cmdText.match(numberReg) || [];\n        var pLen = p.length;\n        for (var i = 0; i < pLen; i++) {\n            p[i] = parseFloat(p[i]);\n        }\n        var off = 0;\n        while (off < pLen) {\n            var ctlPtx = void 0;\n            var ctlPty = void 0;\n            var rx = void 0;\n            var ry = void 0;\n            var psi = void 0;\n            var fa = void 0;\n            var fs = void 0;\n            var x1 = cpx;\n            var y1 = cpy;\n            var len = void 0;\n            var pathData = void 0;\n            switch (cmdStr) {\n                case 'l':\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    cmd = CMD.L;\n                    path.addData(cmd, cpx, cpy);\n                    break;\n                case 'L':\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    cmd = CMD.L;\n                    path.addData(cmd, cpx, cpy);\n                    break;\n                case 'm':\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    cmd = CMD.M;\n                    path.addData(cmd, cpx, cpy);\n                    subpathX = cpx;\n                    subpathY = cpy;\n                    cmdStr = 'l';\n                    break;\n                case 'M':\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    cmd = CMD.M;\n                    path.addData(cmd, cpx, cpy);\n                    subpathX = cpx;\n                    subpathY = cpy;\n                    cmdStr = 'L';\n                    break;\n                case 'h':\n                    cpx += p[off++];\n                    cmd = CMD.L;\n                    path.addData(cmd, cpx, cpy);\n                    break;\n                case 'H':\n                    cpx = p[off++];\n                    cmd = CMD.L;\n                    path.addData(cmd, cpx, cpy);\n                    break;\n                case 'v':\n                    cpy += p[off++];\n                    cmd = CMD.L;\n                    path.addData(cmd, cpx, cpy);\n                    break;\n                case 'V':\n                    cpy = p[off++];\n                    cmd = CMD.L;\n                    path.addData(cmd, cpx, cpy);\n                    break;\n                case 'C':\n                    cmd = CMD.C;\n                    path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]);\n                    cpx = p[off - 2];\n                    cpy = p[off - 1];\n                    break;\n                case 'c':\n                    cmd = CMD.C;\n                    path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy);\n                    cpx += p[off - 2];\n                    cpy += p[off - 1];\n                    break;\n                case 'S':\n                    ctlPtx = cpx;\n                    ctlPty = cpy;\n                    len = path.len();\n                    pathData = path.data;\n                    if (prevCmd === CMD.C) {\n                        ctlPtx += cpx - pathData[len - 4];\n                        ctlPty += cpy - pathData[len - 3];\n                    }\n                    cmd = CMD.C;\n                    x1 = p[off++];\n                    y1 = p[off++];\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);\n                    break;\n                case 's':\n                    ctlPtx = cpx;\n                    ctlPty = cpy;\n                    len = path.len();\n                    pathData = path.data;\n                    if (prevCmd === CMD.C) {\n                        ctlPtx += cpx - pathData[len - 4];\n                        ctlPty += cpy - pathData[len - 3];\n                    }\n                    cmd = CMD.C;\n                    x1 = cpx + p[off++];\n                    y1 = cpy + p[off++];\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);\n                    break;\n                case 'Q':\n                    x1 = p[off++];\n                    y1 = p[off++];\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    cmd = CMD.Q;\n                    path.addData(cmd, x1, y1, cpx, cpy);\n                    break;\n                case 'q':\n                    x1 = p[off++] + cpx;\n                    y1 = p[off++] + cpy;\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    cmd = CMD.Q;\n                    path.addData(cmd, x1, y1, cpx, cpy);\n                    break;\n                case 'T':\n                    ctlPtx = cpx;\n                    ctlPty = cpy;\n                    len = path.len();\n                    pathData = path.data;\n                    if (prevCmd === CMD.Q) {\n                        ctlPtx += cpx - pathData[len - 4];\n                        ctlPty += cpy - pathData[len - 3];\n                    }\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    cmd = CMD.Q;\n                    path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);\n                    break;\n                case 't':\n                    ctlPtx = cpx;\n                    ctlPty = cpy;\n                    len = path.len();\n                    pathData = path.data;\n                    if (prevCmd === CMD.Q) {\n                        ctlPtx += cpx - pathData[len - 4];\n                        ctlPty += cpy - pathData[len - 3];\n                    }\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    cmd = CMD.Q;\n                    path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);\n                    break;\n                case 'A':\n                    rx = p[off++];\n                    ry = p[off++];\n                    psi = p[off++];\n                    fa = p[off++];\n                    fs = p[off++];\n                    x1 = cpx, y1 = cpy;\n                    cpx = p[off++];\n                    cpy = p[off++];\n                    cmd = CMD.A;\n                    processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);\n                    break;\n                case 'a':\n                    rx = p[off++];\n                    ry = p[off++];\n                    psi = p[off++];\n                    fa = p[off++];\n                    fs = p[off++];\n                    x1 = cpx, y1 = cpy;\n                    cpx += p[off++];\n                    cpy += p[off++];\n                    cmd = CMD.A;\n                    processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);\n                    break;\n            }\n        }\n        if (cmdStr === 'z' || cmdStr === 'Z') {\n            cmd = CMD.Z;\n            path.addData(cmd);\n            cpx = subpathX;\n            cpy = subpathY;\n        }\n        prevCmd = cmd;\n    }\n    path.toStatic();\n    return path;\n}\nvar SVGPath = (function (_super) {\n    __extends(SVGPath, _super);\n    function SVGPath() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    SVGPath.prototype.applyTransform = function (m) { };\n    return SVGPath;\n}(Path));\nfunction isPathProxy(path) {\n    return path.setData != null;\n}\nfunction createPathOptions(str, opts) {\n    var pathProxy = createPathProxyFromString(str);\n    var innerOpts = extend({}, opts);\n    innerOpts.buildPath = function (path) {\n        var beProxy = isPathProxy(path);\n        if (beProxy && path.canSave()) {\n            path.appendPath(pathProxy);\n            var ctx = path.getContext();\n            if (ctx) {\n                path.rebuildPath(ctx, 1);\n            }\n        }\n        else {\n            var ctx = beProxy ? path.getContext() : path;\n            if (ctx) {\n                pathProxy.rebuildPath(ctx, 1);\n            }\n        }\n    };\n    innerOpts.applyTransform = function (m) {\n        transformPath(pathProxy, m);\n        this.dirtyShape();\n    };\n    return innerOpts;\n}\nexport function createFromString(str, opts) {\n    return new SVGPath(createPathOptions(str, opts));\n}\nexport function extendFromString(str, defaultOpts) {\n    var innerOpts = createPathOptions(str, defaultOpts);\n    var Sub = (function (_super) {\n        __extends(Sub, _super);\n        function Sub(opts) {\n            var _this = _super.call(this, opts) || this;\n            _this.applyTransform = innerOpts.applyTransform;\n            _this.buildPath = innerOpts.buildPath;\n            return _this;\n        }\n        return Sub;\n    }(SVGPath));\n    return Sub;\n}\nexport function mergePath(pathEls, opts) {\n    var pathList = [];\n    var len = pathEls.length;\n    for (var i = 0; i < len; i++) {\n        var pathEl = pathEls[i];\n        pathList.push(pathEl.getUpdatedPathProxy(true));\n    }\n    var pathBundle = new Path(opts);\n    pathBundle.createPathProxy();\n    pathBundle.buildPath = function (path) {\n        if (isPathProxy(path)) {\n            path.appendPath(pathList);\n            var ctx = path.getContext();\n            if (ctx) {\n                path.rebuildPath(ctx, 1);\n            }\n        }\n    };\n    return pathBundle;\n}\nexport function clonePath(sourcePath, opts) {\n    opts = opts || {};\n    var path = new Path();\n    if (sourcePath.shape) {\n        path.setShape(sourcePath.shape);\n    }\n    path.setStyle(sourcePath.style);\n    if (opts.bakeTransform) {\n        transformPath(path.path, sourcePath.getComputedTransform());\n    }\n    else {\n        if (opts.toLocal) {\n            path.setLocalTransform(sourcePath.getComputedTransform());\n        }\n        else {\n            path.copyTransform(sourcePath);\n        }\n    }\n    path.buildPath = sourcePath.buildPath;\n    path.applyTransform = path.applyTransform;\n    path.z = sourcePath.z;\n    path.z2 = sourcePath.z2;\n    path.zlevel = sourcePath.zlevel;\n    return path;\n}\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nvar CircleShape = (function () {\n    function CircleShape() {\n        this.cx = 0;\n        this.cy = 0;\n        this.r = 0;\n    }\n    return CircleShape;\n}());\nexport { CircleShape };\nvar Circle = (function (_super) {\n    __extends(Circle, _super);\n    function Circle(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Circle.prototype.getDefaultShape = function () {\n        return new CircleShape();\n    };\n    Circle.prototype.buildPath = function (ctx, shape) {\n        ctx.moveTo(shape.cx + shape.r, shape.cy);\n        ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2);\n    };\n    return Circle;\n}(Path));\n;\nCircle.prototype.type = 'circle';\nexport default Circle;\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nvar EllipseShape = (function () {\n    function EllipseShape() {\n        this.cx = 0;\n        this.cy = 0;\n        this.rx = 0;\n        this.ry = 0;\n    }\n    return EllipseShape;\n}());\nexport { EllipseShape };\nvar Ellipse = (function (_super) {\n    __extends(Ellipse, _super);\n    function Ellipse(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Ellipse.prototype.getDefaultShape = function () {\n        return new EllipseShape();\n    };\n    Ellipse.prototype.buildPath = function (ctx, shape) {\n        var k = 0.5522848;\n        var x = shape.cx;\n        var y = shape.cy;\n        var a = shape.rx;\n        var b = shape.ry;\n        var ox = a * k;\n        var oy = b * k;\n        ctx.moveTo(x - a, y);\n        ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);\n        ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y);\n        ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b);\n        ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y);\n        ctx.closePath();\n    };\n    return Ellipse;\n}(Path));\nEllipse.prototype.type = 'ellipse';\nexport default Ellipse;\n", "import { isArray } from '../../core/util.js';\nvar PI = Math.PI;\nvar PI2 = PI * 2;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar mathACos = Math.acos;\nvar mathATan2 = Math.atan2;\nvar mathAbs = Math.abs;\nvar mathSqrt = Math.sqrt;\nvar mathMax = Math.max;\nvar mathMin = Math.min;\nvar e = 1e-4;\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var dx10 = x1 - x0;\n    var dy10 = y1 - y0;\n    var dx32 = x3 - x2;\n    var dy32 = y3 - y2;\n    var t = dy32 * dx10 - dx32 * dy10;\n    if (t * t < e) {\n        return;\n    }\n    t = (dx32 * (y0 - y2) - dy32 * (x0 - x2)) / t;\n    return [x0 + t * dx10, y0 + t * dy10];\n}\nfunction computeCornerTangents(x0, y0, x1, y1, radius, cr, clockwise) {\n    var x01 = x0 - x1;\n    var y01 = y0 - y1;\n    var lo = (clockwise ? cr : -cr) / mathSqrt(x01 * x01 + y01 * y01);\n    var ox = lo * y01;\n    var oy = -lo * x01;\n    var x11 = x0 + ox;\n    var y11 = y0 + oy;\n    var x10 = x1 + ox;\n    var y10 = y1 + oy;\n    var x00 = (x11 + x10) / 2;\n    var y00 = (y11 + y10) / 2;\n    var dx = x10 - x11;\n    var dy = y10 - y11;\n    var d2 = dx * dx + dy * dy;\n    var r = radius - cr;\n    var s = x11 * y10 - x10 * y11;\n    var d = (dy < 0 ? -1 : 1) * mathSqrt(mathMax(0, r * r * d2 - s * s));\n    var cx0 = (s * dy - dx * d) / d2;\n    var cy0 = (-s * dx - dy * d) / d2;\n    var cx1 = (s * dy + dx * d) / d2;\n    var cy1 = (-s * dx + dy * d) / d2;\n    var dx0 = cx0 - x00;\n    var dy0 = cy0 - y00;\n    var dx1 = cx1 - x00;\n    var dy1 = cy1 - y00;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) {\n        cx0 = cx1;\n        cy0 = cy1;\n    }\n    return {\n        cx: cx0,\n        cy: cy0,\n        x0: -ox,\n        y0: -oy,\n        x1: cx0 * (radius / r - 1),\n        y1: cy0 * (radius / r - 1)\n    };\n}\nfunction normalizeCornerRadius(cr) {\n    var arr;\n    if (isArray(cr)) {\n        var len = cr.length;\n        if (!len) {\n            return cr;\n        }\n        if (len === 1) {\n            arr = [cr[0], cr[0], 0, 0];\n        }\n        else if (len === 2) {\n            arr = [cr[0], cr[0], cr[1], cr[1]];\n        }\n        else if (len === 3) {\n            arr = cr.concat(cr[2]);\n        }\n        else {\n            arr = cr;\n        }\n    }\n    else {\n        arr = [cr, cr, cr, cr];\n    }\n    return arr;\n}\nexport function buildPath(ctx, shape) {\n    var _a;\n    var radius = mathMax(shape.r, 0);\n    var innerRadius = mathMax(shape.r0 || 0, 0);\n    var hasRadius = radius > 0;\n    var hasInnerRadius = innerRadius > 0;\n    if (!hasRadius && !hasInnerRadius) {\n        return;\n    }\n    if (!hasRadius) {\n        radius = innerRadius;\n        innerRadius = 0;\n    }\n    if (innerRadius > radius) {\n        var tmp = radius;\n        radius = innerRadius;\n        innerRadius = tmp;\n    }\n    var startAngle = shape.startAngle, endAngle = shape.endAngle;\n    if (isNaN(startAngle) || isNaN(endAngle)) {\n        return;\n    }\n    var cx = shape.cx, cy = shape.cy;\n    var clockwise = !!shape.clockwise;\n    var arc = mathAbs(endAngle - startAngle);\n    var mod = arc > PI2 && arc % PI2;\n    mod > e && (arc = mod);\n    if (!(radius > e)) {\n        ctx.moveTo(cx, cy);\n    }\n    else if (arc > PI2 - e) {\n        ctx.moveTo(cx + radius * mathCos(startAngle), cy + radius * mathSin(startAngle));\n        ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise);\n        if (innerRadius > e) {\n            ctx.moveTo(cx + innerRadius * mathCos(endAngle), cy + innerRadius * mathSin(endAngle));\n            ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise);\n        }\n    }\n    else {\n        var icrStart = void 0;\n        var icrEnd = void 0;\n        var ocrStart = void 0;\n        var ocrEnd = void 0;\n        var ocrs = void 0;\n        var ocre = void 0;\n        var icrs = void 0;\n        var icre = void 0;\n        var ocrMax = void 0;\n        var icrMax = void 0;\n        var limitedOcrMax = void 0;\n        var limitedIcrMax = void 0;\n        var xre = void 0;\n        var yre = void 0;\n        var xirs = void 0;\n        var yirs = void 0;\n        var xrs = radius * mathCos(startAngle);\n        var yrs = radius * mathSin(startAngle);\n        var xire = innerRadius * mathCos(endAngle);\n        var yire = innerRadius * mathSin(endAngle);\n        var hasArc = arc > e;\n        if (hasArc) {\n            var cornerRadius = shape.cornerRadius;\n            if (cornerRadius) {\n                _a = normalizeCornerRadius(cornerRadius), icrStart = _a[0], icrEnd = _a[1], ocrStart = _a[2], ocrEnd = _a[3];\n            }\n            var halfRd = mathAbs(radius - innerRadius) / 2;\n            ocrs = mathMin(halfRd, ocrStart);\n            ocre = mathMin(halfRd, ocrEnd);\n            icrs = mathMin(halfRd, icrStart);\n            icre = mathMin(halfRd, icrEnd);\n            limitedOcrMax = ocrMax = mathMax(ocrs, ocre);\n            limitedIcrMax = icrMax = mathMax(icrs, icre);\n            if (ocrMax > e || icrMax > e) {\n                xre = radius * mathCos(endAngle);\n                yre = radius * mathSin(endAngle);\n                xirs = innerRadius * mathCos(startAngle);\n                yirs = innerRadius * mathSin(startAngle);\n                if (arc < PI) {\n                    var it_1 = intersect(xrs, yrs, xirs, yirs, xre, yre, xire, yire);\n                    if (it_1) {\n                        var x0 = xrs - it_1[0];\n                        var y0 = yrs - it_1[1];\n                        var x1 = xre - it_1[0];\n                        var y1 = yre - it_1[1];\n                        var a = 1 / mathSin(mathACos((x0 * x1 + y0 * y1) / (mathSqrt(x0 * x0 + y0 * y0) * mathSqrt(x1 * x1 + y1 * y1))) / 2);\n                        var b = mathSqrt(it_1[0] * it_1[0] + it_1[1] * it_1[1]);\n                        limitedOcrMax = mathMin(ocrMax, (radius - b) / (a + 1));\n                        limitedIcrMax = mathMin(icrMax, (innerRadius - b) / (a - 1));\n                    }\n                }\n            }\n        }\n        if (!hasArc) {\n            ctx.moveTo(cx + xrs, cy + yrs);\n        }\n        else if (limitedOcrMax > e) {\n            var crStart = mathMin(ocrStart, limitedOcrMax);\n            var crEnd = mathMin(ocrEnd, limitedOcrMax);\n            var ct0 = computeCornerTangents(xirs, yirs, xrs, yrs, radius, crStart, clockwise);\n            var ct1 = computeCornerTangents(xre, yre, xire, yire, radius, crEnd, clockwise);\n            ctx.moveTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0);\n            if (limitedOcrMax < ocrMax && crStart === crEnd) {\n                ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedOcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise);\n            }\n            else {\n                crStart > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crStart, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise);\n                ctx.arc(cx, cy, radius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), !clockwise);\n                crEnd > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crEnd, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise);\n            }\n        }\n        else {\n            ctx.moveTo(cx + xrs, cy + yrs);\n            ctx.arc(cx, cy, radius, startAngle, endAngle, !clockwise);\n        }\n        if (!(innerRadius > e) || !hasArc) {\n            ctx.lineTo(cx + xire, cy + yire);\n        }\n        else if (limitedIcrMax > e) {\n            var crStart = mathMin(icrStart, limitedIcrMax);\n            var crEnd = mathMin(icrEnd, limitedIcrMax);\n            var ct0 = computeCornerTangents(xire, yire, xre, yre, innerRadius, -crEnd, clockwise);\n            var ct1 = computeCornerTangents(xrs, yrs, xirs, yirs, innerRadius, -crStart, clockwise);\n            ctx.lineTo(cx + ct0.cx + ct0.x0, cy + ct0.cy + ct0.y0);\n            if (limitedIcrMax < icrMax && crStart === crEnd) {\n                ctx.arc(cx + ct0.cx, cy + ct0.cy, limitedIcrMax, mathATan2(ct0.y0, ct0.x0), mathATan2(ct1.y0, ct1.x0), !clockwise);\n            }\n            else {\n                crEnd > 0 && ctx.arc(cx + ct0.cx, cy + ct0.cy, crEnd, mathATan2(ct0.y0, ct0.x0), mathATan2(ct0.y1, ct0.x1), !clockwise);\n                ctx.arc(cx, cy, innerRadius, mathATan2(ct0.cy + ct0.y1, ct0.cx + ct0.x1), mathATan2(ct1.cy + ct1.y1, ct1.cx + ct1.x1), clockwise);\n                crStart > 0 && ctx.arc(cx + ct1.cx, cy + ct1.cy, crStart, mathATan2(ct1.y1, ct1.x1), mathATan2(ct1.y0, ct1.x0), !clockwise);\n            }\n        }\n        else {\n            ctx.lineTo(cx + xire, cy + yire);\n            ctx.arc(cx, cy, innerRadius, endAngle, startAngle, clockwise);\n        }\n    }\n    ctx.closePath();\n}\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nimport * as roundSectorHelper from '../helper/roundSector.js';\nvar SectorShape = (function () {\n    function SectorShape() {\n        this.cx = 0;\n        this.cy = 0;\n        this.r0 = 0;\n        this.r = 0;\n        this.startAngle = 0;\n        this.endAngle = Math.PI * 2;\n        this.clockwise = true;\n        this.cornerRadius = 0;\n    }\n    return SectorShape;\n}());\nexport { SectorShape };\nvar Sector = (function (_super) {\n    __extends(Sector, _super);\n    function Sector(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Sector.prototype.getDefaultShape = function () {\n        return new SectorShape();\n    };\n    Sector.prototype.buildPath = function (ctx, shape) {\n        roundSectorHelper.buildPath(ctx, shape);\n    };\n    Sector.prototype.isZeroArea = function () {\n        return this.shape.startAngle === this.shape.endAngle\n            || this.shape.r === this.shape.r0;\n    };\n    return Sector;\n}(Path));\nSector.prototype.type = 'sector';\nexport default Sector;\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nvar RingShape = (function () {\n    function RingShape() {\n        this.cx = 0;\n        this.cy = 0;\n        this.r = 0;\n        this.r0 = 0;\n    }\n    return RingShape;\n}());\nexport { RingShape };\nvar Ring = (function (_super) {\n    __extends(Ring, _super);\n    function Ring(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Ring.prototype.getDefaultShape = function () {\n        return new RingShape();\n    };\n    Ring.prototype.buildPath = function (ctx, shape) {\n        var x = shape.cx;\n        var y = shape.cy;\n        var PI2 = Math.PI * 2;\n        ctx.moveTo(x + shape.r, y);\n        ctx.arc(x, y, shape.r, 0, PI2, false);\n        ctx.moveTo(x + shape.r0, y);\n        ctx.arc(x, y, shape.r0, 0, PI2, true);\n    };\n    return Ring;\n}(Path));\nRing.prototype.type = 'ring';\nexport default Ring;\n", "import { min as v2Min, max as v2Max, scale as v2Scale, distance as v2Distance, add as v2Add, clone as v2Clone, sub as v2Sub } from '../../core/vector.js';\nexport default function smoothBezier(points, smooth, isLoop, constraint) {\n    var cps = [];\n    var v = [];\n    var v1 = [];\n    var v2 = [];\n    var prevPoint;\n    var nextPoint;\n    var min;\n    var max;\n    if (constraint) {\n        min = [Infinity, Infinity];\n        max = [-Infinity, -Infinity];\n        for (var i = 0, len = points.length; i < len; i++) {\n            v2Min(min, min, points[i]);\n            v2Max(max, max, points[i]);\n        }\n        v2Min(min, min, constraint[0]);\n        v2Max(max, max, constraint[1]);\n    }\n    for (var i = 0, len = points.length; i < len; i++) {\n        var point = points[i];\n        if (isLoop) {\n            prevPoint = points[i ? i - 1 : len - 1];\n            nextPoint = points[(i + 1) % len];\n        }\n        else {\n            if (i === 0 || i === len - 1) {\n                cps.push(v2Clone(points[i]));\n                continue;\n            }\n            else {\n                prevPoint = points[i - 1];\n                nextPoint = points[i + 1];\n            }\n        }\n        v2Sub(v, nextPoint, prevPoint);\n        v2Scale(v, v, smooth);\n        var d0 = v2Distance(point, prevPoint);\n        var d1 = v2Distance(point, nextPoint);\n        var sum = d0 + d1;\n        if (sum !== 0) {\n            d0 /= sum;\n            d1 /= sum;\n        }\n        v2Scale(v1, v, -d0);\n        v2Scale(v2, v, d1);\n        var cp0 = v2Add([], point, v1);\n        var cp1 = v2Add([], point, v2);\n        if (constraint) {\n            v2Max(cp0, cp0, min);\n            v2Min(cp0, cp0, max);\n            v2Max(cp1, cp1, min);\n            v2Min(cp1, cp1, max);\n        }\n        cps.push(cp0);\n        cps.push(cp1);\n    }\n    if (isLoop) {\n        cps.push(cps.shift());\n    }\n    return cps;\n}\n", "import smoothBezier from './smoothBezier.js';\nexport function buildPath(ctx, shape, closePath) {\n    var smooth = shape.smooth;\n    var points = shape.points;\n    if (points && points.length >= 2) {\n        if (smooth) {\n            var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint);\n            ctx.moveTo(points[0][0], points[0][1]);\n            var len = points.length;\n            for (var i = 0; i < (closePath ? len : len - 1); i++) {\n                var cp1 = controlPoints[i * 2];\n                var cp2 = controlPoints[i * 2 + 1];\n                var p = points[(i + 1) % len];\n                ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]);\n            }\n        }\n        else {\n            ctx.moveTo(points[0][0], points[0][1]);\n            for (var i = 1, l = points.length; i < l; i++) {\n                ctx.lineTo(points[i][0], points[i][1]);\n            }\n        }\n        closePath && ctx.closePath();\n    }\n}\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nimport * as polyHelper from '../helper/poly.js';\nvar PolygonShape = (function () {\n    function PolygonShape() {\n        this.points = null;\n        this.smooth = 0;\n        this.smoothConstraint = null;\n    }\n    return PolygonShape;\n}());\nexport { PolygonShape };\nvar Polygon = (function (_super) {\n    __extends(Polygon, _super);\n    function Polygon(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Polygon.prototype.getDefaultShape = function () {\n        return new PolygonShape();\n    };\n    Polygon.prototype.buildPath = function (ctx, shape) {\n        polyHelper.buildPath(ctx, shape, true);\n    };\n    return Polygon;\n}(Path));\n;\nPolygon.prototype.type = 'polygon';\nexport default Polygon;\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nimport * as polyHelper from '../helper/poly.js';\nvar PolylineShape = (function () {\n    function PolylineShape() {\n        this.points = null;\n        this.percent = 1;\n        this.smooth = 0;\n        this.smoothConstraint = null;\n    }\n    return PolylineShape;\n}());\nexport { PolylineShape };\nvar Polyline = (function (_super) {\n    __extends(Polyline, _super);\n    function Polyline(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Polyline.prototype.getDefaultStyle = function () {\n        return {\n            stroke: '#000',\n            fill: null\n        };\n    };\n    Polyline.prototype.getDefaultShape = function () {\n        return new PolylineShape();\n    };\n    Polyline.prototype.buildPath = function (ctx, shape) {\n        polyHelper.buildPath(ctx, shape, false);\n    };\n    return Polyline;\n}(Path));\nPolyline.prototype.type = 'polyline';\nexport default Polyline;\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nimport { subPixelOptimizeLine } from '../helper/subPixelOptimize.js';\nvar subPixelOptimizeOutputShape = {};\nvar LineShape = (function () {\n    function LineShape() {\n        this.x1 = 0;\n        this.y1 = 0;\n        this.x2 = 0;\n        this.y2 = 0;\n        this.percent = 1;\n    }\n    return LineShape;\n}());\nexport { LineShape };\nvar Line = (function (_super) {\n    __extends(Line, _super);\n    function Line(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Line.prototype.getDefaultStyle = function () {\n        return {\n            stroke: '#000',\n            fill: null\n        };\n    };\n    Line.prototype.getDefaultShape = function () {\n        return new LineShape();\n    };\n    Line.prototype.buildPath = function (ctx, shape) {\n        var x1;\n        var y1;\n        var x2;\n        var y2;\n        if (this.subPixelOptimize) {\n            var optimizedShape = subPixelOptimizeLine(subPixelOptimizeOutputShape, shape, this.style);\n            x1 = optimizedShape.x1;\n            y1 = optimizedShape.y1;\n            x2 = optimizedShape.x2;\n            y2 = optimizedShape.y2;\n        }\n        else {\n            x1 = shape.x1;\n            y1 = shape.y1;\n            x2 = shape.x2;\n            y2 = shape.y2;\n        }\n        var percent = shape.percent;\n        if (percent === 0) {\n            return;\n        }\n        ctx.moveTo(x1, y1);\n        if (percent < 1) {\n            x2 = x1 * (1 - percent) + x2 * percent;\n            y2 = y1 * (1 - percent) + y2 * percent;\n        }\n        ctx.lineTo(x2, y2);\n    };\n    Line.prototype.pointAt = function (p) {\n        var shape = this.shape;\n        return [\n            shape.x1 * (1 - p) + shape.x2 * p,\n            shape.y1 * (1 - p) + shape.y2 * p\n        ];\n    };\n    return Line;\n}(Path));\nLine.prototype.type = 'line';\nexport default Line;\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nimport * as vec2 from '../../core/vector.js';\nimport { quadraticSubdivide, cubicSubdivide, quadraticAt, cubicAt, quadraticDerivativeAt, cubicDerivativeAt } from '../../core/curve.js';\nvar out = [];\nvar BezierCurveShape = (function () {\n    function BezierCurveShape() {\n        this.x1 = 0;\n        this.y1 = 0;\n        this.x2 = 0;\n        this.y2 = 0;\n        this.cpx1 = 0;\n        this.cpy1 = 0;\n        this.percent = 1;\n    }\n    return BezierCurveShape;\n}());\nexport { BezierCurveShape };\nfunction someVectorAt(shape, t, isTangent) {\n    var cpx2 = shape.cpx2;\n    var cpy2 = shape.cpy2;\n    if (cpx2 != null || cpy2 != null) {\n        return [\n            (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t),\n            (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t)\n        ];\n    }\n    else {\n        return [\n            (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t),\n            (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t)\n        ];\n    }\n}\nvar BezierCurve = (function (_super) {\n    __extends(BezierCurve, _super);\n    function BezierCurve(opts) {\n        return _super.call(this, opts) || this;\n    }\n    BezierCurve.prototype.getDefaultStyle = function () {\n        return {\n            stroke: '#000',\n            fill: null\n        };\n    };\n    BezierCurve.prototype.getDefaultShape = function () {\n        return new BezierCurveShape();\n    };\n    BezierCurve.prototype.buildPath = function (ctx, shape) {\n        var x1 = shape.x1;\n        var y1 = shape.y1;\n        var x2 = shape.x2;\n        var y2 = shape.y2;\n        var cpx1 = shape.cpx1;\n        var cpy1 = shape.cpy1;\n        var cpx2 = shape.cpx2;\n        var cpy2 = shape.cpy2;\n        var percent = shape.percent;\n        if (percent === 0) {\n            return;\n        }\n        ctx.moveTo(x1, y1);\n        if (cpx2 == null || cpy2 == null) {\n            if (percent < 1) {\n                quadraticSubdivide(x1, cpx1, x2, percent, out);\n                cpx1 = out[1];\n                x2 = out[2];\n                quadraticSubdivide(y1, cpy1, y2, percent, out);\n                cpy1 = out[1];\n                y2 = out[2];\n            }\n            ctx.quadraticCurveTo(cpx1, cpy1, x2, y2);\n        }\n        else {\n            if (percent < 1) {\n                cubicSubdivide(x1, cpx1, cpx2, x2, percent, out);\n                cpx1 = out[1];\n                cpx2 = out[2];\n                x2 = out[3];\n                cubicSubdivide(y1, cpy1, cpy2, y2, percent, out);\n                cpy1 = out[1];\n                cpy2 = out[2];\n                y2 = out[3];\n            }\n            ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n        }\n    };\n    BezierCurve.prototype.pointAt = function (t) {\n        return someVectorAt(this.shape, t, false);\n    };\n    BezierCurve.prototype.tangentAt = function (t) {\n        var p = someVectorAt(this.shape, t, true);\n        return vec2.normalize(p, p);\n    };\n    return BezierCurve;\n}(Path));\n;\nBezierCurve.prototype.type = 'bezier-curve';\nexport default BezierCurve;\n", "import { __extends } from \"tslib\";\nimport Path from '../Path.js';\nvar ArcShape = (function () {\n    function ArcShape() {\n        this.cx = 0;\n        this.cy = 0;\n        this.r = 0;\n        this.startAngle = 0;\n        this.endAngle = Math.PI * 2;\n        this.clockwise = true;\n    }\n    return ArcShape;\n}());\nexport { ArcShape };\nvar Arc = (function (_super) {\n    __extends(Arc, _super);\n    function Arc(opts) {\n        return _super.call(this, opts) || this;\n    }\n    Arc.prototype.getDefaultStyle = function () {\n        return {\n            stroke: '#000',\n            fill: null\n        };\n    };\n    Arc.prototype.getDefaultShape = function () {\n        return new ArcShape();\n    };\n    Arc.prototype.buildPath = function (ctx, shape) {\n        var x = shape.cx;\n        var y = shape.cy;\n        var r = Math.max(shape.r, 0);\n        var startAngle = shape.startAngle;\n        var endAngle = shape.endAngle;\n        var clockwise = shape.clockwise;\n        var unitX = Math.cos(startAngle);\n        var unitY = Math.sin(startAngle);\n        ctx.moveTo(unitX * r + x, unitY * r + y);\n        ctx.arc(x, y, r, startAngle, endAngle, !clockwise);\n    };\n    return Arc;\n}(Path));\nArc.prototype.type = 'arc';\nexport default Arc;\n", "import { __extends } from \"tslib\";\nimport Path from './Path.js';\nvar CompoundPath = (function (_super) {\n    __extends(CompoundPath, _super);\n    function CompoundPath() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = 'compound';\n        return _this;\n    }\n    CompoundPath.prototype._updatePathDirty = function () {\n        var paths = this.shape.paths;\n        var dirtyPath = this.shapeChanged();\n        for (var i = 0; i < paths.length; i++) {\n            dirtyPath = dirtyPath || paths[i].shapeChanged();\n        }\n        if (dirtyPath) {\n            this.dirtyShape();\n        }\n    };\n    CompoundPath.prototype.beforeBrush = function () {\n        this._updatePathDirty();\n        var paths = this.shape.paths || [];\n        var scale = this.getGlobalScale();\n        for (var i = 0; i < paths.length; i++) {\n            if (!paths[i].path) {\n                paths[i].createPathProxy();\n            }\n            paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold);\n        }\n    };\n    CompoundPath.prototype.buildPath = function (ctx, shape) {\n        var paths = shape.paths || [];\n        for (var i = 0; i < paths.length; i++) {\n            paths[i].buildPath(ctx, paths[i].shape, true);\n        }\n    };\n    CompoundPath.prototype.afterBrush = function () {\n        var paths = this.shape.paths || [];\n        for (var i = 0; i < paths.length; i++) {\n            paths[i].pathUpdated();\n        }\n    };\n    CompoundPath.prototype.getBoundingRect = function () {\n        this._updatePathDirty.call(this);\n        return Path.prototype.getBoundingRect.call(this);\n    };\n    return CompoundPath;\n}(Path));\nexport default CompoundPath;\n", "var Gradient = (function () {\n    function Gradient(colorStops) {\n        this.colorStops = colorStops || [];\n    }\n    Gradient.prototype.addColorStop = function (offset, color) {\n        this.colorStops.push({\n            offset: offset,\n            color: color\n        });\n    };\n    return Gradient;\n}());\nexport default Gradient;\n", "import { __extends } from \"tslib\";\nimport Gradient from './Gradient.js';\nvar LinearGradient = (function (_super) {\n    __extends(LinearGradient, _super);\n    function LinearGradient(x, y, x2, y2, colorStops, globalCoord) {\n        var _this = _super.call(this, colorStops) || this;\n        _this.x = x == null ? 0 : x;\n        _this.y = y == null ? 0 : y;\n        _this.x2 = x2 == null ? 1 : x2;\n        _this.y2 = y2 == null ? 0 : y2;\n        _this.type = 'linear';\n        _this.global = globalCoord || false;\n        return _this;\n    }\n    return LinearGradient;\n}(Gradient));\nexport default LinearGradient;\n;\n", "import { __extends } from \"tslib\";\nimport Gradient from './Gradient.js';\nvar RadialGradient = (function (_super) {\n    __extends(RadialGradient, _super);\n    function RadialGradient(x, y, r, colorStops, globalCoord) {\n        var _this = _super.call(this, colorStops) || this;\n        _this.x = x == null ? 0.5 : x;\n        _this.y = y == null ? 0.5 : y;\n        _this.r = r == null ? 0.5 : r;\n        _this.type = 'radial';\n        _this.global = globalCoord || false;\n        return _this;\n    }\n    return RadialGradient;\n}(Gradient));\nexport default RadialGradient;\n", "import Point from './Point.js';\nimport { createIntersectContext } from './BoundingRect.js';\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathAbs = Math.abs;\nvar _extent = [0, 0];\nvar _extent2 = [0, 0];\nvar _intersectCtx = createIntersectContext();\nvar _minTv = _intersectCtx.minTv;\nvar _maxTv = _intersectCtx.maxTv;\nvar OrientedBoundingRect = (function () {\n    function OrientedBoundingRect(rect, transform) {\n        this._corners = [];\n        this._axes = [];\n        this._origin = [0, 0];\n        for (var i = 0; i < 4; i++) {\n            this._corners[i] = new Point();\n        }\n        for (var i = 0; i < 2; i++) {\n            this._axes[i] = new Point();\n        }\n        if (rect) {\n            this.fromBoundingRect(rect, transform);\n        }\n    }\n    OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) {\n        var corners = this._corners;\n        var axes = this._axes;\n        var x = rect.x;\n        var y = rect.y;\n        var x2 = x + rect.width;\n        var y2 = y + rect.height;\n        corners[0].set(x, y);\n        corners[1].set(x2, y);\n        corners[2].set(x2, y2);\n        corners[3].set(x, y2);\n        if (transform) {\n            for (var i = 0; i < 4; i++) {\n                corners[i].transform(transform);\n            }\n        }\n        Point.sub(axes[0], corners[1], corners[0]);\n        Point.sub(axes[1], corners[3], corners[0]);\n        axes[0].normalize();\n        axes[1].normalize();\n        for (var i = 0; i < 2; i++) {\n            this._origin[i] = axes[i].dot(corners[0]);\n        }\n    };\n    OrientedBoundingRect.prototype.intersect = function (other, mtv, opt) {\n        var overlapped = true;\n        var noMtv = !mtv;\n        if (mtv) {\n            Point.set(mtv, 0, 0);\n        }\n        _intersectCtx.reset(opt, !noMtv);\n        if (!this._intersectCheckOneSide(this, other, noMtv, 1)) {\n            overlapped = false;\n            if (noMtv) {\n                return overlapped;\n            }\n        }\n        if (!this._intersectCheckOneSide(other, this, noMtv, -1)) {\n            overlapped = false;\n            if (noMtv) {\n                return overlapped;\n            }\n        }\n        if (!noMtv && !_intersectCtx.negativeSize) {\n            Point.copy(mtv, overlapped\n                ? (_intersectCtx.useDir ? _intersectCtx.dirMinTv : _minTv)\n                : _maxTv);\n        }\n        return overlapped;\n    };\n    OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, noMtv, inverse) {\n        var overlapped = true;\n        for (var i = 0; i < 2; i++) {\n            var axis = self._axes[i];\n            self._getProjMinMaxOnAxis(i, self._corners, _extent);\n            self._getProjMinMaxOnAxis(i, other._corners, _extent2);\n            if (_intersectCtx.negativeSize || _extent[1] < _extent2[0] || _extent[0] > _extent2[1]) {\n                overlapped = false;\n                if (_intersectCtx.negativeSize || noMtv) {\n                    return overlapped;\n                }\n                var dist0 = mathAbs(_extent2[0] - _extent[1]);\n                var dist1 = mathAbs(_extent[0] - _extent2[1]);\n                if (mathMin(dist0, dist1) > _maxTv.len()) {\n                    if (dist0 < dist1) {\n                        Point.scale(_maxTv, axis, -dist0 * inverse);\n                    }\n                    else {\n                        Point.scale(_maxTv, axis, dist1 * inverse);\n                    }\n                }\n            }\n            else if (!noMtv) {\n                var dist0 = mathAbs(_extent2[0] - _extent[1]);\n                var dist1 = mathAbs(_extent[0] - _extent2[1]);\n                if (_intersectCtx.useDir || mathMin(dist0, dist1) < _minTv.len()) {\n                    if (dist0 < dist1 || !_intersectCtx.bidirectional) {\n                        Point.scale(_minTv, axis, dist0 * inverse);\n                        if (_intersectCtx.useDir) {\n                            _intersectCtx.calcDirMTV();\n                        }\n                    }\n                    if (dist0 >= dist1 || !_intersectCtx.bidirectional) {\n                        Point.scale(_minTv, axis, -dist1 * inverse);\n                        if (_intersectCtx.useDir) {\n                            _intersectCtx.calcDirMTV();\n                        }\n                    }\n                }\n            }\n        }\n        return overlapped;\n    };\n    OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) {\n        var axis = this._axes[dim];\n        var origin = this._origin;\n        var proj = corners[0].dot(axis) + origin[dim];\n        var min = proj;\n        var max = proj;\n        for (var i = 1; i < corners.length; i++) {\n            var proj_1 = corners[i].dot(axis) + origin[dim];\n            min = mathMin(proj_1, min);\n            max = mathMax(proj_1, max);\n        }\n        out[0] = min + _intersectCtx.touchThreshold;\n        out[1] = max - _intersectCtx.touchThreshold;\n        _intersectCtx.negativeSize = out[1] < out[0];\n    };\n    return OrientedBoundingRect;\n}());\nexport default OrientedBoundingRect;\n", "import { __extends } from \"tslib\";\nimport Displayble from './Displayable.js';\nimport BoundingRect from '../core/BoundingRect.js';\nvar m = [];\nvar IncrementalDisplayable = (function (_super) {\n    __extends(IncrementalDisplayable, _super);\n    function IncrementalDisplayable() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.notClear = true;\n        _this.incremental = true;\n        _this._displayables = [];\n        _this._temporaryDisplayables = [];\n        _this._cursor = 0;\n        return _this;\n    }\n    IncrementalDisplayable.prototype.traverse = function (cb, context) {\n        cb.call(context, this);\n    };\n    IncrementalDisplayable.prototype.useStyle = function () {\n        this.style = {};\n    };\n    IncrementalDisplayable.prototype.getCursor = function () {\n        return this._cursor;\n    };\n    IncrementalDisplayable.prototype.innerAfterBrush = function () {\n        this._cursor = this._displayables.length;\n    };\n    IncrementalDisplayable.prototype.clearDisplaybles = function () {\n        this._displayables = [];\n        this._temporaryDisplayables = [];\n        this._cursor = 0;\n        this.markRedraw();\n        this.notClear = false;\n    };\n    IncrementalDisplayable.prototype.clearTemporalDisplayables = function () {\n        this._temporaryDisplayables = [];\n    };\n    IncrementalDisplayable.prototype.addDisplayable = function (displayable, notPersistent) {\n        if (notPersistent) {\n            this._temporaryDisplayables.push(displayable);\n        }\n        else {\n            this._displayables.push(displayable);\n        }\n        this.markRedraw();\n    };\n    IncrementalDisplayable.prototype.addDisplayables = function (displayables, notPersistent) {\n        notPersistent = notPersistent || false;\n        for (var i = 0; i < displayables.length; i++) {\n            this.addDisplayable(displayables[i], notPersistent);\n        }\n    };\n    IncrementalDisplayable.prototype.getDisplayables = function () {\n        return this._displayables;\n    };\n    IncrementalDisplayable.prototype.getTemporalDisplayables = function () {\n        return this._temporaryDisplayables;\n    };\n    IncrementalDisplayable.prototype.eachPendingDisplayable = function (cb) {\n        for (var i = this._cursor; i < this._displayables.length; i++) {\n            cb && cb(this._displayables[i]);\n        }\n        for (var i = 0; i < this._temporaryDisplayables.length; i++) {\n            cb && cb(this._temporaryDisplayables[i]);\n        }\n    };\n    IncrementalDisplayable.prototype.update = function () {\n        this.updateTransform();\n        for (var i = this._cursor; i < this._displayables.length; i++) {\n            var displayable = this._displayables[i];\n            displayable.parent = this;\n            displayable.update();\n            displayable.parent = null;\n        }\n        for (var i = 0; i < this._temporaryDisplayables.length; i++) {\n            var displayable = this._temporaryDisplayables[i];\n            displayable.parent = this;\n            displayable.update();\n            displayable.parent = null;\n        }\n    };\n    IncrementalDisplayable.prototype.getBoundingRect = function () {\n        if (!this._rect) {\n            var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity);\n            for (var i = 0; i < this._displayables.length; i++) {\n                var displayable = this._displayables[i];\n                var childRect = displayable.getBoundingRect().clone();\n                if (displayable.needLocalTransform()) {\n                    childRect.applyTransform(displayable.getLocalTransform(m));\n                }\n                rect.union(childRect);\n            }\n            this._rect = rect;\n        }\n        return this._rect;\n    };\n    IncrementalDisplayable.prototype.contain = function (x, y) {\n        var localPos = this.transformCoordToLocal(x, y);\n        var rect = this.getBoundingRect();\n        if (rect.contain(localPos[0], localPos[1])) {\n            for (var i = 0; i < this._displayables.length; i++) {\n                var displayable = this._displayables[i];\n                if (displayable.contain(x, y)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\n    return IncrementalDisplayable;\n}(Displayble));\nexport default IncrementalDisplayable;\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isFunction, isObject, retrieve2 } from 'zrender/lib/core/util.js';\nimport { makeInner } from '../util/model.js';\n// Stored properties for further transition.\nexport var transitionStore = makeInner();\n/**\n * Return null if animation is disabled.\n */\nexport function getAnimationConfig(animationType, animatableModel, dataIndex,\n// Extra opts can override the option in animatable model.\nextraOpts,\n// TODO It's only for pictorial bar now.\nextraDelayParams) {\n  var animationPayload;\n  // Check if there is global animation configuration from dataZoom/resize can override the config in option.\n  // If animation is enabled. Will use this animation config in payload.\n  // If animation is disabled. Just ignore it.\n  if (animatableModel && animatableModel.ecModel) {\n    var updatePayload = animatableModel.ecModel.getUpdatePayload();\n    animationPayload = updatePayload && updatePayload.animation;\n  }\n  var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();\n  var isUpdate = animationType === 'update';\n  if (animationEnabled) {\n    var duration = void 0;\n    var easing = void 0;\n    var delay = void 0;\n    if (extraOpts) {\n      duration = retrieve2(extraOpts.duration, 200);\n      easing = retrieve2(extraOpts.easing, 'cubicOut');\n      delay = 0;\n    } else {\n      duration = animatableModel.getShallow(isUpdate ? 'animationDurationUpdate' : 'animationDuration');\n      easing = animatableModel.getShallow(isUpdate ? 'animationEasingUpdate' : 'animationEasing');\n      delay = animatableModel.getShallow(isUpdate ? 'animationDelayUpdate' : 'animationDelay');\n    }\n    // animation from payload has highest priority.\n    if (animationPayload) {\n      animationPayload.duration != null && (duration = animationPayload.duration);\n      animationPayload.easing != null && (easing = animationPayload.easing);\n      animationPayload.delay != null && (delay = animationPayload.delay);\n    }\n    if (isFunction(delay)) {\n      delay = delay(dataIndex, extraDelayParams);\n    }\n    if (isFunction(duration)) {\n      duration = duration(dataIndex);\n    }\n    var config = {\n      duration: duration || 0,\n      delay: delay,\n      easing: easing\n    };\n    return config;\n  } else {\n    return null;\n  }\n}\nfunction animateOrSetProps(animationType, el, props, animatableModel, dataIndex, cb, during) {\n  var isFrom = false;\n  var removeOpt;\n  if (isFunction(dataIndex)) {\n    during = cb;\n    cb = dataIndex;\n    dataIndex = null;\n  } else if (isObject(dataIndex)) {\n    cb = dataIndex.cb;\n    during = dataIndex.during;\n    isFrom = dataIndex.isFrom;\n    removeOpt = dataIndex.removeOpt;\n    dataIndex = dataIndex.dataIndex;\n  }\n  var isRemove = animationType === 'leave';\n  if (!isRemove) {\n    // Must stop the remove animation.\n    el.stopAnimation('leave');\n  }\n  var animationConfig = getAnimationConfig(animationType, animatableModel, dataIndex, isRemove ? removeOpt || {} : null, animatableModel && animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null);\n  if (animationConfig && animationConfig.duration > 0) {\n    var duration = animationConfig.duration;\n    var animationDelay = animationConfig.delay;\n    var animationEasing = animationConfig.easing;\n    var animateConfig = {\n      duration: duration,\n      delay: animationDelay || 0,\n      easing: animationEasing,\n      done: cb,\n      force: !!cb || !!during,\n      // Set to final state in update/init animation.\n      // So the post processing based on the path shape can be done correctly.\n      setToFinal: !isRemove,\n      scope: animationType,\n      during: during\n    };\n    isFrom ? el.animateFrom(props, animateConfig) : el.animateTo(props, animateConfig);\n  } else {\n    el.stopAnimation();\n    // If `isFrom`, the props is the \"from\" props.\n    !isFrom && el.attr(props);\n    // Call during at least once.\n    during && during(1);\n    cb && cb();\n  }\n}\n/**\n * Update graphic element properties with or without animation according to the\n * configuration in series.\n *\n * Caution: this method will stop previous animation.\n * So do not use this method to one element twice before\n * animation starts, unless you know what you are doing.\n * @example\n *     graphic.updateProps(el, {\n *         position: [100, 100]\n *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });\n *     // Or\n *     graphic.updateProps(el, {\n *         position: [100, 100]\n *     }, seriesModel, function () { console.log('Animation done!'); });\n */\nfunction updateProps(el, props,\n// TODO: TYPE AnimatableModel\nanimatableModel, dataIndex, cb, during) {\n  animateOrSetProps('update', el, props, animatableModel, dataIndex, cb, during);\n}\nexport { updateProps };\n/**\n * Init graphic element properties with or without animation according to the\n * configuration in series.\n *\n * Caution: this method will stop previous animation.\n * So do not use this method to one element twice before\n * animation starts, unless you know what you are doing.\n */\nexport function initProps(el, props, animatableModel, dataIndex, cb, during) {\n  animateOrSetProps('enter', el, props, animatableModel, dataIndex, cb, during);\n}\n/**\n * If element is removed.\n * It can determine if element is having remove animation.\n */\nexport function isElementRemoved(el) {\n  if (!el.__zr) {\n    return true;\n  }\n  for (var i = 0; i < el.animators.length; i++) {\n    var animator = el.animators[i];\n    if (animator.scope === 'leave') {\n      return true;\n    }\n  }\n  return false;\n}\n/**\n * Remove graphic element\n */\nexport function removeElement(el, props, animatableModel, dataIndex, cb, during) {\n  // Don't do remove animation twice.\n  if (isElementRemoved(el)) {\n    return;\n  }\n  animateOrSetProps('leave', el, props, animatableModel, dataIndex, cb, during);\n}\nfunction fadeOutDisplayable(el, animatableModel, dataIndex, done) {\n  el.removeTextContent();\n  el.removeTextGuideLine();\n  removeElement(el, {\n    style: {\n      opacity: 0\n    }\n  }, animatableModel, dataIndex, done);\n}\nexport function removeElementWithFadeOut(el, animatableModel, dataIndex) {\n  function doRemove() {\n    el.parent && el.parent.remove(el);\n  }\n  // Hide label and labelLine first\n  // TODO Also use fade out animation?\n  if (!el.isGroup) {\n    fadeOutDisplayable(el, animatableModel, dataIndex, doRemove);\n  } else {\n    el.traverse(function (disp) {\n      if (!disp.isGroup) {\n        // Can invoke doRemove multiple times.\n        fadeOutDisplayable(disp, animatableModel, dataIndex, doRemove);\n      }\n    });\n  }\n}\n/**\n * Save old style for style transition in universalTransition module.\n * It's used when element will be reused in each render.\n * For chart like map, heatmap, which will always create new element.\n * We don't need to save this because universalTransition can get old style from the old element\n */\nexport function saveOldStyle(el) {\n  transitionStore(el).oldStyle = el.style;\n}\nexport function getOldStyle(el) {\n  return transitionStore(el).oldStyle;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport ZRText from 'zrender/lib/graphic/Text.js';\nimport { isFunction, retrieve2, extend, keys, trim, retrieve3, isNumber, normalizeCssArray } from 'zrender/lib/core/util.js';\nimport { SPECIAL_STATES, DISPLAY_STATES } from '../util/states.js';\nimport { deprecateReplaceLog } from '../util/log.js';\nimport { makeInner, interpolateRawValues } from '../util/model.js';\nimport { initProps, updateProps } from '../util/graphic.js';\nvar EMPTY_OBJ = {};\nexport function setLabelText(label, labelTexts) {\n  for (var i = 0; i < SPECIAL_STATES.length; i++) {\n    var stateName = SPECIAL_STATES[i];\n    var text = labelTexts[stateName];\n    var state = label.ensureState(stateName);\n    state.style = state.style || {};\n    state.style.text = text;\n  }\n  var oldStates = label.currentStates.slice();\n  label.clearStates(true);\n  label.setStyle({\n    text: labelTexts.normal\n  });\n  label.useStates(oldStates, true);\n}\nfunction getLabelText(opt, stateModels, interpolatedValue) {\n  var labelFetcher = opt.labelFetcher;\n  var labelDataIndex = opt.labelDataIndex;\n  var labelDimIndex = opt.labelDimIndex;\n  var normalModel = stateModels.normal;\n  var baseText;\n  if (labelFetcher) {\n    baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex, normalModel && normalModel.get('formatter'), interpolatedValue != null ? {\n      interpolatedValue: interpolatedValue\n    } : null);\n  }\n  if (baseText == null) {\n    baseText = isFunction(opt.defaultText) ? opt.defaultText(labelDataIndex, opt, interpolatedValue) : opt.defaultText;\n  }\n  var statesText = {\n    normal: baseText\n  };\n  for (var i = 0; i < SPECIAL_STATES.length; i++) {\n    var stateName = SPECIAL_STATES[i];\n    var stateModel = stateModels[stateName];\n    statesText[stateName] = retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, stateName, null, labelDimIndex, stateModel && stateModel.get('formatter')) : null, baseText);\n  }\n  return statesText;\n}\nfunction setLabelStyle(targetEl, labelStatesModels, opt, stateSpecified\n// TODO specified position?\n) {\n  opt = opt || EMPTY_OBJ;\n  var isSetOnText = targetEl instanceof ZRText;\n  var needsCreateText = false;\n  for (var i = 0; i < DISPLAY_STATES.length; i++) {\n    var stateModel = labelStatesModels[DISPLAY_STATES[i]];\n    if (stateModel && stateModel.getShallow('show')) {\n      needsCreateText = true;\n      break;\n    }\n  }\n  var textContent = isSetOnText ? targetEl : targetEl.getTextContent();\n  if (needsCreateText) {\n    if (!isSetOnText) {\n      // Reuse the previous\n      if (!textContent) {\n        textContent = new ZRText();\n        targetEl.setTextContent(textContent);\n      }\n      // Use same state proxy\n      if (targetEl.stateProxy) {\n        textContent.stateProxy = targetEl.stateProxy;\n      }\n    }\n    var labelStatesTexts = getLabelText(opt, labelStatesModels);\n    var normalModel = labelStatesModels.normal;\n    var showNormal = !!normalModel.getShallow('show');\n    var normalStyle = createTextStyle(normalModel, stateSpecified && stateSpecified.normal, opt, false, !isSetOnText);\n    normalStyle.text = labelStatesTexts.normal;\n    if (!isSetOnText) {\n      // Always create new\n      targetEl.setTextConfig(createTextConfig(normalModel, opt, false));\n    }\n    for (var i = 0; i < SPECIAL_STATES.length; i++) {\n      var stateName = SPECIAL_STATES[i];\n      var stateModel = labelStatesModels[stateName];\n      if (stateModel) {\n        var stateObj = textContent.ensureState(stateName);\n        var stateShow = !!retrieve2(stateModel.getShallow('show'), showNormal);\n        if (stateShow !== showNormal) {\n          stateObj.ignore = !stateShow;\n        }\n        stateObj.style = createTextStyle(stateModel, stateSpecified && stateSpecified[stateName], opt, true, !isSetOnText);\n        stateObj.style.text = labelStatesTexts[stateName];\n        if (!isSetOnText) {\n          var targetElEmphasisState = targetEl.ensureState(stateName);\n          targetElEmphasisState.textConfig = createTextConfig(stateModel, opt, true);\n        }\n      }\n    }\n    // PENDING: if there is many requirements that emphasis position\n    // need to be different from normal position, we might consider\n    // auto silent is those cases.\n    textContent.silent = !!normalModel.getShallow('silent');\n    // Keep x and y\n    if (textContent.style.x != null) {\n      normalStyle.x = textContent.style.x;\n    }\n    if (textContent.style.y != null) {\n      normalStyle.y = textContent.style.y;\n    }\n    textContent.ignore = !showNormal;\n    // Always create new style.\n    textContent.useStyle(normalStyle);\n    textContent.dirty();\n    if (opt.enableTextSetter) {\n      labelInner(textContent).setLabelText = function (interpolatedValue) {\n        var labelStatesTexts = getLabelText(opt, labelStatesModels, interpolatedValue);\n        setLabelText(textContent, labelStatesTexts);\n      };\n    }\n  } else if (textContent) {\n    // Not display rich text.\n    textContent.ignore = true;\n  }\n  targetEl.dirty();\n}\nexport { setLabelStyle };\nexport function getLabelStatesModels(itemModel, labelName) {\n  labelName = labelName || 'label';\n  var statesModels = {\n    normal: itemModel.getModel(labelName)\n  };\n  for (var i = 0; i < SPECIAL_STATES.length; i++) {\n    var stateName = SPECIAL_STATES[i];\n    statesModels[stateName] = itemModel.getModel([stateName, labelName]);\n  }\n  return statesModels;\n}\n/**\n * Set basic textStyle properties.\n */\nexport function createTextStyle(textStyleModel, specifiedTextStyle,\n// Fixed style in the code. Can't be set by model.\nopt, isNotNormal, isAttached // If text is attached on an element. If so, auto color will handling in zrender.\n) {\n  var textStyle = {};\n  setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached);\n  specifiedTextStyle && extend(textStyle, specifiedTextStyle);\n  // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);\n  return textStyle;\n}\nexport function createTextConfig(textStyleModel, opt, isNotNormal) {\n  opt = opt || {};\n  var textConfig = {};\n  var labelPosition;\n  var labelRotate = textStyleModel.getShallow('rotate');\n  var labelDistance = retrieve2(textStyleModel.getShallow('distance'), isNotNormal ? null : 5);\n  var labelOffset = textStyleModel.getShallow('offset');\n  labelPosition = textStyleModel.getShallow('position') || (isNotNormal ? null : 'inside');\n  // 'outside' is not a valid zr textPostion value, but used\n  // in bar series, and magic type should be considered.\n  labelPosition === 'outside' && (labelPosition = opt.defaultOutsidePosition || 'top');\n  if (labelPosition != null) {\n    textConfig.position = labelPosition;\n  }\n  if (labelOffset != null) {\n    textConfig.offset = labelOffset;\n  }\n  if (labelRotate != null) {\n    labelRotate *= Math.PI / 180;\n    textConfig.rotation = labelRotate;\n  }\n  if (labelDistance != null) {\n    textConfig.distance = labelDistance;\n  }\n  // fill and auto is determined by the color of path fill if it's not specified by developers.\n  textConfig.outsideFill = textStyleModel.get('color') === 'inherit' ? opt.inheritColor || null : 'auto';\n  if (opt.autoOverflowArea != null) {\n    textConfig.autoOverflowArea = opt.autoOverflowArea;\n  }\n  if (opt.layoutRect != null) {\n    textConfig.layoutRect = opt.layoutRect;\n  }\n  return textConfig;\n}\n/**\n * The uniform entry of set text style, that is, retrieve style definitions\n * from `model` and set to `textStyle` object.\n *\n * Never in merge mode, but in overwrite mode, that is, all of the text style\n * properties will be set. (Consider the states of normal and emphasis and\n * default value can be adopted, merge would make the logic too complicated\n * to manage.)\n */\nfunction setTextStyleCommon(textStyle, textStyleModel, opt, isNotNormal, isAttached) {\n  // Consider there will be abnormal when merge hover style to normal style if given default value.\n  opt = opt || EMPTY_OBJ;\n  var ecModel = textStyleModel.ecModel;\n  var globalTextStyle = ecModel && ecModel.option.textStyle;\n  // Consider case:\n  // {\n  //     data: [{\n  //         value: 12,\n  //         label: {\n  //             rich: {\n  //                 // no 'a' here but using parent 'a'.\n  //             }\n  //         }\n  //     }],\n  //     rich: {\n  //         a: { ... }\n  //     }\n  // }\n  var richItemNames = getRichItemNames(textStyleModel);\n  var richResult;\n  if (richItemNames) {\n    richResult = {};\n    var richInheritPlainLabelOptionName = 'richInheritPlainLabel';\n    var richInheritPlainLabel = retrieve2(textStyleModel.get(richInheritPlainLabelOptionName), ecModel ? ecModel.get(richInheritPlainLabelOptionName) : undefined);\n    for (var name_1 in richItemNames) {\n      if (richItemNames.hasOwnProperty(name_1)) {\n        // Cascade is supported in rich.\n        var richTextStyle = textStyleModel.getModel(['rich', name_1]);\n        // In rich, never `disableBox`.\n        // consider `label: {formatter: '{a|xx}', color: 'blue', rich: {a: {}}}`,\n        // the default color `'blue'` will not be adopted if no color declared in `rich`.\n        // That might confuses users. So probably we should put `textStyleModel` as the\n        // root ancestor of the `richTextStyle`. But that would be a break change.\n        // Since v6, the rich style inherits plain label by default\n        // but this behavior can be disabled by setting `richInheritPlainLabel` to `false`.\n        setTokenTextStyle(richResult[name_1] = {}, richTextStyle, globalTextStyle, textStyleModel, richInheritPlainLabel, opt, isNotNormal, isAttached, false, true);\n      }\n    }\n  }\n  if (richResult) {\n    textStyle.rich = richResult;\n  }\n  var overflow = textStyleModel.get('overflow');\n  if (overflow) {\n    textStyle.overflow = overflow;\n  }\n  var lineOverflow = textStyleModel.get('lineOverflow');\n  if (lineOverflow) {\n    textStyle.lineOverflow = lineOverflow;\n  }\n  var labelTextStyle = textStyle;\n  // `minMargin` has a higher precedence than `textMargin`, because `textMargin` is allowed\n  // to be set in `defaultOption`.\n  var minMargin = textStyleModel.get('minMargin');\n  if (minMargin != null) {\n    // `minMargin` only support number value.\n    minMargin = !isNumber(minMargin) ? 0 : minMargin / 2;\n    labelTextStyle.margin = [minMargin, minMargin, minMargin, minMargin];\n    labelTextStyle.__marginType = LabelMarginType.minMargin;\n  } else {\n    var textMargin = textStyleModel.get('textMargin');\n    if (textMargin != null) {\n      labelTextStyle.margin = normalizeCssArray(textMargin);\n      labelTextStyle.__marginType = LabelMarginType.textMargin;\n    }\n  }\n  setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, null, null, opt, isNotNormal, isAttached, true, false);\n}\n// Consider case:\n// {\n//     data: [{\n//         value: 12,\n//         label: {\n//             rich: {\n//                 // no 'a' here but using parent 'a'.\n//             }\n//         }\n//     }],\n//     rich: {\n//         a: { ... }\n//     }\n// }\n// TODO TextStyleModel\nfunction getRichItemNames(textStyleModel) {\n  // Use object to remove duplicated names.\n  var richItemNameMap;\n  while (textStyleModel && textStyleModel !== textStyleModel.ecModel) {\n    var rich = (textStyleModel.option || EMPTY_OBJ).rich;\n    if (rich) {\n      richItemNameMap = richItemNameMap || {};\n      var richKeys = keys(rich);\n      for (var i = 0; i < richKeys.length; i++) {\n        var richKey = richKeys[i];\n        richItemNameMap[richKey] = 1;\n      }\n    }\n    textStyleModel = textStyleModel.parentModel;\n  }\n  return richItemNameMap;\n}\nvar TEXT_PROPS_WITH_GLOBAL = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'];\nvar TEXT_PROPS_SELF = ['align', 'lineHeight', 'width', 'height', 'tag', 'verticalAlign', 'ellipsis'];\nvar TEXT_PROPS_BOX = ['padding', 'borderWidth', 'borderRadius', 'borderDashOffset', 'backgroundColor', 'borderColor', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];\nfunction setTokenTextStyle(textStyle,\n// FIXME: check/refactor for ellipsis handling of rich text.\ntextStyleModel, globalTextStyle, plainTextModel, richInheritPlainLabel, opt, isNotNormal, isAttached, isBlock, inRich) {\n  // In merge mode, default value should not be given.\n  globalTextStyle = !isNotNormal && globalTextStyle || EMPTY_OBJ;\n  var inheritColor = opt && opt.inheritColor;\n  var fillColor = textStyleModel.getShallow('color');\n  var strokeColor = textStyleModel.getShallow('textBorderColor');\n  var opacity = retrieve2(textStyleModel.getShallow('opacity'), globalTextStyle.opacity);\n  if (fillColor === 'inherit' || fillColor === 'auto') {\n    if (process.env.NODE_ENV !== 'production') {\n      if (fillColor === 'auto') {\n        deprecateReplaceLog('color: \\'auto\\'', 'color: \\'inherit\\'');\n      }\n    }\n    if (inheritColor) {\n      fillColor = inheritColor;\n    } else {\n      fillColor = null;\n    }\n  }\n  if (strokeColor === 'inherit' || strokeColor === 'auto') {\n    if (process.env.NODE_ENV !== 'production') {\n      if (strokeColor === 'auto') {\n        deprecateReplaceLog('color: \\'auto\\'', 'color: \\'inherit\\'');\n      }\n    }\n    if (inheritColor) {\n      strokeColor = inheritColor;\n    } else {\n      strokeColor = null;\n    }\n  }\n  if (!isAttached) {\n    // Only use default global textStyle.color if text is individual.\n    // Otherwise it will use the strategy of attached text color because text may be on a path.\n    fillColor = fillColor || globalTextStyle.color;\n    strokeColor = strokeColor || globalTextStyle.textBorderColor;\n  }\n  if (fillColor != null) {\n    // Might not be a string, e.g, it's a function in axisLabel case; but assume that it will\n    // be erased by a correct value outside.\n    textStyle.fill = fillColor;\n  }\n  if (strokeColor != null) {\n    textStyle.stroke = strokeColor;\n  }\n  var textBorderWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth);\n  if (textBorderWidth != null) {\n    textStyle.lineWidth = textBorderWidth;\n  }\n  var textBorderType = retrieve2(textStyleModel.getShallow('textBorderType'), globalTextStyle.textBorderType);\n  if (textBorderType != null) {\n    textStyle.lineDash = textBorderType;\n  }\n  var textBorderDashOffset = retrieve2(textStyleModel.getShallow('textBorderDashOffset'), globalTextStyle.textBorderDashOffset);\n  if (textBorderDashOffset != null) {\n    textStyle.lineDashOffset = textBorderDashOffset;\n  }\n  if (!isNotNormal && opacity == null && !inRich) {\n    opacity = opt && opt.defaultOpacity;\n  }\n  if (opacity != null) {\n    textStyle.opacity = opacity;\n  }\n  // TODO\n  if (!isNotNormal && !isAttached) {\n    // Set default finally.\n    if (textStyle.fill == null && opt.inheritColor) {\n      textStyle.fill = opt.inheritColor;\n    }\n  }\n  // Do not use `getFont` here, because merge should be supported, where\n  // part of these properties may be changed in emphasis style, and the\n  // others should remain their original value got from normal style.\n  for (var i = 0; i < TEXT_PROPS_WITH_GLOBAL.length; i++) {\n    var key = TEXT_PROPS_WITH_GLOBAL[i];\n    // props width, height, padding, margin, tag, backgroundColor, borderColor,\n    // borderWidth, borderRadius, shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY\n    // may inappropriate to inherit from plainTextStyle.\n    // And if some props is specified in default options, users may have to reset them one by one.\n    // Therefore, we only allow these props to inherit from plainTextStyle.\n    // `richInheritPlainLabel` is switch for backward compatibility\n    var val = richInheritPlainLabel !== false && plainTextModel ? retrieve3(textStyleModel.getShallow(key), plainTextModel.getShallow(key), globalTextStyle[key]) : retrieve2(textStyleModel.getShallow(key), globalTextStyle[key]);\n    if (val != null) {\n      textStyle[key] = val;\n    }\n  }\n  for (var i = 0; i < TEXT_PROPS_SELF.length; i++) {\n    var key = TEXT_PROPS_SELF[i];\n    var val = textStyleModel.getShallow(key);\n    if (val != null) {\n      textStyle[key] = val;\n    }\n  }\n  if (textStyle.verticalAlign == null) {\n    var baseline = textStyleModel.getShallow('baseline');\n    if (baseline != null) {\n      textStyle.verticalAlign = baseline;\n    }\n  }\n  if (!isBlock || !opt.disableBox) {\n    for (var i = 0; i < TEXT_PROPS_BOX.length; i++) {\n      var key = TEXT_PROPS_BOX[i];\n      var val = textStyleModel.getShallow(key);\n      if (val != null) {\n        textStyle[key] = val;\n      }\n    }\n    var borderType = textStyleModel.getShallow('borderType');\n    if (borderType != null) {\n      textStyle.borderDash = borderType;\n    }\n    if ((textStyle.backgroundColor === 'auto' || textStyle.backgroundColor === 'inherit') && inheritColor) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (textStyle.backgroundColor === 'auto') {\n          deprecateReplaceLog('backgroundColor: \\'auto\\'', 'backgroundColor: \\'inherit\\'');\n        }\n      }\n      textStyle.backgroundColor = inheritColor;\n    }\n    if ((textStyle.borderColor === 'auto' || textStyle.borderColor === 'inherit') && inheritColor) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (textStyle.borderColor === 'auto') {\n          deprecateReplaceLog('borderColor: \\'auto\\'', 'borderColor: \\'inherit\\'');\n        }\n      }\n      textStyle.borderColor = inheritColor;\n    }\n  }\n}\nexport function getFont(opt, ecModel) {\n  var gTextStyleModel = ecModel && ecModel.getModel('textStyle');\n  return trim([\n  // FIXME in node-canvas fontWeight is before fontStyle\n  opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' '));\n}\nexport var labelInner = makeInner();\nexport function setLabelValueAnimation(label, labelStatesModels, value, getDefaultText) {\n  if (!label) {\n    return;\n  }\n  var obj = labelInner(label);\n  obj.prevValue = obj.value;\n  obj.value = value;\n  var normalLabelModel = labelStatesModels.normal;\n  obj.valueAnimation = normalLabelModel.get('valueAnimation');\n  if (obj.valueAnimation) {\n    obj.precision = normalLabelModel.get('precision');\n    obj.defaultInterpolatedText = getDefaultText;\n    obj.statesModels = labelStatesModels;\n  }\n}\nexport function animateLabelValue(textEl, dataIndex, data, animatableModel, labelFetcher) {\n  var labelInnerStore = labelInner(textEl);\n  if (!labelInnerStore.valueAnimation || labelInnerStore.prevValue === labelInnerStore.value) {\n    // Value not changed, no new label animation\n    return;\n  }\n  var defaultInterpolatedText = labelInnerStore.defaultInterpolatedText;\n  // Consider the case that being animating, do not use the `obj.value`,\n  // Otherwise it will jump to the `obj.value` when this new animation started.\n  var currValue = retrieve2(labelInnerStore.interpolatedValue, labelInnerStore.prevValue);\n  var targetValue = labelInnerStore.value;\n  function during(percent) {\n    var interpolated = interpolateRawValues(data, labelInnerStore.precision, currValue, targetValue, percent);\n    labelInnerStore.interpolatedValue = percent === 1 ? null : interpolated;\n    var labelText = getLabelText({\n      labelDataIndex: dataIndex,\n      labelFetcher: labelFetcher,\n      defaultText: defaultInterpolatedText ? defaultInterpolatedText(interpolated) : interpolated + ''\n    }, labelInnerStore.statesModels, interpolated);\n    setLabelText(textEl, labelText);\n  }\n  textEl.percent = 0;\n  (labelInnerStore.prevValue == null ? initProps : updateProps)(textEl, {\n    // percent is used to prevent animation from being aborted #15916\n    percent: 1\n  }, animatableModel, dataIndex, null, during);\n}\n/**\n * PENDING: Temporary impl. unify them?\n * @see {LabelCommonOption['textMargin']}\n * @see {LabelCommonOption['minMargin']}\n */\nexport var LabelMarginType = {\n  minMargin: 1,\n  textMargin: 2\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { getFont } from '../../label/labelStyle.js';\nimport ZRText from 'zrender/lib/graphic/Text.js';\nvar PATH_COLOR = ['textStyle', 'color'];\nvar textStyleParams = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'padding', 'lineHeight', 'rich', 'width', 'height', 'overflow'];\n// TODO Performance improvement?\nvar tmpText = new ZRText();\nvar TextStyleMixin = /** @class */function () {\n  function TextStyleMixin() {}\n  /**\n   * Get color property or get color from option.textStyle.color\n   */\n  // TODO Callback\n  TextStyleMixin.prototype.getTextColor = function (isEmphasis) {\n    var ecModel = this.ecModel;\n    return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null);\n  };\n  /**\n   * Create font string from fontStyle, fontWeight, fontSize, fontFamily\n   * @return {string}\n   */\n  TextStyleMixin.prototype.getFont = function () {\n    return getFont({\n      fontStyle: this.getShallow('fontStyle'),\n      fontWeight: this.getShallow('fontWeight'),\n      fontSize: this.getShallow('fontSize'),\n      fontFamily: this.getShallow('fontFamily')\n    }, this.ecModel);\n  };\n  TextStyleMixin.prototype.getTextRect = function (text) {\n    var style = {\n      text: text,\n      verticalAlign: this.getShallow('verticalAlign') || this.getShallow('baseline')\n    };\n    for (var i = 0; i < textStyleParams.length; i++) {\n      style[textStyleParams[i]] = this.getShallow(textStyleParams[i]);\n    }\n    tmpText.useStyle(style);\n    tmpText.update();\n    return tmpText.getBoundingRect();\n  };\n  return TextStyleMixin;\n}();\n;\nexport default TextStyleMixin;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport makeStyleMapper from './makeStyleMapper.js';\nexport var LINE_STYLE_KEY_MAP = [['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'type'], ['lineDashOffset', 'dashOffset'], ['lineCap', 'cap'], ['lineJoin', 'join'], ['miterLimit']\n// Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n// So do not transfer decal directly.\n];\nvar getLineStyle = makeStyleMapper(LINE_STYLE_KEY_MAP);\nvar LineStyleMixin = /** @class */function () {\n  function LineStyleMixin() {}\n  LineStyleMixin.prototype.getLineStyle = function (excludes) {\n    return getLineStyle(this, excludes);\n  };\n  return LineStyleMixin;\n}();\n;\nexport { LineStyleMixin };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport makeStyleMapper from './makeStyleMapper.js';\nexport var ITEM_STYLE_KEY_MAP = [['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['lineDash', 'borderType'], ['lineDashOffset', 'borderDashOffset'], ['lineCap', 'borderCap'], ['lineJoin', 'borderJoin'], ['miterLimit', 'borderMiterLimit']\n// Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n// So do not transfer decal directly.\n];\nvar getItemStyle = makeStyleMapper(ITEM_STYLE_KEY_MAP);\nvar ItemStyleMixin = /** @class */function () {\n  function ItemStyleMixin() {}\n  ItemStyleMixin.prototype.getItemStyle = function (excludes, includes) {\n    return getItemStyle(this, excludes, includes);\n  };\n  return ItemStyleMixin;\n}();\nexport { ItemStyleMixin };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport env from 'zrender/lib/core/env.js';\nimport { enableClassExtend, enableClassCheck } from '../util/clazz.js';\nimport { AreaStyleMixin } from './mixin/areaStyle.js';\nimport TextStyleMixin from './mixin/textStyle.js';\nimport { LineStyleMixin } from './mixin/lineStyle.js';\nimport { ItemStyleMixin } from './mixin/itemStyle.js';\nimport { mixin, clone, merge } from 'zrender/lib/core/util.js';\nvar Model = /** @class */function () {\n  function Model(option, parentModel, ecModel) {\n    this.parentModel = parentModel;\n    this.ecModel = ecModel;\n    this.option = option;\n    // Simple optimization\n    // if (this.init) {\n    //     if (arguments.length <= 4) {\n    //         this.init(option, parentModel, ecModel, extraOpt);\n    //     }\n    //     else {\n    //         this.init.apply(this, arguments);\n    //     }\n    // }\n  }\n  Model.prototype.init = function (option, parentModel, ecModel) {\n    var rest = [];\n    for (var _i = 3; _i < arguments.length; _i++) {\n      rest[_i - 3] = arguments[_i];\n    }\n  };\n  /**\n   * Merge the input option to me.\n   */\n  Model.prototype.mergeOption = function (option, ecModel) {\n    merge(this.option, option, true);\n  };\n  // `path` can be 'a.b.c', so the return value type have to be `ModelOption`\n  // TODO: TYPE strict key check?\n  // get(path: string | string[], ignoreParent?: boolean): ModelOption;\n  Model.prototype.get = function (path, ignoreParent) {\n    if (path == null) {\n      return this.option;\n    }\n    return this._doGet(this.parsePath(path), !ignoreParent && this.parentModel);\n  };\n  Model.prototype.getShallow = function (key, ignoreParent) {\n    var option = this.option;\n    var val = option == null ? option : option[key];\n    if (val == null && !ignoreParent) {\n      var parentModel = this.parentModel;\n      if (parentModel) {\n        // FIXME:TS do not know how to make it works\n        val = parentModel.getShallow(key);\n      }\n    }\n    return val;\n  };\n  // `path` can be 'a.b.c', so the return value type have to be `Model<ModelOption>`\n  // getModel(path: string | string[], parentModel?: Model): Model;\n  // TODO 'a.b.c' is deprecated\n  Model.prototype.getModel = function (path, parentModel) {\n    var hasPath = path != null;\n    var pathFinal = hasPath ? this.parsePath(path) : null;\n    var obj = hasPath ? this._doGet(pathFinal) : this.option;\n    parentModel = parentModel || this.parentModel && this.parentModel.getModel(this.resolveParentPath(pathFinal));\n    return new Model(obj, parentModel, this.ecModel);\n  };\n  /**\n   * If model has option\n   */\n  Model.prototype.isEmpty = function () {\n    return this.option == null;\n  };\n  Model.prototype.restoreData = function () {};\n  // Pending\n  Model.prototype.clone = function () {\n    var Ctor = this.constructor;\n    return new Ctor(clone(this.option));\n  };\n  // setReadOnly(properties): void {\n  // clazzUtil.setReadOnly(this, properties);\n  // }\n  // If path is null/undefined, return null/undefined.\n  Model.prototype.parsePath = function (path) {\n    if (typeof path === 'string') {\n      return path.split('.');\n    }\n    return path;\n  };\n  // Resolve path for parent. Perhaps useful when parent use a different property.\n  // Default to be a identity resolver.\n  // Can be modified to a different resolver.\n  Model.prototype.resolveParentPath = function (path) {\n    return path;\n  };\n  // FIXME:TS check whether put this method here\n  Model.prototype.isAnimationEnabled = function () {\n    if (!env.node && this.option) {\n      if (this.option.animation != null) {\n        return !!this.option.animation;\n      } else if (this.parentModel) {\n        return this.parentModel.isAnimationEnabled();\n      }\n    }\n  };\n  Model.prototype._doGet = function (pathArr, parentModel) {\n    var obj = this.option;\n    if (!pathArr) {\n      return obj;\n    }\n    for (var i = 0; i < pathArr.length; i++) {\n      // Ignore empty\n      if (!pathArr[i]) {\n        continue;\n      }\n      // obj could be number/string/... (like 0)\n      obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null;\n      if (obj == null) {\n        break;\n      }\n    }\n    if (obj == null && parentModel) {\n      obj = parentModel._doGet(this.resolveParentPath(pathArr), parentModel.parentModel);\n    }\n    return obj;\n  };\n  return Model;\n}();\n;\n// Enable Model.extend.\nenableClassExtend(Model);\nenableClassCheck(Model);\nmixin(Model, LineStyleMixin);\nmixin(Model, ItemStyleMixin);\nmixin(Model, AreaStyleMixin);\nmixin(Model, TextStyleMixin);\nexport default Model;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { parseClassType } from './clazz.js';\nimport { makePrintable } from './log.js';\n// A random offset\nvar base = Math.round(Math.random() * 10);\n/**\n * @public\n * @param {string} type\n * @return {string}\n */\nexport function getUID(type) {\n  // Considering the case of crossing js context,\n  // use Math.random to make id as unique as possible.\n  return [type || '', base++].join('_');\n}\n/**\n * Implements `SubTypeDefaulterManager` for `target`.\n */\nexport function enableSubTypeDefaulter(target) {\n  var subTypeDefaulters = {};\n  target.registerSubTypeDefaulter = function (componentType, defaulter) {\n    var componentTypeInfo = parseClassType(componentType);\n    subTypeDefaulters[componentTypeInfo.main] = defaulter;\n  };\n  target.determineSubType = function (componentType, option) {\n    var type = option.type;\n    if (!type) {\n      var componentTypeMain = parseClassType(componentType).main;\n      if (target.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {\n        type = subTypeDefaulters[componentTypeMain](option);\n      }\n    }\n    return type;\n  };\n}\n/**\n * Implements `TopologicalTravelable<any>` for `entity`.\n *\n * Topological travel on Activity Network (Activity On Vertices).\n * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].\n * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.\n * If there is circular dependencey, Error will be thrown.\n */\nexport function enableTopologicalTravel(entity, dependencyGetter) {\n  /**\n   * @param targetNameList Target Component type list.\n   *                       Can be ['aa', 'bb', 'aa.xx']\n   * @param fullNameList By which we can build dependency graph.\n   * @param callback Params: componentType, dependencies.\n   * @param context Scope of callback.\n   */\n  entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {\n    if (!targetNameList.length) {\n      return;\n    }\n    var result = makeDepndencyGraph(fullNameList);\n    var graph = result.graph;\n    var noEntryList = result.noEntryList;\n    var targetNameSet = {};\n    zrUtil.each(targetNameList, function (name) {\n      targetNameSet[name] = true;\n    });\n    while (noEntryList.length) {\n      var currComponentType = noEntryList.pop();\n      var currVertex = graph[currComponentType];\n      var isInTargetNameSet = !!targetNameSet[currComponentType];\n      if (isInTargetNameSet) {\n        callback.call(context, currComponentType, currVertex.originalDeps.slice());\n        delete targetNameSet[currComponentType];\n      }\n      zrUtil.each(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge);\n    }\n    zrUtil.each(targetNameSet, function () {\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = makePrintable('Circular dependency may exists: ', targetNameSet, targetNameList, fullNameList);\n      }\n      throw new Error(errMsg);\n    });\n    function removeEdge(succComponentType) {\n      graph[succComponentType].entryCount--;\n      if (graph[succComponentType].entryCount === 0) {\n        noEntryList.push(succComponentType);\n      }\n    }\n    // Consider this case: legend depends on series, and we call\n    // chart.setOption({series: [...]}), where only series is in option.\n    // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will\n    // not be called, but only sereis.mergeOption is called. Thus legend\n    // have no chance to update its local record about series (like which\n    // name of series is available in legend).\n    function removeEdgeAndAdd(succComponentType) {\n      targetNameSet[succComponentType] = true;\n      removeEdge(succComponentType);\n    }\n  };\n  function makeDepndencyGraph(fullNameList) {\n    var graph = {};\n    var noEntryList = [];\n    zrUtil.each(fullNameList, function (name) {\n      var thisItem = createDependencyGraphItem(graph, name);\n      var originalDeps = thisItem.originalDeps = dependencyGetter(name);\n      var availableDeps = getAvailableDependencies(originalDeps, fullNameList);\n      thisItem.entryCount = availableDeps.length;\n      if (thisItem.entryCount === 0) {\n        noEntryList.push(name);\n      }\n      zrUtil.each(availableDeps, function (dependentName) {\n        if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) {\n          thisItem.predecessor.push(dependentName);\n        }\n        var thatItem = createDependencyGraphItem(graph, dependentName);\n        if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) {\n          thatItem.successor.push(name);\n        }\n      });\n    });\n    return {\n      graph: graph,\n      noEntryList: noEntryList\n    };\n  }\n  function createDependencyGraphItem(graph, name) {\n    if (!graph[name]) {\n      graph[name] = {\n        predecessor: [],\n        successor: []\n      };\n    }\n    return graph[name];\n  }\n  function getAvailableDependencies(originalDeps, fullNameList) {\n    var availableDeps = [];\n    zrUtil.each(originalDeps, function (dep) {\n      zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);\n    });\n    return availableDeps;\n  }\n}\nexport function inheritDefaultOption(superOption, subOption) {\n  // See also `model/Component.ts#getDefaultOption`\n  return zrUtil.merge(zrUtil.merge({}, superOption, true), subOption, true);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/**\n * Language: English.\n */\nexport default {\n  time: {\n    month: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n    monthAbbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n    dayOfWeek: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n    dayOfWeekAbbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']\n  },\n  legend: {\n    selector: {\n      all: 'All',\n      inverse: 'Inv'\n    }\n  },\n  toolbox: {\n    brush: {\n      title: {\n        rect: 'Box Select',\n        polygon: 'Lasso Select',\n        lineX: 'Horizontally Select',\n        lineY: 'Vertically Select',\n        keep: 'Keep Selections',\n        clear: 'Clear Selections'\n      }\n    },\n    dataView: {\n      title: 'Data View',\n      lang: ['Data View', 'Close', 'Refresh']\n    },\n    dataZoom: {\n      title: {\n        zoom: 'Zoom',\n        back: 'Zoom Reset'\n      }\n    },\n    magicType: {\n      title: {\n        line: 'Switch to Line Chart',\n        bar: 'Switch to Bar Chart',\n        stack: 'Stack',\n        tiled: 'Tile'\n      }\n    },\n    restore: {\n      title: 'Restore'\n    },\n    saveAsImage: {\n      title: 'Save as Image',\n      lang: ['Right Click to Save Image']\n    }\n  },\n  series: {\n    typeNames: {\n      pie: 'Pie chart',\n      bar: 'Bar chart',\n      line: 'Line chart',\n      scatter: 'Scatter plot',\n      effectScatter: 'Ripple scatter plot',\n      radar: 'Radar chart',\n      tree: 'Tree',\n      treemap: 'Treemap',\n      boxplot: 'Boxplot',\n      candlestick: 'Candlestick',\n      k: 'K line chart',\n      heatmap: 'Heat map',\n      map: 'Map',\n      parallel: 'Parallel coordinate map',\n      lines: 'Line graph',\n      graph: 'Relationship graph',\n      sankey: 'Sankey diagram',\n      funnel: 'Funnel chart',\n      gauge: 'Gauge',\n      pictorialBar: 'Pictorial bar',\n      themeRiver: 'Theme River Map',\n      sunburst: 'Sunburst',\n      custom: 'Custom chart',\n      chart: 'Chart'\n    }\n  },\n  aria: {\n    general: {\n      withTitle: 'This is a chart about \"{title}\"',\n      withoutTitle: 'This is a chart'\n    },\n    series: {\n      single: {\n        prefix: '',\n        withName: ' with type {seriesType} named {seriesName}.',\n        withoutName: ' with type {seriesType}.'\n      },\n      multiple: {\n        prefix: '. It consists of {seriesCount} series count.',\n        withName: ' The {seriesId} series is a {seriesType} representing {seriesName}.',\n        withoutName: ' The {seriesId} series is a {seriesType}.',\n        separator: {\n          middle: '',\n          end: ''\n        }\n      }\n    },\n    data: {\n      allData: 'The data is as follows: ',\n      partialData: 'The first {displayCnt} items are: ',\n      withName: 'the data for {name} is {value}',\n      withoutName: '{value}',\n      separator: {\n        middle: ', ',\n        end: '. '\n      }\n    }\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport default {\n  time: {\n    month: ['\u4E00\u6708', '\u4E8C\u6708', '\u4E09\u6708', '\u56DB\u6708', '\u4E94\u6708', '\u516D\u6708', '\u4E03\u6708', '\u516B\u6708', '\u4E5D\u6708', '\u5341\u6708', '\u5341\u4E00\u6708', '\u5341\u4E8C\u6708'],\n    monthAbbr: ['1\u6708', '2\u6708', '3\u6708', '4\u6708', '5\u6708', '6\u6708', '7\u6708', '8\u6708', '9\u6708', '10\u6708', '11\u6708', '12\u6708'],\n    dayOfWeek: ['\u661F\u671F\u65E5', '\u661F\u671F\u4E00', '\u661F\u671F\u4E8C', '\u661F\u671F\u4E09', '\u661F\u671F\u56DB', '\u661F\u671F\u4E94', '\u661F\u671F\u516D'],\n    dayOfWeekAbbr: ['\u65E5', '\u4E00', '\u4E8C', '\u4E09', '\u56DB', '\u4E94', '\u516D']\n  },\n  legend: {\n    selector: {\n      all: '\u5168\u9009',\n      inverse: '\u53CD\u9009'\n    }\n  },\n  toolbox: {\n    brush: {\n      title: {\n        rect: '\u77E9\u5F62\u9009\u62E9',\n        polygon: '\u5708\u9009',\n        lineX: '\u6A2A\u5411\u9009\u62E9',\n        lineY: '\u7EB5\u5411\u9009\u62E9',\n        keep: '\u4FDD\u6301\u9009\u62E9',\n        clear: '\u6E05\u9664\u9009\u62E9'\n      }\n    },\n    dataView: {\n      title: '\u6570\u636E\u89C6\u56FE',\n      lang: ['\u6570\u636E\u89C6\u56FE', '\u5173\u95ED', '\u5237\u65B0']\n    },\n    dataZoom: {\n      title: {\n        zoom: '\u533A\u57DF\u7F29\u653E',\n        back: '\u533A\u57DF\u7F29\u653E\u8FD8\u539F'\n      }\n    },\n    magicType: {\n      title: {\n        line: '\u5207\u6362\u4E3A\u6298\u7EBF\u56FE',\n        bar: '\u5207\u6362\u4E3A\u67F1\u72B6\u56FE',\n        stack: '\u5207\u6362\u4E3A\u5806\u53E0',\n        tiled: '\u5207\u6362\u4E3A\u5E73\u94FA'\n      }\n    },\n    restore: {\n      title: '\u8FD8\u539F'\n    },\n    saveAsImage: {\n      title: '\u4FDD\u5B58\u4E3A\u56FE\u7247',\n      lang: ['\u53F3\u952E\u53E6\u5B58\u4E3A\u56FE\u7247']\n    }\n  },\n  series: {\n    typeNames: {\n      pie: '\u997C\u56FE',\n      bar: '\u67F1\u72B6\u56FE',\n      line: '\u6298\u7EBF\u56FE',\n      scatter: '\u6563\u70B9\u56FE',\n      effectScatter: '\u6D9F\u6F2A\u6563\u70B9\u56FE',\n      radar: '\u96F7\u8FBE\u56FE',\n      tree: '\u6811\u56FE',\n      treemap: '\u77E9\u5F62\u6811\u56FE',\n      boxplot: '\u7BB1\u578B\u56FE',\n      candlestick: 'K\u7EBF\u56FE',\n      k: 'K\u7EBF\u56FE',\n      heatmap: '\u70ED\u529B\u56FE',\n      map: '\u5730\u56FE',\n      parallel: '\u5E73\u884C\u5750\u6807\u56FE',\n      lines: '\u7EBF\u56FE',\n      graph: '\u5173\u7CFB\u56FE',\n      sankey: '\u6851\u57FA\u56FE',\n      funnel: '\u6F0F\u6597\u56FE',\n      gauge: '\u4EEA\u8868\u76D8\u56FE',\n      pictorialBar: '\u8C61\u5F62\u67F1\u56FE',\n      themeRiver: '\u4E3B\u9898\u6CB3\u6D41\u56FE',\n      sunburst: '\u65ED\u65E5\u56FE',\n      custom: '\u81EA\u5B9A\u4E49\u56FE\u8868',\n      chart: '\u56FE\u8868'\n    }\n  },\n  aria: {\n    general: {\n      withTitle: '\u8FD9\u662F\u4E00\u4E2A\u5173\u4E8E\u201C{title}\u201D\u7684\u56FE\u8868\u3002',\n      withoutTitle: '\u8FD9\u662F\u4E00\u4E2A\u56FE\u8868\uFF0C'\n    },\n    series: {\n      single: {\n        prefix: '',\n        withName: '\u56FE\u8868\u7C7B\u578B\u662F{seriesType}\uFF0C\u8868\u793A{seriesName}\u3002',\n        withoutName: '\u56FE\u8868\u7C7B\u578B\u662F{seriesType}\u3002'\n      },\n      multiple: {\n        prefix: '\u5B83\u7531{seriesCount}\u4E2A\u56FE\u8868\u7CFB\u5217\u7EC4\u6210\u3002',\n        withName: '\u7B2C{seriesId}\u4E2A\u7CFB\u5217\u662F\u4E00\u4E2A\u8868\u793A{seriesName}\u7684{seriesType}\uFF0C',\n        withoutName: '\u7B2C{seriesId}\u4E2A\u7CFB\u5217\u662F\u4E00\u4E2A{seriesType}\uFF0C',\n        separator: {\n          middle: '\uFF1B',\n          end: '\u3002'\n        }\n      }\n    },\n    data: {\n      allData: '\u5176\u6570\u636E\u662F\u2014\u2014',\n      partialData: '\u5176\u4E2D\uFF0C\u524D{displayCnt}\u9879\u662F\u2014\u2014',\n      withName: '{name}\u7684\u6570\u636E\u662F{value}',\n      withoutName: '{value}',\n      separator: {\n        middle: '\uFF0C',\n        end: ''\n      }\n    }\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport Model from '../model/Model.js';\nimport env from 'zrender/lib/core/env.js';\n// default import ZH and EN lang\nimport langEN from '../i18n/langEN.js';\nimport langZH from '../i18n/langZH.js';\nimport { isString, clone, merge } from 'zrender/lib/core/util.js';\nvar LOCALE_ZH = 'ZH';\nvar LOCALE_EN = 'EN';\nvar DEFAULT_LOCALE = LOCALE_EN;\nvar localeStorage = {};\nvar localeModels = {};\nexport var SYSTEM_LANG = !env.domSupported ? DEFAULT_LOCALE : function () {\n  var langStr = (/* eslint-disable-next-line */\n  document.documentElement.lang || navigator.language || navigator.browserLanguage || DEFAULT_LOCALE).toUpperCase();\n  return langStr.indexOf(LOCALE_ZH) > -1 ? LOCALE_ZH : DEFAULT_LOCALE;\n}();\nexport function registerLocale(locale, localeObj) {\n  locale = locale.toUpperCase();\n  localeModels[locale] = new Model(localeObj);\n  localeStorage[locale] = localeObj;\n}\n// export function getLocale(locale: string) {\n//     return localeStorage[locale];\n// }\nexport function createLocaleObject(locale) {\n  if (isString(locale)) {\n    var localeObj = localeStorage[locale.toUpperCase()] || {};\n    if (locale === LOCALE_ZH || locale === LOCALE_EN) {\n      return clone(localeObj);\n    } else {\n      return merge(clone(localeObj), clone(localeStorage[DEFAULT_LOCALE]), false);\n    }\n  } else {\n    return merge(clone(locale), clone(localeStorage[DEFAULT_LOCALE]), false);\n  }\n}\nexport function getLocaleModel(lang) {\n  return localeModels[lang];\n}\nexport function getDefaultLocaleModel() {\n  return localeModels[DEFAULT_LOCALE];\n}\n// Default locale\nregisterLocale(LOCALE_EN, langEN);\nregisterLocale(LOCALE_ZH, langZH);", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n;\nvar _impl = null;\nexport function registerScaleBreakHelperImpl(impl) {\n  if (!_impl) {\n    _impl = impl;\n  }\n}\nexport function getScaleBreakHelper() {\n  return _impl;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as numberUtil from './number.js';\nimport { getDefaultLocaleModel, getLocaleModel, SYSTEM_LANG } from '../core/locale.js';\nimport Model from '../model/Model.js';\nimport { getScaleBreakHelper } from '../scale/break.js';\nexport var ONE_SECOND = 1000;\nexport var ONE_MINUTE = ONE_SECOND * 60;\nexport var ONE_HOUR = ONE_MINUTE * 60;\nexport var ONE_DAY = ONE_HOUR * 24;\nexport var ONE_YEAR = ONE_DAY * 365;\nvar primaryTimeUnitFormatterMatchers = {\n  year: /({yyyy}|{yy})/,\n  month: /({MMMM}|{MMM}|{MM}|{M})/,\n  day: /({dd}|{d})/,\n  hour: /({HH}|{H}|{hh}|{h})/,\n  minute: /({mm}|{m})/,\n  second: /({ss}|{s})/,\n  millisecond: /({SSS}|{S})/\n};\nvar defaultFormatterSeed = {\n  year: '{yyyy}',\n  month: '{MMM}',\n  day: '{d}',\n  hour: '{HH}:{mm}',\n  minute: '{HH}:{mm}',\n  second: '{HH}:{mm}:{ss}',\n  millisecond: '{HH}:{mm}:{ss} {SSS}'\n};\nvar defaultFullFormatter = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}';\nvar fullDayFormatter = '{yyyy}-{MM}-{dd}';\nexport var fullLeveledFormatter = {\n  year: '{yyyy}',\n  month: '{yyyy}-{MM}',\n  day: fullDayFormatter,\n  hour: fullDayFormatter + ' ' + defaultFormatterSeed.hour,\n  minute: fullDayFormatter + ' ' + defaultFormatterSeed.minute,\n  second: fullDayFormatter + ' ' + defaultFormatterSeed.second,\n  millisecond: defaultFullFormatter\n};\n// Order must be ensured from big to small.\nexport var primaryTimeUnits = ['year', 'month', 'day', 'hour', 'minute', 'second', 'millisecond'];\nexport var timeUnits = ['year', 'half-year', 'quarter', 'month', 'week', 'half-week', 'day', 'half-day', 'quarter-day', 'hour', 'minute', 'second', 'millisecond'];\nexport function parseTimeAxisLabelFormatter(formatter) {\n  // Keep the logic the same with function `leveledFormat`.\n  return !zrUtil.isString(formatter) && !zrUtil.isFunction(formatter) ? parseTimeAxisLabelFormatterDictionary(formatter) : formatter;\n}\n/**\n * The final generated dictionary is like:\n *  generated_dict = {\n *      year: {\n *          year: ['{yyyy}', ...<higher_levels_if_any>]\n *      },\n *      month: {\n *          year: ['{yyyy} {MMM}', ...<higher_levels_if_any>],\n *          month: ['{MMM}', ...<higher_levels_if_any>]\n *      },\n *      day: {\n *          year: ['{yyyy} {MMM} {d}', ...<higher_levels_if_any>],\n *          month: ['{MMM} {d}', ...<higher_levels_if_any>],\n *          day: ['{d}', ...<higher_levels_if_any>]\n *      },\n *      ...\n *  }\n *\n * In echarts option, users can specify the entire dictionary or typically just:\n *  {formatter: {\n *      year: '{yyyy}', // Or an array of leveled templates: `['{yyyy}', '{bold1|{yyyy}}', ...]`,\n *                      // corresponding to `[level0, level1, level2, ...]`.\n *      month: '{MMM}',\n *      day: '{d}',\n *      hour: '{HH}:{mm}',\n *      second: '{HH}:{mm}',\n *      ...\n *  }}\n *  If any time unit is not specified in echarts option, the default template is used,\n *  such as `['{yyyy}', {primary|{yyyy}']`.\n *\n * The `tick.level` is only used to read string from each array, meaning the style type.\n *\n * Let `lowerUnit = getUnitFromValue(tick.value)`.\n * The non-break axis ticks only use `generated_dict[lowerUnit][lowerUnit][level]`.\n * The break axis ticks may use `generated_dict[lowerUnit][upperUnit][level]`, because:\n *  Consider the case: the non-break ticks are `16th, 23th, Feb, 7th, ...`, where `Feb` is in the break\n *  range and pruned by breaks, and the break ends might be in lower time unit than day. e.g., break start\n *  is `Jan 25th 18:00`(in unit `hour`) and break end is `Feb 6th 18:30` (in unit `minute`). Thus the break\n *  label prefers `Jan 25th 18:00` and `Feb 6th 18:30` rather than only `18:00` and `18:30`, otherwise it\n *  causes misleading.\n *  In this case, the tick of the break start and end will both be:\n *      `{level: 1, lowerTimeUnit: 'minute', upperTimeUnit: 'month'}`\n *  And get the final template by `generated_dict[lowerTimeUnit][upperTimeUnit][level]`.\n *  Note that the time unit can not be calculated directly by a single tick value, since the two breaks have\n *  to be at the same time unit to avoid awkward appearance. i.e., `Jan 25th 18:00` is in the time unit \"hour\"\n *  but we need it to be \"minute\", following `Feb 6th 18:30`.\n */\nfunction parseTimeAxisLabelFormatterDictionary(dictOption) {\n  dictOption = dictOption || {};\n  var dict = {};\n  // Currently if any template is specified by user, it may contain rich text tag,\n  // such as `'{my_bold|{YYYY}}'`, thus we do add highlight style to it.\n  // (Note that nested tag (`'{some|{some2|xxx}}'`) in rich text is not supported yet.)\n  var canAddHighlight = true;\n  zrUtil.each(primaryTimeUnits, function (lowestUnit) {\n    canAddHighlight && (canAddHighlight = dictOption[lowestUnit] == null);\n  });\n  zrUtil.each(primaryTimeUnits, function (lowestUnit, lowestUnitIdx) {\n    var upperDictOption = dictOption[lowestUnit];\n    dict[lowestUnit] = {};\n    var lowerTpl = null;\n    for (var upperUnitIdx = lowestUnitIdx; upperUnitIdx >= 0; upperUnitIdx--) {\n      var upperUnit = primaryTimeUnits[upperUnitIdx];\n      var upperDictItemOption = zrUtil.isObject(upperDictOption) && !zrUtil.isArray(upperDictOption) ? upperDictOption[upperUnit] : upperDictOption;\n      var tplArr = void 0;\n      if (zrUtil.isArray(upperDictItemOption)) {\n        tplArr = upperDictItemOption.slice();\n        lowerTpl = tplArr[0] || '';\n      } else if (zrUtil.isString(upperDictItemOption)) {\n        lowerTpl = upperDictItemOption;\n        tplArr = [lowerTpl];\n      } else {\n        if (lowerTpl == null) {\n          lowerTpl = defaultFormatterSeed[lowestUnit];\n        }\n        // Generate the dict by the rule as follows:\n        // If the user specify (or by default):\n        //  {formatter: {\n        //      year: '{yyyy}',\n        //      month: '{MMM}',\n        //      day: '{d}',\n        //      ...\n        //  }}\n        // Concat them to make the final dictionary:\n        //  {formatter: {\n        //      year: {year: ['{yyyy}']},\n        //      month: {year: ['{yyyy} {MMM}'], month: ['{MMM}']},\n        //      day: {year: ['{yyyy} {MMM} {d}'], month: ['{MMM} {d}'], day: ['{d}']}\n        //      ...\n        //  }}\n        // And then add `{primary|...}` to each array if from default template.\n        // This strategy is convinient for user configurating and works for most cases.\n        // If bad cases encountered, users can specify the entire dictionary themselves\n        // instead of going through this logic.\n        else if (!primaryTimeUnitFormatterMatchers[upperUnit].test(lowerTpl)) {\n          lowerTpl = dict[upperUnit][upperUnit][0] + \" \" + lowerTpl;\n        }\n        tplArr = [lowerTpl];\n        if (canAddHighlight) {\n          tplArr[1] = \"{primary|\" + lowerTpl + \"}\";\n        }\n      }\n      dict[lowestUnit][upperUnit] = tplArr;\n    }\n  });\n  return dict;\n}\nexport function pad(str, len) {\n  str += '';\n  return '0000'.substr(0, len - str.length) + str;\n}\nexport function getPrimaryTimeUnit(timeUnit) {\n  switch (timeUnit) {\n    case 'half-year':\n    case 'quarter':\n      return 'month';\n    case 'week':\n    case 'half-week':\n      return 'day';\n    case 'half-day':\n    case 'quarter-day':\n      return 'hour';\n    default:\n      // year, minutes, second, milliseconds\n      return timeUnit;\n  }\n}\nexport function isPrimaryTimeUnit(timeUnit) {\n  return timeUnit === getPrimaryTimeUnit(timeUnit);\n}\nexport function getDefaultFormatPrecisionOfInterval(timeUnit) {\n  switch (timeUnit) {\n    case 'year':\n    case 'month':\n      return 'day';\n    case 'millisecond':\n      return 'millisecond';\n    default:\n      // Also for day, hour, minute, second\n      return 'second';\n  }\n}\nexport function format(\n// Note: The result based on `isUTC` are totally different, which can not be just simply\n// substituted by the result without `isUTC`. So we make the param `isUTC` mandatory.\ntime, template, isUTC, lang) {\n  var date = numberUtil.parseDate(time);\n  var y = date[fullYearGetterName(isUTC)]();\n  var M = date[monthGetterName(isUTC)]() + 1;\n  var q = Math.floor((M - 1) / 3) + 1;\n  var d = date[dateGetterName(isUTC)]();\n  var e = date['get' + (isUTC ? 'UTC' : '') + 'Day']();\n  var H = date[hoursGetterName(isUTC)]();\n  var h = (H - 1) % 12 + 1;\n  var m = date[minutesGetterName(isUTC)]();\n  var s = date[secondsGetterName(isUTC)]();\n  var S = date[millisecondsGetterName(isUTC)]();\n  var a = H >= 12 ? 'pm' : 'am';\n  var A = a.toUpperCase();\n  var localeModel = lang instanceof Model ? lang : getLocaleModel(lang || SYSTEM_LANG) || getDefaultLocaleModel();\n  var timeModel = localeModel.getModel('time');\n  var month = timeModel.get('month');\n  var monthAbbr = timeModel.get('monthAbbr');\n  var dayOfWeek = timeModel.get('dayOfWeek');\n  var dayOfWeekAbbr = timeModel.get('dayOfWeekAbbr');\n  return (template || '').replace(/{a}/g, a + '').replace(/{A}/g, A + '').replace(/{yyyy}/g, y + '').replace(/{yy}/g, pad(y % 100 + '', 2)).replace(/{Q}/g, q + '').replace(/{MMMM}/g, month[M - 1]).replace(/{MMM}/g, monthAbbr[M - 1]).replace(/{MM}/g, pad(M, 2)).replace(/{M}/g, M + '').replace(/{dd}/g, pad(d, 2)).replace(/{d}/g, d + '').replace(/{eeee}/g, dayOfWeek[e]).replace(/{ee}/g, dayOfWeekAbbr[e]).replace(/{e}/g, e + '').replace(/{HH}/g, pad(H, 2)).replace(/{H}/g, H + '').replace(/{hh}/g, pad(h + '', 2)).replace(/{h}/g, h + '').replace(/{mm}/g, pad(m, 2)).replace(/{m}/g, m + '').replace(/{ss}/g, pad(s, 2)).replace(/{s}/g, s + '').replace(/{SSS}/g, pad(S, 3)).replace(/{S}/g, S + '');\n}\nexport function leveledFormat(tick, idx, formatter, lang, isUTC) {\n  var template = null;\n  if (zrUtil.isString(formatter)) {\n    // Single formatter for all units at all levels\n    template = formatter;\n  } else if (zrUtil.isFunction(formatter)) {\n    var extra = {\n      time: tick.time,\n      level: tick.time.level\n    };\n    var scaleBreakHelper = getScaleBreakHelper();\n    if (scaleBreakHelper) {\n      scaleBreakHelper.makeAxisLabelFormatterParamBreak(extra, tick[\"break\"]);\n    }\n    template = formatter(tick.value, idx, extra);\n  } else {\n    var tickTime = tick.time;\n    if (tickTime) {\n      var leveledTplArr = formatter[tickTime.lowerTimeUnit][tickTime.upperTimeUnit];\n      template = leveledTplArr[Math.min(tickTime.level, leveledTplArr.length - 1)] || '';\n    } else {\n      // tick may be from customTicks or timeline therefore no tick.time.\n      var unit = getUnitFromValue(tick.value, isUTC);\n      template = formatter[unit][unit][0];\n    }\n  }\n  return format(new Date(tick.value), template, isUTC, lang);\n}\nexport function getUnitFromValue(value, isUTC) {\n  var date = numberUtil.parseDate(value);\n  var M = date[monthGetterName(isUTC)]() + 1;\n  var d = date[dateGetterName(isUTC)]();\n  var h = date[hoursGetterName(isUTC)]();\n  var m = date[minutesGetterName(isUTC)]();\n  var s = date[secondsGetterName(isUTC)]();\n  var S = date[millisecondsGetterName(isUTC)]();\n  var isSecond = S === 0;\n  var isMinute = isSecond && s === 0;\n  var isHour = isMinute && m === 0;\n  var isDay = isHour && h === 0;\n  var isMonth = isDay && d === 1;\n  var isYear = isMonth && M === 1;\n  if (isYear) {\n    return 'year';\n  } else if (isMonth) {\n    return 'month';\n  } else if (isDay) {\n    return 'day';\n  } else if (isHour) {\n    return 'hour';\n  } else if (isMinute) {\n    return 'minute';\n  } else if (isSecond) {\n    return 'second';\n  } else {\n    return 'millisecond';\n  }\n}\n// export function getUnitValue(\n//     value: number | Date,\n//     unit: TimeUnit,\n//     isUTC: boolean\n// ) : number {\n//     const date = zrUtil.isNumber(value)\n//         ? numberUtil.parseDate(value)\n//         : value;\n//     unit = unit || getUnitFromValue(value, isUTC);\n//     switch (unit) {\n//         case 'year':\n//             return date[fullYearGetterName(isUTC)]();\n//         case 'half-year':\n//             return date[monthGetterName(isUTC)]() >= 6 ? 1 : 0;\n//         case 'quarter':\n//             return Math.floor((date[monthGetterName(isUTC)]() + 1) / 4);\n//         case 'month':\n//             return date[monthGetterName(isUTC)]();\n//         case 'day':\n//             return date[dateGetterName(isUTC)]();\n//         case 'half-day':\n//             return date[hoursGetterName(isUTC)]() / 24;\n//         case 'hour':\n//             return date[hoursGetterName(isUTC)]();\n//         case 'minute':\n//             return date[minutesGetterName(isUTC)]();\n//         case 'second':\n//             return date[secondsGetterName(isUTC)]();\n//         case 'millisecond':\n//             return date[millisecondsGetterName(isUTC)]();\n//     }\n// }\n/**\n * e.g.,\n * If timeUnit is 'year', return the Jan 1st 00:00:00 000 of that year.\n * If timeUnit is 'day', return the 00:00:00 000 of that day.\n *\n * @return The input date.\n */\nexport function roundTime(date, timeUnit, isUTC) {\n  switch (timeUnit) {\n    case 'year':\n      date[monthSetterName(isUTC)](0);\n    case 'month':\n      date[dateSetterName(isUTC)](1);\n    case 'day':\n      date[hoursSetterName(isUTC)](0);\n    case 'hour':\n      date[minutesSetterName(isUTC)](0);\n    case 'minute':\n      date[secondsSetterName(isUTC)](0);\n    case 'second':\n      date[millisecondsSetterName(isUTC)](0);\n  }\n  return date;\n}\nexport function fullYearGetterName(isUTC) {\n  return isUTC ? 'getUTCFullYear' : 'getFullYear';\n}\nexport function monthGetterName(isUTC) {\n  return isUTC ? 'getUTCMonth' : 'getMonth';\n}\nexport function dateGetterName(isUTC) {\n  return isUTC ? 'getUTCDate' : 'getDate';\n}\nexport function hoursGetterName(isUTC) {\n  return isUTC ? 'getUTCHours' : 'getHours';\n}\nexport function minutesGetterName(isUTC) {\n  return isUTC ? 'getUTCMinutes' : 'getMinutes';\n}\nexport function secondsGetterName(isUTC) {\n  return isUTC ? 'getUTCSeconds' : 'getSeconds';\n}\nexport function millisecondsGetterName(isUTC) {\n  return isUTC ? 'getUTCMilliseconds' : 'getMilliseconds';\n}\nexport function fullYearSetterName(isUTC) {\n  return isUTC ? 'setUTCFullYear' : 'setFullYear';\n}\nexport function monthSetterName(isUTC) {\n  return isUTC ? 'setUTCMonth' : 'setMonth';\n}\nexport function dateSetterName(isUTC) {\n  return isUTC ? 'setUTCDate' : 'setDate';\n}\nexport function hoursSetterName(isUTC) {\n  return isUTC ? 'setUTCHours' : 'setHours';\n}\nexport function minutesSetterName(isUTC) {\n  return isUTC ? 'setUTCMinutes' : 'setMinutes';\n}\nexport function secondsSetterName(isUTC) {\n  return isUTC ? 'setUTCSeconds' : 'setSeconds';\n}\nexport function millisecondsSetterName(isUTC) {\n  return isUTC ? 'setUTCMilliseconds' : 'setMilliseconds';\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { Text } from '../util/graphic.js';\nexport function getTextRect(text, font, align, verticalAlign, padding, rich, truncate, lineHeight) {\n  var textEl = new Text({\n    style: {\n      text: text,\n      font: font,\n      align: align,\n      verticalAlign: verticalAlign,\n      padding: padding,\n      rich: rich,\n      overflow: truncate ? 'truncate' : null,\n      lineHeight: lineHeight\n    }\n  });\n  return textEl.getBoundingRect();\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { encodeHTML } from 'zrender/lib/core/dom.js';\nimport { parseDate, isNumeric, numericToNumber } from './number.js';\nimport { format as timeFormat, pad } from './time.js';\nimport { deprecateReplaceLog } from './log.js';\n/**\n * Add a comma each three digit.\n */\nexport function addCommas(x) {\n  if (!isNumeric(x)) {\n    return zrUtil.isString(x) ? x : '-';\n  }\n  var parts = (x + '').split('.');\n  return parts[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : '');\n}\nexport function toCamelCase(str, upperCaseFirst) {\n  str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {\n    return group1.toUpperCase();\n  });\n  if (upperCaseFirst && str) {\n    str = str.charAt(0).toUpperCase() + str.slice(1);\n  }\n  return str;\n}\nexport var normalizeCssArray = zrUtil.normalizeCssArray;\nexport { encodeHTML };\n/**\n * Make value user readable for tooltip and label.\n * \"User readable\":\n *     Try to not print programmer-specific text like NaN, Infinity, null, undefined.\n *     Avoid to display an empty string, which users can not recognize there is\n *     a value and it might look like a bug.\n */\nexport function makeValueReadable(value, valueType, useUTC) {\n  var USER_READABLE_DEFUALT_TIME_PATTERN = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}';\n  function stringToUserReadable(str) {\n    return str && zrUtil.trim(str) ? str : '-';\n  }\n  function isNumberUserReadable(num) {\n    return !!(num != null && !isNaN(num) && isFinite(num));\n  }\n  var isTypeTime = valueType === 'time';\n  var isValueDate = value instanceof Date;\n  if (isTypeTime || isValueDate) {\n    var date = isTypeTime ? parseDate(value) : value;\n    if (!isNaN(+date)) {\n      return timeFormat(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC);\n    } else if (isValueDate) {\n      return '-';\n    }\n    // In other cases, continue to try to display the value in the following code.\n  }\n  if (valueType === 'ordinal') {\n    return zrUtil.isStringSafe(value) ? stringToUserReadable(value) : zrUtil.isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-';\n  }\n  // By default.\n  var numericResult = numericToNumber(value);\n  return isNumberUserReadable(numericResult) ? addCommas(numericResult) : zrUtil.isStringSafe(value) ? stringToUserReadable(value) : typeof value === 'boolean' ? value + '' : '-';\n}\nvar TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];\nvar wrapVar = function (varName, seriesIdx) {\n  return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';\n};\n/**\n * Template formatter\n * @param {Array.<Object>|Object} paramsList\n */\nexport function formatTpl(tpl, paramsList, encode) {\n  if (!zrUtil.isArray(paramsList)) {\n    paramsList = [paramsList];\n  }\n  var seriesLen = paramsList.length;\n  if (!seriesLen) {\n    return '';\n  }\n  var $vars = paramsList[0].$vars || [];\n  for (var i = 0; i < $vars.length; i++) {\n    var alias = TPL_VAR_ALIAS[i];\n    tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0));\n  }\n  for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {\n    for (var k = 0; k < $vars.length; k++) {\n      var val = paramsList[seriesIdx][$vars[k]];\n      tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val);\n    }\n  }\n  return tpl;\n}\n/**\n * simple Template formatter\n */\nexport function formatTplSimple(tpl, param, encode) {\n  zrUtil.each(param, function (value, key) {\n    tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value);\n  });\n  return tpl;\n}\nexport function getTooltipMarker(inOpt, extraCssText) {\n  var opt = zrUtil.isString(inOpt) ? {\n    color: inOpt,\n    extraCssText: extraCssText\n  } : inOpt || {};\n  var color = opt.color;\n  var type = opt.type;\n  extraCssText = opt.extraCssText;\n  var renderMode = opt.renderMode || 'html';\n  if (!color) {\n    return '';\n  }\n  if (renderMode === 'html') {\n    return type === 'subItem' ? '<span style=\"display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;' + 'border-radius:4px;width:4px;height:4px;background-color:'\n    // Only support string\n    + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>' : '<span style=\"display:inline-block;margin-right:4px;' + 'border-radius:10px;width:10px;height:10px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>';\n  } else {\n    // Should better not to auto generate style name by auto-increment number here.\n    // Because this util is usually called in tooltip formatter, which is probably\n    // called repeatedly when mouse move and the auto-increment number increases fast.\n    // Users can make their own style name by theirselves, make it unique and readable.\n    var markerId = opt.markerId || 'markerX';\n    return {\n      renderMode: renderMode,\n      content: '{' + markerId + '|}  ',\n      style: type === 'subItem' ? {\n        width: 4,\n        height: 4,\n        borderRadius: 2,\n        backgroundColor: color\n      } : {\n        width: 10,\n        height: 10,\n        borderRadius: 5,\n        backgroundColor: color\n      }\n    };\n  }\n}\n/**\n * @deprecated Use `time/format` instead.\n * ISO Date format\n * @param {string} tpl\n * @param {number} value\n * @param {boolean} [isUTC=false] Default in local time.\n *           see `module:echarts/scale/Time`\n *           and `module:echarts/util/number#parseDate`.\n * @inner\n */\nexport function formatTime(tpl, value, isUTC) {\n  if (process.env.NODE_ENV !== 'production') {\n    deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format');\n  }\n  if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') {\n    tpl = 'MM-dd\\nyyyy';\n  }\n  var date = parseDate(value);\n  var getUTC = isUTC ? 'getUTC' : 'get';\n  var y = date[getUTC + 'FullYear']();\n  var M = date[getUTC + 'Month']() + 1;\n  var d = date[getUTC + 'Date']();\n  var h = date[getUTC + 'Hours']();\n  var m = date[getUTC + 'Minutes']();\n  var s = date[getUTC + 'Seconds']();\n  var S = date[getUTC + 'Milliseconds']();\n  tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', pad(y % 100 + '', 2)).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3));\n  return tpl;\n}\n/**\n * Capital first\n * @param {string} str\n * @return {string}\n */\nexport function capitalFirst(str) {\n  return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;\n}\n/**\n * @return Never be null/undefined.\n */\nexport function convertToColorString(color, defaultColor) {\n  defaultColor = defaultColor || 'transparent';\n  return zrUtil.isString(color) ? color : zrUtil.isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor;\n}\nexport { truncateText } from 'zrender/lib/graphic/helper/parseText.js';\n/**\n * open new tab\n * @param link url\n * @param target blank or self\n */\nexport function windowOpen(link, target) {\n  /* global window */\n  if (target === '_blank' || target === 'blank') {\n    var blank = window.open();\n    blank.opener = null;\n    blank.location.href = link;\n  } else {\n    window.open(link, target);\n  }\n}\nexport { getTextRect } from '../legacy/getTextRect.js';", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { SINGLE_REFERRING } from '../util/model.js';\nimport { error } from '../util/log.js';\n/**\n * FIXME:\n * `nonSeriesBoxCoordSysCreators` and `_nonSeriesBoxMasterList` are hardcoded implementations.\n * Regarding \"coord sys layout based on another coord sys\", currently we only exprimentally support one level\n * dpendency, such as, \"grid(cartesian)s can be laid out based on matrix/calendar coord sys.\"\n * But a comprehensive implementation may need to support:\n *  - Recursive dependencies. e.g., a matrix coord sys lays out based on another matrix coord sys.\n *    That requires in the implementation `create` and `update` of coord sys are called by a dependency graph.\n *    (@see enableTopologicalTravel in `util/component.ts`)\n */\nvar nonSeriesBoxCoordSysCreators = {};\nvar normalCoordSysCreators = {};\nvar CoordinateSystemManager = /** @class */function () {\n  function CoordinateSystemManager() {\n    this._normalMasterList = [];\n    this._nonSeriesBoxMasterList = [];\n  }\n  /**\n   * Typically,\n   *  - in `create`, a coord sys lays out based on a given rect;\n   *  - in `update`, update the pixel and data extent of there axes (if any) based on processed `series.data`.\n   * After that, a coord sys can serve (typically by `dataToPoint`/`dataToLayout`/`pointToData`).\n   * If the coordinate system do not lay out based on `series.data`, `update` is not needed.\n   */\n  CoordinateSystemManager.prototype.create = function (ecModel, api) {\n    this._nonSeriesBoxMasterList = dealCreate(nonSeriesBoxCoordSysCreators, true);\n    this._normalMasterList = dealCreate(normalCoordSysCreators, false);\n    function dealCreate(creatorMap, canBeNonSeriesBox) {\n      var coordinateSystems = [];\n      zrUtil.each(creatorMap, function (creator, type) {\n        var list = creator.create(ecModel, api);\n        coordinateSystems = coordinateSystems.concat(list || []);\n        if (process.env.NODE_ENV !== 'production') {\n          if (canBeNonSeriesBox) {\n            // Disallow `update` is a brutal way to ensure `_nonSeriesBoxMasterList`s are ready to\n            // serve after `create`. But if `update` has to be involved in `_nonSeriesBoxMasterList`\n            // for some future case, more complicated mechanisms need to be introduced.\n            zrUtil.each(list, function (master) {\n              return zrUtil.assert(!master.update);\n            });\n          }\n        }\n      });\n      return coordinateSystems;\n    }\n  };\n  /**\n   * @see CoordinateSystem['create']\n   */\n  CoordinateSystemManager.prototype.update = function (ecModel, api) {\n    zrUtil.each(this._normalMasterList, function (coordSys) {\n      coordSys.update && coordSys.update(ecModel, api);\n    });\n  };\n  CoordinateSystemManager.prototype.getCoordinateSystems = function () {\n    return this._normalMasterList.concat(this._nonSeriesBoxMasterList);\n  };\n  CoordinateSystemManager.register = function (type, creator) {\n    if (type === 'matrix' || type === 'calendar') {\n      // FIXME: hardcode, @see nonSeriesBoxCoordSysCreators\n      nonSeriesBoxCoordSysCreators[type] = creator;\n      return;\n    }\n    normalCoordSysCreators[type] = creator;\n  };\n  CoordinateSystemManager.get = function (type) {\n    return normalCoordSysCreators[type] || nonSeriesBoxCoordSysCreators[type];\n  };\n  return CoordinateSystemManager;\n}();\nfunction canBeNonSeriesBoxCoordSys(coordSysType) {\n  return !!nonSeriesBoxCoordSysCreators[coordSysType];\n}\nexport var BoxCoordinateSystemCoordFrom = {\n  // By default fetch coord from `model.get('coord')`.\n  coord: 1,\n  // Some model/series, such as pie, is allowed to also get coord from `model.get('center')`,\n  // if cannot get from `model.get('coord')`. But historically pie use `center` option, but\n  // geo use `layoutCenter` option to specify layout center; they are not able to be unified.\n  // Therefor it is not recommended.\n  coord2: 2\n};\n/**\n * @see_also `createBoxLayoutReference`\n * @see_also `injectCoordSysByOption`\n */\nexport function registerLayOutOnCoordSysUsage(opt) {\n  if (process.env.NODE_ENV !== 'production') {\n    zrUtil.assert(!coordSysUseMap.get(opt.fullType));\n  }\n  coordSysUseMap.set(opt.fullType, {\n    getCoord2: undefined\n  }).getCoord2 = opt.getCoord2;\n}\nvar coordSysUseMap = zrUtil.createHashMap();\n/**\n * @return Be an object, but never be NullUndefined.\n */\nexport function getCoordForBoxCoordSys(model) {\n  var coord = model.getShallow('coord', true);\n  var from = BoxCoordinateSystemCoordFrom.coord;\n  if (coord == null) {\n    var store = coordSysUseMap.get(model.type);\n    if (store && store.getCoord2) {\n      from = BoxCoordinateSystemCoordFrom.coord2;\n      coord = store.getCoord2(model);\n    }\n  }\n  return {\n    coord: coord,\n    from: from\n  };\n}\n/**\n * - \"dataCoordSys\": each data item is laid out based on a coord sys.\n * - \"boxCoordSys\": the overall bounding rect or anchor point is calculated based on a coord sys.\n *   e.g.,\n *      grid rect (cartesian rect) is calculate based on matrix/calendar coord sys;\n *      pie center is calculated based on calendar/cartesian;\n *\n * The default value (if not declared in option `coordinateSystemUsage`):\n *  For series, use `dataCoordSys`, since this is the most case and backward compatible.\n *  For non-series components, use `boxCoordSys`, since `dataCoordSys` is not applicable.\n */\nexport var CoordinateSystemUsageKind = {\n  none: 0,\n  dataCoordSys: 1,\n  boxCoordSys: 2\n};\nexport function decideCoordSysUsageKind(\n// Component or series\nmodel, printError) {\n  // For backward compat, still not use `true` in model.get.\n  var coordSysType = model.getShallow('coordinateSystem');\n  var coordSysUsageOption = model.getShallow('coordinateSystemUsage', true);\n  var isDeclaredExplicitly = coordSysUsageOption != null;\n  var kind = CoordinateSystemUsageKind.none;\n  if (coordSysType) {\n    var isSeries = model.mainType === 'series';\n    if (coordSysUsageOption == null) {\n      coordSysUsageOption = isSeries ? 'data' : 'box';\n    }\n    if (coordSysUsageOption === 'data') {\n      kind = CoordinateSystemUsageKind.dataCoordSys;\n      if (!isSeries) {\n        if (process.env.NODE_ENV !== 'production') {\n          if (isDeclaredExplicitly && printError) {\n            error('coordinateSystemUsage \"data\" is not supported in non-series components.');\n          }\n        }\n        kind = CoordinateSystemUsageKind.none;\n      }\n    } else if (coordSysUsageOption === 'box') {\n      kind = CoordinateSystemUsageKind.boxCoordSys;\n      if (!isSeries && !canBeNonSeriesBoxCoordSys(coordSysType)) {\n        if (process.env.NODE_ENV !== 'production') {\n          if (isDeclaredExplicitly && printError) {\n            error(\"coordinateSystem \\\"\" + coordSysType + \"\\\" cannot be used\" + (\" as coordinateSystemUsage \\\"box\\\" for \\\"\" + model.type + \"\\\" yet.\"));\n          }\n        }\n        kind = CoordinateSystemUsageKind.none;\n      }\n    }\n  }\n  return {\n    coordSysType: coordSysType,\n    kind: kind\n  };\n}\n/**\n * These cases are considered:\n *  (A) Most series can use only \"dataCoordSys\", but \"boxCoordSys\" is not applicable:\n *    - e.g., series.heatmap, series.line, series.bar, series.scatter, ...\n *  (B) Some series and most components can use only \"boxCoordSys\", but \"dataCoordSys\" is not applicable:\n *    - e.g., series.pie, series.funnel, ...\n *    - e.g., grid, polar, geo, title, ...\n *  (C) Several series can use both \"boxCoordSys\" and \"dataCoordSys\", even at the same time:\n *    - e.g., series.graph, series.map\n *      - If graph or map series use a \"boxCoordSys\", it creates a internal \"dataCoordSys\" to lay out its data.\n *      - Graph series can use matrix coord sys as either the \"dataCoordSys\" (each item layout on one cell)\n *        or \"boxCoordSys\" (the entire series are layout within one cell).\n *    - To achieve this effect,\n *      `series.coordinateSystemUsage: 'box'` needs to be specified explicitly.\n *\n * Check these echarts option settings:\n *  - If `series: {type: 'bar'}`:\n *      dataCoordSys: \"cartesian2d\", boxCoordSys: \"none\".\n *      (since `coordinateSystem: 'cartesian2d'` is the default option in bar.)\n *  - If `grid: {coordinateSystem: 'matrix'}`\n *      dataCoordSys: \"none\", boxCoordSys: \"matrix\".\n *  - If `series: {type: 'pie', coordinateSystem: 'matrix'}`:\n *      dataCoordSys: \"none\", boxCoordSys: \"matrix\".\n *      (since `coordinateSystemUsage: 'box'` is the default option in pie.)\n *  - If `series: {type: 'graph', coordinateSystem: 'matrix'}`:\n *      dataCoordSys: \"matrix\", boxCoordSys: \"none\"\n *  - If `series: {type: 'graph', coordinateSystem: 'matrix', coordinateSystemUsage: 'box'}`:\n *      dataCoordSys: \"an internal view\", boxCoordSys: \"the internal view is laid out on a matrix\"\n *  - If `series: {type: 'map'}`:\n *      dataCoordSys: \"a internal geo\", boxCoordSys: \"none\"\n *  - If `series: {type: 'map', coordinateSystem: 'geo', geoIndex: 0}`:\n *      dataCoordSys: \"a geo\", boxCoordSys: \"none\"\n *  - If `series: {type: 'map', coordinateSystem: 'matrix'}`:\n *      not_applicable\n *  - If `series: {type: 'map', coordinateSystem: 'matrix', coordinateSystemUsage: 'box'}`:\n *      dataCoordSys: \"an internal geo\", boxCoordSys: \"the internal geo is laid out on a matrix\"\n *\n * @usage\n * For case (A) & (B),\n *  call `injectCoordSysByOption({coordSysType: 'aaa', ...})` once for each series/components.\n * For case (C),\n *  call `injectCoordSysByOption({coordSysType: 'aaa', ...})` once for each series/components,\n *  and then call `injectCoordSysByOption({coordSysType: 'bbb', ..., isDefaultDataCoordSys: true})`\n *  once for each series/components.\n *\n * @return Whether injected.\n */\nexport function injectCoordSysByOption(opt) {\n  var targetModel = opt.targetModel,\n    coordSysType = opt.coordSysType,\n    coordSysProvider = opt.coordSysProvider,\n    isDefaultDataCoordSys = opt.isDefaultDataCoordSys,\n    allowNotFound = opt.allowNotFound;\n  if (process.env.NODE_ENV !== 'production') {\n    zrUtil.assert(!!coordSysType);\n  }\n  var _a = decideCoordSysUsageKind(targetModel, true),\n    kind = _a.kind,\n    declaredType = _a.coordSysType;\n  if (isDefaultDataCoordSys && kind !== CoordinateSystemUsageKind.dataCoordSys) {\n    // If both dataCoordSys and boxCoordSys declared in one model.\n    // There is the only case in series-graph, and no other cases yet.\n    kind = CoordinateSystemUsageKind.dataCoordSys;\n    declaredType = coordSysType;\n  }\n  if (kind === CoordinateSystemUsageKind.none || declaredType !== coordSysType) {\n    return false;\n  }\n  var coordSys = coordSysProvider(coordSysType, targetModel);\n  if (!coordSys) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!allowNotFound) {\n        error(coordSysType + \" cannot be found for\" + (\" \" + targetModel.type + \" (index: \" + targetModel.componentIndex + \").\"));\n      }\n    }\n    return false;\n  }\n  if (kind === CoordinateSystemUsageKind.dataCoordSys) {\n    if (process.env.NODE_ENV !== 'production') {\n      zrUtil.assert(targetModel.mainType === 'series');\n    }\n    targetModel.coordinateSystem = coordSys;\n  } else {\n    // kind === 'boxCoordSys'\n    targetModel.boxCoordinateSystem = coordSys;\n  }\n  return true;\n}\nexport var simpleCoordSysInjectionProvider = function (coordSysType, injectTargetModel) {\n  var coordSysModel = injectTargetModel.getReferringComponents(coordSysType, SINGLE_REFERRING).models[0];\n  return coordSysModel && coordSysModel.coordinateSystem;\n};\nexport default CoordinateSystemManager;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// Layout helpers for each component positioning\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { parsePercent } from './number.js';\nimport * as formatUtil from './format.js';\nimport { error } from './log.js';\nimport { BoxCoordinateSystemCoordFrom, getCoordForBoxCoordSys } from '../core/CoordinateSystem.js';\nvar each = zrUtil.each;\n/**\n * @public\n */\nexport var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height'];\n/**\n * @public\n */\nexport var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']];\nfunction boxLayout(orient, group, gap, maxWidth, maxHeight) {\n  var x = 0;\n  var y = 0;\n  if (maxWidth == null) {\n    maxWidth = Infinity;\n  }\n  if (maxHeight == null) {\n    maxHeight = Infinity;\n  }\n  var currentLineMaxSize = 0;\n  group.eachChild(function (child, idx) {\n    var rect = child.getBoundingRect();\n    var nextChild = group.childAt(idx + 1);\n    var nextChildRect = nextChild && nextChild.getBoundingRect();\n    var nextX;\n    var nextY;\n    if (orient === 'horizontal') {\n      var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0);\n      nextX = x + moveX;\n      // Wrap when width exceeds maxWidth or meet a `newline` group\n      // FIXME compare before adding gap?\n      if (nextX > maxWidth || child.newline) {\n        x = 0;\n        nextX = moveX;\n        y += currentLineMaxSize + gap;\n        currentLineMaxSize = rect.height;\n      } else {\n        // FIXME: consider rect.y is not `0`?\n        currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);\n      }\n    } else {\n      var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0);\n      nextY = y + moveY;\n      // Wrap when width exceeds maxHeight or meet a `newline` group\n      if (nextY > maxHeight || child.newline) {\n        x += currentLineMaxSize + gap;\n        y = 0;\n        nextY = moveY;\n        currentLineMaxSize = rect.width;\n      } else {\n        currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);\n      }\n    }\n    if (child.newline) {\n      return;\n    }\n    child.x = x;\n    child.y = y;\n    child.markRedraw();\n    orient === 'horizontal' ? x = nextX + gap : y = nextY + gap;\n  });\n}\n/**\n * VBox or HBox layouting\n * @param {string} orient\n * @param {module:zrender/graphic/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\nexport var box = boxLayout;\n/**\n * VBox layouting\n * @param {module:zrender/graphic/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\nexport var vbox = zrUtil.curry(boxLayout, 'vertical');\n/**\n * HBox layouting\n * @param {module:zrender/graphic/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\nexport var hbox = zrUtil.curry(boxLayout, 'horizontal');\nexport function getBoxLayoutParams(boxLayoutModel, ignoreParent) {\n  return {\n    left: boxLayoutModel.getShallow('left', ignoreParent),\n    top: boxLayoutModel.getShallow('top', ignoreParent),\n    right: boxLayoutModel.getShallow('right', ignoreParent),\n    bottom: boxLayoutModel.getShallow('bottom', ignoreParent),\n    width: boxLayoutModel.getShallow('width', ignoreParent),\n    height: boxLayoutModel.getShallow('height', ignoreParent)\n  };\n}\nfunction getViewRectAndCenterForCircleLayout(seriesModel, api) {\n  var layoutRef = createBoxLayoutReference(seriesModel, api, {\n    enableLayoutOnlyByCenter: true\n  });\n  var boxLayoutParams = seriesModel.getBoxLayoutParams();\n  var viewRect;\n  var center;\n  if (layoutRef.type === BoxLayoutReferenceType.point) {\n    center = layoutRef.refPoint;\n    // `viewRect` is required in `pie/labelLayout.ts`.\n    viewRect = getLayoutRect(boxLayoutParams, {\n      width: api.getWidth(),\n      height: api.getHeight()\n    });\n  } else {\n    // layoutRef.type === layout.BoxLayoutReferenceType.rect\n    var centerOption = seriesModel.get('center');\n    var centerOptionArr = zrUtil.isArray(centerOption) ? centerOption : [centerOption, centerOption];\n    viewRect = getLayoutRect(boxLayoutParams, layoutRef.refContainer);\n    center = layoutRef.boxCoordFrom === BoxCoordinateSystemCoordFrom.coord2 ? layoutRef.refPoint // option `series.center` has been used as coord.\n    : [parsePercent(centerOptionArr[0], viewRect.width) + viewRect.x, parsePercent(centerOptionArr[1], viewRect.height) + viewRect.y];\n  }\n  return {\n    viewRect: viewRect,\n    center: center\n  };\n}\nexport function getCircleLayout(seriesModel, api) {\n  // center can be string or number when coordinateSystem is specified\n  var _a = getViewRectAndCenterForCircleLayout(seriesModel, api),\n    viewRect = _a.viewRect,\n    center = _a.center;\n  var radius = seriesModel.get('radius');\n  if (!zrUtil.isArray(radius)) {\n    radius = [0, radius];\n  }\n  var width = parsePercent(viewRect.width, api.getWidth());\n  var height = parsePercent(viewRect.height, api.getHeight());\n  var size = Math.min(width, height);\n  var r0 = parsePercent(radius[0], size / 2);\n  var r = parsePercent(radius[1], size / 2);\n  return {\n    cx: center[0],\n    cy: center[1],\n    r0: r0,\n    r: r,\n    viewRect: viewRect\n  };\n}\n/**\n * Parse position info.\n */\nexport function getLayoutRect(positionInfo, containerRect,\n// This is the space from the `containerRect` to the returned bounding rect.\n// Commonly used in option `legend.padding`, `timeline.padding`, `title.padding`,\n//  `visualMap.padding`, ...\n// [NOTICE]:\n//  It's named `margin`, because it's the space that outside the bounding rect. But from\n//  the perspective of the the caller, it's commonly used as the `padding` of a component,\n//  because conventionally background color covers this space.\n// [BEHAVIOR]:\n//  - If width/height is specified, `margin` does not effect them.\n//  - Otherwise, they are calculated based on the rect that `containerRect` shrinked by `margin`.\n//  - left/right/top/bottom are based on the rect that `containerRect` shrinked by `margin`.\nmargin) {\n  margin = formatUtil.normalizeCssArray(margin || 0);\n  var containerWidth = containerRect.width;\n  var containerHeight = containerRect.height;\n  var left = parsePercent(positionInfo.left, containerWidth);\n  var top = parsePercent(positionInfo.top, containerHeight);\n  var right = parsePercent(positionInfo.right, containerWidth);\n  var bottom = parsePercent(positionInfo.bottom, containerHeight);\n  var width = parsePercent(positionInfo.width, containerWidth);\n  var height = parsePercent(positionInfo.height, containerHeight);\n  var verticalMargin = margin[2] + margin[0];\n  var horizontalMargin = margin[1] + margin[3];\n  var aspect = positionInfo.aspect;\n  // If width is not specified, calculate width from left and right\n  if (isNaN(width)) {\n    width = containerWidth - right - horizontalMargin - left;\n  }\n  if (isNaN(height)) {\n    height = containerHeight - bottom - verticalMargin - top;\n  }\n  if (aspect != null) {\n    // If width and height are not given\n    // 1. Graph should not exceeds the container\n    // 2. Aspect must be keeped\n    // 3. Graph should take the space as more as possible\n    // FIXME\n    // Margin is not considered, because there is no case that both\n    // using margin and aspect so far.\n    if (isNaN(width) && isNaN(height)) {\n      // PENDING: if only `left` or `right` is defined, perhaps it's more preferable to\n      // calculate size based on `containerWidth - left` or `containerWidth - left` here,\n      // but for backward compatibility we do not change it.\n      if (aspect > containerWidth / containerHeight) {\n        width = containerWidth * 0.8;\n      } else {\n        height = containerHeight * 0.8;\n      }\n    }\n    // Calculate width or height with given aspect\n    if (isNaN(width)) {\n      width = aspect * height;\n    }\n    if (isNaN(height)) {\n      height = width / aspect;\n    }\n  }\n  // If left is not specified, calculate left from right and width\n  if (isNaN(left)) {\n    left = containerWidth - right - width - horizontalMargin;\n  }\n  if (isNaN(top)) {\n    top = containerHeight - bottom - height - verticalMargin;\n  }\n  // Align left and top\n  switch (positionInfo.left || positionInfo.right) {\n    case 'center':\n      left = containerWidth / 2 - width / 2 - margin[3];\n      break;\n    case 'right':\n      left = containerWidth - width - horizontalMargin;\n      break;\n  }\n  switch (positionInfo.top || positionInfo.bottom) {\n    case 'middle':\n    case 'center':\n      top = containerHeight / 2 - height / 2 - margin[0];\n      break;\n    case 'bottom':\n      top = containerHeight - height - verticalMargin;\n      break;\n  }\n  // If something is wrong and left, top, width, height are calculated as NaN\n  left = left || 0;\n  top = top || 0;\n  if (isNaN(width)) {\n    // Width may be NaN if only one value is given except width\n    width = containerWidth - horizontalMargin - left - (right || 0);\n  }\n  if (isNaN(height)) {\n    // Height may be NaN if only one value is given except height\n    height = containerHeight - verticalMargin - top - (bottom || 0);\n  }\n  var rect = new BoundingRect((containerRect.x || 0) + left + margin[3], (containerRect.y || 0) + top + margin[0], width, height);\n  rect.margin = margin;\n  return rect;\n}\n/**\n * PENDING:\n *  when preserveAspect: 'cover' and aspect is near Infinity\n *  or when preserveAspect: 'contain' and aspect is near 0,\n *  the result width or height is near Inifity. It's logically correct,\n *  Therefore currently we do not handle it, until bad cases arise.\n */\nexport function applyPreserveAspect(component, layoutRect,\n// That is, `width / height`.\n// Assume `aspect` is positive.\naspect) {\n  var preserveAspect = component.getShallow('preserveAspect', true);\n  if (!preserveAspect) {\n    return layoutRect;\n  }\n  var actualAspect = layoutRect.width / layoutRect.height;\n  if (Math.abs(Math.atan(aspect) - Math.atan(actualAspect)) < 1e-9) {\n    return layoutRect;\n  }\n  var preserveAspectAlign = component.getShallow('preserveAspectAlign', true);\n  var preserveAspectVerticalAlign = component.getShallow('preserveAspectVerticalAlign', true);\n  var layoutOptInner = {\n    width: layoutRect.width,\n    height: layoutRect.height\n  };\n  var isCover = preserveAspect === 'cover';\n  if (actualAspect > aspect && !isCover || actualAspect < aspect && isCover) {\n    layoutOptInner.width = layoutRect.height * aspect;\n    preserveAspectAlign === 'left' ? layoutOptInner.left = 0 : preserveAspectAlign === 'right' ? layoutOptInner.right = 0 : layoutOptInner.left = 'center';\n  } else {\n    layoutOptInner.height = layoutRect.width / aspect;\n    preserveAspectVerticalAlign === 'top' ? layoutOptInner.top = 0 : preserveAspectVerticalAlign === 'bottom' ? layoutOptInner.bottom = 0 : layoutOptInner.top = 'middle';\n  }\n  return getLayoutRect(layoutOptInner, layoutRect);\n}\nexport var BoxLayoutReferenceType = {\n  rect: 1,\n  point: 2\n};\n/**\n * Uniformly calculate layout reference (rect or center) based on either:\n *  - viewport:\n *      - Get `refContainer` as `{x: 0, y: 0, width: api.getWidth(), height: api.getHeight()}`\n *  - coordinate system, which can serve in several ways:\n *      - Use `dataToPoint` to get the `refPoint`, such as, in cartesian2d coord sys.\n *      - Use `dataToLayout` to get the `refContainer`, such as, in matrix coord sys.\n */\nexport function createBoxLayoutReference(model, api, opt) {\n  var refContainer;\n  var refPoint;\n  var layoutRefType;\n  var boxCoordSys = model.boxCoordinateSystem;\n  var boxCoordFrom;\n  if (boxCoordSys) {\n    var _a = getCoordForBoxCoordSys(model),\n      coord = _a.coord,\n      from = _a.from;\n    // Do not use `clamp` in `dataToLayout` and `dataToPoint`, because:\n    //  1. Should support overflow (such as, by dataZoom), where NaN should be in the result.\n    //  2. Be consistent with the way used in `series.data`\n    if (boxCoordSys.dataToLayout) {\n      layoutRefType = BoxLayoutReferenceType.rect;\n      boxCoordFrom = from;\n      var result = boxCoordSys.dataToLayout(coord);\n      refContainer = result.contentRect || result.rect;\n    } else if (opt && opt.enableLayoutOnlyByCenter && boxCoordSys.dataToPoint) {\n      layoutRefType = BoxLayoutReferenceType.point;\n      boxCoordFrom = from;\n      refPoint = boxCoordSys.dataToPoint(coord);\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        error(model.type + \"[\" + model.componentIndex + \"]\" + (\" layout based on \" + boxCoordSys.type + \" is not supported.\"));\n      }\n    }\n  }\n  if (layoutRefType == null) {\n    layoutRefType = BoxLayoutReferenceType.rect;\n  }\n  if (layoutRefType === BoxLayoutReferenceType.rect) {\n    if (!refContainer) {\n      refContainer = {\n        x: 0,\n        y: 0,\n        width: api.getWidth(),\n        height: api.getHeight()\n      };\n    }\n    refPoint = [refContainer.x + refContainer.width / 2, refContainer.y + refContainer.height / 2];\n  }\n  return {\n    type: layoutRefType,\n    refContainer: refContainer,\n    refPoint: refPoint,\n    boxCoordFrom: boxCoordFrom\n  };\n}\n/**\n * Position a zr element in viewport\n *  Group position is specified by either\n *  {left, top}, {right, bottom}\n *  If all properties exists, right and bottom will be igonred.\n *\n * Logic:\n *     1. Scale (against origin point in parent coord)\n *     2. Rotate (against origin point in parent coord)\n *     3. Translate (with el.position by this method)\n * So this method only fixes the last step 'Translate', which does not affect\n * scaling and rotating.\n *\n * If be called repeatedly with the same input el, the same result will be gotten.\n *\n * Return true if the layout happened.\n *\n * @param el Should have `getBoundingRect` method.\n * @param positionInfo\n * @param positionInfo.left\n * @param positionInfo.top\n * @param positionInfo.right\n * @param positionInfo.bottom\n * @param positionInfo.width Only for opt.boundingModel: 'raw'\n * @param positionInfo.height Only for opt.boundingModel: 'raw'\n * @param containerRect\n * @param margin\n * @param opt\n * @param opt.hv Only horizontal or only vertical. Default to be [1, 1]\n * @param opt.boundingMode\n *        Specify how to calculate boundingRect when locating.\n *        'all': Position the boundingRect that is transformed and uioned\n *               both itself and its descendants.\n *               This mode simplies confine the elements in the bounding\n *               of their container (e.g., using 'right: 0').\n *        'raw': Position the boundingRect that is not transformed and only itself.\n *               This mode is useful when you want a element can overflow its\n *               container. (Consider a rotated circle needs to be located in a corner.)\n *               In this mode positionInfo.width/height can only be number.\n */\nexport function positionElement(el, positionInfo, containerRect, margin, opt, out) {\n  var h = !opt || !opt.hv || opt.hv[0];\n  var v = !opt || !opt.hv || opt.hv[1];\n  var boundingMode = opt && opt.boundingMode || 'all';\n  out = out || el;\n  out.x = el.x;\n  out.y = el.y;\n  if (!h && !v) {\n    return false;\n  }\n  var rect;\n  if (boundingMode === 'raw') {\n    rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect();\n  } else {\n    rect = el.getBoundingRect();\n    if (el.needLocalTransform()) {\n      var transform = el.getLocalTransform();\n      // Notice: raw rect may be inner object of el,\n      // which should not be modified.\n      rect = rect.clone();\n      rect.applyTransform(transform);\n    }\n  }\n  // The real width and height can not be specified but calculated by the given el.\n  var layoutRect = getLayoutRect(zrUtil.defaults({\n    width: rect.width,\n    height: rect.height\n  }, positionInfo), containerRect, margin);\n  // Because 'tranlate' is the last step in transform\n  // (see zrender/core/Transformable#getLocalTransform),\n  // we can just only modify el.position to get final result.\n  var dx = h ? layoutRect.x - rect.x : 0;\n  var dy = v ? layoutRect.y - rect.y : 0;\n  if (boundingMode === 'raw') {\n    out.x = dx;\n    out.y = dy;\n  } else {\n    out.x += dx;\n    out.y += dy;\n  }\n  if (out === el) {\n    el.markRedraw();\n  }\n  return true;\n}\n/**\n * @param option Contains some of the properties in HV_NAMES.\n * @param hvIdx 0: horizontal; 1: vertical.\n */\nexport function sizeCalculable(option, hvIdx) {\n  return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null;\n}\nexport function fetchLayoutMode(ins) {\n  var layoutMode = ins.layoutMode || ins.constructor.layoutMode;\n  return zrUtil.isObject(layoutMode) ? layoutMode : layoutMode ? {\n    type: layoutMode\n  } : null;\n}\n/**\n * Consider Case:\n * When default option has {left: 0, width: 100}, and we set {right: 0}\n * through setOption or media query, using normal zrUtil.merge will cause\n * {right: 0} does not take effect.\n *\n * @example\n * ComponentModel.extend({\n *     init: function () {\n *         ...\n *         let inputPositionParams = layout.getLayoutParams(option);\n *         this.mergeOption(inputPositionParams);\n *     },\n *     mergeOption: function (newOption) {\n *         newOption && zrUtil.merge(thisOption, newOption, true);\n *         layout.mergeLayoutParam(thisOption, newOption);\n *     }\n * });\n *\n * @param targetOption\n * @param newOption\n * @param opt\n */\nexport function mergeLayoutParam(targetOption, newOption, opt) {\n  var ignoreSize = opt && opt.ignoreSize;\n  !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);\n  var hResult = merge(HV_NAMES[0], 0);\n  var vResult = merge(HV_NAMES[1], 1);\n  copy(HV_NAMES[0], targetOption, hResult);\n  copy(HV_NAMES[1], targetOption, vResult);\n  function merge(names, hvIdx) {\n    var newParams = {};\n    var newValueCount = 0;\n    var merged = {};\n    var mergedValueCount = 0;\n    var enoughParamNumber = 2;\n    each(names, function (name) {\n      merged[name] = targetOption[name];\n    });\n    each(names, function (name) {\n      // Consider case: newOption.width is null, which is\n      // set by user for removing width setting.\n      zrUtil.hasOwn(newOption, name) && (newParams[name] = merged[name] = newOption[name]);\n      hasValue(newParams, name) && newValueCount++;\n      hasValue(merged, name) && mergedValueCount++;\n    });\n    if (ignoreSize[hvIdx]) {\n      // Only one of left/right is premitted to exist.\n      if (hasValue(newOption, names[1])) {\n        merged[names[2]] = null;\n      } else if (hasValue(newOption, names[2])) {\n        merged[names[1]] = null;\n      }\n      return merged;\n    }\n    // Case: newOption: {width: ..., right: ...},\n    // or targetOption: {right: ...} and newOption: {width: ...},\n    // There is no conflict when merged only has params count\n    // little than enoughParamNumber.\n    if (mergedValueCount === enoughParamNumber || !newValueCount) {\n      return merged;\n    }\n    // Case: newOption: {width: ..., right: ...},\n    // Than we can make sure user only want those two, and ignore\n    // all origin params in targetOption.\n    else if (newValueCount >= enoughParamNumber) {\n      return newParams;\n    } else {\n      // Chose another param from targetOption by priority.\n      for (var i = 0; i < names.length; i++) {\n        var name_1 = names[i];\n        if (!zrUtil.hasOwn(newParams, name_1) && zrUtil.hasOwn(targetOption, name_1)) {\n          newParams[name_1] = targetOption[name_1];\n          break;\n        }\n      }\n      return newParams;\n    }\n  }\n  function hasValue(obj, name) {\n    return obj[name] != null && obj[name] !== 'auto';\n  }\n  function copy(names, target, source) {\n    each(names, function (name) {\n      target[name] = source[name];\n    });\n  }\n}\n/**\n * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.\n */\nexport function getLayoutParams(source) {\n  return copyLayoutParams({}, source);\n}\n/**\n * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.\n * @param {Object} source\n * @return {Object} Result contains those props.\n */\nexport function copyLayoutParams(target, source) {\n  source && target && each(LOCATION_PARAMS, function (name) {\n    zrUtil.hasOwn(source, name) && (target[name] = source[name]);\n  });\n  return target;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Model from './Model.js';\nimport * as componentUtil from '../util/component.js';\nimport { enableClassManagement, parseClassType, isExtendedClass, mountExtend } from '../util/clazz.js';\nimport { makeInner, queryReferringComponents } from '../util/model.js';\nimport * as layout from '../util/layout.js';\nvar inner = makeInner();\nvar ComponentModel = /** @class */function (_super) {\n  __extends(ComponentModel, _super);\n  function ComponentModel(option, parentModel, ecModel) {\n    var _this = _super.call(this, option, parentModel, ecModel) || this;\n    _this.uid = componentUtil.getUID('ec_cpt_model');\n    return _this;\n  }\n  ComponentModel.prototype.init = function (option, parentModel, ecModel) {\n    this.mergeDefaultAndTheme(option, ecModel);\n  };\n  ComponentModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n    var layoutMode = layout.fetchLayoutMode(this);\n    var inputPositionParams = layoutMode ? layout.getLayoutParams(option) : {};\n    var themeModel = ecModel.getTheme();\n    zrUtil.merge(option, themeModel.get(this.mainType));\n    zrUtil.merge(option, this.getDefaultOption());\n    if (layoutMode) {\n      layout.mergeLayoutParam(option, inputPositionParams, layoutMode);\n    }\n  };\n  ComponentModel.prototype.mergeOption = function (option, ecModel) {\n    zrUtil.merge(this.option, option, true);\n    var layoutMode = layout.fetchLayoutMode(this);\n    if (layoutMode) {\n      layout.mergeLayoutParam(this.option, option, layoutMode);\n    }\n  };\n  /**\n   * Called immediately after `init` or `mergeOption` of this instance called.\n   */\n  ComponentModel.prototype.optionUpdated = function (newCptOption, isInit) {};\n  /**\n   * [How to declare defaultOption]:\n   *\n   * (A) If using class declaration in typescript (since echarts 5):\n   * ```ts\n   * import {ComponentOption} from '../model/option.js';\n   * export interface XxxOption extends ComponentOption {\n   *     aaa: number\n   * }\n   * export class XxxModel extends Component {\n   *     static type = 'xxx';\n   *     static defaultOption: XxxOption = {\n   *         aaa: 123\n   *     }\n   * }\n   * Component.registerClass(XxxModel);\n   * ```\n   * ```ts\n   * import {inheritDefaultOption} from '../util/component.js';\n   * import {XxxModel, XxxOption} from './XxxModel.js';\n   * export interface XxxSubOption extends XxxOption {\n   *     bbb: number\n   * }\n   * class XxxSubModel extends XxxModel {\n   *     static defaultOption: XxxSubOption = inheritDefaultOption(XxxModel.defaultOption, {\n   *         bbb: 456\n   *     })\n   *     fn() {\n   *         let opt = this.getDefaultOption();\n   *         // opt is {aaa: 123, bbb: 456}\n   *     }\n   * }\n   * ```\n   *\n   * (B) If using class extend (previous approach in echarts 3 & 4):\n   * ```js\n   * let XxxComponent = Component.extend({\n   *     defaultOption: {\n   *         xx: 123\n   *     }\n   * })\n   * ```\n   * ```js\n   * let XxxSubComponent = XxxComponent.extend({\n   *     defaultOption: {\n   *         yy: 456\n   *     },\n   *     fn: function () {\n   *         let opt = this.getDefaultOption();\n   *         // opt is {xx: 123, yy: 456}\n   *     }\n   * })\n   * ```\n   */\n  ComponentModel.prototype.getDefaultOption = function () {\n    var ctor = this.constructor;\n    if (!isExtendedClass(ctor)) {\n      // When using ES class declaration, defaultOption must be declared as static.\n      // And manually inherit the defaultOption from its parent class if needed, such as,\n      //  ```ts\n      //  static defaultOption = inheritDefaultOption(ParentModel.defaultOption, {...});\n      //  ```\n      return ctor.defaultOption;\n    }\n    // FIXME: remove this approach?\n    // Legacy: auto merge defaultOption from ancestor classes if using ParentClass.extend(subProto)\n    var fields = inner(this);\n    if (!fields.defaultOption) {\n      var optList = [];\n      var clz = ctor;\n      while (clz) {\n        var opt = clz.prototype.defaultOption;\n        opt && optList.push(opt);\n        clz = clz.superClass;\n      }\n      var defaultOption = {};\n      for (var i = optList.length - 1; i >= 0; i--) {\n        defaultOption = zrUtil.merge(defaultOption, optList[i], true);\n      }\n      fields.defaultOption = defaultOption;\n    }\n    return fields.defaultOption;\n  };\n  /**\n   * Notice: always force to input param `useDefault` in case that forget to consider it.\n   * The same behavior as `modelUtil.parseFinder`.\n   *\n   * @param useDefault In many cases like series refer axis and axis refer grid,\n   *        If axis index / axis id not specified, use the first target as default.\n   *        In other cases like dataZoom refer axis, if not specified, measn no refer.\n   */\n  ComponentModel.prototype.getReferringComponents = function (mainType, opt) {\n    var indexKey = mainType + 'Index';\n    var idKey = mainType + 'Id';\n    return queryReferringComponents(this.ecModel, mainType, {\n      index: this.get(indexKey, true),\n      id: this.get(idKey, true)\n    }, opt);\n  };\n  ComponentModel.prototype.getBoxLayoutParams = function () {\n    // Consider itself having box layout configs.\n    // For backward compatibility, by default do not `ignoreParent`.\n    return layout.getBoxLayoutParams(this, false);\n  };\n  /**\n   * Get key for zlevel.\n   * If developers don't configure zlevel. We will assign zlevel to series based on the key.\n   * For example, lines with trail effect and progressive series will in an individual zlevel.\n   */\n  ComponentModel.prototype.getZLevelKey = function () {\n    return '';\n  };\n  ComponentModel.prototype.setZLevel = function (zlevel) {\n    this.option.zlevel = zlevel;\n  };\n  ComponentModel.protoInitialize = function () {\n    var proto = ComponentModel.prototype;\n    proto.type = 'component';\n    proto.id = '';\n    proto.name = '';\n    proto.mainType = '';\n    proto.subType = '';\n    proto.componentIndex = 0;\n  }();\n  return ComponentModel;\n}(Model);\nmountExtend(ComponentModel, Model);\nenableClassManagement(ComponentModel);\ncomponentUtil.enableSubTypeDefaulter(ComponentModel);\ncomponentUtil.enableTopologicalTravel(ComponentModel, getDependencies);\nfunction getDependencies(componentType) {\n  var deps = [];\n  zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (clz) {\n    deps = deps.concat(clz.dependencies || clz.prototype.dependencies || []);\n  });\n  // Ensure main type.\n  deps = zrUtil.map(deps, function (type) {\n    return parseClassType(type).main;\n  });\n  // Hack dataset for convenience.\n  if (componentType !== 'dataset' && zrUtil.indexOf(deps, 'dataset') <= 0) {\n    deps.unshift('dataset');\n  }\n  return deps;\n}\nexport default ComponentModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend } from 'zrender/lib/core/util.js';\nimport { modifyHSL } from 'zrender/lib/tool/color.js';\nvar tokens = {\n  color: {},\n  darkColor: {},\n  size: {}\n};\nvar color = tokens.color = {\n  theme: ['#5070dd', '#b6d634', '#505372', '#ff994d', '#0ca8df', '#ffd10a', '#fb628b', '#785db0', '#3fbe95'],\n  neutral00: '#fff',\n  neutral05: '#f4f7fd',\n  neutral10: '#e8ebf0',\n  neutral15: '#dbdee4',\n  neutral20: '#cfd2d7',\n  neutral25: '#c3c5cb',\n  neutral30: '#b7b9be',\n  neutral35: '#aaacb2',\n  neutral40: '#9ea0a5',\n  neutral45: '#929399',\n  neutral50: '#86878c',\n  neutral55: '#797b7f',\n  neutral60: '#6d6e73',\n  neutral65: '#616266',\n  neutral70: '#54555a',\n  neutral75: '#48494d',\n  neutral80: '#3c3c41',\n  neutral85: '#303034',\n  neutral90: '#232328',\n  neutral95: '#17171b',\n  neutral99: '#000',\n  accent05: '#eff1f9',\n  accent10: '#e0e4f2',\n  accent15: '#d0d6ec',\n  accent20: '#c0c9e6',\n  accent25: '#b1bbdf',\n  accent30: '#a1aed9',\n  accent35: '#91a0d3',\n  accent40: '#8292cc',\n  accent45: '#7285c6',\n  accent50: '#6578ba',\n  accent55: '#5c6da9',\n  accent60: '#536298',\n  accent65: '#4a5787',\n  accent70: '#404c76',\n  accent75: '#374165',\n  accent80: '#2e3654',\n  accent85: '#252b43',\n  accent90: '#1b2032',\n  accent95: '#121521',\n  transparent: 'rgba(0,0,0,0)',\n  highlight: 'rgba(255,231,130,0.8)'\n};\nextend(color, {\n  primary: color.neutral80,\n  secondary: color.neutral70,\n  tertiary: color.neutral60,\n  quaternary: color.neutral50,\n  disabled: color.neutral20,\n  border: color.neutral30,\n  borderTint: color.neutral20,\n  borderShade: color.neutral40,\n  background: color.neutral05,\n  backgroundTint: 'rgba(234,237,245,0.5)',\n  backgroundTransparent: 'rgba(255,255,255,0)',\n  backgroundShade: color.neutral10,\n  shadow: 'rgba(0,0,0,0.2)',\n  shadowTint: 'rgba(129,130,136,0.2)',\n  axisLine: color.neutral70,\n  axisLineTint: color.neutral40,\n  axisTick: color.neutral70,\n  axisTickMinor: color.neutral60,\n  axisLabel: color.neutral70,\n  axisSplitLine: color.neutral15,\n  axisMinorSplitLine: color.neutral05\n});\nfor (var key in color) {\n  if (color.hasOwnProperty(key)) {\n    var hex = color[key];\n    if (key === 'theme') {\n      // Don't modify theme colors.\n      tokens.darkColor.theme = color.theme.slice();\n    } else if (key === 'highlight') {\n      tokens.darkColor.highlight = 'rgba(255,231,130,0.4)';\n    } else if (key.indexOf('accent') === 0) {\n      // Desaturate and lighten accent colors.\n      tokens.darkColor[key] = modifyHSL(hex, null, function (s) {\n        return s * 0.5;\n      }, function (l) {\n        return Math.min(1, 1.3 - l);\n      });\n    } else {\n      tokens.darkColor[key] = modifyHSL(hex, null, function (s) {\n        return s * 0.9;\n      }, function (l) {\n        return 1 - Math.pow(l, 1.5);\n      });\n    }\n  }\n}\ntokens.size = {\n  xxs: 2,\n  xs: 5,\n  s: 10,\n  m: 15,\n  l: 20,\n  xl: 30,\n  xxl: 40,\n  xxxl: 50\n};\nexport default tokens;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { modifyHSL } from 'zrender/lib/tool/color.js';\nimport tokens from '../visual/tokens.js';\nvar platform = '';\n// Navigator not exists in node\nif (typeof navigator !== 'undefined') {\n  /* global navigator */\n  platform = navigator.platform || '';\n}\nvar decalColor = 'rgba(0, 0, 0, 0.2)';\nvar themeColor = tokens.color.theme[0];\nvar lightThemeColor = modifyHSL(themeColor, null, null, 0.9);\nexport default {\n  darkMode: 'auto',\n  // backgroundColor: 'rgba(0,0,0,0)',\n  colorBy: 'series',\n  color: tokens.color.theme,\n  gradientColor: [lightThemeColor, themeColor],\n  aria: {\n    decal: {\n      decals: [{\n        color: decalColor,\n        dashArrayX: [1, 0],\n        dashArrayY: [2, 5],\n        symbolSize: 1,\n        rotation: Math.PI / 6\n      }, {\n        color: decalColor,\n        symbol: 'circle',\n        dashArrayX: [[8, 8], [0, 8, 8, 0]],\n        dashArrayY: [6, 0],\n        symbolSize: 0.8\n      }, {\n        color: decalColor,\n        dashArrayX: [1, 0],\n        dashArrayY: [4, 3],\n        rotation: -Math.PI / 4\n      }, {\n        color: decalColor,\n        dashArrayX: [[6, 6], [0, 6, 6, 0]],\n        dashArrayY: [6, 0]\n      }, {\n        color: decalColor,\n        dashArrayX: [[1, 0], [1, 6]],\n        dashArrayY: [1, 0, 6, 0],\n        rotation: Math.PI / 4\n      }, {\n        color: decalColor,\n        symbol: 'triangle',\n        dashArrayX: [[9, 9], [0, 9, 9, 0]],\n        dashArrayY: [7, 2],\n        symbolSize: 0.75\n      }]\n    }\n  },\n  // If xAxis and yAxis declared, grid is created by default.\n  // grid: {},\n  textStyle: {\n    // color: '#000',\n    // decoration: 'none',\n    // PENDING\n    fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',\n    // fontFamily: 'Arial, Verdana, sans-serif',\n    fontSize: 12,\n    fontStyle: 'normal',\n    fontWeight: 'normal'\n  },\n  // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/\n  // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n  // Default is source-over\n  blendMode: null,\n  stateAnimation: {\n    duration: 300,\n    easing: 'cubicOut'\n  },\n  animation: 'auto',\n  animationDuration: 1000,\n  animationDurationUpdate: 500,\n  animationEasing: 'cubicInOut',\n  animationEasingUpdate: 'cubicInOut',\n  animationThreshold: 2000,\n  // Configuration for progressive/incremental rendering\n  progressiveThreshold: 3000,\n  progressive: 400,\n  // Threshold of if use single hover layer to optimize.\n  // It is recommended that `hoverLayerThreshold` is equivalent to or less than\n  // `progressiveThreshold`, otherwise hover will cause restart of progressive,\n  // which is unexpected.\n  // see example <echarts/test/heatmap-large.html>.\n  hoverLayerThreshold: 3000,\n  // See: module:echarts/scale/Time\n  useUTC: false\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap } from 'zrender/lib/core/util.js';\n;\n;\n;\nexport var VISUAL_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'itemGroupId', 'itemChildGroupId', 'seriesName']);\nexport var SOURCE_FORMAT_ORIGINAL = 'original';\nexport var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows';\nexport var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows';\nexport var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns';\nexport var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray';\nexport var SOURCE_FORMAT_UNKNOWN = 'unknown';\nexport var SERIES_LAYOUT_BY_COLUMN = 'column';\nexport var SERIES_LAYOUT_BY_ROW = 'row';\n;\n;\n;\n;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner, getDataItemValue, queryReferringComponents, SINGLE_REFERRING } from '../../util/model.js';\nimport { createHashMap, each, isArray, isString, isObject, isTypedArray } from 'zrender/lib/core/util.js';\nimport { SOURCE_FORMAT_ORIGINAL, SOURCE_FORMAT_ARRAY_ROWS, SOURCE_FORMAT_OBJECT_ROWS, SERIES_LAYOUT_BY_ROW, SOURCE_FORMAT_KEYED_COLUMNS } from '../../util/types.js';\n// The result of `guessOrdinal`.\nexport var BE_ORDINAL = {\n  Must: 1,\n  Might: 2,\n  Not: 3 // Other cases\n};\nvar innerGlobalModel = makeInner();\n/**\n * MUST be called before mergeOption of all series.\n */\nexport function resetSourceDefaulter(ecModel) {\n  // `datasetMap` is used to make default encode.\n  innerGlobalModel(ecModel).datasetMap = createHashMap();\n}\n/**\n * [The strategy of the arrengment of data dimensions for dataset]:\n * \"value way\": all axes are non-category axes. So series one by one take\n *     several (the number is coordSysDims.length) dimensions from dataset.\n *     The result of data arrengment of data dimensions like:\n *     | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y |\n * \"category way\": at least one axis is category axis. So the the first data\n *     dimension is always mapped to the first category axis and shared by\n *     all of the series. The other data dimensions are taken by series like\n *     \"value way\" does.\n *     The result of data arrengment of data dimensions like:\n *     | ser_shared_x | ser0_y | ser1_y | ser2_y |\n *\n * @return encode Never be `null/undefined`.\n */\nexport function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) {\n  var encode = {};\n  var datasetModel = querySeriesUpstreamDatasetModel(seriesModel);\n  // Currently only make default when using dataset, util more reqirements occur.\n  if (!datasetModel || !coordDimensions) {\n    return encode;\n  }\n  var encodeItemName = [];\n  var encodeSeriesName = [];\n  var ecModel = seriesModel.ecModel;\n  var datasetMap = innerGlobalModel(ecModel).datasetMap;\n  var key = datasetModel.uid + '_' + source.seriesLayoutBy;\n  var baseCategoryDimIndex;\n  var categoryWayValueDimStart;\n  coordDimensions = coordDimensions.slice();\n  each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) {\n    var coordDimInfo = isObject(coordDimInfoLoose) ? coordDimInfoLoose : coordDimensions[coordDimIdx] = {\n      name: coordDimInfoLoose\n    };\n    if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) {\n      baseCategoryDimIndex = coordDimIdx;\n      categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo);\n    }\n    encode[coordDimInfo.name] = [];\n  });\n  var datasetRecord = datasetMap.get(key) || datasetMap.set(key, {\n    categoryWayDim: categoryWayValueDimStart,\n    valueWayDim: 0\n  });\n  // TODO\n  // Auto detect first time axis and do arrangement.\n  each(coordDimensions, function (coordDimInfo, coordDimIdx) {\n    var coordDimName = coordDimInfo.name;\n    var count = getDataDimCountOnCoordDim(coordDimInfo);\n    // In value way.\n    if (baseCategoryDimIndex == null) {\n      var start = datasetRecord.valueWayDim;\n      pushDim(encode[coordDimName], start, count);\n      pushDim(encodeSeriesName, start, count);\n      datasetRecord.valueWayDim += count;\n      // ??? TODO give a better default series name rule?\n      // especially when encode x y specified.\n      // consider: when multiple series share one dimension\n      // category axis, series name should better use\n      // the other dimension name. On the other hand, use\n      // both dimensions name.\n    }\n    // In category way, the first category axis.\n    else if (baseCategoryDimIndex === coordDimIdx) {\n      pushDim(encode[coordDimName], 0, count);\n      pushDim(encodeItemName, 0, count);\n    }\n    // In category way, the other axis.\n    else {\n      var start = datasetRecord.categoryWayDim;\n      pushDim(encode[coordDimName], start, count);\n      pushDim(encodeSeriesName, start, count);\n      datasetRecord.categoryWayDim += count;\n    }\n  });\n  function pushDim(dimIdxArr, idxFrom, idxCount) {\n    for (var i = 0; i < idxCount; i++) {\n      dimIdxArr.push(idxFrom + i);\n    }\n  }\n  function getDataDimCountOnCoordDim(coordDimInfo) {\n    var dimsDef = coordDimInfo.dimsDef;\n    return dimsDef ? dimsDef.length : 1;\n  }\n  encodeItemName.length && (encode.itemName = encodeItemName);\n  encodeSeriesName.length && (encode.seriesName = encodeSeriesName);\n  return encode;\n}\n/**\n * Work for data like [{name: ..., value: ...}, ...].\n *\n * @return encode Never be `null/undefined`.\n */\nexport function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) {\n  var encode = {};\n  var datasetModel = querySeriesUpstreamDatasetModel(seriesModel);\n  // Currently only make default when using dataset, util more reqirements occur.\n  if (!datasetModel) {\n    return encode;\n  }\n  var sourceFormat = source.sourceFormat;\n  var dimensionsDefine = source.dimensionsDefine;\n  var potentialNameDimIndex;\n  if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n    each(dimensionsDefine, function (dim, idx) {\n      if ((isObject(dim) ? dim.name : dim) === 'name') {\n        potentialNameDimIndex = idx;\n      }\n    });\n  }\n  var idxResult = function () {\n    var idxRes0 = {};\n    var idxRes1 = {};\n    var guessRecords = [];\n    // 5 is an experience value.\n    for (var i = 0, len = Math.min(5, dimCount); i < len; i++) {\n      var guessResult = doGuessOrdinal(source.data, sourceFormat, source.seriesLayoutBy, dimensionsDefine, source.startIndex, i);\n      guessRecords.push(guessResult);\n      var isPureNumber = guessResult === BE_ORDINAL.Not;\n      // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim,\n      // and then find a name dim with the priority:\n      // \"BE_ORDINAL.Might|BE_ORDINAL.Must\" > \"other dim\" > \"the value dim itself\".\n      if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) {\n        idxRes0.v = i;\n      }\n      if (idxRes0.n == null || idxRes0.n === idxRes0.v || !isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not) {\n        idxRes0.n = i;\n      }\n      if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) {\n        return idxRes0;\n      }\n      // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not),\n      // find the first BE_ORDINAL.Might as the value dim,\n      // and then find a name dim with the priority:\n      // \"other dim\" > \"the value dim itself\".\n      // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be\n      // treated as number.\n      if (!isPureNumber) {\n        if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) {\n          idxRes1.v = i;\n        }\n        if (idxRes1.n == null || idxRes1.n === idxRes1.v) {\n          idxRes1.n = i;\n        }\n      }\n    }\n    function fulfilled(idxResult) {\n      return idxResult.v != null && idxResult.n != null;\n    }\n    return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null;\n  }();\n  if (idxResult) {\n    encode.value = [idxResult.v];\n    // `potentialNameDimIndex` has highest priority.\n    var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n;\n    // By default, label uses itemName in charts.\n    // So we don't set encodeLabel here.\n    encode.itemName = [nameDimIndex];\n    encode.seriesName = [nameDimIndex];\n  }\n  return encode;\n}\n/**\n * @return If return null/undefined, indicate that should not use datasetModel.\n */\nexport function querySeriesUpstreamDatasetModel(seriesModel) {\n  // Caution: consider the scenario:\n  // A dataset is declared and a series is not expected to use the dataset,\n  // and at the beginning `setOption({series: { noData })` (just prepare other\n  // option but no data), then `setOption({series: {data: [...]}); In this case,\n  // the user should set an empty array to avoid that dataset is used by default.\n  var thisData = seriesModel.get('data', true);\n  if (!thisData) {\n    return queryReferringComponents(seriesModel.ecModel, 'dataset', {\n      index: seriesModel.get('datasetIndex', true),\n      id: seriesModel.get('datasetId', true)\n    }, SINGLE_REFERRING).models[0];\n  }\n}\n/**\n * @return Always return an array event empty.\n */\nexport function queryDatasetUpstreamDatasetModels(datasetModel) {\n  // Only these attributes declared, we by default reference to `datasetIndex: 0`.\n  // Otherwise, no reference.\n  if (!datasetModel.get('transform', true) && !datasetModel.get('fromTransformResult', true)) {\n    return [];\n  }\n  return queryReferringComponents(datasetModel.ecModel, 'dataset', {\n    index: datasetModel.get('fromDatasetIndex', true),\n    id: datasetModel.get('fromDatasetId', true)\n  }, SINGLE_REFERRING).models;\n}\n/**\n * The rule should not be complex, otherwise user might not\n * be able to known where the data is wrong.\n * The code is ugly, but how to make it neat?\n */\nexport function guessOrdinal(source, dimIndex) {\n  return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex);\n}\n// dimIndex may be overflow source data.\n// return {BE_ORDINAL}\nfunction doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) {\n  var result;\n  // Experience value.\n  var maxLoop = 5;\n  if (isTypedArray(data)) {\n    return BE_ORDINAL.Not;\n  }\n  // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine\n  // always exists in source.\n  var dimName;\n  var dimType;\n  if (dimensionsDefine) {\n    var dimDefItem = dimensionsDefine[dimIndex];\n    if (isObject(dimDefItem)) {\n      dimName = dimDefItem.name;\n      dimType = dimDefItem.type;\n    } else if (isString(dimDefItem)) {\n      dimName = dimDefItem;\n    }\n  }\n  if (dimType != null) {\n    return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not;\n  }\n  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n    var dataArrayRows = data;\n    if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {\n      var sample = dataArrayRows[dimIndex];\n      for (var i = 0; i < (sample || []).length && i < maxLoop; i++) {\n        if ((result = detectValue(sample[startIndex + i])) != null) {\n          return result;\n        }\n      }\n    } else {\n      for (var i = 0; i < dataArrayRows.length && i < maxLoop; i++) {\n        var row = dataArrayRows[startIndex + i];\n        if (row && (result = detectValue(row[dimIndex])) != null) {\n          return result;\n        }\n      }\n    }\n  } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n    var dataObjectRows = data;\n    if (!dimName) {\n      return BE_ORDINAL.Not;\n    }\n    for (var i = 0; i < dataObjectRows.length && i < maxLoop; i++) {\n      var item = dataObjectRows[i];\n      if (item && (result = detectValue(item[dimName])) != null) {\n        return result;\n      }\n    }\n  } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n    var dataKeyedColumns = data;\n    if (!dimName) {\n      return BE_ORDINAL.Not;\n    }\n    var sample = dataKeyedColumns[dimName];\n    if (!sample || isTypedArray(sample)) {\n      return BE_ORDINAL.Not;\n    }\n    for (var i = 0; i < sample.length && i < maxLoop; i++) {\n      if ((result = detectValue(sample[i])) != null) {\n        return result;\n      }\n    }\n  } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n    var dataOriginal = data;\n    for (var i = 0; i < dataOriginal.length && i < maxLoop; i++) {\n      var item = dataOriginal[i];\n      var val = getDataItemValue(item);\n      if (!isArray(val)) {\n        return BE_ORDINAL.Not;\n      }\n      if ((result = detectValue(val[dimIndex])) != null) {\n        return result;\n      }\n    }\n  }\n  function detectValue(val) {\n    var beStr = isString(val);\n    // Consider usage convenience, '1', '2' will be treated as \"number\".\n    // `Number('')` (or any whitespace) is `0`.\n    if (val != null && Number.isFinite(Number(val)) && val !== '') {\n      return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not;\n    } else if (beStr && val !== '-') {\n      return BE_ORDINAL.Must;\n    }\n  }\n  return BE_ORDINAL.Not;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, assert } from 'zrender/lib/core/util.js';\nimport { isComponentIdInternal } from '../util/model.js';\nvar internalOptionCreatorMap = createHashMap();\nexport function registerInternalOptionCreator(mainType, creator) {\n  assert(internalOptionCreatorMap.get(mainType) == null && creator);\n  internalOptionCreatorMap.set(mainType, creator);\n}\nexport function concatInternalOptions(ecModel, mainType, newCmptOptionList) {\n  var internalOptionCreator = internalOptionCreatorMap.get(mainType);\n  if (!internalOptionCreator) {\n    return newCmptOptionList;\n  }\n  var internalOptions = internalOptionCreator(ecModel);\n  if (!internalOptions) {\n    return newCmptOptionList;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    for (var i = 0; i < internalOptions.length; i++) {\n      assert(isComponentIdInternal(internalOptions[i]));\n    }\n  }\n  return newCmptOptionList.concat(internalOptions);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner, normalizeToArray } from '../../util/model.js';\nvar innerColor = makeInner();\nvar innerDecal = makeInner();\nvar PaletteMixin = /** @class */function () {\n  function PaletteMixin() {}\n  PaletteMixin.prototype.getColorFromPalette = function (name, scope, requestNum) {\n    var defaultPalette = normalizeToArray(this.get('color', true));\n    var layeredPalette = this.get('colorLayer', true);\n    return getFromPalette(this, innerColor, defaultPalette, layeredPalette, name, scope, requestNum);\n  };\n  PaletteMixin.prototype.clearColorPalette = function () {\n    clearPalette(this, innerColor);\n  };\n  return PaletteMixin;\n}();\nexport function getDecalFromPalette(ecModel, name, scope, requestNum) {\n  var defaultDecals = normalizeToArray(ecModel.get(['aria', 'decal', 'decals']));\n  return getFromPalette(ecModel, innerDecal, defaultDecals, null, name, scope, requestNum);\n}\nfunction getNearestPalette(palettes, requestColorNum) {\n  var paletteNum = palettes.length;\n  // TODO palettes must be in order\n  for (var i = 0; i < paletteNum; i++) {\n    if (palettes[i].length > requestColorNum) {\n      return palettes[i];\n    }\n  }\n  return palettes[paletteNum - 1];\n}\n/**\n * @param name MUST NOT be null/undefined. Otherwise call this function\n *             twise with the same parameters will get different result.\n * @param scope default this.\n * @return Can be null/undefined\n */\nfunction getFromPalette(that, inner, defaultPalette, layeredPalette, name, scope, requestNum) {\n  scope = scope || that;\n  var scopeFields = inner(scope);\n  var paletteIdx = scopeFields.paletteIdx || 0;\n  var paletteNameMap = scopeFields.paletteNameMap = scopeFields.paletteNameMap || {};\n  // Use `hasOwnProperty` to avoid conflict with Object.prototype.\n  if (paletteNameMap.hasOwnProperty(name)) {\n    return paletteNameMap[name];\n  }\n  var palette = requestNum == null || !layeredPalette ? defaultPalette : getNearestPalette(layeredPalette, requestNum);\n  // In case can't find in layered color palette.\n  palette = palette || defaultPalette;\n  if (!palette || !palette.length) {\n    return;\n  }\n  var pickedPaletteItem = palette[paletteIdx];\n  if (name) {\n    paletteNameMap[name] = pickedPaletteItem;\n  }\n  scopeFields.paletteIdx = (paletteIdx + 1) % palette.length;\n  return pickedPaletteItem;\n}\nfunction clearPalette(that, inner) {\n  inner(that).paletteIdx = 0;\n  inner(that).paletteNameMap = {};\n}\nexport { PaletteMixin };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * Caution: If the mechanism should be changed some day, these cases\n * should be considered:\n *\n * (1) In `merge option` mode, if using the same option to call `setOption`\n * many times, the result should be the same (try our best to ensure that).\n * (2) In `merge option` mode, if a component has no id/name specified, it\n * will be merged by index, and the result sequence of the components is\n * consistent to the original sequence.\n * (3) In `replaceMerge` mode, keep the result sequence of the components is\n * consistent to the original sequence, even though there might result in \"hole\".\n * (4) `reset` feature (in toolbox). Find detailed info in comments about\n * `mergeOption` in module:echarts/model/OptionManager.\n */\nimport { each, filter, isArray, isObject, isString, createHashMap, assert, clone, merge, extend, mixin, isFunction } from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../util/model.js';\nimport Model from './Model.js';\nimport ComponentModel from './Component.js';\nimport globalDefault from './globalDefault.js';\nimport { resetSourceDefaulter } from '../data/helper/sourceHelper.js';\nimport { concatInternalOptions } from './internalComponentCreator.js';\nimport { PaletteMixin } from './mixin/palette.js';\nimport { error, warn } from '../util/log.js';\n// -----------------------\n// Internal method names:\n// -----------------------\nvar reCreateSeriesIndices;\nvar assertSeriesInitialized;\nvar initBase;\nvar OPTION_INNER_KEY = '\\0_ec_inner';\nvar OPTION_INNER_VALUE = 1;\nvar BUITIN_COMPONENTS_MAP = {\n  grid: 'GridComponent',\n  polar: 'PolarComponent',\n  geo: 'GeoComponent',\n  singleAxis: 'SingleAxisComponent',\n  parallel: 'ParallelComponent',\n  calendar: 'CalendarComponent',\n  matrix: 'MatrixComponent',\n  graphic: 'GraphicComponent',\n  toolbox: 'ToolboxComponent',\n  tooltip: 'TooltipComponent',\n  axisPointer: 'AxisPointerComponent',\n  brush: 'BrushComponent',\n  title: 'TitleComponent',\n  timeline: 'TimelineComponent',\n  markPoint: 'MarkPointComponent',\n  markLine: 'MarkLineComponent',\n  markArea: 'MarkAreaComponent',\n  legend: 'LegendComponent',\n  dataZoom: 'DataZoomComponent',\n  visualMap: 'VisualMapComponent',\n  // aria: 'AriaComponent',\n  // dataset: 'DatasetComponent',\n  // Dependencies\n  xAxis: 'GridComponent',\n  yAxis: 'GridComponent',\n  angleAxis: 'PolarComponent',\n  radiusAxis: 'PolarComponent'\n};\nvar BUILTIN_CHARTS_MAP = {\n  line: 'LineChart',\n  bar: 'BarChart',\n  pie: 'PieChart',\n  scatter: 'ScatterChart',\n  radar: 'RadarChart',\n  map: 'MapChart',\n  tree: 'TreeChart',\n  treemap: 'TreemapChart',\n  graph: 'GraphChart',\n  chord: 'ChordChart',\n  gauge: 'GaugeChart',\n  funnel: 'FunnelChart',\n  parallel: 'ParallelChart',\n  sankey: 'SankeyChart',\n  boxplot: 'BoxplotChart',\n  candlestick: 'CandlestickChart',\n  effectScatter: 'EffectScatterChart',\n  lines: 'LinesChart',\n  heatmap: 'HeatmapChart',\n  pictorialBar: 'PictorialBarChart',\n  themeRiver: 'ThemeRiverChart',\n  sunburst: 'SunburstChart',\n  custom: 'CustomChart'\n};\nvar componetsMissingLogPrinted = {};\nfunction checkMissingComponents(option) {\n  each(option, function (componentOption, mainType) {\n    if (!ComponentModel.hasClass(mainType)) {\n      var componentImportName = BUITIN_COMPONENTS_MAP[mainType];\n      if (componentImportName && !componetsMissingLogPrinted[componentImportName]) {\n        error(\"Component \" + mainType + \" is used but not imported.\\nimport { \" + componentImportName + \" } from 'echarts/components';\\necharts.use([\" + componentImportName + \"]);\");\n        componetsMissingLogPrinted[componentImportName] = true;\n      }\n    }\n  });\n}\nvar GlobalModel = /** @class */function (_super) {\n  __extends(GlobalModel, _super);\n  function GlobalModel() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  GlobalModel.prototype.init = function (option, parentModel, ecModel, theme, locale, optionManager) {\n    theme = theme || {};\n    this.option = null; // Mark as not initialized.\n    this._theme = new Model(theme);\n    this._locale = new Model(locale);\n    this._optionManager = optionManager;\n  };\n  GlobalModel.prototype.setOption = function (option, opts, optionPreprocessorFuncs) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(option != null, 'option is null/undefined');\n      assert(option[OPTION_INNER_KEY] !== OPTION_INNER_VALUE, 'please use chart.getOption()');\n    }\n    var innerOpt = normalizeSetOptionInput(opts);\n    this._optionManager.setOption(option, optionPreprocessorFuncs, innerOpt);\n    this._resetOption(null, innerOpt);\n  };\n  /**\n   * @param type null/undefined: reset all.\n   *        'recreate': force recreate all.\n   *        'timeline': only reset timeline option\n   *        'media': only reset media query option\n   * @return Whether option changed.\n   */\n  GlobalModel.prototype.resetOption = function (type, opt) {\n    return this._resetOption(type, normalizeSetOptionInput(opt));\n  };\n  GlobalModel.prototype._resetOption = function (type, opt) {\n    var optionChanged = false;\n    var optionManager = this._optionManager;\n    if (!type || type === 'recreate') {\n      var baseOption = optionManager.mountOption(type === 'recreate');\n      if (process.env.NODE_ENV !== 'production') {\n        checkMissingComponents(baseOption);\n      }\n      if (!this.option || type === 'recreate') {\n        initBase(this, baseOption);\n      } else {\n        this.restoreData();\n        this._mergeOption(baseOption, opt);\n      }\n      optionChanged = true;\n    }\n    if (type === 'timeline' || type === 'media') {\n      this.restoreData();\n    }\n    // By design, if `setOption(option2)` at the second time, and `option2` is a `ECUnitOption`,\n    // it should better not have the same props with `MediaUnit['option']`.\n    // Because either `option2` or `MediaUnit['option']` will be always merged to \"current option\"\n    // rather than original \"baseOption\". If they both override a prop, the result might be\n    // unexpected when media state changed after `setOption` called.\n    // If we really need to modify a props in each `MediaUnit['option']`, use the full version\n    // (`{baseOption, media}`) in `setOption`.\n    // For `timeline`, the case is the same.\n    if (!type || type === 'recreate' || type === 'timeline') {\n      var timelineOption = optionManager.getTimelineOption(this);\n      if (timelineOption) {\n        optionChanged = true;\n        this._mergeOption(timelineOption, opt);\n      }\n    }\n    if (!type || type === 'recreate' || type === 'media') {\n      var mediaOptions = optionManager.getMediaOption(this);\n      if (mediaOptions.length) {\n        each(mediaOptions, function (mediaOption) {\n          optionChanged = true;\n          this._mergeOption(mediaOption, opt);\n        }, this);\n      }\n    }\n    return optionChanged;\n  };\n  GlobalModel.prototype.mergeOption = function (option) {\n    this._mergeOption(option, null);\n  };\n  GlobalModel.prototype._mergeOption = function (newOption, opt) {\n    var option = this.option;\n    var componentsMap = this._componentsMap;\n    var componentsCount = this._componentsCount;\n    var newCmptTypes = [];\n    var newCmptTypeMap = createHashMap();\n    var replaceMergeMainTypeMap = opt && opt.replaceMergeMainTypeMap;\n    resetSourceDefaulter(this);\n    // If no component class, merge directly.\n    // For example: color, animaiton options, etc.\n    each(newOption, function (componentOption, mainType) {\n      if (componentOption == null) {\n        return;\n      }\n      if (!ComponentModel.hasClass(mainType)) {\n        // globalSettingTask.dirty();\n        option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true);\n      } else if (mainType) {\n        newCmptTypes.push(mainType);\n        newCmptTypeMap.set(mainType, true);\n      }\n    });\n    if (replaceMergeMainTypeMap) {\n      // If there is a mainType `xxx` in `replaceMerge` but not declared in option,\n      // we trade it as it is declared in option as `{xxx: []}`. Because:\n      // (1) for normal merge, `{xxx: null/undefined}` are the same meaning as `{xxx: []}`.\n      // (2) some preprocessor may convert some of `{xxx: null/undefined}` to `{xxx: []}`.\n      replaceMergeMainTypeMap.each(function (val, mainTypeInReplaceMerge) {\n        if (ComponentModel.hasClass(mainTypeInReplaceMerge) && !newCmptTypeMap.get(mainTypeInReplaceMerge)) {\n          newCmptTypes.push(mainTypeInReplaceMerge);\n          newCmptTypeMap.set(mainTypeInReplaceMerge, true);\n        }\n      });\n    }\n    ComponentModel.topologicalTravel(newCmptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this);\n    function visitComponent(mainType) {\n      var newCmptOptionList = concatInternalOptions(this, mainType, modelUtil.normalizeToArray(newOption[mainType]));\n      var oldCmptList = componentsMap.get(mainType);\n      var mergeMode =\n      // `!oldCmptList` means init. See the comment in `mappingToExists`\n      !oldCmptList ? 'replaceAll' : replaceMergeMainTypeMap && replaceMergeMainTypeMap.get(mainType) ? 'replaceMerge' : 'normalMerge';\n      var mappingResult = modelUtil.mappingToExists(oldCmptList, newCmptOptionList, mergeMode);\n      // Set mainType and complete subType.\n      modelUtil.setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel);\n      // Empty it before the travel, in order to prevent `this._componentsMap`\n      // from being used in the `init`/`mergeOption`/`optionUpdated` of some\n      // components, which is probably incorrect logic.\n      option[mainType] = null;\n      componentsMap.set(mainType, null);\n      componentsCount.set(mainType, 0);\n      var optionsByMainType = [];\n      var cmptsByMainType = [];\n      var cmptsCountByMainType = 0;\n      var tooltipExists;\n      var tooltipWarningLogged;\n      each(mappingResult, function (resultItem, index) {\n        var componentModel = resultItem.existing;\n        var newCmptOption = resultItem.newOption;\n        if (!newCmptOption) {\n          if (componentModel) {\n            // Consider where is no new option and should be merged using {},\n            // see removeEdgeAndAdd in topologicalTravel and\n            // ComponentModel.getAllClassMainTypes.\n            componentModel.mergeOption({}, this);\n            componentModel.optionUpdated({}, false);\n          }\n          // If no both `resultItem.exist` and `resultItem.option`,\n          // either it is in `replaceMerge` and not matched by any id,\n          // or it has been removed in previous `replaceMerge` and left a \"hole\" in this component index.\n        } else {\n          var isSeriesType = mainType === 'series';\n          var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, !isSeriesType // Give a more detailed warn later if series don't exists\n          );\n          if (!ComponentModelClass) {\n            if (process.env.NODE_ENV !== 'production') {\n              var subType = resultItem.keyInfo.subType;\n              var seriesImportName = BUILTIN_CHARTS_MAP[subType];\n              if (!componetsMissingLogPrinted[subType]) {\n                componetsMissingLogPrinted[subType] = true;\n                if (seriesImportName) {\n                  error(\"Series \" + subType + \" is used but not imported.\\nimport { \" + seriesImportName + \" } from 'echarts/charts';\\necharts.use([\" + seriesImportName + \"]);\");\n                } else {\n                  error(\"Unknown series \" + subType);\n                }\n              }\n            }\n            return;\n          }\n          // TODO Before multiple tooltips get supported, we do this check to avoid unexpected exception.\n          if (mainType === 'tooltip') {\n            if (tooltipExists) {\n              if (process.env.NODE_ENV !== 'production') {\n                if (!tooltipWarningLogged) {\n                  warn('Currently only one tooltip component is allowed.');\n                  tooltipWarningLogged = true;\n                }\n              }\n              return;\n            }\n            tooltipExists = true;\n          }\n          if (componentModel && componentModel.constructor === ComponentModelClass) {\n            componentModel.name = resultItem.keyInfo.name;\n            // componentModel.settingTask && componentModel.settingTask.dirty();\n            componentModel.mergeOption(newCmptOption, this);\n            componentModel.optionUpdated(newCmptOption, false);\n          } else {\n            // PENDING Global as parent ?\n            var extraOpt = extend({\n              componentIndex: index\n            }, resultItem.keyInfo);\n            componentModel = new ComponentModelClass(newCmptOption, this, this, extraOpt);\n            // Assign `keyInfo`\n            extend(componentModel, extraOpt);\n            if (resultItem.brandNew) {\n              componentModel.__requireNewView = true;\n            }\n            componentModel.init(newCmptOption, this, this);\n            // Call optionUpdated after init.\n            // newCmptOption has been used as componentModel.option\n            // and may be merged with theme and default, so pass null\n            // to avoid confusion.\n            componentModel.optionUpdated(null, true);\n          }\n        }\n        if (componentModel) {\n          optionsByMainType.push(componentModel.option);\n          cmptsByMainType.push(componentModel);\n          cmptsCountByMainType++;\n        } else {\n          // Always do assign to avoid elided item in array.\n          optionsByMainType.push(void 0);\n          cmptsByMainType.push(void 0);\n        }\n      }, this);\n      option[mainType] = optionsByMainType;\n      componentsMap.set(mainType, cmptsByMainType);\n      componentsCount.set(mainType, cmptsCountByMainType);\n      // Backup series for filtering.\n      if (mainType === 'series') {\n        reCreateSeriesIndices(this);\n      }\n    }\n    // If no series declared, ensure `_seriesIndices` initialized.\n    if (!this._seriesIndices) {\n      reCreateSeriesIndices(this);\n    }\n  };\n  /**\n   * Get option for output (cloned option and inner info removed)\n   */\n  GlobalModel.prototype.getOption = function () {\n    var option = clone(this.option);\n    each(option, function (optInMainType, mainType) {\n      if (ComponentModel.hasClass(mainType)) {\n        var opts = modelUtil.normalizeToArray(optInMainType);\n        // Inner cmpts need to be removed.\n        // Inner cmpts might not be at last since ec5.0, but still\n        // compatible for users: if inner cmpt at last, splice the returned array.\n        var realLen = opts.length;\n        var metNonInner = false;\n        for (var i = realLen - 1; i >= 0; i--) {\n          // Remove options with inner id.\n          if (opts[i] && !modelUtil.isComponentIdInternal(opts[i])) {\n            metNonInner = true;\n          } else {\n            opts[i] = null;\n            !metNonInner && realLen--;\n          }\n        }\n        opts.length = realLen;\n        option[mainType] = opts;\n      }\n    });\n    delete option[OPTION_INNER_KEY];\n    return option;\n  };\n  GlobalModel.prototype.setTheme = function (theme) {\n    this._theme = new Model(theme);\n    this._resetOption('recreate', null);\n  };\n  GlobalModel.prototype.getTheme = function () {\n    return this._theme;\n  };\n  GlobalModel.prototype.getLocaleModel = function () {\n    return this._locale;\n  };\n  GlobalModel.prototype.setUpdatePayload = function (payload) {\n    this._payload = payload;\n  };\n  GlobalModel.prototype.getUpdatePayload = function () {\n    return this._payload;\n  };\n  /**\n   * @param idx If not specified, return the first one.\n   */\n  GlobalModel.prototype.getComponent = function (mainType, idx) {\n    var list = this._componentsMap.get(mainType);\n    if (list) {\n      var cmpt = list[idx || 0];\n      if (cmpt) {\n        return cmpt;\n      } else if (idx == null) {\n        for (var i = 0; i < list.length; i++) {\n          if (list[i]) {\n            return list[i];\n          }\n        }\n      }\n    }\n  };\n  /**\n   * @return Never be null/undefined.\n   */\n  GlobalModel.prototype.queryComponents = function (condition) {\n    var mainType = condition.mainType;\n    if (!mainType) {\n      return [];\n    }\n    var index = condition.index;\n    var id = condition.id;\n    var name = condition.name;\n    var cmpts = this._componentsMap.get(mainType);\n    if (!cmpts || !cmpts.length) {\n      return [];\n    }\n    var result;\n    if (index != null) {\n      result = [];\n      each(modelUtil.normalizeToArray(index), function (idx) {\n        cmpts[idx] && result.push(cmpts[idx]);\n      });\n    } else if (id != null) {\n      result = queryByIdOrName('id', id, cmpts);\n    } else if (name != null) {\n      result = queryByIdOrName('name', name, cmpts);\n    } else {\n      // Return all non-empty components in that mainType\n      result = filter(cmpts, function (cmpt) {\n        return !!cmpt;\n      });\n    }\n    return filterBySubType(result, condition);\n  };\n  /**\n   * The interface is different from queryComponents,\n   * which is convenient for inner usage.\n   *\n   * @usage\n   * let result = findComponents(\n   *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}\n   * );\n   * let result = findComponents(\n   *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}\n   * );\n   * let result = findComponents(\n   *     {mainType: 'series',\n   *     filter: function (model, index) {...}}\n   * );\n   * // result like [component0, componnet1, ...]\n   */\n  GlobalModel.prototype.findComponents = function (condition) {\n    var query = condition.query;\n    var mainType = condition.mainType;\n    var queryCond = getQueryCond(query);\n    var result = queryCond ? this.queryComponents(queryCond)\n    // Retrieve all non-empty components.\n    : filter(this._componentsMap.get(mainType), function (cmpt) {\n      return !!cmpt;\n    });\n    return doFilter(filterBySubType(result, condition));\n    function getQueryCond(q) {\n      var indexAttr = mainType + 'Index';\n      var idAttr = mainType + 'Id';\n      var nameAttr = mainType + 'Name';\n      return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? {\n        mainType: mainType,\n        // subType will be filtered finally.\n        index: q[indexAttr],\n        id: q[idAttr],\n        name: q[nameAttr]\n      } : null;\n    }\n    function doFilter(res) {\n      return condition.filter ? filter(res, condition.filter) : res;\n    }\n  };\n  GlobalModel.prototype.eachComponent = function (mainType, cb, context) {\n    var componentsMap = this._componentsMap;\n    if (isFunction(mainType)) {\n      var ctxForAll_1 = cb;\n      var cbForAll_1 = mainType;\n      componentsMap.each(function (cmpts, componentType) {\n        for (var i = 0; cmpts && i < cmpts.length; i++) {\n          var cmpt = cmpts[i];\n          cmpt && cbForAll_1.call(ctxForAll_1, componentType, cmpt, cmpt.componentIndex);\n        }\n      });\n    } else {\n      var cmpts = isString(mainType) ? componentsMap.get(mainType) : isObject(mainType) ? this.findComponents(mainType) : null;\n      for (var i = 0; cmpts && i < cmpts.length; i++) {\n        var cmpt = cmpts[i];\n        cmpt && cb.call(context, cmpt, cmpt.componentIndex);\n      }\n    }\n  };\n  /**\n   * Get series list before filtered by name.\n   */\n  GlobalModel.prototype.getSeriesByName = function (name) {\n    var nameStr = modelUtil.convertOptionIdName(name, null);\n    return filter(this._componentsMap.get('series'), function (oneSeries) {\n      return !!oneSeries && nameStr != null && oneSeries.name === nameStr;\n    });\n  };\n  /**\n   * Get series list before filtered by index.\n   */\n  GlobalModel.prototype.getSeriesByIndex = function (seriesIndex) {\n    return this._componentsMap.get('series')[seriesIndex];\n  };\n  /**\n   * Get series list before filtered by type.\n   * FIXME: rename to getRawSeriesByType?\n   */\n  GlobalModel.prototype.getSeriesByType = function (subType) {\n    return filter(this._componentsMap.get('series'), function (oneSeries) {\n      return !!oneSeries && oneSeries.subType === subType;\n    });\n  };\n  /**\n   * Get all series before filtered.\n   */\n  GlobalModel.prototype.getSeries = function () {\n    return filter(this._componentsMap.get('series'), function (oneSeries) {\n      return !!oneSeries;\n    });\n  };\n  /**\n   * Count series before filtered.\n   */\n  GlobalModel.prototype.getSeriesCount = function () {\n    return this._componentsCount.get('series');\n  };\n  /**\n   * After filtering, series may be different\n   * from raw series.\n   */\n  GlobalModel.prototype.eachSeries = function (cb, context) {\n    assertSeriesInitialized(this);\n    each(this._seriesIndices, function (rawSeriesIndex) {\n      var series = this._componentsMap.get('series')[rawSeriesIndex];\n      cb.call(context, series, rawSeriesIndex);\n    }, this);\n  };\n  /**\n   * Iterate raw series before filtered.\n   *\n   * @param {Function} cb\n   * @param {*} context\n   */\n  GlobalModel.prototype.eachRawSeries = function (cb, context) {\n    each(this._componentsMap.get('series'), function (series) {\n      series && cb.call(context, series, series.componentIndex);\n    });\n  };\n  /**\n   * After filtering, series may be different.\n   * from raw series.\n   */\n  GlobalModel.prototype.eachSeriesByType = function (subType, cb, context) {\n    assertSeriesInitialized(this);\n    each(this._seriesIndices, function (rawSeriesIndex) {\n      var series = this._componentsMap.get('series')[rawSeriesIndex];\n      if (series.subType === subType) {\n        cb.call(context, series, rawSeriesIndex);\n      }\n    }, this);\n  };\n  /**\n   * Iterate raw series before filtered of given type.\n   */\n  GlobalModel.prototype.eachRawSeriesByType = function (subType, cb, context) {\n    return each(this.getSeriesByType(subType), cb, context);\n  };\n  GlobalModel.prototype.isSeriesFiltered = function (seriesModel) {\n    assertSeriesInitialized(this);\n    return this._seriesIndicesMap.get(seriesModel.componentIndex) == null;\n  };\n  GlobalModel.prototype.getCurrentSeriesIndices = function () {\n    return (this._seriesIndices || []).slice();\n  };\n  GlobalModel.prototype.filterSeries = function (cb, context) {\n    assertSeriesInitialized(this);\n    var newSeriesIndices = [];\n    each(this._seriesIndices, function (seriesRawIdx) {\n      var series = this._componentsMap.get('series')[seriesRawIdx];\n      cb.call(context, series, seriesRawIdx) && newSeriesIndices.push(seriesRawIdx);\n    }, this);\n    this._seriesIndices = newSeriesIndices;\n    this._seriesIndicesMap = createHashMap(newSeriesIndices);\n  };\n  GlobalModel.prototype.restoreData = function (payload) {\n    reCreateSeriesIndices(this);\n    var componentsMap = this._componentsMap;\n    var componentTypes = [];\n    componentsMap.each(function (components, componentType) {\n      if (ComponentModel.hasClass(componentType)) {\n        componentTypes.push(componentType);\n      }\n    });\n    ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType) {\n      each(componentsMap.get(componentType), function (component) {\n        if (component && (componentType !== 'series' || !isNotTargetSeries(component, payload))) {\n          component.restoreData();\n        }\n      });\n    });\n  };\n  GlobalModel.internalField = function () {\n    reCreateSeriesIndices = function (ecModel) {\n      var seriesIndices = ecModel._seriesIndices = [];\n      each(ecModel._componentsMap.get('series'), function (series) {\n        // series may have been removed by `replaceMerge`.\n        series && seriesIndices.push(series.componentIndex);\n      });\n      ecModel._seriesIndicesMap = createHashMap(seriesIndices);\n    };\n    assertSeriesInitialized = function (ecModel) {\n      // Components that use _seriesIndices should depends on series component,\n      // which make sure that their initialization is after series.\n      if (process.env.NODE_ENV !== 'production') {\n        if (!ecModel._seriesIndices) {\n          throw new Error('Option should contains series.');\n        }\n      }\n    };\n    initBase = function (ecModel, baseOption) {\n      // Using OPTION_INNER_KEY to mark that this option cannot be used outside,\n      // i.e. `chart.setOption(chart.getModel().option);` is forbidden.\n      ecModel.option = {};\n      ecModel.option[OPTION_INNER_KEY] = OPTION_INNER_VALUE;\n      // Init with series: [], in case of calling findSeries method\n      // before series initialized.\n      ecModel._componentsMap = createHashMap({\n        series: []\n      });\n      ecModel._componentsCount = createHashMap();\n      // If user spefied `option.aria`, aria will be enable. This detection should be\n      // performed before theme and globalDefault merge.\n      var airaOption = baseOption.aria;\n      if (isObject(airaOption) && airaOption.enabled == null) {\n        airaOption.enabled = true;\n      }\n      mergeTheme(baseOption, ecModel._theme.option);\n      // TODO Needs clone when merging to the unexisted property\n      merge(baseOption, globalDefault, false);\n      ecModel._mergeOption(baseOption, null);\n    };\n  }();\n  return GlobalModel;\n}(Model);\nfunction isNotTargetSeries(seriesModel, payload) {\n  if (payload) {\n    var index = payload.seriesIndex;\n    var id = payload.seriesId;\n    var name_1 = payload.seriesName;\n    return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name_1 != null && seriesModel.name !== name_1;\n  }\n}\nfunction mergeTheme(option, theme) {\n  // PENDING\n  // NOT use `colorLayer` in theme if option has `color`\n  var notMergeColorLayer = option.color && !option.colorLayer;\n  each(theme, function (themeItem, name) {\n    if (name === 'colorLayer' && notMergeColorLayer || name === 'color' && option.color) {\n      return;\n    }\n    // If it is component model mainType, the model handles that merge later.\n    // otherwise, merge them here.\n    if (!ComponentModel.hasClass(name)) {\n      if (typeof themeItem === 'object') {\n        option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false);\n      } else {\n        if (option[name] == null) {\n          option[name] = themeItem;\n        }\n      }\n    }\n  });\n}\nfunction queryByIdOrName(attr, idOrName, cmpts) {\n  // Here is a break from echarts4: string and number are\n  // treated as equal.\n  if (isArray(idOrName)) {\n    var keyMap_1 = createHashMap();\n    each(idOrName, function (idOrNameItem) {\n      if (idOrNameItem != null) {\n        var idName = modelUtil.convertOptionIdName(idOrNameItem, null);\n        idName != null && keyMap_1.set(idOrNameItem, true);\n      }\n    });\n    return filter(cmpts, function (cmpt) {\n      return cmpt && keyMap_1.get(cmpt[attr]);\n    });\n  } else {\n    var idName_1 = modelUtil.convertOptionIdName(idOrName, null);\n    return filter(cmpts, function (cmpt) {\n      return cmpt && idName_1 != null && cmpt[attr] === idName_1;\n    });\n  }\n}\nfunction filterBySubType(components, condition) {\n  // Using hasOwnProperty for restrict. Consider\n  // subType is undefined in user payload.\n  return condition.hasOwnProperty('subType') ? filter(components, function (cmpt) {\n    return cmpt && cmpt.subType === condition.subType;\n  }) : components;\n}\nfunction normalizeSetOptionInput(opts) {\n  var replaceMergeMainTypeMap = createHashMap();\n  opts && each(modelUtil.normalizeToArray(opts.replaceMerge), function (mainType) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(ComponentModel.hasClass(mainType), '\"' + mainType + '\" is not valid component main type in \"replaceMerge\"');\n    }\n    replaceMergeMainTypeMap.set(mainType, true);\n  });\n  return {\n    replaceMergeMainTypeMap: replaceMergeMainTypeMap\n  };\n}\nmixin(GlobalModel, PaletteMixin);\nexport default GlobalModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar availableMethods = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isSSR', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL',\n// 'getModel',\n'getOption',\n// 'getViewOfComponentModel',\n// 'getViewOfSeriesModel',\n'getId', 'updateLabelLayout'];\nvar ExtensionAPI = /** @class */function () {\n  function ExtensionAPI(ecInstance) {\n    zrUtil.each(availableMethods, function (methodName) {\n      this[methodName] = zrUtil.bind(ecInstance[methodName], ecInstance);\n    }, this);\n  }\n  return ExtensionAPI;\n}();\nexport default ExtensionAPI;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { normalizeToArray\n// , MappingExistingItem, setComponentTypeToKeyInfo, mappingToExists\n} from '../util/model.js';\nimport { each, clone, map, isTypedArray, setAsPrimitive, isArray, isObject\n// , HashMap , createHashMap, extend, merge,\n} from 'zrender/lib/core/util.js';\nimport { error } from '../util/log.js';\nvar QUERY_REG = /^(min|max)?(.+)$/;\n// Key: mainType\n// type FakeComponentsMap = HashMap<(MappingExistingItem & { subType: string })[]>;\n/**\n * TERM EXPLANATIONS:\n * See `ECOption` and `ECUnitOption` in `src/util/types.ts`.\n */\nvar OptionManager = /** @class */function () {\n  // timeline.notMerge is not supported in ec3. Firstly there is rearly\n  // case that notMerge is needed. Secondly supporting 'notMerge' requires\n  // rawOption cloned and backuped when timeline changed, which does no\n  // good to performance. What's more, that both timeline and setOption\n  // method supply 'notMerge' brings complex and some problems.\n  // Consider this case:\n  // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);\n  // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);\n  function OptionManager(api) {\n    this._timelineOptions = [];\n    this._mediaList = [];\n    /**\n     * -1, means default.\n     * empty means no media.\n     */\n    this._currentMediaIndices = [];\n    this._api = api;\n  }\n  OptionManager.prototype.setOption = function (rawOption, optionPreprocessorFuncs, opt) {\n    if (rawOption) {\n      // That set dat primitive is dangerous if user reuse the data when setOption again.\n      each(normalizeToArray(rawOption.series), function (series) {\n        series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data);\n      });\n      each(normalizeToArray(rawOption.dataset), function (dataset) {\n        dataset && dataset.source && isTypedArray(dataset.source) && setAsPrimitive(dataset.source);\n      });\n    }\n    // Caution: some series modify option data, if do not clone,\n    // it should ensure that the repeat modify correctly\n    // (create a new object when modify itself).\n    rawOption = clone(rawOption);\n    // FIXME\n    // If some property is set in timeline options or media option but\n    // not set in baseOption, a warning should be given.\n    var optionBackup = this._optionBackup;\n    var newParsedOption = parseRawOption(rawOption, optionPreprocessorFuncs, !optionBackup);\n    this._newBaseOption = newParsedOption.baseOption;\n    // For setOption at second time (using merge mode);\n    if (optionBackup) {\n      // FIXME\n      // the restore merge solution is essentially incorrect.\n      // the mapping can not be 100% consistent with ecModel, which probably brings\n      // potential bug!\n      // The first merge is delayed, because in most cases, users do not call `setOption` twice.\n      // let fakeCmptsMap = this._fakeCmptsMap;\n      // if (!fakeCmptsMap) {\n      //     fakeCmptsMap = this._fakeCmptsMap = createHashMap();\n      //     mergeToBackupOption(fakeCmptsMap, null, optionBackup.baseOption, null);\n      // }\n      // mergeToBackupOption(\n      //     fakeCmptsMap, optionBackup.baseOption, newParsedOption.baseOption, opt\n      // );\n      // For simplicity, timeline options and media options do not support merge,\n      // that is, if you `setOption` twice and both has timeline options, the latter\n      // timeline options will not be merged to the former, but just substitute them.\n      if (newParsedOption.timelineOptions.length) {\n        optionBackup.timelineOptions = newParsedOption.timelineOptions;\n      }\n      if (newParsedOption.mediaList.length) {\n        optionBackup.mediaList = newParsedOption.mediaList;\n      }\n      if (newParsedOption.mediaDefault) {\n        optionBackup.mediaDefault = newParsedOption.mediaDefault;\n      }\n    } else {\n      this._optionBackup = newParsedOption;\n    }\n  };\n  OptionManager.prototype.mountOption = function (isRecreate) {\n    var optionBackup = this._optionBackup;\n    this._timelineOptions = optionBackup.timelineOptions;\n    this._mediaList = optionBackup.mediaList;\n    this._mediaDefault = optionBackup.mediaDefault;\n    this._currentMediaIndices = [];\n    return clone(isRecreate\n    // this._optionBackup.baseOption, which is created at the first `setOption`\n    // called, and is merged into every new option by inner method `mergeToBackupOption`\n    // each time `setOption` called, can be only used in `isRecreate`, because\n    // its reliability is under suspicion. In other cases option merge is\n    // performed by `model.mergeOption`.\n    ? optionBackup.baseOption : this._newBaseOption);\n  };\n  OptionManager.prototype.getTimelineOption = function (ecModel) {\n    var option;\n    var timelineOptions = this._timelineOptions;\n    if (timelineOptions.length) {\n      // getTimelineOption can only be called after ecModel inited,\n      // so we can get currentIndex from timelineModel.\n      var timelineModel = ecModel.getComponent('timeline');\n      if (timelineModel) {\n        option = clone(\n        // FIXME:TS as TimelineModel or quivlant interface\n        timelineOptions[timelineModel.getCurrentIndex()]);\n      }\n    }\n    return option;\n  };\n  OptionManager.prototype.getMediaOption = function (ecModel) {\n    var ecWidth = this._api.getWidth();\n    var ecHeight = this._api.getHeight();\n    var mediaList = this._mediaList;\n    var mediaDefault = this._mediaDefault;\n    var indices = [];\n    var result = [];\n    // No media defined.\n    if (!mediaList.length && !mediaDefault) {\n      return result;\n    }\n    // Multi media may be applied, the latter defined media has higher priority.\n    for (var i = 0, len = mediaList.length; i < len; i++) {\n      if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {\n        indices.push(i);\n      }\n    }\n    // FIXME\n    // Whether mediaDefault should force users to provide? Otherwise\n    // the change by media query can not be recorvered.\n    if (!indices.length && mediaDefault) {\n      indices = [-1];\n    }\n    if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {\n      result = map(indices, function (index) {\n        return clone(index === -1 ? mediaDefault.option : mediaList[index].option);\n      });\n    }\n    // Otherwise return nothing.\n    this._currentMediaIndices = indices;\n    return result;\n  };\n  return OptionManager;\n}();\n/**\n * [RAW_OPTION_PATTERNS]\n * (Note: \"series: []\" represents all other props in `ECUnitOption`)\n *\n * (1) No prop \"baseOption\" declared:\n * Root option is used as \"baseOption\" (except prop \"options\" and \"media\").\n * ```js\n * option = {\n *     series: [],\n *     timeline: {},\n *     options: [],\n * };\n * option = {\n *     series: [],\n *     media: {},\n * };\n * option = {\n *     series: [],\n *     timeline: {},\n *     options: [],\n *     media: {},\n * }\n * ```\n *\n * (2) Prop \"baseOption\" declared:\n * If \"baseOption\" declared, `ECUnitOption` props can only be declared\n * inside \"baseOption\" except prop \"timeline\" (compat ec2).\n * ```js\n * option = {\n *     baseOption: {\n *         timeline: {},\n *         series: [],\n *     },\n *     options: []\n * };\n * option = {\n *     baseOption: {\n *         series: [],\n *     },\n *     media: []\n * };\n * option = {\n *     baseOption: {\n *         timeline: {},\n *         series: [],\n *     },\n *     options: []\n *     media: []\n * };\n * option = {\n *     // ec3 compat ec2: allow (only) `timeline` declared\n *     // outside baseOption. Keep this setting for compat.\n *     timeline: {},\n *     baseOption: {\n *         series: [],\n *     },\n *     options: [],\n *     media: []\n * };\n * ```\n */\nfunction parseRawOption(\n// `rawOption` May be modified\nrawOption, optionPreprocessorFuncs, isNew) {\n  var mediaList = [];\n  var mediaDefault;\n  var baseOption;\n  var declaredBaseOption = rawOption.baseOption;\n  // Compatible with ec2, [RAW_OPTION_PATTERNS] above.\n  var timelineOnRoot = rawOption.timeline;\n  var timelineOptionsOnRoot = rawOption.options;\n  var mediaOnRoot = rawOption.media;\n  var hasMedia = !!rawOption.media;\n  var hasTimeline = !!(timelineOptionsOnRoot || timelineOnRoot || declaredBaseOption && declaredBaseOption.timeline);\n  if (declaredBaseOption) {\n    baseOption = declaredBaseOption;\n    // For merge option.\n    if (!baseOption.timeline) {\n      baseOption.timeline = timelineOnRoot;\n    }\n  }\n  // For convenience, enable to use the root option as the `baseOption`:\n  // `{ ...normalOptionProps, media: [{ ... }, { ... }] }`\n  else {\n    if (hasTimeline || hasMedia) {\n      rawOption.options = rawOption.media = null;\n    }\n    baseOption = rawOption;\n  }\n  if (hasMedia) {\n    if (isArray(mediaOnRoot)) {\n      each(mediaOnRoot, function (singleMedia) {\n        if (process.env.NODE_ENV !== 'production') {\n          // Real case of wrong config.\n          if (singleMedia && !singleMedia.option && isObject(singleMedia.query) && isObject(singleMedia.query.option)) {\n            error('Illegal media option. Must be like { media: [ { query: {}, option: {} } ] }');\n          }\n        }\n        if (singleMedia && singleMedia.option) {\n          if (singleMedia.query) {\n            mediaList.push(singleMedia);\n          } else if (!mediaDefault) {\n            // Use the first media default.\n            mediaDefault = singleMedia;\n          }\n        }\n      });\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        // Real case of wrong config.\n        error('Illegal media option. Must be an array. Like { media: [ {...}, {...} ] }');\n      }\n    }\n  }\n  doPreprocess(baseOption);\n  each(timelineOptionsOnRoot, function (option) {\n    return doPreprocess(option);\n  });\n  each(mediaList, function (media) {\n    return doPreprocess(media.option);\n  });\n  function doPreprocess(option) {\n    each(optionPreprocessorFuncs, function (preProcess) {\n      preProcess(option, isNew);\n    });\n  }\n  return {\n    baseOption: baseOption,\n    timelineOptions: timelineOptionsOnRoot || [],\n    mediaDefault: mediaDefault,\n    mediaList: mediaList\n  };\n}\n/**\n * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>\n * Support: width, height, aspectRatio\n * Can use max or min as prefix.\n */\nfunction applyMediaQuery(query, ecWidth, ecHeight) {\n  var realMap = {\n    width: ecWidth,\n    height: ecHeight,\n    aspectratio: ecWidth / ecHeight // lower case for convenience.\n  };\n  var applicable = true;\n  each(query, function (value, attr) {\n    var matched = attr.match(QUERY_REG);\n    if (!matched || !matched[1] || !matched[2]) {\n      return;\n    }\n    var operator = matched[1];\n    var realAttr = matched[2].toLowerCase();\n    if (!compare(realMap[realAttr], value, operator)) {\n      applicable = false;\n    }\n  });\n  return applicable;\n}\nfunction compare(real, expect, operator) {\n  if (operator === 'min') {\n    return real >= expect;\n  } else if (operator === 'max') {\n    return real <= expect;\n  } else {\n    // Equals\n    return real === expect;\n  }\n}\nfunction indicesEquals(indices1, indices2) {\n  // indices is always order by asc and has only finite number.\n  return indices1.join(',') === indices2.join(',');\n}\n/**\n * Consider case:\n * `chart.setOption(opt1);`\n * Then user do some interaction like dataZoom, dataView changing.\n * `chart.setOption(opt2);`\n * Then user press 'reset button' in toolbox.\n *\n * After doing that all of the interaction effects should be reset, the\n * chart should be the same as the result of invoke\n * `chart.setOption(opt1); chart.setOption(opt2);`.\n *\n * Although it is not able ensure that\n * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to\n * `chart.setOption(merge(opt1, opt2));` exactly,\n * this might be the only simple way to implement that feature.\n *\n * MEMO: We've considered some other approaches:\n * 1. Each model handles its self restoration but not uniform treatment.\n *     (Too complex in logic and error-prone)\n * 2. Use a shadow ecModel. (Performance expensive)\n *\n * FIXME: A possible solution:\n * Add a extra level of model for each component model. The inheritance chain would be:\n * ecModel <- componentModel <- componentActionModel <- dataItemModel\n * And all of the actions can only modify the `componentActionModel` rather than\n * `componentModel`. `setOption` will only modify the `ecModel` and `componentModel`.\n * When \"resotre\" action triggered, model from `componentActionModel` will be discarded\n * instead of recreating the \"ecModel\" from the \"_optionBackup\".\n */\n// function mergeToBackupOption(\n//     fakeCmptsMap: FakeComponentsMap,\n//     // `tarOption` Can be null/undefined, means init\n//     tarOption: ECUnitOption,\n//     newOption: ECUnitOption,\n//     // Can be null/undefined\n//     opt: InnerSetOptionOpts\n// ): void {\n//     newOption = newOption || {} as ECUnitOption;\n//     const notInit = !!tarOption;\n//     each(newOption, function (newOptsInMainType, mainType) {\n//         if (newOptsInMainType == null) {\n//             return;\n//         }\n//         if (!ComponentModel.hasClass(mainType)) {\n//             if (tarOption) {\n//                 tarOption[mainType] = merge(tarOption[mainType], newOptsInMainType, true);\n//             }\n//         }\n//         else {\n//             const oldTarOptsInMainType = notInit ? normalizeToArray(tarOption[mainType]) : null;\n//             const oldFakeCmptsInMainType = fakeCmptsMap.get(mainType) || [];\n//             const resultTarOptsInMainType = notInit ? (tarOption[mainType] = [] as ComponentOption[]) : null;\n//             const resultFakeCmptsInMainType = fakeCmptsMap.set(mainType, []);\n//             const mappingResult = mappingToExists(\n//                 oldFakeCmptsInMainType,\n//                 normalizeToArray(newOptsInMainType),\n//                 (opt && opt.replaceMergeMainTypeMap.get(mainType)) ? 'replaceMerge' : 'normalMerge'\n//             );\n//             setComponentTypeToKeyInfo(mappingResult, mainType, ComponentModel as ComponentModelConstructor);\n//             each(mappingResult, function (resultItem, index) {\n//                 // The same logic as `Global.ts#_mergeOption`.\n//                 let fakeCmpt = resultItem.existing;\n//                 const newOption = resultItem.newOption;\n//                 const keyInfo = resultItem.keyInfo;\n//                 let fakeCmptOpt;\n//                 if (!newOption) {\n//                     fakeCmptOpt = oldTarOptsInMainType[index];\n//                 }\n//                 else {\n//                     if (fakeCmpt && fakeCmpt.subType === keyInfo.subType) {\n//                         fakeCmpt.name = keyInfo.name;\n//                         if (notInit) {\n//                             fakeCmptOpt = merge(oldTarOptsInMainType[index], newOption, true);\n//                         }\n//                     }\n//                     else {\n//                         fakeCmpt = extend({}, keyInfo);\n//                         if (notInit) {\n//                             fakeCmptOpt = clone(newOption);\n//                         }\n//                     }\n//                 }\n//                 if (fakeCmpt) {\n//                     notInit && resultTarOptsInMainType.push(fakeCmptOpt);\n//                     resultFakeCmptsInMainType.push(fakeCmpt);\n//                 }\n//                 else {\n//                     notInit && resultTarOptsInMainType.push(void 0);\n//                     resultFakeCmptsInMainType.push(void 0);\n//                 }\n//             });\n//         }\n//     });\n// }\nexport default OptionManager;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../../util/model.js';\nimport { deprecateLog, deprecateReplaceLog } from '../../util/log.js';\nvar each = zrUtil.each;\nvar isObject = zrUtil.isObject;\nvar POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine'];\nfunction compatEC2ItemStyle(opt) {\n  var itemStyleOpt = opt && opt.itemStyle;\n  if (!itemStyleOpt) {\n    return;\n  }\n  for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) {\n    var styleName = POSSIBLE_STYLES[i];\n    var normalItemStyleOpt = itemStyleOpt.normal;\n    var emphasisItemStyleOpt = itemStyleOpt.emphasis;\n    if (normalItemStyleOpt && normalItemStyleOpt[styleName]) {\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateReplaceLog(\"itemStyle.normal.\" + styleName, styleName);\n      }\n      opt[styleName] = opt[styleName] || {};\n      if (!opt[styleName].normal) {\n        opt[styleName].normal = normalItemStyleOpt[styleName];\n      } else {\n        zrUtil.merge(opt[styleName].normal, normalItemStyleOpt[styleName]);\n      }\n      normalItemStyleOpt[styleName] = null;\n    }\n    if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) {\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateReplaceLog(\"itemStyle.emphasis.\" + styleName, \"emphasis.\" + styleName);\n      }\n      opt[styleName] = opt[styleName] || {};\n      if (!opt[styleName].emphasis) {\n        opt[styleName].emphasis = emphasisItemStyleOpt[styleName];\n      } else {\n        zrUtil.merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]);\n      }\n      emphasisItemStyleOpt[styleName] = null;\n    }\n  }\n}\nfunction convertNormalEmphasis(opt, optType, useExtend) {\n  if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) {\n    var normalOpt = opt[optType].normal;\n    var emphasisOpt = opt[optType].emphasis;\n    if (normalOpt) {\n      if (process.env.NODE_ENV !== 'production') {\n        // eslint-disable-next-line max-len\n        deprecateLog(\"'normal' hierarchy in \" + optType + \" has been removed since 4.0. All style properties are configured in \" + optType + \" directly now.\");\n      }\n      // Timeline controlStyle has other properties besides normal and emphasis\n      if (useExtend) {\n        opt[optType].normal = opt[optType].emphasis = null;\n        zrUtil.defaults(opt[optType], normalOpt);\n      } else {\n        opt[optType] = normalOpt;\n      }\n    }\n    if (emphasisOpt) {\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateLog(optType + \".emphasis has been changed to emphasis.\" + optType + \" since 4.0\");\n      }\n      opt.emphasis = opt.emphasis || {};\n      opt.emphasis[optType] = emphasisOpt;\n      // Also compat the case user mix the style and focus together in ec3 style\n      // for example: { itemStyle: { normal: {}, emphasis: {focus, shadowBlur} } }\n      if (emphasisOpt.focus) {\n        opt.emphasis.focus = emphasisOpt.focus;\n      }\n      if (emphasisOpt.blurScope) {\n        opt.emphasis.blurScope = emphasisOpt.blurScope;\n      }\n    }\n  }\n}\nfunction removeEC3NormalStatus(opt) {\n  convertNormalEmphasis(opt, 'itemStyle');\n  convertNormalEmphasis(opt, 'lineStyle');\n  convertNormalEmphasis(opt, 'areaStyle');\n  convertNormalEmphasis(opt, 'label');\n  convertNormalEmphasis(opt, 'labelLine');\n  // treemap\n  convertNormalEmphasis(opt, 'upperLabel');\n  // graph\n  convertNormalEmphasis(opt, 'edgeLabel');\n}\nfunction compatTextStyle(opt, propName) {\n  // Check whether is not object (string\\null\\undefined ...)\n  var labelOptSingle = isObject(opt) && opt[propName];\n  var textStyle = isObject(labelOptSingle) && labelOptSingle.textStyle;\n  if (textStyle) {\n    if (process.env.NODE_ENV !== 'production') {\n      // eslint-disable-next-line max-len\n      deprecateLog(\"textStyle hierarchy in \" + propName + \" has been removed since 4.0. All textStyle properties are configured in \" + propName + \" directly now.\");\n    }\n    for (var i = 0, len = modelUtil.TEXT_STYLE_OPTIONS.length; i < len; i++) {\n      var textPropName = modelUtil.TEXT_STYLE_OPTIONS[i];\n      if (textStyle.hasOwnProperty(textPropName)) {\n        labelOptSingle[textPropName] = textStyle[textPropName];\n      }\n    }\n  }\n}\nfunction compatEC3CommonStyles(opt) {\n  if (opt) {\n    removeEC3NormalStatus(opt);\n    compatTextStyle(opt, 'label');\n    opt.emphasis && compatTextStyle(opt.emphasis, 'label');\n  }\n}\nfunction processSeries(seriesOpt) {\n  if (!isObject(seriesOpt)) {\n    return;\n  }\n  compatEC2ItemStyle(seriesOpt);\n  removeEC3NormalStatus(seriesOpt);\n  compatTextStyle(seriesOpt, 'label');\n  // treemap\n  compatTextStyle(seriesOpt, 'upperLabel');\n  // graph\n  compatTextStyle(seriesOpt, 'edgeLabel');\n  if (seriesOpt.emphasis) {\n    compatTextStyle(seriesOpt.emphasis, 'label');\n    // treemap\n    compatTextStyle(seriesOpt.emphasis, 'upperLabel');\n    // graph\n    compatTextStyle(seriesOpt.emphasis, 'edgeLabel');\n  }\n  var markPoint = seriesOpt.markPoint;\n  if (markPoint) {\n    compatEC2ItemStyle(markPoint);\n    compatEC3CommonStyles(markPoint);\n  }\n  var markLine = seriesOpt.markLine;\n  if (markLine) {\n    compatEC2ItemStyle(markLine);\n    compatEC3CommonStyles(markLine);\n  }\n  var markArea = seriesOpt.markArea;\n  if (markArea) {\n    compatEC3CommonStyles(markArea);\n  }\n  var data = seriesOpt.data;\n  // Break with ec3: if `setOption` again, there may be no `type` in option,\n  // then the backward compat based on option type will not be performed.\n  if (seriesOpt.type === 'graph') {\n    data = data || seriesOpt.nodes;\n    var edgeData = seriesOpt.links || seriesOpt.edges;\n    if (edgeData && !zrUtil.isTypedArray(edgeData)) {\n      for (var i = 0; i < edgeData.length; i++) {\n        compatEC3CommonStyles(edgeData[i]);\n      }\n    }\n    zrUtil.each(seriesOpt.categories, function (opt) {\n      removeEC3NormalStatus(opt);\n    });\n  }\n  if (data && !zrUtil.isTypedArray(data)) {\n    for (var i = 0; i < data.length; i++) {\n      compatEC3CommonStyles(data[i]);\n    }\n  }\n  // mark point data\n  markPoint = seriesOpt.markPoint;\n  if (markPoint && markPoint.data) {\n    var mpData = markPoint.data;\n    for (var i = 0; i < mpData.length; i++) {\n      compatEC3CommonStyles(mpData[i]);\n    }\n  }\n  // mark line data\n  markLine = seriesOpt.markLine;\n  if (markLine && markLine.data) {\n    var mlData = markLine.data;\n    for (var i = 0; i < mlData.length; i++) {\n      if (zrUtil.isArray(mlData[i])) {\n        compatEC3CommonStyles(mlData[i][0]);\n        compatEC3CommonStyles(mlData[i][1]);\n      } else {\n        compatEC3CommonStyles(mlData[i]);\n      }\n    }\n  }\n  // Series\n  if (seriesOpt.type === 'gauge') {\n    compatTextStyle(seriesOpt, 'axisLabel');\n    compatTextStyle(seriesOpt, 'title');\n    compatTextStyle(seriesOpt, 'detail');\n  } else if (seriesOpt.type === 'treemap') {\n    convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle');\n    zrUtil.each(seriesOpt.levels, function (opt) {\n      removeEC3NormalStatus(opt);\n    });\n  } else if (seriesOpt.type === 'tree') {\n    removeEC3NormalStatus(seriesOpt.leaves);\n  }\n  // sunburst starts from ec4, so it does not need to compat levels.\n}\nfunction toArr(o) {\n  return zrUtil.isArray(o) ? o : o ? [o] : [];\n}\nfunction toObj(o) {\n  return (zrUtil.isArray(o) ? o[0] : o) || {};\n}\nexport default function globalCompatStyle(option, isTheme) {\n  each(toArr(option.series), function (seriesOpt) {\n    isObject(seriesOpt) && processSeries(seriesOpt);\n  });\n  var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar'];\n  isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis');\n  each(axes, function (axisName) {\n    each(toArr(option[axisName]), function (axisOpt) {\n      if (axisOpt) {\n        compatTextStyle(axisOpt, 'axisLabel');\n        compatTextStyle(axisOpt.axisPointer, 'label');\n      }\n    });\n  });\n  each(toArr(option.parallel), function (parallelOpt) {\n    var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault;\n    compatTextStyle(parallelAxisDefault, 'axisLabel');\n    compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label');\n  });\n  each(toArr(option.calendar), function (calendarOpt) {\n    convertNormalEmphasis(calendarOpt, 'itemStyle');\n    compatTextStyle(calendarOpt, 'dayLabel');\n    compatTextStyle(calendarOpt, 'monthLabel');\n    compatTextStyle(calendarOpt, 'yearLabel');\n  });\n  // radar.name.textStyle\n  each(toArr(option.radar), function (radarOpt) {\n    compatTextStyle(radarOpt, 'name');\n    // Use axisName instead of name because component has name property\n    if (radarOpt.name && radarOpt.axisName == null) {\n      radarOpt.axisName = radarOpt.name;\n      delete radarOpt.name;\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateLog('name property in radar component has been changed to axisName');\n      }\n    }\n    if (radarOpt.nameGap != null && radarOpt.axisNameGap == null) {\n      radarOpt.axisNameGap = radarOpt.nameGap;\n      delete radarOpt.nameGap;\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateLog('nameGap property in radar component has been changed to axisNameGap');\n      }\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      each(radarOpt.indicator, function (indicatorOpt) {\n        if (indicatorOpt.text) {\n          deprecateReplaceLog('text', 'name', 'radar.indicator');\n        }\n      });\n    }\n  });\n  each(toArr(option.geo), function (geoOpt) {\n    if (isObject(geoOpt)) {\n      compatEC3CommonStyles(geoOpt);\n      each(toArr(geoOpt.regions), function (regionObj) {\n        compatEC3CommonStyles(regionObj);\n      });\n    }\n  });\n  each(toArr(option.timeline), function (timelineOpt) {\n    compatEC3CommonStyles(timelineOpt);\n    convertNormalEmphasis(timelineOpt, 'label');\n    convertNormalEmphasis(timelineOpt, 'itemStyle');\n    convertNormalEmphasis(timelineOpt, 'controlStyle', true);\n    var data = timelineOpt.data;\n    zrUtil.isArray(data) && zrUtil.each(data, function (item) {\n      if (zrUtil.isObject(item)) {\n        convertNormalEmphasis(item, 'label');\n        convertNormalEmphasis(item, 'itemStyle');\n      }\n    });\n  });\n  each(toArr(option.toolbox), function (toolboxOpt) {\n    convertNormalEmphasis(toolboxOpt, 'iconStyle');\n    each(toolboxOpt.feature, function (featureOpt) {\n      convertNormalEmphasis(featureOpt, 'iconStyle');\n    });\n  });\n  compatTextStyle(toObj(option.axisPointer), 'label');\n  compatTextStyle(toObj(option.tooltip).axisPointer, 'label');\n  // Clean logs\n  // storedLogs = {};\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, isArray, isObject, isTypedArray, defaults } from 'zrender/lib/core/util.js';\nimport compatStyle from './helper/compatStyle.js';\nimport { normalizeToArray } from '../util/model.js';\nimport { deprecateLog, deprecateReplaceLog } from '../util/log.js';\nfunction get(opt, path) {\n  var pathArr = path.split(',');\n  var obj = opt;\n  for (var i = 0; i < pathArr.length; i++) {\n    obj = obj && obj[pathArr[i]];\n    if (obj == null) {\n      break;\n    }\n  }\n  return obj;\n}\nfunction set(opt, path, val, overwrite) {\n  var pathArr = path.split(',');\n  var obj = opt;\n  var key;\n  var i = 0;\n  for (; i < pathArr.length - 1; i++) {\n    key = pathArr[i];\n    if (obj[key] == null) {\n      obj[key] = {};\n    }\n    obj = obj[key];\n  }\n  if (overwrite || obj[pathArr[i]] == null) {\n    obj[pathArr[i]] = val;\n  }\n}\nfunction compatLayoutProperties(option) {\n  option && each(LAYOUT_PROPERTIES, function (prop) {\n    if (prop[0] in option && !(prop[1] in option)) {\n      option[prop[1]] = option[prop[0]];\n    }\n  });\n}\nvar LAYOUT_PROPERTIES = [['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']];\nvar COMPATITABLE_COMPONENTS = ['grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline'];\nvar BAR_ITEM_STYLE_MAP = [['borderRadius', 'barBorderRadius'], ['borderColor', 'barBorderColor'], ['borderWidth', 'barBorderWidth']];\nfunction compatBarItemStyle(option) {\n  var itemStyle = option && option.itemStyle;\n  if (itemStyle) {\n    for (var i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) {\n      var oldName = BAR_ITEM_STYLE_MAP[i][1];\n      var newName = BAR_ITEM_STYLE_MAP[i][0];\n      if (itemStyle[oldName] != null) {\n        itemStyle[newName] = itemStyle[oldName];\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateReplaceLog(oldName, newName);\n        }\n      }\n    }\n  }\n}\nfunction compatPieLabel(option) {\n  if (!option) {\n    return;\n  }\n  if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) {\n    if (process.env.NODE_ENV !== 'production') {\n      deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie');\n    }\n    option.edgeDistance = option.margin;\n  }\n}\nfunction compatSunburstState(option) {\n  if (!option) {\n    return;\n  }\n  if (option.downplay && !option.blur) {\n    option.blur = option.downplay;\n    if (process.env.NODE_ENV !== 'production') {\n      deprecateReplaceLog('downplay', 'blur', 'sunburst');\n    }\n  }\n}\nfunction compatGraphFocus(option) {\n  if (!option) {\n    return;\n  }\n  if (option.focusNodeAdjacency != null) {\n    option.emphasis = option.emphasis || {};\n    if (option.emphasis.focus == null) {\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \\'adjacency\\'}', 'graph/sankey');\n      }\n      option.emphasis.focus = 'adjacency';\n    }\n  }\n}\nfunction traverseTree(data, cb) {\n  if (data) {\n    for (var i = 0; i < data.length; i++) {\n      cb(data[i]);\n      data[i] && traverseTree(data[i].children, cb);\n    }\n  }\n}\nexport default function globalBackwardCompat(option, isTheme) {\n  compatStyle(option, isTheme);\n  // Make sure series array for model initialization.\n  option.series = normalizeToArray(option.series);\n  each(option.series, function (seriesOpt) {\n    if (!isObject(seriesOpt)) {\n      return;\n    }\n    var seriesType = seriesOpt.type;\n    if (seriesType === 'line') {\n      if (seriesOpt.clipOverflow != null) {\n        seriesOpt.clip = seriesOpt.clipOverflow;\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateReplaceLog('clipOverflow', 'clip', 'line');\n        }\n      }\n    } else if (seriesType === 'pie' || seriesType === 'gauge') {\n      if (seriesOpt.clockWise != null) {\n        seriesOpt.clockwise = seriesOpt.clockWise;\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateReplaceLog('clockWise', 'clockwise');\n        }\n      }\n      compatPieLabel(seriesOpt.label);\n      var data = seriesOpt.data;\n      if (data && !isTypedArray(data)) {\n        for (var i = 0; i < data.length; i++) {\n          compatPieLabel(data[i]);\n        }\n      }\n      if (seriesOpt.hoverOffset != null) {\n        seriesOpt.emphasis = seriesOpt.emphasis || {};\n        if (seriesOpt.emphasis.scaleSize = null) {\n          if (process.env.NODE_ENV !== 'production') {\n            deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize');\n          }\n          seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset;\n        }\n      }\n    } else if (seriesType === 'gauge') {\n      var pointerColor = get(seriesOpt, 'pointer.color');\n      pointerColor != null && set(seriesOpt, 'itemStyle.color', pointerColor);\n    } else if (seriesType === 'bar') {\n      compatBarItemStyle(seriesOpt);\n      compatBarItemStyle(seriesOpt.backgroundStyle);\n      compatBarItemStyle(seriesOpt.emphasis);\n      var data = seriesOpt.data;\n      if (data && !isTypedArray(data)) {\n        for (var i = 0; i < data.length; i++) {\n          if (typeof data[i] === 'object') {\n            compatBarItemStyle(data[i]);\n            compatBarItemStyle(data[i] && data[i].emphasis);\n          }\n        }\n      }\n    } else if (seriesType === 'sunburst') {\n      var highlightPolicy = seriesOpt.highlightPolicy;\n      if (highlightPolicy) {\n        seriesOpt.emphasis = seriesOpt.emphasis || {};\n        if (!seriesOpt.emphasis.focus) {\n          seriesOpt.emphasis.focus = highlightPolicy;\n          if (process.env.NODE_ENV !== 'production') {\n            deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst');\n          }\n        }\n      }\n      compatSunburstState(seriesOpt);\n      traverseTree(seriesOpt.data, compatSunburstState);\n    } else if (seriesType === 'graph' || seriesType === 'sankey') {\n      compatGraphFocus(seriesOpt);\n      // TODO nodes, edges?\n    } else if (seriesType === 'map') {\n      if (seriesOpt.mapType && !seriesOpt.map) {\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateReplaceLog('mapType', 'map', 'map');\n        }\n        seriesOpt.map = seriesOpt.mapType;\n      }\n      if (seriesOpt.mapLocation) {\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateLog('`mapLocation` is not used anymore.');\n        }\n        defaults(seriesOpt, seriesOpt.mapLocation);\n      }\n    }\n    if (seriesOpt.hoverAnimation != null) {\n      seriesOpt.emphasis = seriesOpt.emphasis || {};\n      if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) {\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateReplaceLog('hoverAnimation', 'emphasis.scale');\n        }\n        seriesOpt.emphasis.scale = seriesOpt.hoverAnimation;\n      }\n    }\n    compatLayoutProperties(seriesOpt);\n  });\n  // dataRange has changed to visualMap\n  if (option.dataRange) {\n    option.visualMap = option.dataRange;\n  }\n  each(COMPATITABLE_COMPONENTS, function (componentName) {\n    var options = option[componentName];\n    if (options) {\n      if (!isArray(options)) {\n        options = [options];\n      }\n      each(options, function (option) {\n        compatLayoutProperties(option);\n      });\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, each } from 'zrender/lib/core/util.js';\nimport { addSafe } from '../util/number.js';\n// (1) [Caution]: the logic is correct based on the premises:\n//     data processing stage is blocked in stream.\n//     See <module:echarts/stream/Scheduler#performDataProcessorTasks>\n// (2) Only register once when import repeatedly.\n//     Should be executed after series is filtered and before stack calculation.\nexport default function dataStack(ecModel) {\n  var stackInfoMap = createHashMap();\n  ecModel.eachSeries(function (seriesModel) {\n    var stack = seriesModel.get('stack');\n    // Compatible: when `stack` is set as '', do not stack.\n    if (stack) {\n      var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []);\n      var data = seriesModel.getData();\n      var stackInfo = {\n        // Used for calculate axis extent automatically.\n        // TODO: Type getCalculationInfo return more specific type?\n        stackResultDimension: data.getCalculationInfo('stackResultDimension'),\n        stackedOverDimension: data.getCalculationInfo('stackedOverDimension'),\n        stackedDimension: data.getCalculationInfo('stackedDimension'),\n        stackedByDimension: data.getCalculationInfo('stackedByDimension'),\n        isStackedByIndex: data.getCalculationInfo('isStackedByIndex'),\n        data: data,\n        seriesModel: seriesModel\n      };\n      // If stacked on axis that do not support data stack.\n      if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) {\n        return;\n      }\n      stackInfoList.push(stackInfo);\n    }\n  });\n  // Process each stack group\n  stackInfoMap.each(function (stackInfoList) {\n    if (stackInfoList.length === 0) {\n      return;\n    }\n    // Check if stack order needs to be reversed\n    var firstSeries = stackInfoList[0].seriesModel;\n    var stackOrder = firstSeries.get('stackOrder') || 'seriesAsc';\n    if (stackOrder === 'seriesDesc') {\n      stackInfoList.reverse();\n    }\n    // Set stackedOnSeries for each series in the final order\n    each(stackInfoList, function (stackInfo, index) {\n      stackInfo.data.setCalculationInfo('stackedOnSeries', index > 0 ? stackInfoList[index - 1].seriesModel : null);\n    });\n    // Calculate stack values\n    calculateStack(stackInfoList);\n  });\n}\nfunction calculateStack(stackInfoList) {\n  each(stackInfoList, function (targetStackInfo, idxInStack) {\n    var resultVal = [];\n    var resultNaN = [NaN, NaN];\n    var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension];\n    var targetData = targetStackInfo.data;\n    var isStackedByIndex = targetStackInfo.isStackedByIndex;\n    var stackStrategy = targetStackInfo.seriesModel.get('stackStrategy') || 'samesign';\n    // Should not write on raw data, because stack series model list changes\n    // depending on legend selection.\n    targetData.modify(dims, function (v0, v1, dataIndex) {\n      var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex);\n      // Consider `connectNulls` of line area, if value is NaN, stackedOver\n      // should also be NaN, to draw a appropriate belt area.\n      if (isNaN(sum)) {\n        return resultNaN;\n      }\n      var byValue;\n      var stackedDataRawIndex;\n      if (isStackedByIndex) {\n        stackedDataRawIndex = targetData.getRawIndex(dataIndex);\n      } else {\n        byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex);\n      }\n      // If stackOver is NaN, chart view will render point on value start.\n      var stackedOver = NaN;\n      for (var j = idxInStack - 1; j >= 0; j--) {\n        var stackInfo = stackInfoList[j];\n        // Has been optimized by inverted indices on `stackedByDimension`.\n        if (!isStackedByIndex) {\n          stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue);\n        }\n        if (stackedDataRawIndex >= 0) {\n          var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex);\n          // Considering positive stack, negative stack and empty data\n          if (stackStrategy === 'all' // single stack group\n          || stackStrategy === 'positive' && val > 0 || stackStrategy === 'negative' && val < 0 || stackStrategy === 'samesign' && sum >= 0 && val > 0 // All positive stack\n          || stackStrategy === 'samesign' && sum <= 0 && val < 0 // All negative stack\n          ) {\n            // The sum has to be very small to be affected by the\n            // floating arithmetic problem. An incorrect result will probably\n            // cause axis min/max to be filtered incorrectly.\n            sum = addSafe(sum, val);\n            stackedOver = val;\n            break;\n          }\n        }\n      }\n      resultVal[0] = sum;\n      resultVal[1] = stackedOver;\n      return resultVal;\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isTypedArray, clone, createHashMap, isArray, isObject, isArrayLike, hasOwn, assert, each, map, isNumber, isString, keys } from 'zrender/lib/core/util.js';\nimport { SOURCE_FORMAT_ORIGINAL, SERIES_LAYOUT_BY_COLUMN, SOURCE_FORMAT_UNKNOWN, SOURCE_FORMAT_KEYED_COLUMNS, SOURCE_FORMAT_TYPED_ARRAY, SOURCE_FORMAT_ARRAY_ROWS, SOURCE_FORMAT_OBJECT_ROWS, SERIES_LAYOUT_BY_ROW } from '../util/types.js';\nimport { getDataItemValue } from '../util/model.js';\nimport { BE_ORDINAL, guessOrdinal } from './helper/sourceHelper.js';\n;\n// @inner\nvar SourceImpl = /** @class */function () {\n  function SourceImpl(fields) {\n    this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []);\n    this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN;\n    // Visit config\n    this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN;\n    this.startIndex = fields.startIndex || 0;\n    this.dimensionsDetectedCount = fields.dimensionsDetectedCount;\n    this.metaRawOption = fields.metaRawOption;\n    var dimensionsDefine = this.dimensionsDefine = fields.dimensionsDefine;\n    if (dimensionsDefine) {\n      for (var i = 0; i < dimensionsDefine.length; i++) {\n        var dim = dimensionsDefine[i];\n        if (dim.type == null) {\n          if (guessOrdinal(this, i) === BE_ORDINAL.Must) {\n            dim.type = 'ordinal';\n          }\n        }\n      }\n    }\n  }\n  return SourceImpl;\n}();\nexport function isSourceInstance(val) {\n  return val instanceof SourceImpl;\n}\n/**\n * Create a source from option.\n * NOTE: Created source is immutable. Don't change any properties in it.\n */\nexport function createSource(sourceData, thisMetaRawOption,\n// can be null. If not provided, auto detect it from `sourceData`.\nsourceFormat) {\n  sourceFormat = sourceFormat || detectSourceFormat(sourceData);\n  var seriesLayoutBy = thisMetaRawOption.seriesLayoutBy;\n  var determined = determineSourceDimensions(sourceData, sourceFormat, seriesLayoutBy, thisMetaRawOption.sourceHeader, thisMetaRawOption.dimensions);\n  var source = new SourceImpl({\n    data: sourceData,\n    sourceFormat: sourceFormat,\n    seriesLayoutBy: seriesLayoutBy,\n    dimensionsDefine: determined.dimensionsDefine,\n    startIndex: determined.startIndex,\n    dimensionsDetectedCount: determined.dimensionsDetectedCount,\n    metaRawOption: clone(thisMetaRawOption)\n  });\n  return source;\n}\n/**\n * Wrap original series data for some compatibility cases.\n */\nexport function createSourceFromSeriesDataOption(data) {\n  return new SourceImpl({\n    data: data,\n    sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL\n  });\n}\n/**\n * Clone source but excludes source data.\n */\nexport function cloneSourceShallow(source) {\n  return new SourceImpl({\n    data: source.data,\n    sourceFormat: source.sourceFormat,\n    seriesLayoutBy: source.seriesLayoutBy,\n    dimensionsDefine: clone(source.dimensionsDefine),\n    startIndex: source.startIndex,\n    dimensionsDetectedCount: source.dimensionsDetectedCount\n  });\n}\n/**\n * Note: An empty array will be detected as `SOURCE_FORMAT_ARRAY_ROWS`.\n */\nexport function detectSourceFormat(data) {\n  var sourceFormat = SOURCE_FORMAT_UNKNOWN;\n  if (isTypedArray(data)) {\n    sourceFormat = SOURCE_FORMAT_TYPED_ARRAY;\n  } else if (isArray(data)) {\n    // FIXME Whether tolerate null in top level array?\n    if (data.length === 0) {\n      sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;\n    }\n    for (var i = 0, len = data.length; i < len; i++) {\n      var item = data[i];\n      if (item == null) {\n        continue;\n      } else if (isArray(item) || isTypedArray(item)) {\n        sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;\n        break;\n      } else if (isObject(item)) {\n        sourceFormat = SOURCE_FORMAT_OBJECT_ROWS;\n        break;\n      }\n    }\n  } else if (isObject(data)) {\n    for (var key in data) {\n      if (hasOwn(data, key) && isArrayLike(data[key])) {\n        sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS;\n        break;\n      }\n    }\n  }\n  return sourceFormat;\n}\n/**\n * Determine the source definitions from data standalone dimensions definitions\n * are not specified.\n */\nfunction determineSourceDimensions(data, sourceFormat, seriesLayoutBy, sourceHeader,\n// standalone raw dimensions definition, like:\n// {\n//     dimensions: ['aa', 'bb', { name: 'cc', type: 'time' }]\n// }\n// in `dataset` or `series`\ndimensionsDefine) {\n  var dimensionsDetectedCount;\n  var startIndex;\n  // PENDING: Could data be null/undefined here?\n  // currently, if `dataset.source` not specified, error thrown.\n  // if `series.data` not specified, nothing rendered without error thrown.\n  // Should test these cases.\n  if (!data) {\n    return {\n      dimensionsDefine: normalizeDimensionsOption(dimensionsDefine),\n      startIndex: startIndex,\n      dimensionsDetectedCount: dimensionsDetectedCount\n    };\n  }\n  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n    var dataArrayRows = data;\n    // Rule: Most of the first line are string: it is header.\n    // Caution: consider a line with 5 string and 1 number,\n    // it still can not be sure it is a head, because the\n    // 5 string may be 5 values of category columns.\n    if (sourceHeader === 'auto' || sourceHeader == null) {\n      arrayRowsTravelFirst(function (val) {\n        // '-' is regarded as null/undefined.\n        if (val != null && val !== '-') {\n          if (isString(val)) {\n            startIndex == null && (startIndex = 1);\n          } else {\n            startIndex = 0;\n          }\n        }\n        // 10 is an experience number, avoid long loop.\n      }, seriesLayoutBy, dataArrayRows, 10);\n    } else {\n      startIndex = isNumber(sourceHeader) ? sourceHeader : sourceHeader ? 1 : 0;\n    }\n    if (!dimensionsDefine && startIndex === 1) {\n      dimensionsDefine = [];\n      arrayRowsTravelFirst(function (val, index) {\n        dimensionsDefine[index] = val != null ? val + '' : '';\n      }, seriesLayoutBy, dataArrayRows, Infinity);\n    }\n    dimensionsDetectedCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? dataArrayRows.length : dataArrayRows[0] ? dataArrayRows[0].length : null;\n  } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n    if (!dimensionsDefine) {\n      dimensionsDefine = objectRowsCollectDimensions(data);\n    }\n  } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {\n    if (!dimensionsDefine) {\n      dimensionsDefine = [];\n      each(data, function (colArr, key) {\n        dimensionsDefine.push(key);\n      });\n    }\n  } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n    var value0 = getDataItemValue(data[0]);\n    dimensionsDetectedCount = isArray(value0) && value0.length || 1;\n  } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.');\n    }\n  }\n  return {\n    startIndex: startIndex,\n    dimensionsDefine: normalizeDimensionsOption(dimensionsDefine),\n    dimensionsDetectedCount: dimensionsDetectedCount\n  };\n}\nfunction objectRowsCollectDimensions(data) {\n  var firstIndex = 0;\n  var obj;\n  while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line\n  if (obj) {\n    return keys(obj);\n  }\n}\n// Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'],\n// which is reasonable. But dimension name is duplicated.\n// Returns undefined or an array contains only object without null/undefined or string.\nfunction normalizeDimensionsOption(dimensionsDefine) {\n  if (!dimensionsDefine) {\n    // The meaning of null/undefined is different from empty array.\n    return;\n  }\n  var nameMap = createHashMap();\n  return map(dimensionsDefine, function (rawItem, index) {\n    rawItem = isObject(rawItem) ? rawItem : {\n      name: rawItem\n    };\n    // Other fields will be discarded.\n    var item = {\n      name: rawItem.name,\n      displayName: rawItem.displayName,\n      type: rawItem.type\n    };\n    // User can set null in dimensions.\n    // We don't auto specify name, otherwise a given name may\n    // cause it to be referred unexpectedly.\n    if (item.name == null) {\n      return item;\n    }\n    // Also consider number form like 2012.\n    item.name += '';\n    // User may also specify displayName.\n    // displayName will always exists except user not\n    // specified or dim name is not specified or detected.\n    // (A auto generated dim name will not be used as\n    // displayName).\n    if (item.displayName == null) {\n      item.displayName = item.name;\n    }\n    var exist = nameMap.get(item.name);\n    if (!exist) {\n      nameMap.set(item.name, {\n        count: 1\n      });\n    } else {\n      item.name += '-' + exist.count++;\n    }\n    return item;\n  });\n}\nfunction arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) {\n  if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {\n    for (var i = 0; i < data.length && i < maxLoop; i++) {\n      cb(data[i] ? data[i][0] : null, i);\n    }\n  } else {\n    var value0 = data[0] || [];\n    for (var i = 0; i < value0.length && i < maxLoop; i++) {\n      cb(value0[i], i);\n    }\n  }\n}\nexport function shouldRetrieveDataByName(source) {\n  var sourceFormat = source.sourceFormat;\n  return sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar _a, _b, _c, _d;\n// TODO\n// ??? refactor? check the outer usage of data provider.\n// merge with defaultDimValueGetter?\nimport { isTypedArray, extend, assert, each, isObject, bind, isArray } from 'zrender/lib/core/util.js';\nimport { getDataItemValue } from '../../util/model.js';\nimport { createSourceFromSeriesDataOption, isSourceInstance } from '../Source.js';\nimport { SOURCE_FORMAT_ORIGINAL, SOURCE_FORMAT_OBJECT_ROWS, SOURCE_FORMAT_KEYED_COLUMNS, SOURCE_FORMAT_TYPED_ARRAY, SOURCE_FORMAT_ARRAY_ROWS, SERIES_LAYOUT_BY_COLUMN, SERIES_LAYOUT_BY_ROW } from '../../util/types.js';\nimport { error } from '../../util/log.js';\nvar providerMethods;\nvar mountMethods;\n/**\n * If normal array used, mutable chunk size is supported.\n * If typed array used, chunk size must be fixed.\n */\nvar DefaultDataProvider = /** @class */function () {\n  function DefaultDataProvider(sourceParam, dimSize) {\n    // let source: Source;\n    var source = !isSourceInstance(sourceParam) ? createSourceFromSeriesDataOption(sourceParam) : sourceParam;\n    // declare source is Source;\n    this._source = source;\n    var data = this._data = source.data;\n    var sourceFormat = source.sourceFormat;\n    var seriesLayoutBy = source.seriesLayoutBy;\n    // Typed array. TODO IE10+?\n    if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (dimSize == null) {\n          throw new Error('Typed array data must specify dimension size');\n        }\n      }\n      this._offset = 0;\n      this._dimSize = dimSize;\n      this._data = data;\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      var validator = rawSourceDataValidatorMap[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n      validator && validator(data, source.dimensionsDefine);\n    }\n    mountMethods(this, data, source);\n  }\n  DefaultDataProvider.prototype.getSource = function () {\n    return this._source;\n  };\n  DefaultDataProvider.prototype.count = function () {\n    return 0;\n  };\n  DefaultDataProvider.prototype.getItem = function (idx, out) {\n    return;\n  };\n  DefaultDataProvider.prototype.appendData = function (newData) {};\n  DefaultDataProvider.prototype.clean = function () {};\n  DefaultDataProvider.protoInitialize = function () {\n    // PENDING: To avoid potential incompat (e.g., prototype\n    // is visited somewhere), still init them on prototype.\n    var proto = DefaultDataProvider.prototype;\n    proto.pure = false;\n    proto.persistent = true;\n  }();\n  DefaultDataProvider.internalField = function () {\n    var _a;\n    mountMethods = function (provider, data, source) {\n      var sourceFormat = source.sourceFormat;\n      var seriesLayoutBy = source.seriesLayoutBy;\n      var startIndex = source.startIndex;\n      var dimsDef = source.dimensionsDefine;\n      var methods = providerMethods[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n      if (process.env.NODE_ENV !== 'production') {\n        assert(methods, 'Invalide sourceFormat: ' + sourceFormat);\n      }\n      extend(provider, methods);\n      if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {\n        provider.getItem = getItemForTypedArray;\n        provider.count = countForTypedArray;\n        provider.fillStorage = fillStorageForTypedArray;\n      } else {\n        var rawItemGetter = getRawSourceItemGetter(sourceFormat, seriesLayoutBy);\n        provider.getItem = bind(rawItemGetter, null, data, startIndex, dimsDef);\n        var rawCounter = getRawSourceDataCounter(sourceFormat, seriesLayoutBy);\n        provider.count = bind(rawCounter, null, data, startIndex, dimsDef);\n      }\n    };\n    var getItemForTypedArray = function (idx, out) {\n      idx = idx - this._offset;\n      out = out || [];\n      var data = this._data;\n      var dimSize = this._dimSize;\n      var offset = dimSize * idx;\n      for (var i = 0; i < dimSize; i++) {\n        out[i] = data[offset + i];\n      }\n      return out;\n    };\n    var fillStorageForTypedArray = function (start, end, storage, extent) {\n      var data = this._data;\n      var dimSize = this._dimSize;\n      for (var dim = 0; dim < dimSize; dim++) {\n        var dimExtent = extent[dim];\n        var min = dimExtent[0] == null ? Infinity : dimExtent[0];\n        var max = dimExtent[1] == null ? -Infinity : dimExtent[1];\n        var count = end - start;\n        var arr = storage[dim];\n        for (var i = 0; i < count; i++) {\n          // appendData with TypedArray will always do replace in provider.\n          var val = data[i * dimSize + dim];\n          arr[start + i] = val;\n          val < min && (min = val);\n          val > max && (max = val);\n        }\n        dimExtent[0] = min;\n        dimExtent[1] = max;\n      }\n    };\n    var countForTypedArray = function () {\n      return this._data ? this._data.length / this._dimSize : 0;\n    };\n    providerMethods = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = {\n      pure: true,\n      appendData: appendDataSimply\n    }, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = {\n      pure: true,\n      appendData: function () {\n        throw new Error('Do not support appendData when set seriesLayoutBy: \"row\".');\n      }\n    }, _a[SOURCE_FORMAT_OBJECT_ROWS] = {\n      pure: true,\n      appendData: appendDataSimply\n    }, _a[SOURCE_FORMAT_KEYED_COLUMNS] = {\n      pure: true,\n      appendData: function (newData) {\n        var data = this._data;\n        each(newData, function (newCol, key) {\n          var oldCol = data[key] || (data[key] = []);\n          for (var i = 0; i < (newCol || []).length; i++) {\n            oldCol.push(newCol[i]);\n          }\n        });\n      }\n    }, _a[SOURCE_FORMAT_ORIGINAL] = {\n      appendData: appendDataSimply\n    }, _a[SOURCE_FORMAT_TYPED_ARRAY] = {\n      persistent: false,\n      pure: true,\n      appendData: function (newData) {\n        if (process.env.NODE_ENV !== 'production') {\n          assert(isTypedArray(newData), 'Added data must be TypedArray if data in initialization is TypedArray');\n        }\n        this._data = newData;\n      },\n      // Clean self if data is already used.\n      clean: function () {\n        // PENDING\n        this._offset += this.count();\n        this._data = null;\n      }\n    }, _a);\n    function appendDataSimply(newData) {\n      for (var i = 0; i < newData.length; i++) {\n        this._data.push(newData[i]);\n      }\n    }\n  }();\n  return DefaultDataProvider;\n}();\nexport { DefaultDataProvider };\nvar validateSimply = function (rawData) {\n  if (!isArray(rawData)) {\n    error('series.data or dataset.source must be an array.');\n  }\n};\n/**\n * Only run in dev mode - hint users for debug.\n */\nvar rawSourceDataValidatorMap = (_a = {}, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = validateSimply, _a[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = validateSimply, _a[SOURCE_FORMAT_OBJECT_ROWS] = validateSimply, _a[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, dimsDef) {\n  for (var i = 0; i < dimsDef.length; i++) {\n    var dimName = dimsDef[i].name;\n    if (dimName == null) {\n      error('dimension name must not be null/undefined.');\n    }\n  }\n}, _a[SOURCE_FORMAT_ORIGINAL] = validateSimply, _a);\nvar getItemSimply = function (rawData, startIndex, dimsDef, idx) {\n  return rawData[idx];\n};\nvar rawSourceItemGetterMap = (_b = {}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef, idx) {\n  return rawData[idx + startIndex];\n}, _b[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef, idx, out) {\n  idx += startIndex;\n  var item = out || [];\n  var data = rawData;\n  for (var i = 0; i < data.length; i++) {\n    var row = data[i];\n    item[i] = row ? row[idx] : null;\n  }\n  return item;\n}, _b[SOURCE_FORMAT_OBJECT_ROWS] = getItemSimply, _b[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef, idx, out) {\n  var item = out || [];\n  for (var i = 0; i < dimsDef.length; i++) {\n    var dimName = dimsDef[i].name;\n    var col = dimName != null ? rawData[dimName] : null;\n    item[i] = col ? col[idx] : null;\n  }\n  return item;\n}, _b[SOURCE_FORMAT_ORIGINAL] = getItemSimply, _b);\nexport function getRawSourceItemGetter(sourceFormat, seriesLayoutBy) {\n  var method = rawSourceItemGetterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n  if (process.env.NODE_ENV !== 'production') {\n    assert(method, 'Do not support get item on \"' + sourceFormat + '\", \"' + seriesLayoutBy + '\".');\n  }\n  return method;\n}\nvar countSimply = function (rawData, startIndex, dimsDef) {\n  return rawData.length;\n};\nvar rawSourceDataCounterMap = (_c = {}, _c[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_COLUMN] = function (rawData, startIndex, dimsDef) {\n  return Math.max(0, rawData.length - startIndex);\n}, _c[SOURCE_FORMAT_ARRAY_ROWS + '_' + SERIES_LAYOUT_BY_ROW] = function (rawData, startIndex, dimsDef) {\n  var row = rawData[0];\n  return row ? Math.max(0, row.length - startIndex) : 0;\n}, _c[SOURCE_FORMAT_OBJECT_ROWS] = countSimply, _c[SOURCE_FORMAT_KEYED_COLUMNS] = function (rawData, startIndex, dimsDef) {\n  var dimName = dimsDef[0].name;\n  var col = dimName != null ? rawData[dimName] : null;\n  return col ? col.length : 0;\n}, _c[SOURCE_FORMAT_ORIGINAL] = countSimply, _c);\nexport function getRawSourceDataCounter(sourceFormat, seriesLayoutBy) {\n  var method = rawSourceDataCounterMap[getMethodMapKey(sourceFormat, seriesLayoutBy)];\n  if (process.env.NODE_ENV !== 'production') {\n    assert(method, 'Do not support count on \"' + sourceFormat + '\", \"' + seriesLayoutBy + '\".');\n  }\n  return method;\n}\nvar getRawValueSimply = function (dataItem, dimIndex, property) {\n  return dataItem[dimIndex];\n};\nvar rawSourceValueGetterMap = (_d = {}, _d[SOURCE_FORMAT_ARRAY_ROWS] = getRawValueSimply, _d[SOURCE_FORMAT_OBJECT_ROWS] = function (dataItem, dimIndex, property) {\n  return dataItem[property];\n}, _d[SOURCE_FORMAT_KEYED_COLUMNS] = getRawValueSimply, _d[SOURCE_FORMAT_ORIGINAL] = function (dataItem, dimIndex, property) {\n  // FIXME: In some case (markpoint in geo (geo-map.html)),\n  // dataItem is {coord: [...]}\n  var value = getDataItemValue(dataItem);\n  return !(value instanceof Array) ? value : value[dimIndex];\n}, _d[SOURCE_FORMAT_TYPED_ARRAY] = getRawValueSimply, _d);\nexport function getRawSourceValueGetter(sourceFormat) {\n  var method = rawSourceValueGetterMap[sourceFormat];\n  if (process.env.NODE_ENV !== 'production') {\n    assert(method, 'Do not support get value on \"' + sourceFormat + '\".');\n  }\n  return method;\n}\nfunction getMethodMapKey(sourceFormat, seriesLayoutBy) {\n  return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + seriesLayoutBy : sourceFormat;\n}\n// ??? FIXME can these logic be more neat: getRawValue, getRawDataItem,\n// Consider persistent.\n// Caution: why use raw value to display on label or tooltip?\n// A reason is to avoid format. For example time value we do not know\n// how to format is expected. More over, if stack is used, calculated\n// value may be 0.91000000001, which have brings trouble to display.\n// TODO: consider how to treat null/undefined/NaN when display?\nexport function retrieveRawValue(data, dataIndex,\n// If dimIndex is null/undefined, return OptionDataItem.\n// Otherwise, return OptionDataValue.\ndim) {\n  if (!data) {\n    return;\n  }\n  // Consider data may be not persistent.\n  var dataItem = data.getRawDataItem(dataIndex);\n  if (dataItem == null) {\n    return;\n  }\n  var store = data.getStore();\n  var sourceFormat = store.getSource().sourceFormat;\n  if (dim != null) {\n    var dimIndex = data.getDimensionIndex(dim);\n    var property = store.getDimensionProperty(dimIndex);\n    return getRawSourceValueGetter(sourceFormat)(dataItem, dimIndex, property);\n  } else {\n    var result = dataItem;\n    if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n      result = getDataItemValue(dataItem);\n    }\n    return result;\n  }\n}\n/**\n * Compatible with some cases (in pie, map) like:\n * data: [{name: 'xx', value: 5, selected: true}, ...]\n * where only sourceFormat is 'original' and 'objectRows' supported.\n *\n * // TODO\n * Supported detail options in data item when using 'arrayRows'.\n *\n * @param data\n * @param dataIndex\n * @param attr like 'selected'\n */\nexport function retrieveRawAttr(data, dataIndex, attr) {\n  if (!data) {\n    return;\n  }\n  var sourceFormat = data.getStore().getSource().sourceFormat;\n  if (sourceFormat !== SOURCE_FORMAT_ORIGINAL && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) {\n    return;\n  }\n  var dataItem = data.getRawDataItem(dataIndex);\n  if (sourceFormat === SOURCE_FORMAT_ORIGINAL && !isObject(dataItem)) {\n    dataItem = null;\n  }\n  if (dataItem) {\n    return dataItem[attr];\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { retrieveRawValue } from '../../data/helper/dataProvider.js';\nimport { formatTpl } from '../../util/format.js';\nimport { error, makePrintable } from '../../util/log.js';\nvar DIMENSION_LABEL_REG = /\\{@(.+?)\\}/g;\nvar DataFormatMixin = /** @class */function () {\n  function DataFormatMixin() {}\n  /**\n   * Get params for formatter\n   */\n  DataFormatMixin.prototype.getDataParams = function (dataIndex, dataType) {\n    var data = this.getData(dataType);\n    var rawValue = this.getRawValue(dataIndex, dataType);\n    var rawDataIndex = data.getRawIndex(dataIndex);\n    var name = data.getName(dataIndex);\n    var itemOpt = data.getRawDataItem(dataIndex);\n    var style = data.getItemVisual(dataIndex, 'style');\n    var color = style && style[data.getItemVisual(dataIndex, 'drawType') || 'fill'];\n    var borderColor = style && style.stroke;\n    var mainType = this.mainType;\n    var isSeries = mainType === 'series';\n    var userOutput = data.userOutput && data.userOutput.get();\n    return {\n      componentType: mainType,\n      componentSubType: this.subType,\n      componentIndex: this.componentIndex,\n      seriesType: isSeries ? this.subType : null,\n      seriesIndex: this.seriesIndex,\n      seriesId: isSeries ? this.id : null,\n      seriesName: isSeries ? this.name : null,\n      name: name,\n      dataIndex: rawDataIndex,\n      data: itemOpt,\n      dataType: dataType,\n      value: rawValue,\n      color: color,\n      borderColor: borderColor,\n      dimensionNames: userOutput ? userOutput.fullDimensions : null,\n      encode: userOutput ? userOutput.encode : null,\n      // Param name list for mapping `a`, `b`, `c`, `d`, `e`\n      $vars: ['seriesName', 'name', 'value']\n    };\n  };\n  /**\n   * Format label\n   * @param dataIndex\n   * @param status 'normal' by default\n   * @param dataType\n   * @param labelDimIndex Only used in some chart that\n   *        use formatter in different dimensions, like radar.\n   * @param formatter Formatter given outside.\n   * @return return null/undefined if no formatter\n   */\n  DataFormatMixin.prototype.getFormattedLabel = function (dataIndex, status, dataType, labelDimIndex, formatter, extendParams) {\n    status = status || 'normal';\n    var data = this.getData(dataType);\n    var params = this.getDataParams(dataIndex, dataType);\n    if (extendParams) {\n      params.value = extendParams.interpolatedValue;\n    }\n    if (labelDimIndex != null && zrUtil.isArray(params.value)) {\n      params.value = params.value[labelDimIndex];\n    }\n    if (!formatter) {\n      var itemModel = data.getItemModel(dataIndex);\n      // @ts-ignore\n      formatter = itemModel.get(status === 'normal' ? ['label', 'formatter'] : [status, 'label', 'formatter']);\n    }\n    if (zrUtil.isFunction(formatter)) {\n      params.status = status;\n      params.dimensionIndex = labelDimIndex;\n      return formatter(params);\n    } else if (zrUtil.isString(formatter)) {\n      var str = formatTpl(formatter, params);\n      // Support 'aaa{@[3]}bbb{@product}ccc'.\n      // Do not support '}' in dim name util have to.\n      return str.replace(DIMENSION_LABEL_REG, function (origin, dimStr) {\n        var len = dimStr.length;\n        var dimLoose = dimStr;\n        if (dimLoose.charAt(0) === '[' && dimLoose.charAt(len - 1) === ']') {\n          dimLoose = +dimLoose.slice(1, len - 1); // Also support: '[]' => 0\n          if (process.env.NODE_ENV !== 'production') {\n            if (isNaN(dimLoose)) {\n              error(\"Invalide label formatter: @\" + dimStr + \", only support @[0], @[1], @[2], ...\");\n            }\n          }\n        }\n        var val = retrieveRawValue(data, dataIndex, dimLoose);\n        if (extendParams && zrUtil.isArray(extendParams.interpolatedValue)) {\n          var dimIndex = data.getDimensionIndex(dimLoose);\n          if (dimIndex >= 0) {\n            val = extendParams.interpolatedValue[dimIndex];\n          }\n        }\n        return val != null ? val + '' : '';\n      });\n    }\n  };\n  /**\n   * Get raw value in option\n   */\n  DataFormatMixin.prototype.getRawValue = function (idx, dataType) {\n    return retrieveRawValue(this.getData(dataType), idx);\n  };\n  /**\n   * Should be implemented.\n   * @param {number} dataIndex\n   * @param {boolean} [multipleSeries=false]\n   * @param {string} [dataType]\n   */\n  DataFormatMixin.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    // Empty function\n    return;\n  };\n  return DataFormatMixin;\n}();\nexport { DataFormatMixin };\n;\n// PENDING: previously we accept this type when calling `formatTooltip`,\n// but guess little chance has been used outside. Do we need to backward\n// compat it?\n// type TooltipFormatResultLegacyObject = {\n//     // `html` means the markup language text, either in 'html' or 'richText'.\n//     // The name `html` is not appropriate because in 'richText' it is not a HTML\n//     // string. But still support it for backward compatibility.\n//     html: string;\n//     markers: Dictionary<ColorString>;\n// };\n/**\n * For backward compat, normalize the return from `formatTooltip`.\n */\nexport function normalizeTooltipFormatResult(result) {\n  var markupText;\n  // let markers: Dictionary<ColorString>;\n  var markupFragment;\n  if (zrUtil.isObject(result)) {\n    if (result.type) {\n      markupFragment = result;\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn('The return type of `formatTooltip` is not supported: ' + makePrintable(result));\n      }\n    }\n    // else {\n    //     markupText = (result as TooltipFormatResultLegacyObject).html;\n    //     markers = (result as TooltipFormatResultLegacyObject).markers;\n    //     if (markersExisting) {\n    //         markers = zrUtil.merge(markersExisting, markers);\n    //     }\n    // }\n  } else {\n    markupText = result;\n  }\n  return {\n    text: markupText,\n    // markers: markers || markersExisting,\n    frag: markupFragment\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { assert, isArray } from 'zrender/lib/core/util.js';\n;\n/**\n * @param {Object} define\n * @return See the return of `createTask`.\n */\nexport function createTask(define) {\n  return new Task(define);\n}\nvar Task = /** @class */function () {\n  function Task(define) {\n    define = define || {};\n    this._reset = define.reset;\n    this._plan = define.plan;\n    this._count = define.count;\n    this._onDirty = define.onDirty;\n    this._dirty = true;\n  }\n  /**\n   * @param step Specified step.\n   * @param skip Skip customer perform call.\n   * @param modBy Sampling window size.\n   * @param modDataCount Sampling count.\n   * @return whether unfinished.\n   */\n  Task.prototype.perform = function (performArgs) {\n    var upTask = this._upstream;\n    var skip = performArgs && performArgs.skip;\n    // TODO some refactor.\n    // Pull data. Must pull data each time, because context.data\n    // may be updated by Series.setData.\n    if (this._dirty && upTask) {\n      var context = this.context;\n      context.data = context.outputData = upTask.context.outputData;\n    }\n    if (this.__pipeline) {\n      this.__pipeline.currentTask = this;\n    }\n    var planResult;\n    if (this._plan && !skip) {\n      planResult = this._plan(this.context);\n    }\n    // Support sharding by mod, which changes the render sequence and makes the rendered graphic\n    // elements uniformed distributed when progress, especially when moving or zooming.\n    var lastModBy = normalizeModBy(this._modBy);\n    var lastModDataCount = this._modDataCount || 0;\n    var modBy = normalizeModBy(performArgs && performArgs.modBy);\n    var modDataCount = performArgs && performArgs.modDataCount || 0;\n    if (lastModBy !== modBy || lastModDataCount !== modDataCount) {\n      planResult = 'reset';\n    }\n    function normalizeModBy(val) {\n      !(val >= 1) && (val = 1); // jshint ignore:line\n      return val;\n    }\n    var forceFirstProgress;\n    if (this._dirty || planResult === 'reset') {\n      this._dirty = false;\n      forceFirstProgress = this._doReset(skip);\n    }\n    this._modBy = modBy;\n    this._modDataCount = modDataCount;\n    var step = performArgs && performArgs.step;\n    if (upTask) {\n      if (process.env.NODE_ENV !== 'production') {\n        assert(upTask._outputDueEnd != null);\n      }\n      this._dueEnd = upTask._outputDueEnd;\n    }\n    // DataTask or overallTask\n    else {\n      if (process.env.NODE_ENV !== 'production') {\n        assert(!this._progress || this._count);\n      }\n      this._dueEnd = this._count ? this._count(this.context) : Infinity;\n    }\n    // Note: Stubs, that its host overall task let it has progress, has progress.\n    // If no progress, pass index from upstream to downstream each time plan called.\n    if (this._progress) {\n      var start = this._dueIndex;\n      var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd);\n      if (!skip && (forceFirstProgress || start < end)) {\n        var progress = this._progress;\n        if (isArray(progress)) {\n          for (var i = 0; i < progress.length; i++) {\n            this._doProgress(progress[i], start, end, modBy, modDataCount);\n          }\n        } else {\n          this._doProgress(progress, start, end, modBy, modDataCount);\n        }\n      }\n      this._dueIndex = end;\n      // If no `outputDueEnd`, assume that output data and\n      // input data is the same, so use `dueIndex` as `outputDueEnd`.\n      var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end;\n      if (process.env.NODE_ENV !== 'production') {\n        // ??? Can not rollback.\n        assert(outputDueEnd >= this._outputDueEnd);\n      }\n      this._outputDueEnd = outputDueEnd;\n    } else {\n      // (1) Some overall task has no progress.\n      // (2) Stubs, that its host overall task do not let it has progress, has no progress.\n      // This should always be performed so it can be passed to downstream.\n      this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd;\n    }\n    return this.unfinished();\n  };\n  Task.prototype.dirty = function () {\n    this._dirty = true;\n    this._onDirty && this._onDirty(this.context);\n  };\n  Task.prototype._doProgress = function (progress, start, end, modBy, modDataCount) {\n    iterator.reset(start, end, modBy, modDataCount);\n    this._callingProgress = progress;\n    this._callingProgress({\n      start: start,\n      end: end,\n      count: end - start,\n      next: iterator.next\n    }, this.context);\n  };\n  Task.prototype._doReset = function (skip) {\n    this._dueIndex = this._outputDueEnd = this._dueEnd = 0;\n    this._settedOutputEnd = null;\n    var progress;\n    var forceFirstProgress;\n    if (!skip && this._reset) {\n      progress = this._reset(this.context);\n      if (progress && progress.progress) {\n        forceFirstProgress = progress.forceFirstProgress;\n        progress = progress.progress;\n      }\n      // To simplify no progress checking, array must has item.\n      if (isArray(progress) && !progress.length) {\n        progress = null;\n      }\n    }\n    this._progress = progress;\n    this._modBy = this._modDataCount = null;\n    var downstream = this._downstream;\n    downstream && downstream.dirty();\n    return forceFirstProgress;\n  };\n  Task.prototype.unfinished = function () {\n    return this._progress && this._dueIndex < this._dueEnd;\n  };\n  /**\n   * @param downTask The downstream task.\n   * @return The downstream task.\n   */\n  Task.prototype.pipe = function (downTask) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(downTask && !downTask._disposed && downTask !== this);\n    }\n    // If already downstream, do not dirty downTask.\n    if (this._downstream !== downTask || this._dirty) {\n      this._downstream = downTask;\n      downTask._upstream = this;\n      downTask.dirty();\n    }\n  };\n  Task.prototype.dispose = function () {\n    if (this._disposed) {\n      return;\n    }\n    this._upstream && (this._upstream._downstream = null);\n    this._downstream && (this._downstream._upstream = null);\n    this._dirty = false;\n    this._disposed = true;\n  };\n  Task.prototype.getUpstream = function () {\n    return this._upstream;\n  };\n  Task.prototype.getDownstream = function () {\n    return this._downstream;\n  };\n  Task.prototype.setOutputEnd = function (end) {\n    // This only happens in dataTask, dataZoom, map, currently.\n    // where dataZoom do not set end each time, but only set\n    // when reset. So we should record the set end, in case\n    // that the stub of dataZoom perform again and earse the\n    // set end by upstream.\n    this._outputDueEnd = this._settedOutputEnd = end;\n  };\n  return Task;\n}();\nexport { Task };\nvar iterator = function () {\n  var end;\n  var current;\n  var modBy;\n  var modDataCount;\n  var winCount;\n  var it = {\n    reset: function (s, e, sStep, sCount) {\n      current = s;\n      end = e;\n      modBy = sStep;\n      modDataCount = sCount;\n      winCount = Math.ceil(modDataCount / modBy);\n      it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext;\n    }\n  };\n  return it;\n  function sequentialNext() {\n    return current < end ? current++ : null;\n  }\n  function modNext() {\n    var dataIndex = current % winCount * modBy + Math.ceil(current / winCount);\n    var result = current >= end ? null : dataIndex < modDataCount ? dataIndex\n    // If modDataCount is smaller than data.count() (consider `appendData` case),\n    // Use normal linear rendering mode.\n    : current;\n    current++;\n    return result;\n  }\n}();\n// -----------------------------------------------------------------------------\n// For stream debug (Should be commented out after used!)\n// @usage: printTask(this, 'begin');\n// @usage: printTask(this, null, {someExtraProp});\n// @usage: Use `__idxInPipeline` as conditional breakpiont.\n//\n// window.printTask = function (task: any, prefix: string, extra: { [key: string]: unknown }): void {\n//     window.ecTaskUID == null && (window.ecTaskUID = 0);\n//     task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`);\n//     task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`);\n//     let props = [];\n//     if (task.__pipeline) {\n//         let val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`;\n//         props.push({text: '__idxInPipeline/total', value: val});\n//     } else {\n//         let stubCount = 0;\n//         task.agentStubMap.each(() => stubCount++);\n//         props.push({text: 'idx', value: `overall (stubs: ${stubCount})`});\n//     }\n//     props.push({text: 'uid', value: task.uidDebug});\n//     if (task.__pipeline) {\n//         props.push({text: 'pipelineId', value: task.__pipeline.id});\n//         task.agent && props.push(\n//             {text: 'stubFor', value: task.agent.uidDebug}\n//         );\n//     }\n//     props.push(\n//         {text: 'dirty', value: task._dirty},\n//         {text: 'dueIndex', value: task._dueIndex},\n//         {text: 'dueEnd', value: task._dueEnd},\n//         {text: 'outputDueEnd', value: task._outputDueEnd}\n//     );\n//     if (extra) {\n//         Object.keys(extra).forEach(key => {\n//             props.push({text: key, value: extra[key]});\n//         });\n//     }\n//     let args = ['color: blue'];\n//     let msg = `%c[${prefix || 'T'}] %c` + props.map(item => (\n//         args.push('color: green', 'color: red'),\n//         `${item.text}: %c${item.value}`\n//     )).join('%c, ');\n//     console.log.apply(console, [msg].concat(args));\n//     // console.log(this);\n// };\n// window.printPipeline = function (task: any, prefix: string) {\n//     const pipeline = task.__pipeline;\n//     let currTask = pipeline.head;\n//     while (currTask) {\n//         window.printTask(currTask, prefix);\n//         currTask = currTask._downstream;\n//     }\n// };\n// window.showChain = function (chainHeadTask) {\n//     var chain = [];\n//     var task = chainHeadTask;\n//     while (task) {\n//         chain.push({\n//             task: task,\n//             up: task._upstream,\n//             down: task._downstream,\n//             idxInPipeline: task.__idxInPipeline\n//         });\n//         task = task._downstream;\n//     }\n//     return chain;\n// };\n// window.findTaskInChain = function (task, chainHeadTask) {\n//     let chain = window.showChain(chainHeadTask);\n//     let result = [];\n//     for (let i = 0; i < chain.length; i++) {\n//         let chainItem = chain[i];\n//         if (chainItem.task === task) {\n//             result.push(i);\n//         }\n//     }\n//     return result;\n// };\n// window.printChainAEachInChainB = function (chainHeadTaskA, chainHeadTaskB) {\n//     let chainA = window.showChain(chainHeadTaskA);\n//     for (let i = 0; i < chainA.length; i++) {\n//         console.log('chainAIdx:', i, 'inChainB:', window.findTaskInChain(chainA[i].task, chainHeadTaskB));\n//     }\n// };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { parseDate, numericToNumber } from '../../util/number.js';\nimport { createHashMap, trim, hasOwn, isString, isNumber } from 'zrender/lib/core/util.js';\nimport { throwError } from '../../util/log.js';\n/**\n * Convert raw the value in to inner value in List.\n *\n * [Performance sensitive]\n *\n * [Caution]: this is the key logic of user value parser.\n * For backward compatibility, do not modify it until you have to!\n */\nexport function parseDataValue(value,\n// For high performance, do not omit the second param.\nopt) {\n  // Performance sensitive.\n  var dimType = opt && opt.type;\n  if (dimType === 'ordinal') {\n    // If given value is a category string\n    return value;\n  }\n  if (dimType === 'time'\n  // spead up when using timestamp\n  && !isNumber(value) && value != null && value !== '-') {\n    value = +parseDate(value);\n  }\n  // dimType defaults 'number'.\n  // If dimType is not ordinal and value is null or undefined or NaN or '-',\n  // parse to NaN.\n  // number-like string (like ' 123 ') can be converted to a number.\n  // where null/undefined or other string will be converted to NaN.\n  return value == null || value === '' ? NaN\n  // If string (like '-'), using '+' parse to NaN\n  // If object, also parse to NaN\n  : Number(value);\n}\n;\nvar valueParserMap = createHashMap({\n  'number': function (val) {\n    // Do not use `numericToNumber` here. We have `numericToNumber` by default.\n    // Here the number parser can have loose rule:\n    // enable to cut suffix: \"120px\" => 120, \"14%\" => 14.\n    return parseFloat(val);\n  },\n  'time': function (val) {\n    // return timestamp.\n    return +parseDate(val);\n  },\n  'trim': function (val) {\n    return isString(val) ? trim(val) : val;\n  }\n});\nexport function getRawValueParser(type) {\n  return valueParserMap.get(type);\n}\nvar ORDER_COMPARISON_OP_MAP = {\n  lt: function (lval, rval) {\n    return lval < rval;\n  },\n  lte: function (lval, rval) {\n    return lval <= rval;\n  },\n  gt: function (lval, rval) {\n    return lval > rval;\n  },\n  gte: function (lval, rval) {\n    return lval >= rval;\n  }\n};\nvar FilterOrderComparator = /** @class */function () {\n  function FilterOrderComparator(op, rval) {\n    if (!isNumber(rval)) {\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'rvalue of \"<\", \">\", \"<=\", \">=\" can only be number in filter.';\n      }\n      throwError(errMsg);\n    }\n    this._opFn = ORDER_COMPARISON_OP_MAP[op];\n    this._rvalFloat = numericToNumber(rval);\n  }\n  // Performance sensitive.\n  FilterOrderComparator.prototype.evaluate = function (lval) {\n    // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat.\n    return isNumber(lval) ? this._opFn(lval, this._rvalFloat) : this._opFn(numericToNumber(lval), this._rvalFloat);\n  };\n  return FilterOrderComparator;\n}();\nvar SortOrderComparator = /** @class */function () {\n  /**\n   * @param order by default: 'asc'\n   * @param incomparable by default: Always on the tail.\n   *        That is, if 'asc' => 'max', if 'desc' => 'min'\n   *        See the definition of \"incomparable\" in [SORT_COMPARISON_RULE].\n   */\n  function SortOrderComparator(order, incomparable) {\n    var isDesc = order === 'desc';\n    this._resultLT = isDesc ? 1 : -1;\n    if (incomparable == null) {\n      incomparable = isDesc ? 'min' : 'max';\n    }\n    this._incomparable = incomparable === 'min' ? -Infinity : Infinity;\n  }\n  // See [SORT_COMPARISON_RULE].\n  // Performance sensitive.\n  SortOrderComparator.prototype.evaluate = function (lval, rval) {\n    // Most cases is 'number', and typeof maybe 10 times faseter than parseFloat.\n    var lvalFloat = isNumber(lval) ? lval : numericToNumber(lval);\n    var rvalFloat = isNumber(rval) ? rval : numericToNumber(rval);\n    var lvalNotNumeric = isNaN(lvalFloat);\n    var rvalNotNumeric = isNaN(rvalFloat);\n    if (lvalNotNumeric) {\n      lvalFloat = this._incomparable;\n    }\n    if (rvalNotNumeric) {\n      rvalFloat = this._incomparable;\n    }\n    if (lvalNotNumeric && rvalNotNumeric) {\n      var lvalIsStr = isString(lval);\n      var rvalIsStr = isString(rval);\n      if (lvalIsStr) {\n        lvalFloat = rvalIsStr ? lval : 0;\n      }\n      if (rvalIsStr) {\n        rvalFloat = lvalIsStr ? rval : 0;\n      }\n    }\n    return lvalFloat < rvalFloat ? this._resultLT : lvalFloat > rvalFloat ? -this._resultLT : 0;\n  };\n  return SortOrderComparator;\n}();\nexport { SortOrderComparator };\nvar FilterEqualityComparator = /** @class */function () {\n  function FilterEqualityComparator(isEq, rval) {\n    this._rval = rval;\n    this._isEQ = isEq;\n    this._rvalTypeof = typeof rval;\n    this._rvalFloat = numericToNumber(rval);\n  }\n  // Performance sensitive.\n  FilterEqualityComparator.prototype.evaluate = function (lval) {\n    var eqResult = lval === this._rval;\n    if (!eqResult) {\n      var lvalTypeof = typeof lval;\n      if (lvalTypeof !== this._rvalTypeof && (lvalTypeof === 'number' || this._rvalTypeof === 'number')) {\n        eqResult = numericToNumber(lval) === this._rvalFloat;\n      }\n    }\n    return this._isEQ ? eqResult : !eqResult;\n  };\n  return FilterEqualityComparator;\n}();\n/**\n * [FILTER_COMPARISON_RULE]\n * `lt`|`lte`|`gt`|`gte`:\n * + rval must be a number. And lval will be converted to number (`numericToNumber`) to compare.\n * `eq`:\n * + If same type, compare with `===`.\n * + If there is one number, convert to number (`numericToNumber`) to compare.\n * + Else return `false`.\n * `ne`:\n * + Not `eq`.\n *\n *\n * [SORT_COMPARISON_RULE]\n * All the values are grouped into three categories:\n * + \"numeric\" (number and numeric string)\n * + \"non-numeric-string\" (string that excluding numeric string)\n * + \"others\"\n * \"numeric\" vs \"numeric\": values are ordered by number order.\n * \"non-numeric-string\" vs \"non-numeric-string\": values are ordered by ES spec (#sec-abstract-relational-comparison).\n * \"others\" vs \"others\": do not change order (always return 0).\n * \"numeric\" vs \"non-numeric-string\": \"non-numeric-string\" is treated as \"incomparable\".\n * \"number\" vs \"others\": \"others\" is treated as \"incomparable\".\n * \"non-numeric-string\" vs \"others\": \"others\" is treated as \"incomparable\".\n * \"incomparable\" will be seen as -Infinity or Infinity (depends on the settings).\n * MEMO:\n *   Non-numeric string sort makes sense when we need to put the items with the same tag together.\n *   But if we support string sort, we still need to avoid the misleading like `'2' > '12'`,\n *   So we treat \"numeric-string\" sorted by number order rather than string comparison.\n *\n *\n * [CHECK_LIST_OF_THE_RULE_DESIGN]\n * + Do not support string comparison until required. And also need to\n *   avoid the misleading of \"2\" > \"12\".\n * + Should avoid the misleading case:\n *   `\" 22 \" gte \"22\"` is `true` but `\" 22 \" eq \"22\"` is `false`.\n * + JS bad case should be avoided: null <= 0, [] <= 0, ' ' <= 0, ...\n * + Only \"numeric\" can be converted to comparable number, otherwise converted to NaN.\n *   See `util/number.ts#numericToNumber`.\n *\n * @return If `op` is not `RelationalOperator`, return null;\n */\nexport function createFilterComparator(op, rval) {\n  return op === 'eq' || op === 'ne' ? new FilterEqualityComparator(op === 'eq', rval) : hasOwn(ORDER_COMPARISON_OP_MAP, op) ? new FilterOrderComparator(op, rval) : null;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { SERIES_LAYOUT_BY_COLUMN, SOURCE_FORMAT_OBJECT_ROWS, SOURCE_FORMAT_ARRAY_ROWS } from '../../util/types.js';\nimport { normalizeToArray } from '../../util/model.js';\nimport { createHashMap, bind, each, hasOwn, map, clone, isObject, extend, isNumber } from 'zrender/lib/core/util.js';\nimport { getRawSourceItemGetter, getRawSourceDataCounter, getRawSourceValueGetter } from './dataProvider.js';\nimport { parseDataValue } from './dataValueHelper.js';\nimport { log, makePrintable, throwError } from '../../util/log.js';\nimport { createSource, detectSourceFormat } from '../Source.js';\n/**\n * TODO: disable writable.\n * This structure will be exposed to users.\n */\nvar ExternalSource = /** @class */function () {\n  function ExternalSource() {}\n  ExternalSource.prototype.getRawData = function () {\n    // Only built-in transform available.\n    throw new Error('not supported');\n  };\n  ExternalSource.prototype.getRawDataItem = function (dataIndex) {\n    // Only built-in transform available.\n    throw new Error('not supported');\n  };\n  ExternalSource.prototype.cloneRawData = function () {\n    return;\n  };\n  /**\n   * @return If dimension not found, return null/undefined.\n   */\n  ExternalSource.prototype.getDimensionInfo = function (dim) {\n    return;\n  };\n  /**\n   * dimensions defined if and only if either:\n   * (a) dataset.dimensions are declared.\n   * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`).\n   * If dimensions are defined, `dimensionInfoAll` is corresponding to\n   * the defined dimensions.\n   * Otherwise, `dimensionInfoAll` is determined by data columns.\n   * @return Always return an array (even empty array).\n   */\n  ExternalSource.prototype.cloneAllDimensionInfo = function () {\n    return;\n  };\n  ExternalSource.prototype.count = function () {\n    return;\n  };\n  /**\n   * Only support by dimension index.\n   * No need to support by dimension name in transform function,\n   * because transform function is not case-specific, no need to use name literally.\n   */\n  ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) {\n    return;\n  };\n  ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) {\n    return;\n  };\n  ExternalSource.prototype.convertValue = function (rawVal, dimInfo) {\n    return parseDataValue(rawVal, dimInfo);\n  };\n  return ExternalSource;\n}();\nexport { ExternalSource };\nfunction createExternalSource(internalSource, externalTransform) {\n  var extSource = new ExternalSource();\n  var data = internalSource.data;\n  var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat;\n  var sourceHeaderCount = internalSource.startIndex;\n  var errMsg = '';\n  if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) {\n    // For the logic simplicity in transformer, only 'culumn' is\n    // supported in data transform. Otherwise, the `dimensionsDefine`\n    // might be detected by 'row', which probably confuses users.\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = '`seriesLayoutBy` of upstream dataset can only be \"column\" in data transform.';\n    }\n    throwError(errMsg);\n  }\n  // [MEMO]\n  // Create a new dimensions structure for exposing.\n  // Do not expose all dimension info to users directly.\n  // Because the dimension is probably auto detected from data and not might reliable.\n  // Should not lead the transformers to think that is reliable and return it.\n  // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`.\n  var dimensions = [];\n  var dimsByName = {};\n  var dimsDef = internalSource.dimensionsDefine;\n  if (dimsDef) {\n    each(dimsDef, function (dimDef, idx) {\n      var name = dimDef.name;\n      var dimDefExt = {\n        index: idx,\n        name: name,\n        displayName: dimDef.displayName\n      };\n      dimensions.push(dimDefExt);\n      // Users probably do not specify dimension name. For simplicity, data transform\n      // does not generate dimension name.\n      if (name != null) {\n        // Dimension name should not be duplicated.\n        // For simplicity, data transform forbids name duplication, do not generate\n        // new name like module `completeDimensions.ts` did, but just tell users.\n        var errMsg_1 = '';\n        if (hasOwn(dimsByName, name)) {\n          if (process.env.NODE_ENV !== 'production') {\n            errMsg_1 = 'dimension name \"' + name + '\" duplicated.';\n          }\n          throwError(errMsg_1);\n        }\n        dimsByName[name] = dimDefExt;\n      }\n    });\n  }\n  // If dimension definitions are not defined and can not be detected.\n  // e.g., pure data `[[11, 22], ...]`.\n  else {\n    for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) {\n      // Do not generete name or anything others. The consequence process in\n      // `transform` or `series` probably have there own name generation strategry.\n      dimensions.push({\n        index: i\n      });\n    }\n  }\n  // Implement public methods:\n  var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN);\n  if (externalTransform.__isBuiltIn) {\n    extSource.getRawDataItem = function (dataIndex) {\n      return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex);\n    };\n    extSource.getRawData = bind(getRawData, null, internalSource);\n  }\n  extSource.cloneRawData = bind(cloneRawData, null, internalSource);\n  var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN);\n  extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions);\n  var rawValueGetter = getRawSourceValueGetter(sourceFormat);\n  extSource.retrieveValue = function (dataIndex, dimIndex) {\n    var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex);\n    return retrieveValueFromItem(rawItem, dimIndex);\n  };\n  var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) {\n    if (dataItem == null) {\n      return;\n    }\n    var dimDef = dimensions[dimIndex];\n    // When `dimIndex` is `null`, `rawValueGetter` return the whole item.\n    if (dimDef) {\n      return rawValueGetter(dataItem, dimIndex, dimDef.name);\n    }\n  };\n  extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName);\n  extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions);\n  return extSource;\n}\nfunction getRawData(upstream) {\n  var sourceFormat = upstream.sourceFormat;\n  if (!isSupportedSourceFormat(sourceFormat)) {\n    var errMsg = '';\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = '`getRawData` is not supported in source format ' + sourceFormat;\n    }\n    throwError(errMsg);\n  }\n  return upstream.data;\n}\nfunction cloneRawData(upstream) {\n  var sourceFormat = upstream.sourceFormat;\n  var data = upstream.data;\n  if (!isSupportedSourceFormat(sourceFormat)) {\n    var errMsg = '';\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat;\n    }\n    throwError(errMsg);\n  }\n  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {\n    var result = [];\n    for (var i = 0, len = data.length; i < len; i++) {\n      // Not strictly clone for performance\n      result.push(data[i].slice());\n    }\n    return result;\n  } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {\n    var result = [];\n    for (var i = 0, len = data.length; i < len; i++) {\n      // Not strictly clone for performance\n      result.push(extend({}, data[i]));\n    }\n    return result;\n  }\n}\nfunction getDimensionInfo(dimensions, dimsByName, dim) {\n  if (dim == null) {\n    return;\n  }\n  // Keep the same logic as `List::getDimension` did.\n  if (isNumber(dim)\n  // If being a number-like string but not being defined a dimension name.\n  || !isNaN(dim) && !hasOwn(dimsByName, dim)) {\n    return dimensions[dim];\n  } else if (hasOwn(dimsByName, dim)) {\n    return dimsByName[dim];\n  }\n}\nfunction cloneAllDimensionInfo(dimensions) {\n  return clone(dimensions);\n}\nvar externalTransformMap = createHashMap();\nexport function registerExternalTransform(externalTransform) {\n  externalTransform = clone(externalTransform);\n  var type = externalTransform.type;\n  var errMsg = '';\n  if (!type) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = 'Must have a `type` when `registerTransform`.';\n    }\n    throwError(errMsg);\n  }\n  var typeParsed = type.split(':');\n  if (typeParsed.length !== 2) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = 'Name must include namespace like \"ns:regression\".';\n    }\n    throwError(errMsg);\n  }\n  // Namespace 'echarts:xxx' is official namespace, where the transforms should\n  // be called directly via 'xxx' rather than 'echarts:xxx'.\n  var isBuiltIn = false;\n  if (typeParsed[0] === 'echarts') {\n    type = typeParsed[1];\n    isBuiltIn = true;\n  }\n  externalTransform.__isBuiltIn = isBuiltIn;\n  externalTransformMap.set(type, externalTransform);\n}\nexport function applyDataTransform(rawTransOption, sourceList, infoForPrint) {\n  var pipedTransOption = normalizeToArray(rawTransOption);\n  var pipeLen = pipedTransOption.length;\n  var errMsg = '';\n  if (!pipeLen) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = 'If `transform` declared, it should at least contain one transform.';\n    }\n    throwError(errMsg);\n  }\n  for (var i = 0, len = pipeLen; i < len; i++) {\n    var transOption = pipedTransOption[i];\n    sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i);\n    // piped transform only support single input, except the fist one.\n    // piped transform only support single output, except the last one.\n    if (i !== len - 1) {\n      sourceList.length = Math.max(sourceList.length, 1);\n    }\n  }\n  return sourceList;\n}\nfunction applySingleDataTransform(transOption, upSourceList, infoForPrint,\n// If `pipeIndex` is null/undefined, no piped transform.\npipeIndex) {\n  var errMsg = '';\n  if (!upSourceList.length) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = 'Must have at least one upstream dataset.';\n    }\n    throwError(errMsg);\n  }\n  if (!isObject(transOption)) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.';\n    }\n    throwError(errMsg);\n  }\n  var transType = transOption.type;\n  var externalTransform = externalTransformMap.get(transType);\n  if (!externalTransform) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = 'Can not find transform on type \"' + transType + '\".';\n    }\n    throwError(errMsg);\n  }\n  // Prepare source\n  var extUpSourceList = map(upSourceList, function (upSource) {\n    return createExternalSource(upSource, externalTransform);\n  });\n  var resultList = normalizeToArray(externalTransform.transform({\n    upstream: extUpSourceList[0],\n    upstreamList: extUpSourceList,\n    config: clone(transOption.config)\n  }));\n  if (process.env.NODE_ENV !== 'production') {\n    if (transOption.print) {\n      var printStrArr = map(resultList, function (extSource) {\n        var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : '';\n        return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\\n');\n      }).join('\\n');\n      log(printStrArr);\n    }\n  }\n  return map(resultList, function (result, resultIndex) {\n    var errMsg = '';\n    if (!isObject(result)) {\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'A transform should not return some empty results.';\n      }\n      throwError(errMsg);\n    }\n    if (!result.data) {\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'Transform result data should be not be null or undefined';\n      }\n      throwError(errMsg);\n    }\n    var sourceFormat = detectSourceFormat(result.data);\n    if (!isSupportedSourceFormat(sourceFormat)) {\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'Transform result data should be array rows or object rows.';\n      }\n      throwError(errMsg);\n    }\n    var resultMetaRawOption;\n    var firstUpSource = upSourceList[0];\n    /**\n     * Intuitively, the end users known the content of the original `dataset.source`,\n     * calucating the transform result in mind.\n     * Suppose the original `dataset.source` is:\n     * ```js\n     * [\n     *     ['product', '2012', '2013', '2014', '2015'],\n     *     ['AAA', 41.1, 30.4, 65.1, 53.3],\n     *     ['BBB', 86.5, 92.1, 85.7, 83.1],\n     *     ['CCC', 24.1, 67.2, 79.5, 86.4]\n     * ]\n     * ```\n     * The dimension info have to be detected from the source data.\n     * Some of the transformers (like filter, sort) will follow the dimension info\n     * of upstream, while others use new dimensions (like aggregate).\n     * Transformer can output a field `dimensions` to define the its own output dimensions.\n     * We also allow transformers to ignore the output `dimensions` field, and\n     * inherit the upstream dimensions definition. It can reduce the burden of handling\n     * dimensions in transformers.\n     *\n     * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`.\n     */\n    if (firstUpSource && resultIndex === 0\n    // If transformer returns `dimensions`, it means that the transformer has different\n    // dimensions definitions. We do not inherit anything from upstream.\n    && !result.dimensions) {\n      var startIndex = firstUpSource.startIndex;\n      // We copy the header of upstream to the result, because:\n      // (1) The returned data always does not contain header line and can not be used\n      // as dimension-detection. In this case we can not use \"detected dimensions\" of\n      // upstream directly, because it might be detected based on different `seriesLayoutBy`.\n      // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`.\n      // So the original detected header should be add to the result, otherwise they can not be read.\n      if (startIndex) {\n        result.data = firstUpSource.data.slice(0, startIndex).concat(result.data);\n      }\n      resultMetaRawOption = {\n        seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN,\n        sourceHeader: startIndex,\n        dimensions: firstUpSource.metaRawOption.dimensions\n      };\n    } else {\n      resultMetaRawOption = {\n        seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN,\n        sourceHeader: 0,\n        dimensions: result.dimensions\n      };\n    }\n    return createSource(result.data, resultMetaRawOption, null);\n  });\n}\nfunction isSupportedSourceFormat(sourceFormat) {\n  return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { assert, clone, createHashMap, isFunction, keys, map, reduce } from 'zrender/lib/core/util.js';\nimport { parseDataValue } from './helper/dataValueHelper.js';\nimport { shouldRetrieveDataByName } from './Source.js';\nvar UNDEFINED = 'undefined';\n/* global Float64Array, Int32Array, Uint32Array, Uint16Array */\n// Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is\n// different from the Ctor of typed array.\nexport var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array;\nexport var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array;\nexport var CtorInt32Array = typeof Int32Array === UNDEFINED ? Array : Int32Array;\nexport var CtorFloat64Array = typeof Float64Array === UNDEFINED ? Array : Float64Array;\n/**\n * Multi dimensional data store\n */\nvar dataCtors = {\n  'float': CtorFloat64Array,\n  'int': CtorInt32Array,\n  // Ordinal data type can be string or int\n  'ordinal': Array,\n  'number': Array,\n  'time': CtorFloat64Array\n};\nvar defaultDimValueGetters;\nfunction getIndicesCtor(rawCount) {\n  // The possible max value in this._indicies is always this._rawCount despite of filtering.\n  return rawCount > 65535 ? CtorUint32Array : CtorUint16Array;\n}\n;\nfunction getInitialExtent() {\n  return [Infinity, -Infinity];\n}\n;\nfunction cloneChunk(originalChunk) {\n  var Ctor = originalChunk.constructor;\n  // Only shallow clone is enough when Array.\n  return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk);\n}\nfunction prepareStore(store, dimIdx, dimType, end, append) {\n  var DataCtor = dataCtors[dimType || 'float'];\n  if (append) {\n    var oldStore = store[dimIdx];\n    var oldLen = oldStore && oldStore.length;\n    if (!(oldLen === end)) {\n      var newStore = new DataCtor(end);\n      // The cost of the copy is probably inconsiderable\n      // within the initial chunkSize.\n      for (var j = 0; j < oldLen; j++) {\n        newStore[j] = oldStore[j];\n      }\n      store[dimIdx] = newStore;\n    }\n  } else {\n    store[dimIdx] = new DataCtor(end);\n  }\n}\n;\n/**\n * Basically, DataStore API keep immutable.\n */\nvar DataStore = /** @class */function () {\n  function DataStore() {\n    this._chunks = [];\n    // It will not be calculated until needed.\n    this._rawExtent = [];\n    this._extent = [];\n    this._count = 0;\n    this._rawCount = 0;\n    this._calcDimNameToIdx = createHashMap();\n  }\n  /**\n   * Initialize from data\n   */\n  DataStore.prototype.initData = function (provider, inputDimensions, dimValueGetter) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(isFunction(provider.getItem) && isFunction(provider.count), 'Invalid data provider.');\n    }\n    this._provider = provider;\n    // Clear\n    this._chunks = [];\n    this._indices = null;\n    this.getRawIndex = this._getRawIdxIdentity;\n    var source = provider.getSource();\n    var defaultGetter = this.defaultDimValueGetter = defaultDimValueGetters[source.sourceFormat];\n    // Default dim value getter\n    this._dimValueGetter = dimValueGetter || defaultGetter;\n    // Reset raw extent.\n    this._rawExtent = [];\n    var willRetrieveDataByName = shouldRetrieveDataByName(source);\n    this._dimensions = map(inputDimensions, function (dim) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (willRetrieveDataByName) {\n          assert(dim.property != null);\n        }\n      }\n      return {\n        // Only pick these two props. Not leak other properties like orderMeta.\n        type: dim.type,\n        property: dim.property\n      };\n    });\n    this._initDataFromProvider(0, provider.count());\n  };\n  DataStore.prototype.getProvider = function () {\n    return this._provider;\n  };\n  /**\n   * Caution: even when a `source` instance owned by a series, the created data store\n   * may still be shared by different sereis (the source hash does not use all `source`\n   * props, see `sourceManager`). In this case, the `source` props that are not used in\n   * hash (like `source.dimensionDefine`) probably only belongs to a certain series and\n   * thus should not be fetch here.\n   */\n  DataStore.prototype.getSource = function () {\n    return this._provider.getSource();\n  };\n  /**\n   * @caution Only used in dataStack.\n   */\n  DataStore.prototype.ensureCalculationDimension = function (dimName, type) {\n    var calcDimNameToIdx = this._calcDimNameToIdx;\n    var dimensions = this._dimensions;\n    var calcDimIdx = calcDimNameToIdx.get(dimName);\n    if (calcDimIdx != null) {\n      if (dimensions[calcDimIdx].type === type) {\n        return calcDimIdx;\n      }\n    } else {\n      calcDimIdx = dimensions.length;\n    }\n    dimensions[calcDimIdx] = {\n      type: type\n    };\n    calcDimNameToIdx.set(dimName, calcDimIdx);\n    this._chunks[calcDimIdx] = new dataCtors[type || 'float'](this._rawCount);\n    this._rawExtent[calcDimIdx] = getInitialExtent();\n    return calcDimIdx;\n  };\n  DataStore.prototype.collectOrdinalMeta = function (dimIdx, ordinalMeta) {\n    var chunk = this._chunks[dimIdx];\n    var dim = this._dimensions[dimIdx];\n    var rawExtents = this._rawExtent;\n    var offset = dim.ordinalOffset || 0;\n    var len = chunk.length;\n    if (offset === 0) {\n      // We need to reset the rawExtent if collect is from start.\n      // Because this dimension may be guessed as number and calcuating a wrong extent.\n      rawExtents[dimIdx] = getInitialExtent();\n    }\n    var dimRawExtent = rawExtents[dimIdx];\n    // Parse from previous data offset. len may be changed after appendData\n    for (var i = offset; i < len; i++) {\n      var val = chunk[i] = ordinalMeta.parseAndCollect(chunk[i]);\n      if (!isNaN(val)) {\n        dimRawExtent[0] = Math.min(val, dimRawExtent[0]);\n        dimRawExtent[1] = Math.max(val, dimRawExtent[1]);\n      }\n    }\n    dim.ordinalMeta = ordinalMeta;\n    dim.ordinalOffset = len;\n    dim.type = 'ordinal'; // Force to be ordinal\n  };\n  DataStore.prototype.getOrdinalMeta = function (dimIdx) {\n    var dimInfo = this._dimensions[dimIdx];\n    var ordinalMeta = dimInfo.ordinalMeta;\n    return ordinalMeta;\n  };\n  DataStore.prototype.getDimensionProperty = function (dimIndex) {\n    var item = this._dimensions[dimIndex];\n    return item && item.property;\n  };\n  /**\n   * Caution: Can be only called on raw data (before `this._indices` created).\n   */\n  DataStore.prototype.appendData = function (data) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(!this._indices, 'appendData can only be called on raw data.');\n    }\n    var provider = this._provider;\n    var start = this.count();\n    provider.appendData(data);\n    var end = provider.count();\n    if (!provider.persistent) {\n      end += start;\n    }\n    if (start < end) {\n      this._initDataFromProvider(start, end, true);\n    }\n    return [start, end];\n  };\n  DataStore.prototype.appendValues = function (values, minFillLen) {\n    var chunks = this._chunks;\n    var dimensions = this._dimensions;\n    var dimLen = dimensions.length;\n    var rawExtent = this._rawExtent;\n    var start = this.count();\n    var end = start + Math.max(values.length, minFillLen || 0);\n    for (var i = 0; i < dimLen; i++) {\n      var dim = dimensions[i];\n      prepareStore(chunks, i, dim.type, end, true);\n    }\n    var emptyDataItem = [];\n    for (var idx = start; idx < end; idx++) {\n      var sourceIdx = idx - start;\n      // Store the data by dimensions\n      for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) {\n        var dim = dimensions[dimIdx];\n        var val = defaultDimValueGetters.arrayRows.call(this, values[sourceIdx] || emptyDataItem, dim.property, sourceIdx, dimIdx);\n        chunks[dimIdx][idx] = val;\n        var dimRawExtent = rawExtent[dimIdx];\n        val < dimRawExtent[0] && (dimRawExtent[0] = val);\n        val > dimRawExtent[1] && (dimRawExtent[1] = val);\n      }\n    }\n    this._rawCount = this._count = end;\n    return {\n      start: start,\n      end: end\n    };\n  };\n  DataStore.prototype._initDataFromProvider = function (start, end, append) {\n    var provider = this._provider;\n    var chunks = this._chunks;\n    var dimensions = this._dimensions;\n    var dimLen = dimensions.length;\n    var rawExtent = this._rawExtent;\n    var dimNames = map(dimensions, function (dim) {\n      return dim.property;\n    });\n    for (var i = 0; i < dimLen; i++) {\n      var dim = dimensions[i];\n      if (!rawExtent[i]) {\n        rawExtent[i] = getInitialExtent();\n      }\n      prepareStore(chunks, i, dim.type, end, append);\n    }\n    if (provider.fillStorage) {\n      provider.fillStorage(start, end, chunks, rawExtent);\n    } else {\n      var dataItem = [];\n      for (var idx = start; idx < end; idx++) {\n        // NOTICE: Try not to write things into dataItem\n        dataItem = provider.getItem(idx, dataItem);\n        // Each data item is value\n        // [1, 2]\n        // 2\n        // Bar chart, line chart which uses category axis\n        // only gives the 'y' value. 'x' value is the indices of category\n        // Use a tempValue to normalize the value to be a (x, y) value\n        // Store the data by dimensions\n        for (var dimIdx = 0; dimIdx < dimLen; dimIdx++) {\n          var dimStorage = chunks[dimIdx];\n          // PENDING NULL is empty or zero\n          var val = this._dimValueGetter(dataItem, dimNames[dimIdx], idx, dimIdx);\n          dimStorage[idx] = val;\n          var dimRawExtent = rawExtent[dimIdx];\n          val < dimRawExtent[0] && (dimRawExtent[0] = val);\n          val > dimRawExtent[1] && (dimRawExtent[1] = val);\n        }\n      }\n    }\n    if (!provider.persistent && provider.clean) {\n      // Clean unused data if data source is typed array.\n      provider.clean();\n    }\n    this._rawCount = this._count = end;\n    // Reset data extent\n    this._extent = [];\n  };\n  DataStore.prototype.count = function () {\n    return this._count;\n  };\n  /**\n   * Get value. Return NaN if idx is out of range.\n   */\n  DataStore.prototype.get = function (dim, idx) {\n    if (!(idx >= 0 && idx < this._count)) {\n      return NaN;\n    }\n    var dimStore = this._chunks[dim];\n    return dimStore ? dimStore[this.getRawIndex(idx)] : NaN;\n  };\n  DataStore.prototype.getValues = function (dimensions, idx) {\n    var values = [];\n    var dimArr = [];\n    if (idx == null) {\n      idx = dimensions;\n      // TODO get all from store?\n      dimensions = [];\n      // All dimensions\n      for (var i = 0; i < this._dimensions.length; i++) {\n        dimArr.push(i);\n      }\n    } else {\n      dimArr = dimensions;\n    }\n    for (var i = 0, len = dimArr.length; i < len; i++) {\n      values.push(this.get(dimArr[i], idx));\n    }\n    return values;\n  };\n  /**\n   * @param dim concrete dim\n   */\n  DataStore.prototype.getByRawIndex = function (dim, rawIdx) {\n    if (!(rawIdx >= 0 && rawIdx < this._rawCount)) {\n      return NaN;\n    }\n    var dimStore = this._chunks[dim];\n    return dimStore ? dimStore[rawIdx] : NaN;\n  };\n  /**\n   * Get sum of data in one dimension\n   */\n  DataStore.prototype.getSum = function (dim) {\n    var dimData = this._chunks[dim];\n    var sum = 0;\n    if (dimData) {\n      for (var i = 0, len = this.count(); i < len; i++) {\n        var value = this.get(dim, i);\n        if (!isNaN(value)) {\n          sum += value;\n        }\n      }\n    }\n    return sum;\n  };\n  /**\n   * Get median of data in one dimension\n   */\n  DataStore.prototype.getMedian = function (dim) {\n    var dimDataArray = [];\n    // map all data of one dimension\n    this.each([dim], function (val) {\n      if (!isNaN(val)) {\n        dimDataArray.push(val);\n      }\n    });\n    // TODO\n    // Use quick select?\n    var sortedDimDataArray = dimDataArray.sort(function (a, b) {\n      return a - b;\n    });\n    var len = this.count();\n    // calculate median\n    return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2;\n  };\n  /**\n   * Retrieve the index with given raw data index.\n   */\n  DataStore.prototype.indexOfRawIndex = function (rawIndex) {\n    if (rawIndex >= this._rawCount || rawIndex < 0) {\n      return -1;\n    }\n    if (!this._indices) {\n      return rawIndex;\n    }\n    // Indices are ascending\n    var indices = this._indices;\n    // If rawIndex === dataIndex\n    var rawDataIndex = indices[rawIndex];\n    if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) {\n      return rawIndex;\n    }\n    var left = 0;\n    var right = this._count - 1;\n    while (left <= right) {\n      var mid = (left + right) / 2 | 0;\n      if (indices[mid] < rawIndex) {\n        left = mid + 1;\n      } else if (indices[mid] > rawIndex) {\n        right = mid - 1;\n      } else {\n        return mid;\n      }\n    }\n    return -1;\n  };\n  DataStore.prototype.getIndices = function () {\n    var newIndices;\n    var indices = this._indices;\n    if (indices) {\n      var Ctor = indices.constructor;\n      var thisCount = this._count;\n      // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`.\n      if (Ctor === Array) {\n        newIndices = new Ctor(thisCount);\n        for (var i = 0; i < thisCount; i++) {\n          newIndices[i] = indices[i];\n        }\n      } else {\n        newIndices = new Ctor(indices.buffer, 0, thisCount);\n      }\n    } else {\n      var Ctor = getIndicesCtor(this._rawCount);\n      newIndices = new Ctor(this.count());\n      for (var i = 0; i < newIndices.length; i++) {\n        newIndices[i] = i;\n      }\n    }\n    return newIndices;\n  };\n  /**\n   * Data filter.\n   */\n  DataStore.prototype.filter = function (dims, cb) {\n    if (!this._count) {\n      return this;\n    }\n    var newStore = this.clone();\n    var count = newStore.count();\n    var Ctor = getIndicesCtor(newStore._rawCount);\n    var newIndices = new Ctor(count);\n    var value = [];\n    var dimSize = dims.length;\n    var offset = 0;\n    var dim0 = dims[0];\n    var chunks = newStore._chunks;\n    for (var i = 0; i < count; i++) {\n      var keep = void 0;\n      var rawIdx = newStore.getRawIndex(i);\n      // Simple optimization\n      if (dimSize === 0) {\n        keep = cb(i);\n      } else if (dimSize === 1) {\n        var val = chunks[dim0][rawIdx];\n        keep = cb(val, i);\n      } else {\n        var k = 0;\n        for (; k < dimSize; k++) {\n          value[k] = chunks[dims[k]][rawIdx];\n        }\n        value[k] = i;\n        keep = cb.apply(null, value);\n      }\n      if (keep) {\n        newIndices[offset++] = rawIdx;\n      }\n    }\n    // Set indices after filtered.\n    if (offset < count) {\n      newStore._indices = newIndices;\n    }\n    newStore._count = offset;\n    // Reset data extent\n    newStore._extent = [];\n    newStore._updateGetRawIdx();\n    return newStore;\n  };\n  /**\n   * Select data in range. (For optimization of filter)\n   * (Manually inline code, support 5 million data filtering in data zoom.)\n   */\n  DataStore.prototype.selectRange = function (range) {\n    var newStore = this.clone();\n    var len = newStore._count;\n    if (!len) {\n      return this;\n    }\n    var dims = keys(range);\n    var dimSize = dims.length;\n    if (!dimSize) {\n      return this;\n    }\n    var originalCount = newStore.count();\n    var Ctor = getIndicesCtor(newStore._rawCount);\n    var newIndices = new Ctor(originalCount);\n    var offset = 0;\n    var dim0 = dims[0];\n    var min = range[dim0][0];\n    var max = range[dim0][1];\n    var storeArr = newStore._chunks;\n    var quickFinished = false;\n    if (!newStore._indices) {\n      // Extreme optimization for common case. About 2x faster in chrome.\n      var idx = 0;\n      if (dimSize === 1) {\n        var dimStorage = storeArr[dims[0]];\n        for (var i = 0; i < len; i++) {\n          var val = dimStorage[i];\n          // NaN will not be filtered. Consider the case, in line chart, empty\n          // value indicates the line should be broken. But for the case like\n          // scatter plot, a data item with empty value will not be rendered,\n          // but the axis extent may be effected if some other dim of the data\n          // item has value. Fortunately it is not a significant negative effect.\n          if (val >= min && val <= max || isNaN(val)) {\n            newIndices[offset++] = idx;\n          }\n          idx++;\n        }\n        quickFinished = true;\n      } else if (dimSize === 2) {\n        var dimStorage = storeArr[dims[0]];\n        var dimStorage2 = storeArr[dims[1]];\n        var min2 = range[dims[1]][0];\n        var max2 = range[dims[1]][1];\n        for (var i = 0; i < len; i++) {\n          var val = dimStorage[i];\n          var val2 = dimStorage2[i];\n          // Do not filter NaN, see comment above.\n          if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) {\n            newIndices[offset++] = idx;\n          }\n          idx++;\n        }\n        quickFinished = true;\n      }\n    }\n    if (!quickFinished) {\n      if (dimSize === 1) {\n        for (var i = 0; i < originalCount; i++) {\n          var rawIndex = newStore.getRawIndex(i);\n          var val = storeArr[dims[0]][rawIndex];\n          // Do not filter NaN, see comment above.\n          if (val >= min && val <= max || isNaN(val)) {\n            newIndices[offset++] = rawIndex;\n          }\n        }\n      } else {\n        for (var i = 0; i < originalCount; i++) {\n          var keep = true;\n          var rawIndex = newStore.getRawIndex(i);\n          for (var k = 0; k < dimSize; k++) {\n            var dimk = dims[k];\n            var val = storeArr[dimk][rawIndex];\n            // Do not filter NaN, see comment above.\n            if (val < range[dimk][0] || val > range[dimk][1]) {\n              keep = false;\n            }\n          }\n          if (keep) {\n            newIndices[offset++] = newStore.getRawIndex(i);\n          }\n        }\n      }\n    }\n    // Set indices after filtered.\n    if (offset < originalCount) {\n      newStore._indices = newIndices;\n    }\n    newStore._count = offset;\n    // Reset data extent\n    newStore._extent = [];\n    newStore._updateGetRawIdx();\n    return newStore;\n  };\n  // /**\n  //  * Data mapping to a plain array\n  //  */\n  // mapArray(dims: DimensionIndex[], cb: MapArrayCb): any[] {\n  //     const result: any[] = [];\n  //     this.each(dims, function () {\n  //         result.push(cb && (cb as MapArrayCb).apply(null, arguments));\n  //     });\n  //     return result;\n  // }\n  /**\n   * Data mapping to a new List with given dimensions\n   */\n  DataStore.prototype.map = function (dims, cb) {\n    // TODO only clone picked chunks.\n    var target = this.clone(dims);\n    this._updateDims(target, dims, cb);\n    return target;\n  };\n  /**\n   * @caution Danger!! Only used in dataStack.\n   */\n  DataStore.prototype.modify = function (dims, cb) {\n    this._updateDims(this, dims, cb);\n  };\n  DataStore.prototype._updateDims = function (target, dims, cb) {\n    var targetChunks = target._chunks;\n    var tmpRetValue = [];\n    var dimSize = dims.length;\n    var dataCount = target.count();\n    var values = [];\n    var rawExtent = target._rawExtent;\n    for (var i = 0; i < dims.length; i++) {\n      rawExtent[dims[i]] = getInitialExtent();\n    }\n    for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) {\n      var rawIndex = target.getRawIndex(dataIndex);\n      for (var k = 0; k < dimSize; k++) {\n        values[k] = targetChunks[dims[k]][rawIndex];\n      }\n      values[dimSize] = dataIndex;\n      var retValue = cb && cb.apply(null, values);\n      if (retValue != null) {\n        // a number or string (in oridinal dimension)?\n        if (typeof retValue !== 'object') {\n          tmpRetValue[0] = retValue;\n          retValue = tmpRetValue;\n        }\n        for (var i = 0; i < retValue.length; i++) {\n          var dim = dims[i];\n          var val = retValue[i];\n          var rawExtentOnDim = rawExtent[dim];\n          var dimStore = targetChunks[dim];\n          if (dimStore) {\n            dimStore[rawIndex] = val;\n          }\n          if (val < rawExtentOnDim[0]) {\n            rawExtentOnDim[0] = val;\n          }\n          if (val > rawExtentOnDim[1]) {\n            rawExtentOnDim[1] = val;\n          }\n        }\n      }\n    }\n  };\n  /**\n   * Large data down sampling using largest-triangle-three-buckets\n   * @param {string} valueDimension\n   * @param {number} targetCount\n   */\n  DataStore.prototype.lttbDownSample = function (valueDimension, rate) {\n    var target = this.clone([valueDimension], true);\n    var targetStorage = target._chunks;\n    var dimStore = targetStorage[valueDimension];\n    var len = this.count();\n    var sampledIndex = 0;\n    var frameSize = Math.floor(1 / rate);\n    var currentRawIndex = this.getRawIndex(0);\n    var maxArea;\n    var area;\n    var nextRawIndex;\n    var newIndices = new (getIndicesCtor(this._rawCount))(Math.min((Math.ceil(len / frameSize) + 2) * 2, len));\n    // First frame use the first data.\n    newIndices[sampledIndex++] = currentRawIndex;\n    for (var i = 1; i < len - 1; i += frameSize) {\n      var nextFrameStart = Math.min(i + frameSize, len - 1);\n      var nextFrameEnd = Math.min(i + frameSize * 2, len);\n      var avgX = (nextFrameEnd + nextFrameStart) / 2;\n      var avgY = 0;\n      for (var idx = nextFrameStart; idx < nextFrameEnd; idx++) {\n        var rawIndex = this.getRawIndex(idx);\n        var y = dimStore[rawIndex];\n        if (isNaN(y)) {\n          continue;\n        }\n        avgY += y;\n      }\n      avgY /= nextFrameEnd - nextFrameStart;\n      var frameStart = i;\n      var frameEnd = Math.min(i + frameSize, len);\n      var pointAX = i - 1;\n      var pointAY = dimStore[currentRawIndex];\n      maxArea = -1;\n      nextRawIndex = frameStart;\n      var firstNaNIndex = -1;\n      var countNaN = 0;\n      // Find a point from current frame that construct a triangle with largest area with previous selected point\n      // And the average of next frame.\n      for (var idx = frameStart; idx < frameEnd; idx++) {\n        var rawIndex = this.getRawIndex(idx);\n        var y = dimStore[rawIndex];\n        if (isNaN(y)) {\n          countNaN++;\n          if (firstNaNIndex < 0) {\n            firstNaNIndex = rawIndex;\n          }\n          continue;\n        }\n        // Calculate triangle area over three buckets\n        area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY));\n        if (area > maxArea) {\n          maxArea = area;\n          nextRawIndex = rawIndex; // Next a is this b\n        }\n      }\n      if (countNaN > 0 && countNaN < frameEnd - frameStart) {\n        // Append first NaN point in every bucket.\n        // It is necessary to ensure the correct order of indices.\n        newIndices[sampledIndex++] = Math.min(firstNaNIndex, nextRawIndex);\n        nextRawIndex = Math.max(firstNaNIndex, nextRawIndex);\n      }\n      newIndices[sampledIndex++] = nextRawIndex;\n      currentRawIndex = nextRawIndex; // This a is the next a (chosen b)\n    }\n    // First frame use the last data.\n    newIndices[sampledIndex++] = this.getRawIndex(len - 1);\n    target._count = sampledIndex;\n    target._indices = newIndices;\n    target.getRawIndex = this._getRawIdx;\n    return target;\n  };\n  /**\n   * Large data down sampling using min-max\n   * @param {string} valueDimension\n   * @param {number} rate\n   */\n  DataStore.prototype.minmaxDownSample = function (valueDimension, rate) {\n    var target = this.clone([valueDimension], true);\n    var targetStorage = target._chunks;\n    var frameSize = Math.floor(1 / rate);\n    var dimStore = targetStorage[valueDimension];\n    var len = this.count();\n    // Each frame results in 2 data points, one for min and one for max\n    var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize) * 2);\n    var offset = 0;\n    for (var i = 0; i < len; i += frameSize) {\n      var minIndex = i;\n      var minValue = dimStore[this.getRawIndex(minIndex)];\n      var maxIndex = i;\n      var maxValue = dimStore[this.getRawIndex(maxIndex)];\n      var thisFrameSize = frameSize;\n      // Handle final smaller frame\n      if (i + frameSize > len) {\n        thisFrameSize = len - i;\n      }\n      // Determine min and max within the current frame\n      for (var k = 0; k < thisFrameSize; k++) {\n        var rawIndex = this.getRawIndex(i + k);\n        var value = dimStore[rawIndex];\n        if (value < minValue) {\n          minValue = value;\n          minIndex = i + k;\n        }\n        if (value > maxValue) {\n          maxValue = value;\n          maxIndex = i + k;\n        }\n      }\n      var rawMinIndex = this.getRawIndex(minIndex);\n      var rawMaxIndex = this.getRawIndex(maxIndex);\n      // Set the order of the min and max values, based on their ordering in the frame\n      if (minIndex < maxIndex) {\n        newIndices[offset++] = rawMinIndex;\n        newIndices[offset++] = rawMaxIndex;\n      } else {\n        newIndices[offset++] = rawMaxIndex;\n        newIndices[offset++] = rawMinIndex;\n      }\n    }\n    target._count = offset;\n    target._indices = newIndices;\n    target._updateGetRawIdx();\n    return target;\n  };\n  /**\n   * Large data down sampling on given dimension\n   * @param sampleIndex Sample index for name and id\n   */\n  DataStore.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) {\n    var target = this.clone([dimension], true);\n    var targetStorage = target._chunks;\n    var frameValues = [];\n    var frameSize = Math.floor(1 / rate);\n    var dimStore = targetStorage[dimension];\n    var len = this.count();\n    var rawExtentOnDim = target._rawExtent[dimension] = getInitialExtent();\n    var newIndices = new (getIndicesCtor(this._rawCount))(Math.ceil(len / frameSize));\n    var offset = 0;\n    for (var i = 0; i < len; i += frameSize) {\n      // Last frame\n      if (frameSize > len - i) {\n        frameSize = len - i;\n        frameValues.length = frameSize;\n      }\n      for (var k = 0; k < frameSize; k++) {\n        var dataIdx = this.getRawIndex(i + k);\n        frameValues[k] = dimStore[dataIdx];\n      }\n      var value = sampleValue(frameValues);\n      var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1));\n      // Only write value on the filtered data\n      dimStore[sampleFrameIdx] = value;\n      if (value < rawExtentOnDim[0]) {\n        rawExtentOnDim[0] = value;\n      }\n      if (value > rawExtentOnDim[1]) {\n        rawExtentOnDim[1] = value;\n      }\n      newIndices[offset++] = sampleFrameIdx;\n    }\n    target._count = offset;\n    target._indices = newIndices;\n    target._updateGetRawIdx();\n    return target;\n  };\n  /**\n   * Data iteration\n   * @param ctx default this\n   * @example\n   *  list.each('x', function (x, idx) {});\n   *  list.each(['x', 'y'], function (x, y, idx) {});\n   *  list.each(function (idx) {})\n   */\n  DataStore.prototype.each = function (dims, cb) {\n    if (!this._count) {\n      return;\n    }\n    var dimSize = dims.length;\n    var chunks = this._chunks;\n    for (var i = 0, len = this.count(); i < len; i++) {\n      var rawIdx = this.getRawIndex(i);\n      // Simple optimization\n      switch (dimSize) {\n        case 0:\n          cb(i);\n          break;\n        case 1:\n          cb(chunks[dims[0]][rawIdx], i);\n          break;\n        case 2:\n          cb(chunks[dims[0]][rawIdx], chunks[dims[1]][rawIdx], i);\n          break;\n        default:\n          var k = 0;\n          var value = [];\n          for (; k < dimSize; k++) {\n            value[k] = chunks[dims[k]][rawIdx];\n          }\n          // Index\n          value[k] = i;\n          cb.apply(null, value);\n      }\n    }\n  };\n  /**\n   * Get extent of data in one dimension\n   */\n  DataStore.prototype.getDataExtent = function (dim) {\n    // Make sure use concrete dim as cache name.\n    var dimData = this._chunks[dim];\n    var initialExtent = getInitialExtent();\n    if (!dimData) {\n      return initialExtent;\n    }\n    // Make more strict checkings to ensure hitting cache.\n    var currEnd = this.count();\n    // Consider the most cases when using data zoom, `getDataExtent`\n    // happened before filtering. We cache raw extent, which is not\n    // necessary to be cleared and recalculated when restore data.\n    var useRaw = !this._indices;\n    var dimExtent;\n    if (useRaw) {\n      return this._rawExtent[dim].slice();\n    }\n    dimExtent = this._extent[dim];\n    if (dimExtent) {\n      return dimExtent.slice();\n    }\n    dimExtent = initialExtent;\n    var min = dimExtent[0];\n    var max = dimExtent[1];\n    for (var i = 0; i < currEnd; i++) {\n      var rawIdx = this.getRawIndex(i);\n      var value = dimData[rawIdx];\n      value < min && (min = value);\n      value > max && (max = value);\n    }\n    dimExtent = [min, max];\n    this._extent[dim] = dimExtent;\n    return dimExtent;\n  };\n  /**\n   * Get raw data item\n   */\n  DataStore.prototype.getRawDataItem = function (idx) {\n    var rawIdx = this.getRawIndex(idx);\n    if (!this._provider.persistent) {\n      var val = [];\n      var chunks = this._chunks;\n      for (var i = 0; i < chunks.length; i++) {\n        val.push(chunks[i][rawIdx]);\n      }\n      return val;\n    } else {\n      return this._provider.getItem(rawIdx);\n    }\n  };\n  /**\n   * Clone shallow.\n   *\n   * @param clonedDims Determine which dims to clone. Will share the data if not specified.\n   */\n  DataStore.prototype.clone = function (clonedDims, ignoreIndices) {\n    var target = new DataStore();\n    var chunks = this._chunks;\n    var clonedDimsMap = clonedDims && reduce(clonedDims, function (obj, dimIdx) {\n      obj[dimIdx] = true;\n      return obj;\n    }, {});\n    if (clonedDimsMap) {\n      for (var i = 0; i < chunks.length; i++) {\n        // Not clone if dim is not picked.\n        target._chunks[i] = !clonedDimsMap[i] ? chunks[i] : cloneChunk(chunks[i]);\n      }\n    } else {\n      target._chunks = chunks;\n    }\n    this._copyCommonProps(target);\n    if (!ignoreIndices) {\n      target._indices = this._cloneIndices();\n    }\n    target._updateGetRawIdx();\n    return target;\n  };\n  DataStore.prototype._copyCommonProps = function (target) {\n    target._count = this._count;\n    target._rawCount = this._rawCount;\n    target._provider = this._provider;\n    target._dimensions = this._dimensions;\n    target._extent = clone(this._extent);\n    target._rawExtent = clone(this._rawExtent);\n  };\n  DataStore.prototype._cloneIndices = function () {\n    if (this._indices) {\n      var Ctor = this._indices.constructor;\n      var indices = void 0;\n      if (Ctor === Array) {\n        var thisCount = this._indices.length;\n        indices = new Ctor(thisCount);\n        for (var i = 0; i < thisCount; i++) {\n          indices[i] = this._indices[i];\n        }\n      } else {\n        indices = new Ctor(this._indices);\n      }\n      return indices;\n    }\n    return null;\n  };\n  DataStore.prototype._getRawIdxIdentity = function (idx) {\n    return idx;\n  };\n  DataStore.prototype._getRawIdx = function (idx) {\n    if (idx < this._count && idx >= 0) {\n      return this._indices[idx];\n    }\n    return -1;\n  };\n  DataStore.prototype._updateGetRawIdx = function () {\n    this.getRawIndex = this._indices ? this._getRawIdx : this._getRawIdxIdentity;\n  };\n  DataStore.internalField = function () {\n    function getDimValueSimply(dataItem, property, dataIndex, dimIndex) {\n      return parseDataValue(dataItem[dimIndex], this._dimensions[dimIndex]);\n    }\n    defaultDimValueGetters = {\n      arrayRows: getDimValueSimply,\n      objectRows: function (dataItem, property, dataIndex, dimIndex) {\n        return parseDataValue(dataItem[property], this._dimensions[dimIndex]);\n      },\n      keyedColumns: getDimValueSimply,\n      original: function (dataItem, property, dataIndex, dimIndex) {\n        // Performance sensitive, do not use modelUtil.getDataItemValue.\n        // If dataItem is an plain object with no value field, the let `value`\n        // will be assigned with the object, but it will be tread correctly\n        // in the `convertValue`.\n        var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value);\n        return parseDataValue(value instanceof Array ? value[dimIndex]\n        // If value is a single number or something else not array.\n        : value, this._dimensions[dimIndex]);\n      },\n      typedArray: function (dataItem, property, dataIndex, dimIndex) {\n        return dataItem[dimIndex];\n      }\n    };\n  }();\n  return DataStore;\n}();\nexport default DataStore;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { setAsPrimitive, map, isTypedArray, assert, each, retrieve2 } from 'zrender/lib/core/util.js';\nimport { createSource, cloneSourceShallow } from '../Source.js';\nimport { SOURCE_FORMAT_TYPED_ARRAY, SOURCE_FORMAT_ORIGINAL } from '../../util/types.js';\nimport { querySeriesUpstreamDatasetModel, queryDatasetUpstreamDatasetModels } from './sourceHelper.js';\nimport { applyDataTransform } from './transform.js';\nimport DataStore from '../DataStore.js';\nimport { DefaultDataProvider } from './dataProvider.js';\n/**\n * [REQUIREMENT_MEMO]:\n * (0) `metaRawOption` means `dimensions`/`sourceHeader`/`seriesLayoutBy` in raw option.\n * (1) Keep support the feature: `metaRawOption` can be specified both on `series` and\n * `root-dataset`. Them on `series` has higher priority.\n * (2) Do not support to set `metaRawOption` on a `non-root-dataset`, because it might\n * confuse users: whether those props indicate how to visit the upstream source or visit\n * the transform result source, and some transforms has nothing to do with these props,\n * and some transforms might have multiple upstream.\n * (3) Transforms should specify `metaRawOption` in each output, just like they can be\n * declared in `root-dataset`.\n * (4) At present only support visit source in `SERIES_LAYOUT_BY_COLUMN` in transforms.\n * That is for reducing complexity in transforms.\n * PENDING: Whether to provide transposition transform?\n *\n * [IMPLEMENTAION_MEMO]:\n * \"sourceVisitConfig\" are calculated from `metaRawOption` and `data`.\n * They will not be calculated until `source` is about to be visited (to prevent from\n * duplicate calcuation). `source` is visited only in series and input to transforms.\n *\n * [DIMENSION_INHERIT_RULE]:\n * By default the dimensions are inherited from ancestors, unless a transform return\n * a new dimensions definition.\n * Consider the case:\n * ```js\n * dataset: [{\n *     source: [ ['Product', 'Sales', 'Prise'], ['Cookies', 321, 44.21], ...]\n * }, {\n *     transform: { type: 'filter', ... }\n * }]\n * dataset: [{\n *     dimension: ['Product', 'Sales', 'Prise'],\n *     source: [ ['Cookies', 321, 44.21], ...]\n * }, {\n *     transform: { type: 'filter', ... }\n * }]\n * ```\n * The two types of option should have the same behavior after transform.\n *\n *\n * [SCENARIO]:\n * (1) Provide source data directly:\n * ```js\n * series: {\n *     encode: {...},\n *     dimensions: [...]\n *     seriesLayoutBy: 'row',\n *     data: [[...]]\n * }\n * ```\n * (2) Series refer to dataset.\n * ```js\n * series: [{\n *     encode: {...}\n *     // Ignore datasetIndex means `datasetIndex: 0`\n *     // and the dimensions defination in dataset is used\n * }, {\n *     encode: {...},\n *     seriesLayoutBy: 'column',\n *     datasetIndex: 1\n * }]\n * ```\n * (3) dataset transform\n * ```js\n * dataset: [{\n *     source: [...]\n * }, {\n *     source: [...]\n * }, {\n *     // By default from 0.\n *     transform: { type: 'filter', config: {...} }\n * }, {\n *     // Piped.\n *     transform: [\n *         { type: 'filter', config: {...} },\n *         { type: 'sort', config: {...} }\n *     ]\n * }, {\n *     id: 'regressionData',\n *     fromDatasetIndex: 1,\n *     // Third-party transform\n *     transform: { type: 'ecStat:regression', config: {...} }\n * }, {\n *     // retrieve the extra result.\n *     id: 'regressionFormula',\n *     fromDatasetId: 'regressionData',\n *     fromTransformResult: 1\n * }]\n * ```\n */\nvar SourceManager = /** @class */function () {\n  function SourceManager(sourceHost) {\n    // Cached source. Do not repeat calculating if not dirty.\n    this._sourceList = [];\n    this._storeList = [];\n    // version sign of each upstream source manager.\n    this._upstreamSignList = [];\n    this._versionSignBase = 0;\n    this._dirty = true;\n    this._sourceHost = sourceHost;\n  }\n  /**\n   * Mark dirty.\n   */\n  SourceManager.prototype.dirty = function () {\n    this._setLocalSource([], []);\n    this._storeList = [];\n    this._dirty = true;\n  };\n  SourceManager.prototype._setLocalSource = function (sourceList, upstreamSignList) {\n    this._sourceList = sourceList;\n    this._upstreamSignList = upstreamSignList;\n    this._versionSignBase++;\n    if (this._versionSignBase > 9e10) {\n      this._versionSignBase = 0;\n    }\n  };\n  /**\n   * For detecting whether the upstream source is dirty, so that\n   * the local cached source (in `_sourceList`) should be discarded.\n   */\n  SourceManager.prototype._getVersionSign = function () {\n    return this._sourceHost.uid + '_' + this._versionSignBase;\n  };\n  /**\n   * Always return a source instance. Otherwise throw error.\n   */\n  SourceManager.prototype.prepareSource = function () {\n    // For the case that call `setOption` multiple time but no data changed,\n    // cache the result source to prevent from repeating transform.\n    if (this._isDirty()) {\n      this._createSource();\n      this._dirty = false;\n    }\n  };\n  SourceManager.prototype._createSource = function () {\n    this._setLocalSource([], []);\n    var sourceHost = this._sourceHost;\n    var upSourceMgrList = this._getUpstreamSourceManagers();\n    var hasUpstream = !!upSourceMgrList.length;\n    var resultSourceList;\n    var upstreamSignList;\n    if (isSeries(sourceHost)) {\n      var seriesModel = sourceHost;\n      var data = void 0;\n      var sourceFormat = void 0;\n      var upSource = void 0;\n      // Has upstream dataset\n      if (hasUpstream) {\n        var upSourceMgr = upSourceMgrList[0];\n        upSourceMgr.prepareSource();\n        upSource = upSourceMgr.getSource();\n        data = upSource.data;\n        sourceFormat = upSource.sourceFormat;\n        upstreamSignList = [upSourceMgr._getVersionSign()];\n      }\n      // Series data is from own.\n      else {\n        data = seriesModel.get('data', true);\n        sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL;\n        upstreamSignList = [];\n      }\n      // See [REQUIREMENT_MEMO], merge settings on series and parent dataset if it is root.\n      var newMetaRawOption = this._getSourceMetaRawOption() || {};\n      var upMetaRawOption = upSource && upSource.metaRawOption || {};\n      var seriesLayoutBy = retrieve2(newMetaRawOption.seriesLayoutBy, upMetaRawOption.seriesLayoutBy) || null;\n      var sourceHeader = retrieve2(newMetaRawOption.sourceHeader, upMetaRawOption.sourceHeader);\n      // Note here we should not use `upSource.dimensionsDefine`. Consider the case:\n      // `upSource.dimensionsDefine` is detected by `seriesLayoutBy: 'column'`,\n      // but series need `seriesLayoutBy: 'row'`.\n      var dimensions = retrieve2(newMetaRawOption.dimensions, upMetaRawOption.dimensions);\n      // We share source with dataset as much as possible\n      // to avoid extra memory cost of high dimensional data.\n      var needsCreateSource = seriesLayoutBy !== upMetaRawOption.seriesLayoutBy || !!sourceHeader !== !!upMetaRawOption.sourceHeader || dimensions;\n      resultSourceList = needsCreateSource ? [createSource(data, {\n        seriesLayoutBy: seriesLayoutBy,\n        sourceHeader: sourceHeader,\n        dimensions: dimensions\n      }, sourceFormat)] : [];\n    } else {\n      var datasetModel = sourceHost;\n      // Has upstream dataset.\n      if (hasUpstream) {\n        var result = this._applyTransform(upSourceMgrList);\n        resultSourceList = result.sourceList;\n        upstreamSignList = result.upstreamSignList;\n      }\n      // Is root dataset.\n      else {\n        var sourceData = datasetModel.get('source', true);\n        resultSourceList = [createSource(sourceData, this._getSourceMetaRawOption(), null)];\n        upstreamSignList = [];\n      }\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      assert(resultSourceList && upstreamSignList);\n    }\n    this._setLocalSource(resultSourceList, upstreamSignList);\n  };\n  SourceManager.prototype._applyTransform = function (upMgrList) {\n    var datasetModel = this._sourceHost;\n    var transformOption = datasetModel.get('transform', true);\n    var fromTransformResult = datasetModel.get('fromTransformResult', true);\n    if (process.env.NODE_ENV !== 'production') {\n      assert(fromTransformResult != null || transformOption != null);\n    }\n    if (fromTransformResult != null) {\n      var errMsg = '';\n      if (upMgrList.length !== 1) {\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = 'When using `fromTransformResult`, there should be only one upstream dataset';\n        }\n        doThrow(errMsg);\n      }\n    }\n    var sourceList;\n    var upSourceList = [];\n    var upstreamSignList = [];\n    each(upMgrList, function (upMgr) {\n      upMgr.prepareSource();\n      var upSource = upMgr.getSource(fromTransformResult || 0);\n      var errMsg = '';\n      if (fromTransformResult != null && !upSource) {\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = 'Can not retrieve result by `fromTransformResult`: ' + fromTransformResult;\n        }\n        doThrow(errMsg);\n      }\n      upSourceList.push(upSource);\n      upstreamSignList.push(upMgr._getVersionSign());\n    });\n    if (transformOption) {\n      sourceList = applyDataTransform(transformOption, upSourceList, {\n        datasetIndex: datasetModel.componentIndex\n      });\n    } else if (fromTransformResult != null) {\n      sourceList = [cloneSourceShallow(upSourceList[0])];\n    }\n    return {\n      sourceList: sourceList,\n      upstreamSignList: upstreamSignList\n    };\n  };\n  SourceManager.prototype._isDirty = function () {\n    if (this._dirty) {\n      return true;\n    }\n    // All sourceList is from the some upstream.\n    var upSourceMgrList = this._getUpstreamSourceManagers();\n    for (var i = 0; i < upSourceMgrList.length; i++) {\n      var upSrcMgr = upSourceMgrList[i];\n      if (\n      // Consider the case that there is ancestor diry, call it recursively.\n      // The performance is probably not an issue because usually the chain is not long.\n      upSrcMgr._isDirty() || this._upstreamSignList[i] !== upSrcMgr._getVersionSign()) {\n        return true;\n      }\n    }\n  };\n  /**\n   * @param sourceIndex By default 0, means \"main source\".\n   *                    In most cases there is only one source.\n   */\n  SourceManager.prototype.getSource = function (sourceIndex) {\n    sourceIndex = sourceIndex || 0;\n    var source = this._sourceList[sourceIndex];\n    if (!source) {\n      // Series may share source instance with dataset.\n      var upSourceMgrList = this._getUpstreamSourceManagers();\n      return upSourceMgrList[0] && upSourceMgrList[0].getSource(sourceIndex);\n    }\n    return source;\n  };\n  /**\n   *\n   * Get a data store which can be shared across series.\n   * Only available for series.\n   *\n   * @param seriesDimRequest Dimensions that are generated in series.\n   *        Should have been sorted by `storeDimIndex` asc.\n   */\n  SourceManager.prototype.getSharedDataStore = function (seriesDimRequest) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(isSeries(this._sourceHost), 'Can only call getDataStore on series source manager.');\n    }\n    var schema = seriesDimRequest.makeStoreSchema();\n    return this._innerGetDataStore(schema.dimensions, seriesDimRequest.source, schema.hash);\n  };\n  SourceManager.prototype._innerGetDataStore = function (storeDims, seriesSource, sourceReadKey) {\n    // TODO Can use other sourceIndex?\n    var sourceIndex = 0;\n    var storeList = this._storeList;\n    var cachedStoreMap = storeList[sourceIndex];\n    if (!cachedStoreMap) {\n      cachedStoreMap = storeList[sourceIndex] = {};\n    }\n    var cachedStore = cachedStoreMap[sourceReadKey];\n    if (!cachedStore) {\n      var upSourceMgr = this._getUpstreamSourceManagers()[0];\n      if (isSeries(this._sourceHost) && upSourceMgr) {\n        cachedStore = upSourceMgr._innerGetDataStore(storeDims, seriesSource, sourceReadKey);\n      } else {\n        cachedStore = new DataStore();\n        // Always create store from source of series.\n        cachedStore.initData(new DefaultDataProvider(seriesSource, storeDims.length), storeDims);\n      }\n      cachedStoreMap[sourceReadKey] = cachedStore;\n    }\n    return cachedStore;\n  };\n  /**\n   * PENDING: Is it fast enough?\n   * If no upstream, return empty array.\n   */\n  SourceManager.prototype._getUpstreamSourceManagers = function () {\n    // Always get the relationship from the raw option.\n    // Do not cache the link of the dependency graph, so that\n    // there is no need to update them when change happens.\n    var sourceHost = this._sourceHost;\n    if (isSeries(sourceHost)) {\n      var datasetModel = querySeriesUpstreamDatasetModel(sourceHost);\n      return !datasetModel ? [] : [datasetModel.getSourceManager()];\n    } else {\n      return map(queryDatasetUpstreamDatasetModels(sourceHost), function (datasetModel) {\n        return datasetModel.getSourceManager();\n      });\n    }\n  };\n  SourceManager.prototype._getSourceMetaRawOption = function () {\n    var sourceHost = this._sourceHost;\n    var seriesLayoutBy;\n    var sourceHeader;\n    var dimensions;\n    if (isSeries(sourceHost)) {\n      seriesLayoutBy = sourceHost.get('seriesLayoutBy', true);\n      sourceHeader = sourceHost.get('sourceHeader', true);\n      dimensions = sourceHost.get('dimensions', true);\n    }\n    // See [REQUIREMENT_MEMO], `non-root-dataset` do not support them.\n    else if (!this._getUpstreamSourceManagers().length) {\n      var model = sourceHost;\n      seriesLayoutBy = model.get('seriesLayoutBy', true);\n      sourceHeader = model.get('sourceHeader', true);\n      dimensions = model.get('dimensions', true);\n    }\n    return {\n      seriesLayoutBy: seriesLayoutBy,\n      sourceHeader: sourceHeader,\n      dimensions: dimensions\n    };\n  };\n  return SourceManager;\n}();\nexport { SourceManager };\n// Call this method after `super.init` and `super.mergeOption` to\n// disable the transform merge, but do not disable transform clone from rawOption.\nexport function disableTransformOptionMerge(datasetModel) {\n  var transformOption = datasetModel.option.transform;\n  transformOption && setAsPrimitive(datasetModel.option.transform);\n}\nfunction isSeries(sourceHost) {\n  // Avoid circular dependency with Series.ts\n  return sourceHost.mainType === 'series';\n}\nfunction doThrow(errMsg) {\n  throw new Error(errMsg);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { getTooltipMarker, encodeHTML, makeValueReadable, convertToColorString } from '../../util/format.js';\nimport { isString, each, hasOwn, isArray, map, assert, extend } from 'zrender/lib/core/util.js';\nimport { SortOrderComparator } from '../../data/helper/dataValueHelper.js';\nimport { getRandomIdBase } from '../../util/number.js';\nimport tokens from '../../visual/tokens.js';\nvar TOOLTIP_LINE_HEIGHT_CSS = 'line-height:1';\nfunction getTooltipLineHeight(textStyle) {\n  var lineHeight = textStyle.lineHeight;\n  if (lineHeight == null) {\n    return TOOLTIP_LINE_HEIGHT_CSS;\n  } else {\n    return \"line-height:\" + encodeHTML(lineHeight + '') + \"px\";\n  }\n}\n// TODO: more textStyle option\nfunction getTooltipTextStyle(textStyle, renderMode) {\n  var nameFontColor = textStyle.color || tokens.color.tertiary;\n  var nameFontSize = textStyle.fontSize || 12;\n  var nameFontWeight = textStyle.fontWeight || '400';\n  var valueFontColor = textStyle.color || tokens.color.secondary;\n  var valueFontSize = textStyle.fontSize || 14;\n  var valueFontWeight = textStyle.fontWeight || '900';\n  if (renderMode === 'html') {\n    // `textStyle` is probably from user input, should be encoded to reduce security risk.\n    return {\n      // eslint-disable-next-line max-len\n      nameStyle: \"font-size:\" + encodeHTML(nameFontSize + '') + \"px;color:\" + encodeHTML(nameFontColor) + \";font-weight:\" + encodeHTML(nameFontWeight + ''),\n      // eslint-disable-next-line max-len\n      valueStyle: \"font-size:\" + encodeHTML(valueFontSize + '') + \"px;color:\" + encodeHTML(valueFontColor) + \";font-weight:\" + encodeHTML(valueFontWeight + '')\n    };\n  } else {\n    return {\n      nameStyle: {\n        fontSize: nameFontSize,\n        fill: nameFontColor,\n        fontWeight: nameFontWeight\n      },\n      valueStyle: {\n        fontSize: valueFontSize,\n        fill: valueFontColor,\n        fontWeight: valueFontWeight\n      }\n    };\n  }\n}\n// See `TooltipMarkupLayoutIntent['innerGapLevel']`.\n// (value from UI design)\nvar HTML_GAPS = [0, 10, 20, 30];\nvar RICH_TEXT_GAPS = ['', '\\n', '\\n\\n', '\\n\\n\\n'];\n// eslint-disable-next-line max-len\nexport function createTooltipMarkup(type, option) {\n  option.type = type;\n  return option;\n}\nfunction isSectionFragment(frag) {\n  return frag.type === 'section';\n}\nfunction getBuilder(frag) {\n  return isSectionFragment(frag) ? buildSection : buildNameValue;\n}\nfunction getBlockGapLevel(frag) {\n  if (isSectionFragment(frag)) {\n    var gapLevel_1 = 0;\n    var subBlockLen = frag.blocks.length;\n    var hasInnerGap_1 = subBlockLen > 1 || subBlockLen > 0 && !frag.noHeader;\n    each(frag.blocks, function (subBlock) {\n      var subGapLevel = getBlockGapLevel(subBlock);\n      // If the some of the sub-blocks have some gaps (like 10px) inside, this block\n      // should use a larger gap (like 20px) to distinguish those sub-blocks.\n      if (subGapLevel >= gapLevel_1) {\n        gapLevel_1 = subGapLevel + +(hasInnerGap_1 && (\n        // 0 always can not be readable gap level.\n        !subGapLevel\n        // If no header, always keep the sub gap level. Otherwise\n        // look weird in case `multipleSeries`.\n        || isSectionFragment(subBlock) && !subBlock.noHeader));\n      }\n    });\n    return gapLevel_1;\n  }\n  return 0;\n}\nfunction buildSection(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) {\n  var noHeader = fragment.noHeader;\n  var gaps = getGap(getBlockGapLevel(fragment));\n  var subMarkupTextList = [];\n  var subBlocks = fragment.blocks || [];\n  assert(!subBlocks || isArray(subBlocks));\n  subBlocks = subBlocks || [];\n  var orderMode = ctx.orderMode;\n  if (fragment.sortBlocks && orderMode) {\n    subBlocks = subBlocks.slice();\n    var orderMap = {\n      valueAsc: 'asc',\n      valueDesc: 'desc'\n    };\n    if (hasOwn(orderMap, orderMode)) {\n      var comparator_1 = new SortOrderComparator(orderMap[orderMode], null);\n      subBlocks.sort(function (a, b) {\n        return comparator_1.evaluate(a.sortParam, b.sortParam);\n      });\n    }\n    // FIXME 'seriesDesc' necessary?\n    else if (orderMode === 'seriesDesc') {\n      subBlocks.reverse();\n    }\n  }\n  each(subBlocks, function (subBlock, idx) {\n    var valueFormatter = fragment.valueFormatter;\n    var subMarkupText = getBuilder(subBlock)(\n    // Inherit valueFormatter\n    valueFormatter ? extend(extend({}, ctx), {\n      valueFormatter: valueFormatter\n    }) : ctx, subBlock, idx > 0 ? gaps.html : 0, toolTipTextStyle);\n    subMarkupText != null && subMarkupTextList.push(subMarkupText);\n  });\n  var subMarkupText = ctx.renderMode === 'richText' ? subMarkupTextList.join(gaps.richText) : wrapBlockHTML(toolTipTextStyle, subMarkupTextList.join(''), noHeader ? topMarginForOuterGap : gaps.html);\n  if (noHeader) {\n    return subMarkupText;\n  }\n  var displayableHeader = makeValueReadable(fragment.header, 'ordinal', ctx.useUTC);\n  var nameStyle = getTooltipTextStyle(toolTipTextStyle, ctx.renderMode).nameStyle;\n  var tooltipLineHeight = getTooltipLineHeight(toolTipTextStyle);\n  if (ctx.renderMode === 'richText') {\n    return wrapInlineNameRichText(ctx, displayableHeader, nameStyle) + gaps.richText + subMarkupText;\n  } else {\n    return wrapBlockHTML(toolTipTextStyle, \"<div style=\\\"\" + nameStyle + \";\" + tooltipLineHeight + \";\\\">\" + encodeHTML(displayableHeader) + '</div>' + subMarkupText, topMarginForOuterGap);\n  }\n}\nfunction buildNameValue(ctx, fragment, topMarginForOuterGap, toolTipTextStyle) {\n  var renderMode = ctx.renderMode;\n  var noName = fragment.noName;\n  var noValue = fragment.noValue;\n  var noMarker = !fragment.markerType;\n  var name = fragment.name;\n  var useUTC = ctx.useUTC;\n  var valueFormatter = fragment.valueFormatter || ctx.valueFormatter || function (value) {\n    value = isArray(value) ? value : [value];\n    return map(value, function (val, idx) {\n      return makeValueReadable(val, isArray(valueTypeOption) ? valueTypeOption[idx] : valueTypeOption, useUTC);\n    });\n  };\n  if (noName && noValue) {\n    return;\n  }\n  var markerStr = noMarker ? '' : ctx.markupStyleCreator.makeTooltipMarker(fragment.markerType, fragment.markerColor || tokens.color.secondary, renderMode);\n  var readableName = noName ? '' : makeValueReadable(name, 'ordinal', useUTC);\n  var valueTypeOption = fragment.valueType;\n  var readableValueList = noValue ? [] : valueFormatter(fragment.value, fragment.dataIndex);\n  var valueAlignRight = !noMarker || !noName;\n  // It little weird if only value next to marker but far from marker.\n  var valueCloseToMarker = !noMarker && noName;\n  var _a = getTooltipTextStyle(toolTipTextStyle, renderMode),\n    nameStyle = _a.nameStyle,\n    valueStyle = _a.valueStyle;\n  return renderMode === 'richText' ? (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameRichText(ctx, readableName, nameStyle))\n  // Value has commas inside, so use ' ' as delimiter for multiple values.\n  + (noValue ? '' : wrapInlineValueRichText(ctx, readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)) : wrapBlockHTML(toolTipTextStyle, (noMarker ? '' : markerStr) + (noName ? '' : wrapInlineNameHTML(readableName, !noMarker, nameStyle)) + (noValue ? '' : wrapInlineValueHTML(readableValueList, valueAlignRight, valueCloseToMarker, valueStyle)), topMarginForOuterGap);\n}\n/**\n * @return markupText. null/undefined means no content.\n */\nexport function buildTooltipMarkup(fragment, markupStyleCreator, renderMode, orderMode, useUTC, toolTipTextStyle) {\n  if (!fragment) {\n    return;\n  }\n  var builder = getBuilder(fragment);\n  var ctx = {\n    useUTC: useUTC,\n    renderMode: renderMode,\n    orderMode: orderMode,\n    markupStyleCreator: markupStyleCreator,\n    valueFormatter: fragment.valueFormatter\n  };\n  return builder(ctx, fragment, 0, toolTipTextStyle);\n}\nfunction getGap(gapLevel) {\n  return {\n    html: HTML_GAPS[gapLevel],\n    richText: RICH_TEXT_GAPS[gapLevel]\n  };\n}\nfunction wrapBlockHTML(textStyle, encodedContent, topGap) {\n  var clearfix = '<div style=\"clear:both\"></div>';\n  var marginCSS = \"margin: \" + topGap + \"px 0 0\";\n  var tooltipLineHeight = getTooltipLineHeight(textStyle);\n  return \"<div style=\\\"\" + marginCSS + \";\" + tooltipLineHeight + \";\\\">\" + encodedContent + clearfix + '</div>';\n}\nfunction wrapInlineNameHTML(name, leftHasMarker, style) {\n  var marginCss = leftHasMarker ? 'margin-left:2px' : '';\n  return \"<span style=\\\"\" + style + \";\" + marginCss + \"\\\">\" + encodeHTML(name) + '</span>';\n}\nfunction wrapInlineValueHTML(valueList, alignRight, valueCloseToMarker, style) {\n  // Do not too close to marker, considering there are multiple values separated by spaces.\n  var paddingStr = valueCloseToMarker ? '10px' : '20px';\n  var alignCSS = alignRight ? \"float:right;margin-left:\" + paddingStr : '';\n  valueList = isArray(valueList) ? valueList : [valueList];\n  return \"<span style=\\\"\" + alignCSS + \";\" + style + \"\\\">\"\n  // Value has commas inside, so use '  ' as delimiter for multiple values.\n  + map(valueList, function (value) {\n    return encodeHTML(value);\n  }).join('&nbsp;&nbsp;') + '</span>';\n}\nfunction wrapInlineNameRichText(ctx, name, style) {\n  return ctx.markupStyleCreator.wrapRichTextStyle(name, style);\n}\nfunction wrapInlineValueRichText(ctx, values, alignRight, valueCloseToMarker, style) {\n  var styles = [style];\n  var paddingLeft = valueCloseToMarker ? 10 : 20;\n  alignRight && styles.push({\n    padding: [0, 0, 0, paddingLeft],\n    align: 'right'\n  });\n  // Value has commas inside, so use '  ' as delimiter for multiple values.\n  return ctx.markupStyleCreator.wrapRichTextStyle(isArray(values) ? values.join('  ') : values, styles);\n}\nexport function retrieveVisualColorForTooltipMarker(series, dataIndex) {\n  var style = series.getData().getItemVisual(dataIndex, 'style');\n  var color = style[series.visualDrawType];\n  return convertToColorString(color);\n}\nexport function getPaddingFromTooltipModel(model, renderMode) {\n  var padding = model.get('padding');\n  return padding != null ? padding\n  // We give slightly different to look pretty.\n  : renderMode === 'richText' ? [8, 10] : 10;\n}\n/**\n * The major feature is generate styles for `renderMode: 'richText'`.\n * But it also serves `renderMode: 'html'` to provide\n * \"renderMode-independent\" API.\n */\nvar TooltipMarkupStyleCreator = /** @class */function () {\n  function TooltipMarkupStyleCreator() {\n    this.richTextStyles = {};\n    // Notice that \"generate a style name\" usually happens repeatedly when mouse is moving and\n    // a tooltip is displayed. So we put the `_nextStyleNameId` as a member of each creator\n    // rather than static shared by all creators (which will cause it increase to fast).\n    this._nextStyleNameId = getRandomIdBase();\n  }\n  TooltipMarkupStyleCreator.prototype._generateStyleName = function () {\n    return '__EC_aUTo_' + this._nextStyleNameId++;\n  };\n  TooltipMarkupStyleCreator.prototype.makeTooltipMarker = function (markerType, colorStr, renderMode) {\n    var markerId = renderMode === 'richText' ? this._generateStyleName() : null;\n    var marker = getTooltipMarker({\n      color: colorStr,\n      type: markerType,\n      renderMode: renderMode,\n      markerId: markerId\n    });\n    if (isString(marker)) {\n      return marker;\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        assert(markerId);\n      }\n      this.richTextStyles[markerId] = marker.style;\n      return marker.content;\n    }\n  };\n  /**\n   * @usage\n   * ```ts\n   * const styledText = markupStyleCreator.wrapRichTextStyle([\n   *     // The styles will be auto merged.\n   *     {\n   *         fontSize: 12,\n   *         color: 'blue'\n   *     },\n   *     {\n   *         padding: 20\n   *     }\n   * ]);\n   * ```\n   */\n  TooltipMarkupStyleCreator.prototype.wrapRichTextStyle = function (text, styles) {\n    var finalStl = {};\n    if (isArray(styles)) {\n      each(styles, function (stl) {\n        return extend(finalStl, stl);\n      });\n    } else {\n      extend(finalStl, styles);\n    }\n    var styleName = this._generateStyleName();\n    this.richTextStyles[styleName] = finalStl;\n    return \"{\" + styleName + \"|\" + text + \"}\";\n  };\n  return TooltipMarkupStyleCreator;\n}();\nexport { TooltipMarkupStyleCreator };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { trim, isArray, each, reduce } from 'zrender/lib/core/util.js';\nimport { retrieveVisualColorForTooltipMarker, createTooltipMarkup } from './tooltipMarkup.js';\nimport { retrieveRawValue } from '../../data/helper/dataProvider.js';\nimport { isNameSpecified } from '../../util/model.js';\nexport function defaultSeriesFormatTooltip(opt) {\n  var series = opt.series;\n  var dataIndex = opt.dataIndex;\n  var multipleSeries = opt.multipleSeries;\n  var data = series.getData();\n  var tooltipDims = data.mapDimensionsAll('defaultedTooltip');\n  var tooltipDimLen = tooltipDims.length;\n  var value = series.getRawValue(dataIndex);\n  var isValueArr = isArray(value);\n  var markerColor = retrieveVisualColorForTooltipMarker(series, dataIndex);\n  // Complicated rule for pretty tooltip.\n  var inlineValue;\n  var inlineValueType;\n  var subBlocks;\n  var sortParam;\n  if (tooltipDimLen > 1 || isValueArr && !tooltipDimLen) {\n    var formatArrResult = formatTooltipArrayValue(value, series, dataIndex, tooltipDims, markerColor);\n    inlineValue = formatArrResult.inlineValues;\n    inlineValueType = formatArrResult.inlineValueTypes;\n    subBlocks = formatArrResult.blocks;\n    // Only support tooltip sort by the first inline value. It's enough in most cases.\n    sortParam = formatArrResult.inlineValues[0];\n  } else if (tooltipDimLen) {\n    var dimInfo = data.getDimensionInfo(tooltipDims[0]);\n    sortParam = inlineValue = retrieveRawValue(data, dataIndex, tooltipDims[0]);\n    inlineValueType = dimInfo.type;\n  } else {\n    sortParam = inlineValue = isValueArr ? value[0] : value;\n  }\n  // Do not show generated series name. It might not be readable.\n  var seriesNameSpecified = isNameSpecified(series);\n  var seriesName = seriesNameSpecified && series.name || '';\n  var itemName = data.getName(dataIndex);\n  var inlineName = multipleSeries ? seriesName : itemName;\n  return createTooltipMarkup('section', {\n    header: seriesName,\n    // When series name is not specified, do not show a header line with only '-'.\n    // This case always happens in tooltip.trigger: 'item'.\n    noHeader: multipleSeries || !seriesNameSpecified,\n    sortParam: sortParam,\n    blocks: [createTooltipMarkup('nameValue', {\n      markerType: 'item',\n      markerColor: markerColor,\n      // Do not mix display seriesName and itemName in one tooltip,\n      // which might confuses users.\n      name: inlineName,\n      // name dimension might be auto assigned, where the name might\n      // be not readable. So we check trim here.\n      noName: !trim(inlineName),\n      value: inlineValue,\n      valueType: inlineValueType,\n      dataIndex: dataIndex\n    })].concat(subBlocks || [])\n  });\n}\nfunction formatTooltipArrayValue(value, series, dataIndex, tooltipDims, colorStr) {\n  // check: category-no-encode-has-axis-data in dataset.html\n  var data = series.getData();\n  var isValueMultipleLine = reduce(value, function (isValueMultipleLine, val, idx) {\n    var dimItem = data.getDimensionInfo(idx);\n    return isValueMultipleLine = isValueMultipleLine || dimItem && dimItem.tooltip !== false && dimItem.displayName != null;\n  }, false);\n  var inlineValues = [];\n  var inlineValueTypes = [];\n  var blocks = [];\n  tooltipDims.length ? each(tooltipDims, function (dim) {\n    setEachItem(retrieveRawValue(data, dataIndex, dim), dim);\n  })\n  // By default, all dims is used on tooltip.\n  : each(value, setEachItem);\n  function setEachItem(val, dim) {\n    var dimInfo = data.getDimensionInfo(dim);\n    // If `dimInfo.tooltip` is not set, show tooltip.\n    if (!dimInfo || dimInfo.otherDims.tooltip === false) {\n      return;\n    }\n    if (isValueMultipleLine) {\n      blocks.push(createTooltipMarkup('nameValue', {\n        markerType: 'subItem',\n        markerColor: colorStr,\n        name: dimInfo.displayName,\n        value: val,\n        valueType: dimInfo.type\n      }));\n    } else {\n      inlineValues.push(val);\n      inlineValueTypes.push(dimInfo.type);\n    }\n  }\n  return {\n    inlineValues: inlineValues,\n    inlineValueTypes: inlineValueTypes,\n    blocks: blocks\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport env from 'zrender/lib/core/env.js';\nimport * as modelUtil from '../util/model.js';\nimport ComponentModel from './Component.js';\nimport { PaletteMixin } from './mixin/palette.js';\nimport { DataFormatMixin } from '../model/mixin/dataFormat.js';\nimport { getLayoutParams, mergeLayoutParam, fetchLayoutMode } from '../util/layout.js';\nimport { createTask } from '../core/task.js';\nimport { mountExtend } from '../util/clazz.js';\nimport { SourceManager } from '../data/helper/sourceManager.js';\nimport { defaultSeriesFormatTooltip } from '../component/tooltip/seriesFormatTooltip.js';\nvar inner = modelUtil.makeInner();\nfunction getSelectionKey(data, dataIndex) {\n  return data.getName(dataIndex) || data.getId(dataIndex);\n}\nexport var SERIES_UNIVERSAL_TRANSITION_PROP = '__universalTransitionEnabled';\nvar SeriesModel = /** @class */function (_super) {\n  __extends(SeriesModel, _super);\n  function SeriesModel() {\n    // [Caution]: Because this class or desecendants can be used as `XXX.extend(subProto)`,\n    // the class members must not be initialized in constructor or declaration place.\n    // Otherwise there is bad case:\n    //   class A {xxx = 1;}\n    //   enableClassExtend(A);\n    //   class B extends A {}\n    //   var C = B.extend({xxx: 5});\n    //   var c = new C();\n    //   console.log(c.xxx); // expect 5 but always 1.\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    // ---------------------------------------\n    // Props about data selection\n    // ---------------------------------------\n    _this._selectedDataIndicesMap = {};\n    return _this;\n  }\n  SeriesModel.prototype.init = function (option, parentModel, ecModel) {\n    this.seriesIndex = this.componentIndex;\n    this.dataTask = createTask({\n      count: dataTaskCount,\n      reset: dataTaskReset\n    });\n    this.dataTask.context = {\n      model: this\n    };\n    this.mergeDefaultAndTheme(option, ecModel);\n    var sourceManager = inner(this).sourceManager = new SourceManager(this);\n    sourceManager.prepareSource();\n    var data = this.getInitialData(option, ecModel);\n    wrapData(data, this);\n    this.dataTask.context.data = data;\n    if (process.env.NODE_ENV !== 'production') {\n      zrUtil.assert(data, 'getInitialData returned invalid data.');\n    }\n    inner(this).dataBeforeProcessed = data;\n    // If we reverse the order (make data firstly, and then make\n    // dataBeforeProcessed by cloneShallow), cloneShallow will\n    // cause data.graph.data !== data when using\n    // module:echarts/data/Graph or module:echarts/data/Tree.\n    // See module:echarts/data/helper/linkSeriesData\n    // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model\n    // init or merge stage, because the data can be restored. So we do not `restoreData`\n    // and `setData` here, which forbids calling `seriesModel.getData()` in this stage.\n    // Call `seriesModel.getRawData()` instead.\n    // this.restoreData();\n    autoSeriesName(this);\n    this._initSelectedMapFromData(data);\n  };\n  /**\n   * Util for merge default and theme to option\n   */\n  SeriesModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n    var layoutMode = fetchLayoutMode(this);\n    var inputPositionParams = layoutMode ? getLayoutParams(option) : {};\n    // Backward compat: using subType on theme.\n    // But if name duplicate between series subType\n    // (for example: parallel) add component mainType,\n    // add suffix 'Series'.\n    var themeSubType = this.subType;\n    if (ComponentModel.hasClass(themeSubType)) {\n      themeSubType += 'Series';\n    }\n    zrUtil.merge(option, ecModel.getTheme().get(this.subType));\n    zrUtil.merge(option, this.getDefaultOption());\n    // Default label emphasis `show`\n    modelUtil.defaultEmphasis(option, 'label', ['show']);\n    this.fillDataTextStyle(option.data);\n    if (layoutMode) {\n      mergeLayoutParam(option, inputPositionParams, layoutMode);\n    }\n  };\n  SeriesModel.prototype.mergeOption = function (newSeriesOption, ecModel) {\n    // this.settingTask.dirty();\n    newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true);\n    this.fillDataTextStyle(newSeriesOption.data);\n    var layoutMode = fetchLayoutMode(this);\n    if (layoutMode) {\n      mergeLayoutParam(this.option, newSeriesOption, layoutMode);\n    }\n    var sourceManager = inner(this).sourceManager;\n    sourceManager.dirty();\n    sourceManager.prepareSource();\n    var data = this.getInitialData(newSeriesOption, ecModel);\n    wrapData(data, this);\n    this.dataTask.dirty();\n    this.dataTask.context.data = data;\n    inner(this).dataBeforeProcessed = data;\n    autoSeriesName(this);\n    this._initSelectedMapFromData(data);\n  };\n  SeriesModel.prototype.fillDataTextStyle = function (data) {\n    // Default data label emphasis `show`\n    // FIXME Tree structure data ?\n    // FIXME Performance ?\n    if (data && !zrUtil.isTypedArray(data)) {\n      var props = ['show'];\n      for (var i = 0; i < data.length; i++) {\n        if (data[i] && data[i].label) {\n          modelUtil.defaultEmphasis(data[i], 'label', props);\n        }\n      }\n    }\n  };\n  /**\n   * Init a data structure from data related option in series\n   * Must be overridden.\n   */\n  SeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return;\n  };\n  /**\n   * Append data to list\n   */\n  SeriesModel.prototype.appendData = function (params) {\n    // FIXME ???\n    // (1) If data from dataset, forbidden append.\n    // (2) support append data of dataset.\n    var data = this.getRawData();\n    data.appendData(params.data);\n  };\n  /**\n   * Consider some method like `filter`, `map` need make new data,\n   * We should make sure that `seriesModel.getData()` get correct\n   * data in the stream procedure. So we fetch data from upstream\n   * each time `task.perform` called.\n   */\n  SeriesModel.prototype.getData = function (dataType) {\n    var task = getCurrentTask(this);\n    if (task) {\n      var data = task.context.data;\n      return dataType == null || !data.getLinkedData ? data : data.getLinkedData(dataType);\n    } else {\n      // When series is not alive (that may happen when click toolbox\n      // restore or setOption with not merge mode), series data may\n      // be still need to judge animation or something when graphic\n      // elements want to know whether fade out.\n      return inner(this).data;\n    }\n  };\n  SeriesModel.prototype.getAllData = function () {\n    var mainData = this.getData();\n    return mainData && mainData.getLinkedDataAll ? mainData.getLinkedDataAll() : [{\n      data: mainData\n    }];\n  };\n  SeriesModel.prototype.setData = function (data) {\n    var task = getCurrentTask(this);\n    if (task) {\n      var context = task.context;\n      // Consider case: filter, data sample.\n      // FIXME:TS never used, so comment it\n      // if (context.data !== data && task.modifyOutputEnd) {\n      //     task.setOutputEnd(data.count());\n      // }\n      context.outputData = data;\n      // Caution: setData should update context.data,\n      // Because getData may be called multiply in a\n      // single stage and expect to get the data just\n      // set. (For example, AxisProxy, x y both call\n      // getData and setDate sequentially).\n      // So the context.data should be fetched from\n      // upstream each time when a stage starts to be\n      // performed.\n      if (task !== this.dataTask) {\n        context.data = data;\n      }\n    }\n    inner(this).data = data;\n  };\n  SeriesModel.prototype.getEncode = function () {\n    var encode = this.get('encode', true);\n    if (encode) {\n      return zrUtil.createHashMap(encode);\n    }\n  };\n  SeriesModel.prototype.getSourceManager = function () {\n    return inner(this).sourceManager;\n  };\n  SeriesModel.prototype.getSource = function () {\n    return this.getSourceManager().getSource();\n  };\n  /**\n   * Get data before processed\n   */\n  SeriesModel.prototype.getRawData = function () {\n    return inner(this).dataBeforeProcessed;\n  };\n  SeriesModel.prototype.getColorBy = function () {\n    var colorBy = this.get('colorBy');\n    return colorBy || 'series';\n  };\n  SeriesModel.prototype.isColorBySeries = function () {\n    return this.getColorBy() === 'series';\n  };\n  /**\n   * Get base axis if has coordinate system and has axis.\n   * By default use coordSys.getBaseAxis();\n   * Can be overridden for some chart.\n   * @return {type} description\n   */\n  SeriesModel.prototype.getBaseAxis = function () {\n    var coordSys = this.coordinateSystem;\n    // @ts-ignore\n    return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();\n  };\n  /**\n   * Retrieve the index of nearest value in the view coordinate.\n   * Data position is compared with each axis's dataToCoord.\n   *\n   * @param axisDim axis dimension\n   * @param dim data dimension\n   * @param value\n   * @param [maxDistance=Infinity] The maximum distance in view coordinate space\n   * @return If and only if multiple indices has\n   *         the same value, they are put to the result.\n   */\n  SeriesModel.prototype.indicesOfNearest = function (axisDim, dim, value, maxDistance) {\n    var data = this.getData();\n    var coordSys = this.coordinateSystem;\n    var axis = coordSys && coordSys.getAxis(axisDim);\n    if (!coordSys || !axis) {\n      return [];\n    }\n    var targetCoord = axis.dataToCoord(value);\n    if (maxDistance == null) {\n      maxDistance = Infinity;\n    }\n    var nearestIndices = [];\n    var minDist = Infinity;\n    var minDiff = -1;\n    var nearestIndicesLen = 0;\n    data.each(dim, function (dimValue, idx) {\n      var dataCoord = axis.dataToCoord(dimValue);\n      var diff = targetCoord - dataCoord;\n      var dist = Math.abs(diff);\n      if (dist <= maxDistance) {\n        // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`,\n        // we'd better not push both of them to `nearestIndices`, otherwise it is easy to\n        // get more than one item in `nearestIndices` (more specifically, in `tooltip`).\n        // So we choose the one that `diff >= 0` in this case.\n        // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them\n        // should be push to `nearestIndices`.\n        if (dist < minDist || dist === minDist && diff >= 0 && minDiff < 0) {\n          minDist = dist;\n          minDiff = diff;\n          nearestIndicesLen = 0;\n        }\n        if (diff === minDiff) {\n          nearestIndices[nearestIndicesLen++] = idx;\n        }\n      }\n    });\n    nearestIndices.length = nearestIndicesLen;\n    return nearestIndices;\n  };\n  /**\n   * Default tooltip formatter\n   *\n   * @param dataIndex\n   * @param multipleSeries\n   * @param dataType\n   * @param renderMode valid values: 'html'(by default) and 'richText'.\n   *        'html' is used for rendering tooltip in extra DOM form, and the result\n   *        string is used as DOM HTML content.\n   *        'richText' is used for rendering tooltip in rich text form, for those where\n   *        DOM operation is not supported.\n   * @return formatted tooltip with `html` and `markers`\n   *        Notice: The override method can also return string\n   */\n  SeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    return defaultSeriesFormatTooltip({\n      series: this,\n      dataIndex: dataIndex,\n      multipleSeries: multipleSeries\n    });\n  };\n  SeriesModel.prototype.isAnimationEnabled = function () {\n    var ecModel = this.ecModel;\n    // Disable animation if using echarts in node but not give ssr flag.\n    // In ssr mode, renderToString will generate svg with css animation.\n    if (env.node && !(ecModel && ecModel.ssr)) {\n      return false;\n    }\n    var animationEnabled = this.getShallow('animation');\n    if (animationEnabled) {\n      if (this.getData().count() > this.getShallow('animationThreshold')) {\n        animationEnabled = false;\n      }\n    }\n    return !!animationEnabled;\n  };\n  SeriesModel.prototype.restoreData = function () {\n    this.dataTask.dirty();\n  };\n  SeriesModel.prototype.getColorFromPalette = function (name, scope, requestColorNum) {\n    var ecModel = this.ecModel;\n    // PENDING\n    var color = PaletteMixin.prototype.getColorFromPalette.call(this, name, scope, requestColorNum);\n    if (!color) {\n      color = ecModel.getColorFromPalette(name, scope, requestColorNum);\n    }\n    return color;\n  };\n  /**\n   * Use `data.mapDimensionsAll(coordDim)` instead.\n   * @deprecated\n   */\n  SeriesModel.prototype.coordDimToDataDim = function (coordDim) {\n    return this.getRawData().mapDimensionsAll(coordDim);\n  };\n  /**\n   * Get progressive rendering count each step\n   */\n  SeriesModel.prototype.getProgressive = function () {\n    return this.get('progressive');\n  };\n  /**\n   * Get progressive rendering count each step\n   */\n  SeriesModel.prototype.getProgressiveThreshold = function () {\n    return this.get('progressiveThreshold');\n  };\n  // PENGING If selectedMode is null ?\n  SeriesModel.prototype.select = function (innerDataIndices, dataType) {\n    this._innerSelect(this.getData(dataType), innerDataIndices);\n  };\n  SeriesModel.prototype.unselect = function (innerDataIndices, dataType) {\n    var selectedMap = this.option.selectedMap;\n    if (!selectedMap) {\n      return;\n    }\n    var selectedMode = this.option.selectedMode;\n    var data = this.getData(dataType);\n    if (selectedMode === 'series' || selectedMap === 'all') {\n      this.option.selectedMap = {};\n      this._selectedDataIndicesMap = {};\n      return;\n    }\n    for (var i = 0; i < innerDataIndices.length; i++) {\n      var dataIndex = innerDataIndices[i];\n      var nameOrId = getSelectionKey(data, dataIndex);\n      selectedMap[nameOrId] = false;\n      this._selectedDataIndicesMap[nameOrId] = -1;\n    }\n  };\n  SeriesModel.prototype.toggleSelect = function (innerDataIndices, dataType) {\n    var tmpArr = [];\n    for (var i = 0; i < innerDataIndices.length; i++) {\n      tmpArr[0] = innerDataIndices[i];\n      this.isSelected(innerDataIndices[i], dataType) ? this.unselect(tmpArr, dataType) : this.select(tmpArr, dataType);\n    }\n  };\n  SeriesModel.prototype.getSelectedDataIndices = function () {\n    if (this.option.selectedMap === 'all') {\n      return [].slice.call(this.getData().getIndices());\n    }\n    var selectedDataIndicesMap = this._selectedDataIndicesMap;\n    var nameOrIds = zrUtil.keys(selectedDataIndicesMap);\n    var dataIndices = [];\n    for (var i = 0; i < nameOrIds.length; i++) {\n      var dataIndex = selectedDataIndicesMap[nameOrIds[i]];\n      if (dataIndex >= 0) {\n        dataIndices.push(dataIndex);\n      }\n    }\n    return dataIndices;\n  };\n  SeriesModel.prototype.isSelected = function (dataIndex, dataType) {\n    var selectedMap = this.option.selectedMap;\n    if (!selectedMap) {\n      return false;\n    }\n    var data = this.getData(dataType);\n    return (selectedMap === 'all' || selectedMap[getSelectionKey(data, dataIndex)]) && !data.getItemModel(dataIndex).get(['select', 'disabled']);\n  };\n  SeriesModel.prototype.isUniversalTransitionEnabled = function () {\n    if (this[SERIES_UNIVERSAL_TRANSITION_PROP]) {\n      return true;\n    }\n    var universalTransitionOpt = this.option.universalTransition;\n    // Quick reject\n    if (!universalTransitionOpt) {\n      return false;\n    }\n    if (universalTransitionOpt === true) {\n      return true;\n    }\n    // Can be simply 'universalTransition: true'\n    return universalTransitionOpt && universalTransitionOpt.enabled;\n  };\n  SeriesModel.prototype._innerSelect = function (data, innerDataIndices) {\n    var _a, _b;\n    var option = this.option;\n    var selectedMode = option.selectedMode;\n    var len = innerDataIndices.length;\n    if (!selectedMode || !len) {\n      return;\n    }\n    if (selectedMode === 'series') {\n      option.selectedMap = 'all';\n    } else if (selectedMode === 'multiple') {\n      if (!zrUtil.isObject(option.selectedMap)) {\n        option.selectedMap = {};\n      }\n      var selectedMap = option.selectedMap;\n      for (var i = 0; i < len; i++) {\n        var dataIndex = innerDataIndices[i];\n        // TODO different types of data share same object.\n        var nameOrId = getSelectionKey(data, dataIndex);\n        selectedMap[nameOrId] = true;\n        this._selectedDataIndicesMap[nameOrId] = data.getRawIndex(dataIndex);\n      }\n    } else if (selectedMode === 'single' || selectedMode === true) {\n      var lastDataIndex = innerDataIndices[len - 1];\n      var nameOrId = getSelectionKey(data, lastDataIndex);\n      option.selectedMap = (_a = {}, _a[nameOrId] = true, _a);\n      this._selectedDataIndicesMap = (_b = {}, _b[nameOrId] = data.getRawIndex(lastDataIndex), _b);\n    }\n  };\n  SeriesModel.prototype._initSelectedMapFromData = function (data) {\n    // Ignore select info in data if selectedMap exists.\n    // NOTE It's only for legacy usage. edge data is not supported.\n    if (this.option.selectedMap) {\n      return;\n    }\n    var dataIndices = [];\n    if (data.hasItemOption) {\n      data.each(function (idx) {\n        var rawItem = data.getRawDataItem(idx);\n        if (rawItem && rawItem.selected) {\n          dataIndices.push(idx);\n        }\n      });\n    }\n    if (dataIndices.length > 0) {\n      this._innerSelect(data, dataIndices);\n    }\n  };\n  // /**\n  //  * @see {module:echarts/stream/Scheduler}\n  //  */\n  // abstract pipeTask: null\n  SeriesModel.registerClass = function (clz) {\n    return ComponentModel.registerClass(clz);\n  };\n  SeriesModel.protoInitialize = function () {\n    var proto = SeriesModel.prototype;\n    proto.type = 'series.__base__';\n    proto.seriesIndex = 0;\n    proto.ignoreStyleOnData = false;\n    proto.hasSymbolVisual = false;\n    proto.defaultSymbol = 'circle';\n    // Make sure the values can be accessed!\n    proto.visualStyleAccessPath = 'itemStyle';\n    proto.visualDrawType = 'fill';\n  }();\n  return SeriesModel;\n}(ComponentModel);\nzrUtil.mixin(SeriesModel, DataFormatMixin);\nzrUtil.mixin(SeriesModel, PaletteMixin);\nmountExtend(SeriesModel, ComponentModel);\n/**\n * MUST be called after `prepareSource` called\n * Here we need to make auto series, especially for auto legend. But we\n * do not modify series.name in option to avoid side effects.\n */\nfunction autoSeriesName(seriesModel) {\n  // User specified name has higher priority, otherwise it may cause\n  // series can not be queried unexpectedly.\n  var name = seriesModel.name;\n  if (!modelUtil.isNameSpecified(seriesModel)) {\n    seriesModel.name = getSeriesAutoName(seriesModel) || name;\n  }\n}\nfunction getSeriesAutoName(seriesModel) {\n  var data = seriesModel.getRawData();\n  var dataDims = data.mapDimensionsAll('seriesName');\n  var nameArr = [];\n  zrUtil.each(dataDims, function (dataDim) {\n    var dimInfo = data.getDimensionInfo(dataDim);\n    dimInfo.displayName && nameArr.push(dimInfo.displayName);\n  });\n  return nameArr.join(' ');\n}\nfunction dataTaskCount(context) {\n  return context.model.getRawData().count();\n}\nfunction dataTaskReset(context) {\n  var seriesModel = context.model;\n  seriesModel.setData(seriesModel.getRawData().cloneShallow());\n  return dataTaskProgress;\n}\nfunction dataTaskProgress(param, context) {\n  // Avoid repeat cloneShallow when data just created in reset.\n  if (context.outputData && param.end > context.outputData.count()) {\n    context.model.getRawData().cloneShallow(context.outputData);\n  }\n}\n// TODO refactor\nfunction wrapData(data, seriesModel) {\n  zrUtil.each(zrUtil.concatArray(data.CHANGABLE_METHODS, data.DOWNSAMPLE_METHODS), function (methodName) {\n    data.wrapMethod(methodName, zrUtil.curry(onDataChange, seriesModel));\n  });\n}\nfunction onDataChange(seriesModel, newList) {\n  var task = getCurrentTask(seriesModel);\n  if (task) {\n    // Consider case: filter, selectRange\n    task.setOutputEnd((newList || this).count());\n  }\n  return newList;\n}\nfunction getCurrentTask(seriesModel) {\n  var scheduler = (seriesModel.ecModel || {}).scheduler;\n  var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid);\n  if (pipeline) {\n    // When pipline finished, the currrentTask keep the last\n    // task (renderTask).\n    var task = pipeline.currentTask;\n    if (task) {\n      var agentStubMap = task.agentStubMap;\n      if (agentStubMap) {\n        task = agentStubMap.get(seriesModel.uid);\n      }\n    }\n    return task;\n  }\n}\nexport default SeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport Group from 'zrender/lib/graphic/Group.js';\nimport * as componentUtil from '../util/component.js';\nimport * as clazzUtil from '../util/clazz.js';\nvar ComponentView = /** @class */function () {\n  function ComponentView() {\n    this.group = new Group();\n    this.uid = componentUtil.getUID('viewComponent');\n  }\n  ComponentView.prototype.init = function (ecModel, api) {};\n  ComponentView.prototype.render = function (model, ecModel, api, payload) {};\n  ComponentView.prototype.dispose = function (ecModel, api) {};\n  ComponentView.prototype.updateView = function (model, ecModel, api, payload) {\n    // Do nothing;\n  };\n  ComponentView.prototype.updateLayout = function (model, ecModel, api, payload) {\n    // Do nothing;\n  };\n  ComponentView.prototype.updateVisual = function (model, ecModel, api, payload) {\n    // Do nothing;\n  };\n  /**\n   * Hook for toggle blur target series.\n   * Can be used in marker for blur or leave blur the markers\n   */\n  ComponentView.prototype.toggleBlurSeries = function (seriesModels, isBlur, ecModel) {\n    // Do nothing;\n  };\n  /**\n   * Traverse the new rendered elements.\n   *\n   * It will traverse the new added element in progressive rendering.\n   * And traverse all in normal rendering.\n   */\n  ComponentView.prototype.eachRendered = function (cb) {\n    var group = this.group;\n    if (group) {\n      group.traverse(cb);\n    }\n  };\n  return ComponentView;\n}();\n;\nclazzUtil.enableClassExtend(ComponentView);\nclazzUtil.enableClassManagement(ComponentView);\nexport default ComponentView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner } from '../../util/model.js';\n/**\n * @return {string} If large mode changed, return string 'reset';\n */\nexport default function createRenderPlanner() {\n  var inner = makeInner();\n  return function (seriesModel) {\n    var fields = inner(seriesModel);\n    var pipelineContext = seriesModel.pipelineContext;\n    var originalLarge = !!fields.large;\n    var originalProgressive = !!fields.progressiveRender;\n    // FIXME: if the planner works on a filtered series, `pipelineContext` does not\n    // exists. See #11611 . Probably we need to modify this structure, see the comment\n    // on `performRawSeries` in `Schedular.js`.\n    var large = fields.large = !!(pipelineContext && pipelineContext.large);\n    var progressive = fields.progressiveRender = !!(pipelineContext && pipelineContext.progressiveRender);\n    return !!(originalLarge !== large || originalProgressive !== progressive) && 'reset';\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each } from 'zrender/lib/core/util.js';\nimport Group from 'zrender/lib/graphic/Group.js';\nimport * as componentUtil from '../util/component.js';\nimport * as clazzUtil from '../util/clazz.js';\nimport * as modelUtil from '../util/model.js';\nimport { enterEmphasis, leaveEmphasis, getHighlightDigit, isHighDownDispatcher } from '../util/states.js';\nimport { createTask } from '../core/task.js';\nimport createRenderPlanner from '../chart/helper/createRenderPlanner.js';\nimport { traverseElements } from '../util/graphic.js';\nimport { error } from '../util/log.js';\nvar inner = modelUtil.makeInner();\nvar renderPlanner = createRenderPlanner();\nvar ChartView = /** @class */function () {\n  function ChartView() {\n    this.group = new Group();\n    this.uid = componentUtil.getUID('viewChart');\n    this.renderTask = createTask({\n      plan: renderTaskPlan,\n      reset: renderTaskReset\n    });\n    this.renderTask.context = {\n      view: this\n    };\n  }\n  ChartView.prototype.init = function (ecModel, api) {};\n  ChartView.prototype.render = function (seriesModel, ecModel, api, payload) {\n    if (process.env.NODE_ENV !== 'production') {\n      throw new Error('render method must been implemented');\n    }\n  };\n  /**\n   * Highlight series or specified data item.\n   */\n  ChartView.prototype.highlight = function (seriesModel, ecModel, api, payload) {\n    var data = seriesModel.getData(payload && payload.dataType);\n    if (!data) {\n      if (process.env.NODE_ENV !== 'production') {\n        error(\"Unknown dataType \" + payload.dataType);\n      }\n      return;\n    }\n    toggleHighlight(data, payload, 'emphasis');\n  };\n  /**\n   * Downplay series or specified data item.\n   */\n  ChartView.prototype.downplay = function (seriesModel, ecModel, api, payload) {\n    var data = seriesModel.getData(payload && payload.dataType);\n    if (!data) {\n      if (process.env.NODE_ENV !== 'production') {\n        error(\"Unknown dataType \" + payload.dataType);\n      }\n      return;\n    }\n    toggleHighlight(data, payload, 'normal');\n  };\n  /**\n   * Remove self.\n   */\n  ChartView.prototype.remove = function (ecModel, api) {\n    this.group.removeAll();\n  };\n  /**\n   * Dispose self.\n   */\n  ChartView.prototype.dispose = function (ecModel, api) {};\n  ChartView.prototype.updateView = function (seriesModel, ecModel, api, payload) {\n    this.render(seriesModel, ecModel, api, payload);\n  };\n  // FIXME never used?\n  ChartView.prototype.updateLayout = function (seriesModel, ecModel, api, payload) {\n    this.render(seriesModel, ecModel, api, payload);\n  };\n  // FIXME never used?\n  ChartView.prototype.updateVisual = function (seriesModel, ecModel, api, payload) {\n    this.render(seriesModel, ecModel, api, payload);\n  };\n  /**\n   * Traverse the new rendered elements.\n   *\n   * It will traverse the new added element in progressive rendering.\n   * And traverse all in normal rendering.\n   */\n  ChartView.prototype.eachRendered = function (cb) {\n    traverseElements(this.group, cb);\n  };\n  ChartView.markUpdateMethod = function (payload, methodName) {\n    inner(payload).updateMethod = methodName;\n  };\n  ChartView.protoInitialize = function () {\n    var proto = ChartView.prototype;\n    proto.type = 'chart';\n  }();\n  return ChartView;\n}();\n;\n/**\n * Set state of single element\n */\nfunction elSetState(el, state, highlightDigit) {\n  if (el && isHighDownDispatcher(el)) {\n    (state === 'emphasis' ? enterEmphasis : leaveEmphasis)(el, highlightDigit);\n  }\n}\nfunction toggleHighlight(data, payload, state) {\n  var dataIndex = modelUtil.queryDataIndex(data, payload);\n  var highlightDigit = payload && payload.highlightKey != null ? getHighlightDigit(payload.highlightKey) : null;\n  if (dataIndex != null) {\n    each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {\n      elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit);\n    });\n  } else {\n    data.eachItemGraphicEl(function (el) {\n      elSetState(el, state, highlightDigit);\n    });\n  }\n}\nclazzUtil.enableClassExtend(ChartView, ['dispose']);\nclazzUtil.enableClassManagement(ChartView);\nfunction renderTaskPlan(context) {\n  return renderPlanner(context.model);\n}\nfunction renderTaskReset(context) {\n  var seriesModel = context.model;\n  var ecModel = context.ecModel;\n  var api = context.api;\n  var payload = context.payload;\n  // FIXME: remove updateView updateVisual\n  var progressiveRender = seriesModel.pipelineContext.progressiveRender;\n  var view = context.view;\n  var updateMethod = payload && inner(payload).updateMethod;\n  var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod\n  // `appendData` is also supported when data amount\n  // is less than progressive threshold.\n  : 'render';\n  if (methodName !== 'render') {\n    view[methodName](seriesModel, ecModel, api, payload);\n  }\n  return progressMethodMap[methodName];\n}\nvar progressMethodMap = {\n  incrementalPrepareRender: {\n    progress: function (params, context) {\n      context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload);\n    }\n  },\n  render: {\n    // Put view.render in `progress` to support appendData. But in this case\n    // view.render should not be called in reset, otherwise it will be called\n    // twise. Use `forceFirstProgress` to make sure that view.render is called\n    // in any cases.\n    forceFirstProgress: true,\n    progress: function (params, context) {\n      context.view.render(context.model, context.ecModel, context.api, context.payload);\n    }\n  }\n};\nexport default ChartView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar ORIGIN_METHOD = '\\0__throttleOriginMethod';\nvar RATE = '\\0__throttleRate';\nvar THROTTLE_TYPE = '\\0__throttleType';\n;\n/**\n * @public\n * @param {(Function)} fn\n * @param {number} [delay=0] Unit: ms.\n * @param {boolean} [debounce=false]\n *        true: If call interval less than `delay`, only the last call works.\n *        false: If call interval less than `delay, call works on fixed rate.\n * @return {(Function)} throttled fn.\n */\nexport function throttle(fn, delay, debounce) {\n  var currCall;\n  var lastCall = 0;\n  var lastExec = 0;\n  var timer = null;\n  var diff;\n  var scope;\n  var args;\n  var debounceNextCall;\n  delay = delay || 0;\n  function exec() {\n    lastExec = new Date().getTime();\n    timer = null;\n    fn.apply(scope, args || []);\n  }\n  var cb = function () {\n    var cbArgs = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      cbArgs[_i] = arguments[_i];\n    }\n    currCall = new Date().getTime();\n    scope = this;\n    args = cbArgs;\n    var thisDelay = debounceNextCall || delay;\n    var thisDebounce = debounceNextCall || debounce;\n    debounceNextCall = null;\n    diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay;\n    clearTimeout(timer);\n    // Here we should make sure that: the `exec` SHOULD NOT be called later\n    // than a new call of `cb`, that is, preserving the command order. Consider\n    // calculating \"scale rate\" when roaming as an example. When a call of `cb`\n    // happens, either the `exec` is called dierectly, or the call is delayed.\n    // But the delayed call should never be later than next call of `cb`. Under\n    // this assurance, we can simply update view state each time `dispatchAction`\n    // triggered by user roaming, but not need to add extra code to avoid the\n    // state being \"rolled-back\".\n    if (thisDebounce) {\n      timer = setTimeout(exec, thisDelay);\n    } else {\n      if (diff >= 0) {\n        exec();\n      } else {\n        timer = setTimeout(exec, -diff);\n      }\n    }\n    lastCall = currCall;\n  };\n  /**\n   * Clear throttle.\n   * @public\n   */\n  cb.clear = function () {\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n  };\n  /**\n   * Enable debounce once.\n   */\n  cb.debounceNextCall = function (debounceDelay) {\n    debounceNextCall = debounceDelay;\n  };\n  return cb;\n}\n/**\n * Create throttle method or update throttle rate.\n *\n * @example\n * ComponentView.prototype.render = function () {\n *     ...\n *     throttle.createOrUpdate(\n *         this,\n *         '_dispatchAction',\n *         this.model.get('throttle'),\n *         'fixRate'\n *     );\n * };\n * ComponentView.prototype.remove = function () {\n *     throttle.clear(this, '_dispatchAction');\n * };\n * ComponentView.prototype.dispose = function () {\n *     throttle.clear(this, '_dispatchAction');\n * };\n *\n */\nexport function createOrUpdate(obj, fnAttr, rate, throttleType) {\n  var fn = obj[fnAttr];\n  if (!fn) {\n    return;\n  }\n  var originFn = fn[ORIGIN_METHOD] || fn;\n  var lastThrottleType = fn[THROTTLE_TYPE];\n  var lastRate = fn[RATE];\n  if (lastRate !== rate || lastThrottleType !== throttleType) {\n    if (rate == null || !throttleType) {\n      return obj[fnAttr] = originFn;\n    }\n    fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce');\n    fn[ORIGIN_METHOD] = originFn;\n    fn[THROTTLE_TYPE] = throttleType;\n    fn[RATE] = rate;\n  }\n  return fn;\n}\n/**\n * Clear throttle. Example see throttle.createOrUpdate.\n */\nexport function clear(obj, fnAttr) {\n  var fn = obj[fnAttr];\n  if (fn && fn[ORIGIN_METHOD]) {\n    // Clear throttle\n    fn.clear && fn.clear();\n    obj[fnAttr] = fn[ORIGIN_METHOD];\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isFunction, extend, createHashMap } from 'zrender/lib/core/util.js';\nimport makeStyleMapper from '../model/mixin/makeStyleMapper.js';\nimport { ITEM_STYLE_KEY_MAP } from '../model/mixin/itemStyle.js';\nimport { LINE_STYLE_KEY_MAP } from '../model/mixin/lineStyle.js';\nimport Model from '../model/Model.js';\nimport { makeInner } from '../util/model.js';\nvar inner = makeInner();\nvar defaultStyleMappers = {\n  itemStyle: makeStyleMapper(ITEM_STYLE_KEY_MAP, true),\n  lineStyle: makeStyleMapper(LINE_STYLE_KEY_MAP, true)\n};\nvar defaultColorKey = {\n  lineStyle: 'stroke',\n  itemStyle: 'fill'\n};\nfunction getStyleMapper(seriesModel, stylePath) {\n  var styleMapper = seriesModel.visualStyleMapper || defaultStyleMappers[stylePath];\n  if (!styleMapper) {\n    console.warn(\"Unknown style type '\" + stylePath + \"'.\");\n    return defaultStyleMappers.itemStyle;\n  }\n  return styleMapper;\n}\nfunction getDefaultColorKey(seriesModel, stylePath) {\n  // return defaultColorKey[stylePath] ||\n  var colorKey = seriesModel.visualDrawType || defaultColorKey[stylePath];\n  if (!colorKey) {\n    console.warn(\"Unknown style type '\" + stylePath + \"'.\");\n    return 'fill';\n  }\n  return colorKey;\n}\nvar seriesStyleTask = {\n  createOnAllSeries: true,\n  performRawSeries: true,\n  reset: function (seriesModel, ecModel) {\n    var data = seriesModel.getData();\n    var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle';\n    // Set in itemStyle\n    var styleModel = seriesModel.getModel(stylePath);\n    var getStyle = getStyleMapper(seriesModel, stylePath);\n    var globalStyle = getStyle(styleModel);\n    var decalOption = styleModel.getShallow('decal');\n    if (decalOption) {\n      data.setVisual('decal', decalOption);\n      decalOption.dirty = true;\n    }\n    // TODO\n    var colorKey = getDefaultColorKey(seriesModel, stylePath);\n    var color = globalStyle[colorKey];\n    // TODO style callback\n    var colorCallback = isFunction(color) ? color : null;\n    var hasAutoColor = globalStyle.fill === 'auto' || globalStyle.stroke === 'auto';\n    // Get from color palette by default.\n    if (!globalStyle[colorKey] || colorCallback || hasAutoColor) {\n      // Note: If some series has color specified (e.g., by itemStyle.color), we DO NOT\n      // make it effect palette. Because some scenarios users need to make some series\n      // transparent or as background, which should better not effect the palette.\n      var colorPalette = seriesModel.getColorFromPalette(\n      // TODO series count changed.\n      seriesModel.name, null, ecModel.getSeriesCount());\n      if (!globalStyle[colorKey]) {\n        globalStyle[colorKey] = colorPalette;\n        data.setVisual('colorFromPalette', true);\n      }\n      globalStyle.fill = globalStyle.fill === 'auto' || isFunction(globalStyle.fill) ? colorPalette : globalStyle.fill;\n      globalStyle.stroke = globalStyle.stroke === 'auto' || isFunction(globalStyle.stroke) ? colorPalette : globalStyle.stroke;\n    }\n    data.setVisual('style', globalStyle);\n    data.setVisual('drawType', colorKey);\n    // Only visible series has each data be visual encoded\n    if (!ecModel.isSeriesFiltered(seriesModel) && colorCallback) {\n      data.setVisual('colorFromPalette', false);\n      return {\n        dataEach: function (data, idx) {\n          var dataParams = seriesModel.getDataParams(idx);\n          var itemStyle = extend({}, globalStyle);\n          itemStyle[colorKey] = colorCallback(dataParams);\n          data.setItemVisual(idx, 'style', itemStyle);\n        }\n      };\n    }\n  }\n};\nvar sharedModel = new Model();\nvar dataStyleTask = {\n  createOnAllSeries: true,\n  performRawSeries: true,\n  reset: function (seriesModel, ecModel) {\n    if (seriesModel.ignoreStyleOnData || ecModel.isSeriesFiltered(seriesModel)) {\n      return;\n    }\n    var data = seriesModel.getData();\n    var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle';\n    // Set in itemStyle\n    var getStyle = getStyleMapper(seriesModel, stylePath);\n    var colorKey = data.getVisual('drawType');\n    return {\n      dataEach: data.hasItemOption ? function (data, idx) {\n        // Not use getItemModel for performance considuration\n        var rawItem = data.getRawDataItem(idx);\n        if (rawItem && rawItem[stylePath]) {\n          sharedModel.option = rawItem[stylePath];\n          var style = getStyle(sharedModel);\n          var existsStyle = data.ensureUniqueItemVisual(idx, 'style');\n          extend(existsStyle, style);\n          if (sharedModel.option.decal) {\n            data.setItemVisual(idx, 'decal', sharedModel.option.decal);\n            sharedModel.option.decal.dirty = true;\n          }\n          if (colorKey in style) {\n            data.setItemVisual(idx, 'colorFromPalette', false);\n          }\n        }\n      } : null\n    };\n  }\n};\n// Pick color from palette for the data which has not been set with color yet.\n// Note: do not support stream rendering. No such cases yet.\nvar dataColorPaletteTask = {\n  performRawSeries: true,\n  overallReset: function (ecModel) {\n    // Each type of series uses one scope.\n    // Pie and funnel are using different scopes.\n    var paletteScopeGroupByType = createHashMap();\n    ecModel.eachSeries(function (seriesModel) {\n      var colorBy = seriesModel.getColorBy();\n      if (seriesModel.isColorBySeries()) {\n        return;\n      }\n      var key = seriesModel.type + '-' + colorBy;\n      var colorScope = paletteScopeGroupByType.get(key);\n      if (!colorScope) {\n        colorScope = {};\n        paletteScopeGroupByType.set(key, colorScope);\n      }\n      inner(seriesModel).scope = colorScope;\n    });\n    ecModel.eachSeries(function (seriesModel) {\n      if (seriesModel.isColorBySeries() || ecModel.isSeriesFiltered(seriesModel)) {\n        return;\n      }\n      var dataAll = seriesModel.getRawData();\n      var idxMap = {};\n      var data = seriesModel.getData();\n      var colorScope = inner(seriesModel).scope;\n      var stylePath = seriesModel.visualStyleAccessPath || 'itemStyle';\n      var colorKey = getDefaultColorKey(seriesModel, stylePath);\n      data.each(function (idx) {\n        var rawIdx = data.getRawIndex(idx);\n        idxMap[rawIdx] = idx;\n      });\n      // Iterate on data before filtered. To make sure color from palette can be\n      // Consistent when toggling legend.\n      dataAll.each(function (rawIdx) {\n        var idx = idxMap[rawIdx];\n        var fromPalette = data.getItemVisual(idx, 'colorFromPalette');\n        // Get color from palette for each data only when the color is inherited from series color, which is\n        // also picked from color palette. So following situation is not in the case:\n        // 1. series.itemStyle.color is set\n        // 2. color is encoded by visualMap\n        if (fromPalette) {\n          var itemStyle = data.ensureUniqueItemVisual(idx, 'style');\n          var name_1 = dataAll.getName(rawIdx) || rawIdx + '';\n          var dataCount = dataAll.count();\n          itemStyle[colorKey] = seriesModel.getColorFromPalette(name_1, colorScope, dataCount);\n        }\n      });\n    });\n  }\n};\nexport { seriesStyleTask, dataStyleTask, dataColorPaletteTask };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../util/graphic.js';\nimport tokens from '../visual/tokens.js';\nvar PI = Math.PI;\n/**\n * @param {module:echarts/ExtensionAPI} api\n * @param {Object} [opts]\n * @param {string} [opts.text]\n * @param {string} [opts.color]\n * @param {string} [opts.textColor]\n * @return {module:zrender/Element}\n */\nexport default function defaultLoading(api, opts) {\n  opts = opts || {};\n  zrUtil.defaults(opts, {\n    text: 'loading',\n    textColor: tokens.color.primary,\n    fontSize: 12,\n    fontWeight: 'normal',\n    fontStyle: 'normal',\n    fontFamily: 'sans-serif',\n    maskColor: 'rgba(255,255,255,0.8)',\n    showSpinner: true,\n    color: tokens.color.theme[0],\n    spinnerRadius: 10,\n    lineWidth: 5,\n    zlevel: 0\n  });\n  var group = new graphic.Group();\n  var mask = new graphic.Rect({\n    style: {\n      fill: opts.maskColor\n    },\n    zlevel: opts.zlevel,\n    z: 10000\n  });\n  group.add(mask);\n  var textContent = new graphic.Text({\n    style: {\n      text: opts.text,\n      fill: opts.textColor,\n      fontSize: opts.fontSize,\n      fontWeight: opts.fontWeight,\n      fontStyle: opts.fontStyle,\n      fontFamily: opts.fontFamily\n    },\n    zlevel: opts.zlevel,\n    z: 10001\n  });\n  var labelRect = new graphic.Rect({\n    style: {\n      fill: 'none'\n    },\n    textContent: textContent,\n    textConfig: {\n      position: 'right',\n      distance: 10\n    },\n    zlevel: opts.zlevel,\n    z: 10001\n  });\n  group.add(labelRect);\n  var arc;\n  if (opts.showSpinner) {\n    arc = new graphic.Arc({\n      shape: {\n        startAngle: -PI / 2,\n        endAngle: -PI / 2 + 0.1,\n        r: opts.spinnerRadius\n      },\n      style: {\n        stroke: opts.color,\n        lineCap: 'round',\n        lineWidth: opts.lineWidth\n      },\n      zlevel: opts.zlevel,\n      z: 10001\n    });\n    arc.animateShape(true).when(1000, {\n      endAngle: PI * 3 / 2\n    }).start('circularInOut');\n    arc.animateShape(true).when(1000, {\n      startAngle: PI * 3 / 2\n    }).delay(300).start('circularInOut');\n    group.add(arc);\n  }\n  // Inject resize\n  group.resize = function () {\n    var textWidth = textContent.getBoundingRect().width;\n    var r = opts.showSpinner ? opts.spinnerRadius : 0;\n    // cx = (containerWidth - arcDiameter - textDistance - textWidth) / 2\n    // textDistance needs to be calculated when both animation and text exist\n    var cx = (api.getWidth() - r * 2 - (opts.showSpinner && textWidth ? 10 : 0) - textWidth) / 2 - (opts.showSpinner && textWidth ? 0 : 5 + textWidth / 2)\n    // only show the text\n    + (opts.showSpinner ? 0 : textWidth / 2)\n    // only show the spinner\n    + (textWidth ? 0 : r);\n    var cy = api.getHeight() / 2;\n    opts.showSpinner && arc.setShape({\n      cx: cx,\n      cy: cy\n    });\n    labelRect.setShape({\n      x: cx - r,\n      y: cy - r,\n      width: r * 2,\n      height: r * 2\n    });\n    mask.setShape({\n      x: 0,\n      y: 0,\n      width: api.getWidth(),\n      height: api.getHeight()\n    });\n  };\n  group.resize();\n  return group;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, map, isFunction, createHashMap, noop, assert } from 'zrender/lib/core/util.js';\nimport { createTask } from './task.js';\nimport { getUID } from '../util/component.js';\nimport GlobalModel from '../model/Global.js';\nimport ExtensionAPI from './ExtensionAPI.js';\nimport { normalizeToArray } from '../util/model.js';\n;\nvar Scheduler = /** @class */function () {\n  function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) {\n    // key: handlerUID\n    this._stageTaskMap = createHashMap();\n    this.ecInstance = ecInstance;\n    this.api = api;\n    // Fix current processors in case that in some rear cases that\n    // processors might be registered after echarts instance created.\n    // Register processors incrementally for a echarts instance is\n    // not supported by this stream architecture.\n    dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice();\n    visualHandlers = this._visualHandlers = visualHandlers.slice();\n    this._allHandlers = dataProcessorHandlers.concat(visualHandlers);\n  }\n  Scheduler.prototype.restoreData = function (ecModel, payload) {\n    // TODO: Only restore needed series and components, but not all components.\n    // Currently `restoreData` of all of the series and component will be called.\n    // But some independent components like `title`, `legend`, `graphic`, `toolbox`,\n    // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`,\n    // and some components like coordinate system, axes, dataZoom, visualMap only\n    // need their target series refresh.\n    // (1) If we are implementing this feature some day, we should consider these cases:\n    // if a data processor depends on a component (e.g., dataZoomProcessor depends\n    // on the settings of `dataZoom`), it should be re-performed if the component\n    // is modified by `setOption`.\n    // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`,\n    // it should be re-performed when the result array of `getTargetSeries` changed.\n    // We use `dependencies` to cover these issues.\n    // (3) How to update target series when coordinate system related components modified.\n    // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty,\n    // and this case all of the tasks will be set as dirty.\n    ecModel.restoreData(payload);\n    // Theoretically an overall task not only depends on each of its target series, but also\n    // depends on all of the series.\n    // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks\n    // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure\n    // that the overall task is set as dirty and to be performed, otherwise it probably cause\n    // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it\n    // probably cause state chaos (consider `dataZoomProcessor`).\n    this._stageTaskMap.each(function (taskRecord) {\n      var overallTask = taskRecord.overallTask;\n      overallTask && overallTask.dirty();\n    });\n  };\n  // If seriesModel provided, incremental threshold is check by series data.\n  Scheduler.prototype.getPerformArgs = function (task, isBlock) {\n    // For overall task\n    if (!task.__pipeline) {\n      return;\n    }\n    var pipeline = this._pipelineMap.get(task.__pipeline.id);\n    var pCtx = pipeline.context;\n    var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex;\n    var step = incremental ? pipeline.step : null;\n    var modDataCount = pCtx && pCtx.modDataCount;\n    var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null;\n    return {\n      step: step,\n      modBy: modBy,\n      modDataCount: modDataCount\n    };\n  };\n  Scheduler.prototype.getPipeline = function (pipelineId) {\n    return this._pipelineMap.get(pipelineId);\n  };\n  /**\n   * Current, progressive rendering starts from visual and layout.\n   * Always detect render mode in the same stage, avoiding that incorrect\n   * detection caused by data filtering.\n   * Caution:\n   * `updateStreamModes` use `seriesModel.getData()`.\n   */\n  Scheduler.prototype.updateStreamModes = function (seriesModel, view) {\n    var pipeline = this._pipelineMap.get(seriesModel.uid);\n    var data = seriesModel.getData();\n    var dataLen = data.count();\n    // `progressiveRender` means that can render progressively in each\n    // animation frame. Note that some types of series do not provide\n    // `view.incrementalPrepareRender` but support `chart.appendData`. We\n    // use the term `incremental` but not `progressive` to describe the\n    // case that `chart.appendData`.\n    var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold;\n    var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold');\n    // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint.\n    // see `test/candlestick-large3.html`\n    var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null;\n    seriesModel.pipelineContext = pipeline.context = {\n      progressiveRender: progressiveRender,\n      modDataCount: modDataCount,\n      large: large\n    };\n  };\n  Scheduler.prototype.restorePipelines = function (ecModel) {\n    var scheduler = this;\n    var pipelineMap = scheduler._pipelineMap = createHashMap();\n    ecModel.eachSeries(function (seriesModel) {\n      var progressive = seriesModel.getProgressive();\n      var pipelineId = seriesModel.uid;\n      pipelineMap.set(pipelineId, {\n        id: pipelineId,\n        head: null,\n        tail: null,\n        threshold: seriesModel.getProgressiveThreshold(),\n        progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()),\n        blockIndex: -1,\n        step: Math.round(progressive || 700),\n        count: 0\n      });\n      scheduler._pipe(seriesModel, seriesModel.dataTask);\n    });\n  };\n  Scheduler.prototype.prepareStageTasks = function () {\n    var stageTaskMap = this._stageTaskMap;\n    var ecModel = this.api.getModel();\n    var api = this.api;\n    each(this._allHandlers, function (handler) {\n      var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, {});\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        // Currently do not need to support to sepecify them both.\n        errMsg = '\"reset\" and \"overallReset\" must not be both specified.';\n      }\n      assert(!(handler.reset && handler.overallReset), errMsg);\n      handler.reset && this._createSeriesStageTask(handler, record, ecModel, api);\n      handler.overallReset && this._createOverallStageTask(handler, record, ecModel, api);\n    }, this);\n  };\n  Scheduler.prototype.prepareView = function (view, model, ecModel, api) {\n    var renderTask = view.renderTask;\n    var context = renderTask.context;\n    context.model = model;\n    context.ecModel = ecModel;\n    context.api = api;\n    renderTask.__block = !view.incrementalPrepareRender;\n    this._pipe(model, renderTask);\n  };\n  Scheduler.prototype.performDataProcessorTasks = function (ecModel, payload) {\n    // If we do not use `block` here, it should be considered when to update modes.\n    this._performStageTasks(this._dataProcessorHandlers, ecModel, payload, {\n      block: true\n    });\n  };\n  Scheduler.prototype.performVisualTasks = function (ecModel, payload, opt) {\n    this._performStageTasks(this._visualHandlers, ecModel, payload, opt);\n  };\n  Scheduler.prototype._performStageTasks = function (stageHandlers, ecModel, payload, opt) {\n    opt = opt || {};\n    var unfinished = false;\n    var scheduler = this;\n    each(stageHandlers, function (stageHandler, idx) {\n      if (opt.visualType && opt.visualType !== stageHandler.visualType) {\n        return;\n      }\n      var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid);\n      var seriesTaskMap = stageHandlerRecord.seriesTaskMap;\n      var overallTask = stageHandlerRecord.overallTask;\n      if (overallTask) {\n        var overallNeedDirty_1;\n        var agentStubMap = overallTask.agentStubMap;\n        agentStubMap.each(function (stub) {\n          if (needSetDirty(opt, stub)) {\n            stub.dirty();\n            overallNeedDirty_1 = true;\n          }\n        });\n        overallNeedDirty_1 && overallTask.dirty();\n        scheduler.updatePayload(overallTask, payload);\n        var performArgs_1 = scheduler.getPerformArgs(overallTask, opt.block);\n        // Execute stubs firstly, which may set the overall task dirty,\n        // then execute the overall task. And stub will call seriesModel.setData,\n        // which ensures that in the overallTask seriesModel.getData() will not\n        // return incorrect data.\n        agentStubMap.each(function (stub) {\n          stub.perform(performArgs_1);\n        });\n        if (overallTask.perform(performArgs_1)) {\n          unfinished = true;\n        }\n      } else if (seriesTaskMap) {\n        seriesTaskMap.each(function (task, pipelineId) {\n          if (needSetDirty(opt, task)) {\n            task.dirty();\n          }\n          var performArgs = scheduler.getPerformArgs(task, opt.block);\n          // FIXME\n          // if intending to declare `performRawSeries` in handlers, only\n          // stream-independent (specifically, data item independent) operations can be\n          // performed. Because if a series is filtered, most of the tasks will not\n          // be performed. A stream-dependent operation probably cause wrong biz logic.\n          // Perhaps we should not provide a separate callback for this case instead\n          // of providing the config `performRawSeries`. The stream-dependent operations\n          // and stream-independent operations should better not be mixed.\n          performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model);\n          scheduler.updatePayload(task, payload);\n          if (task.perform(performArgs)) {\n            unfinished = true;\n          }\n        });\n      }\n    });\n    function needSetDirty(opt, task) {\n      return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id));\n    }\n    this.unfinished = unfinished || this.unfinished;\n  };\n  Scheduler.prototype.performSeriesTasks = function (ecModel) {\n    var unfinished;\n    ecModel.eachSeries(function (seriesModel) {\n      // Progress to the end for dataInit and dataRestore.\n      unfinished = seriesModel.dataTask.perform() || unfinished;\n    });\n    this.unfinished = unfinished || this.unfinished;\n  };\n  Scheduler.prototype.plan = function () {\n    // Travel pipelines, check block.\n    this._pipelineMap.each(function (pipeline) {\n      var task = pipeline.tail;\n      do {\n        if (task.__block) {\n          pipeline.blockIndex = task.__idxInPipeline;\n          break;\n        }\n        task = task.getUpstream();\n      } while (task);\n    });\n  };\n  Scheduler.prototype.updatePayload = function (task, payload) {\n    payload !== 'remain' && (task.context.payload = payload);\n  };\n  Scheduler.prototype._createSeriesStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) {\n    var scheduler = this;\n    var oldSeriesTaskMap = stageHandlerRecord.seriesTaskMap;\n    // The count of stages are totally about only several dozen, so\n    // do not need to reuse the map.\n    var newSeriesTaskMap = stageHandlerRecord.seriesTaskMap = createHashMap();\n    var seriesType = stageHandler.seriesType;\n    var getTargetSeries = stageHandler.getTargetSeries;\n    // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily,\n    // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`,\n    // it works but it may cause other irrelevant charts blocked.\n    if (stageHandler.createOnAllSeries) {\n      ecModel.eachRawSeries(create);\n    } else if (seriesType) {\n      ecModel.eachRawSeriesByType(seriesType, create);\n    } else if (getTargetSeries) {\n      getTargetSeries(ecModel, api).each(create);\n    }\n    function create(seriesModel) {\n      var pipelineId = seriesModel.uid;\n      // Init tasks for each seriesModel only once.\n      // Reuse original task instance.\n      var task = newSeriesTaskMap.set(pipelineId, oldSeriesTaskMap && oldSeriesTaskMap.get(pipelineId) || createTask({\n        plan: seriesTaskPlan,\n        reset: seriesTaskReset,\n        count: seriesTaskCount\n      }));\n      task.context = {\n        model: seriesModel,\n        ecModel: ecModel,\n        api: api,\n        // PENDING: `useClearVisual` not used?\n        useClearVisual: stageHandler.isVisual && !stageHandler.isLayout,\n        plan: stageHandler.plan,\n        reset: stageHandler.reset,\n        scheduler: scheduler\n      };\n      scheduler._pipe(seriesModel, task);\n    }\n  };\n  Scheduler.prototype._createOverallStageTask = function (stageHandler, stageHandlerRecord, ecModel, api) {\n    var scheduler = this;\n    var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask\n    // For overall task, the function only be called on reset stage.\n    || createTask({\n      reset: overallTaskReset\n    });\n    overallTask.context = {\n      ecModel: ecModel,\n      api: api,\n      overallReset: stageHandler.overallReset,\n      scheduler: scheduler\n    };\n    var oldAgentStubMap = overallTask.agentStubMap;\n    // The count of stages are totally about only several dozen, so\n    // do not need to reuse the map.\n    var newAgentStubMap = overallTask.agentStubMap = createHashMap();\n    var seriesType = stageHandler.seriesType;\n    var getTargetSeries = stageHandler.getTargetSeries;\n    var overallProgress = true;\n    var shouldOverallTaskDirty = false;\n    // FIXME:TS never used, so comment it\n    // let modifyOutputEnd = stageHandler.modifyOutputEnd;\n    // An overall task with seriesType detected or has `getTargetSeries`, we add\n    // stub in each pipelines, it will set the overall task dirty when the pipeline\n    // progress. Moreover, to avoid call the overall task each frame (too frequent),\n    // we set the pipeline block.\n    var errMsg = '';\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = '\"createOnAllSeries\" is not supported for \"overallReset\", ' + 'because it will block all streams.';\n    }\n    assert(!stageHandler.createOnAllSeries, errMsg);\n    if (seriesType) {\n      ecModel.eachRawSeriesByType(seriesType, createStub);\n    } else if (getTargetSeries) {\n      getTargetSeries(ecModel, api).each(createStub);\n    }\n    // Otherwise, (usually it is legacy case), the overall task will only be\n    // executed when upstream is dirty. Otherwise the progressive rendering of all\n    // pipelines will be disabled unexpectedly. But it still needs stubs to receive\n    // dirty info from upstream.\n    else {\n      overallProgress = false;\n      each(ecModel.getSeries(), createStub);\n    }\n    function createStub(seriesModel) {\n      var pipelineId = seriesModel.uid;\n      var stub = newAgentStubMap.set(pipelineId, oldAgentStubMap && oldAgentStubMap.get(pipelineId) || (\n      // When the result of `getTargetSeries` changed, the overallTask\n      // should be set as dirty and re-performed.\n      shouldOverallTaskDirty = true, createTask({\n        reset: stubReset,\n        onDirty: stubOnDirty\n      })));\n      stub.context = {\n        model: seriesModel,\n        overallProgress: overallProgress\n        // FIXME:TS never used, so comment it\n        // modifyOutputEnd: modifyOutputEnd\n      };\n      stub.agent = overallTask;\n      stub.__block = overallProgress;\n      scheduler._pipe(seriesModel, stub);\n    }\n    if (shouldOverallTaskDirty) {\n      overallTask.dirty();\n    }\n  };\n  Scheduler.prototype._pipe = function (seriesModel, task) {\n    var pipelineId = seriesModel.uid;\n    var pipeline = this._pipelineMap.get(pipelineId);\n    !pipeline.head && (pipeline.head = task);\n    pipeline.tail && pipeline.tail.pipe(task);\n    pipeline.tail = task;\n    task.__idxInPipeline = pipeline.count++;\n    task.__pipeline = pipeline;\n  };\n  Scheduler.wrapStageHandler = function (stageHandler, visualType) {\n    if (isFunction(stageHandler)) {\n      stageHandler = {\n        overallReset: stageHandler,\n        seriesType: detectSeriseType(stageHandler)\n      };\n    }\n    stageHandler.uid = getUID('stageHandler');\n    visualType && (stageHandler.visualType = visualType);\n    return stageHandler;\n  };\n  ;\n  return Scheduler;\n}();\nfunction overallTaskReset(context) {\n  context.overallReset(context.ecModel, context.api, context.payload);\n}\nfunction stubReset(context) {\n  return context.overallProgress && stubProgress;\n}\nfunction stubProgress() {\n  this.agent.dirty();\n  this.getDownstream().dirty();\n}\nfunction stubOnDirty() {\n  this.agent && this.agent.dirty();\n}\nfunction seriesTaskPlan(context) {\n  return context.plan ? context.plan(context.model, context.ecModel, context.api, context.payload) : null;\n}\nfunction seriesTaskReset(context) {\n  if (context.useClearVisual) {\n    context.data.clearAllVisual();\n  }\n  var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload));\n  return resetDefines.length > 1 ? map(resetDefines, function (v, idx) {\n    return makeSeriesTaskProgress(idx);\n  }) : singleSeriesTaskProgress;\n}\nvar singleSeriesTaskProgress = makeSeriesTaskProgress(0);\nfunction makeSeriesTaskProgress(resetDefineIdx) {\n  return function (params, context) {\n    var data = context.data;\n    var resetDefine = context.resetDefines[resetDefineIdx];\n    if (resetDefine && resetDefine.dataEach) {\n      for (var i = params.start; i < params.end; i++) {\n        resetDefine.dataEach(data, i);\n      }\n    } else if (resetDefine && resetDefine.progress) {\n      resetDefine.progress(params, data);\n    }\n  };\n}\nfunction seriesTaskCount(context) {\n  return context.data.count();\n}\n/**\n * Only some legacy stage handlers (usually in echarts extensions) are pure function.\n * To ensure that they can work normally, they should work in block mode, that is,\n * they should not be started util the previous tasks finished. So they cause the\n * progressive rendering disabled. We try to detect the series type, to narrow down\n * the block range to only the series type they concern, but not all series.\n */\nfunction detectSeriseType(legacyFunc) {\n  seriesType = null;\n  try {\n    // Assume there is no async when calling `eachSeriesByType`.\n    legacyFunc(ecModelMock, apiMock);\n  } catch (e) {}\n  return seriesType;\n}\nvar ecModelMock = {};\nvar apiMock = {};\nvar seriesType;\nmockMethods(ecModelMock, GlobalModel);\nmockMethods(apiMock, ExtensionAPI);\necModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) {\n  seriesType = type;\n};\necModelMock.eachComponent = function (cond) {\n  if (cond.mainType === 'series' && cond.subType) {\n    seriesType = cond.subType;\n  }\n};\nfunction mockMethods(target, Clz) {\n  /* eslint-disable */\n  for (var name_1 in Clz.prototype) {\n    // Do not use hasOwnProperty\n    target[name_1] = noop;\n  }\n  /* eslint-enable */\n}\nexport default Scheduler;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport tokens from '../visual/tokens.js';\nvar color = tokens.darkColor;\nvar backgroundColor = color.background;\nvar axisCommon = function () {\n  return {\n    axisLine: {\n      lineStyle: {\n        color: color.axisLine\n      }\n    },\n    splitLine: {\n      lineStyle: {\n        color: color.axisSplitLine\n      }\n    },\n    splitArea: {\n      areaStyle: {\n        color: [color.backgroundTint, color.backgroundTransparent]\n      }\n    },\n    minorSplitLine: {\n      lineStyle: {\n        color: color.axisMinorSplitLine\n      }\n    },\n    axisLabel: {\n      color: color.axisLabel\n    },\n    axisName: {}\n  };\n};\nvar matrixAxis = {\n  label: {\n    color: color.secondary\n  },\n  itemStyle: {\n    borderColor: color.borderTint\n  },\n  dividerLineStyle: {\n    color: color.border\n  }\n};\nvar theme = {\n  darkMode: true,\n  color: color.theme,\n  backgroundColor: backgroundColor,\n  axisPointer: {\n    lineStyle: {\n      color: color.border\n    },\n    crossStyle: {\n      color: color.borderShade\n    },\n    label: {\n      color: color.tertiary\n    }\n  },\n  legend: {\n    textStyle: {\n      color: color.secondary\n    },\n    pageTextStyle: {\n      color: color.tertiary\n    }\n  },\n  textStyle: {\n    color: color.secondary\n  },\n  title: {\n    textStyle: {\n      color: color.primary\n    },\n    subtextStyle: {\n      color: color.quaternary\n    }\n  },\n  toolbox: {\n    iconStyle: {\n      borderColor: color.accent50\n    }\n  },\n  tooltip: {\n    backgroundColor: color.neutral20,\n    defaultBorderColor: color.border,\n    textStyle: {\n      color: color.tertiary\n    }\n  },\n  dataZoom: {\n    borderColor: color.accent10,\n    textStyle: {\n      color: color.tertiary\n    },\n    brushStyle: {\n      color: color.backgroundTint\n    },\n    handleStyle: {\n      color: color.neutral00,\n      borderColor: color.accent20\n    },\n    moveHandleStyle: {\n      color: color.accent40\n    },\n    emphasis: {\n      handleStyle: {\n        borderColor: color.accent50\n      }\n    },\n    dataBackground: {\n      lineStyle: {\n        color: color.accent30\n      },\n      areaStyle: {\n        color: color.accent20\n      }\n    },\n    selectedDataBackground: {\n      lineStyle: {\n        color: color.accent50\n      },\n      areaStyle: {\n        color: color.accent30\n      }\n    }\n  },\n  visualMap: {\n    textStyle: {\n      color: color.secondary\n    },\n    handleStyle: {\n      borderColor: color.neutral30\n    }\n  },\n  timeline: {\n    lineStyle: {\n      color: color.accent10\n    },\n    label: {\n      color: color.tertiary\n    },\n    controlStyle: {\n      color: color.accent30,\n      borderColor: color.accent30\n    }\n  },\n  calendar: {\n    itemStyle: {\n      color: color.neutral00,\n      borderColor: color.neutral20\n    },\n    dayLabel: {\n      color: color.tertiary\n    },\n    monthLabel: {\n      color: color.secondary\n    },\n    yearLabel: {\n      color: color.secondary\n    }\n  },\n  matrix: {\n    x: matrixAxis,\n    y: matrixAxis,\n    backgroundColor: {\n      borderColor: color.axisLine\n    },\n    body: {\n      itemStyle: {\n        borderColor: color.borderTint\n      }\n    }\n  },\n  timeAxis: axisCommon(),\n  logAxis: axisCommon(),\n  valueAxis: axisCommon(),\n  categoryAxis: axisCommon(),\n  line: {\n    symbol: 'circle'\n  },\n  graph: {\n    color: color.theme\n  },\n  gauge: {\n    title: {\n      color: color.secondary\n    },\n    axisLine: {\n      lineStyle: {\n        color: [[1, color.neutral05]]\n      }\n    },\n    axisLabel: {\n      color: color.axisLabel\n    },\n    detail: {\n      color: color.primary\n    }\n  },\n  candlestick: {\n    itemStyle: {\n      color: '#f64e56',\n      color0: '#54ea92',\n      borderColor: '#f64e56',\n      borderColor0: '#54ea92'\n      // borderColor: '#ca2824',\n      // borderColor0: '#09a443'\n    }\n  },\n  funnel: {\n    itemStyle: {\n      borderColor: color.background\n    }\n  },\n  radar: function () {\n    var radar = axisCommon();\n    radar.axisName = {\n      color: color.axisLabel\n    };\n    radar.axisLine.lineStyle.color = color.neutral20;\n    return radar;\n  }(),\n  treemap: {\n    breadcrumb: {\n      itemStyle: {\n        color: color.neutral20,\n        textStyle: {\n          color: color.secondary\n        }\n      },\n      emphasis: {\n        itemStyle: {\n          color: color.neutral30\n        }\n      }\n    }\n  },\n  sunburst: {\n    itemStyle: {\n      borderColor: color.background\n    }\n  },\n  map: {\n    itemStyle: {\n      borderColor: color.border,\n      areaColor: color.neutral10\n    },\n    label: {\n      color: color.tertiary\n    },\n    emphasis: {\n      label: {\n        color: color.primary\n      },\n      itemStyle: {\n        areaColor: color.highlight\n      }\n    },\n    select: {\n      label: {\n        color: color.primary\n      },\n      itemStyle: {\n        areaColor: color.highlight\n      }\n    }\n  },\n  geo: {\n    itemStyle: {\n      borderColor: color.border,\n      areaColor: color.neutral10\n    },\n    emphasis: {\n      label: {\n        color: color.primary\n      },\n      itemStyle: {\n        areaColor: color.highlight\n      }\n    },\n    select: {\n      label: {\n        color: color.primary\n      },\n      itemStyle: {\n        color: color.highlight\n      }\n    }\n  }\n};\ntheme.categoryAxis.splitLine.show = false;\nexport default theme;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { parseClassType } from './clazz.js';\n/**\n * Usage of query:\n * `chart.on('click', query, handler);`\n * The `query` can be:\n * + The component type query string, only `mainType` or `mainType.subType`,\n *   like: 'xAxis', 'series', 'xAxis.category' or 'series.line'.\n * + The component query object, like:\n *   `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`,\n *   `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`.\n * + The data query object, like:\n *   `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`.\n * + The other query object (cmponent customized query), like:\n *   `{element: 'some'}` (only available in custom series).\n *\n * Caveat: If a prop in the `query` object is `null/undefined`, it is the\n * same as there is no such prop in the `query` object.\n */\nvar ECEventProcessor = /** @class */function () {\n  function ECEventProcessor() {}\n  ECEventProcessor.prototype.normalizeQuery = function (query) {\n    var cptQuery = {};\n    var dataQuery = {};\n    var otherQuery = {};\n    // `query` is `mainType` or `mainType.subType` of component.\n    if (zrUtil.isString(query)) {\n      var condCptType = parseClassType(query);\n      // `.main` and `.sub` may be ''.\n      cptQuery.mainType = condCptType.main || null;\n      cptQuery.subType = condCptType.sub || null;\n    }\n    // `query` is an object, convert to {mainType, index, name, id}.\n    else {\n      // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved,\n      // can not be used in `compomentModel.filterForExposedEvent`.\n      var suffixes_1 = ['Index', 'Name', 'Id'];\n      var dataKeys_1 = {\n        name: 1,\n        dataIndex: 1,\n        dataType: 1\n      };\n      zrUtil.each(query, function (val, key) {\n        var reserved = false;\n        for (var i = 0; i < suffixes_1.length; i++) {\n          var propSuffix = suffixes_1[i];\n          var suffixPos = key.lastIndexOf(propSuffix);\n          if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) {\n            var mainType = key.slice(0, suffixPos);\n            // Consider `dataIndex`.\n            if (mainType !== 'data') {\n              cptQuery.mainType = mainType;\n              cptQuery[propSuffix.toLowerCase()] = val;\n              reserved = true;\n            }\n          }\n        }\n        if (dataKeys_1.hasOwnProperty(key)) {\n          dataQuery[key] = val;\n          reserved = true;\n        }\n        if (!reserved) {\n          otherQuery[key] = val;\n        }\n      });\n    }\n    return {\n      cptQuery: cptQuery,\n      dataQuery: dataQuery,\n      otherQuery: otherQuery\n    };\n  };\n  ECEventProcessor.prototype.filter = function (eventType, query) {\n    // They should be assigned before each trigger call.\n    var eventInfo = this.eventInfo;\n    if (!eventInfo) {\n      return true;\n    }\n    var targetEl = eventInfo.targetEl;\n    var packedEvent = eventInfo.packedEvent;\n    var model = eventInfo.model;\n    var view = eventInfo.view;\n    // For event like 'globalout'.\n    if (!model || !view) {\n      return true;\n    }\n    var cptQuery = query.cptQuery;\n    var dataQuery = query.dataQuery;\n    return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent));\n    function check(query, host, prop, propOnHost) {\n      return query[prop] == null || host[propOnHost || prop] === query[prop];\n    }\n  };\n  ECEventProcessor.prototype.afterTrigger = function () {\n    // Make sure the eventInfo won't be used in next trigger.\n    this.eventInfo = null;\n  };\n  return ECEventProcessor;\n}();\nexport { ECEventProcessor };\n;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend, isFunction, keys } from 'zrender/lib/core/util.js';\nvar SYMBOL_PROPS_WITH_CB = ['symbol', 'symbolSize', 'symbolRotate', 'symbolOffset'];\nvar SYMBOL_PROPS = SYMBOL_PROPS_WITH_CB.concat(['symbolKeepAspect']);\n// Encoding visual for all series include which is filtered for legend drawing\nvar seriesSymbolTask = {\n  createOnAllSeries: true,\n  // For legend.\n  performRawSeries: true,\n  reset: function (seriesModel, ecModel) {\n    var data = seriesModel.getData();\n    if (seriesModel.legendIcon) {\n      data.setVisual('legendIcon', seriesModel.legendIcon);\n    }\n    if (!seriesModel.hasSymbolVisual) {\n      return;\n    }\n    var symbolOptions = {};\n    var symbolOptionsCb = {};\n    var hasCallback = false;\n    for (var i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) {\n      var symbolPropName = SYMBOL_PROPS_WITH_CB[i];\n      var val = seriesModel.get(symbolPropName);\n      if (isFunction(val)) {\n        hasCallback = true;\n        symbolOptionsCb[symbolPropName] = val;\n      } else {\n        symbolOptions[symbolPropName] = val;\n      }\n    }\n    symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol;\n    data.setVisual(extend({\n      legendIcon: seriesModel.legendIcon || symbolOptions.symbol,\n      symbolKeepAspect: seriesModel.get('symbolKeepAspect')\n    }, symbolOptions));\n    // Only visible series has each data be visual encoded\n    if (ecModel.isSeriesFiltered(seriesModel)) {\n      return;\n    }\n    var symbolPropsCb = keys(symbolOptionsCb);\n    function dataEach(data, idx) {\n      var rawValue = seriesModel.getRawValue(idx);\n      var params = seriesModel.getDataParams(idx);\n      for (var i = 0; i < symbolPropsCb.length; i++) {\n        var symbolPropName = symbolPropsCb[i];\n        data.setItemVisual(idx, symbolPropName, symbolOptionsCb[symbolPropName](rawValue, params));\n      }\n    }\n    return {\n      dataEach: hasCallback ? dataEach : null\n    };\n  }\n};\nvar dataSymbolTask = {\n  createOnAllSeries: true,\n  // For legend.\n  performRawSeries: true,\n  reset: function (seriesModel, ecModel) {\n    if (!seriesModel.hasSymbolVisual) {\n      return;\n    }\n    // Only visible series has each data be visual encoded\n    if (ecModel.isSeriesFiltered(seriesModel)) {\n      return;\n    }\n    var data = seriesModel.getData();\n    function dataEach(data, idx) {\n      var itemModel = data.getItemModel(idx);\n      for (var i = 0; i < SYMBOL_PROPS.length; i++) {\n        var symbolPropName = SYMBOL_PROPS[i];\n        var val = itemModel.getShallow(symbolPropName, true);\n        if (val != null) {\n          data.setItemVisual(idx, symbolPropName, val);\n        }\n      }\n    }\n    return {\n      dataEach: data.hasItemOption ? dataEach : null\n    };\n  }\n};\nexport { seriesSymbolTask, dataSymbolTask };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport function getItemVisualFromData(data, dataIndex, key) {\n  switch (key) {\n    case 'color':\n      var style = data.getItemVisual(dataIndex, 'style');\n      return style[data.getVisual('drawType')];\n    case 'opacity':\n      return data.getItemVisual(dataIndex, 'style').opacity;\n    case 'symbol':\n    case 'symbolSize':\n    case 'liftZ':\n      return data.getItemVisual(dataIndex, key);\n    default:\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn(\"Unknown visual type \" + key);\n      }\n  }\n}\nexport function getVisualFromData(data, key) {\n  switch (key) {\n    case 'color':\n      var style = data.getVisual('style');\n      return style[data.getVisual('drawType')];\n    case 'opacity':\n      return data.getVisual('style').opacity;\n    case 'symbol':\n    case 'symbolSize':\n    case 'liftZ':\n      return data.getVisual(key);\n    default:\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn(\"Unknown visual type \" + key);\n      }\n  }\n}\nexport function setItemVisualFromData(data, dataIndex, key, value) {\n  switch (key) {\n    case 'color':\n      // Make sure not sharing style object.\n      var style = data.ensureUniqueItemVisual(dataIndex, 'style');\n      style[data.getVisual('drawType')] = value;\n      // Mark the color has been changed, not from palette anymore\n      data.setItemVisual(dataIndex, 'colorFromPalette', false);\n      break;\n    case 'opacity':\n      data.ensureUniqueItemVisual(dataIndex, 'style').opacity = value;\n      break;\n    case 'symbol':\n    case 'symbolSize':\n    case 'liftZ':\n      data.setItemVisual(dataIndex, key, value);\n      break;\n    default:\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn(\"Unknown visual type \" + key);\n      }\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend, each, isArray, isString } from 'zrender/lib/core/util.js';\nimport { deprecateReplaceLog, deprecateLog } from '../util/log.js';\nimport { queryDataIndex } from '../util/model.js';\n// Legacy data selection action.\n// Includes: pieSelect, pieUnSelect, pieToggleSelect, mapSelect, mapUnSelect, mapToggleSelect\nexport function createLegacyDataSelectAction(seriesType, ecRegisterAction) {\n  function getSeriesIndices(ecModel, payload) {\n    var seriesIndices = [];\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: seriesType,\n      query: payload\n    }, function (seriesModel) {\n      seriesIndices.push(seriesModel.seriesIndex);\n    });\n    return seriesIndices;\n  }\n  each([[seriesType + 'ToggleSelect', 'toggleSelect'], [seriesType + 'Select', 'select'], [seriesType + 'UnSelect', 'unselect']], function (eventsMap) {\n    ecRegisterAction(eventsMap[0], function (payload, ecModel, api) {\n      payload = extend({}, payload);\n      if (process.env.NODE_ENV !== 'production') {\n        deprecateReplaceLog(payload.type, eventsMap[1]);\n      }\n      api.dispatchAction(extend(payload, {\n        type: eventsMap[1],\n        seriesIndex: getSeriesIndices(ecModel, payload)\n      }));\n    });\n  });\n}\nfunction handleSeriesLegacySelectEvents(type, eventPostfix, ecIns, ecModel, payload) {\n  var legacyEventName = type + eventPostfix;\n  if (!ecIns.isSilent(legacyEventName)) {\n    if (process.env.NODE_ENV !== 'production') {\n      deprecateLog(\"event \" + legacyEventName + \" is deprecated.\");\n    }\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'pie'\n    }, function (seriesModel) {\n      var seriesIndex = seriesModel.seriesIndex;\n      var selectedMap = seriesModel.option.selectedMap;\n      var selected = payload.selected;\n      for (var i = 0; i < selected.length; i++) {\n        if (selected[i].seriesIndex === seriesIndex) {\n          var data = seriesModel.getData();\n          var dataIndex = queryDataIndex(data, payload.fromActionPayload);\n          ecIns.trigger(legacyEventName, {\n            type: legacyEventName,\n            seriesId: seriesModel.id,\n            name: isArray(dataIndex) ? data.getName(dataIndex[0]) : data.getName(dataIndex),\n            selected: isString(selectedMap) ? selectedMap : extend({}, selectedMap)\n          });\n        }\n      }\n    });\n  }\n}\nexport function handleLegacySelectEvents(messageCenter, ecIns, api) {\n  messageCenter.on('selectchanged', function (params) {\n    var ecModel = api.getModel();\n    if (params.isFromClick) {\n      handleSeriesLegacySelectEvents('map', 'selectchanged', ecIns, ecModel, params);\n      handleSeriesLegacySelectEvents('pie', 'selectchanged', ecIns, ecModel, params);\n    } else if (params.fromAction === 'select') {\n      handleSeriesLegacySelectEvents('map', 'selected', ecIns, ecModel, params);\n      handleSeriesLegacySelectEvents('pie', 'selected', ecIns, ecModel, params);\n    } else if (params.fromAction === 'unselect') {\n      handleSeriesLegacySelectEvents('map', 'unselected', ecIns, ecModel, params);\n      handleSeriesLegacySelectEvents('pie', 'unselected', ecIns, ecModel, params);\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport function findEventDispatcher(target, det, returnFirstMatch) {\n  var found;\n  while (target) {\n    if (det(target)) {\n      found = target;\n      if (returnFirstMatch) {\n        break;\n      }\n    }\n    target = target.__hostTarget || target.parent;\n  }\n  return found;\n}", "var wmUniqueIndex = Math.round(Math.random() * 9);\nvar supportDefineProperty = typeof Object.defineProperty === 'function';\nvar WeakMap = (function () {\n    function WeakMap() {\n        this._id = '__ec_inner_' + wmUniqueIndex++;\n    }\n    WeakMap.prototype.get = function (key) {\n        return this._guard(key)[this._id];\n    };\n    WeakMap.prototype.set = function (key, value) {\n        var target = this._guard(key);\n        if (supportDefineProperty) {\n            Object.defineProperty(target, this._id, {\n                value: value,\n                enumerable: false,\n                configurable: true\n            });\n        }\n        else {\n            target[this._id] = value;\n        }\n        return this;\n    };\n    WeakMap.prototype[\"delete\"] = function (key) {\n        if (this.has(key)) {\n            delete this._guard(key)[this._id];\n            return true;\n        }\n        return false;\n    };\n    WeakMap.prototype.has = function (key) {\n        return !!this._guard(key)[this._id];\n    };\n    WeakMap.prototype._guard = function (key) {\n        if (key !== Object(key)) {\n            throw TypeError('Value of WeakMap is not a non-null object.');\n        }\n        return key;\n    };\n    return WeakMap;\n}());\nexport default WeakMap;\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// Symbol factory\nimport { each, isArray, retrieve2 } from 'zrender/lib/core/util.js';\nimport * as graphic from './graphic.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { calculateTextPosition } from 'zrender/lib/contain/text.js';\nimport { parsePercent } from './number.js';\nimport tokens from '../visual/tokens.js';\n/**\n * Triangle shape\n * @inner\n */\nvar Triangle = graphic.Path.extend({\n  type: 'triangle',\n  shape: {\n    cx: 0,\n    cy: 0,\n    width: 0,\n    height: 0\n  },\n  buildPath: function (path, shape) {\n    var cx = shape.cx;\n    var cy = shape.cy;\n    var width = shape.width / 2;\n    var height = shape.height / 2;\n    path.moveTo(cx, cy - height);\n    path.lineTo(cx + width, cy + height);\n    path.lineTo(cx - width, cy + height);\n    path.closePath();\n  }\n});\n/**\n * Diamond shape\n * @inner\n */\nvar Diamond = graphic.Path.extend({\n  type: 'diamond',\n  shape: {\n    cx: 0,\n    cy: 0,\n    width: 0,\n    height: 0\n  },\n  buildPath: function (path, shape) {\n    var cx = shape.cx;\n    var cy = shape.cy;\n    var width = shape.width / 2;\n    var height = shape.height / 2;\n    path.moveTo(cx, cy - height);\n    path.lineTo(cx + width, cy);\n    path.lineTo(cx, cy + height);\n    path.lineTo(cx - width, cy);\n    path.closePath();\n  }\n});\n/**\n * Pin shape\n * @inner\n */\nvar Pin = graphic.Path.extend({\n  type: 'pin',\n  shape: {\n    // x, y on the cusp\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0\n  },\n  buildPath: function (path, shape) {\n    var x = shape.x;\n    var y = shape.y;\n    var w = shape.width / 5 * 3;\n    // Height must be larger than width\n    var h = Math.max(w, shape.height);\n    var r = w / 2;\n    // Dist on y with tangent point and circle center\n    var dy = r * r / (h - r);\n    var cy = y - h + r + dy;\n    var angle = Math.asin(dy / r);\n    // Dist on x with tangent point and circle center\n    var dx = Math.cos(angle) * r;\n    var tanX = Math.sin(angle);\n    var tanY = Math.cos(angle);\n    var cpLen = r * 0.6;\n    var cpLen2 = r * 0.7;\n    path.moveTo(x - dx, cy + dy);\n    path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle);\n    path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y);\n    path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy);\n    path.closePath();\n  }\n});\n/**\n * Arrow shape\n * @inner\n */\nvar Arrow = graphic.Path.extend({\n  type: 'arrow',\n  shape: {\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0\n  },\n  buildPath: function (ctx, shape) {\n    var height = shape.height;\n    var width = shape.width;\n    var x = shape.x;\n    var y = shape.y;\n    var dx = width / 3 * 2;\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + dx, y + height);\n    ctx.lineTo(x, y + height / 4 * 3);\n    ctx.lineTo(x - dx, y + height);\n    ctx.lineTo(x, y);\n    ctx.closePath();\n  }\n});\n/**\n * Map of path constructors\n */\n// TODO Use function to build symbol path.\nvar symbolCtors = {\n  line: graphic.Line,\n  rect: graphic.Rect,\n  roundRect: graphic.Rect,\n  square: graphic.Rect,\n  circle: graphic.Circle,\n  diamond: Diamond,\n  pin: Pin,\n  arrow: Arrow,\n  triangle: Triangle\n};\nvar symbolShapeMakers = {\n  line: function (x, y, w, h, shape) {\n    shape.x1 = x;\n    shape.y1 = y + h / 2;\n    shape.x2 = x + w;\n    shape.y2 = y + h / 2;\n  },\n  rect: function (x, y, w, h, shape) {\n    shape.x = x;\n    shape.y = y;\n    shape.width = w;\n    shape.height = h;\n  },\n  roundRect: function (x, y, w, h, shape) {\n    shape.x = x;\n    shape.y = y;\n    shape.width = w;\n    shape.height = h;\n    shape.r = Math.min(w, h) / 4;\n  },\n  square: function (x, y, w, h, shape) {\n    var size = Math.min(w, h);\n    shape.x = x;\n    shape.y = y;\n    shape.width = size;\n    shape.height = size;\n  },\n  circle: function (x, y, w, h, shape) {\n    // Put circle in the center of square\n    shape.cx = x + w / 2;\n    shape.cy = y + h / 2;\n    shape.r = Math.min(w, h) / 2;\n  },\n  diamond: function (x, y, w, h, shape) {\n    shape.cx = x + w / 2;\n    shape.cy = y + h / 2;\n    shape.width = w;\n    shape.height = h;\n  },\n  pin: function (x, y, w, h, shape) {\n    shape.x = x + w / 2;\n    shape.y = y + h / 2;\n    shape.width = w;\n    shape.height = h;\n  },\n  arrow: function (x, y, w, h, shape) {\n    shape.x = x + w / 2;\n    shape.y = y + h / 2;\n    shape.width = w;\n    shape.height = h;\n  },\n  triangle: function (x, y, w, h, shape) {\n    shape.cx = x + w / 2;\n    shape.cy = y + h / 2;\n    shape.width = w;\n    shape.height = h;\n  }\n};\nexport var symbolBuildProxies = {};\neach(symbolCtors, function (Ctor, name) {\n  symbolBuildProxies[name] = new Ctor();\n});\nvar SymbolClz = graphic.Path.extend({\n  type: 'symbol',\n  shape: {\n    symbolType: '',\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0\n  },\n  calculateTextPosition: function (out, config, rect) {\n    var res = calculateTextPosition(out, config, rect);\n    var shape = this.shape;\n    if (shape && shape.symbolType === 'pin' && config.position === 'inside') {\n      res.y = rect.y + rect.height * 0.4;\n    }\n    return res;\n  },\n  buildPath: function (ctx, shape, inBundle) {\n    var symbolType = shape.symbolType;\n    if (symbolType !== 'none') {\n      var proxySymbol = symbolBuildProxies[symbolType];\n      if (!proxySymbol) {\n        // Default rect\n        symbolType = 'rect';\n        proxySymbol = symbolBuildProxies[symbolType];\n      }\n      symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape);\n      proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle);\n    }\n  }\n});\n// Provide setColor helper method to avoid determine if set the fill or stroke outside\nfunction symbolPathSetColor(color, innerColor) {\n  if (this.type !== 'image') {\n    var symbolStyle = this.style;\n    if (this.__isEmptyBrush) {\n      symbolStyle.stroke = color;\n      symbolStyle.fill = innerColor || tokens.color.neutral00;\n      // TODO Same width with lineStyle in LineView\n      symbolStyle.lineWidth = 2;\n    } else if (this.shape.symbolType === 'line') {\n      symbolStyle.stroke = color;\n    } else {\n      symbolStyle.fill = color;\n    }\n    this.markRedraw();\n  }\n}\n/**\n * Create a symbol element with given symbol configuration: shape, x, y, width, height, color\n */\nexport function createSymbol(symbolType, x, y, w, h, color,\n// whether to keep the ratio of w/h,\nkeepAspect) {\n  // TODO Support image object, DynamicImage.\n  var isEmpty = symbolType.indexOf('empty') === 0;\n  if (isEmpty) {\n    symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6);\n  }\n  var symbolPath;\n  if (symbolType.indexOf('image://') === 0) {\n    symbolPath = graphic.makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover');\n  } else if (symbolType.indexOf('path://') === 0) {\n    symbolPath = graphic.makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover');\n  } else {\n    symbolPath = new SymbolClz({\n      shape: {\n        symbolType: symbolType,\n        x: x,\n        y: y,\n        width: w,\n        height: h\n      }\n    });\n  }\n  symbolPath.__isEmptyBrush = isEmpty;\n  // TODO Should deprecate setColor\n  symbolPath.setColor = symbolPathSetColor;\n  if (color) {\n    symbolPath.setColor(color);\n  }\n  return symbolPath;\n}\nexport function normalizeSymbolSize(symbolSize) {\n  if (!isArray(symbolSize)) {\n    symbolSize = [+symbolSize, +symbolSize];\n  }\n  return [symbolSize[0] || 0, symbolSize[1] || 0];\n}\nexport function normalizeSymbolOffset(symbolOffset, symbolSize) {\n  if (symbolOffset == null) {\n    return;\n  }\n  if (!isArray(symbolOffset)) {\n    symbolOffset = [symbolOffset, symbolOffset];\n  }\n  return [parsePercent(symbolOffset[0], symbolSize[0]) || 0, parsePercent(retrieve2(symbolOffset[1], symbolOffset[0]), symbolSize[1]) || 0];\n}", "function isSafeNum(num) {\n    return isFinite(num);\n}\nexport function createLinearGradient(ctx, obj, rect) {\n    var x = obj.x == null ? 0 : obj.x;\n    var x2 = obj.x2 == null ? 1 : obj.x2;\n    var y = obj.y == null ? 0 : obj.y;\n    var y2 = obj.y2 == null ? 0 : obj.y2;\n    if (!obj.global) {\n        x = x * rect.width + rect.x;\n        x2 = x2 * rect.width + rect.x;\n        y = y * rect.height + rect.y;\n        y2 = y2 * rect.height + rect.y;\n    }\n    x = isSafeNum(x) ? x : 0;\n    x2 = isSafeNum(x2) ? x2 : 1;\n    y = isSafeNum(y) ? y : 0;\n    y2 = isSafeNum(y2) ? y2 : 0;\n    var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);\n    return canvasGradient;\n}\nexport function createRadialGradient(ctx, obj, rect) {\n    var width = rect.width;\n    var height = rect.height;\n    var min = Math.min(width, height);\n    var x = obj.x == null ? 0.5 : obj.x;\n    var y = obj.y == null ? 0.5 : obj.y;\n    var r = obj.r == null ? 0.5 : obj.r;\n    if (!obj.global) {\n        x = x * width + rect.x;\n        y = y * height + rect.y;\n        r = r * min;\n    }\n    x = isSafeNum(x) ? x : 0.5;\n    y = isSafeNum(y) ? y : 0.5;\n    r = r >= 0 && isSafeNum(r) ? r : 0.5;\n    var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);\n    return canvasGradient;\n}\nexport function getCanvasGradient(ctx, obj, rect) {\n    var canvasGradient = obj.type === 'radial'\n        ? createRadialGradient(ctx, obj, rect)\n        : createLinearGradient(ctx, obj, rect);\n    var colorStops = obj.colorStops;\n    for (var i = 0; i < colorStops.length; i++) {\n        canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color);\n    }\n    return canvasGradient;\n}\nexport function isClipPathChanged(clipPaths, prevClipPaths) {\n    if (clipPaths === prevClipPaths || (!clipPaths && !prevClipPaths)) {\n        return false;\n    }\n    if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) {\n        return true;\n    }\n    for (var i = 0; i < clipPaths.length; i++) {\n        if (clipPaths[i] !== prevClipPaths[i]) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction parseInt10(val) {\n    return parseInt(val, 10);\n}\nexport function getSize(root, whIdx, opts) {\n    var wh = ['width', 'height'][whIdx];\n    var cwh = ['clientWidth', 'clientHeight'][whIdx];\n    var plt = ['paddingLeft', 'paddingTop'][whIdx];\n    var prb = ['paddingRight', 'paddingBottom'][whIdx];\n    if (opts[wh] != null && opts[wh] !== 'auto') {\n        return parseFloat(opts[wh]);\n    }\n    var stl = document.defaultView.getComputedStyle(root);\n    return ((root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh]))\n        - (parseInt10(stl[plt]) || 0)\n        - (parseInt10(stl[prb]) || 0)) | 0;\n}\n", "import { isArray, isNumber, map } from '../core/util.js';\nexport function normalizeLineDash(lineType, lineWidth) {\n    if (!lineType || lineType === 'solid' || !(lineWidth > 0)) {\n        return null;\n    }\n    return lineType === 'dashed'\n        ? [4 * lineWidth, 2 * lineWidth]\n        : lineType === 'dotted'\n            ? [lineWidth]\n            : isNumber(lineType)\n                ? [lineType] : isArray(lineType) ? lineType : null;\n}\nexport function getLineDash(el) {\n    var style = el.style;\n    var lineDash = style.lineDash && style.lineWidth > 0 && normalizeLineDash(style.lineDash, style.lineWidth);\n    var lineDashOffset = style.lineDashOffset;\n    if (lineDash) {\n        var lineScale_1 = (style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1;\n        if (lineScale_1 && lineScale_1 !== 1) {\n            lineDash = map(lineDash, function (rawVal) {\n                return rawVal / lineScale_1;\n            });\n            lineDashOffset /= lineScale_1;\n        }\n    }\n    return [lineDash, lineDashOffset];\n}\n", "import { DEFAULT_COMMON_STYLE } from '../graphic/Displayable.js';\nimport PathProxy from '../core/PathProxy.js';\nimport { createOrUpdateImage, isImageReady } from '../graphic/helper/image.js';\nimport { getCanvasGradient, isClipPathChanged } from './helper.js';\nimport Path from '../graphic/Path.js';\nimport ZRImage from '../graphic/Image.js';\nimport TSpan from '../graphic/TSpan.js';\nimport { RADIAN_TO_DEGREE } from '../core/util.js';\nimport { getLineDash } from './dashStyle.js';\nimport { REDRAW_BIT, SHAPE_CHANGED_BIT } from '../graphic/constants.js';\nimport { DEFAULT_FONT } from '../core/platform.js';\nvar pathProxyForDraw = new PathProxy(true);\nfunction styleHasStroke(style) {\n    var stroke = style.stroke;\n    return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));\n}\nfunction isValidStrokeFillStyle(strokeOrFill) {\n    return typeof strokeOrFill === 'string' && strokeOrFill !== 'none';\n}\nfunction styleHasFill(style) {\n    var fill = style.fill;\n    return fill != null && fill !== 'none';\n}\nfunction doFillPath(ctx, style) {\n    if (style.fillOpacity != null && style.fillOpacity !== 1) {\n        var originalGlobalAlpha = ctx.globalAlpha;\n        ctx.globalAlpha = style.fillOpacity * style.opacity;\n        ctx.fill();\n        ctx.globalAlpha = originalGlobalAlpha;\n    }\n    else {\n        ctx.fill();\n    }\n}\nfunction doStrokePath(ctx, style) {\n    if (style.strokeOpacity != null && style.strokeOpacity !== 1) {\n        var originalGlobalAlpha = ctx.globalAlpha;\n        ctx.globalAlpha = style.strokeOpacity * style.opacity;\n        ctx.stroke();\n        ctx.globalAlpha = originalGlobalAlpha;\n    }\n    else {\n        ctx.stroke();\n    }\n}\nexport function createCanvasPattern(ctx, pattern, el) {\n    var image = createOrUpdateImage(pattern.image, pattern.__image, el);\n    if (isImageReady(image)) {\n        var canvasPattern = ctx.createPattern(image, pattern.repeat || 'repeat');\n        if (typeof DOMMatrix === 'function'\n            && canvasPattern\n            && canvasPattern.setTransform) {\n            var matrix = new DOMMatrix();\n            matrix.translateSelf((pattern.x || 0), (pattern.y || 0));\n            matrix.rotateSelf(0, 0, (pattern.rotation || 0) * RADIAN_TO_DEGREE);\n            matrix.scaleSelf((pattern.scaleX || 1), (pattern.scaleY || 1));\n            canvasPattern.setTransform(matrix);\n        }\n        return canvasPattern;\n    }\n}\nfunction brushPath(ctx, el, style, inBatch) {\n    var _a;\n    var hasStroke = styleHasStroke(style);\n    var hasFill = styleHasFill(style);\n    var strokePercent = style.strokePercent;\n    var strokePart = strokePercent < 1;\n    var firstDraw = !el.path;\n    if ((!el.silent || strokePart) && firstDraw) {\n        el.createPathProxy();\n    }\n    var path = el.path || pathProxyForDraw;\n    var dirtyFlag = el.__dirty;\n    if (!inBatch) {\n        var fill = style.fill;\n        var stroke = style.stroke;\n        var hasFillGradient = hasFill && !!fill.colorStops;\n        var hasStrokeGradient = hasStroke && !!stroke.colorStops;\n        var hasFillPattern = hasFill && !!fill.image;\n        var hasStrokePattern = hasStroke && !!stroke.image;\n        var fillGradient = void 0;\n        var strokeGradient = void 0;\n        var fillPattern = void 0;\n        var strokePattern = void 0;\n        var rect = void 0;\n        if (hasFillGradient || hasStrokeGradient) {\n            rect = el.getBoundingRect();\n        }\n        if (hasFillGradient) {\n            fillGradient = dirtyFlag\n                ? getCanvasGradient(ctx, fill, rect)\n                : el.__canvasFillGradient;\n            el.__canvasFillGradient = fillGradient;\n        }\n        if (hasStrokeGradient) {\n            strokeGradient = dirtyFlag\n                ? getCanvasGradient(ctx, stroke, rect)\n                : el.__canvasStrokeGradient;\n            el.__canvasStrokeGradient = strokeGradient;\n        }\n        if (hasFillPattern) {\n            fillPattern = (dirtyFlag || !el.__canvasFillPattern)\n                ? createCanvasPattern(ctx, fill, el)\n                : el.__canvasFillPattern;\n            el.__canvasFillPattern = fillPattern;\n        }\n        if (hasStrokePattern) {\n            strokePattern = (dirtyFlag || !el.__canvasStrokePattern)\n                ? createCanvasPattern(ctx, stroke, el)\n                : el.__canvasStrokePattern;\n            el.__canvasStrokePattern = strokePattern;\n        }\n        if (hasFillGradient) {\n            ctx.fillStyle = fillGradient;\n        }\n        else if (hasFillPattern) {\n            if (fillPattern) {\n                ctx.fillStyle = fillPattern;\n            }\n            else {\n                hasFill = false;\n            }\n        }\n        if (hasStrokeGradient) {\n            ctx.strokeStyle = strokeGradient;\n        }\n        else if (hasStrokePattern) {\n            if (strokePattern) {\n                ctx.strokeStyle = strokePattern;\n            }\n            else {\n                hasStroke = false;\n            }\n        }\n    }\n    var scale = el.getGlobalScale();\n    path.setScale(scale[0], scale[1], el.segmentIgnoreThreshold);\n    var lineDash;\n    var lineDashOffset;\n    if (ctx.setLineDash && style.lineDash) {\n        _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];\n    }\n    var needsRebuild = true;\n    if (firstDraw || (dirtyFlag & SHAPE_CHANGED_BIT)) {\n        path.setDPR(ctx.dpr);\n        if (strokePart) {\n            path.setContext(null);\n        }\n        else {\n            path.setContext(ctx);\n            needsRebuild = false;\n        }\n        path.reset();\n        el.buildPath(path, el.shape, inBatch);\n        path.toStatic();\n        el.pathUpdated();\n    }\n    if (needsRebuild) {\n        path.rebuildPath(ctx, strokePart ? strokePercent : 1);\n    }\n    if (lineDash) {\n        ctx.setLineDash(lineDash);\n        ctx.lineDashOffset = lineDashOffset;\n    }\n    if (!inBatch) {\n        if (style.strokeFirst) {\n            if (hasStroke) {\n                doStrokePath(ctx, style);\n            }\n            if (hasFill) {\n                doFillPath(ctx, style);\n            }\n        }\n        else {\n            if (hasFill) {\n                doFillPath(ctx, style);\n            }\n            if (hasStroke) {\n                doStrokePath(ctx, style);\n            }\n        }\n    }\n    if (lineDash) {\n        ctx.setLineDash([]);\n    }\n}\nfunction brushImage(ctx, el, style) {\n    var image = el.__image = createOrUpdateImage(style.image, el.__image, el, el.onload);\n    if (!image || !isImageReady(image)) {\n        return;\n    }\n    var x = style.x || 0;\n    var y = style.y || 0;\n    var width = el.getWidth();\n    var height = el.getHeight();\n    var aspect = image.width / image.height;\n    if (width == null && height != null) {\n        width = height * aspect;\n    }\n    else if (height == null && width != null) {\n        height = width / aspect;\n    }\n    else if (width == null && height == null) {\n        width = image.width;\n        height = image.height;\n    }\n    if (style.sWidth && style.sHeight) {\n        var sx = style.sx || 0;\n        var sy = style.sy || 0;\n        ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height);\n    }\n    else if (style.sx && style.sy) {\n        var sx = style.sx;\n        var sy = style.sy;\n        var sWidth = width - sx;\n        var sHeight = height - sy;\n        ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height);\n    }\n    else {\n        ctx.drawImage(image, x, y, width, height);\n    }\n}\nfunction brushText(ctx, el, style) {\n    var _a;\n    var text = style.text;\n    text != null && (text += '');\n    if (text) {\n        ctx.font = style.font || DEFAULT_FONT;\n        ctx.textAlign = style.textAlign;\n        ctx.textBaseline = style.textBaseline;\n        var lineDash = void 0;\n        var lineDashOffset = void 0;\n        if (ctx.setLineDash && style.lineDash) {\n            _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];\n        }\n        if (lineDash) {\n            ctx.setLineDash(lineDash);\n            ctx.lineDashOffset = lineDashOffset;\n        }\n        if (style.strokeFirst) {\n            if (styleHasStroke(style)) {\n                ctx.strokeText(text, style.x, style.y);\n            }\n            if (styleHasFill(style)) {\n                ctx.fillText(text, style.x, style.y);\n            }\n        }\n        else {\n            if (styleHasFill(style)) {\n                ctx.fillText(text, style.x, style.y);\n            }\n            if (styleHasStroke(style)) {\n                ctx.strokeText(text, style.x, style.y);\n            }\n        }\n        if (lineDash) {\n            ctx.setLineDash([]);\n        }\n    }\n}\nvar SHADOW_NUMBER_PROPS = ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];\nvar STROKE_PROPS = [\n    ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]\n];\nfunction bindCommonProps(ctx, style, prevStyle, forceSetAll, scope) {\n    var styleChanged = false;\n    if (!forceSetAll) {\n        prevStyle = prevStyle || {};\n        if (style === prevStyle) {\n            return false;\n        }\n    }\n    if (forceSetAll || style.opacity !== prevStyle.opacity) {\n        flushPathDrawn(ctx, scope);\n        styleChanged = true;\n        var opacity = Math.max(Math.min(style.opacity, 1), 0);\n        ctx.globalAlpha = isNaN(opacity) ? DEFAULT_COMMON_STYLE.opacity : opacity;\n    }\n    if (forceSetAll || style.blend !== prevStyle.blend) {\n        if (!styleChanged) {\n            flushPathDrawn(ctx, scope);\n            styleChanged = true;\n        }\n        ctx.globalCompositeOperation = style.blend || DEFAULT_COMMON_STYLE.blend;\n    }\n    for (var i = 0; i < SHADOW_NUMBER_PROPS.length; i++) {\n        var propName = SHADOW_NUMBER_PROPS[i];\n        if (forceSetAll || style[propName] !== prevStyle[propName]) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            ctx[propName] = ctx.dpr * (style[propName] || 0);\n        }\n    }\n    if (forceSetAll || style.shadowColor !== prevStyle.shadowColor) {\n        if (!styleChanged) {\n            flushPathDrawn(ctx, scope);\n            styleChanged = true;\n        }\n        ctx.shadowColor = style.shadowColor || DEFAULT_COMMON_STYLE.shadowColor;\n    }\n    return styleChanged;\n}\nfunction bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetAll, scope) {\n    var style = getStyle(el, scope.inHover);\n    var prevStyle = forceSetAll\n        ? null\n        : (prevEl && getStyle(prevEl, scope.inHover) || {});\n    if (style === prevStyle) {\n        return false;\n    }\n    var styleChanged = bindCommonProps(ctx, style, prevStyle, forceSetAll, scope);\n    if (forceSetAll || style.fill !== prevStyle.fill) {\n        if (!styleChanged) {\n            flushPathDrawn(ctx, scope);\n            styleChanged = true;\n        }\n        isValidStrokeFillStyle(style.fill) && (ctx.fillStyle = style.fill);\n    }\n    if (forceSetAll || style.stroke !== prevStyle.stroke) {\n        if (!styleChanged) {\n            flushPathDrawn(ctx, scope);\n            styleChanged = true;\n        }\n        isValidStrokeFillStyle(style.stroke) && (ctx.strokeStyle = style.stroke);\n    }\n    if (forceSetAll || style.opacity !== prevStyle.opacity) {\n        if (!styleChanged) {\n            flushPathDrawn(ctx, scope);\n            styleChanged = true;\n        }\n        ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;\n    }\n    if (el.hasStroke()) {\n        var lineWidth = style.lineWidth;\n        var newLineWidth = lineWidth / ((style.strokeNoScale && el.getLineScale) ? el.getLineScale() : 1);\n        if (ctx.lineWidth !== newLineWidth) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            ctx.lineWidth = newLineWidth;\n        }\n    }\n    for (var i = 0; i < STROKE_PROPS.length; i++) {\n        var prop = STROKE_PROPS[i];\n        var propName = prop[0];\n        if (forceSetAll || style[propName] !== prevStyle[propName]) {\n            if (!styleChanged) {\n                flushPathDrawn(ctx, scope);\n                styleChanged = true;\n            }\n            ctx[propName] = style[propName] || prop[1];\n        }\n    }\n    return styleChanged;\n}\nfunction bindImageStyle(ctx, el, prevEl, forceSetAll, scope) {\n    return bindCommonProps(ctx, getStyle(el, scope.inHover), prevEl && getStyle(prevEl, scope.inHover), forceSetAll, scope);\n}\nfunction setContextTransform(ctx, el) {\n    var m = el.transform;\n    var dpr = ctx.dpr || 1;\n    if (m) {\n        ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]);\n    }\n    else {\n        ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    }\n}\nfunction updateClipStatus(clipPaths, ctx, scope) {\n    var allClipped = false;\n    for (var i = 0; i < clipPaths.length; i++) {\n        var clipPath = clipPaths[i];\n        allClipped = allClipped || clipPath.isZeroArea();\n        setContextTransform(ctx, clipPath);\n        ctx.beginPath();\n        clipPath.buildPath(ctx, clipPath.shape);\n        ctx.clip();\n    }\n    scope.allClipped = allClipped;\n}\nfunction isTransformChanged(m0, m1) {\n    if (m0 && m1) {\n        return m0[0] !== m1[0]\n            || m0[1] !== m1[1]\n            || m0[2] !== m1[2]\n            || m0[3] !== m1[3]\n            || m0[4] !== m1[4]\n            || m0[5] !== m1[5];\n    }\n    else if (!m0 && !m1) {\n        return false;\n    }\n    return true;\n}\nvar DRAW_TYPE_PATH = 1;\nvar DRAW_TYPE_IMAGE = 2;\nvar DRAW_TYPE_TEXT = 3;\nvar DRAW_TYPE_INCREMENTAL = 4;\nfunction canPathBatch(style) {\n    var hasFill = styleHasFill(style);\n    var hasStroke = styleHasStroke(style);\n    return !(style.lineDash\n        || !(+hasFill ^ +hasStroke)\n        || (hasFill && typeof style.fill !== 'string')\n        || (hasStroke && typeof style.stroke !== 'string')\n        || style.strokePercent < 1\n        || style.strokeOpacity < 1\n        || style.fillOpacity < 1);\n}\nfunction flushPathDrawn(ctx, scope) {\n    scope.batchFill && ctx.fill();\n    scope.batchStroke && ctx.stroke();\n    scope.batchFill = '';\n    scope.batchStroke = '';\n}\nfunction getStyle(el, inHover) {\n    return inHover ? (el.__hoverStyle || el.style) : el.style;\n}\nexport function brushSingle(ctx, el) {\n    brush(ctx, el, { inHover: false, viewWidth: 0, viewHeight: 0 }, true);\n}\nexport function brush(ctx, el, scope, isLast) {\n    var m = el.transform;\n    if (!el.shouldBePainted(scope.viewWidth, scope.viewHeight, false, false)) {\n        el.__dirty &= ~REDRAW_BIT;\n        el.__isRendered = false;\n        return;\n    }\n    var clipPaths = el.__clipPaths;\n    var prevElClipPaths = scope.prevElClipPaths;\n    var forceSetTransform = false;\n    var forceSetStyle = false;\n    if (!prevElClipPaths || isClipPathChanged(clipPaths, prevElClipPaths)) {\n        if (prevElClipPaths && prevElClipPaths.length) {\n            flushPathDrawn(ctx, scope);\n            ctx.restore();\n            forceSetStyle = forceSetTransform = true;\n            scope.prevElClipPaths = null;\n            scope.allClipped = false;\n            scope.prevEl = null;\n        }\n        if (clipPaths && clipPaths.length) {\n            flushPathDrawn(ctx, scope);\n            ctx.save();\n            updateClipStatus(clipPaths, ctx, scope);\n            forceSetTransform = true;\n        }\n        scope.prevElClipPaths = clipPaths;\n    }\n    if (scope.allClipped) {\n        el.__isRendered = false;\n        return;\n    }\n    el.beforeBrush && el.beforeBrush();\n    el.innerBeforeBrush();\n    var prevEl = scope.prevEl;\n    if (!prevEl) {\n        forceSetStyle = forceSetTransform = true;\n    }\n    var canBatchPath = el instanceof Path\n        && el.autoBatch\n        && canPathBatch(el.style);\n    if (forceSetTransform || isTransformChanged(m, prevEl.transform)) {\n        flushPathDrawn(ctx, scope);\n        setContextTransform(ctx, el);\n    }\n    else if (!canBatchPath) {\n        flushPathDrawn(ctx, scope);\n    }\n    var style = getStyle(el, scope.inHover);\n    if (el instanceof Path) {\n        if (scope.lastDrawType !== DRAW_TYPE_PATH) {\n            forceSetStyle = true;\n            scope.lastDrawType = DRAW_TYPE_PATH;\n        }\n        bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope);\n        if (!canBatchPath || (!scope.batchFill && !scope.batchStroke)) {\n            ctx.beginPath();\n        }\n        brushPath(ctx, el, style, canBatchPath);\n        if (canBatchPath) {\n            scope.batchFill = style.fill || '';\n            scope.batchStroke = style.stroke || '';\n        }\n    }\n    else {\n        if (el instanceof TSpan) {\n            if (scope.lastDrawType !== DRAW_TYPE_TEXT) {\n                forceSetStyle = true;\n                scope.lastDrawType = DRAW_TYPE_TEXT;\n            }\n            bindPathAndTextCommonStyle(ctx, el, prevEl, forceSetStyle, scope);\n            brushText(ctx, el, style);\n        }\n        else if (el instanceof ZRImage) {\n            if (scope.lastDrawType !== DRAW_TYPE_IMAGE) {\n                forceSetStyle = true;\n                scope.lastDrawType = DRAW_TYPE_IMAGE;\n            }\n            bindImageStyle(ctx, el, prevEl, forceSetStyle, scope);\n            brushImage(ctx, el, style);\n        }\n        else if (el.getTemporalDisplayables) {\n            if (scope.lastDrawType !== DRAW_TYPE_INCREMENTAL) {\n                forceSetStyle = true;\n                scope.lastDrawType = DRAW_TYPE_INCREMENTAL;\n            }\n            brushIncremental(ctx, el, scope);\n        }\n    }\n    if (canBatchPath && isLast) {\n        flushPathDrawn(ctx, scope);\n    }\n    el.innerAfterBrush();\n    el.afterBrush && el.afterBrush();\n    scope.prevEl = el;\n    el.__dirty = 0;\n    el.__isRendered = true;\n}\nfunction brushIncremental(ctx, el, scope) {\n    var displayables = el.getDisplayables();\n    var temporalDisplayables = el.getTemporalDisplayables();\n    ctx.save();\n    var innerScope = {\n        prevElClipPaths: null,\n        prevEl: null,\n        allClipped: false,\n        viewWidth: scope.viewWidth,\n        viewHeight: scope.viewHeight,\n        inHover: scope.inHover\n    };\n    var i;\n    var len;\n    for (i = el.getCursor(), len = displayables.length; i < len; i++) {\n        var displayable = displayables[i];\n        displayable.beforeBrush && displayable.beforeBrush();\n        displayable.innerBeforeBrush();\n        brush(ctx, displayable, innerScope, i === len - 1);\n        displayable.innerAfterBrush();\n        displayable.afterBrush && displayable.afterBrush();\n        innerScope.prevEl = displayable;\n    }\n    for (var i_1 = 0, len_1 = temporalDisplayables.length; i_1 < len_1; i_1++) {\n        var displayable = temporalDisplayables[i_1];\n        displayable.beforeBrush && displayable.beforeBrush();\n        displayable.innerBeforeBrush();\n        brush(ctx, displayable, innerScope, i_1 === len_1 - 1);\n        displayable.innerAfterBrush();\n        displayable.afterBrush && displayable.afterBrush();\n        innerScope.prevEl = displayable;\n    }\n    el.clearTemporalDisplayables();\n    el.notClear = true;\n    ctx.restore();\n}\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport WeakMap from 'zrender/lib/core/WeakMap.js';\nimport LRU from 'zrender/lib/core/LRU.js';\nimport { defaults, map, isArray, isString, isNumber } from 'zrender/lib/core/util.js';\nimport { getLeastCommonMultiple } from './number.js';\nimport { createSymbol } from './symbol.js';\nimport { brushSingle } from 'zrender/lib/canvas/graphic.js';\nimport { platformApi } from 'zrender/lib/core/platform.js';\nvar decalMap = new WeakMap();\nvar decalCache = new LRU(100);\nvar decalKeys = ['symbol', 'symbolSize', 'symbolKeepAspect', 'color', 'backgroundColor', 'dashArrayX', 'dashArrayY', 'maxTileWidth', 'maxTileHeight'];\n/**\n * Create or update pattern image from decal options\n *\n * @param {InnerDecalObject | 'none'} decalObject decal options, 'none' if no decal\n * @return {Pattern} pattern with generated image, null if no decal\n */\nexport function createOrUpdatePatternFromDecal(decalObject, api) {\n  if (decalObject === 'none') {\n    return null;\n  }\n  var dpr = api.getDevicePixelRatio();\n  var zr = api.getZr();\n  var isSVG = zr.painter.type === 'svg';\n  if (decalObject.dirty) {\n    decalMap[\"delete\"](decalObject);\n  }\n  var oldPattern = decalMap.get(decalObject);\n  if (oldPattern) {\n    return oldPattern;\n  }\n  var decalOpt = defaults(decalObject, {\n    symbol: 'rect',\n    symbolSize: 1,\n    symbolKeepAspect: true,\n    color: 'rgba(0, 0, 0, 0.2)',\n    backgroundColor: null,\n    dashArrayX: 5,\n    dashArrayY: 5,\n    rotation: 0,\n    maxTileWidth: 512,\n    maxTileHeight: 512\n  });\n  if (decalOpt.backgroundColor === 'none') {\n    decalOpt.backgroundColor = null;\n  }\n  var pattern = {\n    repeat: 'repeat'\n  };\n  setPatternnSource(pattern);\n  pattern.rotation = decalOpt.rotation;\n  pattern.scaleX = pattern.scaleY = isSVG ? 1 : 1 / dpr;\n  decalMap.set(decalObject, pattern);\n  decalObject.dirty = false;\n  return pattern;\n  function setPatternnSource(pattern) {\n    var keys = [dpr];\n    var isValidKey = true;\n    for (var i = 0; i < decalKeys.length; ++i) {\n      var value = decalOpt[decalKeys[i]];\n      if (value != null && !isArray(value) && !isString(value) && !isNumber(value) && typeof value !== 'boolean') {\n        isValidKey = false;\n        break;\n      }\n      keys.push(value);\n    }\n    var cacheKey;\n    if (isValidKey) {\n      cacheKey = keys.join(',') + (isSVG ? '-svg' : '');\n      var cache = decalCache.get(cacheKey);\n      if (cache) {\n        isSVG ? pattern.svgElement = cache : pattern.image = cache;\n      }\n    }\n    var dashArrayX = normalizeDashArrayX(decalOpt.dashArrayX);\n    var dashArrayY = normalizeDashArrayY(decalOpt.dashArrayY);\n    var symbolArray = normalizeSymbolArray(decalOpt.symbol);\n    var lineBlockLengthsX = getLineBlockLengthX(dashArrayX);\n    var lineBlockLengthY = getLineBlockLengthY(dashArrayY);\n    var canvas = !isSVG && platformApi.createCanvas();\n    var svgRoot = isSVG && {\n      tag: 'g',\n      attrs: {},\n      key: 'dcl',\n      children: []\n    };\n    var pSize = getPatternSize();\n    var ctx;\n    if (canvas) {\n      canvas.width = pSize.width * dpr;\n      canvas.height = pSize.height * dpr;\n      ctx = canvas.getContext('2d');\n    }\n    brushDecal();\n    if (isValidKey) {\n      decalCache.put(cacheKey, canvas || svgRoot);\n    }\n    pattern.image = canvas;\n    pattern.svgElement = svgRoot;\n    pattern.svgWidth = pSize.width;\n    pattern.svgHeight = pSize.height;\n    /**\n     * Get minimum length that can make a repeatable pattern.\n     *\n     * @return {Object} pattern width and height\n     */\n    function getPatternSize() {\n      /**\n       * For example, if dash is [[3, 2], [2, 1]] for X, it looks like\n       * |---  ---  ---  ---  --- ...\n       * |-- -- -- -- -- -- -- -- ...\n       * |---  ---  ---  ---  --- ...\n       * |-- -- -- -- -- -- -- -- ...\n       * So the minimum length of X is 15,\n       * which is the least common multiple of `3 + 2` and `2 + 1`\n       * |---  ---  ---  |---  --- ...\n       * |-- -- -- -- -- |-- -- -- ...\n       */\n      var width = 1;\n      for (var i = 0, xlen = lineBlockLengthsX.length; i < xlen; ++i) {\n        width = getLeastCommonMultiple(width, lineBlockLengthsX[i]);\n      }\n      var symbolRepeats = 1;\n      for (var i = 0, xlen = symbolArray.length; i < xlen; ++i) {\n        symbolRepeats = getLeastCommonMultiple(symbolRepeats, symbolArray[i].length);\n      }\n      width *= symbolRepeats;\n      var height = lineBlockLengthY * lineBlockLengthsX.length * symbolArray.length;\n      if (process.env.NODE_ENV !== 'production') {\n        var warn = function (attrName) {\n          /* eslint-disable-next-line */\n          console.warn(\"Calculated decal size is greater than \" + attrName + \" due to decal option settings so \" + attrName + \" is used for the decal size. Please consider changing the decal option to make a smaller decal or set \" + attrName + \" to be larger to avoid incontinuity.\");\n        };\n        if (width > decalOpt.maxTileWidth) {\n          warn('maxTileWidth');\n        }\n        if (height > decalOpt.maxTileHeight) {\n          warn('maxTileHeight');\n        }\n      }\n      return {\n        width: Math.max(1, Math.min(width, decalOpt.maxTileWidth)),\n        height: Math.max(1, Math.min(height, decalOpt.maxTileHeight))\n      };\n    }\n    function brushDecal() {\n      if (ctx) {\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n        if (decalOpt.backgroundColor) {\n          ctx.fillStyle = decalOpt.backgroundColor;\n          ctx.fillRect(0, 0, canvas.width, canvas.height);\n        }\n      }\n      var ySum = 0;\n      for (var i = 0; i < dashArrayY.length; ++i) {\n        ySum += dashArrayY[i];\n      }\n      if (ySum <= 0) {\n        // dashArrayY is 0, draw nothing\n        return;\n      }\n      var y = -lineBlockLengthY;\n      var yId = 0;\n      var yIdTotal = 0;\n      var xId0 = 0;\n      while (y < pSize.height) {\n        if (yId % 2 === 0) {\n          var symbolYId = yIdTotal / 2 % symbolArray.length;\n          var x = 0;\n          var xId1 = 0;\n          var xId1Total = 0;\n          while (x < pSize.width * 2) {\n            var xSum = 0;\n            for (var i = 0; i < dashArrayX[xId0].length; ++i) {\n              xSum += dashArrayX[xId0][i];\n            }\n            if (xSum <= 0) {\n              // Skip empty line\n              break;\n            }\n            // E.g., [15, 5, 20, 5] draws only for 15 and 20\n            if (xId1 % 2 === 0) {\n              var size = (1 - decalOpt.symbolSize) * 0.5;\n              var left = x + dashArrayX[xId0][xId1] * size;\n              var top_1 = y + dashArrayY[yId] * size;\n              var width = dashArrayX[xId0][xId1] * decalOpt.symbolSize;\n              var height = dashArrayY[yId] * decalOpt.symbolSize;\n              var symbolXId = xId1Total / 2 % symbolArray[symbolYId].length;\n              brushSymbol(left, top_1, width, height, symbolArray[symbolYId][symbolXId]);\n            }\n            x += dashArrayX[xId0][xId1];\n            ++xId1Total;\n            ++xId1;\n            if (xId1 === dashArrayX[xId0].length) {\n              xId1 = 0;\n            }\n          }\n          ++xId0;\n          if (xId0 === dashArrayX.length) {\n            xId0 = 0;\n          }\n        }\n        y += dashArrayY[yId];\n        ++yIdTotal;\n        ++yId;\n        if (yId === dashArrayY.length) {\n          yId = 0;\n        }\n      }\n      function brushSymbol(x, y, width, height, symbolType) {\n        var scale = isSVG ? 1 : dpr;\n        var symbol = createSymbol(symbolType, x * scale, y * scale, width * scale, height * scale, decalOpt.color, decalOpt.symbolKeepAspect);\n        if (isSVG) {\n          var symbolVNode = zr.painter.renderOneToVNode(symbol);\n          if (symbolVNode) {\n            svgRoot.children.push(symbolVNode);\n          }\n        } else {\n          // Paint to canvas for all other renderers.\n          brushSingle(ctx, symbol);\n        }\n      }\n    }\n  }\n}\n/**\n * Convert symbol array into normalized array\n *\n * @param {string | (string | string[])[]} symbol symbol input\n * @return {string[][]} normolized symbol array\n */\nfunction normalizeSymbolArray(symbol) {\n  if (!symbol || symbol.length === 0) {\n    return [['rect']];\n  }\n  if (isString(symbol)) {\n    return [[symbol]];\n  }\n  var isAllString = true;\n  for (var i = 0; i < symbol.length; ++i) {\n    if (!isString(symbol[i])) {\n      isAllString = false;\n      break;\n    }\n  }\n  if (isAllString) {\n    return normalizeSymbolArray([symbol]);\n  }\n  var result = [];\n  for (var i = 0; i < symbol.length; ++i) {\n    if (isString(symbol[i])) {\n      result.push([symbol[i]]);\n    } else {\n      result.push(symbol[i]);\n    }\n  }\n  return result;\n}\n/**\n * Convert dash input into dashArray\n *\n * @param {DecalDashArrayX} dash dash input\n * @return {number[][]} normolized dash array\n */\nfunction normalizeDashArrayX(dash) {\n  if (!dash || dash.length === 0) {\n    return [[0, 0]];\n  }\n  if (isNumber(dash)) {\n    var dashValue = Math.ceil(dash);\n    return [[dashValue, dashValue]];\n  }\n  /**\n   * [20, 5] should be normalized into [[20, 5]],\n   * while [20, [5, 10]] should be normalized into [[20, 20], [5, 10]]\n   */\n  var isAllNumber = true;\n  for (var i = 0; i < dash.length; ++i) {\n    if (!isNumber(dash[i])) {\n      isAllNumber = false;\n      break;\n    }\n  }\n  if (isAllNumber) {\n    return normalizeDashArrayX([dash]);\n  }\n  var result = [];\n  for (var i = 0; i < dash.length; ++i) {\n    if (isNumber(dash[i])) {\n      var dashValue = Math.ceil(dash[i]);\n      result.push([dashValue, dashValue]);\n    } else {\n      var dashValue = map(dash[i], function (n) {\n        return Math.ceil(n);\n      });\n      if (dashValue.length % 2 === 1) {\n        // [4, 2, 1] means |----  -    -- |----  -    -- |\n        // so normalize it to be [4, 2, 1, 4, 2, 1]\n        result.push(dashValue.concat(dashValue));\n      } else {\n        result.push(dashValue);\n      }\n    }\n  }\n  return result;\n}\n/**\n * Convert dash input into dashArray\n *\n * @param {DecalDashArrayY} dash dash input\n * @return {number[]} normolized dash array\n */\nfunction normalizeDashArrayY(dash) {\n  if (!dash || typeof dash === 'object' && dash.length === 0) {\n    return [0, 0];\n  }\n  if (isNumber(dash)) {\n    var dashValue_1 = Math.ceil(dash);\n    return [dashValue_1, dashValue_1];\n  }\n  var dashValue = map(dash, function (n) {\n    return Math.ceil(n);\n  });\n  return dash.length % 2 ? dashValue.concat(dashValue) : dashValue;\n}\n/**\n * Get block length of each line. A block is the length of dash line and space.\n * For example, a line with [4, 1] has a dash line of 4 and a space of 1 after\n * that, so the block length of this line is 5.\n *\n * @param {number[][]} dash dash array of X or Y\n * @return {number[]} block length of each line\n */\nfunction getLineBlockLengthX(dash) {\n  return map(dash, function (line) {\n    return getLineBlockLengthY(line);\n  });\n}\nfunction getLineBlockLengthY(dash) {\n  var blockLength = 0;\n  for (var i = 0; i < dash.length; ++i) {\n    blockLength += dash[i];\n  }\n  if (dash.length % 2 === 1) {\n    // [4, 2, 1] means |----  -    -- |----  -    -- |\n    // So total length is (4 + 2 + 1) * 2\n    return blockLength * 2;\n  }\n  return blockLength;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createOrUpdatePatternFromDecal } from '../util/decal.js';\nexport default function decalVisual(ecModel, api) {\n  ecModel.eachRawSeries(function (seriesModel) {\n    if (ecModel.isSeriesFiltered(seriesModel)) {\n      return;\n    }\n    var data = seriesModel.getData();\n    if (data.hasItemVisual()) {\n      data.each(function (idx) {\n        var decal = data.getItemVisual(idx, 'decal');\n        if (decal) {\n          var itemStyle = data.ensureUniqueItemVisual(idx, 'style');\n          itemStyle.decal = createOrUpdatePatternFromDecal(decal, api);\n        }\n      });\n    }\n    var decal = data.getVisual('decal');\n    if (decal) {\n      var style = data.getVisual('style');\n      style.decal = createOrUpdatePatternFromDecal(decal, api);\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport Eventful from 'zrender/lib/core/Eventful.js';\n;\nvar lifecycle = new Eventful();\nexport default lifecycle;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { error } from '../util/log.js';\n// Implementation of exported APIs. For example registerMap, getMap.\n// The implementations will be registered when installing the component.\n// Avoid these code being bundled to the core module.\nvar implsStore = {};\n// TODO Type\nexport function registerImpl(name, impl) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (implsStore[name]) {\n      error(\"Already has an implementation of \" + name + \".\");\n    }\n  }\n  implsStore[name] = impl;\n}\nexport function getImpl(name) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (!implsStore[name]) {\n      error(\"Implementation of \" + name + \" doesn't exists.\");\n    }\n  }\n  return implsStore[name];\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar customRenderers = {};\nexport function registerCustomSeries(type, renderItem) {\n  customRenderers[type] = renderItem;\n}\nexport function getCustomSeries(type) {\n  return customRenderers[type];\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nimport { __extends } from \"tslib\";\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrender from 'zrender/lib/zrender.js';\nimport { assert, each, isFunction, isObject, indexOf, bind, clone, setAsPrimitive, extend, createHashMap, map, defaults, isDom, isArray, noop, isString, retrieve2 } from 'zrender/lib/core/util.js';\nimport env from 'zrender/lib/core/env.js';\nimport timsort from 'zrender/lib/core/timsort.js';\nimport Eventful from 'zrender/lib/core/Eventful.js';\nimport GlobalModel from '../model/Global.js';\nimport ExtensionAPI from './ExtensionAPI.js';\nimport CoordinateSystemManager from './CoordinateSystem.js';\nimport OptionManager from '../model/OptionManager.js';\nimport backwardCompat from '../preprocessor/backwardCompat.js';\nimport dataStack from '../processor/dataStack.js';\nimport SeriesModel from '../model/Series.js';\nimport ComponentView from '../view/Component.js';\nimport ChartView from '../view/Chart.js';\nimport * as graphic from '../util/graphic.js';\nimport { getECData } from '../util/innerStore.js';\nimport { isHighDownDispatcher, HOVER_STATE_EMPHASIS, HOVER_STATE_BLUR, blurSeriesFromHighlightPayload, toggleSelectionFromPayload, updateSeriesElementSelection, getAllSelectedIndices, isSelectChangePayload, isHighDownPayload, HIGHLIGHT_ACTION_TYPE, DOWNPLAY_ACTION_TYPE, SELECT_ACTION_TYPE, UNSELECT_ACTION_TYPE, TOGGLE_SELECT_ACTION_TYPE, savePathStates, enterEmphasis, leaveEmphasis, leaveBlur, enterSelect, leaveSelect, enterBlur, allLeaveBlur, findComponentHighDownDispatchers, blurComponent, handleGlobalMouseOverForHighDown, handleGlobalMouseOutForHighDown, SELECT_CHANGED_EVENT_TYPE } from '../util/states.js';\nimport * as modelUtil from '../util/model.js';\nimport { throttle } from '../util/throttle.js';\nimport { seriesStyleTask, dataStyleTask, dataColorPaletteTask } from '../visual/style.js';\nimport loadingDefault from '../loading/default.js';\nimport Scheduler from './Scheduler.js';\nimport darkTheme from '../theme/dark.js';\nimport { parseClassType } from '../util/clazz.js';\nimport { ECEventProcessor } from '../util/ECEventProcessor.js';\nimport { seriesSymbolTask, dataSymbolTask } from '../visual/symbol.js';\nimport { getVisualFromData, getItemVisualFromData } from '../visual/helper.js';\nimport { deprecateLog, deprecateReplaceLog, error, warn } from '../util/log.js';\nimport { handleLegacySelectEvents } from '../legacy/dataSelectAction.js';\nimport { registerExternalTransform } from '../data/helper/transform.js';\nimport { createLocaleObject, SYSTEM_LANG } from './locale.js';\nimport { findEventDispatcher } from '../util/event.js';\nimport decal from '../visual/decal.js';\nimport lifecycle from './lifecycle.js';\nimport { platformApi, setPlatformAPI } from 'zrender/lib/core/platform.js';\nimport { getImpl } from './impl.js';\nimport { registerCustomSeries as registerCustom } from '../chart/custom/customSeriesRegister.js';\nexport var version = '6.0.0';\nexport var dependencies = {\n  zrender: '6.0.0'\n};\nvar TEST_FRAME_REMAIN_TIME = 1;\nvar PRIORITY_PROCESSOR_SERIES_FILTER = 800;\n// Some data processors depends on the stack result dimension (to calculate data extent).\n// So data stack stage should be in front of data processing stage.\nvar PRIORITY_PROCESSOR_DATASTACK = 900;\n// \"Data filter\" will block the stream, so it should be\n// put at the beginning of data processing.\nvar PRIORITY_PROCESSOR_FILTER = 1000;\nvar PRIORITY_PROCESSOR_DEFAULT = 2000;\nvar PRIORITY_PROCESSOR_STATISTIC = 5000;\nvar PRIORITY_VISUAL_LAYOUT = 1000;\nvar PRIORITY_VISUAL_PROGRESSIVE_LAYOUT = 1100;\nvar PRIORITY_VISUAL_GLOBAL = 2000;\nvar PRIORITY_VISUAL_CHART = 3000;\nvar PRIORITY_VISUAL_COMPONENT = 4000;\n// Visual property in data. Greater than `PRIORITY_VISUAL_COMPONENT` to enable to\n// overwrite the viusal result of component (like `visualMap`)\n// using data item specific setting (like itemStyle.xxx on data item)\nvar PRIORITY_VISUAL_CHART_DATA_CUSTOM = 4500;\n// Greater than `PRIORITY_VISUAL_CHART_DATA_CUSTOM` to enable to layout based on\n// visual result like `symbolSize`.\nvar PRIORITY_VISUAL_POST_CHART_LAYOUT = 4600;\nvar PRIORITY_VISUAL_BRUSH = 5000;\nvar PRIORITY_VISUAL_ARIA = 6000;\nvar PRIORITY_VISUAL_DECAL = 7000;\nexport var PRIORITY = {\n  PROCESSOR: {\n    FILTER: PRIORITY_PROCESSOR_FILTER,\n    SERIES_FILTER: PRIORITY_PROCESSOR_SERIES_FILTER,\n    STATISTIC: PRIORITY_PROCESSOR_STATISTIC\n  },\n  VISUAL: {\n    LAYOUT: PRIORITY_VISUAL_LAYOUT,\n    PROGRESSIVE_LAYOUT: PRIORITY_VISUAL_PROGRESSIVE_LAYOUT,\n    GLOBAL: PRIORITY_VISUAL_GLOBAL,\n    CHART: PRIORITY_VISUAL_CHART,\n    POST_CHART_LAYOUT: PRIORITY_VISUAL_POST_CHART_LAYOUT,\n    COMPONENT: PRIORITY_VISUAL_COMPONENT,\n    BRUSH: PRIORITY_VISUAL_BRUSH,\n    CHART_ITEM: PRIORITY_VISUAL_CHART_DATA_CUSTOM,\n    ARIA: PRIORITY_VISUAL_ARIA,\n    DECAL: PRIORITY_VISUAL_DECAL\n  }\n};\n// Main process have three entries: `setOption`, `dispatchAction` and `resize`,\n// where they must not be invoked nestedly, except the only case: invoke\n// dispatchAction with updateMethod \"none\" in main process.\n// This flag is used to carry out this rule.\n// All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).\nvar IN_MAIN_PROCESS_KEY = '__flagInMainProcess';\n// Useful for detecting outdated rendering results in scenarios that these issues are involved:\n//  - Use shortcut (such as, updateTransform, or no update) to start a main process.\n//  - Asynchronously update rendered view (e.g., graph force layout).\n//  - Multiple ChartView/ComponentView render to one group cooperatively.\nvar MAIN_PROCESS_VERSION_KEY = '__mainProcessVersion';\nvar PENDING_UPDATE = '__pendingUpdate';\nvar STATUS_NEEDS_UPDATE_KEY = '__needsUpdateStatus';\nvar ACTION_REG = /^[a-zA-Z0-9_]+$/;\nvar CONNECT_STATUS_KEY = '__connectUpdateStatus';\nvar CONNECT_STATUS_PENDING = 0;\nvar CONNECT_STATUS_UPDATING = 1;\nvar CONNECT_STATUS_UPDATED = 2;\n;\n;\nfunction createRegisterEventWithLowercaseECharts(method) {\n  return function () {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args[_i] = arguments[_i];\n    }\n    if (this.isDisposed()) {\n      disposedWarning(this.id);\n      return;\n    }\n    return toLowercaseNameAndCallEventful(this, method, args);\n  };\n}\nfunction createRegisterEventWithLowercaseMessageCenter(method) {\n  return function () {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args[_i] = arguments[_i];\n    }\n    return toLowercaseNameAndCallEventful(this, method, args);\n  };\n}\nfunction toLowercaseNameAndCallEventful(host, method, args) {\n  // `args[0]` is event name. Event name is all lowercase.\n  args[0] = args[0] && args[0].toLowerCase();\n  return Eventful.prototype[method].apply(host, args);\n}\nvar MessageCenter = /** @class */function (_super) {\n  __extends(MessageCenter, _super);\n  function MessageCenter() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  return MessageCenter;\n}(Eventful);\nvar messageCenterProto = MessageCenter.prototype;\nmessageCenterProto.on = createRegisterEventWithLowercaseMessageCenter('on');\nmessageCenterProto.off = createRegisterEventWithLowercaseMessageCenter('off');\n// ---------------------------------------\n// Internal method names for class ECharts\n// ---------------------------------------\nvar prepare;\nvar prepareView;\nvar updateDirectly;\nvar updateMethods;\nvar doConvertPixel;\nvar updateStreamModes;\nvar doDispatchAction;\nvar flushPendingActions;\nvar triggerUpdatedEvent;\nvar bindRenderedEvent;\nvar bindMouseEvent;\nvar render;\nvar renderComponents;\nvar renderSeries;\nvar createExtensionAPI;\nvar enableConnect;\nvar markStatusToUpdate;\nvar applyChangedStates;\nvar updateMainProcessVersion;\nvar ECharts = /** @class */function (_super) {\n  __extends(ECharts, _super);\n  function ECharts(dom,\n  // Theme name or themeOption.\n  theme, opts) {\n    var _this = _super.call(this, new ECEventProcessor()) || this;\n    _this._chartsViews = [];\n    _this._chartsMap = {};\n    _this._componentsViews = [];\n    _this._componentsMap = {};\n    // Can't dispatch action during rendering procedure\n    _this._pendingActions = [];\n    opts = opts || {};\n    _this._dom = dom;\n    var defaultRenderer = 'canvas';\n    var defaultCoarsePointer = 'auto';\n    var defaultUseDirtyRect = false;\n    _this[MAIN_PROCESS_VERSION_KEY] = 1;\n    if (process.env.NODE_ENV !== 'production') {\n      var root = /* eslint-disable-next-line */\n      env.hasGlobalWindow ? window : global;\n      if (root) {\n        defaultRenderer = retrieve2(root.__ECHARTS__DEFAULT__RENDERER__, defaultRenderer);\n        defaultCoarsePointer = retrieve2(root.__ECHARTS__DEFAULT__COARSE_POINTER, defaultCoarsePointer);\n        defaultUseDirtyRect = retrieve2(root.__ECHARTS__DEFAULT__USE_DIRTY_RECT__, defaultUseDirtyRect);\n      }\n    }\n    if (opts.ssr) {\n      zrender.registerSSRDataGetter(function (el) {\n        var ecData = getECData(el);\n        var dataIndex = ecData.dataIndex;\n        if (dataIndex == null) {\n          return;\n        }\n        var hashMap = createHashMap();\n        hashMap.set('series_index', ecData.seriesIndex);\n        hashMap.set('data_index', dataIndex);\n        ecData.ssrType && hashMap.set('ssr_type', ecData.ssrType);\n        return hashMap;\n      });\n    }\n    var zr = _this._zr = zrender.init(dom, {\n      renderer: opts.renderer || defaultRenderer,\n      devicePixelRatio: opts.devicePixelRatio,\n      width: opts.width,\n      height: opts.height,\n      ssr: opts.ssr,\n      useDirtyRect: retrieve2(opts.useDirtyRect, defaultUseDirtyRect),\n      useCoarsePointer: retrieve2(opts.useCoarsePointer, defaultCoarsePointer),\n      pointerSize: opts.pointerSize\n    });\n    _this._ssr = opts.ssr;\n    // Expect 60 fps.\n    _this._throttledZrFlush = throttle(bind(zr.flush, zr), 17);\n    _this._updateTheme(theme);\n    _this._locale = createLocaleObject(opts.locale || SYSTEM_LANG);\n    _this._coordSysMgr = new CoordinateSystemManager();\n    var api = _this._api = createExtensionAPI(_this);\n    // Sort on demand\n    function prioritySortFunc(a, b) {\n      return a.__prio - b.__prio;\n    }\n    timsort(visualFuncs, prioritySortFunc);\n    timsort(dataProcessorFuncs, prioritySortFunc);\n    _this._scheduler = new Scheduler(_this, api, dataProcessorFuncs, visualFuncs);\n    _this._messageCenter = new MessageCenter();\n    // Init mouse events\n    _this._initEvents();\n    // In case some people write `window.onresize = chart.resize`\n    _this.resize = bind(_this.resize, _this);\n    zr.animation.on('frame', _this._onframe, _this);\n    bindRenderedEvent(zr, _this);\n    bindMouseEvent(zr, _this);\n    // ECharts instance can be used as value.\n    setAsPrimitive(_this);\n    return _this;\n  }\n  ECharts.prototype._onframe = function () {\n    if (this._disposed) {\n      return;\n    }\n    applyChangedStates(this);\n    var scheduler = this._scheduler;\n    // Lazy update\n    if (this[PENDING_UPDATE]) {\n      var silent = this[PENDING_UPDATE].silent;\n      this[IN_MAIN_PROCESS_KEY] = true;\n      updateMainProcessVersion(this);\n      try {\n        prepare(this);\n        updateMethods.update.call(this, null, this[PENDING_UPDATE].updateParams);\n      } catch (e) {\n        this[IN_MAIN_PROCESS_KEY] = false;\n        this[PENDING_UPDATE] = null;\n        throw e;\n      }\n      // At present, in each frame, zrender performs:\n      //   (1) animation step forward.\n      //   (2) trigger('frame') (where this `_onframe` is called)\n      //   (3) zrender flush (render).\n      // If we do nothing here, since we use `setToFinal: true`, the step (3) above\n      // will render the final state of the elements before the real animation started.\n      this._zr.flush();\n      this[IN_MAIN_PROCESS_KEY] = false;\n      this[PENDING_UPDATE] = null;\n      flushPendingActions.call(this, silent);\n      triggerUpdatedEvent.call(this, silent);\n    }\n    // Avoid do both lazy update and progress in one frame.\n    else if (scheduler.unfinished) {\n      // Stream progress.\n      var remainTime = TEST_FRAME_REMAIN_TIME;\n      var ecModel = this._model;\n      var api = this._api;\n      scheduler.unfinished = false;\n      do {\n        var startTime = +new Date();\n        scheduler.performSeriesTasks(ecModel);\n        // Currently dataProcessorFuncs do not check threshold.\n        scheduler.performDataProcessorTasks(ecModel);\n        updateStreamModes(this, ecModel);\n        // Do not update coordinate system here. Because that coord system update in\n        // each frame is not a good user experience. So we follow the rule that\n        // the extent of the coordinate system is determined in the first frame (the\n        // frame is executed immediately after task reset.\n        // this._coordSysMgr.update(ecModel, api);\n        // console.log('--- ec frame visual ---', remainTime);\n        scheduler.performVisualTasks(ecModel);\n        renderSeries(this, this._model, api, 'remain', {});\n        remainTime -= +new Date() - startTime;\n      } while (remainTime > 0 && scheduler.unfinished);\n      // Call flush explicitly for trigger finished event.\n      if (!scheduler.unfinished) {\n        this._zr.flush();\n      }\n      // Else, zr flushing be ensue within the same frame,\n      // because zr flushing is after onframe event.\n    }\n  };\n  ECharts.prototype.getDom = function () {\n    return this._dom;\n  };\n  ECharts.prototype.getId = function () {\n    return this.id;\n  };\n  ECharts.prototype.getZr = function () {\n    return this._zr;\n  };\n  ECharts.prototype.isSSR = function () {\n    return this._ssr;\n  };\n  /* eslint-disable-next-line */\n  ECharts.prototype.setOption = function (option, notMerge, lazyUpdate) {\n    if (this[IN_MAIN_PROCESS_KEY]) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('`setOption` should not be called during main process.');\n      }\n      return;\n    }\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    var silent;\n    var replaceMerge;\n    var transitionOpt;\n    if (isObject(notMerge)) {\n      lazyUpdate = notMerge.lazyUpdate;\n      silent = notMerge.silent;\n      replaceMerge = notMerge.replaceMerge;\n      transitionOpt = notMerge.transition;\n      notMerge = notMerge.notMerge;\n    }\n    this[IN_MAIN_PROCESS_KEY] = true;\n    updateMainProcessVersion(this);\n    if (!this._model || notMerge) {\n      var optionManager = new OptionManager(this._api);\n      var theme = this._theme;\n      var ecModel = this._model = new GlobalModel();\n      ecModel.scheduler = this._scheduler;\n      ecModel.ssr = this._ssr;\n      ecModel.init(null, null, null, theme, this._locale, optionManager);\n    }\n    this._model.setOption(option, {\n      replaceMerge: replaceMerge\n    }, optionPreprocessorFuncs);\n    var updateParams = {\n      seriesTransition: transitionOpt,\n      optionChanged: true\n    };\n    if (lazyUpdate) {\n      this[PENDING_UPDATE] = {\n        silent: silent,\n        updateParams: updateParams\n      };\n      this[IN_MAIN_PROCESS_KEY] = false;\n      // `setOption(option, {lazyMode: true})` may be called when zrender has been slept.\n      // It should wake it up to make sure zrender start to render at the next frame.\n      this.getZr().wakeUp();\n    } else {\n      try {\n        prepare(this);\n        updateMethods.update.call(this, null, updateParams);\n      } catch (e) {\n        this[PENDING_UPDATE] = null;\n        this[IN_MAIN_PROCESS_KEY] = false;\n        throw e;\n      }\n      // Ensure zr refresh sychronously, and then pixel in canvas can be\n      // fetched after `setOption`.\n      if (!this._ssr) {\n        // not use flush when using ssr mode.\n        this._zr.flush();\n      }\n      this[PENDING_UPDATE] = null;\n      this[IN_MAIN_PROCESS_KEY] = false;\n      flushPendingActions.call(this, silent);\n      triggerUpdatedEvent.call(this, silent);\n    }\n  };\n  /**\n   * Update theme with name or theme option and repaint the chart.\n   * @param theme Theme name or theme option.\n   * @param opts Optional settings\n   */\n  ECharts.prototype.setTheme = function (theme, opts) {\n    if (this[IN_MAIN_PROCESS_KEY]) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('`setTheme` should not be called during main process.');\n      }\n      return;\n    }\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    var ecModel = this._model;\n    if (!ecModel) {\n      return;\n    }\n    var silent = opts && opts.silent;\n    var updateParams = null;\n    if (this[PENDING_UPDATE]) {\n      if (silent == null) {\n        silent = this[PENDING_UPDATE].silent;\n      }\n      updateParams = this[PENDING_UPDATE].updateParams;\n      this[PENDING_UPDATE] = null;\n    }\n    this[IN_MAIN_PROCESS_KEY] = true;\n    updateMainProcessVersion(this);\n    try {\n      this._updateTheme(theme);\n      ecModel.setTheme(this._theme);\n      prepare(this);\n      updateMethods.update.call(this, {\n        type: 'setTheme'\n      }, updateParams);\n    } catch (e) {\n      this[IN_MAIN_PROCESS_KEY] = false;\n      throw e;\n    }\n    this[IN_MAIN_PROCESS_KEY] = false;\n    flushPendingActions.call(this, silent);\n    triggerUpdatedEvent.call(this, silent);\n  };\n  ECharts.prototype._updateTheme = function (theme) {\n    if (isString(theme)) {\n      theme = themeStorage[theme];\n    }\n    if (theme) {\n      theme = clone(theme);\n      theme && backwardCompat(theme, true);\n      this._theme = theme;\n    }\n  };\n  // We don't want developers to use getModel directly.\n  ECharts.prototype.getModel = function () {\n    return this._model;\n  };\n  ECharts.prototype.getOption = function () {\n    return this._model && this._model.getOption();\n  };\n  ECharts.prototype.getWidth = function () {\n    return this._zr.getWidth();\n  };\n  ECharts.prototype.getHeight = function () {\n    return this._zr.getHeight();\n  };\n  ECharts.prototype.getDevicePixelRatio = function () {\n    return this._zr.painter.dpr\n    /* eslint-disable-next-line */ || env.hasGlobalWindow && window.devicePixelRatio || 1;\n  };\n  /**\n   * Get canvas which has all thing rendered\n   * @deprecated Use renderToCanvas instead.\n   */\n  ECharts.prototype.getRenderedCanvas = function (opts) {\n    if (process.env.NODE_ENV !== 'production') {\n      deprecateReplaceLog('getRenderedCanvas', 'renderToCanvas');\n    }\n    return this.renderToCanvas(opts);\n  };\n  ECharts.prototype.renderToCanvas = function (opts) {\n    opts = opts || {};\n    var painter = this._zr.painter;\n    if (process.env.NODE_ENV !== 'production') {\n      if (painter.type !== 'canvas') {\n        throw new Error('renderToCanvas can only be used in the canvas renderer.');\n      }\n    }\n    return painter.getRenderedCanvas({\n      backgroundColor: opts.backgroundColor || this._model.get('backgroundColor'),\n      pixelRatio: opts.pixelRatio || this.getDevicePixelRatio()\n    });\n  };\n  ECharts.prototype.renderToSVGString = function (opts) {\n    opts = opts || {};\n    var painter = this._zr.painter;\n    if (process.env.NODE_ENV !== 'production') {\n      if (painter.type !== 'svg') {\n        throw new Error('renderToSVGString can only be used in the svg renderer.');\n      }\n    }\n    return painter.renderToString({\n      useViewBox: opts.useViewBox\n    });\n  };\n  /**\n   * Get svg data url\n   */\n  ECharts.prototype.getSvgDataURL = function () {\n    var zr = this._zr;\n    var list = zr.storage.getDisplayList();\n    // Stop animations\n    each(list, function (el) {\n      el.stopAnimation(null, true);\n    });\n    return zr.painter.toDataURL();\n  };\n  ECharts.prototype.getDataURL = function (opts) {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    opts = opts || {};\n    var excludeComponents = opts.excludeComponents;\n    var ecModel = this._model;\n    var excludesComponentViews = [];\n    var self = this;\n    each(excludeComponents, function (componentType) {\n      ecModel.eachComponent({\n        mainType: componentType\n      }, function (component) {\n        var view = self._componentsMap[component.__viewId];\n        if (!view.group.ignore) {\n          excludesComponentViews.push(view);\n          view.group.ignore = true;\n        }\n      });\n    });\n    var url = this._zr.painter.getType() === 'svg' ? this.getSvgDataURL() : this.renderToCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png'));\n    each(excludesComponentViews, function (view) {\n      view.group.ignore = false;\n    });\n    return url;\n  };\n  ECharts.prototype.getConnectedDataURL = function (opts) {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    var isSvg = opts.type === 'svg';\n    var groupId = this.group;\n    var mathMin = Math.min;\n    var mathMax = Math.max;\n    var MAX_NUMBER = Infinity;\n    if (connectedGroups[groupId]) {\n      var left_1 = MAX_NUMBER;\n      var top_1 = MAX_NUMBER;\n      var right_1 = -MAX_NUMBER;\n      var bottom_1 = -MAX_NUMBER;\n      var canvasList_1 = [];\n      var dpr_1 = opts && opts.pixelRatio || this.getDevicePixelRatio();\n      each(instances, function (chart, id) {\n        if (chart.group === groupId) {\n          var canvas = isSvg ? chart.getZr().painter.getSvgDom().innerHTML : chart.renderToCanvas(clone(opts));\n          var boundingRect = chart.getDom().getBoundingClientRect();\n          left_1 = mathMin(boundingRect.left, left_1);\n          top_1 = mathMin(boundingRect.top, top_1);\n          right_1 = mathMax(boundingRect.right, right_1);\n          bottom_1 = mathMax(boundingRect.bottom, bottom_1);\n          canvasList_1.push({\n            dom: canvas,\n            left: boundingRect.left,\n            top: boundingRect.top\n          });\n        }\n      });\n      left_1 *= dpr_1;\n      top_1 *= dpr_1;\n      right_1 *= dpr_1;\n      bottom_1 *= dpr_1;\n      var width = right_1 - left_1;\n      var height = bottom_1 - top_1;\n      var targetCanvas = platformApi.createCanvas();\n      var zr_1 = zrender.init(targetCanvas, {\n        renderer: isSvg ? 'svg' : 'canvas'\n      });\n      zr_1.resize({\n        width: width,\n        height: height\n      });\n      if (isSvg) {\n        var content_1 = '';\n        each(canvasList_1, function (item) {\n          var x = item.left - left_1;\n          var y = item.top - top_1;\n          content_1 += '<g transform=\"translate(' + x + ',' + y + ')\">' + item.dom + '</g>';\n        });\n        zr_1.painter.getSvgRoot().innerHTML = content_1;\n        if (opts.connectedBackgroundColor) {\n          zr_1.painter.setBackgroundColor(opts.connectedBackgroundColor);\n        }\n        zr_1.refreshImmediately();\n        return zr_1.painter.toDataURL();\n      } else {\n        // Background between the charts\n        if (opts.connectedBackgroundColor) {\n          zr_1.add(new graphic.Rect({\n            shape: {\n              x: 0,\n              y: 0,\n              width: width,\n              height: height\n            },\n            style: {\n              fill: opts.connectedBackgroundColor\n            }\n          }));\n        }\n        each(canvasList_1, function (item) {\n          var img = new graphic.Image({\n            style: {\n              x: item.left * dpr_1 - left_1,\n              y: item.top * dpr_1 - top_1,\n              image: item.dom\n            }\n          });\n          zr_1.add(img);\n        });\n        zr_1.refreshImmediately();\n        return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png'));\n      }\n    } else {\n      return this.getDataURL(opts);\n    }\n  };\n  ECharts.prototype.convertToPixel = function (finder, value, opt) {\n    return doConvertPixel(this, 'convertToPixel', finder, value, opt);\n  };\n  /**\n   * Convert from logical coordinate system to pixel coordinate system.\n   * See CoordinateSystem#convertToPixel.\n   *\n   * @see CoordinateSystem['dataToLayout'] for parameters and return.\n   * @see CoordinateSystemDataCoord\n   */\n  ECharts.prototype.convertToLayout = function (finder, value, opt) {\n    return doConvertPixel(this, 'convertToLayout', finder, value, opt);\n  };\n  // The above are signatures from before v6, thus they should be preserved for backward compat.\n  ECharts.prototype.convertFromPixel = function (finder, value, opt) {\n    return doConvertPixel(this, 'convertFromPixel', finder, value, opt);\n  };\n  /**\n   * Is the specified coordinate systems or components contain the given pixel point.\n   * @param {Array|number} value\n   * @return {boolean} result\n   */\n  ECharts.prototype.containPixel = function (finder, value) {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    var ecModel = this._model;\n    var result;\n    var findResult = modelUtil.parseFinder(ecModel, finder);\n    each(findResult, function (models, key) {\n      key.indexOf('Models') >= 0 && each(models, function (model) {\n        var coordSys = model.coordinateSystem;\n        if (coordSys && coordSys.containPoint) {\n          result = result || !!coordSys.containPoint(value);\n        } else if (key === 'seriesModels') {\n          var view = this._chartsMap[model.__viewId];\n          if (view && view.containPoint) {\n            result = result || view.containPoint(value, model);\n          } else {\n            if (process.env.NODE_ENV !== 'production') {\n              warn(key + ': ' + (view ? 'The found component do not support containPoint.' : 'No view mapping to the found component.'));\n            }\n          }\n        } else {\n          if (process.env.NODE_ENV !== 'production') {\n            warn(key + ': containPoint is not supported');\n          }\n        }\n      }, this);\n    }, this);\n    return !!result;\n  };\n  /**\n   * Get visual from series or data.\n   * @param finder\n   *        If string, e.g., 'series', means {seriesIndex: 0}.\n   *        If Object, could contain some of these properties below:\n   *        {\n   *            seriesIndex / seriesId / seriesName,\n   *            dataIndex / dataIndexInside\n   *        }\n   *        If dataIndex is not specified, series visual will be fetched,\n   *        but not data item visual.\n   *        If all of seriesIndex, seriesId, seriesName are not specified,\n   *        visual will be fetched from first series.\n   * @param visualType 'color', 'symbol', 'symbolSize'\n   */\n  ECharts.prototype.getVisual = function (finder, visualType) {\n    var ecModel = this._model;\n    var parsedFinder = modelUtil.parseFinder(ecModel, finder, {\n      defaultMainType: 'series'\n    });\n    var seriesModel = parsedFinder.seriesModel;\n    if (process.env.NODE_ENV !== 'production') {\n      if (!seriesModel) {\n        warn('There is no specified series model');\n      }\n    }\n    var data = seriesModel.getData();\n    var dataIndexInside = parsedFinder.hasOwnProperty('dataIndexInside') ? parsedFinder.dataIndexInside : parsedFinder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(parsedFinder.dataIndex) : null;\n    return dataIndexInside != null ? getItemVisualFromData(data, dataIndexInside, visualType) : getVisualFromData(data, visualType);\n  };\n  /**\n   * Get view of corresponding component model\n   */\n  ECharts.prototype.getViewOfComponentModel = function (componentModel) {\n    return this._componentsMap[componentModel.__viewId];\n  };\n  /**\n   * Get view of corresponding series model\n   */\n  ECharts.prototype.getViewOfSeriesModel = function (seriesModel) {\n    return this._chartsMap[seriesModel.__viewId];\n  };\n  ECharts.prototype._initEvents = function () {\n    var _this = this;\n    each(MOUSE_EVENT_NAMES, function (eveName) {\n      var handler = function (e) {\n        var ecModel = _this.getModel();\n        var el = e.target;\n        var params;\n        var isGlobalOut = eveName === 'globalout';\n        // no e.target when 'globalout'.\n        if (isGlobalOut) {\n          params = {};\n        } else {\n          el && findEventDispatcher(el, function (parent) {\n            var ecData = getECData(parent);\n            if (ecData && ecData.dataIndex != null) {\n              var dataModel = ecData.dataModel || ecModel.getSeriesByIndex(ecData.seriesIndex);\n              params = dataModel && dataModel.getDataParams(ecData.dataIndex, ecData.dataType, el) || {};\n              return true;\n            }\n            // If element has custom eventData of components\n            else if (ecData.eventData) {\n              params = extend({}, ecData.eventData);\n              return true;\n            }\n          }, true);\n        }\n        // Contract: if params prepared in mouse event,\n        // these properties must be specified:\n        // {\n        //    componentType: string (component main type)\n        //    componentIndex: number\n        // }\n        // Otherwise event query can not work.\n        if (params) {\n          var componentType = params.componentType;\n          var componentIndex = params.componentIndex;\n          // Special handling for historic reason: when trigger by\n          // markLine/markPoint/markArea, the componentType is\n          // 'markLine'/'markPoint'/'markArea', but we should better\n          // enable them to be queried by seriesIndex, since their\n          // option is set in each series.\n          if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') {\n            componentType = 'series';\n            componentIndex = params.seriesIndex;\n          }\n          var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex);\n          var view = model && _this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId];\n          if (process.env.NODE_ENV !== 'production') {\n            // `event.componentType` and `event[componentTpype + 'Index']` must not\n            // be missed, otherwise there is no way to distinguish source component.\n            // See `dataFormat.getDataParams`.\n            if (!isGlobalOut && !(model && view)) {\n              warn('model or view can not be found by params');\n            }\n          }\n          params.event = e;\n          params.type = eveName;\n          _this._$eventProcessor.eventInfo = {\n            targetEl: el,\n            packedEvent: params,\n            model: model,\n            view: view\n          };\n          _this.trigger(eveName, params);\n        }\n      };\n      // Consider that some component (like tooltip, brush, ...)\n      // register zr event handler, but user event handler might\n      // do anything, such as call `setOption` or `dispatchAction`,\n      // which probably update any of the content and probably\n      // cause problem if it is called previous other inner handlers.\n      handler.zrEventfulCallAtLast = true;\n      _this._zr.on(eveName, handler, _this);\n    });\n    var messageCenter = this._messageCenter;\n    each(publicEventTypeMap, function (_, eventType) {\n      messageCenter.on(eventType, function (event) {\n        _this.trigger(eventType, event);\n      });\n    });\n    handleLegacySelectEvents(messageCenter, this, this._api);\n  };\n  ECharts.prototype.isDisposed = function () {\n    return this._disposed;\n  };\n  ECharts.prototype.clear = function () {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    this.setOption({\n      series: []\n    }, true);\n  };\n  ECharts.prototype.dispose = function () {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    this._disposed = true;\n    var dom = this.getDom();\n    if (dom) {\n      modelUtil.setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, '');\n    }\n    var chart = this;\n    var api = chart._api;\n    var ecModel = chart._model;\n    each(chart._componentsViews, function (component) {\n      component.dispose(ecModel, api);\n    });\n    each(chart._chartsViews, function (chart) {\n      chart.dispose(ecModel, api);\n    });\n    // Dispose after all views disposed\n    chart._zr.dispose();\n    // Set properties to null.\n    // To reduce the memory cost in case the top code still holds this instance unexpectedly.\n    chart._dom = chart._model = chart._chartsMap = chart._componentsMap = chart._chartsViews = chart._componentsViews = chart._scheduler = chart._api = chart._zr = chart._throttledZrFlush = chart._theme = chart._coordSysMgr = chart._messageCenter = null;\n    delete instances[chart.id];\n  };\n  /**\n   * Resize the chart\n   */\n  ECharts.prototype.resize = function (opts) {\n    if (this[IN_MAIN_PROCESS_KEY]) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('`resize` should not be called during main process.');\n      }\n      return;\n    }\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    this._zr.resize(opts);\n    var ecModel = this._model;\n    // Resize loading effect\n    this._loadingFX && this._loadingFX.resize();\n    if (!ecModel) {\n      return;\n    }\n    var needPrepare = ecModel.resetOption('media');\n    var silent = opts && opts.silent;\n    // There is some real cases that:\n    // chart.setOption(option, { lazyUpdate: true });\n    // chart.resize();\n    if (this[PENDING_UPDATE]) {\n      if (silent == null) {\n        silent = this[PENDING_UPDATE].silent;\n      }\n      needPrepare = true;\n      this[PENDING_UPDATE] = null;\n    }\n    this[IN_MAIN_PROCESS_KEY] = true;\n    updateMainProcessVersion(this);\n    try {\n      needPrepare && prepare(this);\n      updateMethods.update.call(this, {\n        type: 'resize',\n        animation: extend({\n          // Disable animation\n          duration: 0\n        }, opts && opts.animation)\n      });\n    } catch (e) {\n      this[IN_MAIN_PROCESS_KEY] = false;\n      throw e;\n    }\n    this[IN_MAIN_PROCESS_KEY] = false;\n    flushPendingActions.call(this, silent);\n    triggerUpdatedEvent.call(this, silent);\n  };\n  ECharts.prototype.showLoading = function (name, cfg) {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    if (isObject(name)) {\n      cfg = name;\n      name = '';\n    }\n    name = name || 'default';\n    this.hideLoading();\n    if (!loadingEffects[name]) {\n      if (process.env.NODE_ENV !== 'production') {\n        warn('Loading effects ' + name + ' not exists.');\n      }\n      return;\n    }\n    var el = loadingEffects[name](this._api, cfg);\n    var zr = this._zr;\n    this._loadingFX = el;\n    zr.add(el);\n  };\n  /**\n   * Hide loading effect\n   */\n  ECharts.prototype.hideLoading = function () {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    this._loadingFX && this._zr.remove(this._loadingFX);\n    this._loadingFX = null;\n  };\n  ECharts.prototype.makeActionFromEvent = function (eventObj) {\n    var payload = extend({}, eventObj);\n    payload.type = connectionEventRevertMap[eventObj.type];\n    return payload;\n  };\n  /**\n   * @param opt If pass boolean, means opt.silent\n   * @param opt.silent Default `false`. Whether trigger events.\n   * @param opt.flush Default `undefined`.\n   *        true: Flush immediately, and then pixel in canvas can be fetched\n   *            immediately. Caution: it might affect performance.\n   *        false: Not flush.\n   *        undefined: Auto decide whether perform flush.\n   */\n  ECharts.prototype.dispatchAction = function (payload, opt) {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    if (!isObject(opt)) {\n      opt = {\n        silent: !!opt\n      };\n    }\n    if (!actions[payload.type]) {\n      return;\n    }\n    // Avoid dispatch action before setOption. Especially in `connect`.\n    if (!this._model) {\n      return;\n    }\n    // May dispatchAction in rendering procedure\n    if (this[IN_MAIN_PROCESS_KEY]) {\n      this._pendingActions.push(payload);\n      return;\n    }\n    var silent = opt.silent;\n    doDispatchAction.call(this, payload, silent);\n    var flush = opt.flush;\n    if (flush) {\n      this._zr.flush();\n    } else if (flush !== false && env.browser.weChat) {\n      // In WeChat embedded browser, `requestAnimationFrame` and `setInterval`\n      // hang when sliding page (on touch event), which cause that zr does not\n      // refresh until user interaction finished, which is not expected.\n      // But `dispatchAction` may be called too frequently when pan on touch\n      // screen, which impacts performance if do not throttle them.\n      this._throttledZrFlush();\n    }\n    flushPendingActions.call(this, silent);\n    triggerUpdatedEvent.call(this, silent);\n  };\n  ECharts.prototype.updateLabelLayout = function () {\n    lifecycle.trigger('series:layoutlabels', this._model, this._api, {\n      // Not adding series labels.\n      // TODO\n      updatedSeries: []\n    });\n  };\n  ECharts.prototype.appendData = function (params) {\n    if (this._disposed) {\n      disposedWarning(this.id);\n      return;\n    }\n    var seriesIndex = params.seriesIndex;\n    var ecModel = this.getModel();\n    var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n    if (process.env.NODE_ENV !== 'production') {\n      assert(params.data && seriesModel);\n    }\n    seriesModel.appendData(params);\n    // Note: `appendData` does not support that update extent of coordinate\n    // system, util some scenario require that. In the expected usage of\n    // `appendData`, the initial extent of coordinate system should better\n    // be fixed by axis `min`/`max` setting or initial data, otherwise if\n    // the extent changed while `appendData`, the location of the painted\n    // graphic elements have to be changed, which make the usage of\n    // `appendData` meaningless.\n    this._scheduler.unfinished = true;\n    this.getZr().wakeUp();\n  };\n  // A work around for no `internal` modifier in ts yet but\n  // need to strictly hide private methods to JS users.\n  ECharts.internalField = function () {\n    prepare = function (ecIns) {\n      var scheduler = ecIns._scheduler;\n      scheduler.restorePipelines(ecIns._model);\n      scheduler.prepareStageTasks();\n      prepareView(ecIns, true);\n      prepareView(ecIns, false);\n      scheduler.plan();\n    };\n    /**\n     * Prepare view instances of charts and components\n     */\n    prepareView = function (ecIns, isComponent) {\n      var ecModel = ecIns._model;\n      var scheduler = ecIns._scheduler;\n      var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews;\n      var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap;\n      var zr = ecIns._zr;\n      var api = ecIns._api;\n      for (var i = 0; i < viewList.length; i++) {\n        viewList[i].__alive = false;\n      }\n      isComponent ? ecModel.eachComponent(function (componentType, model) {\n        componentType !== 'series' && doPrepare(model);\n      }) : ecModel.eachSeries(doPrepare);\n      function doPrepare(model) {\n        // By default view will be reused if possible for the case that `setOption` with \"notMerge\"\n        // mode and need to enable transition animation. (Usually, when they have the same id, or\n        // especially no id but have the same type & name & index. See the `model.id` generation\n        // rule in `makeIdAndName` and `viewId` generation rule here).\n        // But in `replaceMerge` mode, this feature should be able to disabled when it is clear that\n        // the new model has nothing to do with the old model.\n        var requireNewView = model.__requireNewView;\n        // This command should not work twice.\n        model.__requireNewView = false;\n        // Consider: id same and type changed.\n        var viewId = '_ec_' + model.id + '_' + model.type;\n        var view = !requireNewView && viewMap[viewId];\n        if (!view) {\n          var classType = parseClassType(model.type);\n          var Clazz = isComponent ? ComponentView.getClass(classType.main, classType.sub) :\n          // FIXME:TS\n          // (ChartView as ChartViewConstructor).getClass('series', classType.sub)\n          // For backward compat, still support a chart type declared as only subType\n          // like \"liquidfill\", but recommend \"series.liquidfill\"\n          // But need a base class to make a type series.\n          ChartView.getClass(classType.sub);\n          if (process.env.NODE_ENV !== 'production') {\n            assert(Clazz, classType.sub + ' does not exist.');\n          }\n          view = new Clazz();\n          view.init(ecModel, api);\n          viewMap[viewId] = view;\n          viewList.push(view);\n          zr.add(view.group);\n        }\n        model.__viewId = view.__id = viewId;\n        view.__alive = true;\n        view.__model = model;\n        view.group.__ecComponentInfo = {\n          mainType: model.mainType,\n          index: model.componentIndex\n        };\n        !isComponent && scheduler.prepareView(view, model, ecModel, api);\n      }\n      for (var i = 0; i < viewList.length;) {\n        var view = viewList[i];\n        if (!view.__alive) {\n          !isComponent && view.renderTask.dispose();\n          zr.remove(view.group);\n          view.dispose(ecModel, api);\n          viewList.splice(i, 1);\n          if (viewMap[view.__id] === view) {\n            delete viewMap[view.__id];\n          }\n          view.__id = view.group.__ecComponentInfo = null;\n        } else {\n          i++;\n        }\n      }\n    };\n    updateDirectly = function (ecIns, method, payload, mainType, subType) {\n      var ecModel = ecIns._model;\n      ecModel.setUpdatePayload(payload);\n      // broadcast\n      if (!mainType) {\n        // FIXME\n        // Chart will not be update directly here, except set dirty.\n        // But there is no such scenario now.\n        each([].concat(ecIns._componentsViews).concat(ecIns._chartsViews), callView);\n        return;\n      }\n      var query = {};\n      query[mainType + 'Id'] = payload[mainType + 'Id'];\n      query[mainType + 'Index'] = payload[mainType + 'Index'];\n      query[mainType + 'Name'] = payload[mainType + 'Name'];\n      var condition = {\n        mainType: mainType,\n        query: query\n      };\n      subType && (condition.subType = subType); // subType may be '' by parseClassType;\n      var excludeSeriesId = payload.excludeSeriesId;\n      var excludeSeriesIdMap;\n      if (excludeSeriesId != null) {\n        excludeSeriesIdMap = createHashMap();\n        each(modelUtil.normalizeToArray(excludeSeriesId), function (id) {\n          var modelId = modelUtil.convertOptionIdName(id, null);\n          if (modelId != null) {\n            excludeSeriesIdMap.set(modelId, true);\n          }\n        });\n      }\n      // If dispatchAction before setOption, do nothing.\n      ecModel && ecModel.eachComponent(condition, function (model) {\n        var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null;\n        if (isExcluded) {\n          return;\n        }\n        ;\n        if (isHighDownPayload(payload)) {\n          if (model instanceof SeriesModel) {\n            if (payload.type === HIGHLIGHT_ACTION_TYPE && !payload.notBlur && !model.get(['emphasis', 'disabled'])) {\n              blurSeriesFromHighlightPayload(model, payload, ecIns._api);\n            }\n          } else {\n            var _a = findComponentHighDownDispatchers(model.mainType, model.componentIndex, payload.name, ecIns._api),\n              focusSelf = _a.focusSelf,\n              dispatchers = _a.dispatchers;\n            if (payload.type === HIGHLIGHT_ACTION_TYPE && focusSelf && !payload.notBlur) {\n              blurComponent(model.mainType, model.componentIndex, ecIns._api);\n            }\n            // PENDING:\n            // Whether to put this \"enter emphasis\" code in `ComponentView`,\n            // which will be the same as `ChartView` but might be not necessary\n            // and will be far from this logic.\n            if (dispatchers) {\n              each(dispatchers, function (dispatcher) {\n                payload.type === HIGHLIGHT_ACTION_TYPE ? enterEmphasis(dispatcher) : leaveEmphasis(dispatcher);\n              });\n            }\n          }\n        } else if (isSelectChangePayload(payload)) {\n          // TODO geo\n          if (model instanceof SeriesModel) {\n            toggleSelectionFromPayload(model, payload, ecIns._api);\n            updateSeriesElementSelection(model);\n            markStatusToUpdate(ecIns);\n          }\n        }\n      }, ecIns);\n      ecModel && ecModel.eachComponent(condition, function (model) {\n        var isExcluded = excludeSeriesIdMap && excludeSeriesIdMap.get(model.id) != null;\n        if (isExcluded) {\n          return;\n        }\n        ;\n        callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]);\n      }, ecIns);\n      function callView(view) {\n        view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload);\n      }\n    };\n    updateMethods = {\n      prepareAndUpdate: function (payload) {\n        prepare(this);\n        updateMethods.update.call(this, payload, payload && {\n          // Needs to mark option changed if newOption is given.\n          // It's from MagicType.\n          // TODO If use a separate flag optionChanged in payload?\n          optionChanged: payload.newOption != null\n        });\n      },\n      update: function (payload, updateParams) {\n        var ecModel = this._model;\n        var api = this._api;\n        var zr = this._zr;\n        var coordSysMgr = this._coordSysMgr;\n        var scheduler = this._scheduler;\n        // update before setOption\n        if (!ecModel) {\n          return;\n        }\n        ecModel.setUpdatePayload(payload);\n        scheduler.restoreData(ecModel, payload);\n        scheduler.performSeriesTasks(ecModel);\n        // TODO\n        // Save total ecModel here for undo/redo (after restoring data and before processing data).\n        // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.\n        // Create new coordinate system each update\n        // In LineView may save the old coordinate system and use it to get the original point.\n        coordSysMgr.create(ecModel, api);\n        scheduler.performDataProcessorTasks(ecModel, payload);\n        // Current stream render is not supported in data process. So we can update\n        // stream modes after data processing, where the filtered data is used to\n        // determine whether to use progressive rendering.\n        updateStreamModes(this, ecModel);\n        // We update stream modes before coordinate system updated, then the modes info\n        // can be fetched when coord sys updating (consider the barGrid extent fix). But\n        // the drawback is the full coord info can not be fetched. Fortunately this full\n        // coord is not required in stream mode updater currently.\n        coordSysMgr.update(ecModel, api);\n        clearColorPalette(ecModel);\n        scheduler.performVisualTasks(ecModel, payload);\n        // Set background and dark mode before rendering, because they affect auto-color-determination\n        // in zrender Text, and consequently affect the bounding rect if stroke is added.\n        var backgroundColor = ecModel.get('backgroundColor') || 'transparent';\n        zr.setBackgroundColor(backgroundColor);\n        // Force set dark mode.\n        var darkMode = ecModel.get('darkMode');\n        if (darkMode != null && darkMode !== 'auto') {\n          zr.setDarkMode(darkMode);\n        }\n        render(this, ecModel, api, payload, updateParams);\n        lifecycle.trigger('afterupdate', ecModel, api);\n      },\n      updateTransform: function (payload) {\n        var _this = this;\n        var ecModel = this._model;\n        var api = this._api;\n        // update before setOption\n        if (!ecModel) {\n          return;\n        }\n        ecModel.setUpdatePayload(payload);\n        // ChartView.markUpdateMethod(payload, 'updateTransform');\n        var componentDirtyList = [];\n        ecModel.eachComponent(function (componentType, componentModel) {\n          if (componentType === 'series') {\n            return;\n          }\n          var componentView = _this.getViewOfComponentModel(componentModel);\n          if (componentView && componentView.__alive) {\n            if (componentView.updateTransform) {\n              var result = componentView.updateTransform(componentModel, ecModel, api, payload);\n              result && result.update && componentDirtyList.push(componentView);\n            } else {\n              componentDirtyList.push(componentView);\n            }\n          }\n        });\n        var seriesDirtyMap = createHashMap();\n        ecModel.eachSeries(function (seriesModel) {\n          var chartView = _this._chartsMap[seriesModel.__viewId];\n          if (chartView.updateTransform) {\n            var result = chartView.updateTransform(seriesModel, ecModel, api, payload);\n            result && result.update && seriesDirtyMap.set(seriesModel.uid, 1);\n          } else {\n            seriesDirtyMap.set(seriesModel.uid, 1);\n          }\n        });\n        clearColorPalette(ecModel);\n        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n        // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);\n        this._scheduler.performVisualTasks(ecModel, payload, {\n          setDirty: true,\n          dirtyMap: seriesDirtyMap\n        });\n        // Currently, not call render of components. Geo render cost a lot.\n        // renderComponents(ecIns, ecModel, api, payload, componentDirtyList);\n        renderSeries(this, ecModel, api, payload, {}, seriesDirtyMap);\n        lifecycle.trigger('afterupdate', ecModel, api);\n      },\n      updateView: function (payload) {\n        var ecModel = this._model;\n        // update before setOption\n        if (!ecModel) {\n          return;\n        }\n        ecModel.setUpdatePayload(payload);\n        ChartView.markUpdateMethod(payload, 'updateView');\n        clearColorPalette(ecModel);\n        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n        this._scheduler.performVisualTasks(ecModel, payload, {\n          setDirty: true\n        });\n        render(this, ecModel, this._api, payload, {});\n        lifecycle.trigger('afterupdate', ecModel, this._api);\n      },\n      updateVisual: function (payload) {\n        // updateMethods.update.call(this, payload);\n        var _this = this;\n        var ecModel = this._model;\n        // update before setOption\n        if (!ecModel) {\n          return;\n        }\n        ecModel.setUpdatePayload(payload);\n        // clear all visual\n        ecModel.eachSeries(function (seriesModel) {\n          seriesModel.getData().clearAllVisual();\n        });\n        // Perform visual\n        ChartView.markUpdateMethod(payload, 'updateVisual');\n        clearColorPalette(ecModel);\n        // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.\n        this._scheduler.performVisualTasks(ecModel, payload, {\n          visualType: 'visual',\n          setDirty: true\n        });\n        ecModel.eachComponent(function (componentType, componentModel) {\n          if (componentType !== 'series') {\n            var componentView = _this.getViewOfComponentModel(componentModel);\n            componentView && componentView.__alive && componentView.updateVisual(componentModel, ecModel, _this._api, payload);\n          }\n        });\n        ecModel.eachSeries(function (seriesModel) {\n          var chartView = _this._chartsMap[seriesModel.__viewId];\n          chartView.updateVisual(seriesModel, ecModel, _this._api, payload);\n        });\n        lifecycle.trigger('afterupdate', ecModel, this._api);\n      },\n      updateLayout: function (payload) {\n        updateMethods.update.call(this, payload);\n      }\n    };\n    function doConvertPixelImpl(ecIns, methodName, finder, value, opt) {\n      if (ecIns._disposed) {\n        disposedWarning(ecIns.id);\n        return;\n      }\n      var ecModel = ecIns._model;\n      var coordSysList = ecIns._coordSysMgr.getCoordinateSystems();\n      var result;\n      var parsedFinder = modelUtil.parseFinder(ecModel, finder);\n      for (var i = 0; i < coordSysList.length; i++) {\n        var coordSys = coordSysList[i];\n        if (coordSys[methodName] && (result = coordSys[methodName](ecModel, parsedFinder, value, opt)) != null) {\n          return result;\n        }\n      }\n      if (process.env.NODE_ENV !== 'production') {\n        warn('No coordinate system that supports ' + methodName + ' found by the given finder.');\n      }\n    }\n    ;\n    doConvertPixel = doConvertPixelImpl;\n    updateStreamModes = function (ecIns, ecModel) {\n      var chartsMap = ecIns._chartsMap;\n      var scheduler = ecIns._scheduler;\n      ecModel.eachSeries(function (seriesModel) {\n        scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]);\n      });\n    };\n    doDispatchAction = function (payload, silent) {\n      var _this = this;\n      var ecModel = this.getModel();\n      var payloadType = payload.type;\n      var escapeConnect = payload.escapeConnect;\n      var actionInfo = actions[payloadType];\n      var cptTypeTmp = (actionInfo.update || 'update').split(':');\n      var updateMethod = cptTypeTmp.pop();\n      var cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]);\n      this[IN_MAIN_PROCESS_KEY] = true;\n      updateMainProcessVersion(this);\n      var payloads = [payload];\n      var batched = false;\n      // Batch action\n      if (payload.batch) {\n        batched = true;\n        payloads = map(payload.batch, function (item) {\n          item = defaults(extend({}, item), payload);\n          item.batch = null;\n          return item;\n        });\n      }\n      var eventObjBatch = [];\n      var eventObj;\n      var actionResultBatch = [];\n      var nonRefinedEventType = actionInfo.nonRefinedEventType;\n      var isSelectChange = isSelectChangePayload(payload);\n      var isHighDown = isHighDownPayload(payload);\n      // Only leave blur once if there are multiple batches.\n      if (isHighDown) {\n        allLeaveBlur(this._api);\n      }\n      each(payloads, function (batchItem) {\n        // Action can specify the event by return it.\n        var actionResult = actionInfo.action(batchItem, ecModel, _this._api);\n        if (actionInfo.refineEvent) {\n          actionResultBatch.push(actionResult);\n        } else {\n          eventObj = actionResult;\n        }\n        eventObj = eventObj || extend({}, batchItem);\n        eventObj.type = nonRefinedEventType;\n        eventObjBatch.push(eventObj);\n        // light update does not perform data process, layout and visual.\n        if (isHighDown) {\n          var _a = modelUtil.preParseFinder(payload),\n            queryOptionMap = _a.queryOptionMap,\n            mainTypeSpecified = _a.mainTypeSpecified;\n          var componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : 'series';\n          updateDirectly(_this, updateMethod, batchItem, componentMainType);\n          markStatusToUpdate(_this);\n        } else if (isSelectChange) {\n          // At present `dispatchAction({ type: 'select', ... })` is not supported on components.\n          // geo still use 'geoselect'.\n          updateDirectly(_this, updateMethod, batchItem, 'series');\n          markStatusToUpdate(_this);\n        } else if (cptType) {\n          updateDirectly(_this, updateMethod, batchItem, cptType.main, cptType.sub);\n        }\n      });\n      if (updateMethod !== 'none' && !isHighDown && !isSelectChange && !cptType) {\n        try {\n          // Still dirty\n          if (this[PENDING_UPDATE]) {\n            prepare(this);\n            updateMethods.update.call(this, payload);\n            this[PENDING_UPDATE] = null;\n          } else {\n            updateMethods[updateMethod].call(this, payload);\n          }\n        } catch (e) {\n          this[IN_MAIN_PROCESS_KEY] = false;\n          throw e;\n        }\n      }\n      // Follow the rule of action batch\n      if (batched) {\n        eventObj = {\n          type: nonRefinedEventType,\n          escapeConnect: escapeConnect,\n          batch: eventObjBatch\n        };\n      } else {\n        eventObj = eventObjBatch[0];\n      }\n      this[IN_MAIN_PROCESS_KEY] = false;\n      if (!silent) {\n        var refinedEvent = void 0;\n        if (actionInfo.refineEvent) {\n          var eventContent = actionInfo.refineEvent(actionResultBatch, payload, ecModel, this._api).eventContent;\n          assert(isObject(eventContent));\n          refinedEvent = defaults({\n            type: actionInfo.refinedEventType\n          }, eventContent);\n          refinedEvent.fromAction = payload.type;\n          refinedEvent.fromActionPayload = payload;\n          refinedEvent.escapeConnect = true;\n        }\n        var messageCenter = this._messageCenter;\n        // - If `refineEvent` created a `refinedEvent`, `eventObj` (replicated from the original payload)\n        //  is still needed to be triggered for the feature `connect`. But it will not be triggered to\n        //  users in this case.\n        // - If no `refineEvent` used, `eventObj` will be triggered for both `connect` and users.\n        messageCenter.trigger(eventObj.type, eventObj);\n        if (refinedEvent) {\n          messageCenter.trigger(refinedEvent.type, refinedEvent);\n        }\n      }\n    };\n    flushPendingActions = function (silent) {\n      var pendingActions = this._pendingActions;\n      while (pendingActions.length) {\n        var payload = pendingActions.shift();\n        doDispatchAction.call(this, payload, silent);\n      }\n    };\n    triggerUpdatedEvent = function (silent) {\n      !silent && this.trigger('updated');\n    };\n    /**\n     * Event `rendered` is triggered when zr\n     * rendered. It is useful for realtime\n     * snapshot (reflect animation).\n     *\n     * Event `finished` is triggered when:\n     * (1) zrender rendering finished.\n     * (2) initial animation finished.\n     * (3) progressive rendering finished.\n     * (4) no pending action.\n     * (5) no delayed setOption needs to be processed.\n     */\n    bindRenderedEvent = function (zr, ecIns) {\n      zr.on('rendered', function (params) {\n        ecIns.trigger('rendered', params);\n        // The `finished` event should not be triggered repeatedly,\n        // so it should only be triggered when rendering indeed happens\n        // in zrender. (Consider the case that dipatchAction is keep\n        // triggering when mouse move).\n        if (\n        // Although zr is dirty if initial animation is not finished\n        // and this checking is called on frame, we also check\n        // animation finished for robustness.\n        zr.animation.isFinished() && !ecIns[PENDING_UPDATE] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) {\n          ecIns.trigger('finished');\n        }\n      });\n    };\n    bindMouseEvent = function (zr, ecIns) {\n      zr.on('mouseover', function (e) {\n        var el = e.target;\n        var dispatcher = findEventDispatcher(el, isHighDownDispatcher);\n        if (dispatcher) {\n          handleGlobalMouseOverForHighDown(dispatcher, e, ecIns._api);\n          markStatusToUpdate(ecIns);\n        }\n      }).on('mouseout', function (e) {\n        var el = e.target;\n        var dispatcher = findEventDispatcher(el, isHighDownDispatcher);\n        if (dispatcher) {\n          handleGlobalMouseOutForHighDown(dispatcher, e, ecIns._api);\n          markStatusToUpdate(ecIns);\n        }\n      }).on('click', function (e) {\n        var el = e.target;\n        var dispatcher = findEventDispatcher(el, function (target) {\n          return getECData(target).dataIndex != null;\n        }, true);\n        if (dispatcher) {\n          var actionType = dispatcher.selected ? 'unselect' : 'select';\n          var ecData = getECData(dispatcher);\n          ecIns._api.dispatchAction({\n            type: actionType,\n            dataType: ecData.dataType,\n            dataIndexInside: ecData.dataIndex,\n            seriesIndex: ecData.seriesIndex,\n            isFromClick: true\n          });\n        }\n      });\n    };\n    function clearColorPalette(ecModel) {\n      ecModel.clearColorPalette();\n      ecModel.eachSeries(function (seriesModel) {\n        seriesModel.clearColorPalette();\n      });\n    }\n    ;\n    // Allocate zlevels for series and components\n    function allocateZlevels(ecModel) {\n      ;\n      var componentZLevels = [];\n      var seriesZLevels = [];\n      var hasSeparateZLevel = false;\n      ecModel.eachComponent(function (componentType, componentModel) {\n        var zlevel = componentModel.get('zlevel') || 0;\n        var z = componentModel.get('z') || 0;\n        var zlevelKey = componentModel.getZLevelKey();\n        hasSeparateZLevel = hasSeparateZLevel || !!zlevelKey;\n        (componentType === 'series' ? seriesZLevels : componentZLevels).push({\n          zlevel: zlevel,\n          z: z,\n          idx: componentModel.componentIndex,\n          type: componentType,\n          key: zlevelKey\n        });\n      });\n      if (hasSeparateZLevel) {\n        // Series after component\n        var zLevels = componentZLevels.concat(seriesZLevels);\n        var lastSeriesZLevel_1;\n        var lastSeriesKey_1;\n        timsort(zLevels, function (a, b) {\n          if (a.zlevel === b.zlevel) {\n            return a.z - b.z;\n          }\n          return a.zlevel - b.zlevel;\n        });\n        each(zLevels, function (item) {\n          var componentModel = ecModel.getComponent(item.type, item.idx);\n          var zlevel = item.zlevel;\n          var key = item.key;\n          if (lastSeriesZLevel_1 != null) {\n            zlevel = Math.max(lastSeriesZLevel_1, zlevel);\n          }\n          if (key) {\n            if (zlevel === lastSeriesZLevel_1 && key !== lastSeriesKey_1) {\n              zlevel++;\n            }\n            lastSeriesKey_1 = key;\n          } else if (lastSeriesKey_1) {\n            if (zlevel === lastSeriesZLevel_1) {\n              zlevel++;\n            }\n            lastSeriesKey_1 = '';\n          }\n          lastSeriesZLevel_1 = zlevel;\n          componentModel.setZLevel(zlevel);\n        });\n      }\n    }\n    render = function (ecIns, ecModel, api, payload, updateParams) {\n      allocateZlevels(ecModel);\n      renderComponents(ecIns, ecModel, api, payload, updateParams);\n      each(ecIns._chartsViews, function (chart) {\n        chart.__alive = false;\n      });\n      renderSeries(ecIns, ecModel, api, payload, updateParams);\n      // Remove groups of unrendered charts\n      each(ecIns._chartsViews, function (chart) {\n        if (!chart.__alive) {\n          chart.remove(ecModel, api);\n        }\n      });\n    };\n    renderComponents = function (ecIns, ecModel, api, payload, updateParams, dirtyList) {\n      each(dirtyList || ecIns._componentsViews, function (componentView) {\n        var componentModel = componentView.__model;\n        clearStates(componentModel, componentView);\n        componentView.render(componentModel, ecModel, api, payload);\n        updateZ(componentModel, componentView);\n        updateStates(componentModel, componentView);\n      });\n    };\n    /**\n     * Render each chart and component\n     */\n    renderSeries = function (ecIns, ecModel, api, payload, updateParams, dirtyMap) {\n      // Render all charts\n      var scheduler = ecIns._scheduler;\n      updateParams = extend(updateParams || {}, {\n        updatedSeries: ecModel.getSeries()\n      });\n      // TODO progressive?\n      lifecycle.trigger('series:beforeupdate', ecModel, api, updateParams);\n      var unfinished = false;\n      ecModel.eachSeries(function (seriesModel) {\n        var chartView = ecIns._chartsMap[seriesModel.__viewId];\n        chartView.__alive = true;\n        var renderTask = chartView.renderTask;\n        scheduler.updatePayload(renderTask, payload);\n        // TODO states on marker.\n        clearStates(seriesModel, chartView);\n        if (dirtyMap && dirtyMap.get(seriesModel.uid)) {\n          renderTask.dirty();\n        }\n        if (renderTask.perform(scheduler.getPerformArgs(renderTask))) {\n          unfinished = true;\n        }\n        chartView.group.silent = !!seriesModel.get('silent');\n        // Should not call markRedraw on group, because it will disable zrender\n        // incremental render (always render from the __startIndex each frame)\n        // chartView.group.markRedraw();\n        updateBlend(seriesModel, chartView);\n        updateSeriesElementSelection(seriesModel);\n      });\n      scheduler.unfinished = unfinished || scheduler.unfinished;\n      lifecycle.trigger('series:layoutlabels', ecModel, api, updateParams);\n      // transition after label is layouted.\n      lifecycle.trigger('series:transition', ecModel, api, updateParams);\n      ecModel.eachSeries(function (seriesModel) {\n        var chartView = ecIns._chartsMap[seriesModel.__viewId];\n        // Update Z after labels updated. Before applying states.\n        updateZ(seriesModel, chartView);\n        // NOTE: Update states after label is updated.\n        // label should be in normal status when layouting.\n        updateStates(seriesModel, chartView);\n      });\n      // If use hover layer\n      updateHoverLayerStatus(ecIns, ecModel);\n      lifecycle.trigger('series:afterupdate', ecModel, api, updateParams);\n    };\n    markStatusToUpdate = function (ecIns) {\n      ecIns[STATUS_NEEDS_UPDATE_KEY] = true;\n      // Wake up zrender if it's sleep. Let it update states in the next frame.\n      ecIns.getZr().wakeUp();\n    };\n    updateMainProcessVersion = function (ecIns) {\n      ecIns[MAIN_PROCESS_VERSION_KEY] = (ecIns[MAIN_PROCESS_VERSION_KEY] + 1) % 1000;\n    };\n    applyChangedStates = function (ecIns) {\n      if (!ecIns[STATUS_NEEDS_UPDATE_KEY]) {\n        return;\n      }\n      ecIns.getZr().storage.traverse(function (el) {\n        // Not applied on removed elements, it may still in fading.\n        if (graphic.isElementRemoved(el)) {\n          return;\n        }\n        applyElementStates(el);\n      });\n      ecIns[STATUS_NEEDS_UPDATE_KEY] = false;\n    };\n    function applyElementStates(el) {\n      var newStates = [];\n      var oldStates = el.currentStates;\n      // Keep other states.\n      for (var i = 0; i < oldStates.length; i++) {\n        var stateName = oldStates[i];\n        if (!(stateName === 'emphasis' || stateName === 'blur' || stateName === 'select')) {\n          newStates.push(stateName);\n        }\n      }\n      // Only use states when it's exists.\n      if (el.selected && el.states.select) {\n        newStates.push('select');\n      }\n      if (el.hoverState === HOVER_STATE_EMPHASIS && el.states.emphasis) {\n        newStates.push('emphasis');\n      } else if (el.hoverState === HOVER_STATE_BLUR && el.states.blur) {\n        newStates.push('blur');\n      }\n      el.useStates(newStates);\n    }\n    function updateHoverLayerStatus(ecIns, ecModel) {\n      var zr = ecIns._zr;\n      var storage = zr.storage;\n      var elCount = 0;\n      storage.traverse(function (el) {\n        if (!el.isGroup) {\n          elCount++;\n        }\n      });\n      if (elCount > ecModel.get('hoverLayerThreshold') && !env.node && !env.worker) {\n        ecModel.eachSeries(function (seriesModel) {\n          if (seriesModel.preventUsingHoverLayer) {\n            return;\n          }\n          var chartView = ecIns._chartsMap[seriesModel.__viewId];\n          if (chartView.__alive) {\n            chartView.eachRendered(function (el) {\n              if (el.states.emphasis) {\n                el.states.emphasis.hoverLayer = true;\n              }\n            });\n          }\n        });\n      }\n    }\n    ;\n    /**\n     * Update chart and blend.\n     */\n    function updateBlend(seriesModel, chartView) {\n      var blendMode = seriesModel.get('blendMode') || null;\n      chartView.eachRendered(function (el) {\n        // FIXME marker and other components\n        if (!el.isGroup) {\n          // DON'T mark the element dirty. In case element is incremental and don't want to rerender.\n          el.style.blend = blendMode;\n        }\n      });\n    }\n    ;\n    function updateZ(model, view) {\n      if (model.preventAutoZ) {\n        return;\n      }\n      var zInfo = graphic.retrieveZInfo(model);\n      // Set z and zlevel\n      view.eachRendered(function (el) {\n        graphic.traverseUpdateZ(el, zInfo.z, zInfo.zlevel);\n        // Don't traverse the children because it has been traversed in _updateZ.\n        return true;\n      });\n    }\n    ;\n    // Clear states without animation.\n    // TODO States on component.\n    function clearStates(model, view) {\n      view.eachRendered(function (el) {\n        // Not applied on removed elements, it may still in fading.\n        if (graphic.isElementRemoved(el)) {\n          return;\n        }\n        var textContent = el.getTextContent();\n        var textGuide = el.getTextGuideLine();\n        if (el.stateTransition) {\n          el.stateTransition = null;\n        }\n        if (textContent && textContent.stateTransition) {\n          textContent.stateTransition = null;\n        }\n        if (textGuide && textGuide.stateTransition) {\n          textGuide.stateTransition = null;\n        }\n        // TODO If el is incremental.\n        if (el.hasState()) {\n          el.prevStates = el.currentStates;\n          el.clearStates();\n        } else if (el.prevStates) {\n          el.prevStates = null;\n        }\n      });\n    }\n    function updateStates(model, view) {\n      var stateAnimationModel = model.getModel('stateAnimation');\n      var enableAnimation = model.isAnimationEnabled();\n      var duration = stateAnimationModel.get('duration');\n      var stateTransition = duration > 0 ? {\n        duration: duration,\n        delay: stateAnimationModel.get('delay'),\n        easing: stateAnimationModel.get('easing')\n        // additive: stateAnimationModel.get('additive')\n      } : null;\n      view.eachRendered(function (el) {\n        if (el.states && el.states.emphasis) {\n          // Not applied on removed elements, it may still in fading.\n          if (graphic.isElementRemoved(el)) {\n            return;\n          }\n          if (el instanceof graphic.Path) {\n            savePathStates(el);\n          }\n          // Only updated on changed element. In case element is incremental and don't want to rerender.\n          // TODO, a more proper way?\n          if (el.__dirty) {\n            var prevStates = el.prevStates;\n            // Restore states without animation\n            if (prevStates) {\n              el.useStates(prevStates);\n            }\n          }\n          // Update state transition and enable animation again.\n          if (enableAnimation) {\n            el.stateTransition = stateTransition;\n            var textContent = el.getTextContent();\n            var textGuide = el.getTextGuideLine();\n            // TODO Is it necessary to animate label?\n            if (textContent) {\n              textContent.stateTransition = stateTransition;\n            }\n            if (textGuide) {\n              textGuide.stateTransition = stateTransition;\n            }\n          }\n          // Use highlighted and selected flag to toggle states.\n          if (el.__dirty) {\n            applyElementStates(el);\n          }\n        }\n      });\n    }\n    ;\n    createExtensionAPI = function (ecIns) {\n      return new (/** @class */function (_super) {\n        __extends(class_1, _super);\n        function class_1() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        class_1.prototype.getCoordinateSystems = function () {\n          return ecIns._coordSysMgr.getCoordinateSystems();\n        };\n        class_1.prototype.getComponentByElement = function (el) {\n          while (el) {\n            var modelInfo = el.__ecComponentInfo;\n            if (modelInfo != null) {\n              return ecIns._model.getComponent(modelInfo.mainType, modelInfo.index);\n            }\n            el = el.parent;\n          }\n        };\n        class_1.prototype.enterEmphasis = function (el, highlightDigit) {\n          enterEmphasis(el, highlightDigit);\n          markStatusToUpdate(ecIns);\n        };\n        class_1.prototype.leaveEmphasis = function (el, highlightDigit) {\n          leaveEmphasis(el, highlightDigit);\n          markStatusToUpdate(ecIns);\n        };\n        class_1.prototype.enterBlur = function (el) {\n          enterBlur(el);\n          markStatusToUpdate(ecIns);\n        };\n        class_1.prototype.leaveBlur = function (el) {\n          leaveBlur(el);\n          markStatusToUpdate(ecIns);\n        };\n        class_1.prototype.enterSelect = function (el) {\n          enterSelect(el);\n          markStatusToUpdate(ecIns);\n        };\n        class_1.prototype.leaveSelect = function (el) {\n          leaveSelect(el);\n          markStatusToUpdate(ecIns);\n        };\n        class_1.prototype.getModel = function () {\n          return ecIns.getModel();\n        };\n        class_1.prototype.getViewOfComponentModel = function (componentModel) {\n          return ecIns.getViewOfComponentModel(componentModel);\n        };\n        class_1.prototype.getViewOfSeriesModel = function (seriesModel) {\n          return ecIns.getViewOfSeriesModel(seriesModel);\n        };\n        class_1.prototype.getMainProcessVersion = function () {\n          return ecIns[MAIN_PROCESS_VERSION_KEY];\n        };\n        return class_1;\n      }(ExtensionAPI))(ecIns);\n    };\n    enableConnect = function (chart) {\n      function updateConnectedChartsStatus(charts, status) {\n        for (var i = 0; i < charts.length; i++) {\n          var otherChart = charts[i];\n          otherChart[CONNECT_STATUS_KEY] = status;\n        }\n      }\n      each(connectionEventRevertMap, function (_, eventType) {\n        chart._messageCenter.on(eventType, function (event) {\n          if (connectedGroups[chart.group] && chart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_PENDING) {\n            if (event && event.escapeConnect) {\n              return;\n            }\n            var action_1 = chart.makeActionFromEvent(event);\n            var otherCharts_1 = [];\n            each(instances, function (otherChart) {\n              if (otherChart !== chart && otherChart.group === chart.group) {\n                otherCharts_1.push(otherChart);\n              }\n            });\n            updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_PENDING);\n            each(otherCharts_1, function (otherChart) {\n              if (otherChart[CONNECT_STATUS_KEY] !== CONNECT_STATUS_UPDATING) {\n                otherChart.dispatchAction(action_1);\n              }\n            });\n            updateConnectedChartsStatus(otherCharts_1, CONNECT_STATUS_UPDATED);\n          }\n        });\n      });\n    };\n  }();\n  return ECharts;\n}(Eventful);\nvar echartsProto = ECharts.prototype;\nechartsProto.on = createRegisterEventWithLowercaseECharts('on');\nechartsProto.off = createRegisterEventWithLowercaseECharts('off');\n/**\n * @deprecated\n */\n// @ts-ignore\nechartsProto.one = function (eventName, cb, ctx) {\n  var self = this;\n  deprecateLog('ECharts#one is deprecated.');\n  function wrapped() {\n    var args2 = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args2[_i] = arguments[_i];\n    }\n    cb && cb.apply && cb.apply(this, args2);\n    // @ts-ignore\n    self.off(eventName, wrapped);\n  }\n  ;\n  // @ts-ignore\n  this.on.call(this, eventName, wrapped, ctx);\n};\nvar MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu'];\nfunction disposedWarning(id) {\n  if (process.env.NODE_ENV !== 'production') {\n    warn('Instance ' + id + ' has been disposed');\n  }\n}\nvar actions = {};\n/**\n * Map event type to action type for reproducing action from event for `connect`.\n */\nvar connectionEventRevertMap = {};\n/**\n * To remove duplication.\n */\nvar publicEventTypeMap = {};\nvar dataProcessorFuncs = [];\nvar optionPreprocessorFuncs = [];\nvar visualFuncs = [];\nvar themeStorage = {};\nvar loadingEffects = {};\nvar instances = {};\nvar connectedGroups = {};\nvar idBase = +new Date() - 0;\nvar groupIdBase = +new Date() - 0;\nvar DOM_ATTRIBUTE_KEY = '_echarts_instance_';\n/**\n * @param opts.devicePixelRatio Use window.devicePixelRatio by default\n * @param opts.renderer Can choose 'canvas' or 'svg' to render the chart.\n * @param opts.width Use clientWidth of the input `dom` by default.\n *        Can be 'auto' (the same as null/undefined)\n * @param opts.height Use clientHeight of the input `dom` by default.\n *        Can be 'auto' (the same as null/undefined)\n * @param opts.locale Specify the locale.\n * @param opts.useDirtyRect Enable dirty rectangle rendering or not.\n */\nexport function init(dom, theme, opts) {\n  var isClient = !(opts && opts.ssr);\n  if (isClient) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!dom) {\n        throw new Error('Initialize failed: invalid dom.');\n      }\n    }\n    var existInstance = getInstanceByDom(dom);\n    if (existInstance) {\n      if (process.env.NODE_ENV !== 'production') {\n        warn('There is a chart instance already initialized on the dom.');\n      }\n      return existInstance;\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      if (isDom(dom) && dom.nodeName.toUpperCase() !== 'CANVAS' && (!dom.clientWidth && (!opts || opts.width == null) || !dom.clientHeight && (!opts || opts.height == null))) {\n        warn('Can\\'t get DOM width or height. Please check ' + 'dom.clientWidth and dom.clientHeight. They should not be 0.' + 'For example, you may need to call this in the callback ' + 'of window.onload.');\n      }\n    }\n  }\n  var chart = new ECharts(dom, theme, opts);\n  chart.id = 'ec_' + idBase++;\n  instances[chart.id] = chart;\n  isClient && modelUtil.setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id);\n  enableConnect(chart);\n  lifecycle.trigger('afterinit', chart);\n  return chart;\n}\n/**\n * @usage\n * (A)\n * ```js\n * let chart1 = echarts.init(dom1);\n * let chart2 = echarts.init(dom2);\n * chart1.group = 'xxx';\n * chart2.group = 'xxx';\n * echarts.connect('xxx');\n * ```\n * (B)\n * ```js\n * let chart1 = echarts.init(dom1);\n * let chart2 = echarts.init(dom2);\n * echarts.connect('xxx', [chart1, chart2]);\n * ```\n */\nexport function connect(groupId) {\n  // Is array of charts\n  if (isArray(groupId)) {\n    var charts = groupId;\n    groupId = null;\n    // If any chart has group\n    each(charts, function (chart) {\n      if (chart.group != null) {\n        groupId = chart.group;\n      }\n    });\n    groupId = groupId || 'g_' + groupIdBase++;\n    each(charts, function (chart) {\n      chart.group = groupId;\n    });\n  }\n  connectedGroups[groupId] = true;\n  return groupId;\n}\nexport function disconnect(groupId) {\n  connectedGroups[groupId] = false;\n}\n/**\n * Alias and backward compatibility\n * @deprecated\n */\nexport var disConnect = disconnect;\n/**\n * Dispose a chart instance\n */\nexport function dispose(chart) {\n  if (isString(chart)) {\n    chart = instances[chart];\n  } else if (!(chart instanceof ECharts)) {\n    // Try to treat as dom\n    chart = getInstanceByDom(chart);\n  }\n  if (chart instanceof ECharts && !chart.isDisposed()) {\n    chart.dispose();\n  }\n}\nexport function getInstanceByDom(dom) {\n  return instances[modelUtil.getAttribute(dom, DOM_ATTRIBUTE_KEY)];\n}\nexport function getInstanceById(key) {\n  return instances[key];\n}\n/**\n * Register theme\n */\nexport function registerTheme(name, theme) {\n  themeStorage[name] = theme;\n}\n/**\n * Register option preprocessor\n */\nexport function registerPreprocessor(preprocessorFunc) {\n  if (indexOf(optionPreprocessorFuncs, preprocessorFunc) < 0) {\n    optionPreprocessorFuncs.push(preprocessorFunc);\n  }\n}\nexport function registerProcessor(priority, processor) {\n  normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_DEFAULT);\n}\n/**\n * Register postIniter\n * @param {Function} postInitFunc\n */\nexport function registerPostInit(postInitFunc) {\n  registerUpdateLifecycle('afterinit', postInitFunc);\n}\n/**\n * Register postUpdater\n * @param {Function} postUpdateFunc\n */\nexport function registerPostUpdate(postUpdateFunc) {\n  registerUpdateLifecycle('afterupdate', postUpdateFunc);\n}\nexport function registerUpdateLifecycle(name, cb) {\n  lifecycle.on(name, cb);\n}\nexport function registerAction(arg0, arg1, action) {\n  var actionType;\n  var publicEventType;\n  var refineEvent;\n  var update;\n  var publishNonRefinedEvent;\n  if (isFunction(arg1)) {\n    action = arg1;\n    arg1 = '';\n  }\n  if (isObject(arg0)) {\n    actionType = arg0.type;\n    publicEventType = arg0.event;\n    update = arg0.update;\n    publishNonRefinedEvent = arg0.publishNonRefinedEvent;\n    if (!action) {\n      action = arg0.action;\n    }\n    refineEvent = arg0.refineEvent;\n  } else {\n    actionType = arg0;\n    publicEventType = arg1;\n  }\n  function createEventType(actionOrEventType) {\n    // Event type should be all lowercase\n    return actionOrEventType.toLowerCase();\n  }\n  publicEventType = createEventType(publicEventType || actionType);\n  // See comments on {ActionInfo} for the reason.\n  var nonRefinedEventType = refineEvent ? createEventType(actionType) : publicEventType;\n  // Support calling `registerAction` multiple times with the same action\n  // type; subsequent calls have no effect.\n  if (actions[actionType]) {\n    return;\n  }\n  // Validate action type and event name.\n  assert(ACTION_REG.test(actionType) && ACTION_REG.test(publicEventType));\n  if (refineEvent) {\n    // An event replicated from the action will be triggered internally for `connect` in this case.\n    assert(publicEventType !== actionType);\n  }\n  actions[actionType] = {\n    actionType: actionType,\n    refinedEventType: publicEventType,\n    nonRefinedEventType: nonRefinedEventType,\n    update: update,\n    action: action,\n    refineEvent: refineEvent\n  };\n  publicEventTypeMap[publicEventType] = 1;\n  if (refineEvent && publishNonRefinedEvent) {\n    publicEventTypeMap[nonRefinedEventType] = 1;\n  }\n  if (process.env.NODE_ENV !== 'production' && connectionEventRevertMap[nonRefinedEventType]) {\n    error(nonRefinedEventType + \" must not be shared; use \\\"refineEvent\\\" if you intend to share an event name.\");\n  }\n  connectionEventRevertMap[nonRefinedEventType] = actionType;\n}\nexport function registerCoordinateSystem(type, coordSysCreator) {\n  CoordinateSystemManager.register(type, coordSysCreator);\n}\n/**\n * Get dimensions of specified coordinate system.\n * @param {string} type\n * @return {Array.<string|Object>}\n */\nexport function getCoordinateSystemDimensions(type) {\n  var coordSysCreator = CoordinateSystemManager.get(type);\n  if (coordSysCreator) {\n    return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice();\n  }\n}\nexport function registerCustomSeries(seriesType, renderItem) {\n  registerCustom(seriesType, renderItem);\n}\nexport { registerLocale } from './locale.js';\nfunction registerLayout(priority, layoutTask) {\n  normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout');\n}\nfunction registerVisual(priority, visualTask) {\n  normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual');\n}\nexport { registerLayout, registerVisual };\nvar registeredTasks = [];\nfunction normalizeRegister(targetList, priority, fn, defaultPriority, visualType) {\n  if (isFunction(priority) || isObject(priority)) {\n    fn = priority;\n    priority = defaultPriority;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    if (isNaN(priority) || priority == null) {\n      throw new Error('Illegal priority');\n    }\n    // Check duplicate\n    each(targetList, function (wrap) {\n      assert(wrap.__raw !== fn);\n    });\n  }\n  // Already registered\n  if (indexOf(registeredTasks, fn) >= 0) {\n    return;\n  }\n  registeredTasks.push(fn);\n  var stageHandler = Scheduler.wrapStageHandler(fn, visualType);\n  stageHandler.__prio = priority;\n  stageHandler.__raw = fn;\n  targetList.push(stageHandler);\n}\nexport function registerLoading(name, loadingFx) {\n  loadingEffects[name] = loadingFx;\n}\n/**\n * ZRender need a canvas context to do measureText.\n * But in node environment canvas may be created by node-canvas.\n * So we need to specify how to create a canvas instead of using document.createElement('canvas')\n *\n *\n * @deprecated use setPlatformAPI({ createCanvas }) instead.\n *\n * @example\n *     let Canvas = require('canvas');\n *     let echarts = require('echarts');\n *     echarts.setCanvasCreator(function () {\n *         // Small size is enough.\n *         return new Canvas(32, 32);\n *     });\n */\nexport function setCanvasCreator(creator) {\n  if (process.env.NODE_ENV !== 'production') {\n    deprecateLog('setCanvasCreator is deprecated. Use setPlatformAPI({ createCanvas }) instead.');\n  }\n  setPlatformAPI({\n    createCanvas: creator\n  });\n}\n/**\n * The parameters and usage: see `geoSourceManager.registerMap`.\n * Compatible with previous `echarts.registerMap`.\n */\nexport function registerMap(mapName, geoJson, specialAreas) {\n  var registerMap = getImpl('registerMap');\n  registerMap && registerMap(mapName, geoJson, specialAreas);\n}\nexport function getMap(mapName) {\n  var getMap = getImpl('getMap');\n  return getMap && getMap(mapName);\n}\nexport var registerTransform = registerExternalTransform;\n/**\n * Globa dispatchAction to a specified chart instance.\n */\n// export function dispatchAction(payload: { chartId: string } & Payload, opt?: Parameters<ECharts['dispatchAction']>[1]) {\n//     if (!payload || !payload.chartId) {\n//         // Must have chartId to find chart\n//         return;\n//     }\n//     const chart = instances[payload.chartId];\n//     if (chart) {\n//         chart.dispatchAction(payload, opt);\n//     }\n// }\n// Builtin global visual\nregisterVisual(PRIORITY_VISUAL_GLOBAL, seriesStyleTask);\nregisterVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataStyleTask);\nregisterVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataColorPaletteTask);\nregisterVisual(PRIORITY_VISUAL_GLOBAL, seriesSymbolTask);\nregisterVisual(PRIORITY_VISUAL_CHART_DATA_CUSTOM, dataSymbolTask);\nregisterVisual(PRIORITY_VISUAL_DECAL, decal);\nregisterPreprocessor(backwardCompat);\nregisterProcessor(PRIORITY_PROCESSOR_DATASTACK, dataStack);\nregisterLoading('default', loadingDefault);\n// Default actions\nregisterAction({\n  type: HIGHLIGHT_ACTION_TYPE,\n  event: HIGHLIGHT_ACTION_TYPE,\n  update: HIGHLIGHT_ACTION_TYPE\n}, noop);\nregisterAction({\n  type: DOWNPLAY_ACTION_TYPE,\n  event: DOWNPLAY_ACTION_TYPE,\n  update: DOWNPLAY_ACTION_TYPE\n}, noop);\nregisterAction({\n  type: SELECT_ACTION_TYPE,\n  event: SELECT_CHANGED_EVENT_TYPE,\n  update: SELECT_ACTION_TYPE,\n  action: noop,\n  refineEvent: makeSelectChangedEvent,\n  publishNonRefinedEvent: true\n});\nregisterAction({\n  type: UNSELECT_ACTION_TYPE,\n  event: SELECT_CHANGED_EVENT_TYPE,\n  update: UNSELECT_ACTION_TYPE,\n  action: noop,\n  refineEvent: makeSelectChangedEvent,\n  publishNonRefinedEvent: true\n});\nregisterAction({\n  type: TOGGLE_SELECT_ACTION_TYPE,\n  event: SELECT_CHANGED_EVENT_TYPE,\n  update: TOGGLE_SELECT_ACTION_TYPE,\n  action: noop,\n  refineEvent: makeSelectChangedEvent,\n  publishNonRefinedEvent: true\n});\nfunction makeSelectChangedEvent(actionResultBatch, payload, ecModel, api) {\n  return {\n    eventContent: {\n      selected: getAllSelectedIndices(ecModel),\n      isFromClick: payload.isFromClick || false\n    }\n  };\n}\n// Default theme, so that we can use `chart.setTheme('default')` to revert to\n// the default theme after changing to other themes.\nregisterTheme('default', {});\nregisterTheme('dark', darkTheme);\n// For backward compatibility, where the namespace `dataTool` will\n// be mounted on `echarts` is the extension `dataTool` is imported.\nexport var dataTool = {};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { registerPreprocessor, registerProcessor, registerPostInit, registerPostUpdate, registerAction, registerCoordinateSystem, registerLayout, registerVisual, registerTransform, registerLoading, registerMap, registerUpdateLifecycle, PRIORITY } from './core/echarts.js';\nimport ComponentView from './view/Component.js';\nimport ChartView from './view/Chart.js';\nimport ComponentModel from './model/Component.js';\nimport SeriesModel from './model/Series.js';\nimport { isFunction, indexOf, isArray, each } from 'zrender/lib/core/util.js';\nimport { registerImpl } from './core/impl.js';\nimport { registerPainter } from 'zrender/lib/zrender.js';\nimport { registerCustomSeries } from './chart/custom/customSeriesRegister.js';\nvar extensions = [];\nvar extensionRegisters = {\n  registerPreprocessor: registerPreprocessor,\n  registerProcessor: registerProcessor,\n  registerPostInit: registerPostInit,\n  registerPostUpdate: registerPostUpdate,\n  registerUpdateLifecycle: registerUpdateLifecycle,\n  registerAction: registerAction,\n  registerCoordinateSystem: registerCoordinateSystem,\n  registerLayout: registerLayout,\n  registerVisual: registerVisual,\n  registerTransform: registerTransform,\n  registerLoading: registerLoading,\n  registerMap: registerMap,\n  registerImpl: registerImpl,\n  PRIORITY: PRIORITY,\n  ComponentModel: ComponentModel,\n  ComponentView: ComponentView,\n  SeriesModel: SeriesModel,\n  ChartView: ChartView,\n  // TODO Use ComponentModel and SeriesModel instead of Constructor\n  registerComponentModel: function (ComponentModelClass) {\n    ComponentModel.registerClass(ComponentModelClass);\n  },\n  registerComponentView: function (ComponentViewClass) {\n    ComponentView.registerClass(ComponentViewClass);\n  },\n  registerSeriesModel: function (SeriesModelClass) {\n    SeriesModel.registerClass(SeriesModelClass);\n  },\n  registerChartView: function (ChartViewClass) {\n    ChartView.registerClass(ChartViewClass);\n  },\n  registerCustomSeries: function (seriesType, renderItem) {\n    registerCustomSeries(seriesType, renderItem);\n  },\n  registerSubTypeDefaulter: function (componentType, defaulter) {\n    ComponentModel.registerSubTypeDefaulter(componentType, defaulter);\n  },\n  registerPainter: function (painterType, PainterCtor) {\n    registerPainter(painterType, PainterCtor);\n  }\n};\nexport function use(ext) {\n  if (isArray(ext)) {\n    // use([ChartLine, ChartBar]);\n    each(ext, function (singleExt) {\n      use(singleExt);\n    });\n    return;\n  }\n  if (indexOf(extensions, ext) >= 0) {\n    return;\n  }\n  extensions.push(ext);\n  if (isFunction(ext)) {\n    ext = {\n      install: ext\n    };\n  }\n  ext.install(extensionRegisters);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nfunction dataIndexMapValueLength(valNumOrArrLengthMoreThan2) {\n  return valNumOrArrLengthMoreThan2 == null ? 0 : valNumOrArrLengthMoreThan2.length || 1;\n}\nfunction defaultKeyGetter(item) {\n  return item;\n}\nvar DataDiffer = /** @class */function () {\n  /**\n   * @param context Can be visited by this.context in callback.\n   */\n  function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context,\n  // By default: 'oneToOne'.\n  diffMode) {\n    this._old = oldArr;\n    this._new = newArr;\n    this._oldKeyGetter = oldKeyGetter || defaultKeyGetter;\n    this._newKeyGetter = newKeyGetter || defaultKeyGetter;\n    // Visible in callback via `this.context`;\n    this.context = context;\n    this._diffModeMultiple = diffMode === 'multiple';\n  }\n  /**\n   * Callback function when add a data\n   */\n  DataDiffer.prototype.add = function (func) {\n    this._add = func;\n    return this;\n  };\n  /**\n   * Callback function when update a data\n   */\n  DataDiffer.prototype.update = function (func) {\n    this._update = func;\n    return this;\n  };\n  /**\n   * Callback function when update a data and only work in `cbMode: 'byKey'`.\n   */\n  DataDiffer.prototype.updateManyToOne = function (func) {\n    this._updateManyToOne = func;\n    return this;\n  };\n  /**\n   * Callback function when update a data and only work in `cbMode: 'byKey'`.\n   */\n  DataDiffer.prototype.updateOneToMany = function (func) {\n    this._updateOneToMany = func;\n    return this;\n  };\n  /**\n   * Callback function when update a data and only work in `cbMode: 'byKey'`.\n   */\n  DataDiffer.prototype.updateManyToMany = function (func) {\n    this._updateManyToMany = func;\n    return this;\n  };\n  /**\n   * Callback function when remove a data\n   */\n  DataDiffer.prototype.remove = function (func) {\n    this._remove = func;\n    return this;\n  };\n  DataDiffer.prototype.execute = function () {\n    this[this._diffModeMultiple ? '_executeMultiple' : '_executeOneToOne']();\n  };\n  DataDiffer.prototype._executeOneToOne = function () {\n    var oldArr = this._old;\n    var newArr = this._new;\n    var newDataIndexMap = {};\n    var oldDataKeyArr = new Array(oldArr.length);\n    var newDataKeyArr = new Array(newArr.length);\n    this._initIndexMap(oldArr, null, oldDataKeyArr, '_oldKeyGetter');\n    this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter');\n    for (var i = 0; i < oldArr.length; i++) {\n      var oldKey = oldDataKeyArr[i];\n      var newIdxMapVal = newDataIndexMap[oldKey];\n      var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal);\n      // idx can never be empty array here. see 'set null' logic below.\n      if (newIdxMapValLen > 1) {\n        // Consider there is duplicate key (for example, use dataItem.name as key).\n        // We should make sure every item in newArr and oldArr can be visited.\n        var newIdx = newIdxMapVal.shift();\n        if (newIdxMapVal.length === 1) {\n          newDataIndexMap[oldKey] = newIdxMapVal[0];\n        }\n        this._update && this._update(newIdx, i);\n      } else if (newIdxMapValLen === 1) {\n        newDataIndexMap[oldKey] = null;\n        this._update && this._update(newIdxMapVal, i);\n      } else {\n        this._remove && this._remove(i);\n      }\n    }\n    this._performRestAdd(newDataKeyArr, newDataIndexMap);\n  };\n  /**\n   * For example, consider the case:\n   * oldData: [o0, o1, o2, o3, o4, o5, o6, o7],\n   * newData: [n0, n1, n2, n3, n4, n5, n6, n7, n8],\n   * Where:\n   *     o0, o1, n0 has key 'a' (many to one)\n   *     o5, n4, n5, n6 has key 'b' (one to many)\n   *     o2, n1 has key 'c' (one to one)\n   *     n2, n3 has key 'd' (add)\n   *     o3, o4 has key 'e' (remove)\n   *     o6, o7, n7, n8 has key 'f' (many to many, treated as add and remove)\n   * Then:\n   *     (The order of the following directives are not ensured.)\n   *     this._updateManyToOne(n0, [o0, o1]);\n   *     this._updateOneToMany([n4, n5, n6], o5);\n   *     this._update(n1, o2);\n   *     this._remove(o3);\n   *     this._remove(o4);\n   *     this._remove(o6);\n   *     this._remove(o7);\n   *     this._add(n2);\n   *     this._add(n3);\n   *     this._add(n7);\n   *     this._add(n8);\n   */\n  DataDiffer.prototype._executeMultiple = function () {\n    var oldArr = this._old;\n    var newArr = this._new;\n    var oldDataIndexMap = {};\n    var newDataIndexMap = {};\n    var oldDataKeyArr = [];\n    var newDataKeyArr = [];\n    this._initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter');\n    this._initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter');\n    for (var i = 0; i < oldDataKeyArr.length; i++) {\n      var oldKey = oldDataKeyArr[i];\n      var oldIdxMapVal = oldDataIndexMap[oldKey];\n      var newIdxMapVal = newDataIndexMap[oldKey];\n      var oldIdxMapValLen = dataIndexMapValueLength(oldIdxMapVal);\n      var newIdxMapValLen = dataIndexMapValueLength(newIdxMapVal);\n      if (oldIdxMapValLen > 1 && newIdxMapValLen === 1) {\n        this._updateManyToOne && this._updateManyToOne(newIdxMapVal, oldIdxMapVal);\n        newDataIndexMap[oldKey] = null;\n      } else if (oldIdxMapValLen === 1 && newIdxMapValLen > 1) {\n        this._updateOneToMany && this._updateOneToMany(newIdxMapVal, oldIdxMapVal);\n        newDataIndexMap[oldKey] = null;\n      } else if (oldIdxMapValLen === 1 && newIdxMapValLen === 1) {\n        this._update && this._update(newIdxMapVal, oldIdxMapVal);\n        newDataIndexMap[oldKey] = null;\n      } else if (oldIdxMapValLen > 1 && newIdxMapValLen > 1) {\n        this._updateManyToMany && this._updateManyToMany(newIdxMapVal, oldIdxMapVal);\n        newDataIndexMap[oldKey] = null;\n      } else if (oldIdxMapValLen > 1) {\n        for (var i_1 = 0; i_1 < oldIdxMapValLen; i_1++) {\n          this._remove && this._remove(oldIdxMapVal[i_1]);\n        }\n      } else {\n        this._remove && this._remove(oldIdxMapVal);\n      }\n    }\n    this._performRestAdd(newDataKeyArr, newDataIndexMap);\n  };\n  DataDiffer.prototype._performRestAdd = function (newDataKeyArr, newDataIndexMap) {\n    for (var i = 0; i < newDataKeyArr.length; i++) {\n      var newKey = newDataKeyArr[i];\n      var newIdxMapVal = newDataIndexMap[newKey];\n      var idxMapValLen = dataIndexMapValueLength(newIdxMapVal);\n      if (idxMapValLen > 1) {\n        for (var j = 0; j < idxMapValLen; j++) {\n          this._add && this._add(newIdxMapVal[j]);\n        }\n      } else if (idxMapValLen === 1) {\n        this._add && this._add(newIdxMapVal);\n      }\n      // Support both `newDataKeyArr` are duplication removed or not removed.\n      newDataIndexMap[newKey] = null;\n    }\n  };\n  DataDiffer.prototype._initIndexMap = function (arr,\n  // Can be null.\n  map,\n  // In 'byKey', the output `keyArr` is duplication removed.\n  // In 'byIndex', the output `keyArr` is not duplication removed and\n  //     its indices are accurately corresponding to `arr`.\n  keyArr, keyGetterName) {\n    var cbModeMultiple = this._diffModeMultiple;\n    for (var i = 0; i < arr.length; i++) {\n      // Add prefix to avoid conflict with Object.prototype.\n      var key = '_ec_' + this[keyGetterName](arr[i], i);\n      if (!cbModeMultiple) {\n        keyArr[i] = key;\n      }\n      if (!map) {\n        continue;\n      }\n      var idxMapVal = map[key];\n      var idxMapValLen = dataIndexMapValueLength(idxMapVal);\n      if (idxMapValLen === 0) {\n        // Simple optimize: in most cases, one index has one key,\n        // do not need array.\n        map[key] = i;\n        if (cbModeMultiple) {\n          keyArr.push(key);\n        }\n      } else if (idxMapValLen === 1) {\n        map[key] = [idxMapVal, i];\n      } else {\n        idxMapVal.push(i);\n      }\n    }\n  };\n  return DataDiffer;\n}();\nexport default DataDiffer;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, createHashMap, assert, map } from 'zrender/lib/core/util.js';\nimport { VISUAL_DIMENSIONS } from '../../util/types.js';\nvar DimensionUserOuput = /** @class */function () {\n  function DimensionUserOuput(encode, dimRequest) {\n    this._encode = encode;\n    this._schema = dimRequest;\n  }\n  DimensionUserOuput.prototype.get = function () {\n    return {\n      // Do not generate full dimension name until fist used.\n      fullDimensions: this._getFullDimensionNames(),\n      encode: this._encode\n    };\n  };\n  /**\n   * Get all data store dimension names.\n   * Theoretically a series data store is defined both by series and used dataset (if any).\n   * If some dimensions are omitted for performance reason in `this.dimensions`,\n   * the dimension name may not be auto-generated if user does not specify a dimension name.\n   * In this case, the dimension name is `null`/`undefined`.\n   */\n  DimensionUserOuput.prototype._getFullDimensionNames = function () {\n    if (!this._cachedDimNames) {\n      this._cachedDimNames = this._schema ? this._schema.makeOutputDimensionNames() : [];\n    }\n    return this._cachedDimNames;\n  };\n  return DimensionUserOuput;\n}();\n;\nexport function summarizeDimensions(data, schema) {\n  var summary = {};\n  var encode = summary.encode = {};\n  var notExtraCoordDimMap = createHashMap();\n  var defaultedLabel = [];\n  var defaultedTooltip = [];\n  var userOutputEncode = {};\n  each(data.dimensions, function (dimName) {\n    var dimItem = data.getDimensionInfo(dimName);\n    var coordDim = dimItem.coordDim;\n    if (coordDim) {\n      if (process.env.NODE_ENV !== 'production') {\n        assert(VISUAL_DIMENSIONS.get(coordDim) == null);\n      }\n      var coordDimIndex = dimItem.coordDimIndex;\n      getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName;\n      if (!dimItem.isExtraCoord) {\n        notExtraCoordDimMap.set(coordDim, 1);\n        // Use the last coord dim (and label friendly) as default label,\n        // because when dataset is used, it is hard to guess which dimension\n        // can be value dimension. If both show x, y on label is not look good,\n        // and conventionally y axis is focused more.\n        if (mayLabelDimType(dimItem.type)) {\n          defaultedLabel[0] = dimName;\n        }\n        // User output encode do not contain generated coords.\n        // And it only has index. User can use index to retrieve value from the raw item array.\n        getOrCreateEncodeArr(userOutputEncode, coordDim)[coordDimIndex] = data.getDimensionIndex(dimItem.name);\n      }\n      if (dimItem.defaultTooltip) {\n        defaultedTooltip.push(dimName);\n      }\n    }\n    VISUAL_DIMENSIONS.each(function (v, otherDim) {\n      var encodeArr = getOrCreateEncodeArr(encode, otherDim);\n      var dimIndex = dimItem.otherDims[otherDim];\n      if (dimIndex != null && dimIndex !== false) {\n        encodeArr[dimIndex] = dimItem.name;\n      }\n    });\n  });\n  var dataDimsOnCoord = [];\n  var encodeFirstDimNotExtra = {};\n  notExtraCoordDimMap.each(function (v, coordDim) {\n    var dimArr = encode[coordDim];\n    encodeFirstDimNotExtra[coordDim] = dimArr[0];\n    // Not necessary to remove duplicate, because a data\n    // dim canot on more than one coordDim.\n    dataDimsOnCoord = dataDimsOnCoord.concat(dimArr);\n  });\n  summary.dataDimsOnCoord = dataDimsOnCoord;\n  summary.dataDimIndicesOnCoord = map(dataDimsOnCoord, function (dimName) {\n    return data.getDimensionInfo(dimName).storeDimIndex;\n  });\n  summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra;\n  var encodeLabel = encode.label;\n  // FIXME `encode.label` is not recommended, because formatter cannot be set\n  // in this way. Use label.formatter instead. Maybe remove this approach someday.\n  if (encodeLabel && encodeLabel.length) {\n    defaultedLabel = encodeLabel.slice();\n  }\n  var encodeTooltip = encode.tooltip;\n  if (encodeTooltip && encodeTooltip.length) {\n    defaultedTooltip = encodeTooltip.slice();\n  } else if (!defaultedTooltip.length) {\n    defaultedTooltip = defaultedLabel.slice();\n  }\n  encode.defaultedLabel = defaultedLabel;\n  encode.defaultedTooltip = defaultedTooltip;\n  summary.userOutput = new DimensionUserOuput(userOutputEncode, schema);\n  return summary;\n}\nfunction getOrCreateEncodeArr(encode, dim) {\n  if (!encode.hasOwnProperty(dim)) {\n    encode[dim] = [];\n  }\n  return encode[dim];\n}\n// FIXME:TS should be type `AxisType`\nexport function getDimensionTypeByAxis(axisType) {\n  return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float';\n}\nfunction mayLabelDimType(dimType) {\n  // In most cases, ordinal and time do not suitable for label.\n  // Ordinal info can be displayed on axis. Time is too long.\n  return !(dimType === 'ordinal' || dimType === 'time');\n}\n// function findTheLastDimMayLabel(data) {\n//     // Get last value dim\n//     let dimensions = data.dimensions.slice();\n//     let valueType;\n//     let valueDim;\n//     while (dimensions.length && (\n//         valueDim = dimensions.pop(),\n//         valueType = data.getDimensionInfo(valueDim).type,\n//         valueType === 'ordinal' || valueType === 'time'\n//     )) {} // jshint ignore:line\n//     return valueDim;\n// }", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar SeriesDimensionDefine = /** @class */function () {\n  /**\n   * @param opt All of the fields will be shallow copied.\n   */\n  function SeriesDimensionDefine(opt) {\n    /**\n     * The format of `otherDims` is:\n     * ```js\n     * {\n     *     tooltip?: number\n     *     label?: number\n     *     itemName?: number\n     *     seriesName?: number\n     * }\n     * ```\n     *\n     * A `series.encode` can specified these fields:\n     * ```js\n     * encode: {\n     *     // \"3, 1, 5\" is the index of data dimension.\n     *     tooltip: [3, 1, 5],\n     *     label: [0, 3],\n     *     ...\n     * }\n     * ```\n     * `otherDims` is the parse result of the `series.encode` above, like:\n     * ```js\n     * // Suppose the index of this data dimension is `3`.\n     * this.otherDims = {\n     *     // `3` is at the index `0` of the `encode.tooltip`\n     *     tooltip: 0,\n     *     // `3` is at the index `1` of the `encode.label`\n     *     label: 1\n     * };\n     * ```\n     *\n     * This prop should never be `null`/`undefined` after initialized.\n     */\n    this.otherDims = {};\n    if (opt != null) {\n      zrUtil.extend(this, opt);\n    }\n  }\n  return SeriesDimensionDefine;\n}();\n;\nexport default SeriesDimensionDefine;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, isObject, retrieve2 } from 'zrender/lib/core/util.js';\nimport { makeInner } from '../../util/model.js';\nimport { shouldRetrieveDataByName } from '../Source.js';\nvar inner = makeInner();\nvar dimTypeShort = {\n  float: 'f',\n  int: 'i',\n  ordinal: 'o',\n  number: 'n',\n  time: 't'\n};\n/**\n * Represents the dimension requirement of a series.\n *\n * NOTICE:\n * When there are too many dimensions in dataset and many series, only the used dimensions\n * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`.\n * But users may query data by other unused dimension names.\n * In this case, users can only query data if and only if they have defined dimension names\n * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from\n * `source` dimensions.\n */\nvar SeriesDataSchema = /** @class */function () {\n  function SeriesDataSchema(opt) {\n    this.dimensions = opt.dimensions;\n    this._dimOmitted = opt.dimensionOmitted;\n    this.source = opt.source;\n    this._fullDimCount = opt.fullDimensionCount;\n    this._updateDimOmitted(opt.dimensionOmitted);\n  }\n  SeriesDataSchema.prototype.isDimensionOmitted = function () {\n    return this._dimOmitted;\n  };\n  SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) {\n    this._dimOmitted = dimensionOmitted;\n    if (!dimensionOmitted) {\n      return;\n    }\n    if (!this._dimNameMap) {\n      this._dimNameMap = ensureSourceDimNameMap(this.source);\n    }\n  };\n  /**\n   * @caution Can only be used when `dimensionOmitted: true`.\n   *\n   * Get index by user defined dimension name (i.e., not internal generate name).\n   * That is, get index from `dimensionsDefine`.\n   * If no `dimensionsDefine`, or no name get, return -1.\n   */\n  SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) {\n    return retrieve2(this._dimNameMap.get(dimName), -1);\n  };\n  /**\n   * @caution Can only be used when `dimensionOmitted: true`.\n   *\n   * Notice: may return `null`/`undefined` if user not specify dimension names.\n   */\n  SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) {\n    var dimensionsDefine = this.source.dimensionsDefine;\n    if (dimensionsDefine) {\n      return dimensionsDefine[dimIndex];\n    }\n  };\n  SeriesDataSchema.prototype.makeStoreSchema = function () {\n    var dimCount = this._fullDimCount;\n    var willRetrieveDataByName = shouldRetrieveDataByName(this.source);\n    var makeHashStrict = !shouldOmitUnusedDimensions(dimCount);\n    // If source don't have dimensions or series don't omit unsed dimensions.\n    // Generate from seriesDimList directly\n    var dimHash = '';\n    var dims = [];\n    for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) {\n      var property = void 0;\n      var type = void 0;\n      var ordinalMeta = void 0;\n      var seriesDimDef = this.dimensions[seriesDimIdx];\n      // The list has been sorted by `storeDimIndex` asc.\n      if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) {\n        property = willRetrieveDataByName ? seriesDimDef.name : null;\n        type = seriesDimDef.type;\n        ordinalMeta = seriesDimDef.ordinalMeta;\n        seriesDimIdx++;\n      } else {\n        var sourceDimDef = this.getSourceDimension(fullDimIdx);\n        if (sourceDimDef) {\n          property = willRetrieveDataByName ? sourceDimDef.name : null;\n          type = sourceDimDef.type;\n        }\n      }\n      dims.push({\n        property: property,\n        type: type,\n        ordinalMeta: ordinalMeta\n      });\n      // If retrieving data by index,\n      //   use <index, type, ordinalMeta> to determine whether data can be shared.\n      //   (Because in this case there might be no dimension name defined in dataset, but indices always exists).\n      //   (Indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash).\n      // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`),\n      //   use <property, type, ordinalMeta> in hash.\n      if (willRetrieveDataByName && property != null\n      // For data stack, we have make sure each series has its own dim on this store.\n      // So we do not add property to hash to make sure they can share this store.\n      && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) {\n        dimHash += makeHashStrict\n        // Use escape character '`' in case that property name contains '$'.\n        ? property.replace(/\\`/g, '`1').replace(/\\$/g, '`2')\n        // For better performance, when there are large dimensions, tolerant this defects that hardly meet.\n        : property;\n      }\n      dimHash += '$';\n      dimHash += dimTypeShort[type] || 'f';\n      if (ordinalMeta) {\n        dimHash += ordinalMeta.uid;\n      }\n      dimHash += '$';\n    }\n    // Source from endpoint(usually series) will be read differently\n    // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different.\n    // So we use this three props as key.\n    var source = this.source;\n    var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$');\n    return {\n      dimensions: dims,\n      hash: hash\n    };\n  };\n  SeriesDataSchema.prototype.makeOutputDimensionNames = function () {\n    var result = [];\n    for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) {\n      var name_1 = void 0;\n      var seriesDimDef = this.dimensions[seriesDimIdx];\n      // The list has been sorted by `storeDimIndex` asc.\n      if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) {\n        if (!seriesDimDef.isCalculationCoord) {\n          name_1 = seriesDimDef.name;\n        }\n        seriesDimIdx++;\n      } else {\n        var sourceDimDef = this.getSourceDimension(fullDimIdx);\n        if (sourceDimDef) {\n          name_1 = sourceDimDef.name;\n        }\n      }\n      result.push(name_1);\n    }\n    return result;\n  };\n  SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) {\n    this.dimensions.push(dimDef);\n    dimDef.isCalculationCoord = true;\n    this._fullDimCount++;\n    // If append dimension on a data store, consider the store\n    // might be shared by different series, series dimensions not\n    // really map to store dimensions.\n    this._updateDimOmitted(true);\n  };\n  return SeriesDataSchema;\n}();\nexport { SeriesDataSchema };\nexport function isSeriesDataSchema(schema) {\n  return schema instanceof SeriesDataSchema;\n}\nexport function createDimNameMap(dimsDef) {\n  var dataDimNameMap = createHashMap();\n  for (var i = 0; i < (dimsDef || []).length; i++) {\n    var dimDefItemRaw = dimsDef[i];\n    var userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw;\n    if (userDimName != null && dataDimNameMap.get(userDimName) == null) {\n      dataDimNameMap.set(userDimName, i);\n    }\n  }\n  return dataDimNameMap;\n}\nexport function ensureSourceDimNameMap(source) {\n  var innerSource = inner(source);\n  return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine));\n}\nexport function shouldOmitUnusedDimensions(dimCount) {\n  return dimCount > 30;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/* global Int32Array */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Model from '../model/Model.js';\nimport DataDiffer from './DataDiffer.js';\nimport { DefaultDataProvider } from './helper/dataProvider.js';\nimport { summarizeDimensions } from './helper/dimensionHelper.js';\nimport SeriesDimensionDefine from './SeriesDimensionDefine.js';\nimport { SOURCE_FORMAT_TYPED_ARRAY, SOURCE_FORMAT_ORIGINAL } from '../util/types.js';\nimport { convertOptionIdName, isDataItemOption } from '../util/model.js';\nimport { setCommonECData } from '../util/innerStore.js';\nimport { isSourceInstance } from './Source.js';\nimport DataStore from './DataStore.js';\nimport { isSeriesDataSchema } from './helper/SeriesDataSchema.js';\nvar isObject = zrUtil.isObject;\nvar map = zrUtil.map;\nvar CtorInt32Array = typeof Int32Array === 'undefined' ? Array : Int32Array;\n// Use prefix to avoid index to be the same as otherIdList[idx],\n// which will cause weird update animation.\nvar ID_PREFIX = 'e\\0\\0';\nvar INDEX_NOT_FOUND = -1;\n// type SeriesDimensionIndex = DimensionIndex;\nvar TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_dimSummary', 'userOutput', '_rawData', '_dimValueGetter', '_nameDimIdx', '_idDimIdx', '_nameRepeatCount'];\nvar CLONE_PROPERTIES = ['_approximateExtent'];\n// -----------------------------\n// Internal method declarations:\n// -----------------------------\nvar prepareInvertedIndex;\nvar getId;\nvar getIdNameFromStore;\nvar normalizeDimensions;\nvar transferProperties;\nvar cloneListForMapAndSample;\nvar makeIdFromName;\nvar SeriesData = /** @class */function () {\n  /**\n   * @param dimensionsInput.dimensions\n   *        For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].\n   *        Dimensions should be concrete names like x, y, z, lng, lat, angle, radius\n   */\n  function SeriesData(dimensionsInput, hostModel) {\n    this.type = 'list';\n    this._dimOmitted = false;\n    this._nameList = [];\n    this._idList = [];\n    // Models of data option is stored sparse for optimizing memory cost\n    // Never used yet (not used yet).\n    // private _optionModels: Model[] = [];\n    // Global visual properties after visual coding\n    this._visual = {};\n    // Global layout properties.\n    this._layout = {};\n    // Item visual properties after visual coding\n    this._itemVisuals = [];\n    // Item layout properties after layout\n    this._itemLayouts = [];\n    // Graphic elements\n    this._graphicEls = [];\n    // key: dim, value: extent\n    this._approximateExtent = {};\n    this._calculationInfo = {};\n    // Having detected that there is data item is non primitive type\n    // (in type `OptionDataItemObject`).\n    // Like `data: [ { value: xx, itemStyle: {...} }, ...]`\n    // At present it only happen in `SOURCE_FORMAT_ORIGINAL`.\n    this.hasItemOption = false;\n    // Methods that create a new list based on this list should be listed here.\n    // Notice that those method should `RETURN` the new list.\n    this.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'minmaxDownSample', 'lttbDownSample', 'map'];\n    // Methods that change indices of this list should be listed here.\n    this.CHANGABLE_METHODS = ['filterSelf', 'selectRange'];\n    this.DOWNSAMPLE_METHODS = ['downSample', 'minmaxDownSample', 'lttbDownSample'];\n    var dimensions;\n    var assignStoreDimIdx = false;\n    if (isSeriesDataSchema(dimensionsInput)) {\n      dimensions = dimensionsInput.dimensions;\n      this._dimOmitted = dimensionsInput.isDimensionOmitted();\n      this._schema = dimensionsInput;\n    } else {\n      assignStoreDimIdx = true;\n      dimensions = dimensionsInput;\n    }\n    dimensions = dimensions || ['x', 'y'];\n    var dimensionInfos = {};\n    var dimensionNames = [];\n    var invertedIndicesMap = {};\n    var needsHasOwn = false;\n    var emptyObj = {};\n    for (var i = 0; i < dimensions.length; i++) {\n      // Use the original dimensions[i], where other flag props may exists.\n      var dimInfoInput = dimensions[i];\n      var dimensionInfo = zrUtil.isString(dimInfoInput) ? new SeriesDimensionDefine({\n        name: dimInfoInput\n      }) : !(dimInfoInput instanceof SeriesDimensionDefine) ? new SeriesDimensionDefine(dimInfoInput) : dimInfoInput;\n      var dimensionName = dimensionInfo.name;\n      dimensionInfo.type = dimensionInfo.type || 'float';\n      if (!dimensionInfo.coordDim) {\n        dimensionInfo.coordDim = dimensionName;\n        dimensionInfo.coordDimIndex = 0;\n      }\n      var otherDims = dimensionInfo.otherDims = dimensionInfo.otherDims || {};\n      dimensionNames.push(dimensionName);\n      dimensionInfos[dimensionName] = dimensionInfo;\n      if (emptyObj[dimensionName] != null) {\n        needsHasOwn = true;\n      }\n      if (dimensionInfo.createInvertedIndices) {\n        invertedIndicesMap[dimensionName] = [];\n      }\n      var dimIdx = i;\n      if (zrUtil.isNumber(dimensionInfo.storeDimIndex)) {\n        dimIdx = dimensionInfo.storeDimIndex;\n      }\n      if (otherDims.itemName === 0) {\n        this._nameDimIdx = dimIdx;\n      }\n      if (otherDims.itemId === 0) {\n        this._idDimIdx = dimIdx;\n      }\n      if (process.env.NODE_ENV !== 'production') {\n        zrUtil.assert(assignStoreDimIdx || dimensionInfo.storeDimIndex >= 0);\n      }\n      if (assignStoreDimIdx) {\n        dimensionInfo.storeDimIndex = i;\n      }\n    }\n    this.dimensions = dimensionNames;\n    this._dimInfos = dimensionInfos;\n    this._initGetDimensionInfo(needsHasOwn);\n    this.hostModel = hostModel;\n    this._invertedIndicesMap = invertedIndicesMap;\n    if (this._dimOmitted) {\n      var dimIdxToName_1 = this._dimIdxToName = zrUtil.createHashMap();\n      zrUtil.each(dimensionNames, function (dimName) {\n        dimIdxToName_1.set(dimensionInfos[dimName].storeDimIndex, dimName);\n      });\n    }\n  }\n  /**\n   *\n   * Get concrete dimension name by dimension name or dimension index.\n   * If input a dimension name, do not validate whether the dimension name exits.\n   *\n   * @caution\n   * @param dim Must make sure the dimension is `SeriesDimensionLoose`.\n   * Because only those dimensions will have auto-generated dimension names if not\n   * have a user-specified name, and other dimensions will get a return of null/undefined.\n   *\n   * @notice Because of this reason, should better use `getDimensionIndex` instead, for examples:\n   * ```js\n   * const val = data.getStore().get(data.getDimensionIndex(dim), dataIdx);\n   * ```\n   *\n   * @return Concrete dim name.\n   */\n  SeriesData.prototype.getDimension = function (dim) {\n    var dimIdx = this._recognizeDimIndex(dim);\n    if (dimIdx == null) {\n      return dim;\n    }\n    dimIdx = dim;\n    if (!this._dimOmitted) {\n      return this.dimensions[dimIdx];\n    }\n    // Retrieve from series dimension definition because it probably contains\n    // generated dimension name (like 'x', 'y').\n    var dimName = this._dimIdxToName.get(dimIdx);\n    if (dimName != null) {\n      return dimName;\n    }\n    var sourceDimDef = this._schema.getSourceDimension(dimIdx);\n    if (sourceDimDef) {\n      return sourceDimDef.name;\n    }\n  };\n  /**\n   * Get dimension index in data store. Return -1 if not found.\n   * Can be used to index value from getRawValue.\n   */\n  SeriesData.prototype.getDimensionIndex = function (dim) {\n    var dimIdx = this._recognizeDimIndex(dim);\n    if (dimIdx != null) {\n      return dimIdx;\n    }\n    if (dim == null) {\n      return -1;\n    }\n    var dimInfo = this._getDimInfo(dim);\n    return dimInfo ? dimInfo.storeDimIndex : this._dimOmitted ? this._schema.getSourceDimensionIndex(dim) : -1;\n  };\n  /**\n   * The meanings of the input parameter `dim`:\n   *\n   * + If dim is a number (e.g., `1`), it means the index of the dimension.\n   *   For example, `getDimension(0)` will return 'x' or 'lng' or 'radius'.\n   * + If dim is a number-like string (e.g., `\"1\"`):\n   *     + If there is the same concrete dim name defined in `series.dimensions` or `dataset.dimensions`,\n   *        it means that concrete name.\n   *     + If not, it will be converted to a number, which means the index of the dimension.\n   *        (why? because of the backward compatibility. We have been tolerating number-like string in\n   *        dimension setting, although now it seems that it is not a good idea.)\n   *     For example, `visualMap[i].dimension: \"1\"` is the same meaning as `visualMap[i].dimension: 1`,\n   *     if no dimension name is defined as `\"1\"`.\n   * + If dim is a not-number-like string, it means the concrete dim name.\n   *   For example, it can be be default name `\"x\"`, `\"y\"`, `\"z\"`, `\"lng\"`, `\"lat\"`, `\"angle\"`, `\"radius\"`,\n   *   or customized in `dimensions` property of option like `\"age\"`.\n   *\n   * @return recognized `DimensionIndex`. Otherwise return null/undefined (means that dim is `DimensionName`).\n   */\n  SeriesData.prototype._recognizeDimIndex = function (dim) {\n    if (zrUtil.isNumber(dim)\n    // If being a number-like string but not being defined as a dimension name.\n    || dim != null && !isNaN(dim) && !this._getDimInfo(dim) && (!this._dimOmitted || this._schema.getSourceDimensionIndex(dim) < 0)) {\n      return +dim;\n    }\n  };\n  SeriesData.prototype._getStoreDimIndex = function (dim) {\n    var dimIdx = this.getDimensionIndex(dim);\n    if (process.env.NODE_ENV !== 'production') {\n      if (dimIdx == null) {\n        throw new Error('Unknown dimension ' + dim);\n      }\n    }\n    return dimIdx;\n  };\n  /**\n   * Get type and calculation info of particular dimension\n   * @param dim\n   *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius\n   *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'\n   */\n  SeriesData.prototype.getDimensionInfo = function (dim) {\n    // Do not clone, because there may be categories in dimInfo.\n    return this._getDimInfo(this.getDimension(dim));\n  };\n  SeriesData.prototype._initGetDimensionInfo = function (needsHasOwn) {\n    var dimensionInfos = this._dimInfos;\n    this._getDimInfo = needsHasOwn ? function (dimName) {\n      return dimensionInfos.hasOwnProperty(dimName) ? dimensionInfos[dimName] : undefined;\n    } : function (dimName) {\n      return dimensionInfos[dimName];\n    };\n  };\n  /**\n   * concrete dimension name list on coord.\n   */\n  SeriesData.prototype.getDimensionsOnCoord = function () {\n    return this._dimSummary.dataDimsOnCoord.slice();\n  };\n  SeriesData.prototype.mapDimension = function (coordDim, idx) {\n    var dimensionsSummary = this._dimSummary;\n    if (idx == null) {\n      return dimensionsSummary.encodeFirstDimNotExtra[coordDim];\n    }\n    var dims = dimensionsSummary.encode[coordDim];\n    return dims ? dims[idx] : null;\n  };\n  SeriesData.prototype.mapDimensionsAll = function (coordDim) {\n    var dimensionsSummary = this._dimSummary;\n    var dims = dimensionsSummary.encode[coordDim];\n    return (dims || []).slice();\n  };\n  SeriesData.prototype.getStore = function () {\n    return this._store;\n  };\n  /**\n   * Initialize from data\n   * @param data source or data or data store.\n   * @param nameList The name of a datum is used on data diff and\n   *        default label/tooltip.\n   *        A name can be specified in encode.itemName,\n   *        or dataItem.name (only for series option data),\n   *        or provided in nameList from outside.\n   */\n  SeriesData.prototype.initData = function (data, nameList, dimValueGetter) {\n    var _this = this;\n    var store;\n    if (data instanceof DataStore) {\n      store = data;\n    }\n    if (!store) {\n      var dimensions = this.dimensions;\n      var provider = isSourceInstance(data) || zrUtil.isArrayLike(data) ? new DefaultDataProvider(data, dimensions.length) : data;\n      store = new DataStore();\n      var dimensionInfos = map(dimensions, function (dimName) {\n        return {\n          type: _this._dimInfos[dimName].type,\n          property: dimName\n        };\n      });\n      store.initData(provider, dimensionInfos, dimValueGetter);\n    }\n    this._store = store;\n    // Reset\n    this._nameList = (nameList || []).slice();\n    this._idList = [];\n    this._nameRepeatCount = {};\n    this._doInit(0, store.count());\n    // Cache summary info for fast visit. See \"dimensionHelper\".\n    // Needs to be initialized after store is prepared.\n    this._dimSummary = summarizeDimensions(this, this._schema);\n    this.userOutput = this._dimSummary.userOutput;\n  };\n  /**\n   * Caution: Can be only called on raw data (before `this._indices` created).\n   */\n  SeriesData.prototype.appendData = function (data) {\n    var range = this._store.appendData(data);\n    this._doInit(range[0], range[1]);\n  };\n  /**\n   * Caution: Can be only called on raw data (before `this._indices` created).\n   * This method does not modify `rawData` (`dataProvider`), but only\n   * add values to store.\n   *\n   * The final count will be increased by `Math.max(values.length, names.length)`.\n   *\n   * @param values That is the SourceType: 'arrayRows', like\n   *        [\n   *            [12, 33, 44],\n   *            [NaN, 43, 1],\n   *            ['-', 'asdf', 0]\n   *        ]\n   *        Each item is exactly corresponding to a dimension.\n   */\n  SeriesData.prototype.appendValues = function (values, names) {\n    var _a = this._store.appendValues(values, names && names.length),\n      start = _a.start,\n      end = _a.end;\n    var shouldMakeIdFromName = this._shouldMakeIdFromName();\n    this._updateOrdinalMeta();\n    if (names) {\n      for (var idx = start; idx < end; idx++) {\n        var sourceIdx = idx - start;\n        this._nameList[idx] = names[sourceIdx];\n        if (shouldMakeIdFromName) {\n          makeIdFromName(this, idx);\n        }\n      }\n    }\n  };\n  SeriesData.prototype._updateOrdinalMeta = function () {\n    var store = this._store;\n    var dimensions = this.dimensions;\n    for (var i = 0; i < dimensions.length; i++) {\n      var dimInfo = this._dimInfos[dimensions[i]];\n      if (dimInfo.ordinalMeta) {\n        store.collectOrdinalMeta(dimInfo.storeDimIndex, dimInfo.ordinalMeta);\n      }\n    }\n  };\n  SeriesData.prototype._shouldMakeIdFromName = function () {\n    var provider = this._store.getProvider();\n    return this._idDimIdx == null && provider.getSource().sourceFormat !== SOURCE_FORMAT_TYPED_ARRAY && !provider.fillStorage;\n  };\n  SeriesData.prototype._doInit = function (start, end) {\n    if (start >= end) {\n      return;\n    }\n    var store = this._store;\n    var provider = store.getProvider();\n    this._updateOrdinalMeta();\n    var nameList = this._nameList;\n    var idList = this._idList;\n    var sourceFormat = provider.getSource().sourceFormat;\n    var isFormatOriginal = sourceFormat === SOURCE_FORMAT_ORIGINAL;\n    // Each data item is value\n    // [1, 2]\n    // 2\n    // Bar chart, line chart which uses category axis\n    // only gives the 'y' value. 'x' value is the indices of category\n    // Use a tempValue to normalize the value to be a (x, y) value\n    // If dataItem is {name: ...} or {id: ...}, it has highest priority.\n    // This kind of ids and names are always stored `_nameList` and `_idList`.\n    if (isFormatOriginal && !provider.pure) {\n      var sharedDataItem = [];\n      for (var idx = start; idx < end; idx++) {\n        // NOTICE: Try not to write things into dataItem\n        var dataItem = provider.getItem(idx, sharedDataItem);\n        if (!this.hasItemOption && isDataItemOption(dataItem)) {\n          this.hasItemOption = true;\n        }\n        if (dataItem) {\n          var itemName = dataItem.name;\n          if (nameList[idx] == null && itemName != null) {\n            nameList[idx] = convertOptionIdName(itemName, null);\n          }\n          var itemId = dataItem.id;\n          if (idList[idx] == null && itemId != null) {\n            idList[idx] = convertOptionIdName(itemId, null);\n          }\n        }\n      }\n    }\n    if (this._shouldMakeIdFromName()) {\n      for (var idx = start; idx < end; idx++) {\n        makeIdFromName(this, idx);\n      }\n    }\n    prepareInvertedIndex(this);\n  };\n  /**\n   * PENDING: In fact currently this function is only used to short-circuit\n   * the calling of `scale.unionExtentFromData` when data have been filtered by modules\n   * like \"dataZoom\". `scale.unionExtentFromData` is used to calculate data extent for series on\n   * an axis, but if a \"axis related data filter module\" is used, the extent of the axis have\n   * been fixed and no need to calling `scale.unionExtentFromData` actually.\n   * But if we add \"custom data filter\" in future, which is not \"axis related\", this method may\n   * be still needed.\n   *\n   * Optimize for the scenario that data is filtered by a given extent.\n   * Consider that if data amount is more than hundreds of thousand,\n   * extent calculation will cost more than 10ms and the cache will\n   * be erased because of the filtering.\n   */\n  SeriesData.prototype.getApproximateExtent = function (dim) {\n    return this._approximateExtent[dim] || this._store.getDataExtent(this._getStoreDimIndex(dim));\n  };\n  /**\n   * Calculate extent on a filtered data might be time consuming.\n   * Approximate extent is only used for: calculate extent of filtered data outside.\n   */\n  SeriesData.prototype.setApproximateExtent = function (extent, dim) {\n    dim = this.getDimension(dim);\n    this._approximateExtent[dim] = extent.slice();\n  };\n  SeriesData.prototype.getCalculationInfo = function (key) {\n    return this._calculationInfo[key];\n  };\n  SeriesData.prototype.setCalculationInfo = function (key, value) {\n    isObject(key) ? zrUtil.extend(this._calculationInfo, key) : this._calculationInfo[key] = value;\n  };\n  /**\n   * @return Never be null/undefined. `number` will be converted to string. Because:\n   * In most cases, name is used in display, where returning a string is more convenient.\n   * In other cases, name is used in query (see `indexOfName`), where we can keep the\n   * rule that name `2` equals to name `'2'`.\n   */\n  SeriesData.prototype.getName = function (idx) {\n    var rawIndex = this.getRawIndex(idx);\n    var name = this._nameList[rawIndex];\n    if (name == null && this._nameDimIdx != null) {\n      name = getIdNameFromStore(this, this._nameDimIdx, rawIndex);\n    }\n    if (name == null) {\n      name = '';\n    }\n    return name;\n  };\n  SeriesData.prototype._getCategory = function (dimIdx, idx) {\n    var ordinal = this._store.get(dimIdx, idx);\n    var ordinalMeta = this._store.getOrdinalMeta(dimIdx);\n    if (ordinalMeta) {\n      return ordinalMeta.categories[ordinal];\n    }\n    return ordinal;\n  };\n  /**\n   * @return Never null/undefined. `number` will be converted to string. Because:\n   * In all cases having encountered at present, id is used in making diff comparison, which\n   * are usually based on hash map. We can keep the rule that the internal id are always string\n   * (treat `2` is the same as `'2'`) to make the related logic simple.\n   */\n  SeriesData.prototype.getId = function (idx) {\n    return getId(this, this.getRawIndex(idx));\n  };\n  SeriesData.prototype.count = function () {\n    return this._store.count();\n  };\n  /**\n   * Get value. Return NaN if idx is out of range.\n   *\n   * @notice Should better to use `data.getStore().get(dimIndex, dataIdx)` instead.\n   */\n  SeriesData.prototype.get = function (dim, idx) {\n    var store = this._store;\n    var dimInfo = this._dimInfos[dim];\n    if (dimInfo) {\n      return store.get(dimInfo.storeDimIndex, idx);\n    }\n  };\n  /**\n   * @notice Should better to use `data.getStore().getByRawIndex(dimIndex, dataIdx)` instead.\n   */\n  SeriesData.prototype.getByRawIndex = function (dim, rawIdx) {\n    var store = this._store;\n    var dimInfo = this._dimInfos[dim];\n    if (dimInfo) {\n      return store.getByRawIndex(dimInfo.storeDimIndex, rawIdx);\n    }\n  };\n  SeriesData.prototype.getIndices = function () {\n    return this._store.getIndices();\n  };\n  SeriesData.prototype.getDataExtent = function (dim) {\n    return this._store.getDataExtent(this._getStoreDimIndex(dim));\n  };\n  SeriesData.prototype.getSum = function (dim) {\n    return this._store.getSum(this._getStoreDimIndex(dim));\n  };\n  SeriesData.prototype.getMedian = function (dim) {\n    return this._store.getMedian(this._getStoreDimIndex(dim));\n  };\n  SeriesData.prototype.getValues = function (dimensions, idx) {\n    var _this = this;\n    var store = this._store;\n    return zrUtil.isArray(dimensions) ? store.getValues(map(dimensions, function (dim) {\n      return _this._getStoreDimIndex(dim);\n    }), idx) : store.getValues(dimensions);\n  };\n  /**\n   * If value is NaN. Including '-'\n   * Only check the coord dimensions.\n   */\n  SeriesData.prototype.hasValue = function (idx) {\n    var dataDimIndicesOnCoord = this._dimSummary.dataDimIndicesOnCoord;\n    for (var i = 0, len = dataDimIndicesOnCoord.length; i < len; i++) {\n      // Ordinal type originally can be string or number.\n      // But when an ordinal type is used on coord, it can\n      // not be string but only number. So we can also use isNaN.\n      if (isNaN(this._store.get(dataDimIndicesOnCoord[i], idx))) {\n        return false;\n      }\n    }\n    return true;\n  };\n  /**\n   * Retrieve the index with given name\n   */\n  SeriesData.prototype.indexOfName = function (name) {\n    for (var i = 0, len = this._store.count(); i < len; i++) {\n      if (this.getName(i) === name) {\n        return i;\n      }\n    }\n    return -1;\n  };\n  SeriesData.prototype.getRawIndex = function (idx) {\n    return this._store.getRawIndex(idx);\n  };\n  SeriesData.prototype.indexOfRawIndex = function (rawIndex) {\n    return this._store.indexOfRawIndex(rawIndex);\n  };\n  /**\n   * Only support the dimension which inverted index created.\n   * Do not support other cases until required.\n   * @param dim concrete dim\n   * @param value ordinal index\n   * @return rawIndex\n   */\n  SeriesData.prototype.rawIndexOf = function (dim, value) {\n    var invertedIndices = dim && this._invertedIndicesMap[dim];\n    if (process.env.NODE_ENV !== 'production') {\n      if (!invertedIndices) {\n        throw new Error('Do not supported yet');\n      }\n    }\n    var rawIndex = invertedIndices && invertedIndices[value];\n    if (rawIndex == null || isNaN(rawIndex)) {\n      return INDEX_NOT_FOUND;\n    }\n    return rawIndex;\n  };\n  SeriesData.prototype.each = function (dims, cb, ctx) {\n    'use strict';\n\n    if (zrUtil.isFunction(dims)) {\n      ctx = cb;\n      cb = dims;\n      dims = [];\n    }\n    // ctxCompat just for compat echarts3\n    var fCtx = ctx || this;\n    var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this);\n    this._store.each(dimIndices, fCtx ? zrUtil.bind(cb, fCtx) : cb);\n  };\n  SeriesData.prototype.filterSelf = function (dims, cb, ctx) {\n    'use strict';\n\n    if (zrUtil.isFunction(dims)) {\n      ctx = cb;\n      cb = dims;\n      dims = [];\n    }\n    // ctxCompat just for compat echarts3\n    var fCtx = ctx || this;\n    var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this);\n    this._store = this._store.filter(dimIndices, fCtx ? zrUtil.bind(cb, fCtx) : cb);\n    return this;\n  };\n  /**\n   * Select data in range. (For optimization of filter)\n   * (Manually inline code, support 5 million data filtering in data zoom.)\n   */\n  SeriesData.prototype.selectRange = function (range) {\n    'use strict';\n\n    var _this = this;\n    var innerRange = {};\n    var dims = zrUtil.keys(range);\n    var dimIndices = [];\n    zrUtil.each(dims, function (dim) {\n      var dimIdx = _this._getStoreDimIndex(dim);\n      innerRange[dimIdx] = range[dim];\n      dimIndices.push(dimIdx);\n    });\n    this._store = this._store.selectRange(innerRange);\n    return this;\n  };\n  /* eslint-enable max-len */\n  SeriesData.prototype.mapArray = function (dims, cb, ctx) {\n    'use strict';\n\n    if (zrUtil.isFunction(dims)) {\n      ctx = cb;\n      cb = dims;\n      dims = [];\n    }\n    // ctxCompat just for compat echarts3\n    ctx = ctx || this;\n    var result = [];\n    this.each(dims, function () {\n      result.push(cb && cb.apply(this, arguments));\n    }, ctx);\n    return result;\n  };\n  SeriesData.prototype.map = function (dims, cb, ctx, ctxCompat) {\n    'use strict';\n\n    // ctxCompat just for compat echarts3\n    var fCtx = ctx || ctxCompat || this;\n    var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this);\n    var list = cloneListForMapAndSample(this);\n    list._store = this._store.map(dimIndices, fCtx ? zrUtil.bind(cb, fCtx) : cb);\n    return list;\n  };\n  SeriesData.prototype.modify = function (dims, cb, ctx, ctxCompat) {\n    var _this = this;\n    // ctxCompat just for compat echarts3\n    var fCtx = ctx || ctxCompat || this;\n    if (process.env.NODE_ENV !== 'production') {\n      zrUtil.each(normalizeDimensions(dims), function (dim) {\n        var dimInfo = _this.getDimensionInfo(dim);\n        if (!dimInfo.isCalculationCoord) {\n          console.error('Danger: only stack dimension can be modified');\n        }\n      });\n    }\n    var dimIndices = map(normalizeDimensions(dims), this._getStoreDimIndex, this);\n    // If do shallow clone here, if there are too many stacked series,\n    // it still cost lots of memory, because `_store.dimensions` are not shared.\n    // We should consider there probably be shallow clone happen in each series\n    // in consequent filter/map.\n    this._store.modify(dimIndices, fCtx ? zrUtil.bind(cb, fCtx) : cb);\n  };\n  /**\n   * Large data down sampling on given dimension\n   * @param sampleIndex Sample index for name and id\n   */\n  SeriesData.prototype.downSample = function (dimension, rate, sampleValue, sampleIndex) {\n    var list = cloneListForMapAndSample(this);\n    list._store = this._store.downSample(this._getStoreDimIndex(dimension), rate, sampleValue, sampleIndex);\n    return list;\n  };\n  /**\n   * Large data down sampling using min-max\n   * @param {string} valueDimension\n   * @param {number} rate\n   */\n  SeriesData.prototype.minmaxDownSample = function (valueDimension, rate) {\n    var list = cloneListForMapAndSample(this);\n    list._store = this._store.minmaxDownSample(this._getStoreDimIndex(valueDimension), rate);\n    return list;\n  };\n  /**\n   * Large data down sampling using largest-triangle-three-buckets\n   * @param {string} valueDimension\n   * @param {number} targetCount\n   */\n  SeriesData.prototype.lttbDownSample = function (valueDimension, rate) {\n    var list = cloneListForMapAndSample(this);\n    list._store = this._store.lttbDownSample(this._getStoreDimIndex(valueDimension), rate);\n    return list;\n  };\n  SeriesData.prototype.getRawDataItem = function (idx) {\n    return this._store.getRawDataItem(idx);\n  };\n  /**\n   * Get model of one data item.\n   */\n  // TODO: Type of data item\n  SeriesData.prototype.getItemModel = function (idx) {\n    var hostModel = this.hostModel;\n    var dataItem = this.getRawDataItem(idx);\n    return new Model(dataItem, hostModel, hostModel && hostModel.ecModel);\n  };\n  /**\n   * Create a data differ\n   */\n  SeriesData.prototype.diff = function (otherList) {\n    var thisList = this;\n    return new DataDiffer(otherList ? otherList.getStore().getIndices() : [], this.getStore().getIndices(), function (idx) {\n      return getId(otherList, idx);\n    }, function (idx) {\n      return getId(thisList, idx);\n    });\n  };\n  /**\n   * Get visual property.\n   */\n  SeriesData.prototype.getVisual = function (key) {\n    var visual = this._visual;\n    return visual && visual[key];\n  };\n  SeriesData.prototype.setVisual = function (kvObj, val) {\n    this._visual = this._visual || {};\n    if (isObject(kvObj)) {\n      zrUtil.extend(this._visual, kvObj);\n    } else {\n      this._visual[kvObj] = val;\n    }\n  };\n  /**\n   * Get visual property of single data item\n   */\n  // eslint-disable-next-line\n  SeriesData.prototype.getItemVisual = function (idx, key) {\n    var itemVisual = this._itemVisuals[idx];\n    var val = itemVisual && itemVisual[key];\n    if (val == null) {\n      // Use global visual property\n      return this.getVisual(key);\n    }\n    return val;\n  };\n  /**\n   * If exists visual property of single data item\n   */\n  SeriesData.prototype.hasItemVisual = function () {\n    return this._itemVisuals.length > 0;\n  };\n  /**\n   * Make sure itemVisual property is unique\n   */\n  // TODO: use key to save visual to reduce memory.\n  SeriesData.prototype.ensureUniqueItemVisual = function (idx, key) {\n    var itemVisuals = this._itemVisuals;\n    var itemVisual = itemVisuals[idx];\n    if (!itemVisual) {\n      itemVisual = itemVisuals[idx] = {};\n    }\n    var val = itemVisual[key];\n    if (val == null) {\n      val = this.getVisual(key);\n      // TODO Performance?\n      if (zrUtil.isArray(val)) {\n        val = val.slice();\n      } else if (isObject(val)) {\n        val = zrUtil.extend({}, val);\n      }\n      itemVisual[key] = val;\n    }\n    return val;\n  };\n  // eslint-disable-next-line\n  SeriesData.prototype.setItemVisual = function (idx, key, value) {\n    var itemVisual = this._itemVisuals[idx] || {};\n    this._itemVisuals[idx] = itemVisual;\n    if (isObject(key)) {\n      zrUtil.extend(itemVisual, key);\n    } else {\n      itemVisual[key] = value;\n    }\n  };\n  /**\n   * Clear itemVisuals and list visual.\n   */\n  SeriesData.prototype.clearAllVisual = function () {\n    this._visual = {};\n    this._itemVisuals = [];\n  };\n  SeriesData.prototype.setLayout = function (key, val) {\n    isObject(key) ? zrUtil.extend(this._layout, key) : this._layout[key] = val;\n  };\n  /**\n   * Get layout property.\n   */\n  SeriesData.prototype.getLayout = function (key) {\n    return this._layout[key];\n  };\n  /**\n   * Get layout of single data item\n   */\n  SeriesData.prototype.getItemLayout = function (idx) {\n    return this._itemLayouts[idx];\n  };\n  /**\n   * Set layout of single data item\n   */\n  SeriesData.prototype.setItemLayout = function (idx, layout, merge) {\n    this._itemLayouts[idx] = merge ? zrUtil.extend(this._itemLayouts[idx] || {}, layout) : layout;\n  };\n  /**\n   * Clear all layout of single data item\n   */\n  SeriesData.prototype.clearItemLayouts = function () {\n    this._itemLayouts.length = 0;\n  };\n  /**\n   * Set graphic element relative to data. It can be set as null\n   */\n  SeriesData.prototype.setItemGraphicEl = function (idx, el) {\n    var seriesIndex = this.hostModel && this.hostModel.seriesIndex;\n    setCommonECData(seriesIndex, this.dataType, idx, el);\n    this._graphicEls[idx] = el;\n  };\n  SeriesData.prototype.getItemGraphicEl = function (idx) {\n    return this._graphicEls[idx];\n  };\n  SeriesData.prototype.eachItemGraphicEl = function (cb, context) {\n    zrUtil.each(this._graphicEls, function (el, idx) {\n      if (el) {\n        cb && cb.call(context, el, idx);\n      }\n    });\n  };\n  /**\n   * Shallow clone a new list except visual and layout properties, and graph elements.\n   * New list only change the indices.\n   */\n  SeriesData.prototype.cloneShallow = function (list) {\n    if (!list) {\n      list = new SeriesData(this._schema ? this._schema : map(this.dimensions, this._getDimInfo, this), this.hostModel);\n    }\n    transferProperties(list, this);\n    list._store = this._store;\n    return list;\n  };\n  /**\n   * Wrap some method to add more feature\n   */\n  SeriesData.prototype.wrapMethod = function (methodName, injectFunction) {\n    var originalMethod = this[methodName];\n    if (!zrUtil.isFunction(originalMethod)) {\n      return;\n    }\n    this.__wrappedMethods = this.__wrappedMethods || [];\n    this.__wrappedMethods.push(methodName);\n    this[methodName] = function () {\n      var res = originalMethod.apply(this, arguments);\n      return injectFunction.apply(this, [res].concat(zrUtil.slice(arguments)));\n    };\n  };\n  // ----------------------------------------------------------\n  // A work around for internal method visiting private member.\n  // ----------------------------------------------------------\n  SeriesData.internalField = function () {\n    prepareInvertedIndex = function (data) {\n      var invertedIndicesMap = data._invertedIndicesMap;\n      zrUtil.each(invertedIndicesMap, function (invertedIndices, dim) {\n        var dimInfo = data._dimInfos[dim];\n        // Currently, only dimensions that has ordinalMeta can create inverted indices.\n        var ordinalMeta = dimInfo.ordinalMeta;\n        var store = data._store;\n        if (ordinalMeta) {\n          invertedIndices = invertedIndicesMap[dim] = new CtorInt32Array(ordinalMeta.categories.length);\n          // The default value of TypedArray is 0. To avoid miss\n          // mapping to 0, we should set it as INDEX_NOT_FOUND.\n          for (var i = 0; i < invertedIndices.length; i++) {\n            invertedIndices[i] = INDEX_NOT_FOUND;\n          }\n          for (var i = 0; i < store.count(); i++) {\n            // Only support the case that all values are distinct.\n            invertedIndices[store.get(dimInfo.storeDimIndex, i)] = i;\n          }\n        }\n      });\n    };\n    getIdNameFromStore = function (data, dimIdx, idx) {\n      return convertOptionIdName(data._getCategory(dimIdx, idx), null);\n    };\n    /**\n     * @see the comment of `List['getId']`.\n     */\n    getId = function (data, rawIndex) {\n      var id = data._idList[rawIndex];\n      if (id == null && data._idDimIdx != null) {\n        id = getIdNameFromStore(data, data._idDimIdx, rawIndex);\n      }\n      if (id == null) {\n        id = ID_PREFIX + rawIndex;\n      }\n      return id;\n    };\n    normalizeDimensions = function (dimensions) {\n      if (!zrUtil.isArray(dimensions)) {\n        dimensions = dimensions != null ? [dimensions] : [];\n      }\n      return dimensions;\n    };\n    /**\n     * Data in excludeDimensions is copied, otherwise transferred.\n     */\n    cloneListForMapAndSample = function (original) {\n      var list = new SeriesData(original._schema ? original._schema : map(original.dimensions, original._getDimInfo, original), original.hostModel);\n      // FIXME If needs stackedOn, value may already been stacked\n      transferProperties(list, original);\n      return list;\n    };\n    transferProperties = function (target, source) {\n      zrUtil.each(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) {\n        if (source.hasOwnProperty(propName)) {\n          target[propName] = source[propName];\n        }\n      });\n      target.__wrappedMethods = source.__wrappedMethods;\n      zrUtil.each(CLONE_PROPERTIES, function (propName) {\n        target[propName] = zrUtil.clone(source[propName]);\n      });\n      target._calculationInfo = zrUtil.extend({}, source._calculationInfo);\n    };\n    makeIdFromName = function (data, idx) {\n      var nameList = data._nameList;\n      var idList = data._idList;\n      var nameDimIdx = data._nameDimIdx;\n      var idDimIdx = data._idDimIdx;\n      var name = nameList[idx];\n      var id = idList[idx];\n      if (name == null && nameDimIdx != null) {\n        nameList[idx] = name = getIdNameFromStore(data, nameDimIdx, idx);\n      }\n      if (id == null && idDimIdx != null) {\n        idList[idx] = id = getIdNameFromStore(data, idDimIdx, idx);\n      }\n      if (id == null && name != null) {\n        var nameRepeatCount = data._nameRepeatCount;\n        var nmCnt = nameRepeatCount[name] = (nameRepeatCount[name] || 0) + 1;\n        id = name;\n        if (nmCnt > 1) {\n          id += '__ec__' + nmCnt;\n        }\n        idList[idx] = id;\n      }\n    };\n  }();\n  return SeriesData;\n}();\nexport default SeriesData;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { VISUAL_DIMENSIONS } from '../../util/types.js';\nimport SeriesDimensionDefine from '../SeriesDimensionDefine.js';\nimport { createHashMap, defaults, each, extend, isObject, isString } from 'zrender/lib/core/util.js';\nimport { createSourceFromSeriesDataOption, isSourceInstance } from '../Source.js';\nimport { CtorInt32Array } from '../DataStore.js';\nimport { normalizeToArray } from '../../util/model.js';\nimport { BE_ORDINAL, guessOrdinal } from './sourceHelper.js';\nimport { createDimNameMap, ensureSourceDimNameMap, SeriesDataSchema, shouldOmitUnusedDimensions } from './SeriesDataSchema.js';\n/**\n * For outside usage compat (like echarts-gl are using it).\n */\nexport function createDimensions(source, opt) {\n  return prepareSeriesDataSchema(source, opt).dimensions;\n}\n/**\n * This method builds the relationship between:\n * + \"what the coord sys or series requires (see `coordDimensions`)\",\n * + \"what the user defines (in `encode` and `dimensions`, see `opt.dimensionsDefine` and `opt.encodeDefine`)\"\n * + \"what the data source provids (see `source`)\".\n *\n * Some guess strategy will be adapted if user does not define something.\n * If no 'value' dimension specified, the first no-named dimension will be\n * named as 'value'.\n *\n * @return The results are always sorted by `storeDimIndex` asc.\n */\nexport default function prepareSeriesDataSchema(\n// TODO: TYPE completeDimensions type\nsource, opt) {\n  if (!isSourceInstance(source)) {\n    source = createSourceFromSeriesDataOption(source);\n  }\n  opt = opt || {};\n  var sysDims = opt.coordDimensions || [];\n  var dimsDef = opt.dimensionsDefine || source.dimensionsDefine || [];\n  var coordDimNameMap = createHashMap();\n  var resultList = [];\n  var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount);\n  // Try to ignore unused dimensions if sharing a high dimension datastore\n  // 30 is an experience value.\n  var omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount);\n  var isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine;\n  var dataDimNameMap = isUsingSourceDimensionsDef ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef);\n  var encodeDef = opt.encodeDefine;\n  if (!encodeDef && opt.encodeDefaulter) {\n    encodeDef = opt.encodeDefaulter(source, dimCount);\n  }\n  var encodeDefMap = createHashMap(encodeDef);\n  var indicesMap = new CtorInt32Array(dimCount);\n  for (var i = 0; i < indicesMap.length; i++) {\n    indicesMap[i] = -1;\n  }\n  function getResultItem(dimIdx) {\n    var idx = indicesMap[dimIdx];\n    if (idx < 0) {\n      var dimDefItemRaw = dimsDef[dimIdx];\n      var dimDefItem = isObject(dimDefItemRaw) ? dimDefItemRaw : {\n        name: dimDefItemRaw\n      };\n      var resultItem = new SeriesDimensionDefine();\n      var userDimName = dimDefItem.name;\n      if (userDimName != null && dataDimNameMap.get(userDimName) != null) {\n        // Only if `series.dimensions` is defined in option\n        // displayName, will be set, and dimension will be displayed vertically in\n        // tooltip by default.\n        resultItem.name = resultItem.displayName = userDimName;\n      }\n      dimDefItem.type != null && (resultItem.type = dimDefItem.type);\n      dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName);\n      var newIdx = resultList.length;\n      indicesMap[dimIdx] = newIdx;\n      resultItem.storeDimIndex = dimIdx;\n      resultList.push(resultItem);\n      return resultItem;\n    }\n    return resultList[idx];\n  }\n  if (!omitUnusedDimensions) {\n    for (var i = 0; i < dimCount; i++) {\n      getResultItem(i);\n    }\n  }\n  // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize `encodeDefMap`.\n  encodeDefMap.each(function (dataDimsRaw, coordDim) {\n    var dataDims = normalizeToArray(dataDimsRaw).slice();\n    // Note: It is allowed that `dataDims.length` is `0`, e.g., options is\n    // `{encode: {x: -1, y: 1}}`. Should not filter anything in\n    // this case.\n    if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 0) {\n      encodeDefMap.set(coordDim, false);\n      return;\n    }\n    var validDataDims = encodeDefMap.set(coordDim, []);\n    each(dataDims, function (resultDimIdxOrName, idx) {\n      // The input resultDimIdx can be dim name or index.\n      var resultDimIdx = isString(resultDimIdxOrName) ? dataDimNameMap.get(resultDimIdxOrName) : resultDimIdxOrName;\n      if (resultDimIdx != null && resultDimIdx < dimCount) {\n        validDataDims[idx] = resultDimIdx;\n        applyDim(getResultItem(resultDimIdx), coordDim, idx);\n      }\n    });\n  });\n  // Apply templates and default order from `sysDims`.\n  var availDimIdx = 0;\n  each(sysDims, function (sysDimItemRaw) {\n    var coordDim;\n    var sysDimItemDimsDef;\n    var sysDimItemOtherDims;\n    var sysDimItem;\n    if (isString(sysDimItemRaw)) {\n      coordDim = sysDimItemRaw;\n      sysDimItem = {};\n    } else {\n      sysDimItem = sysDimItemRaw;\n      coordDim = sysDimItem.name;\n      var ordinalMeta = sysDimItem.ordinalMeta;\n      sysDimItem.ordinalMeta = null;\n      sysDimItem = extend({}, sysDimItem);\n      sysDimItem.ordinalMeta = ordinalMeta;\n      // `coordDimIndex` should not be set directly.\n      sysDimItemDimsDef = sysDimItem.dimsDef;\n      sysDimItemOtherDims = sysDimItem.otherDims;\n      sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null;\n    }\n    var dataDims = encodeDefMap.get(coordDim);\n    // negative resultDimIdx means no need to mapping.\n    if (dataDims === false) {\n      return;\n    }\n    dataDims = normalizeToArray(dataDims);\n    // dimensions provides default dim sequences.\n    if (!dataDims.length) {\n      for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {\n        while (availDimIdx < dimCount && getResultItem(availDimIdx).coordDim != null) {\n          availDimIdx++;\n        }\n        availDimIdx < dimCount && dataDims.push(availDimIdx++);\n      }\n    }\n    // Apply templates.\n    each(dataDims, function (resultDimIdx, coordDimIndex) {\n      var resultItem = getResultItem(resultDimIdx);\n      // Coordinate system has a higher priority on dim type than source.\n      if (isUsingSourceDimensionsDef && sysDimItem.type != null) {\n        resultItem.type = sysDimItem.type;\n      }\n      applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);\n      if (resultItem.name == null && sysDimItemDimsDef) {\n        var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex];\n        !isObject(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = {\n          name: sysDimItemDimsDefItem\n        });\n        resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name;\n        resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip;\n      }\n      // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}}\n      sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);\n    });\n  });\n  function applyDim(resultItem, coordDim, coordDimIndex) {\n    if (VISUAL_DIMENSIONS.get(coordDim) != null) {\n      resultItem.otherDims[coordDim] = coordDimIndex;\n    } else {\n      resultItem.coordDim = coordDim;\n      resultItem.coordDimIndex = coordDimIndex;\n      coordDimNameMap.set(coordDim, true);\n    }\n  }\n  // Make sure the first extra dim is 'value'.\n  var generateCoord = opt.generateCoord;\n  var generateCoordCount = opt.generateCoordCount;\n  var fromZero = generateCoordCount != null;\n  generateCoordCount = generateCoord ? generateCoordCount || 1 : 0;\n  var extra = generateCoord || 'value';\n  function ifNoNameFillWithCoordName(resultItem) {\n    if (resultItem.name == null) {\n      // Duplication will be removed in the next step.\n      resultItem.name = resultItem.coordDim;\n    }\n  }\n  // Set dim `name` and other `coordDim` and other props.\n  if (!omitUnusedDimensions) {\n    for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {\n      var resultItem = getResultItem(resultDimIdx);\n      var coordDim = resultItem.coordDim;\n      if (coordDim == null) {\n        // TODO no need to generate coordDim for isExtraCoord?\n        resultItem.coordDim = genCoordDimName(extra, coordDimNameMap, fromZero);\n        resultItem.coordDimIndex = 0;\n        // Series specified generateCoord is using out.\n        if (!generateCoord || generateCoordCount <= 0) {\n          resultItem.isExtraCoord = true;\n        }\n        generateCoordCount--;\n      }\n      ifNoNameFillWithCoordName(resultItem);\n      if (resultItem.type == null && (guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must\n      // Consider the case:\n      // {\n      //    dataset: {source: [\n      //        ['2001', 123],\n      //        ['2002', 456],\n      //        ...\n      //        ['The others', 987],\n      //    ]},\n      //    series: {type: 'pie'}\n      // }\n      // The first column should better be treated as a \"ordinal\" although it\n      // might not be detected as an \"ordinal\" by `guessOrdinal`.\n      || resultItem.isExtraCoord && (resultItem.otherDims.itemName != null || resultItem.otherDims.seriesName != null))) {\n        resultItem.type = 'ordinal';\n      }\n    }\n  } else {\n    each(resultList, function (resultItem) {\n      // PENDING: guessOrdinal or let user specify type: 'ordinal' manually?\n      ifNoNameFillWithCoordName(resultItem);\n    });\n    // Sort dimensions: there are some rule that use the last dim as label,\n    // and for some latter travel process easier.\n    resultList.sort(function (item0, item1) {\n      return item0.storeDimIndex - item1.storeDimIndex;\n    });\n  }\n  removeDuplication(resultList);\n  return new SeriesDataSchema({\n    source: source,\n    dimensions: resultList,\n    fullDimensionCount: dimCount,\n    dimensionOmitted: omitUnusedDimensions\n  });\n}\nfunction removeDuplication(result) {\n  var duplicationMap = createHashMap();\n  for (var i = 0; i < result.length; i++) {\n    var dim = result[i];\n    var dimOriginalName = dim.name;\n    var count = duplicationMap.get(dimOriginalName) || 0;\n    if (count > 0) {\n      // Starts from 0.\n      dim.name = dimOriginalName + (count - 1);\n    }\n    count++;\n    duplicationMap.set(dimOriginalName, count);\n  }\n}\n// ??? TODO\n// Originally detect dimCount by data[0]. Should we\n// optimize it to only by sysDims and dimensions and encode.\n// So only necessary dims will be initialized.\n// But\n// (1) custom series should be considered. where other dims\n// may be visited.\n// (2) sometimes user need to calculate bubble size or use visualMap\n// on other dimensions besides coordSys needed.\n// So, dims that is not used by system, should be shared in data store?\nfunction getDimCount(source, sysDims, dimsDef, optDimCount) {\n  // Note that the result dimCount should not small than columns count\n  // of data, otherwise `dataDimNameMap` checking will be incorrect.\n  var dimCount = Math.max(source.dimensionsDetectedCount || 1, sysDims.length, dimsDef.length, optDimCount || 0);\n  each(sysDims, function (sysDimItem) {\n    var sysDimItemDimsDef;\n    if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) {\n      dimCount = Math.max(dimCount, sysDimItemDimsDef.length);\n    }\n  });\n  return dimCount;\n}\nfunction genCoordDimName(name, map, fromZero) {\n  if (fromZero || map.hasKey(name)) {\n    var i = 0;\n    while (map.hasKey(name + i)) {\n      i++;\n    }\n    name += i;\n  }\n  map.set(name, true);\n  return name;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Helper for model references.\n * There are many manners to refer axis/coordSys.\n */\n// TODO\n// merge relevant logic to this file?\n// check: \"modelHelper\" of tooltip and \"BrushTargetManager\".\nimport { createHashMap, retrieve, each } from 'zrender/lib/core/util.js';\nimport { SINGLE_REFERRING } from '../util/model.js';\n/**\n * @class\n * For example:\n * {\n *     coordSysName: 'cartesian2d',\n *     coordSysDims: ['x', 'y', ...],\n *     axisMap: HashMap({\n *         x: xAxisModel,\n *         y: yAxisModel\n *     }),\n *     categoryAxisMap: HashMap({\n *         x: xAxisModel,\n *         y: undefined\n *     }),\n *     // The index of the first category axis in `coordSysDims`.\n *     // `null/undefined` means no category axis exists.\n *     firstCategoryDimIndex: 1,\n *     // To replace user specified encode.\n * }\n */\nvar CoordSysInfo = /** @class */function () {\n  function CoordSysInfo(coordSysName) {\n    this.coordSysDims = [];\n    this.axisMap = createHashMap();\n    this.categoryAxisMap = createHashMap();\n    this.coordSysName = coordSysName;\n  }\n  return CoordSysInfo;\n}();\nexport function getCoordSysInfoBySeries(seriesModel) {\n  var coordSysName = seriesModel.get('coordinateSystem');\n  var result = new CoordSysInfo(coordSysName);\n  var fetch = fetchers[coordSysName];\n  if (fetch) {\n    fetch(seriesModel, result, result.axisMap, result.categoryAxisMap);\n    return result;\n  }\n}\n// TODO: refactor them to static member of each coord sys, rather than hard code here.\nvar fetchers = {\n  cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) {\n    var xAxisModel = seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0];\n    var yAxisModel = seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0];\n    if (process.env.NODE_ENV !== 'production') {\n      if (!xAxisModel) {\n        throw new Error('xAxis \"' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('xAxisId'), 0) + '\" not found');\n      }\n      if (!yAxisModel) {\n        throw new Error('yAxis \"' + retrieve(seriesModel.get('xAxisIndex'), seriesModel.get('yAxisId'), 0) + '\" not found');\n      }\n    }\n    result.coordSysDims = ['x', 'y'];\n    axisMap.set('x', xAxisModel);\n    axisMap.set('y', yAxisModel);\n    if (isCategory(xAxisModel)) {\n      categoryAxisMap.set('x', xAxisModel);\n      result.firstCategoryDimIndex = 0;\n    }\n    if (isCategory(yAxisModel)) {\n      categoryAxisMap.set('y', yAxisModel);\n      result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1);\n    }\n  },\n  singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) {\n    var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0];\n    if (process.env.NODE_ENV !== 'production') {\n      if (!singleAxisModel) {\n        throw new Error('singleAxis should be specified.');\n      }\n    }\n    result.coordSysDims = ['single'];\n    axisMap.set('single', singleAxisModel);\n    if (isCategory(singleAxisModel)) {\n      categoryAxisMap.set('single', singleAxisModel);\n      result.firstCategoryDimIndex = 0;\n    }\n  },\n  polar: function (seriesModel, result, axisMap, categoryAxisMap) {\n    var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0];\n    var radiusAxisModel = polarModel.findAxisModel('radiusAxis');\n    var angleAxisModel = polarModel.findAxisModel('angleAxis');\n    if (process.env.NODE_ENV !== 'production') {\n      if (!angleAxisModel) {\n        throw new Error('angleAxis option not found');\n      }\n      if (!radiusAxisModel) {\n        throw new Error('radiusAxis option not found');\n      }\n    }\n    result.coordSysDims = ['radius', 'angle'];\n    axisMap.set('radius', radiusAxisModel);\n    axisMap.set('angle', angleAxisModel);\n    if (isCategory(radiusAxisModel)) {\n      categoryAxisMap.set('radius', radiusAxisModel);\n      result.firstCategoryDimIndex = 0;\n    }\n    if (isCategory(angleAxisModel)) {\n      categoryAxisMap.set('angle', angleAxisModel);\n      result.firstCategoryDimIndex == null && (result.firstCategoryDimIndex = 1);\n    }\n  },\n  geo: function (seriesModel, result, axisMap, categoryAxisMap) {\n    result.coordSysDims = ['lng', 'lat'];\n  },\n  parallel: function (seriesModel, result, axisMap, categoryAxisMap) {\n    var ecModel = seriesModel.ecModel;\n    var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex'));\n    var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice();\n    each(parallelModel.parallelAxisIndex, function (axisIndex, index) {\n      var axisModel = ecModel.getComponent('parallelAxis', axisIndex);\n      var axisDim = coordSysDims[index];\n      axisMap.set(axisDim, axisModel);\n      if (isCategory(axisModel)) {\n        categoryAxisMap.set(axisDim, axisModel);\n        if (result.firstCategoryDimIndex == null) {\n          result.firstCategoryDimIndex = index;\n        }\n      }\n    });\n  },\n  matrix: function (seriesModel, result, axisMap, categoryAxisMap) {\n    var matrixModel = seriesModel.getReferringComponents('matrix', SINGLE_REFERRING).models[0];\n    if (process.env.NODE_ENV !== 'production') {\n      if (!matrixModel) {\n        throw new Error('matrix coordinate system should be specified.');\n      }\n    }\n    result.coordSysDims = ['x', 'y'];\n    var xModel = matrixModel.getDimensionModel('x');\n    var yModel = matrixModel.getDimensionModel('y');\n    axisMap.set('x', xModel);\n    axisMap.set('y', yModel);\n    categoryAxisMap.set('x', xModel);\n    categoryAxisMap.set('y', yModel);\n  }\n};\nfunction isCategory(axisModel) {\n  return axisModel.get('type') === 'category';\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, isString } from 'zrender/lib/core/util.js';\nimport { isSeriesDataSchema } from './SeriesDataSchema.js';\n/**\n * Note that it is too complicated to support 3d stack by value\n * (have to create two-dimension inverted index), so in 3d case\n * we just support that stacked by index.\n *\n * @param seriesModel\n * @param dimensionsInput The same as the input of <module:echarts/data/SeriesData>.\n *        The input will be modified.\n * @param opt\n * @param opt.stackedCoordDimension Specify a coord dimension if needed.\n * @param opt.byIndex=false\n * @return calculationInfo\n * {\n *     stackedDimension: string\n *     stackedByDimension: string\n *     isStackedByIndex: boolean\n *     stackedOverDimension: string\n *     stackResultDimension: string\n * }\n */\nexport function enableDataStack(seriesModel, dimensionsInput, opt) {\n  opt = opt || {};\n  var byIndex = opt.byIndex;\n  var stackedCoordDimension = opt.stackedCoordDimension;\n  var dimensionDefineList;\n  var schema;\n  var store;\n  if (isLegacyDimensionsInput(dimensionsInput)) {\n    dimensionDefineList = dimensionsInput;\n  } else {\n    schema = dimensionsInput.schema;\n    dimensionDefineList = schema.dimensions;\n    store = dimensionsInput.store;\n  }\n  // Compatibal: when `stack` is set as '', do not stack.\n  var mayStack = !!(seriesModel && seriesModel.get('stack'));\n  var stackedByDimInfo;\n  var stackedDimInfo;\n  var stackResultDimension;\n  var stackedOverDimension;\n  each(dimensionDefineList, function (dimensionInfo, index) {\n    if (isString(dimensionInfo)) {\n      dimensionDefineList[index] = dimensionInfo = {\n        name: dimensionInfo\n      };\n    }\n    if (mayStack && !dimensionInfo.isExtraCoord) {\n      // Find the first ordinal dimension as the stackedByDimInfo.\n      if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) {\n        stackedByDimInfo = dimensionInfo;\n      }\n      // Find the first stackable dimension as the stackedDimInfo.\n      if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) {\n        stackedDimInfo = dimensionInfo;\n      }\n    }\n  });\n  if (stackedDimInfo && !byIndex && !stackedByDimInfo) {\n    // Compatible with previous design, value axis (time axis) only stack by index.\n    // It may make sense if the user provides elaborately constructed data.\n    byIndex = true;\n  }\n  // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`.\n  // That put stack logic in List is for using conveniently in echarts extensions, but it\n  // might not be a good way.\n  if (stackedDimInfo) {\n    // Use a weird name that not duplicated with other names.\n    // Also need to use seriesModel.id as postfix because different\n    // series may share same data store. The stack dimension needs to be distinguished.\n    stackResultDimension = '__\\0ecstackresult_' + seriesModel.id;\n    stackedOverDimension = '__\\0ecstackedover_' + seriesModel.id;\n    // Create inverted index to fast query index by value.\n    if (stackedByDimInfo) {\n      stackedByDimInfo.createInvertedIndices = true;\n    }\n    var stackedDimCoordDim_1 = stackedDimInfo.coordDim;\n    var stackedDimType = stackedDimInfo.type;\n    var stackedDimCoordIndex_1 = 0;\n    each(dimensionDefineList, function (dimensionInfo) {\n      if (dimensionInfo.coordDim === stackedDimCoordDim_1) {\n        stackedDimCoordIndex_1++;\n      }\n    });\n    var stackedOverDimensionDefine = {\n      name: stackResultDimension,\n      coordDim: stackedDimCoordDim_1,\n      coordDimIndex: stackedDimCoordIndex_1,\n      type: stackedDimType,\n      isExtraCoord: true,\n      isCalculationCoord: true,\n      storeDimIndex: dimensionDefineList.length\n    };\n    var stackResultDimensionDefine = {\n      name: stackedOverDimension,\n      // This dimension contains stack base (generally, 0), so do not set it as\n      // `stackedDimCoordDim` to avoid extent calculation, consider log scale.\n      coordDim: stackedOverDimension,\n      coordDimIndex: stackedDimCoordIndex_1 + 1,\n      type: stackedDimType,\n      isExtraCoord: true,\n      isCalculationCoord: true,\n      storeDimIndex: dimensionDefineList.length + 1\n    };\n    if (schema) {\n      if (store) {\n        stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType);\n        stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType);\n      }\n      schema.appendCalculationDimension(stackedOverDimensionDefine);\n      schema.appendCalculationDimension(stackResultDimensionDefine);\n    } else {\n      dimensionDefineList.push(stackedOverDimensionDefine);\n      dimensionDefineList.push(stackResultDimensionDefine);\n    }\n  }\n  return {\n    stackedDimension: stackedDimInfo && stackedDimInfo.name,\n    stackedByDimension: stackedByDimInfo && stackedByDimInfo.name,\n    isStackedByIndex: byIndex,\n    stackedOverDimension: stackedOverDimension,\n    stackResultDimension: stackResultDimension\n  };\n}\nfunction isLegacyDimensionsInput(dimensionsInput) {\n  return !isSeriesDataSchema(dimensionsInput.schema);\n}\nexport function isDimensionStacked(data, stackedDim) {\n  // Each single series only maps to one pair of axis. So we do not need to\n  // check stackByDim, whatever stacked by a dimension or stacked by index.\n  return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension');\n}\nexport function getStackedDimension(data, targetDim) {\n  return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport prepareSeriesDataSchema from '../../data/helper/createDimensions.js';\nimport { getDimensionTypeByAxis } from '../../data/helper/dimensionHelper.js';\nimport { getDataItemValue } from '../../util/model.js';\nimport CoordinateSystem from '../../core/CoordinateSystem.js';\nimport { getCoordSysInfoBySeries } from '../../model/referHelper.js';\nimport { createSourceFromSeriesDataOption } from '../../data/Source.js';\nimport { enableDataStack } from '../../data/helper/dataStackHelper.js';\nimport { makeSeriesEncodeForAxisCoordSys } from '../../data/helper/sourceHelper.js';\nimport { SOURCE_FORMAT_ORIGINAL } from '../../util/types.js';\nfunction getCoordSysDimDefs(seriesModel, coordSysInfo) {\n  var coordSysName = seriesModel.get('coordinateSystem');\n  var registeredCoordSys = CoordinateSystem.get(coordSysName);\n  var coordSysDimDefs;\n  if (coordSysInfo && coordSysInfo.coordSysDims) {\n    coordSysDimDefs = zrUtil.map(coordSysInfo.coordSysDims, function (dim) {\n      var dimInfo = {\n        name: dim\n      };\n      var axisModel = coordSysInfo.axisMap.get(dim);\n      if (axisModel) {\n        var axisType = axisModel.get('type');\n        dimInfo.type = getDimensionTypeByAxis(axisType);\n      }\n      return dimInfo;\n    });\n  }\n  if (!coordSysDimDefs) {\n    // Get dimensions from registered coordinate system\n    coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y'];\n  }\n  return coordSysDimDefs;\n}\nfunction injectOrdinalMeta(dimInfoList, createInvertedIndices, coordSysInfo) {\n  var firstCategoryDimIndex;\n  var hasNameEncode;\n  coordSysInfo && zrUtil.each(dimInfoList, function (dimInfo, dimIndex) {\n    var coordDim = dimInfo.coordDim;\n    var categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim);\n    if (categoryAxisModel) {\n      if (firstCategoryDimIndex == null) {\n        firstCategoryDimIndex = dimIndex;\n      }\n      dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta();\n      if (createInvertedIndices) {\n        dimInfo.createInvertedIndices = true;\n      }\n    }\n    if (dimInfo.otherDims.itemName != null) {\n      hasNameEncode = true;\n    }\n  });\n  if (!hasNameEncode && firstCategoryDimIndex != null) {\n    dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0;\n  }\n  return firstCategoryDimIndex;\n}\n/**\n * Caution: there are side effects to `sourceManager` in this method.\n * Should better only be called in `Series['getInitialData']`.\n */\nfunction createSeriesData(sourceRaw, seriesModel, opt) {\n  opt = opt || {};\n  var sourceManager = seriesModel.getSourceManager();\n  var source;\n  var isOriginalSource = false;\n  if (sourceRaw) {\n    isOriginalSource = true;\n    source = createSourceFromSeriesDataOption(sourceRaw);\n  } else {\n    source = sourceManager.getSource();\n    // Is series.data. not dataset.\n    isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL;\n  }\n  var coordSysInfo = getCoordSysInfoBySeries(seriesModel);\n  var coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo);\n  var useEncodeDefaulter = opt.useEncodeDefaulter;\n  var encodeDefaulter = zrUtil.isFunction(useEncodeDefaulter) ? useEncodeDefaulter : useEncodeDefaulter ? zrUtil.curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) : null;\n  var createDimensionOptions = {\n    coordDimensions: coordSysDimDefs,\n    generateCoord: opt.generateCoord,\n    encodeDefine: seriesModel.getEncode(),\n    encodeDefaulter: encodeDefaulter,\n    canOmitUnusedDimensions: !isOriginalSource\n  };\n  var schema = prepareSeriesDataSchema(source, createDimensionOptions);\n  var firstCategoryDimIndex = injectOrdinalMeta(schema.dimensions, opt.createInvertedIndices, coordSysInfo);\n  var store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null;\n  var stackCalculationInfo = enableDataStack(seriesModel, {\n    schema: schema,\n    store: store\n  });\n  var data = new SeriesData(schema, seriesModel);\n  data.setCalculationInfo(stackCalculationInfo);\n  var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source)\n  /**\n   * This serves this case:\n   *  var echarts_option = {\n   *      xAxis: { data: ['a', 'b', 'c'] },\n   *      yAxis: {}\n   *      series: { data: [555, 666, 777] }\n   *  };\n   * The `series.data` is completed to:\n   *  [[0, 555], [1, 666], [2, 777]]\n   */ ? function (itemOpt, dimName, dataIndex, dimIndex) {\n    // Use dataIndex as ordinal value in categoryAxis\n    return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex);\n  } : null;\n  data.hasItemOption = false;\n  data.initData(\n  // Try to reuse the data store in sourceManager if using dataset.\n  isOriginalSource ? source : store, null, dimValueGetter);\n  return data;\n}\nfunction isNeedCompleteOrdinalData(source) {\n  if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) {\n    var sampleItem = firstDataNotNull(source.data || []);\n    return !zrUtil.isArray(getDataItemValue(sampleItem));\n  }\n}\nfunction firstDataNotNull(arr) {\n  var i = 0;\n  while (i < arr.length && arr[i] == null) {\n    i++;\n  }\n  return arr[i];\n}\nexport default createSeriesData;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { getPrecision, round, nice, quantityExponent } from '../util/number.js';\nimport { bind } from 'zrender/lib/core/util.js';\nexport function isValueNice(val) {\n  var exp10 = Math.pow(10, quantityExponent(Math.abs(val)));\n  var f = Math.abs(val / exp10);\n  return f === 0 || f === 1 || f === 2 || f === 3 || f === 5;\n}\nexport function isIntervalOrLogScale(scale) {\n  return scale.type === 'interval' || scale.type === 'log';\n}\n/**\n * @param extent Both extent[0] and extent[1] should be valid number.\n *               Should be extent[0] < extent[1].\n * @param splitNumber splitNumber should be >= 1.\n */\nexport function intervalScaleNiceTicks(extent, spanWithBreaks, splitNumber, minInterval, maxInterval) {\n  var result = {};\n  var interval = result.interval = nice(spanWithBreaks / splitNumber, true);\n  if (minInterval != null && interval < minInterval) {\n    interval = result.interval = minInterval;\n  }\n  if (maxInterval != null && interval > maxInterval) {\n    interval = result.interval = maxInterval;\n  }\n  // Tow more digital for tick.\n  var precision = result.intervalPrecision = getIntervalPrecision(interval);\n  // Niced extent inside original extent\n  var niceTickExtent = result.niceTickExtent = [round(Math.ceil(extent[0] / interval) * interval, precision), round(Math.floor(extent[1] / interval) * interval, precision)];\n  fixExtent(niceTickExtent, extent);\n  return result;\n}\nexport function increaseInterval(interval) {\n  var exp10 = Math.pow(10, quantityExponent(interval));\n  // Increase interval\n  var f = interval / exp10;\n  if (!f) {\n    f = 1;\n  } else if (f === 2) {\n    f = 3;\n  } else if (f === 3) {\n    f = 5;\n  } else {\n    // f is 1 or 5\n    f *= 2;\n  }\n  return round(f * exp10);\n}\n/**\n * @return interval precision\n */\nexport function getIntervalPrecision(interval) {\n  // Tow more digital for tick.\n  return getPrecision(interval) + 2;\n}\nfunction clamp(niceTickExtent, idx, extent) {\n  niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);\n}\n// In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.\nexport function fixExtent(niceTickExtent, extent) {\n  !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);\n  !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);\n  clamp(niceTickExtent, 0, extent);\n  clamp(niceTickExtent, 1, extent);\n  if (niceTickExtent[0] > niceTickExtent[1]) {\n    niceTickExtent[0] = niceTickExtent[1];\n  }\n}\nexport function contain(val, extent) {\n  return val >= extent[0] && val <= extent[1];\n}\nvar ScaleCalculator = /** @class */function () {\n  function ScaleCalculator() {\n    this.normalize = normalize;\n    this.scale = scale;\n  }\n  ScaleCalculator.prototype.updateMethods = function (brkCtx) {\n    if (brkCtx.hasBreaks()) {\n      this.normalize = bind(brkCtx.normalize, brkCtx);\n      this.scale = bind(brkCtx.scale, brkCtx);\n    } else {\n      this.normalize = normalize;\n      this.scale = scale;\n    }\n  };\n  return ScaleCalculator;\n}();\nexport { ScaleCalculator };\nfunction normalize(val, extent) {\n  if (extent[1] === extent[0]) {\n    return 0.5;\n  }\n  return (val - extent[0]) / (extent[1] - extent[0]);\n}\nfunction scale(val, extent) {\n  return val * (extent[1] - extent[0]) + extent[0];\n}\nexport function logTransform(base, extent, noClampNegative) {\n  var loggedBase = Math.log(base);\n  return [\n  // log(negative) is NaN, so safe guard here.\n  // PENDING: But even getting a -Infinity still does not make sense in extent.\n  //  Just keep it as is, getting a NaN to make some previous cases works by coincidence.\n  Math.log(noClampNegative ? extent[0] : Math.max(0, extent[0])) / loggedBase, Math.log(noClampNegative ? extent[1] : Math.max(0, extent[1])) / loggedBase];\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as clazzUtil from '../util/clazz.js';\nimport { ScaleCalculator } from './helper.js';\nimport { bind } from 'zrender/lib/core/util.js';\nimport { getScaleBreakHelper } from './break.js';\nvar Scale = /** @class */function () {\n  function Scale(setting) {\n    this._calculator = new ScaleCalculator();\n    this._setting = setting || {};\n    this._extent = [Infinity, -Infinity];\n    var scaleBreakHelper = getScaleBreakHelper();\n    if (scaleBreakHelper) {\n      this._brkCtx = scaleBreakHelper.createScaleBreakContext();\n      this._brkCtx.update(this._extent);\n    }\n  }\n  Scale.prototype.getSetting = function (name) {\n    return this._setting[name];\n  };\n  /**\n   * [CAVEAT]: It should not be overridden!\n   */\n  Scale.prototype._innerUnionExtent = function (other) {\n    var extent = this._extent;\n    // Considered that number could be NaN and should not write into the extent.\n    this._innerSetExtent(other[0] < extent[0] ? other[0] : extent[0], other[1] > extent[1] ? other[1] : extent[1]);\n  };\n  /**\n   * Set extent from data\n   */\n  Scale.prototype.unionExtentFromData = function (data, dim) {\n    this._innerUnionExtent(data.getApproximateExtent(dim));\n  };\n  /**\n   * Get a new slice of extent.\n   * Extent is always in increase order.\n   */\n  Scale.prototype.getExtent = function () {\n    return this._extent.slice();\n  };\n  Scale.prototype.setExtent = function (start, end) {\n    this._innerSetExtent(start, end);\n  };\n  /**\n   * [CAVEAT]: It should not be overridden!\n   */\n  Scale.prototype._innerSetExtent = function (start, end) {\n    var thisExtent = this._extent;\n    if (!isNaN(start)) {\n      thisExtent[0] = start;\n    }\n    if (!isNaN(end)) {\n      thisExtent[1] = end;\n    }\n    this._brkCtx && this._brkCtx.update(thisExtent);\n  };\n  /**\n   * Prerequisite: Scale#parse is ready.\n   */\n  Scale.prototype.setBreaksFromOption = function (breakOptionList) {\n    var scaleBreakHelper = getScaleBreakHelper();\n    if (scaleBreakHelper) {\n      this._innerSetBreak(scaleBreakHelper.parseAxisBreakOption(breakOptionList, bind(this.parse, this)));\n    }\n  };\n  /**\n   * [CAVEAT]: It should not be overridden!\n   */\n  Scale.prototype._innerSetBreak = function (parsed) {\n    if (this._brkCtx) {\n      this._brkCtx.setBreaks(parsed);\n      this._calculator.updateMethods(this._brkCtx);\n      this._brkCtx.update(this._extent);\n    }\n  };\n  /**\n   * [CAVEAT]: It should not be overridden!\n   */\n  Scale.prototype._innerGetBreaks = function () {\n    return this._brkCtx ? this._brkCtx.breaks : [];\n  };\n  /**\n   * Do not expose the internal `_breaks` unless necessary.\n   */\n  Scale.prototype.hasBreaks = function () {\n    return this._brkCtx ? this._brkCtx.hasBreaks() : false;\n  };\n  Scale.prototype._getExtentSpanWithBreaks = function () {\n    return this._brkCtx && this._brkCtx.hasBreaks() ? this._brkCtx.getExtentSpan() : this._extent[1] - this._extent[0];\n  };\n  /**\n   * If value is in extent range\n   */\n  Scale.prototype.isInExtentRange = function (value) {\n    return this._extent[0] <= value && this._extent[1] >= value;\n  };\n  /**\n   * When axis extent depends on data and no data exists,\n   * axis ticks should not be drawn, which is named 'blank'.\n   */\n  Scale.prototype.isBlank = function () {\n    return this._isBlank;\n  };\n  /**\n   * When axis extent depends on data and no data exists,\n   * axis ticks should not be drawn, which is named 'blank'.\n   */\n  Scale.prototype.setBlank = function (isBlank) {\n    this._isBlank = isBlank;\n  };\n  return Scale;\n}();\nclazzUtil.enableClassManagement(Scale);\nexport default Scale;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, isObject, map, isString } from 'zrender/lib/core/util.js';\nvar uidBase = 0;\nvar OrdinalMeta = /** @class */function () {\n  /**\n   * PENDING - Regarding forcibly converting to string:\n   *  In the early days, the underlying hash map impl used JS plain object and converted the key to\n   *  string; later in https://github.com/ecomfe/zrender/pull/966 it was changed to a JS Map (in supported\n   *  platforms), which does not require string keys. But consider any input that `scale/Ordinal['parse']`\n   *  is involved, a number input represents an `OrdinalNumber` (i.e., an index), and affect the query\n   *  behavior:\n   *    - If forcbily converting to string:\n   *      pros: users can use numeric string (such as, '123') to query the raw data (123), tho it's probably\n   *      still confusing.\n   *      cons: NaN/null/undefined in data will be equals to 'NaN'/'null'/'undefined', if simply using\n   *      `val + ''` to convert them, like currently `getName` does.\n   *    - Otherwise:\n   *      pros: see NaN/null/undefined case above.\n   *      cons: users cannot query the raw data (123) any more.\n   *  There are two inconsistent behaviors in the current impl:\n   *    - Force conversion is applied on the case `xAxis{data: ['aaa', 'bbb', ...]}`,\n   *      but no conversion applied to the case `xAxis{data: [{value: 'aaa'}, ...]}` and\n   *      the case `dataset: {source: [['aaa', 123], ['bbb', 234], ...]}`.\n   *    - behaves differently according to whether JS Map is supported (the polyfill is simply using JS\n   *      plain object) (tho it seems rare platform that do not support it).\n   *  Since there's no sufficient good solution to offset cost of the breaking change, we preserve the\n   *  current behavior, until real issues is reported.\n   */\n  function OrdinalMeta(opt) {\n    this.categories = opt.categories || [];\n    this._needCollect = opt.needCollect;\n    this._deduplication = opt.deduplication;\n    this.uid = ++uidBase;\n    this._onCollect = opt.onCollect;\n  }\n  OrdinalMeta.createByAxisModel = function (axisModel) {\n    var option = axisModel.option;\n    var data = option.data;\n    var categories = data && map(data, getName);\n    return new OrdinalMeta({\n      categories: categories,\n      needCollect: !categories,\n      // deduplication is default in axis.\n      deduplication: option.dedplication !== false\n    });\n  };\n  ;\n  OrdinalMeta.prototype.getOrdinal = function (category) {\n    return this._getOrCreateMap().get(category);\n  };\n  /**\n   * @return The ordinal. If not found, return NaN.\n   */\n  OrdinalMeta.prototype.parseAndCollect = function (category) {\n    var index;\n    var needCollect = this._needCollect;\n    // The value of category dim can be the index of the given category set.\n    // This feature is only supported when !needCollect, because we should\n    // consider a common case: a value is 2017, which is a number but is\n    // expected to be tread as a category. This case usually happen in dataset,\n    // where it happent to be no need of the index feature.\n    if (!isString(category) && !needCollect) {\n      return category;\n    }\n    // Optimize for the scenario:\n    // category is ['2012-01-01', '2012-01-02', ...], where the input\n    // data has been ensured not duplicate and is large data.\n    // Notice, if a dataset dimension provide categroies, usually echarts\n    // should remove duplication except user tell echarts dont do that\n    // (set axis.deduplication = false), because echarts do not know whether\n    // the values in the category dimension has duplication (consider the\n    // parallel-aqi example)\n    if (needCollect && !this._deduplication) {\n      index = this.categories.length;\n      this.categories[index] = category;\n      this._onCollect && this._onCollect(category, index);\n      return index;\n    }\n    var map = this._getOrCreateMap();\n    index = map.get(category);\n    if (index == null) {\n      if (needCollect) {\n        index = this.categories.length;\n        this.categories[index] = category;\n        map.set(category, index);\n        this._onCollect && this._onCollect(category, index);\n      } else {\n        index = NaN;\n      }\n    }\n    return index;\n  };\n  // Consider big data, do not create map until needed.\n  OrdinalMeta.prototype._getOrCreateMap = function () {\n    return this._map || (this._map = createHashMap(this.categories));\n  };\n  return OrdinalMeta;\n}();\nfunction getName(obj) {\n  if (isObject(obj) && obj.value != null) {\n    return obj.value;\n  } else {\n    return obj + '';\n  }\n}\nexport default OrdinalMeta;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * Linear continuous scale\n * http://en.wikipedia.org/wiki/Level_of_measurement\n */\n// FIXME only one data\nimport Scale from './Scale.js';\nimport OrdinalMeta from '../data/OrdinalMeta.js';\nimport * as scaleHelper from './helper.js';\nimport { isArray, map, isObject, isString } from 'zrender/lib/core/util.js';\nvar OrdinalScale = /** @class */function (_super) {\n  __extends(OrdinalScale, _super);\n  function OrdinalScale(setting) {\n    var _this = _super.call(this, setting) || this;\n    _this.type = 'ordinal';\n    var ordinalMeta = _this.getSetting('ordinalMeta');\n    // Caution: Should not use instanceof, consider ec-extensions using\n    // import approach to get OrdinalMeta class.\n    if (!ordinalMeta) {\n      ordinalMeta = new OrdinalMeta({});\n    }\n    if (isArray(ordinalMeta)) {\n      ordinalMeta = new OrdinalMeta({\n        categories: map(ordinalMeta, function (item) {\n          return isObject(item) ? item.value : item;\n        })\n      });\n    }\n    _this._ordinalMeta = ordinalMeta;\n    _this._extent = _this.getSetting('extent') || [0, ordinalMeta.categories.length - 1];\n    return _this;\n  }\n  OrdinalScale.prototype.parse = function (val) {\n    // Caution: Math.round(null) will return `0` rather than `NaN`\n    if (val == null) {\n      return NaN;\n    }\n    return isString(val) ? this._ordinalMeta.getOrdinal(val)\n    // val might be float.\n    : Math.round(val);\n  };\n  OrdinalScale.prototype.contain = function (val) {\n    return scaleHelper.contain(val, this._extent) && val >= 0 && val < this._ordinalMeta.categories.length;\n  };\n  /**\n   * Normalize given rank or name to linear [0, 1]\n   * @param val raw ordinal number.\n   * @return normalized value in [0, 1].\n   */\n  OrdinalScale.prototype.normalize = function (val) {\n    val = this._getTickNumber(val);\n    return this._calculator.normalize(val, this._extent);\n  };\n  /**\n   * @param val normalized value in [0, 1].\n   * @return raw ordinal number.\n   */\n  OrdinalScale.prototype.scale = function (val) {\n    val = Math.round(this._calculator.scale(val, this._extent));\n    return this.getRawOrdinalNumber(val);\n  };\n  OrdinalScale.prototype.getTicks = function () {\n    var ticks = [];\n    var extent = this._extent;\n    var rank = extent[0];\n    while (rank <= extent[1]) {\n      ticks.push({\n        value: rank\n      });\n      rank++;\n    }\n    return ticks;\n  };\n  OrdinalScale.prototype.getMinorTicks = function (splitNumber) {\n    // Not support.\n    return;\n  };\n  /**\n   * @see `Ordinal['_ordinalNumbersByTick']`\n   */\n  OrdinalScale.prototype.setSortInfo = function (info) {\n    if (info == null) {\n      this._ordinalNumbersByTick = this._ticksByOrdinalNumber = null;\n      return;\n    }\n    var infoOrdinalNumbers = info.ordinalNumbers;\n    var ordinalsByTick = this._ordinalNumbersByTick = [];\n    var ticksByOrdinal = this._ticksByOrdinalNumber = [];\n    // Unnecessary support negative tick in `realtimeSort`.\n    var tickNum = 0;\n    var allCategoryLen = this._ordinalMeta.categories.length;\n    for (var len = Math.min(allCategoryLen, infoOrdinalNumbers.length); tickNum < len; ++tickNum) {\n      var ordinalNumber = infoOrdinalNumbers[tickNum];\n      ordinalsByTick[tickNum] = ordinalNumber;\n      ticksByOrdinal[ordinalNumber] = tickNum;\n    }\n    // Handle that `series.data` only covers part of the `axis.category.data`.\n    var unusedOrdinal = 0;\n    for (; tickNum < allCategoryLen; ++tickNum) {\n      while (ticksByOrdinal[unusedOrdinal] != null) {\n        unusedOrdinal++;\n      }\n      ;\n      ordinalsByTick.push(unusedOrdinal);\n      ticksByOrdinal[unusedOrdinal] = tickNum;\n    }\n  };\n  OrdinalScale.prototype._getTickNumber = function (ordinal) {\n    var ticksByOrdinalNumber = this._ticksByOrdinalNumber;\n    // also support ordinal out of range of `ordinalMeta.categories.length`,\n    // where ordinal numbers are used as tick value directly.\n    return ticksByOrdinalNumber && ordinal >= 0 && ordinal < ticksByOrdinalNumber.length ? ticksByOrdinalNumber[ordinal] : ordinal;\n  };\n  /**\n   * @usage\n   * ```js\n   * const ordinalNumber = ordinalScale.getRawOrdinalNumber(tickVal);\n   *\n   * // case0\n   * const rawOrdinalValue = axisModel.getCategories()[ordinalNumber];\n   * // case1\n   * const rawOrdinalValue = this._ordinalMeta.categories[ordinalNumber];\n   * // case2\n   * const coord = axis.dataToCoord(ordinalNumber);\n   * ```\n   *\n   * @param {OrdinalNumber} tickNumber index of display\n   */\n  OrdinalScale.prototype.getRawOrdinalNumber = function (tickNumber) {\n    var ordinalNumbersByTick = this._ordinalNumbersByTick;\n    // tickNumber may be out of range, e.g., when axis max is larger than `ordinalMeta.categories.length`.,\n    // where ordinal numbers are used as tick value directly.\n    return ordinalNumbersByTick && tickNumber >= 0 && tickNumber < ordinalNumbersByTick.length ? ordinalNumbersByTick[tickNumber] : tickNumber;\n  };\n  /**\n   * Get item on tick\n   */\n  OrdinalScale.prototype.getLabel = function (tick) {\n    if (!this.isBlank()) {\n      var ordinalNumber = this.getRawOrdinalNumber(tick.value);\n      var cateogry = this._ordinalMeta.categories[ordinalNumber];\n      // Note that if no data, ordinalMeta.categories is an empty array.\n      // Return empty if it's not exist.\n      return cateogry == null ? '' : cateogry + '';\n    }\n  };\n  OrdinalScale.prototype.count = function () {\n    return this._extent[1] - this._extent[0] + 1;\n  };\n  /**\n   * @override\n   * If value is in extent range\n   */\n  OrdinalScale.prototype.isInExtentRange = function (value) {\n    value = this._getTickNumber(value);\n    return this._extent[0] <= value && this._extent[1] >= value;\n  };\n  OrdinalScale.prototype.getOrdinalMeta = function () {\n    return this._ordinalMeta;\n  };\n  OrdinalScale.prototype.calcNiceTicks = function () {};\n  OrdinalScale.prototype.calcNiceExtent = function () {};\n  OrdinalScale.type = 'ordinal';\n  return OrdinalScale;\n}(Scale);\nScale.registerClass(OrdinalScale);\nexport default OrdinalScale;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as numberUtil from '../util/number.js';\nimport * as formatUtil from '../util/format.js';\nimport Scale from './Scale.js';\nimport * as helper from './helper.js';\nimport { getScaleBreakHelper } from './break.js';\nvar roundNumber = numberUtil.round;\nvar IntervalScale = /** @class */function (_super) {\n  __extends(IntervalScale, _super);\n  function IntervalScale() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'interval';\n    // Step is calculated in adjustExtent.\n    _this._interval = 0;\n    _this._intervalPrecision = 2;\n    return _this;\n  }\n  IntervalScale.prototype.parse = function (val) {\n    // `Scale#parse` (and its overrids) are typically applied at the axis values input\n    // in echarts option. e.g., `axis.min/max`, `dataZoom.min/max`, etc.\n    // but `series.data` is not included, which uses `dataValueHelper.ts`#`parseDataValue`.\n    // `Scale#parse` originally introduced in fb8c813215098b9d2458966229bb95c510883d5e\n    // at 2016 for dataZoom start/end settings (See `parseAxisModelMinMax`).\n    //\n    // Historically `scale/Interval.ts` returns the input value directly. But numeric\n    // values (such as a number-like string '123') effectively passed through here and\n    // were involved in calculations, which was error-prone and inconsistent with the\n    // declared TS return type. Previously such issues are fixed separately in different\n    // places case by case (such as #2475).\n    //\n    // Now, we perform actual parse to ensure its `number` type here. The parsing rule\n    // follows the series data parsing rule (`dataValueHelper.ts`#`parseDataValue`)\n    // and maintains compatibility as much as possible (thus a more strict parsing\n    // `number.ts`#`numericToNumber` is not used here.)\n    //\n    // FIXME: `ScaleDataValue` also need to be modified to include numeric string type,\n    //  since it effectively does.\n    return val == null || val === '' ? NaN\n    // If string (like '-'), using '+' parse to NaN\n    // If object, also parse to NaN\n    : Number(val);\n  };\n  IntervalScale.prototype.contain = function (val) {\n    return helper.contain(val, this._extent);\n  };\n  IntervalScale.prototype.normalize = function (val) {\n    return this._calculator.normalize(val, this._extent);\n  };\n  IntervalScale.prototype.scale = function (val) {\n    return this._calculator.scale(val, this._extent);\n  };\n  IntervalScale.prototype.getInterval = function () {\n    return this._interval;\n  };\n  IntervalScale.prototype.setInterval = function (interval) {\n    this._interval = interval;\n    // Dropped auto calculated niceExtent and use user-set extent.\n    // We assume user wants to set both interval, min, max to get a better result.\n    this._niceExtent = this._extent.slice();\n    this._intervalPrecision = helper.getIntervalPrecision(interval);\n  };\n  /**\n   * @override\n   */\n  IntervalScale.prototype.getTicks = function (opt) {\n    opt = opt || {};\n    var interval = this._interval;\n    var extent = this._extent;\n    var niceTickExtent = this._niceExtent;\n    var intervalPrecision = this._intervalPrecision;\n    var scaleBreakHelper = getScaleBreakHelper();\n    var ticks = [];\n    // If interval is 0, return [];\n    if (!interval) {\n      return ticks;\n    }\n    if (opt.breakTicks === 'only_break' && scaleBreakHelper) {\n      scaleBreakHelper.addBreaksToTicks(ticks, this._brkCtx.breaks, this._extent);\n      return ticks;\n    }\n    // Consider this case: using dataZoom toolbox, zoom and zoom.\n    var safeLimit = 10000;\n    if (extent[0] < niceTickExtent[0]) {\n      if (opt.expandToNicedExtent) {\n        ticks.push({\n          value: roundNumber(niceTickExtent[0] - interval, intervalPrecision)\n        });\n      } else {\n        ticks.push({\n          value: extent[0]\n        });\n      }\n    }\n    var estimateNiceMultiple = function (tickVal, targetTick) {\n      return Math.round((targetTick - tickVal) / interval);\n    };\n    var tick = niceTickExtent[0];\n    while (tick <= niceTickExtent[1]) {\n      ticks.push({\n        value: tick\n      });\n      // Avoid rounding error\n      tick = roundNumber(tick + interval, intervalPrecision);\n      if (this._brkCtx) {\n        var moreMultiple = this._brkCtx.calcNiceTickMultiple(tick, estimateNiceMultiple);\n        if (moreMultiple >= 0) {\n          tick = roundNumber(tick + moreMultiple * interval, intervalPrecision);\n        }\n      }\n      if (ticks.length > 0 && tick === ticks[ticks.length - 1].value) {\n        // Consider out of safe float point, e.g.,\n        // -3711126.9907707 + 2e-10 === -3711126.9907707\n        break;\n      }\n      if (ticks.length > safeLimit) {\n        return [];\n      }\n    }\n    // Consider this case: the last item of ticks is smaller\n    // than niceTickExtent[1] and niceTickExtent[1] === extent[1].\n    var lastNiceTick = ticks.length ? ticks[ticks.length - 1].value : niceTickExtent[1];\n    if (extent[1] > lastNiceTick) {\n      if (opt.expandToNicedExtent) {\n        ticks.push({\n          value: roundNumber(lastNiceTick + interval, intervalPrecision)\n        });\n      } else {\n        ticks.push({\n          value: extent[1]\n        });\n      }\n    }\n    if (scaleBreakHelper) {\n      scaleBreakHelper.pruneTicksByBreak(opt.pruneByBreak, ticks, this._brkCtx.breaks, function (item) {\n        return item.value;\n      }, this._interval, this._extent);\n    }\n    if (opt.breakTicks !== 'none' && scaleBreakHelper) {\n      scaleBreakHelper.addBreaksToTicks(ticks, this._brkCtx.breaks, this._extent);\n    }\n    return ticks;\n  };\n  IntervalScale.prototype.getMinorTicks = function (splitNumber) {\n    var ticks = this.getTicks({\n      expandToNicedExtent: true\n    });\n    // NOTE: In log-scale, do not support minor ticks when breaks exist.\n    //  because currently log-scale minor ticks is calculated based on raw values\n    //  rather than log-transformed value, due to an odd effect when breaks exist.\n    var minorTicks = [];\n    var extent = this.getExtent();\n    for (var i = 1; i < ticks.length; i++) {\n      var nextTick = ticks[i];\n      var prevTick = ticks[i - 1];\n      if (prevTick[\"break\"] || nextTick[\"break\"]) {\n        // Do not build minor ticks to the adjacent ticks to breaks ticks,\n        // since the interval might be irregular.\n        continue;\n      }\n      var count = 0;\n      var minorTicksGroup = [];\n      var interval = nextTick.value - prevTick.value;\n      var minorInterval = interval / splitNumber;\n      var minorIntervalPrecision = helper.getIntervalPrecision(minorInterval);\n      while (count < splitNumber - 1) {\n        var minorTick = roundNumber(prevTick.value + (count + 1) * minorInterval, minorIntervalPrecision);\n        // For the first and last interval. The count may be less than splitNumber.\n        if (minorTick > extent[0] && minorTick < extent[1]) {\n          minorTicksGroup.push(minorTick);\n        }\n        count++;\n      }\n      var scaleBreakHelper = getScaleBreakHelper();\n      scaleBreakHelper && scaleBreakHelper.pruneTicksByBreak('auto', minorTicksGroup, this._getNonTransBreaks(), function (value) {\n        return value;\n      }, this._interval, extent);\n      minorTicks.push(minorTicksGroup);\n    }\n    return minorTicks;\n  };\n  IntervalScale.prototype._getNonTransBreaks = function () {\n    return this._brkCtx ? this._brkCtx.breaks : [];\n  };\n  /**\n   * @param opt.precision If 'auto', use nice presision.\n   * @param opt.pad returns 1.50 but not 1.5 if precision is 2.\n   */\n  IntervalScale.prototype.getLabel = function (data, opt) {\n    if (data == null) {\n      return '';\n    }\n    var precision = opt && opt.precision;\n    if (precision == null) {\n      precision = numberUtil.getPrecision(data.value) || 0;\n    } else if (precision === 'auto') {\n      // Should be more precise then tick.\n      precision = this._intervalPrecision;\n    }\n    // (1) If `precision` is set, 12.005 should be display as '12.00500'.\n    // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.\n    var dataNum = roundNumber(data.value, precision, true);\n    return formatUtil.addCommas(dataNum);\n  };\n  /**\n   * FIXME: refactor - disallow override, use composition instead.\n   *\n   * The override of `calcNiceTicks` should ensure these members are provided:\n   *  this._intervalPrecision\n   *  this._interval\n   *\n   * @param splitNumber By default `5`.\n   */\n  IntervalScale.prototype.calcNiceTicks = function (splitNumber, minInterval, maxInterval) {\n    splitNumber = splitNumber || 5;\n    var extent = this._extent.slice();\n    var span = this._getExtentSpanWithBreaks();\n    if (!isFinite(span)) {\n      return;\n    }\n    // User may set axis min 0 and data are all negative\n    // FIXME If it needs to reverse ?\n    if (span < 0) {\n      span = -span;\n      extent.reverse();\n      this._innerSetExtent(extent[0], extent[1]);\n      extent = this._extent.slice();\n    }\n    var result = helper.intervalScaleNiceTicks(extent, span, splitNumber, minInterval, maxInterval);\n    this._intervalPrecision = result.intervalPrecision;\n    this._interval = result.interval;\n    this._niceExtent = result.niceTickExtent;\n  };\n  IntervalScale.prototype.calcNiceExtent = function (opt) {\n    var extent = this._extent.slice();\n    // If extent start and end are same, expand them\n    if (extent[0] === extent[1]) {\n      if (extent[0] !== 0) {\n        // Expand extent\n        // Note that extents can be both negative. See #13154\n        var expandSize = Math.abs(extent[0]);\n        // In the fowllowing case\n        //      Axis has been fixed max 100\n        //      Plus data are all 100 and axis extent are [100, 100].\n        // Extend to the both side will cause expanded max is larger than fixed max.\n        // So only expand to the smaller side.\n        if (!opt.fixMax) {\n          extent[1] += expandSize / 2;\n          extent[0] -= expandSize / 2;\n        } else {\n          extent[0] -= expandSize / 2;\n        }\n      } else {\n        extent[1] = 1;\n      }\n    }\n    var span = extent[1] - extent[0];\n    // If there are no data and extent are [Infinity, -Infinity]\n    if (!isFinite(span)) {\n      extent[0] = 0;\n      extent[1] = 1;\n    }\n    this._innerSetExtent(extent[0], extent[1]);\n    extent = this._extent.slice();\n    this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);\n    var interval = this._interval;\n    var intervalPrecition = this._intervalPrecision;\n    if (!opt.fixMin) {\n      extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval, intervalPrecition);\n    }\n    if (!opt.fixMax) {\n      extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval, intervalPrecition);\n    }\n    this._innerSetExtent(extent[0], extent[1]);\n  };\n  IntervalScale.prototype.setNiceExtent = function (min, max) {\n    this._niceExtent = [min, max];\n  };\n  IntervalScale.type = 'interval';\n  return IntervalScale;\n}(Scale);\nScale.registerClass(IntervalScale);\nexport default IntervalScale;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isArray } from 'zrender/lib/core/util.js';\n/* global Float32Array */\nvar supportFloat32Array = typeof Float32Array !== 'undefined';\nvar Float32ArrayCtor = !supportFloat32Array ? Array : Float32Array;\nexport function createFloat32Array(arg) {\n  if (isArray(arg)) {\n    // Return self directly if don't support TypedArray.\n    return supportFloat32Array ? new Float32Array(arg) : arg;\n  }\n  // Else is number\n  return new Float32ArrayCtor(arg);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, defaults, keys } from 'zrender/lib/core/util.js';\nimport { parsePercent } from '../util/number.js';\nimport { isDimensionStacked } from '../data/helper/dataStackHelper.js';\nimport createRenderPlanner from '../chart/helper/createRenderPlanner.js';\nimport { createFloat32Array } from '../util/vendor.js';\nvar STACK_PREFIX = '__ec_stack_';\nfunction getSeriesStackId(seriesModel) {\n  return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;\n}\nfunction getAxisKey(axis) {\n  return axis.dim + axis.index;\n}\n/**\n * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined.\n */\nexport function getLayoutOnAxis(opt) {\n  var params = [];\n  var baseAxis = opt.axis;\n  var axisKey = 'axis0';\n  if (baseAxis.type !== 'category') {\n    return;\n  }\n  var bandWidth = baseAxis.getBandWidth();\n  for (var i = 0; i < opt.count || 0; i++) {\n    params.push(defaults({\n      bandWidth: bandWidth,\n      axisKey: axisKey,\n      stackId: STACK_PREFIX + i\n    }, opt));\n  }\n  var widthAndOffsets = doCalBarWidthAndOffset(params);\n  var result = [];\n  for (var i = 0; i < opt.count; i++) {\n    var item = widthAndOffsets[axisKey][STACK_PREFIX + i];\n    item.offsetCenter = item.offset + item.width / 2;\n    result.push(item);\n  }\n  return result;\n}\nexport function prepareLayoutBarSeries(seriesType, ecModel) {\n  var seriesModels = [];\n  ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n    // Check series coordinate, do layout for cartesian2d only\n    if (isOnCartesian(seriesModel)) {\n      seriesModels.push(seriesModel);\n    }\n  });\n  return seriesModels;\n}\n/**\n * Map from (baseAxis.dim + '_' + baseAxis.index) to min gap of two adjacent\n * values.\n * This works for time axes, value axes, and log axes.\n * For a single time axis, return value is in the form like\n * {'x_0': [1000000]}.\n * The value of 1000000 is in milliseconds.\n */\nfunction getValueAxesMinGaps(barSeries) {\n  /**\n   * Map from axis.index to values.\n   * For a single time axis, axisValues is in the form like\n   * {'x_0': [1495555200000, 1495641600000, 1495728000000]}.\n   * Items in axisValues[x], e.g. 1495555200000, are time values of all\n   * series.\n   */\n  var axisValues = {};\n  each(barSeries, function (seriesModel) {\n    var cartesian = seriesModel.coordinateSystem;\n    var baseAxis = cartesian.getBaseAxis();\n    if (baseAxis.type !== 'time' && baseAxis.type !== 'value') {\n      return;\n    }\n    var data = seriesModel.getData();\n    var key = baseAxis.dim + '_' + baseAxis.index;\n    var dimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim));\n    var store = data.getStore();\n    for (var i = 0, cnt = store.count(); i < cnt; ++i) {\n      var value = store.get(dimIdx, i);\n      if (!axisValues[key]) {\n        // No previous data for the axis\n        axisValues[key] = [value];\n      } else {\n        // No value in previous series\n        axisValues[key].push(value);\n      }\n      // Ignore duplicated time values in the same axis\n    }\n  });\n  var axisMinGaps = {};\n  for (var key in axisValues) {\n    if (axisValues.hasOwnProperty(key)) {\n      var valuesInAxis = axisValues[key];\n      if (valuesInAxis) {\n        // Sort axis values into ascending order to calculate gaps\n        valuesInAxis.sort(function (a, b) {\n          return a - b;\n        });\n        var min = null;\n        for (var j = 1; j < valuesInAxis.length; ++j) {\n          var delta = valuesInAxis[j] - valuesInAxis[j - 1];\n          if (delta > 0) {\n            // Ignore 0 delta because they are of the same axis value\n            min = min === null ? delta : Math.min(min, delta);\n          }\n        }\n        // Set to null if only have one data\n        axisMinGaps[key] = min;\n      }\n    }\n  }\n  return axisMinGaps;\n}\nexport function makeColumnLayout(barSeries) {\n  var axisMinGaps = getValueAxesMinGaps(barSeries);\n  var seriesInfoList = [];\n  each(barSeries, function (seriesModel) {\n    var cartesian = seriesModel.coordinateSystem;\n    var baseAxis = cartesian.getBaseAxis();\n    var axisExtent = baseAxis.getExtent();\n    var bandWidth;\n    if (baseAxis.type === 'category') {\n      bandWidth = baseAxis.getBandWidth();\n    } else if (baseAxis.type === 'value' || baseAxis.type === 'time') {\n      var key = baseAxis.dim + '_' + baseAxis.index;\n      var minGap = axisMinGaps[key];\n      var extentSpan = Math.abs(axisExtent[1] - axisExtent[0]);\n      var scale = baseAxis.scale.getExtent();\n      var scaleSpan = Math.abs(scale[1] - scale[0]);\n      bandWidth = minGap ? extentSpan / scaleSpan * minGap : extentSpan; // When there is only one data value\n    } else {\n      var data = seriesModel.getData();\n      bandWidth = Math.abs(axisExtent[1] - axisExtent[0]) / data.count();\n    }\n    var barWidth = parsePercent(seriesModel.get('barWidth'), bandWidth);\n    var barMaxWidth = parsePercent(seriesModel.get('barMaxWidth'), bandWidth);\n    var barMinWidth = parsePercent(\n    // barMinWidth by default is 0.5 / 1 in cartesian. Because in value axis,\n    // the auto-calculated bar width might be less than 0.5 / 1.\n    seriesModel.get('barMinWidth') || (isInLargeMode(seriesModel) ? 0.5 : 1), bandWidth);\n    var barGap = seriesModel.get('barGap');\n    var barCategoryGap = seriesModel.get('barCategoryGap');\n    var defaultBarGap = seriesModel.get('defaultBarGap');\n    seriesInfoList.push({\n      bandWidth: bandWidth,\n      barWidth: barWidth,\n      barMaxWidth: barMaxWidth,\n      barMinWidth: barMinWidth,\n      barGap: barGap,\n      barCategoryGap: barCategoryGap,\n      defaultBarGap: defaultBarGap,\n      axisKey: getAxisKey(baseAxis),\n      stackId: getSeriesStackId(seriesModel)\n    });\n  });\n  return doCalBarWidthAndOffset(seriesInfoList);\n}\nfunction doCalBarWidthAndOffset(seriesInfoList) {\n  // Columns info on each category axis. Key is cartesian name\n  var columnsMap = {};\n  each(seriesInfoList, function (seriesInfo, idx) {\n    var axisKey = seriesInfo.axisKey;\n    var bandWidth = seriesInfo.bandWidth;\n    var columnsOnAxis = columnsMap[axisKey] || {\n      bandWidth: bandWidth,\n      remainedWidth: bandWidth,\n      autoWidthCount: 0,\n      categoryGap: null,\n      gap: seriesInfo.defaultBarGap || 0,\n      stacks: {}\n    };\n    var stacks = columnsOnAxis.stacks;\n    columnsMap[axisKey] = columnsOnAxis;\n    var stackId = seriesInfo.stackId;\n    if (!stacks[stackId]) {\n      columnsOnAxis.autoWidthCount++;\n    }\n    stacks[stackId] = stacks[stackId] || {\n      width: 0,\n      maxWidth: 0\n    };\n    // Caution: In a single coordinate system, these barGrid attributes\n    // will be shared by series. Consider that they have default values,\n    // only the attributes set on the last series will work.\n    // Do not change this fact unless there will be a break change.\n    var barWidth = seriesInfo.barWidth;\n    if (barWidth && !stacks[stackId].width) {\n      // See #6312, do not restrict width.\n      stacks[stackId].width = barWidth;\n      barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);\n      columnsOnAxis.remainedWidth -= barWidth;\n    }\n    var barMaxWidth = seriesInfo.barMaxWidth;\n    barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);\n    var barMinWidth = seriesInfo.barMinWidth;\n    barMinWidth && (stacks[stackId].minWidth = barMinWidth);\n    var barGap = seriesInfo.barGap;\n    barGap != null && (columnsOnAxis.gap = barGap);\n    var barCategoryGap = seriesInfo.barCategoryGap;\n    barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap);\n  });\n  var result = {};\n  each(columnsMap, function (columnsOnAxis, coordSysName) {\n    result[coordSysName] = {};\n    var stacks = columnsOnAxis.stacks;\n    var bandWidth = columnsOnAxis.bandWidth;\n    var categoryGapPercent = columnsOnAxis.categoryGap;\n    if (categoryGapPercent == null) {\n      var columnCount = keys(stacks).length;\n      // More columns in one group\n      // the spaces between group is smaller. Or the column will be too thin.\n      categoryGapPercent = Math.max(35 - columnCount * 4, 15) + '%';\n    }\n    var categoryGap = parsePercent(categoryGapPercent, bandWidth);\n    var barGapPercent = parsePercent(columnsOnAxis.gap, 1);\n    var remainedWidth = columnsOnAxis.remainedWidth;\n    var autoWidthCount = columnsOnAxis.autoWidthCount;\n    var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n    autoWidth = Math.max(autoWidth, 0);\n    // Find if any auto calculated bar exceeded maxBarWidth\n    each(stacks, function (column) {\n      var maxWidth = column.maxWidth;\n      var minWidth = column.minWidth;\n      if (!column.width) {\n        var finalWidth = autoWidth;\n        if (maxWidth && maxWidth < finalWidth) {\n          finalWidth = Math.min(maxWidth, remainedWidth);\n        }\n        // `minWidth` has higher priority. `minWidth` decide that whether the\n        // bar is able to be visible. So `minWidth` should not be restricted\n        // by `maxWidth` or `remainedWidth` (which is from `bandWidth`). In\n        // the extreme cases for `value` axis, bars are allowed to overlap\n        // with each other if `minWidth` specified.\n        if (minWidth && minWidth > finalWidth) {\n          finalWidth = minWidth;\n        }\n        if (finalWidth !== autoWidth) {\n          column.width = finalWidth;\n          remainedWidth -= finalWidth + barGapPercent * finalWidth;\n          autoWidthCount--;\n        }\n      } else {\n        // `barMinWidth/barMaxWidth` has higher priority than `barWidth`, as\n        // CSS does. Because barWidth can be a percent value, where\n        // `barMaxWidth` can be used to restrict the final width.\n        var finalWidth = column.width;\n        if (maxWidth) {\n          finalWidth = Math.min(finalWidth, maxWidth);\n        }\n        // `minWidth` has higher priority, as described above\n        if (minWidth) {\n          finalWidth = Math.max(finalWidth, minWidth);\n        }\n        column.width = finalWidth;\n        remainedWidth -= finalWidth + barGapPercent * finalWidth;\n        autoWidthCount--;\n      }\n    });\n    // Recalculate width again\n    autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n    autoWidth = Math.max(autoWidth, 0);\n    var widthSum = 0;\n    var lastColumn;\n    each(stacks, function (column, idx) {\n      if (!column.width) {\n        column.width = autoWidth;\n      }\n      lastColumn = column;\n      widthSum += column.width * (1 + barGapPercent);\n    });\n    if (lastColumn) {\n      widthSum -= lastColumn.width * barGapPercent;\n    }\n    var offset = -widthSum / 2;\n    each(stacks, function (column, stackId) {\n      result[coordSysName][stackId] = result[coordSysName][stackId] || {\n        bandWidth: bandWidth,\n        offset: offset,\n        width: column.width\n      };\n      offset += column.width * (1 + barGapPercent);\n    });\n  });\n  return result;\n}\nfunction retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) {\n  if (barWidthAndOffset && axis) {\n    var result = barWidthAndOffset[getAxisKey(axis)];\n    if (result != null && seriesModel != null) {\n      return result[getSeriesStackId(seriesModel)];\n    }\n    return result;\n  }\n}\nexport { retrieveColumnLayout };\nexport function layout(seriesType, ecModel) {\n  var seriesModels = prepareLayoutBarSeries(seriesType, ecModel);\n  var barWidthAndOffset = makeColumnLayout(seriesModels);\n  each(seriesModels, function (seriesModel) {\n    var data = seriesModel.getData();\n    var cartesian = seriesModel.coordinateSystem;\n    var baseAxis = cartesian.getBaseAxis();\n    var stackId = getSeriesStackId(seriesModel);\n    var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId];\n    var columnOffset = columnLayoutInfo.offset;\n    var columnWidth = columnLayoutInfo.width;\n    data.setLayout({\n      bandWidth: columnLayoutInfo.bandWidth,\n      offset: columnOffset,\n      size: columnWidth\n    });\n  });\n}\n// TODO: Do not support stack in large mode yet.\nexport function createProgressiveLayout(seriesType) {\n  return {\n    seriesType: seriesType,\n    plan: createRenderPlanner(),\n    reset: function (seriesModel) {\n      if (!isOnCartesian(seriesModel)) {\n        return;\n      }\n      var data = seriesModel.getData();\n      var cartesian = seriesModel.coordinateSystem;\n      var baseAxis = cartesian.getBaseAxis();\n      var valueAxis = cartesian.getOtherAxis(baseAxis);\n      var valueDimIdx = data.getDimensionIndex(data.mapDimension(valueAxis.dim));\n      var baseDimIdx = data.getDimensionIndex(data.mapDimension(baseAxis.dim));\n      var drawBackground = seriesModel.get('showBackground', true);\n      var valueDim = data.mapDimension(valueAxis.dim);\n      var stackResultDim = data.getCalculationInfo('stackResultDimension');\n      var stacked = isDimensionStacked(data, valueDim) && !!data.getCalculationInfo('stackedOnSeries');\n      var isValueAxisH = valueAxis.isHorizontal();\n      var valueAxisStart = getValueAxisStart(baseAxis, valueAxis);\n      var isLarge = isInLargeMode(seriesModel);\n      var barMinHeight = seriesModel.get('barMinHeight') || 0;\n      var stackedDimIdx = stackResultDim && data.getDimensionIndex(stackResultDim);\n      // Layout info.\n      var columnWidth = data.getLayout('size');\n      var columnOffset = data.getLayout('offset');\n      return {\n        progress: function (params, data) {\n          var count = params.count;\n          var largePoints = isLarge && createFloat32Array(count * 3);\n          var largeBackgroundPoints = isLarge && drawBackground && createFloat32Array(count * 3);\n          var largeDataIndices = isLarge && createFloat32Array(count);\n          var coordLayout = cartesian.master.getRect();\n          var bgSize = isValueAxisH ? coordLayout.width : coordLayout.height;\n          var dataIndex;\n          var store = data.getStore();\n          var idxOffset = 0;\n          while ((dataIndex = params.next()) != null) {\n            var value = store.get(stacked ? stackedDimIdx : valueDimIdx, dataIndex);\n            var baseValue = store.get(baseDimIdx, dataIndex);\n            var baseCoord = valueAxisStart;\n            var stackStartValue = void 0;\n            // Because of the barMinHeight, we can not use the value in\n            // stackResultDimension directly.\n            if (stacked) {\n              stackStartValue = +value - store.get(valueDimIdx, dataIndex);\n            }\n            var x = void 0;\n            var y = void 0;\n            var width = void 0;\n            var height = void 0;\n            if (isValueAxisH) {\n              var coord = cartesian.dataToPoint([value, baseValue]);\n              if (stacked) {\n                var startCoord = cartesian.dataToPoint([stackStartValue, baseValue]);\n                baseCoord = startCoord[0];\n              }\n              x = baseCoord;\n              y = coord[1] + columnOffset;\n              width = coord[0] - baseCoord;\n              height = columnWidth;\n              if (Math.abs(width) < barMinHeight) {\n                width = (width < 0 ? -1 : 1) * barMinHeight;\n              }\n            } else {\n              var coord = cartesian.dataToPoint([baseValue, value]);\n              if (stacked) {\n                var startCoord = cartesian.dataToPoint([baseValue, stackStartValue]);\n                baseCoord = startCoord[1];\n              }\n              x = coord[0] + columnOffset;\n              y = baseCoord;\n              width = columnWidth;\n              height = coord[1] - baseCoord;\n              if (Math.abs(height) < barMinHeight) {\n                // Include zero to has a positive bar\n                height = (height <= 0 ? -1 : 1) * barMinHeight;\n              }\n            }\n            if (!isLarge) {\n              data.setItemLayout(dataIndex, {\n                x: x,\n                y: y,\n                width: width,\n                height: height\n              });\n            } else {\n              largePoints[idxOffset] = x;\n              largePoints[idxOffset + 1] = y;\n              largePoints[idxOffset + 2] = isValueAxisH ? width : height;\n              if (largeBackgroundPoints) {\n                largeBackgroundPoints[idxOffset] = isValueAxisH ? coordLayout.x : x;\n                largeBackgroundPoints[idxOffset + 1] = isValueAxisH ? y : coordLayout.y;\n                largeBackgroundPoints[idxOffset + 2] = bgSize;\n              }\n              largeDataIndices[dataIndex] = dataIndex;\n            }\n            idxOffset += 3;\n          }\n          if (isLarge) {\n            data.setLayout({\n              largePoints: largePoints,\n              largeDataIndices: largeDataIndices,\n              largeBackgroundPoints: largeBackgroundPoints,\n              valueAxisHorizontal: isValueAxisH\n            });\n          }\n        }\n      };\n    }\n  };\n}\nfunction isOnCartesian(seriesModel) {\n  return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d';\n}\nfunction isInLargeMode(seriesModel) {\n  return seriesModel.pipelineContext && seriesModel.pipelineContext.large;\n}\n// See cases in `test/bar-start.html` and `#7412`, `#8747`.\nfunction getValueAxisStart(baseAxis, valueAxis) {\n  var startValue = valueAxis.model.get('startValue');\n  if (!startValue) {\n    startValue = 0;\n  }\n  return valueAxis.toGlobalCoord(valueAxis.dataToCoord(valueAxis.type === 'log' ? startValue > 0 ? startValue : 1 : startValue));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/*\n* A third-party license is embedded for some of the code in this file:\n* The \"scaleLevels\" was originally copied from \"d3.js\" with some\n* modifications made for this project.\n* (See more details in the comment on the definition of \"scaleLevels\" below.)\n* The use of the source code of this file is also subject to the terms\n* and consitions of the license of \"d3.js\" (BSD-3Clause, see\n* </licenses/LICENSE-d3>).\n*/\n// [About UTC and local time zone]:\n// In most cases, `number.parseDate` will treat input data string as local time\n// (except time zone is specified in time string). And `format.formateTime` returns\n// local time by default. option.useUTC is false by default. This design has\n// considered these common cases:\n// (1) Time that is persistent in server is in UTC, but it is needed to be displayed\n// in local time by default.\n// (2) By default, the input data string (e.g., '2011-01-02') should be displayed\n// as its original time, without any time difference.\nimport * as numberUtil from '../util/number.js';\nimport { ONE_SECOND, ONE_MINUTE, ONE_HOUR, ONE_DAY, ONE_YEAR, format, leveledFormat, timeUnits, fullLeveledFormatter, getPrimaryTimeUnit, isPrimaryTimeUnit, getDefaultFormatPrecisionOfInterval, fullYearGetterName, monthSetterName, fullYearSetterName, dateSetterName, hoursGetterName, hoursSetterName, minutesSetterName, secondsSetterName, millisecondsSetterName, monthGetterName, dateGetterName, minutesGetterName, secondsGetterName, millisecondsGetterName, getUnitFromValue, primaryTimeUnits, roundTime } from '../util/time.js';\nimport * as scaleHelper from './helper.js';\nimport IntervalScale from './Interval.js';\nimport Scale from './Scale.js';\nimport { warn } from '../util/log.js';\nimport { each, filter, indexOf, isNumber, map } from 'zrender/lib/core/util.js';\nimport { getScaleBreakHelper } from './break.js';\n// FIXME \u516C\u7528\uFF1F\nvar bisect = function (a, x, lo, hi) {\n  while (lo < hi) {\n    var mid = lo + hi >>> 1;\n    if (a[mid][1] < x) {\n      lo = mid + 1;\n    } else {\n      hi = mid;\n    }\n  }\n  return lo;\n};\nvar TimeScale = /** @class */function (_super) {\n  __extends(TimeScale, _super);\n  function TimeScale(settings) {\n    var _this = _super.call(this, settings) || this;\n    _this.type = 'time';\n    return _this;\n  }\n  /**\n   * Get label is mainly for other components like dataZoom, tooltip.\n   */\n  TimeScale.prototype.getLabel = function (tick) {\n    var useUTC = this.getSetting('useUTC');\n    return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting('locale'));\n  };\n  TimeScale.prototype.getFormattedLabel = function (tick, idx, labelFormatter) {\n    var isUTC = this.getSetting('useUTC');\n    var lang = this.getSetting('locale');\n    return leveledFormat(tick, idx, labelFormatter, lang, isUTC);\n  };\n  /**\n   * @override\n   */\n  TimeScale.prototype.getTicks = function (opt) {\n    opt = opt || {};\n    var interval = this._interval;\n    var extent = this._extent;\n    var scaleBreakHelper = getScaleBreakHelper();\n    var ticks = [];\n    // If interval is 0, return [];\n    if (!interval) {\n      return ticks;\n    }\n    var useUTC = this.getSetting('useUTC');\n    if (scaleBreakHelper && opt.breakTicks === 'only_break') {\n      getScaleBreakHelper().addBreaksToTicks(ticks, this._brkCtx.breaks, this._extent);\n      return ticks;\n    }\n    var extent0Unit = getUnitFromValue(extent[1], useUTC);\n    ticks.push({\n      value: extent[0],\n      time: {\n        level: 0,\n        upperTimeUnit: extent0Unit,\n        lowerTimeUnit: extent0Unit\n      }\n    });\n    var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent, this._getExtentSpanWithBreaks(), this._brkCtx);\n    ticks = ticks.concat(innerTicks);\n    var extent1Unit = getUnitFromValue(extent[1], useUTC);\n    ticks.push({\n      value: extent[1],\n      time: {\n        level: 0,\n        upperTimeUnit: extent1Unit,\n        lowerTimeUnit: extent1Unit\n      }\n    });\n    var isUTC = this.getSetting('useUTC');\n    var upperUnitIndex = primaryTimeUnits.length - 1;\n    var maxLevel = 0;\n    each(ticks, function (tick) {\n      upperUnitIndex = Math.min(upperUnitIndex, indexOf(primaryTimeUnits, tick.time.upperTimeUnit));\n      maxLevel = Math.max(maxLevel, tick.time.level);\n    });\n    if (scaleBreakHelper) {\n      getScaleBreakHelper().pruneTicksByBreak(opt.pruneByBreak, ticks, this._brkCtx.breaks, function (item) {\n        return item.value;\n      }, this._approxInterval, this._extent);\n    }\n    if (scaleBreakHelper && opt.breakTicks !== 'none') {\n      getScaleBreakHelper().addBreaksToTicks(ticks, this._brkCtx.breaks, this._extent, function (trimmedBrk) {\n        // @see `parseTimeAxisLabelFormatterDictionary`.\n        var lowerBrkUnitIndex = Math.max(indexOf(primaryTimeUnits, getUnitFromValue(trimmedBrk.vmin, isUTC)), indexOf(primaryTimeUnits, getUnitFromValue(trimmedBrk.vmax, isUTC)));\n        var upperBrkUnitIndex = 0;\n        for (var unitIdx = 0; unitIdx < primaryTimeUnits.length; unitIdx++) {\n          if (!isPrimaryUnitValueAndGreaterSame(primaryTimeUnits[unitIdx], trimmedBrk.vmin, trimmedBrk.vmax, isUTC)) {\n            upperBrkUnitIndex = unitIdx;\n            break;\n          }\n        }\n        var upperIdx = Math.min(upperBrkUnitIndex, upperUnitIndex);\n        var lowerIdx = Math.max(upperIdx, lowerBrkUnitIndex);\n        return {\n          level: maxLevel,\n          lowerTimeUnit: primaryTimeUnits[lowerIdx],\n          upperTimeUnit: primaryTimeUnits[upperIdx]\n        };\n      });\n    }\n    return ticks;\n  };\n  TimeScale.prototype.calcNiceExtent = function (opt) {\n    var extent = this.getExtent();\n    // If extent start and end are same, expand them\n    if (extent[0] === extent[1]) {\n      // Expand extent\n      extent[0] -= ONE_DAY;\n      extent[1] += ONE_DAY;\n    }\n    // If there are no data and extent are [Infinity, -Infinity]\n    if (extent[1] === -Infinity && extent[0] === Infinity) {\n      var d = new Date();\n      extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate());\n      extent[0] = extent[1] - ONE_DAY;\n    }\n    this._innerSetExtent(extent[0], extent[1]);\n    this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);\n  };\n  TimeScale.prototype.calcNiceTicks = function (approxTickNum, minInterval, maxInterval) {\n    approxTickNum = approxTickNum || 10;\n    var span = this._getExtentSpanWithBreaks();\n    this._approxInterval = span / approxTickNum;\n    if (minInterval != null && this._approxInterval < minInterval) {\n      this._approxInterval = minInterval;\n    }\n    if (maxInterval != null && this._approxInterval > maxInterval) {\n      this._approxInterval = maxInterval;\n    }\n    var scaleIntervalsLen = scaleIntervals.length;\n    var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1);\n    // Interval that can be used to calculate ticks\n    this._interval = scaleIntervals[idx][1];\n    this._intervalPrecision = scaleHelper.getIntervalPrecision(this._interval);\n    // Min level used when picking ticks from top down.\n    // We check one more level to avoid the ticks are to sparse in some case.\n    this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0];\n  };\n  TimeScale.prototype.parse = function (val) {\n    // val might be float.\n    return isNumber(val) ? val : +numberUtil.parseDate(val);\n  };\n  TimeScale.prototype.contain = function (val) {\n    return scaleHelper.contain(val, this._extent);\n  };\n  TimeScale.prototype.normalize = function (val) {\n    return this._calculator.normalize(val, this._extent);\n  };\n  TimeScale.prototype.scale = function (val) {\n    return this._calculator.scale(val, this._extent);\n  };\n  TimeScale.type = 'time';\n  return TimeScale;\n}(IntervalScale);\n/**\n * This implementation was originally copied from \"d3.js\"\n * <https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/time/scale.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n */\nvar scaleIntervals = [\n// Format                           interval\n['second', ONE_SECOND], ['minute', ONE_MINUTE], ['hour', ONE_HOUR], ['quarter-day', ONE_HOUR * 6], ['half-day', ONE_HOUR * 12], ['day', ONE_DAY * 1.2], ['half-week', ONE_DAY * 3.5], ['week', ONE_DAY * 7], ['month', ONE_DAY * 31], ['quarter', ONE_DAY * 95], ['half-year', ONE_YEAR / 2], ['year', ONE_YEAR] // 1Y\n];\nfunction isPrimaryUnitValueAndGreaterSame(unit, valueA, valueB, isUTC) {\n  return roundTime(new Date(valueA), unit, isUTC).getTime() === roundTime(new Date(valueB), unit, isUTC).getTime();\n}\n// function isUnitValueSame(\n//     unit: PrimaryTimeUnit,\n//     valueA: number,\n//     valueB: number,\n//     isUTC: boolean\n// ): boolean {\n//     const dateA = numberUtil.parseDate(valueA) as any;\n//     const dateB = numberUtil.parseDate(valueB) as any;\n//     const isSame = (unit: PrimaryTimeUnit) => {\n//         return getUnitValue(dateA, unit, isUTC)\n//             === getUnitValue(dateB, unit, isUTC);\n//     };\n//     const isSameYear = () => isSame('year');\n//     // const isSameHalfYear = () => isSameYear() && isSame('half-year');\n//     // const isSameQuater = () => isSameYear() && isSame('quarter');\n//     const isSameMonth = () => isSameYear() && isSame('month');\n//     const isSameDay = () => isSameMonth() && isSame('day');\n//     // const isSameHalfDay = () => isSameDay() && isSame('half-day');\n//     const isSameHour = () => isSameDay() && isSame('hour');\n//     const isSameMinute = () => isSameHour() && isSame('minute');\n//     const isSameSecond = () => isSameMinute() && isSame('second');\n//     const isSameMilliSecond = () => isSameSecond() && isSame('millisecond');\n//     switch (unit) {\n//         case 'year':\n//             return isSameYear();\n//         case 'month':\n//             return isSameMonth();\n//         case 'day':\n//             return isSameDay();\n//         case 'hour':\n//             return isSameHour();\n//         case 'minute':\n//             return isSameMinute();\n//         case 'second':\n//             return isSameSecond();\n//         case 'millisecond':\n//             return isSameMilliSecond();\n//     }\n// }\n// const primaryUnitGetters = {\n//     year: fullYearGetterName(),\n//     month: monthGetterName(),\n//     day: dateGetterName(),\n//     hour: hoursGetterName(),\n//     minute: minutesGetterName(),\n//     second: secondsGetterName(),\n//     millisecond: millisecondsGetterName()\n// };\n// const primaryUnitUTCGetters = {\n//     year: fullYearGetterName(true),\n//     month: monthGetterName(true),\n//     day: dateGetterName(true),\n//     hour: hoursGetterName(true),\n//     minute: minutesGetterName(true),\n//     second: secondsGetterName(true),\n//     millisecond: millisecondsGetterName(true)\n// };\n// function moveTick(date: Date, unitName: TimeUnit, step: number, isUTC: boolean) {\n//     step = step || 1;\n//     switch (getPrimaryTimeUnit(unitName)) {\n//         case 'year':\n//             date[fullYearSetterName(isUTC)](date[fullYearGetterName(isUTC)]() + step);\n//             break;\n//         case 'month':\n//             date[monthSetterName(isUTC)](date[monthGetterName(isUTC)]() + step);\n//             break;\n//         case 'day':\n//             date[dateSetterName(isUTC)](date[dateGetterName(isUTC)]() + step);\n//             break;\n//         case 'hour':\n//             date[hoursSetterName(isUTC)](date[hoursGetterName(isUTC)]() + step);\n//             break;\n//         case 'minute':\n//             date[minutesSetterName(isUTC)](date[minutesGetterName(isUTC)]() + step);\n//             break;\n//         case 'second':\n//             date[secondsSetterName(isUTC)](date[secondsGetterName(isUTC)]() + step);\n//             break;\n//         case 'millisecond':\n//             date[millisecondsSetterName(isUTC)](date[millisecondsGetterName(isUTC)]() + step);\n//             break;\n//     }\n//     return date.getTime();\n// }\n// const DATE_INTERVALS = [[8, 7.5], [4, 3.5], [2, 1.5]];\n// const MONTH_INTERVALS = [[6, 5.5], [3, 2.5], [2, 1.5]];\n// const MINUTES_SECONDS_INTERVALS = [[30, 30], [20, 20], [15, 15], [10, 10], [5, 5], [2, 2]];\nfunction getDateInterval(approxInterval, daysInMonth) {\n  approxInterval /= ONE_DAY;\n  return approxInterval > 16 ? 16\n  // Math.floor(daysInMonth / 2) + 1  // In this case we only want one tick between two months.\n  : approxInterval > 7.5 ? 7 // TODO week 7 or day 8?\n  : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1;\n}\nfunction getMonthInterval(approxInterval) {\n  var APPROX_ONE_MONTH = 30 * ONE_DAY;\n  approxInterval /= APPROX_ONE_MONTH;\n  return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1;\n}\nfunction getHourInterval(approxInterval) {\n  approxInterval /= ONE_HOUR;\n  return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1;\n}\nfunction getMinutesAndSecondsInterval(approxInterval, isMinutes) {\n  approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND;\n  return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1;\n}\nfunction getMillisecondsInterval(approxInterval) {\n  return numberUtil.nice(approxInterval, true);\n}\n// e.g., if the input unit is 'day', start calculate ticks from the first day of\n// that month to make ticks \"nice\".\nfunction getFirstTimestampOfUnit(timestamp, unitName, isUTC) {\n  var upperUnitIdx = Math.max(0, indexOf(primaryTimeUnits, unitName) - 1);\n  return roundTime(new Date(timestamp), primaryTimeUnits[upperUnitIdx], isUTC).getTime();\n}\nfunction createEstimateNiceMultiple(setMethodName, dateMethodInterval) {\n  var tmpDate = new Date(0);\n  tmpDate[setMethodName](1);\n  var tmpTime = tmpDate.getTime();\n  tmpDate[setMethodName](1 + dateMethodInterval);\n  var approxTimeInterval = tmpDate.getTime() - tmpTime;\n  return function (tickVal, targetValue) {\n    // Only in month that accurate result can not get by division of\n    // timestamp interval, but no need accurate here.\n    return Math.max(0, Math.round((targetValue - tickVal) / approxTimeInterval));\n  };\n}\nfunction getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent, extentSpanWithBreaks, brkCtx) {\n  var safeLimit = 10000;\n  var unitNames = timeUnits;\n  var iter = 0;\n  function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) {\n    var estimateNiceMultiple = createEstimateNiceMultiple(setMethodName, interval);\n    var dateTime = minTimestamp;\n    var date = new Date(dateTime);\n    // if (isDate) {\n    //     d -= 1; // Starts with 0;   PENDING\n    // }\n    while (dateTime < maxTimestamp && dateTime <= extent[1]) {\n      out.push({\n        value: dateTime\n      });\n      if (iter++ > safeLimit) {\n        if (process.env.NODE_ENV !== 'production') {\n          warn('Exceed safe limit in time scale.');\n        }\n        break;\n      }\n      date[setMethodName](date[getMethodName]() + interval);\n      dateTime = date.getTime();\n      if (brkCtx) {\n        var moreMultiple = brkCtx.calcNiceTickMultiple(dateTime, estimateNiceMultiple);\n        if (moreMultiple > 0) {\n          date[setMethodName](date[getMethodName]() + moreMultiple * interval);\n          dateTime = date.getTime();\n        }\n      }\n    }\n    // This extra tick is for calcuating ticks of next level. Will not been added to the final result\n    out.push({\n      value: dateTime,\n      notAdd: true\n    });\n  }\n  function addLevelTicks(unitName, lastLevelTicks, levelTicks) {\n    var newAddedTicks = [];\n    var isFirstLevel = !lastLevelTicks.length;\n    if (isPrimaryUnitValueAndGreaterSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) {\n      return;\n    }\n    if (isFirstLevel) {\n      lastLevelTicks = [{\n        value: getFirstTimestampOfUnit(extent[0], unitName, isUTC)\n      }, {\n        value: extent[1]\n      }];\n    }\n    for (var i = 0; i < lastLevelTicks.length - 1; i++) {\n      var startTick = lastLevelTicks[i].value;\n      var endTick = lastLevelTicks[i + 1].value;\n      if (startTick === endTick) {\n        continue;\n      }\n      var interval = void 0;\n      var getterName = void 0;\n      var setterName = void 0;\n      var isDate = false;\n      switch (unitName) {\n        case 'year':\n          interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365));\n          getterName = fullYearGetterName(isUTC);\n          setterName = fullYearSetterName(isUTC);\n          break;\n        case 'half-year':\n        case 'quarter':\n        case 'month':\n          interval = getMonthInterval(approxInterval);\n          getterName = monthGetterName(isUTC);\n          setterName = monthSetterName(isUTC);\n          break;\n        case 'week': // PENDING If week is added. Ignore day.\n        case 'half-week':\n        case 'day':\n          interval = getDateInterval(approxInterval, 31); // Use 32 days and let interval been 16\n          getterName = dateGetterName(isUTC);\n          setterName = dateSetterName(isUTC);\n          isDate = true;\n          break;\n        case 'half-day':\n        case 'quarter-day':\n        case 'hour':\n          interval = getHourInterval(approxInterval);\n          getterName = hoursGetterName(isUTC);\n          setterName = hoursSetterName(isUTC);\n          break;\n        case 'minute':\n          interval = getMinutesAndSecondsInterval(approxInterval, true);\n          getterName = minutesGetterName(isUTC);\n          setterName = minutesSetterName(isUTC);\n          break;\n        case 'second':\n          interval = getMinutesAndSecondsInterval(approxInterval, false);\n          getterName = secondsGetterName(isUTC);\n          setterName = secondsSetterName(isUTC);\n          break;\n        case 'millisecond':\n          interval = getMillisecondsInterval(approxInterval);\n          getterName = millisecondsGetterName(isUTC);\n          setterName = millisecondsSetterName(isUTC);\n          break;\n      }\n      // Notice: This expansion by `getFirstTimestampOfUnit` may cause too many ticks and\n      // iteration. e.g., when three levels of ticks is displayed, which can be caused by\n      // data zoom and axis breaks. Thus trim them here.\n      if (endTick >= extent[0] && startTick <= extent[1]) {\n        addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks);\n      }\n      if (unitName === 'year' && levelTicks.length > 1 && i === 0) {\n        // Add nearest years to the left extent.\n        levelTicks.unshift({\n          value: levelTicks[0].value - interval\n        });\n      }\n    }\n    for (var i = 0; i < newAddedTicks.length; i++) {\n      levelTicks.push(newAddedTicks[i]);\n    }\n  }\n  var levelsTicks = [];\n  var currentLevelTicks = [];\n  var tickCount = 0;\n  var lastLevelTickCount = 0;\n  for (var i = 0; i < unitNames.length; ++i) {\n    var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]);\n    if (!isPrimaryTimeUnit(unitNames[i])) {\n      // TODO\n      continue;\n    }\n    addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks);\n    var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null;\n    if (primaryTimeUnit !== nextPrimaryTimeUnit) {\n      if (currentLevelTicks.length) {\n        lastLevelTickCount = tickCount;\n        // Remove the duplicate so the tick count can be precisely.\n        currentLevelTicks.sort(function (a, b) {\n          return a.value - b.value;\n        });\n        var levelTicksRemoveDuplicated = [];\n        for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) {\n          var tickValue = currentLevelTicks[i_1].value;\n          if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) {\n            levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]);\n            if (tickValue >= extent[0] && tickValue <= extent[1]) {\n              tickCount++;\n            }\n          }\n        }\n        var targetTickNum = extentSpanWithBreaks / approxInterval;\n        // Added too much in this level and not too less in last level\n        if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) {\n          break;\n        }\n        // Only treat primary time unit as one level.\n        levelsTicks.push(levelTicksRemoveDuplicated);\n        if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) {\n          break;\n        }\n      }\n      // Reset if next unitName is primary\n      currentLevelTicks = [];\n    }\n  }\n  var levelsTicksInExtent = filter(map(levelsTicks, function (levelTicks) {\n    return filter(levelTicks, function (tick) {\n      return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd;\n    });\n  }), function (levelTicks) {\n    return levelTicks.length > 0;\n  });\n  var ticks = [];\n  var maxLevel = levelsTicksInExtent.length - 1;\n  for (var i = 0; i < levelsTicksInExtent.length; ++i) {\n    var levelTicks = levelsTicksInExtent[i];\n    for (var k = 0; k < levelTicks.length; ++k) {\n      var unit = getUnitFromValue(levelTicks[k].value, isUTC);\n      ticks.push({\n        value: levelTicks[k].value,\n        time: {\n          level: maxLevel - i,\n          upperTimeUnit: unit,\n          lowerTimeUnit: unit\n        }\n      });\n    }\n  }\n  ticks.sort(function (a, b) {\n    return a.value - b.value;\n  });\n  // Remove duplicates\n  var result = [];\n  for (var i = 0; i < ticks.length; ++i) {\n    if (i === 0 || ticks[i].value !== ticks[i - 1].value) {\n      result.push(ticks[i]);\n    }\n  }\n  return result;\n}\nScale.registerClass(TimeScale);\nexport default TimeScale;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Scale from './Scale.js';\nimport * as numberUtil from '../util/number.js';\n// Use some method of IntervalScale\nimport IntervalScale from './Interval.js';\nimport { getIntervalPrecision, logTransform } from './helper.js';\nimport { getScaleBreakHelper } from './break.js';\nvar fixRound = numberUtil.round;\nvar mathFloor = Math.floor;\nvar mathCeil = Math.ceil;\nvar mathPow = Math.pow;\nvar mathLog = Math.log;\nvar LogScale = /** @class */function (_super) {\n  __extends(LogScale, _super);\n  function LogScale() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'log';\n    _this.base = 10;\n    _this._originalScale = new IntervalScale();\n    return _this;\n  }\n  /**\n   * @param Whether expand the ticks to niced extent.\n   */\n  LogScale.prototype.getTicks = function (opt) {\n    opt = opt || {};\n    var extent = this._extent.slice();\n    var originalExtent = this._originalScale.getExtent();\n    var ticks = _super.prototype.getTicks.call(this, opt);\n    var base = this.base;\n    var originalBreaks = this._originalScale._innerGetBreaks();\n    var scaleBreakHelper = getScaleBreakHelper();\n    return zrUtil.map(ticks, function (tick) {\n      var val = tick.value;\n      var roundingCriterion = null;\n      var powVal = mathPow(base, val);\n      // Fix #4158\n      if (val === extent[0] && this._fixMin) {\n        roundingCriterion = originalExtent[0];\n      } else if (val === extent[1] && this._fixMax) {\n        roundingCriterion = originalExtent[1];\n      }\n      var vBreak;\n      if (scaleBreakHelper) {\n        var transformed = scaleBreakHelper.getTicksLogTransformBreak(tick, base, originalBreaks, fixRoundingError);\n        vBreak = transformed.vBreak;\n        if (roundingCriterion == null) {\n          roundingCriterion = transformed.brkRoundingCriterion;\n        }\n      }\n      if (roundingCriterion != null) {\n        powVal = fixRoundingError(powVal, roundingCriterion);\n      }\n      return {\n        value: powVal,\n        \"break\": vBreak\n      };\n    }, this);\n  };\n  LogScale.prototype._getNonTransBreaks = function () {\n    return this._originalScale._innerGetBreaks();\n  };\n  LogScale.prototype.setExtent = function (start, end) {\n    this._originalScale.setExtent(start, end);\n    var loggedExtent = logTransform(this.base, [start, end]);\n    _super.prototype.setExtent.call(this, loggedExtent[0], loggedExtent[1]);\n  };\n  /**\n   * @return {number} end\n   */\n  LogScale.prototype.getExtent = function () {\n    var base = this.base;\n    var extent = _super.prototype.getExtent.call(this);\n    extent[0] = mathPow(base, extent[0]);\n    extent[1] = mathPow(base, extent[1]);\n    // Fix #4158\n    var originalExtent = this._originalScale.getExtent();\n    this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));\n    this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));\n    return extent;\n  };\n  LogScale.prototype.unionExtentFromData = function (data, dim) {\n    this._originalScale.unionExtentFromData(data, dim);\n    var loggedOther = logTransform(this.base, data.getApproximateExtent(dim), true);\n    this._innerUnionExtent(loggedOther);\n  };\n  /**\n   * Update interval and extent of intervals for nice ticks\n   * @param approxTickNum default 10 Given approx tick number\n   */\n  LogScale.prototype.calcNiceTicks = function (approxTickNum) {\n    approxTickNum = approxTickNum || 10;\n    var extent = this._extent.slice();\n    var span = this._getExtentSpanWithBreaks();\n    if (!isFinite(span) || span <= 0) {\n      return;\n    }\n    var interval = numberUtil.quantity(span);\n    var err = approxTickNum / span * interval;\n    // Filter ticks to get closer to the desired count.\n    if (err <= 0.5) {\n      interval *= 10;\n    }\n    // Interval should be integer\n    while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {\n      interval *= 10;\n    }\n    var niceExtent = [fixRound(mathCeil(extent[0] / interval) * interval), fixRound(mathFloor(extent[1] / interval) * interval)];\n    this._interval = interval;\n    this._intervalPrecision = getIntervalPrecision(interval);\n    this._niceExtent = niceExtent;\n  };\n  LogScale.prototype.calcNiceExtent = function (opt) {\n    _super.prototype.calcNiceExtent.call(this, opt);\n    this._fixMin = opt.fixMin;\n    this._fixMax = opt.fixMax;\n  };\n  LogScale.prototype.contain = function (val) {\n    val = mathLog(val) / mathLog(this.base);\n    return _super.prototype.contain.call(this, val);\n  };\n  LogScale.prototype.normalize = function (val) {\n    val = mathLog(val) / mathLog(this.base);\n    return _super.prototype.normalize.call(this, val);\n  };\n  LogScale.prototype.scale = function (val) {\n    val = _super.prototype.scale.call(this, val);\n    return mathPow(this.base, val);\n  };\n  LogScale.prototype.setBreaksFromOption = function (breakOptionList) {\n    var scaleBreakHelper = getScaleBreakHelper();\n    if (!scaleBreakHelper) {\n      return;\n    }\n    var _a = scaleBreakHelper.logarithmicParseBreaksFromOption(breakOptionList, this.base, zrUtil.bind(this.parse, this)),\n      parsedOriginal = _a.parsedOriginal,\n      parsedLogged = _a.parsedLogged;\n    this._originalScale._innerSetBreak(parsedOriginal);\n    this._innerSetBreak(parsedLogged);\n  };\n  LogScale.type = 'log';\n  return LogScale;\n}(IntervalScale);\nfunction fixRoundingError(val, originalVal) {\n  return fixRound(val, numberUtil.getPrecision(originalVal));\n}\nScale.registerClass(LogScale);\nexport default LogScale;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { assert, isArray, eqNaN, isFunction } from 'zrender/lib/core/util.js';\nimport { parsePercent } from 'zrender/lib/contain/text.js';\nvar ScaleRawExtentInfo = /** @class */function () {\n  function ScaleRawExtentInfo(scale, model,\n  // Usually: data extent from all series on this axis.\n  originalExtent) {\n    this._prepareParams(scale, model, originalExtent);\n  }\n  /**\n   * Parameters depending on outside (like model, user callback)\n   * are prepared and fixed here.\n   */\n  ScaleRawExtentInfo.prototype._prepareParams = function (scale, model,\n  // Usually: data extent from all series on this axis.\n  dataExtent) {\n    if (dataExtent[1] < dataExtent[0]) {\n      dataExtent = [NaN, NaN];\n    }\n    this._dataMin = dataExtent[0];\n    this._dataMax = dataExtent[1];\n    var isOrdinal = this._isOrdinal = scale.type === 'ordinal';\n    this._needCrossZero = scale.type === 'interval' && model.getNeedCrossZero && model.getNeedCrossZero();\n    var axisMinValue = model.get('min', true);\n    if (axisMinValue == null) {\n      axisMinValue = model.get('startValue', true);\n    }\n    var modelMinRaw = this._modelMinRaw = axisMinValue;\n    if (isFunction(modelMinRaw)) {\n      // This callback always provides users the full data extent (before data is filtered).\n      this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw({\n        min: dataExtent[0],\n        max: dataExtent[1]\n      }));\n    } else if (modelMinRaw !== 'dataMin') {\n      this._modelMinNum = parseAxisModelMinMax(scale, modelMinRaw);\n    }\n    var modelMaxRaw = this._modelMaxRaw = model.get('max', true);\n    if (isFunction(modelMaxRaw)) {\n      // This callback always provides users the full data extent (before data is filtered).\n      this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw({\n        min: dataExtent[0],\n        max: dataExtent[1]\n      }));\n    } else if (modelMaxRaw !== 'dataMax') {\n      this._modelMaxNum = parseAxisModelMinMax(scale, modelMaxRaw);\n    }\n    if (isOrdinal) {\n      // FIXME: there is a flaw here: if there is no \"block\" data processor like `dataZoom`,\n      // and progressive rendering is using, here the category result might just only contain\n      // the processed chunk rather than the entire result.\n      this._axisDataLen = model.getCategories().length;\n    } else {\n      var boundaryGap = model.get('boundaryGap');\n      var boundaryGapArr = isArray(boundaryGap) ? boundaryGap : [boundaryGap || 0, boundaryGap || 0];\n      if (typeof boundaryGapArr[0] === 'boolean' || typeof boundaryGapArr[1] === 'boolean') {\n        if (process.env.NODE_ENV !== 'production') {\n          console.warn('Boolean type for boundaryGap is only ' + 'allowed for ordinal axis. Please use string in ' + 'percentage instead, e.g., \"20%\". Currently, ' + 'boundaryGap is set to be 0.');\n        }\n        this._boundaryGapInner = [0, 0];\n      } else {\n        this._boundaryGapInner = [parsePercent(boundaryGapArr[0], 1), parsePercent(boundaryGapArr[1], 1)];\n      }\n    }\n  };\n  /**\n   * Calculate extent by prepared parameters.\n   * This method has no external dependency and can be called duplicatedly,\n   * getting the same result.\n   * If parameters changed, should call this method to recalcuate.\n   */\n  ScaleRawExtentInfo.prototype.calculate = function () {\n    // Notice: When min/max is not set (that is, when there are null/undefined,\n    // which is the most common case), these cases should be ensured:\n    // (1) For 'ordinal', show all axis.data.\n    // (2) For others:\n    //      + `boundaryGap` is applied (if min/max set, boundaryGap is\n    //      disabled).\n    //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should\n    //      be the result that originalExtent enlarged by boundaryGap.\n    // (3) If no data, it should be ensured that `scale.setBlank` is set.\n    var isOrdinal = this._isOrdinal;\n    var dataMin = this._dataMin;\n    var dataMax = this._dataMax;\n    var axisDataLen = this._axisDataLen;\n    var boundaryGapInner = this._boundaryGapInner;\n    var span = !isOrdinal ? dataMax - dataMin || Math.abs(dataMin) : null;\n    // Currently if a `'value'` axis model min is specified as 'dataMin'/'dataMax',\n    // `boundaryGap` will not be used. It's the different from specifying as `null`/`undefined`.\n    var min = this._modelMinRaw === 'dataMin' ? dataMin : this._modelMinNum;\n    var max = this._modelMaxRaw === 'dataMax' ? dataMax : this._modelMaxNum;\n    // If `_modelMinNum`/`_modelMaxNum` is `null`/`undefined`, should not be fixed.\n    var minFixed = min != null;\n    var maxFixed = max != null;\n    if (min == null) {\n      min = isOrdinal ? axisDataLen ? 0 : NaN : dataMin - boundaryGapInner[0] * span;\n    }\n    if (max == null) {\n      max = isOrdinal ? axisDataLen ? axisDataLen - 1 : NaN : dataMax + boundaryGapInner[1] * span;\n    }\n    (min == null || !isFinite(min)) && (min = NaN);\n    (max == null || !isFinite(max)) && (max = NaN);\n    var isBlank = eqNaN(min) || eqNaN(max) || isOrdinal && !axisDataLen;\n    // If data extent modified, need to recalculated to ensure cross zero.\n    if (this._needCrossZero) {\n      // Axis is over zero and min is not set\n      if (min > 0 && max > 0 && !minFixed) {\n        min = 0;\n        // minFixed = true;\n      }\n      // Axis is under zero and max is not set\n      if (min < 0 && max < 0 && !maxFixed) {\n        max = 0;\n        // maxFixed = true;\n      }\n      // PENDING:\n      // When `needCrossZero` and all data is positive/negative, should it be ensured\n      // that the results processed by boundaryGap are positive/negative?\n      // If so, here `minFixed`/`maxFixed` need to be set.\n    }\n    var determinedMin = this._determinedMin;\n    var determinedMax = this._determinedMax;\n    if (determinedMin != null) {\n      min = determinedMin;\n      minFixed = true;\n    }\n    if (determinedMax != null) {\n      max = determinedMax;\n      maxFixed = true;\n    }\n    // Ensure min/max be finite number or NaN here. (not to be null/undefined)\n    // `NaN` means min/max axis is blank.\n    return {\n      min: min,\n      max: max,\n      minFixed: minFixed,\n      maxFixed: maxFixed,\n      isBlank: isBlank\n    };\n  };\n  ScaleRawExtentInfo.prototype.modifyDataMinMax = function (minMaxName, val) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(!this.frozen);\n    }\n    this[DATA_MIN_MAX_ATTR[minMaxName]] = val;\n  };\n  ScaleRawExtentInfo.prototype.setDeterminedMinMax = function (minMaxName, val) {\n    var attr = DETERMINED_MIN_MAX_ATTR[minMaxName];\n    if (process.env.NODE_ENV !== 'production') {\n      assert(!this.frozen\n      // Earse them usually means logic flaw.\n      && this[attr] == null);\n    }\n    this[attr] = val;\n  };\n  ScaleRawExtentInfo.prototype.freeze = function () {\n    // @ts-ignore\n    this.frozen = true;\n  };\n  return ScaleRawExtentInfo;\n}();\nexport { ScaleRawExtentInfo };\nvar DETERMINED_MIN_MAX_ATTR = {\n  min: '_determinedMin',\n  max: '_determinedMax'\n};\nvar DATA_MIN_MAX_ATTR = {\n  min: '_dataMin',\n  max: '_dataMax'\n};\n/**\n * Get scale min max and related info only depends on model settings.\n * This method can be called after coordinate system created.\n * For example, in data processing stage.\n *\n * Scale extent info probably be required multiple times during a workflow.\n * For example:\n * (1) `dataZoom` depends it to get the axis extent in \"100%\" state.\n * (2) `processor/extentCalculator` depends it to make sure whether axis extent is specified.\n * (3) `coordSys.update` use it to finally decide the scale extent.\n * But the callback of `min`/`max` should not be called multiple times.\n * The code below should not be implemented repeatedly either.\n * So we cache the result in the scale instance, which will be recreated at the beginning\n * of the workflow (because `scale` instance will be recreated each round of the workflow).\n */\nexport function ensureScaleRawExtentInfo(scale, model,\n// Usually: data extent from all series on this axis.\noriginalExtent) {\n  // Do not permit to recreate.\n  var rawExtentInfo = scale.rawExtentInfo;\n  if (rawExtentInfo) {\n    return rawExtentInfo;\n  }\n  rawExtentInfo = new ScaleRawExtentInfo(scale, model, originalExtent);\n  // @ts-ignore\n  scale.rawExtentInfo = rawExtentInfo;\n  return rawExtentInfo;\n}\nexport function parseAxisModelMinMax(scale, minMax) {\n  return minMax == null ? null : eqNaN(minMax) ? NaN : scale.parse(minMax);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport OrdinalScale from '../scale/Ordinal.js';\nimport IntervalScale from '../scale/Interval.js';\nimport Scale from '../scale/Scale.js';\nimport { prepareLayoutBarSeries, makeColumnLayout, retrieveColumnLayout } from '../layout/barGrid.js';\nimport TimeScale from '../scale/Time.js';\nimport LogScale from '../scale/Log.js';\nimport { getStackedDimension } from '../data/helper/dataStackHelper.js';\nimport { ensureScaleRawExtentInfo } from './scaleRawExtentInfo.js';\nimport { parseTimeAxisLabelFormatter } from '../util/time.js';\nimport { getScaleBreakHelper } from '../scale/break.js';\nimport { error } from '../util/log.js';\n/**\n * Get axis scale extent before niced.\n * Item of returned array can only be number (including Infinity and NaN).\n *\n * Caution:\n * Precondition of calling this method:\n * The scale extent has been initialized using series data extent via\n * `scale.setExtent` or `scale.unionExtentFromData`;\n */\nexport function getScaleExtent(scale, model) {\n  var scaleType = scale.type;\n  var rawExtentResult = ensureScaleRawExtentInfo(scale, model, scale.getExtent()).calculate();\n  scale.setBlank(rawExtentResult.isBlank);\n  var min = rawExtentResult.min;\n  var max = rawExtentResult.max;\n  // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis\n  // is base axis\n  // FIXME\n  // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly.\n  // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent?\n  //     Should not depend on series type `bar`?\n  // (3) Fix that might overlap when using dataZoom.\n  // (4) Consider other chart types using `barGrid`?\n  // See #6728, #4862, `test/bar-overflow-time-plot.html`\n  var ecModel = model.ecModel;\n  if (ecModel && scaleType === 'time' /* || scaleType === 'interval' */) {\n    var barSeriesModels = prepareLayoutBarSeries('bar', ecModel);\n    var isBaseAxisAndHasBarSeries_1 = false;\n    zrUtil.each(barSeriesModels, function (seriesModel) {\n      isBaseAxisAndHasBarSeries_1 = isBaseAxisAndHasBarSeries_1 || seriesModel.getBaseAxis() === model.axis;\n    });\n    if (isBaseAxisAndHasBarSeries_1) {\n      // Calculate placement of bars on axis. TODO should be decoupled\n      // with barLayout\n      var barWidthAndOffset = makeColumnLayout(barSeriesModels);\n      // Adjust axis min and max to account for overflow\n      var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset);\n      min = adjustedScale.min;\n      max = adjustedScale.max;\n    }\n  }\n  return {\n    extent: [min, max],\n    // \"fix\" means \"fixed\", the value should not be\n    // changed in the subsequent steps.\n    fixMin: rawExtentResult.minFixed,\n    fixMax: rawExtentResult.maxFixed\n  };\n}\nfunction adjustScaleForOverflow(min, max, model,\n// Only support cartesian coord yet.\nbarWidthAndOffset) {\n  // Get Axis Length\n  var axisExtent = model.axis.getExtent();\n  var axisLength = Math.abs(axisExtent[1] - axisExtent[0]);\n  // Get bars on current base axis and calculate min and max overflow\n  var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis);\n  if (barsOnCurrentAxis === undefined) {\n    return {\n      min: min,\n      max: max\n    };\n  }\n  var minOverflow = Infinity;\n  zrUtil.each(barsOnCurrentAxis, function (item) {\n    minOverflow = Math.min(item.offset, minOverflow);\n  });\n  var maxOverflow = -Infinity;\n  zrUtil.each(barsOnCurrentAxis, function (item) {\n    maxOverflow = Math.max(item.offset + item.width, maxOverflow);\n  });\n  minOverflow = Math.abs(minOverflow);\n  maxOverflow = Math.abs(maxOverflow);\n  var totalOverFlow = minOverflow + maxOverflow;\n  // Calculate required buffer based on old range and overflow\n  var oldRange = max - min;\n  var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength;\n  var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange;\n  max += overflowBuffer * (maxOverflow / totalOverFlow);\n  min -= overflowBuffer * (minOverflow / totalOverFlow);\n  return {\n    min: min,\n    max: max\n  };\n}\n// Precondition of calling this method:\n// The scale extent has been initialized using series data extent via\n// `scale.setExtent` or `scale.unionExtentFromData`;\nexport function niceScaleExtent(scale, inModel) {\n  var model = inModel;\n  var extentInfo = getScaleExtent(scale, model);\n  var extent = extentInfo.extent;\n  var splitNumber = model.get('splitNumber');\n  if (scale instanceof LogScale) {\n    scale.base = model.get('logBase');\n  }\n  var scaleType = scale.type;\n  var interval = model.get('interval');\n  var isIntervalOrTime = scaleType === 'interval' || scaleType === 'time';\n  scale.setBreaksFromOption(retrieveAxisBreaksOption(model));\n  scale.setExtent(extent[0], extent[1]);\n  scale.calcNiceExtent({\n    splitNumber: splitNumber,\n    fixMin: extentInfo.fixMin,\n    fixMax: extentInfo.fixMax,\n    minInterval: isIntervalOrTime ? model.get('minInterval') : null,\n    maxInterval: isIntervalOrTime ? model.get('maxInterval') : null\n  });\n  // If some one specified the min, max. And the default calculated interval\n  // is not good enough. He can specify the interval. It is often appeared\n  // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard\n  // to be 60.\n  // FIXME\n  if (interval != null) {\n    scale.setInterval && scale.setInterval(interval);\n  }\n}\n/**\n * @param axisType Default retrieve from model.type\n */\nexport function createScaleByModel(model, axisType) {\n  axisType = axisType || model.get('type');\n  if (axisType) {\n    switch (axisType) {\n      // Buildin scale\n      case 'category':\n        return new OrdinalScale({\n          ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(),\n          extent: [Infinity, -Infinity]\n        });\n      case 'time':\n        return new TimeScale({\n          locale: model.ecModel.getLocaleModel(),\n          useUTC: model.ecModel.get('useUTC')\n        });\n      default:\n        // case 'value'/'interval', 'log', or others.\n        return new (Scale.getClass(axisType) || IntervalScale)();\n    }\n  }\n}\n/**\n * Check if the axis cross 0\n */\nexport function ifAxisCrossZero(axis) {\n  var dataExtent = axis.scale.getExtent();\n  var min = dataExtent[0];\n  var max = dataExtent[1];\n  return !(min > 0 && max > 0 || min < 0 && max < 0);\n}\n/**\n * @param axis\n * @return Label formatter function.\n *         param: {number} tickValue,\n *         param: {number} idx, the index in all ticks.\n *                         If category axis, this param is not required.\n *         return: {string} label string.\n */\nexport function makeLabelFormatter(axis) {\n  var labelFormatter = axis.getLabelModel().get('formatter');\n  if (axis.type === 'time') {\n    var parsed_1 = parseTimeAxisLabelFormatter(labelFormatter);\n    return function (tick, idx) {\n      return axis.scale.getFormattedLabel(tick, idx, parsed_1);\n    };\n  } else if (zrUtil.isString(labelFormatter)) {\n    return function (tick) {\n      // For category axis, get raw value; for numeric axis,\n      // get formatted label like '1,333,444'.\n      var label = axis.scale.getLabel(tick);\n      var text = labelFormatter.replace('{value}', label != null ? label : '');\n      return text;\n    };\n  } else if (zrUtil.isFunction(labelFormatter)) {\n    if (axis.type === 'category') {\n      return function (tick, idx) {\n        // The original intention of `idx` is \"the index of the tick in all ticks\".\n        // But the previous implementation of category axis do not consider the\n        // `axisLabel.interval`, which cause that, for example, the `interval` is\n        // `1`, then the ticks \"name5\", \"name7\", \"name9\" are displayed, where the\n        // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep\n        // the definition here for back compatibility.\n        return labelFormatter(getAxisRawValue(axis, tick), tick.value - axis.scale.getExtent()[0], null // Using `null` just for backward compat.\n        );\n      };\n    }\n    var scaleBreakHelper_1 = getScaleBreakHelper();\n    return function (tick, idx) {\n      // Using `null` just for backward compat. It's been found that in the `test/axis-customTicks.html`,\n      // there is a formatter `function (value, index, revers = true) { ... }`. Although the third param\n      // `revers` is incorrect and always `null`, changing it might introduce a breaking change.\n      var extra = null;\n      if (scaleBreakHelper_1) {\n        extra = scaleBreakHelper_1.makeAxisLabelFormatterParamBreak(extra, tick[\"break\"]);\n      }\n      return labelFormatter(getAxisRawValue(axis, tick), idx, extra);\n    };\n  } else {\n    return function (tick) {\n      return axis.scale.getLabel(tick);\n    };\n  }\n}\nexport function getAxisRawValue(axis, tick) {\n  // In category axis with data zoom, tick is not the original\n  // index of axis.data. So tick should not be exposed to user\n  // in category axis.\n  return axis.type === 'category' ? axis.scale.getLabel(tick) : tick.value;\n}\n/**\n * @param model axisLabelModel or axisTickModel\n * @return {number|String} Can be null|'auto'|number|function\n */\nexport function getOptionCategoryInterval(model) {\n  var interval = model.get('interval');\n  return interval == null ? 'auto' : interval;\n}\n/**\n * Set `categoryInterval` as 0 implicitly indicates that\n * show all labels regardless of overlap.\n * @param {Object} axis axisModel.axis\n */\nexport function shouldShowAllLabels(axis) {\n  return axis.type === 'category' && getOptionCategoryInterval(axis.getLabelModel()) === 0;\n}\nexport function getDataDimensionsOnAxis(data, axisDim) {\n  // Remove duplicated dat dimensions caused by `getStackedDimension`.\n  var dataDimMap = {};\n  // Currently `mapDimensionsAll` will contain stack result dimension ('__\\0ecstackresult').\n  // PENDING: is it reasonable? Do we need to remove the original dim from \"coord dim\" since\n  // there has been stacked result dim?\n  zrUtil.each(data.mapDimensionsAll(axisDim), function (dataDim) {\n    // For example, the extent of the original dimension\n    // is [0.1, 0.5], the extent of the `stackResultDimension`\n    // is [7, 9], the final extent should NOT include [0.1, 0.5],\n    // because there is no graphic corresponding to [0.1, 0.5].\n    // See the case in `test/area-stack.html` `main1`, where area line\n    // stack needs `yAxis` not start from 0.\n    dataDimMap[getStackedDimension(data, dataDim)] = true;\n  });\n  return zrUtil.keys(dataDimMap);\n}\nexport function unionAxisExtentFromData(dataExtent, data, axisDim) {\n  if (data) {\n    zrUtil.each(getDataDimensionsOnAxis(data, axisDim), function (dim) {\n      var seriesExtent = data.getApproximateExtent(dim);\n      seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]);\n      seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]);\n    });\n  }\n}\nexport function isNameLocationCenter(nameLocation) {\n  return nameLocation === 'middle' || nameLocation === 'center';\n}\nexport function shouldAxisShow(axisModel) {\n  return axisModel.getShallow('show');\n}\nexport function retrieveAxisBreaksOption(model) {\n  var option = model.get('breaks', true);\n  if (option != null) {\n    if (!getScaleBreakHelper()) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('Must `import {AxisBreak} from \"echarts/features.js\"; use(AxisBreak);` first if using breaks option.');\n      }\n      return undefined;\n    }\n    if (!isSupportAxisBreak(model.axis)) {\n      if (process.env.NODE_ENV !== 'production') {\n        error(\"Axis '\" + model.axis.dim + \"'-'\" + model.axis.type + \"' does not support break.\");\n      }\n      return undefined;\n    }\n    return option;\n  }\n}\nfunction isSupportAxisBreak(axis) {\n  // The polar radius axis can also support break feasibly. Do not do it until the requirements are met.\n  return (axis.dim === 'x' || axis.dim === 'y' || axis.dim === 'z' || axis.dim === 'single') && axis.type !== 'category';\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nvar AxisModelCommonMixin = /** @class */function () {\n  function AxisModelCommonMixin() {}\n  AxisModelCommonMixin.prototype.getNeedCrossZero = function () {\n    var option = this.option;\n    return !option.scale;\n  };\n  /**\n   * Should be implemented by each axis model if necessary.\n   * @return coordinate system model\n   */\n  AxisModelCommonMixin.prototype.getCoordSysModel = function () {\n    return;\n  };\n  return AxisModelCommonMixin;\n}();\nexport { AxisModelCommonMixin };", "import windingLine from './windingLine.js';\nvar EPSILON = 1e-8;\nfunction isAroundEqual(a, b) {\n    return Math.abs(a - b) < EPSILON;\n}\nexport function contain(points, x, y) {\n    var w = 0;\n    var p = points[0];\n    if (!p) {\n        return false;\n    }\n    for (var i = 1; i < points.length; i++) {\n        var p2 = points[i];\n        w += windingLine(p[0], p[1], p2[0], p2[1], x, y);\n        p = p2;\n    }\n    var p0 = points[0];\n    if (!isAroundEqual(p[0], p0[0]) || !isAroundEqual(p[1], p0[1])) {\n        w += windingLine(p[0], p[1], p0[0], p0[1], x, y);\n    }\n    return w !== 0;\n}\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport * as polygonContain from 'zrender/lib/contain/polygon.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport { each } from 'zrender/lib/core/util.js';\nvar TMP_TRANSFORM = [];\nfunction transformPoints(points, transform) {\n  for (var p = 0; p < points.length; p++) {\n    vec2.applyTransform(points[p], points[p], transform);\n  }\n}\nfunction updateBBoxFromPoints(points, min, max, projection) {\n  for (var i = 0; i < points.length; i++) {\n    var p = points[i];\n    if (projection) {\n      // projection may return null point.\n      p = projection.project(p);\n    }\n    if (p && isFinite(p[0]) && isFinite(p[1])) {\n      vec2.min(min, min, p);\n      vec2.max(max, max, p);\n    }\n  }\n}\nfunction centroid(points) {\n  var signedArea = 0;\n  var cx = 0;\n  var cy = 0;\n  var len = points.length;\n  var x0 = points[len - 1][0];\n  var y0 = points[len - 1][1];\n  // Polygon should been closed.\n  for (var i = 0; i < len; i++) {\n    var x1 = points[i][0];\n    var y1 = points[i][1];\n    var a = x0 * y1 - x1 * y0;\n    signedArea += a;\n    cx += (x0 + x1) * a;\n    cy += (y0 + y1) * a;\n    x0 = x1;\n    y0 = y1;\n  }\n  return signedArea ? [cx / signedArea / 3, cy / signedArea / 3, signedArea] : [points[0][0] || 0, points[0][1] || 0];\n}\nvar Region = /** @class */function () {\n  function Region(name) {\n    this.name = name;\n  }\n  Region.prototype.setCenter = function (center) {\n    this._center = center;\n  };\n  /**\n   * Get center point in data unit. That is,\n   * for GeoJSONRegion, the unit is lat/lng,\n   * for GeoSVGRegion, the unit is SVG local coord.\n   */\n  Region.prototype.getCenter = function () {\n    var center = this._center;\n    if (!center) {\n      // In most cases there are no need to calculate this center.\n      // So calculate only when called.\n      center = this._center = this.calcCenter();\n    }\n    return center;\n  };\n  return Region;\n}();\nexport { Region };\nvar GeoJSONPolygonGeometry = /** @class */function () {\n  function GeoJSONPolygonGeometry(exterior, interiors) {\n    this.type = 'polygon';\n    this.exterior = exterior;\n    this.interiors = interiors;\n  }\n  return GeoJSONPolygonGeometry;\n}();\nexport { GeoJSONPolygonGeometry };\nvar GeoJSONLineStringGeometry = /** @class */function () {\n  function GeoJSONLineStringGeometry(points) {\n    this.type = 'linestring';\n    this.points = points;\n  }\n  return GeoJSONLineStringGeometry;\n}();\nexport { GeoJSONLineStringGeometry };\nvar GeoJSONRegion = /** @class */function (_super) {\n  __extends(GeoJSONRegion, _super);\n  function GeoJSONRegion(name, geometries, cp) {\n    var _this = _super.call(this, name) || this;\n    _this.type = 'geoJSON';\n    _this.geometries = geometries;\n    _this._center = cp && [cp[0], cp[1]];\n    return _this;\n  }\n  GeoJSONRegion.prototype.calcCenter = function () {\n    var geometries = this.geometries;\n    var largestGeo;\n    var largestGeoSize = 0;\n    for (var i = 0; i < geometries.length; i++) {\n      var geo = geometries[i];\n      var exterior = geo.exterior;\n      // Simple trick to use points count instead of polygon area as region size.\n      // Ignore linestring\n      var size = exterior && exterior.length;\n      if (size > largestGeoSize) {\n        largestGeo = geo;\n        largestGeoSize = size;\n      }\n    }\n    if (largestGeo) {\n      return centroid(largestGeo.exterior);\n    }\n    // from bounding rect by default.\n    var rect = this.getBoundingRect();\n    return [rect.x + rect.width / 2, rect.y + rect.height / 2];\n  };\n  GeoJSONRegion.prototype.getBoundingRect = function (projection) {\n    var rect = this._rect;\n    // Always recalculate if using projection.\n    if (rect && !projection) {\n      return rect;\n    }\n    var min = [Infinity, Infinity];\n    var max = [-Infinity, -Infinity];\n    var geometries = this.geometries;\n    each(geometries, function (geo) {\n      if (geo.type === 'polygon') {\n        // Doesn't consider hole\n        updateBBoxFromPoints(geo.exterior, min, max, projection);\n      } else {\n        each(geo.points, function (points) {\n          updateBBoxFromPoints(points, min, max, projection);\n        });\n      }\n    });\n    // Normalie invalid bounding.\n    if (!(isFinite(min[0]) && isFinite(min[1]) && isFinite(max[0]) && isFinite(max[1]))) {\n      min[0] = min[1] = max[0] = max[1] = 0;\n    }\n    rect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n    if (!projection) {\n      this._rect = rect;\n    }\n    return rect;\n  };\n  GeoJSONRegion.prototype.contain = function (coord) {\n    var rect = this.getBoundingRect();\n    var geometries = this.geometries;\n    if (!rect.contain(coord[0], coord[1])) {\n      return false;\n    }\n    loopGeo: for (var i = 0, len = geometries.length; i < len; i++) {\n      var geo = geometries[i];\n      // Only support polygon.\n      if (geo.type !== 'polygon') {\n        continue;\n      }\n      var exterior = geo.exterior;\n      var interiors = geo.interiors;\n      if (polygonContain.contain(exterior, coord[0], coord[1])) {\n        // Not in the region if point is in the hole.\n        for (var k = 0; k < (interiors ? interiors.length : 0); k++) {\n          if (polygonContain.contain(interiors[k], coord[0], coord[1])) {\n            continue loopGeo;\n          }\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n  /**\n   * Transform the raw coords to target bounding.\n   * @param x\n   * @param y\n   * @param width\n   * @param height\n   */\n  GeoJSONRegion.prototype.transformTo = function (x, y, width, height) {\n    var rect = this.getBoundingRect();\n    var aspect = rect.width / rect.height;\n    if (!width) {\n      width = aspect * height;\n    } else if (!height) {\n      height = width / aspect;\n    }\n    var target = new BoundingRect(x, y, width, height);\n    var transform = rect.calculateTransform(target);\n    var geometries = this.geometries;\n    for (var i = 0; i < geometries.length; i++) {\n      var geo = geometries[i];\n      if (geo.type === 'polygon') {\n        transformPoints(geo.exterior, transform);\n        each(geo.interiors, function (interior) {\n          transformPoints(interior, transform);\n        });\n      } else {\n        each(geo.points, function (points) {\n          transformPoints(points, transform);\n        });\n      }\n    }\n    rect = this._rect;\n    rect.copy(target);\n    // Update center\n    this._center = [rect.x + rect.width / 2, rect.y + rect.height / 2];\n  };\n  GeoJSONRegion.prototype.cloneShallow = function (name) {\n    name == null && (name = this.name);\n    var newRegion = new GeoJSONRegion(name, this.geometries, this._center);\n    newRegion._rect = this._rect;\n    newRegion.transformTo = null; // Simply avoid to be called.\n    return newRegion;\n  };\n  return GeoJSONRegion;\n}(Region);\nexport { GeoJSONRegion };\nvar GeoSVGRegion = /** @class */function (_super) {\n  __extends(GeoSVGRegion, _super);\n  function GeoSVGRegion(name, elOnlyForCalculate) {\n    var _this = _super.call(this, name) || this;\n    _this.type = 'geoSVG';\n    _this._elOnlyForCalculate = elOnlyForCalculate;\n    return _this;\n  }\n  GeoSVGRegion.prototype.calcCenter = function () {\n    var el = this._elOnlyForCalculate;\n    var rect = el.getBoundingRect();\n    var center = [rect.x + rect.width / 2, rect.y + rect.height / 2];\n    var mat = matrix.identity(TMP_TRANSFORM);\n    var target = el;\n    while (target && !target.isGeoSVGGraphicRoot) {\n      matrix.mul(mat, target.getLocalTransform(), mat);\n      target = target.parent;\n    }\n    matrix.invert(mat, mat);\n    vec2.applyTransform(center, center, mat);\n    return center;\n  };\n  return GeoSVGRegion;\n}(Region);\nexport { GeoSVGRegion };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Parse and decode geo json\n */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { GeoJSONLineStringGeometry, GeoJSONPolygonGeometry, GeoJSONRegion } from './Region.js';\nfunction decode(json) {\n  if (!json.UTF8Encoding) {\n    return json;\n  }\n  var jsonCompressed = json;\n  var encodeScale = jsonCompressed.UTF8Scale;\n  if (encodeScale == null) {\n    encodeScale = 1024;\n  }\n  var features = jsonCompressed.features;\n  zrUtil.each(features, function (feature) {\n    var geometry = feature.geometry;\n    var encodeOffsets = geometry.encodeOffsets;\n    var coordinates = geometry.coordinates;\n    // Geometry may be appeded manually in the script after json loaded.\n    // In this case this geometry is usually not encoded.\n    if (!encodeOffsets) {\n      return;\n    }\n    switch (geometry.type) {\n      case 'LineString':\n        geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale);\n        break;\n      case 'Polygon':\n        decodeRings(coordinates, encodeOffsets, encodeScale);\n        break;\n      case 'MultiLineString':\n        decodeRings(coordinates, encodeOffsets, encodeScale);\n        break;\n      case 'MultiPolygon':\n        zrUtil.each(coordinates, function (rings, idx) {\n          return decodeRings(rings, encodeOffsets[idx], encodeScale);\n        });\n    }\n  });\n  // Has been decoded\n  jsonCompressed.UTF8Encoding = false;\n  return jsonCompressed;\n}\nfunction decodeRings(rings, encodeOffsets, encodeScale) {\n  for (var c = 0; c < rings.length; c++) {\n    rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale);\n  }\n}\nfunction decodeRing(coordinate, encodeOffsets, encodeScale) {\n  var result = [];\n  var prevX = encodeOffsets[0];\n  var prevY = encodeOffsets[1];\n  for (var i = 0; i < coordinate.length; i += 2) {\n    var x = coordinate.charCodeAt(i) - 64;\n    var y = coordinate.charCodeAt(i + 1) - 64;\n    // ZigZag decoding\n    x = x >> 1 ^ -(x & 1);\n    y = y >> 1 ^ -(y & 1);\n    // Delta deocding\n    x += prevX;\n    y += prevY;\n    prevX = x;\n    prevY = y;\n    // Dequantize\n    result.push([x / encodeScale, y / encodeScale]);\n  }\n  return result;\n}\nexport default function parseGeoJSON(geoJson, nameProperty) {\n  geoJson = decode(geoJson);\n  return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) {\n    // Output of mapshaper may have geometry null\n    return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0;\n  }), function (featureObj) {\n    var properties = featureObj.properties;\n    var geo = featureObj.geometry;\n    var geometries = [];\n    switch (geo.type) {\n      case 'Polygon':\n        var coordinates = geo.coordinates;\n        // According to the GeoJSON specification.\n        // First must be exterior, and the rest are all interior(holes).\n        geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1)));\n        break;\n      case 'MultiPolygon':\n        zrUtil.each(geo.coordinates, function (item) {\n          if (item[0]) {\n            geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1)));\n          }\n        });\n        break;\n      case 'LineString':\n        geometries.push(new GeoJSONLineStringGeometry([geo.coordinates]));\n        break;\n      case 'MultiLineString':\n        geometries.push(new GeoJSONLineStringGeometry(geo.coordinates));\n    }\n    var region = new GeoJSONRegion(properties[nameProperty || 'name'], geometries, properties.cp);\n    region.properties = properties;\n    return region;\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport { addCommas, toCamelCase, normalizeCssArray, encodeHTML, formatTpl, getTooltipMarker, formatTime, capitalFirst, truncateText, getTextRect } from '../../util/format.js';", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as textContain from 'zrender/lib/contain/text.js';\nimport { makeInner } from '../util/model.js';\nimport { makeLabelFormatter, getOptionCategoryInterval, shouldShowAllLabels } from './axisHelper.js';\nvar modelInner = makeInner();\nvar axisInner = makeInner();\nexport var AxisTickLabelComputingKind = {\n  estimate: 1,\n  determine: 2\n};\nexport function createAxisLabelsComputingContext(kind) {\n  return {\n    out: {\n      noPxChangeTryDetermine: []\n    },\n    kind: kind\n  };\n}\nfunction tickValuesToNumbers(axis, values) {\n  var nums = zrUtil.map(values, function (val) {\n    return axis.scale.parse(val);\n  });\n  if (axis.type === 'time' && nums.length > 0) {\n    // Time axis needs duplicate first/last tick (see TimeScale.getTicks())\n    // The first and last tick/label don't get drawn\n    nums.sort();\n    nums.unshift(nums[0]);\n    nums.push(nums[nums.length - 1]);\n  }\n  return nums;\n}\nexport function createAxisLabels(axis, ctx) {\n  var custom = axis.getLabelModel().get('customValues');\n  if (custom) {\n    var labelFormatter_1 = makeLabelFormatter(axis);\n    var extent_1 = axis.scale.getExtent();\n    var tickNumbers = tickValuesToNumbers(axis, custom);\n    var ticks = zrUtil.filter(tickNumbers, function (val) {\n      return val >= extent_1[0] && val <= extent_1[1];\n    });\n    return {\n      labels: zrUtil.map(ticks, function (numval) {\n        var tick = {\n          value: numval\n        };\n        return {\n          formattedLabel: labelFormatter_1(tick),\n          rawLabel: axis.scale.getLabel(tick),\n          tickValue: numval,\n          time: undefined,\n          \"break\": undefined\n        };\n      })\n    };\n  }\n  // Only ordinal scale support tick interval\n  return axis.type === 'category' ? makeCategoryLabels(axis, ctx) : makeRealNumberLabels(axis);\n}\n/**\n * @param tickModel For example, can be axisTick, splitLine, splitArea.\n */\nexport function createAxisTicks(axis, tickModel, opt) {\n  var custom = axis.getTickModel().get('customValues');\n  if (custom) {\n    var extent_2 = axis.scale.getExtent();\n    var tickNumbers = tickValuesToNumbers(axis, custom);\n    return {\n      ticks: zrUtil.filter(tickNumbers, function (val) {\n        return val >= extent_2[0] && val <= extent_2[1];\n      })\n    };\n  }\n  // Only ordinal scale support tick interval\n  return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : {\n    ticks: zrUtil.map(axis.scale.getTicks(opt), function (tick) {\n      return tick.value;\n    })\n  };\n}\nfunction makeCategoryLabels(axis, ctx) {\n  var labelModel = axis.getLabelModel();\n  var result = makeCategoryLabelsActually(axis, labelModel, ctx);\n  return !labelModel.get('show') || axis.scale.isBlank() ? {\n    labels: []\n  } : result;\n}\nfunction makeCategoryLabelsActually(axis, labelModel, ctx) {\n  var labelsCache = ensureCategoryLabelCache(axis);\n  var optionLabelInterval = getOptionCategoryInterval(labelModel);\n  var isEstimate = ctx.kind === AxisTickLabelComputingKind.estimate;\n  // In AxisTickLabelComputingKind.estimate, the result likely varies during a single\n  // pass of ec main process,due to the change of axisExtent, and will not be shared with\n  // splitLine. Therefore no cache is used.\n  if (!isEstimate) {\n    // PENDING: check necessary?\n    var result_1 = axisCacheGet(labelsCache, optionLabelInterval);\n    if (result_1) {\n      return result_1;\n    }\n  }\n  var labels;\n  var numericLabelInterval;\n  if (zrUtil.isFunction(optionLabelInterval)) {\n    labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval);\n  } else {\n    numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis, ctx) : optionLabelInterval;\n    labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval);\n  }\n  var result = {\n    labels: labels,\n    labelCategoryInterval: numericLabelInterval\n  };\n  if (!isEstimate) {\n    axisCacheSet(labelsCache, optionLabelInterval, result);\n  } else {\n    ctx.out.noPxChangeTryDetermine.push(function () {\n      axisCacheSet(labelsCache, optionLabelInterval, result);\n      return true;\n    });\n  }\n  return result;\n}\nfunction makeCategoryTicks(axis, tickModel) {\n  var ticksCache = ensureCategoryTickCache(axis);\n  var optionTickInterval = getOptionCategoryInterval(tickModel);\n  var result = axisCacheGet(ticksCache, optionTickInterval);\n  if (result) {\n    return result;\n  }\n  var ticks;\n  var tickCategoryInterval;\n  // Optimize for the case that large category data and no label displayed,\n  // we should not return all ticks.\n  if (!tickModel.get('show') || axis.scale.isBlank()) {\n    ticks = [];\n  }\n  if (zrUtil.isFunction(optionTickInterval)) {\n    ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true);\n  }\n  // Always use label interval by default despite label show. Consider this\n  // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows\n  // labels. `splitLine` and `axisTick` should be consistent in this case.\n  else if (optionTickInterval === 'auto') {\n    var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel(), createAxisLabelsComputingContext(AxisTickLabelComputingKind.determine));\n    tickCategoryInterval = labelsResult.labelCategoryInterval;\n    ticks = zrUtil.map(labelsResult.labels, function (labelItem) {\n      return labelItem.tickValue;\n    });\n  } else {\n    tickCategoryInterval = optionTickInterval;\n    ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true);\n  }\n  // Cache to avoid calling interval function repeatedly.\n  return axisCacheSet(ticksCache, optionTickInterval, {\n    ticks: ticks,\n    tickCategoryInterval: tickCategoryInterval\n  });\n}\nfunction makeRealNumberLabels(axis) {\n  var ticks = axis.scale.getTicks();\n  var labelFormatter = makeLabelFormatter(axis);\n  return {\n    labels: zrUtil.map(ticks, function (tick, idx) {\n      return {\n        formattedLabel: labelFormatter(tick, idx),\n        rawLabel: axis.scale.getLabel(tick),\n        tickValue: tick.value,\n        time: tick.time,\n        \"break\": tick[\"break\"]\n      };\n    })\n  };\n}\n// Large category data calculation is performance sensitive, and ticks and label probably will\n// be fetched multiple times (e.g. shared by splitLine and axisTick). So we cache the result.\n// axis is created each time during a ec process, so we do not need to clear cache.\nvar ensureCategoryTickCache = initAxisCacheMethod('axisTick');\nvar ensureCategoryLabelCache = initAxisCacheMethod('axisLabel');\n/**\n * PENDING: refactor to JS Map? Because key can be a function or more complicated object, and\n * cache size always is small, and currently no JS Map object key polyfill, we use a simple\n * array cache instead of plain object hash.\n */\nfunction initAxisCacheMethod(prop) {\n  return function ensureCache(axis) {\n    return axisInner(axis)[prop] || (axisInner(axis)[prop] = {\n      list: []\n    });\n  };\n}\nfunction axisCacheGet(cache, key) {\n  for (var i = 0; i < cache.list.length; i++) {\n    if (cache.list[i].key === key) {\n      return cache.list[i].value;\n    }\n  }\n}\nfunction axisCacheSet(cache, key, value) {\n  cache.list.push({\n    key: key,\n    value: value\n  });\n  return value;\n}\nfunction makeAutoCategoryInterval(axis, ctx) {\n  if (ctx.kind === AxisTickLabelComputingKind.estimate) {\n    // Currently axisTick is not involved in estimate kind, and the result likely varies during a\n    // single pass of ec main process, due to the change of axisExtent. Therefore no cache is used.\n    var result_2 = axis.calculateCategoryInterval(ctx);\n    ctx.out.noPxChangeTryDetermine.push(function () {\n      axisInner(axis).autoInterval = result_2;\n      return true;\n    });\n    return result_2;\n  }\n  // Both tick and label uses this result, cacah it to avoid recompute.\n  var result = axisInner(axis).autoInterval;\n  return result != null ? result : axisInner(axis).autoInterval = axis.calculateCategoryInterval(ctx);\n}\n/**\n * Calculate interval for category axis ticks and labels.\n * Use a stretegy to try to avoid overlapping.\n * To get precise result, at least one of `getRotate` and `isHorizontal`\n * should be implemented in axis.\n */\nexport function calculateCategoryInterval(axis, ctx) {\n  var kind = ctx.kind;\n  var params = fetchAutoCategoryIntervalCalculationParams(axis);\n  var labelFormatter = makeLabelFormatter(axis);\n  var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI;\n  var ordinalScale = axis.scale;\n  var ordinalExtent = ordinalScale.getExtent();\n  // Providing this method is for optimization:\n  // avoid generating a long array by `getTicks`\n  // in large category data case.\n  var tickCount = ordinalScale.count();\n  if (ordinalExtent[1] - ordinalExtent[0] < 1) {\n    return 0;\n  }\n  var step = 1;\n  // Simple optimization. Arbitrary value.\n  var maxCount = 40;\n  if (tickCount > maxCount) {\n    step = Math.max(1, Math.floor(tickCount / maxCount));\n  }\n  var tickValue = ordinalExtent[0];\n  var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);\n  var unitW = Math.abs(unitSpan * Math.cos(rotation));\n  var unitH = Math.abs(unitSpan * Math.sin(rotation));\n  var maxW = 0;\n  var maxH = 0;\n  // Caution: Performance sensitive for large category data.\n  // Consider dataZoom, we should make appropriate step to avoid O(n) loop.\n  for (; tickValue <= ordinalExtent[1]; tickValue += step) {\n    var width = 0;\n    var height = 0;\n    // Not precise, do not consider align and vertical align\n    // and each distance from axis line yet.\n    var rect = textContain.getBoundingRect(labelFormatter({\n      value: tickValue\n    }), params.font, 'center', 'top');\n    // Magic number\n    width = rect.width * 1.3;\n    height = rect.height * 1.3;\n    // Min size, void long loop.\n    maxW = Math.max(maxW, width, 7);\n    maxH = Math.max(maxH, height, 7);\n  }\n  var dw = maxW / unitW;\n  var dh = maxH / unitH;\n  // 0/0 is NaN, 1/0 is Infinity.\n  isNaN(dw) && (dw = Infinity);\n  isNaN(dh) && (dh = Infinity);\n  var interval = Math.max(0, Math.floor(Math.min(dw, dh)));\n  if (kind === AxisTickLabelComputingKind.estimate) {\n    // In estimate kind, the inteval likely varies, thus do not erase the cache.\n    ctx.out.noPxChangeTryDetermine.push(zrUtil.bind(calculateCategoryIntervalTryDetermine, null, axis, interval, tickCount));\n    return interval;\n  }\n  var lastInterval = calculateCategoryIntervalDealCache(axis, interval, tickCount);\n  return lastInterval != null ? lastInterval : interval;\n}\nfunction calculateCategoryIntervalTryDetermine(axis, interval, tickCount) {\n  return calculateCategoryIntervalDealCache(axis, interval, tickCount) == null;\n}\n// Return the lastInterval if need to use it, otherwise return NullUndefined and save cache.\nfunction calculateCategoryIntervalDealCache(axis, interval, tickCount) {\n  var cache = modelInner(axis.model);\n  var axisExtent = axis.getExtent();\n  var lastAutoInterval = cache.lastAutoInterval;\n  var lastTickCount = cache.lastTickCount;\n  // Use cache to keep interval stable while moving zoom window,\n  // otherwise the calculated interval might jitter when the zoom\n  // window size is close to the interval-changing size.\n  // For example, if all of the axis labels are `a, b, c, d, e, f, g`.\n  // The jitter will cause that sometimes the displayed labels are\n  // `a, d, g` (interval: 2) sometimes `a, c, e`(interval: 1).\n  if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1\n  // Always choose the bigger one, otherwise the critical\n  // point is not the same when zooming in or zooming out.\n  && lastAutoInterval > interval\n  // If the axis change is caused by chart resize, the cache should not\n  // be used. Otherwise some hidden labels might not be shown again.\n  && cache.axisExtent0 === axisExtent[0] && cache.axisExtent1 === axisExtent[1]) {\n    return lastAutoInterval;\n  }\n  // Only update cache if cache not used, otherwise the\n  // changing of interval is too insensitive.\n  else {\n    cache.lastTickCount = tickCount;\n    cache.lastAutoInterval = interval;\n    cache.axisExtent0 = axisExtent[0];\n    cache.axisExtent1 = axisExtent[1];\n  }\n}\nfunction fetchAutoCategoryIntervalCalculationParams(axis) {\n  var labelModel = axis.getLabelModel();\n  return {\n    axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0,\n    labelRotate: labelModel.get('rotate') || 0,\n    font: labelModel.getFont()\n  };\n}\nfunction makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) {\n  var labelFormatter = makeLabelFormatter(axis);\n  var ordinalScale = axis.scale;\n  var ordinalExtent = ordinalScale.getExtent();\n  var labelModel = axis.getLabelModel();\n  var result = [];\n  // TODO: axisType: ordinalTime, pick the tick from each month/day/year/...\n  var step = Math.max((categoryInterval || 0) + 1, 1);\n  var startTick = ordinalExtent[0];\n  var tickCount = ordinalScale.count();\n  // Calculate start tick based on zero if possible to keep label consistent\n  // while zooming and moving while interval > 0. Otherwise the selection\n  // of displayable ticks and symbols probably keep changing.\n  // 3 is empirical value.\n  if (startTick !== 0 && step > 1 && tickCount / step > 2) {\n    startTick = Math.round(Math.ceil(startTick / step) * step);\n  }\n  // (1) Only add min max label here but leave overlap checking\n  // to render stage, which also ensure the returned list\n  // suitable for splitLine and splitArea rendering.\n  // (2) Scales except category always contain min max label so\n  // do not need to perform this process.\n  var showAllLabel = shouldShowAllLabels(axis);\n  var includeMinLabel = labelModel.get('showMinLabel') || showAllLabel;\n  var includeMaxLabel = labelModel.get('showMaxLabel') || showAllLabel;\n  if (includeMinLabel && startTick !== ordinalExtent[0]) {\n    addItem(ordinalExtent[0]);\n  }\n  // Optimize: avoid generating large array by `ordinalScale.getTicks()`.\n  var tickValue = startTick;\n  for (; tickValue <= ordinalExtent[1]; tickValue += step) {\n    addItem(tickValue);\n  }\n  if (includeMaxLabel && tickValue - step !== ordinalExtent[1]) {\n    addItem(ordinalExtent[1]);\n  }\n  function addItem(tickValue) {\n    var tickObj = {\n      value: tickValue\n    };\n    result.push(onlyTick ? tickValue : {\n      formattedLabel: labelFormatter(tickObj),\n      rawLabel: ordinalScale.getLabel(tickObj),\n      tickValue: tickValue,\n      time: undefined,\n      \"break\": undefined\n    });\n  }\n  return result;\n}\nfunction makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) {\n  var ordinalScale = axis.scale;\n  var labelFormatter = makeLabelFormatter(axis);\n  var result = [];\n  zrUtil.each(ordinalScale.getTicks(), function (tick) {\n    var rawLabel = ordinalScale.getLabel(tick);\n    var tickValue = tick.value;\n    if (categoryInterval(tick.value, rawLabel)) {\n      result.push(onlyTick ? tickValue : {\n        formattedLabel: labelFormatter(tick),\n        rawLabel: rawLabel,\n        tickValue: tickValue,\n        time: undefined,\n        \"break\": undefined\n      });\n    }\n  });\n  return result;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, map } from 'zrender/lib/core/util.js';\nimport { linearMap, getPixelPrecision, round } from '../util/number.js';\nimport { createAxisTicks, createAxisLabels, calculateCategoryInterval, AxisTickLabelComputingKind, createAxisLabelsComputingContext } from './axisTickLabelBuilder.js';\nvar NORMALIZED_EXTENT = [0, 1];\n/**\n * Base class of Axis.\n *\n * Lifetime: recreate for each main process.\n * [NOTICE]: Some caches is stored on the axis instance (see `axisTickLabelBuilder.ts`)\n *  which is based on this lifetime.\n */\nvar Axis = /** @class */function () {\n  function Axis(dim, scale, extent) {\n    this.onBand = false;\n    // Make sure that `extent[0] > extent[1]` only if `inverse: true`.\n    // `inverse` can be inferred by `extent` unless `extent[0] === extent[1]`.\n    this.inverse = false;\n    this.dim = dim;\n    this.scale = scale;\n    this._extent = extent || [0, 0];\n  }\n  /**\n   * If axis extent contain given coord\n   */\n  Axis.prototype.contain = function (coord) {\n    var extent = this._extent;\n    var min = Math.min(extent[0], extent[1]);\n    var max = Math.max(extent[0], extent[1]);\n    return coord >= min && coord <= max;\n  };\n  /**\n   * If axis extent contain given data\n   */\n  Axis.prototype.containData = function (data) {\n    return this.scale.contain(this.scale.parse(data));\n  };\n  /**\n   * Get coord extent.\n   */\n  Axis.prototype.getExtent = function () {\n    return this._extent.slice();\n  };\n  /**\n   * Get precision used for formatting\n   */\n  Axis.prototype.getPixelPrecision = function (dataExtent) {\n    return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent);\n  };\n  /**\n   * Set coord extent\n   */\n  Axis.prototype.setExtent = function (start, end) {\n    var extent = this._extent;\n    extent[0] = start;\n    extent[1] = end;\n  };\n  /**\n   * Convert data to coord. Data is the rank if it has an ordinal scale\n   */\n  Axis.prototype.dataToCoord = function (data, clamp) {\n    var extent = this._extent;\n    var scale = this.scale;\n    data = scale.normalize(scale.parse(data));\n    if (this.onBand && scale.type === 'ordinal') {\n      extent = extent.slice();\n      fixExtentWithBands(extent, scale.count());\n    }\n    return linearMap(data, NORMALIZED_EXTENT, extent, clamp);\n  };\n  /**\n   * Convert coord to data. Data is the rank if it has an ordinal scale\n   */\n  Axis.prototype.coordToData = function (coord, clamp) {\n    var extent = this._extent;\n    var scale = this.scale;\n    if (this.onBand && scale.type === 'ordinal') {\n      extent = extent.slice();\n      fixExtentWithBands(extent, scale.count());\n    }\n    var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp);\n    return this.scale.scale(t);\n  };\n  /**\n   * Convert pixel point to data in axis\n   */\n  Axis.prototype.pointToData = function (point, clamp) {\n    // Should be implemented in derived class if necessary.\n    return;\n  };\n  /**\n   * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`,\n   * `axis.getTicksCoords` considers `onBand`, which is used by\n   * `boundaryGap:true` of category axis and splitLine and splitArea.\n   * @param opt.tickModel default: axis.model.getModel('axisTick')\n   * @param opt.clamp If `true`, the first and the last\n   *        tick must be at the axis end points. Otherwise, clip ticks\n   *        that outside the axis extent.\n   */\n  Axis.prototype.getTicksCoords = function (opt) {\n    opt = opt || {};\n    var tickModel = opt.tickModel || this.getTickModel();\n    var result = createAxisTicks(this, tickModel, {\n      breakTicks: opt.breakTicks,\n      pruneByBreak: opt.pruneByBreak\n    });\n    var ticks = result.ticks;\n    var ticksCoords = map(ticks, function (tickVal) {\n      return {\n        coord: this.dataToCoord(this.scale.type === 'ordinal' ? this.scale.getRawOrdinalNumber(tickVal) : tickVal),\n        tickValue: tickVal\n      };\n    }, this);\n    var alignWithLabel = tickModel.get('alignWithLabel');\n    fixOnBandTicksCoords(this, ticksCoords, alignWithLabel, opt.clamp);\n    return ticksCoords;\n  };\n  Axis.prototype.getMinorTicksCoords = function () {\n    if (this.scale.type === 'ordinal') {\n      // Category axis doesn't support minor ticks\n      return [];\n    }\n    var minorTickModel = this.model.getModel('minorTick');\n    var splitNumber = minorTickModel.get('splitNumber');\n    // Protection.\n    if (!(splitNumber > 0 && splitNumber < 100)) {\n      splitNumber = 5;\n    }\n    var minorTicks = this.scale.getMinorTicks(splitNumber);\n    var minorTicksCoords = map(minorTicks, function (minorTicksGroup) {\n      return map(minorTicksGroup, function (minorTick) {\n        return {\n          coord: this.dataToCoord(minorTick),\n          tickValue: minorTick\n        };\n      }, this);\n    }, this);\n    return minorTicksCoords;\n  };\n  Axis.prototype.getViewLabels = function (ctx) {\n    ctx = ctx || createAxisLabelsComputingContext(AxisTickLabelComputingKind.determine);\n    return createAxisLabels(this, ctx).labels;\n  };\n  Axis.prototype.getLabelModel = function () {\n    return this.model.getModel('axisLabel');\n  };\n  /**\n   * Notice here we only get the default tick model. For splitLine\n   * or splitArea, we should pass the splitLineModel or splitAreaModel\n   * manually when calling `getTicksCoords`.\n   * In GL, this method may be overridden to:\n   * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));`\n   */\n  Axis.prototype.getTickModel = function () {\n    return this.model.getModel('axisTick');\n  };\n  /**\n   * Get width of band\n   */\n  Axis.prototype.getBandWidth = function () {\n    var axisExtent = this._extent;\n    var dataExtent = this.scale.getExtent();\n    var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0);\n    // Fix #2728, avoid NaN when only one data.\n    len === 0 && (len = 1);\n    var size = Math.abs(axisExtent[1] - axisExtent[0]);\n    return Math.abs(size) / len;\n  };\n  /**\n   * Only be called in category axis.\n   * Can be overridden, consider other axes like in 3D.\n   * @return Auto interval for cateogry axis tick and label\n   */\n  Axis.prototype.calculateCategoryInterval = function (ctx) {\n    ctx = ctx || createAxisLabelsComputingContext(AxisTickLabelComputingKind.determine);\n    return calculateCategoryInterval(this, ctx);\n  };\n  return Axis;\n}();\nfunction fixExtentWithBands(extent, nTick) {\n  var size = extent[1] - extent[0];\n  var len = nTick;\n  var margin = size / len / 2;\n  extent[0] += margin;\n  extent[1] -= margin;\n}\n// If axis has labels [1, 2, 3, 4]. Bands on the axis are\n// |---1---|---2---|---3---|---4---|.\n// So the displayed ticks and splitLine/splitArea should between\n// each data item, otherwise cause misleading (e.g., split tow bars\n// of a single data item when there are two bar series).\n// Also consider if tickCategoryInterval > 0 and onBand, ticks and\n// splitLine/spliteArea should layout appropriately corresponding\n// to displayed labels. (So we should not use `getBandWidth` in this\n// case).\nfunction fixOnBandTicksCoords(axis, ticksCoords, alignWithLabel, clamp) {\n  var ticksLen = ticksCoords.length;\n  if (!axis.onBand || alignWithLabel || !ticksLen) {\n    return;\n  }\n  var axisExtent = axis.getExtent();\n  var last;\n  var diffSize;\n  if (ticksLen === 1) {\n    ticksCoords[0].coord = axisExtent[0];\n    ticksCoords[0].onBand = true;\n    last = ticksCoords[1] = {\n      coord: axisExtent[1],\n      tickValue: ticksCoords[0].tickValue,\n      onBand: true\n    };\n  } else {\n    var crossLen = ticksCoords[ticksLen - 1].tickValue - ticksCoords[0].tickValue;\n    var shift_1 = (ticksCoords[ticksLen - 1].coord - ticksCoords[0].coord) / crossLen;\n    each(ticksCoords, function (ticksItem) {\n      ticksItem.coord -= shift_1 / 2;\n      ticksItem.onBand = true;\n    });\n    var dataExtent = axis.scale.getExtent();\n    diffSize = 1 + dataExtent[1] - ticksCoords[ticksLen - 1].tickValue;\n    last = {\n      coord: ticksCoords[ticksLen - 1].coord + shift_1 * diffSize,\n      tickValue: dataExtent[1] + 1,\n      onBand: true\n    };\n    ticksCoords.push(last);\n  }\n  var inverse = axisExtent[0] > axisExtent[1];\n  // Handling clamp.\n  if (littleThan(ticksCoords[0].coord, axisExtent[0])) {\n    clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift();\n  }\n  if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) {\n    ticksCoords.unshift({\n      coord: axisExtent[0],\n      onBand: true\n    });\n  }\n  if (littleThan(axisExtent[1], last.coord)) {\n    clamp ? last.coord = axisExtent[1] : ticksCoords.pop();\n  }\n  if (clamp && littleThan(last.coord, axisExtent[1])) {\n    ticksCoords.push({\n      coord: axisExtent[1],\n      onBand: true\n    });\n  }\n  function littleThan(a, b) {\n    // Avoid rounding error cause calculated tick coord different with extent.\n    // It may cause an extra unnecessary tick added.\n    a = round(a);\n    b = round(b);\n    return inverse ? a > b : a < b;\n  }\n}\nexport default Axis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { Point, Path, Polyline } from '../util/graphic.js';\nimport PathProxy from 'zrender/lib/core/PathProxy.js';\nimport { normalizeRadian } from 'zrender/lib/contain/util.js';\nimport { cubicProjectPoint, quadraticProjectPoint } from 'zrender/lib/core/curve.js';\nimport { defaults, retrieve2 } from 'zrender/lib/core/util.js';\nimport { invert } from 'zrender/lib/core/matrix.js';\nimport * as vector from 'zrender/lib/core/vector.js';\nimport { DISPLAY_STATES, SPECIAL_STATES } from '../util/states.js';\nvar PI2 = Math.PI * 2;\nvar CMD = PathProxy.CMD;\nvar DEFAULT_SEARCH_SPACE = ['top', 'right', 'bottom', 'left'];\nfunction getCandidateAnchor(pos, distance, rect, outPt, outDir) {\n  var width = rect.width;\n  var height = rect.height;\n  switch (pos) {\n    case 'top':\n      outPt.set(rect.x + width / 2, rect.y - distance);\n      outDir.set(0, -1);\n      break;\n    case 'bottom':\n      outPt.set(rect.x + width / 2, rect.y + height + distance);\n      outDir.set(0, 1);\n      break;\n    case 'left':\n      outPt.set(rect.x - distance, rect.y + height / 2);\n      outDir.set(-1, 0);\n      break;\n    case 'right':\n      outPt.set(rect.x + width + distance, rect.y + height / 2);\n      outDir.set(1, 0);\n      break;\n  }\n}\nfunction projectPointToArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y, out) {\n  x -= cx;\n  y -= cy;\n  var d = Math.sqrt(x * x + y * y);\n  x /= d;\n  y /= d;\n  // Intersect point.\n  var ox = x * r + cx;\n  var oy = y * r + cy;\n  if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) {\n    // Is a circle\n    out[0] = ox;\n    out[1] = oy;\n    return d - r;\n  }\n  if (anticlockwise) {\n    var tmp = startAngle;\n    startAngle = normalizeRadian(endAngle);\n    endAngle = normalizeRadian(tmp);\n  } else {\n    startAngle = normalizeRadian(startAngle);\n    endAngle = normalizeRadian(endAngle);\n  }\n  if (startAngle > endAngle) {\n    endAngle += PI2;\n  }\n  var angle = Math.atan2(y, x);\n  if (angle < 0) {\n    angle += PI2;\n  }\n  if (angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle) {\n    // Project point is on the arc.\n    out[0] = ox;\n    out[1] = oy;\n    return d - r;\n  }\n  var x1 = r * Math.cos(startAngle) + cx;\n  var y1 = r * Math.sin(startAngle) + cy;\n  var x2 = r * Math.cos(endAngle) + cx;\n  var y2 = r * Math.sin(endAngle) + cy;\n  var d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);\n  var d2 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);\n  if (d1 < d2) {\n    out[0] = x1;\n    out[1] = y1;\n    return Math.sqrt(d1);\n  } else {\n    out[0] = x2;\n    out[1] = y2;\n    return Math.sqrt(d2);\n  }\n}\nfunction projectPointToLine(x1, y1, x2, y2, x, y, out, limitToEnds) {\n  var dx = x - x1;\n  var dy = y - y1;\n  var dx1 = x2 - x1;\n  var dy1 = y2 - y1;\n  var lineLen = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n  dx1 /= lineLen;\n  dy1 /= lineLen;\n  // dot product\n  var projectedLen = dx * dx1 + dy * dy1;\n  var t = projectedLen / lineLen;\n  if (limitToEnds) {\n    t = Math.min(Math.max(t, 0), 1);\n  }\n  t *= lineLen;\n  var ox = out[0] = x1 + t * dx1;\n  var oy = out[1] = y1 + t * dy1;\n  return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));\n}\nfunction projectPointToRect(x1, y1, width, height, x, y, out) {\n  if (width < 0) {\n    x1 = x1 + width;\n    width = -width;\n  }\n  if (height < 0) {\n    y1 = y1 + height;\n    height = -height;\n  }\n  var x2 = x1 + width;\n  var y2 = y1 + height;\n  var ox = out[0] = Math.min(Math.max(x, x1), x2);\n  var oy = out[1] = Math.min(Math.max(y, y1), y2);\n  return Math.sqrt((ox - x) * (ox - x) + (oy - y) * (oy - y));\n}\nvar tmpPt = [];\nfunction nearestPointOnRect(pt, rect, out) {\n  var dist = projectPointToRect(rect.x, rect.y, rect.width, rect.height, pt.x, pt.y, tmpPt);\n  out.set(tmpPt[0], tmpPt[1]);\n  return dist;\n}\n/**\n * Calculate min distance corresponding point.\n * This method won't evaluate if point is in the path.\n */\nfunction nearestPointOnPath(pt, path, out) {\n  var xi = 0;\n  var yi = 0;\n  var x0 = 0;\n  var y0 = 0;\n  var x1;\n  var y1;\n  var minDist = Infinity;\n  var data = path.data;\n  var x = pt.x;\n  var y = pt.y;\n  for (var i = 0; i < data.length;) {\n    var cmd = data[i++];\n    if (i === 1) {\n      xi = data[i];\n      yi = data[i + 1];\n      x0 = xi;\n      y0 = yi;\n    }\n    var d = minDist;\n    switch (cmd) {\n      case CMD.M:\n        // moveTo \u547D\u4EE4\u91CD\u65B0\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684 subpath, \u5E76\u4E14\u66F4\u65B0\u65B0\u7684\u8D77\u70B9\n        // \u5728 closePath \u7684\u65F6\u5019\u4F7F\u7528\n        x0 = data[i++];\n        y0 = data[i++];\n        xi = x0;\n        yi = y0;\n        break;\n      case CMD.L:\n        d = projectPointToLine(xi, yi, data[i], data[i + 1], x, y, tmpPt, true);\n        xi = data[i++];\n        yi = data[i++];\n        break;\n      case CMD.C:\n        d = cubicProjectPoint(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);\n        xi = data[i++];\n        yi = data[i++];\n        break;\n      case CMD.Q:\n        d = quadraticProjectPoint(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y, tmpPt);\n        xi = data[i++];\n        yi = data[i++];\n        break;\n      case CMD.A:\n        // TODO Arc \u5224\u65AD\u7684\u5F00\u9500\u6BD4\u8F83\u5927\n        var cx = data[i++];\n        var cy = data[i++];\n        var rx = data[i++];\n        var ry = data[i++];\n        var theta = data[i++];\n        var dTheta = data[i++];\n        // TODO Arc \u65CB\u8F6C\n        i += 1;\n        var anticlockwise = !!(1 - data[i++]);\n        x1 = Math.cos(theta) * rx + cx;\n        y1 = Math.sin(theta) * ry + cy;\n        // \u4E0D\u662F\u76F4\u63A5\u4F7F\u7528 arc \u547D\u4EE4\n        if (i <= 1) {\n          // \u7B2C\u4E00\u4E2A\u547D\u4EE4\u8D77\u70B9\u8FD8\u672A\u5B9A\u4E49\n          x0 = x1;\n          y0 = y1;\n        }\n        // zr \u4F7F\u7528scale\u6765\u6A21\u62DF\u692D\u5706, \u8FD9\u91CC\u4E5F\u5BF9x\u505A\u4E00\u5B9A\u7684\u7F29\u653E\n        var _x = (x - cx) * ry / rx + cx;\n        d = projectPointToArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y, tmpPt);\n        xi = Math.cos(theta + dTheta) * rx + cx;\n        yi = Math.sin(theta + dTheta) * ry + cy;\n        break;\n      case CMD.R:\n        x0 = xi = data[i++];\n        y0 = yi = data[i++];\n        var width = data[i++];\n        var height = data[i++];\n        d = projectPointToRect(x0, y0, width, height, x, y, tmpPt);\n        break;\n      case CMD.Z:\n        d = projectPointToLine(xi, yi, x0, y0, x, y, tmpPt, true);\n        xi = x0;\n        yi = y0;\n        break;\n    }\n    if (d < minDist) {\n      minDist = d;\n      out.set(tmpPt[0], tmpPt[1]);\n    }\n  }\n  return minDist;\n}\n// Temporal variable for intermediate usage.\nvar pt0 = new Point();\nvar pt1 = new Point();\nvar pt2 = new Point();\nvar dir = new Point();\nvar dir2 = new Point();\n/**\n * Calculate a proper guide line based on the label position and graphic element definition\n * @param label\n * @param labelRect\n * @param target\n * @param targetRect\n */\nexport function updateLabelLinePoints(target, labelLineModel) {\n  if (!target) {\n    return;\n  }\n  var labelLine = target.getTextGuideLine();\n  var label = target.getTextContent();\n  // Needs to create text guide in each charts.\n  if (!(label && labelLine)) {\n    return;\n  }\n  var labelGuideConfig = target.textGuideLineConfig || {};\n  var points = [[0, 0], [0, 0], [0, 0]];\n  var searchSpace = labelGuideConfig.candidates || DEFAULT_SEARCH_SPACE;\n  var labelRect = label.getBoundingRect().clone();\n  labelRect.applyTransform(label.getComputedTransform());\n  var minDist = Infinity;\n  var anchorPoint = labelGuideConfig.anchor;\n  var targetTransform = target.getComputedTransform();\n  var targetInversedTransform = targetTransform && invert([], targetTransform);\n  var len = labelLineModel.get('length2') || 0;\n  if (anchorPoint) {\n    pt2.copy(anchorPoint);\n  }\n  for (var i = 0; i < searchSpace.length; i++) {\n    var candidate = searchSpace[i];\n    getCandidateAnchor(candidate, 0, labelRect, pt0, dir);\n    Point.scaleAndAdd(pt1, pt0, dir, len);\n    // Transform to target coord space.\n    pt1.transform(targetInversedTransform);\n    // Note: getBoundingRect will ensure the `path` being created.\n    var boundingRect = target.getBoundingRect();\n    var dist = anchorPoint ? anchorPoint.distance(pt1) : target instanceof Path ? nearestPointOnPath(pt1, target.path, pt2) : nearestPointOnRect(pt1, boundingRect, pt2);\n    // TODO pt2 is in the path\n    if (dist < minDist) {\n      minDist = dist;\n      // Transform back to global space.\n      pt1.transform(targetTransform);\n      pt2.transform(targetTransform);\n      pt2.toArray(points[0]);\n      pt1.toArray(points[1]);\n      pt0.toArray(points[2]);\n    }\n  }\n  limitTurnAngle(points, labelLineModel.get('minTurnAngle'));\n  labelLine.setShape({\n    points: points\n  });\n}\n// Temporal variable for the limitTurnAngle function\nvar tmpArr = [];\nvar tmpProjPoint = new Point();\n/**\n * Reduce the line segment attached to the label to limit the turn angle between two segments.\n * @param linePoints\n * @param minTurnAngle Radian of minimum turn angle. 0 - 180\n */\nexport function limitTurnAngle(linePoints, minTurnAngle) {\n  if (!(minTurnAngle <= 180 && minTurnAngle > 0)) {\n    return;\n  }\n  minTurnAngle = minTurnAngle / 180 * Math.PI;\n  // The line points can be\n  //      /pt1----pt2 (label)\n  //     /\n  // pt0/\n  pt0.fromArray(linePoints[0]);\n  pt1.fromArray(linePoints[1]);\n  pt2.fromArray(linePoints[2]);\n  Point.sub(dir, pt0, pt1);\n  Point.sub(dir2, pt2, pt1);\n  var len1 = dir.len();\n  var len2 = dir2.len();\n  if (len1 < 1e-3 || len2 < 1e-3) {\n    return;\n  }\n  dir.scale(1 / len1);\n  dir2.scale(1 / len2);\n  var angleCos = dir.dot(dir2);\n  var minTurnAngleCos = Math.cos(minTurnAngle);\n  if (minTurnAngleCos < angleCos) {\n    // Smaller than minTurnAngle\n    // Calculate project point of pt0 on pt1-pt2\n    var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);\n    tmpProjPoint.fromArray(tmpArr);\n    // Calculate new projected length with limited minTurnAngle and get the new connect point\n    tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI - minTurnAngle));\n    // Limit the new calculated connect point between pt1 and pt2.\n    var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);\n    if (isNaN(t)) {\n      return;\n    }\n    if (t < 0) {\n      Point.copy(tmpProjPoint, pt1);\n    } else if (t > 1) {\n      Point.copy(tmpProjPoint, pt2);\n    }\n    tmpProjPoint.toArray(linePoints[1]);\n  }\n}\n/**\n * Limit the angle of line and the surface\n * @param maxSurfaceAngle Radian of minimum turn angle. 0 - 180. 0 is same direction to normal. 180 is opposite\n */\nexport function limitSurfaceAngle(linePoints, surfaceNormal, maxSurfaceAngle) {\n  if (!(maxSurfaceAngle <= 180 && maxSurfaceAngle > 0)) {\n    return;\n  }\n  maxSurfaceAngle = maxSurfaceAngle / 180 * Math.PI;\n  pt0.fromArray(linePoints[0]);\n  pt1.fromArray(linePoints[1]);\n  pt2.fromArray(linePoints[2]);\n  Point.sub(dir, pt1, pt0);\n  Point.sub(dir2, pt2, pt1);\n  var len1 = dir.len();\n  var len2 = dir2.len();\n  if (len1 < 1e-3 || len2 < 1e-3) {\n    return;\n  }\n  dir.scale(1 / len1);\n  dir2.scale(1 / len2);\n  var angleCos = dir.dot(surfaceNormal);\n  var maxSurfaceAngleCos = Math.cos(maxSurfaceAngle);\n  if (angleCos < maxSurfaceAngleCos) {\n    // Calculate project point of pt0 on pt1-pt2\n    var d = projectPointToLine(pt1.x, pt1.y, pt2.x, pt2.y, pt0.x, pt0.y, tmpArr, false);\n    tmpProjPoint.fromArray(tmpArr);\n    var HALF_PI = Math.PI / 2;\n    var angle2 = Math.acos(dir2.dot(surfaceNormal));\n    var newAngle = HALF_PI + angle2 - maxSurfaceAngle;\n    if (newAngle >= HALF_PI) {\n      // parallel\n      Point.copy(tmpProjPoint, pt2);\n    } else {\n      // Calculate new projected length with limited minTurnAngle and get the new connect point\n      tmpProjPoint.scaleAndAdd(dir2, d / Math.tan(Math.PI / 2 - newAngle));\n      // Limit the new calculated connect point between pt1 and pt2.\n      var t = pt2.x !== pt1.x ? (tmpProjPoint.x - pt1.x) / (pt2.x - pt1.x) : (tmpProjPoint.y - pt1.y) / (pt2.y - pt1.y);\n      if (isNaN(t)) {\n        return;\n      }\n      if (t < 0) {\n        Point.copy(tmpProjPoint, pt1);\n      } else if (t > 1) {\n        Point.copy(tmpProjPoint, pt2);\n      }\n    }\n    tmpProjPoint.toArray(linePoints[1]);\n  }\n}\nfunction setLabelLineState(labelLine, ignore, stateName, stateModel) {\n  var isNormal = stateName === 'normal';\n  var stateObj = isNormal ? labelLine : labelLine.ensureState(stateName);\n  // Make sure display.\n  stateObj.ignore = ignore;\n  // Set smooth\n  var smooth = stateModel.get('smooth');\n  if (smooth && smooth === true) {\n    smooth = 0.3;\n  }\n  stateObj.shape = stateObj.shape || {};\n  if (smooth > 0) {\n    stateObj.shape.smooth = smooth;\n  }\n  var styleObj = stateModel.getModel('lineStyle').getLineStyle();\n  isNormal ? labelLine.useStyle(styleObj) : stateObj.style = styleObj;\n}\nfunction buildLabelLinePath(path, shape) {\n  var smooth = shape.smooth;\n  var points = shape.points;\n  if (!points) {\n    return;\n  }\n  path.moveTo(points[0][0], points[0][1]);\n  if (smooth > 0 && points.length >= 3) {\n    var len1 = vector.dist(points[0], points[1]);\n    var len2 = vector.dist(points[1], points[2]);\n    if (!len1 || !len2) {\n      path.lineTo(points[1][0], points[1][1]);\n      path.lineTo(points[2][0], points[2][1]);\n      return;\n    }\n    var moveLen = Math.min(len1, len2) * smooth;\n    var midPoint0 = vector.lerp([], points[1], points[0], moveLen / len1);\n    var midPoint2 = vector.lerp([], points[1], points[2], moveLen / len2);\n    var midPoint1 = vector.lerp([], midPoint0, midPoint2, 0.5);\n    path.bezierCurveTo(midPoint0[0], midPoint0[1], midPoint0[0], midPoint0[1], midPoint1[0], midPoint1[1]);\n    path.bezierCurveTo(midPoint2[0], midPoint2[1], midPoint2[0], midPoint2[1], points[2][0], points[2][1]);\n  } else {\n    for (var i = 1; i < points.length; i++) {\n      path.lineTo(points[i][0], points[i][1]);\n    }\n  }\n}\n/**\n * Create a label line if necessary and set it's style.\n */\nexport function setLabelLineStyle(targetEl, statesModels, defaultStyle) {\n  var labelLine = targetEl.getTextGuideLine();\n  var label = targetEl.getTextContent();\n  if (!label) {\n    // Not show label line if there is no label.\n    if (labelLine) {\n      targetEl.removeTextGuideLine();\n    }\n    return;\n  }\n  var normalModel = statesModels.normal;\n  var showNormal = normalModel.get('show');\n  var labelIgnoreNormal = label.ignore;\n  for (var i = 0; i < DISPLAY_STATES.length; i++) {\n    var stateName = DISPLAY_STATES[i];\n    var stateModel = statesModels[stateName];\n    var isNormal = stateName === 'normal';\n    if (stateModel) {\n      var stateShow = stateModel.get('show');\n      var isLabelIgnored = isNormal ? labelIgnoreNormal : retrieve2(label.states[stateName] && label.states[stateName].ignore, labelIgnoreNormal);\n      if (isLabelIgnored // Not show when label is not shown in this state.\n      || !retrieve2(stateShow, showNormal) // Use normal state by default if not set.\n      ) {\n        var stateObj = isNormal ? labelLine : labelLine && labelLine.states[stateName];\n        if (stateObj) {\n          stateObj.ignore = true;\n        }\n        if (!!labelLine) {\n          setLabelLineState(labelLine, true, stateName, stateModel);\n        }\n        continue;\n      }\n      // Create labelLine if not exists\n      if (!labelLine) {\n        labelLine = new Polyline();\n        targetEl.setTextGuideLine(labelLine);\n        // Reset state of normal because it's new created.\n        // NOTE: NORMAL should always been the first!\n        if (!isNormal && (labelIgnoreNormal || !showNormal)) {\n          setLabelLineState(labelLine, true, 'normal', statesModels.normal);\n        }\n        // Use same state proxy.\n        if (targetEl.stateProxy) {\n          labelLine.stateProxy = targetEl.stateProxy;\n        }\n      }\n      setLabelLineState(labelLine, false, stateName, stateModel);\n    }\n  }\n  if (labelLine) {\n    defaults(labelLine.style, defaultStyle);\n    // Not fill.\n    labelLine.style.fill = null;\n    var showAbove = normalModel.get('showAbove');\n    var labelLineConfig = targetEl.textGuideLineConfig = targetEl.textGuideLineConfig || {};\n    labelLineConfig.showAbove = showAbove || false;\n    // Custom the buildPath.\n    labelLine.buildPath = buildLabelLinePath;\n  }\n}\nexport function getLabelLineStatesModels(itemModel, labelLineName) {\n  labelLineName = labelLineName || 'labelLine';\n  var statesModels = {\n    normal: itemModel.getModel(labelLineName)\n  };\n  for (var i = 0; i < SPECIAL_STATES.length; i++) {\n    var stateName = SPECIAL_STATES[i];\n    statesModels[stateName] = itemModel.getModel([stateName, labelLineName]);\n  }\n  return statesModels;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { OrientedBoundingRect, WH, XY, ensureCopyRect, ensureCopyTransform, expandOrShrinkRect, isBoundingRectAxisAligned } from '../util/graphic.js';\nimport { LabelMarginType } from './labelStyle.js';\nvar LABEL_LAYOUT_BASE_PROPS = ['label', 'labelLine', 'layoutOption', 'priority', 'defaultAttr', 'marginForce', 'minMarginForce', 'marginDefault', 'suggestIgnore'];\nvar LABEL_LAYOUT_DIRTY_BIT_OTHERS = 1;\nvar LABEL_LAYOUT_DIRTY_BIT_OBB = 2;\nvar LABEL_LAYOUT_DIRTY_ALL = LABEL_LAYOUT_DIRTY_BIT_OTHERS | LABEL_LAYOUT_DIRTY_BIT_OBB;\nexport function setLabelLayoutDirty(labelGeometry, dirtyOrClear, dirtyBits) {\n  dirtyBits = dirtyBits || LABEL_LAYOUT_DIRTY_ALL;\n  dirtyOrClear ? labelGeometry.dirty |= dirtyBits : labelGeometry.dirty &= ~dirtyBits;\n}\nfunction isLabelLayoutDirty(labelGeometry, dirtyBits) {\n  dirtyBits = dirtyBits || LABEL_LAYOUT_DIRTY_ALL;\n  return labelGeometry.dirty == null || !!(labelGeometry.dirty & dirtyBits);\n}\n/**\n * [CAUTION]\n *  - No auto dirty propagation mechanism yet. If the transform of the raw label or any of its ancestors is\n *    changed, must sync the changes to the props of `LabelGeometry` by:\n *    either explicitly call:\n *      `setLabelLayoutDirty(labelLayout, true); ensureLabelLayoutWithGeometry(labelLayout);`\n *    or call (if only translation is performed):\n *      `labelLayoutApplyTranslation(labelLayout);`\n *  - `label.ignore` is not necessarily falsy, and not considered in computing `LabelGeometry`,\n *    since it might be modified by some overlap resolving handling.\n *  - To duplicate or make a variation:\n *    use `newLabelLayoutWithGeometry`.\n *\n * The result can also be the input of this method.\n * @return `NullUndefined` if and only if `labelLayout` is `NullUndefined`.\n */\nexport function ensureLabelLayoutWithGeometry(labelLayout) {\n  if (!labelLayout) {\n    return;\n  }\n  if (isLabelLayoutDirty(labelLayout)) {\n    computeLabelGeometry(labelLayout, labelLayout.label, labelLayout);\n  }\n  return labelLayout;\n}\n/**\n * The props in `out` will be filled if existing, or created.\n */\nexport function computeLabelGeometry(out, label, opt) {\n  // [CAUTION] These props may be modified directly for performance consideration,\n  //  therefore, do not output the internal data structure of zrender Element.\n  var rawTransform = label.getComputedTransform();\n  out.transform = ensureCopyTransform(out.transform, rawTransform);\n  // NOTE: should call `getBoundingRect` after `getComputedTransform`, or may get an inaccurate bounding rect.\n  //  The reason is that `getComputedTransform` calls `__host.updateInnerText()` internally, which updates the label\n  //  by `textConfig` mounted on the host.\n  // PENDING: add a dirty bit for that in zrender?\n  var outLocalRect = out.localRect = ensureCopyRect(out.localRect, label.getBoundingRect());\n  var labelStyleExt = label.style;\n  var margin = labelStyleExt.margin;\n  var marginForce = opt && opt.marginForce;\n  var minMarginForce = opt && opt.minMarginForce;\n  var marginDefault = opt && opt.marginDefault;\n  var marginType = labelStyleExt.__marginType;\n  if (marginType == null && marginDefault) {\n    margin = marginDefault;\n    marginType = LabelMarginType.textMargin;\n  }\n  // `textMargin` and `minMargin` can not exist both.\n  for (var i = 0; i < 4; i++) {\n    _tmpLabelMargin[i] = marginType === LabelMarginType.minMargin && minMarginForce && minMarginForce[i] != null ? minMarginForce[i] : marginForce && marginForce[i] != null ? marginForce[i] : margin ? margin[i] : 0;\n  }\n  if (marginType === LabelMarginType.textMargin) {\n    expandOrShrinkRect(outLocalRect, _tmpLabelMargin, false, false);\n  }\n  var outGlobalRect = out.rect = ensureCopyRect(out.rect, outLocalRect);\n  if (rawTransform) {\n    outGlobalRect.applyTransform(rawTransform);\n  }\n  // Notice: label.style.margin is actually `minMargin / 2`, handled by `setTextStyleCommon`.\n  if (marginType === LabelMarginType.minMargin) {\n    expandOrShrinkRect(outGlobalRect, _tmpLabelMargin, false, false);\n  }\n  out.axisAligned = isBoundingRectAxisAligned(rawTransform);\n  (out.label = out.label || {}).ignore = label.ignore;\n  setLabelLayoutDirty(out, false);\n  setLabelLayoutDirty(out, true, LABEL_LAYOUT_DIRTY_BIT_OBB);\n  // Do not remove `obb` (if existing) for reuse, just reset the dirty bit.\n  return out;\n}\nvar _tmpLabelMargin = [0, 0, 0, 0];\n/**\n * The props in `out` will be filled if existing, or created.\n */\nexport function computeLabelGeometry2(out, rawLocalRect, rawTransform) {\n  out.transform = ensureCopyTransform(out.transform, rawTransform);\n  out.localRect = ensureCopyRect(out.localRect, rawLocalRect);\n  out.rect = ensureCopyRect(out.rect, rawLocalRect);\n  if (rawTransform) {\n    out.rect.applyTransform(rawTransform);\n  }\n  out.axisAligned = isBoundingRectAxisAligned(rawTransform);\n  out.obb = undefined; // Reset to undefined, will be created by `ensureOBB` when using.\n  (out.label = out.label || {}).ignore = false;\n  return out;\n}\n/**\n * This is a shortcut of\n *   ```js\n *   labelLayout.label.x = newX;\n *   labelLayout.label.y = newY;\n *   setLabelLayoutDirty(labelLayout, true);\n *   ensureLabelLayoutWithGeometry(labelLayout);\n *   ```\n * and provide better performance in this common case.\n */\nexport function labelLayoutApplyTranslation(labelLayout, offset) {\n  if (!labelLayout) {\n    return;\n  }\n  labelLayout.label.x += offset.x;\n  labelLayout.label.y += offset.y;\n  labelLayout.label.markRedraw();\n  var transform = labelLayout.transform;\n  if (transform) {\n    transform[4] += offset.x;\n    transform[5] += offset.y;\n  }\n  var globalRect = labelLayout.rect;\n  if (globalRect) {\n    globalRect.x += offset.x;\n    globalRect.y += offset.y;\n  }\n  var obb = labelLayout.obb;\n  if (obb) {\n    obb.fromBoundingRect(labelLayout.localRect, transform);\n  }\n}\n/**\n * To duplicate or make a variation of a label layout.\n * Copy the only relevant properties to avoid the conflict or wrongly reuse of the props of `LabelLayoutWithGeometry`.\n */\nexport function newLabelLayoutWithGeometry(newBaseWithDefaults, source) {\n  for (var i = 0; i < LABEL_LAYOUT_BASE_PROPS.length; i++) {\n    var prop = LABEL_LAYOUT_BASE_PROPS[i];\n    if (newBaseWithDefaults[prop] == null) {\n      newBaseWithDefaults[prop] = source[prop];\n    }\n  }\n  return ensureLabelLayoutWithGeometry(newBaseWithDefaults);\n}\n/**\n * Create obb if no one, can cache it.\n */\nfunction ensureOBB(labelGeometry) {\n  var obb = labelGeometry.obb;\n  if (!obb || isLabelLayoutDirty(labelGeometry, LABEL_LAYOUT_DIRTY_BIT_OBB)) {\n    labelGeometry.obb = obb = obb || new OrientedBoundingRect();\n    obb.fromBoundingRect(labelGeometry.localRect, labelGeometry.transform);\n    setLabelLayoutDirty(labelGeometry, false, LABEL_LAYOUT_DIRTY_BIT_OBB);\n  }\n  return obb;\n}\n/**\n * Adjust labels on x/y direction to avoid overlap.\n *\n * PENDING: the current implementation is based on the global bounding rect rather than the local rect,\n *  which may be not preferable in some edge cases when the label has rotation, but works for most cases,\n *  since rotation is unnecessary when there is sufficient space, while squeezing is applied regardless\n *  of overlapping when there is no enough space.\n *\n * NOTICE:\n *  - The input `list` and its content will be modified (sort, label.x/y, rect).\n *  - The caller should sync the modifications to the other parts by\n *    `setLabelLayoutDirty` and `ensureLabelLayoutWithGeometry` if needed.\n *\n * @return adjusted\n */\nexport function shiftLayoutOnXY(list, xyDimIdx,\n// 0 for x, 1 for y\nminBound,\n// for x, leftBound; for y, topBound\nmaxBound,\n// for x, rightBound; for y, bottomBound\n// If average the shifts on all labels and add them to 0\n// TODO: Not sure if should enable it.\n// Pros: The angle of lines will distribute more equally\n// Cons: In some layout. It may not what user wanted. like in pie. the label of last sector is usually changed unexpectedly.\nbalanceShift) {\n  var len = list.length;\n  var xyDim = XY[xyDimIdx];\n  var sizeDim = WH[xyDimIdx];\n  if (len < 2) {\n    return false;\n  }\n  list.sort(function (a, b) {\n    return a.rect[xyDim] - b.rect[xyDim];\n  });\n  var lastPos = 0;\n  var delta;\n  var adjusted = false;\n  // const shifts = [];\n  var totalShifts = 0;\n  for (var i = 0; i < len; i++) {\n    var item = list[i];\n    var rect = item.rect;\n    delta = rect[xyDim] - lastPos;\n    if (delta < 0) {\n      // shiftForward(i, len, -delta);\n      rect[xyDim] -= delta;\n      item.label[xyDim] -= delta;\n      adjusted = true;\n    }\n    var shift = Math.max(-delta, 0);\n    // shifts.push(shift);\n    totalShifts += shift;\n    lastPos = rect[xyDim] + rect[sizeDim];\n  }\n  if (totalShifts > 0 && balanceShift) {\n    // Shift back to make the distribution more equally.\n    shiftList(-totalShifts / len, 0, len);\n  }\n  // TODO bleedMargin?\n  var first = list[0];\n  var last = list[len - 1];\n  var minGap;\n  var maxGap;\n  updateMinMaxGap();\n  // If ends exceed two bounds, squeeze at most 80%, then take the gap of two bounds.\n  minGap < 0 && squeezeGaps(-minGap, 0.8);\n  maxGap < 0 && squeezeGaps(maxGap, 0.8);\n  updateMinMaxGap();\n  takeBoundsGap(minGap, maxGap, 1);\n  takeBoundsGap(maxGap, minGap, -1);\n  // Handle bailout when there is not enough space.\n  updateMinMaxGap();\n  if (minGap < 0) {\n    squeezeWhenBailout(-minGap);\n  }\n  if (maxGap < 0) {\n    squeezeWhenBailout(maxGap);\n  }\n  function updateMinMaxGap() {\n    minGap = first.rect[xyDim] - minBound;\n    maxGap = maxBound - last.rect[xyDim] - last.rect[sizeDim];\n  }\n  function takeBoundsGap(gapThisBound, gapOtherBound, moveDir) {\n    if (gapThisBound < 0) {\n      // Move from other gap if can.\n      var moveFromMaxGap = Math.min(gapOtherBound, -gapThisBound);\n      if (moveFromMaxGap > 0) {\n        shiftList(moveFromMaxGap * moveDir, 0, len);\n        var remained = moveFromMaxGap + gapThisBound;\n        if (remained < 0) {\n          squeezeGaps(-remained * moveDir, 1);\n        }\n      } else {\n        squeezeGaps(-gapThisBound * moveDir, 1);\n      }\n    }\n  }\n  function shiftList(delta, start, end) {\n    if (delta !== 0) {\n      adjusted = true;\n    }\n    for (var i = start; i < end; i++) {\n      var item = list[i];\n      var rect = item.rect;\n      rect[xyDim] += delta;\n      item.label[xyDim] += delta;\n    }\n  }\n  // Squeeze gaps if the labels exceed margin.\n  function squeezeGaps(delta, maxSqeezePercent) {\n    var gaps = [];\n    var totalGaps = 0;\n    for (var i = 1; i < len; i++) {\n      var prevItemRect = list[i - 1].rect;\n      var gap = Math.max(list[i].rect[xyDim] - prevItemRect[xyDim] - prevItemRect[sizeDim], 0);\n      gaps.push(gap);\n      totalGaps += gap;\n    }\n    if (!totalGaps) {\n      return;\n    }\n    var squeezePercent = Math.min(Math.abs(delta) / totalGaps, maxSqeezePercent);\n    if (delta > 0) {\n      for (var i = 0; i < len - 1; i++) {\n        // Distribute the shift delta to all gaps.\n        var movement = gaps[i] * squeezePercent;\n        // Forward\n        shiftList(movement, 0, i + 1);\n      }\n    } else {\n      // Backward\n      for (var i = len - 1; i > 0; i--) {\n        // Distribute the shift delta to all gaps.\n        var movement = gaps[i - 1] * squeezePercent;\n        shiftList(-movement, i, len);\n      }\n    }\n  }\n  /**\n   * Squeeze to allow overlap if there is no more space available.\n   * Let other overlapping strategy like hideOverlap do the job instead of keep exceeding the bounds.\n   */\n  function squeezeWhenBailout(delta) {\n    var dir = delta < 0 ? -1 : 1;\n    delta = Math.abs(delta);\n    var moveForEachLabel = Math.ceil(delta / (len - 1));\n    for (var i = 0; i < len - 1; i++) {\n      if (dir > 0) {\n        // Forward\n        shiftList(moveForEachLabel, 0, i + 1);\n      } else {\n        // Backward\n        shiftList(-moveForEachLabel, len - i - 1, len);\n      }\n      delta -= moveForEachLabel;\n      if (delta <= 0) {\n        return;\n      }\n    }\n  }\n  return adjusted;\n}\n/**\n * @see `SavedLabelAttr` in `LabelManager.ts`\n * @see `hideOverlap`\n */\nexport function restoreIgnore(labelList) {\n  for (var i = 0; i < labelList.length; i++) {\n    var labelItem = labelList[i];\n    var defaultAttr = labelItem.defaultAttr;\n    var labelLine = labelItem.labelLine;\n    labelItem.label.attr('ignore', defaultAttr.ignore);\n    labelLine && labelLine.attr('ignore', defaultAttr.labelGuideIgnore);\n  }\n}\n/**\n * [NOTICE - restore]:\n *  'series:layoutlabels' may be triggered during some shortcut passes, such as zooming in series.graph/geo\n *  (`updateLabelLayout`), where the modified `Element` props should be restorable from `defaultAttr`.\n *  @see `SavedLabelAttr` in `LabelManager.ts`\n *  `restoreIgnore` can be called to perform the restore, if needed.\n *\n * [NOTICE - state]:\n *  Regarding Element's states, this method is only designed for the normal state.\n *  PENDING: although currently this method is effectively called in other states in `updateLabelLayout` case,\n *      the bad case is not noticeable in the zooming scenario.\n */\nexport function hideOverlap(labelList) {\n  var displayedLabels = [];\n  // TODO, render overflow visible first, put in the displayedLabels.\n  labelList.sort(function (a, b) {\n    return (b.suggestIgnore ? 1 : 0) - (a.suggestIgnore ? 1 : 0) || b.priority - a.priority;\n  });\n  function hideEl(el) {\n    if (!el.ignore) {\n      // Show on emphasis.\n      var emphasisState = el.ensureState('emphasis');\n      if (emphasisState.ignore == null) {\n        emphasisState.ignore = false;\n      }\n    }\n    el.ignore = true;\n  }\n  for (var i = 0; i < labelList.length; i++) {\n    var labelItem = ensureLabelLayoutWithGeometry(labelList[i]);\n    // The current `el.ignore` is involved, since some previous overlap\n    // resolving strategies may have set `el.ignore` to true.\n    if (labelItem.label.ignore) {\n      continue;\n    }\n    var label = labelItem.label;\n    var labelLine = labelItem.labelLine;\n    // NOTICE: even when the with/height of globalRect of a label is 0, the label line should\n    // still be displayed, since we should follow the concept of \"truncation\", meaning that\n    // something exists even if it cannot be fully displayed. A visible label line is necessary\n    // to allow users to get a tooltip with label info on hover.\n    var overlapped = false;\n    for (var j = 0; j < displayedLabels.length; j++) {\n      if (labelIntersect(labelItem, displayedLabels[j], null, {\n        touchThreshold: 0.05\n      })) {\n        overlapped = true;\n        break;\n      }\n    }\n    // TODO Callback to determine if this overlap should be handled?\n    if (overlapped) {\n      hideEl(label);\n      labelLine && hideEl(labelLine);\n    } else {\n      displayedLabels.push(labelItem);\n    }\n  }\n}\n/**\n * Enable fast check for performance; use obb if inevitable.\n * If `mtv` is used, `targetLayoutInfo` can be moved based on the values filled into `mtv`.\n *\n * This method is based only on the current `Element` states (regardless of other states).\n * Typically this method (and the entire layout process) is performed in normal state.\n */\nexport function labelIntersect(baseLayoutInfo, targetLayoutInfo, mtv, intersectOpt) {\n  if (!baseLayoutInfo || !targetLayoutInfo) {\n    return false;\n  }\n  if (baseLayoutInfo.label && baseLayoutInfo.label.ignore || targetLayoutInfo.label && targetLayoutInfo.label.ignore) {\n    return false;\n  }\n  // Fast rejection.\n  if (!baseLayoutInfo.rect.intersect(targetLayoutInfo.rect, mtv, intersectOpt)) {\n    return false;\n  }\n  if (baseLayoutInfo.axisAligned && targetLayoutInfo.axisAligned) {\n    return true; // obb is the same as the normal bounding rect.\n  }\n  return ensureOBB(baseLayoutInfo).intersect(ensureOBB(targetLayoutInfo), mtv, intersectOpt);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// TODO: move labels out of viewport.\nimport { BoundingRect, updateProps, initProps, isElementRemoved } from '../util/graphic.js';\nimport { getECData } from '../util/innerStore.js';\nimport { parsePercent } from '../util/number.js';\nimport Transformable from 'zrender/lib/core/Transformable.js';\nimport { updateLabelLinePoints, setLabelLineStyle, getLabelLineStatesModels } from './labelGuideHelper.js';\nimport { makeInner } from '../util/model.js';\nimport { retrieve2, each, keys, isFunction, filter, indexOf } from 'zrender/lib/core/util.js';\nimport { hideOverlap, shiftLayoutOnXY, restoreIgnore, newLabelLayoutWithGeometry } from './labelLayoutHelper.js';\nimport { labelInner, animateLabelValue } from './labelStyle.js';\nimport { normalizeRadian } from 'zrender/lib/contain/util.js';\nfunction cloneArr(points) {\n  if (points) {\n    var newPoints = [];\n    for (var i = 0; i < points.length; i++) {\n      newPoints.push(points[i].slice());\n    }\n    return newPoints;\n  }\n}\nfunction prepareLayoutCallbackParams(labelItem, hostEl) {\n  var label = labelItem.label;\n  var labelLine = hostEl && hostEl.getTextGuideLine();\n  return {\n    dataIndex: labelItem.dataIndex,\n    dataType: labelItem.dataType,\n    seriesIndex: labelItem.seriesModel.seriesIndex,\n    text: labelItem.label.style.text,\n    rect: labelItem.hostRect,\n    labelRect: labelItem.rect,\n    // x: labelAttr.x,\n    // y: labelAttr.y,\n    align: label.style.align,\n    verticalAlign: label.style.verticalAlign,\n    labelLinePoints: cloneArr(labelLine && labelLine.shape.points)\n  };\n}\nvar LABEL_OPTION_TO_STYLE_KEYS = ['align', 'verticalAlign', 'width', 'height', 'fontSize'];\nvar dummyTransformable = new Transformable();\nvar labelLayoutInnerStore = makeInner();\nvar labelLineAnimationStore = makeInner();\nfunction extendWithKeys(target, source, keys) {\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (source[key] != null) {\n      target[key] = source[key];\n    }\n  }\n}\nvar LABEL_LAYOUT_PROPS = ['x', 'y', 'rotation'];\nvar LabelManager = /** @class */function () {\n  function LabelManager() {\n    this._labelList = [];\n    this._chartViewList = [];\n  }\n  LabelManager.prototype.clearLabels = function () {\n    this._labelList = [];\n    this._chartViewList = [];\n  };\n  /**\n   * Add label to manager\n   */\n  LabelManager.prototype._addLabel = function (dataIndex, dataType, seriesModel, label, layoutOptionOrCb) {\n    var labelStyle = label.style;\n    var hostEl = label.__hostTarget;\n    var textConfig = hostEl.textConfig || {};\n    // TODO: If label is in other state.\n    var labelTransform = label.getComputedTransform();\n    var labelRect = label.getBoundingRect().plain();\n    BoundingRect.applyTransform(labelRect, labelRect, labelTransform);\n    if (labelTransform) {\n      dummyTransformable.setLocalTransform(labelTransform);\n    } else {\n      // Identity transform.\n      dummyTransformable.x = dummyTransformable.y = dummyTransformable.rotation = dummyTransformable.originX = dummyTransformable.originY = 0;\n      dummyTransformable.scaleX = dummyTransformable.scaleY = 1;\n    }\n    dummyTransformable.rotation = normalizeRadian(dummyTransformable.rotation);\n    var host = label.__hostTarget;\n    var hostRect;\n    if (host) {\n      hostRect = host.getBoundingRect().plain();\n      var transform = host.getComputedTransform();\n      BoundingRect.applyTransform(hostRect, hostRect, transform);\n    }\n    var labelGuide = hostRect && host.getTextGuideLine();\n    this._labelList.push({\n      label: label,\n      labelLine: labelGuide,\n      seriesModel: seriesModel,\n      dataIndex: dataIndex,\n      dataType: dataType,\n      layoutOptionOrCb: layoutOptionOrCb,\n      layoutOption: null,\n      rect: labelRect,\n      hostRect: hostRect,\n      // Label with lower priority will be hidden when overlapped\n      // Use rect size as default priority\n      priority: hostRect ? hostRect.width * hostRect.height : 0,\n      // Save default label attributes.\n      // For restore if developers want get back to default value in callback.\n      defaultAttr: {\n        ignore: label.ignore,\n        labelGuideIgnore: labelGuide && labelGuide.ignore,\n        x: dummyTransformable.x,\n        y: dummyTransformable.y,\n        scaleX: dummyTransformable.scaleX,\n        scaleY: dummyTransformable.scaleY,\n        rotation: dummyTransformable.rotation,\n        style: {\n          x: labelStyle.x,\n          y: labelStyle.y,\n          align: labelStyle.align,\n          verticalAlign: labelStyle.verticalAlign,\n          width: labelStyle.width,\n          height: labelStyle.height,\n          fontSize: labelStyle.fontSize\n        },\n        cursor: label.cursor,\n        attachedPos: textConfig.position,\n        attachedRot: textConfig.rotation\n      }\n    });\n  };\n  LabelManager.prototype.addLabelsOfSeries = function (chartView) {\n    var _this = this;\n    this._chartViewList.push(chartView);\n    var seriesModel = chartView.__model;\n    var layoutOption = seriesModel.get('labelLayout');\n    /**\n     * Ignore layouting if it's not specified anything.\n     */\n    if (!(isFunction(layoutOption) || keys(layoutOption).length)) {\n      return;\n    }\n    chartView.group.traverse(function (child) {\n      if (child.ignore) {\n        return true; // Stop traverse descendants.\n      }\n      // Only support label being hosted on graphic elements.\n      var textEl = child.getTextContent();\n      var ecData = getECData(child);\n      // Can only attach the text on the element with dataIndex\n      if (textEl && !textEl.disableLabelLayout) {\n        _this._addLabel(ecData.dataIndex, ecData.dataType, seriesModel, textEl, layoutOption);\n      }\n    });\n  };\n  LabelManager.prototype.updateLayoutConfig = function (api) {\n    var width = api.getWidth();\n    var height = api.getHeight();\n    function createDragHandler(el, labelLineModel) {\n      return function () {\n        updateLabelLinePoints(el, labelLineModel);\n      };\n    }\n    for (var i = 0; i < this._labelList.length; i++) {\n      var labelItem = this._labelList[i];\n      var label = labelItem.label;\n      var hostEl = label.__hostTarget;\n      var defaultLabelAttr = labelItem.defaultAttr;\n      var layoutOption = void 0;\n      // TODO A global layout option?\n      if (isFunction(labelItem.layoutOptionOrCb)) {\n        layoutOption = labelItem.layoutOptionOrCb(prepareLayoutCallbackParams(labelItem, hostEl));\n      } else {\n        layoutOption = labelItem.layoutOptionOrCb;\n      }\n      layoutOption = layoutOption || {};\n      labelItem.layoutOption = layoutOption;\n      var degreeToRadian = Math.PI / 180;\n      // TODO hostEl should always exists.\n      // Or label should not have parent because the x, y is all in global space.\n      if (hostEl) {\n        hostEl.setTextConfig({\n          // Force to set local false.\n          local: false,\n          // Ignore position and rotation config on the host el if x or y is changed.\n          position: layoutOption.x != null || layoutOption.y != null ? null : defaultLabelAttr.attachedPos,\n          // Ignore rotation config on the host el if rotation is changed.\n          rotation: layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.attachedRot,\n          offset: [layoutOption.dx || 0, layoutOption.dy || 0]\n        });\n      }\n      var needsUpdateLabelLine = false;\n      if (layoutOption.x != null) {\n        // TODO width of chart view.\n        label.x = parsePercent(layoutOption.x, width);\n        label.setStyle('x', 0); // Ignore movement in style. TODO: origin.\n        needsUpdateLabelLine = true;\n      } else {\n        label.x = defaultLabelAttr.x;\n        label.setStyle('x', defaultLabelAttr.style.x);\n      }\n      if (layoutOption.y != null) {\n        // TODO height of chart view.\n        label.y = parsePercent(layoutOption.y, height);\n        label.setStyle('y', 0); // Ignore movement in style.\n        needsUpdateLabelLine = true;\n      } else {\n        label.y = defaultLabelAttr.y;\n        label.setStyle('y', defaultLabelAttr.style.y);\n      }\n      if (layoutOption.labelLinePoints) {\n        var guideLine = hostEl.getTextGuideLine();\n        if (guideLine) {\n          guideLine.setShape({\n            points: layoutOption.labelLinePoints\n          });\n          // Not update\n          needsUpdateLabelLine = false;\n        }\n      }\n      var labelLayoutStore = labelLayoutInnerStore(label);\n      labelLayoutStore.needsUpdateLabelLine = needsUpdateLabelLine;\n      label.rotation = layoutOption.rotate != null ? layoutOption.rotate * degreeToRadian : defaultLabelAttr.rotation;\n      label.scaleX = defaultLabelAttr.scaleX;\n      label.scaleY = defaultLabelAttr.scaleY;\n      for (var k = 0; k < LABEL_OPTION_TO_STYLE_KEYS.length; k++) {\n        var key = LABEL_OPTION_TO_STYLE_KEYS[k];\n        label.setStyle(key, layoutOption[key] != null ? layoutOption[key] : defaultLabelAttr.style[key]);\n      }\n      if (layoutOption.draggable) {\n        label.draggable = true;\n        label.cursor = 'move';\n        if (hostEl) {\n          var hostModel = labelItem.seriesModel;\n          if (labelItem.dataIndex != null) {\n            var data = labelItem.seriesModel.getData(labelItem.dataType);\n            hostModel = data.getItemModel(labelItem.dataIndex);\n          }\n          label.on('drag', createDragHandler(hostEl, hostModel.getModel('labelLine')));\n        }\n      } else {\n        // TODO Other drag functions?\n        label.off('drag');\n        label.cursor = defaultLabelAttr.cursor;\n      }\n    }\n  };\n  LabelManager.prototype.layout = function (api) {\n    var width = api.getWidth();\n    var height = api.getHeight();\n    var labelList = [];\n    each(this._labelList, function (inputItem) {\n      if (!inputItem.defaultAttr.ignore) {\n        labelList.push(newLabelLayoutWithGeometry({}, inputItem));\n      }\n    });\n    var labelsNeedsAdjustOnX = filter(labelList, function (item) {\n      return item.layoutOption.moveOverlap === 'shiftX';\n    });\n    var labelsNeedsAdjustOnY = filter(labelList, function (item) {\n      return item.layoutOption.moveOverlap === 'shiftY';\n    });\n    shiftLayoutOnXY(labelsNeedsAdjustOnX, 0, 0, width);\n    shiftLayoutOnXY(labelsNeedsAdjustOnY, 1, 0, height);\n    var labelsNeedsHideOverlap = filter(labelList, function (item) {\n      return item.layoutOption.hideOverlap;\n    });\n    restoreIgnore(labelsNeedsHideOverlap);\n    hideOverlap(labelsNeedsHideOverlap);\n  };\n  /**\n   * Process all labels. Not only labels with layoutOption.\n   */\n  LabelManager.prototype.processLabelsOverall = function () {\n    var _this = this;\n    each(this._chartViewList, function (chartView) {\n      var seriesModel = chartView.__model;\n      var ignoreLabelLineUpdate = chartView.ignoreLabelLineUpdate;\n      var animationEnabled = seriesModel.isAnimationEnabled();\n      chartView.group.traverse(function (child) {\n        if (child.ignore && !child.forceLabelAnimation) {\n          return true; // Stop traverse descendants.\n        }\n        var needsUpdateLabelLine = !ignoreLabelLineUpdate;\n        var label = child.getTextContent();\n        if (!needsUpdateLabelLine && label) {\n          needsUpdateLabelLine = labelLayoutInnerStore(label).needsUpdateLabelLine;\n        }\n        if (needsUpdateLabelLine) {\n          _this._updateLabelLine(child, seriesModel);\n        }\n        if (animationEnabled) {\n          _this._animateLabels(child, seriesModel);\n        }\n      });\n    });\n  };\n  LabelManager.prototype._updateLabelLine = function (el, seriesModel) {\n    // Only support label being hosted on graphic elements.\n    var textEl = el.getTextContent();\n    // Update label line style.\n    var ecData = getECData(el);\n    var dataIndex = ecData.dataIndex;\n    // Only support labelLine on the labels represent data.\n    if (textEl && dataIndex != null) {\n      var data = seriesModel.getData(ecData.dataType);\n      var itemModel = data.getItemModel(dataIndex);\n      var defaultStyle = {};\n      var visualStyle = data.getItemVisual(dataIndex, 'style');\n      if (visualStyle) {\n        var visualType = data.getVisual('drawType');\n        // Default to be same with main color\n        defaultStyle.stroke = visualStyle[visualType];\n      }\n      var labelLineModel = itemModel.getModel('labelLine');\n      setLabelLineStyle(el, getLabelLineStatesModels(itemModel), defaultStyle);\n      updateLabelLinePoints(el, labelLineModel);\n    }\n  };\n  LabelManager.prototype._animateLabels = function (el, seriesModel) {\n    var textEl = el.getTextContent();\n    var guideLine = el.getTextGuideLine();\n    // Animate\n    if (textEl\n    // `forceLabelAnimation` has the highest priority\n    && (el.forceLabelAnimation || !textEl.ignore && !textEl.invisible && !el.disableLabelAnimation && !isElementRemoved(el))) {\n      var layoutStore = labelLayoutInnerStore(textEl);\n      var oldLayout = layoutStore.oldLayout;\n      var ecData = getECData(el);\n      var dataIndex = ecData.dataIndex;\n      var newProps = {\n        x: textEl.x,\n        y: textEl.y,\n        rotation: textEl.rotation\n      };\n      var data = seriesModel.getData(ecData.dataType);\n      if (!oldLayout) {\n        textEl.attr(newProps);\n        // Disable fade in animation if value animation is enabled.\n        if (!labelInner(textEl).valueAnimation) {\n          var oldOpacity = retrieve2(textEl.style.opacity, 1);\n          // Fade in animation\n          textEl.style.opacity = 0;\n          initProps(textEl, {\n            style: {\n              opacity: oldOpacity\n            }\n          }, seriesModel, dataIndex);\n        }\n      } else {\n        textEl.attr(oldLayout);\n        // Make sure the animation from is in the right status.\n        var prevStates = el.prevStates;\n        if (prevStates) {\n          if (indexOf(prevStates, 'select') >= 0) {\n            textEl.attr(layoutStore.oldLayoutSelect);\n          }\n          if (indexOf(prevStates, 'emphasis') >= 0) {\n            textEl.attr(layoutStore.oldLayoutEmphasis);\n          }\n        }\n        updateProps(textEl, newProps, seriesModel, dataIndex);\n      }\n      layoutStore.oldLayout = newProps;\n      if (textEl.states.select) {\n        var layoutSelect = layoutStore.oldLayoutSelect = {};\n        extendWithKeys(layoutSelect, newProps, LABEL_LAYOUT_PROPS);\n        extendWithKeys(layoutSelect, textEl.states.select, LABEL_LAYOUT_PROPS);\n      }\n      if (textEl.states.emphasis) {\n        var layoutEmphasis = layoutStore.oldLayoutEmphasis = {};\n        extendWithKeys(layoutEmphasis, newProps, LABEL_LAYOUT_PROPS);\n        extendWithKeys(layoutEmphasis, textEl.states.emphasis, LABEL_LAYOUT_PROPS);\n      }\n      animateLabelValue(textEl, dataIndex, data, seriesModel, seriesModel);\n    }\n    if (guideLine && !guideLine.ignore && !guideLine.invisible) {\n      var layoutStore = labelLineAnimationStore(guideLine);\n      var oldLayout = layoutStore.oldLayout;\n      var newLayout = {\n        points: guideLine.shape.points\n      };\n      if (!oldLayout) {\n        guideLine.setShape(newLayout);\n        guideLine.style.strokePercent = 0;\n        initProps(guideLine, {\n          style: {\n            strokePercent: 1\n          }\n        }, seriesModel);\n      } else {\n        guideLine.attr({\n          shape: oldLayout\n        });\n        updateProps(guideLine, {\n          shape: newLayout\n        }, seriesModel);\n      }\n      layoutStore.oldLayout = newLayout;\n    }\n  };\n  return LabelManager;\n}();\nexport default LabelManager;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner } from '../util/model.js';\nimport LabelManager from './LabelManager.js';\nvar getLabelManager = makeInner();\nexport function installLabelLayout(registers) {\n  registers.registerUpdateLifecycle('series:beforeupdate', function (ecModel, api, params) {\n    // TODO api provide an namespace that can save stuff per instance\n    var labelManager = getLabelManager(api).labelManager;\n    if (!labelManager) {\n      labelManager = getLabelManager(api).labelManager = new LabelManager();\n    }\n    labelManager.clearLabels();\n  });\n  registers.registerUpdateLifecycle('series:layoutlabels', function (ecModel, api, params) {\n    var labelManager = getLabelManager(api).labelManager;\n    params.updatedSeries.forEach(function (series) {\n      labelManager.addLabelsOfSeries(api.getViewOfSeriesModel(series));\n    });\n    labelManager.updateLayoutConfig(api);\n    labelManager.layout(api);\n    labelManager.processLabelsOverall();\n  });\n}", "import { isAroundZero } from './helper.js';\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI = Math.PI;\nvar PI2 = Math.PI * 2;\nvar degree = 180 / PI;\nvar SVGPathRebuilder = (function () {\n    function SVGPathRebuilder() {\n    }\n    SVGPathRebuilder.prototype.reset = function (precision) {\n        this._start = true;\n        this._d = [];\n        this._str = '';\n        this._p = Math.pow(10, precision || 4);\n    };\n    SVGPathRebuilder.prototype.moveTo = function (x, y) {\n        this._add('M', x, y);\n    };\n    SVGPathRebuilder.prototype.lineTo = function (x, y) {\n        this._add('L', x, y);\n    };\n    SVGPathRebuilder.prototype.bezierCurveTo = function (x, y, x2, y2, x3, y3) {\n        this._add('C', x, y, x2, y2, x3, y3);\n    };\n    SVGPathRebuilder.prototype.quadraticCurveTo = function (x, y, x2, y2) {\n        this._add('Q', x, y, x2, y2);\n    };\n    SVGPathRebuilder.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n        this.ellipse(cx, cy, r, r, 0, startAngle, endAngle, anticlockwise);\n    };\n    SVGPathRebuilder.prototype.ellipse = function (cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise) {\n        var dTheta = endAngle - startAngle;\n        var clockwise = !anticlockwise;\n        var dThetaPositive = Math.abs(dTheta);\n        var isCircle = isAroundZero(dThetaPositive - PI2)\n            || (clockwise ? dTheta >= PI2 : -dTheta >= PI2);\n        var unifiedTheta = dTheta > 0 ? dTheta % PI2 : (dTheta % PI2 + PI2);\n        var large = false;\n        if (isCircle) {\n            large = true;\n        }\n        else if (isAroundZero(dThetaPositive)) {\n            large = false;\n        }\n        else {\n            large = (unifiedTheta >= PI) === !!clockwise;\n        }\n        var x0 = cx + rx * mathCos(startAngle);\n        var y0 = cy + ry * mathSin(startAngle);\n        if (this._start) {\n            this._add('M', x0, y0);\n        }\n        var xRot = Math.round(psi * degree);\n        if (isCircle) {\n            var p = 1 / this._p;\n            var dTheta_1 = (clockwise ? 1 : -1) * (PI2 - p);\n            this._add('A', rx, ry, xRot, 1, +clockwise, cx + rx * mathCos(startAngle + dTheta_1), cy + ry * mathSin(startAngle + dTheta_1));\n            if (p > 1e-2) {\n                this._add('A', rx, ry, xRot, 0, +clockwise, x0, y0);\n            }\n        }\n        else {\n            var x = cx + rx * mathCos(endAngle);\n            var y = cy + ry * mathSin(endAngle);\n            this._add('A', rx, ry, xRot, +large, +clockwise, x, y);\n        }\n    };\n    SVGPathRebuilder.prototype.rect = function (x, y, w, h) {\n        this._add('M', x, y);\n        this._add('l', w, 0);\n        this._add('l', 0, h);\n        this._add('l', -w, 0);\n        this._add('Z');\n    };\n    SVGPathRebuilder.prototype.closePath = function () {\n        if (this._d.length > 0) {\n            this._add('Z');\n        }\n    };\n    SVGPathRebuilder.prototype._add = function (cmd, a, b, c, d, e, f, g, h) {\n        var vals = [];\n        var p = this._p;\n        for (var i = 1; i < arguments.length; i++) {\n            var val = arguments[i];\n            if (isNaN(val)) {\n                this._invalid = true;\n                return;\n            }\n            vals.push(Math.round(val * p) / p);\n        }\n        this._d.push(cmd + vals.join(' '));\n        this._start = cmd === 'Z';\n    };\n    SVGPathRebuilder.prototype.generateStr = function () {\n        this._str = this._invalid ? '' : this._d.join('');\n        this._d = [];\n    };\n    SVGPathRebuilder.prototype.getStr = function () {\n        return this._str;\n    };\n    return SVGPathRebuilder;\n}());\nexport default SVGPathRebuilder;\n", "import { DEFAULT_PATH_STYLE } from '../graphic/Path.js';\nimport ZRImage from '../graphic/Image.js';\nimport { getLineDash } from '../canvas/dashStyle.js';\nimport { map } from '../core/util.js';\nimport { normalizeColor } from './helper.js';\nvar NONE = 'none';\nvar mathRound = Math.round;\nfunction pathHasFill(style) {\n    var fill = style.fill;\n    return fill != null && fill !== NONE;\n}\nfunction pathHasStroke(style) {\n    var stroke = style.stroke;\n    return stroke != null && stroke !== NONE;\n}\nvar strokeProps = ['lineCap', 'miterLimit', 'lineJoin'];\nvar svgStrokeProps = map(strokeProps, function (prop) { return \"stroke-\" + prop.toLowerCase(); });\nexport default function mapStyleToAttrs(updateAttr, style, el, forceUpdate) {\n    var opacity = style.opacity == null ? 1 : style.opacity;\n    if (el instanceof ZRImage) {\n        updateAttr('opacity', opacity);\n        return;\n    }\n    if (pathHasFill(style)) {\n        var fill = normalizeColor(style.fill);\n        updateAttr('fill', fill.color);\n        var fillOpacity = style.fillOpacity != null\n            ? style.fillOpacity * fill.opacity * opacity\n            : fill.opacity * opacity;\n        if (forceUpdate || fillOpacity < 1) {\n            updateAttr('fill-opacity', fillOpacity);\n        }\n    }\n    else {\n        updateAttr('fill', NONE);\n    }\n    if (pathHasStroke(style)) {\n        var stroke = normalizeColor(style.stroke);\n        updateAttr('stroke', stroke.color);\n        var strokeScale = style.strokeNoScale\n            ? el.getLineScale()\n            : 1;\n        var strokeWidth = (strokeScale ? (style.lineWidth || 0) / strokeScale : 0);\n        var strokeOpacity = style.strokeOpacity != null\n            ? style.strokeOpacity * stroke.opacity * opacity\n            : stroke.opacity * opacity;\n        var strokeFirst = style.strokeFirst;\n        if (forceUpdate || strokeWidth !== 1) {\n            updateAttr('stroke-width', strokeWidth);\n        }\n        if (forceUpdate || strokeFirst) {\n            updateAttr('paint-order', strokeFirst ? 'stroke' : 'fill');\n        }\n        if (forceUpdate || strokeOpacity < 1) {\n            updateAttr('stroke-opacity', strokeOpacity);\n        }\n        if (style.lineDash) {\n            var _a = getLineDash(el), lineDash = _a[0], lineDashOffset = _a[1];\n            if (lineDash) {\n                lineDashOffset = mathRound(lineDashOffset || 0);\n                updateAttr('stroke-dasharray', lineDash.join(','));\n                if (lineDashOffset || forceUpdate) {\n                    updateAttr('stroke-dashoffset', lineDashOffset);\n                }\n            }\n        }\n        else if (forceUpdate) {\n            updateAttr('stroke-dasharray', NONE);\n        }\n        for (var i = 0; i < strokeProps.length; i++) {\n            var propName = strokeProps[i];\n            if (forceUpdate || style[propName] !== DEFAULT_PATH_STYLE[propName]) {\n                var val = style[propName] || DEFAULT_PATH_STYLE[propName];\n                val && updateAttr(svgStrokeProps[i], val);\n            }\n        }\n    }\n    else if (forceUpdate) {\n        updateAttr('stroke', NONE);\n    }\n}\n", "import { keys, map } from '../core/util.js';\nimport { encodeHTML } from '../core/dom.js';\nexport var SVGNS = 'http://www.w3.org/2000/svg';\nexport var XLINKNS = 'http://www.w3.org/1999/xlink';\nexport var XMLNS = 'http://www.w3.org/2000/xmlns/';\nexport var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace';\nexport var META_DATA_PREFIX = 'ecmeta_';\nexport function createElement(name) {\n    return document.createElementNS(SVGNS, name);\n}\n;\nexport function createVNode(tag, key, attrs, children, text) {\n    return {\n        tag: tag,\n        attrs: attrs || {},\n        children: children,\n        text: text,\n        key: key\n    };\n}\nfunction createElementOpen(name, attrs) {\n    var attrsStr = [];\n    if (attrs) {\n        for (var key in attrs) {\n            var val = attrs[key];\n            var part = key;\n            if (val === false) {\n                continue;\n            }\n            else if (val !== true && val != null) {\n                part += \"=\\\"\" + val + \"\\\"\";\n            }\n            attrsStr.push(part);\n        }\n    }\n    return \"<\" + name + \" \" + attrsStr.join(' ') + \">\";\n}\nfunction createElementClose(name) {\n    return \"</\" + name + \">\";\n}\nexport function vNodeToString(el, opts) {\n    opts = opts || {};\n    var S = opts.newline ? '\\n' : '';\n    function convertElToString(el) {\n        var children = el.children, tag = el.tag, attrs = el.attrs, text = el.text;\n        return createElementOpen(tag, attrs)\n            + (tag !== 'style' ? encodeHTML(text) : text || '')\n            + (children ? \"\" + S + map(children, function (child) { return convertElToString(child); }).join(S) + S : '')\n            + createElementClose(tag);\n    }\n    return convertElToString(el);\n}\nexport function getCssString(selectorNodes, animationNodes, opts) {\n    opts = opts || {};\n    var S = opts.newline ? '\\n' : '';\n    var bracketBegin = \" {\" + S;\n    var bracketEnd = S + \"}\";\n    var selectors = map(keys(selectorNodes), function (className) {\n        return className + bracketBegin + map(keys(selectorNodes[className]), function (attrName) {\n            return attrName + \":\" + selectorNodes[className][attrName] + \";\";\n        }).join(S) + bracketEnd;\n    }).join(S);\n    var animations = map(keys(animationNodes), function (animationName) {\n        return \"@keyframes \" + animationName + bracketBegin + map(keys(animationNodes[animationName]), function (percent) {\n            return percent + bracketBegin + map(keys(animationNodes[animationName][percent]), function (attrName) {\n                var val = animationNodes[animationName][percent][attrName];\n                if (attrName === 'd') {\n                    val = \"path(\\\"\" + val + \"\\\")\";\n                }\n                return attrName + \":\" + val + \";\";\n            }).join(S) + bracketEnd;\n        }).join(S) + bracketEnd;\n    }).join(S);\n    if (!selectors && !animations) {\n        return '';\n    }\n    return ['<![CDATA[', selectors, animations, ']]>'].join(S);\n}\nexport function createBrushScope(zrId) {\n    return {\n        zrId: zrId,\n        shadowCache: {},\n        patternCache: {},\n        gradientCache: {},\n        clipPathCache: {},\n        defs: {},\n        cssNodes: {},\n        cssAnims: {},\n        cssStyleCache: {},\n        cssAnimIdx: 0,\n        shadowIdx: 0,\n        gradientIdx: 0,\n        patternIdx: 0,\n        clipPathIdx: 0\n    };\n}\nexport function createSVGVNode(width, height, children, useViewBox) {\n    return createVNode('svg', 'root', {\n        'width': width,\n        'height': height,\n        'xmlns': SVGNS,\n        'xmlns:xlink': XLINKNS,\n        'version': '1.1',\n        'baseProfile': 'full',\n        'viewBox': useViewBox ? \"0 0 \" + width + \" \" + height : false\n    }, children);\n}\n", "var cssClassIdx = 0;\nexport function getClassId() {\n    return cssClassIdx++;\n}\n", "import { copyTransform } from '../core/Transformable.js';\nimport { createBrushScope } from './core.js';\nimport SVGPathRebuilder from './SVGPathRebuilder.js';\nimport PathProxy from '../core/PathProxy.js';\nimport { getPathPrecision, getSRTTransformString } from './helper.js';\nimport { each, extend, filter, isNumber, isString, keys } from '../core/util.js';\nimport CompoundPath from '../graphic/CompoundPath.js';\nimport { createCubicEasingFunc } from '../animation/cubicEasing.js';\nimport { getClassId } from './cssClassId.js';\nexport var EASING_MAP = {\n    cubicIn: '0.32,0,0.67,0',\n    cubicOut: '0.33,1,0.68,1',\n    cubicInOut: '0.65,0,0.35,1',\n    quadraticIn: '0.11,0,0.5,0',\n    quadraticOut: '0.5,1,0.89,1',\n    quadraticInOut: '0.45,0,0.55,1',\n    quarticIn: '0.5,0,0.75,0',\n    quarticOut: '0.25,1,0.5,1',\n    quarticInOut: '0.76,0,0.24,1',\n    quinticIn: '0.64,0,0.78,0',\n    quinticOut: '0.22,1,0.36,1',\n    quinticInOut: '0.83,0,0.17,1',\n    sinusoidalIn: '0.12,0,0.39,0',\n    sinusoidalOut: '0.61,1,0.88,1',\n    sinusoidalInOut: '0.37,0,0.63,1',\n    exponentialIn: '0.7,0,0.84,0',\n    exponentialOut: '0.16,1,0.3,1',\n    exponentialInOut: '0.87,0,0.13,1',\n    circularIn: '0.55,0,1,0.45',\n    circularOut: '0,0.55,0.45,1',\n    circularInOut: '0.85,0,0.15,1'\n};\nvar transformOriginKey = 'transform-origin';\nfunction buildPathString(el, kfShape, path) {\n    var shape = extend({}, el.shape);\n    extend(shape, kfShape);\n    el.buildPath(path, shape);\n    var svgPathBuilder = new SVGPathRebuilder();\n    svgPathBuilder.reset(getPathPrecision(el));\n    path.rebuildPath(svgPathBuilder, 1);\n    svgPathBuilder.generateStr();\n    return svgPathBuilder.getStr();\n}\nfunction setTransformOrigin(target, transform) {\n    var originX = transform.originX, originY = transform.originY;\n    if (originX || originY) {\n        target[transformOriginKey] = originX + \"px \" + originY + \"px\";\n    }\n}\nexport var ANIMATE_STYLE_MAP = {\n    fill: 'fill',\n    opacity: 'opacity',\n    lineWidth: 'stroke-width',\n    lineDashOffset: 'stroke-dashoffset'\n};\nfunction addAnimation(cssAnim, scope) {\n    var animationName = scope.zrId + '-ani-' + scope.cssAnimIdx++;\n    scope.cssAnims[animationName] = cssAnim;\n    return animationName;\n}\nfunction createCompoundPathCSSAnimation(el, attrs, scope) {\n    var paths = el.shape.paths;\n    var composedAnim = {};\n    var cssAnimationCfg;\n    var cssAnimationName;\n    each(paths, function (path) {\n        var subScope = createBrushScope(scope.zrId);\n        subScope.animation = true;\n        createCSSAnimation(path, {}, subScope, true);\n        var cssAnims = subScope.cssAnims;\n        var cssNodes = subScope.cssNodes;\n        var animNames = keys(cssAnims);\n        var len = animNames.length;\n        if (!len) {\n            return;\n        }\n        cssAnimationName = animNames[len - 1];\n        var lastAnim = cssAnims[cssAnimationName];\n        for (var percent in lastAnim) {\n            var kf = lastAnim[percent];\n            composedAnim[percent] = composedAnim[percent] || { d: '' };\n            composedAnim[percent].d += kf.d || '';\n        }\n        for (var className in cssNodes) {\n            var val = cssNodes[className].animation;\n            if (val.indexOf(cssAnimationName) >= 0) {\n                cssAnimationCfg = val;\n            }\n        }\n    });\n    if (!cssAnimationCfg) {\n        return;\n    }\n    attrs.d = false;\n    var animationName = addAnimation(composedAnim, scope);\n    return cssAnimationCfg.replace(cssAnimationName, animationName);\n}\nfunction getEasingFunc(easing) {\n    return isString(easing)\n        ? EASING_MAP[easing]\n            ? \"cubic-bezier(\" + EASING_MAP[easing] + \")\"\n            : createCubicEasingFunc(easing) ? easing : ''\n        : '';\n}\nexport function createCSSAnimation(el, attrs, scope, onlyShape) {\n    var animators = el.animators;\n    var len = animators.length;\n    var cssAnimations = [];\n    if (el instanceof CompoundPath) {\n        var animationCfg = createCompoundPathCSSAnimation(el, attrs, scope);\n        if (animationCfg) {\n            cssAnimations.push(animationCfg);\n        }\n        else if (!len) {\n            return;\n        }\n    }\n    else if (!len) {\n        return;\n    }\n    var groupAnimators = {};\n    for (var i = 0; i < len; i++) {\n        var animator = animators[i];\n        var cfgArr = [animator.getMaxTime() / 1000 + 's'];\n        var easing = getEasingFunc(animator.getClip().easing);\n        var delay = animator.getDelay();\n        if (easing) {\n            cfgArr.push(easing);\n        }\n        else {\n            cfgArr.push('linear');\n        }\n        if (delay) {\n            cfgArr.push(delay / 1000 + 's');\n        }\n        if (animator.getLoop()) {\n            cfgArr.push('infinite');\n        }\n        var cfg = cfgArr.join(' ');\n        groupAnimators[cfg] = groupAnimators[cfg] || [cfg, []];\n        groupAnimators[cfg][1].push(animator);\n    }\n    function createSingleCSSAnimation(groupAnimator) {\n        var animators = groupAnimator[1];\n        var len = animators.length;\n        var transformKfs = {};\n        var shapeKfs = {};\n        var finalKfs = {};\n        var animationTimingFunctionAttrName = 'animation-timing-function';\n        function saveAnimatorTrackToCssKfs(animator, cssKfs, toCssAttrName) {\n            var tracks = animator.getTracks();\n            var maxTime = animator.getMaxTime();\n            for (var k = 0; k < tracks.length; k++) {\n                var track = tracks[k];\n                if (track.needsAnimate()) {\n                    var kfs = track.keyframes;\n                    var attrName = track.propName;\n                    toCssAttrName && (attrName = toCssAttrName(attrName));\n                    if (attrName) {\n                        for (var i = 0; i < kfs.length; i++) {\n                            var kf = kfs[i];\n                            var percent = Math.round(kf.time / maxTime * 100) + '%';\n                            var kfEasing = getEasingFunc(kf.easing);\n                            var rawValue = kf.rawValue;\n                            if (isString(rawValue) || isNumber(rawValue)) {\n                                cssKfs[percent] = cssKfs[percent] || {};\n                                cssKfs[percent][attrName] = kf.rawValue;\n                                if (kfEasing) {\n                                    cssKfs[percent][animationTimingFunctionAttrName] = kfEasing;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        for (var i = 0; i < len; i++) {\n            var animator = animators[i];\n            var targetProp = animator.targetName;\n            if (!targetProp) {\n                !onlyShape && saveAnimatorTrackToCssKfs(animator, transformKfs);\n            }\n            else if (targetProp === 'shape') {\n                saveAnimatorTrackToCssKfs(animator, shapeKfs);\n            }\n        }\n        for (var percent in transformKfs) {\n            var transform = {};\n            copyTransform(transform, el);\n            extend(transform, transformKfs[percent]);\n            var str = getSRTTransformString(transform);\n            var timingFunction = transformKfs[percent][animationTimingFunctionAttrName];\n            finalKfs[percent] = str ? {\n                transform: str\n            } : {};\n            setTransformOrigin(finalKfs[percent], transform);\n            if (timingFunction) {\n                finalKfs[percent][animationTimingFunctionAttrName] = timingFunction;\n            }\n        }\n        ;\n        var path;\n        var canAnimateShape = true;\n        for (var percent in shapeKfs) {\n            finalKfs[percent] = finalKfs[percent] || {};\n            var isFirst = !path;\n            var timingFunction = shapeKfs[percent][animationTimingFunctionAttrName];\n            if (isFirst) {\n                path = new PathProxy();\n            }\n            var len_1 = path.len();\n            path.reset();\n            finalKfs[percent].d = buildPathString(el, shapeKfs[percent], path);\n            var newLen = path.len();\n            if (!isFirst && len_1 !== newLen) {\n                canAnimateShape = false;\n                break;\n            }\n            if (timingFunction) {\n                finalKfs[percent][animationTimingFunctionAttrName] = timingFunction;\n            }\n        }\n        ;\n        if (!canAnimateShape) {\n            for (var percent in finalKfs) {\n                delete finalKfs[percent].d;\n            }\n        }\n        if (!onlyShape) {\n            for (var i = 0; i < len; i++) {\n                var animator = animators[i];\n                var targetProp = animator.targetName;\n                if (targetProp === 'style') {\n                    saveAnimatorTrackToCssKfs(animator, finalKfs, function (propName) { return ANIMATE_STYLE_MAP[propName]; });\n                }\n            }\n        }\n        var percents = keys(finalKfs);\n        var allTransformOriginSame = true;\n        var transformOrigin;\n        for (var i = 1; i < percents.length; i++) {\n            var p0 = percents[i - 1];\n            var p1 = percents[i];\n            if (finalKfs[p0][transformOriginKey] !== finalKfs[p1][transformOriginKey]) {\n                allTransformOriginSame = false;\n                break;\n            }\n            transformOrigin = finalKfs[p0][transformOriginKey];\n        }\n        if (allTransformOriginSame && transformOrigin) {\n            for (var percent in finalKfs) {\n                if (finalKfs[percent][transformOriginKey]) {\n                    delete finalKfs[percent][transformOriginKey];\n                }\n            }\n            attrs[transformOriginKey] = transformOrigin;\n        }\n        if (filter(percents, function (percent) { return keys(finalKfs[percent]).length > 0; }).length) {\n            var animationName = addAnimation(finalKfs, scope);\n            return animationName + \" \" + groupAnimator[0] + \" both\";\n        }\n    }\n    for (var key in groupAnimators) {\n        var animationCfg = createSingleCSSAnimation(groupAnimators[key]);\n        if (animationCfg) {\n            cssAnimations.push(animationCfg);\n        }\n    }\n    if (cssAnimations.length) {\n        var className = scope.zrId + '-cls-' + getClassId();\n        scope.cssNodes['.' + className] = {\n            animation: cssAnimations.join(',')\n        };\n        attrs[\"class\"] = className;\n    }\n}\n", "import { liftColor } from '../tool/color.js';\nimport { getClassId } from './cssClassId.js';\nexport function createCSSEmphasis(el, attrs, scope) {\n    if (!el.ignore) {\n        if (el.isSilent()) {\n            var style = {\n                'pointer-events': 'none'\n            };\n            setClassAttribute(style, attrs, scope, true);\n        }\n        else {\n            var emphasisStyle = el.states.emphasis && el.states.emphasis.style\n                ? el.states.emphasis.style\n                : {};\n            var fill = emphasisStyle.fill;\n            if (!fill) {\n                var normalFill = el.style && el.style.fill;\n                var selectFill = el.states.select\n                    && el.states.select.style\n                    && el.states.select.style.fill;\n                var fromFill = el.currentStates.indexOf('select') >= 0\n                    ? (selectFill || normalFill)\n                    : normalFill;\n                if (fromFill) {\n                    fill = liftColor(fromFill);\n                }\n            }\n            var lineWidth = emphasisStyle.lineWidth;\n            if (lineWidth) {\n                var scaleX = (!emphasisStyle.strokeNoScale && el.transform)\n                    ? el.transform[0]\n                    : 1;\n                lineWidth = lineWidth / scaleX;\n            }\n            var style = {\n                cursor: 'pointer'\n            };\n            if (fill) {\n                style.fill = fill;\n            }\n            if (emphasisStyle.stroke) {\n                style.stroke = emphasisStyle.stroke;\n            }\n            if (lineWidth) {\n                style['stroke-width'] = lineWidth;\n            }\n            setClassAttribute(style, attrs, scope, true);\n        }\n    }\n}\nfunction setClassAttribute(style, attrs, scope, withHover) {\n    var styleKey = JSON.stringify(style);\n    var className = scope.cssStyleCache[styleKey];\n    if (!className) {\n        className = scope.zrId + '-cls-' + getClassId();\n        scope.cssStyleCache[styleKey] = className;\n        scope.cssNodes['.' + className + (withHover ? ':hover' : '')] = style;\n    }\n    attrs[\"class\"] = attrs[\"class\"] ? (attrs[\"class\"] + ' ' + className) : className;\n}\n", "import { adjustTextY, getIdURL, getMatrixStr, getPathPrecision, getShadowKey, getSRTTransformString, hasShadow, isAroundZero, isGradient, isImagePattern, isLinearGradient, isPattern, isRadialGradient, normalizeColor, round4, TEXT_ALIGN_TO_ANCHOR } from './helper.js';\nimport Path from '../graphic/Path.js';\nimport ZRImage from '../graphic/Image.js';\nimport { getLineHeight } from '../contain/text.js';\nimport TSpan from '../graphic/TSpan.js';\nimport SVGPathRebuilder from './SVGPathRebuilder.js';\nimport mapStyleToAttrs from './mapStyleToAttrs.js';\nimport { createVNode, vNodeToString, META_DATA_PREFIX } from './core.js';\nimport { assert, clone, isFunction, isString, logError, map, retrieve2 } from '../core/util.js';\nimport { createOrUpdateImage } from '../graphic/helper/image.js';\nimport { createCSSAnimation } from './cssAnimation.js';\nimport { hasSeparateFont, parseFontSize } from '../graphic/Text.js';\nimport { DEFAULT_FONT, DEFAULT_FONT_FAMILY } from '../core/platform.js';\nimport { createCSSEmphasis } from './cssEmphasis.js';\nimport { getElementSSRData } from '../zrender.js';\nvar round = Math.round;\nfunction isImageLike(val) {\n    return val && isString(val.src);\n}\nfunction isCanvasLike(val) {\n    return val && isFunction(val.toDataURL);\n}\nfunction setStyleAttrs(attrs, style, el, scope) {\n    mapStyleToAttrs(function (key, val) {\n        var isFillStroke = key === 'fill' || key === 'stroke';\n        if (isFillStroke && isGradient(val)) {\n            setGradient(style, attrs, key, scope);\n        }\n        else if (isFillStroke && isPattern(val)) {\n            setPattern(el, attrs, key, scope);\n        }\n        else {\n            attrs[key] = val;\n        }\n        if (isFillStroke && scope.ssr && val === 'none') {\n            attrs['pointer-events'] = 'visible';\n        }\n    }, style, el, false);\n    setShadow(el, attrs, scope);\n}\nfunction setMetaData(attrs, el) {\n    var metaData = getElementSSRData(el);\n    if (metaData) {\n        metaData.each(function (val, key) {\n            val != null && (attrs[(META_DATA_PREFIX + key).toLowerCase()] = val + '');\n        });\n        if (el.isSilent()) {\n            attrs[META_DATA_PREFIX + 'silent'] = 'true';\n        }\n    }\n}\nfunction noRotateScale(m) {\n    return isAroundZero(m[0] - 1)\n        && isAroundZero(m[1])\n        && isAroundZero(m[2])\n        && isAroundZero(m[3] - 1);\n}\nfunction noTranslate(m) {\n    return isAroundZero(m[4]) && isAroundZero(m[5]);\n}\nfunction setTransform(attrs, m, compress) {\n    if (m && !(noTranslate(m) && noRotateScale(m))) {\n        var mul = compress ? 10 : 1e4;\n        attrs.transform = noRotateScale(m)\n            ? \"translate(\" + round(m[4] * mul) / mul + \" \" + round(m[5] * mul) / mul + \")\" : getMatrixStr(m);\n    }\n}\nfunction convertPolyShape(shape, attrs, mul) {\n    var points = shape.points;\n    var strArr = [];\n    for (var i = 0; i < points.length; i++) {\n        strArr.push(round(points[i][0] * mul) / mul);\n        strArr.push(round(points[i][1] * mul) / mul);\n    }\n    attrs.points = strArr.join(' ');\n}\nfunction validatePolyShape(shape) {\n    return !shape.smooth;\n}\nfunction createAttrsConvert(desc) {\n    var normalizedDesc = map(desc, function (item) {\n        return (typeof item === 'string' ? [item, item] : item);\n    });\n    return function (shape, attrs, mul) {\n        for (var i = 0; i < normalizedDesc.length; i++) {\n            var item = normalizedDesc[i];\n            var val = shape[item[0]];\n            if (val != null) {\n                attrs[item[1]] = round(val * mul) / mul;\n            }\n        }\n    };\n}\nvar builtinShapesDef = {\n    circle: [createAttrsConvert(['cx', 'cy', 'r'])],\n    polyline: [convertPolyShape, validatePolyShape],\n    polygon: [convertPolyShape, validatePolyShape]\n};\nfunction hasShapeAnimation(el) {\n    var animators = el.animators;\n    for (var i = 0; i < animators.length; i++) {\n        if (animators[i].targetName === 'shape') {\n            return true;\n        }\n    }\n    return false;\n}\nexport function brushSVGPath(el, scope) {\n    var style = el.style;\n    var shape = el.shape;\n    var builtinShpDef = builtinShapesDef[el.type];\n    var attrs = {};\n    var needsAnimate = scope.animation;\n    var svgElType = 'path';\n    var strokePercent = el.style.strokePercent;\n    var precision = (scope.compress && getPathPrecision(el)) || 4;\n    if (builtinShpDef\n        && !scope.willUpdate\n        && !(builtinShpDef[1] && !builtinShpDef[1](shape))\n        && !(needsAnimate && hasShapeAnimation(el))\n        && !(strokePercent < 1)) {\n        svgElType = el.type;\n        var mul = Math.pow(10, precision);\n        builtinShpDef[0](shape, attrs, mul);\n    }\n    else {\n        var needBuildPath = !el.path || el.shapeChanged();\n        if (!el.path) {\n            el.createPathProxy();\n        }\n        var path = el.path;\n        if (needBuildPath) {\n            path.beginPath();\n            el.buildPath(path, el.shape);\n            el.pathUpdated();\n        }\n        var pathVersion = path.getVersion();\n        var elExt = el;\n        var svgPathBuilder = elExt.__svgPathBuilder;\n        if (elExt.__svgPathVersion !== pathVersion\n            || !svgPathBuilder\n            || strokePercent !== elExt.__svgPathStrokePercent) {\n            if (!svgPathBuilder) {\n                svgPathBuilder = elExt.__svgPathBuilder = new SVGPathRebuilder();\n            }\n            svgPathBuilder.reset(precision);\n            path.rebuildPath(svgPathBuilder, strokePercent);\n            svgPathBuilder.generateStr();\n            elExt.__svgPathVersion = pathVersion;\n            elExt.__svgPathStrokePercent = strokePercent;\n        }\n        attrs.d = svgPathBuilder.getStr();\n    }\n    setTransform(attrs, el.transform);\n    setStyleAttrs(attrs, style, el, scope);\n    setMetaData(attrs, el);\n    scope.animation && createCSSAnimation(el, attrs, scope);\n    scope.emphasis && createCSSEmphasis(el, attrs, scope);\n    return createVNode(svgElType, el.id + '', attrs);\n}\nexport function brushSVGImage(el, scope) {\n    var style = el.style;\n    var image = style.image;\n    if (image && !isString(image)) {\n        if (isImageLike(image)) {\n            image = image.src;\n        }\n        else if (isCanvasLike(image)) {\n            image = image.toDataURL();\n        }\n    }\n    if (!image) {\n        return;\n    }\n    var x = style.x || 0;\n    var y = style.y || 0;\n    var dw = style.width;\n    var dh = style.height;\n    var attrs = {\n        href: image,\n        width: dw,\n        height: dh\n    };\n    if (x) {\n        attrs.x = x;\n    }\n    if (y) {\n        attrs.y = y;\n    }\n    setTransform(attrs, el.transform);\n    setStyleAttrs(attrs, style, el, scope);\n    setMetaData(attrs, el);\n    scope.animation && createCSSAnimation(el, attrs, scope);\n    return createVNode('image', el.id + '', attrs);\n}\n;\nexport function brushSVGTSpan(el, scope) {\n    var style = el.style;\n    var text = style.text;\n    text != null && (text += '');\n    if (!text || isNaN(style.x) || isNaN(style.y)) {\n        return;\n    }\n    var font = style.font || DEFAULT_FONT;\n    var x = style.x || 0;\n    var y = adjustTextY(style.y || 0, getLineHeight(font), style.textBaseline);\n    var textAlign = TEXT_ALIGN_TO_ANCHOR[style.textAlign]\n        || style.textAlign;\n    var attrs = {\n        'dominant-baseline': 'central',\n        'text-anchor': textAlign\n    };\n    if (hasSeparateFont(style)) {\n        var separatedFontStr = '';\n        var fontStyle = style.fontStyle;\n        var fontSize = parseFontSize(style.fontSize);\n        if (!parseFloat(fontSize)) {\n            return;\n        }\n        var fontFamily = style.fontFamily || DEFAULT_FONT_FAMILY;\n        var fontWeight = style.fontWeight;\n        separatedFontStr += \"font-size:\" + fontSize + \";font-family:\" + fontFamily + \";\";\n        if (fontStyle && fontStyle !== 'normal') {\n            separatedFontStr += \"font-style:\" + fontStyle + \";\";\n        }\n        if (fontWeight && fontWeight !== 'normal') {\n            separatedFontStr += \"font-weight:\" + fontWeight + \";\";\n        }\n        attrs.style = separatedFontStr;\n    }\n    else {\n        attrs.style = \"font: \" + font;\n    }\n    if (text.match(/\\s/)) {\n        attrs['xml:space'] = 'preserve';\n    }\n    if (x) {\n        attrs.x = x;\n    }\n    if (y) {\n        attrs.y = y;\n    }\n    setTransform(attrs, el.transform);\n    setStyleAttrs(attrs, style, el, scope);\n    setMetaData(attrs, el);\n    scope.animation && createCSSAnimation(el, attrs, scope);\n    return createVNode('text', el.id + '', attrs, undefined, text);\n}\nexport function brush(el, scope) {\n    if (el instanceof Path) {\n        return brushSVGPath(el, scope);\n    }\n    else if (el instanceof ZRImage) {\n        return brushSVGImage(el, scope);\n    }\n    else if (el instanceof TSpan) {\n        return brushSVGTSpan(el, scope);\n    }\n}\nfunction setShadow(el, attrs, scope) {\n    var style = el.style;\n    if (hasShadow(style)) {\n        var shadowKey = getShadowKey(el);\n        var shadowCache = scope.shadowCache;\n        var shadowId = shadowCache[shadowKey];\n        if (!shadowId) {\n            var globalScale = el.getGlobalScale();\n            var scaleX = globalScale[0];\n            var scaleY = globalScale[1];\n            if (!scaleX || !scaleY) {\n                return;\n            }\n            var offsetX = style.shadowOffsetX || 0;\n            var offsetY = style.shadowOffsetY || 0;\n            var blur_1 = style.shadowBlur;\n            var _a = normalizeColor(style.shadowColor), opacity = _a.opacity, color = _a.color;\n            var stdDx = blur_1 / 2 / scaleX;\n            var stdDy = blur_1 / 2 / scaleY;\n            var stdDeviation = stdDx + ' ' + stdDy;\n            shadowId = scope.zrId + '-s' + scope.shadowIdx++;\n            scope.defs[shadowId] = createVNode('filter', shadowId, {\n                'id': shadowId,\n                'x': '-100%',\n                'y': '-100%',\n                'width': '300%',\n                'height': '300%'\n            }, [\n                createVNode('feDropShadow', '', {\n                    'dx': offsetX / scaleX,\n                    'dy': offsetY / scaleY,\n                    'stdDeviation': stdDeviation,\n                    'flood-color': color,\n                    'flood-opacity': opacity\n                })\n            ]);\n            shadowCache[shadowKey] = shadowId;\n        }\n        attrs.filter = getIdURL(shadowId);\n    }\n}\nexport function setGradient(style, attrs, target, scope) {\n    var val = style[target];\n    var gradientTag;\n    var gradientAttrs = {\n        'gradientUnits': val.global\n            ? 'userSpaceOnUse'\n            : 'objectBoundingBox'\n    };\n    if (isLinearGradient(val)) {\n        gradientTag = 'linearGradient';\n        gradientAttrs.x1 = val.x;\n        gradientAttrs.y1 = val.y;\n        gradientAttrs.x2 = val.x2;\n        gradientAttrs.y2 = val.y2;\n    }\n    else if (isRadialGradient(val)) {\n        gradientTag = 'radialGradient';\n        gradientAttrs.cx = retrieve2(val.x, 0.5);\n        gradientAttrs.cy = retrieve2(val.y, 0.5);\n        gradientAttrs.r = retrieve2(val.r, 0.5);\n    }\n    else {\n        if (process.env.NODE_ENV !== 'production') {\n            logError('Illegal gradient type.');\n        }\n        return;\n    }\n    var colors = val.colorStops;\n    var colorStops = [];\n    for (var i = 0, len = colors.length; i < len; ++i) {\n        var offset = round4(colors[i].offset) * 100 + '%';\n        var stopColor = colors[i].color;\n        var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity;\n        var stopsAttrs = {\n            'offset': offset\n        };\n        stopsAttrs['stop-color'] = color;\n        if (opacity < 1) {\n            stopsAttrs['stop-opacity'] = opacity;\n        }\n        colorStops.push(createVNode('stop', i + '', stopsAttrs));\n    }\n    var gradientVNode = createVNode(gradientTag, '', gradientAttrs, colorStops);\n    var gradientKey = vNodeToString(gradientVNode);\n    var gradientCache = scope.gradientCache;\n    var gradientId = gradientCache[gradientKey];\n    if (!gradientId) {\n        gradientId = scope.zrId + '-g' + scope.gradientIdx++;\n        gradientCache[gradientKey] = gradientId;\n        gradientAttrs.id = gradientId;\n        scope.defs[gradientId] = createVNode(gradientTag, gradientId, gradientAttrs, colorStops);\n    }\n    attrs[target] = getIdURL(gradientId);\n}\nexport function setPattern(el, attrs, target, scope) {\n    var val = el.style[target];\n    var boundingRect = el.getBoundingRect();\n    var patternAttrs = {};\n    var repeat = val.repeat;\n    var noRepeat = repeat === 'no-repeat';\n    var repeatX = repeat === 'repeat-x';\n    var repeatY = repeat === 'repeat-y';\n    var child;\n    if (isImagePattern(val)) {\n        var imageWidth_1 = val.imageWidth;\n        var imageHeight_1 = val.imageHeight;\n        var imageSrc = void 0;\n        var patternImage = val.image;\n        if (isString(patternImage)) {\n            imageSrc = patternImage;\n        }\n        else if (isImageLike(patternImage)) {\n            imageSrc = patternImage.src;\n        }\n        else if (isCanvasLike(patternImage)) {\n            imageSrc = patternImage.toDataURL();\n        }\n        if (typeof Image === 'undefined') {\n            var errMsg = 'Image width/height must been given explictly in svg-ssr renderer.';\n            assert(imageWidth_1, errMsg);\n            assert(imageHeight_1, errMsg);\n        }\n        else if (imageWidth_1 == null || imageHeight_1 == null) {\n            var setSizeToVNode_1 = function (vNode, img) {\n                if (vNode) {\n                    var svgEl = vNode.elm;\n                    var width = imageWidth_1 || img.width;\n                    var height = imageHeight_1 || img.height;\n                    if (vNode.tag === 'pattern') {\n                        if (repeatX) {\n                            height = 1;\n                            width /= boundingRect.width;\n                        }\n                        else if (repeatY) {\n                            width = 1;\n                            height /= boundingRect.height;\n                        }\n                    }\n                    vNode.attrs.width = width;\n                    vNode.attrs.height = height;\n                    if (svgEl) {\n                        svgEl.setAttribute('width', width);\n                        svgEl.setAttribute('height', height);\n                    }\n                }\n            };\n            var createdImage = createOrUpdateImage(imageSrc, null, el, function (img) {\n                noRepeat || setSizeToVNode_1(patternVNode, img);\n                setSizeToVNode_1(child, img);\n            });\n            if (createdImage && createdImage.width && createdImage.height) {\n                imageWidth_1 = imageWidth_1 || createdImage.width;\n                imageHeight_1 = imageHeight_1 || createdImage.height;\n            }\n        }\n        child = createVNode('image', 'img', {\n            href: imageSrc,\n            width: imageWidth_1,\n            height: imageHeight_1\n        });\n        patternAttrs.width = imageWidth_1;\n        patternAttrs.height = imageHeight_1;\n    }\n    else if (val.svgElement) {\n        child = clone(val.svgElement);\n        patternAttrs.width = val.svgWidth;\n        patternAttrs.height = val.svgHeight;\n    }\n    if (!child) {\n        return;\n    }\n    var patternWidth;\n    var patternHeight;\n    if (noRepeat) {\n        patternWidth = patternHeight = 1;\n    }\n    else if (repeatX) {\n        patternHeight = 1;\n        patternWidth = patternAttrs.width / boundingRect.width;\n    }\n    else if (repeatY) {\n        patternWidth = 1;\n        patternHeight = patternAttrs.height / boundingRect.height;\n    }\n    else {\n        patternAttrs.patternUnits = 'userSpaceOnUse';\n    }\n    if (patternWidth != null && !isNaN(patternWidth)) {\n        patternAttrs.width = patternWidth;\n    }\n    if (patternHeight != null && !isNaN(patternHeight)) {\n        patternAttrs.height = patternHeight;\n    }\n    var patternTransform = getSRTTransformString(val);\n    patternTransform && (patternAttrs.patternTransform = patternTransform);\n    var patternVNode = createVNode('pattern', '', patternAttrs, [child]);\n    var patternKey = vNodeToString(patternVNode);\n    var patternCache = scope.patternCache;\n    var patternId = patternCache[patternKey];\n    if (!patternId) {\n        patternId = scope.zrId + '-p' + scope.patternIdx++;\n        patternCache[patternKey] = patternId;\n        patternAttrs.id = patternId;\n        patternVNode = scope.defs[patternId] = createVNode('pattern', patternId, patternAttrs, [child]);\n    }\n    attrs[target] = getIdURL(patternId);\n}\nexport function setClipPath(clipPath, attrs, scope) {\n    var clipPathCache = scope.clipPathCache, defs = scope.defs;\n    var clipPathId = clipPathCache[clipPath.id];\n    if (!clipPathId) {\n        clipPathId = scope.zrId + '-c' + scope.clipPathIdx++;\n        var clipPathAttrs = {\n            id: clipPathId\n        };\n        clipPathCache[clipPath.id] = clipPathId;\n        defs[clipPathId] = createVNode('clipPath', clipPathId, clipPathAttrs, [brushSVGPath(clipPath, scope)]);\n    }\n    attrs['clip-path'] = getIdURL(clipPathId);\n}\n", "export function createTextNode(text) {\n    return document.createTextNode(text);\n}\nexport function createComment(text) {\n    return document.createComment(text);\n}\nexport function insertBefore(parentNode, newNode, referenceNode) {\n    parentNode.insertBefore(newNode, referenceNode);\n}\nexport function removeChild(node, child) {\n    node.removeChild(child);\n}\nexport function appendChild(node, child) {\n    node.appendChild(child);\n}\nexport function parentNode(node) {\n    return node.parentNode;\n}\nexport function nextSibling(node) {\n    return node.nextSibling;\n}\nexport function tagName(elm) {\n    return elm.tagName;\n}\nexport function setTextContent(node, text) {\n    node.textContent = text;\n}\nexport function getTextContent(node) {\n    return node.textContent;\n}\nexport function isElement(node) {\n    return node.nodeType === 1;\n}\nexport function isText(node) {\n    return node.nodeType === 3;\n}\nexport function isComment(node) {\n    return node.nodeType === 8;\n}\n", "import { isArray, isObject } from '../core/util.js';\nimport { createElement, createVNode, XMLNS, XML_NAMESPACE, XLINKNS } from './core.js';\nimport * as api from './domapi.js';\nvar colonChar = 58;\nvar xChar = 120;\nvar emptyNode = createVNode('', '');\nfunction isUndef(s) {\n    return s === undefined;\n}\nfunction isDef(s) {\n    return s !== undefined;\n}\nfunction createKeyToOldIdx(children, beginIdx, endIdx) {\n    var map = {};\n    for (var i = beginIdx; i <= endIdx; ++i) {\n        var key = children[i].key;\n        if (key !== undefined) {\n            if (process.env.NODE_ENV !== 'production') {\n                if (map[key] != null) {\n                    console.error(\"Duplicate key \" + key);\n                }\n            }\n            map[key] = i;\n        }\n    }\n    return map;\n}\nfunction sameVnode(vnode1, vnode2) {\n    var isSameKey = vnode1.key === vnode2.key;\n    var isSameTag = vnode1.tag === vnode2.tag;\n    return isSameTag && isSameKey;\n}\nfunction createElm(vnode) {\n    var i;\n    var children = vnode.children;\n    var tag = vnode.tag;\n    if (isDef(tag)) {\n        var elm = (vnode.elm = createElement(tag));\n        updateAttrs(emptyNode, vnode);\n        if (isArray(children)) {\n            for (i = 0; i < children.length; ++i) {\n                var ch = children[i];\n                if (ch != null) {\n                    api.appendChild(elm, createElm(ch));\n                }\n            }\n        }\n        else if (isDef(vnode.text) && !isObject(vnode.text)) {\n            api.appendChild(elm, api.createTextNode(vnode.text));\n        }\n    }\n    else {\n        vnode.elm = api.createTextNode(vnode.text);\n    }\n    return vnode.elm;\n}\nfunction addVnodes(parentElm, before, vnodes, startIdx, endIdx) {\n    for (; startIdx <= endIdx; ++startIdx) {\n        var ch = vnodes[startIdx];\n        if (ch != null) {\n            api.insertBefore(parentElm, createElm(ch), before);\n        }\n    }\n}\nfunction removeVnodes(parentElm, vnodes, startIdx, endIdx) {\n    for (; startIdx <= endIdx; ++startIdx) {\n        var ch = vnodes[startIdx];\n        if (ch != null) {\n            if (isDef(ch.tag)) {\n                var parent_1 = api.parentNode(ch.elm);\n                api.removeChild(parent_1, ch.elm);\n            }\n            else {\n                api.removeChild(parentElm, ch.elm);\n            }\n        }\n    }\n}\nexport function updateAttrs(oldVnode, vnode) {\n    var key;\n    var elm = vnode.elm;\n    var oldAttrs = oldVnode && oldVnode.attrs || {};\n    var attrs = vnode.attrs || {};\n    if (oldAttrs === attrs) {\n        return;\n    }\n    for (key in attrs) {\n        var cur = attrs[key];\n        var old = oldAttrs[key];\n        if (old !== cur) {\n            if (cur === true) {\n                elm.setAttribute(key, '');\n            }\n            else if (cur === false) {\n                elm.removeAttribute(key);\n            }\n            else {\n                if (key === 'style') {\n                    elm.style.cssText = cur;\n                }\n                else if (key.charCodeAt(0) !== xChar) {\n                    elm.setAttribute(key, cur);\n                }\n                else if (key === 'xmlns:xlink' || key === 'xmlns') {\n                    elm.setAttributeNS(XMLNS, key, cur);\n                }\n                else if (key.charCodeAt(3) === colonChar) {\n                    elm.setAttributeNS(XML_NAMESPACE, key, cur);\n                }\n                else if (key.charCodeAt(5) === colonChar) {\n                    elm.setAttributeNS(XLINKNS, key, cur);\n                }\n                else {\n                    elm.setAttribute(key, cur);\n                }\n            }\n        }\n    }\n    for (key in oldAttrs) {\n        if (!(key in attrs)) {\n            elm.removeAttribute(key);\n        }\n    }\n}\nfunction updateChildren(parentElm, oldCh, newCh) {\n    var oldStartIdx = 0;\n    var newStartIdx = 0;\n    var oldEndIdx = oldCh.length - 1;\n    var oldStartVnode = oldCh[0];\n    var oldEndVnode = oldCh[oldEndIdx];\n    var newEndIdx = newCh.length - 1;\n    var newStartVnode = newCh[0];\n    var newEndVnode = newCh[newEndIdx];\n    var oldKeyToIdx;\n    var idxInOld;\n    var elmToMove;\n    var before;\n    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n        if (oldStartVnode == null) {\n            oldStartVnode = oldCh[++oldStartIdx];\n        }\n        else if (oldEndVnode == null) {\n            oldEndVnode = oldCh[--oldEndIdx];\n        }\n        else if (newStartVnode == null) {\n            newStartVnode = newCh[++newStartIdx];\n        }\n        else if (newEndVnode == null) {\n            newEndVnode = newCh[--newEndIdx];\n        }\n        else if (sameVnode(oldStartVnode, newStartVnode)) {\n            patchVnode(oldStartVnode, newStartVnode);\n            oldStartVnode = oldCh[++oldStartIdx];\n            newStartVnode = newCh[++newStartIdx];\n        }\n        else if (sameVnode(oldEndVnode, newEndVnode)) {\n            patchVnode(oldEndVnode, newEndVnode);\n            oldEndVnode = oldCh[--oldEndIdx];\n            newEndVnode = newCh[--newEndIdx];\n        }\n        else if (sameVnode(oldStartVnode, newEndVnode)) {\n            patchVnode(oldStartVnode, newEndVnode);\n            api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));\n            oldStartVnode = oldCh[++oldStartIdx];\n            newEndVnode = newCh[--newEndIdx];\n        }\n        else if (sameVnode(oldEndVnode, newStartVnode)) {\n            patchVnode(oldEndVnode, newStartVnode);\n            api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n            oldEndVnode = oldCh[--oldEndIdx];\n            newStartVnode = newCh[++newStartIdx];\n        }\n        else {\n            if (isUndef(oldKeyToIdx)) {\n                oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);\n            }\n            idxInOld = oldKeyToIdx[newStartVnode.key];\n            if (isUndef(idxInOld)) {\n                api.insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm);\n            }\n            else {\n                elmToMove = oldCh[idxInOld];\n                if (elmToMove.tag !== newStartVnode.tag) {\n                    api.insertBefore(parentElm, createElm(newStartVnode), oldStartVnode.elm);\n                }\n                else {\n                    patchVnode(elmToMove, newStartVnode);\n                    oldCh[idxInOld] = undefined;\n                    api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);\n                }\n            }\n            newStartVnode = newCh[++newStartIdx];\n        }\n    }\n    if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {\n        if (oldStartIdx > oldEndIdx) {\n            before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;\n            addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx);\n        }\n        else {\n            removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n        }\n    }\n}\nfunction patchVnode(oldVnode, vnode) {\n    var elm = (vnode.elm = oldVnode.elm);\n    var oldCh = oldVnode.children;\n    var ch = vnode.children;\n    if (oldVnode === vnode) {\n        return;\n    }\n    updateAttrs(oldVnode, vnode);\n    if (isUndef(vnode.text)) {\n        if (isDef(oldCh) && isDef(ch)) {\n            if (oldCh !== ch) {\n                updateChildren(elm, oldCh, ch);\n            }\n        }\n        else if (isDef(ch)) {\n            if (isDef(oldVnode.text)) {\n                api.setTextContent(elm, '');\n            }\n            addVnodes(elm, null, ch, 0, ch.length - 1);\n        }\n        else if (isDef(oldCh)) {\n            removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n        }\n        else if (isDef(oldVnode.text)) {\n            api.setTextContent(elm, '');\n        }\n    }\n    else if (oldVnode.text !== vnode.text) {\n        if (isDef(oldCh)) {\n            removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n        }\n        api.setTextContent(elm, vnode.text);\n    }\n}\nexport default function patch(oldVnode, vnode) {\n    if (sameVnode(oldVnode, vnode)) {\n        patchVnode(oldVnode, vnode);\n    }\n    else {\n        var elm = oldVnode.elm;\n        var parent_2 = api.parentNode(elm);\n        createElm(vnode);\n        if (parent_2 !== null) {\n            api.insertBefore(parent_2, vnode.elm, api.nextSibling(elm));\n            removeVnodes(parent_2, [oldVnode], 0, 0);\n        }\n    }\n    return vnode;\n}\n", "import { brush, setClipPath, setGradient, setPattern } from './graphic.js';\nimport { createElement, createVNode, vNodeToString, getCssString, createBrushScope, createSVGVNode } from './core.js';\nimport { normalizeColor, encodeBase64, isGradient, isPattern } from './helper.js';\nimport { extend, keys, logError, map, noop, retrieve2 } from '../core/util.js';\nimport patch, { updateAttrs } from './patch.js';\nimport { getSize } from '../canvas/helper.js';\nvar svgId = 0;\nvar SVGPainter = (function () {\n    function SVGPainter(root, storage, opts) {\n        this.type = 'svg';\n        this.refreshHover = createMethodNotSupport('refreshHover');\n        this.configLayer = createMethodNotSupport('configLayer');\n        this.storage = storage;\n        this._opts = opts = extend({}, opts);\n        this.root = root;\n        this._id = 'zr' + svgId++;\n        this._oldVNode = createSVGVNode(opts.width, opts.height);\n        if (root && !opts.ssr) {\n            var viewport = this._viewport = document.createElement('div');\n            viewport.style.cssText = 'position:relative;overflow:hidden';\n            var svgDom = this._svgDom = this._oldVNode.elm = createElement('svg');\n            updateAttrs(null, this._oldVNode);\n            viewport.appendChild(svgDom);\n            root.appendChild(viewport);\n        }\n        this.resize(opts.width, opts.height);\n    }\n    SVGPainter.prototype.getType = function () {\n        return this.type;\n    };\n    SVGPainter.prototype.getViewportRoot = function () {\n        return this._viewport;\n    };\n    SVGPainter.prototype.getViewportRootOffset = function () {\n        var viewportRoot = this.getViewportRoot();\n        if (viewportRoot) {\n            return {\n                offsetLeft: viewportRoot.offsetLeft || 0,\n                offsetTop: viewportRoot.offsetTop || 0\n            };\n        }\n    };\n    SVGPainter.prototype.getSvgDom = function () {\n        return this._svgDom;\n    };\n    SVGPainter.prototype.refresh = function () {\n        if (this.root) {\n            var vnode = this.renderToVNode({\n                willUpdate: true\n            });\n            vnode.attrs.style = 'position:absolute;left:0;top:0;user-select:none';\n            patch(this._oldVNode, vnode);\n            this._oldVNode = vnode;\n        }\n    };\n    SVGPainter.prototype.renderOneToVNode = function (el) {\n        return brush(el, createBrushScope(this._id));\n    };\n    SVGPainter.prototype.renderToVNode = function (opts) {\n        opts = opts || {};\n        var list = this.storage.getDisplayList(true);\n        var width = this._width;\n        var height = this._height;\n        var scope = createBrushScope(this._id);\n        scope.animation = opts.animation;\n        scope.willUpdate = opts.willUpdate;\n        scope.compress = opts.compress;\n        scope.emphasis = opts.emphasis;\n        scope.ssr = this._opts.ssr;\n        var children = [];\n        var bgVNode = this._bgVNode = createBackgroundVNode(width, height, this._backgroundColor, scope);\n        bgVNode && children.push(bgVNode);\n        var mainVNode = !opts.compress\n            ? (this._mainVNode = createVNode('g', 'main', {}, [])) : null;\n        this._paintList(list, scope, mainVNode ? mainVNode.children : children);\n        mainVNode && children.push(mainVNode);\n        var defs = map(keys(scope.defs), function (id) { return scope.defs[id]; });\n        if (defs.length) {\n            children.push(createVNode('defs', 'defs', {}, defs));\n        }\n        if (opts.animation) {\n            var animationCssStr = getCssString(scope.cssNodes, scope.cssAnims, { newline: true });\n            if (animationCssStr) {\n                var styleNode = createVNode('style', 'stl', {}, [], animationCssStr);\n                children.push(styleNode);\n            }\n        }\n        return createSVGVNode(width, height, children, opts.useViewBox);\n    };\n    SVGPainter.prototype.renderToString = function (opts) {\n        opts = opts || {};\n        return vNodeToString(this.renderToVNode({\n            animation: retrieve2(opts.cssAnimation, true),\n            emphasis: retrieve2(opts.cssEmphasis, true),\n            willUpdate: false,\n            compress: true,\n            useViewBox: retrieve2(opts.useViewBox, true)\n        }), { newline: true });\n    };\n    SVGPainter.prototype.setBackgroundColor = function (backgroundColor) {\n        this._backgroundColor = backgroundColor;\n    };\n    SVGPainter.prototype.getSvgRoot = function () {\n        return this._mainVNode && this._mainVNode.elm;\n    };\n    SVGPainter.prototype._paintList = function (list, scope, out) {\n        var listLen = list.length;\n        var clipPathsGroupsStack = [];\n        var clipPathsGroupsStackDepth = 0;\n        var currentClipPathGroup;\n        var prevClipPaths;\n        var clipGroupNodeIdx = 0;\n        for (var i = 0; i < listLen; i++) {\n            var displayable = list[i];\n            if (!displayable.invisible) {\n                var clipPaths = displayable.__clipPaths;\n                var len = clipPaths && clipPaths.length || 0;\n                var prevLen = prevClipPaths && prevClipPaths.length || 0;\n                var lca = void 0;\n                for (lca = Math.max(len - 1, prevLen - 1); lca >= 0; lca--) {\n                    if (clipPaths && prevClipPaths\n                        && clipPaths[lca] === prevClipPaths[lca]) {\n                        break;\n                    }\n                }\n                for (var i_1 = prevLen - 1; i_1 > lca; i_1--) {\n                    clipPathsGroupsStackDepth--;\n                    currentClipPathGroup = clipPathsGroupsStack[clipPathsGroupsStackDepth - 1];\n                }\n                for (var i_2 = lca + 1; i_2 < len; i_2++) {\n                    var groupAttrs = {};\n                    setClipPath(clipPaths[i_2], groupAttrs, scope);\n                    var g = createVNode('g', 'clip-g-' + clipGroupNodeIdx++, groupAttrs, []);\n                    (currentClipPathGroup ? currentClipPathGroup.children : out).push(g);\n                    clipPathsGroupsStack[clipPathsGroupsStackDepth++] = g;\n                    currentClipPathGroup = g;\n                }\n                prevClipPaths = clipPaths;\n                var ret = brush(displayable, scope);\n                if (ret) {\n                    (currentClipPathGroup ? currentClipPathGroup.children : out).push(ret);\n                }\n            }\n        }\n    };\n    SVGPainter.prototype.resize = function (width, height) {\n        var opts = this._opts;\n        var root = this.root;\n        var viewport = this._viewport;\n        width != null && (opts.width = width);\n        height != null && (opts.height = height);\n        if (root && viewport) {\n            viewport.style.display = 'none';\n            width = getSize(root, 0, opts);\n            height = getSize(root, 1, opts);\n            viewport.style.display = '';\n        }\n        if (this._width !== width || this._height !== height) {\n            this._width = width;\n            this._height = height;\n            if (viewport) {\n                var viewportStyle = viewport.style;\n                viewportStyle.width = width + 'px';\n                viewportStyle.height = height + 'px';\n            }\n            if (!isPattern(this._backgroundColor)) {\n                var svgDom = this._svgDom;\n                if (svgDom) {\n                    svgDom.setAttribute('width', width);\n                    svgDom.setAttribute('height', height);\n                }\n                var bgEl = this._bgVNode && this._bgVNode.elm;\n                if (bgEl) {\n                    bgEl.setAttribute('width', width);\n                    bgEl.setAttribute('height', height);\n                }\n            }\n            else {\n                this.refresh();\n            }\n        }\n    };\n    SVGPainter.prototype.getWidth = function () {\n        return this._width;\n    };\n    SVGPainter.prototype.getHeight = function () {\n        return this._height;\n    };\n    SVGPainter.prototype.dispose = function () {\n        if (this.root) {\n            this.root.innerHTML = '';\n        }\n        this._svgDom =\n            this._viewport =\n                this.storage =\n                    this._oldVNode =\n                        this._bgVNode =\n                            this._mainVNode = null;\n    };\n    SVGPainter.prototype.clear = function () {\n        if (this._svgDom) {\n            this._svgDom.innerHTML = null;\n        }\n        this._oldVNode = null;\n    };\n    SVGPainter.prototype.toDataURL = function (base64) {\n        var str = this.renderToString();\n        var prefix = 'data:image/svg+xml;';\n        if (base64) {\n            str = encodeBase64(str);\n            return str && prefix + 'base64,' + str;\n        }\n        return prefix + 'charset=UTF-8,' + encodeURIComponent(str);\n    };\n    return SVGPainter;\n}());\nfunction createMethodNotSupport(method) {\n    return function () {\n        if (process.env.NODE_ENV !== 'production') {\n            logError('In SVG mode painter not support method \"' + method + '\"');\n        }\n    };\n}\nfunction createBackgroundVNode(width, height, backgroundColor, scope) {\n    var bgVNode;\n    if (backgroundColor && backgroundColor !== 'none') {\n        bgVNode = createVNode('rect', 'bg', {\n            width: width,\n            height: height,\n            x: '0',\n            y: '0'\n        });\n        if (isGradient(backgroundColor)) {\n            setGradient({ fill: backgroundColor }, bgVNode.attrs, 'fill', scope);\n        }\n        else if (isPattern(backgroundColor)) {\n            setPattern({\n                style: {\n                    fill: backgroundColor\n                },\n                dirty: noop,\n                getBoundingRect: function () { return ({ width: width, height: height }); }\n            }, bgVNode.attrs, 'fill', scope);\n        }\n        else {\n            var _a = normalizeColor(backgroundColor), color = _a.color, opacity = _a.opacity;\n            bgVNode.attrs.fill = color;\n            opacity < 1 && (bgVNode.attrs['fill-opacity'] = opacity);\n        }\n    }\n    return bgVNode;\n}\nexport default SVGPainter;\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport SVGPainter from 'zrender/lib/svg/Painter.js';\nexport function install(registers) {\n  registers.registerPainter('svg', SVGPainter);\n}", "import { __extends } from \"tslib\";\nimport * as util from '../core/util.js';\nimport { devicePixelRatio } from '../config.js';\nimport Eventful from '../core/Eventful.js';\nimport { getCanvasGradient } from './helper.js';\nimport { createCanvasPattern } from './graphic.js';\nimport BoundingRect from '../core/BoundingRect.js';\nimport { REDRAW_BIT } from '../graphic/constants.js';\nimport { platformApi } from '../core/platform.js';\nfunction createDom(id, painter, dpr) {\n    var newDom = platformApi.createCanvas();\n    var width = painter.getWidth();\n    var height = painter.getHeight();\n    var newDomStyle = newDom.style;\n    if (newDomStyle) {\n        newDomStyle.position = 'absolute';\n        newDomStyle.left = '0';\n        newDomStyle.top = '0';\n        newDomStyle.width = width + 'px';\n        newDomStyle.height = height + 'px';\n        newDom.setAttribute('data-zr-dom-id', id);\n    }\n    newDom.width = width * dpr;\n    newDom.height = height * dpr;\n    return newDom;\n}\n;\nvar Layer = (function (_super) {\n    __extends(Layer, _super);\n    function Layer(id, painter, dpr) {\n        var _this = _super.call(this) || this;\n        _this.motionBlur = false;\n        _this.lastFrameAlpha = 0.7;\n        _this.dpr = 1;\n        _this.virtual = false;\n        _this.config = {};\n        _this.incremental = false;\n        _this.zlevel = 0;\n        _this.maxRepaintRectCount = 5;\n        _this.__dirty = true;\n        _this.__firstTimePaint = true;\n        _this.__used = false;\n        _this.__drawIndex = 0;\n        _this.__startIndex = 0;\n        _this.__endIndex = 0;\n        _this.__prevStartIndex = null;\n        _this.__prevEndIndex = null;\n        var dom;\n        dpr = dpr || devicePixelRatio;\n        if (typeof id === 'string') {\n            dom = createDom(id, painter, dpr);\n        }\n        else if (util.isObject(id)) {\n            dom = id;\n            id = dom.id;\n        }\n        _this.id = id;\n        _this.dom = dom;\n        var domStyle = dom.style;\n        if (domStyle) {\n            util.disableUserSelect(dom);\n            dom.onselectstart = function () { return false; };\n            domStyle.padding = '0';\n            domStyle.margin = '0';\n            domStyle.borderWidth = '0';\n        }\n        _this.painter = painter;\n        _this.dpr = dpr;\n        return _this;\n    }\n    Layer.prototype.getElementCount = function () {\n        return this.__endIndex - this.__startIndex;\n    };\n    Layer.prototype.afterBrush = function () {\n        this.__prevStartIndex = this.__startIndex;\n        this.__prevEndIndex = this.__endIndex;\n    };\n    Layer.prototype.initContext = function () {\n        this.ctx = this.dom.getContext('2d');\n        this.ctx.dpr = this.dpr;\n    };\n    Layer.prototype.setUnpainted = function () {\n        this.__firstTimePaint = true;\n    };\n    Layer.prototype.createBackBuffer = function () {\n        var dpr = this.dpr;\n        this.domBack = createDom('back-' + this.id, this.painter, dpr);\n        this.ctxBack = this.domBack.getContext('2d');\n        if (dpr !== 1) {\n            this.ctxBack.scale(dpr, dpr);\n        }\n    };\n    Layer.prototype.createRepaintRects = function (displayList, prevList, viewWidth, viewHeight) {\n        if (this.__firstTimePaint) {\n            this.__firstTimePaint = false;\n            return null;\n        }\n        var mergedRepaintRects = [];\n        var maxRepaintRectCount = this.maxRepaintRectCount;\n        var full = false;\n        var pendingRect = new BoundingRect(0, 0, 0, 0);\n        function addRectToMergePool(rect) {\n            if (!rect.isFinite() || rect.isZero()) {\n                return;\n            }\n            if (mergedRepaintRects.length === 0) {\n                var boundingRect = new BoundingRect(0, 0, 0, 0);\n                boundingRect.copy(rect);\n                mergedRepaintRects.push(boundingRect);\n            }\n            else {\n                var isMerged = false;\n                var minDeltaArea = Infinity;\n                var bestRectToMergeIdx = 0;\n                for (var i = 0; i < mergedRepaintRects.length; ++i) {\n                    var mergedRect = mergedRepaintRects[i];\n                    if (mergedRect.intersect(rect)) {\n                        var pendingRect_1 = new BoundingRect(0, 0, 0, 0);\n                        pendingRect_1.copy(mergedRect);\n                        pendingRect_1.union(rect);\n                        mergedRepaintRects[i] = pendingRect_1;\n                        isMerged = true;\n                        break;\n                    }\n                    else if (full) {\n                        pendingRect.copy(rect);\n                        pendingRect.union(mergedRect);\n                        var aArea = rect.width * rect.height;\n                        var bArea = mergedRect.width * mergedRect.height;\n                        var pendingArea = pendingRect.width * pendingRect.height;\n                        var deltaArea = pendingArea - aArea - bArea;\n                        if (deltaArea < minDeltaArea) {\n                            minDeltaArea = deltaArea;\n                            bestRectToMergeIdx = i;\n                        }\n                    }\n                }\n                if (full) {\n                    mergedRepaintRects[bestRectToMergeIdx].union(rect);\n                    isMerged = true;\n                }\n                if (!isMerged) {\n                    var boundingRect = new BoundingRect(0, 0, 0, 0);\n                    boundingRect.copy(rect);\n                    mergedRepaintRects.push(boundingRect);\n                }\n                if (!full) {\n                    full = mergedRepaintRects.length >= maxRepaintRectCount;\n                }\n            }\n        }\n        for (var i = this.__startIndex; i < this.__endIndex; ++i) {\n            var el = displayList[i];\n            if (el) {\n                var shouldPaint = el.shouldBePainted(viewWidth, viewHeight, true, true);\n                var prevRect = el.__isRendered && ((el.__dirty & REDRAW_BIT) || !shouldPaint)\n                    ? el.getPrevPaintRect()\n                    : null;\n                if (prevRect) {\n                    addRectToMergePool(prevRect);\n                }\n                var curRect = shouldPaint && ((el.__dirty & REDRAW_BIT) || !el.__isRendered)\n                    ? el.getPaintRect()\n                    : null;\n                if (curRect) {\n                    addRectToMergePool(curRect);\n                }\n            }\n        }\n        for (var i = this.__prevStartIndex; i < this.__prevEndIndex; ++i) {\n            var el = prevList[i];\n            var shouldPaint = el && el.shouldBePainted(viewWidth, viewHeight, true, true);\n            if (el && (!shouldPaint || !el.__zr) && el.__isRendered) {\n                var prevRect = el.getPrevPaintRect();\n                if (prevRect) {\n                    addRectToMergePool(prevRect);\n                }\n            }\n        }\n        var hasIntersections;\n        do {\n            hasIntersections = false;\n            for (var i = 0; i < mergedRepaintRects.length;) {\n                if (mergedRepaintRects[i].isZero()) {\n                    mergedRepaintRects.splice(i, 1);\n                    continue;\n                }\n                for (var j = i + 1; j < mergedRepaintRects.length;) {\n                    if (mergedRepaintRects[i].intersect(mergedRepaintRects[j])) {\n                        hasIntersections = true;\n                        mergedRepaintRects[i].union(mergedRepaintRects[j]);\n                        mergedRepaintRects.splice(j, 1);\n                    }\n                    else {\n                        j++;\n                    }\n                }\n                i++;\n            }\n        } while (hasIntersections);\n        this._paintRects = mergedRepaintRects;\n        return mergedRepaintRects;\n    };\n    Layer.prototype.debugGetPaintRects = function () {\n        return (this._paintRects || []).slice();\n    };\n    Layer.prototype.resize = function (width, height) {\n        var dpr = this.dpr;\n        var dom = this.dom;\n        var domStyle = dom.style;\n        var domBack = this.domBack;\n        if (domStyle) {\n            domStyle.width = width + 'px';\n            domStyle.height = height + 'px';\n        }\n        dom.width = width * dpr;\n        dom.height = height * dpr;\n        if (domBack) {\n            domBack.width = width * dpr;\n            domBack.height = height * dpr;\n            if (dpr !== 1) {\n                this.ctxBack.scale(dpr, dpr);\n            }\n        }\n    };\n    Layer.prototype.clear = function (clearAll, clearColor, repaintRects) {\n        var dom = this.dom;\n        var ctx = this.ctx;\n        var width = dom.width;\n        var height = dom.height;\n        clearColor = clearColor || this.clearColor;\n        var haveMotionBLur = this.motionBlur && !clearAll;\n        var lastFrameAlpha = this.lastFrameAlpha;\n        var dpr = this.dpr;\n        var self = this;\n        if (haveMotionBLur) {\n            if (!this.domBack) {\n                this.createBackBuffer();\n            }\n            this.ctxBack.globalCompositeOperation = 'copy';\n            this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr);\n        }\n        var domBack = this.domBack;\n        function doClear(x, y, width, height) {\n            ctx.clearRect(x, y, width, height);\n            if (clearColor && clearColor !== 'transparent') {\n                var clearColorGradientOrPattern = void 0;\n                if (util.isGradientObject(clearColor)) {\n                    var shouldCache = clearColor.global || (clearColor.__width === width\n                        && clearColor.__height === height);\n                    clearColorGradientOrPattern = shouldCache\n                        && clearColor.__canvasGradient\n                        || getCanvasGradient(ctx, clearColor, {\n                            x: 0,\n                            y: 0,\n                            width: width,\n                            height: height\n                        });\n                    clearColor.__canvasGradient = clearColorGradientOrPattern;\n                    clearColor.__width = width;\n                    clearColor.__height = height;\n                }\n                else if (util.isImagePatternObject(clearColor)) {\n                    clearColor.scaleX = clearColor.scaleX || dpr;\n                    clearColor.scaleY = clearColor.scaleY || dpr;\n                    clearColorGradientOrPattern = createCanvasPattern(ctx, clearColor, {\n                        dirty: function () {\n                            self.setUnpainted();\n                            self.painter.refresh();\n                        }\n                    });\n                }\n                ctx.save();\n                ctx.fillStyle = clearColorGradientOrPattern || clearColor;\n                ctx.fillRect(x, y, width, height);\n                ctx.restore();\n            }\n            if (haveMotionBLur) {\n                ctx.save();\n                ctx.globalAlpha = lastFrameAlpha;\n                ctx.drawImage(domBack, x, y, width, height);\n                ctx.restore();\n            }\n        }\n        ;\n        if (!repaintRects || haveMotionBLur) {\n            doClear(0, 0, width, height);\n        }\n        else if (repaintRects.length) {\n            util.each(repaintRects, function (rect) {\n                doClear(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr);\n            });\n        }\n    };\n    return Layer;\n}(Eventful));\nexport default Layer;\n", "import { devicePixelRatio } from '../config.js';\nimport * as util from '../core/util.js';\nimport Layer from './Layer.js';\nimport requestAnimationFrame from '../animation/requestAnimationFrame.js';\nimport env from '../core/env.js';\nimport { brush, brushSingle } from './graphic.js';\nimport { REDRAW_BIT } from '../graphic/constants.js';\nimport { getSize } from './helper.js';\nvar HOVER_LAYER_ZLEVEL = 1e5;\nvar CANVAS_ZLEVEL = 314159;\nvar EL_AFTER_INCREMENTAL_INC = 0.01;\nvar INCREMENTAL_INC = 0.001;\nfunction isLayerValid(layer) {\n    if (!layer) {\n        return false;\n    }\n    if (layer.__builtin__) {\n        return true;\n    }\n    if (typeof (layer.resize) !== 'function'\n        || typeof (layer.refresh) !== 'function') {\n        return false;\n    }\n    return true;\n}\nfunction createRoot(width, height) {\n    var domRoot = document.createElement('div');\n    domRoot.style.cssText = [\n        'position:relative',\n        'width:' + width + 'px',\n        'height:' + height + 'px',\n        'padding:0',\n        'margin:0',\n        'border-width:0'\n    ].join(';') + ';';\n    return domRoot;\n}\nvar CanvasPainter = (function () {\n    function CanvasPainter(root, storage, opts, id) {\n        this.type = 'canvas';\n        this._zlevelList = [];\n        this._prevDisplayList = [];\n        this._layers = {};\n        this._layerConfig = {};\n        this._needsManuallyCompositing = false;\n        this.type = 'canvas';\n        var singleCanvas = !root.nodeName\n            || root.nodeName.toUpperCase() === 'CANVAS';\n        this._opts = opts = util.extend({}, opts || {});\n        this.dpr = opts.devicePixelRatio || devicePixelRatio;\n        this._singleCanvas = singleCanvas;\n        this.root = root;\n        var rootStyle = root.style;\n        if (rootStyle) {\n            util.disableUserSelect(root);\n            root.innerHTML = '';\n        }\n        this.storage = storage;\n        var zlevelList = this._zlevelList;\n        this._prevDisplayList = [];\n        var layers = this._layers;\n        if (!singleCanvas) {\n            this._width = getSize(root, 0, opts);\n            this._height = getSize(root, 1, opts);\n            var domRoot = this._domRoot = createRoot(this._width, this._height);\n            root.appendChild(domRoot);\n        }\n        else {\n            var rootCanvas = root;\n            var width = rootCanvas.width;\n            var height = rootCanvas.height;\n            if (opts.width != null) {\n                width = opts.width;\n            }\n            if (opts.height != null) {\n                height = opts.height;\n            }\n            this.dpr = opts.devicePixelRatio || 1;\n            rootCanvas.width = width * this.dpr;\n            rootCanvas.height = height * this.dpr;\n            this._width = width;\n            this._height = height;\n            var mainLayer = new Layer(rootCanvas, this, this.dpr);\n            mainLayer.__builtin__ = true;\n            mainLayer.initContext();\n            layers[CANVAS_ZLEVEL] = mainLayer;\n            mainLayer.zlevel = CANVAS_ZLEVEL;\n            zlevelList.push(CANVAS_ZLEVEL);\n            this._domRoot = root;\n        }\n    }\n    CanvasPainter.prototype.getType = function () {\n        return 'canvas';\n    };\n    CanvasPainter.prototype.isSingleCanvas = function () {\n        return this._singleCanvas;\n    };\n    CanvasPainter.prototype.getViewportRoot = function () {\n        return this._domRoot;\n    };\n    CanvasPainter.prototype.getViewportRootOffset = function () {\n        var viewportRoot = this.getViewportRoot();\n        if (viewportRoot) {\n            return {\n                offsetLeft: viewportRoot.offsetLeft || 0,\n                offsetTop: viewportRoot.offsetTop || 0\n            };\n        }\n    };\n    CanvasPainter.prototype.refresh = function (paintAll) {\n        var list = this.storage.getDisplayList(true);\n        var prevList = this._prevDisplayList;\n        var zlevelList = this._zlevelList;\n        this._redrawId = Math.random();\n        this._paintList(list, prevList, paintAll, this._redrawId);\n        for (var i = 0; i < zlevelList.length; i++) {\n            var z = zlevelList[i];\n            var layer = this._layers[z];\n            if (!layer.__builtin__ && layer.refresh) {\n                var clearColor = i === 0 ? this._backgroundColor : null;\n                layer.refresh(clearColor);\n            }\n        }\n        if (this._opts.useDirtyRect) {\n            this._prevDisplayList = list.slice();\n        }\n        return this;\n    };\n    CanvasPainter.prototype.refreshHover = function () {\n        this._paintHoverList(this.storage.getDisplayList(false));\n    };\n    CanvasPainter.prototype._paintHoverList = function (list) {\n        var len = list.length;\n        var hoverLayer = this._hoverlayer;\n        hoverLayer && hoverLayer.clear();\n        if (!len) {\n            return;\n        }\n        var scope = {\n            inHover: true,\n            viewWidth: this._width,\n            viewHeight: this._height\n        };\n        var ctx;\n        for (var i = 0; i < len; i++) {\n            var el = list[i];\n            if (el.__inHover) {\n                if (!hoverLayer) {\n                    hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL);\n                }\n                if (!ctx) {\n                    ctx = hoverLayer.ctx;\n                    ctx.save();\n                }\n                brush(ctx, el, scope, i === len - 1);\n            }\n        }\n        if (ctx) {\n            ctx.restore();\n        }\n    };\n    CanvasPainter.prototype.getHoverLayer = function () {\n        return this.getLayer(HOVER_LAYER_ZLEVEL);\n    };\n    CanvasPainter.prototype.paintOne = function (ctx, el) {\n        brushSingle(ctx, el);\n    };\n    CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) {\n        if (this._redrawId !== redrawId) {\n            return;\n        }\n        paintAll = paintAll || false;\n        this._updateLayerStatus(list);\n        var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover;\n        if (this._needsManuallyCompositing) {\n            this._compositeManually();\n        }\n        if (needsRefreshHover) {\n            this._paintHoverList(list);\n        }\n        if (!finished) {\n            var self_1 = this;\n            requestAnimationFrame(function () {\n                self_1._paintList(list, prevList, paintAll, redrawId);\n            });\n        }\n        else {\n            this.eachLayer(function (layer) {\n                layer.afterBrush && layer.afterBrush();\n            });\n        }\n    };\n    CanvasPainter.prototype._compositeManually = function () {\n        var ctx = this.getLayer(CANVAS_ZLEVEL).ctx;\n        var width = this._domRoot.width;\n        var height = this._domRoot.height;\n        ctx.clearRect(0, 0, width, height);\n        this.eachBuiltinLayer(function (layer) {\n            if (layer.virtual) {\n                ctx.drawImage(layer.dom, 0, 0, width, height);\n            }\n        });\n    };\n    CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) {\n        var _this = this;\n        var layerList = [];\n        var useDirtyRect = this._opts.useDirtyRect;\n        for (var zi = 0; zi < this._zlevelList.length; zi++) {\n            var zlevel = this._zlevelList[zi];\n            var layer = this._layers[zlevel];\n            if (layer.__builtin__\n                && layer !== this._hoverlayer\n                && (layer.__dirty || paintAll)) {\n                layerList.push(layer);\n            }\n        }\n        var finished = true;\n        var needsRefreshHover = false;\n        var _loop_1 = function (k) {\n            var layer = layerList[k];\n            var ctx = layer.ctx;\n            var repaintRects = useDirtyRect\n                && layer.createRepaintRects(list, prevList, this_1._width, this_1._height);\n            var start = paintAll ? layer.__startIndex : layer.__drawIndex;\n            var useTimer = !paintAll && layer.incremental && Date.now;\n            var startTime = useTimer && Date.now();\n            var clearColor = layer.zlevel === this_1._zlevelList[0]\n                ? this_1._backgroundColor : null;\n            if (layer.__startIndex === layer.__endIndex) {\n                layer.clear(false, clearColor, repaintRects);\n            }\n            else if (start === layer.__startIndex) {\n                var firstEl = list[start];\n                if (!firstEl.incremental || !firstEl.notClear || paintAll) {\n                    layer.clear(false, clearColor, repaintRects);\n                }\n            }\n            if (start === -1) {\n                console.error('For some unknown reason. drawIndex is -1');\n                start = layer.__startIndex;\n            }\n            var i;\n            var repaint = function (repaintRect) {\n                var scope = {\n                    inHover: false,\n                    allClipped: false,\n                    prevEl: null,\n                    viewWidth: _this._width,\n                    viewHeight: _this._height\n                };\n                for (i = start; i < layer.__endIndex; i++) {\n                    var el = list[i];\n                    if (el.__inHover) {\n                        needsRefreshHover = true;\n                    }\n                    _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1);\n                    if (useTimer) {\n                        var dTime = Date.now() - startTime;\n                        if (dTime > 15) {\n                            break;\n                        }\n                    }\n                }\n                if (scope.prevElClipPaths) {\n                    ctx.restore();\n                }\n            };\n            if (repaintRects) {\n                if (repaintRects.length === 0) {\n                    i = layer.__endIndex;\n                }\n                else {\n                    var dpr = this_1.dpr;\n                    for (var r = 0; r < repaintRects.length; ++r) {\n                        var rect = repaintRects[r];\n                        ctx.save();\n                        ctx.beginPath();\n                        ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr);\n                        ctx.clip();\n                        repaint(rect);\n                        ctx.restore();\n                    }\n                }\n            }\n            else {\n                ctx.save();\n                repaint();\n                ctx.restore();\n            }\n            layer.__drawIndex = i;\n            if (layer.__drawIndex < layer.__endIndex) {\n                finished = false;\n            }\n        };\n        var this_1 = this;\n        for (var k = 0; k < layerList.length; k++) {\n            _loop_1(k);\n        }\n        if (env.wxa) {\n            util.each(this._layers, function (layer) {\n                if (layer && layer.ctx && layer.ctx.draw) {\n                    layer.ctx.draw();\n                }\n            });\n        }\n        return {\n            finished: finished,\n            needsRefreshHover: needsRefreshHover\n        };\n    };\n    CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) {\n        var ctx = currentLayer.ctx;\n        if (useDirtyRect) {\n            var paintRect = el.getPaintRect();\n            if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) {\n                brush(ctx, el, scope, isLast);\n                el.setPrevPaintRect(paintRect);\n            }\n        }\n        else {\n            brush(ctx, el, scope, isLast);\n        }\n    };\n    CanvasPainter.prototype.getLayer = function (zlevel, virtual) {\n        if (this._singleCanvas && !this._needsManuallyCompositing) {\n            zlevel = CANVAS_ZLEVEL;\n        }\n        var layer = this._layers[zlevel];\n        if (!layer) {\n            layer = new Layer('zr_' + zlevel, this, this.dpr);\n            layer.zlevel = zlevel;\n            layer.__builtin__ = true;\n            if (this._layerConfig[zlevel]) {\n                util.merge(layer, this._layerConfig[zlevel], true);\n            }\n            else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) {\n                util.merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true);\n            }\n            if (virtual) {\n                layer.virtual = virtual;\n            }\n            this.insertLayer(zlevel, layer);\n            layer.initContext();\n        }\n        return layer;\n    };\n    CanvasPainter.prototype.insertLayer = function (zlevel, layer) {\n        var layersMap = this._layers;\n        var zlevelList = this._zlevelList;\n        var len = zlevelList.length;\n        var domRoot = this._domRoot;\n        var prevLayer = null;\n        var i = -1;\n        if (layersMap[zlevel]) {\n            if (process.env.NODE_ENV !== 'production') {\n                util.logError('ZLevel ' + zlevel + ' has been used already');\n            }\n            return;\n        }\n        if (!isLayerValid(layer)) {\n            if (process.env.NODE_ENV !== 'production') {\n                util.logError('Layer of zlevel ' + zlevel + ' is not valid');\n            }\n            return;\n        }\n        if (len > 0 && zlevel > zlevelList[0]) {\n            for (i = 0; i < len - 1; i++) {\n                if (zlevelList[i] < zlevel\n                    && zlevelList[i + 1] > zlevel) {\n                    break;\n                }\n            }\n            prevLayer = layersMap[zlevelList[i]];\n        }\n        zlevelList.splice(i + 1, 0, zlevel);\n        layersMap[zlevel] = layer;\n        if (!layer.virtual) {\n            if (prevLayer) {\n                var prevDom = prevLayer.dom;\n                if (prevDom.nextSibling) {\n                    domRoot.insertBefore(layer.dom, prevDom.nextSibling);\n                }\n                else {\n                    domRoot.appendChild(layer.dom);\n                }\n            }\n            else {\n                if (domRoot.firstChild) {\n                    domRoot.insertBefore(layer.dom, domRoot.firstChild);\n                }\n                else {\n                    domRoot.appendChild(layer.dom);\n                }\n            }\n        }\n        layer.painter || (layer.painter = this);\n    };\n    CanvasPainter.prototype.eachLayer = function (cb, context) {\n        var zlevelList = this._zlevelList;\n        for (var i = 0; i < zlevelList.length; i++) {\n            var z = zlevelList[i];\n            cb.call(context, this._layers[z], z);\n        }\n    };\n    CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) {\n        var zlevelList = this._zlevelList;\n        for (var i = 0; i < zlevelList.length; i++) {\n            var z = zlevelList[i];\n            var layer = this._layers[z];\n            if (layer.__builtin__) {\n                cb.call(context, layer, z);\n            }\n        }\n    };\n    CanvasPainter.prototype.eachOtherLayer = function (cb, context) {\n        var zlevelList = this._zlevelList;\n        for (var i = 0; i < zlevelList.length; i++) {\n            var z = zlevelList[i];\n            var layer = this._layers[z];\n            if (!layer.__builtin__) {\n                cb.call(context, layer, z);\n            }\n        }\n    };\n    CanvasPainter.prototype.getLayers = function () {\n        return this._layers;\n    };\n    CanvasPainter.prototype._updateLayerStatus = function (list) {\n        this.eachBuiltinLayer(function (layer, z) {\n            layer.__dirty = layer.__used = false;\n        });\n        function updatePrevLayer(idx) {\n            if (prevLayer) {\n                if (prevLayer.__endIndex !== idx) {\n                    prevLayer.__dirty = true;\n                }\n                prevLayer.__endIndex = idx;\n            }\n        }\n        if (this._singleCanvas) {\n            for (var i_1 = 1; i_1 < list.length; i_1++) {\n                var el = list[i_1];\n                if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) {\n                    this._needsManuallyCompositing = true;\n                    break;\n                }\n            }\n        }\n        var prevLayer = null;\n        var incrementalLayerCount = 0;\n        var prevZlevel;\n        var i;\n        for (i = 0; i < list.length; i++) {\n            var el = list[i];\n            var zlevel = el.zlevel;\n            var layer = void 0;\n            if (prevZlevel !== zlevel) {\n                prevZlevel = zlevel;\n                incrementalLayerCount = 0;\n            }\n            if (el.incremental) {\n                layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing);\n                layer.incremental = true;\n                incrementalLayerCount = 1;\n            }\n            else {\n                layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing);\n            }\n            if (!layer.__builtin__) {\n                util.logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id);\n            }\n            if (layer !== prevLayer) {\n                layer.__used = true;\n                if (layer.__startIndex !== i) {\n                    layer.__dirty = true;\n                }\n                layer.__startIndex = i;\n                if (!layer.incremental) {\n                    layer.__drawIndex = i;\n                }\n                else {\n                    layer.__drawIndex = -1;\n                }\n                updatePrevLayer(i);\n                prevLayer = layer;\n            }\n            if ((el.__dirty & REDRAW_BIT) && !el.__inHover) {\n                layer.__dirty = true;\n                if (layer.incremental && layer.__drawIndex < 0) {\n                    layer.__drawIndex = i;\n                }\n            }\n        }\n        updatePrevLayer(i);\n        this.eachBuiltinLayer(function (layer, z) {\n            if (!layer.__used && layer.getElementCount() > 0) {\n                layer.__dirty = true;\n                layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0;\n            }\n            if (layer.__dirty && layer.__drawIndex < 0) {\n                layer.__drawIndex = layer.__startIndex;\n            }\n        });\n    };\n    CanvasPainter.prototype.clear = function () {\n        this.eachBuiltinLayer(this._clearLayer);\n        return this;\n    };\n    CanvasPainter.prototype._clearLayer = function (layer) {\n        layer.clear();\n    };\n    CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) {\n        this._backgroundColor = backgroundColor;\n        util.each(this._layers, function (layer) {\n            layer.setUnpainted();\n        });\n    };\n    CanvasPainter.prototype.configLayer = function (zlevel, config) {\n        if (config) {\n            var layerConfig = this._layerConfig;\n            if (!layerConfig[zlevel]) {\n                layerConfig[zlevel] = config;\n            }\n            else {\n                util.merge(layerConfig[zlevel], config, true);\n            }\n            for (var i = 0; i < this._zlevelList.length; i++) {\n                var _zlevel = this._zlevelList[i];\n                if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) {\n                    var layer = this._layers[_zlevel];\n                    util.merge(layer, layerConfig[zlevel], true);\n                }\n            }\n        }\n    };\n    CanvasPainter.prototype.delLayer = function (zlevel) {\n        var layers = this._layers;\n        var zlevelList = this._zlevelList;\n        var layer = layers[zlevel];\n        if (!layer) {\n            return;\n        }\n        layer.dom.parentNode.removeChild(layer.dom);\n        delete layers[zlevel];\n        zlevelList.splice(util.indexOf(zlevelList, zlevel), 1);\n    };\n    CanvasPainter.prototype.resize = function (width, height) {\n        if (!this._domRoot.style) {\n            if (width == null || height == null) {\n                return;\n            }\n            this._width = width;\n            this._height = height;\n            this.getLayer(CANVAS_ZLEVEL).resize(width, height);\n        }\n        else {\n            var domRoot = this._domRoot;\n            domRoot.style.display = 'none';\n            var opts = this._opts;\n            var root = this.root;\n            width != null && (opts.width = width);\n            height != null && (opts.height = height);\n            width = getSize(root, 0, opts);\n            height = getSize(root, 1, opts);\n            domRoot.style.display = '';\n            if (this._width !== width || height !== this._height) {\n                domRoot.style.width = width + 'px';\n                domRoot.style.height = height + 'px';\n                for (var id in this._layers) {\n                    if (this._layers.hasOwnProperty(id)) {\n                        this._layers[id].resize(width, height);\n                    }\n                }\n                this.refresh(true);\n            }\n            this._width = width;\n            this._height = height;\n        }\n        return this;\n    };\n    CanvasPainter.prototype.clearLayer = function (zlevel) {\n        var layer = this._layers[zlevel];\n        if (layer) {\n            layer.clear();\n        }\n    };\n    CanvasPainter.prototype.dispose = function () {\n        this.root.innerHTML = '';\n        this.root =\n            this.storage =\n                this._domRoot =\n                    this._layers = null;\n    };\n    CanvasPainter.prototype.getRenderedCanvas = function (opts) {\n        opts = opts || {};\n        if (this._singleCanvas && !this._compositeManually) {\n            return this._layers[CANVAS_ZLEVEL].dom;\n        }\n        var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr);\n        imageLayer.initContext();\n        imageLayer.clear(false, opts.backgroundColor || this._backgroundColor);\n        var ctx = imageLayer.ctx;\n        if (opts.pixelRatio <= this.dpr) {\n            this.refresh();\n            var width_1 = imageLayer.dom.width;\n            var height_1 = imageLayer.dom.height;\n            this.eachLayer(function (layer) {\n                if (layer.__builtin__) {\n                    ctx.drawImage(layer.dom, 0, 0, width_1, height_1);\n                }\n                else if (layer.renderToCanvas) {\n                    ctx.save();\n                    layer.renderToCanvas(ctx);\n                    ctx.restore();\n                }\n            });\n        }\n        else {\n            var scope = {\n                inHover: false,\n                viewWidth: this._width,\n                viewHeight: this._height\n            };\n            var displayList = this.storage.getDisplayList(true);\n            for (var i = 0, len = displayList.length; i < len; i++) {\n                var el = displayList[i];\n                brush(ctx, el, scope, i === len - 1);\n            }\n        }\n        return imageLayer.dom;\n    };\n    CanvasPainter.prototype.getWidth = function () {\n        return this._width;\n    };\n    CanvasPainter.prototype.getHeight = function () {\n        return this._height;\n    };\n    return CanvasPainter;\n}());\nexport default CanvasPainter;\n;\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport CanvasPainter from 'zrender/lib/canvas/Painter.js';\nexport function install(registers) {\n  registers.registerPainter('canvas', CanvasPainter);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport createSeriesData from '../helper/createSeriesData.js';\nimport SeriesModel from '../../model/Series.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport { Group } from '../../util/graphic.js';\nimport tokens from '../../visual/tokens.js';\nvar LineSeriesModel = /** @class */function (_super) {\n  __extends(LineSeriesModel, _super);\n  function LineSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = LineSeriesModel.type;\n    _this.hasSymbolVisual = true;\n    return _this;\n  }\n  LineSeriesModel.prototype.getInitialData = function (option) {\n    if (process.env.NODE_ENV !== 'production') {\n      var coordSys = option.coordinateSystem;\n      if (coordSys !== 'polar' && coordSys !== 'cartesian2d') {\n        throw new Error('Line not support coordinateSystem besides cartesian and polar');\n      }\n    }\n    return createSeriesData(null, this, {\n      useEncodeDefaulter: true\n    });\n  };\n  LineSeriesModel.prototype.getLegendIcon = function (opt) {\n    var group = new Group();\n    var line = createSymbol('line', 0, opt.itemHeight / 2, opt.itemWidth, 0, opt.lineStyle.stroke, false);\n    group.add(line);\n    line.setStyle(opt.lineStyle);\n    var visualType = this.getData().getVisual('symbol');\n    var visualRotate = this.getData().getVisual('symbolRotate');\n    var symbolType = visualType === 'none' ? 'circle' : visualType;\n    // Symbol size is 80% when there is a line\n    var size = opt.itemHeight * 0.8;\n    var symbol = createSymbol(symbolType, (opt.itemWidth - size) / 2, (opt.itemHeight - size) / 2, size, size, opt.itemStyle.fill);\n    group.add(symbol);\n    symbol.setStyle(opt.itemStyle);\n    var symbolRotate = opt.iconRotate === 'inherit' ? visualRotate : opt.iconRotate || 0;\n    symbol.rotation = symbolRotate * Math.PI / 180;\n    symbol.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]);\n    if (symbolType.indexOf('empty') > -1) {\n      symbol.style.stroke = symbol.style.fill;\n      symbol.style.fill = tokens.color.neutral00;\n      symbol.style.lineWidth = 2;\n    }\n    return group;\n  };\n  LineSeriesModel.type = 'series.line';\n  LineSeriesModel.dependencies = ['grid', 'polar'];\n  LineSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 3,\n    coordinateSystem: 'cartesian2d',\n    legendHoverLink: true,\n    clip: true,\n    label: {\n      position: 'top'\n    },\n    // itemStyle: {\n    // },\n    endLabel: {\n      show: false,\n      valueAnimation: true,\n      distance: 8\n    },\n    lineStyle: {\n      width: 2,\n      type: 'solid'\n    },\n    emphasis: {\n      scale: true\n    },\n    // areaStyle: {\n    // origin of areaStyle. Valid values:\n    // `'auto'/null/undefined`: from axisLine to data\n    // `'start'`: from min to data\n    // `'end'`: from data to max\n    // origin: 'auto'\n    // },\n    // false, 'start', 'end', 'middle'\n    step: false,\n    // Disabled if step is true\n    smooth: false,\n    smoothMonotone: null,\n    symbol: 'emptyCircle',\n    symbolSize: 6,\n    symbolRotate: null,\n    showSymbol: true,\n    // `false`: follow the label interval strategy.\n    // `true`: show all symbols.\n    // `'auto'`: If possible, show all symbols, otherwise\n    //           follow the label interval strategy.\n    showAllSymbol: 'auto',\n    // Whether to connect break point.\n    connectNulls: false,\n    // Sampling for large data. Can be: 'average', 'max', 'min', 'sum', 'lttb'.\n    sampling: 'none',\n    animationEasing: 'linear',\n    // Disable progressive\n    progressive: 0,\n    hoverLayerThreshold: Infinity,\n    universalTransition: {\n      divideShape: 'clone'\n    },\n    triggerLineEvent: false\n  };\n  return LineSeriesModel;\n}(SeriesModel);\nexport default LineSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { retrieveRawValue } from '../../data/helper/dataProvider.js';\nimport { isArray } from 'zrender/lib/core/util.js';\n/**\n * @return label string. Not null/undefined\n */\nexport function getDefaultLabel(data, dataIndex) {\n  var labelDims = data.mapDimensionsAll('defaultedLabel');\n  var len = labelDims.length;\n  // Simple optimization (in lots of cases, label dims length is 1)\n  if (len === 1) {\n    var rawVal = retrieveRawValue(data, dataIndex, labelDims[0]);\n    return rawVal != null ? rawVal + '' : null;\n  } else if (len) {\n    var vals = [];\n    for (var i = 0; i < labelDims.length; i++) {\n      vals.push(retrieveRawValue(data, dataIndex, labelDims[i]));\n    }\n    return vals.join(' ');\n  }\n}\nexport function getDefaultInterpolatedLabel(data, interpolatedValue) {\n  var labelDims = data.mapDimensionsAll('defaultedLabel');\n  if (!isArray(interpolatedValue)) {\n    return interpolatedValue + '';\n  }\n  var vals = [];\n  for (var i = 0; i < labelDims.length; i++) {\n    var dimIndex = data.getDimensionIndex(labelDims[i]);\n    if (dimIndex >= 0) {\n      vals.push(interpolatedValue[dimIndex]);\n    }\n  }\n  return vals.join(' ');\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { createSymbol, normalizeSymbolOffset, normalizeSymbolSize } from '../../util/symbol.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { enterEmphasis, leaveEmphasis, toggleHoverEmphasis } from '../../util/states.js';\nimport { getDefaultLabel } from './labelHelper.js';\nimport { extend, retrieve2 } from 'zrender/lib/core/util.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport ZRImage from 'zrender/lib/graphic/Image.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nvar Symbol = /** @class */function (_super) {\n  __extends(Symbol, _super);\n  function Symbol(data, idx, seriesScope, opts) {\n    var _this = _super.call(this) || this;\n    _this.updateData(data, idx, seriesScope, opts);\n    return _this;\n  }\n  Symbol.prototype._createSymbol = function (symbolType, data, idx, symbolSize, z2, keepAspect) {\n    // Remove paths created before\n    this.removeAll();\n    // let symbolPath = createSymbol(\n    //     symbolType, -0.5, -0.5, 1, 1, color\n    // );\n    // If width/height are set too small (e.g., set to 1) on ios10\n    // and macOS Sierra, a circle stroke become a rect, no matter what\n    // the scale is set. So we set width/height as 2. See #4150.\n    var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, null, keepAspect);\n    symbolPath.attr({\n      z2: retrieve2(z2, 100),\n      culling: true,\n      scaleX: symbolSize[0] / 2,\n      scaleY: symbolSize[1] / 2\n    });\n    // Rewrite drift method\n    symbolPath.drift = driftSymbol;\n    this._symbolType = symbolType;\n    this.add(symbolPath);\n  };\n  /**\n   * Stop animation\n   * @param {boolean} toLastFrame\n   */\n  Symbol.prototype.stopSymbolAnimation = function (toLastFrame) {\n    this.childAt(0).stopAnimation(null, toLastFrame);\n  };\n  Symbol.prototype.getSymbolType = function () {\n    return this._symbolType;\n  };\n  /**\n   * FIXME:\n   * Caution: This method breaks the encapsulation of this module,\n   * but it indeed brings convenience. So do not use the method\n   * unless you detailedly know all the implements of `Symbol`,\n   * especially animation.\n   *\n   * Get symbol path element.\n   */\n  Symbol.prototype.getSymbolPath = function () {\n    return this.childAt(0);\n  };\n  /**\n   * Highlight symbol\n   */\n  Symbol.prototype.highlight = function () {\n    enterEmphasis(this.childAt(0));\n  };\n  /**\n   * Downplay symbol\n   */\n  Symbol.prototype.downplay = function () {\n    leaveEmphasis(this.childAt(0));\n  };\n  /**\n   * @param {number} zlevel\n   * @param {number} z\n   */\n  Symbol.prototype.setZ = function (zlevel, z) {\n    var symbolPath = this.childAt(0);\n    symbolPath.zlevel = zlevel;\n    symbolPath.z = z;\n  };\n  Symbol.prototype.setDraggable = function (draggable, hasCursorOption) {\n    var symbolPath = this.childAt(0);\n    symbolPath.draggable = draggable;\n    symbolPath.cursor = !hasCursorOption && draggable ? 'move' : symbolPath.cursor;\n  };\n  /**\n   * Update symbol properties\n   */\n  Symbol.prototype.updateData = function (data, idx, seriesScope, opts) {\n    this.silent = false;\n    var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n    var seriesModel = data.hostModel;\n    var symbolSize = Symbol.getSymbolSize(data, idx);\n    var z2 = Symbol.getSymbolZ2(data, idx);\n    var isInit = symbolType !== this._symbolType;\n    var disableAnimation = opts && opts.disableAnimation;\n    if (isInit) {\n      var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect');\n      this._createSymbol(symbolType, data, idx, symbolSize, z2, keepAspect);\n    } else {\n      var symbolPath = this.childAt(0);\n      symbolPath.silent = false;\n      var target = {\n        scaleX: symbolSize[0] / 2,\n        scaleY: symbolSize[1] / 2\n      };\n      disableAnimation ? symbolPath.attr(target) : graphic.updateProps(symbolPath, target, seriesModel, idx);\n      saveOldStyle(symbolPath);\n    }\n    this._updateCommon(data, idx, symbolSize, seriesScope, opts);\n    if (isInit) {\n      var symbolPath = this.childAt(0);\n      if (!disableAnimation) {\n        var target = {\n          scaleX: this._sizeX,\n          scaleY: this._sizeY,\n          style: {\n            // Always fadeIn. Because it has fadeOut animation when symbol is removed..\n            opacity: symbolPath.style.opacity\n          }\n        };\n        symbolPath.scaleX = symbolPath.scaleY = 0;\n        symbolPath.style.opacity = 0;\n        graphic.initProps(symbolPath, target, seriesModel, idx);\n      }\n    }\n    if (disableAnimation) {\n      // Must stop leave transition manually if don't call initProps or updateProps.\n      this.childAt(0).stopAnimation('leave');\n    }\n  };\n  Symbol.prototype._updateCommon = function (data, idx, symbolSize, seriesScope, opts) {\n    var symbolPath = this.childAt(0);\n    var seriesModel = data.hostModel;\n    var emphasisItemStyle;\n    var blurItemStyle;\n    var selectItemStyle;\n    var focus;\n    var blurScope;\n    var emphasisDisabled;\n    var labelStatesModels;\n    var hoverScale;\n    var cursorStyle;\n    if (seriesScope) {\n      emphasisItemStyle = seriesScope.emphasisItemStyle;\n      blurItemStyle = seriesScope.blurItemStyle;\n      selectItemStyle = seriesScope.selectItemStyle;\n      focus = seriesScope.focus;\n      blurScope = seriesScope.blurScope;\n      labelStatesModels = seriesScope.labelStatesModels;\n      hoverScale = seriesScope.hoverScale;\n      cursorStyle = seriesScope.cursorStyle;\n      emphasisDisabled = seriesScope.emphasisDisabled;\n    }\n    if (!seriesScope || data.hasItemOption) {\n      var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx);\n      var emphasisModel = itemModel.getModel('emphasis');\n      emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n      selectItemStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle();\n      blurItemStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle();\n      focus = emphasisModel.get('focus');\n      blurScope = emphasisModel.get('blurScope');\n      emphasisDisabled = emphasisModel.get('disabled');\n      labelStatesModels = getLabelStatesModels(itemModel);\n      hoverScale = emphasisModel.getShallow('scale');\n      cursorStyle = itemModel.getShallow('cursor');\n    }\n    var symbolRotate = data.getItemVisual(idx, 'symbolRotate');\n    symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0);\n    var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize);\n    if (symbolOffset) {\n      symbolPath.x = symbolOffset[0];\n      symbolPath.y = symbolOffset[1];\n    }\n    cursorStyle && symbolPath.attr('cursor', cursorStyle);\n    var symbolStyle = data.getItemVisual(idx, 'style');\n    var visualColor = symbolStyle.fill;\n    if (symbolPath instanceof ZRImage) {\n      var pathStyle = symbolPath.style;\n      symbolPath.useStyle(extend({\n        // TODO other properties like x, y ?\n        image: pathStyle.image,\n        x: pathStyle.x,\n        y: pathStyle.y,\n        width: pathStyle.width,\n        height: pathStyle.height\n      }, symbolStyle));\n    } else {\n      if (symbolPath.__isEmptyBrush) {\n        // fill and stroke will be swapped if it's empty.\n        // So we cloned a new style to avoid it affecting the original style in visual storage.\n        // TODO Better implementation. No empty logic!\n        symbolPath.useStyle(extend({}, symbolStyle));\n      } else {\n        symbolPath.useStyle(symbolStyle);\n      }\n      // Disable decal because symbol scale will been applied on the decal.\n      symbolPath.style.decal = null;\n      symbolPath.setColor(visualColor, opts && opts.symbolInnerColor);\n      symbolPath.style.strokeNoScale = true;\n    }\n    var liftZ = data.getItemVisual(idx, 'liftZ');\n    var z2Origin = this._z2;\n    if (liftZ != null) {\n      if (z2Origin == null) {\n        this._z2 = symbolPath.z2;\n        symbolPath.z2 += liftZ;\n      }\n    } else if (z2Origin != null) {\n      symbolPath.z2 = z2Origin;\n      this._z2 = null;\n    }\n    var useNameLabel = opts && opts.useNameLabel;\n    setLabelStyle(symbolPath, labelStatesModels, {\n      labelFetcher: seriesModel,\n      labelDataIndex: idx,\n      defaultText: getLabelDefaultText,\n      inheritColor: visualColor,\n      defaultOpacity: symbolStyle.opacity\n    });\n    // Do not execute util needed.\n    function getLabelDefaultText(idx) {\n      return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx);\n    }\n    this._sizeX = symbolSize[0] / 2;\n    this._sizeY = symbolSize[1] / 2;\n    var emphasisState = symbolPath.ensureState('emphasis');\n    emphasisState.style = emphasisItemStyle;\n    symbolPath.ensureState('select').style = selectItemStyle;\n    symbolPath.ensureState('blur').style = blurItemStyle;\n    // null / undefined / true means to use default strategy.\n    // 0 / false / negative number / NaN / Infinity means no scale.\n    var scaleRatio = hoverScale == null || hoverScale === true ? Math.max(1.1, 3 / this._sizeY)\n    // PENDING: restrict hoverScale > 1? It seems unreasonable to scale down\n    : isFinite(hoverScale) && hoverScale > 0 ? +hoverScale : 1;\n    // always set scale to allow resetting\n    emphasisState.scaleX = this._sizeX * scaleRatio;\n    emphasisState.scaleY = this._sizeY * scaleRatio;\n    this.setSymbolScale(1);\n    toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled);\n  };\n  Symbol.prototype.setSymbolScale = function (scale) {\n    this.scaleX = this.scaleY = scale;\n  };\n  Symbol.prototype.fadeOut = function (cb, seriesModel, opt) {\n    var symbolPath = this.childAt(0);\n    var dataIndex = getECData(this).dataIndex;\n    var animationOpt = opt && opt.animation;\n    // Avoid mistaken hover when fading out\n    this.silent = symbolPath.silent = true;\n    // Not show text when animating\n    if (opt && opt.fadeLabel) {\n      var textContent = symbolPath.getTextContent();\n      if (textContent) {\n        graphic.removeElement(textContent, {\n          style: {\n            opacity: 0\n          }\n        }, seriesModel, {\n          dataIndex: dataIndex,\n          removeOpt: animationOpt,\n          cb: function () {\n            symbolPath.removeTextContent();\n          }\n        });\n      }\n    } else {\n      symbolPath.removeTextContent();\n    }\n    graphic.removeElement(symbolPath, {\n      style: {\n        opacity: 0\n      },\n      scaleX: 0,\n      scaleY: 0\n    }, seriesModel, {\n      dataIndex: dataIndex,\n      cb: cb,\n      removeOpt: animationOpt\n    });\n  };\n  Symbol.getSymbolSize = function (data, idx) {\n    return normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n  };\n  Symbol.getSymbolZ2 = function (data, idx) {\n    return data.getItemVisual(idx, 'z2');\n  };\n  return Symbol;\n}(graphic.Group);\nfunction driftSymbol(dx, dy) {\n  this.parent.drift(dx, dy);\n}\nexport default Symbol;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as graphic from '../../util/graphic.js';\nimport SymbolClz from './Symbol.js';\nimport { isObject } from 'zrender/lib/core/util.js';\nimport { getLabelStatesModels } from '../../label/labelStyle.js';\nfunction symbolNeedsDraw(data, point, idx, opt) {\n  return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx))\n  // We do not set clipShape on group, because it will cut part of\n  // the symbol element shape. We use the same clip shape here as\n  // the line clip.\n  && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none';\n}\nfunction normalizeUpdateOpt(opt) {\n  if (opt != null && !isObject(opt)) {\n    opt = {\n      isIgnore: opt\n    };\n  }\n  return opt || {};\n}\nfunction makeSeriesScope(data) {\n  var seriesModel = data.hostModel;\n  var emphasisModel = seriesModel.getModel('emphasis');\n  return {\n    emphasisItemStyle: emphasisModel.getModel('itemStyle').getItemStyle(),\n    blurItemStyle: seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(),\n    selectItemStyle: seriesModel.getModel(['select', 'itemStyle']).getItemStyle(),\n    focus: emphasisModel.get('focus'),\n    blurScope: emphasisModel.get('blurScope'),\n    emphasisDisabled: emphasisModel.get('disabled'),\n    hoverScale: emphasisModel.get('scale'),\n    labelStatesModels: getLabelStatesModels(seriesModel),\n    cursorStyle: seriesModel.get('cursor')\n  };\n}\nvar SymbolDraw = /** @class */function () {\n  function SymbolDraw(SymbolCtor) {\n    this.group = new graphic.Group();\n    this._SymbolCtor = SymbolCtor || SymbolClz;\n  }\n  /**\n   * Update symbols draw by new data\n   */\n  SymbolDraw.prototype.updateData = function (data, opt) {\n    // Remove progressive els.\n    this._progressiveEls = null;\n    opt = normalizeUpdateOpt(opt);\n    var group = this.group;\n    var seriesModel = data.hostModel;\n    var oldData = this._data;\n    var SymbolCtor = this._SymbolCtor;\n    var disableAnimation = opt.disableAnimation;\n    var seriesScope = makeSeriesScope(data);\n    var symbolUpdateOpt = {\n      disableAnimation: disableAnimation\n    };\n    var getSymbolPoint = opt.getSymbolPoint || function (idx) {\n      return data.getItemLayout(idx);\n    };\n    // There is no oldLineData only when first rendering or switching from\n    // stream mode to normal mode, where previous elements should be removed.\n    if (!oldData) {\n      group.removeAll();\n    }\n    data.diff(oldData).add(function (newIdx) {\n      var point = getSymbolPoint(newIdx);\n      if (symbolNeedsDraw(data, point, newIdx, opt)) {\n        var symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt);\n        symbolEl.setPosition(point);\n        data.setItemGraphicEl(newIdx, symbolEl);\n        group.add(symbolEl);\n      }\n    }).update(function (newIdx, oldIdx) {\n      var symbolEl = oldData.getItemGraphicEl(oldIdx);\n      var point = getSymbolPoint(newIdx);\n      if (!symbolNeedsDraw(data, point, newIdx, opt)) {\n        group.remove(symbolEl);\n        return;\n      }\n      var newSymbolType = data.getItemVisual(newIdx, 'symbol') || 'circle';\n      var oldSymbolType = symbolEl && symbolEl.getSymbolType && symbolEl.getSymbolType();\n      if (!symbolEl\n      // Create a new if symbol type changed.\n      || oldSymbolType && oldSymbolType !== newSymbolType) {\n        group.remove(symbolEl);\n        symbolEl = new SymbolCtor(data, newIdx, seriesScope, symbolUpdateOpt);\n        symbolEl.setPosition(point);\n      } else {\n        symbolEl.updateData(data, newIdx, seriesScope, symbolUpdateOpt);\n        var target = {\n          x: point[0],\n          y: point[1]\n        };\n        disableAnimation ? symbolEl.attr(target) : graphic.updateProps(symbolEl, target, seriesModel);\n      }\n      // Add back\n      group.add(symbolEl);\n      data.setItemGraphicEl(newIdx, symbolEl);\n    }).remove(function (oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el && el.fadeOut(function () {\n        group.remove(el);\n      }, seriesModel);\n    }).execute();\n    this._getSymbolPoint = getSymbolPoint;\n    this._data = data;\n  };\n  ;\n  SymbolDraw.prototype.updateLayout = function () {\n    var _this = this;\n    var data = this._data;\n    if (data) {\n      // Not use animation\n      data.eachItemGraphicEl(function (el, idx) {\n        var point = _this._getSymbolPoint(idx);\n        el.setPosition(point);\n        el.markRedraw();\n      });\n    }\n  };\n  ;\n  SymbolDraw.prototype.incrementalPrepareUpdate = function (data) {\n    this._seriesScope = makeSeriesScope(data);\n    this._data = null;\n    this.group.removeAll();\n  };\n  ;\n  /**\n   * Update symbols draw by new data\n   */\n  SymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) {\n    // Clear\n    this._progressiveEls = [];\n    opt = normalizeUpdateOpt(opt);\n    function updateIncrementalAndHover(el) {\n      if (!el.isGroup) {\n        el.incremental = true;\n        el.ensureState('emphasis').hoverLayer = true;\n      }\n    }\n    for (var idx = taskParams.start; idx < taskParams.end; idx++) {\n      var point = data.getItemLayout(idx);\n      if (symbolNeedsDraw(data, point, idx, opt)) {\n        var el = new this._SymbolCtor(data, idx, this._seriesScope);\n        el.traverse(updateIncrementalAndHover);\n        el.setPosition(point);\n        this.group.add(el);\n        data.setItemGraphicEl(idx, el);\n        this._progressiveEls.push(el);\n      }\n    }\n  };\n  ;\n  SymbolDraw.prototype.eachRendered = function (cb) {\n    graphic.traverseElements(this._progressiveEls || this.group, cb);\n  };\n  SymbolDraw.prototype.remove = function (enableAnimation) {\n    var group = this.group;\n    var data = this._data;\n    // Incremental model do not have this._data.\n    if (data && enableAnimation) {\n      data.eachItemGraphicEl(function (el) {\n        el.fadeOut(function () {\n          group.remove(el);\n        }, data.hostModel);\n      });\n    } else {\n      group.removeAll();\n    }\n  };\n  ;\n  return SymbolDraw;\n}();\nexport default SymbolDraw;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isDimensionStacked } from '../../data/helper/dataStackHelper.js';\nimport { isNumber, map } from 'zrender/lib/core/util.js';\nexport function prepareDataCoordInfo(coordSys, data, valueOrigin) {\n  var baseAxis = coordSys.getBaseAxis();\n  var valueAxis = coordSys.getOtherAxis(baseAxis);\n  var valueStart = getValueStart(valueAxis, valueOrigin);\n  var baseAxisDim = baseAxis.dim;\n  var valueAxisDim = valueAxis.dim;\n  var valueDim = data.mapDimension(valueAxisDim);\n  var baseDim = data.mapDimension(baseAxisDim);\n  var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;\n  var dims = map(coordSys.dimensions, function (coordDim) {\n    return data.mapDimension(coordDim);\n  });\n  var stacked = false;\n  var stackResultDim = data.getCalculationInfo('stackResultDimension');\n  if (isDimensionStacked(data, dims[0] /* , dims[1] */)) {\n    // jshint ignore:line\n    stacked = true;\n    dims[0] = stackResultDim;\n  }\n  if (isDimensionStacked(data, dims[1] /* , dims[0] */)) {\n    // jshint ignore:line\n    stacked = true;\n    dims[1] = stackResultDim;\n  }\n  return {\n    dataDimsForPoint: dims,\n    valueStart: valueStart,\n    valueAxisDim: valueAxisDim,\n    baseAxisDim: baseAxisDim,\n    stacked: !!stacked,\n    valueDim: valueDim,\n    baseDim: baseDim,\n    baseDataOffset: baseDataOffset,\n    stackedOverDimension: data.getCalculationInfo('stackedOverDimension')\n  };\n}\nfunction getValueStart(valueAxis, valueOrigin) {\n  var valueStart = 0;\n  var extent = valueAxis.scale.getExtent();\n  if (valueOrigin === 'start') {\n    valueStart = extent[0];\n  } else if (valueOrigin === 'end') {\n    valueStart = extent[1];\n  }\n  // If origin is specified as a number, use it as\n  // valueStart directly\n  else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) {\n    valueStart = valueOrigin;\n  }\n  // auto\n  else {\n    // Both positive\n    if (extent[0] > 0) {\n      valueStart = extent[0];\n    }\n    // Both negative\n    else if (extent[1] < 0) {\n      valueStart = extent[1];\n    }\n    // If is one positive, and one negative, onZero shall be true\n  }\n  return valueStart;\n}\nexport function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) {\n  var value = NaN;\n  if (dataCoordInfo.stacked) {\n    value = data.get(data.getCalculationInfo('stackedOverDimension'), idx);\n  }\n  if (isNaN(value)) {\n    value = dataCoordInfo.valueStart;\n  }\n  var baseDataOffset = dataCoordInfo.baseDataOffset;\n  var stackedData = [];\n  stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx);\n  stackedData[1 - baseDataOffset] = value;\n  return coordSys.dataToPoint(stackedData);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { prepareDataCoordInfo, getStackedOnPoint } from './helper.js';\nimport { createFloat32Array } from '../../util/vendor.js';\nfunction diffData(oldData, newData) {\n  var diffResult = [];\n  newData.diff(oldData).add(function (idx) {\n    diffResult.push({\n      cmd: '+',\n      idx: idx\n    });\n  }).update(function (newIdx, oldIdx) {\n    diffResult.push({\n      cmd: '=',\n      idx: oldIdx,\n      idx1: newIdx\n    });\n  }).remove(function (idx) {\n    diffResult.push({\n      cmd: '-',\n      idx: idx\n    });\n  }).execute();\n  return diffResult;\n}\nexport default function lineAnimationDiff(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) {\n  var diff = diffData(oldData, newData);\n  // let newIdList = newData.mapArray(newData.getId);\n  // let oldIdList = oldData.mapArray(oldData.getId);\n  // convertToIntId(newIdList, oldIdList);\n  // // FIXME One data ?\n  // diff = arrayDiff(oldIdList, newIdList);\n  var currPoints = [];\n  var nextPoints = [];\n  // Points for stacking base line\n  var currStackedPoints = [];\n  var nextStackedPoints = [];\n  var status = [];\n  var sortedIndices = [];\n  var rawIndices = [];\n  var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin);\n  // const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin);\n  var oldPoints = oldData.getLayout('points') || [];\n  var newPoints = newData.getLayout('points') || [];\n  for (var i = 0; i < diff.length; i++) {\n    var diffItem = diff[i];\n    var pointAdded = true;\n    var oldIdx2 = void 0;\n    var newIdx2 = void 0;\n    // FIXME, animation is not so perfect when dataZoom window moves fast\n    // Which is in case remvoing or add more than one data in the tail or head\n    switch (diffItem.cmd) {\n      case '=':\n        oldIdx2 = diffItem.idx * 2;\n        newIdx2 = diffItem.idx1 * 2;\n        var currentX = oldPoints[oldIdx2];\n        var currentY = oldPoints[oldIdx2 + 1];\n        var nextX = newPoints[newIdx2];\n        var nextY = newPoints[newIdx2 + 1];\n        // If previous data is NaN, use next point directly\n        if (isNaN(currentX) || isNaN(currentY)) {\n          currentX = nextX;\n          currentY = nextY;\n        }\n        currPoints.push(currentX, currentY);\n        nextPoints.push(nextX, nextY);\n        currStackedPoints.push(oldStackedOnPoints[oldIdx2], oldStackedOnPoints[oldIdx2 + 1]);\n        nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]);\n        rawIndices.push(newData.getRawIndex(diffItem.idx1));\n        break;\n      case '+':\n        var newIdx = diffItem.idx;\n        var newDataDimsForPoint = newDataOldCoordInfo.dataDimsForPoint;\n        var oldPt = oldCoordSys.dataToPoint([newData.get(newDataDimsForPoint[0], newIdx), newData.get(newDataDimsForPoint[1], newIdx)]);\n        newIdx2 = newIdx * 2;\n        currPoints.push(oldPt[0], oldPt[1]);\n        nextPoints.push(newPoints[newIdx2], newPoints[newIdx2 + 1]);\n        var stackedOnPoint = getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, newIdx);\n        currStackedPoints.push(stackedOnPoint[0], stackedOnPoint[1]);\n        nextStackedPoints.push(newStackedOnPoints[newIdx2], newStackedOnPoints[newIdx2 + 1]);\n        rawIndices.push(newData.getRawIndex(newIdx));\n        break;\n      case '-':\n        pointAdded = false;\n    }\n    // Original indices\n    if (pointAdded) {\n      status.push(diffItem);\n      sortedIndices.push(sortedIndices.length);\n    }\n  }\n  // Diff result may be crossed if all items are changed\n  // Sort by data index\n  sortedIndices.sort(function (a, b) {\n    return rawIndices[a] - rawIndices[b];\n  });\n  var len = currPoints.length;\n  var sortedCurrPoints = createFloat32Array(len);\n  var sortedNextPoints = createFloat32Array(len);\n  var sortedCurrStackedPoints = createFloat32Array(len);\n  var sortedNextStackedPoints = createFloat32Array(len);\n  var sortedStatus = [];\n  for (var i = 0; i < sortedIndices.length; i++) {\n    var idx = sortedIndices[i];\n    var i2 = i * 2;\n    var idx2 = idx * 2;\n    sortedCurrPoints[i2] = currPoints[idx2];\n    sortedCurrPoints[i2 + 1] = currPoints[idx2 + 1];\n    sortedNextPoints[i2] = nextPoints[idx2];\n    sortedNextPoints[i2 + 1] = nextPoints[idx2 + 1];\n    sortedCurrStackedPoints[i2] = currStackedPoints[idx2];\n    sortedCurrStackedPoints[i2 + 1] = currStackedPoints[idx2 + 1];\n    sortedNextStackedPoints[i2] = nextStackedPoints[idx2];\n    sortedNextStackedPoints[i2 + 1] = nextStackedPoints[idx2 + 1];\n    sortedStatus[i] = status[idx];\n  }\n  return {\n    current: sortedCurrPoints,\n    next: sortedNextPoints,\n    stackedOnCurrent: sortedCurrStackedPoints,\n    stackedOnNext: sortedNextStackedPoints,\n    status: sortedStatus\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n// Poly path support NaN point\nimport Path from 'zrender/lib/graphic/Path.js';\nimport PathProxy from 'zrender/lib/core/PathProxy.js';\nimport { cubicRootAt, cubicAt } from 'zrender/lib/core/curve.js';\nimport tokens from '../../visual/tokens.js';\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nfunction isPointNull(x, y) {\n  return isNaN(x) || isNaN(y);\n}\n/**\n * Draw smoothed line in non-monotone, in may cause undesired curve in extreme\n * situations. This should be used when points are non-monotone neither in x or\n * y dimension.\n */\nfunction drawSegment(ctx, points, start, segLen, allLen, dir, smooth, smoothMonotone, connectNulls) {\n  var prevX;\n  var prevY;\n  var cpx0;\n  var cpy0;\n  var cpx1;\n  var cpy1;\n  var idx = start;\n  var k = 0;\n  for (; k < segLen; k++) {\n    var x = points[idx * 2];\n    var y = points[idx * 2 + 1];\n    if (idx >= allLen || idx < 0) {\n      break;\n    }\n    if (isPointNull(x, y)) {\n      if (connectNulls) {\n        idx += dir;\n        continue;\n      }\n      break;\n    }\n    if (idx === start) {\n      ctx[dir > 0 ? 'moveTo' : 'lineTo'](x, y);\n      cpx0 = x;\n      cpy0 = y;\n    } else {\n      var dx = x - prevX;\n      var dy = y - prevY;\n      // Ignore tiny segment.\n      if (dx * dx + dy * dy < 0.5) {\n        idx += dir;\n        continue;\n      }\n      if (smooth > 0) {\n        var nextIdx = idx + dir;\n        var nextX = points[nextIdx * 2];\n        var nextY = points[nextIdx * 2 + 1];\n        // Ignore duplicate point\n        while (nextX === x && nextY === y && k < segLen) {\n          k++;\n          nextIdx += dir;\n          idx += dir;\n          nextX = points[nextIdx * 2];\n          nextY = points[nextIdx * 2 + 1];\n          x = points[idx * 2];\n          y = points[idx * 2 + 1];\n          dx = x - prevX;\n          dy = y - prevY;\n        }\n        var tmpK = k + 1;\n        if (connectNulls) {\n          // Find next point not null\n          while (isPointNull(nextX, nextY) && tmpK < segLen) {\n            tmpK++;\n            nextIdx += dir;\n            nextX = points[nextIdx * 2];\n            nextY = points[nextIdx * 2 + 1];\n          }\n        }\n        var ratioNextSeg = 0.5;\n        var vx = 0;\n        var vy = 0;\n        var nextCpx0 = void 0;\n        var nextCpy0 = void 0;\n        // Is last point\n        if (tmpK >= segLen || isPointNull(nextX, nextY)) {\n          cpx1 = x;\n          cpy1 = y;\n        } else {\n          vx = nextX - prevX;\n          vy = nextY - prevY;\n          var dx0 = x - prevX;\n          var dx1 = nextX - x;\n          var dy0 = y - prevY;\n          var dy1 = nextY - y;\n          var lenPrevSeg = void 0;\n          var lenNextSeg = void 0;\n          if (smoothMonotone === 'x') {\n            lenPrevSeg = Math.abs(dx0);\n            lenNextSeg = Math.abs(dx1);\n            var dir_1 = vx > 0 ? 1 : -1;\n            cpx1 = x - dir_1 * lenPrevSeg * smooth;\n            cpy1 = y;\n            nextCpx0 = x + dir_1 * lenNextSeg * smooth;\n            nextCpy0 = y;\n          } else if (smoothMonotone === 'y') {\n            lenPrevSeg = Math.abs(dy0);\n            lenNextSeg = Math.abs(dy1);\n            var dir_2 = vy > 0 ? 1 : -1;\n            cpx1 = x;\n            cpy1 = y - dir_2 * lenPrevSeg * smooth;\n            nextCpx0 = x;\n            nextCpy0 = y + dir_2 * lenNextSeg * smooth;\n          } else {\n            lenPrevSeg = Math.sqrt(dx0 * dx0 + dy0 * dy0);\n            lenNextSeg = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n            // Use ratio of seg length\n            ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);\n            cpx1 = x - vx * smooth * (1 - ratioNextSeg);\n            cpy1 = y - vy * smooth * (1 - ratioNextSeg);\n            // cp0 of next segment\n            nextCpx0 = x + vx * smooth * ratioNextSeg;\n            nextCpy0 = y + vy * smooth * ratioNextSeg;\n            // Smooth constraint between point and next point.\n            // Avoid exceeding extreme after smoothing.\n            nextCpx0 = mathMin(nextCpx0, mathMax(nextX, x));\n            nextCpy0 = mathMin(nextCpy0, mathMax(nextY, y));\n            nextCpx0 = mathMax(nextCpx0, mathMin(nextX, x));\n            nextCpy0 = mathMax(nextCpy0, mathMin(nextY, y));\n            // Reclaculate cp1 based on the adjusted cp0 of next seg.\n            vx = nextCpx0 - x;\n            vy = nextCpy0 - y;\n            cpx1 = x - vx * lenPrevSeg / lenNextSeg;\n            cpy1 = y - vy * lenPrevSeg / lenNextSeg;\n            // Smooth constraint between point and prev point.\n            // Avoid exceeding extreme after smoothing.\n            cpx1 = mathMin(cpx1, mathMax(prevX, x));\n            cpy1 = mathMin(cpy1, mathMax(prevY, y));\n            cpx1 = mathMax(cpx1, mathMin(prevX, x));\n            cpy1 = mathMax(cpy1, mathMin(prevY, y));\n            // Adjust next cp0 again.\n            vx = x - cpx1;\n            vy = y - cpy1;\n            nextCpx0 = x + vx * lenNextSeg / lenPrevSeg;\n            nextCpy0 = y + vy * lenNextSeg / lenPrevSeg;\n          }\n        }\n        ctx.bezierCurveTo(cpx0, cpy0, cpx1, cpy1, x, y);\n        cpx0 = nextCpx0;\n        cpy0 = nextCpy0;\n      } else {\n        ctx.lineTo(x, y);\n      }\n    }\n    prevX = x;\n    prevY = y;\n    idx += dir;\n  }\n  return k;\n}\nvar ECPolylineShape = /** @class */function () {\n  function ECPolylineShape() {\n    this.smooth = 0;\n    this.smoothConstraint = true;\n  }\n  return ECPolylineShape;\n}();\nvar ECPolyline = /** @class */function (_super) {\n  __extends(ECPolyline, _super);\n  function ECPolyline(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'ec-polyline';\n    return _this;\n  }\n  ECPolyline.prototype.getDefaultStyle = function () {\n    return {\n      stroke: tokens.color.neutral99,\n      fill: null\n    };\n  };\n  ECPolyline.prototype.getDefaultShape = function () {\n    return new ECPolylineShape();\n  };\n  ECPolyline.prototype.buildPath = function (ctx, shape) {\n    var points = shape.points;\n    var i = 0;\n    var len = points.length / 2;\n    // const result = getBoundingBox(points, shape.smoothConstraint);\n    if (shape.connectNulls) {\n      // Must remove first and last null values avoid draw error in polygon\n      for (; len > 0; len--) {\n        if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {\n          break;\n        }\n      }\n      for (; i < len; i++) {\n        if (!isPointNull(points[i * 2], points[i * 2 + 1])) {\n          break;\n        }\n      }\n    }\n    while (i < len) {\n      i += drawSegment(ctx, points, i, len, len, 1, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1;\n    }\n  };\n  ECPolyline.prototype.getPointOn = function (xOrY, dim) {\n    if (!this.path) {\n      this.createPathProxy();\n      this.buildPath(this.path, this.shape);\n    }\n    var path = this.path;\n    var data = path.data;\n    var CMD = PathProxy.CMD;\n    var x0;\n    var y0;\n    var isDimX = dim === 'x';\n    var roots = [];\n    for (var i = 0; i < data.length;) {\n      var cmd = data[i++];\n      var x = void 0;\n      var y = void 0;\n      var x2 = void 0;\n      var y2 = void 0;\n      var x3 = void 0;\n      var y3 = void 0;\n      var t = void 0;\n      switch (cmd) {\n        case CMD.M:\n          x0 = data[i++];\n          y0 = data[i++];\n          break;\n        case CMD.L:\n          x = data[i++];\n          y = data[i++];\n          t = isDimX ? (xOrY - x0) / (x - x0) : (xOrY - y0) / (y - y0);\n          if (t <= 1 && t >= 0) {\n            var val = isDimX ? (y - y0) * t + y0 : (x - x0) * t + x0;\n            return isDimX ? [xOrY, val] : [val, xOrY];\n          }\n          x0 = x;\n          y0 = y;\n          break;\n        case CMD.C:\n          x = data[i++];\n          y = data[i++];\n          x2 = data[i++];\n          y2 = data[i++];\n          x3 = data[i++];\n          y3 = data[i++];\n          var nRoot = isDimX ? cubicRootAt(x0, x, x2, x3, xOrY, roots) : cubicRootAt(y0, y, y2, y3, xOrY, roots);\n          if (nRoot > 0) {\n            for (var i_1 = 0; i_1 < nRoot; i_1++) {\n              var t_1 = roots[i_1];\n              if (t_1 <= 1 && t_1 >= 0) {\n                var val = isDimX ? cubicAt(y0, y, y2, y3, t_1) : cubicAt(x0, x, x2, x3, t_1);\n                return isDimX ? [xOrY, val] : [val, xOrY];\n              }\n            }\n          }\n          x0 = x3;\n          y0 = y3;\n          break;\n      }\n    }\n  };\n  return ECPolyline;\n}(Path);\nexport { ECPolyline };\nvar ECPolygonShape = /** @class */function (_super) {\n  __extends(ECPolygonShape, _super);\n  function ECPolygonShape() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  return ECPolygonShape;\n}(ECPolylineShape);\nvar ECPolygon = /** @class */function (_super) {\n  __extends(ECPolygon, _super);\n  function ECPolygon(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'ec-polygon';\n    return _this;\n  }\n  ECPolygon.prototype.getDefaultShape = function () {\n    return new ECPolygonShape();\n  };\n  ECPolygon.prototype.buildPath = function (ctx, shape) {\n    var points = shape.points;\n    var stackedOnPoints = shape.stackedOnPoints;\n    var i = 0;\n    var len = points.length / 2;\n    var smoothMonotone = shape.smoothMonotone;\n    if (shape.connectNulls) {\n      // Must remove first and last null values avoid draw error in polygon\n      for (; len > 0; len--) {\n        if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {\n          break;\n        }\n      }\n      for (; i < len; i++) {\n        if (!isPointNull(points[i * 2], points[i * 2 + 1])) {\n          break;\n        }\n      }\n    }\n    while (i < len) {\n      var k = drawSegment(ctx, points, i, len, len, 1, shape.smooth, smoothMonotone, shape.connectNulls);\n      drawSegment(ctx, stackedOnPoints, i + k - 1, k, len, -1, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls);\n      i += k + 1;\n      ctx.closePath();\n    }\n  };\n  return ECPolygon;\n}(Path);\nexport { ECPolygon };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as graphic from '../../util/graphic.js';\nimport { round } from '../../util/number.js';\nimport { isFunction } from 'zrender/lib/core/util.js';\nfunction createGridClipPath(cartesian, hasAnimation, seriesModel, done, during) {\n  var rect = cartesian.getArea();\n  var x = rect.x;\n  var y = rect.y;\n  var width = rect.width;\n  var height = rect.height;\n  var lineWidth = seriesModel.get(['lineStyle', 'width']) || 0;\n  // Expand the clip path a bit to avoid the border is clipped and looks thinner\n  x -= lineWidth / 2;\n  y -= lineWidth / 2;\n  width += lineWidth;\n  height += lineWidth;\n  // fix: https://github.com/apache/incubator-echarts/issues/11369\n  width = Math.ceil(width);\n  if (x !== Math.floor(x)) {\n    x = Math.floor(x);\n    // if no extra 1px on `width`, it will still be clipped since `x` is floored\n    width++;\n  }\n  var clipPath = new graphic.Rect({\n    shape: {\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    }\n  });\n  if (hasAnimation) {\n    var baseAxis = cartesian.getBaseAxis();\n    var isHorizontal = baseAxis.isHorizontal();\n    var isAxisInversed = baseAxis.inverse;\n    if (isHorizontal) {\n      if (isAxisInversed) {\n        clipPath.shape.x += width;\n      }\n      clipPath.shape.width = 0;\n    } else {\n      if (!isAxisInversed) {\n        clipPath.shape.y += height;\n      }\n      clipPath.shape.height = 0;\n    }\n    var duringCb = isFunction(during) ? function (percent) {\n      during(percent, clipPath);\n    } : null;\n    graphic.initProps(clipPath, {\n      shape: {\n        width: width,\n        height: height,\n        x: x,\n        y: y\n      }\n    }, seriesModel, null, done, duringCb);\n  }\n  return clipPath;\n}\nfunction createPolarClipPath(polar, hasAnimation, seriesModel) {\n  var sectorArea = polar.getArea();\n  // Avoid float number rounding error for symbol on the edge of axis extent.\n  var r0 = round(sectorArea.r0, 1);\n  var r = round(sectorArea.r, 1);\n  var clipPath = new graphic.Sector({\n    shape: {\n      cx: round(polar.cx, 1),\n      cy: round(polar.cy, 1),\n      r0: r0,\n      r: r,\n      startAngle: sectorArea.startAngle,\n      endAngle: sectorArea.endAngle,\n      clockwise: sectorArea.clockwise\n    }\n  });\n  if (hasAnimation) {\n    var isRadial = polar.getBaseAxis().dim === 'angle';\n    if (isRadial) {\n      clipPath.shape.endAngle = sectorArea.startAngle;\n    } else {\n      clipPath.shape.r = r0;\n    }\n    graphic.initProps(clipPath, {\n      shape: {\n        endAngle: sectorArea.endAngle,\n        r: r\n      }\n    }, seriesModel);\n  }\n  return clipPath;\n}\nfunction createClipPath(coordSys, hasAnimation, seriesModel, done, during) {\n  if (!coordSys) {\n    return null;\n  } else if (coordSys.type === 'polar') {\n    return createPolarClipPath(coordSys, hasAnimation, seriesModel);\n  } else if (coordSys.type === 'cartesian2d') {\n    return createGridClipPath(coordSys, hasAnimation, seriesModel, done, during);\n  }\n  return null;\n}\nexport { createGridClipPath, createPolarClipPath, createClipPath };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport function isCoordinateSystemType(coordSys, type) {\n  return coordSys.type === type;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n// FIXME step not support polar\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport SymbolDraw from '../helper/SymbolDraw.js';\nimport SymbolClz from '../helper/Symbol.js';\nimport lineAnimationDiff from './lineAnimationDiff.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as modelUtil from '../../util/model.js';\nimport { ECPolyline, ECPolygon } from './poly.js';\nimport ChartView from '../../view/Chart.js';\nimport { prepareDataCoordInfo, getStackedOnPoint } from './helper.js';\nimport { createGridClipPath, createPolarClipPath } from '../helper/createClipPathFromCoordSys.js';\nimport { isCoordinateSystemType } from '../../coord/CoordinateSystem.js';\nimport { setStatesStylesFromModel, setStatesFlag, toggleHoverEmphasis, SPECIAL_STATES } from '../../util/states.js';\nimport { setLabelStyle, getLabelStatesModels, labelInner } from '../../label/labelStyle.js';\nimport { getDefaultLabel, getDefaultInterpolatedLabel } from '../helper/labelHelper.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { createFloat32Array } from '../../util/vendor.js';\nimport { convertToColorString } from '../../util/format.js';\nimport { lerp } from 'zrender/lib/tool/color.js';\nfunction isPointsSame(points1, points2) {\n  if (points1.length !== points2.length) {\n    return;\n  }\n  for (var i = 0; i < points1.length; i++) {\n    if (points1[i] !== points2[i]) {\n      return;\n    }\n  }\n  return true;\n}\nfunction bboxFromPoints(points) {\n  var minX = Infinity;\n  var minY = Infinity;\n  var maxX = -Infinity;\n  var maxY = -Infinity;\n  for (var i = 0; i < points.length;) {\n    var x = points[i++];\n    var y = points[i++];\n    if (!isNaN(x)) {\n      minX = Math.min(x, minX);\n      maxX = Math.max(x, maxX);\n    }\n    if (!isNaN(y)) {\n      minY = Math.min(y, minY);\n      maxY = Math.max(y, maxY);\n    }\n  }\n  return [[minX, minY], [maxX, maxY]];\n}\nfunction getBoundingDiff(points1, points2) {\n  var _a = bboxFromPoints(points1),\n    min1 = _a[0],\n    max1 = _a[1];\n  var _b = bboxFromPoints(points2),\n    min2 = _b[0],\n    max2 = _b[1];\n  // Get a max value from each corner of two boundings.\n  return Math.max(Math.abs(min1[0] - min2[0]), Math.abs(min1[1] - min2[1]), Math.abs(max1[0] - max2[0]), Math.abs(max1[1] - max2[1]));\n}\nfunction getSmooth(smooth) {\n  return zrUtil.isNumber(smooth) ? smooth : smooth ? 0.5 : 0;\n}\nfunction getStackedOnPoints(coordSys, data, dataCoordInfo) {\n  if (!dataCoordInfo.valueDim) {\n    return [];\n  }\n  var len = data.count();\n  var points = createFloat32Array(len * 2);\n  for (var idx = 0; idx < len; idx++) {\n    var pt = getStackedOnPoint(dataCoordInfo, coordSys, data, idx);\n    points[idx * 2] = pt[0];\n    points[idx * 2 + 1] = pt[1];\n  }\n  return points;\n}\n/**\n * Filter the null data and extend data for step considering `stepTurnAt`\n *\n * @param points data to convert, that may containing null\n * @param basePoints base data to reference, used only for areaStyle points\n * @param coordSys coordinate system\n * @param stepTurnAt 'start' | 'end' | 'middle' | true\n * @param connectNulls whether to connect nulls\n * @returns converted point positions\n */\nfunction turnPointsIntoStep(points, basePoints, coordSys, stepTurnAt, connectNulls) {\n  var baseAxis = coordSys.getBaseAxis();\n  var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;\n  var stepPoints = [];\n  var i = 0;\n  var stepPt = [];\n  var pt = [];\n  var nextPt = [];\n  var filteredPoints = [];\n  if (connectNulls) {\n    for (i = 0; i < points.length; i += 2) {\n      /**\n       * For areaStyle of stepped lines, `stackedOnPoints` should be\n       * filtered the same as `points` so that the base axis values\n       * should stay the same as the lines above. See #20021\n       */\n      var reference = basePoints || points;\n      if (!isNaN(reference[i]) && !isNaN(reference[i + 1])) {\n        filteredPoints.push(points[i], points[i + 1]);\n      }\n    }\n    points = filteredPoints;\n  }\n  for (i = 0; i < points.length - 2; i += 2) {\n    nextPt[0] = points[i + 2];\n    nextPt[1] = points[i + 3];\n    pt[0] = points[i];\n    pt[1] = points[i + 1];\n    stepPoints.push(pt[0], pt[1]);\n    switch (stepTurnAt) {\n      case 'end':\n        stepPt[baseIndex] = nextPt[baseIndex];\n        stepPt[1 - baseIndex] = pt[1 - baseIndex];\n        stepPoints.push(stepPt[0], stepPt[1]);\n        break;\n      case 'middle':\n        var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;\n        var stepPt2 = [];\n        stepPt[baseIndex] = stepPt2[baseIndex] = middle;\n        stepPt[1 - baseIndex] = pt[1 - baseIndex];\n        stepPt2[1 - baseIndex] = nextPt[1 - baseIndex];\n        stepPoints.push(stepPt[0], stepPt[1]);\n        stepPoints.push(stepPt2[0], stepPt2[1]);\n        break;\n      default:\n        // default is start\n        stepPt[baseIndex] = pt[baseIndex];\n        stepPt[1 - baseIndex] = nextPt[1 - baseIndex];\n        stepPoints.push(stepPt[0], stepPt[1]);\n    }\n  }\n  // Last points\n  stepPoints.push(points[i++], points[i++]);\n  return stepPoints;\n}\n/**\n * Clip color stops to edge. Avoid creating too large gradients.\n * Which may lead to blurry when GPU acceleration is enabled. See #15680\n *\n * The stops has been sorted from small to large.\n */\nfunction clipColorStops(colorStops, maxSize) {\n  var newColorStops = [];\n  var len = colorStops.length;\n  // coord will always < 0 in prevOutOfRangeColorStop.\n  var prevOutOfRangeColorStop;\n  var prevInRangeColorStop;\n  function lerpStop(stop0, stop1, clippedCoord) {\n    var coord0 = stop0.coord;\n    var p = (clippedCoord - coord0) / (stop1.coord - coord0);\n    var color = lerp(p, [stop0.color, stop1.color]);\n    return {\n      coord: clippedCoord,\n      color: color\n    };\n  }\n  for (var i = 0; i < len; i++) {\n    var stop_1 = colorStops[i];\n    var coord = stop_1.coord;\n    if (coord < 0) {\n      prevOutOfRangeColorStop = stop_1;\n    } else if (coord > maxSize) {\n      if (prevInRangeColorStop) {\n        newColorStops.push(lerpStop(prevInRangeColorStop, stop_1, maxSize));\n      } else if (prevOutOfRangeColorStop) {\n        // If there are two stops and coord range is between these two stops\n        newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0), lerpStop(prevOutOfRangeColorStop, stop_1, maxSize));\n      }\n      // All following stop will be out of range. So just ignore them.\n      break;\n    } else {\n      if (prevOutOfRangeColorStop) {\n        newColorStops.push(lerpStop(prevOutOfRangeColorStop, stop_1, 0));\n        // Reset\n        prevOutOfRangeColorStop = null;\n      }\n      newColorStops.push(stop_1);\n      prevInRangeColorStop = stop_1;\n    }\n  }\n  return newColorStops;\n}\nfunction getVisualGradient(data, coordSys, api) {\n  var visualMetaList = data.getVisual('visualMeta');\n  if (!visualMetaList || !visualMetaList.length || !data.count()) {\n    // When data.count() is 0, gradient range can not be calculated.\n    return;\n  }\n  if (coordSys.type !== 'cartesian2d') {\n    if (process.env.NODE_ENV !== 'production') {\n      console.warn('Visual map on line style is only supported on cartesian2d.');\n    }\n    return;\n  }\n  var coordDim;\n  var visualMeta;\n  for (var i = visualMetaList.length - 1; i >= 0; i--) {\n    var dimInfo = data.getDimensionInfo(visualMetaList[i].dimension);\n    coordDim = dimInfo && dimInfo.coordDim;\n    // Can only be x or y\n    if (coordDim === 'x' || coordDim === 'y') {\n      visualMeta = visualMetaList[i];\n      break;\n    }\n  }\n  if (!visualMeta) {\n    if (process.env.NODE_ENV !== 'production') {\n      console.warn('Visual map on line style only support x or y dimension.');\n    }\n    return;\n  }\n  // If the area to be rendered is bigger than area defined by LinearGradient,\n  // the canvas spec prescribes that the color of the first stop and the last\n  // stop should be used. But if two stops are added at offset 0, in effect\n  // browsers use the color of the second stop to render area outside\n  // LinearGradient. So we can only infinitesimally extend area defined in\n  // LinearGradient to render `outerColors`.\n  var axis = coordSys.getAxis(coordDim);\n  // dataToCoord mapping may not be linear, but must be monotonic.\n  var colorStops = zrUtil.map(visualMeta.stops, function (stop) {\n    // offset will be calculated later.\n    return {\n      coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)),\n      color: stop.color\n    };\n  });\n  var stopLen = colorStops.length;\n  var outerColors = visualMeta.outerColors.slice();\n  if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {\n    colorStops.reverse();\n    outerColors.reverse();\n  }\n  var colorStopsInRange = clipColorStops(colorStops, coordDim === 'x' ? api.getWidth() : api.getHeight());\n  var inRangeStopLen = colorStopsInRange.length;\n  if (!inRangeStopLen && stopLen) {\n    // All stops are out of range. All will be the same color.\n    return colorStops[0].coord < 0 ? outerColors[1] ? outerColors[1] : colorStops[stopLen - 1].color : outerColors[0] ? outerColors[0] : colorStops[0].color;\n  }\n  var tinyExtent = 10; // Arbitrary value: 10px\n  var minCoord = colorStopsInRange[0].coord - tinyExtent;\n  var maxCoord = colorStopsInRange[inRangeStopLen - 1].coord + tinyExtent;\n  var coordSpan = maxCoord - minCoord;\n  if (coordSpan < 1e-3) {\n    return 'transparent';\n  }\n  zrUtil.each(colorStopsInRange, function (stop) {\n    stop.offset = (stop.coord - minCoord) / coordSpan;\n  });\n  colorStopsInRange.push({\n    // NOTE: inRangeStopLen may still be 0 if stoplen is zero.\n    offset: inRangeStopLen ? colorStopsInRange[inRangeStopLen - 1].offset : 0.5,\n    color: outerColors[1] || 'transparent'\n  });\n  colorStopsInRange.unshift({\n    offset: inRangeStopLen ? colorStopsInRange[0].offset : 0.5,\n    color: outerColors[0] || 'transparent'\n  });\n  var gradient = new graphic.LinearGradient(0, 0, 0, 0, colorStopsInRange, true);\n  gradient[coordDim] = minCoord;\n  gradient[coordDim + '2'] = maxCoord;\n  return gradient;\n}\nfunction getIsIgnoreFunc(seriesModel, data, coordSys) {\n  var showAllSymbol = seriesModel.get('showAllSymbol');\n  var isAuto = showAllSymbol === 'auto';\n  if (showAllSymbol && !isAuto) {\n    return;\n  }\n  var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n  if (!categoryAxis) {\n    return;\n  }\n  // Note that category label interval strategy might bring some weird effect\n  // in some scenario: users may wonder why some of the symbols are not\n  // displayed. So we show all symbols as possible as we can.\n  if (isAuto\n  // Simplify the logic, do not determine label overlap here.\n  && canShowAllSymbolForCategory(categoryAxis, data)) {\n    return;\n  }\n  // Otherwise follow the label interval strategy on category axis.\n  var categoryDataDim = data.mapDimension(categoryAxis.dim);\n  var labelMap = {};\n  zrUtil.each(categoryAxis.getViewLabels(), function (labelItem) {\n    var ordinalNumber = categoryAxis.scale.getRawOrdinalNumber(labelItem.tickValue);\n    labelMap[ordinalNumber] = 1;\n  });\n  return function (dataIndex) {\n    return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex));\n  };\n}\nfunction canShowAllSymbolForCategory(categoryAxis, data) {\n  // In most cases, line is monotonous on category axis, and the label size\n  // is close with each other. So we check the symbol size and some of the\n  // label size alone with the category axis to estimate whether all symbol\n  // can be shown without overlap.\n  var axisExtent = categoryAxis.getExtent();\n  var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count();\n  isNaN(availSize) && (availSize = 0); // 0/0 is NaN.\n  // Sampling some points, max 5.\n  var dataLen = data.count();\n  var step = Math.max(1, Math.round(dataLen / 5));\n  for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) {\n    if (SymbolClz.getSymbolSize(data, dataIndex\n    // Only for cartesian, where `isHorizontal` exists.\n    )[categoryAxis.isHorizontal() ? 1 : 0]\n    // Empirical number\n    * 1.5 > availSize) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction isPointNull(x, y) {\n  return isNaN(x) || isNaN(y);\n}\nfunction getLastIndexNotNull(points) {\n  var len = points.length / 2;\n  for (; len > 0; len--) {\n    if (!isPointNull(points[len * 2 - 2], points[len * 2 - 1])) {\n      break;\n    }\n  }\n  return len - 1;\n}\nfunction getPointAtIndex(points, idx) {\n  return [points[idx * 2], points[idx * 2 + 1]];\n}\nfunction getIndexRange(points, xOrY, dim) {\n  var len = points.length / 2;\n  var dimIdx = dim === 'x' ? 0 : 1;\n  var a;\n  var b;\n  var prevIndex = 0;\n  var nextIndex = -1;\n  for (var i = 0; i < len; i++) {\n    b = points[i * 2 + dimIdx];\n    if (isNaN(b) || isNaN(points[i * 2 + 1 - dimIdx])) {\n      continue;\n    }\n    if (i === 0) {\n      a = b;\n      continue;\n    }\n    if (a <= xOrY && b >= xOrY || a >= xOrY && b <= xOrY) {\n      nextIndex = i;\n      break;\n    }\n    prevIndex = i;\n    a = b;\n  }\n  return {\n    range: [prevIndex, nextIndex],\n    t: (xOrY - a) / (b - a)\n  };\n}\nfunction anyStateShowEndLabel(seriesModel) {\n  if (seriesModel.get(['endLabel', 'show'])) {\n    return true;\n  }\n  for (var i = 0; i < SPECIAL_STATES.length; i++) {\n    if (seriesModel.get([SPECIAL_STATES[i], 'endLabel', 'show'])) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction createLineClipPath(lineView, coordSys, hasAnimation, seriesModel) {\n  if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n    var endLabelModel_1 = seriesModel.getModel('endLabel');\n    var valueAnimation_1 = endLabelModel_1.get('valueAnimation');\n    var data_1 = seriesModel.getData();\n    var labelAnimationRecord_1 = {\n      lastFrameIndex: 0\n    };\n    var during = anyStateShowEndLabel(seriesModel) ? function (percent, clipRect) {\n      lineView._endLabelOnDuring(percent, clipRect, data_1, labelAnimationRecord_1, valueAnimation_1, endLabelModel_1, coordSys);\n    } : null;\n    var isHorizontal = coordSys.getBaseAxis().isHorizontal();\n    var clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel, function () {\n      var endLabel = lineView._endLabel;\n      if (endLabel && hasAnimation) {\n        if (labelAnimationRecord_1.originalX != null) {\n          endLabel.attr({\n            x: labelAnimationRecord_1.originalX,\n            y: labelAnimationRecord_1.originalY\n          });\n        }\n      }\n    }, during);\n    // Expand clip shape to avoid clipping when line value exceeds axis\n    if (!seriesModel.get('clip', true)) {\n      var rectShape = clipPath.shape;\n      var expandSize = Math.max(rectShape.width, rectShape.height);\n      if (isHorizontal) {\n        rectShape.y -= expandSize;\n        rectShape.height += expandSize * 2;\n      } else {\n        rectShape.x -= expandSize;\n        rectShape.width += expandSize * 2;\n      }\n    }\n    // Set to the final frame. To make sure label layout is right.\n    if (during) {\n      during(1, clipPath);\n    }\n    return clipPath;\n  } else {\n    if (process.env.NODE_ENV !== 'production') {\n      if (seriesModel.get(['endLabel', 'show'])) {\n        console.warn('endLabel is not supported for lines in polar systems.');\n      }\n    }\n    return createPolarClipPath(coordSys, hasAnimation, seriesModel);\n  }\n}\nfunction getEndLabelStateSpecified(endLabelModel, coordSys) {\n  var baseAxis = coordSys.getBaseAxis();\n  var isHorizontal = baseAxis.isHorizontal();\n  var isBaseInversed = baseAxis.inverse;\n  var align = isHorizontal ? isBaseInversed ? 'right' : 'left' : 'center';\n  var verticalAlign = isHorizontal ? 'middle' : isBaseInversed ? 'top' : 'bottom';\n  return {\n    normal: {\n      align: endLabelModel.get('align') || align,\n      verticalAlign: endLabelModel.get('verticalAlign') || verticalAlign\n    }\n  };\n}\nvar LineView = /** @class */function (_super) {\n  __extends(LineView, _super);\n  function LineView() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  LineView.prototype.init = function () {\n    var lineGroup = new graphic.Group();\n    var symbolDraw = new SymbolDraw();\n    this.group.add(symbolDraw.group);\n    this._symbolDraw = symbolDraw;\n    this._lineGroup = lineGroup;\n    this._changePolyState = zrUtil.bind(this._changePolyState, this);\n  };\n  LineView.prototype.render = function (seriesModel, ecModel, api) {\n    var coordSys = seriesModel.coordinateSystem;\n    var group = this.group;\n    var data = seriesModel.getData();\n    var lineStyleModel = seriesModel.getModel('lineStyle');\n    var areaStyleModel = seriesModel.getModel('areaStyle');\n    var points = data.getLayout('points') || [];\n    var isCoordSysPolar = coordSys.type === 'polar';\n    var prevCoordSys = this._coordSys;\n    var symbolDraw = this._symbolDraw;\n    var polyline = this._polyline;\n    var polygon = this._polygon;\n    var lineGroup = this._lineGroup;\n    var hasAnimation = !ecModel.ssr && seriesModel.get('animation');\n    var isAreaChart = !areaStyleModel.isEmpty();\n    var valueOrigin = areaStyleModel.get('origin');\n    var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin);\n    var stackedOnPoints = isAreaChart && getStackedOnPoints(coordSys, data, dataCoordInfo);\n    var showSymbol = seriesModel.get('showSymbol');\n    var connectNulls = seriesModel.get('connectNulls');\n    var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys);\n    // Remove temporary symbols\n    var oldData = this._data;\n    oldData && oldData.eachItemGraphicEl(function (el, idx) {\n      if (el.__temp) {\n        group.remove(el);\n        oldData.setItemGraphicEl(idx, null);\n      }\n    });\n    // Remove previous created symbols if showSymbol changed to false\n    if (!showSymbol) {\n      symbolDraw.remove();\n    }\n    group.add(lineGroup);\n    // FIXME step not support polar\n    var step = !isCoordSysPolar ? seriesModel.get('step') : false;\n    var clipShapeForSymbol;\n    if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) {\n      clipShapeForSymbol = coordSys.getArea();\n      // Avoid float number rounding error for symbol on the edge of axis extent.\n      // See #7913 and `test/dataZoom-clip.html`.\n      if (clipShapeForSymbol.width != null) {\n        clipShapeForSymbol.x -= 0.1;\n        clipShapeForSymbol.y -= 0.1;\n        clipShapeForSymbol.width += 0.2;\n        clipShapeForSymbol.height += 0.2;\n      } else if (clipShapeForSymbol.r0) {\n        clipShapeForSymbol.r0 -= 0.5;\n        clipShapeForSymbol.r += 0.5;\n      }\n    }\n    this._clipShapeForSymbol = clipShapeForSymbol;\n    var visualColor = getVisualGradient(data, coordSys, api) || data.getVisual('style')[data.getVisual('drawType')];\n    // Initialization animation or coordinate system changed\n    if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) {\n      showSymbol && symbolDraw.updateData(data, {\n        isIgnore: isIgnoreFunc,\n        clipShape: clipShapeForSymbol,\n        disableAnimation: true,\n        getSymbolPoint: function (idx) {\n          return [points[idx * 2], points[idx * 2 + 1]];\n        }\n      });\n      hasAnimation && this._initSymbolLabelAnimation(data, coordSys, clipShapeForSymbol);\n      if (step) {\n        if (stackedOnPoints) {\n          stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points, coordSys, step, connectNulls);\n        }\n        // TODO If stacked series is not step\n        points = turnPointsIntoStep(points, null, coordSys, step, connectNulls);\n      }\n      polyline = this._newPolyline(points);\n      if (isAreaChart) {\n        polygon = this._newPolygon(points, stackedOnPoints);\n      } // If areaStyle is removed\n      else if (polygon) {\n        lineGroup.remove(polygon);\n        polygon = this._polygon = null;\n      }\n      // NOTE: Must update _endLabel before setClipPath.\n      if (!isCoordSysPolar) {\n        this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor));\n      }\n      lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel));\n    } else {\n      if (isAreaChart && !polygon) {\n        // If areaStyle is added\n        polygon = this._newPolygon(points, stackedOnPoints);\n      } else if (polygon && !isAreaChart) {\n        // If areaStyle is removed\n        lineGroup.remove(polygon);\n        polygon = this._polygon = null;\n      }\n      // NOTE: Must update _endLabel before setClipPath.\n      if (!isCoordSysPolar) {\n        this._initOrUpdateEndLabel(seriesModel, coordSys, convertToColorString(visualColor));\n      }\n      // Update clipPath\n      var oldClipPath = lineGroup.getClipPath();\n      if (oldClipPath) {\n        var newClipPath = createLineClipPath(this, coordSys, false, seriesModel);\n        graphic.initProps(oldClipPath, {\n          shape: newClipPath.shape\n        }, seriesModel);\n      } else {\n        lineGroup.setClipPath(createLineClipPath(this, coordSys, true, seriesModel));\n      }\n      // Always update, or it is wrong in the case turning on legend\n      // because points are not changed.\n      showSymbol && symbolDraw.updateData(data, {\n        isIgnore: isIgnoreFunc,\n        clipShape: clipShapeForSymbol,\n        disableAnimation: true,\n        getSymbolPoint: function (idx) {\n          return [points[idx * 2], points[idx * 2 + 1]];\n        }\n      });\n      // In the case data zoom triggered refreshing frequently\n      // Data may not change if line has a category axis. So it should animate nothing.\n      if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) {\n        if (hasAnimation) {\n          this._doUpdateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls);\n        } else {\n          // Not do it in update with animation\n          if (step) {\n            if (stackedOnPoints) {\n              stackedOnPoints = turnPointsIntoStep(stackedOnPoints, points, coordSys, step, connectNulls);\n            }\n            // TODO If stacked series is not step\n            points = turnPointsIntoStep(points, null, coordSys, step, connectNulls);\n          }\n          polyline.setShape({\n            points: points\n          });\n          polygon && polygon.setShape({\n            points: points,\n            stackedOnPoints: stackedOnPoints\n          });\n        }\n      }\n    }\n    var emphasisModel = seriesModel.getModel('emphasis');\n    var focus = emphasisModel.get('focus');\n    var blurScope = emphasisModel.get('blurScope');\n    var emphasisDisabled = emphasisModel.get('disabled');\n    polyline.useStyle(zrUtil.defaults(\n    // Use color in lineStyle first\n    lineStyleModel.getLineStyle(), {\n      fill: 'none',\n      stroke: visualColor,\n      lineJoin: 'bevel'\n    }));\n    setStatesStylesFromModel(polyline, seriesModel, 'lineStyle');\n    if (polyline.style.lineWidth > 0 && seriesModel.get(['emphasis', 'lineStyle', 'width']) === 'bolder') {\n      var emphasisLineStyle = polyline.getState('emphasis').style;\n      emphasisLineStyle.lineWidth = +polyline.style.lineWidth + 1;\n    }\n    // Needs seriesIndex for focus\n    getECData(polyline).seriesIndex = seriesModel.seriesIndex;\n    toggleHoverEmphasis(polyline, focus, blurScope, emphasisDisabled);\n    var smooth = getSmooth(seriesModel.get('smooth'));\n    var smoothMonotone = seriesModel.get('smoothMonotone');\n    polyline.setShape({\n      smooth: smooth,\n      smoothMonotone: smoothMonotone,\n      connectNulls: connectNulls\n    });\n    if (polygon) {\n      var stackedOnSeries = data.getCalculationInfo('stackedOnSeries');\n      var stackedOnSmooth = 0;\n      polygon.useStyle(zrUtil.defaults(areaStyleModel.getAreaStyle(), {\n        fill: visualColor,\n        opacity: 0.7,\n        lineJoin: 'bevel',\n        decal: data.getVisual('style').decal\n      }));\n      if (stackedOnSeries) {\n        stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth'));\n      }\n      polygon.setShape({\n        smooth: smooth,\n        stackedOnSmooth: stackedOnSmooth,\n        smoothMonotone: smoothMonotone,\n        connectNulls: connectNulls\n      });\n      setStatesStylesFromModel(polygon, seriesModel, 'areaStyle');\n      // Needs seriesIndex for focus\n      getECData(polygon).seriesIndex = seriesModel.seriesIndex;\n      toggleHoverEmphasis(polygon, focus, blurScope, emphasisDisabled);\n    }\n    var changePolyState = this._changePolyState;\n    data.eachItemGraphicEl(function (el) {\n      // Switch polyline / polygon state if element changed its state.\n      el && (el.onHoverStateChange = changePolyState);\n    });\n    this._polyline.onHoverStateChange = changePolyState;\n    this._data = data;\n    // Save the coordinate system for transition animation when data changed\n    this._coordSys = coordSys;\n    this._stackedOnPoints = stackedOnPoints;\n    this._points = points;\n    this._step = step;\n    this._valueOrigin = valueOrigin;\n    if (seriesModel.get('triggerLineEvent')) {\n      this.packEventData(seriesModel, polyline);\n      polygon && this.packEventData(seriesModel, polygon);\n    }\n  };\n  LineView.prototype.packEventData = function (seriesModel, el) {\n    getECData(el).eventData = {\n      componentType: 'series',\n      componentSubType: 'line',\n      componentIndex: seriesModel.componentIndex,\n      seriesIndex: seriesModel.seriesIndex,\n      seriesName: seriesModel.name,\n      seriesType: 'line'\n    };\n  };\n  LineView.prototype.highlight = function (seriesModel, ecModel, api, payload) {\n    var data = seriesModel.getData();\n    var dataIndex = modelUtil.queryDataIndex(data, payload);\n    this._changePolyState('emphasis');\n    if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {\n      var points = data.getLayout('points');\n      var symbol = data.getItemGraphicEl(dataIndex);\n      if (!symbol) {\n        // Create a temporary symbol if it is not exists\n        var x = points[dataIndex * 2];\n        var y = points[dataIndex * 2 + 1];\n        if (isNaN(x) || isNaN(y)) {\n          // Null data\n          return;\n        }\n        // fix #11360: shouldn't draw symbol outside clipShapeForSymbol\n        if (this._clipShapeForSymbol && !this._clipShapeForSymbol.contain(x, y)) {\n          return;\n        }\n        var zlevel = seriesModel.get('zlevel') || 0;\n        var z = seriesModel.get('z') || 0;\n        symbol = new SymbolClz(data, dataIndex);\n        symbol.x = x;\n        symbol.y = y;\n        symbol.setZ(zlevel, z);\n        // ensure label text of the temporary symbol is in front of line and area polygon\n        var symbolLabel = symbol.getSymbolPath().getTextContent();\n        if (symbolLabel) {\n          symbolLabel.zlevel = zlevel;\n          symbolLabel.z = z;\n          symbolLabel.z2 = this._polyline.z2 + 1;\n        }\n        symbol.__temp = true;\n        data.setItemGraphicEl(dataIndex, symbol);\n        // Stop scale animation\n        symbol.stopSymbolAnimation(true);\n        this.group.add(symbol);\n      }\n      symbol.highlight();\n    } else {\n      // Highlight whole series\n      ChartView.prototype.highlight.call(this, seriesModel, ecModel, api, payload);\n    }\n  };\n  LineView.prototype.downplay = function (seriesModel, ecModel, api, payload) {\n    var data = seriesModel.getData();\n    var dataIndex = modelUtil.queryDataIndex(data, payload);\n    this._changePolyState('normal');\n    if (dataIndex != null && dataIndex >= 0) {\n      var symbol = data.getItemGraphicEl(dataIndex);\n      if (symbol) {\n        if (symbol.__temp) {\n          data.setItemGraphicEl(dataIndex, null);\n          this.group.remove(symbol);\n        } else {\n          symbol.downplay();\n        }\n      }\n    } else {\n      // FIXME\n      // can not downplay completely.\n      // Downplay whole series\n      ChartView.prototype.downplay.call(this, seriesModel, ecModel, api, payload);\n    }\n  };\n  LineView.prototype._changePolyState = function (toState) {\n    var polygon = this._polygon;\n    setStatesFlag(this._polyline, toState);\n    polygon && setStatesFlag(polygon, toState);\n  };\n  LineView.prototype._newPolyline = function (points) {\n    var polyline = this._polyline;\n    // Remove previous created polyline\n    if (polyline) {\n      this._lineGroup.remove(polyline);\n    }\n    polyline = new ECPolyline({\n      shape: {\n        points: points\n      },\n      segmentIgnoreThreshold: 2,\n      z2: 10\n    });\n    this._lineGroup.add(polyline);\n    this._polyline = polyline;\n    return polyline;\n  };\n  LineView.prototype._newPolygon = function (points, stackedOnPoints) {\n    var polygon = this._polygon;\n    // Remove previous created polygon\n    if (polygon) {\n      this._lineGroup.remove(polygon);\n    }\n    polygon = new ECPolygon({\n      shape: {\n        points: points,\n        stackedOnPoints: stackedOnPoints\n      },\n      segmentIgnoreThreshold: 2\n    });\n    this._lineGroup.add(polygon);\n    this._polygon = polygon;\n    return polygon;\n  };\n  LineView.prototype._initSymbolLabelAnimation = function (data, coordSys, clipShape) {\n    var isHorizontalOrRadial;\n    var isCoordSysPolar;\n    var baseAxis = coordSys.getBaseAxis();\n    var isAxisInverse = baseAxis.inverse;\n    if (coordSys.type === 'cartesian2d') {\n      isHorizontalOrRadial = baseAxis.isHorizontal();\n      isCoordSysPolar = false;\n    } else if (coordSys.type === 'polar') {\n      isHorizontalOrRadial = baseAxis.dim === 'angle';\n      isCoordSysPolar = true;\n    }\n    var seriesModel = data.hostModel;\n    var seriesDuration = seriesModel.get('animationDuration');\n    if (zrUtil.isFunction(seriesDuration)) {\n      seriesDuration = seriesDuration(null);\n    }\n    var seriesDelay = seriesModel.get('animationDelay') || 0;\n    var seriesDelayValue = zrUtil.isFunction(seriesDelay) ? seriesDelay(null) : seriesDelay;\n    data.eachItemGraphicEl(function (symbol, idx) {\n      var el = symbol;\n      if (el) {\n        var point = [symbol.x, symbol.y];\n        var start = void 0;\n        var end = void 0;\n        var current = void 0;\n        if (clipShape) {\n          if (isCoordSysPolar) {\n            var polarClip = clipShape;\n            var coord = coordSys.pointToCoord(point);\n            if (isHorizontalOrRadial) {\n              start = polarClip.startAngle;\n              end = polarClip.endAngle;\n              current = -coord[1] / 180 * Math.PI;\n            } else {\n              start = polarClip.r0;\n              end = polarClip.r;\n              current = coord[0];\n            }\n          } else {\n            var gridClip = clipShape;\n            if (isHorizontalOrRadial) {\n              start = gridClip.x;\n              end = gridClip.x + gridClip.width;\n              current = symbol.x;\n            } else {\n              start = gridClip.y + gridClip.height;\n              end = gridClip.y;\n              current = symbol.y;\n            }\n          }\n        }\n        var ratio = end === start ? 0 : (current - start) / (end - start);\n        if (isAxisInverse) {\n          ratio = 1 - ratio;\n        }\n        var delay = zrUtil.isFunction(seriesDelay) ? seriesDelay(idx) : seriesDuration * ratio + seriesDelayValue;\n        var symbolPath = el.getSymbolPath();\n        var text = symbolPath.getTextContent();\n        el.attr({\n          scaleX: 0,\n          scaleY: 0\n        });\n        el.animateTo({\n          scaleX: 1,\n          scaleY: 1\n        }, {\n          duration: 200,\n          setToFinal: true,\n          delay: delay\n        });\n        if (text) {\n          text.animateFrom({\n            style: {\n              opacity: 0\n            }\n          }, {\n            duration: 300,\n            delay: delay\n          });\n        }\n        symbolPath.disableLabelAnimation = true;\n      }\n    });\n  };\n  LineView.prototype._initOrUpdateEndLabel = function (seriesModel, coordSys, inheritColor) {\n    var endLabelModel = seriesModel.getModel('endLabel');\n    if (anyStateShowEndLabel(seriesModel)) {\n      var data_2 = seriesModel.getData();\n      var polyline = this._polyline;\n      // series may be filtered.\n      var points = data_2.getLayout('points');\n      if (!points) {\n        polyline.removeTextContent();\n        this._endLabel = null;\n        return;\n      }\n      var endLabel = this._endLabel;\n      if (!endLabel) {\n        endLabel = this._endLabel = new graphic.Text({\n          z2: 200 // should be higher than item symbol\n        });\n        endLabel.ignoreClip = true;\n        polyline.setTextContent(this._endLabel);\n        polyline.disableLabelAnimation = true;\n      }\n      // Find last non-NaN data to display data\n      var dataIndex = getLastIndexNotNull(points);\n      if (dataIndex >= 0) {\n        setLabelStyle(polyline, getLabelStatesModels(seriesModel, 'endLabel'), {\n          inheritColor: inheritColor,\n          labelFetcher: seriesModel,\n          labelDataIndex: dataIndex,\n          defaultText: function (dataIndex, opt, interpolatedValue) {\n            return interpolatedValue != null ? getDefaultInterpolatedLabel(data_2, interpolatedValue) : getDefaultLabel(data_2, dataIndex);\n          },\n          enableTextSetter: true\n        }, getEndLabelStateSpecified(endLabelModel, coordSys));\n        polyline.textConfig.position = null;\n      }\n    } else if (this._endLabel) {\n      this._polyline.removeTextContent();\n      this._endLabel = null;\n    }\n  };\n  LineView.prototype._endLabelOnDuring = function (percent, clipRect, data, animationRecord, valueAnimation, endLabelModel, coordSys) {\n    var endLabel = this._endLabel;\n    var polyline = this._polyline;\n    if (endLabel) {\n      // NOTE: Don't remove percent < 1. percent === 1 means the first frame during render.\n      // The label is not prepared at this time.\n      if (percent < 1 && animationRecord.originalX == null) {\n        animationRecord.originalX = endLabel.x;\n        animationRecord.originalY = endLabel.y;\n      }\n      var points = data.getLayout('points');\n      var seriesModel = data.hostModel;\n      var connectNulls = seriesModel.get('connectNulls');\n      var precision = endLabelModel.get('precision');\n      var distance = endLabelModel.get('distance') || 0;\n      var baseAxis = coordSys.getBaseAxis();\n      var isHorizontal = baseAxis.isHorizontal();\n      var isBaseInversed = baseAxis.inverse;\n      var clipShape = clipRect.shape;\n      var xOrY = isBaseInversed ? isHorizontal ? clipShape.x : clipShape.y + clipShape.height : isHorizontal ? clipShape.x + clipShape.width : clipShape.y;\n      var distanceX = (isHorizontal ? distance : 0) * (isBaseInversed ? -1 : 1);\n      var distanceY = (isHorizontal ? 0 : -distance) * (isBaseInversed ? -1 : 1);\n      var dim = isHorizontal ? 'x' : 'y';\n      var dataIndexRange = getIndexRange(points, xOrY, dim);\n      var indices = dataIndexRange.range;\n      var diff = indices[1] - indices[0];\n      var value = void 0;\n      if (diff >= 1) {\n        // diff > 1 && connectNulls, which is on the null data.\n        if (diff > 1 && !connectNulls) {\n          var pt = getPointAtIndex(points, indices[0]);\n          endLabel.attr({\n            x: pt[0] + distanceX,\n            y: pt[1] + distanceY\n          });\n          valueAnimation && (value = seriesModel.getRawValue(indices[0]));\n        } else {\n          var pt = polyline.getPointOn(xOrY, dim);\n          pt && endLabel.attr({\n            x: pt[0] + distanceX,\n            y: pt[1] + distanceY\n          });\n          var startValue = seriesModel.getRawValue(indices[0]);\n          var endValue = seriesModel.getRawValue(indices[1]);\n          valueAnimation && (value = modelUtil.interpolateRawValues(data, precision, startValue, endValue, dataIndexRange.t));\n        }\n        animationRecord.lastFrameIndex = indices[0];\n      } else {\n        // If diff <= 0, which is the range is not found(Include NaN)\n        // Choose the first point or last point.\n        var idx = percent === 1 || animationRecord.lastFrameIndex > 0 ? indices[0] : 0;\n        var pt = getPointAtIndex(points, idx);\n        valueAnimation && (value = seriesModel.getRawValue(idx));\n        endLabel.attr({\n          x: pt[0] + distanceX,\n          y: pt[1] + distanceY\n        });\n      }\n      if (valueAnimation) {\n        var inner = labelInner(endLabel);\n        if (typeof inner.setLabelText === 'function') {\n          inner.setLabelText(value);\n        }\n      }\n    }\n  };\n  /**\n   * @private\n   */\n  // FIXME Two value axis\n  LineView.prototype._doUpdateAnimation = function (data, stackedOnPoints, coordSys, api, step, valueOrigin, connectNulls) {\n    var polyline = this._polyline;\n    var polygon = this._polygon;\n    var seriesModel = data.hostModel;\n    var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin, valueOrigin);\n    var current = diff.current;\n    var stackedOnCurrent = diff.stackedOnCurrent;\n    var next = diff.next;\n    var stackedOnNext = diff.stackedOnNext;\n    if (step) {\n      // TODO If stacked series is not step\n      stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, diff.current, coordSys, step, connectNulls);\n      current = turnPointsIntoStep(diff.current, null, coordSys, step, connectNulls);\n      stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, diff.next, coordSys, step, connectNulls);\n      next = turnPointsIntoStep(diff.next, null, coordSys, step, connectNulls);\n    }\n    // Don't apply animation if diff is large.\n    // For better result and avoid memory explosion problems like\n    // https://github.com/apache/incubator-echarts/issues/12229\n    if (getBoundingDiff(current, next) > 3000 || polygon && getBoundingDiff(stackedOnCurrent, stackedOnNext) > 3000) {\n      polyline.stopAnimation();\n      polyline.setShape({\n        points: next\n      });\n      if (polygon) {\n        polygon.stopAnimation();\n        polygon.setShape({\n          points: next,\n          stackedOnPoints: stackedOnNext\n        });\n      }\n      return;\n    }\n    polyline.shape.__points = diff.current;\n    polyline.shape.points = current;\n    var target = {\n      shape: {\n        points: next\n      }\n    };\n    // Also animate the original points.\n    // If points reference is changed when turning into step line.\n    if (diff.current !== current) {\n      target.shape.__points = diff.next;\n    }\n    // Stop previous animation.\n    polyline.stopAnimation();\n    graphic.updateProps(polyline, target, seriesModel);\n    if (polygon) {\n      polygon.setShape({\n        // Reuse the points with polyline.\n        points: current,\n        stackedOnPoints: stackedOnCurrent\n      });\n      polygon.stopAnimation();\n      graphic.updateProps(polygon, {\n        shape: {\n          stackedOnPoints: stackedOnNext\n        }\n      }, seriesModel);\n      // If use attr directly in updateProps.\n      if (polyline.shape.points !== polygon.shape.points) {\n        polygon.shape.points = polyline.shape.points;\n      }\n    }\n    var updatedDataInfo = [];\n    var diffStatus = diff.status;\n    for (var i = 0; i < diffStatus.length; i++) {\n      var cmd = diffStatus[i].cmd;\n      if (cmd === '=') {\n        var el = data.getItemGraphicEl(diffStatus[i].idx1);\n        if (el) {\n          updatedDataInfo.push({\n            el: el,\n            ptIdx: i // Index of points\n          });\n        }\n      }\n    }\n    if (polyline.animators && polyline.animators.length) {\n      polyline.animators[0].during(function () {\n        polygon && polygon.dirtyShape();\n        var points = polyline.shape.__points;\n        for (var i = 0; i < updatedDataInfo.length; i++) {\n          var el = updatedDataInfo[i].el;\n          var offset = updatedDataInfo[i].ptIdx * 2;\n          el.x = points[offset];\n          el.y = points[offset + 1];\n          el.markRedraw();\n        }\n      });\n    }\n  };\n  LineView.prototype.remove = function (ecModel) {\n    var group = this.group;\n    var oldData = this._data;\n    this._lineGroup.removeAll();\n    this._symbolDraw.remove(true);\n    // Remove temporary created elements when highlighting\n    oldData && oldData.eachItemGraphicEl(function (el, idx) {\n      if (el.__temp) {\n        group.remove(el);\n        oldData.setItemGraphicEl(idx, null);\n      }\n    });\n    this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._endLabel = this._data = null;\n  };\n  LineView.type = 'line';\n  return LineView;\n}(ChartView);\nexport default LineView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { map } from 'zrender/lib/core/util.js';\nimport createRenderPlanner from '../chart/helper/createRenderPlanner.js';\nimport { isDimensionStacked } from '../data/helper/dataStackHelper.js';\nimport { createFloat32Array } from '../util/vendor.js';\nexport default function pointsLayout(seriesType, forceStoreInTypedArray) {\n  return {\n    seriesType: seriesType,\n    plan: createRenderPlanner(),\n    reset: function (seriesModel) {\n      var data = seriesModel.getData();\n      var coordSys = seriesModel.coordinateSystem;\n      var pipelineContext = seriesModel.pipelineContext;\n      var useTypedArray = forceStoreInTypedArray || pipelineContext.large;\n      if (!coordSys) {\n        return;\n      }\n      var dims = map(coordSys.dimensions, function (dim) {\n        return data.mapDimension(dim);\n      }).slice(0, 2);\n      var dimLen = dims.length;\n      var stackResultDim = data.getCalculationInfo('stackResultDimension');\n      if (isDimensionStacked(data, dims[0])) {\n        dims[0] = stackResultDim;\n      }\n      if (isDimensionStacked(data, dims[1])) {\n        dims[1] = stackResultDim;\n      }\n      var store = data.getStore();\n      var dimIdx0 = data.getDimensionIndex(dims[0]);\n      var dimIdx1 = data.getDimensionIndex(dims[1]);\n      return dimLen && {\n        progress: function (params, data) {\n          var segCount = params.end - params.start;\n          var points = useTypedArray && createFloat32Array(segCount * dimLen);\n          var tmpIn = [];\n          var tmpOut = [];\n          for (var i = params.start, offset = 0; i < params.end; i++) {\n            var point = void 0;\n            if (dimLen === 1) {\n              var x = store.get(dimIdx0, i);\n              // NOTE: Make sure the second parameter is null to use default strategy.\n              point = coordSys.dataToPoint(x, null, tmpOut);\n            } else {\n              tmpIn[0] = store.get(dimIdx0, i);\n              tmpIn[1] = store.get(dimIdx1, i);\n              // Let coordinate system to handle the NaN data.\n              point = coordSys.dataToPoint(tmpIn, null, tmpOut);\n            }\n            if (useTypedArray) {\n              points[offset++] = point[0];\n              points[offset++] = point[1];\n            } else {\n              data.setItemLayout(i, point.slice());\n            }\n          }\n          useTypedArray && data.setLayout('points', points);\n        }\n      };\n    }\n  };\n}\n;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isFunction, isString } from 'zrender/lib/core/util.js';\nvar samplers = {\n  average: function (frame) {\n    var sum = 0;\n    var count = 0;\n    for (var i = 0; i < frame.length; i++) {\n      if (!isNaN(frame[i])) {\n        sum += frame[i];\n        count++;\n      }\n    }\n    // Return NaN if count is 0\n    return count === 0 ? NaN : sum / count;\n  },\n  sum: function (frame) {\n    var sum = 0;\n    for (var i = 0; i < frame.length; i++) {\n      // Ignore NaN\n      sum += frame[i] || 0;\n    }\n    return sum;\n  },\n  max: function (frame) {\n    var max = -Infinity;\n    for (var i = 0; i < frame.length; i++) {\n      frame[i] > max && (max = frame[i]);\n    }\n    // NaN will cause illegal axis extent.\n    return isFinite(max) ? max : NaN;\n  },\n  min: function (frame) {\n    var min = Infinity;\n    for (var i = 0; i < frame.length; i++) {\n      frame[i] < min && (min = frame[i]);\n    }\n    // NaN will cause illegal axis extent.\n    return isFinite(min) ? min : NaN;\n  },\n  // TODO\n  // Median\n  nearest: function (frame) {\n    return frame[0];\n  }\n};\nvar indexSampler = function (frame) {\n  return Math.round(frame.length / 2);\n};\nexport default function dataSample(seriesType) {\n  return {\n    seriesType: seriesType,\n    // FIXME:TS never used, so comment it\n    // modifyOutputEnd: true,\n    reset: function (seriesModel, ecModel, api) {\n      var data = seriesModel.getData();\n      var sampling = seriesModel.get('sampling');\n      var coordSys = seriesModel.coordinateSystem;\n      var count = data.count();\n      // Only cartesian2d support down sampling. Disable it when there is few data.\n      if (count > 10 && coordSys.type === 'cartesian2d' && sampling) {\n        var baseAxis = coordSys.getBaseAxis();\n        var valueAxis = coordSys.getOtherAxis(baseAxis);\n        var extent = baseAxis.getExtent();\n        var dpr = api.getDevicePixelRatio();\n        // Coordinste system has been resized\n        var size = Math.abs(extent[1] - extent[0]) * (dpr || 1);\n        var rate = Math.round(count / size);\n        if (isFinite(rate) && rate > 1) {\n          if (sampling === 'lttb') {\n            seriesModel.setData(data.lttbDownSample(data.mapDimension(valueAxis.dim), 1 / rate));\n          } else if (sampling === 'minmax') {\n            seriesModel.setData(data.minmaxDownSample(data.mapDimension(valueAxis.dim), 1 / rate));\n          }\n          var sampler = void 0;\n          if (isString(sampling)) {\n            sampler = samplers[sampling];\n          } else if (isFunction(sampling)) {\n            sampler = sampling;\n          }\n          if (sampler) {\n            // Only support sample the first dim mapped from value axis.\n            seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler));\n          }\n        }\n      }\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport LineSeries from './LineSeries.js';\nimport LineView from './LineView.js';\n// In case developer forget to include grid component\nimport layoutPoints from '../../layout/points.js';\nimport dataSample from '../../processor/dataSample.js';\nexport function install(registers) {\n  registers.registerChartView(LineView);\n  registers.registerSeriesModel(LineSeries);\n  registers.registerLayout(layoutPoints('line', true));\n  registers.registerVisual({\n    seriesType: 'line',\n    reset: function (seriesModel) {\n      var data = seriesModel.getData();\n      // Visual coding for legend\n      var lineStyle = seriesModel.getModel('lineStyle').getLineStyle();\n      if (lineStyle && !lineStyle.stroke) {\n        // Fill in visual should be palette color if\n        // has color callback\n        lineStyle.stroke = data.getVisual('style').fill;\n      }\n      data.setVisual('legendLineStyle', lineStyle);\n    }\n  });\n  // Down sample after filter\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('line'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport createSeriesData from '../helper/createSeriesData.js';\nimport { each } from 'zrender/lib/core/util.js';\nvar BaseBarSeriesModel = /** @class */function (_super) {\n  __extends(BaseBarSeriesModel, _super);\n  function BaseBarSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = BaseBarSeriesModel.type;\n    return _this;\n  }\n  BaseBarSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesData(null, this, {\n      useEncodeDefaulter: true\n    });\n  };\n  BaseBarSeriesModel.prototype.getMarkerPosition = function (value, dims, startingAtTick) {\n    var coordSys = this.coordinateSystem;\n    if (coordSys && coordSys.clampData) {\n      // PENDING if clamp ?\n      var clampData_1 = coordSys.clampData(value);\n      var pt_1 = coordSys.dataToPoint(clampData_1);\n      if (startingAtTick) {\n        each(coordSys.getAxes(), function (axis, idx) {\n          // If axis type is category, use tick coords instead\n          if (axis.type === 'category' && dims != null) {\n            var tickCoords = axis.getTicksCoords();\n            var alignTicksWithLabel = axis.getTickModel().get('alignWithLabel');\n            var targetTickId = clampData_1[idx];\n            // The index of rightmost tick of markArea is 1 larger than x1/y1 index\n            var isEnd = dims[idx] === 'x1' || dims[idx] === 'y1';\n            if (isEnd && !alignTicksWithLabel) {\n              targetTickId += 1;\n            }\n            // The only contains one tick, tickCoords is\n            // like [{coord: 0, tickValue: 0}, {coord: 0}]\n            // to the length should always be larger than 1\n            if (tickCoords.length < 2) {\n              return;\n            } else if (tickCoords.length === 2) {\n              // The left value and right value of the axis are\n              // the same. coord is 0 in both items. Use the max\n              // value of the axis as the coord\n              pt_1[idx] = axis.toGlobalCoord(axis.getExtent()[isEnd ? 1 : 0]);\n              return;\n            }\n            var leftCoord = void 0;\n            var coord = void 0;\n            var stepTickValue = 1;\n            for (var i = 0; i < tickCoords.length; i++) {\n              var tickCoord = tickCoords[i].coord;\n              // The last item of tickCoords doesn't contain\n              // tickValue\n              var tickValue = i === tickCoords.length - 1 ? tickCoords[i - 1].tickValue + stepTickValue : tickCoords[i].tickValue;\n              if (tickValue === targetTickId) {\n                coord = tickCoord;\n                break;\n              } else if (tickValue < targetTickId) {\n                leftCoord = tickCoord;\n              } else if (leftCoord != null && tickValue > targetTickId) {\n                coord = (tickCoord + leftCoord) / 2;\n                break;\n              }\n              if (i === 1) {\n                // Here we assume the step of category axes is\n                // the same\n                stepTickValue = tickValue - tickCoords[0].tickValue;\n              }\n            }\n            if (coord == null) {\n              if (!leftCoord) {\n                // targetTickId is smaller than all tick ids in the\n                // visible area, use the leftmost tick coord\n                coord = tickCoords[0].coord;\n              } else if (leftCoord) {\n                // targetTickId is larger than all tick ids in the\n                // visible area, use the rightmost tick coord\n                coord = tickCoords[tickCoords.length - 1].coord;\n              }\n            }\n            pt_1[idx] = axis.toGlobalCoord(coord);\n          }\n        });\n      } else {\n        var data = this.getData();\n        var offset = data.getLayout('offset');\n        var size = data.getLayout('size');\n        var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1;\n        pt_1[offsetIndex] += offset + size / 2;\n      }\n      return pt_1;\n    }\n    return [NaN, NaN];\n  };\n  BaseBarSeriesModel.type = 'series.__base_bar__';\n  BaseBarSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    coordinateSystem: 'cartesian2d',\n    legendHoverLink: true,\n    // stack: null\n    // Cartesian coordinate system\n    // xAxisIndex: 0,\n    // yAxisIndex: 0,\n    barMinHeight: 0,\n    barMinAngle: 0,\n    // cursor: null,\n    large: false,\n    largeThreshold: 400,\n    progressive: 3e3,\n    progressiveChunkMode: 'mod',\n    defaultBarGap: '10%'\n  };\n  return BaseBarSeriesModel;\n}(SeriesModel);\nSeriesModel.registerClass(BaseBarSeriesModel);\nexport default BaseBarSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BaseBarSeriesModel from './BaseBarSeries.js';\nimport createSeriesData from '../helper/createSeriesData.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nimport tokens from '../../visual/tokens.js';\nvar BarSeriesModel = /** @class */function (_super) {\n  __extends(BarSeriesModel, _super);\n  function BarSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = BarSeriesModel.type;\n    return _this;\n  }\n  BarSeriesModel.prototype.getInitialData = function () {\n    return createSeriesData(null, this, {\n      useEncodeDefaulter: true,\n      createInvertedIndices: !!this.get('realtimeSort', true) || null\n    });\n  };\n  /**\n   * @override\n   */\n  BarSeriesModel.prototype.getProgressive = function () {\n    // Do not support progressive in normal mode.\n    return this.get('large') ? this.get('progressive') : false;\n  };\n  /**\n   * @override\n   */\n  BarSeriesModel.prototype.getProgressiveThreshold = function () {\n    // Do not support progressive in normal mode.\n    var progressiveThreshold = this.get('progressiveThreshold');\n    var largeThreshold = this.get('largeThreshold');\n    if (largeThreshold > progressiveThreshold) {\n      progressiveThreshold = largeThreshold;\n    }\n    return progressiveThreshold;\n  };\n  BarSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n    return selectors.rect(data.getItemLayout(dataIndex));\n  };\n  BarSeriesModel.type = 'series.bar';\n  BarSeriesModel.dependencies = ['grid', 'polar'];\n  BarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, {\n    // If clipped\n    // Only available on cartesian2d\n    clip: true,\n    roundCap: false,\n    showBackground: false,\n    backgroundStyle: {\n      color: 'rgba(180, 180, 180, 0.2)',\n      borderColor: null,\n      borderWidth: 0,\n      borderType: 'solid',\n      borderRadius: 0,\n      shadowBlur: 0,\n      shadowColor: null,\n      shadowOffsetX: 0,\n      shadowOffsetY: 0,\n      opacity: 1\n    },\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary,\n        borderWidth: 2\n      }\n    },\n    realtimeSort: false\n  });\n  return BarSeriesModel;\n}(BaseBarSeriesModel);\nexport default BarSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { Path } from '../graphic.js';\n/**\n * Sausage: similar to sector, but have half circle on both sides\n */\nvar SausageShape = /** @class */function () {\n  function SausageShape() {\n    this.cx = 0;\n    this.cy = 0;\n    this.r0 = 0;\n    this.r = 0;\n    this.startAngle = 0;\n    this.endAngle = Math.PI * 2;\n    this.clockwise = true;\n  }\n  return SausageShape;\n}();\nvar SausagePath = /** @class */function (_super) {\n  __extends(SausagePath, _super);\n  function SausagePath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'sausage';\n    return _this;\n  }\n  SausagePath.prototype.getDefaultShape = function () {\n    return new SausageShape();\n  };\n  SausagePath.prototype.buildPath = function (ctx, shape) {\n    var cx = shape.cx;\n    var cy = shape.cy;\n    var r0 = Math.max(shape.r0 || 0, 0);\n    var r = Math.max(shape.r, 0);\n    var dr = (r - r0) * 0.5;\n    var rCenter = r0 + dr;\n    var startAngle = shape.startAngle;\n    var endAngle = shape.endAngle;\n    var clockwise = shape.clockwise;\n    var PI2 = Math.PI * 2;\n    var lessThanCircle = clockwise ? endAngle - startAngle < PI2 : startAngle - endAngle < PI2;\n    if (!lessThanCircle) {\n      // Normalize angles\n      startAngle = endAngle - (clockwise ? PI2 : -PI2);\n    }\n    var unitStartX = Math.cos(startAngle);\n    var unitStartY = Math.sin(startAngle);\n    var unitEndX = Math.cos(endAngle);\n    var unitEndY = Math.sin(endAngle);\n    if (lessThanCircle) {\n      ctx.moveTo(unitStartX * r0 + cx, unitStartY * r0 + cy);\n      ctx.arc(unitStartX * rCenter + cx, unitStartY * rCenter + cy, dr, -Math.PI + startAngle, startAngle, !clockwise);\n    } else {\n      ctx.moveTo(unitStartX * r + cx, unitStartY * r + cy);\n    }\n    ctx.arc(cx, cy, r, startAngle, endAngle, !clockwise);\n    ctx.arc(unitEndX * rCenter + cx, unitEndY * rCenter + cy, dr, endAngle - Math.PI * 2, endAngle - Math.PI, !clockwise);\n    if (r0 !== 0) {\n      ctx.arc(cx, cy, r0, endAngle, startAngle, clockwise);\n    }\n    // ctx.closePath();\n  };\n  return SausagePath;\n}(Path);\nexport default SausagePath;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { calculateTextPosition } from 'zrender/lib/contain/text.js';\nimport { isArray, isNumber } from 'zrender/lib/core/util.js';\nexport function createSectorCalculateTextPosition(positionMapping, opts) {\n  opts = opts || {};\n  var isRoundCap = opts.isRoundCap;\n  return function (out, opts, boundingRect) {\n    var textPosition = opts.position;\n    if (!textPosition || textPosition instanceof Array) {\n      return calculateTextPosition(out, opts, boundingRect);\n    }\n    var mappedSectorPosition = positionMapping(textPosition);\n    var distance = opts.distance != null ? opts.distance : 5;\n    var sector = this.shape;\n    var cx = sector.cx;\n    var cy = sector.cy;\n    var r = sector.r;\n    var r0 = sector.r0;\n    var middleR = (r + r0) / 2;\n    var startAngle = sector.startAngle;\n    var endAngle = sector.endAngle;\n    var middleAngle = (startAngle + endAngle) / 2;\n    var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0;\n    var mathCos = Math.cos;\n    var mathSin = Math.sin;\n    // base position: top-left\n    var x = cx + r * mathCos(startAngle);\n    var y = cy + r * mathSin(startAngle);\n    var textAlign = 'left';\n    var textVerticalAlign = 'top';\n    switch (mappedSectorPosition) {\n      case 'startArc':\n        x = cx + (r0 - distance) * mathCos(middleAngle);\n        y = cy + (r0 - distance) * mathSin(middleAngle);\n        textAlign = 'center';\n        textVerticalAlign = 'top';\n        break;\n      case 'insideStartArc':\n        x = cx + (r0 + distance) * mathCos(middleAngle);\n        y = cy + (r0 + distance) * mathSin(middleAngle);\n        textAlign = 'center';\n        textVerticalAlign = 'bottom';\n        break;\n      case 'startAngle':\n        x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false);\n        y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false);\n        textAlign = 'right';\n        textVerticalAlign = 'middle';\n        break;\n      case 'insideStartAngle':\n        x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false);\n        y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false);\n        textAlign = 'left';\n        textVerticalAlign = 'middle';\n        break;\n      case 'middle':\n        x = cx + middleR * mathCos(middleAngle);\n        y = cy + middleR * mathSin(middleAngle);\n        textAlign = 'center';\n        textVerticalAlign = 'middle';\n        break;\n      case 'endArc':\n        x = cx + (r + distance) * mathCos(middleAngle);\n        y = cy + (r + distance) * mathSin(middleAngle);\n        textAlign = 'center';\n        textVerticalAlign = 'bottom';\n        break;\n      case 'insideEndArc':\n        x = cx + (r - distance) * mathCos(middleAngle);\n        y = cy + (r - distance) * mathSin(middleAngle);\n        textAlign = 'center';\n        textVerticalAlign = 'top';\n        break;\n      case 'endAngle':\n        x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true);\n        y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true);\n        textAlign = 'left';\n        textVerticalAlign = 'middle';\n        break;\n      case 'insideEndAngle':\n        x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true);\n        y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true);\n        textAlign = 'right';\n        textVerticalAlign = 'middle';\n        break;\n      default:\n        return calculateTextPosition(out, opts, boundingRect);\n    }\n    out = out || {};\n    out.x = x;\n    out.y = y;\n    out.align = textAlign;\n    out.verticalAlign = textVerticalAlign;\n    return out;\n  };\n}\nexport function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) {\n  if (isNumber(rotateType)) {\n    // user-set rotation\n    sector.setTextConfig({\n      rotation: rotateType\n    });\n    return;\n  } else if (isArray(textPosition)) {\n    // user-set position, use 0 as auto rotation\n    sector.setTextConfig({\n      rotation: 0\n    });\n    return;\n  }\n  var shape = sector.shape;\n  var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle;\n  var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle;\n  var middleAngle = (startAngle + endAngle) / 2;\n  var anchorAngle;\n  var mappedSectorPosition = positionMapping(textPosition);\n  switch (mappedSectorPosition) {\n    case 'startArc':\n    case 'insideStartArc':\n    case 'middle':\n    case 'insideEndArc':\n    case 'endArc':\n      anchorAngle = middleAngle;\n      break;\n    case 'startAngle':\n    case 'insideStartAngle':\n      anchorAngle = startAngle;\n      break;\n    case 'endAngle':\n    case 'insideEndAngle':\n      anchorAngle = endAngle;\n      break;\n    default:\n      sector.setTextConfig({\n        rotation: 0\n      });\n      return;\n  }\n  var rotate = Math.PI * 1.5 - anchorAngle;\n  /**\n   * TODO: labels with rotate > Math.PI / 2 should be rotate another\n   * half round flipped to increase readability. However, only middle\n   * position supports this for now, because in other positions, the\n   * anchor point is not at the center of the text, so the positions\n   * after rotating is not as expected.\n   */\n  if (mappedSectorPosition === 'middle' && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) {\n    rotate -= Math.PI;\n  }\n  sector.setTextConfig({\n    rotation: rotate\n  });\n}\nfunction adjustAngleDistanceX(angle, distance, isEnd) {\n  return distance * Math.sin(angle) * (isEnd ? -1 : 1);\n}\nfunction adjustAngleDistanceY(angle, distance, isEnd) {\n  return distance * Math.cos(angle) * (isEnd ? 1 : -1);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isArray, map } from 'zrender/lib/core/util.js';\nimport { parsePercent } from 'zrender/lib/contain/text.js';\nexport function getSectorCornerRadius(model, shape, zeroIfNull) {\n  var cornerRadius = model.get('borderRadius');\n  if (cornerRadius == null) {\n    return zeroIfNull ? {\n      cornerRadius: 0\n    } : null;\n  }\n  if (!isArray(cornerRadius)) {\n    cornerRadius = [cornerRadius, cornerRadius, cornerRadius, cornerRadius];\n  }\n  var dr = Math.abs(shape.r || 0 - shape.r0 || 0);\n  return {\n    cornerRadius: map(cornerRadius, function (cr) {\n      return parsePercent(cr, dr);\n    })\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Path from 'zrender/lib/graphic/Path.js';\nimport Group from 'zrender/lib/graphic/Group.js';\nimport { extend, each, map } from 'zrender/lib/core/util.js';\nimport { Rect, Sector, updateProps, initProps, removeElementWithFadeOut, traverseElements } from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport { setLabelStyle, getLabelStatesModels, setLabelValueAnimation, labelInner } from '../../label/labelStyle.js';\nimport { throttle } from '../../util/throttle.js';\nimport { createClipPath } from '../helper/createClipPathFromCoordSys.js';\nimport Sausage from '../../util/shape/sausage.js';\nimport ChartView from '../../view/Chart.js';\nimport { isCoordinateSystemType } from '../../coord/CoordinateSystem.js';\nimport { getDefaultLabel, getDefaultInterpolatedLabel } from '../helper/labelHelper.js';\nimport { warn } from '../../util/log.js';\nimport { createSectorCalculateTextPosition, setSectorTextRotation } from '../../label/sectorLabel.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nimport { getSectorCornerRadius } from '../helper/sectorHelper.js';\nvar mathMax = Math.max;\nvar mathMin = Math.min;\nfunction getClipArea(coord, data) {\n  var coordSysClipArea = coord.getArea && coord.getArea();\n  if (isCoordinateSystemType(coord, 'cartesian2d')) {\n    var baseAxis = coord.getBaseAxis();\n    // When boundaryGap is false or using time axis. bar may exceed the grid.\n    // We should not clip this part.\n    // See test/bar2.html\n    if (baseAxis.type !== 'category' || !baseAxis.onBand) {\n      var expandWidth = data.getLayout('bandWidth');\n      if (baseAxis.isHorizontal()) {\n        coordSysClipArea.x -= expandWidth;\n        coordSysClipArea.width += expandWidth * 2;\n      } else {\n        coordSysClipArea.y -= expandWidth;\n        coordSysClipArea.height += expandWidth * 2;\n      }\n    }\n  }\n  return coordSysClipArea;\n}\nvar BarView = /** @class */function (_super) {\n  __extends(BarView, _super);\n  function BarView() {\n    var _this = _super.call(this) || this;\n    _this.type = BarView.type;\n    _this._isFirstFrame = true;\n    return _this;\n  }\n  BarView.prototype.render = function (seriesModel, ecModel, api, payload) {\n    this._model = seriesModel;\n    this._removeOnRenderedListener(api);\n    this._updateDrawMode(seriesModel);\n    var coordinateSystemType = seriesModel.get('coordinateSystem');\n    if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') {\n      // Clear previously rendered progressive elements.\n      this._progressiveEls = null;\n      this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api, payload);\n    } else if (process.env.NODE_ENV !== 'production') {\n      warn('Only cartesian2d and polar supported for bar.');\n    }\n  };\n  BarView.prototype.incrementalPrepareRender = function (seriesModel) {\n    this._clear();\n    this._updateDrawMode(seriesModel);\n    // incremental also need to clip, otherwise might be overlow.\n    // But must not set clip in each frame, otherwise all of the children will be marked redraw.\n    this._updateLargeClip(seriesModel);\n  };\n  BarView.prototype.incrementalRender = function (params, seriesModel) {\n    // Reset\n    this._progressiveEls = [];\n    // Do not support progressive in normal mode.\n    this._incrementalRenderLarge(params, seriesModel);\n  };\n  BarView.prototype.eachRendered = function (cb) {\n    traverseElements(this._progressiveEls || this.group, cb);\n  };\n  BarView.prototype._updateDrawMode = function (seriesModel) {\n    var isLargeDraw = seriesModel.pipelineContext.large;\n    if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) {\n      this._isLargeDraw = isLargeDraw;\n      this._clear();\n    }\n  };\n  BarView.prototype._renderNormal = function (seriesModel, ecModel, api, payload) {\n    var group = this.group;\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var coord = seriesModel.coordinateSystem;\n    var baseAxis = coord.getBaseAxis();\n    var isHorizontalOrRadial;\n    if (coord.type === 'cartesian2d') {\n      isHorizontalOrRadial = baseAxis.isHorizontal();\n    } else if (coord.type === 'polar') {\n      isHorizontalOrRadial = baseAxis.dim === 'angle';\n    }\n    var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;\n    var realtimeSortCfg = shouldRealtimeSort(seriesModel, coord);\n    if (realtimeSortCfg) {\n      this._enableRealtimeSort(realtimeSortCfg, data, api);\n    }\n    var needsClip = seriesModel.get('clip', true) || realtimeSortCfg;\n    var coordSysClipArea = getClipArea(coord, data);\n    // If there is clipPath created in large mode. Remove it.\n    group.removeClipPath();\n    // We don't use clipPath in normal mode because we needs a perfect animation\n    // And don't want the label are clipped.\n    var roundCap = seriesModel.get('roundCap', true);\n    var drawBackground = seriesModel.get('showBackground', true);\n    var backgroundModel = seriesModel.getModel('backgroundStyle');\n    var barBorderRadius = backgroundModel.get('borderRadius') || 0;\n    var bgEls = [];\n    var oldBgEls = this._backgroundEls;\n    var isInitSort = payload && payload.isInitSort;\n    var isChangeOrder = payload && payload.type === 'changeAxisOrder';\n    function createBackground(dataIndex) {\n      var bgLayout = getLayout[coord.type](data, dataIndex);\n      if (!bgLayout) {\n        return null;\n      }\n      var bgEl = createBackgroundEl(coord, isHorizontalOrRadial, bgLayout);\n      bgEl.useStyle(backgroundModel.getItemStyle());\n      // Only cartesian2d support borderRadius.\n      if (coord.type === 'cartesian2d') {\n        bgEl.setShape('r', barBorderRadius);\n      } else {\n        bgEl.setShape('cornerRadius', barBorderRadius);\n      }\n      bgEls[dataIndex] = bgEl;\n      return bgEl;\n    }\n    ;\n    data.diff(oldData).add(function (dataIndex) {\n      var itemModel = data.getItemModel(dataIndex);\n      var layout = getLayout[coord.type](data, dataIndex, itemModel);\n      if (!layout) {\n        return;\n      }\n      if (drawBackground) {\n        createBackground(dataIndex);\n      }\n      // If dataZoom in filteMode: 'empty', the baseValue can be set as NaN in \"axisProxy\".\n      if (!data.hasValue(dataIndex) || !isValidLayout[coord.type](layout)) {\n        return;\n      }\n      var isClipped = false;\n      if (needsClip) {\n        // Clip will modify the layout params.\n        // And return a boolean to determine if the shape are fully clipped.\n        isClipped = clip[coord.type](coordSysClipArea, layout);\n      }\n      var el = elementCreator[coord.type](seriesModel, data, dataIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, false, roundCap);\n      if (realtimeSortCfg) {\n        /**\n         * Force label animation because even if the element is\n         * ignored because it's clipped, it may not be clipped after\n         * changing order. Then, if not using forceLabelAnimation,\n         * the label animation was never started, in which case,\n         * the label will be the final value and doesn't have label\n         * animation.\n         */\n        el.forceLabelAnimation = true;\n      }\n      updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar');\n      if (isInitSort) {\n        el.attr({\n          shape: layout\n        });\n      } else if (realtimeSortCfg) {\n        updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, dataIndex, isHorizontalOrRadial, false, false);\n      } else {\n        initProps(el, {\n          shape: layout\n        }, seriesModel, dataIndex);\n      }\n      data.setItemGraphicEl(dataIndex, el);\n      group.add(el);\n      el.ignore = isClipped;\n    }).update(function (newIndex, oldIndex) {\n      var itemModel = data.getItemModel(newIndex);\n      var layout = getLayout[coord.type](data, newIndex, itemModel);\n      if (!layout) {\n        return;\n      }\n      if (drawBackground) {\n        var bgEl = void 0;\n        if (oldBgEls.length === 0) {\n          bgEl = createBackground(oldIndex);\n        } else {\n          bgEl = oldBgEls[oldIndex];\n          bgEl.useStyle(backgroundModel.getItemStyle());\n          // Only cartesian2d support borderRadius.\n          if (coord.type === 'cartesian2d') {\n            bgEl.setShape('r', barBorderRadius);\n          } else {\n            bgEl.setShape('cornerRadius', barBorderRadius);\n          }\n          bgEls[newIndex] = bgEl;\n        }\n        var bgLayout = getLayout[coord.type](data, newIndex);\n        var shape = createBackgroundShape(isHorizontalOrRadial, bgLayout, coord);\n        updateProps(bgEl, {\n          shape: shape\n        }, animationModel, newIndex);\n      }\n      var el = oldData.getItemGraphicEl(oldIndex);\n      if (!data.hasValue(newIndex) || !isValidLayout[coord.type](layout)) {\n        group.remove(el);\n        return;\n      }\n      var isClipped = false;\n      if (needsClip) {\n        isClipped = clip[coord.type](coordSysClipArea, layout);\n        if (isClipped) {\n          group.remove(el);\n        }\n      }\n      var roundCapChanged = el && (el.type === 'sector' && roundCap || el.type === 'sausage' && !roundCap);\n      if (roundCapChanged) {\n        // roundCap changed, there is no way to use animation from a `sector` to a `sausage` shape,\n        // so remove the old one and create a new shape\n        el && removeElementWithFadeOut(el, seriesModel, oldIndex);\n        el = null;\n      }\n      if (!el) {\n        el = elementCreator[coord.type](seriesModel, data, newIndex, layout, isHorizontalOrRadial, animationModel, baseAxis.model, true, roundCap);\n      } else {\n        saveOldStyle(el);\n      }\n      if (realtimeSortCfg) {\n        el.forceLabelAnimation = true;\n      }\n      if (isChangeOrder) {\n        var textEl = el.getTextContent();\n        if (textEl) {\n          var labelInnerStore = labelInner(textEl);\n          if (labelInnerStore.prevValue != null) {\n            /**\n             * Set preValue to be value so that no new label\n             * should be started, otherwise, it will take a full\n             * `animationDurationUpdate` time to finish the\n             * animation, which is not expected.\n             */\n            labelInnerStore.prevValue = labelInnerStore.value;\n          }\n        }\n      }\n      // Not change anything if only order changed.\n      // Especially not change label.\n      else {\n        updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar');\n      }\n      if (isInitSort) {\n        el.attr({\n          shape: layout\n        });\n      } else if (realtimeSortCfg) {\n        updateRealtimeAnimation(realtimeSortCfg, animationModel, el, layout, newIndex, isHorizontalOrRadial, true, isChangeOrder);\n      } else {\n        updateProps(el, {\n          shape: layout\n        }, seriesModel, newIndex, null);\n      }\n      data.setItemGraphicEl(newIndex, el);\n      el.ignore = isClipped;\n      group.add(el);\n    }).remove(function (dataIndex) {\n      var el = oldData.getItemGraphicEl(dataIndex);\n      el && removeElementWithFadeOut(el, seriesModel, dataIndex);\n    }).execute();\n    var bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group());\n    bgGroup.removeAll();\n    for (var i = 0; i < bgEls.length; ++i) {\n      bgGroup.add(bgEls[i]);\n    }\n    group.add(bgGroup);\n    this._backgroundEls = bgEls;\n    this._data = data;\n  };\n  BarView.prototype._renderLarge = function (seriesModel, ecModel, api) {\n    this._clear();\n    createLarge(seriesModel, this.group);\n    this._updateLargeClip(seriesModel);\n  };\n  BarView.prototype._incrementalRenderLarge = function (params, seriesModel) {\n    this._removeBackground();\n    createLarge(seriesModel, this.group, this._progressiveEls, true);\n  };\n  BarView.prototype._updateLargeClip = function (seriesModel) {\n    // Use clipPath in large mode.\n    var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel);\n    var group = this.group;\n    if (clipPath) {\n      group.setClipPath(clipPath);\n    } else {\n      group.removeClipPath();\n    }\n  };\n  BarView.prototype._enableRealtimeSort = function (realtimeSortCfg, data, api) {\n    var _this = this;\n    // If no data in the first frame, wait for data to initSort\n    if (!data.count()) {\n      return;\n    }\n    var baseAxis = realtimeSortCfg.baseAxis;\n    if (this._isFirstFrame) {\n      this._dispatchInitSort(data, realtimeSortCfg, api);\n      this._isFirstFrame = false;\n    } else {\n      var orderMapping_1 = function (idx) {\n        var el = data.getItemGraphicEl(idx);\n        var shape = el && el.shape;\n        return shape &&\n        // The result should be consistent with the initial sort by data value.\n        // Do not support the case that both positive and negative exist.\n        Math.abs(baseAxis.isHorizontal() ? shape.height : shape.width)\n        // If data is NaN, shape.xxx may be NaN, so use || 0 here in case\n        || 0;\n      };\n      this._onRendered = function () {\n        _this._updateSortWithinSameData(data, orderMapping_1, baseAxis, api);\n      };\n      api.getZr().on('rendered', this._onRendered);\n    }\n  };\n  BarView.prototype._dataSort = function (data, baseAxis, orderMapping) {\n    var info = [];\n    data.each(data.mapDimension(baseAxis.dim), function (ordinalNumber, dataIdx) {\n      var mappedValue = orderMapping(dataIdx);\n      mappedValue = mappedValue == null ? NaN : mappedValue;\n      info.push({\n        dataIndex: dataIdx,\n        mappedValue: mappedValue,\n        ordinalNumber: ordinalNumber\n      });\n    });\n    info.sort(function (a, b) {\n      // If NaN, it will be treated as min val.\n      return b.mappedValue - a.mappedValue;\n    });\n    return {\n      ordinalNumbers: map(info, function (item) {\n        return item.ordinalNumber;\n      })\n    };\n  };\n  BarView.prototype._isOrderChangedWithinSameData = function (data, orderMapping, baseAxis) {\n    var scale = baseAxis.scale;\n    var ordinalDataDim = data.mapDimension(baseAxis.dim);\n    var lastValue = Number.MAX_VALUE;\n    for (var tickNum = 0, len = scale.getOrdinalMeta().categories.length; tickNum < len; ++tickNum) {\n      var rawIdx = data.rawIndexOf(ordinalDataDim, scale.getRawOrdinalNumber(tickNum));\n      var value = rawIdx < 0\n      // If some tick have no bar, the tick will be treated as min.\n      ? Number.MIN_VALUE\n      // PENDING: if dataZoom on baseAxis exits, is it a performance issue?\n      : orderMapping(data.indexOfRawIndex(rawIdx));\n      if (value > lastValue) {\n        return true;\n      }\n      lastValue = value;\n    }\n    return false;\n  };\n  /*\n   * Consider the case when A and B changed order, whose representing\n   * bars are both out of sight, we don't wish to trigger reorder action\n   * as long as the order in the view doesn't change.\n   */\n  BarView.prototype._isOrderDifferentInView = function (orderInfo, baseAxis) {\n    var scale = baseAxis.scale;\n    var extent = scale.getExtent();\n    var tickNum = Math.max(0, extent[0]);\n    var tickMax = Math.min(extent[1], scale.getOrdinalMeta().categories.length - 1);\n    for (; tickNum <= tickMax; ++tickNum) {\n      if (orderInfo.ordinalNumbers[tickNum] !== scale.getRawOrdinalNumber(tickNum)) {\n        return true;\n      }\n    }\n  };\n  BarView.prototype._updateSortWithinSameData = function (data, orderMapping, baseAxis, api) {\n    if (!this._isOrderChangedWithinSameData(data, orderMapping, baseAxis)) {\n      return;\n    }\n    var sortInfo = this._dataSort(data, baseAxis, orderMapping);\n    if (this._isOrderDifferentInView(sortInfo, baseAxis)) {\n      this._removeOnRenderedListener(api);\n      api.dispatchAction({\n        type: 'changeAxisOrder',\n        componentType: baseAxis.dim + 'Axis',\n        axisId: baseAxis.index,\n        sortInfo: sortInfo\n      });\n    }\n  };\n  BarView.prototype._dispatchInitSort = function (data, realtimeSortCfg, api) {\n    var baseAxis = realtimeSortCfg.baseAxis;\n    var sortResult = this._dataSort(data, baseAxis, function (dataIdx) {\n      return data.get(data.mapDimension(realtimeSortCfg.otherAxis.dim), dataIdx);\n    });\n    api.dispatchAction({\n      type: 'changeAxisOrder',\n      componentType: baseAxis.dim + 'Axis',\n      isInitSort: true,\n      axisId: baseAxis.index,\n      sortInfo: sortResult\n    });\n  };\n  BarView.prototype.remove = function (ecModel, api) {\n    this._clear(this._model);\n    this._removeOnRenderedListener(api);\n  };\n  BarView.prototype.dispose = function (ecModel, api) {\n    this._removeOnRenderedListener(api);\n  };\n  BarView.prototype._removeOnRenderedListener = function (api) {\n    if (this._onRendered) {\n      api.getZr().off('rendered', this._onRendered);\n      this._onRendered = null;\n    }\n  };\n  BarView.prototype._clear = function (model) {\n    var group = this.group;\n    var data = this._data;\n    if (model && model.isAnimationEnabled() && data && !this._isLargeDraw) {\n      this._removeBackground();\n      this._backgroundEls = [];\n      data.eachItemGraphicEl(function (el) {\n        removeElementWithFadeOut(el, model, getECData(el).dataIndex);\n      });\n    } else {\n      group.removeAll();\n    }\n    this._data = null;\n    this._isFirstFrame = true;\n  };\n  BarView.prototype._removeBackground = function () {\n    this.group.remove(this._backgroundGroup);\n    this._backgroundGroup = null;\n  };\n  BarView.type = 'bar';\n  return BarView;\n}(ChartView);\nvar clip = {\n  cartesian2d: function (coordSysBoundingRect, layout) {\n    var signWidth = layout.width < 0 ? -1 : 1;\n    var signHeight = layout.height < 0 ? -1 : 1;\n    // Needs positive width and height\n    if (signWidth < 0) {\n      layout.x += layout.width;\n      layout.width = -layout.width;\n    }\n    if (signHeight < 0) {\n      layout.y += layout.height;\n      layout.height = -layout.height;\n    }\n    var coordSysX2 = coordSysBoundingRect.x + coordSysBoundingRect.width;\n    var coordSysY2 = coordSysBoundingRect.y + coordSysBoundingRect.height;\n    var x = mathMax(layout.x, coordSysBoundingRect.x);\n    var x2 = mathMin(layout.x + layout.width, coordSysX2);\n    var y = mathMax(layout.y, coordSysBoundingRect.y);\n    var y2 = mathMin(layout.y + layout.height, coordSysY2);\n    var xClipped = x2 < x;\n    var yClipped = y2 < y;\n    // When xClipped or yClipped, the element will be marked as `ignore`.\n    // But we should also place the element at the edge of the coord sys bounding rect.\n    // Because if data changed and the bar shows again, its transition animation\n    // will begin at this place.\n    layout.x = xClipped && x > coordSysX2 ? x2 : x;\n    layout.y = yClipped && y > coordSysY2 ? y2 : y;\n    layout.width = xClipped ? 0 : x2 - x;\n    layout.height = yClipped ? 0 : y2 - y;\n    // Reverse back\n    if (signWidth < 0) {\n      layout.x += layout.width;\n      layout.width = -layout.width;\n    }\n    if (signHeight < 0) {\n      layout.y += layout.height;\n      layout.height = -layout.height;\n    }\n    return xClipped || yClipped;\n  },\n  polar: function (coordSysClipArea, layout) {\n    var signR = layout.r0 <= layout.r ? 1 : -1;\n    // Make sure r is larger than r0\n    if (signR < 0) {\n      var tmp = layout.r;\n      layout.r = layout.r0;\n      layout.r0 = tmp;\n    }\n    var r = mathMin(layout.r, coordSysClipArea.r);\n    var r0 = mathMax(layout.r0, coordSysClipArea.r0);\n    layout.r = r;\n    layout.r0 = r0;\n    var clipped = r - r0 < 0;\n    // Reverse back\n    if (signR < 0) {\n      var tmp = layout.r;\n      layout.r = layout.r0;\n      layout.r0 = tmp;\n    }\n    return clipped;\n  }\n};\nvar elementCreator = {\n  cartesian2d: function (seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) {\n    var rect = new Rect({\n      shape: extend({}, layout),\n      z2: 1\n    });\n    rect.__dataIndex = newIndex;\n    rect.name = 'item';\n    if (animationModel) {\n      var rectShape = rect.shape;\n      var animateProperty = isHorizontal ? 'height' : 'width';\n      rectShape[animateProperty] = 0;\n    }\n    return rect;\n  },\n  polar: function (seriesModel, data, newIndex, layout, isRadial, animationModel, axisModel, isUpdate, roundCap) {\n    var ShapeClass = !isRadial && roundCap ? Sausage : Sector;\n    var sector = new ShapeClass({\n      shape: layout,\n      z2: 1\n    });\n    sector.name = 'item';\n    var positionMap = createPolarPositionMapping(isRadial);\n    sector.calculateTextPosition = createSectorCalculateTextPosition(positionMap, {\n      isRoundCap: ShapeClass === Sausage\n    });\n    // Animation\n    if (animationModel) {\n      var sectorShape = sector.shape;\n      var animateProperty = isRadial ? 'r' : 'endAngle';\n      var animateTarget = {};\n      sectorShape[animateProperty] = isRadial ? layout.r0 : layout.startAngle;\n      animateTarget[animateProperty] = layout[animateProperty];\n      (isUpdate ? updateProps : initProps)(sector, {\n        shape: animateTarget\n        // __value: typeof dataValue === 'string' ? parseInt(dataValue, 10) : dataValue\n      }, animationModel);\n    }\n    return sector;\n  }\n};\nfunction shouldRealtimeSort(seriesModel, coordSys) {\n  var realtimeSortOption = seriesModel.get('realtimeSort', true);\n  var baseAxis = coordSys.getBaseAxis();\n  if (process.env.NODE_ENV !== 'production') {\n    if (realtimeSortOption) {\n      if (baseAxis.type !== 'category') {\n        warn('`realtimeSort` will not work because this bar series is not based on a category axis.');\n      }\n      if (coordSys.type !== 'cartesian2d') {\n        warn('`realtimeSort` will not work because this bar series is not on cartesian2d.');\n      }\n    }\n  }\n  if (realtimeSortOption && baseAxis.type === 'category' && coordSys.type === 'cartesian2d') {\n    return {\n      baseAxis: baseAxis,\n      otherAxis: coordSys.getOtherAxis(baseAxis)\n    };\n  }\n}\nfunction updateRealtimeAnimation(realtimeSortCfg, seriesAnimationModel, el, layout, newIndex, isHorizontal, isUpdate, isChangeOrder) {\n  var seriesTarget;\n  var axisTarget;\n  if (isHorizontal) {\n    axisTarget = {\n      x: layout.x,\n      width: layout.width\n    };\n    seriesTarget = {\n      y: layout.y,\n      height: layout.height\n    };\n  } else {\n    axisTarget = {\n      y: layout.y,\n      height: layout.height\n    };\n    seriesTarget = {\n      x: layout.x,\n      width: layout.width\n    };\n  }\n  if (!isChangeOrder) {\n    // Keep the original growth animation if only axis order changed.\n    // Not start a new animation.\n    (isUpdate ? updateProps : initProps)(el, {\n      shape: seriesTarget\n    }, seriesAnimationModel, newIndex, null);\n  }\n  var axisAnimationModel = seriesAnimationModel ? realtimeSortCfg.baseAxis.model : null;\n  (isUpdate ? updateProps : initProps)(el, {\n    shape: axisTarget\n  }, axisAnimationModel, newIndex);\n}\nfunction checkPropertiesNotValid(obj, props) {\n  for (var i = 0; i < props.length; i++) {\n    if (!isFinite(obj[props[i]])) {\n      return true;\n    }\n  }\n  return false;\n}\nvar rectPropties = ['x', 'y', 'width', 'height'];\nvar polarPropties = ['cx', 'cy', 'r', 'startAngle', 'endAngle'];\nvar isValidLayout = {\n  cartesian2d: function (layout) {\n    return !checkPropertiesNotValid(layout, rectPropties);\n  },\n  polar: function (layout) {\n    return !checkPropertiesNotValid(layout, polarPropties);\n  }\n};\nvar getLayout = {\n  // itemModel is only used to get borderWidth, which is not needed\n  // when calculating bar background layout.\n  cartesian2d: function (data, dataIndex, itemModel) {\n    var layout = data.getItemLayout(dataIndex);\n    if (!layout) {\n      return null;\n    }\n    var fixedLineWidth = itemModel ? getLineWidth(itemModel, layout) : 0;\n    // fix layout with lineWidth\n    var signX = layout.width > 0 ? 1 : -1;\n    var signY = layout.height > 0 ? 1 : -1;\n    return {\n      x: layout.x + signX * fixedLineWidth / 2,\n      y: layout.y + signY * fixedLineWidth / 2,\n      width: layout.width - signX * fixedLineWidth,\n      height: layout.height - signY * fixedLineWidth\n    };\n  },\n  polar: function (data, dataIndex, itemModel) {\n    var layout = data.getItemLayout(dataIndex);\n    return {\n      cx: layout.cx,\n      cy: layout.cy,\n      r0: layout.r0,\n      r: layout.r,\n      startAngle: layout.startAngle,\n      endAngle: layout.endAngle,\n      clockwise: layout.clockwise\n    };\n  }\n};\nfunction isZeroOnPolar(layout) {\n  return layout.startAngle != null && layout.endAngle != null && layout.startAngle === layout.endAngle;\n}\nfunction createPolarPositionMapping(isRadial) {\n  return function (isRadial) {\n    var arcOrAngle = isRadial ? 'Arc' : 'Angle';\n    return function (position) {\n      switch (position) {\n        case 'start':\n        case 'insideStart':\n        case 'end':\n        case 'insideEnd':\n          return position + arcOrAngle;\n        default:\n          return position;\n      }\n    };\n  }(isRadial);\n}\nfunction updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, isPolar) {\n  var style = data.getItemVisual(dataIndex, 'style');\n  if (!isPolar) {\n    var borderRadius = itemModel.get(['itemStyle', 'borderRadius']) || 0;\n    el.setShape('r', borderRadius);\n  } else if (!seriesModel.get('roundCap')) {\n    var sectorShape = el.shape;\n    var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true);\n    extend(sectorShape, cornerRadius);\n    el.setShape(sectorShape);\n  }\n  el.useStyle(style);\n  var cursorStyle = itemModel.getShallow('cursor');\n  cursorStyle && el.attr('cursor', cursorStyle);\n  var labelPositionOutside = isPolar ? isHorizontalOrRadial ? layout.r >= layout.r0 ? 'endArc' : 'startArc' : layout.endAngle >= layout.startAngle ? 'endAngle' : 'startAngle' : isHorizontalOrRadial ? layout.height >= 0 ? 'bottom' : 'top' : layout.width >= 0 ? 'right' : 'left';\n  var labelStatesModels = getLabelStatesModels(itemModel);\n  setLabelStyle(el, labelStatesModels, {\n    labelFetcher: seriesModel,\n    labelDataIndex: dataIndex,\n    defaultText: getDefaultLabel(seriesModel.getData(), dataIndex),\n    inheritColor: style.fill,\n    defaultOpacity: style.opacity,\n    defaultOutsidePosition: labelPositionOutside\n  });\n  var label = el.getTextContent();\n  if (isPolar && label) {\n    var position = itemModel.get(['label', 'position']);\n    el.textConfig.inside = position === 'middle' ? true : null;\n    setSectorTextRotation(el, position === 'outside' ? labelPositionOutside : position, createPolarPositionMapping(isHorizontalOrRadial), itemModel.get(['label', 'rotate']));\n  }\n  setLabelValueAnimation(label, labelStatesModels, seriesModel.getRawValue(dataIndex), function (value) {\n    return getDefaultInterpolatedLabel(data, value);\n  });\n  var emphasisModel = itemModel.getModel(['emphasis']);\n  toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  setStatesStylesFromModel(el, itemModel);\n  if (isZeroOnPolar(layout)) {\n    el.style.fill = 'none';\n    el.style.stroke = 'none';\n    each(el.states, function (state) {\n      if (state.style) {\n        state.style.fill = state.style.stroke = 'none';\n      }\n    });\n  }\n}\n// In case width or height are too small.\nfunction getLineWidth(itemModel, rawLayout) {\n  // Has no border.\n  var borderColor = itemModel.get(['itemStyle', 'borderColor']);\n  if (!borderColor || borderColor === 'none') {\n    return 0;\n  }\n  var lineWidth = itemModel.get(['itemStyle', 'borderWidth']) || 0;\n  // width or height may be NaN for empty data\n  var width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width);\n  var height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height);\n  return Math.min(lineWidth, width, height);\n}\nvar LagePathShape = /** @class */function () {\n  function LagePathShape() {}\n  return LagePathShape;\n}();\nvar LargePath = /** @class */function (_super) {\n  __extends(LargePath, _super);\n  function LargePath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'largeBar';\n    return _this;\n  }\n  LargePath.prototype.getDefaultShape = function () {\n    return new LagePathShape();\n  };\n  LargePath.prototype.buildPath = function (ctx, shape) {\n    // Drawing lines is more efficient than drawing\n    // a whole line or drawing rects.\n    var points = shape.points;\n    var baseDimIdx = this.baseDimIdx;\n    var valueDimIdx = 1 - this.baseDimIdx;\n    var startPoint = [];\n    var size = [];\n    var barWidth = this.barWidth;\n    for (var i = 0; i < points.length; i += 3) {\n      size[baseDimIdx] = barWidth;\n      size[valueDimIdx] = points[i + 2];\n      startPoint[baseDimIdx] = points[i + baseDimIdx];\n      startPoint[valueDimIdx] = points[i + valueDimIdx];\n      ctx.rect(startPoint[0], startPoint[1], size[0], size[1]);\n    }\n  };\n  return LargePath;\n}(Path);\nfunction createLarge(seriesModel, group, progressiveEls, incremental) {\n  // TODO support polar\n  var data = seriesModel.getData();\n  var baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0;\n  var largeDataIndices = data.getLayout('largeDataIndices');\n  var barWidth = data.getLayout('size');\n  var backgroundModel = seriesModel.getModel('backgroundStyle');\n  var bgPoints = data.getLayout('largeBackgroundPoints');\n  if (bgPoints) {\n    var bgEl = new LargePath({\n      shape: {\n        points: bgPoints\n      },\n      incremental: !!incremental,\n      silent: true,\n      z2: 0\n    });\n    bgEl.baseDimIdx = baseDimIdx;\n    bgEl.largeDataIndices = largeDataIndices;\n    bgEl.barWidth = barWidth;\n    bgEl.useStyle(backgroundModel.getItemStyle());\n    group.add(bgEl);\n    progressiveEls && progressiveEls.push(bgEl);\n  }\n  var el = new LargePath({\n    shape: {\n      points: data.getLayout('largePoints')\n    },\n    incremental: !!incremental,\n    ignoreCoarsePointer: true,\n    z2: 1\n  });\n  el.baseDimIdx = baseDimIdx;\n  el.largeDataIndices = largeDataIndices;\n  el.barWidth = barWidth;\n  group.add(el);\n  el.useStyle(data.getVisual('style'));\n  // Stroke is rendered first to avoid overlapping with fill\n  el.style.stroke = null;\n  // Enable tooltip and user mouse/touch event handlers.\n  getECData(el).seriesIndex = seriesModel.seriesIndex;\n  if (!seriesModel.get('silent')) {\n    el.on('mousedown', largePathUpdateDataIndex);\n    el.on('mousemove', largePathUpdateDataIndex);\n  }\n  progressiveEls && progressiveEls.push(el);\n}\n// Use throttle to avoid frequently traverse to find dataIndex.\nvar largePathUpdateDataIndex = throttle(function (event) {\n  var largePath = this;\n  var dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY);\n  getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null;\n}, 30, false);\nfunction largePathFindDataIndex(largePath, x, y) {\n  var baseDimIdx = largePath.baseDimIdx;\n  var valueDimIdx = 1 - baseDimIdx;\n  var points = largePath.shape.points;\n  var largeDataIndices = largePath.largeDataIndices;\n  var startPoint = [];\n  var size = [];\n  var barWidth = largePath.barWidth;\n  for (var i = 0, len = points.length / 3; i < len; i++) {\n    var ii = i * 3;\n    size[baseDimIdx] = barWidth;\n    size[valueDimIdx] = points[ii + 2];\n    startPoint[baseDimIdx] = points[ii + baseDimIdx];\n    startPoint[valueDimIdx] = points[ii + valueDimIdx];\n    if (size[valueDimIdx] < 0) {\n      startPoint[valueDimIdx] += size[valueDimIdx];\n      size[valueDimIdx] = -size[valueDimIdx];\n    }\n    if (x >= startPoint[0] && x <= startPoint[0] + size[0] && y >= startPoint[1] && y <= startPoint[1] + size[1]) {\n      return largeDataIndices[i];\n    }\n  }\n  return -1;\n}\nfunction createBackgroundShape(isHorizontalOrRadial, layout, coord) {\n  if (isCoordinateSystemType(coord, 'cartesian2d')) {\n    var rectShape = layout;\n    var coordLayout = coord.getArea();\n    return {\n      x: isHorizontalOrRadial ? rectShape.x : coordLayout.x,\n      y: isHorizontalOrRadial ? coordLayout.y : rectShape.y,\n      width: isHorizontalOrRadial ? rectShape.width : coordLayout.width,\n      height: isHorizontalOrRadial ? coordLayout.height : rectShape.height\n    };\n  } else {\n    var coordLayout = coord.getArea();\n    var sectorShape = layout;\n    return {\n      cx: coordLayout.cx,\n      cy: coordLayout.cy,\n      r0: isHorizontalOrRadial ? coordLayout.r0 : sectorShape.r0,\n      r: isHorizontalOrRadial ? coordLayout.r : sectorShape.r,\n      startAngle: isHorizontalOrRadial ? sectorShape.startAngle : 0,\n      endAngle: isHorizontalOrRadial ? sectorShape.endAngle : Math.PI * 2\n    };\n  }\n}\nfunction createBackgroundEl(coord, isHorizontalOrRadial, layout) {\n  var ElementClz = coord.type === 'polar' ? Sector : Rect;\n  return new ElementClz({\n    shape: createBackgroundShape(isHorizontalOrRadial, layout, coord),\n    silent: true,\n    z2: 0\n  });\n}\nexport default BarView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { layout, createProgressiveLayout } from '../../layout/barGrid.js';\nimport dataSample from '../../processor/dataSample.js';\nimport BarSeries from './BarSeries.js';\nimport BarView from './BarView.js';\nexport function install(registers) {\n  registers.registerChartView(BarView);\n  registers.registerSeriesModel(BarSeries);\n  registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, zrUtil.curry(layout, 'bar'));\n  // Do layout after other overall layout, which can prepare some information.\n  registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('bar'));\n  // Down sample after filter\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, dataSample('bar'));\n  /**\n   * @payload\n   * @property {string} [componentType=series]\n   * @property {number} [dx]\n   * @property {number} [dy]\n   * @property {number} [zoom]\n   * @property {number} [originX]\n   * @property {number} [originY]\n   */\n  registers.registerAction({\n    type: 'changeAxisOrder',\n    event: 'changeAxisOrder',\n    update: 'update'\n  }, function (payload, ecModel) {\n    var componentType = payload.componentType || 'series';\n    ecModel.eachComponent({\n      mainType: componentType,\n      query: payload\n    }, function (componentModel) {\n      if (payload.sortInfo) {\n        componentModel.axis.setCategorySortInfo(payload.sortInfo);\n      }\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { linearMap } from '../../util/number.js';\nimport { normalizeArcAngles } from 'zrender/lib/core/PathProxy.js';\nimport { makeInner } from '../../util/model.js';\nimport { getCircleLayout } from '../../util/layout.js';\nvar PI2 = Math.PI * 2;\nvar RADIAN = Math.PI / 180;\nexport default function pieLayout(seriesType, ecModel, api) {\n  ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n    var data = seriesModel.getData();\n    var valueDim = data.mapDimension('value');\n    var _a = getCircleLayout(seriesModel, api),\n      cx = _a.cx,\n      cy = _a.cy,\n      r = _a.r,\n      r0 = _a.r0,\n      viewRect = _a.viewRect;\n    var startAngle = -seriesModel.get('startAngle') * RADIAN;\n    var endAngle = seriesModel.get('endAngle');\n    var padAngle = seriesModel.get('padAngle') * RADIAN;\n    endAngle = endAngle === 'auto' ? startAngle - PI2 : -endAngle * RADIAN;\n    var minAngle = seriesModel.get('minAngle') * RADIAN;\n    var minAndPadAngle = minAngle + padAngle;\n    var validDataCount = 0;\n    data.each(valueDim, function (value) {\n      !isNaN(value) && validDataCount++;\n    });\n    var sum = data.getSum(valueDim);\n    // Sum may be 0\n    var unitRadian = Math.PI / (sum || validDataCount) * 2;\n    var clockwise = seriesModel.get('clockwise');\n    var roseType = seriesModel.get('roseType');\n    var stillShowZeroSum = seriesModel.get('stillShowZeroSum');\n    // [0...max]\n    var extent = data.getDataExtent(valueDim);\n    extent[0] = 0;\n    var dir = clockwise ? 1 : -1;\n    var angles = [startAngle, endAngle];\n    var halfPadAngle = dir * padAngle / 2;\n    normalizeArcAngles(angles, !clockwise);\n    startAngle = angles[0], endAngle = angles[1];\n    var layoutData = getSeriesLayoutData(seriesModel);\n    layoutData.startAngle = startAngle;\n    layoutData.endAngle = endAngle;\n    layoutData.clockwise = clockwise;\n    layoutData.cx = cx;\n    layoutData.cy = cy;\n    layoutData.r = r;\n    layoutData.r0 = r0;\n    var angleRange = Math.abs(endAngle - startAngle);\n    // In the case some sector angle is smaller than minAngle\n    var restAngle = angleRange;\n    var valueSumLargerThanMinAngle = 0;\n    var currentAngle = startAngle;\n    // Requird by `pieLabelLayout`.\n    data.setLayout({\n      viewRect: viewRect,\n      r: r\n    });\n    data.each(valueDim, function (value, idx) {\n      var angle;\n      if (isNaN(value)) {\n        data.setItemLayout(idx, {\n          angle: NaN,\n          startAngle: NaN,\n          endAngle: NaN,\n          clockwise: clockwise,\n          cx: cx,\n          cy: cy,\n          r0: r0,\n          r: roseType ? NaN : r\n        });\n        return;\n      }\n      // FIXME \u517C\u5BB9 2.0 \u4F46\u662F roseType \u662F area \u7684\u65F6\u5019\u624D\u662F\u8FD9\u6837\uFF1F\n      if (roseType !== 'area') {\n        angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;\n      } else {\n        angle = angleRange / validDataCount;\n      }\n      if (angle < minAndPadAngle) {\n        angle = minAndPadAngle;\n        restAngle -= minAndPadAngle;\n      } else {\n        valueSumLargerThanMinAngle += value;\n      }\n      var endAngle = currentAngle + dir * angle;\n      // calculate display angle\n      var actualStartAngle = 0;\n      var actualEndAngle = 0;\n      if (padAngle > angle) {\n        actualStartAngle = currentAngle + dir * angle / 2;\n        actualEndAngle = actualStartAngle;\n      } else {\n        actualStartAngle = currentAngle + halfPadAngle;\n        actualEndAngle = endAngle - halfPadAngle;\n      }\n      data.setItemLayout(idx, {\n        angle: angle,\n        startAngle: actualStartAngle,\n        endAngle: actualEndAngle,\n        clockwise: clockwise,\n        cx: cx,\n        cy: cy,\n        r0: r0,\n        r: roseType ? linearMap(value, extent, [r0, r]) : r\n      });\n      currentAngle = endAngle;\n    });\n    // Some sector is constrained by minAngle and padAngle\n    // Rest sectors needs recalculate angle\n    if (restAngle < PI2 && validDataCount) {\n      // Average the angle if rest angle is not enough after all angles is\n      // Constrained by minAngle and padAngle\n      if (restAngle <= 1e-3) {\n        var angle_1 = angleRange / validDataCount;\n        data.each(valueDim, function (value, idx) {\n          if (!isNaN(value)) {\n            var layout = data.getItemLayout(idx);\n            layout.angle = angle_1;\n            var actualStartAngle = 0;\n            var actualEndAngle = 0;\n            if (angle_1 < padAngle) {\n              actualStartAngle = startAngle + dir * (idx + 1 / 2) * angle_1;\n              actualEndAngle = actualStartAngle;\n            } else {\n              actualStartAngle = startAngle + dir * idx * angle_1 + halfPadAngle;\n              actualEndAngle = startAngle + dir * (idx + 1) * angle_1 - halfPadAngle;\n            }\n            layout.startAngle = actualStartAngle;\n            layout.endAngle = actualEndAngle;\n          }\n        });\n      } else {\n        unitRadian = restAngle / valueSumLargerThanMinAngle;\n        currentAngle = startAngle;\n        data.each(valueDim, function (value, idx) {\n          if (!isNaN(value)) {\n            var layout = data.getItemLayout(idx);\n            var angle = layout.angle === minAndPadAngle ? minAndPadAngle : value * unitRadian;\n            var actualStartAngle = 0;\n            var actualEndAngle = 0;\n            if (angle < padAngle) {\n              actualStartAngle = currentAngle + dir * angle / 2;\n              actualEndAngle = actualStartAngle;\n            } else {\n              actualStartAngle = currentAngle + halfPadAngle;\n              actualEndAngle = currentAngle + dir * angle - halfPadAngle;\n            }\n            layout.startAngle = actualStartAngle;\n            layout.endAngle = actualEndAngle;\n            currentAngle += dir * angle;\n          }\n        });\n      }\n    }\n  });\n}\nexport var getSeriesLayoutData = makeInner();", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport default function dataFilter(seriesType) {\n  return {\n    seriesType: seriesType,\n    reset: function (seriesModel, ecModel) {\n      var legendModels = ecModel.findComponents({\n        mainType: 'legend'\n      });\n      if (!legendModels || !legendModels.length) {\n        return;\n      }\n      var data = seriesModel.getData();\n      data.filterSelf(function (idx) {\n        var name = data.getName(idx);\n        // If in any legend component the status is not selected.\n        for (var i = 0; i < legendModels.length; i++) {\n          // @ts-ignore FIXME: LegendModel\n          if (!legendModels[i].isSelected(name)) {\n            return false;\n          }\n        }\n        return true;\n      });\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// FIXME emphasis label position is not same with normal label position\nimport { parsePercent } from '../../util/number.js';\nimport { Point } from '../../util/graphic.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { each, isNumber } from 'zrender/lib/core/util.js';\nimport { limitTurnAngle, limitSurfaceAngle } from '../../label/labelGuideHelper.js';\nimport { computeLabelGeometry, shiftLayoutOnXY } from '../../label/labelLayoutHelper.js';\nvar RADIAN = Math.PI / 180;\nfunction adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) {\n  if (list.length < 2) {\n    return;\n  }\n  ;\n  function recalculateXOnSemiToAlignOnEllipseCurve(semi) {\n    var rB = semi.rB;\n    var rB2 = rB * rB;\n    for (var i = 0; i < semi.list.length; i++) {\n      var item = semi.list[i];\n      var dy = Math.abs(item.label.y - cy);\n      // horizontal r is always same with original r because x is not changed.\n      var rA = r + item.len;\n      var rA2 = rA * rA;\n      // Use ellipse implicit function to calculate x\n      var dx = Math.sqrt(Math.abs((1 - dy * dy / rB2) * rA2));\n      var newX = cx + (dx + item.len2) * dir;\n      var deltaX = newX - item.label.x;\n      var newTargetWidth = item.targetTextWidth - deltaX * dir;\n      // text x is changed, so need to recalculate width.\n      constrainTextWidth(item, newTargetWidth, true);\n      item.label.x = newX;\n    }\n  }\n  // Adjust X based on the shifted y. Make tight labels aligned on an ellipse curve.\n  function recalculateX(items) {\n    // Extremes of\n    var topSemi = {\n      list: [],\n      maxY: 0\n    };\n    var bottomSemi = {\n      list: [],\n      maxY: 0\n    };\n    for (var i = 0; i < items.length; i++) {\n      if (items[i].labelAlignTo !== 'none') {\n        continue;\n      }\n      var item = items[i];\n      var semi = item.label.y > cy ? bottomSemi : topSemi;\n      var dy = Math.abs(item.label.y - cy);\n      if (dy >= semi.maxY) {\n        var dx = item.label.x - cx - item.len2 * dir;\n        // horizontal r is always same with original r because x is not changed.\n        var rA = r + item.len;\n        // Canculate rB based on the topest / bottemest label.\n        var rB = Math.abs(dx) < rA ? Math.sqrt(dy * dy / (1 - dx * dx / rA / rA)) : rA;\n        semi.rB = rB;\n        semi.maxY = dy;\n      }\n      semi.list.push(item);\n    }\n    recalculateXOnSemiToAlignOnEllipseCurve(topSemi);\n    recalculateXOnSemiToAlignOnEllipseCurve(bottomSemi);\n  }\n  var len = list.length;\n  for (var i = 0; i < len; i++) {\n    if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') {\n      var dx = list[i].label.x - farthestX;\n      list[i].linePoints[1][0] += dx;\n      list[i].label.x = farthestX;\n    }\n  }\n  if (shiftLayoutOnXY(list, 1, viewTop, viewTop + viewHeight)) {\n    recalculateX(list);\n  }\n}\nfunction avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) {\n  var leftList = [];\n  var rightList = [];\n  var leftmostX = Number.MAX_VALUE;\n  var rightmostX = -Number.MAX_VALUE;\n  for (var i = 0; i < labelLayoutList.length; i++) {\n    var label = labelLayoutList[i].label;\n    if (isPositionCenter(labelLayoutList[i])) {\n      continue;\n    }\n    if (label.x < cx) {\n      leftmostX = Math.min(leftmostX, label.x);\n      leftList.push(labelLayoutList[i]);\n    } else {\n      rightmostX = Math.max(rightmostX, label.x);\n      rightList.push(labelLayoutList[i]);\n    }\n  }\n  for (var i = 0; i < labelLayoutList.length; i++) {\n    var layout = labelLayoutList[i];\n    if (!isPositionCenter(layout) && layout.linePoints) {\n      if (layout.labelStyleWidth != null) {\n        continue;\n      }\n      var label = layout.label;\n      var linePoints = layout.linePoints;\n      var targetTextWidth = void 0;\n      if (layout.labelAlignTo === 'edge') {\n        if (label.x < cx) {\n          targetTextWidth = linePoints[2][0] - layout.labelDistance - viewLeft - layout.edgeDistance;\n        } else {\n          targetTextWidth = viewLeft + viewWidth - layout.edgeDistance - linePoints[2][0] - layout.labelDistance;\n        }\n      } else if (layout.labelAlignTo === 'labelLine') {\n        if (label.x < cx) {\n          targetTextWidth = leftmostX - viewLeft - layout.bleedMargin;\n        } else {\n          targetTextWidth = viewLeft + viewWidth - rightmostX - layout.bleedMargin;\n        }\n      } else {\n        if (label.x < cx) {\n          targetTextWidth = label.x - viewLeft - layout.bleedMargin;\n        } else {\n          targetTextWidth = viewLeft + viewWidth - label.x - layout.bleedMargin;\n        }\n      }\n      layout.targetTextWidth = targetTextWidth;\n      constrainTextWidth(layout, targetTextWidth, false);\n    }\n  }\n  adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight, viewLeft, viewTop, rightmostX);\n  adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX);\n  for (var i = 0; i < labelLayoutList.length; i++) {\n    var layout = labelLayoutList[i];\n    if (!isPositionCenter(layout) && layout.linePoints) {\n      var label = layout.label;\n      var linePoints = layout.linePoints;\n      var isAlignToEdge = layout.labelAlignTo === 'edge';\n      var padding = label.style.padding;\n      var paddingH = padding ? padding[1] + padding[3] : 0;\n      // textRect.width already contains paddingH if bgColor is set\n      var extraPaddingH = label.style.backgroundColor ? 0 : paddingH;\n      var realTextWidth = layout.rect.width + extraPaddingH;\n      var dist = linePoints[1][0] - linePoints[2][0];\n      if (isAlignToEdge) {\n        if (label.x < cx) {\n          linePoints[2][0] = viewLeft + layout.edgeDistance + realTextWidth + layout.labelDistance;\n        } else {\n          linePoints[2][0] = viewLeft + viewWidth - layout.edgeDistance - realTextWidth - layout.labelDistance;\n        }\n      } else {\n        if (label.x < cx) {\n          linePoints[2][0] = label.x + layout.labelDistance;\n        } else {\n          linePoints[2][0] = label.x - layout.labelDistance;\n        }\n        linePoints[1][0] = linePoints[2][0] + dist;\n      }\n      linePoints[1][1] = linePoints[2][1] = label.y;\n    }\n  }\n}\n/**\n * Set max width of each label, and then wrap each label to the max width.\n *\n * @param layout label layout\n * @param availableWidth max width for the label to display\n * @param forceRecalculate recaculate the text layout even if the current width\n * is smaller than `availableWidth`. This is useful when the text was previously\n * wrapped by calling `constrainTextWidth` but now `availableWidth` changed, in\n * which case, previous wrapping should be redo.\n */\nfunction constrainTextWidth(layout, availableWidth, forceRecalculate) {\n  if (layout.labelStyleWidth != null) {\n    // User-defined style.width has the highest priority.\n    return;\n  }\n  var label = layout.label;\n  var style = label.style;\n  var textRect = layout.rect;\n  var bgColor = style.backgroundColor;\n  var padding = style.padding;\n  var paddingH = padding ? padding[1] + padding[3] : 0;\n  var overflow = style.overflow;\n  // textRect.width already contains paddingH if bgColor is set\n  var oldOuterWidth = textRect.width + (bgColor ? 0 : paddingH);\n  if (availableWidth < oldOuterWidth || forceRecalculate) {\n    if (overflow && overflow.match('break')) {\n      // Temporarily set background to be null to calculate\n      // the bounding box without background.\n      label.setStyle('backgroundColor', null);\n      // Set constraining width\n      label.setStyle('width', availableWidth - paddingH);\n      // This is the real bounding box of the text without padding.\n      var innerRect = label.getBoundingRect();\n      label.setStyle('width', Math.ceil(innerRect.width));\n      label.setStyle('backgroundColor', bgColor);\n    } else {\n      var availableInnerWidth = availableWidth - paddingH;\n      var newWidth = availableWidth < oldOuterWidth\n      // Current text is too wide, use `availableWidth` as max width.\n      ? availableInnerWidth :\n      // Current available width is enough, but the text may have\n      // already been wrapped with a smaller available width.\n      forceRecalculate ? availableInnerWidth > layout.unconstrainedWidth\n      // Current available is larger than text width,\n      // so don't constrain width (otherwise it may have\n      // empty space in the background).\n      ? null\n      // Current available is smaller than text width, so\n      // use the current available width as constraining\n      // width.\n      : availableInnerWidth\n      // Current available width is enough, so no need to\n      // constrain.\n      : null;\n      label.setStyle('width', newWidth);\n    }\n    computeLabelGlobalRect(textRect, label);\n  }\n}\nfunction computeLabelGlobalRect(out, label) {\n  _tmpLabelGeometry.rect = out;\n  computeLabelGeometry(_tmpLabelGeometry, label, _computeLabelGeometryOpt);\n}\nvar _computeLabelGeometryOpt = {\n  minMarginForce: [null, 0, null, 0],\n  marginDefault: [1, 0, 1, 0]\n};\nvar _tmpLabelGeometry = {};\nfunction isPositionCenter(sectorShape) {\n  // Not change x for center label\n  return sectorShape.position === 'center';\n}\nexport default function pieLabelLayout(seriesModel) {\n  var data = seriesModel.getData();\n  var labelLayoutList = [];\n  var cx;\n  var cy;\n  var hasLabelRotate = false;\n  var minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN;\n  var viewRect = data.getLayout('viewRect');\n  var r = data.getLayout('r');\n  var viewWidth = viewRect.width;\n  var viewLeft = viewRect.x;\n  var viewTop = viewRect.y;\n  var viewHeight = viewRect.height;\n  function setNotShow(el) {\n    el.ignore = true;\n  }\n  function isLabelShown(label) {\n    if (!label.ignore) {\n      return true;\n    }\n    for (var key in label.states) {\n      if (label.states[key].ignore === false) {\n        return true;\n      }\n    }\n    return false;\n  }\n  data.each(function (idx) {\n    var sector = data.getItemGraphicEl(idx);\n    var sectorShape = sector.shape;\n    var label = sector.getTextContent();\n    var labelLine = sector.getTextGuideLine();\n    var itemModel = data.getItemModel(idx);\n    var labelModel = itemModel.getModel('label');\n    // Use position in normal or emphasis\n    var labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']);\n    var labelDistance = labelModel.get('distanceToLabelLine');\n    var labelAlignTo = labelModel.get('alignTo');\n    var edgeDistance = parsePercent(labelModel.get('edgeDistance'), viewWidth);\n    var bleedMargin = labelModel.get('bleedMargin');\n    if (bleedMargin == null) {\n      // An arbitrary strategy for small viewRect - especial pie is layout in calendar or matrix coord sys.\n      bleedMargin = Math.min(viewWidth, viewHeight) > 200 ? 10 : 2;\n    }\n    var labelLineModel = itemModel.getModel('labelLine');\n    var labelLineLen = labelLineModel.get('length');\n    labelLineLen = parsePercent(labelLineLen, viewWidth);\n    var labelLineLen2 = labelLineModel.get('length2');\n    labelLineLen2 = parsePercent(labelLineLen2, viewWidth);\n    if (Math.abs(sectorShape.endAngle - sectorShape.startAngle) < minShowLabelRadian) {\n      each(label.states, setNotShow);\n      label.ignore = true;\n      if (labelLine) {\n        each(labelLine.states, setNotShow);\n        labelLine.ignore = true;\n      }\n      return;\n    }\n    if (!isLabelShown(label)) {\n      return;\n    }\n    var midAngle = (sectorShape.startAngle + sectorShape.endAngle) / 2;\n    var nx = Math.cos(midAngle);\n    var ny = Math.sin(midAngle);\n    var textX;\n    var textY;\n    var linePoints;\n    var textAlign;\n    cx = sectorShape.cx;\n    cy = sectorShape.cy;\n    var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';\n    if (labelPosition === 'center') {\n      textX = sectorShape.cx;\n      textY = sectorShape.cy;\n      textAlign = 'center';\n    } else {\n      var x1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * nx : sectorShape.r * nx) + cx;\n      var y1 = (isLabelInside ? (sectorShape.r + sectorShape.r0) / 2 * ny : sectorShape.r * ny) + cy;\n      textX = x1 + nx * 3;\n      textY = y1 + ny * 3;\n      if (!isLabelInside) {\n        // For roseType\n        var x2 = x1 + nx * (labelLineLen + r - sectorShape.r);\n        var y2 = y1 + ny * (labelLineLen + r - sectorShape.r);\n        var x3 = x2 + (nx < 0 ? -1 : 1) * labelLineLen2;\n        var y3 = y2;\n        if (labelAlignTo === 'edge') {\n          // Adjust textX because text align of edge is opposite\n          textX = nx < 0 ? viewLeft + edgeDistance : viewLeft + viewWidth - edgeDistance;\n        } else {\n          textX = x3 + (nx < 0 ? -labelDistance : labelDistance);\n        }\n        textY = y3;\n        linePoints = [[x1, y1], [x2, y2], [x3, y3]];\n      }\n      textAlign = isLabelInside ? 'center' : labelAlignTo === 'edge' ? nx > 0 ? 'right' : 'left' : nx > 0 ? 'left' : 'right';\n    }\n    var PI = Math.PI;\n    var labelRotate = 0;\n    var rotate = labelModel.get('rotate');\n    if (isNumber(rotate)) {\n      labelRotate = rotate * (PI / 180);\n    } else if (labelPosition === 'center') {\n      labelRotate = 0;\n    } else if (rotate === 'radial' || rotate === true) {\n      var radialAngle = nx < 0 ? -midAngle + PI : -midAngle;\n      labelRotate = radialAngle;\n    } else if (rotate === 'tangential' && labelPosition !== 'outside' && labelPosition !== 'outer') {\n      var rad = Math.atan2(nx, ny);\n      if (rad < 0) {\n        rad = PI * 2 + rad;\n      }\n      var isDown = ny > 0;\n      if (isDown) {\n        rad = PI + rad;\n      }\n      labelRotate = rad - PI;\n    }\n    hasLabelRotate = !!labelRotate;\n    label.x = textX;\n    label.y = textY;\n    label.rotation = labelRotate;\n    label.setStyle({\n      verticalAlign: 'middle'\n    });\n    // Not sectorShape the inside label\n    if (!isLabelInside) {\n      var textRect = new BoundingRect(0, 0, 0, 0);\n      computeLabelGlobalRect(textRect, label);\n      labelLayoutList.push({\n        label: label,\n        labelLine: labelLine,\n        position: labelPosition,\n        len: labelLineLen,\n        len2: labelLineLen2,\n        minTurnAngle: labelLineModel.get('minTurnAngle'),\n        maxSurfaceAngle: labelLineModel.get('maxSurfaceAngle'),\n        surfaceNormal: new Point(nx, ny),\n        linePoints: linePoints,\n        textAlign: textAlign,\n        labelDistance: labelDistance,\n        labelAlignTo: labelAlignTo,\n        edgeDistance: edgeDistance,\n        bleedMargin: bleedMargin,\n        rect: textRect,\n        unconstrainedWidth: textRect.width,\n        labelStyleWidth: label.style.width\n      });\n    } else {\n      label.setStyle({\n        align: textAlign\n      });\n      var selectState = label.states.select;\n      if (selectState) {\n        selectState.x += label.x;\n        selectState.y += label.y;\n      }\n    }\n    sector.setTextConfig({\n      inside: isLabelInside\n    });\n  });\n  if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {\n    avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop);\n  }\n  for (var i = 0; i < labelLayoutList.length; i++) {\n    var layout = labelLayoutList[i];\n    var label = layout.label;\n    var labelLine = layout.labelLine;\n    var notShowLabel = isNaN(label.x) || isNaN(label.y);\n    if (label) {\n      label.setStyle({\n        align: layout.textAlign\n      });\n      if (notShowLabel) {\n        each(label.states, setNotShow);\n        label.ignore = true;\n      }\n      var selectState = label.states.select;\n      if (selectState) {\n        selectState.x += label.x;\n        selectState.y += label.y;\n      }\n    }\n    if (labelLine) {\n      var linePoints = layout.linePoints;\n      if (notShowLabel || !linePoints) {\n        each(labelLine.states, setNotShow);\n        labelLine.ignore = true;\n      } else {\n        limitTurnAngle(linePoints, layout.minTurnAngle);\n        limitSurfaceAngle(linePoints, layout.surfaceNormal, layout.maxSurfaceAngle);\n        labelLine.setShape({\n          points: linePoints\n        });\n        // Set the anchor to the midpoint of sector\n        label.__hostTarget.textGuideLineConfig = {\n          anchor: new Point(linePoints[0][0], linePoints[0][1])\n        };\n      }\n    }\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { clone, extend, retrieve3 } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport ChartView from '../../view/Chart.js';\nimport labelLayout from './labelLayout.js';\nimport { setLabelLineStyle, getLabelLineStatesModels } from '../../label/labelGuideHelper.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { getSectorCornerRadius } from '../helper/sectorHelper.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nimport { getSeriesLayoutData } from './pieLayout.js';\n/**\n * Piece of pie including Sector, Label, LabelLine\n */\nvar PiePiece = /** @class */function (_super) {\n  __extends(PiePiece, _super);\n  function PiePiece(data, idx, startAngle) {\n    var _this = _super.call(this) || this;\n    _this.z2 = 2;\n    var text = new graphic.Text();\n    _this.setTextContent(text);\n    _this.updateData(data, idx, startAngle, true);\n    return _this;\n  }\n  PiePiece.prototype.updateData = function (data, idx, startAngle, firstCreate) {\n    var sector = this;\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var emphasisModel = itemModel.getModel('emphasis');\n    var layout = data.getItemLayout(idx);\n    // cornerRadius & innerCornerRadius doesn't exist in the item layout. Use `0` if null value is specified.\n    // see `setItemLayout` in `pieLayout.ts`.\n    var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout);\n    // Ignore NaN data.\n    if (isNaN(sectorShape.startAngle)) {\n      // Use NaN shape to avoid drawing shape.\n      sector.setShape(sectorShape);\n      return;\n    }\n    if (firstCreate) {\n      sector.setShape(sectorShape);\n      var animationType = seriesModel.getShallow('animationType');\n      if (seriesModel.ecModel.ssr) {\n        // Use scale animation in SSR mode(opacity?)\n        // Because CSS SVG animation doesn't support very customized shape animation.\n        graphic.initProps(sector, {\n          scaleX: 0,\n          scaleY: 0\n        }, seriesModel, {\n          dataIndex: idx,\n          isFrom: true\n        });\n        sector.originX = sectorShape.cx;\n        sector.originY = sectorShape.cy;\n      } else if (animationType === 'scale') {\n        sector.shape.r = layout.r0;\n        graphic.initProps(sector, {\n          shape: {\n            r: layout.r\n          }\n        }, seriesModel, idx);\n      }\n      // Expansion\n      else {\n        if (startAngle != null) {\n          sector.setShape({\n            startAngle: startAngle,\n            endAngle: startAngle\n          });\n          graphic.initProps(sector, {\n            shape: {\n              startAngle: layout.startAngle,\n              endAngle: layout.endAngle\n            }\n          }, seriesModel, idx);\n        } else {\n          sector.shape.endAngle = layout.startAngle;\n          graphic.updateProps(sector, {\n            shape: {\n              endAngle: layout.endAngle\n            }\n          }, seriesModel, idx);\n        }\n      }\n    } else {\n      saveOldStyle(sector);\n      // Transition animation from the old shape\n      graphic.updateProps(sector, {\n        shape: sectorShape\n      }, seriesModel, idx);\n    }\n    sector.useStyle(data.getItemVisual(idx, 'style'));\n    setStatesStylesFromModel(sector, itemModel);\n    var midAngle = (layout.startAngle + layout.endAngle) / 2;\n    var offset = seriesModel.get('selectedOffset');\n    var dx = Math.cos(midAngle) * offset;\n    var dy = Math.sin(midAngle) * offset;\n    var cursorStyle = itemModel.getShallow('cursor');\n    cursorStyle && sector.attr('cursor', cursorStyle);\n    this._updateLabel(seriesModel, data, idx);\n    sector.ensureState('emphasis').shape = extend({\n      r: layout.r + (emphasisModel.get('scale') ? emphasisModel.get('scaleSize') || 0 : 0)\n    }, getSectorCornerRadius(emphasisModel.getModel('itemStyle'), layout));\n    extend(sector.ensureState('select'), {\n      x: dx,\n      y: dy,\n      shape: getSectorCornerRadius(itemModel.getModel(['select', 'itemStyle']), layout)\n    });\n    extend(sector.ensureState('blur'), {\n      shape: getSectorCornerRadius(itemModel.getModel(['blur', 'itemStyle']), layout)\n    });\n    var labelLine = sector.getTextGuideLine();\n    var labelText = sector.getTextContent();\n    labelLine && extend(labelLine.ensureState('select'), {\n      x: dx,\n      y: dy\n    });\n    // TODO: needs dx, dy in zrender?\n    extend(labelText.ensureState('select'), {\n      x: dx,\n      y: dy\n    });\n    toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  };\n  PiePiece.prototype._updateLabel = function (seriesModel, data, idx) {\n    var sector = this;\n    var itemModel = data.getItemModel(idx);\n    var labelLineModel = itemModel.getModel('labelLine');\n    var style = data.getItemVisual(idx, 'style');\n    var visualColor = style && style.fill;\n    var visualOpacity = style && style.opacity;\n    setLabelStyle(sector, getLabelStatesModels(itemModel), {\n      labelFetcher: data.hostModel,\n      labelDataIndex: idx,\n      inheritColor: visualColor,\n      defaultOpacity: visualOpacity,\n      defaultText: seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx)\n    });\n    var labelText = sector.getTextContent();\n    // Set textConfig on sector.\n    sector.setTextConfig({\n      // reset position, rotation\n      position: null,\n      rotation: null\n    });\n    // Make sure update style on labelText after setLabelStyle.\n    // Because setLabelStyle will replace a new style on it.\n    labelText.attr({\n      z2: 10\n    });\n    var labelPosition = itemModel.get(['label', 'position']);\n    if (labelPosition !== 'outside' && labelPosition !== 'outer') {\n      sector.removeTextGuideLine();\n    } else {\n      var polyline = this.getTextGuideLine();\n      if (!polyline) {\n        polyline = new graphic.Polyline();\n        this.setTextGuideLine(polyline);\n      }\n      // Default use item visual color\n      setLabelLineStyle(this, getLabelLineStatesModels(itemModel), {\n        stroke: visualColor,\n        opacity: retrieve3(labelLineModel.get(['lineStyle', 'opacity']), visualOpacity, 1)\n      });\n    }\n  };\n  return PiePiece;\n}(graphic.Sector);\n// Pie view\nvar PieView = /** @class */function (_super) {\n  __extends(PieView, _super);\n  function PieView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.ignoreLabelLineUpdate = true;\n    return _this;\n  }\n  PieView.prototype.render = function (seriesModel, ecModel, api, payload) {\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var group = this.group;\n    var startAngle;\n    // First render\n    if (!oldData && data.count() > 0) {\n      var shape = data.getItemLayout(0);\n      for (var s = 1; isNaN(shape && shape.startAngle) && s < data.count(); ++s) {\n        shape = data.getItemLayout(s);\n      }\n      if (shape) {\n        startAngle = shape.startAngle;\n      }\n    }\n    // remove empty-circle if it exists\n    if (this._emptyCircleSector) {\n      group.remove(this._emptyCircleSector);\n    }\n    // when all data are filtered, show lightgray empty circle\n    if (data.count() === 0 && seriesModel.get('showEmptyCircle')) {\n      var layoutData = getSeriesLayoutData(seriesModel);\n      var sector = new graphic.Sector({\n        shape: clone(layoutData)\n      });\n      sector.useStyle(seriesModel.getModel('emptyCircleStyle').getItemStyle());\n      this._emptyCircleSector = sector;\n      group.add(sector);\n    }\n    data.diff(oldData).add(function (idx) {\n      var piePiece = new PiePiece(data, idx, startAngle);\n      data.setItemGraphicEl(idx, piePiece);\n      group.add(piePiece);\n    }).update(function (newIdx, oldIdx) {\n      var piePiece = oldData.getItemGraphicEl(oldIdx);\n      piePiece.updateData(data, newIdx, startAngle);\n      piePiece.off('click');\n      group.add(piePiece);\n      data.setItemGraphicEl(newIdx, piePiece);\n    }).remove(function (idx) {\n      var piePiece = oldData.getItemGraphicEl(idx);\n      graphic.removeElementWithFadeOut(piePiece, seriesModel, idx);\n    }).execute();\n    labelLayout(seriesModel);\n    // Always use initial animation.\n    if (seriesModel.get('animationTypeUpdate') !== 'expansion') {\n      this._data = data;\n    }\n  };\n  PieView.prototype.dispose = function () {};\n  PieView.prototype.containPoint = function (point, seriesModel) {\n    var data = seriesModel.getData();\n    var itemLayout = data.getItemLayout(0);\n    if (itemLayout) {\n      var dx = point[0] - itemLayout.cx;\n      var dy = point[1] - itemLayout.cy;\n      var radius = Math.sqrt(dx * dx + dy * dy);\n      return radius <= itemLayout.r && radius >= itemLayout.r0;\n    }\n  };\n  PieView.type = 'pie';\n  return PieView;\n}(ChartView);\nexport default PieView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport prepareSeriesDataSchema from '../../data/helper/createDimensions.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport { extend, isArray } from 'zrender/lib/core/util.js';\n/**\n * [Usage]:\n * (1)\n * createListSimply(seriesModel, ['value']);\n * (2)\n * createListSimply(seriesModel, {\n *     coordDimensions: ['value'],\n *     dimensionsCount: 5\n * });\n */\nexport default function createSeriesDataSimply(seriesModel, opt, nameList) {\n  opt = isArray(opt) && {\n    coordDimensions: opt\n  } || extend({\n    encodeDefine: seriesModel.getEncode()\n  }, opt);\n  var source = seriesModel.getSource();\n  var dimensions = prepareSeriesDataSchema(source, opt).dimensions;\n  var list = new SeriesData(dimensions, seriesModel);\n  list.initData(source, nameList);\n  return list;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * LegendVisualProvider is an bridge that pick encoded color from data and\n * provide to the legend component.\n */\nvar LegendVisualProvider = /** @class */function () {\n  function LegendVisualProvider(\n  // Function to get data after filtered. It stores all the encoding info\n  getDataWithEncodedVisual,\n  // Function to get raw data before filtered.\n  getRawData) {\n    this._getDataWithEncodedVisual = getDataWithEncodedVisual;\n    this._getRawData = getRawData;\n  }\n  LegendVisualProvider.prototype.getAllNames = function () {\n    var rawData = this._getRawData();\n    // We find the name from the raw data. In case it's filtered by the legend component.\n    // Normally, the name can be found in rawData, but can't be found in filtered data will display as gray.\n    return rawData.mapArray(rawData.getName);\n  };\n  LegendVisualProvider.prototype.containName = function (name) {\n    var rawData = this._getRawData();\n    return rawData.indexOfName(name) >= 0;\n  };\n  LegendVisualProvider.prototype.indexOfName = function (name) {\n    // Only get data when necessary.\n    // Because LegendVisualProvider constructor may be new in the stage that data is not prepared yet.\n    // Invoking Series#getData immediately will throw an error.\n    var dataWithEncodedVisual = this._getDataWithEncodedVisual();\n    return dataWithEncodedVisual.indexOfName(name);\n  };\n  LegendVisualProvider.prototype.getItemVisual = function (dataIndex, key) {\n    // Get encoded visual properties from final filtered data.\n    var dataWithEncodedVisual = this._getDataWithEncodedVisual();\n    return dataWithEncodedVisual.getItemVisual(dataIndex, key);\n  };\n  return LegendVisualProvider;\n}();\nexport default LegendVisualProvider;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport createSeriesDataSimply from '../helper/createSeriesDataSimply.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../../util/model.js';\nimport { getPercentSeats } from '../../util/number.js';\nimport { makeSeriesEncodeForNameBased } from '../../data/helper/sourceHelper.js';\nimport LegendVisualProvider from '../../visual/LegendVisualProvider.js';\nimport SeriesModel from '../../model/Series.js';\nimport { registerLayOutOnCoordSysUsage } from '../../core/CoordinateSystem.js';\nvar innerData = modelUtil.makeInner();\nvar PieSeriesModel = /** @class */function (_super) {\n  __extends(PieSeriesModel, _super);\n  function PieSeriesModel() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  /**\n   * @overwrite\n   */\n  PieSeriesModel.prototype.init = function (option) {\n    _super.prototype.init.apply(this, arguments);\n    // Enable legend selection for each data item\n    // Use a function instead of direct access because data reference may changed\n    this.legendVisualProvider = new LegendVisualProvider(zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this));\n    this._defaultLabelLine(option);\n  };\n  /**\n   * @overwrite\n   */\n  PieSeriesModel.prototype.mergeOption = function () {\n    _super.prototype.mergeOption.apply(this, arguments);\n  };\n  /**\n   * @overwrite\n   */\n  PieSeriesModel.prototype.getInitialData = function () {\n    return createSeriesDataSimply(this, {\n      coordDimensions: ['value'],\n      encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)\n    });\n  };\n  /**\n   * @overwrite\n   */\n  PieSeriesModel.prototype.getDataParams = function (dataIndex) {\n    var data = this.getData();\n    // update seats when data is changed\n    var dataInner = innerData(data);\n    var seats = dataInner.seats;\n    if (!seats) {\n      var valueList_1 = [];\n      data.each(data.mapDimension('value'), function (value) {\n        valueList_1.push(value);\n      });\n      seats = dataInner.seats = getPercentSeats(valueList_1, data.hostModel.get('percentPrecision'));\n    }\n    var params = _super.prototype.getDataParams.call(this, dataIndex);\n    // seats may be empty when sum is 0\n    params.percent = seats[dataIndex] || 0;\n    params.$vars.push('percent');\n    return params;\n  };\n  PieSeriesModel.prototype._defaultLabelLine = function (option) {\n    // Extend labelLine emphasis\n    modelUtil.defaultEmphasis(option, 'labelLine', ['show']);\n    var labelLineNormalOpt = option.labelLine;\n    var labelLineEmphasisOpt = option.emphasis.labelLine;\n    // Not show label line if `label.normal.show = false`\n    labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show;\n    labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show;\n  };\n  PieSeriesModel.type = 'series.pie';\n  PieSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    legendHoverLink: true,\n    colorBy: 'data',\n    // \u9ED8\u8BA4\u5168\u5C40\u5C45\u4E2D\n    center: ['50%', '50%'],\n    radius: [0, '50%'],\n    // \u9ED8\u8BA4\u987A\u65F6\u9488\n    clockwise: true,\n    startAngle: 90,\n    endAngle: 'auto',\n    padAngle: 0,\n    // \u6700\u5C0F\u89D2\u5EA6\u6539\u4E3A0\n    minAngle: 0,\n    // If the angle of a sector less than `minShowLabelAngle`,\n    // the label will not be displayed.\n    minShowLabelAngle: 0,\n    // \u9009\u4E2D\u65F6\u6247\u533A\u504F\u79FB\u91CF\n    selectedOffset: 10,\n    // \u9009\u62E9\u6A21\u5F0F\uFF0C\u9ED8\u8BA4\u5173\u95ED\uFF0C\u53EF\u9009single\uFF0Cmultiple\n    // selectedMode: false,\n    // \u5357\u4E01\u683C\u5C14\u73AB\u7470\u56FE\u6A21\u5F0F\uFF0C'radius'\uFF08\u534A\u5F84\uFF09 | 'area'\uFF08\u9762\u79EF\uFF09\n    // roseType: null,\n    percentPrecision: 2,\n    // If still show when all data zero.\n    stillShowZeroSum: true,\n    // cursor: null,\n    coordinateSystemUsage: 'box',\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: null,\n    height: null,\n    label: {\n      // color: 'inherit',\n      // If rotate around circle\n      rotate: 0,\n      show: true,\n      overflow: 'truncate',\n      // 'outer', 'inside', 'center'\n      position: 'outer',\n      // 'none', 'labelLine', 'edge'. Works only when position is 'outer'\n      alignTo: 'none',\n      // Closest distance between label and chart edge.\n      // Works only position is 'outer' and alignTo is 'edge'.\n      edgeDistance: '25%',\n      // Works only position is 'outer' and alignTo is not 'edge'.\n      // The default `bleedMargin` is auto determined according to view rect size.\n      // bleedMargin: 10,\n      // Distance between text and label line.\n      distanceToLabelLine: 5\n      // formatter: \u6807\u7B7E\u6587\u672C\u683C\u5F0F\u5668\uFF0C\u540C tooltip.formatter\uFF0C\u4E0D\u652F\u6301\u5F02\u6B65\u56DE\u8C03\n      // \u9ED8\u8BA4\u4F7F\u7528\u5168\u5C40\u6587\u672C\u6837\u5F0F\uFF0C\u8BE6\u89C1 textStyle\n      // distance: \u5F53position\u4E3Ainner\u65F6\u6709\u6548\uFF0C\u4E3Alabel\u4F4D\u7F6E\u5230\u5706\u5FC3\u7684\u8DDD\u79BB\u4E0E\u5706\u534A\u5F84(\u73AF\u72B6\u56FE\u4E3A\u5185\u5916\u534A\u5F84\u548C)\u7684\u6BD4\u4F8B\u7CFB\u6570\n    },\n    // Enabled when label.normal.position is 'outer'\n    labelLine: {\n      show: true,\n      // \u5F15\u5BFC\u7EBF\u4E24\u6BB5\u4E2D\u7684\u7B2C\u4E00\u6BB5\u957F\u5EA6\n      length: 15,\n      // \u5F15\u5BFC\u7EBF\u4E24\u6BB5\u4E2D\u7684\u7B2C\u4E8C\u6BB5\u957F\u5EA6\n      length2: 30,\n      smooth: false,\n      minTurnAngle: 90,\n      maxSurfaceAngle: 90,\n      lineStyle: {\n        // color: \u5404\u5F02,\n        width: 1,\n        type: 'solid'\n      }\n    },\n    itemStyle: {\n      borderWidth: 1,\n      borderJoin: 'round'\n    },\n    showEmptyCircle: true,\n    emptyCircleStyle: {\n      color: 'lightgray',\n      opacity: 1\n    },\n    labelLayout: {\n      // Hide the overlapped label.\n      hideOverlap: true\n    },\n    emphasis: {\n      scale: true,\n      scaleSize: 5\n    },\n    // If use strategy to avoid label overlapping\n    avoidLabelOverlap: true,\n    // Animation type. Valid values: expansion, scale\n    animationType: 'expansion',\n    animationDuration: 1000,\n    // Animation type when update. Valid values: transition, expansion\n    animationTypeUpdate: 'transition',\n    animationEasingUpdate: 'cubicInOut',\n    animationDurationUpdate: 500,\n    animationEasing: 'cubicInOut'\n  };\n  return PieSeriesModel;\n}(SeriesModel);\nregisterLayOutOnCoordSysUsage({\n  fullType: PieSeriesModel.type,\n  getCoord2: function (model) {\n    // Not able to validate `center` type here.\n    // But percentage center, such as '12%', is not allowed in this case.\n    return model.getShallow('center');\n  }\n});\nexport default PieSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isNumber } from 'zrender/lib/core/util.js';\nexport default function negativeDataFilter(seriesType) {\n  return {\n    seriesType: seriesType,\n    reset: function (seriesModel, ecModel) {\n      var data = seriesModel.getData();\n      data.filterSelf(function (idx) {\n        // handle negative value condition\n        var valueDim = data.mapDimension('value');\n        var curValue = data.get(valueDim, idx);\n        if (isNumber(curValue) && !isNaN(curValue) && curValue < 0) {\n          return false;\n        }\n        return true;\n      });\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createLegacyDataSelectAction } from '../../legacy/dataSelectAction.js';\nimport pieLayout from '../pie/pieLayout.js';\nimport dataFilter from '../../processor/dataFilter.js';\nimport { curry } from 'zrender/lib/core/util.js';\nimport PieView from './PieView.js';\nimport PieSeriesModel from './PieSeries.js';\nimport negativeDataFilter from '../../processor/negativeDataFilter.js';\nexport function install(registers) {\n  registers.registerChartView(PieView);\n  registers.registerSeriesModel(PieSeriesModel);\n  createLegacyDataSelectAction('pie', registers.registerAction);\n  registers.registerLayout(curry(pieLayout, 'pie'));\n  registers.registerProcessor(dataFilter('pie'));\n  registers.registerProcessor(negativeDataFilter('pie'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport createSeriesData from '../helper/createSeriesData.js';\nimport SeriesModel from '../../model/Series.js';\nimport tokens from '../../visual/tokens.js';\nvar ScatterSeriesModel = /** @class */function (_super) {\n  __extends(ScatterSeriesModel, _super);\n  function ScatterSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ScatterSeriesModel.type;\n    _this.hasSymbolVisual = true;\n    return _this;\n  }\n  ScatterSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesData(null, this, {\n      useEncodeDefaulter: true\n    });\n  };\n  ScatterSeriesModel.prototype.getProgressive = function () {\n    var progressive = this.option.progressive;\n    if (progressive == null) {\n      // PENDING\n      return this.option.large ? 5e3 : this.get('progressive');\n    }\n    return progressive;\n  };\n  ScatterSeriesModel.prototype.getProgressiveThreshold = function () {\n    var progressiveThreshold = this.option.progressiveThreshold;\n    if (progressiveThreshold == null) {\n      // PENDING\n      return this.option.large ? 1e4 : this.get('progressiveThreshold');\n    }\n    return progressiveThreshold;\n  };\n  ScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n    return selectors.point(data.getItemLayout(dataIndex));\n  };\n  ScatterSeriesModel.prototype.getZLevelKey = function () {\n    // Each progressive series has individual key.\n    return this.getData().count() > this.getProgressiveThreshold() ? this.id : '';\n  };\n  ScatterSeriesModel.type = 'series.scatter';\n  ScatterSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar', 'matrix'];\n  ScatterSeriesModel.defaultOption = {\n    coordinateSystem: 'cartesian2d',\n    // zlevel: 0,\n    z: 2,\n    legendHoverLink: true,\n    symbolSize: 10,\n    // symbolRotate: null,  // \u56FE\u5F62\u65CB\u8F6C\u63A7\u5236\n    large: false,\n    // Available when large is true\n    largeThreshold: 2000,\n    // cursor: null,\n    itemStyle: {\n      opacity: 0.8\n      // color: \u5404\u5F02\n    },\n    emphasis: {\n      scale: true\n    },\n    // If clip the overflow graphics\n    // Works on cartesian / polar series\n    clip: true,\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary\n      }\n    },\n    universalTransition: {\n      divideShape: 'clone'\n    }\n    // progressive: null\n  };\n  return ScatterSeriesModel;\n}(SeriesModel);\nexport default ScatterSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/* global Float32Array */\n// TODO Batch by color\nimport * as graphic from '../../util/graphic.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport { getECData } from '../../util/innerStore.js';\nvar BOOST_SIZE_THRESHOLD = 4;\nvar LargeSymbolPathShape = /** @class */function () {\n  function LargeSymbolPathShape() {}\n  return LargeSymbolPathShape;\n}();\nvar LargeSymbolPath = /** @class */function (_super) {\n  __extends(LargeSymbolPath, _super);\n  function LargeSymbolPath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this._off = 0;\n    _this.hoverDataIdx = -1;\n    return _this;\n  }\n  LargeSymbolPath.prototype.getDefaultShape = function () {\n    return new LargeSymbolPathShape();\n  };\n  LargeSymbolPath.prototype.reset = function () {\n    this.notClear = false;\n    this._off = 0;\n  };\n  LargeSymbolPath.prototype.buildPath = function (path, shape) {\n    var points = shape.points;\n    var size = shape.size;\n    var symbolProxy = this.symbolProxy;\n    var symbolProxyShape = symbolProxy.shape;\n    var ctx = path.getContext ? path.getContext() : path;\n    var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD;\n    var softClipShape = this.softClipShape;\n    var i;\n    // Do draw in afterBrush.\n    if (canBoost) {\n      this._ctx = ctx;\n      return;\n    }\n    this._ctx = null;\n    for (i = this._off; i < points.length;) {\n      var x = points[i++];\n      var y = points[i++];\n      if (isNaN(x) || isNaN(y)) {\n        continue;\n      }\n      if (softClipShape && !softClipShape.contain(x, y)) {\n        continue;\n      }\n      symbolProxyShape.x = x - size[0] / 2;\n      symbolProxyShape.y = y - size[1] / 2;\n      symbolProxyShape.width = size[0];\n      symbolProxyShape.height = size[1];\n      symbolProxy.buildPath(path, symbolProxyShape, true);\n    }\n    if (this.incremental) {\n      this._off = i;\n      this.notClear = true;\n    }\n  };\n  LargeSymbolPath.prototype.afterBrush = function () {\n    var shape = this.shape;\n    var points = shape.points;\n    var size = shape.size;\n    var ctx = this._ctx;\n    var softClipShape = this.softClipShape;\n    var i;\n    if (!ctx) {\n      return;\n    }\n    // PENDING If style or other canvas status changed?\n    for (i = this._off; i < points.length;) {\n      var x = points[i++];\n      var y = points[i++];\n      if (isNaN(x) || isNaN(y)) {\n        continue;\n      }\n      if (softClipShape && !softClipShape.contain(x, y)) {\n        continue;\n      }\n      // fillRect is faster than building a rect path and draw.\n      // And it support light globalCompositeOperation.\n      ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]);\n    }\n    if (this.incremental) {\n      this._off = i;\n      this.notClear = true;\n    }\n  };\n  LargeSymbolPath.prototype.findDataIndex = function (x, y) {\n    // TODO ???\n    // Consider transform\n    var shape = this.shape;\n    var points = shape.points;\n    var size = shape.size;\n    var w = Math.max(size[0], 4);\n    var h = Math.max(size[1], 4);\n    // Not consider transform\n    // Treat each element as a rect\n    // top down traverse\n    for (var idx = points.length / 2 - 1; idx >= 0; idx--) {\n      var i = idx * 2;\n      var x0 = points[i] - w / 2;\n      var y0 = points[i + 1] - h / 2;\n      if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) {\n        return idx;\n      }\n    }\n    return -1;\n  };\n  LargeSymbolPath.prototype.contain = function (x, y) {\n    var localPos = this.transformCoordToLocal(x, y);\n    var rect = this.getBoundingRect();\n    x = localPos[0];\n    y = localPos[1];\n    if (rect.contain(x, y)) {\n      // Cache found data index.\n      var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y);\n      return dataIdx >= 0;\n    }\n    this.hoverDataIdx = -1;\n    return false;\n  };\n  LargeSymbolPath.prototype.getBoundingRect = function () {\n    // Ignore stroke for large symbol draw.\n    var rect = this._rect;\n    if (!rect) {\n      var shape = this.shape;\n      var points = shape.points;\n      var size = shape.size;\n      var w = size[0];\n      var h = size[1];\n      var minX = Infinity;\n      var minY = Infinity;\n      var maxX = -Infinity;\n      var maxY = -Infinity;\n      for (var i = 0; i < points.length;) {\n        var x = points[i++];\n        var y = points[i++];\n        minX = Math.min(x, minX);\n        maxX = Math.max(x, maxX);\n        minY = Math.min(y, minY);\n        maxY = Math.max(y, maxY);\n      }\n      rect = this._rect = new graphic.BoundingRect(minX - w / 2, minY - h / 2, maxX - minX + w, maxY - minY + h);\n    }\n    return rect;\n  };\n  return LargeSymbolPath;\n}(graphic.Path);\nvar LargeSymbolDraw = /** @class */function () {\n  function LargeSymbolDraw() {\n    this.group = new graphic.Group();\n  }\n  /**\n   * Update symbols draw by new data\n   */\n  LargeSymbolDraw.prototype.updateData = function (data, opt) {\n    this._clear();\n    var symbolEl = this._create();\n    symbolEl.setShape({\n      points: data.getLayout('points')\n    });\n    this._setCommon(symbolEl, data, opt);\n  };\n  LargeSymbolDraw.prototype.updateLayout = function (data) {\n    var points = data.getLayout('points');\n    this.group.eachChild(function (child) {\n      if (child.startIndex != null) {\n        var len = (child.endIndex - child.startIndex) * 2;\n        var byteOffset = child.startIndex * 4 * 2;\n        points = new Float32Array(points.buffer, byteOffset, len);\n      }\n      child.setShape('points', points);\n      // Reset draw cursor.\n      child.reset();\n    });\n  };\n  LargeSymbolDraw.prototype.incrementalPrepareUpdate = function (data) {\n    this._clear();\n  };\n  LargeSymbolDraw.prototype.incrementalUpdate = function (taskParams, data, opt) {\n    var lastAdded = this._newAdded[0];\n    var points = data.getLayout('points');\n    var oldPoints = lastAdded && lastAdded.shape.points;\n    // Merging the exists. Each element has 1e4 points.\n    // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization)\n    if (oldPoints && oldPoints.length < 2e4) {\n      var oldLen = oldPoints.length;\n      var newPoints = new Float32Array(oldLen + points.length);\n      // Concat two array\n      newPoints.set(oldPoints);\n      newPoints.set(points, oldLen);\n      // Update endIndex\n      lastAdded.endIndex = taskParams.end;\n      lastAdded.setShape({\n        points: newPoints\n      });\n    } else {\n      // Clear\n      this._newAdded = [];\n      var symbolEl = this._create();\n      symbolEl.startIndex = taskParams.start;\n      symbolEl.endIndex = taskParams.end;\n      symbolEl.incremental = true;\n      symbolEl.setShape({\n        points: points\n      });\n      this._setCommon(symbolEl, data, opt);\n    }\n  };\n  LargeSymbolDraw.prototype.eachRendered = function (cb) {\n    this._newAdded[0] && cb(this._newAdded[0]);\n  };\n  LargeSymbolDraw.prototype._create = function () {\n    var symbolEl = new LargeSymbolPath({\n      cursor: 'default'\n    });\n    symbolEl.ignoreCoarsePointer = true;\n    this.group.add(symbolEl);\n    this._newAdded.push(symbolEl);\n    return symbolEl;\n  };\n  LargeSymbolDraw.prototype._setCommon = function (symbolEl, data, opt) {\n    var hostModel = data.hostModel;\n    opt = opt || {};\n    var size = data.getVisual('symbolSize');\n    symbolEl.setShape('size', size instanceof Array ? size : [size, size]);\n    symbolEl.softClipShape = opt.clipShape || null;\n    // Create symbolProxy to build path for each data\n    symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0);\n    // Use symbolProxy setColor method\n    symbolEl.setColor = symbolEl.symbolProxy.setColor;\n    var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD;\n    symbolEl.useStyle(\n    // Draw shadow when doing fillRect is extremely slow.\n    hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color']));\n    var globalStyle = data.getVisual('style');\n    var visualColor = globalStyle && globalStyle.fill;\n    if (visualColor) {\n      symbolEl.setColor(visualColor);\n    }\n    var ecData = getECData(symbolEl);\n    // Enable tooltip\n    // PENDING May have performance issue when path is extremely large\n    ecData.seriesIndex = hostModel.seriesIndex;\n    symbolEl.on('mousemove', function (e) {\n      ecData.dataIndex = null;\n      var dataIndex = symbolEl.hoverDataIdx;\n      if (dataIndex >= 0) {\n        // Provide dataIndex for tooltip\n        ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0);\n      }\n    });\n  };\n  LargeSymbolDraw.prototype.remove = function () {\n    this._clear();\n  };\n  LargeSymbolDraw.prototype._clear = function () {\n    this._newAdded = [];\n    this.group.removeAll();\n  };\n  return LargeSymbolDraw;\n}();\nexport default LargeSymbolDraw;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SymbolDraw from '../helper/SymbolDraw.js';\nimport LargeSymbolDraw from '../helper/LargeSymbolDraw.js';\nimport pointsLayout from '../../layout/points.js';\nimport ChartView from '../../view/Chart.js';\nvar ScatterView = /** @class */function (_super) {\n  __extends(ScatterView, _super);\n  function ScatterView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ScatterView.type;\n    return _this;\n  }\n  ScatterView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var symbolDraw = this._updateSymbolDraw(data, seriesModel);\n    symbolDraw.updateData(data, {\n      // TODO\n      // If this parameter should be a shape or a bounding volume\n      // shape will be more general.\n      // But bounding volume like bounding rect will be much faster in the contain calculation\n      clipShape: this._getClipShape(seriesModel)\n    });\n    this._finished = true;\n  };\n  ScatterView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var symbolDraw = this._updateSymbolDraw(data, seriesModel);\n    symbolDraw.incrementalPrepareUpdate(data);\n    this._finished = false;\n  };\n  ScatterView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) {\n    this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData(), {\n      clipShape: this._getClipShape(seriesModel)\n    });\n    this._finished = taskParams.end === seriesModel.getData().count();\n  };\n  ScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    // Must mark group dirty and make sure the incremental layer will be cleared\n    // PENDING\n    this.group.dirty();\n    if (!this._finished || data.count() > 1e4) {\n      return {\n        update: true\n      };\n    } else {\n      var res = pointsLayout('').reset(seriesModel, ecModel, api);\n      if (res.progress) {\n        res.progress({\n          start: 0,\n          end: data.count(),\n          count: data.count()\n        }, data);\n      }\n      this._symbolDraw.updateLayout(data);\n    }\n  };\n  ScatterView.prototype.eachRendered = function (cb) {\n    this._symbolDraw && this._symbolDraw.eachRendered(cb);\n  };\n  ScatterView.prototype._getClipShape = function (seriesModel) {\n    if (!seriesModel.get('clip', true)) {\n      return;\n    }\n    var coordSys = seriesModel.coordinateSystem;\n    // PENDING make `0.1` configurable, for example, `clipTolerance`?\n    return coordSys && coordSys.getArea && coordSys.getArea(.1);\n  };\n  ScatterView.prototype._updateSymbolDraw = function (data, seriesModel) {\n    var symbolDraw = this._symbolDraw;\n    var pipelineContext = seriesModel.pipelineContext;\n    var isLargeDraw = pipelineContext.large;\n    if (!symbolDraw || isLargeDraw !== this._isLargeDraw) {\n      symbolDraw && symbolDraw.remove();\n      symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw();\n      this._isLargeDraw = isLargeDraw;\n      this.group.removeAll();\n    }\n    this.group.add(symbolDraw.group);\n    return symbolDraw;\n  };\n  ScatterView.prototype.remove = function (ecModel, api) {\n    this._symbolDraw && this._symbolDraw.remove(true);\n    this._symbolDraw = null;\n  };\n  ScatterView.prototype.dispose = function () {};\n  ScatterView.type = 'scatter';\n  return ScatterView;\n}(ChartView);\nexport default ScatterView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport { getLayoutParams, mergeLayoutParam } from '../../util/layout.js';\nimport tokens from '../../visual/tokens.js';\n// For backward compatibility, do not use a margin. Although the labels might touch the edge of\n// the canvas, the chart canvas probably does not have an border or a different background color within a page.\nexport var OUTER_BOUNDS_DEFAULT = {\n  left: 0,\n  right: 0,\n  top: 0,\n  bottom: 0\n};\nexport var OUTER_BOUNDS_CLAMP_DEFAULT = ['25%', '25%'];\nvar GridModel = /** @class */function (_super) {\n  __extends(GridModel, _super);\n  function GridModel() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  GridModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n    var outerBoundsCp = getLayoutParams(option.outerBounds);\n    _super.prototype.mergeDefaultAndTheme.apply(this, arguments);\n    if (outerBoundsCp && option.outerBounds) {\n      mergeLayoutParam(option.outerBounds, outerBoundsCp);\n    }\n  };\n  GridModel.prototype.mergeOption = function (newOption, ecModel) {\n    _super.prototype.mergeOption.apply(this, arguments);\n    if (this.option.outerBounds && newOption.outerBounds) {\n      mergeLayoutParam(this.option.outerBounds, newOption.outerBounds);\n    }\n  };\n  GridModel.type = 'grid';\n  GridModel.dependencies = ['xAxis', 'yAxis'];\n  GridModel.layoutMode = 'box';\n  GridModel.defaultOption = {\n    show: false,\n    // zlevel: 0,\n    z: 0,\n    left: '15%',\n    top: 65,\n    right: '10%',\n    bottom: 80,\n    // If grid size contain label\n    containLabel: false,\n    outerBoundsMode: 'auto',\n    outerBounds: OUTER_BOUNDS_DEFAULT,\n    outerBoundsContain: 'all',\n    outerBoundsClampWidth: OUTER_BOUNDS_CLAMP_DEFAULT[0],\n    outerBoundsClampHeight: OUTER_BOUNDS_CLAMP_DEFAULT[1],\n    // width: {totalWidth} - left - right,\n    // height: {totalHeight} - top - bottom,\n    backgroundColor: tokens.color.transparent,\n    borderWidth: 1,\n    borderColor: tokens.color.neutral30\n  };\n  return GridModel;\n}(ComponentModel);\nexport default GridModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ComponentModel from '../../model/Component.js';\nimport { AxisModelCommonMixin } from '../axisModelCommonMixin.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nvar CartesianAxisModel = /** @class */function (_super) {\n  __extends(CartesianAxisModel, _super);\n  function CartesianAxisModel() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  CartesianAxisModel.prototype.getCoordSysModel = function () {\n    return this.getReferringComponents('grid', SINGLE_REFERRING).models[0];\n  };\n  CartesianAxisModel.type = 'cartesian2dAxis';\n  return CartesianAxisModel;\n}(ComponentModel);\nexport { CartesianAxisModel };\nzrUtil.mixin(CartesianAxisModel, AxisModelCommonMixin);\nexport default CartesianAxisModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport tokens from '../visual/tokens.js';\nvar defaultOption = {\n  show: true,\n  // zlevel: 0,\n  z: 0,\n  // Inverse the axis.\n  inverse: false,\n  // Axis name displayed.\n  name: '',\n  // 'start' | 'middle' | 'end'\n  nameLocation: 'end',\n  // By degree. By default auto rotate by nameLocation.\n  nameRotate: null,\n  nameTruncate: {\n    maxWidth: null,\n    ellipsis: '...',\n    placeholder: '.'\n  },\n  // Use global text style by default.\n  nameTextStyle: {\n    // textMargin: never, // The default value will be specified based on `nameLocation`.\n  },\n  // The gap between axisName and axisLine.\n  nameGap: 15,\n  // Default `false` to support tooltip.\n  silent: false,\n  // Default `false` to avoid legacy user event listener fail.\n  triggerEvent: false,\n  tooltip: {\n    show: false\n  },\n  axisPointer: {},\n  axisLine: {\n    show: true,\n    onZero: true,\n    onZeroAxisIndex: null,\n    lineStyle: {\n      color: tokens.color.axisLine,\n      width: 1,\n      type: 'solid'\n    },\n    // The arrow at both ends the the axis.\n    symbol: ['none', 'none'],\n    symbolSize: [10, 15],\n    breakLine: true\n  },\n  axisTick: {\n    show: true,\n    // Whether axisTick is inside the grid or outside the grid.\n    inside: false,\n    // The length of axisTick.\n    length: 5,\n    lineStyle: {\n      width: 1\n    }\n  },\n  axisLabel: {\n    show: true,\n    // Whether axisLabel is inside the grid or outside the grid.\n    inside: false,\n    rotate: 0,\n    // true | false | null/undefined (auto)\n    showMinLabel: null,\n    // true | false | null/undefined (auto)\n    showMaxLabel: null,\n    margin: 8,\n    // formatter: null,\n    fontSize: 12,\n    color: tokens.color.axisLabel,\n    // In scenarios like axis labels, when labels text's progression direction matches the label\n    // layout direction (e.g., when all letters are in a single line), extra start/end margin is\n    // needed to prevent the text from appearing visually joined. In the other case, when lables\n    // are stacked (e.g., having rotation or horizontal labels on yAxis), the layout needs to be\n    // compact, so NO extra top/bottom margin should be applied.\n    textMargin: [0, 3]\n  },\n  splitLine: {\n    show: true,\n    showMinLine: true,\n    showMaxLine: true,\n    lineStyle: {\n      color: tokens.color.axisSplitLine,\n      width: 1,\n      type: 'solid'\n    }\n  },\n  splitArea: {\n    show: false,\n    areaStyle: {\n      color: [tokens.color.backgroundTint, tokens.color.backgroundTransparent]\n    }\n  },\n  breakArea: {\n    show: true,\n    itemStyle: {\n      color: tokens.color.neutral00,\n      // Break border color should be darker than the splitLine\n      // because it has opacity and should be more prominent\n      borderColor: tokens.color.border,\n      borderWidth: 1,\n      borderType: [3, 3],\n      opacity: 0.6\n    },\n    zigzagAmplitude: 4,\n    zigzagMinSpan: 4,\n    zigzagMaxSpan: 20,\n    zigzagZ: 100,\n    expandOnClick: true\n  },\n  breakLabelLayout: {\n    moveOverlap: 'auto'\n  }\n};\nvar categoryAxis = zrUtil.merge({\n  // The gap at both ends of the axis. For categoryAxis, boolean.\n  boundaryGap: true,\n  // Set false to faster category collection.\n  deduplication: null,\n  jitter: 0,\n  jitterOverlap: true,\n  jitterMargin: 2,\n  // splitArea: {\n  // show: false\n  // },\n  splitLine: {\n    show: false\n  },\n  axisTick: {\n    // If tick is align with label when boundaryGap is true\n    alignWithLabel: false,\n    interval: 'auto',\n    show: 'auto'\n  },\n  axisLabel: {\n    interval: 'auto'\n  }\n}, defaultOption);\nvar valueAxis = zrUtil.merge({\n  boundaryGap: [0, 0],\n  axisLine: {\n    // Not shown when other axis is categoryAxis in cartesian\n    show: 'auto'\n  },\n  axisTick: {\n    // Not shown when other axis is categoryAxis in cartesian\n    show: 'auto'\n  },\n  // TODO\n  // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60]\n  splitNumber: 5,\n  minorTick: {\n    // Minor tick, not available for cateogry axis.\n    show: false,\n    // Split number of minor ticks. The value should be in range of (0, 100)\n    splitNumber: 5,\n    // Length of minor tick\n    length: 3,\n    // Line style\n    lineStyle: {\n      // Default to be same with axisTick\n    }\n  },\n  minorSplitLine: {\n    show: false,\n    lineStyle: {\n      color: tokens.color.axisMinorSplitLine,\n      width: 1\n    }\n  }\n}, defaultOption);\nvar timeAxis = zrUtil.merge({\n  splitNumber: 6,\n  axisLabel: {\n    // To eliminate labels that are not nice\n    showMinLabel: false,\n    showMaxLabel: false,\n    rich: {\n      primary: {\n        fontWeight: 'bold'\n      }\n    }\n  },\n  splitLine: {\n    show: false\n  }\n}, valueAxis);\nvar logAxis = zrUtil.defaults({\n  logBase: 10\n}, valueAxis);\nexport default {\n  category: categoryAxis,\n  value: valueAxis,\n  time: timeAxis,\n  log: logAxis\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport var AXIS_TYPES = {\n  value: 1,\n  category: 1,\n  time: 1,\n  log: 1\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar _impl = null;\nexport function registerAxisBreakHelperImpl(impl) {\n  if (!_impl) {\n    _impl = impl;\n  }\n}\nexport function getAxisBreakHelper() {\n  return _impl;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport axisDefault from './axisDefault.js';\nimport { getLayoutParams, mergeLayoutParam, fetchLayoutMode } from '../util/layout.js';\nimport OrdinalMeta from '../data/OrdinalMeta.js';\nimport { AXIS_TYPES } from './axisCommonTypes.js';\nimport { each, merge } from 'zrender/lib/core/util.js';\nimport { getAxisBreakHelper } from '../component/axis/axisBreakHelper.js';\n/**\n * Generate sub axis model class\n * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ...\n */\nexport default function axisModelCreator(registers, axisName, BaseAxisModelClass, extraDefaultOption) {\n  each(AXIS_TYPES, function (v, axisType) {\n    var defaultOption = merge(merge({}, axisDefault[axisType], true), extraDefaultOption, true);\n    var AxisModel = /** @class */function (_super) {\n      __extends(AxisModel, _super);\n      function AxisModel() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.type = axisName + 'Axis.' + axisType;\n        return _this;\n      }\n      AxisModel.prototype.mergeDefaultAndTheme = function (option, ecModel) {\n        var layoutMode = fetchLayoutMode(this);\n        var inputPositionParams = layoutMode ? getLayoutParams(option) : {};\n        var themeModel = ecModel.getTheme();\n        merge(option, themeModel.get(axisType + 'Axis'));\n        merge(option, this.getDefaultOption());\n        option.type = getAxisType(option);\n        if (layoutMode) {\n          mergeLayoutParam(option, inputPositionParams, layoutMode);\n        }\n      };\n      AxisModel.prototype.optionUpdated = function () {\n        var thisOption = this.option;\n        if (thisOption.type === 'category') {\n          this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);\n        }\n      };\n      /**\n       * Should not be called before all of 'getInitailData' finished.\n       * Because categories are collected during initializing data.\n       */\n      AxisModel.prototype.getCategories = function (rawData) {\n        var option = this.option;\n        // FIXME\n        // warning if called before all of 'getInitailData' finished.\n        if (option.type === 'category') {\n          if (rawData) {\n            return option.data;\n          }\n          return this.__ordinalMeta.categories;\n        }\n      };\n      AxisModel.prototype.getOrdinalMeta = function () {\n        return this.__ordinalMeta;\n      };\n      AxisModel.prototype.updateAxisBreaks = function (payload) {\n        var axisBreakHelper = getAxisBreakHelper();\n        return axisBreakHelper ? axisBreakHelper.updateModelAxisBreak(this, payload) : {\n          breaks: []\n        };\n      };\n      AxisModel.type = axisName + 'Axis.' + axisType;\n      AxisModel.defaultOption = defaultOption;\n      return AxisModel;\n    }(BaseAxisModelClass);\n    registers.registerComponentModel(AxisModel);\n  });\n  registers.registerSubTypeDefaulter(axisName + 'Axis', getAxisType);\n}\nfunction getAxisType(option) {\n  // Default axis with data is category axis\n  return option.type || (option.data ? 'category' : 'value');\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar Cartesian = /** @class */function () {\n  function Cartesian(name) {\n    this.type = 'cartesian';\n    this._dimList = [];\n    this._axes = {};\n    this.name = name || '';\n  }\n  Cartesian.prototype.getAxis = function (dim) {\n    return this._axes[dim];\n  };\n  Cartesian.prototype.getAxes = function () {\n    return zrUtil.map(this._dimList, function (dim) {\n      return this._axes[dim];\n    }, this);\n  };\n  Cartesian.prototype.getAxesByScale = function (scaleType) {\n    scaleType = scaleType.toLowerCase();\n    return zrUtil.filter(this.getAxes(), function (axis) {\n      return axis.scale.type === scaleType;\n    });\n  };\n  Cartesian.prototype.addAxis = function (axis) {\n    var dim = axis.dim;\n    this._axes[dim] = axis;\n    this._dimList.push(dim);\n  };\n  return Cartesian;\n}();\n;\nexport default Cartesian;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport Cartesian from './Cartesian.js';\nimport { invert } from 'zrender/lib/core/matrix.js';\nimport { applyTransform } from 'zrender/lib/core/vector.js';\nexport var cartesian2DDimensions = ['x', 'y'];\nfunction canCalculateAffineTransform(scale) {\n  return (scale.type === 'interval' || scale.type === 'time') && !scale.hasBreaks();\n}\nvar Cartesian2D = /** @class */function (_super) {\n  __extends(Cartesian2D, _super);\n  function Cartesian2D() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'cartesian2d';\n    _this.dimensions = cartesian2DDimensions;\n    return _this;\n  }\n  /**\n   * Calculate an affine transform matrix if two axes are time or value.\n   * It's mainly for accelartion on the large time series data.\n   */\n  Cartesian2D.prototype.calcAffineTransform = function () {\n    this._transform = this._invTransform = null;\n    var xAxisScale = this.getAxis('x').scale;\n    var yAxisScale = this.getAxis('y').scale;\n    if (!canCalculateAffineTransform(xAxisScale) || !canCalculateAffineTransform(yAxisScale)) {\n      return;\n    }\n    var xScaleExtent = xAxisScale.getExtent();\n    var yScaleExtent = yAxisScale.getExtent();\n    var start = this.dataToPoint([xScaleExtent[0], yScaleExtent[0]]);\n    var end = this.dataToPoint([xScaleExtent[1], yScaleExtent[1]]);\n    var xScaleSpan = xScaleExtent[1] - xScaleExtent[0];\n    var yScaleSpan = yScaleExtent[1] - yScaleExtent[0];\n    if (!xScaleSpan || !yScaleSpan) {\n      return;\n    }\n    // Accelerate data to point calculation on the special large time series data.\n    var scaleX = (end[0] - start[0]) / xScaleSpan;\n    var scaleY = (end[1] - start[1]) / yScaleSpan;\n    var translateX = start[0] - xScaleExtent[0] * scaleX;\n    var translateY = start[1] - yScaleExtent[0] * scaleY;\n    var m = this._transform = [scaleX, 0, 0, scaleY, translateX, translateY];\n    this._invTransform = invert([], m);\n  };\n  /**\n   * Base axis will be used on stacking.\n   */\n  Cartesian2D.prototype.getBaseAxis = function () {\n    return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x');\n  };\n  Cartesian2D.prototype.containPoint = function (point) {\n    var axisX = this.getAxis('x');\n    var axisY = this.getAxis('y');\n    return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1]));\n  };\n  Cartesian2D.prototype.containData = function (data) {\n    return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]);\n  };\n  Cartesian2D.prototype.containZone = function (data1, data2) {\n    var zoneDiag1 = this.dataToPoint(data1);\n    var zoneDiag2 = this.dataToPoint(data2);\n    var area = this.getArea();\n    var zone = new BoundingRect(zoneDiag1[0], zoneDiag1[1], zoneDiag2[0] - zoneDiag1[0], zoneDiag2[1] - zoneDiag1[1]);\n    return area.intersect(zone);\n  };\n  Cartesian2D.prototype.dataToPoint = function (data, clamp, out) {\n    out = out || [];\n    var xVal = data[0];\n    var yVal = data[1];\n    // [CAVEAT]: Do not add time consuming operation within and before fast path.\n    // Fast path.\n    if (this._transform\n    // It's supported that if data is like `[Inifity, 123]`, where only Y pixel calculated.\n    && xVal != null && isFinite(xVal) && yVal != null && isFinite(yVal)) {\n      return applyTransform(out, data, this._transform);\n    }\n    var xAxis = this.getAxis('x');\n    var yAxis = this.getAxis('y');\n    out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(xVal, clamp));\n    out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(yVal, clamp));\n    return out;\n  };\n  Cartesian2D.prototype.clampData = function (data, out) {\n    var xScale = this.getAxis('x').scale;\n    var yScale = this.getAxis('y').scale;\n    var xAxisExtent = xScale.getExtent();\n    var yAxisExtent = yScale.getExtent();\n    var x = xScale.parse(data[0]);\n    var y = yScale.parse(data[1]);\n    out = out || [];\n    out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1]));\n    out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1]));\n    return out;\n  };\n  Cartesian2D.prototype.pointToData = function (point, clamp, out) {\n    out = out || [];\n    if (this._invTransform) {\n      return applyTransform(out, point, this._invTransform);\n    }\n    var xAxis = this.getAxis('x');\n    var yAxis = this.getAxis('y');\n    out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp);\n    out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp);\n    return out;\n  };\n  Cartesian2D.prototype.getOtherAxis = function (axis) {\n    return this.getAxis(axis.dim === 'x' ? 'y' : 'x');\n  };\n  /**\n   * Get rect area of cartesian.\n   * Area will have a contain function to determine if a point is in the coordinate system.\n   */\n  Cartesian2D.prototype.getArea = function (tolerance) {\n    tolerance = tolerance || 0;\n    var xExtent = this.getAxis('x').getGlobalExtent();\n    var yExtent = this.getAxis('y').getGlobalExtent();\n    var x = Math.min(xExtent[0], xExtent[1]) - tolerance;\n    var y = Math.min(yExtent[0], yExtent[1]) - tolerance;\n    var width = Math.max(xExtent[0], xExtent[1]) - x + tolerance;\n    var height = Math.max(yExtent[0], yExtent[1]) - y + tolerance;\n    return new BoundingRect(x, y, width, height);\n  };\n  return Cartesian2D;\n}(Cartesian);\n;\nexport default Cartesian2D;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Axis from '../Axis.js';\nvar Axis2D = /** @class */function (_super) {\n  __extends(Axis2D, _super);\n  function Axis2D(dim, scale, coordExtent, axisType, position) {\n    var _this = _super.call(this, dim, scale, coordExtent) || this;\n    /**\n     * Index of axis, can be used as key\n     * Injected outside.\n     */\n    _this.index = 0;\n    _this.type = axisType || 'value';\n    _this.position = position || 'bottom';\n    return _this;\n  }\n  Axis2D.prototype.isHorizontal = function () {\n    var position = this.position;\n    return position === 'top' || position === 'bottom';\n  };\n  /**\n   * Each item cooresponds to this.getExtent(), which\n   * means globalExtent[0] may greater than globalExtent[1],\n   * unless `asc` is input.\n   *\n   * @param {boolean} [asc]\n   * @return {Array.<number>}\n   */\n  Axis2D.prototype.getGlobalExtent = function (asc) {\n    var ret = this.getExtent();\n    ret[0] = this.toGlobalCoord(ret[0]);\n    ret[1] = this.toGlobalCoord(ret[1]);\n    asc && ret[0] > ret[1] && ret.reverse();\n    return ret;\n  };\n  Axis2D.prototype.pointToData = function (point, clamp) {\n    return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp);\n  };\n  /**\n   * Set ordinalSortInfo\n   * @param info new OrdinalSortInfo\n   */\n  Axis2D.prototype.setCategorySortInfo = function (info) {\n    if (this.type !== 'category') {\n      return false;\n    }\n    this.model.option.categorySortInfo = info;\n    this.scale.setSortInfo(info);\n  };\n  return Axis2D;\n}(Axis);\nexport default Axis2D;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { parseFinder } from '../../util/model.js';\nimport { defaults, each } from 'zrender/lib/core/util.js';\nexport var AXIS_BREAK_EXPAND_ACTION_TYPE = 'expandAxisBreak';\nexport var AXIS_BREAK_COLLAPSE_ACTION_TYPE = 'collapseAxisBreak';\nexport var AXIS_BREAK_TOGGLE_ACTION_TYPE = 'toggleAxisBreak';\nvar AXIS_BREAK_CHANGED_EVENT_TYPE = 'axisbreakchanged';\nvar expandAxisBreakActionInfo = {\n  type: AXIS_BREAK_EXPAND_ACTION_TYPE,\n  event: AXIS_BREAK_CHANGED_EVENT_TYPE,\n  update: 'update',\n  refineEvent: refineAxisBreakChangeEvent\n};\nvar collapseAxisBreakActionInfo = {\n  type: AXIS_BREAK_COLLAPSE_ACTION_TYPE,\n  event: AXIS_BREAK_CHANGED_EVENT_TYPE,\n  update: 'update',\n  refineEvent: refineAxisBreakChangeEvent\n};\nvar toggleAxisBreakActionInfo = {\n  type: AXIS_BREAK_TOGGLE_ACTION_TYPE,\n  event: AXIS_BREAK_CHANGED_EVENT_TYPE,\n  update: 'update',\n  refineEvent: refineAxisBreakChangeEvent\n};\nfunction refineAxisBreakChangeEvent(actionResultBatch, payload, ecModel, api) {\n  var breaks = [];\n  each(actionResultBatch, function (actionResult) {\n    breaks = breaks.concat(actionResult.eventBreaks);\n  });\n  return {\n    eventContent: {\n      breaks: breaks\n    }\n  };\n}\nexport function registerAction(registers) {\n  registers.registerAction(expandAxisBreakActionInfo, actionHandler);\n  registers.registerAction(collapseAxisBreakActionInfo, actionHandler);\n  registers.registerAction(toggleAxisBreakActionInfo, actionHandler);\n  function actionHandler(payload, ecModel) {\n    var eventBreaks = [];\n    var finderResult = parseFinder(ecModel, payload);\n    function dealUpdate(modelProp, indexProp) {\n      each(finderResult[modelProp], function (axisModel) {\n        var result = axisModel.updateAxisBreaks(payload);\n        each(result.breaks, function (item) {\n          var _a;\n          eventBreaks.push(defaults((_a = {}, _a[indexProp] = axisModel.componentIndex, _a), item));\n        });\n      });\n    }\n    dealUpdate('xAxisModels', 'xAxisIndex');\n    dealUpdate('yAxisModels', 'yAxisIndex');\n    dealUpdate('singleAxisModels', 'singleAxisIndex');\n    return {\n      eventBreaks: eventBreaks\n    };\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { retrieve, defaults, extend, each, isObject, isString, isNumber, isFunction, retrieve2, assert, map, retrieve3, filter } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport Model from '../../model/Model.js';\nimport { isRadianAroundZero, remRadian } from '../../util/number.js';\nimport { createSymbol, normalizeSymbolOffset } from '../../util/symbol.js';\nimport * as matrixUtil from 'zrender/lib/core/matrix.js';\nimport { applyTransform as v2ApplyTransform } from 'zrender/lib/core/vector.js';\nimport { isNameLocationCenter, shouldShowAllLabels } from '../../coord/axisHelper.js';\nimport { hideOverlap, labelIntersect, computeLabelGeometry2, ensureLabelLayoutWithGeometry, labelLayoutApplyTranslation, setLabelLayoutDirty, newLabelLayoutWithGeometry } from '../../label/labelLayoutHelper.js';\nimport { makeInner } from '../../util/model.js';\nimport { getAxisBreakHelper } from './axisBreakHelper.js';\nimport { AXIS_BREAK_EXPAND_ACTION_TYPE } from './axisAction.js';\nimport { getScaleBreakHelper } from '../../scale/break.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport Point from 'zrender/lib/core/Point.js';\nimport { copyTransform } from 'zrender/lib/core/Transformable.js';\nimport { AxisTickLabelComputingKind, createAxisLabelsComputingContext } from '../../coord/axisTickLabelBuilder.js';\nvar PI = Math.PI;\nvar DEFAULT_CENTER_NAME_MARGIN_LEVELS = [[1, 2, 1, 2], [5, 3, 5, 3], [8, 3, 8, 3]];\nvar DEFAULT_ENDS_NAME_MARGIN_LEVELS = [[0, 1, 0, 1], [0, 3, 0, 3], [0, 3, 0, 3]];\nexport var getLabelInner = makeInner();\nvar getTickInner = makeInner();\n/**\n * A context shared by difference axisBuilder instances.\n * For cross-axes overlap resolving.\n *\n * Lifecycle constraint: should not over a pass of ec main process.\n *  If model is changed, the context must be disposed.\n *\n * @see AxisBuilderLocalContext\n */\nvar AxisBuilderSharedContext = /** @class */function () {\n  function AxisBuilderSharedContext(resolveAxisNameOverlap) {\n    /**\n     * [CAUTION] Do not modify this data structure outside this class.\n     */\n    this.recordMap = {};\n    this.resolveAxisNameOverlap = resolveAxisNameOverlap;\n  }\n  AxisBuilderSharedContext.prototype.ensureRecord = function (axisModel) {\n    var dim = axisModel.axis.dim;\n    var idx = axisModel.componentIndex;\n    var recordMap = this.recordMap;\n    var records = recordMap[dim] || (recordMap[dim] = []);\n    return records[idx] || (records[idx] = {\n      ready: {}\n    });\n  };\n  return AxisBuilderSharedContext;\n}();\nexport { AxisBuilderSharedContext };\n;\n/**\n * [CAUTION]\n *  1. The call of this function must be after axisLabel overlap handlings\n *     (such as `hideOverlap`, `fixMinMaxLabelShow`) and after transform calculating.\n *  2. Can be called multiple times and should be idempotent.\n */\nfunction resetOverlapRecordToShared(cfg, shared, axisModel, labelLayoutList) {\n  var axis = axisModel.axis;\n  var record = shared.ensureRecord(axisModel);\n  var labelInfoList = [];\n  var stOccupiedRect;\n  var useStOccupiedRect = hasAxisName(cfg.axisName) && isNameLocationCenter(cfg.nameLocation);\n  each(labelLayoutList, function (layout) {\n    var layoutInfo = ensureLabelLayoutWithGeometry(layout);\n    if (!layoutInfo || layoutInfo.label.ignore) {\n      return;\n    }\n    labelInfoList.push(layoutInfo);\n    var transGroup = record.transGroup;\n    if (useStOccupiedRect) {\n      // Transform to \"standard axis\" for creating stOccupiedRect (the label rects union).\n      transGroup.transform ? matrixUtil.invert(_stTransTmp, transGroup.transform) : matrixUtil.identity(_stTransTmp);\n      if (layoutInfo.transform) {\n        matrixUtil.mul(_stTransTmp, _stTransTmp, layoutInfo.transform);\n      }\n      BoundingRect.copy(_stLabelRectTmp, layoutInfo.localRect);\n      _stLabelRectTmp.applyTransform(_stTransTmp);\n      stOccupiedRect ? stOccupiedRect.union(_stLabelRectTmp) : BoundingRect.copy(stOccupiedRect = new BoundingRect(0, 0, 0, 0), _stLabelRectTmp);\n    }\n  });\n  var sortByDim = Math.abs(record.dirVec.x) > 0.1 ? 'x' : 'y';\n  var sortByValue = record.transGroup[sortByDim];\n  labelInfoList.sort(function (info1, info2) {\n    return Math.abs(info1.label[sortByDim] - sortByValue) - Math.abs(info2.label[sortByDim] - sortByValue);\n  });\n  if (useStOccupiedRect && stOccupiedRect) {\n    var extent = axis.getExtent();\n    var axisLineX = Math.min(extent[0], extent[1]);\n    var axisLineWidth = Math.max(extent[0], extent[1]) - axisLineX;\n    // If `nameLocation` is 'middle', enlarge axis labels boundingRect to axisLine to avoid bad\n    //  case like that axis name is placed in the gap between axis labels and axis line.\n    // If only one label exists, the entire band should be occupied for\n    // visual consistency, so extent it to [0, canvas width].\n    stOccupiedRect.union(new BoundingRect(axisLineX, 0, axisLineWidth, 1));\n  }\n  record.stOccupiedRect = stOccupiedRect;\n  record.labelInfoList = labelInfoList;\n}\nvar _stTransTmp = matrixUtil.create();\nvar _stLabelRectTmp = new BoundingRect(0, 0, 0, 0);\n/**\n * The default resolver does not involve other axes within the same coordinate system.\n */\nexport var resolveAxisNameOverlapDefault = function (cfg, ctx, axisModel, nameLayoutInfo, nameMoveDirVec, thisRecord) {\n  if (isNameLocationCenter(cfg.nameLocation)) {\n    var stOccupiedRect = thisRecord.stOccupiedRect;\n    if (stOccupiedRect) {\n      moveIfOverlap(computeLabelGeometry2({}, stOccupiedRect, thisRecord.transGroup.transform), nameLayoutInfo, nameMoveDirVec);\n    }\n  } else {\n    moveIfOverlapByLinearLabels(thisRecord.labelInfoList, thisRecord.dirVec, nameLayoutInfo, nameMoveDirVec);\n  }\n};\n// [NOTICE] not consider ignore.\nfunction moveIfOverlap(basedLayoutInfo, movableLayoutInfo, moveDirVec) {\n  var mtv = new Point();\n  if (labelIntersect(basedLayoutInfo, movableLayoutInfo, mtv, {\n    direction: Math.atan2(moveDirVec.y, moveDirVec.x),\n    bidirectional: false,\n    touchThreshold: 0.05\n  })) {\n    labelLayoutApplyTranslation(movableLayoutInfo, mtv);\n  }\n}\nexport function moveIfOverlapByLinearLabels(baseLayoutInfoList, baseDirVec, movableLayoutInfo, moveDirVec) {\n  // Detect and move from far to close.\n  var sameDir = Point.dot(moveDirVec, baseDirVec) >= 0;\n  for (var idx = 0, len = baseLayoutInfoList.length; idx < len; idx++) {\n    var labelInfo = baseLayoutInfoList[sameDir ? idx : len - 1 - idx];\n    if (!labelInfo.label.ignore) {\n      moveIfOverlap(labelInfo, movableLayoutInfo, moveDirVec);\n    }\n  }\n}\n/**\n * @caution\n * - Ensure it is called after the data processing stage finished.\n * - It might be called before `CahrtView#render`, sush as called at `CoordinateSystem#update`,\n *  thus ensure the result the same whenever it is called.\n *\n * A builder for a straight-line axis.\n *\n * A final axis is translated and rotated from a \"standard axis\".\n * So opt.position and opt.rotation is required.\n *\n * A \"standard axis\" is the axis [0,0]-->[abs(axisExtent[1]-axisExtent[0]),0]\n * for example: [0,0]-->[50,0]\n */\nvar AxisBuilder = /** @class */function () {\n  /**\n   * [CAUTION]: axisModel.axis.extent/scale must be ready to use.\n   */\n  function AxisBuilder(axisModel, api, opt, shared) {\n    this.group = new graphic.Group();\n    this._axisModel = axisModel;\n    this._api = api;\n    this._local = {};\n    this._shared = shared || new AxisBuilderSharedContext(resolveAxisNameOverlapDefault);\n    this._resetCfgDetermined(opt);\n  }\n  /**\n   * Regarding axis label related configurations, only the change of label.x/y is supported; other\n   * changes are not necessary and not performant. To be specific, only `axis.position`\n   * (and consequently `labelOffset`) and `axis.extent` can be changed, and assume everything in\n   * `axisModel` are not changed.\n   * Axis line related configurations can be changed since this method can only be called\n   * before they are created.\n   */\n  AxisBuilder.prototype.updateCfg = function (opt) {\n    if (process.env.NODE_ENV !== 'production') {\n      var ready = this._shared.ensureRecord(this._axisModel).ready;\n      // After that, changing cfg is not supported; avoid unnecessary complexity.\n      assert(!ready.axisLine && !ready.axisTickLabelDetermine);\n      // Have to be called again if cfg changed.\n      ready.axisName = ready.axisTickLabelEstimate = false;\n    }\n    var raw = this._cfg.raw;\n    raw.position = opt.position;\n    raw.labelOffset = opt.labelOffset;\n    this._resetCfgDetermined(raw);\n  };\n  /**\n   * [CAUTION] For debug usage. Never change it outside!\n   */\n  AxisBuilder.prototype.__getRawCfg = function () {\n    return this._cfg.raw;\n  };\n  AxisBuilder.prototype._resetCfgDetermined = function (raw) {\n    var axisModel = this._axisModel;\n    // FIXME:\n    //  Currently there is no uniformed way to set default values if an option\n    //  is specified null/undefined by user (intentionally or unintentionally),\n    //  e.g. null/undefined is not a illegal value for `nameLocation`.\n    //  Try to use `getDefaultOption` to address it. But radar has no `getDefaultOption`.\n    var axisModelDefaultOption = axisModel.getDefaultOption ? axisModel.getDefaultOption() : {};\n    // Default value\n    var axisName = retrieve2(raw.axisName, axisModel.get('name'));\n    var nameMoveOverlapOption = axisModel.get('nameMoveOverlap');\n    if (nameMoveOverlapOption == null || nameMoveOverlapOption === 'auto') {\n      nameMoveOverlapOption = retrieve2(raw.defaultNameMoveOverlap, true);\n    }\n    var cfg = {\n      raw: raw,\n      position: raw.position,\n      rotation: raw.rotation,\n      nameDirection: retrieve2(raw.nameDirection, 1),\n      tickDirection: retrieve2(raw.tickDirection, 1),\n      labelDirection: retrieve2(raw.labelDirection, 1),\n      labelOffset: retrieve2(raw.labelOffset, 0),\n      silent: retrieve2(raw.silent, true),\n      axisName: axisName,\n      nameLocation: retrieve3(axisModel.get('nameLocation'), axisModelDefaultOption.nameLocation, 'end'),\n      shouldNameMoveOverlap: hasAxisName(axisName) && nameMoveOverlapOption,\n      optionHideOverlap: axisModel.get(['axisLabel', 'hideOverlap']),\n      showMinorTicks: axisModel.get(['minorTick', 'show'])\n    };\n    if (process.env.NODE_ENV !== 'production') {\n      assert(cfg.position != null);\n      assert(cfg.rotation != null);\n    }\n    this._cfg = cfg;\n    // FIXME Not use a separate text group?\n    var transformGroup = new graphic.Group({\n      x: cfg.position[0],\n      y: cfg.position[1],\n      rotation: cfg.rotation\n    });\n    transformGroup.updateTransform();\n    this._transformGroup = transformGroup;\n    var record = this._shared.ensureRecord(axisModel);\n    record.transGroup = this._transformGroup;\n    record.dirVec = new Point(Math.cos(-cfg.rotation), Math.sin(-cfg.rotation));\n  };\n  AxisBuilder.prototype.build = function (axisPartNameMap, extraParams) {\n    var _this = this;\n    if (!axisPartNameMap) {\n      axisPartNameMap = {\n        axisLine: true,\n        axisTickLabelEstimate: false,\n        axisTickLabelDetermine: true,\n        axisName: true\n      };\n    }\n    each(AXIS_BUILDER_AXIS_PART_NAMES, function (partName) {\n      if (axisPartNameMap[partName]) {\n        builders[partName](_this._cfg, _this._local, _this._shared, _this._axisModel, _this.group, _this._transformGroup, _this._api, extraParams || {});\n      }\n    });\n    return this;\n  };\n  /**\n   * Currently only get text align/verticalAlign by rotation.\n   * NO `position` is involved, otherwise it have to be performed for each `updateAxisLabelChangableProps`.\n   */\n  AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) {\n    var rotationDiff = remRadian(textRotation - axisRotation);\n    var textAlign;\n    var textVerticalAlign;\n    if (isRadianAroundZero(rotationDiff)) {\n      // Label is parallel with axis line.\n      textVerticalAlign = direction > 0 ? 'top' : 'bottom';\n      textAlign = 'center';\n    } else if (isRadianAroundZero(rotationDiff - PI)) {\n      // Label is inverse parallel with axis line.\n      textVerticalAlign = direction > 0 ? 'bottom' : 'top';\n      textAlign = 'center';\n    } else {\n      textVerticalAlign = 'middle';\n      if (rotationDiff > 0 && rotationDiff < PI) {\n        textAlign = direction > 0 ? 'right' : 'left';\n      } else {\n        textAlign = direction > 0 ? 'left' : 'right';\n      }\n    }\n    return {\n      rotation: rotationDiff,\n      textAlign: textAlign,\n      textVerticalAlign: textVerticalAlign\n    };\n  };\n  AxisBuilder.makeAxisEventDataBase = function (axisModel) {\n    var eventData = {\n      componentType: axisModel.mainType,\n      componentIndex: axisModel.componentIndex\n    };\n    eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex;\n    return eventData;\n  };\n  AxisBuilder.isLabelSilent = function (axisModel) {\n    var tooltipOpt = axisModel.get('tooltip');\n    return axisModel.get('silent')\n    // Consider mouse cursor, add these restrictions.\n    || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show);\n  };\n  return AxisBuilder;\n}();\n;\n// Sorted by dependency order.\nvar AXIS_BUILDER_AXIS_PART_NAMES = ['axisLine', 'axisTickLabelEstimate', 'axisTickLabelDetermine', 'axisName'];\nvar builders = {\n  axisLine: function (cfg, local, shared, axisModel, group, transformGroup, api) {\n    if (process.env.NODE_ENV !== 'production') {\n      var ready = shared.ensureRecord(axisModel).ready;\n      assert(!ready.axisLine);\n      ready.axisLine = true;\n    }\n    var shown = axisModel.get(['axisLine', 'show']);\n    if (shown === 'auto') {\n      shown = true;\n      if (cfg.raw.axisLineAutoShow != null) {\n        shown = !!cfg.raw.axisLineAutoShow;\n      }\n    }\n    if (!shown) {\n      return;\n    }\n    var extent = axisModel.axis.getExtent();\n    var matrix = transformGroup.transform;\n    var pt1 = [extent[0], 0];\n    var pt2 = [extent[1], 0];\n    var inverse = pt1[0] > pt2[0];\n    if (matrix) {\n      v2ApplyTransform(pt1, pt1, matrix);\n      v2ApplyTransform(pt2, pt2, matrix);\n    }\n    var lineStyle = extend({\n      lineCap: 'round'\n    }, axisModel.getModel(['axisLine', 'lineStyle']).getLineStyle());\n    var pathBaseProp = {\n      strokeContainThreshold: cfg.raw.strokeContainThreshold || 5,\n      silent: true,\n      z2: 1,\n      style: lineStyle\n    };\n    if (axisModel.get(['axisLine', 'breakLine']) && axisModel.axis.scale.hasBreaks()) {\n      getAxisBreakHelper().buildAxisBreakLine(axisModel, group, transformGroup, pathBaseProp);\n    } else {\n      var line = new graphic.Line(extend({\n        shape: {\n          x1: pt1[0],\n          y1: pt1[1],\n          x2: pt2[0],\n          y2: pt2[1]\n        }\n      }, pathBaseProp));\n      graphic.subPixelOptimizeLine(line.shape, line.style.lineWidth);\n      line.anid = 'line';\n      group.add(line);\n    }\n    var arrows = axisModel.get(['axisLine', 'symbol']);\n    if (arrows != null) {\n      var arrowSize = axisModel.get(['axisLine', 'symbolSize']);\n      if (isString(arrows)) {\n        // Use the same arrow for start and end point\n        arrows = [arrows, arrows];\n      }\n      if (isString(arrowSize) || isNumber(arrowSize)) {\n        // Use the same size for width and height\n        arrowSize = [arrowSize, arrowSize];\n      }\n      var arrowOffset = normalizeSymbolOffset(axisModel.get(['axisLine', 'symbolOffset']) || 0, arrowSize);\n      var symbolWidth_1 = arrowSize[0];\n      var symbolHeight_1 = arrowSize[1];\n      each([{\n        rotate: cfg.rotation + Math.PI / 2,\n        offset: arrowOffset[0],\n        r: 0\n      }, {\n        rotate: cfg.rotation - Math.PI / 2,\n        offset: arrowOffset[1],\n        r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1]))\n      }], function (point, index) {\n        if (arrows[index] !== 'none' && arrows[index] != null) {\n          var symbol = createSymbol(arrows[index], -symbolWidth_1 / 2, -symbolHeight_1 / 2, symbolWidth_1, symbolHeight_1, lineStyle.stroke, true);\n          // Calculate arrow position with offset\n          var r = point.r + point.offset;\n          var pt = inverse ? pt2 : pt1;\n          symbol.attr({\n            rotation: point.rotate,\n            x: pt[0] + r * Math.cos(cfg.rotation),\n            y: pt[1] - r * Math.sin(cfg.rotation),\n            silent: true,\n            z2: 11\n          });\n          group.add(symbol);\n        }\n      });\n    }\n  },\n  /**\n   * [CAUTION] This method can be called multiple times, following the change due to `resetCfg` called\n   *  in size measurement. Thus this method should be idempotent, and should be performant.\n   */\n  axisTickLabelEstimate: function (cfg, local, shared, axisModel, group, transformGroup, api, extraParams) {\n    if (process.env.NODE_ENV !== 'production') {\n      var ready = shared.ensureRecord(axisModel).ready;\n      assert(!ready.axisTickLabelDetermine);\n      ready.axisTickLabelEstimate = true;\n    }\n    var needCallLayout = dealLastTickLabelResultReusable(local, group, extraParams);\n    if (needCallLayout) {\n      layOutAxisTickLabel(cfg, local, shared, axisModel, group, transformGroup, api, AxisTickLabelComputingKind.estimate);\n    }\n  },\n  /**\n   * Finish axis tick label build.\n   * Can be only called once.\n   */\n  axisTickLabelDetermine: function (cfg, local, shared, axisModel, group, transformGroup, api, extraParams) {\n    if (process.env.NODE_ENV !== 'production') {\n      var ready = shared.ensureRecord(axisModel).ready;\n      ready.axisTickLabelDetermine = true;\n    }\n    var needCallLayout = dealLastTickLabelResultReusable(local, group, extraParams);\n    if (needCallLayout) {\n      layOutAxisTickLabel(cfg, local, shared, axisModel, group, transformGroup, api, AxisTickLabelComputingKind.determine);\n    }\n    var ticksEls = buildAxisMajorTicks(cfg, group, transformGroup, axisModel);\n    syncLabelIgnoreToMajorTicks(cfg, local.labelLayoutList, ticksEls);\n    buildAxisMinorTicks(cfg, group, transformGroup, axisModel, cfg.tickDirection);\n  },\n  /**\n   * [CAUTION] This method can be called multiple times, following the change due to `resetCfg` called\n   *  in size measurement. Thus this method should be idempotent, and should be performant.\n   */\n  axisName: function (cfg, local, shared, axisModel, group, transformGroup, api, extraParams) {\n    var sharedRecord = shared.ensureRecord(axisModel);\n    if (process.env.NODE_ENV !== 'production') {\n      var ready = sharedRecord.ready;\n      assert(ready.axisTickLabelEstimate || ready.axisTickLabelDetermine);\n      ready.axisName = true;\n    }\n    // Remove the existing name result created in estimation phase.\n    if (local.nameEl) {\n      group.remove(local.nameEl);\n      local.nameEl = sharedRecord.nameLayout = sharedRecord.nameLocation = null;\n    }\n    var name = cfg.axisName;\n    if (!hasAxisName(name)) {\n      return;\n    }\n    var nameLocation = cfg.nameLocation;\n    var nameDirection = cfg.nameDirection;\n    var textStyleModel = axisModel.getModel('nameTextStyle');\n    var gap = axisModel.get('nameGap') || 0;\n    var extent = axisModel.axis.getExtent();\n    var gapStartEndSignal = axisModel.axis.inverse ? -1 : 1;\n    var pos = new Point(0, 0);\n    var nameMoveDirVec = new Point(0, 0);\n    if (nameLocation === 'start') {\n      pos.x = extent[0] - gapStartEndSignal * gap;\n      nameMoveDirVec.x = -gapStartEndSignal;\n    } else if (nameLocation === 'end') {\n      pos.x = extent[1] + gapStartEndSignal * gap;\n      nameMoveDirVec.x = gapStartEndSignal;\n    } else {\n      // 'middle' or 'center'\n      pos.x = (extent[0] + extent[1]) / 2;\n      pos.y = cfg.labelOffset + nameDirection * gap;\n      nameMoveDirVec.y = nameDirection;\n    }\n    var mt = matrixUtil.create();\n    nameMoveDirVec.transform(matrixUtil.rotate(mt, mt, cfg.rotation));\n    var nameRotation = axisModel.get('nameRotate');\n    if (nameRotation != null) {\n      nameRotation = nameRotation * PI / 180; // To radian.\n    }\n    var labelLayout;\n    var axisNameAvailableWidth;\n    if (isNameLocationCenter(nameLocation)) {\n      labelLayout = AxisBuilder.innerTextLayout(cfg.rotation, nameRotation != null ? nameRotation : cfg.rotation,\n      // Adapt to axis.\n      nameDirection);\n    } else {\n      labelLayout = endTextLayout(cfg.rotation, nameLocation, nameRotation || 0, extent);\n      axisNameAvailableWidth = cfg.raw.axisNameAvailableWidth;\n      if (axisNameAvailableWidth != null) {\n        axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation));\n        !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null);\n      }\n    }\n    var textFont = textStyleModel.getFont();\n    var truncateOpt = axisModel.get('nameTruncate', true) || {};\n    var ellipsis = truncateOpt.ellipsis;\n    var maxWidth = retrieve(cfg.raw.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth);\n    var nameMarginLevel = extraParams.nameMarginLevel || 0;\n    var textEl = new graphic.Text({\n      x: pos.x,\n      y: pos.y,\n      rotation: labelLayout.rotation,\n      silent: AxisBuilder.isLabelSilent(axisModel),\n      style: createTextStyle(textStyleModel, {\n        text: name,\n        font: textFont,\n        overflow: 'truncate',\n        width: maxWidth,\n        ellipsis: ellipsis,\n        fill: textStyleModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']),\n        align: textStyleModel.get('align') || labelLayout.textAlign,\n        verticalAlign: textStyleModel.get('verticalAlign') || labelLayout.textVerticalAlign\n      }),\n      z2: 1\n    });\n    graphic.setTooltipConfig({\n      el: textEl,\n      componentModel: axisModel,\n      itemName: name\n    });\n    textEl.__fullText = name;\n    // Id for animation\n    textEl.anid = 'name';\n    if (axisModel.get('triggerEvent')) {\n      var eventData = AxisBuilder.makeAxisEventDataBase(axisModel);\n      eventData.targetType = 'axisName';\n      eventData.name = name;\n      getECData(textEl).eventData = eventData;\n    }\n    transformGroup.add(textEl);\n    textEl.updateTransform();\n    local.nameEl = textEl;\n    var nameLayout = sharedRecord.nameLayout = ensureLabelLayoutWithGeometry({\n      label: textEl,\n      priority: textEl.z2,\n      defaultAttr: {\n        ignore: textEl.ignore\n      },\n      marginDefault: isNameLocationCenter(nameLocation)\n      // Make axis name visually far from axis labels.\n      // (but not too aggressive, consider multiple small charts)\n      ? DEFAULT_CENTER_NAME_MARGIN_LEVELS[nameMarginLevel]\n      // top/button margin is set to `0` to inserted the xAxis name into the indention\n      // above the axis labels to save space. (see example below.)\n      : DEFAULT_ENDS_NAME_MARGIN_LEVELS[nameMarginLevel]\n    });\n    sharedRecord.nameLocation = nameLocation;\n    group.add(textEl);\n    textEl.decomposeTransform();\n    if (cfg.shouldNameMoveOverlap && nameLayout) {\n      var record = shared.ensureRecord(axisModel);\n      if (process.env.NODE_ENV !== 'production') {\n        assert(record.labelInfoList);\n      }\n      shared.resolveAxisNameOverlap(cfg, shared, axisModel, nameLayout, nameMoveDirVec, record);\n    }\n  }\n};\nfunction layOutAxisTickLabel(cfg, local, shared, axisModel, group, transformGroup, api, kind) {\n  if (!axisLabelBuildResultExists(local)) {\n    buildAxisLabel(cfg, local, group, kind, axisModel, api);\n  }\n  var labelLayoutList = local.labelLayoutList;\n  updateAxisLabelChangableProps(cfg, axisModel, labelLayoutList, transformGroup);\n  adjustBreakLabels(axisModel, cfg.rotation, labelLayoutList);\n  var optionHideOverlap = cfg.optionHideOverlap;\n  fixMinMaxLabelShow(axisModel, labelLayoutList, optionHideOverlap);\n  if (optionHideOverlap) {\n    // This bit fixes the label overlap issue for the time chart.\n    // See https://github.com/apache/echarts/issues/14266 for more.\n    hideOverlap(\n    // Filter the already ignored labels by the previous overlap resolving methods.\n    filter(labelLayoutList, function (layout) {\n      return layout && !layout.label.ignore;\n    }));\n  }\n  // Always call it even this axis has no name, since it serves in overlapping detection\n  // and grid outerBounds on other axis.\n  resetOverlapRecordToShared(cfg, shared, axisModel, labelLayoutList);\n}\n;\nfunction endTextLayout(rotation, textPosition, textRotate, extent) {\n  var rotationDiff = remRadian(textRotate - rotation);\n  var textAlign;\n  var textVerticalAlign;\n  var inverse = extent[0] > extent[1];\n  var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse;\n  if (isRadianAroundZero(rotationDiff - PI / 2)) {\n    textVerticalAlign = onLeft ? 'bottom' : 'top';\n    textAlign = 'center';\n  } else if (isRadianAroundZero(rotationDiff - PI * 1.5)) {\n    textVerticalAlign = onLeft ? 'top' : 'bottom';\n    textAlign = 'center';\n  } else {\n    textVerticalAlign = 'middle';\n    if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) {\n      textAlign = onLeft ? 'left' : 'right';\n    } else {\n      textAlign = onLeft ? 'right' : 'left';\n    }\n  }\n  return {\n    rotation: rotationDiff,\n    textAlign: textAlign,\n    textVerticalAlign: textVerticalAlign\n  };\n}\n/**\n * Assume `labelLayoutList` has no `label.ignore: true`.\n * Assume `labelLayoutList` have been sorted by value ascending order.\n */\nfunction fixMinMaxLabelShow(axisModel, labelLayoutList, optionHideOverlap) {\n  if (shouldShowAllLabels(axisModel.axis)) {\n    return;\n  }\n  // FIXME\n  // Have not consider onBand yet, where tick els is more than label els.\n  // Assert no ignore in labels.\n  function deal(showMinMaxLabel, outmostLabelIdx, innerLabelIdx) {\n    var outmostLabelLayout = ensureLabelLayoutWithGeometry(labelLayoutList[outmostLabelIdx]);\n    var innerLabelLayout = ensureLabelLayoutWithGeometry(labelLayoutList[innerLabelIdx]);\n    if (!outmostLabelLayout || !innerLabelLayout) {\n      return;\n    }\n    if (showMinMaxLabel === false || outmostLabelLayout.suggestIgnore) {\n      ignoreEl(outmostLabelLayout.label);\n      return;\n    }\n    if (innerLabelLayout.suggestIgnore) {\n      ignoreEl(innerLabelLayout.label);\n      return;\n    }\n    // PENDING: Originally we thought `optionHideOverlap === false` means do not hide anything,\n    //  since currently the bounding rect of text might not accurate enough and might slightly bigger,\n    //  which causes false positive. But `optionHideOverlap: null/undfined` is falsy and likely\n    //  be treated as false.\n    // In most fonts the glyph does not reach the boundary of the bounding rect.\n    // This is needed to avoid too aggressive to hide two elements that meet at the edge\n    // due to compact layout by the same bounding rect or OBB.\n    var touchThreshold = 0.1;\n    // This treatment is for backward compatibility. And `!optionHideOverlap` implies that\n    // the user accepts the visual touch between adjacent labels, thus \"hide min/max label\"\n    // should be conservative, since the space might be sufficient in this case.\n    if (!optionHideOverlap) {\n      var marginForce = [0, 0, 0, 0];\n      // Make a copy to apply `ignoreMargin`.\n      outmostLabelLayout = newLabelLayoutWithGeometry({\n        marginForce: marginForce\n      }, outmostLabelLayout);\n      innerLabelLayout = newLabelLayoutWithGeometry({\n        marginForce: marginForce\n      }, innerLabelLayout);\n    }\n    if (labelIntersect(outmostLabelLayout, innerLabelLayout, null, {\n      touchThreshold: touchThreshold\n    })) {\n      if (showMinMaxLabel) {\n        ignoreEl(innerLabelLayout.label);\n      } else {\n        ignoreEl(outmostLabelLayout.label);\n      }\n    }\n  }\n  // If min or max are user set, we need to check\n  // If the tick on min(max) are overlap on their neighbour tick\n  // If they are overlapped, we need to hide the min(max) tick label\n  var showMinLabel = axisModel.get(['axisLabel', 'showMinLabel']);\n  var showMaxLabel = axisModel.get(['axisLabel', 'showMaxLabel']);\n  var labelsLen = labelLayoutList.length;\n  deal(showMinLabel, 0, 1);\n  deal(showMaxLabel, labelsLen - 1, labelsLen - 2);\n}\n// PENDING: Is it necessary to display a tick while the corresponding label is ignored?\nfunction syncLabelIgnoreToMajorTicks(cfg, labelLayoutList, tickEls) {\n  if (cfg.showMinorTicks) {\n    // It probably unreaasonable to hide major ticks when show minor ticks.\n    return;\n  }\n  each(labelLayoutList, function (labelLayout) {\n    if (labelLayout && labelLayout.label.ignore) {\n      for (var idx = 0; idx < tickEls.length; idx++) {\n        var tickEl = tickEls[idx];\n        // Assume small array, linear search is fine for performance.\n        // PENDING: measure?\n        var tickInner = getTickInner(tickEl);\n        var labelInner = getLabelInner(labelLayout.label);\n        if (tickInner.tickValue != null && !tickInner.onBand && tickInner.tickValue === labelInner.tickValue) {\n          ignoreEl(tickEl);\n          return;\n        }\n      }\n    }\n  });\n}\nfunction ignoreEl(el) {\n  el && (el.ignore = true);\n}\nfunction createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, anidPrefix) {\n  var tickEls = [];\n  var pt1 = [];\n  var pt2 = [];\n  for (var i = 0; i < ticksCoords.length; i++) {\n    var tickCoord = ticksCoords[i].coord;\n    pt1[0] = tickCoord;\n    pt1[1] = 0;\n    pt2[0] = tickCoord;\n    pt2[1] = tickEndCoord;\n    if (tickTransform) {\n      v2ApplyTransform(pt1, pt1, tickTransform);\n      v2ApplyTransform(pt2, pt2, tickTransform);\n    }\n    // Tick line, Not use group transform to have better line draw\n    var tickEl = new graphic.Line({\n      shape: {\n        x1: pt1[0],\n        y1: pt1[1],\n        x2: pt2[0],\n        y2: pt2[1]\n      },\n      style: tickLineStyle,\n      z2: 2,\n      autoBatch: true,\n      silent: true\n    });\n    graphic.subPixelOptimizeLine(tickEl.shape, tickEl.style.lineWidth);\n    tickEl.anid = anidPrefix + '_' + ticksCoords[i].tickValue;\n    tickEls.push(tickEl);\n    var inner = getTickInner(tickEl);\n    inner.onBand = !!ticksCoords[i].onBand;\n    inner.tickValue = ticksCoords[i].tickValue;\n  }\n  return tickEls;\n}\nfunction buildAxisMajorTicks(cfg, group, transformGroup, axisModel) {\n  var axis = axisModel.axis;\n  var tickModel = axisModel.getModel('axisTick');\n  var shown = tickModel.get('show');\n  if (shown === 'auto') {\n    shown = true;\n    if (cfg.raw.axisTickAutoShow != null) {\n      shown = !!cfg.raw.axisTickAutoShow;\n    }\n  }\n  if (!shown || axis.scale.isBlank()) {\n    return [];\n  }\n  var lineStyleModel = tickModel.getModel('lineStyle');\n  var tickEndCoord = cfg.tickDirection * tickModel.get('length');\n  var ticksCoords = axis.getTicksCoords();\n  var ticksEls = createTicks(ticksCoords, transformGroup.transform, tickEndCoord, defaults(lineStyleModel.getLineStyle(), {\n    stroke: axisModel.get(['axisLine', 'lineStyle', 'color'])\n  }), 'ticks');\n  for (var i = 0; i < ticksEls.length; i++) {\n    group.add(ticksEls[i]);\n  }\n  return ticksEls;\n}\nfunction buildAxisMinorTicks(cfg, group, transformGroup, axisModel, tickDirection) {\n  var axis = axisModel.axis;\n  var minorTickModel = axisModel.getModel('minorTick');\n  if (!cfg.showMinorTicks || axis.scale.isBlank()) {\n    return;\n  }\n  var minorTicksCoords = axis.getMinorTicksCoords();\n  if (!minorTicksCoords.length) {\n    return;\n  }\n  var lineStyleModel = minorTickModel.getModel('lineStyle');\n  var tickEndCoord = tickDirection * minorTickModel.get('length');\n  var minorTickLineStyle = defaults(lineStyleModel.getLineStyle(), defaults(axisModel.getModel('axisTick').getLineStyle(), {\n    stroke: axisModel.get(['axisLine', 'lineStyle', 'color'])\n  }));\n  for (var i = 0; i < minorTicksCoords.length; i++) {\n    var minorTicksEls = createTicks(minorTicksCoords[i], transformGroup.transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i);\n    for (var k = 0; k < minorTicksEls.length; k++) {\n      group.add(minorTicksEls[k]);\n    }\n  }\n}\n// Return whether need to call `layOutAxisTickLabel` again.\nfunction dealLastTickLabelResultReusable(local, group, extraParams) {\n  if (axisLabelBuildResultExists(local)) {\n    var axisLabelsCreationContext = local.axisLabelsCreationContext;\n    if (process.env.NODE_ENV !== 'production') {\n      assert(local.labelGroup && axisLabelsCreationContext);\n    }\n    var noPxChangeTryDetermine = axisLabelsCreationContext.out.noPxChangeTryDetermine;\n    if (extraParams.noPxChange) {\n      var canDetermine = true;\n      for (var idx = 0; idx < noPxChangeTryDetermine.length; idx++) {\n        canDetermine = canDetermine && noPxChangeTryDetermine[idx]();\n      }\n      if (canDetermine) {\n        return false;\n      }\n    }\n    if (noPxChangeTryDetermine.length) {\n      // Remove the result of `buildAxisLabel`\n      group.remove(local.labelGroup);\n      axisLabelBuildResultSet(local, null, null, null);\n    }\n  }\n  return true;\n}\nfunction buildAxisLabel(cfg, local, group, kind, axisModel, api) {\n  var axis = axisModel.axis;\n  var show = retrieve(cfg.raw.axisLabelShow, axisModel.get(['axisLabel', 'show']));\n  var labelGroup = new graphic.Group();\n  group.add(labelGroup);\n  var axisLabelCreationCtx = createAxisLabelsComputingContext(kind);\n  if (!show || axis.scale.isBlank()) {\n    axisLabelBuildResultSet(local, [], labelGroup, axisLabelCreationCtx);\n    return;\n  }\n  var labelModel = axisModel.getModel('axisLabel');\n  var labels = axis.getViewLabels(axisLabelCreationCtx);\n  // Special label rotate.\n  var labelRotation = (retrieve(cfg.raw.labelRotate, labelModel.get('rotate')) || 0) * PI / 180;\n  var labelLayout = AxisBuilder.innerTextLayout(cfg.rotation, labelRotation, cfg.labelDirection);\n  var rawCategoryData = axisModel.getCategories && axisModel.getCategories(true);\n  var labelEls = [];\n  var triggerEvent = axisModel.get('triggerEvent');\n  var z2Min = Infinity;\n  var z2Max = -Infinity;\n  each(labels, function (labelItem, index) {\n    var _a;\n    var tickValue = axis.scale.type === 'ordinal' ? axis.scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue;\n    var formattedLabel = labelItem.formattedLabel;\n    var rawLabel = labelItem.rawLabel;\n    var itemLabelModel = labelModel;\n    if (rawCategoryData && rawCategoryData[tickValue]) {\n      var rawCategoryItem = rawCategoryData[tickValue];\n      if (isObject(rawCategoryItem) && rawCategoryItem.textStyle) {\n        itemLabelModel = new Model(rawCategoryItem.textStyle, labelModel, axisModel.ecModel);\n      }\n    }\n    var textColor = itemLabelModel.getTextColor() || axisModel.get(['axisLine', 'lineStyle', 'color']);\n    var align = itemLabelModel.getShallow('align', true) || labelLayout.textAlign;\n    var alignMin = retrieve2(itemLabelModel.getShallow('alignMinLabel', true), align);\n    var alignMax = retrieve2(itemLabelModel.getShallow('alignMaxLabel', true), align);\n    var verticalAlign = itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign;\n    var verticalAlignMin = retrieve2(itemLabelModel.getShallow('verticalAlignMinLabel', true), verticalAlign);\n    var verticalAlignMax = retrieve2(itemLabelModel.getShallow('verticalAlignMaxLabel', true), verticalAlign);\n    var z2 = 10 + (((_a = labelItem.time) === null || _a === void 0 ? void 0 : _a.level) || 0);\n    z2Min = Math.min(z2Min, z2);\n    z2Max = Math.max(z2Max, z2);\n    var textEl = new graphic.Text({\n      // --- transform props start ---\n      // All of the transform props MUST not be set here, but should be set in\n      // `updateAxisLabelChangableProps`, because they may change in estimation,\n      // and need to calculate based on global coord sys by `decomposeTransform`.\n      x: 0,\n      y: 0,\n      rotation: 0,\n      // --- transform props end ---\n      silent: AxisBuilder.isLabelSilent(axisModel),\n      z2: z2,\n      style: createTextStyle(itemLabelModel, {\n        text: formattedLabel,\n        align: index === 0 ? alignMin : index === labels.length - 1 ? alignMax : align,\n        verticalAlign: index === 0 ? verticalAlignMin : index === labels.length - 1 ? verticalAlignMax : verticalAlign,\n        fill: isFunction(textColor) ? textColor(\n        // (1) In category axis with data zoom, tick is not the original\n        // index of axis.data. So tick should not be exposed to user\n        // in category axis.\n        // (2) Compatible with previous version, which always use formatted label as\n        // input. But in interval scale the formatted label is like '223,445', which\n        // maked user replace ','. So we modify it to return original val but remain\n        // it as 'string' to avoid error in replacing.\n        axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor\n      })\n    });\n    textEl.anid = 'label_' + tickValue;\n    var inner = getLabelInner(textEl);\n    inner[\"break\"] = labelItem[\"break\"];\n    inner.tickValue = tickValue;\n    inner.layoutRotation = labelLayout.rotation;\n    graphic.setTooltipConfig({\n      el: textEl,\n      componentModel: axisModel,\n      itemName: formattedLabel,\n      formatterParamsExtra: {\n        isTruncated: function () {\n          return textEl.isTruncated;\n        },\n        value: rawLabel,\n        tickIndex: index\n      }\n    });\n    // Pack data for mouse event\n    if (triggerEvent) {\n      var eventData = AxisBuilder.makeAxisEventDataBase(axisModel);\n      eventData.targetType = 'axisLabel';\n      eventData.value = rawLabel;\n      eventData.tickIndex = index;\n      if (labelItem[\"break\"]) {\n        eventData[\"break\"] = {\n          // type: labelItem.break.type,\n          start: labelItem[\"break\"].parsedBreak.vmin,\n          end: labelItem[\"break\"].parsedBreak.vmax\n        };\n      }\n      if (axis.type === 'category') {\n        eventData.dataIndex = tickValue;\n      }\n      getECData(textEl).eventData = eventData;\n      if (labelItem[\"break\"]) {\n        addBreakEventHandler(axisModel, api, textEl, labelItem[\"break\"]);\n      }\n    }\n    labelEls.push(textEl);\n    labelGroup.add(textEl);\n  });\n  var labelLayoutList = map(labelEls, function (label) {\n    return {\n      label: label,\n      priority: getLabelInner(label)[\"break\"] ? label.z2 + (z2Max - z2Min + 1) // Make break labels be highest priority.\n      : label.z2,\n      defaultAttr: {\n        ignore: label.ignore\n      }\n    };\n  });\n  axisLabelBuildResultSet(local, labelLayoutList, labelGroup, axisLabelCreationCtx);\n}\n// Indicate that `layOutAxisTickLabel` has been called.\nfunction axisLabelBuildResultExists(local) {\n  return !!local.labelLayoutList;\n}\nfunction axisLabelBuildResultSet(local, labelLayoutList, labelGroup, axisLabelsCreationContext) {\n  // Ensure the same lifetime.\n  local.labelLayoutList = labelLayoutList;\n  local.labelGroup = labelGroup;\n  local.axisLabelsCreationContext = axisLabelsCreationContext;\n}\nfunction updateAxisLabelChangableProps(cfg, axisModel, labelLayoutList, transformGroup) {\n  var labelMargin = axisModel.get(['axisLabel', 'margin']);\n  each(labelLayoutList, function (layout, idx) {\n    var geometry = ensureLabelLayoutWithGeometry(layout);\n    if (!geometry) {\n      return;\n    }\n    var labelEl = geometry.label;\n    var inner = getLabelInner(labelEl);\n    // See the comment in `suggestIgnore`.\n    geometry.suggestIgnore = labelEl.ignore;\n    // Currently no `ignore:true` is set in `buildAxisLabel`\n    // But `ignore:true` may be set subsequently for overlap handling, thus reset it here.\n    labelEl.ignore = false;\n    copyTransform(_tmpLayoutEl, _tmpLayoutElReset);\n    _tmpLayoutEl.x = axisModel.axis.dataToCoord(inner.tickValue);\n    _tmpLayoutEl.y = cfg.labelOffset + cfg.labelDirection * labelMargin;\n    _tmpLayoutEl.rotation = inner.layoutRotation;\n    transformGroup.add(_tmpLayoutEl);\n    _tmpLayoutEl.updateTransform();\n    transformGroup.remove(_tmpLayoutEl);\n    _tmpLayoutEl.decomposeTransform();\n    copyTransform(labelEl, _tmpLayoutEl);\n    labelEl.markRedraw();\n    setLabelLayoutDirty(geometry, true);\n    ensureLabelLayoutWithGeometry(geometry);\n  });\n}\nvar _tmpLayoutEl = new graphic.Rect();\nvar _tmpLayoutElReset = new graphic.Rect();\nfunction hasAxisName(axisName) {\n  return !!axisName;\n}\nfunction addBreakEventHandler(axisModel, api, textEl, visualBreak) {\n  textEl.on('click', function (params) {\n    var payload = {\n      type: AXIS_BREAK_EXPAND_ACTION_TYPE,\n      breaks: [{\n        start: visualBreak.parsedBreak.breakOption.start,\n        end: visualBreak.parsedBreak.breakOption.end\n      }]\n    };\n    payload[axisModel.axis.dim + \"AxisIndex\"] = axisModel.componentIndex;\n    api.dispatchAction(payload);\n  });\n}\nfunction adjustBreakLabels(axisModel, axisRotation, labelLayoutList) {\n  var scaleBreakHelper = getScaleBreakHelper();\n  if (!scaleBreakHelper) {\n    return;\n  }\n  var breakLabelIndexPairs = scaleBreakHelper.retrieveAxisBreakPairs(labelLayoutList, function (layoutInfo) {\n    return layoutInfo && getLabelInner(layoutInfo.label)[\"break\"];\n  }, true);\n  var moveOverlap = axisModel.get(['breakLabelLayout', 'moveOverlap'], true);\n  if (moveOverlap === true || moveOverlap === 'auto') {\n    each(breakLabelIndexPairs, function (idxPair) {\n      getAxisBreakHelper().adjustBreakLabelPair(axisModel.axis.inverse, axisRotation, [ensureLabelLayoutWithGeometry(labelLayoutList[idxPair[0]]), ensureLabelLayoutWithGeometry(labelLayoutList[idxPair[1]])]);\n    });\n  }\n}\nexport default AxisBuilder;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nimport AxisBuilder from '../../component/axis/AxisBuilder.js';\nimport { isIntervalOrLogScale } from '../../scale/helper.js';\n/**\n * [__CAUTION__]\n *  MUST guarantee: if only the input `rect` and `axis.extent` changed,\n *  only `layout.position` changes.\n *  This character is replied on `grid.contain` calculation in `AxisBuilder`.\n *  @see updateCartesianAxisViewCommonPartBuilder\n *\n * Can only be called after coordinate system creation stage.\n * (Can be called before coordinate system update stage).\n */\nexport function layout(rect, axisModel, opt) {\n  opt = opt || {};\n  var axis = axisModel.axis;\n  var layout = {};\n  var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0];\n  var rawAxisPosition = axis.position;\n  var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition;\n  var axisDim = axis.dim;\n  var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n  var idx = {\n    left: 0,\n    right: 1,\n    top: 0,\n    bottom: 1,\n    onZero: 2\n  };\n  var axisOffset = axisModel.get('offset') || 0;\n  var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset];\n  if (otherAxisOnZeroOf) {\n    var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0));\n    posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]);\n  }\n  // Axis position\n  layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]];\n  // Axis rotation\n  layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1);\n  // Tick and label direction, x y is axisDim\n  var dirMap = {\n    top: -1,\n    bottom: 1,\n    left: -1,\n    right: 1\n  };\n  layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition];\n  layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0;\n  if (axisModel.get(['axisTick', 'inside'])) {\n    layout.tickDirection = -layout.tickDirection;\n  }\n  if (zrUtil.retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) {\n    layout.labelDirection = -layout.labelDirection;\n  }\n  // Special label rotation\n  var labelRotate = axisModel.get(['axisLabel', 'rotate']);\n  layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate;\n  // Over splitLine and splitArea\n  layout.z2 = 1;\n  return layout;\n}\nexport function isCartesian2DDeclaredSeries(seriesModel) {\n  return seriesModel.get('coordinateSystem') === 'cartesian2d';\n}\n/**\n * Note: If pie (or other similar series) use cartesian2d, here\n *  option `seriesModel.get('coordinateSystem') === 'cartesian2d'`\n *  and `seriesModel.coordinateSystem !== cartesian2dCoordSysInstance`\n *  and `seriesModel.boxCoordinateSystem === cartesian2dCoordSysInstance`,\n *  the logic below is probably wrong, therefore skip it temporarily.\n */\nexport function isCartesian2DInjectedAsDataCoordSys(seriesModel) {\n  return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d';\n}\nexport function findAxisModels(seriesModel) {\n  var axisModelMap = {\n    xAxisModel: null,\n    yAxisModel: null\n  };\n  zrUtil.each(axisModelMap, function (v, key) {\n    var axisType = key.replace(/Model$/, '');\n    var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0];\n    if (process.env.NODE_ENV !== 'production') {\n      if (!axisModel) {\n        throw new Error(axisType + ' \"' + zrUtil.retrieve3(seriesModel.get(axisType + 'Index'), seriesModel.get(axisType + 'Id'), 0) + '\" not found');\n      }\n    }\n    axisModelMap[key] = axisModel;\n  });\n  return axisModelMap;\n}\nexport function createCartesianAxisViewCommonPartBuilder(gridRect, cartesians, axisModel, api, ctx, defaultNameMoveOverlap) {\n  var layoutResult = layout(gridRect, axisModel);\n  var axisLineAutoShow = false;\n  var axisTickAutoShow = false;\n  // Not show axisTick or axisLine if other axis is category / time\n  for (var i = 0; i < cartesians.length; i++) {\n    if (isIntervalOrLogScale(cartesians[i].getOtherAxis(axisModel.axis).scale)) {\n      // Still show axis tick or axisLine if other axis is value / log\n      axisLineAutoShow = axisTickAutoShow = true;\n      if (axisModel.axis.type === 'category' && axisModel.axis.onBand) {\n        axisTickAutoShow = false;\n      }\n    }\n  }\n  layoutResult.axisLineAutoShow = axisLineAutoShow;\n  layoutResult.axisTickAutoShow = axisTickAutoShow;\n  layoutResult.defaultNameMoveOverlap = defaultNameMoveOverlap;\n  return new AxisBuilder(axisModel, api, layoutResult, ctx);\n}\nexport function updateCartesianAxisViewCommonPartBuilder(axisBuilder, gridRect, axisModel) {\n  var newRaw = layout(gridRect, axisModel);\n  if (process.env.NODE_ENV !== 'production') {\n    var oldRaw_1 = axisBuilder.__getRawCfg();\n    zrUtil.each(zrUtil.keys(newRaw), function (prop) {\n      if (prop !== 'position' && prop !== 'labelOffset') {\n        zrUtil.assert(newRaw[prop] === oldRaw_1[prop]);\n      }\n    });\n  }\n  axisBuilder.updateCfg(newRaw);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { getPrecisionSafe, round } from '../util/number.js';\nimport IntervalScale from '../scale/Interval.js';\nimport { getScaleExtent, retrieveAxisBreaksOption } from './axisHelper.js';\nimport { warn } from '../util/log.js';\nimport { logTransform, increaseInterval, isValueNice } from '../scale/helper.js';\nexport function alignScaleTicks(scale, axisModel, alignToScale) {\n  var _a;\n  var intervalScaleProto = IntervalScale.prototype;\n  // NOTE: There is a precondition for log scale  here:\n  // In log scale we store _interval and _extent of exponent value.\n  // So if we use the method of InternalScale to set/get these data.\n  // It process the exponent value, which is linear and what we want here.\n  var alignToTicks = intervalScaleProto.getTicks.call(alignToScale);\n  var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, {\n    expandToNicedExtent: true\n  });\n  var alignToSplitNumber = alignToTicks.length - 1;\n  var alignToInterval = intervalScaleProto.getInterval.call(alignToScale);\n  var scaleExtent = getScaleExtent(scale, axisModel);\n  var rawExtent = scaleExtent.extent;\n  var isMinFixed = scaleExtent.fixMin;\n  var isMaxFixed = scaleExtent.fixMax;\n  if (scale.type === 'log') {\n    rawExtent = logTransform(scale.base, rawExtent, true);\n  }\n  scale.setBreaksFromOption(retrieveAxisBreaksOption(axisModel));\n  scale.setExtent(rawExtent[0], rawExtent[1]);\n  scale.calcNiceExtent({\n    splitNumber: alignToSplitNumber,\n    fixMin: isMinFixed,\n    fixMax: isMaxFixed\n  });\n  var extent = intervalScaleProto.getExtent.call(scale);\n  // Need to update the rawExtent.\n  // Because value in rawExtent may be not parsed. e.g. 'dataMin', 'dataMax'\n  if (isMinFixed) {\n    rawExtent[0] = extent[0];\n  }\n  if (isMaxFixed) {\n    rawExtent[1] = extent[1];\n  }\n  var interval = intervalScaleProto.getInterval.call(scale);\n  var min = rawExtent[0];\n  var max = rawExtent[1];\n  if (isMinFixed && isMaxFixed) {\n    // User set min, max, divide to get new interval\n    interval = (max - min) / alignToSplitNumber;\n  } else if (isMinFixed) {\n    max = rawExtent[0] + interval * alignToSplitNumber;\n    // User set min, expand extent on the other side\n    while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) {\n      interval = increaseInterval(interval);\n      max = rawExtent[0] + interval * alignToSplitNumber;\n    }\n  } else if (isMaxFixed) {\n    // User set max, expand extent on the other side\n    min = rawExtent[1] - interval * alignToSplitNumber;\n    while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) {\n      interval = increaseInterval(interval);\n      min = rawExtent[1] - interval * alignToSplitNumber;\n    }\n  } else {\n    var nicedSplitNumber = scale.getTicks().length - 1;\n    if (nicedSplitNumber > alignToSplitNumber) {\n      interval = increaseInterval(interval);\n    }\n    var range = interval * alignToSplitNumber;\n    max = Math.ceil(rawExtent[1] / interval) * interval;\n    min = round(max - range);\n    // Not change the result that crossing zero.\n    if (min < 0 && rawExtent[0] >= 0) {\n      min = 0;\n      max = round(range);\n    } else if (max > 0 && rawExtent[1] <= 0) {\n      max = 0;\n      min = -round(range);\n    }\n  }\n  // Adjust min, max based on the extent of alignTo. When min or max is set in alignTo scale\n  var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval;\n  var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval;\n  // NOTE: Must in setExtent -> setInterval -> setNiceExtent order.\n  intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1);\n  intervalScaleProto.setInterval.call(scale, interval);\n  if (t0 || t1) {\n    intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval);\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    var ticks = intervalScaleProto.getTicks.call(scale);\n    if (ticks[1] && (!isValueNice(interval) || getPrecisionSafe(ticks[1].value) > getPrecisionSafe(interval))) {\n      warn(\"The ticks may be not readable when set min: \" + axisModel.get('min') + \", max: \" + axisModel.get('max') + (\" and alignTicks: true. (\" + ((_a = axisModel.axis) === null || _a === void 0 ? void 0 : _a.dim) + \"AxisIndex: \" + axisModel.componentIndex + \")\"), true);\n    }\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Grid is a region which contains at most 4 cartesian systems\n *\n * TODO Default cartesian\n */\nimport { isObject, each, indexOf, retrieve3, keys, assert, eqNaN, find, retrieve2 } from 'zrender/lib/core/util.js';\nimport { createBoxLayoutReference, getLayoutRect } from '../../util/layout.js';\nimport { createScaleByModel, ifAxisCrossZero, niceScaleExtent, getDataDimensionsOnAxis, isNameLocationCenter, shouldAxisShow } from '../../coord/axisHelper.js';\nimport Cartesian2D, { cartesian2DDimensions } from './Cartesian2D.js';\nimport Axis2D from './Axis2D.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\n// Depends on GridModel, AxisModel, which performs preprocess.\nimport { OUTER_BOUNDS_CLAMP_DEFAULT, OUTER_BOUNDS_DEFAULT } from './GridModel.js';\nimport { findAxisModels, createCartesianAxisViewCommonPartBuilder, updateCartesianAxisViewCommonPartBuilder, isCartesian2DInjectedAsDataCoordSys } from './cartesianAxisHelper.js';\nimport { isIntervalOrLogScale } from '../../scale/helper.js';\nimport { alignScaleTicks } from '../axisAlignTicks.js';\nimport { expandOrShrinkRect, WH, XY } from '../../util/graphic.js';\nimport { AxisBuilderSharedContext, resolveAxisNameOverlapDefault, moveIfOverlapByLinearLabels, getLabelInner } from '../../component/axis/AxisBuilder.js';\nimport { error, log } from '../../util/log.js';\nimport { AxisTickLabelComputingKind } from '../axisTickLabelBuilder.js';\nimport { injectCoordSysByOption } from '../../core/CoordinateSystem.js';\nimport { mathMax, parsePositionSizeOption } from '../../util/number.js';\n// margin is [top, right, bottom, left]\nvar XY_TO_MARGIN_IDX = [[3, 1], [0, 2] // xyIdx 1 => 'y'\n];\nvar Grid = /** @class */function () {\n  function Grid(gridModel, ecModel, api) {\n    // FIXME:TS where used (different from registered type 'cartesian2d')?\n    this.type = 'grid';\n    this._coordsMap = {};\n    this._coordsList = [];\n    this._axesMap = {};\n    this._axesList = [];\n    this.axisPointerEnabled = true;\n    this.dimensions = cartesian2DDimensions;\n    this._initCartesian(gridModel, ecModel, api);\n    this.model = gridModel;\n  }\n  Grid.prototype.getRect = function () {\n    return this._rect;\n  };\n  Grid.prototype.update = function (ecModel, api) {\n    var axesMap = this._axesMap;\n    this._updateScale(ecModel, this.model);\n    function updateAxisTicks(axes) {\n      var alignTo;\n      // Axis is added in order of axisIndex.\n      var axesIndices = keys(axes);\n      var len = axesIndices.length;\n      if (!len) {\n        return;\n      }\n      var axisNeedsAlign = [];\n      // Process once and calculate the ticks for those don't use alignTicks.\n      for (var i = len - 1; i >= 0; i--) {\n        var idx = +axesIndices[i]; // Convert to number.\n        var axis = axes[idx];\n        var model = axis.model;\n        var scale = axis.scale;\n        if (\n        // Only value and log axis without interval support alignTicks.\n        isIntervalOrLogScale(scale) && model.get('alignTicks') && model.get('interval') == null) {\n          axisNeedsAlign.push(axis);\n        } else {\n          niceScaleExtent(scale, model);\n          if (isIntervalOrLogScale(scale)) {\n            // Can only align to interval or log axis.\n            alignTo = axis;\n          }\n        }\n      }\n      ;\n      // All axes has set alignTicks. Pick the first one.\n      // PENDING. Should we find the axis that both set interval, min, max and align to this one?\n      if (axisNeedsAlign.length) {\n        if (!alignTo) {\n          alignTo = axisNeedsAlign.pop();\n          niceScaleExtent(alignTo.scale, alignTo.model);\n        }\n        each(axisNeedsAlign, function (axis) {\n          alignScaleTicks(axis.scale, axis.model, alignTo.scale);\n        });\n      }\n    }\n    updateAxisTicks(axesMap.x);\n    updateAxisTicks(axesMap.y);\n    // Key: axisDim_axisIndex, value: boolean, whether onZero target.\n    var onZeroRecords = {};\n    each(axesMap.x, function (xAxis) {\n      fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords);\n    });\n    each(axesMap.y, function (yAxis) {\n      fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords);\n    });\n    // Resize again if containLabel is enabled\n    // FIXME It may cause getting wrong grid size in data processing stage\n    this.resize(this.model, api);\n  };\n  /**\n   * Resize the grid.\n   *\n   * [NOTE]\n   * If both \"grid.containLabel/grid.contain\" and pixel-required-data-processing (such as, \"dataSampling\")\n   * exist, circular dependency occurs in logic.\n   * The final compromised sequence is:\n   *  1. Calculate \"axis.extent\" (pixel extent) and AffineTransform based on only \"grid layout options\".\n   *      Not accurate if \"grid.containLabel/grid.contain\" is required, but it is a compromise to avoid\n   *      circular dependency.\n   *  2. Perform \"series data processing\" (where \"dataSampling\" requires \"axis.extent\").\n   *  3. Calculate \"scale.extent\" (data extent) based on \"processed series data\".\n   *  4. Modify \"axis.extent\" for \"grid.containLabel/grid.contain\":\n   *      4.1. Calculate \"axis labels\" based on \"scale.extent\".\n   *      4.2. Modify \"axis.extent\" by the bounding rects of \"axis labels and names\".\n   */\n  Grid.prototype.resize = function (gridModel, api, beforeDataProcessing) {\n    var layoutRef = createBoxLayoutReference(gridModel, api);\n    var gridRect = this._rect = getLayoutRect(gridModel.getBoxLayoutParams(), layoutRef.refContainer);\n    // PENDING: whether to support that if the input `coord` is out of the base coord sys,\n    //  do not render anything. At present, the behavior is undefined.\n    var axesMap = this._axesMap;\n    var coordsList = this._coordsList;\n    var optionContainLabel = gridModel.get('containLabel'); // No `.get(, true)` for backward compat.\n    updateAllAxisExtentTransByGridRect(axesMap, gridRect);\n    if (!beforeDataProcessing) {\n      var axisBuilderSharedCtx = createAxisBiulders(gridRect, coordsList, axesMap, optionContainLabel, api);\n      var noPxChange = void 0;\n      if (optionContainLabel) {\n        if (legacyLayOutGridByContainLabel) {\n          // console.time('legacyLayOutGridByContainLabel');\n          legacyLayOutGridByContainLabel(this._axesList, gridRect);\n          updateAllAxisExtentTransByGridRect(axesMap, gridRect);\n          // console.timeEnd('legacyLayOutGridByContainLabel');\n        } else {\n          if (process.env.NODE_ENV !== 'production') {\n            log('Specified `grid.containLabel` but no `use(LegacyGridContainLabel)`;' + 'use `grid.outerBounds` instead.', true);\n          }\n          noPxChange = layOutGridByOuterBounds(gridRect.clone(), 'axisLabel', null, gridRect, axesMap, axisBuilderSharedCtx, layoutRef);\n        }\n      } else {\n        var _a = prepareOuterBounds(gridModel, gridRect, layoutRef),\n          outerBoundsRect = _a.outerBoundsRect,\n          parsedOuterBoundsContain = _a.parsedOuterBoundsContain,\n          outerBoundsClamp = _a.outerBoundsClamp;\n        if (outerBoundsRect) {\n          // console.time('layOutGridByOuterBounds');\n          noPxChange = layOutGridByOuterBounds(outerBoundsRect, parsedOuterBoundsContain, outerBoundsClamp, gridRect, axesMap, axisBuilderSharedCtx, layoutRef);\n          // console.timeEnd('layOutGridByOuterBounds');\n        }\n      }\n      // console.time('buildAxesView_determine');\n      createOrUpdateAxesView(gridRect, axesMap, AxisTickLabelComputingKind.determine, null, noPxChange, layoutRef);\n      // console.timeEnd('buildAxesView_determine');\n    } // End of beforeDataProcessing\n    each(this._coordsList, function (coord) {\n      // Calculate affine matrix to accelerate the data to point transform.\n      // If all the axes scales are time or value.\n      coord.calcAffineTransform();\n    });\n  };\n  Grid.prototype.getAxis = function (dim, axisIndex) {\n    var axesMapOnDim = this._axesMap[dim];\n    if (axesMapOnDim != null) {\n      return axesMapOnDim[axisIndex || 0];\n    }\n  };\n  Grid.prototype.getAxes = function () {\n    return this._axesList.slice();\n  };\n  Grid.prototype.getCartesian = function (xAxisIndex, yAxisIndex) {\n    if (xAxisIndex != null && yAxisIndex != null) {\n      var key = 'x' + xAxisIndex + 'y' + yAxisIndex;\n      return this._coordsMap[key];\n    }\n    if (isObject(xAxisIndex)) {\n      yAxisIndex = xAxisIndex.yAxisIndex;\n      xAxisIndex = xAxisIndex.xAxisIndex;\n    }\n    for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) {\n      if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) {\n        return coordList[i];\n      }\n    }\n  };\n  Grid.prototype.getCartesians = function () {\n    return this._coordsList.slice();\n  };\n  /**\n   * @implements\n   */\n  Grid.prototype.convertToPixel = function (ecModel, finder, value) {\n    var target = this._findConvertTarget(finder);\n    return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null;\n  };\n  /**\n   * @implements\n   */\n  Grid.prototype.convertFromPixel = function (ecModel, finder, value) {\n    var target = this._findConvertTarget(finder);\n    return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null;\n  };\n  Grid.prototype._findConvertTarget = function (finder) {\n    var seriesModel = finder.seriesModel;\n    var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis', SINGLE_REFERRING).models[0];\n    var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis', SINGLE_REFERRING).models[0];\n    var gridModel = finder.gridModel;\n    var coordsList = this._coordsList;\n    var cartesian;\n    var axis;\n    if (seriesModel) {\n      cartesian = seriesModel.coordinateSystem;\n      indexOf(coordsList, cartesian) < 0 && (cartesian = null);\n    } else if (xAxisModel && yAxisModel) {\n      cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n    } else if (xAxisModel) {\n      axis = this.getAxis('x', xAxisModel.componentIndex);\n    } else if (yAxisModel) {\n      axis = this.getAxis('y', yAxisModel.componentIndex);\n    }\n    // Lowest priority.\n    else if (gridModel) {\n      var grid = gridModel.coordinateSystem;\n      if (grid === this) {\n        cartesian = this._coordsList[0];\n      }\n    }\n    return {\n      cartesian: cartesian,\n      axis: axis\n    };\n  };\n  /**\n   * @implements\n   */\n  Grid.prototype.containPoint = function (point) {\n    var coord = this._coordsList[0];\n    if (coord) {\n      return coord.containPoint(point);\n    }\n  };\n  /**\n   * Initialize cartesian coordinate systems\n   */\n  Grid.prototype._initCartesian = function (gridModel, ecModel, api) {\n    var _this = this;\n    var grid = this;\n    var axisPositionUsed = {\n      left: false,\n      right: false,\n      top: false,\n      bottom: false\n    };\n    var axesMap = {\n      x: {},\n      y: {}\n    };\n    var axesCount = {\n      x: 0,\n      y: 0\n    };\n    // Create axis\n    ecModel.eachComponent('xAxis', createAxisCreator('x'), this);\n    ecModel.eachComponent('yAxis', createAxisCreator('y'), this);\n    if (!axesCount.x || !axesCount.y) {\n      // Roll back when there no either x or y axis\n      this._axesMap = {};\n      this._axesList = [];\n      return;\n    }\n    this._axesMap = axesMap;\n    // Create cartesian2d\n    each(axesMap.x, function (xAxis, xAxisIndex) {\n      each(axesMap.y, function (yAxis, yAxisIndex) {\n        var key = 'x' + xAxisIndex + 'y' + yAxisIndex;\n        var cartesian = new Cartesian2D(key);\n        cartesian.master = _this;\n        cartesian.model = gridModel;\n        _this._coordsMap[key] = cartesian;\n        _this._coordsList.push(cartesian);\n        cartesian.addAxis(xAxis);\n        cartesian.addAxis(yAxis);\n      });\n    });\n    function createAxisCreator(dimName) {\n      return function (axisModel, idx) {\n        if (!isAxisUsedInTheGrid(axisModel, gridModel)) {\n          return;\n        }\n        var axisPosition = axisModel.get('position');\n        if (dimName === 'x') {\n          // Fix position\n          if (axisPosition !== 'top' && axisPosition !== 'bottom') {\n            // Default bottom of X\n            axisPosition = axisPositionUsed.bottom ? 'top' : 'bottom';\n          }\n        } else {\n          // Fix position\n          if (axisPosition !== 'left' && axisPosition !== 'right') {\n            // Default left of Y\n            axisPosition = axisPositionUsed.left ? 'right' : 'left';\n          }\n        }\n        axisPositionUsed[axisPosition] = true;\n        var axis = new Axis2D(dimName, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition);\n        var isCategory = axis.type === 'category';\n        axis.onBand = isCategory && axisModel.get('boundaryGap');\n        axis.inverse = axisModel.get('inverse');\n        // Inject axis into axisModel\n        axisModel.axis = axis;\n        // Inject axisModel into axis\n        axis.model = axisModel;\n        // Inject grid info axis\n        axis.grid = grid;\n        // Index of axis, can be used as key\n        axis.index = idx;\n        grid._axesList.push(axis);\n        axesMap[dimName][idx] = axis;\n        axesCount[dimName]++;\n      };\n    }\n  };\n  /**\n   * Update cartesian properties from series.\n   */\n  Grid.prototype._updateScale = function (ecModel, gridModel) {\n    // Reset scale\n    each(this._axesList, function (axis) {\n      axis.scale.setExtent(Infinity, -Infinity);\n      if (axis.type === 'category') {\n        var categorySortInfo = axis.model.get('categorySortInfo');\n        axis.scale.setSortInfo(categorySortInfo);\n      }\n    });\n    ecModel.eachSeries(function (seriesModel) {\n      // If pie (or other similar series) use cartesian2d, the unionExtent logic below is\n      // wrong, therefore skip it temporarily. See also in `defaultAxisExtentFromData.ts`.\n      // TODO: support union extent in this case.\n      if (isCartesian2DInjectedAsDataCoordSys(seriesModel)) {\n        var axesModelMap = findAxisModels(seriesModel);\n        var xAxisModel = axesModelMap.xAxisModel;\n        var yAxisModel = axesModelMap.yAxisModel;\n        if (!isAxisUsedInTheGrid(xAxisModel, gridModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel)) {\n          return;\n        }\n        var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n        var data = seriesModel.getData();\n        var xAxis = cartesian.getAxis('x');\n        var yAxis = cartesian.getAxis('y');\n        unionExtent(data, xAxis);\n        unionExtent(data, yAxis);\n      }\n    }, this);\n    function unionExtent(data, axis) {\n      each(getDataDimensionsOnAxis(data, axis.dim), function (dim) {\n        axis.scale.unionExtentFromData(data, dim);\n      });\n    }\n  };\n  /**\n   * @param dim 'x' or 'y' or 'auto' or null/undefined\n   */\n  Grid.prototype.getTooltipAxes = function (dim) {\n    var baseAxes = [];\n    var otherAxes = [];\n    each(this.getCartesians(), function (cartesian) {\n      var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis();\n      var otherAxis = cartesian.getOtherAxis(baseAxis);\n      indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis);\n      indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis);\n    });\n    return {\n      baseAxes: baseAxes,\n      otherAxes: otherAxes\n    };\n  };\n  Grid.create = function (ecModel, api) {\n    var grids = [];\n    ecModel.eachComponent('grid', function (gridModel, idx) {\n      var grid = new Grid(gridModel, ecModel, api);\n      grid.name = 'grid_' + idx;\n      // dataSampling requires axis extent, so resize\n      // should be performed in create stage.\n      grid.resize(gridModel, api, true);\n      gridModel.coordinateSystem = grid;\n      grids.push(grid);\n    });\n    // Inject the coordinateSystems into seriesModel\n    ecModel.eachSeries(function (seriesModel) {\n      injectCoordSysByOption({\n        targetModel: seriesModel,\n        coordSysType: 'cartesian2d',\n        coordSysProvider: coordSysProvider\n      });\n      function coordSysProvider() {\n        var axesModelMap = findAxisModels(seriesModel);\n        var xAxisModel = axesModelMap.xAxisModel;\n        var yAxisModel = axesModelMap.yAxisModel;\n        var gridModel = xAxisModel.getCoordSysModel();\n        if (process.env.NODE_ENV !== 'production') {\n          if (!gridModel) {\n            throw new Error('Grid \"' + retrieve3(xAxisModel.get('gridIndex'), xAxisModel.get('gridId'), 0) + '\" not found');\n          }\n          if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) {\n            throw new Error('xAxis and yAxis must use the same grid');\n          }\n        }\n        var grid = gridModel.coordinateSystem;\n        return grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);\n      }\n    });\n    return grids;\n  };\n  // For deciding which dimensions to use when creating list data\n  Grid.dimensions = cartesian2DDimensions;\n  return Grid;\n}();\n/**\n * Check if the axis is used in the specified grid.\n */\nfunction isAxisUsedInTheGrid(axisModel, gridModel) {\n  return axisModel.getCoordSysModel() === gridModel;\n}\nfunction fixAxisOnZero(axesMap, otherAxisDim, axis,\n// Key: see `getOnZeroRecordKey`\nonZeroRecords) {\n  axis.getAxesOnZeroOf = function () {\n    // TODO: onZero of multiple axes.\n    return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : [];\n  };\n  // onZero can not be enabled in these two situations:\n  // 1. When any other axis is a category axis.\n  // 2. When no axis is cross 0 point.\n  var otherAxes = axesMap[otherAxisDim];\n  var otherAxisOnZeroOf;\n  var axisModel = axis.model;\n  var onZero = axisModel.get(['axisLine', 'onZero']);\n  var onZeroAxisIndex = axisModel.get(['axisLine', 'onZeroAxisIndex']);\n  if (!onZero) {\n    return;\n  }\n  // If target axis is specified.\n  if (onZeroAxisIndex != null) {\n    if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) {\n      otherAxisOnZeroOf = otherAxes[onZeroAxisIndex];\n    }\n  } else {\n    // Find the first available other axis.\n    for (var idx in otherAxes) {\n      if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx])\n      // Consider that two Y axes on one value axis,\n      // if both onZero, the two Y axes overlap.\n      && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) {\n        otherAxisOnZeroOf = otherAxes[idx];\n        break;\n      }\n    }\n  }\n  if (otherAxisOnZeroOf) {\n    onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true;\n  }\n  function getOnZeroRecordKey(axis) {\n    return axis.dim + '_' + axis.index;\n  }\n}\nfunction canOnZeroToAxis(axis) {\n  return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis);\n}\nfunction updateAxisTransform(axis, coordBase) {\n  var axisExtent = axis.getExtent();\n  var axisExtentSum = axisExtent[0] + axisExtent[1];\n  // Fast transform\n  axis.toGlobalCoord = axis.dim === 'x' ? function (coord) {\n    return coord + coordBase;\n  } : function (coord) {\n    return axisExtentSum - coord + coordBase;\n  };\n  axis.toLocalCoord = axis.dim === 'x' ? function (coord) {\n    return coord - coordBase;\n  } : function (coord) {\n    return axisExtentSum - coord + coordBase;\n  };\n}\nfunction updateAllAxisExtentTransByGridRect(axesMap, gridRect) {\n  each(axesMap.x, function (axis) {\n    return updateAxisExtentTransByGridRect(axis, gridRect.x, gridRect.width);\n  });\n  each(axesMap.y, function (axis) {\n    return updateAxisExtentTransByGridRect(axis, gridRect.y, gridRect.height);\n  });\n}\nfunction updateAxisExtentTransByGridRect(axis, gridXY, gridWH) {\n  var extent = [0, gridWH];\n  var idx = axis.inverse ? 1 : 0;\n  axis.setExtent(extent[idx], extent[1 - idx]);\n  updateAxisTransform(axis, gridXY);\n}\nvar legacyLayOutGridByContainLabel;\nexport function registerLegacyGridContainLabelImpl(impl) {\n  legacyLayOutGridByContainLabel = impl;\n}\n// Return noPxChange.\nfunction layOutGridByOuterBounds(outerBoundsRect, outerBoundsContain, outerBoundsClamp, gridRect, axesMap, axisBuilderSharedCtx, layoutRef) {\n  if (process.env.NODE_ENV !== 'production') {\n    assert(outerBoundsContain === 'all' || outerBoundsContain === 'axisLabel');\n  }\n  // Assume `updateAllAxisExtentTransByGridRect` has been performed once before this call.\n  // [NOTE]:\n  // - The bounding rect of the axis elements might be sensitve to variations in `axis.extent` due to strategies\n  //  like hideOverlap/moveOverlap. @see the comment in `LabelLayoutBase['suggestIgnore']`.\n  // - The final `gridRect` might be slightly smaller than the ideally expected result if labels are giant and\n  //  get hidden due to overlapping. More iterations could improve precision, but not performant. We consider\n  //  the current result acceptable, since no alignment among charts can be guaranteed when using this feature.\n  createOrUpdateAxesView(gridRect, axesMap, AxisTickLabelComputingKind.estimate, outerBoundsContain, false, layoutRef);\n  var margin = [0, 0, 0, 0];\n  fillLabelNameOverflowOnOneDimension(0);\n  fillLabelNameOverflowOnOneDimension(1);\n  // If axis is blank, no label can be used to detect overflow.\n  // gridRect itself should not overflow.\n  fillMarginOnOneDimension(gridRect, 0, NaN);\n  fillMarginOnOneDimension(gridRect, 1, NaN);\n  var noPxChange = find(margin, function (item) {\n    return item > 0;\n  }) == null;\n  expandOrShrinkRect(gridRect, margin, true, true, outerBoundsClamp);\n  updateAllAxisExtentTransByGridRect(axesMap, gridRect);\n  return noPxChange;\n  function fillLabelNameOverflowOnOneDimension(xyIdx) {\n    each(axesMap[XY[xyIdx]], function (axis) {\n      if (!shouldAxisShow(axis.model)) {\n        return;\n      }\n      // FIXME: zr Group.union may wrongly union (0, 0, 0, 0) and not performant.\n      // unionRect.union(axis.axisBuilder.group.getBoundingRect());\n      // If ussing Group.getBoundingRect to calculate shrink space, it is not strictly accurate when\n      // the outermost label is ignored and the secondary label is very long and contribute to the\n      // union extension:\n      //      -|---|---|---|\n      //         1,000,000,000\n      // Therefore we calculate them one by one.\n      // Also considered axis may be blank or no labels.\n      var sharedRecord = axisBuilderSharedCtx.ensureRecord(axis.model);\n      var labelInfoList = sharedRecord.labelInfoList;\n      if (labelInfoList) {\n        for (var idx = 0; idx < labelInfoList.length; idx++) {\n          var labelInfo = labelInfoList[idx];\n          var proportion = axis.scale.normalize(getLabelInner(labelInfo.label).tickValue);\n          proportion = xyIdx === 1 ? 1 - proportion : proportion;\n          // xAxis use proportion on x, yAxis use proprotion on y, otherwise not.\n          fillMarginOnOneDimension(labelInfo.rect, xyIdx, proportion);\n          fillMarginOnOneDimension(labelInfo.rect, 1 - xyIdx, NaN);\n        }\n      }\n      var nameLayout = sharedRecord.nameLayout;\n      if (nameLayout) {\n        var proportion = isNameLocationCenter(sharedRecord.nameLocation) ? 0.5 : NaN;\n        fillMarginOnOneDimension(nameLayout.rect, xyIdx, proportion);\n        fillMarginOnOneDimension(nameLayout.rect, 1 - xyIdx, NaN);\n      }\n    });\n  }\n  function fillMarginOnOneDimension(itemRect, xyIdx, proportion // NaN mean no use proportion\n  ) {\n    var overflow1 = outerBoundsRect[XY[xyIdx]] - itemRect[XY[xyIdx]];\n    var overflow2 = itemRect[WH[xyIdx]] + itemRect[XY[xyIdx]] - (outerBoundsRect[WH[xyIdx]] + outerBoundsRect[XY[xyIdx]]);\n    overflow1 = applyProportion(overflow1, 1 - proportion);\n    overflow2 = applyProportion(overflow2, proportion);\n    var minIdx = XY_TO_MARGIN_IDX[xyIdx][0];\n    var maxIdx = XY_TO_MARGIN_IDX[xyIdx][1];\n    margin[minIdx] = mathMax(margin[minIdx], overflow1);\n    margin[maxIdx] = mathMax(margin[maxIdx], overflow2);\n  }\n  function applyProportion(overflow, proportion) {\n    // proportion is not likely to near zero. If so, give up shrink\n    if (overflow > 0 && !eqNaN(proportion) && proportion > 1e-4) {\n      overflow /= proportion;\n    }\n    return overflow;\n  }\n}\nfunction createAxisBiulders(gridRect, cartesians, axesMap, optionContainLabel, api) {\n  var axisBuilderSharedCtx = new AxisBuilderSharedContext(resolveAxisNameOverlapForGrid);\n  each(axesMap, function (axisList) {\n    return each(axisList, function (axis) {\n      if (shouldAxisShow(axis.model)) {\n        // See `AxisBaseOptionCommon['nameMoveOverlap']`.\n        var defaultNameMoveOverlap = !optionContainLabel;\n        axis.axisBuilder = createCartesianAxisViewCommonPartBuilder(gridRect, cartesians, axis.model, api, axisBuilderSharedCtx, defaultNameMoveOverlap);\n      }\n    });\n  });\n  return axisBuilderSharedCtx;\n}\n/**\n * Promote the axis-elements-building from \"view render\" stage to \"coordinate system resize\" stage.\n * This is aimed to resovle overlap across multiple axes, since currently it's hard to reconcile\n * multiple axes in \"view render\" stage.\n *\n * [CAUTION] But this promotion assumes that the subsequent \"visual mapping\" stage does not affect\n * this axis-elements-building; otherwise we have to refactor it again.\n */\nfunction createOrUpdateAxesView(gridRect, axesMap, kind, outerBoundsContain, noPxChange, layoutRef) {\n  var isDetermine = kind === AxisTickLabelComputingKind.determine;\n  each(axesMap, function (axisList) {\n    return each(axisList, function (axis) {\n      if (shouldAxisShow(axis.model)) {\n        updateCartesianAxisViewCommonPartBuilder(axis.axisBuilder, gridRect, axis.model);\n        axis.axisBuilder.build(isDetermine ? {\n          axisTickLabelDetermine: true\n        } : {\n          axisTickLabelEstimate: true\n        }, {\n          noPxChange: noPxChange\n        });\n      }\n    });\n  });\n  var nameMarginLevelMap = {\n    x: 0,\n    y: 0\n  };\n  calcNameMarginLevel(0);\n  calcNameMarginLevel(1);\n  function calcNameMarginLevel(xyIdx) {\n    nameMarginLevelMap[XY[1 - xyIdx]] = gridRect[WH[xyIdx]] <= layoutRef.refContainer[WH[xyIdx]] * 0.5 ? 0 : 1 - xyIdx === 1 ? 2 : 1;\n  }\n  each(axesMap, function (axisList, xy) {\n    return each(axisList, function (axis) {\n      if (shouldAxisShow(axis.model)) {\n        if (outerBoundsContain === 'all' || isDetermine) {\n          // To resolve overlap, `axisName` layout depends on `axisTickLabel` layout result\n          // (all of the axes of the same `grid`; consider multiple x or y axes).\n          axis.axisBuilder.build({\n            axisName: true\n          }, {\n            nameMarginLevel: nameMarginLevelMap[xy]\n          });\n        }\n        if (isDetermine) {\n          axis.axisBuilder.build({\n            axisLine: true\n          });\n        }\n      }\n    });\n  });\n}\nfunction prepareOuterBounds(gridModel, rawRridRect, layoutRef) {\n  var outerBoundsRect;\n  var optionOuterBoundsMode = gridModel.get('outerBoundsMode', true);\n  if (optionOuterBoundsMode === 'same') {\n    outerBoundsRect = rawRridRect.clone();\n  } else if (optionOuterBoundsMode == null || optionOuterBoundsMode === 'auto') {\n    outerBoundsRect = getLayoutRect(gridModel.get('outerBounds', true) || OUTER_BOUNDS_DEFAULT, layoutRef.refContainer);\n  } else if (optionOuterBoundsMode !== 'none') {\n    if (process.env.NODE_ENV !== 'production') {\n      error(\"Invalid grid[\" + gridModel.componentIndex + \"].outerBoundsMode.\");\n    }\n  }\n  var optionOuterBoundsContain = gridModel.get('outerBoundsContain', true);\n  var parsedOuterBoundsContain;\n  if (optionOuterBoundsContain == null || optionOuterBoundsContain === 'auto') {\n    parsedOuterBoundsContain = 'all';\n  } else if (indexOf(['all', 'axisLabel'], optionOuterBoundsContain) < 0) {\n    if (process.env.NODE_ENV !== 'production') {\n      error(\"Invalid grid[\" + gridModel.componentIndex + \"].outerBoundsContain.\");\n    }\n    parsedOuterBoundsContain = 'all';\n  } else {\n    parsedOuterBoundsContain = optionOuterBoundsContain;\n  }\n  var outerBoundsClamp = [parsePositionSizeOption(retrieve2(gridModel.get('outerBoundsClampWidth', true), OUTER_BOUNDS_CLAMP_DEFAULT[0]), rawRridRect.width), parsePositionSizeOption(retrieve2(gridModel.get('outerBoundsClampHeight', true), OUTER_BOUNDS_CLAMP_DEFAULT[1]), rawRridRect.height)];\n  return {\n    outerBoundsRect: outerBoundsRect,\n    parsedOuterBoundsContain: parsedOuterBoundsContain,\n    outerBoundsClamp: outerBoundsClamp\n  };\n}\nvar resolveAxisNameOverlapForGrid = function (cfg, ctx, axisModel, nameLayoutInfo, nameMoveDirVec, thisRecord) {\n  var perpendicularDim = axisModel.axis.dim === 'x' ? 'y' : 'x';\n  resolveAxisNameOverlapDefault(cfg, ctx, axisModel, nameLayoutInfo, nameMoveDirVec, thisRecord);\n  // If nameLocation 'center', and there are multiple axes parallel to this axis, do not adjust by\n  //  other axes, because the axis name should be close to its axis line as much as possible even\n  //  if overlapping; otherwise it might cause misleading.\n  // If nameLocation 'center', do not adjust by perpendicular axes, since they are not likely to overlap.\n  // If nameLocation 'start'/'end', move name within the same direction to escape overlap with the\n  //  perpendicular axes.\n  if (!isNameLocationCenter(cfg.nameLocation)) {\n    each(ctx.recordMap[perpendicularDim], function (perpenRecord) {\n      // perpendicular axis may be no name.\n      if (perpenRecord && perpenRecord.labelInfoList && perpenRecord.dirVec) {\n        moveIfOverlapByLinearLabels(perpenRecord.labelInfoList, perpenRecord.dirVec, nameLayoutInfo, nameMoveDirVec);\n      }\n    });\n  }\n};\nexport default Grid;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport Model from '../../model/Model.js';\nimport { each, curry, clone, defaults, isArray, indexOf } from 'zrender/lib/core/util.js';\n// Build axisPointerModel, mergin tooltip.axisPointer model for each axis.\n// allAxesInfo should be updated when setOption performed.\nexport function collect(ecModel, api) {\n  var result = {\n    /**\n     * key: makeKey(axis.model)\n     * value: {\n     *      axis,\n     *      coordSys,\n     *      axisPointerModel,\n     *      triggerTooltip,\n     *      triggerEmphasis,\n     *      involveSeries,\n     *      snap,\n     *      seriesModels,\n     *      seriesDataCount\n     * }\n     */\n    axesInfo: {},\n    seriesInvolved: false,\n    /**\n     * key: makeKey(coordSys.model)\n     * value: Object: key makeKey(axis.model), value: axisInfo\n     */\n    coordSysAxesInfo: {},\n    coordSysMap: {}\n  };\n  collectAxesInfo(result, ecModel, api);\n  // Check seriesInvolved for performance, in case too many series in some chart.\n  result.seriesInvolved && collectSeriesInfo(result, ecModel);\n  return result;\n}\nfunction collectAxesInfo(result, ecModel, api) {\n  var globalTooltipModel = ecModel.getComponent('tooltip');\n  var globalAxisPointerModel = ecModel.getComponent('axisPointer');\n  // links can only be set on global.\n  var linksOption = globalAxisPointerModel.get('link', true) || [];\n  var linkGroups = [];\n  // Collect axes info.\n  each(api.getCoordinateSystems(), function (coordSys) {\n    // Some coordinate system do not support axes, like geo.\n    if (!coordSys.axisPointerEnabled) {\n      return;\n    }\n    var coordSysKey = makeKey(coordSys.model);\n    var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {};\n    result.coordSysMap[coordSysKey] = coordSys;\n    // Set tooltip (like 'cross') is a convenient way to show axisPointer\n    // for user. So we enable setting tooltip on coordSys model.\n    var coordSysModel = coordSys.model;\n    var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel);\n    each(coordSys.getAxes(), curry(saveTooltipAxisInfo, false, null));\n    // If axis tooltip used, choose tooltip axis for each coordSys.\n    // Notice this case: coordSys is `grid` but not `cartesian2D` here.\n    if (coordSys.getTooltipAxes && globalTooltipModel\n    // If tooltip.showContent is set as false, tooltip will not\n    // show but axisPointer will show as normal.\n    && baseTooltipModel.get('show')) {\n      // Compatible with previous logic. But series.tooltip.trigger: 'axis'\n      // or series.data[n].tooltip.trigger: 'axis' are not support any more.\n      var triggerAxis = baseTooltipModel.get('trigger') === 'axis';\n      var cross = baseTooltipModel.get(['axisPointer', 'type']) === 'cross';\n      var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get(['axisPointer', 'axis']));\n      if (triggerAxis || cross) {\n        each(tooltipAxes.baseAxes, curry(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis));\n      }\n      if (cross) {\n        each(tooltipAxes.otherAxes, curry(saveTooltipAxisInfo, 'cross', false));\n      }\n    }\n    // fromTooltip: true | false | 'cross'\n    // triggerTooltip: true | false | null\n    function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) {\n      var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel);\n      var axisPointerShow = axisPointerModel.get('show');\n      if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) {\n        return;\n      }\n      if (triggerTooltip == null) {\n        triggerTooltip = axisPointerModel.get('triggerTooltip');\n      }\n      axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel;\n      var snap = axisPointerModel.get('snap');\n      var triggerEmphasis = axisPointerModel.get('triggerEmphasis');\n      var axisKey = makeKey(axis.model);\n      var involveSeries = triggerTooltip || snap || axis.type === 'category';\n      // If result.axesInfo[key] exist, override it (tooltip has higher priority).\n      var axisInfo = result.axesInfo[axisKey] = {\n        key: axisKey,\n        axis: axis,\n        coordSys: coordSys,\n        axisPointerModel: axisPointerModel,\n        triggerTooltip: triggerTooltip,\n        triggerEmphasis: triggerEmphasis,\n        involveSeries: involveSeries,\n        snap: snap,\n        useHandle: isHandleTrigger(axisPointerModel),\n        seriesModels: [],\n        linkGroup: null\n      };\n      axesInfoInCoordSys[axisKey] = axisInfo;\n      result.seriesInvolved = result.seriesInvolved || involveSeries;\n      var groupIndex = getLinkGroupIndex(linksOption, axis);\n      if (groupIndex != null) {\n        var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = {\n          axesInfo: {}\n        });\n        linkGroup.axesInfo[axisKey] = axisInfo;\n        linkGroup.mapper = linksOption[groupIndex].mapper;\n        axisInfo.linkGroup = linkGroup;\n      }\n    }\n  });\n}\nfunction makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) {\n  var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer');\n  var fields = ['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z'];\n  var volatileOption = {};\n  each(fields, function (field) {\n    volatileOption[field] = clone(tooltipAxisPointerModel.get(field));\n  });\n  // category axis do not auto snap, otherwise some tick that do not\n  // has value can not be hovered. value/time/log axis default snap if\n  // triggered from tooltip and trigger tooltip.\n  volatileOption.snap = axis.type !== 'category' && !!triggerTooltip;\n  // Compatible with previous behavior, tooltip axis does not show label by default.\n  // Only these properties can be overridden from tooltip to axisPointer.\n  if (tooltipAxisPointerModel.get('type') === 'cross') {\n    volatileOption.type = 'line';\n  }\n  var labelOption = volatileOption.label || (volatileOption.label = {});\n  // Follow the convention, do not show label when triggered by tooltip by default.\n  labelOption.show == null && (labelOption.show = false);\n  if (fromTooltip === 'cross') {\n    // When 'cross', both axes show labels.\n    var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get(['label', 'show']);\n    labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true;\n    // If triggerTooltip, this is a base axis, which should better not use cross style\n    // (cross style is dashed by default)\n    if (!triggerTooltip) {\n      var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle');\n      crossStyle && defaults(labelOption, crossStyle.textStyle);\n    }\n  }\n  return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel));\n}\nfunction collectSeriesInfo(result, ecModel) {\n  // Prepare data for axis trigger\n  ecModel.eachSeries(function (seriesModel) {\n    // Notice this case: this coordSys is `cartesian2D` but not `grid`.\n    var coordSys = seriesModel.coordinateSystem;\n    var seriesTooltipTrigger = seriesModel.get(['tooltip', 'trigger'], true);\n    var seriesTooltipShow = seriesModel.get(['tooltip', 'show'], true);\n    if (!coordSys || !coordSys.model // PENDING: radar do not have a model.\n    || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get(['axisPointer', 'show'], true) === false) {\n      return;\n    }\n    each(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) {\n      var axis = axisInfo.axis;\n      if (coordSys.getAxis(axis.dim) === axis) {\n        axisInfo.seriesModels.push(seriesModel);\n        axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0);\n        axisInfo.seriesDataCount += seriesModel.getData().count();\n      }\n    });\n  });\n}\n/**\n * For example:\n * {\n *     axisPointer: {\n *         links: [{\n *             xAxisIndex: [2, 4],\n *             yAxisIndex: 'all'\n *         }, {\n *             xAxisId: ['a5', 'a7'],\n *             xAxisName: 'xxx'\n *         }]\n *     }\n * }\n */\nfunction getLinkGroupIndex(linksOption, axis) {\n  var axisModel = axis.model;\n  var dim = axis.dim;\n  for (var i = 0; i < linksOption.length; i++) {\n    var linkOption = linksOption[i] || {};\n    if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) {\n      return i;\n    }\n  }\n}\nfunction checkPropInLink(linkPropValue, axisPropValue) {\n  return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue;\n}\nexport function fixValue(axisModel) {\n  var axisInfo = getAxisInfo(axisModel);\n  if (!axisInfo) {\n    return;\n  }\n  var axisPointerModel = axisInfo.axisPointerModel;\n  var scale = axisInfo.axis.scale;\n  var option = axisPointerModel.option;\n  var status = axisPointerModel.get('status');\n  var value = axisPointerModel.get('value');\n  // Parse init value for category and time axis.\n  if (value != null) {\n    value = scale.parse(value);\n  }\n  var useHandle = isHandleTrigger(axisPointerModel);\n  // If `handle` used, `axisPointer` will always be displayed, so value\n  // and status should be initialized.\n  if (status == null) {\n    option.status = useHandle ? 'show' : 'hide';\n  }\n  var extent = scale.getExtent().slice();\n  extent[0] > extent[1] && extent.reverse();\n  if (\n  // Pick a value on axis when initializing.\n  value == null\n  // If both `handle` and `dataZoom` are used, value may be out of axis extent,\n  // where we should re-pick a value to keep `handle` displaying normally.\n  || value > extent[1]) {\n    // Make handle displayed on the end of the axis when init, which looks better.\n    value = extent[1];\n  }\n  if (value < extent[0]) {\n    value = extent[0];\n  }\n  option.value = value;\n  if (useHandle) {\n    option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show';\n  }\n}\nexport function getAxisInfo(axisModel) {\n  var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo;\n  return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)];\n}\nexport function getAxisPointerModel(axisModel) {\n  var axisInfo = getAxisInfo(axisModel);\n  return axisInfo && axisInfo.axisPointerModel;\n}\nfunction isHandleTrigger(axisPointerModel) {\n  return !!axisPointerModel.get(['handle', 'show']);\n}\n/**\n * @param {module:echarts/model/Model} model\n * @return {string} unique key\n */\nexport function makeKey(model) {\n  return model.type + '||' + model.id;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as axisPointerModelHelper from '../axisPointer/modelHelper.js';\nimport ComponentView from '../../view/Component.js';\nvar axisPointerClazz = {};\n/**\n * Base class of AxisView.\n */\nvar AxisView = /** @class */function (_super) {\n  __extends(AxisView, _super);\n  function AxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = AxisView.type;\n    return _this;\n  }\n  /**\n   * @override\n   */\n  AxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n    // FIXME\n    // This process should proformed after coordinate systems updated\n    // (axis scale updated), and should be performed each time update.\n    // So put it here temporarily, although it is not appropriate to\n    // put a model-writing procedure in `view`.\n    this.axisPointerClass && axisPointerModelHelper.fixValue(axisModel);\n    _super.prototype.render.apply(this, arguments);\n    this._doUpdateAxisPointerClass(axisModel, api, true);\n  };\n  /**\n   * Action handler.\n   */\n  AxisView.prototype.updateAxisPointer = function (axisModel, ecModel, api, payload) {\n    this._doUpdateAxisPointerClass(axisModel, api, false);\n  };\n  /**\n   * @override\n   */\n  AxisView.prototype.remove = function (ecModel, api) {\n    var axisPointer = this._axisPointer;\n    axisPointer && axisPointer.remove(api);\n  };\n  /**\n   * @override\n   */\n  AxisView.prototype.dispose = function (ecModel, api) {\n    this._disposeAxisPointer(api);\n    _super.prototype.dispose.apply(this, arguments);\n  };\n  AxisView.prototype._doUpdateAxisPointerClass = function (axisModel, api, forceRender) {\n    var Clazz = AxisView.getAxisPointerClass(this.axisPointerClass);\n    if (!Clazz) {\n      return;\n    }\n    var axisPointerModel = axisPointerModelHelper.getAxisPointerModel(axisModel);\n    axisPointerModel ? (this._axisPointer || (this._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : this._disposeAxisPointer(api);\n  };\n  AxisView.prototype._disposeAxisPointer = function (api) {\n    this._axisPointer && this._axisPointer.dispose(api);\n    this._axisPointer = null;\n  };\n  AxisView.registerAxisPointerClass = function (type, clazz) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (axisPointerClazz[type]) {\n        throw new Error('axisPointer ' + type + ' exists');\n      }\n    }\n    axisPointerClazz[type] = clazz;\n  };\n  ;\n  AxisView.getAxisPointerClass = function (type) {\n    return type && axisPointerClazz[type];\n  };\n  ;\n  AxisView.type = 'axis';\n  return AxisView;\n}(ComponentView);\nexport default AxisView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { makeInner } from '../../util/model.js';\nvar inner = makeInner();\nexport function rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel) {\n  var axis = axisModel.axis;\n  if (axis.scale.isBlank()) {\n    return;\n  }\n  // TODO: TYPE\n  var splitAreaModel = axisModel.getModel('splitArea');\n  var areaStyleModel = splitAreaModel.getModel('areaStyle');\n  var areaColors = areaStyleModel.get('color');\n  var gridRect = gridModel.coordinateSystem.getRect();\n  var ticksCoords = axis.getTicksCoords({\n    tickModel: splitAreaModel,\n    clamp: true,\n    breakTicks: 'none',\n    pruneByBreak: 'preserve_extent_bound'\n  });\n  if (!ticksCoords.length) {\n    return;\n  }\n  // For Making appropriate splitArea animation, the color and anid\n  // should be corresponding to previous one if possible.\n  var areaColorsLen = areaColors.length;\n  var lastSplitAreaColors = inner(axisView).splitAreaColors;\n  var newSplitAreaColors = zrUtil.createHashMap();\n  var colorIndex = 0;\n  if (lastSplitAreaColors) {\n    for (var i = 0; i < ticksCoords.length; i++) {\n      var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue);\n      if (cIndex != null) {\n        colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen;\n        break;\n      }\n    }\n  }\n  var prev = axis.toGlobalCoord(ticksCoords[0].coord);\n  var areaStyle = areaStyleModel.getAreaStyle();\n  areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors];\n  for (var i = 1; i < ticksCoords.length; i++) {\n    var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n    var x = void 0;\n    var y = void 0;\n    var width = void 0;\n    var height = void 0;\n    if (axis.isHorizontal()) {\n      x = prev;\n      y = gridRect.y;\n      width = tickCoord - x;\n      height = gridRect.height;\n      prev = x + width;\n    } else {\n      x = gridRect.x;\n      y = prev;\n      width = gridRect.width;\n      height = tickCoord - y;\n      prev = y + height;\n    }\n    var tickValue = ticksCoords[i - 1].tickValue;\n    tickValue != null && newSplitAreaColors.set(tickValue, colorIndex);\n    axisGroup.add(new graphic.Rect({\n      anid: tickValue != null ? 'area_' + tickValue : null,\n      shape: {\n        x: x,\n        y: y,\n        width: width,\n        height: height\n      },\n      style: zrUtil.defaults({\n        fill: areaColors[colorIndex]\n      }, areaStyle),\n      autoBatch: true,\n      silent: true\n    }));\n    colorIndex = (colorIndex + 1) % areaColorsLen;\n  }\n  inner(axisView).splitAreaColors = newSplitAreaColors;\n}\nexport function rectCoordAxisHandleRemove(axisView) {\n  inner(axisView).splitAreaColors = null;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport AxisView from './AxisView.js';\nimport { rectCoordAxisBuildSplitArea, rectCoordAxisHandleRemove } from './axisSplitHelper.js';\nimport { getAxisBreakHelper } from './axisBreakHelper.js';\nimport { shouldAxisShow } from '../../coord/axisHelper.js';\nvar selfBuilderAttrs = ['splitArea', 'splitLine', 'minorSplitLine', 'breakArea'];\nvar CartesianAxisView = /** @class */function (_super) {\n  __extends(CartesianAxisView, _super);\n  function CartesianAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CartesianAxisView.type;\n    _this.axisPointerClass = 'CartesianAxisPointer';\n    return _this;\n  }\n  /**\n   * @override\n   */\n  CartesianAxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n    this.group.removeAll();\n    var oldAxisGroup = this._axisGroup;\n    this._axisGroup = new graphic.Group();\n    this.group.add(this._axisGroup);\n    if (!shouldAxisShow(axisModel)) {\n      return;\n    }\n    this._axisGroup.add(axisModel.axis.axisBuilder.group);\n    zrUtil.each(selfBuilderAttrs, function (name) {\n      if (axisModel.get([name, 'show'])) {\n        axisElementBuilders[name](this, this._axisGroup, axisModel, axisModel.getCoordSysModel(), api);\n      }\n    }, this);\n    // THIS is a special case for bar racing chart.\n    // Update the axis label from the natural initial layout to\n    // sorted layout should has no animation.\n    var isInitialSortFromBarRacing = payload && payload.type === 'changeAxisOrder' && payload.isInitSort;\n    if (!isInitialSortFromBarRacing) {\n      graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n    }\n    _super.prototype.render.call(this, axisModel, ecModel, api, payload);\n  };\n  CartesianAxisView.prototype.remove = function () {\n    rectCoordAxisHandleRemove(this);\n  };\n  CartesianAxisView.type = 'cartesianAxis';\n  return CartesianAxisView;\n}(AxisView);\nvar axisElementBuilders = {\n  splitLine: function (axisView, axisGroup, axisModel, gridModel, api) {\n    var axis = axisModel.axis;\n    if (axis.scale.isBlank()) {\n      return;\n    }\n    var splitLineModel = axisModel.getModel('splitLine');\n    var lineStyleModel = splitLineModel.getModel('lineStyle');\n    var lineColors = lineStyleModel.get('color');\n    var showMinLine = splitLineModel.get('showMinLine') !== false;\n    var showMaxLine = splitLineModel.get('showMaxLine') !== false;\n    lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors];\n    var gridRect = gridModel.coordinateSystem.getRect();\n    var isHorizontal = axis.isHorizontal();\n    var lineCount = 0;\n    var ticksCoords = axis.getTicksCoords({\n      tickModel: splitLineModel,\n      breakTicks: 'none',\n      pruneByBreak: 'preserve_extent_bound'\n    });\n    var p1 = [];\n    var p2 = [];\n    var lineStyle = lineStyleModel.getLineStyle();\n    for (var i = 0; i < ticksCoords.length; i++) {\n      var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n      if (i === 0 && !showMinLine || i === ticksCoords.length - 1 && !showMaxLine) {\n        continue;\n      }\n      var tickValue = ticksCoords[i].tickValue;\n      if (isHorizontal) {\n        p1[0] = tickCoord;\n        p1[1] = gridRect.y;\n        p2[0] = tickCoord;\n        p2[1] = gridRect.y + gridRect.height;\n      } else {\n        p1[0] = gridRect.x;\n        p1[1] = tickCoord;\n        p2[0] = gridRect.x + gridRect.width;\n        p2[1] = tickCoord;\n      }\n      var colorIndex = lineCount++ % lineColors.length;\n      var line = new graphic.Line({\n        anid: tickValue != null ? 'line_' + tickValue : null,\n        autoBatch: true,\n        shape: {\n          x1: p1[0],\n          y1: p1[1],\n          x2: p2[0],\n          y2: p2[1]\n        },\n        style: zrUtil.defaults({\n          stroke: lineColors[colorIndex]\n        }, lineStyle),\n        silent: true\n      });\n      graphic.subPixelOptimizeLine(line.shape, lineStyle.lineWidth);\n      axisGroup.add(line);\n    }\n  },\n  minorSplitLine: function (axisView, axisGroup, axisModel, gridModel, api) {\n    var axis = axisModel.axis;\n    var minorSplitLineModel = axisModel.getModel('minorSplitLine');\n    var lineStyleModel = minorSplitLineModel.getModel('lineStyle');\n    var gridRect = gridModel.coordinateSystem.getRect();\n    var isHorizontal = axis.isHorizontal();\n    var minorTicksCoords = axis.getMinorTicksCoords();\n    if (!minorTicksCoords.length) {\n      return;\n    }\n    var p1 = [];\n    var p2 = [];\n    var lineStyle = lineStyleModel.getLineStyle();\n    for (var i = 0; i < minorTicksCoords.length; i++) {\n      for (var k = 0; k < minorTicksCoords[i].length; k++) {\n        var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord);\n        if (isHorizontal) {\n          p1[0] = tickCoord;\n          p1[1] = gridRect.y;\n          p2[0] = tickCoord;\n          p2[1] = gridRect.y + gridRect.height;\n        } else {\n          p1[0] = gridRect.x;\n          p1[1] = tickCoord;\n          p2[0] = gridRect.x + gridRect.width;\n          p2[1] = tickCoord;\n        }\n        var line = new graphic.Line({\n          anid: 'minor_line_' + minorTicksCoords[i][k].tickValue,\n          autoBatch: true,\n          shape: {\n            x1: p1[0],\n            y1: p1[1],\n            x2: p2[0],\n            y2: p2[1]\n          },\n          style: lineStyle,\n          silent: true\n        });\n        graphic.subPixelOptimizeLine(line.shape, lineStyle.lineWidth);\n        axisGroup.add(line);\n      }\n    }\n  },\n  splitArea: function (axisView, axisGroup, axisModel, gridModel, api) {\n    rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, gridModel);\n  },\n  breakArea: function (axisView, axisGroup, axisModel, gridModel, api) {\n    var axisBreakHelper = getAxisBreakHelper();\n    var scale = axisModel.axis.scale;\n    if (axisBreakHelper && scale.type !== 'ordinal') {\n      axisBreakHelper.rectCoordBuildBreakAxis(axisGroup, axisView, axisModel, gridModel.coordinateSystem.getRect(), api);\n    }\n  }\n};\nvar CartesianXAxisView = /** @class */function (_super) {\n  __extends(CartesianXAxisView, _super);\n  function CartesianXAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CartesianXAxisView.type;\n    return _this;\n  }\n  CartesianXAxisView.type = 'xAxis';\n  return CartesianXAxisView;\n}(CartesianAxisView);\nexport { CartesianXAxisView };\nvar CartesianYAxisView = /** @class */function (_super) {\n  __extends(CartesianYAxisView, _super);\n  function CartesianYAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CartesianXAxisView.type;\n    return _this;\n  }\n  CartesianYAxisView.type = 'yAxis';\n  return CartesianYAxisView;\n}(CartesianAxisView);\nexport { CartesianYAxisView };\nexport default CartesianAxisView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nimport GridModel from '../../coord/cartesian/GridModel.js';\nimport { Rect } from '../../util/graphic.js';\nimport { defaults } from 'zrender/lib/core/util.js';\nimport { CartesianAxisModel } from '../../coord/cartesian/AxisModel.js';\nimport axisModelCreator from '../../coord/axisModelCreator.js';\nimport Grid from '../../coord/cartesian/Grid.js';\nimport { CartesianXAxisView, CartesianYAxisView } from '../axis/CartesianAxisView.js';\n// Grid view\nvar GridView = /** @class */function (_super) {\n  __extends(GridView, _super);\n  function GridView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'grid';\n    return _this;\n  }\n  GridView.prototype.render = function (gridModel, ecModel) {\n    this.group.removeAll();\n    if (gridModel.get('show')) {\n      this.group.add(new Rect({\n        shape: gridModel.coordinateSystem.getRect(),\n        style: defaults({\n          fill: gridModel.get('backgroundColor')\n        }, gridModel.getItemStyle()),\n        silent: true,\n        z2: -1\n      }));\n    }\n  };\n  GridView.type = 'grid';\n  return GridView;\n}(ComponentView);\nvar extraOption = {\n  // gridIndex: 0,\n  // gridId: '',\n  offset: 0\n};\nexport function install(registers) {\n  registers.registerComponentView(GridView);\n  registers.registerComponentModel(GridModel);\n  registers.registerCoordinateSystem('cartesian2d', Grid);\n  axisModelCreator(registers, 'x', CartesianAxisModel, extraOption);\n  axisModelCreator(registers, 'y', CartesianAxisModel, extraOption);\n  registers.registerComponentView(CartesianXAxisView);\n  registers.registerComponentView(CartesianYAxisView);\n  registers.registerPreprocessor(function (option) {\n    // Only create grid when need\n    if (option.xAxis && option.yAxis && !option.grid) {\n      option.grid = {};\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport Axis2D from '../coord/cartesian/Axis2D.js';\nimport { makeInner } from './model.js';\nexport function needFixJitter(seriesModel, axis) {\n  var coordinateSystem = seriesModel.coordinateSystem;\n  var coordType = coordinateSystem && coordinateSystem.type;\n  var baseAxis = coordinateSystem && coordinateSystem.getBaseAxis && coordinateSystem.getBaseAxis();\n  var scaleType = baseAxis && baseAxis.scale && baseAxis.scale.type;\n  var seriesValid = coordType === 'cartesian2d' && scaleType === 'ordinal' || coordType === 'single';\n  var axisValid = axis.model.get('jitter') > 0;\n  return seriesValid && axisValid;\n}\nvar inner = makeInner();\n/**\n * Fix jitter for overlapping data points.\n *\n * @param fixedAxis The axis whose coord doesn't change with jitter.\n * @param fixedCoord The coord of fixedAxis.\n * @param floatCoord The coord of the other axis, which should be changed with jittering.\n * @param radius The radius of the data point, considering the symbol is a circle.\n * @returns updated floatCoord.\n */\nexport function fixJitter(fixedAxis, fixedCoord, floatCoord, radius) {\n  if (fixedAxis instanceof Axis2D) {\n    var scaleType = fixedAxis.scale.type;\n    if (scaleType !== 'category' && scaleType !== 'ordinal') {\n      return floatCoord;\n    }\n  }\n  var axisModel = fixedAxis.model;\n  var jitter = axisModel.get('jitter');\n  var jitterOverlap = axisModel.get('jitterOverlap');\n  var jitterMargin = axisModel.get('jitterMargin') || 0;\n  // Get band width to limit jitter range\n  var bandWidth = fixedAxis.scale.type === 'ordinal' ? fixedAxis.getBandWidth() : null;\n  if (jitter > 0) {\n    if (jitterOverlap) {\n      return fixJitterIgnoreOverlaps(floatCoord, jitter, bandWidth, radius);\n    } else {\n      return fixJitterAvoidOverlaps(fixedAxis, fixedCoord, floatCoord, radius, jitter, jitterMargin);\n    }\n  }\n  return floatCoord;\n}\nfunction fixJitterIgnoreOverlaps(floatCoord, jitter, bandWidth, radius) {\n  // Don't clamp single axis\n  if (bandWidth === null) {\n    return floatCoord + (Math.random() - 0.5) * jitter;\n  }\n  var maxJitter = bandWidth - radius * 2;\n  var actualJitter = Math.min(Math.max(0, jitter), maxJitter);\n  return floatCoord + (Math.random() - 0.5) * actualJitter;\n}\nfunction fixJitterAvoidOverlaps(fixedAxis, fixedCoord, floatCoord, radius, jitter, margin) {\n  var store = inner(fixedAxis);\n  if (!store.items) {\n    store.items = [];\n  }\n  var items = store.items;\n  // Try both positive and negative directions, choose the one with smaller movement\n  var overlapA = placeJitterOnDirection(items, fixedCoord, floatCoord, radius, jitter, margin, 1);\n  var overlapB = placeJitterOnDirection(items, fixedCoord, floatCoord, radius, jitter, margin, -1);\n  var minFloat = Math.abs(overlapA - floatCoord) < Math.abs(overlapB - floatCoord) ? overlapA : overlapB;\n  // Clamp only category axis\n  var bandWidth = fixedAxis.scale.type === 'ordinal' ? fixedAxis.getBandWidth() : null;\n  var distance = Math.abs(minFloat - floatCoord);\n  if (distance > jitter / 2 || bandWidth && distance > bandWidth / 2 - radius) {\n    // If the new item is moved too far, then give up.\n    // Fall back to random jitter.\n    return fixJitterIgnoreOverlaps(floatCoord, jitter, bandWidth, radius);\n  }\n  // Add new point to array\n  items.push({\n    fixedCoord: fixedCoord,\n    floatCoord: minFloat,\n    r: radius\n  });\n  return minFloat;\n}\nfunction placeJitterOnDirection(items, fixedCoord, floatCoord, radius, jitter, margin, direction) {\n  var y = floatCoord;\n  // Check all existing items for overlap and find the maximum adjustment needed\n  for (var i = 0; i < items.length; i++) {\n    var item = items[i];\n    var dx = fixedCoord - item.fixedCoord;\n    var dy = y - item.floatCoord;\n    var d2 = dx * dx + dy * dy;\n    var r = radius + item.r + margin;\n    if (d2 < r * r) {\n      // Has overlap, calculate required adjustment\n      var requiredY = item.floatCoord + Math.sqrt(r * r - dx * dx) * direction;\n      // Check if this adjustment would move too far\n      if (Math.abs(requiredY - floatCoord) > jitter / 2) {\n        return Number.MAX_VALUE; // Give up\n      }\n      // Update y only when it's larger to the center\n      if (direction === 1 && requiredY > y || direction === -1 && requiredY < y) {\n        y = requiredY;\n        // Loop from the start again\n        i = -1; // Reset index to recheck all items\n        continue; // Recalculate with the new y position\n      }\n    }\n  }\n  return y;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { needFixJitter, fixJitter } from '../../util/jitter.js';\nexport default function jitterLayout(ecModel) {\n  ecModel.eachSeriesByType('scatter', function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'single')) {\n      var baseAxis_1 = coordSys.getBaseAxis ? coordSys.getBaseAxis() : null;\n      var hasJitter = baseAxis_1 && needFixJitter(seriesModel, baseAxis_1);\n      if (hasJitter) {\n        var data_1 = seriesModel.getData();\n        data_1.each(function (idx) {\n          var dim = baseAxis_1.dim;\n          var orient = baseAxis_1.orient;\n          var isSingleY = orient === 'horizontal' && baseAxis_1.type !== 'category' || orient === 'vertical' && baseAxis_1.type === 'category';\n          var layout = data_1.getItemLayout(idx);\n          var rawSize = data_1.getItemVisual(idx, 'symbolSize');\n          var size = rawSize instanceof Array ? (rawSize[1] + rawSize[0]) / 2 : rawSize;\n          if (dim === 'y' || dim === 'single' && isSingleY) {\n            // x is fixed, and y is floating\n            var jittered = fixJitter(baseAxis_1, layout[0], layout[1], size / 2);\n            data_1.setItemLayout(idx, [layout[0], jittered]);\n          } else if (dim === 'x' || dim === 'single' && !isSingleY) {\n            // y is fixed, and x is floating\n            var jittered = fixJitter(baseAxis_1, layout[1], layout[0], size / 2);\n            data_1.setItemLayout(idx, [jittered, layout[1]]);\n          }\n        });\n      }\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport ScatterSeriesModel from './ScatterSeries.js';\nimport ScatterView from './ScatterView.js';\nimport { install as installGridSimple } from '../../component/grid/installSimple.js';\nimport layoutPoints from '../../layout/points.js';\nimport jitterLayout from './jitterLayout.js';\nexport function install(registers) {\n  // In case developer forget to include grid component\n  use(installGridSimple);\n  registers.registerSeriesModel(ScatterSeriesModel);\n  registers.registerChartView(ScatterView);\n  registers.registerLayout(layoutPoints('scatter'));\n}\nexport function installScatterJitter(registers) {\n  registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, jitterLayout);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function radarLayout(ecModel) {\n  ecModel.eachSeriesByType('radar', function (seriesModel) {\n    var data = seriesModel.getData();\n    var points = [];\n    var coordSys = seriesModel.coordinateSystem;\n    if (!coordSys) {\n      return;\n    }\n    var axes = coordSys.getIndicatorAxes();\n    zrUtil.each(axes, function (axis, axisIndex) {\n      data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) {\n        points[dataIndex] = points[dataIndex] || [];\n        var point = coordSys.dataToPoint(val, axisIndex);\n        points[dataIndex][axisIndex] = isValidPoint(point) ? point : getValueMissingPoint(coordSys);\n      });\n    });\n    // Close polygon\n    data.each(function (idx) {\n      // TODO\n      // Is it appropriate to connect to the next data when some data is missing?\n      // Or, should trade it like `connectNull` in line chart?\n      var firstPoint = zrUtil.find(points[idx], function (point) {\n        return isValidPoint(point);\n      }) || getValueMissingPoint(coordSys);\n      // Copy the first actual point to the end of the array\n      points[idx].push(firstPoint.slice());\n      data.setItemLayout(idx, points[idx]);\n    });\n  });\n}\nfunction isValidPoint(point) {\n  return !isNaN(point[0]) && !isNaN(point[1]);\n}\nfunction getValueMissingPoint(coordSys) {\n  // It is error-prone to input [NaN, NaN] into polygon, polygon.\n  // (probably cause problem when refreshing or animating)\n  return [coordSys.cx, coordSys.cy];\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// @ts-nocheck\n// Backward compat for radar chart in 2\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function radarBackwardCompat(option) {\n  var polarOptArr = option.polar;\n  if (polarOptArr) {\n    if (!zrUtil.isArray(polarOptArr)) {\n      polarOptArr = [polarOptArr];\n    }\n    var polarNotRadar_1 = [];\n    zrUtil.each(polarOptArr, function (polarOpt, idx) {\n      if (polarOpt.indicator) {\n        if (polarOpt.type && !polarOpt.shape) {\n          polarOpt.shape = polarOpt.type;\n        }\n        option.radar = option.radar || [];\n        if (!zrUtil.isArray(option.radar)) {\n          option.radar = [option.radar];\n        }\n        option.radar.push(polarOpt);\n      } else {\n        polarNotRadar_1.push(polarOpt);\n      }\n    });\n    option.polar = polarNotRadar_1;\n  }\n  zrUtil.each(option.series, function (seriesOpt) {\n    if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) {\n      seriesOpt.radarIndex = seriesOpt.polarIndex;\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as symbolUtil from '../../util/symbol.js';\nimport ChartView from '../../view/Chart.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport ZRImage from 'zrender/lib/graphic/Image.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nvar RadarView = /** @class */function (_super) {\n  __extends(RadarView, _super);\n  function RadarView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = RadarView.type;\n    return _this;\n  }\n  RadarView.prototype.render = function (seriesModel, ecModel, api) {\n    var polar = seriesModel.coordinateSystem;\n    var group = this.group;\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    function createSymbol(data, idx) {\n      var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';\n      if (symbolType === 'none') {\n        return;\n      }\n      var symbolSize = symbolUtil.normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n      var symbolPath = symbolUtil.createSymbol(symbolType, -1, -1, 2, 2);\n      var symbolRotate = data.getItemVisual(idx, 'symbolRotate') || 0;\n      symbolPath.attr({\n        style: {\n          strokeNoScale: true\n        },\n        z2: 100,\n        scaleX: symbolSize[0] / 2,\n        scaleY: symbolSize[1] / 2,\n        rotation: symbolRotate * Math.PI / 180 || 0\n      });\n      return symbolPath;\n    }\n    function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) {\n      // Simply rerender all\n      symbolGroup.removeAll();\n      for (var i = 0; i < newPoints.length - 1; i++) {\n        var symbolPath = createSymbol(data, idx);\n        if (symbolPath) {\n          symbolPath.__dimIdx = i;\n          if (oldPoints[i]) {\n            symbolPath.setPosition(oldPoints[i]);\n            graphic[isInit ? 'initProps' : 'updateProps'](symbolPath, {\n              x: newPoints[i][0],\n              y: newPoints[i][1]\n            }, seriesModel, idx);\n          } else {\n            symbolPath.setPosition(newPoints[i]);\n          }\n          symbolGroup.add(symbolPath);\n        }\n      }\n    }\n    function getInitialPoints(points) {\n      return zrUtil.map(points, function (pt) {\n        return [polar.cx, polar.cy];\n      });\n    }\n    data.diff(oldData).add(function (idx) {\n      var points = data.getItemLayout(idx);\n      if (!points) {\n        return;\n      }\n      var polygon = new graphic.Polygon();\n      var polyline = new graphic.Polyline();\n      var target = {\n        shape: {\n          points: points\n        }\n      };\n      polygon.shape.points = getInitialPoints(points);\n      polyline.shape.points = getInitialPoints(points);\n      graphic.initProps(polygon, target, seriesModel, idx);\n      graphic.initProps(polyline, target, seriesModel, idx);\n      var itemGroup = new graphic.Group();\n      var symbolGroup = new graphic.Group();\n      itemGroup.add(polyline);\n      itemGroup.add(polygon);\n      itemGroup.add(symbolGroup);\n      updateSymbols(polyline.shape.points, points, symbolGroup, data, idx, true);\n      data.setItemGraphicEl(idx, itemGroup);\n    }).update(function (newIdx, oldIdx) {\n      var itemGroup = oldData.getItemGraphicEl(oldIdx);\n      var polyline = itemGroup.childAt(0);\n      var polygon = itemGroup.childAt(1);\n      var symbolGroup = itemGroup.childAt(2);\n      var target = {\n        shape: {\n          points: data.getItemLayout(newIdx)\n        }\n      };\n      if (!target.shape.points) {\n        return;\n      }\n      updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false);\n      saveOldStyle(polygon);\n      saveOldStyle(polyline);\n      graphic.updateProps(polyline, target, seriesModel);\n      graphic.updateProps(polygon, target, seriesModel);\n      data.setItemGraphicEl(newIdx, itemGroup);\n    }).remove(function (idx) {\n      group.remove(oldData.getItemGraphicEl(idx));\n    }).execute();\n    data.eachItemGraphicEl(function (itemGroup, idx) {\n      var itemModel = data.getItemModel(idx);\n      var polyline = itemGroup.childAt(0);\n      var polygon = itemGroup.childAt(1);\n      var symbolGroup = itemGroup.childAt(2);\n      // Radar uses the visual encoded from itemStyle.\n      var itemStyle = data.getItemVisual(idx, 'style');\n      var color = itemStyle.fill;\n      group.add(itemGroup);\n      polyline.useStyle(zrUtil.defaults(itemModel.getModel('lineStyle').getLineStyle(), {\n        fill: 'none',\n        stroke: color\n      }));\n      setStatesStylesFromModel(polyline, itemModel, 'lineStyle');\n      setStatesStylesFromModel(polygon, itemModel, 'areaStyle');\n      var areaStyleModel = itemModel.getModel('areaStyle');\n      var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();\n      polygon.ignore = polygonIgnore;\n      zrUtil.each(['emphasis', 'select', 'blur'], function (stateName) {\n        var stateModel = itemModel.getModel([stateName, 'areaStyle']);\n        var stateIgnore = stateModel.isEmpty() && stateModel.parentModel.isEmpty();\n        // Won't be ignore if normal state is not ignore.\n        polygon.ensureState(stateName).ignore = stateIgnore && polygonIgnore;\n        var lineStyle = itemModel.getModel([stateName, 'lineStyle']).getLineStyle();\n        polyline.ensureState(stateName).style = lineStyle;\n        var areaStyle = stateModel.getAreaStyle();\n        polygon.ensureState(stateName).style = areaStyle;\n        var itemStateStyle = itemModel.getModel([stateName, 'itemStyle']).getItemStyle();\n        symbolGroup.eachChild(function (symbolPath) {\n          symbolPath.ensureState(stateName).style = zrUtil.clone(itemStateStyle);\n        });\n      });\n      polygon.useStyle(zrUtil.defaults(itemModel.getModel('areaStyle').getAreaStyle(), {\n        fill: color,\n        opacity: 0.7,\n        decal: itemStyle.decal\n      }));\n      var emphasisModel = itemModel.getModel('emphasis');\n      symbolGroup.eachChild(function (symbolPath) {\n        if (symbolPath instanceof ZRImage) {\n          var pathStyle = symbolPath.style;\n          symbolPath.useStyle(zrUtil.extend({\n            // TODO other properties like x, y ?\n            image: pathStyle.image,\n            x: pathStyle.x,\n            y: pathStyle.y,\n            width: pathStyle.width,\n            height: pathStyle.height\n          }, itemStyle));\n        } else {\n          symbolPath.useStyle(itemStyle);\n          symbolPath.setColor(color);\n          symbolPath.style.strokeNoScale = true;\n        }\n        var defaultText = data.getStore().get(data.getDimensionIndex(symbolPath.__dimIdx), idx);\n        (defaultText == null || isNaN(defaultText)) && (defaultText = '');\n        setLabelStyle(symbolPath, getLabelStatesModels(itemModel), {\n          labelFetcher: data.hostModel,\n          labelDataIndex: idx,\n          labelDimIndex: symbolPath.__dimIdx,\n          defaultText: defaultText,\n          inheritColor: color,\n          defaultOpacity: itemStyle.opacity\n        });\n      });\n      toggleHoverEmphasis(itemGroup, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    });\n    this._data = data;\n  };\n  RadarView.prototype.remove = function () {\n    this.group.removeAll();\n    this._data = null;\n  };\n  RadarView.type = 'radar';\n  return RadarView;\n}(ChartView);\nexport default RadarView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport createSeriesDataSimply from '../helper/createSeriesDataSimply.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport LegendVisualProvider from '../../visual/LegendVisualProvider.js';\nimport { createTooltipMarkup, retrieveVisualColorForTooltipMarker } from '../../component/tooltip/tooltipMarkup.js';\nvar RadarSeriesModel = /** @class */function (_super) {\n  __extends(RadarSeriesModel, _super);\n  function RadarSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = RadarSeriesModel.type;\n    _this.hasSymbolVisual = true;\n    return _this;\n  }\n  // Overwrite\n  RadarSeriesModel.prototype.init = function (option) {\n    _super.prototype.init.apply(this, arguments);\n    // Enable legend selection for each data item\n    // Use a function instead of direct access because data reference may changed\n    this.legendVisualProvider = new LegendVisualProvider(zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this));\n  };\n  RadarSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesDataSimply(this, {\n      generateCoord: 'indicator_',\n      generateCoordCount: Infinity\n    });\n  };\n  RadarSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var data = this.getData();\n    var coordSys = this.coordinateSystem;\n    var indicatorAxes = coordSys.getIndicatorAxes();\n    var name = this.getData().getName(dataIndex);\n    var nameToDisplay = name === '' ? this.name : name;\n    var markerColor = retrieveVisualColorForTooltipMarker(this, dataIndex);\n    return createTooltipMarkup('section', {\n      header: nameToDisplay,\n      sortBlocks: true,\n      blocks: zrUtil.map(indicatorAxes, function (axis) {\n        var val = data.get(data.mapDimension(axis.dim), dataIndex);\n        return createTooltipMarkup('nameValue', {\n          markerType: 'subItem',\n          markerColor: markerColor,\n          name: axis.name,\n          value: val,\n          sortParam: val\n        });\n      })\n    });\n  };\n  RadarSeriesModel.prototype.getTooltipPosition = function (dataIndex) {\n    if (dataIndex != null) {\n      var data_1 = this.getData();\n      var coordSys = this.coordinateSystem;\n      var values = data_1.getValues(zrUtil.map(coordSys.dimensions, function (dim) {\n        return data_1.mapDimension(dim);\n      }), dataIndex);\n      for (var i = 0, len = values.length; i < len; i++) {\n        if (!isNaN(values[i])) {\n          var indicatorAxes = coordSys.getIndicatorAxes();\n          return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i);\n        }\n      }\n    }\n  };\n  RadarSeriesModel.type = 'series.radar';\n  RadarSeriesModel.dependencies = ['radar'];\n  RadarSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    colorBy: 'data',\n    coordinateSystem: 'radar',\n    legendHoverLink: true,\n    radarIndex: 0,\n    lineStyle: {\n      width: 2,\n      type: 'solid',\n      join: 'round'\n    },\n    label: {\n      position: 'top'\n    },\n    // areaStyle: {\n    // },\n    // itemStyle: {}\n    symbolSize: 8\n    // symbolRotate: null\n  };\n  return RadarSeriesModel;\n}(SeriesModel);\nexport default RadarSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport axisDefault from '../axisDefault.js';\nimport Model from '../../model/Model.js';\nimport { AxisModelCommonMixin } from '../axisModelCommonMixin.js';\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar valueAxisDefault = axisDefault.value;\nfunction defaultsShow(opt, show) {\n  return zrUtil.defaults({\n    show: show\n  }, opt);\n}\nvar RadarModel = /** @class */function (_super) {\n  __extends(RadarModel, _super);\n  function RadarModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = RadarModel.type;\n    return _this;\n  }\n  RadarModel.prototype.optionUpdated = function () {\n    var boundaryGap = this.get('boundaryGap');\n    var splitNumber = this.get('splitNumber');\n    var scale = this.get('scale');\n    var axisLine = this.get('axisLine');\n    var axisTick = this.get('axisTick');\n    // let axisType = this.get('axisType');\n    var axisLabel = this.get('axisLabel');\n    var nameTextStyle = this.get('axisName');\n    var showName = this.get(['axisName', 'show']);\n    var nameFormatter = this.get(['axisName', 'formatter']);\n    var nameGap = this.get('axisNameGap');\n    var triggerEvent = this.get('triggerEvent');\n    var indicatorModels = zrUtil.map(this.get('indicator') || [], function (indicatorOpt) {\n      // PENDING\n      if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) {\n        indicatorOpt.min = 0;\n      } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) {\n        indicatorOpt.max = 0;\n      }\n      var iNameTextStyle = nameTextStyle;\n      if (indicatorOpt.color != null) {\n        iNameTextStyle = zrUtil.defaults({\n          color: indicatorOpt.color\n        }, nameTextStyle);\n      }\n      // Use same configuration\n      var innerIndicatorOpt = zrUtil.merge(zrUtil.clone(indicatorOpt), {\n        boundaryGap: boundaryGap,\n        splitNumber: splitNumber,\n        scale: scale,\n        axisLine: axisLine,\n        axisTick: axisTick,\n        // axisType: axisType,\n        axisLabel: axisLabel,\n        // Compatible with 2 and use text\n        name: indicatorOpt.text,\n        showName: showName,\n        nameLocation: 'end',\n        nameGap: nameGap,\n        // min: 0,\n        nameTextStyle: iNameTextStyle,\n        triggerEvent: triggerEvent\n      }, false);\n      if (zrUtil.isString(nameFormatter)) {\n        var indName = innerIndicatorOpt.name;\n        innerIndicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : '');\n      } else if (zrUtil.isFunction(nameFormatter)) {\n        innerIndicatorOpt.name = nameFormatter(innerIndicatorOpt.name, innerIndicatorOpt);\n      }\n      var model = new Model(innerIndicatorOpt, null, this.ecModel);\n      zrUtil.mixin(model, AxisModelCommonMixin.prototype);\n      // For triggerEvent.\n      model.mainType = 'radar';\n      model.componentIndex = this.componentIndex;\n      return model;\n    }, this);\n    this._indicatorModels = indicatorModels;\n  };\n  RadarModel.prototype.getIndicatorModels = function () {\n    return this._indicatorModels;\n  };\n  RadarModel.type = 'radar';\n  RadarModel.defaultOption = {\n    // zlevel: 0,\n    z: 0,\n    center: ['50%', '50%'],\n    radius: '50%',\n    startAngle: 90,\n    axisName: {\n      show: true,\n      color: tokens.color.axisLabel\n      // formatter: null\n      // textStyle: {}\n    },\n    boundaryGap: [0, 0],\n    splitNumber: 5,\n    axisNameGap: 15,\n    scale: false,\n    // Polygon or circle\n    shape: 'polygon',\n    axisLine: zrUtil.merge({\n      lineStyle: {\n        color: tokens.color.neutral20\n      }\n    }, valueAxisDefault.axisLine),\n    axisLabel: defaultsShow(valueAxisDefault.axisLabel, false),\n    axisTick: defaultsShow(valueAxisDefault.axisTick, false),\n    // axisType: 'value',\n    splitLine: defaultsShow(valueAxisDefault.splitLine, true),\n    splitArea: defaultsShow(valueAxisDefault.splitArea, true),\n    // {text, min, max}\n    indicator: []\n  };\n  return RadarModel;\n}(ComponentModel);\nexport default RadarModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport AxisBuilder from '../axis/AxisBuilder.js';\nimport * as graphic from '../../util/graphic.js';\nimport ComponentView from '../../view/Component.js';\nvar RadarView = /** @class */function (_super) {\n  __extends(RadarView, _super);\n  function RadarView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = RadarView.type;\n    return _this;\n  }\n  RadarView.prototype.render = function (radarModel, ecModel, api) {\n    var group = this.group;\n    group.removeAll();\n    this._buildAxes(radarModel, api);\n    this._buildSplitLineAndArea(radarModel);\n  };\n  RadarView.prototype._buildAxes = function (radarModel, api) {\n    var radar = radarModel.coordinateSystem;\n    var indicatorAxes = radar.getIndicatorAxes();\n    var axisBuilders = zrUtil.map(indicatorAxes, function (indicatorAxis) {\n      var axisName = indicatorAxis.model.get('showName') ? indicatorAxis.name : ''; // hide name\n      var axisBuilder = new AxisBuilder(indicatorAxis.model, api, {\n        axisName: axisName,\n        position: [radar.cx, radar.cy],\n        rotation: indicatorAxis.angle,\n        labelDirection: -1,\n        tickDirection: -1,\n        nameDirection: 1\n      });\n      return axisBuilder;\n    });\n    zrUtil.each(axisBuilders, function (axisBuilder) {\n      axisBuilder.build();\n      this.group.add(axisBuilder.group);\n    }, this);\n  };\n  RadarView.prototype._buildSplitLineAndArea = function (radarModel) {\n    var radar = radarModel.coordinateSystem;\n    var indicatorAxes = radar.getIndicatorAxes();\n    if (!indicatorAxes.length) {\n      return;\n    }\n    var shape = radarModel.get('shape');\n    var splitLineModel = radarModel.getModel('splitLine');\n    var splitAreaModel = radarModel.getModel('splitArea');\n    var lineStyleModel = splitLineModel.getModel('lineStyle');\n    var areaStyleModel = splitAreaModel.getModel('areaStyle');\n    var showSplitLine = splitLineModel.get('show');\n    var showSplitArea = splitAreaModel.get('show');\n    var splitLineColors = lineStyleModel.get('color');\n    var splitAreaColors = areaStyleModel.get('color');\n    var splitLineColorsArr = zrUtil.isArray(splitLineColors) ? splitLineColors : [splitLineColors];\n    var splitAreaColorsArr = zrUtil.isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors];\n    var splitLines = [];\n    var splitAreas = [];\n    function getColorIndex(areaOrLine, areaOrLineColorList, idx) {\n      var colorIndex = idx % areaOrLineColorList.length;\n      areaOrLine[colorIndex] = areaOrLine[colorIndex] || [];\n      return colorIndex;\n    }\n    if (shape === 'circle') {\n      var ticksRadius = indicatorAxes[0].getTicksCoords();\n      var cx = radar.cx;\n      var cy = radar.cy;\n      for (var i = 0; i < ticksRadius.length; i++) {\n        if (showSplitLine) {\n          var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i);\n          splitLines[colorIndex].push(new graphic.Circle({\n            shape: {\n              cx: cx,\n              cy: cy,\n              r: ticksRadius[i].coord\n            }\n          }));\n        }\n        if (showSplitArea && i < ticksRadius.length - 1) {\n          var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i);\n          splitAreas[colorIndex].push(new graphic.Ring({\n            shape: {\n              cx: cx,\n              cy: cy,\n              r0: ticksRadius[i].coord,\n              r: ticksRadius[i + 1].coord\n            }\n          }));\n        }\n      }\n    }\n    // Polyyon\n    else {\n      var realSplitNumber_1;\n      var axesTicksPoints = zrUtil.map(indicatorAxes, function (indicatorAxis, idx) {\n        var ticksCoords = indicatorAxis.getTicksCoords();\n        realSplitNumber_1 = realSplitNumber_1 == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber_1);\n        return zrUtil.map(ticksCoords, function (tickCoord) {\n          return radar.coordToPoint(tickCoord.coord, idx);\n        });\n      });\n      var prevPoints = [];\n      for (var i = 0; i <= realSplitNumber_1; i++) {\n        var points = [];\n        for (var j = 0; j < indicatorAxes.length; j++) {\n          points.push(axesTicksPoints[j][i]);\n        }\n        // Close\n        if (points[0]) {\n          points.push(points[0].slice());\n        } else {\n          if (process.env.NODE_ENV !== 'production') {\n            console.error('Can\\'t draw value axis ' + i);\n          }\n        }\n        if (showSplitLine) {\n          var colorIndex = getColorIndex(splitLines, splitLineColorsArr, i);\n          splitLines[colorIndex].push(new graphic.Polyline({\n            shape: {\n              points: points\n            }\n          }));\n        }\n        if (showSplitArea && prevPoints) {\n          var colorIndex = getColorIndex(splitAreas, splitAreaColorsArr, i - 1);\n          splitAreas[colorIndex].push(new graphic.Polygon({\n            shape: {\n              points: points.concat(prevPoints)\n            }\n          }));\n        }\n        prevPoints = points.slice().reverse();\n      }\n    }\n    var lineStyle = lineStyleModel.getLineStyle();\n    var areaStyle = areaStyleModel.getAreaStyle();\n    // Add splitArea before splitLine\n    zrUtil.each(splitAreas, function (splitAreas, idx) {\n      this.group.add(graphic.mergePath(splitAreas, {\n        style: zrUtil.defaults({\n          stroke: 'none',\n          fill: splitAreaColorsArr[idx % splitAreaColorsArr.length]\n        }, areaStyle),\n        silent: true\n      }));\n    }, this);\n    zrUtil.each(splitLines, function (splitLines, idx) {\n      this.group.add(graphic.mergePath(splitLines, {\n        style: zrUtil.defaults({\n          fill: 'none',\n          stroke: splitLineColorsArr[idx % splitLineColorsArr.length]\n        }, lineStyle),\n        silent: true\n      }));\n    }, this);\n  };\n  RadarView.type = 'radar';\n  return RadarView;\n}(ComponentView);\nexport default RadarView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Axis from '../Axis.js';\nvar IndicatorAxis = /** @class */function (_super) {\n  __extends(IndicatorAxis, _super);\n  function IndicatorAxis(dim, scale, radiusExtent) {\n    var _this = _super.call(this, dim, scale, radiusExtent) || this;\n    _this.type = 'value';\n    _this.angle = 0;\n    _this.name = '';\n    return _this;\n  }\n  return IndicatorAxis;\n}(Axis);\nexport default IndicatorAxis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// TODO clockwise\nimport IndicatorAxis from './IndicatorAxis.js';\nimport IntervalScale from '../../scale/Interval.js';\nimport * as numberUtil from '../../util/number.js';\nimport { map, each, isString, isNumber } from 'zrender/lib/core/util.js';\nimport { alignScaleTicks } from '../axisAlignTicks.js';\nimport { createBoxLayoutReference } from '../../util/layout.js';\nvar Radar = /** @class */function () {\n  function Radar(radarModel, ecModel, api) {\n    /**\n     *\n     * Radar dimensions\n     */\n    this.dimensions = [];\n    this._model = radarModel;\n    this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) {\n      var dim = 'indicator_' + idx;\n      var indicatorAxis = new IndicatorAxis(dim, new IntervalScale()\n      // (indicatorModel.get('axisType') === 'log') ? new LogScale() : new IntervalScale()\n      );\n      indicatorAxis.name = indicatorModel.get('name');\n      // Inject model and axis\n      indicatorAxis.model = indicatorModel;\n      indicatorModel.axis = indicatorAxis;\n      this.dimensions.push(dim);\n      return indicatorAxis;\n    }, this);\n    this.resize(radarModel, api);\n  }\n  Radar.prototype.getIndicatorAxes = function () {\n    return this._indicatorAxes;\n  };\n  Radar.prototype.dataToPoint = function (value, indicatorIndex) {\n    var indicatorAxis = this._indicatorAxes[indicatorIndex];\n    return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex);\n  };\n  // TODO: API should be coordToPoint([coord, indicatorIndex])\n  Radar.prototype.coordToPoint = function (coord, indicatorIndex) {\n    var indicatorAxis = this._indicatorAxes[indicatorIndex];\n    var angle = indicatorAxis.angle;\n    var x = this.cx + coord * Math.cos(angle);\n    var y = this.cy - coord * Math.sin(angle);\n    return [x, y];\n  };\n  Radar.prototype.pointToData = function (pt) {\n    var dx = pt[0] - this.cx;\n    var dy = pt[1] - this.cy;\n    var radius = Math.sqrt(dx * dx + dy * dy);\n    dx /= radius;\n    dy /= radius;\n    var radian = Math.atan2(-dy, dx);\n    // Find the closest angle\n    // FIXME index can calculated directly\n    var minRadianDiff = Infinity;\n    var closestAxis;\n    var closestAxisIdx = -1;\n    for (var i = 0; i < this._indicatorAxes.length; i++) {\n      var indicatorAxis = this._indicatorAxes[i];\n      var diff = Math.abs(radian - indicatorAxis.angle);\n      if (diff < minRadianDiff) {\n        closestAxis = indicatorAxis;\n        closestAxisIdx = i;\n        minRadianDiff = diff;\n      }\n    }\n    return [closestAxisIdx, +(closestAxis && closestAxis.coordToData(radius))];\n  };\n  Radar.prototype.resize = function (radarModel, api) {\n    var refContainer = createBoxLayoutReference(radarModel, api).refContainer;\n    var center = radarModel.get('center');\n    var viewSize = Math.min(refContainer.width, refContainer.height) / 2;\n    this.cx = numberUtil.parsePercent(center[0], refContainer.width) + refContainer.x;\n    this.cy = numberUtil.parsePercent(center[1], refContainer.height) + refContainer.y;\n    this.startAngle = radarModel.get('startAngle') * Math.PI / 180;\n    // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']`\n    var radius = radarModel.get('radius');\n    if (isString(radius) || isNumber(radius)) {\n      radius = [0, radius];\n    }\n    this.r0 = numberUtil.parsePercent(radius[0], viewSize);\n    this.r = numberUtil.parsePercent(radius[1], viewSize);\n    each(this._indicatorAxes, function (indicatorAxis, idx) {\n      indicatorAxis.setExtent(this.r0, this.r);\n      var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length;\n      // Normalize to [-PI, PI]\n      angle = Math.atan2(Math.sin(angle), Math.cos(angle));\n      indicatorAxis.angle = angle;\n    }, this);\n  };\n  Radar.prototype.update = function (ecModel, api) {\n    var indicatorAxes = this._indicatorAxes;\n    var radarModel = this._model;\n    each(indicatorAxes, function (indicatorAxis) {\n      indicatorAxis.scale.setExtent(Infinity, -Infinity);\n    });\n    ecModel.eachSeriesByType('radar', function (radarSeries, idx) {\n      if (radarSeries.get('coordinateSystem') !== 'radar'\n      // @ts-ignore\n      || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) {\n        return;\n      }\n      var data = radarSeries.getData();\n      each(indicatorAxes, function (indicatorAxis) {\n        indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim));\n      });\n    }, this);\n    var splitNumber = radarModel.get('splitNumber');\n    var dummyScale = new IntervalScale();\n    dummyScale.setExtent(0, splitNumber);\n    dummyScale.setInterval(1);\n    // Force all the axis fixing the maxSplitNumber.\n    each(indicatorAxes, function (indicatorAxis, idx) {\n      alignScaleTicks(indicatorAxis.scale, indicatorAxis.model, dummyScale);\n    });\n  };\n  Radar.prototype.convertToPixel = function (ecModel, finder, value) {\n    console.warn('Not implemented.');\n    return null;\n  };\n  Radar.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n    console.warn('Not implemented.');\n    return null;\n  };\n  Radar.prototype.containPoint = function (point) {\n    console.warn('Not implemented.');\n    return false;\n  };\n  Radar.create = function (ecModel, api) {\n    var radarList = [];\n    ecModel.eachComponent('radar', function (radarModel) {\n      var radar = new Radar(radarModel, ecModel, api);\n      radarList.push(radar);\n      radarModel.coordinateSystem = radar;\n    });\n    ecModel.eachSeriesByType('radar', function (radarSeries) {\n      if (radarSeries.get('coordinateSystem') === 'radar') {\n        // Inject coordinate system\n        // @ts-ignore\n        radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0];\n      }\n    });\n    return radarList;\n  };\n  /**\n   * Radar dimensions is based on the data\n   */\n  Radar.dimensions = [];\n  return Radar;\n}();\nexport default Radar;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport RadarModel from '../../coord/radar/RadarModel.js';\nimport RadarView from './RadarView.js';\nimport Radar from '../../coord/radar/Radar.js';\nexport function install(registers) {\n  registers.registerCoordinateSystem('radar', Radar);\n  registers.registerComponentModel(RadarModel);\n  registers.registerComponentView(RadarView);\n  registers.registerVisual({\n    seriesType: 'radar',\n    reset: function (seriesModel) {\n      var data = seriesModel.getData();\n      // itemVisual symbol is for selected data\n      data.each(function (idx) {\n        data.setItemVisual(idx, 'legendIcon', 'roundRect');\n      });\n      // visual is for unselected data\n      data.setVisual('legendIcon', 'roundRect');\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport radarLayout from '../radar/radarLayout.js';\nimport dataFilter from '../../processor/dataFilter.js';\nimport backwardCompat from '../radar/backwardCompat.js';\nimport RadarView from './RadarView.js';\nimport RadarSeriesModel from './RadarSeries.js';\nimport { install as installRadarComponent } from '../../component/radar/install.js';\nexport function install(registers) {\n  use(installRadarComponent);\n  registers.registerChartView(RadarView);\n  registers.registerSeriesModel(RadarSeriesModel);\n  registers.registerLayout(radarLayout);\n  registers.registerProcessor(dataFilter('radar'));\n  registers.registerPreprocessor(backwardCompat);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as echarts from '../../core/echarts.js';\nimport { noop } from 'zrender/lib/core/util.js';\nimport { makeInner } from '../../util/model.js';\nvar inner = makeInner();\nexport function take(zr, resourceKey, userKey) {\n  inner(zr)[resourceKey] = userKey;\n}\nexport function release(zr, resourceKey, userKey) {\n  var store = inner(zr);\n  var uKey = store[resourceKey];\n  if (uKey === userKey) {\n    store[resourceKey] = null;\n  }\n}\nexport function isTaken(zr, resourceKey) {\n  return !!inner(zr)[resourceKey];\n}\n/**\n * payload: {\n *     type: 'takeGlobalCursor',\n *     key: 'dataZoomSelect', or 'brush', or ...,\n *         If no userKey, release global cursor.\n * }\n */\n// TODO: SELF REGISTERED.\necharts.registerAction({\n  type: 'takeGlobalCursor',\n  event: 'globalCursorTaken',\n  update: 'update'\n}, noop);", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { retrieveZInfo } from '../../util/graphic.js';\nvar IRRELEVANT_EXCLUDES = {\n  'axisPointer': 1,\n  'tooltip': 1,\n  'brush': 1\n};\n/**\n * Used on roam/brush triggering determination.\n * This is to avoid that: mouse clicking on an elements that is over geo or graph,\n * but roam is triggered unexpectedly.\n */\nexport function onIrrelevantElement(e, api, targetComponent) {\n  var eventElComponent = api.getComponentByElement(e.topTarget);\n  if (!eventElComponent || eventElComponent === targetComponent || IRRELEVANT_EXCLUDES.hasOwnProperty(eventElComponent.mainType)) {\n    return false;\n  }\n  // At present the `true` return is conservative. That is, the caller, such as a RoamController,\n  // is more likely to get a `false` return and start a roam behavior, becuase even if the\n  // `model.coordinateSystem` does not exist, the `e.topTarget` may be also a relevant element,\n  // such as axis split line/area or series elements, where roam should be available. Otherwise,\n  // if a dataZoom-served cartesian is full of series elements, the dataZoom-roaming can hardly\n  // be triggered.\n  var eventElCoordSys = eventElComponent.coordinateSystem;\n  // If eventElComponent is axisModel, it works only if it is injected with coordinateSystem.\n  if (!eventElCoordSys || eventElCoordSys.model === targetComponent) {\n    return false;\n  }\n  // e.g., if a cartesian is covered by a graph, the graph has a higher presedence in roam.\n  // A potential bad case is that RoamController does not prevent the cartesian from handling zr\n  // event, such as click and hovering, but it's fine so far.\n  // Aslo be conservative, if equals, return false.\n  var eventElCmptZInfo = retrieveZInfo(eventElComponent);\n  var targetCmptZInfo = retrieveZInfo(targetComponent);\n  if ((eventElCmptZInfo.zlevel - targetCmptZInfo.zlevel || eventElCmptZInfo.z - targetCmptZInfo.z) <= 0) {\n    return false;\n  }\n  return true;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Eventful from 'zrender/lib/core/Eventful.js';\nimport * as eventTool from 'zrender/lib/core/event.js';\nimport * as interactionMutex from './interactionMutex.js';\nimport { isString, bind, defaults, extend, retrieve2 } from 'zrender/lib/core/util.js';\nimport { makeInner } from '../../util/model.js';\nimport { retrieveZInfo } from '../../util/graphic.js';\nimport { onIrrelevantElement } from './cursorHelper.js';\n;\n/**\n * An manager of zoom and pan(darg) hehavior.\n * But it is not responsible for updating the view, since view updates vary and can\n * not be handled in a uniform way.\n *\n * Note: regarding view updates:\n *  - Transformabe views typically use `coord/View` (e.g., geo and series.graph roaming).\n *    Some commonly used view update logic has been organized into `roamHelper.ts`.\n *  - Non-transformable views handle updates themselves, possibly involving re-layout,\n *    (e.g., treemap).\n *  - Some scenarios do not require transformation (e.g., dataZoom roaming for cartesian,\n *    brush component).\n */\nvar RoamController = /** @class */function (_super) {\n  __extends(RoamController, _super);\n  function RoamController(zr) {\n    var _this = _super.call(this) || this;\n    _this._zr = zr;\n    // Avoid two roamController bind the same handler\n    var mousedownHandler = bind(_this._mousedownHandler, _this);\n    var mousemoveHandler = bind(_this._mousemoveHandler, _this);\n    var mouseupHandler = bind(_this._mouseupHandler, _this);\n    var mousewheelHandler = bind(_this._mousewheelHandler, _this);\n    var pinchHandler = bind(_this._pinchHandler, _this);\n    /**\n     * Notice:\n     *  - only enable needed types. For example, if 'zoom'\n     *    is not needed, 'zoom' should not be enabled, otherwise\n     *    default mousewheel behaviour (scroll page) will be disabled.\n     *  - This method is idempotent.\n     */\n    _this.enable = function (controlType, rawOpt) {\n      var zInfo = rawOpt.zInfo;\n      var _a = retrieveZInfo(zInfo.component),\n        z = _a.z,\n        zlevel = _a.zlevel;\n      var zInfoParsed = {\n        component: zInfo.component,\n        z: z,\n        zlevel: zlevel,\n        // By default roam controller is the lowest z2 comparing to other elememts in a component.\n        z2: retrieve2(zInfo.z2, -Infinity)\n      };\n      var triggerInfo = extend({}, rawOpt.triggerInfo);\n      this._opt = defaults(extend({}, rawOpt), {\n        zoomOnMouseWheel: true,\n        moveOnMouseMove: true,\n        // By default, wheel do not trigger move.\n        moveOnMouseWheel: false,\n        preventDefaultMouseMove: true,\n        zInfoParsed: zInfoParsed,\n        triggerInfo: triggerInfo\n      });\n      if (controlType == null) {\n        controlType = true;\n      }\n      // A handy optimization for repeatedly calling `enable` during roaming.\n      // Assert `disable` is only affected by `controlType`.\n      if (!this._enabled || this._controlType !== controlType) {\n        this._enabled = true;\n        // Disable previous first\n        this.disable();\n        if (controlType === true || controlType === 'move' || controlType === 'pan') {\n          addRoamZrListener(zr, 'mousedown', mousedownHandler, zInfoParsed);\n          addRoamZrListener(zr, 'mousemove', mousemoveHandler, zInfoParsed);\n          addRoamZrListener(zr, 'mouseup', mouseupHandler, zInfoParsed);\n        }\n        if (controlType === true || controlType === 'scale' || controlType === 'zoom') {\n          addRoamZrListener(zr, 'mousewheel', mousewheelHandler, zInfoParsed);\n          addRoamZrListener(zr, 'pinch', pinchHandler, zInfoParsed);\n        }\n      }\n    };\n    _this.disable = function () {\n      this._enabled = false;\n      removeRoamZrListener(zr, 'mousedown', mousedownHandler);\n      removeRoamZrListener(zr, 'mousemove', mousemoveHandler);\n      removeRoamZrListener(zr, 'mouseup', mouseupHandler);\n      removeRoamZrListener(zr, 'mousewheel', mousewheelHandler);\n      removeRoamZrListener(zr, 'pinch', pinchHandler);\n    };\n    return _this;\n  }\n  RoamController.prototype.isDragging = function () {\n    return this._dragging;\n  };\n  RoamController.prototype.isPinching = function () {\n    return this._pinching;\n  };\n  RoamController.prototype._checkPointer = function (e, x, y) {\n    var opt = this._opt;\n    var zInfoParsed = opt.zInfoParsed;\n    if (onIrrelevantElement(e, opt.api, zInfoParsed.component)) {\n      return false;\n    }\n    ;\n    var triggerInfo = opt.triggerInfo;\n    var roamTrigger = triggerInfo.roamTrigger;\n    var inArea = false;\n    if (roamTrigger === 'global') {\n      inArea = true;\n    }\n    if (!inArea) {\n      inArea = triggerInfo.isInSelf(e, x, y);\n    }\n    if (inArea && triggerInfo.isInClip && !triggerInfo.isInClip(e, x, y)) {\n      inArea = false;\n    }\n    return inArea;\n  };\n  RoamController.prototype._decideCursorStyle = function (e, x, y, forReverse) {\n    // If this cursor style decision is not strictly consistent with zrender,\n    // it's fine - zr will set the cursor on the next mousemove.\n    // This `grab` cursor style should take the lowest precedence. If the hovring element already\n    // have a cursor, zrender will set it to be non-'default' before entering this handler.\n    // (note, e.target is never silent, e.topTarget can be silent be irrelevant.)\n    var target = e.target;\n    if (!target && this._checkPointer(e, x, y)) {\n      // To indicate users that this area is draggable, otherwise users probably cannot kwown\n      // that when hovering out of the shape but still inside the bounding rect.\n      return 'grab';\n    }\n    if (forReverse) {\n      return target && target.cursor || 'default';\n    }\n  };\n  RoamController.prototype.dispose = function () {\n    this.disable();\n  };\n  RoamController.prototype._mousedownHandler = function (e) {\n    if (eventTool.isMiddleOrRightButtonOnMouseUpDown(e) || eventConsumed(e)) {\n      return;\n    }\n    var el = e.target;\n    while (el) {\n      if (el.draggable) {\n        return;\n      }\n      // check if host is draggable\n      el = el.__hostTarget || el.parent;\n    }\n    var x = e.offsetX;\n    var y = e.offsetY;\n    // To determine dragging start, only by checking on mosedown, but not mousemove.\n    // Mouse can be out of target when mouse moving.\n    if (this._checkPointer(e, x, y)) {\n      this._x = x;\n      this._y = y;\n      this._dragging = true;\n    }\n  };\n  RoamController.prototype._mousemoveHandler = function (e) {\n    var zr = this._zr;\n    if (e.gestureEvent === 'pinch' || interactionMutex.isTaken(zr, 'globalPan') || eventConsumed(e)) {\n      return;\n    }\n    var x = e.offsetX;\n    var y = e.offsetY;\n    if (!this._dragging || !isAvailableBehavior('moveOnMouseMove', e, this._opt)) {\n      var cursorStyle = this._decideCursorStyle(e, x, y, false);\n      if (cursorStyle) {\n        zr.setCursorStyle(cursorStyle);\n      }\n      return;\n    }\n    zr.setCursorStyle('grabbing');\n    var oldX = this._x;\n    var oldY = this._y;\n    var dx = x - oldX;\n    var dy = y - oldY;\n    this._x = x;\n    this._y = y;\n    if (this._opt.preventDefaultMouseMove) {\n      eventTool.stop(e.event);\n    }\n    e.__ecRoamConsumed = true;\n    trigger(this, 'pan', 'moveOnMouseMove', e, {\n      dx: dx,\n      dy: dy,\n      oldX: oldX,\n      oldY: oldY,\n      newX: x,\n      newY: y,\n      isAvailableBehavior: null\n    });\n  };\n  RoamController.prototype._mouseupHandler = function (e) {\n    if (eventConsumed(e)) {\n      return;\n    }\n    var zr = this._zr;\n    if (!eventTool.isMiddleOrRightButtonOnMouseUpDown(e)) {\n      this._dragging = false;\n      var cursorStyle = this._decideCursorStyle(e, e.offsetX, e.offsetY, true);\n      if (cursorStyle) {\n        zr.setCursorStyle(cursorStyle);\n      }\n    }\n  };\n  RoamController.prototype._mousewheelHandler = function (e) {\n    if (eventConsumed(e)) {\n      return;\n    }\n    var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt);\n    var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt);\n    var wheelDelta = e.wheelDelta;\n    var absWheelDeltaDelta = Math.abs(wheelDelta);\n    var originX = e.offsetX;\n    var originY = e.offsetY;\n    // wheelDelta maybe -0 in chrome mac.\n    if (wheelDelta === 0 || !shouldZoom && !shouldMove) {\n      return;\n    }\n    // If both `shouldZoom` and `shouldMove` is true, trigger\n    // their event both, and the final behavior is determined\n    // by event listener themselves.\n    if (shouldZoom) {\n      // Convenience:\n      // Mac and VM Windows on Mac: scroll up: zoom out.\n      // Windows: scroll up: zoom in.\n      // FIXME: Should do more test in different environment.\n      // wheelDelta is too complicated in difference nvironment\n      // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel),\n      // although it has been normallized by zrender.\n      // wheelDelta of mouse wheel is bigger than touch pad.\n      var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1;\n      var scale = wheelDelta > 0 ? factor : 1 / factor;\n      this._checkTriggerMoveZoom(this, 'zoom', 'zoomOnMouseWheel', e, {\n        scale: scale,\n        originX: originX,\n        originY: originY,\n        isAvailableBehavior: null\n      });\n    }\n    if (shouldMove) {\n      // FIXME: Should do more test in different environment.\n      var absDelta = Math.abs(wheelDelta);\n      // wheelDelta of mouse wheel is bigger than touch pad.\n      var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05);\n      this._checkTriggerMoveZoom(this, 'scrollMove', 'moveOnMouseWheel', e, {\n        scrollDelta: scrollDelta,\n        originX: originX,\n        originY: originY,\n        isAvailableBehavior: null\n      });\n    }\n  };\n  RoamController.prototype._pinchHandler = function (e) {\n    if (interactionMutex.isTaken(this._zr, 'globalPan') || eventConsumed(e)) {\n      return;\n    }\n    var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1;\n    this._checkTriggerMoveZoom(this, 'zoom', null, e, {\n      scale: scale,\n      originX: e.pinchX,\n      originY: e.pinchY,\n      isAvailableBehavior: null\n    });\n  };\n  RoamController.prototype._checkTriggerMoveZoom = function (controller, eventName, behaviorToCheck, e, contollerEvent) {\n    if (controller._checkPointer(e, contollerEvent.originX, contollerEvent.originY)) {\n      // When mouse is out of roamController rect,\n      // default befavoius should not be be disabled, otherwise\n      // page sliding is disabled, contrary to expectation.\n      eventTool.stop(e.event);\n      e.__ecRoamConsumed = true;\n      trigger(controller, eventName, behaviorToCheck, e, contollerEvent);\n    }\n  };\n  return RoamController;\n}(Eventful);\nfunction eventConsumed(e) {\n  return e.__ecRoamConsumed;\n}\nvar innerZrStore = makeInner();\nfunction ensureZrStore(zr) {\n  var store = innerZrStore(zr);\n  store.roam = store.roam || {};\n  store.uniform = store.uniform || {};\n  return store;\n}\n/**\n * Listeners are sorted by z2/z/zlevel in descending order.\n * This decides the precedence between different roam controllers if they are overlapped.\n *\n * [MEMO]: It's not easy to perfectly reconcile the conflicts caused by overlap.\n *  - Consider cases:\n *    - Multiple roam controllers overlapped.\n *      - Usually only the topmost can trigger roam.\n *    - Roam controllers overlap with other zr elements:\n *      - zr elements are relevant or irrelevent to the host of the roam controller. e.g., axis split line\n *        or series elements is relevant to a cartesian and should trigger roam.\n *      - zr elements is above or below the roam controller host, which affects the precedence of interaction.\n *      - zr elements may not silent only for triggering tooltip by hovering, which is available to roam;\n *        or may not silent for click, where roam is not preferable.\n *  - Approach - `addRoamZrListener+pointerChecker+onIrrelevantElement` (currently used):\n *    - Resolve the precedence between different roam controllers\n *    - But cannot prevent the handling on other zr elements that under the roam controller in z-order.\n *  - Approach - \"use an invisible zr elements to receive the zr events to trigger roam\":\n *    - More complicated in impl.\n *    - May cause bad cases where zr event cannot be receive due to other non-silient zr elements covering it.\n */\nfunction addRoamZrListener(zr, eventType, listener, zInfoParsed) {\n  var store = ensureZrStore(zr);\n  var roam = store.roam;\n  var listenerList = roam[eventType] = roam[eventType] || [];\n  var idx = 0;\n  for (; idx < listenerList.length; idx++) {\n    var currZInfo = listenerList[idx].zInfoParsed;\n    if ((currZInfo.zlevel - zInfoParsed.zlevel || currZInfo.z - zInfoParsed.z || currZInfo.z2 - zInfoParsed.z2\n    // If all equals, the latter added one has a higher precedence.\n    ) <= 0) {\n      break;\n    }\n  }\n  listenerList.splice(idx, 0, {\n    listener: listener,\n    zInfoParsed: zInfoParsed\n  });\n  ensureUniformListener(zr, eventType);\n}\nfunction removeRoamZrListener(zr, eventType, listener) {\n  var store = ensureZrStore(zr);\n  var listenerList = store.roam[eventType] || [];\n  for (var idx = 0; idx < listenerList.length; idx++) {\n    if (listenerList[idx].listener === listener) {\n      listenerList.splice(idx, 1);\n      if (!listenerList.length) {\n        removeUniformListener(zr, eventType);\n      }\n      return;\n    }\n  }\n}\nfunction ensureUniformListener(zr, eventType) {\n  var store = ensureZrStore(zr);\n  if (!store.uniform[eventType]) {\n    zr.on(eventType, store.uniform[eventType] = function (event) {\n      var listenerList = store.roam[eventType];\n      if (listenerList) {\n        for (var i = 0; i < listenerList.length; i++) {\n          listenerList[i].listener(event);\n        }\n      }\n    });\n  }\n}\nfunction removeUniformListener(zr, eventType) {\n  var store = ensureZrStore(zr);\n  var uniform = store.uniform;\n  if (uniform[eventType]) {\n    zr.off(eventType, uniform[eventType]);\n    uniform[eventType] = null;\n  }\n}\nfunction trigger(controller, eventName, behaviorToCheck, e, contollerEvent) {\n  // Also provide behavior checker for event listener, for some case that\n  // multiple components share one listener.\n  contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e);\n  // TODO should not have type issue.\n  controller.trigger(eventName, contollerEvent);\n}\n// settings: {\n//     zoomOnMouseWheel\n//     moveOnMouseMove\n//     moveOnMouseWheel\n// }\n// The value can be: true / false / 'shift' / 'ctrl' / 'alt'.\nfunction isAvailableBehavior(behaviorToCheck, e, settings) {\n  var setting = settings[behaviorToCheck];\n  return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']);\n}\nexport default RoamController;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { BoundingRect } from '../../util/graphic.js';\n/**\n * [CAVEAT] `updateViewOnPan` and `updateViewOnZoom` modifies the group transform directly,\n *  but the 'center' and 'zoom' in echarts option and 'View' coordinate system are not updated yet,\n *  which must be performed later in 'xxxRoam' action by calling `updateCenterAndZoom`.\n * @see {updateCenterAndZoomInAction}\n */\nexport function updateViewOnPan(controllerHost, dx, dy) {\n  var target = controllerHost.target;\n  target.x += dx;\n  target.y += dy;\n  target.dirty();\n}\nexport function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) {\n  var target = controllerHost.target;\n  var zoomLimit = controllerHost.zoomLimit;\n  var newZoom = controllerHost.zoom = controllerHost.zoom || 1;\n  newZoom *= zoomDelta;\n  newZoom = clampByZoomLimit(newZoom, zoomLimit);\n  var zoomScale = newZoom / controllerHost.zoom;\n  controllerHost.zoom = newZoom;\n  zoomTransformableByOrigin(target, zoomX, zoomY, zoomScale);\n  target.dirty();\n}\n/**\n * A abstraction for some similar impl in roaming.\n */\nexport function updateController(seriesModel, api, pointerCheckerEl, controller, controllerHost, clipRect) {\n  var tmpRect = new BoundingRect(0, 0, 0, 0);\n  controller.enable(seriesModel.get('roam'), {\n    api: api,\n    zInfo: {\n      component: seriesModel\n    },\n    triggerInfo: {\n      roamTrigger: seriesModel.get('roamTrigger'),\n      isInSelf: function (e, x, y) {\n        tmpRect.copy(pointerCheckerEl.getBoundingRect());\n        tmpRect.applyTransform(pointerCheckerEl.getComputedTransform());\n        return tmpRect.contain(x, y);\n      },\n      isInClip: function (e, x, y) {\n        return !clipRect || clipRect.contain(x, y);\n      }\n    }\n  });\n  controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n  var coordinate = seriesModel.coordinateSystem;\n  controllerHost.zoom = coordinate ? coordinate.getZoom() : 1;\n  var type = seriesModel.subType + 'Roam';\n  controller.off('pan').off('zoom').on('pan', function (e) {\n    updateViewOnPan(controllerHost, e.dx, e.dy);\n    api.dispatchAction({\n      seriesId: seriesModel.id,\n      type: type,\n      dx: e.dx,\n      dy: e.dy\n    });\n  }).on('zoom', function (e) {\n    /**\n     * FIXME: should do nothing except `api.dispatchAction` here, the other logic\n     *  should be performed in the action handler and `updateTransform`; otherwise,\n     *  they are inconsistent if user triggers this action explicitly.\n     */\n    updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n    api.dispatchAction({\n      seriesId: seriesModel.id,\n      type: type,\n      zoom: e.scale,\n      originX: e.originX,\n      originY: e.originY\n    });\n    // Only update label layout on zoom\n    api.updateLabelLayout();\n  });\n}\nfunction getCenterCoord(view, point) {\n  // Use projected coord as center because it's linear.\n  return view.pointToProjected ? view.pointToProjected(point) : view.pointToData(point);\n}\n/**\n * Should be called only in action handler.\n * @see {updateViewOnPan|updateViewOnZoom}\n */\nexport function updateCenterAndZoomInAction(view, payload, zoomLimit) {\n  var previousZoom = view.getZoom();\n  var center = view.getCenter();\n  var deltaZoom = payload.zoom;\n  var point = view.projectedToPoint ? view.projectedToPoint(center) : view.dataToPoint(center);\n  if (payload.dx != null && payload.dy != null) {\n    point[0] -= payload.dx;\n    point[1] -= payload.dy;\n    view.setCenter(getCenterCoord(view, point));\n  }\n  if (deltaZoom != null) {\n    deltaZoom = clampByZoomLimit(previousZoom * deltaZoom, zoomLimit) / previousZoom;\n    zoomTransformableByOrigin(view, payload.originX, payload.originY, deltaZoom);\n    view.updateTransform();\n    // [NOTICE] Tricky: `getCetnerCoord` uses `this.invTransform` modified by the `updateTransform` above.\n    view.setCenter(getCenterCoord(view, point));\n    view.setZoom(deltaZoom * previousZoom);\n  }\n  return {\n    center: view.getCenter(),\n    zoom: view.getZoom()\n  };\n}\nfunction zoomTransformableByOrigin(target, originX, originY, deltaZoom) {\n  // Keep the mouse center when scaling.\n  target.x -= (originX - target.x) * (deltaZoom - 1);\n  target.y -= (originY - target.y) * (deltaZoom - 1);\n  target.scaleX *= deltaZoom;\n  target.scaleY *= deltaZoom;\n}\nexport function clampByZoomLimit(zoom, zoomLimit) {\n  if (zoomLimit) {\n    var zoomMin = zoomLimit.min || 0;\n    var zoomMax = zoomLimit.max || Infinity;\n    zoom = Math.max(Math.min(zoomMax, zoom), zoomMin);\n  }\n  return zoom;\n}", "import { isString } from '../core/util.js';\nexport function parseXML(svg) {\n    if (isString(svg)) {\n        var parser = new DOMParser();\n        svg = parser.parseFromString(svg, 'text/xml');\n    }\n    var svgNode = svg;\n    if (svgNode.nodeType === 9) {\n        svgNode = svgNode.firstChild;\n    }\n    while (svgNode.nodeName.toLowerCase() !== 'svg' || svgNode.nodeType !== 1) {\n        svgNode = svgNode.nextSibling;\n    }\n    return svgNode;\n}\n", "import Group from '../graphic/Group.js';\nimport ZRImage from '../graphic/Image.js';\nimport Circle from '../graphic/shape/Circle.js';\nimport Rect from '../graphic/shape/Rect.js';\nimport Ellipse from '../graphic/shape/Ellipse.js';\nimport Line from '../graphic/shape/Line.js';\nimport Polygon from '../graphic/shape/Polygon.js';\nimport Polyline from '../graphic/shape/Polyline.js';\nimport * as matrix from '../core/matrix.js';\nimport { createFromString } from './path.js';\nimport { defaults, trim, each, map, keys, hasOwn } from '../core/util.js';\nimport LinearGradient from '../graphic/LinearGradient.js';\nimport RadialGradient from '../graphic/RadialGradient.js';\nimport TSpan from '../graphic/TSpan.js';\nimport { parseXML } from './parseXML.js';\nimport * as colorTool from './color.js';\n;\nvar nodeParsers;\nvar INHERITABLE_STYLE_ATTRIBUTES_MAP = {\n    'fill': 'fill',\n    'stroke': 'stroke',\n    'stroke-width': 'lineWidth',\n    'opacity': 'opacity',\n    'fill-opacity': 'fillOpacity',\n    'stroke-opacity': 'strokeOpacity',\n    'stroke-dasharray': 'lineDash',\n    'stroke-dashoffset': 'lineDashOffset',\n    'stroke-linecap': 'lineCap',\n    'stroke-linejoin': 'lineJoin',\n    'stroke-miterlimit': 'miterLimit',\n    'font-family': 'fontFamily',\n    'font-size': 'fontSize',\n    'font-style': 'fontStyle',\n    'font-weight': 'fontWeight',\n    'text-anchor': 'textAlign',\n    'visibility': 'visibility',\n    'display': 'display'\n};\nvar INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS = keys(INHERITABLE_STYLE_ATTRIBUTES_MAP);\nvar SELF_STYLE_ATTRIBUTES_MAP = {\n    'alignment-baseline': 'textBaseline',\n    'stop-color': 'stopColor'\n};\nvar SELF_STYLE_ATTRIBUTES_MAP_KEYS = keys(SELF_STYLE_ATTRIBUTES_MAP);\nvar SVGParser = (function () {\n    function SVGParser() {\n        this._defs = {};\n        this._root = null;\n    }\n    SVGParser.prototype.parse = function (xml, opt) {\n        opt = opt || {};\n        var svg = parseXML(xml);\n        if (process.env.NODE_ENV !== 'production') {\n            if (!svg) {\n                throw new Error('Illegal svg');\n            }\n        }\n        this._defsUsePending = [];\n        var root = new Group();\n        this._root = root;\n        var named = [];\n        var viewBox = svg.getAttribute('viewBox') || '';\n        var width = parseFloat((svg.getAttribute('width') || opt.width));\n        var height = parseFloat((svg.getAttribute('height') || opt.height));\n        isNaN(width) && (width = null);\n        isNaN(height) && (height = null);\n        parseAttributes(svg, root, null, true, false);\n        var child = svg.firstChild;\n        while (child) {\n            this._parseNode(child, root, named, null, false, false);\n            child = child.nextSibling;\n        }\n        applyDefs(this._defs, this._defsUsePending);\n        this._defsUsePending = [];\n        var viewBoxRect;\n        var viewBoxTransform;\n        if (viewBox) {\n            var viewBoxArr = splitNumberSequence(viewBox);\n            if (viewBoxArr.length >= 4) {\n                viewBoxRect = {\n                    x: parseFloat((viewBoxArr[0] || 0)),\n                    y: parseFloat((viewBoxArr[1] || 0)),\n                    width: parseFloat(viewBoxArr[2]),\n                    height: parseFloat(viewBoxArr[3])\n                };\n            }\n        }\n        if (viewBoxRect && width != null && height != null) {\n            viewBoxTransform = makeViewBoxTransform(viewBoxRect, { x: 0, y: 0, width: width, height: height });\n            if (!opt.ignoreViewBox) {\n                var elRoot = root;\n                root = new Group();\n                root.add(elRoot);\n                elRoot.scaleX = elRoot.scaleY = viewBoxTransform.scale;\n                elRoot.x = viewBoxTransform.x;\n                elRoot.y = viewBoxTransform.y;\n            }\n        }\n        if (!opt.ignoreRootClip && width != null && height != null) {\n            root.setClipPath(new Rect({\n                shape: { x: 0, y: 0, width: width, height: height }\n            }));\n        }\n        return {\n            root: root,\n            width: width,\n            height: height,\n            viewBoxRect: viewBoxRect,\n            viewBoxTransform: viewBoxTransform,\n            named: named\n        };\n    };\n    SVGParser.prototype._parseNode = function (xmlNode, parentGroup, named, namedFrom, isInDefs, isInText) {\n        var nodeName = xmlNode.nodeName.toLowerCase();\n        var el;\n        var namedFromForSub = namedFrom;\n        if (nodeName === 'defs') {\n            isInDefs = true;\n        }\n        if (nodeName === 'text') {\n            isInText = true;\n        }\n        if (nodeName === 'defs' || nodeName === 'switch') {\n            el = parentGroup;\n        }\n        else {\n            if (!isInDefs) {\n                var parser_1 = nodeParsers[nodeName];\n                if (parser_1 && hasOwn(nodeParsers, nodeName)) {\n                    el = parser_1.call(this, xmlNode, parentGroup);\n                    var nameAttr = xmlNode.getAttribute('name');\n                    if (nameAttr) {\n                        var newNamed = {\n                            name: nameAttr,\n                            namedFrom: null,\n                            svgNodeTagLower: nodeName,\n                            el: el\n                        };\n                        named.push(newNamed);\n                        if (nodeName === 'g') {\n                            namedFromForSub = newNamed;\n                        }\n                    }\n                    else if (namedFrom) {\n                        named.push({\n                            name: namedFrom.name,\n                            namedFrom: namedFrom,\n                            svgNodeTagLower: nodeName,\n                            el: el\n                        });\n                    }\n                    parentGroup.add(el);\n                }\n            }\n            var parser = paintServerParsers[nodeName];\n            if (parser && hasOwn(paintServerParsers, nodeName)) {\n                var def = parser.call(this, xmlNode);\n                var id = xmlNode.getAttribute('id');\n                if (id) {\n                    this._defs[id] = def;\n                }\n            }\n        }\n        if (el && el.isGroup) {\n            var child = xmlNode.firstChild;\n            while (child) {\n                if (child.nodeType === 1) {\n                    this._parseNode(child, el, named, namedFromForSub, isInDefs, isInText);\n                }\n                else if (child.nodeType === 3 && isInText) {\n                    this._parseText(child, el);\n                }\n                child = child.nextSibling;\n            }\n        }\n    };\n    SVGParser.prototype._parseText = function (xmlNode, parentGroup) {\n        var text = new TSpan({\n            style: {\n                text: xmlNode.textContent\n            },\n            silent: true,\n            x: this._textX || 0,\n            y: this._textY || 0\n        });\n        inheritStyle(parentGroup, text);\n        parseAttributes(xmlNode, text, this._defsUsePending, false, false);\n        applyTextAlignment(text, parentGroup);\n        var textStyle = text.style;\n        var fontSize = textStyle.fontSize;\n        if (fontSize && fontSize < 9) {\n            textStyle.fontSize = 9;\n            text.scaleX *= fontSize / 9;\n            text.scaleY *= fontSize / 9;\n        }\n        var font = (textStyle.fontSize || textStyle.fontFamily) && [\n            textStyle.fontStyle,\n            textStyle.fontWeight,\n            (textStyle.fontSize || 12) + 'px',\n            textStyle.fontFamily || 'sans-serif'\n        ].join(' ');\n        textStyle.font = font;\n        var rect = text.getBoundingRect();\n        this._textX += rect.width;\n        parentGroup.add(text);\n        return text;\n    };\n    SVGParser.internalField = (function () {\n        nodeParsers = {\n            'g': function (xmlNode, parentGroup) {\n                var g = new Group();\n                inheritStyle(parentGroup, g);\n                parseAttributes(xmlNode, g, this._defsUsePending, false, false);\n                return g;\n            },\n            'rect': function (xmlNode, parentGroup) {\n                var rect = new Rect();\n                inheritStyle(parentGroup, rect);\n                parseAttributes(xmlNode, rect, this._defsUsePending, false, false);\n                rect.setShape({\n                    x: parseFloat(xmlNode.getAttribute('x') || '0'),\n                    y: parseFloat(xmlNode.getAttribute('y') || '0'),\n                    width: parseFloat(xmlNode.getAttribute('width') || '0'),\n                    height: parseFloat(xmlNode.getAttribute('height') || '0')\n                });\n                rect.silent = true;\n                return rect;\n            },\n            'circle': function (xmlNode, parentGroup) {\n                var circle = new Circle();\n                inheritStyle(parentGroup, circle);\n                parseAttributes(xmlNode, circle, this._defsUsePending, false, false);\n                circle.setShape({\n                    cx: parseFloat(xmlNode.getAttribute('cx') || '0'),\n                    cy: parseFloat(xmlNode.getAttribute('cy') || '0'),\n                    r: parseFloat(xmlNode.getAttribute('r') || '0')\n                });\n                circle.silent = true;\n                return circle;\n            },\n            'line': function (xmlNode, parentGroup) {\n                var line = new Line();\n                inheritStyle(parentGroup, line);\n                parseAttributes(xmlNode, line, this._defsUsePending, false, false);\n                line.setShape({\n                    x1: parseFloat(xmlNode.getAttribute('x1') || '0'),\n                    y1: parseFloat(xmlNode.getAttribute('y1') || '0'),\n                    x2: parseFloat(xmlNode.getAttribute('x2') || '0'),\n                    y2: parseFloat(xmlNode.getAttribute('y2') || '0')\n                });\n                line.silent = true;\n                return line;\n            },\n            'ellipse': function (xmlNode, parentGroup) {\n                var ellipse = new Ellipse();\n                inheritStyle(parentGroup, ellipse);\n                parseAttributes(xmlNode, ellipse, this._defsUsePending, false, false);\n                ellipse.setShape({\n                    cx: parseFloat(xmlNode.getAttribute('cx') || '0'),\n                    cy: parseFloat(xmlNode.getAttribute('cy') || '0'),\n                    rx: parseFloat(xmlNode.getAttribute('rx') || '0'),\n                    ry: parseFloat(xmlNode.getAttribute('ry') || '0')\n                });\n                ellipse.silent = true;\n                return ellipse;\n            },\n            'polygon': function (xmlNode, parentGroup) {\n                var pointsStr = xmlNode.getAttribute('points');\n                var pointsArr;\n                if (pointsStr) {\n                    pointsArr = parsePoints(pointsStr);\n                }\n                var polygon = new Polygon({\n                    shape: {\n                        points: pointsArr || []\n                    },\n                    silent: true\n                });\n                inheritStyle(parentGroup, polygon);\n                parseAttributes(xmlNode, polygon, this._defsUsePending, false, false);\n                return polygon;\n            },\n            'polyline': function (xmlNode, parentGroup) {\n                var pointsStr = xmlNode.getAttribute('points');\n                var pointsArr;\n                if (pointsStr) {\n                    pointsArr = parsePoints(pointsStr);\n                }\n                var polyline = new Polyline({\n                    shape: {\n                        points: pointsArr || []\n                    },\n                    silent: true\n                });\n                inheritStyle(parentGroup, polyline);\n                parseAttributes(xmlNode, polyline, this._defsUsePending, false, false);\n                return polyline;\n            },\n            'image': function (xmlNode, parentGroup) {\n                var img = new ZRImage();\n                inheritStyle(parentGroup, img);\n                parseAttributes(xmlNode, img, this._defsUsePending, false, false);\n                img.setStyle({\n                    image: xmlNode.getAttribute('xlink:href') || xmlNode.getAttribute('href'),\n                    x: +xmlNode.getAttribute('x'),\n                    y: +xmlNode.getAttribute('y'),\n                    width: +xmlNode.getAttribute('width'),\n                    height: +xmlNode.getAttribute('height')\n                });\n                img.silent = true;\n                return img;\n            },\n            'text': function (xmlNode, parentGroup) {\n                var x = xmlNode.getAttribute('x') || '0';\n                var y = xmlNode.getAttribute('y') || '0';\n                var dx = xmlNode.getAttribute('dx') || '0';\n                var dy = xmlNode.getAttribute('dy') || '0';\n                this._textX = parseFloat(x) + parseFloat(dx);\n                this._textY = parseFloat(y) + parseFloat(dy);\n                var g = new Group();\n                inheritStyle(parentGroup, g);\n                parseAttributes(xmlNode, g, this._defsUsePending, false, true);\n                return g;\n            },\n            'tspan': function (xmlNode, parentGroup) {\n                var x = xmlNode.getAttribute('x');\n                var y = xmlNode.getAttribute('y');\n                if (x != null) {\n                    this._textX = parseFloat(x);\n                }\n                if (y != null) {\n                    this._textY = parseFloat(y);\n                }\n                var dx = xmlNode.getAttribute('dx') || '0';\n                var dy = xmlNode.getAttribute('dy') || '0';\n                var g = new Group();\n                inheritStyle(parentGroup, g);\n                parseAttributes(xmlNode, g, this._defsUsePending, false, true);\n                this._textX += parseFloat(dx);\n                this._textY += parseFloat(dy);\n                return g;\n            },\n            'path': function (xmlNode, parentGroup) {\n                var d = xmlNode.getAttribute('d') || '';\n                var path = createFromString(d);\n                inheritStyle(parentGroup, path);\n                parseAttributes(xmlNode, path, this._defsUsePending, false, false);\n                path.silent = true;\n                return path;\n            }\n        };\n    })();\n    return SVGParser;\n}());\nvar paintServerParsers = {\n    'lineargradient': function (xmlNode) {\n        var x1 = parseInt(xmlNode.getAttribute('x1') || '0', 10);\n        var y1 = parseInt(xmlNode.getAttribute('y1') || '0', 10);\n        var x2 = parseInt(xmlNode.getAttribute('x2') || '10', 10);\n        var y2 = parseInt(xmlNode.getAttribute('y2') || '0', 10);\n        var gradient = new LinearGradient(x1, y1, x2, y2);\n        parsePaintServerUnit(xmlNode, gradient);\n        parseGradientColorStops(xmlNode, gradient);\n        return gradient;\n    },\n    'radialgradient': function (xmlNode) {\n        var cx = parseInt(xmlNode.getAttribute('cx') || '0', 10);\n        var cy = parseInt(xmlNode.getAttribute('cy') || '0', 10);\n        var r = parseInt(xmlNode.getAttribute('r') || '0', 10);\n        var gradient = new RadialGradient(cx, cy, r);\n        parsePaintServerUnit(xmlNode, gradient);\n        parseGradientColorStops(xmlNode, gradient);\n        return gradient;\n    }\n};\nfunction parsePaintServerUnit(xmlNode, gradient) {\n    var gradientUnits = xmlNode.getAttribute('gradientUnits');\n    if (gradientUnits === 'userSpaceOnUse') {\n        gradient.global = true;\n    }\n}\nfunction parseGradientColorStops(xmlNode, gradient) {\n    var stop = xmlNode.firstChild;\n    while (stop) {\n        if (stop.nodeType === 1\n            && stop.nodeName.toLocaleLowerCase() === 'stop') {\n            var offsetStr = stop.getAttribute('offset');\n            var offset = void 0;\n            if (offsetStr && offsetStr.indexOf('%') > 0) {\n                offset = parseInt(offsetStr, 10) / 100;\n            }\n            else if (offsetStr) {\n                offset = parseFloat(offsetStr);\n            }\n            else {\n                offset = 0;\n            }\n            var styleVals = {};\n            parseInlineStyle(stop, styleVals, styleVals);\n            var stopColor = styleVals.stopColor\n                || stop.getAttribute('stop-color')\n                || '#000000';\n            var stopOpacity = styleVals.stopOpacity\n                || stop.getAttribute('stop-opacity');\n            if (stopOpacity) {\n                var rgba = colorTool.parse(stopColor);\n                var stopColorOpacity = rgba && rgba[3];\n                if (stopColorOpacity) {\n                    rgba[3] *= colorTool.parseCssFloat(stopOpacity);\n                    stopColor = colorTool.stringify(rgba, 'rgba');\n                }\n            }\n            gradient.colorStops.push({\n                offset: offset,\n                color: stopColor\n            });\n        }\n        stop = stop.nextSibling;\n    }\n}\nfunction inheritStyle(parent, child) {\n    if (parent && parent.__inheritedStyle) {\n        if (!child.__inheritedStyle) {\n            child.__inheritedStyle = {};\n        }\n        defaults(child.__inheritedStyle, parent.__inheritedStyle);\n    }\n}\nfunction parsePoints(pointsString) {\n    var list = splitNumberSequence(pointsString);\n    var points = [];\n    for (var i = 0; i < list.length; i += 2) {\n        var x = parseFloat(list[i]);\n        var y = parseFloat(list[i + 1]);\n        points.push([x, y]);\n    }\n    return points;\n}\nfunction parseAttributes(xmlNode, el, defsUsePending, onlyInlineStyle, isTextGroup) {\n    var disp = el;\n    var inheritedStyle = disp.__inheritedStyle = disp.__inheritedStyle || {};\n    var selfStyle = {};\n    if (xmlNode.nodeType === 1) {\n        parseTransformAttribute(xmlNode, el);\n        parseInlineStyle(xmlNode, inheritedStyle, selfStyle);\n        if (!onlyInlineStyle) {\n            parseAttributeStyle(xmlNode, inheritedStyle, selfStyle);\n        }\n    }\n    disp.style = disp.style || {};\n    if (inheritedStyle.fill != null) {\n        disp.style.fill = getFillStrokeStyle(disp, 'fill', inheritedStyle.fill, defsUsePending);\n    }\n    if (inheritedStyle.stroke != null) {\n        disp.style.stroke = getFillStrokeStyle(disp, 'stroke', inheritedStyle.stroke, defsUsePending);\n    }\n    each([\n        'lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize'\n    ], function (propName) {\n        if (inheritedStyle[propName] != null) {\n            disp.style[propName] = parseFloat(inheritedStyle[propName]);\n        }\n    });\n    each([\n        'lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign'\n    ], function (propName) {\n        if (inheritedStyle[propName] != null) {\n            disp.style[propName] = inheritedStyle[propName];\n        }\n    });\n    if (isTextGroup) {\n        disp.__selfStyle = selfStyle;\n    }\n    if (inheritedStyle.lineDash) {\n        disp.style.lineDash = map(splitNumberSequence(inheritedStyle.lineDash), function (str) {\n            return parseFloat(str);\n        });\n    }\n    if (inheritedStyle.visibility === 'hidden' || inheritedStyle.visibility === 'collapse') {\n        disp.invisible = true;\n    }\n    if (inheritedStyle.display === 'none') {\n        disp.ignore = true;\n    }\n}\nfunction applyTextAlignment(text, parentGroup) {\n    var parentSelfStyle = parentGroup.__selfStyle;\n    if (parentSelfStyle) {\n        var textBaseline = parentSelfStyle.textBaseline;\n        var zrTextBaseline = textBaseline;\n        if (!textBaseline || textBaseline === 'auto') {\n            zrTextBaseline = 'alphabetic';\n        }\n        else if (textBaseline === 'baseline') {\n            zrTextBaseline = 'alphabetic';\n        }\n        else if (textBaseline === 'before-edge' || textBaseline === 'text-before-edge') {\n            zrTextBaseline = 'top';\n        }\n        else if (textBaseline === 'after-edge' || textBaseline === 'text-after-edge') {\n            zrTextBaseline = 'bottom';\n        }\n        else if (textBaseline === 'central' || textBaseline === 'mathematical') {\n            zrTextBaseline = 'middle';\n        }\n        text.style.textBaseline = zrTextBaseline;\n    }\n    var parentInheritedStyle = parentGroup.__inheritedStyle;\n    if (parentInheritedStyle) {\n        var textAlign = parentInheritedStyle.textAlign;\n        var zrTextAlign = textAlign;\n        if (textAlign) {\n            if (textAlign === 'middle') {\n                zrTextAlign = 'center';\n            }\n            text.style.textAlign = zrTextAlign;\n        }\n    }\n}\nvar urlRegex = /^url\\(\\s*#(.*?)\\)/;\nfunction getFillStrokeStyle(el, method, str, defsUsePending) {\n    var urlMatch = str && str.match(urlRegex);\n    if (urlMatch) {\n        var url = trim(urlMatch[1]);\n        defsUsePending.push([el, method, url]);\n        return;\n    }\n    if (str === 'none') {\n        str = null;\n    }\n    return str;\n}\nfunction applyDefs(defs, defsUsePending) {\n    for (var i = 0; i < defsUsePending.length; i++) {\n        var item = defsUsePending[i];\n        item[0].style[item[1]] = defs[item[2]];\n    }\n}\nvar numberReg = /-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;\nfunction splitNumberSequence(rawStr) {\n    return rawStr.match(numberReg) || [];\n}\nvar transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\\(([\\-\\s0-9\\.eE,]*)\\)/g;\nvar DEGREE_TO_ANGLE = Math.PI / 180;\nfunction parseTransformAttribute(xmlNode, node) {\n    var transform = xmlNode.getAttribute('transform');\n    if (transform) {\n        transform = transform.replace(/,/g, ' ');\n        var transformOps_1 = [];\n        var mt = null;\n        transform.replace(transformRegex, function (str, type, value) {\n            transformOps_1.push(type, value);\n            return '';\n        });\n        for (var i = transformOps_1.length - 1; i > 0; i -= 2) {\n            var value = transformOps_1[i];\n            var type = transformOps_1[i - 1];\n            var valueArr = splitNumberSequence(value);\n            mt = mt || matrix.create();\n            switch (type) {\n                case 'translate':\n                    matrix.translate(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || '0')]);\n                    break;\n                case 'scale':\n                    matrix.scale(mt, mt, [parseFloat(valueArr[0]), parseFloat(valueArr[1] || valueArr[0])]);\n                    break;\n                case 'rotate':\n                    matrix.rotate(mt, mt, -parseFloat(valueArr[0]) * DEGREE_TO_ANGLE, [\n                        parseFloat(valueArr[1] || '0'),\n                        parseFloat(valueArr[2] || '0')\n                    ]);\n                    break;\n                case 'skewX':\n                    var sx = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE);\n                    matrix.mul(mt, [1, 0, sx, 1, 0, 0], mt);\n                    break;\n                case 'skewY':\n                    var sy = Math.tan(parseFloat(valueArr[0]) * DEGREE_TO_ANGLE);\n                    matrix.mul(mt, [1, sy, 0, 1, 0, 0], mt);\n                    break;\n                case 'matrix':\n                    mt[0] = parseFloat(valueArr[0]);\n                    mt[1] = parseFloat(valueArr[1]);\n                    mt[2] = parseFloat(valueArr[2]);\n                    mt[3] = parseFloat(valueArr[3]);\n                    mt[4] = parseFloat(valueArr[4]);\n                    mt[5] = parseFloat(valueArr[5]);\n                    break;\n            }\n        }\n        node.setLocalTransform(mt);\n    }\n}\nvar styleRegex = /([^\\s:;]+)\\s*:\\s*([^:;]+)/g;\nfunction parseInlineStyle(xmlNode, inheritableStyleResult, selfStyleResult) {\n    var style = xmlNode.getAttribute('style');\n    if (!style) {\n        return;\n    }\n    styleRegex.lastIndex = 0;\n    var styleRegResult;\n    while ((styleRegResult = styleRegex.exec(style)) != null) {\n        var svgStlAttr = styleRegResult[1];\n        var zrInheritableStlAttr = hasOwn(INHERITABLE_STYLE_ATTRIBUTES_MAP, svgStlAttr)\n            ? INHERITABLE_STYLE_ATTRIBUTES_MAP[svgStlAttr]\n            : null;\n        if (zrInheritableStlAttr) {\n            inheritableStyleResult[zrInheritableStlAttr] = styleRegResult[2];\n        }\n        var zrSelfStlAttr = hasOwn(SELF_STYLE_ATTRIBUTES_MAP, svgStlAttr)\n            ? SELF_STYLE_ATTRIBUTES_MAP[svgStlAttr]\n            : null;\n        if (zrSelfStlAttr) {\n            selfStyleResult[zrSelfStlAttr] = styleRegResult[2];\n        }\n    }\n}\nfunction parseAttributeStyle(xmlNode, inheritableStyleResult, selfStyleResult) {\n    for (var i = 0; i < INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) {\n        var svgAttrName = INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS[i];\n        var attrValue = xmlNode.getAttribute(svgAttrName);\n        if (attrValue != null) {\n            inheritableStyleResult[INHERITABLE_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue;\n        }\n    }\n    for (var i = 0; i < SELF_STYLE_ATTRIBUTES_MAP_KEYS.length; i++) {\n        var svgAttrName = SELF_STYLE_ATTRIBUTES_MAP_KEYS[i];\n        var attrValue = xmlNode.getAttribute(svgAttrName);\n        if (attrValue != null) {\n            selfStyleResult[SELF_STYLE_ATTRIBUTES_MAP[svgAttrName]] = attrValue;\n        }\n    }\n}\nexport function makeViewBoxTransform(viewBoxRect, boundingRect) {\n    var scaleX = boundingRect.width / viewBoxRect.width;\n    var scaleY = boundingRect.height / viewBoxRect.height;\n    var scale = Math.min(scaleX, scaleY);\n    return {\n        scale: scale,\n        x: -(viewBoxRect.x + viewBoxRect.width / 2) * scale + (boundingRect.x + boundingRect.width / 2),\n        y: -(viewBoxRect.y + viewBoxRect.height / 2) * scale + (boundingRect.y + boundingRect.height / 2)\n    };\n}\nexport function parseSVG(xml, opt) {\n    var parser = new SVGParser();\n    return parser.parse(xml, opt);\n}\nexport { parseXML };\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { parseSVG, makeViewBoxTransform } from 'zrender/lib/tool/parseSVG.js';\nimport Group from 'zrender/lib/graphic/Group.js';\nimport Rect from 'zrender/lib/graphic/shape/Rect.js';\nimport { assert, createHashMap, each } from 'zrender/lib/core/util.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { parseXML } from 'zrender/lib/tool/parseXML.js';\nimport { GeoSVGRegion } from './Region.js';\n/**\n * \"region available\" means that: enable users to set attribute `name=\"xxx\"` on those tags\n * to make it be a region.\n * 1. region styles and its label styles can be defined in echarts opton:\n * ```js\n * geo: {\n *     regions: [{\n *         name: 'xxx',\n *         itemStyle: { ... },\n *         label: { ... }\n *     }, {\n *         ...\n *     },\n *     ...]\n * };\n * ```\n * 2. name can be duplicated in different SVG tag. All of the tags with the same name share\n * a region option. For exampel if there are two <path> representing two lung lobes. They have\n * no common parents but both of them need to display label \"lung\" inside.\n */\nvar REGION_AVAILABLE_SVG_TAG_MAP = createHashMap(['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path',\n// <text> <tspan> are also enabled because some SVG might paint text itself,\n// but still need to trigger events or tooltip.\n'text', 'tspan',\n// <g> is also enabled because this case: if multiple tags share one name\n// and need label displayed, every tags will display the name, which is not\n// expected. So we can put them into a <g name=\"xxx\">. Thereby only one label\n// displayed and located based on the bounding rect of the <g>.\n'g']);\nvar GeoSVGResource = /** @class */function () {\n  function GeoSVGResource(mapName, svg) {\n    this.type = 'geoSVG';\n    // All used graphics. key: hostKey, value: root\n    this._usedGraphicMap = createHashMap();\n    // All unused graphics.\n    this._freedGraphics = [];\n    this._mapName = mapName;\n    // Only perform parse to XML object here, which might be time\n    // consiming for large SVG.\n    // Although convert XML to zrender element is also time consiming,\n    // if we do it here, the clone of zrender elements has to be\n    // required. So we do it once for each geo instance, util real\n    // performance issues call for optimizing it.\n    this._parsedXML = parseXML(svg);\n  }\n  GeoSVGResource.prototype.load = function /* nameMap: NameMap */\n  () {\n    // In the \"load\" stage, graphic need to be built to\n    // get boundingRect for geo coordinate system.\n    var firstGraphic = this._firstGraphic;\n    // Create the return data structure only when first graphic created.\n    // Because they will be used in geo coordinate system update stage,\n    // and `regions` will be mounted at `geo` coordinate system,\n    // in which there is no \"view\" info, so that it should better not to\n    // make references to graphic elements.\n    if (!firstGraphic) {\n      firstGraphic = this._firstGraphic = this._buildGraphic(this._parsedXML);\n      this._freedGraphics.push(firstGraphic);\n      this._boundingRect = this._firstGraphic.boundingRect.clone();\n      // PENDING: `nameMap` will not be supported until some real requirement come.\n      // if (nameMap) {\n      //     named = applyNameMap(named, nameMap);\n      // }\n      var _a = createRegions(firstGraphic.named),\n        regions = _a.regions,\n        regionsMap = _a.regionsMap;\n      this._regions = regions;\n      this._regionsMap = regionsMap;\n    }\n    return {\n      boundingRect: this._boundingRect,\n      regions: this._regions,\n      regionsMap: this._regionsMap\n    };\n  };\n  GeoSVGResource.prototype._buildGraphic = function (svgXML) {\n    var result;\n    var rootFromParse;\n    try {\n      result = svgXML && parseSVG(svgXML, {\n        ignoreViewBox: true,\n        ignoreRootClip: true\n      }) || {};\n      rootFromParse = result.root;\n      assert(rootFromParse != null);\n    } catch (e) {\n      throw new Error('Invalid svg format\\n' + e.message);\n    }\n    // Note: we keep the covenant that the root has no transform. So always add an extra root.\n    var root = new Group();\n    root.add(rootFromParse);\n    root.isGeoSVGGraphicRoot = true;\n    // [THE_RULE_OF_VIEWPORT_AND_VIEWBOX]\n    //\n    // Consider: `<svg width=\"...\" height=\"...\" viewBox=\"...\">`\n    // - the `width/height` we call it `svgWidth/svgHeight` for short.\n    // - `(0, 0, svgWidth, svgHeight)` defines the viewport of the SVG, or say,\n    //   \"viewport boundingRect\", or `boundingRect` for short.\n    // - `viewBox` defines the transform from the real content ot the viewport.\n    //   `viewBox` has the same unit as the content of SVG.\n    //   If `viewBox` exists, a transform is defined, so the unit of `svgWidth/svgHeight` become\n    //   different from the content of SVG. Otherwise, they are the same.\n    //\n    // If both `svgWidth/svgHeight/viewBox` are specified in a SVG file, the transform rule will be:\n    // 0. `boundingRect` is `(0, 0, svgWidth, svgHeight)`. Set it to Geo['_rect'] (View['_rect']).\n    // 1. Make a transform from `viewBox` to `boundingRect`.\n    //    Note: only support `preserveAspectRatio 'xMidYMid'` here. That is, this transform will preserve\n    //    the aspect ratio.\n    // 2. Make a transform from boundingRect to Geo['_viewRect'] (View['_viewRect'])\n    //    (`Geo`/`View` will do this job).\n    //    Note: this transform might not preserve aspect radio, which depending on how users specify\n    //    viewRect in echarts option (e.g., `geo.left/top/width/height` will not preserve aspect ratio,\n    //    but `geo.layoutCenter/layoutSize` will preserve aspect ratio).\n    //\n    // If `svgWidth/svgHeight` not specified, we use `viewBox` as the `boundingRect` to make the SVG\n    // layout look good.\n    //\n    // If neither `svgWidth/svgHeight` nor `viewBox` are not specified, we calculate the boundingRect\n    // of the SVG content and use them to make SVG layout look good.\n    var svgWidth = result.width;\n    var svgHeight = result.height;\n    var viewBoxRect = result.viewBoxRect;\n    var boundingRect = this._boundingRect;\n    if (!boundingRect) {\n      var bRectX = void 0;\n      var bRectY = void 0;\n      var bRectWidth = void 0;\n      var bRectHeight = void 0;\n      if (svgWidth != null) {\n        bRectX = 0;\n        bRectWidth = svgWidth;\n      } else if (viewBoxRect) {\n        bRectX = viewBoxRect.x;\n        bRectWidth = viewBoxRect.width;\n      }\n      if (svgHeight != null) {\n        bRectY = 0;\n        bRectHeight = svgHeight;\n      } else if (viewBoxRect) {\n        bRectY = viewBoxRect.y;\n        bRectHeight = viewBoxRect.height;\n      }\n      // If both viewBox and svgWidth/svgHeight not specified,\n      // we have to determine how to layout those element to make them look good.\n      if (bRectX == null || bRectY == null) {\n        var calculatedBoundingRect = rootFromParse.getBoundingRect();\n        if (bRectX == null) {\n          bRectX = calculatedBoundingRect.x;\n          bRectWidth = calculatedBoundingRect.width;\n        }\n        if (bRectY == null) {\n          bRectY = calculatedBoundingRect.y;\n          bRectHeight = calculatedBoundingRect.height;\n        }\n      }\n      boundingRect = this._boundingRect = new BoundingRect(bRectX, bRectY, bRectWidth, bRectHeight);\n    }\n    if (viewBoxRect) {\n      var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect);\n      // Only support `preserveAspectRatio 'xMidYMid'`\n      rootFromParse.scaleX = rootFromParse.scaleY = viewBoxTransform.scale;\n      rootFromParse.x = viewBoxTransform.x;\n      rootFromParse.y = viewBoxTransform.y;\n    }\n    // SVG needs to clip based on `viewBox`. And some SVG files really rely on this feature.\n    // They do not strictly confine all of the content inside a display rect, but deliberately\n    // use a `viewBox` to define a displayable rect.\n    // PENDING:\n    // The drawback of the `setClipPath` here is: the region label (genereted by echarts) near the\n    // edge might also be clipped, because region labels are put as `textContent` of the SVG path.\n    root.setClipPath(new Rect({\n      shape: boundingRect.plain()\n    }));\n    var named = [];\n    each(result.named, function (namedItem) {\n      if (REGION_AVAILABLE_SVG_TAG_MAP.get(namedItem.svgNodeTagLower) != null) {\n        named.push(namedItem);\n        setSilent(namedItem.el);\n      }\n    });\n    return {\n      root: root,\n      boundingRect: boundingRect,\n      named: named\n    };\n  };\n  /**\n   * Consider:\n   * (1) One graphic element can not be shared by different `geoView` running simultaneously.\n   *     Notice, also need to consider multiple echarts instances share a `mapRecord`.\n   * (2) Converting SVG to graphic elements is time consuming.\n   * (3) In the current architecture, `load` should be called frequently to get boundingRect,\n   *     and it is called without view info.\n   * So we maintain graphic elements in this module, and enables `view` to use/return these\n   * graphics from/to the pool with it's uid.\n   */\n  GeoSVGResource.prototype.useGraphic = function (hostKey /* , nameMap: NameMap */) {\n    var usedRootMap = this._usedGraphicMap;\n    var svgGraphic = usedRootMap.get(hostKey);\n    if (svgGraphic) {\n      return svgGraphic;\n    }\n    svgGraphic = this._freedGraphics.pop()\n    // use the first boundingRect to avoid duplicated boundingRect calculation.\n    || this._buildGraphic(this._parsedXML);\n    usedRootMap.set(hostKey, svgGraphic);\n    // PENDING: `nameMap` will not be supported until some real requirement come.\n    // `nameMap` can only be obtained from echarts option.\n    // The original `named` must not be modified.\n    // if (nameMap) {\n    //     svgGraphic = extend({}, svgGraphic);\n    //     svgGraphic.named = applyNameMap(svgGraphic.named, nameMap);\n    // }\n    return svgGraphic;\n  };\n  GeoSVGResource.prototype.freeGraphic = function (hostKey) {\n    var usedRootMap = this._usedGraphicMap;\n    var svgGraphic = usedRootMap.get(hostKey);\n    if (svgGraphic) {\n      usedRootMap.removeKey(hostKey);\n      this._freedGraphics.push(svgGraphic);\n    }\n  };\n  return GeoSVGResource;\n}();\nexport { GeoSVGResource };\nfunction setSilent(el) {\n  // Only named element has silent: false, other elements should\n  // act as background and has no user interaction.\n  el.silent = false;\n  // text|tspan will be converted to group.\n  if (el.isGroup) {\n    el.traverse(function (child) {\n      child.silent = false;\n    });\n  }\n}\nfunction createRegions(named) {\n  var regions = [];\n  var regionsMap = createHashMap();\n  // Create resions only for the first graphic.\n  each(named, function (namedItem) {\n    // Region has feature to calculate center for tooltip or other features.\n    // If there is a <g name=\"xxx\">, the center should be the center of the\n    // bounding rect of the g.\n    if (namedItem.namedFrom != null) {\n      return;\n    }\n    var region = new GeoSVGRegion(namedItem.name, namedItem.el);\n    // PENDING: if `nameMap` supported, this region can not be mounted on\n    // `this`, but can only be created each time `load()` called.\n    regions.push(region);\n    // PENDING: if multiple tag named with the same name, only one will be\n    // found by `_regionsMap`. `_regionsMap` is used to find a coordinate\n    // by name. We use `region.getCenter()` as the coordinate.\n    regionsMap.set(namedItem.name, region);\n  });\n  return {\n    regions: regions,\n    regionsMap: regionsMap\n  };\n}\n// PENDING: `nameMap` will not be supported until some real requirement come.\n// /**\n//  * Use the alias in geoNameMap.\n//  * The input `named` must not be modified.\n//  */\n// function applyNameMap(\n//     named: GeoSVGGraphicRecord['named'],\n//     nameMap: NameMap\n// ): GeoSVGGraphicRecord['named'] {\n//     const result = [] as GeoSVGGraphicRecord['named'];\n//     for (let i = 0; i < named.length; i++) {\n//         let regionGraphic = named[i];\n//         const name = regionGraphic.name;\n//         if (nameMap && nameMap.hasOwnProperty(name)) {\n//             regionGraphic = extend({}, regionGraphic);\n//             regionGraphic.name = name;\n//         }\n//         result.push(regionGraphic);\n//     }\n//     return result;\n// }", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// Fix for \u5357\u6D77\u8BF8\u5C9B\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { GeoJSONRegion } from '../Region.js';\nvar geoCoord = [126, 25];\nvar nanhaiName = '\u5357\u6D77\u8BF8\u5C9B';\nvar points = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]];\nfor (var i = 0; i < points.length; i++) {\n  for (var k = 0; k < points[i].length; k++) {\n    points[i][k][0] /= 10.5;\n    points[i][k][1] /= -10.5 / 0.75;\n    points[i][k][0] += geoCoord[0];\n    points[i][k][1] += geoCoord[1];\n  }\n}\nexport default function fixNanhai(mapType, regions) {\n  if (mapType === 'china') {\n    for (var i = 0; i < regions.length; i++) {\n      // Already exists.\n      if (regions[i].name === nanhaiName) {\n        return;\n      }\n    }\n    regions.push(new GeoJSONRegion(nanhaiName, zrUtil.map(points, function (exterior) {\n      return {\n        type: 'polygon',\n        exterior: exterior\n      };\n    }), geoCoord));\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar coordsOffsetMap = {\n  '\u5357\u6D77\u8BF8\u5C9B': [32, 80],\n  // \u5168\u56FD\n  '\u5E7F\u4E1C': [0, -10],\n  '\u9999\u6E2F': [10, 5],\n  '\u6FB3\u95E8': [-10, 10],\n  // '\u5317\u4EAC': [-10, 0],\n  '\u5929\u6D25': [5, 5]\n};\nexport default function fixTextCoords(mapType, region) {\n  if (mapType === 'china') {\n    var coordFix = coordsOffsetMap[region.name];\n    if (coordFix) {\n      var cp = region.getCenter();\n      cp[0] += coordFix[0] / 10.5;\n      cp[1] += -coordFix[1] / (10.5 / 0.75);\n      region.setCenter(cp);\n    }\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// Fix for \u9493\u9C7C\u5C9B\n// let Region = require('../Region');\n// let zrUtil = require('zrender/lib/core/util');\n// let geoCoord = [126, 25];\nvar points = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]];\nexport default function fixDiaoyuIsland(mapType, region) {\n  if (mapType === 'china' && region.name === '\u53F0\u6E7E') {\n    region.geometries.push({\n      type: 'polygon',\n      exterior: points[0]\n    });\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, isString, createHashMap, hasOwn } from 'zrender/lib/core/util.js';\nimport parseGeoJson from './parseGeoJson.js';\n// Built-in GEO fixer.\nimport fixNanhai from './fix/nanhai.js';\nimport fixTextCoord from './fix/textCoord.js';\nimport fixDiaoyuIsland from './fix/diaoyuIsland.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nvar DEFAULT_NAME_PROPERTY = 'name';\nvar GeoJSONResource = /** @class */function () {\n  function GeoJSONResource(mapName, geoJSON, specialAreas) {\n    this.type = 'geoJSON';\n    this._parsedMap = createHashMap();\n    this._mapName = mapName;\n    this._specialAreas = specialAreas;\n    // PENDING: delay the parse to the first usage to rapid up the FMP?\n    this._geoJSON = parseInput(geoJSON);\n  }\n  /**\n   * @param nameMap can be null/undefined\n   * @param nameProperty can be null/undefined\n   */\n  GeoJSONResource.prototype.load = function (nameMap, nameProperty) {\n    nameProperty = nameProperty || DEFAULT_NAME_PROPERTY;\n    var parsed = this._parsedMap.get(nameProperty);\n    if (!parsed) {\n      var rawRegions = this._parseToRegions(nameProperty);\n      parsed = this._parsedMap.set(nameProperty, {\n        regions: rawRegions,\n        boundingRect: calculateBoundingRect(rawRegions)\n      });\n    }\n    var regionsMap = createHashMap();\n    var finalRegions = [];\n    each(parsed.regions, function (region) {\n      var regionName = region.name;\n      // Try use the alias in geoNameMap\n      if (nameMap && hasOwn(nameMap, regionName)) {\n        region = region.cloneShallow(regionName = nameMap[regionName]);\n      }\n      finalRegions.push(region);\n      regionsMap.set(regionName, region);\n    });\n    return {\n      regions: finalRegions,\n      boundingRect: parsed.boundingRect || new BoundingRect(0, 0, 0, 0),\n      regionsMap: regionsMap\n    };\n  };\n  GeoJSONResource.prototype._parseToRegions = function (nameProperty) {\n    var mapName = this._mapName;\n    var geoJSON = this._geoJSON;\n    var rawRegions;\n    // https://jsperf.com/try-catch-performance-overhead\n    try {\n      rawRegions = geoJSON ? parseGeoJson(geoJSON, nameProperty) : [];\n    } catch (e) {\n      throw new Error('Invalid geoJson format\\n' + e.message);\n    }\n    fixNanhai(mapName, rawRegions);\n    each(rawRegions, function (region) {\n      var regionName = region.name;\n      fixTextCoord(mapName, region);\n      fixDiaoyuIsland(mapName, region);\n      // Some area like Alaska in USA map needs to be tansformed\n      // to look better\n      var specialArea = this._specialAreas && this._specialAreas[regionName];\n      if (specialArea) {\n        region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height);\n      }\n    }, this);\n    return rawRegions;\n  };\n  /**\n   * Only for exporting to users.\n   * **MUST NOT** used internally.\n   */\n  GeoJSONResource.prototype.getMapForUser = function () {\n    return {\n      // For backward compatibility, use geoJson\n      // PENDING: it has been returning them without clone.\n      // do we need to avoid outsite modification?\n      geoJson: this._geoJSON,\n      geoJSON: this._geoJSON,\n      specialAreas: this._specialAreas\n    };\n  };\n  return GeoJSONResource;\n}();\nexport { GeoJSONResource };\nfunction calculateBoundingRect(regions) {\n  var rect;\n  for (var i = 0; i < regions.length; i++) {\n    var regionRect = regions[i].getBoundingRect();\n    rect = rect || regionRect.clone();\n    rect.union(regionRect);\n  }\n  return rect;\n}\nfunction parseInput(source) {\n  return !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')();\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap } from 'zrender/lib/core/util.js';\nimport { GeoSVGResource } from './GeoSVGResource.js';\nimport { GeoJSONResource } from './GeoJSONResource.js';\nvar storage = createHashMap();\nexport default {\n  /**\n   * Compatible with previous `echarts.registerMap`.\n   *\n   * @usage\n   * ```js\n   *\n   * echarts.registerMap('USA', geoJson, specialAreas);\n   *\n   * echarts.registerMap('USA', {\n   *     geoJson: geoJson,\n   *     specialAreas: {...}\n   * });\n   * echarts.registerMap('USA', {\n   *     geoJSON: geoJson,\n   *     specialAreas: {...}\n   * });\n   *\n   * echarts.registerMap('airport', {\n   *     svg: svg\n   * }\n   * ```\n   *\n   * Note:\n   * Do not support that register multiple geoJSON or SVG\n   * one map name. Because different geoJSON and SVG have\n   * different unit. It's not easy to make sure how those\n   * units are mapping/normalize.\n   * If intending to use multiple geoJSON or SVG, we can\n   * use multiple geo coordinate system.\n   */\n  registerMap: function (mapName, rawDef, rawSpecialAreas) {\n    if (rawDef.svg) {\n      var resource = new GeoSVGResource(mapName, rawDef.svg);\n      storage.set(mapName, resource);\n    } else {\n      // Recommend:\n      //     echarts.registerMap('eu', { geoJSON: xxx, specialAreas: xxx });\n      // Backward compatibility:\n      //     echarts.registerMap('eu', geoJSON, specialAreas);\n      //     echarts.registerMap('eu', { geoJson: xxx, specialAreas: xxx });\n      var geoJSON = rawDef.geoJson || rawDef.geoJSON;\n      if (geoJSON && !rawDef.features) {\n        rawSpecialAreas = rawDef.specialAreas;\n      } else {\n        geoJSON = rawDef;\n      }\n      var resource = new GeoJSONResource(mapName, geoJSON, rawSpecialAreas);\n      storage.set(mapName, resource);\n    }\n  },\n  getGeoResource: function (mapName) {\n    return storage.get(mapName);\n  },\n  /**\n   * Only for exporting to users.\n   * **MUST NOT** used internally.\n   */\n  getMapForUser: function (mapName) {\n    var resource = storage.get(mapName);\n    // Do not support return SVG until some real requirement come.\n    return resource && resource.type === 'geoJSON' && resource.getMapForUser();\n  },\n  load: function (mapName, nameMap, nameProperty) {\n    var resource = storage.get(mapName);\n    if (!resource) {\n      if (process.env.NODE_ENV !== 'production') {\n        console.error('Map ' + mapName + ' not exists. The GeoJSON of the map must be provided.');\n      }\n      return;\n    }\n    return resource.load(nameMap, nameProperty);\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport RoamController from './RoamController.js';\nimport * as roamHelper from '../../component/helper/roamHelper.js';\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis, enableComponentHighDownFeatures, setDefaultStateProxy } from '../../util/states.js';\nimport geoSourceManager from '../../coord/geo/geoSourceManager.js';\nimport { getUID } from '../../util/component.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { createOrUpdatePatternFromDecal } from '../../util/decal.js';\nimport Displayable from 'zrender/lib/graphic/Displayable.js';\nimport { makeInner } from '../../util/model.js';\n/**\n * Only these tags enable use `itemStyle` if they are named in SVG.\n * Other tags like <text> <tspan> <image> might not suitable for `itemStyle`.\n * They will not be considered to be styled until some requirements come.\n */\nvar OPTION_STYLE_ENABLED_TAGS = ['rect', 'circle', 'line', 'ellipse', 'polygon', 'polyline', 'path'];\nvar OPTION_STYLE_ENABLED_TAG_MAP = zrUtil.createHashMap(OPTION_STYLE_ENABLED_TAGS);\nvar STATE_TRIGGER_TAG_MAP = zrUtil.createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g']));\nvar LABEL_HOST_MAP = zrUtil.createHashMap(OPTION_STYLE_ENABLED_TAGS.concat(['g']));\nvar mapLabelRaw = makeInner();\nfunction getFixedItemStyle(model) {\n  var itemStyle = model.getItemStyle();\n  var areaColor = model.get('areaColor');\n  // If user want the color not to be changed when hover,\n  // they should both set areaColor and color to be null.\n  if (areaColor != null) {\n    itemStyle.fill = areaColor;\n  }\n  return itemStyle;\n}\n// Only stroke can be used for line.\n// Using fill in style if stroke not exits.\n// TODO Not sure yet. Perhaps a separate `lineStyle`?\nfunction fixLineStyle(styleHost) {\n  var style = styleHost.style;\n  if (style) {\n    style.stroke = style.stroke || style.fill;\n    style.fill = null;\n  }\n}\nvar MapDraw = /** @class */function () {\n  function MapDraw(api) {\n    var group = this.group = new graphic.Group();\n    var transformGroup = this._transformGroup = new graphic.Group();\n    group.add(transformGroup);\n    this.uid = getUID('ec_map_draw');\n    this._controller = new RoamController(api.getZr());\n    this._controllerHost = {\n      target: transformGroup\n    };\n    transformGroup.add(this._regionsGroup = new graphic.Group());\n    transformGroup.add(this._svgGroup = new graphic.Group());\n  }\n  MapDraw.prototype.draw = function (mapOrGeoModel, ecModel, api, fromView, payload) {\n    var isGeo = mapOrGeoModel.mainType === 'geo';\n    // Map series has data. GEO model that controlled by map series\n    // will be assigned with map data. Other GEO model has no data.\n    var data = mapOrGeoModel.getData && mapOrGeoModel.getData();\n    isGeo && ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'map'\n    }, function (mapSeries) {\n      if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) {\n        data = mapSeries.getData();\n      }\n    });\n    var geo = mapOrGeoModel.coordinateSystem;\n    var regionsGroup = this._regionsGroup;\n    var transformGroup = this._transformGroup;\n    var transformInfo = geo.getTransformInfo();\n    var transformInfoRaw = transformInfo.raw;\n    var transformInfoRoam = transformInfo.roam;\n    // No animation when first draw or in action\n    var isFirstDraw = !regionsGroup.childAt(0) || payload;\n    var clip = mapOrGeoModel.getShallow('clip', true);\n    var clipRect;\n    if (clip) {\n      clipRect = geo.getViewRect().clone();\n      this.group.setClipPath(new graphic.Rect({\n        shape: clipRect.clone()\n      }));\n    } else {\n      this.group.removeClipPath();\n    }\n    if (isFirstDraw) {\n      transformGroup.x = transformInfoRoam.x;\n      transformGroup.y = transformInfoRoam.y;\n      transformGroup.scaleX = transformInfoRoam.scaleX;\n      transformGroup.scaleY = transformInfoRoam.scaleY;\n      transformGroup.dirty();\n    } else {\n      graphic.updateProps(transformGroup, transformInfoRoam, mapOrGeoModel);\n    }\n    var isVisualEncodedByVisualMap = data && data.getVisual('visualMeta') && data.getVisual('visualMeta').length > 0;\n    var viewBuildCtx = {\n      api: api,\n      geo: geo,\n      mapOrGeoModel: mapOrGeoModel,\n      data: data,\n      isVisualEncodedByVisualMap: isVisualEncodedByVisualMap,\n      isGeo: isGeo,\n      transformInfoRaw: transformInfoRaw\n    };\n    if (geo.resourceType === 'geoJSON') {\n      this._buildGeoJSON(viewBuildCtx);\n    } else if (geo.resourceType === 'geoSVG') {\n      this._buildSVG(viewBuildCtx);\n    }\n    this._updateController(mapOrGeoModel, clipRect, ecModel, api);\n    this._updateMapSelectHandler(mapOrGeoModel, regionsGroup, api, fromView);\n  };\n  MapDraw.prototype._buildGeoJSON = function (viewBuildCtx) {\n    var regionsGroupByName = this._regionsGroupByName = zrUtil.createHashMap();\n    var regionsInfoByName = zrUtil.createHashMap();\n    var regionsGroup = this._regionsGroup;\n    var transformInfoRaw = viewBuildCtx.transformInfoRaw;\n    var mapOrGeoModel = viewBuildCtx.mapOrGeoModel;\n    var data = viewBuildCtx.data;\n    var projection = viewBuildCtx.geo.projection;\n    var projectionStream = projection && projection.stream;\n    function transformPoint(point, project) {\n      if (project) {\n        // projection may return null point.\n        point = project(point);\n      }\n      return point && [point[0] * transformInfoRaw.scaleX + transformInfoRaw.x, point[1] * transformInfoRaw.scaleY + transformInfoRaw.y];\n    }\n    ;\n    function transformPolygonPoints(inPoints) {\n      var outPoints = [];\n      // If projectionStream is provided. Use it instead of single point project.\n      var project = !projectionStream && projection && projection.project;\n      for (var i = 0; i < inPoints.length; ++i) {\n        var newPt = transformPoint(inPoints[i], project);\n        newPt && outPoints.push(newPt);\n      }\n      return outPoints;\n    }\n    function getPolyShape(points) {\n      return {\n        shape: {\n          points: transformPolygonPoints(points)\n        }\n      };\n    }\n    regionsGroup.removeAll();\n    // Only when the resource is GeoJSON, there is `geo.regions`.\n    zrUtil.each(viewBuildCtx.geo.regions, function (region) {\n      var regionName = region.name;\n      // Consider in GeoJson properties.name may be duplicated, for example,\n      // there is multiple region named \"United Kindom\" or \"France\" (so many\n      // colonies). And it is not appropriate to merge them in geo, which\n      // will make them share the same label and bring trouble in label\n      // location calculation.\n      var regionGroup = regionsGroupByName.get(regionName);\n      var _a = regionsInfoByName.get(regionName) || {},\n        dataIdx = _a.dataIdx,\n        regionModel = _a.regionModel;\n      if (!regionGroup) {\n        regionGroup = regionsGroupByName.set(regionName, new graphic.Group());\n        regionsGroup.add(regionGroup);\n        dataIdx = data ? data.indexOfName(regionName) : null;\n        regionModel = viewBuildCtx.isGeo ? mapOrGeoModel.getRegionModel(regionName) : data ? data.getItemModel(dataIdx) : null;\n        var silent = regionModel.get('silent', true);\n        silent != null && (regionGroup.silent = silent);\n        regionsInfoByName.set(regionName, {\n          dataIdx: dataIdx,\n          regionModel: regionModel\n        });\n      }\n      var polygonSubpaths = [];\n      var polylineSubpaths = [];\n      zrUtil.each(region.geometries, function (geometry) {\n        // Polygon and MultiPolygon\n        if (geometry.type === 'polygon') {\n          var polys = [geometry.exterior].concat(geometry.interiors || []);\n          if (projectionStream) {\n            polys = projectPolys(polys, projectionStream);\n          }\n          zrUtil.each(polys, function (poly) {\n            polygonSubpaths.push(new graphic.Polygon(getPolyShape(poly)));\n          });\n        }\n        // LineString and MultiLineString\n        else {\n          var points = geometry.points;\n          if (projectionStream) {\n            points = projectPolys(points, projectionStream, true);\n          }\n          zrUtil.each(points, function (points) {\n            polylineSubpaths.push(new graphic.Polyline(getPolyShape(points)));\n          });\n        }\n      });\n      var centerPt = transformPoint(region.getCenter(), projection && projection.project);\n      function createCompoundPath(subpaths, isLine) {\n        if (!subpaths.length) {\n          return;\n        }\n        var compoundPath = new graphic.CompoundPath({\n          culling: true,\n          segmentIgnoreThreshold: 1,\n          shape: {\n            paths: subpaths\n          }\n        });\n        regionGroup.add(compoundPath);\n        applyOptionStyleForRegion(viewBuildCtx, compoundPath, dataIdx, regionModel);\n        resetLabelForRegion(viewBuildCtx, compoundPath, regionName, regionModel, mapOrGeoModel, dataIdx, centerPt);\n        if (isLine) {\n          fixLineStyle(compoundPath);\n          zrUtil.each(compoundPath.states, fixLineStyle);\n        }\n      }\n      createCompoundPath(polygonSubpaths);\n      createCompoundPath(polylineSubpaths, true);\n    });\n    // Ensure children have been added to `regionGroup` before calling them.\n    regionsGroupByName.each(function (regionGroup, regionName) {\n      var _a = regionsInfoByName.get(regionName),\n        dataIdx = _a.dataIdx,\n        regionModel = _a.regionModel;\n      resetEventTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel, dataIdx);\n      resetTooltipForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel);\n      resetStateTriggerForRegion(viewBuildCtx, regionGroup, regionName, regionModel, mapOrGeoModel);\n    }, this);\n  };\n  MapDraw.prototype._buildSVG = function (viewBuildCtx) {\n    var mapName = viewBuildCtx.geo.map;\n    var transformInfoRaw = viewBuildCtx.transformInfoRaw;\n    this._svgGroup.x = transformInfoRaw.x;\n    this._svgGroup.y = transformInfoRaw.y;\n    this._svgGroup.scaleX = transformInfoRaw.scaleX;\n    this._svgGroup.scaleY = transformInfoRaw.scaleY;\n    if (this._svgResourceChanged(mapName)) {\n      this._freeSVG();\n      this._useSVG(mapName);\n    }\n    var svgDispatcherMap = this._svgDispatcherMap = zrUtil.createHashMap();\n    var focusSelf = false;\n    zrUtil.each(this._svgGraphicRecord.named, function (namedItem) {\n      // Note that we also allow different elements have the same name.\n      // For example, a glyph of a city and the label of the city have\n      // the same name and their tooltip info can be defined in a single\n      // region option.\n      var regionName = namedItem.name;\n      var mapOrGeoModel = viewBuildCtx.mapOrGeoModel;\n      var data = viewBuildCtx.data;\n      var svgNodeTagLower = namedItem.svgNodeTagLower;\n      var el = namedItem.el;\n      var dataIdx = data ? data.indexOfName(regionName) : null;\n      var regionModel = mapOrGeoModel.getRegionModel(regionName);\n      if (OPTION_STYLE_ENABLED_TAG_MAP.get(svgNodeTagLower) != null && el instanceof Displayable) {\n        applyOptionStyleForRegion(viewBuildCtx, el, dataIdx, regionModel);\n      }\n      if (el instanceof Displayable) {\n        el.culling = true;\n      }\n      var silent = regionModel.get('silent', true);\n      silent != null && (el.silent = silent);\n      // We do not know how the SVG like so we'd better not to change z2.\n      // Otherwise it might bring some unexpected result. For example,\n      // an area hovered that make some inner city can not be clicked.\n      el.z2EmphasisLift = 0;\n      // If self named:\n      if (!namedItem.namedFrom) {\n        // label should batter to be displayed based on the center of <g>\n        // if it is named rather than displayed on each child.\n        if (LABEL_HOST_MAP.get(svgNodeTagLower) != null) {\n          resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx, null);\n        }\n        resetEventTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel, dataIdx);\n        resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel);\n        if (STATE_TRIGGER_TAG_MAP.get(svgNodeTagLower) != null) {\n          var focus_1 = resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel);\n          if (focus_1 === 'self') {\n            focusSelf = true;\n          }\n          var els = svgDispatcherMap.get(regionName) || svgDispatcherMap.set(regionName, []);\n          els.push(el);\n        }\n      }\n    }, this);\n    this._enableBlurEntireSVG(focusSelf, viewBuildCtx);\n  };\n  MapDraw.prototype._enableBlurEntireSVG = function (focusSelf, viewBuildCtx) {\n    // It's a little complicated to support blurring the entire geoSVG in series-map.\n    // So do not support it until some requirements come.\n    // At present, in series-map, only regions can be blurred.\n    if (focusSelf && viewBuildCtx.isGeo) {\n      var blurStyle = viewBuildCtx.mapOrGeoModel.getModel(['blur', 'itemStyle']).getItemStyle();\n      // Only support `opacity` here. Because not sure that other props are suitable for\n      // all of the elements generated by SVG (especially for Text/TSpan/Image/... ).\n      var opacity_1 = blurStyle.opacity;\n      this._svgGraphicRecord.root.traverse(function (el) {\n        if (!el.isGroup) {\n          // PENDING: clear those settings to SVG elements when `_freeSVG`.\n          // (Currently it happen not to be needed.)\n          setDefaultStateProxy(el);\n          var style = el.ensureState('blur').style || {};\n          // Do not overwrite the region style that already set from region option.\n          if (style.opacity == null && opacity_1 != null) {\n            style.opacity = opacity_1;\n          }\n          // If `ensureState('blur').style = {}`, there will be default opacity.\n          // Enable `stateTransition` (animation).\n          el.ensureState('emphasis');\n        }\n      });\n    }\n  };\n  MapDraw.prototype.remove = function () {\n    this._regionsGroup.removeAll();\n    this._regionsGroupByName = null;\n    this._svgGroup.removeAll();\n    this._freeSVG();\n    this._controller.dispose();\n    this._controllerHost = null;\n  };\n  MapDraw.prototype.findHighDownDispatchers = function (name, geoModel) {\n    if (name == null) {\n      return [];\n    }\n    var geo = geoModel.coordinateSystem;\n    if (geo.resourceType === 'geoJSON') {\n      var regionsGroupByName = this._regionsGroupByName;\n      if (regionsGroupByName) {\n        var regionGroup = regionsGroupByName.get(name);\n        return regionGroup ? [regionGroup] : [];\n      }\n    } else if (geo.resourceType === 'geoSVG') {\n      return this._svgDispatcherMap && this._svgDispatcherMap.get(name) || [];\n    }\n  };\n  MapDraw.prototype._svgResourceChanged = function (mapName) {\n    return this._svgMapName !== mapName;\n  };\n  MapDraw.prototype._useSVG = function (mapName) {\n    var resource = geoSourceManager.getGeoResource(mapName);\n    if (resource && resource.type === 'geoSVG') {\n      var svgGraphic = resource.useGraphic(this.uid);\n      this._svgGroup.add(svgGraphic.root);\n      this._svgGraphicRecord = svgGraphic;\n      this._svgMapName = mapName;\n    }\n  };\n  MapDraw.prototype._freeSVG = function () {\n    var mapName = this._svgMapName;\n    if (mapName == null) {\n      return;\n    }\n    var resource = geoSourceManager.getGeoResource(mapName);\n    if (resource && resource.type === 'geoSVG') {\n      resource.freeGraphic(this.uid);\n    }\n    this._svgGraphicRecord = null;\n    this._svgDispatcherMap = null;\n    this._svgGroup.removeAll();\n    this._svgMapName = null;\n  };\n  MapDraw.prototype._updateController = function (mapOrGeoModel, clipRect, ecModel, api) {\n    var geo = mapOrGeoModel.coordinateSystem;\n    var controller = this._controller;\n    var controllerHost = this._controllerHost;\n    controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit');\n    controllerHost.zoom = geo.getZoom();\n    // roamType is will be set default true if it is null\n    controller.enable(mapOrGeoModel.get('roam') || false, {\n      api: api,\n      zInfo: {\n        component: mapOrGeoModel\n      },\n      triggerInfo: {\n        roamTrigger: mapOrGeoModel.get('roamTrigger'),\n        isInSelf: function (e, x, y) {\n          return geo.containPoint([x, y]);\n        },\n        isInClip: function (e, x, y) {\n          return !clipRect || clipRect.contain(x, y);\n        }\n      }\n    });\n    var mainType = mapOrGeoModel.mainType;\n    function makeActionBase() {\n      var action = {\n        type: 'geoRoam',\n        componentType: mainType\n      };\n      action[mainType + 'Id'] = mapOrGeoModel.id;\n      return action;\n    }\n    controller.off('pan').on('pan', function (e) {\n      this._mouseDownFlag = false;\n      roamHelper.updateViewOnPan(controllerHost, e.dx, e.dy);\n      api.dispatchAction(zrUtil.extend(makeActionBase(), {\n        dx: e.dx,\n        dy: e.dy,\n        animation: {\n          duration: 0\n        }\n      }));\n    }, this);\n    controller.off('zoom').on('zoom', function (e) {\n      this._mouseDownFlag = false;\n      roamHelper.updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);\n      api.dispatchAction(zrUtil.extend(makeActionBase(), {\n        totalZoom: controllerHost.zoom,\n        zoom: e.scale,\n        originX: e.originX,\n        originY: e.originY,\n        animation: {\n          duration: 0\n        }\n      }));\n    }, this);\n  };\n  /**\n   * FIXME: this is a temporarily workaround.\n   * When `geoRoam` the elements need to be reset in `MapView['render']`, because the props like\n   * `ignore` might have been modified by `LabelManager`, and `LabelManager#addLabelsOfSeries`\n   * will subsequently cache `defaultAttr` like `ignore`. If do not do this reset, the modified\n   * props will have no chance to be restored.\n   * Note: This reset should be after `clearStates` in `renderSeries` because `useStates` in\n   * `renderSeries` will cache the modified `ignore` to `el._normalState`.\n   * TODO:\n   * Use clone/immutable in `LabelManager`?\n   */\n  MapDraw.prototype.resetForLabelLayout = function () {\n    this.group.traverse(function (el) {\n      var label = el.getTextContent();\n      if (label) {\n        label.ignore = mapLabelRaw(label).ignore;\n      }\n    });\n  };\n  MapDraw.prototype._updateMapSelectHandler = function (mapOrGeoModel, regionsGroup, api, fromView) {\n    var mapDraw = this;\n    regionsGroup.off('mousedown');\n    regionsGroup.off('click');\n    // @ts-ignore FIXME:TS resolve type conflict\n    if (mapOrGeoModel.get('selectedMode')) {\n      regionsGroup.on('mousedown', function () {\n        mapDraw._mouseDownFlag = true;\n      });\n      regionsGroup.on('click', function (e) {\n        if (!mapDraw._mouseDownFlag) {\n          return;\n        }\n        mapDraw._mouseDownFlag = false;\n      });\n    }\n  };\n  return MapDraw;\n}();\n;\nfunction applyOptionStyleForRegion(viewBuildCtx, el, dataIndex, regionModel) {\n  // All of the path are using `itemStyle`, because\n  // (1) Some SVG also use fill on polyline (The different between\n  // polyline and polygon is \"open\" or \"close\" but not fill or not).\n  // (2) For the common props like opacity, if some use itemStyle\n  // and some use `lineStyle`, it might confuse users.\n  // (3) Most SVG use <path>, where can not detect whether to draw a \"line\"\n  // or a filled shape, so use `itemStyle` for <path>.\n  var normalStyleModel = regionModel.getModel('itemStyle');\n  var emphasisStyleModel = regionModel.getModel(['emphasis', 'itemStyle']);\n  var blurStyleModel = regionModel.getModel(['blur', 'itemStyle']);\n  var selectStyleModel = regionModel.getModel(['select', 'itemStyle']);\n  // NOTE: DON'T use 'style' in visual when drawing map.\n  // This component is used for drawing underlying map for both geo component and map series.\n  var normalStyle = getFixedItemStyle(normalStyleModel);\n  var emphasisStyle = getFixedItemStyle(emphasisStyleModel);\n  var selectStyle = getFixedItemStyle(selectStyleModel);\n  var blurStyle = getFixedItemStyle(blurStyleModel);\n  // Update the itemStyle if has data visual\n  var data = viewBuildCtx.data;\n  if (data) {\n    // Only visual color of each item will be used. It can be encoded by visualMap\n    // But visual color of series is used in symbol drawing\n    // Visual color for each series is for the symbol draw\n    var style = data.getItemVisual(dataIndex, 'style');\n    var decal = data.getItemVisual(dataIndex, 'decal');\n    if (viewBuildCtx.isVisualEncodedByVisualMap && style.fill) {\n      normalStyle.fill = style.fill;\n    }\n    if (decal) {\n      normalStyle.decal = createOrUpdatePatternFromDecal(decal, viewBuildCtx.api);\n    }\n  }\n  // SVG text, tspan and image can be named but not supporeted\n  // to be styled by region option yet.\n  el.setStyle(normalStyle);\n  el.style.strokeNoScale = true;\n  el.ensureState('emphasis').style = emphasisStyle;\n  el.ensureState('select').style = selectStyle;\n  el.ensureState('blur').style = blurStyle;\n  // Enable blur\n  setDefaultStateProxy(el);\n}\nfunction resetLabelForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel,\n// Exist only if `viewBuildCtx.data` exists.\ndataIdx,\n// If labelXY not provided, use `textConfig.position: 'inside'`\nlabelXY) {\n  var data = viewBuildCtx.data;\n  var isGeo = viewBuildCtx.isGeo;\n  var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx));\n  var itemLayout = data && data.getItemLayout(dataIdx);\n  // In the following cases label will be drawn\n  // 1. In map series and data value is NaN\n  // 2. In geo component\n  // 3. Region has no series legendIcon, which will be add a showLabel flag in mapSymbolLayout\n  if (isGeo || isDataNaN || itemLayout && itemLayout.showLabel) {\n    var query = !isGeo ? dataIdx : regionName;\n    var labelFetcher = void 0;\n    // Consider dataIdx not found.\n    if (!data || dataIdx >= 0) {\n      labelFetcher = mapOrGeoModel;\n    }\n    var specifiedTextOpt = labelXY ? {\n      normal: {\n        align: 'center',\n        verticalAlign: 'middle'\n      }\n    } : null;\n    // Caveat: must be called after `setDefaultStateProxy(el);` called.\n    // because textContent will be assign with `el.stateProxy` inside.\n    setLabelStyle(el, getLabelStatesModels(regionModel), {\n      labelFetcher: labelFetcher,\n      labelDataIndex: query,\n      defaultText: regionName\n    }, specifiedTextOpt);\n    var textEl = el.getTextContent();\n    if (textEl) {\n      mapLabelRaw(textEl).ignore = textEl.ignore;\n      if (el.textConfig && labelXY) {\n        // Compute a relative offset based on the el bounding rect.\n        var rect = el.getBoundingRect().clone();\n        // Need to make sure the percent position base on the same rect in normal and\n        // emphasis state. Otherwise if using boundingRect of el, but the emphasis state\n        // has borderWidth (even 0.5px), the text position will be changed obviously\n        // if the position is very big like ['1234%', '1345%'].\n        el.textConfig.layoutRect = rect;\n        el.textConfig.position = [(labelXY[0] - rect.x) / rect.width * 100 + '%', (labelXY[1] - rect.y) / rect.height * 100 + '%'];\n      }\n    }\n    // PENDING:\n    // If labelLayout is enabled (test/label-layout.html), el.dataIndex should be specified.\n    // But el.dataIndex is also used to determine whether user event should be triggered,\n    // where el.seriesIndex or el.dataModel must be specified. At present for a single el\n    // there is not case that \"only label layout enabled but user event disabled\", so here\n    // we depends `resetEventTriggerForRegion` to do the job of setting `el.dataIndex`.\n    el.disableLabelAnimation = true;\n  } else {\n    el.removeTextContent();\n    el.removeTextConfig();\n    el.disableLabelAnimation = null;\n  }\n}\nfunction resetEventTriggerForRegion(viewBuildCtx, eventTrigger, regionName, regionModel, mapOrGeoModel,\n// Exist only if `viewBuildCtx.data` exists.\ndataIdx) {\n  // setItemGraphicEl, setHoverStyle after all polygons and labels\n  // are added to the regionGroup\n  if (viewBuildCtx.data) {\n    // FIXME: when series-map use a SVG map, and there are duplicated name specified\n    // on different SVG elements, after `data.setItemGraphicEl(...)`:\n    // (1) all of them will be mounted with `dataIndex`, `seriesIndex`, so that tooltip\n    // can be triggered only mouse hover. That's correct.\n    // (2) only the last element will be kept in `data`, so that if trigger tooltip\n    // by `dispatchAction`, only the last one can be found and triggered. That might be\n    // not correct. We will fix it in future if anyone demanding that.\n    viewBuildCtx.data.setItemGraphicEl(dataIdx, eventTrigger);\n  }\n  // series-map will not trigger \"geoselectchange\" no matter it is\n  // based on a declared geo component. Because series-map will\n  // trigger \"selectchange\". If it trigger both the two events,\n  // If users call `chart.dispatchAction({type: 'toggleSelect'})`,\n  // it not easy to also fire event \"geoselectchanged\".\n  else {\n    // Package custom mouse event for geo component\n    getECData(eventTrigger).eventData = {\n      componentType: 'geo',\n      componentIndex: mapOrGeoModel.componentIndex,\n      geoIndex: mapOrGeoModel.componentIndex,\n      name: regionName,\n      region: regionModel && regionModel.option || {}\n    };\n  }\n}\nfunction resetTooltipForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) {\n  if (!viewBuildCtx.data) {\n    graphic.setTooltipConfig({\n      el: el,\n      componentModel: mapOrGeoModel,\n      itemName: regionName,\n      // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n      itemTooltipOption: regionModel.get('tooltip')\n    });\n  }\n}\nfunction resetStateTriggerForRegion(viewBuildCtx, el, regionName, regionModel, mapOrGeoModel) {\n  // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n  el.highDownSilentOnTouch = !!mapOrGeoModel.get('selectedMode');\n  // @ts-ignore FIXME:TS fix the \"compatible with each other\"?\n  var emphasisModel = regionModel.getModel('emphasis');\n  var focus = emphasisModel.get('focus');\n  toggleHoverEmphasis(el, focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  if (viewBuildCtx.isGeo) {\n    enableComponentHighDownFeatures(el, mapOrGeoModel, regionName);\n  }\n  return focus;\n}\nfunction projectPolys(rings,\n// Polygons include exterior and interiors. Or polylines.\ncreateStream, isLine) {\n  var polygons = [];\n  var curPoly;\n  function startPolygon() {\n    curPoly = [];\n  }\n  function endPolygon() {\n    if (curPoly.length) {\n      polygons.push(curPoly);\n      curPoly = [];\n    }\n  }\n  var stream = createStream({\n    polygonStart: startPolygon,\n    polygonEnd: endPolygon,\n    lineStart: startPolygon,\n    lineEnd: endPolygon,\n    point: function (x, y) {\n      // May have NaN values from stream.\n      if (isFinite(x) && isFinite(y)) {\n        curPoly.push([x, y]);\n      }\n    },\n    sphere: function () {}\n  });\n  !isLine && stream.polygonStart();\n  zrUtil.each(rings, function (ring) {\n    stream.lineStart();\n    for (var i = 0; i < ring.length; i++) {\n      stream.point(ring[i][0], ring[i][1]);\n    }\n    stream.lineEnd();\n  });\n  !isLine && stream.polygonEnd();\n  return polygons;\n}\nexport default MapDraw;\n// @ts-ignore FIXME:TS fix the \"compatible with each other\"?", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport MapDraw from '../../component/helper/MapDraw.js';\nimport ChartView from '../../view/Chart.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { setStatesFlag, Z2_EMPHASIS_LIFT } from '../../util/states.js';\nvar MapView = /** @class */function (_super) {\n  __extends(MapView, _super);\n  function MapView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MapView.type;\n    return _this;\n  }\n  MapView.prototype.render = function (mapModel, ecModel, api, payload) {\n    // Not render if it is an toggleSelect action from self\n    if (payload && payload.type === 'mapToggleSelect' && payload.from === this.uid) {\n      return;\n    }\n    var group = this.group;\n    group.removeAll();\n    if (mapModel.getHostGeoModel()) {\n      return;\n    }\n    if (this._mapDraw && payload && payload.type === 'geoRoam') {\n      this._mapDraw.resetForLabelLayout();\n    }\n    // Not update map if it is an roam action from self\n    if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) {\n      if (mapModel.needsDrawMap) {\n        var mapDraw = this._mapDraw || new MapDraw(api);\n        group.add(mapDraw.group);\n        mapDraw.draw(mapModel, ecModel, api, this, payload);\n        this._mapDraw = mapDraw;\n      } else {\n        // Remove drawn map\n        this._mapDraw && this._mapDraw.remove();\n        this._mapDraw = null;\n      }\n    } else {\n      var mapDraw = this._mapDraw;\n      mapDraw && group.add(mapDraw.group);\n    }\n    mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') && this._renderSymbols(mapModel, ecModel, api);\n  };\n  MapView.prototype.remove = function () {\n    this._mapDraw && this._mapDraw.remove();\n    this._mapDraw = null;\n    this.group.removeAll();\n  };\n  MapView.prototype.dispose = function () {\n    this._mapDraw && this._mapDraw.remove();\n    this._mapDraw = null;\n  };\n  MapView.prototype._renderSymbols = function (mapModel, ecModel, api) {\n    var originalData = mapModel.originalData;\n    var group = this.group;\n    originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) {\n      if (isNaN(value)) {\n        return;\n      }\n      var layout = originalData.getItemLayout(originalDataIndex);\n      if (!layout || !layout.point) {\n        // Not exists in map\n        return;\n      }\n      var point = layout.point;\n      var offset = layout.offset;\n      var circle = new graphic.Circle({\n        style: {\n          // Because the special of map draw.\n          // Which needs statistic of multiple series and draw on one map.\n          // And each series also need a symbol with legend color\n          //\n          // Layout and visual are put one the different data\n          // TODO\n          fill: mapModel.getData().getVisual('style').fill\n        },\n        shape: {\n          cx: point[0] + offset * 9,\n          cy: point[1],\n          r: 3\n        },\n        silent: true,\n        // Do not overlap the first series, on which labels are displayed.\n        z2: 8 + (!offset ? Z2_EMPHASIS_LIFT + 1 : 0)\n      });\n      // Only the series that has the first value on the same region is in charge of rendering the label.\n      // But consider the case:\n      // series: [\n      //     {id: 'X', type: 'map', map: 'm', {data: [{name: 'A', value: 11}, {name: 'B', {value: 22}]},\n      //     {id: 'Y', type: 'map', map: 'm', {data: [{name: 'A', value: 21}, {name: 'C', {value: 33}]}\n      // ]\n      // The offset `0` of item `A` is at series `X`, but of item `C` is at series `Y`.\n      // For backward compatibility, we follow the rule that render label `A` by the\n      // settings on series `X` but render label `C` by the settings on series `Y`.\n      if (!offset) {\n        var fullData = mapModel.mainSeries.getData();\n        var name_1 = originalData.getName(originalDataIndex);\n        var fullIndex_1 = fullData.indexOfName(name_1);\n        var itemModel = originalData.getItemModel(originalDataIndex);\n        var labelModel = itemModel.getModel('label');\n        var regionGroup = fullData.getItemGraphicEl(fullIndex_1);\n        // `getFormattedLabel` needs to use `getData` inside. Here\n        // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`.\n        // FIXME\n        // If this is not the `mainSeries`, the item model (like label formatter)\n        // set on original data item will never get. But it has been working\n        // like that from the beginning, and this scenario is rarely encountered.\n        // So it won't be fixed until we have to.\n        setLabelStyle(circle, getLabelStatesModels(itemModel), {\n          labelFetcher: {\n            getFormattedLabel: function (idx, state) {\n              return mapModel.getFormattedLabel(fullIndex_1, state);\n            }\n          },\n          defaultText: name_1\n        });\n        circle.disableLabelAnimation = true;\n        if (!labelModel.get('position')) {\n          circle.setTextConfig({\n            position: 'bottom'\n          });\n        }\n        regionGroup.onHoverStateChange = function (toState) {\n          setStatesFlag(circle, toState);\n        };\n      }\n      group.add(circle);\n    });\n  };\n  MapView.type = 'map';\n  return MapView;\n}(ChartView);\nexport default MapView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport createSeriesDataSimply from '../helper/createSeriesDataSimply.js';\nimport SeriesModel from '../../model/Series.js';\nimport geoSourceManager from '../../coord/geo/geoSourceManager.js';\nimport { makeSeriesEncodeForNameBased } from '../../data/helper/sourceHelper.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport { CoordinateSystemUsageKind, decideCoordSysUsageKind } from '../../core/CoordinateSystem.js';\nimport tokens from '../../visual/tokens.js';\nvar MapSeries = /** @class */function (_super) {\n  __extends(MapSeries, _super);\n  function MapSeries() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MapSeries.type;\n    // Only first map series of same mapType will drawMap.\n    _this.needsDrawMap = false;\n    // Group of all map series with same mapType\n    _this.seriesGroup = [];\n    _this.getTooltipPosition = function (dataIndex) {\n      if (dataIndex != null) {\n        var name_1 = this.getData().getName(dataIndex);\n        var geo = this.coordinateSystem;\n        var region = geo.getRegion(name_1);\n        return region && geo.dataToPoint(region.getCenter());\n      }\n    };\n    return _this;\n  }\n  MapSeries.prototype.getInitialData = function (option) {\n    var data = createSeriesDataSimply(this, {\n      coordDimensions: ['value'],\n      encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)\n    });\n    var dataNameIndexMap = zrUtil.createHashMap();\n    var toAppendItems = [];\n    for (var i = 0, len = data.count(); i < len; i++) {\n      var name_2 = data.getName(i);\n      dataNameIndexMap.set(name_2, i);\n    }\n    var geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap, this.option.nameProperty);\n    zrUtil.each(geoSource.regions, function (region) {\n      var name = region.name;\n      var dataNameIdx = dataNameIndexMap.get(name);\n      // apply specified echarts style in GeoJSON data\n      var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle;\n      var dataItem;\n      if (dataNameIdx == null) {\n        dataItem = {\n          name: name\n        };\n        toAppendItems.push(dataItem);\n      } else {\n        dataItem = data.getRawDataItem(dataNameIdx);\n      }\n      specifiedGeoJSONRegionStyle && zrUtil.merge(dataItem, specifiedGeoJSONRegionStyle);\n    });\n    // Complete data with missing regions. The consequent processes (like visual\n    // map and render) can not be performed without a \"full data\". For example,\n    // find `dataIndex` by name.\n    data.appendData(toAppendItems);\n    return data;\n  };\n  /**\n   * If no host geo model, return null, which means using a\n   * inner exclusive geo model.\n   */\n  MapSeries.prototype.getHostGeoModel = function () {\n    if (decideCoordSysUsageKind(this).kind === CoordinateSystemUsageKind.boxCoordSys) {\n      // Always use an internal geo if specify a boxCoordSys.\n      // Notice that currently we do not support laying out a geo based on\n      // another geo, but preserve the possibility.\n      return;\n    }\n    return this.getReferringComponents('geo', {\n      useDefault: false,\n      enableAll: false,\n      enableNone: false\n    }).models[0];\n  };\n  MapSeries.prototype.getMapType = function () {\n    return (this.getHostGeoModel() || this).option.map;\n  };\n  // _fillOption(option, mapName) {\n  // Shallow clone\n  // option = zrUtil.extend({}, option);\n  // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap);\n  // return option;\n  // }\n  MapSeries.prototype.getRawValue = function (dataIndex) {\n    // Use value stored in data instead because it is calculated from multiple series\n    // FIXME Provide all value of multiple series ?\n    var data = this.getData();\n    return data.get(data.mapDimension('value'), dataIndex);\n  };\n  /**\n   * Get model of region\n   */\n  MapSeries.prototype.getRegionModel = function (regionName) {\n    var data = this.getData();\n    return data.getItemModel(data.indexOfName(regionName));\n  };\n  /**\n   * Map tooltip formatter\n   */\n  MapSeries.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    // FIXME orignalData and data is a bit confusing\n    var data = this.getData();\n    var value = this.getRawValue(dataIndex);\n    var name = data.getName(dataIndex);\n    var seriesGroup = this.seriesGroup;\n    var seriesNames = [];\n    for (var i = 0; i < seriesGroup.length; i++) {\n      var otherIndex = seriesGroup[i].originalData.indexOfName(name);\n      var valueDim = data.mapDimension('value');\n      if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) {\n        seriesNames.push(seriesGroup[i].name);\n      }\n    }\n    return createTooltipMarkup('section', {\n      header: seriesNames.join(', '),\n      noHeader: !seriesNames.length,\n      blocks: [createTooltipMarkup('nameValue', {\n        name: name,\n        value: value\n      })]\n    });\n  };\n  MapSeries.prototype.setZoom = function (zoom) {\n    this.option.zoom = zoom;\n  };\n  MapSeries.prototype.setCenter = function (center) {\n    this.option.center = center;\n  };\n  MapSeries.prototype.getLegendIcon = function (opt) {\n    var iconType = opt.icon || 'roundRect';\n    var icon = createSymbol(iconType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill);\n    icon.setStyle(opt.itemStyle);\n    // Map do not use itemStyle.borderWidth as border width\n    icon.style.stroke = 'none';\n    // No rotation because no series visual symbol for map\n    if (iconType.indexOf('empty') > -1) {\n      icon.style.stroke = icon.style.fill;\n      icon.style.fill = tokens.color.neutral00;\n      icon.style.lineWidth = 2;\n    }\n    return icon;\n  };\n  MapSeries.type = 'series.map';\n  MapSeries.dependencies = ['geo'];\n  MapSeries.layoutMode = 'box';\n  MapSeries.defaultOption = {\n    // \u4E00\u7EA7\u5C42\u53E0\n    // zlevel: 0,\n    // \u4E8C\u7EA7\u5C42\u53E0\n    z: 2,\n    coordinateSystem: 'geo',\n    // map should be explicitly specified since ec3.\n    map: '',\n    // If `geoIndex` is not specified, a exclusive geo will be\n    // created. Otherwise use the specified geo component, and\n    // `map` and `mapType` are ignored.\n    // geoIndex: 0,\n    // 'center' | 'left' | 'right' | 'x%' | {number}\n    left: 'center',\n    // 'center' | 'top' | 'bottom' | 'x%' | {number}\n    top: 'center',\n    // right\n    // bottom\n    // width:\n    // height\n    // Aspect is width / height. Inited to be geoJson bbox aspect\n    // This parameter is used for scale this aspect\n    // Default value:\n    // for geoSVG source: 1,\n    // for geoJSON source: 0.75.\n    aspectScale: null,\n    // Layout with center and size\n    // If you want to put map in a fixed size box with right aspect ratio\n    // This two properties may be more convenient.\n    // layoutCenter: [50%, 50%]\n    // layoutSize: 100\n    showLegendSymbol: true,\n    // Define left-top, right-bottom coords to control view\n    // For example, [ [180, 90], [-180, -90] ],\n    // higher priority than center and zoom\n    boundingCoords: null,\n    // Default on center of map\n    center: null,\n    zoom: 1,\n    scaleLimit: null,\n    selectedMode: true,\n    label: {\n      show: false,\n      color: tokens.color.tertiary\n    },\n    // scaleLimit: null,\n    itemStyle: {\n      borderWidth: 0.5,\n      borderColor: tokens.color.border,\n      areaColor: tokens.color.background\n    },\n    emphasis: {\n      label: {\n        show: true,\n        color: tokens.color.primary\n      },\n      itemStyle: {\n        areaColor: tokens.color.highlight\n      }\n    },\n    select: {\n      label: {\n        show: true,\n        color: tokens.color.primary\n      },\n      itemStyle: {\n        color: tokens.color.highlight\n      }\n    },\n    nameProperty: 'name'\n  };\n  return MapSeries;\n}(SeriesModel);\nexport default MapSeries;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\n// FIXME \u516C\u7528\uFF1F\nfunction dataStatistics(datas, statisticType) {\n  var dataNameMap = {};\n  zrUtil.each(datas, function (data) {\n    data.each(data.mapDimension('value'), function (value, idx) {\n      // Add prefix to avoid conflict with Object.prototype.\n      var mapKey = 'ec-' + data.getName(idx);\n      dataNameMap[mapKey] = dataNameMap[mapKey] || [];\n      if (!isNaN(value)) {\n        dataNameMap[mapKey].push(value);\n      }\n    });\n  });\n  return datas[0].map(datas[0].mapDimension('value'), function (value, idx) {\n    var mapKey = 'ec-' + datas[0].getName(idx);\n    var sum = 0;\n    var min = Infinity;\n    var max = -Infinity;\n    var len = dataNameMap[mapKey].length;\n    for (var i = 0; i < len; i++) {\n      min = Math.min(min, dataNameMap[mapKey][i]);\n      max = Math.max(max, dataNameMap[mapKey][i]);\n      sum += dataNameMap[mapKey][i];\n    }\n    var result;\n    if (statisticType === 'min') {\n      result = min;\n    } else if (statisticType === 'max') {\n      result = max;\n    } else if (statisticType === 'average') {\n      result = sum / len;\n    } else {\n      result = sum;\n    }\n    return len === 0 ? NaN : result;\n  });\n}\nexport default function mapDataStatistic(ecModel) {\n  var seriesGroups = {};\n  ecModel.eachSeriesByType('map', function (seriesModel) {\n    var hostGeoModel = seriesModel.getHostGeoModel();\n    var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();\n    (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel);\n  });\n  zrUtil.each(seriesGroups, function (seriesList, key) {\n    var data = dataStatistics(zrUtil.map(seriesList, function (seriesModel) {\n      return seriesModel.getData();\n    }), seriesList[0].get('mapValueCalculation'));\n    for (var i = 0; i < seriesList.length; i++) {\n      seriesList[i].originalData = seriesList[i].getData();\n    }\n    // FIXME Put where?\n    for (var i = 0; i < seriesList.length; i++) {\n      seriesList[i].seriesGroup = seriesList;\n      seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel();\n      seriesList[i].setData(data.cloneShallow());\n      seriesList[i].mainSeries = seriesList[0];\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function mapSymbolLayout(ecModel) {\n  var processedMapType = {};\n  ecModel.eachSeriesByType('map', function (mapSeries) {\n    var mapType = mapSeries.getMapType();\n    if (mapSeries.getHostGeoModel() || processedMapType[mapType]) {\n      return;\n    }\n    var mapSymbolOffsets = {};\n    zrUtil.each(mapSeries.seriesGroup, function (subMapSeries) {\n      var geo = subMapSeries.coordinateSystem;\n      var data = subMapSeries.originalData;\n      if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) {\n        data.each(data.mapDimension('value'), function (value, idx) {\n          var name = data.getName(idx);\n          var region = geo.getRegion(name);\n          // If input series.data is [11, 22, '-'/null/undefined, 44],\n          // it will be filled with NaN: [11, 22, NaN, 44] and NaN will\n          // not be drawn. So here must validate if value is NaN.\n          if (!region || isNaN(value)) {\n            return;\n          }\n          var offset = mapSymbolOffsets[name] || 0;\n          var point = geo.dataToPoint(region.getCenter());\n          mapSymbolOffsets[name] = offset + 1;\n          data.setItemLayout(idx, {\n            point: point,\n            offset: offset\n          });\n        });\n      }\n    });\n    // Show label of those region not has legendIcon (which is offset 0)\n    var data = mapSeries.getData();\n    data.each(function (idx) {\n      var name = data.getName(idx);\n      var layout = data.getItemLayout(idx) || {};\n      layout.showLabel = !mapSymbolOffsets[name];\n      data.setItemLayout(idx, layout);\n    });\n    processedMapType[mapType] = true;\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * Simple view coordinate system\n * Mapping given x, y to transformd view x, y\n */\nimport * as vector from 'zrender/lib/core/vector.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport Transformable from 'zrender/lib/core/Transformable.js';\nimport { parsePercent } from '../util/number.js';\nimport { clone } from 'zrender/lib/core/util.js';\nimport { clampByZoomLimit } from '../component/helper/roamHelper.js';\nvar v2ApplyTransform = vector.applyTransform;\nvar View = /** @class */function (_super) {\n  __extends(View, _super);\n  function View(name, opt) {\n    var _this = _super.call(this) || this;\n    _this.type = 'view';\n    _this.dimensions = ['x', 'y'];\n    /**\n     * Represents the transform brought by roam/zoom.\n     * If `View['_viewRect']` applies roam transform,\n     * we can get the final displayed rect.\n     */\n    _this._roamTransformable = new Transformable();\n    /**\n     * Represents the transform from `View['_rect']` to `View['_viewRect']`.\n     */\n    _this._rawTransformable = new Transformable();\n    _this.name = name;\n    _this._opt = opt;\n    return _this;\n  }\n  View.prototype.setBoundingRect = function (x, y, width, height) {\n    this._rect = new BoundingRect(x, y, width, height);\n    this._updateCenterAndZoom();\n    return this._rect;\n  };\n  View.prototype.getBoundingRect = function () {\n    return this._rect;\n  };\n  /**\n   * If no need to transform `View['_rect']` to `View['_viewRect']`, the calling of\n   * `setViewRect` can be omitted.\n   */\n  View.prototype.setViewRect = function (x, y, width, height) {\n    this._transformTo(x, y, width, height);\n    this._viewRect = new BoundingRect(x, y, width, height);\n  };\n  /**\n   * Transformed to particular position and size\n   */\n  View.prototype._transformTo = function (x, y, width, height) {\n    var rect = this.getBoundingRect();\n    var rawTransform = this._rawTransformable;\n    rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));\n    var rawParent = rawTransform.parent;\n    rawTransform.parent = null;\n    rawTransform.decomposeTransform();\n    rawTransform.parent = rawParent;\n    this._updateTransform();\n  };\n  /**\n   * [NOTICE]\n   *  The definition of this center has always been irrelevant to some other series center like\n   *  'series-pie.center' - this center is a point on the same coord sys as `View['_rect'].x/y`,\n   *  rather than canvas viewport, and the unit is not necessarily pixel (e.g., in geo case).\n   *  @see {View['_center']} for details.\n   */\n  View.prototype.setCenter = function (centerCoord) {\n    // #16904 introcuded percentage string here, such as '33%'. But it was based on canvas\n    // width/height, which is not reasonable - the unit may incorrect, and it is unpredictable if\n    // the `View['_rect']` is not calculated based on the current canvas rect. Therefore the percentage\n    // value is changed to based on `View['_rect'].width/height` since v6. Under this definition, users\n    // can use '0%' to map the top-left of `View['_rect']` to the center of `View['_viewRect']`.\n    var opt = this._opt;\n    if (opt && opt.api && opt.ecModel && opt.ecModel.getShallow('legacyViewCoordSysCenterBase') && centerCoord) {\n      centerCoord = [parsePercent(centerCoord[0], opt.api.getWidth()), parsePercent(centerCoord[1], opt.api.getWidth())];\n    }\n    this._centerOption = clone(centerCoord);\n    this._updateCenterAndZoom();\n  };\n  View.prototype.setZoom = function (zoom) {\n    this._zoom = clampByZoomLimit(zoom || 1, this.zoomLimit);\n    this._updateCenterAndZoom();\n  };\n  /**\n   * Get default center without roam\n   */\n  View.prototype.getDefaultCenter = function () {\n    // Rect before any transform\n    var rawRect = this.getBoundingRect();\n    var cx = rawRect.x + rawRect.width / 2;\n    var cy = rawRect.y + rawRect.height / 2;\n    return [cx, cy];\n  };\n  View.prototype.getCenter = function () {\n    return this._center || this.getDefaultCenter();\n  };\n  View.prototype.getZoom = function () {\n    return this._zoom || 1;\n  };\n  View.prototype.getRoamTransform = function () {\n    return this._roamTransformable.getLocalTransform();\n  };\n  /**\n   * Ensure this method is idempotent, since it should be called when\n   * every relevant prop (e.g. _centerOption/_zoom/_rect/_viewRect) changed.\n   */\n  View.prototype._updateCenterAndZoom = function () {\n    var centerOption = this._centerOption;\n    var rect = this._rect;\n    if (centerOption && rect) {\n      this._center = [parsePercent(centerOption[0], rect.width, rect.x), parsePercent(centerOption[1], rect.height, rect.y)];\n    }\n    // Must update after view transform updated\n    var rawTransformMatrix = this._rawTransformable.getLocalTransform();\n    var roamTransform = this._roamTransformable;\n    var defaultCenter = this.getDefaultCenter();\n    var center = this.getCenter();\n    var zoom = this.getZoom();\n    center = vector.applyTransform([], center, rawTransformMatrix);\n    defaultCenter = vector.applyTransform([], defaultCenter, rawTransformMatrix);\n    roamTransform.originX = center[0];\n    roamTransform.originY = center[1];\n    roamTransform.x = defaultCenter[0] - center[0];\n    roamTransform.y = defaultCenter[1] - center[1];\n    roamTransform.scaleX = roamTransform.scaleY = zoom;\n    this._updateTransform();\n  };\n  /**\n   * Update transform props on `this` based on the current\n   * `this._roamTransformable` and `this._rawTransformable`.\n   */\n  View.prototype._updateTransform = function () {\n    var roamTransformable = this._roamTransformable;\n    var rawTransformable = this._rawTransformable;\n    rawTransformable.parent = roamTransformable;\n    roamTransformable.updateTransform();\n    rawTransformable.updateTransform();\n    matrix.copy(this.transform || (this.transform = []), rawTransformable.transform || matrix.create());\n    this._rawTransform = rawTransformable.getLocalTransform();\n    this.invTransform = this.invTransform || [];\n    matrix.invert(this.invTransform, this.transform);\n    this.decomposeTransform();\n  };\n  View.prototype.getTransformInfo = function () {\n    var rawTransformable = this._rawTransformable;\n    var roamTransformable = this._roamTransformable;\n    // Because roamTransformabel has `originX/originY` modified,\n    // but the caller of `getTransformInfo` can not handle `originX/originY`,\n    // so need to recalculate them.\n    var dummyTransformable = new Transformable();\n    dummyTransformable.transform = roamTransformable.transform;\n    dummyTransformable.decomposeTransform();\n    return {\n      roam: {\n        x: dummyTransformable.x,\n        y: dummyTransformable.y,\n        scaleX: dummyTransformable.scaleX,\n        scaleY: dummyTransformable.scaleY\n      },\n      raw: {\n        x: rawTransformable.x,\n        y: rawTransformable.y,\n        scaleX: rawTransformable.scaleX,\n        scaleY: rawTransformable.scaleY\n      }\n    };\n  };\n  View.prototype.getViewRect = function () {\n    return this._viewRect;\n  };\n  /**\n   * Get view rect after roam transform\n   */\n  View.prototype.getViewRectAfterRoam = function () {\n    var rect = this.getBoundingRect().clone();\n    rect.applyTransform(this.transform);\n    return rect;\n  };\n  /**\n   * Convert a single (lon, lat) data item to (x, y) point.\n   */\n  View.prototype.dataToPoint = function (data, noRoam, out) {\n    var transform = noRoam ? this._rawTransform : this.transform;\n    out = out || [];\n    return transform ? v2ApplyTransform(out, data, transform) : vector.copy(out, data);\n  };\n  /**\n   * Convert a (x, y) point to (lon, lat) data\n   */\n  View.prototype.pointToData = function (point, reserved, out) {\n    out = out || [];\n    var invTransform = this.invTransform;\n    return invTransform ? v2ApplyTransform(out, point, invTransform) : (out[0] = point[0], out[1] = point[1], out);\n  };\n  View.prototype.convertToPixel = function (ecModel, finder, value) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.dataToPoint(value) : null;\n  };\n  View.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.pointToData(pixel) : null;\n  };\n  /**\n   * @implements\n   */\n  View.prototype.containPoint = function (point) {\n    return this.getViewRectAfterRoam().contain(point[0], point[1]);\n  };\n  View.dimensions = ['x', 'y'];\n  return View;\n}(Transformable);\nfunction getCoordSys(finder) {\n  var seriesModel = finder.seriesModel;\n  return seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.\n}\nexport default View;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport View from '../View.js';\nimport geoSourceManager from './geoSourceManager.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nimport { warn } from '../../util/log.js';\nvar GEO_DEFAULT_PARAMS = {\n  'geoJSON': {\n    aspectScale: 0.75,\n    invertLongitute: true\n  },\n  'geoSVG': {\n    aspectScale: 1,\n    invertLongitute: false\n  }\n};\nexport var geo2DDimensions = ['lng', 'lat'];\nvar Geo = /** @class */function (_super) {\n  __extends(Geo, _super);\n  function Geo(name, map, opt) {\n    var _this = _super.call(this, name, {\n      api: opt.api,\n      ecModel: opt.ecModel\n    }) || this;\n    _this.dimensions = geo2DDimensions;\n    _this.type = 'geo';\n    // Only store specified name coord via `addGeoCoord`.\n    _this._nameCoordMap = zrUtil.createHashMap();\n    _this.map = map;\n    var projection = opt.projection;\n    var source = geoSourceManager.load(map, opt.nameMap, opt.nameProperty);\n    var resource = geoSourceManager.getGeoResource(map);\n    var resourceType = _this.resourceType = resource ? resource.type : null;\n    var regions = _this.regions = source.regions;\n    var defaultParams = GEO_DEFAULT_PARAMS[resource.type];\n    _this._regionsMap = source.regionsMap;\n    _this.regions = source.regions;\n    if (process.env.NODE_ENV !== 'production' && projection) {\n      // Do some check\n      if (resourceType === 'geoSVG') {\n        if (process.env.NODE_ENV !== 'production') {\n          warn(\"Map \" + map + \" with SVG source can't use projection. Only GeoJSON source supports projection.\");\n        }\n        projection = null;\n      }\n      if (!(projection.project && projection.unproject)) {\n        if (process.env.NODE_ENV !== 'production') {\n          warn('project and unproject must be both provided in the projeciton.');\n        }\n        projection = null;\n      }\n    }\n    _this.projection = projection;\n    var boundingRect;\n    if (projection) {\n      // Can't reuse the raw bounding rect\n      for (var i = 0; i < regions.length; i++) {\n        var regionRect = regions[i].getBoundingRect(projection);\n        boundingRect = boundingRect || regionRect.clone();\n        boundingRect.union(regionRect);\n      }\n    } else {\n      boundingRect = source.boundingRect;\n    }\n    _this.setBoundingRect(boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height);\n    // aspectScale and invertLongitute actually is the parameters default raw projection.\n    // So we ignore them if projection is given.\n    // Ignore default aspect scale if projection exits.\n    _this.aspectScale = projection ? 1 : zrUtil.retrieve2(opt.aspectScale, defaultParams.aspectScale);\n    // Not invert longitude if projection exits.\n    _this._invertLongitute = projection ? false : defaultParams.invertLongitute;\n    return _this;\n  }\n  Geo.prototype._transformTo = function (x, y, width, height) {\n    var rect = this.getBoundingRect();\n    var invertLongitute = this._invertLongitute;\n    rect = rect.clone();\n    if (invertLongitute) {\n      // Longitude is inverted.\n      rect.y = -rect.y - rect.height;\n    }\n    var rawTransformable = this._rawTransformable;\n    rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));\n    var rawParent = rawTransformable.parent;\n    rawTransformable.parent = null;\n    rawTransformable.decomposeTransform();\n    rawTransformable.parent = rawParent;\n    if (invertLongitute) {\n      rawTransformable.scaleY = -rawTransformable.scaleY;\n    }\n    this._updateTransform();\n  };\n  Geo.prototype.getRegion = function (name) {\n    return this._regionsMap.get(name);\n  };\n  Geo.prototype.getRegionByCoord = function (coord) {\n    var regions = this.regions;\n    for (var i = 0; i < regions.length; i++) {\n      var region = regions[i];\n      if (region.type === 'geoJSON' && region.contain(coord)) {\n        return regions[i];\n      }\n    }\n  };\n  /**\n   * Add geoCoord for indexing by name\n   */\n  Geo.prototype.addGeoCoord = function (name, geoCoord) {\n    this._nameCoordMap.set(name, geoCoord);\n  };\n  /**\n   * Get geoCoord by name\n   */\n  Geo.prototype.getGeoCoord = function (name) {\n    var region = this._regionsMap.get(name);\n    // Calculate center only on demand.\n    return this._nameCoordMap.get(name) || region && region.getCenter();\n  };\n  Geo.prototype.dataToPoint = function (data, noRoam, out) {\n    if (zrUtil.isString(data)) {\n      // Map area name to geoCoord\n      data = this.getGeoCoord(data);\n    }\n    if (data) {\n      var projection = this.projection;\n      if (projection) {\n        // projection may return null point.\n        data = projection.project(data);\n      }\n      return data && this.projectedToPoint(data, noRoam, out);\n    }\n  };\n  Geo.prototype.pointToData = function (point, reserved, out) {\n    var projection = this.projection;\n    if (projection) {\n      // projection may return null point.\n      point = projection.unproject(point);\n    }\n    // FIXME: if no `point`, should return [NaN, NaN], rather than undefined.\n    //  null/undefined has special meaning in `convertFromPixel`.\n    return point && this.pointToProjected(point, out);\n  };\n  /**\n   * Point to projected data. Same with pointToData when projection is used.\n   */\n  Geo.prototype.pointToProjected = function (point, out) {\n    return _super.prototype.pointToData.call(this, point, 0, out);\n  };\n  Geo.prototype.projectedToPoint = function (projected, noRoam, out) {\n    return _super.prototype.dataToPoint.call(this, projected, noRoam, out);\n  };\n  Geo.prototype.convertToPixel = function (ecModel, finder, value) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.dataToPoint(value) : null;\n  };\n  Geo.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.pointToData(pixel) : null;\n  };\n  return Geo;\n}(View);\n;\nzrUtil.mixin(Geo, View);\nfunction getCoordSys(finder) {\n  var geoModel = finder.geoModel;\n  var seriesModel = finder.seriesModel;\n  return geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map series.\n  || (seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0] || {}).coordinateSystem : null;\n}\nexport default Geo;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Geo, { geo2DDimensions } from './Geo.js';\nimport * as layout from '../../util/layout.js';\nimport * as numberUtil from '../../util/number.js';\nimport geoSourceManager from './geoSourceManager.js';\nimport * as vector from 'zrender/lib/core/vector.js';\nimport { injectCoordSysByOption } from '../../core/CoordinateSystem.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\n/**\n * Resize method bound to the geo\n */\nfunction resizeGeo(geoModel, api) {\n  var boundingCoords = geoModel.get('boundingCoords');\n  if (boundingCoords != null) {\n    var leftTop_1 = boundingCoords[0];\n    var rightBottom_1 = boundingCoords[1];\n    if (!(isFinite(leftTop_1[0]) && isFinite(leftTop_1[1]) && isFinite(rightBottom_1[0]) && isFinite(rightBottom_1[1]))) {\n      if (process.env.NODE_ENV !== 'production') {\n        console.error('Invalid boundingCoords');\n      }\n    } else {\n      // Sample around the lng/lat rect and use projection to calculate actual bounding rect.\n      var projection_1 = this.projection;\n      if (projection_1) {\n        var xMin = leftTop_1[0];\n        var yMin = leftTop_1[1];\n        var xMax = rightBottom_1[0];\n        var yMax = rightBottom_1[1];\n        leftTop_1 = [Infinity, Infinity];\n        rightBottom_1 = [-Infinity, -Infinity];\n        // TODO better way?\n        var sampleLine = function (x0, y0, x1, y1) {\n          var dx = x1 - x0;\n          var dy = y1 - y0;\n          for (var i = 0; i <= 100; i++) {\n            var p = i / 100;\n            var pt = projection_1.project([x0 + dx * p, y0 + dy * p]);\n            vector.min(leftTop_1, leftTop_1, pt);\n            vector.max(rightBottom_1, rightBottom_1, pt);\n          }\n        };\n        // Top\n        sampleLine(xMin, yMin, xMax, yMin);\n        // Right\n        sampleLine(xMax, yMin, xMax, yMax);\n        // Bottom\n        sampleLine(xMax, yMax, xMin, yMax);\n        // Left\n        sampleLine(xMin, yMax, xMax, yMin);\n      }\n      this.setBoundingRect(leftTop_1[0], leftTop_1[1], rightBottom_1[0] - leftTop_1[0], rightBottom_1[1] - leftTop_1[1]);\n    }\n  }\n  var rect = this.getBoundingRect();\n  var centerOption = geoModel.get('layoutCenter');\n  var sizeOption = geoModel.get('layoutSize');\n  // Laying out geo on `dataCoordSys`, such as cartesian, works theoretically but not supported yet.\n  // Therefore here we only handle cases that laying out on `boxCoordSys`, such as matrix/calendar.\n  var refContainer = layout.createBoxLayoutReference(geoModel, api).refContainer;\n  var aspect = rect.width / rect.height * this.aspectScale;\n  var useCenterAndSize = false;\n  var center;\n  var size;\n  if (centerOption && sizeOption) {\n    center = [numberUtil.parsePercent(centerOption[0], refContainer.width) + refContainer.x, numberUtil.parsePercent(centerOption[1], refContainer.height) + refContainer.y];\n    size = numberUtil.parsePercent(sizeOption, Math.min(refContainer.width, refContainer.height));\n    if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) {\n      useCenterAndSize = true;\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.');\n      }\n    }\n  }\n  var viewRect;\n  if (useCenterAndSize) {\n    viewRect = {};\n    if (aspect > 1) {\n      // Width is same with size\n      viewRect.width = size;\n      viewRect.height = size / aspect;\n    } else {\n      viewRect.height = size;\n      viewRect.width = size * aspect;\n    }\n    viewRect.y = center[1] - viewRect.height / 2;\n    viewRect.x = center[0] - viewRect.width / 2;\n  } else {\n    // Use left/top/width/height\n    var boxLayoutOption = geoModel.getBoxLayoutParams();\n    boxLayoutOption.aspect = aspect;\n    viewRect = layout.getLayoutRect(boxLayoutOption, refContainer);\n    viewRect = layout.applyPreserveAspect(geoModel, viewRect, aspect);\n  }\n  this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);\n  this.setCenter(geoModel.get('center'));\n  this.setZoom(geoModel.get('zoom'));\n}\n// Back compat for ECharts2, where the coord map is set on map series:\n// {type: 'map', geoCoord: {'cityA': [116.46,39.92], 'cityA': [119.12,24.61]}},\nfunction setGeoCoords(geo, model) {\n  zrUtil.each(model.get('geoCoord'), function (geoCoord, name) {\n    geo.addGeoCoord(name, geoCoord);\n  });\n}\nvar GeoCreator = /** @class */function () {\n  function GeoCreator() {\n    // For deciding which dimensions to use when creating list data\n    this.dimensions = geo2DDimensions;\n  }\n  GeoCreator.prototype.create = function (ecModel, api) {\n    var geoList = [];\n    function getCommonGeoProperties(model) {\n      return {\n        nameProperty: model.get('nameProperty'),\n        aspectScale: model.get('aspectScale'),\n        projection: model.get('projection')\n      };\n    }\n    // FIXME Create each time may be slow\n    ecModel.eachComponent('geo', function (geoModel, idx) {\n      var mapName = geoModel.get('map');\n      var geo = new Geo(mapName + idx, mapName, zrUtil.extend({\n        nameMap: geoModel.get('nameMap'),\n        api: api,\n        ecModel: ecModel\n      }, getCommonGeoProperties(geoModel)));\n      geo.zoomLimit = geoModel.get('scaleLimit');\n      geoList.push(geo);\n      // setGeoCoords(geo, geoModel);\n      geoModel.coordinateSystem = geo;\n      geo.model = geoModel;\n      // Inject resize method\n      geo.resize = resizeGeo;\n      geo.resize(geoModel, api);\n    });\n    ecModel.eachSeries(function (seriesModel) {\n      injectCoordSysByOption({\n        targetModel: seriesModel,\n        coordSysType: 'geo',\n        coordSysProvider: function () {\n          var geoModel = seriesModel.subType === 'map' ? seriesModel.getHostGeoModel() : seriesModel.getReferringComponents('geo', SINGLE_REFERRING).models[0];\n          return geoModel && geoModel.coordinateSystem;\n        },\n        allowNotFound: true\n      });\n    });\n    // If has map series\n    var mapModelGroupBySeries = {};\n    ecModel.eachSeriesByType('map', function (seriesModel) {\n      if (!seriesModel.getHostGeoModel()) {\n        var mapType = seriesModel.getMapType();\n        mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || [];\n        mapModelGroupBySeries[mapType].push(seriesModel);\n      }\n    });\n    zrUtil.each(mapModelGroupBySeries, function (mapSeries, mapType) {\n      var nameMapList = zrUtil.map(mapSeries, function (singleMapSeries) {\n        return singleMapSeries.get('nameMap');\n      });\n      var geo = new Geo(mapType, mapType, zrUtil.extend({\n        nameMap: zrUtil.mergeAll(nameMapList),\n        api: api,\n        ecModel: ecModel\n      }, getCommonGeoProperties(mapSeries[0])));\n      geo.zoomLimit = zrUtil.retrieve.apply(null, zrUtil.map(mapSeries, function (singleMapSeries) {\n        return singleMapSeries.get('scaleLimit');\n      }));\n      geoList.push(geo);\n      // Inject resize method\n      geo.resize = resizeGeo;\n      geo.resize(mapSeries[0], api);\n      zrUtil.each(mapSeries, function (singleMapSeries) {\n        singleMapSeries.coordinateSystem = geo;\n        setGeoCoords(geo, singleMapSeries);\n      });\n    });\n    return geoList;\n  };\n  /**\n   * Fill given regions array\n   */\n  GeoCreator.prototype.getFilledRegions = function (originRegionArr, mapName, nameMap, nameProperty) {\n    // Not use the original\n    var regionsArr = (originRegionArr || []).slice();\n    var dataNameMap = zrUtil.createHashMap();\n    for (var i = 0; i < regionsArr.length; i++) {\n      dataNameMap.set(regionsArr[i].name, regionsArr[i]);\n    }\n    var source = geoSourceManager.load(mapName, nameMap, nameProperty);\n    zrUtil.each(source.regions, function (region) {\n      var name = region.name;\n      var regionOption = dataNameMap.get(name);\n      // apply specified echarts style in GeoJSON data\n      var specifiedGeoJSONRegionStyle = region.properties && region.properties.echartsStyle;\n      if (!regionOption) {\n        regionOption = {\n          name: name\n        };\n        regionsArr.push(regionOption);\n      }\n      specifiedGeoJSONRegionStyle && zrUtil.merge(regionOption, specifiedGeoJSONRegionStyle);\n    });\n    return regionsArr;\n  };\n  return GeoCreator;\n}();\nvar geoCreator = new GeoCreator();\nexport default geoCreator;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../../util/model.js';\nimport ComponentModel from '../../model/Component.js';\nimport Model from '../../model/Model.js';\nimport geoCreator from './geoCreator.js';\nimport geoSourceManager from './geoSourceManager.js';\nimport tokens from '../../visual/tokens.js';\n;\nvar GeoModel = /** @class */function (_super) {\n  __extends(GeoModel, _super);\n  function GeoModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GeoModel.type;\n    return _this;\n  }\n  GeoModel.prototype.init = function (option, parentModel, ecModel) {\n    this.mergeDefaultAndTheme(option, ecModel);\n    var source = geoSourceManager.getGeoResource(option.map);\n    if (source && source.type === 'geoJSON') {\n      var itemStyle = option.itemStyle = option.itemStyle || {};\n      if (!('color' in itemStyle)) {\n        itemStyle.color = option.defaultItemStyleColor || tokens.color.backgroundTint;\n      }\n    }\n    // Default label emphasis `show`\n    modelUtil.defaultEmphasis(option, 'label', ['show']);\n  };\n  GeoModel.prototype.optionUpdated = function () {\n    var _this = this;\n    var option = this.option;\n    option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap, option.nameProperty);\n    var selectedMap = {};\n    this._optionModelMap = zrUtil.reduce(option.regions || [], function (optionModelMap, regionOpt) {\n      var regionName = regionOpt.name;\n      if (regionName) {\n        optionModelMap.set(regionName, new Model(regionOpt, _this, _this.ecModel));\n        if (regionOpt.selected) {\n          selectedMap[regionName] = true;\n        }\n      }\n      return optionModelMap;\n    }, zrUtil.createHashMap());\n    if (!option.selectedMap) {\n      option.selectedMap = selectedMap;\n    }\n  };\n  /**\n   * Get model of region.\n   */\n  GeoModel.prototype.getRegionModel = function (name) {\n    return this._optionModelMap.get(name) || new Model(null, this, this.ecModel);\n  };\n  /**\n   * Format label\n   * @param name Region name\n   */\n  GeoModel.prototype.getFormattedLabel = function (name, status) {\n    var regionModel = this.getRegionModel(name);\n    var formatter = status === 'normal' ? regionModel.get(['label', 'formatter']) : regionModel.get(['emphasis', 'label', 'formatter']);\n    var params = {\n      name: name\n    };\n    if (zrUtil.isFunction(formatter)) {\n      params.status = status;\n      return formatter(params);\n    } else if (zrUtil.isString(formatter)) {\n      return formatter.replace('{a}', name != null ? name : '');\n    }\n  };\n  GeoModel.prototype.setZoom = function (zoom) {\n    this.option.zoom = zoom;\n  };\n  GeoModel.prototype.setCenter = function (center) {\n    this.option.center = center;\n  };\n  // PENGING If selectedMode is null ?\n  GeoModel.prototype.select = function (name) {\n    var option = this.option;\n    var selectedMode = option.selectedMode;\n    if (!selectedMode) {\n      return;\n    }\n    if (selectedMode !== 'multiple') {\n      option.selectedMap = null;\n    }\n    var selectedMap = option.selectedMap || (option.selectedMap = {});\n    selectedMap[name] = true;\n  };\n  GeoModel.prototype.unSelect = function (name) {\n    var selectedMap = this.option.selectedMap;\n    if (selectedMap) {\n      selectedMap[name] = false;\n    }\n  };\n  GeoModel.prototype.toggleSelected = function (name) {\n    this[this.isSelected(name) ? 'unSelect' : 'select'](name);\n  };\n  GeoModel.prototype.isSelected = function (name) {\n    var selectedMap = this.option.selectedMap;\n    return !!(selectedMap && selectedMap[name]);\n  };\n  GeoModel.type = 'geo';\n  GeoModel.layoutMode = 'box';\n  GeoModel.defaultOption = {\n    // zlevel: 0,\n    z: 0,\n    show: true,\n    left: 'center',\n    top: 'center',\n    // Default value:\n    // for geoSVG source: 1,\n    // for geoJSON source: 0.75.\n    aspectScale: null,\n    // /// Layout with center and size\n    // If you want to put map in a fixed size box with right aspect ratio\n    // This two properties may be more convenient\n    // layoutCenter: [50%, 50%]\n    // layoutSize: 100\n    silent: false,\n    // Map type\n    map: '',\n    // Define left-top, right-bottom coords to control view\n    // For example, [ [180, 90], [-180, -90] ]\n    boundingCoords: null,\n    // Default on center of map\n    center: null,\n    zoom: 1,\n    scaleLimit: null,\n    // selectedMode: false\n    label: {\n      show: false,\n      color: tokens.color.tertiary\n    },\n    itemStyle: {\n      borderWidth: 0.5,\n      borderColor: tokens.color.border\n    },\n    emphasis: {\n      label: {\n        show: true,\n        color: tokens.color.primary\n      },\n      itemStyle: {\n        color: tokens.color.highlight\n      }\n    },\n    select: {\n      label: {\n        show: true,\n        color: tokens.color.primary\n      },\n      itemStyle: {\n        color: tokens.color.highlight\n      }\n    },\n    regions: []\n    // tooltip: {\n    //     show: false\n    // }\n  };\n  return GeoModel;\n}(ComponentModel);\nexport default GeoModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport MapDraw from '../helper/MapDraw.js';\nimport ComponentView from '../../view/Component.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { findEventDispatcher } from '../../util/event.js';\nvar GeoView = /** @class */function (_super) {\n  __extends(GeoView, _super);\n  function GeoView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GeoView.type;\n    _this.focusBlurEnabled = true;\n    return _this;\n  }\n  GeoView.prototype.init = function (ecModel, api) {\n    this._api = api;\n  };\n  GeoView.prototype.render = function (geoModel, ecModel, api, payload) {\n    this._model = geoModel;\n    if (!geoModel.get('show')) {\n      this._mapDraw && this._mapDraw.remove();\n      this._mapDraw = null;\n      return;\n    }\n    if (!this._mapDraw) {\n      this._mapDraw = new MapDraw(api);\n    }\n    var mapDraw = this._mapDraw;\n    mapDraw.draw(geoModel, ecModel, api, this, payload);\n    mapDraw.group.on('click', this._handleRegionClick, this);\n    mapDraw.group.silent = geoModel.get('silent');\n    this.group.add(mapDraw.group);\n    this.updateSelectStatus(geoModel, ecModel, api);\n  };\n  GeoView.prototype._handleRegionClick = function (e) {\n    var eventData;\n    findEventDispatcher(e.target, function (current) {\n      return (eventData = getECData(current).eventData) != null;\n    }, true);\n    if (eventData) {\n      this._api.dispatchAction({\n        type: 'geoToggleSelect',\n        geoId: this._model.id,\n        name: eventData.name\n      });\n    }\n  };\n  GeoView.prototype.updateSelectStatus = function (model, ecModel, api) {\n    var _this = this;\n    this._mapDraw.group.traverse(function (node) {\n      var eventData = getECData(node).eventData;\n      if (eventData) {\n        _this._model.isSelected(eventData.name) ? api.enterSelect(node) : api.leaveSelect(node);\n        // No need to traverse children.\n        return true;\n      }\n    });\n  };\n  GeoView.prototype.findHighDownDispatchers = function (name) {\n    return this._mapDraw && this._mapDraw.findHighDownDispatchers(name, this._model);\n  };\n  GeoView.prototype.dispose = function () {\n    this._mapDraw && this._mapDraw.remove();\n  };\n  GeoView.type = 'geo';\n  return GeoView;\n}(ComponentView);\nexport default GeoView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport GeoModel from '../../coord/geo/GeoModel.js';\nimport geoCreator from '../../coord/geo/geoCreator.js';\nimport { each } from 'zrender/lib/core/util.js';\nimport { updateCenterAndZoomInAction } from '../../component/helper/roamHelper.js';\nimport GeoView from './GeoView.js';\nimport geoSourceManager from '../../coord/geo/geoSourceManager.js';\nfunction registerMap(mapName, geoJson, specialAreas) {\n  geoSourceManager.registerMap(mapName, geoJson, specialAreas);\n}\nexport function install(registers) {\n  registers.registerCoordinateSystem('geo', geoCreator);\n  registers.registerComponentModel(GeoModel);\n  registers.registerComponentView(GeoView);\n  registers.registerImpl('registerMap', registerMap);\n  registers.registerImpl('getMap', function (mapName) {\n    return geoSourceManager.getMapForUser(mapName);\n  });\n  function makeAction(method, actionInfo) {\n    actionInfo.update = 'geo:updateSelectStatus';\n    registers.registerAction(actionInfo, function (payload, ecModel) {\n      var selected = {};\n      var allSelected = [];\n      ecModel.eachComponent({\n        mainType: 'geo',\n        query: payload\n      }, function (geoModel) {\n        geoModel[method](payload.name);\n        var geo = geoModel.coordinateSystem;\n        each(geo.regions, function (region) {\n          selected[region.name] = geoModel.isSelected(region.name) || false;\n        });\n        // Notice: there might be duplicated name in different regions.\n        var names = [];\n        each(selected, function (v, name) {\n          selected[name] && names.push(name);\n        });\n        allSelected.push({\n          geoIndex: geoModel.componentIndex,\n          // Use singular, the same naming convention as the event `selectchanged`.\n          name: names\n        });\n      });\n      return {\n        selected: selected,\n        allSelected: allSelected,\n        name: payload.name\n      };\n    });\n  }\n  makeAction('toggleSelected', {\n    type: 'geoToggleSelect',\n    event: 'geoselectchanged'\n  });\n  makeAction('select', {\n    type: 'geoSelect',\n    event: 'geoselected'\n  });\n  makeAction('unSelect', {\n    type: 'geoUnSelect',\n    event: 'geounselected'\n  });\n  /**\n   * @payload\n   * @property {string} [componentType=series]\n   * @property {number} [dx]\n   * @property {number} [dy]\n   * @property {number} [zoom]\n   * @property {number} [originX]\n   * @property {number} [originY]\n   */\n  registers.registerAction({\n    type: 'geoRoam',\n    event: 'geoRoam',\n    update: 'updateTransform'\n  }, function (payload, ecModel, api) {\n    var componentType = payload.componentType;\n    if (!componentType) {\n      // backward compat, but `payload.componentType` is deprecated.\n      if (payload.geoId != null) {\n        componentType = 'geo';\n      } else if (payload.seriesId != null) {\n        componentType = 'series';\n      }\n    }\n    if (!componentType) {\n      componentType = 'series';\n    }\n    // FIXME: payload.geoId/payload.seriesId should be required, but historically\n    //  it is not mandatory, causing that all of the geo or series can be queried below,\n    //  which is not reasonable.\n    ecModel.eachComponent({\n      mainType: componentType,\n      query: payload\n    }, function (componentModel) {\n      var geo = componentModel.coordinateSystem;\n      if (geo.type !== 'geo') {\n        return;\n      }\n      var res = updateCenterAndZoomInAction(geo, payload, componentModel.get('scaleLimit'));\n      componentModel.setCenter && componentModel.setCenter(res.center);\n      componentModel.setZoom && componentModel.setZoom(res.zoom);\n      // All map series with same `map` use the same geo coordinate system\n      // So the center and zoom must be in sync. Include the series not selected by legend\n      if (componentType === 'series') {\n        each(componentModel.seriesGroup, function (seriesModel) {\n          seriesModel.setCenter(res.center);\n          seriesModel.setZoom(res.zoom);\n        });\n      }\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport MapView from './MapView.js';\nimport MapSeries from './MapSeries.js';\nimport mapDataStatistic from './mapDataStatistic.js';\nimport mapSymbolLayout from './mapSymbolLayout.js';\nimport { createLegacyDataSelectAction } from '../../legacy/dataSelectAction.js';\nimport { install as installGeo } from '../../component/geo/install.js';\nexport function install(registers) {\n  use(installGeo);\n  registers.registerChartView(MapView);\n  registers.registerSeriesModel(MapSeries);\n  registers.registerLayout(mapSymbolLayout);\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic);\n  createLegacyDataSelectAction('map', registers.registerAction);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Initialize all computational message for following algorithm.\n */\nexport function init(inRoot) {\n  var root = inRoot;\n  root.hierNode = {\n    defaultAncestor: null,\n    ancestor: root,\n    prelim: 0,\n    modifier: 0,\n    change: 0,\n    shift: 0,\n    i: 0,\n    thread: null\n  };\n  var nodes = [root];\n  var node;\n  var children;\n  while (node = nodes.pop()) {\n    // jshint ignore:line\n    children = node.children;\n    if (node.isExpand && children.length) {\n      var n = children.length;\n      for (var i = n - 1; i >= 0; i--) {\n        var child = children[i];\n        child.hierNode = {\n          defaultAncestor: null,\n          ancestor: child,\n          prelim: 0,\n          modifier: 0,\n          change: 0,\n          shift: 0,\n          i: i,\n          thread: null\n        };\n        nodes.push(child);\n      }\n    }\n  }\n}\n/**\n * The implementation of this function was originally copied from \"d3.js\"\n * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n *\n * Computes a preliminary x coordinate for node. Before that, this function is\n * applied recursively to the children of node, as well as the function\n * apportion(). After spacing out the children by calling executeShifts(), the\n * node is placed to the midpoint of its outermost children.\n */\nexport function firstWalk(node, separation) {\n  var children = node.isExpand ? node.children : [];\n  var siblings = node.parentNode.children;\n  var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null;\n  if (children.length) {\n    executeShifts(node);\n    var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2;\n    if (subtreeW) {\n      node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);\n      node.hierNode.modifier = node.hierNode.prelim - midPoint;\n    } else {\n      node.hierNode.prelim = midPoint;\n    }\n  } else if (subtreeW) {\n    node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);\n  }\n  node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation);\n}\n/**\n * The implementation of this function was originally copied from \"d3.js\"\n * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n *\n * Computes all real x-coordinates by summing up the modifiers recursively.\n */\nexport function secondWalk(node) {\n  var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier;\n  node.setLayout({\n    x: nodeX\n  }, true);\n  node.hierNode.modifier += node.parentNode.hierNode.modifier;\n}\nexport function separation(cb) {\n  return arguments.length ? cb : defaultSeparation;\n}\n/**\n * Transform the common coordinate to radial coordinate.\n */\nexport function radialCoordinate(rad, r) {\n  rad -= Math.PI / 2;\n  return {\n    x: r * Math.cos(rad),\n    y: r * Math.sin(rad)\n  };\n}\n/**\n * All other shifts, applied to the smaller subtrees between w- and w+, are\n * performed by this function.\n *\n * The implementation of this function was originally copied from \"d3.js\"\n * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n */\nfunction executeShifts(node) {\n  var children = node.children;\n  var n = children.length;\n  var shift = 0;\n  var change = 0;\n  while (--n >= 0) {\n    var child = children[n];\n    child.hierNode.prelim += shift;\n    child.hierNode.modifier += shift;\n    change += child.hierNode.change;\n    shift += child.hierNode.shift + change;\n  }\n}\n/**\n * The implementation of this function was originally copied from \"d3.js\"\n * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n *\n * The core of the algorithm. Here, a new subtree is combined with the\n * previous subtrees. Threads are used to traverse the inside and outside\n * contours of the left and right subtree up to the highest common level.\n * Whenever two nodes of the inside contours conflict, we compute the left\n * one of the greatest uncommon ancestors using the function nextAncestor()\n * and call moveSubtree() to shift the subtree and prepare the shifts of\n * smaller subtrees. Finally, we add a new thread (if necessary).\n */\nfunction apportion(subtreeV, subtreeW, ancestor, separation) {\n  if (subtreeW) {\n    var nodeOutRight = subtreeV;\n    var nodeInRight = subtreeV;\n    var nodeOutLeft = nodeInRight.parentNode.children[0];\n    var nodeInLeft = subtreeW;\n    var sumOutRight = nodeOutRight.hierNode.modifier;\n    var sumInRight = nodeInRight.hierNode.modifier;\n    var sumOutLeft = nodeOutLeft.hierNode.modifier;\n    var sumInLeft = nodeInLeft.hierNode.modifier;\n    while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) {\n      nodeOutRight = nextRight(nodeOutRight);\n      nodeOutLeft = nextLeft(nodeOutLeft);\n      nodeOutRight.hierNode.ancestor = subtreeV;\n      var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight);\n      if (shift > 0) {\n        moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift);\n        sumInRight += shift;\n        sumOutRight += shift;\n      }\n      sumInLeft += nodeInLeft.hierNode.modifier;\n      sumInRight += nodeInRight.hierNode.modifier;\n      sumOutRight += nodeOutRight.hierNode.modifier;\n      sumOutLeft += nodeOutLeft.hierNode.modifier;\n    }\n    if (nodeInLeft && !nextRight(nodeOutRight)) {\n      nodeOutRight.hierNode.thread = nodeInLeft;\n      nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight;\n    }\n    if (nodeInRight && !nextLeft(nodeOutLeft)) {\n      nodeOutLeft.hierNode.thread = nodeInRight;\n      nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft;\n      ancestor = subtreeV;\n    }\n  }\n  return ancestor;\n}\n/**\n * This function is used to traverse the right contour of a subtree.\n * It returns the rightmost child of node or the thread of node. The function\n * returns null if and only if node is on the highest depth of its subtree.\n */\nfunction nextRight(node) {\n  var children = node.children;\n  return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread;\n}\n/**\n * This function is used to traverse the left contour of a subtree (or a subforest).\n * It returns the leftmost child of node or the thread of node. The function\n * returns null if and only if node is on the highest depth of its subtree.\n */\nfunction nextLeft(node) {\n  var children = node.children;\n  return children.length && node.isExpand ? children[0] : node.hierNode.thread;\n}\n/**\n * If nodeInLeft\u2019s ancestor is a sibling of node, returns nodeInLeft\u2019s ancestor.\n * Otherwise, returns the specified ancestor.\n */\nfunction nextAncestor(nodeInLeft, node, ancestor) {\n  return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor;\n}\n/**\n * The implementation of this function was originally copied from \"d3.js\"\n * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n *\n * Shifts the current subtree rooted at wr.\n * This is done by increasing prelim(w+) and modifier(w+) by shift.\n */\nfunction moveSubtree(wl, wr, shift) {\n  var change = shift / (wr.hierNode.i - wl.hierNode.i);\n  wr.hierNode.change -= change;\n  wr.hierNode.shift += shift;\n  wr.hierNode.modifier += shift;\n  wr.hierNode.prelim += shift;\n  wl.hierNode.change += change;\n}\n/**\n * The implementation of this function was originally copied from \"d3.js\"\n * <https://github.com/d3/d3-hierarchy/blob/4c1f038f2725d6eae2e49b61d01456400694bac4/src/tree.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n */\nfunction defaultSeparation(node1, node2) {\n  return node1.parentNode === node2.parentNode ? 1 : 2;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport SymbolClz from '../helper/Symbol.js';\nimport { radialCoordinate } from './layoutHelper.js';\nimport * as bbox from 'zrender/lib/core/bbox.js';\nimport View from '../../coord/View.js';\nimport * as roamHelper from '../../component/helper/roamHelper.js';\nimport RoamController from '../../component/helper/RoamController.js';\nimport { parsePercent } from '../../util/number.js';\nimport ChartView from '../../view/Chart.js';\nimport Path from 'zrender/lib/graphic/Path.js';\nimport { setStatesStylesFromModel, setStatesFlag, setDefaultStateProxy, HOVER_STATE_BLUR } from '../../util/states.js';\nimport tokens from '../../visual/tokens.js';\nvar TreeEdgeShape = /** @class */function () {\n  function TreeEdgeShape() {\n    this.parentPoint = [];\n    this.childPoints = [];\n  }\n  return TreeEdgeShape;\n}();\nvar TreePath = /** @class */function (_super) {\n  __extends(TreePath, _super);\n  function TreePath(opts) {\n    return _super.call(this, opts) || this;\n  }\n  TreePath.prototype.getDefaultStyle = function () {\n    return {\n      stroke: tokens.color.neutral99,\n      fill: null\n    };\n  };\n  TreePath.prototype.getDefaultShape = function () {\n    return new TreeEdgeShape();\n  };\n  TreePath.prototype.buildPath = function (ctx, shape) {\n    var childPoints = shape.childPoints;\n    var childLen = childPoints.length;\n    var parentPoint = shape.parentPoint;\n    var firstChildPos = childPoints[0];\n    var lastChildPos = childPoints[childLen - 1];\n    if (childLen === 1) {\n      ctx.moveTo(parentPoint[0], parentPoint[1]);\n      ctx.lineTo(firstChildPos[0], firstChildPos[1]);\n      return;\n    }\n    var orient = shape.orient;\n    var forkDim = orient === 'TB' || orient === 'BT' ? 0 : 1;\n    var otherDim = 1 - forkDim;\n    var forkPosition = parsePercent(shape.forkPosition, 1);\n    var tmpPoint = [];\n    tmpPoint[forkDim] = parentPoint[forkDim];\n    tmpPoint[otherDim] = parentPoint[otherDim] + (lastChildPos[otherDim] - parentPoint[otherDim]) * forkPosition;\n    ctx.moveTo(parentPoint[0], parentPoint[1]);\n    ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n    ctx.moveTo(firstChildPos[0], firstChildPos[1]);\n    tmpPoint[forkDim] = firstChildPos[forkDim];\n    ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n    tmpPoint[forkDim] = lastChildPos[forkDim];\n    ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n    ctx.lineTo(lastChildPos[0], lastChildPos[1]);\n    for (var i = 1; i < childLen - 1; i++) {\n      var point = childPoints[i];\n      ctx.moveTo(point[0], point[1]);\n      tmpPoint[forkDim] = point[forkDim];\n      ctx.lineTo(tmpPoint[0], tmpPoint[1]);\n    }\n  };\n  return TreePath;\n}(Path);\nvar TreeView = /** @class */function (_super) {\n  __extends(TreeView, _super);\n  function TreeView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TreeView.type;\n    _this._mainGroup = new graphic.Group();\n    return _this;\n  }\n  TreeView.prototype.init = function (ecModel, api) {\n    this._controller = new RoamController(api.getZr());\n    this._controllerHost = {\n      target: this.group\n    };\n    this.group.add(this._mainGroup);\n  };\n  TreeView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var layoutInfo = seriesModel.layoutInfo;\n    var group = this._mainGroup;\n    var layout = seriesModel.get('layout');\n    if (layout === 'radial') {\n      group.x = layoutInfo.x + layoutInfo.width / 2;\n      group.y = layoutInfo.y + layoutInfo.height / 2;\n    } else {\n      group.x = layoutInfo.x;\n      group.y = layoutInfo.y;\n    }\n    this._updateViewCoordSys(seriesModel, api);\n    this._updateController(seriesModel, null, ecModel, api);\n    var oldData = this._data;\n    data.diff(oldData).add(function (newIdx) {\n      if (symbolNeedsDraw(data, newIdx)) {\n        // Create node and edge\n        updateNode(data, newIdx, null, group, seriesModel);\n      }\n    }).update(function (newIdx, oldIdx) {\n      var symbolEl = oldData.getItemGraphicEl(oldIdx);\n      if (!symbolNeedsDraw(data, newIdx)) {\n        symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel);\n        return;\n      }\n      // Update node and edge\n      updateNode(data, newIdx, symbolEl, group, seriesModel);\n    }).remove(function (oldIdx) {\n      var symbolEl = oldData.getItemGraphicEl(oldIdx);\n      // When remove a collapsed node of subtree, since the collapsed\n      // node haven't been initialized with a symbol element,\n      // you can't found it's symbol element through index.\n      // so if we want to remove the symbol element we should insure\n      // that the symbol element is not null.\n      if (symbolEl) {\n        removeNode(oldData, oldIdx, symbolEl, group, seriesModel);\n      }\n    }).execute();\n    this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');\n    this._updateNodeAndLinkScale(seriesModel);\n    if (seriesModel.get('expandAndCollapse') === true) {\n      data.eachItemGraphicEl(function (el, dataIndex) {\n        el.off('click').on('click', function () {\n          api.dispatchAction({\n            type: 'treeExpandAndCollapse',\n            seriesId: seriesModel.id,\n            dataIndex: dataIndex\n          });\n        });\n      });\n    }\n    this._data = data;\n  };\n  TreeView.prototype._updateViewCoordSys = function (seriesModel, api) {\n    var data = seriesModel.getData();\n    var points = [];\n    data.each(function (idx) {\n      var layout = data.getItemLayout(idx);\n      if (layout && !isNaN(layout.x) && !isNaN(layout.y)) {\n        points.push([+layout.x, +layout.y]);\n      }\n    });\n    var min = [];\n    var max = [];\n    bbox.fromPoints(points, min, max);\n    // If don't Store min max when collapse the root node after roam,\n    // the root node will disappear.\n    var oldMin = this._min;\n    var oldMax = this._max;\n    // If width or height is 0\n    if (max[0] - min[0] === 0) {\n      min[0] = oldMin ? oldMin[0] : min[0] - 1;\n      max[0] = oldMax ? oldMax[0] : max[0] + 1;\n    }\n    if (max[1] - min[1] === 0) {\n      min[1] = oldMin ? oldMin[1] : min[1] - 1;\n      max[1] = oldMax ? oldMax[1] : max[1] + 1;\n    }\n    var viewCoordSys = seriesModel.coordinateSystem = new View(null, {\n      api: api,\n      ecModel: seriesModel.ecModel\n    });\n    viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n    viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n    viewCoordSys.setCenter(seriesModel.get('center'));\n    viewCoordSys.setZoom(seriesModel.get('zoom'));\n    // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group,\n    // and 'treeRoam' action.\n    this.group.attr({\n      x: viewCoordSys.x,\n      y: viewCoordSys.y,\n      scaleX: viewCoordSys.scaleX,\n      scaleY: viewCoordSys.scaleY\n    });\n    this._min = min;\n    this._max = max;\n  };\n  TreeView.prototype._updateController = function (seriesModel, clipRect, ecModel, api) {\n    var _this = this;\n    roamHelper.updateController(seriesModel, api, this.group, this._controller, this._controllerHost, clipRect);\n    this._controller.on('zoom', function (e) {\n      _this._updateNodeAndLinkScale(seriesModel);\n    });\n  };\n  TreeView.prototype._updateNodeAndLinkScale = function (seriesModel) {\n    var data = seriesModel.getData();\n    var nodeScale = this._getNodeGlobalScale(seriesModel);\n    data.eachItemGraphicEl(function (el, idx) {\n      el.setSymbolScale(nodeScale);\n    });\n  };\n  TreeView.prototype._getNodeGlobalScale = function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys.type !== 'view') {\n      return 1;\n    }\n    var nodeScaleRatio = this._nodeScaleRatio;\n    var groupZoom = coordSys.scaleX || 1;\n    // Scale node when zoom changes\n    var roamZoom = coordSys.getZoom();\n    var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n    return nodeScale / groupZoom;\n  };\n  TreeView.prototype.dispose = function () {\n    this._controller && this._controller.dispose();\n    this._controllerHost = null;\n  };\n  TreeView.prototype.remove = function () {\n    this._mainGroup.removeAll();\n    this._data = null;\n  };\n  TreeView.type = 'tree';\n  return TreeView;\n}(ChartView);\nfunction symbolNeedsDraw(data, dataIndex) {\n  var layout = data.getItemLayout(dataIndex);\n  return layout && !isNaN(layout.x) && !isNaN(layout.y);\n}\nfunction updateNode(data, dataIndex, symbolEl, group, seriesModel) {\n  var isInit = !symbolEl;\n  var node = data.tree.getNodeByDataIndex(dataIndex);\n  var itemModel = node.getModel();\n  var visualColor = node.getVisual('style').fill;\n  var symbolInnerColor = node.isExpand === false && node.children.length !== 0 ? visualColor : tokens.color.neutral00;\n  var virtualRoot = data.tree.root;\n  var source = node.parentNode === virtualRoot ? node : node.parentNode || node;\n  var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);\n  var sourceLayout = source.getLayout();\n  var sourceOldLayout = sourceSymbolEl ? {\n    x: sourceSymbolEl.__oldX,\n    y: sourceSymbolEl.__oldY,\n    rawX: sourceSymbolEl.__radialOldRawX,\n    rawY: sourceSymbolEl.__radialOldRawY\n  } : sourceLayout;\n  var targetLayout = node.getLayout();\n  if (isInit) {\n    symbolEl = new SymbolClz(data, dataIndex, null, {\n      symbolInnerColor: symbolInnerColor,\n      useNameLabel: true\n    });\n    symbolEl.x = sourceOldLayout.x;\n    symbolEl.y = sourceOldLayout.y;\n  } else {\n    symbolEl.updateData(data, dataIndex, null, {\n      symbolInnerColor: symbolInnerColor,\n      useNameLabel: true\n    });\n  }\n  symbolEl.__radialOldRawX = symbolEl.__radialRawX;\n  symbolEl.__radialOldRawY = symbolEl.__radialRawY;\n  symbolEl.__radialRawX = targetLayout.rawX;\n  symbolEl.__radialRawY = targetLayout.rawY;\n  group.add(symbolEl);\n  data.setItemGraphicEl(dataIndex, symbolEl);\n  symbolEl.__oldX = symbolEl.x;\n  symbolEl.__oldY = symbolEl.y;\n  graphic.updateProps(symbolEl, {\n    x: targetLayout.x,\n    y: targetLayout.y\n  }, seriesModel);\n  var symbolPath = symbolEl.getSymbolPath();\n  if (seriesModel.get('layout') === 'radial') {\n    var realRoot = virtualRoot.children[0];\n    var rootLayout = realRoot.getLayout();\n    var length_1 = realRoot.children.length;\n    var rad = void 0;\n    var isLeft = void 0;\n    if (targetLayout.x === rootLayout.x && node.isExpand === true && realRoot.children.length) {\n      var center = {\n        x: (realRoot.children[0].getLayout().x + realRoot.children[length_1 - 1].getLayout().x) / 2,\n        y: (realRoot.children[0].getLayout().y + realRoot.children[length_1 - 1].getLayout().y) / 2\n      };\n      rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x);\n      if (rad < 0) {\n        rad = Math.PI * 2 + rad;\n      }\n      isLeft = center.x < rootLayout.x;\n      if (isLeft) {\n        rad = rad - Math.PI;\n      }\n    } else {\n      rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x);\n      if (rad < 0) {\n        rad = Math.PI * 2 + rad;\n      }\n      if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) {\n        isLeft = targetLayout.x < rootLayout.x;\n        if (isLeft) {\n          rad = rad - Math.PI;\n        }\n      } else {\n        isLeft = targetLayout.x > rootLayout.x;\n        if (!isLeft) {\n          rad = rad - Math.PI;\n        }\n      }\n    }\n    var textPosition = isLeft ? 'left' : 'right';\n    var normalLabelModel = itemModel.getModel('label');\n    var rotate = normalLabelModel.get('rotate');\n    var labelRotateRadian = rotate * (Math.PI / 180);\n    var textContent = symbolPath.getTextContent();\n    if (textContent) {\n      symbolPath.setTextConfig({\n        position: normalLabelModel.get('position') || textPosition,\n        rotation: rotate == null ? -rad : labelRotateRadian,\n        origin: 'center'\n      });\n      textContent.setStyle('verticalAlign', 'middle');\n    }\n  }\n  // Handle status\n  var focus = itemModel.get(['emphasis', 'focus']);\n  var focusDataIndices = focus === 'relative' ? zrUtil.concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : null;\n  if (focusDataIndices) {\n    // Modify the focus to data indices.\n    getECData(symbolEl).focus = focusDataIndices;\n  }\n  drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group);\n  if (symbolEl.__edge) {\n    symbolEl.onHoverStateChange = function (toState) {\n      if (toState !== 'blur') {\n        // NOTE: Ensure the parent elements will been blurred firstly.\n        // According to the return of getAncestorsIndices and getDescendantIndices\n        // TODO: A bit tricky.\n        var parentEl = node.parentNode && data.getItemGraphicEl(node.parentNode.dataIndex);\n        if (!(parentEl && parentEl.hoverState === HOVER_STATE_BLUR)) {\n          setStatesFlag(symbolEl.__edge, toState);\n        }\n      }\n    };\n  }\n}\nfunction drawEdge(seriesModel, node, virtualRoot, symbolEl, sourceOldLayout, sourceLayout, targetLayout, group) {\n  var itemModel = node.getModel();\n  var edgeShape = seriesModel.get('edgeShape');\n  var layout = seriesModel.get('layout');\n  var orient = seriesModel.getOrient();\n  var curvature = seriesModel.get(['lineStyle', 'curveness']);\n  var edgeForkPosition = seriesModel.get('edgeForkPosition');\n  var lineStyle = itemModel.getModel('lineStyle').getLineStyle();\n  var edge = symbolEl.__edge;\n  // curve edge from node -> parent\n  // polyline edge from node -> children\n  if (edgeShape === 'curve') {\n    if (node.parentNode && node.parentNode !== virtualRoot) {\n      if (!edge) {\n        edge = symbolEl.__edge = new graphic.BezierCurve({\n          shape: getEdgeShape(layout, orient, curvature, sourceOldLayout, sourceOldLayout)\n        });\n      }\n      graphic.updateProps(edge, {\n        shape: getEdgeShape(layout, orient, curvature, sourceLayout, targetLayout)\n      }, seriesModel);\n    }\n  } else if (edgeShape === 'polyline') {\n    if (layout === 'orthogonal') {\n      if (node !== virtualRoot && node.children && node.children.length !== 0 && node.isExpand === true) {\n        var children = node.children;\n        var childPoints = [];\n        for (var i = 0; i < children.length; i++) {\n          var childLayout = children[i].getLayout();\n          childPoints.push([childLayout.x, childLayout.y]);\n        }\n        if (!edge) {\n          edge = symbolEl.__edge = new TreePath({\n            shape: {\n              parentPoint: [targetLayout.x, targetLayout.y],\n              childPoints: [[targetLayout.x, targetLayout.y]],\n              orient: orient,\n              forkPosition: edgeForkPosition\n            }\n          });\n        }\n        graphic.updateProps(edge, {\n          shape: {\n            parentPoint: [targetLayout.x, targetLayout.y],\n            childPoints: childPoints\n          }\n        }, seriesModel);\n      }\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        throw new Error('The polyline edgeShape can only be used in orthogonal layout');\n      }\n    }\n  }\n  // show all edge when edgeShape is 'curve', filter node `isExpand` is false when edgeShape is 'polyline'\n  if (edge && !(edgeShape === 'polyline' && !node.isExpand)) {\n    edge.useStyle(zrUtil.defaults({\n      strokeNoScale: true,\n      fill: null\n    }, lineStyle));\n    setStatesStylesFromModel(edge, itemModel, 'lineStyle');\n    setDefaultStateProxy(edge);\n    group.add(edge);\n  }\n}\nfunction removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt) {\n  var virtualRoot = data.tree.root;\n  var _a = getSourceNode(virtualRoot, node),\n    source = _a.source,\n    sourceLayout = _a.sourceLayout;\n  var symbolEl = data.getItemGraphicEl(node.dataIndex);\n  if (!symbolEl) {\n    return;\n  }\n  var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);\n  var sourceEdge = sourceSymbolEl.__edge;\n  // 1. when expand the sub tree, delete the children node should delete the edge of\n  // the source at the same time. because the polyline edge shape is only owned by the source.\n  // 2.when the node is the only children of the source, delete the node should delete the edge of\n  // the source at the same time. the same reason as above.\n  var edge = symbolEl.__edge || (source.isExpand === false || source.children.length === 1 ? sourceEdge : undefined);\n  var edgeShape = seriesModel.get('edgeShape');\n  var layoutOpt = seriesModel.get('layout');\n  var orient = seriesModel.get('orient');\n  var curvature = seriesModel.get(['lineStyle', 'curveness']);\n  if (edge) {\n    if (edgeShape === 'curve') {\n      graphic.removeElement(edge, {\n        shape: getEdgeShape(layoutOpt, orient, curvature, sourceLayout, sourceLayout),\n        style: {\n          opacity: 0\n        }\n      }, seriesModel, {\n        cb: function () {\n          group.remove(edge);\n        },\n        removeOpt: removeAnimationOpt\n      });\n    } else if (edgeShape === 'polyline' && seriesModel.get('layout') === 'orthogonal') {\n      graphic.removeElement(edge, {\n        shape: {\n          parentPoint: [sourceLayout.x, sourceLayout.y],\n          childPoints: [[sourceLayout.x, sourceLayout.y]]\n        },\n        style: {\n          opacity: 0\n        }\n      }, seriesModel, {\n        cb: function () {\n          group.remove(edge);\n        },\n        removeOpt: removeAnimationOpt\n      });\n    }\n  }\n}\nfunction getSourceNode(virtualRoot, node) {\n  var source = node.parentNode === virtualRoot ? node : node.parentNode || node;\n  var sourceLayout;\n  while (sourceLayout = source.getLayout(), sourceLayout == null) {\n    source = source.parentNode === virtualRoot ? source : source.parentNode || source;\n  }\n  return {\n    source: source,\n    sourceLayout: sourceLayout\n  };\n}\nfunction removeNode(data, dataIndex, symbolEl, group, seriesModel) {\n  var node = data.tree.getNodeByDataIndex(dataIndex);\n  var virtualRoot = data.tree.root;\n  var sourceLayout = getSourceNode(virtualRoot, node).sourceLayout;\n  // Use same duration and easing with update to have more consistent animation.\n  var removeAnimationOpt = {\n    duration: seriesModel.get('animationDurationUpdate'),\n    easing: seriesModel.get('animationEasingUpdate')\n  };\n  graphic.removeElement(symbolEl, {\n    x: sourceLayout.x + 1,\n    y: sourceLayout.y + 1\n  }, seriesModel, {\n    cb: function () {\n      group.remove(symbolEl);\n      data.setItemGraphicEl(dataIndex, null);\n    },\n    removeOpt: removeAnimationOpt\n  });\n  symbolEl.fadeOut(null, data.hostModel, {\n    fadeLabel: true,\n    animation: removeAnimationOpt\n  });\n  // remove edge as parent node\n  node.children.forEach(function (childNode) {\n    removeNodeEdge(childNode, data, group, seriesModel, removeAnimationOpt);\n  });\n  // remove edge as child node\n  removeNodeEdge(node, data, group, seriesModel, removeAnimationOpt);\n}\nfunction getEdgeShape(layoutOpt, orient, curvature, sourceLayout, targetLayout) {\n  var cpx1;\n  var cpy1;\n  var cpx2;\n  var cpy2;\n  var x1;\n  var x2;\n  var y1;\n  var y2;\n  if (layoutOpt === 'radial') {\n    x1 = sourceLayout.rawX;\n    y1 = sourceLayout.rawY;\n    x2 = targetLayout.rawX;\n    y2 = targetLayout.rawY;\n    var radialCoor1 = radialCoordinate(x1, y1);\n    var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * curvature);\n    var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * curvature);\n    var radialCoor4 = radialCoordinate(x2, y2);\n    return {\n      x1: radialCoor1.x || 0,\n      y1: radialCoor1.y || 0,\n      x2: radialCoor4.x || 0,\n      y2: radialCoor4.y || 0,\n      cpx1: radialCoor2.x || 0,\n      cpy1: radialCoor2.y || 0,\n      cpx2: radialCoor3.x || 0,\n      cpy2: radialCoor3.y || 0\n    };\n  } else {\n    x1 = sourceLayout.x;\n    y1 = sourceLayout.y;\n    x2 = targetLayout.x;\n    y2 = targetLayout.y;\n    if (orient === 'LR' || orient === 'RL') {\n      cpx1 = x1 + (x2 - x1) * curvature;\n      cpy1 = y1;\n      cpx2 = x2 + (x1 - x2) * curvature;\n      cpy2 = y2;\n    }\n    if (orient === 'TB' || orient === 'BT') {\n      cpx1 = x1;\n      cpy1 = y1 + (y2 - y1) * curvature;\n      cpx2 = x2;\n      cpy2 = y2 + (y1 - y2) * curvature;\n    }\n  }\n  return {\n    x1: x1,\n    y1: y1,\n    x2: x2,\n    y2: y2,\n    cpx1: cpx1,\n    cpy1: cpy1,\n    cpx2: cpx2,\n    cpy2: cpy2\n  };\n}\nexport default TreeView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Link lists and struct (graph or tree)\n */\nimport { curry, each, assert, extend, map, keys } from 'zrender/lib/core/util.js';\nimport { makeInner } from '../../util/model.js';\nvar inner = makeInner();\nfunction linkSeriesData(opt) {\n  var mainData = opt.mainData;\n  var datas = opt.datas;\n  if (!datas) {\n    datas = {\n      main: mainData\n    };\n    opt.datasAttr = {\n      main: 'data'\n    };\n  }\n  opt.datas = opt.mainData = null;\n  linkAll(mainData, datas, opt);\n  // Porxy data original methods.\n  each(datas, function (data) {\n    each(mainData.TRANSFERABLE_METHODS, function (methodName) {\n      data.wrapMethod(methodName, curry(transferInjection, opt));\n    });\n  });\n  // Beyond transfer, additional features should be added to `cloneShallow`.\n  mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt));\n  // Only mainData trigger change, because struct.update may trigger\n  // another changable methods, which may bring about dead lock.\n  each(mainData.CHANGABLE_METHODS, function (methodName) {\n    mainData.wrapMethod(methodName, curry(changeInjection, opt));\n  });\n  // Make sure datas contains mainData.\n  assert(datas[mainData.dataType] === mainData);\n}\nfunction transferInjection(opt, res) {\n  if (isMainData(this)) {\n    // Transfer datas to new main data.\n    var datas = extend({}, inner(this).datas);\n    datas[this.dataType] = res;\n    linkAll(res, datas, opt);\n  } else {\n    // Modify the reference in main data to point newData.\n    linkSingle(res, this.dataType, inner(this).mainData, opt);\n  }\n  return res;\n}\nfunction changeInjection(opt, res) {\n  opt.struct && opt.struct.update();\n  return res;\n}\nfunction cloneShallowInjection(opt, res) {\n  // cloneShallow, which brings about some fragilities, may be inappropriate\n  // to be exposed as an API. So for implementation simplicity we can make\n  // the restriction that cloneShallow of not-mainData should not be invoked\n  // outside, but only be invoked here.\n  each(inner(res).datas, function (data, dataType) {\n    data !== res && linkSingle(data.cloneShallow(), dataType, res, opt);\n  });\n  return res;\n}\n/**\n * Supplement method to List.\n *\n * @public\n * @param [dataType] If not specified, return mainData.\n */\nfunction getLinkedData(dataType) {\n  var mainData = inner(this).mainData;\n  return dataType == null || mainData == null ? mainData : inner(mainData).datas[dataType];\n}\n/**\n * Get list of all linked data\n */\nfunction getLinkedDataAll() {\n  var mainData = inner(this).mainData;\n  return mainData == null ? [{\n    data: mainData\n  }] : map(keys(inner(mainData).datas), function (type) {\n    return {\n      type: type,\n      data: inner(mainData).datas[type]\n    };\n  });\n}\nfunction isMainData(data) {\n  return inner(data).mainData === data;\n}\nfunction linkAll(mainData, datas, opt) {\n  inner(mainData).datas = {};\n  each(datas, function (data, dataType) {\n    linkSingle(data, dataType, mainData, opt);\n  });\n}\nfunction linkSingle(data, dataType, mainData, opt) {\n  inner(mainData).datas[dataType] = data;\n  inner(data).mainData = mainData;\n  data.dataType = dataType;\n  if (opt.struct) {\n    data[opt.structAttr] = opt.struct;\n    opt.struct[opt.datasAttr[dataType]] = data;\n  }\n  // Supplement method.\n  data.getLinkedData = getLinkedData;\n  data.getLinkedDataAll = getLinkedDataAll;\n}\nexport default linkSeriesData;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Tree data structure\n */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport linkSeriesData from './helper/linkSeriesData.js';\nimport SeriesData from './SeriesData.js';\nimport prepareSeriesDataSchema from './helper/createDimensions.js';\nimport { convertOptionIdName } from '../util/model.js';\nvar TreeNode = /** @class */function () {\n  function TreeNode(name, hostTree) {\n    this.depth = 0;\n    this.height = 0;\n    /**\n     * Reference to list item.\n     * Do not persistent dataIndex outside,\n     * besause it may be changed by list.\n     * If dataIndex -1,\n     * this node is logical deleted (filtered) in list.\n     */\n    this.dataIndex = -1;\n    this.children = [];\n    this.viewChildren = [];\n    this.isExpand = false;\n    this.name = name || '';\n    this.hostTree = hostTree;\n  }\n  /**\n   * The node is removed.\n   */\n  TreeNode.prototype.isRemoved = function () {\n    return this.dataIndex < 0;\n  };\n  TreeNode.prototype.eachNode = function (options, cb, context) {\n    if (zrUtil.isFunction(options)) {\n      context = cb;\n      cb = options;\n      options = null;\n    }\n    options = options || {};\n    if (zrUtil.isString(options)) {\n      options = {\n        order: options\n      };\n    }\n    var order = options.order || 'preorder';\n    var children = this[options.attr || 'children'];\n    var suppressVisitSub;\n    order === 'preorder' && (suppressVisitSub = cb.call(context, this));\n    for (var i = 0; !suppressVisitSub && i < children.length; i++) {\n      children[i].eachNode(options, cb, context);\n    }\n    order === 'postorder' && cb.call(context, this);\n  };\n  /**\n   * Update depth and height of this subtree.\n   */\n  TreeNode.prototype.updateDepthAndHeight = function (depth) {\n    var height = 0;\n    this.depth = depth;\n    for (var i = 0; i < this.children.length; i++) {\n      var child = this.children[i];\n      child.updateDepthAndHeight(depth + 1);\n      if (child.height > height) {\n        height = child.height;\n      }\n    }\n    this.height = height + 1;\n  };\n  TreeNode.prototype.getNodeById = function (id) {\n    if (this.getId() === id) {\n      return this;\n    }\n    for (var i = 0, children = this.children, len = children.length; i < len; i++) {\n      var res = children[i].getNodeById(id);\n      if (res) {\n        return res;\n      }\n    }\n  };\n  TreeNode.prototype.contains = function (node) {\n    if (node === this) {\n      return true;\n    }\n    for (var i = 0, children = this.children, len = children.length; i < len; i++) {\n      var res = children[i].contains(node);\n      if (res) {\n        return res;\n      }\n    }\n  };\n  /**\n   * @param includeSelf Default false.\n   * @return order: [root, child, grandchild, ...]\n   */\n  TreeNode.prototype.getAncestors = function (includeSelf) {\n    var ancestors = [];\n    var node = includeSelf ? this : this.parentNode;\n    while (node) {\n      ancestors.push(node);\n      node = node.parentNode;\n    }\n    ancestors.reverse();\n    return ancestors;\n  };\n  TreeNode.prototype.getAncestorsIndices = function () {\n    var indices = [];\n    var currNode = this;\n    while (currNode) {\n      indices.push(currNode.dataIndex);\n      currNode = currNode.parentNode;\n    }\n    indices.reverse();\n    return indices;\n  };\n  TreeNode.prototype.getDescendantIndices = function () {\n    var indices = [];\n    this.eachNode(function (childNode) {\n      indices.push(childNode.dataIndex);\n    });\n    return indices;\n  };\n  TreeNode.prototype.getValue = function (dimension) {\n    var data = this.hostTree.data;\n    return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex);\n  };\n  TreeNode.prototype.setLayout = function (layout, merge) {\n    this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge);\n  };\n  /**\n   * @return {Object} layout\n   */\n  TreeNode.prototype.getLayout = function () {\n    return this.hostTree.data.getItemLayout(this.dataIndex);\n  };\n  // @depcrecated\n  // getModel<T = unknown, S extends keyof T = keyof T>(path: S): Model<T[S]>\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  TreeNode.prototype.getModel = function (path) {\n    if (this.dataIndex < 0) {\n      return;\n    }\n    var hostTree = this.hostTree;\n    var itemModel = hostTree.data.getItemModel(this.dataIndex);\n    return itemModel.getModel(path);\n  };\n  // TODO: TYPE More specific model\n  TreeNode.prototype.getLevelModel = function () {\n    return (this.hostTree.levelModels || [])[this.depth];\n  };\n  TreeNode.prototype.setVisual = function (key, value) {\n    this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value);\n  };\n  /**\n   * Get item visual\n   * FIXME: make return type better\n   */\n  TreeNode.prototype.getVisual = function (key) {\n    return this.hostTree.data.getItemVisual(this.dataIndex, key);\n  };\n  TreeNode.prototype.getRawIndex = function () {\n    return this.hostTree.data.getRawIndex(this.dataIndex);\n  };\n  TreeNode.prototype.getId = function () {\n    return this.hostTree.data.getId(this.dataIndex);\n  };\n  /**\n   * index in parent's children\n   */\n  TreeNode.prototype.getChildIndex = function () {\n    if (this.parentNode) {\n      var children = this.parentNode.children;\n      for (var i = 0; i < children.length; ++i) {\n        if (children[i] === this) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    return -1;\n  };\n  /**\n   * if this is an ancestor of another node\n   *\n   * @param node another node\n   * @return if is ancestor\n   */\n  TreeNode.prototype.isAncestorOf = function (node) {\n    var parent = node.parentNode;\n    while (parent) {\n      if (parent === this) {\n        return true;\n      }\n      parent = parent.parentNode;\n    }\n    return false;\n  };\n  /**\n   * if this is an descendant of another node\n   *\n   * @param node another node\n   * @return if is descendant\n   */\n  TreeNode.prototype.isDescendantOf = function (node) {\n    return node !== this && node.isAncestorOf(this);\n  };\n  return TreeNode;\n}();\nexport { TreeNode };\n;\nvar Tree = /** @class */function () {\n  function Tree(hostModel) {\n    this.type = 'tree';\n    this._nodes = [];\n    this.hostModel = hostModel;\n  }\n  Tree.prototype.eachNode = function (options, cb, context) {\n    this.root.eachNode(options, cb, context);\n  };\n  Tree.prototype.getNodeByDataIndex = function (dataIndex) {\n    var rawIndex = this.data.getRawIndex(dataIndex);\n    return this._nodes[rawIndex];\n  };\n  Tree.prototype.getNodeById = function (name) {\n    return this.root.getNodeById(name);\n  };\n  /**\n   * Update item available by list,\n   * when list has been performed options like 'filterSelf' or 'map'.\n   */\n  Tree.prototype.update = function () {\n    var data = this.data;\n    var nodes = this._nodes;\n    for (var i = 0, len = nodes.length; i < len; i++) {\n      nodes[i].dataIndex = -1;\n    }\n    for (var i = 0, len = data.count(); i < len; i++) {\n      nodes[data.getRawIndex(i)].dataIndex = i;\n    }\n  };\n  /**\n   * Clear all layouts\n   */\n  Tree.prototype.clearLayouts = function () {\n    this.data.clearItemLayouts();\n  };\n  /**\n   * data node format:\n   * {\n   *     name: ...\n   *     value: ...\n   *     children: [\n   *         {\n   *             name: ...\n   *             value: ...\n   *             children: ...\n   *         },\n   *         ...\n   *     ]\n   * }\n   */\n  Tree.createTree = function (dataRoot, hostModel, beforeLink) {\n    var tree = new Tree(hostModel);\n    var listData = [];\n    var dimMax = 1;\n    buildHierarchy(dataRoot);\n    function buildHierarchy(dataNode, parentNode) {\n      var value = dataNode.value;\n      dimMax = Math.max(dimMax, zrUtil.isArray(value) ? value.length : 1);\n      listData.push(dataNode);\n      var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree);\n      parentNode ? addChild(node, parentNode) : tree.root = node;\n      tree._nodes.push(node);\n      var children = dataNode.children;\n      if (children) {\n        for (var i = 0; i < children.length; i++) {\n          buildHierarchy(children[i], node);\n        }\n      }\n    }\n    tree.root.updateDepthAndHeight(0);\n    var dimensions = prepareSeriesDataSchema(listData, {\n      coordDimensions: ['value'],\n      dimensionsCount: dimMax\n    }).dimensions;\n    var list = new SeriesData(dimensions, hostModel);\n    list.initData(listData);\n    beforeLink && beforeLink(list);\n    linkSeriesData({\n      mainData: list,\n      struct: tree,\n      structAttr: 'tree'\n    });\n    tree.update();\n    return tree;\n  };\n  return Tree;\n}();\n/**\n * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote,\n * so this function is not ready and not necessary to be public.\n */\nfunction addChild(child, node) {\n  var children = node.children;\n  if (child.parentNode === node) {\n    return;\n  }\n  children.push(child);\n  child.parentNode = node;\n}\nexport default Tree;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) {\n  if (payload && zrUtil.indexOf(validPayloadTypes, payload.type) >= 0) {\n    var root = seriesModel.getData().tree.root;\n    var targetNode = payload.targetNode;\n    if (zrUtil.isString(targetNode)) {\n      targetNode = root.getNodeById(targetNode);\n    }\n    if (targetNode && root.contains(targetNode)) {\n      return {\n        node: targetNode\n      };\n    }\n    var targetNodeId = payload.targetNodeId;\n    if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) {\n      return {\n        node: targetNode\n      };\n    }\n  }\n}\n// Not includes the given node at the last item.\nexport function getPathToRoot(node) {\n  var path = [];\n  while (node) {\n    node = node.parentNode;\n    node && path.push(node);\n  }\n  return path.reverse();\n}\nexport function aboveViewRoot(viewRoot, node) {\n  var viewPath = getPathToRoot(viewRoot);\n  return zrUtil.indexOf(viewPath, node) >= 0;\n}\n// From root to the input node (the input node will be included).\nexport function wrapTreePathInfo(node, seriesModel) {\n  var treePathInfo = [];\n  while (node) {\n    var nodeDataIndex = node.dataIndex;\n    treePathInfo.push({\n      name: node.name,\n      dataIndex: nodeDataIndex,\n      value: seriesModel.getRawValue(nodeDataIndex)\n    });\n    node = node.parentNode;\n  }\n  treePathInfo.reverse();\n  return treePathInfo;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport Tree from '../../data/Tree.js';\nimport Model from '../../model/Model.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nimport { wrapTreePathInfo } from '../helper/treeHelper.js';\nimport tokens from '../../visual/tokens.js';\nvar TreeSeriesModel = /** @class */function (_super) {\n  __extends(TreeSeriesModel, _super);\n  function TreeSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.hasSymbolVisual = true;\n    // Do it self.\n    _this.ignoreStyleOnData = true;\n    return _this;\n  }\n  /**\n   * Init a tree data structure from data in option series\n   */\n  TreeSeriesModel.prototype.getInitialData = function (option) {\n    // create a virtual root\n    var root = {\n      name: option.name,\n      children: option.data\n    };\n    var leaves = option.leaves || {};\n    var leavesModel = new Model(leaves, this, this.ecModel);\n    var tree = Tree.createTree(root, this, beforeLink);\n    function beforeLink(nodeData) {\n      nodeData.wrapMethod('getItemModel', function (model, idx) {\n        var node = tree.getNodeByDataIndex(idx);\n        if (!(node && node.children.length && node.isExpand)) {\n          model.parentModel = leavesModel;\n        }\n        return model;\n      });\n    }\n    var treeDepth = 0;\n    tree.eachNode('preorder', function (node) {\n      if (node.depth > treeDepth) {\n        treeDepth = node.depth;\n      }\n    });\n    var expandAndCollapse = option.expandAndCollapse;\n    var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth;\n    tree.root.eachNode('preorder', function (node) {\n      var item = node.hostTree.data.getRawDataItem(node.dataIndex);\n      // Add item.collapsed != null, because users can collapse node original in the series.data.\n      node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth;\n    });\n    return tree.data;\n  };\n  /**\n   * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'.\n   * @returns {string} orient\n   */\n  TreeSeriesModel.prototype.getOrient = function () {\n    var orient = this.get('orient');\n    if (orient === 'horizontal') {\n      orient = 'LR';\n    } else if (orient === 'vertical') {\n      orient = 'TB';\n    }\n    return orient;\n  };\n  TreeSeriesModel.prototype.setZoom = function (zoom) {\n    this.option.zoom = zoom;\n  };\n  TreeSeriesModel.prototype.setCenter = function (center) {\n    this.option.center = center;\n  };\n  TreeSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var tree = this.getData().tree;\n    var realRoot = tree.root.children[0];\n    var node = tree.getNodeByDataIndex(dataIndex);\n    var value = node.getValue();\n    var name = node.name;\n    while (node && node !== realRoot) {\n      name = node.parentNode.name + '.' + name;\n      node = node.parentNode;\n    }\n    return createTooltipMarkup('nameValue', {\n      name: name,\n      value: value,\n      noValue: isNaN(value) || value == null\n    });\n  };\n  // Add tree path to tooltip param\n  TreeSeriesModel.prototype.getDataParams = function (dataIndex) {\n    var params = _super.prototype.getDataParams.apply(this, arguments);\n    var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n    params.treeAncestors = wrapTreePathInfo(node, this);\n    params.collapsed = !node.isExpand;\n    return params;\n  };\n  TreeSeriesModel.type = 'series.tree';\n  // can support the position parameters 'left', 'top','right','bottom', 'width',\n  // 'height' in the setOption() with 'merge' mode normal.\n  TreeSeriesModel.layoutMode = 'box';\n  TreeSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    // `coordinateSystem` can be declared as 'matrix', 'calendar',\n    //  which provides box layout container.\n    coordinateSystemUsage: 'box',\n    // the position of the whole view\n    left: '12%',\n    top: '12%',\n    right: '12%',\n    bottom: '12%',\n    // the layout of the tree, two value can be selected, 'orthogonal' or 'radial'\n    layout: 'orthogonal',\n    // value can be 'polyline'\n    edgeShape: 'curve',\n    edgeForkPosition: '50%',\n    // true | false | 'move' | 'scale', see module:component/helper/RoamController.\n    roam: false,\n    roamTrigger: 'global',\n    // Symbol size scale ratio in roam\n    nodeScaleRatio: 0.4,\n    // Default on center of graph\n    center: null,\n    zoom: 1,\n    orient: 'LR',\n    symbol: 'emptyCircle',\n    symbolSize: 7,\n    expandAndCollapse: true,\n    initialTreeDepth: 2,\n    lineStyle: {\n      color: tokens.color.borderTint,\n      width: 1.5,\n      curveness: 0.5\n    },\n    itemStyle: {\n      color: 'lightsteelblue',\n      // borderColor: '#c23531',\n      borderWidth: 1.5\n    },\n    label: {\n      show: true\n    },\n    animationEasing: 'linear',\n    animationDuration: 700,\n    animationDurationUpdate: 500\n  };\n  return TreeSeriesModel;\n}(SeriesModel);\nexport default TreeSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Traverse the tree from bottom to top and do something\n */\nfunction eachAfter(root, callback, separation) {\n  var nodes = [root];\n  var next = [];\n  var node;\n  while (node = nodes.pop()) {\n    // jshint ignore:line\n    next.push(node);\n    if (node.isExpand) {\n      var children = node.children;\n      if (children.length) {\n        for (var i = 0; i < children.length; i++) {\n          nodes.push(children[i]);\n        }\n      }\n    }\n  }\n  while (node = next.pop()) {\n    // jshint ignore:line\n    callback(node, separation);\n  }\n}\n/**\n * Traverse the tree from top to bottom and do something\n */\nfunction eachBefore(root, callback) {\n  var nodes = [root];\n  var node;\n  while (node = nodes.pop()) {\n    // jshint ignore:line\n    callback(node);\n    if (node.isExpand) {\n      var children = node.children;\n      if (children.length) {\n        for (var i = children.length - 1; i >= 0; i--) {\n          nodes.push(children[i]);\n        }\n      }\n    }\n  }\n}\nexport { eachAfter, eachBefore };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { eachAfter, eachBefore } from './traversalHelper.js';\nimport { init, firstWalk, secondWalk, separation as sep, radialCoordinate } from './layoutHelper.js';\nimport { createBoxLayoutReference, getLayoutRect } from '../../util/layout.js';\nexport default function treeLayout(ecModel, api) {\n  ecModel.eachSeriesByType('tree', function (seriesModel) {\n    commonLayout(seriesModel, api);\n  });\n}\nfunction commonLayout(seriesModel, api) {\n  var refContainer = createBoxLayoutReference(seriesModel, api).refContainer;\n  var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), refContainer);\n  seriesModel.layoutInfo = layoutInfo;\n  var layout = seriesModel.get('layout');\n  var width = 0;\n  var height = 0;\n  var separation = null;\n  if (layout === 'radial') {\n    width = 2 * Math.PI;\n    height = Math.min(layoutInfo.height, layoutInfo.width) / 2;\n    separation = sep(function (node1, node2) {\n      return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth;\n    });\n  } else {\n    width = layoutInfo.width;\n    height = layoutInfo.height;\n    separation = sep();\n  }\n  var virtualRoot = seriesModel.getData().tree.root;\n  var realRoot = virtualRoot.children[0];\n  if (realRoot) {\n    init(virtualRoot);\n    eachAfter(realRoot, firstWalk, separation);\n    virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim;\n    eachBefore(realRoot, secondWalk);\n    var left_1 = realRoot;\n    var right_1 = realRoot;\n    var bottom_1 = realRoot;\n    eachBefore(realRoot, function (node) {\n      var x = node.getLayout().x;\n      if (x < left_1.getLayout().x) {\n        left_1 = node;\n      }\n      if (x > right_1.getLayout().x) {\n        right_1 = node;\n      }\n      if (node.depth > bottom_1.depth) {\n        bottom_1 = node;\n      }\n    });\n    var delta = left_1 === right_1 ? 1 : separation(left_1, right_1) / 2;\n    var tx_1 = delta - left_1.getLayout().x;\n    var kx_1 = 0;\n    var ky_1 = 0;\n    var coorX_1 = 0;\n    var coorY_1 = 0;\n    if (layout === 'radial') {\n      kx_1 = width / (right_1.getLayout().x + delta + tx_1);\n      // here we use (node.depth - 1), bucause the real root's depth is 1\n      ky_1 = height / (bottom_1.depth - 1 || 1);\n      eachBefore(realRoot, function (node) {\n        coorX_1 = (node.getLayout().x + tx_1) * kx_1;\n        coorY_1 = (node.depth - 1) * ky_1;\n        var finalCoor = radialCoordinate(coorX_1, coorY_1);\n        node.setLayout({\n          x: finalCoor.x,\n          y: finalCoor.y,\n          rawX: coorX_1,\n          rawY: coorY_1\n        }, true);\n      });\n    } else {\n      var orient_1 = seriesModel.getOrient();\n      if (orient_1 === 'RL' || orient_1 === 'LR') {\n        ky_1 = height / (right_1.getLayout().x + delta + tx_1);\n        kx_1 = width / (bottom_1.depth - 1 || 1);\n        eachBefore(realRoot, function (node) {\n          coorY_1 = (node.getLayout().x + tx_1) * ky_1;\n          coorX_1 = orient_1 === 'LR' ? (node.depth - 1) * kx_1 : width - (node.depth - 1) * kx_1;\n          node.setLayout({\n            x: coorX_1,\n            y: coorY_1\n          }, true);\n        });\n      } else if (orient_1 === 'TB' || orient_1 === 'BT') {\n        kx_1 = width / (right_1.getLayout().x + delta + tx_1);\n        ky_1 = height / (bottom_1.depth - 1 || 1);\n        eachBefore(realRoot, function (node) {\n          coorX_1 = (node.getLayout().x + tx_1) * kx_1;\n          coorY_1 = orient_1 === 'TB' ? (node.depth - 1) * ky_1 : height - (node.depth - 1) * ky_1;\n          node.setLayout({\n            x: coorX_1,\n            y: coorY_1\n          }, true);\n        });\n      }\n    }\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend } from 'zrender/lib/core/util.js';\nexport default function treeVisual(ecModel) {\n  ecModel.eachSeriesByType('tree', function (seriesModel) {\n    var data = seriesModel.getData();\n    var tree = data.tree;\n    tree.eachNode(function (node) {\n      var model = node.getModel();\n      // TODO Optimize\n      var style = model.getModel('itemStyle').getItemStyle();\n      var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style');\n      extend(existsStyle, style);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { updateCenterAndZoomInAction } from '../../component/helper/roamHelper.js';\nexport function installTreeAction(registers) {\n  registers.registerAction({\n    type: 'treeExpandAndCollapse',\n    event: 'treeExpandAndCollapse',\n    update: 'update'\n  }, function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'tree',\n      query: payload\n    }, function (seriesModel) {\n      var dataIndex = payload.dataIndex;\n      var tree = seriesModel.getData().tree;\n      var node = tree.getNodeByDataIndex(dataIndex);\n      node.isExpand = !node.isExpand;\n    });\n  });\n  registers.registerAction({\n    type: 'treeRoam',\n    event: 'treeRoam',\n    // Here we set 'none' instead of 'update', because roam action\n    // just need to update the transform matrix without having to recalculate\n    // the layout. So don't need to go through the whole update process, such\n    // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on.\n    update: 'none'\n  }, function (payload, ecModel, api) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'tree',\n      query: payload\n    }, function (seriesModel) {\n      var coordSys = seriesModel.coordinateSystem;\n      var res = updateCenterAndZoomInAction(coordSys, payload, seriesModel.get('scaleLimit'));\n      seriesModel.setCenter(res.center);\n      seriesModel.setZoom(res.zoom);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport TreeView from './TreeView.js';\nimport TreeSeriesModel from './TreeSeries.js';\nimport treeLayout from './treeLayout.js';\nimport treeVisual from './treeVisual.js';\nimport { installTreeAction } from './treeAction.js';\nexport function install(registers) {\n  registers.registerChartView(TreeView);\n  registers.registerSeriesModel(TreeSeriesModel);\n  registers.registerLayout(treeLayout);\n  registers.registerVisual(treeVisual);\n  installTreeAction(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as helper from '../helper/treeHelper.js';\nimport { noop } from 'zrender/lib/core/util.js';\nvar actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove'];\nexport function installTreemapAction(registers) {\n  for (var i = 0; i < actionTypes.length; i++) {\n    registers.registerAction({\n      type: actionTypes[i],\n      update: 'updateView'\n    }, noop);\n  }\n  registers.registerAction({\n    type: 'treemapRootToNode',\n    update: 'updateView'\n  }, function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'treemap',\n      query: payload\n    }, handleRootToNode);\n    function handleRootToNode(model, index) {\n      var types = ['treemapZoomToNode', 'treemapRootToNode'];\n      var targetInfo = helper.retrieveTargetInfo(payload, types, model);\n      if (targetInfo) {\n        var originViewRoot = model.getViewRoot();\n        if (originViewRoot) {\n          payload.direction = helper.aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown';\n        }\n        model.resetViewRoot(targetInfo.node);\n      }\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { getDecalFromPalette } from '../../model/mixin/palette.js';\nexport default function enableAriaDecalForTree(seriesModel) {\n  var data = seriesModel.getData();\n  var tree = data.tree;\n  var decalPaletteScope = {};\n  tree.eachNode(function (node) {\n    // Use decal of level 1 node\n    var current = node;\n    while (current && current.depth > 1) {\n      current = current.parentNode;\n    }\n    var decal = getDecalFromPalette(seriesModel.ecModel, current.name || current.dataIndex + '', decalPaletteScope);\n    node.setVisual('decal', decal);\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport SeriesModel from '../../model/Series.js';\nimport Tree from '../../data/Tree.js';\nimport Model from '../../model/Model.js';\nimport { wrapTreePathInfo } from '../helper/treeHelper.js';\nimport { normalizeToArray } from '../../util/model.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nimport enableAriaDecalForTree from '../helper/enableAriaDecalForTree.js';\nimport tokens from '../../visual/tokens.js';\nvar TreemapSeriesModel = /** @class */function (_super) {\n  __extends(TreemapSeriesModel, _super);\n  function TreemapSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TreemapSeriesModel.type;\n    _this.preventUsingHoverLayer = true;\n    return _this;\n  }\n  /**\n   * @override\n   */\n  TreemapSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    // Create a virtual root.\n    var root = {\n      name: option.name,\n      children: option.data\n    };\n    completeTreeValue(root);\n    var levels = option.levels || [];\n    // Used in \"visual priority\" in `treemapVisual.js`.\n    // This way is a little tricky, must satisfy the precondition:\n    //   1. There is no `treeNode.getModel('itemStyle.xxx')` used.\n    //   2. The `Model.prototype.getModel()` will not use any clone-like way.\n    var designatedVisualItemStyle = this.designatedVisualItemStyle = {};\n    var designatedVisualModel = new Model({\n      itemStyle: designatedVisualItemStyle\n    }, this, ecModel);\n    levels = option.levels = setDefault(levels, ecModel);\n    var levelModels = zrUtil.map(levels || [], function (levelDefine) {\n      return new Model(levelDefine, designatedVisualModel, ecModel);\n    }, this);\n    // Make sure always a new tree is created when setOption,\n    // in TreemapView, we check whether oldTree === newTree\n    // to choose mappings approach among old shapes and new shapes.\n    var tree = Tree.createTree(root, this, beforeLink);\n    function beforeLink(nodeData) {\n      nodeData.wrapMethod('getItemModel', function (model, idx) {\n        var node = tree.getNodeByDataIndex(idx);\n        var levelModel = node ? levelModels[node.depth] : null;\n        // If no levelModel, we also need `designatedVisualModel`.\n        model.parentModel = levelModel || designatedVisualModel;\n        return model;\n      });\n    }\n    return tree.data;\n  };\n  TreemapSeriesModel.prototype.optionUpdated = function () {\n    this.resetViewRoot();\n  };\n  /**\n   * @override\n   * @param {number} dataIndex\n   * @param {boolean} [mutipleSeries=false]\n   */\n  TreemapSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var data = this.getData();\n    var value = this.getRawValue(dataIndex);\n    var name = data.getName(dataIndex);\n    return createTooltipMarkup('nameValue', {\n      name: name,\n      value: value\n    });\n  };\n  /**\n   * Add tree path to tooltip param\n   *\n   * @override\n   * @param {number} dataIndex\n   * @return {Object}\n   */\n  TreemapSeriesModel.prototype.getDataParams = function (dataIndex) {\n    var params = _super.prototype.getDataParams.apply(this, arguments);\n    var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n    params.treeAncestors = wrapTreePathInfo(node, this);\n    // compatitable the previous code.\n    params.treePathInfo = params.treeAncestors;\n    return params;\n  };\n  /**\n   * @public\n   * @param {Object} layoutInfo {\n   *                                x: containerGroup x\n   *                                y: containerGroup y\n   *                                width: containerGroup width\n   *                                height: containerGroup height\n   *                            }\n   */\n  TreemapSeriesModel.prototype.setLayoutInfo = function (layoutInfo) {\n    /**\n     * @readOnly\n     * @type {Object}\n     */\n    this.layoutInfo = this.layoutInfo || {};\n    zrUtil.extend(this.layoutInfo, layoutInfo);\n  };\n  /**\n   * @param  {string} id\n   * @return {number} index\n   */\n  TreemapSeriesModel.prototype.mapIdToIndex = function (id) {\n    // A feature is implemented:\n    // index is monotone increasing with the sequence of\n    // input id at the first time.\n    // This feature can make sure that each data item and its\n    // mapped color have the same index between data list and\n    // color list at the beginning, which is useful for user\n    // to adjust data-color mapping.\n    /**\n     * @private\n     * @type {Object}\n     */\n    var idIndexMap = this._idIndexMap;\n    if (!idIndexMap) {\n      idIndexMap = this._idIndexMap = zrUtil.createHashMap();\n      /**\n       * @private\n       * @type {number}\n       */\n      this._idIndexMapCount = 0;\n    }\n    var index = idIndexMap.get(id);\n    if (index == null) {\n      idIndexMap.set(id, index = this._idIndexMapCount++);\n    }\n    return index;\n  };\n  TreemapSeriesModel.prototype.getViewRoot = function () {\n    return this._viewRoot;\n  };\n  TreemapSeriesModel.prototype.resetViewRoot = function (viewRoot) {\n    viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot;\n    var root = this.getRawData().tree.root;\n    if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) {\n      this._viewRoot = root;\n    }\n  };\n  TreemapSeriesModel.prototype.enableAriaDecal = function () {\n    enableAriaDecalForTree(this);\n  };\n  TreemapSeriesModel.type = 'series.treemap';\n  TreemapSeriesModel.layoutMode = 'box';\n  TreemapSeriesModel.defaultOption = {\n    // Disable progressive rendering\n    progressive: 0,\n    // size: ['80%', '80%'],            // deprecated, compatible with ec2.\n    // `coordinateSystem` can be declared as 'matrix', 'calendar',\n    //  which provides box layout container.\n    coordinateSystemUsage: 'box',\n    left: tokens.size.l,\n    top: tokens.size.xxxl,\n    right: tokens.size.l,\n    bottom: tokens.size.xxxl,\n    sort: true,\n    clipWindow: 'origin',\n    squareRatio: 0.5 * (1 + Math.sqrt(5)),\n    leafDepth: null,\n    drillDownIcon: '\u25B6',\n    // to align specialized icon. \u25B7\u25B6\u2752\u2750\u25BC\u271A\n    zoomToNodeRatio: 0.32 * 0.32,\n    scaleLimit: {\n      max: 5,\n      min: 0.2\n    },\n    roam: true,\n    roamTrigger: 'global',\n    nodeClick: 'zoomToNode',\n    animation: true,\n    animationDurationUpdate: 900,\n    animationEasing: 'quinticInOut',\n    breadcrumb: {\n      show: true,\n      height: 22,\n      left: 'center',\n      bottom: tokens.size.m,\n      // right\n      // bottom\n      emptyItemWidth: 25,\n      itemStyle: {\n        color: tokens.color.backgroundShade,\n        textStyle: {\n          color: tokens.color.secondary\n        }\n      },\n      emphasis: {\n        itemStyle: {\n          color: tokens.color.background\n        }\n      }\n    },\n    label: {\n      show: true,\n      // Do not use textDistance, for ellipsis rect just the same as treemap node rect.\n      distance: 0,\n      padding: 5,\n      position: 'inside',\n      // formatter: null,\n      color: tokens.color.neutral00,\n      overflow: 'truncate'\n      // align\n      // verticalAlign\n    },\n    upperLabel: {\n      show: false,\n      position: [0, '50%'],\n      height: 20,\n      // formatter: null,\n      // color: '#fff',\n      overflow: 'truncate',\n      // align: null,\n      verticalAlign: 'middle'\n    },\n    itemStyle: {\n      color: null,\n      colorAlpha: null,\n      colorSaturation: null,\n      borderWidth: 0,\n      gapWidth: 0,\n      borderColor: tokens.color.neutral00,\n      borderColorSaturation: null // If specified, borderColor will be ineffective, and the\n      // border color is evaluated by color of current node and\n      // borderColorSaturation.\n    },\n    emphasis: {\n      upperLabel: {\n        show: true,\n        position: [0, '50%'],\n        overflow: 'truncate',\n        verticalAlign: 'middle'\n      }\n    },\n    visualDimension: 0,\n    visualMin: null,\n    visualMax: null,\n    color: [],\n    // level[n].color (if necessary).\n    // + Specify color list of each level. level[0].color would be global\n    // color list if not specified. (see method `setDefault`).\n    // + But set as a empty array to forbid fetch color from global palette\n    // when using nodeModel.get('color'), otherwise nodes on deep level\n    // will always has color palette set and are not able to inherit color\n    // from parent node.\n    // + TreemapSeries.color can not be set as 'none', otherwise effect\n    // legend color fetching (see seriesColor.js).\n    colorAlpha: null,\n    colorSaturation: null,\n    colorMappingBy: 'index',\n    visibleMin: 10,\n    // be rendered. Only works when sort is 'asc' or 'desc'.\n    childrenVisibleMin: null,\n    // grandchildren will not show.\n    // Why grandchildren? If not grandchildren but children,\n    // some siblings show children and some not,\n    // the appearance may be mess and not consistent,\n    levels: [] // Each item: {\n    //     visibleMin, itemStyle, visualDimension, label\n    // }\n  };\n  return TreemapSeriesModel;\n}(SeriesModel);\n/**\n * @param {Object} dataNode\n */\nfunction completeTreeValue(dataNode) {\n  // Postorder travel tree.\n  // If value of none-leaf node is not set,\n  // calculate it by suming up the value of all children.\n  var sum = 0;\n  zrUtil.each(dataNode.children, function (child) {\n    completeTreeValue(child);\n    var childValue = child.value;\n    zrUtil.isArray(childValue) && (childValue = childValue[0]);\n    sum += childValue;\n  });\n  var thisValue = dataNode.value;\n  if (zrUtil.isArray(thisValue)) {\n    thisValue = thisValue[0];\n  }\n  if (thisValue == null || isNaN(thisValue)) {\n    thisValue = sum;\n  }\n  // Value should not less than 0.\n  if (thisValue < 0) {\n    thisValue = 0;\n  }\n  zrUtil.isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue;\n}\n/**\n * set default to level configuration\n */\nfunction setDefault(levels, ecModel) {\n  var globalColorList = normalizeToArray(ecModel.get('color'));\n  var globalDecalList = normalizeToArray(ecModel.get(['aria', 'decal', 'decals']));\n  if (!globalColorList) {\n    return;\n  }\n  levels = levels || [];\n  var hasColorDefine;\n  var hasDecalDefine;\n  zrUtil.each(levels, function (levelDefine) {\n    var model = new Model(levelDefine);\n    var modelColor = model.get('color');\n    var modelDecal = model.get('decal');\n    if (model.get(['itemStyle', 'color']) || modelColor && modelColor !== 'none') {\n      hasColorDefine = true;\n    }\n    if (model.get(['itemStyle', 'decal']) || modelDecal && modelDecal !== 'none') {\n      hasDecalDefine = true;\n    }\n  });\n  var level0 = levels[0] || (levels[0] = {});\n  if (!hasColorDefine) {\n    level0.color = globalColorList.slice();\n  }\n  if (!hasDecalDefine && globalDecalList) {\n    level0.decal = globalDecalList.slice();\n  }\n  return levels;\n}\nexport default TreemapSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as graphic from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport * as layout from '../../util/layout.js';\nimport { wrapTreePathInfo } from '../helper/treeHelper.js';\nimport { curry, defaults } from 'zrender/lib/core/util.js';\nimport { convertOptionIdName } from '../../util/model.js';\nimport { toggleHoverEmphasis, Z2_EMPHASIS_LIFT } from '../../util/states.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nvar TEXT_PADDING = 8;\nvar ITEM_GAP = 8;\nvar ARRAY_LENGTH = 5;\nvar Breadcrumb = /** @class */function () {\n  function Breadcrumb(containerGroup) {\n    this.group = new graphic.Group();\n    containerGroup.add(this.group);\n  }\n  Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) {\n    var model = seriesModel.getModel('breadcrumb');\n    var thisGroup = this.group;\n    thisGroup.removeAll();\n    if (!model.get('show') || !targetNode) {\n      return;\n    }\n    var normalStyleModel = model.getModel('itemStyle');\n    var emphasisModel = model.getModel('emphasis');\n    var textStyleModel = normalStyleModel.getModel('textStyle');\n    var emphasisTextStyleModel = emphasisModel.getModel(['itemStyle', 'textStyle']);\n    var refContainer = layout.createBoxLayoutReference(seriesModel, api).refContainer;\n    var boxLayoutParams = {\n      left: model.get('left'),\n      right: model.get('right'),\n      top: model.get('top'),\n      bottom: model.get('bottom')\n    };\n    var layoutParam = {\n      emptyItemWidth: model.get('emptyItemWidth'),\n      totalWidth: 0,\n      renderList: []\n    };\n    var availableSize = layout.getLayoutRect(boxLayoutParams, refContainer);\n    this._prepare(targetNode, layoutParam, textStyleModel);\n    this._renderContent(seriesModel, layoutParam, availableSize, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect);\n    layout.positionElement(thisGroup, boxLayoutParams, refContainer);\n  };\n  /**\n   * Prepare render list and total width\n   * @private\n   */\n  Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) {\n    for (var node = targetNode; node; node = node.parentNode) {\n      var text = convertOptionIdName(node.getModel().get('name'), '');\n      var textRect = textStyleModel.getTextRect(text);\n      var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth);\n      layoutParam.totalWidth += itemWidth + ITEM_GAP;\n      layoutParam.renderList.push({\n        node: node,\n        text: text,\n        width: itemWidth\n      });\n    }\n  };\n  /**\n   * @private\n   */\n  Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, availableSize, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect) {\n    // Start rendering.\n    var lastX = 0;\n    var emptyItemWidth = layoutParam.emptyItemWidth;\n    var height = seriesModel.get(['breadcrumb', 'height']);\n    var totalWidth = layoutParam.totalWidth;\n    var renderList = layoutParam.renderList;\n    var emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n    for (var i = renderList.length - 1; i >= 0; i--) {\n      var item = renderList[i];\n      var itemNode = item.node;\n      var itemWidth = item.width;\n      var text = item.text;\n      // Hdie text and shorten width if necessary.\n      if (totalWidth > availableSize.width) {\n        totalWidth -= itemWidth - emptyItemWidth;\n        itemWidth = emptyItemWidth;\n        text = null;\n      }\n      var el = new graphic.Polygon({\n        shape: {\n          points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0)\n        },\n        style: defaults(normalStyleModel.getItemStyle(), {\n          lineJoin: 'bevel'\n        }),\n        textContent: new graphic.Text({\n          style: createTextStyle(textStyleModel, {\n            text: text\n          })\n        }),\n        textConfig: {\n          position: 'inside'\n        },\n        z2: Z2_EMPHASIS_LIFT * 1e4,\n        onclick: curry(onSelect, itemNode)\n      });\n      el.disableLabelAnimation = true;\n      el.getTextContent().ensureState('emphasis').style = createTextStyle(emphasisTextStyleModel, {\n        text: text\n      });\n      el.ensureState('emphasis').style = emphasisItemStyle;\n      toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n      this.group.add(el);\n      packEventData(el, seriesModel, itemNode);\n      lastX += itemWidth + ITEM_GAP;\n    }\n  };\n  Breadcrumb.prototype.remove = function () {\n    this.group.removeAll();\n  };\n  return Breadcrumb;\n}();\nfunction makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {\n  var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]];\n  !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]);\n  !head && points.push([x, y + itemHeight / 2]);\n  return points;\n}\n// Package custom mouse event.\nfunction packEventData(el, seriesModel, itemNode) {\n  getECData(el).eventData = {\n    componentType: 'series',\n    componentSubType: 'treemap',\n    componentIndex: seriesModel.componentIndex,\n    seriesIndex: seriesModel.seriesIndex,\n    seriesName: seriesModel.name,\n    seriesType: 'treemap',\n    selfType: 'breadcrumb',\n    nodeData: {\n      dataIndex: itemNode && itemNode.dataIndex,\n      name: itemNode && itemNode.name\n    },\n    treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel)\n  };\n}\nexport default Breadcrumb;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Animate multiple elements with a single done-callback.\n *\n * @example\n *  animation\n *      .createWrap()\n *      .add(el1, {x: 10, y: 10})\n *      .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400)\n *      .done(function () { // done })\n *      .start('cubicOut');\n */\nvar AnimationWrap = /** @class */function () {\n  function AnimationWrap() {\n    this._storage = [];\n    this._elExistsMap = {};\n  }\n  /**\n   * Caution: a el can only be added once, otherwise 'done'\n   * might not be called. This method checks this (by el.id),\n   * suppresses adding and returns false when existing el found.\n   *\n   * @return Whether adding succeeded.\n   */\n  AnimationWrap.prototype.add = function (el, target, duration, delay, easing) {\n    if (this._elExistsMap[el.id]) {\n      return false;\n    }\n    this._elExistsMap[el.id] = true;\n    this._storage.push({\n      el: el,\n      target: target,\n      duration: duration,\n      delay: delay,\n      easing: easing\n    });\n    return true;\n  };\n  /**\n   * Only execute when animation done/aborted.\n   */\n  AnimationWrap.prototype.finished = function (callback) {\n    this._finishedCallback = callback;\n    return this;\n  };\n  /**\n   * Will stop exist animation firstly.\n   */\n  AnimationWrap.prototype.start = function () {\n    var _this = this;\n    var count = this._storage.length;\n    var checkTerminate = function () {\n      count--;\n      if (count <= 0) {\n        // Guard.\n        _this._storage.length = 0;\n        _this._elExistsMap = {};\n        _this._finishedCallback && _this._finishedCallback();\n      }\n    };\n    for (var i = 0, len = this._storage.length; i < len; i++) {\n      var item = this._storage[i];\n      item.el.animateTo(item.target, {\n        duration: item.duration,\n        delay: item.delay,\n        easing: item.easing,\n        setToFinal: true,\n        done: checkTerminate,\n        aborted: checkTerminate\n      });\n    }\n    return this;\n  };\n  return AnimationWrap;\n}();\nexport function createWrap() {\n  return new AnimationWrap();\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { bind, each, indexOf, curry, extend, normalizeCssArray, isFunction } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { isHighDownDispatcher, setAsHighDownDispatcher, setDefaultStateProxy, enableHoverFocus, Z2_EMPHASIS_LIFT } from '../../util/states.js';\nimport DataDiffer from '../../data/DataDiffer.js';\nimport * as helper from '../helper/treeHelper.js';\nimport Breadcrumb from './Breadcrumb.js';\nimport RoamController from '../../component/helper/RoamController.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport * as animationUtil from '../../util/animation.js';\nimport makeStyleMapper from '../../model/mixin/makeStyleMapper.js';\nimport ChartView from '../../view/Chart.js';\nimport Displayable from 'zrender/lib/graphic/Displayable.js';\nimport { makeInner, convertOptionIdName } from '../../util/model.js';\nimport { windowOpen } from '../../util/format.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nvar Group = graphic.Group;\nvar Rect = graphic.Rect;\nvar DRAG_THRESHOLD = 3;\nvar PATH_LABEL_NOAMAL = 'label';\nvar PATH_UPPERLABEL_NORMAL = 'upperLabel';\n// Should larger than emphasis states lift z\nvar Z2_BASE = Z2_EMPHASIS_LIFT * 10; // Should bigger than every z2.\nvar Z2_BG = Z2_EMPHASIS_LIFT * 2;\nvar Z2_CONTENT = Z2_EMPHASIS_LIFT * 3;\nvar getStateItemStyle = makeStyleMapper([['fill', 'color'],\n// `borderColor` and `borderWidth` has been occupied,\n// so use `stroke` to indicate the stroke of the rect.\n['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor']\n// Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n// So do not transfer decal directly.\n]);\nvar getItemStyleNormal = function (model) {\n  // Normal style props should include emphasis style props.\n  var itemStyle = getStateItemStyle(model);\n  // Clear styles set by emphasis.\n  itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null;\n  return itemStyle;\n};\nvar inner = makeInner();\nvar TreemapView = /** @class */function (_super) {\n  __extends(TreemapView, _super);\n  function TreemapView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TreemapView.type;\n    _this._state = 'ready';\n    _this._storage = createStorage();\n    return _this;\n  }\n  /**\n   * @override\n   */\n  TreemapView.prototype.render = function (seriesModel, ecModel, api, payload) {\n    var models = ecModel.findComponents({\n      mainType: 'series',\n      subType: 'treemap',\n      query: payload\n    });\n    if (indexOf(models, seriesModel) < 0) {\n      return;\n    }\n    this.seriesModel = seriesModel;\n    this.api = api;\n    this.ecModel = ecModel;\n    var types = ['treemapZoomToNode', 'treemapRootToNode'];\n    var targetInfo = helper.retrieveTargetInfo(payload, types, seriesModel);\n    var payloadType = payload && payload.type;\n    var layoutInfo = seriesModel.layoutInfo;\n    var isInit = !this._oldTree;\n    var thisStorage = this._storage;\n    // Mark new root when action is treemapRootToNode.\n    var reRoot = payloadType === 'treemapRootToNode' && targetInfo && thisStorage ? {\n      rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()],\n      direction: payload.direction\n    } : null;\n    var containerGroup = this._giveContainerGroup(layoutInfo);\n    var hasAnimation = seriesModel.get('animation');\n    var renderResult = this._doRender(containerGroup, seriesModel, reRoot);\n    hasAnimation && !isInit && (!payloadType || payloadType === 'treemapZoomToNode' || payloadType === 'treemapRootToNode') ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally();\n    this._resetController(api);\n    this._renderBreadcrumb(seriesModel, api, targetInfo);\n  };\n  TreemapView.prototype._giveContainerGroup = function (layoutInfo) {\n    var containerGroup = this._containerGroup;\n    if (!containerGroup) {\n      // FIXME\n      // \u52A0\u4E00\u5C42containerGroup\u662F\u4E3A\u4E86clip\uFF0C\u4F46\u662F\u73B0\u5728clip\u529F\u80FD\u5E76\u6CA1\u6709\u5B9E\u73B0\u3002\n      containerGroup = this._containerGroup = new Group();\n      this._initEvents(containerGroup);\n      this.group.add(containerGroup);\n    }\n    containerGroup.x = layoutInfo.x;\n    containerGroup.y = layoutInfo.y;\n    return containerGroup;\n  };\n  TreemapView.prototype._doRender = function (containerGroup, seriesModel, reRoot) {\n    var thisTree = seriesModel.getData().tree;\n    var oldTree = this._oldTree;\n    // Clear last shape records.\n    var lastsForAnimation = createStorage();\n    var thisStorage = createStorage();\n    var oldStorage = this._storage;\n    var willInvisibleEls = [];\n    function doRenderNode(thisNode, oldNode, parentGroup, depth) {\n      return renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth);\n    }\n    // Notice: When thisTree and oldTree are the same tree (see list.cloneShallow),\n    // the oldTree is actually losted, so we cannot find all of the old graphic\n    // elements from tree. So we use this strategy: make element storage, move\n    // from old storage to new storage, clear old storage.\n    dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0);\n    // Process all removing.\n    var willDeleteEls = clearStorage(oldStorage);\n    this._oldTree = thisTree;\n    this._storage = thisStorage;\n    if (this._controllerHost) {\n      var _oldRootLayout = this.seriesModel.layoutInfo;\n      var rootLayout = thisTree.root.getLayout();\n      if (rootLayout.width === _oldRootLayout.width && rootLayout.height === _oldRootLayout.height) {\n        this._controllerHost.zoom = 1;\n      }\n    }\n    return {\n      lastsForAnimation: lastsForAnimation,\n      willDeleteEls: willDeleteEls,\n      renderFinally: renderFinally\n    };\n    function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) {\n      // When 'render' is triggered by action,\n      // 'this' and 'old' may be the same tree,\n      // we use rawIndex in that case.\n      if (sameTree) {\n        oldViewChildren = thisViewChildren;\n        each(thisViewChildren, function (child, index) {\n          !child.isRemoved() && processNode(index, index);\n        });\n      }\n      // Diff hierarchically (diff only in each subtree, but not whole).\n      // because, consistency of view is important.\n      else {\n        new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute();\n      }\n      function getKey(node) {\n        // Identify by name or raw index.\n        return node.getId();\n      }\n      function processNode(newIndex, oldIndex) {\n        var thisNode = newIndex != null ? thisViewChildren[newIndex] : null;\n        var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null;\n        var group = doRenderNode(thisNode, oldNode, parentGroup, depth);\n        group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1);\n      }\n    }\n    function clearStorage(storage) {\n      var willDeleteEls = createStorage();\n      storage && each(storage, function (store, storageName) {\n        var delEls = willDeleteEls[storageName];\n        each(store, function (el) {\n          el && (delEls.push(el), inner(el).willDelete = true);\n        });\n      });\n      return willDeleteEls;\n    }\n    function renderFinally() {\n      each(willDeleteEls, function (els) {\n        each(els, function (el) {\n          el.parent && el.parent.remove(el);\n        });\n      });\n      each(willInvisibleEls, function (el) {\n        el.invisible = true;\n        // Setting invisible is for optimizing, so no need to set dirty,\n        // just mark as invisible.\n        el.dirty();\n      });\n    }\n  };\n  TreemapView.prototype._doAnimation = function (containerGroup, renderResult, seriesModel, reRoot) {\n    var durationOption = seriesModel.get('animationDurationUpdate');\n    var easingOption = seriesModel.get('animationEasing');\n    // TODO: do not support function until necessary.\n    var duration = (isFunction(durationOption) ? 0 : durationOption) || 0;\n    var easing = (isFunction(easingOption) ? null : easingOption) || 'cubicOut';\n    var animationWrap = animationUtil.createWrap();\n    // Make delete animations.\n    each(renderResult.willDeleteEls, function (store, storageName) {\n      each(store, function (el, rawIndex) {\n        if (el.invisible) {\n          return;\n        }\n        var parent = el.parent; // Always has parent, and parent is nodeGroup.\n        var target;\n        var innerStore = inner(parent);\n        if (reRoot && reRoot.direction === 'drillDown') {\n          target = parent === reRoot.rootNodeGroup\n          // This is the content element of view root.\n          // Only `content` will enter this branch, because\n          // `background` and `nodeGroup` will not be deleted.\n          ? {\n            shape: {\n              x: 0,\n              y: 0,\n              width: innerStore.nodeWidth,\n              height: innerStore.nodeHeight\n            },\n            style: {\n              opacity: 0\n            }\n          }\n          // Others.\n          : {\n            style: {\n              opacity: 0\n            }\n          };\n        } else {\n          var targetX = 0;\n          var targetY = 0;\n          if (!innerStore.willDelete) {\n            // Let node animate to right-bottom corner, cooperating with fadeout,\n            // which is appropriate for user understanding.\n            // Divided by 2 for reRoot rolling up effect.\n            targetX = innerStore.nodeWidth / 2;\n            targetY = innerStore.nodeHeight / 2;\n          }\n          target = storageName === 'nodeGroup' ? {\n            x: targetX,\n            y: targetY,\n            style: {\n              opacity: 0\n            }\n          } : {\n            shape: {\n              x: targetX,\n              y: targetY,\n              width: 0,\n              height: 0\n            },\n            style: {\n              opacity: 0\n            }\n          };\n        }\n        // TODO: do not support delay until necessary.\n        target && animationWrap.add(el, target, duration, 0, easing);\n      });\n    });\n    // Make other animations\n    each(this._storage, function (store, storageName) {\n      each(store, function (el, rawIndex) {\n        var last = renderResult.lastsForAnimation[storageName][rawIndex];\n        var target = {};\n        if (!last) {\n          return;\n        }\n        if (el instanceof graphic.Group) {\n          if (last.oldX != null) {\n            target.x = el.x;\n            target.y = el.y;\n            el.x = last.oldX;\n            el.y = last.oldY;\n          }\n        } else {\n          if (last.oldShape) {\n            target.shape = extend({}, el.shape);\n            el.setShape(last.oldShape);\n          }\n          if (last.fadein) {\n            el.setStyle('opacity', 0);\n            target.style = {\n              opacity: 1\n            };\n          }\n          // When animation is stopped for succedent animation starting,\n          // el.style.opacity might not be 1\n          else if (el.style.opacity !== 1) {\n            target.style = {\n              opacity: 1\n            };\n          }\n        }\n        animationWrap.add(el, target, duration, 0, easing);\n      });\n    }, this);\n    this._state = 'animating';\n    animationWrap.finished(bind(function () {\n      this._state = 'ready';\n      renderResult.renderFinally();\n    }, this)).start();\n  };\n  TreemapView.prototype._resetController = function (api) {\n    var _this = this;\n    var controller = this._controller;\n    var controllerHost = this._controllerHost;\n    if (!controllerHost) {\n      this._controllerHost = {\n        target: this.group\n      };\n      controllerHost = this._controllerHost;\n    }\n    var seriesModel = this.seriesModel;\n    // Init controller.\n    if (!controller) {\n      controller = this._controller = new RoamController(api.getZr());\n      controller.on('pan', bind(this._onPan, this));\n      controller.on('zoom', bind(this._onZoom, this));\n    }\n    controller.enable(seriesModel.get('roam'), {\n      api: api,\n      zInfo: {\n        component: seriesModel\n      },\n      triggerInfo: {\n        roamTrigger: seriesModel.get('roamTrigger'),\n        isInSelf: function (e, x, y) {\n          var containerGroup = _this._containerGroup;\n          return containerGroup\n          // Currently only x, y exist in tranform.\n          ? containerGroup.getBoundingRect().contain(x - containerGroup.x, y - containerGroup.y) : false;\n        }\n      }\n    });\n    controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n    controllerHost.zoom = seriesModel.get('zoom');\n  };\n  TreemapView.prototype._clearController = function () {\n    var controller = this._controller;\n    this._controllerHost = null;\n    if (controller) {\n      controller.dispose();\n      controller = null;\n    }\n  };\n  TreemapView.prototype._onPan = function (e) {\n    if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) {\n      // These param must not be cached.\n      var root = this.seriesModel.getData().tree.root;\n      if (!root) {\n        return;\n      }\n      var rootLayout = root.getLayout();\n      if (!rootLayout) {\n        return;\n      }\n      this.api.dispatchAction({\n        type: 'treemapMove',\n        from: this.uid,\n        seriesId: this.seriesModel.id,\n        rootRect: {\n          x: rootLayout.x + e.dx,\n          y: rootLayout.y + e.dy,\n          width: rootLayout.width,\n          height: rootLayout.height\n        }\n      });\n    }\n  };\n  TreemapView.prototype._onZoom = function (e) {\n    var mouseX = e.originX;\n    var mouseY = e.originY;\n    var zoomDelta = e.scale;\n    if (this._state !== 'animating') {\n      // These param must not be cached.\n      var root = this.seriesModel.getData().tree.root;\n      if (!root) {\n        return;\n      }\n      var rootLayout = root.getLayout();\n      if (!rootLayout) {\n        return;\n      }\n      var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height);\n      // scaleLimit\n      var zoomLimit = null;\n      var _controllerHost = this._controllerHost;\n      zoomLimit = _controllerHost.zoomLimit;\n      var newZoom = _controllerHost.zoom = _controllerHost.zoom || 1;\n      newZoom *= zoomDelta;\n      if (zoomLimit) {\n        var zoomMin = zoomLimit.min || 0;\n        var zoomMax = zoomLimit.max || Infinity;\n        newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin);\n      }\n      var zoomScale = newZoom / _controllerHost.zoom;\n      _controllerHost.zoom = newZoom;\n      var layoutInfo = this.seriesModel.layoutInfo;\n      // Transform mouse coord from global to containerGroup.\n      mouseX -= layoutInfo.x;\n      mouseY -= layoutInfo.y;\n      // Scale root bounding rect.\n      var m = matrix.create();\n      matrix.translate(m, m, [-mouseX, -mouseY]);\n      matrix.scale(m, m, [zoomScale, zoomScale]);\n      matrix.translate(m, m, [mouseX, mouseY]);\n      rect.applyTransform(m);\n      this.api.dispatchAction({\n        type: 'treemapRender',\n        from: this.uid,\n        seriesId: this.seriesModel.id,\n        rootRect: {\n          x: rect.x,\n          y: rect.y,\n          width: rect.width,\n          height: rect.height\n        }\n      });\n    }\n  };\n  TreemapView.prototype._initEvents = function (containerGroup) {\n    var _this = this;\n    containerGroup.on('click', function (e) {\n      if (_this._state !== 'ready') {\n        return;\n      }\n      var nodeClick = _this.seriesModel.get('nodeClick', true);\n      if (!nodeClick) {\n        return;\n      }\n      var targetInfo = _this.findTarget(e.offsetX, e.offsetY);\n      if (!targetInfo) {\n        return;\n      }\n      var node = targetInfo.node;\n      if (node.getLayout().isLeafRoot) {\n        _this._rootToNode(targetInfo);\n      } else {\n        if (nodeClick === 'zoomToNode') {\n          _this._zoomToNode(targetInfo);\n        } else if (nodeClick === 'link') {\n          var itemModel = node.hostTree.data.getItemModel(node.dataIndex);\n          var link = itemModel.get('link', true);\n          var linkTarget = itemModel.get('target', true) || 'blank';\n          link && windowOpen(link, linkTarget);\n        }\n      }\n    }, this);\n  };\n  TreemapView.prototype._renderBreadcrumb = function (seriesModel, api, targetInfo) {\n    var _this = this;\n    if (!targetInfo) {\n      targetInfo = seriesModel.get('leafDepth', true) != null ? {\n        node: seriesModel.getViewRoot()\n      }\n      // FIXME\n      // better way?\n      // Find breadcrumb tail on center of containerGroup.\n      : this.findTarget(api.getWidth() / 2, api.getHeight() / 2);\n      if (!targetInfo) {\n        targetInfo = {\n          node: seriesModel.getData().tree.root\n        };\n      }\n    }\n    (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, function (node) {\n      if (_this._state !== 'animating') {\n        helper.aboveViewRoot(seriesModel.getViewRoot(), node) ? _this._rootToNode({\n          node: node\n        }) : _this._zoomToNode({\n          node: node\n        });\n      }\n    });\n  };\n  /**\n   * @override\n   */\n  TreemapView.prototype.remove = function () {\n    this._clearController();\n    this._containerGroup && this._containerGroup.removeAll();\n    this._storage = createStorage();\n    this._state = 'ready';\n    this._breadcrumb && this._breadcrumb.remove();\n  };\n  TreemapView.prototype.dispose = function () {\n    this._clearController();\n  };\n  TreemapView.prototype._zoomToNode = function (targetInfo) {\n    this.api.dispatchAction({\n      type: 'treemapZoomToNode',\n      from: this.uid,\n      seriesId: this.seriesModel.id,\n      targetNode: targetInfo.node\n    });\n  };\n  TreemapView.prototype._rootToNode = function (targetInfo) {\n    this.api.dispatchAction({\n      type: 'treemapRootToNode',\n      from: this.uid,\n      seriesId: this.seriesModel.id,\n      targetNode: targetInfo.node\n    });\n  };\n  /**\n   * @param x Global coord x.\n   * @param y Global coord y.\n   * @return info If not found, return undefined;\n   * @return info.node Target node.\n   * @return info.offsetX x refer to target node.\n   * @return info.offsetY y refer to target node.\n   */\n  TreemapView.prototype.findTarget = function (x, y) {\n    var targetInfo;\n    var viewRoot = this.seriesModel.getViewRoot();\n    viewRoot.eachNode({\n      attr: 'viewChildren',\n      order: 'preorder'\n    }, function (node) {\n      var bgEl = this._storage.background[node.getRawIndex()];\n      // If invisible, there might be no element.\n      if (bgEl) {\n        var point = bgEl.transformCoordToLocal(x, y);\n        var shape = bgEl.shape;\n        // For performance consideration, don't use 'getBoundingRect'.\n        if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) {\n          targetInfo = {\n            node: node,\n            offsetX: point[0],\n            offsetY: point[1]\n          };\n        } else {\n          return false; // Suppress visit subtree.\n        }\n      }\n    }, this);\n    return targetInfo;\n  };\n  TreemapView.type = 'treemap';\n  return TreemapView;\n}(ChartView);\nfunction createStorage() {\n  return {\n    nodeGroup: [],\n    background: [],\n    content: []\n  };\n}\n/**\n * @return Return undefined means do not travel further.\n */\nfunction renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) {\n  // Whether under viewRoot.\n  if (!thisNode) {\n    // Deleting nodes will be performed finally. This method just find\n    // element from old storage, or create new element, set them to new\n    // storage, and set styles.\n    return;\n  }\n  // -------------------------------------------------------------------\n  // Start of closure variables available in \"Procedures in renderNode\".\n  var thisLayout = thisNode.getLayout();\n  var data = seriesModel.getData();\n  var nodeModel = thisNode.getModel();\n  // Only for enabling highlight/downplay. Clear firstly.\n  // Because some node will not be rendered.\n  data.setItemGraphicEl(thisNode.dataIndex, null);\n  if (!thisLayout || !thisLayout.isInView) {\n    return;\n  }\n  var thisWidth = thisLayout.width;\n  var thisHeight = thisLayout.height;\n  var borderWidth = thisLayout.borderWidth;\n  var thisInvisible = thisLayout.invisible;\n  var thisRawIndex = thisNode.getRawIndex();\n  var oldRawIndex = oldNode && oldNode.getRawIndex();\n  var thisViewChildren = thisNode.viewChildren;\n  var upperHeight = thisLayout.upperHeight;\n  var isParent = thisViewChildren && thisViewChildren.length;\n  var itemStyleNormalModel = nodeModel.getModel('itemStyle');\n  var itemStyleEmphasisModel = nodeModel.getModel(['emphasis', 'itemStyle']);\n  var itemStyleBlurModel = nodeModel.getModel(['blur', 'itemStyle']);\n  var itemStyleSelectModel = nodeModel.getModel(['select', 'itemStyle']);\n  var borderRadius = itemStyleNormalModel.get('borderRadius') || 0;\n  // End of closure ariables available in \"Procedures in renderNode\".\n  // -----------------------------------------------------------------\n  // Node group\n  var group = giveGraphic('nodeGroup', Group);\n  if (!group) {\n    return;\n  }\n  parentGroup.add(group);\n  // x,y are not set when el is above view root.\n  group.x = thisLayout.x || 0;\n  group.y = thisLayout.y || 0;\n  group.markRedraw();\n  inner(group).nodeWidth = thisWidth;\n  inner(group).nodeHeight = thisHeight;\n  if (thisLayout.isAboveViewRoot) {\n    return group;\n  }\n  // Background\n  var bg = giveGraphic('background', Rect, depth, Z2_BG);\n  bg && renderBackground(group, bg, isParent && thisLayout.upperLabelHeight);\n  var emphasisModel = nodeModel.getModel('emphasis');\n  var focus = emphasisModel.get('focus');\n  var blurScope = emphasisModel.get('blurScope');\n  var isDisabled = emphasisModel.get('disabled');\n  var focusOrIndices = focus === 'ancestor' ? thisNode.getAncestorsIndices() : focus === 'descendant' ? thisNode.getDescendantIndices() : focus;\n  // No children, render content.\n  if (isParent) {\n    // Because of the implementation about \"traverse\" in graphic hover style, we\n    // can not set hover listener on the \"group\" of non-leaf node. Otherwise the\n    // hover event from the descendents will be listenered.\n    if (isHighDownDispatcher(group)) {\n      setAsHighDownDispatcher(group, false);\n    }\n    if (bg) {\n      setAsHighDownDispatcher(bg, !isDisabled);\n      // Only for enabling highlight/downplay.\n      data.setItemGraphicEl(thisNode.dataIndex, bg);\n      enableHoverFocus(bg, focusOrIndices, blurScope);\n    }\n  } else {\n    var content = giveGraphic('content', Rect, depth, Z2_CONTENT);\n    content && renderContent(group, content);\n    bg.disableMorphing = true;\n    if (bg && isHighDownDispatcher(bg)) {\n      setAsHighDownDispatcher(bg, false);\n    }\n    setAsHighDownDispatcher(group, !isDisabled);\n    // Only for enabling highlight/downplay.\n    data.setItemGraphicEl(thisNode.dataIndex, group);\n    var cursorStyle = nodeModel.getShallow('cursor');\n    cursorStyle && content.attr('cursor', cursorStyle);\n    enableHoverFocus(group, focusOrIndices, blurScope);\n  }\n  return group;\n  // ----------------------------\n  // | Procedures in renderNode |\n  // ----------------------------\n  function renderBackground(group, bg, useUpperLabel) {\n    var ecData = getECData(bg);\n    // For tooltip.\n    ecData.dataIndex = thisNode.dataIndex;\n    ecData.seriesIndex = seriesModel.seriesIndex;\n    bg.setShape({\n      x: 0,\n      y: 0,\n      width: thisWidth,\n      height: thisHeight,\n      r: borderRadius\n    });\n    if (thisInvisible) {\n      // If invisible, do not set visual, otherwise the element will\n      // change immediately before animation. We think it is OK to\n      // remain its origin color when moving out of the view window.\n      processInvisible(bg);\n    } else {\n      bg.invisible = false;\n      var style = thisNode.getVisual('style');\n      var visualBorderColor = style.stroke;\n      var normalStyle = getItemStyleNormal(itemStyleNormalModel);\n      normalStyle.fill = visualBorderColor;\n      var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel);\n      emphasisStyle.fill = itemStyleEmphasisModel.get('borderColor');\n      var blurStyle = getStateItemStyle(itemStyleBlurModel);\n      blurStyle.fill = itemStyleBlurModel.get('borderColor');\n      var selectStyle = getStateItemStyle(itemStyleSelectModel);\n      selectStyle.fill = itemStyleSelectModel.get('borderColor');\n      if (useUpperLabel) {\n        var upperLabelWidth = thisWidth - 2 * borderWidth;\n        prepareText(\n        // PENDING: convert ZRColor to ColorString for text.\n        bg, visualBorderColor, style.opacity, {\n          x: borderWidth,\n          y: 0,\n          width: upperLabelWidth,\n          height: upperHeight\n        });\n      }\n      // For old bg.\n      else {\n        bg.removeTextContent();\n      }\n      bg.setStyle(normalStyle);\n      bg.ensureState('emphasis').style = emphasisStyle;\n      bg.ensureState('blur').style = blurStyle;\n      bg.ensureState('select').style = selectStyle;\n      setDefaultStateProxy(bg);\n    }\n    group.add(bg);\n  }\n  function renderContent(group, content) {\n    var ecData = getECData(content);\n    // For tooltip.\n    ecData.dataIndex = thisNode.dataIndex;\n    ecData.seriesIndex = seriesModel.seriesIndex;\n    var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0);\n    var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0);\n    content.culling = true;\n    content.setShape({\n      x: borderWidth,\n      y: borderWidth,\n      width: contentWidth,\n      height: contentHeight,\n      r: borderRadius\n    });\n    if (thisInvisible) {\n      // If invisible, do not set visual, otherwise the element will\n      // change immediately before animation. We think it is OK to\n      // remain its origin color when moving out of the view window.\n      processInvisible(content);\n    } else {\n      content.invisible = false;\n      var nodeStyle = thisNode.getVisual('style');\n      var visualColor = nodeStyle.fill;\n      var normalStyle = getItemStyleNormal(itemStyleNormalModel);\n      normalStyle.fill = visualColor;\n      normalStyle.decal = nodeStyle.decal;\n      var emphasisStyle = getStateItemStyle(itemStyleEmphasisModel);\n      var blurStyle = getStateItemStyle(itemStyleBlurModel);\n      var selectStyle = getStateItemStyle(itemStyleSelectModel);\n      // PENDING: convert ZRColor to ColorString for text.\n      prepareText(content, visualColor, nodeStyle.opacity, null);\n      content.setStyle(normalStyle);\n      content.ensureState('emphasis').style = emphasisStyle;\n      content.ensureState('blur').style = blurStyle;\n      content.ensureState('select').style = selectStyle;\n      setDefaultStateProxy(content);\n    }\n    group.add(content);\n  }\n  function processInvisible(element) {\n    // Delay invisible setting utill animation finished,\n    // avoid element vanish suddenly before animation.\n    !element.invisible && willInvisibleEls.push(element);\n  }\n  function prepareText(rectEl, visualColor, visualOpacity,\n  // Can be null/undefined\n  upperLabelRect) {\n    var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL);\n    var defaultText = convertOptionIdName(nodeModel.get('name'), null);\n    var isShow = normalLabelModel.getShallow('show');\n    setLabelStyle(rectEl, getLabelStatesModels(nodeModel, upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL), {\n      defaultText: isShow ? defaultText : null,\n      inheritColor: visualColor,\n      defaultOpacity: visualOpacity,\n      labelFetcher: seriesModel,\n      labelDataIndex: thisNode.dataIndex\n    });\n    var textEl = rectEl.getTextContent();\n    if (!textEl) {\n      return;\n    }\n    var textStyle = textEl.style;\n    var textPadding = normalizeCssArray(textStyle.padding || 0);\n    if (upperLabelRect) {\n      rectEl.setTextConfig({\n        layoutRect: upperLabelRect\n      });\n      textEl.disableLabelLayout = true;\n    }\n    textEl.beforeUpdate = function () {\n      var width = Math.max((upperLabelRect ? upperLabelRect.width : rectEl.shape.width) - textPadding[1] - textPadding[3], 0);\n      var height = Math.max((upperLabelRect ? upperLabelRect.height : rectEl.shape.height) - textPadding[0] - textPadding[2], 0);\n      if (textStyle.width !== width || textStyle.height !== height) {\n        textEl.setStyle({\n          width: width,\n          height: height\n        });\n      }\n    };\n    textStyle.truncateMinChar = 2;\n    textStyle.lineOverflow = 'truncate';\n    addDrillDownIcon(textStyle, upperLabelRect, thisLayout);\n    var textEmphasisState = textEl.getState('emphasis');\n    addDrillDownIcon(textEmphasisState ? textEmphasisState.style : null, upperLabelRect, thisLayout);\n  }\n  function addDrillDownIcon(style, upperLabelRect, thisLayout) {\n    var text = style ? style.text : null;\n    if (!upperLabelRect && thisLayout.isLeafRoot && text != null) {\n      var iconChar = seriesModel.get('drillDownIcon', true);\n      style.text = iconChar ? iconChar + ' ' + text : text;\n    }\n  }\n  function giveGraphic(storageName, Ctor, depth, z) {\n    var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex];\n    var lasts = lastsForAnimation[storageName];\n    if (element) {\n      // Remove from oldStorage\n      oldStorage[storageName][oldRawIndex] = null;\n      prepareAnimationWhenHasOld(lasts, element);\n    }\n    // If invisible and no old element, do not create new element (for optimizing).\n    else if (!thisInvisible) {\n      element = new Ctor();\n      if (element instanceof Displayable) {\n        element.z2 = calculateZ2(depth, z);\n      }\n      prepareAnimationWhenNoOld(lasts, element);\n    }\n    // Set to thisStorage\n    return thisStorage[storageName][thisRawIndex] = element;\n  }\n  function prepareAnimationWhenHasOld(lasts, element) {\n    var lastCfg = lasts[thisRawIndex] = {};\n    if (element instanceof Group) {\n      lastCfg.oldX = element.x;\n      lastCfg.oldY = element.y;\n    } else {\n      lastCfg.oldShape = extend({}, element.shape);\n    }\n  }\n  // If a element is new, we need to find the animation start point carefully,\n  // otherwise it will looks strange when 'zoomToNode'.\n  function prepareAnimationWhenNoOld(lasts, element) {\n    var lastCfg = lasts[thisRawIndex] = {};\n    var parentNode = thisNode.parentNode;\n    var isGroup = element instanceof graphic.Group;\n    if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) {\n      var parentOldX = 0;\n      var parentOldY = 0;\n      // New nodes appear from right-bottom corner in 'zoomToNode' animation.\n      // For convenience, get old bounding rect from background.\n      var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()];\n      if (!reRoot && parentOldBg && parentOldBg.oldShape) {\n        parentOldX = parentOldBg.oldShape.width;\n        parentOldY = parentOldBg.oldShape.height;\n      }\n      // When no parent old shape found, its parent is new too,\n      // so we can just use {x:0, y:0}.\n      if (isGroup) {\n        lastCfg.oldX = 0;\n        lastCfg.oldY = parentOldY;\n      } else {\n        lastCfg.oldShape = {\n          x: parentOldX,\n          y: parentOldY,\n          width: 0,\n          height: 0\n        };\n      }\n    }\n    // Fade in, user can be aware that these nodes are new.\n    lastCfg.fadein = !isGroup;\n  }\n}\n// We cannot set all background with the same z, because the behaviour of\n// drill down and roll up differ background creation sequence from tree\n// hierarchy sequence, which cause lower background elements to overlap\n// upper ones. So we calculate z based on depth.\n// Moreover, we try to shrink down z interval to [0, 1] to avoid that\n// treemap with large z overlaps other components.\nfunction calculateZ2(depth, z2InLevel) {\n  return depth * Z2_BASE + z2InLevel;\n}\nexport default TreemapView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as zrColor from 'zrender/lib/tool/color.js';\nimport { linearMap } from '../util/number.js';\nimport { warn } from '../util/log.js';\nvar each = zrUtil.each;\nvar isObject = zrUtil.isObject;\nvar CATEGORY_DEFAULT_VISUAL_INDEX = -1;\nvar VisualMapping = /** @class */function () {\n  function VisualMapping(option) {\n    var mappingMethod = option.mappingMethod;\n    var visualType = option.type;\n    var thisOption = this.option = zrUtil.clone(option);\n    this.type = visualType;\n    this.mappingMethod = mappingMethod;\n    this._normalizeData = normalizers[mappingMethod];\n    var visualHandler = VisualMapping.visualHandlers[visualType];\n    this.applyVisual = visualHandler.applyVisual;\n    this.getColorMapper = visualHandler.getColorMapper;\n    this._normalizedToVisual = visualHandler._normalizedToVisual[mappingMethod];\n    if (mappingMethod === 'piecewise') {\n      normalizeVisualRange(thisOption);\n      preprocessForPiecewise(thisOption);\n    } else if (mappingMethod === 'category') {\n      thisOption.categories ? preprocessForSpecifiedCategory(thisOption)\n      // categories is ordinal when thisOption.categories not specified,\n      // which need no more preprocess except normalize visual.\n      : normalizeVisualRange(thisOption, true);\n    } else {\n      // mappingMethod === 'linear' or 'fixed'\n      zrUtil.assert(mappingMethod !== 'linear' || thisOption.dataExtent);\n      normalizeVisualRange(thisOption);\n    }\n  }\n  VisualMapping.prototype.mapValueToVisual = function (value) {\n    var normalized = this._normalizeData(value);\n    return this._normalizedToVisual(normalized, value);\n  };\n  VisualMapping.prototype.getNormalizer = function () {\n    return zrUtil.bind(this._normalizeData, this);\n  };\n  /**\n   * List available visual types.\n   *\n   * @public\n   * @return {Array.<string>}\n   */\n  VisualMapping.listVisualTypes = function () {\n    return zrUtil.keys(VisualMapping.visualHandlers);\n  };\n  // /**\n  //  * @public\n  //  */\n  // static addVisualHandler(name, handler) {\n  //     visualHandlers[name] = handler;\n  // }\n  /**\n   * @public\n   */\n  VisualMapping.isValidType = function (visualType) {\n    return VisualMapping.visualHandlers.hasOwnProperty(visualType);\n  };\n  /**\n   * Convenient method.\n   * Visual can be Object or Array or primary type.\n   */\n  VisualMapping.eachVisual = function (visual, callback, context) {\n    if (zrUtil.isObject(visual)) {\n      zrUtil.each(visual, callback, context);\n    } else {\n      callback.call(context, visual);\n    }\n  };\n  VisualMapping.mapVisual = function (visual, callback, context) {\n    var isPrimary;\n    var newVisual = zrUtil.isArray(visual) ? [] : zrUtil.isObject(visual) ? {} : (isPrimary = true, null);\n    VisualMapping.eachVisual(visual, function (v, key) {\n      var newVal = callback.call(context, v, key);\n      isPrimary ? newVisual = newVal : newVisual[key] = newVal;\n    });\n    return newVisual;\n  };\n  /**\n   * Retrieve visual properties from given object.\n   */\n  VisualMapping.retrieveVisuals = function (obj) {\n    var ret = {};\n    var hasVisual;\n    obj && each(VisualMapping.visualHandlers, function (h, visualType) {\n      if (obj.hasOwnProperty(visualType)) {\n        ret[visualType] = obj[visualType];\n        hasVisual = true;\n      }\n    });\n    return hasVisual ? ret : null;\n  };\n  /**\n   * Give order to visual types, considering colorSaturation, colorAlpha depends on color.\n   *\n   * @public\n   * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...}\n   *                                     IF Array, like: ['color', 'symbol', 'colorSaturation']\n   * @return {Array.<string>} Sorted visual types.\n   */\n  VisualMapping.prepareVisualTypes = function (visualTypes) {\n    if (zrUtil.isArray(visualTypes)) {\n      visualTypes = visualTypes.slice();\n    } else if (isObject(visualTypes)) {\n      var types_1 = [];\n      each(visualTypes, function (item, type) {\n        types_1.push(type);\n      });\n      visualTypes = types_1;\n    } else {\n      return [];\n    }\n    visualTypes.sort(function (type1, type2) {\n      // color should be front of colorSaturation, colorAlpha, ...\n      // symbol and symbolSize do not matter.\n      return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1;\n    });\n    return visualTypes;\n  };\n  /**\n   * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'.\n   * Other visuals are only depends on themself.\n   */\n  VisualMapping.dependsOn = function (visualType1, visualType2) {\n    return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2;\n  };\n  /**\n   * @param value\n   * @param pieceList [{value: ..., interval: [min, max]}, ...]\n   *                         Always from small to big.\n   * @param findClosestWhenOutside Default to be false\n   * @return index\n   */\n  VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) {\n    var possibleI;\n    var abs = Infinity;\n    // value has the higher priority.\n    for (var i = 0, len = pieceList.length; i < len; i++) {\n      var pieceValue = pieceList[i].value;\n      if (pieceValue != null) {\n        if (pieceValue === value\n        // FIXME\n        // It is supposed to compare value according to value type of dimension,\n        // but currently value type can exactly be string or number.\n        // Compromise for numeric-like string (like '12'), especially\n        // in the case that visualMap.categories is ['22', '33'].\n        || zrUtil.isString(pieceValue) && pieceValue === value + '') {\n          return i;\n        }\n        findClosestWhenOutside && updatePossible(pieceValue, i);\n      }\n    }\n    for (var i = 0, len = pieceList.length; i < len; i++) {\n      var piece = pieceList[i];\n      var interval = piece.interval;\n      var close_1 = piece.close;\n      if (interval) {\n        if (interval[0] === -Infinity) {\n          if (littleThan(close_1[1], value, interval[1])) {\n            return i;\n          }\n        } else if (interval[1] === Infinity) {\n          if (littleThan(close_1[0], interval[0], value)) {\n            return i;\n          }\n        } else if (littleThan(close_1[0], interval[0], value) && littleThan(close_1[1], value, interval[1])) {\n          return i;\n        }\n        findClosestWhenOutside && updatePossible(interval[0], i);\n        findClosestWhenOutside && updatePossible(interval[1], i);\n      }\n    }\n    if (findClosestWhenOutside) {\n      return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI;\n    }\n    function updatePossible(val, index) {\n      var newAbs = Math.abs(val - value);\n      if (newAbs < abs) {\n        abs = newAbs;\n        possibleI = index;\n      }\n    }\n  };\n  VisualMapping.visualHandlers = {\n    color: {\n      applyVisual: makeApplyVisual('color'),\n      getColorMapper: function () {\n        var thisOption = this.option;\n        return zrUtil.bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) {\n          !isNormalized && (value = this._normalizeData(value));\n          return doMapCategory.call(this, value);\n        } : function (value, isNormalized, out) {\n          // If output rgb array\n          // which will be much faster and useful in pixel manipulation\n          var returnRGBArray = !!out;\n          !isNormalized && (value = this._normalizeData(value));\n          out = zrColor.fastLerp(value, thisOption.parsedVisual, out);\n          return returnRGBArray ? out : zrColor.stringify(out, 'rgba');\n        }, this);\n      },\n      _normalizedToVisual: {\n        linear: function (normalized) {\n          return zrColor.stringify(zrColor.fastLerp(normalized, this.option.parsedVisual), 'rgba');\n        },\n        category: doMapCategory,\n        piecewise: function (normalized, value) {\n          var result = getSpecifiedVisual.call(this, value);\n          if (result == null) {\n            result = zrColor.stringify(zrColor.fastLerp(normalized, this.option.parsedVisual), 'rgba');\n          }\n          return result;\n        },\n        fixed: doMapFixed\n      }\n    },\n    colorHue: makePartialColorVisualHandler(function (color, value) {\n      return zrColor.modifyHSL(color, value);\n    }),\n    colorSaturation: makePartialColorVisualHandler(function (color, value) {\n      return zrColor.modifyHSL(color, null, value);\n    }),\n    colorLightness: makePartialColorVisualHandler(function (color, value) {\n      return zrColor.modifyHSL(color, null, null, value);\n    }),\n    colorAlpha: makePartialColorVisualHandler(function (color, value) {\n      return zrColor.modifyAlpha(color, value);\n    }),\n    decal: {\n      applyVisual: makeApplyVisual('decal'),\n      _normalizedToVisual: {\n        linear: null,\n        category: doMapCategory,\n        piecewise: null,\n        fixed: null\n      }\n    },\n    opacity: {\n      applyVisual: makeApplyVisual('opacity'),\n      _normalizedToVisual: createNormalizedToNumericVisual([0, 1])\n    },\n    liftZ: {\n      applyVisual: makeApplyVisual('liftZ'),\n      _normalizedToVisual: {\n        linear: doMapFixed,\n        category: doMapFixed,\n        piecewise: doMapFixed,\n        fixed: doMapFixed\n      }\n    },\n    symbol: {\n      applyVisual: function (value, getter, setter) {\n        var symbolCfg = this.mapValueToVisual(value);\n        setter('symbol', symbolCfg);\n      },\n      _normalizedToVisual: {\n        linear: doMapToArray,\n        category: doMapCategory,\n        piecewise: function (normalized, value) {\n          var result = getSpecifiedVisual.call(this, value);\n          if (result == null) {\n            result = doMapToArray.call(this, normalized);\n          }\n          return result;\n        },\n        fixed: doMapFixed\n      }\n    },\n    symbolSize: {\n      applyVisual: makeApplyVisual('symbolSize'),\n      _normalizedToVisual: createNormalizedToNumericVisual([0, 1])\n    }\n  };\n  return VisualMapping;\n}();\nfunction preprocessForPiecewise(thisOption) {\n  var pieceList = thisOption.pieceList;\n  thisOption.hasSpecialVisual = false;\n  zrUtil.each(pieceList, function (piece, index) {\n    piece.originIndex = index;\n    // piece.visual is \"result visual value\" but not\n    // a visual range, so it does not need to be normalized.\n    if (piece.visual != null) {\n      thisOption.hasSpecialVisual = true;\n    }\n  });\n}\nfunction preprocessForSpecifiedCategory(thisOption) {\n  // Hash categories.\n  var categories = thisOption.categories;\n  var categoryMap = thisOption.categoryMap = {};\n  var visual = thisOption.visual;\n  each(categories, function (cate, index) {\n    categoryMap[cate] = index;\n  });\n  // Process visual map input.\n  if (!zrUtil.isArray(visual)) {\n    var visualArr_1 = [];\n    if (zrUtil.isObject(visual)) {\n      each(visual, function (v, cate) {\n        var index = categoryMap[cate];\n        visualArr_1[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v;\n      });\n    } else {\n      // Is primary type, represents default visual.\n      visualArr_1[CATEGORY_DEFAULT_VISUAL_INDEX] = visual;\n    }\n    visual = setVisualToOption(thisOption, visualArr_1);\n  }\n  // Remove categories that has no visual,\n  // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX.\n  for (var i = categories.length - 1; i >= 0; i--) {\n    if (visual[i] == null) {\n      delete categoryMap[categories[i]];\n      categories.pop();\n    }\n  }\n}\nfunction normalizeVisualRange(thisOption, isCategory) {\n  var visual = thisOption.visual;\n  var visualArr = [];\n  if (zrUtil.isObject(visual)) {\n    each(visual, function (v) {\n      visualArr.push(v);\n    });\n  } else if (visual != null) {\n    visualArr.push(visual);\n  }\n  var doNotNeedPair = {\n    color: 1,\n    symbol: 1\n  };\n  if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) {\n    // Do not care visualArr.length === 0, which is illegal.\n    visualArr[1] = visualArr[0];\n  }\n  setVisualToOption(thisOption, visualArr);\n}\nfunction makePartialColorVisualHandler(applyValue) {\n  return {\n    applyVisual: function (value, getter, setter) {\n      // Only used in HSL\n      var colorChannel = this.mapValueToVisual(value);\n      // Must not be array value\n      setter('color', applyValue(getter('color'), colorChannel));\n    },\n    _normalizedToVisual: createNormalizedToNumericVisual([0, 1])\n  };\n}\nfunction doMapToArray(normalized) {\n  var visual = this.option.visual;\n  return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {}; // TODO {}?\n}\nfunction makeApplyVisual(visualType) {\n  return function (value, getter, setter) {\n    setter(visualType, this.mapValueToVisual(value));\n  };\n}\nfunction doMapCategory(normalized) {\n  var visual = this.option.visual;\n  return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized];\n}\nfunction doMapFixed() {\n  // visual will be convert to array.\n  return this.option.visual[0];\n}\n/**\n * Create mapped to numeric visual\n */\nfunction createNormalizedToNumericVisual(sourceExtent) {\n  return {\n    linear: function (normalized) {\n      return linearMap(normalized, sourceExtent, this.option.visual, true);\n    },\n    category: doMapCategory,\n    piecewise: function (normalized, value) {\n      var result = getSpecifiedVisual.call(this, value);\n      if (result == null) {\n        result = linearMap(normalized, sourceExtent, this.option.visual, true);\n      }\n      return result;\n    },\n    fixed: doMapFixed\n  };\n}\nfunction getSpecifiedVisual(value) {\n  var thisOption = this.option;\n  var pieceList = thisOption.pieceList;\n  if (thisOption.hasSpecialVisual) {\n    var pieceIndex = VisualMapping.findPieceIndex(value, pieceList);\n    var piece = pieceList[pieceIndex];\n    if (piece && piece.visual) {\n      return piece.visual[this.type];\n    }\n  }\n}\nfunction setVisualToOption(thisOption, visualArr) {\n  thisOption.visual = visualArr;\n  if (thisOption.type === 'color') {\n    thisOption.parsedVisual = zrUtil.map(visualArr, function (item) {\n      var color = zrColor.parse(item);\n      if (!color && process.env.NODE_ENV !== 'production') {\n        warn(\"'\" + item + \"' is an illegal color, fallback to '#000000'\", true);\n      }\n      return color || [0, 0, 0, 1];\n    });\n  }\n  return visualArr;\n}\n/**\n * Normalizers by mapping methods.\n */\nvar normalizers = {\n  linear: function (value) {\n    return linearMap(value, this.option.dataExtent, [0, 1], true);\n  },\n  piecewise: function (value) {\n    var pieceList = this.option.pieceList;\n    var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true);\n    if (pieceIndex != null) {\n      return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true);\n    }\n  },\n  category: function (value) {\n    var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal value\n    return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index;\n  },\n  fixed: zrUtil.noop\n};\nfunction littleThan(close, a, b) {\n  return close ? a <= b : a < b;\n}\nexport default VisualMapping;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport VisualMapping from '../../visual/VisualMapping.js';\nimport { each, extend, isArray } from 'zrender/lib/core/util.js';\nimport { modifyHSL, modifyAlpha } from 'zrender/lib/tool/color.js';\nimport { makeInner } from '../../util/model.js';\nvar ITEM_STYLE_NORMAL = 'itemStyle';\nvar inner = makeInner();\nexport default {\n  seriesType: 'treemap',\n  reset: function (seriesModel) {\n    var tree = seriesModel.getData().tree;\n    var root = tree.root;\n    if (root.isRemoved()) {\n      return;\n    }\n    travelTree(root,\n    // Visual should calculate from tree root but not view root.\n    {}, seriesModel.getViewRoot().getAncestors(), seriesModel);\n  }\n};\nfunction travelTree(node, designatedVisual, viewRootAncestors, seriesModel) {\n  var nodeModel = node.getModel();\n  var nodeLayout = node.getLayout();\n  var data = node.hostTree.data;\n  // Optimize\n  if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) {\n    return;\n  }\n  var nodeItemStyleModel = nodeModel.getModel(ITEM_STYLE_NORMAL);\n  var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel);\n  var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style');\n  // calculate border color\n  var borderColor = nodeItemStyleModel.get('borderColor');\n  var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation');\n  var thisNodeColor;\n  if (borderColorSaturation != null) {\n    // For performance, do not always execute 'calculateColor'.\n    thisNodeColor = calculateColor(visuals);\n    borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor);\n  }\n  existsStyle.stroke = borderColor;\n  var viewChildren = node.viewChildren;\n  if (!viewChildren || !viewChildren.length) {\n    thisNodeColor = calculateColor(visuals);\n    // Apply visual to this node.\n    existsStyle.fill = thisNodeColor;\n  } else {\n    var mapping_1 = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren);\n    // Designate visual to children.\n    each(viewChildren, function (child, index) {\n      // If higher than viewRoot, only ancestors of viewRoot is needed to visit.\n      if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) {\n        var childVisual = mapVisual(nodeModel, visuals, child, index, mapping_1, seriesModel);\n        travelTree(child, childVisual, viewRootAncestors, seriesModel);\n      }\n    });\n  }\n}\nfunction buildVisuals(nodeItemStyleModel, designatedVisual, seriesModel) {\n  var visuals = extend({}, designatedVisual);\n  var designatedVisualItemStyle = seriesModel.designatedVisualItemStyle;\n  each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) {\n    // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel\n    designatedVisualItemStyle[visualName] = designatedVisual[visualName];\n    var val = nodeItemStyleModel.get(visualName);\n    designatedVisualItemStyle[visualName] = null;\n    val != null && (visuals[visualName] = val);\n  });\n  return visuals;\n}\nfunction calculateColor(visuals) {\n  var color = getValueVisualDefine(visuals, 'color');\n  if (color) {\n    var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha');\n    var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation');\n    if (colorSaturation) {\n      color = modifyHSL(color, null, null, colorSaturation);\n    }\n    if (colorAlpha) {\n      color = modifyAlpha(color, colorAlpha);\n    }\n    return color;\n  }\n}\nfunction calculateBorderColor(borderColorSaturation, thisNodeColor) {\n  return thisNodeColor != null\n  // Can only be string\n  ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null;\n}\nfunction getValueVisualDefine(visuals, name) {\n  var value = visuals[name];\n  if (value != null && value !== 'none') {\n    return value;\n  }\n}\nfunction buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) {\n  if (!viewChildren || !viewChildren.length) {\n    return;\n  }\n  var rangeVisual = getRangeVisual(nodeModel, 'color') || visuals.color != null && visuals.color !== 'none' && (getRangeVisual(nodeModel, 'colorAlpha') || getRangeVisual(nodeModel, 'colorSaturation'));\n  if (!rangeVisual) {\n    return;\n  }\n  var visualMin = nodeModel.get('visualMin');\n  var visualMax = nodeModel.get('visualMax');\n  var dataExtent = nodeLayout.dataExtent.slice();\n  visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin);\n  visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax);\n  var colorMappingBy = nodeModel.get('colorMappingBy');\n  var opt = {\n    type: rangeVisual.name,\n    dataExtent: dataExtent,\n    visual: rangeVisual.range\n  };\n  if (opt.type === 'color' && (colorMappingBy === 'index' || colorMappingBy === 'id')) {\n    opt.mappingMethod = 'category';\n    opt.loop = true;\n    // categories is ordinal, so do not set opt.categories.\n  } else {\n    opt.mappingMethod = 'linear';\n  }\n  var mapping = new VisualMapping(opt);\n  inner(mapping).drColorMappingBy = colorMappingBy;\n  return mapping;\n}\n// Notice: If we don't have the attribute 'colorRange', but only use\n// attribute 'color' to represent both concepts of 'colorRange' and 'color',\n// (It means 'colorRange' when 'color' is Array, means 'color' when not array),\n// this problem will be encountered:\n// If a level-1 node doesn't have children, and its siblings have children,\n// and colorRange is set on level-1, then the node cannot be colored.\n// So we separate 'colorRange' and 'color' to different attributes.\nfunction getRangeVisual(nodeModel, name) {\n  // 'colorRange', 'colorARange', 'colorSRange'.\n  // If not exists on this node, fetch from levels and series.\n  var range = nodeModel.get(name);\n  return isArray(range) && range.length ? {\n    name: name,\n    range: range\n  } : null;\n}\nfunction mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) {\n  var childVisuals = extend({}, visuals);\n  if (mapping) {\n    // Only support color, colorAlpha, colorSaturation.\n    var mappingType = mapping.type;\n    var colorMappingBy = mappingType === 'color' && inner(mapping).drColorMappingBy;\n    var value = colorMappingBy === 'index' ? index : colorMappingBy === 'id' ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get('visualDimension'));\n    childVisuals[mappingType] = mapping.mapValueToVisual(value);\n  }\n  return childVisuals;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/*\n* A third-party license is embedded for some of the code in this file:\n* The treemap layout implementation was originally copied from\n* \"d3.js\" with some modifications made for this project.\n* (See more details in the comment of the method \"squarify\" below.)\n* The use of the source code of this file is also subject to the terms\n* and consitions of the license of \"d3.js\" (BSD-3Clause, see\n* </licenses/LICENSE-d3>).\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { parsePercent, MAX_SAFE_INTEGER } from '../../util/number.js';\nimport * as layout from '../../util/layout.js';\nimport * as helper from '../helper/treeHelper.js';\nvar mathMax = Math.max;\nvar mathMin = Math.min;\nvar retrieveValue = zrUtil.retrieve;\nvar each = zrUtil.each;\nvar PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth'];\nvar PATH_GAP_WIDTH = ['itemStyle', 'gapWidth'];\nvar PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show'];\nvar PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height'];\n;\n/**\n * @public\n */\nexport default {\n  seriesType: 'treemap',\n  reset: function (seriesModel, ecModel, api, payload) {\n    // Layout result in each node:\n    // {x, y, width, height, area, borderWidth}\n    var seriesOption = seriesModel.option;\n    var refContainer = layout.createBoxLayoutReference(seriesModel, api).refContainer;\n    var layoutInfo = layout.getLayoutRect(seriesModel.getBoxLayoutParams(), refContainer);\n    var size = seriesOption.size || []; // Compatible with ec2.\n    var containerWidth = parsePercent(retrieveValue(layoutInfo.width, size[0]), refContainer.width);\n    var containerHeight = parsePercent(retrieveValue(layoutInfo.height, size[1]), refContainer.height);\n    // Fetch payload info.\n    var payloadType = payload && payload.type;\n    var types = ['treemapZoomToNode', 'treemapRootToNode'];\n    var targetInfo = helper.retrieveTargetInfo(payload, types, seriesModel);\n    var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null;\n    var viewRoot = seriesModel.getViewRoot();\n    var viewAbovePath = helper.getPathToRoot(viewRoot);\n    if (payloadType !== 'treemapMove') {\n      var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight];\n      var sort_1 = seriesOption.sort;\n      if (sort_1 && sort_1 !== 'asc' && sort_1 !== 'desc') {\n        // Default to be desc order.\n        sort_1 = 'desc';\n      }\n      var options = {\n        squareRatio: seriesOption.squareRatio,\n        sort: sort_1,\n        leafDepth: seriesOption.leafDepth\n      };\n      // layout should be cleared because using updateView but not update.\n      viewRoot.hostTree.clearLayouts();\n      // TODO\n      // optimize: if out of view clip, do not layout.\n      // But take care that if do not render node out of view clip,\n      // how to calculate start po\n      var viewRootLayout_1 = {\n        x: 0,\n        y: 0,\n        width: rootSize[0],\n        height: rootSize[1],\n        area: rootSize[0] * rootSize[1]\n      };\n      viewRoot.setLayout(viewRootLayout_1);\n      squarify(viewRoot, options, false, 0);\n      // Supplement layout.\n      viewRootLayout_1 = viewRoot.getLayout();\n      each(viewAbovePath, function (node, index) {\n        var childValue = (viewAbovePath[index + 1] || viewRoot).getValue();\n        node.setLayout(zrUtil.extend({\n          dataExtent: [childValue, childValue],\n          borderWidth: 0,\n          upperHeight: 0\n        }, viewRootLayout_1));\n      });\n    }\n    var treeRoot = seriesModel.getData().tree.root;\n    treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true);\n    seriesModel.setLayoutInfo(layoutInfo);\n    // FIXME: narrow down pruning boungding rect.\n    // Currently ec width/height is used becuases clip is not supported.\n    prunning(treeRoot,\n    // Transform to base element coordinate system.\n    new BoundingRect(-layoutInfo.x, -layoutInfo.y, api.getWidth(), api.getHeight()), viewAbovePath, viewRoot, 0);\n  }\n};\n/**\n * Layout treemap with squarify algorithm.\n * The original presentation of this algorithm\n * was made by Mark Bruls, Kees Huizing, and Jarke J. van Wijk\n * <https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf>.\n * The implementation of this algorithm was originally copied from \"d3.js\"\n * <https://github.com/d3/d3/blob/9cc9a875e636a1dcf36cc1e07bdf77e1ad6e2c74/src/layout/treemap.js>\n * with some modifications made for this program.\n * See the license statement at the head of this file.\n *\n * @protected\n * @param {module:echarts/data/Tree~TreeNode} node\n * @param {Object} options\n * @param {string} options.sort 'asc' or 'desc'\n * @param {number} options.squareRatio\n * @param {boolean} hideChildren\n * @param {number} depth\n */\nfunction squarify(node, options, hideChildren, depth) {\n  var width;\n  var height;\n  if (node.isRemoved()) {\n    return;\n  }\n  var thisLayout = node.getLayout();\n  width = thisLayout.width;\n  height = thisLayout.height;\n  // Considering border and gap\n  var nodeModel = node.getModel();\n  var borderWidth = nodeModel.get(PATH_BORDER_WIDTH);\n  var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2;\n  var upperLabelHeight = getUpperLabelHeight(nodeModel);\n  var upperHeight = Math.max(borderWidth, upperLabelHeight);\n  var layoutOffset = borderWidth - halfGapWidth;\n  var layoutOffsetUpper = upperHeight - halfGapWidth;\n  node.setLayout({\n    borderWidth: borderWidth,\n    upperHeight: upperHeight,\n    upperLabelHeight: upperLabelHeight\n  }, true);\n  width = mathMax(width - 2 * layoutOffset, 0);\n  height = mathMax(height - layoutOffset - layoutOffsetUpper, 0);\n  var totalArea = width * height;\n  var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth);\n  if (!viewChildren.length) {\n    return;\n  }\n  var rect = {\n    x: layoutOffset,\n    y: layoutOffsetUpper,\n    width: width,\n    height: height\n  };\n  var rowFixedLength = mathMin(width, height);\n  var best = Infinity; // the best row score so far\n  var row = [];\n  row.area = 0;\n  for (var i = 0, len = viewChildren.length; i < len;) {\n    var child = viewChildren[i];\n    row.push(child);\n    row.area += child.getLayout().area;\n    var score = worst(row, rowFixedLength, options.squareRatio);\n    // continue with this orientation\n    if (score <= best) {\n      i++;\n      best = score;\n    }\n    // abort, and try a different orientation\n    else {\n      row.area -= row.pop().getLayout().area;\n      position(row, rowFixedLength, rect, halfGapWidth, false);\n      rowFixedLength = mathMin(rect.width, rect.height);\n      row.length = row.area = 0;\n      best = Infinity;\n    }\n  }\n  if (row.length) {\n    position(row, rowFixedLength, rect, halfGapWidth, true);\n  }\n  if (!hideChildren) {\n    var childrenVisibleMin = nodeModel.get('childrenVisibleMin');\n    if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {\n      hideChildren = true;\n    }\n  }\n  for (var i = 0, len = viewChildren.length; i < len; i++) {\n    squarify(viewChildren[i], options, hideChildren, depth + 1);\n  }\n}\n/**\n * Set area to each child, and calculate data extent for visual coding.\n */\nfunction initChildren(node, nodeModel, totalArea, options, hideChildren, depth) {\n  var viewChildren = node.children || [];\n  var orderBy = options.sort;\n  orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null);\n  var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth;\n  // leafDepth has higher priority.\n  if (hideChildren && !overLeafDepth) {\n    return node.viewChildren = [];\n  }\n  // Sort children, order by desc.\n  viewChildren = zrUtil.filter(viewChildren, function (child) {\n    return !child.isRemoved();\n  });\n  sort(viewChildren, orderBy);\n  var info = statistic(nodeModel, viewChildren, orderBy);\n  if (info.sum === 0) {\n    return node.viewChildren = [];\n  }\n  info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren);\n  if (info.sum === 0) {\n    return node.viewChildren = [];\n  }\n  // Set area to each child.\n  for (var i = 0, len = viewChildren.length; i < len; i++) {\n    var area = viewChildren[i].getValue() / info.sum * totalArea;\n    // Do not use setLayout({...}, true), because it is needed to clear last layout.\n    viewChildren[i].setLayout({\n      area: area\n    });\n  }\n  if (overLeafDepth) {\n    viewChildren.length && node.setLayout({\n      isLeafRoot: true\n    }, true);\n    viewChildren.length = 0;\n  }\n  node.viewChildren = viewChildren;\n  node.setLayout({\n    dataExtent: info.dataExtent\n  }, true);\n  return viewChildren;\n}\n/**\n * Consider 'visibleMin'. Modify viewChildren and get new sum.\n */\nfunction filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) {\n  // visibleMin is not supported yet when no option.sort.\n  if (!orderBy) {\n    return sum;\n  }\n  var visibleMin = nodeModel.get('visibleMin');\n  var len = orderedChildren.length;\n  var deletePoint = len;\n  // Always travel from little value to big value.\n  for (var i = len - 1; i >= 0; i--) {\n    var value = orderedChildren[orderBy === 'asc' ? len - i - 1 : i].getValue();\n    if (value / sum * totalArea < visibleMin) {\n      deletePoint = i;\n      sum -= value;\n    }\n  }\n  orderBy === 'asc' ? orderedChildren.splice(0, len - deletePoint) : orderedChildren.splice(deletePoint, len - deletePoint);\n  return sum;\n}\n/**\n * Sort\n */\nfunction sort(viewChildren, orderBy) {\n  if (orderBy) {\n    viewChildren.sort(function (a, b) {\n      var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue();\n      return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff;\n    });\n  }\n  return viewChildren;\n}\n/**\n * Statistic\n */\nfunction statistic(nodeModel, children, orderBy) {\n  // Calculate sum.\n  var sum = 0;\n  for (var i = 0, len = children.length; i < len; i++) {\n    sum += children[i].getValue();\n  }\n  // Statistic data extent for latter visual coding.\n  // Notice: data extent should be calculate based on raw children\n  // but not filtered view children, otherwise visual mapping will not\n  // be stable when zoom (where children is filtered by visibleMin).\n  var dimension = nodeModel.get('visualDimension');\n  var dataExtent;\n  // The same as area dimension.\n  if (!children || !children.length) {\n    dataExtent = [NaN, NaN];\n  } else if (dimension === 'value' && orderBy) {\n    dataExtent = [children[children.length - 1].getValue(), children[0].getValue()];\n    orderBy === 'asc' && dataExtent.reverse();\n  }\n  // Other dimension.\n  else {\n    dataExtent = [Infinity, -Infinity];\n    each(children, function (child) {\n      var value = child.getValue(dimension);\n      value < dataExtent[0] && (dataExtent[0] = value);\n      value > dataExtent[1] && (dataExtent[1] = value);\n    });\n  }\n  return {\n    sum: sum,\n    dataExtent: dataExtent\n  };\n}\n/**\n * Computes the score for the specified row,\n * as the worst aspect ratio.\n */\nfunction worst(row, rowFixedLength, ratio) {\n  var areaMax = 0;\n  var areaMin = Infinity;\n  for (var i = 0, area = void 0, len = row.length; i < len; i++) {\n    area = row[i].getLayout().area;\n    if (area) {\n      area < areaMin && (areaMin = area);\n      area > areaMax && (areaMax = area);\n    }\n  }\n  var squareArea = row.area * row.area;\n  var f = rowFixedLength * rowFixedLength * ratio;\n  return squareArea ? mathMax(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity;\n}\n/**\n * Positions the specified row of nodes. Modifies `rect`.\n */\nfunction position(row, rowFixedLength, rect, halfGapWidth, flush) {\n  // When rowFixedLength === rect.width,\n  // it is horizontal subdivision,\n  // rowFixedLength is the width of the subdivision,\n  // rowOtherLength is the height of the subdivision,\n  // and nodes will be positioned from left to right.\n  // wh[idx0WhenH] means: when horizontal,\n  //      wh[idx0WhenH] => wh[0] => 'width'.\n  //      xy[idx1WhenH] => xy[1] => 'y'.\n  var idx0WhenH = rowFixedLength === rect.width ? 0 : 1;\n  var idx1WhenH = 1 - idx0WhenH;\n  var xy = ['x', 'y'];\n  var wh = ['width', 'height'];\n  var last = rect[xy[idx0WhenH]];\n  var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0;\n  if (flush || rowOtherLength > rect[wh[idx1WhenH]]) {\n    rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow\n  }\n  for (var i = 0, rowLen = row.length; i < rowLen; i++) {\n    var node = row[i];\n    var nodeLayout = {};\n    var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0;\n    var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax(rowOtherLength - 2 * halfGapWidth, 0);\n    // We use Math.max/min to avoid negative width/height when considering gap width.\n    var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last;\n    var modWH = i === rowLen - 1 || remain < step ? remain : step;\n    var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax(modWH - 2 * halfGapWidth, 0);\n    nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin(halfGapWidth, wh1 / 2);\n    nodeLayout[xy[idx0WhenH]] = last + mathMin(halfGapWidth, wh0 / 2);\n    last += modWH;\n    node.setLayout(nodeLayout, true);\n  }\n  rect[xy[idx1WhenH]] += rowOtherLength;\n  rect[wh[idx1WhenH]] -= rowOtherLength;\n}\n// Return [containerWidth, containerHeight] as default.\nfunction estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) {\n  // If targetInfo.node exists, we zoom to the node,\n  // so estimate whole width and height by target node.\n  var currNode = (targetInfo || {}).node;\n  var defaultSize = [containerWidth, containerHeight];\n  if (!currNode || currNode === viewRoot) {\n    return defaultSize;\n  }\n  var parent;\n  var viewArea = containerWidth * containerHeight;\n  var area = viewArea * seriesModel.option.zoomToNodeRatio;\n  while (parent = currNode.parentNode) {\n    // jshint ignore:line\n    var sum = 0;\n    var siblings = parent.children;\n    for (var i = 0, len = siblings.length; i < len; i++) {\n      sum += siblings[i].getValue();\n    }\n    var currNodeValue = currNode.getValue();\n    if (currNodeValue === 0) {\n      return defaultSize;\n    }\n    area *= sum / currNodeValue;\n    // Considering border, suppose aspect ratio is 1.\n    var parentModel = parent.getModel();\n    var borderWidth = parentModel.get(PATH_BORDER_WIDTH);\n    var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel));\n    area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5);\n    area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER);\n    currNode = parent;\n  }\n  area < viewArea && (area = viewArea);\n  var scale = Math.pow(area / viewArea, 0.5);\n  return [containerWidth * scale, containerHeight * scale];\n}\n// Root position based on coord of containerGroup\nfunction calculateRootPosition(layoutInfo, rootRect, targetInfo) {\n  if (rootRect) {\n    return {\n      x: rootRect.x,\n      y: rootRect.y\n    };\n  }\n  var defaultPosition = {\n    x: 0,\n    y: 0\n  };\n  if (!targetInfo) {\n    return defaultPosition;\n  }\n  // If targetInfo is fetched by 'retrieveTargetInfo',\n  // old tree and new tree are the same tree,\n  // so the node still exists and we can visit it.\n  var targetNode = targetInfo.node;\n  var layout = targetNode.getLayout();\n  if (!layout) {\n    return defaultPosition;\n  }\n  // Transform coord from local to container.\n  var targetCenter = [layout.width / 2, layout.height / 2];\n  var node = targetNode;\n  while (node) {\n    var nodeLayout = node.getLayout();\n    targetCenter[0] += nodeLayout.x;\n    targetCenter[1] += nodeLayout.y;\n    node = node.parentNode;\n  }\n  return {\n    x: layoutInfo.width / 2 - targetCenter[0],\n    y: layoutInfo.height / 2 - targetCenter[1]\n  };\n}\n// Mark nodes visible for prunning when visual coding and rendering.\n// Prunning depends on layout and root position, so we have to do it after layout.\nfunction prunning(node, clipRect, viewAbovePath, viewRoot, depth) {\n  var nodeLayout = node.getLayout();\n  var nodeInViewAbovePath = viewAbovePath[depth];\n  var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node;\n  if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) {\n    return;\n  }\n  node.setLayout({\n    // isInView means: viewRoot sub tree + viewAbovePath\n    isInView: true,\n    // invisible only means: outside view clip so that the node can not\n    // see but still layout for animation preparation but not render.\n    invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout),\n    isAboveViewRoot: isAboveViewRoot\n  }, true);\n  // Transform to child coordinate.\n  var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height);\n  each(node.viewChildren || [], function (child) {\n    prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1);\n  });\n}\nfunction getUpperLabelHeight(model) {\n  return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { installTreemapAction } from './treemapAction.js';\nimport TreemapSeriesModel from './TreemapSeries.js';\nimport TreemapView from './TreemapView.js';\nimport treemapVisual from './treemapVisual.js';\nimport treemapLayout from './treemapLayout.js';\nexport function install(registers) {\n  registers.registerSeriesModel(TreemapSeriesModel);\n  registers.registerChartView(TreemapView);\n  registers.registerVisual(treemapVisual);\n  registers.registerLayout(treemapLayout);\n  installTreemapAction(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isNumber } from 'zrender/lib/core/util.js';\nexport default function categoryFilter(ecModel) {\n  var legendModels = ecModel.findComponents({\n    mainType: 'legend'\n  });\n  if (!legendModels || !legendModels.length) {\n    return;\n  }\n  ecModel.eachSeriesByType('graph', function (graphSeries) {\n    var categoriesData = graphSeries.getCategoriesData();\n    var graph = graphSeries.getGraph();\n    var data = graph.data;\n    var categoryNames = categoriesData.mapArray(categoriesData.getName);\n    data.filterSelf(function (idx) {\n      var model = data.getItemModel(idx);\n      var category = model.getShallow('category');\n      if (category != null) {\n        if (isNumber(category)) {\n          category = categoryNames[category];\n        }\n        // If in any legend component the status is not selected.\n        for (var i = 0; i < legendModels.length; i++) {\n          if (!legendModels[i].isSelected(category)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend, isString } from 'zrender/lib/core/util.js';\nexport default function categoryVisual(ecModel) {\n  var paletteScope = {};\n  ecModel.eachSeriesByType('graph', function (seriesModel) {\n    var categoriesData = seriesModel.getCategoriesData();\n    var data = seriesModel.getData();\n    var categoryNameIdxMap = {};\n    categoriesData.each(function (idx) {\n      var name = categoriesData.getName(idx);\n      // Add prefix to avoid conflict with Object.prototype.\n      categoryNameIdxMap['ec-' + name] = idx;\n      var itemModel = categoriesData.getItemModel(idx);\n      var style = itemModel.getModel('itemStyle').getItemStyle();\n      if (!style.fill) {\n        // Get color from palette.\n        style.fill = seriesModel.getColorFromPalette(name, paletteScope);\n      }\n      categoriesData.setItemVisual(idx, 'style', style);\n      var symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect'];\n      for (var i = 0; i < symbolVisualList.length; i++) {\n        var symbolVisual = itemModel.getShallow(symbolVisualList[i], true);\n        if (symbolVisual != null) {\n          categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual);\n        }\n      }\n    });\n    // Assign category color to visual\n    if (categoriesData.count()) {\n      data.each(function (idx) {\n        var model = data.getItemModel(idx);\n        var categoryIdx = model.getShallow('category');\n        if (categoryIdx != null) {\n          if (isString(categoryIdx)) {\n            categoryIdx = categoryNameIdxMap['ec-' + categoryIdx];\n          }\n          var categoryStyle = categoriesData.getItemVisual(categoryIdx, 'style');\n          var style = data.ensureUniqueItemVisual(idx, 'style');\n          extend(style, categoryStyle);\n          var visualList = ['symbol', 'symbolSize', 'symbolKeepAspect'];\n          for (var i = 0; i < visualList.length; i++) {\n            data.setItemVisual(idx, visualList[i], categoriesData.getItemVisual(categoryIdx, visualList[i]));\n          }\n        }\n      });\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend } from 'zrender/lib/core/util.js';\nfunction normalize(a) {\n  if (!(a instanceof Array)) {\n    a = [a, a];\n  }\n  return a;\n}\nexport default function graphEdgeVisual(ecModel) {\n  ecModel.eachSeriesByType('graph', function (seriesModel) {\n    var graph = seriesModel.getGraph();\n    var edgeData = seriesModel.getEdgeData();\n    var symbolType = normalize(seriesModel.get('edgeSymbol'));\n    var symbolSize = normalize(seriesModel.get('edgeSymbolSize'));\n    // const colorQuery = ['lineStyle', 'color'] as const;\n    // const opacityQuery = ['lineStyle', 'opacity'] as const;\n    edgeData.setVisual('fromSymbol', symbolType && symbolType[0]);\n    edgeData.setVisual('toSymbol', symbolType && symbolType[1]);\n    edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);\n    edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]);\n    edgeData.setVisual('style', seriesModel.getModel('lineStyle').getLineStyle());\n    edgeData.each(function (idx) {\n      var itemModel = edgeData.getItemModel(idx);\n      var edge = graph.getEdgeByIndex(idx);\n      var symbolType = normalize(itemModel.getShallow('symbol', true));\n      var symbolSize = normalize(itemModel.getShallow('symbolSize', true));\n      // Edge visual must after node visual\n      var style = itemModel.getModel('lineStyle').getLineStyle();\n      var existsStyle = edgeData.ensureUniqueItemVisual(idx, 'style');\n      extend(existsStyle, style);\n      switch (existsStyle.stroke) {\n        case 'source':\n          {\n            var nodeStyle = edge.node1.getVisual('style');\n            existsStyle.stroke = nodeStyle && nodeStyle.fill;\n            break;\n          }\n        case 'target':\n          {\n            var nodeStyle = edge.node2.getVisual('style');\n            existsStyle.stroke = nodeStyle && nodeStyle.fill;\n            break;\n          }\n      }\n      symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]);\n      symbolType[1] && edge.setVisual('toSymbol', symbolType[1]);\n      symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]);\n      symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// @ts-nocheck\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar KEY_DELIMITER = '-->';\n/**\n * params handler\n * @param {module:echarts/model/SeriesModel} seriesModel\n * @returns {*}\n */\nvar getAutoCurvenessParams = function (seriesModel) {\n  return seriesModel.get('autoCurveness') || null;\n};\n/**\n * Generate a list of edge curvatures, 20 is the default\n * @param {module:echarts/model/SeriesModel} seriesModel\n * @param {number} appendLength\n * @return  20 => [0, -0.2, 0.2, -0.4, 0.4, -0.6, 0.6, -0.8, 0.8, -1, 1, -1.2, 1.2, -1.4, 1.4, -1.6, 1.6, -1.8, 1.8, -2]\n */\nvar createCurveness = function (seriesModel, appendLength) {\n  var autoCurvenessParmas = getAutoCurvenessParams(seriesModel);\n  var length = 20;\n  var curvenessList = [];\n  // handler the function set\n  if (zrUtil.isNumber(autoCurvenessParmas)) {\n    length = autoCurvenessParmas;\n  } else if (zrUtil.isArray(autoCurvenessParmas)) {\n    seriesModel.__curvenessList = autoCurvenessParmas;\n    return;\n  }\n  // append length\n  if (appendLength > length) {\n    length = appendLength;\n  }\n  // make sure the length is even\n  var len = length % 2 ? length + 2 : length + 3;\n  curvenessList = [];\n  for (var i = 0; i < len; i++) {\n    curvenessList.push((i % 2 ? i + 1 : i) / 10 * (i % 2 ? -1 : 1));\n  }\n  seriesModel.__curvenessList = curvenessList;\n};\n/**\n * Create different cache key data in the positive and negative directions, in order to set the curvature later\n * @param {number|string|module:echarts/data/Graph.Node} n1\n * @param {number|string|module:echarts/data/Graph.Node} n2\n * @param {module:echarts/model/SeriesModel} seriesModel\n * @returns {string} key\n */\nvar getKeyOfEdges = function (n1, n2, seriesModel) {\n  var source = [n1.id, n1.dataIndex].join('.');\n  var target = [n2.id, n2.dataIndex].join('.');\n  return [seriesModel.uid, source, target].join(KEY_DELIMITER);\n};\n/**\n * get opposite key\n * @param {string} key\n * @returns {string}\n */\nvar getOppositeKey = function (key) {\n  var keys = key.split(KEY_DELIMITER);\n  return [keys[0], keys[2], keys[1]].join(KEY_DELIMITER);\n};\n/**\n * get edgeMap with key\n * @param edge\n * @param {module:echarts/model/SeriesModel} seriesModel\n */\nvar getEdgeFromMap = function (edge, seriesModel) {\n  var key = getKeyOfEdges(edge.node1, edge.node2, seriesModel);\n  return seriesModel.__edgeMap[key];\n};\n/**\n * calculate all cases total length\n * @param edge\n * @param seriesModel\n * @returns {number}\n */\nvar getTotalLengthBetweenNodes = function (edge, seriesModel) {\n  var len = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node1, edge.node2, seriesModel), seriesModel);\n  var lenV = getEdgeMapLengthWithKey(getKeyOfEdges(edge.node2, edge.node1, seriesModel), seriesModel);\n  return len + lenV;\n};\n/**\n *\n * @param key\n */\nvar getEdgeMapLengthWithKey = function (key, seriesModel) {\n  var edgeMap = seriesModel.__edgeMap;\n  return edgeMap[key] ? edgeMap[key].length : 0;\n};\n/**\n * Count the number of edges between the same two points, used to obtain the curvature table and the parity of the edge\n * @see /graph/GraphSeries.js@getInitialData\n * @param {module:echarts/model/SeriesModel} seriesModel\n */\nexport function initCurvenessList(seriesModel) {\n  if (!getAutoCurvenessParams(seriesModel)) {\n    return;\n  }\n  seriesModel.__curvenessList = [];\n  seriesModel.__edgeMap = {};\n  // calc the array of curveness List\n  createCurveness(seriesModel);\n}\n/**\n * set edgeMap with key\n * @param {number|string|module:echarts/data/Graph.Node} n1\n * @param {number|string|module:echarts/data/Graph.Node} n2\n * @param {module:echarts/model/SeriesModel} seriesModel\n * @param {number} index\n */\nexport function createEdgeMapForCurveness(n1, n2, seriesModel, index) {\n  if (!getAutoCurvenessParams(seriesModel)) {\n    return;\n  }\n  var key = getKeyOfEdges(n1, n2, seriesModel);\n  var edgeMap = seriesModel.__edgeMap;\n  var oppositeEdges = edgeMap[getOppositeKey(key)];\n  // set direction\n  if (edgeMap[key] && !oppositeEdges) {\n    edgeMap[key].isForward = true;\n  } else if (oppositeEdges && edgeMap[key]) {\n    oppositeEdges.isForward = true;\n    edgeMap[key].isForward = false;\n  }\n  edgeMap[key] = edgeMap[key] || [];\n  edgeMap[key].push(index);\n}\n/**\n * get curvature for edge\n * @param edge\n * @param {module:echarts/model/SeriesModel} seriesModel\n * @param index\n */\nexport function getCurvenessForEdge(edge, seriesModel, index, needReverse) {\n  var autoCurvenessParams = getAutoCurvenessParams(seriesModel);\n  var isArrayParam = zrUtil.isArray(autoCurvenessParams);\n  if (!autoCurvenessParams) {\n    return null;\n  }\n  var edgeArray = getEdgeFromMap(edge, seriesModel);\n  if (!edgeArray) {\n    return null;\n  }\n  var edgeIndex = -1;\n  for (var i = 0; i < edgeArray.length; i++) {\n    if (edgeArray[i] === index) {\n      edgeIndex = i;\n      break;\n    }\n  }\n  // if totalLen is Longer createCurveness\n  var totalLen = getTotalLengthBetweenNodes(edge, seriesModel);\n  createCurveness(seriesModel, totalLen);\n  edge.lineStyle = edge.lineStyle || {};\n  // if is opposite edge, must set curvenss to opposite number\n  var curKey = getKeyOfEdges(edge.node1, edge.node2, seriesModel);\n  var curvenessList = seriesModel.__curvenessList;\n  // if pass array no need parity\n  var parityCorrection = isArrayParam ? 0 : totalLen % 2 ? 0 : 1;\n  if (!edgeArray.isForward) {\n    // the opposite edge show outside\n    var oppositeKey = getOppositeKey(curKey);\n    var len = getEdgeMapLengthWithKey(oppositeKey, seriesModel);\n    var resValue = curvenessList[edgeIndex + len + parityCorrection];\n    // isNeedReverse, simple, force type need reverse the curveness in the junction of the forword and the opposite\n    if (needReverse) {\n      // set as array may make the parity handle with the len of opposite\n      if (isArrayParam) {\n        if (autoCurvenessParams && autoCurvenessParams[0] === 0) {\n          return (len + parityCorrection) % 2 ? resValue : -resValue;\n        } else {\n          return ((len % 2 ? 0 : 1) + parityCorrection) % 2 ? resValue : -resValue;\n        }\n      } else {\n        return (len + parityCorrection) % 2 ? resValue : -resValue;\n      }\n    } else {\n      return curvenessList[edgeIndex + len + parityCorrection];\n    }\n  } else {\n    return curvenessList[parityCorrection + edgeIndex];\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { getCurvenessForEdge } from '../helper/multipleGraphEdgeHelper.js';\nexport function simpleLayout(seriesModel) {\n  var coordSys = seriesModel.coordinateSystem;\n  if (coordSys && coordSys.type !== 'view') {\n    return;\n  }\n  var graph = seriesModel.getGraph();\n  graph.eachNode(function (node) {\n    var model = node.getModel();\n    node.setLayout([+model.get('x'), +model.get('y')]);\n  });\n  simpleLayoutEdge(graph, seriesModel);\n}\nexport function simpleLayoutEdge(graph, seriesModel) {\n  graph.eachEdge(function (edge, index) {\n    var curveness = zrUtil.retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, seriesModel, index, true), 0);\n    var p1 = vec2.clone(edge.node1.getLayout());\n    var p2 = vec2.clone(edge.node2.getLayout());\n    var points = [p1, p2];\n    if (+curveness) {\n      points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]);\n    }\n    edge.setLayout(points);\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each } from 'zrender/lib/core/util.js';\nimport { simpleLayout, simpleLayoutEdge } from './simpleLayoutHelper.js';\nexport default function graphSimpleLayout(ecModel, api) {\n  ecModel.eachSeriesByType('graph', function (seriesModel) {\n    var layout = seriesModel.get('layout');\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && coordSys.type !== 'view') {\n      var data_1 = seriesModel.getData();\n      var dimensions_1 = [];\n      each(coordSys.dimensions, function (coordDim) {\n        dimensions_1 = dimensions_1.concat(data_1.mapDimensionsAll(coordDim));\n      });\n      for (var dataIndex = 0; dataIndex < data_1.count(); dataIndex++) {\n        var value = [];\n        var hasValue = false;\n        for (var i = 0; i < dimensions_1.length; i++) {\n          var val = data_1.get(dimensions_1[i], dataIndex);\n          if (!isNaN(val)) {\n            hasValue = true;\n          }\n          value.push(val);\n        }\n        if (hasValue) {\n          data_1.setItemLayout(dataIndex, coordSys.dataToPoint(value));\n        } else {\n          // Also {Array.<number>}, not undefined to avoid if...else... statement\n          data_1.setItemLayout(dataIndex, [NaN, NaN]);\n        }\n      }\n      simpleLayoutEdge(data_1.graph, seriesModel);\n    } else if (!layout || layout === 'none') {\n      simpleLayout(seriesModel);\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport function getNodeGlobalScale(seriesModel) {\n  var coordSys = seriesModel.coordinateSystem;\n  if (coordSys.type !== 'view') {\n    return 1;\n  }\n  var nodeScaleRatio = seriesModel.option.nodeScaleRatio;\n  var groupZoom = coordSys.scaleX;\n  // Scale node when zoom changes\n  var roamZoom = coordSys.getZoom();\n  var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;\n  return nodeScale / groupZoom;\n}\nexport function getSymbolSize(node) {\n  var symbolSize = node.getVisual('symbolSize');\n  if (symbolSize instanceof Array) {\n    symbolSize = (symbolSize[0] + symbolSize[1]) / 2;\n  }\n  return +symbolSize;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport { getSymbolSize, getNodeGlobalScale } from './graphHelper.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { getCurvenessForEdge } from '../helper/multipleGraphEdgeHelper.js';\nvar PI = Math.PI;\nvar _symbolRadiansHalf = [];\n/**\n * `basedOn` can be:\n * 'value':\n *     This layout is not accurate and have same bad case. For example,\n *     if the min value is very smaller than the max value, the nodes\n *     with the min value probably overlap even though there is enough\n *     space to layout them. So we only use this approach in the as the\n *     init layout of the force layout.\n *     FIXME\n *     Probably we do not need this method any more but use\n *     `basedOn: 'symbolSize'` in force layout if\n *     delay its init operations to GraphView.\n * 'symbolSize':\n *     This approach work only if all of the symbol size calculated.\n *     That is, the progressive rendering is not applied to graph.\n *     FIXME\n *     If progressive rendering is applied to graph some day,\n *     probably we have to use `basedOn: 'value'`.\n */\nexport function circularLayout(seriesModel, basedOn, draggingNode, pointer) {\n  var coordSys = seriesModel.coordinateSystem;\n  if (coordSys && coordSys.type !== 'view') {\n    return;\n  }\n  var rect = coordSys.getBoundingRect();\n  var nodeData = seriesModel.getData();\n  var graph = nodeData.graph;\n  var cx = rect.width / 2 + rect.x;\n  var cy = rect.height / 2 + rect.y;\n  var r = Math.min(rect.width, rect.height) / 2;\n  var count = nodeData.count();\n  nodeData.setLayout({\n    cx: cx,\n    cy: cy\n  });\n  if (!count) {\n    return;\n  }\n  if (draggingNode) {\n    var _a = coordSys.pointToData(pointer),\n      tempX = _a[0],\n      tempY = _a[1];\n    var v = [tempX - cx, tempY - cy];\n    vec2.normalize(v, v);\n    vec2.scale(v, v, r);\n    draggingNode.setLayout([cx + v[0], cy + v[1]], true);\n    var circularRotateLabel = seriesModel.get(['circular', 'rotateLabel']);\n    rotateNodeLabel(draggingNode, circularRotateLabel, cx, cy);\n  }\n  _layoutNodesBasedOn[basedOn](seriesModel, graph, nodeData, r, cx, cy, count);\n  graph.eachEdge(function (edge, index) {\n    var curveness = zrUtil.retrieve3(edge.getModel().get(['lineStyle', 'curveness']), getCurvenessForEdge(edge, seriesModel, index), 0);\n    var p1 = vec2.clone(edge.node1.getLayout());\n    var p2 = vec2.clone(edge.node2.getLayout());\n    var cp1;\n    var x12 = (p1[0] + p2[0]) / 2;\n    var y12 = (p1[1] + p2[1]) / 2;\n    if (+curveness) {\n      curveness *= 3;\n      cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)];\n    }\n    edge.setLayout([p1, p2, cp1]);\n  });\n}\nvar _layoutNodesBasedOn = {\n  value: function (seriesModel, graph, nodeData, r, cx, cy, count) {\n    var angle = 0;\n    var sum = nodeData.getSum('value');\n    var unitAngle = Math.PI * 2 / (sum || count);\n    graph.eachNode(function (node) {\n      var value = node.getValue('value');\n      var radianHalf = unitAngle * (sum ? value : 1) / 2;\n      angle += radianHalf;\n      node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]);\n      angle += radianHalf;\n    });\n  },\n  symbolSize: function (seriesModel, graph, nodeData, r, cx, cy, count) {\n    var sumRadian = 0;\n    _symbolRadiansHalf.length = count;\n    var nodeScale = getNodeGlobalScale(seriesModel);\n    graph.eachNode(function (node) {\n      var symbolSize = getSymbolSize(node);\n      // Normally this case will not happen, but we still add\n      // some the defensive code (2px is an arbitrary value).\n      isNaN(symbolSize) && (symbolSize = 2);\n      symbolSize < 0 && (symbolSize = 0);\n      symbolSize *= nodeScale;\n      var symbolRadianHalf = Math.asin(symbolSize / 2 / r);\n      // when `symbolSize / 2` is bigger than `r`.\n      isNaN(symbolRadianHalf) && (symbolRadianHalf = PI / 2);\n      _symbolRadiansHalf[node.dataIndex] = symbolRadianHalf;\n      sumRadian += symbolRadianHalf * 2;\n    });\n    var halfRemainRadian = (2 * PI - sumRadian) / count / 2;\n    var angle = 0;\n    graph.eachNode(function (node) {\n      var radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex];\n      angle += radianHalf;\n      // init circular layout for\n      // 1. layout undefined node\n      // 2. not fixed node\n      (!node.getLayout() || !node.getLayout().fixed) && node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]);\n      angle += radianHalf;\n    });\n  }\n};\nexport function rotateNodeLabel(node, circularRotateLabel, cx, cy) {\n  var el = node.getGraphicEl();\n  // need to check if el exists. '-' value may not create node element.\n  if (!el) {\n    return;\n  }\n  var nodeModel = node.getModel();\n  var labelRotate = nodeModel.get(['label', 'rotate']) || 0;\n  var symbolPath = el.getSymbolPath();\n  if (circularRotateLabel) {\n    var pos = node.getLayout();\n    var rad = Math.atan2(pos[1] - cy, pos[0] - cx);\n    if (rad < 0) {\n      rad = Math.PI * 2 + rad;\n    }\n    var isLeft = pos[0] < cx;\n    if (isLeft) {\n      rad = rad - Math.PI;\n    }\n    var textPosition = isLeft ? 'left' : 'right';\n    symbolPath.setTextConfig({\n      rotation: -rad,\n      position: textPosition,\n      origin: 'center'\n    });\n    var emphasisState = symbolPath.ensureState('emphasis');\n    zrUtil.extend(emphasisState.textConfig || (emphasisState.textConfig = {}), {\n      position: textPosition\n    });\n  } else {\n    symbolPath.setTextConfig({\n      rotation: labelRotate *= Math.PI / 180\n    });\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { circularLayout } from './circularLayoutHelper.js';\nexport default function graphCircularLayout(ecModel) {\n  ecModel.eachSeriesByType('graph', function (seriesModel) {\n    if (seriesModel.get('layout') === 'circular') {\n      circularLayout(seriesModel, 'symbolSize');\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/*\n* A third-party license is embedded for some of the code in this file:\n* Some formulas were originally copied from \"d3.js\" with some\n* modifications made for this project.\n* (See more details in the comment of the method \"step\" below.)\n* The use of the source code of this file is also subject to the terms\n* and consitions of the license of \"d3.js\" (BSD-3Clause, see\n* </licenses/LICENSE-d3>).\n*/\nimport * as vec2 from 'zrender/lib/core/vector.js';\nvar scaleAndAdd = vec2.scaleAndAdd;\n// function adjacentNode(n, e) {\n//     return e.n1 === n ? e.n2 : e.n1;\n// }\nexport function forceLayout(inNodes, inEdges, opts) {\n  var nodes = inNodes;\n  var edges = inEdges;\n  var rect = opts.rect;\n  var width = rect.width;\n  var height = rect.height;\n  var center = [rect.x + width / 2, rect.y + height / 2];\n  // let scale = opts.scale || 1;\n  var gravity = opts.gravity == null ? 0.1 : opts.gravity;\n  // for (let i = 0; i < edges.length; i++) {\n  //     let e = edges[i];\n  //     let n1 = e.n1;\n  //     let n2 = e.n2;\n  //     n1.edges = n1.edges || [];\n  //     n2.edges = n2.edges || [];\n  //     n1.edges.push(e);\n  //     n2.edges.push(e);\n  // }\n  // Init position\n  for (var i = 0; i < nodes.length; i++) {\n    var n = nodes[i];\n    if (!n.p) {\n      n.p = vec2.create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]);\n    }\n    n.pp = vec2.clone(n.p);\n    n.edges = null;\n  }\n  // Formula in 'Graph Drawing by Force-directed Placement'\n  // let k = scale * Math.sqrt(width * height / nodes.length);\n  // let k2 = k * k;\n  var initialFriction = opts.friction == null ? 0.6 : opts.friction;\n  var friction = initialFriction;\n  var beforeStepCallback;\n  var afterStepCallback;\n  return {\n    warmUp: function () {\n      friction = initialFriction * 0.8;\n    },\n    setFixed: function (idx) {\n      nodes[idx].fixed = true;\n    },\n    setUnfixed: function (idx) {\n      nodes[idx].fixed = false;\n    },\n    /**\n     * Before step hook\n     */\n    beforeStep: function (cb) {\n      beforeStepCallback = cb;\n    },\n    /**\n     * After step hook\n     */\n    afterStep: function (cb) {\n      afterStepCallback = cb;\n    },\n    /**\n     * Some formulas were originally copied from \"d3.js\"\n     * https://github.com/d3/d3/blob/b516d77fb8566b576088e73410437494717ada26/src/layout/force.js\n     * with some modifications made for this project.\n     * See the license statement at the head of this file.\n     */\n    step: function (cb) {\n      beforeStepCallback && beforeStepCallback(nodes, edges);\n      var v12 = [];\n      var nLen = nodes.length;\n      for (var i = 0; i < edges.length; i++) {\n        var e = edges[i];\n        if (e.ignoreForceLayout) {\n          continue;\n        }\n        var n1 = e.n1;\n        var n2 = e.n2;\n        vec2.sub(v12, n2.p, n1.p);\n        var d = vec2.len(v12) - e.d;\n        var w = n2.w / (n1.w + n2.w);\n        if (isNaN(w)) {\n          w = 0;\n        }\n        vec2.normalize(v12, v12);\n        !n1.fixed && scaleAndAdd(n1.p, n1.p, v12, w * d * friction);\n        !n2.fixed && scaleAndAdd(n2.p, n2.p, v12, -(1 - w) * d * friction);\n      }\n      // Gravity\n      for (var i = 0; i < nLen; i++) {\n        var n = nodes[i];\n        if (!n.fixed) {\n          vec2.sub(v12, center, n.p);\n          // let d = vec2.len(v12);\n          // vec2.scale(v12, v12, 1 / d);\n          // let gravityFactor = gravity;\n          scaleAndAdd(n.p, n.p, v12, gravity * friction);\n        }\n      }\n      // Repulsive\n      // PENDING\n      for (var i = 0; i < nLen; i++) {\n        var n1 = nodes[i];\n        for (var j = i + 1; j < nLen; j++) {\n          var n2 = nodes[j];\n          vec2.sub(v12, n2.p, n1.p);\n          var d = vec2.len(v12);\n          if (d === 0) {\n            // Random repulse\n            vec2.set(v12, Math.random() - 0.5, Math.random() - 0.5);\n            d = 1;\n          }\n          var repFact = (n1.rep + n2.rep) / d / d;\n          !n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact);\n          !n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact);\n        }\n      }\n      var v = [];\n      for (var i = 0; i < nLen; i++) {\n        var n = nodes[i];\n        if (!n.fixed) {\n          vec2.sub(v, n.p, n.pp);\n          scaleAndAdd(n.p, n.p, v, friction);\n          vec2.copy(n.pp, n.p);\n        }\n      }\n      friction = friction * 0.992;\n      var finished = friction < 0.01;\n      afterStepCallback && afterStepCallback(nodes, edges, finished);\n      cb && cb(finished);\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { forceLayout } from './forceHelper.js';\nimport { simpleLayout } from './simpleLayoutHelper.js';\nimport { circularLayout } from './circularLayoutHelper.js';\nimport { linearMap } from '../../util/number.js';\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { getCurvenessForEdge } from '../helper/multipleGraphEdgeHelper.js';\nexport default function graphForceLayout(ecModel) {\n  ecModel.eachSeriesByType('graph', function (graphSeries) {\n    var coordSys = graphSeries.coordinateSystem;\n    if (coordSys && coordSys.type !== 'view') {\n      return;\n    }\n    if (graphSeries.get('layout') === 'force') {\n      var preservedPoints_1 = graphSeries.preservedPoints || {};\n      var graph_1 = graphSeries.getGraph();\n      var nodeData_1 = graph_1.data;\n      var edgeData = graph_1.edgeData;\n      var forceModel = graphSeries.getModel('force');\n      var initLayout = forceModel.get('initLayout');\n      if (graphSeries.preservedPoints) {\n        nodeData_1.each(function (idx) {\n          var id = nodeData_1.getId(idx);\n          nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]);\n        });\n      } else if (!initLayout || initLayout === 'none') {\n        simpleLayout(graphSeries);\n      } else if (initLayout === 'circular') {\n        circularLayout(graphSeries, 'value');\n      }\n      var nodeDataExtent_1 = nodeData_1.getDataExtent('value');\n      var edgeDataExtent_1 = edgeData.getDataExtent('value');\n      // let edgeDataExtent = edgeData.getDataExtent('value');\n      var repulsion = forceModel.get('repulsion');\n      var edgeLength = forceModel.get('edgeLength');\n      var repulsionArr_1 = zrUtil.isArray(repulsion) ? repulsion : [repulsion, repulsion];\n      var edgeLengthArr_1 = zrUtil.isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength];\n      // Larger value has smaller length\n      edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]];\n      var nodes_1 = nodeData_1.mapArray('value', function (value, idx) {\n        var point = nodeData_1.getItemLayout(idx);\n        var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1);\n        if (isNaN(rep)) {\n          rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2;\n        }\n        return {\n          w: rep,\n          rep: rep,\n          fixed: nodeData_1.getItemModel(idx).get('fixed'),\n          p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point\n        };\n      });\n      var edges = edgeData.mapArray('value', function (value, idx) {\n        var edge = graph_1.getEdgeByIndex(idx);\n        var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1);\n        if (isNaN(d)) {\n          d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2;\n        }\n        var edgeModel = edge.getModel();\n        var curveness = zrUtil.retrieve3(edge.getModel().get(['lineStyle', 'curveness']), -getCurvenessForEdge(edge, graphSeries, idx, true), 0);\n        return {\n          n1: nodes_1[edge.node1.dataIndex],\n          n2: nodes_1[edge.node2.dataIndex],\n          d: d,\n          curveness: curveness,\n          ignoreForceLayout: edgeModel.get('ignoreForceLayout')\n        };\n      });\n      // let coordSys = graphSeries.coordinateSystem;\n      var rect = coordSys.getBoundingRect();\n      var forceInstance = forceLayout(nodes_1, edges, {\n        rect: rect,\n        gravity: forceModel.get('gravity'),\n        friction: forceModel.get('friction')\n      });\n      forceInstance.beforeStep(function (nodes, edges) {\n        for (var i = 0, l = nodes.length; i < l; i++) {\n          if (nodes[i].fixed) {\n            // Write back to layout instance\n            vec2.copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout());\n          }\n        }\n      });\n      forceInstance.afterStep(function (nodes, edges, stopped) {\n        for (var i = 0, l = nodes.length; i < l; i++) {\n          if (!nodes[i].fixed) {\n            graph_1.getNodeByIndex(i).setLayout(nodes[i].p);\n          }\n          preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p;\n        }\n        for (var i = 0, l = edges.length; i < l; i++) {\n          var e = edges[i];\n          var edge = graph_1.getEdgeByIndex(i);\n          var p1 = e.n1.p;\n          var p2 = e.n2.p;\n          var points = edge.getLayout();\n          points = points ? points.slice() : [];\n          points[0] = points[0] || [];\n          points[1] = points[1] || [];\n          vec2.copy(points[0], p1);\n          vec2.copy(points[1], p2);\n          if (+e.curveness) {\n            points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness];\n          }\n          edge.setLayout(points);\n        }\n      });\n      graphSeries.forceLayout = forceInstance;\n      graphSeries.preservedPoints = preservedPoints_1;\n      // Step to get the layout\n      forceInstance.step();\n    } else {\n      // Remove prev injected forceLayout instance\n      graphSeries.forceLayout = null;\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// FIXME Where to create the simple view coordinate system\nimport View from '../../coord/View.js';\nimport { createBoxLayoutReference, getLayoutRect, applyPreserveAspect } from '../../util/layout.js';\nimport * as bbox from 'zrender/lib/core/bbox.js';\nimport { extend } from 'zrender/lib/core/util.js';\nimport { injectCoordSysByOption } from '../../core/CoordinateSystem.js';\nfunction getViewRect(seriesModel, api, aspect) {\n  var layoutRef = createBoxLayoutReference(seriesModel, api);\n  var option = extend(seriesModel.getBoxLayoutParams(), {\n    aspect: aspect\n  });\n  var viewRect = getLayoutRect(option, layoutRef.refContainer);\n  return applyPreserveAspect(seriesModel, viewRect, aspect);\n}\nexport default function createViewCoordSys(ecModel, api) {\n  var viewList = [];\n  ecModel.eachSeriesByType('graph', function (seriesModel) {\n    injectCoordSysByOption({\n      targetModel: seriesModel,\n      coordSysType: 'view',\n      coordSysProvider: createViewCoordSys,\n      isDefaultDataCoordSys: true\n    });\n    function createViewCoordSys() {\n      var data = seriesModel.getData();\n      var positions = data.mapArray(function (idx) {\n        var itemModel = data.getItemModel(idx);\n        return [+itemModel.get('x'), +itemModel.get('y')];\n      });\n      var min = [];\n      var max = [];\n      bbox.fromPoints(positions, min, max);\n      // If width or height is 0\n      if (max[0] - min[0] === 0) {\n        max[0] += 1;\n        min[0] -= 1;\n      }\n      if (max[1] - min[1] === 0) {\n        max[1] += 1;\n        min[1] -= 1;\n      }\n      var aspect = (max[0] - min[0]) / (max[1] - min[1]);\n      // FIXME If get view rect after data processed?\n      var viewRect = getViewRect(seriesModel, api, aspect);\n      // Position may be NaN, use view rect instead\n      if (isNaN(aspect)) {\n        min = [viewRect.x, viewRect.y];\n        max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height];\n      }\n      var bbWidth = max[0] - min[0];\n      var bbHeight = max[1] - min[1];\n      var viewCoordSys = new View(null, {\n        api: api,\n        ecModel: ecModel\n      });\n      viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n      viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight);\n      viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);\n      // Update roam info\n      viewCoordSys.setCenter(seriesModel.get('center'));\n      viewCoordSys.setZoom(seriesModel.get('zoom'));\n      viewList.push(viewCoordSys);\n      return viewCoordSys;\n    }\n  });\n  return viewList;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * Line path for bezier and straight line draw\n */\nimport * as graphic from '../../util/graphic.js';\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport tokens from '../../visual/tokens.js';\nvar straightLineProto = graphic.Line.prototype;\nvar bezierCurveProto = graphic.BezierCurve.prototype;\nvar StraightLineShape = /** @class */function () {\n  function StraightLineShape() {\n    // Start point\n    this.x1 = 0;\n    this.y1 = 0;\n    // End point\n    this.x2 = 0;\n    this.y2 = 0;\n    this.percent = 1;\n  }\n  return StraightLineShape;\n}();\nvar CurveShape = /** @class */function (_super) {\n  __extends(CurveShape, _super);\n  function CurveShape() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  return CurveShape;\n}(StraightLineShape);\nfunction isStraightLine(shape) {\n  return isNaN(+shape.cpx1) || isNaN(+shape.cpy1);\n}\nvar ECLinePath = /** @class */function (_super) {\n  __extends(ECLinePath, _super);\n  function ECLinePath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'ec-line';\n    return _this;\n  }\n  ECLinePath.prototype.getDefaultStyle = function () {\n    return {\n      stroke: tokens.color.neutral99,\n      fill: null\n    };\n  };\n  ECLinePath.prototype.getDefaultShape = function () {\n    return new StraightLineShape();\n  };\n  ECLinePath.prototype.buildPath = function (ctx, shape) {\n    if (isStraightLine(shape)) {\n      straightLineProto.buildPath.call(this, ctx, shape);\n    } else {\n      bezierCurveProto.buildPath.call(this, ctx, shape);\n    }\n  };\n  ECLinePath.prototype.pointAt = function (t) {\n    if (isStraightLine(this.shape)) {\n      return straightLineProto.pointAt.call(this, t);\n    } else {\n      return bezierCurveProto.pointAt.call(this, t);\n    }\n  };\n  ECLinePath.prototype.tangentAt = function (t) {\n    var shape = this.shape;\n    var p = isStraightLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t);\n    return vec2.normalize(p, p);\n  };\n  return ECLinePath;\n}(graphic.Path);\nexport default ECLinePath;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { isArray, each, retrieve2 } from 'zrender/lib/core/util.js';\nimport * as vector from 'zrender/lib/core/vector.js';\nimport * as symbolUtil from '../../util/symbol.js';\nimport ECLinePath from './LinePath.js';\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis, enterEmphasis, leaveEmphasis, SPECIAL_STATES } from '../../util/states.js';\nimport { getLabelStatesModels, setLabelStyle } from '../../label/labelStyle.js';\nimport { round } from '../../util/number.js';\nimport tokens from '../../visual/tokens.js';\nvar SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol'];\nfunction makeSymbolTypeKey(symbolCategory) {\n  return '_' + symbolCategory + 'Type';\n}\nfunction makeSymbolTypeValue(name, lineData, idx) {\n  var symbolType = lineData.getItemVisual(idx, name);\n  if (!symbolType || symbolType === 'none') {\n    return symbolType;\n  }\n  var symbolSize = lineData.getItemVisual(idx, name + 'Size');\n  var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate');\n  var symbolOffset = lineData.getItemVisual(idx, name + 'Offset');\n  var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect');\n  var symbolSizeArr = symbolUtil.normalizeSymbolSize(symbolSize);\n  var symbolOffsetArr = symbolUtil.normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr);\n  return symbolType + symbolSizeArr + symbolOffsetArr + (symbolRotate || '') + (symbolKeepAspect || '');\n}\n/**\n * @inner\n */\nfunction createSymbol(name, lineData, idx) {\n  var symbolType = lineData.getItemVisual(idx, name);\n  if (!symbolType || symbolType === 'none') {\n    return;\n  }\n  var symbolSize = lineData.getItemVisual(idx, name + 'Size');\n  var symbolRotate = lineData.getItemVisual(idx, name + 'Rotate');\n  var symbolOffset = lineData.getItemVisual(idx, name + 'Offset');\n  var symbolKeepAspect = lineData.getItemVisual(idx, name + 'KeepAspect');\n  var symbolSizeArr = symbolUtil.normalizeSymbolSize(symbolSize);\n  var symbolOffsetArr = symbolUtil.normalizeSymbolOffset(symbolOffset || 0, symbolSizeArr);\n  var symbolPath = symbolUtil.createSymbol(symbolType, -symbolSizeArr[0] / 2 + symbolOffsetArr[0], -symbolSizeArr[1] / 2 + symbolOffsetArr[1], symbolSizeArr[0], symbolSizeArr[1], null, symbolKeepAspect);\n  symbolPath.__specifiedRotation = symbolRotate == null || isNaN(symbolRotate) ? void 0 : +symbolRotate * Math.PI / 180 || 0;\n  symbolPath.name = name;\n  return symbolPath;\n}\nfunction createLine(points) {\n  var line = new ECLinePath({\n    name: 'line',\n    subPixelOptimize: true\n  });\n  setLinePoints(line.shape, points);\n  return line;\n}\nfunction setLinePoints(targetShape, points) {\n  targetShape.x1 = points[0][0];\n  targetShape.y1 = points[0][1];\n  targetShape.x2 = points[1][0];\n  targetShape.y2 = points[1][1];\n  targetShape.percent = 1;\n  var cp1 = points[2];\n  if (cp1) {\n    targetShape.cpx1 = cp1[0];\n    targetShape.cpy1 = cp1[1];\n  } else {\n    targetShape.cpx1 = NaN;\n    targetShape.cpy1 = NaN;\n  }\n}\nvar Line = /** @class */function (_super) {\n  __extends(Line, _super);\n  function Line(lineData, idx, seriesScope) {\n    var _this = _super.call(this) || this;\n    _this._createLine(lineData, idx, seriesScope);\n    return _this;\n  }\n  Line.prototype._createLine = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n    var linePoints = lineData.getItemLayout(idx);\n    var z2 = lineData.getItemVisual(idx, 'z2');\n    var line = createLine(linePoints);\n    line.shape.percent = 0;\n    graphic.initProps(line, {\n      z2: retrieve2(z2, 0),\n      shape: {\n        percent: 1\n      }\n    }, seriesModel, idx);\n    this.add(line);\n    each(SYMBOL_CATEGORIES, function (symbolCategory) {\n      var symbol = createSymbol(symbolCategory, lineData, idx);\n      // symbols must added after line to make sure\n      // it will be updated after line#update.\n      // Or symbol position and rotation update in line#beforeUpdate will be one frame slow\n      this.add(symbol);\n      this[makeSymbolTypeKey(symbolCategory)] = makeSymbolTypeValue(symbolCategory, lineData, idx);\n    }, this);\n    this._updateCommonStl(lineData, idx, seriesScope);\n  };\n  // TODO More strict on the List type in parameters?\n  Line.prototype.updateData = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n    var line = this.childOfName('line');\n    var linePoints = lineData.getItemLayout(idx);\n    var target = {\n      shape: {}\n    };\n    setLinePoints(target.shape, linePoints);\n    graphic.updateProps(line, target, seriesModel, idx);\n    each(SYMBOL_CATEGORIES, function (symbolCategory) {\n      var symbolType = makeSymbolTypeValue(symbolCategory, lineData, idx);\n      var key = makeSymbolTypeKey(symbolCategory);\n      // Symbol changed\n      if (this[key] !== symbolType) {\n        this.remove(this.childOfName(symbolCategory));\n        var symbol = createSymbol(symbolCategory, lineData, idx);\n        this.add(symbol);\n      }\n      this[key] = symbolType;\n    }, this);\n    this._updateCommonStl(lineData, idx, seriesScope);\n  };\n  ;\n  Line.prototype.getLinePath = function () {\n    return this.childAt(0);\n  };\n  Line.prototype._updateCommonStl = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n    var line = this.childOfName('line');\n    var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle;\n    var blurLineStyle = seriesScope && seriesScope.blurLineStyle;\n    var selectLineStyle = seriesScope && seriesScope.selectLineStyle;\n    var labelStatesModels = seriesScope && seriesScope.labelStatesModels;\n    var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled;\n    var focus = seriesScope && seriesScope.focus;\n    var blurScope = seriesScope && seriesScope.blurScope;\n    // Optimization for large dataset\n    if (!seriesScope || lineData.hasItemOption) {\n      var itemModel = lineData.getItemModel(idx);\n      var emphasisModel = itemModel.getModel('emphasis');\n      emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle();\n      blurLineStyle = itemModel.getModel(['blur', 'lineStyle']).getLineStyle();\n      selectLineStyle = itemModel.getModel(['select', 'lineStyle']).getLineStyle();\n      emphasisDisabled = emphasisModel.get('disabled');\n      focus = emphasisModel.get('focus');\n      blurScope = emphasisModel.get('blurScope');\n      labelStatesModels = getLabelStatesModels(itemModel);\n    }\n    var lineStyle = lineData.getItemVisual(idx, 'style');\n    var visualColor = lineStyle.stroke;\n    line.useStyle(lineStyle);\n    line.style.fill = null;\n    line.style.strokeNoScale = true;\n    line.ensureState('emphasis').style = emphasisLineStyle;\n    line.ensureState('blur').style = blurLineStyle;\n    line.ensureState('select').style = selectLineStyle;\n    // Update symbol\n    each(SYMBOL_CATEGORIES, function (symbolCategory) {\n      var symbol = this.childOfName(symbolCategory);\n      if (symbol) {\n        // Share opacity and color with line.\n        symbol.setColor(visualColor);\n        symbol.style.opacity = lineStyle.opacity;\n        for (var i = 0; i < SPECIAL_STATES.length; i++) {\n          var stateName = SPECIAL_STATES[i];\n          var lineState = line.getState(stateName);\n          if (lineState) {\n            var lineStateStyle = lineState.style || {};\n            var state = symbol.ensureState(stateName);\n            var stateStyle = state.style || (state.style = {});\n            if (lineStateStyle.stroke != null) {\n              stateStyle[symbol.__isEmptyBrush ? 'stroke' : 'fill'] = lineStateStyle.stroke;\n            }\n            if (lineStateStyle.opacity != null) {\n              stateStyle.opacity = lineStateStyle.opacity;\n            }\n          }\n        }\n        symbol.markRedraw();\n      }\n    }, this);\n    var rawVal = seriesModel.getRawValue(idx);\n    setLabelStyle(this, labelStatesModels, {\n      labelDataIndex: idx,\n      labelFetcher: {\n        getFormattedLabel: function (dataIndex, stateName) {\n          return seriesModel.getFormattedLabel(dataIndex, stateName, lineData.dataType);\n        }\n      },\n      inheritColor: visualColor || tokens.color.neutral99,\n      defaultOpacity: lineStyle.opacity,\n      defaultText: (rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round(rawVal) : rawVal) + ''\n    });\n    var label = this.getTextContent();\n    // Always set `textStyle` even if `normalStyle.text` is null, because default\n    // values have to be set on `normalStyle`.\n    if (label) {\n      var labelNormalModel = labelStatesModels.normal;\n      label.__align = label.style.align;\n      label.__verticalAlign = label.style.verticalAlign;\n      // 'start', 'middle', 'end'\n      label.__position = labelNormalModel.get('position') || 'middle';\n      var distance = labelNormalModel.get('distance');\n      if (!isArray(distance)) {\n        distance = [distance, distance];\n      }\n      label.__labelDistance = distance;\n    }\n    this.setTextConfig({\n      position: null,\n      local: true,\n      inside: false // Can't be inside for stroke element.\n    });\n    toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled);\n  };\n  Line.prototype.highlight = function () {\n    enterEmphasis(this);\n  };\n  Line.prototype.downplay = function () {\n    leaveEmphasis(this);\n  };\n  Line.prototype.updateLayout = function (lineData, idx) {\n    this.setLinePoints(lineData.getItemLayout(idx));\n  };\n  Line.prototype.setLinePoints = function (points) {\n    var linePath = this.childOfName('line');\n    setLinePoints(linePath.shape, points);\n    linePath.dirty();\n  };\n  Line.prototype.beforeUpdate = function () {\n    var lineGroup = this;\n    var symbolFrom = lineGroup.childOfName('fromSymbol');\n    var symbolTo = lineGroup.childOfName('toSymbol');\n    var label = lineGroup.getTextContent();\n    // Quick reject\n    if (!symbolFrom && !symbolTo && (!label || label.ignore)) {\n      return;\n    }\n    var invScale = 1;\n    var parentNode = this.parent;\n    while (parentNode) {\n      if (parentNode.scaleX) {\n        invScale /= parentNode.scaleX;\n      }\n      parentNode = parentNode.parent;\n    }\n    var line = lineGroup.childOfName('line');\n    // If line not changed\n    // FIXME Parent scale changed\n    if (!this.__dirty && !line.__dirty) {\n      return;\n    }\n    var percent = line.shape.percent;\n    var fromPos = line.pointAt(0);\n    var toPos = line.pointAt(percent);\n    var d = vector.sub([], toPos, fromPos);\n    vector.normalize(d, d);\n    function setSymbolRotation(symbol, percent) {\n      // Fix #12388\n      // when symbol is set to be 'arrow' in markLine,\n      // symbolRotate value will be ignored, and compulsively use tangent angle.\n      // rotate by default if symbol rotation is not specified\n      var specifiedRotation = symbol.__specifiedRotation;\n      if (specifiedRotation == null) {\n        var tangent = line.tangentAt(percent);\n        symbol.attr('rotation', (percent === 1 ? -1 : 1) * Math.PI / 2 - Math.atan2(tangent[1], tangent[0]));\n      } else {\n        symbol.attr('rotation', specifiedRotation);\n      }\n    }\n    if (symbolFrom) {\n      symbolFrom.setPosition(fromPos);\n      setSymbolRotation(symbolFrom, 0);\n      symbolFrom.scaleX = symbolFrom.scaleY = invScale * percent;\n      symbolFrom.markRedraw();\n    }\n    if (symbolTo) {\n      symbolTo.setPosition(toPos);\n      setSymbolRotation(symbolTo, 1);\n      symbolTo.scaleX = symbolTo.scaleY = invScale * percent;\n      symbolTo.markRedraw();\n    }\n    if (label && !label.ignore) {\n      label.x = label.y = 0;\n      label.originX = label.originY = 0;\n      var textAlign = void 0;\n      var textVerticalAlign = void 0;\n      var distance = label.__labelDistance;\n      var distanceX = distance[0] * invScale;\n      var distanceY = distance[1] * invScale;\n      var halfPercent = percent / 2;\n      var tangent = line.tangentAt(halfPercent);\n      var n = [tangent[1], -tangent[0]];\n      var cp = line.pointAt(halfPercent);\n      if (n[1] > 0) {\n        n[0] = -n[0];\n        n[1] = -n[1];\n      }\n      var dir = tangent[0] < 0 ? -1 : 1;\n      if (label.__position !== 'start' && label.__position !== 'end') {\n        var rotation = -Math.atan2(tangent[1], tangent[0]);\n        if (toPos[0] < fromPos[0]) {\n          rotation = Math.PI + rotation;\n        }\n        label.rotation = rotation;\n      }\n      var dy = void 0;\n      switch (label.__position) {\n        case 'insideStartTop':\n        case 'insideMiddleTop':\n        case 'insideEndTop':\n        case 'middle':\n          dy = -distanceY;\n          textVerticalAlign = 'bottom';\n          break;\n        case 'insideStartBottom':\n        case 'insideMiddleBottom':\n        case 'insideEndBottom':\n          dy = distanceY;\n          textVerticalAlign = 'top';\n          break;\n        default:\n          dy = 0;\n          textVerticalAlign = 'middle';\n      }\n      switch (label.__position) {\n        case 'end':\n          label.x = d[0] * distanceX + toPos[0];\n          label.y = d[1] * distanceY + toPos[1];\n          textAlign = d[0] > 0.8 ? 'left' : d[0] < -0.8 ? 'right' : 'center';\n          textVerticalAlign = d[1] > 0.8 ? 'top' : d[1] < -0.8 ? 'bottom' : 'middle';\n          break;\n        case 'start':\n          label.x = -d[0] * distanceX + fromPos[0];\n          label.y = -d[1] * distanceY + fromPos[1];\n          textAlign = d[0] > 0.8 ? 'right' : d[0] < -0.8 ? 'left' : 'center';\n          textVerticalAlign = d[1] > 0.8 ? 'bottom' : d[1] < -0.8 ? 'top' : 'middle';\n          break;\n        case 'insideStartTop':\n        case 'insideStart':\n        case 'insideStartBottom':\n          label.x = distanceX * dir + fromPos[0];\n          label.y = fromPos[1] + dy;\n          textAlign = tangent[0] < 0 ? 'right' : 'left';\n          label.originX = -distanceX * dir;\n          label.originY = -dy;\n          break;\n        case 'insideMiddleTop':\n        case 'insideMiddle':\n        case 'insideMiddleBottom':\n        case 'middle':\n          label.x = cp[0];\n          label.y = cp[1] + dy;\n          textAlign = 'center';\n          label.originY = -dy;\n          break;\n        case 'insideEndTop':\n        case 'insideEnd':\n        case 'insideEndBottom':\n          label.x = -distanceX * dir + toPos[0];\n          label.y = toPos[1] + dy;\n          textAlign = tangent[0] >= 0 ? 'right' : 'left';\n          label.originX = distanceX * dir;\n          label.originY = -dy;\n          break;\n      }\n      label.scaleX = label.scaleY = invScale;\n      label.setStyle({\n        // Use the user specified text align and baseline first\n        verticalAlign: label.__verticalAlign || textVerticalAlign,\n        align: label.__align || textAlign\n      });\n    }\n  };\n  return Line;\n}(graphic.Group);\nexport default Line;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as graphic from '../../util/graphic.js';\nimport LineGroup from './Line.js';\nimport { getLabelStatesModels } from '../../label/labelStyle.js';\nvar LineDraw = /** @class */function () {\n  function LineDraw(LineCtor) {\n    this.group = new graphic.Group();\n    this._LineCtor = LineCtor || LineGroup;\n  }\n  LineDraw.prototype.updateData = function (lineData) {\n    var _this = this;\n    // Remove progressive els.\n    this._progressiveEls = null;\n    var lineDraw = this;\n    var group = lineDraw.group;\n    var oldLineData = lineDraw._lineData;\n    lineDraw._lineData = lineData;\n    // There is no oldLineData only when first rendering or switching from\n    // stream mode to normal mode, where previous elements should be removed.\n    if (!oldLineData) {\n      group.removeAll();\n    }\n    var seriesScope = makeSeriesScope(lineData);\n    lineData.diff(oldLineData).add(function (idx) {\n      _this._doAdd(lineData, idx, seriesScope);\n    }).update(function (newIdx, oldIdx) {\n      _this._doUpdate(oldLineData, lineData, oldIdx, newIdx, seriesScope);\n    }).remove(function (idx) {\n      group.remove(oldLineData.getItemGraphicEl(idx));\n    }).execute();\n  };\n  ;\n  LineDraw.prototype.updateLayout = function () {\n    var lineData = this._lineData;\n    // Do not support update layout in incremental mode.\n    if (!lineData) {\n      return;\n    }\n    lineData.eachItemGraphicEl(function (el, idx) {\n      el.updateLayout(lineData, idx);\n    }, this);\n  };\n  ;\n  LineDraw.prototype.incrementalPrepareUpdate = function (lineData) {\n    this._seriesScope = makeSeriesScope(lineData);\n    this._lineData = null;\n    this.group.removeAll();\n  };\n  ;\n  LineDraw.prototype.incrementalUpdate = function (taskParams, lineData) {\n    this._progressiveEls = [];\n    function updateIncrementalAndHover(el) {\n      if (!el.isGroup && !isEffectObject(el)) {\n        el.incremental = true;\n        el.ensureState('emphasis').hoverLayer = true;\n      }\n    }\n    for (var idx = taskParams.start; idx < taskParams.end; idx++) {\n      var itemLayout = lineData.getItemLayout(idx);\n      if (lineNeedsDraw(itemLayout)) {\n        var el = new this._LineCtor(lineData, idx, this._seriesScope);\n        el.traverse(updateIncrementalAndHover);\n        this.group.add(el);\n        lineData.setItemGraphicEl(idx, el);\n        this._progressiveEls.push(el);\n      }\n    }\n  };\n  ;\n  LineDraw.prototype.remove = function () {\n    this.group.removeAll();\n  };\n  ;\n  LineDraw.prototype.eachRendered = function (cb) {\n    graphic.traverseElements(this._progressiveEls || this.group, cb);\n  };\n  LineDraw.prototype._doAdd = function (lineData, idx, seriesScope) {\n    var itemLayout = lineData.getItemLayout(idx);\n    if (!lineNeedsDraw(itemLayout)) {\n      return;\n    }\n    var el = new this._LineCtor(lineData, idx, seriesScope);\n    lineData.setItemGraphicEl(idx, el);\n    this.group.add(el);\n  };\n  LineDraw.prototype._doUpdate = function (oldLineData, newLineData, oldIdx, newIdx, seriesScope) {\n    var itemEl = oldLineData.getItemGraphicEl(oldIdx);\n    if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) {\n      this.group.remove(itemEl);\n      return;\n    }\n    if (!itemEl) {\n      itemEl = new this._LineCtor(newLineData, newIdx, seriesScope);\n    } else {\n      itemEl.updateData(newLineData, newIdx, seriesScope);\n    }\n    newLineData.setItemGraphicEl(newIdx, itemEl);\n    this.group.add(itemEl);\n  };\n  return LineDraw;\n}();\nfunction isEffectObject(el) {\n  return el.animators && el.animators.length > 0;\n}\nfunction makeSeriesScope(lineData) {\n  var hostModel = lineData.hostModel;\n  var emphasisModel = hostModel.getModel('emphasis');\n  return {\n    lineStyle: hostModel.getModel('lineStyle').getLineStyle(),\n    emphasisLineStyle: emphasisModel.getModel(['lineStyle']).getLineStyle(),\n    blurLineStyle: hostModel.getModel(['blur', 'lineStyle']).getLineStyle(),\n    selectLineStyle: hostModel.getModel(['select', 'lineStyle']).getLineStyle(),\n    emphasisDisabled: emphasisModel.get('disabled'),\n    blurScope: emphasisModel.get('blurScope'),\n    focus: emphasisModel.get('focus'),\n    labelStatesModels: getLabelStatesModels(hostModel)\n  };\n}\nfunction isPointNaN(pt) {\n  return isNaN(pt[0]) || isNaN(pt[1]);\n}\nfunction lineNeedsDraw(pts) {\n  return pts && !isPointNaN(pts[0]) && !isPointNaN(pts[1]);\n}\nexport default LineDraw;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as curveTool from 'zrender/lib/core/curve.js';\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport { getSymbolSize } from './graphHelper.js';\nvar v1 = [];\nvar v2 = [];\nvar v3 = [];\nvar quadraticAt = curveTool.quadraticAt;\nvar v2DistSquare = vec2.distSquare;\nvar mathAbs = Math.abs;\nfunction intersectCurveCircle(curvePoints, center, radius) {\n  var p0 = curvePoints[0];\n  var p1 = curvePoints[1];\n  var p2 = curvePoints[2];\n  var d = Infinity;\n  var t;\n  var radiusSquare = radius * radius;\n  var interval = 0.1;\n  for (var _t = 0.1; _t <= 0.9; _t += 0.1) {\n    v1[0] = quadraticAt(p0[0], p1[0], p2[0], _t);\n    v1[1] = quadraticAt(p0[1], p1[1], p2[1], _t);\n    var diff = mathAbs(v2DistSquare(v1, center) - radiusSquare);\n    if (diff < d) {\n      d = diff;\n      t = _t;\n    }\n  }\n  // Assume the segment is monotone\uFF0CFind root through Bisection method\n  // At most 32 iteration\n  for (var i = 0; i < 32; i++) {\n    // let prev = t - interval;\n    var next = t + interval;\n    // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev);\n    // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev);\n    v2[0] = quadraticAt(p0[0], p1[0], p2[0], t);\n    v2[1] = quadraticAt(p0[1], p1[1], p2[1], t);\n    v3[0] = quadraticAt(p0[0], p1[0], p2[0], next);\n    v3[1] = quadraticAt(p0[1], p1[1], p2[1], next);\n    var diff = v2DistSquare(v2, center) - radiusSquare;\n    if (mathAbs(diff) < 1e-2) {\n      break;\n    }\n    // let prevDiff = v2DistSquare(v1, center) - radiusSquare;\n    var nextDiff = v2DistSquare(v3, center) - radiusSquare;\n    interval /= 2;\n    if (diff < 0) {\n      if (nextDiff >= 0) {\n        t = t + interval;\n      } else {\n        t = t - interval;\n      }\n    } else {\n      if (nextDiff >= 0) {\n        t = t - interval;\n      } else {\n        t = t + interval;\n      }\n    }\n  }\n  return t;\n}\n// Adjust edge to avoid\nexport default function adjustEdge(graph, scale) {\n  var tmp0 = [];\n  var quadraticSubdivide = curveTool.quadraticSubdivide;\n  var pts = [[], [], []];\n  var pts2 = [[], []];\n  var v = [];\n  scale /= 2;\n  graph.eachEdge(function (edge, idx) {\n    var linePoints = edge.getLayout();\n    var fromSymbol = edge.getVisual('fromSymbol');\n    var toSymbol = edge.getVisual('toSymbol');\n    if (!linePoints.__original) {\n      linePoints.__original = [vec2.clone(linePoints[0]), vec2.clone(linePoints[1])];\n      if (linePoints[2]) {\n        linePoints.__original.push(vec2.clone(linePoints[2]));\n      }\n    }\n    var originalPoints = linePoints.__original;\n    // Quadratic curve\n    if (linePoints[2] != null) {\n      vec2.copy(pts[0], originalPoints[0]);\n      vec2.copy(pts[1], originalPoints[2]);\n      vec2.copy(pts[2], originalPoints[1]);\n      if (fromSymbol && fromSymbol !== 'none') {\n        var symbolSize = getSymbolSize(edge.node1);\n        var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale);\n        // Subdivide and get the second\n        quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);\n        pts[0][0] = tmp0[3];\n        pts[1][0] = tmp0[4];\n        quadraticSubdivide(pts[0][1], pts[1][1], pts[2][1], t, tmp0);\n        pts[0][1] = tmp0[3];\n        pts[1][1] = tmp0[4];\n      }\n      if (toSymbol && toSymbol !== 'none') {\n        var symbolSize = getSymbolSize(edge.node2);\n        var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale);\n        // Subdivide and get the first\n        quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);\n        pts[1][0] = tmp0[1];\n        pts[2][0] = tmp0[2];\n        quadraticSubdivide(pts[0][1], pts[1][1], pts[2][1], t, tmp0);\n        pts[1][1] = tmp0[1];\n        pts[2][1] = tmp0[2];\n      }\n      // Copy back to layout\n      vec2.copy(linePoints[0], pts[0]);\n      vec2.copy(linePoints[1], pts[2]);\n      vec2.copy(linePoints[2], pts[1]);\n    }\n    // Line\n    else {\n      vec2.copy(pts2[0], originalPoints[0]);\n      vec2.copy(pts2[1], originalPoints[1]);\n      vec2.sub(v, pts2[1], pts2[0]);\n      vec2.normalize(v, v);\n      if (fromSymbol && fromSymbol !== 'none') {\n        var symbolSize = getSymbolSize(edge.node1);\n        vec2.scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale);\n      }\n      if (toSymbol && toSymbol !== 'none') {\n        var symbolSize = getSymbolSize(edge.node2);\n        vec2.scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale);\n      }\n      vec2.copy(linePoints[0], pts2[0]);\n      vec2.copy(linePoints[1], pts2[1]);\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner } from '../../util/model.js';\n/**\n * @caveat Do not import other `src/component/thumbnail/*` files.\n *  This file should be decoupled from them for sake of the size consideration.\n */\n/**\n * FIXME: This is a temporary implmentation. May need refactor to decouple\n *  the direct call from series.graph to thumbnail.\n */\nvar inner = makeInner();\nexport function getThumbnailBridge(model) {\n  if (model) {\n    return inner(model).bridge;\n  }\n}\nexport function injectThumbnailBridge(model, thumbnailBridge) {\n  if (model) {\n    inner(model).bridge = thumbnailBridge;\n  }\n}\n;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SymbolDraw from '../helper/SymbolDraw.js';\nimport LineDraw from '../helper/LineDraw.js';\nimport RoamController from '../../component/helper/RoamController.js';\nimport { updateViewOnZoom, updateViewOnPan } from '../../component/helper/roamHelper.js';\nimport * as graphic from '../../util/graphic.js';\nimport adjustEdge from './adjustEdge.js';\nimport { getNodeGlobalScale } from './graphHelper.js';\nimport ChartView from '../../view/Chart.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { simpleLayoutEdge } from './simpleLayoutHelper.js';\nimport { circularLayout, rotateNodeLabel } from './circularLayoutHelper.js';\nimport { clone, extend } from 'zrender/lib/core/util.js';\nimport ECLinePath from '../helper/LinePath.js';\nimport { getThumbnailBridge } from '../../component/helper/thumbnailBridge.js';\nfunction isViewCoordSys(coordSys) {\n  return coordSys.type === 'view';\n}\nvar GraphView = /** @class */function (_super) {\n  __extends(GraphView, _super);\n  function GraphView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GraphView.type;\n    return _this;\n  }\n  GraphView.prototype.init = function (ecModel, api) {\n    var symbolDraw = new SymbolDraw();\n    var lineDraw = new LineDraw();\n    var group = this.group;\n    var mainGroup = new graphic.Group();\n    this._controller = new RoamController(api.getZr());\n    this._controllerHost = {\n      target: mainGroup\n    };\n    mainGroup.add(symbolDraw.group);\n    mainGroup.add(lineDraw.group);\n    group.add(mainGroup);\n    this._symbolDraw = symbolDraw;\n    this._lineDraw = lineDraw;\n    this._mainGroup = mainGroup;\n    this._firstRender = true;\n  };\n  GraphView.prototype.render = function (seriesModel, ecModel, api) {\n    var _this = this;\n    var coordSys = seriesModel.coordinateSystem;\n    var isForceLayout = false;\n    this._model = seriesModel;\n    this._api = api;\n    this._active = true;\n    var thumbnailInfo = this._getThumbnailInfo();\n    if (thumbnailInfo) {\n      thumbnailInfo.bridge.reset(api);\n    }\n    var symbolDraw = this._symbolDraw;\n    var lineDraw = this._lineDraw;\n    if (isViewCoordSys(coordSys)) {\n      var groupNewProp = {\n        x: coordSys.x,\n        y: coordSys.y,\n        scaleX: coordSys.scaleX,\n        scaleY: coordSys.scaleY\n      };\n      if (this._firstRender) {\n        this._mainGroup.attr(groupNewProp);\n      } else {\n        graphic.updateProps(this._mainGroup, groupNewProp, seriesModel);\n      }\n    }\n    // Fix edge contact point with node\n    adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n    var data = seriesModel.getData();\n    symbolDraw.updateData(data);\n    var edgeData = seriesModel.getEdgeData();\n    // TODO: TYPE\n    lineDraw.updateData(edgeData);\n    this._updateNodeAndLinkScale();\n    this._updateController(null, seriesModel, api);\n    clearTimeout(this._layoutTimeout);\n    var forceLayout = seriesModel.forceLayout;\n    var layoutAnimation = seriesModel.get(['force', 'layoutAnimation']);\n    if (forceLayout) {\n      isForceLayout = true;\n      this._startForceLayoutIteration(forceLayout, api, layoutAnimation);\n    }\n    var layout = seriesModel.get('layout');\n    data.graph.eachNode(function (node) {\n      var idx = node.dataIndex;\n      var el = node.getGraphicEl();\n      var itemModel = node.getModel();\n      if (!el) {\n        return;\n      }\n      // Update draggable\n      el.off('drag').off('dragend');\n      var draggable = itemModel.get('draggable');\n      if (draggable) {\n        el.on('drag', function (e) {\n          switch (layout) {\n            case 'force':\n              forceLayout.warmUp();\n              !_this._layouting && _this._startForceLayoutIteration(forceLayout, api, layoutAnimation);\n              forceLayout.setFixed(idx);\n              // Write position back to layout\n              data.setItemLayout(idx, [el.x, el.y]);\n              break;\n            case 'circular':\n              data.setItemLayout(idx, [el.x, el.y]);\n              // mark node fixed\n              node.setLayout({\n                fixed: true\n              }, true);\n              // recalculate circular layout\n              circularLayout(seriesModel, 'symbolSize', node, [e.offsetX, e.offsetY]);\n              _this.updateLayout(seriesModel);\n              break;\n            case 'none':\n            default:\n              data.setItemLayout(idx, [el.x, el.y]);\n              // update edge\n              simpleLayoutEdge(seriesModel.getGraph(), seriesModel);\n              _this.updateLayout(seriesModel);\n              break;\n          }\n        }).on('dragend', function () {\n          if (forceLayout) {\n            forceLayout.setUnfixed(idx);\n          }\n        });\n      }\n      el.setDraggable(draggable, !!itemModel.get('cursor'));\n      var focus = itemModel.get(['emphasis', 'focus']);\n      if (focus === 'adjacency') {\n        getECData(el).focus = node.getAdjacentDataIndices();\n      }\n    });\n    data.graph.eachEdge(function (edge) {\n      var el = edge.getGraphicEl();\n      var focus = edge.getModel().get(['emphasis', 'focus']);\n      if (!el) {\n        return;\n      }\n      if (focus === 'adjacency') {\n        getECData(el).focus = {\n          edge: [edge.dataIndex],\n          node: [edge.node1.dataIndex, edge.node2.dataIndex]\n        };\n      }\n    });\n    var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get(['circular', 'rotateLabel']);\n    var cx = data.getLayout('cx');\n    var cy = data.getLayout('cy');\n    data.graph.eachNode(function (node) {\n      rotateNodeLabel(node, circularRotateLabel, cx, cy);\n    });\n    this._firstRender = false;\n    // Force layout will render thumbnail when layout is finished.\n    if (!isForceLayout) {\n      this._renderThumbnail(seriesModel, api, this._symbolDraw, this._lineDraw);\n    }\n  };\n  GraphView.prototype.dispose = function () {\n    this.remove();\n    this._controller && this._controller.dispose();\n    this._controllerHost = null;\n  };\n  GraphView.prototype._startForceLayoutIteration = function (forceLayout, api, layoutAnimation) {\n    var self = this;\n    var firstRendered = false;\n    (function step() {\n      forceLayout.step(function (stopped) {\n        self.updateLayout(self._model);\n        if (stopped || !firstRendered) {\n          firstRendered = true;\n          self._renderThumbnail(self._model, api, self._symbolDraw, self._lineDraw);\n        }\n        (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step());\n      });\n    })();\n  };\n  GraphView.prototype._updateController = function (clipRect, seriesModel, api) {\n    var controller = this._controller;\n    var controllerHost = this._controllerHost;\n    var coordSys = seriesModel.coordinateSystem;\n    if (!isViewCoordSys(coordSys)) {\n      controller.disable();\n      return;\n    }\n    controller.enable(seriesModel.get('roam'), {\n      api: api,\n      zInfo: {\n        component: seriesModel\n      },\n      triggerInfo: {\n        roamTrigger: seriesModel.get('roamTrigger'),\n        isInSelf: function (e, x, y) {\n          return coordSys.containPoint([x, y]);\n        },\n        isInClip: function (e, x, y) {\n          return !clipRect || clipRect.contain(x, y);\n        }\n      }\n    });\n    controllerHost.zoomLimit = seriesModel.get('scaleLimit');\n    controllerHost.zoom = coordSys.getZoom();\n    controller.off('pan').off('zoom').on('pan', function (e) {\n      api.dispatchAction({\n        seriesId: seriesModel.id,\n        type: 'graphRoam',\n        dx: e.dx,\n        dy: e.dy\n      });\n    }).on('zoom', function (e) {\n      api.dispatchAction({\n        seriesId: seriesModel.id,\n        type: 'graphRoam',\n        zoom: e.scale,\n        originX: e.originX,\n        originY: e.originY\n      });\n    });\n  };\n  /**\n   * A performance shortcut - called by action handler to update the view directly\n   * without any data/visual processing (which are assumed to be unchanged), while\n   * ensuring consistent behavior between internal and external action triggers.\n   */\n  GraphView.prototype.updateViewOnPan = function (seriesModel, api, params) {\n    if (!this._active) {\n      return;\n    }\n    updateViewOnPan(this._controllerHost, params.dx, params.dy);\n    this._updateThumbnailWindow();\n  };\n  /**\n   * A performance shortcut - called by action handler to update the view directly\n   * without any data/visual processing (which are assumed to be unchanged), while\n   * ensuring consistent behavior between internal and external action triggers.\n   */\n  GraphView.prototype.updateViewOnZoom = function (seriesModel, api, params) {\n    if (!this._active) {\n      return;\n    }\n    updateViewOnZoom(this._controllerHost, params.zoom, params.originX, params.originY);\n    this._updateNodeAndLinkScale();\n    adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n    this._lineDraw.updateLayout();\n    // Only update label layout on zoom\n    api.updateLabelLayout();\n    this._updateThumbnailWindow();\n  };\n  GraphView.prototype._updateNodeAndLinkScale = function () {\n    var seriesModel = this._model;\n    var data = seriesModel.getData();\n    var nodeScale = getNodeGlobalScale(seriesModel);\n    data.eachItemGraphicEl(function (el, idx) {\n      el && el.setSymbolScale(nodeScale);\n    });\n  };\n  GraphView.prototype.updateLayout = function (seriesModel) {\n    if (!this._active) {\n      return;\n    }\n    adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));\n    this._symbolDraw.updateLayout();\n    this._lineDraw.updateLayout();\n  };\n  GraphView.prototype.remove = function () {\n    this._active = false;\n    clearTimeout(this._layoutTimeout);\n    this._layouting = false;\n    this._layoutTimeout = null;\n    this._symbolDraw && this._symbolDraw.remove();\n    this._lineDraw && this._lineDraw.remove();\n    this._controller && this._controller.disable();\n  };\n  /**\n   * Get thumbnail data structure only if supported.\n   */\n  GraphView.prototype._getThumbnailInfo = function () {\n    var model = this._model;\n    var coordSys = model.coordinateSystem;\n    if (coordSys.type !== 'view') {\n      return;\n    }\n    var bridge = getThumbnailBridge(model);\n    if (!bridge) {\n      return;\n    }\n    return {\n      bridge: bridge,\n      coordSys: coordSys\n    };\n  };\n  GraphView.prototype._updateThumbnailWindow = function () {\n    var info = this._getThumbnailInfo();\n    if (info) {\n      info.bridge.updateWindow(info.coordSys.transform, this._api);\n    }\n  };\n  GraphView.prototype._renderThumbnail = function (seriesModel, api, symbolDraw, lineDraw) {\n    var info = this._getThumbnailInfo();\n    if (!info) {\n      return;\n    }\n    var bridgeGroup = new graphic.Group();\n    var symbolNodes = symbolDraw.group.children();\n    var lineNodes = lineDraw.group.children();\n    var lineGroup = new graphic.Group();\n    var symbolGroup = new graphic.Group();\n    bridgeGroup.add(symbolGroup);\n    bridgeGroup.add(lineGroup);\n    // TODO: reuse elemenents for performance in large graph?\n    for (var i = 0; i < symbolNodes.length; i++) {\n      var node = symbolNodes[i];\n      var sub = node.children()[0];\n      var x = node.x;\n      var y = node.y;\n      var subShape = clone(sub.shape);\n      var shape = extend(subShape, {\n        width: sub.scaleX,\n        height: sub.scaleY,\n        x: x - sub.scaleX / 2,\n        y: y - sub.scaleY / 2\n      });\n      var style = clone(sub.style);\n      var subThumbnail = new sub.constructor({\n        shape: shape,\n        style: style,\n        z2: 151\n      });\n      symbolGroup.add(subThumbnail);\n    }\n    for (var i = 0; i < lineNodes.length; i++) {\n      var node = lineNodes[i];\n      var line = node.children()[0];\n      var style = clone(line.style);\n      var shape = clone(line.shape);\n      var lineThumbnail = new ECLinePath({\n        style: style,\n        shape: shape,\n        z2: 151\n      });\n      lineGroup.add(lineThumbnail);\n    }\n    info.bridge.renderContent({\n      api: api,\n      roamType: seriesModel.get('roam'),\n      viewportRect: null,\n      group: bridgeGroup,\n      targetTrans: info.coordSys.transform\n    });\n  };\n  GraphView.type = 'graph';\n  return GraphView;\n}(ChartView);\nexport default GraphView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\n// id may be function name of Object, add a prefix to avoid this problem.\nfunction generateNodeKey(id) {\n  return '_EC_' + id;\n}\nvar Graph = /** @class */function () {\n  function Graph(directed) {\n    this.type = 'graph';\n    this.nodes = [];\n    this.edges = [];\n    this._nodesMap = {};\n    /**\n     * @type {Object.<string, module:echarts/data/Graph.Edge>}\n     * @private\n     */\n    this._edgesMap = {};\n    this._directed = directed || false;\n  }\n  /**\n   * If is directed graph\n   */\n  Graph.prototype.isDirected = function () {\n    return this._directed;\n  };\n  ;\n  /**\n   * Add a new node\n   */\n  Graph.prototype.addNode = function (id, dataIndex) {\n    id = id == null ? '' + dataIndex : '' + id;\n    var nodesMap = this._nodesMap;\n    if (nodesMap[generateNodeKey(id)]) {\n      if (process.env.NODE_ENV !== 'production') {\n        console.error('Graph nodes have duplicate name or id');\n      }\n      return;\n    }\n    var node = new GraphNode(id, dataIndex);\n    node.hostGraph = this;\n    this.nodes.push(node);\n    nodesMap[generateNodeKey(id)] = node;\n    return node;\n  };\n  ;\n  /**\n   * Get node by data index\n   */\n  Graph.prototype.getNodeByIndex = function (dataIndex) {\n    var rawIdx = this.data.getRawIndex(dataIndex);\n    return this.nodes[rawIdx];\n  };\n  ;\n  /**\n   * Get node by id\n   */\n  Graph.prototype.getNodeById = function (id) {\n    return this._nodesMap[generateNodeKey(id)];\n  };\n  ;\n  /**\n   * Add a new edge\n   */\n  Graph.prototype.addEdge = function (n1, n2, dataIndex) {\n    var nodesMap = this._nodesMap;\n    var edgesMap = this._edgesMap;\n    // PENDING\n    if (zrUtil.isNumber(n1)) {\n      n1 = this.nodes[n1];\n    }\n    if (zrUtil.isNumber(n2)) {\n      n2 = this.nodes[n2];\n    }\n    if (!(n1 instanceof GraphNode)) {\n      n1 = nodesMap[generateNodeKey(n1)];\n    }\n    if (!(n2 instanceof GraphNode)) {\n      n2 = nodesMap[generateNodeKey(n2)];\n    }\n    if (!n1 || !n2) {\n      return;\n    }\n    var key = n1.id + '-' + n2.id;\n    var edge = new GraphEdge(n1, n2, dataIndex);\n    edge.hostGraph = this;\n    if (this._directed) {\n      n1.outEdges.push(edge);\n      n2.inEdges.push(edge);\n    }\n    n1.edges.push(edge);\n    if (n1 !== n2) {\n      n2.edges.push(edge);\n    }\n    this.edges.push(edge);\n    edgesMap[key] = edge;\n    return edge;\n  };\n  ;\n  /**\n   * Get edge by data index\n   */\n  Graph.prototype.getEdgeByIndex = function (dataIndex) {\n    var rawIdx = this.edgeData.getRawIndex(dataIndex);\n    return this.edges[rawIdx];\n  };\n  ;\n  /**\n   * Get edge by two linked nodes\n   */\n  Graph.prototype.getEdge = function (n1, n2) {\n    if (n1 instanceof GraphNode) {\n      n1 = n1.id;\n    }\n    if (n2 instanceof GraphNode) {\n      n2 = n2.id;\n    }\n    var edgesMap = this._edgesMap;\n    if (this._directed) {\n      return edgesMap[n1 + '-' + n2];\n    } else {\n      return edgesMap[n1 + '-' + n2] || edgesMap[n2 + '-' + n1];\n    }\n  };\n  ;\n  /**\n   * Iterate all nodes\n   */\n  Graph.prototype.eachNode = function (cb, context) {\n    var nodes = this.nodes;\n    var len = nodes.length;\n    for (var i = 0; i < len; i++) {\n      if (nodes[i].dataIndex >= 0) {\n        cb.call(context, nodes[i], i);\n      }\n    }\n  };\n  ;\n  /**\n   * Iterate all edges\n   */\n  Graph.prototype.eachEdge = function (cb, context) {\n    var edges = this.edges;\n    var len = edges.length;\n    for (var i = 0; i < len; i++) {\n      if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) {\n        cb.call(context, edges[i], i);\n      }\n    }\n  };\n  ;\n  /**\n   * Breadth first traverse\n   * Return true to stop traversing\n   */\n  Graph.prototype.breadthFirstTraverse = function (cb, startNode, direction, context) {\n    if (!(startNode instanceof GraphNode)) {\n      startNode = this._nodesMap[generateNodeKey(startNode)];\n    }\n    if (!startNode) {\n      return;\n    }\n    var edgeType = direction === 'out' ? 'outEdges' : direction === 'in' ? 'inEdges' : 'edges';\n    for (var i = 0; i < this.nodes.length; i++) {\n      this.nodes[i].__visited = false;\n    }\n    if (cb.call(context, startNode, null)) {\n      return;\n    }\n    var queue = [startNode];\n    while (queue.length) {\n      var currentNode = queue.shift();\n      var edges = currentNode[edgeType];\n      for (var i = 0; i < edges.length; i++) {\n        var e = edges[i];\n        var otherNode = e.node1 === currentNode ? e.node2 : e.node1;\n        if (!otherNode.__visited) {\n          if (cb.call(context, otherNode, currentNode)) {\n            // Stop traversing\n            return;\n          }\n          queue.push(otherNode);\n          otherNode.__visited = true;\n        }\n      }\n    }\n  };\n  ;\n  // TODO\n  // depthFirstTraverse(\n  //     cb, startNode, direction, context\n  // ) {\n  // };\n  // Filter update\n  Graph.prototype.update = function () {\n    var data = this.data;\n    var edgeData = this.edgeData;\n    var nodes = this.nodes;\n    var edges = this.edges;\n    for (var i = 0, len = nodes.length; i < len; i++) {\n      nodes[i].dataIndex = -1;\n    }\n    for (var i = 0, len = data.count(); i < len; i++) {\n      nodes[data.getRawIndex(i)].dataIndex = i;\n    }\n    edgeData.filterSelf(function (idx) {\n      var edge = edges[edgeData.getRawIndex(idx)];\n      return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;\n    });\n    // Update edge\n    for (var i = 0, len = edges.length; i < len; i++) {\n      edges[i].dataIndex = -1;\n    }\n    for (var i = 0, len = edgeData.count(); i < len; i++) {\n      edges[edgeData.getRawIndex(i)].dataIndex = i;\n    }\n  };\n  ;\n  /**\n   * @return {module:echarts/data/Graph}\n   */\n  Graph.prototype.clone = function () {\n    var graph = new Graph(this._directed);\n    var nodes = this.nodes;\n    var edges = this.edges;\n    for (var i = 0; i < nodes.length; i++) {\n      graph.addNode(nodes[i].id, nodes[i].dataIndex);\n    }\n    for (var i = 0; i < edges.length; i++) {\n      var e = edges[i];\n      graph.addEdge(e.node1.id, e.node2.id, e.dataIndex);\n    }\n    return graph;\n  };\n  ;\n  return Graph;\n}();\nvar GraphNode = /** @class */function () {\n  function GraphNode(id, dataIndex) {\n    this.inEdges = [];\n    this.outEdges = [];\n    this.edges = [];\n    this.dataIndex = -1;\n    this.id = id == null ? '' : id;\n    this.dataIndex = dataIndex == null ? -1 : dataIndex;\n  }\n  /**\n   * @return {number}\n   */\n  GraphNode.prototype.degree = function () {\n    return this.edges.length;\n  };\n  /**\n   * @return {number}\n   */\n  GraphNode.prototype.inDegree = function () {\n    return this.inEdges.length;\n  };\n  /**\n  * @return {number}\n  */\n  GraphNode.prototype.outDegree = function () {\n    return this.outEdges.length;\n  };\n  GraphNode.prototype.getModel = function (path) {\n    if (this.dataIndex < 0) {\n      return;\n    }\n    var graph = this.hostGraph;\n    var itemModel = graph.data.getItemModel(this.dataIndex);\n    return itemModel.getModel(path);\n  };\n  GraphNode.prototype.getAdjacentDataIndices = function () {\n    var dataIndices = {\n      edge: [],\n      node: []\n    };\n    for (var i = 0; i < this.edges.length; i++) {\n      var adjacentEdge = this.edges[i];\n      if (adjacentEdge.dataIndex < 0) {\n        continue;\n      }\n      dataIndices.edge.push(adjacentEdge.dataIndex);\n      dataIndices.node.push(adjacentEdge.node1.dataIndex, adjacentEdge.node2.dataIndex);\n    }\n    return dataIndices;\n  };\n  GraphNode.prototype.getTrajectoryDataIndices = function () {\n    var connectedEdgesMap = zrUtil.createHashMap();\n    var connectedNodesMap = zrUtil.createHashMap();\n    for (var i = 0, len = this.edges.length; i < len; i++) {\n      var adjacentEdge = this.edges[i];\n      if (adjacentEdge.dataIndex < 0) {\n        continue;\n      }\n      connectedEdgesMap.set(adjacentEdge.dataIndex, true);\n      var sourceNodesQueue = [adjacentEdge.node1];\n      var targetNodesQueue = [adjacentEdge.node2];\n      var nodeIteratorIndex = 0;\n      while (nodeIteratorIndex < sourceNodesQueue.length) {\n        var sourceNode = sourceNodesQueue[nodeIteratorIndex];\n        nodeIteratorIndex++;\n        connectedNodesMap.set(sourceNode.dataIndex, true);\n        var sourceNodeInEdges = sourceNode.inEdges;\n        for (var j = 0, len_1 = sourceNodeInEdges.length, inEdge = void 0, inEdgeDataIndex = void 0; j < len_1; j++) {\n          inEdge = sourceNodeInEdges[j];\n          inEdgeDataIndex = inEdge.dataIndex;\n          if (inEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(inEdgeDataIndex)) {\n            connectedEdgesMap.set(inEdgeDataIndex, true);\n            sourceNodesQueue.push(inEdge.node1);\n          }\n        }\n      }\n      nodeIteratorIndex = 0;\n      while (nodeIteratorIndex < targetNodesQueue.length) {\n        var targetNode = targetNodesQueue[nodeIteratorIndex];\n        nodeIteratorIndex++;\n        connectedNodesMap.set(targetNode.dataIndex, true);\n        var targetNodeOutEdges = targetNode.outEdges;\n        for (var j = 0, len_2 = targetNodeOutEdges.length, outEdge = void 0, outEdgeDataIndex = void 0; j < len_2; j++) {\n          outEdge = targetNodeOutEdges[j];\n          outEdgeDataIndex = outEdge.dataIndex;\n          if (outEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(outEdgeDataIndex)) {\n            connectedEdgesMap.set(outEdgeDataIndex, true);\n            targetNodesQueue.push(outEdge.node2);\n          }\n        }\n      }\n    }\n    return {\n      edge: connectedEdgesMap.keys(),\n      node: connectedNodesMap.keys()\n    };\n  };\n  return GraphNode;\n}();\nvar GraphEdge = /** @class */function () {\n  function GraphEdge(n1, n2, dataIndex) {\n    this.dataIndex = -1;\n    this.node1 = n1;\n    this.node2 = n2;\n    this.dataIndex = dataIndex == null ? -1 : dataIndex;\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  GraphEdge.prototype.getModel = function (path) {\n    if (this.dataIndex < 0) {\n      return;\n    }\n    var graph = this.hostGraph;\n    var itemModel = graph.edgeData.getItemModel(this.dataIndex);\n    return itemModel.getModel(path);\n  };\n  GraphEdge.prototype.getAdjacentDataIndices = function () {\n    return {\n      edge: [this.dataIndex],\n      node: [this.node1.dataIndex, this.node2.dataIndex]\n    };\n  };\n  GraphEdge.prototype.getTrajectoryDataIndices = function () {\n    var connectedEdgesMap = zrUtil.createHashMap();\n    var connectedNodesMap = zrUtil.createHashMap();\n    connectedEdgesMap.set(this.dataIndex, true);\n    var sourceNodes = [this.node1];\n    var targetNodes = [this.node2];\n    var nodeIteratorIndex = 0;\n    while (nodeIteratorIndex < sourceNodes.length) {\n      var sourceNode = sourceNodes[nodeIteratorIndex];\n      nodeIteratorIndex++;\n      connectedNodesMap.set(sourceNode.dataIndex, true);\n      var sourceNodeInEdges = sourceNode.inEdges;\n      for (var j = 0, len = sourceNodeInEdges.length, inEdge = void 0, inEdgeDataIndex = void 0; j < len; j++) {\n        inEdge = sourceNode.inEdges[j];\n        inEdgeDataIndex = inEdge.dataIndex;\n        if (inEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(inEdgeDataIndex)) {\n          connectedEdgesMap.set(inEdgeDataIndex, true);\n          sourceNodes.push(inEdge.node1);\n        }\n      }\n    }\n    nodeIteratorIndex = 0;\n    while (nodeIteratorIndex < targetNodes.length) {\n      var targetNode = targetNodes[nodeIteratorIndex];\n      nodeIteratorIndex++;\n      connectedNodesMap.set(targetNode.dataIndex, true);\n      var targetNodeOutEdges = targetNode.outEdges;\n      for (var j = 0, len = targetNodeOutEdges.length, outEdge = void 0, outEdgeDataIndex = void 0; j < len; j++) {\n        outEdge = targetNode.outEdges[j];\n        outEdgeDataIndex = outEdge.dataIndex;\n        if (outEdgeDataIndex >= 0 && !connectedEdgesMap.hasKey(outEdgeDataIndex)) {\n          connectedEdgesMap.set(outEdgeDataIndex, true);\n          targetNodes.push(outEdge.node2);\n        }\n      }\n    }\n    return {\n      edge: connectedEdgesMap.keys(),\n      node: connectedNodesMap.keys()\n    };\n  };\n  return GraphEdge;\n}();\nfunction createGraphDataProxyMixin(hostName, dataName) {\n  return {\n    /**\n     * @param Default 'value'. can be 'a', 'b', 'c', 'd', 'e'.\n     */\n    getValue: function (dimension) {\n      var data = this[hostName][dataName];\n      return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex);\n    },\n    // TODO: TYPE stricter type.\n    setVisual: function (key, value) {\n      this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value);\n    },\n    getVisual: function (key) {\n      return this[hostName][dataName].getItemVisual(this.dataIndex, key);\n    },\n    setLayout: function (layout, merge) {\n      this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge);\n    },\n    getLayout: function () {\n      return this[hostName][dataName].getItemLayout(this.dataIndex);\n    },\n    getGraphicEl: function () {\n      return this[hostName][dataName].getItemGraphicEl(this.dataIndex);\n    },\n    getRawIndex: function () {\n      return this[hostName][dataName].getRawIndex(this.dataIndex);\n    }\n  };\n}\n;\n;\n;\nzrUtil.mixin(GraphNode, createGraphDataProxyMixin('hostGraph', 'data'));\nzrUtil.mixin(GraphEdge, createGraphDataProxyMixin('hostGraph', 'edgeData'));\nexport default Graph;\nexport { GraphNode, GraphEdge };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport Graph from '../../data/Graph.js';\nimport linkSeriesData from '../../data/helper/linkSeriesData.js';\nimport prepareSeriesDataSchema from '../../data/helper/createDimensions.js';\nimport CoordinateSystem from '../../core/CoordinateSystem.js';\nimport createSeriesData from './createSeriesData.js';\nimport { convertOptionIdName } from '../../util/model.js';\nexport default function createGraphFromNodeEdge(nodes, edges, seriesModel, directed, beforeLink) {\n  // ??? TODO\n  // support dataset?\n  var graph = new Graph(directed);\n  for (var i = 0; i < nodes.length; i++) {\n    graph.addNode(zrUtil.retrieve(\n    // Id, name, dataIndex\n    nodes[i].id, nodes[i].name, i), i);\n  }\n  var linkNameList = [];\n  var validEdges = [];\n  var linkCount = 0;\n  for (var i = 0; i < edges.length; i++) {\n    var link = edges[i];\n    var source = link.source;\n    var target = link.target;\n    // addEdge may fail when source or target not exists\n    if (graph.addEdge(source, target, linkCount)) {\n      validEdges.push(link);\n      linkNameList.push(zrUtil.retrieve(convertOptionIdName(link.id, null), source + ' > ' + target));\n      linkCount++;\n    }\n  }\n  var coordSys = seriesModel.get('coordinateSystem');\n  var nodeData;\n  if (coordSys === 'cartesian2d' || coordSys === 'polar' || coordSys === 'matrix') {\n    nodeData = createSeriesData(nodes, seriesModel);\n  } else {\n    var coordSysCtor = CoordinateSystem.get(coordSys);\n    var coordDimensions = coordSysCtor ? coordSysCtor.dimensions || [] : [];\n    // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs\n    // `value` dimension, but graph need `value` dimension. It's better to\n    // uniform this behavior.\n    if (zrUtil.indexOf(coordDimensions, 'value') < 0) {\n      coordDimensions.concat(['value']);\n    }\n    var dimensions = prepareSeriesDataSchema(nodes, {\n      coordDimensions: coordDimensions,\n      encodeDefine: seriesModel.getEncode()\n    }).dimensions;\n    nodeData = new SeriesData(dimensions, seriesModel);\n    nodeData.initData(nodes);\n  }\n  var edgeData = new SeriesData(['value'], seriesModel);\n  edgeData.initData(validEdges, linkNameList);\n  beforeLink && beforeLink(nodeData, edgeData);\n  linkSeriesData({\n    mainData: nodeData,\n    struct: graph,\n    structAttr: 'graph',\n    datas: {\n      node: nodeData,\n      edge: edgeData\n    },\n    datasAttr: {\n      node: 'data',\n      edge: 'edgeData'\n    }\n  });\n  // Update dataIndex of nodes and edges because invalid edge may be removed\n  graph.update();\n  return graph;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesData from '../../data/SeriesData.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { defaultEmphasis } from '../../util/model.js';\nimport Model from '../../model/Model.js';\nimport createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge.js';\nimport LegendVisualProvider from '../../visual/LegendVisualProvider.js';\nimport SeriesModel from '../../model/Series.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nimport { defaultSeriesFormatTooltip } from '../../component/tooltip/seriesFormatTooltip.js';\nimport { initCurvenessList, createEdgeMapForCurveness } from '../helper/multipleGraphEdgeHelper.js';\nimport tokens from '../../visual/tokens.js';\nvar GraphSeriesModel = /** @class */function (_super) {\n  __extends(GraphSeriesModel, _super);\n  function GraphSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GraphSeriesModel.type;\n    _this.hasSymbolVisual = true;\n    return _this;\n  }\n  GraphSeriesModel.prototype.init = function (option) {\n    _super.prototype.init.apply(this, arguments);\n    var self = this;\n    function getCategoriesData() {\n      return self._categoriesData;\n    }\n    // Provide data for legend select\n    this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData);\n    this.fillDataTextStyle(option.edges || option.links);\n    this._updateCategoriesData();\n  };\n  GraphSeriesModel.prototype.mergeOption = function (option) {\n    _super.prototype.mergeOption.apply(this, arguments);\n    this.fillDataTextStyle(option.edges || option.links);\n    this._updateCategoriesData();\n  };\n  GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) {\n    _super.prototype.mergeDefaultAndTheme.apply(this, arguments);\n    defaultEmphasis(option, 'edgeLabel', ['show']);\n  };\n  GraphSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    var edges = option.edges || option.links || [];\n    var nodes = option.data || option.nodes || [];\n    var self = this;\n    if (nodes && edges) {\n      // auto curveness\n      initCurvenessList(this);\n      var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink);\n      zrUtil.each(graph.edges, function (edge) {\n        createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex);\n      }, this);\n      return graph.data;\n    }\n    function beforeLink(nodeData, edgeData) {\n      // Overwrite nodeData.getItemModel to\n      nodeData.wrapMethod('getItemModel', function (model) {\n        var categoriesModels = self._categoriesModels;\n        var categoryIdx = model.getShallow('category');\n        var categoryModel = categoriesModels[categoryIdx];\n        if (categoryModel) {\n          categoryModel.parentModel = model.parentModel;\n          model.parentModel = categoryModel;\n        }\n        return model;\n      });\n      // TODO Inherit resolveParentPath by default in Model#getModel?\n      var oldGetModel = Model.prototype.getModel;\n      function newGetModel(path, parentModel) {\n        var model = oldGetModel.call(this, path, parentModel);\n        model.resolveParentPath = resolveParentPath;\n        return model;\n      }\n      edgeData.wrapMethod('getItemModel', function (model) {\n        model.resolveParentPath = resolveParentPath;\n        model.getModel = newGetModel;\n        return model;\n      });\n      function resolveParentPath(pathArr) {\n        if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) {\n          var newPathArr = pathArr.slice();\n          if (pathArr[0] === 'label') {\n            newPathArr[0] = 'edgeLabel';\n          } else if (pathArr[1] === 'label') {\n            newPathArr[1] = 'edgeLabel';\n          }\n          return newPathArr;\n        }\n        return pathArr;\n      }\n    }\n  };\n  GraphSeriesModel.prototype.getGraph = function () {\n    return this.getData().graph;\n  };\n  GraphSeriesModel.prototype.getEdgeData = function () {\n    return this.getGraph().edgeData;\n  };\n  GraphSeriesModel.prototype.getCategoriesData = function () {\n    return this._categoriesData;\n  };\n  GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    if (dataType === 'edge') {\n      var nodeData = this.getData();\n      var params = this.getDataParams(dataIndex, dataType);\n      var edge = nodeData.graph.getEdgeByIndex(dataIndex);\n      var sourceName = nodeData.getName(edge.node1.dataIndex);\n      var targetName = nodeData.getName(edge.node2.dataIndex);\n      var nameArr = [];\n      sourceName != null && nameArr.push(sourceName);\n      targetName != null && nameArr.push(targetName);\n      return createTooltipMarkup('nameValue', {\n        name: nameArr.join(' > '),\n        value: params.value,\n        noValue: params.value == null\n      });\n    }\n    // dataType === 'node' or empty\n    var nodeMarkup = defaultSeriesFormatTooltip({\n      series: this,\n      dataIndex: dataIndex,\n      multipleSeries: multipleSeries\n    });\n    return nodeMarkup;\n  };\n  GraphSeriesModel.prototype._updateCategoriesData = function () {\n    var categories = zrUtil.map(this.option.categories || [], function (category) {\n      // Data must has value\n      return category.value != null ? category : zrUtil.extend({\n        value: 0\n      }, category);\n    });\n    var categoriesData = new SeriesData(['value'], this);\n    categoriesData.initData(categories);\n    this._categoriesData = categoriesData;\n    this._categoriesModels = categoriesData.mapArray(function (idx) {\n      return categoriesData.getItemModel(idx);\n    });\n  };\n  GraphSeriesModel.prototype.setZoom = function (zoom) {\n    this.option.zoom = zoom;\n  };\n  GraphSeriesModel.prototype.setCenter = function (center) {\n    this.option.center = center;\n  };\n  GraphSeriesModel.prototype.isAnimationEnabled = function () {\n    return _super.prototype.isAnimationEnabled.call(this)\n    // Not enable animation when do force layout\n    && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation']));\n  };\n  GraphSeriesModel.type = 'series.graph';\n  GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar'];\n  GraphSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    coordinateSystem: 'view',\n    // Default option for all coordinate systems\n    // xAxisIndex: 0,\n    // yAxisIndex: 0,\n    // polarIndex: 0,\n    // geoIndex: 0,\n    legendHoverLink: true,\n    layout: null,\n    // Configuration of circular layout\n    circular: {\n      rotateLabel: false\n    },\n    // Configuration of force directed layout\n    force: {\n      initLayout: null,\n      // Node repulsion. Can be an array to represent range.\n      repulsion: [0, 50],\n      gravity: 0.1,\n      // Initial friction\n      friction: 0.6,\n      // Edge length. Can be an array to represent range.\n      edgeLength: 30,\n      layoutAnimation: true\n    },\n    left: 'center',\n    top: 'center',\n    // right: null,\n    // bottom: null,\n    // width: '80%',\n    // height: '80%',\n    symbol: 'circle',\n    symbolSize: 10,\n    edgeSymbol: ['none', 'none'],\n    edgeSymbolSize: 10,\n    edgeLabel: {\n      position: 'middle',\n      distance: 5\n    },\n    draggable: false,\n    roam: false,\n    // Default on center of graph\n    center: null,\n    zoom: 1,\n    // Symbol size scale ratio in roam\n    nodeScaleRatio: 0.6,\n    // cursor: null,\n    // categories: [],\n    // data: []\n    // Or\n    // nodes: []\n    //\n    // links: []\n    // Or\n    // edges: []\n    label: {\n      show: false,\n      formatter: '{b}'\n    },\n    itemStyle: {},\n    lineStyle: {\n      // Don't use tokens.color.border because of the opacity\n      color: tokens.color.neutral50,\n      width: 1,\n      opacity: 0.5\n    },\n    emphasis: {\n      scale: true,\n      label: {\n        show: true\n      }\n    },\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary\n      }\n    }\n  };\n  return GraphSeriesModel;\n}(SeriesModel);\nexport default GraphSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport categoryFilter from './categoryFilter.js';\nimport categoryVisual from './categoryVisual.js';\nimport edgeVisual from './edgeVisual.js';\nimport simpleLayout from './simpleLayout.js';\nimport circularLayout from './circularLayout.js';\nimport forceLayout from './forceLayout.js';\nimport createView from './createView.js';\nimport View from '../../coord/View.js';\nimport GraphView from './GraphView.js';\nimport GraphSeriesModel from './GraphSeries.js';\nimport { updateCenterAndZoomInAction } from '../../component/helper/roamHelper.js';\nimport { noop } from 'zrender/lib/core/util.js';\nexport function install(registers) {\n  registers.registerChartView(GraphView);\n  registers.registerSeriesModel(GraphSeriesModel);\n  registers.registerProcessor(categoryFilter);\n  registers.registerVisual(categoryVisual);\n  registers.registerVisual(edgeVisual);\n  registers.registerLayout(simpleLayout);\n  registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, circularLayout);\n  registers.registerLayout(forceLayout);\n  registers.registerCoordinateSystem('graphView', {\n    dimensions: View.dimensions,\n    create: createView\n  });\n  // Register legacy focus actions\n  registers.registerAction({\n    type: 'focusNodeAdjacency',\n    event: 'focusNodeAdjacency',\n    update: 'series:focusNodeAdjacency'\n  }, noop);\n  registers.registerAction({\n    type: 'unfocusNodeAdjacency',\n    event: 'unfocusNodeAdjacency',\n    update: 'series:unfocusNodeAdjacency'\n  }, noop);\n  // Register roam action.\n  registers.registerAction({\n    type: 'graphRoam',\n    event: 'graphRoam',\n    update: 'none'\n  }, function (payload, ecModel, api) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      query: payload\n    }, function (seriesModel) {\n      var graphView = api.getViewOfSeriesModel(seriesModel);\n      if (graphView) {\n        if (payload.dx != null && payload.dy != null) {\n          graphView.updateViewOnPan(seriesModel, api, payload);\n        }\n        if (payload.zoom != null && payload.originX != null && payload.originY != null) {\n          graphView.updateViewOnZoom(seriesModel, api, payload);\n        }\n      }\n      var coordSys = seriesModel.coordinateSystem;\n      var res = updateCenterAndZoomInAction(coordSys, payload, seriesModel.get('scaleLimit'));\n      seriesModel.setCenter && seriesModel.setCenter(res.center);\n      seriesModel.setZoom && seriesModel.setZoom(res.zoom);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { extend, retrieve3 } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getSectorCornerRadius } from '../helper/sectorHelper.js';\nimport { getLabelStatesModels, setLabelStyle } from '../../label/labelStyle.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport { getECData } from '../../util/innerStore.js';\nvar ChordPiece = /** @class */function (_super) {\n  __extends(ChordPiece, _super);\n  function ChordPiece(data, idx, startAngle) {\n    var _this = _super.call(this) || this;\n    getECData(_this).dataType = 'node';\n    _this.z2 = 2;\n    var text = new graphic.Text();\n    _this.setTextContent(text);\n    _this.updateData(data, idx, startAngle, true);\n    return _this;\n  }\n  ChordPiece.prototype.updateData = function (data, idx, startAngle, firstCreate) {\n    var sector = this;\n    var node = data.graph.getNodeByIndex(idx);\n    var seriesModel = data.hostModel;\n    var itemModel = node.getModel();\n    var emphasisModel = itemModel.getModel('emphasis');\n    // layout position is the center of the sector\n    var layout = data.getItemLayout(idx);\n    var shape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout);\n    var el = this;\n    // Ignore NaN data.\n    if (isNaN(shape.startAngle)) {\n      // Use NaN shape to avoid drawing shape.\n      el.setShape(shape);\n      return;\n    }\n    if (firstCreate) {\n      el.setShape(shape);\n    } else {\n      graphic.updateProps(el, {\n        shape: shape\n      }, seriesModel, idx);\n    }\n    var sectorShape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout);\n    sector.setShape(sectorShape);\n    sector.useStyle(data.getItemVisual(idx, 'style'));\n    setStatesStylesFromModel(sector, itemModel);\n    this._updateLabel(seriesModel, itemModel, node);\n    data.setItemGraphicEl(idx, el);\n    setStatesStylesFromModel(el, itemModel, 'itemStyle');\n    // Add focus/blur states handling\n    var focus = emphasisModel.get('focus');\n    toggleHoverEmphasis(this, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  };\n  ChordPiece.prototype._updateLabel = function (seriesModel, itemModel, node) {\n    var label = this.getTextContent();\n    var layout = node.getLayout();\n    var midAngle = (layout.startAngle + layout.endAngle) / 2;\n    var dx = Math.cos(midAngle);\n    var dy = Math.sin(midAngle);\n    var normalLabelModel = itemModel.getModel('label');\n    label.ignore = !normalLabelModel.get('show');\n    // Set label style\n    var labelStateModels = getLabelStatesModels(itemModel);\n    var style = node.getVisual('style');\n    setLabelStyle(label, labelStateModels, {\n      labelFetcher: {\n        getFormattedLabel: function (dataIndex, stateName, dataType, labelDimIndex, formatter, extendParams) {\n          return seriesModel.getFormattedLabel(dataIndex, stateName, 'node', labelDimIndex,\n          // ensure edgeLabel formatter is provided\n          // to prevent the inheritance from `label.formatter` of the series\n          retrieve3(formatter, labelStateModels.normal && labelStateModels.normal.get('formatter'), itemModel.get('name')), extendParams);\n        }\n      },\n      labelDataIndex: node.dataIndex,\n      defaultText: node.dataIndex + '',\n      inheritColor: style.fill,\n      defaultOpacity: style.opacity,\n      defaultOutsidePosition: 'startArc'\n    });\n    // Set label position\n    var labelPosition = normalLabelModel.get('position') || 'outside';\n    var labelPadding = normalLabelModel.get('distance') || 0;\n    var r;\n    if (labelPosition === 'outside') {\n      r = layout.r + labelPadding;\n    } else {\n      r = (layout.r + layout.r0) / 2;\n    }\n    this.textConfig = {\n      inside: labelPosition !== 'outside'\n    };\n    var align = labelPosition !== 'outside' ? normalLabelModel.get('align') || 'center' : dx > 0 ? 'left' : 'right';\n    var verticalAlign = labelPosition !== 'outside' ? normalLabelModel.get('verticalAlign') || 'middle' : dy > 0 ? 'top' : 'bottom';\n    label.attr({\n      x: dx * r + layout.cx,\n      y: dy * r + layout.cy,\n      rotation: 0,\n      style: {\n        align: align,\n        verticalAlign: verticalAlign\n      }\n    });\n  };\n  return ChordPiece;\n}(graphic.Sector);\nexport default ChordPiece;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { extend, isString } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getSectorCornerRadius } from '../helper/sectorHelper.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport { getECData } from '../../util/innerStore.js';\nvar ChordPathShape = /** @class */function () {\n  function ChordPathShape() {\n    // Souce node, two points forming an arc\n    this.s1 = [0, 0];\n    this.s2 = [0, 0];\n    this.sStartAngle = 0;\n    this.sEndAngle = 0;\n    // Target node, two points forming an arc\n    this.t1 = [0, 0];\n    this.t2 = [0, 0];\n    this.tStartAngle = 0;\n    this.tEndAngle = 0;\n    this.cx = 0;\n    this.cy = 0;\n    // series.r0 of ChordSeries\n    this.r = 0;\n    this.clockwise = true;\n  }\n  return ChordPathShape;\n}();\nexport { ChordPathShape };\nvar ChordEdge = /** @class */function (_super) {\n  __extends(ChordEdge, _super);\n  function ChordEdge(nodeData, edgeData, edgeIdx, startAngle) {\n    var _this = _super.call(this) || this;\n    getECData(_this).dataType = 'edge';\n    _this.updateData(nodeData, edgeData, edgeIdx, startAngle, true);\n    return _this;\n  }\n  ChordEdge.prototype.buildPath = function (ctx, shape) {\n    // Start from n11\n    ctx.moveTo(shape.s1[0], shape.s1[1]);\n    var ratio = 0.7;\n    var clockwise = shape.clockwise;\n    // Draw the arc from n11 to n12\n    ctx.arc(shape.cx, shape.cy, shape.r, shape.sStartAngle, shape.sEndAngle, !clockwise);\n    // Bezier curve to cp1 and then to n21\n    ctx.bezierCurveTo((shape.cx - shape.s2[0]) * ratio + shape.s2[0], (shape.cy - shape.s2[1]) * ratio + shape.s2[1], (shape.cx - shape.t1[0]) * ratio + shape.t1[0], (shape.cy - shape.t1[1]) * ratio + shape.t1[1], shape.t1[0], shape.t1[1]);\n    // Draw the arc from n21 to n22\n    ctx.arc(shape.cx, shape.cy, shape.r, shape.tStartAngle, shape.tEndAngle, !clockwise);\n    // Bezier curve back to cp2 and then to n11\n    ctx.bezierCurveTo((shape.cx - shape.t2[0]) * ratio + shape.t2[0], (shape.cy - shape.t2[1]) * ratio + shape.t2[1], (shape.cx - shape.s1[0]) * ratio + shape.s1[0], (shape.cy - shape.s1[1]) * ratio + shape.s1[1], shape.s1[0], shape.s1[1]);\n    ctx.closePath();\n  };\n  ChordEdge.prototype.updateData = function (nodeData, edgeData, edgeIdx, startAngle, firstCreate) {\n    var seriesModel = nodeData.hostModel;\n    var edge = edgeData.graph.getEdgeByIndex(edgeIdx);\n    var layout = edge.getLayout();\n    var itemModel = edge.node1.getModel();\n    var edgeModel = edgeData.getItemModel(edge.dataIndex);\n    var lineStyle = edgeModel.getModel('lineStyle');\n    var emphasisModel = edgeModel.getModel('emphasis');\n    var focus = emphasisModel.get('focus');\n    var shape = extend(getSectorCornerRadius(itemModel.getModel('itemStyle'), layout, true), layout);\n    var el = this;\n    // Ignore NaN data.\n    if (isNaN(shape.sStartAngle) || isNaN(shape.tStartAngle)) {\n      // Use NaN shape to avoid drawing shape.\n      el.setShape(shape);\n      return;\n    }\n    if (firstCreate) {\n      el.setShape(shape);\n      applyEdgeFill(el, edge, nodeData, lineStyle);\n    } else {\n      saveOldStyle(el);\n      applyEdgeFill(el, edge, nodeData, lineStyle);\n      graphic.updateProps(el, {\n        shape: shape\n      }, seriesModel, edgeIdx);\n    }\n    toggleHoverEmphasis(this, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    setStatesStylesFromModel(el, edgeModel, 'lineStyle');\n    edgeData.setItemGraphicEl(edge.dataIndex, el);\n  };\n  return ChordEdge;\n}(graphic.Path);\nexport { ChordEdge };\nfunction applyEdgeFill(edgeShape, edge, nodeData, lineStyleModel) {\n  var node1 = edge.node1;\n  var node2 = edge.node2;\n  var edgeStyle = edgeShape.style;\n  edgeShape.setStyle(lineStyleModel.getLineStyle());\n  var color = lineStyleModel.get('color');\n  switch (color) {\n    case 'source':\n      // TODO: use visual and node1.getVisual('color');\n      edgeStyle.fill = nodeData.getItemVisual(node1.dataIndex, 'style').fill;\n      edgeStyle.decal = node1.getVisual('style').decal;\n      break;\n    case 'target':\n      edgeStyle.fill = nodeData.getItemVisual(node2.dataIndex, 'style').fill;\n      edgeStyle.decal = node2.getVisual('style').decal;\n      break;\n    case 'gradient':\n      var sourceColor = nodeData.getItemVisual(node1.dataIndex, 'style').fill;\n      var targetColor = nodeData.getItemVisual(node2.dataIndex, 'style').fill;\n      if (isString(sourceColor) && isString(targetColor)) {\n        // Gradient direction is perpendicular to the mid-angles\n        // of source and target nodes.\n        var shape = edgeShape.shape;\n        var sMidX = (shape.s1[0] + shape.s2[0]) / 2;\n        var sMidY = (shape.s1[1] + shape.s2[1]) / 2;\n        var tMidX = (shape.t1[0] + shape.t2[0]) / 2;\n        var tMidY = (shape.t1[1] + shape.t2[1]) / 2;\n        edgeStyle.fill = new graphic.LinearGradient(sMidX, sMidY, tMidX, tMidY, [{\n          offset: 0,\n          color: sourceColor\n        }, {\n          offset: 1,\n          color: targetColor\n        }], true);\n      }\n      break;\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport ChartView from '../../view/Chart.js';\nimport ChordPiece from './ChordPiece.js';\nimport { ChordEdge } from './ChordEdge.js';\nimport { parsePercent } from '../../util/number.js';\nimport { getECData } from '../../util/innerStore.js';\nvar RADIAN = Math.PI / 180;\nvar ChordView = /** @class */function (_super) {\n  __extends(ChordView, _super);\n  function ChordView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ChordView.type;\n    return _this;\n  }\n  ChordView.prototype.init = function (ecModel, api) {};\n  ChordView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var group = this.group;\n    var startAngle = -seriesModel.get('startAngle') * RADIAN;\n    data.diff(oldData).add(function (newIdx) {\n      /* Consider the case when there are only two nodes A and B,\n       * and there is a link between A and B.\n       * At first, they are both disselected from legend. And then\n       * when A is selected, A will go into `add` method. But since\n       * there are no edges to be displayed, A should not be added.\n       * So we should only add A when layout is defined.\n       */\n      var layout = data.getItemLayout(newIdx);\n      if (layout) {\n        var el = new ChordPiece(data, newIdx, startAngle);\n        getECData(el).dataIndex = newIdx;\n        group.add(el);\n      }\n    }).update(function (newIdx, oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      var layout = data.getItemLayout(newIdx);\n      /* Consider the case when there are only two nodes A and B,\n       * and there is a link between A and B.\n       * and when A is disselected from legend, there should be\n       * nothing to display. But in the `data.diff` method, B will go\n       * into `update` method and having no layout.\n       * In this case, we need to remove B.\n       */\n      if (!layout) {\n        el && graphic.removeElementWithFadeOut(el, seriesModel, oldIdx);\n        return;\n      }\n      if (!el) {\n        el = new ChordPiece(data, newIdx, startAngle);\n      } else {\n        el.updateData(data, newIdx, startAngle);\n      }\n      group.add(el);\n    }).remove(function (oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el && graphic.removeElementWithFadeOut(el, seriesModel, oldIdx);\n    }).execute();\n    if (!oldData) {\n      var center = seriesModel.get('center');\n      this.group.scaleX = 0.01;\n      this.group.scaleY = 0.01;\n      this.group.originX = parsePercent(center[0], api.getWidth());\n      this.group.originY = parsePercent(center[1], api.getHeight());\n      graphic.initProps(this.group, {\n        scaleX: 1,\n        scaleY: 1\n      }, seriesModel);\n    }\n    this._data = data;\n    this.renderEdges(seriesModel, startAngle);\n  };\n  ChordView.prototype.renderEdges = function (seriesModel, startAngle) {\n    var nodeData = seriesModel.getData();\n    var edgeData = seriesModel.getEdgeData();\n    var oldData = this._edgeData;\n    var group = this.group;\n    edgeData.diff(oldData).add(function (newIdx) {\n      var el = new ChordEdge(nodeData, edgeData, newIdx, startAngle);\n      getECData(el).dataIndex = newIdx;\n      group.add(el);\n    }).update(function (newIdx, oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el.updateData(nodeData, edgeData, newIdx, startAngle);\n      group.add(el);\n    }).remove(function (oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el && graphic.removeElementWithFadeOut(el, seriesModel, oldIdx);\n    }).execute();\n    this._edgeData = edgeData;\n  };\n  ChordView.prototype.dispose = function () {};\n  ChordView.type = 'chord';\n  return ChordView;\n}(ChartView);\nexport default ChordView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Model from '../../model/Model.js';\nimport SeriesModel from '../../model/Series.js';\nimport createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nimport LegendVisualProvider from '../../visual/LegendVisualProvider.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar ChordSeriesModel = /** @class */function (_super) {\n  __extends(ChordSeriesModel, _super);\n  function ChordSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ChordSeriesModel.type;\n    return _this;\n  }\n  ChordSeriesModel.prototype.init = function (option) {\n    _super.prototype.init.apply(this, arguments);\n    this.fillDataTextStyle(option.edges || option.links);\n    // Enable legend selection for each data item\n    this.legendVisualProvider = new LegendVisualProvider(zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this));\n  };\n  ChordSeriesModel.prototype.mergeOption = function (option) {\n    _super.prototype.mergeOption.apply(this, arguments);\n    this.fillDataTextStyle(option.edges || option.links);\n  };\n  ChordSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    var edges = option.edges || option.links || [];\n    var nodes = option.data || option.nodes || [];\n    if (nodes && edges) {\n      var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink);\n      return graph.data;\n    }\n    function beforeLink(nodeData, edgeData) {\n      // TODO Inherit resolveParentPath by default in Model#getModel?\n      var oldGetModel = Model.prototype.getModel;\n      function newGetModel(path, parentModel) {\n        var model = oldGetModel.call(this, path, parentModel);\n        model.resolveParentPath = resolveParentPath;\n        return model;\n      }\n      edgeData.wrapMethod('getItemModel', function (model) {\n        model.resolveParentPath = resolveParentPath;\n        model.getModel = newGetModel;\n        return model;\n      });\n      function resolveParentPath(pathArr) {\n        if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) {\n          var newPathArr = pathArr.slice();\n          if (pathArr[0] === 'label') {\n            newPathArr[0] = 'edgeLabel';\n          } else if (pathArr[1] === 'label') {\n            newPathArr[1] = 'edgeLabel';\n          }\n          return newPathArr;\n        }\n        return pathArr;\n      }\n    }\n  };\n  ChordSeriesModel.prototype.getGraph = function () {\n    return this.getData().graph;\n  };\n  ChordSeriesModel.prototype.getEdgeData = function () {\n    return this.getGraph().edgeData;\n  };\n  ChordSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var params = this.getDataParams(dataIndex, dataType);\n    if (dataType === 'edge') {\n      var nodeData = this.getData();\n      var edge = nodeData.graph.getEdgeByIndex(dataIndex);\n      var sourceName = nodeData.getName(edge.node1.dataIndex);\n      var targetName = nodeData.getName(edge.node2.dataIndex);\n      var nameArr = [];\n      sourceName != null && nameArr.push(sourceName);\n      targetName != null && nameArr.push(targetName);\n      return createTooltipMarkup('nameValue', {\n        name: nameArr.join(' > '),\n        value: params.value,\n        noValue: params.value == null\n      });\n    }\n    // dataType === 'node' or empty\n    return createTooltipMarkup('nameValue', {\n      name: params.name,\n      value: params.value,\n      noValue: params.value == null\n    });\n  };\n  ChordSeriesModel.prototype.getDataParams = function (dataIndex, dataType) {\n    var params = _super.prototype.getDataParams.call(this, dataIndex, dataType);\n    if (dataType === 'node') {\n      var nodeData = this.getData();\n      var node = this.getGraph().getNodeByIndex(dataIndex);\n      // Set name if not already set\n      if (params.name == null) {\n        params.name = nodeData.getName(dataIndex);\n      }\n      // Set value if not already set\n      if (params.value == null) {\n        var nodeValue = node.getLayout().value;\n        params.value = nodeValue;\n      }\n    }\n    return params;\n  };\n  ChordSeriesModel.type = 'series.chord';\n  ChordSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    coordinateSystem: 'none',\n    legendHoverLink: true,\n    colorBy: 'data',\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: null,\n    height: null,\n    center: ['50%', '50%'],\n    radius: ['70%', '80%'],\n    clockwise: true,\n    startAngle: 90,\n    endAngle: 'auto',\n    minAngle: 0,\n    padAngle: 3,\n    itemStyle: {\n      borderRadius: [0, 0, 5, 5]\n    },\n    lineStyle: {\n      width: 0,\n      color: 'source',\n      opacity: 0.2\n    },\n    label: {\n      show: true,\n      position: 'outside',\n      distance: 5\n    },\n    emphasis: {\n      focus: 'adjacency',\n      lineStyle: {\n        opacity: 0.5\n      }\n    }\n  };\n  return ChordSeriesModel;\n}(SeriesModel);\nexport default ChordSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { normalizeArcAngles } from 'zrender/lib/core/PathProxy.js';\nimport { getCircleLayout } from '../../util/layout.js';\nvar RADIAN = Math.PI / 180;\nexport default function chordCircularLayout(ecModel, api) {\n  ecModel.eachSeriesByType('chord', function (seriesModel) {\n    chordLayout(seriesModel, api);\n  });\n}\nfunction chordLayout(seriesModel, api) {\n  var nodeData = seriesModel.getData();\n  var nodeGraph = nodeData.graph;\n  var edgeData = seriesModel.getEdgeData();\n  var edgeCount = edgeData.count();\n  if (!edgeCount) {\n    return;\n  }\n  var _a = getCircleLayout(seriesModel, api),\n    cx = _a.cx,\n    cy = _a.cy,\n    r = _a.r,\n    r0 = _a.r0;\n  var padAngle = Math.max((seriesModel.get('padAngle') || 0) * RADIAN, 0);\n  var minAngle = Math.max((seriesModel.get('minAngle') || 0) * RADIAN, 0);\n  var startAngle = -seriesModel.get('startAngle') * RADIAN;\n  var endAngle = startAngle + Math.PI * 2;\n  var clockwise = seriesModel.get('clockwise');\n  var dir = clockwise ? 1 : -1;\n  // Normalize angles\n  var angles = [startAngle, endAngle];\n  normalizeArcAngles(angles, !clockwise);\n  var normalizedStartAngle = angles[0],\n    normalizedEndAngle = angles[1];\n  var totalAngle = normalizedEndAngle - normalizedStartAngle;\n  var allZero = nodeData.getSum('value') === 0 && edgeData.getSum('value') === 0;\n  // Sum of each node's edge values\n  var nodeValues = [];\n  var renderedNodeCount = 0;\n  nodeGraph.eachEdge(function (edge) {\n    // All links use the same value 1 when allZero is true\n    var value = allZero ? 1 : edge.getValue('value');\n    if (allZero && (value > 0 || minAngle)) {\n      // When allZero is true, angle is in direct proportion to number\n      // of links both in and out of the node.\n      renderedNodeCount += 2;\n    }\n    var node1Index = edge.node1.dataIndex;\n    var node2Index = edge.node2.dataIndex;\n    nodeValues[node1Index] = (nodeValues[node1Index] || 0) + value;\n    nodeValues[node2Index] = (nodeValues[node2Index] || 0) + value;\n  });\n  // Update nodeValues with data.value if exists\n  var nodeValueSum = 0;\n  nodeGraph.eachNode(function (node) {\n    var dataValue = node.getValue('value');\n    if (!isNaN(dataValue)) {\n      nodeValues[node.dataIndex] = Math.max(dataValue, nodeValues[node.dataIndex] || 0);\n    }\n    if (!allZero && (nodeValues[node.dataIndex] > 0 || minAngle)) {\n      // When allZero is false, angle is in direct proportion to node's\n      // value\n      renderedNodeCount++;\n    }\n    nodeValueSum += nodeValues[node.dataIndex] || 0;\n  });\n  if (renderedNodeCount === 0 || nodeValueSum === 0) {\n    return;\n  }\n  if (padAngle * renderedNodeCount >= Math.abs(totalAngle)) {\n    // Not enough angle to render the pad, minAngle has higher priority, and padAngle takes the rest\n    padAngle = Math.max(0, (Math.abs(totalAngle) - minAngle * renderedNodeCount) / renderedNodeCount);\n  }\n  if ((padAngle + minAngle) * renderedNodeCount >= Math.abs(totalAngle)) {\n    // Not enough angle to render the minAngle, so ignore the minAngle\n    minAngle = (Math.abs(totalAngle) - padAngle * renderedNodeCount) / renderedNodeCount;\n  }\n  var unitAngle = (totalAngle - padAngle * renderedNodeCount * dir) / nodeValueSum;\n  var totalDeficit = 0; // sum of deficits of nodes with span < minAngle\n  var totalSurplus = 0; // sum of (spans - minAngle) of nodes with span > minAngle\n  var totalSurplusSpan = 0; // sum of spans of nodes with span > minAngle\n  var minSurplus = Infinity; // min of (spans - minAngle) of nodes with span > minAngle\n  nodeGraph.eachNode(function (node) {\n    var value = nodeValues[node.dataIndex] || 0;\n    var spanAngle = unitAngle * (nodeValueSum ? value : 1) * dir;\n    if (Math.abs(spanAngle) < minAngle) {\n      totalDeficit += minAngle - Math.abs(spanAngle);\n    } else {\n      minSurplus = Math.min(minSurplus, Math.abs(spanAngle) - minAngle);\n      totalSurplus += Math.abs(spanAngle) - minAngle;\n      totalSurplusSpan += Math.abs(spanAngle);\n    }\n    node.setLayout({\n      angle: spanAngle,\n      value: value\n    });\n  });\n  var surplusAsMuchAsPossible = false;\n  if (totalDeficit > totalSurplus) {\n    // Not enough angle to spread the nodes, scale all\n    var scale_1 = totalDeficit / totalSurplus;\n    nodeGraph.eachNode(function (node) {\n      var spanAngle = node.getLayout().angle;\n      if (Math.abs(spanAngle) >= minAngle) {\n        node.setLayout({\n          angle: spanAngle * scale_1,\n          ratio: scale_1\n        }, true);\n      } else {\n        node.setLayout({\n          angle: minAngle,\n          ratio: minAngle === 0 ? 1 : spanAngle / minAngle\n        }, true);\n      }\n    });\n  } else {\n    // For example, if totalDeficit is 60 degrees and totalSurplus is 70\n    // degrees but one of the sector can only reduced by 1 degree,\n    // if we decrease it with the ratio of value to other surplused nodes,\n    // it will have smaller angle than minAngle itself.\n    // So we need to borrow some angle from other nodes.\n    nodeGraph.eachNode(function (node) {\n      if (surplusAsMuchAsPossible) {\n        return;\n      }\n      var spanAngle = node.getLayout().angle;\n      var borrowRatio = Math.min(spanAngle / totalSurplusSpan, 1);\n      var borrowAngle = borrowRatio * totalDeficit;\n      if (spanAngle - borrowAngle < minAngle) {\n        // It will have less than minAngle after borrowing\n        surplusAsMuchAsPossible = true;\n      }\n    });\n  }\n  var restDeficit = totalDeficit;\n  nodeGraph.eachNode(function (node) {\n    if (restDeficit <= 0) {\n      return;\n    }\n    var spanAngle = node.getLayout().angle;\n    if (spanAngle > minAngle && minAngle > 0) {\n      var borrowRatio = surplusAsMuchAsPossible ? 1 : Math.min(spanAngle / totalSurplusSpan, 1);\n      var maxBorrowAngle = spanAngle - minAngle;\n      var borrowAngle = Math.min(maxBorrowAngle, Math.min(restDeficit, totalDeficit * borrowRatio));\n      restDeficit -= borrowAngle;\n      node.setLayout({\n        angle: spanAngle - borrowAngle,\n        ratio: (spanAngle - borrowAngle) / spanAngle\n      }, true);\n    } else if (minAngle > 0) {\n      node.setLayout({\n        angle: minAngle,\n        ratio: spanAngle === 0 ? 1 : minAngle / spanAngle\n      }, true);\n    }\n  });\n  var angle = normalizedStartAngle;\n  var edgeAccAngle = [];\n  nodeGraph.eachNode(function (node) {\n    var spanAngle = Math.max(node.getLayout().angle, minAngle);\n    node.setLayout({\n      cx: cx,\n      cy: cy,\n      r0: r0,\n      r: r,\n      startAngle: angle,\n      endAngle: angle + spanAngle * dir,\n      clockwise: clockwise\n    }, true);\n    edgeAccAngle[node.dataIndex] = angle;\n    angle += (spanAngle + padAngle) * dir;\n  });\n  nodeGraph.eachEdge(function (edge) {\n    var value = allZero ? 1 : edge.getValue('value');\n    var spanAngle = unitAngle * (nodeValueSum ? value : 1) * dir;\n    var node1Index = edge.node1.dataIndex;\n    var sStartAngle = edgeAccAngle[node1Index] || 0;\n    var sSpan = Math.abs((edge.node1.getLayout().ratio || 1) * spanAngle);\n    var sEndAngle = sStartAngle + sSpan * dir;\n    var s1 = [cx + r0 * Math.cos(sStartAngle), cy + r0 * Math.sin(sStartAngle)];\n    var s2 = [cx + r0 * Math.cos(sEndAngle), cy + r0 * Math.sin(sEndAngle)];\n    var node2Index = edge.node2.dataIndex;\n    var tStartAngle = edgeAccAngle[node2Index] || 0;\n    var tSpan = Math.abs((edge.node2.getLayout().ratio || 1) * spanAngle);\n    var tEndAngle = tStartAngle + tSpan * dir;\n    var t1 = [cx + r0 * Math.cos(tStartAngle), cy + r0 * Math.sin(tStartAngle)];\n    var t2 = [cx + r0 * Math.cos(tEndAngle), cy + r0 * Math.sin(tEndAngle)];\n    edge.setLayout({\n      s1: s1,\n      s2: s2,\n      sStartAngle: sStartAngle,\n      sEndAngle: sEndAngle,\n      t1: t1,\n      t2: t2,\n      tStartAngle: tStartAngle,\n      tEndAngle: tEndAngle,\n      cx: cx,\n      cy: cy,\n      r: r0,\n      value: value,\n      clockwise: clockwise\n    });\n    edgeAccAngle[node1Index] = sEndAngle;\n    edgeAccAngle[node2Index] = tEndAngle;\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport ChordView from './ChordView.js';\nimport ChordSeriesModel from './ChordSeries.js';\nimport chordLayout from './chordLayout.js';\nimport dataFilter from '../../processor/dataFilter.js';\nexport function install(registers) {\n  registers.registerChartView(ChordView);\n  registers.registerSeriesModel(ChordSeriesModel);\n  registers.registerLayout(registers.PRIORITY.VISUAL.POST_CHART_LAYOUT, chordLayout);\n  // Add data filter processor\n  registers.registerProcessor(dataFilter('chord'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Path from 'zrender/lib/graphic/Path.js';\nvar PointerShape = /** @class */function () {\n  function PointerShape() {\n    this.angle = 0;\n    this.width = 10;\n    this.r = 10;\n    this.x = 0;\n    this.y = 0;\n  }\n  return PointerShape;\n}();\nvar PointerPath = /** @class */function (_super) {\n  __extends(PointerPath, _super);\n  function PointerPath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'pointer';\n    return _this;\n  }\n  PointerPath.prototype.getDefaultShape = function () {\n    return new PointerShape();\n  };\n  PointerPath.prototype.buildPath = function (ctx, shape) {\n    var mathCos = Math.cos;\n    var mathSin = Math.sin;\n    var r = shape.r;\n    var width = shape.width;\n    var angle = shape.angle;\n    var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);\n    var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);\n    angle = shape.angle - Math.PI / 2;\n    ctx.moveTo(x, y);\n    ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width);\n    ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r);\n    ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width);\n    ctx.lineTo(x, y);\n  };\n  return PointerPath;\n}(Path);\nexport default PointerPath;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport PointerPath from './PointerPath.js';\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport { createTextStyle, setLabelValueAnimation, animateLabelValue } from '../../label/labelStyle.js';\nimport ChartView from '../../view/Chart.js';\nimport { parsePercent, round, linearMap } from '../../util/number.js';\nimport Sausage from '../../util/shape/sausage.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport ZRImage from 'zrender/lib/graphic/Image.js';\nimport { extend, isFunction, isString, isNumber, each } from 'zrender/lib/core/util.js';\nimport { setCommonECData } from '../../util/innerStore.js';\nimport { normalizeArcAngles } from 'zrender/lib/core/PathProxy.js';\nfunction parsePosition(seriesModel, api) {\n  var center = seriesModel.get('center');\n  var width = api.getWidth();\n  var height = api.getHeight();\n  var size = Math.min(width, height);\n  var cx = parsePercent(center[0], api.getWidth());\n  var cy = parsePercent(center[1], api.getHeight());\n  var r = parsePercent(seriesModel.get('radius'), size / 2);\n  return {\n    cx: cx,\n    cy: cy,\n    r: r\n  };\n}\nfunction formatLabel(value, labelFormatter) {\n  var label = value == null ? '' : value + '';\n  if (labelFormatter) {\n    if (isString(labelFormatter)) {\n      label = labelFormatter.replace('{value}', label);\n    } else if (isFunction(labelFormatter)) {\n      label = labelFormatter(value);\n    }\n  }\n  return label;\n}\nvar GaugeView = /** @class */function (_super) {\n  __extends(GaugeView, _super);\n  function GaugeView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GaugeView.type;\n    return _this;\n  }\n  GaugeView.prototype.render = function (seriesModel, ecModel, api) {\n    this.group.removeAll();\n    var colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']);\n    var posInfo = parsePosition(seriesModel, api);\n    this._renderMain(seriesModel, ecModel, api, colorList, posInfo);\n    this._data = seriesModel.getData();\n  };\n  GaugeView.prototype.dispose = function () {};\n  GaugeView.prototype._renderMain = function (seriesModel, ecModel, api, colorList, posInfo) {\n    var group = this.group;\n    var clockwise = seriesModel.get('clockwise');\n    var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;\n    var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;\n    var axisLineModel = seriesModel.getModel('axisLine');\n    var roundCap = axisLineModel.get('roundCap');\n    var MainPath = roundCap ? Sausage : graphic.Sector;\n    var showAxis = axisLineModel.get('show');\n    var lineStyleModel = axisLineModel.getModel('lineStyle');\n    var axisLineWidth = lineStyleModel.get('width');\n    var angles = [startAngle, endAngle];\n    normalizeArcAngles(angles, !clockwise);\n    startAngle = angles[0];\n    endAngle = angles[1];\n    var angleRangeSpan = endAngle - startAngle;\n    var prevEndAngle = startAngle;\n    var sectors = [];\n    for (var i = 0; showAxis && i < colorList.length; i++) {\n      // Clamp\n      var percent = Math.min(Math.max(colorList[i][0], 0), 1);\n      endAngle = startAngle + angleRangeSpan * percent;\n      var sector = new MainPath({\n        shape: {\n          startAngle: prevEndAngle,\n          endAngle: endAngle,\n          cx: posInfo.cx,\n          cy: posInfo.cy,\n          clockwise: clockwise,\n          r0: posInfo.r - axisLineWidth,\n          r: posInfo.r\n        },\n        silent: true\n      });\n      sector.setStyle({\n        fill: colorList[i][1]\n      });\n      sector.setStyle(lineStyleModel.getLineStyle(\n      // Because we use sector to simulate arc\n      // so the properties for stroking are useless\n      ['color', 'width']));\n      sectors.push(sector);\n      prevEndAngle = endAngle;\n    }\n    sectors.reverse();\n    each(sectors, function (sector) {\n      return group.add(sector);\n    });\n    var getColor = function (percent) {\n      // Less than 0\n      if (percent <= 0) {\n        return colorList[0][1];\n      }\n      var i;\n      for (i = 0; i < colorList.length; i++) {\n        if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) {\n          return colorList[i][1];\n        }\n      }\n      // More than 1\n      return colorList[i - 1][1];\n    };\n    this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);\n    this._renderTitleAndDetail(seriesModel, ecModel, api, getColor, posInfo);\n    this._renderAnchor(seriesModel, posInfo);\n    this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth);\n  };\n  GaugeView.prototype._renderTicks = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {\n    var group = this.group;\n    var cx = posInfo.cx;\n    var cy = posInfo.cy;\n    var r = posInfo.r;\n    var minVal = +seriesModel.get('min');\n    var maxVal = +seriesModel.get('max');\n    var splitLineModel = seriesModel.getModel('splitLine');\n    var tickModel = seriesModel.getModel('axisTick');\n    var labelModel = seriesModel.getModel('axisLabel');\n    var splitNumber = seriesModel.get('splitNumber');\n    var subSplitNumber = tickModel.get('splitNumber');\n    var splitLineLen = parsePercent(splitLineModel.get('length'), r);\n    var tickLen = parsePercent(tickModel.get('length'), r);\n    var angle = startAngle;\n    var step = (endAngle - startAngle) / splitNumber;\n    var subStep = step / subSplitNumber;\n    var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();\n    var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();\n    var splitLineDistance = splitLineModel.get('distance');\n    var unitX;\n    var unitY;\n    for (var i = 0; i <= splitNumber; i++) {\n      unitX = Math.cos(angle);\n      unitY = Math.sin(angle);\n      // Split line\n      if (splitLineModel.get('show')) {\n        var distance = splitLineDistance ? splitLineDistance + axisLineWidth : axisLineWidth;\n        var splitLine = new graphic.Line({\n          shape: {\n            x1: unitX * (r - distance) + cx,\n            y1: unitY * (r - distance) + cy,\n            x2: unitX * (r - splitLineLen - distance) + cx,\n            y2: unitY * (r - splitLineLen - distance) + cy\n          },\n          style: splitLineStyle,\n          silent: true\n        });\n        if (splitLineStyle.stroke === 'auto') {\n          splitLine.setStyle({\n            stroke: getColor(i / splitNumber)\n          });\n        }\n        group.add(splitLine);\n      }\n      // Label\n      if (labelModel.get('show')) {\n        var distance = labelModel.get('distance') + splitLineDistance;\n        var label = formatLabel(round(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter'));\n        var autoColor = getColor(i / splitNumber);\n        var textStyleX = unitX * (r - splitLineLen - distance) + cx;\n        var textStyleY = unitY * (r - splitLineLen - distance) + cy;\n        var rotateType = labelModel.get('rotate');\n        var rotate = 0;\n        if (rotateType === 'radial') {\n          rotate = -angle + 2 * Math.PI;\n          if (rotate > Math.PI / 2) {\n            rotate += Math.PI;\n          }\n        } else if (rotateType === 'tangential') {\n          rotate = -angle - Math.PI / 2;\n        } else if (isNumber(rotateType)) {\n          rotate = rotateType * Math.PI / 180;\n        }\n        if (rotate === 0) {\n          group.add(new graphic.Text({\n            style: createTextStyle(labelModel, {\n              text: label,\n              x: textStyleX,\n              y: textStyleY,\n              verticalAlign: unitY < -0.8 ? 'top' : unitY > 0.8 ? 'bottom' : 'middle',\n              align: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center'\n            }, {\n              inheritColor: autoColor\n            }),\n            silent: true\n          }));\n        } else {\n          group.add(new graphic.Text({\n            style: createTextStyle(labelModel, {\n              text: label,\n              x: textStyleX,\n              y: textStyleY,\n              verticalAlign: 'middle',\n              align: 'center'\n            }, {\n              inheritColor: autoColor\n            }),\n            silent: true,\n            originX: textStyleX,\n            originY: textStyleY,\n            rotation: rotate\n          }));\n        }\n      }\n      // Axis tick\n      if (tickModel.get('show') && i !== splitNumber) {\n        var distance = tickModel.get('distance');\n        distance = distance ? distance + axisLineWidth : axisLineWidth;\n        for (var j = 0; j <= subSplitNumber; j++) {\n          unitX = Math.cos(angle);\n          unitY = Math.sin(angle);\n          var tickLine = new graphic.Line({\n            shape: {\n              x1: unitX * (r - distance) + cx,\n              y1: unitY * (r - distance) + cy,\n              x2: unitX * (r - tickLen - distance) + cx,\n              y2: unitY * (r - tickLen - distance) + cy\n            },\n            silent: true,\n            style: tickLineStyle\n          });\n          if (tickLineStyle.stroke === 'auto') {\n            tickLine.setStyle({\n              stroke: getColor((i + j / subSplitNumber) / splitNumber)\n            });\n          }\n          group.add(tickLine);\n          angle += subStep;\n        }\n        angle -= subStep;\n      } else {\n        angle += step;\n      }\n    }\n  };\n  GaugeView.prototype._renderPointer = function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise, axisLineWidth) {\n    var group = this.group;\n    var oldData = this._data;\n    var oldProgressData = this._progressEls;\n    var progressList = [];\n    var showPointer = seriesModel.get(['pointer', 'show']);\n    var progressModel = seriesModel.getModel('progress');\n    var showProgress = progressModel.get('show');\n    var data = seriesModel.getData();\n    var valueDim = data.mapDimension('value');\n    var minVal = +seriesModel.get('min');\n    var maxVal = +seriesModel.get('max');\n    var valueExtent = [minVal, maxVal];\n    var angleExtent = [startAngle, endAngle];\n    function createPointer(idx, angle) {\n      var itemModel = data.getItemModel(idx);\n      var pointerModel = itemModel.getModel('pointer');\n      var pointerWidth = parsePercent(pointerModel.get('width'), posInfo.r);\n      var pointerLength = parsePercent(pointerModel.get('length'), posInfo.r);\n      var pointerStr = seriesModel.get(['pointer', 'icon']);\n      var pointerOffset = pointerModel.get('offsetCenter');\n      var pointerOffsetX = parsePercent(pointerOffset[0], posInfo.r);\n      var pointerOffsetY = parsePercent(pointerOffset[1], posInfo.r);\n      var pointerKeepAspect = pointerModel.get('keepAspect');\n      var pointer;\n      // not exist icon type will be set 'rect'\n      if (pointerStr) {\n        pointer = createSymbol(pointerStr, pointerOffsetX - pointerWidth / 2, pointerOffsetY - pointerLength, pointerWidth, pointerLength, null, pointerKeepAspect);\n      } else {\n        pointer = new PointerPath({\n          shape: {\n            angle: -Math.PI / 2,\n            width: pointerWidth,\n            r: pointerLength,\n            x: pointerOffsetX,\n            y: pointerOffsetY\n          }\n        });\n      }\n      pointer.rotation = -(angle + Math.PI / 2);\n      pointer.x = posInfo.cx;\n      pointer.y = posInfo.cy;\n      return pointer;\n    }\n    function createProgress(idx, endAngle) {\n      var roundCap = progressModel.get('roundCap');\n      var ProgressPath = roundCap ? Sausage : graphic.Sector;\n      var isOverlap = progressModel.get('overlap');\n      var progressWidth = isOverlap ? progressModel.get('width') : axisLineWidth / data.count();\n      var r0 = isOverlap ? posInfo.r - progressWidth : posInfo.r - (idx + 1) * progressWidth;\n      var r = isOverlap ? posInfo.r : posInfo.r - idx * progressWidth;\n      var progress = new ProgressPath({\n        shape: {\n          startAngle: startAngle,\n          endAngle: endAngle,\n          cx: posInfo.cx,\n          cy: posInfo.cy,\n          clockwise: clockwise,\n          r0: r0,\n          r: r\n        }\n      });\n      isOverlap && (progress.z2 = linearMap(data.get(valueDim, idx), [minVal, maxVal], [100, 0], true));\n      return progress;\n    }\n    if (showProgress || showPointer) {\n      data.diff(oldData).add(function (idx) {\n        var val = data.get(valueDim, idx);\n        if (showPointer) {\n          var pointer = createPointer(idx, startAngle);\n          // TODO hide pointer on NaN value?\n          graphic.initProps(pointer, {\n            rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2)\n          }, seriesModel);\n          group.add(pointer);\n          data.setItemGraphicEl(idx, pointer);\n        }\n        if (showProgress) {\n          var progress = createProgress(idx, startAngle);\n          var isClip = progressModel.get('clip');\n          graphic.initProps(progress, {\n            shape: {\n              endAngle: linearMap(val, valueExtent, angleExtent, isClip)\n            }\n          }, seriesModel);\n          group.add(progress);\n          // Add data index and series index for indexing the data by element\n          // Useful in tooltip\n          setCommonECData(seriesModel.seriesIndex, data.dataType, idx, progress);\n          progressList[idx] = progress;\n        }\n      }).update(function (newIdx, oldIdx) {\n        var val = data.get(valueDim, newIdx);\n        if (showPointer) {\n          var previousPointer = oldData.getItemGraphicEl(oldIdx);\n          var previousRotate = previousPointer ? previousPointer.rotation : startAngle;\n          var pointer = createPointer(newIdx, previousRotate);\n          pointer.rotation = previousRotate;\n          graphic.updateProps(pointer, {\n            rotation: -((isNaN(+val) ? angleExtent[0] : linearMap(val, valueExtent, angleExtent, true)) + Math.PI / 2)\n          }, seriesModel);\n          group.add(pointer);\n          data.setItemGraphicEl(newIdx, pointer);\n        }\n        if (showProgress) {\n          var previousProgress = oldProgressData[oldIdx];\n          var previousEndAngle = previousProgress ? previousProgress.shape.endAngle : startAngle;\n          var progress = createProgress(newIdx, previousEndAngle);\n          var isClip = progressModel.get('clip');\n          graphic.updateProps(progress, {\n            shape: {\n              endAngle: linearMap(val, valueExtent, angleExtent, isClip)\n            }\n          }, seriesModel);\n          group.add(progress);\n          // Add data index and series index for indexing the data by element\n          // Useful in tooltip\n          setCommonECData(seriesModel.seriesIndex, data.dataType, newIdx, progress);\n          progressList[newIdx] = progress;\n        }\n      }).execute();\n      data.each(function (idx) {\n        var itemModel = data.getItemModel(idx);\n        var emphasisModel = itemModel.getModel('emphasis');\n        var focus = emphasisModel.get('focus');\n        var blurScope = emphasisModel.get('blurScope');\n        var emphasisDisabled = emphasisModel.get('disabled');\n        if (showPointer) {\n          var pointer = data.getItemGraphicEl(idx);\n          var symbolStyle = data.getItemVisual(idx, 'style');\n          var visualColor = symbolStyle.fill;\n          if (pointer instanceof ZRImage) {\n            var pathStyle = pointer.style;\n            pointer.useStyle(extend({\n              image: pathStyle.image,\n              x: pathStyle.x,\n              y: pathStyle.y,\n              width: pathStyle.width,\n              height: pathStyle.height\n            }, symbolStyle));\n          } else {\n            pointer.useStyle(symbolStyle);\n            pointer.type !== 'pointer' && pointer.setColor(visualColor);\n          }\n          pointer.setStyle(itemModel.getModel(['pointer', 'itemStyle']).getItemStyle());\n          if (pointer.style.fill === 'auto') {\n            pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true)));\n          }\n          pointer.z2EmphasisLift = 0;\n          setStatesStylesFromModel(pointer, itemModel);\n          toggleHoverEmphasis(pointer, focus, blurScope, emphasisDisabled);\n        }\n        if (showProgress) {\n          var progress = progressList[idx];\n          progress.useStyle(data.getItemVisual(idx, 'style'));\n          progress.setStyle(itemModel.getModel(['progress', 'itemStyle']).getItemStyle());\n          progress.z2EmphasisLift = 0;\n          setStatesStylesFromModel(progress, itemModel);\n          toggleHoverEmphasis(progress, focus, blurScope, emphasisDisabled);\n        }\n      });\n      this._progressEls = progressList;\n    }\n  };\n  GaugeView.prototype._renderAnchor = function (seriesModel, posInfo) {\n    var anchorModel = seriesModel.getModel('anchor');\n    var showAnchor = anchorModel.get('show');\n    if (showAnchor) {\n      var anchorSize = anchorModel.get('size');\n      var anchorType = anchorModel.get('icon');\n      var offsetCenter = anchorModel.get('offsetCenter');\n      var anchorKeepAspect = anchorModel.get('keepAspect');\n      var anchor = createSymbol(anchorType, posInfo.cx - anchorSize / 2 + parsePercent(offsetCenter[0], posInfo.r), posInfo.cy - anchorSize / 2 + parsePercent(offsetCenter[1], posInfo.r), anchorSize, anchorSize, null, anchorKeepAspect);\n      anchor.z2 = anchorModel.get('showAbove') ? 1 : 0;\n      anchor.setStyle(anchorModel.getModel('itemStyle').getItemStyle());\n      this.group.add(anchor);\n    }\n  };\n  GaugeView.prototype._renderTitleAndDetail = function (seriesModel, ecModel, api, getColor, posInfo) {\n    var _this = this;\n    var data = seriesModel.getData();\n    var valueDim = data.mapDimension('value');\n    var minVal = +seriesModel.get('min');\n    var maxVal = +seriesModel.get('max');\n    var contentGroup = new graphic.Group();\n    var newTitleEls = [];\n    var newDetailEls = [];\n    var hasAnimation = seriesModel.isAnimationEnabled();\n    var showPointerAbove = seriesModel.get(['pointer', 'showAbove']);\n    data.diff(this._data).add(function (idx) {\n      newTitleEls[idx] = new graphic.Text({\n        silent: true\n      });\n      newDetailEls[idx] = new graphic.Text({\n        silent: true\n      });\n    }).update(function (idx, oldIdx) {\n      newTitleEls[idx] = _this._titleEls[oldIdx];\n      newDetailEls[idx] = _this._detailEls[oldIdx];\n    }).execute();\n    data.each(function (idx) {\n      var itemModel = data.getItemModel(idx);\n      var value = data.get(valueDim, idx);\n      var itemGroup = new graphic.Group();\n      var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true));\n      var itemTitleModel = itemModel.getModel('title');\n      if (itemTitleModel.get('show')) {\n        var titleOffsetCenter = itemTitleModel.get('offsetCenter');\n        var titleX = posInfo.cx + parsePercent(titleOffsetCenter[0], posInfo.r);\n        var titleY = posInfo.cy + parsePercent(titleOffsetCenter[1], posInfo.r);\n        var labelEl = newTitleEls[idx];\n        labelEl.attr({\n          z2: showPointerAbove ? 0 : 2,\n          style: createTextStyle(itemTitleModel, {\n            x: titleX,\n            y: titleY,\n            text: data.getName(idx),\n            align: 'center',\n            verticalAlign: 'middle'\n          }, {\n            inheritColor: autoColor\n          })\n        });\n        itemGroup.add(labelEl);\n      }\n      var itemDetailModel = itemModel.getModel('detail');\n      if (itemDetailModel.get('show')) {\n        var detailOffsetCenter = itemDetailModel.get('offsetCenter');\n        var detailX = posInfo.cx + parsePercent(detailOffsetCenter[0], posInfo.r);\n        var detailY = posInfo.cy + parsePercent(detailOffsetCenter[1], posInfo.r);\n        var width = parsePercent(itemDetailModel.get('width'), posInfo.r);\n        var height = parsePercent(itemDetailModel.get('height'), posInfo.r);\n        var detailColor = seriesModel.get(['progress', 'show']) ? data.getItemVisual(idx, 'style').fill : autoColor;\n        var labelEl = newDetailEls[idx];\n        var formatter_1 = itemDetailModel.get('formatter');\n        labelEl.attr({\n          z2: showPointerAbove ? 0 : 2,\n          style: createTextStyle(itemDetailModel, {\n            x: detailX,\n            y: detailY,\n            text: formatLabel(value, formatter_1),\n            width: isNaN(width) ? null : width,\n            height: isNaN(height) ? null : height,\n            align: 'center',\n            verticalAlign: 'middle'\n          }, {\n            inheritColor: detailColor\n          })\n        });\n        setLabelValueAnimation(labelEl, {\n          normal: itemDetailModel\n        }, value, function (value) {\n          return formatLabel(value, formatter_1);\n        });\n        hasAnimation && animateLabelValue(labelEl, idx, data, seriesModel, {\n          getFormattedLabel: function (labelDataIndex, status, dataType, labelDimIndex, fmt, extendParams) {\n            return formatLabel(extendParams ? extendParams.interpolatedValue : value, formatter_1);\n          }\n        });\n        itemGroup.add(labelEl);\n      }\n      contentGroup.add(itemGroup);\n    });\n    this.group.add(contentGroup);\n    this._titleEls = newTitleEls;\n    this._detailEls = newDetailEls;\n  };\n  GaugeView.type = 'gauge';\n  return GaugeView;\n}(ChartView);\nexport default GaugeView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport createSeriesDataSimply from '../helper/createSeriesDataSimply.js';\nimport SeriesModel from '../../model/Series.js';\nimport tokens from '../../visual/tokens.js';\nvar GaugeSeriesModel = /** @class */function (_super) {\n  __extends(GaugeSeriesModel, _super);\n  function GaugeSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GaugeSeriesModel.type;\n    _this.visualStyleAccessPath = 'itemStyle';\n    return _this;\n  }\n  GaugeSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesDataSimply(this, ['value']);\n  };\n  GaugeSeriesModel.type = 'series.gauge';\n  GaugeSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    colorBy: 'data',\n    // \u9ED8\u8BA4\u5168\u5C40\u5C45\u4E2D\n    center: ['50%', '50%'],\n    legendHoverLink: true,\n    radius: '75%',\n    startAngle: 225,\n    endAngle: -45,\n    clockwise: true,\n    // \u6700\u5C0F\u503C\n    min: 0,\n    // \u6700\u5927\u503C\n    max: 100,\n    // \u5206\u5272\u6BB5\u6570\uFF0C\u9ED8\u8BA4\u4E3A10\n    splitNumber: 10,\n    // \u5750\u6807\u8F74\u7EBF\n    axisLine: {\n      // \u9ED8\u8BA4\u663E\u793A\uFF0C\u5C5E\u6027show\u63A7\u5236\u663E\u793A\u4E0E\u5426\n      show: true,\n      roundCap: false,\n      lineStyle: {\n        color: [[1, tokens.color.neutral10]],\n        width: 10\n      }\n    },\n    // \u5750\u6807\u8F74\u7EBF\n    progress: {\n      // \u9ED8\u8BA4\u663E\u793A\uFF0C\u5C5E\u6027show\u63A7\u5236\u663E\u793A\u4E0E\u5426\n      show: false,\n      overlap: true,\n      width: 10,\n      roundCap: false,\n      clip: true\n    },\n    // \u5206\u9694\u7EBF\n    splitLine: {\n      // \u9ED8\u8BA4\u663E\u793A\uFF0C\u5C5E\u6027show\u63A7\u5236\u663E\u793A\u4E0E\u5426\n      show: true,\n      // \u5C5E\u6027length\u63A7\u5236\u7EBF\u957F\n      length: 10,\n      distance: 10,\n      // \u5C5E\u6027lineStyle\uFF08\u8BE6\u89C1lineStyle\uFF09\u63A7\u5236\u7EBF\u6761\u6837\u5F0F\n      lineStyle: {\n        color: tokens.color.axisTick,\n        width: 3,\n        type: 'solid'\n      }\n    },\n    // \u5750\u6807\u8F74\u5C0F\u6807\u8BB0\n    axisTick: {\n      // \u5C5E\u6027show\u63A7\u5236\u663E\u793A\u4E0E\u5426\uFF0C\u9ED8\u8BA4\u4E0D\u663E\u793A\n      show: true,\n      // \u6BCF\u4EFDsplit\u7EC6\u5206\u591A\u5C11\u6BB5\n      splitNumber: 5,\n      // \u5C5E\u6027length\u63A7\u5236\u7EBF\u957F\n      length: 6,\n      distance: 10,\n      // \u5C5E\u6027lineStyle\u63A7\u5236\u7EBF\u6761\u6837\u5F0F\n      lineStyle: {\n        color: tokens.color.axisTickMinor,\n        width: 1,\n        type: 'solid'\n      }\n    },\n    axisLabel: {\n      show: true,\n      distance: 15,\n      // formatter: null,\n      color: tokens.color.axisLabel,\n      fontSize: 12,\n      rotate: 0\n    },\n    pointer: {\n      icon: null,\n      offsetCenter: [0, 0],\n      show: true,\n      showAbove: true,\n      length: '60%',\n      width: 6,\n      keepAspect: false\n    },\n    anchor: {\n      show: false,\n      showAbove: false,\n      size: 6,\n      icon: 'circle',\n      offsetCenter: [0, 0],\n      keepAspect: false,\n      itemStyle: {\n        color: tokens.color.neutral00,\n        borderWidth: 0,\n        borderColor: tokens.color.theme[0]\n      }\n    },\n    title: {\n      show: true,\n      // x, y\uFF0C\u5355\u4F4Dpx\n      offsetCenter: [0, '20%'],\n      // \u5176\u4F59\u5C5E\u6027\u9ED8\u8BA4\u4F7F\u7528\u5168\u5C40\u6587\u672C\u6837\u5F0F\uFF0C\u8BE6\u89C1TEXTSTYLE\n      color: tokens.color.secondary,\n      fontSize: 16,\n      valueAnimation: false\n    },\n    detail: {\n      show: true,\n      backgroundColor: tokens.color.transparent,\n      borderWidth: 0,\n      borderColor: tokens.color.neutral40,\n      width: 100,\n      height: null,\n      padding: [5, 10],\n      // x, y\uFF0C\u5355\u4F4Dpx\n      offsetCenter: [0, '40%'],\n      // formatter: null,\n      // \u5176\u4F59\u5C5E\u6027\u9ED8\u8BA4\u4F7F\u7528\u5168\u5C40\u6587\u672C\u6837\u5F0F\uFF0C\u8BE6\u89C1TEXTSTYLE\n      color: tokens.color.primary,\n      fontSize: 30,\n      fontWeight: 'bold',\n      lineHeight: 30,\n      valueAnimation: false\n    }\n  };\n  return GaugeSeriesModel;\n}(SeriesModel);\nexport default GaugeSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport GaugeView from './GaugeView.js';\nimport GaugeSeriesModel from './GaugeSeries.js';\nexport function install(registers) {\n  registers.registerChartView(GaugeView);\n  registers.registerSeriesModel(GaugeSeriesModel);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport ChartView from '../../view/Chart.js';\nimport { setLabelLineStyle, getLabelLineStatesModels } from '../../label/labelGuideHelper.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nvar opacityAccessPath = ['itemStyle', 'opacity'];\n/**\n * Piece of pie including Sector, Label, LabelLine\n */\nvar FunnelPiece = /** @class */function (_super) {\n  __extends(FunnelPiece, _super);\n  function FunnelPiece(data, idx) {\n    var _this = _super.call(this) || this;\n    var polygon = _this;\n    var labelLine = new graphic.Polyline();\n    var text = new graphic.Text();\n    polygon.setTextContent(text);\n    _this.setTextGuideLine(labelLine);\n    _this.updateData(data, idx, true);\n    return _this;\n  }\n  FunnelPiece.prototype.updateData = function (data, idx, firstCreate) {\n    var polygon = this;\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var layout = data.getItemLayout(idx);\n    var emphasisModel = itemModel.getModel('emphasis');\n    var opacity = itemModel.get(opacityAccessPath);\n    opacity = opacity == null ? 1 : opacity;\n    if (!firstCreate) {\n      saveOldStyle(polygon);\n    }\n    // Update common style\n    polygon.useStyle(data.getItemVisual(idx, 'style'));\n    polygon.style.lineJoin = 'round';\n    if (firstCreate) {\n      polygon.setShape({\n        points: layout.points\n      });\n      polygon.style.opacity = 0;\n      graphic.initProps(polygon, {\n        style: {\n          opacity: opacity\n        }\n      }, seriesModel, idx);\n    } else {\n      graphic.updateProps(polygon, {\n        style: {\n          opacity: opacity\n        },\n        shape: {\n          points: layout.points\n        }\n      }, seriesModel, idx);\n    }\n    setStatesStylesFromModel(polygon, itemModel);\n    this._updateLabel(data, idx);\n    toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  };\n  FunnelPiece.prototype._updateLabel = function (data, idx) {\n    var polygon = this;\n    var labelLine = this.getTextGuideLine();\n    var labelText = polygon.getTextContent();\n    var seriesModel = data.hostModel;\n    var itemModel = data.getItemModel(idx);\n    var layout = data.getItemLayout(idx);\n    var labelLayout = layout.label;\n    var style = data.getItemVisual(idx, 'style');\n    var visualColor = style.fill;\n    setLabelStyle(\n    // position will not be used in setLabelStyle\n    labelText, getLabelStatesModels(itemModel), {\n      labelFetcher: data.hostModel,\n      labelDataIndex: idx,\n      defaultOpacity: style.opacity,\n      defaultText: data.getName(idx)\n    }, {\n      normal: {\n        align: labelLayout.textAlign,\n        verticalAlign: labelLayout.verticalAlign\n      }\n    });\n    var labelModel = itemModel.getModel('label');\n    var labelColor = labelModel.get('color');\n    var overrideColor = labelColor === 'inherit' ? visualColor : null;\n    polygon.setTextConfig({\n      local: true,\n      inside: !!labelLayout.inside,\n      insideStroke: overrideColor,\n      outsideFill: overrideColor\n    });\n    var linePoints = labelLayout.linePoints;\n    labelLine.setShape({\n      points: linePoints\n    });\n    polygon.textGuideLineConfig = {\n      anchor: linePoints ? new graphic.Point(linePoints[0][0], linePoints[0][1]) : null\n    };\n    // Make sure update style on labelText after setLabelStyle.\n    // Because setLabelStyle will replace a new style on it.\n    graphic.updateProps(labelText, {\n      style: {\n        x: labelLayout.x,\n        y: labelLayout.y\n      }\n    }, seriesModel, idx);\n    labelText.attr({\n      rotation: labelLayout.rotation,\n      originX: labelLayout.x,\n      originY: labelLayout.y,\n      z2: 10\n    });\n    setLabelLineStyle(polygon, getLabelLineStatesModels(itemModel), {\n      // Default use item visual color\n      stroke: visualColor\n    });\n  };\n  return FunnelPiece;\n}(graphic.Polygon);\nvar FunnelView = /** @class */function (_super) {\n  __extends(FunnelView, _super);\n  function FunnelView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = FunnelView.type;\n    _this.ignoreLabelLineUpdate = true;\n    return _this;\n  }\n  FunnelView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var group = this.group;\n    data.diff(oldData).add(function (idx) {\n      var funnelPiece = new FunnelPiece(data, idx);\n      data.setItemGraphicEl(idx, funnelPiece);\n      group.add(funnelPiece);\n    }).update(function (newIdx, oldIdx) {\n      var piece = oldData.getItemGraphicEl(oldIdx);\n      piece.updateData(data, newIdx);\n      group.add(piece);\n      data.setItemGraphicEl(newIdx, piece);\n    }).remove(function (idx) {\n      var piece = oldData.getItemGraphicEl(idx);\n      graphic.removeElementWithFadeOut(piece, seriesModel, idx);\n    }).execute();\n    this._data = data;\n  };\n  FunnelView.prototype.remove = function () {\n    this.group.removeAll();\n    this._data = null;\n  };\n  FunnelView.prototype.dispose = function () {};\n  FunnelView.type = 'funnel';\n  return FunnelView;\n}(ChartView);\nexport default FunnelView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport createSeriesDataSimply from '../helper/createSeriesDataSimply.js';\nimport { defaultEmphasis } from '../../util/model.js';\nimport { makeSeriesEncodeForNameBased } from '../../data/helper/sourceHelper.js';\nimport LegendVisualProvider from '../../visual/LegendVisualProvider.js';\nimport SeriesModel from '../../model/Series.js';\nimport tokens from '../../visual/tokens.js';\nvar FunnelSeriesModel = /** @class */function (_super) {\n  __extends(FunnelSeriesModel, _super);\n  function FunnelSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = FunnelSeriesModel.type;\n    return _this;\n  }\n  FunnelSeriesModel.prototype.init = function (option) {\n    _super.prototype.init.apply(this, arguments);\n    // Enable legend selection for each data item\n    // Use a function instead of direct access because data reference may changed\n    this.legendVisualProvider = new LegendVisualProvider(zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this));\n    // Extend labelLine emphasis\n    this._defaultLabelLine(option);\n  };\n  FunnelSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesDataSimply(this, {\n      coordDimensions: ['value'],\n      encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)\n    });\n  };\n  FunnelSeriesModel.prototype._defaultLabelLine = function (option) {\n    // Extend labelLine emphasis\n    defaultEmphasis(option, 'labelLine', ['show']);\n    var labelLineNormalOpt = option.labelLine;\n    var labelLineEmphasisOpt = option.emphasis.labelLine;\n    // Not show label line if `label.normal.show = false`\n    labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show;\n    labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show;\n  };\n  // Overwrite\n  FunnelSeriesModel.prototype.getDataParams = function (dataIndex) {\n    var data = this.getData();\n    var params = _super.prototype.getDataParams.call(this, dataIndex);\n    var valueDim = data.mapDimension('value');\n    var sum = data.getSum(valueDim);\n    // Percent is 0 if sum is 0\n    params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2);\n    params.$vars.push('percent');\n    return params;\n  };\n  FunnelSeriesModel.type = 'series.funnel';\n  FunnelSeriesModel.defaultOption = {\n    coordinateSystemUsage: 'box',\n    // zlevel: 0,                  // \u4E00\u7EA7\u5C42\u53E0\n    z: 2,\n    legendHoverLink: true,\n    colorBy: 'data',\n    left: 80,\n    top: 60,\n    right: 80,\n    bottom: 65,\n    // width: {totalWidth} - left - right,\n    // height: {totalHeight} - top - bottom,\n    // \u9ED8\u8BA4\u53D6\u6570\u636E\u6700\u5C0F\u6700\u5927\u503C\n    // min: 0,\n    // max: 100,\n    minSize: '0%',\n    maxSize: '100%',\n    sort: 'descending',\n    orient: 'vertical',\n    gap: 0,\n    funnelAlign: 'center',\n    label: {\n      show: true,\n      position: 'outer'\n      // formatter: \u6807\u7B7E\u6587\u672C\u683C\u5F0F\u5668\uFF0C\u540CTooltip.formatter\uFF0C\u4E0D\u652F\u6301\u5F02\u6B65\u56DE\u8C03\n    },\n    labelLine: {\n      show: true,\n      length: 20,\n      lineStyle: {\n        // color: \u5404\u5F02,\n        width: 1\n      }\n    },\n    itemStyle: {\n      // color: \u5404\u5F02,\n      borderColor: tokens.color.neutral00,\n      borderWidth: 1\n    },\n    emphasis: {\n      label: {\n        show: true\n      }\n    },\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary\n      }\n    }\n  };\n  return FunnelSeriesModel;\n}(SeriesModel);\nexport default FunnelSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as layout from '../../util/layout.js';\nimport { parsePercent, linearMap } from '../../util/number.js';\nimport { isFunction } from 'zrender/lib/core/util.js';\nfunction getSortedIndices(data, sort) {\n  var valueDim = data.mapDimension('value');\n  var valueArr = data.mapArray(valueDim, function (val) {\n    return val;\n  });\n  var indices = [];\n  var isAscending = sort === 'ascending';\n  for (var i = 0, len = data.count(); i < len; i++) {\n    indices[i] = i;\n  }\n  // Add custom sortable function & none sortable opetion by \"options.sort\"\n  if (isFunction(sort)) {\n    indices.sort(sort);\n  } else if (sort !== 'none') {\n    indices.sort(function (a, b) {\n      return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a];\n    });\n  }\n  return indices;\n}\nfunction labelLayout(data) {\n  var seriesModel = data.hostModel;\n  var orient = seriesModel.get('orient');\n  data.each(function (idx) {\n    var itemModel = data.getItemModel(idx);\n    var labelModel = itemModel.getModel('label');\n    var labelPosition = labelModel.get('position');\n    var labelLineModel = itemModel.getModel('labelLine');\n    var layout = data.getItemLayout(idx);\n    var points = layout.points;\n    var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center' || labelPosition === 'insideLeft' || labelPosition === 'insideRight';\n    var textAlign;\n    var textX;\n    var textY;\n    var linePoints;\n    if (isLabelInside) {\n      if (labelPosition === 'insideLeft') {\n        textX = (points[0][0] + points[3][0]) / 2 + 5;\n        textY = (points[0][1] + points[3][1]) / 2;\n        textAlign = 'left';\n      } else if (labelPosition === 'insideRight') {\n        textX = (points[1][0] + points[2][0]) / 2 - 5;\n        textY = (points[1][1] + points[2][1]) / 2;\n        textAlign = 'right';\n      } else {\n        textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4;\n        textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4;\n        textAlign = 'center';\n      }\n      linePoints = [[textX, textY], [textX, textY]];\n    } else {\n      var x1 = void 0;\n      var y1 = void 0;\n      var x2 = void 0;\n      var y2 = void 0;\n      var labelLineLen = labelLineModel.get('length');\n      if (process.env.NODE_ENV !== 'production') {\n        if (orient === 'vertical' && ['top', 'bottom'].indexOf(labelPosition) > -1) {\n          labelPosition = 'left';\n          console.warn('Position error: Funnel chart on vertical orient dose not support top and bottom.');\n        }\n        if (orient === 'horizontal' && ['left', 'right'].indexOf(labelPosition) > -1) {\n          labelPosition = 'bottom';\n          console.warn('Position error: Funnel chart on horizontal orient dose not support left and right.');\n        }\n      }\n      if (labelPosition === 'left') {\n        // Left side\n        x1 = (points[3][0] + points[0][0]) / 2;\n        y1 = (points[3][1] + points[0][1]) / 2;\n        x2 = x1 - labelLineLen;\n        textX = x2 - 5;\n        textAlign = 'right';\n      } else if (labelPosition === 'right') {\n        // Right side\n        x1 = (points[1][0] + points[2][0]) / 2;\n        y1 = (points[1][1] + points[2][1]) / 2;\n        x2 = x1 + labelLineLen;\n        textX = x2 + 5;\n        textAlign = 'left';\n      } else if (labelPosition === 'top') {\n        // Top side\n        x1 = (points[3][0] + points[0][0]) / 2;\n        y1 = (points[3][1] + points[0][1]) / 2;\n        y2 = y1 - labelLineLen;\n        textY = y2 - 5;\n        textAlign = 'center';\n      } else if (labelPosition === 'bottom') {\n        // Bottom side\n        x1 = (points[1][0] + points[2][0]) / 2;\n        y1 = (points[1][1] + points[2][1]) / 2;\n        y2 = y1 + labelLineLen;\n        textY = y2 + 5;\n        textAlign = 'center';\n      } else if (labelPosition === 'rightTop') {\n        // RightTop side\n        x1 = orient === 'horizontal' ? points[3][0] : points[1][0];\n        y1 = orient === 'horizontal' ? points[3][1] : points[1][1];\n        if (orient === 'horizontal') {\n          y2 = y1 - labelLineLen;\n          textY = y2 - 5;\n          textAlign = 'center';\n        } else {\n          x2 = x1 + labelLineLen;\n          textX = x2 + 5;\n          textAlign = 'top';\n        }\n      } else if (labelPosition === 'rightBottom') {\n        // RightBottom side\n        x1 = points[2][0];\n        y1 = points[2][1];\n        if (orient === 'horizontal') {\n          y2 = y1 + labelLineLen;\n          textY = y2 + 5;\n          textAlign = 'center';\n        } else {\n          x2 = x1 + labelLineLen;\n          textX = x2 + 5;\n          textAlign = 'bottom';\n        }\n      } else if (labelPosition === 'leftTop') {\n        // LeftTop side\n        x1 = points[0][0];\n        y1 = orient === 'horizontal' ? points[0][1] : points[1][1];\n        if (orient === 'horizontal') {\n          y2 = y1 - labelLineLen;\n          textY = y2 - 5;\n          textAlign = 'center';\n        } else {\n          x2 = x1 - labelLineLen;\n          textX = x2 - 5;\n          textAlign = 'right';\n        }\n      } else if (labelPosition === 'leftBottom') {\n        // LeftBottom side\n        x1 = orient === 'horizontal' ? points[1][0] : points[3][0];\n        y1 = orient === 'horizontal' ? points[1][1] : points[2][1];\n        if (orient === 'horizontal') {\n          y2 = y1 + labelLineLen;\n          textY = y2 + 5;\n          textAlign = 'center';\n        } else {\n          x2 = x1 - labelLineLen;\n          textX = x2 - 5;\n          textAlign = 'right';\n        }\n      } else {\n        // Right side or Bottom side\n        x1 = (points[1][0] + points[2][0]) / 2;\n        y1 = (points[1][1] + points[2][1]) / 2;\n        if (orient === 'horizontal') {\n          y2 = y1 + labelLineLen;\n          textY = y2 + 5;\n          textAlign = 'center';\n        } else {\n          x2 = x1 + labelLineLen;\n          textX = x2 + 5;\n          textAlign = 'left';\n        }\n      }\n      if (orient === 'horizontal') {\n        x2 = x1;\n        textX = x2;\n      } else {\n        y2 = y1;\n        textY = y2;\n      }\n      linePoints = [[x1, y1], [x2, y2]];\n    }\n    layout.label = {\n      linePoints: linePoints,\n      x: textX,\n      y: textY,\n      verticalAlign: 'middle',\n      textAlign: textAlign,\n      inside: isLabelInside\n    };\n  });\n}\nexport default function funnelLayout(ecModel, api) {\n  ecModel.eachSeriesByType('funnel', function (seriesModel) {\n    var data = seriesModel.getData();\n    var valueDim = data.mapDimension('value');\n    var sort = seriesModel.get('sort');\n    var layoutRef = layout.createBoxLayoutReference(seriesModel, api);\n    var viewRect = layout.getLayoutRect(seriesModel.getBoxLayoutParams(), layoutRef.refContainer);\n    var orient = seriesModel.get('orient');\n    var viewWidth = viewRect.width;\n    var viewHeight = viewRect.height;\n    var indices = getSortedIndices(data, sort);\n    var x = viewRect.x;\n    var y = viewRect.y;\n    var sizeExtent = orient === 'horizontal' ? [parsePercent(seriesModel.get('minSize'), viewHeight), parsePercent(seriesModel.get('maxSize'), viewHeight)] : [parsePercent(seriesModel.get('minSize'), viewWidth), parsePercent(seriesModel.get('maxSize'), viewWidth)];\n    var dataExtent = data.getDataExtent(valueDim);\n    var min = seriesModel.get('min');\n    var max = seriesModel.get('max');\n    if (min == null) {\n      min = Math.min(dataExtent[0], 0);\n    }\n    if (max == null) {\n      max = dataExtent[1];\n    }\n    var funnelAlign = seriesModel.get('funnelAlign');\n    var gap = seriesModel.get('gap');\n    var viewSize = orient === 'horizontal' ? viewWidth : viewHeight;\n    var itemSize = (viewSize - gap * (data.count() - 1)) / data.count();\n    var getLinePoints = function (idx, offset) {\n      // End point index is data.count() and we assign it 0\n      if (orient === 'horizontal') {\n        var val_1 = data.get(valueDim, idx) || 0;\n        var itemHeight = linearMap(val_1, [min, max], sizeExtent, true);\n        var y0 = void 0;\n        switch (funnelAlign) {\n          case 'top':\n            y0 = y;\n            break;\n          case 'center':\n            y0 = y + (viewHeight - itemHeight) / 2;\n            break;\n          case 'bottom':\n            y0 = y + (viewHeight - itemHeight);\n            break;\n        }\n        return [[offset, y0], [offset, y0 + itemHeight]];\n      }\n      var val = data.get(valueDim, idx) || 0;\n      var itemWidth = linearMap(val, [min, max], sizeExtent, true);\n      var x0;\n      switch (funnelAlign) {\n        case 'left':\n          x0 = x;\n          break;\n        case 'center':\n          x0 = x + (viewWidth - itemWidth) / 2;\n          break;\n        case 'right':\n          x0 = x + viewWidth - itemWidth;\n          break;\n      }\n      return [[x0, offset], [x0 + itemWidth, offset]];\n    };\n    if (sort === 'ascending') {\n      // From bottom to top\n      itemSize = -itemSize;\n      gap = -gap;\n      if (orient === 'horizontal') {\n        x += viewWidth;\n      } else {\n        y += viewHeight;\n      }\n      indices = indices.reverse();\n    }\n    for (var i = 0; i < indices.length; i++) {\n      var idx = indices[i];\n      var nextIdx = indices[i + 1];\n      var itemModel = data.getItemModel(idx);\n      if (orient === 'horizontal') {\n        var width = itemModel.get(['itemStyle', 'width']);\n        if (width == null) {\n          width = itemSize;\n        } else {\n          width = parsePercent(width, viewWidth);\n          if (sort === 'ascending') {\n            width = -width;\n          }\n        }\n        var start = getLinePoints(idx, x);\n        var end = getLinePoints(nextIdx, x + width);\n        x += width + gap;\n        data.setItemLayout(idx, {\n          points: start.concat(end.slice().reverse())\n        });\n      } else {\n        var height = itemModel.get(['itemStyle', 'height']);\n        if (height == null) {\n          height = itemSize;\n        } else {\n          height = parsePercent(height, viewHeight);\n          if (sort === 'ascending') {\n            height = -height;\n          }\n        }\n        var start = getLinePoints(idx, y);\n        var end = getLinePoints(nextIdx, y + height);\n        y += height + gap;\n        data.setItemLayout(idx, {\n          points: start.concat(end.slice().reverse())\n        });\n      }\n    }\n    labelLayout(data);\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport FunnelView from './FunnelView.js';\nimport FunnelSeriesModel from './FunnelSeries.js';\nimport funnelLayout from './funnelLayout.js';\nimport dataFilter from '../../processor/dataFilter.js';\nexport function install(registers) {\n  registers.registerChartView(FunnelView);\n  registers.registerSeriesModel(FunnelSeriesModel);\n  registers.registerLayout(funnelLayout);\n  registers.registerProcessor(dataFilter('funnel'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport ChartView from '../../view/Chart.js';\nimport { numericToNumber } from '../../util/number.js';\nimport { eqNaN } from 'zrender/lib/core/util.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nvar DEFAULT_SMOOTH = 0.3;\nvar ParallelView = /** @class */function (_super) {\n  __extends(ParallelView, _super);\n  function ParallelView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ParallelView.type;\n    _this._dataGroup = new graphic.Group();\n    _this._initialized = false;\n    return _this;\n  }\n  ParallelView.prototype.init = function () {\n    this.group.add(this._dataGroup);\n  };\n  /**\n   * @override\n   */\n  ParallelView.prototype.render = function (seriesModel, ecModel, api, payload) {\n    // Clear previously rendered progressive elements.\n    this._progressiveEls = null;\n    var dataGroup = this._dataGroup;\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var coordSys = seriesModel.coordinateSystem;\n    var dimensions = coordSys.dimensions;\n    var seriesScope = makeSeriesScope(seriesModel);\n    data.diff(oldData).add(add).update(update).remove(remove).execute();\n    function add(newDataIndex) {\n      var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);\n      updateElCommon(line, data, newDataIndex, seriesScope);\n    }\n    function update(newDataIndex, oldDataIndex) {\n      var line = oldData.getItemGraphicEl(oldDataIndex);\n      var points = createLinePoints(data, newDataIndex, dimensions, coordSys);\n      data.setItemGraphicEl(newDataIndex, line);\n      graphic.updateProps(line, {\n        shape: {\n          points: points\n        }\n      }, seriesModel, newDataIndex);\n      saveOldStyle(line);\n      updateElCommon(line, data, newDataIndex, seriesScope);\n    }\n    function remove(oldDataIndex) {\n      var line = oldData.getItemGraphicEl(oldDataIndex);\n      dataGroup.remove(line);\n    }\n    // First create\n    if (!this._initialized) {\n      this._initialized = true;\n      var clipPath = createGridClipShape(coordSys, seriesModel, function () {\n        // Callback will be invoked immediately if there is no animation\n        setTimeout(function () {\n          dataGroup.removeClipPath();\n        });\n      });\n      dataGroup.setClipPath(clipPath);\n    }\n    this._data = data;\n  };\n  ParallelView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n    this._initialized = true;\n    this._data = null;\n    this._dataGroup.removeAll();\n  };\n  ParallelView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) {\n    var data = seriesModel.getData();\n    var coordSys = seriesModel.coordinateSystem;\n    var dimensions = coordSys.dimensions;\n    var seriesScope = makeSeriesScope(seriesModel);\n    var progressiveEls = this._progressiveEls = [];\n    for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) {\n      var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys);\n      line.incremental = true;\n      updateElCommon(line, data, dataIndex, seriesScope);\n      progressiveEls.push(line);\n    }\n  };\n  ParallelView.prototype.remove = function () {\n    this._dataGroup && this._dataGroup.removeAll();\n    this._data = null;\n  };\n  ParallelView.type = 'parallel';\n  return ParallelView;\n}(ChartView);\nfunction createGridClipShape(coordSys, seriesModel, cb) {\n  var parallelModel = coordSys.model;\n  var rect = coordSys.getRect();\n  var rectEl = new graphic.Rect({\n    shape: {\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height\n    }\n  });\n  var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height';\n  rectEl.setShape(dim, 0);\n  graphic.initProps(rectEl, {\n    shape: {\n      width: rect.width,\n      height: rect.height\n    }\n  }, seriesModel, cb);\n  return rectEl;\n}\nfunction createLinePoints(data, dataIndex, dimensions, coordSys) {\n  var points = [];\n  for (var i = 0; i < dimensions.length; i++) {\n    var dimName = dimensions[i];\n    var value = data.get(data.mapDimension(dimName), dataIndex);\n    if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {\n      points.push(coordSys.dataToPoint(value, dimName));\n    }\n  }\n  return points;\n}\nfunction addEl(data, dataGroup, dataIndex, dimensions, coordSys) {\n  var points = createLinePoints(data, dataIndex, dimensions, coordSys);\n  var line = new graphic.Polyline({\n    shape: {\n      points: points\n    },\n    // silent: true,\n    z2: 10\n  });\n  dataGroup.add(line);\n  data.setItemGraphicEl(dataIndex, line);\n  return line;\n}\nfunction makeSeriesScope(seriesModel) {\n  var smooth = seriesModel.get('smooth', true);\n  smooth === true && (smooth = DEFAULT_SMOOTH);\n  smooth = numericToNumber(smooth);\n  eqNaN(smooth) && (smooth = 0);\n  return {\n    smooth: smooth\n  };\n}\nfunction updateElCommon(el, data, dataIndex, seriesScope) {\n  el.useStyle(data.getItemVisual(dataIndex, 'style'));\n  el.style.fill = null;\n  el.setShape('smooth', seriesScope.smooth);\n  var itemModel = data.getItemModel(dataIndex);\n  var emphasisModel = itemModel.getModel('emphasis');\n  setStatesStylesFromModel(el, itemModel, 'lineStyle');\n  toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n}\n// function simpleDiff(oldData, newData, dimensions) {\n//     let oldLen;\n//     if (!oldData\n//         || !oldData.__plProgressive\n//         || (oldLen = oldData.count()) !== newData.count()\n//     ) {\n//         return true;\n//     }\n//     let dimLen = dimensions.length;\n//     for (let i = 0; i < oldLen; i++) {\n//         for (let j = 0; j < dimLen; j++) {\n//             if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {\n//                 return true;\n//             }\n//         }\n//     }\n//     return false;\n// }\n// FIXME put in common util?\nfunction isEmptyValue(val, axisType) {\n  return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value'\n}\nexport default ParallelView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { each, bind } from 'zrender/lib/core/util.js';\nimport SeriesModel from '../../model/Series.js';\nimport createSeriesData from '../helper/createSeriesData.js';\nvar ParallelSeriesModel = /** @class */function (_super) {\n  __extends(ParallelSeriesModel, _super);\n  function ParallelSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ParallelSeriesModel.type;\n    _this.visualStyleAccessPath = 'lineStyle';\n    _this.visualDrawType = 'stroke';\n    return _this;\n  }\n  ParallelSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesData(null, this, {\n      useEncodeDefaulter: bind(makeDefaultEncode, null, this)\n    });\n  };\n  /**\n   * User can get data raw indices on 'axisAreaSelected' event received.\n   *\n   * @return Raw indices\n   */\n  ParallelSeriesModel.prototype.getRawIndicesByActiveState = function (activeState) {\n    var coordSys = this.coordinateSystem;\n    var data = this.getData();\n    var indices = [];\n    coordSys.eachActiveState(data, function (theActiveState, dataIndex) {\n      if (activeState === theActiveState) {\n        indices.push(data.getRawIndex(dataIndex));\n      }\n    });\n    return indices;\n  };\n  ParallelSeriesModel.type = 'series.parallel';\n  ParallelSeriesModel.dependencies = ['parallel'];\n  ParallelSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    coordinateSystem: 'parallel',\n    parallelIndex: 0,\n    label: {\n      show: false\n    },\n    inactiveOpacity: 0.05,\n    activeOpacity: 1,\n    lineStyle: {\n      width: 1,\n      opacity: 0.45,\n      type: 'solid'\n    },\n    emphasis: {\n      label: {\n        show: false\n      }\n    },\n    progressive: 500,\n    smooth: false,\n    animationEasing: 'linear'\n  };\n  return ParallelSeriesModel;\n}(SeriesModel);\nfunction makeDefaultEncode(seriesModel) {\n  // The mapping of parallelAxis dimension to data dimension can\n  // be specified in parallelAxis.option.dim. For example, if\n  // parallelAxis.option.dim is 'dim3', it mapping to the third\n  // dimension of data. But `data.encode` has higher priority.\n  // Moreover, parallelModel.dimension should not be regarded as data\n  // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6'];\n  var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex'));\n  if (!parallelModel) {\n    return;\n  }\n  var encodeDefine = {};\n  each(parallelModel.dimensions, function (axisDim) {\n    var dataDimIndex = convertDimNameToNumber(axisDim);\n    encodeDefine[axisDim] = dataDimIndex;\n  });\n  return encodeDefine;\n}\nfunction convertDimNameToNumber(dimName) {\n  return +dimName.replace('dim', '');\n}\nexport default ParallelSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar opacityAccessPath = ['lineStyle', 'opacity'];\nvar parallelVisual = {\n  seriesType: 'parallel',\n  reset: function (seriesModel, ecModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    var opacityMap = {\n      normal: seriesModel.get(['lineStyle', 'opacity']),\n      active: seriesModel.get('activeOpacity'),\n      inactive: seriesModel.get('inactiveOpacity')\n    };\n    return {\n      progress: function (params, data) {\n        coordSys.eachActiveState(data, function (activeState, dataIndex) {\n          var opacity = opacityMap[activeState];\n          if (activeState === 'normal' && data.hasItemOption) {\n            var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath, true);\n            itemOpacity != null && (opacity = itemOpacity);\n          }\n          var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style');\n          existsStyle.opacity = opacity;\n        }, params.start, params.end);\n      }\n    };\n  }\n};\nexport default parallelVisual;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../../util/model.js';\nexport default function parallelPreprocessor(option) {\n  createParallelIfNeeded(option);\n  mergeAxisOptionFromParallel(option);\n}\n/**\n * Create a parallel coordinate if not exists.\n * @inner\n */\nfunction createParallelIfNeeded(option) {\n  if (option.parallel) {\n    return;\n  }\n  var hasParallelSeries = false;\n  zrUtil.each(option.series, function (seriesOpt) {\n    if (seriesOpt && seriesOpt.type === 'parallel') {\n      hasParallelSeries = true;\n    }\n  });\n  if (hasParallelSeries) {\n    option.parallel = [{}];\n  }\n}\n/**\n * Merge aixs definition from parallel option (if exists) to axis option.\n * @inner\n */\nfunction mergeAxisOptionFromParallel(option) {\n  var axes = modelUtil.normalizeToArray(option.parallelAxis);\n  zrUtil.each(axes, function (axisOption) {\n    if (!zrUtil.isObject(axisOption)) {\n      return;\n    }\n    var parallelIndex = axisOption.parallelIndex || 0;\n    var parallelOption = modelUtil.normalizeToArray(option.parallel)[parallelIndex];\n    if (parallelOption && parallelOption.parallelAxisDefault) {\n      zrUtil.merge(axisOption, parallelOption.parallelAxisDefault, false);\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nimport { each, bind, extend } from 'zrender/lib/core/util.js';\nimport { createOrUpdate, clear } from '../../util/throttle.js';\nvar CLICK_THRESHOLD = 5; // > 4\nvar ParallelView = /** @class */function (_super) {\n  __extends(ParallelView, _super);\n  function ParallelView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ParallelView.type;\n    return _this;\n  }\n  ParallelView.prototype.render = function (parallelModel, ecModel, api) {\n    this._model = parallelModel;\n    this._api = api;\n    if (!this._handlers) {\n      this._handlers = {};\n      each(handlers, function (handler, eventName) {\n        api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this));\n      }, this);\n    }\n    createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate');\n  };\n  ParallelView.prototype.dispose = function (ecModel, api) {\n    clear(this, '_throttledDispatchExpand');\n    each(this._handlers, function (handler, eventName) {\n      api.getZr().off(eventName, handler);\n    });\n    this._handlers = null;\n  };\n  /**\n   * @internal\n   * @param {Object} [opt] If null, cancel the last action triggering for debounce.\n   */\n  ParallelView.prototype._throttledDispatchExpand = function (opt) {\n    this._dispatchExpand(opt);\n  };\n  /**\n   * @internal\n   */\n  ParallelView.prototype._dispatchExpand = function (opt) {\n    opt && this._api.dispatchAction(extend({\n      type: 'parallelAxisExpand'\n    }, opt));\n  };\n  ParallelView.type = 'parallel';\n  return ParallelView;\n}(ComponentView);\nvar handlers = {\n  mousedown: function (e) {\n    if (checkTrigger(this, 'click')) {\n      this._mouseDownPoint = [e.offsetX, e.offsetY];\n    }\n  },\n  mouseup: function (e) {\n    var mouseDownPoint = this._mouseDownPoint;\n    if (checkTrigger(this, 'click') && mouseDownPoint) {\n      var point = [e.offsetX, e.offsetY];\n      var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2);\n      if (dist > CLICK_THRESHOLD) {\n        return;\n      }\n      var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]);\n      result.behavior !== 'none' && this._dispatchExpand({\n        axisExpandWindow: result.axisExpandWindow\n      });\n    }\n    this._mouseDownPoint = null;\n  },\n  mousemove: function (e) {\n    // Should do nothing when brushing.\n    if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) {\n      return;\n    }\n    var model = this._model;\n    var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]);\n    var behavior = result.behavior;\n    behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce'));\n    this._throttledDispatchExpand(behavior === 'none' ? null // Cancel the last trigger, in case that mouse slide out of the area quickly.\n    : {\n      axisExpandWindow: result.axisExpandWindow,\n      // Jumping uses animation, and sliding suppresses animation.\n      animation: behavior === 'jump' ? null : {\n        duration: 0 // Disable animation.\n      }\n    });\n  }\n};\nfunction checkTrigger(view, triggerOn) {\n  var model = view._model;\n  return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn;\n}\nexport default ParallelView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ComponentModel from '../../model/Component.js';\nvar ParallelModel = /** @class */function (_super) {\n  __extends(ParallelModel, _super);\n  function ParallelModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ParallelModel.type;\n    return _this;\n  }\n  ParallelModel.prototype.init = function () {\n    _super.prototype.init.apply(this, arguments);\n    this.mergeOption({});\n  };\n  ParallelModel.prototype.mergeOption = function (newOption) {\n    var thisOption = this.option;\n    newOption && zrUtil.merge(thisOption, newOption, true);\n    this._initDimensions();\n  };\n  /**\n   * Whether series or axis is in this coordinate system.\n   */\n  ParallelModel.prototype.contains = function (model, ecModel) {\n    var parallelIndex = model.get('parallelIndex');\n    return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this;\n  };\n  ParallelModel.prototype.setAxisExpand = function (opt) {\n    zrUtil.each(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) {\n      if (opt.hasOwnProperty(name)) {\n        // @ts-ignore FIXME: why \"never\" inferred in this.option[name]?\n        this.option[name] = opt[name];\n      }\n    }, this);\n  };\n  ParallelModel.prototype._initDimensions = function () {\n    var dimensions = this.dimensions = [];\n    var parallelAxisIndex = this.parallelAxisIndex = [];\n    var axisModels = zrUtil.filter(this.ecModel.queryComponents({\n      mainType: 'parallelAxis'\n    }), function (axisModel) {\n      // Can not use this.contains here, because\n      // initialization has not been completed yet.\n      return (axisModel.get('parallelIndex') || 0) === this.componentIndex;\n    }, this);\n    zrUtil.each(axisModels, function (axisModel) {\n      dimensions.push('dim' + axisModel.get('dim'));\n      parallelAxisIndex.push(axisModel.componentIndex);\n    });\n  };\n  ParallelModel.type = 'parallel';\n  ParallelModel.dependencies = ['parallelAxis'];\n  ParallelModel.layoutMode = 'box';\n  ParallelModel.defaultOption = {\n    // zlevel: 0,\n    z: 0,\n    left: 80,\n    top: 60,\n    right: 80,\n    bottom: 60,\n    // width: {totalWidth} - left - right,\n    // height: {totalHeight} - top - bottom,\n    layout: 'horizontal',\n    // FIXME\n    // naming?\n    axisExpandable: false,\n    axisExpandCenter: null,\n    axisExpandCount: 0,\n    axisExpandWidth: 50,\n    axisExpandRate: 17,\n    axisExpandDebounce: 50,\n    // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full.\n    // Do not doc to user until necessary.\n    axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4],\n    axisExpandTriggerOn: 'click',\n    parallelAxisDefault: null\n  };\n  return ParallelModel;\n}(ComponentModel);\nexport default ParallelModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Axis from '../Axis.js';\nvar ParallelAxis = /** @class */function (_super) {\n  __extends(ParallelAxis, _super);\n  function ParallelAxis(dim, scale, coordExtent, axisType, axisIndex) {\n    var _this = _super.call(this, dim, scale, coordExtent) || this;\n    _this.type = axisType || 'value';\n    _this.axisIndex = axisIndex;\n    return _this;\n  }\n  ParallelAxis.prototype.isHorizontal = function () {\n    return this.coordinateSystem.getModel().get('layout') !== 'horizontal';\n  };\n  return ParallelAxis;\n}(Axis);\nexport default ParallelAxis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Calculate slider move result.\n * Usage:\n * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as\n * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.\n * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.\n *\n * @param delta Move length.\n * @param handleEnds handleEnds[0] can be bigger then handleEnds[1].\n *              handleEnds will be modified in this method.\n * @param extent handleEnds is restricted by extent.\n *              extent[0] should less or equals than extent[1].\n * @param handleIndex Can be 'all', means that both move the two handleEnds.\n * @param minSpan The range of dataZoom can not be smaller than that.\n *              If not set, handle0 and cross handle1. If set as a non-negative\n *              number (including `0`), handles will push each other when reaching\n *              the minSpan.\n * @param maxSpan The range of dataZoom can not be larger than that.\n * @return The input handleEnds.\n */\nexport default function sliderMove(delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {\n  delta = delta || 0;\n  var extentSpan = extent[1] - extent[0];\n  // Notice maxSpan and minSpan can be null/undefined.\n  if (minSpan != null) {\n    minSpan = restrict(minSpan, [0, extentSpan]);\n  }\n  if (maxSpan != null) {\n    maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0);\n  }\n  if (handleIndex === 'all') {\n    var handleSpan = Math.abs(handleEnds[1] - handleEnds[0]);\n    handleSpan = restrict(handleSpan, [0, extentSpan]);\n    minSpan = maxSpan = restrict(handleSpan, [minSpan, maxSpan]);\n    handleIndex = 0;\n  }\n  handleEnds[0] = restrict(handleEnds[0], extent);\n  handleEnds[1] = restrict(handleEnds[1], extent);\n  var originalDistSign = getSpanSign(handleEnds, handleIndex);\n  handleEnds[handleIndex] += delta;\n  // Restrict in extent.\n  var extentMinSpan = minSpan || 0;\n  var realExtent = extent.slice();\n  originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan;\n  handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent);\n  // Expand span.\n  var currDistSign;\n  currDistSign = getSpanSign(handleEnds, handleIndex);\n  if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) {\n    // If minSpan exists, 'cross' is forbidden.\n    handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;\n  }\n  // Shrink span.\n  currDistSign = getSpanSign(handleEnds, handleIndex);\n  if (maxSpan != null && currDistSign.span > maxSpan) {\n    handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;\n  }\n  return handleEnds;\n}\nfunction getSpanSign(handleEnds, handleIndex) {\n  var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex];\n  // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0]\n  // is at left of handleEnds[1] for non-cross case.\n  return {\n    span: Math.abs(dist),\n    sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1\n  };\n}\nfunction restrict(value, extend) {\n  return Math.min(extend[1] != null ? extend[1] : Infinity, Math.max(extend[0] != null ? extend[0] : -Infinity, value));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Parallel Coordinates\n * <https://en.wikipedia.org/wiki/Parallel_coordinates>\n */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport * as layoutUtil from '../../util/layout.js';\nimport * as axisHelper from '../../coord/axisHelper.js';\nimport ParallelAxis from './ParallelAxis.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as numberUtil from '../../util/number.js';\nimport sliderMove from '../../component/helper/sliderMove.js';\nvar each = zrUtil.each;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathFloor = Math.floor;\nvar mathCeil = Math.ceil;\nvar round = numberUtil.round;\nvar PI = Math.PI;\nvar Parallel = /** @class */function () {\n  function Parallel(parallelModel, ecModel, api) {\n    this.type = 'parallel';\n    /**\n     * key: dimension\n     */\n    this._axesMap = zrUtil.createHashMap();\n    /**\n     * key: dimension\n     * value: {position: [], rotation, }\n     */\n    this._axesLayout = {};\n    this.dimensions = parallelModel.dimensions;\n    this._model = parallelModel;\n    this._init(parallelModel, ecModel, api);\n  }\n  Parallel.prototype._init = function (parallelModel, ecModel, api) {\n    var dimensions = parallelModel.dimensions;\n    var parallelAxisIndex = parallelModel.parallelAxisIndex;\n    each(dimensions, function (dim, idx) {\n      var axisIndex = parallelAxisIndex[idx];\n      var axisModel = ecModel.getComponent('parallelAxis', axisIndex);\n      var axis = this._axesMap.set(dim, new ParallelAxis(dim, axisHelper.createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex));\n      var isCategory = axis.type === 'category';\n      axis.onBand = isCategory && axisModel.get('boundaryGap');\n      axis.inverse = axisModel.get('inverse');\n      // Injection\n      axisModel.axis = axis;\n      axis.model = axisModel;\n      axis.coordinateSystem = axisModel.coordinateSystem = this;\n    }, this);\n  };\n  /**\n   * Update axis scale after data processed\n   */\n  Parallel.prototype.update = function (ecModel, api) {\n    this._updateAxesFromSeries(this._model, ecModel);\n  };\n  Parallel.prototype.containPoint = function (point) {\n    var layoutInfo = this._makeLayoutInfo();\n    var axisBase = layoutInfo.axisBase;\n    var layoutBase = layoutInfo.layoutBase;\n    var pixelDimIndex = layoutInfo.pixelDimIndex;\n    var pAxis = point[1 - pixelDimIndex];\n    var pLayout = point[pixelDimIndex];\n    return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength;\n  };\n  Parallel.prototype.getModel = function () {\n    return this._model;\n  };\n  /**\n   * Update properties from series\n   */\n  Parallel.prototype._updateAxesFromSeries = function (parallelModel, ecModel) {\n    ecModel.eachSeries(function (seriesModel) {\n      if (!parallelModel.contains(seriesModel, ecModel)) {\n        return;\n      }\n      var data = seriesModel.getData();\n      each(this.dimensions, function (dim) {\n        var axis = this._axesMap.get(dim);\n        axis.scale.unionExtentFromData(data, data.mapDimension(dim));\n        axisHelper.niceScaleExtent(axis.scale, axis.model);\n      }, this);\n    }, this);\n  };\n  /**\n   * Resize the parallel coordinate system.\n   */\n  Parallel.prototype.resize = function (parallelModel, api) {\n    var refContainer = layoutUtil.createBoxLayoutReference(parallelModel, api).refContainer;\n    this._rect = layoutUtil.getLayoutRect(parallelModel.getBoxLayoutParams(), refContainer);\n    this._layoutAxes();\n  };\n  Parallel.prototype.getRect = function () {\n    return this._rect;\n  };\n  Parallel.prototype._makeLayoutInfo = function () {\n    var parallelModel = this._model;\n    var rect = this._rect;\n    var xy = ['x', 'y'];\n    var wh = ['width', 'height'];\n    var layout = parallelModel.get('layout');\n    var pixelDimIndex = layout === 'horizontal' ? 0 : 1;\n    var layoutLength = rect[wh[pixelDimIndex]];\n    var layoutExtent = [0, layoutLength];\n    var axisCount = this.dimensions.length;\n    var axisExpandWidth = restrict(parallelModel.get('axisExpandWidth'), layoutExtent);\n    var axisExpandCount = restrict(parallelModel.get('axisExpandCount') || 0, [0, axisCount]);\n    var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0;\n    // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength],\n    // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow),\n    // where collapsed axes should be overlapped.\n    var axisExpandWindow = parallelModel.get('axisExpandWindow');\n    var winSize;\n    if (!axisExpandWindow) {\n      winSize = restrict(axisExpandWidth * (axisExpandCount - 1), layoutExtent);\n      var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor(axisCount / 2);\n      axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2];\n      axisExpandWindow[1] = axisExpandWindow[0] + winSize;\n    } else {\n      winSize = restrict(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent);\n      axisExpandWindow[1] = axisExpandWindow[0] + winSize;\n    }\n    var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount);\n    // Avoid axisCollapseWidth is too small.\n    axisCollapseWidth < 3 && (axisCollapseWidth = 0);\n    // Find the first and last indices > ewin[0] and < ewin[1].\n    var winInnerIndices = [mathFloor(round(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil(round(axisExpandWindow[1] / axisExpandWidth, 1)) - 1];\n    // Pos in ec coordinates.\n    var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0];\n    return {\n      layout: layout,\n      pixelDimIndex: pixelDimIndex,\n      layoutBase: rect[xy[pixelDimIndex]],\n      layoutLength: layoutLength,\n      axisBase: rect[xy[1 - pixelDimIndex]],\n      axisLength: rect[wh[1 - pixelDimIndex]],\n      axisExpandable: axisExpandable,\n      axisExpandWidth: axisExpandWidth,\n      axisCollapseWidth: axisCollapseWidth,\n      axisExpandWindow: axisExpandWindow,\n      axisCount: axisCount,\n      winInnerIndices: winInnerIndices,\n      axisExpandWindow0Pos: axisExpandWindow0Pos\n    };\n  };\n  Parallel.prototype._layoutAxes = function () {\n    var rect = this._rect;\n    var axes = this._axesMap;\n    var dimensions = this.dimensions;\n    var layoutInfo = this._makeLayoutInfo();\n    var layout = layoutInfo.layout;\n    axes.each(function (axis) {\n      var axisExtent = [0, layoutInfo.axisLength];\n      var idx = axis.inverse ? 1 : 0;\n      axis.setExtent(axisExtent[idx], axisExtent[1 - idx]);\n    });\n    each(dimensions, function (dim, idx) {\n      var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo);\n      var positionTable = {\n        horizontal: {\n          x: posInfo.position,\n          y: layoutInfo.axisLength\n        },\n        vertical: {\n          x: 0,\n          y: posInfo.position\n        }\n      };\n      var rotationTable = {\n        horizontal: PI / 2,\n        vertical: 0\n      };\n      var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y];\n      var rotation = rotationTable[layout];\n      var transform = matrix.create();\n      matrix.rotate(transform, transform, rotation);\n      matrix.translate(transform, transform, position);\n      // TODO\n      // tick layout info\n      // TODO\n      // update dimensions info based on axis order.\n      this._axesLayout[dim] = {\n        position: position,\n        rotation: rotation,\n        transform: transform,\n        axisNameAvailableWidth: posInfo.axisNameAvailableWidth,\n        axisLabelShow: posInfo.axisLabelShow,\n        nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth,\n        tickDirection: 1,\n        labelDirection: 1\n      };\n    }, this);\n  };\n  /**\n   * Get axis by dim.\n   */\n  Parallel.prototype.getAxis = function (dim) {\n    return this._axesMap.get(dim);\n  };\n  /**\n   * Convert a dim value of a single item of series data to Point.\n   */\n  Parallel.prototype.dataToPoint = function (value, dim) {\n    return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim);\n  };\n  /**\n   * Travel data for one time, get activeState of each data item.\n   * @param start the start dataIndex that travel from.\n   * @param end the next dataIndex of the last dataIndex will be travel.\n   */\n  Parallel.prototype.eachActiveState = function (data, callback, start, end) {\n    start == null && (start = 0);\n    end == null && (end = data.count());\n    var axesMap = this._axesMap;\n    var dimensions = this.dimensions;\n    var dataDimensions = [];\n    var axisModels = [];\n    zrUtil.each(dimensions, function (axisDim) {\n      dataDimensions.push(data.mapDimension(axisDim));\n      axisModels.push(axesMap.get(axisDim).model);\n    });\n    var hasActiveSet = this.hasAxisBrushed();\n    for (var dataIndex = start; dataIndex < end; dataIndex++) {\n      var activeState = void 0;\n      if (!hasActiveSet) {\n        activeState = 'normal';\n      } else {\n        activeState = 'active';\n        var values = data.getValues(dataDimensions, dataIndex);\n        for (var j = 0, lenj = dimensions.length; j < lenj; j++) {\n          var state = axisModels[j].getActiveState(values[j]);\n          if (state === 'inactive') {\n            activeState = 'inactive';\n            break;\n          }\n        }\n      }\n      callback(activeState, dataIndex);\n    }\n  };\n  /**\n   * Whether has any activeSet.\n   */\n  Parallel.prototype.hasAxisBrushed = function () {\n    var dimensions = this.dimensions;\n    var axesMap = this._axesMap;\n    var hasActiveSet = false;\n    for (var j = 0, lenj = dimensions.length; j < lenj; j++) {\n      if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') {\n        hasActiveSet = true;\n      }\n    }\n    return hasActiveSet;\n  };\n  /**\n   * Convert coords of each axis to Point.\n   *  Return point. For example: [10, 20]\n   */\n  Parallel.prototype.axisCoordToPoint = function (coord, dim) {\n    var axisLayout = this._axesLayout[dim];\n    return graphic.applyTransform([coord, 0], axisLayout.transform);\n  };\n  /**\n   * Get axis layout.\n   */\n  Parallel.prototype.getAxisLayout = function (dim) {\n    return zrUtil.clone(this._axesLayout[dim]);\n  };\n  /**\n   * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}.\n   */\n  Parallel.prototype.getSlidedAxisExpandWindow = function (point) {\n    var layoutInfo = this._makeLayoutInfo();\n    var pixelDimIndex = layoutInfo.pixelDimIndex;\n    var axisExpandWindow = layoutInfo.axisExpandWindow.slice();\n    var winSize = axisExpandWindow[1] - axisExpandWindow[0];\n    var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)];\n    // Out of the area of coordinate system.\n    if (!this.containPoint(point)) {\n      return {\n        behavior: 'none',\n        axisExpandWindow: axisExpandWindow\n      };\n    }\n    // Convert the point from global to expand coordinates.\n    var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos;\n    // For dragging operation convenience, the window should not be\n    // slided when mouse is the center area of the window.\n    var delta;\n    var behavior = 'slide';\n    var axisCollapseWidth = layoutInfo.axisCollapseWidth;\n    var triggerArea = this._model.get('axisExpandSlideTriggerArea');\n    // But consider touch device, jump is necessary.\n    var useJump = triggerArea[0] != null;\n    if (axisCollapseWidth) {\n      if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) {\n        behavior = 'jump';\n        delta = pointCoord - winSize * triggerArea[2];\n      } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) {\n        behavior = 'jump';\n        delta = pointCoord - winSize * (1 - triggerArea[2]);\n      } else {\n        (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0);\n      }\n      delta *= layoutInfo.axisExpandWidth / axisCollapseWidth;\n      delta ? sliderMove(delta, axisExpandWindow, extent, 'all')\n      // Avoid nonsense triger on mousemove.\n      : behavior = 'none';\n    }\n    // When screen is too narrow, make it visible and slidable, although it is hard to interact.\n    else {\n      var winSize2 = axisExpandWindow[1] - axisExpandWindow[0];\n      var pos = extent[1] * pointCoord / winSize2;\n      axisExpandWindow = [mathMax(0, pos - winSize2 / 2)];\n      axisExpandWindow[1] = mathMin(extent[1], axisExpandWindow[0] + winSize2);\n      axisExpandWindow[0] = axisExpandWindow[1] - winSize2;\n    }\n    return {\n      axisExpandWindow: axisExpandWindow,\n      behavior: behavior\n    };\n  };\n  return Parallel;\n}();\nfunction restrict(len, extent) {\n  return mathMin(mathMax(len, extent[0]), extent[1]);\n}\nfunction layoutAxisWithoutExpand(axisIndex, layoutInfo) {\n  var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1);\n  return {\n    position: step * axisIndex,\n    axisNameAvailableWidth: step,\n    axisLabelShow: true\n  };\n}\nfunction layoutAxisWithExpand(axisIndex, layoutInfo) {\n  var layoutLength = layoutInfo.layoutLength;\n  var axisExpandWidth = layoutInfo.axisExpandWidth;\n  var axisCount = layoutInfo.axisCount;\n  var axisCollapseWidth = layoutInfo.axisCollapseWidth;\n  var winInnerIndices = layoutInfo.winInnerIndices;\n  var position;\n  var axisNameAvailableWidth = axisCollapseWidth;\n  var axisLabelShow = false;\n  var nameTruncateMaxWidth;\n  if (axisIndex < winInnerIndices[0]) {\n    position = axisIndex * axisCollapseWidth;\n    nameTruncateMaxWidth = axisCollapseWidth;\n  } else if (axisIndex <= winInnerIndices[1]) {\n    position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0];\n    axisNameAvailableWidth = axisExpandWidth;\n    axisLabelShow = true;\n  } else {\n    position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth;\n    nameTruncateMaxWidth = axisCollapseWidth;\n  }\n  return {\n    position: position,\n    axisNameAvailableWidth: axisNameAvailableWidth,\n    axisLabelShow: axisLabelShow,\n    nameTruncateMaxWidth: nameTruncateMaxWidth\n  };\n}\nexport default Parallel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Parallel coordinate system creater.\n */\nimport Parallel from './Parallel.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nfunction createParallelCoordSys(ecModel, api) {\n  var coordSysList = [];\n  ecModel.eachComponent('parallel', function (parallelModel, idx) {\n    var coordSys = new Parallel(parallelModel, ecModel, api);\n    coordSys.name = 'parallel_' + idx;\n    coordSys.resize(parallelModel, api);\n    parallelModel.coordinateSystem = coordSys;\n    coordSys.model = parallelModel;\n    coordSysList.push(coordSys);\n  });\n  // Inject the coordinateSystems into seriesModel\n  ecModel.eachSeries(function (seriesModel) {\n    if (seriesModel.get('coordinateSystem') === 'parallel') {\n      var parallelModel = seriesModel.getReferringComponents('parallel', SINGLE_REFERRING).models[0];\n      seriesModel.coordinateSystem = parallelModel.coordinateSystem;\n    }\n  });\n  return coordSysList;\n}\nvar parallelCoordSysCreator = {\n  create: createParallelCoordSys\n};\nexport default parallelCoordSysCreator;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ComponentModel from '../../model/Component.js';\nimport makeStyleMapper from '../../model/mixin/makeStyleMapper.js';\nimport * as numberUtil from '../../util/number.js';\nimport { AxisModelCommonMixin } from '../axisModelCommonMixin.js';\nvar ParallelAxisModel = /** @class */function (_super) {\n  __extends(ParallelAxisModel, _super);\n  function ParallelAxisModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ParallelAxisModel.type;\n    /**\n     * @readOnly\n     */\n    _this.activeIntervals = [];\n    return _this;\n  }\n  ParallelAxisModel.prototype.getAreaSelectStyle = function () {\n    return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity']\n    // Option decal is in `DecalObject` but style.decal is in `PatternObject`.\n    // So do not transfer decal directly.\n    ])(this.getModel('areaSelectStyle'));\n  };\n  /**\n   * The code of this feature is put on AxisModel but not ParallelAxis,\n   * because axisModel can be alive after echarts updating but instance of\n   * ParallelAxis having been disposed. this._activeInterval should be kept\n   * when action dispatched (i.e. legend click).\n   *\n   * @param intervals `interval.length === 0` means set all active.\n   */\n  ParallelAxisModel.prototype.setActiveIntervals = function (intervals) {\n    var activeIntervals = this.activeIntervals = zrUtil.clone(intervals);\n    // Normalize\n    if (activeIntervals) {\n      for (var i = activeIntervals.length - 1; i >= 0; i--) {\n        numberUtil.asc(activeIntervals[i]);\n      }\n    }\n  };\n  /**\n   * @param value When only attempting detect whether 'no activeIntervals set',\n   *        `value` is not needed to be input.\n   */\n  ParallelAxisModel.prototype.getActiveState = function (value) {\n    var activeIntervals = this.activeIntervals;\n    if (!activeIntervals.length) {\n      return 'normal';\n    }\n    if (value == null || isNaN(+value)) {\n      return 'inactive';\n    }\n    // Simple optimization\n    if (activeIntervals.length === 1) {\n      var interval = activeIntervals[0];\n      if (interval[0] <= value && value <= interval[1]) {\n        return 'active';\n      }\n    } else {\n      for (var i = 0, len = activeIntervals.length; i < len; i++) {\n        if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) {\n          return 'active';\n        }\n      }\n    }\n    return 'inactive';\n  };\n  return ParallelAxisModel;\n}(ComponentModel);\nzrUtil.mixin(ParallelAxisModel, AxisModelCommonMixin);\nexport default ParallelAxisModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { curry, each, map, bind, merge, clone, defaults, assert } from 'zrender/lib/core/util.js';\nimport Eventful from 'zrender/lib/core/Eventful.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as interactionMutex from './interactionMutex.js';\nimport DataDiffer from '../../data/DataDiffer.js';\nimport tokens from '../../visual/tokens.js';\nvar BRUSH_PANEL_GLOBAL = true;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathPow = Math.pow;\nvar COVER_Z = 10000;\nvar UNSELECT_THRESHOLD = 6;\nvar MIN_RESIZE_LINE_WIDTH = 6;\nvar MUTEX_RESOURCE_KEY = 'globalPan';\nvar DIRECTION_MAP = {\n  w: [0, 0],\n  e: [0, 1],\n  n: [1, 0],\n  s: [1, 1]\n};\nvar CURSOR_MAP = {\n  w: 'ew',\n  e: 'ew',\n  n: 'ns',\n  s: 'ns',\n  ne: 'nesw',\n  sw: 'nesw',\n  nw: 'nwse',\n  se: 'nwse'\n};\nvar DEFAULT_BRUSH_OPT = {\n  brushStyle: {\n    lineWidth: 2,\n    stroke: tokens.color.backgroundTint,\n    fill: tokens.color.borderTint\n  },\n  transformable: true,\n  brushMode: 'single',\n  removeOnClick: false\n};\nvar baseUID = 0;\n/**\n * params:\n *     areas: Array.<Array>, coord relates to container group,\n *                             If no container specified, to global.\n *     opt {\n *         isEnd: boolean,\n *         removeOnClick: boolean\n *     }\n */\nvar BrushController = /** @class */function (_super) {\n  __extends(BrushController, _super);\n  function BrushController(zr) {\n    var _this = _super.call(this) || this;\n    /**\n     * @internal\n     */\n    _this._track = [];\n    /**\n     * @internal\n     */\n    _this._covers = [];\n    _this._handlers = {};\n    if (process.env.NODE_ENV !== 'production') {\n      assert(zr);\n    }\n    _this._zr = zr;\n    _this.group = new graphic.Group();\n    _this._uid = 'brushController_' + baseUID++;\n    each(pointerHandlers, function (handler, eventName) {\n      this._handlers[eventName] = bind(handler, this);\n    }, _this);\n    return _this;\n  }\n  /**\n   * If set to `false`, select disabled.\n   */\n  BrushController.prototype.enableBrush = function (brushOption) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(this._mounted);\n    }\n    this._brushType && this._doDisableBrush();\n    brushOption.brushType && this._doEnableBrush(brushOption);\n    return this;\n  };\n  BrushController.prototype._doEnableBrush = function (brushOption) {\n    var zr = this._zr;\n    // Consider roam, which takes globalPan too.\n    if (!this._enableGlobalPan) {\n      interactionMutex.take(zr, MUTEX_RESOURCE_KEY, this._uid);\n    }\n    each(this._handlers, function (handler, eventName) {\n      zr.on(eventName, handler);\n    });\n    this._brushType = brushOption.brushType;\n    this._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true);\n  };\n  BrushController.prototype._doDisableBrush = function () {\n    var zr = this._zr;\n    interactionMutex.release(zr, MUTEX_RESOURCE_KEY, this._uid);\n    each(this._handlers, function (handler, eventName) {\n      zr.off(eventName, handler);\n    });\n    this._brushType = this._brushOption = null;\n  };\n  /**\n   * @param panelOpts If not pass, it is global brush.\n   */\n  BrushController.prototype.setPanels = function (panelOpts) {\n    if (panelOpts && panelOpts.length) {\n      var panels_1 = this._panels = {};\n      each(panelOpts, function (panelOpts) {\n        panels_1[panelOpts.panelId] = clone(panelOpts);\n      });\n    } else {\n      this._panels = null;\n    }\n    return this;\n  };\n  BrushController.prototype.mount = function (opt) {\n    opt = opt || {};\n    if (process.env.NODE_ENV !== 'production') {\n      this._mounted = true; // should be at first.\n    }\n    this._enableGlobalPan = opt.enableGlobalPan;\n    var thisGroup = this.group;\n    this._zr.add(thisGroup);\n    thisGroup.attr({\n      x: opt.x || 0,\n      y: opt.y || 0,\n      rotation: opt.rotation || 0,\n      scaleX: opt.scaleX || 1,\n      scaleY: opt.scaleY || 1\n    });\n    this._transform = thisGroup.getLocalTransform();\n    return this;\n  };\n  // eachCover(cb, context): void {\n  //     each(this._covers, cb, context);\n  // }\n  /**\n   * Update covers.\n   * @param coverConfigList\n   *        If coverConfigList is null/undefined, all covers removed.\n   */\n  BrushController.prototype.updateCovers = function (coverConfigList) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(this._mounted);\n    }\n    coverConfigList = map(coverConfigList, function (coverConfig) {\n      return merge(clone(DEFAULT_BRUSH_OPT), coverConfig, true);\n    });\n    var tmpIdPrefix = '\\0-brush-index-';\n    var oldCovers = this._covers;\n    var newCovers = this._covers = [];\n    var controller = this;\n    var creatingCover = this._creatingCover;\n    new DataDiffer(oldCovers, coverConfigList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute();\n    return this;\n    function getKey(brushOption, index) {\n      return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType;\n    }\n    function oldGetKey(cover, index) {\n      return getKey(cover.__brushOption, index);\n    }\n    function addOrUpdate(newIndex, oldIndex) {\n      var newBrushInternal = coverConfigList[newIndex];\n      // Consider setOption in event listener of brushSelect,\n      // where updating cover when creating should be forbidden.\n      if (oldIndex != null && oldCovers[oldIndex] === creatingCover) {\n        newCovers[newIndex] = oldCovers[oldIndex];\n      } else {\n        var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushInternal, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushInternal));\n        updateCoverAfterCreation(controller, cover);\n      }\n    }\n    function remove(oldIndex) {\n      if (oldCovers[oldIndex] !== creatingCover) {\n        controller.group.remove(oldCovers[oldIndex]);\n      }\n    }\n  };\n  BrushController.prototype.unmount = function () {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!this._mounted) {\n        return;\n      }\n    }\n    this.enableBrush(false);\n    // container may 'removeAll' outside.\n    clearCovers(this);\n    this._zr.remove(this.group);\n    if (process.env.NODE_ENV !== 'production') {\n      this._mounted = false; // should be at last.\n    }\n    return this;\n  };\n  BrushController.prototype.dispose = function () {\n    this.unmount();\n    this.off();\n  };\n  return BrushController;\n}(Eventful);\nfunction createCover(controller, brushOption) {\n  var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption);\n  cover.__brushOption = brushOption;\n  updateZ(cover, brushOption);\n  controller.group.add(cover);\n  return cover;\n}\nfunction endCreating(controller, creatingCover) {\n  var coverRenderer = getCoverRenderer(creatingCover);\n  if (coverRenderer.endCreating) {\n    coverRenderer.endCreating(controller, creatingCover);\n    updateZ(creatingCover, creatingCover.__brushOption);\n  }\n  return creatingCover;\n}\nfunction updateCoverShape(controller, cover) {\n  var brushOption = cover.__brushOption;\n  getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption);\n}\nfunction updateZ(cover, brushOption) {\n  var z = brushOption.z;\n  z == null && (z = COVER_Z);\n  cover.traverse(function (el) {\n    el.z = z;\n    el.z2 = z; // Consider in given container.\n  });\n}\nfunction updateCoverAfterCreation(controller, cover) {\n  getCoverRenderer(cover).updateCommon(controller, cover);\n  updateCoverShape(controller, cover);\n}\nfunction getCoverRenderer(cover) {\n  return coverRenderers[cover.__brushOption.brushType];\n}\n// return target panel or `true` (means global panel)\nfunction getPanelByPoint(controller, e, localCursorPoint) {\n  var panels = controller._panels;\n  if (!panels) {\n    return BRUSH_PANEL_GLOBAL; // Global panel\n  }\n  var panel;\n  var transform = controller._transform;\n  each(panels, function (pn) {\n    pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn);\n  });\n  return panel;\n}\n// Return a panel or true\nfunction getPanelByCover(controller, cover) {\n  var panels = controller._panels;\n  if (!panels) {\n    return BRUSH_PANEL_GLOBAL; // Global panel\n  }\n  var panelId = cover.__brushOption.panelId;\n  // User may give cover without coord sys info,\n  // which is then treated as global panel.\n  return panelId != null ? panels[panelId] : BRUSH_PANEL_GLOBAL;\n}\nfunction clearCovers(controller) {\n  var covers = controller._covers;\n  var originalLength = covers.length;\n  each(covers, function (cover) {\n    controller.group.remove(cover);\n  }, controller);\n  covers.length = 0;\n  return !!originalLength;\n}\nfunction trigger(controller, opt) {\n  var areas = map(controller._covers, function (cover) {\n    var brushOption = cover.__brushOption;\n    var range = clone(brushOption.range);\n    return {\n      brushType: brushOption.brushType,\n      panelId: brushOption.panelId,\n      range: range\n    };\n  });\n  controller.trigger('brush', {\n    areas: areas,\n    isEnd: !!opt.isEnd,\n    removeOnClick: !!opt.removeOnClick\n  });\n}\nfunction shouldShowCover(controller) {\n  var track = controller._track;\n  if (!track.length) {\n    return false;\n  }\n  var p2 = track[track.length - 1];\n  var p1 = track[0];\n  var dx = p2[0] - p1[0];\n  var dy = p2[1] - p1[1];\n  var dist = mathPow(dx * dx + dy * dy, 0.5);\n  return dist > UNSELECT_THRESHOLD;\n}\nfunction getTrackEnds(track) {\n  var tail = track.length - 1;\n  tail < 0 && (tail = 0);\n  return [track[0], track[tail]];\n}\n;\nfunction createBaseRectCover(rectRangeConverter, controller, brushOption, edgeNameSequences) {\n  var cover = new graphic.Group();\n  cover.add(new graphic.Rect({\n    name: 'main',\n    style: makeStyle(brushOption),\n    silent: true,\n    draggable: true,\n    cursor: 'move',\n    drift: curry(driftRect, rectRangeConverter, controller, cover, ['n', 's', 'w', 'e']),\n    ondragend: curry(trigger, controller, {\n      isEnd: true\n    })\n  }));\n  each(edgeNameSequences, function (nameSequence) {\n    cover.add(new graphic.Rect({\n      name: nameSequence.join(''),\n      style: {\n        opacity: 0\n      },\n      draggable: true,\n      silent: true,\n      invisible: true,\n      drift: curry(driftRect, rectRangeConverter, controller, cover, nameSequence),\n      ondragend: curry(trigger, controller, {\n        isEnd: true\n      })\n    }));\n  });\n  return cover;\n}\nfunction updateBaseRect(controller, cover, localRange, brushOption) {\n  var lineWidth = brushOption.brushStyle.lineWidth || 0;\n  var handleSize = mathMax(lineWidth, MIN_RESIZE_LINE_WIDTH);\n  var x = localRange[0][0];\n  var y = localRange[1][0];\n  var xa = x - lineWidth / 2;\n  var ya = y - lineWidth / 2;\n  var x2 = localRange[0][1];\n  var y2 = localRange[1][1];\n  var x2a = x2 - handleSize + lineWidth / 2;\n  var y2a = y2 - handleSize + lineWidth / 2;\n  var width = x2 - x;\n  var height = y2 - y;\n  var widtha = width + lineWidth;\n  var heighta = height + lineWidth;\n  updateRectShape(controller, cover, 'main', x, y, width, height);\n  if (brushOption.transformable) {\n    updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta);\n    updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta);\n    updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize);\n    updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize);\n    updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize);\n    updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize);\n    updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize);\n    updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize);\n  }\n}\nfunction updateCommon(controller, cover) {\n  var brushOption = cover.__brushOption;\n  var transformable = brushOption.transformable;\n  var mainEl = cover.childAt(0);\n  mainEl.useStyle(makeStyle(brushOption));\n  mainEl.attr({\n    silent: !transformable,\n    cursor: transformable ? 'move' : 'default'\n  });\n  each([['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']], function (nameSequence) {\n    var el = cover.childOfName(nameSequence.join(''));\n    var globalDir = nameSequence.length === 1 ? getGlobalDirection1(controller, nameSequence[0]) : getGlobalDirection2(controller, nameSequence);\n    el && el.attr({\n      silent: !transformable,\n      invisible: !transformable,\n      cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null\n    });\n  });\n}\nfunction updateRectShape(controller, cover, name, x, y, w, h) {\n  var el = cover.childOfName(name);\n  el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]])));\n}\nfunction makeStyle(brushOption) {\n  return defaults({\n    strokeNoScale: true\n  }, brushOption.brushStyle);\n}\nfunction formatRectRange(x, y, x2, y2) {\n  var min = [mathMin(x, x2), mathMin(y, y2)];\n  var max = [mathMax(x, x2), mathMax(y, y2)];\n  return [[min[0], max[0]], [min[1], max[1]] // y range\n  ];\n}\nfunction getTransform(controller) {\n  return graphic.getTransform(controller.group);\n}\nfunction getGlobalDirection1(controller, localDirName) {\n  var map = {\n    w: 'left',\n    e: 'right',\n    n: 'top',\n    s: 'bottom'\n  };\n  var inverseMap = {\n    left: 'w',\n    right: 'e',\n    top: 'n',\n    bottom: 's'\n  };\n  var dir = graphic.transformDirection(map[localDirName], getTransform(controller));\n  return inverseMap[dir];\n}\nfunction getGlobalDirection2(controller, localDirNameSeq) {\n  var globalDir = [getGlobalDirection1(controller, localDirNameSeq[0]), getGlobalDirection1(controller, localDirNameSeq[1])];\n  (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse();\n  return globalDir.join('');\n}\nfunction driftRect(rectRangeConverter, controller, cover, dirNameSequence, dx, dy) {\n  var brushOption = cover.__brushOption;\n  var rectRange = rectRangeConverter.toRectRange(brushOption.range);\n  var localDelta = toLocalDelta(controller, dx, dy);\n  each(dirNameSequence, function (dirName) {\n    var ind = DIRECTION_MAP[dirName];\n    rectRange[ind[0]][ind[1]] += localDelta[ind[0]];\n  });\n  brushOption.range = rectRangeConverter.fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1]));\n  updateCoverAfterCreation(controller, cover);\n  trigger(controller, {\n    isEnd: false\n  });\n}\nfunction driftPolygon(controller, cover, dx, dy) {\n  var range = cover.__brushOption.range;\n  var localDelta = toLocalDelta(controller, dx, dy);\n  each(range, function (point) {\n    point[0] += localDelta[0];\n    point[1] += localDelta[1];\n  });\n  updateCoverAfterCreation(controller, cover);\n  trigger(controller, {\n    isEnd: false\n  });\n}\nfunction toLocalDelta(controller, dx, dy) {\n  var thisGroup = controller.group;\n  var localD = thisGroup.transformCoordToLocal(dx, dy);\n  var localZero = thisGroup.transformCoordToLocal(0, 0);\n  return [localD[0] - localZero[0], localD[1] - localZero[1]];\n}\nfunction clipByPanel(controller, cover, data) {\n  var panel = getPanelByCover(controller, cover);\n  return panel && panel !== BRUSH_PANEL_GLOBAL ? panel.clipPath(data, controller._transform) : clone(data);\n}\nfunction pointsToRect(points) {\n  var xmin = mathMin(points[0][0], points[1][0]);\n  var ymin = mathMin(points[0][1], points[1][1]);\n  var xmax = mathMax(points[0][0], points[1][0]);\n  var ymax = mathMax(points[0][1], points[1][1]);\n  return {\n    x: xmin,\n    y: ymin,\n    width: xmax - xmin,\n    height: ymax - ymin\n  };\n}\nfunction resetCursor(controller, e, localCursorPoint) {\n  if (\n  // Check active\n  !controller._brushType\n  // resetCursor should be always called when mouse is in zr area,\n  // but not called when mouse is out of zr area to avoid bad influence\n  // if `mousemove`, `mouseup` are triggered from `document` event.\n  || isOutsideZrArea(controller, e.offsetX, e.offsetY)) {\n    return;\n  }\n  var zr = controller._zr;\n  var covers = controller._covers;\n  var currPanel = getPanelByPoint(controller, e, localCursorPoint);\n  // Check whether in covers.\n  if (!controller._dragging) {\n    for (var i = 0; i < covers.length; i++) {\n      var brushOption = covers[i].__brushOption;\n      if (currPanel && (currPanel === BRUSH_PANEL_GLOBAL || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) {\n        // Use cursor style set on cover.\n        return;\n      }\n    }\n  }\n  currPanel && zr.setCursorStyle('crosshair');\n}\nfunction preventDefault(e) {\n  var rawE = e.event;\n  rawE.preventDefault && rawE.preventDefault();\n}\nfunction mainShapeContain(cover, x, y) {\n  return cover.childOfName('main').contain(x, y);\n}\nfunction updateCoverByMouse(controller, e, localCursorPoint, isEnd) {\n  var creatingCover = controller._creatingCover;\n  var panel = controller._creatingPanel;\n  var thisBrushOption = controller._brushOption;\n  var eventParams;\n  controller._track.push(localCursorPoint.slice());\n  if (shouldShowCover(controller) || creatingCover) {\n    if (panel && !creatingCover) {\n      thisBrushOption.brushMode === 'single' && clearCovers(controller);\n      var brushOption = clone(thisBrushOption);\n      brushOption.brushType = determineBrushType(brushOption.brushType, panel);\n      brushOption.panelId = panel === BRUSH_PANEL_GLOBAL ? null : panel.panelId;\n      creatingCover = controller._creatingCover = createCover(controller, brushOption);\n      controller._covers.push(creatingCover);\n    }\n    if (creatingCover) {\n      var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)];\n      var coverBrushOption = creatingCover.__brushOption;\n      coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track));\n      if (isEnd) {\n        endCreating(controller, creatingCover);\n        coverRenderer.updateCommon(controller, creatingCover);\n      }\n      updateCoverShape(controller, creatingCover);\n      eventParams = {\n        isEnd: isEnd\n      };\n    }\n  } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) {\n    // Help user to remove covers easily, only by a tiny drag, in 'single' mode.\n    // But a single click do not clear covers, because user may have casual\n    // clicks (for example, click on other component and do not expect covers\n    // disappear).\n    // Only some cover removed, trigger action, but not every click trigger action.\n    if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) {\n      eventParams = {\n        isEnd: isEnd,\n        removeOnClick: true\n      };\n    }\n  }\n  return eventParams;\n}\nfunction determineBrushType(brushType, panel) {\n  if (brushType === 'auto') {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(panel && panel.defaultBrushType, 'MUST have defaultBrushType when brushType is \"atuo\"');\n    }\n    return panel.defaultBrushType;\n  }\n  return brushType;\n}\nvar pointerHandlers = {\n  mousedown: function (e) {\n    if (this._dragging) {\n      // In case some browser do not support globalOut,\n      // and release mouse out side the browser.\n      handleDragEnd(this, e);\n    } else if (!e.target || !e.target.draggable) {\n      preventDefault(e);\n      var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);\n      this._creatingCover = null;\n      var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint);\n      if (panel) {\n        this._dragging = true;\n        this._track = [localCursorPoint.slice()];\n      }\n    }\n  },\n  mousemove: function (e) {\n    var x = e.offsetX;\n    var y = e.offsetY;\n    var localCursorPoint = this.group.transformCoordToLocal(x, y);\n    resetCursor(this, e, localCursorPoint);\n    if (this._dragging) {\n      preventDefault(e);\n      var eventParams = updateCoverByMouse(this, e, localCursorPoint, false);\n      eventParams && trigger(this, eventParams);\n    }\n  },\n  mouseup: function (e) {\n    handleDragEnd(this, e);\n  }\n};\nfunction handleDragEnd(controller, e) {\n  if (controller._dragging) {\n    preventDefault(e);\n    var x = e.offsetX;\n    var y = e.offsetY;\n    var localCursorPoint = controller.group.transformCoordToLocal(x, y);\n    var eventParams = updateCoverByMouse(controller, e, localCursorPoint, true);\n    controller._dragging = false;\n    controller._track = [];\n    controller._creatingCover = null;\n    // trigger event should be at final, after procedure will be nested.\n    eventParams && trigger(controller, eventParams);\n  }\n}\nfunction isOutsideZrArea(controller, x, y) {\n  var zr = controller._zr;\n  return x < 0 || x > zr.getWidth() || y < 0 || y > zr.getHeight();\n}\n/**\n * key: brushType\n */\nvar coverRenderers = {\n  lineX: getLineRenderer(0),\n  lineY: getLineRenderer(1),\n  rect: {\n    createCover: function (controller, brushOption) {\n      function returnInput(range) {\n        return range;\n      }\n      return createBaseRectCover({\n        toRectRange: returnInput,\n        fromRectRange: returnInput\n      }, controller, brushOption, [['w'], ['e'], ['n'], ['s'], ['s', 'e'], ['s', 'w'], ['n', 'e'], ['n', 'w']]);\n    },\n    getCreatingRange: function (localTrack) {\n      var ends = getTrackEnds(localTrack);\n      return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]);\n    },\n    updateCoverShape: function (controller, cover, localRange, brushOption) {\n      updateBaseRect(controller, cover, localRange, brushOption);\n    },\n    updateCommon: updateCommon,\n    contain: mainShapeContain\n  },\n  polygon: {\n    createCover: function (controller, brushOption) {\n      var cover = new graphic.Group();\n      // Do not use graphic.Polygon because graphic.Polyline do not close the\n      // border of the shape when drawing, which is a better experience for user.\n      cover.add(new graphic.Polyline({\n        name: 'main',\n        style: makeStyle(brushOption),\n        silent: true\n      }));\n      return cover;\n    },\n    getCreatingRange: function (localTrack) {\n      return localTrack;\n    },\n    endCreating: function (controller, cover) {\n      cover.remove(cover.childAt(0));\n      // Use graphic.Polygon close the shape.\n      cover.add(new graphic.Polygon({\n        name: 'main',\n        draggable: true,\n        drift: curry(driftPolygon, controller, cover),\n        ondragend: curry(trigger, controller, {\n          isEnd: true\n        })\n      }));\n    },\n    updateCoverShape: function (controller, cover, localRange, brushOption) {\n      cover.childAt(0).setShape({\n        points: clipByPanel(controller, cover, localRange)\n      });\n    },\n    updateCommon: updateCommon,\n    contain: mainShapeContain\n  }\n};\nfunction getLineRenderer(xyIndex) {\n  return {\n    createCover: function (controller, brushOption) {\n      return createBaseRectCover({\n        toRectRange: function (range) {\n          var rectRange = [range, [0, 100]];\n          xyIndex && rectRange.reverse();\n          return rectRange;\n        },\n        fromRectRange: function (rectRange) {\n          return rectRange[xyIndex];\n        }\n      }, controller, brushOption, [[['w'], ['e']], [['n'], ['s']]][xyIndex]);\n    },\n    getCreatingRange: function (localTrack) {\n      var ends = getTrackEnds(localTrack);\n      var min = mathMin(ends[0][xyIndex], ends[1][xyIndex]);\n      var max = mathMax(ends[0][xyIndex], ends[1][xyIndex]);\n      return [min, max];\n    },\n    updateCoverShape: function (controller, cover, localRange, brushOption) {\n      var otherExtent;\n      // If brushWidth not specified, fit the panel.\n      var panel = getPanelByCover(controller, cover);\n      if (panel !== BRUSH_PANEL_GLOBAL && panel.getLinearBrushOtherExtent) {\n        otherExtent = panel.getLinearBrushOtherExtent(xyIndex);\n      } else {\n        var zr = controller._zr;\n        otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]];\n      }\n      var rectRange = [localRange, otherExtent];\n      xyIndex && rectRange.reverse();\n      updateBaseRect(controller, cover, rectRange, brushOption);\n    },\n    updateCommon: updateCommon,\n    contain: mainShapeContain\n  };\n}\nexport default BrushController;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { onIrrelevantElement } from './cursorHelper.js';\nimport * as graphicUtil from '../../util/graphic.js';\nexport function makeRectPanelClipPath(rect) {\n  rect = normalizeRect(rect);\n  return function (localPoints) {\n    return graphicUtil.clipPointsByRect(localPoints, rect);\n  };\n}\nexport function makeLinearBrushOtherExtent(rect, specifiedXYIndex) {\n  rect = normalizeRect(rect);\n  return function (xyIndex) {\n    var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex;\n    var brushWidth = idx ? rect.width : rect.height;\n    var base = idx ? rect.x : rect.y;\n    return [base, base + (brushWidth || 0)];\n  };\n}\nexport function makeRectIsTargetByCursor(rect, api, targetModel) {\n  var boundingRect = normalizeRect(rect);\n  return function (e, localCursorPoint) {\n    return boundingRect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel);\n  };\n}\n// Consider width/height is negative.\nfunction normalizeRect(rect) {\n  return BoundingRect.create(rect);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport AxisBuilder from './AxisBuilder.js';\nimport BrushController from '../helper/BrushController.js';\nimport * as brushHelper from '../helper/brushHelper.js';\nimport * as graphic from '../../util/graphic.js';\nimport ComponentView from '../../view/Component.js';\nvar ParallelAxisView = /** @class */function (_super) {\n  __extends(ParallelAxisView, _super);\n  function ParallelAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ParallelAxisView.type;\n    return _this;\n  }\n  ParallelAxisView.prototype.init = function (ecModel, api) {\n    _super.prototype.init.apply(this, arguments);\n    (this._brushController = new BrushController(api.getZr())).on('brush', zrUtil.bind(this._onBrush, this));\n  };\n  ParallelAxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n    if (fromAxisAreaSelect(axisModel, ecModel, payload)) {\n      return;\n    }\n    this.axisModel = axisModel;\n    this.api = api;\n    this.group.removeAll();\n    var oldAxisGroup = this._axisGroup;\n    this._axisGroup = new graphic.Group();\n    this.group.add(this._axisGroup);\n    if (!axisModel.get('show')) {\n      return;\n    }\n    var coordSysModel = getCoordSysModel(axisModel, ecModel);\n    var coordSys = coordSysModel.coordinateSystem;\n    var areaSelectStyle = axisModel.getAreaSelectStyle();\n    var areaWidth = areaSelectStyle.width;\n    var dim = axisModel.axis.dim;\n    var axisLayout = coordSys.getAxisLayout(dim);\n    var builderOpt = zrUtil.extend({\n      strokeContainThreshold: areaWidth\n    }, axisLayout);\n    var axisBuilder = new AxisBuilder(axisModel, api, builderOpt);\n    axisBuilder.build();\n    this._axisGroup.add(axisBuilder.group);\n    this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api);\n    graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n  };\n  // /**\n  //  * @override\n  //  */\n  // updateVisual(axisModel, ecModel, api, payload) {\n  //     this._brushController && this._brushController\n  //         .updateCovers(getCoverInfoList(axisModel));\n  // }\n  ParallelAxisView.prototype._refreshBrushController = function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) {\n    // After filtering, axis may change, select area needs to be update.\n    var extent = axisModel.axis.getExtent();\n    var extentLen = extent[1] - extent[0];\n    var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value.\n    // width/height might be negative, which will be\n    // normalized in BoundingRect.\n    var rect = graphic.BoundingRect.create({\n      x: extent[0],\n      y: -areaWidth / 2,\n      width: extentLen,\n      height: areaWidth\n    });\n    rect.x -= extra;\n    rect.width += 2 * extra;\n    this._brushController.mount({\n      enableGlobalPan: true,\n      rotation: builderOpt.rotation,\n      x: builderOpt.position[0],\n      y: builderOpt.position[1]\n    }).setPanels([{\n      panelId: 'pl',\n      clipPath: brushHelper.makeRectPanelClipPath(rect),\n      isTargetByCursor: brushHelper.makeRectIsTargetByCursor(rect, api, coordSysModel),\n      getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect, 0)\n    }]).enableBrush({\n      brushType: 'lineX',\n      brushStyle: areaSelectStyle,\n      removeOnClick: true\n    }).updateCovers(getCoverInfoList(axisModel));\n  };\n  ParallelAxisView.prototype._onBrush = function (eventParam) {\n    var coverInfoList = eventParam.areas;\n    // Do not cache these object, because the mey be changed.\n    var axisModel = this.axisModel;\n    var axis = axisModel.axis;\n    var intervals = zrUtil.map(coverInfoList, function (coverInfo) {\n      return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)];\n    });\n    // If realtime is true, action is not dispatched on drag end, because\n    // the drag end emits the same params with the last drag move event,\n    // and may have some delay when using touch pad.\n    if (!axisModel.option.realtime === eventParam.isEnd || eventParam.removeOnClick) {\n      // jshint ignore:line\n      this.api.dispatchAction({\n        type: 'axisAreaSelect',\n        parallelAxisId: axisModel.id,\n        intervals: intervals\n      });\n    }\n  };\n  ParallelAxisView.prototype.dispose = function () {\n    this._brushController.dispose();\n  };\n  ParallelAxisView.type = 'parallelAxis';\n  return ParallelAxisView;\n}(ComponentView);\nfunction fromAxisAreaSelect(axisModel, ecModel, payload) {\n  return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({\n    mainType: 'parallelAxis',\n    query: payload\n  })[0] === axisModel;\n}\nfunction getCoverInfoList(axisModel) {\n  var axis = axisModel.axis;\n  return zrUtil.map(axisModel.activeIntervals, function (interval) {\n    return {\n      brushType: 'lineX',\n      panelId: 'pl',\n      range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)]\n    };\n  });\n}\nfunction getCoordSysModel(axisModel, ecModel) {\n  return ecModel.getComponent('parallel', axisModel.get('parallelIndex'));\n}\nexport default ParallelAxisView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nvar actionInfo = {\n  type: 'axisAreaSelect',\n  event: 'axisAreaSelected'\n  // update: 'updateVisual'\n};\nexport function installParallelActions(registers) {\n  registers.registerAction(actionInfo, function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'parallelAxis',\n      query: payload\n    }, function (parallelAxisModel) {\n      parallelAxisModel.axis.model.setActiveIntervals(payload.intervals);\n    });\n  });\n  /**\n   * @payload\n   */\n  registers.registerAction('parallelAxisExpand', function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'parallel',\n      query: payload\n    }, function (parallelModel) {\n      parallelModel.setAxisExpand(payload);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport parallelPreprocessor from '../../coord/parallel/parallelPreprocessor.js';\nimport ParallelView from './ParallelView.js';\nimport ParallelModel from '../../coord/parallel/ParallelModel.js';\nimport parallelCoordSysCreator from '../../coord/parallel/parallelCreator.js';\nimport axisModelCreator from '../../coord/axisModelCreator.js';\nimport ParallelAxisModel from '../../coord/parallel/AxisModel.js';\nimport ParallelAxisView from '../axis/ParallelAxisView.js';\nimport { installParallelActions } from '../axis/parallelAxisAction.js';\nvar defaultAxisOption = {\n  type: 'value',\n  areaSelectStyle: {\n    width: 20,\n    borderWidth: 1,\n    borderColor: 'rgba(160,197,232)',\n    color: 'rgba(160,197,232)',\n    opacity: 0.3\n  },\n  realtime: true,\n  z: 10\n};\nexport function install(registers) {\n  registers.registerComponentView(ParallelView);\n  registers.registerComponentModel(ParallelModel);\n  registers.registerCoordinateSystem('parallel', parallelCoordSysCreator);\n  registers.registerPreprocessor(parallelPreprocessor);\n  registers.registerComponentModel(ParallelAxisModel);\n  registers.registerComponentView(ParallelAxisView);\n  axisModelCreator(registers, 'parallel', ParallelAxisModel, defaultAxisOption);\n  installParallelActions(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport ParallelView from './ParallelView.js';\nimport ParallelSeriesModel from './ParallelSeries.js';\nimport parallelVisual from './parallelVisual.js';\nimport { install as installParallelComponent } from '../../component/parallel/install.js';\nexport function install(registers) {\n  use(installParallelComponent);\n  registers.registerChartView(ParallelView);\n  registers.registerSeriesModel(ParallelSeriesModel);\n  registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, parallelVisual);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport { enterEmphasis, leaveEmphasis, toggleHoverEmphasis, setStatesStylesFromModel } from '../../util/states.js';\nimport ChartView from '../../view/Chart.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { isString, retrieve3 } from 'zrender/lib/core/util.js';\nimport RoamController from '../../component/helper/RoamController.js';\nimport * as roamHelper from '../../component/helper/roamHelper.js';\nimport View from '../../coord/View.js';\nvar SankeyPathShape = /** @class */function () {\n  function SankeyPathShape() {\n    this.x1 = 0;\n    this.y1 = 0;\n    this.x2 = 0;\n    this.y2 = 0;\n    this.cpx1 = 0;\n    this.cpy1 = 0;\n    this.cpx2 = 0;\n    this.cpy2 = 0;\n    this.extent = 0;\n  }\n  return SankeyPathShape;\n}();\nvar SankeyPath = /** @class */function (_super) {\n  __extends(SankeyPath, _super);\n  function SankeyPath(opts) {\n    return _super.call(this, opts) || this;\n  }\n  SankeyPath.prototype.getDefaultShape = function () {\n    return new SankeyPathShape();\n  };\n  SankeyPath.prototype.buildPath = function (ctx, shape) {\n    var extent = shape.extent;\n    ctx.moveTo(shape.x1, shape.y1);\n    ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2);\n    if (shape.orient === 'vertical') {\n      ctx.lineTo(shape.x2 + extent, shape.y2);\n      ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1);\n    } else {\n      ctx.lineTo(shape.x2, shape.y2 + extent);\n      ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent);\n    }\n    ctx.closePath();\n  };\n  SankeyPath.prototype.highlight = function () {\n    enterEmphasis(this);\n  };\n  SankeyPath.prototype.downplay = function () {\n    leaveEmphasis(this);\n  };\n  return SankeyPath;\n}(graphic.Path);\nvar SankeyView = /** @class */function (_super) {\n  __extends(SankeyView, _super);\n  function SankeyView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SankeyView.type;\n    _this._mainGroup = new graphic.Group();\n    _this._focusAdjacencyDisabled = false;\n    return _this;\n  }\n  SankeyView.prototype.init = function (ecModel, api) {\n    this._controller = new RoamController(api.getZr());\n    this._controllerHost = {\n      target: this.group\n    };\n    this.group.add(this._mainGroup);\n  };\n  SankeyView.prototype.render = function (seriesModel, ecModel, api) {\n    var sankeyView = this;\n    var graph = seriesModel.getGraph();\n    var mainGroup = this._mainGroup;\n    var layoutInfo = seriesModel.layoutInfo;\n    // view width\n    var width = layoutInfo.width;\n    // view height\n    var height = layoutInfo.height;\n    var nodeData = seriesModel.getData();\n    var edgeData = seriesModel.getData('edge');\n    var orient = seriesModel.get('orient');\n    this._model = seriesModel;\n    mainGroup.removeAll();\n    mainGroup.x = layoutInfo.x;\n    mainGroup.y = layoutInfo.y;\n    this._updateViewCoordSys(seriesModel, api);\n    roamHelper.updateController(seriesModel, api, mainGroup, this._controller, this._controllerHost, null);\n    // generate a bezire Curve for each edge\n    graph.eachEdge(function (edge) {\n      var curve = new SankeyPath();\n      var ecData = getECData(curve);\n      ecData.dataIndex = edge.dataIndex;\n      ecData.seriesIndex = seriesModel.seriesIndex;\n      ecData.dataType = 'edge';\n      var edgeModel = edge.getModel();\n      var lineStyleModel = edgeModel.getModel('lineStyle');\n      var curvature = lineStyleModel.get('curveness');\n      var n1Layout = edge.node1.getLayout();\n      var node1Model = edge.node1.getModel();\n      var dragX1 = node1Model.get('localX');\n      var dragY1 = node1Model.get('localY');\n      var n2Layout = edge.node2.getLayout();\n      var node2Model = edge.node2.getModel();\n      var dragX2 = node2Model.get('localX');\n      var dragY2 = node2Model.get('localY');\n      var edgeLayout = edge.getLayout();\n      var x1;\n      var y1;\n      var x2;\n      var y2;\n      var cpx1;\n      var cpy1;\n      var cpx2;\n      var cpy2;\n      curve.shape.extent = Math.max(1, edgeLayout.dy);\n      curve.shape.orient = orient;\n      if (orient === 'vertical') {\n        x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy;\n        y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy;\n        x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty;\n        y2 = dragY2 != null ? dragY2 * height : n2Layout.y;\n        cpx1 = x1;\n        cpy1 = y1 * (1 - curvature) + y2 * curvature;\n        cpx2 = x2;\n        cpy2 = y1 * curvature + y2 * (1 - curvature);\n      } else {\n        x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx;\n        y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy;\n        x2 = dragX2 != null ? dragX2 * width : n2Layout.x;\n        y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty;\n        cpx1 = x1 * (1 - curvature) + x2 * curvature;\n        cpy1 = y1;\n        cpx2 = x1 * curvature + x2 * (1 - curvature);\n        cpy2 = y2;\n      }\n      curve.setShape({\n        x1: x1,\n        y1: y1,\n        x2: x2,\n        y2: y2,\n        cpx1: cpx1,\n        cpy1: cpy1,\n        cpx2: cpx2,\n        cpy2: cpy2\n      });\n      curve.useStyle(lineStyleModel.getItemStyle());\n      // Special color, use source node color or target node color\n      applyCurveStyle(curve.style, orient, edge);\n      var defaultEdgeLabelText = \"\" + edgeModel.get('value');\n      var edgeLabelStateModels = getLabelStatesModels(edgeModel, 'edgeLabel');\n      setLabelStyle(curve, edgeLabelStateModels, {\n        labelFetcher: {\n          getFormattedLabel: function (dataIndex, stateName, dataType, labelDimIndex, formatter, extendParams) {\n            return seriesModel.getFormattedLabel(dataIndex, stateName, 'edge', labelDimIndex,\n            // ensure edgeLabel formatter is provided\n            // to prevent the inheritance from `label.formatter` of the series\n            retrieve3(formatter, edgeLabelStateModels.normal && edgeLabelStateModels.normal.get('formatter'), defaultEdgeLabelText), extendParams);\n          }\n        },\n        labelDataIndex: edge.dataIndex,\n        defaultText: defaultEdgeLabelText\n      });\n      curve.setTextConfig({\n        position: 'inside'\n      });\n      var emphasisModel = edgeModel.getModel('emphasis');\n      setStatesStylesFromModel(curve, edgeModel, 'lineStyle', function (model) {\n        var style = model.getItemStyle();\n        applyCurveStyle(style, orient, edge);\n        return style;\n      });\n      mainGroup.add(curve);\n      edgeData.setItemGraphicEl(edge.dataIndex, curve);\n      var focus = emphasisModel.get('focus');\n      toggleHoverEmphasis(curve, focus === 'adjacency' ? edge.getAdjacentDataIndices() : focus === 'trajectory' ? edge.getTrajectoryDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    });\n    // Generate a rect for each node\n    graph.eachNode(function (node) {\n      var layout = node.getLayout();\n      var itemModel = node.getModel();\n      var dragX = itemModel.get('localX');\n      var dragY = itemModel.get('localY');\n      var emphasisModel = itemModel.getModel('emphasis');\n      var borderRadius = itemModel.get(['itemStyle', 'borderRadius']) || 0;\n      var rect = new graphic.Rect({\n        shape: {\n          x: dragX != null ? dragX * width : layout.x,\n          y: dragY != null ? dragY * height : layout.y,\n          width: layout.dx,\n          height: layout.dy,\n          r: borderRadius\n        },\n        style: itemModel.getModel('itemStyle').getItemStyle(),\n        z2: 10\n      });\n      setLabelStyle(rect, getLabelStatesModels(itemModel), {\n        labelFetcher: {\n          getFormattedLabel: function (dataIndex, stateName) {\n            return seriesModel.getFormattedLabel(dataIndex, stateName, 'node');\n          }\n        },\n        labelDataIndex: node.dataIndex,\n        defaultText: node.id\n      });\n      rect.disableLabelAnimation = true;\n      rect.setStyle('fill', node.getVisual('color'));\n      rect.setStyle('decal', node.getVisual('style').decal);\n      setStatesStylesFromModel(rect, itemModel);\n      mainGroup.add(rect);\n      nodeData.setItemGraphicEl(node.dataIndex, rect);\n      getECData(rect).dataType = 'node';\n      var focus = emphasisModel.get('focus');\n      toggleHoverEmphasis(rect, focus === 'adjacency' ? node.getAdjacentDataIndices() : focus === 'trajectory' ? node.getTrajectoryDataIndices() : focus, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    });\n    nodeData.eachItemGraphicEl(function (el, dataIndex) {\n      var itemModel = nodeData.getItemModel(dataIndex);\n      if (itemModel.get('draggable')) {\n        el.drift = function (dx, dy) {\n          sankeyView._focusAdjacencyDisabled = true;\n          this.shape.x += dx;\n          this.shape.y += dy;\n          this.dirty();\n          api.dispatchAction({\n            type: 'dragNode',\n            seriesId: seriesModel.id,\n            dataIndex: nodeData.getRawIndex(dataIndex),\n            localX: this.shape.x / width,\n            localY: this.shape.y / height\n          });\n        };\n        el.ondragend = function () {\n          sankeyView._focusAdjacencyDisabled = false;\n        };\n        el.draggable = true;\n        el.cursor = 'move';\n      }\n    });\n    if (!this._data && seriesModel.isAnimationEnabled()) {\n      mainGroup.setClipPath(createGridClipShape(mainGroup.getBoundingRect(), seriesModel, function () {\n        mainGroup.removeClipPath();\n      }));\n    }\n    this._data = seriesModel.getData();\n  };\n  SankeyView.prototype.dispose = function () {\n    this._controller && this._controller.dispose();\n    this._controllerHost = null;\n  };\n  SankeyView.prototype._updateViewCoordSys = function (seriesModel, api) {\n    var layoutInfo = seriesModel.layoutInfo;\n    var width = layoutInfo.width;\n    var height = layoutInfo.height;\n    var viewCoordSys = seriesModel.coordinateSystem = new View(null, {\n      api: api,\n      ecModel: seriesModel.ecModel\n    });\n    viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');\n    viewCoordSys.setBoundingRect(0, 0, width, height);\n    viewCoordSys.setCenter(seriesModel.get('center'));\n    viewCoordSys.setZoom(seriesModel.get('zoom'));\n    this._controllerHost.target.attr({\n      x: viewCoordSys.x,\n      y: viewCoordSys.y,\n      scaleX: viewCoordSys.scaleX,\n      scaleY: viewCoordSys.scaleY\n    });\n  };\n  SankeyView.type = 'sankey';\n  return SankeyView;\n}(ChartView);\n/**\n * Special color, use source node color or target node color\n * @param curveProps curve's style to parse\n * @param orient direction\n * @param edge current curve data\n */\nfunction applyCurveStyle(curveProps, orient, edge) {\n  switch (curveProps.fill) {\n    case 'source':\n      curveProps.fill = edge.node1.getVisual('color');\n      curveProps.decal = edge.node1.getVisual('style').decal;\n      break;\n    case 'target':\n      curveProps.fill = edge.node2.getVisual('color');\n      curveProps.decal = edge.node2.getVisual('style').decal;\n      break;\n    case 'gradient':\n      var sourceColor = edge.node1.getVisual('color');\n      var targetColor = edge.node2.getVisual('color');\n      if (isString(sourceColor) && isString(targetColor)) {\n        curveProps.fill = new graphic.LinearGradient(0, 0, +(orient === 'horizontal'), +(orient === 'vertical'), [{\n          color: sourceColor,\n          offset: 0\n        }, {\n          color: targetColor,\n          offset: 1\n        }]);\n      }\n  }\n}\n// Add animation to the view\nfunction createGridClipShape(rect, seriesModel, cb) {\n  var rectEl = new graphic.Rect({\n    shape: {\n      x: rect.x - 10,\n      y: rect.y - 10,\n      width: 0,\n      height: rect.height + 20\n    }\n  });\n  graphic.initProps(rectEl, {\n    shape: {\n      width: rect.width + 20\n    }\n  }, seriesModel, cb);\n  return rectEl;\n}\nexport default SankeyView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge.js';\nimport Model from '../../model/Model.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nimport tokens from '../../visual/tokens.js';\nvar SankeySeriesModel = /** @class */function (_super) {\n  __extends(SankeySeriesModel, _super);\n  function SankeySeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SankeySeriesModel.type;\n    return _this;\n  }\n  /**\n   * Init a graph data structure from data in option series\n   */\n  SankeySeriesModel.prototype.getInitialData = function (option, ecModel) {\n    var links = option.edges || option.links || [];\n    var nodes = option.data || option.nodes || [];\n    var levels = option.levels || [];\n    this.levelModels = [];\n    var levelModels = this.levelModels;\n    for (var i = 0; i < levels.length; i++) {\n      if (levels[i].depth != null && levels[i].depth >= 0) {\n        levelModels[levels[i].depth] = new Model(levels[i], this, ecModel);\n      } else {\n        if (process.env.NODE_ENV !== 'production') {\n          throw new Error('levels[i].depth is mandatory and should be natural number');\n        }\n      }\n    }\n    var graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink);\n    return graph.data;\n    function beforeLink(nodeData, edgeData) {\n      nodeData.wrapMethod('getItemModel', function (model, idx) {\n        var seriesModel = model.parentModel;\n        var layout = seriesModel.getData().getItemLayout(idx);\n        if (layout) {\n          var nodeDepth = layout.depth;\n          var levelModel = seriesModel.levelModels[nodeDepth];\n          if (levelModel) {\n            model.parentModel = levelModel;\n          }\n        }\n        return model;\n      });\n      edgeData.wrapMethod('getItemModel', function (model, idx) {\n        var seriesModel = model.parentModel;\n        var edge = seriesModel.getGraph().getEdgeByIndex(idx);\n        var layout = edge.node1.getLayout();\n        if (layout) {\n          var depth = layout.depth;\n          var levelModel = seriesModel.levelModels[depth];\n          if (levelModel) {\n            model.parentModel = levelModel;\n          }\n        }\n        return model;\n      });\n    }\n  };\n  SankeySeriesModel.prototype.setNodePosition = function (dataIndex, localPosition) {\n    var nodes = this.option.data || this.option.nodes;\n    var dataItem = nodes[dataIndex];\n    dataItem.localX = localPosition[0];\n    dataItem.localY = localPosition[1];\n  };\n  SankeySeriesModel.prototype.setCenter = function (center) {\n    this.option.center = center;\n  };\n  SankeySeriesModel.prototype.setZoom = function (zoom) {\n    this.option.zoom = zoom;\n  };\n  /**\n   * Return the graphic data structure\n   *\n   * @return graphic data structure\n   */\n  SankeySeriesModel.prototype.getGraph = function () {\n    return this.getData().graph;\n  };\n  /**\n   * Get edge data of graphic data structure\n   *\n   * @return data structure of list\n   */\n  SankeySeriesModel.prototype.getEdgeData = function () {\n    return this.getGraph().edgeData;\n  };\n  SankeySeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    function noValue(val) {\n      return isNaN(val) || val == null;\n    }\n    // dataType === 'node' or empty do not show tooltip by default\n    if (dataType === 'edge') {\n      var params = this.getDataParams(dataIndex, dataType);\n      var rawDataOpt = params.data;\n      var edgeValue = params.value;\n      var edgeName = rawDataOpt.source + ' -- ' + rawDataOpt.target;\n      return createTooltipMarkup('nameValue', {\n        name: edgeName,\n        value: edgeValue,\n        noValue: noValue(edgeValue)\n      });\n    }\n    // dataType === 'node'\n    else {\n      var node = this.getGraph().getNodeByIndex(dataIndex);\n      var value = node.getLayout().value;\n      var name_1 = this.getDataParams(dataIndex, dataType).data.name;\n      return createTooltipMarkup('nameValue', {\n        name: name_1 != null ? name_1 + '' : null,\n        value: value,\n        noValue: noValue(value)\n      });\n    }\n  };\n  SankeySeriesModel.prototype.optionUpdated = function () {};\n  // Override Series.getDataParams()\n  SankeySeriesModel.prototype.getDataParams = function (dataIndex, dataType) {\n    var params = _super.prototype.getDataParams.call(this, dataIndex, dataType);\n    if (params.value == null && dataType === 'node') {\n      var node = this.getGraph().getNodeByIndex(dataIndex);\n      var nodeValue = node.getLayout().value;\n      params.value = nodeValue;\n    }\n    return params;\n  };\n  SankeySeriesModel.type = 'series.sankey';\n  SankeySeriesModel.layoutMode = 'box';\n  SankeySeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    // `coordinateSystem` can be declared as 'matrix', 'calendar',\n    //  which provides box layout container.\n    coordinateSystemUsage: 'box',\n    left: '5%',\n    top: '5%',\n    right: '20%',\n    bottom: '5%',\n    orient: 'horizontal',\n    nodeWidth: 20,\n    nodeGap: 8,\n    draggable: true,\n    layoutIterations: 32,\n    // true | false | 'move' | 'scale', see module:component/helper/RoamController.\n    roam: false,\n    roamTrigger: 'global',\n    center: null,\n    zoom: 1,\n    label: {\n      show: true,\n      position: 'right',\n      fontSize: 12\n    },\n    edgeLabel: {\n      show: false,\n      fontSize: 12\n    },\n    levels: [],\n    nodeAlign: 'justify',\n    lineStyle: {\n      color: tokens.color.neutral50,\n      opacity: 0.2,\n      curveness: 0.5\n    },\n    emphasis: {\n      label: {\n        show: true\n      },\n      lineStyle: {\n        opacity: 0.5\n      }\n    },\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary\n      }\n    },\n    animationEasing: 'linear',\n    animationDuration: 1000\n  };\n  return SankeySeriesModel;\n}(SeriesModel);\nexport default SankeySeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { groupData } from '../../util/model.js';\nimport { createBoxLayoutReference, getLayoutRect } from '../../util/layout.js';\nexport default function sankeyLayout(ecModel, api) {\n  ecModel.eachSeriesByType('sankey', function (seriesModel) {\n    var nodeWidth = seriesModel.get('nodeWidth');\n    var nodeGap = seriesModel.get('nodeGap');\n    var refContainer = createBoxLayoutReference(seriesModel, api).refContainer;\n    var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), refContainer);\n    seriesModel.layoutInfo = layoutInfo;\n    var width = layoutInfo.width;\n    var height = layoutInfo.height;\n    var graph = seriesModel.getGraph();\n    var nodes = graph.nodes;\n    var edges = graph.edges;\n    computeNodeValues(nodes);\n    var filteredNodes = zrUtil.filter(nodes, function (node) {\n      return node.getLayout().value === 0;\n    });\n    var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');\n    var orient = seriesModel.get('orient');\n    var nodeAlign = seriesModel.get('nodeAlign');\n    layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign);\n  });\n}\nfunction layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) {\n  computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign);\n  computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient);\n  computeEdgeDepths(nodes, orient);\n}\n/**\n * Compute the value of each node by summing the associated edge's value\n */\nfunction computeNodeValues(nodes) {\n  zrUtil.each(nodes, function (node) {\n    var value1 = sum(node.outEdges, getEdgeValue);\n    var value2 = sum(node.inEdges, getEdgeValue);\n    var nodeRawValue = node.getValue() || 0;\n    var value = Math.max(value1, value2, nodeRawValue);\n    node.setLayout({\n      value: value\n    }, true);\n  });\n}\n/**\n * Compute the x-position for each node.\n *\n * Here we use Kahn algorithm to detect cycle when we traverse\n * the node to computer the initial x position.\n */\nfunction computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) {\n  // Used to mark whether the edge is deleted. if it is deleted,\n  // the value is 0, otherwise it is 1.\n  var remainEdges = [];\n  // Storage each node's indegree.\n  var indegreeArr = [];\n  // Used to storage the node with indegree is equal to 0.\n  var zeroIndegrees = [];\n  var nextTargetNode = [];\n  var x = 0;\n  // let kx = 0;\n  for (var i = 0; i < edges.length; i++) {\n    remainEdges[i] = 1;\n  }\n  for (var i = 0; i < nodes.length; i++) {\n    indegreeArr[i] = nodes[i].inEdges.length;\n    if (indegreeArr[i] === 0) {\n      zeroIndegrees.push(nodes[i]);\n    }\n  }\n  var maxNodeDepth = -1;\n  // Traversing nodes using topological sorting to calculate the\n  // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical')\n  // position of the nodes.\n  while (zeroIndegrees.length) {\n    for (var idx = 0; idx < zeroIndegrees.length; idx++) {\n      var node = zeroIndegrees[idx];\n      var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n      var isItemDepth = item.depth != null && item.depth >= 0;\n      if (isItemDepth && item.depth > maxNodeDepth) {\n        maxNodeDepth = item.depth;\n      }\n      node.setLayout({\n        depth: isItemDepth ? item.depth : x\n      }, true);\n      orient === 'vertical' ? node.setLayout({\n        dy: nodeWidth\n      }, true) : node.setLayout({\n        dx: nodeWidth\n      }, true);\n      for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) {\n        var edge = node.outEdges[edgeIdx];\n        var indexEdge = edges.indexOf(edge);\n        remainEdges[indexEdge] = 0;\n        var targetNode = edge.node2;\n        var nodeIndex = nodes.indexOf(targetNode);\n        if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) {\n          nextTargetNode.push(targetNode);\n        }\n      }\n    }\n    ++x;\n    zeroIndegrees = nextTargetNode;\n    nextTargetNode = [];\n  }\n  for (var i = 0; i < remainEdges.length; i++) {\n    if (remainEdges[i] === 1) {\n      throw new Error('Sankey is a DAG, the original data has cycle!');\n    }\n  }\n  var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1;\n  if (nodeAlign && nodeAlign !== 'left') {\n    adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth);\n  }\n  var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth;\n  scaleNodeBreadths(nodes, kx, orient);\n}\nfunction isNodeDepth(node) {\n  var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n  return item.depth != null && item.depth >= 0;\n}\nfunction adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) {\n  if (nodeAlign === 'right') {\n    var nextSourceNode = [];\n    var remainNodes = nodes;\n    var nodeHeight = 0;\n    while (remainNodes.length) {\n      for (var i = 0; i < remainNodes.length; i++) {\n        var node = remainNodes[i];\n        node.setLayout({\n          skNodeHeight: nodeHeight\n        }, true);\n        for (var j = 0; j < node.inEdges.length; j++) {\n          var edge = node.inEdges[j];\n          if (nextSourceNode.indexOf(edge.node1) < 0) {\n            nextSourceNode.push(edge.node1);\n          }\n        }\n      }\n      remainNodes = nextSourceNode;\n      nextSourceNode = [];\n      ++nodeHeight;\n    }\n    zrUtil.each(nodes, function (node) {\n      if (!isNodeDepth(node)) {\n        node.setLayout({\n          depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight)\n        }, true);\n      }\n    });\n  } else if (nodeAlign === 'justify') {\n    moveSinksRight(nodes, maxDepth);\n  }\n}\n/**\n * All the node without outEgdes are assigned maximum x-position and\n *     be aligned in the last column.\n *\n * @param nodes.  node of sankey view.\n * @param maxDepth.  use to assign to node without outEdges as x-position.\n */\nfunction moveSinksRight(nodes, maxDepth) {\n  zrUtil.each(nodes, function (node) {\n    if (!isNodeDepth(node) && !node.outEdges.length) {\n      node.setLayout({\n        depth: maxDepth\n      }, true);\n    }\n  });\n}\n/**\n * Scale node x-position to the width\n *\n * @param nodes  node of sankey view\n * @param kx   multiple used to scale nodes\n */\nfunction scaleNodeBreadths(nodes, kx, orient) {\n  zrUtil.each(nodes, function (node) {\n    var nodeDepth = node.getLayout().depth * kx;\n    orient === 'vertical' ? node.setLayout({\n      y: nodeDepth\n    }, true) : node.setLayout({\n      x: nodeDepth\n    }, true);\n  });\n}\n/**\n * Using Gauss-Seidel iterations method to compute the node depth(y-position)\n *\n * @param nodes  node of sankey view\n * @param edges  edge of sankey view\n * @param height  the whole height of the area to draw the view\n * @param nodeGap  the vertical distance between two nodes\n *     in the same column.\n * @param iterations  the number of iterations for the algorithm\n */\nfunction computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) {\n  var nodesByBreadth = prepareNodesByBreadth(nodes, orient);\n  initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient);\n  resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n  for (var alpha = 1; iterations > 0; iterations--) {\n    // 0.99 is a experience parameter, ensure that each iterations of\n    // changes as small as possible.\n    alpha *= 0.99;\n    relaxRightToLeft(nodesByBreadth, alpha, orient);\n    resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n    relaxLeftToRight(nodesByBreadth, alpha, orient);\n    resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n  }\n}\nfunction prepareNodesByBreadth(nodes, orient) {\n  var nodesByBreadth = [];\n  var keyAttr = orient === 'vertical' ? 'y' : 'x';\n  var groupResult = groupData(nodes, function (node) {\n    return node.getLayout()[keyAttr];\n  });\n  groupResult.keys.sort(function (a, b) {\n    return a - b;\n  });\n  zrUtil.each(groupResult.keys, function (key) {\n    nodesByBreadth.push(groupResult.buckets.get(key));\n  });\n  return nodesByBreadth;\n}\n/**\n * Compute the original y-position for each node\n */\nfunction initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) {\n  var minKy = Infinity;\n  zrUtil.each(nodesByBreadth, function (nodes) {\n    var n = nodes.length;\n    var sum = 0;\n    zrUtil.each(nodes, function (node) {\n      sum += node.getLayout().value;\n    });\n    var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum;\n    if (ky < minKy) {\n      minKy = ky;\n    }\n  });\n  zrUtil.each(nodesByBreadth, function (nodes) {\n    zrUtil.each(nodes, function (node, i) {\n      var nodeDy = node.getLayout().value * minKy;\n      if (orient === 'vertical') {\n        node.setLayout({\n          x: i\n        }, true);\n        node.setLayout({\n          dx: nodeDy\n        }, true);\n      } else {\n        node.setLayout({\n          y: i\n        }, true);\n        node.setLayout({\n          dy: nodeDy\n        }, true);\n      }\n    });\n  });\n  zrUtil.each(edges, function (edge) {\n    var edgeDy = +edge.getValue() * minKy;\n    edge.setLayout({\n      dy: edgeDy\n    }, true);\n  });\n}\n/**\n * Resolve the collision of initialized depth (y-position)\n */\nfunction resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) {\n  var keyAttr = orient === 'vertical' ? 'x' : 'y';\n  zrUtil.each(nodesByBreadth, function (nodes) {\n    nodes.sort(function (a, b) {\n      return a.getLayout()[keyAttr] - b.getLayout()[keyAttr];\n    });\n    var nodeX;\n    var node;\n    var dy;\n    var y0 = 0;\n    var n = nodes.length;\n    var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy';\n    for (var i = 0; i < n; i++) {\n      node = nodes[i];\n      dy = y0 - node.getLayout()[keyAttr];\n      if (dy > 0) {\n        nodeX = node.getLayout()[keyAttr] + dy;\n        orient === 'vertical' ? node.setLayout({\n          x: nodeX\n        }, true) : node.setLayout({\n          y: nodeX\n        }, true);\n      }\n      y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap;\n    }\n    var viewWidth = orient === 'vertical' ? width : height;\n    // If the bottommost node goes outside the bounds, push it back up\n    dy = y0 - nodeGap - viewWidth;\n    if (dy > 0) {\n      nodeX = node.getLayout()[keyAttr] - dy;\n      orient === 'vertical' ? node.setLayout({\n        x: nodeX\n      }, true) : node.setLayout({\n        y: nodeX\n      }, true);\n      y0 = nodeX;\n      for (var i = n - 2; i >= 0; --i) {\n        node = nodes[i];\n        dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0;\n        if (dy > 0) {\n          nodeX = node.getLayout()[keyAttr] - dy;\n          orient === 'vertical' ? node.setLayout({\n            x: nodeX\n          }, true) : node.setLayout({\n            y: nodeX\n          }, true);\n        }\n        y0 = node.getLayout()[keyAttr];\n      }\n    }\n  });\n}\n/**\n * Change the y-position of the nodes, except most the right side nodes\n * @param nodesByBreadth\n * @param alpha  parameter used to adjust the nodes y-position\n */\nfunction relaxRightToLeft(nodesByBreadth, alpha, orient) {\n  zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) {\n    zrUtil.each(nodes, function (node) {\n      if (node.outEdges.length) {\n        var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue);\n        if (isNaN(y)) {\n          var len = node.outEdges.length;\n          y = len ? sum(node.outEdges, centerTarget, orient) / len : 0;\n        }\n        if (orient === 'vertical') {\n          var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\n          node.setLayout({\n            x: nodeX\n          }, true);\n        } else {\n          var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\n          node.setLayout({\n            y: nodeY\n          }, true);\n        }\n      }\n    });\n  });\n}\nfunction weightedTarget(edge, orient) {\n  return center(edge.node2, orient) * edge.getValue();\n}\nfunction centerTarget(edge, orient) {\n  return center(edge.node2, orient);\n}\nfunction weightedSource(edge, orient) {\n  return center(edge.node1, orient) * edge.getValue();\n}\nfunction centerSource(edge, orient) {\n  return center(edge.node1, orient);\n}\nfunction center(node, orient) {\n  return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2;\n}\nfunction getEdgeValue(edge) {\n  return edge.getValue();\n}\nfunction sum(array, cb, orient) {\n  var sum = 0;\n  var len = array.length;\n  var i = -1;\n  while (++i < len) {\n    var value = +cb(array[i], orient);\n    if (!isNaN(value)) {\n      sum += value;\n    }\n  }\n  return sum;\n}\n/**\n * Change the y-position of the nodes, except most the left side nodes\n */\nfunction relaxLeftToRight(nodesByBreadth, alpha, orient) {\n  zrUtil.each(nodesByBreadth, function (nodes) {\n    zrUtil.each(nodes, function (node) {\n      if (node.inEdges.length) {\n        var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue);\n        if (isNaN(y)) {\n          var len = node.inEdges.length;\n          y = len ? sum(node.inEdges, centerSource, orient) / len : 0;\n        }\n        if (orient === 'vertical') {\n          var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\n          node.setLayout({\n            x: nodeX\n          }, true);\n        } else {\n          var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\n          node.setLayout({\n            y: nodeY\n          }, true);\n        }\n      }\n    });\n  });\n}\n/**\n * Compute the depth(y-position) of each edge\n */\nfunction computeEdgeDepths(nodes, orient) {\n  var keyAttr = orient === 'vertical' ? 'x' : 'y';\n  zrUtil.each(nodes, function (node) {\n    node.outEdges.sort(function (a, b) {\n      return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr];\n    });\n    node.inEdges.sort(function (a, b) {\n      return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr];\n    });\n  });\n  zrUtil.each(nodes, function (node) {\n    var sy = 0;\n    var ty = 0;\n    zrUtil.each(node.outEdges, function (edge) {\n      edge.setLayout({\n        sy: sy\n      }, true);\n      sy += edge.getLayout().dy;\n    });\n    zrUtil.each(node.inEdges, function (edge) {\n      edge.setLayout({\n        ty: ty\n      }, true);\n      ty += edge.getLayout().dy;\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport VisualMapping from '../../visual/VisualMapping.js';\nexport default function sankeyVisual(ecModel) {\n  ecModel.eachSeriesByType('sankey', function (seriesModel) {\n    var graph = seriesModel.getGraph();\n    var nodes = graph.nodes;\n    var edges = graph.edges;\n    if (nodes.length) {\n      var minValue_1 = Infinity;\n      var maxValue_1 = -Infinity;\n      zrUtil.each(nodes, function (node) {\n        var nodeValue = node.getLayout().value;\n        if (nodeValue < minValue_1) {\n          minValue_1 = nodeValue;\n        }\n        if (nodeValue > maxValue_1) {\n          maxValue_1 = nodeValue;\n        }\n      });\n      zrUtil.each(nodes, function (node) {\n        var mapping = new VisualMapping({\n          type: 'color',\n          mappingMethod: 'linear',\n          dataExtent: [minValue_1, maxValue_1],\n          visual: seriesModel.get('color')\n        });\n        var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);\n        var customColor = node.getModel().get(['itemStyle', 'color']);\n        if (customColor != null) {\n          node.setVisual('color', customColor);\n          node.setVisual('style', {\n            fill: customColor\n          });\n        } else {\n          node.setVisual('color', mapValueToColor);\n          node.setVisual('style', {\n            fill: mapValueToColor\n          });\n        }\n      });\n    }\n    if (edges.length) {\n      zrUtil.each(edges, function (edge) {\n        var edgeStyle = edge.getModel().get('lineStyle');\n        edge.setVisual('style', edgeStyle);\n      });\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport SankeyView from './SankeyView.js';\nimport SankeySeriesModel from './SankeySeries.js';\nimport sankeyLayout from './sankeyLayout.js';\nimport sankeyVisual from './sankeyVisual.js';\nimport { updateCenterAndZoomInAction } from '../../component/helper/roamHelper.js';\nexport function install(registers) {\n  registers.registerChartView(SankeyView);\n  registers.registerSeriesModel(SankeySeriesModel);\n  registers.registerLayout(sankeyLayout);\n  registers.registerVisual(sankeyVisual);\n  registers.registerAction({\n    type: 'dragNode',\n    event: 'dragnode',\n    // here can only use 'update' now, other value is not support in echarts.\n    update: 'update'\n  }, function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'sankey',\n      query: payload\n    }, function (seriesModel) {\n      seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]);\n    });\n  });\n  registers.registerAction({\n    type: 'sankeyRoam',\n    event: 'sankeyRoam',\n    update: 'none'\n  }, function (payload, ecModel, api) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'sankey',\n      query: payload\n    }, function (seriesModel) {\n      var coordSys = seriesModel.coordinateSystem;\n      var res = updateCenterAndZoomInAction(coordSys, payload, seriesModel.get('scaleLimit'));\n      seriesModel.setCenter(res.center);\n      seriesModel.setZoom(res.zoom);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport createSeriesDataSimply from './createSeriesDataSimply.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { getDimensionTypeByAxis } from '../../data/helper/dimensionHelper.js';\nimport { makeSeriesEncodeForAxisCoordSys } from '../../data/helper/sourceHelper.js';\nvar WhiskerBoxCommonMixin = /** @class */function () {\n  function WhiskerBoxCommonMixin() {}\n  /**\n   * @private\n   */\n  WhiskerBoxCommonMixin.prototype._hasEncodeRule = function (key) {\n    var encodeRules = this.getEncode();\n    return encodeRules && encodeRules.get(key) != null;\n  };\n  /**\n   * @override\n   */\n  WhiskerBoxCommonMixin.prototype.getInitialData = function (option, ecModel) {\n    // When both types of xAxis and yAxis are 'value', layout is\n    // needed to be specified by user. Otherwise, layout can be\n    // judged by which axis is category.\n    var ordinalMeta;\n    var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex'));\n    var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex'));\n    var xAxisType = xAxisModel.get('type');\n    var yAxisType = yAxisModel.get('type');\n    var addOrdinal;\n    // FIXME\n    // Consider time axis.\n    if (xAxisType === 'category') {\n      option.layout = 'horizontal';\n      ordinalMeta = xAxisModel.getOrdinalMeta();\n      addOrdinal = !this._hasEncodeRule('x');\n    } else if (yAxisType === 'category') {\n      option.layout = 'vertical';\n      ordinalMeta = yAxisModel.getOrdinalMeta();\n      addOrdinal = !this._hasEncodeRule('y');\n    } else {\n      option.layout = option.layout || 'horizontal';\n    }\n    var coordDims = ['x', 'y'];\n    var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1;\n    var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex];\n    var otherAxisDim = coordDims[1 - baseAxisDimIndex];\n    var axisModels = [xAxisModel, yAxisModel];\n    var baseAxisType = axisModels[baseAxisDimIndex].get('type');\n    var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type');\n    var data = option.data;\n    // Clone a new data for next setOption({}) usage.\n    // Avoid modifying current data will affect further update.\n    if (data && addOrdinal) {\n      var newOptionData_1 = [];\n      zrUtil.each(data, function (item, index) {\n        var newItem;\n        if (zrUtil.isArray(item)) {\n          newItem = item.slice();\n          // Modify current using data.\n          item.unshift(index);\n        } else if (zrUtil.isArray(item.value)) {\n          newItem = zrUtil.extend({}, item);\n          newItem.value = newItem.value.slice();\n          // Modify current using data.\n          item.value.unshift(index);\n        } else {\n          newItem = item;\n        }\n        newOptionData_1.push(newItem);\n      });\n      option.data = newOptionData_1;\n    }\n    var defaultValueDimensions = this.defaultValueDimensions;\n    var coordDimensions = [{\n      name: baseAxisDim,\n      type: getDimensionTypeByAxis(baseAxisType),\n      ordinalMeta: ordinalMeta,\n      otherDims: {\n        tooltip: false,\n        itemName: 0\n      },\n      dimsDef: ['base']\n    }, {\n      name: otherAxisDim,\n      type: getDimensionTypeByAxis(otherAxisType),\n      dimsDef: defaultValueDimensions.slice()\n    }];\n    return createSeriesDataSimply(this, {\n      coordDimensions: coordDimensions,\n      dimensionsCount: defaultValueDimensions.length + 1,\n      encodeDefaulter: zrUtil.curry(makeSeriesEncodeForAxisCoordSys, coordDimensions, this)\n    });\n  };\n  /**\n   * If horizontal, base axis is x, otherwise y.\n   * @override\n   */\n  WhiskerBoxCommonMixin.prototype.getBaseAxis = function () {\n    var dim = this._baseAxisDim;\n    return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;\n  };\n  return WhiskerBoxCommonMixin;\n}();\n;\nexport { WhiskerBoxCommonMixin };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport { WhiskerBoxCommonMixin } from '../helper/whiskerBoxCommon.js';\nimport { mixin } from 'zrender/lib/core/util.js';\nimport tokens from '../../visual/tokens.js';\nvar BoxplotSeriesModel = /** @class */function (_super) {\n  __extends(BoxplotSeriesModel, _super);\n  function BoxplotSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = BoxplotSeriesModel.type;\n    // TODO\n    // box width represents group size, so dimension should have 'size'.\n    /**\n     * @see <https://en.wikipedia.org/wiki/Box_plot>\n     * The meanings of 'min' and 'max' depend on user,\n     * and echarts do not need to know it.\n     * @readOnly\n     */\n    _this.defaultValueDimensions = [{\n      name: 'min',\n      defaultTooltip: true\n    }, {\n      name: 'Q1',\n      defaultTooltip: true\n    }, {\n      name: 'median',\n      defaultTooltip: true\n    }, {\n      name: 'Q3',\n      defaultTooltip: true\n    }, {\n      name: 'max',\n      defaultTooltip: true\n    }];\n    _this.visualDrawType = 'stroke';\n    return _this;\n  }\n  BoxplotSeriesModel.type = 'series.boxplot';\n  BoxplotSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid'];\n  BoxplotSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    coordinateSystem: 'cartesian2d',\n    legendHoverLink: true,\n    layout: null,\n    boxWidth: [7, 50],\n    itemStyle: {\n      color: tokens.color.neutral00,\n      borderWidth: 1\n    },\n    emphasis: {\n      scale: true,\n      itemStyle: {\n        borderWidth: 2,\n        shadowBlur: 5,\n        shadowOffsetX: 1,\n        shadowOffsetY: 1,\n        shadowColor: tokens.color.shadow\n      }\n    },\n    animationDuration: 800\n  };\n  return BoxplotSeriesModel;\n}(SeriesModel);\nmixin(BoxplotSeriesModel, WhiskerBoxCommonMixin, true);\nexport default BoxplotSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ChartView from '../../view/Chart.js';\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport Path from 'zrender/lib/graphic/Path.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nvar BoxplotView = /** @class */function (_super) {\n  __extends(BoxplotView, _super);\n  function BoxplotView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = BoxplotView.type;\n    return _this;\n  }\n  BoxplotView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var group = this.group;\n    var oldData = this._data;\n    // There is no old data only when first rendering or switching from\n    // stream mode to normal mode, where previous elements should be removed.\n    if (!this._data) {\n      group.removeAll();\n    }\n    var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;\n    data.diff(oldData).add(function (newIdx) {\n      if (data.hasValue(newIdx)) {\n        var itemLayout = data.getItemLayout(newIdx);\n        var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true);\n        data.setItemGraphicEl(newIdx, symbolEl);\n        group.add(symbolEl);\n      }\n    }).update(function (newIdx, oldIdx) {\n      var symbolEl = oldData.getItemGraphicEl(oldIdx);\n      // Empty data\n      if (!data.hasValue(newIdx)) {\n        group.remove(symbolEl);\n        return;\n      }\n      var itemLayout = data.getItemLayout(newIdx);\n      if (!symbolEl) {\n        symbolEl = createNormalBox(itemLayout, data, newIdx, constDim);\n      } else {\n        saveOldStyle(symbolEl);\n        updateNormalBoxData(itemLayout, symbolEl, data, newIdx);\n      }\n      group.add(symbolEl);\n      data.setItemGraphicEl(newIdx, symbolEl);\n    }).remove(function (oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el && group.remove(el);\n    }).execute();\n    this._data = data;\n  };\n  BoxplotView.prototype.remove = function (ecModel) {\n    var group = this.group;\n    var data = this._data;\n    this._data = null;\n    data && data.eachItemGraphicEl(function (el) {\n      el && group.remove(el);\n    });\n  };\n  BoxplotView.type = 'boxplot';\n  return BoxplotView;\n}(ChartView);\nvar BoxPathShape = /** @class */function () {\n  function BoxPathShape() {}\n  return BoxPathShape;\n}();\nvar BoxPath = /** @class */function (_super) {\n  __extends(BoxPath, _super);\n  function BoxPath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'boxplotBoxPath';\n    return _this;\n  }\n  BoxPath.prototype.getDefaultShape = function () {\n    return new BoxPathShape();\n  };\n  BoxPath.prototype.buildPath = function (ctx, shape) {\n    var ends = shape.points;\n    var i = 0;\n    ctx.moveTo(ends[i][0], ends[i][1]);\n    i++;\n    for (; i < 4; i++) {\n      ctx.lineTo(ends[i][0], ends[i][1]);\n    }\n    ctx.closePath();\n    for (; i < ends.length; i++) {\n      ctx.moveTo(ends[i][0], ends[i][1]);\n      i++;\n      ctx.lineTo(ends[i][0], ends[i][1]);\n    }\n  };\n  return BoxPath;\n}(Path);\nfunction createNormalBox(itemLayout, data, dataIndex, constDim, isInit) {\n  var ends = itemLayout.ends;\n  var el = new BoxPath({\n    shape: {\n      points: isInit ? transInit(ends, constDim, itemLayout) : ends\n    }\n  });\n  updateNormalBoxData(itemLayout, el, data, dataIndex, isInit);\n  return el;\n}\nfunction updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) {\n  var seriesModel = data.hostModel;\n  var updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];\n  updateMethod(el, {\n    shape: {\n      points: itemLayout.ends\n    }\n  }, seriesModel, dataIndex);\n  el.useStyle(data.getItemVisual(dataIndex, 'style'));\n  el.style.strokeNoScale = true;\n  el.z2 = 100;\n  var itemModel = data.getItemModel(dataIndex);\n  var emphasisModel = itemModel.getModel('emphasis');\n  setStatesStylesFromModel(el, itemModel);\n  toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n}\nfunction transInit(points, dim, itemLayout) {\n  return zrUtil.map(points, function (point) {\n    point = point.slice();\n    point[dim] = itemLayout.initBaseline;\n    return point;\n  });\n}\nexport default BoxplotView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { parsePercent } from '../../util/number.js';\nvar each = zrUtil.each;\nexport default function boxplotLayout(ecModel) {\n  var groupResult = groupSeriesByAxis(ecModel);\n  each(groupResult, function (groupItem) {\n    var seriesModels = groupItem.seriesModels;\n    if (!seriesModels.length) {\n      return;\n    }\n    calculateBase(groupItem);\n    each(seriesModels, function (seriesModel, idx) {\n      layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]);\n    });\n  });\n}\n/**\n * Group series by axis.\n */\nfunction groupSeriesByAxis(ecModel) {\n  var result = [];\n  var axisList = [];\n  ecModel.eachSeriesByType('boxplot', function (seriesModel) {\n    var baseAxis = seriesModel.getBaseAxis();\n    var idx = zrUtil.indexOf(axisList, baseAxis);\n    if (idx < 0) {\n      idx = axisList.length;\n      axisList[idx] = baseAxis;\n      result[idx] = {\n        axis: baseAxis,\n        seriesModels: []\n      };\n    }\n    result[idx].seriesModels.push(seriesModel);\n  });\n  return result;\n}\n/**\n * Calculate offset and box width for each series.\n */\nfunction calculateBase(groupItem) {\n  var baseAxis = groupItem.axis;\n  var seriesModels = groupItem.seriesModels;\n  var seriesCount = seriesModels.length;\n  var boxWidthList = groupItem.boxWidthList = [];\n  var boxOffsetList = groupItem.boxOffsetList = [];\n  var boundList = [];\n  var bandWidth;\n  if (baseAxis.type === 'category') {\n    bandWidth = baseAxis.getBandWidth();\n  } else {\n    var maxDataCount_1 = 0;\n    each(seriesModels, function (seriesModel) {\n      maxDataCount_1 = Math.max(maxDataCount_1, seriesModel.getData().count());\n    });\n    var extent = baseAxis.getExtent();\n    bandWidth = Math.abs(extent[1] - extent[0]) / maxDataCount_1;\n  }\n  each(seriesModels, function (seriesModel) {\n    var boxWidthBound = seriesModel.get('boxWidth');\n    if (!zrUtil.isArray(boxWidthBound)) {\n      boxWidthBound = [boxWidthBound, boxWidthBound];\n    }\n    boundList.push([parsePercent(boxWidthBound[0], bandWidth) || 0, parsePercent(boxWidthBound[1], bandWidth) || 0]);\n  });\n  var availableWidth = bandWidth * 0.8 - 2;\n  var boxGap = availableWidth / seriesCount * 0.3;\n  var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;\n  var base = boxWidth / 2 - availableWidth / 2;\n  each(seriesModels, function (seriesModel, idx) {\n    boxOffsetList.push(base);\n    base += boxGap + boxWidth;\n    boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1]));\n  });\n}\n/**\n * Calculate points location for each series.\n */\nfunction layoutSingleSeries(seriesModel, offset, boxWidth) {\n  var coordSys = seriesModel.coordinateSystem;\n  var data = seriesModel.getData();\n  var halfWidth = boxWidth / 2;\n  var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1;\n  var vDimIdx = 1 - cDimIdx;\n  var coordDims = ['x', 'y'];\n  var cDim = data.mapDimension(coordDims[cDimIdx]);\n  var vDims = data.mapDimensionsAll(coordDims[vDimIdx]);\n  if (cDim == null || vDims.length < 5) {\n    return;\n  }\n  for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) {\n    var axisDimVal = data.get(cDim, dataIndex);\n    var median = getPoint(axisDimVal, vDims[2], dataIndex);\n    var end1 = getPoint(axisDimVal, vDims[0], dataIndex);\n    var end2 = getPoint(axisDimVal, vDims[1], dataIndex);\n    var end4 = getPoint(axisDimVal, vDims[3], dataIndex);\n    var end5 = getPoint(axisDimVal, vDims[4], dataIndex);\n    var ends = [];\n    addBodyEnd(ends, end2, false);\n    addBodyEnd(ends, end4, true);\n    ends.push(end1, end2, end5, end4);\n    layEndLine(ends, end1);\n    layEndLine(ends, end5);\n    layEndLine(ends, median);\n    data.setItemLayout(dataIndex, {\n      initBaseline: median[vDimIdx],\n      ends: ends\n    });\n  }\n  function getPoint(axisDimVal, dim, dataIndex) {\n    var val = data.get(dim, dataIndex);\n    var p = [];\n    p[cDimIdx] = axisDimVal;\n    p[vDimIdx] = val;\n    var point;\n    if (isNaN(axisDimVal) || isNaN(val)) {\n      point = [NaN, NaN];\n    } else {\n      point = coordSys.dataToPoint(p);\n      point[cDimIdx] += offset;\n    }\n    return point;\n  }\n  function addBodyEnd(ends, point, start) {\n    var point1 = point.slice();\n    var point2 = point.slice();\n    point1[cDimIdx] += halfWidth;\n    point2[cDimIdx] -= halfWidth;\n    start ? ends.push(point1, point2) : ends.push(point2, point1);\n  }\n  function layEndLine(ends, endCenter) {\n    var from = endCenter.slice();\n    var to = endCenter.slice();\n    from[cDimIdx] -= halfWidth;\n    to[cDimIdx] += halfWidth;\n    ends.push(from, to);\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { quantile, asc } from '../../util/number.js';\nimport { isFunction, isString } from 'zrender/lib/core/util.js';\n/**\n * See:\n *  <https://en.wikipedia.org/wiki/Box_plot#cite_note-frigge_hoaglin_iglewicz-2>\n *  <http://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/boxplot.stats.html>\n *\n * Helper method for preparing data.\n *\n * @param rawData like\n *        [\n *            [12,232,443], (raw data set for the first box)\n *            [3843,5545,1232], (raw data set for the second box)\n *            ...\n *        ]\n * @param opt.boundIQR=1.5 Data less than min bound is outlier.\n *      default 1.5, means Q1 - 1.5 * (Q3 - Q1).\n *      If 'none'/0 passed, min bound will not be used.\n */\nexport default function prepareBoxplotData(rawData, opt) {\n  opt = opt || {};\n  var boxData = [];\n  var outliers = [];\n  var boundIQR = opt.boundIQR;\n  var useExtreme = boundIQR === 'none' || boundIQR === 0;\n  for (var i = 0; i < rawData.length; i++) {\n    var ascList = asc(rawData[i].slice());\n    var Q1 = quantile(ascList, 0.25);\n    var Q2 = quantile(ascList, 0.5);\n    var Q3 = quantile(ascList, 0.75);\n    var min = ascList[0];\n    var max = ascList[ascList.length - 1];\n    var bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1);\n    var low = useExtreme ? min : Math.max(min, Q1 - bound);\n    var high = useExtreme ? max : Math.min(max, Q3 + bound);\n    var itemNameFormatter = opt.itemNameFormatter;\n    var itemName = isFunction(itemNameFormatter) ? itemNameFormatter({\n      value: i\n    }) : isString(itemNameFormatter) ? itemNameFormatter.replace('{value}', i + '') : i + '';\n    boxData.push([itemName, low, Q1, Q2, Q3, high]);\n    for (var j = 0; j < ascList.length; j++) {\n      var dataItem = ascList[j];\n      if (dataItem < low || dataItem > high) {\n        var outlier = [itemName, dataItem];\n        outliers.push(outlier);\n      }\n    }\n  }\n  return {\n    boxData: boxData,\n    outliers: outliers\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport prepareBoxplotData from './prepareBoxplotData.js';\nimport { throwError, makePrintable } from '../../util/log.js';\nimport { SOURCE_FORMAT_ARRAY_ROWS } from '../../util/types.js';\nexport var boxplotTransform = {\n  type: 'echarts:boxplot',\n  transform: function transform(params) {\n    var upstream = params.upstream;\n    if (upstream.sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS) {\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = makePrintable('source data is not applicable for this boxplot transform. Expect number[][].');\n      }\n      throwError(errMsg);\n    }\n    var result = prepareBoxplotData(upstream.getRawData(), params.config);\n    return [{\n      dimensions: ['ItemName', 'Low', 'Q1', 'Q2', 'Q3', 'High'],\n      data: result.boxData\n    }, {\n      data: result.outliers\n    }];\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport BoxplotSeriesModel from './BoxplotSeries.js';\nimport BoxplotView from './BoxplotView.js';\nimport boxplotLayout from './boxplotLayout.js';\nimport { boxplotTransform } from './boxplotTransform.js';\nexport function install(registers) {\n  registers.registerSeriesModel(BoxplotSeriesModel);\n  registers.registerChartView(BoxplotView);\n  registers.registerLayout(boxplotLayout);\n  registers.registerTransform(boxplotTransform);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport createRenderPlanner from '../helper/createRenderPlanner.js';\nimport { extend } from 'zrender/lib/core/util.js';\nvar positiveBorderColorQuery = ['itemStyle', 'borderColor'];\nvar negativeBorderColorQuery = ['itemStyle', 'borderColor0'];\nvar dojiBorderColorQuery = ['itemStyle', 'borderColorDoji'];\nvar positiveColorQuery = ['itemStyle', 'color'];\nvar negativeColorQuery = ['itemStyle', 'color0'];\nexport function getColor(sign, model) {\n  return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery);\n}\nexport function getBorderColor(sign, model) {\n  return model.get(sign === 0 ? dojiBorderColorQuery : sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery);\n}\nvar candlestickVisual = {\n  seriesType: 'candlestick',\n  plan: createRenderPlanner(),\n  // For legend.\n  performRawSeries: true,\n  reset: function (seriesModel, ecModel) {\n    // Only visible series has each data be visual encoded\n    if (ecModel.isSeriesFiltered(seriesModel)) {\n      return;\n    }\n    var isLargeRender = seriesModel.pipelineContext.large;\n    return !isLargeRender && {\n      progress: function (params, data) {\n        var dataIndex;\n        while ((dataIndex = params.next()) != null) {\n          var itemModel = data.getItemModel(dataIndex);\n          var sign = data.getItemLayout(dataIndex).sign;\n          var style = itemModel.getItemStyle();\n          style.fill = getColor(sign, itemModel);\n          style.stroke = getBorderColor(sign, itemModel) || style.fill;\n          var existsStyle = data.ensureUniqueItemVisual(dataIndex, 'style');\n          extend(existsStyle, style);\n        }\n      }\n    };\n  }\n};\nexport default candlestickVisual;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ChartView from '../../view/Chart.js';\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport Path from 'zrender/lib/graphic/Path.js';\nimport { createClipPath } from '../helper/createClipPathFromCoordSys.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nimport { getBorderColor, getColor } from './candlestickVisual.js';\nvar SKIP_PROPS = ['color', 'borderColor'];\nvar CandlestickView = /** @class */function (_super) {\n  __extends(CandlestickView, _super);\n  function CandlestickView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CandlestickView.type;\n    return _this;\n  }\n  CandlestickView.prototype.render = function (seriesModel, ecModel, api) {\n    // If there is clipPath created in large mode. Remove it.\n    this.group.removeClipPath();\n    // Clear previously rendered progressive elements.\n    this._progressiveEls = null;\n    this._updateDrawMode(seriesModel);\n    this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel);\n  };\n  CandlestickView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n    this._clear();\n    this._updateDrawMode(seriesModel);\n  };\n  CandlestickView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) {\n    this._progressiveEls = [];\n    this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel);\n  };\n  CandlestickView.prototype.eachRendered = function (cb) {\n    graphic.traverseElements(this._progressiveEls || this.group, cb);\n  };\n  CandlestickView.prototype._updateDrawMode = function (seriesModel) {\n    var isLargeDraw = seriesModel.pipelineContext.large;\n    if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) {\n      this._isLargeDraw = isLargeDraw;\n      this._clear();\n    }\n  };\n  CandlestickView.prototype._renderNormal = function (seriesModel) {\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var group = this.group;\n    var isSimpleBox = data.getLayout('isSimpleBox');\n    var needsClip = seriesModel.get('clip', true);\n    var coord = seriesModel.coordinateSystem;\n    var clipArea = coord.getArea && coord.getArea();\n    // There is no old data only when first rendering or switching from\n    // stream mode to normal mode, where previous elements should be removed.\n    if (!this._data) {\n      group.removeAll();\n    }\n    data.diff(oldData).add(function (newIdx) {\n      if (data.hasValue(newIdx)) {\n        var itemLayout = data.getItemLayout(newIdx);\n        if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) {\n          return;\n        }\n        var el = createNormalBox(itemLayout, newIdx, true);\n        graphic.initProps(el, {\n          shape: {\n            points: itemLayout.ends\n          }\n        }, seriesModel, newIdx);\n        setBoxCommon(el, data, newIdx, isSimpleBox);\n        group.add(el);\n        data.setItemGraphicEl(newIdx, el);\n      }\n    }).update(function (newIdx, oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      // Empty data\n      if (!data.hasValue(newIdx)) {\n        group.remove(el);\n        return;\n      }\n      var itemLayout = data.getItemLayout(newIdx);\n      if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) {\n        group.remove(el);\n        return;\n      }\n      if (!el) {\n        el = createNormalBox(itemLayout, newIdx);\n      } else {\n        graphic.updateProps(el, {\n          shape: {\n            points: itemLayout.ends\n          }\n        }, seriesModel, newIdx);\n        saveOldStyle(el);\n      }\n      setBoxCommon(el, data, newIdx, isSimpleBox);\n      group.add(el);\n      data.setItemGraphicEl(newIdx, el);\n    }).remove(function (oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el && group.remove(el);\n    }).execute();\n    this._data = data;\n  };\n  CandlestickView.prototype._renderLarge = function (seriesModel) {\n    this._clear();\n    createLarge(seriesModel, this.group);\n    var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null;\n    if (clipPath) {\n      this.group.setClipPath(clipPath);\n    } else {\n      this.group.removeClipPath();\n    }\n  };\n  CandlestickView.prototype._incrementalRenderNormal = function (params, seriesModel) {\n    var data = seriesModel.getData();\n    var isSimpleBox = data.getLayout('isSimpleBox');\n    var dataIndex;\n    while ((dataIndex = params.next()) != null) {\n      var itemLayout = data.getItemLayout(dataIndex);\n      var el = createNormalBox(itemLayout, dataIndex);\n      setBoxCommon(el, data, dataIndex, isSimpleBox);\n      el.incremental = true;\n      this.group.add(el);\n      this._progressiveEls.push(el);\n    }\n  };\n  CandlestickView.prototype._incrementalRenderLarge = function (params, seriesModel) {\n    createLarge(seriesModel, this.group, this._progressiveEls, true);\n  };\n  CandlestickView.prototype.remove = function (ecModel) {\n    this._clear();\n  };\n  CandlestickView.prototype._clear = function () {\n    this.group.removeAll();\n    this._data = null;\n  };\n  CandlestickView.type = 'candlestick';\n  return CandlestickView;\n}(ChartView);\nvar NormalBoxPathShape = /** @class */function () {\n  function NormalBoxPathShape() {}\n  return NormalBoxPathShape;\n}();\nvar NormalBoxPath = /** @class */function (_super) {\n  __extends(NormalBoxPath, _super);\n  function NormalBoxPath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'normalCandlestickBox';\n    return _this;\n  }\n  NormalBoxPath.prototype.getDefaultShape = function () {\n    return new NormalBoxPathShape();\n  };\n  NormalBoxPath.prototype.buildPath = function (ctx, shape) {\n    var ends = shape.points;\n    if (this.__simpleBox) {\n      ctx.moveTo(ends[4][0], ends[4][1]);\n      ctx.lineTo(ends[6][0], ends[6][1]);\n    } else {\n      ctx.moveTo(ends[0][0], ends[0][1]);\n      ctx.lineTo(ends[1][0], ends[1][1]);\n      ctx.lineTo(ends[2][0], ends[2][1]);\n      ctx.lineTo(ends[3][0], ends[3][1]);\n      ctx.closePath();\n      ctx.moveTo(ends[4][0], ends[4][1]);\n      ctx.lineTo(ends[5][0], ends[5][1]);\n      ctx.moveTo(ends[6][0], ends[6][1]);\n      ctx.lineTo(ends[7][0], ends[7][1]);\n    }\n  };\n  return NormalBoxPath;\n}(Path);\nfunction createNormalBox(itemLayout, dataIndex, isInit) {\n  var ends = itemLayout.ends;\n  return new NormalBoxPath({\n    shape: {\n      points: isInit ? transInit(ends, itemLayout) : ends\n    },\n    z2: 100\n  });\n}\nfunction isNormalBoxClipped(clipArea, itemLayout) {\n  var clipped = true;\n  for (var i = 0; i < itemLayout.ends.length; i++) {\n    // If any point are in the region.\n    if (clipArea.contain(itemLayout.ends[i][0], itemLayout.ends[i][1])) {\n      clipped = false;\n      break;\n    }\n  }\n  return clipped;\n}\nfunction setBoxCommon(el, data, dataIndex, isSimpleBox) {\n  var itemModel = data.getItemModel(dataIndex);\n  el.useStyle(data.getItemVisual(dataIndex, 'style'));\n  el.style.strokeNoScale = true;\n  el.__simpleBox = isSimpleBox;\n  setStatesStylesFromModel(el, itemModel);\n  var sign = data.getItemLayout(dataIndex).sign;\n  zrUtil.each(el.states, function (state, stateName) {\n    var stateModel = itemModel.getModel(stateName);\n    var color = getColor(sign, stateModel);\n    var borderColor = getBorderColor(sign, stateModel) || color;\n    var stateStyle = state.style || (state.style = {});\n    color && (stateStyle.fill = color);\n    borderColor && (stateStyle.stroke = borderColor);\n  });\n  var emphasisModel = itemModel.getModel('emphasis');\n  toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n}\nfunction transInit(points, itemLayout) {\n  return zrUtil.map(points, function (point) {\n    point = point.slice();\n    point[1] = itemLayout.initBaseline;\n    return point;\n  });\n}\nvar LargeBoxPathShape = /** @class */function () {\n  function LargeBoxPathShape() {}\n  return LargeBoxPathShape;\n}();\nvar LargeBoxPath = /** @class */function (_super) {\n  __extends(LargeBoxPath, _super);\n  function LargeBoxPath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this.type = 'largeCandlestickBox';\n    return _this;\n  }\n  LargeBoxPath.prototype.getDefaultShape = function () {\n    return new LargeBoxPathShape();\n  };\n  LargeBoxPath.prototype.buildPath = function (ctx, shape) {\n    // Drawing lines is more efficient than drawing\n    // a whole line or drawing rects.\n    var points = shape.points;\n    for (var i = 0; i < points.length;) {\n      if (this.__sign === points[i++]) {\n        var x = points[i++];\n        ctx.moveTo(x, points[i++]);\n        ctx.lineTo(x, points[i++]);\n      } else {\n        i += 3;\n      }\n    }\n  };\n  return LargeBoxPath;\n}(Path);\nfunction createLarge(seriesModel, group, progressiveEls, incremental) {\n  var data = seriesModel.getData();\n  var largePoints = data.getLayout('largePoints');\n  var elP = new LargeBoxPath({\n    shape: {\n      points: largePoints\n    },\n    __sign: 1,\n    ignoreCoarsePointer: true\n  });\n  group.add(elP);\n  var elN = new LargeBoxPath({\n    shape: {\n      points: largePoints\n    },\n    __sign: -1,\n    ignoreCoarsePointer: true\n  });\n  group.add(elN);\n  var elDoji = new LargeBoxPath({\n    shape: {\n      points: largePoints\n    },\n    __sign: 0,\n    ignoreCoarsePointer: true\n  });\n  group.add(elDoji);\n  setLargeStyle(1, elP, seriesModel, data);\n  setLargeStyle(-1, elN, seriesModel, data);\n  setLargeStyle(0, elDoji, seriesModel, data);\n  if (incremental) {\n    elP.incremental = true;\n    elN.incremental = true;\n  }\n  if (progressiveEls) {\n    progressiveEls.push(elP, elN);\n  }\n}\nfunction setLargeStyle(sign, el, seriesModel, data) {\n  // TODO put in visual?\n  var borderColor = getBorderColor(sign, seriesModel)\n  // Use color for border color by default.\n  || getColor(sign, seriesModel);\n  // Color must be excluded.\n  // Because symbol provide setColor individually to set fill and stroke\n  var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS);\n  el.useStyle(itemStyle);\n  el.style.fill = null;\n  el.style.stroke = borderColor;\n}\nexport default CandlestickView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport { WhiskerBoxCommonMixin } from '../helper/whiskerBoxCommon.js';\nimport { mixin } from 'zrender/lib/core/util.js';\nvar CandlestickSeriesModel = /** @class */function (_super) {\n  __extends(CandlestickSeriesModel, _super);\n  function CandlestickSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CandlestickSeriesModel.type;\n    _this.defaultValueDimensions = [{\n      name: 'open',\n      defaultTooltip: true\n    }, {\n      name: 'close',\n      defaultTooltip: true\n    }, {\n      name: 'lowest',\n      defaultTooltip: true\n    }, {\n      name: 'highest',\n      defaultTooltip: true\n    }];\n    return _this;\n  }\n  /**\n   * Get dimension for shadow in dataZoom\n   * @return dimension name\n   */\n  CandlestickSeriesModel.prototype.getShadowDim = function () {\n    return 'open';\n  };\n  CandlestickSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n    var itemLayout = data.getItemLayout(dataIndex);\n    return itemLayout && selectors.rect(itemLayout.brushRect);\n  };\n  CandlestickSeriesModel.type = 'series.candlestick';\n  CandlestickSeriesModel.dependencies = ['xAxis', 'yAxis', 'grid'];\n  CandlestickSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    coordinateSystem: 'cartesian2d',\n    legendHoverLink: true,\n    // xAxisIndex: 0,\n    // yAxisIndex: 0,\n    layout: null,\n    clip: true,\n    itemStyle: {\n      color: '#eb5454',\n      color0: '#47b262',\n      borderColor: '#eb5454',\n      borderColor0: '#47b262',\n      borderColorDoji: null,\n      // borderColor: '#d24040',\n      // borderColor0: '#398f4f',\n      borderWidth: 1\n    },\n    emphasis: {\n      itemStyle: {\n        borderWidth: 2\n      }\n    },\n    barMaxWidth: null,\n    barMinWidth: null,\n    barWidth: null,\n    large: true,\n    largeThreshold: 600,\n    progressive: 3e3,\n    progressiveThreshold: 1e4,\n    progressiveChunkMode: 'mod',\n    animationEasing: 'linear',\n    animationDuration: 300\n  };\n  return CandlestickSeriesModel;\n}(SeriesModel);\nmixin(CandlestickSeriesModel, WhiskerBoxCommonMixin, true);\nexport default CandlestickSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function candlestickPreprocessor(option) {\n  if (!option || !zrUtil.isArray(option.series)) {\n    return;\n  }\n  // Translate 'k' to 'candlestick'.\n  zrUtil.each(option.series, function (seriesItem) {\n    if (zrUtil.isObject(seriesItem) && seriesItem.type === 'k') {\n      seriesItem.type = 'candlestick';\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { subPixelOptimize } from '../../util/graphic.js';\nimport createRenderPlanner from '../helper/createRenderPlanner.js';\nimport { parsePercent } from '../../util/number.js';\nimport { map, retrieve2 } from 'zrender/lib/core/util.js';\nimport { createFloat32Array } from '../../util/vendor.js';\nvar candlestickLayout = {\n  seriesType: 'candlestick',\n  plan: createRenderPlanner(),\n  reset: function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    var data = seriesModel.getData();\n    var candleWidth = calculateCandleWidth(seriesModel, data);\n    var cDimIdx = 0;\n    var vDimIdx = 1;\n    var coordDims = ['x', 'y'];\n    var cDimI = data.getDimensionIndex(data.mapDimension(coordDims[cDimIdx]));\n    var vDimsI = map(data.mapDimensionsAll(coordDims[vDimIdx]), data.getDimensionIndex, data);\n    var openDimI = vDimsI[0];\n    var closeDimI = vDimsI[1];\n    var lowestDimI = vDimsI[2];\n    var highestDimI = vDimsI[3];\n    data.setLayout({\n      candleWidth: candleWidth,\n      // The value is experimented visually.\n      isSimpleBox: candleWidth <= 1.3\n    });\n    if (cDimI < 0 || vDimsI.length < 4) {\n      return;\n    }\n    return {\n      progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress\n    };\n    function normalProgress(params, data) {\n      var dataIndex;\n      var store = data.getStore();\n      while ((dataIndex = params.next()) != null) {\n        var axisDimVal = store.get(cDimI, dataIndex);\n        var openVal = store.get(openDimI, dataIndex);\n        var closeVal = store.get(closeDimI, dataIndex);\n        var lowestVal = store.get(lowestDimI, dataIndex);\n        var highestVal = store.get(highestDimI, dataIndex);\n        var ocLow = Math.min(openVal, closeVal);\n        var ocHigh = Math.max(openVal, closeVal);\n        var ocLowPoint = getPoint(ocLow, axisDimVal);\n        var ocHighPoint = getPoint(ocHigh, axisDimVal);\n        var lowestPoint = getPoint(lowestVal, axisDimVal);\n        var highestPoint = getPoint(highestVal, axisDimVal);\n        var ends = [];\n        addBodyEnd(ends, ocHighPoint, 0);\n        addBodyEnd(ends, ocLowPoint, 1);\n        ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint));\n        var itemModel = data.getItemModel(dataIndex);\n        var hasDojiColor = !!itemModel.get(['itemStyle', 'borderColorDoji']);\n        data.setItemLayout(dataIndex, {\n          sign: getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor),\n          initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx],\n          ends: ends,\n          brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal)\n        });\n      }\n      function getPoint(val, axisDimVal) {\n        var p = [];\n        p[cDimIdx] = axisDimVal;\n        p[vDimIdx] = val;\n        return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p);\n      }\n      function addBodyEnd(ends, point, start) {\n        var point1 = point.slice();\n        var point2 = point.slice();\n        point1[cDimIdx] = subPixelOptimize(point1[cDimIdx] + candleWidth / 2, 1, false);\n        point2[cDimIdx] = subPixelOptimize(point2[cDimIdx] - candleWidth / 2, 1, true);\n        start ? ends.push(point1, point2) : ends.push(point2, point1);\n      }\n      function makeBrushRect(lowestVal, highestVal, axisDimVal) {\n        var pmin = getPoint(lowestVal, axisDimVal);\n        var pmax = getPoint(highestVal, axisDimVal);\n        pmin[cDimIdx] -= candleWidth / 2;\n        pmax[cDimIdx] -= candleWidth / 2;\n        return {\n          x: pmin[0],\n          y: pmin[1],\n          width: vDimIdx ? candleWidth : pmax[0] - pmin[0],\n          height: vDimIdx ? pmax[1] - pmin[1] : candleWidth\n        };\n      }\n      function subPixelOptimizePoint(point) {\n        point[cDimIdx] = subPixelOptimize(point[cDimIdx], 1);\n        return point;\n      }\n    }\n    function largeProgress(params, data) {\n      // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...]\n      var points = createFloat32Array(params.count * 4);\n      var offset = 0;\n      var point;\n      var tmpIn = [];\n      var tmpOut = [];\n      var dataIndex;\n      var store = data.getStore();\n      var hasDojiColor = !!seriesModel.get(['itemStyle', 'borderColorDoji']);\n      while ((dataIndex = params.next()) != null) {\n        var axisDimVal = store.get(cDimI, dataIndex);\n        var openVal = store.get(openDimI, dataIndex);\n        var closeVal = store.get(closeDimI, dataIndex);\n        var lowestVal = store.get(lowestDimI, dataIndex);\n        var highestVal = store.get(highestDimI, dataIndex);\n        if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) {\n          points[offset++] = NaN;\n          offset += 3;\n          continue;\n        }\n        points[offset++] = getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor);\n        tmpIn[cDimIdx] = axisDimVal;\n        tmpIn[vDimIdx] = lowestVal;\n        point = coordSys.dataToPoint(tmpIn, null, tmpOut);\n        points[offset++] = point ? point[0] : NaN;\n        points[offset++] = point ? point[1] : NaN;\n        tmpIn[vDimIdx] = highestVal;\n        point = coordSys.dataToPoint(tmpIn, null, tmpOut);\n        points[offset++] = point ? point[1] : NaN;\n      }\n      data.setLayout('largePoints', points);\n    }\n  }\n};\n/**\n * Get the sign of a single data.\n *\n * @returns 0 for doji with hasDojiColor: true,\n *          1 for positive,\n *          -1 for negative.\n */\nfunction getSign(store, dataIndex, openVal, closeVal, closeDimI, hasDojiColor) {\n  var sign;\n  if (openVal > closeVal) {\n    sign = -1;\n  } else if (openVal < closeVal) {\n    sign = 1;\n  } else {\n    sign = hasDojiColor\n    // When doji color is set, use it instead of color/color0.\n    ? 0 : dataIndex > 0\n    // If close === open, compare with close of last record\n    ? store.get(closeDimI, dataIndex - 1) <= closeVal ? 1 : -1\n    // No record of previous, set to be positive\n    : 1;\n  }\n  return sign;\n}\nfunction calculateCandleWidth(seriesModel, data) {\n  var baseAxis = seriesModel.getBaseAxis();\n  var extent;\n  var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count());\n  var barMaxWidth = parsePercent(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth);\n  var barMinWidth = parsePercent(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth);\n  var barWidth = seriesModel.get('barWidth');\n  return barWidth != null ? parsePercent(barWidth, bandWidth)\n  // Put max outer to ensure bar visible in spite of overlap.\n  : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth);\n}\nexport default candlestickLayout;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport CandlestickView from './CandlestickView.js';\nimport CandlestickSeriesModel from './CandlestickSeries.js';\nimport preprocessor from './preprocessor.js';\nimport candlestickVisual from './candlestickVisual.js';\nimport candlestickLayout from './candlestickLayout.js';\nexport function install(registers) {\n  registers.registerChartView(CandlestickView);\n  registers.registerSeriesModel(CandlestickSeriesModel);\n  registers.registerPreprocessor(preprocessor);\n  registers.registerVisual(candlestickVisual);\n  registers.registerLayout(candlestickLayout);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { createSymbol, normalizeSymbolOffset, normalizeSymbolSize } from '../../util/symbol.js';\nimport { Group } from '../../util/graphic.js';\nimport { enterEmphasis, leaveEmphasis, toggleHoverEmphasis } from '../../util/states.js';\nimport SymbolClz from './Symbol.js';\nfunction updateRipplePath(rippleGroup, effectCfg) {\n  var color = effectCfg.rippleEffectColor || effectCfg.color;\n  rippleGroup.eachChild(function (ripplePath) {\n    ripplePath.attr({\n      z: effectCfg.z,\n      zlevel: effectCfg.zlevel,\n      style: {\n        stroke: effectCfg.brushType === 'stroke' ? color : null,\n        fill: effectCfg.brushType === 'fill' ? color : null\n      }\n    });\n  });\n}\nvar EffectSymbol = /** @class */function (_super) {\n  __extends(EffectSymbol, _super);\n  function EffectSymbol(data, idx) {\n    var _this = _super.call(this) || this;\n    var symbol = new SymbolClz(data, idx);\n    var rippleGroup = new Group();\n    _this.add(symbol);\n    _this.add(rippleGroup);\n    _this.updateData(data, idx);\n    return _this;\n  }\n  EffectSymbol.prototype.stopEffectAnimation = function () {\n    this.childAt(1).removeAll();\n  };\n  EffectSymbol.prototype.startEffectAnimation = function (effectCfg) {\n    var symbolType = effectCfg.symbolType;\n    var color = effectCfg.color;\n    var rippleNumber = effectCfg.rippleNumber;\n    var rippleGroup = this.childAt(1);\n    for (var i = 0; i < rippleNumber; i++) {\n      // If width/height are set too small (e.g., set to 1) on ios10\n      // and macOS Sierra, a circle stroke become a rect, no matter what\n      // the scale is set. So we set width/height as 2. See #4136.\n      var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color);\n      ripplePath.attr({\n        style: {\n          strokeNoScale: true\n        },\n        z2: 99,\n        silent: true,\n        scaleX: 0.5,\n        scaleY: 0.5\n      });\n      var delay = -i / rippleNumber * effectCfg.period + effectCfg.effectOffset;\n      ripplePath.animate('', true).when(effectCfg.period, {\n        scaleX: effectCfg.rippleScale / 2,\n        scaleY: effectCfg.rippleScale / 2\n      }).delay(delay).start();\n      ripplePath.animateStyle(true).when(effectCfg.period, {\n        opacity: 0\n      }).delay(delay).start();\n      rippleGroup.add(ripplePath);\n    }\n    updateRipplePath(rippleGroup, effectCfg);\n  };\n  /**\n   * Update effect symbol\n   */\n  EffectSymbol.prototype.updateEffectAnimation = function (effectCfg) {\n    var oldEffectCfg = this._effectCfg;\n    var rippleGroup = this.childAt(1);\n    // Must reinitialize effect if following configuration changed\n    var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale', 'rippleNumber'];\n    for (var i = 0; i < DIFFICULT_PROPS.length; i++) {\n      var propName = DIFFICULT_PROPS[i];\n      if (oldEffectCfg[propName] !== effectCfg[propName]) {\n        this.stopEffectAnimation();\n        this.startEffectAnimation(effectCfg);\n        return;\n      }\n    }\n    updateRipplePath(rippleGroup, effectCfg);\n  };\n  /**\n   * Highlight symbol\n   */\n  EffectSymbol.prototype.highlight = function () {\n    enterEmphasis(this);\n  };\n  /**\n   * Downplay symbol\n   */\n  EffectSymbol.prototype.downplay = function () {\n    leaveEmphasis(this);\n  };\n  EffectSymbol.prototype.getSymbolType = function () {\n    var symbol = this.childAt(0);\n    return symbol && symbol.getSymbolType();\n  };\n  /**\n   * Update symbol properties\n   */\n  EffectSymbol.prototype.updateData = function (data, idx) {\n    var _this = this;\n    var seriesModel = data.hostModel;\n    this.childAt(0).updateData(data, idx);\n    var rippleGroup = this.childAt(1);\n    var itemModel = data.getItemModel(idx);\n    var symbolType = data.getItemVisual(idx, 'symbol');\n    var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));\n    var symbolStyle = data.getItemVisual(idx, 'style');\n    var color = symbolStyle && symbolStyle.fill;\n    var emphasisModel = itemModel.getModel('emphasis');\n    rippleGroup.setScale(symbolSize);\n    rippleGroup.traverse(function (ripplePath) {\n      ripplePath.setStyle('fill', color);\n    });\n    var symbolOffset = normalizeSymbolOffset(data.getItemVisual(idx, 'symbolOffset'), symbolSize);\n    if (symbolOffset) {\n      rippleGroup.x = symbolOffset[0];\n      rippleGroup.y = symbolOffset[1];\n    }\n    var symbolRotate = data.getItemVisual(idx, 'symbolRotate');\n    rippleGroup.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n    var effectCfg = {};\n    effectCfg.showEffectOn = seriesModel.get('showEffectOn');\n    effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']);\n    effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']);\n    effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000;\n    effectCfg.effectOffset = idx / data.count();\n    effectCfg.z = seriesModel.getShallow('z') || 0;\n    effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0;\n    effectCfg.symbolType = symbolType;\n    effectCfg.color = color;\n    effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']);\n    effectCfg.rippleNumber = itemModel.get(['rippleEffect', 'number']);\n    if (effectCfg.showEffectOn === 'render') {\n      this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg);\n      this._effectCfg = effectCfg;\n    } else {\n      // Not keep old effect config\n      this._effectCfg = null;\n      this.stopEffectAnimation();\n      this.onHoverStateChange = function (toState) {\n        if (toState === 'emphasis') {\n          if (effectCfg.showEffectOn !== 'render') {\n            _this.startEffectAnimation(effectCfg);\n          }\n        } else if (toState === 'normal') {\n          if (effectCfg.showEffectOn !== 'render') {\n            _this.stopEffectAnimation();\n          }\n        }\n      };\n    }\n    this._effectCfg = effectCfg;\n    toggleHoverEmphasis(this, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  };\n  ;\n  EffectSymbol.prototype.fadeOut = function (cb) {\n    cb && cb();\n  };\n  ;\n  return EffectSymbol;\n}(Group);\nexport default EffectSymbol;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SymbolDraw from '../helper/SymbolDraw.js';\nimport EffectSymbol from '../helper/EffectSymbol.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport pointsLayout from '../../layout/points.js';\nimport ChartView from '../../view/Chart.js';\nvar EffectScatterView = /** @class */function (_super) {\n  __extends(EffectScatterView, _super);\n  function EffectScatterView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = EffectScatterView.type;\n    return _this;\n  }\n  EffectScatterView.prototype.init = function () {\n    this._symbolDraw = new SymbolDraw(EffectSymbol);\n  };\n  EffectScatterView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var effectSymbolDraw = this._symbolDraw;\n    effectSymbolDraw.updateData(data, {\n      clipShape: this._getClipShape(seriesModel)\n    });\n    this.group.add(effectSymbolDraw.group);\n  };\n  EffectScatterView.prototype._getClipShape = function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    var clipArea = coordSys && coordSys.getArea && coordSys.getArea();\n    return seriesModel.get('clip', true) ? clipArea : null;\n  };\n  EffectScatterView.prototype.updateTransform = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    this.group.dirty();\n    var res = pointsLayout('').reset(seriesModel, ecModel, api);\n    if (res.progress) {\n      res.progress({\n        start: 0,\n        end: data.count(),\n        count: data.count()\n      }, data);\n    }\n    this._symbolDraw.updateLayout();\n  };\n  EffectScatterView.prototype._updateGroupTransform = function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && coordSys.getRoamTransform) {\n      this.group.transform = matrix.clone(coordSys.getRoamTransform());\n      this.group.decomposeTransform();\n    }\n  };\n  EffectScatterView.prototype.remove = function (ecModel, api) {\n    this._symbolDraw && this._symbolDraw.remove(true);\n  };\n  EffectScatterView.type = 'effectScatter';\n  return EffectScatterView;\n}(ChartView);\nexport default EffectScatterView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport createSeriesData from '../helper/createSeriesData.js';\nimport SeriesModel from '../../model/Series.js';\nvar EffectScatterSeriesModel = /** @class */function (_super) {\n  __extends(EffectScatterSeriesModel, _super);\n  function EffectScatterSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = EffectScatterSeriesModel.type;\n    _this.hasSymbolVisual = true;\n    return _this;\n  }\n  EffectScatterSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesData(null, this, {\n      useEncodeDefaulter: true\n    });\n  };\n  EffectScatterSeriesModel.prototype.brushSelector = function (dataIndex, data, selectors) {\n    return selectors.point(data.getItemLayout(dataIndex));\n  };\n  EffectScatterSeriesModel.type = 'series.effectScatter';\n  EffectScatterSeriesModel.dependencies = ['grid', 'polar'];\n  EffectScatterSeriesModel.defaultOption = {\n    coordinateSystem: 'cartesian2d',\n    // zlevel: 0,\n    z: 2,\n    legendHoverLink: true,\n    effectType: 'ripple',\n    progressive: 0,\n    // When to show the effect, option: 'render'|'emphasis'\n    showEffectOn: 'render',\n    clip: true,\n    // Ripple effect config\n    rippleEffect: {\n      period: 4,\n      // Scale of ripple\n      scale: 2.5,\n      // Brush type can be fill or stroke\n      brushType: 'fill',\n      // Ripple number\n      number: 3\n    },\n    universalTransition: {\n      divideShape: 'clone'\n    },\n    // Cartesian coordinate system\n    // xAxisIndex: 0,\n    // yAxisIndex: 0,\n    // Polar coordinate system\n    // polarIndex: 0,\n    // Geo coordinate system\n    // geoIndex: 0,\n    // symbol: null,        // \u56FE\u5F62\u7C7B\u578B\n    symbolSize: 10 // \u56FE\u5F62\u5927\u5C0F\uFF0C\u534A\u5BBD\uFF08\u534A\u5F84\uFF09\u53C2\u6570\uFF0C\u5F53\u56FE\u5F62\u4E3A\u65B9\u5411\u6216\u83F1\u5F62\u5219\u603B\u5BBD\u5EA6\u4E3AsymbolSize * 2\n    // symbolRotate: null,  // \u56FE\u5F62\u65CB\u8F6C\u63A7\u5236\n    // itemStyle: {\n    //     opacity: 1\n    // }\n  };\n  return EffectScatterSeriesModel;\n}(SeriesModel);\nexport default EffectScatterSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport EffectScatterView from './EffectScatterView.js';\nimport EffectScatterSeriesModel from './EffectScatterSeries.js';\nimport layoutPoints from '../../layout/points.js';\nexport function install(registers) {\n  registers.registerChartView(EffectScatterView);\n  registers.registerSeriesModel(EffectScatterSeriesModel);\n  registers.registerLayout(layoutPoints('effectScatter'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * Provide effect for line\n */\nimport * as graphic from '../../util/graphic.js';\nimport Line from './Line.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport * as vec2 from 'zrender/lib/core/vector.js';\nimport * as curveUtil from 'zrender/lib/core/curve.js';\nvar EffectLine = /** @class */function (_super) {\n  __extends(EffectLine, _super);\n  function EffectLine(lineData, idx, seriesScope) {\n    var _this = _super.call(this) || this;\n    _this.add(_this.createLine(lineData, idx, seriesScope));\n    _this._updateEffectSymbol(lineData, idx);\n    return _this;\n  }\n  EffectLine.prototype.createLine = function (lineData, idx, seriesScope) {\n    return new Line(lineData, idx, seriesScope);\n  };\n  EffectLine.prototype._updateEffectSymbol = function (lineData, idx) {\n    var itemModel = lineData.getItemModel(idx);\n    var effectModel = itemModel.getModel('effect');\n    var size = effectModel.get('symbolSize');\n    var symbolType = effectModel.get('symbol');\n    if (!zrUtil.isArray(size)) {\n      size = [size, size];\n    }\n    var lineStyle = lineData.getItemVisual(idx, 'style');\n    var color = effectModel.get('color') || lineStyle && lineStyle.stroke;\n    var symbol = this.childAt(1);\n    if (this._symbolType !== symbolType) {\n      // Remove previous\n      this.remove(symbol);\n      symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color);\n      symbol.z2 = 100;\n      symbol.culling = true;\n      this.add(symbol);\n    }\n    // Symbol may be removed if loop is false\n    if (!symbol) {\n      return;\n    }\n    // Shadow color is same with color in default\n    symbol.setStyle('shadowColor', color);\n    symbol.setStyle(effectModel.getItemStyle(['color']));\n    symbol.scaleX = size[0];\n    symbol.scaleY = size[1];\n    symbol.setColor(color);\n    this._symbolType = symbolType;\n    this._symbolScale = size;\n    this._updateEffectAnimation(lineData, effectModel, idx);\n  };\n  EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) {\n    var symbol = this.childAt(1);\n    if (!symbol) {\n      return;\n    }\n    var points = lineData.getItemLayout(idx);\n    var period = effectModel.get('period') * 1000;\n    var loop = effectModel.get('loop');\n    var roundTrip = effectModel.get('roundTrip');\n    var constantSpeed = effectModel.get('constantSpeed');\n    var delayExpr = zrUtil.retrieve(effectModel.get('delay'), function (idx) {\n      return idx / lineData.count() * period / 3;\n    });\n    // Ignore when updating\n    symbol.ignore = true;\n    this._updateAnimationPoints(symbol, points);\n    if (constantSpeed > 0) {\n      period = this._getLineLength(symbol) / constantSpeed * 1000;\n    }\n    if (period !== this._period || loop !== this._loop || roundTrip !== this._roundTrip) {\n      symbol.stopAnimation();\n      var delayNum = void 0;\n      if (zrUtil.isFunction(delayExpr)) {\n        delayNum = delayExpr(idx);\n      } else {\n        delayNum = delayExpr;\n      }\n      if (symbol.__t > 0) {\n        delayNum = -period * symbol.__t;\n      }\n      this._animateSymbol(symbol, period, delayNum, loop, roundTrip);\n    }\n    this._period = period;\n    this._loop = loop;\n    this._roundTrip = roundTrip;\n  };\n  EffectLine.prototype._animateSymbol = function (symbol, period, delayNum, loop, roundTrip) {\n    if (period > 0) {\n      symbol.__t = 0;\n      var self_1 = this;\n      var animator = symbol.animate('', loop).when(roundTrip ? period * 2 : period, {\n        __t: roundTrip ? 2 : 1\n      }).delay(delayNum).during(function () {\n        self_1._updateSymbolPosition(symbol);\n      });\n      if (!loop) {\n        animator.done(function () {\n          self_1.remove(symbol);\n        });\n      }\n      animator.start();\n    }\n  };\n  EffectLine.prototype._getLineLength = function (symbol) {\n    // Not so accurate\n    return vec2.dist(symbol.__p1, symbol.__cp1) + vec2.dist(symbol.__cp1, symbol.__p2);\n  };\n  EffectLine.prototype._updateAnimationPoints = function (symbol, points) {\n    symbol.__p1 = points[0];\n    symbol.__p2 = points[1];\n    symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2];\n  };\n  EffectLine.prototype.updateData = function (lineData, idx, seriesScope) {\n    this.childAt(0).updateData(lineData, idx, seriesScope);\n    this._updateEffectSymbol(lineData, idx);\n  };\n  EffectLine.prototype._updateSymbolPosition = function (symbol) {\n    var p1 = symbol.__p1;\n    var p2 = symbol.__p2;\n    var cp1 = symbol.__cp1;\n    var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t;\n    var pos = [symbol.x, symbol.y];\n    var lastPos = pos.slice();\n    var quadraticAt = curveUtil.quadraticAt;\n    var quadraticDerivativeAt = curveUtil.quadraticDerivativeAt;\n    pos[0] = quadraticAt(p1[0], cp1[0], p2[0], t);\n    pos[1] = quadraticAt(p1[1], cp1[1], p2[1], t);\n    // Tangent\n    var tx = symbol.__t < 1 ? quadraticDerivativeAt(p1[0], cp1[0], p2[0], t) : quadraticDerivativeAt(p2[0], cp1[0], p1[0], 1 - t);\n    var ty = symbol.__t < 1 ? quadraticDerivativeAt(p1[1], cp1[1], p2[1], t) : quadraticDerivativeAt(p2[1], cp1[1], p1[1], 1 - t);\n    symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n    // enable continuity trail for 'line', 'rect', 'roundRect' symbolType\n    if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') {\n      if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) {\n        symbol.scaleY = vec2.dist(lastPos, pos) * 1.05;\n        // make sure the last segment render within endPoint\n        if (t === 1) {\n          pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2;\n          pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2;\n        }\n      } else if (symbol.__lastT === 1) {\n        // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly.\n        symbol.scaleY = 2 * vec2.dist(p1, pos);\n      } else {\n        symbol.scaleY = this._symbolScale[1];\n      }\n    }\n    symbol.__lastT = symbol.__t;\n    symbol.ignore = false;\n    symbol.x = pos[0];\n    symbol.y = pos[1];\n  };\n  EffectLine.prototype.updateLayout = function (lineData, idx) {\n    this.childAt(0).updateLayout(lineData, idx);\n    var effectModel = lineData.getItemModel(idx).getModel('effect');\n    this._updateEffectAnimation(lineData, effectModel, idx);\n  };\n  return EffectLine;\n}(graphic.Group);\nexport default EffectLine;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis } from '../../util/states.js';\nvar Polyline = /** @class */function (_super) {\n  __extends(Polyline, _super);\n  function Polyline(lineData, idx, seriesScope) {\n    var _this = _super.call(this) || this;\n    _this._createPolyline(lineData, idx, seriesScope);\n    return _this;\n  }\n  Polyline.prototype._createPolyline = function (lineData, idx, seriesScope) {\n    // let seriesModel = lineData.hostModel;\n    var points = lineData.getItemLayout(idx);\n    var line = new graphic.Polyline({\n      shape: {\n        points: points\n      }\n    });\n    this.add(line);\n    this._updateCommonStl(lineData, idx, seriesScope);\n  };\n  ;\n  Polyline.prototype.updateData = function (lineData, idx, seriesScope) {\n    var seriesModel = lineData.hostModel;\n    var line = this.childAt(0);\n    var target = {\n      shape: {\n        points: lineData.getItemLayout(idx)\n      }\n    };\n    graphic.updateProps(line, target, seriesModel, idx);\n    this._updateCommonStl(lineData, idx, seriesScope);\n  };\n  ;\n  Polyline.prototype._updateCommonStl = function (lineData, idx, seriesScope) {\n    var line = this.childAt(0);\n    var itemModel = lineData.getItemModel(idx);\n    var emphasisLineStyle = seriesScope && seriesScope.emphasisLineStyle;\n    var focus = seriesScope && seriesScope.focus;\n    var blurScope = seriesScope && seriesScope.blurScope;\n    var emphasisDisabled = seriesScope && seriesScope.emphasisDisabled;\n    if (!seriesScope || lineData.hasItemOption) {\n      var emphasisModel = itemModel.getModel('emphasis');\n      emphasisLineStyle = emphasisModel.getModel('lineStyle').getLineStyle();\n      emphasisDisabled = emphasisModel.get('disabled');\n      focus = emphasisModel.get('focus');\n      blurScope = emphasisModel.get('blurScope');\n    }\n    line.useStyle(lineData.getItemVisual(idx, 'style'));\n    line.style.fill = null;\n    line.style.strokeNoScale = true;\n    var lineEmphasisState = line.ensureState('emphasis');\n    lineEmphasisState.style = emphasisLineStyle;\n    toggleHoverEmphasis(this, focus, blurScope, emphasisDisabled);\n  };\n  ;\n  Polyline.prototype.updateLayout = function (lineData, idx) {\n    var polyline = this.childAt(0);\n    polyline.setShape('points', lineData.getItemLayout(idx));\n  };\n  ;\n  return Polyline;\n}(graphic.Group);\nexport default Polyline;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Polyline from './Polyline.js';\nimport EffectLine from './EffectLine.js';\nimport * as vec2 from 'zrender/lib/core/vector.js';\nvar EffectPolyline = /** @class */function (_super) {\n  __extends(EffectPolyline, _super);\n  function EffectPolyline() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this._lastFrame = 0;\n    _this._lastFramePercent = 0;\n    return _this;\n  }\n  // Override\n  EffectPolyline.prototype.createLine = function (lineData, idx, seriesScope) {\n    return new Polyline(lineData, idx, seriesScope);\n  };\n  ;\n  // Override\n  EffectPolyline.prototype._updateAnimationPoints = function (symbol, points) {\n    this._points = points;\n    var accLenArr = [0];\n    var len = 0;\n    for (var i = 1; i < points.length; i++) {\n      var p1 = points[i - 1];\n      var p2 = points[i];\n      len += vec2.dist(p1, p2);\n      accLenArr.push(len);\n    }\n    if (len === 0) {\n      this._length = 0;\n      return;\n    }\n    for (var i = 0; i < accLenArr.length; i++) {\n      accLenArr[i] /= len;\n    }\n    this._offsets = accLenArr;\n    this._length = len;\n  };\n  ;\n  // Override\n  EffectPolyline.prototype._getLineLength = function () {\n    return this._length;\n  };\n  ;\n  // Override\n  EffectPolyline.prototype._updateSymbolPosition = function (symbol) {\n    var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t;\n    var points = this._points;\n    var offsets = this._offsets;\n    var len = points.length;\n    if (!offsets) {\n      // Has length 0\n      return;\n    }\n    var lastFrame = this._lastFrame;\n    var frame;\n    if (t < this._lastFramePercent) {\n      // Start from the next frame\n      // PENDING start from lastFrame ?\n      var start = Math.min(lastFrame + 1, len - 1);\n      for (frame = start; frame >= 0; frame--) {\n        if (offsets[frame] <= t) {\n          break;\n        }\n      }\n      // PENDING really need to do this ?\n      frame = Math.min(frame, len - 2);\n    } else {\n      for (frame = lastFrame; frame < len; frame++) {\n        if (offsets[frame] > t) {\n          break;\n        }\n      }\n      frame = Math.min(frame - 1, len - 2);\n    }\n    var p = (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]);\n    var p0 = points[frame];\n    var p1 = points[frame + 1];\n    symbol.x = p0[0] * (1 - p) + p * p1[0];\n    symbol.y = p0[1] * (1 - p) + p * p1[1];\n    var tx = symbol.__t < 1 ? p1[0] - p0[0] : p0[0] - p1[0];\n    var ty = symbol.__t < 1 ? p1[1] - p0[1] : p0[1] - p1[1];\n    symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;\n    this._lastFrame = frame;\n    this._lastFramePercent = t;\n    symbol.ignore = false;\n  };\n  ;\n  return EffectPolyline;\n}(EffectLine);\nexport default EffectPolyline;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n// TODO Batch by color\nimport * as graphic from '../../util/graphic.js';\nimport * as lineContain from 'zrender/lib/contain/line.js';\nimport * as quadraticContain from 'zrender/lib/contain/quadratic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport tokens from '../../visual/tokens.js';\nvar LargeLinesPathShape = /** @class */function () {\n  function LargeLinesPathShape() {\n    this.polyline = false;\n    this.curveness = 0;\n    this.segs = [];\n  }\n  return LargeLinesPathShape;\n}();\nvar LargeLinesPath = /** @class */function (_super) {\n  __extends(LargeLinesPath, _super);\n  function LargeLinesPath(opts) {\n    var _this = _super.call(this, opts) || this;\n    _this._off = 0;\n    _this.hoverDataIdx = -1;\n    return _this;\n  }\n  LargeLinesPath.prototype.reset = function () {\n    this.notClear = false;\n    this._off = 0;\n  };\n  LargeLinesPath.prototype.getDefaultStyle = function () {\n    return {\n      stroke: tokens.color.neutral99,\n      fill: null\n    };\n  };\n  LargeLinesPath.prototype.getDefaultShape = function () {\n    return new LargeLinesPathShape();\n  };\n  LargeLinesPath.prototype.buildPath = function (ctx, shape) {\n    var segs = shape.segs;\n    var curveness = shape.curveness;\n    var i;\n    if (shape.polyline) {\n      for (i = this._off; i < segs.length;) {\n        var count = segs[i++];\n        if (count > 0) {\n          ctx.moveTo(segs[i++], segs[i++]);\n          for (var k = 1; k < count; k++) {\n            ctx.lineTo(segs[i++], segs[i++]);\n          }\n        }\n      }\n    } else {\n      for (i = this._off; i < segs.length;) {\n        var x0 = segs[i++];\n        var y0 = segs[i++];\n        var x1 = segs[i++];\n        var y1 = segs[i++];\n        ctx.moveTo(x0, y0);\n        if (curveness > 0) {\n          var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;\n          var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;\n          ctx.quadraticCurveTo(x2, y2, x1, y1);\n        } else {\n          ctx.lineTo(x1, y1);\n        }\n      }\n    }\n    if (this.incremental) {\n      this._off = i;\n      this.notClear = true;\n    }\n  };\n  LargeLinesPath.prototype.findDataIndex = function (x, y) {\n    var shape = this.shape;\n    var segs = shape.segs;\n    var curveness = shape.curveness;\n    var lineWidth = this.style.lineWidth;\n    if (shape.polyline) {\n      var dataIndex = 0;\n      for (var i = 0; i < segs.length;) {\n        var count = segs[i++];\n        if (count > 0) {\n          var x0 = segs[i++];\n          var y0 = segs[i++];\n          for (var k = 1; k < count; k++) {\n            var x1 = segs[i++];\n            var y1 = segs[i++];\n            if (lineContain.containStroke(x0, y0, x1, y1, lineWidth, x, y)) {\n              return dataIndex;\n            }\n          }\n        }\n        dataIndex++;\n      }\n    } else {\n      var dataIndex = 0;\n      for (var i = 0; i < segs.length;) {\n        var x0 = segs[i++];\n        var y0 = segs[i++];\n        var x1 = segs[i++];\n        var y1 = segs[i++];\n        if (curveness > 0) {\n          var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;\n          var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;\n          if (quadraticContain.containStroke(x0, y0, x2, y2, x1, y1, lineWidth, x, y)) {\n            return dataIndex;\n          }\n        } else {\n          if (lineContain.containStroke(x0, y0, x1, y1, lineWidth, x, y)) {\n            return dataIndex;\n          }\n        }\n        dataIndex++;\n      }\n    }\n    return -1;\n  };\n  LargeLinesPath.prototype.contain = function (x, y) {\n    var localPos = this.transformCoordToLocal(x, y);\n    var rect = this.getBoundingRect();\n    x = localPos[0];\n    y = localPos[1];\n    if (rect.contain(x, y)) {\n      // Cache found data index.\n      var dataIdx = this.hoverDataIdx = this.findDataIndex(x, y);\n      return dataIdx >= 0;\n    }\n    this.hoverDataIdx = -1;\n    return false;\n  };\n  LargeLinesPath.prototype.getBoundingRect = function () {\n    // Ignore stroke for large symbol draw.\n    var rect = this._rect;\n    if (!rect) {\n      var shape = this.shape;\n      var points = shape.segs;\n      var minX = Infinity;\n      var minY = Infinity;\n      var maxX = -Infinity;\n      var maxY = -Infinity;\n      for (var i = 0; i < points.length;) {\n        var x = points[i++];\n        var y = points[i++];\n        minX = Math.min(x, minX);\n        maxX = Math.max(x, maxX);\n        minY = Math.min(y, minY);\n        maxY = Math.max(y, maxY);\n      }\n      rect = this._rect = new graphic.BoundingRect(minX, minY, maxX, maxY);\n    }\n    return rect;\n  };\n  return LargeLinesPath;\n}(graphic.Path);\nvar LargeLineDraw = /** @class */function () {\n  function LargeLineDraw() {\n    this.group = new graphic.Group();\n  }\n  /**\n   * Update symbols draw by new data\n   */\n  LargeLineDraw.prototype.updateData = function (data) {\n    this._clear();\n    var lineEl = this._create();\n    lineEl.setShape({\n      segs: data.getLayout('linesPoints')\n    });\n    this._setCommon(lineEl, data);\n  };\n  ;\n  /**\n   * @override\n   */\n  LargeLineDraw.prototype.incrementalPrepareUpdate = function (data) {\n    this.group.removeAll();\n    this._clear();\n  };\n  ;\n  /**\n   * @override\n   */\n  LargeLineDraw.prototype.incrementalUpdate = function (taskParams, data) {\n    var lastAdded = this._newAdded[0];\n    var linePoints = data.getLayout('linesPoints');\n    var oldSegs = lastAdded && lastAdded.shape.segs;\n    // Merging the exists. Each element has 1e4 points.\n    // Consider the performance balance between too much elements and too much points in one shape(may affect hover optimization)\n    if (oldSegs && oldSegs.length < 2e4) {\n      var oldLen = oldSegs.length;\n      var newSegs = new Float32Array(oldLen + linePoints.length);\n      // Concat two array\n      newSegs.set(oldSegs);\n      newSegs.set(linePoints, oldLen);\n      lastAdded.setShape({\n        segs: newSegs\n      });\n    } else {\n      // Clear\n      this._newAdded = [];\n      var lineEl = this._create();\n      lineEl.incremental = true;\n      lineEl.setShape({\n        segs: linePoints\n      });\n      this._setCommon(lineEl, data);\n      lineEl.__startIndex = taskParams.start;\n    }\n  };\n  /**\n   * @override\n   */\n  LargeLineDraw.prototype.remove = function () {\n    this._clear();\n  };\n  LargeLineDraw.prototype.eachRendered = function (cb) {\n    this._newAdded[0] && cb(this._newAdded[0]);\n  };\n  LargeLineDraw.prototype._create = function () {\n    var lineEl = new LargeLinesPath({\n      cursor: 'default',\n      ignoreCoarsePointer: true\n    });\n    this._newAdded.push(lineEl);\n    this.group.add(lineEl);\n    return lineEl;\n  };\n  LargeLineDraw.prototype._setCommon = function (lineEl, data, isIncremental) {\n    var hostModel = data.hostModel;\n    lineEl.setShape({\n      polyline: hostModel.get('polyline'),\n      curveness: hostModel.get(['lineStyle', 'curveness'])\n    });\n    lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle());\n    lineEl.style.strokeNoScale = true;\n    var style = data.getVisual('style');\n    if (style && style.stroke) {\n      lineEl.setStyle('stroke', style.stroke);\n    }\n    lineEl.setStyle('fill', null);\n    var ecData = getECData(lineEl);\n    // Enable tooltip\n    // PENDING May have performance issue when path is extremely large\n    ecData.seriesIndex = hostModel.seriesIndex;\n    lineEl.on('mousemove', function (e) {\n      ecData.dataIndex = null;\n      var dataIndex = lineEl.hoverDataIdx;\n      if (dataIndex > 0) {\n        // Provide dataIndex for tooltip\n        ecData.dataIndex = dataIndex + lineEl.__startIndex;\n      }\n    });\n  };\n  ;\n  LargeLineDraw.prototype._clear = function () {\n    this._newAdded = [];\n    this.group.removeAll();\n  };\n  ;\n  return LargeLineDraw;\n}();\nexport default LargeLineDraw;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/* global Float32Array */\nimport createRenderPlanner from '../helper/createRenderPlanner.js';\nimport { error } from '../../util/log.js';\nvar linesLayout = {\n  seriesType: 'lines',\n  plan: createRenderPlanner(),\n  reset: function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (!coordSys) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('The lines series must have a coordinate system.');\n      }\n      return;\n    }\n    var isPolyline = seriesModel.get('polyline');\n    var isLarge = seriesModel.pipelineContext.large;\n    return {\n      progress: function (params, lineData) {\n        var lineCoords = [];\n        if (isLarge) {\n          var points = void 0;\n          var segCount = params.end - params.start;\n          if (isPolyline) {\n            var totalCoordsCount = 0;\n            for (var i = params.start; i < params.end; i++) {\n              totalCoordsCount += seriesModel.getLineCoordsCount(i);\n            }\n            points = new Float32Array(segCount + totalCoordsCount * 2);\n          } else {\n            points = new Float32Array(segCount * 4);\n          }\n          var offset = 0;\n          var pt = [];\n          for (var i = params.start; i < params.end; i++) {\n            var len = seriesModel.getLineCoords(i, lineCoords);\n            if (isPolyline) {\n              points[offset++] = len;\n            }\n            for (var k = 0; k < len; k++) {\n              pt = coordSys.dataToPoint(lineCoords[k], false, pt);\n              points[offset++] = pt[0];\n              points[offset++] = pt[1];\n            }\n          }\n          lineData.setLayout('linesPoints', points);\n        } else {\n          for (var i = params.start; i < params.end; i++) {\n            var itemModel = lineData.getItemModel(i);\n            var len = seriesModel.getLineCoords(i, lineCoords);\n            var pts = [];\n            if (isPolyline) {\n              for (var j = 0; j < len; j++) {\n                pts.push(coordSys.dataToPoint(lineCoords[j]));\n              }\n            } else {\n              pts[0] = coordSys.dataToPoint(lineCoords[0]);\n              pts[1] = coordSys.dataToPoint(lineCoords[1]);\n              var curveness = itemModel.get(['lineStyle', 'curveness']);\n              if (+curveness) {\n                pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness];\n              }\n            }\n            lineData.setItemLayout(i, pts);\n          }\n        }\n      }\n    };\n  }\n};\nexport default linesLayout;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport LineDraw from '../helper/LineDraw.js';\nimport EffectLine from '../helper/EffectLine.js';\nimport Line from '../helper/Line.js';\nimport Polyline from '../helper/Polyline.js';\nimport EffectPolyline from '../helper/EffectPolyline.js';\nimport LargeLineDraw from '../helper/LargeLineDraw.js';\nimport linesLayout from './linesLayout.js';\nimport { createClipPath } from '../helper/createClipPathFromCoordSys.js';\nimport ChartView from '../../view/Chart.js';\nvar LinesView = /** @class */function (_super) {\n  __extends(LinesView, _super);\n  function LinesView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = LinesView.type;\n    return _this;\n  }\n  LinesView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var lineDraw = this._updateLineDraw(data, seriesModel);\n    var zlevel = seriesModel.get('zlevel');\n    var trailLength = seriesModel.get(['effect', 'trailLength']);\n    var zr = api.getZr();\n    // Avoid the drag cause ghost shadow\n    // FIXME Better way ?\n    // SVG doesn't support\n    var isSvg = zr.painter.getType() === 'svg';\n    if (!isSvg) {\n      zr.painter.getLayer(zlevel).clear(true);\n    }\n    // Config layer with motion blur\n    if (this._lastZlevel != null && !isSvg) {\n      zr.configLayer(this._lastZlevel, {\n        motionBlur: false\n      });\n    }\n    if (this._showEffect(seriesModel) && trailLength > 0) {\n      if (!isSvg) {\n        zr.configLayer(zlevel, {\n          motionBlur: true,\n          lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)\n        });\n      } else if (process.env.NODE_ENV !== 'production') {\n        console.warn('SVG render mode doesn\\'t support lines with trail effect');\n      }\n    }\n    lineDraw.updateData(data);\n    var clipPath = seriesModel.get('clip', true) && createClipPath(seriesModel.coordinateSystem, false, seriesModel);\n    if (clipPath) {\n      this.group.setClipPath(clipPath);\n    } else {\n      this.group.removeClipPath();\n    }\n    this._lastZlevel = zlevel;\n    this._finished = true;\n  };\n  LinesView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var lineDraw = this._updateLineDraw(data, seriesModel);\n    lineDraw.incrementalPrepareUpdate(data);\n    this._clearLayer(api);\n    this._finished = false;\n  };\n  LinesView.prototype.incrementalRender = function (taskParams, seriesModel, ecModel) {\n    this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData());\n    this._finished = taskParams.end === seriesModel.getData().count();\n  };\n  LinesView.prototype.eachRendered = function (cb) {\n    this._lineDraw && this._lineDraw.eachRendered(cb);\n  };\n  LinesView.prototype.updateTransform = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var pipelineContext = seriesModel.pipelineContext;\n    if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) {\n      // TODO Don't have to do update in large mode. Only do it when there are millions of data.\n      return {\n        update: true\n      };\n    } else {\n      // TODO Use same logic with ScatterView.\n      // Manually update layout\n      var res = linesLayout.reset(seriesModel, ecModel, api);\n      if (res.progress) {\n        res.progress({\n          start: 0,\n          end: data.count(),\n          count: data.count()\n        }, data);\n      }\n      // Not in large mode\n      this._lineDraw.updateLayout();\n      this._clearLayer(api);\n    }\n  };\n  LinesView.prototype._updateLineDraw = function (data, seriesModel) {\n    var lineDraw = this._lineDraw;\n    var hasEffect = this._showEffect(seriesModel);\n    var isPolyline = !!seriesModel.get('polyline');\n    var pipelineContext = seriesModel.pipelineContext;\n    var isLargeDraw = pipelineContext.large;\n    if (process.env.NODE_ENV !== 'production') {\n      if (hasEffect && isLargeDraw) {\n        console.warn('Large lines not support effect');\n      }\n    }\n    if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) {\n      if (lineDraw) {\n        lineDraw.remove();\n      }\n      lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline : hasEffect ? EffectLine : Line);\n      this._hasEffet = hasEffect;\n      this._isPolyline = isPolyline;\n      this._isLargeDraw = isLargeDraw;\n    }\n    this.group.add(lineDraw.group);\n    return lineDraw;\n  };\n  LinesView.prototype._showEffect = function (seriesModel) {\n    return !!seriesModel.get(['effect', 'show']);\n  };\n  LinesView.prototype._clearLayer = function (api) {\n    // Not use motion when dragging or zooming\n    var zr = api.getZr();\n    var isSvg = zr.painter.getType() === 'svg';\n    if (!isSvg && this._lastZlevel != null) {\n      zr.painter.getLayer(this._lastZlevel).clear(true);\n    }\n  };\n  LinesView.prototype.remove = function (ecModel, api) {\n    this._lineDraw && this._lineDraw.remove();\n    this._lineDraw = null;\n    // Clear motion when lineDraw is removed\n    this._clearLayer(api);\n  };\n  LinesView.prototype.dispose = function (ecModel, api) {\n    this.remove(ecModel, api);\n  };\n  LinesView.type = 'lines';\n  return LinesView;\n}(ChartView);\nexport default LinesView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/* global Uint32Array, Float64Array, Float32Array */\nimport SeriesModel from '../../model/Series.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport { concatArray, mergeAll, map, isNumber } from 'zrender/lib/core/util.js';\nimport CoordinateSystem from '../../core/CoordinateSystem.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nvar Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array;\nvar Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array;\nfunction compatEc2(seriesOpt) {\n  var data = seriesOpt.data;\n  if (data && data[0] && data[0][0] && data[0][0].coord) {\n    if (process.env.NODE_ENV !== 'production') {\n      console.warn('Lines data configuration has been changed to' + ' { coords:[[1,2],[2,3]] }');\n    }\n    seriesOpt.data = map(data, function (itemOpt) {\n      var coords = [itemOpt[0].coord, itemOpt[1].coord];\n      var target = {\n        coords: coords\n      };\n      if (itemOpt[0].name) {\n        target.fromName = itemOpt[0].name;\n      }\n      if (itemOpt[1].name) {\n        target.toName = itemOpt[1].name;\n      }\n      return mergeAll([target, itemOpt[0], itemOpt[1]]);\n    });\n  }\n}\nvar LinesSeriesModel = /** @class */function (_super) {\n  __extends(LinesSeriesModel, _super);\n  function LinesSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = LinesSeriesModel.type;\n    _this.visualStyleAccessPath = 'lineStyle';\n    _this.visualDrawType = 'stroke';\n    return _this;\n  }\n  LinesSeriesModel.prototype.init = function (option) {\n    // The input data may be null/undefined.\n    option.data = option.data || [];\n    // Not using preprocessor because mergeOption may not have series.type\n    compatEc2(option);\n    var result = this._processFlatCoordsArray(option.data);\n    this._flatCoords = result.flatCoords;\n    this._flatCoordsOffset = result.flatCoordsOffset;\n    if (result.flatCoords) {\n      option.data = new Float32Array(result.count);\n    }\n    _super.prototype.init.apply(this, arguments);\n  };\n  LinesSeriesModel.prototype.mergeOption = function (option) {\n    compatEc2(option);\n    if (option.data) {\n      // Only update when have option data to merge.\n      var result = this._processFlatCoordsArray(option.data);\n      this._flatCoords = result.flatCoords;\n      this._flatCoordsOffset = result.flatCoordsOffset;\n      if (result.flatCoords) {\n        option.data = new Float32Array(result.count);\n      }\n    }\n    _super.prototype.mergeOption.apply(this, arguments);\n  };\n  LinesSeriesModel.prototype.appendData = function (params) {\n    var result = this._processFlatCoordsArray(params.data);\n    if (result.flatCoords) {\n      if (!this._flatCoords) {\n        this._flatCoords = result.flatCoords;\n        this._flatCoordsOffset = result.flatCoordsOffset;\n      } else {\n        this._flatCoords = concatArray(this._flatCoords, result.flatCoords);\n        this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset);\n      }\n      params.data = new Float32Array(result.count);\n    }\n    this.getRawData().appendData(params.data);\n  };\n  LinesSeriesModel.prototype._getCoordsFromItemModel = function (idx) {\n    var itemModel = this.getData().getItemModel(idx);\n    var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords');\n    if (process.env.NODE_ENV !== 'production') {\n      if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) {\n        throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.');\n      }\n    }\n    return coords;\n  };\n  LinesSeriesModel.prototype.getLineCoordsCount = function (idx) {\n    if (this._flatCoordsOffset) {\n      return this._flatCoordsOffset[idx * 2 + 1];\n    } else {\n      return this._getCoordsFromItemModel(idx).length;\n    }\n  };\n  LinesSeriesModel.prototype.getLineCoords = function (idx, out) {\n    if (this._flatCoordsOffset) {\n      var offset = this._flatCoordsOffset[idx * 2];\n      var len = this._flatCoordsOffset[idx * 2 + 1];\n      for (var i = 0; i < len; i++) {\n        out[i] = out[i] || [];\n        out[i][0] = this._flatCoords[offset + i * 2];\n        out[i][1] = this._flatCoords[offset + i * 2 + 1];\n      }\n      return len;\n    } else {\n      var coords = this._getCoordsFromItemModel(idx);\n      for (var i = 0; i < coords.length; i++) {\n        out[i] = out[i] || [];\n        out[i][0] = coords[i][0];\n        out[i][1] = coords[i][1];\n      }\n      return coords.length;\n    }\n  };\n  LinesSeriesModel.prototype._processFlatCoordsArray = function (data) {\n    var startOffset = 0;\n    if (this._flatCoords) {\n      startOffset = this._flatCoords.length;\n    }\n    // Stored as a typed array. In format\n    // Points Count(2) | x | y | x | y | Points Count(3) | x |  y | x | y | x | y |\n    if (isNumber(data[0])) {\n      var len = data.length;\n      // Store offset and len of each segment\n      var coordsOffsetAndLenStorage = new Uint32Arr(len);\n      var coordsStorage = new Float64Arr(len);\n      var coordsCursor = 0;\n      var offsetCursor = 0;\n      var dataCount = 0;\n      for (var i = 0; i < len;) {\n        dataCount++;\n        var count = data[i++];\n        // Offset\n        coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset;\n        // Len\n        coordsOffsetAndLenStorage[offsetCursor++] = count;\n        for (var k = 0; k < count; k++) {\n          var x = data[i++];\n          var y = data[i++];\n          coordsStorage[coordsCursor++] = x;\n          coordsStorage[coordsCursor++] = y;\n          if (i > len) {\n            if (process.env.NODE_ENV !== 'production') {\n              throw new Error('Invalid data format.');\n            }\n          }\n        }\n      }\n      return {\n        flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor),\n        flatCoords: coordsStorage,\n        count: dataCount\n      };\n    }\n    return {\n      flatCoordsOffset: null,\n      flatCoords: null,\n      count: data.length\n    };\n  };\n  LinesSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    if (process.env.NODE_ENV !== 'production') {\n      var CoordSys = CoordinateSystem.get(option.coordinateSystem);\n      if (!CoordSys) {\n        throw new Error('Unknown coordinate system ' + option.coordinateSystem);\n      }\n    }\n    var lineData = new SeriesData(['value'], this);\n    lineData.hasItemOption = false;\n    lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {\n      // dataItem is simply coords\n      if (dataItem instanceof Array) {\n        return NaN;\n      } else {\n        lineData.hasItemOption = true;\n        var value = dataItem.value;\n        if (value != null) {\n          return value instanceof Array ? value[dimIndex] : value;\n        }\n      }\n    });\n    return lineData;\n  };\n  LinesSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var data = this.getData();\n    var itemModel = data.getItemModel(dataIndex);\n    var name = itemModel.get('name');\n    if (name) {\n      return name;\n    }\n    var fromName = itemModel.get('fromName');\n    var toName = itemModel.get('toName');\n    var nameArr = [];\n    fromName != null && nameArr.push(fromName);\n    toName != null && nameArr.push(toName);\n    return createTooltipMarkup('nameValue', {\n      name: nameArr.join(' > ')\n    });\n  };\n  LinesSeriesModel.prototype.preventIncremental = function () {\n    return !!this.get(['effect', 'show']);\n  };\n  LinesSeriesModel.prototype.getProgressive = function () {\n    var progressive = this.option.progressive;\n    if (progressive == null) {\n      return this.option.large ? 1e4 : this.get('progressive');\n    }\n    return progressive;\n  };\n  LinesSeriesModel.prototype.getProgressiveThreshold = function () {\n    var progressiveThreshold = this.option.progressiveThreshold;\n    if (progressiveThreshold == null) {\n      return this.option.large ? 2e4 : this.get('progressiveThreshold');\n    }\n    return progressiveThreshold;\n  };\n  LinesSeriesModel.prototype.getZLevelKey = function () {\n    var effectModel = this.getModel('effect');\n    var trailLength = effectModel.get('trailLength');\n    return this.getData().count() > this.getProgressiveThreshold()\n    // Each progressive series has individual key.\n    ? this.id : effectModel.get('show') && trailLength > 0 ? trailLength + '' : '';\n  };\n  LinesSeriesModel.type = 'series.lines';\n  LinesSeriesModel.dependencies = ['grid', 'polar', 'geo', 'calendar'];\n  LinesSeriesModel.defaultOption = {\n    coordinateSystem: 'geo',\n    // zlevel: 0,\n    z: 2,\n    legendHoverLink: true,\n    // Cartesian coordinate system\n    xAxisIndex: 0,\n    yAxisIndex: 0,\n    symbol: ['none', 'none'],\n    symbolSize: [10, 10],\n    // Geo coordinate system\n    geoIndex: 0,\n    effect: {\n      show: false,\n      period: 4,\n      constantSpeed: 0,\n      symbol: 'circle',\n      symbolSize: 3,\n      loop: true,\n      trailLength: 0.2\n    },\n    large: false,\n    // Available when large is true\n    largeThreshold: 2000,\n    polyline: false,\n    clip: true,\n    label: {\n      show: false,\n      position: 'end'\n      // distance: 5,\n      // formatter: \u6807\u7B7E\u6587\u672C\u683C\u5F0F\u5668\uFF0C\u540CTooltip.formatter\uFF0C\u4E0D\u652F\u6301\u5F02\u6B65\u56DE\u8C03\n    },\n    lineStyle: {\n      opacity: 0.5\n    }\n  };\n  return LinesSeriesModel;\n}(SeriesModel);\nexport default LinesSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nfunction normalize(a) {\n  if (!(a instanceof Array)) {\n    a = [a, a];\n  }\n  return a;\n}\nvar linesVisual = {\n  seriesType: 'lines',\n  reset: function (seriesModel) {\n    var symbolType = normalize(seriesModel.get('symbol'));\n    var symbolSize = normalize(seriesModel.get('symbolSize'));\n    var data = seriesModel.getData();\n    data.setVisual('fromSymbol', symbolType && symbolType[0]);\n    data.setVisual('toSymbol', symbolType && symbolType[1]);\n    data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);\n    data.setVisual('toSymbolSize', symbolSize && symbolSize[1]);\n    function dataEach(data, idx) {\n      var itemModel = data.getItemModel(idx);\n      var symbolType = normalize(itemModel.getShallow('symbol', true));\n      var symbolSize = normalize(itemModel.getShallow('symbolSize', true));\n      symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]);\n      symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]);\n      symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]);\n      symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]);\n    }\n    return {\n      dataEach: data.hasItemOption ? dataEach : null\n    };\n  }\n};\nexport default linesVisual;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport LinesView from './LinesView.js';\nimport LinesSeriesModel from './LinesSeries.js';\nimport linesLayout from './linesLayout.js';\nimport linesVisual from './linesVisual.js';\nexport function install(registers) {\n  registers.registerChartView(LinesView);\n  registers.registerSeriesModel(LinesSeriesModel);\n  registers.registerLayout(linesLayout);\n  registers.registerVisual(linesVisual);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/* global Uint8ClampedArray */\nimport { platformApi } from 'zrender/lib/core/platform.js';\nimport tokens from '../../visual/tokens.js';\nvar GRADIENT_LEVELS = 256;\nvar HeatmapLayer = /** @class */function () {\n  function HeatmapLayer() {\n    this.blurSize = 30;\n    this.pointSize = 20;\n    this.maxOpacity = 1;\n    this.minOpacity = 0;\n    this._gradientPixels = {\n      inRange: null,\n      outOfRange: null\n    };\n    var canvas = platformApi.createCanvas();\n    this.canvas = canvas;\n  }\n  /**\n   * Renders Heatmap and returns the rendered canvas\n   * @param data array of data, each has x, y, value\n   * @param width canvas width\n   * @param height canvas height\n   */\n  HeatmapLayer.prototype.update = function (data, width, height, normalize, colorFunc, isInRange) {\n    var brush = this._getBrush();\n    var gradientInRange = this._getGradient(colorFunc, 'inRange');\n    var gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange');\n    var r = this.pointSize + this.blurSize;\n    var canvas = this.canvas;\n    var ctx = canvas.getContext('2d');\n    var len = data.length;\n    canvas.width = width;\n    canvas.height = height;\n    for (var i = 0; i < len; ++i) {\n      var p = data[i];\n      var x = p[0];\n      var y = p[1];\n      var value = p[2];\n      // calculate alpha using value\n      var alpha = normalize(value);\n      // draw with the circle brush with alpha\n      ctx.globalAlpha = alpha;\n      ctx.drawImage(brush, x - r, y - r);\n    }\n    if (!canvas.width || !canvas.height) {\n      // Avoid \"Uncaught DOMException: Failed to execute 'getImageData' on\n      // 'CanvasRenderingContext2D': The source height is 0.\"\n      return canvas;\n    }\n    // colorize the canvas using alpha value and set with gradient\n    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n    var pixels = imageData.data;\n    var offset = 0;\n    var pixelLen = pixels.length;\n    var minOpacity = this.minOpacity;\n    var maxOpacity = this.maxOpacity;\n    var diffOpacity = maxOpacity - minOpacity;\n    while (offset < pixelLen) {\n      var alpha = pixels[offset + 3] / 256;\n      var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4;\n      // Simple optimize to ignore the empty data\n      if (alpha > 0) {\n        var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange;\n        // Any alpha > 0 will be mapped to [minOpacity, maxOpacity]\n        alpha > 0 && (alpha = alpha * diffOpacity + minOpacity);\n        pixels[offset++] = gradient[gradientOffset];\n        pixels[offset++] = gradient[gradientOffset + 1];\n        pixels[offset++] = gradient[gradientOffset + 2];\n        pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256;\n      } else {\n        offset += 4;\n      }\n    }\n    ctx.putImageData(imageData, 0, 0);\n    return canvas;\n  };\n  /**\n   * get canvas of a black circle brush used for canvas to draw later\n   */\n  HeatmapLayer.prototype._getBrush = function () {\n    var brushCanvas = this._brushCanvas || (this._brushCanvas = platformApi.createCanvas());\n    // set brush size\n    var r = this.pointSize + this.blurSize;\n    var d = r * 2;\n    brushCanvas.width = d;\n    brushCanvas.height = d;\n    var ctx = brushCanvas.getContext('2d');\n    ctx.clearRect(0, 0, d, d);\n    // in order to render shadow without the distinct circle,\n    // draw the distinct circle in an invisible place,\n    // and use shadowOffset to draw shadow in the center of the canvas\n    ctx.shadowOffsetX = d;\n    ctx.shadowBlur = this.blurSize;\n    // draw the shadow in black, and use alpha and shadow blur to generate\n    // color in color map\n    ctx.shadowColor = tokens.color.neutral99;\n    // draw circle in the left to the canvas\n    ctx.beginPath();\n    ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true);\n    ctx.closePath();\n    ctx.fill();\n    return brushCanvas;\n  };\n  /**\n   * get gradient color map\n   * @private\n   */\n  HeatmapLayer.prototype._getGradient = function (colorFunc, state) {\n    var gradientPixels = this._gradientPixels;\n    var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));\n    var color = [0, 0, 0, 0];\n    var off = 0;\n    for (var i = 0; i < 256; i++) {\n      colorFunc[state](i / 255, true, color);\n      pixelsSingleState[off++] = color[0];\n      pixelsSingleState[off++] = color[1];\n      pixelsSingleState[off++] = color[2];\n      pixelsSingleState[off++] = color[3];\n    }\n    return pixelsSingleState;\n  };\n  return HeatmapLayer;\n}();\nexport default HeatmapLayer;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis } from '../../util/states.js';\nimport HeatmapLayer from './HeatmapLayer.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ChartView from '../../view/Chart.js';\nimport { isCoordinateSystemType } from '../../coord/CoordinateSystem.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nfunction getIsInPiecewiseRange(dataExtent, pieceList, selected) {\n  var dataSpan = dataExtent[1] - dataExtent[0];\n  pieceList = zrUtil.map(pieceList, function (piece) {\n    return {\n      interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan]\n    };\n  });\n  var len = pieceList.length;\n  var lastIndex = 0;\n  return function (val) {\n    var i;\n    // Try to find in the location of the last found\n    for (i = lastIndex; i < len; i++) {\n      var interval = pieceList[i].interval;\n      if (interval[0] <= val && val <= interval[1]) {\n        lastIndex = i;\n        break;\n      }\n    }\n    if (i === len) {\n      // Not found, back interation\n      for (i = lastIndex - 1; i >= 0; i--) {\n        var interval = pieceList[i].interval;\n        if (interval[0] <= val && val <= interval[1]) {\n          lastIndex = i;\n          break;\n        }\n      }\n    }\n    return i >= 0 && i < len && selected[i];\n  };\n}\nfunction getIsInContinuousRange(dataExtent, range) {\n  var dataSpan = dataExtent[1] - dataExtent[0];\n  range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan];\n  return function (val) {\n    return val >= range[0] && val <= range[1];\n  };\n}\nfunction isGeoCoordSys(coordSys) {\n  var dimensions = coordSys.dimensions;\n  // Not use coordSys.type === 'geo' because coordSys maybe extended\n  return dimensions[0] === 'lng' && dimensions[1] === 'lat';\n}\nvar HeatmapView = /** @class */function (_super) {\n  __extends(HeatmapView, _super);\n  function HeatmapView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = HeatmapView.type;\n    return _this;\n  }\n  HeatmapView.prototype.render = function (seriesModel, ecModel, api) {\n    var visualMapOfThisSeries;\n    ecModel.eachComponent('visualMap', function (visualMap) {\n      visualMap.eachTargetSeries(function (targetSeries) {\n        if (targetSeries === seriesModel) {\n          visualMapOfThisSeries = visualMap;\n        }\n      });\n    });\n    if (process.env.NODE_ENV !== 'production') {\n      if (!visualMapOfThisSeries) {\n        throw new Error('Heatmap must use with visualMap');\n      }\n    }\n    // Clear previously rendered progressive elements.\n    this._progressiveEls = null;\n    this.group.removeAll();\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar' || coordSys.type === 'matrix') {\n      this._renderOnGridLike(seriesModel, api, 0, seriesModel.getData().count());\n    } else if (isGeoCoordSys(coordSys)) {\n      this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api);\n    }\n  };\n  HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) {\n    this.group.removeAll();\n  };\n  HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys) {\n      // geo does not support incremental rendering?\n      if (isGeoCoordSys(coordSys)) {\n        this.render(seriesModel, ecModel, api);\n      } else {\n        this._progressiveEls = [];\n        this._renderOnGridLike(seriesModel, api, params.start, params.end, true);\n      }\n    }\n  };\n  HeatmapView.prototype.eachRendered = function (cb) {\n    graphic.traverseElements(this._progressiveEls || this.group, cb);\n  };\n  HeatmapView.prototype._renderOnGridLike = function (seriesModel, api, start, end, incremental) {\n    var coordSys = seriesModel.coordinateSystem;\n    var isCartesian2d = isCoordinateSystemType(coordSys, 'cartesian2d');\n    var isMatrix = isCoordinateSystemType(coordSys, 'matrix');\n    var width;\n    var height;\n    var xAxisExtent;\n    var yAxisExtent;\n    if (isCartesian2d) {\n      var xAxis = coordSys.getAxis('x');\n      var yAxis = coordSys.getAxis('y');\n      if (process.env.NODE_ENV !== 'production') {\n        if (!(xAxis.type === 'category' && yAxis.type === 'category')) {\n          throw new Error('Heatmap on cartesian must have two category axes');\n        }\n        if (!(xAxis.onBand && yAxis.onBand)) {\n          throw new Error('Heatmap on cartesian must have two axes with boundaryGap true');\n        }\n      }\n      // add 0.5px to avoid the gaps\n      width = xAxis.getBandWidth() + .5;\n      height = yAxis.getBandWidth() + .5;\n      xAxisExtent = xAxis.scale.getExtent();\n      yAxisExtent = yAxis.scale.getExtent();\n    }\n    var group = this.group;\n    var data = seriesModel.getData();\n    var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle();\n    var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle();\n    var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle();\n    var borderRadius = seriesModel.get(['itemStyle', 'borderRadius']);\n    var labelStatesModels = getLabelStatesModels(seriesModel);\n    var emphasisModel = seriesModel.getModel('emphasis');\n    var focus = emphasisModel.get('focus');\n    var blurScope = emphasisModel.get('blurScope');\n    var emphasisDisabled = emphasisModel.get('disabled');\n    var dataDims = isCartesian2d || isMatrix ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')];\n    for (var idx = start; idx < end; idx++) {\n      var rect = void 0;\n      var style = data.getItemVisual(idx, 'style');\n      if (isCartesian2d) {\n        var dataDimX = data.get(dataDims[0], idx);\n        var dataDimY = data.get(dataDims[1], idx);\n        // Ignore empty data and out of extent data\n        if (isNaN(data.get(dataDims[2], idx)) || isNaN(dataDimX) || isNaN(dataDimY) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) {\n          continue;\n        }\n        var point = coordSys.dataToPoint([dataDimX, dataDimY]);\n        rect = new graphic.Rect({\n          shape: {\n            x: point[0] - width / 2,\n            y: point[1] - height / 2,\n            width: width,\n            height: height\n          },\n          style: style\n        });\n      } else if (isMatrix) {\n        var shape = coordSys.dataToLayout([data.get(dataDims[0], idx), data.get(dataDims[1], idx)]).rect;\n        if (zrUtil.eqNaN(shape.x)) {\n          continue;\n        }\n        rect = new graphic.Rect({\n          z2: 1,\n          shape: shape,\n          style: style\n        });\n      } else {\n        // Calendar\n        // Ignore empty data\n        if (isNaN(data.get(dataDims[1], idx))) {\n          continue;\n        }\n        var layout = coordSys.dataToLayout([data.get(dataDims[0], idx)]);\n        var shape = layout.contentRect || layout.rect;\n        if (zrUtil.eqNaN(shape.x) || zrUtil.eqNaN(shape.y)) {\n          continue;\n        }\n        rect = new graphic.Rect({\n          z2: 1,\n          shape: shape,\n          style: style\n        });\n      }\n      // Optimization for large dataset\n      if (data.hasItemOption) {\n        var itemModel = data.getItemModel(idx);\n        var emphasisModel_1 = itemModel.getModel('emphasis');\n        emphasisStyle = emphasisModel_1.getModel('itemStyle').getItemStyle();\n        blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle();\n        selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle();\n        // Each item value struct in the data would be firstly\n        // {\n        //     itemStyle: { borderRadius: [30, 30] },\n        //     value: [2022, 02, 22]\n        // }\n        borderRadius = itemModel.get(['itemStyle', 'borderRadius']);\n        focus = emphasisModel_1.get('focus');\n        blurScope = emphasisModel_1.get('blurScope');\n        emphasisDisabled = emphasisModel_1.get('disabled');\n        labelStatesModels = getLabelStatesModels(itemModel);\n      }\n      rect.shape.r = borderRadius;\n      var rawValue = seriesModel.getRawValue(idx);\n      var defaultText = '-';\n      if (rawValue && rawValue[2] != null) {\n        defaultText = rawValue[2] + '';\n      }\n      setLabelStyle(rect, labelStatesModels, {\n        labelFetcher: seriesModel,\n        labelDataIndex: idx,\n        defaultOpacity: style.opacity,\n        defaultText: defaultText\n      });\n      rect.ensureState('emphasis').style = emphasisStyle;\n      rect.ensureState('blur').style = blurStyle;\n      rect.ensureState('select').style = selectStyle;\n      toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled);\n      rect.incremental = incremental;\n      // PENDING\n      if (incremental) {\n        // Rect must use hover layer if it's incremental.\n        rect.states.emphasis.hoverLayer = true;\n      }\n      group.add(rect);\n      data.setItemGraphicEl(idx, rect);\n      if (this._progressiveEls) {\n        this._progressiveEls.push(rect);\n      }\n    }\n  };\n  HeatmapView.prototype._renderOnGeo = function (geo, seriesModel, visualMapModel, api) {\n    var inRangeVisuals = visualMapModel.targetVisuals.inRange;\n    var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange;\n    // if (!visualMapping) {\n    //     throw new Error('Data range must have color visuals');\n    // }\n    var data = seriesModel.getData();\n    var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer();\n    hmLayer.blurSize = seriesModel.get('blurSize');\n    hmLayer.pointSize = seriesModel.get('pointSize');\n    hmLayer.minOpacity = seriesModel.get('minOpacity');\n    hmLayer.maxOpacity = seriesModel.get('maxOpacity');\n    var rect = geo.getViewRect().clone();\n    var roamTransform = geo.getRoamTransform();\n    rect.applyTransform(roamTransform);\n    // Clamp on viewport\n    var x = Math.max(rect.x, 0);\n    var y = Math.max(rect.y, 0);\n    var x2 = Math.min(rect.width + rect.x, api.getWidth());\n    var y2 = Math.min(rect.height + rect.y, api.getHeight());\n    var width = x2 - x;\n    var height = y2 - y;\n    var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')];\n    var points = data.mapArray(dims, function (lng, lat, value) {\n      var pt = geo.dataToPoint([lng, lat]);\n      pt[0] -= x;\n      pt[1] -= y;\n      pt.push(value);\n      return pt;\n    });\n    var dataExtent = visualMapModel.getExtent();\n    var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected);\n    hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), {\n      inRange: inRangeVisuals.color.getColorMapper(),\n      outOfRange: outOfRangeVisuals.color.getColorMapper()\n    }, isInRange);\n    var img = new graphic.Image({\n      style: {\n        width: width,\n        height: height,\n        x: x,\n        y: y,\n        image: hmLayer.canvas\n      },\n      silent: true\n    });\n    this.group.add(img);\n  };\n  HeatmapView.type = 'heatmap';\n  return HeatmapView;\n}(ChartView);\nexport default HeatmapView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport createSeriesData from '../helper/createSeriesData.js';\nimport CoordinateSystem from '../../core/CoordinateSystem.js';\nimport tokens from '../../visual/tokens.js';\nvar HeatmapSeriesModel = /** @class */function (_super) {\n  __extends(HeatmapSeriesModel, _super);\n  function HeatmapSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = HeatmapSeriesModel.type;\n    return _this;\n  }\n  HeatmapSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesData(null, this, {\n      generateCoord: 'value'\n    });\n  };\n  HeatmapSeriesModel.prototype.preventIncremental = function () {\n    var coordSysCreator = CoordinateSystem.get(this.get('coordinateSystem'));\n    if (coordSysCreator && coordSysCreator.dimensions) {\n      return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat';\n    }\n  };\n  HeatmapSeriesModel.type = 'series.heatmap';\n  HeatmapSeriesModel.dependencies = ['grid', 'geo', 'calendar', 'matrix'];\n  HeatmapSeriesModel.defaultOption = {\n    coordinateSystem: 'cartesian2d',\n    // zlevel: 0,\n    z: 2,\n    // Cartesian coordinate system\n    // xAxisIndex: 0,\n    // yAxisIndex: 0,\n    // Geo coordinate system\n    geoIndex: 0,\n    blurSize: 30,\n    pointSize: 20,\n    maxOpacity: 1,\n    minOpacity: 0,\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary\n      }\n    }\n  };\n  return HeatmapSeriesModel;\n}(SeriesModel);\nexport default HeatmapSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport HeatmapView from './HeatmapView.js';\nimport HeatmapSeriesModel from './HeatmapSeries.js';\nexport function install(registers) {\n  registers.registerChartView(HeatmapView);\n  registers.registerSeriesModel(HeatmapSeriesModel);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis } from '../../util/states.js';\nimport { createSymbol, normalizeSymbolOffset } from '../../util/symbol.js';\nimport { parsePercent, isNumeric } from '../../util/number.js';\nimport ChartView from '../../view/Chart.js';\nimport { getDefaultLabel } from '../helper/labelHelper.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport ZRImage from 'zrender/lib/graphic/Image.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { createClipPath } from '../helper/createClipPathFromCoordSys.js';\nvar BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'borderWidth'];\n// index: +isHorizontal\nvar LAYOUT_ATTRS = [{\n  xy: 'x',\n  wh: 'width',\n  index: 0,\n  posDesc: ['left', 'right']\n}, {\n  xy: 'y',\n  wh: 'height',\n  index: 1,\n  posDesc: ['top', 'bottom']\n}];\nvar pathForLineWidth = new graphic.Circle();\nvar PictorialBarView = /** @class */function (_super) {\n  __extends(PictorialBarView, _super);\n  function PictorialBarView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = PictorialBarView.type;\n    return _this;\n  }\n  PictorialBarView.prototype.render = function (seriesModel, ecModel, api) {\n    var group = this.group;\n    var data = seriesModel.getData();\n    var oldData = this._data;\n    var cartesian = seriesModel.coordinateSystem;\n    var baseAxis = cartesian.getBaseAxis();\n    var isHorizontal = baseAxis.isHorizontal();\n    var coordSysRect = cartesian.master.getRect();\n    var opt = {\n      ecSize: {\n        width: api.getWidth(),\n        height: api.getHeight()\n      },\n      seriesModel: seriesModel,\n      coordSys: cartesian,\n      coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]],\n      isHorizontal: isHorizontal,\n      valueDim: LAYOUT_ATTRS[+isHorizontal],\n      categoryDim: LAYOUT_ATTRS[1 - +isHorizontal]\n    };\n    data.diff(oldData).add(function (dataIndex) {\n      if (!data.hasValue(dataIndex)) {\n        return;\n      }\n      var itemModel = getItemModel(data, dataIndex);\n      var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);\n      var bar = createBar(data, opt, symbolMeta);\n      data.setItemGraphicEl(dataIndex, bar);\n      group.add(bar);\n      updateCommon(bar, opt, symbolMeta);\n    }).update(function (newIndex, oldIndex) {\n      var bar = oldData.getItemGraphicEl(oldIndex);\n      if (!data.hasValue(newIndex)) {\n        group.remove(bar);\n        return;\n      }\n      var itemModel = getItemModel(data, newIndex);\n      var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);\n      var pictorialShapeStr = getShapeStr(data, symbolMeta);\n      if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) {\n        group.remove(bar);\n        data.setItemGraphicEl(newIndex, null);\n        bar = null;\n      }\n      if (bar) {\n        updateBar(bar, opt, symbolMeta);\n      } else {\n        bar = createBar(data, opt, symbolMeta, true);\n      }\n      data.setItemGraphicEl(newIndex, bar);\n      bar.__pictorialSymbolMeta = symbolMeta;\n      // Add back\n      group.add(bar);\n      updateCommon(bar, opt, symbolMeta);\n    }).remove(function (dataIndex) {\n      var bar = oldData.getItemGraphicEl(dataIndex);\n      bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar);\n    }).execute();\n    // Do clipping\n    var clipPath = seriesModel.get('clip', true) ? createClipPath(seriesModel.coordinateSystem, false, seriesModel) : null;\n    if (clipPath) {\n      group.setClipPath(clipPath);\n    } else {\n      group.removeClipPath();\n    }\n    this._data = data;\n    return this.group;\n  };\n  PictorialBarView.prototype.remove = function (ecModel, api) {\n    var group = this.group;\n    var data = this._data;\n    if (ecModel.get('animation')) {\n      if (data) {\n        data.eachItemGraphicEl(function (bar) {\n          removeBar(data, getECData(bar).dataIndex, ecModel, bar);\n        });\n      }\n    } else {\n      group.removeAll();\n    }\n  };\n  PictorialBarView.type = 'pictorialBar';\n  return PictorialBarView;\n}(ChartView);\n// Set or calculate default value about symbol, and calculate layout info.\nfunction getSymbolMeta(data, dataIndex, itemModel, opt) {\n  var layout = data.getItemLayout(dataIndex);\n  var symbolRepeat = itemModel.get('symbolRepeat');\n  var symbolClip = itemModel.get('symbolClip');\n  var symbolPosition = itemModel.get('symbolPosition') || 'start';\n  var symbolRotate = itemModel.get('symbolRotate');\n  var rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n  var symbolPatternSize = itemModel.get('symbolPatternSize') || 2;\n  var isAnimationEnabled = itemModel.isAnimationEnabled();\n  var symbolMeta = {\n    dataIndex: dataIndex,\n    layout: layout,\n    itemModel: itemModel,\n    symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle',\n    style: data.getItemVisual(dataIndex, 'style'),\n    symbolClip: symbolClip,\n    symbolRepeat: symbolRepeat,\n    symbolRepeatDirection: itemModel.get('symbolRepeatDirection'),\n    symbolPatternSize: symbolPatternSize,\n    rotation: rotation,\n    animationModel: isAnimationEnabled ? itemModel : null,\n    hoverScale: isAnimationEnabled && itemModel.get(['emphasis', 'scale']),\n    z2: itemModel.getShallow('z', true) || 0\n  };\n  prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta);\n  prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta);\n  prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta);\n  var symbolSize = symbolMeta.symbolSize;\n  var symbolOffset = normalizeSymbolOffset(itemModel.get('symbolOffset'), symbolSize);\n  prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta);\n  return symbolMeta;\n}\n// bar length can be negative.\nfunction prepareBarLength(itemModel, symbolRepeat, layout, opt, outputSymbolMeta) {\n  var valueDim = opt.valueDim;\n  var symbolBoundingData = itemModel.get('symbolBoundingData');\n  var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis());\n  var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));\n  var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0);\n  var boundingLength;\n  if (zrUtil.isArray(symbolBoundingData)) {\n    var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx];\n    symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse();\n    boundingLength = symbolBoundingExtent[pxSignIdx];\n  } else if (symbolBoundingData != null) {\n    boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx;\n  } else if (symbolRepeat) {\n    boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx;\n  } else {\n    boundingLength = layout[valueDim.wh];\n  }\n  outputSymbolMeta.boundingLength = boundingLength;\n  if (symbolRepeat) {\n    outputSymbolMeta.repeatCutLength = layout[valueDim.wh];\n  }\n  // if 'pxSign' means sign of pixel,  it can't be zero, or symbolScale will be zero\n  // and when borderWidth be settled, the actual linewidth will be NaN\n  var isXAxis = valueDim.xy === 'x';\n  var isInverse = valueAxis.inverse;\n  outputSymbolMeta.pxSign = isXAxis && !isInverse || !isXAxis && isInverse ? boundingLength >= 0 ? 1 : -1 : boundingLength > 0 ? 1 : -1;\n}\nfunction convertToCoordOnAxis(axis, value) {\n  return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value)));\n}\n// Support ['100%', '100%']\nfunction prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, outputSymbolMeta) {\n  var valueDim = opt.valueDim;\n  var categoryDim = opt.categoryDim;\n  var categorySize = Math.abs(layout[categoryDim.wh]);\n  var symbolSize = data.getItemVisual(dataIndex, 'symbolSize');\n  var parsedSymbolSize;\n  if (zrUtil.isArray(symbolSize)) {\n    parsedSymbolSize = symbolSize.slice();\n  } else {\n    if (symbolSize == null) {\n      // will parse to number below\n      parsedSymbolSize = ['100%', '100%'];\n    } else {\n      parsedSymbolSize = [symbolSize, symbolSize];\n    }\n  }\n  // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is\n  // to complicated to calculate real percent value if considering scaled lineWidth.\n  // So the actual size will bigger than layout size if lineWidth is bigger than zero,\n  // which can be tolerated in pictorial chart.\n  parsedSymbolSize[categoryDim.index] = parsePercent(parsedSymbolSize[categoryDim.index], categorySize);\n  parsedSymbolSize[valueDim.index] = parsePercent(parsedSymbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength));\n  outputSymbolMeta.symbolSize = parsedSymbolSize;\n  // If x or y is less than zero, show reversed shape.\n  var symbolScale = outputSymbolMeta.symbolScale = [parsedSymbolSize[0] / symbolPatternSize, parsedSymbolSize[1] / symbolPatternSize];\n  // Follow convention, 'right' and 'top' is the normal scale.\n  symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign;\n}\nfunction prepareLineWidth(itemModel, symbolScale, rotation, opt, outputSymbolMeta) {\n  // In symbols are drawn with scale, so do not need to care about the case that width\n  // or height are too small. But symbol use strokeNoScale, where acture lineWidth should\n  // be calculated.\n  var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;\n  if (valueLineWidth) {\n    pathForLineWidth.attr({\n      scaleX: symbolScale[0],\n      scaleY: symbolScale[1],\n      rotation: rotation\n    });\n    pathForLineWidth.updateTransform();\n    valueLineWidth /= pathForLineWidth.getLineScale();\n    valueLineWidth *= symbolScale[opt.valueDim.index];\n  }\n  outputSymbolMeta.valueLineWidth = valueLineWidth || 0;\n}\nfunction prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, outputSymbolMeta) {\n  var categoryDim = opt.categoryDim;\n  var valueDim = opt.valueDim;\n  var pxSign = outputSymbolMeta.pxSign;\n  var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);\n  var pathLen = unitLength;\n  // Note: rotation will not effect the layout of symbols, because user may\n  // want symbols to rotate on its center, which should not be translated\n  // when rotating.\n  if (symbolRepeat) {\n    var absBoundingLength = Math.abs(boundingLength);\n    var symbolMargin = zrUtil.retrieve(itemModel.get('symbolMargin'), '15%') + '';\n    var hasEndGap = false;\n    if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) {\n      hasEndGap = true;\n      symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1);\n    }\n    var symbolMarginNumeric = parsePercent(symbolMargin, symbolSize[valueDim.index]);\n    var uLenWithMargin = Math.max(unitLength + symbolMarginNumeric * 2, 0);\n    // When symbol margin is less than 0, margin at both ends will be subtracted\n    // to ensure that all of the symbols will not be overflow the given area.\n    var endFix = hasEndGap ? 0 : symbolMarginNumeric * 2;\n    // Both final repeatTimes and final symbolMarginNumeric area calculated based on\n    // boundingLength.\n    var repeatSpecified = isNumeric(symbolRepeat);\n    var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin);\n    // Adjust calculate margin, to ensure each symbol is displayed\n    // entirely in the given layout area.\n    var mDiff = absBoundingLength - repeatTimes * unitLength;\n    symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : Math.max(repeatTimes - 1, 1));\n    uLenWithMargin = unitLength + symbolMarginNumeric * 2;\n    endFix = hasEndGap ? 0 : symbolMarginNumeric * 2;\n    // Update repeatTimes when not all symbol will be shown.\n    if (!repeatSpecified && symbolRepeat !== 'fixed') {\n      repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0;\n    }\n    pathLen = repeatTimes * uLenWithMargin - endFix;\n    outputSymbolMeta.repeatTimes = repeatTimes;\n    outputSymbolMeta.symbolMargin = symbolMarginNumeric;\n  }\n  var sizeFix = pxSign * (pathLen / 2);\n  var pathPosition = outputSymbolMeta.pathPosition = [];\n  pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2;\n  pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center'\n  if (symbolOffset) {\n    pathPosition[0] += symbolOffset[0];\n    pathPosition[1] += symbolOffset[1];\n  }\n  var bundlePosition = outputSymbolMeta.bundlePosition = [];\n  bundlePosition[categoryDim.index] = layout[categoryDim.xy];\n  bundlePosition[valueDim.index] = layout[valueDim.xy];\n  var barRectShape = outputSymbolMeta.barRectShape = zrUtil.extend({}, layout);\n  barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix));\n  barRectShape[categoryDim.wh] = layout[categoryDim.wh];\n  var clipShape = outputSymbolMeta.clipShape = {};\n  // Consider that symbol may be overflow layout rect.\n  clipShape[categoryDim.xy] = -layout[categoryDim.xy];\n  clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh];\n  clipShape[valueDim.xy] = 0;\n  clipShape[valueDim.wh] = layout[valueDim.wh];\n}\nfunction createPath(symbolMeta) {\n  var symbolPatternSize = symbolMeta.symbolPatternSize;\n  var path = createSymbol(\n  // Consider texture img, make a big size.\n  symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize);\n  path.attr({\n    culling: true\n  });\n  path.type !== 'image' && path.setStyle({\n    strokeNoScale: true\n  });\n  return path;\n}\nfunction createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) {\n  var bundle = bar.__pictorialBundle;\n  var symbolSize = symbolMeta.symbolSize;\n  var valueLineWidth = symbolMeta.valueLineWidth;\n  var pathPosition = symbolMeta.pathPosition;\n  var valueDim = opt.valueDim;\n  var repeatTimes = symbolMeta.repeatTimes || 0;\n  var index = 0;\n  var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;\n  eachPath(bar, function (path) {\n    path.__pictorialAnimationIndex = index;\n    path.__pictorialRepeatTimes = repeatTimes;\n    if (index < repeatTimes) {\n      updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate);\n    } else {\n      updateAttr(path, null, {\n        scaleX: 0,\n        scaleY: 0\n      }, symbolMeta, isUpdate, function () {\n        bundle.remove(path);\n      });\n    }\n    // updateHoverAnimation(path, symbolMeta);\n    index++;\n  });\n  for (; index < repeatTimes; index++) {\n    var path = createPath(symbolMeta);\n    path.__pictorialAnimationIndex = index;\n    path.__pictorialRepeatTimes = repeatTimes;\n    bundle.add(path);\n    var target = makeTarget(index);\n    updateAttr(path, {\n      x: target.x,\n      y: target.y,\n      scaleX: 0,\n      scaleY: 0\n    }, {\n      scaleX: target.scaleX,\n      scaleY: target.scaleY,\n      rotation: target.rotation\n    }, symbolMeta, isUpdate);\n  }\n  function makeTarget(index) {\n    var position = pathPosition.slice();\n    // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index\n    // Otherwise: i = index;\n    var pxSign = symbolMeta.pxSign;\n    var i = index;\n    if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) {\n      i = repeatTimes - 1 - index;\n    }\n    position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index];\n    return {\n      x: position[0],\n      y: position[1],\n      scaleX: symbolMeta.symbolScale[0],\n      scaleY: symbolMeta.symbolScale[1],\n      rotation: symbolMeta.rotation\n    };\n  }\n}\nfunction createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) {\n  var bundle = bar.__pictorialBundle;\n  var mainPath = bar.__pictorialMainPath;\n  if (!mainPath) {\n    mainPath = bar.__pictorialMainPath = createPath(symbolMeta);\n    bundle.add(mainPath);\n    updateAttr(mainPath, {\n      x: symbolMeta.pathPosition[0],\n      y: symbolMeta.pathPosition[1],\n      scaleX: 0,\n      scaleY: 0,\n      rotation: symbolMeta.rotation\n    }, {\n      scaleX: symbolMeta.symbolScale[0],\n      scaleY: symbolMeta.symbolScale[1]\n    }, symbolMeta, isUpdate);\n  } else {\n    updateAttr(mainPath, null, {\n      x: symbolMeta.pathPosition[0],\n      y: symbolMeta.pathPosition[1],\n      scaleX: symbolMeta.symbolScale[0],\n      scaleY: symbolMeta.symbolScale[1],\n      rotation: symbolMeta.rotation\n    }, symbolMeta, isUpdate);\n  }\n}\n// bar rect is used for label.\nfunction createOrUpdateBarRect(bar, symbolMeta, isUpdate) {\n  var rectShape = zrUtil.extend({}, symbolMeta.barRectShape);\n  var barRect = bar.__pictorialBarRect;\n  if (!barRect) {\n    barRect = bar.__pictorialBarRect = new graphic.Rect({\n      z2: 2,\n      shape: rectShape,\n      silent: true,\n      style: {\n        stroke: 'transparent',\n        fill: 'transparent',\n        lineWidth: 0\n      }\n    });\n    barRect.disableMorphing = true;\n    bar.add(barRect);\n  } else {\n    updateAttr(barRect, null, {\n      shape: rectShape\n    }, symbolMeta, isUpdate);\n  }\n}\nfunction createOrUpdateClip(bar, opt, symbolMeta, isUpdate) {\n  // If not clip, symbol will be remove and rebuilt.\n  if (symbolMeta.symbolClip) {\n    var clipPath = bar.__pictorialClipPath;\n    var clipShape = zrUtil.extend({}, symbolMeta.clipShape);\n    var valueDim = opt.valueDim;\n    var animationModel = symbolMeta.animationModel;\n    var dataIndex = symbolMeta.dataIndex;\n    if (clipPath) {\n      graphic.updateProps(clipPath, {\n        shape: clipShape\n      }, animationModel, dataIndex);\n    } else {\n      clipShape[valueDim.wh] = 0;\n      clipPath = new graphic.Rect({\n        shape: clipShape\n      });\n      bar.__pictorialBundle.setClipPath(clipPath);\n      bar.__pictorialClipPath = clipPath;\n      var target = {};\n      target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh];\n      graphic[isUpdate ? 'updateProps' : 'initProps'](clipPath, {\n        shape: target\n      }, animationModel, dataIndex);\n    }\n  }\n}\nfunction getItemModel(data, dataIndex) {\n  var itemModel = data.getItemModel(dataIndex);\n  itemModel.getAnimationDelayParams = getAnimationDelayParams;\n  itemModel.isAnimationEnabled = isAnimationEnabled;\n  return itemModel;\n}\nfunction getAnimationDelayParams(path) {\n  // The order is the same as the z-order, see `symbolRepeatDiretion`.\n  return {\n    index: path.__pictorialAnimationIndex,\n    count: path.__pictorialRepeatTimes\n  };\n}\nfunction isAnimationEnabled() {\n  // `animation` prop can be set on itemModel in pictorial bar chart.\n  return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation');\n}\nfunction createBar(data, opt, symbolMeta, isUpdate) {\n  // bar is the main element for each data.\n  var bar = new graphic.Group();\n  // bundle is used for location and clip.\n  var bundle = new graphic.Group();\n  bar.add(bundle);\n  bar.__pictorialBundle = bundle;\n  bundle.x = symbolMeta.bundlePosition[0];\n  bundle.y = symbolMeta.bundlePosition[1];\n  if (symbolMeta.symbolRepeat) {\n    createOrUpdateRepeatSymbols(bar, opt, symbolMeta);\n  } else {\n    createOrUpdateSingleSymbol(bar, opt, symbolMeta);\n  }\n  createOrUpdateBarRect(bar, symbolMeta, isUpdate);\n  createOrUpdateClip(bar, opt, symbolMeta, isUpdate);\n  bar.__pictorialShapeStr = getShapeStr(data, symbolMeta);\n  bar.__pictorialSymbolMeta = symbolMeta;\n  return bar;\n}\nfunction updateBar(bar, opt, symbolMeta) {\n  var animationModel = symbolMeta.animationModel;\n  var dataIndex = symbolMeta.dataIndex;\n  var bundle = bar.__pictorialBundle;\n  graphic.updateProps(bundle, {\n    x: symbolMeta.bundlePosition[0],\n    y: symbolMeta.bundlePosition[1]\n  }, animationModel, dataIndex);\n  if (symbolMeta.symbolRepeat) {\n    createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true);\n  } else {\n    createOrUpdateSingleSymbol(bar, opt, symbolMeta, true);\n  }\n  createOrUpdateBarRect(bar, symbolMeta, true);\n  createOrUpdateClip(bar, opt, symbolMeta, true);\n}\nfunction removeBar(data, dataIndex, animationModel, bar) {\n  // Not show text when animating\n  var labelRect = bar.__pictorialBarRect;\n  labelRect && labelRect.removeTextContent();\n  var paths = [];\n  eachPath(bar, function (path) {\n    paths.push(path);\n  });\n  bar.__pictorialMainPath && paths.push(bar.__pictorialMainPath);\n  // I do not find proper remove animation for clip yet.\n  bar.__pictorialClipPath && (animationModel = null);\n  zrUtil.each(paths, function (path) {\n    graphic.removeElement(path, {\n      scaleX: 0,\n      scaleY: 0\n    }, animationModel, dataIndex, function () {\n      bar.parent && bar.parent.remove(bar);\n    });\n  });\n  data.setItemGraphicEl(dataIndex, null);\n}\nfunction getShapeStr(data, symbolMeta) {\n  return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':');\n}\nfunction eachPath(bar, cb, context) {\n  // Do not use Group#eachChild, because it do not support remove.\n  zrUtil.each(bar.__pictorialBundle.children(), function (el) {\n    el !== bar.__pictorialBarRect && cb.call(context, el);\n  });\n}\nfunction updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) {\n  immediateAttrs && el.attr(immediateAttrs);\n  // when symbolCip used, only clip path has init animation, otherwise it would be weird effect.\n  if (symbolMeta.symbolClip && !isUpdate) {\n    animationAttrs && el.attr(animationAttrs);\n  } else {\n    animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb);\n  }\n}\nfunction updateCommon(bar, opt, symbolMeta) {\n  var dataIndex = symbolMeta.dataIndex;\n  var itemModel = symbolMeta.itemModel;\n  // Color must be excluded.\n  // Because symbol provide setColor individually to set fill and stroke\n  var emphasisModel = itemModel.getModel('emphasis');\n  var emphasisStyle = emphasisModel.getModel('itemStyle').getItemStyle();\n  var blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle();\n  var selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle();\n  var cursorStyle = itemModel.getShallow('cursor');\n  var focus = emphasisModel.get('focus');\n  var blurScope = emphasisModel.get('blurScope');\n  var hoverScale = emphasisModel.get('scale');\n  eachPath(bar, function (path) {\n    if (path instanceof ZRImage) {\n      var pathStyle = path.style;\n      path.useStyle(zrUtil.extend({\n        // TODO other properties like dx, dy ?\n        image: pathStyle.image,\n        x: pathStyle.x,\n        y: pathStyle.y,\n        width: pathStyle.width,\n        height: pathStyle.height\n      }, symbolMeta.style));\n    } else {\n      path.useStyle(symbolMeta.style);\n    }\n    var emphasisState = path.ensureState('emphasis');\n    emphasisState.style = emphasisStyle;\n    if (hoverScale) {\n      // NOTE: Must after scale is set after updateAttr\n      emphasisState.scaleX = path.scaleX * 1.1;\n      emphasisState.scaleY = path.scaleY * 1.1;\n    }\n    path.ensureState('blur').style = blurStyle;\n    path.ensureState('select').style = selectStyle;\n    cursorStyle && (path.cursor = cursorStyle);\n    path.z2 = symbolMeta.z2;\n  });\n  var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];\n  var barRect = bar.__pictorialBarRect;\n  barRect.ignoreClip = true;\n  setLabelStyle(barRect, getLabelStatesModels(itemModel), {\n    labelFetcher: opt.seriesModel,\n    labelDataIndex: dataIndex,\n    defaultText: getDefaultLabel(opt.seriesModel.getData(), dataIndex),\n    inheritColor: symbolMeta.style.fill,\n    defaultOpacity: symbolMeta.style.opacity,\n    defaultOutsidePosition: barPositionOutside\n  });\n  toggleHoverEmphasis(bar, focus, blurScope, emphasisModel.get('disabled'));\n}\nfunction toIntTimes(times) {\n  var roundedTimes = Math.round(times);\n  // Escapse accurate error\n  return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times);\n}\nexport default PictorialBarView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BaseBarSeriesModel from './BaseBarSeries.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nimport tokens from '../../visual/tokens.js';\nvar PictorialBarSeriesModel = /** @class */function (_super) {\n  __extends(PictorialBarSeriesModel, _super);\n  function PictorialBarSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = PictorialBarSeriesModel.type;\n    _this.hasSymbolVisual = true;\n    _this.defaultSymbol = 'roundRect';\n    return _this;\n  }\n  PictorialBarSeriesModel.prototype.getInitialData = function (option) {\n    // Disable stack.\n    option.stack = null;\n    return _super.prototype.getInitialData.apply(this, arguments);\n  };\n  PictorialBarSeriesModel.type = 'series.pictorialBar';\n  PictorialBarSeriesModel.dependencies = ['grid'];\n  PictorialBarSeriesModel.defaultOption = inheritDefaultOption(BaseBarSeriesModel.defaultOption, {\n    symbol: 'circle',\n    symbolSize: null,\n    symbolRotate: null,\n    symbolPosition: null,\n    symbolOffset: null,\n    symbolMargin: null,\n    symbolRepeat: false,\n    symbolRepeatDirection: 'end',\n    symbolClip: false,\n    symbolBoundingData: null,\n    symbolPatternSize: 400,\n    barGap: '-100%',\n    // Pictorial bar do not clip by default because in many cases\n    // xAxis and yAxis are not displayed and it's expected not to clip\n    clip: false,\n    // z can be set in data item, which is z2 actually.\n    // Disable progressive\n    progressive: 0,\n    emphasis: {\n      // By default pictorialBar do not hover scale. Hover scale is not suitable\n      // for the case that both has foreground and background.\n      scale: false\n    },\n    select: {\n      itemStyle: {\n        borderColor: tokens.color.primary\n      }\n    }\n  });\n  return PictorialBarSeriesModel;\n}(BaseBarSeriesModel);\nexport default PictorialBarSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport PictorialBarView from './PictorialBarView.js';\nimport PictorialBarSeriesModel from './PictorialBarSeries.js';\nimport { createProgressiveLayout, layout } from '../../layout/barGrid.js';\nimport { curry } from 'zrender/lib/core/util.js';\nexport function install(registers) {\n  registers.registerChartView(PictorialBarView);\n  registers.registerSeriesModel(PictorialBarSeriesModel);\n  registers.registerLayout(registers.PRIORITY.VISUAL.LAYOUT, curry(layout, 'pictorialBar'));\n  // Do layout after other overall layout, which can prepare some information.\n  registers.registerLayout(registers.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT, createProgressiveLayout('pictorialBar'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { ECPolygon } from '../line/poly.js';\nimport * as graphic from '../../util/graphic.js';\nimport { setStatesStylesFromModel, toggleHoverEmphasis } from '../../util/states.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { bind } from 'zrender/lib/core/util.js';\nimport DataDiffer from '../../data/DataDiffer.js';\nimport ChartView from '../../view/Chart.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nvar ThemeRiverView = /** @class */function (_super) {\n  __extends(ThemeRiverView, _super);\n  function ThemeRiverView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ThemeRiverView.type;\n    _this._layers = [];\n    return _this;\n  }\n  ThemeRiverView.prototype.render = function (seriesModel, ecModel, api) {\n    var data = seriesModel.getData();\n    var self = this;\n    var group = this.group;\n    var layersSeries = seriesModel.getLayerSeries();\n    var layoutInfo = data.getLayout('layoutInfo');\n    var rect = layoutInfo.rect;\n    var boundaryGap = layoutInfo.boundaryGap;\n    group.x = 0;\n    group.y = rect.y + boundaryGap[0];\n    function keyGetter(item) {\n      return item.name;\n    }\n    var dataDiffer = new DataDiffer(this._layersSeries || [], layersSeries, keyGetter, keyGetter);\n    var newLayersGroups = [];\n    dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute();\n    function process(status, idx, oldIdx) {\n      var oldLayersGroups = self._layers;\n      if (status === 'remove') {\n        group.remove(oldLayersGroups[idx]);\n        return;\n      }\n      var points0 = [];\n      var points1 = [];\n      var style;\n      var indices = layersSeries[idx].indices;\n      var j = 0;\n      for (; j < indices.length; j++) {\n        var layout = data.getItemLayout(indices[j]);\n        var x = layout.x;\n        var y0 = layout.y0;\n        var y = layout.y;\n        points0.push(x, y0);\n        points1.push(x, y0 + y);\n        style = data.getItemVisual(indices[j], 'style');\n      }\n      var polygon;\n      var textLayout = data.getItemLayout(indices[0]);\n      var labelModel = seriesModel.getModel('label');\n      var margin = labelModel.get('margin');\n      var emphasisModel = seriesModel.getModel('emphasis');\n      if (status === 'add') {\n        var layerGroup = newLayersGroups[idx] = new graphic.Group();\n        polygon = new ECPolygon({\n          shape: {\n            points: points0,\n            stackedOnPoints: points1,\n            smooth: 0.4,\n            stackedOnSmooth: 0.4,\n            smoothConstraint: false\n          },\n          z2: 0\n        });\n        layerGroup.add(polygon);\n        group.add(layerGroup);\n        if (seriesModel.isAnimationEnabled()) {\n          polygon.setClipPath(createGridClipShape(polygon.getBoundingRect(), seriesModel, function () {\n            polygon.removeClipPath();\n          }));\n        }\n      } else {\n        var layerGroup = oldLayersGroups[oldIdx];\n        polygon = layerGroup.childAt(0);\n        group.add(layerGroup);\n        newLayersGroups[idx] = layerGroup;\n        graphic.updateProps(polygon, {\n          shape: {\n            points: points0,\n            stackedOnPoints: points1\n          }\n        }, seriesModel);\n        saveOldStyle(polygon);\n      }\n      setLabelStyle(polygon, getLabelStatesModels(seriesModel), {\n        labelDataIndex: indices[j - 1],\n        defaultText: data.getName(indices[j - 1]),\n        inheritColor: style.fill\n      }, {\n        normal: {\n          verticalAlign: 'middle'\n          // align: 'right'\n        }\n      });\n      polygon.setTextConfig({\n        position: null,\n        local: true\n      });\n      var labelEl = polygon.getTextContent();\n      // TODO More label position options.\n      if (labelEl) {\n        labelEl.x = textLayout.x - margin;\n        labelEl.y = textLayout.y0 + textLayout.y / 2;\n      }\n      polygon.useStyle(style);\n      data.setItemGraphicEl(idx, polygon);\n      setStatesStylesFromModel(polygon, seriesModel);\n      toggleHoverEmphasis(polygon, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n    }\n    this._layersSeries = layersSeries;\n    this._layers = newLayersGroups;\n  };\n  ThemeRiverView.type = 'themeRiver';\n  return ThemeRiverView;\n}(ChartView);\n;\n// add animation to the view\nfunction createGridClipShape(rect, seriesModel, cb) {\n  var rectEl = new graphic.Rect({\n    shape: {\n      x: rect.x - 10,\n      y: rect.y - 10,\n      width: 0,\n      height: rect.height + 20\n    }\n  });\n  graphic.initProps(rectEl, {\n    shape: {\n      x: rect.x - 50,\n      width: rect.width + 100,\n      height: rect.height + 20\n    }\n  }, seriesModel, cb);\n  return rectEl;\n}\nexport default ThemeRiverView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesModel from '../../model/Series.js';\nimport prepareSeriesDataSchema from '../../data/helper/createDimensions.js';\nimport { getDimensionTypeByAxis } from '../../data/helper/dimensionHelper.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { groupData, SINGLE_REFERRING } from '../../util/model.js';\nimport LegendVisualProvider from '../../visual/LegendVisualProvider.js';\nimport { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';\nvar DATA_NAME_INDEX = 2;\nvar ThemeRiverSeriesModel = /** @class */function (_super) {\n  __extends(ThemeRiverSeriesModel, _super);\n  function ThemeRiverSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ThemeRiverSeriesModel.type;\n    return _this;\n  }\n  /**\n   * @override\n   */\n  ThemeRiverSeriesModel.prototype.init = function (option) {\n    // eslint-disable-next-line\n    _super.prototype.init.apply(this, arguments);\n    // Put this function here is for the sake of consistency of code style.\n    // Enable legend selection for each data item\n    // Use a function instead of direct access because data reference may changed\n    this.legendVisualProvider = new LegendVisualProvider(zrUtil.bind(this.getData, this), zrUtil.bind(this.getRawData, this));\n  };\n  /**\n   * If there is no value of a certain point in the time for some event,set it value to 0.\n   *\n   * @param {Array} data  initial data in the option\n   * @return {Array}\n   */\n  ThemeRiverSeriesModel.prototype.fixData = function (data) {\n    var rawDataLength = data.length;\n    /**\n     * Make sure every layer data get the same keys.\n     * The value index tells which layer has visited.\n     * {\n     *  2014/01/01: -1\n     * }\n     */\n    var timeValueKeys = {};\n    // grouped data by name\n    var groupResult = groupData(data, function (item) {\n      if (!timeValueKeys.hasOwnProperty(item[0] + '')) {\n        timeValueKeys[item[0] + ''] = -1;\n      }\n      return item[2];\n    });\n    var layerData = [];\n    groupResult.buckets.each(function (items, key) {\n      layerData.push({\n        name: key,\n        dataList: items\n      });\n    });\n    var layerNum = layerData.length;\n    for (var k = 0; k < layerNum; ++k) {\n      var name_1 = layerData[k].name;\n      for (var j = 0; j < layerData[k].dataList.length; ++j) {\n        var timeValue = layerData[k].dataList[j][0] + '';\n        timeValueKeys[timeValue] = k;\n      }\n      for (var timeValue in timeValueKeys) {\n        if (timeValueKeys.hasOwnProperty(timeValue) && timeValueKeys[timeValue] !== k) {\n          timeValueKeys[timeValue] = k;\n          data[rawDataLength] = [timeValue, 0, name_1];\n          rawDataLength++;\n        }\n      }\n    }\n    return data;\n  };\n  /**\n   * @override\n   * @param  option  the initial option that user gave\n   * @param  ecModel  the model object for themeRiver option\n   */\n  ThemeRiverSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    var singleAxisModel = this.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0];\n    var axisType = singleAxisModel.get('type');\n    // filter the data item with the value of label is undefined\n    var filterData = zrUtil.filter(option.data, function (dataItem) {\n      return dataItem[2] !== undefined;\n    });\n    // ??? TODO design a stage to transfer data for themeRiver and lines?\n    var data = this.fixData(filterData || []);\n    var nameList = [];\n    var nameMap = this.nameMap = zrUtil.createHashMap();\n    var count = 0;\n    for (var i = 0; i < data.length; ++i) {\n      nameList.push(data[i][DATA_NAME_INDEX]);\n      if (!nameMap.get(data[i][DATA_NAME_INDEX])) {\n        nameMap.set(data[i][DATA_NAME_INDEX], count);\n        count++;\n      }\n    }\n    var dimensions = prepareSeriesDataSchema(data, {\n      coordDimensions: ['single'],\n      dimensionsDefine: [{\n        name: 'time',\n        type: getDimensionTypeByAxis(axisType)\n      }, {\n        name: 'value',\n        type: 'float'\n      }, {\n        name: 'name',\n        type: 'ordinal'\n      }],\n      encodeDefine: {\n        single: 0,\n        value: 1,\n        itemName: 2\n      }\n    }).dimensions;\n    var list = new SeriesData(dimensions, this);\n    list.initData(data);\n    return list;\n  };\n  /**\n   * The raw data is divided into multiple layers and each layer\n   *     has same name.\n   */\n  ThemeRiverSeriesModel.prototype.getLayerSeries = function () {\n    var data = this.getData();\n    var lenCount = data.count();\n    var indexArr = [];\n    for (var i = 0; i < lenCount; ++i) {\n      indexArr[i] = i;\n    }\n    var timeDim = data.mapDimension('single');\n    // data group by name\n    var groupResult = groupData(indexArr, function (index) {\n      return data.get('name', index);\n    });\n    var layerSeries = [];\n    groupResult.buckets.each(function (items, key) {\n      items.sort(function (index1, index2) {\n        return data.get(timeDim, index1) - data.get(timeDim, index2);\n      });\n      layerSeries.push({\n        name: key,\n        indices: items\n      });\n    });\n    return layerSeries;\n  };\n  /**\n   * Get data indices for show tooltip content\n   */\n  ThemeRiverSeriesModel.prototype.getAxisTooltipData = function (dim, value, baseAxis) {\n    if (!zrUtil.isArray(dim)) {\n      dim = dim ? [dim] : [];\n    }\n    var data = this.getData();\n    var layerSeries = this.getLayerSeries();\n    var indices = [];\n    var layerNum = layerSeries.length;\n    var nestestValue;\n    for (var i = 0; i < layerNum; ++i) {\n      var minDist = Number.MAX_VALUE;\n      var nearestIdx = -1;\n      var pointNum = layerSeries[i].indices.length;\n      for (var j = 0; j < pointNum; ++j) {\n        var theValue = data.get(dim[0], layerSeries[i].indices[j]);\n        var dist = Math.abs(theValue - value);\n        if (dist <= minDist) {\n          nestestValue = theValue;\n          minDist = dist;\n          nearestIdx = layerSeries[i].indices[j];\n        }\n      }\n      indices.push(nearestIdx);\n    }\n    return {\n      dataIndices: indices,\n      nestestValue: nestestValue\n    };\n  };\n  ThemeRiverSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var data = this.getData();\n    var name = data.getName(dataIndex);\n    var value = data.get(data.mapDimension('value'), dataIndex);\n    return createTooltipMarkup('nameValue', {\n      name: name,\n      value: value\n    });\n  };\n  ThemeRiverSeriesModel.type = 'series.themeRiver';\n  ThemeRiverSeriesModel.dependencies = ['singleAxis'];\n  ThemeRiverSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    colorBy: 'data',\n    coordinateSystem: 'singleAxis',\n    // gap in axis's orthogonal orientation\n    boundaryGap: ['10%', '10%'],\n    // legendHoverLink: true,\n    singleAxisIndex: 0,\n    animationEasing: 'linear',\n    label: {\n      margin: 4,\n      show: true,\n      position: 'left',\n      fontSize: 11\n    },\n    emphasis: {\n      label: {\n        show: true\n      }\n    }\n  };\n  return ThemeRiverSeriesModel;\n}(SeriesModel);\nexport default ThemeRiverSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as numberUtil from '../../util/number.js';\nexport default function themeRiverLayout(ecModel, api) {\n  ecModel.eachSeriesByType('themeRiver', function (seriesModel) {\n    var data = seriesModel.getData();\n    var single = seriesModel.coordinateSystem;\n    var layoutInfo = {};\n    // use the axis boundingRect for view\n    var rect = single.getRect();\n    layoutInfo.rect = rect;\n    var boundaryGap = seriesModel.get('boundaryGap');\n    var axis = single.getAxis();\n    layoutInfo.boundaryGap = boundaryGap;\n    if (axis.orient === 'horizontal') {\n      boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], rect.height);\n      boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], rect.height);\n      var height = rect.height - boundaryGap[0] - boundaryGap[1];\n      doThemeRiverLayout(data, seriesModel, height);\n    } else {\n      boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], rect.width);\n      boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], rect.width);\n      var width = rect.width - boundaryGap[0] - boundaryGap[1];\n      doThemeRiverLayout(data, seriesModel, width);\n    }\n    data.setLayout('layoutInfo', layoutInfo);\n  });\n}\n/**\n * The layout information about themeriver\n *\n * @param data  data in the series\n * @param seriesModel  the model object of themeRiver series\n * @param height  value used to compute every series height\n */\nfunction doThemeRiverLayout(data, seriesModel, height) {\n  if (!data.count()) {\n    return;\n  }\n  var coordSys = seriesModel.coordinateSystem;\n  // the data in each layer are organized into a series.\n  var layerSeries = seriesModel.getLayerSeries();\n  // the points in each layer.\n  var timeDim = data.mapDimension('single');\n  var valueDim = data.mapDimension('value');\n  var layerPoints = zrUtil.map(layerSeries, function (singleLayer) {\n    return zrUtil.map(singleLayer.indices, function (idx) {\n      var pt = coordSys.dataToPoint(data.get(timeDim, idx));\n      pt[1] = data.get(valueDim, idx);\n      return pt;\n    });\n  });\n  var base = computeBaseline(layerPoints);\n  var baseLine = base.y0;\n  var ky = height / base.max;\n  // set layout information for each item.\n  var n = layerSeries.length;\n  var m = layerSeries[0].indices.length;\n  var baseY0;\n  for (var j = 0; j < m; ++j) {\n    baseY0 = baseLine[j] * ky;\n    data.setItemLayout(layerSeries[0].indices[j], {\n      layerIndex: 0,\n      x: layerPoints[0][j][0],\n      y0: baseY0,\n      y: layerPoints[0][j][1] * ky\n    });\n    for (var i = 1; i < n; ++i) {\n      baseY0 += layerPoints[i - 1][j][1] * ky;\n      data.setItemLayout(layerSeries[i].indices[j], {\n        layerIndex: i,\n        x: layerPoints[i][j][0],\n        y0: baseY0,\n        y: layerPoints[i][j][1] * ky\n      });\n    }\n  }\n}\n/**\n * Compute the baseLine of the rawdata\n * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics\n *\n * @param  data  the points in each layer\n */\nfunction computeBaseline(data) {\n  var layerNum = data.length;\n  var pointNum = data[0].length;\n  var sums = [];\n  var y0 = [];\n  var max = 0;\n  for (var i = 0; i < pointNum; ++i) {\n    var temp = 0;\n    for (var j = 0; j < layerNum; ++j) {\n      temp += data[j][i][1];\n    }\n    if (temp > max) {\n      max = temp;\n    }\n    sums.push(temp);\n  }\n  for (var k = 0; k < pointNum; ++k) {\n    y0[k] = (max - sums[k]) / 2;\n  }\n  max = 0;\n  for (var l = 0; l < pointNum; ++l) {\n    var sum = sums[l] + y0[l];\n    if (sum > max) {\n      max = sum;\n    }\n  }\n  return {\n    y0: y0,\n    max: max\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nimport ThemeRiverView from './ThemeRiverView.js';\nimport ThemeRiverSeriesModel from './ThemeRiverSeries.js';\nimport themeRiverLayout from './themeRiverLayout.js';\nimport dataFilter from '../../processor/dataFilter.js';\nexport function install(registers) {\n  registers.registerChartView(ThemeRiverView);\n  registers.registerSeriesModel(ThemeRiverSeriesModel);\n  registers.registerLayout(themeRiverLayout);\n  registers.registerProcessor(dataFilter('themeRiver'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis, SPECIAL_STATES, DISPLAY_STATES } from '../../util/states.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { getSectorCornerRadius } from '../helper/sectorHelper.js';\nimport { createOrUpdatePatternFromDecal } from '../../util/decal.js';\nimport { saveOldStyle } from '../../animation/basicTransition.js';\nimport { normalizeRadian } from 'zrender/lib/contain/util.js';\nimport { isRadianAroundZero } from '../../util/number.js';\nvar DEFAULT_SECTOR_Z = 2;\nvar DEFAULT_TEXT_Z = 4;\n/**\n * Sunburstce of Sunburst including Sector, Label, LabelLine\n */\nvar SunburstPiece = /** @class */function (_super) {\n  __extends(SunburstPiece, _super);\n  function SunburstPiece(node, seriesModel, ecModel, api) {\n    var _this = _super.call(this) || this;\n    _this.z2 = DEFAULT_SECTOR_Z;\n    _this.textConfig = {\n      inside: true\n    };\n    getECData(_this).seriesIndex = seriesModel.seriesIndex;\n    var text = new graphic.Text({\n      z2: DEFAULT_TEXT_Z,\n      silent: node.getModel().get(['label', 'silent'])\n    });\n    _this.setTextContent(text);\n    _this.updateData(true, node, seriesModel, ecModel, api);\n    return _this;\n  }\n  SunburstPiece.prototype.updateData = function (firstCreate, node,\n  // state: 'emphasis' | 'normal' | 'highlight' | 'downplay',\n  seriesModel, ecModel, api) {\n    this.node = node;\n    node.piece = this;\n    seriesModel = seriesModel || this._seriesModel;\n    ecModel = ecModel || this._ecModel;\n    var sector = this;\n    getECData(sector).dataIndex = node.dataIndex;\n    var itemModel = node.getModel();\n    var emphasisModel = itemModel.getModel('emphasis');\n    var layout = node.getLayout();\n    var sectorShape = zrUtil.extend({}, layout);\n    sectorShape.label = null;\n    var normalStyle = node.getVisual('style');\n    normalStyle.lineJoin = 'bevel';\n    var decal = node.getVisual('decal');\n    if (decal) {\n      normalStyle.decal = createOrUpdatePatternFromDecal(decal, api);\n    }\n    var cornerRadius = getSectorCornerRadius(itemModel.getModel('itemStyle'), sectorShape, true);\n    zrUtil.extend(sectorShape, cornerRadius);\n    zrUtil.each(SPECIAL_STATES, function (stateName) {\n      var state = sector.ensureState(stateName);\n      var itemStyleModel = itemModel.getModel([stateName, 'itemStyle']);\n      state.style = itemStyleModel.getItemStyle();\n      // border radius\n      var cornerRadius = getSectorCornerRadius(itemStyleModel, sectorShape);\n      if (cornerRadius) {\n        state.shape = cornerRadius;\n      }\n    });\n    if (firstCreate) {\n      sector.setShape(sectorShape);\n      sector.shape.r = layout.r0;\n      graphic.initProps(sector, {\n        shape: {\n          r: layout.r\n        }\n      }, seriesModel, node.dataIndex);\n    } else {\n      // Disable animation for gradient since no interpolation method\n      // is supported for gradient\n      graphic.updateProps(sector, {\n        shape: sectorShape\n      }, seriesModel);\n      saveOldStyle(sector);\n    }\n    sector.useStyle(normalStyle);\n    this._updateLabel(seriesModel);\n    var cursorStyle = itemModel.getShallow('cursor');\n    cursorStyle && sector.attr('cursor', cursorStyle);\n    this._seriesModel = seriesModel || this._seriesModel;\n    this._ecModel = ecModel || this._ecModel;\n    var focus = emphasisModel.get('focus');\n    var focusOrIndices = focus === 'relative' ? zrUtil.concatArray(node.getAncestorsIndices(), node.getDescendantIndices()) : focus === 'ancestor' ? node.getAncestorsIndices() : focus === 'descendant' ? node.getDescendantIndices() : focus;\n    toggleHoverEmphasis(this, focusOrIndices, emphasisModel.get('blurScope'), emphasisModel.get('disabled'));\n  };\n  SunburstPiece.prototype._updateLabel = function (seriesModel) {\n    var _this = this;\n    var itemModel = this.node.getModel();\n    var normalLabelModel = itemModel.getModel('label');\n    var layout = this.node.getLayout();\n    var angle = layout.endAngle - layout.startAngle;\n    var midAngle = (layout.startAngle + layout.endAngle) / 2;\n    var dx = Math.cos(midAngle);\n    var dy = Math.sin(midAngle);\n    var sector = this;\n    var label = sector.getTextContent();\n    var dataIndex = this.node.dataIndex;\n    var labelMinAngle = normalLabelModel.get('minAngle') / 180 * Math.PI;\n    var isNormalShown = normalLabelModel.get('show') && !(labelMinAngle != null && Math.abs(angle) < labelMinAngle);\n    label.ignore = !isNormalShown;\n    // TODO use setLabelStyle\n    zrUtil.each(DISPLAY_STATES, function (stateName) {\n      var labelStateModel = stateName === 'normal' ? itemModel.getModel('label') : itemModel.getModel([stateName, 'label']);\n      var isNormal = stateName === 'normal';\n      var state = isNormal ? label : label.ensureState(stateName);\n      var text = seriesModel.getFormattedLabel(dataIndex, stateName);\n      if (isNormal) {\n        text = text || _this.node.name;\n      }\n      state.style = createTextStyle(labelStateModel, {}, null, stateName !== 'normal', true);\n      if (text) {\n        state.style.text = text;\n      }\n      // Not displaying text when angle is too small\n      var isShown = labelStateModel.get('show');\n      if (isShown != null && !isNormal) {\n        state.ignore = !isShown;\n      }\n      var labelPosition = getLabelAttr(labelStateModel, 'position');\n      var sectorState = isNormal ? sector : sector.states[stateName];\n      var labelColor = sectorState.style.fill;\n      sectorState.textConfig = {\n        outsideFill: labelStateModel.get('color') === 'inherit' ? labelColor : null,\n        inside: labelPosition !== 'outside'\n      };\n      var r;\n      var labelPadding = getLabelAttr(labelStateModel, 'distance') || 0;\n      var textAlign = getLabelAttr(labelStateModel, 'align');\n      var rotateType = getLabelAttr(labelStateModel, 'rotate');\n      var flipStartAngle = Math.PI * 0.5;\n      var flipEndAngle = Math.PI * 1.5;\n      var midAngleNormal = normalizeRadian(rotateType === 'tangential' ? Math.PI / 2 - midAngle : midAngle);\n      // For text that is up-side down, rotate 180 degrees to make sure\n      // it's readable\n      var needsFlip = midAngleNormal > flipStartAngle && !isRadianAroundZero(midAngleNormal - flipStartAngle) && midAngleNormal < flipEndAngle;\n      if (labelPosition === 'outside') {\n        r = layout.r + labelPadding;\n        textAlign = needsFlip ? 'right' : 'left';\n      } else {\n        if (!textAlign || textAlign === 'center') {\n          // Put label in the center if it's a circle\n          if (angle === 2 * Math.PI && layout.r0 === 0) {\n            r = 0;\n          } else {\n            r = (layout.r + layout.r0) / 2;\n          }\n          textAlign = 'center';\n        } else if (textAlign === 'left') {\n          r = layout.r0 + labelPadding;\n          textAlign = needsFlip ? 'right' : 'left';\n        } else if (textAlign === 'right') {\n          r = layout.r - labelPadding;\n          textAlign = needsFlip ? 'left' : 'right';\n        }\n      }\n      state.style.align = textAlign;\n      state.style.verticalAlign = getLabelAttr(labelStateModel, 'verticalAlign') || 'middle';\n      state.x = r * dx + layout.cx;\n      state.y = r * dy + layout.cy;\n      var rotate = 0;\n      if (rotateType === 'radial') {\n        rotate = normalizeRadian(-midAngle) + (needsFlip ? Math.PI : 0);\n      } else if (rotateType === 'tangential') {\n        rotate = normalizeRadian(Math.PI / 2 - midAngle) + (needsFlip ? Math.PI : 0);\n      } else if (zrUtil.isNumber(rotateType)) {\n        rotate = rotateType * Math.PI / 180;\n      }\n      state.rotation = normalizeRadian(rotate);\n    });\n    function getLabelAttr(model, name) {\n      var stateAttr = model.get(name);\n      if (stateAttr == null) {\n        return normalLabelModel.get(name);\n      }\n      return stateAttr;\n    }\n    label.dirtyStyle();\n  };\n  return SunburstPiece;\n}(graphic.Sector);\nexport default SunburstPiece;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { extend } from 'zrender/lib/core/util.js';\nimport { deprecateReplaceLog } from '../../util/log.js';\nimport { retrieveTargetInfo, aboveViewRoot } from '../helper/treeHelper.js';\nexport var ROOT_TO_NODE_ACTION = 'sunburstRootToNode';\nvar HIGHLIGHT_ACTION = 'sunburstHighlight';\nvar UNHIGHLIGHT_ACTION = 'sunburstUnhighlight';\nexport function installSunburstAction(registers) {\n  registers.registerAction({\n    type: ROOT_TO_NODE_ACTION,\n    update: 'updateView'\n  }, function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'sunburst',\n      query: payload\n    }, handleRootToNode);\n    function handleRootToNode(model, index) {\n      var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION], model);\n      if (targetInfo) {\n        var originViewRoot = model.getViewRoot();\n        if (originViewRoot) {\n          payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown';\n        }\n        model.resetViewRoot(targetInfo.node);\n      }\n    }\n  });\n  registers.registerAction({\n    type: HIGHLIGHT_ACTION,\n    update: 'none'\n  }, function (payload, ecModel, api) {\n    // Clone\n    payload = extend({}, payload);\n    ecModel.eachComponent({\n      mainType: 'series',\n      subType: 'sunburst',\n      query: payload\n    }, handleHighlight);\n    function handleHighlight(model) {\n      var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model);\n      if (targetInfo) {\n        payload.dataIndex = targetInfo.node.dataIndex;\n      }\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      deprecateReplaceLog('sunburstHighlight', 'highlight');\n    }\n    // Fast forward action\n    api.dispatchAction(extend(payload, {\n      type: 'highlight'\n    }));\n  });\n  registers.registerAction({\n    type: UNHIGHLIGHT_ACTION,\n    update: 'updateView'\n  }, function (payload, ecModel, api) {\n    payload = extend({}, payload);\n    if (process.env.NODE_ENV !== 'production') {\n      deprecateReplaceLog('sunburstUnhighlight', 'downplay');\n    }\n    api.dispatchAction(extend(payload, {\n      type: 'downplay'\n    }));\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ChartView from '../../view/Chart.js';\nimport SunburstPiece from './SunburstPiece.js';\nimport DataDiffer from '../../data/DataDiffer.js';\nimport { ROOT_TO_NODE_ACTION } from './sunburstAction.js';\nimport { windowOpen } from '../../util/format.js';\nvar SunburstView = /** @class */function (_super) {\n  __extends(SunburstView, _super);\n  function SunburstView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SunburstView.type;\n    return _this;\n  }\n  SunburstView.prototype.render = function (seriesModel, ecModel, api,\n  // @ts-ignore\n  payload) {\n    var self = this;\n    this.seriesModel = seriesModel;\n    this.api = api;\n    this.ecModel = ecModel;\n    var data = seriesModel.getData();\n    var virtualRoot = data.tree.root;\n    var newRoot = seriesModel.getViewRoot();\n    var group = this.group;\n    var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData');\n    var newChildren = [];\n    newRoot.eachNode(function (node) {\n      newChildren.push(node);\n    });\n    var oldChildren = this._oldChildren || [];\n    dualTravel(newChildren, oldChildren);\n    renderRollUp(virtualRoot, newRoot);\n    this._initEvents();\n    this._oldChildren = newChildren;\n    function dualTravel(newChildren, oldChildren) {\n      if (newChildren.length === 0 && oldChildren.length === 0) {\n        return;\n      }\n      new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(zrUtil.curry(processNode, null)).execute();\n      function getKey(node) {\n        return node.getId();\n      }\n      function processNode(newIdx, oldIdx) {\n        var newNode = newIdx == null ? null : newChildren[newIdx];\n        var oldNode = oldIdx == null ? null : oldChildren[oldIdx];\n        doRenderNode(newNode, oldNode);\n      }\n    }\n    function doRenderNode(newNode, oldNode) {\n      if (!renderLabelForZeroData && newNode && !newNode.getValue()) {\n        // Not render data with value 0\n        newNode = null;\n      }\n      if (newNode !== virtualRoot && oldNode !== virtualRoot) {\n        if (oldNode && oldNode.piece) {\n          if (newNode) {\n            // Update\n            oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api);\n            // For tooltip\n            data.setItemGraphicEl(newNode.dataIndex, oldNode.piece);\n          } else {\n            // Remove\n            removeNode(oldNode);\n          }\n        } else if (newNode) {\n          // Add\n          var piece = new SunburstPiece(newNode, seriesModel, ecModel, api);\n          group.add(piece);\n          // For tooltip\n          data.setItemGraphicEl(newNode.dataIndex, piece);\n        }\n      }\n    }\n    function removeNode(node) {\n      if (!node) {\n        return;\n      }\n      if (node.piece) {\n        group.remove(node.piece);\n        node.piece = null;\n      }\n    }\n    function renderRollUp(virtualRoot, viewRoot) {\n      if (viewRoot.depth > 0) {\n        // Render\n        if (self.virtualPiece) {\n          // Update\n          self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api);\n        } else {\n          // Add\n          self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api);\n          group.add(self.virtualPiece);\n        }\n        // TODO event scope\n        viewRoot.piece.off('click');\n        self.virtualPiece.on('click', function (e) {\n          self._rootToNode(viewRoot.parentNode);\n        });\n      } else if (self.virtualPiece) {\n        // Remove\n        group.remove(self.virtualPiece);\n        self.virtualPiece = null;\n      }\n    }\n  };\n  /**\n   * @private\n   */\n  SunburstView.prototype._initEvents = function () {\n    var _this = this;\n    this.group.off('click');\n    this.group.on('click', function (e) {\n      var targetFound = false;\n      var viewRoot = _this.seriesModel.getViewRoot();\n      viewRoot.eachNode(function (node) {\n        if (!targetFound && node.piece && node.piece === e.target) {\n          var nodeClick = node.getModel().get('nodeClick');\n          if (nodeClick === 'rootToNode') {\n            _this._rootToNode(node);\n          } else if (nodeClick === 'link') {\n            var itemModel = node.getModel();\n            var link = itemModel.get('link');\n            if (link) {\n              var linkTarget = itemModel.get('target', true) || '_blank';\n              windowOpen(link, linkTarget);\n            }\n          }\n          targetFound = true;\n        }\n      });\n    });\n  };\n  /**\n   * @private\n   */\n  SunburstView.prototype._rootToNode = function (node) {\n    if (node !== this.seriesModel.getViewRoot()) {\n      this.api.dispatchAction({\n        type: ROOT_TO_NODE_ACTION,\n        from: this.uid,\n        seriesId: this.seriesModel.id,\n        targetNode: node\n      });\n    }\n  };\n  /**\n   * @implement\n   */\n  SunburstView.prototype.containPoint = function (point, seriesModel) {\n    var treeRoot = seriesModel.getData();\n    var itemLayout = treeRoot.getItemLayout(0);\n    if (itemLayout) {\n      var dx = point[0] - itemLayout.cx;\n      var dy = point[1] - itemLayout.cy;\n      var radius = Math.sqrt(dx * dx + dy * dy);\n      return radius <= itemLayout.r && radius >= itemLayout.r0;\n    }\n  };\n  SunburstView.type = 'sunburst';\n  return SunburstView;\n}(ChartView);\nexport default SunburstView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport SeriesModel from '../../model/Series.js';\nimport Tree from '../../data/Tree.js';\nimport { wrapTreePathInfo } from '../helper/treeHelper.js';\nimport Model from '../../model/Model.js';\nimport enableAriaDecalForTree from '../helper/enableAriaDecalForTree.js';\nvar SunburstSeriesModel = /** @class */function (_super) {\n  __extends(SunburstSeriesModel, _super);\n  function SunburstSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SunburstSeriesModel.type;\n    _this.ignoreStyleOnData = true;\n    return _this;\n  }\n  SunburstSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    // Create a virtual root.\n    var root = {\n      name: option.name,\n      children: option.data\n    };\n    completeTreeValue(root);\n    var levelModels = this._levelModels = zrUtil.map(option.levels || [], function (levelDefine) {\n      return new Model(levelDefine, this, ecModel);\n    }, this);\n    // Make sure always a new tree is created when setOption,\n    // in TreemapView, we check whether oldTree === newTree\n    // to choose mappings approach among old shapes and new shapes.\n    var tree = Tree.createTree(root, this, beforeLink);\n    function beforeLink(nodeData) {\n      nodeData.wrapMethod('getItemModel', function (model, idx) {\n        var node = tree.getNodeByDataIndex(idx);\n        var levelModel = levelModels[node.depth];\n        levelModel && (model.parentModel = levelModel);\n        return model;\n      });\n    }\n    return tree.data;\n  };\n  SunburstSeriesModel.prototype.optionUpdated = function () {\n    this.resetViewRoot();\n  };\n  /*\n   * @override\n   */\n  SunburstSeriesModel.prototype.getDataParams = function (dataIndex) {\n    var params = _super.prototype.getDataParams.apply(this, arguments);\n    var node = this.getData().tree.getNodeByDataIndex(dataIndex);\n    params.treePathInfo = wrapTreePathInfo(node, this);\n    return params;\n  };\n  SunburstSeriesModel.prototype.getLevelModel = function (node) {\n    return this._levelModels && this._levelModels[node.depth];\n  };\n  SunburstSeriesModel.prototype.getViewRoot = function () {\n    return this._viewRoot;\n  };\n  SunburstSeriesModel.prototype.resetViewRoot = function (viewRoot) {\n    viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot;\n    var root = this.getRawData().tree.root;\n    if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) {\n      this._viewRoot = root;\n    }\n  };\n  SunburstSeriesModel.prototype.enableAriaDecal = function () {\n    enableAriaDecalForTree(this);\n  };\n  SunburstSeriesModel.type = 'series.sunburst';\n  SunburstSeriesModel.defaultOption = {\n    // zlevel: 0,\n    z: 2,\n    // \u9ED8\u8BA4\u5168\u5C40\u5C45\u4E2D\n    center: ['50%', '50%'],\n    radius: [0, '75%'],\n    // \u9ED8\u8BA4\u987A\u65F6\u9488\n    clockwise: true,\n    startAngle: 90,\n    // \u6700\u5C0F\u89D2\u5EA6\u6539\u4E3A0\n    minAngle: 0,\n    // If still show when all data zero.\n    stillShowZeroSum: true,\n    // 'rootToNode', 'link', or false\n    nodeClick: 'rootToNode',\n    renderLabelForZeroData: false,\n    label: {\n      // could be: 'radial', 'tangential', or 'none'\n      rotate: 'radial',\n      show: true,\n      opacity: 1,\n      // 'left' is for inner side of inside, and 'right' is for outer\n      // side for inside\n      align: 'center',\n      position: 'inside',\n      distance: 5,\n      silent: true\n    },\n    itemStyle: {\n      borderWidth: 1,\n      borderColor: 'white',\n      borderType: 'solid',\n      shadowBlur: 0,\n      shadowColor: 'rgba(0, 0, 0, 0.2)',\n      shadowOffsetX: 0,\n      shadowOffsetY: 0,\n      opacity: 1\n    },\n    emphasis: {\n      focus: 'descendant'\n    },\n    blur: {\n      itemStyle: {\n        opacity: 0.2\n      },\n      label: {\n        opacity: 0.1\n      }\n    },\n    // Animation type can be expansion, scale.\n    animationType: 'expansion',\n    animationDuration: 1000,\n    animationDurationUpdate: 500,\n    data: [],\n    /**\n     * Sort order.\n     *\n     * Valid values: 'desc', 'asc', null, or callback function.\n     * 'desc' and 'asc' for descend and ascendant order;\n     * null for not sorting;\n     * example of callback function:\n     * function(nodeA, nodeB) {\n     *     return nodeA.getValue() - nodeB.getValue();\n     * }\n     */\n    sort: 'desc'\n  };\n  return SunburstSeriesModel;\n}(SeriesModel);\nfunction completeTreeValue(dataNode) {\n  // Postorder travel tree.\n  // If value of none-leaf node is not set,\n  // calculate it by suming up the value of all children.\n  var sum = 0;\n  zrUtil.each(dataNode.children, function (child) {\n    completeTreeValue(child);\n    var childValue = child.value;\n    // TODO First value of array must be a number\n    zrUtil.isArray(childValue) && (childValue = childValue[0]);\n    sum += childValue;\n  });\n  var thisValue = dataNode.value;\n  if (zrUtil.isArray(thisValue)) {\n    thisValue = thisValue[0];\n  }\n  if (thisValue == null || isNaN(thisValue)) {\n    thisValue = sum;\n  }\n  // Value should not less than 0.\n  if (thisValue < 0) {\n    thisValue = 0;\n  }\n  zrUtil.isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue;\n}\nexport default SunburstSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { parsePercent } from '../../util/number.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\n// let PI2 = Math.PI * 2;\nvar RADIAN = Math.PI / 180;\nexport default function sunburstLayout(seriesType, ecModel, api) {\n  ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n    var center = seriesModel.get('center');\n    var radius = seriesModel.get('radius');\n    if (!zrUtil.isArray(radius)) {\n      radius = [0, radius];\n    }\n    if (!zrUtil.isArray(center)) {\n      center = [center, center];\n    }\n    var width = api.getWidth();\n    var height = api.getHeight();\n    var size = Math.min(width, height);\n    var cx = parsePercent(center[0], width);\n    var cy = parsePercent(center[1], height);\n    var r0 = parsePercent(radius[0], size / 2);\n    var r = parsePercent(radius[1], size / 2);\n    var startAngle = -seriesModel.get('startAngle') * RADIAN;\n    var minAngle = seriesModel.get('minAngle') * RADIAN;\n    var virtualRoot = seriesModel.getData().tree.root;\n    var treeRoot = seriesModel.getViewRoot();\n    var rootDepth = treeRoot.depth;\n    var sort = seriesModel.get('sort');\n    if (sort != null) {\n      initChildren(treeRoot, sort);\n    }\n    var validDataCount = 0;\n    zrUtil.each(treeRoot.children, function (child) {\n      !isNaN(child.getValue()) && validDataCount++;\n    });\n    var sum = treeRoot.getValue();\n    // Sum may be 0\n    var unitRadian = Math.PI / (sum || validDataCount) * 2;\n    var renderRollupNode = treeRoot.depth > 0;\n    var levels = treeRoot.height - (renderRollupNode ? -1 : 1);\n    var rPerLevel = (r - r0) / (levels || 1);\n    var clockwise = seriesModel.get('clockwise');\n    var stillShowZeroSum = seriesModel.get('stillShowZeroSum');\n    // In the case some sector angle is smaller than minAngle\n    // let restAngle = PI2;\n    // let valueSumLargerThanMinAngle = 0;\n    var dir = clockwise ? 1 : -1;\n    /**\n     * Render a tree\n     * @return increased angle\n     */\n    var renderNode = function (node, startAngle) {\n      if (!node) {\n        return;\n      }\n      var endAngle = startAngle;\n      // Render self\n      if (node !== virtualRoot) {\n        // Tree node is virtual, so it doesn't need to be drawn\n        var value = node.getValue();\n        var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;\n        if (angle < minAngle) {\n          angle = minAngle;\n          // restAngle -= minAngle;\n        }\n        // else {\n        //     valueSumLargerThanMinAngle += value;\n        // }\n        endAngle = startAngle + dir * angle;\n        var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1);\n        var rStart = r0 + rPerLevel * depth;\n        var rEnd = r0 + rPerLevel * (depth + 1);\n        var levelModel = seriesModel.getLevelModel(node);\n        if (levelModel) {\n          var r0_1 = levelModel.get('r0', true);\n          var r_1 = levelModel.get('r', true);\n          var radius_1 = levelModel.get('radius', true);\n          if (radius_1 != null) {\n            r0_1 = radius_1[0];\n            r_1 = radius_1[1];\n          }\n          r0_1 != null && (rStart = parsePercent(r0_1, size / 2));\n          r_1 != null && (rEnd = parsePercent(r_1, size / 2));\n        }\n        node.setLayout({\n          angle: angle,\n          startAngle: startAngle,\n          endAngle: endAngle,\n          clockwise: clockwise,\n          cx: cx,\n          cy: cy,\n          r0: rStart,\n          r: rEnd\n        });\n      }\n      // Render children\n      if (node.children && node.children.length) {\n        // currentAngle = startAngle;\n        var siblingAngle_1 = 0;\n        zrUtil.each(node.children, function (node) {\n          siblingAngle_1 += renderNode(node, startAngle + siblingAngle_1);\n        });\n      }\n      return endAngle - startAngle;\n    };\n    // Virtual root node for roll up\n    if (renderRollupNode) {\n      var rStart = r0;\n      var rEnd = r0 + rPerLevel;\n      var angle = Math.PI * 2;\n      virtualRoot.setLayout({\n        angle: angle,\n        startAngle: startAngle,\n        endAngle: startAngle + angle,\n        clockwise: clockwise,\n        cx: cx,\n        cy: cy,\n        r0: rStart,\n        r: rEnd\n      });\n    }\n    renderNode(treeRoot, startAngle);\n  });\n}\n/**\n * Init node children by order and update visual\n */\nfunction initChildren(node, sortOrder) {\n  var children = node.children || [];\n  node.children = sort(children, sortOrder);\n  // Init children recursively\n  if (children.length) {\n    zrUtil.each(node.children, function (child) {\n      initChildren(child, sortOrder);\n    });\n  }\n}\n/**\n * Sort children nodes\n *\n * @param {TreeNode[]}               children children of node to be sorted\n * @param {string | function | null} sort sort method\n *                                   See SunburstSeries.js for details.\n */\nfunction sort(children, sortOrder) {\n  if (zrUtil.isFunction(sortOrder)) {\n    var sortTargets = zrUtil.map(children, function (child, idx) {\n      var value = child.getValue();\n      return {\n        params: {\n          depth: child.depth,\n          height: child.height,\n          dataIndex: child.dataIndex,\n          getValue: function () {\n            return value;\n          }\n        },\n        index: idx\n      };\n    });\n    sortTargets.sort(function (a, b) {\n      return sortOrder(a.params, b.params);\n    });\n    return zrUtil.map(sortTargets, function (target) {\n      return children[target.index];\n    });\n  } else {\n    var isAsc_1 = sortOrder === 'asc';\n    return children.sort(function (a, b) {\n      var diff = (a.getValue() - b.getValue()) * (isAsc_1 ? 1 : -1);\n      return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc_1 ? -1 : 1) : diff;\n    });\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { lift } from 'zrender/lib/tool/color.js';\nimport { extend, isString } from 'zrender/lib/core/util.js';\nimport tokens from '../../visual/tokens.js';\nexport default function sunburstVisual(ecModel) {\n  var paletteScope = {};\n  // Default color strategy\n  function pickColor(node, seriesModel, treeHeight) {\n    if (node.depth === 0) {\n      // Don't use palette color for the root node, because it's displayed only when drilling down.\n      return tokens.color.neutral50;\n    }\n    // Choose color from palette based on the first level.\n    var current = node;\n    while (current && current.depth > 1) {\n      current = current.parentNode;\n    }\n    var color = seriesModel.getColorFromPalette(current.name || current.dataIndex + '', paletteScope);\n    if (node.depth > 1 && isString(color)) {\n      // Lighter on the deeper level.\n      color = lift(color, (node.depth - 1) / (treeHeight - 1) * 0.5);\n    }\n    return color;\n  }\n  ecModel.eachSeriesByType('sunburst', function (seriesModel) {\n    var data = seriesModel.getData();\n    var tree = data.tree;\n    tree.eachNode(function (node) {\n      var model = node.getModel();\n      var style = model.getModel('itemStyle').getItemStyle();\n      if (!style.fill) {\n        style.fill = pickColor(node, seriesModel, tree.root.height);\n      }\n      var existsStyle = data.ensureUniqueItemVisual(node.dataIndex, 'style');\n      extend(existsStyle, style);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport SunburstView from './SunburstView.js';\nimport SunburstSeriesModel from './SunburstSeries.js';\nimport sunburstLayout from './sunburstLayout.js';\nimport sunburstVisual from './sunburstVisual.js';\nimport dataFilter from '../../processor/dataFilter.js';\nimport { curry } from 'zrender/lib/core/util.js';\nimport { installSunburstAction } from './sunburstAction.js';\nexport function install(registers) {\n  registers.registerChartView(SunburstView);\n  registers.registerSeriesModel(SunburstSeriesModel);\n  registers.registerLayout(curry(sunburstLayout, 'sunburst'));\n  registers.registerProcessor(curry(dataFilter, 'sunburst'));\n  registers.registerVisual(sunburstVisual);\n  installSunburstAction(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport createSeriesData from '../helper/createSeriesData.js';\nimport { makeInner } from '../../util/model.js';\nimport SeriesModel from '../../model/Series.js';\n// Also compat with ec4, where\n// `visual('color') visual('borderColor')` is supported.\nexport var STYLE_VISUAL_TYPE = {\n  color: 'fill',\n  borderColor: 'stroke'\n};\nexport var NON_STYLE_VISUAL_PROPS = {\n  symbol: 1,\n  symbolSize: 1,\n  symbolKeepAspect: 1,\n  legendIcon: 1,\n  visualMeta: 1,\n  liftZ: 1,\n  decal: 1\n};\n;\nexport var customInnerStore = makeInner();\nvar CustomSeriesModel = /** @class */function (_super) {\n  __extends(CustomSeriesModel, _super);\n  function CustomSeriesModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CustomSeriesModel.type;\n    return _this;\n  }\n  CustomSeriesModel.prototype.optionUpdated = function () {\n    this.currentZLevel = this.get('zlevel', true);\n    this.currentZ = this.get('z', true);\n  };\n  CustomSeriesModel.prototype.getInitialData = function (option, ecModel) {\n    return createSeriesData(null, this);\n  };\n  CustomSeriesModel.prototype.getDataParams = function (dataIndex, dataType, el) {\n    var params = _super.prototype.getDataParams.call(this, dataIndex, dataType);\n    el && (params.info = customInnerStore(el).info);\n    return params;\n  };\n  CustomSeriesModel.type = 'series.custom';\n  CustomSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar', 'matrix'];\n  CustomSeriesModel.defaultOption = {\n    coordinateSystem: 'cartesian2d',\n    // zlevel: 0,\n    z: 2,\n    legendHoverLink: true,\n    // Custom series will not clip by default.\n    // Some case will use custom series to draw label\n    // For example https://echarts.apache.org/examples/en/editor.html?c=custom-gantt-flight\n    clip: false\n    // Cartesian coordinate system\n    // xAxisIndex: 0,\n    // yAxisIndex: 0,\n    // Polar coordinate system\n    // polarIndex: 0,\n    // Geo coordinate system\n    // geoIndex: 0,\n  };\n  return CustomSeriesModel;\n}(SeriesModel);\nexport default CustomSeriesModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nfunction dataToCoordSize(dataSize, dataItem) {\n  // dataItem is necessary in log axis.\n  dataItem = dataItem || [0, 0];\n  return zrUtil.map(['x', 'y'], function (dim, dimIdx) {\n    var axis = this.getAxis(dim);\n    var val = dataItem[dimIdx];\n    var halfSize = dataSize[dimIdx] / 2;\n    return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n  }, this);\n}\nexport default function cartesianPrepareCustom(coordSys) {\n  var rect = coordSys.master.getRect();\n  return {\n    coordSys: {\n      // The name exposed to user is always 'cartesian2d' but not 'grid'.\n      type: 'cartesian2d',\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height\n    },\n    api: {\n      coord: function (data) {\n        // do not provide \"out\" param\n        return coordSys.dataToPoint(data);\n      },\n      size: zrUtil.bind(dataToCoordSize, coordSys)\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nfunction dataToCoordSize(dataSize, dataItem) {\n  dataItem = dataItem || [0, 0];\n  return zrUtil.map([0, 1], function (dimIdx) {\n    var val = dataItem[dimIdx];\n    var halfSize = dataSize[dimIdx] / 2;\n    var p1 = [];\n    var p2 = [];\n    p1[dimIdx] = val - halfSize;\n    p2[dimIdx] = val + halfSize;\n    p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];\n    return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]);\n  }, this);\n}\nexport default function geoPrepareCustom(coordSys) {\n  var rect = coordSys.getBoundingRect();\n  return {\n    coordSys: {\n      type: 'geo',\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height,\n      zoom: coordSys.getZoom()\n    },\n    api: {\n      coord: function (data) {\n        // do not provide \"out\" and noRoam param,\n        // Compatible with this usage:\n        // echarts.util.map(item.points, api.coord)\n        return coordSys.dataToPoint(data);\n      },\n      size: zrUtil.bind(dataToCoordSize, coordSys)\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { bind } from 'zrender/lib/core/util.js';\nfunction dataToCoordSize(dataSize, dataItem) {\n  // dataItem is necessary in log axis.\n  var axis = this.getAxis();\n  var val = dataItem instanceof Array ? dataItem[0] : dataItem;\n  var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2;\n  return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n}\nexport default function singlePrepareCustom(coordSys) {\n  var rect = coordSys.getRect();\n  return {\n    coordSys: {\n      type: 'singleAxis',\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height\n    },\n    api: {\n      coord: function (val) {\n        // do not provide \"out\" param\n        return coordSys.dataToPoint(val);\n      },\n      size: bind(dataToCoordSize, coordSys)\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\n// import AngleAxis from './AngleAxis.js';\nfunction dataToCoordSize(dataSize, dataItem) {\n  // dataItem is necessary in log axis.\n  dataItem = dataItem || [0, 0];\n  return zrUtil.map(['Radius', 'Angle'], function (dim, dimIdx) {\n    var getterName = 'get' + dim + 'Axis';\n    // TODO: TYPE Check Angle Axis\n    var axis = this[getterName]();\n    var val = dataItem[dimIdx];\n    var halfSize = dataSize[dimIdx] / 2;\n    var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));\n    if (dim === 'Angle') {\n      result = result * Math.PI / 180;\n    }\n    return result;\n  }, this);\n}\nexport default function polarPrepareCustom(coordSys) {\n  var radiusAxis = coordSys.getRadiusAxis();\n  var angleAxis = coordSys.getAngleAxis();\n  var radius = radiusAxis.getExtent();\n  radius[0] > radius[1] && radius.reverse();\n  return {\n    coordSys: {\n      type: 'polar',\n      cx: coordSys.cx,\n      cy: coordSys.cy,\n      r: radius[1],\n      r0: radius[0]\n    },\n    api: {\n      coord: function (data) {\n        var radius = radiusAxis.dataToRadius(data[0]);\n        var angle = angleAxis.dataToAngle(data[1]);\n        var coord = coordSys.coordToPoint([radius, angle]);\n        coord.push(radius, angle * Math.PI / 180);\n        return coord;\n      },\n      size: zrUtil.bind(dataToCoordSize, coordSys)\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport default function calendarPrepareCustom(coordSys) {\n  var rect = coordSys.getRect();\n  var rangeInfo = coordSys.getRangeInfo();\n  return {\n    coordSys: {\n      type: 'calendar',\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height,\n      cellWidth: coordSys.getCellWidth(),\n      cellHeight: coordSys.getCellHeight(),\n      rangeInfo: {\n        start: rangeInfo.start,\n        end: rangeInfo.end,\n        weeks: rangeInfo.weeks,\n        dayCount: rangeInfo.allDay\n      }\n    },\n    api: {\n      coord: function (data, clamp) {\n        return coordSys.dataToPoint(data, clamp);\n      },\n      layout: function (data, clamp) {\n        return coordSys.dataToLayout(data, clamp);\n      }\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport default function matrixPrepareCustom(coordSys) {\n  var rect = coordSys.getRect();\n  return {\n    coordSys: {\n      type: 'matrix',\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height\n    },\n    api: {\n      coord: function (data, opt) {\n        return coordSys.dataToPoint(data, opt);\n      },\n      layout: function (data, opt) {\n        return coordSys.dataToLayout(data, opt);\n      }\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, hasOwn } from 'zrender/lib/core/util.js';\nimport tokens from '../visual/tokens.js';\nvar deprecatedLogs = {};\n/**\n * Whether need to call `convertEC4CompatibleStyle`.\n */\nexport function isEC4CompatibleStyle(style, elType, hasOwnTextContentOption, hasOwnTextConfig) {\n  // Since echarts5, `RectText` is separated from its host element and style.text\n  // does not exist any more. The compat work brings some extra burden on performance.\n  // So we provide:\n  // `legacy: true` force make compat.\n  // `legacy: false`, force do not compat.\n  // `legacy` not set: auto detect whether legacy.\n  //     But in this case we do not compat (difficult to detect and rare case):\n  //     Because custom series and graphic component support \"merge\", users may firstly\n  //     only set `textStrokeWidth` style or secondly only set `text`.\n  return style && (style.legacy || style.legacy !== false && !hasOwnTextContentOption && !hasOwnTextConfig && elType !== 'tspan'\n  // Difficult to detect whether legacy for a \"text\" el.\n  && (elType === 'text' || hasOwn(style, 'text')));\n}\n/**\n * `EC4CompatibleStyle` is style that might be in echarts4 format or echarts5 format.\n * @param hostStyle The properties might be modified.\n * @return If be text el, `textContentStyle` and `textConfig` will not be returned.\n *         Otherwise a `textContentStyle` and `textConfig` will be created, whose props area\n *         retried from the `hostStyle`.\n */\nexport function convertFromEC4CompatibleStyle(hostStyle, elType, isNormal) {\n  var srcStyle = hostStyle;\n  var textConfig;\n  var textContent;\n  var textContentStyle;\n  if (elType === 'text') {\n    textContentStyle = srcStyle;\n  } else {\n    textContentStyle = {};\n    hasOwn(srcStyle, 'text') && (textContentStyle.text = srcStyle.text);\n    hasOwn(srcStyle, 'rich') && (textContentStyle.rich = srcStyle.rich);\n    hasOwn(srcStyle, 'textFill') && (textContentStyle.fill = srcStyle.textFill);\n    hasOwn(srcStyle, 'textStroke') && (textContentStyle.stroke = srcStyle.textStroke);\n    hasOwn(srcStyle, 'fontFamily') && (textContentStyle.fontFamily = srcStyle.fontFamily);\n    hasOwn(srcStyle, 'fontSize') && (textContentStyle.fontSize = srcStyle.fontSize);\n    hasOwn(srcStyle, 'fontStyle') && (textContentStyle.fontStyle = srcStyle.fontStyle);\n    hasOwn(srcStyle, 'fontWeight') && (textContentStyle.fontWeight = srcStyle.fontWeight);\n    textContent = {\n      type: 'text',\n      style: textContentStyle,\n      // ec4 does not support rectText trigger.\n      // And when text position is different in normal and emphasis\n      // => hover text trigger emphasis;\n      // => text position changed, leave mouse pointer immediately;\n      // That might cause incorrect state.\n      silent: true\n    };\n    textConfig = {};\n    var hasOwnPos = hasOwn(srcStyle, 'textPosition');\n    if (isNormal) {\n      textConfig.position = hasOwnPos ? srcStyle.textPosition : 'inside';\n    } else {\n      hasOwnPos && (textConfig.position = srcStyle.textPosition);\n    }\n    hasOwn(srcStyle, 'textPosition') && (textConfig.position = srcStyle.textPosition);\n    hasOwn(srcStyle, 'textOffset') && (textConfig.offset = srcStyle.textOffset);\n    hasOwn(srcStyle, 'textRotation') && (textConfig.rotation = srcStyle.textRotation);\n    hasOwn(srcStyle, 'textDistance') && (textConfig.distance = srcStyle.textDistance);\n  }\n  convertEC4CompatibleRichItem(textContentStyle, hostStyle);\n  each(textContentStyle.rich, function (richItem) {\n    convertEC4CompatibleRichItem(richItem, richItem);\n  });\n  return {\n    textConfig: textConfig,\n    textContent: textContent\n  };\n}\n/**\n * The result will be set to `out`.\n */\nfunction convertEC4CompatibleRichItem(out, richItem) {\n  if (!richItem) {\n    return;\n  }\n  // (1) For simplicity, make textXXX properties (deprecated since ec5) has\n  // higher priority. For example, consider in ec4 `borderColor: 5, textBorderColor: 10`\n  // on a rect means `borderColor: 4` on the rect and `borderColor: 10` on an attached\n  // richText in ec5.\n  // (2) `out === richItem` if and only if `out` is text el or rich item.\n  // So we can overwrite existing props in `out` since textXXX has higher priority.\n  richItem.font = richItem.textFont || richItem.font;\n  hasOwn(richItem, 'textStrokeWidth') && (out.lineWidth = richItem.textStrokeWidth);\n  hasOwn(richItem, 'textAlign') && (out.align = richItem.textAlign);\n  hasOwn(richItem, 'textVerticalAlign') && (out.verticalAlign = richItem.textVerticalAlign);\n  hasOwn(richItem, 'textLineHeight') && (out.lineHeight = richItem.textLineHeight);\n  hasOwn(richItem, 'textWidth') && (out.width = richItem.textWidth);\n  hasOwn(richItem, 'textHeight') && (out.height = richItem.textHeight);\n  hasOwn(richItem, 'textBackgroundColor') && (out.backgroundColor = richItem.textBackgroundColor);\n  hasOwn(richItem, 'textPadding') && (out.padding = richItem.textPadding);\n  hasOwn(richItem, 'textBorderColor') && (out.borderColor = richItem.textBorderColor);\n  hasOwn(richItem, 'textBorderWidth') && (out.borderWidth = richItem.textBorderWidth);\n  hasOwn(richItem, 'textBorderRadius') && (out.borderRadius = richItem.textBorderRadius);\n  hasOwn(richItem, 'textBoxShadowColor') && (out.shadowColor = richItem.textBoxShadowColor);\n  hasOwn(richItem, 'textBoxShadowBlur') && (out.shadowBlur = richItem.textBoxShadowBlur);\n  hasOwn(richItem, 'textBoxShadowOffsetX') && (out.shadowOffsetX = richItem.textBoxShadowOffsetX);\n  hasOwn(richItem, 'textBoxShadowOffsetY') && (out.shadowOffsetY = richItem.textBoxShadowOffsetY);\n}\n/**\n * Convert to pure echarts4 format style.\n * `itemStyle` will be modified, added with ec4 style properties from\n * `textStyle` and `textConfig`.\n *\n * [Caveat]: For simplicity, `insideRollback` in ec4 does not compat, where\n * `styleEmphasis: {textFill: 'red'}` will remove the normal auto added stroke.\n */\nexport function convertToEC4StyleForCustomSerise(itemStl, txStl, txCfg) {\n  var out = itemStl;\n  // See `custom.ts`, a trick to set extra `textPosition` firstly.\n  out.textPosition = out.textPosition || txCfg.position || 'inside';\n  txCfg.offset != null && (out.textOffset = txCfg.offset);\n  txCfg.rotation != null && (out.textRotation = txCfg.rotation);\n  txCfg.distance != null && (out.textDistance = txCfg.distance);\n  var isInside = out.textPosition.indexOf('inside') >= 0;\n  var hostFill = itemStl.fill || tokens.color.neutral99;\n  convertToEC4RichItem(out, txStl);\n  var textFillNotSet = out.textFill == null;\n  if (isInside) {\n    if (textFillNotSet) {\n      out.textFill = txCfg.insideFill || tokens.color.neutral00;\n      !out.textStroke && txCfg.insideStroke && (out.textStroke = txCfg.insideStroke);\n      !out.textStroke && (out.textStroke = hostFill);\n      out.textStrokeWidth == null && (out.textStrokeWidth = 2);\n    }\n  } else {\n    if (textFillNotSet) {\n      out.textFill = itemStl.fill || txCfg.outsideFill || tokens.color.neutral00;\n    }\n    !out.textStroke && txCfg.outsideStroke && (out.textStroke = txCfg.outsideStroke);\n  }\n  out.text = txStl.text;\n  out.rich = txStl.rich;\n  each(txStl.rich, function (richItem) {\n    convertToEC4RichItem(richItem, richItem);\n  });\n  return out;\n}\nfunction convertToEC4RichItem(out, richItem) {\n  if (!richItem) {\n    return;\n  }\n  hasOwn(richItem, 'fill') && (out.textFill = richItem.fill);\n  hasOwn(richItem, 'stroke') && (out.textStroke = richItem.fill);\n  hasOwn(richItem, 'lineWidth') && (out.textStrokeWidth = richItem.lineWidth);\n  hasOwn(richItem, 'font') && (out.font = richItem.font);\n  hasOwn(richItem, 'fontStyle') && (out.fontStyle = richItem.fontStyle);\n  hasOwn(richItem, 'fontWeight') && (out.fontWeight = richItem.fontWeight);\n  hasOwn(richItem, 'fontSize') && (out.fontSize = richItem.fontSize);\n  hasOwn(richItem, 'fontFamily') && (out.fontFamily = richItem.fontFamily);\n  hasOwn(richItem, 'align') && (out.textAlign = richItem.align);\n  hasOwn(richItem, 'verticalAlign') && (out.textVerticalAlign = richItem.verticalAlign);\n  hasOwn(richItem, 'lineHeight') && (out.textLineHeight = richItem.lineHeight);\n  hasOwn(richItem, 'width') && (out.textWidth = richItem.width);\n  hasOwn(richItem, 'height') && (out.textHeight = richItem.height);\n  hasOwn(richItem, 'backgroundColor') && (out.textBackgroundColor = richItem.backgroundColor);\n  hasOwn(richItem, 'padding') && (out.textPadding = richItem.padding);\n  hasOwn(richItem, 'borderColor') && (out.textBorderColor = richItem.borderColor);\n  hasOwn(richItem, 'borderWidth') && (out.textBorderWidth = richItem.borderWidth);\n  hasOwn(richItem, 'borderRadius') && (out.textBorderRadius = richItem.borderRadius);\n  hasOwn(richItem, 'shadowColor') && (out.textBoxShadowColor = richItem.shadowColor);\n  hasOwn(richItem, 'shadowBlur') && (out.textBoxShadowBlur = richItem.shadowBlur);\n  hasOwn(richItem, 'shadowOffsetX') && (out.textBoxShadowOffsetX = richItem.shadowOffsetX);\n  hasOwn(richItem, 'shadowOffsetY') && (out.textBoxShadowOffsetY = richItem.shadowOffsetY);\n  hasOwn(richItem, 'textShadowColor') && (out.textShadowColor = richItem.textShadowColor);\n  hasOwn(richItem, 'textShadowBlur') && (out.textShadowBlur = richItem.textShadowBlur);\n  hasOwn(richItem, 'textShadowOffsetX') && (out.textShadowOffsetX = richItem.textShadowOffsetX);\n  hasOwn(richItem, 'textShadowOffsetY') && (out.textShadowOffsetY = richItem.textShadowOffsetY);\n}\nexport function warnDeprecated(deprecated, insteadApproach) {\n  if (process.env.NODE_ENV !== 'production') {\n    var key = deprecated + '^_^' + insteadApproach;\n    if (!deprecatedLogs[key]) {\n      console.warn(\"[ECharts] DEPRECATED: \\\"\" + deprecated + \"\\\" has been deprecated. \" + insteadApproach);\n      deprecatedLogs[key] = true;\n    }\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner, normalizeToArray } from '../util/model.js';\nimport { assert, bind, each, eqNaN, extend, hasOwn, indexOf, isArrayLike, keys, reduce } from 'zrender/lib/core/util.js';\nimport { cloneValue } from 'zrender/lib/animation/Animator.js';\nimport Displayable from 'zrender/lib/graphic/Displayable.js';\nimport { getAnimationConfig } from './basicTransition.js';\nimport { Path } from '../util/graphic.js';\nimport { warn } from '../util/log.js';\nimport { TRANSFORMABLE_PROPS } from 'zrender/lib/core/Transformable.js';\nvar LEGACY_TRANSFORM_PROPS_MAP = {\n  position: ['x', 'y'],\n  scale: ['scaleX', 'scaleY'],\n  origin: ['originX', 'originY']\n};\nvar LEGACY_TRANSFORM_PROPS = keys(LEGACY_TRANSFORM_PROPS_MAP);\nvar TRANSFORM_PROPS_MAP = reduce(TRANSFORMABLE_PROPS, function (obj, key) {\n  obj[key] = 1;\n  return obj;\n}, {});\nvar transformPropNamesStr = TRANSFORMABLE_PROPS.join(', ');\n// '' means root\nexport var ELEMENT_ANIMATABLE_PROPS = ['', 'style', 'shape', 'extra'];\n;\nvar transitionInnerStore = makeInner();\n;\nfunction getElementAnimationConfig(animationType, el, elOption, parentModel, dataIndex) {\n  var animationProp = animationType + \"Animation\";\n  var config = getAnimationConfig(animationType, parentModel, dataIndex) || {};\n  var userDuring = transitionInnerStore(el).userDuring;\n  // Only set when duration is > 0 and it's need to be animated.\n  if (config.duration > 0) {\n    // For simplicity, if during not specified, the previous during will not work any more.\n    config.during = userDuring ? bind(duringCall, {\n      el: el,\n      userDuring: userDuring\n    }) : null;\n    config.setToFinal = true;\n    config.scope = animationType;\n  }\n  extend(config, elOption[animationProp]);\n  return config;\n}\nexport function applyUpdateTransition(el, elOption, animatableModel, opts) {\n  opts = opts || {};\n  var dataIndex = opts.dataIndex,\n    isInit = opts.isInit,\n    clearStyle = opts.clearStyle;\n  var hasAnimation = animatableModel.isAnimationEnabled();\n  // Save the meta info for further morphing. Like apply on the sub morphing elements.\n  var store = transitionInnerStore(el);\n  var styleOpt = elOption.style;\n  store.userDuring = elOption.during;\n  var transFromProps = {};\n  var propsToSet = {};\n  prepareTransformAllPropsFinal(el, elOption, propsToSet);\n  if (el.type === 'compound') {\n    /**\n     * We cannot directly clone shape for compoundPath,\n     * because it makes the path to be an object instead of a Path instance,\n     * and thus missing `buildPath` method.\n     */\n    var paths = el.shape.paths;\n    var optionPaths = elOption.shape.paths;\n    for (var i = 0; i < optionPaths.length; i++) {\n      var path = optionPaths[i];\n      prepareShapeOrExtraAllPropsFinal('shape', path, paths[i]);\n    }\n  } else {\n    prepareShapeOrExtraAllPropsFinal('shape', elOption, propsToSet);\n    prepareShapeOrExtraAllPropsFinal('extra', elOption, propsToSet);\n  }\n  if (!isInit && hasAnimation) {\n    prepareTransformTransitionFrom(el, elOption, transFromProps);\n    prepareShapeOrExtraTransitionFrom('shape', el, elOption, transFromProps);\n    prepareShapeOrExtraTransitionFrom('extra', el, elOption, transFromProps);\n    prepareStyleTransitionFrom(el, elOption, styleOpt, transFromProps);\n  }\n  propsToSet.style = styleOpt;\n  applyPropsDirectly(el, propsToSet, clearStyle);\n  applyMiscProps(el, elOption);\n  if (hasAnimation) {\n    if (isInit) {\n      var enterFromProps_1 = {};\n      each(ELEMENT_ANIMATABLE_PROPS, function (propName) {\n        var prop = propName ? elOption[propName] : elOption;\n        if (prop && prop.enterFrom) {\n          if (propName) {\n            enterFromProps_1[propName] = enterFromProps_1[propName] || {};\n          }\n          extend(propName ? enterFromProps_1[propName] : enterFromProps_1, prop.enterFrom);\n        }\n      });\n      var config = getElementAnimationConfig('enter', el, elOption, animatableModel, dataIndex);\n      if (config.duration > 0) {\n        el.animateFrom(enterFromProps_1, config);\n      }\n    } else {\n      applyPropsTransition(el, elOption, dataIndex || 0, animatableModel, transFromProps);\n    }\n  }\n  // Store leave to be used in leave transition.\n  updateLeaveTo(el, elOption);\n  styleOpt ? el.dirty() : el.markRedraw();\n}\nexport function updateLeaveTo(el, elOption) {\n  // Try merge to previous set leaveTo\n  var leaveToProps = transitionInnerStore(el).leaveToProps;\n  for (var i = 0; i < ELEMENT_ANIMATABLE_PROPS.length; i++) {\n    var propName = ELEMENT_ANIMATABLE_PROPS[i];\n    var prop = propName ? elOption[propName] : elOption;\n    if (prop && prop.leaveTo) {\n      if (!leaveToProps) {\n        leaveToProps = transitionInnerStore(el).leaveToProps = {};\n      }\n      if (propName) {\n        leaveToProps[propName] = leaveToProps[propName] || {};\n      }\n      extend(propName ? leaveToProps[propName] : leaveToProps, prop.leaveTo);\n    }\n  }\n}\nexport function applyLeaveTransition(el, elOption, animatableModel, onRemove) {\n  if (el) {\n    var parent_1 = el.parent;\n    var leaveToProps = transitionInnerStore(el).leaveToProps;\n    if (leaveToProps) {\n      // TODO TODO use leave after leaveAnimation in series is introduced\n      // TODO Data index?\n      var config = getElementAnimationConfig('update', el, elOption, animatableModel, 0);\n      config.done = function () {\n        parent_1 && parent_1.remove(el);\n        onRemove && onRemove();\n      };\n      el.animateTo(leaveToProps, config);\n    } else {\n      parent_1 && parent_1.remove(el);\n      onRemove && onRemove();\n    }\n  }\n}\nexport function isTransitionAll(transition) {\n  return transition === 'all';\n}\nfunction applyPropsDirectly(el,\n// Can be null/undefined\nallPropsFinal, clearStyle) {\n  var styleOpt = allPropsFinal.style;\n  if (!el.isGroup && styleOpt) {\n    if (clearStyle) {\n      el.useStyle({});\n      // When style object changed, how to trade the existing animation?\n      // It is probably complicated and not needed to cover all the cases.\n      // But still need consider the case:\n      // (1) When using init animation on `style.opacity`, and before the animation\n      //     ended users triggers an update by mousewhel. At that time the init\n      //     animation should better be continued rather than terminated.\n      //     So after `useStyle` called, we should change the animation target manually\n      //     to continue the effect of the init animation.\n      // (2) PENDING: If the previous animation targeted at a `val1`, and currently we need\n      //     to update the value to `val2` and no animation declared, should be terminate\n      //     the previous animation or just modify the target of the animation?\n      //     Therotically That will happen not only on `style` but also on `shape` and\n      //     `transfrom` props. But we haven't handle this case at present yet.\n      // (3) PENDING: Is it proper to visit `animators` and `targetName`?\n      var animators = el.animators;\n      for (var i = 0; i < animators.length; i++) {\n        var animator = animators[i];\n        // targetName is the \"topKey\".\n        if (animator.targetName === 'style') {\n          animator.changeTarget(el.style);\n        }\n      }\n    }\n    el.setStyle(styleOpt);\n  }\n  if (allPropsFinal) {\n    // Not set style here.\n    allPropsFinal.style = null;\n    // Set el to the final state firstly.\n    allPropsFinal && el.attr(allPropsFinal);\n    allPropsFinal.style = styleOpt;\n  }\n}\nfunction applyPropsTransition(el, elOption, dataIndex, model,\n// Can be null/undefined\ntransFromProps) {\n  if (transFromProps) {\n    var config = getElementAnimationConfig('update', el, elOption, model, dataIndex);\n    if (config.duration > 0) {\n      el.animateFrom(transFromProps, config);\n    }\n  }\n}\nfunction applyMiscProps(el, elOption) {\n  // Merge by default.\n  hasOwn(elOption, 'silent') && (el.silent = elOption.silent);\n  hasOwn(elOption, 'ignore') && (el.ignore = elOption.ignore);\n  if (el instanceof Displayable) {\n    hasOwn(elOption, 'invisible') && (el.invisible = elOption.invisible);\n  }\n  if (el instanceof Path) {\n    hasOwn(elOption, 'autoBatch') && (el.autoBatch = elOption.autoBatch);\n  }\n}\n// Use it to avoid it be exposed to user.\nvar tmpDuringScope = {};\nvar transitionDuringAPI = {\n  // Usually other props do not need to be changed in animation during.\n  setTransform: function (key, val) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `setTransform`.');\n    }\n    tmpDuringScope.el[key] = val;\n    return this;\n  },\n  getTransform: function (key) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(hasOwn(TRANSFORM_PROPS_MAP, key), 'Only ' + transformPropNamesStr + ' available in `getTransform`.');\n    }\n    return tmpDuringScope.el[key];\n  },\n  setShape: function (key, val) {\n    if (process.env.NODE_ENV !== 'production') {\n      assertNotReserved(key);\n    }\n    var el = tmpDuringScope.el;\n    var shape = el.shape || (el.shape = {});\n    shape[key] = val;\n    el.dirtyShape && el.dirtyShape();\n    return this;\n  },\n  getShape: function (key) {\n    if (process.env.NODE_ENV !== 'production') {\n      assertNotReserved(key);\n    }\n    var shape = tmpDuringScope.el.shape;\n    if (shape) {\n      return shape[key];\n    }\n  },\n  setStyle: function (key, val) {\n    if (process.env.NODE_ENV !== 'production') {\n      assertNotReserved(key);\n    }\n    var el = tmpDuringScope.el;\n    var style = el.style;\n    if (style) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (eqNaN(val)) {\n          warn('style.' + key + ' must not be assigned with NaN.');\n        }\n      }\n      style[key] = val;\n      el.dirtyStyle && el.dirtyStyle();\n    }\n    return this;\n  },\n  getStyle: function (key) {\n    if (process.env.NODE_ENV !== 'production') {\n      assertNotReserved(key);\n    }\n    var style = tmpDuringScope.el.style;\n    if (style) {\n      return style[key];\n    }\n  },\n  setExtra: function (key, val) {\n    if (process.env.NODE_ENV !== 'production') {\n      assertNotReserved(key);\n    }\n    var extra = tmpDuringScope.el.extra || (tmpDuringScope.el.extra = {});\n    extra[key] = val;\n    return this;\n  },\n  getExtra: function (key) {\n    if (process.env.NODE_ENV !== 'production') {\n      assertNotReserved(key);\n    }\n    var extra = tmpDuringScope.el.extra;\n    if (extra) {\n      return extra[key];\n    }\n  }\n};\nfunction assertNotReserved(key) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (key === 'transition' || key === 'enterFrom' || key === 'leaveTo') {\n      throw new Error('key must not be \"' + key + '\"');\n    }\n  }\n}\nfunction duringCall() {\n  // Do not provide \"percent\" until some requirements come.\n  // Because consider thies case:\n  // enterFrom: {x: 100, y: 30}, transition: 'x'.\n  // And enter duration is different from update duration.\n  // Thus it might be confused about the meaning of \"percent\" in during callback.\n  var scope = this;\n  var el = scope.el;\n  if (!el) {\n    return;\n  }\n  // If el is remove from zr by reason like legend, during still need to called,\n  // because el will be added back to zr and the prop value should not be incorrect.\n  var latestUserDuring = transitionInnerStore(el).userDuring;\n  var scopeUserDuring = scope.userDuring;\n  // Ensured a during is only called once in each animation frame.\n  // If a during is called multiple times in one frame, maybe some users' calculation logic\n  // might be wrong (not sure whether this usage exists).\n  // The case of a during might be called twice can be: by default there is a animator for\n  // 'x', 'y' when init. Before the init animation finished, call `setOption` to start\n  // another animators for 'style'/'shape'/'extra'.\n  if (latestUserDuring !== scopeUserDuring) {\n    // release\n    scope.el = scope.userDuring = null;\n    return;\n  }\n  tmpDuringScope.el = el;\n  // Give no `this` to user in \"during\" calling.\n  scopeUserDuring(transitionDuringAPI);\n  // FIXME: if in future meet the case that some prop will be both modified in `during` and `state`,\n  // consider the issue that the prop might be incorrect when return to \"normal\" state.\n}\nfunction prepareShapeOrExtraTransitionFrom(mainAttr, fromEl, elOption, transFromProps) {\n  var attrOpt = elOption[mainAttr];\n  if (!attrOpt) {\n    return;\n  }\n  var elPropsInAttr = fromEl[mainAttr];\n  var transFromPropsInAttr;\n  if (elPropsInAttr) {\n    var transition = elOption.transition;\n    var attrTransition = attrOpt.transition;\n    if (attrTransition) {\n      !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {});\n      if (isTransitionAll(attrTransition)) {\n        extend(transFromPropsInAttr, elPropsInAttr);\n      } else {\n        var transitionKeys = normalizeToArray(attrTransition);\n        for (var i = 0; i < transitionKeys.length; i++) {\n          var key = transitionKeys[i];\n          var elVal = elPropsInAttr[key];\n          transFromPropsInAttr[key] = elVal;\n        }\n      }\n    } else if (isTransitionAll(transition) || indexOf(transition, mainAttr) >= 0) {\n      !transFromPropsInAttr && (transFromPropsInAttr = transFromProps[mainAttr] = {});\n      var elPropsInAttrKeys = keys(elPropsInAttr);\n      for (var i = 0; i < elPropsInAttrKeys.length; i++) {\n        var key = elPropsInAttrKeys[i];\n        var elVal = elPropsInAttr[key];\n        if (isNonStyleTransitionEnabled(attrOpt[key], elVal)) {\n          transFromPropsInAttr[key] = elVal;\n        }\n      }\n    }\n  }\n}\nfunction prepareShapeOrExtraAllPropsFinal(mainAttr, elOption, allProps) {\n  var attrOpt = elOption[mainAttr];\n  if (!attrOpt) {\n    return;\n  }\n  var allPropsInAttr = allProps[mainAttr] = {};\n  var keysInAttr = keys(attrOpt);\n  for (var i = 0; i < keysInAttr.length; i++) {\n    var key = keysInAttr[i];\n    // To avoid share one object with different element, and\n    // to avoid user modify the object inexpectedly, have to clone.\n    allPropsInAttr[key] = cloneValue(attrOpt[key]);\n  }\n}\nfunction prepareTransformTransitionFrom(el, elOption, transFromProps) {\n  var transition = elOption.transition;\n  var transitionKeys = isTransitionAll(transition) ? TRANSFORMABLE_PROPS : normalizeToArray(transition || []);\n  for (var i = 0; i < transitionKeys.length; i++) {\n    var key = transitionKeys[i];\n    if (key === 'style' || key === 'shape' || key === 'extra') {\n      continue;\n    }\n    var elVal = el[key];\n    if (process.env.NODE_ENV !== 'production') {\n      checkTransformPropRefer(key, 'el.transition');\n    }\n    // Do not clone, animator will perform that clone.\n    transFromProps[key] = elVal;\n  }\n}\nfunction prepareTransformAllPropsFinal(el, elOption, allProps) {\n  for (var i = 0; i < LEGACY_TRANSFORM_PROPS.length; i++) {\n    var legacyName = LEGACY_TRANSFORM_PROPS[i];\n    var xyName = LEGACY_TRANSFORM_PROPS_MAP[legacyName];\n    var legacyArr = elOption[legacyName];\n    if (legacyArr) {\n      allProps[xyName[0]] = legacyArr[0];\n      allProps[xyName[1]] = legacyArr[1];\n    }\n  }\n  for (var i = 0; i < TRANSFORMABLE_PROPS.length; i++) {\n    var key = TRANSFORMABLE_PROPS[i];\n    if (elOption[key] != null) {\n      allProps[key] = elOption[key];\n    }\n  }\n}\nfunction prepareStyleTransitionFrom(fromEl, elOption, styleOpt, transFromProps) {\n  if (!styleOpt) {\n    return;\n  }\n  var fromElStyle = fromEl.style;\n  var transFromStyleProps;\n  if (fromElStyle) {\n    var styleTransition = styleOpt.transition;\n    var elTransition = elOption.transition;\n    if (styleTransition && !isTransitionAll(styleTransition)) {\n      var transitionKeys = normalizeToArray(styleTransition);\n      !transFromStyleProps && (transFromStyleProps = transFromProps.style = {});\n      for (var i = 0; i < transitionKeys.length; i++) {\n        var key = transitionKeys[i];\n        var elVal = fromElStyle[key];\n        // Do not clone, see `checkNonStyleTansitionRefer`.\n        transFromStyleProps[key] = elVal;\n      }\n    } else if (fromEl.getAnimationStyleProps && (isTransitionAll(elTransition) || isTransitionAll(styleTransition) || indexOf(elTransition, 'style') >= 0)) {\n      var animationProps = fromEl.getAnimationStyleProps();\n      var animationStyleProps = animationProps ? animationProps.style : null;\n      if (animationStyleProps) {\n        !transFromStyleProps && (transFromStyleProps = transFromProps.style = {});\n        var styleKeys = keys(styleOpt);\n        for (var i = 0; i < styleKeys.length; i++) {\n          var key = styleKeys[i];\n          if (animationStyleProps[key]) {\n            var elVal = fromElStyle[key];\n            transFromStyleProps[key] = elVal;\n          }\n        }\n      }\n    }\n  }\n}\nfunction isNonStyleTransitionEnabled(optVal, elVal) {\n  // The same as `checkNonStyleTansitionRefer`.\n  return !isArrayLike(optVal) ? optVal != null && isFinite(optVal) : optVal !== elVal;\n}\nvar checkTransformPropRefer;\nif (process.env.NODE_ENV !== 'production') {\n  checkTransformPropRefer = function (key, usedIn) {\n    if (!hasOwn(TRANSFORM_PROPS_MAP, key)) {\n      warn('Prop `' + key + '` is not a permitted in `' + usedIn + '`. ' + 'Only `' + keys(TRANSFORM_PROPS_MAP).join('`, `') + '` are permitted.');\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { keys, filter, each, isArray, indexOf } from 'zrender/lib/core/util.js';\nimport { ELEMENT_ANIMATABLE_PROPS } from './customGraphicTransition.js';\nimport { getAnimationConfig } from './basicTransition.js';\nimport { warn } from '../util/log.js';\nimport { makeInner } from '../util/model.js';\nvar getStateToRestore = makeInner();\nvar KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra'];\n/**\n * Stop previous keyframe animation and restore the attributes.\n * Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set.\n */\nexport function stopPreviousKeyframeAnimationAndRestore(el) {\n  // Stop previous keyframe animation.\n  el.stopAnimation('keyframe');\n  // Restore\n  el.attr(getStateToRestore(el));\n}\nexport function applyKeyframeAnimation(el, animationOpts, animatableModel) {\n  if (!animatableModel.isAnimationEnabled() || !animationOpts) {\n    return;\n  }\n  if (isArray(animationOpts)) {\n    each(animationOpts, function (singleAnimationOpts) {\n      applyKeyframeAnimation(el, singleAnimationOpts, animatableModel);\n    });\n    return;\n  }\n  var keyframes = animationOpts.keyframes;\n  var duration = animationOpts.duration;\n  if (animatableModel && duration == null) {\n    // Default to use duration of config.\n    // NOTE: animation config from payload will be ignored because they are mainly for transitions.\n    var config = getAnimationConfig('enter', animatableModel, 0);\n    duration = config && config.duration;\n  }\n  if (!keyframes || !duration) {\n    return;\n  }\n  var stateToRestore = getStateToRestore(el);\n  each(ELEMENT_ANIMATABLE_PROPS, function (targetPropName) {\n    if (targetPropName && !el[targetPropName]) {\n      return;\n    }\n    var animator;\n    var endFrameIsSet = false;\n    // Sort keyframes by percent.\n    keyframes.sort(function (a, b) {\n      return a.percent - b.percent;\n    });\n    each(keyframes, function (kf) {\n      // Stop current animation.\n      var animators = el.animators;\n      var kfValues = targetPropName ? kf[targetPropName] : kf;\n      if (process.env.NODE_ENV !== 'production') {\n        if (kf.percent >= 1) {\n          endFrameIsSet = true;\n        }\n      }\n      if (!kfValues) {\n        return;\n      }\n      var propKeys = keys(kfValues);\n      if (!targetPropName) {\n        // PENDING performance?\n        propKeys = filter(propKeys, function (key) {\n          return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0;\n        });\n      }\n      if (!propKeys.length) {\n        return;\n      }\n      if (!animator) {\n        animator = el.animate(targetPropName, animationOpts.loop, true);\n        animator.scope = 'keyframe';\n      }\n      for (var i = 0; i < animators.length; i++) {\n        // Stop all other animation that is not keyframe.\n        if (animators[i] !== animator && animators[i].targetName === animator.targetName) {\n          animators[i].stopTracks(propKeys);\n        }\n      }\n      targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {});\n      var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore;\n      each(propKeys, function (key) {\n        // Save original value.\n        savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key];\n      });\n      animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing);\n    });\n    if (!animator) {\n      return;\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      if (!endFrameIsSet) {\n        warn('End frame with percent: 1 is missing in the keyframeAnimation.', true);\n      }\n    }\n    animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing);\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { hasOwn, assert, isString, retrieve2, retrieve3, defaults, each, indexOf, map } from 'zrender/lib/core/util.js';\nimport * as graphicUtil from '../../util/graphic.js';\nimport { setDefaultStateProxy, toggleHoverEmphasis } from '../../util/states.js';\nimport * as labelStyleHelper from '../../label/labelStyle.js';\nimport { getDefaultLabel } from '../helper/labelHelper.js';\nimport { getLayoutOnAxis } from '../../layout/barGrid.js';\nimport DataDiffer from '../../data/DataDiffer.js';\nimport ChartView from '../../view/Chart.js';\nimport { createClipPath } from '../helper/createClipPathFromCoordSys.js';\nimport prepareCartesian2d from '../../coord/cartesian/prepareCustom.js';\nimport prepareGeo from '../../coord/geo/prepareCustom.js';\nimport prepareSingleAxis from '../../coord/single/prepareCustom.js';\nimport preparePolar from '../../coord/polar/prepareCustom.js';\nimport prepareCalendar from '../../coord/calendar/prepareCustom.js';\nimport prepareMatrix from '../../coord/matrix/prepareCustom.js';\nimport Displayable from 'zrender/lib/graphic/Displayable.js';\nimport { convertToEC4StyleForCustomSerise, isEC4CompatibleStyle, convertFromEC4CompatibleStyle, warnDeprecated } from '../../util/styleCompat.js';\nimport { throwError } from '../../util/log.js';\nimport { createOrUpdatePatternFromDecal } from '../../util/decal.js';\nimport { STYLE_VISUAL_TYPE, NON_STYLE_VISUAL_PROPS, customInnerStore } from './CustomSeries.js';\nimport { applyLeaveTransition, applyUpdateTransition } from '../../animation/customGraphicTransition.js';\nimport { applyKeyframeAnimation, stopPreviousKeyframeAnimationAndRestore } from '../../animation/customGraphicKeyframeAnimation.js';\nimport { getCustomSeries } from './customSeriesRegister.js';\nimport tokens from '../../visual/tokens.js';\nvar EMPHASIS = 'emphasis';\nvar NORMAL = 'normal';\nvar BLUR = 'blur';\nvar SELECT = 'select';\nvar STATES = [NORMAL, EMPHASIS, BLUR, SELECT];\nvar PATH_ITEM_STYLE = {\n  normal: ['itemStyle'],\n  emphasis: [EMPHASIS, 'itemStyle'],\n  blur: [BLUR, 'itemStyle'],\n  select: [SELECT, 'itemStyle']\n};\nvar PATH_LABEL = {\n  normal: ['label'],\n  emphasis: [EMPHASIS, 'label'],\n  blur: [BLUR, 'label'],\n  select: [SELECT, 'label']\n};\nvar DEFAULT_TRANSITION = ['x', 'y'];\n// Use prefix to avoid index to be the same as el.name,\n// which will cause weird update animation.\nvar GROUP_DIFF_PREFIX = 'e\\0\\0';\nvar attachedTxInfoTmp = {\n  normal: {},\n  emphasis: {},\n  blur: {},\n  select: {}\n};\n/**\n * FIXME: register rather than import directly, for size.\n *\n * To reduce total package size of each coordinate systems, the modules `prepareCustom`\n * of each coordinate systems are not required by each coordinate systems directly, but\n * required by the module `custom`.\n *\n * prepareInfoForCustomSeries {Function}: optional\n *     @return {Object} {coordSys: {...}, api: {\n *         coord: function (data, clamp) {}, // return point in global.\n *         size: function (dataSize, dataItem) {} // return size of each axis in coordSys.\n *     }}\n */\nvar prepareCustoms = {\n  cartesian2d: prepareCartesian2d,\n  geo: prepareGeo,\n  single: prepareSingleAxis,\n  polar: preparePolar,\n  calendar: prepareCalendar,\n  matrix: prepareMatrix\n};\nfunction isPath(el) {\n  return el instanceof graphicUtil.Path;\n}\nfunction isDisplayable(el) {\n  return el instanceof Displayable;\n}\nfunction copyElement(sourceEl, targetEl) {\n  targetEl.copyTransform(sourceEl);\n  if (isDisplayable(targetEl) && isDisplayable(sourceEl)) {\n    targetEl.setStyle(sourceEl.style);\n    targetEl.z = sourceEl.z;\n    targetEl.z2 = sourceEl.z2;\n    targetEl.zlevel = sourceEl.zlevel;\n    targetEl.invisible = sourceEl.invisible;\n    targetEl.ignore = sourceEl.ignore;\n    if (isPath(targetEl) && isPath(sourceEl)) {\n      targetEl.setShape(sourceEl.shape);\n    }\n  }\n}\nvar CustomChartView = /** @class */function (_super) {\n  __extends(CustomChartView, _super);\n  function CustomChartView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CustomChartView.type;\n    return _this;\n  }\n  CustomChartView.prototype.render = function (customSeries, ecModel, api, payload) {\n    // Clear previously rendered progressive elements.\n    this._progressiveEls = null;\n    var oldData = this._data;\n    var data = customSeries.getData();\n    var group = this.group;\n    var renderItem = makeRenderItem(customSeries, data, ecModel, api);\n    if (!oldData) {\n      // Previous render is incremental render or first render.\n      // Needs remove the incremental rendered elements.\n      group.removeAll();\n    }\n    data.diff(oldData).add(function (newIdx) {\n      createOrUpdateItem(api, null, newIdx, renderItem(newIdx, payload), customSeries, group, data);\n    }).remove(function (oldIdx) {\n      var el = oldData.getItemGraphicEl(oldIdx);\n      el && applyLeaveTransition(el, customInnerStore(el).option, customSeries);\n    }).update(function (newIdx, oldIdx) {\n      var oldEl = oldData.getItemGraphicEl(oldIdx);\n      createOrUpdateItem(api, oldEl, newIdx, renderItem(newIdx, payload), customSeries, group, data);\n    }).execute();\n    // Do clipping\n    var clipPath = customSeries.get('clip', true) ? createClipPath(customSeries.coordinateSystem, false, customSeries) : null;\n    if (clipPath) {\n      group.setClipPath(clipPath);\n    } else {\n      group.removeClipPath();\n    }\n    this._data = data;\n  };\n  CustomChartView.prototype.incrementalPrepareRender = function (customSeries, ecModel, api) {\n    this.group.removeAll();\n    this._data = null;\n  };\n  CustomChartView.prototype.incrementalRender = function (params, customSeries, ecModel, api, payload) {\n    var data = customSeries.getData();\n    var renderItem = makeRenderItem(customSeries, data, ecModel, api);\n    var progressiveEls = this._progressiveEls = [];\n    function setIncrementalAndHoverLayer(el) {\n      if (!el.isGroup) {\n        el.incremental = true;\n        el.ensureState('emphasis').hoverLayer = true;\n      }\n    }\n    for (var idx = params.start; idx < params.end; idx++) {\n      var el = createOrUpdateItem(null, null, idx, renderItem(idx, payload), customSeries, this.group, data);\n      if (el) {\n        el.traverse(setIncrementalAndHoverLayer);\n        progressiveEls.push(el);\n      }\n    }\n  };\n  CustomChartView.prototype.eachRendered = function (cb) {\n    graphicUtil.traverseElements(this._progressiveEls || this.group, cb);\n  };\n  CustomChartView.prototype.filterForExposedEvent = function (eventType, query, targetEl, packedEvent) {\n    var elementName = query.element;\n    if (elementName == null || targetEl.name === elementName) {\n      return true;\n    }\n    // Enable to give a name on a group made by `renderItem`, and listen\n    // events that are triggered by its descendents.\n    while ((targetEl = targetEl.__hostTarget || targetEl.parent) && targetEl !== this.group) {\n      if (targetEl.name === elementName) {\n        return true;\n      }\n    }\n    return false;\n  };\n  CustomChartView.type = 'custom';\n  return CustomChartView;\n}(ChartView);\nexport default CustomChartView;\nfunction createEl(elOption) {\n  var graphicType = elOption.type;\n  var el;\n  // Those graphic elements are not shapes. They should not be\n  // overwritten by users, so do them first.\n  if (graphicType === 'path') {\n    var shape = elOption.shape;\n    // Using pathRect brings convenience to users sacle svg path.\n    var pathRect = shape.width != null && shape.height != null ? {\n      x: shape.x || 0,\n      y: shape.y || 0,\n      width: shape.width,\n      height: shape.height\n    } : null;\n    var pathData = getPathData(shape);\n    // Path is also used for icon, so layout 'center' by default.\n    el = graphicUtil.makePath(pathData, null, pathRect, shape.layout || 'center');\n    customInnerStore(el).customPathData = pathData;\n  } else if (graphicType === 'image') {\n    el = new graphicUtil.Image({});\n    customInnerStore(el).customImagePath = elOption.style.image;\n  } else if (graphicType === 'text') {\n    el = new graphicUtil.Text({});\n    // customInnerStore(el).customText = (elOption.style as TextStyleProps).text;\n  } else if (graphicType === 'group') {\n    el = new graphicUtil.Group();\n  } else if (graphicType === 'compoundPath') {\n    var shape = elOption.shape;\n    if (!shape || !shape.paths) {\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'shape.paths must be specified in compoundPath';\n      }\n      throwError(errMsg);\n    }\n    var paths = map(shape.paths, function (path) {\n      if (path.type === 'path') {\n        return graphicUtil.makePath(path.shape.pathData, path, null);\n      }\n      var Clz = graphicUtil.getShapeClass(path.type);\n      if (!Clz) {\n        var errMsg = '';\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = 'graphic type \"' + graphicType + '\" can not be found.';\n        }\n        throwError(errMsg);\n      }\n      return new Clz();\n    });\n    el = new graphicUtil.CompoundPath({\n      shape: {\n        paths: paths\n      }\n    });\n  } else {\n    var Clz = graphicUtil.getShapeClass(graphicType);\n    if (!Clz) {\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'graphic type \"' + graphicType + '\" can not be found.';\n      }\n      throwError(errMsg);\n    }\n    el = new Clz();\n  }\n  customInnerStore(el).customGraphicType = graphicType;\n  el.name = elOption.name;\n  // Compat ec4: the default z2 lift is 1. If changing the number,\n  // some cases probably be broken: hierarchy layout along z, like circle packing,\n  // where emphasis only intending to modify color/border rather than lift z2.\n  el.z2EmphasisLift = 1;\n  el.z2SelectLift = 1;\n  return el;\n}\nfunction updateElNormal(\n// Can be null/undefined\napi, el, dataIndex, elOption, attachedTxInfo, seriesModel, isInit) {\n  // Stop and restore before update any other attributes.\n  stopPreviousKeyframeAnimationAndRestore(el);\n  var txCfgOpt = attachedTxInfo && attachedTxInfo.normal.cfg;\n  if (txCfgOpt) {\n    // PENDING: whether use user object directly rather than clone?\n    // TODO:5.0 textConfig transition animation?\n    el.setTextConfig(txCfgOpt);\n  }\n  // Default transition ['x', 'y']\n  if (elOption && elOption.transition == null) {\n    elOption.transition = DEFAULT_TRANSITION;\n  }\n  // Do some normalization on style.\n  var styleOpt = elOption && elOption.style;\n  if (styleOpt) {\n    if (el.type === 'text') {\n      var textOptionStyle = styleOpt;\n      // Compatible with ec4: if `textFill` or `textStroke` exists use them.\n      hasOwn(textOptionStyle, 'textFill') && (textOptionStyle.fill = textOptionStyle.textFill);\n      hasOwn(textOptionStyle, 'textStroke') && (textOptionStyle.stroke = textOptionStyle.textStroke);\n    }\n    var decalPattern = void 0;\n    var decalObj = isPath(el) ? styleOpt.decal : null;\n    if (api && decalObj) {\n      decalObj.dirty = true;\n      decalPattern = createOrUpdatePatternFromDecal(decalObj, api);\n    }\n    // Always overwrite in case user specify this prop.\n    styleOpt.__decalPattern = decalPattern;\n  }\n  if (isDisplayable(el)) {\n    if (styleOpt) {\n      var decalPattern = styleOpt.__decalPattern;\n      if (decalPattern) {\n        styleOpt.decal = decalPattern;\n      }\n    }\n  }\n  applyUpdateTransition(el, elOption, seriesModel, {\n    dataIndex: dataIndex,\n    isInit: isInit,\n    clearStyle: true\n  });\n  applyKeyframeAnimation(el, elOption.keyframeAnimation, seriesModel);\n}\nfunction updateElOnState(state, el, elStateOpt, styleOpt, attachedTxInfo) {\n  var elDisplayable = el.isGroup ? null : el;\n  var txCfgOpt = attachedTxInfo && attachedTxInfo[state].cfg;\n  // PENDING:5.0 support customize scale change and transition animation?\n  if (elDisplayable) {\n    // By default support auto lift color when hover whether `emphasis` specified.\n    var stateObj = elDisplayable.ensureState(state);\n    if (styleOpt === false) {\n      var existingEmphasisState = elDisplayable.getState(state);\n      if (existingEmphasisState) {\n        existingEmphasisState.style = null;\n      }\n    } else {\n      // style is needed to enable default emphasis.\n      stateObj.style = styleOpt || null;\n    }\n    // If `elOption.styleEmphasis` or `elOption.emphasis.style` is `false`,\n    // remove hover style.\n    // If `elOption.textConfig` or `elOption.emphasis.textConfig` is null/undefined, it does not\n    // make sense. So for simplicity, we do not ditinguish `hasOwnProperty` and null/undefined.\n    if (txCfgOpt) {\n      stateObj.textConfig = txCfgOpt;\n    }\n    setDefaultStateProxy(elDisplayable);\n  }\n}\nfunction updateZ(el, elOption, seriesModel) {\n  // Group not support textContent and not support z yet.\n  if (el.isGroup) {\n    return;\n  }\n  var elDisplayable = el;\n  var currentZ = seriesModel.currentZ;\n  var currentZLevel = seriesModel.currentZLevel;\n  // Always erase.\n  elDisplayable.z = currentZ;\n  elDisplayable.zlevel = currentZLevel;\n  // z2 must not be null/undefined, otherwise sort error may occur.\n  var optZ2 = elOption.z2;\n  optZ2 != null && (elDisplayable.z2 = optZ2 || 0);\n  for (var i = 0; i < STATES.length; i++) {\n    updateZForEachState(elDisplayable, elOption, STATES[i]);\n  }\n}\nfunction updateZForEachState(elDisplayable, elOption, state) {\n  var isNormal = state === NORMAL;\n  var elStateOpt = isNormal ? elOption : retrieveStateOption(elOption, state);\n  var optZ2 = elStateOpt ? elStateOpt.z2 : null;\n  var stateObj;\n  if (optZ2 != null) {\n    // Do not `ensureState` until required.\n    stateObj = isNormal ? elDisplayable : elDisplayable.ensureState(state);\n    stateObj.z2 = optZ2 || 0;\n  }\n}\nfunction makeRenderItem(customSeries, data, ecModel, api) {\n  var renderItem = customSeries.get('renderItem');\n  if (typeof renderItem === 'string') {\n    // Find renderItem in registered custom series\n    var registeredRenderItem = getCustomSeries(renderItem);\n    if (registeredRenderItem) {\n      renderItem = registeredRenderItem;\n    } else if (process.env.NODE_ENV !== 'production') {\n      console.warn(\"Custom series renderItem '\" + renderItem + \"' not found.\\n                Call 'echarts.registerCustomSeries' to register it.\");\n    }\n  }\n  var coordSys = customSeries.coordinateSystem;\n  var prepareResult = {};\n  if (coordSys) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(renderItem, 'series.render is required.');\n      assert(coordSys.prepareCustoms || prepareCustoms[coordSys.type], 'This coordSys does not support custom series.');\n    }\n    // `coordSys.prepareCustoms` is used for external coord sys like bmap.\n    prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms(coordSys) : prepareCustoms[coordSys.type](coordSys);\n  }\n  var userAPI = defaults({\n    getWidth: api.getWidth,\n    getHeight: api.getHeight,\n    getZr: api.getZr,\n    getDevicePixelRatio: api.getDevicePixelRatio,\n    value: value,\n    style: style,\n    ordinalRawValue: ordinalRawValue,\n    styleEmphasis: styleEmphasis,\n    visual: visual,\n    barLayout: barLayout,\n    currentSeriesIndices: currentSeriesIndices,\n    font: font\n  }, prepareResult.api || {});\n  var userParams = {\n    // The life cycle of context: current round of rendering.\n    // The global life cycle is probably not necessary, because\n    // user can store global status by themselves.\n    context: {},\n    seriesId: customSeries.id,\n    seriesName: customSeries.name,\n    seriesIndex: customSeries.seriesIndex,\n    coordSys: prepareResult.coordSys,\n    dataInsideLength: data.count(),\n    encode: wrapEncodeDef(customSeries.getData()),\n    itemPayload: customSeries.get('itemPayload') || {}\n  };\n  // If someday intending to refactor them to a class, should consider do not\n  // break change: currently these attribute member are encapsulated in a closure\n  // so that do not need to force user to call these method with a scope.\n  // Do not support call `api` asynchronously without dataIndexInside input.\n  var currDataIndexInside;\n  var currItemModel;\n  var currItemStyleModels = {};\n  var currLabelModels = {};\n  var seriesItemStyleModels = {};\n  var seriesLabelModels = {};\n  for (var i = 0; i < STATES.length; i++) {\n    var stateName = STATES[i];\n    seriesItemStyleModels[stateName] = customSeries.getModel(PATH_ITEM_STYLE[stateName]);\n    seriesLabelModels[stateName] = customSeries.getModel(PATH_LABEL[stateName]);\n  }\n  function getItemModel(dataIndexInside) {\n    return dataIndexInside === currDataIndexInside ? currItemModel || (currItemModel = data.getItemModel(dataIndexInside)) : data.getItemModel(dataIndexInside);\n  }\n  function getItemStyleModel(dataIndexInside, state) {\n    return !data.hasItemOption ? seriesItemStyleModels[state] : dataIndexInside === currDataIndexInside ? currItemStyleModels[state] || (currItemStyleModels[state] = getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state])) : getItemModel(dataIndexInside).getModel(PATH_ITEM_STYLE[state]);\n  }\n  function getLabelModel(dataIndexInside, state) {\n    return !data.hasItemOption ? seriesLabelModels[state] : dataIndexInside === currDataIndexInside ? currLabelModels[state] || (currLabelModels[state] = getItemModel(dataIndexInside).getModel(PATH_LABEL[state])) : getItemModel(dataIndexInside).getModel(PATH_LABEL[state]);\n  }\n  return function (dataIndexInside, payload) {\n    currDataIndexInside = dataIndexInside;\n    currItemModel = null;\n    currItemStyleModels = {};\n    currLabelModels = {};\n    return renderItem && renderItem(defaults({\n      dataIndexInside: dataIndexInside,\n      dataIndex: data.getRawIndex(dataIndexInside),\n      // Can be used for optimization when zoom or roam.\n      actionType: payload ? payload.type : null\n    }, userParams), userAPI);\n  };\n  /**\n   * @public\n   * @param dim by default 0.\n   * @param dataIndexInside by default `currDataIndexInside`.\n   */\n  function value(dim, dataIndexInside) {\n    dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n    return data.getStore().get(data.getDimensionIndex(dim || 0), dataIndexInside);\n  }\n  /**\n   * @public\n   * @param dim by default 0.\n   * @param dataIndexInside by default `currDataIndexInside`.\n   */\n  function ordinalRawValue(dim, dataIndexInside) {\n    dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n    dim = dim || 0;\n    var dimInfo = data.getDimensionInfo(dim);\n    if (!dimInfo) {\n      var dimIndex = data.getDimensionIndex(dim);\n      return dimIndex >= 0 ? data.getStore().get(dimIndex, dataIndexInside) : undefined;\n    }\n    var val = data.get(dimInfo.name, dataIndexInside);\n    var ordinalMeta = dimInfo && dimInfo.ordinalMeta;\n    return ordinalMeta ? ordinalMeta.categories[val] : val;\n  }\n  /**\n   * @deprecated The original intention of `api.style` is enable to set itemStyle\n   * like other series. But it is not necessary and not easy to give a strict definition\n   * of what it returns. And since echarts5 it needs to be make compat work. So\n   * deprecates it since echarts5.\n   *\n   * By default, `visual` is applied to style (to support visualMap).\n   * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`,\n   * it can be implemented as:\n   * `api.style({stroke: api.visual('color'), fill: null})`;\n   *\n   * [Compat]: since ec5, RectText has been separated from its hosts el.\n   * so `api.style()` will only return the style from `itemStyle` but not handle `label`\n   * any more. But `series.label` config is never published in doc.\n   * We still compat it in `api.style()`. But not encourage to use it and will still not\n   * to pulish it to doc.\n   * @public\n   * @param dataIndexInside by default `currDataIndexInside`.\n   */\n  function style(userProps, dataIndexInside) {\n    if (process.env.NODE_ENV !== 'production') {\n      warnDeprecated('api.style', 'Please write literal style directly instead.');\n    }\n    dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n    var style = data.getItemVisual(dataIndexInside, 'style');\n    var visualColor = style && style.fill;\n    var opacity = style && style.opacity;\n    var itemStyle = getItemStyleModel(dataIndexInside, NORMAL).getItemStyle();\n    visualColor != null && (itemStyle.fill = visualColor);\n    opacity != null && (itemStyle.opacity = opacity);\n    var opt = {\n      inheritColor: isString(visualColor) ? visualColor : tokens.color.neutral99\n    };\n    var labelModel = getLabelModel(dataIndexInside, NORMAL);\n    // Now that the feature of \"auto adjust text fill/stroke\" has been migrated to zrender\n    // since ec5, we should set `isAttached` as `false` here and make compat in\n    // `convertToEC4StyleForCustomSerise`.\n    var textStyle = labelStyleHelper.createTextStyle(labelModel, null, opt, false, true);\n    textStyle.text = labelModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null;\n    var textConfig = labelStyleHelper.createTextConfig(labelModel, opt, false);\n    preFetchFromExtra(userProps, itemStyle);\n    itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig);\n    userProps && applyUserPropsAfter(itemStyle, userProps);\n    itemStyle.legacy = true;\n    return itemStyle;\n  }\n  /**\n   * @deprecated The reason see `api.style()`\n   * @public\n   * @param dataIndexInside by default `currDataIndexInside`.\n   */\n  function styleEmphasis(userProps, dataIndexInside) {\n    if (process.env.NODE_ENV !== 'production') {\n      warnDeprecated('api.styleEmphasis', 'Please write literal style directly instead.');\n    }\n    dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n    var itemStyle = getItemStyleModel(dataIndexInside, EMPHASIS).getItemStyle();\n    var labelModel = getLabelModel(dataIndexInside, EMPHASIS);\n    var textStyle = labelStyleHelper.createTextStyle(labelModel, null, null, true, true);\n    textStyle.text = labelModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, EMPHASIS), customSeries.getFormattedLabel(dataIndexInside, NORMAL), getDefaultLabel(data, dataIndexInside)) : null;\n    var textConfig = labelStyleHelper.createTextConfig(labelModel, null, true);\n    preFetchFromExtra(userProps, itemStyle);\n    itemStyle = convertToEC4StyleForCustomSerise(itemStyle, textStyle, textConfig);\n    userProps && applyUserPropsAfter(itemStyle, userProps);\n    itemStyle.legacy = true;\n    return itemStyle;\n  }\n  function applyUserPropsAfter(itemStyle, extra) {\n    for (var key in extra) {\n      if (hasOwn(extra, key)) {\n        itemStyle[key] = extra[key];\n      }\n    }\n  }\n  function preFetchFromExtra(extra, itemStyle) {\n    // A trick to retrieve those props firstly, which are used to\n    // apply auto inside fill/stroke in `convertToEC4StyleForCustomSerise`.\n    // (It's not reasonable but only for a degree of compat)\n    if (extra) {\n      extra.textFill && (itemStyle.textFill = extra.textFill);\n      extra.textPosition && (itemStyle.textPosition = extra.textPosition);\n    }\n  }\n  /**\n   * @public\n   * @param dataIndexInside by default `currDataIndexInside`.\n   */\n  function visual(visualType, dataIndexInside) {\n    dataIndexInside == null && (dataIndexInside = currDataIndexInside);\n    if (hasOwn(STYLE_VISUAL_TYPE, visualType)) {\n      var style_1 = data.getItemVisual(dataIndexInside, 'style');\n      return style_1 ? style_1[STYLE_VISUAL_TYPE[visualType]] : null;\n    }\n    // Only support these visuals. Other visual might be inner tricky\n    // for performance (like `style`), do not expose to users.\n    if (hasOwn(NON_STYLE_VISUAL_PROPS, visualType)) {\n      return data.getItemVisual(dataIndexInside, visualType);\n    }\n  }\n  /**\n   * @public\n   * @return If not support, return undefined.\n   */\n  function barLayout(opt) {\n    if (coordSys.type === 'cartesian2d') {\n      var baseAxis = coordSys.getBaseAxis();\n      return getLayoutOnAxis(defaults({\n        axis: baseAxis\n      }, opt));\n    }\n  }\n  /**\n   * @public\n   */\n  function currentSeriesIndices() {\n    return ecModel.getCurrentSeriesIndices();\n  }\n  /**\n   * @public\n   * @return font string\n   */\n  function font(opt) {\n    return labelStyleHelper.getFont(opt, ecModel);\n  }\n}\nfunction wrapEncodeDef(data) {\n  var encodeDef = {};\n  each(data.dimensions, function (dimName) {\n    var dimInfo = data.getDimensionInfo(dimName);\n    if (!dimInfo.isExtraCoord) {\n      var coordDim = dimInfo.coordDim;\n      var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || [];\n      dataDims[dimInfo.coordDimIndex] = data.getDimensionIndex(dimName);\n    }\n  });\n  return encodeDef;\n}\nfunction createOrUpdateItem(api, existsEl, dataIndex, elOption, seriesModel, group, data) {\n  // [Rule]\n  // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing.\n  //     (It seems that violate the \"merge\" principle, but most of users probably intuitively\n  //     regard \"return;\" as \"show nothing element whatever\", so make a exception to meet the\n  //     most cases.)\n  // The rule or \"merge\" see [STRATEGY_MERGE].\n  // If `elOption` is `null`/`undefined`/`false` (when `renderItem` returns nothing).\n  if (!elOption) {\n    group.remove(existsEl);\n    return;\n  }\n  var el = doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group);\n  el && data.setItemGraphicEl(dataIndex, el);\n  el && toggleHoverEmphasis(el, elOption.focus, elOption.blurScope, elOption.emphasisDisabled);\n  return el;\n}\nfunction doCreateOrUpdateEl(api, existsEl, dataIndex, elOption, seriesModel, group) {\n  if (process.env.NODE_ENV !== 'production') {\n    assert(elOption, 'should not have an null/undefined element setting');\n  }\n  var toBeReplacedIdx = -1;\n  var oldEl = existsEl;\n  if (existsEl && doesElNeedRecreate(existsEl, elOption, seriesModel)\n  // || (\n  //     // PENDING: even in one-to-one mapping case, if el is marked as morph,\n  //     // do not sure whether the el will be mapped to another el with different\n  //     // hierarchy in Group tree. So always recreate el rather than reuse the el.\n  //     morphHelper && morphHelper.isOneToOneFrom(el)\n  // )\n  ) {\n    // Should keep at the original index, otherwise \"merge by index\" will be incorrect.\n    toBeReplacedIdx = indexOf(group.childrenRef(), existsEl);\n    existsEl = null;\n  }\n  var isInit = !existsEl;\n  var el = existsEl;\n  if (!el) {\n    el = createEl(elOption);\n    if (oldEl) {\n      copyElement(oldEl, el);\n    }\n  } else {\n    // FIMXE:NEXT unified clearState?\n    // If in some case the performance issue arised, consider\n    // do not clearState but update cached normal state directly.\n    el.clearStates();\n  }\n  // Need to set morph: false explictly to disable automatically morphing.\n  if (elOption.morph === false) {\n    el.disableMorphing = true;\n  } else if (el.disableMorphing) {\n    el.disableMorphing = false;\n  }\n  if (elOption.tooltipDisabled) {\n    el.tooltipDisabled = true;\n  }\n  attachedTxInfoTmp.normal.cfg = attachedTxInfoTmp.normal.conOpt = attachedTxInfoTmp.emphasis.cfg = attachedTxInfoTmp.emphasis.conOpt = attachedTxInfoTmp.blur.cfg = attachedTxInfoTmp.blur.conOpt = attachedTxInfoTmp.select.cfg = attachedTxInfoTmp.select.conOpt = null;\n  attachedTxInfoTmp.isLegacy = false;\n  doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfoTmp);\n  doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit);\n  updateElNormal(api, el, dataIndex, elOption, attachedTxInfoTmp, seriesModel, isInit);\n  // `elOption.info` enables user to mount some info on\n  // elements and use them in event handlers.\n  // Update them only when user specified, otherwise, remain.\n  hasOwn(elOption, 'info') && (customInnerStore(el).info = elOption.info);\n  for (var i = 0; i < STATES.length; i++) {\n    var stateName = STATES[i];\n    if (stateName !== NORMAL) {\n      var otherStateOpt = retrieveStateOption(elOption, stateName);\n      var otherStyleOpt = retrieveStyleOptionOnState(elOption, otherStateOpt, stateName);\n      updateElOnState(stateName, el, otherStateOpt, otherStyleOpt, attachedTxInfoTmp);\n    }\n  }\n  updateZ(el, elOption, seriesModel);\n  if (elOption.type === 'group') {\n    mergeChildren(api, el, dataIndex, elOption, seriesModel);\n  }\n  if (toBeReplacedIdx >= 0) {\n    group.replaceAt(el, toBeReplacedIdx);\n  } else {\n    group.add(el);\n  }\n  return el;\n}\n// `el` must not be null/undefined.\nfunction doesElNeedRecreate(el, elOption, seriesModel) {\n  var elInner = customInnerStore(el);\n  var elOptionType = elOption.type;\n  var elOptionShape = elOption.shape;\n  var elOptionStyle = elOption.style;\n  return (\n    // Always create new if universal transition is enabled.\n    // Because we do transition after render. It needs to know what old element is. Replacement will loose it.\n    seriesModel.isUniversalTransitionEnabled()\n    // If `elOptionType` is `null`, follow the merge principle.\n    || elOptionType != null && elOptionType !== elInner.customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== elInner.customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== elInner.customImagePath\n    // // FIXME test and remove this restriction?\n    // || (elOptionType === 'text'\n    //     && hasOwn(elOptionStyle, 'text')\n    //     && (elOptionStyle as TextStyleProps).text !== elInner.customText\n    // )\n  );\n}\nfunction doCreateOrUpdateClipPath(el, dataIndex, elOption, seriesModel, isInit) {\n  // Based on the \"merge\" principle, if no clipPath provided,\n  // do nothing. The exists clip will be totally removed only if\n  // `el.clipPath` is `false`. Otherwise it will be merged/replaced.\n  var clipPathOpt = elOption.clipPath;\n  if (clipPathOpt === false) {\n    if (el && el.getClipPath()) {\n      el.removeClipPath();\n    }\n  } else if (clipPathOpt) {\n    var clipPath = el.getClipPath();\n    if (clipPath && doesElNeedRecreate(clipPath, clipPathOpt, seriesModel)) {\n      clipPath = null;\n    }\n    if (!clipPath) {\n      clipPath = createEl(clipPathOpt);\n      if (process.env.NODE_ENV !== 'production') {\n        assert(isPath(clipPath), 'Only any type of `path` can be used in `clipPath`, rather than ' + clipPath.type + '.');\n      }\n      el.setClipPath(clipPath);\n    }\n    updateElNormal(null, clipPath, dataIndex, clipPathOpt, null, seriesModel, isInit);\n  }\n  // If not define `clipPath` in option, do nothing unnecessary.\n}\nfunction doCreateOrUpdateAttachedTx(el, dataIndex, elOption, seriesModel, isInit, attachedTxInfo) {\n  // Group does not support textContent temporarily until necessary.\n  if (el.isGroup || el.type === 'compoundPath') {\n    return;\n  }\n  // Normal must be called before emphasis, for `isLegacy` detection.\n  processTxInfo(elOption, null, attachedTxInfo);\n  processTxInfo(elOption, EMPHASIS, attachedTxInfo);\n  // If `elOption.textConfig` or `elOption.textContent` is null/undefined, it does not make sense.\n  // So for simplicity, if \"elOption hasOwnProperty of them but be null/undefined\", we do not\n  // trade them as set to null to el.\n  // Especially:\n  // `elOption.textContent: false` means remove textContent.\n  // `elOption.textContent.emphasis.style: false` means remove the style from emphasis state.\n  var txConOptNormal = attachedTxInfo.normal.conOpt;\n  var txConOptEmphasis = attachedTxInfo.emphasis.conOpt;\n  var txConOptBlur = attachedTxInfo.blur.conOpt;\n  var txConOptSelect = attachedTxInfo.select.conOpt;\n  if (txConOptNormal != null || txConOptEmphasis != null || txConOptSelect != null || txConOptBlur != null) {\n    var textContent = el.getTextContent();\n    if (txConOptNormal === false) {\n      textContent && el.removeTextContent();\n    } else {\n      txConOptNormal = attachedTxInfo.normal.conOpt = txConOptNormal || {\n        type: 'text'\n      };\n      if (!textContent) {\n        textContent = createEl(txConOptNormal);\n        el.setTextContent(textContent);\n      } else {\n        // If in some case the performance issue arised, consider\n        // do not clearState but update cached normal state directly.\n        textContent.clearStates();\n      }\n      updateElNormal(null, textContent, dataIndex, txConOptNormal, null, seriesModel, isInit);\n      var txConStlOptNormal = txConOptNormal && txConOptNormal.style;\n      for (var i = 0; i < STATES.length; i++) {\n        var stateName = STATES[i];\n        if (stateName !== NORMAL) {\n          var txConOptOtherState = attachedTxInfo[stateName].conOpt;\n          updateElOnState(stateName, textContent, txConOptOtherState, retrieveStyleOptionOnState(txConOptNormal, txConOptOtherState, stateName), null);\n        }\n      }\n      txConStlOptNormal ? textContent.dirty() : textContent.markRedraw();\n    }\n  }\n}\nfunction processTxInfo(elOption, state, attachedTxInfo) {\n  var stateOpt = !state ? elOption : retrieveStateOption(elOption, state);\n  var styleOpt = !state ? elOption.style : retrieveStyleOptionOnState(elOption, stateOpt, EMPHASIS);\n  var elType = elOption.type;\n  var txCfg = stateOpt ? stateOpt.textConfig : null;\n  var txConOptNormal = elOption.textContent;\n  var txConOpt = !txConOptNormal ? null : !state ? txConOptNormal : retrieveStateOption(txConOptNormal, state);\n  if (styleOpt && (\n  // Because emphasis style has little info to detect legacy,\n  // if normal is legacy, emphasis is trade as legacy.\n  attachedTxInfo.isLegacy || isEC4CompatibleStyle(styleOpt, elType, !!txCfg, !!txConOpt))) {\n    attachedTxInfo.isLegacy = true;\n    var convertResult = convertFromEC4CompatibleStyle(styleOpt, elType, !state);\n    // Explicitly specified `textConfig` and `textContent` has higher priority than\n    // the ones generated by legacy style. Otherwise if users use them and `api.style`\n    // at the same time, they not both work and hardly to known why.\n    if (!txCfg && convertResult.textConfig) {\n      txCfg = convertResult.textConfig;\n    }\n    if (!txConOpt && convertResult.textContent) {\n      txConOpt = convertResult.textContent;\n    }\n  }\n  if (!state && txConOpt) {\n    var txConOptNormal_1 = txConOpt;\n    // `textContent: {type: 'text'}`, the \"type\" is easy to be missing. So we tolerate it.\n    !txConOptNormal_1.type && (txConOptNormal_1.type = 'text');\n    if (process.env.NODE_ENV !== 'production') {\n      // Do not tolerate incorrcet type for forward compat.\n      assert(txConOptNormal_1.type === 'text', 'textContent.type must be \"text\"');\n    }\n  }\n  var info = !state ? attachedTxInfo.normal : attachedTxInfo[state];\n  info.cfg = txCfg;\n  info.conOpt = txConOpt;\n}\nfunction retrieveStateOption(elOption, state) {\n  return !state ? elOption : elOption ? elOption[state] : null;\n}\nfunction retrieveStyleOptionOnState(stateOptionNormal, stateOption, state) {\n  var style = stateOption && stateOption.style;\n  if (style == null && state === EMPHASIS && stateOptionNormal) {\n    style = stateOptionNormal.styleEmphasis;\n  }\n  return style;\n}\n// Usage:\n// (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates\n//     that the existing children will not be removed, and enables the feature\n//     that update some of the props of some of the children simply by construct\n//     the returned children of `renderItem` like:\n//     `var children = group.children = []; children[3] = {opacity: 0.5};`\n// (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children\n//     by child.name. But that might be lower performance.\n// (3) If `elOption.$mergeChildren` is `false`, the existing children will be\n//     replaced totally.\n// (4) If `!elOption.children`, following the \"merge\" principle, nothing will\n//     happen.\n// (5) If `elOption.$mergeChildren` is not `false` neither `'byName'` and the\n//     `el` is a group, and if any of the new child is null, it means to remove\n//     the element at the same index, if exists. On the other hand, if the new\n//     child is and empty object `{}`, it means to keep the element not changed.\n//\n// For implementation simpleness, do not provide a direct way to remove single\n// child (otherwise the total indices of the children array have to be modified).\n// User can remove a single child by setting its `ignore` to `true`.\nfunction mergeChildren(api, el, dataIndex, elOption, seriesModel) {\n  var newChildren = elOption.children;\n  var newLen = newChildren ? newChildren.length : 0;\n  var mergeChildren = elOption.$mergeChildren;\n  // `diffChildrenByName` has been deprecated.\n  var byName = mergeChildren === 'byName' || elOption.diffChildrenByName;\n  var notMerge = mergeChildren === false;\n  // For better performance on roam update, only enter if necessary.\n  if (!newLen && !byName && !notMerge) {\n    return;\n  }\n  if (byName) {\n    diffGroupChildren({\n      api: api,\n      oldChildren: el.children() || [],\n      newChildren: newChildren || [],\n      dataIndex: dataIndex,\n      seriesModel: seriesModel,\n      group: el\n    });\n    return;\n  }\n  notMerge && el.removeAll();\n  // Mapping children of a group simply by index, which\n  // might be better performance.\n  var index = 0;\n  for (; index < newLen; index++) {\n    var newChild = newChildren[index];\n    var oldChild = el.childAt(index);\n    if (newChild) {\n      if (newChild.ignore == null) {\n        // The old child is set to be ignored if null (see comments\n        // below). So we need to set ignore to be false back.\n        newChild.ignore = false;\n      }\n      doCreateOrUpdateEl(api, oldChild, dataIndex, newChild, seriesModel, el);\n    } else {\n      if (process.env.NODE_ENV !== 'production') {\n        assert(oldChild, 'renderItem should not return a group containing elements' + ' as null/undefined/{} if they do not exist before.');\n      }\n      // If the new element option is null, it means to remove the old\n      // element. But we cannot really remove the element from the group\n      // directly, because the element order may not be stable when this\n      // element is added back. So we set the element to be ignored.\n      oldChild.ignore = true;\n    }\n  }\n  for (var i = el.childCount() - 1; i >= index; i--) {\n    var child = el.childAt(i);\n    removeChildFromGroup(el, child, seriesModel);\n  }\n}\nfunction removeChildFromGroup(group, child, seriesModel) {\n  // Do not support leave elements that are not mentioned in the latest\n  // `renderItem` return. Otherwise users may not have a clear and simple\n  // concept that how to control all of the elements.\n  child && applyLeaveTransition(child, customInnerStore(group).option, seriesModel);\n}\nfunction diffGroupChildren(context) {\n  new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute();\n}\nfunction getKey(item, idx) {\n  var name = item && item.name;\n  return name != null ? name : GROUP_DIFF_PREFIX + idx;\n}\nfunction processAddUpdate(newIndex, oldIndex) {\n  var context = this.context;\n  var childOption = newIndex != null ? context.newChildren[newIndex] : null;\n  var child = oldIndex != null ? context.oldChildren[oldIndex] : null;\n  doCreateOrUpdateEl(context.api, child, context.dataIndex, childOption, context.seriesModel, context.group);\n}\nfunction processRemove(oldIndex) {\n  var context = this.context;\n  var child = context.oldChildren[oldIndex];\n  child && applyLeaveTransition(child, customInnerStore(child).option, context.seriesModel);\n}\n/**\n * @return SVG Path data.\n */\nfunction getPathData(shape) {\n  // \"d\" follows the SVG convention.\n  return shape && (shape.pathData || shape.d);\n}\nfunction hasOwnPathData(shape) {\n  return shape && (hasOwn(shape, 'pathData') || hasOwn(shape, 'd'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport CustomSeriesModel from './CustomSeries.js';\nimport CustomChartView from './CustomView.js';\nexport function install(registers) {\n  registers.registerChartView(CustomChartView);\n  registers.registerSeriesModel(CustomSeriesModel);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as axisPointerModelHelper from './modelHelper.js';\nimport * as eventTool from 'zrender/lib/core/event.js';\nimport * as throttleUtil from '../../util/throttle.js';\nimport { makeInner } from '../../util/model.js';\nvar inner = makeInner();\nvar clone = zrUtil.clone;\nvar bind = zrUtil.bind;\n/**\n * Base axis pointer class in 2D.\n */\nvar BaseAxisPointer = /** @class */function () {\n  function BaseAxisPointer() {\n    this._dragging = false;\n    /**\n     * In px, arbitrary value. Do not set too small,\n     * no animation is ok for most cases.\n     */\n    this.animationThreshold = 15;\n  }\n  /**\n   * @implement\n   */\n  BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) {\n    var value = axisPointerModel.get('value');\n    var status = axisPointerModel.get('status');\n    // Bind them to `this`, not in closure, otherwise they will not\n    // be replaced when user calling setOption in not merge mode.\n    this._axisModel = axisModel;\n    this._axisPointerModel = axisPointerModel;\n    this._api = api;\n    // Optimize: `render` will be called repeatedly during mouse move.\n    // So it is power consuming if performing `render` each time,\n    // especially on mobile device.\n    if (!forceRender && this._lastValue === value && this._lastStatus === status) {\n      return;\n    }\n    this._lastValue = value;\n    this._lastStatus = status;\n    var group = this._group;\n    var handle = this._handle;\n    if (!status || status === 'hide') {\n      // Do not clear here, for animation better.\n      group && group.hide();\n      handle && handle.hide();\n      return;\n    }\n    group && group.show();\n    handle && handle.show();\n    // Otherwise status is 'show'\n    var elOption = {};\n    this.makeElOption(elOption, value, axisModel, axisPointerModel, api);\n    // Enable change axis pointer type.\n    var graphicKey = elOption.graphicKey;\n    if (graphicKey !== this._lastGraphicKey) {\n      this.clear(api);\n    }\n    this._lastGraphicKey = graphicKey;\n    var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel);\n    if (!group) {\n      group = this._group = new graphic.Group();\n      this.createPointerEl(group, elOption, axisModel, axisPointerModel);\n      this.createLabelEl(group, elOption, axisModel, axisPointerModel);\n      api.getZr().add(group);\n    } else {\n      var doUpdateProps = zrUtil.curry(updateProps, axisPointerModel, moveAnimation);\n      this.updatePointerEl(group, elOption, doUpdateProps);\n      this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel);\n    }\n    updateMandatoryProps(group, axisPointerModel, true);\n    this._renderHandle(value);\n  };\n  /**\n   * @implement\n   */\n  BaseAxisPointer.prototype.remove = function (api) {\n    this.clear(api);\n  };\n  /**\n   * @implement\n   */\n  BaseAxisPointer.prototype.dispose = function (api) {\n    this.clear(api);\n  };\n  /**\n   * @protected\n   */\n  BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) {\n    var animation = axisPointerModel.get('animation');\n    var axis = axisModel.axis;\n    var isCategoryAxis = axis.type === 'category';\n    var useSnap = axisPointerModel.get('snap');\n    // Value axis without snap always do not snap.\n    if (!useSnap && !isCategoryAxis) {\n      return false;\n    }\n    if (animation === 'auto' || animation == null) {\n      var animationThreshold = this.animationThreshold;\n      if (isCategoryAxis && axis.getBandWidth() > animationThreshold) {\n        return true;\n      }\n      // It is important to auto animation when snap used. Consider if there is\n      // a dataZoom, animation will be disabled when too many points exist, while\n      // it will be enabled for better visual effect when little points exist.\n      if (useSnap) {\n        var seriesDataCount = axisPointerModelHelper.getAxisInfo(axisModel).seriesDataCount;\n        var axisExtent = axis.getExtent();\n        // Approximate band width\n        return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold;\n      }\n      return false;\n    }\n    return animation === true;\n  };\n  /**\n   * add {pointer, label, graphicKey} to elOption\n   * @protected\n   */\n  BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n    // Should be implemenented by sub-class.\n  };\n  /**\n   * @protected\n   */\n  BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) {\n    var pointerOption = elOption.pointer;\n    if (pointerOption) {\n      var pointerEl = inner(group).pointerEl = new graphic[pointerOption.type](clone(elOption.pointer));\n      group.add(pointerEl);\n    }\n  };\n  /**\n   * @protected\n   */\n  BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) {\n    if (elOption.label) {\n      var labelEl = inner(group).labelEl = new graphic.Text(clone(elOption.label));\n      group.add(labelEl);\n      updateLabelShowHide(labelEl, axisPointerModel);\n    }\n  };\n  /**\n   * @protected\n   */\n  BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) {\n    var pointerEl = inner(group).pointerEl;\n    if (pointerEl && elOption.pointer) {\n      pointerEl.setStyle(elOption.pointer.style);\n      updateProps(pointerEl, {\n        shape: elOption.pointer.shape\n      });\n    }\n  };\n  /**\n   * @protected\n   */\n  BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) {\n    var labelEl = inner(group).labelEl;\n    if (labelEl) {\n      labelEl.setStyle(elOption.label.style);\n      updateProps(labelEl, {\n        // Consider text length change in vertical axis, animation should\n        // be used on shape, otherwise the effect will be weird.\n        // TODOTODO\n        // shape: elOption.label.shape,\n        x: elOption.label.x,\n        y: elOption.label.y\n      });\n      updateLabelShowHide(labelEl, axisPointerModel);\n    }\n  };\n  /**\n   * @private\n   */\n  BaseAxisPointer.prototype._renderHandle = function (value) {\n    if (this._dragging || !this.updateHandleTransform) {\n      return;\n    }\n    var axisPointerModel = this._axisPointerModel;\n    var zr = this._api.getZr();\n    var handle = this._handle;\n    var handleModel = axisPointerModel.getModel('handle');\n    var status = axisPointerModel.get('status');\n    if (!handleModel.get('show') || !status || status === 'hide') {\n      handle && zr.remove(handle);\n      this._handle = null;\n      return;\n    }\n    var isInit;\n    if (!this._handle) {\n      isInit = true;\n      handle = this._handle = graphic.createIcon(handleModel.get('icon'), {\n        cursor: 'move',\n        draggable: true,\n        onmousemove: function (e) {\n          // For mobile device, prevent screen slider on the button.\n          eventTool.stop(e.event);\n        },\n        onmousedown: bind(this._onHandleDragMove, this, 0, 0),\n        drift: bind(this._onHandleDragMove, this),\n        ondragend: bind(this._onHandleDragEnd, this)\n      });\n      zr.add(handle);\n    }\n    updateMandatoryProps(handle, axisPointerModel, false);\n    // update style\n    handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']));\n    // update position\n    var handleSize = handleModel.get('size');\n    if (!zrUtil.isArray(handleSize)) {\n      handleSize = [handleSize, handleSize];\n    }\n    handle.scaleX = handleSize[0] / 2;\n    handle.scaleY = handleSize[1] / 2;\n    throttleUtil.createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate');\n    this._moveHandleToValue(value, isInit);\n  };\n  BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) {\n    updateProps(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel)));\n  };\n  BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) {\n    var handle = this._handle;\n    if (!handle) {\n      return;\n    }\n    this._dragging = true;\n    // Persistent for throttle.\n    var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel);\n    this._payloadInfo = trans;\n    handle.stopAnimation();\n    handle.attr(getHandleTransProps(trans));\n    inner(handle).lastProp = null;\n    this._doDispatchAxisPointer();\n  };\n  /**\n   * Throttled method.\n   */\n  BaseAxisPointer.prototype._doDispatchAxisPointer = function () {\n    var handle = this._handle;\n    if (!handle) {\n      return;\n    }\n    var payloadInfo = this._payloadInfo;\n    var axisModel = this._axisModel;\n    this._api.dispatchAction({\n      type: 'updateAxisPointer',\n      x: payloadInfo.cursorPoint[0],\n      y: payloadInfo.cursorPoint[1],\n      tooltipOption: payloadInfo.tooltipOption,\n      axesInfo: [{\n        axisDim: axisModel.axis.dim,\n        axisIndex: axisModel.componentIndex\n      }]\n    });\n  };\n  BaseAxisPointer.prototype._onHandleDragEnd = function () {\n    this._dragging = false;\n    var handle = this._handle;\n    if (!handle) {\n      return;\n    }\n    var value = this._axisPointerModel.get('value');\n    // Consider snap or categroy axis, handle may be not consistent with\n    // axisPointer. So move handle to align the exact value position when\n    // drag ended.\n    this._moveHandleToValue(value);\n    // For the effect: tooltip will be shown when finger holding on handle\n    // button, and will be hidden after finger left handle button.\n    this._api.dispatchAction({\n      type: 'hideTip'\n    });\n  };\n  /**\n   * @private\n   */\n  BaseAxisPointer.prototype.clear = function (api) {\n    this._lastValue = null;\n    this._lastStatus = null;\n    var zr = api.getZr();\n    var group = this._group;\n    var handle = this._handle;\n    if (zr && group) {\n      this._lastGraphicKey = null;\n      group && zr.remove(group);\n      handle && zr.remove(handle);\n      this._group = null;\n      this._handle = null;\n      this._payloadInfo = null;\n    }\n    throttleUtil.clear(this, '_doDispatchAxisPointer');\n  };\n  /**\n   * @protected\n   */\n  BaseAxisPointer.prototype.doClear = function () {\n    // Implemented by sub-class if necessary.\n  };\n  BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) {\n    xDimIndex = xDimIndex || 0;\n    return {\n      x: xy[xDimIndex],\n      y: xy[1 - xDimIndex],\n      width: wh[xDimIndex],\n      height: wh[1 - xDimIndex]\n    };\n  };\n  return BaseAxisPointer;\n}();\nfunction updateProps(animationModel, moveAnimation, el, props) {\n  // Animation optimize.\n  if (!propsEqual(inner(el).lastProp, props)) {\n    inner(el).lastProp = props;\n    moveAnimation ? graphic.updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props));\n  }\n}\nfunction propsEqual(lastProps, newProps) {\n  if (zrUtil.isObject(lastProps) && zrUtil.isObject(newProps)) {\n    var equals_1 = true;\n    zrUtil.each(newProps, function (item, key) {\n      equals_1 = equals_1 && propsEqual(lastProps[key], item);\n    });\n    return !!equals_1;\n  } else {\n    return lastProps === newProps;\n  }\n}\nfunction updateLabelShowHide(labelEl, axisPointerModel) {\n  labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide']();\n}\nfunction getHandleTransProps(trans) {\n  return {\n    x: trans.x || 0,\n    y: trans.y || 0,\n    rotation: trans.rotation || 0\n  };\n}\nfunction updateMandatoryProps(group, axisPointerModel, silent) {\n  var z = axisPointerModel.get('z');\n  var zlevel = axisPointerModel.get('zlevel');\n  group && group.traverse(function (el) {\n    if (el.type !== 'group') {\n      z != null && (el.z = z);\n      zlevel != null && (el.zlevel = zlevel);\n      el.silent = silent;\n    }\n  });\n}\nexport default BaseAxisPointer;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as textContain from 'zrender/lib/contain/text.js';\nimport * as formatUtil from '../../util/format.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport * as axisHelper from '../../coord/axisHelper.js';\nimport AxisBuilder from '../axis/AxisBuilder.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nexport function buildElStyle(axisPointerModel) {\n  var axisPointerType = axisPointerModel.get('type');\n  var styleModel = axisPointerModel.getModel(axisPointerType + 'Style');\n  var style;\n  if (axisPointerType === 'line') {\n    style = styleModel.getLineStyle();\n    style.fill = null;\n  } else if (axisPointerType === 'shadow') {\n    style = styleModel.getAreaStyle();\n    style.stroke = null;\n  }\n  return style;\n}\n/**\n * @param {Function} labelPos {align, verticalAlign, position}\n */\nexport function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) {\n  var value = axisPointerModel.get('value');\n  var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), {\n    precision: axisPointerModel.get(['label', 'precision']),\n    formatter: axisPointerModel.get(['label', 'formatter'])\n  });\n  var labelModel = axisPointerModel.getModel('label');\n  var paddings = formatUtil.normalizeCssArray(labelModel.get('padding') || 0);\n  var font = labelModel.getFont();\n  var textRect = textContain.getBoundingRect(text, font);\n  var position = labelPos.position;\n  var width = textRect.width + paddings[1] + paddings[3];\n  var height = textRect.height + paddings[0] + paddings[2];\n  // Adjust by align.\n  var align = labelPos.align;\n  align === 'right' && (position[0] -= width);\n  align === 'center' && (position[0] -= width / 2);\n  var verticalAlign = labelPos.verticalAlign;\n  verticalAlign === 'bottom' && (position[1] -= height);\n  verticalAlign === 'middle' && (position[1] -= height / 2);\n  // Not overflow ec container\n  confineInContainer(position, width, height, api);\n  var bgColor = labelModel.get('backgroundColor');\n  if (!bgColor || bgColor === 'auto') {\n    bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']);\n  }\n  elOption.label = {\n    // shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')},\n    x: position[0],\n    y: position[1],\n    style: createTextStyle(labelModel, {\n      text: text,\n      font: font,\n      fill: labelModel.getTextColor(),\n      padding: paddings,\n      backgroundColor: bgColor\n    }),\n    // Label should be over axisPointer.\n    z2: 10\n  };\n}\n// Do not overflow ec container\nfunction confineInContainer(position, width, height, api) {\n  var viewWidth = api.getWidth();\n  var viewHeight = api.getHeight();\n  position[0] = Math.min(position[0] + width, viewWidth) - width;\n  position[1] = Math.min(position[1] + height, viewHeight) - height;\n  position[0] = Math.max(position[0], 0);\n  position[1] = Math.max(position[1], 0);\n}\nexport function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) {\n  value = axis.scale.parse(value);\n  var text = axis.scale.getLabel({\n    value: value\n  }, {\n    // If `precision` is set, width can be fixed (like '12.00500'), which\n    // helps to debounce when when moving label.\n    precision: opt.precision\n  });\n  var formatter = opt.formatter;\n  if (formatter) {\n    var params_1 = {\n      value: axisHelper.getAxisRawValue(axis, {\n        value: value\n      }),\n      axisDimension: axis.dim,\n      axisIndex: axis.index,\n      seriesData: []\n    };\n    zrUtil.each(seriesDataIndices, function (idxItem) {\n      var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);\n      var dataIndex = idxItem.dataIndexInside;\n      var dataParams = series && series.getDataParams(dataIndex);\n      dataParams && params_1.seriesData.push(dataParams);\n    });\n    if (zrUtil.isString(formatter)) {\n      text = formatter.replace('{value}', text);\n    } else if (zrUtil.isFunction(formatter)) {\n      text = formatter(params_1);\n    }\n  }\n  return text;\n}\nexport function getTransformedPosition(axis, value, layoutInfo) {\n  var transform = matrix.create();\n  matrix.rotate(transform, transform, layoutInfo.rotation);\n  matrix.translate(transform, transform, layoutInfo.position);\n  return graphic.applyTransform([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform);\n}\nexport function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) {\n  var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection);\n  layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']);\n  buildLabelElOption(elOption, axisModel, axisPointerModel, api, {\n    position: getTransformedPosition(axisModel.axis, value, layoutInfo),\n    align: textLayout.textAlign,\n    verticalAlign: textLayout.textVerticalAlign\n  });\n}\nexport function makeLineShape(p1, p2, xDimIndex) {\n  xDimIndex = xDimIndex || 0;\n  return {\n    x1: p1[xDimIndex],\n    y1: p1[1 - xDimIndex],\n    x2: p2[xDimIndex],\n    y2: p2[1 - xDimIndex]\n  };\n}\nexport function makeRectShape(xy, wh, xDimIndex) {\n  xDimIndex = xDimIndex || 0;\n  return {\n    x: xy[xDimIndex],\n    y: xy[1 - xDimIndex],\n    width: wh[xDimIndex],\n    height: wh[1 - xDimIndex]\n  };\n}\nexport function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) {\n  return {\n    cx: cx,\n    cy: cy,\n    r0: r0,\n    r: r,\n    startAngle: startAngle,\n    endAngle: endAngle,\n    clockwise: true\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BaseAxisPointer from './BaseAxisPointer.js';\nimport * as viewHelper from './viewHelper.js';\nimport * as cartesianAxisHelper from '../../coord/cartesian/cartesianAxisHelper.js';\nvar CartesianAxisPointer = /** @class */function (_super) {\n  __extends(CartesianAxisPointer, _super);\n  function CartesianAxisPointer() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  /**\n   * @override\n   */\n  CartesianAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n    var axis = axisModel.axis;\n    var grid = axis.grid;\n    var axisPointerType = axisPointerModel.get('type');\n    var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();\n    var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true));\n    if (axisPointerType && axisPointerType !== 'none') {\n      var elStyle = viewHelper.buildElStyle(axisPointerModel);\n      var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent);\n      pointerOption.style = elStyle;\n      elOption.graphicKey = pointerOption.type;\n      elOption.pointer = pointerOption;\n    }\n    var layoutInfo = cartesianAxisHelper.layout(grid.getRect(), axisModel);\n    viewHelper.buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api);\n  };\n  /**\n   * @override\n   */\n  CartesianAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) {\n    var layoutInfo = cartesianAxisHelper.layout(axisModel.axis.grid.getRect(), axisModel, {\n      labelInside: false\n    });\n    layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']);\n    var pos = viewHelper.getTransformedPosition(axisModel.axis, value, layoutInfo);\n    return {\n      x: pos[0],\n      y: pos[1],\n      rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)\n    };\n  };\n  /**\n   * @override\n   */\n  CartesianAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) {\n    var axis = axisModel.axis;\n    var grid = axis.grid;\n    var axisExtent = axis.getGlobalExtent(true);\n    var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();\n    var dimIndex = axis.dim === 'x' ? 0 : 1;\n    var currPosition = [transform.x, transform.y];\n    currPosition[dimIndex] += delta[dimIndex];\n    currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);\n    currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);\n    var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;\n    var cursorPoint = [cursorOtherValue, cursorOtherValue];\n    cursorPoint[dimIndex] = currPosition[dimIndex];\n    // Make tooltip do not overlap axisPointer and in the middle of the grid.\n    var tooltipOptions = [{\n      verticalAlign: 'middle'\n    }, {\n      align: 'center'\n    }];\n    return {\n      x: currPosition[0],\n      y: currPosition[1],\n      rotation: transform.rotation,\n      cursorPoint: cursorPoint,\n      tooltipOption: tooltipOptions[dimIndex]\n    };\n  };\n  return CartesianAxisPointer;\n}(BaseAxisPointer);\nfunction getCartesian(grid, axis) {\n  var opt = {};\n  opt[axis.dim + 'AxisIndex'] = axis.index;\n  return grid.getCartesian(opt);\n}\nvar pointerShapeBuilder = {\n  line: function (axis, pixelValue, otherExtent) {\n    var targetShape = viewHelper.makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis));\n    return {\n      type: 'Line',\n      subPixelOptimize: true,\n      shape: targetShape\n    };\n  },\n  shadow: function (axis, pixelValue, otherExtent) {\n    var bandWidth = Math.max(1, axis.getBandWidth());\n    var span = otherExtent[1] - otherExtent[0];\n    return {\n      type: 'Rect',\n      shape: viewHelper.makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis))\n    };\n  }\n};\nfunction getAxisDimIndex(axis) {\n  return axis.dim === 'x' ? 0 : 1;\n}\nexport default CartesianAxisPointer;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar AxisPointerModel = /** @class */function (_super) {\n  __extends(AxisPointerModel, _super);\n  function AxisPointerModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = AxisPointerModel.type;\n    return _this;\n  }\n  AxisPointerModel.type = 'axisPointer';\n  AxisPointerModel.defaultOption = {\n    // 'auto' means that show when triggered by tooltip or handle.\n    show: 'auto',\n    // zlevel: 0,\n    z: 50,\n    type: 'line',\n    // axispointer triggered by tootip determine snap automatically,\n    // see `modelHelper`.\n    snap: false,\n    triggerTooltip: true,\n    triggerEmphasis: true,\n    value: null,\n    status: null,\n    link: [],\n    // Do not set 'auto' here, otherwise global animation: false\n    // will not effect at this axispointer.\n    animation: null,\n    animationDurationUpdate: 200,\n    lineStyle: {\n      color: tokens.color.border,\n      width: 1,\n      type: 'dashed'\n    },\n    shadowStyle: {\n      color: tokens.color.shadowTint\n    },\n    label: {\n      show: true,\n      formatter: null,\n      precision: 'auto',\n      margin: 3,\n      color: tokens.color.neutral00,\n      padding: [5, 7, 5, 7],\n      backgroundColor: tokens.color.accent60,\n      borderColor: null,\n      borderWidth: 0,\n      borderRadius: 3\n    },\n    handle: {\n      show: false,\n      // eslint-disable-next-line\n      icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z',\n      size: 45,\n      // handle margin is from symbol center to axis, which is stable when circular move.\n      margin: 50,\n      // color: '#1b8bbd'\n      // color: '#2f4554'\n      color: tokens.color.accent40,\n      // For mobile performance\n      throttle: 40\n    }\n  };\n  return AxisPointerModel;\n}(ComponentModel);\nexport default AxisPointerModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport env from 'zrender/lib/core/env.js';\nimport { makeInner } from '../../util/model.js';\nvar inner = makeInner();\nvar each = zrUtil.each;\n/**\n * @param {string} key\n * @param {module:echarts/ExtensionAPI} api\n * @param {Function} handler\n *      param: {string} currTrigger\n *      param: {Array.<number>} point\n */\nexport function register(key, api, handler) {\n  if (env.node) {\n    return;\n  }\n  var zr = api.getZr();\n  inner(zr).records || (inner(zr).records = {});\n  initGlobalListeners(zr, api);\n  var record = inner(zr).records[key] || (inner(zr).records[key] = {});\n  record.handler = handler;\n}\nfunction initGlobalListeners(zr, api) {\n  if (inner(zr).initialized) {\n    return;\n  }\n  inner(zr).initialized = true;\n  useHandler('click', zrUtil.curry(doEnter, 'click'));\n  useHandler('mousemove', zrUtil.curry(doEnter, 'mousemove'));\n  // useHandler('mouseout', onLeave);\n  useHandler('globalout', onLeave);\n  function useHandler(eventType, cb) {\n    zr.on(eventType, function (e) {\n      var dis = makeDispatchAction(api);\n      each(inner(zr).records, function (record) {\n        record && cb(record, e, dis.dispatchAction);\n      });\n      dispatchTooltipFinally(dis.pendings, api);\n    });\n  }\n}\nfunction dispatchTooltipFinally(pendings, api) {\n  var showLen = pendings.showTip.length;\n  var hideLen = pendings.hideTip.length;\n  var actuallyPayload;\n  if (showLen) {\n    actuallyPayload = pendings.showTip[showLen - 1];\n  } else if (hideLen) {\n    actuallyPayload = pendings.hideTip[hideLen - 1];\n  }\n  if (actuallyPayload) {\n    actuallyPayload.dispatchAction = null;\n    api.dispatchAction(actuallyPayload);\n  }\n}\nfunction onLeave(record, e, dispatchAction) {\n  record.handler('leave', null, dispatchAction);\n}\nfunction doEnter(currTrigger, record, e, dispatchAction) {\n  record.handler(currTrigger, e, dispatchAction);\n}\nfunction makeDispatchAction(api) {\n  var pendings = {\n    showTip: [],\n    hideTip: []\n  };\n  // FIXME\n  // better approach?\n  // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip,\n  // which may be conflict, (axisPointer call showTip but tooltip call hideTip);\n  // So we have to add \"final stage\" to merge those dispatched actions.\n  var dispatchAction = function (payload) {\n    var pendingList = pendings[payload.type];\n    if (pendingList) {\n      pendingList.push(payload);\n    } else {\n      payload.dispatchAction = dispatchAction;\n      api.dispatchAction(payload);\n    }\n  };\n  return {\n    dispatchAction: dispatchAction,\n    pendings: pendings\n  };\n}\nexport function unregister(key, api) {\n  if (env.node) {\n    return;\n  }\n  var zr = api.getZr();\n  var record = (inner(zr).records || {})[key];\n  if (record) {\n    inner(zr).records[key] = null;\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as globalListener from './globalListener.js';\nimport ComponentView from '../../view/Component.js';\nvar AxisPointerView = /** @class */function (_super) {\n  __extends(AxisPointerView, _super);\n  function AxisPointerView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = AxisPointerView.type;\n    return _this;\n  }\n  AxisPointerView.prototype.render = function (globalAxisPointerModel, ecModel, api) {\n    var globalTooltipModel = ecModel.getComponent('tooltip');\n    var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click';\n    // Register global listener in AxisPointerView to enable\n    // AxisPointerView to be independent to Tooltip.\n    globalListener.register('axisPointer', api, function (currTrigger, e, dispatchAction) {\n      // If 'none', it is not controlled by mouse totally.\n      if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) {\n        dispatchAction({\n          type: 'updateAxisPointer',\n          currTrigger: currTrigger,\n          x: e && e.offsetX,\n          y: e && e.offsetY\n        });\n      }\n    });\n  };\n  AxisPointerView.prototype.remove = function (ecModel, api) {\n    globalListener.unregister('axisPointer', api);\n  };\n  AxisPointerView.prototype.dispose = function (ecModel, api) {\n    globalListener.unregister('axisPointer', api);\n  };\n  AxisPointerView.type = 'axisPointer';\n  return AxisPointerView;\n}(ComponentView);\nexport default AxisPointerView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../../util/model.js';\n/**\n * @param finder contains {seriesIndex, dataIndex, dataIndexInside}\n * @param ecModel\n * @return  {point: [x, y], el: ...} point Will not be null.\n */\nexport default function findPointFromSeries(finder, ecModel) {\n  var point = [];\n  var seriesIndex = finder.seriesIndex;\n  var seriesModel;\n  if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) {\n    return {\n      point: []\n    };\n  }\n  var data = seriesModel.getData();\n  var dataIndex = modelUtil.queryDataIndex(data, finder);\n  if (dataIndex == null || dataIndex < 0 || zrUtil.isArray(dataIndex)) {\n    return {\n      point: []\n    };\n  }\n  var el = data.getItemGraphicEl(dataIndex);\n  var coordSys = seriesModel.coordinateSystem;\n  if (seriesModel.getTooltipPosition) {\n    point = seriesModel.getTooltipPosition(dataIndex) || [];\n  } else if (coordSys && coordSys.dataToPoint) {\n    if (finder.isStacked) {\n      var baseAxis = coordSys.getBaseAxis();\n      var valueAxis = coordSys.getOtherAxis(baseAxis);\n      var valueAxisDim = valueAxis.dim;\n      var baseAxisDim = baseAxis.dim;\n      var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;\n      var baseDim = data.mapDimension(baseAxisDim);\n      var stackedData = [];\n      stackedData[baseDataOffset] = data.get(baseDim, dataIndex);\n      stackedData[1 - baseDataOffset] = data.get(data.getCalculationInfo('stackResultDimension'), dataIndex);\n      point = coordSys.dataToPoint(stackedData) || [];\n    } else {\n      point = coordSys.dataToPoint(data.getValues(zrUtil.map(coordSys.dimensions, function (dim) {\n        return data.mapDimension(dim);\n      }), dataIndex)) || [];\n    }\n  } else if (el) {\n    // Use graphic bounding rect\n    var rect = el.getBoundingRect().clone();\n    rect.applyTransform(el.transform);\n    point = [rect.x + rect.width / 2, rect.y + rect.height / 2];\n  }\n  return {\n    point: point,\n    el: el\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner } from '../../util/model.js';\nimport * as modelHelper from './modelHelper.js';\nimport findPointFromSeries from './findPointFromSeries.js';\nimport { each, curry, bind, extend } from 'zrender/lib/core/util.js';\nvar inner = makeInner();\n/**\n * Basic logic: check all axis, if they do not demand show/highlight,\n * then hide/downplay them.\n *\n * @return content of event obj for echarts.connect.\n */\nexport default function axisTrigger(payload, ecModel, api) {\n  var currTrigger = payload.currTrigger;\n  var point = [payload.x, payload.y];\n  var finder = payload;\n  var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api);\n  var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;\n  // Pending\n  // See #6121. But we are not able to reproduce it yet.\n  if (!coordSysAxesInfo) {\n    return;\n  }\n  if (illegalPoint(point)) {\n    // Used in the default behavior of `connection`: use the sample seriesIndex\n    // and dataIndex. And also used in the tooltipView trigger.\n    point = findPointFromSeries({\n      seriesIndex: finder.seriesIndex,\n      // Do not use dataIndexInside from other ec instance.\n      // FIXME: auto detect it?\n      dataIndex: finder.dataIndex\n    }, ecModel).point;\n  }\n  var isIllegalPoint = illegalPoint(point);\n  // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}).\n  // Notice: In this case, it is difficult to get the `point` (which is necessary to show\n  // tooltip, so if point is not given, we just use the point found by sample seriesIndex\n  // and dataIndex.\n  var inputAxesInfo = finder.axesInfo;\n  var axesInfo = coordSysAxesInfo.axesInfo;\n  var shouldHide = currTrigger === 'leave' || illegalPoint(point);\n  var outputPayload = {};\n  var showValueMap = {};\n  var dataByCoordSys = {\n    list: [],\n    map: {}\n  };\n  var updaters = {\n    showPointer: curry(showPointer, showValueMap),\n    showTooltip: curry(showTooltip, dataByCoordSys)\n  };\n  // Process for triggered axes.\n  each(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) {\n    // If a point given, it must be contained by the coordinate system.\n    var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point);\n    each(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) {\n      var axis = axisInfo.axis;\n      var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo);\n      // If no inputAxesInfo, no axis is restricted.\n      if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) {\n        var val = inputAxisInfo && inputAxisInfo.value;\n        if (val == null && !isIllegalPoint) {\n          val = axis.pointToData(point);\n        }\n        val != null && processOnAxis(axisInfo, val, updaters, false, outputPayload);\n      }\n    });\n  });\n  // Process for linked axes.\n  var linkTriggers = {};\n  each(axesInfo, function (tarAxisInfo, tarKey) {\n    var linkGroup = tarAxisInfo.linkGroup;\n    // If axis has been triggered in the previous stage, it should not be triggered by link.\n    if (linkGroup && !showValueMap[tarKey]) {\n      each(linkGroup.axesInfo, function (srcAxisInfo, srcKey) {\n        var srcValItem = showValueMap[srcKey];\n        // If srcValItem exist, source axis is triggered, so link to target axis.\n        if (srcAxisInfo !== tarAxisInfo && srcValItem) {\n          var val = srcValItem.value;\n          linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo))));\n          linkTriggers[tarAxisInfo.key] = val;\n        }\n      });\n    }\n  });\n  each(linkTriggers, function (val, tarKey) {\n    processOnAxis(axesInfo[tarKey], val, updaters, true, outputPayload);\n  });\n  updateModelActually(showValueMap, axesInfo, outputPayload);\n  dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction);\n  dispatchHighDownActually(axesInfo, dispatchAction, api);\n  return outputPayload;\n}\nfunction processOnAxis(axisInfo, newValue, updaters, noSnap, outputFinder) {\n  var axis = axisInfo.axis;\n  if (axis.scale.isBlank() || !axis.containData(newValue)) {\n    return;\n  }\n  if (!axisInfo.involveSeries) {\n    updaters.showPointer(axisInfo, newValue);\n    return;\n  }\n  // Heavy calculation. So put it after axis.containData checking.\n  var payloadInfo = buildPayloadsBySeries(newValue, axisInfo);\n  var payloadBatch = payloadInfo.payloadBatch;\n  var snapToValue = payloadInfo.snapToValue;\n  // Fill content of event obj for echarts.connect.\n  // By default use the first involved series data as a sample to connect.\n  if (payloadBatch[0] && outputFinder.seriesIndex == null) {\n    extend(outputFinder, payloadBatch[0]);\n  }\n  // If no linkSource input, this process is for collecting link\n  // target, where snap should not be accepted.\n  if (!noSnap && axisInfo.snap) {\n    if (axis.containData(snapToValue) && snapToValue != null) {\n      newValue = snapToValue;\n    }\n  }\n  updaters.showPointer(axisInfo, newValue, payloadBatch);\n  // Tooltip should always be snapToValue, otherwise there will be\n  // incorrect \"axis value ~ series value\" mapping displayed in tooltip.\n  updaters.showTooltip(axisInfo, payloadInfo, snapToValue);\n}\nfunction buildPayloadsBySeries(value, axisInfo) {\n  var axis = axisInfo.axis;\n  var dim = axis.dim;\n  var snapToValue = value;\n  var payloadBatch = [];\n  var minDist = Number.MAX_VALUE;\n  var minDiff = -1;\n  each(axisInfo.seriesModels, function (series, idx) {\n    var dataDim = series.getData().mapDimensionsAll(dim);\n    var seriesNestestValue;\n    var dataIndices;\n    if (series.getAxisTooltipData) {\n      var result = series.getAxisTooltipData(dataDim, value, axis);\n      dataIndices = result.dataIndices;\n      seriesNestestValue = result.nestestValue;\n    } else {\n      dataIndices = series.indicesOfNearest(dim, dataDim[0], value,\n      // Add a threshold to avoid find the wrong dataIndex\n      // when data length is not same.\n      // false,\n      axis.type === 'category' ? 0.5 : null);\n      if (!dataIndices.length) {\n        return;\n      }\n      seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]);\n    }\n    if (seriesNestestValue == null || !isFinite(seriesNestestValue)) {\n      return;\n    }\n    var diff = value - seriesNestestValue;\n    var dist = Math.abs(diff);\n    // Consider category case\n    if (dist <= minDist) {\n      if (dist < minDist || diff >= 0 && minDiff < 0) {\n        minDist = dist;\n        minDiff = diff;\n        snapToValue = seriesNestestValue;\n        payloadBatch.length = 0;\n      }\n      each(dataIndices, function (dataIndex) {\n        payloadBatch.push({\n          seriesIndex: series.seriesIndex,\n          dataIndexInside: dataIndex,\n          dataIndex: series.getData().getRawIndex(dataIndex)\n        });\n      });\n    }\n  });\n  return {\n    payloadBatch: payloadBatch,\n    snapToValue: snapToValue\n  };\n}\nfunction showPointer(showValueMap, axisInfo, value, payloadBatch) {\n  showValueMap[axisInfo.key] = {\n    value: value,\n    payloadBatch: payloadBatch\n  };\n}\nfunction showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) {\n  var payloadBatch = payloadInfo.payloadBatch;\n  var axis = axisInfo.axis;\n  var axisModel = axis.model;\n  var axisPointerModel = axisInfo.axisPointerModel;\n  // If no data, do not create anything in dataByCoordSys,\n  // whose length will be used to judge whether dispatch action.\n  if (!axisInfo.triggerTooltip || !payloadBatch.length) {\n    return;\n  }\n  var coordSysModel = axisInfo.coordSys.model;\n  var coordSysKey = modelHelper.makeKey(coordSysModel);\n  var coordSysItem = dataByCoordSys.map[coordSysKey];\n  if (!coordSysItem) {\n    coordSysItem = dataByCoordSys.map[coordSysKey] = {\n      coordSysId: coordSysModel.id,\n      coordSysIndex: coordSysModel.componentIndex,\n      coordSysType: coordSysModel.type,\n      coordSysMainType: coordSysModel.mainType,\n      dataByAxis: []\n    };\n    dataByCoordSys.list.push(coordSysItem);\n  }\n  coordSysItem.dataByAxis.push({\n    axisDim: axis.dim,\n    axisIndex: axisModel.componentIndex,\n    axisType: axisModel.type,\n    axisId: axisModel.id,\n    value: value,\n    // Caustion: viewHelper.getValueLabel is actually on \"view stage\", which\n    // depends that all models have been updated. So it should not be performed\n    // here. Considering axisPointerModel used here is volatile, which is hard\n    // to be retrieve in TooltipView, we prepare parameters here.\n    valueLabelOpt: {\n      precision: axisPointerModel.get(['label', 'precision']),\n      formatter: axisPointerModel.get(['label', 'formatter'])\n    },\n    seriesDataIndices: payloadBatch.slice()\n  });\n}\nfunction updateModelActually(showValueMap, axesInfo, outputPayload) {\n  var outputAxesInfo = outputPayload.axesInfo = [];\n  // Basic logic: If no 'show' required, 'hide' this axisPointer.\n  each(axesInfo, function (axisInfo, key) {\n    var option = axisInfo.axisPointerModel.option;\n    var valItem = showValueMap[key];\n    if (valItem) {\n      !axisInfo.useHandle && (option.status = 'show');\n      option.value = valItem.value;\n      // For label formatter param and highlight.\n      option.seriesDataIndices = (valItem.payloadBatch || []).slice();\n    }\n    // When always show (e.g., handle used), remain\n    // original value and status.\n    else {\n      // If hide, value still need to be set, consider\n      // click legend to toggle axis blank.\n      !axisInfo.useHandle && (option.status = 'hide');\n    }\n    // If status is 'hide', should be no info in payload.\n    option.status === 'show' && outputAxesInfo.push({\n      axisDim: axisInfo.axis.dim,\n      axisIndex: axisInfo.axis.model.componentIndex,\n      value: option.value\n    });\n  });\n}\nfunction dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) {\n  // Basic logic: If no showTip required, hideTip will be dispatched.\n  if (illegalPoint(point) || !dataByCoordSys.list.length) {\n    dispatchAction({\n      type: 'hideTip'\n    });\n    return;\n  }\n  // In most case only one axis (or event one series is used). It is\n  // convenient to fetch payload.seriesIndex and payload.dataIndex\n  // directly. So put the first seriesIndex and dataIndex of the first\n  // axis on the payload.\n  var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {};\n  dispatchAction({\n    type: 'showTip',\n    escapeConnect: true,\n    x: point[0],\n    y: point[1],\n    tooltipOption: payload.tooltipOption,\n    position: payload.position,\n    dataIndexInside: sampleItem.dataIndexInside,\n    dataIndex: sampleItem.dataIndex,\n    seriesIndex: sampleItem.seriesIndex,\n    dataByCoordSys: dataByCoordSys.list\n  });\n}\nfunction dispatchHighDownActually(axesInfo, dispatchAction, api) {\n  // FIXME\n  // highlight status modification should be a stage of main process?\n  // (Consider confilct (e.g., legend and axisPointer) and setOption)\n  var zr = api.getZr();\n  var highDownKey = 'axisPointerLastHighlights';\n  var lastHighlights = inner(zr)[highDownKey] || {};\n  var newHighlights = inner(zr)[highDownKey] = {};\n  // Update highlight/downplay status according to axisPointer model.\n  // Build hash map and remove duplicate incidentally.\n  each(axesInfo, function (axisInfo, key) {\n    var option = axisInfo.axisPointerModel.option;\n    option.status === 'show' && axisInfo.triggerEmphasis && each(option.seriesDataIndices, function (batchItem) {\n      var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;\n      newHighlights[key] = batchItem;\n    });\n  });\n  // Diff.\n  var toHighlight = [];\n  var toDownplay = [];\n  each(lastHighlights, function (batchItem, key) {\n    !newHighlights[key] && toDownplay.push(batchItem);\n  });\n  each(newHighlights, function (batchItem, key) {\n    !lastHighlights[key] && toHighlight.push(batchItem);\n  });\n  toDownplay.length && api.dispatchAction({\n    type: 'downplay',\n    escapeConnect: true,\n    // Not blur others when highlight in axisPointer.\n    notBlur: true,\n    batch: toDownplay\n  });\n  toHighlight.length && api.dispatchAction({\n    type: 'highlight',\n    escapeConnect: true,\n    // Not blur others when highlight in axisPointer.\n    notBlur: true,\n    batch: toHighlight\n  });\n}\nfunction findInputAxisInfo(inputAxesInfo, axisInfo) {\n  for (var i = 0; i < (inputAxesInfo || []).length; i++) {\n    var inputAxisInfo = inputAxesInfo[i];\n    if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) {\n      return inputAxisInfo;\n    }\n  }\n}\nfunction makeMapperParam(axisInfo) {\n  var axisModel = axisInfo.axis.model;\n  var item = {};\n  var dim = item.axisDim = axisInfo.axis.dim;\n  item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex;\n  item.axisName = item[dim + 'AxisName'] = axisModel.name;\n  item.axisId = item[dim + 'AxisId'] = axisModel.id;\n  return item;\n}\nfunction illegalPoint(point) {\n  return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport AxisView from '../axis/AxisView.js';\nimport CartesianAxisPointer from './CartesianAxisPointer.js';\nimport AxisPointerModel from './AxisPointerModel.js';\nimport AxisPointerView from './AxisPointerView.js';\nimport { isArray } from 'zrender/lib/core/util.js';\nimport { collect } from './modelHelper.js';\nimport axisTrigger from './axisTrigger.js';\nexport function install(registers) {\n  // CartesianAxisPointer is not supposed to be required here. But consider\n  // echarts.simple.js and online build tooltip, which only require gridSimple,\n  // CartesianAxisPointer should be able to required somewhere.\n  AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer);\n  registers.registerComponentModel(AxisPointerModel);\n  registers.registerComponentView(AxisPointerView);\n  registers.registerPreprocessor(function (option) {\n    // Always has a global axisPointerModel for default setting.\n    if (option) {\n      (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {});\n      var link = option.axisPointer.link;\n      // Normalize to array to avoid object mergin. But if link\n      // is not set, remain null/undefined, otherwise it will\n      // override existent link setting.\n      if (link && !isArray(link)) {\n        option.axisPointer.link = [link];\n      }\n    }\n  });\n  // This process should proformed after coordinate systems created\n  // and series data processed. So put it on statistic processing stage.\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) {\n    // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.\n    // allAxesInfo should be updated when setOption performed.\n    ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api);\n  });\n  // Broadcast to all views.\n  registers.registerAction({\n    type: 'updateAxisPointer',\n    event: 'updateAxisPointer',\n    update: ':updateAxisPointer'\n  }, axisTrigger);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { install as installSimple } from './installSimple.js';\nimport { install as installAxisPointer } from '../axisPointer/install.js';\nimport { use } from '../../extension.js';\nexport function install(registers) {\n  use(installSimple);\n  use(installAxisPointer);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BaseAxisPointer from './BaseAxisPointer.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as viewHelper from './viewHelper.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport AxisBuilder from '../axis/AxisBuilder.js';\nvar PolarAxisPointer = /** @class */function (_super) {\n  __extends(PolarAxisPointer, _super);\n  function PolarAxisPointer() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  /**\n   * @override\n   */\n  PolarAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n    var axis = axisModel.axis;\n    if (axis.dim === 'angle') {\n      this.animationThreshold = Math.PI / 18;\n    }\n    var polar = axis.polar;\n    var otherAxis = polar.getOtherAxis(axis);\n    var otherExtent = otherAxis.getExtent();\n    var coordValue = axis.dataToCoord(value);\n    var axisPointerType = axisPointerModel.get('type');\n    if (axisPointerType && axisPointerType !== 'none') {\n      var elStyle = viewHelper.buildElStyle(axisPointerModel);\n      var pointerOption = pointerShapeBuilder[axisPointerType](axis, polar, coordValue, otherExtent);\n      pointerOption.style = elStyle;\n      elOption.graphicKey = pointerOption.type;\n      elOption.pointer = pointerOption;\n    }\n    var labelMargin = axisPointerModel.get(['label', 'margin']);\n    var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin);\n    viewHelper.buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos);\n  };\n  return PolarAxisPointer;\n}(BaseAxisPointer);\n;\nfunction getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) {\n  var axis = axisModel.axis;\n  var coord = axis.dataToCoord(value);\n  var axisAngle = polar.getAngleAxis().getExtent()[0];\n  axisAngle = axisAngle / 180 * Math.PI;\n  var radiusExtent = polar.getRadiusAxis().getExtent();\n  var position;\n  var align;\n  var verticalAlign;\n  if (axis.dim === 'radius') {\n    var transform = matrix.create();\n    matrix.rotate(transform, transform, axisAngle);\n    matrix.translate(transform, transform, [polar.cx, polar.cy]);\n    position = graphic.applyTransform([coord, -labelMargin], transform);\n    var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0;\n    // @ts-ignore\n    var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1);\n    align = labelLayout.textAlign;\n    verticalAlign = labelLayout.textVerticalAlign;\n  } else {\n    // angle axis\n    var r = radiusExtent[1];\n    position = polar.coordToPoint([r + labelMargin, coord]);\n    var cx = polar.cx;\n    var cy = polar.cy;\n    align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right';\n    verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom';\n  }\n  return {\n    position: position,\n    align: align,\n    verticalAlign: verticalAlign\n  };\n}\nvar pointerShapeBuilder = {\n  line: function (axis, polar, coordValue, otherExtent) {\n    return axis.dim === 'angle' ? {\n      type: 'Line',\n      shape: viewHelper.makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue]))\n    } : {\n      type: 'Circle',\n      shape: {\n        cx: polar.cx,\n        cy: polar.cy,\n        r: coordValue\n      }\n    };\n  },\n  shadow: function (axis, polar, coordValue, otherExtent) {\n    var bandWidth = Math.max(1, axis.getBandWidth());\n    var radian = Math.PI / 180;\n    return axis.dim === 'angle' ? {\n      type: 'Sector',\n      shape: viewHelper.makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1],\n      // In ECharts y is negative if angle is positive\n      (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian)\n    } : {\n      type: 'Sector',\n      shape: viewHelper.makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2)\n    };\n  }\n};\nexport default PolarAxisPointer;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nvar PolarModel = /** @class */function (_super) {\n  __extends(PolarModel, _super);\n  function PolarModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = PolarModel.type;\n    return _this;\n  }\n  PolarModel.prototype.findAxisModel = function (axisType) {\n    var foundAxisModel;\n    var ecModel = this.ecModel;\n    ecModel.eachComponent(axisType, function (axisModel) {\n      if (axisModel.getCoordSysModel() === this) {\n        foundAxisModel = axisModel;\n      }\n    }, this);\n    return foundAxisModel;\n  };\n  PolarModel.type = 'polar';\n  PolarModel.dependencies = ['radiusAxis', 'angleAxis'];\n  PolarModel.defaultOption = {\n    // zlevel: 0,\n    z: 0,\n    center: ['50%', '50%'],\n    radius: '80%'\n  };\n  return PolarModel;\n}(ComponentModel);\nexport default PolarModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ComponentModel from '../../model/Component.js';\nimport { AxisModelCommonMixin } from '../axisModelCommonMixin.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nvar PolarAxisModel = /** @class */function (_super) {\n  __extends(PolarAxisModel, _super);\n  function PolarAxisModel() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  PolarAxisModel.prototype.getCoordSysModel = function () {\n    return this.getReferringComponents('polar', SINGLE_REFERRING).models[0];\n  };\n  PolarAxisModel.type = 'polarAxis';\n  return PolarAxisModel;\n}(ComponentModel);\nzrUtil.mixin(PolarAxisModel, AxisModelCommonMixin);\nexport { PolarAxisModel };\nvar AngleAxisModel = /** @class */function (_super) {\n  __extends(AngleAxisModel, _super);\n  function AngleAxisModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = AngleAxisModel.type;\n    return _this;\n  }\n  AngleAxisModel.type = 'angleAxis';\n  return AngleAxisModel;\n}(PolarAxisModel);\nexport { AngleAxisModel };\nvar RadiusAxisModel = /** @class */function (_super) {\n  __extends(RadiusAxisModel, _super);\n  function RadiusAxisModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = RadiusAxisModel.type;\n    return _this;\n  }\n  RadiusAxisModel.type = 'radiusAxis';\n  return RadiusAxisModel;\n}(PolarAxisModel);\nexport { RadiusAxisModel };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Axis from '../Axis.js';\nvar RadiusAxis = /** @class */function (_super) {\n  __extends(RadiusAxis, _super);\n  function RadiusAxis(scale, radiusExtent) {\n    return _super.call(this, 'radius', scale, radiusExtent) || this;\n  }\n  RadiusAxis.prototype.pointToData = function (point, clamp) {\n    return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];\n  };\n  return RadiusAxis;\n}(Axis);\nRadiusAxis.prototype.dataToRadius = Axis.prototype.dataToCoord;\nRadiusAxis.prototype.radiusToData = Axis.prototype.coordToData;\nexport default RadiusAxis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as textContain from 'zrender/lib/contain/text.js';\nimport Axis from '../Axis.js';\nimport { makeInner } from '../../util/model.js';\nvar inner = makeInner();\nvar AngleAxis = /** @class */function (_super) {\n  __extends(AngleAxis, _super);\n  function AngleAxis(scale, angleExtent) {\n    return _super.call(this, 'angle', scale, angleExtent || [0, 360]) || this;\n  }\n  AngleAxis.prototype.pointToData = function (point, clamp) {\n    return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];\n  };\n  /**\n   * Only be called in category axis.\n   * Angle axis uses text height to decide interval\n   *\n   * @override\n   * @return {number} Auto interval for cateogry axis tick and label\n   */\n  AngleAxis.prototype.calculateCategoryInterval = function () {\n    var axis = this;\n    var labelModel = axis.getLabelModel();\n    var ordinalScale = axis.scale;\n    var ordinalExtent = ordinalScale.getExtent();\n    // Providing this method is for optimization:\n    // avoid generating a long array by `getTicks`\n    // in large category data case.\n    var tickCount = ordinalScale.count();\n    if (ordinalExtent[1] - ordinalExtent[0] < 1) {\n      return 0;\n    }\n    var tickValue = ordinalExtent[0];\n    var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);\n    var unitH = Math.abs(unitSpan);\n    // Not precise, just use height as text width\n    // and each distance from axis line yet.\n    var rect = textContain.getBoundingRect(tickValue == null ? '' : tickValue + '', labelModel.getFont(), 'center', 'top');\n    var maxH = Math.max(rect.height, 7);\n    var dh = maxH / unitH;\n    // 0/0 is NaN, 1/0 is Infinity.\n    isNaN(dh) && (dh = Infinity);\n    var interval = Math.max(0, Math.floor(dh));\n    var cache = inner(axis.model);\n    var lastAutoInterval = cache.lastAutoInterval;\n    var lastTickCount = cache.lastTickCount;\n    // Use cache to keep interval stable while moving zoom window,\n    // otherwise the calculated interval might jitter when the zoom\n    // window size is close to the interval-changing size.\n    if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1\n    // Always choose the bigger one, otherwise the critical\n    // point is not the same when zooming in or zooming out.\n    && lastAutoInterval > interval) {\n      interval = lastAutoInterval;\n    }\n    // Only update cache if cache not used, otherwise the\n    // changing of interval is too insensitive.\n    else {\n      cache.lastTickCount = tickCount;\n      cache.lastAutoInterval = interval;\n    }\n    return interval;\n  };\n  return AngleAxis;\n}(Axis);\nAngleAxis.prototype.dataToAngle = Axis.prototype.dataToCoord;\nAngleAxis.prototype.angleToData = Axis.prototype.coordToData;\nexport default AngleAxis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport RadiusAxis from './RadiusAxis.js';\nimport AngleAxis from './AngleAxis.js';\nexport var polarDimensions = ['radius', 'angle'];\nvar Polar = /** @class */function () {\n  function Polar(name) {\n    this.dimensions = polarDimensions;\n    this.type = 'polar';\n    /**\n     * x of polar center\n     */\n    this.cx = 0;\n    /**\n     * y of polar center\n     */\n    this.cy = 0;\n    this._radiusAxis = new RadiusAxis();\n    this._angleAxis = new AngleAxis();\n    this.axisPointerEnabled = true;\n    this.name = name || '';\n    this._radiusAxis.polar = this._angleAxis.polar = this;\n  }\n  /**\n   * If contain coord\n   */\n  Polar.prototype.containPoint = function (point) {\n    var coord = this.pointToCoord(point);\n    return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]);\n  };\n  /**\n   * If contain data\n   */\n  Polar.prototype.containData = function (data) {\n    return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]);\n  };\n  Polar.prototype.getAxis = function (dim) {\n    var key = '_' + dim + 'Axis';\n    return this[key];\n  };\n  Polar.prototype.getAxes = function () {\n    return [this._radiusAxis, this._angleAxis];\n  };\n  /**\n   * Get axes by type of scale\n   */\n  Polar.prototype.getAxesByScale = function (scaleType) {\n    var axes = [];\n    var angleAxis = this._angleAxis;\n    var radiusAxis = this._radiusAxis;\n    angleAxis.scale.type === scaleType && axes.push(angleAxis);\n    radiusAxis.scale.type === scaleType && axes.push(radiusAxis);\n    return axes;\n  };\n  Polar.prototype.getAngleAxis = function () {\n    return this._angleAxis;\n  };\n  Polar.prototype.getRadiusAxis = function () {\n    return this._radiusAxis;\n  };\n  Polar.prototype.getOtherAxis = function (axis) {\n    var angleAxis = this._angleAxis;\n    return axis === angleAxis ? this._radiusAxis : angleAxis;\n  };\n  /**\n   * Base axis will be used on stacking.\n   *\n   */\n  Polar.prototype.getBaseAxis = function () {\n    return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis();\n  };\n  Polar.prototype.getTooltipAxes = function (dim) {\n    var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis();\n    return {\n      baseAxes: [baseAxis],\n      otherAxes: [this.getOtherAxis(baseAxis)]\n    };\n  };\n  /**\n   * Convert a single data item to (x, y) point.\n   * Parameter data is an array which the first element is radius and the second is angle\n   */\n  Polar.prototype.dataToPoint = function (data, clamp, out) {\n    return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp), this._angleAxis.dataToAngle(data[1], clamp)], out);\n  };\n  /**\n   * Convert a (x, y) point to data\n   */\n  Polar.prototype.pointToData = function (point, clamp, out) {\n    out = out || [];\n    var coord = this.pointToCoord(point);\n    out[0] = this._radiusAxis.radiusToData(coord[0], clamp);\n    out[1] = this._angleAxis.angleToData(coord[1], clamp);\n    return out;\n  };\n  /**\n   * Convert a (x, y) point to (radius, angle) coord\n   */\n  Polar.prototype.pointToCoord = function (point) {\n    var dx = point[0] - this.cx;\n    var dy = point[1] - this.cy;\n    var angleAxis = this.getAngleAxis();\n    var extent = angleAxis.getExtent();\n    var minAngle = Math.min(extent[0], extent[1]);\n    var maxAngle = Math.max(extent[0], extent[1]);\n    // Fix fixed extent in polarCreator\n    // FIXME\n    angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360;\n    var radius = Math.sqrt(dx * dx + dy * dy);\n    dx /= radius;\n    dy /= radius;\n    var radian = Math.atan2(-dy, dx) / Math.PI * 180;\n    // move to angleExtent\n    var dir = radian < minAngle ? 1 : -1;\n    while (radian < minAngle || radian > maxAngle) {\n      radian += dir * 360;\n    }\n    return [radius, radian];\n  };\n  /**\n   * Convert a (radius, angle) coord to (x, y) point\n   */\n  Polar.prototype.coordToPoint = function (coord, out) {\n    out = out || [];\n    var radius = coord[0];\n    var radian = coord[1] / 180 * Math.PI;\n    out[0] = Math.cos(radian) * radius + this.cx;\n    // Inverse the y\n    out[1] = -Math.sin(radian) * radius + this.cy;\n    return out;\n  };\n  /**\n   * Get ring area of cartesian.\n   * Area will have a contain function to determine if a point is in the coordinate system.\n   */\n  Polar.prototype.getArea = function () {\n    var angleAxis = this.getAngleAxis();\n    var radiusAxis = this.getRadiusAxis();\n    var radiusExtent = radiusAxis.getExtent().slice();\n    radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse();\n    var angleExtent = angleAxis.getExtent();\n    var RADIAN = Math.PI / 180;\n    var EPSILON = 1e-4;\n    return {\n      cx: this.cx,\n      cy: this.cy,\n      r0: radiusExtent[0],\n      r: radiusExtent[1],\n      startAngle: -angleExtent[0] * RADIAN,\n      endAngle: -angleExtent[1] * RADIAN,\n      clockwise: angleAxis.inverse,\n      contain: function (x, y) {\n        // It's a ring shape.\n        // Start angle and end angle don't matter\n        var dx = x - this.cx;\n        var dy = y - this.cy;\n        var d2 = dx * dx + dy * dy;\n        var r = this.r;\n        var r0 = this.r0;\n        // minus a tiny value 1e-4 in double side to avoid being clipped unexpectedly\n        // r == r0 contain nothing\n        return r !== r0 && d2 - EPSILON <= r * r && d2 + EPSILON >= r0 * r0;\n      },\n      // As the bounding box\n      x: this.cx - radiusExtent[1],\n      y: this.cy - radiusExtent[1],\n      width: radiusExtent[1] * 2,\n      height: radiusExtent[1] * 2\n    };\n  };\n  Polar.prototype.convertToPixel = function (ecModel, finder, value) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? this.dataToPoint(value) : null;\n  };\n  Polar.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? this.pointToData(pixel) : null;\n  };\n  return Polar;\n}();\nfunction getCoordSys(finder) {\n  var seriesModel = finder.seriesModel;\n  var polarModel = finder.polarModel;\n  return polarModel && polarModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem;\n}\nexport default Polar;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// TODO Axis scale\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Polar, { polarDimensions } from './Polar.js';\nimport { parsePercent } from '../../util/number.js';\nimport { createScaleByModel, niceScaleExtent, getDataDimensionsOnAxis } from '../../coord/axisHelper.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nimport { createBoxLayoutReference } from '../../util/layout.js';\n/**\n * Resize method bound to the polar\n */\nfunction resizePolar(polar, polarModel, api) {\n  var center = polarModel.get('center');\n  var refContainer = createBoxLayoutReference(polarModel, api).refContainer;\n  polar.cx = parsePercent(center[0], refContainer.width) + refContainer.x;\n  polar.cy = parsePercent(center[1], refContainer.height) + refContainer.y;\n  var radiusAxis = polar.getRadiusAxis();\n  var size = Math.min(refContainer.width, refContainer.height) / 2;\n  var radius = polarModel.get('radius');\n  if (radius == null) {\n    radius = [0, '100%'];\n  } else if (!zrUtil.isArray(radius)) {\n    // r0 = 0\n    radius = [0, radius];\n  }\n  var parsedRadius = [parsePercent(radius[0], size), parsePercent(radius[1], size)];\n  radiusAxis.inverse ? radiusAxis.setExtent(parsedRadius[1], parsedRadius[0]) : radiusAxis.setExtent(parsedRadius[0], parsedRadius[1]);\n}\n/**\n * Update polar\n */\nfunction updatePolarScale(ecModel, api) {\n  var polar = this;\n  var angleAxis = polar.getAngleAxis();\n  var radiusAxis = polar.getRadiusAxis();\n  // Reset scale\n  angleAxis.scale.setExtent(Infinity, -Infinity);\n  radiusAxis.scale.setExtent(Infinity, -Infinity);\n  ecModel.eachSeries(function (seriesModel) {\n    if (seriesModel.coordinateSystem === polar) {\n      var data_1 = seriesModel.getData();\n      zrUtil.each(getDataDimensionsOnAxis(data_1, 'radius'), function (dim) {\n        radiusAxis.scale.unionExtentFromData(data_1, dim);\n      });\n      zrUtil.each(getDataDimensionsOnAxis(data_1, 'angle'), function (dim) {\n        angleAxis.scale.unionExtentFromData(data_1, dim);\n      });\n    }\n  });\n  niceScaleExtent(angleAxis.scale, angleAxis.model);\n  niceScaleExtent(radiusAxis.scale, radiusAxis.model);\n  // Fix extent of category angle axis\n  if (angleAxis.type === 'category' && !angleAxis.onBand) {\n    var extent = angleAxis.getExtent();\n    var diff = 360 / angleAxis.scale.count();\n    angleAxis.inverse ? extent[1] += diff : extent[1] -= diff;\n    angleAxis.setExtent(extent[0], extent[1]);\n  }\n}\nfunction isAngleAxisModel(axisModel) {\n  return axisModel.mainType === 'angleAxis';\n}\n/**\n * Set common axis properties\n */\nfunction setAxis(axis, axisModel) {\n  var _a;\n  axis.type = axisModel.get('type');\n  axis.scale = createScaleByModel(axisModel);\n  axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category';\n  axis.inverse = axisModel.get('inverse');\n  if (isAngleAxisModel(axisModel)) {\n    axis.inverse = axis.inverse !== axisModel.get('clockwise');\n    var startAngle = axisModel.get('startAngle');\n    var endAngle = (_a = axisModel.get('endAngle')) !== null && _a !== void 0 ? _a : startAngle + (axis.inverse ? -360 : 360);\n    axis.setExtent(startAngle, endAngle);\n  }\n  // Inject axis instance\n  axisModel.axis = axis;\n  axis.model = axisModel;\n}\nvar polarCreator = {\n  dimensions: polarDimensions,\n  create: function (ecModel, api) {\n    var polarList = [];\n    ecModel.eachComponent('polar', function (polarModel, idx) {\n      var polar = new Polar(idx + '');\n      // Inject resize and update method\n      polar.update = updatePolarScale;\n      var radiusAxis = polar.getRadiusAxis();\n      var angleAxis = polar.getAngleAxis();\n      var radiusAxisModel = polarModel.findAxisModel('radiusAxis');\n      var angleAxisModel = polarModel.findAxisModel('angleAxis');\n      setAxis(radiusAxis, radiusAxisModel);\n      setAxis(angleAxis, angleAxisModel);\n      resizePolar(polar, polarModel, api);\n      polarList.push(polar);\n      polarModel.coordinateSystem = polar;\n      polar.model = polarModel;\n    });\n    // Inject coordinateSystem to series\n    ecModel.eachSeries(function (seriesModel) {\n      if (seriesModel.get('coordinateSystem') === 'polar') {\n        var polarModel = seriesModel.getReferringComponents('polar', SINGLE_REFERRING).models[0];\n        if (process.env.NODE_ENV !== 'production') {\n          if (!polarModel) {\n            throw new Error('Polar \"' + zrUtil.retrieve(seriesModel.get('polarIndex'), seriesModel.get('polarId'), 0) + '\" not found');\n          }\n        }\n        seriesModel.coordinateSystem = polarModel.coordinateSystem;\n      }\n    });\n    return polarList;\n  }\n};\nexport default polarCreator;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport Model from '../../model/Model.js';\nimport AxisView from './AxisView.js';\nimport AxisBuilder from './AxisBuilder.js';\nimport { getECData } from '../../util/innerStore.js';\nvar elementList = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea'];\nfunction getAxisLineShape(polar, rExtent, angle) {\n  rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse());\n  var start = polar.coordToPoint([rExtent[0], angle]);\n  var end = polar.coordToPoint([rExtent[1], angle]);\n  return {\n    x1: start[0],\n    y1: start[1],\n    x2: end[0],\n    y2: end[1]\n  };\n}\nfunction getRadiusIdx(polar) {\n  var radiusAxis = polar.getRadiusAxis();\n  return radiusAxis.inverse ? 0 : 1;\n}\n// Remove the last tick which will overlap the first tick\nfunction fixAngleOverlap(list) {\n  var firstItem = list[0];\n  var lastItem = list[list.length - 1];\n  if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) {\n    list.pop();\n  }\n}\nvar AngleAxisView = /** @class */function (_super) {\n  __extends(AngleAxisView, _super);\n  function AngleAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = AngleAxisView.type;\n    _this.axisPointerClass = 'PolarAxisPointer';\n    return _this;\n  }\n  AngleAxisView.prototype.render = function (angleAxisModel, ecModel) {\n    this.group.removeAll();\n    if (!angleAxisModel.get('show')) {\n      return;\n    }\n    var angleAxis = angleAxisModel.axis;\n    var polar = angleAxis.polar;\n    var radiusExtent = polar.getRadiusAxis().getExtent();\n    var ticksAngles = angleAxis.getTicksCoords({\n      breakTicks: 'none'\n    });\n    var minorTickAngles = angleAxis.getMinorTicksCoords();\n    var labels = zrUtil.map(angleAxis.getViewLabels(), function (labelItem) {\n      labelItem = zrUtil.clone(labelItem);\n      var scale = angleAxis.scale;\n      var tickValue = scale.type === 'ordinal' ? scale.getRawOrdinalNumber(labelItem.tickValue) : labelItem.tickValue;\n      labelItem.coord = angleAxis.dataToCoord(tickValue);\n      return labelItem;\n    });\n    fixAngleOverlap(labels);\n    fixAngleOverlap(ticksAngles);\n    zrUtil.each(elementList, function (name) {\n      if (angleAxisModel.get([name, 'show']) && (!angleAxis.scale.isBlank() || name === 'axisLine')) {\n        angelAxisElementsBuilders[name](this.group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels);\n      }\n    }, this);\n  };\n  AngleAxisView.type = 'angleAxis';\n  return AngleAxisView;\n}(AxisView);\nvar angelAxisElementsBuilders = {\n  axisLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n    var lineStyleModel = angleAxisModel.getModel(['axisLine', 'lineStyle']);\n    var angleAxis = polar.getAngleAxis();\n    var RADIAN = Math.PI / 180;\n    var angleExtent = angleAxis.getExtent();\n    // extent id of the axis radius (r0 and r)\n    var rId = getRadiusIdx(polar);\n    var r0Id = rId ? 0 : 1;\n    var shape;\n    var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? 'Circle' : 'Arc';\n    if (radiusExtent[r0Id] === 0) {\n      shape = new graphic[shapeType]({\n        shape: {\n          cx: polar.cx,\n          cy: polar.cy,\n          r: radiusExtent[rId],\n          startAngle: -angleExtent[0] * RADIAN,\n          endAngle: -angleExtent[1] * RADIAN,\n          clockwise: angleAxis.inverse\n        },\n        style: lineStyleModel.getLineStyle(),\n        z2: 1,\n        silent: true\n      });\n    } else {\n      shape = new graphic.Ring({\n        shape: {\n          cx: polar.cx,\n          cy: polar.cy,\n          r: radiusExtent[rId],\n          r0: radiusExtent[r0Id]\n        },\n        style: lineStyleModel.getLineStyle(),\n        z2: 1,\n        silent: true\n      });\n    }\n    shape.style.fill = null;\n    group.add(shape);\n  },\n  axisTick: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n    var tickModel = angleAxisModel.getModel('axisTick');\n    var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');\n    var radius = radiusExtent[getRadiusIdx(polar)];\n    var lines = zrUtil.map(ticksAngles, function (tickAngleItem) {\n      return new graphic.Line({\n        shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord)\n      });\n    });\n    group.add(graphic.mergePath(lines, {\n      style: zrUtil.defaults(tickModel.getModel('lineStyle').getLineStyle(), {\n        stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color'])\n      })\n    }));\n  },\n  minorTick: function (group, angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) {\n    if (!minorTickAngles.length) {\n      return;\n    }\n    var tickModel = angleAxisModel.getModel('axisTick');\n    var minorTickModel = angleAxisModel.getModel('minorTick');\n    var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length');\n    var radius = radiusExtent[getRadiusIdx(polar)];\n    var lines = [];\n    for (var i = 0; i < minorTickAngles.length; i++) {\n      for (var k = 0; k < minorTickAngles[i].length; k++) {\n        lines.push(new graphic.Line({\n          shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord)\n        }));\n      }\n    }\n    group.add(graphic.mergePath(lines, {\n      style: zrUtil.defaults(minorTickModel.getModel('lineStyle').getLineStyle(), zrUtil.defaults(tickModel.getLineStyle(), {\n        stroke: angleAxisModel.get(['axisLine', 'lineStyle', 'color'])\n      }))\n    }));\n  },\n  axisLabel: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) {\n    var rawCategoryData = angleAxisModel.getCategories(true);\n    var commonLabelModel = angleAxisModel.getModel('axisLabel');\n    var labelMargin = commonLabelModel.get('margin');\n    var triggerEvent = angleAxisModel.get('triggerEvent');\n    // Use length of ticksAngles because it may remove the last tick to avoid overlapping\n    zrUtil.each(labels, function (labelItem, idx) {\n      var labelModel = commonLabelModel;\n      var tickValue = labelItem.tickValue;\n      var r = radiusExtent[getRadiusIdx(polar)];\n      var p = polar.coordToPoint([r + labelMargin, labelItem.coord]);\n      var cx = polar.cx;\n      var cy = polar.cy;\n      var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right';\n      var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom';\n      if (rawCategoryData && rawCategoryData[tickValue]) {\n        var rawCategoryItem = rawCategoryData[tickValue];\n        if (zrUtil.isObject(rawCategoryItem) && rawCategoryItem.textStyle) {\n          labelModel = new Model(rawCategoryItem.textStyle, commonLabelModel, commonLabelModel.ecModel);\n        }\n      }\n      var textEl = new graphic.Text({\n        silent: AxisBuilder.isLabelSilent(angleAxisModel),\n        style: createTextStyle(labelModel, {\n          x: p[0],\n          y: p[1],\n          fill: labelModel.getTextColor() || angleAxisModel.get(['axisLine', 'lineStyle', 'color']),\n          text: labelItem.formattedLabel,\n          align: labelTextAlign,\n          verticalAlign: labelTextVerticalAlign\n        })\n      });\n      group.add(textEl);\n      graphic.setTooltipConfig({\n        el: textEl,\n        componentModel: angleAxisModel,\n        itemName: labelItem.formattedLabel,\n        formatterParamsExtra: {\n          isTruncated: function () {\n            return textEl.isTruncated;\n          },\n          value: labelItem.rawLabel,\n          tickIndex: idx\n        }\n      });\n      // Pack data for mouse event\n      if (triggerEvent) {\n        var eventData = AxisBuilder.makeAxisEventDataBase(angleAxisModel);\n        eventData.targetType = 'axisLabel';\n        eventData.value = labelItem.rawLabel;\n        getECData(textEl).eventData = eventData;\n      }\n    }, this);\n  },\n  splitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n    var splitLineModel = angleAxisModel.getModel('splitLine');\n    var lineStyleModel = splitLineModel.getModel('lineStyle');\n    var lineColors = lineStyleModel.get('color');\n    var lineCount = 0;\n    lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n    var splitLines = [];\n    for (var i = 0; i < ticksAngles.length; i++) {\n      var colorIndex = lineCount++ % lineColors.length;\n      splitLines[colorIndex] = splitLines[colorIndex] || [];\n      splitLines[colorIndex].push(new graphic.Line({\n        shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord)\n      }));\n    }\n    // Simple optimization\n    // Batching the lines if color are the same\n    for (var i = 0; i < splitLines.length; i++) {\n      group.add(graphic.mergePath(splitLines[i], {\n        style: zrUtil.defaults({\n          stroke: lineColors[i % lineColors.length]\n        }, lineStyleModel.getLineStyle()),\n        silent: true,\n        z: angleAxisModel.get('z')\n      }));\n    }\n  },\n  minorSplitLine: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n    if (!minorTickAngles.length) {\n      return;\n    }\n    var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine');\n    var lineStyleModel = minorSplitLineModel.getModel('lineStyle');\n    var lines = [];\n    for (var i = 0; i < minorTickAngles.length; i++) {\n      for (var k = 0; k < minorTickAngles[i].length; k++) {\n        lines.push(new graphic.Line({\n          shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord)\n        }));\n      }\n    }\n    group.add(graphic.mergePath(lines, {\n      style: lineStyleModel.getLineStyle(),\n      silent: true,\n      z: angleAxisModel.get('z')\n    }));\n  },\n  splitArea: function (group, angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {\n    if (!ticksAngles.length) {\n      return;\n    }\n    var splitAreaModel = angleAxisModel.getModel('splitArea');\n    var areaStyleModel = splitAreaModel.getModel('areaStyle');\n    var areaColors = areaStyleModel.get('color');\n    var lineCount = 0;\n    areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n    var splitAreas = [];\n    var RADIAN = Math.PI / 180;\n    var prevAngle = -ticksAngles[0].coord * RADIAN;\n    var r0 = Math.min(radiusExtent[0], radiusExtent[1]);\n    var r1 = Math.max(radiusExtent[0], radiusExtent[1]);\n    var clockwise = angleAxisModel.get('clockwise');\n    for (var i = 1, len = ticksAngles.length; i <= len; i++) {\n      var coord = i === len ? ticksAngles[0].coord : ticksAngles[i].coord;\n      var colorIndex = lineCount++ % areaColors.length;\n      splitAreas[colorIndex] = splitAreas[colorIndex] || [];\n      splitAreas[colorIndex].push(new graphic.Sector({\n        shape: {\n          cx: polar.cx,\n          cy: polar.cy,\n          r0: r0,\n          r: r1,\n          startAngle: prevAngle,\n          endAngle: -coord * RADIAN,\n          clockwise: clockwise\n        },\n        silent: true\n      }));\n      prevAngle = -coord * RADIAN;\n    }\n    // Simple optimization\n    // Batching the lines if color are the same\n    for (var i = 0; i < splitAreas.length; i++) {\n      group.add(graphic.mergePath(splitAreas[i], {\n        style: zrUtil.defaults({\n          fill: areaColors[i % areaColors.length]\n        }, areaStyleModel.getAreaStyle()),\n        silent: true\n      }));\n    }\n  }\n};\nexport default AngleAxisView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport AxisBuilder from './AxisBuilder.js';\nimport AxisView from './AxisView.js';\nvar selfBuilderAttrs = ['splitLine', 'splitArea', 'minorSplitLine'];\nvar RadiusAxisView = /** @class */function (_super) {\n  __extends(RadiusAxisView, _super);\n  function RadiusAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = RadiusAxisView.type;\n    _this.axisPointerClass = 'PolarAxisPointer';\n    return _this;\n  }\n  RadiusAxisView.prototype.render = function (radiusAxisModel, ecModel, api) {\n    this.group.removeAll();\n    if (!radiusAxisModel.get('show')) {\n      return;\n    }\n    var oldAxisGroup = this._axisGroup;\n    var newAxisGroup = this._axisGroup = new graphic.Group();\n    this.group.add(newAxisGroup);\n    var radiusAxis = radiusAxisModel.axis;\n    var polar = radiusAxis.polar;\n    var angleAxis = polar.getAngleAxis();\n    var ticksCoords = radiusAxis.getTicksCoords();\n    var minorTicksCoords = radiusAxis.getMinorTicksCoords();\n    var axisAngle = angleAxis.getExtent()[0];\n    var radiusExtent = radiusAxis.getExtent();\n    var layout = layoutAxis(polar, radiusAxisModel, axisAngle);\n    var axisBuilder = new AxisBuilder(radiusAxisModel, api, layout);\n    axisBuilder.build();\n    newAxisGroup.add(axisBuilder.group);\n    graphic.groupTransition(oldAxisGroup, newAxisGroup, radiusAxisModel);\n    zrUtil.each(selfBuilderAttrs, function (name) {\n      if (radiusAxisModel.get([name, 'show']) && !radiusAxis.scale.isBlank()) {\n        axisElementBuilders[name](this.group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords);\n      }\n    }, this);\n  };\n  RadiusAxisView.type = 'radiusAxis';\n  return RadiusAxisView;\n}(AxisView);\nvar axisElementBuilders = {\n  splitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n    var splitLineModel = radiusAxisModel.getModel('splitLine');\n    var lineStyleModel = splitLineModel.getModel('lineStyle');\n    var lineColors = lineStyleModel.get('color');\n    var lineCount = 0;\n    var angleAxis = polar.getAngleAxis();\n    var RADIAN = Math.PI / 180;\n    var angleExtent = angleAxis.getExtent();\n    var shapeType = Math.abs(angleExtent[1] - angleExtent[0]) === 360 ? 'Circle' : 'Arc';\n    lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n    var splitLines = [];\n    for (var i = 0; i < ticksCoords.length; i++) {\n      var colorIndex = lineCount++ % lineColors.length;\n      splitLines[colorIndex] = splitLines[colorIndex] || [];\n      splitLines[colorIndex].push(new graphic[shapeType]({\n        shape: {\n          cx: polar.cx,\n          cy: polar.cy,\n          // ensure circle radius >= 0\n          r: Math.max(ticksCoords[i].coord, 0),\n          startAngle: -angleExtent[0] * RADIAN,\n          endAngle: -angleExtent[1] * RADIAN,\n          clockwise: angleAxis.inverse\n        }\n      }));\n    }\n    // Simple optimization\n    // Batching the lines if color are the same\n    for (var i = 0; i < splitLines.length; i++) {\n      group.add(graphic.mergePath(splitLines[i], {\n        style: zrUtil.defaults({\n          stroke: lineColors[i % lineColors.length],\n          fill: null\n        }, lineStyleModel.getLineStyle()),\n        silent: true\n      }));\n    }\n  },\n  minorSplitLine: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) {\n    if (!minorTicksCoords.length) {\n      return;\n    }\n    var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine');\n    var lineStyleModel = minorSplitLineModel.getModel('lineStyle');\n    var lines = [];\n    for (var i = 0; i < minorTicksCoords.length; i++) {\n      for (var k = 0; k < minorTicksCoords[i].length; k++) {\n        lines.push(new graphic.Circle({\n          shape: {\n            cx: polar.cx,\n            cy: polar.cy,\n            r: minorTicksCoords[i][k].coord\n          }\n        }));\n      }\n    }\n    group.add(graphic.mergePath(lines, {\n      style: zrUtil.defaults({\n        fill: null\n      }, lineStyleModel.getLineStyle()),\n      silent: true\n    }));\n  },\n  splitArea: function (group, radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {\n    if (!ticksCoords.length) {\n      return;\n    }\n    var splitAreaModel = radiusAxisModel.getModel('splitArea');\n    var areaStyleModel = splitAreaModel.getModel('areaStyle');\n    var areaColors = areaStyleModel.get('color');\n    var lineCount = 0;\n    areaColors = areaColors instanceof Array ? areaColors : [areaColors];\n    var splitAreas = [];\n    var prevRadius = ticksCoords[0].coord;\n    for (var i = 1; i < ticksCoords.length; i++) {\n      var colorIndex = lineCount++ % areaColors.length;\n      splitAreas[colorIndex] = splitAreas[colorIndex] || [];\n      splitAreas[colorIndex].push(new graphic.Sector({\n        shape: {\n          cx: polar.cx,\n          cy: polar.cy,\n          r0: prevRadius,\n          r: ticksCoords[i].coord,\n          startAngle: 0,\n          endAngle: Math.PI * 2\n        },\n        silent: true\n      }));\n      prevRadius = ticksCoords[i].coord;\n    }\n    // Simple optimization\n    // Batching the lines if color are the same\n    for (var i = 0; i < splitAreas.length; i++) {\n      group.add(graphic.mergePath(splitAreas[i], {\n        style: zrUtil.defaults({\n          fill: areaColors[i % areaColors.length]\n        }, areaStyleModel.getAreaStyle()),\n        silent: true\n      }));\n    }\n  }\n};\n/**\n * @inner\n */\nfunction layoutAxis(polar, radiusAxisModel, axisAngle) {\n  return {\n    position: [polar.cx, polar.cy],\n    rotation: axisAngle / 180 * Math.PI,\n    labelDirection: -1,\n    tickDirection: -1,\n    nameDirection: 1,\n    labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'),\n    // Over splitLine and splitArea\n    z2: 1\n  };\n}\nexport default RadiusAxisView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { parsePercent } from '../util/number.js';\nimport { isDimensionStacked } from '../data/helper/dataStackHelper.js';\nfunction getSeriesStackId(seriesModel) {\n  return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;\n}\nfunction getAxisKey(polar, axis) {\n  return axis.dim + polar.model.componentIndex;\n}\nfunction barLayoutPolar(seriesType, ecModel, api) {\n  var lastStackCoords = {};\n  var barWidthAndOffset = calRadialBar(zrUtil.filter(ecModel.getSeriesByType(seriesType), function (seriesModel) {\n    return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar';\n  }));\n  ecModel.eachSeriesByType(seriesType, function (seriesModel) {\n    // Check series coordinate, do layout for polar only\n    if (seriesModel.coordinateSystem.type !== 'polar') {\n      return;\n    }\n    var data = seriesModel.getData();\n    var polar = seriesModel.coordinateSystem;\n    var baseAxis = polar.getBaseAxis();\n    var axisKey = getAxisKey(polar, baseAxis);\n    var stackId = getSeriesStackId(seriesModel);\n    var columnLayoutInfo = barWidthAndOffset[axisKey][stackId];\n    var columnOffset = columnLayoutInfo.offset;\n    var columnWidth = columnLayoutInfo.width;\n    var valueAxis = polar.getOtherAxis(baseAxis);\n    var cx = seriesModel.coordinateSystem.cx;\n    var cy = seriesModel.coordinateSystem.cy;\n    var barMinHeight = seriesModel.get('barMinHeight') || 0;\n    var barMinAngle = seriesModel.get('barMinAngle') || 0;\n    lastStackCoords[stackId] = lastStackCoords[stackId] || [];\n    var valueDim = data.mapDimension(valueAxis.dim);\n    var baseDim = data.mapDimension(baseAxis.dim);\n    var stacked = isDimensionStacked(data, valueDim /* , baseDim */);\n    var clampLayout = baseAxis.dim !== 'radius' || !seriesModel.get('roundCap', true);\n    var valueAxisModel = valueAxis.model;\n    var startValue = valueAxisModel.get('startValue');\n    var valueAxisStart = valueAxis.dataToCoord(startValue || 0);\n    for (var idx = 0, len = data.count(); idx < len; idx++) {\n      var value = data.get(valueDim, idx);\n      var baseValue = data.get(baseDim, idx);\n      var sign = value >= 0 ? 'p' : 'n';\n      var baseCoord = valueAxisStart;\n      // Because of the barMinHeight, we can not use the value in\n      // stackResultDimension directly.\n      // Only ordinal axis can be stacked.\n      if (stacked) {\n        if (!lastStackCoords[stackId][baseValue]) {\n          lastStackCoords[stackId][baseValue] = {\n            p: valueAxisStart,\n            n: valueAxisStart // Negative stack\n          };\n        }\n        // Should also consider #4243\n        baseCoord = lastStackCoords[stackId][baseValue][sign];\n      }\n      var r0 = void 0;\n      var r = void 0;\n      var startAngle = void 0;\n      var endAngle = void 0;\n      // radial sector\n      if (valueAxis.dim === 'radius') {\n        var radiusSpan = valueAxis.dataToCoord(value) - valueAxisStart;\n        var angle = baseAxis.dataToCoord(baseValue);\n        if (Math.abs(radiusSpan) < barMinHeight) {\n          radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight;\n        }\n        r0 = baseCoord;\n        r = baseCoord + radiusSpan;\n        startAngle = angle - columnOffset;\n        endAngle = startAngle - columnWidth;\n        stacked && (lastStackCoords[stackId][baseValue][sign] = r);\n      }\n      // tangential sector\n      else {\n        var angleSpan = valueAxis.dataToCoord(value, clampLayout) - valueAxisStart;\n        var radius = baseAxis.dataToCoord(baseValue);\n        if (Math.abs(angleSpan) < barMinAngle) {\n          angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle;\n        }\n        r0 = radius + columnOffset;\n        r = r0 + columnWidth;\n        startAngle = baseCoord;\n        endAngle = baseCoord + angleSpan;\n        // if the previous stack is at the end of the ring,\n        // add a round to differentiate it from origin\n        // let extent = angleAxis.getExtent();\n        // let stackCoord = angle;\n        // if (stackCoord === extent[0] && value > 0) {\n        //     stackCoord = extent[1];\n        // }\n        // else if (stackCoord === extent[1] && value < 0) {\n        //     stackCoord = extent[0];\n        // }\n        stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle);\n      }\n      data.setItemLayout(idx, {\n        cx: cx,\n        cy: cy,\n        r0: r0,\n        r: r,\n        // Consider that positive angle is anti-clockwise,\n        // while positive radian of sector is clockwise\n        startAngle: -startAngle * Math.PI / 180,\n        endAngle: -endAngle * Math.PI / 180,\n        /**\n         * Keep the same logic with bar in catesion: use end value to\n         * control direction. Notice that if clockwise is true (by\n         * default), the sector will always draw clockwisely, no matter\n         * whether endAngle is greater or less than startAngle.\n         */\n        clockwise: startAngle >= endAngle\n      });\n    }\n  });\n}\n/**\n * Calculate bar width and offset for radial bar charts\n */\nfunction calRadialBar(barSeries) {\n  // Columns info on each category axis. Key is polar name\n  var columnsMap = {};\n  zrUtil.each(barSeries, function (seriesModel, idx) {\n    var data = seriesModel.getData();\n    var polar = seriesModel.coordinateSystem;\n    var baseAxis = polar.getBaseAxis();\n    var axisKey = getAxisKey(polar, baseAxis);\n    var axisExtent = baseAxis.getExtent();\n    var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count();\n    var columnsOnAxis = columnsMap[axisKey] || {\n      bandWidth: bandWidth,\n      remainedWidth: bandWidth,\n      autoWidthCount: 0,\n      categoryGap: '20%',\n      gap: '30%',\n      stacks: {}\n    };\n    var stacks = columnsOnAxis.stacks;\n    columnsMap[axisKey] = columnsOnAxis;\n    var stackId = getSeriesStackId(seriesModel);\n    if (!stacks[stackId]) {\n      columnsOnAxis.autoWidthCount++;\n    }\n    stacks[stackId] = stacks[stackId] || {\n      width: 0,\n      maxWidth: 0\n    };\n    var barWidth = parsePercent(seriesModel.get('barWidth'), bandWidth);\n    var barMaxWidth = parsePercent(seriesModel.get('barMaxWidth'), bandWidth);\n    var barGap = seriesModel.get('barGap');\n    var barCategoryGap = seriesModel.get('barCategoryGap');\n    if (barWidth && !stacks[stackId].width) {\n      barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);\n      stacks[stackId].width = barWidth;\n      columnsOnAxis.remainedWidth -= barWidth;\n    }\n    barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);\n    barGap != null && (columnsOnAxis.gap = barGap);\n    barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap);\n  });\n  var result = {};\n  zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) {\n    result[coordSysName] = {};\n    var stacks = columnsOnAxis.stacks;\n    var bandWidth = columnsOnAxis.bandWidth;\n    var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth);\n    var barGapPercent = parsePercent(columnsOnAxis.gap, 1);\n    var remainedWidth = columnsOnAxis.remainedWidth;\n    var autoWidthCount = columnsOnAxis.autoWidthCount;\n    var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n    autoWidth = Math.max(autoWidth, 0);\n    // Find if any auto calculated bar exceeded maxBarWidth\n    zrUtil.each(stacks, function (column, stack) {\n      var maxWidth = column.maxWidth;\n      if (maxWidth && maxWidth < autoWidth) {\n        maxWidth = Math.min(maxWidth, remainedWidth);\n        if (column.width) {\n          maxWidth = Math.min(maxWidth, column.width);\n        }\n        remainedWidth -= maxWidth;\n        column.width = maxWidth;\n        autoWidthCount--;\n      }\n    });\n    // Recalculate width again\n    autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);\n    autoWidth = Math.max(autoWidth, 0);\n    var widthSum = 0;\n    var lastColumn;\n    zrUtil.each(stacks, function (column, idx) {\n      if (!column.width) {\n        column.width = autoWidth;\n      }\n      lastColumn = column;\n      widthSum += column.width * (1 + barGapPercent);\n    });\n    if (lastColumn) {\n      widthSum -= lastColumn.width * barGapPercent;\n    }\n    var offset = -widthSum / 2;\n    zrUtil.each(stacks, function (column, stackId) {\n      result[coordSysName][stackId] = result[coordSysName][stackId] || {\n        offset: offset,\n        width: column.width\n      };\n      offset += column.width * (1 + barGapPercent);\n    });\n  });\n  return result;\n}\nexport default barLayoutPolar;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { use } from '../../extension.js';\nimport AxisView from '../axis/AxisView.js';\nimport PolarAxisPointer from '../axisPointer/PolarAxisPointer.js';\nimport { install as installAxisPointer } from '../axisPointer/install.js';\nimport PolarModel from '../../coord/polar/PolarModel.js';\nimport axisModelCreator from '../../coord/axisModelCreator.js';\nimport { AngleAxisModel, RadiusAxisModel } from '../../coord/polar/AxisModel.js';\nimport polarCreator from '../../coord/polar/polarCreator.js';\nimport AngleAxisView from '../axis/AngleAxisView.js';\nimport RadiusAxisView from '../axis/RadiusAxisView.js';\nimport ComponentView from '../../view/Component.js';\nimport { curry } from 'zrender/lib/core/util.js';\nimport barLayoutPolar from '../../layout/barPolar.js';\nvar angleAxisExtraOption = {\n  startAngle: 90,\n  clockwise: true,\n  splitNumber: 12,\n  axisLabel: {\n    rotate: 0\n  }\n};\nvar radiusAxisExtraOption = {\n  splitNumber: 5\n};\nvar PolarView = /** @class */function (_super) {\n  __extends(PolarView, _super);\n  function PolarView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = PolarView.type;\n    return _this;\n  }\n  PolarView.type = 'polar';\n  return PolarView;\n}(ComponentView);\nexport function install(registers) {\n  use(installAxisPointer);\n  AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer);\n  registers.registerCoordinateSystem('polar', polarCreator);\n  registers.registerComponentModel(PolarModel);\n  registers.registerComponentView(PolarView);\n  // Model and view for angleAxis and radiusAxis\n  axisModelCreator(registers, 'angle', AngleAxisModel, angleAxisExtraOption);\n  axisModelCreator(registers, 'radius', RadiusAxisModel, radiusAxisExtraOption);\n  registers.registerComponentView(AngleAxisView);\n  registers.registerComponentView(RadiusAxisView);\n  registers.registerLayout(curry(barLayoutPolar, 'bar'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport function layout(axisModel, opt) {\n  opt = opt || {};\n  var single = axisModel.coordinateSystem;\n  var axis = axisModel.axis;\n  var layout = {};\n  var axisPosition = axis.position;\n  var orient = axis.orient;\n  var rect = single.getRect();\n  var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];\n  var positionMap = {\n    horizontal: {\n      top: rectBound[2],\n      bottom: rectBound[3]\n    },\n    vertical: {\n      left: rectBound[0],\n      right: rectBound[1]\n    }\n  };\n  layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]];\n  var r = {\n    horizontal: 0,\n    vertical: 1\n  };\n  layout.rotation = Math.PI / 2 * r[orient];\n  var directionMap = {\n    top: -1,\n    bottom: 1,\n    right: 1,\n    left: -1\n  };\n  layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition];\n  if (axisModel.get(['axisTick', 'inside'])) {\n    layout.tickDirection = -layout.tickDirection;\n  }\n  if (zrUtil.retrieve(opt.labelInside, axisModel.get(['axisLabel', 'inside']))) {\n    layout.labelDirection = -layout.labelDirection;\n  }\n  var labelRotate = axisModel.get(['axisLabel', 'rotate']);\n  layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate;\n  layout.z2 = 1;\n  return layout;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport AxisBuilder from './AxisBuilder.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as singleAxisHelper from '../../coord/single/singleAxisHelper.js';\nimport AxisView from './AxisView.js';\nimport { rectCoordAxisBuildSplitArea, rectCoordAxisHandleRemove } from './axisSplitHelper.js';\nimport { getAxisBreakHelper } from './axisBreakHelper.js';\nvar selfBuilderAttrs = ['splitArea', 'splitLine', 'breakArea'];\nvar SingleAxisView = /** @class */function (_super) {\n  __extends(SingleAxisView, _super);\n  function SingleAxisView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SingleAxisView.type;\n    _this.axisPointerClass = 'SingleAxisPointer';\n    return _this;\n  }\n  SingleAxisView.prototype.render = function (axisModel, ecModel, api, payload) {\n    var group = this.group;\n    group.removeAll();\n    var oldAxisGroup = this._axisGroup;\n    this._axisGroup = new graphic.Group();\n    var layout = singleAxisHelper.layout(axisModel);\n    var axisBuilder = new AxisBuilder(axisModel, api, layout);\n    axisBuilder.build();\n    group.add(this._axisGroup);\n    group.add(axisBuilder.group);\n    zrUtil.each(selfBuilderAttrs, function (name) {\n      if (axisModel.get([name, 'show'])) {\n        axisElementBuilders[name](this, this.group, this._axisGroup, axisModel, api);\n      }\n    }, this);\n    graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel);\n    _super.prototype.render.call(this, axisModel, ecModel, api, payload);\n  };\n  SingleAxisView.prototype.remove = function () {\n    rectCoordAxisHandleRemove(this);\n  };\n  SingleAxisView.type = 'singleAxis';\n  return SingleAxisView;\n}(AxisView);\nvar axisElementBuilders = {\n  splitLine: function (axisView, group, axisGroup, axisModel, api) {\n    var axis = axisModel.axis;\n    if (axis.scale.isBlank()) {\n      return;\n    }\n    var splitLineModel = axisModel.getModel('splitLine');\n    var lineStyleModel = splitLineModel.getModel('lineStyle');\n    var lineColors = lineStyleModel.get('color');\n    lineColors = lineColors instanceof Array ? lineColors : [lineColors];\n    var lineWidth = lineStyleModel.get('width');\n    var gridRect = axisModel.coordinateSystem.getRect();\n    var isHorizontal = axis.isHorizontal();\n    var splitLines = [];\n    var lineCount = 0;\n    var ticksCoords = axis.getTicksCoords({\n      tickModel: splitLineModel,\n      breakTicks: 'none',\n      pruneByBreak: 'preserve_extent_bound'\n    });\n    var p1 = [];\n    var p2 = [];\n    for (var i = 0; i < ticksCoords.length; ++i) {\n      var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);\n      if (isHorizontal) {\n        p1[0] = tickCoord;\n        p1[1] = gridRect.y;\n        p2[0] = tickCoord;\n        p2[1] = gridRect.y + gridRect.height;\n      } else {\n        p1[0] = gridRect.x;\n        p1[1] = tickCoord;\n        p2[0] = gridRect.x + gridRect.width;\n        p2[1] = tickCoord;\n      }\n      var line = new graphic.Line({\n        shape: {\n          x1: p1[0],\n          y1: p1[1],\n          x2: p2[0],\n          y2: p2[1]\n        },\n        silent: true\n      });\n      graphic.subPixelOptimizeLine(line.shape, lineWidth);\n      var colorIndex = lineCount++ % lineColors.length;\n      splitLines[colorIndex] = splitLines[colorIndex] || [];\n      splitLines[colorIndex].push(line);\n    }\n    var lineStyle = lineStyleModel.getLineStyle(['color']);\n    for (var i = 0; i < splitLines.length; ++i) {\n      group.add(graphic.mergePath(splitLines[i], {\n        style: zrUtil.defaults({\n          stroke: lineColors[i % lineColors.length]\n        }, lineStyle),\n        silent: true\n      }));\n    }\n  },\n  splitArea: function (axisView, group, axisGroup, axisModel, api) {\n    rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel);\n  },\n  breakArea: function (axisView, group, axisGroup, axisModel, api) {\n    var axisBreakHelper = getAxisBreakHelper();\n    var scale = axisModel.axis.scale;\n    if (axisBreakHelper && scale.type !== 'ordinal') {\n      axisBreakHelper.rectCoordBuildBreakAxis(group, axisView, axisModel, axisModel.coordinateSystem.getRect(), api);\n    }\n  }\n};\nexport default SingleAxisView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport { AxisModelCommonMixin } from '../axisModelCommonMixin.js';\nimport { mixin } from 'zrender/lib/core/util.js';\nvar SingleAxisModel = /** @class */function (_super) {\n  __extends(SingleAxisModel, _super);\n  function SingleAxisModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SingleAxisModel.type;\n    return _this;\n  }\n  SingleAxisModel.prototype.getCoordSysModel = function () {\n    return this;\n  };\n  SingleAxisModel.type = 'singleAxis';\n  SingleAxisModel.layoutMode = 'box';\n  SingleAxisModel.defaultOption = {\n    left: '5%',\n    top: '5%',\n    right: '5%',\n    bottom: '5%',\n    type: 'value',\n    position: 'bottom',\n    orient: 'horizontal',\n    axisLine: {\n      show: true,\n      lineStyle: {\n        width: 1,\n        type: 'solid'\n      }\n    },\n    // Single coordinate system and single axis is the,\n    // which is used as the parent tooltip model.\n    // same model, so we set default tooltip show as true.\n    tooltip: {\n      show: true\n    },\n    axisTick: {\n      show: true,\n      length: 6,\n      lineStyle: {\n        width: 1\n      }\n    },\n    axisLabel: {\n      show: true,\n      interval: 'auto'\n    },\n    splitLine: {\n      show: true,\n      lineStyle: {\n        type: 'dashed',\n        opacity: 0.2\n      }\n    },\n    jitter: 0,\n    jitterOverlap: true,\n    jitterMargin: 2\n  };\n  return SingleAxisModel;\n}(ComponentModel);\nmixin(SingleAxisModel, AxisModelCommonMixin.prototype);\nexport default SingleAxisModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Axis from '../Axis.js';\nvar SingleAxis = /** @class */function (_super) {\n  __extends(SingleAxis, _super);\n  function SingleAxis(dim, scale, coordExtent, axisType, position) {\n    var _this = _super.call(this, dim, scale, coordExtent) || this;\n    _this.type = axisType || 'value';\n    _this.position = position || 'bottom';\n    return _this;\n  }\n  /**\n   * Judge the orient of the axis.\n   */\n  SingleAxis.prototype.isHorizontal = function () {\n    var position = this.position;\n    return position === 'top' || position === 'bottom';\n  };\n  SingleAxis.prototype.pointToData = function (point, clamp) {\n    return this.coordinateSystem.pointToData(point)[0];\n  };\n  return SingleAxis;\n}(Axis);\nexport default SingleAxis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Single coordinates system.\n */\nimport SingleAxis from './SingleAxis.js';\nimport * as axisHelper from '../axisHelper.js';\nimport { createBoxLayoutReference, getLayoutRect } from '../../util/layout.js';\nimport { each } from 'zrender/lib/core/util.js';\nexport var singleDimensions = ['single'];\n/**\n * Create a single coordinates system.\n */\nvar Single = /** @class */function () {\n  function Single(axisModel, ecModel, api) {\n    this.type = 'single';\n    this.dimension = 'single';\n    /**\n     * Add it just for draw tooltip.\n     */\n    this.dimensions = singleDimensions;\n    this.axisPointerEnabled = true;\n    this.model = axisModel;\n    this._init(axisModel, ecModel, api);\n  }\n  /**\n   * Initialize single coordinate system.\n   */\n  Single.prototype._init = function (axisModel, ecModel, api) {\n    var dim = this.dimension;\n    var axis = new SingleAxis(dim, axisHelper.createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position'));\n    var isCategory = axis.type === 'category';\n    axis.onBand = isCategory && axisModel.get('boundaryGap');\n    axis.inverse = axisModel.get('inverse');\n    axis.orient = axisModel.get('orient');\n    axisModel.axis = axis;\n    axis.model = axisModel;\n    axis.coordinateSystem = this;\n    this._axis = axis;\n  };\n  /**\n   * Update axis scale after data processed\n   */\n  Single.prototype.update = function (ecModel, api) {\n    ecModel.eachSeries(function (seriesModel) {\n      if (seriesModel.coordinateSystem === this) {\n        var data_1 = seriesModel.getData();\n        each(data_1.mapDimensionsAll(this.dimension), function (dim) {\n          this._axis.scale.unionExtentFromData(data_1, dim);\n        }, this);\n        axisHelper.niceScaleExtent(this._axis.scale, this._axis.model);\n      }\n    }, this);\n  };\n  /**\n   * Resize the single coordinate system.\n   */\n  Single.prototype.resize = function (axisModel, api) {\n    var refContainer = createBoxLayoutReference(axisModel, api).refContainer;\n    this._rect = getLayoutRect(axisModel.getBoxLayoutParams(), refContainer);\n    this._adjustAxis();\n  };\n  Single.prototype.getRect = function () {\n    return this._rect;\n  };\n  Single.prototype._adjustAxis = function () {\n    var rect = this._rect;\n    var axis = this._axis;\n    var isHorizontal = axis.isHorizontal();\n    var extent = isHorizontal ? [0, rect.width] : [0, rect.height];\n    var idx = axis.inverse ? 1 : 0;\n    axis.setExtent(extent[idx], extent[1 - idx]);\n    this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y);\n  };\n  Single.prototype._updateAxisTransform = function (axis, coordBase) {\n    var axisExtent = axis.getExtent();\n    var extentSum = axisExtent[0] + axisExtent[1];\n    var isHorizontal = axis.isHorizontal();\n    axis.toGlobalCoord = isHorizontal ? function (coord) {\n      return coord + coordBase;\n    } : function (coord) {\n      return extentSum - coord + coordBase;\n    };\n    axis.toLocalCoord = isHorizontal ? function (coord) {\n      return coord - coordBase;\n    } : function (coord) {\n      return extentSum - coord + coordBase;\n    };\n  };\n  /**\n   * Get axis.\n   */\n  Single.prototype.getAxis = function () {\n    return this._axis;\n  };\n  /**\n   * Get axis, add it just for draw tooltip.\n   */\n  Single.prototype.getBaseAxis = function () {\n    return this._axis;\n  };\n  Single.prototype.getAxes = function () {\n    return [this._axis];\n  };\n  Single.prototype.getTooltipAxes = function () {\n    return {\n      baseAxes: [this.getAxis()],\n      // Empty otherAxes\n      otherAxes: []\n    };\n  };\n  /**\n   * If contain point.\n   */\n  Single.prototype.containPoint = function (point) {\n    var rect = this.getRect();\n    var axis = this.getAxis();\n    var orient = axis.orient;\n    if (orient === 'horizontal') {\n      return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n    } else {\n      return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height;\n    }\n  };\n  Single.prototype.pointToData = function (point, reserved, out) {\n    out = out || [];\n    var axis = this.getAxis();\n    out[0] = axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]));\n    return out;\n  };\n  /**\n   * Convert the series data to concrete point.\n   * Can be [val] | val\n   */\n  Single.prototype.dataToPoint = function (val, reserved, out) {\n    var axis = this.getAxis();\n    var rect = this.getRect();\n    out = out || [];\n    var idx = axis.orient === 'horizontal' ? 0 : 1;\n    if (val instanceof Array) {\n      val = val[0];\n    }\n    out[idx] = axis.toGlobalCoord(axis.dataToCoord(+val));\n    out[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2;\n    return out;\n  };\n  Single.prototype.convertToPixel = function (ecModel, finder, value) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? this.dataToPoint(value) : null;\n  };\n  Single.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? this.pointToData(pixel) : null;\n  };\n  return Single;\n}();\nfunction getCoordSys(finder) {\n  var seriesModel = finder.seriesModel;\n  var singleModel = finder.singleAxisModel;\n  return singleModel && singleModel.coordinateSystem || seriesModel && seriesModel.coordinateSystem;\n}\nexport default Single;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * Single coordinate system creator.\n */\nimport Single, { singleDimensions } from './Single.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\n/**\n * Create single coordinate system and inject it into seriesModel.\n */\nfunction create(ecModel, api) {\n  var singles = [];\n  ecModel.eachComponent('singleAxis', function (axisModel, idx) {\n    var single = new Single(axisModel, ecModel, api);\n    single.name = 'single_' + idx;\n    single.resize(axisModel, api);\n    axisModel.coordinateSystem = single;\n    singles.push(single);\n  });\n  ecModel.eachSeries(function (seriesModel) {\n    if (seriesModel.get('coordinateSystem') === 'singleAxis') {\n      var singleAxisModel = seriesModel.getReferringComponents('singleAxis', SINGLE_REFERRING).models[0];\n      seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem;\n    }\n  });\n  return singles;\n}\nvar singleCreator = {\n  create: create,\n  dimensions: singleDimensions\n};\nexport default singleCreator;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BaseAxisPointer from './BaseAxisPointer.js';\nimport * as viewHelper from './viewHelper.js';\nimport * as singleAxisHelper from '../../coord/single/singleAxisHelper.js';\nvar XY = ['x', 'y'];\nvar WH = ['width', 'height'];\nvar SingleAxisPointer = /** @class */function (_super) {\n  __extends(SingleAxisPointer, _super);\n  function SingleAxisPointer() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  /**\n   * @override\n   */\n  SingleAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) {\n    var axis = axisModel.axis;\n    var coordSys = axis.coordinateSystem;\n    var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis));\n    var pixelValue = coordSys.dataToPoint(value)[0];\n    var axisPointerType = axisPointerModel.get('type');\n    if (axisPointerType && axisPointerType !== 'none') {\n      var elStyle = viewHelper.buildElStyle(axisPointerModel);\n      var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent);\n      pointerOption.style = elStyle;\n      elOption.graphicKey = pointerOption.type;\n      elOption.pointer = pointerOption;\n    }\n    var layoutInfo = singleAxisHelper.layout(axisModel);\n    viewHelper.buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api);\n  };\n  /**\n   * @override\n   */\n  SingleAxisPointer.prototype.getHandleTransform = function (value, axisModel, axisPointerModel) {\n    var layoutInfo = singleAxisHelper.layout(axisModel, {\n      labelInside: false\n    });\n    layoutInfo.labelMargin = axisPointerModel.get(['handle', 'margin']);\n    var position = viewHelper.getTransformedPosition(axisModel.axis, value, layoutInfo);\n    return {\n      x: position[0],\n      y: position[1],\n      rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)\n    };\n  };\n  /**\n   * @override\n   */\n  SingleAxisPointer.prototype.updateHandleTransform = function (transform, delta, axisModel, axisPointerModel) {\n    var axis = axisModel.axis;\n    var coordSys = axis.coordinateSystem;\n    var dimIndex = getPointDimIndex(axis);\n    var axisExtent = getGlobalExtent(coordSys, dimIndex);\n    var currPosition = [transform.x, transform.y];\n    currPosition[dimIndex] += delta[dimIndex];\n    currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);\n    currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);\n    var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex);\n    var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;\n    var cursorPoint = [cursorOtherValue, cursorOtherValue];\n    cursorPoint[dimIndex] = currPosition[dimIndex];\n    return {\n      x: currPosition[0],\n      y: currPosition[1],\n      rotation: transform.rotation,\n      cursorPoint: cursorPoint,\n      tooltipOption: {\n        verticalAlign: 'middle'\n      }\n    };\n  };\n  return SingleAxisPointer;\n}(BaseAxisPointer);\nvar pointerShapeBuilder = {\n  line: function (axis, pixelValue, otherExtent) {\n    var targetShape = viewHelper.makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis));\n    return {\n      type: 'Line',\n      subPixelOptimize: true,\n      shape: targetShape\n    };\n  },\n  shadow: function (axis, pixelValue, otherExtent) {\n    var bandWidth = axis.getBandWidth();\n    var span = otherExtent[1] - otherExtent[0];\n    return {\n      type: 'Rect',\n      shape: viewHelper.makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis))\n    };\n  }\n};\nfunction getPointDimIndex(axis) {\n  return axis.isHorizontal() ? 0 : 1;\n}\nfunction getGlobalExtent(coordSys, dimIndex) {\n  var rect = coordSys.getRect();\n  return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]];\n}\nexport default SingleAxisPointer;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { use } from '../../extension.js';\nimport ComponentView from '../../view/Component.js';\nimport SingleAxisView from '../axis/SingleAxisView.js';\nimport axisModelCreator from '../../coord/axisModelCreator.js';\nimport SingleAxisModel from '../../coord/single/AxisModel.js';\nimport singleCreator from '../../coord/single/singleCreator.js';\nimport { install as installAxisPointer } from '../axisPointer/install.js';\nimport AxisView from '../axis/AxisView.js';\nimport SingleAxisPointer from '../axisPointer/SingleAxisPointer.js';\nvar SingleView = /** @class */function (_super) {\n  __extends(SingleView, _super);\n  function SingleView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SingleView.type;\n    return _this;\n  }\n  SingleView.type = 'single';\n  return SingleView;\n}(ComponentView);\nexport function install(registers) {\n  use(installAxisPointer);\n  AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer);\n  registers.registerComponentView(SingleView);\n  // Axis\n  registers.registerComponentView(SingleAxisView);\n  registers.registerComponentModel(SingleAxisModel);\n  axisModelCreator(registers, 'single', SingleAxisModel, SingleAxisModel.defaultOption);\n  registers.registerCoordinateSystem('single', singleCreator);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ComponentModel from '../../model/Component.js';\nimport { getLayoutParams, sizeCalculable, mergeLayoutParam } from '../../util/layout.js';\nimport tokens from '../../visual/tokens.js';\nvar CalendarModel = /** @class */function (_super) {\n  __extends(CalendarModel, _super);\n  function CalendarModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CalendarModel.type;\n    return _this;\n  }\n  /**\n   * @override\n   */\n  CalendarModel.prototype.init = function (option, parentModel, ecModel) {\n    var inputPositionParams = getLayoutParams(option);\n    _super.prototype.init.apply(this, arguments);\n    mergeAndNormalizeLayoutParams(option, inputPositionParams);\n  };\n  /**\n   * @override\n   */\n  CalendarModel.prototype.mergeOption = function (option) {\n    _super.prototype.mergeOption.apply(this, arguments);\n    mergeAndNormalizeLayoutParams(this.option, option);\n  };\n  CalendarModel.prototype.getCellSize = function () {\n    // Has been normalized\n    return this.option.cellSize;\n  };\n  CalendarModel.type = 'calendar';\n  CalendarModel.layoutMode = 'box';\n  CalendarModel.defaultOption = {\n    // zlevel: 0,\n    // TODO: theoretically, the z of the calendar should be lower\n    // than series, but we don't want the series to be displayed\n    // on top of the borders like month split line. To align with\n    // the effect of previous versions, we set the z to 2 for now\n    // until better solution is found.\n    z: 2,\n    left: 80,\n    top: 60,\n    cellSize: 20,\n    // horizontal vertical\n    orient: 'horizontal',\n    // month separate line style\n    splitLine: {\n      show: true,\n      lineStyle: {\n        color: tokens.color.axisLine,\n        width: 1,\n        type: 'solid'\n      }\n    },\n    // rect style  temporarily unused emphasis\n    itemStyle: {\n      color: tokens.color.neutral00,\n      borderWidth: 1,\n      borderColor: tokens.color.neutral10\n    },\n    // week text style\n    dayLabel: {\n      show: true,\n      firstDay: 0,\n      // start end\n      position: 'start',\n      margin: tokens.size.s,\n      color: tokens.color.secondary\n    },\n    // month text style\n    monthLabel: {\n      show: true,\n      // start end\n      position: 'start',\n      margin: tokens.size.s,\n      // center or left\n      align: 'center',\n      formatter: null,\n      color: tokens.color.secondary\n    },\n    // year text style\n    yearLabel: {\n      show: true,\n      // top bottom left right\n      position: null,\n      margin: tokens.size.xl,\n      formatter: null,\n      color: tokens.color.quaternary,\n      fontFamily: 'sans-serif',\n      fontWeight: 'bolder',\n      fontSize: 20\n    }\n  };\n  return CalendarModel;\n}(ComponentModel);\nfunction mergeAndNormalizeLayoutParams(target, raw) {\n  // Normalize cellSize\n  var cellSize = target.cellSize;\n  var cellSizeArr;\n  if (!zrUtil.isArray(cellSize)) {\n    cellSizeArr = target.cellSize = [cellSize, cellSize];\n  } else {\n    cellSizeArr = cellSize;\n  }\n  if (cellSizeArr.length === 1) {\n    cellSizeArr[1] = cellSizeArr[0];\n  }\n  var ignoreSize = zrUtil.map([0, 1], function (hvIdx) {\n    // If user have set `width` or both `left` and `right`, cellSizeArr\n    // will be automatically set to 'auto', otherwise the default\n    // setting of cellSizeArr will make `width` setting not work.\n    if (sizeCalculable(raw, hvIdx)) {\n      cellSizeArr[hvIdx] = 'auto';\n    }\n    return cellSizeArr[hvIdx] != null && cellSizeArr[hvIdx] !== 'auto';\n  });\n  mergeLayoutParam(target, raw, {\n    type: 'box',\n    ignoreSize: ignoreSize\n  });\n}\nexport default CalendarModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { isString, extend, map, isFunction } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport { formatTplSimple } from '../../util/format.js';\nimport { parsePercent } from '../../util/number.js';\nimport ComponentView from '../../view/Component.js';\nimport { getLocaleModel } from '../../core/locale.js';\nvar CalendarView = /** @class */function (_super) {\n  __extends(CalendarView, _super);\n  function CalendarView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = CalendarView.type;\n    return _this;\n  }\n  CalendarView.prototype.render = function (calendarModel, ecModel, api) {\n    var group = this.group;\n    group.removeAll();\n    var coordSys = calendarModel.coordinateSystem;\n    // range info\n    var rangeData = coordSys.getRangeInfo();\n    var orient = coordSys.getOrient();\n    // locale\n    var localeModel = ecModel.getLocaleModel();\n    this._renderDayRect(calendarModel, rangeData, group);\n    // _renderLines must be called prior to following function\n    this._renderLines(calendarModel, rangeData, orient, group);\n    this._renderYearText(calendarModel, rangeData, orient, group);\n    this._renderMonthText(calendarModel, localeModel, orient, group);\n    this._renderWeekText(calendarModel, localeModel, rangeData, orient, group);\n  };\n  // render day rect\n  CalendarView.prototype._renderDayRect = function (calendarModel, rangeData, group) {\n    var coordSys = calendarModel.coordinateSystem;\n    var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle();\n    var sw = coordSys.getCellWidth();\n    var sh = coordSys.getCellHeight();\n    for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) {\n      var point = coordSys.dataToCalendarLayout([i], false).tl;\n      // every rect\n      var rect = new graphic.Rect({\n        shape: {\n          x: point[0],\n          y: point[1],\n          width: sw,\n          height: sh\n        },\n        cursor: 'default',\n        style: itemRectStyleModel\n      });\n      group.add(rect);\n    }\n  };\n  // render separate line\n  CalendarView.prototype._renderLines = function (calendarModel, rangeData, orient, group) {\n    var self = this;\n    var coordSys = calendarModel.coordinateSystem;\n    var lineStyleModel = calendarModel.getModel(['splitLine', 'lineStyle']).getLineStyle();\n    var show = calendarModel.get(['splitLine', 'show']);\n    var lineWidth = lineStyleModel.lineWidth;\n    this._tlpoints = [];\n    this._blpoints = [];\n    this._firstDayOfMonth = [];\n    this._firstDayPoints = [];\n    var firstDay = rangeData.start;\n    for (var i = 0; firstDay.time <= rangeData.end.time; i++) {\n      addPoints(firstDay.formatedDate);\n      if (i === 0) {\n        firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m);\n      }\n      var date = firstDay.date;\n      date.setMonth(date.getMonth() + 1);\n      firstDay = coordSys.getDateInfo(date);\n    }\n    addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate);\n    function addPoints(date) {\n      self._firstDayOfMonth.push(coordSys.getDateInfo(date));\n      self._firstDayPoints.push(coordSys.dataToCalendarLayout([date], false).tl);\n      var points = self._getLinePointsOfOneWeek(calendarModel, date, orient);\n      self._tlpoints.push(points[0]);\n      self._blpoints.push(points[points.length - 1]);\n      show && self._drawSplitline(points, lineStyleModel, group);\n    }\n    // render top/left line\n    show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group);\n    // render bottom/right line\n    show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group);\n  };\n  // get points at both ends\n  CalendarView.prototype._getEdgesPoints = function (points, lineWidth, orient) {\n    var rs = [points[0].slice(), points[points.length - 1].slice()];\n    var idx = orient === 'horizontal' ? 0 : 1;\n    // both ends of the line are extend half lineWidth\n    rs[0][idx] = rs[0][idx] - lineWidth / 2;\n    rs[1][idx] = rs[1][idx] + lineWidth / 2;\n    return rs;\n  };\n  // render split line\n  CalendarView.prototype._drawSplitline = function (points, lineStyle, group) {\n    var poyline = new graphic.Polyline({\n      z2: 20,\n      shape: {\n        points: points\n      },\n      style: lineStyle\n    });\n    group.add(poyline);\n  };\n  // render month line of one week points\n  CalendarView.prototype._getLinePointsOfOneWeek = function (calendarModel, date, orient) {\n    var coordSys = calendarModel.coordinateSystem;\n    var parsedDate = coordSys.getDateInfo(date);\n    var points = [];\n    for (var i = 0; i < 7; i++) {\n      var tmpD = coordSys.getNextNDay(parsedDate.time, i);\n      var point = coordSys.dataToCalendarLayout([tmpD.time], false);\n      points[2 * tmpD.day] = point.tl;\n      points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr'];\n    }\n    return points;\n  };\n  CalendarView.prototype._formatterLabel = function (formatter, params) {\n    if (isString(formatter) && formatter) {\n      return formatTplSimple(formatter, params);\n    }\n    if (isFunction(formatter)) {\n      return formatter(params);\n    }\n    return params.nameMap;\n  };\n  CalendarView.prototype._yearTextPositionControl = function (textEl, point, orient, position, margin) {\n    var x = point[0];\n    var y = point[1];\n    var aligns = ['center', 'bottom'];\n    if (position === 'bottom') {\n      y += margin;\n      aligns = ['center', 'top'];\n    } else if (position === 'left') {\n      x -= margin;\n    } else if (position === 'right') {\n      x += margin;\n      aligns = ['center', 'top'];\n    } else {\n      // top\n      y -= margin;\n    }\n    var rotate = 0;\n    if (position === 'left' || position === 'right') {\n      rotate = Math.PI / 2;\n    }\n    return {\n      rotation: rotate,\n      x: x,\n      y: y,\n      style: {\n        align: aligns[0],\n        verticalAlign: aligns[1]\n      }\n    };\n  };\n  // render year\n  CalendarView.prototype._renderYearText = function (calendarModel, rangeData, orient, group) {\n    var yearLabel = calendarModel.getModel('yearLabel');\n    if (!yearLabel.get('show')) {\n      return;\n    }\n    var margin = yearLabel.get('margin');\n    var pos = yearLabel.get('position');\n    if (!pos) {\n      pos = orient !== 'horizontal' ? 'top' : 'left';\n    }\n    var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]];\n    var xc = (points[0][0] + points[1][0]) / 2;\n    var yc = (points[0][1] + points[1][1]) / 2;\n    var idx = orient === 'horizontal' ? 0 : 1;\n    var posPoints = {\n      top: [xc, points[idx][1]],\n      bottom: [xc, points[1 - idx][1]],\n      left: [points[1 - idx][0], yc],\n      right: [points[idx][0], yc]\n    };\n    var name = rangeData.start.y;\n    if (+rangeData.end.y > +rangeData.start.y) {\n      name = name + '-' + rangeData.end.y;\n    }\n    var formatter = yearLabel.get('formatter');\n    var params = {\n      start: rangeData.start.y,\n      end: rangeData.end.y,\n      nameMap: name\n    };\n    var content = this._formatterLabel(formatter, params);\n    var yearText = new graphic.Text({\n      z2: 30,\n      style: createTextStyle(yearLabel, {\n        text: content\n      }),\n      silent: yearLabel.get('silent')\n    });\n    yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin));\n    group.add(yearText);\n  };\n  CalendarView.prototype._monthTextPositionControl = function (point, isCenter, orient, position, margin) {\n    var align = 'left';\n    var vAlign = 'top';\n    var x = point[0];\n    var y = point[1];\n    if (orient === 'horizontal') {\n      y = y + margin;\n      if (isCenter) {\n        align = 'center';\n      }\n      if (position === 'start') {\n        vAlign = 'bottom';\n      }\n    } else {\n      x = x + margin;\n      if (isCenter) {\n        vAlign = 'middle';\n      }\n      if (position === 'start') {\n        align = 'right';\n      }\n    }\n    return {\n      x: x,\n      y: y,\n      align: align,\n      verticalAlign: vAlign\n    };\n  };\n  // render month and year text\n  CalendarView.prototype._renderMonthText = function (calendarModel, localeModel, orient, group) {\n    var monthLabel = calendarModel.getModel('monthLabel');\n    if (!monthLabel.get('show')) {\n      return;\n    }\n    var nameMap = monthLabel.get('nameMap');\n    var margin = monthLabel.get('margin');\n    var pos = monthLabel.get('position');\n    var align = monthLabel.get('align');\n    var termPoints = [this._tlpoints, this._blpoints];\n    if (!nameMap || isString(nameMap)) {\n      if (nameMap) {\n        // case-sensitive\n        localeModel = getLocaleModel(nameMap) || localeModel;\n      }\n      // PENDING\n      // for ZH locale, original form is `\u4E00\u6708` but current form is `1\u6708`\n      nameMap = localeModel.get(['time', 'monthAbbr']) || [];\n    }\n    var idx = pos === 'start' ? 0 : 1;\n    var axis = orient === 'horizontal' ? 0 : 1;\n    margin = pos === 'start' ? -margin : margin;\n    var isCenter = align === 'center';\n    var labelSilent = monthLabel.get('silent');\n    for (var i = 0; i < termPoints[idx].length - 1; i++) {\n      var tmp = termPoints[idx][i].slice();\n      var firstDay = this._firstDayOfMonth[i];\n      if (isCenter) {\n        var firstDayPoints = this._firstDayPoints[i];\n        tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2;\n      }\n      var formatter = monthLabel.get('formatter');\n      var name_1 = nameMap[+firstDay.m - 1];\n      var params = {\n        yyyy: firstDay.y,\n        yy: (firstDay.y + '').slice(2),\n        MM: firstDay.m,\n        M: +firstDay.m,\n        nameMap: name_1\n      };\n      var content = this._formatterLabel(formatter, params);\n      var monthText = new graphic.Text({\n        z2: 30,\n        style: extend(createTextStyle(monthLabel, {\n          text: content\n        }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin)),\n        silent: labelSilent\n      });\n      group.add(monthText);\n    }\n  };\n  CalendarView.prototype._weekTextPositionControl = function (point, orient, position, margin, cellSize) {\n    var align = 'center';\n    var vAlign = 'middle';\n    var x = point[0];\n    var y = point[1];\n    var isStart = position === 'start';\n    if (orient === 'horizontal') {\n      x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2;\n      align = isStart ? 'right' : 'left';\n    } else {\n      y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2;\n      vAlign = isStart ? 'bottom' : 'top';\n    }\n    return {\n      x: x,\n      y: y,\n      align: align,\n      verticalAlign: vAlign\n    };\n  };\n  // render weeks\n  CalendarView.prototype._renderWeekText = function (calendarModel, localeModel, rangeData, orient, group) {\n    var dayLabel = calendarModel.getModel('dayLabel');\n    if (!dayLabel.get('show')) {\n      return;\n    }\n    var coordSys = calendarModel.coordinateSystem;\n    var pos = dayLabel.get('position');\n    var nameMap = dayLabel.get('nameMap');\n    var margin = dayLabel.get('margin');\n    var firstDayOfWeek = coordSys.getFirstDayOfWeek();\n    if (!nameMap || isString(nameMap)) {\n      if (nameMap) {\n        // case-sensitive\n        localeModel = getLocaleModel(nameMap) || localeModel;\n      }\n      // Use the first letter of `dayOfWeekAbbr` if `dayOfWeekShort` doesn't exist in the locale file\n      var dayOfWeekShort = localeModel.get(['time', 'dayOfWeekShort']);\n      nameMap = dayOfWeekShort || map(localeModel.get(['time', 'dayOfWeekAbbr']), function (val) {\n        return val[0];\n      });\n    }\n    var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time;\n    var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()];\n    margin = parsePercent(margin, Math.min(cellSize[1], cellSize[0]));\n    if (pos === 'start') {\n      start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time;\n      margin = -margin;\n    }\n    var labelSilent = dayLabel.get('silent');\n    for (var i = 0; i < 7; i++) {\n      var tmpD = coordSys.getNextNDay(start, i);\n      var point = coordSys.dataToCalendarLayout([tmpD.time], false).center;\n      var day = i;\n      day = Math.abs((i + firstDayOfWeek) % 7);\n      var weekText = new graphic.Text({\n        z2: 30,\n        style: extend(createTextStyle(dayLabel, {\n          text: nameMap[day]\n        }), this._weekTextPositionControl(point, orient, pos, margin, cellSize)),\n        silent: labelSilent\n      });\n      group.add(weekText);\n    }\n  };\n  CalendarView.type = 'calendar';\n  return CalendarView;\n}(ComponentView);\nexport default CalendarView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as layout from '../../util/layout.js';\nimport * as numberUtil from '../../util/number.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { expandOrShrinkRect } from '../../util/graphic.js';\nimport { injectCoordSysByOption, simpleCoordSysInjectionProvider } from '../../core/CoordinateSystem.js';\n// (24*60*60*1000)\nvar PROXIMATE_ONE_DAY = 86400000;\nvar Calendar = /** @class */function () {\n  function Calendar(calendarModel, ecModel, api) {\n    this.type = 'calendar';\n    this.dimensions = Calendar.dimensions;\n    // Required in createListFromData\n    this.getDimensionsInfo = Calendar.getDimensionsInfo;\n    this._model = calendarModel;\n    this._update(ecModel, api);\n  }\n  Calendar.getDimensionsInfo = function () {\n    return [{\n      name: 'time',\n      type: 'time'\n    }, 'value'];\n  };\n  Calendar.prototype.getRangeInfo = function () {\n    return this._rangeInfo;\n  };\n  Calendar.prototype.getModel = function () {\n    return this._model;\n  };\n  Calendar.prototype.getRect = function () {\n    return this._rect;\n  };\n  Calendar.prototype.getCellWidth = function () {\n    return this._sw;\n  };\n  Calendar.prototype.getCellHeight = function () {\n    return this._sh;\n  };\n  Calendar.prototype.getOrient = function () {\n    return this._orient;\n  };\n  /**\n   * getFirstDayOfWeek\n   *\n   * @example\n   *     0 : start at Sunday\n   *     1 : start at Monday\n   *\n   * @return {number}\n   */\n  Calendar.prototype.getFirstDayOfWeek = function () {\n    return this._firstDayOfWeek;\n  };\n  /**\n   * get date info\n   * }\n   */\n  Calendar.prototype.getDateInfo = function (date) {\n    date = numberUtil.parseDate(date);\n    var y = date.getFullYear();\n    var m = date.getMonth() + 1;\n    var mStr = m < 10 ? '0' + m : '' + m;\n    var d = date.getDate();\n    var dStr = d < 10 ? '0' + d : '' + d;\n    var day = date.getDay();\n    day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7);\n    return {\n      y: y + '',\n      m: mStr,\n      d: dStr,\n      day: day,\n      time: date.getTime(),\n      formatedDate: y + '-' + mStr + '-' + dStr,\n      date: date\n    };\n  };\n  Calendar.prototype.getNextNDay = function (date, n) {\n    n = n || 0;\n    if (n === 0) {\n      return this.getDateInfo(date);\n    }\n    date = new Date(this.getDateInfo(date).time);\n    date.setDate(date.getDate() + n);\n    return this.getDateInfo(date);\n  };\n  Calendar.prototype._update = function (ecModel, api) {\n    this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay');\n    this._orient = this._model.get('orient');\n    this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0;\n    this._rangeInfo = this._getRangeInfo(this._initRangeOption());\n    var weeks = this._rangeInfo.weeks || 1;\n    var whNames = ['width', 'height'];\n    var cellSize = this._model.getCellSize().slice();\n    var layoutParams = this._model.getBoxLayoutParams();\n    var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks];\n    zrUtil.each([0, 1], function (idx) {\n      if (cellSizeSpecified(cellSize, idx)) {\n        layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx];\n      }\n    });\n    var whGlobal = {\n      width: api.getWidth(),\n      height: api.getHeight()\n    };\n    var calendarRect = this._rect = layout.getLayoutRect(layoutParams, whGlobal);\n    zrUtil.each([0, 1], function (idx) {\n      if (!cellSizeSpecified(cellSize, idx)) {\n        cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx];\n      }\n    });\n    function cellSizeSpecified(cellSize, idx) {\n      return cellSize[idx] != null && cellSize[idx] !== 'auto';\n    }\n    // Has been calculated out number.\n    this._sw = cellSize[0];\n    this._sh = cellSize[1];\n  };\n  /**\n   * Convert a time data(time, value) item to (x, y) point.\n   */\n  // TODO Clamp of calendar is not same with cartesian coordinate systems.\n  // It will return NaN if data exceeds.\n  Calendar.prototype.dataToPoint = function (data, clamp, out) {\n    out = out || [];\n    zrUtil.isArray(data) && (data = data[0]);\n    clamp == null && (clamp = true);\n    var dayInfo = this.getDateInfo(data);\n    var range = this._rangeInfo;\n    var date = dayInfo.formatedDate;\n    // if not in range return [NaN, NaN]\n    if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) {\n      out[0] = out[1] = NaN;\n      return out;\n    }\n    var week = dayInfo.day;\n    var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek;\n    if (this._orient === 'vertical') {\n      out[0] = this._rect.x + week * this._sw + this._sw / 2;\n      out[1] = this._rect.y + nthWeek * this._sh + this._sh / 2;\n    } else {\n      out[0] = this._rect.x + nthWeek * this._sw + this._sw / 2;\n      out[1] = this._rect.y + week * this._sh + this._sh / 2;\n    }\n    return out;\n  };\n  /**\n   * Convert a (x, y) point to time data\n   */\n  Calendar.prototype.pointToData = function (point) {\n    var date = this.pointToDate(point);\n    return date && date.time;\n  };\n  Calendar.prototype.dataToLayout = function (data, clamp, out) {\n    out = out || {};\n    var rect = out.rect = out.rect || {};\n    var contentRect = out.contentRect = out.contentRect || {};\n    var point = this.dataToPoint(data, clamp);\n    rect.x = point[0] - this._sw / 2;\n    rect.y = point[1] - this._sh / 2;\n    rect.width = this._sw;\n    rect.height = this._sh;\n    BoundingRect.copy(contentRect, rect);\n    expandOrShrinkRect(contentRect, this._lineWidth / 2, true, true);\n    return out;\n  };\n  /**\n   * Convert a time date item to (x, y) four point.\n   */\n  Calendar.prototype.dataToCalendarLayout = function (data, clamp) {\n    var point = this.dataToPoint(data, clamp);\n    return {\n      center: point,\n      tl: [point[0] - this._sw / 2, point[1] - this._sh / 2],\n      tr: [point[0] + this._sw / 2, point[1] - this._sh / 2],\n      br: [point[0] + this._sw / 2, point[1] + this._sh / 2],\n      bl: [point[0] - this._sw / 2, point[1] + this._sh / 2]\n    };\n  };\n  /**\n   * Convert a (x, y) point to time date\n   *\n   * @param  {Array} point point\n   * @return {Object}       date\n   */\n  Calendar.prototype.pointToDate = function (point) {\n    var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1;\n    var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1;\n    var range = this._rangeInfo.range;\n    if (this._orient === 'vertical') {\n      return this._getDateByWeeksAndDay(nthY, nthX - 1, range);\n    }\n    return this._getDateByWeeksAndDay(nthX, nthY - 1, range);\n  };\n  Calendar.prototype.convertToPixel = function (ecModel, finder, value) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.dataToPoint(value) : null;\n  };\n  Calendar.prototype.convertToLayout = function (ecModel, finder, value) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.dataToLayout(value) : null;\n  };\n  Calendar.prototype.convertFromPixel = function (ecModel, finder, pixel) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.pointToData(pixel) : null;\n  };\n  Calendar.prototype.containPoint = function (point) {\n    console.warn('Not implemented.');\n    return false;\n  };\n  /**\n   * initRange\n   * Normalize to an [start, end] array\n   */\n  Calendar.prototype._initRangeOption = function () {\n    var range = this._model.get('range');\n    var normalizedRange;\n    // Convert [1990] to 1990\n    if (zrUtil.isArray(range) && range.length === 1) {\n      range = range[0];\n    }\n    if (!zrUtil.isArray(range)) {\n      var rangeStr = range.toString();\n      // One year.\n      if (/^\\d{4}$/.test(rangeStr)) {\n        normalizedRange = [rangeStr + '-01-01', rangeStr + '-12-31'];\n      }\n      // One month\n      if (/^\\d{4}[\\/|-]\\d{1,2}$/.test(rangeStr)) {\n        var start = this.getDateInfo(rangeStr);\n        var firstDay = start.date;\n        firstDay.setMonth(firstDay.getMonth() + 1);\n        var end = this.getNextNDay(firstDay, -1);\n        normalizedRange = [start.formatedDate, end.formatedDate];\n      }\n      // One day\n      if (/^\\d{4}[\\/|-]\\d{1,2}[\\/|-]\\d{1,2}$/.test(rangeStr)) {\n        normalizedRange = [rangeStr, rangeStr];\n      }\n    } else {\n      normalizedRange = range;\n    }\n    if (!normalizedRange) {\n      if (process.env.NODE_ENV !== 'production') {\n        zrUtil.logError('Invalid date range.');\n      }\n      // Not handling it.\n      return range;\n    }\n    var tmp = this._getRangeInfo(normalizedRange);\n    if (tmp.start.time > tmp.end.time) {\n      normalizedRange.reverse();\n    }\n    return normalizedRange;\n  };\n  /**\n   * range info\n   *\n   * @private\n   * @param  {Array} range range ['2017-01-01', '2017-07-08']\n   *  If range[0] > range[1], they will not be reversed.\n   * @return {Object}       obj\n   */\n  Calendar.prototype._getRangeInfo = function (range) {\n    var parsedRange = [this.getDateInfo(range[0]), this.getDateInfo(range[1])];\n    var reversed;\n    if (parsedRange[0].time > parsedRange[1].time) {\n      reversed = true;\n      parsedRange.reverse();\n    }\n    var allDay = Math.floor(parsedRange[1].time / PROXIMATE_ONE_DAY) - Math.floor(parsedRange[0].time / PROXIMATE_ONE_DAY) + 1;\n    // Consider case1 (#11677 #10430):\n    // Set the system timezone as \"UK\", set the range to `['2016-07-01', '2016-12-31']`\n    // Consider case2:\n    // Firstly set system timezone as \"Time Zone: America/Toronto\",\n    // ```\n    // let first = new Date(1478412000000 - 3600 * 1000 * 2.5);\n    // let second = new Date(1478412000000);\n    // let allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1;\n    // ```\n    // will get wrong result because of DST. So we should fix it.\n    var date = new Date(parsedRange[0].time);\n    var startDateNum = date.getDate();\n    var endDateNum = parsedRange[1].date.getDate();\n    date.setDate(startDateNum + allDay - 1);\n    // The bias can not over a month, so just compare date.\n    var dateNum = date.getDate();\n    if (dateNum !== endDateNum) {\n      var sign = date.getTime() - parsedRange[1].time > 0 ? 1 : -1;\n      while ((dateNum = date.getDate()) !== endDateNum && (date.getTime() - parsedRange[1].time) * sign > 0) {\n        allDay -= sign;\n        date.setDate(dateNum - sign);\n      }\n    }\n    var weeks = Math.floor((allDay + parsedRange[0].day + 6) / 7);\n    var nthWeek = reversed ? -weeks + 1 : weeks - 1;\n    reversed && parsedRange.reverse();\n    return {\n      range: [parsedRange[0].formatedDate, parsedRange[1].formatedDate],\n      start: parsedRange[0],\n      end: parsedRange[1],\n      allDay: allDay,\n      weeks: weeks,\n      // From 0.\n      nthWeek: nthWeek,\n      fweek: parsedRange[0].day,\n      lweek: parsedRange[1].day\n    };\n  };\n  /**\n   * get date by nthWeeks and week day in range\n   *\n   * @private\n   * @param  {number} nthWeek the week\n   * @param  {number} day   the week day\n   * @param  {Array} range [d1, d2]\n   * @return {Object}\n   */\n  Calendar.prototype._getDateByWeeksAndDay = function (nthWeek, day, range) {\n    var rangeInfo = this._getRangeInfo(range);\n    if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) {\n      return null;\n    }\n    var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day;\n    var date = new Date(rangeInfo.start.time);\n    date.setDate(+rangeInfo.start.d + nthDay);\n    return this.getDateInfo(date);\n  };\n  Calendar.create = function (ecModel, api) {\n    var calendarList = [];\n    ecModel.eachComponent('calendar', function (calendarModel) {\n      var calendar = new Calendar(calendarModel, ecModel, api);\n      calendarList.push(calendar);\n      calendarModel.coordinateSystem = calendar;\n    });\n    // Inject coordinate system\n    ecModel.eachComponent(function (mainType, componentModel) {\n      injectCoordSysByOption({\n        targetModel: componentModel,\n        coordSysType: 'calendar',\n        coordSysProvider: simpleCoordSysInjectionProvider\n      });\n    });\n    return calendarList;\n  };\n  Calendar.dimensions = ['time', 'value'];\n  return Calendar;\n}();\nfunction getCoordSys(finder) {\n  var calendarModel = finder.calendarModel;\n  var seriesModel = finder.seriesModel;\n  var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null;\n  return coordSys;\n}\nexport default Calendar;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport CalendarModel from '../../coord/calendar/CalendarModel.js';\nimport CalendarView from './CalendarView.js';\nimport Calendar from '../../coord/calendar/Calendar.js';\nexport function install(registers) {\n  registers.registerComponentModel(CalendarModel);\n  registers.registerComponentView(CalendarView);\n  registers.registerCoordinateSystem('calendar', Calendar);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { eqNaN, isArray, isNumber } from 'zrender/lib/core/util.js';\nimport { WH, XY } from '../../util/graphic.js';\nimport { mathMax, mathMin } from '../../util/number.js';\nexport var MatrixCellLayoutInfoType = {\n  level: 1,\n  leaf: 2,\n  nonLeaf: 3\n};\n/**\n * @public Public to users in `chart.convertFromPixel`.\n */\nexport var MatrixClampOption = {\n  // No clamp, be falsy, equals to null/undefined. It means if the input part is\n  // null/undefined/NaN/outOfBoundary, the result part is NaN, rather than clamp to\n  // the boundary of the matrix.\n  none: 0,\n  // Clamp, where null/undefined/NaN/outOfBoundary can be used to cover the entire row/column.\n  all: 1,\n  body: 2,\n  corner: 3\n};\n/**\n * For the x direction,\n *  - find dimension cell from `xMatrixDim`,\n *      - If `xDimCell` or `yDimCell` is not a leaf, return the non-leaf cell itself.\n *  - otherwise find level from `yMatrixDim`.\n *  - otherwise return `NullUndefined`.\n *\n * For the y direction, it's the opposite.\n */\nexport function coordDataToAllCellLevelLayout(coordValue, dims, thisDimIdx // 0 | 1\n) {\n  // Find in body.\n  var result = dims[XY[thisDimIdx]].getCell(coordValue);\n  // Find in corner or dimension area.\n  if (!result && isNumber(coordValue) && coordValue < 0) {\n    result = dims[XY[1 - thisDimIdx]].getUnitLayoutInfo(thisDimIdx, Math.round(coordValue));\n  }\n  return result;\n}\nexport function resetXYLocatorRange(out) {\n  var rg = out || [];\n  rg[0] = rg[0] || [];\n  rg[1] = rg[1] || [];\n  rg[0][0] = rg[0][1] = rg[1][0] = rg[1][1] = NaN;\n  return rg;\n}\n/**\n * If illegal or out of boundary, set NaN to `locOut`. See `isXYLocatorRangeInvalidOnDim`.\n * x dimension and y dimension are calculated separately.\n */\nexport function parseCoordRangeOption(locOut,\n// If illegal input or can not find any target, save reason to it.\n// Do nothing if `NullUndefined`.\nreasonOut, data, dims, clamp) {\n  // x and y are supported to be handled separately - if one dimension is invalid\n  // (may be users do not need that), the other one should also be calculated.\n  parseCoordRangeOptionOnOneDim(locOut[0], reasonOut, clamp, data, dims, 0);\n  parseCoordRangeOptionOnOneDim(locOut[1], reasonOut, clamp, data, dims, 1);\n}\nfunction parseCoordRangeOptionOnOneDim(locDimOut, reasonOut, clamp, data, dims, dimIdx) {\n  locDimOut[0] = Infinity;\n  locDimOut[1] = -Infinity;\n  var dataOnDim = data[dimIdx];\n  var coordValArr = isArray(dataOnDim) ? dataOnDim : [dataOnDim];\n  var len = coordValArr.length;\n  var hasClamp = !!clamp;\n  if (len >= 1) {\n    parseCoordRangeOptionOnOneDimOnePart(locDimOut, reasonOut, coordValArr, hasClamp, dims, dimIdx, 0);\n    if (len > 1) {\n      // Users may intuitively input the coords like `[[x1, x2, x3], ...]`;\n      // consider the range as `[x1, x3]` in this case.\n      parseCoordRangeOptionOnOneDimOnePart(locDimOut, reasonOut, coordValArr, hasClamp, dims, dimIdx, len - 1);\n    }\n  } else {\n    if (process.env.NODE_ENV !== 'production') {\n      if (reasonOut) {\n        reasonOut.push('Should be like [[\"x1\", \"x2\"], [\"y1\", \"y2\"]], or [\"x1\", \"y1\"], rather than empty.');\n      }\n    }\n    locDimOut[0] = locDimOut[1] = NaN;\n  }\n  if (hasClamp) {\n    // null/undefined/NaN or illegal data represents the entire row/column;\n    // Cover the entire locator regardless of body or corner, and confine it later.\n    var locLowerBound = -dims[XY[1 - dimIdx]].getLocatorCount(dimIdx);\n    var locUpperBound = dims[XY[dimIdx]].getLocatorCount(dimIdx) - 1;\n    if (clamp === MatrixClampOption.body) {\n      locLowerBound = mathMax(0, locLowerBound);\n    } else if (clamp === MatrixClampOption.corner) {\n      locUpperBound = mathMin(-1, locUpperBound);\n    }\n    if (locUpperBound < locLowerBound) {\n      // Also considered that both x and y has no cell.\n      locLowerBound = locUpperBound = NaN;\n    }\n    if (eqNaN(locDimOut[0])) {\n      locDimOut[0] = locLowerBound;\n    }\n    if (eqNaN(locDimOut[1])) {\n      locDimOut[1] = locUpperBound;\n    }\n    locDimOut[0] = mathMax(mathMin(locDimOut[0], locUpperBound), locLowerBound);\n    locDimOut[1] = mathMax(mathMin(locDimOut[1], locUpperBound), locLowerBound);\n  }\n}\n// The return val must be finite or NaN.\nfunction parseCoordRangeOptionOnOneDimOnePart(locDimOut, reasonOut, coordValArr, hasClamp, dims, dimIdx, partIdx) {\n  var layout = coordDataToAllCellLevelLayout(coordValArr[partIdx], dims, dimIdx);\n  if (!layout) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!hasClamp && reasonOut) {\n        reasonOut.push(\"Can not find cell by coord[\" + dimIdx + \"][\" + partIdx + \"].\");\n      }\n    }\n    locDimOut[0] = locDimOut[1] = NaN;\n    return;\n  }\n  var locatorA = layout.id[XY[dimIdx]];\n  var locatorB = locatorA;\n  var dimCell = cellLayoutInfoToDimCell(layout);\n  if (dimCell) {\n    // Handle non-leaf\n    locatorB += dimCell.span[XY[dimIdx]] - 1;\n  }\n  locDimOut[0] = mathMin(locDimOut[0], locatorA, locatorB);\n  locDimOut[1] = mathMax(locDimOut[1], locatorA, locatorB);\n}\n/**\n * @param locatorRange Must be the return of `parseCoordRangeOption`,\n *  where if not NaN, it must be a valid locator.\n */\nexport function isXYLocatorRangeInvalidOnDim(locatorRange, dimIdx) {\n  return eqNaN(locatorRange[dimIdx][0]) || eqNaN(locatorRange[dimIdx][1]);\n}\n// `locatorRange` will be expanded (modified) if an intersection is encountered.\nexport function resolveXYLocatorRangeByCellMerge(inOutLocatorRange,\n// Item indices coorespond to mergeDefList (len: mergeDefListTravelLen).\n// Indicating whether each item has be merged into the `locatorRange`\noutMergedMarkList, mergeDefList, mergeDefListTravelLen) {\n  outMergedMarkList = outMergedMarkList || _tmpOutMergedMarkList;\n  for (var idx = 0; idx < mergeDefListTravelLen; idx++) {\n    outMergedMarkList[idx] = false;\n  }\n  // In most case, cell merging definition list length is smaller than the range extent,\n  // therefore, to detection intersection, travelling cell merging definition list is probably\n  // performant than traveling the four edges of the rect formed by the locator range.\n  while (true) {\n    var expanded = false;\n    for (var idx = 0; idx < mergeDefListTravelLen; idx++) {\n      var mergeDef = mergeDefList[idx];\n      if (!outMergedMarkList[idx] && mergeDef.cellMergeOwner && expandXYLocatorRangeIfIntersect(inOutLocatorRange, mergeDef.locatorRange)) {\n        outMergedMarkList[idx] = true;\n        expanded = true;\n      }\n    }\n    if (!expanded) {\n      break;\n    }\n  }\n}\nvar _tmpOutMergedMarkList = [];\n// Return whether intersect.\n// `thisLocRange` will be expanded (modified) if an intersection is encountered.\nfunction expandXYLocatorRangeIfIntersect(thisLocRange, otherLocRange) {\n  if (!locatorRangeIntersectOneDim(thisLocRange[0], otherLocRange[0]) || !locatorRangeIntersectOneDim(thisLocRange[1], otherLocRange[1])) {\n    return false;\n  }\n  thisLocRange[0][0] = mathMin(thisLocRange[0][0], otherLocRange[0][0]);\n  thisLocRange[0][1] = mathMax(thisLocRange[0][1], otherLocRange[0][1]);\n  thisLocRange[1][0] = mathMin(thisLocRange[1][0], otherLocRange[1][0]);\n  thisLocRange[1][1] = mathMax(thisLocRange[1][1], otherLocRange[1][1]);\n  return true;\n}\n// Notice: If containing NaN, not intersect.\nfunction locatorRangeIntersectOneDim(locRange1OneDim, locRange2OneDim) {\n  return locRange1OneDim[1] >= locRange2OneDim[0] && locRange1OneDim[0] <= locRange2OneDim[1];\n}\nexport function fillIdSpanFromLocatorRange(owner, locatorRange) {\n  owner.id.set(locatorRange[0][0], locatorRange[1][0]);\n  owner.span.set(locatorRange[0][1] - owner.id.x + 1, locatorRange[1][1] - owner.id.y + 1);\n}\nexport function cloneXYLocatorRange(target, source) {\n  target[0][0] = source[0][0];\n  target[0][1] = source[0][1];\n  target[1][0] = source[1][0];\n  target[1][1] = source[1][1];\n}\n/**\n * If illegal, the corresponding x/y/width/height is set to `NaN`.\n * `x/width` or `y/height` is supported to be calculated separately,\n * i.e., one side are NaN, the other side are normal.\n * @param oneDimOut only write to `x/width` or `y/height`, depending on `dimIdx`.\n */\nexport function xyLocatorRangeToRectOneDim(oneDimOut, locRange, dims, dimIdx) {\n  var layoutMin = coordDataToAllCellLevelLayout(locRange[dimIdx][0], dims, dimIdx);\n  var layoutMax = coordDataToAllCellLevelLayout(locRange[dimIdx][1], dims, dimIdx);\n  oneDimOut[XY[dimIdx]] = oneDimOut[WH[dimIdx]] = NaN;\n  if (layoutMin && layoutMax) {\n    oneDimOut[XY[dimIdx]] = layoutMin.xy;\n    oneDimOut[WH[dimIdx]] = layoutMax.xy + layoutMax.wh - layoutMin.xy;\n  }\n}\n// No need currently, since `span` is not allowed to be defined directly by users.\n// /**\n//  * If either span x or y is valid and > 1, return parsed span, otherwise return `NullUndefined`.\n//  */\n// export function parseSpanOption(\n//     spanOptionHost: MatrixCellSpanOptionHost,\n//     dimCellPair: MatrixCellLayoutInfo[]\n// ): Point | NullUndefined {\n//     const spanX = parseSpanOnDim(spanOptionHost.spanX, dimCellPair[0], 0);\n//     const spanY = parseSpanOnDim(spanOptionHost.spanY, dimCellPair[1], 1);\n//     if (!eqNaN(spanX) || !eqNaN(spanY)) {\n//         return new Point(spanX || 1, spanY || 1);\n//     }\n//     function parseSpanOnDim(spanOption: unknown, dimCell: MatrixCellLayoutInfo, dimIdx: number): number {\n//         if (!isNumber(spanOption)) {\n//             return NaN;\n//         }\n//         // Ensure positive integer (not NaN) to avoid dead loop.\n//         const span = mathMax(1, Math.round(spanOption || 1)) || 1;\n//         // Clamp, and consider may also be specified as `Infinity` to span the entire col/row.\n//         return mathMin(span, mathMax(1, dimCell.dim.getLocatorCount(dimIdx) - dimCell.id[XY[dimIdx]]));\n//     }\n// }\n/**\n * @usage To get/set on dimension, use:\n *  `xyVal[XY[dim]] = val;` // set on this dimension.\n *  `xyVal[XY[1 - dim]] = val;` // set on the perpendicular dimension.\n */\nexport function setDimXYValue(out, dimIdx,\n// 0 | 1\nvalueOnThisDim, valueOnOtherDim) {\n  out[XY[dimIdx]] = valueOnThisDim;\n  out[XY[1 - dimIdx]] = valueOnOtherDim;\n  return out;\n}\n/**\n * Return NullUndefined if not dimension cell.\n */\nfunction cellLayoutInfoToDimCell(cellLayoutInfo) {\n  return cellLayoutInfo && (cellLayoutInfo.type === MatrixCellLayoutInfoType.leaf || cellLayoutInfo.type === MatrixCellLayoutInfoType.nonLeaf) ? cellLayoutInfo : null;\n}\nexport function createNaNRectLike() {\n  return {\n    x: NaN,\n    y: NaN,\n    width: NaN,\n    height: NaN\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, defaults, each, eqNaN, isArray, isObject, isString } from 'zrender/lib/core/util.js';\nimport Point from 'zrender/lib/core/Point.js';\nimport OrdinalMeta from '../../data/OrdinalMeta.js';\nimport Ordinal from '../../scale/Ordinal.js';\nimport { WH, XY } from '../../util/graphic.js';\nimport { ListIterator } from '../../util/model.js';\nimport { createNaNRectLike, setDimXYValue, MatrixCellLayoutInfoType } from './matrixCoordHelper.js';\nimport { error } from '../../util/log.js';\nimport { mathMax } from '../../util/number.js';\n/**\n * Lifetime: the same with `MatrixModel`, but different from `coord/Matrix`.\n */\nvar MatrixDim = /** @class */function () {\n  function MatrixDim(dim, dimModel) {\n    // Under the current definition, every leave corresponds a unit cell,\n    // and leaves can serve as the locator of cells.\n    // Therefore make sure:\n    //  - The first `_leavesCount` elements in `_cells` are leaves.\n    //  - `_cells[leaf.id[XY[this.dimIdx]]]` is the leaf itself.\n    //  - Leaves of each subtree are placed together, that is, the leaves of a dimCell are:\n    //    `this._cells.slice(dimCell.firstLeafLocator, dimCell.span[XY[this.dimIdx]])`\n    this._cells = [];\n    // Can be visited by `_levels[cell.level]` or `_levels[cell.id[1 - dimIdx] + _levels.length]`.\n    // Items are never be null/undefined after initialized.\n    this._levels = [];\n    this.dim = dim;\n    this.dimIdx = dim === 'x' ? 0 : 1;\n    this._model = dimModel;\n    this._uniqueValueGen = createUniqueValueGenerator(dim);\n    var dimModelData = dimModel.get('data', true);\n    if (dimModelData != null && !isArray(dimModelData)) {\n      if (process.env.NODE_ENV !== 'production') {\n        error(\"Illegal echarts option - matrix.\" + this.dim + \".data must be an array if specified.\");\n      }\n      dimModelData = [];\n    }\n    if (dimModelData) {\n      this._initByDimModelData(dimModelData);\n    } else {\n      this._initBySeriesData();\n    }\n  }\n  MatrixDim.prototype._initByDimModelData = function (dimModelData) {\n    var self = this;\n    var _cells = self._cells;\n    var _levels = self._levels;\n    var sameLocatorCellsLists = []; // Save for sorting.\n    var _cellCount = 0;\n    self._leavesCount = traverseInitCells(dimModelData, 0, 0);\n    postInitCells();\n    return;\n    function traverseInitCells(dimModelData, firstLeafLocator, level) {\n      var totalSpan = 0;\n      if (!dimModelData) {\n        return totalSpan;\n      }\n      each(dimModelData, function (option, optionIdx) {\n        var invalidOption = false;\n        var cellOption;\n        if (isString(option)) {\n          cellOption = {\n            value: option\n          };\n        } else if (isObject(option)) {\n          cellOption = option;\n          if (option.value != null && !isString(option.value)) {\n            invalidOption = true;\n            cellOption = {\n              value: null\n            };\n          }\n        } else {\n          cellOption = {\n            value: null\n          };\n          if (option != null) {\n            invalidOption = true;\n          }\n        }\n        if (invalidOption) {\n          if (process.env.NODE_ENV !== 'production') {\n            error(\"Illegal echarts option - matrix.\" + self.dim + \".data[\" + optionIdx + \"]\" + ' must be `string | {value: string}`.');\n          }\n        }\n        var cell = {\n          type: MatrixCellLayoutInfoType.nonLeaf,\n          ordinal: NaN,\n          level: level,\n          firstLeafLocator: firstLeafLocator,\n          id: new Point(),\n          span: setDimXYValue(new Point(), self.dimIdx, 1, 1),\n          option: cellOption,\n          xy: NaN,\n          wh: NaN,\n          dim: self,\n          rect: createNaNRectLike()\n        };\n        _cellCount++;\n        (sameLocatorCellsLists[firstLeafLocator] || (sameLocatorCellsLists[firstLeafLocator] = [])).push(cell);\n        if (!_levels[level]) {\n          // Create a level only if at least one cell exists.\n          _levels[level] = {\n            type: MatrixCellLayoutInfoType.level,\n            xy: NaN,\n            wh: NaN,\n            option: null,\n            id: new Point(),\n            dim: self\n          };\n        }\n        var childrenSpan = traverseInitCells(cellOption.children, firstLeafLocator, level + 1);\n        var subSpan = Math.max(1, childrenSpan);\n        cell.span[XY[self.dimIdx]] = subSpan;\n        totalSpan += subSpan;\n        firstLeafLocator += subSpan;\n      });\n      return totalSpan;\n    }\n    function postInitCells() {\n      // Sort to make sure the leaves are at the beginning, so that\n      // they can be used as the locator of body cells.\n      var categories = [];\n      while (_cells.length < _cellCount) {\n        for (var locator = 0; locator < sameLocatorCellsLists.length; locator++) {\n          var cell = sameLocatorCellsLists[locator].pop();\n          if (cell) {\n            cell.ordinal = categories.length;\n            var val = cell.option.value;\n            categories.push(val);\n            _cells.push(cell);\n            self._uniqueValueGen.calcDupBase(val);\n          }\n        }\n      }\n      self._uniqueValueGen.ensureValueUnique(categories, _cells);\n      var ordinalMeta = self._ordinalMeta = new OrdinalMeta({\n        categories: categories,\n        needCollect: false,\n        deduplication: false\n      });\n      self._scale = new Ordinal({\n        ordinalMeta: ordinalMeta\n      });\n      for (var idx = 0; idx < self._leavesCount; idx++) {\n        var leaf = self._cells[idx];\n        leaf.type = MatrixCellLayoutInfoType.leaf;\n        // Handle the tree level variation: enlarge the span of the leaves to reach the body cells.\n        leaf.span[XY[1 - self.dimIdx]] = self._levels.length - leaf.level;\n      }\n      self._initCellsId();\n      self._initLevelIdOptions();\n    }\n  };\n  MatrixDim.prototype._initBySeriesData = function () {\n    var self = this;\n    self._leavesCount = 0;\n    self._levels = [{\n      type: MatrixCellLayoutInfoType.level,\n      xy: NaN,\n      wh: NaN,\n      option: null,\n      id: new Point(),\n      dim: self\n    }];\n    self._initLevelIdOptions();\n    var ordinalMeta = self._ordinalMeta = new OrdinalMeta({\n      needCollect: true,\n      deduplication: true,\n      onCollect: function (value, ordinalNumber) {\n        var cell = self._cells[ordinalNumber] = {\n          type: MatrixCellLayoutInfoType.leaf,\n          ordinal: ordinalNumber,\n          level: 0,\n          firstLeafLocator: ordinalNumber,\n          id: new Point(),\n          span: setDimXYValue(new Point(), self.dimIdx, 1, 1),\n          // Theoretically `value` is from `dataset` or `series.data`, so it may be any type.\n          // Do not restrict this case for user's convenience, and here simply convert it to\n          // string for display.\n          option: {\n            value: value + ''\n          },\n          xy: NaN,\n          wh: NaN,\n          dim: self,\n          rect: createNaNRectLike()\n        };\n        self._leavesCount++;\n        self._setCellId(cell);\n      }\n    });\n    self._scale = new Ordinal({\n      ordinalMeta: ordinalMeta\n    });\n  };\n  MatrixDim.prototype._setCellId = function (cell) {\n    var levelsLen = this._levels.length;\n    var dimIdx = this.dimIdx;\n    setDimXYValue(cell.id, dimIdx, cell.firstLeafLocator, cell.level - levelsLen);\n  };\n  MatrixDim.prototype._initCellsId = function () {\n    var levelsLen = this._levels.length;\n    var dimIdx = this.dimIdx;\n    each(this._cells, function (cell) {\n      setDimXYValue(cell.id, dimIdx, cell.firstLeafLocator, cell.level - levelsLen);\n    });\n  };\n  MatrixDim.prototype._initLevelIdOptions = function () {\n    var levelsLen = this._levels.length;\n    var dimIdx = this.dimIdx;\n    var levelOptionList = this._model.get('levels', true);\n    levelOptionList = isArray(levelOptionList) ? levelOptionList : [];\n    each(this._levels, function (levelCfg, level) {\n      setDimXYValue(levelCfg.id, dimIdx, 0, level - levelsLen);\n      levelCfg.option = levelOptionList[level];\n    });\n  };\n  MatrixDim.prototype.shouldShow = function () {\n    return !!this._model.getShallow('show', true);\n  };\n  /**\n   * Iterate leaves (they are layout units) if dimIdx === this.dimIdx.\n   * Iterate levels if dimIdx !== this.dimIdx.\n   */\n  MatrixDim.prototype.resetLayoutIterator = function (it, dimIdx, startLocator, count) {\n    it = it || new ListIterator();\n    if (dimIdx === this.dimIdx) {\n      var len = this._leavesCount;\n      var startIdx = startLocator != null ? Math.max(0, startLocator) : 0;\n      count = count != null ? Math.min(count, len) : len;\n      it.reset(this._cells, startIdx, startIdx + count);\n    } else {\n      var len = this._levels.length;\n      // Corner locator is from `-this._levels.length` to `-1`.\n      var startIdx = startLocator != null ? Math.max(0, startLocator + len) : 0;\n      count = count != null ? Math.min(count, len) : len;\n      it.reset(this._levels, startIdx, startIdx + count);\n    }\n    return it;\n  };\n  MatrixDim.prototype.resetCellIterator = function (it) {\n    return (it || new ListIterator()).reset(this._cells, 0);\n  };\n  MatrixDim.prototype.resetLevelIterator = function (it) {\n    return (it || new ListIterator()).reset(this._levels, 0);\n  };\n  MatrixDim.prototype.getLayout = function (outRect, dimIdx, locator) {\n    var layout = this.getUnitLayoutInfo(dimIdx, locator);\n    outRect[XY[dimIdx]] = layout ? layout.xy : NaN;\n    outRect[WH[dimIdx]] = layout ? layout.wh : NaN;\n  };\n  /**\n   * Get leaf cell or get level info.\n   * Should be able to return null/undefined if not found on x or y, thus input `dimIdx` is needed.\n   */\n  MatrixDim.prototype.getUnitLayoutInfo = function (dimIdx, locator) {\n    return dimIdx === this.dimIdx ? locator < this._leavesCount ? this._cells[locator] : undefined : this._levels[locator + this._levels.length];\n  };\n  /**\n   * Get dimension cell by data, including leaves and non-leaves.\n   */\n  MatrixDim.prototype.getCell = function (value) {\n    var ordinal = this._scale.parse(value);\n    return eqNaN(ordinal) ? undefined : this._cells[ordinal];\n  };\n  /**\n   * Get leaf count or get level count.\n   */\n  MatrixDim.prototype.getLocatorCount = function (dimIdx) {\n    return dimIdx === this.dimIdx ? this._leavesCount : this._levels.length;\n  };\n  MatrixDim.prototype.getOrdinalMeta = function () {\n    return this._ordinalMeta;\n  };\n  return MatrixDim;\n}();\nexport { MatrixDim };\nfunction createUniqueValueGenerator(dim) {\n  var dimUpper = dim.toUpperCase();\n  var defaultValReg = new RegExp(\"^\" + dimUpper + \"([0-9]+)$\");\n  var dupBase = 0;\n  function calcDupBase(val) {\n    var matchResult;\n    if (val != null && (matchResult = val.match(defaultValReg))) {\n      dupBase = mathMax(dupBase, +matchResult[1] + 1);\n    }\n  }\n  function makeUniqueValue() {\n    return \"\" + dimUpper + dupBase++;\n  }\n  // Duplicated value is allowed, because the `matrix.x/y.data` can be a tree and it's reasonable\n  // that leaves in different subtrees has the same text. But only the first one is allowed to be\n  // queried by the text, and the other ones can only be queried by index.\n  // Additionally, `matrix.x/y.data: [null, null, ...]` is allowed.\n  function ensureValueUnique(categories, cells) {\n    // A simple way to deduplicate or handle illegal or not specified values to avoid unexpected behaviors.\n    // The tree structure should not be broken even if duplicated.\n    var cateMap = createHashMap();\n    for (var idx = 0; idx < categories.length; idx++) {\n      var value = categories[idx];\n      // value may be set to NullUndefined by users or if illegal.\n      if (value == null || cateMap.get(value) != null) {\n        // Still display the original option.value if duplicated, but loose the ability to query by text.\n        categories[idx] = value = makeUniqueValue();\n        cells[idx].option = defaults({\n          value: value\n        }, cells[idx].option);\n      }\n      cateMap.set(value, true);\n    }\n  }\n  return {\n    calcDupBase: calcDupBase,\n    ensureValueUnique: ensureValueUnique\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, each, extend, isArray, isObject } from 'zrender/lib/core/util.js';\nimport { error } from '../../util/log.js';\nimport Point from 'zrender/lib/core/Point.js';\nimport { resolveXYLocatorRangeByCellMerge, MatrixClampOption, parseCoordRangeOption, fillIdSpanFromLocatorRange, createNaNRectLike, isXYLocatorRangeInvalidOnDim, resetXYLocatorRange, cloneXYLocatorRange } from './matrixCoordHelper.js';\n/**\n * Lifetime: the same with `MatrixModel`, but different from `coord/Matrix`.\n */\nvar MatrixBodyCorner = /** @class */function () {\n  function MatrixBodyCorner(kind, bodyOrCornerModel, dims) {\n    this._model = bodyOrCornerModel;\n    this._dims = dims;\n    this._kind = kind;\n    this._cellMergeOwnerList = [];\n  }\n  /**\n   * Can not be called before series models initialization finished, since the ordinalMeta may\n   * use collect the values from `series.data` in series initialization.\n   */\n  MatrixBodyCorner.prototype._ensureCellMap = function () {\n    var self = this;\n    var _cellMap = self._cellMap;\n    if (!_cellMap) {\n      _cellMap = self._cellMap = createHashMap();\n      fillCellMap();\n    }\n    return _cellMap;\n    function fillCellMap() {\n      var parsedList = [];\n      var cellOptionList = self._model.getShallow('data');\n      if (cellOptionList && !isArray(cellOptionList)) {\n        if (process.env.NODE_ENV !== 'production') {\n          error(\"matrix.\" + cellOptionList + \".data must be an array if specified.\");\n        }\n        cellOptionList = null;\n      }\n      each(cellOptionList, function (option, idx) {\n        if (!isObject(option) || !isArray(option.coord)) {\n          if (process.env.NODE_ENV !== 'production') {\n            error(\"Illegal matrix.\" + self._kind + \".data[\" + idx + \"], must be a {coord: [...], ...}\");\n          }\n          return;\n        }\n        var locatorRange = resetXYLocatorRange([]);\n        var reasonArr = null;\n        if (process.env.NODE_ENV !== 'production') {\n          reasonArr = [];\n        }\n        parseCoordRangeOption(locatorRange, reasonArr, option.coord, self._dims, option.coordClamp ? MatrixClampOption[self._kind] : MatrixClampOption.none);\n        if (isXYLocatorRangeInvalidOnDim(locatorRange, 0) || isXYLocatorRangeInvalidOnDim(locatorRange, 1)) {\n          if (process.env.NODE_ENV !== 'production') {\n            error(\"Can not determine cells by option matrix.\" + self._kind + \".data[\" + idx + \"]: \" + (\"\" + reasonArr.join(' ')));\n          }\n          return;\n        }\n        var cellMergeOwner = option && option.mergeCells;\n        var parsed = {\n          id: new Point(),\n          span: new Point(),\n          locatorRange: locatorRange,\n          option: option,\n          cellMergeOwner: cellMergeOwner\n        };\n        fillIdSpanFromLocatorRange(parsed, locatorRange);\n        // The order of the `parsedList` determines the precedence of the styles, if there\n        // are overlaps between ranges specified in different items. Preserve the original\n        // order of `matrix.body/corner/data` to make it predictable for users.\n        parsedList.push(parsed);\n      });\n      // Resolve cell merging intersection - union to a larger rect.\n      var mergedMarkList = [];\n      for (var parsedIdx = 0; parsedIdx < parsedList.length; parsedIdx++) {\n        var parsed = parsedList[parsedIdx];\n        if (!parsed.cellMergeOwner) {\n          continue;\n        }\n        var locatorRange = parsed.locatorRange;\n        resolveXYLocatorRangeByCellMerge(locatorRange, mergedMarkList, parsedList, parsedIdx);\n        for (var idx = 0; idx < parsedIdx; idx++) {\n          if (mergedMarkList[idx]) {\n            parsedList[idx].cellMergeOwner = false;\n          }\n        }\n        if (locatorRange[0][0] !== parsed.id.x || locatorRange[1][0] !== parsed.id.y) {\n          // The top-left cell of the unioned locatorRange is not this cell any more.\n          parsed.cellMergeOwner = false;\n          // Reconcile: simply use the last style and value option if multiple styles involved\n          // in a merged area, since there might be no commonly used merge strategy.\n          var newOption = extend({}, parsed.option);\n          newOption.coord = null;\n          var newParsed = {\n            id: new Point(),\n            span: new Point(),\n            locatorRange: locatorRange,\n            option: newOption,\n            cellMergeOwner: true\n          };\n          fillIdSpanFromLocatorRange(newParsed, locatorRange);\n          parsedList.push(newParsed);\n        }\n      }\n      // Assign options to cells.\n      each(parsedList, function (parsed) {\n        var topLeftCell = ensureBodyOrCornerCell(parsed.id.x, parsed.id.y);\n        if (parsed.cellMergeOwner) {\n          topLeftCell.cellMergeOwner = true;\n          topLeftCell.span = parsed.span;\n          topLeftCell.locatorRange = parsed.locatorRange;\n          topLeftCell.spanRect = createNaNRectLike();\n          self._cellMergeOwnerList.push(topLeftCell);\n        }\n        if (!parsed.cellMergeOwner && !parsed.option) {\n          return;\n        }\n        for (var yidx = 0; yidx < parsed.span.y; yidx++) {\n          for (var xidx = 0; xidx < parsed.span.x; xidx++) {\n            var cell = ensureBodyOrCornerCell(parsed.id.x + xidx, parsed.id.y + yidx);\n            // If multiple style options are defined on a cell, the later ones takes precedence.\n            cell.option = parsed.option;\n            if (parsed.cellMergeOwner) {\n              cell.inSpanOf = topLeftCell;\n            }\n          }\n        }\n      });\n    } // End of fillCellMap\n    function ensureBodyOrCornerCell(x, y) {\n      var key = makeCellMapKey(x, y);\n      var cell = _cellMap.get(key);\n      if (!cell) {\n        cell = _cellMap.set(key, {\n          id: new Point(x, y),\n          option: null,\n          inSpanOf: null,\n          span: null,\n          spanRect: null,\n          locatorRange: null,\n          cellMergeOwner: false\n        });\n      }\n      return cell;\n    }\n  };\n  /**\n   * Body cells or corner cell are not commonly defined specifically, especially in a large\n   * table, thus his is a sparse data structure - bodys or corner cells exist only if there\n   * are options specified to it (in `matrix.body.data` or `matrix.corner.data`);\n   * otherwise, return `NullUndefined`.\n   */\n  MatrixBodyCorner.prototype.getCell = function (xy) {\n    // Assert xy do not contain NaN\n    return this._ensureCellMap().get(makeCellMapKey(xy[0], xy[1]));\n  };\n  /**\n   * Only cell existing (has specific definition or props) will be travelled.\n   */\n  MatrixBodyCorner.prototype.travelExistingCells = function (cb) {\n    this._ensureCellMap().each(cb);\n  };\n  /**\n   * @param locatorRange Must be the return of `parseCoordRangeOption`.\n   */\n  MatrixBodyCorner.prototype.expandRangeByCellMerge = function (locatorRange) {\n    if (!isXYLocatorRangeInvalidOnDim(locatorRange, 0) && !isXYLocatorRangeInvalidOnDim(locatorRange, 1) && locatorRange[0][0] === locatorRange[0][1] && locatorRange[1][0] === locatorRange[1][1]) {\n      // If it locates to a single cell, use this quick path to avoid travelling.\n      // It is based on the fact that any cell is not contained by more than one cell merging rect.\n      _tmpERBCMLocator[0] = locatorRange[0][0];\n      _tmpERBCMLocator[1] = locatorRange[1][0];\n      var cell = this.getCell(_tmpERBCMLocator);\n      var inSpanOf = cell && cell.inSpanOf;\n      if (inSpanOf) {\n        cloneXYLocatorRange(locatorRange, inSpanOf.locatorRange);\n        return;\n      }\n    }\n    var list = this._cellMergeOwnerList;\n    resolveXYLocatorRangeByCellMerge(locatorRange, null, list, list.length);\n  };\n  return MatrixBodyCorner;\n}();\nexport { MatrixBodyCorner };\nvar _tmpERBCMLocator = [];\nfunction makeCellMapKey(x, y) {\n  return x + \"|\" + y;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport Model from '../../model/Model.js';\nimport { MatrixDim } from './MatrixDim.js';\nimport { MatrixBodyCorner } from './MatrixBodyCorner.js';\nimport tokens from '../../visual/tokens.js';\nvar defaultLabelOption = {\n  show: true,\n  color: tokens.color.secondary,\n  // overflow: 'truncate',\n  overflow: 'break',\n  lineOverflow: 'truncate',\n  padding: [2, 3, 2, 3],\n  // Prefer to use `padding`, rather than distance.\n  distance: 0\n};\nfunction makeDefaultCellItemStyleOption(isCorner) {\n  return {\n    color: 'none',\n    borderWidth: 1,\n    borderColor: isCorner ? 'none' : tokens.color.borderTint\n  };\n}\n;\nvar defaultDimOption = {\n  show: true,\n  label: defaultLabelOption,\n  itemStyle: makeDefaultCellItemStyleOption(false),\n  silent: undefined,\n  dividerLineStyle: {\n    width: 1,\n    color: tokens.color.border\n  }\n};\nvar defaultBodyOption = {\n  label: defaultLabelOption,\n  itemStyle: makeDefaultCellItemStyleOption(false),\n  silent: undefined\n};\nvar defaultCornerOption = {\n  label: defaultLabelOption,\n  itemStyle: makeDefaultCellItemStyleOption(true),\n  silent: undefined\n};\nvar defaultMatrixOption = {\n  // As a most basic coord sys, `z` should be lower than\n  // other series and coord sys, such as, grid.\n  z: -50,\n  left: '10%',\n  top: '10%',\n  right: '10%',\n  bottom: '10%',\n  x: defaultDimOption,\n  y: defaultDimOption,\n  body: defaultBodyOption,\n  corner: defaultCornerOption,\n  backgroundStyle: {\n    color: 'none',\n    borderColor: tokens.color.axisLine,\n    borderWidth: 1\n  }\n};\nvar MatrixModel = /** @class */function (_super) {\n  __extends(MatrixModel, _super);\n  function MatrixModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MatrixModel.type;\n    return _this;\n  }\n  MatrixModel.prototype.optionUpdated = function () {\n    // Simply re-create all to follow model changes.\n    var dimModels = this._dimModels = {\n      // Do not use matrixModel as the parent model, for preventing from cascade-fetching options to it.\n      x: new MatrixDimensionModel(this.get('x', true) || {}),\n      y: new MatrixDimensionModel(this.get('y', true) || {})\n    };\n    dimModels.x.option.type = dimModels.y.option.type = 'category';\n    var xDim = dimModels.x.dim = new MatrixDim('x', dimModels.x);\n    var yDim = dimModels.y.dim = new MatrixDim('y', dimModels.y);\n    var dims = {\n      x: xDim,\n      y: yDim\n    };\n    this._body = new MatrixBodyCorner('body', new Model(this.getShallow('body')), dims);\n    this._corner = new MatrixBodyCorner('corner', new Model(this.getShallow('corner')), dims);\n  };\n  MatrixModel.prototype.getDimensionModel = function (dim) {\n    return this._dimModels[dim];\n  };\n  MatrixModel.prototype.getBody = function () {\n    return this._body;\n  };\n  MatrixModel.prototype.getCorner = function () {\n    return this._corner;\n  };\n  MatrixModel.type = 'matrix';\n  MatrixModel.layoutMode = 'box';\n  MatrixModel.defaultOption = defaultMatrixOption;\n  return MatrixModel;\n}(ComponentModel);\nvar MatrixDimensionModel = /** @class */function (_super) {\n  __extends(MatrixDimensionModel, _super);\n  function MatrixDimensionModel() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  MatrixDimensionModel.prototype.getOrdinalMeta = function () {\n    return this.dim.getOrdinalMeta();\n  };\n  return MatrixDimensionModel;\n}(Model);\nexport { MatrixDimensionModel };\nexport default MatrixModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nimport Model from '../../model/Model.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport * as vectorUtil from 'zrender/lib/core/vector.js';\nimport { subPixelOptimize } from 'zrender/lib/graphic/helper/subPixelOptimize.js';\nimport { Rect, Line, XY, setTooltipConfig, expandOrShrinkRect } from '../../util/graphic.js';\nimport { clearTmpModel, ListIterator } from '../../util/model.js';\nimport { clone, retrieve2 } from 'zrender/lib/core/util.js';\nimport { invert } from 'zrender/lib/core/matrix.js';\nimport { setLabelStyle } from '../../label/labelStyle.js';\nvar round = Math.round;\nvar Z2_BACKGROUND = 0;\nvar Z2_OUTER_BORDER = 99;\nvar Z2_BODY_CORNER_CELL_DEFAULT = {\n  normal: 25,\n  special: 100\n};\nvar Z2_DIMENSION_CELL_DEFAULT = {\n  normal: 50,\n  special: 125\n};\nvar MatrixView = /** @class */function (_super) {\n  __extends(MatrixView, _super);\n  function MatrixView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MatrixView.type;\n    return _this;\n  }\n  MatrixView.prototype.render = function (matrixModel, ecModel) {\n    this.group.removeAll();\n    var group = this.group;\n    var coordSys = matrixModel.coordinateSystem;\n    var rect = coordSys.getRect();\n    var xDimModel = matrixModel.getDimensionModel('x');\n    var yDimModel = matrixModel.getDimensionModel('y');\n    var xDim = xDimModel.dim;\n    var yDim = yDimModel.dim;\n    // PENDING:\n    //  reuse the existing text and rect elements for performance?\n    renderDimensionCells(group, matrixModel, ecModel);\n    createBodyAndCorner(group, matrixModel, xDim, yDim, ecModel);\n    var borderZ2Option = matrixModel.getShallow('borderZ2', true);\n    var outerBorderZ2 = retrieve2(borderZ2Option, Z2_OUTER_BORDER);\n    var dividerLineZ2 = outerBorderZ2 - 1;\n    // Outer border and overall background. Use separate elements because of z-order:\n    // The overall background should appear below any other elements.\n    // But in most cases, the outer border and the divider line should be above the normal cell borders -\n    // especially when cell borders have different colors. But users may highlight some specific cells by\n    // overstirking their border, in which case it should be above the outer border.\n    var bgStyle = matrixModel.getModel('backgroundStyle').getItemStyle(['borderWidth']);\n    bgStyle.lineWidth = 0;\n    var borderStyle = matrixModel.getModel('backgroundStyle').getItemStyle(['color', 'decal', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY']);\n    borderStyle.fill = 'none';\n    var bgRect = createMatrixRect(rect.clone(), bgStyle, Z2_BACKGROUND);\n    var borderRect = createMatrixRect(rect.clone(), borderStyle, outerBorderZ2);\n    bgRect.silent = true;\n    borderRect.silent = true;\n    group.add(bgRect);\n    group.add(borderRect);\n    // Header split line.\n    var xDimCell0 = xDim.getUnitLayoutInfo(0, 0);\n    var yDimCell0 = yDim.getUnitLayoutInfo(1, 0);\n    if (xDimCell0 && yDimCell0) {\n      if (xDim.shouldShow()) {\n        group.add(createMatrixLine({\n          x1: rect.x,\n          y1: yDimCell0.xy,\n          x2: rect.x + rect.width,\n          y2: yDimCell0.xy\n        }, xDimModel.getModel('dividerLineStyle').getLineStyle(), dividerLineZ2));\n      }\n      if (yDim.shouldShow()) {\n        group.add(createMatrixLine({\n          x1: xDimCell0.xy,\n          y1: rect.y,\n          x2: xDimCell0.xy,\n          y2: rect.y + rect.height\n        }, yDimModel.getModel('dividerLineStyle').getLineStyle(), dividerLineZ2));\n      }\n    }\n  };\n  MatrixView.type = 'matrix';\n  return MatrixView;\n}(ComponentView);\nfunction renderDimensionCells(group, matrixModel, ecModel) {\n  renderOnDimension(0);\n  renderOnDimension(1);\n  function renderOnDimension(dimIdx) {\n    var thisDimModel = matrixModel.getDimensionModel(XY[dimIdx]);\n    var thisDim = thisDimModel.dim;\n    if (!thisDim.shouldShow()) {\n      return;\n    }\n    var thisDimBgStyleModel = thisDimModel.getModel('itemStyle');\n    var thisDimLabelModel = thisDimModel.getModel('label');\n    var tooltipOption = matrixModel.getShallow('tooltip', true);\n    var xyLocator = [];\n    for (var it_1 = thisDim.resetCellIterator(); it_1.next();) {\n      var dimCell = it_1.item;\n      var shape = {};\n      BoundingRect.copy(shape, dimCell.rect);\n      vectorUtil.set(xyLocator, dimCell.id.x, dimCell.id.y);\n      createMatrixCell(xyLocator, matrixModel, group, ecModel, dimCell.option, thisDimBgStyleModel, thisDimLabelModel, thisDimModel, shape, dimCell.option.value, Z2_DIMENSION_CELL_DEFAULT, tooltipOption);\n    }\n  }\n}\nfunction createBodyAndCorner(group, matrixModel, xDim, yDim, ecModel) {\n  createBodyOrCornerCells('body', matrixModel.getBody(), xDim, yDim);\n  if (xDim.shouldShow() && yDim.shouldShow()) {\n    createBodyOrCornerCells('corner', matrixModel.getCorner(), yDim, xDim);\n  }\n  function createBodyOrCornerCells(bodyCornerOptionRoot, bodyOrCorner, dimForCoordX,\n  // Can be `matrix.y` (transposed) for corners.\n  dimForCoordY) {\n    // Prevent inheriting from ancestor.\n    var parentCellModel = new Model(matrixModel.getShallow(bodyCornerOptionRoot, true));\n    var parentItemStyleModel = parentCellModel.getModel('itemStyle');\n    var parentLabelModel = parentCellModel.getModel('label');\n    var itx = new ListIterator();\n    var ity = new ListIterator();\n    var xyLocator = [];\n    var tooltipOption = matrixModel.getShallow('tooltip', true);\n    for (dimForCoordY.resetLayoutIterator(ity, 1); ity.next();) {\n      for (dimForCoordX.resetLayoutIterator(itx, 0); itx.next();) {\n        var xLayout = itx.item;\n        var yLayout = ity.item;\n        vectorUtil.set(xyLocator, xLayout.id.x, yLayout.id.y);\n        var bodyCornerCell = bodyOrCorner.getCell(xyLocator);\n        // If in span of an other body or corner cell, never render it.\n        if (bodyCornerCell && bodyCornerCell.inSpanOf && bodyCornerCell.inSpanOf !== bodyCornerCell) {\n          continue;\n        }\n        var shape = {};\n        if (bodyCornerCell && bodyCornerCell.span) {\n          BoundingRect.copy(shape, bodyCornerCell.spanRect);\n        } else {\n          xLayout.dim.getLayout(shape, 0, xyLocator[0]);\n          yLayout.dim.getLayout(shape, 1, xyLocator[1]);\n        }\n        var bodyCornerCellOption = bodyCornerCell ? bodyCornerCell.option : null;\n        createMatrixCell(xyLocator, matrixModel, group, ecModel, bodyCornerCellOption, parentItemStyleModel, parentLabelModel, parentCellModel, shape, bodyCornerCellOption ? bodyCornerCellOption.value : null, Z2_BODY_CORNER_CELL_DEFAULT, tooltipOption);\n      }\n    }\n  } // End of createBodyOrCornerCells\n}\nfunction createMatrixCell(xyLocator, matrixModel, group, ecModel, cellOption, parentItemStyleModel, parentLabelModel, parentCellModel, shape, textValue, zrCellDefault, tooltipOption) {\n  var _a;\n  // Do not use getModel for handy performance optimization.\n  _tmpCellItemStyleModel.option = cellOption ? cellOption.itemStyle : null;\n  _tmpCellItemStyleModel.parentModel = parentItemStyleModel;\n  _tmpCellModel.option = cellOption;\n  _tmpCellModel.parentModel = parentCellModel;\n  // Use different z2 because special border may be defined in itemStyle.\n  var z2 = retrieve2(_tmpCellModel.getShallow('z2'), cellOption && cellOption.itemStyle ? zrCellDefault.special : zrCellDefault.normal);\n  var tooltipOptionShow = tooltipOption && tooltipOption.show;\n  var cellRect = createMatrixRect(shape, _tmpCellItemStyleModel.getItemStyle(), z2);\n  group.add(cellRect);\n  var cursorOption = _tmpCellModel.get('cursor');\n  if (cursorOption != null) {\n    cellRect.attr('cursor', cursorOption);\n  }\n  var cellText;\n  if (textValue != null) {\n    var text = textValue + '';\n    _tmpCellLabelModel.option = cellOption ? cellOption.label : null;\n    _tmpCellLabelModel.parentModel = parentLabelModel;\n    // This is to accept `option.textStyle` as the default.\n    _tmpCellLabelModel.ecModel = ecModel;\n    setLabelStyle(cellRect,\n    // Currently do not support other states (`emphasis`, `select`, `blur`)\n    {\n      normal: _tmpCellLabelModel\n    }, {\n      defaultText: text,\n      autoOverflowArea: true,\n      // By default based on boundingRect. But boundingRect contains borderWidth,\n      // and borderWidth is half outside the cell. Thus specific `layoutRect` explicitly.\n      layoutRect: clone(cellRect.shape)\n    });\n    cellText = cellRect.getTextContent();\n    if (cellText) {\n      cellText.z2 = z2 + 1;\n      var style = cellText.style;\n      if (style && style.overflow && style.overflow !== 'none' && style.lineOverflow) {\n        // `overflow: 'break'/'breakAll'/'truncate'` does not guarantee prevention of overflow\n        // when space is insufficient. Use a `clipPath` in such case.\n        var clipShape = {};\n        BoundingRect.copy(clipShape, shape);\n        // `lineWidth` is half outside half inside the bounding rect.\n        expandOrShrinkRect(clipShape, (((_a = cellRect.style) === null || _a === void 0 ? void 0 : _a.lineWidth) || 0) / 2, true, true);\n        cellRect.updateInnerText();\n        cellText.getLocalTransform(_tmpInnerTextTrans);\n        invert(_tmpInnerTextTrans, _tmpInnerTextTrans);\n        BoundingRect.applyTransform(clipShape, clipShape, _tmpInnerTextTrans);\n        cellText.setClipPath(new Rect({\n          shape: clipShape\n        }));\n      }\n    }\n    setTooltipConfig({\n      el: cellRect,\n      componentModel: matrixModel,\n      itemName: text,\n      itemTooltipOption: tooltipOption,\n      formatterParamsExtra: {\n        xyLocator: xyLocator.slice()\n      }\n    });\n  }\n  // Set silent\n  if (cellText) {\n    var labelSilent = _tmpCellLabelModel.get('silent');\n    // auto, tooltip of text cells need silient: false, but non-text cells\n    // do not need a special cursor in most cases.\n    if (labelSilent == null) {\n      labelSilent = !tooltipOptionShow;\n    }\n    cellText.silent = labelSilent;\n    cellText.ignoreHostSilent = true;\n  }\n  var rectSilent = _tmpCellModel.get('silent');\n  if (rectSilent == null) {\n    rectSilent =\n    // If no background color in cell, set `rect.silent: false` will cause that only\n    // the border response to mouse hovering, which is probably weird.\n    !cellRect.style || cellRect.style.fill === 'none' || !cellRect.style.fill;\n  }\n  cellRect.silent = rectSilent;\n  clearTmpModel(_tmpCellModel);\n  clearTmpModel(_tmpCellItemStyleModel);\n  clearTmpModel(_tmpCellLabelModel);\n}\nvar _tmpCellModel = new Model();\nvar _tmpCellItemStyleModel = new Model();\nvar _tmpCellLabelModel = new Model();\nvar _tmpInnerTextTrans = [];\n// FIXME: move all of the subpixel process to Matrix.ts resize, otherwise the result of\n// `dataToLayout` is not consistent with this rendering, and the caller (like heatmap) can\n// not precisely align with the matrix border.\nfunction createMatrixRect(shape, style, z2) {\n  // Currently `subPixelOptimizeRect` can not be used here because it will break rect alignment.\n  // Optimize line and rect with the same direction.\n  var lineWidth = style.lineWidth;\n  if (lineWidth) {\n    var x2Original = shape.x + shape.width;\n    var y2Original = shape.y + shape.height;\n    shape.x = subPixelOptimize(shape.x, lineWidth, true);\n    shape.y = subPixelOptimize(shape.y, lineWidth, true);\n    shape.width = subPixelOptimize(x2Original, lineWidth, true) - shape.x;\n    shape.height = subPixelOptimize(y2Original, lineWidth, true) - shape.y;\n  }\n  return new Rect({\n    shape: shape,\n    style: style,\n    z2: z2\n  });\n}\nfunction createMatrixLine(shape, style, z2) {\n  var lineWidth = style.lineWidth;\n  if (lineWidth) {\n    if (round(shape.x1 * 2) === round(shape.x2 * 2)) {\n      shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);\n    }\n    if (round(shape.y1 * 2) === round(shape.y2 * 2)) {\n      shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);\n    }\n  }\n  return new Line({\n    shape: shape,\n    style: style,\n    silent: true,\n    z2: z2\n  });\n}\nexport default MatrixView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { getLayoutRect } from '../../util/layout.js';\nimport { ListIterator } from '../../util/model.js';\nimport { eqNaN, isArray, retrieve2 } from 'zrender/lib/core/util.js';\nimport { WH, XY } from '../../util/graphic.js';\nimport Model from '../../model/Model.js';\nimport { mathMax, mathMin, parsePositionSizeOption } from '../../util/number.js';\nimport { createNaNRectLike, MatrixClampOption, MatrixCellLayoutInfoType, parseCoordRangeOption, resetXYLocatorRange, xyLocatorRangeToRectOneDim } from './matrixCoordHelper.js';\nimport { error } from '../../util/log.js';\nimport { injectCoordSysByOption, simpleCoordSysInjectionProvider } from '../../core/CoordinateSystem.js';\nvar Matrix = /** @class */function () {\n  function Matrix(matrixModel, ecModel, api) {\n    this.dimensions = Matrix.dimensions;\n    this.type = 'matrix';\n    this._model = matrixModel;\n    var models = this._dimModels = {\n      x: matrixModel.getDimensionModel('x'),\n      y: matrixModel.getDimensionModel('y')\n    };\n    this._dims = {\n      x: models.x.dim,\n      y: models.y.dim\n    };\n    this._resize(matrixModel, api);\n  }\n  /**\n   * @see fetchers in `model/referHelper.ts`,\n   * which is used to parse data in ordinal way.\n   * In most series only 'x' and 'y' is required,\n   * but some series, such as heatmap, can specify value.\n   */\n  Matrix.getDimensionsInfo = function () {\n    return [{\n      name: 'x',\n      type: 'ordinal'\n    }, {\n      name: 'y',\n      type: 'ordinal'\n    }, {\n      name: 'value'\n    }];\n  };\n  Matrix.create = function (ecModel, api) {\n    var matrixList = [];\n    ecModel.eachComponent('matrix', function (matrixModel) {\n      var matrix = new Matrix(matrixModel, ecModel, api);\n      matrixList.push(matrix);\n      matrixModel.coordinateSystem = matrix;\n    });\n    // Inject coordinate system\n    // PENDING: optimize to not to travel all components?\n    //  (collect relevant components in ecModel only when model update?)\n    ecModel.eachComponent(function (mainType, componentModel) {\n      injectCoordSysByOption({\n        targetModel: componentModel,\n        coordSysType: 'matrix',\n        coordSysProvider: simpleCoordSysInjectionProvider\n      });\n    });\n    return matrixList;\n  };\n  Matrix.prototype.getRect = function () {\n    return this._rect;\n  };\n  Matrix.prototype._resize = function (matrixModel, api) {\n    var dims = this._dims;\n    var dimModels = this._dimModels;\n    var rect = this._rect = getLayoutRect(matrixModel.getBoxLayoutParams(), {\n      width: api.getWidth(),\n      height: api.getHeight()\n    });\n    layOutUnitsOnDimension(dimModels, dims, rect, 0);\n    layOutUnitsOnDimension(dimModels, dims, rect, 1);\n    layOutDimCellsRestInfoByUnit(0, dims);\n    layOutDimCellsRestInfoByUnit(1, dims);\n    layOutBodyCornerCellMerge(this._model.getBody(), dims);\n    layOutBodyCornerCellMerge(this._model.getCorner(), dims);\n  };\n  /**\n   * @implement\n   * - The input is allowed to be `[NaN/null/undefined, xxx]`/`[xxx, NaN/null/undefined]`;\n   *  the return is `[NaN, xxxresult]`/`[xxxresult, NaN]` or clamped boundary value if\n   *  `clamp` passed. This is for the usage that only get coord on single x or y.\n   * - Alwasy return an numeric array, but never be null/undefined.\n   *  If it can not be located or invalid, return `[NaN, NaN]`.\n   */\n  Matrix.prototype.dataToPoint = function (data, opt, out) {\n    out = out || [];\n    this.dataToLayout(data, opt, _dtpOutDataToLayout);\n    out[0] = _dtpOutDataToLayout.rect.x + _dtpOutDataToLayout.rect.width / 2;\n    out[1] = _dtpOutDataToLayout.rect.y + _dtpOutDataToLayout.rect.height / 2;\n    return out;\n  };\n  /**\n   * @implement\n   * - The input is allowed to be `[NaN/null/undefined, xxx]`/`[xxx, NaN/null/undefined]`;\n   *  the return is `{x: NaN, width: NaN, y: xxxresulty, height: xxxresulth}`/\n   *  `{y: NaN, height: NaN, x: xxxresultx, width: xxxresultw}` or clamped boundary value\n   *  if `clamp` passed. This is for the usage that only get coord on single x or y.\n   * - The returned `out.rect` and `out.matrixXYLocatorRange` is always an object or an 2d-array,\n   *  but never be null/undefined. If it cannot be located or invalid, `NaN` is in their\n   *  corresponding number props.\n   * - Do not provide `out.contentRect`, because it's allowed to input non-leaf dimension x/y or\n   *  a range of x/y, which determines a rect covering multiple cells (even not merged), in which\n   *  case the padding and borderWidth can not be determined to make a contentRect. Therefore only\n   *  return `out.rect` in any case for consistency. The caller is responsible for adding space to\n   *  avoid covering cell borders, if necessary.\n   */\n  Matrix.prototype.dataToLayout = function (data, opt, out) {\n    var dims = this._dims;\n    out = out || {};\n    var outRect = out.rect = out.rect || {};\n    outRect.x = outRect.y = outRect.width = outRect.height = NaN;\n    var outLocRange = out.matrixXYLocatorRange = resetXYLocatorRange(out.matrixXYLocatorRange);\n    if (!isArray(data)) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('Input data must be an array in `convertToLayout`, `convertToPixel`');\n      }\n      return out;\n    }\n    parseCoordRangeOption(outLocRange, null, data, dims, retrieve2(opt && opt.clamp, MatrixClampOption.none));\n    if (!opt || !opt.ignoreMergeCells) {\n      if (!opt || opt.clamp !== MatrixClampOption.corner) {\n        this._model.getBody().expandRangeByCellMerge(outLocRange);\n      }\n      if (!opt || opt.clamp !== MatrixClampOption.body) {\n        this._model.getCorner().expandRangeByCellMerge(outLocRange);\n      }\n    }\n    xyLocatorRangeToRectOneDim(outRect, outLocRange, dims, 0);\n    xyLocatorRangeToRectOneDim(outRect, outLocRange, dims, 1);\n    return out;\n  };\n  /**\n   * The returned locator pair can be the input of `dataToPoint` or `dataToLayout`.\n   *\n   * If point[0] is out of the matrix rect,\n   *  the out[0] is NaN;\n   * else if it is on the right of top-left corner of body,\n   *  the out[0] is the oridinal number (>= 0).\n   * else\n   *  out[0] is the locator for corner or header (<= 0).\n   *\n   * The same rule goes for point[1] and out[1].\n   *\n   * But point[0] and point[1] are calculated separately, i.e.,\n   * the reuslt can be `[1, NaN]` or `[NaN, 1]` if only one dimension is out of boundary.\n   *\n   * @implement\n   */\n  Matrix.prototype.pointToData = function (point, opt, out) {\n    var dims = this._dims;\n    pointToDataOneDimPrepareCtx(_tmpCtxPointToData, 0, dims, point, opt && opt.clamp);\n    pointToDataOneDimPrepareCtx(_tmpCtxPointToData, 1, dims, point, opt && opt.clamp);\n    out = out || [];\n    out[0] = out[1] = NaN;\n    if (_tmpCtxPointToData.y === CtxPointToDataAreaType.inCorner && _tmpCtxPointToData.x === CtxPointToDataAreaType.inBody) {\n      pointToDataOnlyHeaderFillOut(_tmpCtxPointToData, out, 0, dims);\n    } else if (_tmpCtxPointToData.x === CtxPointToDataAreaType.inCorner && _tmpCtxPointToData.y === CtxPointToDataAreaType.inBody) {\n      pointToDataOnlyHeaderFillOut(_tmpCtxPointToData, out, 1, dims);\n    } else {\n      pointToDataBodyCornerFillOut(_tmpCtxPointToData, out, 0, dims);\n      pointToDataBodyCornerFillOut(_tmpCtxPointToData, out, 1, dims);\n    }\n    return out;\n  };\n  Matrix.prototype.convertToPixel = function (ecModel, finder, value, opt) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.dataToPoint(value, opt) : undefined;\n  };\n  Matrix.prototype.convertToLayout = function (ecModel, finder, value, opt) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.dataToLayout(value, opt) : undefined;\n  };\n  Matrix.prototype.convertFromPixel = function (ecModel, finder, pixel, opt) {\n    var coordSys = getCoordSys(finder);\n    return coordSys === this ? coordSys.pointToData(pixel, opt) : undefined;\n  };\n  Matrix.prototype.containPoint = function (point) {\n    return this._rect.contain(point[0], point[1]);\n  };\n  Matrix.dimensions = ['x', 'y', 'value'];\n  return Matrix;\n}();\nvar _dtpOutDataToLayout = {\n  rect: createNaNRectLike()\n};\nvar _ptdLevelIt = new ListIterator();\nvar _ptdDimCellIt = new ListIterator();\nfunction layOutUnitsOnDimension(dimModels, dims, matrixRect, dimIdx) {\n  var otherDimIdx = 1 - dimIdx;\n  var thisDim = dims[XY[dimIdx]];\n  var otherDim = dims[XY[otherDimIdx]];\n  // Notice: If matrix.x/y.show is false, still lay out, to ensure the\n  // consistent return of `dataToLayout`.\n  var otherDimShow = otherDim.shouldShow();\n  // Reset\n  for (var it_1 = thisDim.resetCellIterator(); it_1.next();) {\n    it_1.item.wh = it_1.item.xy = NaN;\n  }\n  for (var it_2 = otherDim.resetLayoutIterator(null, dimIdx); it_2.next();) {\n    it_2.item.wh = it_2.item.xy = NaN;\n  }\n  // Set specified size from option.\n  var restSize = matrixRect[WH[dimIdx]];\n  var restCellsCount = thisDim.getLocatorCount(dimIdx) + otherDim.getLocatorCount(dimIdx);\n  var tmpLevelModel = new Model();\n  for (var it_3 = otherDim.resetLevelIterator(); it_3.next();) {\n    // Consider `matrix.x.levelSize` and `matrix.x.levels[i].levelSize`.\n    tmpLevelModel.option = it_3.item.option;\n    tmpLevelModel.parentModel = dimModels[XY[otherDimIdx]];\n    layOutSpecified(it_3.item, otherDimShow ? tmpLevelModel.get('levelSize') : 0);\n  }\n  var tmpCellModel = new Model();\n  for (var it_4 = thisDim.resetCellIterator(); it_4.next();) {\n    // Only leaf support size specification, to avoid unnecessary complexity.\n    if (it_4.item.type === MatrixCellLayoutInfoType.leaf) {\n      tmpCellModel.option = it_4.item.option;\n      tmpCellModel.parentModel = undefined;\n      layOutSpecified(it_4.item, tmpCellModel.get('size'));\n    }\n  }\n  function layOutSpecified(item, sizeOption) {\n    var size = parseSizeOption(sizeOption, dimIdx, matrixRect);\n    if (!eqNaN(size)) {\n      item.wh = confineSize(size, restSize);\n      restSize = confineSize(restSize - item.wh);\n      restCellsCount--;\n    }\n  }\n  // Set all sizes and positions to levels and leaf cells of which size is unspecified.\n  // Contents lay out based on matrix, rather than inverse; therefore do not support\n  // calculating size based on content, but allocate equally.\n  var computedCellWH = restCellsCount ? restSize / restCellsCount : 0;\n  // If all size specified, but some space remain (may also caused by matrix.x/y.show: false)\n  // do not align to the big most edge.\n  var notAlignToBigmost = !restCellsCount && restSize >= 1; // `1` for cumulative precision error.\n  var currXY = matrixRect[XY[dimIdx]];\n  var maxLocator = thisDim.getLocatorCount(dimIdx) - 1;\n  var it = new ListIterator();\n  // Lay out levels of the perpendicular dim.\n  for (otherDim.resetLayoutIterator(it, dimIdx); it.next();) {\n    layOutUnspecified(it.item);\n  }\n  for (thisDim.resetLayoutIterator(it, dimIdx); it.next();) {\n    layOutUnspecified(it.item);\n  }\n  function layOutUnspecified(item) {\n    if (eqNaN(item.wh)) {\n      item.wh = computedCellWH;\n    }\n    item.xy = currXY;\n    if (item.id[XY[dimIdx]] === maxLocator && !notAlignToBigmost) {\n      // Align to the rightmost border, consider cumulative precision error.\n      item.wh = matrixRect[XY[dimIdx]] + matrixRect[WH[dimIdx]] - item.xy;\n    }\n    currXY += item.wh;\n  }\n}\nfunction layOutDimCellsRestInfoByUnit(dimIdx, dims) {\n  // Finally save layout info based on the unit leaves and levels.\n  for (var it_5 = dims[XY[dimIdx]].resetCellIterator(); it_5.next();) {\n    var dimCell = it_5.item;\n    layOutRectOneDimBasedOnUnit(dimCell.rect, dimIdx, dimCell.id, dimCell.span, dims);\n    // Consider level varitation on tree leaves, should extend the size to touch matrix body\n    // to avoid weird appearance.\n    layOutRectOneDimBasedOnUnit(dimCell.rect, 1 - dimIdx, dimCell.id, dimCell.span, dims);\n    if (dimCell.type === MatrixCellLayoutInfoType.nonLeaf) {\n      // `xy` and `wh` need to be saved in non-leaf since it supports locating by non-leaf\n      // in `dataToPoint` or `dataToLayout`.\n      dimCell.xy = dimCell.rect[XY[dimIdx]];\n      dimCell.wh = dimCell.rect[WH[dimIdx]];\n    }\n  }\n}\nfunction layOutBodyCornerCellMerge(bodyOrCorner, dims) {\n  bodyOrCorner.travelExistingCells(function (cell) {\n    var computedSpan = cell.span;\n    if (computedSpan) {\n      var layoutRect = cell.spanRect;\n      var id = cell.id;\n      layOutRectOneDimBasedOnUnit(layoutRect, 0, id, computedSpan, dims);\n      layOutRectOneDimBasedOnUnit(layoutRect, 1, id, computedSpan, dims);\n    }\n  });\n}\n// Save to rect for rendering.\nfunction layOutRectOneDimBasedOnUnit(outRect, dimIdx, id, span, dims) {\n  outRect[WH[dimIdx]] = 0;\n  var locator = id[XY[dimIdx]];\n  var dim = locator < 0 ? dims[XY[1 - dimIdx]] : dims[XY[dimIdx]];\n  var layoutUnit = dim.getUnitLayoutInfo(dimIdx, id[XY[dimIdx]]);\n  outRect[XY[dimIdx]] = layoutUnit.xy;\n  outRect[WH[dimIdx]] = layoutUnit.wh;\n  if (span[XY[dimIdx]] > 1) {\n    var layoutUnit2 = dim.getUnitLayoutInfo(dimIdx, id[XY[dimIdx]] + span[XY[dimIdx]] - 1);\n    // Be careful the cumulative error - cell must be aligned.\n    outRect[WH[dimIdx]] = layoutUnit2.xy + layoutUnit2.wh - layoutUnit.xy;\n  }\n}\n/**\n * Return NaN if not defined or invalid.\n */\nfunction parseSizeOption(sizeOption, dimIdx, matrixRect) {\n  var sizeNum = parsePositionSizeOption(sizeOption, matrixRect[WH[dimIdx]]);\n  return confineSize(sizeNum, matrixRect[WH[dimIdx]]);\n}\nfunction confineSize(sizeNum, sizeLimit) {\n  return Math.max(Math.min(sizeNum, retrieve2(sizeLimit, Infinity)), 0);\n}\nfunction getCoordSys(finder) {\n  var matrixModel = finder.matrixModel;\n  var seriesModel = finder.seriesModel;\n  var coordSys = matrixModel ? matrixModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null;\n  return coordSys;\n}\nvar CtxPointToDataAreaType = {\n  inBody: 1,\n  inCorner: 2,\n  outside: 3\n};\n// For handy performance optimization in pointToData.\nvar _tmpCtxPointToData = {\n  x: null,\n  y: null,\n  point: []\n};\nfunction pointToDataOneDimPrepareCtx(ctx, dimIdx, dims, point, clamp) {\n  var thisDim = dims[XY[dimIdx]];\n  var otherDim = dims[XY[1 - dimIdx]];\n  // Notice: considered cases: `matrix.x/y.show: false`, `matrix.x/y.data` is empty.\n  // In this cases the `layout.xy` is on the edge and `layout.wh` is `0`; they still can be\n  // use to calculate clampping.\n  var bodyMaxUnit = thisDim.getUnitLayoutInfo(dimIdx, thisDim.getLocatorCount(dimIdx) - 1);\n  var body0Unit = thisDim.getUnitLayoutInfo(dimIdx, 0);\n  var cornerMinUnit = otherDim.getUnitLayoutInfo(dimIdx, -otherDim.getLocatorCount(dimIdx));\n  var cornerMinus1Unit = otherDim.shouldShow() ? otherDim.getUnitLayoutInfo(dimIdx, -1) : null;\n  var coord = ctx.point[dimIdx] = point[dimIdx]; // Transfer the oridinal coord.\n  if (!body0Unit && !cornerMinus1Unit) {\n    ctx[XY[dimIdx]] = CtxPointToDataAreaType.outside;\n    return;\n  }\n  if (clamp === MatrixClampOption.body) {\n    if (body0Unit) {\n      ctx[XY[dimIdx]] = CtxPointToDataAreaType.inBody;\n      coord = mathMin(bodyMaxUnit.xy + bodyMaxUnit.wh, mathMax(body0Unit.xy, coord));\n      ctx.point[dimIdx] = coord;\n    } else {\n      // If clamp to body, the result must not be in header.\n      ctx[XY[dimIdx]] = CtxPointToDataAreaType.outside;\n    }\n    return;\n  } else if (clamp === MatrixClampOption.corner) {\n    if (cornerMinus1Unit) {\n      ctx[XY[dimIdx]] = CtxPointToDataAreaType.inCorner;\n      coord = mathMin(cornerMinus1Unit.xy + cornerMinus1Unit.wh, mathMax(cornerMinUnit.xy, coord));\n      ctx.point[dimIdx] = coord;\n    } else {\n      // If clamp to corner, the result must not be in body.\n      ctx[XY[dimIdx]] = CtxPointToDataAreaType.outside;\n    }\n    return;\n  }\n  var pxLoc0 = body0Unit ? body0Unit.xy : cornerMinus1Unit ? cornerMinus1Unit.xy + cornerMinus1Unit.wh : NaN;\n  var pxMin = cornerMinUnit ? cornerMinUnit.xy : pxLoc0;\n  var pxMax = bodyMaxUnit ? bodyMaxUnit.xy + bodyMaxUnit.wh : pxLoc0;\n  if (coord < pxMin) {\n    if (!clamp) {\n      // Quick pass for later calc, since mouse event on any place will enter this method if use `pointToData`.\n      ctx[XY[dimIdx]] = CtxPointToDataAreaType.outside;\n      return;\n    }\n    coord = pxMin;\n  } else if (coord > pxMax) {\n    if (!clamp) {\n      ctx[XY[dimIdx]] = CtxPointToDataAreaType.outside;\n      return;\n    }\n    coord = pxMax;\n  }\n  ctx.point[dimIdx] = coord; // Save the updated coord.\n  ctx[XY[dimIdx]] = pxLoc0 <= coord && coord <= pxMax ? CtxPointToDataAreaType.inBody : pxMin <= coord && coord <= pxLoc0 ? CtxPointToDataAreaType.inCorner : CtxPointToDataAreaType.outside;\n  // Every props in ctx must be set in every branch of this method.\n}\n// Assume partialOut has been set to NaN outside.\n// This method may fill out[0] and out[1] in one call.\nfunction pointToDataOnlyHeaderFillOut(ctx, partialOut, dimIdx, dims) {\n  var otherDimIdx = 1 - dimIdx;\n  if (ctx[XY[dimIdx]] === CtxPointToDataAreaType.outside) {\n    return;\n  }\n  for (dims[XY[dimIdx]].resetCellIterator(_ptdDimCellIt); _ptdDimCellIt.next();) {\n    var cell = _ptdDimCellIt.item;\n    if (isCoordInRect(ctx.point[dimIdx], cell.rect, dimIdx) && isCoordInRect(ctx.point[otherDimIdx], cell.rect, otherDimIdx)) {\n      // non-leaves are also allowed to be located.\n      // If the point is in x or y dimension cell area, should check both x and y coord to\n      // determine a cell; in this way a non-leaf cell can be determined.\n      partialOut[dimIdx] = cell.ordinal;\n      partialOut[otherDimIdx] = cell.id[XY[otherDimIdx]];\n      return;\n    }\n  }\n}\n// Assume partialOut has been set to NaN outside.\n// This method may fill out[0] and out[1] in one call.\nfunction pointToDataBodyCornerFillOut(ctx, partialOut, dimIdx, dims) {\n  if (ctx[XY[dimIdx]] === CtxPointToDataAreaType.outside) {\n    return;\n  }\n  var dim = ctx[XY[dimIdx]] === CtxPointToDataAreaType.inCorner ? dims[XY[1 - dimIdx]] : dims[XY[dimIdx]];\n  for (dim.resetLayoutIterator(_ptdLevelIt, dimIdx); _ptdLevelIt.next();) {\n    if (isCoordInLayoutInfo(ctx.point[dimIdx], _ptdLevelIt.item)) {\n      partialOut[dimIdx] = _ptdLevelIt.item.id[XY[dimIdx]];\n      return;\n    }\n  }\n}\nfunction isCoordInLayoutInfo(coord, cell) {\n  return cell.xy <= coord && coord <= cell.xy + cell.wh;\n}\nfunction isCoordInRect(coord, rect, dimIdx) {\n  return rect[XY[dimIdx]] <= coord && coord <= rect[XY[dimIdx]] + rect[WH[dimIdx]];\n}\nexport default Matrix;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport MatrixModel from '../../coord/matrix/MatrixModel.js';\nimport MatrixView from './MatrixView.js';\nimport Matrix from '../../coord/matrix/Matrix.js';\nexport function install(registers) {\n  registers.registerComponentModel(MatrixModel);\n  registers.registerComponentView(MatrixView);\n  registers.registerCoordinateSystem('matrix', Matrix);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as modelUtil from '../../util/model.js';\nimport ComponentModel from '../../model/Component.js';\nimport { copyLayoutParams, mergeLayoutParam } from '../../util/layout.js';\n;\n;\n;\nexport function setKeyInfoToNewElOption(resultItem, newElOption) {\n  var existElOption = resultItem.existing;\n  // Set id and type after id assigned.\n  newElOption.id = resultItem.keyInfo.id;\n  !newElOption.type && existElOption && (newElOption.type = existElOption.type);\n  // Set parent id if not specified\n  if (newElOption.parentId == null) {\n    var newElParentOption = newElOption.parentOption;\n    if (newElParentOption) {\n      newElOption.parentId = newElParentOption.id;\n    } else if (existElOption) {\n      newElOption.parentId = existElOption.parentId;\n    }\n  }\n  // Clear\n  newElOption.parentOption = null;\n}\nfunction isSetLoc(obj, props) {\n  var isSet;\n  zrUtil.each(props, function (prop) {\n    obj[prop] != null && obj[prop] !== 'auto' && (isSet = true);\n  });\n  return isSet;\n}\nfunction mergeNewElOptionToExist(existList, index, newElOption) {\n  // Update existing options, for `getOption` feature.\n  var newElOptCopy = zrUtil.extend({}, newElOption);\n  var existElOption = existList[index];\n  var $action = newElOption.$action || 'merge';\n  if ($action === 'merge') {\n    if (existElOption) {\n      if (process.env.NODE_ENV !== 'production') {\n        var newType = newElOption.type;\n        zrUtil.assert(!newType || existElOption.type === newType, 'Please set $action: \"replace\" to change `type`');\n      }\n      // We can ensure that newElOptCopy and existElOption are not\n      // the same object, so `merge` will not change newElOptCopy.\n      zrUtil.merge(existElOption, newElOptCopy, true);\n      // Rigid body, use ignoreSize.\n      mergeLayoutParam(existElOption, newElOptCopy, {\n        ignoreSize: true\n      });\n      // Will be used in render.\n      copyLayoutParams(newElOption, existElOption);\n      // Copy transition info to new option so it can be used in the transition.\n      // DO IT AFTER merge\n      copyTransitionInfo(newElOption, existElOption);\n      copyTransitionInfo(newElOption, existElOption, 'shape');\n      copyTransitionInfo(newElOption, existElOption, 'style');\n      copyTransitionInfo(newElOption, existElOption, 'extra');\n      // Copy clipPath\n      newElOption.clipPath = existElOption.clipPath;\n    } else {\n      existList[index] = newElOptCopy;\n    }\n  } else if ($action === 'replace') {\n    existList[index] = newElOptCopy;\n  } else if ($action === 'remove') {\n    // null will be cleaned later.\n    existElOption && (existList[index] = null);\n  }\n}\nvar TRANSITION_PROPS_TO_COPY = ['transition', 'enterFrom', 'leaveTo'];\nvar ROOT_TRANSITION_PROPS_TO_COPY = TRANSITION_PROPS_TO_COPY.concat(['enterAnimation', 'updateAnimation', 'leaveAnimation']);\nfunction copyTransitionInfo(target, source, targetProp) {\n  if (targetProp) {\n    if (!target[targetProp] && source[targetProp]) {\n      // TODO avoid creating this empty object when there is no transition configuration.\n      target[targetProp] = {};\n    }\n    target = target[targetProp];\n    source = source[targetProp];\n  }\n  if (!target || !source) {\n    return;\n  }\n  var props = targetProp ? TRANSITION_PROPS_TO_COPY : ROOT_TRANSITION_PROPS_TO_COPY;\n  for (var i = 0; i < props.length; i++) {\n    var prop = props[i];\n    if (target[prop] == null && source[prop] != null) {\n      target[prop] = source[prop];\n    }\n  }\n}\nfunction setLayoutInfoToExist(existItem, newElOption) {\n  if (!existItem) {\n    return;\n  }\n  existItem.hv = newElOption.hv = [\n  // Rigid body, don't care about `width`.\n  isSetLoc(newElOption, ['left', 'right']),\n  // Rigid body, don't care about `height`.\n  isSetLoc(newElOption, ['top', 'bottom'])];\n  // Give default group size. Otherwise layout error may occur.\n  if (existItem.type === 'group') {\n    var existingGroupOpt = existItem;\n    var newGroupOpt = newElOption;\n    existingGroupOpt.width == null && (existingGroupOpt.width = newGroupOpt.width = 0);\n    existingGroupOpt.height == null && (existingGroupOpt.height = newGroupOpt.height = 0);\n  }\n}\nvar GraphicComponentModel = /** @class */function (_super) {\n  __extends(GraphicComponentModel, _super);\n  function GraphicComponentModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GraphicComponentModel.type;\n    _this.preventAutoZ = true;\n    return _this;\n  }\n  GraphicComponentModel.prototype.mergeOption = function (option, ecModel) {\n    // Prevent default merge to elements\n    var elements = this.option.elements;\n    this.option.elements = null;\n    _super.prototype.mergeOption.call(this, option, ecModel);\n    this.option.elements = elements;\n  };\n  GraphicComponentModel.prototype.optionUpdated = function (newOption, isInit) {\n    var thisOption = this.option;\n    var newList = (isInit ? thisOption : newOption).elements;\n    var existList = thisOption.elements = isInit ? [] : thisOption.elements;\n    var flattenedList = [];\n    this._flatten(newList, flattenedList, null);\n    var mappingResult = modelUtil.mappingToExists(existList, flattenedList, 'normalMerge');\n    // Clear elOptionsToUpdate\n    var elOptionsToUpdate = this._elOptionsToUpdate = [];\n    zrUtil.each(mappingResult, function (resultItem, index) {\n      var newElOption = resultItem.newOption;\n      if (process.env.NODE_ENV !== 'production') {\n        zrUtil.assert(zrUtil.isObject(newElOption) || resultItem.existing, 'Empty graphic option definition');\n      }\n      if (!newElOption) {\n        return;\n      }\n      elOptionsToUpdate.push(newElOption);\n      setKeyInfoToNewElOption(resultItem, newElOption);\n      mergeNewElOptionToExist(existList, index, newElOption);\n      setLayoutInfoToExist(existList[index], newElOption);\n    }, this);\n    // Clean\n    thisOption.elements = zrUtil.filter(existList, function (item) {\n      // $action should be volatile, otherwise option gotten from\n      // `getOption` will contain unexpected $action.\n      item && delete item.$action;\n      return item != null;\n    });\n  };\n  /**\n   * Convert\n   * [{\n   *  type: 'group',\n   *  id: 'xx',\n   *  children: [{type: 'circle'}, {type: 'polygon'}]\n   * }]\n   * to\n   * [\n   *  {type: 'group', id: 'xx'},\n   *  {type: 'circle', parentId: 'xx'},\n   *  {type: 'polygon', parentId: 'xx'}\n   * ]\n   */\n  GraphicComponentModel.prototype._flatten = function (optionList, result, parentOption) {\n    zrUtil.each(optionList, function (option) {\n      if (!option) {\n        return;\n      }\n      if (parentOption) {\n        option.parentOption = parentOption;\n      }\n      result.push(option);\n      var children = option.children;\n      // here we don't judge if option.type is `group`\n      // when new option doesn't provide `type`, it will cause that the children can't be updated.\n      if (children && children.length) {\n        this._flatten(children, result, option);\n      }\n      // Deleting for JSON output, and for not affecting group creation.\n      delete option.children;\n    }, this);\n  };\n  // FIXME\n  // Pass to view using payload? setOption has a payload?\n  GraphicComponentModel.prototype.useElOptionsToUpdate = function () {\n    var els = this._elOptionsToUpdate;\n    // Clear to avoid render duplicately when zooming.\n    this._elOptionsToUpdate = null;\n    return els;\n  };\n  GraphicComponentModel.type = 'graphic';\n  GraphicComponentModel.defaultOption = {\n    elements: []\n    // parentId: null\n  };\n  return GraphicComponentModel;\n}(ComponentModel);\nexport { GraphicComponentModel };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Displayable from 'zrender/lib/graphic/Displayable.js';\nimport * as modelUtil from '../../util/model.js';\nimport * as graphicUtil from '../../util/graphic.js';\nimport * as layoutUtil from '../../util/layout.js';\nimport { parsePercent } from '../../util/number.js';\nimport ComponentView from '../../view/Component.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { isEC4CompatibleStyle, convertFromEC4CompatibleStyle } from '../../util/styleCompat.js';\nimport { applyLeaveTransition, applyUpdateTransition, isTransitionAll, updateLeaveTo } from '../../animation/customGraphicTransition.js';\nimport { updateProps } from '../../animation/basicTransition.js';\nimport { applyKeyframeAnimation, stopPreviousKeyframeAnimationAndRestore } from '../../animation/customGraphicKeyframeAnimation.js';\nvar nonShapeGraphicElements = {\n  // Reserved but not supported in graphic component.\n  path: null,\n  compoundPath: null,\n  // Supported in graphic component.\n  group: graphicUtil.Group,\n  image: graphicUtil.Image,\n  text: graphicUtil.Text\n};\nexport var inner = modelUtil.makeInner();\n// ------------------------\n// View\n// ------------------------\nvar GraphicComponentView = /** @class */function (_super) {\n  __extends(GraphicComponentView, _super);\n  function GraphicComponentView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = GraphicComponentView.type;\n    return _this;\n  }\n  GraphicComponentView.prototype.init = function () {\n    this._elMap = zrUtil.createHashMap();\n  };\n  GraphicComponentView.prototype.render = function (graphicModel, ecModel, api) {\n    // Having leveraged between use cases and algorithm complexity, a very\n    // simple layout mechanism is used:\n    // The size(width/height) can be determined by itself or its parent (not\n    // implemented yet), but can not by its children. (Top-down travel)\n    // The location(x/y) can be determined by the bounding rect of itself\n    // (can including its descendants or not) and the size of its parent.\n    // (Bottom-up travel)\n    // When `chart.clear()` or `chart.setOption({...}, true)` with the same id,\n    // view will be reused.\n    if (graphicModel !== this._lastGraphicModel) {\n      this._clear();\n    }\n    this._lastGraphicModel = graphicModel;\n    this._updateElements(graphicModel);\n    this._relocate(graphicModel, api);\n  };\n  /**\n   * Update graphic elements.\n   */\n  GraphicComponentView.prototype._updateElements = function (graphicModel) {\n    var elOptionsToUpdate = graphicModel.useElOptionsToUpdate();\n    if (!elOptionsToUpdate) {\n      return;\n    }\n    var elMap = this._elMap;\n    var rootGroup = this.group;\n    var globalZ = graphicModel.get('z');\n    var globalZLevel = graphicModel.get('zlevel');\n    // Top-down tranverse to assign graphic settings to each elements.\n    zrUtil.each(elOptionsToUpdate, function (elOption) {\n      var id = modelUtil.convertOptionIdName(elOption.id, null);\n      var elExisting = id != null ? elMap.get(id) : null;\n      var parentId = modelUtil.convertOptionIdName(elOption.parentId, null);\n      var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;\n      var elType = elOption.type;\n      var elOptionStyle = elOption.style;\n      if (elType === 'text' && elOptionStyle) {\n        // In top/bottom mode, textVerticalAlign should not be used, which cause\n        // inaccurately locating.\n        if (elOption.hv && elOption.hv[1]) {\n          elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = elOptionStyle.verticalAlign = elOptionStyle.align = null;\n        }\n      }\n      var textContentOption = elOption.textContent;\n      var textConfig = elOption.textConfig;\n      if (elOptionStyle && isEC4CompatibleStyle(elOptionStyle, elType, !!textConfig, !!textContentOption)) {\n        var convertResult = convertFromEC4CompatibleStyle(elOptionStyle, elType, true);\n        if (!textConfig && convertResult.textConfig) {\n          textConfig = elOption.textConfig = convertResult.textConfig;\n        }\n        if (!textContentOption && convertResult.textContent) {\n          textContentOption = convertResult.textContent;\n        }\n      }\n      // Remove unnecessary props to avoid potential problems.\n      var elOptionCleaned = getCleanedElOption(elOption);\n      // For simple, do not support parent change, otherwise reorder is needed.\n      if (process.env.NODE_ENV !== 'production') {\n        elExisting && zrUtil.assert(targetElParent === elExisting.parent, 'Changing parent is not supported.');\n      }\n      var $action = elOption.$action || 'merge';\n      var isMerge = $action === 'merge';\n      var isReplace = $action === 'replace';\n      if (isMerge) {\n        var isInit = !elExisting;\n        var el_1 = elExisting;\n        if (isInit) {\n          el_1 = createEl(id, targetElParent, elOption.type, elMap);\n        } else {\n          el_1 && (inner(el_1).isNew = false);\n          // Stop and restore before update any other attributes.\n          stopPreviousKeyframeAnimationAndRestore(el_1);\n        }\n        if (el_1) {\n          applyUpdateTransition(el_1, elOptionCleaned, graphicModel, {\n            isInit: isInit\n          });\n          updateCommonAttrs(el_1, elOption, globalZ, globalZLevel);\n        }\n      } else if (isReplace) {\n        removeEl(elExisting, elOption, elMap, graphicModel);\n        var el_2 = createEl(id, targetElParent, elOption.type, elMap);\n        if (el_2) {\n          applyUpdateTransition(el_2, elOptionCleaned, graphicModel, {\n            isInit: true\n          });\n          updateCommonAttrs(el_2, elOption, globalZ, globalZLevel);\n        }\n      } else if ($action === 'remove') {\n        updateLeaveTo(elExisting, elOption);\n        removeEl(elExisting, elOption, elMap, graphicModel);\n      }\n      var el = elMap.get(id);\n      if (el && textContentOption) {\n        if (isMerge) {\n          var textContentExisting = el.getTextContent();\n          textContentExisting ? textContentExisting.attr(textContentOption) : el.setTextContent(new graphicUtil.Text(textContentOption));\n        } else if (isReplace) {\n          el.setTextContent(new graphicUtil.Text(textContentOption));\n        }\n      }\n      if (el) {\n        var clipPathOption = elOption.clipPath;\n        if (clipPathOption) {\n          var clipPathType = clipPathOption.type;\n          var clipPath = void 0;\n          var isInit = false;\n          if (isMerge) {\n            var oldClipPath = el.getClipPath();\n            isInit = !oldClipPath || inner(oldClipPath).type !== clipPathType;\n            clipPath = isInit ? newEl(clipPathType) : oldClipPath;\n          } else if (isReplace) {\n            isInit = true;\n            clipPath = newEl(clipPathType);\n          }\n          el.setClipPath(clipPath);\n          applyUpdateTransition(clipPath, clipPathOption, graphicModel, {\n            isInit: isInit\n          });\n          applyKeyframeAnimation(clipPath, clipPathOption.keyframeAnimation, graphicModel);\n        }\n        var elInner = inner(el);\n        el.setTextConfig(textConfig);\n        elInner.option = elOption;\n        setEventData(el, graphicModel, elOption);\n        graphicUtil.setTooltipConfig({\n          el: el,\n          componentModel: graphicModel,\n          itemName: el.name,\n          itemTooltipOption: elOption.tooltip\n        });\n        applyKeyframeAnimation(el, elOption.keyframeAnimation, graphicModel);\n      }\n    });\n  };\n  /**\n   * Locate graphic elements.\n   */\n  GraphicComponentView.prototype._relocate = function (graphicModel, api) {\n    var elOptions = graphicModel.option.elements;\n    var rootGroup = this.group;\n    var elMap = this._elMap;\n    var apiWidth = api.getWidth();\n    var apiHeight = api.getHeight();\n    var xy = ['x', 'y'];\n    // Top-down to calculate percentage width/height of group\n    for (var i = 0; i < elOptions.length; i++) {\n      var elOption = elOptions[i];\n      var id = modelUtil.convertOptionIdName(elOption.id, null);\n      var el = id != null ? elMap.get(id) : null;\n      if (!el || !el.isGroup) {\n        continue;\n      }\n      var parentEl = el.parent;\n      var isParentRoot = parentEl === rootGroup;\n      // Like 'position:absolut' in css, default 0.\n      var elInner = inner(el);\n      var parentElInner = inner(parentEl);\n      elInner.width = parsePercent(elInner.option.width, isParentRoot ? apiWidth : parentElInner.width) || 0;\n      elInner.height = parsePercent(elInner.option.height, isParentRoot ? apiHeight : parentElInner.height) || 0;\n    }\n    // Bottom-up tranvese all elements (consider ec resize) to locate elements.\n    for (var i = elOptions.length - 1; i >= 0; i--) {\n      var elOption = elOptions[i];\n      var id = modelUtil.convertOptionIdName(elOption.id, null);\n      var el = id != null ? elMap.get(id) : null;\n      if (!el) {\n        continue;\n      }\n      var parentEl = el.parent;\n      var parentElInner = inner(parentEl);\n      var containerInfo = parentEl === rootGroup ? {\n        width: apiWidth,\n        height: apiHeight\n      } : {\n        width: parentElInner.width,\n        height: parentElInner.height\n      };\n      // PENDING\n      // Currently, when `bounding: 'all'`, the union bounding rect of the group\n      // does not include the rect of [0, 0, group.width, group.height], which\n      // is probably weird for users. Should we make a break change for it?\n      var layoutPos = {};\n      var layouted = layoutUtil.positionElement(el, elOption, containerInfo, null, {\n        hv: elOption.hv,\n        boundingMode: elOption.bounding\n      }, layoutPos);\n      if (!inner(el).isNew && layouted) {\n        var transition = elOption.transition;\n        var animatePos = {};\n        for (var k = 0; k < xy.length; k++) {\n          var key = xy[k];\n          var val = layoutPos[key];\n          if (transition && (isTransitionAll(transition) || zrUtil.indexOf(transition, key) >= 0)) {\n            animatePos[key] = val;\n          } else {\n            el[key] = val;\n          }\n        }\n        updateProps(el, animatePos, graphicModel, 0);\n      } else {\n        el.attr(layoutPos);\n      }\n    }\n  };\n  /**\n   * Clear all elements.\n   */\n  GraphicComponentView.prototype._clear = function () {\n    var _this = this;\n    var elMap = this._elMap;\n    elMap.each(function (el) {\n      removeEl(el, inner(el).option, elMap, _this._lastGraphicModel);\n    });\n    this._elMap = zrUtil.createHashMap();\n  };\n  GraphicComponentView.prototype.dispose = function () {\n    this._clear();\n  };\n  GraphicComponentView.type = 'graphic';\n  return GraphicComponentView;\n}(ComponentView);\nexport { GraphicComponentView };\nfunction newEl(graphicType) {\n  if (process.env.NODE_ENV !== 'production') {\n    zrUtil.assert(graphicType, 'graphic type MUST be set');\n  }\n  var Clz = zrUtil.hasOwn(nonShapeGraphicElements, graphicType)\n  // Those graphic elements are not shapes. They should not be\n  // overwritten by users, so do them first.\n  ? nonShapeGraphicElements[graphicType] : graphicUtil.getShapeClass(graphicType);\n  if (process.env.NODE_ENV !== 'production') {\n    zrUtil.assert(Clz, \"graphic type \" + graphicType + \" can not be found\");\n  }\n  var el = new Clz({});\n  inner(el).type = graphicType;\n  return el;\n}\nfunction createEl(id, targetElParent, graphicType, elMap) {\n  var el = newEl(graphicType);\n  targetElParent.add(el);\n  elMap.set(id, el);\n  inner(el).id = id;\n  inner(el).isNew = true;\n  return el;\n}\nfunction removeEl(elExisting, elOption, elMap, graphicModel) {\n  var existElParent = elExisting && elExisting.parent;\n  if (existElParent) {\n    elExisting.type === 'group' && elExisting.traverse(function (el) {\n      removeEl(el, elOption, elMap, graphicModel);\n    });\n    applyLeaveTransition(elExisting, elOption, graphicModel);\n    elMap.removeKey(inner(elExisting).id);\n  }\n}\nfunction updateCommonAttrs(el, elOption, defaultZ, defaultZlevel) {\n  if (!el.isGroup) {\n    zrUtil.each([['cursor', Displayable.prototype.cursor],\n    // We should not support configure z and zlevel in the element level.\n    // But seems we didn't limit it previously. So here still use it to avoid breaking.\n    ['zlevel', defaultZlevel || 0], ['z', defaultZ || 0],\n    // z2 must not be null/undefined, otherwise sort error may occur.\n    ['z2', 0]], function (item) {\n      var prop = item[0];\n      if (zrUtil.hasOwn(elOption, prop)) {\n        el[prop] = zrUtil.retrieve2(elOption[prop], item[1]);\n      } else if (el[prop] == null) {\n        el[prop] = item[1];\n      }\n    });\n  }\n  zrUtil.each(zrUtil.keys(elOption), function (key) {\n    // Assign event handlers.\n    // PENDING: should enumerate all event names or use pattern matching?\n    if (key.indexOf('on') === 0) {\n      var val = elOption[key];\n      el[key] = zrUtil.isFunction(val) ? val : null;\n    }\n  });\n  if (zrUtil.hasOwn(elOption, 'draggable')) {\n    el.draggable = elOption.draggable;\n  }\n  // Other attributes\n  elOption.name != null && (el.name = elOption.name);\n  elOption.id != null && (el.id = elOption.id);\n}\n// Remove unnecessary props to avoid potential problems.\nfunction getCleanedElOption(elOption) {\n  elOption = zrUtil.extend({}, elOption);\n  zrUtil.each(['id', 'parentId', '$action', 'hv', 'bounding', 'textContent', 'clipPath'].concat(layoutUtil.LOCATION_PARAMS), function (name) {\n    delete elOption[name];\n  });\n  return elOption;\n}\nfunction setEventData(el, graphicModel, elOption) {\n  var eventData = getECData(el).eventData;\n  // Simple optimize for large amount of elements that no need event.\n  if (!el.silent && !el.ignore && !eventData) {\n    eventData = getECData(el).eventData = {\n      componentType: 'graphic',\n      componentIndex: graphicModel.componentIndex,\n      name: el.name\n    };\n  }\n  // `elOption.info` enables user to mount some info on\n  // elements and use them in event handlers.\n  if (eventData) {\n    eventData.info = elOption.info;\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isArray } from 'zrender/lib/core/util.js';\nimport { GraphicComponentModel } from './GraphicModel.js';\nimport { GraphicComponentView } from './GraphicView.js';\nexport function install(registers) {\n  registers.registerComponentModel(GraphicComponentModel);\n  registers.registerComponentView(GraphicComponentView);\n  registers.registerPreprocessor(function (option) {\n    var graphicOption = option.graphic;\n    // Convert\n    // {graphic: [{left: 10, type: 'circle'}, ...]}\n    // or\n    // {graphic: {left: 10, type: 'circle'}}\n    // to\n    // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]}\n    if (isArray(graphicOption)) {\n      if (!graphicOption[0] || !graphicOption[0].elements) {\n        option.graphic = [{\n          elements: graphicOption\n        }];\n      } else {\n        // Only one graphic instance can be instantiated. (We don't\n        // want that too many views are created in echarts._viewMap.)\n        option.graphic = [option.graphic[0]];\n      }\n    } else if (graphicOption && !graphicOption.elements) {\n      option.graphic = [{\n        elements: [graphicOption]\n      }];\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { indexOf, createHashMap, assert } from 'zrender/lib/core/util.js';\nexport var DATA_ZOOM_AXIS_DIMENSIONS = ['x', 'y', 'radius', 'angle', 'single'];\n// Supported coords.\n// FIXME: polar has been broken (but rarely used).\nvar SERIES_COORDS = ['cartesian2d', 'polar', 'singleAxis'];\nexport function isCoordSupported(seriesModel) {\n  var coordType = seriesModel.get('coordinateSystem');\n  return indexOf(SERIES_COORDS, coordType) >= 0;\n}\nexport function getAxisMainType(axisDim) {\n  if (process.env.NODE_ENV !== 'production') {\n    assert(axisDim);\n  }\n  return axisDim + 'Axis';\n}\nexport function getAxisIndexPropName(axisDim) {\n  if (process.env.NODE_ENV !== 'production') {\n    assert(axisDim);\n  }\n  return axisDim + 'AxisIndex';\n}\nexport function getAxisIdPropName(axisDim) {\n  if (process.env.NODE_ENV !== 'production') {\n    assert(axisDim);\n  }\n  return axisDim + 'AxisId';\n}\n/**\n * If two dataZoomModels has the same axis controlled, we say that they are 'linked'.\n * This function finds all linked dataZoomModels start from the given payload.\n */\nexport function findEffectedDataZooms(ecModel, payload) {\n  // Key: `DataZoomAxisDimension`\n  var axisRecords = createHashMap();\n  var effectedModels = [];\n  // Key: uid of dataZoomModel\n  var effectedModelMap = createHashMap();\n  // Find the dataZooms specified by payload.\n  ecModel.eachComponent({\n    mainType: 'dataZoom',\n    query: payload\n  }, function (dataZoomModel) {\n    if (!effectedModelMap.get(dataZoomModel.uid)) {\n      addToEffected(dataZoomModel);\n    }\n  });\n  // Start from the given dataZoomModels, travel the graph to find\n  // all of the linked dataZoom models.\n  var foundNewLink;\n  do {\n    foundNewLink = false;\n    ecModel.eachComponent('dataZoom', processSingle);\n  } while (foundNewLink);\n  function processSingle(dataZoomModel) {\n    if (!effectedModelMap.get(dataZoomModel.uid) && isLinked(dataZoomModel)) {\n      addToEffected(dataZoomModel);\n      foundNewLink = true;\n    }\n  }\n  function addToEffected(dataZoom) {\n    effectedModelMap.set(dataZoom.uid, true);\n    effectedModels.push(dataZoom);\n    markAxisControlled(dataZoom);\n  }\n  function isLinked(dataZoomModel) {\n    var isLink = false;\n    dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n      var axisIdxArr = axisRecords.get(axisDim);\n      if (axisIdxArr && axisIdxArr[axisIndex]) {\n        isLink = true;\n      }\n    });\n    return isLink;\n  }\n  function markAxisControlled(dataZoomModel) {\n    dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n      (axisRecords.get(axisDim) || axisRecords.set(axisDim, []))[axisIndex] = true;\n    });\n  }\n  return effectedModels;\n}\n/**\n * Find the first target coordinate system.\n * Available after model built.\n *\n * @return Like {\n *                  grid: [\n *                      {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},\n *                      {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},\n *                      ...\n *                  ],  // cartesians must not be null/undefined.\n *                  polar: [\n *                      {model: coord0, axisModels: [axis4], coordIndex: 0},\n *                      ...\n *                  ],  // polars must not be null/undefined.\n *                  singleAxis: [\n *                      {model: coord0, axisModels: [], coordIndex: 0}\n *                  ]\n *              }\n */\nexport function collectReferCoordSysModelInfo(dataZoomModel) {\n  var ecModel = dataZoomModel.ecModel;\n  var coordSysInfoWrap = {\n    infoList: [],\n    infoMap: createHashMap()\n  };\n  dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n    var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n    if (!axisModel) {\n      return;\n    }\n    var coordSysModel = axisModel.getCoordSysModel();\n    if (!coordSysModel) {\n      return;\n    }\n    var coordSysUid = coordSysModel.uid;\n    var coordSysInfo = coordSysInfoWrap.infoMap.get(coordSysUid);\n    if (!coordSysInfo) {\n      coordSysInfo = {\n        model: coordSysModel,\n        axisModels: []\n      };\n      coordSysInfoWrap.infoList.push(coordSysInfo);\n      coordSysInfoWrap.infoMap.set(coordSysUid, coordSysInfo);\n    }\n    coordSysInfo.axisModels.push(axisModel);\n  });\n  return coordSysInfoWrap;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { each, createHashMap, merge, assert } from 'zrender/lib/core/util.js';\nimport ComponentModel from '../../model/Component.js';\nimport { getAxisMainType, DATA_ZOOM_AXIS_DIMENSIONS } from './helper.js';\nimport { MULTIPLE_REFERRING, SINGLE_REFERRING } from '../../util/model.js';\nvar DataZoomAxisInfo = /** @class */function () {\n  function DataZoomAxisInfo() {\n    this.indexList = [];\n    this.indexMap = [];\n  }\n  DataZoomAxisInfo.prototype.add = function (axisCmptIdx) {\n    // Remove duplication.\n    if (!this.indexMap[axisCmptIdx]) {\n      this.indexList.push(axisCmptIdx);\n      this.indexMap[axisCmptIdx] = true;\n    }\n  };\n  return DataZoomAxisInfo;\n}();\nvar DataZoomModel = /** @class */function (_super) {\n  __extends(DataZoomModel, _super);\n  function DataZoomModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = DataZoomModel.type;\n    _this._autoThrottle = true;\n    _this._noTarget = true;\n    /**\n     * It is `[rangeModeForMin, rangeModeForMax]`.\n     * The optional values for `rangeMode`:\n     * + `'value'` mode: the axis extent will always be determined by\n     *     `dataZoom.startValue` and `dataZoom.endValue`, despite\n     *     how data like and how `axis.min` and `axis.max` are.\n     * + `'percent'` mode: `100` represents 100% of the `[dMin, dMax]`,\n     *     where `dMin` is `axis.min` if `axis.min` specified, otherwise `data.extent[0]`,\n     *     and `dMax` is `axis.max` if `axis.max` specified, otherwise `data.extent[1]`.\n     *     Axis extent will be determined by the result of the percent of `[dMin, dMax]`.\n     *\n     * For example, when users are using dynamic data (update data periodically via `setOption`),\n     * if in `'value`' mode, the window will be kept in a fixed value range despite how\n     * data are appended, while if in `'percent'` mode, whe window range will be changed alone with\n     * the appended data (suppose `axis.min` and `axis.max` are not specified).\n     */\n    _this._rangePropMode = ['percent', 'percent'];\n    return _this;\n  }\n  DataZoomModel.prototype.init = function (option, parentModel, ecModel) {\n    var inputRawOption = retrieveRawOption(option);\n    /**\n     * Suppose a \"main process\" start at the point that model prepared (that is,\n     * model initialized or merged or method called in `action`).\n     * We should keep the `main process` idempotent, that is, given a set of values\n     * on `option`, we get the same result.\n     *\n     * But sometimes, values on `option` will be updated for providing users\n     * a \"final calculated value\" (`dataZoomProcessor` will do that). Those value\n     * should not be the base/input of the `main process`.\n     *\n     * So in that case we should save and keep the input of the `main process`\n     * separately, called `settledOption`.\n     *\n     * For example, consider the case:\n     * (Step_1) brush zoom the grid by `toolbox.dataZoom`,\n     *     where the original input `option.startValue`, `option.endValue` are earsed by\n     *     calculated value.\n     * (Step)2) click the legend to hide and show a series,\n     *     where the new range is calculated by the earsed `startValue` and `endValue`,\n     *     which brings incorrect result.\n     */\n    this.settledOption = inputRawOption;\n    this.mergeDefaultAndTheme(option, ecModel);\n    this._doInit(inputRawOption);\n  };\n  DataZoomModel.prototype.mergeOption = function (newOption) {\n    var inputRawOption = retrieveRawOption(newOption);\n    // FIX #2591\n    merge(this.option, newOption, true);\n    merge(this.settledOption, inputRawOption, true);\n    this._doInit(inputRawOption);\n  };\n  DataZoomModel.prototype._doInit = function (inputRawOption) {\n    var thisOption = this.option;\n    this._setDefaultThrottle(inputRawOption);\n    this._updateRangeUse(inputRawOption);\n    var settledOption = this.settledOption;\n    each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {\n      // start/end has higher priority over startValue/endValue if they\n      // both set, but we should make chart.setOption({endValue: 1000})\n      // effective, rather than chart.setOption({endValue: 1000, end: null}).\n      if (this._rangePropMode[index] === 'value') {\n        thisOption[names[0]] = settledOption[names[0]] = null;\n      }\n      // Otherwise do nothing and use the merge result.\n    }, this);\n    this._resetTarget();\n  };\n  DataZoomModel.prototype._resetTarget = function () {\n    var optionOrient = this.get('orient', true);\n    var targetAxisIndexMap = this._targetAxisInfoMap = createHashMap();\n    var hasAxisSpecified = this._fillSpecifiedTargetAxis(targetAxisIndexMap);\n    if (hasAxisSpecified) {\n      this._orient = optionOrient || this._makeAutoOrientByTargetAxis();\n    } else {\n      this._orient = optionOrient || 'horizontal';\n      this._fillAutoTargetAxisByOrient(targetAxisIndexMap, this._orient);\n    }\n    this._noTarget = true;\n    targetAxisIndexMap.each(function (axisInfo) {\n      if (axisInfo.indexList.length) {\n        this._noTarget = false;\n      }\n    }, this);\n  };\n  DataZoomModel.prototype._fillSpecifiedTargetAxis = function (targetAxisIndexMap) {\n    var hasAxisSpecified = false;\n    each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) {\n      var refering = this.getReferringComponents(getAxisMainType(axisDim), MULTIPLE_REFERRING);\n      // When user set axisIndex as a empty array, we think that user specify axisIndex\n      // but do not want use auto mode. Because empty array may be encountered when\n      // some error occurred.\n      if (!refering.specified) {\n        return;\n      }\n      hasAxisSpecified = true;\n      var axisInfo = new DataZoomAxisInfo();\n      each(refering.models, function (axisModel) {\n        axisInfo.add(axisModel.componentIndex);\n      });\n      targetAxisIndexMap.set(axisDim, axisInfo);\n    }, this);\n    return hasAxisSpecified;\n  };\n  DataZoomModel.prototype._fillAutoTargetAxisByOrient = function (targetAxisIndexMap, orient) {\n    var ecModel = this.ecModel;\n    var needAuto = true;\n    // Find axis that parallel to dataZoom as default.\n    if (needAuto) {\n      var axisDim = orient === 'vertical' ? 'y' : 'x';\n      var axisModels = ecModel.findComponents({\n        mainType: axisDim + 'Axis'\n      });\n      setParallelAxis(axisModels, axisDim);\n    }\n    // Find axis that parallel to dataZoom as default.\n    if (needAuto) {\n      var axisModels = ecModel.findComponents({\n        mainType: 'singleAxis',\n        filter: function (axisModel) {\n          return axisModel.get('orient', true) === orient;\n        }\n      });\n      setParallelAxis(axisModels, 'single');\n    }\n    function setParallelAxis(axisModels, axisDim) {\n      // At least use the first parallel axis as the target axis.\n      var axisModel = axisModels[0];\n      if (!axisModel) {\n        return;\n      }\n      var axisInfo = new DataZoomAxisInfo();\n      axisInfo.add(axisModel.componentIndex);\n      targetAxisIndexMap.set(axisDim, axisInfo);\n      needAuto = false;\n      // Find parallel axes in the same grid.\n      if (axisDim === 'x' || axisDim === 'y') {\n        var gridModel_1 = axisModel.getReferringComponents('grid', SINGLE_REFERRING).models[0];\n        gridModel_1 && each(axisModels, function (axModel) {\n          if (axisModel.componentIndex !== axModel.componentIndex && gridModel_1 === axModel.getReferringComponents('grid', SINGLE_REFERRING).models[0]) {\n            axisInfo.add(axModel.componentIndex);\n          }\n        });\n      }\n    }\n    if (needAuto) {\n      // If no parallel axis, find the first category axis as default. (Also consider polar).\n      each(DATA_ZOOM_AXIS_DIMENSIONS, function (axisDim) {\n        if (!needAuto) {\n          return;\n        }\n        var axisModels = ecModel.findComponents({\n          mainType: getAxisMainType(axisDim),\n          filter: function (axisModel) {\n            return axisModel.get('type', true) === 'category';\n          }\n        });\n        if (axisModels[0]) {\n          var axisInfo = new DataZoomAxisInfo();\n          axisInfo.add(axisModels[0].componentIndex);\n          targetAxisIndexMap.set(axisDim, axisInfo);\n          needAuto = false;\n        }\n      }, this);\n    }\n  };\n  DataZoomModel.prototype._makeAutoOrientByTargetAxis = function () {\n    var dim;\n    // Find the first axis\n    this.eachTargetAxis(function (axisDim) {\n      !dim && (dim = axisDim);\n    }, this);\n    return dim === 'y' ? 'vertical' : 'horizontal';\n  };\n  DataZoomModel.prototype._setDefaultThrottle = function (inputRawOption) {\n    // When first time user set throttle, auto throttle ends.\n    if (inputRawOption.hasOwnProperty('throttle')) {\n      this._autoThrottle = false;\n    }\n    if (this._autoThrottle) {\n      var globalOption = this.ecModel.option;\n      this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20;\n    }\n  };\n  DataZoomModel.prototype._updateRangeUse = function (inputRawOption) {\n    var rangePropMode = this._rangePropMode;\n    var rangeModeInOption = this.get('rangeMode');\n    each([['start', 'startValue'], ['end', 'endValue']], function (names, index) {\n      var percentSpecified = inputRawOption[names[0]] != null;\n      var valueSpecified = inputRawOption[names[1]] != null;\n      if (percentSpecified && !valueSpecified) {\n        rangePropMode[index] = 'percent';\n      } else if (!percentSpecified && valueSpecified) {\n        rangePropMode[index] = 'value';\n      } else if (rangeModeInOption) {\n        rangePropMode[index] = rangeModeInOption[index];\n      } else if (percentSpecified) {\n        // percentSpecified && valueSpecified\n        rangePropMode[index] = 'percent';\n      }\n      // else remain its original setting.\n    });\n  };\n  DataZoomModel.prototype.noTarget = function () {\n    return this._noTarget;\n  };\n  DataZoomModel.prototype.getFirstTargetAxisModel = function () {\n    var firstAxisModel;\n    this.eachTargetAxis(function (axisDim, axisIndex) {\n      if (firstAxisModel == null) {\n        firstAxisModel = this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n      }\n    }, this);\n    return firstAxisModel;\n  };\n  /**\n   * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel\n   */\n  DataZoomModel.prototype.eachTargetAxis = function (callback, context) {\n    this._targetAxisInfoMap.each(function (axisInfo, axisDim) {\n      each(axisInfo.indexList, function (axisIndex) {\n        callback.call(context, axisDim, axisIndex);\n      });\n    });\n  };\n  /**\n   * @return If not found, return null/undefined.\n   */\n  DataZoomModel.prototype.getAxisProxy = function (axisDim, axisIndex) {\n    var axisModel = this.getAxisModel(axisDim, axisIndex);\n    if (axisModel) {\n      return axisModel.__dzAxisProxy;\n    }\n  };\n  /**\n   * @return If not found, return null/undefined.\n   */\n  DataZoomModel.prototype.getAxisModel = function (axisDim, axisIndex) {\n    if (process.env.NODE_ENV !== 'production') {\n      assert(axisDim && axisIndex != null);\n    }\n    var axisInfo = this._targetAxisInfoMap.get(axisDim);\n    if (axisInfo && axisInfo.indexMap[axisIndex]) {\n      return this.ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n    }\n  };\n  /**\n   * If not specified, set to undefined.\n   */\n  DataZoomModel.prototype.setRawRange = function (opt) {\n    var thisOption = this.option;\n    var settledOption = this.settledOption;\n    each([['start', 'startValue'], ['end', 'endValue']], function (names) {\n      // Consider the pair <start, startValue>:\n      // If one has value and the other one is `null/undefined`, we both set them\n      // to `settledOption`. This strategy enables the feature to clear the original\n      // value in `settledOption` to `null/undefined`.\n      // But if both of them are `null/undefined`, we do not set them to `settledOption`\n      // and keep `settledOption` with the original value. This strategy enables users to\n      // only set <end or endValue> but not set <start or startValue> when calling\n      // `dispatchAction`.\n      // The pair <end, endValue> is treated in the same way.\n      if (opt[names[0]] != null || opt[names[1]] != null) {\n        thisOption[names[0]] = settledOption[names[0]] = opt[names[0]];\n        thisOption[names[1]] = settledOption[names[1]] = opt[names[1]];\n      }\n    }, this);\n    this._updateRangeUse(opt);\n  };\n  DataZoomModel.prototype.setCalculatedRange = function (opt) {\n    var option = this.option;\n    each(['start', 'startValue', 'end', 'endValue'], function (name) {\n      option[name] = opt[name];\n    });\n  };\n  DataZoomModel.prototype.getPercentRange = function () {\n    var axisProxy = this.findRepresentativeAxisProxy();\n    if (axisProxy) {\n      return axisProxy.getDataPercentWindow();\n    }\n  };\n  /**\n   * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);\n   *\n   * @return [startValue, endValue] value can only be '-' or finite number.\n   */\n  DataZoomModel.prototype.getValueRange = function (axisDim, axisIndex) {\n    if (axisDim == null && axisIndex == null) {\n      var axisProxy = this.findRepresentativeAxisProxy();\n      if (axisProxy) {\n        return axisProxy.getDataValueWindow();\n      }\n    } else {\n      return this.getAxisProxy(axisDim, axisIndex).getDataValueWindow();\n    }\n  };\n  /**\n   * @param axisModel If axisModel given, find axisProxy\n   *      corresponding to the axisModel\n   */\n  DataZoomModel.prototype.findRepresentativeAxisProxy = function (axisModel) {\n    if (axisModel) {\n      return axisModel.__dzAxisProxy;\n    }\n    // Find the first hosted axisProxy\n    var firstProxy;\n    var axisDimList = this._targetAxisInfoMap.keys();\n    for (var i = 0; i < axisDimList.length; i++) {\n      var axisDim = axisDimList[i];\n      var axisInfo = this._targetAxisInfoMap.get(axisDim);\n      for (var j = 0; j < axisInfo.indexList.length; j++) {\n        var proxy = this.getAxisProxy(axisDim, axisInfo.indexList[j]);\n        if (proxy.hostedBy(this)) {\n          return proxy;\n        }\n        if (!firstProxy) {\n          firstProxy = proxy;\n        }\n      }\n    }\n    // If no hosted proxy found, still need to return a proxy.\n    // This case always happens in toolbox dataZoom, where axes are all hosted by\n    // other dataZooms.\n    return firstProxy;\n  };\n  DataZoomModel.prototype.getRangePropMode = function () {\n    return this._rangePropMode.slice();\n  };\n  DataZoomModel.prototype.getOrient = function () {\n    if (process.env.NODE_ENV !== 'production') {\n      // Should not be called before initialized.\n      assert(this._orient);\n    }\n    return this._orient;\n  };\n  DataZoomModel.type = 'dataZoom';\n  DataZoomModel.dependencies = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series', 'toolbox'];\n  DataZoomModel.defaultOption = {\n    // zlevel: 0,\n    z: 4,\n    filterMode: 'filter',\n    start: 0,\n    end: 100\n  };\n  return DataZoomModel;\n}(ComponentModel);\n/**\n * Retrieve those raw params from option, which will be cached separately,\n * because they will be overwritten by normalized/calculated values in the main\n * process.\n */\nfunction retrieveRawOption(option) {\n  var ret = {};\n  each(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) {\n    option.hasOwnProperty(name) && (ret[name] = option[name]);\n  });\n  return ret;\n}\nexport default DataZoomModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport DataZoomModel from './DataZoomModel.js';\nvar SelectDataZoomModel = /** @class */function (_super) {\n  __extends(SelectDataZoomModel, _super);\n  function SelectDataZoomModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SelectDataZoomModel.type;\n    return _this;\n  }\n  SelectDataZoomModel.type = 'dataZoom.select';\n  return SelectDataZoomModel;\n}(DataZoomModel);\nexport default SelectDataZoomModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nvar DataZoomView = /** @class */function (_super) {\n  __extends(DataZoomView, _super);\n  function DataZoomView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = DataZoomView.type;\n    return _this;\n  }\n  DataZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) {\n    this.dataZoomModel = dataZoomModel;\n    this.ecModel = ecModel;\n    this.api = api;\n  };\n  DataZoomView.type = 'dataZoom';\n  return DataZoomView;\n}(ComponentView);\nexport default DataZoomView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport DataZoomView from './DataZoomView.js';\nvar SelectDataZoomView = /** @class */function (_super) {\n  __extends(SelectDataZoomView, _super);\n  function SelectDataZoomView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SelectDataZoomView.type;\n    return _this;\n  }\n  SelectDataZoomView.type = 'dataZoom.select';\n  return SelectDataZoomView;\n}(DataZoomView);\nexport default SelectDataZoomView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as numberUtil from '../../util/number.js';\nimport sliderMove from '../helper/sliderMove.js';\nimport { unionAxisExtentFromData } from '../../coord/axisHelper.js';\nimport { ensureScaleRawExtentInfo } from '../../coord/scaleRawExtentInfo.js';\nimport { getAxisMainType, isCoordSupported } from './helper.js';\nimport { SINGLE_REFERRING } from '../../util/model.js';\nvar each = zrUtil.each;\nvar asc = numberUtil.asc;\n/**\n * Operate single axis.\n * One axis can only operated by one axis operator.\n * Different dataZoomModels may be defined to operate the same axis.\n * (i.e. 'inside' data zoom and 'slider' data zoom components)\n * So dataZoomModels share one axisProxy in that case.\n */\nvar AxisProxy = /** @class */function () {\n  function AxisProxy(dimName, axisIndex, dataZoomModel, ecModel) {\n    this._dimName = dimName;\n    this._axisIndex = axisIndex;\n    this.ecModel = ecModel;\n    this._dataZoomModel = dataZoomModel;\n    // /**\n    //  * @readOnly\n    //  * @private\n    //  */\n    // this.hasSeriesStacked;\n  }\n  /**\n   * Whether the axisProxy is hosted by dataZoomModel.\n   */\n  AxisProxy.prototype.hostedBy = function (dataZoomModel) {\n    return this._dataZoomModel === dataZoomModel;\n  };\n  /**\n   * @return Value can only be NaN or finite value.\n   */\n  AxisProxy.prototype.getDataValueWindow = function () {\n    return this._valueWindow.slice();\n  };\n  /**\n   * @return {Array.<number>}\n   */\n  AxisProxy.prototype.getDataPercentWindow = function () {\n    return this._percentWindow.slice();\n  };\n  AxisProxy.prototype.getTargetSeriesModels = function () {\n    var seriesModels = [];\n    this.ecModel.eachSeries(function (seriesModel) {\n      if (isCoordSupported(seriesModel)) {\n        var axisMainType = getAxisMainType(this._dimName);\n        var axisModel = seriesModel.getReferringComponents(axisMainType, SINGLE_REFERRING).models[0];\n        if (axisModel && this._axisIndex === axisModel.componentIndex) {\n          seriesModels.push(seriesModel);\n        }\n      }\n    }, this);\n    return seriesModels;\n  };\n  AxisProxy.prototype.getAxisModel = function () {\n    return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex);\n  };\n  AxisProxy.prototype.getMinMaxSpan = function () {\n    return zrUtil.clone(this._minMaxSpan);\n  };\n  /**\n   * Only calculate by given range and this._dataExtent, do not change anything.\n   */\n  AxisProxy.prototype.calculateDataWindow = function (opt) {\n    var dataExtent = this._dataExtent;\n    var axisModel = this.getAxisModel();\n    var scale = axisModel.axis.scale;\n    var rangePropMode = this._dataZoomModel.getRangePropMode();\n    var percentExtent = [0, 100];\n    var percentWindow = [];\n    var valueWindow = [];\n    var hasPropModeValue;\n    each(['start', 'end'], function (prop, idx) {\n      var boundPercent = opt[prop];\n      var boundValue = opt[prop + 'Value'];\n      // Notice: dataZoom is based either on `percentProp` ('start', 'end') or\n      // on `valueProp` ('startValue', 'endValue'). (They are based on the data extent\n      // but not min/max of axis, which will be calculated by data window then).\n      // The former one is suitable for cases that a dataZoom component controls multiple\n      // axes with different unit or extent, and the latter one is suitable for accurate\n      // zoom by pixel (e.g., in dataZoomSelect).\n      // we use `getRangePropMode()` to mark which prop is used. `rangePropMode` is updated\n      // only when setOption or dispatchAction, otherwise it remains its original value.\n      // (Why not only record `percentProp` and always map to `valueProp`? Because\n      // the map `valueProp` -> `percentProp` -> `valueProp` probably not the original\n      // `valueProp`. consider two axes constrolled by one dataZoom. They have different\n      // data extent. All of values that are overflow the `dataExtent` will be calculated\n      // to percent '100%').\n      if (rangePropMode[idx] === 'percent') {\n        boundPercent == null && (boundPercent = percentExtent[idx]);\n        // Use scale.parse to math round for category or time axis.\n        boundValue = scale.parse(numberUtil.linearMap(boundPercent, percentExtent, dataExtent));\n      } else {\n        hasPropModeValue = true;\n        boundValue = boundValue == null ? dataExtent[idx] : scale.parse(boundValue);\n        // Calculating `percent` from `value` may be not accurate, because\n        // This calculation can not be inversed, because all of values that\n        // are overflow the `dataExtent` will be calculated to percent '100%'\n        boundPercent = numberUtil.linearMap(boundValue, dataExtent, percentExtent);\n      }\n      // valueWindow[idx] = round(boundValue);\n      // percentWindow[idx] = round(boundPercent);\n      // fallback to extent start/end when parsed value or percent is invalid\n      valueWindow[idx] = boundValue == null || isNaN(boundValue) ? dataExtent[idx] : boundValue;\n      percentWindow[idx] = boundPercent == null || isNaN(boundPercent) ? percentExtent[idx] : boundPercent;\n    });\n    asc(valueWindow);\n    asc(percentWindow);\n    // The windows from user calling of `dispatchAction` might be out of the extent,\n    // or do not obey the `min/maxSpan`, `min/maxValueSpan`. But we don't restrict window\n    // by `zoomLock` here, because we see `zoomLock` just as a interaction constraint,\n    // where API is able to initialize/modify the window size even though `zoomLock`\n    // specified.\n    var spans = this._minMaxSpan;\n    hasPropModeValue ? restrictSet(valueWindow, percentWindow, dataExtent, percentExtent, false) : restrictSet(percentWindow, valueWindow, percentExtent, dataExtent, true);\n    function restrictSet(fromWindow, toWindow, fromExtent, toExtent, toValue) {\n      var suffix = toValue ? 'Span' : 'ValueSpan';\n      sliderMove(0, fromWindow, fromExtent, 'all', spans['min' + suffix], spans['max' + suffix]);\n      for (var i = 0; i < 2; i++) {\n        toWindow[i] = numberUtil.linearMap(fromWindow[i], fromExtent, toExtent, true);\n        toValue && (toWindow[i] = scale.parse(toWindow[i]));\n      }\n    }\n    return {\n      valueWindow: valueWindow,\n      percentWindow: percentWindow\n    };\n  };\n  /**\n   * Notice: reset should not be called before series.restoreData() is called,\n   * so it is recommended to be called in \"process stage\" but not \"model init\n   * stage\".\n   */\n  AxisProxy.prototype.reset = function (dataZoomModel) {\n    if (dataZoomModel !== this._dataZoomModel) {\n      return;\n    }\n    var targetSeries = this.getTargetSeriesModels();\n    // Culculate data window and data extent, and record them.\n    this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries);\n    // `calculateDataWindow` uses min/maxSpan.\n    this._updateMinMaxSpan();\n    var dataWindow = this.calculateDataWindow(dataZoomModel.settledOption);\n    this._valueWindow = dataWindow.valueWindow;\n    this._percentWindow = dataWindow.percentWindow;\n    // Update axis setting then.\n    this._setAxisModel();\n  };\n  AxisProxy.prototype.filterData = function (dataZoomModel, api) {\n    if (dataZoomModel !== this._dataZoomModel) {\n      return;\n    }\n    var axisDim = this._dimName;\n    var seriesModels = this.getTargetSeriesModels();\n    var filterMode = dataZoomModel.get('filterMode');\n    var valueWindow = this._valueWindow;\n    if (filterMode === 'none') {\n      return;\n    }\n    // FIXME\n    // Toolbox may has dataZoom injected. And if there are stacked bar chart\n    // with NaN data, NaN will be filtered and stack will be wrong.\n    // So we need to force the mode to be set empty.\n    // In fect, it is not a big deal that do not support filterMode-'filter'\n    // when using toolbox#dataZoom, utill tooltip#dataZoom support \"single axis\n    // selection\" some day, which might need \"adapt to data extent on the\n    // otherAxis\", which is disabled by filterMode-'empty'.\n    // But currently, stack has been fixed to based on value but not index,\n    // so this is not an issue any more.\n    // let otherAxisModel = this.getOtherAxisModel();\n    // if (dataZoomModel.get('$fromToolbox')\n    //     && otherAxisModel\n    //     && otherAxisModel.hasSeriesStacked\n    // ) {\n    //     filterMode = 'empty';\n    // }\n    // TODO\n    // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet.\n    each(seriesModels, function (seriesModel) {\n      var seriesData = seriesModel.getData();\n      var dataDims = seriesData.mapDimensionsAll(axisDim);\n      if (!dataDims.length) {\n        return;\n      }\n      if (filterMode === 'weakFilter') {\n        var store_1 = seriesData.getStore();\n        var dataDimIndices_1 = zrUtil.map(dataDims, function (dim) {\n          return seriesData.getDimensionIndex(dim);\n        }, seriesData);\n        seriesData.filterSelf(function (dataIndex) {\n          var leftOut;\n          var rightOut;\n          var hasValue;\n          for (var i = 0; i < dataDims.length; i++) {\n            var value = store_1.get(dataDimIndices_1[i], dataIndex);\n            var thisHasValue = !isNaN(value);\n            var thisLeftOut = value < valueWindow[0];\n            var thisRightOut = value > valueWindow[1];\n            if (thisHasValue && !thisLeftOut && !thisRightOut) {\n              return true;\n            }\n            thisHasValue && (hasValue = true);\n            thisLeftOut && (leftOut = true);\n            thisRightOut && (rightOut = true);\n          }\n          // If both left out and right out, do not filter.\n          return hasValue && leftOut && rightOut;\n        });\n      } else {\n        each(dataDims, function (dim) {\n          if (filterMode === 'empty') {\n            seriesModel.setData(seriesData = seriesData.map(dim, function (value) {\n              return !isInWindow(value) ? NaN : value;\n            }));\n          } else {\n            var range = {};\n            range[dim] = valueWindow;\n            // console.time('select');\n            seriesData.selectRange(range);\n            // console.timeEnd('select');\n          }\n        });\n      }\n      each(dataDims, function (dim) {\n        seriesData.setApproximateExtent(valueWindow, dim);\n      });\n    });\n    function isInWindow(value) {\n      return value >= valueWindow[0] && value <= valueWindow[1];\n    }\n  };\n  AxisProxy.prototype._updateMinMaxSpan = function () {\n    var minMaxSpan = this._minMaxSpan = {};\n    var dataZoomModel = this._dataZoomModel;\n    var dataExtent = this._dataExtent;\n    each(['min', 'max'], function (minMax) {\n      var percentSpan = dataZoomModel.get(minMax + 'Span');\n      var valueSpan = dataZoomModel.get(minMax + 'ValueSpan');\n      valueSpan != null && (valueSpan = this.getAxisModel().axis.scale.parse(valueSpan));\n      // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan\n      if (valueSpan != null) {\n        percentSpan = numberUtil.linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true);\n      } else if (percentSpan != null) {\n        valueSpan = numberUtil.linearMap(percentSpan, [0, 100], dataExtent, true) - dataExtent[0];\n      }\n      minMaxSpan[minMax + 'Span'] = percentSpan;\n      minMaxSpan[minMax + 'ValueSpan'] = valueSpan;\n    }, this);\n  };\n  AxisProxy.prototype._setAxisModel = function () {\n    var axisModel = this.getAxisModel();\n    var percentWindow = this._percentWindow;\n    var valueWindow = this._valueWindow;\n    if (!percentWindow) {\n      return;\n    }\n    // [0, 500]: arbitrary value, guess axis extent.\n    var precision = numberUtil.getPixelPrecision(valueWindow, [0, 500]);\n    precision = Math.min(precision, 20);\n    // For value axis, if min/max/scale are not set, we just use the extent obtained\n    // by series data, which may be a little different from the extent calculated by\n    // `axisHelper.getScaleExtent`. But the different just affects the experience a\n    // little when zooming. So it will not be fixed until some users require it strongly.\n    var rawExtentInfo = axisModel.axis.scale.rawExtentInfo;\n    if (percentWindow[0] !== 0) {\n      rawExtentInfo.setDeterminedMinMax('min', +valueWindow[0].toFixed(precision));\n    }\n    if (percentWindow[1] !== 100) {\n      rawExtentInfo.setDeterminedMinMax('max', +valueWindow[1].toFixed(precision));\n    }\n    rawExtentInfo.freeze();\n  };\n  return AxisProxy;\n}();\nfunction calculateDataExtent(axisProxy, axisDim, seriesModels) {\n  var dataExtent = [Infinity, -Infinity];\n  each(seriesModels, function (seriesModel) {\n    unionAxisExtentFromData(dataExtent, seriesModel.getData(), axisDim);\n  });\n  // It is important to get \"consistent\" extent when more then one axes is\n  // controlled by a `dataZoom`, otherwise those axes will not be synchronized\n  // when zooming. But it is difficult to know what is \"consistent\", considering\n  // axes have different type or even different meanings (For example, two\n  // time axes are used to compare data of the same date in different years).\n  // So basically dataZoom just obtains extent by series.data (in category axis\n  // extent can be obtained from axis.data).\n  // Nevertheless, user can set min/max/scale on axes to make extent of axes\n  // consistent.\n  var axisModel = axisProxy.getAxisModel();\n  var rawExtentResult = ensureScaleRawExtentInfo(axisModel.axis.scale, axisModel, dataExtent).calculate();\n  return [rawExtentResult.min, rawExtentResult.max];\n}\nexport default AxisProxy;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { createHashMap, each } from 'zrender/lib/core/util.js';\nimport { getAxisMainType } from './helper.js';\nimport AxisProxy from './AxisProxy.js';\nvar dataZoomProcessor = {\n  // `dataZoomProcessor` will only be performed in needed series. Consider if\n  // there is a line series and a pie series, it is better not to update the\n  // line series if only pie series is needed to be updated.\n  getTargetSeries: function (ecModel) {\n    function eachAxisModel(cb) {\n      ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n        dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n          var axisModel = ecModel.getComponent(getAxisMainType(axisDim), axisIndex);\n          cb(axisDim, axisIndex, axisModel, dataZoomModel);\n        });\n      });\n    }\n    // FIXME: it brings side-effect to `getTargetSeries`.\n    // Prepare axis proxies.\n    eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) {\n      // dispose all last axis proxy, in case that some axis are deleted.\n      axisModel.__dzAxisProxy = null;\n    });\n    var proxyList = [];\n    eachAxisModel(function (axisDim, axisIndex, axisModel, dataZoomModel) {\n      // Different dataZooms may constrol the same axis. In that case,\n      // an axisProxy serves both of them.\n      if (!axisModel.__dzAxisProxy) {\n        // Use the first dataZoomModel as the main model of axisProxy.\n        axisModel.__dzAxisProxy = new AxisProxy(axisDim, axisIndex, dataZoomModel, ecModel);\n        proxyList.push(axisModel.__dzAxisProxy);\n      }\n    });\n    var seriesModelMap = createHashMap();\n    each(proxyList, function (axisProxy) {\n      each(axisProxy.getTargetSeriesModels(), function (seriesModel) {\n        seriesModelMap.set(seriesModel.uid, seriesModel);\n      });\n    });\n    return seriesModelMap;\n  },\n  // Consider appendData, where filter should be performed. Because data process is\n  // in block mode currently, it is not need to worry about that the overallProgress\n  // execute every frame.\n  overallReset: function (ecModel, api) {\n    ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n      // We calculate window and reset axis here but not in model\n      // init stage and not after action dispatch handler, because\n      // reset should be called after seriesData.restoreData.\n      dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n        dataZoomModel.getAxisProxy(axisDim, axisIndex).reset(dataZoomModel);\n      });\n      // Caution: data zoom filtering is order sensitive when using\n      // percent range and no min/max/scale set on axis.\n      // For example, we have dataZoom definition:\n      // [\n      //      {xAxisIndex: 0, start: 30, end: 70},\n      //      {yAxisIndex: 0, start: 20, end: 80}\n      // ]\n      // In this case, [20, 80] of y-dataZoom should be based on data\n      // that have filtered by x-dataZoom using range of [30, 70],\n      // but should not be based on full raw data. Thus sliding\n      // x-dataZoom will change both ranges of xAxis and yAxis,\n      // while sliding y-dataZoom will only change the range of yAxis.\n      // So we should filter x-axis after reset x-axis immediately,\n      // and then reset y-axis and filter y-axis.\n      dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n        dataZoomModel.getAxisProxy(axisDim, axisIndex).filterData(dataZoomModel, api);\n      });\n    });\n    ecModel.eachComponent('dataZoom', function (dataZoomModel) {\n      // Fullfill all of the range props so that user\n      // is able to get them from chart.getOption().\n      var axisProxy = dataZoomModel.findRepresentativeAxisProxy();\n      if (axisProxy) {\n        var percentRange = axisProxy.getDataPercentWindow();\n        var valueRange = axisProxy.getDataValueWindow();\n        dataZoomModel.setCalculatedRange({\n          start: percentRange[0],\n          end: percentRange[1],\n          startValue: valueRange[0],\n          endValue: valueRange[1]\n        });\n      }\n    });\n  }\n};\nexport default dataZoomProcessor;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { findEffectedDataZooms } from './helper.js';\nimport { each } from 'zrender/lib/core/util.js';\nexport default function installDataZoomAction(registers) {\n  registers.registerAction('dataZoom', function (payload, ecModel) {\n    var effectedModels = findEffectedDataZooms(ecModel, payload);\n    each(effectedModels, function (dataZoomModel) {\n      dataZoomModel.setRawRange({\n        start: payload.start,\n        end: payload.end,\n        startValue: payload.startValue,\n        endValue: payload.endValue\n      });\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport dataZoomProcessor from './dataZoomProcessor.js';\nimport installDataZoomAction from './dataZoomAction.js';\nvar installed = false;\nexport default function installCommon(registers) {\n  if (installed) {\n    return;\n  }\n  installed = true;\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, dataZoomProcessor);\n  installDataZoomAction(registers);\n  registers.registerSubTypeDefaulter('dataZoom', function () {\n    // Default 'slider' when no type specified.\n    return 'slider';\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport SelectZoomModel from './SelectZoomModel.js';\nimport SelectZoomView from './SelectZoomView.js';\nimport installCommon from './installCommon.js';\nexport function install(registers) {\n  registers.registerComponentModel(SelectZoomModel);\n  registers.registerComponentView(SelectZoomView);\n  installCommon(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nvar ToolboxFeature = /** @class */function () {\n  function ToolboxFeature() {}\n  return ToolboxFeature;\n}();\nexport { ToolboxFeature };\nvar features = {};\nexport function registerFeature(name, ctor) {\n  features[name] = ctor;\n}\nexport function getFeature(name) {\n  return features[name];\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as featureManager from './featureManager.js';\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar ToolboxModel = /** @class */function (_super) {\n  __extends(ToolboxModel, _super);\n  function ToolboxModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ToolboxModel.type;\n    return _this;\n  }\n  ToolboxModel.prototype.optionUpdated = function () {\n    _super.prototype.optionUpdated.apply(this, arguments);\n    var ecModel = this.ecModel;\n    zrUtil.each(this.option.feature, function (featureOpt, featureName) {\n      var Feature = featureManager.getFeature(featureName);\n      if (Feature) {\n        if (Feature.getDefaultOption) {\n          Feature.defaultOption = Feature.getDefaultOption(ecModel);\n        }\n        zrUtil.merge(featureOpt, Feature.defaultOption);\n      }\n    });\n  };\n  ToolboxModel.type = 'toolbox';\n  ToolboxModel.layoutMode = {\n    type: 'box',\n    ignoreSize: true\n  };\n  ToolboxModel.defaultOption = {\n    show: true,\n    z: 6,\n    // zlevel: 0,\n    orient: 'horizontal',\n    left: 'right',\n    top: 'top',\n    // right\n    // bottom\n    backgroundColor: 'transparent',\n    borderColor: tokens.color.border,\n    borderRadius: 0,\n    borderWidth: 0,\n    padding: tokens.size.m,\n    itemSize: 15,\n    itemGap: tokens.size.s,\n    showTitle: true,\n    iconStyle: {\n      borderColor: tokens.color.accent50,\n      color: 'none'\n    },\n    emphasis: {\n      iconStyle: {\n        borderColor: tokens.color.accent50\n      }\n    },\n    // textStyle: {},\n    // feature\n    tooltip: {\n      show: false,\n      position: 'bottom'\n    }\n  };\n  return ToolboxModel;\n}(ComponentModel);\nexport default ToolboxModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as formatUtil from '../../util/format.js';\nimport * as graphic from '../../util/graphic.js';\n;\nexport function makeBackground(rect, componentModel) {\n  var padding = formatUtil.normalizeCssArray(componentModel.get('padding'));\n  var style = componentModel.getItemStyle(['color', 'opacity']);\n  style.fill = componentModel.get('backgroundColor');\n  var bgRect = new graphic.Rect({\n    shape: {\n      x: rect.x - padding[3],\n      y: rect.y - padding[0],\n      width: rect.width + padding[1] + padding[3],\n      height: rect.height + padding[0] + padding[2],\n      r: componentModel.get('borderRadius')\n    },\n    style: style,\n    silent: true,\n    z2: -1\n  });\n  // FIXME\n  // `subPixelOptimizeRect` may bring some gap between edge of viewpart\n  // and background rect when setting like `left: 0`, `top: 0`.\n  // graphic.subPixelOptimizeRect(rect);\n  return bgRect;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as textContain from 'zrender/lib/contain/text.js';\nimport * as graphic from '../../util/graphic.js';\nimport { enterEmphasis, leaveEmphasis } from '../../util/states.js';\nimport Model from '../../model/Model.js';\nimport DataDiffer from '../../data/DataDiffer.js';\nimport * as listComponentHelper from '../helper/listComponent.js';\nimport ComponentView from '../../view/Component.js';\nimport { ToolboxFeature, getFeature } from './featureManager.js';\nimport { getUID } from '../../util/component.js';\nimport ZRText from 'zrender/lib/graphic/Text.js';\nimport { getFont } from '../../label/labelStyle.js';\nimport { box, createBoxLayoutReference, getLayoutRect, positionElement } from '../../util/layout.js';\nimport tokens from '../../visual/tokens.js';\nvar ToolboxView = /** @class */function (_super) {\n  __extends(ToolboxView, _super);\n  function ToolboxView() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) {\n    var group = this.group;\n    group.removeAll();\n    if (!toolboxModel.get('show')) {\n      return;\n    }\n    var itemSize = +toolboxModel.get('itemSize');\n    var isVertical = toolboxModel.get('orient') === 'vertical';\n    var featureOpts = toolboxModel.get('feature') || {};\n    var features = this._features || (this._features = {});\n    var featureNames = [];\n    zrUtil.each(featureOpts, function (opt, name) {\n      featureNames.push(name);\n    });\n    new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(zrUtil.curry(processFeature, null)).execute();\n    // Keep for diff.\n    this._featureNames = featureNames;\n    function processFeature(newIndex, oldIndex) {\n      var featureName = featureNames[newIndex];\n      var oldName = featureNames[oldIndex];\n      var featureOpt = featureOpts[featureName];\n      var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel);\n      var feature;\n      // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ?\n      if (payload && payload.newTitle != null && payload.featureName === featureName) {\n        featureOpt.title = payload.newTitle;\n      }\n      if (featureName && !oldName) {\n        // Create\n        if (isUserFeatureName(featureName)) {\n          feature = {\n            onclick: featureModel.option.onclick,\n            featureName: featureName\n          };\n        } else {\n          var Feature = getFeature(featureName);\n          if (!Feature) {\n            return;\n          }\n          feature = new Feature();\n        }\n        features[featureName] = feature;\n      } else {\n        feature = features[oldName];\n        // If feature does not exist.\n        if (!feature) {\n          return;\n        }\n      }\n      feature.uid = getUID('toolbox-feature');\n      feature.model = featureModel;\n      feature.ecModel = ecModel;\n      feature.api = api;\n      var isToolboxFeature = feature instanceof ToolboxFeature;\n      if (!featureName && oldName) {\n        isToolboxFeature && feature.dispose && feature.dispose(ecModel, api);\n        return;\n      }\n      if (!featureModel.get('show') || isToolboxFeature && feature.unusable) {\n        isToolboxFeature && feature.remove && feature.remove(ecModel, api);\n        return;\n      }\n      createIconPaths(featureModel, feature, featureName);\n      featureModel.setIconStatus = function (iconName, status) {\n        var option = this.option;\n        var iconPaths = this.iconPaths;\n        option.iconStatus = option.iconStatus || {};\n        option.iconStatus[iconName] = status;\n        if (iconPaths[iconName]) {\n          (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]);\n        }\n      };\n      if (feature instanceof ToolboxFeature) {\n        if (feature.render) {\n          feature.render(featureModel, ecModel, api, payload);\n        }\n      }\n    }\n    function createIconPaths(featureModel, feature, featureName) {\n      var iconStyleModel = featureModel.getModel('iconStyle');\n      var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']);\n      // If one feature has multiple icons, they are organized as\n      // {\n      //     icon: {\n      //         foo: '',\n      //         bar: ''\n      //     },\n      //     title: {\n      //         foo: '',\n      //         bar: ''\n      //     }\n      // }\n      var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon');\n      var titles = featureModel.get('title') || {};\n      var iconsMap;\n      var titlesMap;\n      if (zrUtil.isString(icons)) {\n        iconsMap = {};\n        iconsMap[featureName] = icons;\n      } else {\n        iconsMap = icons;\n      }\n      if (zrUtil.isString(titles)) {\n        titlesMap = {};\n        titlesMap[featureName] = titles;\n      } else {\n        titlesMap = titles;\n      }\n      var iconPaths = featureModel.iconPaths = {};\n      zrUtil.each(iconsMap, function (iconStr, iconName) {\n        var path = graphic.createIcon(iconStr, {}, {\n          x: -itemSize / 2,\n          y: -itemSize / 2,\n          width: itemSize,\n          height: itemSize\n        }); // TODO handling image\n        path.setStyle(iconStyleModel.getItemStyle());\n        var pathEmphasisState = path.ensureState('emphasis');\n        pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle();\n        // Text position calculation\n        // TODO: extract `textStyle` from `iconStyle` and use `createTextStyle`\n        var textContent = new ZRText({\n          style: {\n            text: titlesMap[iconName],\n            align: iconStyleEmphasisModel.get('textAlign'),\n            borderRadius: iconStyleEmphasisModel.get('textBorderRadius'),\n            padding: iconStyleEmphasisModel.get('textPadding'),\n            fill: null,\n            font: getFont({\n              fontStyle: iconStyleEmphasisModel.get('textFontStyle'),\n              fontFamily: iconStyleEmphasisModel.get('textFontFamily'),\n              fontSize: iconStyleEmphasisModel.get('textFontSize'),\n              fontWeight: iconStyleEmphasisModel.get('textFontWeight')\n            }, ecModel)\n          },\n          ignore: true\n        });\n        path.setTextContent(textContent);\n        graphic.setTooltipConfig({\n          el: path,\n          componentModel: toolboxModel,\n          itemName: iconName,\n          formatterParamsExtra: {\n            title: titlesMap[iconName]\n          }\n        });\n        path.__title = titlesMap[iconName];\n        path.on('mouseover', function () {\n          // Should not reuse above hoverStyle, which might be modified.\n          var hoverStyle = iconStyleEmphasisModel.getItemStyle();\n          var defaultTextPosition = isVertical ? toolboxModel.get('right') == null && toolboxModel.get('left') !== 'right' ? 'right' : 'left' : toolboxModel.get('bottom') == null && toolboxModel.get('top') !== 'bottom' ? 'bottom' : 'top';\n          textContent.setStyle({\n            fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || tokens.color.neutral99,\n            backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor')\n          });\n          path.setTextConfig({\n            position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition\n          });\n          textContent.ignore = !toolboxModel.get('showTitle');\n          // Use enterEmphasis and leaveEmphasis provide by ec.\n          // There are flags managed by the echarts.\n          api.enterEmphasis(this);\n        }).on('mouseout', function () {\n          if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') {\n            api.leaveEmphasis(this);\n          }\n          textContent.hide();\n        });\n        (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path);\n        group.add(path);\n        path.on('click', zrUtil.bind(feature.onclick, feature, ecModel, api, iconName));\n        iconPaths[iconName] = path;\n      });\n    }\n    var refContainer = createBoxLayoutReference(toolboxModel, api).refContainer;\n    var boxLayoutParams = toolboxModel.getBoxLayoutParams();\n    var padding = toolboxModel.get('padding');\n    var viewRect = getLayoutRect(boxLayoutParams, refContainer, padding);\n    box(toolboxModel.get('orient'), group, toolboxModel.get('itemGap'), viewRect.width, viewRect.height);\n    positionElement(group, boxLayoutParams, refContainer, padding);\n    // Render background after group is layout\n    // FIXME\n    group.add(listComponentHelper.makeBackground(group.getBoundingRect(), toolboxModel));\n    // Adjust icon title positions to avoid them out of screen\n    isVertical || group.eachChild(function (icon) {\n      var titleText = icon.__title;\n      // const hoverStyle = icon.hoverStyle;\n      // TODO simplify code?\n      var emphasisState = icon.ensureState('emphasis');\n      var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {});\n      var textContent = icon.getTextContent();\n      var emphasisTextState = textContent && textContent.ensureState('emphasis');\n      // May be background element\n      if (emphasisTextState && !zrUtil.isFunction(emphasisTextState) && titleText) {\n        var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {});\n        var rect = textContain.getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle));\n        var offsetX = icon.x + group.x;\n        var offsetY = icon.y + group.y + itemSize;\n        var needPutOnTop = false;\n        if (offsetY + rect.height > api.getHeight()) {\n          emphasisTextConfig.position = 'top';\n          needPutOnTop = true;\n        }\n        var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10;\n        if (offsetX + rect.width / 2 > api.getWidth()) {\n          emphasisTextConfig.position = ['100%', topOffset];\n          emphasisTextStyle.align = 'right';\n        } else if (offsetX - rect.width / 2 < 0) {\n          emphasisTextConfig.position = [0, topOffset];\n          emphasisTextStyle.align = 'left';\n        }\n      }\n    });\n  };\n  ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) {\n    zrUtil.each(this._features, function (feature) {\n      feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload);\n    });\n  };\n  // updateLayout(toolboxModel, ecModel, api, payload) {\n  //     zrUtil.each(this._features, function (feature) {\n  //         feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload);\n  //     });\n  // },\n  ToolboxView.prototype.remove = function (ecModel, api) {\n    zrUtil.each(this._features, function (feature) {\n      feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api);\n    });\n    this.group.removeAll();\n  };\n  ToolboxView.prototype.dispose = function (ecModel, api) {\n    zrUtil.each(this._features, function (feature) {\n      feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api);\n    });\n  };\n  ToolboxView.type = 'toolbox';\n  return ToolboxView;\n}(ComponentView);\nfunction isUserFeatureName(featureName) {\n  return featureName.indexOf('my') === 0;\n}\nexport default ToolboxView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/* global window, Uint8Array, document */\nimport env from 'zrender/lib/core/env.js';\nimport { ToolboxFeature } from '../featureManager.js';\nimport tokens from '../../../visual/tokens.js';\nvar SaveAsImage = /** @class */function (_super) {\n  __extends(SaveAsImage, _super);\n  function SaveAsImage() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  SaveAsImage.prototype.onclick = function (ecModel, api) {\n    var model = this.model;\n    var title = model.get('name') || ecModel.get('title.0.text') || 'echarts';\n    var isSvg = api.getZr().painter.getType() === 'svg';\n    var type = isSvg ? 'svg' : model.get('type', true) || 'png';\n    var url = api.getConnectedDataURL({\n      type: type,\n      backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || tokens.color.neutral00,\n      connectedBackgroundColor: model.get('connectedBackgroundColor'),\n      excludeComponents: model.get('excludeComponents'),\n      pixelRatio: model.get('pixelRatio')\n    });\n    var browser = env.browser;\n    // Chrome, Firefox, New Edge\n    if (typeof MouseEvent === 'function' && (browser.newEdge || !browser.ie && !browser.edge)) {\n      var $a = document.createElement('a');\n      $a.download = title + '.' + type;\n      $a.target = '_blank';\n      $a.href = url;\n      var evt = new MouseEvent('click', {\n        // some micro front-end framework\uFF0C window maybe is a Proxy\n        view: document.defaultView,\n        bubbles: true,\n        cancelable: false\n      });\n      $a.dispatchEvent(evt);\n    }\n    // IE or old Edge\n    else {\n      // @ts-ignore\n      if (window.navigator.msSaveOrOpenBlob || isSvg) {\n        var parts = url.split(',');\n        // data:[<mime type>][;charset=<charset>][;base64],<encoded data>\n        var base64Encoded = parts[0].indexOf('base64') > -1;\n        var bstr = isSvg\n        // should decode the svg data uri first\n        ? decodeURIComponent(parts[1]) : parts[1];\n        // only `atob` when the data uri is encoded with base64\n        // otherwise, like `svg` data uri exported by zrender,\n        // there will be an error, for it's not encoded with base64.\n        // (just a url-encoded string through `encodeURIComponent`)\n        base64Encoded && (bstr = window.atob(bstr));\n        var filename = title + '.' + type;\n        // @ts-ignore\n        if (window.navigator.msSaveOrOpenBlob) {\n          var n = bstr.length;\n          var u8arr = new Uint8Array(n);\n          while (n--) {\n            u8arr[n] = bstr.charCodeAt(n);\n          }\n          var blob = new Blob([u8arr]); // @ts-ignore\n          window.navigator.msSaveOrOpenBlob(blob, filename);\n        } else {\n          var frame = document.createElement('iframe');\n          document.body.appendChild(frame);\n          var cw = frame.contentWindow;\n          var doc = cw.document;\n          doc.open('image/svg+xml', 'replace');\n          doc.write(bstr);\n          doc.close();\n          cw.focus();\n          doc.execCommand('SaveAs', true, filename);\n          document.body.removeChild(frame);\n        }\n      } else {\n        var lang = model.get('lang');\n        var html = '' + '<body style=\"margin:0;\">' + '<img src=\"' + url + '\" style=\"max-width:100%;\" title=\"' + (lang && lang[0] || '') + '\" />' + '</body>';\n        var tab = window.open();\n        tab.document.write(html);\n        tab.document.title = title;\n      }\n    }\n  };\n  SaveAsImage.getDefaultOption = function (ecModel) {\n    var defaultOption = {\n      show: true,\n      icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0',\n      title: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'title']),\n      type: 'png',\n      // Default use option.backgroundColor\n      // backgroundColor: '#fff',\n      connectedBackgroundColor: tokens.color.neutral00,\n      name: '',\n      excludeComponents: ['toolbox'],\n      // use current pixel ratio of device by default\n      // pixelRatio: 1,\n      lang: ecModel.getLocaleModel().get(['toolbox', 'saveAsImage', 'lang'])\n    };\n    return defaultOption;\n  };\n  return SaveAsImage;\n}(ToolboxFeature);\nexport default SaveAsImage;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as echarts from '../../../core/echarts.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { ToolboxFeature } from '../featureManager.js';\nimport { SINGLE_REFERRING } from '../../../util/model.js';\nvar INNER_STACK_KEYWORD = '__ec_magicType_stack__';\nvar ICON_TYPES = ['line', 'bar', 'stack'];\n// stack and tiled appears in pair for the title\nvar TITLE_TYPES = ['line', 'bar', 'stack', 'tiled'];\nvar radioTypes = [['line', 'bar'], ['stack']];\nvar MagicType = /** @class */function (_super) {\n  __extends(MagicType, _super);\n  function MagicType() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  MagicType.prototype.getIcons = function () {\n    var model = this.model;\n    var availableIcons = model.get('icon');\n    var icons = {};\n    zrUtil.each(model.get('type'), function (type) {\n      if (availableIcons[type]) {\n        icons[type] = availableIcons[type];\n      }\n    });\n    return icons;\n  };\n  MagicType.getDefaultOption = function (ecModel) {\n    var defaultOption = {\n      show: true,\n      type: [],\n      // Icon group\n      icon: {\n        line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',\n        bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',\n        // eslint-disable-next-line\n        stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z' // jshint ignore:line\n      },\n      // `line`, `bar`, `stack`, `tiled`\n      title: ecModel.getLocaleModel().get(['toolbox', 'magicType', 'title']),\n      option: {},\n      seriesIndex: {}\n    };\n    return defaultOption;\n  };\n  MagicType.prototype.onclick = function (ecModel, api, type) {\n    var model = this.model;\n    var seriesIndex = model.get(['seriesIndex', type]);\n    // Not supported magicType\n    if (!seriesOptGenreator[type]) {\n      return;\n    }\n    var newOption = {\n      series: []\n    };\n    var generateNewSeriesTypes = function (seriesModel) {\n      var seriesType = seriesModel.subType;\n      var seriesId = seriesModel.id;\n      var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model);\n      if (newSeriesOpt) {\n        // PENDING If merge original option?\n        zrUtil.defaults(newSeriesOpt, seriesModel.option);\n        newOption.series.push(newSeriesOpt);\n      }\n      // Modify boundaryGap\n      var coordSys = seriesModel.coordinateSystem;\n      if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {\n        var categoryAxis = coordSys.getAxesByScale('ordinal')[0];\n        if (categoryAxis) {\n          var axisDim = categoryAxis.dim;\n          var axisType = axisDim + 'Axis';\n          var axisModel = seriesModel.getReferringComponents(axisType, SINGLE_REFERRING).models[0];\n          var axisIndex = axisModel.componentIndex;\n          newOption[axisType] = newOption[axisType] || [];\n          for (var i = 0; i <= axisIndex; i++) {\n            newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};\n          }\n          newOption[axisType][axisIndex].boundaryGap = type === 'bar';\n        }\n      }\n    };\n    zrUtil.each(radioTypes, function (radio) {\n      if (zrUtil.indexOf(radio, type) >= 0) {\n        zrUtil.each(radio, function (item) {\n          model.setIconStatus(item, 'normal');\n        });\n      }\n    });\n    model.setIconStatus(type, 'emphasis');\n    ecModel.eachComponent({\n      mainType: 'series',\n      query: seriesIndex == null ? null : {\n        seriesIndex: seriesIndex\n      }\n    }, generateNewSeriesTypes);\n    var newTitle;\n    var currentType = type;\n    // Change title of stack\n    if (type === 'stack') {\n      // use titles in model instead of ecModel\n      // as stack and tiled appears in pair, just flip them\n      // no need of checking stack state\n      newTitle = zrUtil.merge({\n        stack: model.option.title.tiled,\n        tiled: model.option.title.stack\n      }, model.option.title);\n      if (model.get(['iconStatus', type]) !== 'emphasis') {\n        currentType = 'tiled';\n      }\n    }\n    api.dispatchAction({\n      type: 'changeMagicType',\n      currentType: currentType,\n      newOption: newOption,\n      newTitle: newTitle,\n      featureName: 'magicType'\n    });\n  };\n  return MagicType;\n}(ToolboxFeature);\nvar seriesOptGenreator = {\n  'line': function (seriesType, seriesId, seriesModel, model) {\n    if (seriesType === 'bar') {\n      return zrUtil.merge({\n        id: seriesId,\n        type: 'line',\n        // Preserve data related option\n        data: seriesModel.get('data'),\n        stack: seriesModel.get('stack'),\n        markPoint: seriesModel.get('markPoint'),\n        markLine: seriesModel.get('markLine')\n      }, model.get(['option', 'line']) || {}, true);\n    }\n  },\n  'bar': function (seriesType, seriesId, seriesModel, model) {\n    if (seriesType === 'line') {\n      return zrUtil.merge({\n        id: seriesId,\n        type: 'bar',\n        // Preserve data related option\n        data: seriesModel.get('data'),\n        stack: seriesModel.get('stack'),\n        markPoint: seriesModel.get('markPoint'),\n        markLine: seriesModel.get('markLine')\n      }, model.get(['option', 'bar']) || {}, true);\n    }\n  },\n  'stack': function (seriesType, seriesId, seriesModel, model) {\n    var isStack = seriesModel.get('stack') === INNER_STACK_KEYWORD;\n    if (seriesType === 'line' || seriesType === 'bar') {\n      model.setIconStatus('stack', isStack ? 'normal' : 'emphasis');\n      return zrUtil.merge({\n        id: seriesId,\n        stack: isStack ? '' : INNER_STACK_KEYWORD\n      }, model.get(['option', 'stack']) || {}, true);\n    }\n  }\n};\n// TODO: SELF REGISTERED.\necharts.registerAction({\n  type: 'changeMagicType',\n  event: 'magicTypeChanged',\n  update: 'prepareAndUpdate'\n}, function (payload, ecModel) {\n  ecModel.mergeOption(payload.newOption);\n});\nexport default MagicType;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/* global document */\nimport * as echarts from '../../../core/echarts.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { ToolboxFeature } from '../featureManager.js';\nimport { addEventListener } from 'zrender/lib/core/event.js';\nimport { warn } from '../../../util/log.js';\nimport tokens from '../../../visual/tokens.js';\n/* global document */\nvar BLOCK_SPLITER = new Array(60).join('-');\nvar ITEM_SPLITER = '\\t';\n/**\n * Group series into two types\n *  1. on category axis, like line, bar\n *  2. others, like scatter, pie\n */\nfunction groupSeries(ecModel) {\n  var seriesGroupByCategoryAxis = {};\n  var otherSeries = [];\n  var meta = [];\n  ecModel.eachRawSeries(function (seriesModel) {\n    var coordSys = seriesModel.coordinateSystem;\n    if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) {\n      // TODO: TYPE Consider polar? Include polar may increase unecessary bundle size.\n      var baseAxis = coordSys.getBaseAxis();\n      if (baseAxis.type === 'category') {\n        var key = baseAxis.dim + '_' + baseAxis.index;\n        if (!seriesGroupByCategoryAxis[key]) {\n          seriesGroupByCategoryAxis[key] = {\n            categoryAxis: baseAxis,\n            valueAxis: coordSys.getOtherAxis(baseAxis),\n            series: []\n          };\n          meta.push({\n            axisDim: baseAxis.dim,\n            axisIndex: baseAxis.index\n          });\n        }\n        seriesGroupByCategoryAxis[key].series.push(seriesModel);\n      } else {\n        otherSeries.push(seriesModel);\n      }\n    } else {\n      otherSeries.push(seriesModel);\n    }\n  });\n  return {\n    seriesGroupByCategoryAxis: seriesGroupByCategoryAxis,\n    other: otherSeries,\n    meta: meta\n  };\n}\n/**\n * Assemble content of series on cateogory axis\n * @inner\n */\nfunction assembleSeriesWithCategoryAxis(groups) {\n  var tables = [];\n  zrUtil.each(groups, function (group, key) {\n    var categoryAxis = group.categoryAxis;\n    var valueAxis = group.valueAxis;\n    var valueAxisDim = valueAxis.dim;\n    var headers = [' '].concat(zrUtil.map(group.series, function (series) {\n      return series.name;\n    }));\n    // @ts-ignore TODO Polar\n    var columns = [categoryAxis.model.getCategories()];\n    zrUtil.each(group.series, function (series) {\n      var rawData = series.getRawData();\n      columns.push(series.getRawData().mapArray(rawData.mapDimension(valueAxisDim), function (val) {\n        return val;\n      }));\n    });\n    // Assemble table content\n    var lines = [headers.join(ITEM_SPLITER)];\n    for (var i = 0; i < columns[0].length; i++) {\n      var items = [];\n      for (var j = 0; j < columns.length; j++) {\n        items.push(columns[j][i]);\n      }\n      lines.push(items.join(ITEM_SPLITER));\n    }\n    tables.push(lines.join('\\n'));\n  });\n  return tables.join('\\n\\n' + BLOCK_SPLITER + '\\n\\n');\n}\n/**\n * Assemble content of other series\n */\nfunction assembleOtherSeries(series) {\n  return zrUtil.map(series, function (series) {\n    var data = series.getRawData();\n    var lines = [series.name];\n    var vals = [];\n    data.each(data.dimensions, function () {\n      var argLen = arguments.length;\n      var dataIndex = arguments[argLen - 1];\n      var name = data.getName(dataIndex);\n      for (var i = 0; i < argLen - 1; i++) {\n        vals[i] = arguments[i];\n      }\n      lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER));\n    });\n    return lines.join('\\n');\n  }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n');\n}\nfunction getContentFromModel(ecModel) {\n  var result = groupSeries(ecModel);\n  return {\n    value: zrUtil.filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) {\n      return !!str.replace(/[\\n\\t\\s]/g, '');\n    }).join('\\n\\n' + BLOCK_SPLITER + '\\n\\n'),\n    meta: result.meta\n  };\n}\nfunction trim(str) {\n  return str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n}\n/**\n * If a block is tsv format\n */\nfunction isTSVFormat(block) {\n  // Simple method to find out if a block is tsv format\n  var firstLine = block.slice(0, block.indexOf('\\n'));\n  if (firstLine.indexOf(ITEM_SPLITER) >= 0) {\n    return true;\n  }\n}\nvar itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g');\n/**\n * @param {string} tsv\n * @return {Object}\n */\nfunction parseTSVContents(tsv) {\n  var tsvLines = tsv.split(/\\n+/g);\n  var headers = trim(tsvLines.shift()).split(itemSplitRegex);\n  var categories = [];\n  var series = zrUtil.map(headers, function (header) {\n    return {\n      name: header,\n      data: []\n    };\n  });\n  for (var i = 0; i < tsvLines.length; i++) {\n    var items = trim(tsvLines[i]).split(itemSplitRegex);\n    categories.push(items.shift());\n    for (var j = 0; j < items.length; j++) {\n      series[j] && (series[j].data[i] = items[j]);\n    }\n  }\n  return {\n    series: series,\n    categories: categories\n  };\n}\nfunction parseListContents(str) {\n  var lines = str.split(/\\n+/g);\n  var seriesName = trim(lines.shift());\n  var data = [];\n  for (var i = 0; i < lines.length; i++) {\n    // if line is empty, ignore it.\n    // there is a case that a user forgot to delete `\\n`.\n    var line = trim(lines[i]);\n    if (!line) {\n      continue;\n    }\n    var items = line.split(itemSplitRegex);\n    var name_1 = '';\n    var value = void 0;\n    var hasName = false;\n    if (isNaN(items[0])) {\n      // First item is name\n      hasName = true;\n      name_1 = items[0];\n      items = items.slice(1);\n      data[i] = {\n        name: name_1,\n        value: []\n      };\n      value = data[i].value;\n    } else {\n      value = data[i] = [];\n    }\n    for (var j = 0; j < items.length; j++) {\n      value.push(+items[j]);\n    }\n    if (value.length === 1) {\n      hasName ? data[i].value = value[0] : data[i] = value[0];\n    }\n  }\n  return {\n    name: seriesName,\n    data: data\n  };\n}\nfunction parseContents(str, blockMetaList) {\n  var blocks = str.split(new RegExp('\\n*' + BLOCK_SPLITER + '\\n*', 'g'));\n  var newOption = {\n    series: []\n  };\n  zrUtil.each(blocks, function (block, idx) {\n    if (isTSVFormat(block)) {\n      var result = parseTSVContents(block);\n      var blockMeta = blockMetaList[idx];\n      var axisKey = blockMeta.axisDim + 'Axis';\n      if (blockMeta) {\n        newOption[axisKey] = newOption[axisKey] || [];\n        newOption[axisKey][blockMeta.axisIndex] = {\n          data: result.categories\n        };\n        newOption.series = newOption.series.concat(result.series);\n      }\n    } else {\n      var result = parseListContents(block);\n      newOption.series.push(result);\n    }\n  });\n  return newOption;\n}\nvar DataView = /** @class */function (_super) {\n  __extends(DataView, _super);\n  function DataView() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  DataView.prototype.onclick = function (ecModel, api) {\n    // FIXME: better way?\n    setTimeout(function () {\n      api.dispatchAction({\n        type: 'hideTip'\n      });\n    });\n    var container = api.getDom();\n    var model = this.model;\n    if (this._dom) {\n      container.removeChild(this._dom);\n    }\n    var root = document.createElement('div');\n    // use padding to avoid 5px whitespace\n    root.style.cssText = 'position:absolute;top:0;bottom:0;left:0;right:0;padding:5px';\n    root.style.backgroundColor = model.get('backgroundColor') || tokens.color.neutral00;\n    // Create elements\n    var header = document.createElement('h4');\n    var lang = model.get('lang') || [];\n    header.innerHTML = lang[0] || model.get('title');\n    header.style.cssText = 'margin:10px 20px';\n    header.style.color = model.get('textColor');\n    var viewMain = document.createElement('div');\n    var textarea = document.createElement('textarea');\n    viewMain.style.cssText = 'overflow:auto';\n    var optionToContent = model.get('optionToContent');\n    var contentToOption = model.get('contentToOption');\n    var result = getContentFromModel(ecModel);\n    if (zrUtil.isFunction(optionToContent)) {\n      var htmlOrDom = optionToContent(api.getOption());\n      if (zrUtil.isString(htmlOrDom)) {\n        viewMain.innerHTML = htmlOrDom;\n      } else if (zrUtil.isDom(htmlOrDom)) {\n        viewMain.appendChild(htmlOrDom);\n      }\n    } else {\n      // Use default textarea\n      textarea.readOnly = model.get('readOnly');\n      var style = textarea.style;\n      // eslint-disable-next-line max-len\n      style.cssText = 'display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none';\n      style.color = model.get('textColor');\n      style.borderColor = model.get('textareaBorderColor');\n      style.backgroundColor = model.get('textareaColor');\n      textarea.value = result.value;\n      viewMain.appendChild(textarea);\n    }\n    var blockMetaList = result.meta;\n    var buttonContainer = document.createElement('div');\n    buttonContainer.style.cssText = 'position:absolute;bottom:5px;left:0;right:0';\n    // eslint-disable-next-line max-len\n    var buttonStyle = 'float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px';\n    var closeButton = document.createElement('div');\n    var refreshButton = document.createElement('div');\n    buttonStyle += ';background-color:' + model.get('buttonColor');\n    buttonStyle += ';color:' + model.get('buttonTextColor');\n    var self = this;\n    function close() {\n      container.removeChild(root);\n      self._dom = null;\n    }\n    addEventListener(closeButton, 'click', close);\n    addEventListener(refreshButton, 'click', function () {\n      if (contentToOption == null && optionToContent != null || contentToOption != null && optionToContent == null) {\n        if (process.env.NODE_ENV !== 'production') {\n          // eslint-disable-next-line\n          warn('It seems you have just provided one of `contentToOption` and `optionToContent` functions but missed the other one. Data change is ignored.');\n        }\n        close();\n        return;\n      }\n      var newOption;\n      try {\n        if (zrUtil.isFunction(contentToOption)) {\n          newOption = contentToOption(viewMain, api.getOption());\n        } else {\n          newOption = parseContents(textarea.value, blockMetaList);\n        }\n      } catch (e) {\n        close();\n        throw new Error('Data view format error ' + e);\n      }\n      if (newOption) {\n        api.dispatchAction({\n          type: 'changeDataView',\n          newOption: newOption\n        });\n      }\n      close();\n    });\n    closeButton.innerHTML = lang[1];\n    refreshButton.innerHTML = lang[2];\n    refreshButton.style.cssText = closeButton.style.cssText = buttonStyle;\n    !model.get('readOnly') && buttonContainer.appendChild(refreshButton);\n    buttonContainer.appendChild(closeButton);\n    root.appendChild(header);\n    root.appendChild(viewMain);\n    root.appendChild(buttonContainer);\n    viewMain.style.height = container.clientHeight - 80 + 'px';\n    container.appendChild(root);\n    this._dom = root;\n  };\n  DataView.prototype.remove = function (ecModel, api) {\n    this._dom && api.getDom().removeChild(this._dom);\n  };\n  DataView.prototype.dispose = function (ecModel, api) {\n    this.remove(ecModel, api);\n  };\n  DataView.getDefaultOption = function (ecModel) {\n    var defaultOption = {\n      show: true,\n      readOnly: false,\n      optionToContent: null,\n      contentToOption: null,\n      // eslint-disable-next-line\n      icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28',\n      title: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'title']),\n      lang: ecModel.getLocaleModel().get(['toolbox', 'dataView', 'lang']),\n      backgroundColor: tokens.color.background,\n      textColor: tokens.color.primary,\n      textareaColor: tokens.color.background,\n      textareaBorderColor: tokens.color.border,\n      buttonColor: tokens.color.accent50,\n      buttonTextColor: tokens.color.neutral00\n    };\n    return defaultOption;\n  };\n  return DataView;\n}(ToolboxFeature);\n/**\n * @inner\n */\nfunction tryMergeDataOption(newData, originalData) {\n  return zrUtil.map(newData, function (newVal, idx) {\n    var original = originalData && originalData[idx];\n    if (zrUtil.isObject(original) && !zrUtil.isArray(original)) {\n      var newValIsObject = zrUtil.isObject(newVal) && !zrUtil.isArray(newVal);\n      if (!newValIsObject) {\n        newVal = {\n          value: newVal\n        };\n      }\n      // original data has name but new data has no name\n      var shouldDeleteName = original.name != null && newVal.name == null;\n      // Original data has option\n      newVal = zrUtil.defaults(newVal, original);\n      shouldDeleteName && delete newVal.name;\n      return newVal;\n    } else {\n      return newVal;\n    }\n  });\n}\n// TODO: SELF REGISTERED.\necharts.registerAction({\n  type: 'changeDataView',\n  event: 'dataViewChanged',\n  update: 'prepareAndUpdate'\n}, function (payload, ecModel) {\n  var newSeriesOptList = [];\n  zrUtil.each(payload.newOption.series, function (seriesOpt) {\n    var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0];\n    if (!seriesModel) {\n      // New created series\n      // Geuss the series type\n      newSeriesOptList.push(zrUtil.extend({\n        // Default is scatter\n        type: 'scatter'\n      }, seriesOpt));\n    } else {\n      var originalData = seriesModel.get('data');\n      newSeriesOptList.push({\n        name: seriesOpt.name,\n        data: tryMergeDataOption(seriesOpt.data, originalData)\n      });\n    }\n  });\n  ecModel.mergeOption(zrUtil.defaults({\n    series: newSeriesOptList\n  }, payload.newOption));\n});\nexport default DataView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { makeInner } from '../../util/model.js';\nvar each = zrUtil.each;\nvar inner = makeInner();\n/**\n * @param ecModel\n * @param newSnapshot key is dataZoomId\n */\nexport function push(ecModel, newSnapshot) {\n  var storedSnapshots = getStoreSnapshots(ecModel);\n  // If previous dataZoom can not be found,\n  // complete an range with current range.\n  each(newSnapshot, function (batchItem, dataZoomId) {\n    var i = storedSnapshots.length - 1;\n    for (; i >= 0; i--) {\n      var snapshot = storedSnapshots[i];\n      if (snapshot[dataZoomId]) {\n        break;\n      }\n    }\n    if (i < 0) {\n      // No origin range set, create one by current range.\n      var dataZoomModel = ecModel.queryComponents({\n        mainType: 'dataZoom',\n        subType: 'select',\n        id: dataZoomId\n      })[0];\n      if (dataZoomModel) {\n        var percentRange = dataZoomModel.getPercentRange();\n        storedSnapshots[0][dataZoomId] = {\n          dataZoomId: dataZoomId,\n          start: percentRange[0],\n          end: percentRange[1]\n        };\n      }\n    }\n  });\n  storedSnapshots.push(newSnapshot);\n}\nexport function pop(ecModel) {\n  var storedSnapshots = getStoreSnapshots(ecModel);\n  var head = storedSnapshots[storedSnapshots.length - 1];\n  storedSnapshots.length > 1 && storedSnapshots.pop();\n  // Find top for all dataZoom.\n  var snapshot = {};\n  each(head, function (batchItem, dataZoomId) {\n    for (var i = storedSnapshots.length - 1; i >= 0; i--) {\n      batchItem = storedSnapshots[i][dataZoomId];\n      if (batchItem) {\n        snapshot[dataZoomId] = batchItem;\n        break;\n      }\n    }\n  });\n  return snapshot;\n}\nexport function clear(ecModel) {\n  inner(ecModel).snapshots = null;\n}\nexport function count(ecModel) {\n  return getStoreSnapshots(ecModel).length;\n}\n/**\n * History length of each dataZoom may be different.\n * this._history[0] is used to store origin range.\n */\nfunction getStoreSnapshots(ecModel) {\n  var store = inner(ecModel);\n  if (!store.snapshots) {\n    store.snapshots = [{}];\n  }\n  return store.snapshots;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as echarts from '../../../core/echarts.js';\nimport * as history from '../../dataZoom/history.js';\nimport { ToolboxFeature } from '../featureManager.js';\nvar RestoreOption = /** @class */function (_super) {\n  __extends(RestoreOption, _super);\n  function RestoreOption() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  RestoreOption.prototype.onclick = function (ecModel, api) {\n    history.clear(ecModel);\n    api.dispatchAction({\n      type: 'restore',\n      from: this.uid\n    });\n  };\n  RestoreOption.getDefaultOption = function (ecModel) {\n    var defaultOption = {\n      show: true,\n      // eslint-disable-next-line\n      icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5',\n      title: ecModel.getLocaleModel().get(['toolbox', 'restore', 'title'])\n    };\n    return defaultOption;\n  };\n  return RestoreOption;\n}(ToolboxFeature);\n// TODO: SELF REGISTERED.\necharts.registerAction({\n  type: 'restore',\n  event: 'restore',\n  update: 'prepareAndUpdate'\n}, function (payload, ecModel) {\n  ecModel.resetOption('recreate');\n});\nexport default RestoreOption;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { each, indexOf, curry, assert, map, createHashMap } from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as brushHelper from './brushHelper.js';\nimport { parseFinder as modelUtilParseFinder } from '../../util/model.js';\n// FIXME\n// how to genarialize to more coordinate systems.\nvar INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap'];\nvar BrushTargetManager = /** @class */function () {\n  /**\n   * @param finder contains Index/Id/Name of xAxis/yAxis/geo/grid\n   *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}\n   * @param opt.include include coordinate system types.\n   */\n  function BrushTargetManager(finder, ecModel, opt) {\n    var _this = this;\n    this._targetInfoList = [];\n    var foundCpts = parseFinder(ecModel, finder);\n    each(targetInfoBuilders, function (builder, type) {\n      if (!opt || !opt.include || indexOf(opt.include, type) >= 0) {\n        builder(foundCpts, _this._targetInfoList);\n      }\n    });\n  }\n  BrushTargetManager.prototype.setOutputRanges = function (areas, ecModel) {\n    this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {\n      (area.coordRanges || (area.coordRanges = [])).push(coordRange);\n      // area.coordRange is the first of area.coordRanges\n      if (!area.coordRange) {\n        area.coordRange = coordRange;\n        // In 'category' axis, coord to pixel is not reversible, so we can not\n        // rebuild range by coordRange accrately, which may bring trouble when\n        // brushing only one item. So we use __rangeOffset to rebuilding range\n        // by coordRange. And this it only used in brush component so it is no\n        // need to be adapted to coordRanges.\n        var result = coordConvert[area.brushType](0, coordSys, coordRange);\n        area.__rangeOffset = {\n          offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]),\n          xyMinMax: result.xyMinMax\n        };\n      }\n    });\n    return areas;\n  };\n  BrushTargetManager.prototype.matchOutputRanges = function (areas, ecModel, cb) {\n    each(areas, function (area) {\n      var targetInfo = this.findTargetInfo(area, ecModel);\n      if (targetInfo && targetInfo !== true) {\n        each(targetInfo.coordSyses, function (coordSys) {\n          var result = coordConvert[area.brushType](1, coordSys, area.range, true);\n          cb(area, result.values, coordSys, ecModel);\n        });\n      }\n    }, this);\n  };\n  /**\n   * the `areas` is `BrushModel.areas`.\n   * Called in layout stage.\n   * convert `area.coordRange` to global range and set panelId to `area.range`.\n   */\n  BrushTargetManager.prototype.setInputRanges = function (areas, ecModel) {\n    each(areas, function (area) {\n      var targetInfo = this.findTargetInfo(area, ecModel);\n      if (process.env.NODE_ENV !== 'production') {\n        assert(!targetInfo || targetInfo === true || area.coordRange, 'coordRange must be specified when coord index specified.');\n        assert(!targetInfo || targetInfo !== true || area.range, 'range must be specified in global brush.');\n      }\n      area.range = area.range || [];\n      // convert coordRange to global range and set panelId.\n      if (targetInfo && targetInfo !== true) {\n        area.panelId = targetInfo.panelId;\n        // (1) area.range should always be calculate from coordRange but does\n        // not keep its original value, for the sake of the dataZoom scenario,\n        // where area.coordRange remains unchanged but area.range may be changed.\n        // (2) Only support converting one coordRange to pixel range in brush\n        // component. So do not consider `coordRanges`.\n        // (3) About __rangeOffset, see comment above.\n        var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange);\n        var rangeOffset = area.__rangeOffset;\n        area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values;\n      }\n    }, this);\n  };\n  BrushTargetManager.prototype.makePanelOpts = function (api, getDefaultBrushType) {\n    return map(this._targetInfoList, function (targetInfo) {\n      var rect = targetInfo.getPanelRect();\n      return {\n        panelId: targetInfo.panelId,\n        defaultBrushType: getDefaultBrushType ? getDefaultBrushType(targetInfo) : null,\n        clipPath: brushHelper.makeRectPanelClipPath(rect),\n        isTargetByCursor: brushHelper.makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel),\n        getLinearBrushOtherExtent: brushHelper.makeLinearBrushOtherExtent(rect)\n      };\n    });\n  };\n  BrushTargetManager.prototype.controlSeries = function (area, seriesModel, ecModel) {\n    // Check whether area is bound in coord, and series do not belong to that coord.\n    // If do not do this check, some brush (like lineX) will controll all axes.\n    var targetInfo = this.findTargetInfo(area, ecModel);\n    return targetInfo === true || targetInfo && indexOf(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0;\n  };\n  /**\n   * If return Object, a coord found.\n   * If return true, global found.\n   * Otherwise nothing found.\n   */\n  BrushTargetManager.prototype.findTargetInfo = function (area, ecModel) {\n    var targetInfoList = this._targetInfoList;\n    var foundCpts = parseFinder(ecModel, area);\n    for (var i = 0; i < targetInfoList.length; i++) {\n      var targetInfo = targetInfoList[i];\n      var areaPanelId = area.panelId;\n      if (areaPanelId) {\n        if (targetInfo.panelId === areaPanelId) {\n          return targetInfo;\n        }\n      } else {\n        for (var j = 0; j < targetInfoMatchers.length; j++) {\n          if (targetInfoMatchers[j](foundCpts, targetInfo)) {\n            return targetInfo;\n          }\n        }\n      }\n    }\n    return true;\n  };\n  return BrushTargetManager;\n}();\nfunction formatMinMax(minMax) {\n  minMax[0] > minMax[1] && minMax.reverse();\n  return minMax;\n}\nfunction parseFinder(ecModel, finder) {\n  return modelUtilParseFinder(ecModel, finder, {\n    includeMainTypes: INCLUDE_FINDER_MAIN_TYPES\n  });\n}\nvar targetInfoBuilders = {\n  grid: function (foundCpts, targetInfoList) {\n    var xAxisModels = foundCpts.xAxisModels;\n    var yAxisModels = foundCpts.yAxisModels;\n    var gridModels = foundCpts.gridModels;\n    // Remove duplicated.\n    var gridModelMap = createHashMap();\n    var xAxesHas = {};\n    var yAxesHas = {};\n    if (!xAxisModels && !yAxisModels && !gridModels) {\n      return;\n    }\n    each(xAxisModels, function (axisModel) {\n      var gridModel = axisModel.axis.grid.model;\n      gridModelMap.set(gridModel.id, gridModel);\n      xAxesHas[gridModel.id] = true;\n    });\n    each(yAxisModels, function (axisModel) {\n      var gridModel = axisModel.axis.grid.model;\n      gridModelMap.set(gridModel.id, gridModel);\n      yAxesHas[gridModel.id] = true;\n    });\n    each(gridModels, function (gridModel) {\n      gridModelMap.set(gridModel.id, gridModel);\n      xAxesHas[gridModel.id] = true;\n      yAxesHas[gridModel.id] = true;\n    });\n    gridModelMap.each(function (gridModel) {\n      var grid = gridModel.coordinateSystem;\n      var cartesians = [];\n      each(grid.getCartesians(), function (cartesian, index) {\n        if (indexOf(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf(yAxisModels, cartesian.getAxis('y').model) >= 0) {\n          cartesians.push(cartesian);\n        }\n      });\n      targetInfoList.push({\n        panelId: 'grid--' + gridModel.id,\n        gridModel: gridModel,\n        coordSysModel: gridModel,\n        // Use the first one as the representitive coordSys.\n        coordSys: cartesians[0],\n        coordSyses: cartesians,\n        getPanelRect: panelRectBuilders.grid,\n        xAxisDeclared: xAxesHas[gridModel.id],\n        yAxisDeclared: yAxesHas[gridModel.id]\n      });\n    });\n  },\n  geo: function (foundCpts, targetInfoList) {\n    each(foundCpts.geoModels, function (geoModel) {\n      var coordSys = geoModel.coordinateSystem;\n      targetInfoList.push({\n        panelId: 'geo--' + geoModel.id,\n        geoModel: geoModel,\n        coordSysModel: geoModel,\n        coordSys: coordSys,\n        coordSyses: [coordSys],\n        getPanelRect: panelRectBuilders.geo\n      });\n    });\n  }\n};\nvar targetInfoMatchers = [\n// grid\nfunction (foundCpts, targetInfo) {\n  var xAxisModel = foundCpts.xAxisModel;\n  var yAxisModel = foundCpts.yAxisModel;\n  var gridModel = foundCpts.gridModel;\n  !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model);\n  !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model);\n  return gridModel && gridModel === targetInfo.gridModel;\n},\n// geo\nfunction (foundCpts, targetInfo) {\n  var geoModel = foundCpts.geoModel;\n  return geoModel && geoModel === targetInfo.geoModel;\n}];\nvar panelRectBuilders = {\n  grid: function () {\n    // grid is not Transformable.\n    return this.coordSys.master.getRect().clone();\n  },\n  geo: function () {\n    var coordSys = this.coordSys;\n    var rect = coordSys.getBoundingRect().clone();\n    // geo roam and zoom transform\n    rect.applyTransform(graphic.getTransform(coordSys));\n    return rect;\n  }\n};\nvar coordConvert = {\n  lineX: curry(axisConvert, 0),\n  lineY: curry(axisConvert, 1),\n  rect: function (to, coordSys, rangeOrCoordRange, clamp) {\n    var xminymin = to ? coordSys.pointToData([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]], clamp);\n    var xmaxymax = to ? coordSys.pointToData([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp) : coordSys.dataToPoint([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]], clamp);\n    var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])];\n    return {\n      values: values,\n      xyMinMax: values\n    };\n  },\n  polygon: function (to, coordSys, rangeOrCoordRange, clamp) {\n    var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]];\n    var values = map(rangeOrCoordRange, function (item) {\n      var p = to ? coordSys.pointToData(item, clamp) : coordSys.dataToPoint(item, clamp);\n      xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]);\n      xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]);\n      xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]);\n      xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]);\n      return p;\n    });\n    return {\n      values: values,\n      xyMinMax: xyMinMax\n    };\n  }\n};\nfunction axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) {\n  if (process.env.NODE_ENV !== 'production') {\n    assert(coordSys.type === 'cartesian2d', 'lineX/lineY brush is available only in cartesian2d.');\n  }\n  var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]);\n  var values = formatMinMax(map([0, 1], function (i) {\n    return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i]), true) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i]));\n  }));\n  var xyMinMax = [];\n  xyMinMax[axisNameIndex] = values;\n  xyMinMax[1 - axisNameIndex] = [NaN, NaN];\n  return {\n    values: values,\n    xyMinMax: xyMinMax\n  };\n}\nvar diffProcessor = {\n  lineX: curry(axisDiffProcessor, 0),\n  lineY: curry(axisDiffProcessor, 1),\n  rect: function (values, refer, scales) {\n    return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]];\n  },\n  polygon: function (values, refer, scales) {\n    return map(values, function (item, idx) {\n      return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]];\n    });\n  }\n};\nfunction axisDiffProcessor(axisNameIndex, values, refer, scales) {\n  return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]];\n}\n// We have to process scale caused by dataZoom manually,\n// although it might be not accurate.\n// Return [0~1, 0~1]\nfunction getScales(xyMinMaxCurr, xyMinMaxOrigin) {\n  var sizeCurr = getSize(xyMinMaxCurr);\n  var sizeOrigin = getSize(xyMinMaxOrigin);\n  var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]];\n  isNaN(scales[0]) && (scales[0] = 1);\n  isNaN(scales[1]) && (scales[1] = 1);\n  return scales;\n}\nfunction getSize(xyMinMax) {\n  return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN];\n}\nexport default BrushTargetManager;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n// TODO depends on DataZoom and Brush\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport BrushController from '../../helper/BrushController.js';\nimport BrushTargetManager from '../../helper/BrushTargetManager.js';\nimport * as history from '../../dataZoom/history.js';\nimport sliderMove from '../../helper/sliderMove.js';\nimport { ToolboxFeature } from '../featureManager.js';\nimport { makeInternalComponentId, parseFinder } from '../../../util/model.js';\nimport { registerInternalOptionCreator } from '../../../model/internalComponentCreator.js';\nimport tokens from '../../../visual/tokens.js';\nvar each = zrUtil.each;\nvar DATA_ZOOM_ID_BASE = makeInternalComponentId('toolbox-dataZoom_');\nvar ICON_TYPES = ['zoom', 'back'];\nvar DataZoomFeature = /** @class */function (_super) {\n  __extends(DataZoomFeature, _super);\n  function DataZoomFeature() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  DataZoomFeature.prototype.render = function (featureModel, ecModel, api, payload) {\n    if (!this._brushController) {\n      this._brushController = new BrushController(api.getZr());\n      this._brushController.on('brush', zrUtil.bind(this._onBrush, this)).mount();\n    }\n    updateZoomBtnStatus(featureModel, ecModel, this, payload, api);\n    updateBackBtnStatus(featureModel, ecModel);\n  };\n  DataZoomFeature.prototype.onclick = function (ecModel, api, type) {\n    handlers[type].call(this);\n  };\n  DataZoomFeature.prototype.remove = function (ecModel, api) {\n    this._brushController && this._brushController.unmount();\n  };\n  DataZoomFeature.prototype.dispose = function (ecModel, api) {\n    this._brushController && this._brushController.dispose();\n  };\n  DataZoomFeature.prototype._onBrush = function (eventParam) {\n    var areas = eventParam.areas;\n    if (!eventParam.isEnd || !areas.length) {\n      return;\n    }\n    var snapshot = {};\n    var ecModel = this.ecModel;\n    this._brushController.updateCovers([]); // remove cover\n    var brushTargetManager = new BrushTargetManager(makeAxisFinder(this.model), ecModel, {\n      include: ['grid']\n    });\n    brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {\n      if (coordSys.type !== 'cartesian2d') {\n        return;\n      }\n      var brushType = area.brushType;\n      if (brushType === 'rect') {\n        setBatch('x', coordSys, coordRange[0]);\n        setBatch('y', coordSys, coordRange[1]);\n      } else {\n        setBatch({\n          lineX: 'x',\n          lineY: 'y'\n        }[brushType], coordSys, coordRange);\n      }\n    });\n    history.push(ecModel, snapshot);\n    this._dispatchZoomAction(snapshot);\n    function setBatch(dimName, coordSys, minMax) {\n      var axis = coordSys.getAxis(dimName);\n      var axisModel = axis.model;\n      var dataZoomModel = findDataZoom(dimName, axisModel, ecModel);\n      // Restrict range.\n      var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();\n      if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {\n        minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan);\n      }\n      dataZoomModel && (snapshot[dataZoomModel.id] = {\n        dataZoomId: dataZoomModel.id,\n        startValue: minMax[0],\n        endValue: minMax[1]\n      });\n    }\n    function findDataZoom(dimName, axisModel, ecModel) {\n      var found;\n      ecModel.eachComponent({\n        mainType: 'dataZoom',\n        subType: 'select'\n      }, function (dzModel) {\n        var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);\n        has && (found = dzModel);\n      });\n      return found;\n    }\n  };\n  ;\n  DataZoomFeature.prototype._dispatchZoomAction = function (snapshot) {\n    var batch = [];\n    // Convert from hash map to array.\n    each(snapshot, function (batchItem, dataZoomId) {\n      batch.push(zrUtil.clone(batchItem));\n    });\n    batch.length && this.api.dispatchAction({\n      type: 'dataZoom',\n      from: this.uid,\n      batch: batch\n    });\n  };\n  DataZoomFeature.getDefaultOption = function (ecModel) {\n    var defaultOption = {\n      show: true,\n      filterMode: 'filter',\n      // Icon group\n      icon: {\n        zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',\n        back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'\n      },\n      // `zoom`, `back`\n      title: ecModel.getLocaleModel().get(['toolbox', 'dataZoom', 'title']),\n      brushStyle: {\n        borderWidth: 0,\n        color: tokens.color.backgroundTint\n      }\n    };\n    return defaultOption;\n  };\n  return DataZoomFeature;\n}(ToolboxFeature);\nvar handlers = {\n  zoom: function () {\n    var nextActive = !this._isZoomActive;\n    this.api.dispatchAction({\n      type: 'takeGlobalCursor',\n      key: 'dataZoomSelect',\n      dataZoomSelectActive: nextActive\n    });\n  },\n  back: function () {\n    this._dispatchZoomAction(history.pop(this.ecModel));\n  }\n};\nfunction makeAxisFinder(dzFeatureModel) {\n  var setting = {\n    xAxisIndex: dzFeatureModel.get('xAxisIndex', true),\n    yAxisIndex: dzFeatureModel.get('yAxisIndex', true),\n    xAxisId: dzFeatureModel.get('xAxisId', true),\n    yAxisId: dzFeatureModel.get('yAxisId', true)\n  };\n  // If both `xAxisIndex` `xAxisId` not set, it means 'all'.\n  // If both `yAxisIndex` `yAxisId` not set, it means 'all'.\n  // Some old cases set like this below to close yAxis control but leave xAxis control:\n  // `{ feature: { dataZoom: { yAxisIndex: false } }`.\n  if (setting.xAxisIndex == null && setting.xAxisId == null) {\n    setting.xAxisIndex = 'all';\n  }\n  if (setting.yAxisIndex == null && setting.yAxisId == null) {\n    setting.yAxisIndex = 'all';\n  }\n  return setting;\n}\nfunction updateBackBtnStatus(featureModel, ecModel) {\n  featureModel.setIconStatus('back', history.count(ecModel) > 1 ? 'emphasis' : 'normal');\n}\nfunction updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {\n  var zoomActive = view._isZoomActive;\n  if (payload && payload.type === 'takeGlobalCursor') {\n    zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false;\n  }\n  view._isZoomActive = zoomActive;\n  featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');\n  var brushTargetManager = new BrushTargetManager(makeAxisFinder(featureModel), ecModel, {\n    include: ['grid']\n  });\n  var panels = brushTargetManager.makePanelOpts(api, function (targetInfo) {\n    return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect';\n  });\n  view._brushController.setPanels(panels).enableBrush(zoomActive && panels.length ? {\n    brushType: 'auto',\n    brushStyle: featureModel.getModel('brushStyle').getItemStyle()\n  } : false);\n}\nregisterInternalOptionCreator('dataZoom', function (ecModel) {\n  var toolboxModel = ecModel.getComponent('toolbox', 0);\n  var featureDataZoomPath = ['feature', 'dataZoom'];\n  if (!toolboxModel || toolboxModel.get(featureDataZoomPath) == null) {\n    return;\n  }\n  var dzFeatureModel = toolboxModel.getModel(featureDataZoomPath);\n  var dzOptions = [];\n  var finder = makeAxisFinder(dzFeatureModel);\n  var finderResult = parseFinder(ecModel, finder);\n  each(finderResult.xAxisModels, function (axisModel) {\n    return buildInternalOptions(axisModel, 'xAxis', 'xAxisIndex');\n  });\n  each(finderResult.yAxisModels, function (axisModel) {\n    return buildInternalOptions(axisModel, 'yAxis', 'yAxisIndex');\n  });\n  function buildInternalOptions(axisModel, axisMainType, axisIndexPropName) {\n    var axisIndex = axisModel.componentIndex;\n    var newOpt = {\n      type: 'select',\n      $fromToolbox: true,\n      // Default to be filter\n      filterMode: dzFeatureModel.get('filterMode', true) || 'filter',\n      // Id for merge mapping.\n      id: DATA_ZOOM_ID_BASE + axisMainType + axisIndex\n    };\n    newOpt[axisIndexPropName] = axisIndex;\n    dzOptions.push(newOpt);\n  }\n  return dzOptions;\n});\nexport default DataZoomFeature;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport { install as installDataZoomSelect } from '../../component/dataZoom/installDataZoomSelect.js';\nimport ToolboxModel from './ToolboxModel.js';\nimport ToolboxView from './ToolboxView.js';\n// TODOD: REGISTER IN INSTALL\nimport { registerFeature } from './featureManager.js';\nimport SaveAsImage from './feature/SaveAsImage.js';\nimport MagicType from './feature/MagicType.js';\nimport DataView from './feature/DataView.js';\nimport Restore from './feature/Restore.js';\nimport DataZoom from './feature/DataZoom.js';\nexport function install(registers) {\n  registers.registerComponentModel(ToolboxModel);\n  registers.registerComponentView(ToolboxView);\n  registerFeature('saveAsImage', SaveAsImage);\n  registerFeature('magicType', MagicType);\n  registerFeature('dataView', DataView);\n  registerFeature('dataZoom', DataZoom);\n  registerFeature('restore', Restore);\n  use(installDataZoomSelect);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar TooltipModel = /** @class */function (_super) {\n  __extends(TooltipModel, _super);\n  function TooltipModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TooltipModel.type;\n    return _this;\n  }\n  TooltipModel.type = 'tooltip';\n  TooltipModel.dependencies = ['axisPointer'];\n  TooltipModel.defaultOption = {\n    // zlevel: 0,\n    z: 60,\n    show: true,\n    // tooltip main content\n    showContent: true,\n    // 'trigger' only works on coordinate system.\n    // 'item' | 'axis' | 'none'\n    trigger: 'item',\n    // 'click' | 'mousemove' | 'none'\n    triggerOn: 'mousemove|click',\n    alwaysShowContent: false,\n    renderMode: 'auto',\n    // whether restraint content inside viewRect.\n    // If renderMode: 'richText', default true.\n    // If renderMode: 'html', defaults to `false` (for backward compat).\n    confine: null,\n    showDelay: 0,\n    hideDelay: 100,\n    // Animation transition time, unit is second\n    transitionDuration: 0.4,\n    displayTransition: true,\n    enterable: false,\n    backgroundColor: tokens.color.neutral00,\n    // box shadow\n    shadowBlur: 10,\n    shadowColor: 'rgba(0, 0, 0, .2)',\n    shadowOffsetX: 1,\n    shadowOffsetY: 2,\n    // tooltip border radius, unit is px, default is 4\n    borderRadius: 4,\n    // tooltip border width, unit is px, default is 0 (no border)\n    borderWidth: 1,\n    defaultBorderColor: tokens.color.border,\n    // Tooltip inside padding, default is 5 for all direction\n    // Array is allowed to set up, right, bottom, left, same with css\n    // The default value: See `tooltip/tooltipMarkup.ts#getPaddingFromTooltipModel`.\n    padding: null,\n    // Extra css text\n    extraCssText: '',\n    // axis indicator, trigger by axis\n    axisPointer: {\n      // default is line\n      // legal values: 'line' | 'shadow' | 'cross'\n      type: 'line',\n      // Valid when type is line, appoint tooltip line locate on which line. Optional\n      // legal values: 'x' | 'y' | 'angle' | 'radius' | 'auto'\n      // default is 'auto', chose the axis which type is category.\n      // for multiply y axis, cartesian coord chose x axis, polar chose angle axis\n      axis: 'auto',\n      animation: 'auto',\n      animationDurationUpdate: 200,\n      animationEasingUpdate: 'exponentialOut',\n      crossStyle: {\n        color: tokens.color.borderShade,\n        width: 1,\n        type: 'dashed',\n        // TODO formatter\n        textStyle: {}\n      }\n      // lineStyle and shadowStyle should not be specified here,\n      // otherwise it will always override those styles on option.axisPointer.\n    },\n    textStyle: {\n      color: tokens.color.tertiary,\n      fontSize: 14\n    }\n  };\n  return TooltipModel;\n}(ComponentModel);\nexport default TooltipModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { toCamelCase } from '../../util/format.js';\nimport env from 'zrender/lib/core/env.js';\n/* global document */\nexport function shouldTooltipConfine(tooltipModel) {\n  var confineOption = tooltipModel.get('confine');\n  return confineOption != null ? !!confineOption\n  // In richText mode, the outside part can not be visible.\n  : tooltipModel.get('renderMode') === 'richText';\n}\nfunction testStyle(styleProps) {\n  if (!env.domSupported) {\n    return;\n  }\n  var style = document.documentElement.style;\n  for (var i = 0, len = styleProps.length; i < len; i++) {\n    if (styleProps[i] in style) {\n      return styleProps[i];\n    }\n  }\n}\nexport var TRANSFORM_VENDOR = testStyle(['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\nexport var TRANSITION_VENDOR = testStyle(['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\nexport function toCSSVendorPrefix(styleVendor, styleProp) {\n  if (!styleVendor) {\n    return styleProp;\n  }\n  styleProp = toCamelCase(styleProp, true);\n  var idx = styleVendor.indexOf(styleProp);\n  styleVendor = idx === -1 ? styleProp : \"-\" + styleVendor.slice(0, idx) + \"-\" + styleProp;\n  return styleVendor.toLowerCase();\n}\nexport function getComputedStyle(el, style) {\n  var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el);\n  return stl ? style ? stl[style] : stl : null;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isString, indexOf, each, bind, isFunction, isArray, isDom, retrieve2 } from 'zrender/lib/core/util.js';\nimport { normalizeEvent } from 'zrender/lib/core/event.js';\nimport { transformLocalCoord, transformLocalCoordClear } from 'zrender/lib/core/dom.js';\nimport env from 'zrender/lib/core/env.js';\nimport { convertToColorString, toCamelCase, normalizeCssArray } from '../../util/format.js';\nimport { shouldTooltipConfine, toCSSVendorPrefix, getComputedStyle, TRANSFORM_VENDOR, TRANSITION_VENDOR } from './helper.js';\nimport { getPaddingFromTooltipModel } from './tooltipMarkup.js';\n/* global document, window */\nvar CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition');\nvar CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform');\n// eslint-disable-next-line\nvar gCssText = \"position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;\" + (env.transform3dSupported ? 'will-change:transform;' : '');\nfunction mirrorPos(pos) {\n  pos = pos === 'left' ? 'right' : pos === 'right' ? 'left' : pos === 'top' ? 'bottom' : 'top';\n  return pos;\n}\nfunction assembleArrow(tooltipModel, borderColor, arrowPosition) {\n  if (!isString(arrowPosition) || arrowPosition === 'inside') {\n    return '';\n  }\n  var backgroundColor = tooltipModel.get('backgroundColor');\n  var borderWidth = tooltipModel.get('borderWidth');\n  borderColor = convertToColorString(borderColor);\n  var arrowPos = mirrorPos(arrowPosition);\n  var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6);\n  var positionStyle = '';\n  var transformStyle = CSS_TRANSFORM_VENDOR + ':';\n  var rotateDeg;\n  if (indexOf(['left', 'right'], arrowPos) > -1) {\n    positionStyle += 'top:50%';\n    transformStyle += \"translateY(-50%) rotate(\" + (rotateDeg = arrowPos === 'left' ? -225 : -45) + \"deg)\";\n  } else {\n    positionStyle += 'left:50%';\n    transformStyle += \"translateX(-50%) rotate(\" + (rotateDeg = arrowPos === 'top' ? 225 : 45) + \"deg)\";\n  }\n  var rotateRadian = rotateDeg * Math.PI / 180;\n  var arrowWH = arrowSize + borderWidth;\n  var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian));\n  var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100;\n  positionStyle += \";\" + arrowPos + \":-\" + arrowOffset + \"px\";\n  var borderStyle = borderColor + \" solid \" + borderWidth + \"px;\";\n  var styleCss = [\"position:absolute;width:\" + arrowSize + \"px;height:\" + arrowSize + \"px;z-index:-1;\", positionStyle + \";\" + transformStyle + \";\", \"border-bottom:\" + borderStyle, \"border-right:\" + borderStyle, \"background-color:\" + backgroundColor + \";\"];\n  return \"<div style=\\\"\" + styleCss.join('') + \"\\\"></div>\";\n}\nfunction assembleTransition(duration, onlyFadeTransition, enableDisplayTransition) {\n  var transitionCurve = 'cubic-bezier(0.23,1,0.32,1)';\n  var transitionOption = '';\n  var transitionText = '';\n  if (enableDisplayTransition) {\n    transitionOption = \" \" + duration / 2 + \"s \" + transitionCurve;\n    transitionText = \"opacity\" + transitionOption + \",visibility\" + transitionOption;\n  }\n  if (!onlyFadeTransition) {\n    transitionOption = \" \" + duration + \"s \" + transitionCurve;\n    transitionText += (transitionText.length ? ',' : '') + (env.transformSupported ? \"\" + CSS_TRANSFORM_VENDOR + transitionOption : \",left\" + transitionOption + \",top\" + transitionOption);\n  }\n  return CSS_TRANSITION_VENDOR + ':' + transitionText;\n}\nfunction assembleTransform(x, y, toString) {\n  // If using float on style, the final width of the dom might\n  // keep changing slightly while mouse move. So `toFixed(0)` them.\n  var x0 = x.toFixed(0) + 'px';\n  var y0 = y.toFixed(0) + 'px';\n  // not support transform, use `left` and `top` instead.\n  if (!env.transformSupported) {\n    return toString ? \"top:\" + y0 + \";left:\" + x0 + \";\" : [['top', y0], ['left', x0]];\n  }\n  // support transform\n  var is3d = env.transform3dSupported;\n  var translate = \"translate\" + (is3d ? '3d' : '') + \"(\" + x0 + \",\" + y0 + (is3d ? ',0' : '') + \")\";\n  return toString ? 'top:0;left:0;' + CSS_TRANSFORM_VENDOR + ':' + translate + ';' : [['top', 0], ['left', 0], [TRANSFORM_VENDOR, translate]];\n}\n/**\n * @param {Object} textStyle\n * @return {string}\n * @inner\n */\nfunction assembleFont(textStyleModel) {\n  var cssText = [];\n  var fontSize = textStyleModel.get('fontSize');\n  var color = textStyleModel.getTextColor();\n  color && cssText.push('color:' + color);\n  cssText.push('font:' + textStyleModel.getFont());\n  // @ts-ignore, leave it to the tooltip refactor.\n  var lineHeight = retrieve2(textStyleModel.get('lineHeight'), Math.round(fontSize * 3 / 2));\n  fontSize && cssText.push('line-height:' + lineHeight + 'px');\n  var shadowColor = textStyleModel.get('textShadowColor');\n  var shadowBlur = textStyleModel.get('textShadowBlur') || 0;\n  var shadowOffsetX = textStyleModel.get('textShadowOffsetX') || 0;\n  var shadowOffsetY = textStyleModel.get('textShadowOffsetY') || 0;\n  shadowColor && shadowBlur && cssText.push('text-shadow:' + shadowOffsetX + 'px ' + shadowOffsetY + 'px ' + shadowBlur + 'px ' + shadowColor);\n  each(['decoration', 'align'], function (name) {\n    var val = textStyleModel.get(name);\n    val && cssText.push('text-' + name + ':' + val);\n  });\n  return cssText.join(';');\n}\nfunction assembleCssText(tooltipModel, enableTransition, onlyFadeTransition, enableDisplayTransition) {\n  var cssText = [];\n  var transitionDuration = tooltipModel.get('transitionDuration');\n  var backgroundColor = tooltipModel.get('backgroundColor');\n  var shadowBlur = tooltipModel.get('shadowBlur');\n  var shadowColor = tooltipModel.get('shadowColor');\n  var shadowOffsetX = tooltipModel.get('shadowOffsetX');\n  var shadowOffsetY = tooltipModel.get('shadowOffsetY');\n  var textStyleModel = tooltipModel.getModel('textStyle');\n  var padding = getPaddingFromTooltipModel(tooltipModel, 'html');\n  var boxShadow = shadowOffsetX + \"px \" + shadowOffsetY + \"px \" + shadowBlur + \"px \" + shadowColor;\n  cssText.push('box-shadow:' + boxShadow);\n  // Animation transition. Do not animate when transitionDuration <= 0.\n  enableTransition && transitionDuration > 0 && cssText.push(assembleTransition(transitionDuration, onlyFadeTransition, enableDisplayTransition));\n  if (backgroundColor) {\n    cssText.push('background-color:' + backgroundColor);\n  }\n  // Border style\n  each(['width', 'color', 'radius'], function (name) {\n    var borderName = 'border-' + name;\n    var camelCase = toCamelCase(borderName);\n    var val = tooltipModel.get(camelCase);\n    val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px'));\n  });\n  // Text style\n  cssText.push(assembleFont(textStyleModel));\n  // Padding\n  if (padding != null) {\n    cssText.push('padding:' + normalizeCssArray(padding).join('px ') + 'px');\n  }\n  return cssText.join(';') + ';';\n}\n// If not able to make, do not modify the input `out`.\nfunction makeStyleCoord(out, zr, container, zrX, zrY) {\n  var zrPainter = zr && zr.painter;\n  if (container) {\n    var zrViewportRoot = zrPainter && zrPainter.getViewportRoot();\n    if (zrViewportRoot) {\n      // Some APPs might use scale on body, so we support CSS transform here.\n      transformLocalCoord(out, zrViewportRoot, container, zrX, zrY);\n    }\n  } else {\n    out[0] = zrX;\n    out[1] = zrY;\n    // xy should be based on canvas root. But tooltipContent is\n    // the sibling of canvas root. So padding of ec container\n    // should be considered here.\n    var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset();\n    if (viewportRootOffset) {\n      out[0] += viewportRootOffset.offsetLeft;\n      out[1] += viewportRootOffset.offsetTop;\n    }\n  }\n  out[2] = out[0] / zr.getWidth();\n  out[3] = out[1] / zr.getHeight();\n}\nvar TooltipHTMLContent = /** @class */function () {\n  function TooltipHTMLContent(api, opt) {\n    this._show = false;\n    this._styleCoord = [0, 0, 0, 0];\n    this._enterable = true;\n    this._alwaysShowContent = false;\n    this._firstShow = true;\n    this._longHide = true;\n    if (env.wxa) {\n      return null;\n    }\n    var el = document.createElement('div');\n    // TODO: TYPE\n    el.domBelongToZr = true;\n    this.el = el;\n    var zr = this._zr = api.getZr();\n    var appendTo = opt.appendTo;\n    var container = appendTo && (isString(appendTo) ? document.querySelector(appendTo) : isDom(appendTo) ? appendTo : isFunction(appendTo) && appendTo(api.getDom()));\n    makeStyleCoord(this._styleCoord, zr, container, api.getWidth() / 2, api.getHeight() / 2);\n    (container || api.getDom()).appendChild(el);\n    this._api = api;\n    this._container = container;\n    // FIXME\n    // Is it needed to trigger zr event manually if\n    // the browser do not support `pointer-events: none`.\n    var self = this;\n    el.onmouseenter = function () {\n      // clear the timeout in hideLater and keep showing tooltip\n      if (self._enterable) {\n        clearTimeout(self._hideTimeout);\n        self._show = true;\n      }\n      self._inContent = true;\n    };\n    el.onmousemove = function (e) {\n      e = e || window.event;\n      if (!self._enterable) {\n        // `pointer-events: none` is set to tooltip content div\n        // if `enterable` is set as `false`, and `el.onmousemove`\n        // can not be triggered. But in browser that do not\n        // support `pointer-events`, we need to do this:\n        // Try trigger zrender event to avoid mouse\n        // in and out shape too frequently\n        var handler = zr.handler;\n        var zrViewportRoot = zr.painter.getViewportRoot();\n        normalizeEvent(zrViewportRoot, e, true);\n        handler.dispatch('mousemove', e);\n      }\n    };\n    el.onmouseleave = function () {\n      // set `_inContent` to `false` before `hideLater`\n      self._inContent = false;\n      if (self._enterable) {\n        if (self._show) {\n          self.hideLater(self._hideDelay);\n        }\n      }\n    };\n  }\n  /**\n   * Update when tooltip is rendered\n   */\n  TooltipHTMLContent.prototype.update = function (tooltipModel) {\n    // FIXME\n    // Move this logic to ec main?\n    if (!this._container) {\n      var container = this._api.getDom();\n      var position = getComputedStyle(container, 'position');\n      var domStyle = container.style;\n      if (domStyle.position !== 'absolute' && position !== 'absolute') {\n        domStyle.position = 'relative';\n      }\n    }\n    // move tooltip if chart resized\n    var alwaysShowContent = tooltipModel.get('alwaysShowContent');\n    alwaysShowContent && this._moveIfResized();\n    // update alwaysShowContent\n    this._alwaysShowContent = alwaysShowContent;\n    this._enableDisplayTransition = tooltipModel.get('displayTransition') && tooltipModel.get('transitionDuration') > 0;\n    // update className\n    this.el.className = tooltipModel.get('className') || '';\n    // Hide the tooltip\n    // PENDING\n    // this.hide();\n  };\n  TooltipHTMLContent.prototype.show = function (tooltipModel, nearPointColor) {\n    clearTimeout(this._hideTimeout);\n    clearTimeout(this._longHideTimeout);\n    var el = this.el;\n    var style = el.style;\n    var styleCoord = this._styleCoord;\n    if (!el.innerHTML) {\n      style.display = 'none';\n    } else {\n      style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide, this._enableDisplayTransition)\n      // initial transform\n      + assembleTransform(styleCoord[0], styleCoord[1], true) + (\"border-color:\" + convertToColorString(nearPointColor) + \";\") + (tooltipModel.get('extraCssText') || '')\n      // If mouse occasionally move over the tooltip, a mouseout event will be\n      // triggered by canvas, and cause some unexpectable result like dragging\n      // stop, \"unfocusAdjacency\". Here `pointer-events: none` is used to solve\n      // it. Although it is not supported by IE8~IE10, fortunately it is a rare\n      // scenario.\n      + (\";pointer-events:\" + (this._enterable ? 'auto' : 'none'));\n    }\n    this._show = true;\n    this._firstShow = false;\n    this._longHide = false;\n  };\n  TooltipHTMLContent.prototype.setContent = function (content, markers, tooltipModel, borderColor, arrowPosition) {\n    var el = this.el;\n    if (content == null) {\n      el.innerHTML = '';\n      return;\n    }\n    var arrow = '';\n    if (isString(arrowPosition) && tooltipModel.get('trigger') === 'item' && !shouldTooltipConfine(tooltipModel)) {\n      arrow = assembleArrow(tooltipModel, borderColor, arrowPosition);\n    }\n    if (isString(content)) {\n      el.innerHTML = content + arrow;\n    } else if (content) {\n      // Clear previous\n      el.innerHTML = '';\n      if (!isArray(content)) {\n        content = [content];\n      }\n      for (var i = 0; i < content.length; i++) {\n        if (isDom(content[i]) && content[i].parentNode !== el) {\n          el.appendChild(content[i]);\n        }\n      }\n      // no arrow if empty\n      if (arrow && el.childNodes.length) {\n        // no need to create a new parent element, but it's not supported by IE 10 and older.\n        // const arrowEl = document.createRange().createContextualFragment(arrow);\n        var arrowEl = document.createElement('div');\n        arrowEl.innerHTML = arrow;\n        el.appendChild(arrowEl);\n      }\n    }\n  };\n  TooltipHTMLContent.prototype.setEnterable = function (enterable) {\n    this._enterable = enterable;\n  };\n  TooltipHTMLContent.prototype.getSize = function () {\n    var el = this.el;\n    return el ? [el.offsetWidth, el.offsetHeight] : [0, 0];\n  };\n  TooltipHTMLContent.prototype.moveTo = function (zrX, zrY) {\n    if (!this.el) {\n      return;\n    }\n    var styleCoord = this._styleCoord;\n    makeStyleCoord(styleCoord, this._zr, this._container, zrX, zrY);\n    if (styleCoord[0] != null && styleCoord[1] != null) {\n      var style_1 = this.el.style;\n      var transforms = assembleTransform(styleCoord[0], styleCoord[1]);\n      each(transforms, function (transform) {\n        style_1[transform[0]] = transform[1];\n      });\n    }\n  };\n  /**\n   * when `alwaysShowContent` is true,\n   * move the tooltip after chart resized\n   */\n  TooltipHTMLContent.prototype._moveIfResized = function () {\n    // The ratio of left to width\n    var ratioX = this._styleCoord[2];\n    // The ratio of top to height\n    var ratioY = this._styleCoord[3];\n    this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight());\n  };\n  TooltipHTMLContent.prototype.hide = function () {\n    var _this = this;\n    var style = this.el.style;\n    if (this._enableDisplayTransition) {\n      style.visibility = 'hidden';\n      style.opacity = '0';\n    } else {\n      style.display = 'none';\n    }\n    env.transform3dSupported && (style.willChange = '');\n    this._show = false;\n    this._longHideTimeout = setTimeout(function () {\n      return _this._longHide = true;\n    }, 500);\n  };\n  TooltipHTMLContent.prototype.hideLater = function (time) {\n    if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) {\n      if (time) {\n        this._hideDelay = time;\n        // Set show false to avoid invoke hideLater multiple times\n        this._show = false;\n        this._hideTimeout = setTimeout(bind(this.hide, this), time);\n      } else {\n        this.hide();\n      }\n    }\n  };\n  TooltipHTMLContent.prototype.isShow = function () {\n    return this._show;\n  };\n  TooltipHTMLContent.prototype.dispose = function () {\n    clearTimeout(this._hideTimeout);\n    clearTimeout(this._longHideTimeout);\n    var zr = this._zr;\n    transformLocalCoordClear(zr && zr.painter && zr.painter.getViewportRoot(), this._container);\n    var el = this.el;\n    if (el) {\n      el.onmouseenter = el.onmousemove = el.onmouseleave = null;\n      var parentNode = el.parentNode;\n      parentNode && parentNode.removeChild(el);\n    }\n    this.el = this._container = null;\n  };\n  return TooltipHTMLContent;\n}();\nexport default TooltipHTMLContent;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport ZRText from 'zrender/lib/graphic/Text.js';\nimport { getPaddingFromTooltipModel } from './tooltipMarkup.js';\nimport { throwError } from '../../util/log.js';\nvar TooltipRichContent = /** @class */function () {\n  function TooltipRichContent(api) {\n    this._show = false;\n    this._styleCoord = [0, 0, 0, 0];\n    this._alwaysShowContent = false;\n    this._enterable = true;\n    this._zr = api.getZr();\n    makeStyleCoord(this._styleCoord, this._zr, api.getWidth() / 2, api.getHeight() / 2);\n  }\n  /**\n   * Update when tooltip is rendered\n   */\n  TooltipRichContent.prototype.update = function (tooltipModel) {\n    var alwaysShowContent = tooltipModel.get('alwaysShowContent');\n    alwaysShowContent && this._moveIfResized();\n    // update alwaysShowContent\n    this._alwaysShowContent = alwaysShowContent;\n  };\n  TooltipRichContent.prototype.show = function () {\n    if (this._hideTimeout) {\n      clearTimeout(this._hideTimeout);\n    }\n    this.el.show();\n    this._show = true;\n  };\n  /**\n   * Set tooltip content\n   */\n  TooltipRichContent.prototype.setContent = function (content, markupStyleCreator, tooltipModel, borderColor, arrowPosition) {\n    var _this = this;\n    if (zrUtil.isObject(content)) {\n      throwError(process.env.NODE_ENV !== 'production' ? 'Passing DOM nodes as content is not supported in richText tooltip!' : '');\n    }\n    if (this.el) {\n      this._zr.remove(this.el);\n    }\n    var textStyleModel = tooltipModel.getModel('textStyle');\n    this.el = new ZRText({\n      style: {\n        rich: markupStyleCreator.richTextStyles,\n        text: content,\n        lineHeight: 22,\n        borderWidth: 1,\n        borderColor: borderColor,\n        textShadowColor: textStyleModel.get('textShadowColor'),\n        fill: tooltipModel.get(['textStyle', 'color']),\n        padding: getPaddingFromTooltipModel(tooltipModel, 'richText'),\n        verticalAlign: 'top',\n        align: 'left'\n      },\n      z: tooltipModel.get('z')\n    });\n    zrUtil.each(['backgroundColor', 'borderRadius', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'], function (propName) {\n      _this.el.style[propName] = tooltipModel.get(propName);\n    });\n    zrUtil.each(['textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY'], function (propName) {\n      _this.el.style[propName] = textStyleModel.get(propName) || 0;\n    });\n    this._zr.add(this.el);\n    var self = this;\n    this.el.on('mouseover', function () {\n      // clear the timeout in hideLater and keep showing tooltip\n      if (self._enterable) {\n        clearTimeout(self._hideTimeout);\n        self._show = true;\n      }\n      self._inContent = true;\n    });\n    this.el.on('mouseout', function () {\n      if (self._enterable) {\n        if (self._show) {\n          self.hideLater(self._hideDelay);\n        }\n      }\n      self._inContent = false;\n    });\n  };\n  TooltipRichContent.prototype.setEnterable = function (enterable) {\n    this._enterable = enterable;\n  };\n  TooltipRichContent.prototype.getSize = function () {\n    var el = this.el;\n    var bounding = this.el.getBoundingRect();\n    // bounding rect does not include shadow. For renderMode richText,\n    // if overflow, it will be cut. So calculate them accurately.\n    var shadowOuterSize = calcShadowOuterSize(el.style);\n    return [bounding.width + shadowOuterSize.left + shadowOuterSize.right, bounding.height + shadowOuterSize.top + shadowOuterSize.bottom];\n  };\n  TooltipRichContent.prototype.moveTo = function (x, y) {\n    var el = this.el;\n    if (el) {\n      var styleCoord = this._styleCoord;\n      makeStyleCoord(styleCoord, this._zr, x, y);\n      x = styleCoord[0];\n      y = styleCoord[1];\n      var style = el.style;\n      var borderWidth = mathMaxWith0(style.borderWidth || 0);\n      var shadowOuterSize = calcShadowOuterSize(style);\n      // rich text x, y do not include border.\n      el.x = x + borderWidth + shadowOuterSize.left;\n      el.y = y + borderWidth + shadowOuterSize.top;\n      el.markRedraw();\n    }\n  };\n  /**\n   * when `alwaysShowContent` is true,\n   * move the tooltip after chart resized\n   */\n  TooltipRichContent.prototype._moveIfResized = function () {\n    // The ratio of left to width\n    var ratioX = this._styleCoord[2];\n    // The ratio of top to height\n    var ratioY = this._styleCoord[3];\n    this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight());\n  };\n  TooltipRichContent.prototype.hide = function () {\n    if (this.el) {\n      this.el.hide();\n    }\n    this._show = false;\n  };\n  TooltipRichContent.prototype.hideLater = function (time) {\n    if (this._show && !(this._inContent && this._enterable) && !this._alwaysShowContent) {\n      if (time) {\n        this._hideDelay = time;\n        // Set show false to avoid invoke hideLater multiple times\n        this._show = false;\n        this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time);\n      } else {\n        this.hide();\n      }\n    }\n  };\n  TooltipRichContent.prototype.isShow = function () {\n    return this._show;\n  };\n  TooltipRichContent.prototype.dispose = function () {\n    this._zr.remove(this.el);\n  };\n  return TooltipRichContent;\n}();\nfunction mathMaxWith0(val) {\n  return Math.max(0, val);\n}\nfunction calcShadowOuterSize(style) {\n  var shadowBlur = mathMaxWith0(style.shadowBlur || 0);\n  var shadowOffsetX = mathMaxWith0(style.shadowOffsetX || 0);\n  var shadowOffsetY = mathMaxWith0(style.shadowOffsetY || 0);\n  return {\n    left: mathMaxWith0(shadowBlur - shadowOffsetX),\n    right: mathMaxWith0(shadowBlur + shadowOffsetX),\n    top: mathMaxWith0(shadowBlur - shadowOffsetY),\n    bottom: mathMaxWith0(shadowBlur + shadowOffsetY)\n  };\n}\nfunction makeStyleCoord(out, zr, zrX, zrY) {\n  out[0] = zrX;\n  out[1] = zrY;\n  out[2] = out[0] / zr.getWidth();\n  out[3] = out[1] / zr.getHeight();\n}\nexport default TooltipRichContent;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nimport { __extends } from \"tslib\";\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { bind, each, clone, trim, isString, isFunction, isArray, isObject, extend } from 'zrender/lib/core/util.js';\nimport env from 'zrender/lib/core/env.js';\nimport TooltipHTMLContent from './TooltipHTMLContent.js';\nimport TooltipRichContent from './TooltipRichContent.js';\nimport { convertToColorString, encodeHTML, formatTpl } from '../../util/format.js';\nimport { parsePercent } from '../../util/number.js';\nimport { Rect } from '../../util/graphic.js';\nimport findPointFromSeries from '../axisPointer/findPointFromSeries.js';\nimport { getLayoutRect } from '../../util/layout.js';\nimport Model from '../../model/Model.js';\nimport * as globalListener from '../axisPointer/globalListener.js';\nimport * as axisHelper from '../../coord/axisHelper.js';\nimport * as axisPointerViewHelper from '../axisPointer/viewHelper.js';\nimport { getTooltipRenderMode, preParseFinder, queryReferringComponents } from '../../util/model.js';\nimport ComponentView from '../../view/Component.js';\nimport { format as timeFormat } from '../../util/time.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { shouldTooltipConfine } from './helper.js';\nimport { normalizeTooltipFormatResult } from '../../model/mixin/dataFormat.js';\nimport { createTooltipMarkup, buildTooltipMarkup, TooltipMarkupStyleCreator } from './tooltipMarkup.js';\nimport { findEventDispatcher } from '../../util/event.js';\nimport { clear, createOrUpdate } from '../../util/throttle.js';\nvar proxyRect = new Rect({\n  shape: {\n    x: -1,\n    y: -1,\n    width: 2,\n    height: 2\n  }\n});\nvar TooltipView = /** @class */function (_super) {\n  __extends(TooltipView, _super);\n  function TooltipView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TooltipView.type;\n    return _this;\n  }\n  TooltipView.prototype.init = function (ecModel, api) {\n    if (env.node || !api.getDom()) {\n      return;\n    }\n    var tooltipModel = ecModel.getComponent('tooltip');\n    var renderMode = this._renderMode = getTooltipRenderMode(tooltipModel.get('renderMode'));\n    this._tooltipContent = renderMode === 'richText' ? new TooltipRichContent(api) : new TooltipHTMLContent(api, {\n      appendTo: tooltipModel.get('appendToBody', true) ? 'body' : tooltipModel.get('appendTo', true)\n    });\n  };\n  TooltipView.prototype.render = function (tooltipModel, ecModel, api) {\n    if (env.node || !api.getDom()) {\n      return;\n    }\n    // Reset\n    this.group.removeAll();\n    this._tooltipModel = tooltipModel;\n    this._ecModel = ecModel;\n    this._api = api;\n    var tooltipContent = this._tooltipContent;\n    tooltipContent.update(tooltipModel);\n    tooltipContent.setEnterable(tooltipModel.get('enterable'));\n    this._initGlobalListener();\n    this._keepShow();\n    // PENDING\n    // `mousemove` event will be triggered very frequently when the mouse moves fast,\n    // which causes that the `updatePosition` function was also called frequently.\n    // In Chrome with devtools open and Firefox, tooltip looks laggy and shakes. See #14695 #16101\n    // To avoid frequent triggering,\n    // consider throttling it in 50ms when transition is enabled\n    if (this._renderMode !== 'richText' && tooltipModel.get('transitionDuration')) {\n      createOrUpdate(this, '_updatePosition', 50, 'fixRate');\n    } else {\n      clear(this, '_updatePosition');\n    }\n  };\n  TooltipView.prototype._initGlobalListener = function () {\n    var tooltipModel = this._tooltipModel;\n    var triggerOn = tooltipModel.get('triggerOn');\n    globalListener.register('itemTooltip', this._api, bind(function (currTrigger, e, dispatchAction) {\n      // If 'none', it is not controlled by mouse totally.\n      if (triggerOn !== 'none') {\n        if (triggerOn.indexOf(currTrigger) >= 0) {\n          this._tryShow(e, dispatchAction);\n        } else if (currTrigger === 'leave') {\n          this._hide(dispatchAction);\n        }\n      }\n    }, this));\n  };\n  TooltipView.prototype._keepShow = function () {\n    var tooltipModel = this._tooltipModel;\n    var ecModel = this._ecModel;\n    var api = this._api;\n    var triggerOn = tooltipModel.get('triggerOn');\n    // Try to keep the tooltip show when refreshing\n    if (this._lastX != null && this._lastY != null\n    // When user is willing to control tooltip totally using API,\n    // self.manuallyShowTip({x, y}) might cause tooltip hide,\n    // which is not expected.\n    && triggerOn !== 'none' && triggerOn !== 'click') {\n      var self_1 = this;\n      clearTimeout(this._refreshUpdateTimeout);\n      this._refreshUpdateTimeout = setTimeout(function () {\n        // Show tip next tick after other charts are rendered\n        // In case highlight action has wrong result\n        // FIXME\n        !api.isDisposed() && self_1.manuallyShowTip(tooltipModel, ecModel, api, {\n          x: self_1._lastX,\n          y: self_1._lastY,\n          dataByCoordSys: self_1._lastDataByCoordSys\n        });\n      });\n    }\n  };\n  /**\n   * Show tip manually by\n   * dispatchAction({\n   *     type: 'showTip',\n   *     x: 10,\n   *     y: 10\n   * });\n   * Or\n   * dispatchAction({\n   *      type: 'showTip',\n   *      seriesIndex: 0,\n   *      dataIndex or dataIndexInside or name\n   * });\n   *\n   *  TODO Batch\n   */\n  TooltipView.prototype.manuallyShowTip = function (tooltipModel, ecModel, api, payload) {\n    if (payload.from === this.uid || env.node || !api.getDom()) {\n      return;\n    }\n    var dispatchAction = makeDispatchAction(payload, api);\n    // Reset ticket\n    this._ticket = '';\n    // When triggered from axisPointer.\n    var dataByCoordSys = payload.dataByCoordSys;\n    var cmptRef = findComponentReference(payload, ecModel, api);\n    if (cmptRef) {\n      var rect = cmptRef.el.getBoundingRect().clone();\n      rect.applyTransform(cmptRef.el.transform);\n      this._tryShow({\n        offsetX: rect.x + rect.width / 2,\n        offsetY: rect.y + rect.height / 2,\n        target: cmptRef.el,\n        position: payload.position,\n        // When manully trigger, the mouse is not on the el, so we'd better to\n        // position tooltip on the bottom of the el and display arrow is possible.\n        positionDefault: 'bottom'\n      }, dispatchAction);\n    } else if (payload.tooltip && payload.x != null && payload.y != null) {\n      var el = proxyRect;\n      el.x = payload.x;\n      el.y = payload.y;\n      el.update();\n      getECData(el).tooltipConfig = {\n        name: null,\n        option: payload.tooltip\n      };\n      // Manually show tooltip while view is not using zrender elements.\n      this._tryShow({\n        offsetX: payload.x,\n        offsetY: payload.y,\n        target: el\n      }, dispatchAction);\n    } else if (dataByCoordSys) {\n      this._tryShow({\n        offsetX: payload.x,\n        offsetY: payload.y,\n        position: payload.position,\n        dataByCoordSys: dataByCoordSys,\n        tooltipOption: payload.tooltipOption\n      }, dispatchAction);\n    } else if (payload.seriesIndex != null) {\n      if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) {\n        return;\n      }\n      var pointInfo = findPointFromSeries(payload, ecModel);\n      var cx = pointInfo.point[0];\n      var cy = pointInfo.point[1];\n      if (cx != null && cy != null) {\n        this._tryShow({\n          offsetX: cx,\n          offsetY: cy,\n          target: pointInfo.el,\n          position: payload.position,\n          // When manully trigger, the mouse is not on the el, so we'd better to\n          // position tooltip on the bottom of the el and display arrow is possible.\n          positionDefault: 'bottom'\n        }, dispatchAction);\n      }\n    } else if (payload.x != null && payload.y != null) {\n      // FIXME\n      // should wrap dispatchAction like `axisPointer/globalListener` ?\n      api.dispatchAction({\n        type: 'updateAxisPointer',\n        x: payload.x,\n        y: payload.y\n      });\n      this._tryShow({\n        offsetX: payload.x,\n        offsetY: payload.y,\n        position: payload.position,\n        target: api.getZr().findHover(payload.x, payload.y).target\n      }, dispatchAction);\n    }\n  };\n  TooltipView.prototype.manuallyHideTip = function (tooltipModel, ecModel, api, payload) {\n    var tooltipContent = this._tooltipContent;\n    if (this._tooltipModel) {\n      tooltipContent.hideLater(this._tooltipModel.get('hideDelay'));\n    }\n    this._lastX = this._lastY = this._lastDataByCoordSys = null;\n    if (payload.from !== this.uid) {\n      this._hide(makeDispatchAction(payload, api));\n    }\n  };\n  // Be compatible with previous design, that is, when tooltip.type is 'axis' and\n  // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer\n  // and tooltip.\n  TooltipView.prototype._manuallyAxisShowTip = function (tooltipModel, ecModel, api, payload) {\n    var seriesIndex = payload.seriesIndex;\n    var dataIndex = payload.dataIndex;\n    // @ts-ignore\n    var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;\n    if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) {\n      return;\n    }\n    var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n    if (!seriesModel) {\n      return;\n    }\n    var data = seriesModel.getData();\n    var tooltipCascadedModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model], this._tooltipModel);\n    if (tooltipCascadedModel.get('trigger') !== 'axis') {\n      return;\n    }\n    api.dispatchAction({\n      type: 'updateAxisPointer',\n      seriesIndex: seriesIndex,\n      dataIndex: dataIndex,\n      position: payload.position\n    });\n    return true;\n  };\n  TooltipView.prototype._tryShow = function (e, dispatchAction) {\n    var el = e.target;\n    var tooltipModel = this._tooltipModel;\n    if (!tooltipModel) {\n      return;\n    }\n    // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed\n    this._lastX = e.offsetX;\n    this._lastY = e.offsetY;\n    var dataByCoordSys = e.dataByCoordSys;\n    if (dataByCoordSys && dataByCoordSys.length) {\n      this._showAxisTooltip(dataByCoordSys, e);\n    } else if (el) {\n      var ecData = getECData(el);\n      if (ecData.ssrType === 'legend') {\n        // Don't trigger tooltip for legend tooltip item\n        return;\n      }\n      this._lastDataByCoordSys = null;\n      var seriesDispatcher_1;\n      var cmptDispatcher_1;\n      findEventDispatcher(el, function (target) {\n        if (target.tooltipDisabled) {\n          seriesDispatcher_1 = cmptDispatcher_1 = null;\n          return true;\n        }\n        if (seriesDispatcher_1 || cmptDispatcher_1) {\n          return;\n        }\n        // Always show item tooltip if mouse is on the element with dataIndex\n        if (getECData(target).dataIndex != null) {\n          seriesDispatcher_1 = target;\n        }\n        // Tooltip provided directly. Like legend.\n        else if (getECData(target).tooltipConfig != null) {\n          cmptDispatcher_1 = target;\n        }\n      }, true);\n      if (seriesDispatcher_1) {\n        this._showSeriesItemTooltip(e, seriesDispatcher_1, dispatchAction);\n      } else if (cmptDispatcher_1) {\n        this._showComponentItemTooltip(e, cmptDispatcher_1, dispatchAction);\n      } else {\n        this._hide(dispatchAction);\n      }\n    } else {\n      this._lastDataByCoordSys = null;\n      this._hide(dispatchAction);\n    }\n  };\n  TooltipView.prototype._showOrMove = function (tooltipModel, cb) {\n    // showDelay is used in this case: tooltip.enterable is set\n    // as true. User intent to move mouse into tooltip and click\n    // something. `showDelay` makes it easier to enter the content\n    // but tooltip do not move immediately.\n    var delay = tooltipModel.get('showDelay');\n    cb = bind(cb, this);\n    clearTimeout(this._showTimout);\n    delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb();\n  };\n  TooltipView.prototype._showAxisTooltip = function (dataByCoordSys, e) {\n    var ecModel = this._ecModel;\n    var globalTooltipModel = this._tooltipModel;\n    var point = [e.offsetX, e.offsetY];\n    var singleTooltipModel = buildTooltipModel([e.tooltipOption], globalTooltipModel);\n    var renderMode = this._renderMode;\n    var cbParamsList = [];\n    var articleMarkup = createTooltipMarkup('section', {\n      blocks: [],\n      noHeader: true\n    });\n    // Only for legacy: `Serise['formatTooltip']` returns a string.\n    var markupTextArrLegacy = [];\n    var markupStyleCreator = new TooltipMarkupStyleCreator();\n    each(dataByCoordSys, function (itemCoordSys) {\n      each(itemCoordSys.dataByAxis, function (axisItem) {\n        var axisModel = ecModel.getComponent(axisItem.axisDim + 'Axis', axisItem.axisIndex);\n        var axisValue = axisItem.value;\n        if (!axisModel || axisValue == null) {\n          return;\n        }\n        // FIXME: when using `tooltip.trigger: 'axis'`, the precision of the axis value displayed in tooltip\n        //  should match the original series values rather than using the default stretegy in Interval.ts\n        //  (getPrecision(interval) + 2); otherwise it may cuase confusion.\n        var axisValueLabel = axisPointerViewHelper.getValueLabel(axisValue, axisModel.axis, ecModel, axisItem.seriesDataIndices, axisItem.valueLabelOpt);\n        var axisSectionMarkup = createTooltipMarkup('section', {\n          header: axisValueLabel,\n          noHeader: !trim(axisValueLabel),\n          sortBlocks: true,\n          blocks: []\n        });\n        articleMarkup.blocks.push(axisSectionMarkup);\n        each(axisItem.seriesDataIndices, function (idxItem) {\n          var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);\n          var dataIndex = idxItem.dataIndexInside;\n          var cbParams = series.getDataParams(dataIndex);\n          // Can't find data.\n          if (cbParams.dataIndex < 0) {\n            return;\n          }\n          cbParams.axisDim = axisItem.axisDim;\n          cbParams.axisIndex = axisItem.axisIndex;\n          cbParams.axisType = axisItem.axisType;\n          cbParams.axisId = axisItem.axisId;\n          cbParams.axisValue = axisHelper.getAxisRawValue(axisModel.axis, {\n            value: axisValue\n          });\n          cbParams.axisValueLabel = axisValueLabel;\n          // Pre-create marker style for makers. Users can assemble richText\n          // text in `formatter` callback and use those markers style.\n          cbParams.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(cbParams.color), renderMode);\n          var seriesTooltipResult = normalizeTooltipFormatResult(series.formatTooltip(dataIndex, true, null));\n          var frag = seriesTooltipResult.frag;\n          if (frag) {\n            var valueFormatter = buildTooltipModel([series], globalTooltipModel).get('valueFormatter');\n            axisSectionMarkup.blocks.push(valueFormatter ? extend({\n              valueFormatter: valueFormatter\n            }, frag) : frag);\n          }\n          if (seriesTooltipResult.text) {\n            markupTextArrLegacy.push(seriesTooltipResult.text);\n          }\n          cbParamsList.push(cbParams);\n        });\n      });\n    });\n    // In most cases, the second axis is displays upper on the first one.\n    // So we reverse it to look better.\n    articleMarkup.blocks.reverse();\n    markupTextArrLegacy.reverse();\n    var positionExpr = e.position;\n    var orderMode = singleTooltipModel.get('order');\n    var builtMarkupText = buildTooltipMarkup(articleMarkup, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), singleTooltipModel.get('textStyle'));\n    builtMarkupText && markupTextArrLegacy.unshift(builtMarkupText);\n    var blockBreak = renderMode === 'richText' ? '\\n\\n' : '<br/>';\n    var allMarkupText = markupTextArrLegacy.join(blockBreak);\n    this._showOrMove(singleTooltipModel, function () {\n      if (this._updateContentNotChangedOnAxis(dataByCoordSys, cbParamsList)) {\n        this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, cbParamsList);\n      } else {\n        this._showTooltipContent(singleTooltipModel, allMarkupText, cbParamsList, Math.random() + '', point[0], point[1], positionExpr, null, markupStyleCreator);\n      }\n    });\n    // Do not trigger events here, because this branch only be entered\n    // from dispatchAction.\n  };\n  TooltipView.prototype._showSeriesItemTooltip = function (e, dispatcher, dispatchAction) {\n    var ecModel = this._ecModel;\n    var ecData = getECData(dispatcher);\n    // Use dataModel in element if possible\n    // Used when mouseover on a element like markPoint or edge\n    // In which case, the data is not main data in series.\n    var seriesIndex = ecData.seriesIndex;\n    var seriesModel = ecModel.getSeriesByIndex(seriesIndex);\n    // For example, graph link.\n    var dataModel = ecData.dataModel || seriesModel;\n    var dataIndex = ecData.dataIndex;\n    var dataType = ecData.dataType;\n    var data = dataModel.getData(dataType);\n    var renderMode = this._renderMode;\n    var positionDefault = e.positionDefault;\n    var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model], this._tooltipModel, positionDefault ? {\n      position: positionDefault\n    } : null);\n    var tooltipTrigger = tooltipModel.get('trigger');\n    if (tooltipTrigger != null && tooltipTrigger !== 'item') {\n      return;\n    }\n    var params = dataModel.getDataParams(dataIndex, dataType);\n    var markupStyleCreator = new TooltipMarkupStyleCreator();\n    // Pre-create marker style for makers. Users can assemble richText\n    // text in `formatter` callback and use those markers style.\n    params.marker = markupStyleCreator.makeTooltipMarker('item', convertToColorString(params.color), renderMode);\n    var seriesTooltipResult = normalizeTooltipFormatResult(dataModel.formatTooltip(dataIndex, false, dataType));\n    var orderMode = tooltipModel.get('order');\n    var valueFormatter = tooltipModel.get('valueFormatter');\n    var frag = seriesTooltipResult.frag;\n    var markupText = frag ? buildTooltipMarkup(valueFormatter ? extend({\n      valueFormatter: valueFormatter\n    }, frag) : frag, markupStyleCreator, renderMode, orderMode, ecModel.get('useUTC'), tooltipModel.get('textStyle')) : seriesTooltipResult.text;\n    var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex;\n    this._showOrMove(tooltipModel, function () {\n      this._showTooltipContent(tooltipModel, markupText, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markupStyleCreator);\n    });\n    // FIXME\n    // duplicated showtip if manuallyShowTip is called from dispatchAction.\n    dispatchAction({\n      type: 'showTip',\n      dataIndexInside: dataIndex,\n      dataIndex: data.getRawIndex(dataIndex),\n      seriesIndex: seriesIndex,\n      from: this.uid\n    });\n  };\n  TooltipView.prototype._showComponentItemTooltip = function (e, el, dispatchAction) {\n    var isHTMLRenderMode = this._renderMode === 'html';\n    var ecData = getECData(el);\n    var tooltipConfig = ecData.tooltipConfig;\n    var tooltipOpt = tooltipConfig.option || {};\n    var encodeHTMLContent = tooltipOpt.encodeHTMLContent;\n    if (isString(tooltipOpt)) {\n      var content = tooltipOpt;\n      tooltipOpt = {\n        content: content,\n        // Fixed formatter\n        formatter: content\n      };\n      // when `tooltipConfig.option` is a string rather than an object,\n      // we can't know if the content needs to be encoded\n      // for the sake of security, encode it by default.\n      encodeHTMLContent = true;\n    }\n    if (encodeHTMLContent && isHTMLRenderMode && tooltipOpt.content) {\n      // clone might be unnecessary?\n      tooltipOpt = clone(tooltipOpt);\n      tooltipOpt.content = encodeHTML(tooltipOpt.content);\n    }\n    var tooltipModelCascade = [tooltipOpt];\n    var cmpt = this._ecModel.getComponent(ecData.componentMainType, ecData.componentIndex);\n    if (cmpt) {\n      tooltipModelCascade.push(cmpt);\n    }\n    // In most cases, component tooltip formatter has different params with series tooltip formatter,\n    // so that they cannot share the same formatter. Since the global tooltip formatter is used for series\n    // by convention, we do not use it as the default formatter for component.\n    tooltipModelCascade.push({\n      formatter: tooltipOpt.content\n    });\n    var positionDefault = e.positionDefault;\n    var subTooltipModel = buildTooltipModel(tooltipModelCascade, this._tooltipModel, positionDefault ? {\n      position: positionDefault\n    } : null);\n    var defaultHtml = subTooltipModel.get('content');\n    var asyncTicket = Math.random() + '';\n    // PENDING: this case do not support richText style yet.\n    var markupStyleCreator = new TooltipMarkupStyleCreator();\n    // Do not check whether `trigger` is 'none' here, because `trigger`\n    // only works on coordinate system. In fact, we have not found case\n    // that requires setting `trigger` nothing on component yet.\n    this._showOrMove(subTooltipModel, function () {\n      // Use formatterParams from element defined in component\n      // Avoid users modify it.\n      var formatterParams = clone(subTooltipModel.get('formatterParams') || {});\n      this._showTooltipContent(subTooltipModel, defaultHtml, formatterParams, asyncTicket, e.offsetX, e.offsetY, e.position, el, markupStyleCreator);\n    });\n    // If not dispatch showTip, tip may be hide triggered by axis.\n    dispatchAction({\n      type: 'showTip',\n      from: this.uid\n    });\n  };\n  TooltipView.prototype._showTooltipContent = function (\n  // Use Model<TooltipOption> insteadof TooltipModel because this model may be from series or other options.\n  // Instead of top level tooltip.\n  tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markupStyleCreator) {\n    // Reset ticket\n    this._ticket = '';\n    if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) {\n      return;\n    }\n    var tooltipContent = this._tooltipContent;\n    tooltipContent.setEnterable(tooltipModel.get('enterable'));\n    var formatter = tooltipModel.get('formatter');\n    positionExpr = positionExpr || tooltipModel.get('position');\n    var html = defaultHtml;\n    var nearPoint = this._getNearestPoint([x, y], params, tooltipModel.get('trigger'), tooltipModel.get('borderColor'), tooltipModel.get('defaultBorderColor', true));\n    var nearPointColor = nearPoint.color;\n    if (formatter) {\n      if (isString(formatter)) {\n        var useUTC = tooltipModel.ecModel.get('useUTC');\n        var params0 = isArray(params) ? params[0] : params;\n        var isTimeAxis = params0 && params0.axisType && params0.axisType.indexOf('time') >= 0;\n        html = formatter;\n        if (isTimeAxis) {\n          html = timeFormat(params0.axisValue, html, useUTC);\n        }\n        html = formatTpl(html, params, true);\n      } else if (isFunction(formatter)) {\n        var callback = bind(function (cbTicket, html) {\n          if (cbTicket === this._ticket) {\n            tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr);\n            this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el);\n          }\n        }, this);\n        this._ticket = asyncTicket;\n        html = formatter(params, asyncTicket, callback);\n      } else {\n        html = formatter;\n      }\n    }\n    tooltipContent.setContent(html, markupStyleCreator, tooltipModel, nearPointColor, positionExpr);\n    tooltipContent.show(tooltipModel, nearPointColor);\n    this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el);\n  };\n  TooltipView.prototype._getNearestPoint = function (point, tooltipDataParams, trigger, borderColor, defaultBorderColor) {\n    if (trigger === 'axis' || isArray(tooltipDataParams)) {\n      return {\n        color: borderColor || defaultBorderColor\n      };\n    }\n    if (!isArray(tooltipDataParams)) {\n      return {\n        color: borderColor || tooltipDataParams.color || tooltipDataParams.borderColor\n      };\n    }\n  };\n  TooltipView.prototype._updatePosition = function (tooltipModel, positionExpr, x,\n  // Mouse x\n  y,\n  // Mouse y\n  content, params, el) {\n    var viewWidth = this._api.getWidth();\n    var viewHeight = this._api.getHeight();\n    positionExpr = positionExpr || tooltipModel.get('position');\n    var contentSize = content.getSize();\n    var align = tooltipModel.get('align');\n    var vAlign = tooltipModel.get('verticalAlign');\n    var rect = el && el.getBoundingRect().clone();\n    el && rect.applyTransform(el.transform);\n    if (isFunction(positionExpr)) {\n      // Callback of position can be an array or a string specify the position\n      positionExpr = positionExpr([x, y], params, content.el, rect, {\n        viewSize: [viewWidth, viewHeight],\n        contentSize: contentSize.slice()\n      });\n    }\n    if (isArray(positionExpr)) {\n      x = parsePercent(positionExpr[0], viewWidth);\n      y = parsePercent(positionExpr[1], viewHeight);\n    } else if (isObject(positionExpr)) {\n      var boxLayoutPosition = positionExpr;\n      boxLayoutPosition.width = contentSize[0];\n      boxLayoutPosition.height = contentSize[1];\n      var layoutRect = getLayoutRect(boxLayoutPosition, {\n        width: viewWidth,\n        height: viewHeight\n      });\n      x = layoutRect.x;\n      y = layoutRect.y;\n      align = null;\n      // When positionExpr is left/top/right/bottom,\n      // align and verticalAlign will not work.\n      vAlign = null;\n    }\n    // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element\n    else if (isString(positionExpr) && el) {\n      var pos = calcTooltipPosition(positionExpr, rect, contentSize, tooltipModel.get('borderWidth'));\n      x = pos[0];\n      y = pos[1];\n    } else {\n      var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20);\n      x = pos[0];\n      y = pos[1];\n    }\n    align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0);\n    vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0);\n    if (shouldTooltipConfine(tooltipModel)) {\n      var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight);\n      x = pos[0];\n      y = pos[1];\n    }\n    content.moveTo(x, y);\n  };\n  // FIXME\n  // Should we remove this but leave this to user?\n  TooltipView.prototype._updateContentNotChangedOnAxis = function (dataByCoordSys, cbParamsList) {\n    var lastCoordSys = this._lastDataByCoordSys;\n    var lastCbParamsList = this._cbParamsList;\n    var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length;\n    contentNotChanged && each(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {\n      var lastDataByAxis = lastItemCoordSys.dataByAxis || [];\n      var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};\n      var thisDataByAxis = thisItemCoordSys.dataByAxis || [];\n      contentNotChanged = contentNotChanged && lastDataByAxis.length === thisDataByAxis.length;\n      contentNotChanged && each(lastDataByAxis, function (lastItem, indexAxis) {\n        var thisItem = thisDataByAxis[indexAxis] || {};\n        var lastIndices = lastItem.seriesDataIndices || [];\n        var newIndices = thisItem.seriesDataIndices || [];\n        contentNotChanged = contentNotChanged && lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length;\n        contentNotChanged && each(lastIndices, function (lastIdxItem, j) {\n          var newIdxItem = newIndices[j];\n          contentNotChanged = contentNotChanged && lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex;\n        });\n        // check is cbParams data value changed\n        lastCbParamsList && each(lastItem.seriesDataIndices, function (idxItem) {\n          var seriesIdx = idxItem.seriesIndex;\n          var cbParams = cbParamsList[seriesIdx];\n          var lastCbParams = lastCbParamsList[seriesIdx];\n          if (cbParams && lastCbParams && lastCbParams.data !== cbParams.data) {\n            contentNotChanged = false;\n          }\n        });\n      });\n    });\n    this._lastDataByCoordSys = dataByCoordSys;\n    this._cbParamsList = cbParamsList;\n    return !!contentNotChanged;\n  };\n  TooltipView.prototype._hide = function (dispatchAction) {\n    // Do not directly hideLater here, because this behavior may be prevented\n    // in dispatchAction when showTip is dispatched.\n    // FIXME\n    // duplicated hideTip if manuallyHideTip is called from dispatchAction.\n    this._lastDataByCoordSys = null;\n    dispatchAction({\n      type: 'hideTip',\n      from: this.uid\n    });\n  };\n  TooltipView.prototype.dispose = function (ecModel, api) {\n    if (env.node || !api.getDom()) {\n      return;\n    }\n    clear(this, '_updatePosition');\n    this._tooltipContent.dispose();\n    globalListener.unregister('itemTooltip', api);\n  };\n  TooltipView.type = 'tooltip';\n  return TooltipView;\n}(ComponentView);\n/**\n * From top to bottom. (the last one should be globalTooltipModel);\n */\nfunction buildTooltipModel(modelCascade, globalTooltipModel, defaultTooltipOption) {\n  // Last is always tooltip model.\n  var ecModel = globalTooltipModel.ecModel;\n  var resultModel;\n  if (defaultTooltipOption) {\n    resultModel = new Model(defaultTooltipOption, ecModel, ecModel);\n    resultModel = new Model(globalTooltipModel.option, resultModel, ecModel);\n  } else {\n    resultModel = globalTooltipModel;\n  }\n  for (var i = modelCascade.length - 1; i >= 0; i--) {\n    var tooltipOpt = modelCascade[i];\n    if (tooltipOpt) {\n      if (tooltipOpt instanceof Model) {\n        tooltipOpt = tooltipOpt.get('tooltip', true);\n      }\n      // In each data item tooltip can be simply write:\n      // {\n      //  value: 10,\n      //  tooltip: 'Something you need to know'\n      // }\n      if (isString(tooltipOpt)) {\n        tooltipOpt = {\n          formatter: tooltipOpt\n        };\n      }\n      if (tooltipOpt) {\n        resultModel = new Model(tooltipOpt, resultModel, ecModel);\n      }\n    }\n  }\n  return resultModel;\n}\nfunction makeDispatchAction(payload, api) {\n  return payload.dispatchAction || bind(api.dispatchAction, api);\n}\nfunction refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) {\n  var size = content.getSize();\n  var width = size[0];\n  var height = size[1];\n  if (gapH != null) {\n    // Add extra 2 pixels for this case:\n    // At present the \"values\" in default tooltip are using CSS `float: right`.\n    // When the right edge of the tooltip box is on the right side of the\n    // viewport, the `float` layout might push the \"values\" to the second line.\n    if (x + width + gapH + 2 > viewWidth) {\n      x -= width + gapH;\n    } else {\n      x += gapH;\n    }\n  }\n  if (gapV != null) {\n    if (y + height + gapV > viewHeight) {\n      y -= height + gapV;\n    } else {\n      y += gapV;\n    }\n  }\n  return [x, y];\n}\nfunction confineTooltipPosition(x, y, content, viewWidth, viewHeight) {\n  var size = content.getSize();\n  var width = size[0];\n  var height = size[1];\n  x = Math.min(x + width, viewWidth) - width;\n  y = Math.min(y + height, viewHeight) - height;\n  x = Math.max(x, 0);\n  y = Math.max(y, 0);\n  return [x, y];\n}\nfunction calcTooltipPosition(position, rect, contentSize, borderWidth) {\n  var domWidth = contentSize[0];\n  var domHeight = contentSize[1];\n  var offset = Math.ceil(Math.SQRT2 * borderWidth) + 8;\n  var x = 0;\n  var y = 0;\n  var rectWidth = rect.width;\n  var rectHeight = rect.height;\n  switch (position) {\n    case 'inside':\n      x = rect.x + rectWidth / 2 - domWidth / 2;\n      y = rect.y + rectHeight / 2 - domHeight / 2;\n      break;\n    case 'top':\n      x = rect.x + rectWidth / 2 - domWidth / 2;\n      y = rect.y - domHeight - offset;\n      break;\n    case 'bottom':\n      x = rect.x + rectWidth / 2 - domWidth / 2;\n      y = rect.y + rectHeight + offset;\n      break;\n    case 'left':\n      x = rect.x - domWidth - offset;\n      y = rect.y + rectHeight / 2 - domHeight / 2;\n      break;\n    case 'right':\n      x = rect.x + rectWidth + offset;\n      y = rect.y + rectHeight / 2 - domHeight / 2;\n  }\n  return [x, y];\n}\nfunction isCenterAlign(align) {\n  return align === 'center' || align === 'middle';\n}\n/**\n * Find target component by payload like:\n * ```js\n * { legendId: 'some_id', name: 'xxx' }\n * { toolboxIndex: 1, name: 'xxx' }\n * { geoName: 'some_name', name: 'xxx' }\n * ```\n * PENDING: at present only\n *\n * If not found, return null/undefined.\n */\nfunction findComponentReference(payload, ecModel, api) {\n  var queryOptionMap = preParseFinder(payload).queryOptionMap;\n  var componentMainType = queryOptionMap.keys()[0];\n  if (!componentMainType || componentMainType === 'series') {\n    return;\n  }\n  var queryResult = queryReferringComponents(ecModel, componentMainType, queryOptionMap.get(componentMainType), {\n    useDefault: false,\n    enableAll: false,\n    enableNone: false\n  });\n  var model = queryResult.models[0];\n  if (!model) {\n    return;\n  }\n  var view = api.getViewOfComponentModel(model);\n  var el;\n  view.group.traverse(function (subEl) {\n    var tooltipConfig = getECData(subEl).tooltipConfig;\n    if (tooltipConfig && tooltipConfig.name === payload.name) {\n      el = subEl;\n      return true; // stop\n    }\n  });\n  if (el) {\n    return {\n      componentMainType: componentMainType,\n      componentIndex: model.componentIndex,\n      el: el\n    };\n  }\n}\nexport default TooltipView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { install as installAxisPointer } from '../axisPointer/install.js';\nimport { use } from '../../extension.js';\nimport TooltipModel from './TooltipModel.js';\nimport TooltipView from './TooltipView.js';\nimport { noop } from 'zrender/lib/core/util.js';\nexport function install(registers) {\n  use(installAxisPointer);\n  registers.registerComponentModel(TooltipModel);\n  registers.registerComponentView(TooltipView);\n  /**\n   * @action\n   * @property {string} type\n   * @property {number} seriesIndex\n   * @property {number} dataIndex\n   * @property {number} [x]\n   * @property {number} [y]\n   */\n  registers.registerAction({\n    type: 'showTip',\n    event: 'showTip',\n    update: 'tooltip:manuallyShowTip'\n  }, noop);\n  registers.registerAction({\n    type: 'hideTip',\n    event: 'hideTip',\n    update: 'tooltip:manuallyHideTip'\n  }, noop);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { normalizeToArray } from '../../util/model.js';\nvar DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear'];\nexport default function brushPreprocessor(option, isNew) {\n  var brushComponents = normalizeToArray(option ? option.brush : []);\n  if (!brushComponents.length) {\n    return;\n  }\n  var brushComponentSpecifiedBtns = [];\n  zrUtil.each(brushComponents, function (brushOpt) {\n    var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : [];\n    if (tbs instanceof Array) {\n      brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs);\n    }\n  });\n  var toolbox = option && option.toolbox;\n  if (zrUtil.isArray(toolbox)) {\n    toolbox = toolbox[0];\n  }\n  if (!toolbox) {\n    toolbox = {\n      feature: {}\n    };\n    option.toolbox = [toolbox];\n  }\n  var toolboxFeature = toolbox.feature || (toolbox.feature = {});\n  var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {});\n  var brushTypes = toolboxBrush.type || (toolboxBrush.type = []);\n  brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns);\n  removeDuplicate(brushTypes);\n  if (isNew && !brushTypes.length) {\n    brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS);\n  }\n}\nfunction removeDuplicate(arr) {\n  var map = {};\n  zrUtil.each(arr, function (val) {\n    map[val] = 1;\n  });\n  arr.length = 0;\n  zrUtil.each(map, function (flag, val) {\n    arr.push(val);\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * @file Visual solution, for consistent option specification.\n */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport VisualMapping from './VisualMapping.js';\nimport { getItemVisualFromData, setItemVisualFromData } from './helper.js';\nvar each = zrUtil.each;\nfunction hasKeys(obj) {\n  if (obj) {\n    for (var name_1 in obj) {\n      if (obj.hasOwnProperty(name_1)) {\n        return true;\n      }\n    }\n  }\n}\nexport function createVisualMappings(option, stateList, supplementVisualOption) {\n  var visualMappings = {};\n  each(stateList, function (state) {\n    var mappings = visualMappings[state] = createMappings();\n    each(option[state], function (visualData, visualType) {\n      if (!VisualMapping.isValidType(visualType)) {\n        return;\n      }\n      var mappingOption = {\n        type: visualType,\n        visual: visualData\n      };\n      supplementVisualOption && supplementVisualOption(mappingOption, state);\n      mappings[visualType] = new VisualMapping(mappingOption);\n      // Prepare a alpha for opacity, for some case that opacity\n      // is not supported, such as rendering using gradient color.\n      if (visualType === 'opacity') {\n        mappingOption = zrUtil.clone(mappingOption);\n        mappingOption.type = 'colorAlpha';\n        mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption);\n      }\n    });\n  });\n  return visualMappings;\n  function createMappings() {\n    var Creater = function () {};\n    // Make sure hidden fields will not be visited by\n    // object iteration (with hasOwnProperty checking).\n    Creater.prototype.__hidden = Creater.prototype;\n    var obj = new Creater();\n    return obj;\n  }\n}\nexport function replaceVisualOption(thisOption, newOption, keys) {\n  // Visual attributes merge is not supported, otherwise it\n  // brings overcomplicated merge logic. See #2853. So if\n  // newOption has anyone of these keys, all of these keys\n  // will be reset. Otherwise, all keys remain.\n  var has;\n  zrUtil.each(keys, function (key) {\n    if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {\n      has = true;\n    }\n  });\n  has && zrUtil.each(keys, function (key) {\n    if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {\n      thisOption[key] = zrUtil.clone(newOption[key]);\n    } else {\n      delete thisOption[key];\n    }\n  });\n}\n/**\n * @param stateList\n * @param visualMappings\n * @param list\n * @param getValueState param: valueOrIndex, return: state.\n * @param scope Scope for getValueState\n * @param dimension Concrete dimension, if used.\n */\n// ???! handle brush?\nexport function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) {\n  var visualTypesMap = {};\n  zrUtil.each(stateList, function (state) {\n    var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);\n    visualTypesMap[state] = visualTypes;\n  });\n  var dataIndex;\n  function getVisual(key) {\n    return getItemVisualFromData(data, dataIndex, key);\n  }\n  function setVisual(key, value) {\n    setItemVisualFromData(data, dataIndex, key, value);\n  }\n  if (dimension == null) {\n    data.each(eachItem);\n  } else {\n    data.each([dimension], eachItem);\n  }\n  function eachItem(valueOrIndex, index) {\n    dataIndex = dimension == null ? valueOrIndex // First argument is index\n    : index;\n    var rawDataItem = data.getRawDataItem(dataIndex);\n    // Consider performance\n    // @ts-ignore\n    if (rawDataItem && rawDataItem.visualMap === false) {\n      return;\n    }\n    var valueState = getValueState.call(scope, valueOrIndex);\n    var mappings = visualMappings[valueState];\n    var visualTypes = visualTypesMap[valueState];\n    for (var i = 0, len = visualTypes.length; i < len; i++) {\n      var type = visualTypes[i];\n      mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual);\n    }\n  }\n}\n/**\n * @param data\n * @param stateList\n * @param visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>\n * @param getValueState param: valueOrIndex, return: state.\n * @param dim dimension or dimension index.\n */\nexport function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) {\n  var visualTypesMap = {};\n  zrUtil.each(stateList, function (state) {\n    var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);\n    visualTypesMap[state] = visualTypes;\n  });\n  return {\n    progress: function progress(params, data) {\n      var dimIndex;\n      if (dim != null) {\n        dimIndex = data.getDimensionIndex(dim);\n      }\n      function getVisual(key) {\n        return getItemVisualFromData(data, dataIndex, key);\n      }\n      function setVisual(key, value) {\n        setItemVisualFromData(data, dataIndex, key, value);\n      }\n      var dataIndex;\n      var store = data.getStore();\n      while ((dataIndex = params.next()) != null) {\n        var rawDataItem = data.getRawDataItem(dataIndex);\n        // Consider performance\n        // @ts-ignore\n        if (rawDataItem && rawDataItem.visualMap === false) {\n          continue;\n        }\n        var value = dim != null ? store.get(dimIndex, dataIndex) : dataIndex;\n        var valueState = getValueState(value);\n        var mappings = visualMappings[valueState];\n        var visualTypes = visualTypesMap[valueState];\n        for (var i = 0, len = visualTypes.length; i < len; i++) {\n          var type = visualTypes[i];\n          mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual);\n        }\n      }\n    }\n  };\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as polygonContain from 'zrender/lib/contain/polygon.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { linePolygonIntersect } from '../../util/graphic.js';\nexport function makeBrushCommonSelectorForSeries(area) {\n  var brushType = area.brushType;\n  // Do not use function binding or curry for performance.\n  var selectors = {\n    point: function (itemLayout) {\n      return selector[brushType].point(itemLayout, selectors, area);\n    },\n    rect: function (itemLayout) {\n      return selector[brushType].rect(itemLayout, selectors, area);\n    }\n  };\n  return selectors;\n}\nvar selector = {\n  lineX: getLineSelectors(0),\n  lineY: getLineSelectors(1),\n  rect: {\n    point: function (itemLayout, selectors, area) {\n      return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]);\n    },\n    rect: function (itemLayout, selectors, area) {\n      return itemLayout && area.boundingRect.intersect(itemLayout);\n    }\n  },\n  polygon: {\n    point: function (itemLayout, selectors, area) {\n      return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && polygonContain.contain(area.range, itemLayout[0], itemLayout[1]);\n    },\n    rect: function (itemLayout, selectors, area) {\n      var points = area.range;\n      if (!itemLayout || points.length <= 1) {\n        return false;\n      }\n      var x = itemLayout.x;\n      var y = itemLayout.y;\n      var width = itemLayout.width;\n      var height = itemLayout.height;\n      var p = points[0];\n      if (polygonContain.contain(points, x, y) || polygonContain.contain(points, x + width, y) || polygonContain.contain(points, x, y + height) || polygonContain.contain(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || linePolygonIntersect(x, y, x + width, y, points) || linePolygonIntersect(x, y, x, y + height, points) || linePolygonIntersect(x + width, y, x + width, y + height, points) || linePolygonIntersect(x, y + height, x + width, y + height, points)) {\n        return true;\n      }\n    }\n  }\n};\nfunction getLineSelectors(xyIndex) {\n  var xy = ['x', 'y'];\n  var wh = ['width', 'height'];\n  return {\n    point: function (itemLayout, selectors, area) {\n      if (itemLayout) {\n        var range = area.range;\n        var p = itemLayout[xyIndex];\n        return inLineRange(p, range);\n      }\n    },\n    rect: function (itemLayout, selectors, area) {\n      if (itemLayout) {\n        var range = area.range;\n        var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]];\n        layoutRange[1] < layoutRange[0] && layoutRange.reverse();\n        return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange);\n      }\n    }\n  };\n}\nfunction inLineRange(p, range) {\n  return range[0] <= p && p <= range[1];\n}\nexport default selector;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport * as visualSolution from '../../visual/visualSolution.js';\nimport { makeBrushCommonSelectorForSeries } from './selector.js';\nimport * as throttleUtil from '../../util/throttle.js';\nimport BrushTargetManager from '../helper/BrushTargetManager.js';\nvar STATE_LIST = ['inBrush', 'outOfBrush'];\nvar DISPATCH_METHOD = '__ecBrushSelect';\nvar DISPATCH_FLAG = '__ecInBrushSelectEvent';\n;\nexport function layoutCovers(ecModel) {\n  ecModel.eachComponent({\n    mainType: 'brush'\n  }, function (brushModel) {\n    var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel);\n    brushTargetManager.setInputRanges(brushModel.areas, ecModel);\n  });\n}\n/**\n * Register the visual encoding if this modules required.\n */\nexport default function brushVisual(ecModel, api, payload) {\n  var brushSelected = [];\n  var throttleType;\n  var throttleDelay;\n  ecModel.eachComponent({\n    mainType: 'brush'\n  }, function (brushModel) {\n    payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : {\n      brushType: false\n    });\n  });\n  layoutCovers(ecModel);\n  ecModel.eachComponent({\n    mainType: 'brush'\n  }, function (brushModel, brushIndex) {\n    var thisBrushSelected = {\n      brushId: brushModel.id,\n      brushIndex: brushIndex,\n      brushName: brushModel.name,\n      areas: zrUtil.clone(brushModel.areas),\n      selected: []\n    };\n    // Every brush component exists in event params, convenient\n    // for user to find by index.\n    brushSelected.push(thisBrushSelected);\n    var brushOption = brushModel.option;\n    var brushLink = brushOption.brushLink;\n    var linkedSeriesMap = [];\n    var selectedDataIndexForLink = [];\n    var rangeInfoBySeries = [];\n    var hasBrushExists = false;\n    if (!brushIndex) {\n      // Only the first throttle setting works.\n      throttleType = brushOption.throttleType;\n      throttleDelay = brushOption.throttleDelay;\n    }\n    // Add boundingRect and selectors to range.\n    var areas = zrUtil.map(brushModel.areas, function (area) {\n      var builder = boundingRectBuilders[area.brushType];\n      var selectableArea = zrUtil.defaults({\n        boundingRect: builder ? builder(area) : void 0\n      }, area);\n      selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea);\n      return selectableArea;\n    });\n    var visualMappings = visualSolution.createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) {\n      mappingOption.mappingMethod = 'fixed';\n    });\n    zrUtil.isArray(brushLink) && zrUtil.each(brushLink, function (seriesIndex) {\n      linkedSeriesMap[seriesIndex] = 1;\n    });\n    function linkOthers(seriesIndex) {\n      return brushLink === 'all' || !!linkedSeriesMap[seriesIndex];\n    }\n    // If no supported brush or no brush on the series,\n    // all visuals should be in original state.\n    function brushed(rangeInfoList) {\n      return !!rangeInfoList.length;\n    }\n    /**\n     * Logic for each series: (If the logic has to be modified one day, do it carefully!)\n     *\n     * ( brushed \u252C && \u252ChasBrushExist \u252C && linkOthers  ) => StepA: \u252Crecord, \u252C StepB: \u252CvisualByRecord.\n     *   !brushed\u2518    \u251ChasBrushExist \u2524                            \u2514nothing,\u2518        \u251CvisualByRecord.\n     *                \u2514!hasBrushExist\u2518                                              \u2514nothing.\n     * ( !brushed  && \u252ChasBrushExist \u252C && linkOthers  ) => StepA:  nothing,  StepB: \u252CvisualByRecord.\n     *                \u2514!hasBrushExist\u2518                                              \u2514nothing.\n     * ( brushed \u252C &&                     !linkOthers ) => StepA:  nothing,  StepB: \u252CvisualByCheck.\n     *   !brushed\u2518                                                                  \u2514nothing.\n     * ( !brushed  &&                     !linkOthers ) => StepA:  nothing,  StepB:  nothing.\n     */\n    // Step A\n    ecModel.eachSeries(function (seriesModel, seriesIndex) {\n      var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];\n      seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList);\n    });\n    function stepAParallel(seriesModel, seriesIndex) {\n      var coordSys = seriesModel.coordinateSystem;\n      hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed();\n      linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) {\n        activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1);\n      });\n    }\n    function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {\n      if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) {\n        return;\n      }\n      zrUtil.each(areas, function (area) {\n        if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) {\n          rangeInfoList.push(area);\n        }\n        hasBrushExists = hasBrushExists || brushed(rangeInfoList);\n      });\n      if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {\n        var data_1 = seriesModel.getData();\n        data_1.each(function (dataIndex) {\n          if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) {\n            selectedDataIndexForLink[dataIndex] = 1;\n          }\n        });\n      }\n    }\n    // Step B\n    ecModel.eachSeries(function (seriesModel, seriesIndex) {\n      var seriesBrushSelected = {\n        seriesId: seriesModel.id,\n        seriesIndex: seriesIndex,\n        seriesName: seriesModel.name,\n        dataIndex: []\n      };\n      // Every series exists in event params, convenient\n      // for user to find series by seriesIndex.\n      thisBrushSelected.selected.push(seriesBrushSelected);\n      var rangeInfoList = rangeInfoBySeries[seriesIndex];\n      var data = seriesModel.getData();\n      var getValueState = linkOthers(seriesIndex) ? function (dataIndex) {\n        return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush';\n      } : function (dataIndex) {\n        return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush';\n      };\n      // If no supported brush or no brush, all visuals are in original state.\n      (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && visualSolution.applyVisual(STATE_LIST, visualMappings, data, getValueState);\n    });\n  });\n  dispatchAction(api, throttleType, throttleDelay, brushSelected, payload);\n}\n;\nfunction dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) {\n  // This event will not be triggered when `setOpion`, otherwise dead lock may\n  // triggered when do `setOption` in event listener, which we do not find\n  // satisfactory way to solve yet. Some considered resolutions:\n  // (a) Diff with prevoius selected data ant only trigger event when changed.\n  // But store previous data and diff precisely (i.e., not only by dataIndex, but\n  // also detect value changes in selected data) might bring complexity or fragility.\n  // (b) Use spectial param like `silent` to suppress event triggering.\n  // But such kind of volatile param may be weird in `setOption`.\n  if (!payload) {\n    return;\n  }\n  var zr = api.getZr();\n  if (zr[DISPATCH_FLAG]) {\n    return;\n  }\n  if (!zr[DISPATCH_METHOD]) {\n    zr[DISPATCH_METHOD] = doDispatch;\n  }\n  var fn = throttleUtil.createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);\n  fn(api, brushSelected);\n}\nfunction doDispatch(api, brushSelected) {\n  if (!api.isDisposed()) {\n    var zr = api.getZr();\n    zr[DISPATCH_FLAG] = true;\n    api.dispatchAction({\n      type: 'brushSelect',\n      batch: brushSelected\n    });\n    zr[DISPATCH_FLAG] = false;\n  }\n}\nfunction checkInRange(seriesModel, rangeInfoList, data, dataIndex) {\n  for (var i = 0, len = rangeInfoList.length; i < len; i++) {\n    var area = rangeInfoList[i];\n    if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) {\n      return true;\n    }\n  }\n}\nfunction brushModelNotControll(brushModel, seriesIndex) {\n  var seriesIndices = brushModel.option.seriesIndex;\n  return seriesIndices != null && seriesIndices !== 'all' && (zrUtil.isArray(seriesIndices) ? zrUtil.indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices);\n}\nvar boundingRectBuilders = {\n  rect: function (area) {\n    return getBoundingRectFromMinMax(area.range);\n  },\n  polygon: function (area) {\n    var minMax;\n    var range = area.range;\n    for (var i = 0, len = range.length; i < len; i++) {\n      minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]];\n      var rg = range[i];\n      rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]);\n      rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]);\n      rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]);\n      rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]);\n    }\n    return minMax && getBoundingRectFromMinMax(minMax);\n  }\n};\nfunction getBoundingRectFromMinMax(minMax) {\n  return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport BrushController from '../helper/BrushController.js';\nimport { layoutCovers } from './visualEncoding.js';\nimport ComponentView from '../../view/Component.js';\nvar BrushView = /** @class */function (_super) {\n  __extends(BrushView, _super);\n  function BrushView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = BrushView.type;\n    return _this;\n  }\n  BrushView.prototype.init = function (ecModel, api) {\n    this.ecModel = ecModel;\n    this.api = api;\n    this.model;\n    (this._brushController = new BrushController(api.getZr())).on('brush', zrUtil.bind(this._onBrush, this)).mount();\n  };\n  BrushView.prototype.render = function (brushModel, ecModel, api, payload) {\n    this.model = brushModel;\n    this._updateController(brushModel, ecModel, api, payload);\n  };\n  BrushView.prototype.updateTransform = function (brushModel, ecModel, api, payload) {\n    // PENDING: `updateTransform` is a little tricky, whose layout need\n    // to be calculate mandatorily and other stages will not be performed.\n    // Take care the correctness of the logic. See #11754 .\n    layoutCovers(ecModel);\n    this._updateController(brushModel, ecModel, api, payload);\n  };\n  BrushView.prototype.updateVisual = function (brushModel, ecModel, api, payload) {\n    this.updateTransform(brushModel, ecModel, api, payload);\n  };\n  BrushView.prototype.updateView = function (brushModel, ecModel, api, payload) {\n    this._updateController(brushModel, ecModel, api, payload);\n  };\n  BrushView.prototype._updateController = function (brushModel, ecModel, api, payload) {\n    // Do not update controller when drawing.\n    (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice());\n  };\n  // updateLayout: updateController,\n  // updateVisual: updateController,\n  BrushView.prototype.dispose = function () {\n    this._brushController.dispose();\n  };\n  BrushView.prototype._onBrush = function (eventParam) {\n    var modelId = this.model.id;\n    var areas = this.model.brushTargetManager.setOutputRanges(eventParam.areas, this.ecModel);\n    // Action is not dispatched on drag end, because the drag end\n    // emits the same params with the last drag move event, and\n    // may have some delay when using touch pad, which makes\n    // animation not smooth (when using debounce).\n    (!eventParam.isEnd || eventParam.removeOnClick) && this.api.dispatchAction({\n      type: 'brush',\n      brushId: modelId,\n      areas: zrUtil.clone(areas),\n      $from: modelId\n    });\n    eventParam.isEnd && this.api.dispatchAction({\n      type: 'brushEnd',\n      brushId: modelId,\n      areas: zrUtil.clone(areas),\n      $from: modelId\n    });\n  };\n  BrushView.type = 'brush';\n  return BrushView;\n}(ComponentView);\nexport default BrushView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as visualSolution from '../../visual/visualSolution.js';\nimport Model from '../../model/Model.js';\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar BrushModel = /** @class */function (_super) {\n  __extends(BrushModel, _super);\n  function BrushModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = BrushModel.type;\n    /**\n     * @readOnly\n     */\n    _this.areas = [];\n    /**\n     * Current brush painting area settings.\n     * @readOnly\n     */\n    _this.brushOption = {};\n    return _this;\n  }\n  BrushModel.prototype.optionUpdated = function (newOption, isInit) {\n    var thisOption = this.option;\n    !isInit && visualSolution.replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']);\n    var inBrush = thisOption.inBrush = thisOption.inBrush || {};\n    // Always give default visual, consider setOption at the second time.\n    thisOption.outOfBrush = thisOption.outOfBrush || {\n      color: this.option.defaultOutOfBrushColor\n    };\n    if (!inBrush.hasOwnProperty('liftZ')) {\n      // Bigger than the highlight z lift, otherwise it will\n      // be effected by the highlight z when brush.\n      inBrush.liftZ = 5;\n    }\n  };\n  /**\n   * If `areas` is null/undefined, range state remain.\n   */\n  BrushModel.prototype.setAreas = function (areas) {\n    if (process.env.NODE_ENV !== 'production') {\n      zrUtil.assert(zrUtil.isArray(areas));\n      zrUtil.each(areas, function (area) {\n        zrUtil.assert(area.brushType, 'Illegal areas');\n      });\n    }\n    // If areas is null/undefined, range state remain.\n    // This helps user to dispatchAction({type: 'brush'}) with no areas\n    // set but just want to get the current brush select info from a `brush` event.\n    if (!areas) {\n      return;\n    }\n    this.areas = zrUtil.map(areas, function (area) {\n      return generateBrushOption(this.option, area);\n    }, this);\n  };\n  /**\n   * Set the current painting brush option.\n   */\n  BrushModel.prototype.setBrushOption = function (brushOption) {\n    this.brushOption = generateBrushOption(this.option, brushOption);\n    this.brushType = this.brushOption.brushType;\n  };\n  BrushModel.type = 'brush';\n  BrushModel.dependencies = ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'];\n  BrushModel.defaultOption = {\n    seriesIndex: 'all',\n    brushType: 'rect',\n    brushMode: 'single',\n    transformable: true,\n    brushStyle: {\n      borderWidth: 1,\n      color: tokens.color.backgroundTint,\n      borderColor: tokens.color.borderTint\n    },\n    throttleType: 'fixRate',\n    throttleDelay: 0,\n    removeOnClick: true,\n    z: 10000,\n    defaultOutOfBrushColor: tokens.color.disabled\n  };\n  return BrushModel;\n}(ComponentModel);\nfunction generateBrushOption(option, brushOption) {\n  return zrUtil.merge({\n    brushType: option.brushType,\n    brushMode: option.brushMode,\n    transformable: option.transformable,\n    brushStyle: new Model(option.brushStyle).getItemStyle(),\n    removeOnClick: option.removeOnClick,\n    z: option.z\n  }, brushOption, true);\n}\nexport default BrushModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { ToolboxFeature } from '../featureManager.js';\nvar ICON_TYPES = ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'];\nvar BrushFeature = /** @class */function (_super) {\n  __extends(BrushFeature, _super);\n  function BrushFeature() {\n    return _super !== null && _super.apply(this, arguments) || this;\n  }\n  BrushFeature.prototype.render = function (featureModel, ecModel, api) {\n    var brushType;\n    var brushMode;\n    var isBrushed;\n    ecModel.eachComponent({\n      mainType: 'brush'\n    }, function (brushModel) {\n      brushType = brushModel.brushType;\n      brushMode = brushModel.brushOption.brushMode || 'single';\n      isBrushed = isBrushed || !!brushModel.areas.length;\n    });\n    this._brushType = brushType;\n    this._brushMode = brushMode;\n    zrUtil.each(featureModel.get('type', true), function (type) {\n      featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal');\n    });\n  };\n  BrushFeature.prototype.updateView = function (featureModel, ecModel, api) {\n    this.render(featureModel, ecModel, api);\n  };\n  BrushFeature.prototype.getIcons = function () {\n    var model = this.model;\n    var availableIcons = model.get('icon', true);\n    var icons = {};\n    zrUtil.each(model.get('type', true), function (type) {\n      if (availableIcons[type]) {\n        icons[type] = availableIcons[type];\n      }\n    });\n    return icons;\n  };\n  ;\n  BrushFeature.prototype.onclick = function (ecModel, api, type) {\n    var brushType = this._brushType;\n    var brushMode = this._brushMode;\n    if (type === 'clear') {\n      // Trigger parallel action firstly\n      api.dispatchAction({\n        type: 'axisAreaSelect',\n        intervals: []\n      });\n      api.dispatchAction({\n        type: 'brush',\n        command: 'clear',\n        // Clear all areas of all brush components.\n        areas: []\n      });\n    } else {\n      api.dispatchAction({\n        type: 'takeGlobalCursor',\n        key: 'brush',\n        brushOption: {\n          brushType: type === 'keep' ? brushType : brushType === type ? false : type,\n          brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode\n        }\n      });\n    }\n  };\n  ;\n  BrushFeature.getDefaultOption = function (ecModel) {\n    var defaultOption = {\n      show: true,\n      type: ICON_TYPES.slice(),\n      icon: {\n        /* eslint-disable */\n        rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13',\n        polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2',\n        lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4',\n        lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4',\n        keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z',\n        clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line\n        /* eslint-enable */\n      },\n      // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear`\n      title: ecModel.getLocaleModel().get(['toolbox', 'brush', 'title'])\n    };\n    return defaultOption;\n  };\n  return BrushFeature;\n}(ToolboxFeature);\nexport default BrushFeature;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport brushPreprocessor from './preprocessor.js';\nimport BrushView from './BrushView.js';\nimport BrushModel from './BrushModel.js';\nimport brushVisual from './visualEncoding.js';\n// TODO\nimport BrushFeature from '../toolbox/feature/Brush.js';\nimport { registerFeature } from '../toolbox/featureManager.js';\nimport { noop } from 'zrender/lib/core/util.js';\nexport function install(registers) {\n  registers.registerComponentView(BrushView);\n  registers.registerComponentModel(BrushModel);\n  registers.registerPreprocessor(brushPreprocessor);\n  registers.registerVisual(registers.PRIORITY.VISUAL.BRUSH, brushVisual);\n  registers.registerAction({\n    type: 'brush',\n    event: 'brush',\n    update: 'updateVisual'\n  }, function (payload, ecModel) {\n    ecModel.eachComponent({\n      mainType: 'brush',\n      query: payload\n    }, function (brushModel) {\n      brushModel.setAreas(payload.areas);\n    });\n  });\n  /**\n   * payload: {\n   *      brushComponents: [\n   *          {\n   *              brushId,\n   *              brushIndex,\n   *              brushName,\n   *              series: [\n   *                  {\n   *                      seriesId,\n   *                      seriesIndex,\n   *                      seriesName,\n   *                      rawIndices: [21, 34, ...]\n   *                  },\n   *                  ...\n   *              ]\n   *          },\n   *          ...\n   *      ]\n   * }\n   */\n  registers.registerAction({\n    type: 'brushSelect',\n    event: 'brushSelected',\n    update: 'none'\n  }, noop);\n  registers.registerAction({\n    type: 'brushEnd',\n    event: 'brushEnd',\n    update: 'none'\n  }, noop);\n  registerFeature('brush', BrushFeature);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport { createBoxLayoutReference, getLayoutRect } from '../../util/layout.js';\nimport ComponentModel from '../../model/Component.js';\nimport ComponentView from '../../view/Component.js';\nimport { windowOpen } from '../../util/format.js';\nimport tokens from '../../visual/tokens.js';\nvar TitleModel = /** @class */function (_super) {\n  __extends(TitleModel, _super);\n  function TitleModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TitleModel.type;\n    _this.layoutMode = {\n      type: 'box',\n      ignoreSize: true\n    };\n    return _this;\n  }\n  TitleModel.type = 'title';\n  TitleModel.defaultOption = {\n    // zlevel: 0,\n    z: 6,\n    show: true,\n    text: '',\n    target: 'blank',\n    subtext: '',\n    subtarget: 'blank',\n    left: 'center',\n    top: tokens.size.m,\n    backgroundColor: tokens.color.transparent,\n    borderColor: tokens.color.primary,\n    borderWidth: 0,\n    padding: 5,\n    itemGap: 10,\n    textStyle: {\n      fontSize: 18,\n      fontWeight: 'bold',\n      color: tokens.color.primary\n    },\n    subtextStyle: {\n      fontSize: 12,\n      color: tokens.color.quaternary\n    }\n  };\n  return TitleModel;\n}(ComponentModel);\n// View\nvar TitleView = /** @class */function (_super) {\n  __extends(TitleView, _super);\n  function TitleView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TitleView.type;\n    return _this;\n  }\n  TitleView.prototype.render = function (titleModel, ecModel, api) {\n    this.group.removeAll();\n    if (!titleModel.get('show')) {\n      return;\n    }\n    var group = this.group;\n    var textStyleModel = titleModel.getModel('textStyle');\n    var subtextStyleModel = titleModel.getModel('subtextStyle');\n    var textAlign = titleModel.get('textAlign');\n    var textVerticalAlign = zrUtil.retrieve2(titleModel.get('textBaseline'), titleModel.get('textVerticalAlign'));\n    var textEl = new graphic.Text({\n      style: createTextStyle(textStyleModel, {\n        text: titleModel.get('text'),\n        fill: textStyleModel.getTextColor()\n      }, {\n        disableBox: true\n      }),\n      z2: 10\n    });\n    var textRect = textEl.getBoundingRect();\n    var subText = titleModel.get('subtext');\n    var subTextEl = new graphic.Text({\n      style: createTextStyle(subtextStyleModel, {\n        text: subText,\n        fill: subtextStyleModel.getTextColor(),\n        y: textRect.height + titleModel.get('itemGap'),\n        verticalAlign: 'top'\n      }, {\n        disableBox: true\n      }),\n      z2: 10\n    });\n    var link = titleModel.get('link');\n    var sublink = titleModel.get('sublink');\n    var triggerEvent = titleModel.get('triggerEvent', true);\n    textEl.silent = !link && !triggerEvent;\n    subTextEl.silent = !sublink && !triggerEvent;\n    if (link) {\n      textEl.on('click', function () {\n        windowOpen(link, '_' + titleModel.get('target'));\n      });\n    }\n    if (sublink) {\n      subTextEl.on('click', function () {\n        windowOpen(sublink, '_' + titleModel.get('subtarget'));\n      });\n    }\n    getECData(textEl).eventData = getECData(subTextEl).eventData = triggerEvent ? {\n      componentType: 'title',\n      componentIndex: titleModel.componentIndex\n    } : null;\n    group.add(textEl);\n    subText && group.add(subTextEl);\n    // If no subText, but add subTextEl, there will be an empty line.\n    var groupRect = group.getBoundingRect();\n    var layoutOption = titleModel.getBoxLayoutParams();\n    layoutOption.width = groupRect.width;\n    layoutOption.height = groupRect.height;\n    var layoutRef = createBoxLayoutReference(titleModel, api);\n    var layoutRect = getLayoutRect(layoutOption, layoutRef.refContainer, titleModel.get('padding'));\n    // Adjust text align based on position\n    if (!textAlign) {\n      // Align left if title is on the left. center and right is same\n      textAlign = titleModel.get('left') || titleModel.get('right');\n      // @ts-ignore\n      if (textAlign === 'middle') {\n        textAlign = 'center';\n      }\n      // Adjust layout by text align\n      if (textAlign === 'right') {\n        layoutRect.x += layoutRect.width;\n      } else if (textAlign === 'center') {\n        layoutRect.x += layoutRect.width / 2;\n      }\n    }\n    if (!textVerticalAlign) {\n      textVerticalAlign = titleModel.get('top') || titleModel.get('bottom');\n      // @ts-ignore\n      if (textVerticalAlign === 'center') {\n        textVerticalAlign = 'middle';\n      }\n      if (textVerticalAlign === 'bottom') {\n        layoutRect.y += layoutRect.height;\n      } else if (textVerticalAlign === 'middle') {\n        layoutRect.y += layoutRect.height / 2;\n      }\n      textVerticalAlign = textVerticalAlign || 'top';\n    }\n    group.x = layoutRect.x;\n    group.y = layoutRect.y;\n    group.markRedraw();\n    var alignStyle = {\n      align: textAlign,\n      verticalAlign: textVerticalAlign\n    };\n    textEl.setStyle(alignStyle);\n    subTextEl.setStyle(alignStyle);\n    // Render background\n    // Get groupRect again because textAlign has been changed\n    groupRect = group.getBoundingRect();\n    var padding = layoutRect.margin;\n    var style = titleModel.getItemStyle(['color', 'opacity']);\n    style.fill = titleModel.get('backgroundColor');\n    var rect = new graphic.Rect({\n      shape: {\n        x: groupRect.x - padding[3],\n        y: groupRect.y - padding[0],\n        width: groupRect.width + padding[1] + padding[3],\n        height: groupRect.height + padding[0] + padding[2],\n        r: titleModel.get('borderRadius')\n      },\n      style: style,\n      subPixelOptimize: true,\n      silent: true\n    });\n    group.add(rect);\n  };\n  TitleView.type = 'title';\n  return TitleView;\n}(ComponentView);\nexport function install(registers) {\n  registers.registerComponentModel(TitleModel);\n  registers.registerComponentView(TitleView);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport { each, isObject, clone } from 'zrender/lib/core/util.js';\nimport { convertOptionIdName, getDataItemValue } from '../../util/model.js';\nimport tokens from '../../visual/tokens.js';\nvar TimelineModel = /** @class */function (_super) {\n  __extends(TimelineModel, _super);\n  function TimelineModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TimelineModel.type;\n    _this.layoutMode = 'box';\n    return _this;\n  }\n  /**\n   * @override\n   */\n  TimelineModel.prototype.init = function (option, parentModel, ecModel) {\n    this.mergeDefaultAndTheme(option, ecModel);\n    this._initData();\n  };\n  /**\n   * @override\n   */\n  TimelineModel.prototype.mergeOption = function (option) {\n    _super.prototype.mergeOption.apply(this, arguments);\n    this._initData();\n  };\n  TimelineModel.prototype.setCurrentIndex = function (currentIndex) {\n    if (currentIndex == null) {\n      currentIndex = this.option.currentIndex;\n    }\n    var count = this._data.count();\n    if (this.option.loop) {\n      currentIndex = (currentIndex % count + count) % count;\n    } else {\n      currentIndex >= count && (currentIndex = count - 1);\n      currentIndex < 0 && (currentIndex = 0);\n    }\n    this.option.currentIndex = currentIndex;\n  };\n  /**\n   * @return {number} currentIndex\n   */\n  TimelineModel.prototype.getCurrentIndex = function () {\n    return this.option.currentIndex;\n  };\n  /**\n   * @return {boolean}\n   */\n  TimelineModel.prototype.isIndexMax = function () {\n    return this.getCurrentIndex() >= this._data.count() - 1;\n  };\n  /**\n   * @param {boolean} state true: play, false: stop\n   */\n  TimelineModel.prototype.setPlayState = function (state) {\n    this.option.autoPlay = !!state;\n  };\n  /**\n   * @return {boolean} true: play, false: stop\n   */\n  TimelineModel.prototype.getPlayState = function () {\n    return !!this.option.autoPlay;\n  };\n  /**\n   * @private\n   */\n  TimelineModel.prototype._initData = function () {\n    var thisOption = this.option;\n    var dataArr = thisOption.data || [];\n    var axisType = thisOption.axisType;\n    var names = this._names = [];\n    var processedDataArr;\n    if (axisType === 'category') {\n      processedDataArr = [];\n      each(dataArr, function (item, index) {\n        var value = convertOptionIdName(getDataItemValue(item), '');\n        var newItem;\n        if (isObject(item)) {\n          newItem = clone(item);\n          newItem.value = index;\n        } else {\n          newItem = index;\n        }\n        processedDataArr.push(newItem);\n        names.push(value);\n      });\n    } else {\n      processedDataArr = dataArr;\n    }\n    var dimType = {\n      category: 'ordinal',\n      time: 'time',\n      value: 'number'\n    }[axisType] || 'number';\n    var data = this._data = new SeriesData([{\n      name: 'value',\n      type: dimType\n    }], this);\n    data.initData(processedDataArr, names);\n  };\n  TimelineModel.prototype.getData = function () {\n    return this._data;\n  };\n  /**\n   * @public\n   * @return {Array.<string>} categoreis\n   */\n  TimelineModel.prototype.getCategories = function () {\n    if (this.get('axisType') === 'category') {\n      return this._names.slice();\n    }\n  };\n  TimelineModel.type = 'timeline';\n  /**\n   * @protected\n   */\n  TimelineModel.defaultOption = {\n    // zlevel: 0,                  // \u4E00\u7EA7\u5C42\u53E0\n    z: 4,\n    show: true,\n    axisType: 'time',\n    realtime: true,\n    left: '20%',\n    top: null,\n    right: '20%',\n    bottom: 0,\n    width: null,\n    height: 40,\n    padding: tokens.size.m,\n    controlPosition: 'left',\n    autoPlay: false,\n    rewind: false,\n    loop: true,\n    playInterval: 2000,\n    currentIndex: 0,\n    itemStyle: {},\n    label: {\n      color: tokens.color.secondary\n    },\n    data: []\n  };\n  return TimelineModel;\n}(ComponentModel);\nexport default TimelineModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport TimelineModel from './TimelineModel.js';\nimport { DataFormatMixin } from '../../model/mixin/dataFormat.js';\nimport { mixin } from 'zrender/lib/core/util.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nimport tokens from '../../visual/tokens.js';\nvar SliderTimelineModel = /** @class */function (_super) {\n  __extends(SliderTimelineModel, _super);\n  function SliderTimelineModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SliderTimelineModel.type;\n    return _this;\n  }\n  SliderTimelineModel.type = 'timeline.slider';\n  /**\n   * @protected\n   */\n  SliderTimelineModel.defaultOption = inheritDefaultOption(TimelineModel.defaultOption, {\n    backgroundColor: 'rgba(0,0,0,0)',\n    borderColor: tokens.color.border,\n    borderWidth: 0,\n    orient: 'horizontal',\n    inverse: false,\n    tooltip: {\n      trigger: 'item' // data item may also have tootip attr.\n    },\n    symbol: 'circle',\n    symbolSize: 12,\n    lineStyle: {\n      show: true,\n      width: 2,\n      color: tokens.color.accent10\n    },\n    label: {\n      position: 'auto',\n      // When using number, label position is not\n      // restricted by viewRect.\n      // positive: right/bottom, negative: left/top\n      show: true,\n      interval: 'auto',\n      rotate: 0,\n      // formatter: null,\n      // \u5176\u4F59\u5C5E\u6027\u9ED8\u8BA4\u4F7F\u7528\u5168\u5C40\u6587\u672C\u6837\u5F0F\uFF0C\u8BE6\u89C1TEXTSTYLE\n      color: tokens.color.tertiary\n    },\n    itemStyle: {\n      color: tokens.color.accent20,\n      borderWidth: 0\n    },\n    checkpointStyle: {\n      symbol: 'circle',\n      symbolSize: 15,\n      color: tokens.color.accent50,\n      borderColor: tokens.color.accent50,\n      borderWidth: 0,\n      shadowBlur: 0,\n      shadowOffsetX: 0,\n      shadowOffsetY: 0,\n      shadowColor: 'rgba(0, 0, 0, 0)',\n      // borderColor: 'rgba(194,53,49, 0.5)',\n      animation: true,\n      animationDuration: 300,\n      animationEasing: 'quinticInOut'\n    },\n    controlStyle: {\n      show: true,\n      showPlayBtn: true,\n      showPrevBtn: true,\n      showNextBtn: true,\n      itemSize: 24,\n      itemGap: 12,\n      position: 'left',\n      playIcon: 'path://M15 0C23.2843 0 30 6.71573 30 15C30 23.2843 23.2843 30 15 30C6.71573 30 0 23.2843 0 15C0 6.71573 6.71573 0 15 0ZM15 3C8.37258 3 3 8.37258 3 15C3 21.6274 8.37258 27 15 27C21.6274 27 27 21.6274 27 15C27 8.37258 21.6274 3 15 3ZM11.5 10.6699C11.5 9.90014 12.3333 9.41887 13 9.80371L20.5 14.1338C21.1667 14.5187 21.1667 15.4813 20.5 15.8662L13 20.1963C12.3333 20.5811 11.5 20.0999 11.5 19.3301V10.6699Z',\n      stopIcon: 'path://M15 0C23.2843 0 30 6.71573 30 15C30 23.2843 23.2843 30 15 30C6.71573 30 0 23.2843 0 15C0 6.71573 6.71573 0 15 0ZM15 3C8.37258 3 3 8.37258 3 15C3 21.6274 8.37258 27 15 27C21.6274 27 27 21.6274 27 15C27 8.37258 21.6274 3 15 3ZM11.5 10C12.3284 10 13 10.6716 13 11.5V18.5C13 19.3284 12.3284 20 11.5 20C10.6716 20 10 19.3284 10 18.5V11.5C10 10.6716 10.6716 10 11.5 10ZM18.5 10C19.3284 10 20 10.6716 20 11.5V18.5C20 19.3284 19.3284 20 18.5 20C17.6716 20 17 19.3284 17 18.5V11.5C17 10.6716 17.6716 10 18.5 10Z',\n      // eslint-disable-next-line max-len\n      nextIcon: 'path://M0.838834 18.7383C0.253048 18.1525 0.253048 17.2028 0.838834 16.617L7.55635 9.89949L0.838834 3.18198C0.253048 2.59619 0.253048 1.64645 0.838834 1.06066C1.42462 0.474874 2.37437 0.474874 2.96015 1.06066L10.7383 8.83883L10.8412 8.95277C11.2897 9.50267 11.2897 10.2963 10.8412 10.8462L10.7383 10.9602L2.96015 18.7383C2.37437 19.3241 1.42462 19.3241 0.838834 18.7383Z',\n      // eslint-disable-next-line max-len\n      prevIcon: 'path://M10.9602 1.06066C11.5459 1.64645 11.5459 2.59619 10.9602 3.18198L4.24264 9.89949L10.9602 16.617C11.5459 17.2028 11.5459 18.1525 10.9602 18.7383C10.3744 19.3241 9.42462 19.3241 8.83883 18.7383L1.06066 10.9602L0.957771 10.8462C0.509245 10.2963 0.509245 9.50267 0.957771 8.95277L1.06066 8.83883L8.83883 1.06066C9.42462 0.474874 10.3744 0.474874 10.9602 1.06066Z',\n      prevBtnSize: 18,\n      nextBtnSize: 18,\n      color: tokens.color.accent50,\n      borderColor: tokens.color.accent50,\n      borderWidth: 0\n    },\n    emphasis: {\n      label: {\n        show: true,\n        // \u5176\u4F59\u5C5E\u6027\u9ED8\u8BA4\u4F7F\u7528\u5168\u5C40\u6587\u672C\u6837\u5F0F\uFF0C\u8BE6\u89C1TEXTSTYLE\n        color: tokens.color.accent60\n      },\n      itemStyle: {\n        color: tokens.color.accent60,\n        borderColor: tokens.color.accent60\n      },\n      controlStyle: {\n        color: tokens.color.accent70,\n        borderColor: tokens.color.accent70\n      }\n    },\n    progress: {\n      lineStyle: {\n        color: tokens.color.accent30\n      },\n      itemStyle: {\n        color: tokens.color.accent40\n      }\n    },\n    data: []\n  });\n  return SliderTimelineModel;\n}(TimelineModel);\nmixin(SliderTimelineModel, DataFormatMixin.prototype);\nexport default SliderTimelineModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nvar TimelineView = /** @class */function (_super) {\n  __extends(TimelineView, _super);\n  function TimelineView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = TimelineView.type;\n    return _this;\n  }\n  TimelineView.type = 'timeline';\n  return TimelineView;\n}(ComponentView);\nexport default TimelineView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport Axis from '../../coord/Axis.js';\n/**\n * Extend axis 2d\n */\nvar TimelineAxis = /** @class */function (_super) {\n  __extends(TimelineAxis, _super);\n  function TimelineAxis(dim, scale, coordExtent, axisType) {\n    var _this = _super.call(this, dim, scale, coordExtent) || this;\n    _this.type = axisType || 'value';\n    return _this;\n  }\n  /**\n   * @override\n   */\n  TimelineAxis.prototype.getLabelModel = function () {\n    // Force override\n    return this.model.getModel('label');\n  };\n  /**\n   * @override\n   */\n  TimelineAxis.prototype.isHorizontal = function () {\n    return this.model.get('orient') === 'horizontal';\n  };\n  return TimelineAxis;\n}(Axis);\nexport default TimelineAxis;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport * as graphic from '../../util/graphic.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport * as layout from '../../util/layout.js';\nimport TimelineView from './TimelineView.js';\nimport TimelineAxis from './TimelineAxis.js';\nimport { createSymbol, normalizeSymbolOffset, normalizeSymbolSize } from '../../util/symbol.js';\nimport * as numberUtil from '../../util/number.js';\nimport { merge, each, extend, isString, bind, defaults, retrieve2 } from 'zrender/lib/core/util.js';\nimport OrdinalScale from '../../scale/Ordinal.js';\nimport TimeScale from '../../scale/Time.js';\nimport IntervalScale from '../../scale/Interval.js';\nimport { parsePercent } from 'zrender/lib/contain/text.js';\nimport { makeInner } from '../../util/model.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { enableHoverEmphasis } from '../../util/states.js';\nimport { createTooltipMarkup } from '../tooltip/tooltipMarkup.js';\nvar PI = Math.PI;\nvar labelDataIndexStore = makeInner();\nvar SliderTimelineView = /** @class */function (_super) {\n  __extends(SliderTimelineView, _super);\n  function SliderTimelineView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SliderTimelineView.type;\n    return _this;\n  }\n  SliderTimelineView.prototype.init = function (ecModel, api) {\n    this.api = api;\n  };\n  /**\n   * @override\n   */\n  SliderTimelineView.prototype.render = function (timelineModel, ecModel, api) {\n    this.model = timelineModel;\n    this.api = api;\n    this.ecModel = ecModel;\n    this.group.removeAll();\n    if (timelineModel.get('show', true)) {\n      var layoutInfo_1 = this._layout(timelineModel, api);\n      var mainGroup_1 = this._createGroup('_mainGroup');\n      var labelGroup = this._createGroup('_labelGroup');\n      var axis_1 = this._axis = this._createAxis(layoutInfo_1, timelineModel);\n      timelineModel.formatTooltip = function (dataIndex) {\n        var name = axis_1.scale.getLabel({\n          value: dataIndex\n        });\n        return createTooltipMarkup('nameValue', {\n          noName: true,\n          value: name\n        });\n      };\n      each(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) {\n        this['_render' + name](layoutInfo_1, mainGroup_1, axis_1, timelineModel);\n      }, this);\n      this._renderAxisLabel(layoutInfo_1, labelGroup, axis_1, timelineModel);\n      this._position(layoutInfo_1, timelineModel);\n    }\n    this._doPlayStop();\n    this._updateTicksStatus();\n  };\n  /**\n   * @override\n   */\n  SliderTimelineView.prototype.remove = function () {\n    this._clearTimer();\n    this.group.removeAll();\n  };\n  /**\n   * @override\n   */\n  SliderTimelineView.prototype.dispose = function () {\n    this._clearTimer();\n  };\n  SliderTimelineView.prototype._layout = function (timelineModel, api) {\n    var labelPosOpt = timelineModel.get(['label', 'position']);\n    var orient = timelineModel.get('orient');\n    var viewRect = getViewRect(timelineModel, api);\n    var parsedLabelPos;\n    // Auto label offset.\n    if (labelPosOpt == null || labelPosOpt === 'auto') {\n      parsedLabelPos = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-';\n    } else if (isString(labelPosOpt)) {\n      parsedLabelPos = {\n        horizontal: {\n          top: '-',\n          bottom: '+'\n        },\n        vertical: {\n          left: '-',\n          right: '+'\n        }\n      }[orient][labelPosOpt];\n    } else {\n      // is number\n      parsedLabelPos = labelPosOpt;\n    }\n    var labelAlignMap = {\n      horizontal: 'center',\n      vertical: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'left' : 'right'\n    };\n    var labelBaselineMap = {\n      horizontal: parsedLabelPos >= 0 || parsedLabelPos === '+' ? 'top' : 'bottom',\n      vertical: 'middle'\n    };\n    var rotationMap = {\n      horizontal: 0,\n      vertical: PI / 2\n    };\n    // Position\n    var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width;\n    var controlModel = timelineModel.getModel('controlStyle');\n    var showControl = controlModel.get('show', true);\n    var controlSize = showControl ? controlModel.get('itemSize') : 0;\n    var controlGap = showControl ? controlModel.get('itemGap') : 0;\n    var sizePlusGap = controlSize + controlGap;\n    // Special label rotate.\n    var labelRotation = timelineModel.get(['label', 'rotate']) || 0;\n    labelRotation = labelRotation * PI / 180; // To radian.\n    var playPosition;\n    var prevBtnPosition;\n    var nextBtnPosition;\n    var controlPosition = controlModel.get('position', true);\n    var showPlayBtn = showControl && controlModel.get('showPlayBtn', true);\n    var showPrevBtn = showControl && controlModel.get('showPrevBtn', true);\n    var showNextBtn = showControl && controlModel.get('showNextBtn', true);\n    var xLeft = 0;\n    var xRight = mainLength;\n    // position[0] means left, position[1] means middle.\n    if (controlPosition === 'left' || controlPosition === 'bottom') {\n      showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap);\n      showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap);\n      showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n    } else {\n      // 'top' 'right'\n      showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n      showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap);\n      showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);\n    }\n    var axisExtent = [xLeft, xRight];\n    if (timelineModel.get('inverse')) {\n      axisExtent.reverse();\n    }\n    return {\n      viewRect: viewRect,\n      mainLength: mainLength,\n      orient: orient,\n      rotation: rotationMap[orient],\n      labelRotation: labelRotation,\n      labelPosOpt: parsedLabelPos,\n      labelAlign: timelineModel.get(['label', 'align']) || labelAlignMap[orient],\n      labelBaseline: timelineModel.get(['label', 'verticalAlign']) || timelineModel.get(['label', 'baseline']) || labelBaselineMap[orient],\n      // Based on mainGroup.\n      playPosition: playPosition,\n      prevBtnPosition: prevBtnPosition,\n      nextBtnPosition: nextBtnPosition,\n      axisExtent: axisExtent,\n      controlSize: controlSize,\n      controlGap: controlGap\n    };\n  };\n  SliderTimelineView.prototype._position = function (layoutInfo, timelineModel) {\n    // Position is be called finally, because bounding rect is needed for\n    // adapt content to fill viewRect (auto adapt offset).\n    // Timeline may be not all in the viewRect when 'offset' is specified\n    // as a number, because it is more appropriate that label aligns at\n    // 'offset' but not the other edge defined by viewRect.\n    var mainGroup = this._mainGroup;\n    var labelGroup = this._labelGroup;\n    var viewRect = layoutInfo.viewRect;\n    if (layoutInfo.orient === 'vertical') {\n      // transform to horizontal, inverse rotate by left-top point.\n      var m = matrix.create();\n      var rotateOriginX = viewRect.x;\n      var rotateOriginY = viewRect.y + viewRect.height;\n      matrix.translate(m, m, [-rotateOriginX, -rotateOriginY]);\n      matrix.rotate(m, m, -PI / 2);\n      matrix.translate(m, m, [rotateOriginX, rotateOriginY]);\n      viewRect = viewRect.clone();\n      viewRect.applyTransform(m);\n    }\n    var viewBound = getBound(viewRect);\n    var mainBound = getBound(mainGroup.getBoundingRect());\n    var labelBound = getBound(labelGroup.getBoundingRect());\n    var mainPosition = [mainGroup.x, mainGroup.y];\n    var labelsPosition = [labelGroup.x, labelGroup.y];\n    labelsPosition[0] = mainPosition[0] = viewBound[0][0];\n    var labelPosOpt = layoutInfo.labelPosOpt;\n    if (labelPosOpt == null || isString(labelPosOpt)) {\n      // '+' or '-'\n      var mainBoundIdx = labelPosOpt === '+' ? 0 : 1;\n      toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n      toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx);\n    } else {\n      var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1;\n      toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);\n      labelsPosition[1] = mainPosition[1] + labelPosOpt;\n    }\n    mainGroup.setPosition(mainPosition);\n    labelGroup.setPosition(labelsPosition);\n    mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation;\n    setOrigin(mainGroup);\n    setOrigin(labelGroup);\n    function setOrigin(targetGroup) {\n      targetGroup.originX = viewBound[0][0] - targetGroup.x;\n      targetGroup.originY = viewBound[1][0] - targetGroup.y;\n    }\n    function getBound(rect) {\n      // [[xmin, xmax], [ymin, ymax]]\n      return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]];\n    }\n    function toBound(fromPos, from, to, dimIdx, boundIdx) {\n      fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx];\n    }\n  };\n  SliderTimelineView.prototype._createAxis = function (layoutInfo, timelineModel) {\n    var data = timelineModel.getData();\n    var axisType = timelineModel.get('axisType');\n    var scale = createScaleByModel(timelineModel, axisType);\n    // Customize scale. The `tickValue` is `dataIndex`.\n    scale.getTicks = function () {\n      return data.mapArray(['value'], function (value) {\n        return {\n          value: value\n        };\n      });\n    };\n    var dataExtent = data.getDataExtent('value');\n    scale.setExtent(dataExtent[0], dataExtent[1]);\n    scale.calcNiceTicks();\n    var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType);\n    axis.model = timelineModel;\n    return axis;\n  };\n  SliderTimelineView.prototype._createGroup = function (key) {\n    var newGroup = this[key] = new graphic.Group();\n    this.group.add(newGroup);\n    return newGroup;\n  };\n  SliderTimelineView.prototype._renderAxisLine = function (layoutInfo, group, axis, timelineModel) {\n    var axisExtent = axis.getExtent();\n    if (!timelineModel.get(['lineStyle', 'show'])) {\n      return;\n    }\n    var line = new graphic.Line({\n      shape: {\n        x1: axisExtent[0],\n        y1: 0,\n        x2: axisExtent[1],\n        y2: 0\n      },\n      style: extend({\n        lineCap: 'round'\n      }, timelineModel.getModel('lineStyle').getLineStyle()),\n      silent: true,\n      z2: 1\n    });\n    group.add(line);\n    var progressLine = this._progressLine = new graphic.Line({\n      shape: {\n        x1: axisExtent[0],\n        x2: this._currentPointer ? this._currentPointer.x : axisExtent[0],\n        y1: 0,\n        y2: 0\n      },\n      style: defaults({\n        lineCap: 'round',\n        lineWidth: line.style.lineWidth\n      }, timelineModel.getModel(['progress', 'lineStyle']).getLineStyle()),\n      silent: true,\n      z2: 1\n    });\n    group.add(progressLine);\n  };\n  SliderTimelineView.prototype._renderAxisTick = function (layoutInfo, group, axis, timelineModel) {\n    var _this = this;\n    var data = timelineModel.getData();\n    // Show all ticks, despite ignoring strategy.\n    var ticks = axis.scale.getTicks();\n    this._tickSymbols = [];\n    // The value is dataIndex, see the customized scale.\n    each(ticks, function (tick) {\n      var tickCoord = axis.dataToCoord(tick.value);\n      var itemModel = data.getItemModel(tick.value);\n      var itemStyleModel = itemModel.getModel('itemStyle');\n      var hoverStyleModel = itemModel.getModel(['emphasis', 'itemStyle']);\n      var progressStyleModel = itemModel.getModel(['progress', 'itemStyle']);\n      var symbolOpt = {\n        x: tickCoord,\n        y: 0,\n        onclick: bind(_this._changeTimeline, _this, tick.value)\n      };\n      var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt);\n      el.ensureState('emphasis').style = hoverStyleModel.getItemStyle();\n      el.ensureState('progress').style = progressStyleModel.getItemStyle();\n      enableHoverEmphasis(el);\n      var ecData = getECData(el);\n      if (itemModel.get('tooltip')) {\n        ecData.dataIndex = tick.value;\n        ecData.dataModel = timelineModel;\n      } else {\n        ecData.dataIndex = ecData.dataModel = null;\n      }\n      _this._tickSymbols.push(el);\n    });\n  };\n  SliderTimelineView.prototype._renderAxisLabel = function (layoutInfo, group, axis, timelineModel) {\n    var _this = this;\n    var labelModel = axis.getLabelModel();\n    if (!labelModel.get('show')) {\n      return;\n    }\n    var data = timelineModel.getData();\n    var labels = axis.getViewLabels();\n    this._tickLabels = [];\n    each(labels, function (labelItem) {\n      // The tickValue is dataIndex, see the customized scale.\n      var dataIndex = labelItem.tickValue;\n      var itemModel = data.getItemModel(dataIndex);\n      var normalLabelModel = itemModel.getModel('label');\n      var hoverLabelModel = itemModel.getModel(['emphasis', 'label']);\n      var progressLabelModel = itemModel.getModel(['progress', 'label']);\n      var tickCoord = axis.dataToCoord(labelItem.tickValue);\n      var textEl = new graphic.Text({\n        x: tickCoord,\n        y: 0,\n        rotation: layoutInfo.labelRotation - layoutInfo.rotation,\n        onclick: bind(_this._changeTimeline, _this, dataIndex),\n        silent: false,\n        style: createTextStyle(normalLabelModel, {\n          text: labelItem.formattedLabel,\n          align: layoutInfo.labelAlign,\n          verticalAlign: layoutInfo.labelBaseline\n        })\n      });\n      textEl.ensureState('emphasis').style = createTextStyle(hoverLabelModel);\n      textEl.ensureState('progress').style = createTextStyle(progressLabelModel);\n      group.add(textEl);\n      enableHoverEmphasis(textEl);\n      labelDataIndexStore(textEl).dataIndex = dataIndex;\n      _this._tickLabels.push(textEl);\n    });\n  };\n  SliderTimelineView.prototype._renderControl = function (layoutInfo, group, axis, timelineModel) {\n    var controlSize = layoutInfo.controlSize;\n    var rotation = layoutInfo.rotation;\n    var itemStyle = timelineModel.getModel('controlStyle').getItemStyle();\n    var hoverStyle = timelineModel.getModel(['emphasis', 'controlStyle']).getItemStyle();\n    var playState = timelineModel.getPlayState();\n    var inverse = timelineModel.get('inverse', true);\n    makeBtn(layoutInfo.nextBtnPosition, 'next', bind(this._changeTimeline, this, inverse ? '-' : '+'));\n    makeBtn(layoutInfo.prevBtnPosition, 'prev', bind(this._changeTimeline, this, inverse ? '+' : '-'));\n    makeBtn(layoutInfo.playPosition, playState ? 'stop' : 'play', bind(this._handlePlayClick, this, !playState), true);\n    function makeBtn(position, iconName, onclick, willRotate) {\n      if (!position) {\n        return;\n      }\n      var iconSize = parsePercent(retrieve2(timelineModel.get(['controlStyle', iconName + 'BtnSize']), controlSize), controlSize);\n      var rect = [0, -iconSize / 2, iconSize, iconSize];\n      var btn = makeControlIcon(timelineModel, iconName + 'Icon', rect, {\n        x: position[0],\n        y: position[1],\n        originX: controlSize / 2,\n        originY: 0,\n        rotation: willRotate ? -rotation : 0,\n        rectHover: true,\n        style: itemStyle,\n        onclick: onclick\n      });\n      btn.ensureState('emphasis').style = hoverStyle;\n      group.add(btn);\n      enableHoverEmphasis(btn);\n    }\n  };\n  SliderTimelineView.prototype._renderCurrentPointer = function (layoutInfo, group, axis, timelineModel) {\n    var data = timelineModel.getData();\n    var currentIndex = timelineModel.getCurrentIndex();\n    var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle');\n    var me = this;\n    var callback = {\n      onCreate: function (pointer) {\n        pointer.draggable = true;\n        pointer.drift = bind(me._handlePointerDrag, me);\n        pointer.ondragend = bind(me._handlePointerDragend, me);\n        pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel, true);\n      },\n      onUpdate: function (pointer) {\n        pointerMoveTo(pointer, me._progressLine, currentIndex, axis, timelineModel);\n      }\n    };\n    // Reuse when exists, for animation and drag.\n    this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback);\n  };\n  SliderTimelineView.prototype._handlePlayClick = function (nextState) {\n    this._clearTimer();\n    this.api.dispatchAction({\n      type: 'timelinePlayChange',\n      playState: nextState,\n      from: this.uid\n    });\n  };\n  SliderTimelineView.prototype._handlePointerDrag = function (dx, dy, e) {\n    this._clearTimer();\n    this._pointerChangeTimeline([e.offsetX, e.offsetY]);\n  };\n  SliderTimelineView.prototype._handlePointerDragend = function (e) {\n    this._pointerChangeTimeline([e.offsetX, e.offsetY], true);\n  };\n  SliderTimelineView.prototype._pointerChangeTimeline = function (mousePos, trigger) {\n    var toCoord = this._toAxisCoord(mousePos)[0];\n    var axis = this._axis;\n    var axisExtent = numberUtil.asc(axis.getExtent().slice());\n    toCoord > axisExtent[1] && (toCoord = axisExtent[1]);\n    toCoord < axisExtent[0] && (toCoord = axisExtent[0]);\n    this._currentPointer.x = toCoord;\n    this._currentPointer.markRedraw();\n    var progressLine = this._progressLine;\n    if (progressLine) {\n      progressLine.shape.x2 = toCoord;\n      progressLine.dirty();\n    }\n    var targetDataIndex = this._findNearestTick(toCoord);\n    var timelineModel = this.model;\n    if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) {\n      this._changeTimeline(targetDataIndex);\n    }\n  };\n  SliderTimelineView.prototype._doPlayStop = function () {\n    var _this = this;\n    this._clearTimer();\n    if (this.model.getPlayState()) {\n      this._timer = setTimeout(function () {\n        // Do not cache\n        var timelineModel = _this.model;\n        _this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1));\n      }, this.model.get('playInterval'));\n    }\n  };\n  SliderTimelineView.prototype._toAxisCoord = function (vertex) {\n    var trans = this._mainGroup.getLocalTransform();\n    return graphic.applyTransform(vertex, trans, true);\n  };\n  SliderTimelineView.prototype._findNearestTick = function (axisCoord) {\n    var data = this.model.getData();\n    var dist = Infinity;\n    var targetDataIndex;\n    var axis = this._axis;\n    data.each(['value'], function (value, dataIndex) {\n      var coord = axis.dataToCoord(value);\n      var d = Math.abs(coord - axisCoord);\n      if (d < dist) {\n        dist = d;\n        targetDataIndex = dataIndex;\n      }\n    });\n    return targetDataIndex;\n  };\n  SliderTimelineView.prototype._clearTimer = function () {\n    if (this._timer) {\n      clearTimeout(this._timer);\n      this._timer = null;\n    }\n  };\n  SliderTimelineView.prototype._changeTimeline = function (nextIndex) {\n    var currentIndex = this.model.getCurrentIndex();\n    if (nextIndex === '+') {\n      nextIndex = currentIndex + 1;\n    } else if (nextIndex === '-') {\n      nextIndex = currentIndex - 1;\n    }\n    this.api.dispatchAction({\n      type: 'timelineChange',\n      currentIndex: nextIndex,\n      from: this.uid\n    });\n  };\n  SliderTimelineView.prototype._updateTicksStatus = function () {\n    var currentIndex = this.model.getCurrentIndex();\n    var tickSymbols = this._tickSymbols;\n    var tickLabels = this._tickLabels;\n    if (tickSymbols) {\n      for (var i = 0; i < tickSymbols.length; i++) {\n        tickSymbols && tickSymbols[i] && tickSymbols[i].toggleState('progress', i < currentIndex);\n      }\n    }\n    if (tickLabels) {\n      for (var i = 0; i < tickLabels.length; i++) {\n        tickLabels && tickLabels[i] && tickLabels[i].toggleState('progress', labelDataIndexStore(tickLabels[i]).dataIndex <= currentIndex);\n      }\n    }\n  };\n  SliderTimelineView.type = 'timeline.slider';\n  return SliderTimelineView;\n}(TimelineView);\nfunction createScaleByModel(model, axisType) {\n  axisType = axisType || model.get('type');\n  if (axisType) {\n    switch (axisType) {\n      // Buildin scale\n      case 'category':\n        return new OrdinalScale({\n          ordinalMeta: model.getCategories(),\n          extent: [Infinity, -Infinity]\n        });\n      case 'time':\n        return new TimeScale({\n          locale: model.ecModel.getLocaleModel(),\n          useUTC: model.ecModel.get('useUTC')\n        });\n      default:\n        // default to be value\n        return new IntervalScale();\n    }\n  }\n}\nfunction getViewRect(model, api) {\n  return layout.getLayoutRect(model.getBoxLayoutParams(), layout.createBoxLayoutReference(model, api).refContainer, model.get('padding'));\n}\nfunction makeControlIcon(timelineModel, objPath, rect, opts) {\n  var style = opts.style;\n  var icon = graphic.createIcon(timelineModel.get(['controlStyle', objPath]), opts || {}, new BoundingRect(rect[0], rect[1], rect[2], rect[3]));\n  // TODO createIcon won't use style in opt.\n  if (style) {\n    icon.setStyle(style);\n  }\n  return icon;\n}\n/**\n * Create symbol or update symbol\n * opt: basic position and event handlers\n */\nfunction giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {\n  var color = itemStyleModel.get('color');\n  if (!symbol) {\n    var symbolType = hostModel.get('symbol');\n    symbol = createSymbol(symbolType, -1, -1, 2, 2, color);\n    symbol.setStyle('strokeNoScale', true);\n    group.add(symbol);\n    callback && callback.onCreate(symbol);\n  } else {\n    symbol.setColor(color);\n    group.add(symbol); // Group may be new, also need to add.\n    callback && callback.onUpdate(symbol);\n  }\n  // Style\n  var itemStyle = itemStyleModel.getItemStyle(['color']);\n  symbol.setStyle(itemStyle);\n  // Transform and events.\n  opt = merge({\n    rectHover: true,\n    z2: 100\n  }, opt, true);\n  var symbolSize = normalizeSymbolSize(hostModel.get('symbolSize'));\n  opt.scaleX = symbolSize[0] / 2;\n  opt.scaleY = symbolSize[1] / 2;\n  var symbolOffset = normalizeSymbolOffset(hostModel.get('symbolOffset'), symbolSize);\n  if (symbolOffset) {\n    opt.x = (opt.x || 0) + symbolOffset[0];\n    opt.y = (opt.y || 0) + symbolOffset[1];\n  }\n  var symbolRotate = hostModel.get('symbolRotate');\n  opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;\n  symbol.attr(opt);\n  // FIXME\n  // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed,\n  // getBoundingRect will return wrong result.\n  // (This is supposed to be resolved in zrender, but it is a little difficult to\n  // leverage performance and auto updateTransform)\n  // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol.\n  symbol.updateTransform();\n  return symbol;\n}\nfunction pointerMoveTo(pointer, progressLine, dataIndex, axis, timelineModel, noAnimation) {\n  if (pointer.dragging) {\n    return;\n  }\n  var pointerModel = timelineModel.getModel('checkpointStyle');\n  var toCoord = axis.dataToCoord(timelineModel.getData().get('value', dataIndex));\n  if (noAnimation || !pointerModel.get('animation', true)) {\n    pointer.attr({\n      x: toCoord,\n      y: 0\n    });\n    progressLine && progressLine.attr({\n      shape: {\n        x2: toCoord\n      }\n    });\n  } else {\n    var animationCfg = {\n      duration: pointerModel.get('animationDuration', true),\n      easing: pointerModel.get('animationEasing', true)\n    };\n    pointer.stopAnimation(null, true);\n    pointer.animateTo({\n      x: toCoord,\n      y: 0\n    }, animationCfg);\n    progressLine && progressLine.animateTo({\n      shape: {\n        x2: toCoord\n      }\n    }, animationCfg);\n  }\n}\nexport default SliderTimelineView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { defaults } from 'zrender/lib/core/util.js';\nexport function installTimelineAction(registers) {\n  registers.registerAction({\n    type: 'timelineChange',\n    event: 'timelineChanged',\n    update: 'prepareAndUpdate'\n  }, function (payload, ecModel, api) {\n    var timelineModel = ecModel.getComponent('timeline');\n    if (timelineModel && payload.currentIndex != null) {\n      timelineModel.setCurrentIndex(payload.currentIndex);\n      if (!timelineModel.get('loop', true) && timelineModel.isIndexMax() && timelineModel.getPlayState()) {\n        timelineModel.setPlayState(false);\n        // The timeline has played to the end, trigger event\n        api.dispatchAction({\n          type: 'timelinePlayChange',\n          playState: false,\n          from: payload.from\n        });\n      }\n    }\n    // Set normalized currentIndex to payload.\n    ecModel.resetOption('timeline', {\n      replaceMerge: timelineModel.get('replaceMerge', true)\n    });\n    return defaults({\n      currentIndex: timelineModel.option.currentIndex\n    }, payload);\n  });\n  registers.registerAction({\n    type: 'timelinePlayChange',\n    event: 'timelinePlayChanged',\n    update: 'update'\n  }, function (payload, ecModel) {\n    var timelineModel = ecModel.getComponent('timeline');\n    if (timelineModel && payload.playState != null) {\n      timelineModel.setPlayState(payload.playState);\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// @ts-nocheck\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function timelinePreprocessor(option) {\n  var timelineOpt = option && option.timeline;\n  if (!zrUtil.isArray(timelineOpt)) {\n    timelineOpt = timelineOpt ? [timelineOpt] : [];\n  }\n  zrUtil.each(timelineOpt, function (opt) {\n    if (!opt) {\n      return;\n    }\n    compatibleEC2(opt);\n  });\n}\nfunction compatibleEC2(opt) {\n  var type = opt.type;\n  var ec2Types = {\n    'number': 'value',\n    'time': 'time'\n  };\n  // Compatible with ec2\n  if (ec2Types[type]) {\n    opt.axisType = ec2Types[type];\n    delete opt.type;\n  }\n  transferItem(opt);\n  if (has(opt, 'controlPosition')) {\n    var controlStyle = opt.controlStyle || (opt.controlStyle = {});\n    if (!has(controlStyle, 'position')) {\n      controlStyle.position = opt.controlPosition;\n    }\n    if (controlStyle.position === 'none' && !has(controlStyle, 'show')) {\n      controlStyle.show = false;\n      delete controlStyle.position;\n    }\n    delete opt.controlPosition;\n  }\n  zrUtil.each(opt.data || [], function (dataItem) {\n    if (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) {\n      if (!has(dataItem, 'value') && has(dataItem, 'name')) {\n        // In ec2, using name as value.\n        dataItem.value = dataItem.name;\n      }\n      transferItem(dataItem);\n    }\n  });\n}\nfunction transferItem(opt) {\n  var itemStyle = opt.itemStyle || (opt.itemStyle = {});\n  var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {});\n  // Transfer label out\n  var label = opt.label || opt.label || {};\n  var labelNormal = label.normal || (label.normal = {});\n  var excludeLabelAttr = {\n    normal: 1,\n    emphasis: 1\n  };\n  zrUtil.each(label, function (value, name) {\n    if (!excludeLabelAttr[name] && !has(labelNormal, name)) {\n      labelNormal[name] = value;\n    }\n  });\n  if (itemStyleEmphasis.label && !has(label, 'emphasis')) {\n    label.emphasis = itemStyleEmphasis.label;\n    delete itemStyleEmphasis.label;\n  }\n}\nfunction has(obj, attr) {\n  return obj.hasOwnProperty(attr);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nimport SliderTimelineModel from './SliderTimelineModel.js';\nimport SliderTimelineView from './SliderTimelineView.js';\nimport { installTimelineAction } from './timelineAction.js';\nimport preprocessor from './preprocessor.js';\nexport function install(registers) {\n  registers.registerComponentModel(SliderTimelineModel);\n  registers.registerComponentView(SliderTimelineView);\n  registers.registerSubTypeDefaulter('timeline', function () {\n    // Only slider now.\n    return 'slider';\n  });\n  installTimelineAction(registers);\n  registers.registerPreprocessor(preprocessor);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { isArray } from 'zrender/lib/core/util.js';\nexport default function checkMarkerInSeries(seriesOpts, markerType) {\n  if (!seriesOpts) {\n    return false;\n  }\n  var seriesOptArr = isArray(seriesOpts) ? seriesOpts : [seriesOpts];\n  for (var idx = 0; idx < seriesOptArr.length; idx++) {\n    if (seriesOptArr[idx] && seriesOptArr[idx][markerType]) {\n      return true;\n    }\n  }\n  return false;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport env from 'zrender/lib/core/env.js';\nimport { DataFormatMixin } from '../../model/mixin/dataFormat.js';\nimport ComponentModel from '../../model/Component.js';\nimport { makeInner, defaultEmphasis } from '../../util/model.js';\nimport { createTooltipMarkup } from '../tooltip/tooltipMarkup.js';\nfunction fillLabel(opt) {\n  defaultEmphasis(opt, 'label', ['show']);\n}\n// { [componentType]: MarkerModel }\nvar inner = makeInner();\nvar MarkerModel = /** @class */function (_super) {\n  __extends(MarkerModel, _super);\n  function MarkerModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkerModel.type;\n    /**\n     * If marker model is created by self from series\n     */\n    _this.createdBySelf = false;\n    _this.preventAutoZ = true;\n    return _this;\n  }\n  /**\n   * @overrite\n   */\n  MarkerModel.prototype.init = function (option, parentModel, ecModel) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (this.type === 'marker') {\n        throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.');\n      }\n    }\n    this.mergeDefaultAndTheme(option, ecModel);\n    this._mergeOption(option, ecModel, false, true);\n  };\n  MarkerModel.prototype.isAnimationEnabled = function () {\n    if (env.node) {\n      return false;\n    }\n    var hostSeries = this.__hostSeries;\n    return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled();\n  };\n  /**\n   * @overrite\n   */\n  MarkerModel.prototype.mergeOption = function (newOpt, ecModel) {\n    this._mergeOption(newOpt, ecModel, false, false);\n  };\n  MarkerModel.prototype._mergeOption = function (newOpt, ecModel, createdBySelf, isInit) {\n    var componentType = this.mainType;\n    if (!createdBySelf) {\n      ecModel.eachSeries(function (seriesModel) {\n        // mainType can be markPoint, markLine, markArea\n        var markerOpt = seriesModel.get(this.mainType, true);\n        var markerModel = inner(seriesModel)[componentType];\n        if (!markerOpt || !markerOpt.data) {\n          inner(seriesModel)[componentType] = null;\n          return;\n        }\n        if (!markerModel) {\n          if (isInit) {\n            // Default label emphasis `position` and `show`\n            fillLabel(markerOpt);\n          }\n          zrUtil.each(markerOpt.data, function (item) {\n            // FIXME Overwrite fillLabel method ?\n            if (item instanceof Array) {\n              fillLabel(item[0]);\n              fillLabel(item[1]);\n            } else {\n              fillLabel(item);\n            }\n          });\n          markerModel = this.createMarkerModelFromSeries(markerOpt, this, ecModel);\n          // markerModel = new ImplementedMarkerModel(\n          //     markerOpt, this, ecModel\n          // );\n          zrUtil.extend(markerModel, {\n            mainType: this.mainType,\n            // Use the same series index and name\n            seriesIndex: seriesModel.seriesIndex,\n            name: seriesModel.name,\n            createdBySelf: true\n          });\n          markerModel.__hostSeries = seriesModel;\n        } else {\n          markerModel._mergeOption(markerOpt, ecModel, true);\n        }\n        inner(seriesModel)[componentType] = markerModel;\n      }, this);\n    }\n  };\n  MarkerModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {\n    var data = this.getData();\n    var value = this.getRawValue(dataIndex);\n    var itemName = data.getName(dataIndex);\n    return createTooltipMarkup('section', {\n      header: this.name,\n      blocks: [createTooltipMarkup('nameValue', {\n        name: itemName,\n        value: value,\n        noName: !itemName,\n        noValue: value == null\n      })]\n    });\n  };\n  MarkerModel.prototype.getData = function () {\n    return this._data;\n  };\n  MarkerModel.prototype.setData = function (data) {\n    this._data = data;\n  };\n  MarkerModel.prototype.getDataParams = function (dataIndex, dataType) {\n    var params = DataFormatMixin.prototype.getDataParams.call(this, dataIndex, dataType);\n    var hostSeries = this.__hostSeries;\n    if (hostSeries) {\n      params.seriesId = hostSeries.id;\n      params.seriesName = hostSeries.name;\n      params.seriesType = hostSeries.subType;\n    }\n    return params;\n  };\n  MarkerModel.getMarkerModelFromSeries = function (seriesModel,\n  // Support three types of markers. Strict check.\n  componentType) {\n    return inner(seriesModel)[componentType];\n  };\n  MarkerModel.type = 'marker';\n  MarkerModel.dependencies = ['series', 'grid', 'polar', 'geo'];\n  return MarkerModel;\n}(ComponentModel);\nzrUtil.mixin(MarkerModel, DataFormatMixin.prototype);\nexport default MarkerModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport MarkerModel from './MarkerModel.js';\nvar MarkPointModel = /** @class */function (_super) {\n  __extends(MarkPointModel, _super);\n  function MarkPointModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkPointModel.type;\n    return _this;\n  }\n  MarkPointModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) {\n    return new MarkPointModel(markerOpt, masterMarkerModel, ecModel);\n  };\n  MarkPointModel.type = 'markPoint';\n  MarkPointModel.defaultOption = {\n    // zlevel: 0,\n    z: 5,\n    symbol: 'pin',\n    symbolSize: 50,\n    // symbolRotate: 0,\n    // symbolOffset: [0, 0]\n    tooltip: {\n      trigger: 'item'\n    },\n    label: {\n      show: true,\n      position: 'inside'\n    },\n    itemStyle: {\n      borderWidth: 2\n    },\n    emphasis: {\n      label: {\n        show: true\n      }\n    }\n  };\n  return MarkPointModel;\n}(MarkerModel);\nexport default MarkPointModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as numberUtil from '../../util/number.js';\nimport { isDimensionStacked } from '../../data/helper/dataStackHelper.js';\nimport { indexOf, curry, clone, isArray } from 'zrender/lib/core/util.js';\nimport { parseDataValue } from '../../data/helper/dataValueHelper.js';\nfunction hasXOrY(item) {\n  return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y)));\n}\nfunction hasXAndY(item) {\n  return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y));\n}\nfunction markerTypeCalculatorWithExtent(markerType, data, axisDim, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) {\n  var coordArr = [];\n  var stacked = isDimensionStacked(data, targetDataDim /* , otherDataDim */);\n  var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim;\n  var value = numCalculate(data, calcDataDim, markerType);\n  var seriesModel = data.hostModel;\n  var dataIndex = seriesModel.indicesOfNearest(axisDim, calcDataDim, value)[0];\n  coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex);\n  coordArr[targetCoordIndex] = data.get(calcDataDim, dataIndex);\n  var coordArrValue = data.get(targetDataDim, dataIndex);\n  // Make it simple, do not visit all stacked value to count precision.\n  var precision = numberUtil.getPrecision(data.get(targetDataDim, dataIndex));\n  precision = Math.min(precision, 20);\n  if (precision >= 0) {\n    coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision);\n  }\n  return [coordArr, coordArrValue];\n}\n// TODO Specified percent\nvar markerTypeCalculator = {\n  min: curry(markerTypeCalculatorWithExtent, 'min'),\n  max: curry(markerTypeCalculatorWithExtent, 'max'),\n  average: curry(markerTypeCalculatorWithExtent, 'average'),\n  median: curry(markerTypeCalculatorWithExtent, 'median')\n};\n/**\n * Transform markPoint data item to format used in List by do the following\n * 1. Calculate statistic like `max`, `min`, `average`\n * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array\n */\nexport function dataTransform(seriesModel, item) {\n  if (!item) {\n    return;\n  }\n  var data = seriesModel.getData();\n  var coordSys = seriesModel.coordinateSystem;\n  var dims = coordSys && coordSys.dimensions;\n  // 1. If not specify the position with pixel directly\n  // 2. If `coord` is not a data array. Which uses `xAxis`,\n  // `yAxis` to specify the coord on each dimension\n  // parseFloat first because item.x and item.y can be percent string like '20%'\n  if (!hasXAndY(item) && !isArray(item.coord) && isArray(dims)) {\n    var axisInfo = getAxisInfo(item, data, coordSys, seriesModel);\n    // Clone the option\n    // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value\n    item = clone(item);\n    if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) {\n      var otherCoordIndex = indexOf(dims, axisInfo.baseAxis.dim);\n      var targetCoordIndex = indexOf(dims, axisInfo.valueAxis.dim);\n      var coordInfo = markerTypeCalculator[item.type](data, axisInfo.valueAxis.dim, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex);\n      item.coord = coordInfo[0];\n      // Force to use the value of calculated value.\n      // let item use the value without stack.\n      item.value = coordInfo[1];\n    } else {\n      // FIXME Only has one of xAxis and yAxis.\n      item.coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis];\n    }\n  }\n  // x y is provided\n  if (item.coord == null || !isArray(dims)) {\n    item.coord = [];\n    var baseAxis = seriesModel.getBaseAxis();\n    if (baseAxis && item.type && markerTypeCalculator[item.type]) {\n      var otherAxis = coordSys.getOtherAxis(baseAxis);\n      if (otherAxis) {\n        item.value = numCalculate(data, data.mapDimension(otherAxis.dim), item.type);\n      }\n    }\n  } else {\n    // Each coord support max, min, average\n    var coord = item.coord;\n    for (var i = 0; i < 2; i++) {\n      if (markerTypeCalculator[coord[i]]) {\n        coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]);\n      }\n    }\n  }\n  return item;\n}\nexport function getAxisInfo(item, data, coordSys, seriesModel) {\n  var ret = {};\n  if (item.valueIndex != null || item.valueDim != null) {\n    ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim;\n    ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim));\n    ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis);\n    ret.baseDataDim = data.mapDimension(ret.baseAxis.dim);\n  } else {\n    ret.baseAxis = seriesModel.getBaseAxis();\n    ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis);\n    ret.baseDataDim = data.mapDimension(ret.baseAxis.dim);\n    ret.valueDataDim = data.mapDimension(ret.valueAxis.dim);\n  }\n  return ret;\n}\nfunction dataDimToCoordDim(seriesModel, dataDim) {\n  var dimItem = seriesModel.getData().getDimensionInfo(dataDim);\n  return dimItem && dimItem.coordDim;\n}\n/**\n * Filter data which is out of coordinateSystem range\n * [dataFilter description]\n */\nexport function dataFilter(\n// Currently only polar and cartesian has containData.\ncoordSys, item) {\n  // Always return true if there is no coordSys\n  return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true;\n}\nexport function zoneFilter(\n// Currently only polar and cartesian has containData.\ncoordSys, item1, item2) {\n  // Always return true if there is no coordSys\n  return coordSys && coordSys.containZone && item1.coord && item2.coord && !hasXOrY(item1) && !hasXOrY(item2) ? coordSys.containZone(item1.coord, item2.coord) : true;\n}\nexport function createMarkerDimValueGetter(inCoordSys, dims) {\n  return inCoordSys ? function (item, dimName, dataIndex, dimIndex) {\n    var rawVal = dimIndex < 2\n    // x, y, radius, angle\n    ? item.coord && item.coord[dimIndex] : item.value;\n    return parseDataValue(rawVal, dims[dimIndex]);\n  } : function (item, dimName, dataIndex, dimIndex) {\n    return parseDataValue(item.value, dims[dimIndex]);\n  };\n}\nexport function numCalculate(data, valueDataDim, type) {\n  if (type === 'average') {\n    var sum_1 = 0;\n    var count_1 = 0;\n    data.each(valueDataDim, function (val, idx) {\n      if (!isNaN(val)) {\n        sum_1 += val;\n        count_1++;\n      }\n    });\n    return sum_1 / count_1;\n  } else if (type === 'median') {\n    return data.getMedian(valueDataDim);\n  } else {\n    // max & min\n    return data.getDataExtent(valueDataDim)[type === 'max' ? 1 : 0];\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nimport { createHashMap, each } from 'zrender/lib/core/util.js';\nimport MarkerModel from './MarkerModel.js';\nimport { makeInner } from '../../util/model.js';\nimport { enterBlur, leaveBlur } from '../../util/states.js';\nimport { traverseUpdateZ, retrieveZInfo } from '../../util/graphic.js';\nvar inner = makeInner();\nvar MarkerView = /** @class */function (_super) {\n  __extends(MarkerView, _super);\n  function MarkerView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkerView.type;\n    return _this;\n  }\n  MarkerView.prototype.init = function () {\n    this.markerGroupMap = createHashMap();\n  };\n  MarkerView.prototype.render = function (markerModel, ecModel, api) {\n    var _this = this;\n    var markerGroupMap = this.markerGroupMap;\n    markerGroupMap.each(function (item) {\n      inner(item).keep = false;\n    });\n    ecModel.eachSeries(function (seriesModel) {\n      var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type);\n      markerModel && _this.renderSeries(seriesModel, markerModel, ecModel, api);\n    });\n    markerGroupMap.each(function (item) {\n      !inner(item).keep && _this.group.remove(item.group);\n    });\n    updateZ(ecModel, markerGroupMap, this.type);\n  };\n  MarkerView.prototype.markKeep = function (drawGroup) {\n    inner(drawGroup).keep = true;\n  };\n  MarkerView.prototype.toggleBlurSeries = function (seriesModelList, isBlur) {\n    var _this = this;\n    each(seriesModelList, function (seriesModel) {\n      var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, _this.type);\n      if (markerModel) {\n        var data = markerModel.getData();\n        data.eachItemGraphicEl(function (el) {\n          if (el) {\n            isBlur ? enterBlur(el) : leaveBlur(el);\n          }\n        });\n      }\n    });\n  };\n  MarkerView.type = 'marker';\n  return MarkerView;\n}(ComponentView);\nfunction updateZ(ecModel, markerGroupMap, type) {\n  ecModel.eachSeries(function (seriesModel) {\n    var markerModel = MarkerModel.getMarkerModelFromSeries(seriesModel, type);\n    var markerDraw = markerGroupMap.get(seriesModel.id);\n    if (markerModel && markerDraw && markerDraw.group) {\n      var _a = retrieveZInfo(markerModel),\n        z = _a.z,\n        zlevel = _a.zlevel;\n      traverseUpdateZ(markerDraw.group, z, zlevel);\n    }\n  });\n}\nexport default MarkerView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SymbolDraw from '../../chart/helper/SymbolDraw.js';\nimport * as numberUtil from '../../util/number.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport * as markerHelper from './markerHelper.js';\nimport MarkerView from './MarkerView.js';\nimport MarkerModel from './MarkerModel.js';\nimport { isFunction, map, filter, curry, extend, retrieve2 } from 'zrender/lib/core/util.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { getVisualFromData } from '../../visual/helper.js';\nfunction updateMarkerLayout(mpData, seriesModel, api) {\n  var coordSys = seriesModel.coordinateSystem;\n  var apiWidth = api.getWidth();\n  var apiHeight = api.getHeight();\n  var coordRect = coordSys && coordSys.getArea && coordSys.getArea();\n  mpData.each(function (idx) {\n    var itemModel = mpData.getItemModel(idx);\n    var isRelativeToCoordinate = itemModel.get('relativeTo') === 'coordinate';\n    var width = isRelativeToCoordinate ? coordRect ? coordRect.width : 0 : apiWidth;\n    var height = isRelativeToCoordinate ? coordRect ? coordRect.height : 0 : apiHeight;\n    var left = isRelativeToCoordinate && coordRect ? coordRect.x : 0;\n    var top = isRelativeToCoordinate && coordRect ? coordRect.y : 0;\n    var point;\n    var xPx = numberUtil.parsePercent(itemModel.get('x'), width) + left;\n    var yPx = numberUtil.parsePercent(itemModel.get('y'), height) + top;\n    if (!isNaN(xPx) && !isNaN(yPx)) {\n      point = [xPx, yPx];\n    }\n    // Chart like bar may have there own marker positioning logic\n    else if (seriesModel.getMarkerPosition) {\n      // Use the getMarkerPosition\n      point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx));\n    } else if (coordSys) {\n      var x = mpData.get(coordSys.dimensions[0], idx);\n      var y = mpData.get(coordSys.dimensions[1], idx);\n      point = coordSys.dataToPoint([x, y]);\n    }\n    // Use x, y if has any\n    if (!isNaN(xPx)) {\n      point[0] = xPx;\n    }\n    if (!isNaN(yPx)) {\n      point[1] = yPx;\n    }\n    mpData.setItemLayout(idx, point);\n  });\n}\nvar MarkPointView = /** @class */function (_super) {\n  __extends(MarkPointView, _super);\n  function MarkPointView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkPointView.type;\n    return _this;\n  }\n  MarkPointView.prototype.updateTransform = function (markPointModel, ecModel, api) {\n    ecModel.eachSeries(function (seriesModel) {\n      var mpModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markPoint');\n      if (mpModel) {\n        updateMarkerLayout(mpModel.getData(), seriesModel, api);\n        this.markerGroupMap.get(seriesModel.id).updateLayout();\n      }\n    }, this);\n  };\n  MarkPointView.prototype.renderSeries = function (seriesModel, mpModel, ecModel, api) {\n    var coordSys = seriesModel.coordinateSystem;\n    var seriesId = seriesModel.id;\n    var seriesData = seriesModel.getData();\n    var symbolDrawMap = this.markerGroupMap;\n    var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw());\n    var mpData = createData(coordSys, seriesModel, mpModel);\n    // FIXME\n    mpModel.setData(mpData);\n    updateMarkerLayout(mpModel.getData(), seriesModel, api);\n    mpData.each(function (idx) {\n      var itemModel = mpData.getItemModel(idx);\n      var symbol = itemModel.getShallow('symbol');\n      var symbolSize = itemModel.getShallow('symbolSize');\n      var symbolRotate = itemModel.getShallow('symbolRotate');\n      var symbolOffset = itemModel.getShallow('symbolOffset');\n      var symbolKeepAspect = itemModel.getShallow('symbolKeepAspect');\n      // TODO: refactor needed: single data item should not support callback function\n      if (isFunction(symbol) || isFunction(symbolSize) || isFunction(symbolRotate) || isFunction(symbolOffset)) {\n        var rawIdx = mpModel.getRawValue(idx);\n        var dataParams = mpModel.getDataParams(idx);\n        if (isFunction(symbol)) {\n          symbol = symbol(rawIdx, dataParams);\n        }\n        if (isFunction(symbolSize)) {\n          // FIXME \u8FD9\u91CC\u4E0D\u517C\u5BB9 ECharts 2.x\uFF0C2.x \u8C8C\u4F3C\u53C2\u6570\u662F\u6574\u4E2A\u6570\u636E\uFF1F\n          symbolSize = symbolSize(rawIdx, dataParams);\n        }\n        if (isFunction(symbolRotate)) {\n          symbolRotate = symbolRotate(rawIdx, dataParams);\n        }\n        if (isFunction(symbolOffset)) {\n          symbolOffset = symbolOffset(rawIdx, dataParams);\n        }\n      }\n      var style = itemModel.getModel('itemStyle').getItemStyle();\n      var z2 = itemModel.get('z2');\n      var color = getVisualFromData(seriesData, 'color');\n      if (!style.fill) {\n        style.fill = color;\n      }\n      mpData.setItemVisual(idx, {\n        z2: retrieve2(z2, 0),\n        symbol: symbol,\n        symbolSize: symbolSize,\n        symbolRotate: symbolRotate,\n        symbolOffset: symbolOffset,\n        symbolKeepAspect: symbolKeepAspect,\n        style: style\n      });\n    });\n    // TODO Text are wrong\n    symbolDraw.updateData(mpData);\n    this.group.add(symbolDraw.group);\n    // Set host model for tooltip\n    // FIXME\n    mpData.eachItemGraphicEl(function (el) {\n      el.traverse(function (child) {\n        getECData(child).dataModel = mpModel;\n      });\n    });\n    this.markKeep(symbolDraw);\n    symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');\n  };\n  MarkPointView.type = 'markPoint';\n  return MarkPointView;\n}(MarkerView);\nfunction createData(coordSys, seriesModel, mpModel) {\n  var coordDimsInfos;\n  if (coordSys) {\n    coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {\n      var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {};\n      // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n      return extend(extend({}, info), {\n        name: coordDim,\n        // DON'T use ordinalMeta to parse and collect ordinal.\n        ordinalMeta: null\n      });\n    });\n  } else {\n    coordDimsInfos = [{\n      name: 'value',\n      type: 'float'\n    }];\n  }\n  var mpData = new SeriesData(coordDimsInfos, mpModel);\n  var dataOpt = map(mpModel.get('data'), curry(markerHelper.dataTransform, seriesModel));\n  if (coordSys) {\n    dataOpt = filter(dataOpt, curry(markerHelper.dataFilter, coordSys));\n  }\n  var dimValueGetter = markerHelper.createMarkerDimValueGetter(!!coordSys, coordDimsInfos);\n  mpData.initData(dataOpt, null, dimValueGetter);\n  return mpData;\n}\nexport default MarkPointView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nimport checkMarkerInSeries from './checkMarkerInSeries.js';\nimport MarkPointModel from './MarkPointModel.js';\nimport MarkPointView from './MarkPointView.js';\nexport function install(registers) {\n  registers.registerComponentModel(MarkPointModel);\n  registers.registerComponentView(MarkPointView);\n  registers.registerPreprocessor(function (opt) {\n    if (checkMarkerInSeries(opt.series, 'markPoint')) {\n      // Make sure markPoint component is enabled\n      opt.markPoint = opt.markPoint || {};\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport MarkerModel from './MarkerModel.js';\nvar MarkLineModel = /** @class */function (_super) {\n  __extends(MarkLineModel, _super);\n  function MarkLineModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkLineModel.type;\n    return _this;\n  }\n  MarkLineModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) {\n    return new MarkLineModel(markerOpt, masterMarkerModel, ecModel);\n  };\n  MarkLineModel.type = 'markLine';\n  MarkLineModel.defaultOption = {\n    // zlevel: 0,\n    z: 5,\n    symbol: ['circle', 'arrow'],\n    symbolSize: [8, 16],\n    // symbolRotate: 0,\n    symbolOffset: 0,\n    precision: 2,\n    tooltip: {\n      trigger: 'item'\n    },\n    label: {\n      show: true,\n      position: 'end',\n      distance: 5\n    },\n    lineStyle: {\n      type: 'dashed'\n    },\n    emphasis: {\n      label: {\n        show: true\n      },\n      lineStyle: {\n        width: 3\n      }\n    },\n    animationEasing: 'linear'\n  };\n  return MarkLineModel;\n}(MarkerModel);\nexport default MarkLineModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport SeriesData from '../../data/SeriesData.js';\nimport * as numberUtil from '../../util/number.js';\nimport * as markerHelper from './markerHelper.js';\nimport LineDraw from '../../chart/helper/LineDraw.js';\nimport MarkerView from './MarkerView.js';\nimport { getStackedDimension } from '../../data/helper/dataStackHelper.js';\nimport { isCoordinateSystemType } from '../../coord/CoordinateSystem.js';\nimport { getECData } from '../../util/innerStore.js';\nimport MarkerModel from './MarkerModel.js';\nimport { isArray, retrieve, retrieve2, clone, extend, logError, merge, map, curry, filter, isNumber } from 'zrender/lib/core/util.js';\nimport { makeInner } from '../../util/model.js';\nimport { getVisualFromData } from '../../visual/helper.js';\nvar inner = makeInner();\nvar markLineTransform = function (seriesModel, coordSys, mlModel, item) {\n  var data = seriesModel.getData();\n  var itemArray;\n  if (!isArray(item)) {\n    // Special type markLine like 'min', 'max', 'average', 'median'\n    var mlType = item.type;\n    if (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median'\n    // In case\n    // data: [{\n    //   yAxis: 10\n    // }]\n    || item.xAxis != null || item.yAxis != null) {\n      var valueAxis = void 0;\n      var value = void 0;\n      if (item.yAxis != null || item.xAxis != null) {\n        valueAxis = coordSys.getAxis(item.yAxis != null ? 'y' : 'x');\n        value = retrieve(item.yAxis, item.xAxis);\n      } else {\n        var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel);\n        valueAxis = axisInfo.valueAxis;\n        var valueDataDim = getStackedDimension(data, axisInfo.valueDataDim);\n        value = markerHelper.numCalculate(data, valueDataDim, mlType);\n      }\n      var valueIndex = valueAxis.dim === 'x' ? 0 : 1;\n      var baseIndex = 1 - valueIndex;\n      // Normized to 2d data with start and end point\n      var mlFrom = clone(item);\n      var mlTo = {\n        coord: []\n      };\n      mlFrom.type = null;\n      mlFrom.coord = [];\n      mlFrom.coord[baseIndex] = -Infinity;\n      mlTo.coord[baseIndex] = Infinity;\n      var precision = mlModel.get('precision');\n      if (precision >= 0 && isNumber(value)) {\n        value = +value.toFixed(Math.min(precision, 20));\n      }\n      mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value;\n      itemArray = [mlFrom, mlTo, {\n        type: mlType,\n        valueIndex: item.valueIndex,\n        // Force to use the value of calculated value.\n        value: value\n      }];\n    } else {\n      // Invalid data\n      if (process.env.NODE_ENV !== 'production') {\n        logError('Invalid markLine data.');\n      }\n      itemArray = [];\n    }\n  } else {\n    itemArray = item;\n  }\n  var normalizedItem = [markerHelper.dataTransform(seriesModel, itemArray[0]), markerHelper.dataTransform(seriesModel, itemArray[1]), extend({}, itemArray[2])];\n  // Avoid line data type is extended by from(to) data type\n  normalizedItem[2].type = normalizedItem[2].type || null;\n  // Merge from option and to option into line option\n  merge(normalizedItem[2], normalizedItem[0]);\n  merge(normalizedItem[2], normalizedItem[1]);\n  return normalizedItem;\n};\nfunction isInfinity(val) {\n  return !isNaN(val) && !isFinite(val);\n}\n// If a markLine has one dim\nfunction ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n  var otherDimIndex = 1 - dimIndex;\n  var dimName = coordSys.dimensions[dimIndex];\n  return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]);\n}\nfunction markLineFilter(coordSys, item) {\n  if (coordSys.type === 'cartesian2d') {\n    var fromCoord = item[0].coord;\n    var toCoord = item[1].coord;\n    // In case\n    // {\n    //  markLine: {\n    //    data: [{ yAxis: 2 }]\n    //  }\n    // }\n    if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) {\n      return true;\n    }\n  }\n  return markerHelper.dataFilter(coordSys, item[0]) && markerHelper.dataFilter(coordSys, item[1]);\n}\nfunction updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) {\n  var coordSys = seriesModel.coordinateSystem;\n  var itemModel = data.getItemModel(idx);\n  var point;\n  var xPx = numberUtil.parsePercent(itemModel.get('x'), api.getWidth());\n  var yPx = numberUtil.parsePercent(itemModel.get('y'), api.getHeight());\n  if (!isNaN(xPx) && !isNaN(yPx)) {\n    point = [xPx, yPx];\n  } else {\n    // Chart like bar may have there own marker positioning logic\n    if (seriesModel.getMarkerPosition) {\n      // Use the getMarkerPosition\n      point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx));\n    } else {\n      var dims = coordSys.dimensions;\n      var x = data.get(dims[0], idx);\n      var y = data.get(dims[1], idx);\n      point = coordSys.dataToPoint([x, y]);\n    }\n    // Expand line to the edge of grid if value on one axis is Inifnity\n    // In case\n    //  markLine: {\n    //    data: [{\n    //      yAxis: 2\n    //      // or\n    //      type: 'average'\n    //    }]\n    //  }\n    if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n      // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug\n      var xAxis = coordSys.getAxis('x');\n      var yAxis = coordSys.getAxis('y');\n      var dims = coordSys.dimensions;\n      if (isInfinity(data.get(dims[0], idx))) {\n        point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]);\n      } else if (isInfinity(data.get(dims[1], idx))) {\n        point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]);\n      }\n    }\n    // Use x, y if has any\n    if (!isNaN(xPx)) {\n      point[0] = xPx;\n    }\n    if (!isNaN(yPx)) {\n      point[1] = yPx;\n    }\n  }\n  data.setItemLayout(idx, point);\n}\nvar MarkLineView = /** @class */function (_super) {\n  __extends(MarkLineView, _super);\n  function MarkLineView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkLineView.type;\n    return _this;\n  }\n  MarkLineView.prototype.updateTransform = function (markLineModel, ecModel, api) {\n    ecModel.eachSeries(function (seriesModel) {\n      var mlModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markLine');\n      if (mlModel) {\n        var mlData_1 = mlModel.getData();\n        var fromData_1 = inner(mlModel).from;\n        var toData_1 = inner(mlModel).to;\n        // Update visual and layout of from symbol and to symbol\n        fromData_1.each(function (idx) {\n          updateSingleMarkerEndLayout(fromData_1, idx, true, seriesModel, api);\n          updateSingleMarkerEndLayout(toData_1, idx, false, seriesModel, api);\n        });\n        // Update layout of line\n        mlData_1.each(function (idx) {\n          mlData_1.setItemLayout(idx, [fromData_1.getItemLayout(idx), toData_1.getItemLayout(idx)]);\n        });\n        this.markerGroupMap.get(seriesModel.id).updateLayout();\n      }\n    }, this);\n  };\n  MarkLineView.prototype.renderSeries = function (seriesModel, mlModel, ecModel, api) {\n    var coordSys = seriesModel.coordinateSystem;\n    var seriesId = seriesModel.id;\n    var seriesData = seriesModel.getData();\n    var lineDrawMap = this.markerGroupMap;\n    var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw());\n    this.group.add(lineDraw.group);\n    var mlData = createList(coordSys, seriesModel, mlModel);\n    var fromData = mlData.from;\n    var toData = mlData.to;\n    var lineData = mlData.line;\n    inner(mlModel).from = fromData;\n    inner(mlModel).to = toData;\n    // Line data for tooltip and formatter\n    mlModel.setData(lineData);\n    // TODO\n    // Functionally, `symbolSize` & `symbolOffset` can also be 2D array now.\n    // But the related logic and type definition are not finished yet.\n    // Finish it if required\n    var symbolType = mlModel.get('symbol');\n    var symbolSize = mlModel.get('symbolSize');\n    var symbolRotate = mlModel.get('symbolRotate');\n    var symbolOffset = mlModel.get('symbolOffset');\n    // TODO: support callback function like markPoint\n    if (!isArray(symbolType)) {\n      symbolType = [symbolType, symbolType];\n    }\n    if (!isArray(symbolSize)) {\n      symbolSize = [symbolSize, symbolSize];\n    }\n    if (!isArray(symbolRotate)) {\n      symbolRotate = [symbolRotate, symbolRotate];\n    }\n    if (!isArray(symbolOffset)) {\n      symbolOffset = [symbolOffset, symbolOffset];\n    }\n    // Update visual and layout of from symbol and to symbol\n    mlData.from.each(function (idx) {\n      updateDataVisualAndLayout(fromData, idx, true);\n      updateDataVisualAndLayout(toData, idx, false);\n    });\n    // Update visual and layout of line\n    lineData.each(function (idx) {\n      var itemModel = lineData.getItemModel(idx);\n      var lineStyle = itemModel.getModel('lineStyle').getLineStyle();\n      // lineData.setItemVisual(idx, {\n      //     color: lineColor || fromData.getItemVisual(idx, 'color')\n      // });\n      lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]);\n      var z2 = itemModel.get('z2');\n      if (lineStyle.stroke == null) {\n        lineStyle.stroke = fromData.getItemVisual(idx, 'style').fill;\n      }\n      lineData.setItemVisual(idx, {\n        z2: retrieve2(z2, 0),\n        fromSymbolKeepAspect: fromData.getItemVisual(idx, 'symbolKeepAspect'),\n        fromSymbolOffset: fromData.getItemVisual(idx, 'symbolOffset'),\n        fromSymbolRotate: fromData.getItemVisual(idx, 'symbolRotate'),\n        fromSymbolSize: fromData.getItemVisual(idx, 'symbolSize'),\n        fromSymbol: fromData.getItemVisual(idx, 'symbol'),\n        toSymbolKeepAspect: toData.getItemVisual(idx, 'symbolKeepAspect'),\n        toSymbolOffset: toData.getItemVisual(idx, 'symbolOffset'),\n        toSymbolRotate: toData.getItemVisual(idx, 'symbolRotate'),\n        toSymbolSize: toData.getItemVisual(idx, 'symbolSize'),\n        toSymbol: toData.getItemVisual(idx, 'symbol'),\n        style: lineStyle\n      });\n    });\n    lineDraw.updateData(lineData);\n    // Set host model for tooltip\n    // FIXME\n    mlData.line.eachItemGraphicEl(function (el) {\n      getECData(el).dataModel = mlModel;\n      el.traverse(function (child) {\n        getECData(child).dataModel = mlModel;\n      });\n    });\n    function updateDataVisualAndLayout(data, idx, isFrom) {\n      var itemModel = data.getItemModel(idx);\n      updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api);\n      var style = itemModel.getModel('itemStyle').getItemStyle();\n      if (style.fill == null) {\n        style.fill = getVisualFromData(seriesData, 'color');\n      }\n      data.setItemVisual(idx, {\n        symbolKeepAspect: itemModel.get('symbolKeepAspect'),\n        // `0` should be considered as a valid value, so use `retrieve2` instead of `||`\n        symbolOffset: retrieve2(itemModel.get('symbolOffset', true), symbolOffset[isFrom ? 0 : 1]),\n        symbolRotate: retrieve2(itemModel.get('symbolRotate', true), symbolRotate[isFrom ? 0 : 1]),\n        // TODO: when 2d array is supported, it should ignore parent\n        symbolSize: retrieve2(itemModel.get('symbolSize'), symbolSize[isFrom ? 0 : 1]),\n        symbol: retrieve2(itemModel.get('symbol', true), symbolType[isFrom ? 0 : 1]),\n        style: style\n      });\n    }\n    this.markKeep(lineDraw);\n    lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent');\n  };\n  MarkLineView.type = 'markLine';\n  return MarkLineView;\n}(MarkerView);\nfunction createList(coordSys, seriesModel, mlModel) {\n  var coordDimsInfos;\n  if (coordSys) {\n    coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {\n      var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {};\n      // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n      return extend(extend({}, info), {\n        name: coordDim,\n        // DON'T use ordinalMeta to parse and collect ordinal.\n        ordinalMeta: null\n      });\n    });\n  } else {\n    coordDimsInfos = [{\n      name: 'value',\n      type: 'float'\n    }];\n  }\n  var fromData = new SeriesData(coordDimsInfos, mlModel);\n  var toData = new SeriesData(coordDimsInfos, mlModel);\n  // No dimensions\n  var lineData = new SeriesData([], mlModel);\n  var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel));\n  if (coordSys) {\n    optData = filter(optData, curry(markLineFilter, coordSys));\n  }\n  var dimValueGetter = markerHelper.createMarkerDimValueGetter(!!coordSys, coordDimsInfos);\n  fromData.initData(map(optData, function (item) {\n    return item[0];\n  }), null, dimValueGetter);\n  toData.initData(map(optData, function (item) {\n    return item[1];\n  }), null, dimValueGetter);\n  lineData.initData(map(optData, function (item) {\n    return item[2];\n  }));\n  lineData.hasItemOption = true;\n  return {\n    from: fromData,\n    to: toData,\n    line: lineData\n  };\n}\nexport default MarkLineView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\nimport checkMarkerInSeries from './checkMarkerInSeries.js';\nimport MarkLineModel from './MarkLineModel.js';\nimport MarkLineView from './MarkLineView.js';\nexport function install(registers) {\n  registers.registerComponentModel(MarkLineModel);\n  registers.registerComponentView(MarkLineView);\n  registers.registerPreprocessor(function (opt) {\n    if (checkMarkerInSeries(opt.series, 'markLine')) {\n      // Make sure markLine component is enabled\n      opt.markLine = opt.markLine || {};\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport MarkerModel from './MarkerModel.js';\nvar MarkAreaModel = /** @class */function (_super) {\n  __extends(MarkAreaModel, _super);\n  function MarkAreaModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkAreaModel.type;\n    return _this;\n  }\n  MarkAreaModel.prototype.createMarkerModelFromSeries = function (markerOpt, masterMarkerModel, ecModel) {\n    return new MarkAreaModel(markerOpt, masterMarkerModel, ecModel);\n  };\n  MarkAreaModel.type = 'markArea';\n  MarkAreaModel.defaultOption = {\n    // zlevel: 0,\n    // PENDING\n    z: 1,\n    tooltip: {\n      trigger: 'item'\n    },\n    // markArea should fixed on the coordinate system\n    animation: false,\n    label: {\n      show: true,\n      position: 'top'\n    },\n    itemStyle: {\n      // color and borderColor default to use color from series\n      // color: 'auto'\n      // borderColor: 'auto'\n      borderWidth: 0\n    },\n    emphasis: {\n      label: {\n        show: true,\n        position: 'top'\n      }\n    }\n  };\n  return MarkAreaModel;\n}(MarkerModel);\nexport default MarkAreaModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n// TODO Optimize on polar\nimport * as colorUtil from 'zrender/lib/tool/color.js';\nimport SeriesData from '../../data/SeriesData.js';\nimport * as numberUtil from '../../util/number.js';\nimport * as graphic from '../../util/graphic.js';\nimport { toggleHoverEmphasis, setStatesStylesFromModel } from '../../util/states.js';\nimport * as markerHelper from './markerHelper.js';\nimport MarkerView from './MarkerView.js';\nimport { retrieve, mergeAll, map, curry, filter, extend, isString, retrieve2 } from 'zrender/lib/core/util.js';\nimport { isCoordinateSystemType } from '../../coord/CoordinateSystem.js';\nimport MarkerModel from './MarkerModel.js';\nimport { makeInner } from '../../util/model.js';\nimport { getVisualFromData } from '../../visual/helper.js';\nimport { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { parseDataValue } from '../../data/helper/dataValueHelper.js';\nimport tokens from '../../visual/tokens.js';\nvar inner = makeInner();\nvar markAreaTransform = function (seriesModel, coordSys, maModel, item) {\n  // item may be null\n  var item0 = item[0];\n  var item1 = item[1];\n  if (!item0 || !item1) {\n    return;\n  }\n  var lt = markerHelper.dataTransform(seriesModel, item0);\n  var rb = markerHelper.dataTransform(seriesModel, item1);\n  // FIXME make sure lt is less than rb\n  var ltCoord = lt.coord;\n  var rbCoord = rb.coord;\n  ltCoord[0] = retrieve(ltCoord[0], -Infinity);\n  ltCoord[1] = retrieve(ltCoord[1], -Infinity);\n  rbCoord[0] = retrieve(rbCoord[0], Infinity);\n  rbCoord[1] = retrieve(rbCoord[1], Infinity);\n  // Merge option into one\n  var result = mergeAll([{}, lt, rb]);\n  result.coord = [lt.coord, rb.coord];\n  result.x0 = lt.x;\n  result.y0 = lt.y;\n  result.x1 = rb.x;\n  result.y1 = rb.y;\n  return result;\n};\nfunction isInfinity(val) {\n  return !isNaN(val) && !isFinite(val);\n}\n// If a markArea has one dim\nfunction ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {\n  var otherDimIndex = 1 - dimIndex;\n  return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]);\n}\nfunction markAreaFilter(coordSys, item) {\n  var fromCoord = item.coord[0];\n  var toCoord = item.coord[1];\n  var item0 = {\n    coord: fromCoord,\n    x: item.x0,\n    y: item.y0\n  };\n  var item1 = {\n    coord: toCoord,\n    x: item.x1,\n    y: item.y1\n  };\n  if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n    // In case\n    // {\n    //  markArea: {\n    //    data: [{ yAxis: 2 }]\n    //  }\n    // }\n    if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord, coordSys))) {\n      return true;\n    }\n    // Directly returning true may also do the work,\n    // because markArea will not be shown automatically\n    // when it's not included in coordinate system.\n    // But filtering ahead can avoid keeping rendering markArea\n    // when there are too many of them.\n    return markerHelper.zoneFilter(coordSys, item0, item1);\n  }\n  return markerHelper.dataFilter(coordSys, item0) || markerHelper.dataFilter(coordSys, item1);\n}\n// dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0']\nfunction getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) {\n  var coordSys = seriesModel.coordinateSystem;\n  var itemModel = data.getItemModel(idx);\n  var point;\n  var xPx = numberUtil.parsePercent(itemModel.get(dims[0]), api.getWidth());\n  var yPx = numberUtil.parsePercent(itemModel.get(dims[1]), api.getHeight());\n  if (!isNaN(xPx) && !isNaN(yPx)) {\n    point = [xPx, yPx];\n  } else {\n    // Chart like bar may have there own marker positioning logic\n    if (seriesModel.getMarkerPosition) {\n      // Consider the case that user input the right-bottom point first\n      // Pick the larger x and y as 'x1' and 'y1'\n      var pointValue0 = data.getValues(['x0', 'y0'], idx);\n      var pointValue1 = data.getValues(['x1', 'y1'], idx);\n      var clampPointValue0 = coordSys.clampData(pointValue0);\n      var clampPointValue1 = coordSys.clampData(pointValue1);\n      var pointValue = [];\n      if (dims[0] === 'x0') {\n        pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue1[0] : pointValue0[0];\n      } else {\n        pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue0[0] : pointValue1[0];\n      }\n      if (dims[1] === 'y0') {\n        pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue1[1] : pointValue0[1];\n      } else {\n        pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue0[1] : pointValue1[1];\n      }\n      // Use the getMarkerPosition\n      point = seriesModel.getMarkerPosition(pointValue, dims, true);\n    } else {\n      var x = data.get(dims[0], idx);\n      var y = data.get(dims[1], idx);\n      var pt = [x, y];\n      coordSys.clampData && coordSys.clampData(pt, pt);\n      point = coordSys.dataToPoint(pt, true);\n    }\n    if (isCoordinateSystemType(coordSys, 'cartesian2d')) {\n      // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug\n      var xAxis = coordSys.getAxis('x');\n      var yAxis = coordSys.getAxis('y');\n      var x = data.get(dims[0], idx);\n      var y = data.get(dims[1], idx);\n      if (isInfinity(x)) {\n        point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]);\n      } else if (isInfinity(y)) {\n        point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]);\n      }\n    }\n    // Use x, y if has any\n    if (!isNaN(xPx)) {\n      point[0] = xPx;\n    }\n    if (!isNaN(yPx)) {\n      point[1] = yPx;\n    }\n  }\n  return point;\n}\nexport var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];\nvar MarkAreaView = /** @class */function (_super) {\n  __extends(MarkAreaView, _super);\n  function MarkAreaView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = MarkAreaView.type;\n    return _this;\n  }\n  MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) {\n    ecModel.eachSeries(function (seriesModel) {\n      var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea');\n      if (maModel) {\n        var areaData_1 = maModel.getData();\n        areaData_1.each(function (idx) {\n          var points = map(dimPermutations, function (dim) {\n            return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api);\n          });\n          // Layout\n          areaData_1.setItemLayout(idx, points);\n          var el = areaData_1.getItemGraphicEl(idx);\n          el.setShape('points', points);\n        });\n      }\n    }, this);\n  };\n  MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) {\n    var coordSys = seriesModel.coordinateSystem;\n    var seriesId = seriesModel.id;\n    var seriesData = seriesModel.getData();\n    var areaGroupMap = this.markerGroupMap;\n    var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, {\n      group: new graphic.Group()\n    });\n    this.group.add(polygonGroup.group);\n    this.markKeep(polygonGroup);\n    var areaData = createList(coordSys, seriesModel, maModel);\n    // Line data for tooltip and formatter\n    maModel.setData(areaData);\n    // Update visual and layout of line\n    areaData.each(function (idx) {\n      // Layout\n      var points = map(dimPermutations, function (dim) {\n        return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);\n      });\n      var xAxisScale = coordSys.getAxis('x').scale;\n      var yAxisScale = coordSys.getAxis('y').scale;\n      var xAxisExtent = xAxisScale.getExtent();\n      var yAxisExtent = yAxisScale.getExtent();\n      var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))];\n      var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))];\n      numberUtil.asc(xPointExtent);\n      numberUtil.asc(yPointExtent);\n      var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]);\n      // If none of the area is inside coordSys, allClipped is set to be true\n      // in layout so that label will not be displayed. See #12591\n      var allClipped = !overlapped;\n      areaData.setItemLayout(idx, {\n        points: points,\n        allClipped: allClipped\n      });\n      var itemModel = areaData.getItemModel(idx);\n      var style = itemModel.getModel('itemStyle').getItemStyle();\n      var z2 = itemModel.get('z2');\n      var color = getVisualFromData(seriesData, 'color');\n      if (!style.fill) {\n        style.fill = color;\n        if (isString(style.fill)) {\n          style.fill = colorUtil.modifyAlpha(style.fill, 0.4);\n        }\n      }\n      if (!style.stroke) {\n        style.stroke = color;\n      }\n      // Visual\n      areaData.setItemVisual(idx, 'style', style);\n      areaData.setItemVisual(idx, 'z2', retrieve2(z2, 0));\n    });\n    areaData.diff(inner(polygonGroup).data).add(function (idx) {\n      var layout = areaData.getItemLayout(idx);\n      var z2 = areaData.getItemVisual(idx, 'z2');\n      if (!layout.allClipped) {\n        var polygon = new graphic.Polygon({\n          z2: retrieve2(z2, 0),\n          shape: {\n            points: layout.points\n          }\n        });\n        areaData.setItemGraphicEl(idx, polygon);\n        polygonGroup.group.add(polygon);\n      }\n    }).update(function (newIdx, oldIdx) {\n      var polygon = inner(polygonGroup).data.getItemGraphicEl(oldIdx);\n      var layout = areaData.getItemLayout(newIdx);\n      var z2 = areaData.getItemVisual(newIdx, 'z2');\n      if (!layout.allClipped) {\n        if (polygon) {\n          graphic.updateProps(polygon, {\n            z2: retrieve2(z2, 0),\n            shape: {\n              points: layout.points\n            }\n          }, maModel, newIdx);\n        } else {\n          polygon = new graphic.Polygon({\n            shape: {\n              points: layout.points\n            }\n          });\n        }\n        areaData.setItemGraphicEl(newIdx, polygon);\n        polygonGroup.group.add(polygon);\n      } else if (polygon) {\n        polygonGroup.group.remove(polygon);\n      }\n    }).remove(function (idx) {\n      var polygon = inner(polygonGroup).data.getItemGraphicEl(idx);\n      polygonGroup.group.remove(polygon);\n    }).execute();\n    areaData.eachItemGraphicEl(function (polygon, idx) {\n      var itemModel = areaData.getItemModel(idx);\n      var style = areaData.getItemVisual(idx, 'style');\n      polygon.useStyle(areaData.getItemVisual(idx, 'style'));\n      setLabelStyle(polygon, getLabelStatesModels(itemModel), {\n        labelFetcher: maModel,\n        labelDataIndex: idx,\n        defaultText: areaData.getName(idx) || '',\n        inheritColor: isString(style.fill) ? colorUtil.modifyAlpha(style.fill, 1) : tokens.color.neutral99\n      });\n      setStatesStylesFromModel(polygon, itemModel);\n      toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled']));\n      getECData(polygon).dataModel = maModel;\n    });\n    inner(polygonGroup).data = areaData;\n    polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent');\n  };\n  MarkAreaView.type = 'markArea';\n  return MarkAreaView;\n}(MarkerView);\nfunction createList(coordSys, seriesModel, maModel) {\n  var areaData;\n  var dataDims;\n  var dims = ['x0', 'y0', 'x1', 'y1'];\n  if (coordSys) {\n    var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) {\n      var data = seriesModel.getData();\n      var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {};\n      // In map series data don't have lng and lat dimension. Fallback to same with coordSys\n      return extend(extend({}, info), {\n        name: coordDim,\n        // DON'T use ordinalMeta to parse and collect ordinal.\n        ordinalMeta: null\n      });\n    });\n    dataDims = map(dims, function (dim, idx) {\n      return {\n        name: dim,\n        type: coordDimsInfos_1[idx % 2].type\n      };\n    });\n    areaData = new SeriesData(dataDims, maModel);\n  } else {\n    dataDims = [{\n      name: 'value',\n      type: 'float'\n    }];\n    areaData = new SeriesData(dataDims, maModel);\n  }\n  var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel));\n  if (coordSys) {\n    optData = filter(optData, curry(markAreaFilter, coordSys));\n  }\n  var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) {\n    // TODO should convert to ParsedValue?\n    var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2];\n    return parseDataValue(rawVal, dataDims[dimIndex]);\n  } : function (item, dimName, dataIndex, dimIndex) {\n    return parseDataValue(item.value, dataDims[dimIndex]);\n  };\n  areaData.initData(optData, null, dimValueGetter);\n  areaData.hasItemOption = true;\n  return areaData;\n}\nexport default MarkAreaView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport checkMarkerInSeries from './checkMarkerInSeries.js';\nimport MarkAreaModel from './MarkAreaModel.js';\nimport MarkAreaView from './MarkAreaView.js';\nexport function install(registers) {\n  registers.registerComponentModel(MarkAreaModel);\n  registers.registerComponentView(MarkAreaView);\n  registers.registerPreprocessor(function (opt) {\n    if (checkMarkerInSeries(opt.series, 'markArea')) {\n      // Make sure markArea component is enabled\n      opt.markArea = opt.markArea || {};\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport Model from '../../model/Model.js';\nimport { isNameSpecified } from '../../util/model.js';\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar getDefaultSelectorOptions = function (ecModel, type) {\n  if (type === 'all') {\n    return {\n      type: 'all',\n      title: ecModel.getLocaleModel().get(['legend', 'selector', 'all'])\n    };\n  } else if (type === 'inverse') {\n    return {\n      type: 'inverse',\n      title: ecModel.getLocaleModel().get(['legend', 'selector', 'inverse'])\n    };\n  }\n};\nvar LegendModel = /** @class */function (_super) {\n  __extends(LegendModel, _super);\n  function LegendModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = LegendModel.type;\n    _this.layoutMode = {\n      type: 'box',\n      // legend.width/height are maxWidth/maxHeight actually,\n      // whereas real width/height is calculated by its content.\n      // (Setting {left: 10, right: 10} does not make sense).\n      // So consider the case:\n      // `setOption({legend: {left: 10});`\n      // then `setOption({legend: {right: 10});`\n      // The previous `left` should be cleared by setting `ignoreSize`.\n      ignoreSize: true\n    };\n    return _this;\n  }\n  LegendModel.prototype.init = function (option, parentModel, ecModel) {\n    this.mergeDefaultAndTheme(option, ecModel);\n    option.selected = option.selected || {};\n    this._updateSelector(option);\n  };\n  LegendModel.prototype.mergeOption = function (option, ecModel) {\n    _super.prototype.mergeOption.call(this, option, ecModel);\n    this._updateSelector(option);\n  };\n  LegendModel.prototype._updateSelector = function (option) {\n    var selector = option.selector;\n    var ecModel = this.ecModel;\n    if (selector === true) {\n      selector = option.selector = ['all', 'inverse'];\n    }\n    if (zrUtil.isArray(selector)) {\n      zrUtil.each(selector, function (item, index) {\n        zrUtil.isString(item) && (item = {\n          type: item\n        });\n        selector[index] = zrUtil.merge(item, getDefaultSelectorOptions(ecModel, item.type));\n      });\n    }\n  };\n  LegendModel.prototype.optionUpdated = function () {\n    this._updateData(this.ecModel);\n    var legendData = this._data;\n    // If selectedMode is single, try to select one\n    if (legendData[0] && this.get('selectedMode') === 'single') {\n      var hasSelected = false;\n      // If has any selected in option.selected\n      for (var i = 0; i < legendData.length; i++) {\n        var name_1 = legendData[i].get('name');\n        if (this.isSelected(name_1)) {\n          // Force to unselect others\n          this.select(name_1);\n          hasSelected = true;\n          break;\n        }\n      }\n      // Try select the first if selectedMode is single\n      !hasSelected && this.select(legendData[0].get('name'));\n    }\n  };\n  LegendModel.prototype._updateData = function (ecModel) {\n    var potentialData = [];\n    var availableNames = [];\n    ecModel.eachRawSeries(function (seriesModel) {\n      var seriesName = seriesModel.name;\n      availableNames.push(seriesName);\n      var isPotential;\n      if (seriesModel.legendVisualProvider) {\n        var provider = seriesModel.legendVisualProvider;\n        var names = provider.getAllNames();\n        if (!ecModel.isSeriesFiltered(seriesModel)) {\n          availableNames = availableNames.concat(names);\n        }\n        if (names.length) {\n          potentialData = potentialData.concat(names);\n        } else {\n          isPotential = true;\n        }\n      } else {\n        isPotential = true;\n      }\n      if (isPotential && isNameSpecified(seriesModel)) {\n        potentialData.push(seriesModel.name);\n      }\n    });\n    /**\n     * @type {Array.<string>}\n     * @private\n     */\n    this._availableNames = availableNames;\n    // If legend.data is not specified in option, use availableNames as data,\n    // which is convenient for user preparing option.\n    var rawData = this.get('data') || potentialData;\n    var legendNameMap = zrUtil.createHashMap();\n    var legendData = zrUtil.map(rawData, function (dataItem) {\n      // Can be string or number\n      if (zrUtil.isString(dataItem) || zrUtil.isNumber(dataItem)) {\n        dataItem = {\n          name: dataItem\n        };\n      }\n      if (legendNameMap.get(dataItem.name)) {\n        // remove legend name duplicate\n        return null;\n      }\n      legendNameMap.set(dataItem.name, true);\n      return new Model(dataItem, this, this.ecModel);\n    }, this);\n    /**\n     * @type {Array.<module:echarts/model/Model>}\n     * @private\n     */\n    this._data = zrUtil.filter(legendData, function (item) {\n      return !!item;\n    });\n  };\n  LegendModel.prototype.getData = function () {\n    return this._data;\n  };\n  LegendModel.prototype.select = function (name) {\n    var selected = this.option.selected;\n    var selectedMode = this.get('selectedMode');\n    if (selectedMode === 'single') {\n      var data = this._data;\n      zrUtil.each(data, function (dataItem) {\n        selected[dataItem.get('name')] = false;\n      });\n    }\n    selected[name] = true;\n  };\n  LegendModel.prototype.unSelect = function (name) {\n    if (this.get('selectedMode') !== 'single') {\n      this.option.selected[name] = false;\n    }\n  };\n  LegendModel.prototype.toggleSelected = function (name) {\n    var selected = this.option.selected;\n    // Default is true\n    if (!selected.hasOwnProperty(name)) {\n      selected[name] = true;\n    }\n    this[selected[name] ? 'unSelect' : 'select'](name);\n  };\n  LegendModel.prototype.allSelect = function () {\n    var data = this._data;\n    var selected = this.option.selected;\n    zrUtil.each(data, function (dataItem) {\n      selected[dataItem.get('name', true)] = true;\n    });\n  };\n  LegendModel.prototype.inverseSelect = function () {\n    var data = this._data;\n    var selected = this.option.selected;\n    zrUtil.each(data, function (dataItem) {\n      var name = dataItem.get('name', true);\n      // Initially, default value is true\n      if (!selected.hasOwnProperty(name)) {\n        selected[name] = true;\n      }\n      selected[name] = !selected[name];\n    });\n  };\n  LegendModel.prototype.isSelected = function (name) {\n    var selected = this.option.selected;\n    return !(selected.hasOwnProperty(name) && !selected[name]) && zrUtil.indexOf(this._availableNames, name) >= 0;\n  };\n  LegendModel.prototype.getOrient = function () {\n    return this.get('orient') === 'vertical' ? {\n      index: 1,\n      name: 'vertical'\n    } : {\n      index: 0,\n      name: 'horizontal'\n    };\n  };\n  LegendModel.type = 'legend.plain';\n  LegendModel.dependencies = ['series'];\n  LegendModel.defaultOption = {\n    // zlevel: 0,\n    z: 4,\n    show: true,\n    orient: 'horizontal',\n    left: 'center',\n    // right: 'center',\n    // top: 0,\n    bottom: tokens.size.m,\n    align: 'auto',\n    backgroundColor: tokens.color.transparent,\n    borderColor: tokens.color.border,\n    borderRadius: 0,\n    borderWidth: 0,\n    padding: 5,\n    itemGap: 8,\n    itemWidth: 25,\n    itemHeight: 14,\n    symbolRotate: 'inherit',\n    symbolKeepAspect: true,\n    inactiveColor: tokens.color.disabled,\n    inactiveBorderColor: tokens.color.disabled,\n    inactiveBorderWidth: 'auto',\n    itemStyle: {\n      color: 'inherit',\n      opacity: 'inherit',\n      borderColor: 'inherit',\n      borderWidth: 'auto',\n      borderCap: 'inherit',\n      borderJoin: 'inherit',\n      borderDashOffset: 'inherit',\n      borderMiterLimit: 'inherit'\n    },\n    lineStyle: {\n      width: 'auto',\n      color: 'inherit',\n      inactiveColor: tokens.color.disabled,\n      inactiveWidth: 2,\n      opacity: 'inherit',\n      type: 'inherit',\n      cap: 'inherit',\n      join: 'inherit',\n      dashOffset: 'inherit',\n      miterLimit: 'inherit'\n    },\n    textStyle: {\n      color: tokens.color.secondary\n    },\n    selectedMode: true,\n    selector: false,\n    selectorLabel: {\n      show: true,\n      borderRadius: 10,\n      padding: [3, 5, 3, 5],\n      fontSize: 12,\n      fontFamily: 'sans-serif',\n      color: tokens.color.tertiary,\n      borderWidth: 1,\n      borderColor: tokens.color.border\n    },\n    emphasis: {\n      selectorLabel: {\n        show: true,\n        color: tokens.color.quaternary\n      }\n    },\n    selectorPosition: 'auto',\n    selectorItemGap: 7,\n    selectorButtonGap: 10,\n    tooltip: {\n      show: false\n    },\n    triggerEvent: false\n  };\n  return LegendModel;\n}(ComponentModel);\nexport default LegendModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { parse, stringify } from 'zrender/lib/tool/color.js';\nimport * as graphic from '../../util/graphic.js';\nimport { enableHoverEmphasis } from '../../util/states.js';\nimport { setLabelStyle, createTextStyle } from '../../label/labelStyle.js';\nimport { makeBackground } from '../helper/listComponent.js';\nimport * as layoutUtil from '../../util/layout.js';\nimport ComponentView from '../../view/Component.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport { createOrUpdatePatternFromDecal } from '../../util/decal.js';\nimport { getECData } from '../../util/innerStore.js';\nimport tokens from '../../visual/tokens.js';\nvar curry = zrUtil.curry;\nvar each = zrUtil.each;\nvar Group = graphic.Group;\nvar LegendView = /** @class */function (_super) {\n  __extends(LegendView, _super);\n  function LegendView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = LegendView.type;\n    _this.newlineDisabled = false;\n    return _this;\n  }\n  LegendView.prototype.init = function () {\n    this.group.add(this._contentGroup = new Group());\n    this.group.add(this._selectorGroup = new Group());\n    this._isFirstRender = true;\n  };\n  /**\n   * @protected\n   */\n  LegendView.prototype.getContentGroup = function () {\n    return this._contentGroup;\n  };\n  /**\n   * @protected\n   */\n  LegendView.prototype.getSelectorGroup = function () {\n    return this._selectorGroup;\n  };\n  /**\n   * @override\n   */\n  LegendView.prototype.render = function (legendModel, ecModel, api) {\n    var isFirstRender = this._isFirstRender;\n    this._isFirstRender = false;\n    this.resetInner();\n    if (!legendModel.get('show', true)) {\n      return;\n    }\n    var itemAlign = legendModel.get('align');\n    var orient = legendModel.get('orient');\n    if (!itemAlign || itemAlign === 'auto') {\n      itemAlign = legendModel.get('left') === 'right' && orient === 'vertical' ? 'right' : 'left';\n    }\n    // selector has been normalized to an array in model\n    var selector = legendModel.get('selector', true);\n    var selectorPosition = legendModel.get('selectorPosition', true);\n    if (selector && (!selectorPosition || selectorPosition === 'auto')) {\n      selectorPosition = orient === 'horizontal' ? 'end' : 'start';\n    }\n    this.renderInner(itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition);\n    // Perform layout.\n    var refContainer = layoutUtil.createBoxLayoutReference(legendModel, api).refContainer;\n    var positionInfo = legendModel.getBoxLayoutParams();\n    var padding = legendModel.get('padding');\n    var maxSize = layoutUtil.getLayoutRect(positionInfo, refContainer, padding);\n    var mainRect = this.layoutInner(legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition);\n    // Place mainGroup, based on the calculated `mainRect`.\n    var layoutRect = layoutUtil.getLayoutRect(zrUtil.defaults({\n      width: mainRect.width,\n      height: mainRect.height\n    }, positionInfo), refContainer, padding);\n    this.group.x = layoutRect.x - mainRect.x;\n    this.group.y = layoutRect.y - mainRect.y;\n    this.group.markRedraw();\n    // Render background after group is layout.\n    this.group.add(this._backgroundEl = makeBackground(mainRect,\n    // FXIME: most itemStyle options does not work in background because inherit is not handled yet.\n    legendModel));\n  };\n  LegendView.prototype.resetInner = function () {\n    this.getContentGroup().removeAll();\n    this._backgroundEl && this.group.remove(this._backgroundEl);\n    this.getSelectorGroup().removeAll();\n  };\n  LegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) {\n    var contentGroup = this.getContentGroup();\n    var legendDrawnMap = zrUtil.createHashMap();\n    var selectMode = legendModel.get('selectedMode');\n    var triggerEvent = legendModel.get('triggerEvent');\n    var excludeSeriesId = [];\n    ecModel.eachRawSeries(function (seriesModel) {\n      !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id);\n    });\n    each(legendModel.getData(), function (legendItemModel, dataIndex) {\n      var _this = this;\n      var name = legendItemModel.get('name');\n      // Use empty string or \\n as a newline string\n      if (!this.newlineDisabled && (name === '' || name === '\\n')) {\n        var g = new Group();\n        // @ts-ignore\n        g.newline = true;\n        contentGroup.add(g);\n        return;\n      }\n      // Representitive series.\n      var seriesModel = ecModel.getSeriesByName(name)[0];\n      if (legendDrawnMap.get(name)) {\n        // Have been drawn\n        return;\n      }\n      // Legend to control series.\n      if (seriesModel) {\n        var data = seriesModel.getData();\n        var lineVisualStyle = data.getVisual('legendLineStyle') || {};\n        var legendIcon = data.getVisual('legendIcon');\n        /**\n         * `data.getVisual('style')` may be the color from the register\n         * in series. For example, for line series,\n         */\n        var style = data.getVisual('style');\n        var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, style, legendIcon, selectMode, api);\n        itemGroup.on('click', curry(dispatchSelectAction, name, null, api, excludeSeriesId)).on('mouseover', curry(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId));\n        if (ecModel.ssr) {\n          itemGroup.eachChild(function (child) {\n            var ecData = getECData(child);\n            ecData.seriesIndex = seriesModel.seriesIndex;\n            ecData.dataIndex = dataIndex;\n            ecData.ssrType = 'legend';\n          });\n        }\n        if (triggerEvent) {\n          itemGroup.eachChild(function (child) {\n            _this.packEventData(child, legendModel, seriesModel, dataIndex, name);\n          });\n        }\n        legendDrawnMap.set(name, true);\n      } else {\n        // Legend to control data. In pie and funnel.\n        ecModel.eachRawSeries(function (seriesModel) {\n          var _this = this;\n          // In case multiple series has same data name\n          if (legendDrawnMap.get(name)) {\n            return;\n          }\n          if (seriesModel.legendVisualProvider) {\n            var provider = seriesModel.legendVisualProvider;\n            if (!provider.containName(name)) {\n              return;\n            }\n            var idx = provider.indexOfName(name);\n            var style = provider.getItemVisual(idx, 'style');\n            var legendIcon = provider.getItemVisual(idx, 'legendIcon');\n            var colorArr = parse(style.fill);\n            // Color may be set to transparent in visualMap when data is out of range.\n            // Do not show nothing.\n            if (colorArr && colorArr[3] === 0) {\n              colorArr[3] = 0.2;\n              // TODO color is set to 0, 0, 0, 0. Should show correct RGBA\n              style = zrUtil.extend(zrUtil.extend({}, style), {\n                fill: stringify(colorArr, 'rgba')\n              });\n            }\n            var itemGroup = this._createItem(seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, {}, style, legendIcon, selectMode, api);\n            // FIXME: consider different series has items with the same name.\n            itemGroup.on('click', curry(dispatchSelectAction, null, name, api, excludeSeriesId))\n            // Should not specify the series name, consider legend controls\n            // more than one pie series.\n            .on('mouseover', curry(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry(dispatchDownplayAction, null, name, api, excludeSeriesId));\n            if (ecModel.ssr) {\n              itemGroup.eachChild(function (child) {\n                var ecData = getECData(child);\n                ecData.seriesIndex = seriesModel.seriesIndex;\n                ecData.dataIndex = dataIndex;\n                ecData.ssrType = 'legend';\n              });\n            }\n            if (triggerEvent) {\n              itemGroup.eachChild(function (child) {\n                _this.packEventData(child, legendModel, seriesModel, dataIndex, name);\n              });\n            }\n            legendDrawnMap.set(name, true);\n          }\n        }, this);\n      }\n      if (process.env.NODE_ENV !== 'production') {\n        if (!legendDrawnMap.get(name)) {\n          console.warn(name + ' series not exists. Legend data should be same with series name or data name.');\n        }\n      }\n    }, this);\n    if (selector) {\n      this._createSelector(selector, legendModel, api, orient, selectorPosition);\n    }\n  };\n  LegendView.prototype.packEventData = function (el, legendModel, seriesModel, dataIndex, name) {\n    var eventData = {\n      componentType: 'legend',\n      componentIndex: legendModel.componentIndex,\n      dataIndex: dataIndex,\n      value: name,\n      seriesIndex: seriesModel.seriesIndex\n    };\n    getECData(el).eventData = eventData;\n  };\n  ;\n  LegendView.prototype._createSelector = function (selector, legendModel, api, orient, selectorPosition) {\n    var selectorGroup = this.getSelectorGroup();\n    each(selector, function createSelectorButton(selectorItem) {\n      var type = selectorItem.type;\n      var labelText = new graphic.Text({\n        style: {\n          x: 0,\n          y: 0,\n          align: 'center',\n          verticalAlign: 'middle'\n        },\n        onclick: function () {\n          api.dispatchAction({\n            type: type === 'all' ? 'legendAllSelect' : 'legendInverseSelect',\n            legendId: legendModel.id\n          });\n        }\n      });\n      selectorGroup.add(labelText);\n      var labelModel = legendModel.getModel('selectorLabel');\n      var emphasisLabelModel = legendModel.getModel(['emphasis', 'selectorLabel']);\n      setLabelStyle(labelText, {\n        normal: labelModel,\n        emphasis: emphasisLabelModel\n      }, {\n        defaultText: selectorItem.title\n      });\n      enableHoverEmphasis(labelText);\n    });\n  };\n  LegendView.prototype._createItem = function (seriesModel, name, dataIndex, legendItemModel, legendModel, itemAlign, lineVisualStyle, itemVisualStyle, legendIcon, selectMode, api) {\n    var drawType = seriesModel.visualDrawType;\n    var itemWidth = legendModel.get('itemWidth');\n    var itemHeight = legendModel.get('itemHeight');\n    var isSelected = legendModel.isSelected(name);\n    var iconRotate = legendItemModel.get('symbolRotate');\n    var symbolKeepAspect = legendItemModel.get('symbolKeepAspect');\n    var legendIconType = legendItemModel.get('icon');\n    legendIcon = legendIconType || legendIcon || 'roundRect';\n    var style = getLegendStyle(legendIcon, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api);\n    var itemGroup = new Group();\n    var textStyleModel = legendItemModel.getModel('textStyle');\n    if (zrUtil.isFunction(seriesModel.getLegendIcon) && (!legendIconType || legendIconType === 'inherit')) {\n      // Series has specific way to define legend icon\n      itemGroup.add(seriesModel.getLegendIcon({\n        itemWidth: itemWidth,\n        itemHeight: itemHeight,\n        icon: legendIcon,\n        iconRotate: iconRotate,\n        itemStyle: style.itemStyle,\n        lineStyle: style.lineStyle,\n        symbolKeepAspect: symbolKeepAspect\n      }));\n    } else {\n      // Use default legend icon policy for most series\n      var rotate = legendIconType === 'inherit' && seriesModel.getData().getVisual('symbol') ? iconRotate === 'inherit' ? seriesModel.getData().getVisual('symbolRotate') : iconRotate : 0; // No rotation for no icon\n      itemGroup.add(getDefaultLegendIcon({\n        itemWidth: itemWidth,\n        itemHeight: itemHeight,\n        icon: legendIcon,\n        iconRotate: rotate,\n        itemStyle: style.itemStyle,\n        lineStyle: style.lineStyle,\n        symbolKeepAspect: symbolKeepAspect\n      }));\n    }\n    var textX = itemAlign === 'left' ? itemWidth + 5 : -5;\n    var textAlign = itemAlign;\n    var formatter = legendModel.get('formatter');\n    var content = name;\n    if (zrUtil.isString(formatter) && formatter) {\n      content = formatter.replace('{name}', name != null ? name : '');\n    } else if (zrUtil.isFunction(formatter)) {\n      content = formatter(name);\n    }\n    var textColor = isSelected ? textStyleModel.getTextColor() : legendItemModel.get('inactiveColor');\n    itemGroup.add(new graphic.Text({\n      style: createTextStyle(textStyleModel, {\n        text: content,\n        x: textX,\n        y: itemHeight / 2,\n        fill: textColor,\n        align: textAlign,\n        verticalAlign: 'middle'\n      }, {\n        inheritColor: textColor\n      })\n    }));\n    // Add a invisible rect to increase the area of mouse hover\n    var hitRect = new graphic.Rect({\n      shape: itemGroup.getBoundingRect(),\n      style: {\n        // Cannot use 'invisible' because SVG SSR will miss the node\n        fill: 'transparent'\n      }\n    });\n    var tooltipModel = legendItemModel.getModel('tooltip');\n    if (tooltipModel.get('show')) {\n      graphic.setTooltipConfig({\n        el: hitRect,\n        componentModel: legendModel,\n        itemName: name,\n        itemTooltipOption: tooltipModel.option\n      });\n    }\n    itemGroup.add(hitRect);\n    itemGroup.eachChild(function (child) {\n      child.silent = true;\n    });\n    hitRect.silent = !selectMode;\n    this.getContentGroup().add(itemGroup);\n    enableHoverEmphasis(itemGroup);\n    // @ts-ignore\n    itemGroup.__legendDataIndex = dataIndex;\n    return itemGroup;\n  };\n  LegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) {\n    var contentGroup = this.getContentGroup();\n    var selectorGroup = this.getSelectorGroup();\n    // Place items in contentGroup.\n    layoutUtil.box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height);\n    var contentRect = contentGroup.getBoundingRect();\n    var contentPos = [-contentRect.x, -contentRect.y];\n    selectorGroup.markRedraw();\n    contentGroup.markRedraw();\n    if (selector) {\n      // Place buttons in selectorGroup\n      layoutUtil.box(\n      // Buttons in selectorGroup always layout horizontally\n      'horizontal', selectorGroup, legendModel.get('selectorItemGap', true));\n      var selectorRect = selectorGroup.getBoundingRect();\n      var selectorPos = [-selectorRect.x, -selectorRect.y];\n      var selectorButtonGap = legendModel.get('selectorButtonGap', true);\n      var orientIdx = legendModel.getOrient().index;\n      var wh = orientIdx === 0 ? 'width' : 'height';\n      var hw = orientIdx === 0 ? 'height' : 'width';\n      var yx = orientIdx === 0 ? 'y' : 'x';\n      if (selectorPosition === 'end') {\n        selectorPos[orientIdx] += contentRect[wh] + selectorButtonGap;\n      } else {\n        contentPos[orientIdx] += selectorRect[wh] + selectorButtonGap;\n      }\n      // Always align selector to content as 'middle'\n      selectorPos[1 - orientIdx] += contentRect[hw] / 2 - selectorRect[hw] / 2;\n      selectorGroup.x = selectorPos[0];\n      selectorGroup.y = selectorPos[1];\n      contentGroup.x = contentPos[0];\n      contentGroup.y = contentPos[1];\n      var mainRect = {\n        x: 0,\n        y: 0\n      };\n      mainRect[wh] = contentRect[wh] + selectorButtonGap + selectorRect[wh];\n      mainRect[hw] = Math.max(contentRect[hw], selectorRect[hw]);\n      mainRect[yx] = Math.min(0, selectorRect[yx] + selectorPos[1 - orientIdx]);\n      return mainRect;\n    } else {\n      contentGroup.x = contentPos[0];\n      contentGroup.y = contentPos[1];\n      return this.group.getBoundingRect();\n    }\n  };\n  /**\n   * @protected\n   */\n  LegendView.prototype.remove = function () {\n    this.getContentGroup().removeAll();\n    this._isFirstRender = true;\n  };\n  LegendView.type = 'legend.plain';\n  return LegendView;\n}(ComponentView);\nfunction getLegendStyle(iconType, legendItemModel, lineVisualStyle, itemVisualStyle, drawType, isSelected, api) {\n  /**\n   * Use series style if is inherit;\n   * elsewise, use legend style\n   */\n  function handleCommonProps(style, visualStyle) {\n    // If lineStyle.width is 'auto', it is set to be 2 if series has border\n    if (style.lineWidth === 'auto') {\n      style.lineWidth = visualStyle.lineWidth > 0 ? 2 : 0;\n    }\n    each(style, function (propVal, propName) {\n      style[propName] === 'inherit' && (style[propName] = visualStyle[propName]);\n    });\n  }\n  // itemStyle\n  var itemStyleModel = legendItemModel.getModel('itemStyle');\n  var itemStyle = itemStyleModel.getItemStyle();\n  var iconBrushType = iconType.lastIndexOf('empty', 0) === 0 ? 'fill' : 'stroke';\n  var decalStyle = itemStyleModel.getShallow('decal');\n  itemStyle.decal = !decalStyle || decalStyle === 'inherit' ? itemVisualStyle.decal : createOrUpdatePatternFromDecal(decalStyle, api);\n  if (itemStyle.fill === 'inherit') {\n    /**\n     * Series with visualDrawType as 'stroke' should have\n     * series stroke as legend fill\n     */\n    itemStyle.fill = itemVisualStyle[drawType];\n  }\n  if (itemStyle.stroke === 'inherit') {\n    /**\n     * icon type with \"emptyXXX\" should use fill color\n     * in visual style\n     */\n    itemStyle.stroke = itemVisualStyle[iconBrushType];\n  }\n  if (itemStyle.opacity === 'inherit') {\n    /**\n     * Use lineStyle.opacity if drawType is stroke\n     */\n    itemStyle.opacity = (drawType === 'fill' ? itemVisualStyle : lineVisualStyle).opacity;\n  }\n  handleCommonProps(itemStyle, itemVisualStyle);\n  // lineStyle\n  var legendLineModel = legendItemModel.getModel('lineStyle');\n  var lineStyle = legendLineModel.getLineStyle();\n  handleCommonProps(lineStyle, lineVisualStyle);\n  // Fix auto color to real color\n  itemStyle.fill === 'auto' && (itemStyle.fill = itemVisualStyle.fill);\n  itemStyle.stroke === 'auto' && (itemStyle.stroke = itemVisualStyle.fill);\n  lineStyle.stroke === 'auto' && (lineStyle.stroke = itemVisualStyle.fill);\n  if (!isSelected) {\n    var borderWidth = legendItemModel.get('inactiveBorderWidth');\n    /**\n     * Since stroke is set to be inactiveBorderColor, it may occur that\n     * there is no border in series but border in legend, so we need to\n     * use border only when series has border if is set to be auto\n     */\n    var visualHasBorder = itemStyle[iconBrushType];\n    itemStyle.lineWidth = borderWidth === 'auto' ? itemVisualStyle.lineWidth > 0 && visualHasBorder ? 2 : 0 : itemStyle.lineWidth;\n    itemStyle.fill = legendItemModel.get('inactiveColor');\n    itemStyle.stroke = legendItemModel.get('inactiveBorderColor');\n    lineStyle.stroke = legendLineModel.get('inactiveColor');\n    lineStyle.lineWidth = legendLineModel.get('inactiveWidth');\n  }\n  return {\n    itemStyle: itemStyle,\n    lineStyle: lineStyle\n  };\n}\nfunction getDefaultLegendIcon(opt) {\n  var symboType = opt.icon || 'roundRect';\n  var icon = createSymbol(symboType, 0, 0, opt.itemWidth, opt.itemHeight, opt.itemStyle.fill, opt.symbolKeepAspect);\n  icon.setStyle(opt.itemStyle);\n  icon.rotation = (opt.iconRotate || 0) * Math.PI / 180;\n  icon.setOrigin([opt.itemWidth / 2, opt.itemHeight / 2]);\n  if (symboType.indexOf('empty') > -1) {\n    icon.style.stroke = icon.style.fill;\n    icon.style.fill = tokens.color.neutral00;\n    icon.style.lineWidth = 2;\n  }\n  return icon;\n}\nfunction dispatchSelectAction(seriesName, dataName, api, excludeSeriesId) {\n  // downplay before unselect\n  dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId);\n  api.dispatchAction({\n    type: 'legendToggleSelect',\n    name: seriesName != null ? seriesName : dataName\n  });\n  // highlight after select\n  // TODO highlight immediately may cause animation loss.\n  dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId);\n}\nfunction isUseHoverLayer(api) {\n  var list = api.getZr().storage.getDisplayList();\n  var emphasisState;\n  var i = 0;\n  var len = list.length;\n  while (i < len && !(emphasisState = list[i].states.emphasis)) {\n    i++;\n  }\n  return emphasisState && emphasisState.hoverLayer;\n}\nfunction dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) {\n  // If element hover will move to a hoverLayer.\n  if (!isUseHoverLayer(api)) {\n    api.dispatchAction({\n      type: 'highlight',\n      seriesName: seriesName,\n      name: dataName,\n      excludeSeriesId: excludeSeriesId\n    });\n  }\n}\nfunction dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) {\n  // If element hover will move to a hoverLayer.\n  if (!isUseHoverLayer(api)) {\n    api.dispatchAction({\n      type: 'downplay',\n      seriesName: seriesName,\n      name: dataName,\n      excludeSeriesId: excludeSeriesId\n    });\n  }\n}\nexport default LegendView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport default function legendFilter(ecModel) {\n  var legendModels = ecModel.findComponents({\n    mainType: 'legend'\n  });\n  if (legendModels && legendModels.length) {\n    ecModel.filterSeries(function (series) {\n      // If in any legend component the status is not selected.\n      // Because in legend series is assumed selected when it is not in the legend data.\n      for (var i = 0; i < legendModels.length; i++) {\n        if (!legendModels[i].isSelected(series.name)) {\n          return false;\n        }\n      }\n      return true;\n    });\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { curry, each, hasOwn } from 'zrender/lib/core/util.js';\nfunction legendSelectActionHandler(methodName, payload, ecModel) {\n  var isAllSelect = methodName === 'allSelect' || methodName === 'inverseSelect';\n  var selectedMap = {};\n  var actionLegendIndices = [];\n  ecModel.eachComponent({\n    mainType: 'legend',\n    query: payload\n  }, function (legendModel) {\n    if (isAllSelect) {\n      legendModel[methodName]();\n    } else {\n      legendModel[methodName](payload.name);\n    }\n    makeSelectedMap(legendModel, selectedMap);\n    actionLegendIndices.push(legendModel.componentIndex);\n  });\n  var allSelectedMap = {};\n  // make selectedMap from all legend components\n  ecModel.eachComponent('legend', function (legendModel) {\n    each(selectedMap, function (isSelected, name) {\n      // Force other legend has same selected status\n      // Or the first is toggled to true and other are toggled to false\n      // In the case one legend has some item unSelected in option. And if other legend\n      // doesn't has the item, they will assume it is selected.\n      legendModel[isSelected ? 'select' : 'unSelect'](name);\n    });\n    makeSelectedMap(legendModel, allSelectedMap);\n  });\n  // Return the event explicitly\n  return isAllSelect ? {\n    selected: allSelectedMap,\n    // return legendIndex array to tell the developers which legends are allSelect / inverseSelect\n    legendIndex: actionLegendIndices\n  } : {\n    name: payload.name,\n    selected: allSelectedMap\n  };\n}\nfunction makeSelectedMap(legendModel, out) {\n  var selectedMap = out || {};\n  each(legendModel.getData(), function (model) {\n    var name = model.get('name');\n    // Wrap element\n    if (name === '\\n' || name === '') {\n      return;\n    }\n    var isItemSelected = legendModel.isSelected(name);\n    if (hasOwn(selectedMap, name)) {\n      // Unselected if any legend is unselected\n      selectedMap[name] = selectedMap[name] && isItemSelected;\n    } else {\n      selectedMap[name] = isItemSelected;\n    }\n  });\n  return selectedMap;\n}\nexport function installLegendAction(registers) {\n  /**\n   * @event legendToggleSelect\n   * @type {Object}\n   * @property {string} type 'legendToggleSelect'\n   * @property {string} [from]\n   * @property {string} name Series name or data item name\n   */\n  registers.registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected'));\n  registers.registerAction('legendAllSelect', 'legendselectall', curry(legendSelectActionHandler, 'allSelect'));\n  registers.registerAction('legendInverseSelect', 'legendinverseselect', curry(legendSelectActionHandler, 'inverseSelect'));\n  /**\n   * @event legendSelect\n   * @type {Object}\n   * @property {string} type 'legendSelect'\n   * @property {string} name Series name or data item name\n   */\n  registers.registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select'));\n  /**\n   * @event legendUnSelect\n   * @type {Object}\n   * @property {string} type 'legendUnSelect'\n   * @property {string} name Series name or data item name\n   */\n  registers.registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect'));\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport LegendModel from './LegendModel.js';\nimport LegendView from './LegendView.js';\nimport legendFilter from './legendFilter.js';\nimport { installLegendAction } from './legendAction.js';\nexport function install(registers) {\n  registers.registerComponentModel(LegendModel);\n  registers.registerComponentView(LegendView);\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.SERIES_FILTER, legendFilter);\n  registers.registerSubTypeDefaulter('legend', function () {\n    return 'plain';\n  });\n  installLegendAction(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport LegendModel from './LegendModel.js';\nimport { mergeLayoutParam, getLayoutParams } from '../../util/layout.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nimport tokens from '../../visual/tokens.js';\nvar ScrollableLegendModel = /** @class */function (_super) {\n  __extends(ScrollableLegendModel, _super);\n  function ScrollableLegendModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ScrollableLegendModel.type;\n    return _this;\n  }\n  /**\n   * @param {number} scrollDataIndex\n   */\n  ScrollableLegendModel.prototype.setScrollDataIndex = function (scrollDataIndex) {\n    this.option.scrollDataIndex = scrollDataIndex;\n  };\n  ScrollableLegendModel.prototype.init = function (option, parentModel, ecModel) {\n    var inputPositionParams = getLayoutParams(option);\n    _super.prototype.init.call(this, option, parentModel, ecModel);\n    mergeAndNormalizeLayoutParams(this, option, inputPositionParams);\n  };\n  /**\n   * @override\n   */\n  ScrollableLegendModel.prototype.mergeOption = function (option, ecModel) {\n    _super.prototype.mergeOption.call(this, option, ecModel);\n    mergeAndNormalizeLayoutParams(this, this.option, option);\n  };\n  ScrollableLegendModel.type = 'legend.scroll';\n  ScrollableLegendModel.defaultOption = inheritDefaultOption(LegendModel.defaultOption, {\n    scrollDataIndex: 0,\n    pageButtonItemGap: 5,\n    pageButtonGap: null,\n    pageButtonPosition: 'end',\n    pageFormatter: '{current}/{total}',\n    pageIcons: {\n      horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'],\n      vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z']\n    },\n    pageIconColor: tokens.color.accent50,\n    pageIconInactiveColor: tokens.color.accent10,\n    pageIconSize: 15,\n    pageTextStyle: {\n      color: tokens.color.tertiary\n    },\n    animationDurationUpdate: 800\n  });\n  return ScrollableLegendModel;\n}(LegendModel);\n;\n// Do not `ignoreSize` to enable setting {left: 10, right: 10}.\nfunction mergeAndNormalizeLayoutParams(legendModel, target, raw) {\n  var orient = legendModel.getOrient();\n  var ignoreSize = [1, 1];\n  ignoreSize[orient.index] = 0;\n  mergeLayoutParam(target, raw, {\n    type: 'box',\n    ignoreSize: !!ignoreSize\n  });\n}\nexport default ScrollableLegendModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * Separate legend and scrollable legend to reduce package size.\n */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as layoutUtil from '../../util/layout.js';\nimport LegendView from './LegendView.js';\nvar Group = graphic.Group;\nvar WH = ['width', 'height'];\nvar XY = ['x', 'y'];\nvar ScrollableLegendView = /** @class */function (_super) {\n  __extends(ScrollableLegendView, _super);\n  function ScrollableLegendView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ScrollableLegendView.type;\n    _this.newlineDisabled = true;\n    _this._currentIndex = 0;\n    return _this;\n  }\n  ScrollableLegendView.prototype.init = function () {\n    _super.prototype.init.call(this);\n    this.group.add(this._containerGroup = new Group());\n    this._containerGroup.add(this.getContentGroup());\n    this.group.add(this._controllerGroup = new Group());\n  };\n  /**\n   * @override\n   */\n  ScrollableLegendView.prototype.resetInner = function () {\n    _super.prototype.resetInner.call(this);\n    this._controllerGroup.removeAll();\n    this._containerGroup.removeClipPath();\n    this._containerGroup.__rectSize = null;\n  };\n  /**\n   * @override\n   */\n  ScrollableLegendView.prototype.renderInner = function (itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition) {\n    var self = this;\n    // Render content items.\n    _super.prototype.renderInner.call(this, itemAlign, legendModel, ecModel, api, selector, orient, selectorPosition);\n    var controllerGroup = this._controllerGroup;\n    // FIXME: support be 'auto' adapt to size number text length,\n    // e.g., '3/12345' should not overlap with the control arrow button.\n    var pageIconSize = legendModel.get('pageIconSize', true);\n    var pageIconSizeArr = zrUtil.isArray(pageIconSize) ? pageIconSize : [pageIconSize, pageIconSize];\n    createPageButton('pagePrev', 0);\n    var pageTextStyleModel = legendModel.getModel('pageTextStyle');\n    controllerGroup.add(new graphic.Text({\n      name: 'pageText',\n      style: {\n        // Placeholder to calculate a proper layout.\n        text: 'xx/xx',\n        fill: pageTextStyleModel.getTextColor(),\n        font: pageTextStyleModel.getFont(),\n        verticalAlign: 'middle',\n        align: 'center'\n      },\n      silent: true\n    }));\n    createPageButton('pageNext', 1);\n    function createPageButton(name, iconIdx) {\n      var pageDataIndexName = name + 'DataIndex';\n      var icon = graphic.createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], {\n        // Buttons will be created in each render, so we do not need\n        // to worry about avoiding using legendModel kept in scope.\n        onclick: zrUtil.bind(self._pageGo, self, pageDataIndexName, legendModel, api)\n      }, {\n        x: -pageIconSizeArr[0] / 2,\n        y: -pageIconSizeArr[1] / 2,\n        width: pageIconSizeArr[0],\n        height: pageIconSizeArr[1]\n      });\n      icon.name = name;\n      controllerGroup.add(icon);\n    }\n  };\n  /**\n   * @override\n   */\n  ScrollableLegendView.prototype.layoutInner = function (legendModel, itemAlign, maxSize, isFirstRender, selector, selectorPosition) {\n    var selectorGroup = this.getSelectorGroup();\n    var orientIdx = legendModel.getOrient().index;\n    var wh = WH[orientIdx];\n    var xy = XY[orientIdx];\n    var hw = WH[1 - orientIdx];\n    var yx = XY[1 - orientIdx];\n    selector && layoutUtil.box(\n    // Buttons in selectorGroup always layout horizontally\n    'horizontal', selectorGroup, legendModel.get('selectorItemGap', true));\n    var selectorButtonGap = legendModel.get('selectorButtonGap', true);\n    var selectorRect = selectorGroup.getBoundingRect();\n    var selectorPos = [-selectorRect.x, -selectorRect.y];\n    var processMaxSize = zrUtil.clone(maxSize);\n    selector && (processMaxSize[wh] = maxSize[wh] - selectorRect[wh] - selectorButtonGap);\n    var mainRect = this._layoutContentAndController(legendModel, isFirstRender, processMaxSize, orientIdx, wh, hw, yx, xy);\n    if (selector) {\n      if (selectorPosition === 'end') {\n        selectorPos[orientIdx] += mainRect[wh] + selectorButtonGap;\n      } else {\n        var offset = selectorRect[wh] + selectorButtonGap;\n        selectorPos[orientIdx] -= offset;\n        mainRect[xy] -= offset;\n      }\n      mainRect[wh] += selectorRect[wh] + selectorButtonGap;\n      selectorPos[1 - orientIdx] += mainRect[yx] + mainRect[hw] / 2 - selectorRect[hw] / 2;\n      mainRect[hw] = Math.max(mainRect[hw], selectorRect[hw]);\n      mainRect[yx] = Math.min(mainRect[yx], selectorRect[yx] + selectorPos[1 - orientIdx]);\n      selectorGroup.x = selectorPos[0];\n      selectorGroup.y = selectorPos[1];\n      selectorGroup.markRedraw();\n    }\n    return mainRect;\n  };\n  ScrollableLegendView.prototype._layoutContentAndController = function (legendModel, isFirstRender, maxSize, orientIdx, wh, hw, yx, xy) {\n    var contentGroup = this.getContentGroup();\n    var containerGroup = this._containerGroup;\n    var controllerGroup = this._controllerGroup;\n    // Place items in contentGroup.\n    layoutUtil.box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height);\n    layoutUtil.box(\n    // Buttons in controller are layout always horizontally.\n    'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true));\n    var contentRect = contentGroup.getBoundingRect();\n    var controllerRect = controllerGroup.getBoundingRect();\n    var showController = this._showController = contentRect[wh] > maxSize[wh];\n    // In case that the inner elements of contentGroup layout do not based on [0, 0]\n    var contentPos = [-contentRect.x, -contentRect.y];\n    // Remain contentPos when scroll animation perfroming.\n    // If first rendering, `contentGroup.position` is [0, 0], which\n    // does not make sense and may cause unexepcted animation if adopted.\n    if (!isFirstRender) {\n      contentPos[orientIdx] = contentGroup[xy];\n    }\n    // Layout container group based on 0.\n    var containerPos = [0, 0];\n    var controllerPos = [-controllerRect.x, -controllerRect.y];\n    var pageButtonGap = zrUtil.retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true));\n    // Place containerGroup and controllerGroup and contentGroup.\n    if (showController) {\n      var pageButtonPosition = legendModel.get('pageButtonPosition', true);\n      // controller is on the right / bottom.\n      if (pageButtonPosition === 'end') {\n        controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh];\n      }\n      // controller is on the left / top.\n      else {\n        containerPos[orientIdx] += controllerRect[wh] + pageButtonGap;\n      }\n    }\n    // Always align controller to content as 'middle'.\n    controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2;\n    contentGroup.setPosition(contentPos);\n    containerGroup.setPosition(containerPos);\n    controllerGroup.setPosition(controllerPos);\n    // Calculate `mainRect` and set `clipPath`.\n    // mainRect should not be calculated by `this.group.getBoundingRect()`\n    // for sake of the overflow.\n    var mainRect = {\n      x: 0,\n      y: 0\n    };\n    // Consider content may be overflow (should be clipped).\n    mainRect[wh] = showController ? maxSize[wh] : contentRect[wh];\n    mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]);\n    // `containerRect[yx] + containerPos[1 - orientIdx]` is 0.\n    mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]);\n    containerGroup.__rectSize = maxSize[wh];\n    if (showController) {\n      var clipShape = {\n        x: 0,\n        y: 0\n      };\n      clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0);\n      clipShape[hw] = mainRect[hw];\n      containerGroup.setClipPath(new graphic.Rect({\n        shape: clipShape\n      }));\n      // Consider content may be larger than container, container rect\n      // can not be obtained from `containerGroup.getBoundingRect()`.\n      containerGroup.__rectSize = clipShape[wh];\n    } else {\n      // Do not remove or ignore controller. Keep them set as placeholders.\n      controllerGroup.eachChild(function (child) {\n        child.attr({\n          invisible: true,\n          silent: true\n        });\n      });\n    }\n    // Content translate animation.\n    var pageInfo = this._getPageInfo(legendModel);\n    pageInfo.pageIndex != null && graphic.updateProps(contentGroup, {\n      x: pageInfo.contentPosition[0],\n      y: pageInfo.contentPosition[1]\n    },\n    // When switch from \"show controller\" to \"not show controller\", view should be\n    // updated immediately without animation, otherwise causes weird effect.\n    showController ? legendModel : null);\n    this._updatePageInfoView(legendModel, pageInfo);\n    return mainRect;\n  };\n  ScrollableLegendView.prototype._pageGo = function (to, legendModel, api) {\n    var scrollDataIndex = this._getPageInfo(legendModel)[to];\n    scrollDataIndex != null && api.dispatchAction({\n      type: 'legendScroll',\n      scrollDataIndex: scrollDataIndex,\n      legendId: legendModel.id\n    });\n  };\n  ScrollableLegendView.prototype._updatePageInfoView = function (legendModel, pageInfo) {\n    var controllerGroup = this._controllerGroup;\n    zrUtil.each(['pagePrev', 'pageNext'], function (name) {\n      var key = name + 'DataIndex';\n      var canJump = pageInfo[key] != null;\n      var icon = controllerGroup.childOfName(name);\n      if (icon) {\n        icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true));\n        icon.cursor = canJump ? 'pointer' : 'default';\n      }\n    });\n    var pageText = controllerGroup.childOfName('pageText');\n    var pageFormatter = legendModel.get('pageFormatter');\n    var pageIndex = pageInfo.pageIndex;\n    var current = pageIndex != null ? pageIndex + 1 : 0;\n    var total = pageInfo.pageCount;\n    pageText && pageFormatter && pageText.setStyle('text', zrUtil.isString(pageFormatter) ? pageFormatter.replace('{current}', current == null ? '' : current + '').replace('{total}', total == null ? '' : total + '') : pageFormatter({\n      current: current,\n      total: total\n    }));\n  };\n  /**\n   *  contentPosition: Array.<number>, null when data item not found.\n   *  pageIndex: number, null when data item not found.\n   *  pageCount: number, always be a number, can be 0.\n   *  pagePrevDataIndex: number, null when no previous page.\n   *  pageNextDataIndex: number, null when no next page.\n   * }\n   */\n  ScrollableLegendView.prototype._getPageInfo = function (legendModel) {\n    var scrollDataIndex = legendModel.get('scrollDataIndex', true);\n    var contentGroup = this.getContentGroup();\n    var containerRectSize = this._containerGroup.__rectSize;\n    var orientIdx = legendModel.getOrient().index;\n    var wh = WH[orientIdx];\n    var xy = XY[orientIdx];\n    var targetItemIndex = this._findTargetItemIndex(scrollDataIndex);\n    var children = contentGroup.children();\n    var targetItem = children[targetItemIndex];\n    var itemCount = children.length;\n    var pCount = !itemCount ? 0 : 1;\n    var result = {\n      contentPosition: [contentGroup.x, contentGroup.y],\n      pageCount: pCount,\n      pageIndex: pCount - 1,\n      pagePrevDataIndex: null,\n      pageNextDataIndex: null\n    };\n    if (!targetItem) {\n      return result;\n    }\n    var targetItemInfo = getItemInfo(targetItem);\n    result.contentPosition[orientIdx] = -targetItemInfo.s;\n    // Strategy:\n    // (1) Always align based on the left/top most item.\n    // (2) It is user-friendly that the last item shown in the\n    // current window is shown at the begining of next window.\n    // Otherwise if half of the last item is cut by the window,\n    // it will have no chance to display entirely.\n    // (3) Consider that item size probably be different, we\n    // have calculate pageIndex by size rather than item index,\n    // and we can not get page index directly by division.\n    // (4) The window is to narrow to contain more than\n    // one item, we should make sure that the page can be fliped.\n    for (var i = targetItemIndex + 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i <= itemCount; ++i) {\n      currItemInfo = getItemInfo(children[i]);\n      if (\n      // Half of the last item is out of the window.\n      !currItemInfo && winEndItemInfo.e > winStartItemInfo.s + containerRectSize\n      // If the current item does not intersect with the window, the new page\n      // can be started at the current item or the last item.\n      || currItemInfo && !intersect(currItemInfo, winStartItemInfo.s)) {\n        if (winEndItemInfo.i > winStartItemInfo.i) {\n          winStartItemInfo = winEndItemInfo;\n        } else {\n          // e.g., when page size is smaller than item size.\n          winStartItemInfo = currItemInfo;\n        }\n        if (winStartItemInfo) {\n          if (result.pageNextDataIndex == null) {\n            result.pageNextDataIndex = winStartItemInfo.i;\n          }\n          ++result.pageCount;\n        }\n      }\n      winEndItemInfo = currItemInfo;\n    }\n    for (var i = targetItemIndex - 1, winStartItemInfo = targetItemInfo, winEndItemInfo = targetItemInfo, currItemInfo = null; i >= -1; --i) {\n      currItemInfo = getItemInfo(children[i]);\n      if (\n      // If the the end item does not intersect with the window started\n      // from the current item, a page can be settled.\n      (!currItemInfo || !intersect(winEndItemInfo, currItemInfo.s)\n      // e.g., when page size is smaller than item size.\n      ) && winStartItemInfo.i < winEndItemInfo.i) {\n        winEndItemInfo = winStartItemInfo;\n        if (result.pagePrevDataIndex == null) {\n          result.pagePrevDataIndex = winStartItemInfo.i;\n        }\n        ++result.pageCount;\n        ++result.pageIndex;\n      }\n      winStartItemInfo = currItemInfo;\n    }\n    return result;\n    function getItemInfo(el) {\n      if (el) {\n        var itemRect = el.getBoundingRect();\n        var start = itemRect[xy] + el[xy];\n        return {\n          s: start,\n          e: start + itemRect[wh],\n          i: el.__legendDataIndex\n        };\n      }\n    }\n    function intersect(itemInfo, winStart) {\n      return itemInfo.e >= winStart && itemInfo.s <= winStart + containerRectSize;\n    }\n  };\n  ScrollableLegendView.prototype._findTargetItemIndex = function (targetDataIndex) {\n    if (!this._showController) {\n      return 0;\n    }\n    var index;\n    var contentGroup = this.getContentGroup();\n    var defaultIndex;\n    contentGroup.eachChild(function (child, idx) {\n      var legendDataIdx = child.__legendDataIndex;\n      // FIXME\n      // If the given targetDataIndex (from model) is illegal,\n      // we use defaultIndex. But the index on the legend model and\n      // action payload is still illegal. That case will not be\n      // changed until some scenario requires.\n      if (defaultIndex == null && legendDataIdx != null) {\n        defaultIndex = idx;\n      }\n      if (legendDataIdx === targetDataIndex) {\n        index = idx;\n      }\n    });\n    return index != null ? index : defaultIndex;\n  };\n  ScrollableLegendView.type = 'legend.scroll';\n  return ScrollableLegendView;\n}(LegendView);\nexport default ScrollableLegendView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport default function installScrollableLegendAction(registers) {\n  /**\n   * @event legendScroll\n   * @type {Object}\n   * @property {string} type 'legendScroll'\n   * @property {string} scrollDataIndex\n   */\n  registers.registerAction('legendScroll', 'legendscroll', function (payload, ecModel) {\n    var scrollDataIndex = payload.scrollDataIndex;\n    scrollDataIndex != null && ecModel.eachComponent({\n      mainType: 'legend',\n      subType: 'scroll',\n      query: payload\n    }, function (legendModel) {\n      legendModel.setScrollDataIndex(scrollDataIndex);\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport { install as installLegendPlain } from './installLegendPlain.js';\nimport ScrollableLegendModel from './ScrollableLegendModel.js';\nimport ScrollableLegendView from './ScrollableLegendView.js';\nimport installScrollableLegendAction from './scrollableLegendAction.js';\nexport function install(registers) {\n  use(installLegendPlain);\n  registers.registerComponentModel(ScrollableLegendModel);\n  registers.registerComponentView(ScrollableLegendView);\n  installScrollableLegendAction(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport { install as installLegendPlain } from './installLegendPlain.js';\nimport { install as installLegendScroll } from './installLegendScroll.js';\nexport function install(registers) {\n  use(installLegendPlain);\n  use(installLegendScroll);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport DataZoomModel from './DataZoomModel.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nvar InsideZoomModel = /** @class */function (_super) {\n  __extends(InsideZoomModel, _super);\n  function InsideZoomModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = InsideZoomModel.type;\n    return _this;\n  }\n  InsideZoomModel.type = 'dataZoom.inside';\n  InsideZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, {\n    disabled: false,\n    zoomLock: false,\n    zoomOnMouseWheel: true,\n    moveOnMouseMove: true,\n    moveOnMouseWheel: false,\n    preventDefaultMouseMove: true\n  });\n  return InsideZoomModel;\n}(DataZoomModel);\nexport default InsideZoomModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// Only create one roam controller for each coordinate system.\n// one roam controller might be refered by two inside data zoom\n// components (for example, one for x and one for y). When user\n// pan or zoom, only dispatch one action for those data zoom\n// components.\nimport RoamController from '../../component/helper/RoamController.js';\nimport * as throttleUtil from '../../util/throttle.js';\nimport { makeInner } from '../../util/model.js';\nimport { each, curry, createHashMap } from 'zrender/lib/core/util.js';\nimport { collectReferCoordSysModelInfo } from './helper.js';\nvar inner = makeInner();\nexport function setViewInfoToCoordSysRecord(api, dataZoomModel, getRange) {\n  inner(api).coordSysRecordMap.each(function (coordSysRecord) {\n    var dzInfo = coordSysRecord.dataZoomInfoMap.get(dataZoomModel.uid);\n    if (dzInfo) {\n      dzInfo.getRange = getRange;\n    }\n  });\n}\nexport function disposeCoordSysRecordIfNeeded(api, dataZoomModel) {\n  var coordSysRecordMap = inner(api).coordSysRecordMap;\n  var coordSysKeyArr = coordSysRecordMap.keys();\n  for (var i = 0; i < coordSysKeyArr.length; i++) {\n    var coordSysKey = coordSysKeyArr[i];\n    var coordSysRecord = coordSysRecordMap.get(coordSysKey);\n    var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap;\n    if (dataZoomInfoMap) {\n      var dzUid = dataZoomModel.uid;\n      var dzInfo = dataZoomInfoMap.get(dzUid);\n      if (dzInfo) {\n        dataZoomInfoMap.removeKey(dzUid);\n        if (!dataZoomInfoMap.keys().length) {\n          disposeCoordSysRecord(coordSysRecordMap, coordSysRecord);\n        }\n      }\n    }\n  }\n}\nfunction disposeCoordSysRecord(coordSysRecordMap, coordSysRecord) {\n  if (coordSysRecord) {\n    coordSysRecordMap.removeKey(coordSysRecord.model.uid);\n    var controller = coordSysRecord.controller;\n    controller && controller.dispose();\n  }\n}\nfunction createCoordSysRecord(api, coordSysModel) {\n  // These init props will never change after record created.\n  var coordSysRecord = {\n    model: coordSysModel,\n    containsPoint: curry(containsPoint, coordSysModel),\n    dispatchAction: curry(dispatchAction, api),\n    dataZoomInfoMap: null,\n    controller: null\n  };\n  // Must not do anything depends on coordSysRecord outside the event handler here,\n  // because coordSysRecord not completed yet.\n  var controller = coordSysRecord.controller = new RoamController(api.getZr());\n  each(['pan', 'zoom', 'scrollMove'], function (eventName) {\n    controller.on(eventName, function (event) {\n      var batch = [];\n      coordSysRecord.dataZoomInfoMap.each(function (dzInfo) {\n        // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove,\n        // moveOnMouseWheel, ...) enabled.\n        if (!event.isAvailableBehavior(dzInfo.model.option)) {\n          return;\n        }\n        var method = (dzInfo.getRange || {})[eventName];\n        var range = method && method(dzInfo.dzReferCoordSysInfo, coordSysRecord.model.mainType, coordSysRecord.controller, event);\n        !dzInfo.model.get('disabled', true) && range && batch.push({\n          dataZoomId: dzInfo.model.id,\n          start: range[0],\n          end: range[1]\n        });\n      });\n      batch.length && coordSysRecord.dispatchAction(batch);\n    });\n  });\n  return coordSysRecord;\n}\n/**\n * This action will be throttled.\n */\nfunction dispatchAction(api, batch) {\n  if (!api.isDisposed()) {\n    api.dispatchAction({\n      type: 'dataZoom',\n      animation: {\n        easing: 'cubicOut',\n        duration: 100\n      },\n      batch: batch\n    });\n  }\n}\nfunction containsPoint(coordSysModel, e, x, y) {\n  return coordSysModel.coordinateSystem.containPoint([x, y]);\n}\n/**\n * Merge roamController settings when multiple dataZooms share one roamController.\n */\nfunction mergeControllerParams(dataZoomInfoMap, coordSysRecord, api) {\n  var controlType;\n  // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated\n  // as string, it is probably revert to reserved word by compress tool. See #7411.\n  var prefix = 'type_';\n  var typePriority = {\n    'type_true': 2,\n    'type_move': 1,\n    'type_false': 0,\n    'type_undefined': -1\n  };\n  var preventDefaultMouseMove = true;\n  dataZoomInfoMap.each(function (dataZoomInfo) {\n    var dataZoomModel = dataZoomInfo.model;\n    var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true;\n    if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) {\n      controlType = oneType;\n    }\n    // Prevent default move event by default. If one false, do not prevent. Otherwise\n    // users may be confused why it does not work when multiple insideZooms exist.\n    preventDefaultMouseMove = preventDefaultMouseMove && dataZoomModel.get('preventDefaultMouseMove', true);\n  });\n  return {\n    controlType: controlType,\n    opt: {\n      // RoamController will enable all of these functionalities,\n      // and the final behavior is determined by its event listener\n      // provided by each inside zoom.\n      zoomOnMouseWheel: true,\n      moveOnMouseMove: true,\n      moveOnMouseWheel: true,\n      preventDefaultMouseMove: !!preventDefaultMouseMove,\n      api: api,\n      zInfo: {\n        component: coordSysRecord.model\n      },\n      triggerInfo: {\n        roamTrigger: null,\n        isInSelf: coordSysRecord.containsPoint\n      }\n    }\n  };\n}\nexport function installDataZoomRoamProcessor(registers) {\n  registers.registerProcessor(registers.PRIORITY.PROCESSOR.FILTER, function (ecModel, api) {\n    var apiInner = inner(api);\n    var coordSysRecordMap = apiInner.coordSysRecordMap || (apiInner.coordSysRecordMap = createHashMap());\n    coordSysRecordMap.each(function (coordSysRecord) {\n      // `coordSysRecordMap` always exists (because it holds the `roam controller`, which should\n      // better not re-create each time), but clear `dataZoomInfoMap` each round of the workflow.\n      coordSysRecord.dataZoomInfoMap = null;\n    });\n    ecModel.eachComponent({\n      mainType: 'dataZoom',\n      subType: 'inside'\n    }, function (dataZoomModel) {\n      var dzReferCoordSysWrap = collectReferCoordSysModelInfo(dataZoomModel);\n      each(dzReferCoordSysWrap.infoList, function (dzCoordSysInfo) {\n        var coordSysUid = dzCoordSysInfo.model.uid;\n        var coordSysRecord = coordSysRecordMap.get(coordSysUid) || coordSysRecordMap.set(coordSysUid, createCoordSysRecord(api, dzCoordSysInfo.model));\n        var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap || (coordSysRecord.dataZoomInfoMap = createHashMap());\n        // Notice these props might be changed each time for a single dataZoomModel.\n        dataZoomInfoMap.set(dataZoomModel.uid, {\n          dzReferCoordSysInfo: dzCoordSysInfo,\n          model: dataZoomModel,\n          getRange: null\n        });\n      });\n    });\n    // (1) Merge dataZoom settings for each coord sys and set to the roam controller.\n    // (2) Clear coord sys if not refered by any dataZoom.\n    coordSysRecordMap.each(function (coordSysRecord) {\n      var controller = coordSysRecord.controller;\n      var firstDzInfo;\n      var dataZoomInfoMap = coordSysRecord.dataZoomInfoMap;\n      if (dataZoomInfoMap) {\n        var firstDzKey = dataZoomInfoMap.keys()[0];\n        if (firstDzKey != null) {\n          firstDzInfo = dataZoomInfoMap.get(firstDzKey);\n        }\n      }\n      if (!firstDzInfo) {\n        disposeCoordSysRecord(coordSysRecordMap, coordSysRecord);\n        return;\n      }\n      var controllerParams = mergeControllerParams(dataZoomInfoMap, coordSysRecord, api);\n      controller.enable(controllerParams.controlType, controllerParams.opt);\n      throttleUtil.createOrUpdate(coordSysRecord, 'dispatchAction', firstDzInfo.model.get('throttle', true), 'fixRate');\n    });\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport DataZoomView from './DataZoomView.js';\nimport sliderMove from '../helper/sliderMove.js';\nimport * as roams from './roams.js';\nimport { bind } from 'zrender/lib/core/util.js';\nvar InsideZoomView = /** @class */function (_super) {\n  __extends(InsideZoomView, _super);\n  function InsideZoomView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'dataZoom.inside';\n    return _this;\n  }\n  InsideZoomView.prototype.render = function (dataZoomModel, ecModel, api) {\n    _super.prototype.render.apply(this, arguments);\n    if (dataZoomModel.noTarget()) {\n      this._clear();\n      return;\n    }\n    // Hence the `throttle` util ensures to preserve command order,\n    // here simply updating range all the time will not cause missing\n    // any of the the roam change.\n    this.range = dataZoomModel.getPercentRange();\n    // Reset controllers.\n    roams.setViewInfoToCoordSysRecord(api, dataZoomModel, {\n      pan: bind(getRangeHandlers.pan, this),\n      zoom: bind(getRangeHandlers.zoom, this),\n      scrollMove: bind(getRangeHandlers.scrollMove, this)\n    });\n  };\n  InsideZoomView.prototype.dispose = function () {\n    this._clear();\n    _super.prototype.dispose.apply(this, arguments);\n  };\n  InsideZoomView.prototype._clear = function () {\n    roams.disposeCoordSysRecordIfNeeded(this.api, this.dataZoomModel);\n    this.range = null;\n  };\n  InsideZoomView.type = 'dataZoom.inside';\n  return InsideZoomView;\n}(DataZoomView);\nvar getRangeHandlers = {\n  zoom: function (coordSysInfo, coordSysMainType, controller, e) {\n    var lastRange = this.range;\n    var range = lastRange.slice();\n    // Calculate transform by the first axis.\n    var axisModel = coordSysInfo.axisModels[0];\n    if (!axisModel) {\n      return;\n    }\n    var directionInfo = getDirectionInfo[coordSysMainType](null, [e.originX, e.originY], axisModel, controller, coordSysInfo);\n    var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0];\n    var scale = Math.max(1 / e.scale, 0);\n    range[0] = (range[0] - percentPoint) * scale + percentPoint;\n    range[1] = (range[1] - percentPoint) * scale + percentPoint;\n    // Restrict range.\n    var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();\n    sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);\n    this.range = range;\n    if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {\n      return range;\n    }\n  },\n  pan: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) {\n    var directionInfo = getDirectionInfo[coordSysMainType]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordSysInfo);\n    return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength;\n  }),\n  scrollMove: makeMover(function (range, axisModel, coordSysInfo, coordSysMainType, controller, e) {\n    var directionInfo = getDirectionInfo[coordSysMainType]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordSysInfo);\n    return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta;\n  })\n};\nfunction makeMover(getPercentDelta) {\n  return function (coordSysInfo, coordSysMainType, controller, e) {\n    var lastRange = this.range;\n    var range = lastRange.slice();\n    // Calculate transform by the first axis.\n    var axisModel = coordSysInfo.axisModels[0];\n    if (!axisModel) {\n      return;\n    }\n    var percentDelta = getPercentDelta(range, axisModel, coordSysInfo, coordSysMainType, controller, e);\n    sliderMove(percentDelta, range, [0, 100], 'all');\n    this.range = range;\n    if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {\n      return range;\n    }\n  };\n}\nvar getDirectionInfo = {\n  grid: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) {\n    var axis = axisModel.axis;\n    var ret = {};\n    var rect = coordSysInfo.model.coordinateSystem.getRect();\n    oldPoint = oldPoint || [0, 0];\n    if (axis.dim === 'x') {\n      ret.pixel = newPoint[0] - oldPoint[0];\n      ret.pixelLength = rect.width;\n      ret.pixelStart = rect.x;\n      ret.signal = axis.inverse ? 1 : -1;\n    } else {\n      // axis.dim === 'y'\n      ret.pixel = newPoint[1] - oldPoint[1];\n      ret.pixelLength = rect.height;\n      ret.pixelStart = rect.y;\n      ret.signal = axis.inverse ? -1 : 1;\n    }\n    return ret;\n  },\n  polar: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) {\n    var axis = axisModel.axis;\n    var ret = {};\n    var polar = coordSysInfo.model.coordinateSystem;\n    var radiusExtent = polar.getRadiusAxis().getExtent();\n    var angleExtent = polar.getAngleAxis().getExtent();\n    oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0];\n    newPoint = polar.pointToCoord(newPoint);\n    if (axisModel.mainType === 'radiusAxis') {\n      ret.pixel = newPoint[0] - oldPoint[0];\n      // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]);\n      // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]);\n      ret.pixelLength = radiusExtent[1] - radiusExtent[0];\n      ret.pixelStart = radiusExtent[0];\n      ret.signal = axis.inverse ? 1 : -1;\n    } else {\n      // 'angleAxis'\n      ret.pixel = newPoint[1] - oldPoint[1];\n      // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]);\n      // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]);\n      ret.pixelLength = angleExtent[1] - angleExtent[0];\n      ret.pixelStart = angleExtent[0];\n      ret.signal = axis.inverse ? -1 : 1;\n    }\n    return ret;\n  },\n  singleAxis: function (oldPoint, newPoint, axisModel, controller, coordSysInfo) {\n    var axis = axisModel.axis;\n    var rect = coordSysInfo.model.coordinateSystem.getRect();\n    var ret = {};\n    oldPoint = oldPoint || [0, 0];\n    if (axis.orient === 'horizontal') {\n      ret.pixel = newPoint[0] - oldPoint[0];\n      ret.pixelLength = rect.width;\n      ret.pixelStart = rect.x;\n      ret.signal = axis.inverse ? 1 : -1;\n    } else {\n      // 'vertical'\n      ret.pixel = newPoint[1] - oldPoint[1];\n      ret.pixelLength = rect.height;\n      ret.pixelStart = rect.y;\n      ret.signal = axis.inverse ? -1 : 1;\n    }\n    return ret;\n  }\n};\nexport default InsideZoomView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport InsideZoomModel from './InsideZoomModel.js';\nimport InsideZoomView from './InsideZoomView.js';\nimport { installDataZoomRoamProcessor } from './roams.js';\nimport installCommon from './installCommon.js';\nexport function install(registers) {\n  installCommon(registers);\n  registers.registerComponentModel(InsideZoomModel);\n  registers.registerComponentView(InsideZoomView);\n  installDataZoomRoamProcessor(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport DataZoomModel from './DataZoomModel.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nimport tokens from '../../visual/tokens.js';\nvar SliderZoomModel = /** @class */function (_super) {\n  __extends(SliderZoomModel, _super);\n  function SliderZoomModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SliderZoomModel.type;\n    return _this;\n  }\n  SliderZoomModel.type = 'dataZoom.slider';\n  SliderZoomModel.layoutMode = 'box';\n  SliderZoomModel.defaultOption = inheritDefaultOption(DataZoomModel.defaultOption, {\n    show: true,\n    // deault value can only be drived in view stage.\n    right: 'ph',\n    top: 'ph',\n    width: 'ph',\n    height: 'ph',\n    left: null,\n    bottom: null,\n    borderColor: tokens.color.accent10,\n    borderRadius: 0,\n    backgroundColor: tokens.color.transparent,\n    // dataBackgroundColor: '#ddd',\n    dataBackground: {\n      lineStyle: {\n        color: tokens.color.accent30,\n        width: 0.5\n      },\n      areaStyle: {\n        color: tokens.color.accent20,\n        opacity: 0.2\n      }\n    },\n    selectedDataBackground: {\n      lineStyle: {\n        color: tokens.color.accent40,\n        width: 0.5\n      },\n      areaStyle: {\n        color: tokens.color.accent20,\n        opacity: 0.3\n      }\n    },\n    // Color of selected window.\n    fillerColor: 'rgba(135,175,274,0.2)',\n    handleIcon: 'path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z',\n    // Percent of the slider height\n    handleSize: '100%',\n    handleStyle: {\n      color: tokens.color.neutral00,\n      borderColor: tokens.color.accent20\n    },\n    moveHandleSize: 7,\n    moveHandleIcon: 'path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z',\n    moveHandleStyle: {\n      color: tokens.color.accent40,\n      opacity: 0.5\n    },\n    showDetail: true,\n    showDataShadow: 'auto',\n    realtime: true,\n    zoomLock: false,\n    textStyle: {\n      color: tokens.color.tertiary\n    },\n    brushSelect: true,\n    brushStyle: {\n      color: tokens.color.accent30,\n      opacity: 0.3\n    },\n    emphasis: {\n      handleLabel: {\n        show: true\n      },\n      handleStyle: {\n        borderColor: tokens.color.accent40\n      },\n      moveHandleStyle: {\n        opacity: 0.8\n      }\n    },\n    defaultLocationEdgeGap: 15\n  });\n  return SliderZoomModel;\n}(DataZoomModel);\nexport default SliderZoomModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport { bind, each, isFunction, isString, indexOf } from 'zrender/lib/core/util.js';\nimport * as eventTool from 'zrender/lib/core/event.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as throttle from '../../util/throttle.js';\nimport DataZoomView from './DataZoomView.js';\nimport { linearMap, asc, parsePercent } from '../../util/number.js';\nimport * as layout from '../../util/layout.js';\nimport sliderMove from '../helper/sliderMove.js';\nimport { getAxisMainType, collectReferCoordSysModelInfo } from './helper.js';\nimport { enableHoverEmphasis } from '../../util/states.js';\nimport { createSymbol, symbolBuildProxies } from '../../util/symbol.js';\nimport { deprecateLog } from '../../util/log.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport tokens from '../../visual/tokens.js';\nvar Rect = graphic.Rect;\n// Constants\nvar DEFAULT_FRAME_BORDER_WIDTH = 1;\nvar DEFAULT_FILLER_SIZE = 30;\nvar DEFAULT_MOVE_HANDLE_SIZE = 7;\nvar HORIZONTAL = 'horizontal';\nvar VERTICAL = 'vertical';\nvar LABEL_GAP = 5;\nvar SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];\nvar REALTIME_ANIMATION_CONFIG = {\n  easing: 'cubicOut',\n  duration: 100,\n  delay: 0\n};\nvar SliderZoomView = /** @class */function (_super) {\n  __extends(SliderZoomView, _super);\n  function SliderZoomView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = SliderZoomView.type;\n    _this._displayables = {};\n    return _this;\n  }\n  SliderZoomView.prototype.init = function (ecModel, api) {\n    this.api = api;\n    // A unique handler for each dataZoom component\n    this._onBrush = bind(this._onBrush, this);\n    this._onBrushEnd = bind(this._onBrushEnd, this);\n  };\n  SliderZoomView.prototype.render = function (dataZoomModel, ecModel, api, payload) {\n    _super.prototype.render.apply(this, arguments);\n    throttle.createOrUpdate(this, '_dispatchZoomAction', dataZoomModel.get('throttle'), 'fixRate');\n    this._orient = dataZoomModel.getOrient();\n    if (dataZoomModel.get('show') === false) {\n      this.group.removeAll();\n      return;\n    }\n    if (dataZoomModel.noTarget()) {\n      this._clear();\n      this.group.removeAll();\n      return;\n    }\n    // Notice: this._resetInterval() should not be executed when payload.type\n    // is 'dataZoom', origin this._range should be maintained, otherwise 'pan'\n    // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction,\n    if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) {\n      this._buildView();\n    }\n    this._updateView();\n  };\n  SliderZoomView.prototype.dispose = function () {\n    this._clear();\n    _super.prototype.dispose.apply(this, arguments);\n  };\n  SliderZoomView.prototype._clear = function () {\n    throttle.clear(this, '_dispatchZoomAction');\n    var zr = this.api.getZr();\n    zr.off('mousemove', this._onBrush);\n    zr.off('mouseup', this._onBrushEnd);\n  };\n  SliderZoomView.prototype._buildView = function () {\n    var thisGroup = this.group;\n    thisGroup.removeAll();\n    this._brushing = false;\n    this._displayables.brushRect = null;\n    this._resetLocation();\n    this._resetInterval();\n    var barGroup = this._displayables.sliderGroup = new graphic.Group();\n    this._renderBackground();\n    this._renderHandle();\n    this._renderDataShadow();\n    thisGroup.add(barGroup);\n    this._positionGroup();\n  };\n  SliderZoomView.prototype._resetLocation = function () {\n    var dataZoomModel = this.dataZoomModel;\n    var api = this.api;\n    var showMoveHandle = dataZoomModel.get('brushSelect');\n    var moveHandleSize = showMoveHandle ? DEFAULT_MOVE_HANDLE_SIZE : 0;\n    var refContainer = layout.createBoxLayoutReference(dataZoomModel, api).refContainer;\n    // If some of x/y/width/height are not specified,\n    // auto-adapt according to target grid.\n    var coordRect = this._findCoordRect();\n    var edgeGap = dataZoomModel.get('defaultLocationEdgeGap', true) || 0;\n    // Default align by coordinate system rect.\n    var positionInfo = this._orient === HORIZONTAL ? {\n      // Why using 'right', because right should be used in vertical,\n      // and it is better to be consistent for dealing with position param merge.\n      right: refContainer.width - coordRect.x - coordRect.width,\n      top: refContainer.height - DEFAULT_FILLER_SIZE - edgeGap - moveHandleSize,\n      width: coordRect.width,\n      height: DEFAULT_FILLER_SIZE\n    } : {\n      right: edgeGap,\n      top: coordRect.y,\n      width: DEFAULT_FILLER_SIZE,\n      height: coordRect.height\n    };\n    // Do not write back to option and replace value 'ph', because\n    // the 'ph' value should be recalculated when resize.\n    var layoutParams = layout.getLayoutParams(dataZoomModel.option);\n    // Replace the placeholder value.\n    each(['right', 'top', 'width', 'height'], function (name) {\n      if (layoutParams[name] === 'ph') {\n        layoutParams[name] = positionInfo[name];\n      }\n    });\n    var layoutRect = layout.getLayoutRect(layoutParams, refContainer);\n    this._location = {\n      x: layoutRect.x,\n      y: layoutRect.y\n    };\n    this._size = [layoutRect.width, layoutRect.height];\n    this._orient === VERTICAL && this._size.reverse();\n  };\n  SliderZoomView.prototype._positionGroup = function () {\n    var thisGroup = this.group;\n    var location = this._location;\n    var orient = this._orient;\n    // Just use the first axis to determine mapping.\n    var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel();\n    var inverse = targetAxisModel && targetAxisModel.get('inverse');\n    var sliderGroup = this._displayables.sliderGroup;\n    var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse;\n    // Transform barGroup.\n    sliderGroup.attr(orient === HORIZONTAL && !inverse ? {\n      scaleY: otherAxisInverse ? 1 : -1,\n      scaleX: 1\n    } : orient === HORIZONTAL && inverse ? {\n      scaleY: otherAxisInverse ? 1 : -1,\n      scaleX: -1\n    } : orient === VERTICAL && !inverse ? {\n      scaleY: otherAxisInverse ? -1 : 1,\n      scaleX: 1,\n      rotation: Math.PI / 2\n    }\n    // Don't use Math.PI, considering shadow direction.\n    : {\n      scaleY: otherAxisInverse ? -1 : 1,\n      scaleX: -1,\n      rotation: Math.PI / 2\n    });\n    // Position barGroup\n    var rect = thisGroup.getBoundingRect([sliderGroup]);\n    thisGroup.x = location.x - rect.x;\n    thisGroup.y = location.y - rect.y;\n    thisGroup.markRedraw();\n  };\n  SliderZoomView.prototype._getViewExtent = function () {\n    return [0, this._size[0]];\n  };\n  SliderZoomView.prototype._renderBackground = function () {\n    var dataZoomModel = this.dataZoomModel;\n    var size = this._size;\n    var barGroup = this._displayables.sliderGroup;\n    var brushSelect = dataZoomModel.get('brushSelect');\n    barGroup.add(new Rect({\n      silent: true,\n      shape: {\n        x: 0,\n        y: 0,\n        width: size[0],\n        height: size[1]\n      },\n      style: {\n        fill: dataZoomModel.get('backgroundColor')\n      },\n      z2: -40\n    }));\n    // Click panel, over shadow, below handles.\n    var clickPanel = new Rect({\n      shape: {\n        x: 0,\n        y: 0,\n        width: size[0],\n        height: size[1]\n      },\n      style: {\n        fill: 'transparent'\n      },\n      z2: 0,\n      onclick: bind(this._onClickPanel, this)\n    });\n    var zr = this.api.getZr();\n    if (brushSelect) {\n      clickPanel.on('mousedown', this._onBrushStart, this);\n      clickPanel.cursor = 'crosshair';\n      zr.on('mousemove', this._onBrush);\n      zr.on('mouseup', this._onBrushEnd);\n    } else {\n      zr.off('mousemove', this._onBrush);\n      zr.off('mouseup', this._onBrushEnd);\n    }\n    barGroup.add(clickPanel);\n  };\n  SliderZoomView.prototype._renderDataShadow = function () {\n    var info = this._dataShadowInfo = this._prepareDataShadowInfo();\n    this._displayables.dataShadowSegs = [];\n    if (!info) {\n      return;\n    }\n    var size = this._size;\n    var oldSize = this._shadowSize || [];\n    var seriesModel = info.series;\n    var data = seriesModel.getRawData();\n    var candlestickDim = seriesModel.getShadowDim && seriesModel.getShadowDim();\n    var otherDim = candlestickDim && data.getDimensionInfo(candlestickDim) ? seriesModel.getShadowDim() // @see candlestick\n    : info.otherDim;\n    if (otherDim == null) {\n      return;\n    }\n    var polygonPts = this._shadowPolygonPts;\n    var polylinePts = this._shadowPolylinePts;\n    // Not re-render if data doesn't change.\n    if (data !== this._shadowData || otherDim !== this._shadowDim || size[0] !== oldSize[0] || size[1] !== oldSize[1]) {\n      var thisDataExtent_1 = data.getDataExtent(info.thisDim);\n      var otherDataExtent_1 = data.getDataExtent(otherDim);\n      // Nice extent.\n      var otherOffset = (otherDataExtent_1[1] - otherDataExtent_1[0]) * 0.3;\n      otherDataExtent_1 = [otherDataExtent_1[0] - otherOffset, otherDataExtent_1[1] + otherOffset];\n      var otherShadowExtent_1 = [0, size[1]];\n      var thisShadowExtent = [0, size[0]];\n      var areaPoints_1 = [[size[0], 0], [0, 0]];\n      var linePoints_1 = [];\n      var step_1 = thisShadowExtent[1] / Math.max(1, data.count() - 1);\n      var normalizationConstant_1 = size[0] / (thisDataExtent_1[1] - thisDataExtent_1[0]);\n      var isTimeAxis_1 = info.thisAxis.type === 'time';\n      var thisCoord_1 = -step_1;\n      // Optimize for large data shadow\n      var stride_1 = Math.round(data.count() / size[0]);\n      var lastIsEmpty_1;\n      data.each([info.thisDim, otherDim], function (thisValue, otherValue, index) {\n        if (stride_1 > 0 && index % stride_1) {\n          if (!isTimeAxis_1) {\n            thisCoord_1 += step_1;\n          }\n          return;\n        }\n        thisCoord_1 = isTimeAxis_1 ? (+thisValue - thisDataExtent_1[0]) * normalizationConstant_1 : thisCoord_1 + step_1;\n        // FIXME\n        // Should consider axis.min/axis.max when drawing dataShadow.\n        // FIXME\n        // \u5E94\u8BE5\u4F7F\u7528\u7EDF\u4E00\u7684\u7A7A\u5224\u65AD\uFF1F\u8FD8\u662F\u5728list\u91CC\u8FDB\u884C\u7A7A\u5224\u65AD\uFF1F\n        var isEmpty = otherValue == null || isNaN(otherValue) || otherValue === '';\n        // See #4235.\n        var otherCoord = isEmpty ? 0 : linearMap(otherValue, otherDataExtent_1, otherShadowExtent_1, true);\n        // Attempt to draw data shadow precisely when there are empty value.\n        if (isEmpty && !lastIsEmpty_1 && index) {\n          areaPoints_1.push([areaPoints_1[areaPoints_1.length - 1][0], 0]);\n          linePoints_1.push([linePoints_1[linePoints_1.length - 1][0], 0]);\n        } else if (!isEmpty && lastIsEmpty_1) {\n          areaPoints_1.push([thisCoord_1, 0]);\n          linePoints_1.push([thisCoord_1, 0]);\n        }\n        if (!isEmpty) {\n          areaPoints_1.push([thisCoord_1, otherCoord]);\n          linePoints_1.push([thisCoord_1, otherCoord]);\n        }\n        lastIsEmpty_1 = isEmpty;\n      });\n      polygonPts = this._shadowPolygonPts = areaPoints_1;\n      polylinePts = this._shadowPolylinePts = linePoints_1;\n    }\n    this._shadowData = data;\n    this._shadowDim = otherDim;\n    this._shadowSize = [size[0], size[1]];\n    var dataZoomModel = this.dataZoomModel;\n    function createDataShadowGroup(isSelectedArea) {\n      var model = dataZoomModel.getModel(isSelectedArea ? 'selectedDataBackground' : 'dataBackground');\n      var group = new graphic.Group();\n      var polygon = new graphic.Polygon({\n        shape: {\n          points: polygonPts\n        },\n        segmentIgnoreThreshold: 1,\n        style: model.getModel('areaStyle').getAreaStyle(),\n        silent: true,\n        z2: -20\n      });\n      var polyline = new graphic.Polyline({\n        shape: {\n          points: polylinePts\n        },\n        segmentIgnoreThreshold: 1,\n        style: model.getModel('lineStyle').getLineStyle(),\n        silent: true,\n        z2: -19\n      });\n      group.add(polygon);\n      group.add(polyline);\n      return group;\n    }\n    // let dataBackgroundModel = dataZoomModel.getModel('dataBackground');\n    for (var i = 0; i < 3; i++) {\n      var group = createDataShadowGroup(i === 1);\n      this._displayables.sliderGroup.add(group);\n      this._displayables.dataShadowSegs.push(group);\n    }\n  };\n  SliderZoomView.prototype._prepareDataShadowInfo = function () {\n    var dataZoomModel = this.dataZoomModel;\n    var showDataShadow = dataZoomModel.get('showDataShadow');\n    if (showDataShadow === false) {\n      return;\n    }\n    // Find a representative series.\n    var result;\n    var ecModel = this.ecModel;\n    dataZoomModel.eachTargetAxis(function (axisDim, axisIndex) {\n      var seriesModels = dataZoomModel.getAxisProxy(axisDim, axisIndex).getTargetSeriesModels();\n      each(seriesModels, function (seriesModel) {\n        if (result) {\n          return;\n        }\n        if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) {\n          return;\n        }\n        var thisAxis = ecModel.getComponent(getAxisMainType(axisDim), axisIndex).axis;\n        var otherDim = getOtherDim(axisDim);\n        var otherAxisInverse;\n        var coordSys = seriesModel.coordinateSystem;\n        if (otherDim != null && coordSys.getOtherAxis) {\n          otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;\n        }\n        otherDim = seriesModel.getData().mapDimension(otherDim);\n        var thisDim = seriesModel.getData().mapDimension(axisDim);\n        result = {\n          thisAxis: thisAxis,\n          series: seriesModel,\n          thisDim: thisDim,\n          otherDim: otherDim,\n          otherAxisInverse: otherAxisInverse\n        };\n      }, this);\n    }, this);\n    return result;\n  };\n  SliderZoomView.prototype._renderHandle = function () {\n    var thisGroup = this.group;\n    var displayables = this._displayables;\n    var handles = displayables.handles = [null, null];\n    var handleLabels = displayables.handleLabels = [null, null];\n    var sliderGroup = this._displayables.sliderGroup;\n    var size = this._size;\n    var dataZoomModel = this.dataZoomModel;\n    var api = this.api;\n    var borderRadius = dataZoomModel.get('borderRadius') || 0;\n    var brushSelect = dataZoomModel.get('brushSelect');\n    var filler = displayables.filler = new Rect({\n      silent: brushSelect,\n      style: {\n        fill: dataZoomModel.get('fillerColor')\n      },\n      textConfig: {\n        position: 'inside'\n      }\n    });\n    sliderGroup.add(filler);\n    // Frame border.\n    sliderGroup.add(new Rect({\n      silent: true,\n      subPixelOptimize: true,\n      shape: {\n        x: 0,\n        y: 0,\n        width: size[0],\n        height: size[1],\n        r: borderRadius\n      },\n      style: {\n        // deprecated option\n        stroke: dataZoomModel.get('dataBackgroundColor') || dataZoomModel.get('borderColor'),\n        lineWidth: DEFAULT_FRAME_BORDER_WIDTH,\n        fill: tokens.color.transparent\n      }\n    }));\n    // Left and right handle to resize\n    each([0, 1], function (handleIndex) {\n      var iconStr = dataZoomModel.get('handleIcon');\n      if (!symbolBuildProxies[iconStr] && iconStr.indexOf('path://') < 0 && iconStr.indexOf('image://') < 0) {\n        // Compatitable with the old icon parsers. Which can use a path string without path://\n        iconStr = 'path://' + iconStr;\n        if (process.env.NODE_ENV !== 'production') {\n          deprecateLog('handleIcon now needs \\'path://\\' prefix when using a path string');\n        }\n      }\n      var path = createSymbol(iconStr, -1, 0, 2, 2, null, true);\n      path.attr({\n        cursor: getCursor(this._orient),\n        draggable: true,\n        drift: bind(this._onDragMove, this, handleIndex),\n        ondragend: bind(this._onDragEnd, this),\n        onmouseover: bind(this._showDataInfo, this, true),\n        onmouseout: bind(this._showDataInfo, this, false),\n        z2: 5\n      });\n      var bRect = path.getBoundingRect();\n      var handleSize = dataZoomModel.get('handleSize');\n      this._handleHeight = parsePercent(handleSize, this._size[1]);\n      this._handleWidth = bRect.width / bRect.height * this._handleHeight;\n      path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle());\n      path.style.strokeNoScale = true;\n      path.rectHover = true;\n      path.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'handleStyle']).getItemStyle();\n      enableHoverEmphasis(path);\n      var handleColor = dataZoomModel.get('handleColor'); // deprecated option\n      // Compatitable with previous version\n      if (handleColor != null) {\n        path.style.fill = handleColor;\n      }\n      sliderGroup.add(handles[handleIndex] = path);\n      var textStyleModel = dataZoomModel.getModel('textStyle');\n      var handleLabel = dataZoomModel.get('handleLabel') || {};\n      var handleLabelShow = handleLabel.show || false;\n      thisGroup.add(handleLabels[handleIndex] = new graphic.Text({\n        silent: true,\n        invisible: !handleLabelShow,\n        style: createTextStyle(textStyleModel, {\n          x: 0,\n          y: 0,\n          text: '',\n          verticalAlign: 'middle',\n          align: 'center',\n          fill: textStyleModel.getTextColor(),\n          font: textStyleModel.getFont()\n        }),\n        z2: 10\n      }));\n    }, this);\n    // Handle to move. Only visible when brushSelect is set true.\n    var actualMoveZone = filler;\n    if (brushSelect) {\n      var moveHandleHeight = parsePercent(dataZoomModel.get('moveHandleSize'), size[1]);\n      var moveHandle_1 = displayables.moveHandle = new graphic.Rect({\n        style: dataZoomModel.getModel('moveHandleStyle').getItemStyle(),\n        silent: true,\n        shape: {\n          r: [0, 0, 2, 2],\n          y: size[1] - 0.5,\n          height: moveHandleHeight\n        }\n      });\n      var iconSize = moveHandleHeight * 0.8;\n      var moveHandleIcon = displayables.moveHandleIcon = createSymbol(dataZoomModel.get('moveHandleIcon'), -iconSize / 2, -iconSize / 2, iconSize, iconSize, tokens.color.neutral00, true);\n      moveHandleIcon.silent = true;\n      moveHandleIcon.y = size[1] + moveHandleHeight / 2 - 0.5;\n      moveHandle_1.ensureState('emphasis').style = dataZoomModel.getModel(['emphasis', 'moveHandleStyle']).getItemStyle();\n      var moveZoneExpandSize = Math.min(size[1] / 2, Math.max(moveHandleHeight, 10));\n      actualMoveZone = displayables.moveZone = new graphic.Rect({\n        invisible: true,\n        shape: {\n          y: size[1] - moveZoneExpandSize,\n          height: moveHandleHeight + moveZoneExpandSize\n        }\n      });\n      actualMoveZone.on('mouseover', function () {\n        api.enterEmphasis(moveHandle_1);\n      }).on('mouseout', function () {\n        api.leaveEmphasis(moveHandle_1);\n      });\n      sliderGroup.add(moveHandle_1);\n      sliderGroup.add(moveHandleIcon);\n      sliderGroup.add(actualMoveZone);\n    }\n    actualMoveZone.attr({\n      draggable: true,\n      cursor: 'default',\n      drift: bind(this._onDragMove, this, 'all'),\n      ondragstart: bind(this._showDataInfo, this, true),\n      ondragend: bind(this._onDragEnd, this),\n      onmouseover: bind(this._showDataInfo, this, true),\n      onmouseout: bind(this._showDataInfo, this, false)\n    });\n  };\n  SliderZoomView.prototype._resetInterval = function () {\n    var range = this._range = this.dataZoomModel.getPercentRange();\n    var viewExtent = this._getViewExtent();\n    this._handleEnds = [linearMap(range[0], [0, 100], viewExtent, true), linearMap(range[1], [0, 100], viewExtent, true)];\n  };\n  SliderZoomView.prototype._updateInterval = function (handleIndex, delta) {\n    var dataZoomModel = this.dataZoomModel;\n    var handleEnds = this._handleEnds;\n    var viewExtend = this._getViewExtent();\n    var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();\n    var percentExtent = [0, 100];\n    sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null);\n    var lastRange = this._range;\n    var range = this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]);\n    return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1];\n  };\n  SliderZoomView.prototype._updateView = function (nonRealtime) {\n    var displaybles = this._displayables;\n    var handleEnds = this._handleEnds;\n    var handleInterval = asc(handleEnds.slice());\n    var size = this._size;\n    each([0, 1], function (handleIndex) {\n      // Handles\n      var handle = displaybles.handles[handleIndex];\n      var handleHeight = this._handleHeight;\n      handle.attr({\n        scaleX: handleHeight / 2,\n        scaleY: handleHeight / 2,\n        // This is a trick, by adding an extra tiny offset to let the default handle's end point align to the drag window.\n        // NOTE: It may affect some custom shapes a bit. But we prefer to have better result by default.\n        x: handleEnds[handleIndex] + (handleIndex ? -1 : 1),\n        y: size[1] / 2 - handleHeight / 2\n      });\n    }, this);\n    // Filler\n    displaybles.filler.setShape({\n      x: handleInterval[0],\n      y: 0,\n      width: handleInterval[1] - handleInterval[0],\n      height: size[1]\n    });\n    var viewExtent = {\n      x: handleInterval[0],\n      width: handleInterval[1] - handleInterval[0]\n    };\n    // Move handle\n    if (displaybles.moveHandle) {\n      displaybles.moveHandle.setShape(viewExtent);\n      displaybles.moveZone.setShape(viewExtent);\n      // Force update path on the invisible object\n      displaybles.moveZone.getBoundingRect();\n      displaybles.moveHandleIcon && displaybles.moveHandleIcon.attr('x', viewExtent.x + viewExtent.width / 2);\n    }\n    // update clip path of shadow.\n    var dataShadowSegs = displaybles.dataShadowSegs;\n    var segIntervals = [0, handleInterval[0], handleInterval[1], size[0]];\n    for (var i = 0; i < dataShadowSegs.length; i++) {\n      var segGroup = dataShadowSegs[i];\n      var clipPath = segGroup.getClipPath();\n      if (!clipPath) {\n        clipPath = new graphic.Rect();\n        segGroup.setClipPath(clipPath);\n      }\n      clipPath.setShape({\n        x: segIntervals[i],\n        y: 0,\n        width: segIntervals[i + 1] - segIntervals[i],\n        height: size[1]\n      });\n    }\n    this._updateDataInfo(nonRealtime);\n  };\n  SliderZoomView.prototype._updateDataInfo = function (nonRealtime) {\n    var dataZoomModel = this.dataZoomModel;\n    var displaybles = this._displayables;\n    var handleLabels = displaybles.handleLabels;\n    var orient = this._orient;\n    var labelTexts = ['', ''];\n    // FIXME\n    // date\u578B\uFF0C\u652F\u6301formatter\uFF0Cautoformatter\uFF08ec2 date.getAutoFormatter\uFF09\n    if (dataZoomModel.get('showDetail')) {\n      var axisProxy = dataZoomModel.findRepresentativeAxisProxy();\n      if (axisProxy) {\n        var axis = axisProxy.getAxisModel().axis;\n        var range = this._range;\n        var dataInterval = nonRealtime\n        // See #4434, data and axis are not processed and reset yet in non-realtime mode.\n        ? axisProxy.calculateDataWindow({\n          start: range[0],\n          end: range[1]\n        }).valueWindow : axisProxy.getDataValueWindow();\n        labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)];\n      }\n    }\n    var orderedHandleEnds = asc(this._handleEnds.slice());\n    setLabel.call(this, 0);\n    setLabel.call(this, 1);\n    function setLabel(handleIndex) {\n      // Label\n      // Text should not transform by barGroup.\n      // Ignore handlers transform\n      var barTransform = graphic.getTransform(displaybles.handles[handleIndex].parent, this.group);\n      var direction = graphic.transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform);\n      var offset = this._handleWidth / 2 + LABEL_GAP;\n      var textPoint = graphic.applyTransform([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform);\n      handleLabels[handleIndex].setStyle({\n        x: textPoint[0],\n        y: textPoint[1],\n        verticalAlign: orient === HORIZONTAL ? 'middle' : direction,\n        align: orient === HORIZONTAL ? direction : 'center',\n        text: labelTexts[handleIndex]\n      });\n    }\n  };\n  SliderZoomView.prototype._formatLabel = function (value, axis) {\n    var dataZoomModel = this.dataZoomModel;\n    var labelFormatter = dataZoomModel.get('labelFormatter');\n    var labelPrecision = dataZoomModel.get('labelPrecision');\n    if (labelPrecision == null || labelPrecision === 'auto') {\n      labelPrecision = axis.getPixelPrecision();\n    }\n    var valueStr = value == null || isNaN(value) ? ''\n    // FIXME Glue code\n    : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel({\n      value: Math.round(value)\n    })\n    // param of toFixed should less then 20.\n    : value.toFixed(Math.min(labelPrecision, 20));\n    return isFunction(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr;\n  };\n  /**\n   * @param isEmphasis true: show, false: hide\n   */\n  SliderZoomView.prototype._showDataInfo = function (isEmphasis) {\n    var handleLabel = this.dataZoomModel.get('handleLabel') || {};\n    var normalShow = handleLabel.show || false;\n    var emphasisHandleLabel = this.dataZoomModel.getModel(['emphasis', 'handleLabel']);\n    var emphasisShow = emphasisHandleLabel.get('show') || false;\n    // Dragging is considered as emphasis, unless emphasisShow is false\n    var toShow = isEmphasis || this._dragging ? emphasisShow : normalShow;\n    var displayables = this._displayables;\n    var handleLabels = displayables.handleLabels;\n    handleLabels[0].attr('invisible', !toShow);\n    handleLabels[1].attr('invisible', !toShow);\n    // Highlight move handle\n    displayables.moveHandle && this.api[toShow ? 'enterEmphasis' : 'leaveEmphasis'](displayables.moveHandle, 1);\n  };\n  SliderZoomView.prototype._onDragMove = function (handleIndex, dx, dy, event) {\n    this._dragging = true;\n    // For mobile device, prevent screen slider on the button.\n    eventTool.stop(event.event);\n    // Transform dx, dy to bar coordination.\n    var barTransform = this._displayables.sliderGroup.getLocalTransform();\n    var vertex = graphic.applyTransform([dx, dy], barTransform, true);\n    var changed = this._updateInterval(handleIndex, vertex[0]);\n    var realtime = this.dataZoomModel.get('realtime');\n    this._updateView(!realtime);\n    // Avoid dispatch dataZoom repeatly but range not changed,\n    // which cause bad visual effect when progressive enabled.\n    changed && realtime && this._dispatchZoomAction(true);\n  };\n  SliderZoomView.prototype._onDragEnd = function () {\n    this._dragging = false;\n    this._showDataInfo(false);\n    // While in realtime mode and stream mode, dispatch action when\n    // drag end will cause the whole view rerender, which is unnecessary.\n    var realtime = this.dataZoomModel.get('realtime');\n    !realtime && this._dispatchZoomAction(false);\n  };\n  SliderZoomView.prototype._onClickPanel = function (e) {\n    var size = this._size;\n    var localPoint = this._displayables.sliderGroup.transformCoordToLocal(e.offsetX, e.offsetY);\n    if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) {\n      return;\n    }\n    var handleEnds = this._handleEnds;\n    var center = (handleEnds[0] + handleEnds[1]) / 2;\n    var changed = this._updateInterval('all', localPoint[0] - center);\n    this._updateView();\n    changed && this._dispatchZoomAction(false);\n  };\n  SliderZoomView.prototype._onBrushStart = function (e) {\n    var x = e.offsetX;\n    var y = e.offsetY;\n    this._brushStart = new graphic.Point(x, y);\n    this._brushing = true;\n    this._brushStartTime = +new Date();\n    // this._updateBrushRect(x, y);\n  };\n  SliderZoomView.prototype._onBrushEnd = function (e) {\n    if (!this._brushing) {\n      return;\n    }\n    var brushRect = this._displayables.brushRect;\n    this._brushing = false;\n    if (!brushRect) {\n      return;\n    }\n    brushRect.attr('ignore', true);\n    var brushShape = brushRect.shape;\n    var brushEndTime = +new Date();\n    // console.log(brushEndTime - this._brushStartTime);\n    if (brushEndTime - this._brushStartTime < 200 && Math.abs(brushShape.width) < 5) {\n      // Will treat it as a click\n      return;\n    }\n    var viewExtend = this._getViewExtent();\n    var percentExtent = [0, 100];\n    var handleEnds = this._handleEnds = [brushShape.x, brushShape.x + brushShape.width];\n    var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();\n    // Restrict range.\n    sliderMove(0, handleEnds, viewExtend, 0, minMaxSpan.minSpan != null ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null);\n    this._range = asc([linearMap(handleEnds[0], viewExtend, percentExtent, true), linearMap(handleEnds[1], viewExtend, percentExtent, true)]);\n    this._updateView();\n    this._dispatchZoomAction(false);\n  };\n  SliderZoomView.prototype._onBrush = function (e) {\n    if (this._brushing) {\n      // For mobile device, prevent screen slider on the button.\n      eventTool.stop(e.event);\n      this._updateBrushRect(e.offsetX, e.offsetY);\n    }\n  };\n  SliderZoomView.prototype._updateBrushRect = function (mouseX, mouseY) {\n    var displayables = this._displayables;\n    var dataZoomModel = this.dataZoomModel;\n    var brushRect = displayables.brushRect;\n    if (!brushRect) {\n      brushRect = displayables.brushRect = new Rect({\n        silent: true,\n        style: dataZoomModel.getModel('brushStyle').getItemStyle()\n      });\n      displayables.sliderGroup.add(brushRect);\n    }\n    brushRect.attr('ignore', false);\n    var brushStart = this._brushStart;\n    var sliderGroup = this._displayables.sliderGroup;\n    var endPoint = sliderGroup.transformCoordToLocal(mouseX, mouseY);\n    var startPoint = sliderGroup.transformCoordToLocal(brushStart.x, brushStart.y);\n    var size = this._size;\n    endPoint[0] = Math.max(Math.min(size[0], endPoint[0]), 0);\n    brushRect.setShape({\n      x: startPoint[0],\n      y: 0,\n      width: endPoint[0] - startPoint[0],\n      height: size[1]\n    });\n  };\n  /**\n   * This action will be throttled.\n   */\n  SliderZoomView.prototype._dispatchZoomAction = function (realtime) {\n    var range = this._range;\n    this.api.dispatchAction({\n      type: 'dataZoom',\n      from: this.uid,\n      dataZoomId: this.dataZoomModel.id,\n      animation: realtime ? REALTIME_ANIMATION_CONFIG : null,\n      start: range[0],\n      end: range[1]\n    });\n  };\n  SliderZoomView.prototype._findCoordRect = function () {\n    // Find the grid corresponding to the first axis referred by dataZoom.\n    var rect;\n    var coordSysInfoList = collectReferCoordSysModelInfo(this.dataZoomModel).infoList;\n    if (!rect && coordSysInfoList.length) {\n      var coordSys = coordSysInfoList[0].model.coordinateSystem;\n      rect = coordSys.getRect && coordSys.getRect();\n    }\n    if (!rect) {\n      var width = this.api.getWidth();\n      var height = this.api.getHeight();\n      rect = {\n        x: width * 0.2,\n        y: height * 0.2,\n        width: width * 0.6,\n        height: height * 0.6\n      };\n    }\n    return rect;\n  };\n  SliderZoomView.type = 'dataZoom.slider';\n  return SliderZoomView;\n}(DataZoomView);\nfunction getOtherDim(thisDim) {\n  // FIXME\n  // \u8FD9\u4E2A\u903B\u8F91\u548CgetOtherAxis\u91CC\u4E00\u81F4\uFF0C\u4F46\u662F\u5199\u5728\u8FD9\u91CC\u662F\u5426\u4E0D\u597D\n  var map = {\n    x: 'y',\n    y: 'x',\n    radius: 'angle',\n    angle: 'radius'\n  };\n  return map[thisDim];\n}\nfunction getCursor(orient) {\n  return orient === 'vertical' ? 'ns-resize' : 'ew-resize';\n}\nexport default SliderZoomView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport SliderZoomModel from './SliderZoomModel.js';\nimport SliderZoomView from './SliderZoomView.js';\nimport installCommon from './installCommon.js';\nexport function install(registers) {\n  registers.registerComponentModel(SliderZoomModel);\n  registers.registerComponentView(SliderZoomView);\n  installCommon(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport { install as installDataZoomInside } from './installDataZoomInside.js';\nimport { install as installDataZoomSlider } from './installDataZoomSlider.js';\nexport function install(registers) {\n  use(installDataZoomInside);\n  use(installDataZoomSlider);\n  // Do not install './dataZoomSelect',\n  // since it only work for toolbox dataZoom.\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n/**\n * @file Visual mapping.\n */\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport tokens from './tokens.js';\nvar visualDefault = {\n  /**\n   * @public\n   */\n  get: function (visualType, key, isCategory) {\n    var value = zrUtil.clone((defaultOption[visualType] || {})[key]);\n    return isCategory ? zrUtil.isArray(value) ? value[value.length - 1] : value : value;\n  }\n};\nvar defaultOption = {\n  color: {\n    active: ['#006edd', '#e0ffff'],\n    inactive: [tokens.color.transparent]\n  },\n  colorHue: {\n    active: [0, 360],\n    inactive: [0, 0]\n  },\n  colorSaturation: {\n    active: [0.3, 1],\n    inactive: [0, 0]\n  },\n  colorLightness: {\n    active: [0.9, 0.5],\n    inactive: [0, 0]\n  },\n  colorAlpha: {\n    active: [0.3, 1],\n    inactive: [0, 0]\n  },\n  opacity: {\n    active: [0.3, 1],\n    inactive: [0, 0]\n  },\n  symbol: {\n    active: ['circle', 'roundRect', 'diamond'],\n    inactive: ['none']\n  },\n  symbolSize: {\n    active: [10, 50],\n    inactive: [0, 0]\n  }\n};\nexport default visualDefault;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport visualDefault from '../../visual/visualDefault.js';\nimport VisualMapping from '../../visual/VisualMapping.js';\nimport * as visualSolution from '../../visual/visualSolution.js';\nimport * as modelUtil from '../../util/model.js';\nimport * as numberUtil from '../../util/number.js';\nimport ComponentModel from '../../model/Component.js';\nimport tokens from '../../visual/tokens.js';\nvar mapVisual = VisualMapping.mapVisual;\nvar eachVisual = VisualMapping.eachVisual;\nvar isArray = zrUtil.isArray;\nvar each = zrUtil.each;\nvar asc = numberUtil.asc;\nvar linearMap = numberUtil.linearMap;\nvar VisualMapModel = /** @class */function (_super) {\n  __extends(VisualMapModel, _super);\n  function VisualMapModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = VisualMapModel.type;\n    _this.stateList = ['inRange', 'outOfRange'];\n    _this.replacableOptionKeys = ['inRange', 'outOfRange', 'target', 'controller', 'color'];\n    _this.layoutMode = {\n      type: 'box',\n      ignoreSize: true\n    };\n    /**\n     * [lowerBound, upperBound]\n     */\n    _this.dataBound = [-Infinity, Infinity];\n    _this.targetVisuals = {};\n    _this.controllerVisuals = {};\n    return _this;\n  }\n  VisualMapModel.prototype.init = function (option, parentModel, ecModel) {\n    this.mergeDefaultAndTheme(option, ecModel);\n  };\n  /**\n   * @protected\n   */\n  VisualMapModel.prototype.optionUpdated = function (newOption, isInit) {\n    var thisOption = this.option;\n    !isInit && visualSolution.replaceVisualOption(thisOption, newOption, this.replacableOptionKeys);\n    this.textStyleModel = this.getModel('textStyle');\n    this.resetItemSize();\n    this.completeVisualOption();\n  };\n  /**\n   * @protected\n   */\n  VisualMapModel.prototype.resetVisual = function (supplementVisualOption) {\n    var stateList = this.stateList;\n    supplementVisualOption = zrUtil.bind(supplementVisualOption, this);\n    this.controllerVisuals = visualSolution.createVisualMappings(this.option.controller, stateList, supplementVisualOption);\n    this.targetVisuals = visualSolution.createVisualMappings(this.option.target, stateList, supplementVisualOption);\n  };\n  /**\n   * @public\n   */\n  VisualMapModel.prototype.getItemSymbol = function () {\n    return null;\n  };\n  /**\n   * @return An array of series indices.\n   */\n  VisualMapModel.prototype.getTargetSeriesIndices = function () {\n    var optionSeriesId = this.option.seriesId;\n    var optionSeriesIndex = this.option.seriesIndex;\n    if (optionSeriesIndex == null && optionSeriesId == null) {\n      optionSeriesIndex = 'all';\n    }\n    var seriesModels = modelUtil.queryReferringComponents(this.ecModel, 'series', {\n      index: optionSeriesIndex,\n      id: optionSeriesId\n    }, {\n      useDefault: false,\n      enableAll: true,\n      enableNone: false\n    }).models;\n    return zrUtil.map(seriesModels, function (seriesModel) {\n      return seriesModel.componentIndex;\n    });\n  };\n  /**\n   * @public\n   */\n  VisualMapModel.prototype.eachTargetSeries = function (callback, context) {\n    zrUtil.each(this.getTargetSeriesIndices(), function (seriesIndex) {\n      var seriesModel = this.ecModel.getSeriesByIndex(seriesIndex);\n      if (seriesModel) {\n        callback.call(context, seriesModel);\n      }\n    }, this);\n  };\n  /**\n   * @pubilc\n   */\n  VisualMapModel.prototype.isTargetSeries = function (seriesModel) {\n    var is = false;\n    this.eachTargetSeries(function (model) {\n      model === seriesModel && (is = true);\n    });\n    return is;\n  };\n  /**\n   * @example\n   * this.formatValueText(someVal); // format single numeric value to text.\n   * this.formatValueText(someVal, true); // format single category value to text.\n   * this.formatValueText([min, max]); // format numeric min-max to text.\n   * this.formatValueText([this.dataBound[0], max]); // using data lower bound.\n   * this.formatValueText([min, this.dataBound[1]]); // using data upper bound.\n   *\n   * @param value Real value, or this.dataBound[0 or 1].\n   * @param isCategory Only available when value is number.\n   * @param edgeSymbols Open-close symbol when value is interval.\n   * @protected\n   */\n  VisualMapModel.prototype.formatValueText = function (value, isCategory, edgeSymbols) {\n    var option = this.option;\n    var precision = option.precision;\n    var dataBound = this.dataBound;\n    var formatter = option.formatter;\n    var isMinMax;\n    edgeSymbols = edgeSymbols || ['<', '>'];\n    if (zrUtil.isArray(value)) {\n      value = value.slice();\n      isMinMax = true;\n    }\n    var textValue = isCategory ? value // Value is string when isCategory\n    : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value);\n    if (zrUtil.isString(formatter)) {\n      return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue);\n    } else if (zrUtil.isFunction(formatter)) {\n      return isMinMax ? formatter(value[0], value[1]) : formatter(value);\n    }\n    if (isMinMax) {\n      if (value[0] === dataBound[0]) {\n        return edgeSymbols[0] + ' ' + textValue[1];\n      } else if (value[1] === dataBound[1]) {\n        return edgeSymbols[1] + ' ' + textValue[0];\n      } else {\n        return textValue[0] + ' - ' + textValue[1];\n      }\n    } else {\n      // Format single value (includes category case).\n      return textValue;\n    }\n    function toFixed(val) {\n      return val === dataBound[0] ? 'min' : val === dataBound[1] ? 'max' : (+val).toFixed(Math.min(precision, 20));\n    }\n  };\n  /**\n   * @protected\n   */\n  VisualMapModel.prototype.resetExtent = function () {\n    var thisOption = this.option;\n    // Can not calculate data extent by data here.\n    // Because series and data may be modified in processing stage.\n    // So we do not support the feature \"auto min/max\".\n    var extent = asc([thisOption.min, thisOption.max]);\n    this._dataExtent = extent;\n  };\n  /**\n   * PENDING:\n   * delete this method if no outer usage.\n   *\n   * Return  Concrete dimension. If null/undefined is returned, no dimension is used.\n   */\n  // getDataDimension(data: SeriesData) {\n  //     const optDim = this.option.dimension;\n  //     if (optDim != null) {\n  //         return data.getDimension(optDim);\n  //     }\n  //     const dimNames = data.dimensions;\n  //     for (let i = dimNames.length - 1; i >= 0; i--) {\n  //         const dimName = dimNames[i];\n  //         const dimInfo = data.getDimensionInfo(dimName);\n  //         if (!dimInfo.isCalculationCoord) {\n  //             return dimName;\n  //         }\n  //     }\n  // }\n  VisualMapModel.prototype.getDataDimensionIndex = function (data) {\n    var optDim = this.option.dimension;\n    if (optDim != null) {\n      return data.getDimensionIndex(optDim);\n    }\n    var dimNames = data.dimensions;\n    for (var i = dimNames.length - 1; i >= 0; i--) {\n      var dimName = dimNames[i];\n      var dimInfo = data.getDimensionInfo(dimName);\n      if (!dimInfo.isCalculationCoord) {\n        return dimInfo.storeDimIndex;\n      }\n    }\n  };\n  VisualMapModel.prototype.getExtent = function () {\n    return this._dataExtent.slice();\n  };\n  VisualMapModel.prototype.completeVisualOption = function () {\n    var ecModel = this.ecModel;\n    var thisOption = this.option;\n    var base = {\n      inRange: thisOption.inRange,\n      outOfRange: thisOption.outOfRange\n    };\n    var target = thisOption.target || (thisOption.target = {});\n    var controller = thisOption.controller || (thisOption.controller = {});\n    zrUtil.merge(target, base); // Do not override\n    zrUtil.merge(controller, base); // Do not override\n    var isCategory = this.isCategory();\n    completeSingle.call(this, target);\n    completeSingle.call(this, controller);\n    completeInactive.call(this, target, 'inRange', 'outOfRange');\n    // completeInactive.call(this, target, 'outOfRange', 'inRange');\n    completeController.call(this, controller);\n    function completeSingle(base) {\n      // Compatible with ec2 dataRange.color.\n      // The mapping order of dataRange.color is: [high value, ..., low value]\n      // whereas inRange.color and outOfRange.color is [low value, ..., high value]\n      // Notice: ec2 has no inverse.\n      if (isArray(thisOption.color)\n      // If there has been inRange: {symbol: ...}, adding color is a mistake.\n      // So adding color only when no inRange defined.\n      && !base.inRange) {\n        base.inRange = {\n          color: thisOption.color.slice().reverse()\n        };\n      }\n      // Compatible with previous logic, always give a default color, otherwise\n      // simple config with no inRange and outOfRange will not work.\n      // Originally we use visualMap.color as the default color, but setOption at\n      // the second time the default color will be erased. So we change to use\n      // constant DEFAULT_COLOR.\n      // If user do not want the default color, set inRange: {color: null}.\n      base.inRange = base.inRange || {\n        color: ecModel.get('gradientColor')\n      };\n    }\n    function completeInactive(base, stateExist, stateAbsent) {\n      var optExist = base[stateExist];\n      var optAbsent = base[stateAbsent];\n      if (optExist && !optAbsent) {\n        optAbsent = base[stateAbsent] = {};\n        each(optExist, function (visualData, visualType) {\n          if (!VisualMapping.isValidType(visualType)) {\n            return;\n          }\n          var defa = visualDefault.get(visualType, 'inactive', isCategory);\n          if (defa != null) {\n            optAbsent[visualType] = defa;\n            // Compatibable with ec2:\n            // Only inactive color to rgba(0,0,0,0) can not\n            // make label transparent, so use opacity also.\n            if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) {\n              optAbsent.opacity = [0, 0];\n            }\n          }\n        });\n      }\n    }\n    function completeController(controller) {\n      var symbolExists = (controller.inRange || {}).symbol || (controller.outOfRange || {}).symbol;\n      var symbolSizeExists = (controller.inRange || {}).symbolSize || (controller.outOfRange || {}).symbolSize;\n      var inactiveColor = this.get('inactiveColor');\n      var itemSymbol = this.getItemSymbol();\n      var defaultSymbol = itemSymbol || 'roundRect';\n      each(this.stateList, function (state) {\n        var itemSize = this.itemSize;\n        var visuals = controller[state];\n        // Set inactive color for controller if no other color\n        // attr (like colorAlpha) specified.\n        if (!visuals) {\n          visuals = controller[state] = {\n            color: isCategory ? inactiveColor : [inactiveColor]\n          };\n        }\n        // Consistent symbol and symbolSize if not specified.\n        if (visuals.symbol == null) {\n          visuals.symbol = symbolExists && zrUtil.clone(symbolExists) || (isCategory ? defaultSymbol : [defaultSymbol]);\n        }\n        if (visuals.symbolSize == null) {\n          visuals.symbolSize = symbolSizeExists && zrUtil.clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]);\n        }\n        // Filter none\n        visuals.symbol = mapVisual(visuals.symbol, function (symbol) {\n          return symbol === 'none' ? defaultSymbol : symbol;\n        });\n        // Normalize symbolSize\n        var symbolSize = visuals.symbolSize;\n        if (symbolSize != null) {\n          var max_1 = -Infinity;\n          // symbolSize can be object when categories defined.\n          eachVisual(symbolSize, function (value) {\n            value > max_1 && (max_1 = value);\n          });\n          visuals.symbolSize = mapVisual(symbolSize, function (value) {\n            return linearMap(value, [0, max_1], [0, itemSize[0]], true);\n          });\n        }\n      }, this);\n    }\n  };\n  VisualMapModel.prototype.resetItemSize = function () {\n    this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))];\n  };\n  VisualMapModel.prototype.isCategory = function () {\n    return !!this.option.categories;\n  };\n  /**\n   * @public\n   * @abstract\n   */\n  VisualMapModel.prototype.setSelected = function (selected) {};\n  VisualMapModel.prototype.getSelected = function () {\n    return null;\n  };\n  /**\n   * @public\n   * @abstract\n   */\n  VisualMapModel.prototype.getValueState = function (value) {\n    return null;\n  };\n  /**\n   * FIXME\n   * Do not publish to thirt-part-dev temporarily\n   * util the interface is stable. (Should it return\n   * a function but not visual meta?)\n   *\n   * @pubilc\n   * @abstract\n   * @param getColorVisual\n   *        params: value, valueState\n   *        return: color\n   * @return {Object} visualMeta\n   *        should includes {stops, outerColors}\n   *        outerColor means [colorBeyondMinValue, colorBeyondMaxValue]\n   */\n  VisualMapModel.prototype.getVisualMeta = function (getColorVisual) {\n    return null;\n  };\n  VisualMapModel.type = 'visualMap';\n  VisualMapModel.dependencies = ['series'];\n  VisualMapModel.defaultOption = {\n    show: true,\n    // zlevel: 0,\n    z: 4,\n    // seriesIndex: 'all',\n    min: 0,\n    max: 200,\n    left: 0,\n    right: null,\n    top: null,\n    bottom: 0,\n    itemWidth: null,\n    itemHeight: null,\n    inverse: false,\n    orient: 'vertical',\n    backgroundColor: tokens.color.transparent,\n    borderColor: tokens.color.borderTint,\n    contentColor: tokens.color.theme[0],\n    inactiveColor: tokens.color.disabled,\n    borderWidth: 0,\n    padding: tokens.size.m,\n    // \u63A5\u53D7\u6570\u7EC4\u5206\u522B\u8BBE\u5B9A\u4E0A\u53F3\u4E0B\u5DE6\u8FB9\u8DDD\uFF0C\u540Ccss\n    textGap: 10,\n    precision: 0,\n    textStyle: {\n      color: tokens.color.secondary // \u503C\u57DF\u6587\u5B57\u989C\u8272\n    }\n  };\n  return VisualMapModel;\n}(ComponentModel);\nexport default VisualMapModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport VisualMapModel from './VisualMapModel.js';\nimport * as numberUtil from '../../util/number.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nimport tokens from '../../visual/tokens.js';\n// Constant\nvar DEFAULT_BAR_BOUND = [20, 140];\nvar ContinuousModel = /** @class */function (_super) {\n  __extends(ContinuousModel, _super);\n  function ContinuousModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ContinuousModel.type;\n    return _this;\n  }\n  /**\n   * @override\n   */\n  ContinuousModel.prototype.optionUpdated = function (newOption, isInit) {\n    _super.prototype.optionUpdated.apply(this, arguments);\n    this.resetExtent();\n    this.resetVisual(function (mappingOption) {\n      mappingOption.mappingMethod = 'linear';\n      mappingOption.dataExtent = this.getExtent();\n    });\n    this._resetRange();\n  };\n  /**\n   * @protected\n   * @override\n   */\n  ContinuousModel.prototype.resetItemSize = function () {\n    _super.prototype.resetItemSize.apply(this, arguments);\n    var itemSize = this.itemSize;\n    (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]);\n    (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]);\n  };\n  /**\n   * @private\n   */\n  ContinuousModel.prototype._resetRange = function () {\n    var dataExtent = this.getExtent();\n    var range = this.option.range;\n    if (!range || range.auto) {\n      // `range` should always be array (so we don't use other\n      // value like 'auto') for user-friend. (consider getOption).\n      dataExtent.auto = 1;\n      this.option.range = dataExtent;\n    } else if (zrUtil.isArray(range)) {\n      if (range[0] > range[1]) {\n        range.reverse();\n      }\n      range[0] = Math.max(range[0], dataExtent[0]);\n      range[1] = Math.min(range[1], dataExtent[1]);\n    }\n  };\n  /**\n   * @protected\n   * @override\n   */\n  ContinuousModel.prototype.completeVisualOption = function () {\n    _super.prototype.completeVisualOption.apply(this, arguments);\n    zrUtil.each(this.stateList, function (state) {\n      var symbolSize = this.option.controller[state].symbolSize;\n      if (symbolSize && symbolSize[0] !== symbolSize[1]) {\n        symbolSize[0] = symbolSize[1] / 3; // For good looking.\n      }\n    }, this);\n  };\n  /**\n   * @override\n   */\n  ContinuousModel.prototype.setSelected = function (selected) {\n    this.option.range = selected.slice();\n    this._resetRange();\n  };\n  /**\n   * @public\n   */\n  ContinuousModel.prototype.getSelected = function () {\n    var dataExtent = this.getExtent();\n    var dataInterval = numberUtil.asc((this.get('range') || []).slice());\n    // Clamp\n    dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]);\n    dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]);\n    dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]);\n    dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]);\n    return dataInterval;\n  };\n  /**\n   * @override\n   */\n  ContinuousModel.prototype.getValueState = function (value) {\n    var range = this.option.range;\n    var dataExtent = this.getExtent();\n    var unboundedRange = zrUtil.retrieve2(this.option.unboundedRange, true);\n    return (unboundedRange && range[0] <= dataExtent[0] || range[0] <= value) && (unboundedRange && range[1] >= dataExtent[1] || value <= range[1]) ? 'inRange' : 'outOfRange';\n  };\n  ContinuousModel.prototype.findTargetDataIndices = function (range) {\n    var result = [];\n    this.eachTargetSeries(function (seriesModel) {\n      var dataIndices = [];\n      var data = seriesModel.getData();\n      data.each(this.getDataDimensionIndex(data), function (value, dataIndex) {\n        range[0] <= value && value <= range[1] && dataIndices.push(dataIndex);\n      }, this);\n      result.push({\n        seriesId: seriesModel.id,\n        dataIndex: dataIndices\n      });\n    }, this);\n    return result;\n  };\n  /**\n   * @implement\n   */\n  ContinuousModel.prototype.getVisualMeta = function (getColorVisual) {\n    var oVals = getColorStopValues(this, 'outOfRange', this.getExtent());\n    var iVals = getColorStopValues(this, 'inRange', this.option.range.slice());\n    var stops = [];\n    function setStop(value, valueState) {\n      stops.push({\n        value: value,\n        color: getColorVisual(value, valueState)\n      });\n    }\n    // Format to: outOfRange -- inRange -- outOfRange.\n    var iIdx = 0;\n    var oIdx = 0;\n    var iLen = iVals.length;\n    var oLen = oVals.length;\n    for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) {\n      // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored.\n      if (oVals[oIdx] < iVals[iIdx]) {\n        setStop(oVals[oIdx], 'outOfRange');\n      }\n    }\n    for (var first = 1; iIdx < iLen; iIdx++, first = 0) {\n      // If range is full, value beyond min, max will be clamped.\n      // make a singularity\n      first && stops.length && setStop(iVals[iIdx], 'outOfRange');\n      setStop(iVals[iIdx], 'inRange');\n    }\n    for (var first = 1; oIdx < oLen; oIdx++) {\n      if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) {\n        // make a singularity\n        if (first) {\n          stops.length && setStop(stops[stops.length - 1].value, 'outOfRange');\n          first = 0;\n        }\n        setStop(oVals[oIdx], 'outOfRange');\n      }\n    }\n    var stopsLen = stops.length;\n    return {\n      stops: stops,\n      outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent']\n    };\n  };\n  ContinuousModel.type = 'visualMap.continuous';\n  ContinuousModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, {\n    align: 'auto',\n    calculable: false,\n    hoverLink: true,\n    realtime: true,\n    handleIcon: 'path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z',\n    handleSize: '120%',\n    handleStyle: {\n      borderColor: tokens.color.neutral00,\n      borderWidth: 1\n    },\n    indicatorIcon: 'circle',\n    indicatorSize: '50%',\n    indicatorStyle: {\n      borderColor: tokens.color.neutral00,\n      borderWidth: 2,\n      shadowBlur: 2,\n      shadowOffsetX: 1,\n      shadowOffsetY: 1,\n      shadowColor: tokens.color.shadow\n    }\n    // emphasis: {\n    //     handleStyle: {\n    //         shadowBlur: 3,\n    //         shadowOffsetX: 1,\n    //         shadowOffsetY: 1,\n    //         shadowColor: tokens.color.shadow\n    //     }\n    // }\n  });\n  return ContinuousModel;\n}(VisualMapModel);\nfunction getColorStopValues(visualMapModel, valueState, dataExtent) {\n  if (dataExtent[0] === dataExtent[1]) {\n    return dataExtent.slice();\n  }\n  // When using colorHue mapping, it is not linear color any more.\n  // Moreover, canvas gradient seems not to be accurate linear.\n  // FIXME\n  // Should be arbitrary value 100? or based on pixel size?\n  var count = 200;\n  var step = (dataExtent[1] - dataExtent[0]) / count;\n  var value = dataExtent[0];\n  var stopValues = [];\n  for (var i = 0; i <= count && value < dataExtent[1]; i++) {\n    stopValues.push(value);\n    value += step;\n  }\n  stopValues.push(dataExtent[1]);\n  return stopValues;\n}\nexport default ContinuousModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { Rect } from '../../util/graphic.js';\nimport * as formatUtil from '../../util/format.js';\nimport * as layout from '../../util/layout.js';\nimport VisualMapping from '../../visual/VisualMapping.js';\nimport ComponentView from '../../view/Component.js';\nvar VisualMapView = /** @class */function (_super) {\n  __extends(VisualMapView, _super);\n  function VisualMapView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = VisualMapView.type;\n    _this.autoPositionValues = {\n      left: 1,\n      right: 1,\n      top: 1,\n      bottom: 1\n    };\n    return _this;\n  }\n  VisualMapView.prototype.init = function (ecModel, api) {\n    this.ecModel = ecModel;\n    this.api = api;\n  };\n  /**\n   * @protected\n   */\n  VisualMapView.prototype.render = function (visualMapModel, ecModel, api, payload // TODO: TYPE\n  ) {\n    this.visualMapModel = visualMapModel;\n    if (visualMapModel.get('show') === false) {\n      this.group.removeAll();\n      return;\n    }\n    this.doRender(visualMapModel, ecModel, api, payload);\n  };\n  /**\n   * @protected\n   */\n  VisualMapView.prototype.renderBackground = function (group) {\n    var visualMapModel = this.visualMapModel;\n    var padding = formatUtil.normalizeCssArray(visualMapModel.get('padding') || 0);\n    var rect = group.getBoundingRect();\n    group.add(new Rect({\n      z2: -1,\n      silent: true,\n      shape: {\n        x: rect.x - padding[3],\n        y: rect.y - padding[0],\n        width: rect.width + padding[3] + padding[1],\n        height: rect.height + padding[0] + padding[2]\n      },\n      style: {\n        fill: visualMapModel.get('backgroundColor'),\n        stroke: visualMapModel.get('borderColor'),\n        lineWidth: visualMapModel.get('borderWidth')\n      }\n    }));\n  };\n  /**\n   * @protected\n   * @param targetValue can be Infinity or -Infinity\n   * @param visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize'\n   * @param opts\n   * @param opts.forceState Specify state, instead of using getValueState method.\n   * @param opts.convertOpacityToAlpha For color gradient in controller widget.\n   * @return {*} Visual value.\n   */\n  VisualMapView.prototype.getControllerVisual = function (targetValue, visualCluster, opts) {\n    opts = opts || {};\n    var forceState = opts.forceState;\n    var visualMapModel = this.visualMapModel;\n    var visualObj = {};\n    // Default values.\n    if (visualCluster === 'color') {\n      var defaultColor = visualMapModel.get('contentColor');\n      visualObj.color = defaultColor;\n    }\n    function getter(key) {\n      return visualObj[key];\n    }\n    function setter(key, value) {\n      visualObj[key] = value;\n    }\n    var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)];\n    var visualTypes = VisualMapping.prepareVisualTypes(mappings);\n    zrUtil.each(visualTypes, function (type) {\n      var visualMapping = mappings[type];\n      if (opts.convertOpacityToAlpha && type === 'opacity') {\n        type = 'colorAlpha';\n        visualMapping = mappings.__alphaForOpacity;\n      }\n      if (VisualMapping.dependsOn(type, visualCluster)) {\n        visualMapping && visualMapping.applyVisual(targetValue, getter, setter);\n      }\n    });\n    return visualObj[visualCluster];\n  };\n  VisualMapView.prototype.positionGroup = function (group) {\n    var model = this.visualMapModel;\n    var api = this.api;\n    var refContainer = layout.createBoxLayoutReference(model, api).refContainer;\n    layout.positionElement(group, model.getBoxLayoutParams(), refContainer);\n  };\n  VisualMapView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {};\n  VisualMapView.type = 'visualMap';\n  return VisualMapView;\n}(ComponentView);\nexport default VisualMapView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { getLayoutRect } from '../../util/layout.js';\nvar paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']];\n/**\n * @param visualMapModel\n * @param api\n * @param itemSize always [short, long]\n * @return {string} 'left' or 'right' or 'top' or 'bottom'\n */\nexport function getItemAlign(visualMapModel, api, itemSize) {\n  var modelOption = visualMapModel.option;\n  var itemAlign = modelOption.align;\n  if (itemAlign != null && itemAlign !== 'auto') {\n    return itemAlign;\n  }\n  // Auto decision align.\n  var ecSize = {\n    width: api.getWidth(),\n    height: api.getHeight()\n  };\n  var realIndex = modelOption.orient === 'horizontal' ? 1 : 0;\n  var reals = paramsSet[realIndex];\n  var fakeValue = [0, null, 10];\n  var layoutInput = {};\n  for (var i = 0; i < 3; i++) {\n    layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i];\n    layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]];\n  }\n  var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex];\n  var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding);\n  return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1];\n}\n/**\n * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and\n * dataIndexInside means filtered index.\n */\n// TODO: TYPE more specified payload types.\nexport function makeHighDownBatch(batch, visualMapModel) {\n  zrUtil.each(batch || [], function (batchItem) {\n    if (batchItem.dataIndex != null) {\n      batchItem.dataIndexInside = batchItem.dataIndex;\n      batchItem.dataIndex = null;\n    }\n    batchItem.highlightKey = 'visualMap' + (visualMapModel ? visualMapModel.componentIndex : '');\n  });\n  return batch;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport LinearGradient from 'zrender/lib/graphic/LinearGradient.js';\nimport * as eventTool from 'zrender/lib/core/event.js';\nimport VisualMapView from './VisualMapView.js';\nimport * as graphic from '../../util/graphic.js';\nimport * as numberUtil from '../../util/number.js';\nimport sliderMove from '../helper/sliderMove.js';\nimport * as helper from './helper.js';\nimport * as modelUtil from '../../util/model.js';\nimport { parsePercent } from 'zrender/lib/contain/text.js';\nimport { setAsHighDownDispatcher } from '../../util/states.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport ZRImage from 'zrender/lib/graphic/Image.js';\nimport { getECData } from '../../util/innerStore.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nimport { findEventDispatcher } from '../../util/event.js';\nvar linearMap = numberUtil.linearMap;\nvar each = zrUtil.each;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\n// Arbitrary value\nvar HOVER_LINK_SIZE = 12;\nvar HOVER_LINK_OUT = 6;\n// Notice:\n// Any \"interval\" should be by the order of [low, high].\n// \"handle0\" (handleIndex === 0) maps to\n// low data value: this._dataInterval[0] and has low coord.\n// \"handle1\" (handleIndex === 1) maps to\n// high data value: this._dataInterval[1] and has high coord.\n// The logic of transform is implemented in this._createBarGroup.\nvar ContinuousView = /** @class */function (_super) {\n  __extends(ContinuousView, _super);\n  function ContinuousView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ContinuousView.type;\n    _this._shapes = {};\n    _this._dataInterval = [];\n    _this._handleEnds = [];\n    _this._hoverLinkDataIndices = [];\n    return _this;\n  }\n  ContinuousView.prototype.init = function (ecModel, api) {\n    _super.prototype.init.call(this, ecModel, api);\n    this._hoverLinkFromSeriesMouseOver = zrUtil.bind(this._hoverLinkFromSeriesMouseOver, this);\n    this._hideIndicator = zrUtil.bind(this._hideIndicator, this);\n  };\n  ContinuousView.prototype.doRender = function (visualMapModel, ecModel, api, payload) {\n    if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) {\n      this._buildView();\n    }\n  };\n  ContinuousView.prototype._buildView = function () {\n    this.group.removeAll();\n    var visualMapModel = this.visualMapModel;\n    var thisGroup = this.group;\n    this._orient = visualMapModel.get('orient');\n    this._useHandle = visualMapModel.get('calculable');\n    this._resetInterval();\n    this._renderBar(thisGroup);\n    var dataRangeText = visualMapModel.get('text');\n    this._renderEndsText(thisGroup, dataRangeText, 0);\n    this._renderEndsText(thisGroup, dataRangeText, 1);\n    // Do this for background size calculation.\n    this._updateView(true);\n    // After updating view, inner shapes is built completely,\n    // and then background can be rendered.\n    this.renderBackground(thisGroup);\n    // Real update view\n    this._updateView();\n    this._enableHoverLinkToSeries();\n    this._enableHoverLinkFromSeries();\n    this.positionGroup(thisGroup);\n  };\n  ContinuousView.prototype._renderEndsText = function (group, dataRangeText, endsIndex) {\n    if (!dataRangeText) {\n      return;\n    }\n    // Compatible with ec2, text[0] map to high value, text[1] map low value.\n    var text = dataRangeText[1 - endsIndex];\n    text = text != null ? text + '' : '';\n    var visualMapModel = this.visualMapModel;\n    var textGap = visualMapModel.get('textGap');\n    var itemSize = visualMapModel.itemSize;\n    var barGroup = this._shapes.mainGroup;\n    var position = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup);\n    var align = this._applyTransform(endsIndex === 0 ? 'bottom' : 'top', barGroup);\n    var orient = this._orient;\n    var textStyleModel = this.visualMapModel.textStyleModel;\n    this.group.add(new graphic.Text({\n      style: createTextStyle(textStyleModel, {\n        x: position[0],\n        y: position[1],\n        verticalAlign: textStyleModel.get('verticalAlign') || (orient === 'horizontal' ? 'middle' : align),\n        align: textStyleModel.get('align') || (orient === 'horizontal' ? align : 'center'),\n        text: text\n      })\n    }));\n  };\n  ContinuousView.prototype._renderBar = function (targetGroup) {\n    var visualMapModel = this.visualMapModel;\n    var shapes = this._shapes;\n    var itemSize = visualMapModel.itemSize;\n    var orient = this._orient;\n    var useHandle = this._useHandle;\n    var itemAlign = helper.getItemAlign(visualMapModel, this.api, itemSize);\n    var mainGroup = shapes.mainGroup = this._createBarGroup(itemAlign);\n    var gradientBarGroup = new graphic.Group();\n    mainGroup.add(gradientBarGroup);\n    // Bar\n    gradientBarGroup.add(shapes.outOfRange = createPolygon());\n    gradientBarGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor(this._orient) : null, zrUtil.bind(this._dragHandle, this, 'all', false), zrUtil.bind(this._dragHandle, this, 'all', true)));\n    // A border radius clip.\n    gradientBarGroup.setClipPath(new graphic.Rect({\n      shape: {\n        x: 0,\n        y: 0,\n        width: itemSize[0],\n        height: itemSize[1],\n        r: 3\n      }\n    }));\n    var textRect = visualMapModel.textStyleModel.getTextRect('\u56FD');\n    var textSize = mathMax(textRect.width, textRect.height);\n    // Handle\n    if (useHandle) {\n      shapes.handleThumbs = [];\n      shapes.handleLabels = [];\n      shapes.handleLabelPoints = [];\n      this._createHandle(visualMapModel, mainGroup, 0, itemSize, textSize, orient);\n      this._createHandle(visualMapModel, mainGroup, 1, itemSize, textSize, orient);\n    }\n    this._createIndicator(visualMapModel, mainGroup, itemSize, textSize, orient);\n    targetGroup.add(mainGroup);\n  };\n  ContinuousView.prototype._createHandle = function (visualMapModel, mainGroup, handleIndex, itemSize, textSize, orient) {\n    var onDrift = zrUtil.bind(this._dragHandle, this, handleIndex, false);\n    var onDragEnd = zrUtil.bind(this._dragHandle, this, handleIndex, true);\n    var handleSize = parsePercent(visualMapModel.get('handleSize'), itemSize[0]);\n    var handleThumb = createSymbol(visualMapModel.get('handleIcon'), -handleSize / 2, -handleSize / 2, handleSize, handleSize, null, true);\n    var cursor = getCursor(this._orient);\n    handleThumb.attr({\n      cursor: cursor,\n      draggable: true,\n      drift: onDrift,\n      ondragend: onDragEnd,\n      onmousemove: function (e) {\n        eventTool.stop(e.event);\n      }\n    });\n    handleThumb.x = itemSize[0] / 2;\n    handleThumb.useStyle(visualMapModel.getModel('handleStyle').getItemStyle());\n    handleThumb.setStyle({\n      strokeNoScale: true,\n      strokeFirst: true\n    });\n    handleThumb.style.lineWidth *= 2;\n    handleThumb.ensureState('emphasis').style = visualMapModel.getModel(['emphasis', 'handleStyle']).getItemStyle();\n    setAsHighDownDispatcher(handleThumb, true);\n    mainGroup.add(handleThumb);\n    // Text is always horizontal layout but should not be effected by\n    // transform (orient/inverse). So label is built separately but not\n    // use zrender/graphic/helper/RectText, and is located based on view\n    // group (according to handleLabelPoint) but not barGroup.\n    var textStyleModel = this.visualMapModel.textStyleModel;\n    var handleLabel = new graphic.Text({\n      cursor: cursor,\n      draggable: true,\n      drift: onDrift,\n      onmousemove: function (e) {\n        // For mobile device, prevent screen slider on the button.\n        eventTool.stop(e.event);\n      },\n      ondragend: onDragEnd,\n      style: createTextStyle(textStyleModel, {\n        x: 0,\n        y: 0,\n        text: ''\n      })\n    });\n    handleLabel.ensureState('blur').style = {\n      opacity: 0.1\n    };\n    handleLabel.stateTransition = {\n      duration: 200\n    };\n    this.group.add(handleLabel);\n    var handleLabelPoint = [handleSize, 0];\n    var shapes = this._shapes;\n    shapes.handleThumbs[handleIndex] = handleThumb;\n    shapes.handleLabelPoints[handleIndex] = handleLabelPoint;\n    shapes.handleLabels[handleIndex] = handleLabel;\n  };\n  ContinuousView.prototype._createIndicator = function (visualMapModel, mainGroup, itemSize, textSize, orient) {\n    var scale = parsePercent(visualMapModel.get('indicatorSize'), itemSize[0]);\n    var indicator = createSymbol(visualMapModel.get('indicatorIcon'), -scale / 2, -scale / 2, scale, scale, null, true);\n    indicator.attr({\n      cursor: 'move',\n      invisible: true,\n      silent: true,\n      x: itemSize[0] / 2\n    });\n    var indicatorStyle = visualMapModel.getModel('indicatorStyle').getItemStyle();\n    if (indicator instanceof ZRImage) {\n      var pathStyle = indicator.style;\n      indicator.useStyle(zrUtil.extend({\n        // TODO other properties like x, y ?\n        image: pathStyle.image,\n        x: pathStyle.x,\n        y: pathStyle.y,\n        width: pathStyle.width,\n        height: pathStyle.height\n      }, indicatorStyle));\n    } else {\n      indicator.useStyle(indicatorStyle);\n    }\n    mainGroup.add(indicator);\n    var textStyleModel = this.visualMapModel.textStyleModel;\n    var indicatorLabel = new graphic.Text({\n      silent: true,\n      invisible: true,\n      style: createTextStyle(textStyleModel, {\n        x: 0,\n        y: 0,\n        text: ''\n      })\n    });\n    this.group.add(indicatorLabel);\n    var indicatorLabelPoint = [(orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT) + itemSize[0] / 2, 0];\n    var shapes = this._shapes;\n    shapes.indicator = indicator;\n    shapes.indicatorLabel = indicatorLabel;\n    shapes.indicatorLabelPoint = indicatorLabelPoint;\n    this._firstShowIndicator = true;\n  };\n  ContinuousView.prototype._dragHandle = function (handleIndex, isEnd,\n  // dx is event from ondragend if isEnd is true. It's not used\n  dx, dy) {\n    if (!this._useHandle) {\n      return;\n    }\n    this._dragging = !isEnd;\n    if (!isEnd) {\n      // Transform dx, dy to bar coordination.\n      var vertex = this._applyTransform([dx, dy], this._shapes.mainGroup, true);\n      this._updateInterval(handleIndex, vertex[1]);\n      this._hideIndicator();\n      // Considering realtime, update view should be executed\n      // before dispatch action.\n      this._updateView();\n    }\n    // dragEnd do not dispatch action when realtime.\n    if (isEnd === !this.visualMapModel.get('realtime')) {\n      // jshint ignore:line\n      this.api.dispatchAction({\n        type: 'selectDataRange',\n        from: this.uid,\n        visualMapId: this.visualMapModel.id,\n        selected: this._dataInterval.slice()\n      });\n    }\n    if (isEnd) {\n      !this._hovering && this._clearHoverLinkToSeries();\n    } else if (useHoverLinkOnHandle(this.visualMapModel)) {\n      this._doHoverLinkToSeries(this._handleEnds[handleIndex], false);\n    }\n  };\n  ContinuousView.prototype._resetInterval = function () {\n    var visualMapModel = this.visualMapModel;\n    var dataInterval = this._dataInterval = visualMapModel.getSelected();\n    var dataExtent = visualMapModel.getExtent();\n    var sizeExtent = [0, visualMapModel.itemSize[1]];\n    this._handleEnds = [linearMap(dataInterval[0], dataExtent, sizeExtent, true), linearMap(dataInterval[1], dataExtent, sizeExtent, true)];\n  };\n  /**\n   * @private\n   * @param {(number|string)} handleIndex 0 or 1 or 'all'\n   * @param {number} dx\n   * @param {number} dy\n   */\n  ContinuousView.prototype._updateInterval = function (handleIndex, delta) {\n    delta = delta || 0;\n    var visualMapModel = this.visualMapModel;\n    var handleEnds = this._handleEnds;\n    var sizeExtent = [0, visualMapModel.itemSize[1]];\n    sliderMove(delta, handleEnds, sizeExtent, handleIndex,\n    // cross is forbidden\n    0);\n    var dataExtent = visualMapModel.getExtent();\n    // Update data interval.\n    this._dataInterval = [linearMap(handleEnds[0], sizeExtent, dataExtent, true), linearMap(handleEnds[1], sizeExtent, dataExtent, true)];\n  };\n  ContinuousView.prototype._updateView = function (forSketch) {\n    var visualMapModel = this.visualMapModel;\n    var dataExtent = visualMapModel.getExtent();\n    var shapes = this._shapes;\n    var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]];\n    var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds;\n    var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange');\n    var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange');\n    shapes.inRange.setStyle({\n      fill: visualInRange.barColor\n      // opacity: visualInRange.opacity\n    }).setShape('points', visualInRange.barPoints);\n    shapes.outOfRange.setStyle({\n      fill: visualOutOfRange.barColor\n      // opacity: visualOutOfRange.opacity\n    }).setShape('points', visualOutOfRange.barPoints);\n    this._updateHandle(inRangeHandleEnds, visualInRange);\n  };\n  ContinuousView.prototype._createBarVisual = function (dataInterval, dataExtent, handleEnds, forceState) {\n    var opts = {\n      forceState: forceState,\n      convertOpacityToAlpha: true\n    };\n    var colorStops = this._makeColorGradient(dataInterval, opts);\n    var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)];\n    var barPoints = this._createBarPoints(handleEnds, symbolSizes);\n    return {\n      barColor: new LinearGradient(0, 0, 0, 1, colorStops),\n      barPoints: barPoints,\n      handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color]\n    };\n  };\n  ContinuousView.prototype._makeColorGradient = function (dataInterval, opts) {\n    // Considering colorHue, which is not linear, so we have to sample\n    // to calculate gradient color stops, but not only calculate head\n    // and tail.\n    var sampleNumber = 100; // Arbitrary value.\n    var colorStops = [];\n    var step = (dataInterval[1] - dataInterval[0]) / sampleNumber;\n    colorStops.push({\n      color: this.getControllerVisual(dataInterval[0], 'color', opts),\n      offset: 0\n    });\n    for (var i = 1; i < sampleNumber; i++) {\n      var currValue = dataInterval[0] + step * i;\n      if (currValue > dataInterval[1]) {\n        break;\n      }\n      colorStops.push({\n        color: this.getControllerVisual(currValue, 'color', opts),\n        offset: i / sampleNumber\n      });\n    }\n    colorStops.push({\n      color: this.getControllerVisual(dataInterval[1], 'color', opts),\n      offset: 1\n    });\n    return colorStops;\n  };\n  ContinuousView.prototype._createBarPoints = function (handleEnds, symbolSizes) {\n    var itemSize = this.visualMapModel.itemSize;\n    return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]];\n  };\n  ContinuousView.prototype._createBarGroup = function (itemAlign) {\n    var orient = this._orient;\n    var inverse = this.visualMapModel.get('inverse');\n    return new graphic.Group(orient === 'horizontal' && !inverse ? {\n      scaleX: itemAlign === 'bottom' ? 1 : -1,\n      rotation: Math.PI / 2\n    } : orient === 'horizontal' && inverse ? {\n      scaleX: itemAlign === 'bottom' ? -1 : 1,\n      rotation: -Math.PI / 2\n    } : orient === 'vertical' && !inverse ? {\n      scaleX: itemAlign === 'left' ? 1 : -1,\n      scaleY: -1\n    } : {\n      scaleX: itemAlign === 'left' ? 1 : -1\n    });\n  };\n  ContinuousView.prototype._updateHandle = function (handleEnds, visualInRange) {\n    if (!this._useHandle) {\n      return;\n    }\n    var shapes = this._shapes;\n    var visualMapModel = this.visualMapModel;\n    var handleThumbs = shapes.handleThumbs;\n    var handleLabels = shapes.handleLabels;\n    var itemSize = visualMapModel.itemSize;\n    var dataExtent = visualMapModel.getExtent();\n    var align = this._applyTransform('left', shapes.mainGroup);\n    each([0, 1], function (handleIndex) {\n      var handleThumb = handleThumbs[handleIndex];\n      handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]);\n      handleThumb.y = handleEnds[handleIndex];\n      var val = linearMap(handleEnds[handleIndex], [0, itemSize[1]], dataExtent, true);\n      var symbolSize = this.getControllerVisual(val, 'symbolSize');\n      handleThumb.scaleX = handleThumb.scaleY = symbolSize / itemSize[0];\n      handleThumb.x = itemSize[0] - symbolSize / 2;\n      // Update handle label position.\n      var textPoint = graphic.applyTransform(shapes.handleLabelPoints[handleIndex], graphic.getTransform(handleThumb, this.group));\n      if (this._orient === 'horizontal') {\n        // If visualMap controls symbol size, an additional offset needs to be added to labels to avoid collision at minimum size.\n        // Offset reaches value of 0 at \"maximum\" position, so maximum position is not altered at all.\n        var minimumOffset = align === 'left' || align === 'top' ? (itemSize[0] - symbolSize) / 2 : (itemSize[0] - symbolSize) / -2;\n        textPoint[1] += minimumOffset;\n      }\n      handleLabels[handleIndex].setStyle({\n        x: textPoint[0],\n        y: textPoint[1],\n        text: visualMapModel.formatValueText(this._dataInterval[handleIndex]),\n        verticalAlign: 'middle',\n        align: this._orient === 'vertical' ? this._applyTransform('left', shapes.mainGroup) : 'center'\n      });\n    }, this);\n  };\n  ContinuousView.prototype._showIndicator = function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) {\n    var visualMapModel = this.visualMapModel;\n    var dataExtent = visualMapModel.getExtent();\n    var itemSize = visualMapModel.itemSize;\n    var sizeExtent = [0, itemSize[1]];\n    var shapes = this._shapes;\n    var indicator = shapes.indicator;\n    if (!indicator) {\n      return;\n    }\n    indicator.attr('invisible', false);\n    var opts = {\n      convertOpacityToAlpha: true\n    };\n    var color = this.getControllerVisual(cursorValue, 'color', opts);\n    var symbolSize = this.getControllerVisual(cursorValue, 'symbolSize');\n    var y = linearMap(cursorValue, dataExtent, sizeExtent, true);\n    var x = itemSize[0] - symbolSize / 2;\n    var oldIndicatorPos = {\n      x: indicator.x,\n      y: indicator.y\n    };\n    // Update handle label position.\n    indicator.y = y;\n    indicator.x = x;\n    var textPoint = graphic.applyTransform(shapes.indicatorLabelPoint, graphic.getTransform(indicator, this.group));\n    var indicatorLabel = shapes.indicatorLabel;\n    indicatorLabel.attr('invisible', false);\n    var align = this._applyTransform('left', shapes.mainGroup);\n    var orient = this._orient;\n    var isHorizontal = orient === 'horizontal';\n    indicatorLabel.setStyle({\n      text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue),\n      verticalAlign: isHorizontal ? align : 'middle',\n      align: isHorizontal ? 'center' : align\n    });\n    var indicatorNewProps = {\n      x: x,\n      y: y,\n      style: {\n        fill: color\n      }\n    };\n    var labelNewProps = {\n      style: {\n        x: textPoint[0],\n        y: textPoint[1]\n      }\n    };\n    if (visualMapModel.ecModel.isAnimationEnabled() && !this._firstShowIndicator) {\n      var animationCfg = {\n        duration: 100,\n        easing: 'cubicInOut',\n        additive: true\n      };\n      indicator.x = oldIndicatorPos.x;\n      indicator.y = oldIndicatorPos.y;\n      indicator.animateTo(indicatorNewProps, animationCfg);\n      indicatorLabel.animateTo(labelNewProps, animationCfg);\n    } else {\n      indicator.attr(indicatorNewProps);\n      indicatorLabel.attr(labelNewProps);\n    }\n    this._firstShowIndicator = false;\n    var handleLabels = this._shapes.handleLabels;\n    if (handleLabels) {\n      for (var i = 0; i < handleLabels.length; i++) {\n        // Fade out handle labels.\n        // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it.\n        this.api.enterBlur(handleLabels[i]);\n      }\n    }\n  };\n  ContinuousView.prototype._enableHoverLinkToSeries = function () {\n    var self = this;\n    this._shapes.mainGroup.on('mousemove', function (e) {\n      self._hovering = true;\n      if (!self._dragging) {\n        var itemSize = self.visualMapModel.itemSize;\n        var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.mainGroup, true, true);\n        // For hover link show when hover handle, which might be\n        // below or upper than sizeExtent.\n        pos[1] = mathMin(mathMax(0, pos[1]), itemSize[1]);\n        self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]);\n      }\n    }).on('mouseout', function () {\n      // When mouse is out of handle, hoverLink still need\n      // to be displayed when realtime is set as false.\n      self._hovering = false;\n      !self._dragging && self._clearHoverLinkToSeries();\n    });\n  };\n  ContinuousView.prototype._enableHoverLinkFromSeries = function () {\n    var zr = this.api.getZr();\n    if (this.visualMapModel.option.hoverLink) {\n      zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this);\n      zr.on('mouseout', this._hideIndicator, this);\n    } else {\n      this._clearHoverLinkFromSeries();\n    }\n  };\n  ContinuousView.prototype._doHoverLinkToSeries = function (cursorPos, hoverOnBar) {\n    var visualMapModel = this.visualMapModel;\n    var itemSize = visualMapModel.itemSize;\n    if (!visualMapModel.option.hoverLink) {\n      return;\n    }\n    var sizeExtent = [0, itemSize[1]];\n    var dataExtent = visualMapModel.getExtent();\n    // For hover link show when hover handle, which might be below or upper than sizeExtent.\n    cursorPos = mathMin(mathMax(sizeExtent[0], cursorPos), sizeExtent[1]);\n    var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent);\n    var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize];\n    var cursorValue = linearMap(cursorPos, sizeExtent, dataExtent, true);\n    var valueRange = [linearMap(hoverRange[0], sizeExtent, dataExtent, true), linearMap(hoverRange[1], sizeExtent, dataExtent, true)];\n    // Consider data range is out of visualMap range, see test/visualMap-continuous.html,\n    // where china and india has very large population.\n    hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity);\n    hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity);\n    // Do not show indicator when mouse is over handle,\n    // otherwise labels overlap, especially when dragging.\n    if (hoverOnBar) {\n      if (valueRange[0] === -Infinity) {\n        this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize);\n      } else if (valueRange[1] === Infinity) {\n        this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize);\n      } else {\n        this._showIndicator(cursorValue, cursorValue, '\u2248 ', halfHoverLinkSize);\n      }\n    }\n    // When realtime is set as false, handles, which are in barGroup,\n    // also trigger hoverLink, which help user to realize where they\n    // focus on when dragging. (see test/heatmap-large.html)\n    // When realtime is set as true, highlight will not show when hover\n    // handle, because the label on handle, which displays a exact value\n    // but not range, might mislead users.\n    var oldBatch = this._hoverLinkDataIndices;\n    var newBatch = [];\n    if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) {\n      newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange);\n    }\n    var resultBatches = modelUtil.compressBatches(oldBatch, newBatch);\n    this._dispatchHighDown('downplay', helper.makeHighDownBatch(resultBatches[0], visualMapModel));\n    this._dispatchHighDown('highlight', helper.makeHighDownBatch(resultBatches[1], visualMapModel));\n  };\n  ContinuousView.prototype._hoverLinkFromSeriesMouseOver = function (e) {\n    var ecData;\n    findEventDispatcher(e.target, function (target) {\n      var currECData = getECData(target);\n      if (currECData.dataIndex != null) {\n        ecData = currECData;\n        return true;\n      }\n    }, true);\n    if (!ecData) {\n      return;\n    }\n    var dataModel = this.ecModel.getSeriesByIndex(ecData.seriesIndex);\n    var visualMapModel = this.visualMapModel;\n    if (!visualMapModel.isTargetSeries(dataModel)) {\n      return;\n    }\n    var data = dataModel.getData(ecData.dataType);\n    var value = data.getStore().get(visualMapModel.getDataDimensionIndex(data), ecData.dataIndex);\n    if (!isNaN(value)) {\n      this._showIndicator(value, value);\n    }\n  };\n  ContinuousView.prototype._hideIndicator = function () {\n    var shapes = this._shapes;\n    shapes.indicator && shapes.indicator.attr('invisible', true);\n    shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true);\n    var handleLabels = this._shapes.handleLabels;\n    if (handleLabels) {\n      for (var i = 0; i < handleLabels.length; i++) {\n        // Fade out handle labels.\n        // NOTE: Must use api enter/leave on emphasis/blur/select state. Or the global states manager will change it.\n        this.api.leaveBlur(handleLabels[i]);\n      }\n    }\n  };\n  ContinuousView.prototype._clearHoverLinkToSeries = function () {\n    this._hideIndicator();\n    var indices = this._hoverLinkDataIndices;\n    this._dispatchHighDown('downplay', helper.makeHighDownBatch(indices, this.visualMapModel));\n    indices.length = 0;\n  };\n  ContinuousView.prototype._clearHoverLinkFromSeries = function () {\n    this._hideIndicator();\n    var zr = this.api.getZr();\n    zr.off('mouseover', this._hoverLinkFromSeriesMouseOver);\n    zr.off('mouseout', this._hideIndicator);\n  };\n  ContinuousView.prototype._applyTransform = function (vertex, element, inverse, global) {\n    var transform = graphic.getTransform(element, global ? null : this.group);\n    return zrUtil.isArray(vertex) ? graphic.applyTransform(vertex, transform, inverse) : graphic.transformDirection(vertex, transform, inverse);\n  };\n  // TODO: TYPE more specified payload types.\n  ContinuousView.prototype._dispatchHighDown = function (type, batch) {\n    batch && batch.length && this.api.dispatchAction({\n      type: type,\n      batch: batch\n    });\n  };\n  /**\n   * @override\n   */\n  ContinuousView.prototype.dispose = function () {\n    this._clearHoverLinkFromSeries();\n    this._clearHoverLinkToSeries();\n  };\n  ContinuousView.type = 'visualMap.continuous';\n  return ContinuousView;\n}(VisualMapView);\nfunction createPolygon(points, cursor, onDrift, onDragEnd) {\n  return new graphic.Polygon({\n    shape: {\n      points: points\n    },\n    draggable: !!onDrift,\n    cursor: cursor,\n    drift: onDrift,\n    onmousemove: function (e) {\n      // For mobile device, prevent screen slider on the button.\n      eventTool.stop(e.event);\n    },\n    ondragend: onDragEnd\n  });\n}\nfunction getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) {\n  var halfHoverLinkSize = HOVER_LINK_SIZE / 2;\n  var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize');\n  if (hoverLinkDataSize) {\n    halfHoverLinkSize = linearMap(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2;\n  }\n  return halfHoverLinkSize;\n}\nfunction useHoverLinkOnHandle(visualMapModel) {\n  var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle');\n  return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle);\n}\nfunction getCursor(orient) {\n  return orient === 'vertical' ? 'ns-resize' : 'ew-resize';\n}\nexport default ContinuousView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nexport var visualMapActionInfo = {\n  type: 'selectDataRange',\n  event: 'dataRangeSelected',\n  // FIXME use updateView appears wrong\n  update: 'update'\n};\nexport var visualMapActionHander = function (payload, ecModel) {\n  ecModel.eachComponent({\n    mainType: 'visualMap',\n    query: payload\n  }, function (model) {\n    model.setSelected(payload.selected);\n  });\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport * as visualSolution from '../../visual/visualSolution.js';\nimport VisualMapping from '../../visual/VisualMapping.js';\nimport { getVisualFromData } from '../../visual/helper.js';\nexport var visualMapEncodingHandlers = [{\n  createOnAllSeries: true,\n  reset: function (seriesModel, ecModel) {\n    var resetDefines = [];\n    ecModel.eachComponent('visualMap', function (visualMapModel) {\n      var pipelineContext = seriesModel.pipelineContext;\n      if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) {\n        return;\n      }\n      resetDefines.push(visualSolution.incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, zrUtil.bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimensionIndex(seriesModel.getData())));\n    });\n    return resetDefines;\n  }\n},\n// Only support color.\n{\n  createOnAllSeries: true,\n  reset: function (seriesModel, ecModel) {\n    var data = seriesModel.getData();\n    var visualMetaList = [];\n    ecModel.eachComponent('visualMap', function (visualMapModel) {\n      if (visualMapModel.isTargetSeries(seriesModel)) {\n        var visualMeta = visualMapModel.getVisualMeta(zrUtil.bind(getColorVisual, null, seriesModel, visualMapModel)) || {\n          stops: [],\n          outerColors: []\n        };\n        var dimIdx = visualMapModel.getDataDimensionIndex(data);\n        if (dimIdx >= 0) {\n          // visualMeta.dimension should be dimension index, but not concrete dimension.\n          visualMeta.dimension = dimIdx;\n          visualMetaList.push(visualMeta);\n        }\n      }\n    });\n    // console.log(JSON.stringify(visualMetaList.map(a => a.stops)));\n    seriesModel.getData().setVisual('visualMeta', visualMetaList);\n  }\n}];\n// FIXME\n// performance and export for heatmap?\n// value can be Infinity or -Infinity\nfunction getColorVisual(seriesModel, visualMapModel, value, valueState) {\n  var mappings = visualMapModel.targetVisuals[valueState];\n  var visualTypes = VisualMapping.prepareVisualTypes(mappings);\n  var resultVisual = {\n    color: getVisualFromData(seriesModel.getData(), 'color') // default color.\n  };\n  for (var i = 0, len = visualTypes.length; i < len; i++) {\n    var type = visualTypes[i];\n    var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type];\n    mapping && mapping.applyVisual(value, getVisual, setVisual);\n  }\n  return resultVisual.color;\n  function getVisual(key) {\n    return resultVisual[key];\n  }\n  function setVisual(key, value) {\n    resultVisual[key] = value;\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// @ts-nocheck\nimport * as zrUtil from 'zrender/lib/core/util.js';\nvar each = zrUtil.each;\nexport default function visualMapPreprocessor(option) {\n  var visualMap = option && option.visualMap;\n  if (!zrUtil.isArray(visualMap)) {\n    visualMap = visualMap ? [visualMap] : [];\n  }\n  each(visualMap, function (opt) {\n    if (!opt) {\n      return;\n    }\n    // rename splitList to pieces\n    if (has(opt, 'splitList') && !has(opt, 'pieces')) {\n      opt.pieces = opt.splitList;\n      delete opt.splitList;\n    }\n    var pieces = opt.pieces;\n    if (pieces && zrUtil.isArray(pieces)) {\n      each(pieces, function (piece) {\n        if (zrUtil.isObject(piece)) {\n          if (has(piece, 'start') && !has(piece, 'min')) {\n            piece.min = piece.start;\n          }\n          if (has(piece, 'end') && !has(piece, 'max')) {\n            piece.max = piece.end;\n          }\n        }\n      });\n    }\n  });\n}\nfunction has(obj, name) {\n  return obj && obj.hasOwnProperty && obj.hasOwnProperty(name);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { visualMapActionInfo, visualMapActionHander } from './visualMapAction.js';\nimport { visualMapEncodingHandlers } from './visualEncoding.js';\nimport { each } from 'zrender/lib/core/util.js';\nimport preprocessor from './preprocessor.js';\nvar installed = false;\nexport default function installCommon(registers) {\n  if (installed) {\n    return;\n  }\n  installed = true;\n  registers.registerSubTypeDefaulter('visualMap', function (option) {\n    // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used.\n    return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? 'continuous' : 'piecewise';\n  });\n  registers.registerAction(visualMapActionInfo, visualMapActionHander);\n  each(visualMapEncodingHandlers, function (handler) {\n    registers.registerVisual(registers.PRIORITY.VISUAL.COMPONENT, handler);\n  });\n  registers.registerPreprocessor(preprocessor);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport ContinuousModel from './ContinuousModel.js';\nimport ContinuousView from './ContinuousView.js';\nimport installCommon from './installCommon.js';\nexport function install(registers) {\n  registers.registerComponentModel(ContinuousModel);\n  registers.registerComponentView(ContinuousView);\n  installCommon(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport VisualMapModel from './VisualMapModel.js';\nimport VisualMapping from '../../visual/VisualMapping.js';\nimport visualDefault from '../../visual/visualDefault.js';\nimport { reformIntervals } from '../../util/number.js';\nimport { inheritDefaultOption } from '../../util/component.js';\nvar PiecewiseModel = /** @class */function (_super) {\n  __extends(PiecewiseModel, _super);\n  function PiecewiseModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = PiecewiseModel.type;\n    /**\n     * The order is always [low, ..., high].\n     * [{text: string, interval: Array.<number>}, ...]\n     */\n    _this._pieceList = [];\n    return _this;\n  }\n  PiecewiseModel.prototype.optionUpdated = function (newOption, isInit) {\n    _super.prototype.optionUpdated.apply(this, arguments);\n    this.resetExtent();\n    var mode = this._mode = this._determineMode();\n    this._pieceList = [];\n    resetMethods[this._mode].call(this, this._pieceList);\n    this._resetSelected(newOption, isInit);\n    var categories = this.option.categories;\n    this.resetVisual(function (mappingOption, state) {\n      if (mode === 'categories') {\n        mappingOption.mappingMethod = 'category';\n        mappingOption.categories = zrUtil.clone(categories);\n      } else {\n        mappingOption.dataExtent = this.getExtent();\n        mappingOption.mappingMethod = 'piecewise';\n        mappingOption.pieceList = zrUtil.map(this._pieceList, function (piece) {\n          piece = zrUtil.clone(piece);\n          if (state !== 'inRange') {\n            // FIXME\n            // outOfRange do not support special visual in pieces.\n            piece.visual = null;\n          }\n          return piece;\n        });\n      }\n    });\n  };\n  /**\n   * @protected\n   * @override\n   */\n  PiecewiseModel.prototype.completeVisualOption = function () {\n    // Consider this case:\n    // visualMap: {\n    //      pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}]\n    // }\n    // where no inRange/outOfRange set but only pieces. So we should make\n    // default inRange/outOfRange for this case, otherwise visuals that only\n    // appear in `pieces` will not be taken into account in visual encoding.\n    var option = this.option;\n    var visualTypesInPieces = {};\n    var visualTypes = VisualMapping.listVisualTypes();\n    var isCategory = this.isCategory();\n    zrUtil.each(option.pieces, function (piece) {\n      zrUtil.each(visualTypes, function (visualType) {\n        if (piece.hasOwnProperty(visualType)) {\n          visualTypesInPieces[visualType] = 1;\n        }\n      });\n    });\n    zrUtil.each(visualTypesInPieces, function (v, visualType) {\n      var exists = false;\n      zrUtil.each(this.stateList, function (state) {\n        exists = exists || has(option, state, visualType) || has(option.target, state, visualType);\n      }, this);\n      !exists && zrUtil.each(this.stateList, function (state) {\n        (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory);\n      });\n    }, this);\n    function has(obj, state, visualType) {\n      return obj && obj[state] && obj[state].hasOwnProperty(visualType);\n    }\n    _super.prototype.completeVisualOption.apply(this, arguments);\n  };\n  PiecewiseModel.prototype._resetSelected = function (newOption, isInit) {\n    var thisOption = this.option;\n    var pieceList = this._pieceList;\n    // Selected do not merge but all override.\n    var selected = (isInit ? thisOption : newOption).selected || {};\n    thisOption.selected = selected;\n    // Consider 'not specified' means true.\n    zrUtil.each(pieceList, function (piece, index) {\n      var key = this.getSelectedMapKey(piece);\n      if (!selected.hasOwnProperty(key)) {\n        selected[key] = true;\n      }\n    }, this);\n    if (thisOption.selectedMode === 'single') {\n      // Ensure there is only one selected.\n      var hasSel_1 = false;\n      zrUtil.each(pieceList, function (piece, index) {\n        var key = this.getSelectedMapKey(piece);\n        if (selected[key]) {\n          hasSel_1 ? selected[key] = false : hasSel_1 = true;\n        }\n      }, this);\n    }\n    // thisOption.selectedMode === 'multiple', default: all selected.\n  };\n  /**\n   * @public\n   */\n  PiecewiseModel.prototype.getItemSymbol = function () {\n    return this.get('itemSymbol');\n  };\n  /**\n   * @public\n   */\n  PiecewiseModel.prototype.getSelectedMapKey = function (piece) {\n    return this._mode === 'categories' ? piece.value + '' : piece.index + '';\n  };\n  /**\n   * @public\n   */\n  PiecewiseModel.prototype.getPieceList = function () {\n    return this._pieceList;\n  };\n  /**\n   * @return {string}\n   */\n  PiecewiseModel.prototype._determineMode = function () {\n    var option = this.option;\n    return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber';\n  };\n  /**\n   * @override\n   */\n  PiecewiseModel.prototype.setSelected = function (selected) {\n    this.option.selected = zrUtil.clone(selected);\n  };\n  /**\n   * @override\n   */\n  PiecewiseModel.prototype.getValueState = function (value) {\n    var index = VisualMapping.findPieceIndex(value, this._pieceList);\n    return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange';\n  };\n  /**\n   * @public\n   * @param pieceIndex piece index in visualMapModel.getPieceList()\n   */\n  PiecewiseModel.prototype.findTargetDataIndices = function (pieceIndex) {\n    var result = [];\n    var pieceList = this._pieceList;\n    this.eachTargetSeries(function (seriesModel) {\n      var dataIndices = [];\n      var data = seriesModel.getData();\n      data.each(this.getDataDimensionIndex(data), function (value, dataIndex) {\n        // Should always base on model pieceList, because it is order sensitive.\n        var pIdx = VisualMapping.findPieceIndex(value, pieceList);\n        pIdx === pieceIndex && dataIndices.push(dataIndex);\n      }, this);\n      result.push({\n        seriesId: seriesModel.id,\n        dataIndex: dataIndices\n      });\n    }, this);\n    return result;\n  };\n  /**\n   * @private\n   * @param piece piece.value or piece.interval is required.\n   * @return  Can be Infinity or -Infinity\n   */\n  PiecewiseModel.prototype.getRepresentValue = function (piece) {\n    var representValue;\n    if (this.isCategory()) {\n      representValue = piece.value;\n    } else {\n      if (piece.value != null) {\n        representValue = piece.value;\n      } else {\n        var pieceInterval = piece.interval || [];\n        representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2;\n      }\n    }\n    return representValue;\n  };\n  PiecewiseModel.prototype.getVisualMeta = function (getColorVisual) {\n    // Do not support category. (category axis is ordinal, numerical)\n    if (this.isCategory()) {\n      return;\n    }\n    var stops = [];\n    var outerColors = ['', ''];\n    var visualMapModel = this;\n    function setStop(interval, valueState) {\n      var representValue = visualMapModel.getRepresentValue({\n        interval: interval\n      }); // Not category\n      if (!valueState) {\n        valueState = visualMapModel.getValueState(representValue);\n      }\n      var color = getColorVisual(representValue, valueState);\n      if (interval[0] === -Infinity) {\n        outerColors[0] = color;\n      } else if (interval[1] === Infinity) {\n        outerColors[1] = color;\n      } else {\n        stops.push({\n          value: interval[0],\n          color: color\n        }, {\n          value: interval[1],\n          color: color\n        });\n      }\n    }\n    // Suplement\n    var pieceList = this._pieceList.slice();\n    if (!pieceList.length) {\n      pieceList.push({\n        interval: [-Infinity, Infinity]\n      });\n    } else {\n      var edge = pieceList[0].interval[0];\n      edge !== -Infinity && pieceList.unshift({\n        interval: [-Infinity, edge]\n      });\n      edge = pieceList[pieceList.length - 1].interval[1];\n      edge !== Infinity && pieceList.push({\n        interval: [edge, Infinity]\n      });\n    }\n    var curr = -Infinity;\n    zrUtil.each(pieceList, function (piece) {\n      var interval = piece.interval;\n      if (interval) {\n        // Fulfill gap.\n        interval[0] > curr && setStop([curr, interval[0]], 'outOfRange');\n        setStop(interval.slice());\n        curr = interval[1];\n      }\n    }, this);\n    return {\n      stops: stops,\n      outerColors: outerColors\n    };\n  };\n  PiecewiseModel.type = 'visualMap.piecewise';\n  PiecewiseModel.defaultOption = inheritDefaultOption(VisualMapModel.defaultOption, {\n    selected: null,\n    minOpen: false,\n    maxOpen: false,\n    align: 'auto',\n    itemWidth: 20,\n    itemHeight: 14,\n    itemSymbol: 'roundRect',\n    pieces: null,\n    categories: null,\n    splitNumber: 5,\n    selectedMode: 'multiple',\n    itemGap: 10,\n    hoverLink: true // Enable hover highlight.\n  });\n  return PiecewiseModel;\n}(VisualMapModel);\n;\n/**\n * Key is this._mode\n * @type {Object}\n * @this {module:echarts/component/viusalMap/PiecewiseMode}\n */\nvar resetMethods = {\n  splitNumber: function (outPieceList) {\n    var thisOption = this.option;\n    var precision = Math.min(thisOption.precision, 20);\n    var dataExtent = this.getExtent();\n    var splitNumber = thisOption.splitNumber;\n    splitNumber = Math.max(parseInt(splitNumber, 10), 1);\n    thisOption.splitNumber = splitNumber;\n    var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber;\n    // Precision auto-adaption\n    while (+splitStep.toFixed(precision) !== splitStep && precision < 5) {\n      precision++;\n    }\n    thisOption.precision = precision;\n    splitStep = +splitStep.toFixed(precision);\n    if (thisOption.minOpen) {\n      outPieceList.push({\n        interval: [-Infinity, dataExtent[0]],\n        close: [0, 0]\n      });\n    }\n    for (var index = 0, curr = dataExtent[0]; index < splitNumber; curr += splitStep, index++) {\n      var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep;\n      outPieceList.push({\n        interval: [curr, max],\n        close: [1, 1]\n      });\n    }\n    if (thisOption.maxOpen) {\n      outPieceList.push({\n        interval: [dataExtent[1], Infinity],\n        close: [0, 0]\n      });\n    }\n    reformIntervals(outPieceList);\n    zrUtil.each(outPieceList, function (piece, index) {\n      piece.index = index;\n      piece.text = this.formatValueText(piece.interval);\n    }, this);\n  },\n  categories: function (outPieceList) {\n    var thisOption = this.option;\n    zrUtil.each(thisOption.categories, function (cate) {\n      // FIXME category\u6A21\u5F0F\u4E5F\u4F7F\u7528pieceList\uFF0C\u4F46\u5728visualMapping\u4E2D\u4E0D\u662F\u4F7F\u7528pieceList\u3002\n      // \u662F\u5426\u6539\u4E00\u81F4\u3002\n      outPieceList.push({\n        text: this.formatValueText(cate, true),\n        value: cate\n      });\n    }, this);\n    // See \"Order Rule\".\n    normalizeReverse(thisOption, outPieceList);\n  },\n  pieces: function (outPieceList) {\n    var thisOption = this.option;\n    zrUtil.each(thisOption.pieces, function (pieceListItem, index) {\n      if (!zrUtil.isObject(pieceListItem)) {\n        pieceListItem = {\n          value: pieceListItem\n        };\n      }\n      var item = {\n        text: '',\n        index: index\n      };\n      if (pieceListItem.label != null) {\n        item.text = pieceListItem.label;\n      }\n      if (pieceListItem.hasOwnProperty('value')) {\n        var value = item.value = pieceListItem.value;\n        item.interval = [value, value];\n        item.close = [1, 1];\n      } else {\n        // `min` `max` is legacy option.\n        // `lt` `gt` `lte` `gte` is recommended.\n        var interval = item.interval = [];\n        var close_1 = item.close = [0, 0];\n        var closeList = [1, 0, 1];\n        var infinityList = [-Infinity, Infinity];\n        var useMinMax = [];\n        for (var lg = 0; lg < 2; lg++) {\n          var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg];\n          for (var i = 0; i < 3 && interval[lg] == null; i++) {\n            interval[lg] = pieceListItem[names[i]];\n            close_1[lg] = closeList[i];\n            useMinMax[lg] = i === 2;\n          }\n          interval[lg] == null && (interval[lg] = infinityList[lg]);\n        }\n        useMinMax[0] && interval[1] === Infinity && (close_1[0] = 0);\n        useMinMax[1] && interval[0] === -Infinity && (close_1[1] = 0);\n        if (process.env.NODE_ENV !== 'production') {\n          if (interval[0] > interval[1]) {\n            console.warn('Piece ' + index + 'is illegal: ' + interval + ' lower bound should not greater then uppper bound.');\n          }\n        }\n        if (interval[0] === interval[1] && close_1[0] && close_1[1]) {\n          // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}],\n          // we use value to lift the priority when min === max\n          item.value = interval[0];\n        }\n      }\n      item.visual = VisualMapping.retrieveVisuals(pieceListItem);\n      outPieceList.push(item);\n    }, this);\n    // See \"Order Rule\".\n    normalizeReverse(thisOption, outPieceList);\n    // Only pieces\n    reformIntervals(outPieceList);\n    zrUtil.each(outPieceList, function (piece) {\n      var close = piece.close;\n      var edgeSymbols = [['<', '\u2264'][close[1]], ['>', '\u2265'][close[0]]];\n      piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols);\n    }, this);\n  }\n};\nfunction normalizeReverse(thisOption, pieceList) {\n  var inverse = thisOption.inverse;\n  if (thisOption.orient === 'vertical' ? !inverse : inverse) {\n    pieceList.reverse();\n  }\n}\nexport default PiecewiseModel;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport VisualMapView from './VisualMapView.js';\nimport * as graphic from '../../util/graphic.js';\nimport { createSymbol } from '../../util/symbol.js';\nimport * as layout from '../../util/layout.js';\nimport * as helper from './helper.js';\nimport { createTextStyle } from '../../label/labelStyle.js';\nvar PiecewiseVisualMapView = /** @class */function (_super) {\n  __extends(PiecewiseVisualMapView, _super);\n  function PiecewiseVisualMapView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = PiecewiseVisualMapView.type;\n    return _this;\n  }\n  PiecewiseVisualMapView.prototype.doRender = function () {\n    var thisGroup = this.group;\n    thisGroup.removeAll();\n    var visualMapModel = this.visualMapModel;\n    var textGap = visualMapModel.get('textGap');\n    var textStyleModel = visualMapModel.textStyleModel;\n    var itemAlign = this._getItemAlign();\n    var itemSize = visualMapModel.itemSize;\n    var viewData = this._getViewData();\n    var endsText = viewData.endsText;\n    var showLabel = zrUtil.retrieve(visualMapModel.get('showLabel', true), !endsText);\n    var silent = !visualMapModel.get('selectedMode');\n    endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign);\n    zrUtil.each(viewData.viewPieceList, function (item) {\n      var piece = item.piece;\n      var itemGroup = new graphic.Group();\n      itemGroup.onclick = zrUtil.bind(this._onItemClick, this, piece);\n      this._enableHoverLink(itemGroup, item.indexInModelPieceList);\n      // TODO Category\n      var representValue = visualMapModel.getRepresentValue(piece);\n      this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]], silent);\n      if (showLabel) {\n        var visualState = this.visualMapModel.getValueState(representValue);\n        var align = textStyleModel.get('align') || itemAlign;\n        itemGroup.add(new graphic.Text({\n          style: createTextStyle(textStyleModel, {\n            x: align === 'right' ? -textGap : itemSize[0] + textGap,\n            y: itemSize[1] / 2,\n            text: piece.text,\n            verticalAlign: textStyleModel.get('verticalAlign') || 'middle',\n            align: align,\n            opacity: zrUtil.retrieve2(textStyleModel.get('opacity'), visualState === 'outOfRange' ? 0.5 : 1)\n          }),\n          silent: silent\n        }));\n      }\n      thisGroup.add(itemGroup);\n    }, this);\n    endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign);\n    layout.box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap'));\n    this.renderBackground(thisGroup);\n    this.positionGroup(thisGroup);\n  };\n  PiecewiseVisualMapView.prototype._enableHoverLink = function (itemGroup, pieceIndex) {\n    var _this = this;\n    itemGroup.on('mouseover', function () {\n      return onHoverLink('highlight');\n    }).on('mouseout', function () {\n      return onHoverLink('downplay');\n    });\n    var onHoverLink = function (method) {\n      var visualMapModel = _this.visualMapModel;\n      // TODO: TYPE More detailed action types\n      visualMapModel.option.hoverLink && _this.api.dispatchAction({\n        type: method,\n        batch: helper.makeHighDownBatch(visualMapModel.findTargetDataIndices(pieceIndex), visualMapModel)\n      });\n    };\n  };\n  PiecewiseVisualMapView.prototype._getItemAlign = function () {\n    var visualMapModel = this.visualMapModel;\n    var modelOption = visualMapModel.option;\n    if (modelOption.orient === 'vertical') {\n      return helper.getItemAlign(visualMapModel, this.api, visualMapModel.itemSize);\n    } else {\n      // horizontal, most case left unless specifying right.\n      var align = modelOption.align;\n      if (!align || align === 'auto') {\n        align = 'left';\n      }\n      return align;\n    }\n  };\n  PiecewiseVisualMapView.prototype._renderEndsText = function (group, text, itemSize, showLabel, itemAlign) {\n    if (!text) {\n      return;\n    }\n    var itemGroup = new graphic.Group();\n    var textStyleModel = this.visualMapModel.textStyleModel;\n    itemGroup.add(new graphic.Text({\n      style: createTextStyle(textStyleModel, {\n        x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2,\n        y: itemSize[1] / 2,\n        verticalAlign: 'middle',\n        align: showLabel ? itemAlign : 'center',\n        text: text\n      })\n    }));\n    group.add(itemGroup);\n  };\n  /**\n   * @private\n   * @return {Object} {peiceList, endsText} The order is the same as screen pixel order.\n   */\n  PiecewiseVisualMapView.prototype._getViewData = function () {\n    var visualMapModel = this.visualMapModel;\n    var viewPieceList = zrUtil.map(visualMapModel.getPieceList(), function (piece, index) {\n      return {\n        piece: piece,\n        indexInModelPieceList: index\n      };\n    });\n    var endsText = visualMapModel.get('text');\n    // Consider orient and inverse.\n    var orient = visualMapModel.get('orient');\n    var inverse = visualMapModel.get('inverse');\n    // Order of model pieceList is always [low, ..., high]\n    if (orient === 'horizontal' ? inverse : !inverse) {\n      viewPieceList.reverse();\n    }\n    // Origin order of endsText is [high, low]\n    else if (endsText) {\n      endsText = endsText.slice().reverse();\n    }\n    return {\n      viewPieceList: viewPieceList,\n      endsText: endsText\n    };\n  };\n  PiecewiseVisualMapView.prototype._createItemSymbol = function (group, representValue, shapeParam, silent) {\n    var itemSymbol = createSymbol(\n    // symbol will be string\n    this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3],\n    // color will be string\n    this.getControllerVisual(representValue, 'color'));\n    itemSymbol.silent = silent;\n    group.add(itemSymbol);\n  };\n  PiecewiseVisualMapView.prototype._onItemClick = function (piece) {\n    var visualMapModel = this.visualMapModel;\n    var option = visualMapModel.option;\n    var selectedMode = option.selectedMode;\n    if (!selectedMode) {\n      return;\n    }\n    var selected = zrUtil.clone(option.selected);\n    var newKey = visualMapModel.getSelectedMapKey(piece);\n    if (selectedMode === 'single' || selectedMode === true) {\n      selected[newKey] = true;\n      zrUtil.each(selected, function (o, key) {\n        selected[key] = key === newKey;\n      });\n    } else {\n      selected[newKey] = !selected[newKey];\n    }\n    this.api.dispatchAction({\n      type: 'selectDataRange',\n      from: this.uid,\n      visualMapId: this.visualMapModel.id,\n      selected: selected\n    });\n  };\n  PiecewiseVisualMapView.type = 'visualMap.piecewise';\n  return PiecewiseVisualMapView;\n}(VisualMapView);\nexport default PiecewiseVisualMapView;", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport PiecewiseModel from './PiecewiseModel.js';\nimport PiecewiseView from './PiecewiseView.js';\nimport installCommon from './installCommon.js';\nexport function install(registers) {\n  registers.registerComponentModel(PiecewiseModel);\n  registers.registerComponentView(PiecewiseView);\n  installCommon(registers);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from '../../extension.js';\nimport { install as installVisualMapContinuous } from './installVisualMapContinuous.js';\nimport { install as installVisualMapPiecewise } from './installVisualMapPiecewise.js';\nexport function install(registers) {\n  use(installVisualMapContinuous);\n  use(installVisualMapPiecewise);\n  // Do not install './dataZoomSelect',\n  // since it only work for toolbox dataZoom.\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { calcZ2Range } from '../../util/graphic.js';\n/**\n * [CAVEAT]: the call order of `ThumbnailView['render']` and other\n *  `ChartView['render']/ComponentView['render']` is not guaranteed.\n */\nvar ThumbnailBridgeImpl = /** @class */function () {\n  function ThumbnailBridgeImpl(thumbnailModel) {\n    this._thumbnailModel = thumbnailModel;\n  }\n  ThumbnailBridgeImpl.prototype.reset = function (api) {\n    this._renderVersion = api.getMainProcessVersion();\n  };\n  ThumbnailBridgeImpl.prototype.renderContent = function (opt) {\n    var thumbnailView = opt.api.getViewOfComponentModel(this._thumbnailModel);\n    if (!thumbnailView) {\n      return;\n    }\n    opt.group.silent = true;\n    thumbnailView.renderContent({\n      group: opt.group,\n      targetTrans: opt.targetTrans,\n      z2Range: calcZ2Range(opt.group),\n      roamType: opt.roamType,\n      viewportRect: opt.viewportRect,\n      renderVersion: this._renderVersion\n    });\n  };\n  ThumbnailBridgeImpl.prototype.updateWindow = function (targetTrans, api) {\n    var thumbnailView = api.getViewOfComponentModel(this._thumbnailModel);\n    if (!thumbnailView) {\n      return;\n    }\n    thumbnailView.updateWindow({\n      targetTrans: targetTrans,\n      renderVersion: this._renderVersion\n    });\n  };\n  return ThumbnailBridgeImpl;\n}();\nexport { ThumbnailBridgeImpl };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentModel from '../../model/Component.js';\nimport { error } from '../../util/log.js';\nimport tokens from '../../visual/tokens.js';\nimport { injectThumbnailBridge } from '../helper/thumbnailBridge.js';\nimport { ThumbnailBridgeImpl } from './ThumbnailBridgeImpl.js';\nvar ThumbnailModel = /** @class */function (_super) {\n  __extends(ThumbnailModel, _super);\n  function ThumbnailModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ThumbnailModel.type;\n    _this.preventAutoZ = true;\n    return _this;\n  }\n  ThumbnailModel.prototype.optionUpdated = function (newCptOption, isInit) {\n    this._updateBridge();\n  };\n  ThumbnailModel.prototype._updateBridge = function () {\n    var bridge = this._birdge = this._birdge || new ThumbnailBridgeImpl(this);\n    // Clear all, in case of option changed.\n    this._target = null;\n    this.ecModel.eachSeries(function (series) {\n      injectThumbnailBridge(series, null);\n    });\n    if (this.shouldShow()) {\n      var target = this.getTarget();\n      // If a component is targeted by more than one thumbnails, simply only the last one works.\n      injectThumbnailBridge(target.baseMapProvider, bridge);\n    }\n  };\n  ThumbnailModel.prototype.shouldShow = function () {\n    return this.getShallow('show', true);\n  };\n  ThumbnailModel.prototype.getBridge = function () {\n    return this._birdge;\n  };\n  ThumbnailModel.prototype.getTarget = function () {\n    if (this._target) {\n      return this._target;\n    }\n    // Find by `seriesId`/`seriesIndex`.\n    var series = this.getReferringComponents('series', {\n      useDefault: false,\n      enableAll: false,\n      enableNone: false\n    }).models[0];\n    if (series) {\n      if (series.subType !== 'graph') {\n        series = null;\n        if (process.env.NODE_ENV !== 'production') {\n          error(\"series.\" + series.subType + \" is not supported in thumbnail.\", true);\n        }\n      }\n    } else {\n      // If no xxxId and xxxIndex specified, find the first series.graph. If other components,\n      // such as geo, is supported in future, the default stretagy may be extended.\n      series = this.ecModel.queryComponents({\n        mainType: 'series',\n        subType: 'graph'\n      })[0];\n    }\n    this._target = {\n      baseMapProvider: series\n    };\n    return this._target;\n  };\n  ThumbnailModel.type = 'thumbnail';\n  ThumbnailModel.layoutMode = 'box';\n  // All the supported components should be added here.\n  ThumbnailModel.dependencies = ['series', 'geo'];\n  ThumbnailModel.defaultOption = {\n    show: true,\n    right: 1,\n    bottom: 1,\n    height: '25%',\n    width: '25%',\n    itemStyle: {\n      // Use echarts option.backgorundColor by default.\n      borderColor: tokens.color.border,\n      borderWidth: 2\n    },\n    windowStyle: {\n      borderWidth: 1,\n      color: tokens.color.neutral30,\n      borderColor: tokens.color.neutral40,\n      opacity: 0.3\n    },\n    z: 10\n  };\n  return ThumbnailModel;\n}(ComponentModel);\nexport { ThumbnailModel };", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\nimport ComponentView from '../../view/Component.js';\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport * as matrix from 'zrender/lib/core/matrix.js';\nimport RoamController from '../helper/RoamController.js';\nimport tokens from '../../visual/tokens.js';\nimport { createBoxLayoutReference, getBoxLayoutParams, getLayoutRect } from '../../util/layout.js';\nimport { expandOrShrinkRect, Rect, Group, traverseUpdateZ, retrieveZInfo } from '../../util/graphic.js';\nimport { applyTransform } from 'zrender/lib/core/vector.js';\nimport View from '../../coord/View.js';\nimport { bind, defaults, extend } from 'zrender/lib/core/util.js';\nvar ThumbnailView = /** @class */function (_super) {\n  __extends(ThumbnailView, _super);\n  function ThumbnailView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = ThumbnailView.type;\n    return _this;\n  }\n  ThumbnailView.prototype.render = function (thumbnailModel, ecModel, api) {\n    this._api = api;\n    this._model = thumbnailModel;\n    if (!this._coordSys) {\n      this._coordSys = new View();\n    }\n    if (!this._isEnabled()) {\n      this._clear();\n      return;\n    }\n    this._renderVersion = api.getMainProcessVersion();\n    var group = this.group;\n    group.removeAll();\n    var itemStyleModel = thumbnailModel.getModel('itemStyle');\n    var itemStyle = itemStyleModel.getItemStyle();\n    if (itemStyle.fill == null) {\n      itemStyle.fill = ecModel.get('backgroundColor') || tokens.color.neutral00;\n    }\n    var refContainer = createBoxLayoutReference(thumbnailModel, api).refContainer;\n    var boxRect = getLayoutRect(getBoxLayoutParams(thumbnailModel, true), refContainer);\n    var boxBorderWidth = itemStyle.lineWidth || 0;\n    var contentRect = this._contentRect = expandOrShrinkRect(boxRect.clone(), boxBorderWidth / 2, true, true);\n    var contentGroup = new Group();\n    group.add(contentGroup);\n    contentGroup.setClipPath(new Rect({\n      shape: contentRect.plain()\n    }));\n    var targetGroup = this._targetGroup = new Group();\n    contentGroup.add(targetGroup);\n    // Draw border and background and shadow of thumbnail box.\n    var borderShape = boxRect.plain();\n    borderShape.r = itemStyleModel.getShallow('borderRadius', true);\n    group.add(this._bgRect = new Rect({\n      style: itemStyle,\n      shape: borderShape,\n      silent: false,\n      cursor: 'grab'\n    }));\n    var windowStyleModel = thumbnailModel.getModel('windowStyle');\n    var windowR = windowStyleModel.getShallow('borderRadius', true);\n    contentGroup.add(this._windowRect = new Rect({\n      shape: {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        r: windowR\n      },\n      style: windowStyleModel.getItemStyle(),\n      silent: false,\n      cursor: 'grab'\n    }));\n    this._dealRenderContent();\n    this._dealUpdateWindow();\n    updateZ(thumbnailModel, this);\n  };\n  /**\n   * Can be called asynchronously directly.\n   * This method should be idempotent.\n   */\n  ThumbnailView.prototype.renderContent = function (bridgeRendered) {\n    this._bridgeRendered = bridgeRendered;\n    if (this._isEnabled()) {\n      this._dealRenderContent();\n      this._dealUpdateWindow();\n      updateZ(this._model, this);\n    }\n  };\n  ThumbnailView.prototype._dealRenderContent = function () {\n    var bridgeRendered = this._bridgeRendered;\n    if (!bridgeRendered || bridgeRendered.renderVersion !== this._renderVersion) {\n      return;\n    }\n    var targetGroup = this._targetGroup;\n    var coordSys = this._coordSys;\n    var contentRect = this._contentRect;\n    targetGroup.removeAll();\n    if (!bridgeRendered) {\n      return;\n    }\n    var bridgeGroup = bridgeRendered.group;\n    var bridgeRect = bridgeGroup.getBoundingRect();\n    targetGroup.add(bridgeGroup);\n    this._bgRect.z2 = bridgeRendered.z2Range.min - 10;\n    coordSys.setBoundingRect(bridgeRect.x, bridgeRect.y, bridgeRect.width, bridgeRect.height);\n    // Use `getLayoutRect` is just to find an approperiate rect in thumbnail.\n    var viewRect = getLayoutRect({\n      left: 'center',\n      top: 'center',\n      aspect: bridgeRect.width / bridgeRect.height\n    }, contentRect);\n    coordSys.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);\n    bridgeGroup.attr(coordSys.getTransformInfo().raw);\n    this._windowRect.z2 = bridgeRendered.z2Range.max + 10;\n    this._resetRoamController(bridgeRendered.roamType);\n  };\n  /**\n   * Can be called from action handler directly.\n   * This method should be idempotent.\n   */\n  ThumbnailView.prototype.updateWindow = function (param) {\n    var bridgeRendered = this._bridgeRendered;\n    if (bridgeRendered && bridgeRendered.renderVersion === param.renderVersion) {\n      bridgeRendered.targetTrans = param.targetTrans;\n    }\n    if (this._isEnabled()) {\n      this._dealUpdateWindow();\n    }\n  };\n  ThumbnailView.prototype._dealUpdateWindow = function () {\n    var bridgeRendered = this._bridgeRendered;\n    if (!bridgeRendered || bridgeRendered.renderVersion !== this._renderVersion) {\n      return;\n    }\n    var invTargetTrans = matrix.invert([], bridgeRendered.targetTrans);\n    var transTargetToThis = matrix.mul([], this._coordSys.transform, invTargetTrans);\n    this._transThisToTarget = matrix.invert([], transTargetToThis);\n    var viewportRect = bridgeRendered.viewportRect;\n    if (!viewportRect) {\n      viewportRect = new BoundingRect(0, 0, this._api.getWidth(), this._api.getHeight());\n    } else {\n      viewportRect = viewportRect.clone();\n    }\n    viewportRect.applyTransform(transTargetToThis);\n    var windowRect = this._windowRect;\n    var r = windowRect.shape.r;\n    windowRect.setShape(defaults({\n      r: r\n    }, viewportRect));\n  };\n  ThumbnailView.prototype._resetRoamController = function (roamType) {\n    var _this = this;\n    var api = this._api;\n    var roamController = this._roamController;\n    if (!roamController) {\n      roamController = this._roamController = new RoamController(api.getZr());\n    }\n    if (!roamType || !this._isEnabled()) {\n      roamController.disable();\n      return;\n    }\n    roamController.enable(roamType, {\n      api: api,\n      zInfo: {\n        component: this._model\n      },\n      triggerInfo: {\n        roamTrigger: null,\n        isInSelf: function (e, x, y) {\n          return _this._contentRect.contain(x, y);\n        }\n      }\n    });\n    roamController.off('pan').off('zoom').on('pan', bind(this._onPan, this)).on('zoom', bind(this._onZoom, this));\n  };\n  ThumbnailView.prototype._onPan = function (event) {\n    var trans = this._transThisToTarget;\n    if (!this._isEnabled() || !trans) {\n      return;\n    }\n    var oldOffset = applyTransform([], [event.oldX, event.oldY], trans);\n    var newOffset = applyTransform([], [event.oldX - event.dx, event.oldY - event.dy], trans);\n    this._api.dispatchAction(makeRoamPayload(this._model.getTarget().baseMapProvider, {\n      dx: newOffset[0] - oldOffset[0],\n      dy: newOffset[1] - oldOffset[1]\n    }));\n  };\n  ThumbnailView.prototype._onZoom = function (event) {\n    var trans = this._transThisToTarget;\n    if (!this._isEnabled() || !trans) {\n      return;\n    }\n    var offset = applyTransform([], [event.originX, event.originY], trans);\n    this._api.dispatchAction(makeRoamPayload(this._model.getTarget().baseMapProvider, {\n      zoom: 1 / event.scale,\n      originX: offset[0],\n      originY: offset[1]\n    }));\n  };\n  /**\n   * This method is also responsible for check enable in asynchronous situation,\n   * e.g., in event listeners that is supposed to be outdated but not be removed.\n   */\n  ThumbnailView.prototype._isEnabled = function () {\n    var thumbnailModel = this._model;\n    if (!thumbnailModel || !thumbnailModel.shouldShow()) {\n      return false;\n    }\n    var baseMapProvider = thumbnailModel.getTarget().baseMapProvider;\n    if (!baseMapProvider) {\n      return false;\n    }\n    return true;\n  };\n  ThumbnailView.prototype._clear = function () {\n    this.group.removeAll();\n    this._bridgeRendered = null;\n    if (this._roamController) {\n      this._roamController.disable();\n    }\n  };\n  ThumbnailView.prototype.remove = function () {\n    this._clear();\n  };\n  ThumbnailView.prototype.dispose = function () {\n    this._clear();\n  };\n  ThumbnailView.type = 'thumbnail';\n  return ThumbnailView;\n}(ComponentView);\nexport { ThumbnailView };\nfunction makeRoamPayload(baseMapProvider, params) {\n  var type = baseMapProvider.mainType === 'series' ? baseMapProvider.subType + \"Roam\" // e.g. 'graphRoam'\n  : baseMapProvider.mainType + \"Roam\"; // e.g., 'geoRoam'\n  var payload = {\n    type: type\n  };\n  payload[baseMapProvider.mainType + \"Id\"] = baseMapProvider.id;\n  extend(payload, params);\n  return payload;\n}\nfunction updateZ(thumbnailModel, thumbnailView) {\n  var zInfo = retrieveZInfo(thumbnailModel);\n  traverseUpdateZ(thumbnailView.group, zInfo.z, zInfo.zlevel);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { ThumbnailModel } from './ThumbnailModel.js';\nimport { ThumbnailView } from './ThumbnailView.js';\nexport function install(registers) {\n  registers.registerComponentModel(ThumbnailModel);\n  registers.registerComponentView(ThumbnailView);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { makeInner } from '../util/model.js';\nimport { getDecalFromPalette } from '../model/mixin/palette.js';\nvar DEFAULT_OPTION = {\n  label: {\n    enabled: true\n  },\n  decal: {\n    show: false\n  }\n};\nvar inner = makeInner();\nvar decalPaletteScope = {};\nexport default function ariaVisual(ecModel, api) {\n  var ariaModel = ecModel.getModel('aria');\n  // See \"area enabled\" detection code in `GlobalModel.ts`.\n  if (!ariaModel.get('enabled')) {\n    return;\n  }\n  var defaultOption = zrUtil.clone(DEFAULT_OPTION);\n  zrUtil.merge(defaultOption.label, ecModel.getLocaleModel().get('aria'), false);\n  zrUtil.merge(ariaModel.option, defaultOption, false);\n  setDecal();\n  setLabel();\n  function setDecal() {\n    var decalModel = ariaModel.getModel('decal');\n    var useDecal = decalModel.get('show');\n    if (useDecal) {\n      // Each type of series use one scope.\n      // Pie and funnel are using different scopes.\n      var paletteScopeGroupByType_1 = zrUtil.createHashMap();\n      ecModel.eachSeries(function (seriesModel) {\n        if (seriesModel.isColorBySeries()) {\n          return;\n        }\n        var decalScope = paletteScopeGroupByType_1.get(seriesModel.type);\n        if (!decalScope) {\n          decalScope = {};\n          paletteScopeGroupByType_1.set(seriesModel.type, decalScope);\n        }\n        inner(seriesModel).scope = decalScope;\n      });\n      ecModel.eachRawSeries(function (seriesModel) {\n        if (ecModel.isSeriesFiltered(seriesModel)) {\n          return;\n        }\n        if (zrUtil.isFunction(seriesModel.enableAriaDecal)) {\n          // Let series define how to use decal palette on data\n          seriesModel.enableAriaDecal();\n          return;\n        }\n        var data = seriesModel.getData();\n        if (!seriesModel.isColorBySeries()) {\n          var dataAll_1 = seriesModel.getRawData();\n          var idxMap_1 = {};\n          var decalScope_1 = inner(seriesModel).scope;\n          data.each(function (idx) {\n            var rawIdx = data.getRawIndex(idx);\n            idxMap_1[rawIdx] = idx;\n          });\n          var dataCount_1 = dataAll_1.count();\n          dataAll_1.each(function (rawIdx) {\n            var idx = idxMap_1[rawIdx];\n            var name = dataAll_1.getName(rawIdx) || rawIdx + '';\n            var paletteDecal = getDecalFromPalette(seriesModel.ecModel, name, decalScope_1, dataCount_1);\n            var specifiedDecal = data.getItemVisual(idx, 'decal');\n            data.setItemVisual(idx, 'decal', mergeDecal(specifiedDecal, paletteDecal));\n          });\n        } else {\n          var paletteDecal = getDecalFromPalette(seriesModel.ecModel, seriesModel.name, decalPaletteScope, ecModel.getSeriesCount());\n          var specifiedDecal = data.getVisual('decal');\n          data.setVisual('decal', mergeDecal(specifiedDecal, paletteDecal));\n        }\n        function mergeDecal(specifiedDecal, paletteDecal) {\n          // Merge decal from palette to decal from itemStyle.\n          // User do not need to specify all of the decal props.\n          var resultDecal = specifiedDecal ? zrUtil.extend(zrUtil.extend({}, paletteDecal), specifiedDecal) : paletteDecal;\n          resultDecal.dirty = true;\n          return resultDecal;\n        }\n      });\n    }\n  }\n  function setLabel() {\n    var dom = api.getZr().dom;\n    // TODO: support for SSR\n    if (!dom) {\n      return;\n    }\n    var labelLocale = ecModel.getLocaleModel().get('aria');\n    var labelModel = ariaModel.getModel('label');\n    labelModel.option = zrUtil.defaults(labelModel.option, labelLocale);\n    if (!labelModel.get('enabled')) {\n      return;\n    }\n    dom.setAttribute('role', 'img');\n    if (labelModel.get('description')) {\n      dom.setAttribute('aria-label', labelModel.get('description'));\n      return;\n    }\n    var seriesCnt = ecModel.getSeriesCount();\n    var maxDataCnt = labelModel.get(['data', 'maxCount']) || 10;\n    var maxSeriesCnt = labelModel.get(['series', 'maxCount']) || 10;\n    var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt);\n    var ariaLabel;\n    if (seriesCnt < 1) {\n      // No series, no aria label\n      return;\n    } else {\n      var title = getTitle();\n      if (title) {\n        var withTitle = labelModel.get(['general', 'withTitle']);\n        ariaLabel = replace(withTitle, {\n          title: title\n        });\n      } else {\n        ariaLabel = labelModel.get(['general', 'withoutTitle']);\n      }\n      var seriesLabels_1 = [];\n      var prefix = seriesCnt > 1 ? labelModel.get(['series', 'multiple', 'prefix']) : labelModel.get(['series', 'single', 'prefix']);\n      ariaLabel += replace(prefix, {\n        seriesCount: seriesCnt\n      });\n      ecModel.eachSeries(function (seriesModel, idx) {\n        if (idx < displaySeriesCnt) {\n          var seriesLabel = void 0;\n          var seriesName = seriesModel.get('name');\n          var withName = seriesName ? 'withName' : 'withoutName';\n          seriesLabel = seriesCnt > 1 ? labelModel.get(['series', 'multiple', withName]) : labelModel.get(['series', 'single', withName]);\n          seriesLabel = replace(seriesLabel, {\n            seriesId: seriesModel.seriesIndex,\n            seriesName: seriesModel.get('name'),\n            seriesType: getSeriesTypeName(seriesModel.subType)\n          });\n          var data = seriesModel.getData();\n          if (data.count() > maxDataCnt) {\n            // Show part of data\n            var partialLabel = labelModel.get(['data', 'partialData']);\n            seriesLabel += replace(partialLabel, {\n              displayCnt: maxDataCnt\n            });\n          } else {\n            seriesLabel += labelModel.get(['data', 'allData']);\n          }\n          var middleSeparator_1 = labelModel.get(['data', 'separator', 'middle']);\n          var endSeparator_1 = labelModel.get(['data', 'separator', 'end']);\n          var excludeDimensionId_1 = labelModel.get(['data', 'excludeDimensionId']);\n          var dataLabels = [];\n          for (var i = 0; i < data.count(); i++) {\n            if (i < maxDataCnt) {\n              var name_1 = data.getName(i);\n              var value = !excludeDimensionId_1 ? data.getValues(i) : zrUtil.filter(data.getValues(i), function (v, j) {\n                return zrUtil.indexOf(excludeDimensionId_1, j) === -1;\n              });\n              var dataLabel = labelModel.get(['data', name_1 ? 'withName' : 'withoutName']);\n              dataLabels.push(replace(dataLabel, {\n                name: name_1,\n                value: value.join(middleSeparator_1)\n              }));\n            }\n          }\n          seriesLabel += dataLabels.join(middleSeparator_1) + endSeparator_1;\n          seriesLabels_1.push(seriesLabel);\n        }\n      });\n      var separatorModel = labelModel.getModel(['series', 'multiple', 'separator']);\n      var middleSeparator = separatorModel.get('middle');\n      var endSeparator = separatorModel.get('end');\n      ariaLabel += seriesLabels_1.join(middleSeparator) + endSeparator;\n      dom.setAttribute('aria-label', ariaLabel);\n    }\n  }\n  function replace(str, keyValues) {\n    if (!zrUtil.isString(str)) {\n      return str;\n    }\n    var result = str;\n    zrUtil.each(keyValues, function (value, key) {\n      result = result.replace(new RegExp('\\\\{\\\\s*' + key + '\\\\s*\\\\}', 'g'), value);\n    });\n    return result;\n  }\n  function getTitle() {\n    var title = ecModel.get('title');\n    if (title && title.length) {\n      title = title[0];\n    }\n    return title && title.text;\n  }\n  function getSeriesTypeName(type) {\n    var typeNames = ecModel.getLocaleModel().get(['series', 'typeNames']);\n    return typeNames[type] || typeNames.chart;\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport * as zrUtil from 'zrender/lib/core/util.js';\nexport default function ariaPreprocessor(option) {\n  if (!option || !option.aria) {\n    return;\n  }\n  var aria = option.aria;\n  // aria.show is deprecated and should use aria.enabled instead\n  if (aria.show != null) {\n    aria.enabled = aria.show;\n  }\n  aria.label = aria.label || {};\n  // move description, general, series, data to be under aria.label\n  zrUtil.each(['description', 'general', 'series', 'data'], function (name) {\n    if (aria[name] != null) {\n      aria.label[name] = aria[name];\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport ariaVisual from '../../visual/aria.js';\nimport ariaPreprocessor from './preprocessor.js';\nexport function install(registers) {\n  registers.registerPreprocessor(ariaPreprocessor);\n  registers.registerVisual(registers.PRIORITY.VISUAL.ARIA, ariaVisual);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { keys, isArray, map, isObject, isString, isRegExp, isArrayLike, hasOwn, isNumber } from 'zrender/lib/core/util.js';\nimport { throwError, makePrintable } from './log.js';\nimport { getRawValueParser, createFilterComparator } from '../data/helper/dataValueHelper.js';\n;\nvar RELATIONAL_EXPRESSION_OP_ALIAS_MAP = {\n  value: 'eq',\n  // PENDING: not good for literal semantic?\n  '<': 'lt',\n  '<=': 'lte',\n  '>': 'gt',\n  '>=': 'gte',\n  '=': 'eq',\n  '!=': 'ne',\n  '<>': 'ne'\n  // Might be misleading for sake of the difference between '==' and '===',\n  // so don't support them.\n  // '==': 'eq',\n  // '===': 'seq',\n  // '!==': 'sne'\n  // PENDING: Whether support some common alias \"ge\", \"le\", \"neq\"?\n  // ge: 'gte',\n  // le: 'lte',\n  // neq: 'ne',\n};\n// type RelationalExpressionOpEvaluate = (tarVal: unknown, condVal: unknown) => boolean;\nvar RegExpEvaluator = /** @class */function () {\n  function RegExpEvaluator(rVal) {\n    // Support condVal: RegExp | string\n    var condValue = this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null;\n    if (condValue == null) {\n      var errMsg = '';\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = makePrintable('Illegal regexp', rVal, 'in');\n      }\n      throwError(errMsg);\n    }\n  }\n  RegExpEvaluator.prototype.evaluate = function (lVal) {\n    var type = typeof lVal;\n    return isString(type) ? this._condVal.test(lVal) : isNumber(type) ? this._condVal.test(lVal + '') : false;\n  };\n  return RegExpEvaluator;\n}();\nvar ConstConditionInternal = /** @class */function () {\n  function ConstConditionInternal() {}\n  ConstConditionInternal.prototype.evaluate = function () {\n    return this.value;\n  };\n  return ConstConditionInternal;\n}();\nvar AndConditionInternal = /** @class */function () {\n  function AndConditionInternal() {}\n  AndConditionInternal.prototype.evaluate = function () {\n    var children = this.children;\n    for (var i = 0; i < children.length; i++) {\n      if (!children[i].evaluate()) {\n        return false;\n      }\n    }\n    return true;\n  };\n  return AndConditionInternal;\n}();\nvar OrConditionInternal = /** @class */function () {\n  function OrConditionInternal() {}\n  OrConditionInternal.prototype.evaluate = function () {\n    var children = this.children;\n    for (var i = 0; i < children.length; i++) {\n      if (children[i].evaluate()) {\n        return true;\n      }\n    }\n    return false;\n  };\n  return OrConditionInternal;\n}();\nvar NotConditionInternal = /** @class */function () {\n  function NotConditionInternal() {}\n  NotConditionInternal.prototype.evaluate = function () {\n    return !this.child.evaluate();\n  };\n  return NotConditionInternal;\n}();\nvar RelationalConditionInternal = /** @class */function () {\n  function RelationalConditionInternal() {}\n  RelationalConditionInternal.prototype.evaluate = function () {\n    var needParse = !!this.valueParser;\n    // Call getValue with no `this`.\n    var getValue = this.getValue;\n    var tarValRaw = getValue(this.valueGetterParam);\n    var tarValParsed = needParse ? this.valueParser(tarValRaw) : null;\n    // Relational cond follow \"and\" logic internally.\n    for (var i = 0; i < this.subCondList.length; i++) {\n      if (!this.subCondList[i].evaluate(needParse ? tarValParsed : tarValRaw)) {\n        return false;\n      }\n    }\n    return true;\n  };\n  return RelationalConditionInternal;\n}();\nfunction parseOption(exprOption, getters) {\n  if (exprOption === true || exprOption === false) {\n    var cond = new ConstConditionInternal();\n    cond.value = exprOption;\n    return cond;\n  }\n  var errMsg = '';\n  if (!isObjectNotArray(exprOption)) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = makePrintable('Illegal config. Expect a plain object but actually', exprOption);\n    }\n    throwError(errMsg);\n  }\n  if (exprOption.and) {\n    return parseAndOrOption('and', exprOption, getters);\n  } else if (exprOption.or) {\n    return parseAndOrOption('or', exprOption, getters);\n  } else if (exprOption.not) {\n    return parseNotOption(exprOption, getters);\n  }\n  return parseRelationalOption(exprOption, getters);\n}\nfunction parseAndOrOption(op, exprOption, getters) {\n  var subOptionArr = exprOption[op];\n  var errMsg = '';\n  if (process.env.NODE_ENV !== 'production') {\n    errMsg = makePrintable('\"and\"/\"or\" condition should only be `' + op + ': [...]` and must not be empty array.', 'Illegal condition:', exprOption);\n  }\n  if (!isArray(subOptionArr)) {\n    throwError(errMsg);\n  }\n  if (!subOptionArr.length) {\n    throwError(errMsg);\n  }\n  var cond = op === 'and' ? new AndConditionInternal() : new OrConditionInternal();\n  cond.children = map(subOptionArr, function (subOption) {\n    return parseOption(subOption, getters);\n  });\n  if (!cond.children.length) {\n    throwError(errMsg);\n  }\n  return cond;\n}\nfunction parseNotOption(exprOption, getters) {\n  var subOption = exprOption.not;\n  var errMsg = '';\n  if (process.env.NODE_ENV !== 'production') {\n    errMsg = makePrintable('\"not\" condition should only be `not: {}`.', 'Illegal condition:', exprOption);\n  }\n  if (!isObjectNotArray(subOption)) {\n    throwError(errMsg);\n  }\n  var cond = new NotConditionInternal();\n  cond.child = parseOption(subOption, getters);\n  if (!cond.child) {\n    throwError(errMsg);\n  }\n  return cond;\n}\nfunction parseRelationalOption(exprOption, getters) {\n  var errMsg = '';\n  var valueGetterParam = getters.prepareGetValue(exprOption);\n  var subCondList = [];\n  var exprKeys = keys(exprOption);\n  var parserName = exprOption.parser;\n  var valueParser = parserName ? getRawValueParser(parserName) : null;\n  for (var i = 0; i < exprKeys.length; i++) {\n    var keyRaw = exprKeys[i];\n    if (keyRaw === 'parser' || getters.valueGetterAttrMap.get(keyRaw)) {\n      continue;\n    }\n    var op = hasOwn(RELATIONAL_EXPRESSION_OP_ALIAS_MAP, keyRaw) ? RELATIONAL_EXPRESSION_OP_ALIAS_MAP[keyRaw] : keyRaw;\n    var condValueRaw = exprOption[keyRaw];\n    var condValueParsed = valueParser ? valueParser(condValueRaw) : condValueRaw;\n    var evaluator = createFilterComparator(op, condValueParsed) || op === 'reg' && new RegExpEvaluator(condValueParsed);\n    if (!evaluator) {\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = makePrintable('Illegal relational operation: \"' + keyRaw + '\" in condition:', exprOption);\n      }\n      throwError(errMsg);\n    }\n    subCondList.push(evaluator);\n  }\n  if (!subCondList.length) {\n    if (process.env.NODE_ENV !== 'production') {\n      errMsg = makePrintable('Relational condition must have at least one operator.', 'Illegal condition:', exprOption);\n    }\n    // No relational operator always disabled in case of dangers result.\n    throwError(errMsg);\n  }\n  var cond = new RelationalConditionInternal();\n  cond.valueGetterParam = valueGetterParam;\n  cond.valueParser = valueParser;\n  cond.getValue = getters.getValue;\n  cond.subCondList = subCondList;\n  return cond;\n}\nfunction isObjectNotArray(val) {\n  return isObject(val) && !isArrayLike(val);\n}\nvar ConditionalExpressionParsed = /** @class */function () {\n  function ConditionalExpressionParsed(exprOption, getters) {\n    this._cond = parseOption(exprOption, getters);\n  }\n  ConditionalExpressionParsed.prototype.evaluate = function () {\n    return this._cond.evaluate();\n  };\n  return ConditionalExpressionParsed;\n}();\n;\nexport function parseConditionalExpression(exprOption, getters) {\n  return new ConditionalExpressionParsed(exprOption, getters);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { parseConditionalExpression } from '../../util/conditionalExpression.js';\nimport { hasOwn, createHashMap } from 'zrender/lib/core/util.js';\nimport { makePrintable, throwError } from '../../util/log.js';\nexport var filterTransform = {\n  type: 'echarts:filter',\n  // PENDING: enhance to filter by index rather than create new data\n  transform: function (params) {\n    // [Caveat] Fail-Fast:\n    // Do not return the whole dataset unless user config indicates it explicitly.\n    // For example, if no condition is specified by mistake, returning an empty result\n    // is better than returning the entire raw source for the user to find the mistake.\n    var upstream = params.upstream;\n    var rawItem;\n    var condition = parseConditionalExpression(params.config, {\n      valueGetterAttrMap: createHashMap({\n        dimension: true\n      }),\n      prepareGetValue: function (exprOption) {\n        var errMsg = '';\n        var dimLoose = exprOption.dimension;\n        if (!hasOwn(exprOption, 'dimension')) {\n          if (process.env.NODE_ENV !== 'production') {\n            errMsg = makePrintable('Relation condition must has prop \"dimension\" specified.', 'Illegal condition:', exprOption);\n          }\n          throwError(errMsg);\n        }\n        var dimInfo = upstream.getDimensionInfo(dimLoose);\n        if (!dimInfo) {\n          if (process.env.NODE_ENV !== 'production') {\n            errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\\n', 'Illegal condition:', exprOption, '.\\n');\n          }\n          throwError(errMsg);\n        }\n        return {\n          dimIdx: dimInfo.index\n        };\n      },\n      getValue: function (param) {\n        return upstream.retrieveValueFromItem(rawItem, param.dimIdx);\n      }\n    });\n    var resultData = [];\n    for (var i = 0, len = upstream.count(); i < len; i++) {\n      rawItem = upstream.getRawDataItem(i);\n      if (condition.evaluate()) {\n        resultData.push(rawItem);\n      }\n    }\n    return {\n      data: resultData\n    };\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { SOURCE_FORMAT_ARRAY_ROWS, SOURCE_FORMAT_OBJECT_ROWS } from '../../util/types.js';\nimport { makePrintable, throwError } from '../../util/log.js';\nimport { each } from 'zrender/lib/core/util.js';\nimport { normalizeToArray } from '../../util/model.js';\nimport { getRawValueParser, SortOrderComparator } from '../../data/helper/dataValueHelper.js';\nvar sampleLog = '';\nif (process.env.NODE_ENV !== 'production') {\n  sampleLog = ['Valid config is like:', '{ dimension: \"age\", order: \"asc\" }', 'or [{ dimension: \"age\", order: \"asc\"], { dimension: \"date\", order: \"desc\" }]'].join(' ');\n}\nexport var sortTransform = {\n  type: 'echarts:sort',\n  transform: function (params) {\n    var upstream = params.upstream;\n    var config = params.config;\n    var errMsg = '';\n    // Normalize\n    // const orderExprList: OrderExpression[] = isArray(config[0])\n    //     ? config as OrderExpression[]\n    //     : [config as OrderExpression];\n    var orderExprList = normalizeToArray(config);\n    if (!orderExprList.length) {\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'Empty `config` in sort transform.';\n      }\n      throwError(errMsg);\n    }\n    var orderDefList = [];\n    each(orderExprList, function (orderExpr) {\n      var dimLoose = orderExpr.dimension;\n      var order = orderExpr.order;\n      var parserName = orderExpr.parser;\n      var incomparable = orderExpr.incomparable;\n      if (dimLoose == null) {\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = 'Sort transform config must has \"dimension\" specified.' + sampleLog;\n        }\n        throwError(errMsg);\n      }\n      if (order !== 'asc' && order !== 'desc') {\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = 'Sort transform config must has \"order\" specified.' + sampleLog;\n        }\n        throwError(errMsg);\n      }\n      if (incomparable && incomparable !== 'min' && incomparable !== 'max') {\n        var errMsg_1 = '';\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg_1 = 'incomparable must be \"min\" or \"max\" rather than \"' + incomparable + '\".';\n        }\n        throwError(errMsg_1);\n      }\n      if (order !== 'asc' && order !== 'desc') {\n        var errMsg_2 = '';\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg_2 = 'order must be \"asc\" or \"desc\" rather than \"' + order + '\".';\n        }\n        throwError(errMsg_2);\n      }\n      var dimInfo = upstream.getDimensionInfo(dimLoose);\n      if (!dimInfo) {\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = makePrintable('Can not find dimension info via: ' + dimLoose + '.\\n', 'Existing dimensions: ', upstream.cloneAllDimensionInfo(), '.\\n', 'Illegal config:', orderExpr, '.\\n');\n        }\n        throwError(errMsg);\n      }\n      var parser = parserName ? getRawValueParser(parserName) : null;\n      if (parserName && !parser) {\n        if (process.env.NODE_ENV !== 'production') {\n          errMsg = makePrintable('Invalid parser name ' + parserName + '.\\n', 'Illegal config:', orderExpr, '.\\n');\n        }\n        throwError(errMsg);\n      }\n      orderDefList.push({\n        dimIdx: dimInfo.index,\n        parser: parser,\n        comparator: new SortOrderComparator(order, incomparable)\n      });\n    });\n    // TODO: support it?\n    var sourceFormat = upstream.sourceFormat;\n    if (sourceFormat !== SOURCE_FORMAT_ARRAY_ROWS && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) {\n      if (process.env.NODE_ENV !== 'production') {\n        errMsg = 'sourceFormat \"' + sourceFormat + '\" is not supported yet';\n      }\n      throwError(errMsg);\n    }\n    // Other upstream format are all array.\n    var resultData = [];\n    for (var i = 0, len = upstream.count(); i < len; i++) {\n      resultData.push(upstream.getRawDataItem(i));\n    }\n    resultData.sort(function (item0, item1) {\n      for (var i = 0; i < orderDefList.length; i++) {\n        var orderDef = orderDefList[i];\n        var val0 = upstream.retrieveValueFromItem(item0, orderDef.dimIdx);\n        var val1 = upstream.retrieveValueFromItem(item1, orderDef.dimIdx);\n        if (orderDef.parser) {\n          val0 = orderDef.parser(val0);\n          val1 = orderDef.parser(val1);\n        }\n        var result = orderDef.comparator.evaluate(val0, val1);\n        if (result !== 0) {\n          return result;\n        }\n      }\n      return 0;\n    });\n    return {\n      data: resultData\n    };\n  }\n};", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { filterTransform } from './filterTransform.js';\nimport { sortTransform } from './sortTransform.js';\nexport function install(registers) {\n  registers.registerTransform(filterTransform);\n  registers.registerTransform(sortTransform);\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { __extends } from \"tslib\";\n/**\n * This module is imported by echarts directly.\n *\n * Notice:\n * Always keep this file exists for backward compatibility.\n * Because before 4.1.0, dataset is an optional component,\n * some users may import this module manually.\n */\nimport ComponentModel from '../../model/Component.js';\nimport ComponentView from '../../view/Component.js';\nimport { SERIES_LAYOUT_BY_COLUMN } from '../../util/types.js';\nimport { disableTransformOptionMerge, SourceManager } from '../../data/helper/sourceManager.js';\nvar DatasetModel = /** @class */function (_super) {\n  __extends(DatasetModel, _super);\n  function DatasetModel() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'dataset';\n    return _this;\n  }\n  DatasetModel.prototype.init = function (option, parentModel, ecModel) {\n    _super.prototype.init.call(this, option, parentModel, ecModel);\n    this._sourceManager = new SourceManager(this);\n    disableTransformOptionMerge(this);\n  };\n  DatasetModel.prototype.mergeOption = function (newOption, ecModel) {\n    _super.prototype.mergeOption.call(this, newOption, ecModel);\n    disableTransformOptionMerge(this);\n  };\n  DatasetModel.prototype.optionUpdated = function () {\n    this._sourceManager.dirty();\n  };\n  DatasetModel.prototype.getSourceManager = function () {\n    return this._sourceManager;\n  };\n  DatasetModel.type = 'dataset';\n  DatasetModel.defaultOption = {\n    seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN\n  };\n  return DatasetModel;\n}(ComponentModel);\nexport { DatasetModel };\nvar DatasetView = /** @class */function (_super) {\n  __extends(DatasetView, _super);\n  function DatasetView() {\n    var _this = _super !== null && _super.apply(this, arguments) || this;\n    _this.type = 'dataset';\n    return _this;\n  }\n  DatasetView.type = 'dataset';\n  return DatasetView;\n}(ComponentView);\nexport function install(registers) {\n  registers.registerComponentModel(DatasetModel);\n  registers.registerComponentView(DatasetView);\n}", "import { cubicSubdivide } from '../core/curve.js';\nimport PathProxy from '../core/PathProxy.js';\nvar CMD = PathProxy.CMD;\nfunction aroundEqual(a, b) {\n    return Math.abs(a - b) < 1e-5;\n}\nexport function pathToBezierCurves(path) {\n    var data = path.data;\n    var len = path.len();\n    var bezierArrayGroups = [];\n    var currentSubpath;\n    var xi = 0;\n    var yi = 0;\n    var x0 = 0;\n    var y0 = 0;\n    function createNewSubpath(x, y) {\n        if (currentSubpath && currentSubpath.length > 2) {\n            bezierArrayGroups.push(currentSubpath);\n        }\n        currentSubpath = [x, y];\n    }\n    function addLine(x0, y0, x1, y1) {\n        if (!(aroundEqual(x0, x1) && aroundEqual(y0, y1))) {\n            currentSubpath.push(x0, y0, x1, y1, x1, y1);\n        }\n    }\n    function addArc(startAngle, endAngle, cx, cy, rx, ry) {\n        var delta = Math.abs(endAngle - startAngle);\n        var len = Math.tan(delta / 4) * 4 / 3;\n        var dir = endAngle < startAngle ? -1 : 1;\n        var c1 = Math.cos(startAngle);\n        var s1 = Math.sin(startAngle);\n        var c2 = Math.cos(endAngle);\n        var s2 = Math.sin(endAngle);\n        var x1 = c1 * rx + cx;\n        var y1 = s1 * ry + cy;\n        var x4 = c2 * rx + cx;\n        var y4 = s2 * ry + cy;\n        var hx = rx * len * dir;\n        var hy = ry * len * dir;\n        currentSubpath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4);\n    }\n    var x1;\n    var y1;\n    var x2;\n    var y2;\n    for (var i = 0; i < len;) {\n        var cmd = data[i++];\n        var isFirst = i === 1;\n        if (isFirst) {\n            xi = data[i];\n            yi = data[i + 1];\n            x0 = xi;\n            y0 = yi;\n            if (cmd === CMD.L || cmd === CMD.C || cmd === CMD.Q) {\n                currentSubpath = [x0, y0];\n            }\n        }\n        switch (cmd) {\n            case CMD.M:\n                xi = x0 = data[i++];\n                yi = y0 = data[i++];\n                createNewSubpath(x0, y0);\n                break;\n            case CMD.L:\n                x1 = data[i++];\n                y1 = data[i++];\n                addLine(xi, yi, x1, y1);\n                xi = x1;\n                yi = y1;\n                break;\n            case CMD.C:\n                currentSubpath.push(data[i++], data[i++], data[i++], data[i++], xi = data[i++], yi = data[i++]);\n                break;\n            case CMD.Q:\n                x1 = data[i++];\n                y1 = data[i++];\n                x2 = data[i++];\n                y2 = data[i++];\n                currentSubpath.push(xi + 2 / 3 * (x1 - xi), yi + 2 / 3 * (y1 - yi), x2 + 2 / 3 * (x1 - x2), y2 + 2 / 3 * (y1 - y2), x2, y2);\n                xi = x2;\n                yi = y2;\n                break;\n            case CMD.A:\n                var cx = data[i++];\n                var cy = data[i++];\n                var rx = data[i++];\n                var ry = data[i++];\n                var startAngle = data[i++];\n                var endAngle = data[i++] + startAngle;\n                i += 1;\n                var anticlockwise = !data[i++];\n                x1 = Math.cos(startAngle) * rx + cx;\n                y1 = Math.sin(startAngle) * ry + cy;\n                if (isFirst) {\n                    x0 = x1;\n                    y0 = y1;\n                    createNewSubpath(x0, y0);\n                }\n                else {\n                    addLine(xi, yi, x1, y1);\n                }\n                xi = Math.cos(endAngle) * rx + cx;\n                yi = Math.sin(endAngle) * ry + cy;\n                var step = (anticlockwise ? -1 : 1) * Math.PI / 2;\n                for (var angle = startAngle; anticlockwise ? angle > endAngle : angle < endAngle; angle += step) {\n                    var nextAngle = anticlockwise ? Math.max(angle + step, endAngle)\n                        : Math.min(angle + step, endAngle);\n                    addArc(angle, nextAngle, cx, cy, rx, ry);\n                }\n                break;\n            case CMD.R:\n                x0 = xi = data[i++];\n                y0 = yi = data[i++];\n                x1 = x0 + data[i++];\n                y1 = y0 + data[i++];\n                createNewSubpath(x1, y0);\n                addLine(x1, y0, x1, y1);\n                addLine(x1, y1, x0, y1);\n                addLine(x0, y1, x0, y0);\n                addLine(x0, y0, x1, y0);\n                break;\n            case CMD.Z:\n                currentSubpath && addLine(xi, yi, x0, y0);\n                xi = x0;\n                yi = y0;\n                break;\n        }\n    }\n    if (currentSubpath && currentSubpath.length > 2) {\n        bezierArrayGroups.push(currentSubpath);\n    }\n    return bezierArrayGroups;\n}\nfunction adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, out, scale) {\n    if (aroundEqual(x0, x1) && aroundEqual(y0, y1) && aroundEqual(x2, x3) && aroundEqual(y2, y3)) {\n        out.push(x3, y3);\n        return;\n    }\n    var PIXEL_DISTANCE = 2 / scale;\n    var PIXEL_DISTANCE_SQR = PIXEL_DISTANCE * PIXEL_DISTANCE;\n    var dx = x3 - x0;\n    var dy = y3 - y0;\n    var d = Math.sqrt(dx * dx + dy * dy);\n    dx /= d;\n    dy /= d;\n    var dx1 = x1 - x0;\n    var dy1 = y1 - y0;\n    var dx2 = x2 - x3;\n    var dy2 = y2 - y3;\n    var cp1LenSqr = dx1 * dx1 + dy1 * dy1;\n    var cp2LenSqr = dx2 * dx2 + dy2 * dy2;\n    if (cp1LenSqr < PIXEL_DISTANCE_SQR && cp2LenSqr < PIXEL_DISTANCE_SQR) {\n        out.push(x3, y3);\n        return;\n    }\n    var projLen1 = dx * dx1 + dy * dy1;\n    var projLen2 = -dx * dx2 - dy * dy2;\n    var d1Sqr = cp1LenSqr - projLen1 * projLen1;\n    var d2Sqr = cp2LenSqr - projLen2 * projLen2;\n    if (d1Sqr < PIXEL_DISTANCE_SQR && projLen1 >= 0\n        && d2Sqr < PIXEL_DISTANCE_SQR && projLen2 >= 0) {\n        out.push(x3, y3);\n        return;\n    }\n    var tmpSegX = [];\n    var tmpSegY = [];\n    cubicSubdivide(x0, x1, x2, x3, 0.5, tmpSegX);\n    cubicSubdivide(y0, y1, y2, y3, 0.5, tmpSegY);\n    adpativeBezier(tmpSegX[0], tmpSegY[0], tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], tmpSegX[3], tmpSegY[3], out, scale);\n    adpativeBezier(tmpSegX[4], tmpSegY[4], tmpSegX[5], tmpSegY[5], tmpSegX[6], tmpSegY[6], tmpSegX[7], tmpSegY[7], out, scale);\n}\nexport function pathToPolygons(path, scale) {\n    var bezierArrayGroups = pathToBezierCurves(path);\n    var polygons = [];\n    scale = scale || 1;\n    for (var i = 0; i < bezierArrayGroups.length; i++) {\n        var beziers = bezierArrayGroups[i];\n        var polygon = [];\n        var x0 = beziers[0];\n        var y0 = beziers[1];\n        polygon.push(x0, y0);\n        for (var k = 2; k < beziers.length;) {\n            var x1 = beziers[k++];\n            var y1 = beziers[k++];\n            var x2 = beziers[k++];\n            var y2 = beziers[k++];\n            var x3 = beziers[k++];\n            var y3 = beziers[k++];\n            adpativeBezier(x0, y0, x1, y1, x2, y2, x3, y3, polygon, scale);\n            x0 = x3;\n            y0 = y3;\n        }\n        polygons.push(polygon);\n    }\n    return polygons;\n}\n", "import { fromPoints } from '../core/bbox.js';\nimport BoundingRect from '../core/BoundingRect.js';\nimport Point from '../core/Point.js';\nimport { map } from '../core/util.js';\nimport Polygon from '../graphic/shape/Polygon.js';\nimport Rect from '../graphic/shape/Rect.js';\nimport Sector from '../graphic/shape/Sector.js';\nimport { pathToPolygons } from './convertPath.js';\nimport { clonePath } from './path.js';\nfunction getDividingGrids(dimSize, rowDim, count) {\n    var rowSize = dimSize[rowDim];\n    var columnSize = dimSize[1 - rowDim];\n    var ratio = Math.abs(rowSize / columnSize);\n    var rowCount = Math.ceil(Math.sqrt(ratio * count));\n    var columnCount = Math.floor(count / rowCount);\n    if (columnCount === 0) {\n        columnCount = 1;\n        rowCount = count;\n    }\n    var grids = [];\n    for (var i = 0; i < rowCount; i++) {\n        grids.push(columnCount);\n    }\n    var currentCount = rowCount * columnCount;\n    var remained = count - currentCount;\n    if (remained > 0) {\n        for (var i = 0; i < remained; i++) {\n            grids[i % rowCount] += 1;\n        }\n    }\n    return grids;\n}\nfunction divideSector(sectorShape, count, outShapes) {\n    var r0 = sectorShape.r0;\n    var r = sectorShape.r;\n    var startAngle = sectorShape.startAngle;\n    var endAngle = sectorShape.endAngle;\n    var angle = Math.abs(endAngle - startAngle);\n    var arcLen = angle * r;\n    var deltaR = r - r0;\n    var isAngleRow = arcLen > Math.abs(deltaR);\n    var grids = getDividingGrids([arcLen, deltaR], isAngleRow ? 0 : 1, count);\n    var rowSize = (isAngleRow ? angle : deltaR) / grids.length;\n    for (var row = 0; row < grids.length; row++) {\n        var columnSize = (isAngleRow ? deltaR : angle) / grids[row];\n        for (var column = 0; column < grids[row]; column++) {\n            var newShape = {};\n            if (isAngleRow) {\n                newShape.startAngle = startAngle + rowSize * row;\n                newShape.endAngle = startAngle + rowSize * (row + 1);\n                newShape.r0 = r0 + columnSize * column;\n                newShape.r = r0 + columnSize * (column + 1);\n            }\n            else {\n                newShape.startAngle = startAngle + columnSize * column;\n                newShape.endAngle = startAngle + columnSize * (column + 1);\n                newShape.r0 = r0 + rowSize * row;\n                newShape.r = r0 + rowSize * (row + 1);\n            }\n            newShape.clockwise = sectorShape.clockwise;\n            newShape.cx = sectorShape.cx;\n            newShape.cy = sectorShape.cy;\n            outShapes.push(newShape);\n        }\n    }\n}\nfunction divideRect(rectShape, count, outShapes) {\n    var width = rectShape.width;\n    var height = rectShape.height;\n    var isHorizontalRow = width > height;\n    var grids = getDividingGrids([width, height], isHorizontalRow ? 0 : 1, count);\n    var rowSizeDim = isHorizontalRow ? 'width' : 'height';\n    var columnSizeDim = isHorizontalRow ? 'height' : 'width';\n    var rowDim = isHorizontalRow ? 'x' : 'y';\n    var columnDim = isHorizontalRow ? 'y' : 'x';\n    var rowSize = rectShape[rowSizeDim] / grids.length;\n    for (var row = 0; row < grids.length; row++) {\n        var columnSize = rectShape[columnSizeDim] / grids[row];\n        for (var column = 0; column < grids[row]; column++) {\n            var newShape = {};\n            newShape[rowDim] = row * rowSize;\n            newShape[columnDim] = column * columnSize;\n            newShape[rowSizeDim] = rowSize;\n            newShape[columnSizeDim] = columnSize;\n            newShape.x += rectShape.x;\n            newShape.y += rectShape.y;\n            outShapes.push(newShape);\n        }\n    }\n}\nfunction crossProduct2d(x1, y1, x2, y2) {\n    return x1 * y2 - x2 * y1;\n}\nfunction lineLineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {\n    var mx = a2x - a1x;\n    var my = a2y - a1y;\n    var nx = b2x - b1x;\n    var ny = b2y - b1y;\n    var nmCrossProduct = crossProduct2d(nx, ny, mx, my);\n    if (Math.abs(nmCrossProduct) < 1e-6) {\n        return null;\n    }\n    var b1a1x = a1x - b1x;\n    var b1a1y = a1y - b1y;\n    var p = crossProduct2d(b1a1x, b1a1y, nx, ny) / nmCrossProduct;\n    if (p < 0 || p > 1) {\n        return null;\n    }\n    return new Point(p * mx + a1x, p * my + a1y);\n}\nfunction projPtOnLine(pt, lineA, lineB) {\n    var dir = new Point();\n    Point.sub(dir, lineB, lineA);\n    dir.normalize();\n    var dir2 = new Point();\n    Point.sub(dir2, pt, lineA);\n    var len = dir2.dot(dir);\n    return len;\n}\nfunction addToPoly(poly, pt) {\n    var last = poly[poly.length - 1];\n    if (last && last[0] === pt[0] && last[1] === pt[1]) {\n        return;\n    }\n    poly.push(pt);\n}\nfunction splitPolygonByLine(points, lineA, lineB) {\n    var len = points.length;\n    var intersections = [];\n    for (var i = 0; i < len; i++) {\n        var p0 = points[i];\n        var p1 = points[(i + 1) % len];\n        var intersectionPt = lineLineIntersect(p0[0], p0[1], p1[0], p1[1], lineA.x, lineA.y, lineB.x, lineB.y);\n        if (intersectionPt) {\n            intersections.push({\n                projPt: projPtOnLine(intersectionPt, lineA, lineB),\n                pt: intersectionPt,\n                idx: i\n            });\n        }\n    }\n    if (intersections.length < 2) {\n        return [{ points: points }, { points: points }];\n    }\n    intersections.sort(function (a, b) {\n        return a.projPt - b.projPt;\n    });\n    var splitPt0 = intersections[0];\n    var splitPt1 = intersections[intersections.length - 1];\n    if (splitPt1.idx < splitPt0.idx) {\n        var tmp = splitPt0;\n        splitPt0 = splitPt1;\n        splitPt1 = tmp;\n    }\n    var splitPt0Arr = [splitPt0.pt.x, splitPt0.pt.y];\n    var splitPt1Arr = [splitPt1.pt.x, splitPt1.pt.y];\n    var newPolyA = [splitPt0Arr];\n    var newPolyB = [splitPt1Arr];\n    for (var i = splitPt0.idx + 1; i <= splitPt1.idx; i++) {\n        addToPoly(newPolyA, points[i].slice());\n    }\n    addToPoly(newPolyA, splitPt1Arr);\n    addToPoly(newPolyA, splitPt0Arr);\n    for (var i = splitPt1.idx + 1; i <= splitPt0.idx + len; i++) {\n        addToPoly(newPolyB, points[i % len].slice());\n    }\n    addToPoly(newPolyB, splitPt0Arr);\n    addToPoly(newPolyB, splitPt1Arr);\n    return [{\n            points: newPolyA\n        }, {\n            points: newPolyB\n        }];\n}\nfunction binaryDividePolygon(polygonShape) {\n    var points = polygonShape.points;\n    var min = [];\n    var max = [];\n    fromPoints(points, min, max);\n    var boundingRect = new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n    var width = boundingRect.width;\n    var height = boundingRect.height;\n    var x = boundingRect.x;\n    var y = boundingRect.y;\n    var pt0 = new Point();\n    var pt1 = new Point();\n    if (width > height) {\n        pt0.x = pt1.x = x + width / 2;\n        pt0.y = y;\n        pt1.y = y + height;\n    }\n    else {\n        pt0.y = pt1.y = y + height / 2;\n        pt0.x = x;\n        pt1.x = x + width;\n    }\n    return splitPolygonByLine(points, pt0, pt1);\n}\nfunction binaryDivideRecursive(divider, shape, count, out) {\n    if (count === 1) {\n        out.push(shape);\n    }\n    else {\n        var mid = Math.floor(count / 2);\n        var sub = divider(shape);\n        binaryDivideRecursive(divider, sub[0], mid, out);\n        binaryDivideRecursive(divider, sub[1], count - mid, out);\n    }\n    return out;\n}\nexport function clone(path, count) {\n    var paths = [];\n    for (var i = 0; i < count; i++) {\n        paths.push(clonePath(path));\n    }\n    return paths;\n}\nfunction copyPathProps(source, target) {\n    target.setStyle(source.style);\n    target.z = source.z;\n    target.z2 = source.z2;\n    target.zlevel = source.zlevel;\n}\nfunction polygonConvert(points) {\n    var out = [];\n    for (var i = 0; i < points.length;) {\n        out.push([points[i++], points[i++]]);\n    }\n    return out;\n}\nexport function split(path, count) {\n    var outShapes = [];\n    var shape = path.shape;\n    var OutShapeCtor;\n    switch (path.type) {\n        case 'rect':\n            divideRect(shape, count, outShapes);\n            OutShapeCtor = Rect;\n            break;\n        case 'sector':\n            divideSector(shape, count, outShapes);\n            OutShapeCtor = Sector;\n            break;\n        case 'circle':\n            divideSector({\n                r0: 0, r: shape.r, startAngle: 0, endAngle: Math.PI * 2,\n                cx: shape.cx, cy: shape.cy\n            }, count, outShapes);\n            OutShapeCtor = Sector;\n            break;\n        default:\n            var m = path.getComputedTransform();\n            var scale = m ? Math.sqrt(Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3])) : 1;\n            var polygons = map(pathToPolygons(path.getUpdatedPathProxy(), scale), function (poly) { return polygonConvert(poly); });\n            var polygonCount = polygons.length;\n            if (polygonCount === 0) {\n                binaryDivideRecursive(binaryDividePolygon, {\n                    points: polygons[0]\n                }, count, outShapes);\n            }\n            else if (polygonCount === count) {\n                for (var i = 0; i < polygonCount; i++) {\n                    outShapes.push({\n                        points: polygons[i]\n                    });\n                }\n            }\n            else {\n                var totalArea_1 = 0;\n                var items = map(polygons, function (poly) {\n                    var min = [];\n                    var max = [];\n                    fromPoints(poly, min, max);\n                    var area = (max[1] - min[1]) * (max[0] - min[0]);\n                    totalArea_1 += area;\n                    return { poly: poly, area: area };\n                });\n                items.sort(function (a, b) { return b.area - a.area; });\n                var left = count;\n                for (var i = 0; i < polygonCount; i++) {\n                    var item = items[i];\n                    if (left <= 0) {\n                        break;\n                    }\n                    var selfCount = i === polygonCount - 1\n                        ? left\n                        : Math.ceil(item.area / totalArea_1 * count);\n                    if (selfCount < 0) {\n                        continue;\n                    }\n                    binaryDivideRecursive(binaryDividePolygon, {\n                        points: item.poly\n                    }, selfCount, outShapes);\n                    left -= selfCount;\n                }\n                ;\n            }\n            OutShapeCtor = Polygon;\n            break;\n    }\n    if (!OutShapeCtor) {\n        return clone(path, count);\n    }\n    var out = [];\n    for (var i = 0; i < outShapes.length; i++) {\n        var subPath = new OutShapeCtor();\n        subPath.setShape(outShapes[i]);\n        copyPathProps(path, subPath);\n        out.push(subPath);\n    }\n    return out;\n}\n", "import { cubicSubdivide } from '../core/curve.js';\nimport Path from '../graphic/Path.js';\nimport { defaults, map } from '../core/util.js';\nimport { lerp } from '../core/vector.js';\nimport { clonePath } from './path.js';\nimport Transformable from '../core/Transformable.js';\nimport { split } from './dividePath.js';\nimport { pathToBezierCurves } from './convertPath.js';\nfunction alignSubpath(subpath1, subpath2) {\n    var len1 = subpath1.length;\n    var len2 = subpath2.length;\n    if (len1 === len2) {\n        return [subpath1, subpath2];\n    }\n    var tmpSegX = [];\n    var tmpSegY = [];\n    var shorterPath = len1 < len2 ? subpath1 : subpath2;\n    var shorterLen = Math.min(len1, len2);\n    var diff = Math.abs(len2 - len1) / 6;\n    var shorterBezierCount = (shorterLen - 2) / 6;\n    var eachCurveSubDivCount = Math.ceil(diff / shorterBezierCount) + 1;\n    var newSubpath = [shorterPath[0], shorterPath[1]];\n    var remained = diff;\n    for (var i = 2; i < shorterLen;) {\n        var x0 = shorterPath[i - 2];\n        var y0 = shorterPath[i - 1];\n        var x1 = shorterPath[i++];\n        var y1 = shorterPath[i++];\n        var x2 = shorterPath[i++];\n        var y2 = shorterPath[i++];\n        var x3 = shorterPath[i++];\n        var y3 = shorterPath[i++];\n        if (remained <= 0) {\n            newSubpath.push(x1, y1, x2, y2, x3, y3);\n            continue;\n        }\n        var actualSubDivCount = Math.min(remained, eachCurveSubDivCount - 1) + 1;\n        for (var k = 1; k <= actualSubDivCount; k++) {\n            var p = k / actualSubDivCount;\n            cubicSubdivide(x0, x1, x2, x3, p, tmpSegX);\n            cubicSubdivide(y0, y1, y2, y3, p, tmpSegY);\n            x0 = tmpSegX[3];\n            y0 = tmpSegY[3];\n            newSubpath.push(tmpSegX[1], tmpSegY[1], tmpSegX[2], tmpSegY[2], x0, y0);\n            x1 = tmpSegX[5];\n            y1 = tmpSegY[5];\n            x2 = tmpSegX[6];\n            y2 = tmpSegY[6];\n        }\n        remained -= actualSubDivCount - 1;\n    }\n    return shorterPath === subpath1 ? [newSubpath, subpath2] : [subpath1, newSubpath];\n}\nfunction createSubpath(lastSubpathSubpath, otherSubpath) {\n    var len = lastSubpathSubpath.length;\n    var lastX = lastSubpathSubpath[len - 2];\n    var lastY = lastSubpathSubpath[len - 1];\n    var newSubpath = [];\n    for (var i = 0; i < otherSubpath.length;) {\n        newSubpath[i++] = lastX;\n        newSubpath[i++] = lastY;\n    }\n    return newSubpath;\n}\nexport function alignBezierCurves(array1, array2) {\n    var _a;\n    var lastSubpath1;\n    var lastSubpath2;\n    var newArray1 = [];\n    var newArray2 = [];\n    for (var i = 0; i < Math.max(array1.length, array2.length); i++) {\n        var subpath1 = array1[i];\n        var subpath2 = array2[i];\n        var newSubpath1 = void 0;\n        var newSubpath2 = void 0;\n        if (!subpath1) {\n            newSubpath1 = createSubpath(lastSubpath1 || subpath2, subpath2);\n            newSubpath2 = subpath2;\n        }\n        else if (!subpath2) {\n            newSubpath2 = createSubpath(lastSubpath2 || subpath1, subpath1);\n            newSubpath1 = subpath1;\n        }\n        else {\n            _a = alignSubpath(subpath1, subpath2), newSubpath1 = _a[0], newSubpath2 = _a[1];\n            lastSubpath1 = newSubpath1;\n            lastSubpath2 = newSubpath2;\n        }\n        newArray1.push(newSubpath1);\n        newArray2.push(newSubpath2);\n    }\n    return [newArray1, newArray2];\n}\nexport function centroid(array) {\n    var signedArea = 0;\n    var cx = 0;\n    var cy = 0;\n    var len = array.length;\n    for (var i = 0, j = len - 2; i < len; j = i, i += 2) {\n        var x0 = array[j];\n        var y0 = array[j + 1];\n        var x1 = array[i];\n        var y1 = array[i + 1];\n        var a = x0 * y1 - x1 * y0;\n        signedArea += a;\n        cx += (x0 + x1) * a;\n        cy += (y0 + y1) * a;\n    }\n    if (signedArea === 0) {\n        return [array[0] || 0, array[1] || 0];\n    }\n    return [cx / signedArea / 3, cy / signedArea / 3, signedArea];\n}\nfunction findBestRingOffset(fromSubBeziers, toSubBeziers, fromCp, toCp) {\n    var bezierCount = (fromSubBeziers.length - 2) / 6;\n    var bestScore = Infinity;\n    var bestOffset = 0;\n    var len = fromSubBeziers.length;\n    var len2 = len - 2;\n    for (var offset = 0; offset < bezierCount; offset++) {\n        var cursorOffset = offset * 6;\n        var score = 0;\n        for (var k = 0; k < len; k += 2) {\n            var idx = k === 0 ? cursorOffset : ((cursorOffset + k - 2) % len2 + 2);\n            var x0 = fromSubBeziers[idx] - fromCp[0];\n            var y0 = fromSubBeziers[idx + 1] - fromCp[1];\n            var x1 = toSubBeziers[k] - toCp[0];\n            var y1 = toSubBeziers[k + 1] - toCp[1];\n            var dx = x1 - x0;\n            var dy = y1 - y0;\n            score += dx * dx + dy * dy;\n        }\n        if (score < bestScore) {\n            bestScore = score;\n            bestOffset = offset;\n        }\n    }\n    return bestOffset;\n}\nfunction reverse(array) {\n    var newArr = [];\n    var len = array.length;\n    for (var i = 0; i < len; i += 2) {\n        newArr[i] = array[len - i - 2];\n        newArr[i + 1] = array[len - i - 1];\n    }\n    return newArr;\n}\nfunction findBestMorphingRotation(fromArr, toArr, searchAngleIteration, searchAngleRange) {\n    var result = [];\n    var fromNeedsReverse;\n    for (var i = 0; i < fromArr.length; i++) {\n        var fromSubpathBezier = fromArr[i];\n        var toSubpathBezier = toArr[i];\n        var fromCp = centroid(fromSubpathBezier);\n        var toCp = centroid(toSubpathBezier);\n        if (fromNeedsReverse == null) {\n            fromNeedsReverse = fromCp[2] < 0 !== toCp[2] < 0;\n        }\n        var newFromSubpathBezier = [];\n        var newToSubpathBezier = [];\n        var bestAngle = 0;\n        var bestScore = Infinity;\n        var tmpArr = [];\n        var len = fromSubpathBezier.length;\n        if (fromNeedsReverse) {\n            fromSubpathBezier = reverse(fromSubpathBezier);\n        }\n        var offset = findBestRingOffset(fromSubpathBezier, toSubpathBezier, fromCp, toCp) * 6;\n        var len2 = len - 2;\n        for (var k = 0; k < len2; k += 2) {\n            var idx = (offset + k) % len2 + 2;\n            newFromSubpathBezier[k + 2] = fromSubpathBezier[idx] - fromCp[0];\n            newFromSubpathBezier[k + 3] = fromSubpathBezier[idx + 1] - fromCp[1];\n        }\n        newFromSubpathBezier[0] = fromSubpathBezier[offset] - fromCp[0];\n        newFromSubpathBezier[1] = fromSubpathBezier[offset + 1] - fromCp[1];\n        if (searchAngleIteration > 0) {\n            var step = searchAngleRange / searchAngleIteration;\n            for (var angle = -searchAngleRange / 2; angle <= searchAngleRange / 2; angle += step) {\n                var sa = Math.sin(angle);\n                var ca = Math.cos(angle);\n                var score = 0;\n                for (var k = 0; k < fromSubpathBezier.length; k += 2) {\n                    var x0 = newFromSubpathBezier[k];\n                    var y0 = newFromSubpathBezier[k + 1];\n                    var x1 = toSubpathBezier[k] - toCp[0];\n                    var y1 = toSubpathBezier[k + 1] - toCp[1];\n                    var newX1 = x1 * ca - y1 * sa;\n                    var newY1 = x1 * sa + y1 * ca;\n                    tmpArr[k] = newX1;\n                    tmpArr[k + 1] = newY1;\n                    var dx = newX1 - x0;\n                    var dy = newY1 - y0;\n                    score += dx * dx + dy * dy;\n                }\n                if (score < bestScore) {\n                    bestScore = score;\n                    bestAngle = angle;\n                    for (var m = 0; m < tmpArr.length; m++) {\n                        newToSubpathBezier[m] = tmpArr[m];\n                    }\n                }\n            }\n        }\n        else {\n            for (var i_1 = 0; i_1 < len; i_1 += 2) {\n                newToSubpathBezier[i_1] = toSubpathBezier[i_1] - toCp[0];\n                newToSubpathBezier[i_1 + 1] = toSubpathBezier[i_1 + 1] - toCp[1];\n            }\n        }\n        result.push({\n            from: newFromSubpathBezier,\n            to: newToSubpathBezier,\n            fromCp: fromCp,\n            toCp: toCp,\n            rotation: -bestAngle\n        });\n    }\n    return result;\n}\nexport function isCombineMorphing(path) {\n    return path.__isCombineMorphing;\n}\nexport function isMorphing(el) {\n    return el.__morphT >= 0;\n}\nvar SAVED_METHOD_PREFIX = '__mOriginal_';\nfunction saveAndModifyMethod(obj, methodName, modifiers) {\n    var savedMethodName = SAVED_METHOD_PREFIX + methodName;\n    var originalMethod = obj[savedMethodName] || obj[methodName];\n    if (!obj[savedMethodName]) {\n        obj[savedMethodName] = obj[methodName];\n    }\n    var replace = modifiers.replace;\n    var after = modifiers.after;\n    var before = modifiers.before;\n    obj[methodName] = function () {\n        var args = arguments;\n        var res;\n        before && before.apply(this, args);\n        if (replace) {\n            res = replace.apply(this, args);\n        }\n        else {\n            res = originalMethod.apply(this, args);\n        }\n        after && after.apply(this, args);\n        return res;\n    };\n}\nfunction restoreMethod(obj, methodName) {\n    var savedMethodName = SAVED_METHOD_PREFIX + methodName;\n    if (obj[savedMethodName]) {\n        obj[methodName] = obj[savedMethodName];\n        obj[savedMethodName] = null;\n    }\n}\nfunction applyTransformOnBeziers(bezierCurves, mm) {\n    for (var i = 0; i < bezierCurves.length; i++) {\n        var subBeziers = bezierCurves[i];\n        for (var k = 0; k < subBeziers.length;) {\n            var x = subBeziers[k];\n            var y = subBeziers[k + 1];\n            subBeziers[k++] = mm[0] * x + mm[2] * y + mm[4];\n            subBeziers[k++] = mm[1] * x + mm[3] * y + mm[5];\n        }\n    }\n}\nfunction prepareMorphPath(fromPath, toPath) {\n    var fromPathProxy = fromPath.getUpdatedPathProxy();\n    var toPathProxy = toPath.getUpdatedPathProxy();\n    var _a = alignBezierCurves(pathToBezierCurves(fromPathProxy), pathToBezierCurves(toPathProxy)), fromBezierCurves = _a[0], toBezierCurves = _a[1];\n    var fromPathTransform = fromPath.getComputedTransform();\n    var toPathTransform = toPath.getComputedTransform();\n    function updateIdentityTransform() {\n        this.transform = null;\n    }\n    fromPathTransform && applyTransformOnBeziers(fromBezierCurves, fromPathTransform);\n    toPathTransform && applyTransformOnBeziers(toBezierCurves, toPathTransform);\n    saveAndModifyMethod(toPath, 'updateTransform', { replace: updateIdentityTransform });\n    toPath.transform = null;\n    var morphingData = findBestMorphingRotation(fromBezierCurves, toBezierCurves, 10, Math.PI);\n    var tmpArr = [];\n    saveAndModifyMethod(toPath, 'buildPath', { replace: function (path) {\n            var t = toPath.__morphT;\n            var onet = 1 - t;\n            var newCp = [];\n            for (var i = 0; i < morphingData.length; i++) {\n                var item = morphingData[i];\n                var from = item.from;\n                var to = item.to;\n                var angle = item.rotation * t;\n                var fromCp = item.fromCp;\n                var toCp = item.toCp;\n                var sa = Math.sin(angle);\n                var ca = Math.cos(angle);\n                lerp(newCp, fromCp, toCp, t);\n                for (var m = 0; m < from.length; m += 2) {\n                    var x0_1 = from[m];\n                    var y0_1 = from[m + 1];\n                    var x1 = to[m];\n                    var y1 = to[m + 1];\n                    var x = x0_1 * onet + x1 * t;\n                    var y = y0_1 * onet + y1 * t;\n                    tmpArr[m] = (x * ca - y * sa) + newCp[0];\n                    tmpArr[m + 1] = (x * sa + y * ca) + newCp[1];\n                }\n                var x0 = tmpArr[0];\n                var y0 = tmpArr[1];\n                path.moveTo(x0, y0);\n                for (var m = 2; m < from.length;) {\n                    var x1 = tmpArr[m++];\n                    var y1 = tmpArr[m++];\n                    var x2 = tmpArr[m++];\n                    var y2 = tmpArr[m++];\n                    var x3 = tmpArr[m++];\n                    var y3 = tmpArr[m++];\n                    if (x0 === x1 && y0 === y1 && x2 === x3 && y2 === y3) {\n                        path.lineTo(x3, y3);\n                    }\n                    else {\n                        path.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n                    }\n                    x0 = x3;\n                    y0 = y3;\n                }\n            }\n        } });\n}\nexport function morphPath(fromPath, toPath, animationOpts) {\n    if (!fromPath || !toPath) {\n        return toPath;\n    }\n    var oldDone = animationOpts.done;\n    var oldDuring = animationOpts.during;\n    prepareMorphPath(fromPath, toPath);\n    toPath.__morphT = 0;\n    function restoreToPath() {\n        restoreMethod(toPath, 'buildPath');\n        restoreMethod(toPath, 'updateTransform');\n        toPath.__morphT = -1;\n        toPath.createPathProxy();\n        toPath.dirtyShape();\n    }\n    toPath.animateTo({\n        __morphT: 1\n    }, defaults({\n        during: function (p) {\n            toPath.dirtyShape();\n            oldDuring && oldDuring(p);\n        },\n        done: function () {\n            restoreToPath();\n            oldDone && oldDone();\n        }\n    }, animationOpts));\n    return toPath;\n}\nfunction hilbert(x, y, minX, minY, maxX, maxY) {\n    var bits = 16;\n    x = (maxX === minX) ? 0 : Math.round(32767 * (x - minX) / (maxX - minX));\n    y = (maxY === minY) ? 0 : Math.round(32767 * (y - minY) / (maxY - minY));\n    var d = 0;\n    var tmp;\n    for (var s = (1 << bits) / 2; s > 0; s /= 2) {\n        var rx = 0;\n        var ry = 0;\n        if ((x & s) > 0) {\n            rx = 1;\n        }\n        if ((y & s) > 0) {\n            ry = 1;\n        }\n        d += s * s * ((3 * rx) ^ ry);\n        if (ry === 0) {\n            if (rx === 1) {\n                x = s - 1 - x;\n                y = s - 1 - y;\n            }\n            tmp = x;\n            x = y;\n            y = tmp;\n        }\n    }\n    return d;\n}\nfunction sortPaths(pathList) {\n    var xMin = Infinity;\n    var yMin = Infinity;\n    var xMax = -Infinity;\n    var yMax = -Infinity;\n    var cps = map(pathList, function (path) {\n        var rect = path.getBoundingRect();\n        var m = path.getComputedTransform();\n        var x = rect.x + rect.width / 2 + (m ? m[4] : 0);\n        var y = rect.y + rect.height / 2 + (m ? m[5] : 0);\n        xMin = Math.min(x, xMin);\n        yMin = Math.min(y, yMin);\n        xMax = Math.max(x, xMax);\n        yMax = Math.max(y, yMax);\n        return [x, y];\n    });\n    var items = map(cps, function (cp, idx) {\n        return {\n            cp: cp,\n            z: hilbert(cp[0], cp[1], xMin, yMin, xMax, yMax),\n            path: pathList[idx]\n        };\n    });\n    return items.sort(function (a, b) { return a.z - b.z; }).map(function (item) { return item.path; });\n}\n;\nfunction defaultDividePath(param) {\n    return split(param.path, param.count);\n}\nfunction createEmptyReturn() {\n    return {\n        fromIndividuals: [],\n        toIndividuals: [],\n        count: 0\n    };\n}\nexport function combineMorph(fromList, toPath, animationOpts) {\n    var fromPathList = [];\n    function addFromPath(fromList) {\n        for (var i = 0; i < fromList.length; i++) {\n            var from = fromList[i];\n            if (isCombineMorphing(from)) {\n                addFromPath(from.childrenRef());\n            }\n            else if (from instanceof Path) {\n                fromPathList.push(from);\n            }\n        }\n    }\n    addFromPath(fromList);\n    var separateCount = fromPathList.length;\n    if (!separateCount) {\n        return createEmptyReturn();\n    }\n    var dividePath = animationOpts.dividePath || defaultDividePath;\n    var toSubPathList = dividePath({\n        path: toPath, count: separateCount\n    });\n    if (toSubPathList.length !== separateCount) {\n        console.error('Invalid morphing: unmatched splitted path');\n        return createEmptyReturn();\n    }\n    fromPathList = sortPaths(fromPathList);\n    toSubPathList = sortPaths(toSubPathList);\n    var oldDone = animationOpts.done;\n    var oldDuring = animationOpts.during;\n    var individualDelay = animationOpts.individualDelay;\n    var identityTransform = new Transformable();\n    for (var i = 0; i < separateCount; i++) {\n        var from = fromPathList[i];\n        var to = toSubPathList[i];\n        to.parent = toPath;\n        to.copyTransform(identityTransform);\n        if (!individualDelay) {\n            prepareMorphPath(from, to);\n        }\n    }\n    toPath.__isCombineMorphing = true;\n    toPath.childrenRef = function () {\n        return toSubPathList;\n    };\n    function addToSubPathListToZr(zr) {\n        for (var i = 0; i < toSubPathList.length; i++) {\n            toSubPathList[i].addSelfToZr(zr);\n        }\n    }\n    saveAndModifyMethod(toPath, 'addSelfToZr', {\n        after: function (zr) {\n            addToSubPathListToZr(zr);\n        }\n    });\n    saveAndModifyMethod(toPath, 'removeSelfFromZr', {\n        after: function (zr) {\n            for (var i = 0; i < toSubPathList.length; i++) {\n                toSubPathList[i].removeSelfFromZr(zr);\n            }\n        }\n    });\n    function restoreToPath() {\n        toPath.__isCombineMorphing = false;\n        toPath.__morphT = -1;\n        toPath.childrenRef = null;\n        restoreMethod(toPath, 'addSelfToZr');\n        restoreMethod(toPath, 'removeSelfFromZr');\n    }\n    var toLen = toSubPathList.length;\n    if (individualDelay) {\n        var animating_1 = toLen;\n        var eachDone = function () {\n            animating_1--;\n            if (animating_1 === 0) {\n                restoreToPath();\n                oldDone && oldDone();\n            }\n        };\n        for (var i = 0; i < toLen; i++) {\n            var indivdualAnimationOpts = individualDelay ? defaults({\n                delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toSubPathList[i]),\n                done: eachDone\n            }, animationOpts) : animationOpts;\n            morphPath(fromPathList[i], toSubPathList[i], indivdualAnimationOpts);\n        }\n    }\n    else {\n        toPath.__morphT = 0;\n        toPath.animateTo({\n            __morphT: 1\n        }, defaults({\n            during: function (p) {\n                for (var i = 0; i < toLen; i++) {\n                    var child = toSubPathList[i];\n                    child.__morphT = toPath.__morphT;\n                    child.dirtyShape();\n                }\n                oldDuring && oldDuring(p);\n            },\n            done: function () {\n                restoreToPath();\n                for (var i = 0; i < fromList.length; i++) {\n                    restoreMethod(fromList[i], 'updateTransform');\n                }\n                oldDone && oldDone();\n            }\n        }, animationOpts));\n    }\n    if (toPath.__zr) {\n        addToSubPathListToZr(toPath.__zr);\n    }\n    return {\n        fromIndividuals: fromPathList,\n        toIndividuals: toSubPathList,\n        count: toLen\n    };\n}\nexport function separateMorph(fromPath, toPathList, animationOpts) {\n    var toLen = toPathList.length;\n    var fromPathList = [];\n    var dividePath = animationOpts.dividePath || defaultDividePath;\n    function addFromPath(fromList) {\n        for (var i = 0; i < fromList.length; i++) {\n            var from = fromList[i];\n            if (isCombineMorphing(from)) {\n                addFromPath(from.childrenRef());\n            }\n            else if (from instanceof Path) {\n                fromPathList.push(from);\n            }\n        }\n    }\n    if (isCombineMorphing(fromPath)) {\n        addFromPath(fromPath.childrenRef());\n        var fromLen = fromPathList.length;\n        if (fromLen < toLen) {\n            var k = 0;\n            for (var i = fromLen; i < toLen; i++) {\n                fromPathList.push(clonePath(fromPathList[k++ % fromLen]));\n            }\n        }\n        fromPathList.length = toLen;\n    }\n    else {\n        fromPathList = dividePath({ path: fromPath, count: toLen });\n        var fromPathTransform = fromPath.getComputedTransform();\n        for (var i = 0; i < fromPathList.length; i++) {\n            fromPathList[i].setLocalTransform(fromPathTransform);\n        }\n        if (fromPathList.length !== toLen) {\n            console.error('Invalid morphing: unmatched splitted path');\n            return createEmptyReturn();\n        }\n    }\n    fromPathList = sortPaths(fromPathList);\n    toPathList = sortPaths(toPathList);\n    var individualDelay = animationOpts.individualDelay;\n    for (var i = 0; i < toLen; i++) {\n        var indivdualAnimationOpts = individualDelay ? defaults({\n            delay: (animationOpts.delay || 0) + individualDelay(i, toLen, fromPathList[i], toPathList[i])\n        }, animationOpts) : animationOpts;\n        morphPath(fromPathList[i], toPathList[i], indivdualAnimationOpts);\n    }\n    return {\n        fromIndividuals: fromPathList,\n        toIndividuals: toPathList,\n        count: toPathList.length\n    };\n}\nexport { split as defaultDividePath };\n", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { separateMorph, combineMorph, morphPath, isCombineMorphing } from 'zrender/lib/tool/morphPath.js';\nimport { Path } from '../util/graphic.js';\nimport { defaults, isArray } from 'zrender/lib/core/util.js';\nimport { getAnimationConfig } from './basicTransition.js';\nimport { clonePath } from 'zrender/lib/tool/path.js';\nfunction isMultiple(elements) {\n  return isArray(elements[0]);\n}\nfunction prepareMorphBatches(one, many) {\n  var batches = [];\n  var batchCount = one.length;\n  for (var i = 0; i < batchCount; i++) {\n    batches.push({\n      one: one[i],\n      many: []\n    });\n  }\n  for (var i = 0; i < many.length; i++) {\n    var len = many[i].length;\n    var k = void 0;\n    for (k = 0; k < len; k++) {\n      batches[k % batchCount].many.push(many[i][k]);\n    }\n  }\n  var off = 0;\n  // If one has more paths than each one of many. average them.\n  for (var i = batchCount - 1; i >= 0; i--) {\n    if (!batches[i].many.length) {\n      var moveFrom = batches[off].many;\n      if (moveFrom.length <= 1) {\n        // Not enough\n        // Start from the first one.\n        if (off) {\n          off = 0;\n        } else {\n          return batches;\n        }\n      }\n      var len = moveFrom.length;\n      var mid = Math.ceil(len / 2);\n      batches[i].many = moveFrom.slice(mid, len);\n      batches[off].many = moveFrom.slice(0, mid);\n      off++;\n    }\n  }\n  return batches;\n}\nvar pathDividers = {\n  clone: function (params) {\n    var ret = [];\n    // Fitting the alpha\n    var approxOpacity = 1 - Math.pow(1 - params.path.style.opacity, 1 / params.count);\n    for (var i = 0; i < params.count; i++) {\n      var cloned = clonePath(params.path);\n      cloned.setStyle('opacity', approxOpacity);\n      ret.push(cloned);\n    }\n    return ret;\n  },\n  // Use the default divider\n  split: null\n};\nexport function applyMorphAnimation(from, to, divideShape, seriesModel, dataIndex, animateOtherProps) {\n  if (!from.length || !to.length) {\n    return;\n  }\n  var updateAnimationCfg = getAnimationConfig('update', seriesModel, dataIndex);\n  if (!(updateAnimationCfg && updateAnimationCfg.duration > 0)) {\n    return;\n  }\n  var animationDelay = seriesModel.getModel('universalTransition').get('delay');\n  var animationCfg = Object.assign({\n    // Need to setToFinal so the further calculation based on the style can be correct.\n    // Like emphasis color.\n    setToFinal: true\n  }, updateAnimationCfg);\n  var many;\n  var one;\n  if (isMultiple(from)) {\n    // manyToOne\n    many = from;\n    one = to;\n  }\n  if (isMultiple(to)) {\n    // oneToMany\n    many = to;\n    one = from;\n  }\n  function morphOneBatch(batch, fromIsMany, animateIndex, animateCount, forceManyOne) {\n    var batchMany = batch.many;\n    var batchOne = batch.one;\n    if (batchMany.length === 1 && !forceManyOne) {\n      // Is one to one\n      var batchFrom = fromIsMany ? batchMany[0] : batchOne;\n      var batchTo = fromIsMany ? batchOne : batchMany[0];\n      if (isCombineMorphing(batchFrom)) {\n        // Keep doing combine animation.\n        morphOneBatch({\n          many: [batchFrom],\n          one: batchTo\n        }, true, animateIndex, animateCount, true);\n      } else {\n        var individualAnimationCfg = animationDelay ? defaults({\n          delay: animationDelay(animateIndex, animateCount)\n        }, animationCfg) : animationCfg;\n        morphPath(batchFrom, batchTo, individualAnimationCfg);\n        animateOtherProps(batchFrom, batchTo, batchFrom, batchTo, individualAnimationCfg);\n      }\n    } else {\n      var separateAnimationCfg = defaults({\n        dividePath: pathDividers[divideShape],\n        individualDelay: animationDelay && function (idx, count, fromPath, toPath) {\n          return animationDelay(idx + animateIndex, animateCount);\n        }\n      }, animationCfg);\n      var _a = fromIsMany ? combineMorph(batchMany, batchOne, separateAnimationCfg) : separateMorph(batchOne, batchMany, separateAnimationCfg),\n        fromIndividuals = _a.fromIndividuals,\n        toIndividuals = _a.toIndividuals;\n      var count = fromIndividuals.length;\n      for (var k = 0; k < count; k++) {\n        var individualAnimationCfg = animationDelay ? defaults({\n          delay: animationDelay(k, count)\n        }, animationCfg) : animationCfg;\n        animateOtherProps(fromIndividuals[k], toIndividuals[k], fromIsMany ? batchMany[k] : batch.one, fromIsMany ? batch.one : batchMany[k], individualAnimationCfg);\n      }\n    }\n  }\n  var fromIsMany = many ? many === from\n  // Is one to one. If the path number not match. also needs do merge and separate morphing.\n  : from.length > to.length;\n  var morphBatches = many ? prepareMorphBatches(one, many) : prepareMorphBatches(fromIsMany ? to : from, [fromIsMany ? from : to]);\n  var animateCount = 0;\n  for (var i = 0; i < morphBatches.length; i++) {\n    animateCount += morphBatches[i].many.length;\n  }\n  var animateIndex = 0;\n  for (var i = 0; i < morphBatches.length; i++) {\n    morphOneBatch(morphBatches[i], fromIsMany, animateIndex, animateCount);\n    animateIndex += morphBatches[i].many.length;\n  }\n}\nexport function getPathList(elements) {\n  if (!elements) {\n    return [];\n  }\n  if (isArray(elements)) {\n    var pathList_1 = [];\n    for (var i = 0; i < elements.length; i++) {\n      pathList_1.push(getPathList(elements[i]));\n    }\n    return pathList_1;\n  }\n  var pathList = [];\n  elements.traverse(function (el) {\n    if (el instanceof Path && !el.disableMorphing && !el.invisible && !el.ignore) {\n      pathList.push(el);\n    }\n  });\n  return pathList;\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n// Universal transitions that can animate between any shapes(series) and any properties in any amounts.\nimport { SERIES_UNIVERSAL_TRANSITION_PROP } from '../model/Series.js';\nimport { createHashMap, each, map, filter, isArray, extend } from 'zrender/lib/core/util.js';\nimport { applyMorphAnimation, getPathList } from './morphTransitionHelper.js';\nimport Path from 'zrender/lib/graphic/Path.js';\nimport { initProps } from '../util/graphic.js';\nimport DataDiffer from '../data/DataDiffer.js';\nimport { makeInner, normalizeToArray } from '../util/model.js';\nimport { warn } from '../util/log.js';\nimport { getAnimationConfig, getOldStyle } from './basicTransition.js';\nimport Displayable from 'zrender/lib/graphic/Displayable.js';\nvar DATA_COUNT_THRESHOLD = 1e4;\nvar TRANSITION_NONE = 0;\nvar TRANSITION_P2C = 1;\nvar TRANSITION_C2P = 2;\n;\nvar getUniversalTransitionGlobalStore = makeInner();\nfunction getDimension(data, visualDimension) {\n  var dimensions = data.dimensions;\n  for (var i = 0; i < dimensions.length; i++) {\n    var dimInfo = data.getDimensionInfo(dimensions[i]);\n    if (dimInfo && dimInfo.otherDims[visualDimension] === 0) {\n      return dimensions[i];\n    }\n  }\n}\n// get value by dimension. (only get value of itemGroupId or childGroupId, so convert it to string)\nfunction getValueByDimension(data, dataIndex, dimension) {\n  var dimInfo = data.getDimensionInfo(dimension);\n  var dimOrdinalMeta = dimInfo && dimInfo.ordinalMeta;\n  if (dimInfo) {\n    var value = data.get(dimInfo.name, dataIndex);\n    if (dimOrdinalMeta) {\n      return dimOrdinalMeta.categories[value] || value + '';\n    }\n    return value + '';\n  }\n}\nfunction getGroupId(data, dataIndex, dataGroupId, isChild) {\n  // try to get groupId from encode\n  var visualDimension = isChild ? 'itemChildGroupId' : 'itemGroupId';\n  var groupIdDim = getDimension(data, visualDimension);\n  if (groupIdDim) {\n    var groupId = getValueByDimension(data, dataIndex, groupIdDim);\n    return groupId;\n  }\n  // try to get groupId from raw data item\n  var rawDataItem = data.getRawDataItem(dataIndex);\n  var property = isChild ? 'childGroupId' : 'groupId';\n  if (rawDataItem && rawDataItem[property]) {\n    return rawDataItem[property] + '';\n  }\n  // fallback\n  if (isChild) {\n    return;\n  }\n  // try to use series.dataGroupId as groupId, otherwise use dataItem's id as groupId\n  return dataGroupId || data.getId(dataIndex);\n}\n// flatten all data items from different serieses into one arrary\nfunction flattenDataDiffItems(list) {\n  var items = [];\n  each(list, function (seriesInfo) {\n    var data = seriesInfo.data;\n    var dataGroupId = seriesInfo.dataGroupId;\n    if (data.count() > DATA_COUNT_THRESHOLD) {\n      if (process.env.NODE_ENV !== 'production') {\n        warn('Universal transition is disabled on large data > 10k.');\n      }\n      return;\n    }\n    var indices = data.getIndices();\n    for (var dataIndex = 0; dataIndex < indices.length; dataIndex++) {\n      items.push({\n        data: data,\n        groupId: getGroupId(data, dataIndex, dataGroupId, false),\n        childGroupId: getGroupId(data, dataIndex, dataGroupId, true),\n        divide: seriesInfo.divide,\n        dataIndex: dataIndex\n      });\n    }\n  });\n  return items;\n}\nfunction fadeInElement(newEl, newSeries, newIndex) {\n  newEl.traverse(function (el) {\n    if (el instanceof Path) {\n      // TODO use fade in animation for target element.\n      initProps(el, {\n        style: {\n          opacity: 0\n        }\n      }, newSeries, {\n        dataIndex: newIndex,\n        isFrom: true\n      });\n    }\n  });\n}\nfunction removeEl(el) {\n  if (el.parent) {\n    // Bake parent transform to element.\n    // So it can still have proper transform to transition after it's removed.\n    var computedTransform = el.getComputedTransform();\n    el.setLocalTransform(computedTransform);\n    el.parent.remove(el);\n  }\n}\nfunction stopAnimation(el) {\n  el.stopAnimation();\n  if (el.isGroup) {\n    el.traverse(function (child) {\n      child.stopAnimation();\n    });\n  }\n}\nfunction animateElementStyles(el, dataIndex, seriesModel) {\n  var animationConfig = getAnimationConfig('update', seriesModel, dataIndex);\n  animationConfig && el.traverse(function (child) {\n    if (child instanceof Displayable) {\n      var oldStyle = getOldStyle(child);\n      if (oldStyle) {\n        child.animateFrom({\n          style: oldStyle\n        }, animationConfig);\n      }\n    }\n  });\n}\nfunction isAllIdSame(oldDiffItems, newDiffItems) {\n  var len = oldDiffItems.length;\n  if (len !== newDiffItems.length) {\n    return false;\n  }\n  for (var i = 0; i < len; i++) {\n    var oldItem = oldDiffItems[i];\n    var newItem = newDiffItems[i];\n    if (oldItem.data.getId(oldItem.dataIndex) !== newItem.data.getId(newItem.dataIndex)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction transitionBetween(oldList, newList, api) {\n  var oldDiffItems = flattenDataDiffItems(oldList);\n  var newDiffItems = flattenDataDiffItems(newList);\n  function updateMorphingPathProps(from, to, rawFrom, rawTo, animationCfg) {\n    if (rawFrom || from) {\n      to.animateFrom({\n        style: rawFrom && rawFrom !== from\n        // dividingMethod like clone may override the style(opacity)\n        // So extend it to raw style.\n        ? extend(extend({}, rawFrom.style), from.style) : from.style\n      }, animationCfg);\n    }\n  }\n  var hasMorphAnimation = false;\n  /**\n   * With groupId and childGroupId, we can build parent-child relationships between dataItems.\n   * However, we should mind the parent-child \"direction\" between old and new options.\n   *\n   * For example, suppose we have two dataItems from two series.data:\n   *\n   * dataA: [                          dataB: [\n   *   {                                 {\n   *     value: 5,                         value: 3,\n   *     groupId: 'creatures',             groupId: 'animals',\n   *     childGroupId: 'animals'           childGroupId: 'dogs'\n   *   },                                },\n   *   ...                               ...\n   * ]                                 ]\n   *\n   * where dataA is belong to optionA and dataB is belong to optionB.\n   *\n   * When we `setOption(optionB)` from optionA, we choose childGroupId of dataItemA and groupId of\n   * dataItemB as keys so the two keys are matched (both are 'animals'), then universalTransition\n   * will work. This derection is \"parent -> child\".\n   *\n   * If we `setOption(optionA)` from optionB, we also choose groupId of dataItemB and childGroupId\n   * of dataItemA as keys and universalTransition will work. This derection is \"child -> parent\".\n   *\n   * If there is no childGroupId specified, which means no multiLevelDrillDown/Up is needed and no\n   * parent-child relationship exists. This direction is \"none\".\n   *\n   * So we need to know whether to use groupId or childGroupId as the key when we call the keyGetter\n   * functions. Thus, we need to decide the direction first.\n   *\n   * The rule is:\n   *\n   * if (all childGroupIds in oldDiffItems and all groupIds in newDiffItems have common value) {\n   *   direction = 'parent -> child';\n   * } else if (all groupIds in oldDiffItems and all childGroupIds in newDiffItems have common value) {\n   *   direction = 'child -> parent';\n   * } else {\n   *   direction = 'none';\n   * }\n   */\n  var direction = TRANSITION_NONE;\n  // find all groupIds and childGroupIds from oldDiffItems\n  var oldGroupIds = createHashMap();\n  var oldChildGroupIds = createHashMap();\n  oldDiffItems.forEach(function (item) {\n    item.groupId && oldGroupIds.set(item.groupId, true);\n    item.childGroupId && oldChildGroupIds.set(item.childGroupId, true);\n  });\n  // traverse newDiffItems and decide the direction according to the rule\n  for (var i = 0; i < newDiffItems.length; i++) {\n    var newGroupId = newDiffItems[i].groupId;\n    if (oldChildGroupIds.get(newGroupId)) {\n      direction = TRANSITION_P2C;\n      break;\n    }\n    var newChildGroupId = newDiffItems[i].childGroupId;\n    if (newChildGroupId && oldGroupIds.get(newChildGroupId)) {\n      direction = TRANSITION_C2P;\n      break;\n    }\n  }\n  function createKeyGetter(isOld, onlyGetId) {\n    return function (diffItem) {\n      var data = diffItem.data;\n      var dataIndex = diffItem.dataIndex;\n      // TODO if specified dim\n      if (onlyGetId) {\n        return data.getId(dataIndex);\n      }\n      if (isOld) {\n        return direction === TRANSITION_P2C ? diffItem.childGroupId : diffItem.groupId;\n      } else {\n        return direction === TRANSITION_C2P ? diffItem.childGroupId : diffItem.groupId;\n      }\n    };\n  }\n  // Use id if it's very likely to be an one to one animation\n  // It's more robust than groupId\n  // TODO Check if key dimension is specified.\n  var useId = isAllIdSame(oldDiffItems, newDiffItems);\n  var isElementStillInChart = {};\n  if (!useId) {\n    // We may have different diff strategy with basicTransition if we use other dimension as key.\n    // If so, we can't simply check if oldEl is same with newEl. We need a map to check if oldEl is still being used in the new chart.\n    // We can't use the elements that already being morphed. Let it keep it's original basic transition.\n    for (var i = 0; i < newDiffItems.length; i++) {\n      var newItem = newDiffItems[i];\n      var el = newItem.data.getItemGraphicEl(newItem.dataIndex);\n      if (el) {\n        isElementStillInChart[el.id] = true;\n      }\n    }\n  }\n  function updateOneToOne(newIndex, oldIndex) {\n    var oldItem = oldDiffItems[oldIndex];\n    var newItem = newDiffItems[newIndex];\n    var newSeries = newItem.data.hostModel;\n    // TODO Mark this elements is morphed and don't morph them anymore\n    var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex);\n    var newEl = newItem.data.getItemGraphicEl(newItem.dataIndex);\n    // Can't handle same elements.\n    if (oldEl === newEl) {\n      newEl && animateElementStyles(newEl, newItem.dataIndex, newSeries);\n      return;\n    }\n    if (\n    // We can't use the elements that already being morphed\n    oldEl && isElementStillInChart[oldEl.id]) {\n      return;\n    }\n    if (newEl) {\n      // TODO: If keep animating the group in case\n      // some of the elements don't want to be morphed.\n      // TODO Label?\n      stopAnimation(newEl);\n      if (oldEl) {\n        stopAnimation(oldEl);\n        // If old element is doing leaving animation. stop it and remove it immediately.\n        removeEl(oldEl);\n        hasMorphAnimation = true;\n        applyMorphAnimation(getPathList(oldEl), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps);\n      } else {\n        fadeInElement(newEl, newSeries, newIndex);\n      }\n    }\n    // else keep oldEl leaving animation.\n  }\n  new DataDiffer(oldDiffItems, newDiffItems, createKeyGetter(true, useId), createKeyGetter(false, useId), null, 'multiple').update(updateOneToOne).updateManyToOne(function (newIndex, oldIndices) {\n    var newItem = newDiffItems[newIndex];\n    var newData = newItem.data;\n    var newSeries = newData.hostModel;\n    var newEl = newData.getItemGraphicEl(newItem.dataIndex);\n    var oldElsList = filter(map(oldIndices, function (idx) {\n      return oldDiffItems[idx].data.getItemGraphicEl(oldDiffItems[idx].dataIndex);\n    }), function (oldEl) {\n      return oldEl && oldEl !== newEl && !isElementStillInChart[oldEl.id];\n    });\n    if (newEl) {\n      stopAnimation(newEl);\n      if (oldElsList.length) {\n        // If old element is doing leaving animation. stop it and remove it immediately.\n        each(oldElsList, function (oldEl) {\n          stopAnimation(oldEl);\n          removeEl(oldEl);\n        });\n        hasMorphAnimation = true;\n        applyMorphAnimation(getPathList(oldElsList), getPathList(newEl), newItem.divide, newSeries, newIndex, updateMorphingPathProps);\n      } else {\n        fadeInElement(newEl, newSeries, newItem.dataIndex);\n      }\n    }\n    // else keep oldEl leaving animation.\n  }).updateOneToMany(function (newIndices, oldIndex) {\n    var oldItem = oldDiffItems[oldIndex];\n    var oldEl = oldItem.data.getItemGraphicEl(oldItem.dataIndex);\n    // We can't use the elements that already being morphed\n    if (oldEl && isElementStillInChart[oldEl.id]) {\n      return;\n    }\n    var newElsList = filter(map(newIndices, function (idx) {\n      return newDiffItems[idx].data.getItemGraphicEl(newDiffItems[idx].dataIndex);\n    }), function (el) {\n      return el && el !== oldEl;\n    });\n    var newSeris = newDiffItems[newIndices[0]].data.hostModel;\n    if (newElsList.length) {\n      each(newElsList, function (newEl) {\n        return stopAnimation(newEl);\n      });\n      if (oldEl) {\n        stopAnimation(oldEl);\n        // If old element is doing leaving animation. stop it and remove it immediately.\n        removeEl(oldEl);\n        hasMorphAnimation = true;\n        applyMorphAnimation(getPathList(oldEl), getPathList(newElsList), oldItem.divide,\n        // Use divide on old.\n        newSeris, newIndices[0], updateMorphingPathProps);\n      } else {\n        each(newElsList, function (newEl) {\n          return fadeInElement(newEl, newSeris, newIndices[0]);\n        });\n      }\n    }\n    // else keep oldEl leaving animation.\n  }).updateManyToMany(function (newIndices, oldIndices) {\n    // If two data are same and both have groupId.\n    // Normally they should be diff by id.\n    new DataDiffer(oldIndices, newIndices, function (rawIdx) {\n      return oldDiffItems[rawIdx].data.getId(oldDiffItems[rawIdx].dataIndex);\n    }, function (rawIdx) {\n      return newDiffItems[rawIdx].data.getId(newDiffItems[rawIdx].dataIndex);\n    }).update(function (newIndex, oldIndex) {\n      // Use the original index\n      updateOneToOne(newIndices[newIndex], oldIndices[oldIndex]);\n    }).execute();\n  }).execute();\n  if (hasMorphAnimation) {\n    each(newList, function (_a) {\n      var data = _a.data;\n      var seriesModel = data.hostModel;\n      var view = seriesModel && api.getViewOfSeriesModel(seriesModel);\n      var animationCfg = getAnimationConfig('update', seriesModel, 0); // use 0 index.\n      if (view && seriesModel.isAnimationEnabled() && animationCfg && animationCfg.duration > 0) {\n        view.group.traverse(function (el) {\n          if (el instanceof Path && !el.animators.length) {\n            // We can't accept there still exists element that has no animation\n            // if universalTransition is enabled\n            el.animateFrom({\n              style: {\n                opacity: 0\n              }\n            }, animationCfg);\n          }\n        });\n      }\n    });\n  }\n}\nfunction getSeriesTransitionKey(series) {\n  var seriesKey = series.getModel('universalTransition').get('seriesKey');\n  if (!seriesKey) {\n    // Use series id by default.\n    return series.id;\n  }\n  return seriesKey;\n}\nfunction convertArraySeriesKeyToString(seriesKey) {\n  if (isArray(seriesKey)) {\n    // Order independent.\n    return seriesKey.sort().join(',');\n  }\n  return seriesKey;\n}\nfunction getDivideShapeFromData(data) {\n  if (data.hostModel) {\n    return data.hostModel.getModel('universalTransition').get('divideShape');\n  }\n}\nfunction findTransitionSeriesBatches(globalStore, params) {\n  var updateBatches = createHashMap();\n  var oldDataMap = createHashMap();\n  // Map that only store key in array seriesKey.\n  // Which is used to query the old data when transition from one to multiple series.\n  var oldDataMapForSplit = createHashMap();\n  each(globalStore.oldSeries, function (series, idx) {\n    var oldDataGroupId = globalStore.oldDataGroupIds[idx];\n    var oldData = globalStore.oldData[idx];\n    var transitionKey = getSeriesTransitionKey(series);\n    var transitionKeyStr = convertArraySeriesKeyToString(transitionKey);\n    oldDataMap.set(transitionKeyStr, {\n      dataGroupId: oldDataGroupId,\n      data: oldData\n    });\n    if (isArray(transitionKey)) {\n      // Same key can't in different array seriesKey.\n      each(transitionKey, function (key) {\n        oldDataMapForSplit.set(key, {\n          key: transitionKeyStr,\n          dataGroupId: oldDataGroupId,\n          data: oldData\n        });\n      });\n    }\n  });\n  function checkTransitionSeriesKeyDuplicated(transitionKeyStr) {\n    if (updateBatches.get(transitionKeyStr)) {\n      warn(\"Duplicated seriesKey in universalTransition \" + transitionKeyStr);\n    }\n  }\n  each(params.updatedSeries, function (series) {\n    if (series.isUniversalTransitionEnabled() && series.isAnimationEnabled()) {\n      var newDataGroupId = series.get('dataGroupId');\n      var newData = series.getData();\n      var transitionKey = getSeriesTransitionKey(series);\n      var transitionKeyStr = convertArraySeriesKeyToString(transitionKey);\n      // Only transition between series with same id.\n      var oldData = oldDataMap.get(transitionKeyStr);\n      // string transition key is the best match.\n      if (oldData) {\n        if (process.env.NODE_ENV !== 'production') {\n          checkTransitionSeriesKeyDuplicated(transitionKeyStr);\n        }\n        // TODO check if data is same?\n        updateBatches.set(transitionKeyStr, {\n          oldSeries: [{\n            dataGroupId: oldData.dataGroupId,\n            divide: getDivideShapeFromData(oldData.data),\n            data: oldData.data\n          }],\n          newSeries: [{\n            dataGroupId: newDataGroupId,\n            divide: getDivideShapeFromData(newData),\n            data: newData\n          }]\n        });\n      } else {\n        // Transition from multiple series.\n        // e.g. 'female', 'male' -> ['female', 'male']\n        if (isArray(transitionKey)) {\n          if (process.env.NODE_ENV !== 'production') {\n            checkTransitionSeriesKeyDuplicated(transitionKeyStr);\n          }\n          var oldSeries_1 = [];\n          each(transitionKey, function (key) {\n            var oldData = oldDataMap.get(key);\n            if (oldData.data) {\n              oldSeries_1.push({\n                dataGroupId: oldData.dataGroupId,\n                divide: getDivideShapeFromData(oldData.data),\n                data: oldData.data\n              });\n            }\n          });\n          if (oldSeries_1.length) {\n            updateBatches.set(transitionKeyStr, {\n              oldSeries: oldSeries_1,\n              newSeries: [{\n                dataGroupId: newDataGroupId,\n                data: newData,\n                divide: getDivideShapeFromData(newData)\n              }]\n            });\n          }\n        } else {\n          // Try transition to multiple series.\n          // e.g. ['female', 'male'] -> 'female', 'male'\n          var oldData_1 = oldDataMapForSplit.get(transitionKey);\n          if (oldData_1) {\n            var batch = updateBatches.get(oldData_1.key);\n            if (!batch) {\n              batch = {\n                oldSeries: [{\n                  dataGroupId: oldData_1.dataGroupId,\n                  data: oldData_1.data,\n                  divide: getDivideShapeFromData(oldData_1.data)\n                }],\n                newSeries: []\n              };\n              updateBatches.set(oldData_1.key, batch);\n            }\n            batch.newSeries.push({\n              dataGroupId: newDataGroupId,\n              data: newData,\n              divide: getDivideShapeFromData(newData)\n            });\n          }\n        }\n      }\n    }\n  });\n  return updateBatches;\n}\nfunction querySeries(series, finder) {\n  for (var i = 0; i < series.length; i++) {\n    var found = finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id;\n    if (found) {\n      return i;\n    }\n  }\n}\nfunction transitionSeriesFromOpt(transitionOpt, globalStore, params, api) {\n  var from = [];\n  var to = [];\n  each(normalizeToArray(transitionOpt.from), function (finder) {\n    var idx = querySeries(globalStore.oldSeries, finder);\n    if (idx >= 0) {\n      from.push({\n        dataGroupId: globalStore.oldDataGroupIds[idx],\n        data: globalStore.oldData[idx],\n        // TODO can specify divideShape in transition.\n        divide: getDivideShapeFromData(globalStore.oldData[idx]),\n        groupIdDim: finder.dimension\n      });\n    }\n  });\n  each(normalizeToArray(transitionOpt.to), function (finder) {\n    var idx = querySeries(params.updatedSeries, finder);\n    if (idx >= 0) {\n      var data = params.updatedSeries[idx].getData();\n      to.push({\n        dataGroupId: globalStore.oldDataGroupIds[idx],\n        data: data,\n        divide: getDivideShapeFromData(data),\n        groupIdDim: finder.dimension\n      });\n    }\n  });\n  if (from.length > 0 && to.length > 0) {\n    transitionBetween(from, to, api);\n  }\n}\nexport function installUniversalTransition(registers) {\n  registers.registerUpdateLifecycle('series:beforeupdate', function (ecMOdel, api, params) {\n    each(normalizeToArray(params.seriesTransition), function (transOpt) {\n      each(normalizeToArray(transOpt.to), function (finder) {\n        var series = params.updatedSeries;\n        for (var i = 0; i < series.length; i++) {\n          if (finder.seriesIndex != null && finder.seriesIndex === series[i].seriesIndex || finder.seriesId != null && finder.seriesId === series[i].id) {\n            series[i][SERIES_UNIVERSAL_TRANSITION_PROP] = true;\n          }\n        }\n      });\n    });\n  });\n  registers.registerUpdateLifecycle('series:transition', function (ecModel, api, params) {\n    // TODO api provide an namespace that can save stuff per instance\n    var globalStore = getUniversalTransitionGlobalStore(api);\n    // TODO multiple to multiple series.\n    if (globalStore.oldSeries && params.updatedSeries && params.optionChanged) {\n      // TODO transitionOpt was used in an old implementation and can be removed now\n      // Use give transition config if its' give;\n      var transitionOpt = params.seriesTransition;\n      if (transitionOpt) {\n        each(normalizeToArray(transitionOpt), function (opt) {\n          transitionSeriesFromOpt(opt, globalStore, params, api);\n        });\n      } else {\n        // Else guess from series based on transition series key.\n        var updateBatches_1 = findTransitionSeriesBatches(globalStore, params);\n        each(updateBatches_1.keys(), function (key) {\n          var batch = updateBatches_1.get(key);\n          transitionBetween(batch.oldSeries, batch.newSeries, api);\n        });\n      }\n      // Reset\n      each(params.updatedSeries, function (series) {\n        // Reset;\n        if (series[SERIES_UNIVERSAL_TRANSITION_PROP]) {\n          series[SERIES_UNIVERSAL_TRANSITION_PROP] = false;\n        }\n      });\n    }\n    // Save all series of current update. Not only the updated one.\n    var allSeries = ecModel.getSeries();\n    var savedSeries = globalStore.oldSeries = [];\n    var savedDataGroupIds = globalStore.oldDataGroupIds = [];\n    var savedData = globalStore.oldData = [];\n    for (var i = 0; i < allSeries.length; i++) {\n      var data = allSeries[i].getData();\n      // Only save the data that can have transition.\n      // Avoid large data costing too much extra memory\n      if (data.count() < DATA_COUNT_THRESHOLD) {\n        savedSeries.push(allSeries[i]);\n        savedDataGroupIds.push(allSeries[i].get('dataGroupId'));\n        savedData.push(data);\n      }\n    }\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { assert, clone, each, find, isString, map, trim } from 'zrender/lib/core/util.js';\nimport { error } from '../util/log.js';\nimport { registerScaleBreakHelperImpl } from './break.js';\nimport { round as fixRound } from '../util/number.js';\n/**\n * @caution\n *  Must not export anything except `installScaleBreakHelper`\n */\nvar ScaleBreakContextImpl = /** @class */function () {\n  function ScaleBreakContextImpl() {\n    // [CAVEAT]: Should set only by `ScaleBreakContext#setBreaks`!\n    this.breaks = [];\n    // [CAVEAT]: Should update only by `ScaleBreakContext#update`!\n    // They are the values that scaleExtent[0] and scaleExtent[1] are mapped to a numeric axis\n    // that breaks are applied, primarily for optimization of `Scale#normalize`.\n    this._elapsedExtent = [Infinity, -Infinity];\n  }\n  ScaleBreakContextImpl.prototype.setBreaks = function (parsed) {\n    // @ts-ignore\n    this.breaks = parsed.breaks;\n  };\n  /**\n   * [CAVEAT]: Must be called immediately each time scale extent and breaks are updated!\n   */\n  ScaleBreakContextImpl.prototype.update = function (scaleExtent) {\n    updateAxisBreakGapReal(this, scaleExtent);\n    var elapsedExtent = this._elapsedExtent;\n    elapsedExtent[0] = this.elapse(scaleExtent[0]);\n    elapsedExtent[1] = this.elapse(scaleExtent[1]);\n  };\n  ScaleBreakContextImpl.prototype.hasBreaks = function () {\n    return !!this.breaks.length;\n  };\n  /**\n   * When iteratively generating ticks by nice interval, currently the `interval`, which is\n   * calculated by break-elapsed extent span, is probably very small comparing to the original\n   * extent, leading to a large number of iteration and tick generation, even over `safeLimit`.\n   * Thus stepping over breaks is necessary in that loop.\n   *\n   * \"Nice\" should be ensured on ticks when step over the breaks. Thus this method returns\n   * a integer multiple of the \"nice tick interval\".\n   *\n   * This method does little work; it is just for unifying and restricting the behavior.\n   */\n  ScaleBreakContextImpl.prototype.calcNiceTickMultiple = function (tickVal, estimateNiceMultiple) {\n    for (var idx = 0; idx < this.breaks.length; idx++) {\n      var brk = this.breaks[idx];\n      if (brk.vmin < tickVal && tickVal < brk.vmax) {\n        var multiple = estimateNiceMultiple(tickVal, brk.vmax);\n        if (process.env.NODE_ENV !== 'production') {\n          // If not, it may cause dead loop or not nice tick.\n          assert(multiple >= 0 && Math.round(multiple) === multiple);\n        }\n        return multiple;\n      }\n    }\n    return 0;\n  };\n  ScaleBreakContextImpl.prototype.getExtentSpan = function () {\n    return this._elapsedExtent[1] - this._elapsedExtent[0];\n  };\n  ScaleBreakContextImpl.prototype.normalize = function (val) {\n    var elapsedSpan = this._elapsedExtent[1] - this._elapsedExtent[0];\n    // The same logic as `Scale#normalize`.\n    if (elapsedSpan === 0) {\n      return 0.5;\n    }\n    return (this.elapse(val) - this._elapsedExtent[0]) / elapsedSpan;\n  };\n  ScaleBreakContextImpl.prototype.scale = function (val) {\n    return this.unelapse(val * (this._elapsedExtent[1] - this._elapsedExtent[0]) + this._elapsedExtent[0]);\n  };\n  /**\n   * Suppose:\n   *    AXIS_BREAK_LAST_BREAK_END_BASE: 0\n   *    AXIS_BREAK_ELAPSED_BASE: 0\n   *    breaks: [\n   *        {start: -400, end: -300, gap: 27},\n   *        {start: -100, end: 100, gap: 10},\n   *        {start: 200, end: 400, gap: 300},\n   *    ]\n   * The mapping will be:\n   *        |        |\n   *    400 +   ->   +  237\n   *     |  |        |   |  (gap: 300)\n   *    200 +   ->   + -63\n   *        |        |\n   *    100 +   ->   + -163\n   *     |  |        |   |  (gap: 10)\n   *   -100 +   ->   + -173\n   *        |        |\n   *   -300 +   ->   + -373\n   *     |  |        |   |  (gap: 27)\n   *   -400 +   ->   + -400\n   *        |        |\n   *   origianl     elapsed\n   *\n   * Note:\n   *   The mapping has nothing to do with \"scale extent\".\n   */\n  ScaleBreakContextImpl.prototype.elapse = function (val) {\n    // If the value is in the break, return the normalized value in the break\n    var elapsedVal = AXIS_BREAK_ELAPSED_BASE;\n    var lastBreakEnd = AXIS_BREAK_LAST_BREAK_END_BASE;\n    var stillOver = true;\n    for (var i = 0; i < this.breaks.length; i++) {\n      var brk = this.breaks[i];\n      if (val <= brk.vmax) {\n        if (val > brk.vmin) {\n          elapsedVal += brk.vmin - lastBreakEnd + (val - brk.vmin) / (brk.vmax - brk.vmin) * brk.gapReal;\n        } else {\n          elapsedVal += val - lastBreakEnd;\n        }\n        lastBreakEnd = brk.vmax;\n        stillOver = false;\n        break;\n      }\n      elapsedVal += brk.vmin - lastBreakEnd + brk.gapReal;\n      lastBreakEnd = brk.vmax;\n    }\n    if (stillOver) {\n      elapsedVal += val - lastBreakEnd;\n    }\n    return elapsedVal;\n  };\n  ScaleBreakContextImpl.prototype.unelapse = function (elapsedVal) {\n    var lastElapsedEnd = AXIS_BREAK_ELAPSED_BASE;\n    var lastBreakEnd = AXIS_BREAK_LAST_BREAK_END_BASE;\n    var stillOver = true;\n    var unelapsedVal = 0;\n    for (var i = 0; i < this.breaks.length; i++) {\n      var brk = this.breaks[i];\n      var elapsedStart = lastElapsedEnd + brk.vmin - lastBreakEnd;\n      var elapsedEnd = elapsedStart + brk.gapReal;\n      if (elapsedVal <= elapsedEnd) {\n        if (elapsedVal > elapsedStart) {\n          unelapsedVal = brk.vmin + (elapsedVal - elapsedStart) / (elapsedEnd - elapsedStart) * (brk.vmax - brk.vmin);\n        } else {\n          unelapsedVal = lastBreakEnd + elapsedVal - lastElapsedEnd;\n        }\n        lastBreakEnd = brk.vmax;\n        stillOver = false;\n        break;\n      }\n      lastElapsedEnd = elapsedEnd;\n      lastBreakEnd = brk.vmax;\n    }\n    if (stillOver) {\n      unelapsedVal = lastBreakEnd + elapsedVal - lastElapsedEnd;\n    }\n    return unelapsedVal;\n  };\n  return ScaleBreakContextImpl;\n}();\n;\nfunction createScaleBreakContext() {\n  return new ScaleBreakContextImpl();\n}\n// Both can start with any finite value, and are not necessaryily equal. But they need to\n// be the same in `axisBreakElapse` and `axisBreakUnelapse` respectively.\nvar AXIS_BREAK_ELAPSED_BASE = 0;\nvar AXIS_BREAK_LAST_BREAK_END_BASE = 0;\n/**\n * `gapReal` in brkCtx.breaks will be calculated.\n */\nfunction updateAxisBreakGapReal(brkCtx, scaleExtent) {\n  // Considered the effect:\n  //  - Use dataZoom to move some of the breaks outside the extent.\n  //  - Some scenarios that `series.clip: false`.\n  //\n  // How to calculate `prctBrksGapRealSum`:\n  //  Based on the formula:\n  //      xxx.span = brk.vmax - brk.vmin\n  //      xxx.tpPrct.val / xxx.tpAbs.val means ParsedAxisBreak['gapParsed']['val']\n  //      .S/.E means a break that is semi in scaleExtent[0] or scaleExtent[1]\n  //      valP = (\n  //          + (fullyInExtBrksSum.tpAbs.gapReal - fullyInExtBrksSum.tpAbs.span)\n  //          + (semiInExtBrk.S.tpAbs.gapReal - semiInExtBrk.S.tpAbs.span) * semiInExtBrk.S.tpAbs.inExtFrac\n  //          + (semiInExtBrk.E.tpAbs.gapReal - semiInExtBrk.E.tpAbs.span) * semiInExtBrk.E.tpAbs.inExtFrac\n  //      )\n  //      valQ = (\n  //          - fullyInExtBrksSum.tpPrct.span\n  //          - semiInExtBrk.S.tpPrct.span * semiInExtBrk.S.tpPrct.inExtFrac\n  //          - semiInExtBrk.E.tpPrct.span * semiInExtBrk.E.tpPrct.inExtFrac\n  //      )\n  //      gapPrctSum = sum(xxx.tpPrct.val)\n  //      gapPrctSum = prctBrksGapRealSum / (\n  //          + (scaleExtent[1] - scaleExtent[0]) + valP + valQ\n  //          + fullyInExtBrksSum.tpPrct.gapReal\n  //          + semiInExtBrk.S.tpPrct.gapReal * semiInExtBrk.S.tpPrct.inExtFrac\n  //          + semiInExtBrk.E.tpPrct.gapReal * semiInExtBrk.E.tpPrct.inExtFrac\n  //      )\n  //  Assume:\n  //      xxx.tpPrct.gapReal = xxx.tpPrct.val / gapPrctSum * prctBrksGapRealSum\n  //         (NOTE: This is not accurate when semi-in-extent break exist because its\n  //         proportion is not linear, but this assumption approximately works.)\n  //  Derived as follows:\n  //      prctBrksGapRealSum = gapPrctSum * ( (scaleExtent[1] - scaleExtent[0]) + valP + valQ )\n  //          / (1\n  //              - fullyInExtBrksSum.tpPrct.val\n  //              - semiInExtBrk.S.tpPrct.val * semiInExtBrk.S.tpPrct.inExtFrac\n  //              - semiInExtBrk.E.tpPrct.val * semiInExtBrk.E.tpPrct.inExtFrac\n  //          )\n  var gapPrctSum = 0;\n  var fullyInExtBrksSum = {\n    tpAbs: {\n      span: 0,\n      val: 0\n    },\n    tpPrct: {\n      span: 0,\n      val: 0\n    }\n  };\n  var init = function () {\n    return {\n      has: false,\n      span: NaN,\n      inExtFrac: NaN,\n      val: NaN\n    };\n  };\n  var semiInExtBrk = {\n    S: {\n      tpAbs: init(),\n      tpPrct: init()\n    },\n    E: {\n      tpAbs: init(),\n      tpPrct: init()\n    }\n  };\n  each(brkCtx.breaks, function (brk) {\n    var gapParsed = brk.gapParsed;\n    if (gapParsed.type === 'tpPrct') {\n      gapPrctSum += gapParsed.val;\n    }\n    var clampedBrk = clampBreakByExtent(brk, scaleExtent);\n    if (clampedBrk) {\n      var vminClamped = clampedBrk.vmin !== brk.vmin;\n      var vmaxClamped = clampedBrk.vmax !== brk.vmax;\n      var clampedSpan = clampedBrk.vmax - clampedBrk.vmin;\n      if (vminClamped && vmaxClamped) {\n        // Do nothing, which simply makes the result `gapReal` cover the entire scaleExtent.\n        // This transform is not consistent with the other cases but practically works.\n      } else if (vminClamped || vmaxClamped) {\n        var sOrE = vminClamped ? 'S' : 'E';\n        semiInExtBrk[sOrE][gapParsed.type].has = true;\n        semiInExtBrk[sOrE][gapParsed.type].span = clampedSpan;\n        semiInExtBrk[sOrE][gapParsed.type].inExtFrac = clampedSpan / (brk.vmax - brk.vmin);\n        semiInExtBrk[sOrE][gapParsed.type].val = gapParsed.val;\n      } else {\n        fullyInExtBrksSum[gapParsed.type].span += clampedSpan;\n        fullyInExtBrksSum[gapParsed.type].val += gapParsed.val;\n      }\n    }\n  });\n  var prctBrksGapRealSum = gapPrctSum * (0 + (scaleExtent[1] - scaleExtent[0]) + (fullyInExtBrksSum.tpAbs.val - fullyInExtBrksSum.tpAbs.span) + (semiInExtBrk.S.tpAbs.has ? (semiInExtBrk.S.tpAbs.val - semiInExtBrk.S.tpAbs.span) * semiInExtBrk.S.tpAbs.inExtFrac : 0) + (semiInExtBrk.E.tpAbs.has ? (semiInExtBrk.E.tpAbs.val - semiInExtBrk.E.tpAbs.span) * semiInExtBrk.E.tpAbs.inExtFrac : 0) - fullyInExtBrksSum.tpPrct.span - (semiInExtBrk.S.tpPrct.has ? semiInExtBrk.S.tpPrct.span * semiInExtBrk.S.tpPrct.inExtFrac : 0) - (semiInExtBrk.E.tpPrct.has ? semiInExtBrk.E.tpPrct.span * semiInExtBrk.E.tpPrct.inExtFrac : 0)) / (1 - fullyInExtBrksSum.tpPrct.val - (semiInExtBrk.S.tpPrct.has ? semiInExtBrk.S.tpPrct.val * semiInExtBrk.S.tpPrct.inExtFrac : 0) - (semiInExtBrk.E.tpPrct.has ? semiInExtBrk.E.tpPrct.val * semiInExtBrk.E.tpPrct.inExtFrac : 0));\n  each(brkCtx.breaks, function (brk) {\n    var gapParsed = brk.gapParsed;\n    if (gapParsed.type === 'tpPrct') {\n      brk.gapReal = gapPrctSum !== 0\n      // prctBrksGapRealSum is supposed to be non-negative but add a safe guard\n      ? Math.max(prctBrksGapRealSum, 0) * gapParsed.val / gapPrctSum : 0;\n    }\n    if (gapParsed.type === 'tpAbs') {\n      brk.gapReal = gapParsed.val;\n    }\n    if (brk.gapReal == null) {\n      brk.gapReal = 0;\n    }\n  });\n}\nfunction pruneTicksByBreak(pruneByBreak, ticks, breaks, getValue, interval, scaleExtent) {\n  if (pruneByBreak === 'no') {\n    return;\n  }\n  each(breaks, function (brk) {\n    // break.vmin/vmax that out of extent must not impact the visible of\n    // normal ticks and labels.\n    var clampedBrk = clampBreakByExtent(brk, scaleExtent);\n    if (!clampedBrk) {\n      return;\n    }\n    // Remove some normal ticks to avoid zigzag shapes overlapping with split lines\n    // and to avoid break labels overlapping with normal tick labels (thouth it can\n    // also be avoided by `axisLabel.hideOverlap`).\n    // It's OK to O(n^2) since the number of `ticks` are small.\n    for (var j = ticks.length - 1; j >= 0; j--) {\n      var tick = ticks[j];\n      var val = getValue(tick);\n      // 1. Ensure there is no ticks inside `break.vmin` and `break.vmax`.\n      // 2. Use an empirically gap value here. Theoritically `zigzagAmplitude` is\n      //  supposed to be involved to provide better precision but it will brings\n      //  more complexity. The empirically gap value is conservative because break\n      //  labels and normal tick lables are prone to overlapping.\n      var gap = interval * 3 / 4;\n      if (val > clampedBrk.vmin - gap && val < clampedBrk.vmax + gap && (pruneByBreak !== 'preserve_extent_bound' || val !== scaleExtent[0] && val !== scaleExtent[1])) {\n        ticks.splice(j, 1);\n      }\n    }\n  });\n}\nfunction addBreaksToTicks(\n// The input ticks should be in accending order.\nticks, breaks, scaleExtent,\n// Keep the break ends at the same level to avoid an awkward appearance.\ngetTimeProps) {\n  each(breaks, function (brk) {\n    var clampedBrk = clampBreakByExtent(brk, scaleExtent);\n    if (!clampedBrk) {\n      return;\n    }\n    // - When neight `break.vmin` nor `break.vmax` is in scale extent,\n    //  break label should not be displayed and we do not add them to the result.\n    // - When only one of `break.vmin` and `break.vmax` is inside the extent and the\n    //  other is outsite, we comply with the extent and display only part of the breaks area,\n    //  because the extent might be determined by user settings (such as `axis.min/max`)\n    ticks.push({\n      value: clampedBrk.vmin,\n      \"break\": {\n        type: 'vmin',\n        parsedBreak: clampedBrk\n      },\n      time: getTimeProps ? getTimeProps(clampedBrk) : undefined\n    });\n    // When gap is 0, start tick overlap with end tick, but we still count both of them. Break\n    // area shape can address that overlapping. `axisLabel` need draw both start and end separately,\n    // otherwise it brings complexity to the logic of label overlapping resolving (e.g., when label\n    // rotated), and introduces inconsistency to users in `axisLabel.formatter` between gap is 0 or not.\n    ticks.push({\n      value: clampedBrk.vmax,\n      \"break\": {\n        type: 'vmax',\n        parsedBreak: clampedBrk\n      },\n      time: getTimeProps ? getTimeProps(clampedBrk) : undefined\n    });\n  });\n  if (breaks.length) {\n    ticks.sort(function (a, b) {\n      return a.value - b.value;\n    });\n  }\n}\n/**\n * If break and extent does not intersect, return null/undefined.\n * If the intersection is only a point at scaleExtent[0] or scaleExtent[1], return null/undefined.\n */\nfunction clampBreakByExtent(brk, scaleExtent) {\n  var vmin = Math.max(brk.vmin, scaleExtent[0]);\n  var vmax = Math.min(brk.vmax, scaleExtent[1]);\n  return vmin < vmax || vmin === vmax && vmin > scaleExtent[0] && vmin < scaleExtent[1] ? {\n    vmin: vmin,\n    vmax: vmax,\n    breakOption: brk.breakOption,\n    gapParsed: brk.gapParsed,\n    gapReal: brk.gapReal\n  } : null;\n}\nfunction parseAxisBreakOption(\n// raw user input breaks, retrieved from axis model.\nbreakOptionList, parse, opt) {\n  var parsedBreaks = [];\n  if (!breakOptionList) {\n    return {\n      breaks: parsedBreaks\n    };\n  }\n  function validatePercent(normalizedPercent, msg) {\n    if (normalizedPercent >= 0 && normalizedPercent < 1 - 1e-5) {\n      // Avoid division error.\n      return true;\n    }\n    if (process.env.NODE_ENV !== 'production') {\n      error(msg + \" must be >= 0 and < 1, rather than \" + normalizedPercent + \" .\");\n    }\n    return false;\n  }\n  each(breakOptionList, function (brkOption) {\n    if (!brkOption || brkOption.start == null || brkOption.end == null) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('The input axis breaks start/end should not be empty.');\n      }\n      return;\n    }\n    if (brkOption.isExpanded) {\n      return;\n    }\n    var parsedBrk = {\n      breakOption: clone(brkOption),\n      vmin: parse(brkOption.start),\n      vmax: parse(brkOption.end),\n      gapParsed: {\n        type: 'tpAbs',\n        val: 0\n      },\n      gapReal: null\n    };\n    if (brkOption.gap != null) {\n      var isPrct = false;\n      if (isString(brkOption.gap)) {\n        var trimmedGap = trim(brkOption.gap);\n        if (trimmedGap.match(/%$/)) {\n          var normalizedPercent = parseFloat(trimmedGap) / 100;\n          if (!validatePercent(normalizedPercent, 'Percent gap')) {\n            normalizedPercent = 0;\n          }\n          parsedBrk.gapParsed.type = 'tpPrct';\n          parsedBrk.gapParsed.val = normalizedPercent;\n          isPrct = true;\n        }\n      }\n      if (!isPrct) {\n        var absolute = parse(brkOption.gap);\n        if (!isFinite(absolute) || absolute < 0) {\n          if (process.env.NODE_ENV !== 'production') {\n            error(\"Axis breaks gap must positive finite rather than (\" + brkOption.gap + \").\");\n          }\n          absolute = 0;\n        }\n        parsedBrk.gapParsed.type = 'tpAbs';\n        parsedBrk.gapParsed.val = absolute;\n      }\n    }\n    if (parsedBrk.vmin === parsedBrk.vmax) {\n      parsedBrk.gapParsed.type = 'tpAbs';\n      parsedBrk.gapParsed.val = 0;\n    }\n    if (opt && opt.noNegative) {\n      each(['vmin', 'vmax'], function (se) {\n        if (parsedBrk[se] < 0) {\n          if (process.env.NODE_ENV !== 'production') {\n            error(\"Axis break.\" + se + \" must not be negative.\");\n          }\n          parsedBrk[se] = 0;\n        }\n      });\n    }\n    // Ascending numerical order is the prerequisite of the calculation in Scale#normalize.\n    // User are allowed to input desending vmin/vmax for simplifying the usage.\n    if (parsedBrk.vmin > parsedBrk.vmax) {\n      var tmp = parsedBrk.vmax;\n      parsedBrk.vmax = parsedBrk.vmin;\n      parsedBrk.vmin = tmp;\n    }\n    parsedBreaks.push(parsedBrk);\n  });\n  // Ascending numerical order is the prerequisite of the calculation in Scale#normalize.\n  parsedBreaks.sort(function (item1, item2) {\n    return item1.vmin - item2.vmin;\n  });\n  // Make sure that the intervals in breaks are not overlap.\n  var lastEnd = -Infinity;\n  each(parsedBreaks, function (brk, idx) {\n    if (lastEnd > brk.vmin) {\n      if (process.env.NODE_ENV !== 'production') {\n        error('Axis breaks must not overlap.');\n      }\n      parsedBreaks[idx] = null;\n    }\n    lastEnd = brk.vmax;\n  });\n  return {\n    breaks: parsedBreaks.filter(function (brk) {\n      return !!brk;\n    })\n  };\n}\nfunction identifyAxisBreak(brk, identifier) {\n  return serializeAxisBreakIdentifier(identifier) === serializeAxisBreakIdentifier(brk);\n}\nfunction serializeAxisBreakIdentifier(identifier) {\n  // We use user input start/end to identify break. Considered cases like `start: new Date(xxx)`,\n  // Theoretically `Scale#parse` should be used here, but not used currently to reduce dependencies,\n  // since simply converting to string happens to be correct.\n  return identifier.start + '_\\0_' + identifier.end;\n}\n/**\n * - A break pair represents `[vmin, vmax]`,\n * - Only both vmin and vmax item exist, they are counted as a pair.\n */\nfunction retrieveAxisBreakPairs(itemList, getVisualAxisBreak, returnIdx) {\n  var idxPairList = [];\n  each(itemList, function (el, idx) {\n    var vBreak = getVisualAxisBreak(el);\n    if (vBreak && vBreak.type === 'vmin') {\n      idxPairList.push([idx]);\n    }\n  });\n  each(itemList, function (el, idx) {\n    var vBreak = getVisualAxisBreak(el);\n    if (vBreak && vBreak.type === 'vmax') {\n      var idxPair = find(idxPairList,\n      // parsedBreak may be changed, can only use breakOption to match them.\n      function (pr) {\n        return identifyAxisBreak(getVisualAxisBreak(itemList[pr[0]]).parsedBreak.breakOption, vBreak.parsedBreak.breakOption);\n      });\n      idxPair && idxPair.push(idx);\n    }\n  });\n  var result = [];\n  each(idxPairList, function (idxPair) {\n    if (idxPair.length === 2) {\n      result.push(returnIdx ? idxPair : [itemList[idxPair[0]], itemList[idxPair[1]]]);\n    }\n  });\n  return result;\n}\nfunction getTicksLogTransformBreak(tick, logBase, logOriginalBreaks, fixRoundingError) {\n  var vBreak;\n  var brkRoundingCriterion;\n  if (tick[\"break\"]) {\n    var brk = tick[\"break\"].parsedBreak;\n    var originalBreak = find(logOriginalBreaks, function (brk) {\n      return identifyAxisBreak(brk.breakOption, tick[\"break\"].parsedBreak.breakOption);\n    });\n    var vmin = fixRoundingError(Math.pow(logBase, brk.vmin), originalBreak.vmin);\n    var vmax = fixRoundingError(Math.pow(logBase, brk.vmax), originalBreak.vmax);\n    var gapParsed = {\n      type: brk.gapParsed.type,\n      val: brk.gapParsed.type === 'tpAbs' ? fixRound(Math.pow(logBase, brk.vmin + brk.gapParsed.val)) - vmin : brk.gapParsed.val\n    };\n    vBreak = {\n      type: tick[\"break\"].type,\n      parsedBreak: {\n        breakOption: brk.breakOption,\n        vmin: vmin,\n        vmax: vmax,\n        gapParsed: gapParsed,\n        gapReal: brk.gapReal\n      }\n    };\n    brkRoundingCriterion = originalBreak[tick[\"break\"].type];\n  }\n  return {\n    brkRoundingCriterion: brkRoundingCriterion,\n    vBreak: vBreak\n  };\n}\nfunction logarithmicParseBreaksFromOption(breakOptionList, logBase, parse) {\n  var opt = {\n    noNegative: true\n  };\n  var parsedOriginal = parseAxisBreakOption(breakOptionList, parse, opt);\n  var parsedLogged = parseAxisBreakOption(breakOptionList, parse, opt);\n  var loggedBase = Math.log(logBase);\n  parsedLogged.breaks = map(parsedLogged.breaks, function (brk) {\n    var vmin = Math.log(brk.vmin) / loggedBase;\n    var vmax = Math.log(brk.vmax) / loggedBase;\n    var gapParsed = {\n      type: brk.gapParsed.type,\n      val: brk.gapParsed.type === 'tpAbs' ? Math.log(brk.vmin + brk.gapParsed.val) / loggedBase - vmin : brk.gapParsed.val\n    };\n    return {\n      vmin: vmin,\n      vmax: vmax,\n      gapParsed: gapParsed,\n      gapReal: brk.gapReal,\n      breakOption: brk.breakOption\n    };\n  });\n  return {\n    parsedOriginal: parsedOriginal,\n    parsedLogged: parsedLogged\n  };\n}\nvar BREAK_MIN_MAX_TO_PARAM = {\n  vmin: 'start',\n  vmax: 'end'\n};\nfunction makeAxisLabelFormatterParamBreak(extraParam, vBreak) {\n  if (vBreak) {\n    extraParam = extraParam || {};\n    extraParam[\"break\"] = {\n      type: BREAK_MIN_MAX_TO_PARAM[vBreak.type],\n      start: vBreak.parsedBreak.vmin,\n      end: vBreak.parsedBreak.vmax\n    };\n  }\n  return extraParam;\n}\nexport function installScaleBreakHelper() {\n  registerScaleBreakHelperImpl({\n    createScaleBreakContext: createScaleBreakContext,\n    pruneTicksByBreak: pruneTicksByBreak,\n    addBreaksToTicks: addBreaksToTicks,\n    parseAxisBreakOption: parseAxisBreakOption,\n    identifyAxisBreak: identifyAxisBreak,\n    serializeAxisBreakIdentifier: serializeAxisBreakIdentifier,\n    retrieveAxisBreakPairs: retrieveAxisBreakPairs,\n    getTicksLogTransformBreak: getTicksLogTransformBreak,\n    logarithmicParseBreaksFromOption: logarithmicParseBreaksFromOption,\n    makeAxisLabelFormatterParamBreak: makeAxisLabelFormatterParamBreak\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { makeInner } from '../../util/model.js';\nimport { assert, each, extend, find, map } from 'zrender/lib/core/util.js';\nimport { getScaleBreakHelper } from '../../scale/break.js';\nimport { subPixelOptimizeLine } from 'zrender/lib/graphic/helper/subPixelOptimize.js';\nimport { applyTransform } from 'zrender/lib/core/vector.js';\nimport * as matrixUtil from 'zrender/lib/core/matrix.js';\nimport { AXIS_BREAK_COLLAPSE_ACTION_TYPE, AXIS_BREAK_EXPAND_ACTION_TYPE, AXIS_BREAK_TOGGLE_ACTION_TYPE } from './axisAction.js';\nimport { labelIntersect, labelLayoutApplyTranslation } from '../../label/labelLayoutHelper.js';\nimport { registerAxisBreakHelperImpl } from './axisBreakHelper.js';\nimport { warn } from '../../util/log.js';\nimport { Group, Line, Point, Polygon, Polyline, WH, XY } from '../../util/graphic.js';\n/**\n * @caution\n *  Must not export anything except `installAxisBreakHelper`\n */\n/**\n * The zigzag shapes for axis breaks are generated according to some random\n * factors. It should persist as much as possible to avoid constantly\n * changing by every user operation.\n */\nvar viewCache = makeInner();\nfunction ensureVisualInCache(visualList, targetBreak) {\n  var visual = find(visualList, function (item) {\n    return getScaleBreakHelper().identifyAxisBreak(item.parsedBreak.breakOption, targetBreak.breakOption);\n  });\n  if (!visual) {\n    visualList.push(visual = {\n      zigzagRandomList: [],\n      parsedBreak: targetBreak,\n      shouldRemove: false\n    });\n  }\n  return visual;\n}\nfunction resetCacheVisualRemoveFlag(visualList) {\n  each(visualList, function (item) {\n    return item.shouldRemove = true;\n  });\n}\nfunction removeUnusedCacheVisual(visualList) {\n  for (var i = visualList.length - 1; i >= 0; i--) {\n    if (visualList[i].shouldRemove) {\n      visualList.splice(i, 1);\n    }\n  }\n}\nfunction rectCoordBuildBreakAxis(axisGroup, axisView, axisModel, coordSysRect, api) {\n  var axis = axisModel.axis;\n  if (axis.scale.isBlank() || !getScaleBreakHelper()) {\n    return;\n  }\n  var breakPairs = getScaleBreakHelper().retrieveAxisBreakPairs(axis.scale.getTicks({\n    breakTicks: 'only_break'\n  }), function (tick) {\n    return tick[\"break\"];\n  }, false);\n  if (!breakPairs.length) {\n    return;\n  }\n  var breakAreaModel = axisModel.getModel('breakArea');\n  var zigzagAmplitude = breakAreaModel.get('zigzagAmplitude');\n  var zigzagMinSpan = breakAreaModel.get('zigzagMinSpan');\n  var zigzagMaxSpan = breakAreaModel.get('zigzagMaxSpan');\n  // Use arbitrary value to avoid dead loop if user gives inappropriate settings.\n  zigzagMinSpan = Math.max(2, zigzagMinSpan || 0);\n  zigzagMaxSpan = Math.max(zigzagMinSpan, zigzagMaxSpan || 0);\n  var expandOnClick = breakAreaModel.get('expandOnClick');\n  var zigzagZ = breakAreaModel.get('zigzagZ');\n  var itemStyleModel = breakAreaModel.getModel('itemStyle');\n  var itemStyle = itemStyleModel.getItemStyle();\n  var borderColor = itemStyle.stroke;\n  var borderWidth = itemStyle.lineWidth;\n  var borderType = itemStyle.lineDash;\n  var color = itemStyle.fill;\n  var group = new Group({\n    ignoreModelZ: true\n  });\n  var isAxisHorizontal = axis.isHorizontal();\n  var cachedVisualList = viewCache(axisView).visualList || (viewCache(axisView).visualList = []);\n  resetCacheVisualRemoveFlag(cachedVisualList);\n  var _loop_1 = function (i) {\n    var parsedBreak = breakPairs[i][0][\"break\"].parsedBreak;\n    // Even if brk.gap is 0, we should also draw the breakArea because\n    // border is sometimes required to be visible (as a line)\n    var coords = [];\n    coords[0] = axis.toGlobalCoord(axis.dataToCoord(parsedBreak.vmin, true));\n    coords[1] = axis.toGlobalCoord(axis.dataToCoord(parsedBreak.vmax, true));\n    if (coords[1] < coords[0]) {\n      coords.reverse();\n    }\n    var cachedVisual = ensureVisualInCache(cachedVisualList, parsedBreak);\n    cachedVisual.shouldRemove = false;\n    var breakGroup = new Group();\n    addZigzagShapes(cachedVisual.zigzagRandomList, breakGroup, coords[0], coords[1], isAxisHorizontal, parsedBreak);\n    if (expandOnClick) {\n      breakGroup.on('click', function () {\n        var payload = {\n          type: AXIS_BREAK_EXPAND_ACTION_TYPE,\n          breaks: [{\n            start: parsedBreak.breakOption.start,\n            end: parsedBreak.breakOption.end\n          }]\n        };\n        payload[axis.dim + \"AxisIndex\"] = axisModel.componentIndex;\n        api.dispatchAction(payload);\n      });\n    }\n    breakGroup.silent = !expandOnClick;\n    group.add(breakGroup);\n  };\n  for (var i = 0; i < breakPairs.length; i++) {\n    _loop_1(i);\n  }\n  axisGroup.add(group);\n  removeUnusedCacheVisual(cachedVisualList);\n  function addZigzagShapes(zigzagRandomList, breakGroup, startCoord, endCoord, isAxisHorizontal, trimmedBreak) {\n    var polylineStyle = {\n      stroke: borderColor,\n      lineWidth: borderWidth,\n      lineDash: borderType,\n      fill: 'none'\n    };\n    var dimBrk = isAxisHorizontal ? 0 : 1;\n    var dimZigzag = 1 - dimBrk;\n    var zigzagCoordMax = coordSysRect[XY[dimZigzag]] + coordSysRect[WH[dimZigzag]];\n    // Apply `subPixelOptimizeLine` for alignning with break ticks.\n    function subPixelOpt(brkCoord) {\n      var pBrk = [];\n      var dummyP = [];\n      pBrk[dimBrk] = dummyP[dimBrk] = brkCoord;\n      pBrk[dimZigzag] = coordSysRect[XY[dimZigzag]];\n      dummyP[dimZigzag] = zigzagCoordMax;\n      var dummyShape = {\n        x1: pBrk[0],\n        y1: pBrk[1],\n        x2: dummyP[0],\n        y2: dummyP[1]\n      };\n      subPixelOptimizeLine(dummyShape, dummyShape, {\n        lineWidth: 1\n      });\n      pBrk[0] = dummyShape.x1;\n      pBrk[1] = dummyShape.y1;\n      return pBrk[dimBrk];\n    }\n    startCoord = subPixelOpt(startCoord);\n    endCoord = subPixelOpt(endCoord);\n    var pointsA = [];\n    var pointsB = [];\n    var isSwap = true;\n    var current = coordSysRect[XY[dimZigzag]];\n    for (var idx = 0;; idx++) {\n      // Use `isFirstPoint` `isLastPoint` to ensure the intersections between zigzag\n      // and axis are precise, thus it can join its axis tick correctly.\n      var isFirstPoint = current === coordSysRect[XY[dimZigzag]];\n      var isLastPoint = current >= zigzagCoordMax;\n      if (isLastPoint) {\n        current = zigzagCoordMax;\n      }\n      var pA = [];\n      var pB = [];\n      pA[dimBrk] = startCoord;\n      pB[dimBrk] = endCoord;\n      if (!isFirstPoint && !isLastPoint) {\n        pA[dimBrk] += isSwap ? -zigzagAmplitude : zigzagAmplitude;\n        pB[dimBrk] -= !isSwap ? -zigzagAmplitude : zigzagAmplitude;\n      }\n      pA[dimZigzag] = current;\n      pB[dimZigzag] = current;\n      pointsA.push(pA);\n      pointsB.push(pB);\n      var randomVal = void 0;\n      if (idx < zigzagRandomList.length) {\n        randomVal = zigzagRandomList[idx];\n      } else {\n        randomVal = Math.random();\n        zigzagRandomList.push(randomVal);\n      }\n      current += randomVal * (zigzagMaxSpan - zigzagMinSpan) + zigzagMinSpan;\n      isSwap = !isSwap;\n      if (isLastPoint) {\n        break;\n      }\n    }\n    var anidSuffix = getScaleBreakHelper().serializeAxisBreakIdentifier(trimmedBreak.breakOption);\n    // Create two polylines and add them to the breakGroup\n    breakGroup.add(new Polyline({\n      anid: \"break_a_\" + anidSuffix,\n      shape: {\n        points: pointsA\n      },\n      style: polylineStyle,\n      z: zigzagZ\n    }));\n    /* Add the second polyline and a polygon only if the gap is not zero\n     * Otherwise if the polyline is with dashed line or being opaque,\n     * it may not be constant with breaks with non-zero gaps. */\n    if (trimmedBreak.gapReal !== 0) {\n      breakGroup.add(new Polyline({\n        anid: \"break_b_\" + anidSuffix,\n        shape: {\n          // Not reverse to keep the dash stable when dragging resizing.\n          points: pointsB\n        },\n        style: polylineStyle,\n        z: zigzagZ\n      }));\n      // Creating the polygon that fills the area between the polylines\n      // From end to start for polygon.\n      var pointsB2 = pointsB.slice();\n      pointsB2.reverse();\n      var polygonPoints = pointsA.concat(pointsB2);\n      breakGroup.add(new Polygon({\n        anid: \"break_c_\" + anidSuffix,\n        shape: {\n          points: polygonPoints\n        },\n        style: {\n          fill: color,\n          opacity: itemStyle.opacity\n        },\n        z: zigzagZ\n      }));\n    }\n  }\n}\nfunction buildAxisBreakLine(axisModel, group, transformGroup, pathBaseProp) {\n  var axis = axisModel.axis;\n  var transform = transformGroup.transform;\n  assert(pathBaseProp.style);\n  var extent = axis.getExtent();\n  if (axis.inverse) {\n    extent = extent.slice();\n    extent.reverse();\n  }\n  var breakPairs = getScaleBreakHelper().retrieveAxisBreakPairs(axis.scale.getTicks({\n    breakTicks: 'only_break'\n  }), function (tick) {\n    return tick[\"break\"];\n  }, false);\n  var brkLayoutList = map(breakPairs, function (breakPair) {\n    var parsedBreak = breakPair[0][\"break\"].parsedBreak;\n    var coordPair = [axis.dataToCoord(parsedBreak.vmin, true), axis.dataToCoord(parsedBreak.vmax, true)];\n    coordPair[0] > coordPair[1] && coordPair.reverse();\n    return {\n      coordPair: coordPair,\n      brkId: getScaleBreakHelper().serializeAxisBreakIdentifier(parsedBreak.breakOption)\n    };\n  });\n  brkLayoutList.sort(function (layout1, layout2) {\n    return layout1.coordPair[0] - layout2.coordPair[0];\n  });\n  var ySegMin = extent[0];\n  var lastLayout = null;\n  for (var idx = 0; idx < brkLayoutList.length; idx++) {\n    var layout = brkLayoutList[idx];\n    var brkTirmmedMin = Math.max(layout.coordPair[0], extent[0]);\n    var brkTirmmedMax = Math.min(layout.coordPair[1], extent[1]);\n    if (ySegMin <= brkTirmmedMin) {\n      addSeg(ySegMin, brkTirmmedMin, lastLayout, layout);\n    }\n    ySegMin = brkTirmmedMax;\n    lastLayout = layout;\n  }\n  if (ySegMin <= extent[1]) {\n    addSeg(ySegMin, extent[1], lastLayout, null);\n  }\n  function addSeg(min, max, layout1, layout2) {\n    function trans(p1, p2) {\n      if (transform) {\n        applyTransform(p1, p1, transform);\n        applyTransform(p2, p2, transform);\n      }\n    }\n    function subPixelOptimizePP(p1, p2) {\n      var shape = {\n        x1: p1[0],\n        y1: p1[1],\n        x2: p2[0],\n        y2: p2[1]\n      };\n      subPixelOptimizeLine(shape, shape, pathBaseProp.style);\n      p1[0] = shape.x1;\n      p1[1] = shape.y1;\n      p2[0] = shape.x2;\n      p2[1] = shape.y2;\n    }\n    var lineP1 = [min, 0];\n    var lineP2 = [max, 0];\n    // dummy tick is used to align the line segment ends with axis ticks\n    // after `subPixelOptimizeLine` being applied.\n    var dummyTickEnd1 = [min, 5];\n    var dummyTickEnd2 = [max, 5];\n    trans(lineP1, dummyTickEnd1);\n    subPixelOptimizePP(lineP1, dummyTickEnd1);\n    trans(lineP2, dummyTickEnd2);\n    subPixelOptimizePP(lineP2, dummyTickEnd2);\n    // Apply it keeping the same as the normal axis line.\n    subPixelOptimizePP(lineP1, lineP2);\n    var seg = new Line(extend({\n      shape: {\n        x1: lineP1[0],\n        y1: lineP1[1],\n        x2: lineP2[0],\n        y2: lineP2[1]\n      }\n    }, pathBaseProp));\n    group.add(seg);\n    // Animation should be precise to be consistent with tick and split line animation.\n    seg.anid = \"breakLine_\" + (layout1 ? layout1.brkId : '\\0') + \"_\\0_\" + (layout2 ? layout2.brkId : '\\0');\n  }\n}\n/**\n * Resolve the overlap of a pair of labels.\n *\n * [CAUTION] Only label.x/y are allowed to change.\n */\nfunction adjustBreakLabelPair(axisInverse, axisRotation, layoutPair) {\n  if (find(layoutPair, function (item) {\n    return !item;\n  })) {\n    return;\n  }\n  var mtv = new Point();\n  if (!labelIntersect(layoutPair[0], layoutPair[1], mtv, {\n    // Assert `labelPair` is `[break_min, break_max]`.\n    // `axis.inverse: true` means a smaller scale value corresponds to a bigger value in axis.extent.\n    // The axisRotation indicates mtv direction of OBB intersecting.\n    direction: -(axisInverse ? axisRotation + Math.PI : axisRotation),\n    touchThreshold: 0,\n    // If need to resovle intersection align axis by moving labels according to MTV,\n    // the direction must not be opposite, otherwise cause misleading.\n    bidirectional: false\n  })) {\n    return;\n  }\n  // Rotate axis back to (1, 0) direction, to be a standard axis.\n  var axisStTrans = matrixUtil.create();\n  matrixUtil.rotate(axisStTrans, axisStTrans, -axisRotation);\n  var labelPairStTrans = map(layoutPair, function (layout) {\n    return layout.transform ? matrixUtil.mul(matrixUtil.create(), axisStTrans, layout.transform) : axisStTrans;\n  });\n  function isParallelToAxis(whIdx) {\n    // Assert label[0] and label[1] has the same rotation, so only use [0].\n    var localRect = layoutPair[0].localRect;\n    var labelVec0 = new Point(localRect[WH[whIdx]] * labelPairStTrans[0][0], localRect[WH[whIdx]] * labelPairStTrans[0][1]);\n    return Math.abs(labelVec0.y) < 1e-5;\n  }\n  // If overlapping, move pair[0] pair[1] apart a little. We need to calculate a ratio k to\n  // distribute mtv to pair[0] and pair[1]. This is to place the text gap as close as possible\n  // to the center of the break ticks, otherwise it might looks weird or misleading.\n  // - When labels' width/height are not parallel to axis (usually by rotation),\n  //  we can simply treat the k as `0.5`.\n  var k = 0.5;\n  // - When labels' width/height are parallel to axis, the width/height need to be considered,\n  //  since they may differ significantly. In this case we keep textAlign as 'center' rather\n  //  than 'left'/'right', due to considerations of space utilization for wide break.gap.\n  //  A sample case: break on xAxis(no inverse) is [200, 300000].\n  //  We calculate k based on the formula below:\n  //      Rotated axis and labels to the direction of (1, 0).\n  //      uval = ( (pair[0].insidePt - mtv*k) + (pair[1].insidePt + mtv*(1-k)) ) / 2 - brkCenter\n  //      0 <= k <= 1\n  //      |uval| should be as small as possible.\n  //  Derived as follows:\n  //      qval = (pair[0].insidePt + pair[1].insidePt + mtv) / 2 - brkCenter\n  //      k = (qval - uval) / mtv\n  //      min(qval, qval-mtv) <= uval <= max(qval, qval-mtv)\n  if (isParallelToAxis(0) || isParallelToAxis(1)) {\n    var rectSt = map(layoutPair, function (layout, idx) {\n      var rect = layout.localRect.clone();\n      rect.applyTransform(labelPairStTrans[idx]);\n      return rect;\n    });\n    var brkCenterSt = new Point();\n    brkCenterSt.copy(layoutPair[0].label).add(layoutPair[1].label).scale(0.5);\n    brkCenterSt.transform(axisStTrans);\n    var mtvSt = mtv.clone().transform(axisStTrans);\n    var insidePtSum = rectSt[0].x + rectSt[1].x + (mtvSt.x >= 0 ? rectSt[0].width : rectSt[1].width);\n    var qval = (insidePtSum + mtvSt.x) / 2 - brkCenterSt.x;\n    var uvalMin = Math.min(qval, qval - mtvSt.x);\n    var uvalMax = Math.max(qval, qval - mtvSt.x);\n    var uval = uvalMax < 0 ? uvalMax : uvalMin > 0 ? uvalMin : 0;\n    k = (qval - uval) / mtvSt.x;\n  }\n  var delta0 = new Point();\n  var delta1 = new Point();\n  Point.scale(delta0, mtv, -k);\n  Point.scale(delta1, mtv, 1 - k);\n  labelLayoutApplyTranslation(layoutPair[0], delta0);\n  labelLayoutApplyTranslation(layoutPair[1], delta1);\n}\nfunction updateModelAxisBreak(model, payload) {\n  var result = {\n    breaks: []\n  };\n  each(payload.breaks, function (inputBrk) {\n    if (!inputBrk) {\n      return;\n    }\n    var breakOption = find(model.get('breaks', true), function (brkOption) {\n      return getScaleBreakHelper().identifyAxisBreak(brkOption, inputBrk);\n    });\n    if (!breakOption) {\n      if (process.env.NODE_ENV !== 'production') {\n        warn(\"Can not find axis break by start: \" + inputBrk.start + \", end: \" + inputBrk.end);\n      }\n      return;\n    }\n    var actionType = payload.type;\n    var old = {\n      isExpanded: !!breakOption.isExpanded\n    };\n    breakOption.isExpanded = actionType === AXIS_BREAK_EXPAND_ACTION_TYPE ? true : actionType === AXIS_BREAK_COLLAPSE_ACTION_TYPE ? false : actionType === AXIS_BREAK_TOGGLE_ACTION_TYPE ? !breakOption.isExpanded : breakOption.isExpanded;\n    result.breaks.push({\n      start: breakOption.start,\n      end: breakOption.end,\n      isExpanded: !!breakOption.isExpanded,\n      old: old\n    });\n  });\n  return result;\n}\nexport function installAxisBreakHelper() {\n  registerAxisBreakHelperImpl({\n    adjustBreakLabelPair: adjustBreakLabelPair,\n    buildAxisBreakLine: buildAxisBreakLine,\n    rectCoordBuildBreakAxis: rectCoordBuildBreakAxis,\n    updateModelAxisBreak: updateModelAxisBreak\n  });\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { installScaleBreakHelper } from '../../scale/breakImpl.js';\nimport { registerAction } from './axisAction.js';\nimport { installAxisBreakHelper } from './axisBreakHelperImpl.js';\nexport function installAxisBreak(registers) {\n  registerAction(registers);\n  installScaleBreakHelper();\n  installAxisBreakHelper();\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport BoundingRect from 'zrender/lib/core/BoundingRect.js';\nimport { each } from 'zrender/lib/core/util.js';\nimport { registerLegacyGridContainLabelImpl } from './Grid.js';\nimport OrdinalScale from '../../scale/Ordinal.js';\nimport { makeLabelFormatter } from '../axisHelper.js';\n/**\n * [CAUTION] Never export methods other than `installLegacyGridContainLabel`.\n */\nexport function installLegacyGridContainLabel() {\n  registerLegacyGridContainLabelImpl(legacyLayOutGridByContained);\n}\n/**\n * The input gridRect and axes will be modified.\n */\nfunction legacyLayOutGridByContained(axesList, gridRect) {\n  each(axesList, function (axis) {\n    if (!axis.model.get(['axisLabel', 'inside'])) {\n      var labelUnionRect = estimateLabelUnionRect(axis);\n      if (labelUnionRect) {\n        var dim = axis.isHorizontal() ? 'height' : 'width';\n        var margin = axis.model.get(['axisLabel', 'margin']);\n        gridRect[dim] -= labelUnionRect[dim] + margin;\n        if (axis.position === 'top') {\n          gridRect.y += labelUnionRect.height + margin;\n        } else if (axis.position === 'left') {\n          gridRect.x += labelUnionRect.width + margin;\n        }\n      }\n    }\n  });\n}\n/**\n * @return Be null/undefined if no labels.\n */\nfunction estimateLabelUnionRect(axis) {\n  var axisModel = axis.model;\n  var scale = axis.scale;\n  if (!axisModel.get(['axisLabel', 'show']) || scale.isBlank()) {\n    return;\n  }\n  var realNumberScaleTicks;\n  var tickCount;\n  var categoryScaleExtent = scale.getExtent();\n  // Optimize for large category data, avoid call `getTicks()`.\n  if (scale instanceof OrdinalScale) {\n    tickCount = scale.count();\n  } else {\n    realNumberScaleTicks = scale.getTicks();\n    tickCount = realNumberScaleTicks.length;\n  }\n  var axisLabelModel = axis.getLabelModel();\n  var labelFormatter = makeLabelFormatter(axis);\n  var rect;\n  var step = 1;\n  // Simple optimization for large amount of category labels\n  if (tickCount > 40) {\n    step = Math.ceil(tickCount / 40);\n  }\n  for (var i = 0; i < tickCount; i += step) {\n    var tick = realNumberScaleTicks ? realNumberScaleTicks[i] : {\n      value: categoryScaleExtent[0] + i\n    };\n    var label = labelFormatter(tick, i);\n    var unrotatedSingleRect = axisLabelModel.getTextRect(label);\n    var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0);\n    rect ? rect.union(singleRect) : rect = singleRect;\n  }\n  return rect;\n  function rotateTextRect(textRect, rotate) {\n    var rotateRadians = rotate * Math.PI / 180;\n    var beforeWidth = textRect.width;\n    var beforeHeight = textRect.height;\n    var afterWidth = beforeWidth * Math.abs(Math.cos(rotateRadians)) + Math.abs(beforeHeight * Math.sin(rotateRadians));\n    var afterHeight = beforeWidth * Math.abs(Math.sin(rotateRadians)) + Math.abs(beforeHeight * Math.cos(rotateRadians));\n    var rotatedRect = new BoundingRect(textRect.x, textRect.y, afterWidth, afterHeight);\n    return rotatedRect;\n  }\n}", "\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\n\n\n/**\n * AUTO-GENERATED FILE. DO NOT MODIFY.\n */\n\n/*\n* Licensed to the Apache Software Foundation (ASF) under one\n* or more contributor license agreements.  See the NOTICE file\n* distributed with this work for additional information\n* regarding copyright ownership.  The ASF licenses this file\n* to you under the Apache License, Version 2.0 (the\n* \"License\"); you may not use this file except in compliance\n* with the License.  You may obtain a copy of the License at\n*\n*   http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing,\n* software distributed under the License is distributed on an\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n* KIND, either express or implied.  See the License for the\n* specific language governing permissions and limitations\n* under the License.\n*/\nimport { use } from './lib/extension.js';\nexport * from './lib/export/core.js';\n// ----------------------------------------------\n// All of the modules that are allowed to be\n// imported are listed below.\n//\n// Users MUST NOT import other modules that are\n// not included in this list.\n// ----------------------------------------------\nimport { SVGRenderer, CanvasRenderer } from './lib/export/renderers.js';\nimport { LineChart, BarChart, PieChart, ScatterChart, RadarChart, MapChart, TreeChart, TreemapChart, GraphChart, ChordChart, GaugeChart, FunnelChart, ParallelChart, SankeyChart, BoxplotChart, CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart, PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart } from './lib/export/charts.js';\nimport { GridComponent, PolarComponent, GeoComponent, SingleAxisComponent, ParallelComponent, CalendarComponent, MatrixComponent, GraphicComponent, ToolboxComponent, TooltipComponent, AxisPointerComponent, BrushComponent, TitleComponent, TimelineComponent, MarkPointComponent, MarkLineComponent, MarkAreaComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent, DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent, VisualMapPiecewiseComponent, ThumbnailComponent, AriaComponent, DatasetComponent, TransformComponent } from './lib/export/components.js';\nimport { UniversalTransition, LabelLayout, AxisBreak, LegacyGridContainLabel, ScatterJitter } from './lib/export/features.js';\n// -----------------\n// Render engines\n// -----------------\n// Render via Canvas.\n// echarts.init(dom, null, { renderer: 'canvas' })\nuse([CanvasRenderer]);\n// Render via SVG.\n// echarts.init(dom, null, { renderer: 'svg' })\nuse([SVGRenderer]);\n// ----------------\n// Charts (series)\n// ----------------\n// All of the series types, for example:\n// chart.setOption({\n//     series: [{\n//         type: 'line' // or 'bar', 'pie', ...\n//     }]\n// });\nuse([LineChart, BarChart, PieChart, ScatterChart, RadarChart, MapChart, TreeChart, TreemapChart, GraphChart, ChordChart, GaugeChart, FunnelChart, ParallelChart, SankeyChart, BoxplotChart, CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart, PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart]);\n// -------------------\n// Coordinate systems\n// -------------------\n// All of the axis modules have been included in the\n// coordinate system module below, do not need to\n// make extra import.\n// `cartesian` coordinate system. For some historical\n// reasons, it is named as grid, for example:\n// chart.setOption({\n//     grid: {...},\n//     xAxis: {...},\n//     yAxis: {...},\n//     series: [{...}]\n// });\nuse(GridComponent);\n// `polar` coordinate system, for example:\n// chart.setOption({\n//     polar: {...},\n//     radiusAxis: {...},\n//     angleAxis: {...},\n//     series: [{\n//         coordinateSystem: 'polar'\n//     }]\n// });\nuse(PolarComponent);\n// `geo` coordinate system, for example:\n// chart.setOption({\n//     geo: {...},\n//     series: [{\n//         coordinateSystem: 'geo'\n//     }]\n// });\nuse(GeoComponent);\n// `singleAxis` coordinate system (notice, it is a coordinate system\n// with only one axis, work for chart like theme river), for example:\n// chart.setOption({\n//     singleAxis: {...}\n//     series: [{type: 'themeRiver', ...}]\n// });\nuse(SingleAxisComponent);\n// `parallel` coordinate system, only work for parallel series, for example:\n// chart.setOption({\n//     parallel: {...},\n//     parallelAxis: [{...}, ...],\n//     series: [{\n//         type: 'parallel'\n//     }]\n// });\nuse(ParallelComponent);\n// `calendar` coordinate system. for example,\n// chart.setOption({\n//     calendar: {...},\n//     series: [{\n//         coordinateSystem: 'calendar'\n//     }]\n// );\nuse(CalendarComponent);\n// `matrix` coordinate system. for example,\n// chart.setOption({\n//     matrix: {...},\n//     series: [{\n//         coordinateSystem: 'matrix'\n//     }]\n// );\nuse(MatrixComponent);\n// ------------------\n// Other components\n// ------------------\n// `graphic` component, for example:\n// chart.setOption({\n//     graphic: {...}\n// });\nuse(GraphicComponent);\n// `toolbox` component, for example:\n// chart.setOption({\n//     toolbox: {...}\n// });\nuse(ToolboxComponent);\n// `tooltip` component, for example:\n// chart.setOption({\n//     tooltip: {...}\n// });\nuse(TooltipComponent);\n// `axisPointer` component, for example:\n// chart.setOption({\n//     tooltip: {axisPointer: {...}, ...}\n// });\n// Or\n// chart.setOption({\n//     axisPointer: {...}\n// });\nuse(AxisPointerComponent);\n// `brush` component, for example:\n// chart.setOption({\n//     brush: {...}\n// });\n// Or\n// chart.setOption({\n//     tooltip: {feature: {brush: {...}}\n// })\nuse(BrushComponent);\n// `title` component, for example:\n// chart.setOption({\n//     title: {...}\n// });\nuse(TitleComponent);\n// `timeline` component, for example:\n// chart.setOption({\n//     timeline: {...}\n// });\nuse(TimelineComponent);\n// `markPoint` component, for example:\n// chart.setOption({\n//     series: [{markPoint: {...}}]\n// });\nuse(MarkPointComponent);\n// `markLine` component, for example:\n// chart.setOption({\n//     series: [{markLine: {...}}]\n// });\nuse(MarkLineComponent);\n// `markArea` component, for example:\n// chart.setOption({\n//     series: [{markArea: {...}}]\n// });\nuse(MarkAreaComponent);\n// `legend` component not scrollable. for example:\n// chart.setOption({\n//     legend: {...}\n// });\nuse(LegendComponent);\n// `dataZoom` component including both `dataZoomInside` and `dataZoomSlider`.\nuse(DataZoomComponent);\n// `dataZoom` component providing drag, pinch, wheel behaviors\n// inside coordinate system, for example:\n// chart.setOption({\n//     dataZoom: {type: 'inside'}\n// });\nuse(DataZoomInsideComponent);\n// `dataZoom` component providing a slider bar, for example:\n// chart.setOption({\n//     dataZoom: {type: 'slider'}\n// });\nuse(DataZoomSliderComponent);\n// `visualMap` component including both `visualMapContinuous` and `visualMapPiecewise`.\nuse(VisualMapComponent);\n// `visualMap` component providing continuous bar, for example:\n// chart.setOption({\n//     visualMap: {type: 'continuous'}\n// });\nuse(VisualMapContinuousComponent);\n// `visualMap` component providing pieces bar, for example:\n// chart.setOption({\n//     visualMap: {type: 'piecewise'}\n// });\nuse(VisualMapPiecewiseComponent);\nuse(ThumbnailComponent);\n// `aria` component providing aria, for example:\n// chart.setOption({\n//     aria: {...}\n// });\nuse(AriaComponent);\n// dataset transform\n// chart.setOption({\n//     dataset: {\n//          transform: []\n//     }\n// });\nuse(TransformComponent);\nuse(DatasetComponent);\n// universal transition\n// chart.setOption({\n//     series: {\n//         universalTransition: { enabled: true }\n//     }\n// })\nuse(UniversalTransition);\n// label layout\n// chart.setOption({\n//     series: {\n//         labelLayout: { hideOverlap: true }\n//     }\n// })\nuse(LabelLayout);\nuse(AxisBreak);\nuse(LegacyGridContainLabel);\nuse(ScatterJitter);", "import * as echarts from \"echarts\";\nimport { AlpineComponent } from \"alpinejs\";\nimport z from \"zod\";\n\nconst dataSchema = z.array(z.object({ name: z.string(), value: z.number() }));\n\ninterface State extends Record<string | symbol, unknown> {\n  init(): void;\n}\n\nexport default (): AlpineComponent<State> => {\n  return {\n    init() {\n      if (!(this.$el instanceof HTMLElement)) {\n        return;\n      }\n\n      const dataAttr = this.$el.dataset[\"charts\"];\n      if (!dataAttr) {\n        return;\n      }\n\n      const data = dataSchema.safeParse(JSON.parse(dataAttr));\n\n      if (!data.success) {\n        return;\n      }\n\n      const chart = echarts.init(this.$el);\n\n      const option = {\n        tooltip: {\n          trigger: \"axis\",\n          axisPointer: {\n            type: \"shadow\",\n          },\n        },\n        xAxis: {\n          type: \"category\",\n          data: data.data.map((item) => item.name),\n        },\n        yAxis: {\n          type: \"value\",\n        },\n        series: [\n          {\n            data: data.data.map((item) => item.value),\n            type: \"bar\",\n            itemStyle: {\n              color: \"#78be35\",\n            },\n          },\n        ],\n      };\n\n      chart.setOption(option);\n\n      window.addEventListener(\"resize\", () => {\n        chart.resize();\n      });\n    },\n  };\n};\n", "import * as echarts from \"echarts\";\nimport { AlpineComponent } from \"alpinejs\";\nimport z from \"zod\";\n\nconst dataSchema = z.array(z.object({ name: z.string(), value: z.number() }));\n\ninterface State extends Record<string | symbol, unknown> {\n  init(): void;\n}\n\nexport default (): AlpineComponent<State> => {\n  return {\n    init() {\n      if (!(this.$el instanceof HTMLElement)) {\n        return;\n      }\n\n      const dataAttr = this.$el.dataset[\"charts\"];\n\n      if (!dataAttr) {\n        return;\n      }\n\n      const data = dataSchema.safeParse(JSON.parse(dataAttr));\n\n      if (!data.success) {\n        return;\n      }\n\n      const chart = echarts.init(this.$el);\n\n      const option = {\n        tooltip: {\n          trigger: \"item\",\n        },\n        series: [\n          {\n            type: \"pie\",\n            radius: [\"40%\", \"70%\"],\n            center: [\"50%\", \"45%\"],\n            data: data.data,\n          },\n        ],\n      };\n\n      window.addEventListener(\"resize\", () => {\n        chart.resize();\n      });\n\n      // Hold the first render (and its animation) until the chart scrolls into\n      // view, rather than playing it on page load.\n      if (typeof IntersectionObserver === \"undefined\") {\n        chart.setOption(option);\n        return;\n      }\n\n      const observer = new IntersectionObserver((entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting) {\n            // Drawn in a hidden tab, it was laid out at no size.\n            chart.resize();\n            chart.setOption(option);\n            observer.disconnect();\n            break;\n          }\n        }\n      });\n\n      observer.observe(this.$el);\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\nimport { TIMEZONE } from \"../dates\";\n\nconst calendarYear = (value: Date) =>\n  new Intl.DateTimeFormat(\"en-GB\", {\n    timeZone: TIMEZONE,\n    year: \"numeric\",\n  }).format(value);\n\ninterface State extends Record<string | symbol, unknown> {\n  value: string | undefined;\n}\n\nexport default (): AlpineComponent<State> => ({\n  init() {\n    this.value = this.$el.querySelector(\"input\")?.value;\n  },\n\n  change() {\n    if (!(this.$el instanceof HTMLInputElement)) {\n      return;\n    }\n\n    this.value = this.$el.value;\n  },\n\n  click() {\n    try {\n      this.$el.querySelector(\"input\")?.showPicker();\n    } catch {\n      // This can throw a user activation error but it\n      // seems harmless.\n    }\n  },\n\n  text() {\n    if (this.value === undefined) {\n      return;\n    }\n\n    // A datetime-local value has no zone, so the day is read off the string\n    // rather than parsed in the browser's.\n    const timed = this.value.includes(\"T\");\n    const value = new Date(timed ? this.value.slice(0, 10) : this.value);\n\n    if (isNaN(value.getTime())) {\n      return \"-\";\n    }\n\n    const year = calendarYear(value);\n\n    let label = new Intl.DateTimeFormat(\"en-GB\", {\n      timeZone: TIMEZONE,\n      day: \"numeric\",\n      month: \"short\",\n    }).format(value);\n\n    if (calendarYear(new Date()) !== year) {\n      label += ` ${year.slice(-2)}`;\n    }\n\n    if (timed) {\n      label += `, ${this.value.slice(11, 16)}`;\n    }\n\n    return label;\n  },\n\n  value: undefined,\n});\n", "/**\n * Pieces shared by the analytics pages: the palette, date and money\n * formatting, table cells, and the chip toggle.\n */\n\n/**\n * Consultant colours, assigned by position in `payload.consultants` \u2014 which the\n * server sorts alphabetically, so a colour belongs to a person and filtering\n * never repaints the survivors.\n *\n * The order is the colourblind-safety mechanism, not a preference: adjacent\n * pairs clear a CVD separation check that an arbitrary ordering does not.\n */\nexport const SERIES = [\n  \"#2a78d6\",\n  \"#eb6834\",\n  \"#1baf7a\",\n  \"#eda100\",\n  \"#e87ba4\",\n  \"#008300\",\n  \"#4a3aa7\",\n  \"#e34948\",\n];\n\nexport const OTHER = \"#c4c3bd\";\n\n/** Single-series charts are magnitude, not identity: one hue for every bar. */\nexport const SINGLE = \"#2a78d6\";\n\nexport const INK = \"#0b0b0b\";\nexport const MUTED = \"#7c7b76\";\nexport const GRID = \"#e8e7e2\";\nexport const SURFACE = \"#ffffff\";\n\nexport const MONTHS = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nexport function shortDate(iso: string): string {\n  const parts = iso.split(\"-\");\n  return `${Number(parts[2])} ${MONTHS[Number(parts[1]) - 1] ?? \"\"}`;\n}\n\nexport function longDate(iso: string): string {\n  return `${shortDate(iso)} ${iso.slice(0, 4)}`;\n}\n\nexport function money(pence: number): string {\n  return `\u00A3${Math.round(pence / 100).toLocaleString(\"en-GB\")}`;\n}\n\nexport function cell(text: string, className = \"\"): HTMLTableCellElement {\n  const td = document.createElement(\"td\");\n  td.className = `p-2 text-right tabular-nums ${className}`.trim();\n  td.textContent = text;\n  return td;\n}\n\nexport function nameCell(name: string, colour?: string): HTMLTableCellElement {\n  const td = document.createElement(\"td\");\n  td.className = \"p-2 text-left\";\n\n  const wrap = document.createElement(\"span\");\n  wrap.className = \"flex gap-2 items-center\";\n\n  if (colour) {\n    const key = document.createElement(\"span\");\n    key.className = \"h-2.5 rounded-sm shrink-0 w-2.5\";\n    key.style.backgroundColor = colour;\n    wrap.append(key);\n  }\n\n  const label = document.createElement(\"span\");\n  label.textContent = name;\n  wrap.append(label);\n  td.append(wrap);\n\n  return td;\n}\n\nexport function headerRow(\n  first: string,\n  rest: string[],\n  selected: number,\n): HTMLElement {\n  const tr = document.createElement(\"tr\");\n  tr.className = \"border-b\";\n\n  const th = document.createElement(\"th\");\n  th.className = \"font-bold p-2 text-left\";\n  th.textContent = first;\n  tr.append(th);\n\n  rest.forEach((label, index) => {\n    const head = document.createElement(\"th\");\n    head.className = `font-bold p-2 text-right ${\n      index === selected ? \"bg-blue-50 text-blue-700\" : \"\"\n    }`.trim();\n    head.textContent = label;\n    tr.append(head);\n  });\n\n  return tr;\n}\n\n/** A header row where each column says which way it aligns. */\nexport function headRow(columns: [string, \"left\" | \"right\"][]): HTMLElement {\n  const tr = document.createElement(\"tr\");\n  tr.className = \"border-b\";\n\n  for (const [label, align] of columns) {\n    const th = document.createElement(\"th\");\n    th.className = `font-bold p-2 whitespace-nowrap text-${align}`;\n    th.textContent = label;\n    tr.append(th);\n  }\n\n  return tr;\n}\n\nexport function emptyRow(columns: number, message: string): HTMLElement {\n  const tr = document.createElement(\"tr\");\n  const td = document.createElement(\"td\");\n  td.colSpan = columns;\n  td.className = \"p-6 text-center text-gray-500\";\n  td.textContent = message;\n  tr.append(td);\n  return tr;\n}\n\n/**\n * Clicking one chip while everything is selected drills down to just that one;\n * after that a chip toggles. Emptying the set selects everything again, because\n * a page showing nothing is never what someone meant.\n */\nexport function toggle(\n  current: string[],\n  all: string[],\n  name: string,\n): string[] {\n  if (current.length === all.length) {\n    return [name];\n  }\n\n  const next = current.includes(name)\n    ? current.filter((value) => value !== name)\n    : [...current, name];\n\n  return next.length ? next : [...all];\n}\n\n/** Fills a table: header, body (or a message when empty) and an optional footer. */\nexport function fill(\n  host: unknown,\n  columns: [string, \"left\" | \"right\"][],\n  rows: HTMLElement[],\n  empty: string,\n  foot?: HTMLElement,\n) {\n  if (!(host instanceof HTMLElement)) {\n    return;\n  }\n\n  host.textContent = \"\";\n\n  const head = document.createElement(\"thead\");\n  head.append(headRow(columns));\n\n  const body = document.createElement(\"tbody\");\n  body.className = \"divide-y\";\n  body.append(...(rows.length ? rows : [emptyRow(columns.length, empty)]));\n\n  host.append(head, body);\n\n  if (foot && rows.length) {\n    const tfoot = document.createElement(\"tfoot\");\n    tfoot.append(foot);\n    host.append(tfoot);\n  }\n}\n\nexport function row(...cells: HTMLTableCellElement[]): HTMLElement {\n  const tr = document.createElement(\"tr\");\n  tr.className = \"hover:bg-blue-50\";\n  tr.append(...cells);\n  return tr;\n}\n\nexport function totalRow(...cells: HTMLTableCellElement[]): HTMLElement {\n  const tr = document.createElement(\"tr\");\n  tr.className = \"border-t font-semibold\";\n  tr.append(...cells);\n  return tr;\n}\n", "import z from \"zod\";\n\nimport { MONTHS, OTHER, SERIES } from \"./dom\";\n\n/**\n * Shape of the payload `apps.operations.combined_analytics.payload` hands the\n * page, and the small pure helpers over it. Everything is already counted on\n * the server; the page only picks rows.\n */\n\nconst streamsSchema = z.object({\n  buildpack: z.number(),\n  hep: z.number(),\n  project: z.number(),\n});\n\nconst trendSchema = z.object({\n  start: z.string(),\n  revenue: streamsSchema,\n  sales: streamsSchema,\n});\n\nconst countySchema = streamsSchema.extend({ county: z.string() });\n\nconst spanSchema = z.object({\n  counties: z.array(countySchema),\n  complexity: z.record(z.string(), z.number()),\n});\n\nconst stepsSchema = z.object({\n  packs: z.number(),\n  sale_to_survey: z.number(),\n  survey_to_call: z.number(),\n  call_to_release: z.number(),\n});\n\nconst deliverySchema = z.object({\n  start: z.string(),\n  released: z.record(z.string(), z.number()),\n  surveys: z.number(),\n  sold: z.number(),\n  steps: stepsSchema.nullable(),\n  accepted: z.record(z.string(), z.number()),\n  accepted_value: z.number(),\n});\n\nconst tilesSchema = z.object({\n  sold: z.number(),\n  released: z.number(),\n  with_call: z.number(),\n  with_target: z.number(),\n  on_time: z.number(),\n  released_to_date: z.number(),\n  referred_to_date: z.number(),\n  referred_in_period: z.number(),\n  released_projects: z.number(),\n  feedback_to_date: z.number(),\n  feedback_in_period: z.number(),\n});\n\nconst grains = <T extends z.ZodType>(schema: T) =>\n  z.object({ week: schema, month: schema, quarter: schema });\n\nexport const combinedSchema = z.object({\n  today: z.string(),\n  trends: grains(z.array(trendSchema)),\n  spans: z.object({ \"3m\": spanSchema, \"12m\": spanSchema, all: spanSchema }),\n  delivery: grains(z.array(deliverySchema)),\n  consultants: z.array(z.string()),\n  tiles: grains(tilesSchema),\n  pipeline: z.object({\n    assessors: z.array(z.object({ assessor: z.string(), open: z.number() })),\n    consultants: z.array(\n      z.object({\n        consultant: z.string(),\n        buildpacks: z.number(),\n        heps: z.number(),\n        projects: z.number(),\n        awaiting_final: z.number(),\n      }),\n    ),\n    contractors: z.array(\n      z.object({\n        contractor: z.string(),\n        referred: z.number(),\n        quote_received: z.number(),\n      }),\n    ),\n  }),\n});\n\nexport type Combined = z.infer<typeof combinedSchema>;\nexport type Trend = z.infer<typeof trendSchema>;\nexport type DeliveryRow = z.infer<typeof deliverySchema>;\nexport type Tiles = z.infer<typeof tilesSchema>;\n\nexport type Grain = \"week\" | \"month\" | \"quarter\";\nexport type Span = \"3m\" | \"12m\" | \"all\";\n\nexport const STREAMS = [\n  [\"buildpack\", \"Build Packs\"],\n  [\"hep\", \"HEPs\"],\n  [\"project\", \"Projects\"],\n] as const;\n\nexport const UNASSIGNED = \"Unassigned\";\n\nconst NOUNS: Record<Grain, string> = {\n  week: \"week\",\n  month: \"month\",\n  quarter: \"quarter\",\n};\n\n/** The axis label for a period starting on `start`. */\nexport function periodLabel(grain: Grain, start: string): string {\n  const year = start.slice(0, 4);\n  const month = Number(start.slice(5, 7));\n\n  if (grain === \"week\") {\n    return `${Number(start.slice(8, 10))} ${MONTHS[month - 1] ?? \"\"}`;\n  }\n\n  if (grain === \"month\") {\n    return `${MONTHS[month - 1] ?? \"\"} ${year}`;\n  }\n\n  return `Q${Math.floor((month - 1) / 3) + 1} ${year}`;\n}\n\n/** The tooltip title: a week says it is the week commencing, the latest that it is to date. */\nexport function periodTitle(\n  grain: Grain,\n  start: string,\n  latest: boolean,\n): string {\n  const label =\n    grain === \"week\"\n      ? `w/c ${periodLabel(grain, start)} ${start.slice(0, 4)}`\n      : periodLabel(grain, start);\n\n  return latest ? `${label} (to date)` : label;\n}\n\n/** A consultant keeps one colour across every chart; Unassigned is grey. */\nexport function consultantColour(consultants: string[], name: string): string {\n  if (name === UNASSIGNED) {\n    return OTHER;\n  }\n\n  const index = consultants.indexOf(name);\n\n  return (\n    SERIES[(index < 0 ? consultants.length : index) % SERIES.length] ?? OTHER\n  );\n}\n\n/** The consultants with any count in these rows, in the page's colour order. */\nexport function present(\n  consultants: string[],\n  rows: Record<string, number>[],\n): string[] {\n  return consultants.filter((name) => rows.some((row) => (row[name] ?? 0) > 0));\n}\n\nexport function percent(part: number, whole: number): string {\n  return whole ? `${Math.round((part / whole) * 100)}%` : \"\u2013\";\n}\n\n/** The four delivery tiles for the week, month or quarter to date. */\nexport function tileText(grain: Grain, tiles: Tiles) {\n  const noun = NOUNS[grain];\n\n  return {\n    call: percent(tiles.with_call, tiles.released),\n    callFoot: `${tiles.with_call} of ${tiles.released} released this ${noun}`,\n    onTime: percent(tiles.on_time, tiles.with_target),\n    onTimeFoot: `${tiles.on_time} of ${tiles.with_target} released this ${noun}, not counting complex projects`,\n    referred: percent(tiles.referred_to_date, tiles.released_to_date),\n    referredFoot: `${tiles.referred_to_date} of ${tiles.released_to_date} released to date \u00B7 ${tiles.referred_in_period} first referred this ${noun}`,\n    feedback: percent(tiles.feedback_to_date, tiles.released_projects),\n    feedbackFoot: `${tiles.feedback_to_date} of ${tiles.released_projects} released to date \u00B7 ${tiles.feedback_in_period} first given this ${noun}`,\n  };\n}\n\n/** Adds up each numeric column of a table's rows. */\nexport function totals<T extends Record<string, unknown>>(\n  rows: T[],\n  keys: (keyof T)[],\n): number[] {\n  return keys.map((key) =>\n    rows.reduce((sum, each) => sum + Number(each[key] ?? 0), 0),\n  );\n}\n", "import type { AlpineComponent } from \"alpinejs\";\nimport * as echarts from \"echarts\";\n\nimport {\n  type Combined,\n  combinedSchema,\n  consultantColour,\n  type DeliveryRow,\n  type Grain,\n  periodLabel,\n  periodTitle,\n  present,\n  type Span,\n  STREAMS,\n  tileText,\n  totals,\n} from \"./combined-data\";\nimport {\n  cell,\n  fill,\n  GRID,\n  INK,\n  money,\n  MUTED,\n  nameCell,\n  row,\n  SERIES,\n  SURFACE,\n  totalRow,\n} from \"./dom\";\n\n/**\n * The combined analytics page: revenue and sales by stream, Build Pack\n * delivery and the work open now. The server counts every period; the\n * controls only pick which rows the charts draw.\n */\n\nconst CHARTS = [\n  \"revenue\",\n  \"sales\",\n  \"complexity\",\n  \"delivered\",\n  \"pace\",\n  \"timeline\",\n  \"accepted\",\n] as const;\n\ntype ChartKey = (typeof CHARTS)[number];\n\ntype Field = \"grain\" | \"span\" | \"period\";\n\nconst STEPS = [\n  [\"sale_to_survey\", \"Sale to survey\"],\n  [\"survey_to_call\", \"Survey to call\"],\n  [\"call_to_release\", \"Call to release\"],\n] as const;\n\ninterface Summary {\n  revenue: string;\n  sold: number;\n  released: number;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  data: Combined | null;\n  grain: Grain;\n  span: Span;\n  period: Grain;\n  summary: Summary;\n  tiles: ReturnType<typeof tileText> | Record<string, string>;\n  init(): void;\n  pick(field: Field, value: string): void;\n  render(): void;\n}\n\ninterface TooltipItem {\n  axisValue?: string;\n  dataIndex: number;\n  seriesName?: string;\n  color?: string;\n  value?: unknown;\n}\n\n/** Pence as a short axis label: \u00A3850, \u00A31.5k, \u00A324k. */\nfunction pounds(value: number): string {\n  if (value < 100_000) {\n    return money(value);\n  }\n\n  const thousands = value / 100_000;\n\n  return `\u00A3${thousands < 10 ? Number(thousands.toFixed(1)) : Math.round(thousands)}k`;\n}\n\nfunction signed(value: number): string {\n  return value > 0 ? `+${value}` : `${value}`;\n}\n\nfunction dot(colour: string): string {\n  return `<span style=\"background:${colour};border-radius:2px;display:inline-block;height:10px;margin-right:6px;width:10px\"></span>`;\n}\n\n/** Escapes names typed by staff before they go into tooltip HTML. */\nfunction escapeHtml(text: string): string {\n  return text.replace(\n    /[&<>\"']/g,\n    (char) =>\n      ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[\n        char\n      ] ?? char,\n  );\n}\n\nfunction tooltipLines(title: string, lines: [string, string][]): string {\n  return [\n    `<strong>${escapeHtml(title)}</strong>`,\n    ...lines.map(\n      ([colour, text]) => `${colour ? dot(colour) : \"\"}${escapeHtml(text)}`,\n    ),\n  ].join(\"<br>\");\n}\n\nconst axisLabel = { color: MUTED };\nconst splitLine = { lineStyle: { color: GRID } };\n\nfunction categoryAxis(labels: string[]) {\n  return {\n    type: \"category\" as const,\n    data: labels,\n    axisLabel,\n    axisLine: { lineStyle: { color: GRID } },\n    axisTick: { show: false },\n  };\n}\n\nfunction valueAxis(format?: (value: number) => string) {\n  return {\n    type: \"value\" as const,\n    minInterval: 1,\n    axisLabel: { ...axisLabel, formatter: format },\n    splitLine,\n  };\n}\n\nfunction legend() {\n  return { bottom: 0, icon: \"roundRect\", textStyle: { color: MUTED } };\n}\n\nexport default (): AlpineComponent<State> => {\n  const charts: Partial<Record<ChartKey, echarts.ECharts>> = {};\n\n  const draw = (key: ChartKey, option: echarts.EChartsCoreOption) => {\n    charts[key]?.setOption(option, { notMerge: true });\n  };\n\n  return {\n    data: null,\n    grain: \"month\",\n    span: \"12m\",\n    period: \"month\",\n    summary: { revenue: \"\u2013\", sold: 0, released: 0 },\n    tiles: {},\n\n    init() {\n      if (!(this.$el instanceof HTMLElement)) {\n        return;\n      }\n\n      const raw = this.$el.dataset[\"analytics\"];\n      const parsed = raw ? combinedSchema.safeParse(JSON.parse(raw)) : null;\n\n      if (!parsed?.success) {\n        return;\n      }\n\n      this.data = parsed.data;\n\n      for (const key of CHARTS) {\n        const host = this.$refs[key];\n\n        if (host instanceof HTMLElement) {\n          charts[key] = echarts.init(host);\n        }\n      }\n\n      window.addEventListener(\"resize\", () => {\n        for (const chart of Object.values(charts)) {\n          chart.resize();\n        }\n      });\n\n      this.render();\n    },\n\n    pick(field: Field, value: string) {\n      if (field === \"span\") {\n        this.span = value as Span;\n      } else {\n        this[field] = value as Grain;\n      }\n\n      this.render();\n    },\n\n    render() {\n      const data = this.data;\n\n      if (!data) {\n        return;\n      }\n\n      const month = data.tiles.month;\n      const thisMonth = data.trends.month.at(-1);\n\n      this.summary = {\n        revenue: thisMonth\n          ? money(\n              STREAMS.reduce((sum, [key]) => sum + thisMonth.revenue[key], 0),\n            )\n          : \"\u2013\",\n        sold: month.sold,\n        released: month.released,\n      };\n      this.tiles = tileText(this.period, data.tiles[this.period]);\n\n      renderTrends(data.trends[this.grain], this.grain);\n      renderSpan(this.$refs[\"counties\"], data.spans[this.span]);\n\n      const delivery = data.delivery[this.period];\n      renderDelivered(delivery, this.period, data.consultants);\n      renderPace(delivery, this.period);\n      renderTimeline(delivery, this.period);\n      renderAccepted(delivery, this.period, data.consultants);\n\n      renderPipeline(this.$refs, data.pipeline);\n    },\n  };\n\n  function renderTrends(rows: Combined[\"trends\"][\"month\"], grain: Grain) {\n    const labels = rows.map((each) => periodLabel(grain, each.start));\n    const last = rows.length - 1;\n    const title = (index: number) =>\n      periodTitle(grain, rows[index]?.start ?? \"\", index === last);\n\n    const line = (\n      name: string,\n      colour: string,\n      values: number[],\n      width = 2,\n    ) => ({\n      name,\n      type: \"line\" as const,\n      data: values,\n      symbolSize: 5,\n      itemStyle: { color: colour },\n      lineStyle: { color: colour, width },\n    });\n\n    const revenue = STREAMS.map(([key, name], index) =>\n      line(\n        name,\n        SERIES[index] ?? INK,\n        rows.map((each) => each.revenue[key]),\n      ),\n    );\n    const total = rows.map((each) =>\n      STREAMS.reduce((sum, [key]) => sum + each.revenue[key], 0),\n    );\n\n    draw(\"revenue\", {\n      grid: { left: 56, right: 16, top: 16, bottom: 56 },\n      legend: legend(),\n      tooltip: {\n        trigger: \"axis\",\n        formatter: (items: TooltipItem[]) => {\n          const index = items[0]?.dataIndex ?? 0;\n          return tooltipLines(\n            title(index),\n            items\n              .slice()\n              .reverse()\n              .map((item) => [\n                item.color ?? \"\",\n                `${item.seriesName}: ${money(Number(item.value))}`,\n              ]),\n          );\n        },\n      },\n      xAxis: categoryAxis(labels),\n      yAxis: valueAxis(pounds),\n      series: [...revenue, line(\"Total\", INK, total, 2.5)],\n    });\n\n    draw(\"sales\", {\n      grid: { left: 40, right: 16, top: 16, bottom: 56 },\n      legend: legend(),\n      tooltip: {\n        trigger: \"axis\",\n        formatter: (items: TooltipItem[]) =>\n          tooltipLines(\n            title(items[0]?.dataIndex ?? 0),\n            items.map((item) => [\n              item.color ?? \"\",\n              `${item.seriesName}: ${item.value}`,\n            ]),\n          ),\n      },\n      xAxis: categoryAxis(labels),\n      yAxis: valueAxis(),\n      series: STREAMS.map(([key, name], index) =>\n        line(\n          name,\n          SERIES[index] ?? INK,\n          rows.map((each) => each.sales[key]),\n        ),\n      ),\n    });\n  }\n\n  function renderSpan(host: unknown, span: Combined[\"spans\"][\"all\"]) {\n    const keys = [\"buildpack\", \"hep\", \"project\"] as const;\n    const sums = totals(span.counties, [...keys]);\n\n    fill(\n      host,\n      [\n        [\"County\", \"left\"],\n        ...STREAMS.map(([, name]): [string, \"right\"] => [name, \"right\"]),\n        [\"Total\", \"right\"],\n      ],\n      span.counties.map((each) =>\n        row(\n          nameCell(each.county),\n          ...keys.map((key) => cell(String(each[key]))),\n          cell(String(keys.reduce((sum, key) => sum + each[key], 0))),\n        ),\n      ),\n      \"No sales in this span.\",\n      totalRow(\n        nameCell(\"Total\"),\n        ...sums.map((sum) => cell(String(sum))),\n        cell(String(sums.reduce((sum, each) => sum + each, 0))),\n      ),\n    );\n\n    const slices = Object.entries(span.complexity);\n    const whole = slices.reduce((sum, [, count]) => sum + count, 0);\n\n    draw(\"complexity\", {\n      legend: legend(),\n      tooltip: {\n        trigger: \"item\",\n        formatter: (item: { name: string; value: number }) =>\n          `${escapeHtml(item.name)}: ${item.value} (${Math.round((item.value / (whole || 1)) * 100)}%)`,\n      },\n      series: [\n        {\n          type: \"pie\",\n          radius: \"70%\",\n          center: [\"50%\", \"45%\"],\n          itemStyle: { borderColor: SURFACE, borderWidth: 1.5 },\n          label: {\n            color: INK,\n            formatter: (item: { name: string; percent: number }) =>\n              `${item.name} ${Math.round(item.percent)}%`,\n          },\n          data: slices.map(([name, count], index) => ({\n            name,\n            value: count,\n            itemStyle: { color: SERIES[index] ?? INK },\n          })),\n        },\n      ],\n    });\n  }\n\n  function stackedByConsultant(\n    rows: DeliveryRow[],\n    consultants: string[],\n    pick: (each: DeliveryRow) => Record<string, number>,\n  ) {\n    return present(consultants, rows.map(pick)).map((name) => ({\n      name,\n      type: \"bar\" as const,\n      stack: \"total\",\n      barMaxWidth: 32,\n      itemStyle: {\n        color: consultantColour(consultants, name),\n        borderColor: SURFACE,\n        borderWidth: 1,\n      },\n      data: rows.map((each) => pick(each)[name] ?? 0),\n    }));\n  }\n\n  function renderDelivered(\n    rows: DeliveryRow[],\n    grain: Grain,\n    consultants: string[],\n  ) {\n    const last = rows.length - 1;\n\n    draw(\"delivered\", {\n      grid: { left: 40, right: 16, top: 16, bottom: 56 },\n      legend: legend(),\n      tooltip: {\n        trigger: \"axis\",\n        axisPointer: { type: \"shadow\" },\n        formatter: (items: TooltipItem[]) => {\n          const index = items[0]?.dataIndex ?? 0;\n          const each = rows[index];\n          const released = Object.values(each?.released ?? {}).reduce(\n            (sum, count) => sum + count,\n            0,\n          );\n\n          return tooltipLines(\n            `${periodTitle(grain, each?.start ?? \"\", index === last)}: ${released} released`,\n            items\n              .filter((item) => Number(item.value) > 0)\n              .map((item) => [\n                item.color ?? \"\",\n                `${item.seriesName}: ${item.value}`,\n              ]),\n          );\n        },\n      },\n      xAxis: categoryAxis(rows.map((each) => periodLabel(grain, each.start))),\n      yAxis: valueAxis(),\n      series: [\n        ...stackedByConsultant(rows, consultants, (each) => each.released),\n        {\n          name: \"Surveys completed\",\n          type: \"line\",\n          data: rows.map((each) => each.surveys),\n          symbolSize: 5,\n          itemStyle: { color: INK },\n          lineStyle: { color: INK, width: 2 },\n        },\n      ],\n    });\n  }\n\n  function renderPace(rows: DeliveryRow[], grain: Grain) {\n    const last = rows.length - 1;\n    const net = rows.map(\n      (each) =>\n        each.sold -\n        Object.values(each.released).reduce((sum, count) => sum + count, 0),\n    );\n    const [ahead = INK, behind = INK] = SERIES;\n    const limit = Math.ceil(Math.max(1, ...net.map(Math.abs)) * 1.2);\n\n    draw(\"pace\", {\n      grid: { left: 40, right: 16, top: 24, bottom: 56 },\n      legend: {\n        ...legend(),\n        data: [\n          { name: \"Sales ahead\", itemStyle: { color: ahead } },\n          { name: \"Delivery ahead\", itemStyle: { color: behind } },\n        ],\n        selectedMode: false,\n      },\n      tooltip: {\n        trigger: \"axis\",\n        formatter: (items: TooltipItem[]) => {\n          const index = items[0]?.dataIndex ?? 0;\n          const each = rows[index];\n          const sold = each?.sold ?? 0;\n\n          return tooltipLines(\n            periodTitle(grain, each?.start ?? \"\", index === last),\n            [\n              [\"\", `Sold: ${sold}`],\n              [\"\", `Released: ${sold - (net[index] ?? 0)}`],\n              [\"\", `Difference: ${signed(net[index] ?? 0)}`],\n            ],\n          );\n        },\n      },\n      visualMap: {\n        show: false,\n        seriesIndex: 0,\n        dimension: 1,\n        // Bounded, or echarts finds no stops to colour the line with.\n        pieces: [\n          { gte: 0, lte: limit, color: ahead },\n          { gte: -limit, lt: 0, color: behind },\n        ],\n      },\n      xAxis: categoryAxis(rows.map((each) => periodLabel(grain, each.start))),\n      // Zero sits in the middle, so ahead and behind read the same way.\n      yAxis: { ...valueAxis(signed), min: -limit, max: limit },\n      series: [\n        {\n          name: \"Sold minus released\",\n          type: \"line\",\n          data: net,\n          symbolSize: 6,\n          lineStyle: { width: 2 },\n          label: {\n            show: true,\n            color: INK,\n            formatter: ({ value }: { value: number }) => signed(value),\n          },\n        },\n        // Empty series give the legend its two colours.\n        { name: \"Sales ahead\", type: \"line\", data: [] },\n        { name: \"Delivery ahead\", type: \"line\", data: [] },\n      ],\n    });\n  }\n\n  function renderTimeline(rows: DeliveryRow[], grain: Grain) {\n    const last = rows.length - 1;\n    const timed = rows.filter((each) => each.steps);\n    const totalDays = (each: DeliveryRow) =>\n      STEPS.reduce((sum, [key]) => sum + (each.steps?.[key] ?? 0), 0);\n\n    draw(\"timeline\", {\n      grid: { left: 72, right: 72, top: 8, bottom: 56 },\n      legend: legend(),\n      tooltip: {\n        trigger: \"axis\",\n        axisPointer: { type: \"shadow\" },\n        formatter: (items: TooltipItem[]) => {\n          const each = timed[items[0]?.dataIndex ?? 0];\n          const packs = each?.steps?.packs ?? 0;\n\n          return tooltipLines(\n            `${periodTitle(grain, each?.start ?? \"\", each === rows[last])}: ${packs} ${packs === 1 ? \"pack\" : \"packs\"}`,\n            items.map((item) => [\n              item.color ?? \"\",\n              `${item.seriesName}: ${Number(item.value).toFixed(1)} days`,\n            ]),\n          );\n        },\n      },\n      xAxis: {\n        ...valueAxis((value: number) => `${value}d`),\n        minInterval: undefined,\n      },\n      yAxis: {\n        ...categoryAxis(timed.map((each) => periodLabel(grain, each.start))),\n        inverse: true,\n      },\n      series: STEPS.map(([key, name], index) => ({\n        name,\n        type: \"bar\",\n        stack: \"total\",\n        barMaxWidth: 24,\n        itemStyle: {\n          color: SERIES[index] ?? INK,\n          borderColor: SURFACE,\n          borderWidth: 1,\n        },\n        label:\n          index === STEPS.length - 1\n            ? {\n                show: true,\n                position: \"right\",\n                color: INK,\n                formatter: ({ dataIndex }: { dataIndex: number }) => {\n                  const each = timed[dataIndex];\n                  return each ? `${totalDays(each).toFixed(1)} days` : \"\";\n                },\n              }\n            : undefined,\n        data: timed.map((each) => each.steps?.[key] ?? 0),\n      })),\n    });\n  }\n\n  function renderAccepted(\n    rows: DeliveryRow[],\n    grain: Grain,\n    consultants: string[],\n  ) {\n    const last = rows.length - 1;\n    const counts = rows.map((each) =>\n      Object.values(each.accepted).reduce((sum, count) => sum + count, 0),\n    );\n\n    const bars = stackedByConsultant(\n      rows,\n      consultants,\n      (each) => each.accepted,\n    );\n\n    draw(\"accepted\", {\n      grid: { left: 40, right: 16, top: 24, bottom: 56 },\n      legend: { ...legend(), data: bars.map((bar) => bar.name) },\n      tooltip: {\n        trigger: \"axis\",\n        axisPointer: { type: \"shadow\" },\n        formatter: (items: TooltipItem[]) => {\n          const index = items[0]?.dataIndex ?? 0;\n          const each = rows[index];\n\n          return tooltipLines(\n            `${periodTitle(grain, each?.start ?? \"\", index === last)}: ${counts[index]} accepted, ${money(each?.accepted_value ?? 0)}`,\n            items\n              .filter(\n                (item) => item.seriesName !== \"Value\" && Number(item.value) > 0,\n              )\n              .map((item) => [\n                item.color ?? \"\",\n                `${item.seriesName}: ${item.value}`,\n              ]),\n          );\n        },\n      },\n      xAxis: categoryAxis(rows.map((each) => periodLabel(grain, each.start))),\n      yAxis: valueAxis(),\n      series: [\n        ...bars,\n        // The value of each period's accepted quotes, over its bar.\n        {\n          name: \"Value\",\n          type: \"scatter\",\n          symbolSize: 0,\n          data: counts,\n          label: {\n            show: true,\n            position: \"top\",\n            color: INK,\n            formatter: ({ dataIndex }: { dataIndex: number }) =>\n              counts[dataIndex]\n                ? pounds(rows[dataIndex]?.accepted_value ?? 0)\n                : \"\",\n          },\n        },\n      ],\n    });\n  }\n\n  function renderPipeline(\n    refs: Record<string, unknown>,\n    pipeline: Combined[\"pipeline\"],\n  ) {\n    const assessors = pipeline.assessors;\n    fill(\n      refs[\"assessors\"],\n      [\n        [\"Assessor\", \"left\"],\n        [\"Open surveys\", \"right\"],\n      ],\n      assessors.map((each) =>\n        row(nameCell(each.assessor), cell(String(each.open))),\n      ),\n      \"No surveys booked.\",\n      totalRow(\n        nameCell(\"Total\"),\n        ...totals(assessors, [\"open\"]).map((sum) => cell(String(sum))),\n      ),\n    );\n\n    const workKeys = [\n      \"buildpacks\",\n      \"heps\",\n      \"projects\",\n      \"awaiting_final\",\n    ] as const;\n    const work = pipeline.consultants;\n    fill(\n      refs[\"consultants\"],\n      [\n        [\"Consultant\", \"left\"],\n        [\"Build Packs\", \"right\"],\n        [\"HEPs\", \"right\"],\n        [\"Projects\", \"right\"],\n        [\"Awaiting final payment\", \"right\"],\n      ],\n      work.map((each) =>\n        row(\n          nameCell(each.consultant),\n          ...workKeys.map((key) => cell(String(each[key]))),\n        ),\n      ),\n      \"Nothing open.\",\n      totalRow(\n        nameCell(\"Total\"),\n        ...totals(work, [...workKeys]).map((sum) => cell(String(sum))),\n      ),\n    );\n\n    const contractors = pipeline.contractors;\n    fill(\n      refs[\"contractors\"],\n      [\n        [\"Contractor\", \"left\"],\n        [\"Referred\", \"right\"],\n        [\"Quote received\", \"right\"],\n        [\"Open\", \"right\"],\n      ],\n      contractors.map((each) =>\n        row(\n          nameCell(each.contractor),\n          cell(String(each.referred)),\n          cell(String(each.quote_received)),\n          cell(String(each.referred + each.quote_received)),\n        ),\n      ),\n      \"No open referrals.\",\n      totalRow(\n        nameCell(\"Total\"),\n        ...totals(contractors, [\"referred\", \"quote_received\"]).map((sum) =>\n          cell(String(sum)),\n        ),\n        cell(\n          String(\n            contractors.reduce(\n              (sum, each) => sum + each.referred + each.quote_received,\n              0,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n};\n", "import z from \"zod\";\n\n/**\n * Shape of the payload `apps.operations.analytics.payload` hands the page, and\n * the pure aggregation over it.\n *\n * Dates are plain `YYYY-MM-DD` strings throughout and are compared as strings.\n * That is deliberate: these are calendar days in Europe/London decided by the\n * server, and turning them into `Date` objects in the browser reintroduces the\n * timezone question the server already answered.\n */\n\nconst buildPackSchema = z.object({\n  id: z.number(),\n  published: z.string(),\n  title: z.string(),\n  consultant: z.string(),\n  assessor: z.string(),\n  survey_date: z.string().nullable(),\n  measures: z.array(z.string()),\n  measures_cost: z.number(),\n});\n\nconst surveySchema = z.object({\n  completed: z.string(),\n  assessor: z.string(),\n});\n\nexport const payloadSchema = z.object({\n  today: z.string(),\n  windows: z.array(z.number()),\n  buildpacks: z.array(buildPackSchema),\n  surveys: z.array(surveySchema),\n  consultants: z.array(z.string()),\n  assessors: z.array(z.string()),\n  measure_labels: z.record(z.string(), z.string()),\n});\n\nexport type Payload = z.infer<typeof payloadSchema>;\nexport type BuildPack = z.infer<typeof buildPackSchema>;\nexport type Survey = z.infer<typeof surveySchema>;\n\nexport interface Selection {\n  weeks: number;\n  consultants: Set<string>;\n  assessors: Set<string>;\n}\n\nconst DAY_MS = 86_400_000;\n\n/** Shift an ISO date by whole days, staying in ISO. */\nexport function shiftDays(iso: string, days: number): string {\n  const parts = iso.split(\"-\");\n  const stamp = Date.UTC(\n    Number(parts[0]),\n    Number(parts[1]) - 1,\n    Number(parts[2]),\n  );\n  return new Date(stamp + days * DAY_MS).toISOString().slice(0, 10);\n}\n\n/** First day inside a rolling window of `weeks` ending at `today`. */\nexport function windowStart(today: string, weeks: number): string {\n  return shiftDays(today, -weeks * 7);\n}\n\n/** The Monday of the ISO week containing `iso`. */\nexport function weekStart(iso: string): string {\n  const parts = iso.split(\"-\");\n  const date = new Date(\n    Date.UTC(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])),\n  );\n  return shiftDays(iso, -((date.getUTCDay() + 6) % 7));\n}\n\n/** Mondays from the start of the window to the one containing `today`. */\nexport function weeksInWindow(today: string, weeks: number): string[] {\n  const last = weekStart(today);\n  const out: string[] = [];\n  let cursor = weekStart(windowStart(today, weeks));\n\n  while (cursor <= last) {\n    out.push(cursor);\n    cursor = shiftDays(cursor, 7);\n  }\n\n  return out;\n}\n\n/**\n * A filter set that is fully selected means \"no filter\" \u2014 so an assessor who\n * is not offered as a chip (a one-visit name from years ago) still counts.\n * Narrowing the selection then genuinely narrows it.\n */\nexport function passes(\n  selected: Set<string>,\n  all: string[],\n  value: string,\n): boolean {\n  return selected.size === all.length || selected.has(value);\n}\n\nexport function selectedBuildPacks(\n  payload: Payload,\n  selection: Selection,\n  weeks = selection.weeks,\n): BuildPack[] {\n  const from = windowStart(payload.today, weeks);\n\n  return payload.buildpacks.filter(\n    (pack) =>\n      pack.published >= from &&\n      pack.published <= payload.today &&\n      passes(selection.consultants, payload.consultants, pack.consultant) &&\n      passes(selection.assessors, payload.assessors, pack.assessor),\n  );\n}\n\nexport function selectedSurveys(\n  payload: Payload,\n  selection: Selection,\n  weeks = selection.weeks,\n): Survey[] {\n  const from = windowStart(payload.today, weeks);\n\n  return payload.surveys.filter(\n    (survey) =>\n      survey.completed >= from &&\n      survey.completed <= payload.today &&\n      passes(selection.assessors, payload.assessors, survey.assessor),\n  );\n}\n\nexport function countBy<T>(\n  rows: T[],\n  key: (row: T) => string,\n): Map<string, number> {\n  const counts = new Map<string, number>();\n\n  for (const row of rows) {\n    const name = key(row);\n    counts.set(name, (counts.get(name) ?? 0) + 1);\n  }\n\n  return counts;\n}\n\nexport interface WindowRow {\n  name: string;\n  counts: number[];\n  total: number;\n}\n\n/**\n * One row per person, one column per rolling window. Rows with nothing in any\n * window are dropped, and the widest window decides the order.\n */\nexport function windowRows(\n  windows: number[],\n  names: string[],\n  countFor: (name: string, weeks: number) => number,\n): WindowRow[] {\n  const widest = windows.length - 1;\n\n  return names\n    .map((name) => {\n      const counts = windows.map((weeks) => countFor(name, weeks));\n      return { name, counts, total: counts[widest] ?? 0 };\n    })\n    .filter((row) => row.counts.some((count) => count > 0))\n    .sort((a, b) => b.total - a.total || a.name.localeCompare(b.name));\n}\n\nexport interface MeasureRow {\n  kind: string;\n  label: string;\n  packs: number;\n  specified: number;\n  share: number;\n}\n\n/**\n * How often each measure appears. `packs` counts BuildPacks including it at\n * least once; `specified` counts every line item, which is higher when a pack\n * specifies the same measure for two elevations.\n */\nexport function measureRows(\n  packs: BuildPack[],\n  labels: Record<string, string>,\n): MeasureRow[] {\n  const inPacks = new Map<string, number>();\n  const specified = new Map<string, number>();\n\n  for (const pack of packs) {\n    for (const kind of new Set(pack.measures)) {\n      inPacks.set(kind, (inPacks.get(kind) ?? 0) + 1);\n    }\n\n    for (const kind of pack.measures) {\n      specified.set(kind, (specified.get(kind) ?? 0) + 1);\n    }\n  }\n\n  return [...inPacks.entries()]\n    .map(([kind, count]) => ({\n      kind,\n      label: labels[kind] ?? kind,\n      packs: count,\n      specified: specified.get(kind) ?? 0,\n      share: packs.length ? (count / packs.length) * 100 : 0,\n    }))\n    .sort((a, b) => b.packs - a.packs || a.label.localeCompare(b.label));\n}\n\n/** Whole days between the survey and the release, for packs that have both. */\nexport function releaseLags(packs: BuildPack[]): number[] {\n  return packs\n    .filter((pack) => pack.survey_date !== null)\n    .map((pack) =>\n      Math.round(\n        (Date.parse(`${pack.published}T00:00:00Z`) -\n          Date.parse(`${pack.survey_date}T00:00:00Z`)) /\n          DAY_MS,\n      ),\n    )\n    .sort((a, b) => a - b);\n}\n\nexport function median(values: number[]): number | null {\n  if (!values.length) {\n    return null;\n  }\n\n  return values[Math.floor(values.length / 2)] ?? null;\n}\n", "import type { AlpineComponent } from \"alpinejs\";\nimport * as echarts from \"echarts\";\n\nimport {\n  type BuildPack,\n  type MeasureRow,\n  type Payload,\n  type Selection,\n  type Survey,\n  type WindowRow,\n  measureRows,\n  median,\n  payloadSchema,\n  releaseLags,\n  selectedBuildPacks,\n  selectedSurveys,\n  weekStart,\n  weeksInWindow,\n  windowRows,\n} from \"./aggregate\";\nimport {\n  GRID,\n  INK,\n  MUTED,\n  OTHER,\n  SERIES,\n  SINGLE,\n  SURFACE,\n  cell,\n  emptyRow,\n  headerRow,\n  longDate,\n  money,\n  nameCell,\n  shortDate,\n  toggle,\n} from \"./dom\";\n\n/**\n * The delivery analytics page.\n *\n * The whole dataset arrives in `data-analytics`, so every control filters in\n * memory and each chart, stat and table re-renders from the same slice. That is\n * the point: the numbers on the page always agree with each other.\n */\n\nconst MEASURE_CHART_LIMIT = 14;\n\n/** A quarter: long enough to show a trend, short enough to be current. */\nconst DEFAULT_WEEKS = 12;\n\ninterface State extends Record<string | symbol, unknown> {\n  data: Payload;\n  weeks: number;\n  consultants: string[];\n  assessors: string[];\n  packCount: number;\n  packDelta: string;\n  surveyCount: number;\n  activeAssessors: number;\n  measuresPerPack: string;\n  measureSpread: string;\n  lagMedian: string;\n  lagSpread: string;\n  rangeLabel: string;\n  measureCaption: string;\n  firstPublished: string;\n  init(): void;\n  selection(): Selection;\n  renderStats(packs: BuildPack[], surveys: Survey[]): void;\n  renderWindowTable(\n    ref: string,\n    heading: string,\n    rows: WindowRow[],\n    colour: ((name: string) => string) | null,\n  ): void;\n  renderPackTable(selection: Selection): void;\n  renderSurveyTable(selection: Selection): void;\n  renderMeasures(packs: BuildPack[]): void;\n  renderDetail(packs: BuildPack[]): void;\n  renderWeeklyChart(packs: BuildPack[]): void;\n  renderSurveyChart(surveys: Survey[]): void;\n  renderMeasureChart(rows: MeasureRow[], packCount: number): void;\n  pickWeeks(weeks: number): void;\n  toggleConsultant(name: string): void;\n  toggleAssessor(name: string): void;\n  resetConsultants(): void;\n  resetAssessors(): void;\n  consultantOn(name: string): boolean;\n  assessorOn(name: string): boolean;\n  colourFor(name: string): string;\n  render(): void;\n}\n\nexport default (): AlpineComponent<State> => {\n  const charts: Record<string, echarts.ECharts | null> = {\n    weekly: null,\n    surveys: null,\n    measures: null,\n  };\n\n  return {\n    data: payloadSchema.parse({\n      today: \"1970-01-01\",\n      windows: [],\n      buildpacks: [],\n      surveys: [],\n      consultants: [],\n      assessors: [],\n      measure_labels: {},\n    }),\n    weeks: 12,\n    consultants: [],\n    assessors: [],\n    packCount: 0,\n    packDelta: \"\",\n    surveyCount: 0,\n    activeAssessors: 0,\n    measuresPerPack: \"\u2013\",\n    measureSpread: \"\",\n    lagMedian: \"\u2013\",\n    lagSpread: \"\",\n    rangeLabel: \"\",\n    measureCaption: \"\",\n    firstPublished: \"\",\n\n    init() {\n      if (!(this.$el instanceof HTMLElement)) {\n        return;\n      }\n\n      const raw = this.$el.dataset[\"analytics\"];\n\n      if (!raw) {\n        return;\n      }\n\n      const parsed = payloadSchema.safeParse(JSON.parse(raw));\n\n      if (!parsed.success) {\n        return;\n      }\n\n      this.data = parsed.data;\n      this.consultants = [...this.data.consultants];\n      this.assessors = [...this.data.assessors];\n\n      this.weeks = this.data.windows.includes(DEFAULT_WEEKS)\n        ? DEFAULT_WEEKS\n        : (this.data.windows[0] ?? DEFAULT_WEEKS);\n\n      const earliest = this.data.buildpacks\n        .map((pack) => pack.published)\n        .sort()[0];\n\n      this.firstPublished = earliest\n        ? `The first BuildPack was published on ${longDate(earliest)}, so the wider ` +\n          \"columns reach back before the product existed \u2014 they are not a slowdown.\"\n        : \"\";\n\n      for (const key of Object.keys(charts)) {\n        const host = this.$refs[key];\n\n        if (host instanceof HTMLElement) {\n          charts[key] = echarts.init(host);\n        }\n      }\n\n      window.addEventListener(\"resize\", () => {\n        for (const chart of Object.values(charts)) {\n          chart?.resize();\n        }\n      });\n\n      this.render();\n    },\n\n    selection(): Selection {\n      return {\n        weeks: this.weeks,\n        consultants: new Set(this.consultants),\n        assessors: new Set(this.assessors),\n      };\n    },\n\n    pickWeeks(weeks: number) {\n      this.weeks = weeks;\n      this.render();\n    },\n\n    toggleConsultant(name: string) {\n      this.consultants = toggle(this.consultants, this.data.consultants, name);\n      this.render();\n    },\n\n    toggleAssessor(name: string) {\n      this.assessors = toggle(this.assessors, this.data.assessors, name);\n      this.render();\n    },\n\n    resetConsultants() {\n      this.consultants = [...this.data.consultants];\n      this.render();\n    },\n\n    resetAssessors() {\n      this.assessors = [...this.data.assessors];\n      this.render();\n    },\n\n    consultantOn(name: string): boolean {\n      return this.consultants.includes(name);\n    },\n\n    assessorOn(name: string): boolean {\n      return this.assessors.includes(name);\n    },\n\n    colourFor(name: string): string {\n      const index = this.data.consultants.indexOf(name);\n      return index >= 0 ? (SERIES[index % SERIES.length] ?? OTHER) : OTHER;\n    },\n\n    render() {\n      const data = this.data;\n      const selection = this.selection();\n      const packs = selectedBuildPacks(data, selection);\n      const surveys = selectedSurveys(data, selection);\n\n      this.renderStats(packs, surveys);\n      this.renderPackTable(selection);\n      this.renderSurveyTable(selection);\n      this.renderMeasures(packs);\n      this.renderDetail(packs);\n      this.renderWeeklyChart(packs);\n      this.renderSurveyChart(surveys);\n    },\n\n    renderStats(packs: BuildPack[], surveys: Survey[]) {\n      const data = this.data;\n      const weeks = this.weeks;\n\n      this.packCount = packs.length;\n      this.surveyCount = surveys.length;\n      this.activeAssessors = new Set(surveys.map((row) => row.assessor)).size;\n\n      // The window immediately before this one, same length.\n      const previous =\n        selectedBuildPacks(data, this.selection(), weeks * 2).length -\n        packs.length;\n      const change = packs.length - previous;\n      this.packDelta =\n        `${change >= 0 ? \"+\" : \"\"}${change} vs the ${weeks} weeks before ` +\n        `(${previous})`;\n\n      const counts = packs.map((pack) => pack.measures.length);\n      const average = counts.length\n        ? counts.reduce((total, count) => total + count, 0) / counts.length\n        : 0;\n\n      this.measuresPerPack = counts.length ? average.toFixed(1) : \"\u2013\";\n      this.measureSpread = counts.length\n        ? `range ${Math.min(...counts)}\u2013${Math.max(...counts)}`\n        : \"no BuildPacks in selection\";\n\n      const lags = releaseLags(packs);\n      const middle = median(lags);\n\n      this.lagMedian = middle === null ? \"\u2013\" : `${middle}d`;\n      this.lagSpread = lags.length\n        ? `median \u00B7 range ${lags[0]}\u2013${lags.at(-1)}d`\n        : \"no BuildPacks in selection\";\n\n      this.rangeLabel = `${longDate(\n        weeksInWindow(data.today, weeks)[0] ?? data.today,\n      )} \u2013 ${longDate(data.today)}`;\n    },\n\n    renderWindowTable(\n      ref: string,\n      heading: string,\n      rows: WindowRow[],\n      colour: ((name: string) => string) | null,\n    ) {\n      const host = this.$refs[ref];\n\n      if (!(host instanceof HTMLElement)) {\n        return;\n      }\n\n      const windows = this.data.windows;\n      const selected = windows.indexOf(this.weeks);\n\n      host.textContent = \"\";\n      const head = document.createElement(\"thead\");\n      head.append(\n        headerRow(\n          heading,\n          windows.map((weeks) => `${weeks}w`),\n          selected,\n        ),\n      );\n\n      const body = document.createElement(\"tbody\");\n      body.className = \"divide-y\";\n\n      if (!rows.length) {\n        body.append(\n          emptyRow(windows.length + 1, \"Nothing matches this selection.\"),\n        );\n      }\n\n      for (const row of rows) {\n        const tr = document.createElement(\"tr\");\n        tr.className = \"hover:bg-blue-50\";\n        tr.append(nameCell(row.name, colour ? colour(row.name) : undefined));\n\n        row.counts.forEach((count, index) => {\n          const classes = [\n            count ? \"\" : \"text-gray-400\",\n            index === selected ? \"bg-blue-50\" : \"\",\n          ]\n            .filter(Boolean)\n            .join(\" \");\n          tr.append(cell(String(count), classes));\n        });\n\n        body.append(tr);\n      }\n\n      const foot = document.createElement(\"tfoot\");\n      const total = document.createElement(\"tr\");\n      total.className = \"border-t font-semibold\";\n      total.append(nameCell(\"Total\"));\n\n      windows.forEach((_weeks, index) => {\n        const sum = rows.reduce(\n          (running, row) => running + (row.counts[index] ?? 0),\n          0,\n        );\n        total.append(cell(String(sum), index === selected ? \"bg-blue-50\" : \"\"));\n      });\n\n      foot.append(total);\n      host.append(head, body, foot);\n    },\n\n    renderPackTable(selection: Selection) {\n      const data = this.data;\n\n      this.renderWindowTable(\n        \"packTable\",\n        \"Consultant\",\n        windowRows(\n          data.windows,\n          data.consultants,\n          (name, weeks) =>\n            selectedBuildPacks(data, selection, weeks).filter(\n              (pack) => pack.consultant === name,\n            ).length,\n        ),\n        (name) => this.colourFor(name),\n      );\n    },\n\n    renderSurveyTable(selection: Selection) {\n      const data = this.data;\n\n      this.renderWindowTable(\n        \"surveyTable\",\n        \"Assessor\",\n        windowRows(\n          data.windows,\n          data.assessors,\n          (name, weeks) =>\n            selectedSurveys(data, selection, weeks).filter(\n              (survey) => survey.assessor === name,\n            ).length,\n        ),\n        null,\n      );\n    },\n\n    renderMeasures(packs: BuildPack[]) {\n      const rows = measureRows(packs, this.data.measure_labels);\n\n      this.measureCaption = packs.length\n        ? `How often each measure appears across the ${packs.length} BuildPack${\n            packs.length === 1 ? \"\" : \"s\"\n          } in this selection. ${rows.length} distinct measures used.`\n        : \"No BuildPacks in this selection.\";\n\n      const host = this.$refs[\"measureTable\"];\n\n      if (host instanceof HTMLElement) {\n        host.textContent = \"\";\n        const head = document.createElement(\"thead\");\n        head.append(\n          headerRow(\"Measure\", [\"BuildPacks\", \"Share\", \"Specified\"], -1),\n        );\n\n        const body = document.createElement(\"tbody\");\n        body.className = \"divide-y\";\n\n        if (!rows.length) {\n          body.append(emptyRow(4, \"Nothing matches this selection.\"));\n        }\n\n        for (const row of rows) {\n          const tr = document.createElement(\"tr\");\n          tr.className = \"hover:bg-blue-50\";\n          tr.append(nameCell(row.label));\n          tr.append(cell(String(row.packs)));\n          tr.append(cell(`${Math.round(row.share)}%`));\n          tr.append(cell(String(row.specified)));\n          body.append(tr);\n        }\n\n        host.append(head, body);\n      }\n\n      this.renderMeasureChart(rows, packs.length);\n    },\n\n    renderDetail(packs: BuildPack[]) {\n      const host = this.$refs[\"detailTable\"];\n\n      if (!(host instanceof HTMLElement)) {\n        return;\n      }\n\n      host.textContent = \"\";\n      const head = document.createElement(\"thead\");\n      head.append(\n        headerRow(\n          \"Published\",\n          [\n            \"Property\",\n            \"Consultant\",\n            \"Retrofit assessor\",\n            \"Surveyed\",\n            \"Days\",\n            \"Measures\",\n            \"Measures cost\",\n          ],\n          -1,\n        ),\n      );\n\n      const body = document.createElement(\"tbody\");\n      body.className = \"divide-y\";\n\n      const ordered = [...packs].sort((a, b) =>\n        b.published.localeCompare(a.published),\n      );\n\n      if (!ordered.length) {\n        body.append(emptyRow(8, \"Nothing matches this selection.\"));\n      }\n\n      for (const pack of ordered) {\n        const tr = document.createElement(\"tr\");\n        tr.className = \"hover:bg-blue-50\";\n\n        tr.append(nameCell(shortDate(pack.published)));\n\n        const property = document.createElement(\"td\");\n        property.className =\n          \"max-w-xs overflow-hidden p-2 text-ellipsis text-left\";\n        property.textContent = pack.title;\n        property.title = pack.title;\n        tr.append(property);\n\n        tr.append(nameCell(pack.consultant, this.colourFor(pack.consultant)));\n        tr.append(nameCell(pack.assessor));\n        tr.append(cell(pack.survey_date ? shortDate(pack.survey_date) : \"\u2014\"));\n        tr.append(cell(String(releaseLags([pack])[0] ?? \"\u2014\")));\n        tr.append(cell(String(pack.measures.length)));\n        tr.append(cell(money(pack.measures_cost)));\n\n        body.append(tr);\n      }\n\n      host.append(head, body);\n    },\n\n    renderWeeklyChart(packs: BuildPack[]) {\n      const chart = charts[\"weekly\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const weeks = weeksInWindow(this.data.today, this.weeks);\n      const live = this.data.consultants.filter((name) =>\n        this.consultantOn(name),\n      );\n\n      const series = live.map((name) => ({\n        name,\n        type: \"bar\" as const,\n        stack: \"total\",\n        barMaxWidth: 24,\n        itemStyle: {\n          color: this.colourFor(name),\n          // A 2px gap in the surface colour is what separates touching\n          // segments; a border round each one would add ink that is not data.\n          borderColor: SURFACE,\n          borderWidth: 1,\n        },\n        data: weeks.map(\n          (monday) =>\n            packs.filter(\n              (pack) =>\n                pack.consultant === name &&\n                weekStart(pack.published) === monday,\n            ).length,\n        ),\n      }));\n\n      // The legend needs a band of its own at the foot of the chart, or it\n      // lands on top of the date labels.\n      const legend = live.length > 1;\n\n      chart.setOption(\n        {\n          grid: { left: 36, right: 12, top: 24, bottom: legend ? 64 : 28 },\n          tooltip: {\n            trigger: \"axis\",\n            axisPointer: { type: \"shadow\" },\n          },\n          legend: legend ? { bottom: 0, icon: \"roundRect\" } : undefined,\n          xAxis: {\n            type: \"category\",\n            data: weeks.map(shortDate),\n            axisLabel: { color: MUTED },\n            axisLine: { lineStyle: { color: GRID } },\n            axisTick: { show: false },\n          },\n          yAxis: {\n            type: \"value\",\n            minInterval: 1,\n            axisLabel: { color: MUTED },\n            splitLine: { lineStyle: { color: GRID } },\n          },\n          series,\n        },\n        { replaceMerge: [\"series\", \"legend\"] },\n      );\n    },\n\n    renderSurveyChart(surveys: Survey[]) {\n      const chart = charts[\"surveys\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const rows = this.data.assessors\n        .map((name) => ({\n          name,\n          count: surveys.filter((survey) => survey.assessor === name).length,\n        }))\n        .filter((row) => row.count > 0)\n        .sort((a, b) => a.count - b.count);\n\n      chart.setOption(\n        {\n          grid: { left: 8, right: 48, top: 8, bottom: 8, containLabel: true },\n          tooltip: { trigger: \"item\" },\n          xAxis: { type: \"value\", show: false },\n          yAxis: {\n            type: \"category\",\n            data: rows.map((row) => row.name),\n            axisLabel: { color: INK },\n            axisLine: { show: false },\n            axisTick: { show: false },\n          },\n          series: [\n            {\n              type: \"bar\",\n              barMaxWidth: 20,\n              itemStyle: { color: SINGLE, borderRadius: [0, 4, 4, 0] },\n              label: { show: true, position: \"right\", color: INK },\n              data: rows.map((row) => row.count),\n            },\n          ],\n        },\n        { replaceMerge: [\"series\"] },\n      );\n    },\n\n    renderMeasureChart(rows: MeasureRow[], packCount: number) {\n      const chart = charts[\"measures\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const top = rows.slice(0, MEASURE_CHART_LIMIT).reverse();\n\n      chart.setOption(\n        {\n          grid: { left: 8, right: 56, top: 8, bottom: 8, containLabel: true },\n          tooltip: {\n            trigger: \"item\",\n            formatter: (params: { dataIndex: number }) => {\n              const row = top[params.dataIndex];\n              return row\n                ? `${row.label}<br/>${row.packs} of ${packCount} BuildPacks \u00B7 ` +\n                    `specified ${row.specified}\u00D7`\n                : \"\";\n            },\n          },\n          xAxis: { type: \"value\", show: false },\n          yAxis: {\n            type: \"category\",\n            data: top.map((row) => row.label),\n            axisLabel: { color: INK },\n            axisLine: { show: false },\n            axisTick: { show: false },\n          },\n          series: [\n            {\n              type: \"bar\",\n              barMaxWidth: 20,\n              itemStyle: { color: SINGLE, borderRadius: [0, 4, 4, 0] },\n              label: {\n                show: true,\n                position: \"right\",\n                color: INK,\n                formatter: (params: { dataIndex: number }) =>\n                  `${Math.round(top[params.dataIndex]?.share ?? 0)}%`,\n              },\n              data: top.map((row) => row.packs),\n            },\n          ],\n        },\n        { replaceMerge: [\"series\"] },\n      );\n    },\n  };\n};\n", "import z from \"zod\";\n\nimport { shiftDays, weekStart, weeksInWindow, windowStart } from \"./aggregate\";\n\n/**\n * Shape of `apps.operations.pipeline_analytics.payload`, and the pure\n * aggregation over it. Dates are `YYYY-MM-DD` strings compared as strings, for\n * the reason given in `aggregate.ts`.\n */\n\nconst changeSchema = z.object({\n  stage: z.string(),\n  entered: z.string(),\n  backfilled: z.boolean(),\n});\n\nconst projectSchema = z.object({\n  id: z.number(),\n  url: z.string(),\n  address: z.string(),\n  postcode: z.string(),\n  customer: z.string(),\n  consultant: z.string(),\n  complex: z.boolean(),\n  survey_date: z.string().nullable(),\n  survey_age: z.number().nullable(),\n  stage: z.string(),\n  stage_entered: z.string().nullable(),\n  stage_age: z.number().nullable(),\n  stage_exact: z.boolean(),\n  history: z.array(changeSchema),\n  pre_bp_call: z.string().nullable(),\n  target: z.string().nullable(),\n  anticipated: z.string().nullable(),\n  scope_doc: z.boolean(),\n  spec_doc: z.boolean(),\n  draft_started: z.string().nullable(),\n  draft_idle: z.number().nullable(),\n  published: z.string().nullable(),\n  closed: z.string().nullable(),\n  measures: z.number(),\n  decisions_open: z.number(),\n  documents_required: z.number(),\n  flags: z.array(z.string()),\n});\n\nconst flagSchema = z.object({\n  key: z.string(),\n  label: z.string(),\n  severity: z.enum([\"critical\", \"serious\", \"warning\", \"info\"]),\n});\n\nexport const pipelineSchema = z.object({\n  today: z.string(),\n  windows: z.array(z.number()),\n  projects: z.array(projectSchema),\n  consultants: z.array(z.string()),\n  stages: z.array(z.object({ value: z.string(), label: z.string() })),\n  flags: z.array(flagSchema),\n  history_started: z.string().nullable(),\n});\n\nexport type Pipeline = z.infer<typeof pipelineSchema>;\nexport type Project = z.infer<typeof projectSchema>;\nexport type Flag = z.infer<typeof flagSchema>;\nexport type Severity = Flag[\"severity\"];\n\nconst DAY_MS = 86_400_000;\n\nexport const SEVERITIES: Severity[] = [\n  \"critical\",\n  \"serious\",\n  \"warning\",\n  \"info\",\n];\n\nexport function daysBetween(from: string, to: string): number {\n  return Math.round(\n    (Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / DAY_MS,\n  );\n}\n\n/** Nearest-rank percentile of an ascending list; `null` when empty. */\nexport function percentile(sorted: number[], q: number): number | null {\n  if (!sorted.length) {\n    return null;\n  }\n\n  const rank = Math.ceil((q / 100) * sorted.length);\n  return sorted[Math.min(sorted.length, Math.max(rank, 1)) - 1] ?? null;\n}\n\nexport function ascending(values: number[]): number[] {\n  return [...values].sort((a, b) => a - b);\n}\n\nexport function selectedProjects(\n  data: Pipeline,\n  consultants: Set<string>,\n): Project[] {\n  if (consultants.size === data.consultants.length) {\n    return data.projects;\n  }\n\n  return data.projects.filter((row) => consultants.has(row.consultant));\n}\n\nexport function isOpen(row: Project): boolean {\n  return row.published === null && row.closed === null;\n}\n\n/** Past the survey date and the tracker has moved on from Awaiting Survey. */\nfunction surveyed(row: Project, today: string): boolean {\n  return (\n    row.survey_date !== null &&\n    row.survey_date <= today &&\n    row.stage !== \"AWAITING_SURVEY\"\n  );\n}\n\nexport function inProduction(row: Project, today: string): boolean {\n  return isOpen(row) && surveyed(row, today);\n}\n\nexport function awaitingSurvey(row: Project, today: string): boolean {\n  return isOpen(row) && !surveyed(row, today);\n}\n\nexport function releasedWithin(\n  rows: Project[],\n  today: string,\n  weeks: number,\n): Project[] {\n  const from = windowStart(today, weeks);\n\n  return rows.filter(\n    (row) =>\n      row.published !== null && row.published >= from && row.published <= today,\n  );\n}\n\n/** Survey \u2192 release in days, for released rows that were surveyed. */\nexport function cycleTimes(rows: Project[]): number[] {\n  return ascending(\n    rows\n      .filter((row) => row.published !== null && row.survey_date !== null)\n      .map((row) => daysBetween(row.survey_date ?? \"\", row.published ?? \"\")),\n  );\n}\n\n/** When the pack is now expected out: the anticipated date, else the target. */\nexport function dueDate(row: Project): string | null {\n  return row.anticipated ?? row.target;\n}\n\nexport const AGE_BUCKETS = [\n  { label: \"Up to a week\", max: 7 },\n  { label: \"1\u20132 weeks\", max: 14 },\n  { label: \"2\u20134 weeks\", max: 28 },\n  { label: \"Over 4 weeks\", max: Number.POSITIVE_INFINITY },\n];\n\nexport function ageBucket(days: number): number {\n  return AGE_BUCKETS.findIndex((bucket) => days <= bucket.max);\n}\n\nexport interface StageRow {\n  stage: string;\n  label: string;\n  counts: number[];\n  total: number;\n}\n\n/** Open packs per tracker stage, split by days in that stage. */\nexport function stageRows(data: Pipeline, rows: Project[]): StageRow[] {\n  return data.stages\n    .map(({ value, label }) => {\n      const counts = AGE_BUCKETS.map(() => 0);\n\n      for (const row of rows) {\n        if (row.stage === value) {\n          const index = ageBucket(row.stage_age ?? 0);\n          counts[index] = (counts[index] ?? 0) + 1;\n        }\n      }\n\n      return {\n        stage: value,\n        label,\n        counts,\n        total: counts.reduce((sum, count) => sum + count, 0),\n      };\n    })\n    .filter((row) => row.total > 0);\n}\n\nexport interface ForwardWeek {\n  monday: string;\n  rows: Project[];\n}\n\nexport interface Forward {\n  overdue: Project[];\n  weeks: ForwardWeek[];\n  later: Project[];\n  undated: Project[];\n}\n\n/** Open packs bucketed by the week they are due, from this week on. */\nexport function forward(\n  rows: Project[],\n  today: string,\n  weeks: number,\n): Forward {\n  const first = weekStart(today);\n  const mondays = Array.from({ length: weeks }, (_, index) =>\n    shiftDays(first, index * 7),\n  );\n  const end = shiftDays(first, weeks * 7);\n\n  const out: Forward = {\n    overdue: [],\n    weeks: mondays.map((monday) => ({ monday, rows: [] })),\n    later: [],\n    undated: [],\n  };\n\n  for (const row of rows) {\n    const due = dueDate(row);\n\n    if (due === null) {\n      out.undated.push(row);\n    } else if (due < today) {\n      out.overdue.push(row);\n    } else if (due >= end) {\n      out.later.push(row);\n    } else {\n      out.weeks[daysBetween(first, weekStart(due)) / 7]?.rows.push(row);\n    }\n  }\n\n  return out;\n}\n\n/** Surveys booked after today, per week, for the next `weeks` weeks. */\nexport function incoming(\n  rows: Project[],\n  today: string,\n  weeks: number,\n): { monday: string; count: number }[] {\n  const first = weekStart(today);\n\n  return Array.from({ length: weeks }, (_, index) => {\n    const monday = shiftDays(first, index * 7);\n    const sunday = shiftDays(monday, 6);\n\n    return {\n      monday,\n      count: rows.filter(\n        (row) =>\n          row.closed === null &&\n          row.survey_date !== null &&\n          row.survey_date > today &&\n          row.survey_date >= monday &&\n          row.survey_date <= sunday,\n      ).length,\n    };\n  });\n}\n\nexport interface FlowWeek {\n  monday: string;\n  surveyed: number;\n  released: number;\n  wip: number;\n}\n\n/**\n * Per week in the window: surveys done, packs released, and how many were\n * surveyed but not released (or closed) at the week's end \u2014 today, for the\n * current week.\n */\nexport function flow(\n  rows: Project[],\n  today: string,\n  weeks: number,\n): FlowWeek[] {\n  return weeksInWindow(today, weeks).map((monday) => {\n    const sunday = shiftDays(monday, 6);\n    const end = sunday < today ? sunday : today;\n    const inWeek = (day: string | null) =>\n      day !== null && day >= monday && day <= end;\n\n    return {\n      monday,\n      surveyed: rows.filter((row) => inWeek(row.survey_date)).length,\n      released: rows.filter((row) => inWeek(row.published)).length,\n      wip: rows.filter(\n        (row) =>\n          row.survey_date !== null &&\n          row.survey_date <= end &&\n          (row.published === null || row.published > end) &&\n          (row.closed === null || row.closed > end),\n      ).length,\n    };\n  });\n}\n\nexport interface Milestone {\n  key: string;\n  label: string;\n  days: number[];\n}\n\n/** Days from the survey to each milestone, over released rows. */\nexport function milestones(released: Project[]): Milestone[] {\n  const offsets = (pick: (row: Project) => string | null) =>\n    ascending(\n      released.flatMap((row) => {\n        const day = pick(row);\n        return row.survey_date !== null && day !== null\n          ? [daysBetween(row.survey_date, day)]\n          : [];\n      }),\n    );\n\n  return [\n    {\n      key: \"call\",\n      label: \"BP call\",\n      days: offsets((row) => row.pre_bp_call),\n    },\n    {\n      key: \"draft\",\n      label: \"Draft started\",\n      days: offsets((row) => row.draft_started),\n    },\n    {\n      key: \"release\",\n      label: \"Released\",\n      days: offsets((row) => row.published),\n    },\n  ];\n}\n\nexport interface Dwell {\n  stage: string;\n  label: string;\n  /** Finished spells in the stage, left inside the window. */\n  finished: number[];\n  /** Days so far for packs in the stage now. */\n  current: number[];\n}\n\n/**\n * Time spent in each tracker stage, from the recorded history. A spell that\n * starts at a backfilled row only has a lower bound on its start, so finished\n * spells count only when they began after history started.\n */\nexport function dwell(data: Pipeline, rows: Project[], from: string): Dwell[] {\n  const byStage = new Map(\n    data.stages.map(({ value, label }) => [\n      value,\n      {\n        stage: value,\n        label,\n        finished: [] as number[],\n        current: [] as number[],\n      },\n    ]),\n  );\n\n  for (const row of rows) {\n    row.history.forEach((change, index) => {\n      const next = row.history[index + 1];\n      const entry = byStage.get(change.stage);\n\n      if (!entry) {\n        return;\n      }\n\n      if (next) {\n        if (!change.backfilled && next.entered > from) {\n          entry.finished.push(daysBetween(change.entered, next.entered));\n        }\n      } else if (isOpen(row)) {\n        entry.current.push(\n          Math.max(0, daysBetween(change.entered, data.today)),\n        );\n      }\n    });\n  }\n\n  return [...byStage.values()]\n    .map((entry) => ({\n      ...entry,\n      finished: ascending(entry.finished),\n      current: ascending(entry.current),\n    }))\n    .filter((entry) => entry.finished.length || entry.current.length);\n}\n\nexport function revisionsSince(rows: Project[], from: string): number {\n  return rows.reduce(\n    (count, row) =>\n      count +\n      row.history.filter(\n        (change) =>\n          change.stage === \"REVISING\" &&\n          !change.backfilled &&\n          change.entered > from,\n      ).length,\n    0,\n  );\n}\n\n/** Index into `SEVERITIES` of the worst flag, or its length when unflagged. */\nexport function worstSeverity(row: Project, flags: Flag[]): number {\n  const ranks = row.flags.map((key) => {\n    const flag = flags.find((candidate) => candidate.key === key);\n    return flag ? SEVERITIES.indexOf(flag.severity) : SEVERITIES.length;\n  });\n\n  return Math.min(SEVERITIES.length, ...ranks);\n}\n\n/** Most urgent first: worst flag, then the longest since survey. */\nexport function byUrgency(rows: Project[], flags: Flag[]): Project[] {\n  return [...rows].sort(\n    (a, b) =>\n      worstSeverity(a, flags) - worstSeverity(b, flags) ||\n      (b.survey_age ?? -1) - (a.survey_age ?? -1) ||\n      a.id - b.id,\n  );\n}\n\n/** Packs needing someone: any flag worse than informational. */\nexport function needsAttention(row: Project, flags: Flag[]): boolean {\n  return worstSeverity(row, flags) < SEVERITIES.indexOf(\"info\");\n}\n\nexport function flagCounts(\n  rows: Project[],\n  flags: Flag[],\n): Map<string, number> {\n  const counts = new Map(flags.map((flag) => [flag.key, 0]));\n\n  for (const row of rows) {\n    for (const key of row.flags) {\n      counts.set(key, (counts.get(key) ?? 0) + 1);\n    }\n  }\n\n  return counts;\n}\n\nexport interface ConsultantRow {\n  name: string;\n  awaiting: number;\n  production: number;\n  complex: number;\n  attention: number;\n  ageMedian: number | null;\n  dueSoon: number;\n  released: number;\n  cycleMedian: number | null;\n  onTime: number;\n  withTarget: number;\n}\n\nexport function consultantRows(\n  data: Pipeline,\n  rows: Project[],\n  weeks: number,\n): ConsultantRow[] {\n  const today = data.today;\n  const horizon = shiftDays(today, 28);\n\n  return data.consultants\n    .map((name) => {\n      const mine = rows.filter((row) => row.consultant === name);\n      const production = mine.filter((row) => inProduction(row, today));\n      const released = releasedWithin(mine, today, weeks);\n      const targeted = released.filter((row) => row.target !== null);\n\n      return {\n        name,\n        awaiting: mine.filter((row) => awaitingSurvey(row, today)).length,\n        production: production.length,\n        complex: production.filter((row) => row.complex).length,\n        attention: production.filter((row) => needsAttention(row, data.flags))\n          .length,\n        ageMedian: percentile(\n          ascending(production.map((row) => row.survey_age ?? 0)),\n          50,\n        ),\n        dueSoon: mine.filter((row) => {\n          const due = dueDate(row);\n          return isOpen(row) && due !== null && due <= horizon;\n        }).length,\n        released: released.length,\n        cycleMedian: percentile(cycleTimes(released), 50),\n        onTime: targeted.filter(\n          (row) => (row.published ?? \"\") <= (row.target ?? \"\"),\n        ).length,\n        withTarget: targeted.length,\n      };\n    })\n    .filter((row) => row.awaiting || row.production || row.released)\n    .sort(\n      (a, b) =>\n        b.production - a.production ||\n        b.released - a.released ||\n        a.name.localeCompare(b.name),\n    );\n}\n", "import type { AlpineComponent } from \"alpinejs\";\nimport * as echarts from \"echarts\";\n\nimport { shiftDays, windowStart } from \"./aggregate\";\nimport {\n  GRID,\n  INK,\n  MUTED,\n  OTHER,\n  SERIES,\n  SINGLE,\n  SURFACE,\n  cell,\n  emptyRow,\n  headRow,\n  headerRow,\n  longDate,\n  nameCell,\n  shortDate,\n  toggle,\n} from \"./dom\";\nimport {\n  AGE_BUCKETS,\n  type Pipeline,\n  type Project,\n  type Severity,\n  ascending,\n  awaitingSurvey,\n  byUrgency,\n  consultantRows,\n  cycleTimes,\n  dueDate,\n  dwell,\n  flagCounts,\n  flow,\n  forward,\n  inProduction,\n  incoming,\n  isOpen,\n  milestones,\n  needsAttention,\n  percentile,\n  pipelineSchema,\n  releasedWithin,\n  revisionsSince,\n  SEVERITIES,\n  selectedProjects,\n  stageRows,\n} from \"./pipeline-aggregate\";\n\n/**\n * The pipeline analytics page: BuildPacks between the survey and release.\n *\n * Like the delivery page, the rows arrive in `data-analytics` and every chart\n * and table renders from the same filtered slice.\n */\n\n/** Ordinal blue ramp for time-in-stage, lightest step still clear of the surface. */\nconst AGE_RAMP = [\"#86b6ef\", \"#3987e5\", \"#1c5cab\", \"#0d366b\"];\n\n/** Status colours, reserved for flags and always shown beside their label. */\nconst STATUS: Record<Severity, string> = {\n  critical: \"#d03b3b\",\n  serious: \"#ec835a\",\n  warning: \"#fab219\",\n  info: \"#c4c3bd\",\n};\n\nconst FORWARD_WEEKS = 8;\nconst DEFAULT_WEEKS = 12;\n\nfunction days(value: number | null): string {\n  return value === null ? \"\u2013\" : `${value}d`;\n}\n\nfunction plural(count: number, one: string, many = `${one}s`): string {\n  return `${count} ${count === 1 ? one : many}`;\n}\n\nfunction linkCell(row: Project): HTMLTableCellElement {\n  const td = document.createElement(\"td\");\n  td.className = \"min-w-40 p-2 text-left\";\n\n  const link = document.createElement(\"a\");\n  link.href = row.url;\n  link.className = \"font-medium text-blue-700 hover:underline\";\n  link.textContent = row.address;\n\n  const sub = document.createElement(\"div\");\n  sub.className = \"text-gray-500 text-xs\";\n  sub.textContent = [row.postcode, row.customer].filter(Boolean).join(\" \u00B7 \");\n\n  td.append(link, sub);\n  return td;\n}\n\nfunction ago(days: number | null): string {\n  if (days === null) {\n    return \"\";\n  }\n  return days === 0 ? \"today\" : `${days}d ago`;\n}\n\nfunction stackedCell(\n  top: string,\n  bottom: string,\n  align: \"left\" | \"right\" = \"right\",\n): HTMLTableCellElement {\n  const td = document.createElement(\"td\");\n  td.className = `p-2 tabular-nums whitespace-nowrap text-${align}`;\n\n  const first = document.createElement(\"div\");\n  first.textContent = top;\n\n  const second = document.createElement(\"div\");\n  second.className = \"text-gray-500 text-xs\";\n  second.textContent = bottom;\n\n  td.append(first, second);\n  return td;\n}\n\nfunction badge(label: string, severity: Severity): HTMLElement {\n  const pill = document.createElement(\"span\");\n  pill.className =\n    \"border border-gray-200 flex gap-1.5 items-center px-2 py-0.5 rounded-full text-gray-800 text-xs whitespace-nowrap\";\n\n  const dot = document.createElement(\"span\");\n  dot.className = \"h-2 rounded-full shrink-0 w-2\";\n  dot.style.backgroundColor = STATUS[severity];\n\n  const text = document.createElement(\"span\");\n  text.textContent = label;\n\n  pill.append(dot, text);\n  return pill;\n}\n\nfunction axis(labels: string[]) {\n  return {\n    type: \"category\" as const,\n    data: labels,\n    axisLabel: { color: MUTED },\n    axisLine: { lineStyle: { color: GRID } },\n    axisTick: { show: false },\n  };\n}\n\nfunction valueAxis(name = \"\") {\n  return {\n    type: \"value\" as const,\n    minInterval: 1,\n    name,\n    nameTextStyle: { color: MUTED },\n    axisLabel: { color: MUTED },\n    splitLine: { lineStyle: { color: GRID } },\n  };\n}\n\nfunction empty(chart: echarts.ECharts, message: string) {\n  chart.setOption(\n    {\n      title: {\n        text: message,\n        left: \"center\",\n        top: \"middle\",\n        textStyle: { color: MUTED, fontSize: 13, fontWeight: \"normal\" },\n      },\n      xAxis: { show: false },\n      yAxis: { show: false },\n      series: [],\n    },\n    { notMerge: true },\n  );\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  data: Pipeline;\n  weeks: number;\n  consultants: string[];\n  flag: string;\n  rangeLabel: string;\n  inProduction: string;\n  inProductionFoot: string;\n  ageMedian: string;\n  ageFoot: string;\n  attention: string;\n  attentionFoot: string;\n  dueSoon: string;\n  dueSoonFoot: string;\n  released: string;\n  releasedFoot: string;\n  cycleMedian: string;\n  cycleFoot: string;\n  onTime: string;\n  onTimeFoot: string;\n  revisions: string;\n  revisionsFoot: string;\n  stageNote: string;\n  forwardNote: string;\n  incomingNote: string;\n  dwellNote: string;\n  init(): void;\n  render(): void;\n  pickWeeks(weeks: number): void;\n  toggleConsultant(name: string): void;\n  resetConsultants(): void;\n  consultantOn(name: string): boolean;\n  colourFor(name: string): string;\n  pickFlag(key: string): void;\n  rows(): Project[];\n  renderStats(rows: Project[]): void;\n  renderAttention(rows: Project[]): void;\n  renderStages(rows: Project[]): void;\n  renderAgeing(rows: Project[], cycle: number[]): void;\n  renderForward(rows: Project[], rate: number): void;\n  renderIncoming(rows: Project[]): void;\n  renderFlow(rows: Project[]): void;\n  renderMilestones(released: Project[]): void;\n  renderDwell(rows: Project[]): void;\n  renderConsultants(rows: Project[]): void;\n}\n\nexport default (): AlpineComponent<State> => {\n  const charts: Record<string, echarts.ECharts | null> = {\n    stages: null,\n    ageing: null,\n    forward: null,\n    incoming: null,\n    flow: null,\n    wip: null,\n    milestones: null,\n  };\n\n  return {\n    data: pipelineSchema.parse({\n      today: \"1970-01-01\",\n      windows: [],\n      projects: [],\n      consultants: [],\n      stages: [],\n      flags: [],\n      history_started: null,\n    }),\n    weeks: DEFAULT_WEEKS,\n    consultants: [],\n    flag: \"\",\n    rangeLabel: \"\",\n    inProduction: \"\u2013\",\n    inProductionFoot: \"\",\n    ageMedian: \"\u2013\",\n    ageFoot: \"\",\n    attention: \"\u2013\",\n    attentionFoot: \"\",\n    dueSoon: \"\u2013\",\n    dueSoonFoot: \"\",\n    released: \"\u2013\",\n    releasedFoot: \"\",\n    cycleMedian: \"\u2013\",\n    cycleFoot: \"\",\n    onTime: \"\u2013\",\n    onTimeFoot: \"\",\n    revisions: \"\u2013\",\n    revisionsFoot: \"\",\n    stageNote: \"\",\n    forwardNote: \"\",\n    incomingNote: \"\",\n    dwellNote: \"\",\n\n    init() {\n      if (!(this.$el instanceof HTMLElement)) {\n        return;\n      }\n\n      const raw = this.$el.dataset[\"analytics\"];\n\n      if (!raw) {\n        return;\n      }\n\n      const parsed = pipelineSchema.safeParse(JSON.parse(raw));\n\n      if (!parsed.success) {\n        return;\n      }\n\n      this.data = parsed.data;\n      this.consultants = [...this.data.consultants];\n      this.weeks = this.data.windows.includes(DEFAULT_WEEKS)\n        ? DEFAULT_WEEKS\n        : (this.data.windows[0] ?? DEFAULT_WEEKS);\n\n      for (const key of Object.keys(charts)) {\n        const host = this.$refs[key];\n\n        if (host instanceof HTMLElement) {\n          charts[key] = echarts.init(host);\n        }\n      }\n\n      window.addEventListener(\"resize\", () => {\n        for (const chart of Object.values(charts)) {\n          chart?.resize();\n        }\n      });\n\n      this.render();\n    },\n\n    rows(): Project[] {\n      return selectedProjects(this.data, new Set(this.consultants));\n    },\n\n    pickWeeks(weeks: number) {\n      this.weeks = weeks;\n      this.render();\n    },\n\n    toggleConsultant(name: string) {\n      this.consultants = toggle(this.consultants, this.data.consultants, name);\n      this.render();\n    },\n\n    resetConsultants() {\n      this.consultants = [...this.data.consultants];\n      this.render();\n    },\n\n    consultantOn(name: string): boolean {\n      return this.consultants.includes(name);\n    },\n\n    colourFor(name: string): string {\n      const index = this.data.consultants.indexOf(name);\n      return index >= 0 ? (SERIES[index % SERIES.length] ?? OTHER) : OTHER;\n    },\n\n    pickFlag(key: string) {\n      this.flag = this.flag === key ? \"\" : key;\n      this.renderAttention(this.rows());\n    },\n\n    render() {\n      const rows = this.rows();\n      const today = this.data.today;\n      const released = releasedWithin(rows, today, this.weeks);\n      const rate = released.length / this.weeks;\n\n      this.rangeLabel =\n        `Released work counts from ${longDate(windowStart(today, this.weeks))} ` +\n        `to ${longDate(today)}. Everything else is as of today.`;\n\n      this.renderStats(rows);\n      this.renderAttention(rows);\n      this.renderStages(rows);\n      this.renderAgeing(rows, cycleTimes(released));\n      this.renderForward(rows, rate);\n      this.renderIncoming(rows);\n      this.renderFlow(rows);\n      this.renderMilestones(released);\n      this.renderDwell(rows);\n      this.renderConsultants(rows);\n    },\n\n    renderStats(rows: Project[]) {\n      const data = this.data;\n      const today = data.today;\n      const weeks = this.weeks;\n      const production = rows.filter((row) => inProduction(row, today));\n      const awaiting = rows.filter((row) => awaitingSurvey(row, today));\n      // Awaiting now includes past visits the tracker hasn't caught up with.\n      const booked = awaiting.filter(\n        (row) =>\n          row.survey_date !== null &&\n          row.survey_date > today &&\n          row.survey_date <= shiftDays(today, 14),\n      ).length;\n\n      this.inProduction = String(production.length);\n      this.inProductionFoot =\n        `${awaiting.length} awaiting survey \u00B7 ` +\n        `${plural(booked, \"survey\")} booked in the next 2 weeks`;\n\n      const released = releasedWithin(rows, today, weeks);\n      const cycle = cycleTimes(released);\n      const p85 = percentile(cycle, 85);\n      const ages = ascending(production.map((row) => row.survey_age ?? 0));\n\n      this.ageMedian = days(percentile(ages, 50));\n      this.ageFoot = ages.length\n        ? `oldest ${ages.at(-1)}d \u00B7 ` +\n          (p85 === null\n            ? \"no releases in the window to compare\"\n            : `${ages.filter((age) => age > p85).length} older than 85% of ` +\n              `releases (${p85}d)`)\n        : \"nothing in production\";\n\n      const open = rows.filter(isOpen);\n      const attention = production.filter((row) =>\n        needsAttention(row, data.flags),\n      );\n      const counts = flagCounts(production, data.flags);\n\n      this.attention = String(attention.length);\n      this.attentionFoot =\n        data.flags\n          .filter((flag) => flag.severity !== \"info\" && counts.get(flag.key))\n          .sort(\n            (a, b) =>\n              SEVERITIES.indexOf(a.severity) - SEVERITIES.indexOf(b.severity) ||\n              (counts.get(b.key) ?? 0) - (counts.get(a.key) ?? 0),\n          )\n          .slice(0, 3)\n          .map((flag) => `${flag.label} ${counts.get(flag.key)}`)\n          .join(\" \u00B7 \") || \"nothing flagged\";\n\n      const horizon = shiftDays(today, 28);\n      const due = open.filter((row) => {\n        const day = dueDate(row);\n        return day !== null && day >= today && day <= horizon;\n      });\n      const overdue = open.filter((row) => {\n        const day = dueDate(row);\n        return day !== null && day < today;\n      });\n      const rate = (released.length / weeks) * 4;\n\n      this.dueSoon = String(due.length);\n      this.dueSoonFoot =\n        `${overdue.length} already overdue \u00B7 ` +\n        `~${rate.toFixed(rate < 10 ? 1 : 0)} released per 4 weeks lately`;\n\n      const before =\n        releasedWithin(rows, today, weeks * 2).length - released.length;\n      const change = released.length - before;\n\n      this.released = String(released.length);\n      this.releasedFoot =\n        `${change >= 0 ? \"+\" : \"\"}${change} vs the ${weeks} weeks before ` +\n        `(${before})`;\n\n      this.cycleMedian = days(percentile(cycle, 50));\n      this.cycleFoot = cycle.length\n        ? `median \u00B7 85% within ${p85}d \u00B7 ${plural(cycle.length, \"pack\")}`\n        : \"no surveyed packs released in the window\";\n\n      const targeted = released.filter((row) => row.target !== null);\n      const onTime = targeted.filter(\n        (row) => (row.published ?? \"\") <= (row.target ?? \"\"),\n      ).length;\n\n      this.onTime = targeted.length\n        ? `${Math.round((onTime / targeted.length) * 100)}%`\n        : \"\u2013\";\n      this.onTimeFoot = targeted.length\n        ? `${onTime} of ${targeted.length} with a target \u00B7 ` +\n          `${released.length - targeted.length} had none`\n        : \"no released pack had a target date\";\n\n      const from = windowStart(today, weeks);\n      const revising = rows.filter(\n        (row) => row.closed === null && row.stage === \"REVISING\",\n      ).length;\n      const recording = data.history_started;\n\n      this.revisions = String(revisionsSince(rows, from));\n      this.revisionsFoot =\n        `${revising} revising now \u00B7 ` +\n        (recording && recording > from\n          ? `recorded since ${longDate(recording)}`\n          : \"entries into Revising\");\n    },\n\n    renderAttention(rows: Project[]) {\n      const data = this.data;\n      const today = data.today;\n      const flags = new Map(data.flags.map((flag) => [flag.key, flag]));\n      const stages = new Map(\n        data.stages.map((stage) => [stage.value, stage.label]),\n      );\n      const production = rows.filter((row) => inProduction(row, today));\n      const counts = flagCounts(production, data.flags);\n\n      const chips = this.$refs[\"flagChips\"];\n\n      if (chips instanceof HTMLElement) {\n        chips.textContent = \"\";\n\n        for (const flag of data.flags) {\n          const count = counts.get(flag.key) ?? 0;\n\n          if (!count) {\n            continue;\n          }\n\n          const button = document.createElement(\"button\");\n          button.type = \"button\";\n          button.setAttribute(\"aria-pressed\", String(this.flag === flag.key));\n          button.className = `flex gap-2 items-center px-3 py-1 rounded-full border text-sm ${\n            this.flag === flag.key\n              ? \"bg-blue-50 border-blue-600\"\n              : \"bg-white border-gray-300 hover:bg-gray-50\"\n          }`;\n\n          const dot = document.createElement(\"span\");\n          dot.className = \"h-2 rounded-full shrink-0 w-2\";\n          dot.style.backgroundColor = STATUS[flag.severity];\n\n          const label = document.createElement(\"span\");\n          label.textContent = `${flag.label} \u00B7 ${count}`;\n\n          button.append(dot, label);\n          button.addEventListener(\"click\", () => this.pickFlag(flag.key));\n          chips.append(button);\n        }\n      }\n\n      const host = this.$refs[\"attentionTable\"];\n\n      if (!(host instanceof HTMLElement)) {\n        return;\n      }\n\n      const shown = byUrgency(\n        production.filter((row) => !this.flag || row.flags.includes(this.flag)),\n        data.flags,\n      );\n\n      host.textContent = \"\";\n      const head = document.createElement(\"thead\");\n      head.append(\n        headRow([\n          [\"Property\", \"left\"],\n          [\"Consultant\", \"left\"],\n          [\"Stage\", \"left\"],\n          [\"Surveyed\", \"right\"],\n          [\"BP call\", \"right\"],\n          [\"Draft\", \"left\"],\n          [\"Due\", \"right\"],\n          [\"Open items\", \"left\"],\n          [\"Flags\", \"right\"],\n        ]),\n      );\n\n      const body = document.createElement(\"tbody\");\n      body.className = \"divide-y\";\n\n      if (!shown.length) {\n        body.append(emptyRow(9, \"Nothing matches this selection.\"));\n      }\n\n      const none = () => cell(\"\u2014\", \"text-gray-400\");\n\n      for (const row of shown) {\n        const tr = document.createElement(\"tr\");\n        tr.className = \"align-top hover:bg-blue-50\";\n\n        tr.append(linkCell(row));\n\n        const who = nameCell(row.consultant, this.colourFor(row.consultant));\n        who.classList.add(\"whitespace-nowrap\");\n        tr.append(who);\n\n        const inStage =\n          row.stage_age === null\n            ? \"\"\n            : `${row.stage_exact ? \"\" : \"\u2265 \"}${row.stage_age}d in stage`;\n        tr.append(\n          stackedCell(stages.get(row.stage) ?? row.stage, inStage, \"left\"),\n        );\n\n        tr.append(\n          row.survey_date\n            ? stackedCell(shortDate(row.survey_date), ago(row.survey_age))\n            : none(),\n        );\n\n        tr.append(\n          row.pre_bp_call\n            ? cell(shortDate(row.pre_bp_call), \"whitespace-nowrap\")\n            : none(),\n        );\n\n        tr.append(\n          row.draft_started\n            ? stackedCell(\n                `started ${shortDate(row.draft_started)}`,\n                `${plural(row.measures, \"measure\")} \u00B7 touched ${ago(row.draft_idle)}`,\n                \"left\",\n              )\n            : none(),\n        );\n\n        const due = dueDate(row);\n        tr.append(\n          due\n            ? stackedCell(\n                shortDate(due),\n                row.anticipated && row.target && row.anticipated !== row.target\n                  ? `target ${shortDate(row.target)}`\n                  : row.anticipated\n                    ? \"anticipated\"\n                    : \"target\",\n              )\n            : none(),\n        );\n\n        const items = [\n          row.decisions_open ? plural(row.decisions_open, \"open decision\") : \"\",\n          row.documents_required\n            ? `${plural(row.documents_required, \"doc\")} needed`\n            : \"\",\n          row.scope_doc ? \"\" : \"no scope\",\n          row.spec_doc ? \"\" : \"no spec\",\n        ].filter(Boolean);\n        const itemsCell = cell(\n          items.join(\" \u00B7 \") || \"\u2014\",\n          items.length ? \"!text-left min-w-32\" : \"!text-left text-gray-400\",\n        );\n        tr.append(itemsCell);\n\n        const flagCell = document.createElement(\"td\");\n        flagCell.className = \"min-w-48 p-2\";\n        const wrap = document.createElement(\"div\");\n        wrap.className = \"flex flex-wrap gap-1 justify-end\";\n\n        for (const key of row.flags) {\n          const flag = flags.get(key);\n\n          if (flag) {\n            wrap.append(badge(flag.label, flag.severity));\n          }\n        }\n\n        flagCell.append(wrap);\n        tr.append(flagCell);\n        body.append(tr);\n      }\n\n      host.append(head, body);\n    },\n\n    renderStages(rows: Project[]) {\n      const chart = charts[\"stages\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const open = rows.filter(isOpen);\n      const stages = stageRows(this.data, open).reverse();\n      const inexact = open.filter((row) => !row.stage_exact).length;\n\n      this.stageNote = inexact\n        ? `${plural(inexact, \"pack\")} entered their stage before history was ` +\n          \"recorded, so their time in stage is a minimum.\"\n        : \"\";\n\n      if (!stages.length) {\n        empty(chart, \"Nothing open in this selection.\");\n        return;\n      }\n\n      chart.setOption(\n        {\n          title: { show: false },\n          grid: { left: 8, right: 24, top: 8, bottom: 48, containLabel: true },\n          tooltip: { trigger: \"axis\", axisPointer: { type: \"shadow\" } },\n          legend: { bottom: 0, icon: \"roundRect\" },\n          xAxis: { ...valueAxis(), show: true },\n          yAxis: {\n            type: \"category\",\n            data: stages.map((row) => row.label),\n            axisLabel: { color: INK },\n            axisLine: { show: false },\n            axisTick: { show: false },\n          },\n          series: AGE_BUCKETS.map((bucket, index) => ({\n            name: bucket.label,\n            type: \"bar\" as const,\n            stack: \"age\",\n            barMaxWidth: 22,\n            itemStyle: {\n              color: AGE_RAMP[index],\n              borderColor: SURFACE,\n              borderWidth: 1,\n            },\n            data: stages.map((row) => row.counts[index] ?? 0),\n          })),\n        },\n        { notMerge: true },\n      );\n    },\n\n    renderAgeing(rows: Project[], cycle: number[]) {\n      const chart = charts[\"ageing\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const today = this.data.today;\n      const production = rows.filter((row) => inProduction(row, today));\n      const stages = stageRows(this.data, production).map((row) => row.stage);\n      const labels = new Map(\n        this.data.stages.map((stage) => [stage.value, stage.label]),\n      );\n      const p50 = percentile(cycle, 50);\n      const p85 = percentile(cycle, 85);\n\n      if (!production.length) {\n        empty(chart, \"Nothing in production in this selection.\");\n        return;\n      }\n\n      // A small vertical spread so packs of the same age in the same stage\n      // don't sit on top of each other.\n      const seen = new Map<string, number>();\n      const point = (row: Project) => {\n        const key = `${row.stage}:${row.survey_age}`;\n        const index = seen.get(key) ?? 0;\n        seen.set(key, index + 1);\n        const offset = ((index % 5) - 2) * 0.12;\n        return {\n          value: [row.survey_age ?? 0, stages.indexOf(row.stage) + offset],\n          row,\n        };\n      };\n\n      const late = (row: Project) =>\n        p85 !== null && (row.survey_age ?? 0) > p85;\n\n      const markLine =\n        p50 === null\n          ? undefined\n          : {\n              silent: true,\n              symbol: \"none\",\n              lineStyle: { color: MUTED, type: \"dashed\" as const, width: 1 },\n              label: { color: MUTED, formatter: \"{b}\", position: \"start\" },\n              data: [\n                { name: `half out by ${p50}d`, xAxis: p50 },\n                { name: `85% by ${p85}d`, xAxis: p85 ?? p50 },\n              ],\n            };\n\n      const series = [\n        {\n          name: p85 === null ? \"In production\" : \"Within past release times\",\n          type: \"scatter\" as const,\n          symbolSize: 11,\n          itemStyle: { color: SINGLE, borderColor: SURFACE, borderWidth: 2 },\n          data: production.filter((row) => !late(row)).map(point),\n          markLine,\n        },\n        {\n          name: \"Slower than 85% of releases\",\n          type: \"scatter\" as const,\n          symbolSize: 11,\n          itemStyle: {\n            color: STATUS.serious,\n            borderColor: SURFACE,\n            borderWidth: 2,\n          },\n          data: production.filter(late).map(point),\n        },\n      ];\n\n      chart.setOption(\n        {\n          title: { show: false },\n          grid: { left: 8, right: 24, top: 32, bottom: 56, containLabel: true },\n          legend: { bottom: 0, icon: \"circle\" },\n          tooltip: {\n            trigger: \"item\",\n            formatter: (params: { data: { row: Project } }) => {\n              const row = params.data.row;\n              // ECharts renders tooltips as HTML; addresses are customer input.\n              const html = echarts.format.encodeHTML;\n              return (\n                `<b>${html(row.address)}</b><br/>${html(row.consultant)} \u00B7 ` +\n                `${html(labels.get(row.stage) ?? row.stage)}<br/>` +\n                `${row.survey_age}d since survey`\n              );\n            },\n          },\n          xAxis: {\n            ...valueAxis(\"days since survey\"),\n            nameLocation: \"middle\",\n            nameGap: 28,\n            min: 0,\n            axisLine: { onZero: false, lineStyle: { color: GRID } },\n          },\n          yAxis: {\n            type: \"value\",\n            min: -1,\n            max: stages.length,\n            interval: 1,\n            inverse: true,\n            splitLine: { show: false },\n            axisLine: { show: false },\n            axisTick: { show: false },\n            axisLabel: {\n              color: INK,\n              formatter: (value: number) =>\n                labels.get(stages[value] ?? \"\") ?? \"\",\n            },\n          },\n          series,\n        },\n        { notMerge: true },\n      );\n    },\n\n    renderForward(rows: Project[], rate: number) {\n      const chart = charts[\"forward\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const open = rows.filter(isOpen);\n      const ahead = forward(open, this.data.today, FORWARD_WEEKS);\n      const labels = [\n        \"Overdue\",\n        ...ahead.weeks.map((week) => shortDate(week.monday)),\n      ];\n      const buckets = [ahead.overdue, ...ahead.weeks.map((week) => week.rows)];\n      const live = this.data.consultants.filter((name) =>\n        this.consultantOn(name),\n      );\n\n      this.forwardNote =\n        `${plural(ahead.undated.length, \"open pack\")} with no target or ` +\n        `anticipated date, ${ahead.later.length} due after these ${FORWARD_WEEKS} weeks.`;\n\n      chart.setOption(\n        {\n          title: { show: false },\n          grid: {\n            left: 36,\n            right: 12,\n            top: 24,\n            bottom: live.length > 1 ? 80 : 48,\n          },\n          tooltip: { trigger: \"axis\", axisPointer: { type: \"shadow\" } },\n          legend:\n            live.length > 1 ? { bottom: 0, icon: \"roundRect\" } : undefined,\n          xAxis: {\n            ...axis(labels),\n            name: \"week beginning\",\n            nameLocation: \"middle\",\n            nameGap: 28,\n            nameTextStyle: { color: MUTED },\n          },\n          yAxis: valueAxis(),\n          series: live.map((name, index) => ({\n            name,\n            type: \"bar\" as const,\n            stack: \"due\",\n            barMaxWidth: 28,\n            itemStyle: {\n              color: this.colourFor(name),\n              borderColor: SURFACE,\n              borderWidth: 1,\n            },\n            data: buckets.map(\n              (bucket) =>\n                bucket.filter((row) => row.consultant === name).length,\n            ),\n            markLine:\n              index === 0 && rate > 0\n                ? {\n                    silent: true,\n                    symbol: \"none\",\n                    lineStyle: {\n                      color: INK,\n                      type: \"dashed\" as const,\n                      width: 1,\n                    },\n                    label: {\n                      color: INK,\n                      position: \"insideEndTop\" as const,\n                      formatter: `${rate.toFixed(1)} released / week lately`,\n                    },\n                    data: [{ yAxis: rate }],\n                  }\n                : undefined,\n          })),\n        },\n        { notMerge: true },\n      );\n    },\n\n    renderIncoming(rows: Project[]) {\n      const chart = charts[\"incoming\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const weeks = incoming(rows, this.data.today, FORWARD_WEEKS);\n      const total = weeks.reduce((sum, week) => sum + week.count, 0);\n      const unbooked = rows.filter(\n        (row) => isOpen(row) && row.survey_date === null,\n      ).length;\n\n      this.incomingNote =\n        `${plural(total, \"survey\")} booked over the next ${FORWARD_WEEKS} weeks; ` +\n        `${plural(unbooked, \"open project\")} with no survey booked.`;\n\n      chart.setOption(\n        {\n          title: { show: false },\n          grid: { left: 36, right: 12, top: 24, bottom: 48 },\n          tooltip: { trigger: \"axis\", axisPointer: { type: \"shadow\" } },\n          xAxis: {\n            ...axis(weeks.map((week) => shortDate(week.monday))),\n            name: \"week beginning\",\n            nameLocation: \"middle\",\n            nameGap: 28,\n            nameTextStyle: { color: MUTED },\n          },\n          yAxis: valueAxis(),\n          series: [\n            {\n              name: \"Surveys booked\",\n              type: \"bar\",\n              barMaxWidth: 28,\n              itemStyle: { color: SINGLE, borderRadius: [4, 4, 0, 0] },\n              data: weeks.map((week) => week.count),\n            },\n          ],\n        },\n        { notMerge: true },\n      );\n    },\n\n    renderFlow(rows: Project[]) {\n      const weeks = flow(rows, this.data.today, this.weeks);\n      const labels = weeks.map((week) => shortDate(week.monday));\n      const inOut = charts[\"flow\"];\n      const wip = charts[\"wip\"];\n\n      inOut?.setOption(\n        {\n          title: { show: false },\n          grid: { left: 36, right: 12, top: 24, bottom: 56 },\n          tooltip: { trigger: \"axis\", axisPointer: { type: \"shadow\" } },\n          legend: { bottom: 0, icon: \"roundRect\" },\n          xAxis: axis(labels),\n          yAxis: valueAxis(),\n          series: [\n            {\n              name: \"Surveyed\",\n              type: \"bar\",\n              barMaxWidth: 16,\n              itemStyle: { color: SERIES[0], borderRadius: [4, 4, 0, 0] },\n              data: weeks.map((week) => week.surveyed),\n            },\n            {\n              name: \"Released\",\n              type: \"bar\",\n              barMaxWidth: 16,\n              itemStyle: { color: SERIES[1], borderRadius: [4, 4, 0, 0] },\n              data: weeks.map((week) => week.released),\n            },\n          ],\n        },\n        { notMerge: true },\n      );\n\n      wip?.setOption(\n        {\n          title: { show: false },\n          grid: { left: 36, right: 12, top: 24, bottom: 28 },\n          tooltip: { trigger: \"axis\" },\n          xAxis: { ...axis(labels), boundaryGap: false },\n          yAxis: { ...valueAxis(), min: 0 },\n          series: [\n            {\n              name: \"Surveyed, not released\",\n              type: \"line\",\n              symbolSize: 8,\n              lineStyle: { width: 2, color: SINGLE },\n              itemStyle: {\n                color: SINGLE,\n                borderColor: SURFACE,\n                borderWidth: 2,\n              },\n              areaStyle: { color: SINGLE, opacity: 0.08 },\n              data: weeks.map((week) => week.wip),\n            },\n          ],\n        },\n        { notMerge: true },\n      );\n    },\n\n    renderMilestones(released: Project[]) {\n      const chart = charts[\"milestones\"];\n      const rowsOut = milestones(released);\n      const host = this.$refs[\"milestoneTable\"];\n\n      if (host instanceof HTMLElement) {\n        host.textContent = \"\";\n        const head = document.createElement(\"thead\");\n        head.append(\n          headerRow(\n            \"Days from survey to\",\n            [\"Packs\", \"Median\", \"85%\", \"Range\"],\n            -1,\n          ),\n        );\n\n        const body = document.createElement(\"tbody\");\n        body.className = \"divide-y\";\n\n        for (const milestone of rowsOut) {\n          const tr = document.createElement(\"tr\");\n          tr.append(nameCell(milestone.label));\n          tr.append(cell(String(milestone.days.length)));\n          tr.append(cell(days(percentile(milestone.days, 50))));\n          tr.append(cell(days(percentile(milestone.days, 85))));\n          tr.append(\n            cell(\n              milestone.days.length\n                ? `${milestone.days[0]}\u2013${milestone.days.at(-1)}d`\n                : \"\u2013\",\n            ),\n          );\n          body.append(tr);\n        }\n\n        host.append(head, body);\n      }\n\n      if (!chart) {\n        return;\n      }\n\n      if (!released.length) {\n        empty(chart, \"No BuildPacks released in the window.\");\n        return;\n      }\n\n      const ordered = [...rowsOut].reverse();\n\n      chart.setOption(\n        {\n          title: { show: false },\n          grid: { left: 8, right: 24, top: 16, bottom: 56, containLabel: true },\n          legend: { bottom: 0 },\n          tooltip: {\n            trigger: \"item\",\n            formatter: (params: { seriesName: string; value: number[] }) =>\n              `${params.seriesName}: ${params.value[0]}d`,\n          },\n          xAxis: {\n            ...valueAxis(\"days since survey\"),\n            nameLocation: \"middle\",\n            nameGap: 28,\n          },\n          yAxis: {\n            type: \"category\",\n            data: ordered.map((milestone) => milestone.label),\n            axisLabel: { color: INK },\n            axisLine: { show: false },\n            axisTick: { show: false },\n          },\n          series: [\n            {\n              name: \"Each BuildPack\",\n              type: \"scatter\",\n              symbolSize: 9,\n              itemStyle: {\n                color: SINGLE,\n                opacity: 0.6,\n                borderColor: SURFACE,\n                borderWidth: 1,\n              },\n              data: ordered.flatMap((milestone, index) =>\n                milestone.days.map((value, position) => [\n                  value,\n                  index + ((position % 5) - 2) * 0.08,\n                ]),\n              ),\n            },\n            {\n              name: \"Median\",\n              type: \"scatter\",\n              symbol: \"rect\",\n              symbolSize: [3, 26],\n              itemStyle: { color: INK },\n              data: ordered.flatMap((milestone, index) => {\n                const middle = percentile(milestone.days, 50);\n                return middle === null ? [] : [[middle, index]];\n              }),\n            },\n          ],\n        },\n        { notMerge: true },\n      );\n    },\n\n    renderDwell(rows: Project[]) {\n      const host = this.$refs[\"dwellTable\"];\n      const from = windowStart(this.data.today, this.weeks);\n      const stages = dwell(this.data, rows, from);\n      const started = this.data.history_started;\n\n      this.dwellNote = started\n        ? `Stage history has been recorded since ${longDate(started)}. Finished ` +\n          \"time only counts spells that began after that; time so far for packs \" +\n          \"that were already in their stage is a minimum.\"\n        : \"Stage history starts recording now, so finished time in each stage \" +\n          \"fills in as packs move. Time so far is a minimum until then.\";\n\n      if (!(host instanceof HTMLElement)) {\n        return;\n      }\n\n      host.textContent = \"\";\n      const head = document.createElement(\"thead\");\n      head.append(\n        headerRow(\n          \"Stage\",\n          [\n            \"Finished\",\n            \"Median\",\n            \"85%\",\n            \"In it now\",\n            \"Median so far\",\n            \"Longest\",\n          ],\n          -1,\n        ),\n      );\n\n      const body = document.createElement(\"tbody\");\n      body.className = \"divide-y\";\n\n      if (!stages.length) {\n        body.append(emptyRow(7, \"Nothing matches this selection.\"));\n      }\n\n      for (const stage of stages) {\n        const tr = document.createElement(\"tr\");\n        tr.className = \"hover:bg-blue-50\";\n        tr.append(nameCell(stage.label));\n        tr.append(cell(String(stage.finished.length)));\n        tr.append(cell(days(percentile(stage.finished, 50))));\n        tr.append(cell(days(percentile(stage.finished, 85))));\n        tr.append(cell(String(stage.current.length)));\n        tr.append(cell(days(percentile(stage.current, 50))));\n        tr.append(cell(days(stage.current.at(-1) ?? null)));\n        body.append(tr);\n      }\n\n      host.append(head, body);\n    },\n\n    renderConsultants(rows: Project[]) {\n      const host = this.$refs[\"consultantTable\"];\n\n      if (!(host instanceof HTMLElement)) {\n        return;\n      }\n\n      const table = consultantRows(this.data, rows, this.weeks);\n\n      host.textContent = \"\";\n      const head = document.createElement(\"thead\");\n      head.append(\n        headerRow(\n          \"Consultant\",\n          [\n            \"Awaiting survey\",\n            \"In production\",\n            \"Complex\",\n            \"Need attention\",\n            \"Median days since survey\",\n            \"Due in 4 weeks\",\n            `Released (${this.weeks}w)`,\n            \"Median survey \u2192 release\",\n            \"On time\",\n          ],\n          -1,\n        ),\n      );\n\n      const body = document.createElement(\"tbody\");\n      body.className = \"divide-y\";\n\n      if (!table.length) {\n        body.append(emptyRow(10, \"Nothing matches this selection.\"));\n      }\n\n      for (const row of table) {\n        const tr = document.createElement(\"tr\");\n        tr.className = \"hover:bg-blue-50\";\n        tr.append(nameCell(row.name, this.colourFor(row.name)));\n        tr.append(\n          cell(String(row.awaiting), row.awaiting ? \"\" : \"text-gray-400\"),\n        );\n        tr.append(\n          cell(String(row.production), row.production ? \"\" : \"text-gray-400\"),\n        );\n        tr.append(\n          cell(String(row.complex), row.complex ? \"\" : \"text-gray-400\"),\n        );\n        tr.append(\n          cell(String(row.attention), row.attention ? \"\" : \"text-gray-400\"),\n        );\n        tr.append(cell(days(row.ageMedian)));\n        tr.append(\n          cell(String(row.dueSoon), row.dueSoon ? \"\" : \"text-gray-400\"),\n        );\n        tr.append(\n          cell(String(row.released), row.released ? \"\" : \"text-gray-400\"),\n        );\n        tr.append(cell(days(row.cycleMedian)));\n        tr.append(\n          cell(\n            row.withTarget ? `${row.onTime} of ${row.withTarget}` : \"\u2013\",\n            row.withTarget ? \"\" : \"text-gray-400\",\n          ),\n        );\n        body.append(tr);\n      }\n\n      host.append(head, body);\n    },\n  };\n};\n", "import z from \"zod\";\n\nimport { passes, shiftDays } from \"./aggregate\";\n\n/**\n * Shape of the payload `apps.operations.sales_analytics.payload` hands the\n * page, and the pure aggregation over it. Dates are `YYYY-MM-DD` strings and\n * months `YYYY-MM`, compared as strings, as on the delivery page.\n */\n\nconst paymentSchema = z.object({\n  id: z.number(),\n  paid: z.string(),\n  amount: z.number(),\n  product: z.string(),\n  project: z.number(),\n});\n\nconst owedSchema = z.object({\n  id: z.number(),\n  amount: z.number(),\n  product: z.string(),\n  status: z.string(),\n  due: z.string().nullable(),\n  description: z.string(),\n  project: z.number(),\n});\n\nconst projectSchema = z.object({\n  url: z.string(),\n  address: z.string(),\n  postcode: z.string(),\n  partner: z.string(),\n  complexity: z.string(),\n  area: z.string(),\n  place: z.string(),\n  region: z.string(),\n});\n\nconst focusSchema = z.object({\n  label: z.string(),\n  field: z.enum([\"partner\", \"complexity\"]),\n  value: z.string(),\n});\n\nexport const salesSchema = z.object({\n  today: z.string(),\n  payments: z.array(paymentSchema),\n  outstanding: z.array(owedSchema),\n  projects: z.record(z.string(), projectSchema),\n  products: z.array(z.string()),\n  partners: z.array(z.string()),\n  complexities: z.array(z.string()),\n  regions: z.array(z.string()),\n  focus: z.array(focusSchema),\n  statuses: z.array(z.string()),\n});\n\nexport type Sales = z.infer<typeof salesSchema>;\nexport type Payment = z.infer<typeof paymentSchema>;\nexport type Owed = z.infer<typeof owedSchema>;\nexport type ProjectInfo = z.infer<typeof projectSchema>;\nexport type Focus = z.infer<typeof focusSchema>;\n\nexport interface Selection {\n  products: Set<string>;\n  partners: Set<string>;\n  complexities: Set<string>;\n  regions: Set<string>;\n}\n\n/** Both ends inclusive. */\nexport interface Range {\n  from: string;\n  to: string;\n}\n\nexport type Period =\n  | \"month\"\n  | \"last-month\"\n  | \"quarter\"\n  | \"year\"\n  | \"ytd\"\n  | \"all\";\n\nexport const PERIOD_LABELS: Record<Period, string> = {\n  month: \"this month\",\n  \"last-month\": \"last month\",\n  quarter: \"last 3 months\",\n  year: \"last 12 months\",\n  ytd: \"year to date\",\n  all: \"all time\",\n};\n\nconst EPOCH = \"0000-01-01\";\n\nexport function monthOf(iso: string): string {\n  return iso.slice(0, 7);\n}\n\nexport function addMonths(month: string, count: number): string {\n  const index = Number(month.slice(0, 4)) * 12 + Number(month.slice(5, 7)) - 1;\n  const shifted = index + count;\n  const year = Math.floor(shifted / 12);\n  return `${String(year).padStart(4, \"0\")}-${String((shifted % 12) + 1).padStart(2, \"0\")}`;\n}\n\nexport function firstDay(month: string): string {\n  return `${month}-01`;\n}\n\nexport function lastDay(month: string): string {\n  return shiftDays(firstDay(addMonths(month, 1)), -1);\n}\n\nexport function daysIn(month: string): number {\n  return Number(lastDay(month).slice(8, 10));\n}\n\n/** The same day-of-month in `month`, or its last day if it is shorter. */\nfunction sameDay(month: string, iso: string): string {\n  const day = Math.min(Number(iso.slice(8, 10)), daysIn(month));\n  return `${month}-${String(day).padStart(2, \"0\")}`;\n}\n\n/** `count` whole months ending `before` months back from `month`. */\nfunction wholeMonths(month: string, count: number, before = 1): Range {\n  return {\n    from: firstDay(addMonths(month, -(before + count - 1))),\n    to: lastDay(addMonths(month, -before)),\n  };\n}\n\n/**\n * The dates a period covers and the stretch it is fairly compared with. Part\n * periods are compared to the same days before: this month so far against\n * last month to the same day, not against the whole of last month.\n */\nexport function periodRange(\n  period: Period,\n  today: string,\n): { current: Range; previous: Range | null } {\n  const month = monthOf(today);\n\n  switch (period) {\n    case \"month\": {\n      const last = addMonths(month, -1);\n      return {\n        current: { from: firstDay(month), to: today },\n        previous: { from: firstDay(last), to: sameDay(last, today) },\n      };\n    }\n    case \"last-month\":\n      return {\n        current: wholeMonths(month, 1),\n        previous: wholeMonths(month, 1, 2),\n      };\n    case \"quarter\":\n      return {\n        current: wholeMonths(month, 3),\n        previous: wholeMonths(month, 3, 4),\n      };\n    case \"year\":\n      return {\n        current: wholeMonths(month, 12),\n        previous: wholeMonths(month, 12, 13),\n      };\n    case \"ytd\": {\n      const year = Number(today.slice(0, 4));\n      const lastYear = `${year - 1}${today.slice(4, 7)}`;\n      return {\n        current: { from: `${year}-01-01`, to: today },\n        previous: { from: `${year - 1}-01-01`, to: sameDay(lastYear, today) },\n      };\n    }\n    case \"all\":\n      return { current: { from: EPOCH, to: today }, previous: null };\n  }\n}\n\nexport function within(iso: string, range: Range): boolean {\n  return iso >= range.from && iso <= range.to;\n}\n\nfunction projectOf(data: Sales, id: number): ProjectInfo | undefined {\n  return data.projects[String(id)];\n}\n\nfunction matches(\n  data: Sales,\n  selection: Selection,\n  row: { product: string; project: number },\n): boolean {\n  const project = projectOf(data, row.project);\n\n  return (\n    passes(selection.products, data.products, row.product) &&\n    passes(selection.partners, data.partners, project?.partner ?? \"\") &&\n    passes(\n      selection.complexities,\n      data.complexities,\n      project?.complexity ?? \"\",\n    ) &&\n    passes(selection.regions, data.regions, project?.region ?? \"\")\n  );\n}\n\n/** Every payment the filters let through, from any date. */\nexport function selectedPayments(data: Sales, selection: Selection): Payment[] {\n  return data.payments.filter((row) => matches(data, selection, row));\n}\n\nexport function selectedOwed(data: Sales, selection: Selection): Owed[] {\n  return data.outstanding.filter((row) => matches(data, selection, row));\n}\n\n/** The rows belonging to one focus segment, such as HEWY's. */\nexport function inFocus<T extends { project: number }>(\n  data: Sales,\n  focus: Focus,\n  rows: T[],\n): T[] {\n  return rows.filter(\n    (row) => projectOf(data, row.project)?.[focus.field] === focus.value,\n  );\n}\n\nexport function total(rows: { amount: number }[]): number {\n  return rows.reduce((sum, row) => sum + row.amount, 0);\n}\n\n/**\n * The earliest payment for each key. Ties on a day go to the lower id, the\n * order the payments were recorded in.\n */\nfunction earliest<K>(\n  payments: Payment[],\n  key: (row: Payment) => K,\n): Map<K, Payment> {\n  const first = new Map<K, Payment>();\n\n  for (const row of payments) {\n    const seen = first.get(key(row));\n\n    if (\n      !seen ||\n      row.paid < seen.paid ||\n      (row.paid === seen.paid && row.id < seen.id)\n    ) {\n      first.set(key(row), row);\n    }\n  }\n\n  return first;\n}\n\n/**\n * Each project's first payment among `payments`: what makes it a new\n * customer, and which month's cohort it joins.\n */\nexport function firstPayments(payments: Payment[]): Map<number, Payment> {\n  return earliest(payments, (row) => row.project);\n}\n\n/**\n * The payments that are sales: each new customer's first. Give it every\n * payment, not the filtered ones: with only Build Pack picked, a HEP\n * customer's later Build Pack would otherwise look like their first.\n */\nexport function sales(payments: Payment[]): Set<Payment> {\n  return new Set(firstPayments(payments).values());\n}\n\n/** How the sales split, in the order the page shows them. */\nexport const SALE_TYPES = [\"Build Pack\", \"HEP\", \"Complex\"];\n\n/**\n * What a sale is counted as: Complex when the project is marked Complex, a\n * Build Pack when its first payment was for one, and a HEP otherwise. The\n * labels are the server's (`product_label`, `complexity_label`).\n */\nexport function saleType(data: Sales, first: Payment): string {\n  if (projectOf(data, first.project)?.complexity === \"Complex\") {\n    return \"Complex\";\n  }\n\n  return first.product === \"Build Pack\" ? \"Build Pack\" : \"HEP\";\n}\n\n/** Months from `from` to `to` inclusive, oldest first. */\nexport function monthsBetween(from: string, to: string): string[] {\n  const out: string[] = [];\n\n  for (let month = from; month <= to; month = addMonths(month, 1)) {\n    out.push(month);\n  }\n\n  return out;\n}\n\nexport interface MonthRow {\n  month: string;\n  payments: number;\n  /** Sales of each type in `SALE_TYPES`, then their sum. */\n  soldByType: number[];\n  sold: number;\n  /** Money taken for each product, then its sum. */\n  byProduct: number[];\n  total: number;\n}\n\nexport function monthRows(\n  payments: Payment[],\n  months: string[],\n  products: string[],\n  typeOf: (first: Payment) => string,\n  sold: Set<Payment>,\n): MonthRow[] {\n  return months.map((month) => {\n    const rows = payments.filter((row) => monthOf(row.paid) === month);\n    const soldRows = rows.filter((row) => sold.has(row));\n\n    return {\n      month,\n      payments: rows.length,\n      soldByType: SALE_TYPES.map(\n        (type) => soldRows.filter((row) => typeOf(row) === type).length,\n      ),\n      sold: soldRows.length,\n      byProduct: products.map((product) =>\n        total(rows.filter((row) => row.product === product)),\n      ),\n      total: total(rows),\n    };\n  });\n}\n\n/**\n * Money taken by each day of `month`, added up. Stops at `today` for the\n * month in progress, so its line ends where the month has got to.\n */\nexport function runningTotal(\n  payments: Payment[],\n  month: string,\n  today: string,\n): number[] {\n  const days =\n    month === monthOf(today) ? Number(today.slice(8, 10)) : daysIn(month);\n  const byDay = new Array<number>(days).fill(0);\n\n  for (const row of payments) {\n    if (monthOf(row.paid) !== month) {\n      continue;\n    }\n\n    const day = Number(row.paid.slice(8, 10));\n\n    if (day <= days) {\n      byDay[day - 1] = (byDay[day - 1] ?? 0) + row.amount;\n    }\n  }\n\n  let running = 0;\n  return byDay.map((amount) => {\n    running += amount;\n    return running;\n  });\n}\n\nexport interface GroupRow {\n  name: string;\n  amount: number;\n  payments: number;\n  sold: number;\n  share: number;\n}\n\n/** Sales, money and payments by `key`, the most money first. */\nexport function groupRows(\n  payments: Payment[],\n  key: (row: Payment) => string,\n  sold: Set<Payment>,\n): GroupRow[] {\n  const sum = total(payments);\n  const groups = new Map<string, Payment[]>();\n\n  for (const row of payments) {\n    const name = key(row);\n    groups.set(name, [...(groups.get(name) ?? []), row]);\n  }\n\n  return [...groups.entries()]\n    .map(([name, rows]) => ({\n      name,\n      amount: total(rows),\n      payments: rows.length,\n      sold: rows.filter((row) => sold.has(row)).length,\n      share: sum ? (total(rows) / sum) * 100 : 0,\n    }))\n    .sort((a, b) => b.amount - a.amount || a.name.localeCompare(b.name));\n}\n\nexport interface CohortRow {\n  month: string;\n  customers: number;\n  first: number;\n  since: number;\n  again: number;\n}\n\n/**\n * Projects grouped by the month of their first payment: what the first\n * payments came to, what the same projects have paid since, and how many have\n * paid more than once. Only the projects whose first payment is among\n * `payments` count, so a product filter can't make a later purchase a first.\n */\nexport function cohortRows(\n  payments: Payment[],\n  months: string[],\n  sold: Set<Payment>,\n): CohortRow[] {\n  const firsts = payments.filter((row) => sold.has(row));\n  const counts = new Map<number, number>();\n\n  for (const row of payments) {\n    counts.set(row.project, (counts.get(row.project) ?? 0) + 1);\n  }\n\n  return months.map((month) => {\n    const cohort = firsts.filter((row) => monthOf(row.paid) === month);\n    const members = new Set(cohort.map((row) => row.project));\n    const all = total(payments.filter((row) => members.has(row.project)));\n    const first = total(cohort);\n\n    return {\n      month,\n      customers: cohort.length,\n      first,\n      since: all - first,\n      again: cohort.filter((row) => (counts.get(row.project) ?? 0) > 1).length,\n    };\n  });\n}\n\n/** Whole days from `from` to `to`. */\nexport function daysBetween(from: string, to: string): number {\n  return Math.round(\n    (Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) /\n      86_400_000,\n  );\n}\n\n/** Overdue first and longest overdue at the top, then by due date. */\nexport function byUrgency(rows: Owed[], statuses: string[]): Owed[] {\n  return [...rows].sort(\n    (a, b) =>\n      statuses.indexOf(a.status) - statuses.indexOf(b.status) ||\n      (a.due ?? \"9999\").localeCompare(b.due ?? \"9999\") ||\n      a.id - b.id,\n  );\n}\n", "import type { AlpineComponent } from \"alpinejs\";\nimport * as echarts from \"echarts\";\n\nimport {\n  GRID,\n  INK,\n  MONTHS,\n  MUTED,\n  OTHER,\n  SERIES,\n  SINGLE,\n  SURFACE,\n  cell,\n  fill,\n  longDate,\n  money,\n  nameCell,\n  row,\n  shortDate,\n  toggle,\n  totalRow,\n} from \"./dom\";\nimport {\n  type GroupRow,\n  type MonthRow,\n  type Owed,\n  PERIOD_LABELS,\n  type Payment,\n  type Period,\n  type ProjectInfo,\n  type Range,\n  type Sales,\n  type Selection,\n  addMonths,\n  byUrgency,\n  cohortRows,\n  daysBetween,\n  daysIn,\n  groupRows,\n  inFocus,\n  monthOf,\n  monthRows,\n  monthsBetween,\n  periodRange,\n  runningTotal,\n  SALE_TYPES,\n  saleType,\n  sales,\n  salesSchema,\n  selectedOwed,\n  selectedPayments,\n  total,\n  within,\n} from \"./sales-aggregate\";\n\n/**\n * The sales analytics page. As on the delivery page, the whole dataset arrives\n * in `data-analytics` and every chart, stat and table renders from the same\n * filtered slice.\n */\n\nconst AREA_CHART_LIMIT = 15;\n\nconst MONTHS_SHOWN = 12;\n\n/** Last month and last year are context for this month, so they recede. */\nconst PACE_LAST_MONTH = \"#9c9b96\";\nconst PACE_LAST_YEAR = \"#c4c3bd\";\n\ntype Kind = \"products\" | \"partners\" | \"complexities\" | \"regions\";\n\ninterface FocusTile {\n  label: string;\n  sold: number;\n  soldFoot: string;\n  owed: string;\n  owedFoot: string;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  data: Sales;\n  period: Period;\n  products: string[];\n  partners: string[];\n  complexities: string[];\n  regions: string[];\n  focus: FocusTile[];\n  periodLabel: string;\n  rangeLabel: string;\n  taken: string;\n  takenDelta: string;\n  sold: number;\n  soldFoot: string;\n  paymentCount: number;\n  paymentFoot: string;\n  owed: string;\n  owedFoot: string;\n  init(): void;\n  selection(): Selection;\n  pickPeriod(period: Period): void;\n  toggleChip(kind: Kind, name: string): void;\n  resetChips(kind: Kind): void;\n  chipOn(kind: Kind, name: string): boolean;\n  allChipsOn(kind: Kind): boolean;\n  colourFor(name: string): string;\n  typeColour(type: string): string;\n  months(payments: Payment[]): string[];\n  render(): void;\n  renderStats(payments: Payment[], owed: Owed[]): void;\n  renderFocus(payments: Payment[], owed: Owed[]): void;\n  renderMonths(payments: Payment[]): void;\n  renderPace(payments: Payment[]): void;\n  renderSources(payments: Payment[]): void;\n  renderOutstanding(owed: Owed[]): void;\n  renderCohorts(payments: Payment[]): void;\n  renderDetail(payments: Payment[]): void;\n}\n\nfunction monthLabel(month: string): string {\n  return `${MONTHS[Number(month.slice(5, 7)) - 1] ?? \"\"} ${month.slice(0, 4)}`;\n}\n\nfunction rangeText(range: Range): string {\n  if (range.from === range.to) {\n    return longDate(range.to);\n  }\n\n  if (monthOf(range.from) === monthOf(range.to)) {\n    return `${Number(range.from.slice(8, 10))}\u2013${longDate(range.to)}`;\n  }\n\n  return range.from.slice(0, 4) === range.to.slice(0, 4)\n    ? `${shortDate(range.from)} \u2013 ${longDate(range.to)}`\n    : `${longDate(range.from)} \u2013 ${longDate(range.to)}`;\n}\n\n/** What paying customers owe: asked for, of which overdue, and not yet asked for. */\nfunction owedSummary(\n  owed: Owed[],\n  statuses: string[],\n): { requested: number; overdue: number; draft: number } {\n  // The server sends the statuses in this order.\n  const [overdue, awaiting, draft] = statuses;\n  const sumOf = (status: string | undefined) =>\n    total(owed.filter((row) => row.status === status));\n\n  return {\n    requested: sumOf(overdue) + sumOf(awaiting),\n    overdue: sumOf(overdue),\n    draft: sumOf(draft),\n  };\n}\n\nfunction plural(count: number, one: string, many = `${one}s`): string {\n  return `${count} ${count === 1 ? one : many}`;\n}\n\n/** The year only when it is not this one, so an old debt cannot pass for new. */\nfunction dueDate(iso: string, today: string): string {\n  return iso.slice(0, 4) === today.slice(0, 4) ? shortDate(iso) : longDate(iso);\n}\n\nfunction signed(pence: number): string {\n  return `${pence < 0 ? \"\u2212\" : \"+\"}${money(Math.abs(pence))}`;\n}\n\nfunction percent(part: number, whole: number): string {\n  return whole ? `${Math.round((part / whole) * 100)}%` : \"\u2013\";\n}\n\nfunction poundsAxis(value: number): string {\n  return value >= 100_000 ? `\u00A3${Math.round(value / 100_000)}k` : money(value);\n}\n\n/** A month-by-month stacked bar chart, one series per product. */\nfunction stackedMonths(\n  chart: echarts.ECharts | null | undefined,\n  labels: string[],\n  series: { name: string; colour: string; data: number[] }[],\n  format: (value: number) => string,\n) {\n  if (!chart) {\n    return;\n  }\n\n  // The legend needs a band of its own, or it lands on the month labels.\n  const legend = series.length > 1;\n\n  chart.setOption(\n    {\n      grid: { left: 56, right: 12, top: 24, bottom: legend ? 64 : 28 },\n      tooltip: {\n        trigger: \"axis\",\n        axisPointer: { type: \"shadow\" },\n        valueFormatter: (value: number) => format(value),\n      },\n      legend: legend ? { bottom: 0, icon: \"roundRect\" } : undefined,\n      xAxis: {\n        type: \"category\",\n        data: labels,\n        axisLabel: { color: MUTED },\n        axisLine: { lineStyle: { color: GRID } },\n        axisTick: { show: false },\n      },\n      yAxis: {\n        type: \"value\",\n        minInterval: 1,\n        axisLabel: {\n          color: MUTED,\n          formatter: format === money ? poundsAxis : format,\n        },\n        splitLine: { lineStyle: { color: GRID } },\n      },\n      series: series.map((each) => ({\n        name: each.name,\n        type: \"bar\" as const,\n        stack: \"total\",\n        barMaxWidth: 32,\n        itemStyle: {\n          color: each.colour,\n          // A gap in the surface colour separates touching segments.\n          borderColor: SURFACE,\n          borderWidth: 1,\n        },\n        data: each.data,\n      })),\n    },\n    { replaceMerge: [\"series\", \"legend\"] },\n  );\n}\n\nfunction textCell(\n  text: string,\n  sub = \"\",\n  className = \"\",\n): HTMLTableCellElement {\n  const td = document.createElement(\"td\");\n  td.className = `p-2 text-left ${className}`.trim();\n  td.textContent = text;\n\n  if (sub) {\n    const second = document.createElement(\"div\");\n    second.className = \"text-gray-500 text-xs\";\n    second.textContent = sub;\n    td.append(second);\n  }\n\n  return td;\n}\n\nfunction propertyCell(project: ProjectInfo | undefined): HTMLTableCellElement {\n  const td = document.createElement(\"td\");\n  td.className = \"min-w-40 p-2 text-left\";\n\n  if (!project) {\n    td.textContent = \"\u2014\";\n    return td;\n  }\n\n  const link = document.createElement(\"a\");\n  link.href = project.url;\n  link.className = \"font-medium text-blue-700 hover:underline\";\n  link.textContent = project.address;\n\n  const sub = document.createElement(\"div\");\n  sub.className = \"text-gray-500 text-xs\";\n  sub.textContent = [project.postcode, project.partner].join(\" \u00B7 \");\n\n  td.append(link, sub);\n  return td;\n}\n\nexport default (): AlpineComponent<State> => {\n  const charts: Record<string, echarts.ECharts | null> = {\n    monthlySales: null,\n    monthly: null,\n    pace: null,\n    areas: null,\n  };\n\n  return {\n    data: salesSchema.parse({\n      today: \"1970-01-01\",\n      payments: [],\n      outstanding: [],\n      projects: {},\n      products: [],\n      partners: [],\n      complexities: [],\n      regions: [],\n      focus: [],\n      statuses: [],\n    }),\n    period: \"month\",\n    products: [],\n    partners: [],\n    complexities: [],\n    regions: [],\n    focus: [],\n    periodLabel: PERIOD_LABELS.month,\n    rangeLabel: \"\",\n    taken: \"\u2013\",\n    takenDelta: \"\",\n    sold: 0,\n    soldFoot: \"\",\n    paymentCount: 0,\n    paymentFoot: \"\",\n    owed: \"\u2013\",\n    owedFoot: \"\",\n\n    init() {\n      if (!(this.$el instanceof HTMLElement)) {\n        return;\n      }\n\n      const raw = this.$el.dataset[\"analytics\"];\n\n      if (!raw) {\n        return;\n      }\n\n      const parsed = salesSchema.safeParse(JSON.parse(raw));\n\n      if (!parsed.success) {\n        return;\n      }\n\n      this.data = parsed.data;\n      this.products = [...this.data.products];\n      this.partners = [...this.data.partners];\n      this.complexities = [...this.data.complexities];\n      this.regions = [...this.data.regions];\n\n      for (const key of Object.keys(charts)) {\n        const host = this.$refs[key];\n\n        if (host instanceof HTMLElement) {\n          charts[key] = echarts.init(host);\n        }\n      }\n\n      window.addEventListener(\"resize\", () => {\n        for (const chart of Object.values(charts)) {\n          chart?.resize();\n        }\n      });\n\n      this.render();\n    },\n\n    selection(): Selection {\n      return {\n        products: new Set(this.products),\n        partners: new Set(this.partners),\n        complexities: new Set(this.complexities),\n        regions: new Set(this.regions),\n      };\n    },\n\n    pickPeriod(period: Period) {\n      this.period = period;\n      this.render();\n    },\n\n    toggleChip(kind: Kind, name: string) {\n      this[kind] = toggle(this[kind], this.data[kind], name);\n      this.render();\n    },\n\n    resetChips(kind: Kind) {\n      this[kind] = [...this.data[kind]];\n      this.render();\n    },\n\n    chipOn(kind: Kind, name: string): boolean {\n      return this[kind].includes(name);\n    },\n\n    allChipsOn(kind: Kind): boolean {\n      return this[kind].length === this.data[kind].length;\n    },\n\n    colourFor(name: string): string {\n      const index = this.data.products.indexOf(name);\n      return index >= 0 ? (SERIES[index % SERIES.length] ?? OTHER) : OTHER;\n    },\n\n    /**\n     * Build Pack and HEP share their products' colours; Complex takes the\n     * first one neither has, whichever products are in use.\n     */\n    typeColour(type: string): string {\n      if (type !== \"Complex\") {\n        return this.colourFor(type === \"HEP\" ? \"Project\" : type);\n      }\n\n      const taken = [this.colourFor(\"Build Pack\"), this.colourFor(\"Project\")];\n      return SERIES.find((colour) => !taken.includes(colour)) ?? OTHER;\n    },\n\n    /** The twelve months to this one, or every month for All time. */\n    months(payments: Payment[]): string[] {\n      const current = monthOf(this.data.today);\n      const earliest = payments[0]?.paid;\n\n      return this.period === \"all\" && earliest\n        ? monthsBetween(monthOf(earliest), current)\n        : monthsBetween(addMonths(current, -(MONTHS_SHOWN - 1)), current);\n    },\n\n    render() {\n      const selection = this.selection();\n      const payments = selectedPayments(this.data, selection);\n      const owed = selectedOwed(this.data, selection);\n\n      this.renderStats(payments, owed);\n      this.renderFocus(payments, owed);\n      this.renderMonths(payments);\n      this.renderPace(payments);\n      this.renderSources(payments);\n      this.renderOutstanding(owed);\n      this.renderCohorts(payments);\n      this.renderDetail(payments);\n    },\n\n    renderStats(payments: Payment[], owed: Owed[]) {\n      const today = this.data.today;\n      const { current, previous } = periodRange(this.period, today);\n      const earliest = this.data.payments[0]?.paid ?? today;\n      const taken = payments.filter((row) => within(row.paid, current));\n      const amount = total(taken);\n\n      this.periodLabel = PERIOD_LABELS[this.period];\n      this.rangeLabel = rangeText({\n        from: current.from < earliest ? earliest : current.from,\n        to: current.to,\n      });\n      this.taken = money(amount);\n\n      if (previous) {\n        const before = total(\n          payments.filter((row) => within(row.paid, previous)),\n        );\n        const change = before\n          ? ` (${amount >= before ? \"+\" : \"\u2212\"}${percent(Math.abs(amount - before), before)})`\n          : \"\";\n\n        this.takenDelta = `${signed(amount - before)}${change} vs ${rangeText(previous)} (${money(before)})`;\n      } else {\n        this.takenDelta = `since ${longDate(earliest)}`;\n      }\n\n      if (this.period === \"month\") {\n        const last = addMonths(monthOf(today), -1);\n        const whole = total(\n          payments.filter((row) => monthOf(row.paid) === last),\n        );\n        this.takenDelta += ` \u00B7 ${monthLabel(last)} in full ${money(whole)}`;\n      }\n\n      const sold = sales(this.data.payments);\n      const soldNow = taken.filter((row) => sold.has(row));\n      const byType = SALE_TYPES.map((type) => ({\n        type,\n        count: soldNow.filter((row) => saleType(this.data, row) === type)\n          .length,\n      }))\n        .filter((each) => each.count)\n        .map((each) => `${each.count} ${each.type}`);\n\n      this.sold = soldNow.length;\n      this.soldFoot = byType.join(\" \u00B7 \") || \"no sales in the period\";\n\n      if (previous) {\n        const before = payments.filter(\n          (row) => sold.has(row) && within(row.paid, previous),\n        ).length;\n        const change = soldNow.length - before;\n        this.soldFoot += ` \u00B7 ${change < 0 ? \"\u2212\" : \"+\"}${Math.abs(change)} vs ${rangeText(previous)} (${before})`;\n      }\n\n      this.paymentCount = taken.length;\n      this.paymentFoot = taken.length\n        ? `${taken.length - soldNow.length} from existing customers \u00B7 average ${money(amount / taken.length)}`\n        : \"none in the period\";\n\n      const owing = owedSummary(owed, this.data.statuses);\n      this.owed = money(owing.requested);\n      this.owedFoot = `${money(owing.overdue)} overdue \u00B7 ${money(owing.draft)} more not yet requested`;\n    },\n\n    renderFocus(payments: Payment[], owed: Owed[]) {\n      const { current } = periodRange(this.period, this.data.today);\n      const sold = sales(this.data.payments);\n      const allSold = payments.filter(\n        (row) => sold.has(row) && within(row.paid, current),\n      ).length;\n\n      this.focus = this.data.focus.map((focus) => {\n        const mine = inFocus(this.data, focus, payments);\n        const taken = mine.filter((row) => within(row.paid, current));\n        const soldNow = taken.filter((row) => sold.has(row)).length;\n        const owing = owedSummary(\n          inFocus(this.data, focus, owed),\n          this.data.statuses,\n        );\n\n        return {\n          label: focus.label,\n          sold: soldNow,\n          soldFoot: `${percent(soldNow, allSold)} of all sales \u00B7 ${money(total(taken))} taken`,\n          owed: money(owing.requested),\n          owedFoot: `${money(owing.overdue)} overdue \u00B7 ${money(owing.draft)} not yet requested`,\n        };\n      });\n    },\n\n    renderMonths(payments: Payment[]) {\n      const months = this.months(payments);\n      const rows = monthRows(\n        payments,\n        months,\n        this.data.products,\n        (first) => saleType(this.data, first),\n        sales(this.data.payments),\n      );\n      const types = SALE_TYPES.filter((_type, index) =>\n        rows.some((month) => (month.soldByType[index] ?? 0) > 0),\n      );\n      const typeColumn = (type: string) => SALE_TYPES.indexOf(type);\n      const products = this.data.products.filter((_name, index) =>\n        rows.some((month) => (month.byProduct[index] ?? 0) > 0),\n      );\n      const column = (name: string) => this.data.products.indexOf(name);\n      const current = monthOf(this.data.today);\n\n      const labels = months.map((month) =>\n        month === current\n          ? `${monthLabel(month)} (to date)`\n          : monthLabel(month),\n      );\n      stackedMonths(\n        charts[\"monthlySales\"],\n        labels,\n        types.map((type) => ({\n          name: type,\n          colour: this.typeColour(type),\n          data: rows.map((month) => month.soldByType[typeColumn(type)] ?? 0),\n        })),\n        String,\n      );\n      stackedMonths(\n        charts[\"monthly\"],\n        labels,\n        products.map((name) => ({\n          name,\n          colour: this.colourFor(name),\n          data: rows.map((month) => month.byProduct[column(name)] ?? 0),\n        })),\n        money,\n      );\n\n      const sumBy = (pick: (month: MonthRow) => number) =>\n        rows.reduce((sum, month) => sum + pick(month), 0);\n\n      fill(\n        this.$refs[\"monthTable\"],\n        [\n          [\"Month\", \"left\"],\n          ...types.map((type): [string, \"right\"] => [type, \"right\"]),\n          [\"Sales\", \"right\"],\n          [\"Payments\", \"right\"],\n          ...products.map((name): [string, \"right\"] => [`${name} \u00A3`, \"right\"]),\n          [\"Taken\", \"right\"],\n        ],\n        rows\n          .map((month, index) =>\n            row(\n              nameCell(labels[index] ?? month.month),\n              ...types.map((type) =>\n                cell(String(month.soldByType[typeColumn(type)] ?? 0)),\n              ),\n              cell(String(month.sold), \"font-semibold\"),\n              cell(String(month.payments)),\n              ...products.map((name) =>\n                cell(money(month.byProduct[column(name)] ?? 0)),\n              ),\n              cell(money(month.total), \"font-semibold\"),\n            ),\n          )\n          .reverse(),\n        \"Nothing matches this selection.\",\n        totalRow(\n          nameCell(\"Total\"),\n          ...types.map((type) =>\n            cell(\n              String(sumBy((month) => month.soldByType[typeColumn(type)] ?? 0)),\n            ),\n          ),\n          cell(String(sumBy((month) => month.sold))),\n          cell(String(sumBy((month) => month.payments))),\n          ...products.map((name) =>\n            cell(money(sumBy((month) => month.byProduct[column(name)] ?? 0))),\n          ),\n          cell(money(sumBy((month) => month.total))),\n        ),\n      );\n    },\n\n    renderPace(payments: Payment[]) {\n      const chart = charts[\"pace\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const today = this.data.today;\n      const month = monthOf(today);\n      const lines = [\n        { month, colour: SINGLE, width: 3 },\n        { month: addMonths(month, -1), colour: PACE_LAST_MONTH, width: 2 },\n        { month: addMonths(month, -12), colour: PACE_LAST_YEAR, width: 2 },\n      ];\n      const days = Math.max(...lines.map((line) => daysIn(line.month)));\n\n      chart.setOption(\n        {\n          grid: { left: 56, right: 12, top: 24, bottom: 72 },\n          tooltip: {\n            trigger: \"axis\",\n            valueFormatter: (value: number) => money(value),\n          },\n          legend: { bottom: 0, icon: \"roundRect\" },\n          xAxis: {\n            type: \"category\",\n            data: Array.from({ length: days }, (_value, index) =>\n              String(index + 1),\n            ),\n            name: \"Day of the month\",\n            nameLocation: \"middle\",\n            nameGap: 28,\n            nameTextStyle: { color: MUTED },\n            axisLabel: { color: MUTED },\n            axisLine: { lineStyle: { color: GRID } },\n            axisTick: { show: false },\n          },\n          yAxis: {\n            type: \"value\",\n            axisLabel: { color: MUTED, formatter: poundsAxis },\n            splitLine: { lineStyle: { color: GRID } },\n          },\n          series: lines.map((line) => ({\n            name: monthLabel(line.month),\n            type: \"line\" as const,\n            step: \"end\" as const,\n            symbol: \"none\",\n            itemStyle: { color: line.colour },\n            lineStyle: { color: line.colour, width: line.width },\n            data: runningTotal(payments, line.month, today),\n          })),\n        },\n        { replaceMerge: [\"series\"] },\n      );\n    },\n\n    renderSources(payments: Payment[]) {\n      const { current } = periodRange(this.period, this.data.today);\n      const taken = payments.filter((row) => within(row.paid, current));\n      const sold = sales(this.data.payments);\n      const projects = this.data.projects;\n      const about = (row: Payment) => projects[String(row.project)];\n\n      const table = (\n        ref: string,\n        heading: string,\n        rows: GroupRow[],\n        colour: ((name: string) => string) | null,\n      ) =>\n        fill(\n          this.$refs[ref],\n          [\n            [heading, \"left\"],\n            [\"Sales\", \"right\"],\n            [\"Payments\", \"right\"],\n            [\"Taken\", \"right\"],\n            [\"Share\", \"right\"],\n          ],\n          rows.map((group) =>\n            row(\n              nameCell(group.name, colour ? colour(group.name) : undefined),\n              cell(String(group.sold)),\n              cell(String(group.payments)),\n              cell(money(group.amount)),\n              cell(`${Math.round(group.share)}%`),\n            ),\n          ),\n          \"Nothing taken in this selection.\",\n        );\n\n      table(\n        \"productTable\",\n        \"Product\",\n        groupRows(taken, (row) => row.product, sold),\n        (name) => this.colourFor(name),\n      );\n      table(\n        \"partnerTable\",\n        \"Partner\",\n        groupRows(taken, (row) => about(row)?.partner ?? \"\u2014\", sold),\n        null,\n      );\n      table(\n        \"complexityTable\",\n        \"Complexity\",\n        groupRows(taken, (row) => about(row)?.complexity ?? \"\u2014\", sold).sort(\n          (a, b) =>\n            this.data.complexities.indexOf(a.name) -\n            this.data.complexities.indexOf(b.name),\n        ),\n        null,\n      );\n      table(\n        \"regionTable\",\n        \"Region\",\n        groupRows(taken, (row) => about(row)?.region ?? \"\u2014\", sold),\n        null,\n      );\n\n      const chart = charts[\"areas\"];\n\n      if (!chart) {\n        return;\n      }\n\n      const areas = groupRows(taken, (row) => about(row)?.place ?? \"\u2014\", sold)\n        .slice(0, AREA_CHART_LIMIT)\n        .reverse();\n\n      chart.setOption(\n        {\n          grid: { left: 8, right: 64, top: 8, bottom: 8, containLabel: true },\n          tooltip: {\n            trigger: \"item\",\n            formatter: (params: { dataIndex: number }) => {\n              const area = areas[params.dataIndex];\n              return area\n                ? `${area.name}<br/>${money(area.amount)} \u00B7 ${plural(area.sold, \"sale\")}`\n                : \"\";\n            },\n          },\n          xAxis: { type: \"value\", show: false },\n          yAxis: {\n            type: \"category\",\n            data: areas.map((area) => area.name),\n            axisLabel: { color: INK },\n            axisLine: { show: false },\n            axisTick: { show: false },\n          },\n          series: [\n            {\n              type: \"bar\",\n              barMaxWidth: 20,\n              itemStyle: { color: SINGLE, borderRadius: [0, 4, 4, 0] },\n              label: {\n                show: true,\n                position: \"right\",\n                color: INK,\n                formatter: (params: { value: number }) => money(params.value),\n              },\n              data: areas.map((area) => area.amount),\n            },\n          ],\n        },\n        { replaceMerge: [\"series\"] },\n      );\n    },\n\n    renderOutstanding(owed: Owed[]) {\n      const today = this.data.today;\n      const [overdue] = this.data.statuses;\n      const rows = byUrgency(owed, this.data.statuses);\n\n      fill(\n        this.$refs[\"outstandingTable\"],\n        [\n          [\"Property\", \"left\"],\n          [\"Instalment\", \"left\"],\n          [\"Status\", \"left\"],\n          [\"Due\", \"right\"],\n          [\"Amount\", \"right\"],\n        ],\n        rows.map((instalment) => {\n          const late =\n            instalment.status === overdue && instalment.due\n              ? `${daysBetween(instalment.due, today)}d late`\n              : \"\";\n\n          return row(\n            propertyCell(this.data.projects[String(instalment.project)]),\n            textCell(\n              instalment.description || instalment.product,\n              instalment.description ? instalment.product : \"\",\n            ),\n            textCell(\n              instalment.status,\n              \"\",\n              instalment.status === overdue ? \"text-red-700\" : \"\",\n            ),\n            cell(\n              instalment.due\n                ? [dueDate(instalment.due, today), late]\n                    .filter(Boolean)\n                    .join(\" \u00B7 \")\n                : \"\u2014\",\n              \"whitespace-nowrap\",\n            ),\n            cell(money(instalment.amount)),\n          );\n        }),\n        \"Nothing owed in this selection.\",\n        totalRow(\n          nameCell(\"Total\"),\n          textCell(\"\"),\n          textCell(\"\"),\n          cell(\"\"),\n          cell(money(total(rows))),\n        ),\n      );\n    },\n\n    renderCohorts(payments: Payment[]) {\n      const rows = cohortRows(\n        payments,\n        this.months(payments),\n        sales(this.data.payments),\n      ).reverse();\n      const sumBy = (pick: (cohort: (typeof rows)[number]) => number) =>\n        rows.reduce((sum, cohort) => sum + pick(cohort), 0);\n      const customers = sumBy((cohort) => cohort.customers);\n      const again = sumBy((cohort) => cohort.again);\n\n      fill(\n        this.$refs[\"cohortTable\"],\n        [\n          [\"First paid\", \"left\"],\n          [\"Customers\", \"right\"],\n          [\"First payments\", \"right\"],\n          [\"Paid since\", \"right\"],\n          [\"Total\", \"right\"],\n          [\"Paid again\", \"right\"],\n          [\"Per customer\", \"right\"],\n        ],\n        rows\n          .filter((cohort) => cohort.customers > 0)\n          .map((cohort) =>\n            row(\n              nameCell(monthLabel(cohort.month)),\n              cell(String(cohort.customers)),\n              cell(money(cohort.first)),\n              cell(money(cohort.since)),\n              cell(money(cohort.first + cohort.since), \"font-semibold\"),\n              cell(\n                `${cohort.again} (${percent(cohort.again, cohort.customers)})`,\n              ),\n              cell(money((cohort.first + cohort.since) / cohort.customers)),\n            ),\n          ),\n        \"No first payments in this selection.\",\n        totalRow(\n          nameCell(\"Total\"),\n          cell(String(customers)),\n          cell(money(sumBy((cohort) => cohort.first))),\n          cell(money(sumBy((cohort) => cohort.since))),\n          cell(money(sumBy((cohort) => cohort.first + cohort.since))),\n          cell(`${again} (${percent(again, customers)})`),\n          cell(\n            customers\n              ? money(\n                  sumBy((cohort) => cohort.first + cohort.since) / customers,\n                )\n              : \"\u2013\",\n          ),\n        ),\n      );\n    },\n\n    renderDetail(payments: Payment[]) {\n      const { current } = periodRange(this.period, this.data.today);\n      const rows = payments\n        .filter((row) => within(row.paid, current))\n        .sort((a, b) => b.paid.localeCompare(a.paid) || b.id - a.id);\n      const sold = sales(this.data.payments);\n\n      fill(\n        this.$refs[\"detailTable\"],\n        [\n          [\"Paid\", \"left\"],\n          [\"Property\", \"left\"],\n          [\"Product\", \"left\"],\n          [\"Area\", \"left\"],\n          [\"\", \"left\"],\n          [\"Amount\", \"right\"],\n        ],\n        rows.map((payment) => {\n          const project = this.data.projects[String(payment.project)];\n\n          return row(\n            nameCell(shortDate(payment.paid)),\n            propertyCell(project),\n            nameCell(payment.product, this.colourFor(payment.product)),\n            textCell(project?.place ?? \"\u2014\", project?.region ?? \"\"),\n            textCell(\n              sold.has(payment) ? `Sale \u00B7 ${saleType(this.data, payment)}` : \"\",\n              \"\",\n              \"text-gray-500 text-xs whitespace-nowrap\",\n            ),\n            cell(money(payment.amount)),\n          );\n        }),\n        \"Nothing taken in this selection.\",\n      );\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\n\nimport { TIMEZONE } from \"../dates\";\n\ninterface State extends Record<string | symbol, unknown> {\n  slot: Duration | null;\n}\n\nconst Duration = z.object({\n  start: z.string(),\n  length: z.number(),\n});\n\ntype Duration = z.infer<typeof Duration>;\n\nexport default (): AlpineComponent<State> => {\n  return {\n    slot: null,\n    date(): string {\n      if (this.slot === null) {\n        return \"\";\n      }\n\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        weekday: \"long\",\n        year: \"numeric\",\n        month: \"long\",\n        day: \"numeric\",\n      }).format(new Date(this.slot.start));\n    },\n    length(): string {\n      if (this.slot === null) {\n        return \"\";\n      }\n\n      return hours(this.slot.length);\n    },\n    start(): string {\n      if (this.slot === null) {\n        return \"\";\n      }\n\n      return new Date(this.slot.start).toISOString();\n    },\n    time(): string {\n      if (this.slot === null) {\n        return \"\";\n      }\n\n      return new Intl.DateTimeFormat(\"en-GB\", {\n        timeZone: TIMEZONE,\n        hour: \"numeric\",\n        minute: \"numeric\",\n      }).format(new Date(this.slot.start));\n    },\n  };\n};\n\nconst hours = (seconds: number): string => {\n  const halves = Math.round(seconds / 60 / 30);\n\n  const hours = Math.floor(halves / 2);\n\n  if (halves === 0) {\n    return \"less than half an hour\";\n  }\n\n  if (halves === 1) {\n    return \"half an hour\";\n  }\n\n  if (halves === 2) {\n    return \"1 hour\";\n  }\n\n  if (halves % 2 === 0) {\n    return `${hours} hours`;\n  }\n\n  return `${hours} and a half hours`;\n};\n", "// A SAP rating as people read it: a whole number, half up, and its A\u2013G band.\n// lib/sap.py is the same rule for the server; sap-rounding.json tests both.\n\nconst BANDS: readonly (readonly [string, number])[] = [\n  [\"A\", 92],\n  [\"B\", 81],\n  [\"C\", 69],\n  [\"D\", 55],\n  [\"E\", 39],\n  [\"F\", 21],\n  [\"G\", 0],\n];\n\n/** Half up, from the unrounded rating: 86.5 is 87. Also for a change in points. */\nexport function sapScore(sap: number): number {\n  return Math.floor(sap + 0.5);\n}\n\nexport function sapBand(sap: number): string {\n  const score = sapScore(sap);\n  return BANDS.find(([, floor]) => score >= floor)?.[0] ?? \"G\";\n}\n\n/** The lowest rating in a band. */\nexport function bandFloor(letter: string): number {\n  return BANDS.find(([name]) => name === letter)?.[1] ?? 0;\n}\n", "import { Point } from \"./scene\";\n\nexport function distance(a: Point, b: Point): number {\n  return Math.hypot(b[0] - a[0], b[1] - a[1]);\n}\n\nexport function polylineLength(points: Point[]): number {\n  let total = 0;\n  for (let i = 1; i < points.length; i++) {\n    const a = points[i - 1];\n    const b = points[i];\n    if (a && b) {\n      total += distance(a, b);\n    }\n  }\n  return total;\n}\n\n/** Shoelace area of a polygon in mm\u00B2 (always positive). */\nexport function polygonArea(polygon: Point[]): number {\n  let doubled = 0;\n  for (let i = 0; i < polygon.length; i++) {\n    const a = polygon[i];\n    const b = polygon[(i + 1) % polygon.length];\n    if (a && b) {\n      doubled += a[0] * b[1] - b[0] * a[1];\n    }\n  }\n  return Math.abs(doubled) / 2;\n}\n\n/** Area centroid; falls back to the vertex mean for degenerate polygons. */\nexport function polygonCentroid(polygon: Point[]): Point {\n  let doubled = 0;\n  let cx = 0;\n  let cy = 0;\n  for (let i = 0; i < polygon.length; i++) {\n    const a = polygon[i];\n    const b = polygon[(i + 1) % polygon.length];\n    if (a && b) {\n      const cross = a[0] * b[1] - b[0] * a[1];\n      doubled += cross;\n      cx += (a[0] + b[0]) * cross;\n      cy += (a[1] + b[1]) * cross;\n    }\n  }\n  if (doubled === 0) {\n    let sx = 0;\n    let sy = 0;\n    for (const [x, y] of polygon) {\n      sx += x;\n      sy += y;\n    }\n    return [sx / polygon.length, sy / polygon.length];\n  }\n  return [cx / (3 * doubled), cy / (3 * doubled)];\n}\n\nexport interface SegmentProjection {\n  /** The closest point on the segment. */\n  point: Point;\n  /** Position along the segment, clamped to [0, 1]. */\n  t: number;\n  /** Distance from the query point to `point`. */\n  distance: number;\n}\n\nexport function projectOnSegment(\n  p: Point,\n  a: Point,\n  b: Point,\n): SegmentProjection {\n  const dx = b[0] - a[0];\n  const dy = b[1] - a[1];\n  const lengthSquared = dx * dx + dy * dy;\n  const t =\n    lengthSquared === 0\n      ? 0\n      : Math.max(\n          0,\n          Math.min(\n            1,\n            ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / lengthSquared,\n          ),\n        );\n  const point: Point = [a[0] + t * dx, a[1] + t * dy];\n  return { point, t, distance: distance(p, point) };\n}\n\n/** Format a mm\u00B2 area as square metres for labels, e.g. \"12.0 m\u00B2\". */\nexport function formatAreaM2(areaMm2: number): string {\n  return `${(areaMm2 / 1_000_000).toFixed(1)} m\u00B2`;\n}\n\n/** Format a mm length as metres for labels, e.g. \"3.52 m\". */\nexport function formatLengthM(lengthMm: number): string {\n  return `${(lengthMm / 1000).toFixed(2)} m`;\n}\n", "/** Client-generated entity ids, unique enough within a single floor. */\nexport function newId(prefix: string): string {\n  const noise = Math.random().toString(36).slice(2, 8);\n  const time = Date.now().toString(36).slice(-4);\n  return `${prefix}_${time}${noise}`;\n}\n", "// The spaces walls enclose. Walls are the edges of a planar graph; walking\n// each wall's two sides, always taking the sharpest turn, traces every face.\n// Bounded faces are the spaces rooms fill; the rest is outside, and its edge\n// is the floor's outline. Pure: nothing here changes the scene.\n\nimport type { Point, Scene, Wall } from \"./scene\";\n\n/** Faces smaller than this, mm\u00B2, are rounding, not space. */\nconst NO_AREA = 1;\n\n/** A space walls enclose, with no room necessarily in it. */\nexport interface Space {\n  /** Corners in order around the space; walls with it on both sides left out. */\n  ring: string[];\n  polygon: Point[];\n  /** mm\u00B2, positive. */\n  area: number;\n}\n\n/** The floor's outer edge: one per separate building on it. */\nexport interface Outline {\n  ring: string[];\n  polygon: Point[];\n  area: number;\n  /** The walls along it. */\n  walls: string[];\n}\n\nexport interface Faces {\n  spaces: Space[];\n  outlines: Outline[];\n  /** The space each side of a wall faces, -1 for outside: [left of a\u2192b, right]. */\n  sides: Map<string, [number, number]>;\n  /** Spaces with a loop of walls standing free inside them, by index. */\n  islands: Set<number>;\n  /** Spaces inside such a loop, with the space the loop stands in. */\n  enclosedBy: Map<number, number>;\n}\n\ninterface HalfEdge {\n  wall: string;\n  from: string;\n  to: string;\n  angle: number;\n}\n\nconst key = (wall: string, from: string): string => `${wall}>${from}`;\n\nfunction signedArea(polygon: readonly Point[]): number {\n  let doubled = 0;\n  for (let index = 0; index < polygon.length; index++) {\n    const a = polygon[index] as Point;\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  }\n  return doubled / 2;\n}\n\nexport function pointInPolygon(\n  point: Point,\n  polygon: readonly Point[],\n): boolean {\n  let inside = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const [xi, yi] = polygon[i] as Point;\n    const [xj, yj] = polygon[j] as Point;\n    if (\n      yi > point[1] !== yj > point[1] &&\n      point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi) + xi\n    ) {\n      inside = !inside;\n    }\n  }\n  return inside;\n}\n\n/** Drop out-and-back runs: a wall with this face on both sides. */\nfunction withoutSpikes(cycle: HalfEdge[]): HalfEdge[] {\n  const kept: HalfEdge[] = [];\n  for (const edge of cycle) {\n    const top = kept[kept.length - 1];\n    if (top && top.wall === edge.wall && top.from === edge.to) {\n      kept.pop();\n    } else {\n      kept.push(edge);\n    }\n  }\n  while (kept.length > 1) {\n    const first = kept[0] as HalfEdge;\n    const last = kept[kept.length - 1] as HalfEdge;\n    if (first.wall !== last.wall || first.from !== last.to) {\n      break;\n    }\n    kept.shift();\n    kept.pop();\n  }\n  return kept;\n}\n\nfunction usable(scene: Scene, points: Map<string, Point>): Wall[] {\n  const seen = new Set<string>();\n  return scene.walls.filter((wall) => {\n    const pair = [wall.a, wall.b].sort().join(\"|\");\n    if (\n      wall.a === wall.b ||\n      !points.has(wall.a) ||\n      !points.has(wall.b) ||\n      seen.has(pair)\n    ) {\n      return false;\n    }\n    seen.add(pair);\n    return true;\n  });\n}\n\nexport function findFaces(scene: Scene): Faces {\n  const points = new Map(\n    scene.vertices.map((vertex) => [vertex.id, vertex.at]),\n  );\n  const walls = usable(scene, points);\n\n  const leaving = new Map<string, HalfEdge[]>();\n  const add = (wall: string, from: string, to: string): void => {\n    const a = points.get(from) as Point;\n    const b = points.get(to) as Point;\n    const list = leaving.get(from) ?? [];\n    list.push({ wall, from, to, angle: Math.atan2(b[1] - a[1], b[0] - a[0]) });\n    leaving.set(from, list);\n  };\n  for (const wall of walls) {\n    add(wall.id, wall.a, wall.b);\n    add(wall.id, wall.b, wall.a);\n  }\n  const position = new Map<string, number>();\n  for (const list of leaving.values()) {\n    list.sort((one, two) => one.angle - two.angle);\n    list.forEach((edge, index) => {\n      position.set(key(edge.wall, edge.from), index);\n    });\n  }\n\n  // Arriving along an edge, leave by the one just clockwise of coming back.\n  const next = (edge: HalfEdge): HalfEdge => {\n    const list = leaving.get(edge.to) as HalfEdge[];\n    const back = position.get(key(edge.wall, edge.to)) as number;\n    return list[(back - 1 + list.length) % list.length] as HalfEdge;\n  };\n\n  const cycleOf = new Map<string, number>();\n  const cycles: HalfEdge[][] = [];\n  for (const list of leaving.values()) {\n    for (const start of list) {\n      if (cycleOf.has(key(start.wall, start.from))) {\n        continue;\n      }\n      const cycle: HalfEdge[] = [];\n      let edge = start;\n      while (!cycleOf.has(key(edge.wall, edge.from))) {\n        cycleOf.set(key(edge.wall, edge.from), cycles.length);\n        cycle.push(edge);\n        edge = next(edge);\n      }\n      cycles.push(cycle);\n    }\n  }\n\n  // Which separate building each corner belongs to.\n  const parent = new Map<string, string>();\n  const root = (id: string): string => {\n    let at = id;\n    while (parent.has(at) && parent.get(at) !== at) {\n      at = parent.get(at) as string;\n    }\n    return at;\n  };\n  for (const wall of walls) {\n    parent.set(root(wall.a), root(wall.b));\n  }\n\n  const spaceOf = new Map<number, number>();\n  const spaces: Space[] = [];\n  const spaceBuilding: string[] = [];\n  const outer: number[] = [];\n  cycles.forEach((cycle, index) => {\n    const polygon = cycle.map((edge) => points.get(edge.from) as Point);\n    if (signedArea(polygon) > NO_AREA) {\n      const trimmed = withoutSpikes(cycle);\n      const ring = trimmed.map((edge) => edge.from);\n      const shape = ring.map((id) => points.get(id) as Point);\n      spaceOf.set(index, spaces.length);\n      spaces.push({ ring, polygon: shape, area: signedArea(shape) });\n      spaceBuilding.push(root(cycle[0]?.from as string));\n    } else {\n      outer.push(index);\n    }\n  });\n\n  // An outer edge inside another building's space is an island in it.\n  const islands = new Set<number>();\n  const standsIn = new Map<string, number>();\n  const outlines: Outline[] = [];\n  for (const index of outer) {\n    const cycle = cycles[index] as HalfEdge[];\n    const building = root(cycle[0]?.from as string);\n    const probe = points.get(cycle[0]?.from as string) as Point;\n    let container = -1;\n    spaces.forEach((space, at) => {\n      if (\n        spaceBuilding[at] !== building &&\n        pointInPolygon(probe, space.polygon) &&\n        (container < 0 || space.area < (spaces[container] as Space).area)\n      ) {\n        container = at;\n      }\n    });\n    if (container >= 0) {\n      spaceOf.set(index, container);\n      islands.add(container);\n      standsIn.set(building, container);\n      continue;\n    }\n    const trimmed = withoutSpikes(cycle);\n    const polygon = trimmed.map((edge) => points.get(edge.from) as Point);\n    const area = -signedArea(polygon);\n    if (area > NO_AREA) {\n      outlines.push({\n        ring: trimmed.map((edge) => edge.from),\n        polygon,\n        area,\n        walls: trimmed.map((edge) => edge.wall),\n      });\n    }\n  }\n\n  const sides = new Map<string, [number, number]>();\n  for (const wall of walls) {\n    const left = cycleOf.get(key(wall.id, wall.a)) as number;\n    const right = cycleOf.get(key(wall.id, wall.b)) as number;\n    sides.set(wall.id, [spaceOf.get(left) ?? -1, spaceOf.get(right) ?? -1]);\n  }\n\n  const enclosedBy = new Map<number, number>();\n  spaceBuilding.forEach((building, index) => {\n    const container = standsIn.get(building);\n    if (container !== undefined) {\n      enclosedBy.set(index, container);\n    }\n  });\n\n  return { spaces, outlines, sides, islands, enclosedBy };\n}\n\ntype Triangle = [Point, Point, Point];\n\nconst cross = (o: Point, a: Point, b: Point): number =>\n  (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);\n\n/** Cut a simple polygon into triangles by clipping ears; null if it isn't\n * simple enough to. Corners in a straight line are cut away as flat ears. */\nexport function triangulate(polygon: readonly Point[]): Triangle[] | null {\n  const ring = signedArea(polygon) >= 0 ? [...polygon] : [...polygon].reverse();\n  const triangles: Triangle[] = [];\n  while (ring.length > 3) {\n    let clipped = false;\n    for (let index = 0; index < ring.length; index++) {\n      const a = ring[(index - 1 + ring.length) % ring.length] as Point;\n      const b = ring[index] as Point;\n      const c = ring[(index + 1) % ring.length] as Point;\n      const turn = cross(a, b, c);\n      if (turn < 0) {\n        continue;\n      }\n      const blocked =\n        turn > 0 &&\n        ring.some(\n          (p) =>\n            p !== a &&\n            p !== b &&\n            p !== c &&\n            cross(a, b, p) >= 0 &&\n            cross(b, c, p) >= 0 &&\n            cross(c, a, p) >= 0,\n        );\n      if (blocked) {\n        continue;\n      }\n      if (turn > 0) {\n        triangles.push([a, b, c]);\n      }\n      ring.splice(index, 1);\n      clipped = true;\n      break;\n    }\n    if (!clipped) {\n      return null;\n    }\n  }\n  if (ring.length === 3 && signedArea(ring) > 0) {\n    triangles.push(ring as Triangle);\n  }\n  return triangles;\n}\n\n/** What of `subject` lies inside a triangle, by Sutherland\u2013Hodgman: exact in\n * area for any subject, as the clip is convex. */\nfunction clipToTriangle(\n  subject: readonly Point[],\n  triangle: Triangle,\n): Point[] {\n  let output = [...subject];\n  for (let edge = 0; edge < 3 && output.length > 0; edge++) {\n    const p = triangle[edge] as Point;\n    const q = triangle[(edge + 1) % 3] as Point;\n    const inside = (point: Point): boolean => cross(p, q, point) >= 0;\n    const input = output;\n    output = [];\n    for (let index = 0; index < input.length; index++) {\n      const current = input[index] as Point;\n      const previous = input[\n        (index - 1 + input.length) % input.length\n      ] as Point;\n      if (inside(current)) {\n        if (!inside(previous)) {\n          output.push(meet(previous, current, p, q));\n        }\n        output.push(current);\n      } else if (inside(previous)) {\n        output.push(meet(previous, current, p, q));\n      }\n    }\n  }\n  return output;\n}\n\nfunction meet(a: Point, b: Point, p: Point, q: Point): Point {\n  const one = cross(p, q, a);\n  const two = cross(p, q, b);\n  const t = one / (one - two);\n  return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];\n}\n\n/** A polygon cut into triangles, ready to measure overlaps against. */\nexport interface Measured {\n  polygon: Point[];\n  area: number;\n  triangles: Triangle[] | null;\n}\n\nexport function measure(polygon: readonly Point[]): Measured {\n  return {\n    polygon: [...polygon],\n    area: Math.abs(signedArea(polygon)),\n    triangles: triangulate(polygon),\n  };\n}\n\n/** mm\u00B2 of `shape` inside `other`. Exact for a simple shape; for one that\n * isn't, the share of its corners inside, which is near enough to rank by. */\nexport function overlapArea(shape: Measured, other: readonly Point[]): number {\n  if (other.length < 3 || shape.area === 0) {\n    return 0;\n  }\n  if (shape.triangles) {\n    let total = 0;\n    for (const triangle of shape.triangles) {\n      total += Math.abs(signedArea(clipToTriangle(other, triangle)));\n    }\n    return Math.min(total, shape.area);\n  }\n  const inside = shape.polygon.filter((point) =>\n    pointInPolygon(point, other),\n  ).length;\n  return (shape.area * inside) / shape.polygon.length;\n}\n", "// Walls are the drawing; rooms are the spaces they enclose (faces.ts). The\n// only code that adds or removes vertices, walls and rooms. Drags only move\n// points; `settle` tidies the walls and finds the rooms when the gesture ends,\n// so ids stay stable mid-drag.\n\nimport {\n  type Faces,\n  findFaces,\n  type Space,\n  type Measured,\n  measure,\n  overlapArea,\n  pointInPolygon,\n} from \"./faces\";\nimport { distance, polygonArea } from \"./geometry\";\nimport { newId } from \"./ids\";\nimport type {\n  ChimneyBreast,\n  Point,\n  Radiator,\n  Room,\n  Scene,\n  Wall,\n} from \"./scene\";\n\n/** Absorbs the rounding of a point part-way along a diagonal. */\nexport const WELD_MM = 1;\n\n/** Corners closer than this are one corner. */\nexport const CORNER_MM = 20;\n\nexport const DEFAULT_WALL_THICKNESS = 275;\n\n/** What a new wall between two rooms is given. */\nexport const PARTITION_THICKNESS = 100;\n\n/** Walls within this of each other's direction run alongside. */\nconst ALONGSIDE = Math.sin((1 * Math.PI) / 180);\n\n/** A space narrower than this on average is a gap between walls, mm. */\nconst SLIVER_MM = 100;\n\n/** Spaces smaller than this, mm\u00B2, are left empty rather than made rooms. */\nconst SMALLEST_ROOM = 100_000;\n\n/** Enough for one tidy to settle what the last uncovered. */\nconst PASSES = 6;\n\n/** What hangs on a wall at an offset along it, on one room's side: radiators\n * and chimney breasts. Edits to the walls carry them along. */\nfunction hung(scene: Scene): (Radiator | ChimneyBreast)[] {\n  return [\n    ...scene.emitters.filter(\n      (emitter): emitter is Radiator => emitter.kind === \"radiator\",\n    ),\n    ...(scene.features ?? []).filter(\n      (feature): feature is ChimneyBreast => feature.kind === \"chimney_breast\",\n    ),\n  ];\n}\n\nexport function pointOf(scene: Scene, id: string): Point | undefined {\n  return scene.vertices.find((vertex) => vertex.id === id)?.at;\n}\n\nexport function wallEnds(scene: Scene, wall: Wall): [Point, Point] | null {\n  const a = pointOf(scene, wall.a);\n  const b = pointOf(scene, wall.b);\n  return a && b ? [a, b] : null;\n}\n\nexport function polygonOf(scene: Scene, room: Room): Point[] {\n  const points: Point[] = [];\n  for (const id of room.boundary) {\n    const at = pointOf(scene, id);\n    if (at) {\n      points.push(at);\n    }\n  }\n  return points;\n}\n\nexport function findWall(scene: Scene, u: string, v: string): Wall | undefined {\n  return scene.walls.find(\n    (wall) => (wall.a === u && wall.b === v) || (wall.a === v && wall.b === u),\n  );\n}\n\nexport function roomsOn(scene: Scene, wallId: string): Room[] {\n  return scene.rooms.filter((room) =>\n    room.boundary.some(\n      (vertex, index) =>\n        findWall(\n          scene,\n          vertex,\n          room.boundary[(index + 1) % room.boundary.length] ?? \"\",\n        )?.id === wallId,\n    ),\n  );\n}\n\n/** A new wall's thickness until it settles: then partition or outside wall. */\nconst UNSET = 0;\n\nfunction thicknessOf(wall: Wall): number {\n  return wall.thickness || PARTITION_THICKNESS;\n}\n\nfunction holders(scene: Scene): Map<string, Room[]> {\n  const byPair = new Map<string, string>();\n  for (const wall of scene.walls) {\n    byPair.set([wall.a, wall.b].sort().join(\"|\"), wall.id);\n  }\n  const held = new Map<string, Room[]>(\n    scene.walls.map((wall) => [wall.id, []]),\n  );\n  for (const room of scene.rooms) {\n    for (let index = 0; index < room.boundary.length; index++) {\n      const from = room.boundary[index] as string;\n      const to = room.boundary[(index + 1) % room.boundary.length] as string;\n      const wallId = byPair.get([from, to].sort().join(\"|\"));\n      const list = wallId ? held.get(wallId) : undefined;\n      if (list && !list.includes(room)) {\n        list.push(room);\n      }\n    }\n  }\n  return held;\n}\n\n/** INTERNAL between two rooms unless just one is heated; else PARTY or\n * EXTERNAL. A wall no room runs along is INTERNAL only as a nib in a room:\n * onto outside or an empty space, which counts as unheated, it's EXTERNAL,\n * as the drawings and heat loss have it. */\nexport function wallKinds(scene: Scene): Map<string, string> {\n  const held = holders(scene);\n  let faces: Faces | null = null;\n  let roomed = new Set<number>();\n  const kinds = new Map<string, string>();\n  for (const wall of scene.walls) {\n    const mine = held.get(wall.id) ?? [];\n    if (mine.length === 2) {\n      const heated = mine.filter((room) => room.heated !== false).length;\n      kinds.set(wall.id, heated === 1 ? \"EXTERNAL\" : \"INTERNAL\");\n    } else if (mine.length === 1 || wall.party) {\n      kinds.set(wall.id, wall.party ? \"PARTY\" : \"EXTERNAL\");\n    } else {\n      if (!faces) {\n        faces = findFaces(scene);\n        roomed = new Set(spacesOfRooms(scene, faces).values());\n      }\n      const sides = faces.sides.get(wall.id) ?? [-1, -1];\n      kinds.set(\n        wall.id,\n        sides.every((side) => roomed.has(side)) ? \"INTERNAL\" : \"EXTERNAL\",\n      );\n    }\n  }\n  return kinds;\n}\n\nexport function wallKind(scene: Scene, wallId: string): string {\n  return wallKinds(scene).get(wallId) ?? \"EXTERNAL\";\n}\n\n/** Where `point` sits along a\u2192b, if strictly between them and within\n * `across` of the line. */\nfunction alongSegment(\n  point: Point,\n  a: Point,\n  b: Point,\n  across = WELD_MM,\n): number | null {\n  const length = distance(a, b);\n  if (length <= 0) {\n    return null;\n  }\n  const dx = (b[0] - a[0]) / length;\n  const dy = (b[1] - a[1]) / length;\n  const along = (point[0] - a[0]) * dx + (point[1] - a[1]) * dy;\n  const off = (point[0] - a[0]) * dy - (point[1] - a[1]) * dx;\n  if (Math.abs(off) > across) {\n    return null;\n  }\n  return along > WELD_MM && along < length - WELD_MM ? along : null;\n}\n\n/** The vertex at this point, adding one if there is none. */\nexport function vertexAt(scene: Scene, at: Point): string {\n  const existing = scene.vertices.find(\n    (vertex) => distance(vertex.at, at) <= WELD_MM,\n  );\n  if (existing) {\n    return existing.id;\n  }\n  const id = newId(\"v\");\n  scene.vertices.push({ id, at: [Math.round(at[0]), Math.round(at[1])] });\n  return id;\n}\n\n/** Split a wall at a point along it, in every room that holds it. The first\n * half keeps the id; openings, radiators and breasts past the split rebase. */\nexport function splitWall(\n  scene: Scene,\n  wallId: string,\n  at: Point,\n): { vertex: string; walls: [string, string] } | null {\n  const wall = scene.walls.find((candidate) => candidate.id === wallId);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!wall || !ends) {\n    return null;\n  }\n  const along = alongSegment(at, ends[0], ends[1]);\n  if (along === null) {\n    return null;\n  }\n\n  const middle = vertexAt(scene, at);\n  const far = wall.b;\n  wall.b = middle;\n\n  const second: Wall = { ...wall, id: newId(\"w\"), a: middle, b: far };\n  scene.walls.push(second);\n\n  // Openings and radiators go with the half holding their middle, so a wall\n  // drawn up to a window moves it aside rather than losing it; normalising\n  // clamps them on to their half, and drops one too wide for it.\n  for (const opening of scene.openings) {\n    if (\n      opening.wall === wallId &&\n      opening.offset + opening.width / 2 >= along\n    ) {\n      opening.wall = second.id;\n      opening.offset = Math.max(0, Math.round(opening.offset - along));\n    }\n  }\n  for (const emitter of hung(scene)) {\n    if (\n      emitter.wall === wallId &&\n      emitter.offset + emitter.length / 2 >= along\n    ) {\n      emitter.wall = second.id;\n      emitter.offset = Math.max(0, Math.round(emitter.offset - along));\n    }\n  }\n  for (const fixture of scene.fixtures ?? []) {\n    if (\n      fixture.wall === wallId &&\n      fixture.offset !== undefined &&\n      fixture.offset >= along\n    ) {\n      fixture.wall = second.id;\n      fixture.offset = Math.max(0, Math.round(fixture.offset - along));\n    }\n  }\n\n  for (const room of scene.rooms) {\n    const index = room.boundary.findIndex(\n      (vertex, position) =>\n        (vertex === wall.a &&\n          room.boundary[(position + 1) % room.boundary.length] === far) ||\n        (vertex === far &&\n          room.boundary[(position + 1) % room.boundary.length] === wall.a),\n    );\n    if (index >= 0) {\n      room.boundary.splice(index + 1, 0, middle);\n    }\n  }\n\n  return { vertex: middle, walls: [wall.id, second.id] };\n}\n\n/** Add walls along a path, as drawn: `settle` then joins them to the rest.\n * A new wall's thickness waits on whether it ends up between rooms. */\nexport function addWalls(\n  scene: Scene,\n  path: readonly Point[],\n  closed = false,\n): void {\n  const ids: string[] = [];\n  for (const point of path) {\n    const id = vertexAt(scene, point);\n    if (ids[ids.length - 1] !== id) {\n      ids.push(id);\n    }\n  }\n  if (closed && ids.length > 1 && ids[0] === ids[ids.length - 1]) {\n    ids.pop();\n  }\n  const count = closed && ids.length > 2 ? ids.length : ids.length - 1;\n  for (let index = 0; index < count; index++) {\n    const a = ids[index] as string;\n    const b = ids[(index + 1) % ids.length] as string;\n    if (a !== b && !findWall(scene, a, b)) {\n      scene.walls.push({\n        id: newId(\"w\"),\n        a,\n        b,\n        thickness: UNSET,\n        fabric: null,\n        party: false,\n      });\n    }\n  }\n}\n\n/** Draw a run of walls and settle them into the plan. */\nexport function drawWalls(\n  scene: Scene,\n  path: readonly Point[],\n  closed = false,\n): Settled {\n  const empties = emptySpaces(scene);\n  addWalls(scene, path, closed);\n  return settle(scene, { empties });\n}\n\n/** The room the point is in, the smallest if rooms overlap. */\nexport function roomAt(scene: Scene, point: Point): Room | undefined {\n  let best: Room | undefined;\n  let bestArea = Number.POSITIVE_INFINITY;\n  for (const room of scene.rooms) {\n    const polygon = polygonOf(scene, room);\n    const area = polygonArea(polygon);\n    if (area < bestArea && pointInPolygon(point, polygon)) {\n      best = room;\n      bestArea = area;\n    }\n  }\n  return best;\n}\n\nfunction distinctCorners(path: readonly Point[]): number {\n  return new Set(path.map(([x, y]) => `${Math.round(x)}|${Math.round(y)}`))\n    .size;\n}\n\n/** Draw a room's walls; the space they enclose becomes the room. Returns its\n * id, or an existing room's if the walls only went round one. */\nexport function insertRoom(\n  scene: Scene,\n  path: readonly Point[],\n  fields: Partial<Room> = {},\n): string | null {\n  if (distinctCorners(path) < 3 || polygonArea([...path]) <= 0) {\n    return null;\n  }\n  const empties = emptySpaces(scene);\n  addWalls(scene, path, true);\n  return settle(scene, { empties, claim: { polygon: [...path], fields } })\n    .claimed;\n}\n\n/** Make an empty space a room. */\nexport function placeRoom(\n  scene: Scene,\n  point: Point,\n  fields: Partial<Room> = {},\n): string | null {\n  const space = emptySpaceAt(scene, point);\n  if (!space) {\n    return null;\n  }\n  const id = newId(\"r\");\n  scene.rooms.push({ ...blankRoom(id, space.ring), ...fields, id });\n  return id;\n}\n\nfunction blankRoom(id: string, boundary: string[]): Room {\n  return {\n    id,\n    name: \"\",\n    room_type: \"\",\n    boundary,\n    ceiling_height: null,\n    heated: true,\n  };\n}\n\nfunction sameCycle(one: readonly string[], two: readonly string[]): boolean {\n  if (one.length !== two.length || one.length === 0) {\n    return false;\n  }\n  const start = two.indexOf(one[0] as string);\n  if (start < 0) {\n    return false;\n  }\n  const n = one.length;\n  const forward = one.every((id, index) => two[(start + index) % n] === id);\n  const backward = one.every(\n    (id, index) => two[(start - index + n * 2) % n] === id,\n  );\n  return forward || backward;\n}\n\n/** The space index each room fills, where its corners go round one exactly. */\nfunction spacesOfRooms(scene: Scene, faces: Faces): Map<string, number> {\n  const found = new Map<string, number>();\n  for (const room of scene.rooms) {\n    const index = faces.spaces.findIndex((space) =>\n      sameCycle(room.boundary, space.ring),\n    );\n    if (index >= 0) {\n      found.set(room.id, index);\n    }\n  }\n  return found;\n}\n\n/** The spaces walls enclose that no room fills. */\nexport function unroomedSpaces(\n  scene: Scene,\n  faces = findFaces(scene),\n): Space[] {\n  const filled = new Set(spacesOfRooms(scene, faces).values());\n  return faces.spaces.filter((_, index) => !filled.has(index));\n}\n\nexport function emptySpaces(scene: Scene): Point[][] {\n  return unroomedSpaces(scene).map((space) => space.polygon);\n}\n\n/** Rooms with a loop of walls standing free inside them, which their area\n * takes in. */\nexport function roomsWithIslands(scene: Scene): Room[] {\n  const faces = findFaces(scene);\n  const found = spacesOfRooms(scene, faces);\n  return scene.rooms.filter((room) =>\n    faces.islands.has(found.get(room.id) ?? -1),\n  );\n}\n\nexport interface OutlineFigures {\n  /** mm\u00B2, inside the outside walls' centrelines. */\n  area: number;\n  /** mm along the outside walls' centrelines. */\n  perimeter: number;\n  party: number;\n  empties: number;\n}\n\n/** The floor's outline in figures: what's inside it and how much is exposed. */\nexport function outlineFigures(scene: Scene): OutlineFigures {\n  const faces = findFaces(scene);\n  const walls = new Map(scene.walls.map((wall) => [wall.id, wall]));\n  let area = 0;\n  let perimeter = 0;\n  let party = 0;\n  for (const outline of faces.outlines) {\n    area += outline.area;\n    for (const id of outline.walls) {\n      const wall = walls.get(id);\n      const ends = wall ? wallEnds(scene, wall) : null;\n      const length = ends ? distance(ends[0], ends[1]) : 0;\n      perimeter += length;\n      if (wall?.party) {\n        party += length;\n      }\n    }\n  }\n  return {\n    area,\n    perimeter,\n    party,\n    empties: unroomedSpaces(scene, faces).length,\n  };\n}\n\nexport function emptySpaceAt(\n  scene: Scene,\n  point: Point,\n): { ring: string[]; polygon: Point[] } | null {\n  const faces = findFaces(scene);\n  const filled = new Set(spacesOfRooms(scene, faces).values());\n  let best: { ring: string[]; polygon: Point[]; area: number } | null = null;\n  faces.spaces.forEach((space, index) => {\n    if (\n      !filled.has(index) &&\n      pointInPolygon(point, space.polygon) &&\n      (!best || space.area < best.area)\n    ) {\n      best = space;\n    }\n  });\n  return best;\n}\n\nfunction roomPolygons(scene: Scene): Map<string, Point[]> {\n  return new Map(scene.rooms.map((room) => [room.id, polygonOf(scene, room)]));\n}\n\n/** Remove the room only: its walls stay, round an empty space. A sliver of\n * room the survey left goes with its walls, as settling closes it. */\nexport function deleteRoom(scene: Scene, roomId: string): void {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  if (!room) {\n    return;\n  }\n  const empties = [...emptySpaces(scene), polygonOf(scene, room)];\n  scene.rooms = scene.rooms.filter((candidate) => candidate.id !== roomId);\n  settle(scene, { empties });\n}\n\n/** Remove a room with the walls only it had: its outside walls and any inside\n * it. Walls it shared with a room stay, now on the outside. */\nexport function removeRoomWithWalls(scene: Scene, roomId: string): void {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  if (!room) {\n    return;\n  }\n  const faces = findFaces(scene);\n  const space = spacesOfRooms(scene, faces).get(roomId);\n  const roomed = new Set(spacesOfRooms(scene, faces).values());\n  const empties = [...emptySpaces(scene), polygonOf(scene, room)];\n  const rooms = roomPolygons(scene);\n  rooms.delete(roomId);\n  const going = new Set<string>();\n  if (space !== undefined) {\n    for (const [wallId, [left, right]] of faces.sides) {\n      if (left !== space && right !== space) {\n        continue;\n      }\n      const other: number = left === space ? right : left;\n      if (other === -1 || other === space || !roomed.has(other)) {\n        going.add(wallId);\n      }\n    }\n  }\n  scene.rooms = scene.rooms.filter((candidate) => candidate.id !== roomId);\n  removeWalls(scene, going);\n  settle(scene, { empties, rooms });\n}\n\n/** The rooms sharing a wall with this one, the longest shared first. */\nexport function neighbours(\n  scene: Scene,\n  roomId: string,\n): { room: Room; length: number }[] {\n  const shared = new Map<string, number>();\n  for (const [wallId, rooms] of holders(scene)) {\n    if (!rooms.some((room) => room.id === roomId)) {\n      continue;\n    }\n    const wall = scene.walls.find((candidate) => candidate.id === wallId);\n    const ends = wall ? wallEnds(scene, wall) : null;\n    for (const room of rooms) {\n      if (room.id !== roomId && ends) {\n        shared.set(\n          room.id,\n          (shared.get(room.id) ?? 0) + distance(ends[0], ends[1]),\n        );\n      }\n    }\n  }\n  return scene.rooms\n    .filter((room) => shared.has(room.id))\n    .map((room) => ({ room, length: shared.get(room.id) as number }))\n    .sort((one, two) => two.length - one.length);\n}\n\n/** The larger of two rooms first: the one a merge keeps, whichever side it was\n * started from, as taking down the wall between them does. */\nexport function largerFirst(\n  scene: Scene,\n  one: string,\n  two: string,\n): [string, string] {\n  const polygons = roomPolygons(scene);\n  const area = (id: string) => polygonArea(polygons.get(id) ?? []);\n  return area(two) > area(one) ? [two, one] : [one, two];\n}\n\n/** Knock through: take down the walls between two rooms. `keep` keeps its\n * name and settings, and takes over the other's radiators. */\nexport function mergeRooms(scene: Scene, keep: string, other: string): boolean {\n  const between = new Set(\n    [...holders(scene)]\n      .filter(\n        ([, rooms]) =>\n          rooms.some((room) => room.id === keep) &&\n          rooms.some((room) => room.id === other),\n      )\n      .map(([wallId]) => wallId),\n  );\n  if (between.size === 0) {\n    return false;\n  }\n  const empties = emptySpaces(scene);\n  const rooms = roomPolygons(scene);\n  removeWalls(scene, between);\n  settle(scene, { empties, keep, rooms });\n  return true;\n}\n\n/** Take down the walls along `path`, corner ids in order, and join its ends\n * with one wall built as `like`: a jog in a wall's line straightened. */\nexport function straightenPath(\n  scene: Scene,\n  path: readonly string[],\n  like: string,\n): boolean {\n  const template = scene.walls.find((wall) => wall.id === like);\n  const first = path[0];\n  const last = path[path.length - 1];\n  if (!template || !first || !last || path.length < 3 || first === last) {\n    return false;\n  }\n  const going = new Set<string>();\n  for (let index = 0; index + 1 < path.length; index++) {\n    const wall = findWall(scene, path[index] ?? \"\", path[index + 1] ?? \"\");\n    if (!wall) {\n      return false;\n    }\n    going.add(wall.id);\n  }\n  const empties = emptySpaces(scene);\n  const rooms = roomPolygons(scene);\n  scene.walls = scene.walls.filter((wall) => !going.has(wall.id));\n  scene.openings = scene.openings.filter((opening) => !going.has(opening.wall));\n  scene.walls.push({ ...template, id: newId(\"w\"), a: first, b: last });\n  settle(scene, { empties, rooms });\n  return true;\n}\n\n/** Take a wall down. Two rooms either side become one, the larger keeping its\n * name; a room left open to the outside is no longer a room. */\nexport function removeWall(scene: Scene, wallId: string): void {\n  removeWallSet(scene, new Set([wallId]));\n}\n\n/** Take several walls down together, settling once at the end: healing one\n * at a time would merge and renumber walls still to go. */\nexport function removeWallSet(scene: Scene, ids: ReadonlySet<string>): void {\n  const empties = emptySpaces(scene);\n  const rooms = roomPolygons(scene);\n  removeWalls(scene, ids);\n  settle(scene, { empties, rooms });\n}\n\nfunction removeWalls(scene: Scene, ids: ReadonlySet<string>): void {\n  const ends = new Set<string>();\n  for (const wall of scene.walls) {\n    if (ids.has(wall.id)) {\n      ends.add(wall.a);\n      ends.add(wall.b);\n    }\n  }\n  scene.walls = scene.walls.filter((wall) => !ids.has(wall.id));\n  scene.openings = scene.openings.filter((opening) => !ids.has(opening.wall));\n  for (const vertex of ends) {\n    healVertex(scene, vertex);\n  }\n}\n\n/** Where a line through a and b crosses the room, extended to its walls. */\nexport function chordThrough(\n  polygon: readonly Point[],\n  a: Point,\n  b: Point,\n): [Point, Point] | null {\n  const dx = b[0] - a[0];\n  const dy = b[1] - a[1];\n  const length = Math.hypot(dx, dy);\n  if (length < CORNER_MM || polygon.length < 3) {\n    return null;\n  }\n  const crossings: number[] = [];\n  for (let index = 0; index < polygon.length; index++) {\n    const p = polygon[index] as Point;\n    const q = polygon[(index + 1) % polygon.length] as Point;\n    const ex = q[0] - p[0];\n    const ey = q[1] - p[1];\n    const denominator = dx * ey - dy * ex;\n    if (Math.abs(denominator) < 1e-9) {\n      continue;\n    }\n    const t = ((p[0] - a[0]) * ey - (p[1] - a[1]) * ex) / denominator;\n    const u = ((p[0] - a[0]) * dy - (p[1] - a[1]) * dx) / denominator;\n    if (u >= -1e-9 && u <= 1 + 1e-9) {\n      crossings.push(t);\n    }\n  }\n  crossings.sort((one, two) => one - two);\n  const at = (t: number): Point => [a[0] + t * dx, a[1] + t * dy];\n  let best: [number, number] | null = null;\n  let bestGap = Number.POSITIVE_INFINITY;\n  for (let index = 0; index + 1 < crossings.length; index++) {\n    const from = crossings[index] as number;\n    const to = crossings[index + 1] as number;\n    if (\n      (to - from) * length < CORNER_MM ||\n      !pointInPolygon(at((from + to) / 2), polygon)\n    ) {\n      continue;\n    }\n    // The stretch of the line inside the room nearest the middle of the click.\n    const gap =\n      from <= 0.5 && to >= 0.5\n        ? 0\n        : Math.min(Math.abs(from - 0.5), Math.abs(to - 0.5));\n    if (gap < bestGap) {\n      best = [from, to];\n      bestGap = gap;\n    }\n  }\n  if (!best) {\n    return null;\n  }\n  const round = (point: Point): Point => [\n    Math.round(point[0]),\n    Math.round(point[1]),\n  ];\n  return [round(at(best[0])), round(at(best[1]))];\n}\n\n/** Split a room with a partition along the line through a and b, run on to\n * its walls. The larger part keeps the room; returns the other's new id. */\nexport function splitRoom(\n  scene: Scene,\n  roomId: string,\n  a: Point,\n  b: Point,\n): string | null {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  const chord = room ? chordThrough(polygonOf(scene, room), a, b) : null;\n  if (!room || !chord) {\n    return null;\n  }\n  const empties = emptySpaces(scene);\n  const from = vertexAt(scene, chord[0]);\n  const to = vertexAt(scene, chord[1]);\n  if (findWall(scene, from, to)) {\n    return null;\n  }\n  scene.walls.push({\n    id: newId(\"w\"),\n    a: from,\n    b: to,\n    thickness: PARTITION_THICKNESS,\n    fabric: null,\n    party: false,\n  });\n  return settle(scene, { empties, keep: roomId }).created[0] ?? null;\n}\n\n/** Give a room its own walls so it can move rigidly: walls and corners it\n * shares are copied, its outside walls go with it, and `settle` joins them\n * again wherever it lands. Returns the corners to move. */\nexport function detachRoom(scene: Scene, roomId: string): string[] {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  if (!room) {\n    return [];\n  }\n  const faces = findFaces(scene);\n  const space = spacesOfRooms(scene, faces).get(roomId);\n  const held = holders(scene);\n  const before = [...room.boundary];\n  const edges = before.map((from, index) =>\n    findWall(scene, from, before[(index + 1) % before.length] as string),\n  );\n\n  // Its own walls: those on its edge with outside beyond, and any inside it.\n  const own = new Set<string>();\n  for (const wall of edges) {\n    if (!wall || (held.get(wall.id) ?? []).length !== 1) {\n      continue;\n    }\n    if (space === undefined || faces.sides.get(wall.id)?.includes(-1)) {\n      own.add(wall.id);\n    }\n  }\n  const moving = new Set(before);\n  if (space !== undefined) {\n    for (const wall of scene.walls) {\n      const [left, right] = faces.sides.get(wall.id) ?? [-1, -1];\n      if (left === space && right === space) {\n        own.add(wall.id);\n        moving.add(wall.a);\n        moving.add(wall.b);\n      }\n    }\n  }\n\n  // A corner a wall staying behind ends at gets a copy that moves instead.\n  const clones = new Map<string, string>();\n  for (const id of moving) {\n    const tied = scene.walls.some(\n      (wall) => (wall.a === id || wall.b === id) && !own.has(wall.id),\n    );\n    const at = pointOf(scene, id);\n    if (tied && at) {\n      const clone = newId(\"v\");\n      scene.vertices.push({ id: clone, at: [at[0], at[1]] });\n      clones.set(id, clone);\n    }\n  }\n  const mapped = (id: string): string => clones.get(id) ?? id;\n  for (const wall of scene.walls) {\n    if (own.has(wall.id)) {\n      wall.a = mapped(wall.a);\n      wall.b = mapped(wall.b);\n    }\n  }\n  room.boundary = before.map(mapped);\n\n  edges.forEach((source, index) => {\n    const from = before[index] as string;\n    const to = before[(index + 1) % before.length] as string;\n    if (\n      !source ||\n      own.has(source.id) ||\n      findWall(scene, mapped(from), mapped(to))\n    ) {\n      return;\n    }\n    const id = newId(\"w\");\n    scene.walls.push({\n      id,\n      a: mapped(from),\n      b: mapped(to),\n      thickness: source.thickness,\n      fabric: source.fabric ?? null,\n      party: source.party ?? false,\n    });\n    // The room's radiators come with it; a neighbour's stay behind.\n    const ends = wallEnds(scene, source);\n    const length = ends ? distance(ends[0], ends[1]) : 0;\n    for (const emitter of hung(scene)) {\n      if (emitter.room === roomId && emitter.wall === source.id) {\n        emitter.wall = id;\n        if (source.a !== from) {\n          emitter.offset = Math.round(\n            length - (emitter.offset + emitter.length),\n          );\n        }\n      }\n    }\n    for (const fixture of scene.fixtures ?? []) {\n      if (fixture.room === roomId && fixture.wall === source.id) {\n        fixture.wall = id;\n        if (source.a !== from && fixture.offset !== undefined) {\n          fixture.offset = Math.round(length - fixture.offset);\n        }\n      }\n    }\n  });\n\n  return [...moving].map(mapped);\n}\n\nexport function translateVertices(\n  scene: Scene,\n  ids: Iterable<string>,\n  dx: number,\n  dy: number,\n): void {\n  const moving = new Set(ids);\n  for (const vertex of scene.vertices) {\n    if (moving.has(vertex.id)) {\n      vertex.at = [\n        Math.round(vertex.at[0] + dx),\n        Math.round(vertex.at[1] + dy),\n      ];\n    }\n  }\n}\n\nexport function setVertexAt(scene: Scene, id: string, at: Point): void {\n  for (const vertex of scene.vertices) {\n    if (vertex.id === id) {\n      vertex.at = [Math.round(at[0]), Math.round(at[1])];\n    }\n  }\n}\n\n/** Merge `from` into `into`; walls left spanning the same corners fuse. */\nexport function mergeVertices(scene: Scene, from: string, into: string): void {\n  if (from === into) {\n    return;\n  }\n\n  for (const wall of scene.walls) {\n    if (wall.a === from) {\n      wall.a = into;\n    }\n    if (wall.b === from) {\n      wall.b = into;\n    }\n  }\n  for (const room of scene.rooms) {\n    room.boundary = room.boundary.map((id) => (id === from ? into : id));\n  }\n  scene.vertices = scene.vertices.filter((vertex) => vertex.id !== from);\n  normalizeScene(scene);\n}\n\n/** Walls spanning the same two corners become one, keeping a settled wall's\n * thickness over a newly drawn one's. */\nfunction fuseDuplicates(scene: Scene): boolean {\n  const survivors = new Map<string, Wall>();\n  const fused = new Set<string>();\n  for (const wall of scene.walls) {\n    const key = [wall.a, wall.b].sort().join(\"|\");\n    const existing = survivors.get(key);\n    if (!existing) {\n      survivors.set(key, wall);\n      continue;\n    }\n    if (existing.thickness === UNSET && wall.thickness !== UNSET) {\n      fuseInto(scene, wall, existing);\n      fused.add(existing.id);\n      survivors.set(key, wall);\n    } else {\n      fuseInto(scene, existing, wall);\n      fused.add(wall.id);\n    }\n  }\n  scene.walls = scene.walls.filter((wall) => !fused.has(wall.id));\n  return fused.size > 0;\n}\n\n/** Move `losing`'s openings onto `keeping`, mirrored if it runs the other way. */\nfunction fuseInto(scene: Scene, keeping: Wall, losing: Wall): void {\n  const ends = wallEnds(scene, keeping);\n  if (!ends) {\n    return;\n  }\n  const length = distance(ends[0], ends[1]);\n  const reversed = keeping.a !== losing.a;\n\n  for (const opening of scene.openings) {\n    if (opening.wall !== losing.id) {\n      continue;\n    }\n    opening.wall = keeping.id;\n    if (reversed) {\n      opening.offset = Math.round(length - (opening.offset + opening.width));\n    }\n  }\n  for (const emitter of hung(scene)) {\n    if (emitter.wall !== losing.id) {\n      continue;\n    }\n    emitter.wall = keeping.id;\n    if (reversed) {\n      emitter.offset = Math.round(length - (emitter.offset + emitter.length));\n    }\n  }\n}\n\n/** Join two walls meeting in a straight line at a corner nothing else uses,\n * if they're built alike. Openings and radiators keep their places. */\nfunction healVertex(scene: Scene, vertexId: string): boolean {\n  const meeting = scene.walls.filter(\n    (wall) => wall.a === vertexId || wall.b === vertexId,\n  );\n  if (meeting.length !== 2) {\n    return false;\n  }\n  const [one, two] = meeting as [Wall, Wall];\n  if (\n    one.thickness !== two.thickness ||\n    (one.fabric ?? null) !== (two.fabric ?? null) ||\n    Boolean(one.party) !== Boolean(two.party)\n  ) {\n    return false;\n  }\n  const middle = pointOf(scene, vertexId);\n  const p = one.a === vertexId ? one.b : one.a;\n  const q = two.a === vertexId ? two.b : two.a;\n  const start = pointOf(scene, p);\n  const end = pointOf(scene, q);\n  if (!middle || !start || !end || p === q) {\n    return false;\n  }\n  const first = distance(start, middle);\n  const second = distance(middle, end);\n  if (\n    alongSegment(middle, start, end) === null ||\n    first === 0 ||\n    second === 0\n  ) {\n    return false;\n  }\n\n  // The joined wall runs p \u2192 q; place everything along it from p.\n  const place = (wall: Wall, offset: number, width: number): number => {\n    if (wall === one) {\n      return wall.a === p ? offset : first - (offset + width);\n    }\n    return wall.a === vertexId\n      ? first + offset\n      : first + second - (offset + width);\n  };\n  for (const opening of scene.openings) {\n    if (opening.wall === one.id || opening.wall === two.id) {\n      opening.offset = Math.round(\n        place(\n          opening.wall === one.id ? one : two,\n          opening.offset,\n          opening.width,\n        ),\n      );\n      opening.wall = one.id;\n    }\n  }\n  for (const emitter of hung(scene)) {\n    if (emitter.wall === one.id || emitter.wall === two.id) {\n      emitter.offset = Math.round(\n        place(\n          emitter.wall === one.id ? one : two,\n          emitter.offset,\n          emitter.length,\n        ),\n      );\n      emitter.wall = one.id;\n    }\n  }\n\n  one.a = p;\n  one.b = q;\n  scene.walls = scene.walls.filter((wall) => wall !== two);\n  for (const room of scene.rooms) {\n    room.boundary = room.boundary.filter((id) => id !== vertexId);\n  }\n  scene.vertices = scene.vertices.filter((vertex) => vertex.id !== vertexId);\n  return true;\n}\n\nfunction degrees(scene: Scene): Map<string, Wall[]> {\n  const at = new Map<string, Wall[]>();\n  for (const wall of scene.walls) {\n    for (const end of [wall.a, wall.b]) {\n      const list = at.get(end) ?? [];\n      list.push(wall);\n      at.set(end, list);\n    }\n  }\n  return at;\n}\n\n/** Merge corners within CORNER_MM; a moved one gives way to one that stayed. */\nfunction weldCorners(scene: Scene, moved: ReadonlySet<string>): boolean {\n  const walls = degrees(scene);\n  const vertices = [...scene.vertices].sort(\n    (one, two) =>\n      Number(moved.has(one.id)) - Number(moved.has(two.id)) ||\n      (walls.get(two.id)?.length ?? 0) - (walls.get(one.id)?.length ?? 0),\n  );\n  for (let i = 0; i < vertices.length; i++) {\n    const into = vertices[i] as Scene[\"vertices\"][number];\n    for (let j = i + 1; j < vertices.length; j++) {\n      const from = vertices[j] as Scene[\"vertices\"][number];\n      if (distance(into.at, from.at) <= CORNER_MM) {\n        mergeVertices(scene, from.id, into.id);\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n/** A wall's loose end that stops short of a wall, or within its thickness,\n * runs on to its centreline; one near a corner joins it. */\nfunction joinLooseEnds(scene: Scene): boolean {\n  const walls = degrees(scene);\n  for (const vertex of scene.vertices) {\n    const mine = walls.get(vertex.id) ?? [];\n    if (mine.length !== 1) {\n      continue;\n    }\n    const wall = mine[0] as Wall;\n    const other = wall.a === vertex.id ? wall.b : wall.a;\n    const from = pointOf(scene, other);\n    if (!from) {\n      continue;\n    }\n    const at = vertex.at;\n    const length = distance(from, at);\n    if (length === 0) {\n      continue;\n    }\n    const ux = (at[0] - from[0]) / length;\n    const uy = (at[1] - from[1]) / length;\n    const half = thicknessOf(wall) / 2;\n\n    let best: {\n      distance: number;\n      corner?: string;\n      onto?: Point;\n      wall?: string;\n    } | null = null;\n    const consider = (candidate: NonNullable<typeof best>): void => {\n      if (!best || candidate.distance < best.distance) {\n        best = candidate;\n      }\n    };\n\n    for (const target of scene.vertices) {\n      if (target.id === vertex.id || target.id === other) {\n        continue;\n      }\n      const thickest = Math.max(\n        thicknessOf(wall),\n        ...(walls.get(target.id) ?? []).map(thicknessOf),\n      );\n      const gap = distance(at, target.at);\n      if (gap <= thickest / 2) {\n        consider({ distance: gap, corner: target.id });\n      }\n    }\n\n    for (const target of scene.walls) {\n      if (\n        target.id === wall.id ||\n        target.a === other ||\n        target.b === other ||\n        target.a === vertex.id ||\n        target.b === vertex.id\n      ) {\n        continue;\n      }\n      const ends = wallEnds(scene, target);\n      if (!ends) {\n        continue;\n      }\n      const [p, q] = ends;\n      const reach = thicknessOf(target) / 2;\n      // Run on along its own line to the wall ahead.\n      const ex = q[0] - p[0];\n      const ey = q[1] - p[1];\n      const denominator = ux * ey - uy * ex;\n      if (Math.abs(denominator) > 1e-9) {\n        const t = ((p[0] - at[0]) * ey - (p[1] - at[1]) * ex) / denominator;\n        const u = ((p[0] - at[0]) * uy - (p[1] - at[1]) * ux) / denominator;\n        if (t > 0 && t <= reach + half && u > 0 && u < 1) {\n          consider({\n            distance: t,\n            onto: [at[0] + ux * t, at[1] + uy * t],\n            wall: target.id,\n          });\n        }\n      }\n      // Or sideways onto one it lies inside.\n      const along = alongSegment(at, p, q, reach);\n      if (along !== null) {\n        const length2 = distance(p, q);\n        const onto: Point = [\n          p[0] + ((q[0] - p[0]) * along) / length2,\n          p[1] + ((q[1] - p[1]) * along) / length2,\n        ];\n        consider({ distance: distance(at, onto), onto, wall: target.id });\n      }\n    }\n\n    const found = best as {\n      distance: number;\n      corner?: string;\n      onto?: Point;\n      wall?: string;\n    } | null;\n    if (!found || found.distance <= WELD_MM / 2) {\n      continue;\n    }\n    if (found.corner) {\n      mergeVertices(scene, vertex.id, found.corner);\n      return true;\n    }\n    if (found.onto && found.wall) {\n      setVertexAt(scene, vertex.id, found.onto);\n      if (!splitWall(scene, found.wall, found.onto)) {\n        const target = scene.walls.find((w) => w.id === found.wall);\n        const ends = target ? wallEnds(scene, target) : null;\n        if (target && ends) {\n          const nearer =\n            distance(ends[0], found.onto) <= distance(ends[1], found.onto)\n              ? target.a\n              : target.b;\n          mergeVertices(scene, vertex.id, nearer);\n        }\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\n/** Split walls where another's corner lies along them, or where two cross. */\nfunction splitAtMeetings(scene: Scene): boolean {\n  let changed = false;\n  for (let pass = 0; pass < 1000; pass++) {\n    if (!splitOnce(scene)) {\n      return changed;\n    }\n    changed = true;\n  }\n  return changed;\n}\n\nfunction splitOnce(scene: Scene): boolean {\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    for (const vertex of scene.vertices) {\n      if (vertex.id === wall.a || vertex.id === wall.b) {\n        continue;\n      }\n      const along = alongSegment(vertex.at, ends[0], ends[1], CORNER_MM);\n      if (along === null) {\n        continue;\n      }\n      const length = distance(ends[0], ends[1]);\n      const onto: Point = [\n        ends[0][0] + ((ends[1][0] - ends[0][0]) * along) / length,\n        ends[0][1] + ((ends[1][1] - ends[0][1]) * along) / length,\n      ];\n      setVertexAt(scene, vertex.id, onto);\n      splitWall(scene, wall.id, vertex.at);\n      return true;\n    }\n  }\n  for (let i = 0; i < scene.walls.length; i++) {\n    const one = scene.walls[i] as Wall;\n    const first = wallEnds(scene, one);\n    if (!first) {\n      continue;\n    }\n    for (let j = i + 1; j < scene.walls.length; j++) {\n      const two = scene.walls[j] as Wall;\n      if (\n        two.a === one.a ||\n        two.a === one.b ||\n        two.b === one.a ||\n        two.b === one.b\n      ) {\n        continue;\n      }\n      const second = wallEnds(scene, two);\n      const crossing = second ? crossingPoint(first, second) : null;\n      if (!crossing) {\n        continue;\n      }\n      const at: Point = [Math.round(crossing[0]), Math.round(crossing[1])];\n      const split = splitWall(scene, one.id, at);\n      if (!split) {\n        continue;\n      }\n      const middle = pointOf(scene, split.vertex) as Point;\n      if (!splitWall(scene, two.id, middle)) {\n        // Rounding put it a hair off: join it to the nearer end.\n        const ends = wallEnds(scene, two) as [Point, Point];\n        mergeVertices(\n          scene,\n          split.vertex,\n          distance(ends[0], middle) <= distance(ends[1], middle)\n            ? two.a\n            : two.b,\n        );\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\n/** Where two segments cross, strictly inside both. */\nfunction crossingPoint(\n  [p, q]: [Point, Point],\n  [r, s]: [Point, Point],\n): Point | null {\n  const dx = q[0] - p[0];\n  const dy = q[1] - p[1];\n  const ex = s[0] - r[0];\n  const ey = s[1] - r[1];\n  const denominator = dx * ey - dy * ex;\n  if (Math.abs(denominator) < 1e-9) {\n    return null;\n  }\n  const t = ((r[0] - p[0]) * ey - (r[1] - p[1]) * ex) / denominator;\n  const u = ((r[0] - p[0]) * dy - (r[1] - p[1]) * dx) / denominator;\n  const lengthOne = Math.hypot(dx, dy);\n  const lengthTwo = Math.hypot(ex, ey);\n  const inside = (value: number, length: number): boolean =>\n    value * length > WELD_MM && (1 - value) * length > WELD_MM;\n  if (!inside(t, lengthOne) || !inside(u, lengthTwo)) {\n    return null;\n  }\n  return [p[0] + t * dx, p[1] + t * dy];\n}\n\n/** Two walls alongside each other whose thicknesses overlap are one wall:\n * the one that moved, or else the shorter, lines up on the other. */\nfunction alignAlongside(scene: Scene, moved: ReadonlySet<string>): boolean {\n  for (let i = 0; i < scene.walls.length; i++) {\n    for (let j = i + 1; j < scene.walls.length; j++) {\n      const one = scene.walls[i] as Wall;\n      const two = scene.walls[j] as Wall;\n      const a = wallEnds(scene, one);\n      const b = wallEnds(scene, two);\n      if (!a || !b) {\n        continue;\n      }\n      const lengthA = distance(a[0], a[1]);\n      const lengthB = distance(b[0], b[1]);\n      if (lengthA === 0 || lengthB === 0) {\n        continue;\n      }\n      const ua: Point = [\n        (a[1][0] - a[0][0]) / lengthA,\n        (a[1][1] - a[0][1]) / lengthA,\n      ];\n      const ub: Point = [\n        (b[1][0] - b[0][0]) / lengthB,\n        (b[1][1] - b[0][1]) / lengthB,\n      ];\n      if (Math.abs(ua[0] * ub[1] - ua[1] * ub[0]) > ALONGSIDE) {\n        continue;\n      }\n      const movedOne = moved.has(one.a) || moved.has(one.b);\n      const movedTwo = moved.has(two.a) || moved.has(two.b);\n      const twoGives =\n        movedTwo !== movedOne\n          ? movedTwo\n          : lengthB < lengthA || (lengthB === lengthA && two.id > one.id);\n      const [keep, give, line, ends] = twoGives\n        ? [one, two, a, b]\n        : [two, one, b, a];\n      const [origin, end] = line;\n      const length = distance(origin, end);\n      const ux = (end[0] - origin[0]) / length;\n      const uy = (end[1] - origin[1]) / length;\n      const offset = (point: Point): number =>\n        (point[0] - origin[0]) * uy - (point[1] - origin[1]) * ux;\n      const along = (point: Point): number =>\n        (point[0] - origin[0]) * ux + (point[1] - origin[1]) * uy;\n      const gaps = ends.map(offset);\n      const reach = (thicknessOf(keep) + thicknessOf(give)) / 2;\n      if (\n        gaps.some((gap) => Math.abs(gap) >= reach) ||\n        gaps.every((gap) => Math.abs(gap) <= WELD_MM)\n      ) {\n        continue;\n      }\n      const span = ends.map(along).sort((x, y) => x - y) as [number, number];\n      const overlap = Math.min(span[1], length) - Math.max(span[0], 0);\n      const shorter = Math.min(lengthA, lengthB);\n      if (overlap < Math.min(200, shorter / 2)) {\n        continue;\n      }\n      for (const [index, id] of [give.a, give.b].entries()) {\n        const point = ends[index] as Point;\n        const t = along(point);\n        setVertexAt(scene, id, [origin[0] + ux * t, origin[1] + uy * t]);\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\n/** A loose wall too short to reach out of the wall it hangs from is an\n * overshoot; it goes. */\nfunction dropStubs(scene: Scene): boolean {\n  const walls = degrees(scene);\n  for (const wall of scene.walls) {\n    const looseA = (walls.get(wall.a)?.length ?? 0) === 1;\n    const looseB = (walls.get(wall.b)?.length ?? 0) === 1;\n    if (looseA === looseB) {\n      continue;\n    }\n    const tied = looseA ? wall.b : wall.a;\n    const host = Math.max(\n      0,\n      ...(walls.get(tied) ?? [])\n        .filter((other) => other !== wall)\n        .map(thicknessOf),\n    );\n    const ends = wallEnds(scene, wall);\n    if (ends && distance(ends[0], ends[1]) < host / 2 + WELD_MM) {\n      removeWalls(scene, new Set([wall.id]));\n      return true;\n    }\n  }\n  return false;\n}\n\n/** A space thinner than a wall is a gap left between two: take down the walls\n * it shares most with one neighbour, so the two become one. */\nfunction closeSlivers(scene: Scene): boolean {\n  const faces = findFaces(scene);\n  for (const [index, space] of faces.spaces.entries()) {\n    let perimeter = 0;\n    space.polygon.forEach((point, at) => {\n      perimeter += distance(\n        point,\n        space.polygon[(at + 1) % space.polygon.length] as Point,\n      );\n    });\n    if (perimeter === 0 || (2 * space.area) / perimeter >= SLIVER_MM) {\n      continue;\n    }\n    const shared = new Map<number, { length: number; walls: string[] }>();\n    for (const [wallId, [left, right]] of faces.sides) {\n      if (left === right || (left !== index && right !== index)) {\n        continue;\n      }\n      const other = left === index ? right : left;\n      const wall = scene.walls.find((candidate) => candidate.id === wallId);\n      const ends = wall ? wallEnds(scene, wall) : null;\n      const entry = shared.get(other) ?? { length: 0, walls: [] };\n      entry.length += ends ? distance(ends[0], ends[1]) : 0;\n      entry.walls.push(wallId);\n      shared.set(other, entry);\n    }\n    const best = [...shared.values()].sort((x, y) => y.length - x.length)[0];\n    if (best) {\n      removeWalls(scene, new Set(best.walls));\n      return true;\n    }\n  }\n  return false;\n}\n\nexport interface SettleOptions {\n  /** Where each room was before the edit; defaults to where they are now. */\n  rooms?: Map<string, Point[]>;\n  /** Corners a gesture moved: where walls overlap, these give way. */\n  moved?: ReadonlySet<string>;\n  /** Spaces that were empty before the edit, so stay empty. Defaults to now's. */\n  empties?: Point[][];\n  /** Where two rooms become one, the room that keeps the space. */\n  keep?: string;\n  /** A newly drawn room: the space inside it becomes this room. */\n  claim?: { polygon: Point[]; fields: Partial<Room> };\n}\n\nexport interface Settled {\n  claimed: string | null;\n  /** Rooms made for spaces split off a room or newly enclosed. */\n  created: string[];\n}\n\n/** Tidy the walls into a clean plan, then find the rooms in it: a space keeps\n * the room that covered most of it, a part split off one becomes a room like\n * it, a newly enclosed space becomes a room, and an empty one stays empty. */\nexport function settle(scene: Scene, options: SettleOptions = {}): Settled {\n  const moved = options.moved ?? new Set<string>();\n  const empties = options.empties ?? emptySpaces(scene);\n  const before = options.rooms ?? roomPolygons(scene);\n  // Tidying can fold a room's corners together; its record comes back if\n  // its space survives.\n  const records = new Map(scene.rooms.map((room) => [room.id, { ...room }]));\n\n  normalizeScene(scene);\n  for (let pass = 0; pass < PASSES; pass++) {\n    let changed = false;\n    for (let step = 0; step < 200; step++) {\n      const any =\n        weldCorners(scene, moved) ||\n        joinLooseEnds(scene) ||\n        splitAtMeetings(scene) ||\n        fuseDuplicates(scene) ||\n        alignAlongside(scene, moved);\n      if (!any) {\n        break;\n      }\n      changed = true;\n    }\n    while (dropStubs(scene)) {\n      changed = true;\n    }\n    if (closeSlivers(scene)) {\n      changed = true;\n    }\n    if (!changed) {\n      break;\n    }\n  }\n  normalizeScene(scene);\n\n  const settled = assignRooms(scene, before, records, empties, options);\n  finishThickness(scene);\n  // A room gone with its space may have held the last use of a corner.\n  normalizeScene(scene);\n  return settled;\n}\n\n/** How many walls settling would move, join or take down. A plan drawn\n * before walls joined up is tidied by its first edit, which can change its\n * heat loss: the editor says so. */\nexport function untidyWalls(scene: Scene): number {\n  const tidied = structuredClone(scene);\n  settle(tidied);\n  const was = new Map(scene.vertices.map((vertex) => [vertex.id, vertex.at]));\n  const now = new Map(tidied.vertices.map((vertex) => [vertex.id, vertex.at]));\n  const kept = new Set(tidied.walls.map((wall) => wall.id));\n  return scene.walls.filter(\n    (wall) =>\n      !kept.has(wall.id) ||\n      [wall.a, wall.b].some((id) => {\n        const before = was.get(id);\n        const after = now.get(id);\n        return !before || !after || distance(before, after) > WELD_MM;\n      }),\n  ).length;\n}\n\nfunction assignRooms(\n  scene: Scene,\n  before: Map<string, Point[]>,\n  records: Map<string, Room>,\n  empties: Point[][],\n  options: SettleOptions,\n): Settled {\n  const faces = findFaces(scene);\n  const spaces = faces.spaces;\n  const measured = spaces.map((space) => measure(space.polygon));\n  const covered = (index: number, polygon: Point[]): number =>\n    overlapArea(measured[index] as Measured, polygon);\n\n  const pairs: { room: string; space: number; overlap: number }[] = [];\n  for (const [room, polygon] of before) {\n    if (polygon.length < 3) {\n      continue;\n    }\n    spaces.forEach((_, index) => {\n      const overlap = covered(index, polygon);\n      if (overlap > 0) {\n        pairs.push({ room, space: index, overlap });\n      }\n    });\n  }\n  pairs.sort(\n    (one, two) =>\n      Number(two.room === options.keep) - Number(one.room === options.keep) ||\n      two.overlap - one.overlap ||\n      (one.room < two.room ? -1 : 1),\n  );\n  const roomSpace = new Map<string, number>();\n  const spaceRoom = new Map<number, string>();\n  for (const pair of pairs) {\n    if (roomSpace.has(pair.room) || spaceRoom.has(pair.space)) {\n      continue;\n    }\n    roomSpace.set(pair.room, pair.space);\n    spaceRoom.set(pair.space, pair.room);\n  }\n\n  for (const [room] of roomSpace) {\n    const record = records.get(room);\n    if (record && !scene.rooms.some((candidate) => candidate.id === room)) {\n      scene.rooms.push(record);\n    }\n  }\n  const byId = new Map(scene.rooms.map((room) => [room.id, room]));\n  const created: string[] = [];\n  let claimed: string | null = null;\n  /** Each new room cut out of an old one, and the room it came out of. */\n  const cutFrom = new Map<string, string>();\n\n  // The drawn room's space: the one most inside what was drawn.\n  let claimSpace = -1;\n  if (options.claim) {\n    let most = 0;\n    spaces.forEach((space, index) => {\n      const inside = covered(index, options.claim?.polygon ?? []);\n      if (inside >= space.area / 2 && inside > most) {\n        most = inside;\n        claimSpace = index;\n      }\n    });\n  }\n\n  spaces.forEach((space, index) => {\n    const owner = spaceRoom.get(index);\n    if (owner !== undefined) {\n      if (index === claimSpace) {\n        claimed = owner;\n      }\n      return;\n    }\n    // Inside a loop of walls standing free in a room, a room would count\n    // that floor twice: it stays empty until the loop is joined up.\n    const around = faces.enclosedBy.get(index);\n    if (around !== undefined && spaceRoom.has(around)) {\n      return;\n    }\n    let source: string | null = null;\n    let fromRooms = 0;\n    for (const pair of pairs) {\n      if (pair.space === index) {\n        fromRooms += pair.overlap;\n        if (source === null) {\n          source = pair.room;\n        }\n      }\n    }\n    const fromEmpty = empties.reduce(\n      (total, polygon) => total + covered(index, polygon),\n      0,\n    );\n    const inClaim =\n      options.claim && covered(index, options.claim.polygon) >= space.area / 2;\n    let fields: Partial<Room> | null = null;\n    if (index === claimSpace || inClaim) {\n      fields = { ...(options.claim?.fields ?? {}) };\n      if (index !== claimSpace) {\n        fields.name = \"\";\n      }\n    } else if (fromRooms > space.area / 2 && fromRooms >= fromEmpty && source) {\n      const like = byId.get(source);\n      fields = like\n        ? {\n            room_type: like.room_type,\n            heated: like.heated,\n            ceiling_height: like.ceiling_height,\n            ...(like.ceiling\n              ? {\n                  ceiling: like.ceiling,\n                  ceiling_low: like.ceiling_low,\n                  ceiling_high: like.ceiling_high,\n                  ceiling_fall: like.ceiling_fall,\n                  ceiling_ridge: like.ceiling_ridge,\n                }\n              : {}),\n            ...(like.temperature != null\n              ? { temperature: like.temperature }\n              : {}),\n          }\n        : {};\n    } else if (fromEmpty > space.area / 2 || space.area < SMALLEST_ROOM) {\n      return;\n    } else {\n      fields = {};\n    }\n    const id = newId(\"r\");\n    scene.rooms.push({\n      ...blankRoom(id, space.ring),\n      ...fields,\n      id,\n      boundary: space.ring,\n    });\n    spaceRoom.set(index, id);\n    if (source) {\n      cutFrom.set(id, source);\n    }\n    if (index === claimSpace) {\n      claimed = id;\n    } else {\n      created.push(id);\n    }\n  });\n\n  for (const room of scene.rooms) {\n    const index = roomSpace.get(room.id);\n    const ring =\n      index === undefined ? null : (spaces[index] as { ring: string[] }).ring;\n    if (ring && !sameCycle(room.boundary, ring)) {\n      room.boundary = [...ring];\n    }\n  }\n\n  // A part cut out of a room takes the radiators on its own walls.\n  const rooms = new Map(scene.rooms.map((room) => [room.id, room]));\n  for (const [id, source] of cutFrom) {\n    const mine = ringWalls(scene, rooms.get(id)?.boundary ?? []);\n    const theirs = ringWalls(scene, rooms.get(source)?.boundary ?? []);\n    for (const emitter of hung(scene)) {\n      if (\n        emitter.room === source &&\n        mine.has(emitter.wall) &&\n        !theirs.has(emitter.wall)\n      ) {\n        emitter.room = id;\n      }\n    }\n  }\n\n  // A room that lost its space to a neighbour hands over its radiators.\n  for (const [roomId, polygon] of before) {\n    if (roomSpace.has(roomId)) {\n      continue;\n    }\n    let heir: string | undefined;\n    let most = 0;\n    spaces.forEach((_, at) => {\n      const overlap = polygon.length >= 3 ? covered(at, polygon) : 0;\n      const owner = spaceRoom.get(at);\n      if (owner && owner !== roomId && overlap > most) {\n        most = overlap;\n        heir = owner;\n      }\n    });\n    for (const emitter of [...scene.emitters, ...hung(scene)]) {\n      if (emitter.room === roomId && heir) {\n        emitter.room = heir;\n      }\n    }\n    scene.rooms = scene.rooms.filter((candidate) => candidate.id !== roomId);\n  }\n\n  return { claimed, created };\n}\n\n/** The walls along a ring of corners. */\nfunction ringWalls(scene: Scene, ring: readonly string[]): Set<string> {\n  const walls = new Set<string>();\n  ring.forEach((vertex, index) => {\n    const wall = findWall(scene, vertex, ring[(index + 1) % ring.length] ?? \"\");\n    if (wall) {\n      walls.add(wall.id);\n    }\n  });\n  return walls;\n}\n\n/** A new wall becomes a partition between spaces, else an outside wall. */\nfunction finishThickness(scene: Scene): void {\n  if (!scene.walls.some((wall) => wall.thickness === UNSET)) {\n    return;\n  }\n  const faces = findFaces(scene);\n  for (const wall of scene.walls) {\n    if (wall.thickness !== UNSET) {\n      continue;\n    }\n    const sides = faces.sides.get(wall.id) ?? [-1, -1];\n    wall.thickness = sides.includes(-1)\n      ? DEFAULT_WALL_THICKNESS\n      : PARTITION_THICKNESS;\n  }\n}\n\n/** Drop repeated corners, degenerate rooms and walls, unused corners, and\n * openings on walls that are gone; fuse walls doubled up on two corners. */\nexport function normalizeScene(scene: Scene): void {\n  const ids = new Set(scene.vertices.map((vertex) => vertex.id));\n  for (const room of scene.rooms) {\n    room.boundary = room.boundary.filter(\n      (vertex, index) =>\n        ids.has(vertex) &&\n        vertex !== room.boundary[(index + 1) % room.boundary.length],\n    );\n  }\n  scene.rooms = scene.rooms.filter((room) => new Set(room.boundary).size >= 3);\n\n  scene.walls = scene.walls.filter(\n    (wall) => wall.a !== wall.b && ids.has(wall.a) && ids.has(wall.b),\n  );\n  fuseDuplicates(scene);\n\n  const wallIds = new Set(scene.walls.map((wall) => wall.id));\n  scene.openings = scene.openings.filter((opening) =>\n    wallIds.has(opening.wall),\n  );\n\n  const used = new Set<string>();\n  for (const wall of scene.walls) {\n    used.add(wall.a);\n    used.add(wall.b);\n  }\n  for (const room of scene.rooms) {\n    for (const id of room.boundary) {\n      used.add(id);\n    }\n  }\n  scene.vertices = scene.vertices.filter((vertex) => used.has(vertex.id));\n}\n", "import { distance, projectOnSegment } from \"./geometry\";\nimport { Opening, Point, Scene, Wall } from \"./scene\";\nimport { wallEnds } from \"./topology\";\n\n// Openings are 1-D along their wall: `offset` mm from endpoint `a` to the\n// opening's start, `width` mm along the wall. Everything here is pure.\n\nexport const OPENING_DEFAULTS = {\n  door: { width: 762, height: 2040, sill: null },\n  window: { width: 1200, height: 1200, sill: 900 },\n  opening: { width: 900, height: 2040, sill: null },\n} as const;\n\nexport interface WallFrame {\n  origin: Point;\n  /** Unit vector along the wall (a \u2192 b). */\n  ux: number;\n  uy: number;\n  length: number;\n  angleDeg: number;\n}\n\nexport function wallFrame(a: Point, b: Point): WallFrame {\n  const length = distance(a, b);\n  const ux = length === 0 ? 1 : (b[0] - a[0]) / length;\n  const uy = length === 0 ? 0 : (b[1] - a[1]) / length;\n  return {\n    origin: a,\n    ux,\n    uy,\n    length,\n    angleDeg: (Math.atan2(uy, ux) * 180) / Math.PI,\n  };\n}\n\nexport function pointAlong(a: Point, b: Point, offsetMm: number): Point {\n  const frame = wallFrame(a, b);\n  return [\n    frame.origin[0] + frame.ux * offsetMm,\n    frame.origin[1] + frame.uy * offsetMm,\n  ];\n}\n\n/** Clamp an opening's offset so it sits fully on the wall, or null when the\n * wall is too short to hold it at all. */\nexport function clampedOffset(\n  a: Point,\n  b: Point,\n  opening: Opening,\n): number | null {\n  const length = wallFrame(a, b).length;\n  if (opening.width > length) {\n    return null;\n  }\n  return Math.round(\n    Math.max(0, Math.min(length - opening.width, opening.offset)),\n  );\n}\n\n/** The centreline split around `openings`, already filtered to this wall. */\nexport function wallSegments(\n  a: Point,\n  b: Point,\n  openings: Opening[],\n): [Point, Point][] {\n  const length = wallFrame(a, b).length;\n  const mine = openings\n    .map((opening) => {\n      const start = Math.max(0, Math.min(length, opening.offset));\n      return [\n        start,\n        Math.max(start, Math.min(length, opening.offset + opening.width)),\n      ];\n    })\n    .sort((left, right) => (left[0] ?? 0) - (right[0] ?? 0));\n\n  const segments: [Point, Point][] = [];\n  let cursor = 0;\n  for (const gap of mine) {\n    const [start, end] = gap as [number, number];\n    if (start > cursor) {\n      segments.push([pointAlong(a, b, cursor), pointAlong(a, b, start)]);\n    }\n    cursor = Math.max(cursor, end);\n  }\n  if (cursor < length) {\n    segments.push([pointAlong(a, b, cursor), pointAlong(a, b, length)]);\n  }\n  return segments;\n}\n\n/** Drop openings whose wall is gone or now too short, and clamp the rest\n * back onto their wall. Called after every scene mutation. */\nexport function normalizeOpenings(scene: Scene): void {\n  const walls = new Map(scene.walls.map((wall) => [wall.id, wall]));\n  scene.openings = scene.openings.filter((opening) => {\n    const wall = walls.get(opening.wall);\n    const ends = wall ? wallEnds(scene, wall) : null;\n    if (!ends) {\n      return false;\n    }\n    const offset = clampedOffset(ends[0], ends[1], opening);\n    if (offset === null) {\n      return false;\n    }\n    opening.offset = offset;\n    return true;\n  });\n}\n\nexport interface OpeningSpot {\n  wall: Wall;\n  ends: [Point, Point];\n  /** Offset of the opening's start along the wall, already clamped. */\n  offset: number;\n}\n\n/** The wall nearest `point`, within `tolerance`, and where an opening\n * `width` wide centred there would start along it. */\nexport function openingSpot(\n  point: Point,\n  scene: Scene,\n  width: number,\n  tolerance: number,\n): OpeningSpot | null {\n  let best:\n    | (Omit<OpeningSpot, \"offset\"> & { centre: number; distance: number })\n    | null = null;\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    const projection = projectOnSegment(point, ends[0], ends[1]);\n    if (projection.distance > tolerance) {\n      continue;\n    }\n    if (best === null || projection.distance < best.distance) {\n      const frame = wallFrame(ends[0], ends[1]);\n      best = {\n        wall,\n        ends,\n        centre: projection.t * frame.length,\n        distance: projection.distance,\n      };\n    }\n  }\n  if (!best) {\n    return null;\n  }\n  const length = wallFrame(best.ends[0], best.ends[1]).length;\n  if (width > length) {\n    return null;\n  }\n  const offset = Math.round(\n    Math.max(0, Math.min(length - width, best.centre - width / 2)),\n  );\n  return { wall: best.wall, ends: best.ends, offset };\n}\n\n/** A door's leaves along its gap from `start` to `end`, each as where it's\n * hinged and where it closes: one hinged at the start (the end when\n * flipped), or a double door's two meeting in the middle. */\nexport function doorLeaves(\n  opening: Pick<Opening, \"double\" | \"flip\">,\n  start: number,\n  end: number,\n): [number, number][] {\n  if (opening.double) {\n    const middle = (start + end) / 2;\n    return [\n      [start, middle],\n      [end, middle],\n    ];\n  }\n  return opening.flip ? [[end, start]] : [[start, end]];\n}\n", "import { z } from \"zod\";\n\n// The server's scene document (apps/design/serializers.py) is the source of\n// truth; these schemas mirror it exactly. All coordinates are integer\n// millimetres, y-down, origin arbitrary per floor.\n\nexport const PointSchema = z.tuple([z.number(), z.number()]);\n\nexport const VertexSchema = z.object({\n  id: z.string(),\n  at: PointSchema,\n});\n\nexport const WallSchema = z.object({\n  id: z.string(),\n  a: z.string(),\n  b: z.string(),\n  thickness: z.number(),\n  // FabricType id; null/absent resolves to the design default.\n  fabric: z.number().nullable().optional(),\n  party: z.boolean().default(false),\n});\n\nexport const OpeningSchema = z.object({\n  id: z.string(),\n  wall: z.string(),\n  type: z.enum([\"door\", \"window\", \"opening\"]),\n  offset: z.number(),\n  width: z.number(),\n  height: z.number(),\n  sill: z.number().nullable(),\n  swing: z.enum([\"left\", \"right\", \"none\"]),\n  flip: z.boolean(),\n  fabric: z.number().nullable().optional(),\n  vent: z\n    .enum([\"side\", \"top\", \"bottom\", \"pivot\", \"sash\", \"slider\", \"fixed\"])\n    .optional(),\n  vent_angle: z.number().optional(),\n  vent_width: z.number().nullable().optional(),\n  vent_height: z.number().nullable().optional(),\n  shading: z.enum([\"none\", \"shutters\", \"overhang\"]).optional(),\n  secure: z.boolean().optional(),\n  guarded: z.boolean().optional(),\n  glazed: z.boolean().optional(),\n  /** A trickle vent in the frame: counts as a background vent for the room. */\n  trickle: z.boolean().optional(),\n  /** A door's two leaves, half its width each, meeting in the middle. */\n  double: z.boolean().optional(),\n});\n\nexport const RoomSchema = z.object({\n  id: z.string(),\n  name: z.string(),\n  room_type: z.string(),\n  boundary: z.array(z.string()),\n  ceiling_height: z.number().nullable(),\n  heated: z.boolean().default(true),\n  // Flat where absent. A sloped or room-in-roof ceiling gives a low and a high\n  // height (knee wall and ridge), the way it falls (degrees from +x in the plan,\n  // towards the low side) and, for sloped, whether the ridge runs down the middle.\n  ceiling: z.enum([\"flat\", \"sloped\", \"roof_room\"]).optional(),\n  ceiling_low: z.number().nullable().optional(),\n  ceiling_high: z.number().nullable().optional(),\n  ceiling_fall: z.number().nullable().optional(),\n  ceiling_ridge: z.boolean().optional(),\n  // \u00B0C over the DHDG figure for the room type, and what leaks or extracts.\n  temperature: z.number().nullable().optional(),\n  vents: z.number().optional(),\n  fans: z.number().optional(),\n  flues: z.number().optional(),\n  extract: z.number().optional(),\n});\n\n/** Panel radiator types: 10 is P1, 11 K1, 21 P+, 22 K2, 33 K3. */\nexport const RADIATOR_TYPES = [\"10\", \"11\", \"21\", \"22\", \"33\"] as const;\n\n/** Against `wall`, inside `room`, `offset` mm from the wall's `a` end. */\nexport const RadiatorSchema = z.object({\n  id: z.string(),\n  kind: z.literal(\"radiator\"),\n  room: z.string(),\n  wall: z.string(),\n  offset: z.number(),\n  length: z.number(),\n  height: z.number(),\n  type: z.enum(RADIATOR_TYPES),\n});\n\nexport const UnderfloorSchema = z.object({\n  id: z.string(),\n  kind: z.literal(\"underfloor\"),\n  room: z.string(),\n  /** m\u00B2 of floor it covers; null is the whole room. */\n  area: z.number().nullable(),\n  finish: z.enum([\"tile\", \"wood\"]),\n});\n\nexport const EmitterSchema = z.discriminatedUnion(\"kind\", [\n  RadiatorSchema,\n  UnderfloorSchema,\n]);\n\n/**\n * A chimney breast standing proud of `wall` into `room`: masonry inside the\n * envelope, so it takes floor area but adds no wall. Measured as walls are, to\n * centrelines: `depth` from the wall's line to the breast face's.\n */\nexport const ChimneyBreastSchema = z.object({\n  id: z.string(),\n  kind: z.literal(\"chimney_breast\"),\n  room: z.string(),\n  wall: z.string(),\n  offset: z.number(),\n  length: z.number(),\n  depth: z.number(),\n});\n\n/** Where a proposal builds new: the floor and roof over it take their own\n * fabric (null is the design's default), and retrofit measures leave it out. */\nexport const NewBuildSchema = z.object({\n  id: z.string(),\n  kind: z.literal(\"new_build\"),\n  polygon: z.array(PointSchema),\n  floor: z.number().nullable(),\n  roof: z.number().nullable(),\n});\n\nexport const FeatureSchema = z.discriminatedUnion(\"kind\", [\n  ChimneyBreastSchema,\n  NewBuildSchema,\n]);\n\n/** Equipment a fixture can be, with its label. One list: the server mirrors the keys. */\nexport const FIXTURE_KINDS = {\n  gas_boiler: \"Gas boiler\",\n  oil_boiler: \"Oil boiler\",\n  cylinder: \"Hot water cylinder\",\n  heat_pump: \"Heat pump\",\n  solar_pv: \"Solar PV\",\n  extract_fan: \"Extract fan\",\n  mvhr: \"MVHR\",\n  bath: \"Bath\",\n  shower: \"Shower\",\n} as const;\n\nexport type FixtureKind = keyof typeof FIXTURE_KINDS;\n\n/**\n * Placed equipment. In a baseline it's what's there now. It sits in a `room`,\n * against a `wall` `offset` mm from its `a` end (as an emitter does), or at a\n * point `at`, in any combination. `props` holds each kind's details:\n * `capacity_kw`, `volume_l`, `kwp`, `model`\u2026\n */\nexport const FixtureSchema = z.object({\n  id: z.string(),\n  kind: z.enum(Object.keys(FIXTURE_KINDS) as [FixtureKind, ...FixtureKind[]]),\n  room: z.string().optional(),\n  wall: z.string().optional(),\n  offset: z.number().optional(),\n  at: PointSchema.optional(),\n  props: z\n    .record(z.string(), z.union([z.string(), z.number(), z.boolean()]))\n    .optional(),\n});\n\nexport const SceneSchema = z.object({\n  schema: z.literal(2),\n  units: z.literal(\"mm\"),\n  vertices: z.array(VertexSchema),\n  walls: z.array(WallSchema),\n  openings: z.array(OpeningSchema),\n  rooms: z.array(RoomSchema),\n  emitters: z.array(EmitterSchema).default([]),\n  /** Absent from scenes saved before there were any. */\n  features: z.array(FeatureSchema).optional(),\n  /** Absent from scenes saved before there were any. */\n  fixtures: z.array(FixtureSchema).optional(),\n});\n\nexport const AnnotationGeometrySchema = z.discriminatedUnion(\"type\", [\n  z.object({ type: z.literal(\"point\"), at: PointSchema }),\n  z.object({ type: z.literal(\"line\"), points: z.array(PointSchema).min(2) }),\n  z.object({ type: z.literal(\"area\"), polygon: z.array(PointSchema).min(3) }),\n]);\n\nexport const AnnotationSchema = z.object({\n  id: z.number(),\n  kind: z.string(),\n  /** The scenario proposing it: a measure is always a scenario's. */\n  package: z.number(),\n  /** The scenario option that drew it; blank or absent is drawn by hand. */\n  option: z.string().optional(),\n  geometry: AnnotationGeometrySchema,\n  label: z.string(),\n  notes: z.string(),\n  status: z.enum([\"PROPOSED\", \"CONFIRMED\", \"REJECTED\"]),\n  deleted: z.boolean().optional().default(false),\n  order: z.number(),\n  length_m: z.string().nullable(),\n  area_m2: z.string().nullable(),\n  url: z.string(),\n});\n\nexport const TraceSchema = z.object({\n  id: z.number(),\n  url: z.string(),\n  file_url: z.string(),\n  draft_url: z.string(),\n  name: z.string(),\n  imported: z.boolean(),\n  scale_mm_per_px: z.string().nullable(),\n  offset_x_mm: z.number(),\n  offset_y_mm: z.number(),\n  rotation_deg: z.string(),\n  opacity: z.number(),\n  locked: z.boolean(),\n  hidden: z.boolean(),\n  order: z.number(),\n});\n\nexport const FloorSchema = z.object({\n  id: z.number(),\n  level: z.number(),\n  name: z.string(),\n  ceiling_height_mm: z.number(),\n  version: z.number(),\n  scene: SceneSchema,\n  traces: z.array(TraceSchema),\n  annotations: z.array(AnnotationSchema),\n  url: z.string(),\n  scene_url: z.string(),\n});\n\nexport const MeasureSchema = z.object({\n  kind: z.string(),\n  name: z.string(),\n  img: z.string().nullable(),\n  /** The linework figure that draws it (assets/ts/linework/). */\n  figure: z.string().nullable(),\n});\n\nexport const FabricTypeSchema = z.object({\n  id: z.number(),\n  design: z.number(),\n  element: z.enum([\"WALL\", \"WINDOW\", \"DOOR\", \"FLOOR\", \"ROOF\"]),\n  name: z.string(),\n  spec: z.record(z.string(), z.unknown()),\n  is_default: z.boolean(),\n  url: z.string(),\n});\n\n/** A fixture a scenario adds, on one of its baseline's floors. */\nexport const ScenarioFixtureSchema = FixtureSchema.extend({\n  floor: z.number(),\n});\n\nexport const ScenarioFixturesSchema = z.object({\n  add: z.array(ScenarioFixtureSchema).default([]),\n  remove: z.array(z.string()).default([]),\n});\n\nexport const DesignPackageSchema = z.object({\n  id: z.number(),\n  design: z.number(),\n  name: z.string(),\n  options: z.array(z.string()),\n  /** In build order; empty is one unnamed phase holding everything. */\n  phases: z\n    .array(z.object({ name: z.string(), kinds: z.array(z.string()) }))\n    .default([]),\n  /** Scene entity ids each option covers; an option missing covers all. */\n  targets: z.record(z.string(), z.array(z.string())).optional(),\n  /** What the scenario adds to and removes from its baseline's fixtures. */\n  fixtures: ScenarioFixturesSchema.optional(),\n  /** What a write left out because the plan no longer has it. */\n  dropped: z.array(z.record(z.string(), z.string())).optional(),\n  figures: z.record(z.string(), z.unknown()),\n  recommended: z.boolean(),\n  url: z.string(),\n});\n\n/** The design conditions for the heat load, and where the property is. */\nexport const HeatLoadContextSchema = z.object({\n  settings: z.object({\n    zone: z.number().nullable(),\n    percentile: z.enum([\"99.6\", \"99\", \"98\", \"95\"]),\n    elevation_m: z.number(),\n    indoor: z.enum([\"auto\", \"pre-2006\", \"post-2006\"]),\n    air_permeability: z.number().nullable(),\n    built_form: z\n      .enum([\"Flat\", \"Terrace\", \"Semi-detached\", \"Detached\", \"Bungalow\"])\n      .nullable(),\n    age_band: z\n      .enum([\n        \"Pre 1919\",\n        \"1919-1944\",\n        \"1945-1964\",\n        \"1965-1980\",\n        \"1981-1990\",\n        \"Post 1990\",\n      ])\n      .nullable(),\n    exposure: z.enum([\"sheltered\", \"average\", \"exposed\"]),\n    soil: z.enum([\"clay\", \"sand\", \"rock\"]),\n    ventilation: z.enum([\"natural\", \"extract\", \"mvhr\"]),\n    mvhr_efficiency: z.number(),\n    heating: z.enum([\"constant\", \"setback\", \"intermittent\"]),\n    setback_c: z.number(),\n    disuse_h: z.number(),\n    reheat_h: z.number(),\n    thermal_mass: z.enum([\"low\", \"high\"]),\n    reheat_at_generator: z.boolean(),\n    thermal_bridging: z.number(),\n    emitters: z.enum([\"radiators\", \"underfloor\"]),\n    /** \u00B0C: the flow temperature the emitters are sized at. */\n    flow_c: z.number(),\n    /** The heat pump SCOP options are scored at; RdSAP takes 1.7. */\n    heat_pump_scop: z.number().default(3.2),\n  }),\n  location: z.object({\n    postcode: z.string(),\n    zone: z.number().nullable(),\n    approximate: z.boolean(),\n  }),\n  property_type: z.string(),\n  property_age: z.string(),\n  url: z.string(),\n});\n\n/** The set-up answers that stand in for an EPC's RdSAP; see assumptions.py. */\nexport const FabricPickSchema = z.object({\n  key: z.string(),\n  label: z.string(),\n  name: z.string(),\n  spec: z.record(z.string(), z.unknown()),\n  /** The answers that make this type the house's default. */\n  answers: z.record(z.string(), z.union([z.string(), z.number()])),\n});\nexport type FabricPick = z.infer<typeof FabricPickSchema>;\n\nexport const BaselineSchema = z.object({\n  answers: z.record(z.string(), z.union([z.string(), z.number()])),\n  answered: z.boolean(),\n  /** The fabric types the setup flow offers, by element. */\n  picks: z.record(z.string(), z.array(FabricPickSchema)).default({}),\n  /** An EPC's RdSAP exists, so the answers aren't used. */\n  rdsap: z.boolean(),\n  url: z.string(),\n  /** Saves the design as the twin's RdSAP, for Options Evaluation. */\n  twin_url: z.string().default(\"\"),\n  /** A proposed scene: it starts from the house as it is, plus `changes`. */\n  proposed: z.boolean().default(false),\n  changes: z.record(z.string(), z.union([z.string(), z.number()])).default({}),\n  changes_url: z.string().default(\"\"),\n});\n\n/** What Part O's check needs beyond the plan, and where the house is. */\nexport const OverheatingContextSchema = z.object({\n  settings: z.object({\n    location: z.enum([\"auto\", \"moderate\", \"high\"]),\n    cross_ventilation: z.enum([\"auto\", \"yes\", \"no\"]),\n    noise: z.boolean(),\n    pollution: z.boolean(),\n    communal_heating: z.boolean(),\n  }),\n  postcode: z.string(),\n  url: z.string(),\n  /** Roof windows the EPC lists: the plan has none, so the check can't see them. */\n  rooflights: z.number().optional(),\n});\n\nexport const DesignSchema = z.object({\n  id: z.number(),\n  name: z.string(),\n  project: z.number(),\n  /** Design.updated, which the editor stamps its packages' figures from. */\n  updated: z.string().optional(),\n  floors: z.array(FloorSchema),\n  measures: z.array(MeasureSchema),\n  fabric_types: z.array(FabricTypeSchema),\n  floors_url: z.string(),\n  annotations_url: z.string(),\n  traces_url: z.string(),\n  /** Staff only: the project's documents to trace from. */\n  documents_url: z.string().default(\"\"),\n  reorder_floors_url: z.string(),\n  snapshot_url: z.string(),\n  schedule_url: z.string(),\n  schedule_measure_url: z.string(),\n  fabric_types_url: z.string(),\n  revisions_url: z.string(),\n  restore_url: z.string(),\n  calc_context_url: z.string(),\n  scenario_context_url: z.string(),\n  packages: z.array(DesignPackageSchema).default([]),\n  packages_url: z.string().default(\"\"),\n  magicplan_project_id: z.string(),\n  magicplan_url: z.string(),\n  import_magicplan_url: z.string(),\n  magicplan_import: z\n    .object({ status: z.string(), finished: z.boolean(), plan_id: z.string() })\n    .nullable()\n    .default(null),\n  heat_load: HeatLoadContextSchema.nullable().default(null),\n  overheating: OverheatingContextSchema.nullable().default(null),\n  /** Where north points on the plan, clockwise from its up; null until set. */\n  north_deg: z.number().nullable().default(null),\n  /** How far the plan is shown turned clockwise. */\n  plan_rotation: z.number().default(0),\n  orientation_url: z.string().default(\"\"),\n  baseline: BaselineSchema.nullable().default(null),\n  /** The 3D view's roof, EPC hints and street (apps/design/model3d.py). */\n  model_url: z.string().default(\"\"),\n});\n\nexport const RevisionSchema = z.object({\n  id: z.number(),\n  reason: z.string(),\n  note: z.string(),\n  created: z.string(),\n  created_by: z.string().nullable(),\n  /** Drawn things added, removed or changed since the save before; null for the first. */\n  changes: z.number().nullable().default(null),\n});\n\nexport const ScheduleRowSchema = z.object({\n  kind: z.string(),\n  name: z.string(),\n  count: z.number(),\n  /** Of `count`, the marks no scenario option drew; absent counts all. */\n  by_hand: z.number().optional(),\n  length_m: z.string().nullable(),\n  area_m2: z.string().nullable(),\n  pricing_area_m2: z.string().nullable(),\n  est_low: z.number(),\n  est_central: z.number(),\n  est_high: z.number(),\n  cost_override: z.number().nullable(),\n  cost: z.number(),\n  annual_cost_savings: z.number().nullable(),\n  annual_carbon_savings: z.string().nullable(),\n  energy_rating_improvement: z.string().nullable(),\n  notes: z.string(),\n});\n\nexport const ScheduleSchema = z.object({\n  rows: z.array(ScheduleRowSchema),\n  totals: z.object({\n    est_low: z.number(),\n    est_central: z.number(),\n    est_high: z.number(),\n    cost: z.number(),\n    annual_cost_savings: z.number(),\n  }),\n});\n\nexport type Point = z.infer<typeof PointSchema>;\nexport type Vertex = z.infer<typeof VertexSchema>;\nexport type Wall = z.infer<typeof WallSchema>;\nexport type Opening = z.infer<typeof OpeningSchema>;\nexport type Room = z.infer<typeof RoomSchema>;\nexport type Emitter = z.infer<typeof EmitterSchema>;\nexport type Radiator = z.infer<typeof RadiatorSchema>;\nexport type Underfloor = z.infer<typeof UnderfloorSchema>;\nexport type RadiatorType = Radiator[\"type\"];\nexport type ChimneyBreast = z.infer<typeof ChimneyBreastSchema>;\nexport type NewBuild = z.infer<typeof NewBuildSchema>;\nexport type Feature = z.infer<typeof FeatureSchema>;\nexport type Fixture = z.infer<typeof FixtureSchema>;\nexport type Scene = z.infer<typeof SceneSchema>;\nexport type AnnotationGeometry = z.infer<typeof AnnotationGeometrySchema>;\nexport type Annotation = z.infer<typeof AnnotationSchema>;\nexport type Trace = z.infer<typeof TraceSchema>;\nexport type Floor = z.infer<typeof FloorSchema>;\nexport type Measure = z.infer<typeof MeasureSchema>;\nexport type FabricType = z.infer<typeof FabricTypeSchema>;\nexport type Revision = z.infer<typeof RevisionSchema>;\nexport type Design = z.infer<typeof DesignSchema>;\nexport type HeatLoadContext = z.infer<typeof HeatLoadContextSchema>;\nexport type OverheatingContext = z.infer<typeof OverheatingContextSchema>;\nexport type Baseline = z.infer<typeof BaselineSchema>;\nexport type HeatLoadSettings = HeatLoadContext[\"settings\"];\nexport type DesignPackage = z.infer<typeof DesignPackageSchema>;\nexport type ScenarioFixture = z.infer<typeof ScenarioFixtureSchema>;\nexport type ScheduleRow = z.infer<typeof ScheduleRowSchema>;\nexport type Schedule = z.infer<typeof ScheduleSchema>;\n\nexport interface Bounds {\n  minX: number;\n  minY: number;\n  maxX: number;\n  maxY: number;\n}\n\n/** The bounding box of everything drawn on a floor, or null when empty. */\nexport function floorBounds(floor: Floor): Bounds | null {\n  const points: Point[] = [];\n  for (const vertex of floor.scene.vertices) {\n    points.push(vertex.at);\n  }\n  for (const annotation of floor.annotations) {\n    const geometry = annotation.geometry;\n    if (geometry.type === \"point\") {\n      points.push(geometry.at);\n    } else if (geometry.type === \"line\") {\n      points.push(...geometry.points);\n    } else {\n      points.push(...geometry.polygon);\n    }\n  }\n  const [first] = points;\n  if (first === undefined) {\n    return null;\n  }\n  const bounds: Bounds = {\n    minX: first[0],\n    minY: first[1],\n    maxX: first[0],\n    maxY: first[1],\n  };\n  for (const [x, y] of points) {\n    bounds.minX = Math.min(bounds.minX, x);\n    bounds.minY = Math.min(bounds.minY, y);\n    bounds.maxX = Math.max(bounds.maxX, x);\n    bounds.maxY = Math.max(bounds.maxY, y);\n  }\n  return bounds;\n}\n", "import { distance, projectOnSegment } from \"./geometry\";\nimport { wallEnds } from \"./topology\";\nimport { Point, Scene } from \"./scene\";\n\nexport const GRID_MM = 100;\n\nexport type SnapKind =\n  | \"endpoint\"\n  | \"wall\"\n  | \"below\"\n  | \"axis\"\n  | \"angle\"\n  | \"grid\"\n  | \"none\";\n\nexport interface SnapResult {\n  point: Point;\n  kind: SnapKind;\n}\n\nexport interface SnapOptions {\n  /** World-mm tolerance (10 screen px \u00D7 worldPerPixel, typically). */\n  tolerance: number;\n  /** The fixed end of the segment being drawn, if any \u2014 enables axis and\n   * 45\u00B0 angle snapping relative to it. */\n  anchor?: Point;\n  /** Vertices moving with the pointer; walls ending at one are skipped too. */\n  excludeVertices?: readonly string[];\n  /** Hold Alt to bypass snapping entirely. */\n  disabled?: boolean;\n  /** Hold Shift to square the line up with the house from the anchor. */\n  ortho?: boolean;\n  /** The floor shown beneath: its corners and walls are snapped to after\n   * this floor's own, so a wall can be drawn over the one below. */\n  underlay?: Scene | null;\n}\n\nfunction nearestCorner(\n  point: Point,\n  scene: Scene,\n  tolerance: number,\n  excluded: ReadonlySet<string> = new Set(),\n): Point | null {\n  let best: Point | null = null;\n  let gap = tolerance;\n  for (const vertex of scene.vertices) {\n    if (excluded.has(vertex.id)) {\n      continue;\n    }\n    const d = distance(point, vertex.at);\n    if (d < gap) {\n      best = vertex.at;\n      gap = d;\n    }\n  }\n  return best;\n}\n\nfunction nearestOnWall(\n  point: Point,\n  scene: Scene,\n  tolerance: number,\n  excluded: ReadonlySet<string> = new Set(),\n): Point | null {\n  let best: Point | null = null;\n  let gap = tolerance;\n  for (const wall of scene.walls) {\n    if (excluded.has(wall.a) || excluded.has(wall.b)) {\n      continue;\n    }\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    const projection = projectOnSegment(point, ends[0], ends[1]);\n    if (projection.distance < gap) {\n      best = projection.point;\n      gap = projection.distance;\n    }\n  }\n  return best;\n}\n\n/** Within this, two walls count as square to each other. */\nconst SQUARE_TOLERANCE = (0.5 * Math.PI) / 180;\n\nconst QUARTER = Math.PI / 2;\n\nfunction quarterAngle(a: Point, b: Point): number | null {\n  if (a[0] === b[0] && a[1] === b[1]) {\n    return null;\n  }\n  const angle = Math.atan2(b[1] - a[1], b[0] - a[0]);\n  return ((angle % QUARTER) + QUARTER) % QUARTER;\n}\n\nfunction squareTo(left: number, right: number): boolean {\n  const gap = Math.abs(left - right);\n  return Math.min(gap, QUARTER - gap) < SQUARE_TOLERANCE;\n}\n\n/** The angle that most of these lines run square to, by length: radians in\n * [0, \u03C0/2), snapped to 0 within half a degree. */\nexport function squareAngle(lines: Iterable<[Point, Point]>): number {\n  let x = 0;\n  let y = 0;\n  for (const [a, b] of lines) {\n    const angle = quarterAngle(a, b);\n    if (angle === null) {\n      continue;\n    }\n    const length = distance(a, b);\n    x += length * Math.cos(angle * 4);\n    y += length * Math.sin(angle * 4);\n  }\n  if (x === 0 && y === 0) {\n    return 0;\n  }\n  const angle = (Math.atan2(y, x) / 4 + QUARTER) % QUARTER;\n  return squareTo(angle, 0) ? 0 : angle;\n}\n\n/** The house's own square, radians in [0, \u03C0/2): its walls' angle, by length.\n * Walls at a corner being dragged don't count, as they're skewed mid-drag. */\nexport function houseAngle(\n  scene: Scene,\n  moving: ReadonlySet<string> = new Set(),\n): number {\n  const lines: [Point, Point][] = [];\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (ends && !moving.has(wall.a) && !moving.has(wall.b)) {\n      lines.push(ends);\n    }\n  }\n  return squareAngle(lines);\n}\n\n/** Whether a\u2192b runs at 90\u00B0 or 180\u00B0 to a wall already drawn. */\nexport function squareToWalls(a: Point, b: Point, scene: Scene): boolean {\n  const angle = quarterAngle(a, b);\n  if (angle === null) {\n    return false;\n  }\n  return scene.walls.some((wall) => {\n    const ends = wallEnds(scene, wall);\n    const other = ends ? quarterAngle(ends[0], ends[1]) : null;\n    return other !== null && squareTo(angle, other);\n  });\n}\n\n/** Shift: along whichever of the house's axes is nearer, at a whole 100 mm,\n * or level with a corner already drawn when one is close. */\nfunction squared(\n  point: Point,\n  anchor: Point,\n  scene: Scene,\n  options: SnapOptions,\n): Point {\n  const excluded = new Set(options.excludeVertices ?? []);\n  const angle = houseAngle(scene, excluded);\n  const first: Point = [Math.cos(angle), Math.sin(angle)];\n  const second: Point = [-Math.sin(angle), Math.cos(angle)];\n  const along = (axis: Point, at: Point): number =>\n    (at[0] - anchor[0]) * axis[0] + (at[1] - anchor[1]) * axis[1];\n  const axis =\n    Math.abs(along(first, point)) >= Math.abs(along(second, point))\n      ? first\n      : second;\n  let length = Math.round(along(axis, point) / GRID_MM) * GRID_MM;\n  let nearest = options.tolerance;\n  for (const vertex of scene.vertices) {\n    if (excluded.has(vertex.id)) {\n      continue;\n    }\n    const gap = Math.abs(along(axis, vertex.at) - along(axis, point));\n    if (gap < nearest) {\n      nearest = gap;\n      length = along(axis, vertex.at);\n    }\n  }\n  return roundPoint([\n    anchor[0] + axis[0] * length,\n    anchor[1] + axis[1] * length,\n  ]);\n}\n\nfunction roundPoint(point: Point): Point {\n  return [Math.round(point[0]), Math.round(point[1])];\n}\n\nfunction snapToGrid(point: Point): Point {\n  return [\n    Math.round(point[0] / GRID_MM) * GRID_MM,\n    Math.round(point[1] / GRID_MM) * GRID_MM,\n  ];\n}\n\n/** Snap `point` against the scene: corners, then the floor below's, then wall\n * centrelines, then the floor below's, then axis/45\u00B0 alignment with the\n * anchor, then the 100 mm grid. */\nexport function snapPoint(\n  point: Point,\n  scene: Scene,\n  options: SnapOptions,\n): SnapResult {\n  if (options.disabled) {\n    return { point: roundPoint(point), kind: \"none\" };\n  }\n  if (options.ortho && options.anchor) {\n    return {\n      point: squared(point, options.anchor, scene, options),\n      kind: \"axis\",\n    };\n  }\n  const excluded = new Set(options.excludeVertices ?? []);\n  const underlay = options.underlay ?? null;\n  const corner = nearestCorner(point, scene, options.tolerance, excluded);\n  if (corner) {\n    return { point: roundPoint(corner), kind: \"endpoint\" };\n  }\n  const below = underlay && nearestCorner(point, underlay, options.tolerance);\n  if (below) {\n    return { point: roundPoint(below), kind: \"below\" };\n  }\n  const onWall = nearestOnWall(point, scene, options.tolerance, excluded);\n  if (onWall) {\n    return { point: roundPoint(onWall), kind: \"wall\" };\n  }\n  const overWall =\n    underlay && nearestOnWall(point, underlay, options.tolerance);\n  if (overWall) {\n    return { point: roundPoint(overWall), kind: \"below\" };\n  }\n\n  const anchor = options.anchor;\n  if (anchor) {\n    const dx = point[0] - anchor[0];\n    const dy = point[1] - anchor[1];\n    if (Math.abs(dy) < options.tolerance && Math.abs(dx) >= options.tolerance) {\n      return { point: roundPoint([point[0], anchor[1]]), kind: \"axis\" };\n    }\n    if (Math.abs(dx) < options.tolerance && Math.abs(dy) >= options.tolerance) {\n      return { point: roundPoint([anchor[0], point[1]]), kind: \"axis\" };\n    }\n    const length = Math.hypot(dx, dy);\n    if (length > 0) {\n      const angle = Math.atan2(dy, dx);\n      const step = Math.PI / 4;\n      const snapped = Math.round(angle / step) * step;\n      if (Math.abs(angle - snapped) * length < options.tolerance) {\n        return {\n          point: roundPoint([\n            anchor[0] + Math.cos(snapped) * length,\n            anchor[1] + Math.sin(snapped) * length,\n          ]),\n          kind: \"angle\",\n        };\n      }\n    }\n  }\n\n  return { point: snapToGrid(point), kind: \"grid\" };\n}\n\n/** How far a dragged corner looks for one to line up with, mm. */\nconst LINE_UP_REACH = 3000;\n\n/** A dragged group's shift, nudged so a moving corner lines up with one that\n * stays, along each of the house's axes in turn, when within `tolerance`. */\nexport function lineUpShift(\n  scene: Scene,\n  moving: ReadonlySet<string>,\n  shift: Point,\n  tolerance: number,\n): Point {\n  const angle = houseAngle(scene, moving);\n  const axes: Point[] = [\n    [Math.cos(angle), Math.sin(angle)],\n    [-Math.sin(angle), Math.cos(angle)],\n  ];\n  const fixed = scene.vertices.filter((vertex) => !moving.has(vertex.id));\n  const movers = scene.vertices\n    .filter((vertex) => moving.has(vertex.id))\n    .map((vertex): Point => [vertex.at[0] + shift[0], vertex.at[1] + shift[1]]);\n  const result: Point = [shift[0], shift[1]];\n  for (const axis of axes) {\n    let correction = 0;\n    let nearest = tolerance;\n    for (const mover of movers) {\n      for (const vertex of fixed) {\n        if (distance(mover, vertex.at) > LINE_UP_REACH) {\n          continue;\n        }\n        const gap =\n          (vertex.at[0] - mover[0]) * axis[0] +\n          (vertex.at[1] - mover[1]) * axis[1];\n        if (Math.abs(gap) < nearest) {\n          nearest = Math.abs(gap);\n          correction = gap;\n        }\n      }\n    }\n    result[0] += axis[0] * correction;\n    result[1] += axis[1] * correction;\n  }\n  return roundPoint(result);\n}\n", "import { z } from \"zod\";\nimport { distance, polygonArea, polygonCentroid } from \"./geometry\";\nimport { newId } from \"./ids\";\nimport { OPENING_DEFAULTS, openingSpot, wallSegments } from \"./openings\";\nimport type { OverlaySpec } from \"./overlay\";\nimport { type Point, PointSchema, type Scene } from \"./scene\";\nimport { squareAngle } from \"./snap\";\nimport { insertRoom, polygonOf, wallEnds } from \"./topology\";\nimport type { TraceTransform } from \"./trace\";\n\n// A plan Claude read off the trace (apps/design/draft.py): rooms and openings\n// in the image's pixels. It becomes rooms, walls and openings here, tidied the\n// way someone drawing it would: near corners merged, near-square walls squared.\n\nexport const DraftSchema = z.object({\n  rooms: z.array(\n    z.object({\n      name: z.string(),\n      room_type: z.string(),\n      corners: z.array(PointSchema),\n    }),\n  ),\n  openings: z.array(\n    z.object({\n      type: z.enum([\"door\", \"window\", \"opening\"]),\n      from: PointSchema,\n      to: PointSchema,\n    }),\n  ),\n});\n\nexport type Draft = z.infer<typeof DraftSchema>;\n\n/** Corners closer than this are one corner; a wall this near is met. */\nexport const MERGE_MM = 150;\n\n/** Walls within this of the house's square are made square. */\nconst SQUARE_DEG = 3;\n\n/** How far off its wall a door or window can be read and still land on it. */\nconst OPENING_REACH_MM = 400;\n\n/** Narrower than this, an opening is a misreading. */\nconst NARROWEST_OPENING_MM = 300;\n\nexport function pixelToWorld(transform: TraceTransform, pixel: Point): Point {\n  const turn = (transform.rotation * Math.PI) / 180;\n  const x = pixel[0] * transform.scale;\n  const y = pixel[1] * transform.scale;\n  return [\n    transform.offsetX + x * Math.cos(turn) - y * Math.sin(turn),\n    transform.offsetY + x * Math.sin(turn) + y * Math.cos(turn),\n  ];\n}\n\nexport function draftToWorld(draft: Draft, transform: TraceTransform): Draft {\n  const world = (point: Point) => pixelToWorld(transform, point);\n  return {\n    rooms: draft.rooms.map((room) => ({\n      ...room,\n      corners: room.corners.map(world),\n    })),\n    openings: draft.openings.map((opening) => ({\n      ...opening,\n      from: world(opening.from),\n      to: world(opening.to),\n    })),\n  };\n}\n\nclass Groups {\n  private parent: number[];\n\n  constructor(size: number) {\n    this.parent = Array.from({ length: size }, (_, index) => index);\n  }\n\n  find(index: number): number {\n    let root = index;\n    while (this.parent[root] !== root) {\n      root = this.parent[root] as number;\n    }\n    this.parent[index] = root;\n    return root;\n  }\n\n  join(a: number, b: number): void {\n    this.parent[this.find(a)] = this.find(b);\n  }\n}\n\n/** Snap each coordinate to its group's mean. */\nfunction settle(values: number[], groups: Groups): number[] {\n  const sums = new Map<number, [number, number]>();\n  values.forEach((value, index) => {\n    const root = groups.find(index);\n    const [sum, count] = sums.get(root) ?? [0, 0];\n    sums.set(root, [sum + value, count + 1]);\n  });\n  return values.map((_, index) => {\n    const [sum, count] = sums.get(groups.find(index)) ?? [0, 1];\n    return sum / count;\n  });\n}\n\n/** Merge near corners, square near-square walls, and close near T-junctions,\n * so neighbouring rooms share their walls exactly. World mm in and out. */\nexport function tidy(draft: Draft): Draft {\n  const corners: { at: Point; count: number }[] = [];\n  const cornerOf = (point: Point): number => {\n    let best = -1;\n    let nearest = MERGE_MM;\n    corners.forEach((corner, index) => {\n      const gap = distance(corner.at, point);\n      if (gap <= nearest) {\n        best = index;\n        nearest = gap;\n      }\n    });\n    const corner = corners[best];\n    if (!corner) {\n      corners.push({ at: point, count: 1 });\n      return corners.length - 1;\n    }\n    corner.at = [\n      (corner.at[0] * corner.count + point[0]) / (corner.count + 1),\n      (corner.at[1] * corner.count + point[1]) / (corner.count + 1),\n    ];\n    corner.count += 1;\n    return best;\n  };\n  const rings = draft.rooms.map((room) => {\n    const ring = room.corners\n      .map(cornerOf)\n      .filter((id, index, all) => id !== all[(index + 1) % all.length]);\n    return { room, ring };\n  });\n\n  const at = (id: number): Point => (corners[id] as { at: Point }).at;\n  const edges: [number, number][] = [];\n  for (const { ring } of rings) {\n    ring.forEach((id, index) => {\n      edges.push([id, ring[(index + 1) % ring.length] as number]);\n    });\n  }\n\n  // In the house's own frame its walls run along x and y.\n  const angle = squareAngle(edges.map(([a, b]) => [at(a), at(b)]));\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  const local = corners.map(\n    ({ at: [x, y] }): Point => [x * cos + y * sin, -x * sin + y * cos],\n  );\n\n  // Corners that must share an x, and those that must share a y.\n  const level = [new Groups(corners.length), new Groups(corners.length)];\n  const flat = Math.tan((SQUARE_DEG * Math.PI) / 180);\n  for (const [a, b] of edges) {\n    const from = local[a] as Point;\n    const to = local[b] as Point;\n    const dx = Math.abs(to[0] - from[0]);\n    const dy = Math.abs(to[1] - from[1]);\n    const along = dy <= dx * flat ? 0 : dx <= dy * flat ? 1 : null;\n    if (along === null) {\n      continue;\n    }\n    const across = along === 0 ? 1 : 0;\n    const groups = level[across] as Groups;\n    groups.join(a, b);\n    // A corner touching the wall part-way along meets it there.\n    const low = Math.min(from[along], to[along]);\n    const high = Math.max(from[along], to[along]);\n    local.forEach((point, index) => {\n      if (\n        index !== a &&\n        index !== b &&\n        point[along] > low &&\n        point[along] < high &&\n        Math.abs(point[across] - from[across]) < MERGE_MM\n      ) {\n        groups.join(index, a);\n      }\n    });\n  }\n  const squareX = settle(\n    local.map(([x]) => x),\n    level[0] as Groups,\n  );\n  const squareY = settle(\n    local.map(([, y]) => y),\n    level[1] as Groups,\n  );\n  const settled = corners.map((_, id): Point => {\n    const x = squareX[id] ?? 0;\n    const y = squareY[id] ?? 0;\n    return [x * cos - y * sin, x * sin + y * cos];\n  });\n\n  return {\n    rooms: rings\n      .filter(({ ring }) => ring.length >= 3)\n      .map(({ room, ring }) => ({\n        ...room,\n        corners: ring.map((id) => settled[id] as Point),\n      })),\n    openings: draft.openings,\n  };\n}\n\n/** Add a tidied draft to the scene: rooms largest first, so smaller ones weld\n * onto their walls, then each opening on the wall nearest it. */\nexport function applyDraft(\n  scene: Scene,\n  draft: Draft,\n): { rooms: number; openings: number } {\n  let rooms = 0;\n  const bySize = [...draft.rooms].sort(\n    (left, right) => polygonArea(right.corners) - polygonArea(left.corners),\n  );\n  for (const room of bySize) {\n    if (\n      insertRoom(scene, room.corners, {\n        name: room.name,\n        room_type: room.room_type,\n      })\n    ) {\n      rooms += 1;\n    }\n  }\n\n  let openings = 0;\n  for (const opening of draft.openings) {\n    const width = Math.round(distance(opening.from, opening.to));\n    if (width < NARROWEST_OPENING_MM) {\n      continue;\n    }\n    const centre: Point = [\n      (opening.from[0] + opening.to[0]) / 2,\n      (opening.from[1] + opening.to[1]) / 2,\n    ];\n    const spot = openingSpot(centre, scene, width, OPENING_REACH_MM);\n    const clash = scene.openings.some(\n      (other) =>\n        spot !== null &&\n        other.wall === spot.wall.id &&\n        other.offset < spot.offset + width &&\n        spot.offset < other.offset + other.width,\n    );\n    if (!spot || clash) {\n      continue;\n    }\n    const defaults = OPENING_DEFAULTS[opening.type];\n    scene.openings.push({\n      id: newId(\"o\"),\n      wall: spot.wall.id,\n      type: opening.type,\n      offset: spot.offset,\n      width,\n      height: defaults.height,\n      sill: defaults.sill,\n      swing: opening.type === \"door\" ? \"left\" : \"none\",\n      flip: false,\n    });\n    openings += 1;\n  }\n  return { rooms, openings };\n}\n\n/** What the draft adds to `before`: its walls, gapped at their openings, and\n * its rooms' names. */\nexport function draftPreview(before: Scene, after: Scene): OverlaySpec[] {\n  const known = new Map(\n    before.walls.map((wall) => [\n      wall.id,\n      JSON.stringify(wallEnds(before, wall)),\n    ]),\n  );\n  const oldOpenings = new Set(before.openings.map((opening) => opening.id));\n  const specs: OverlaySpec[] = [];\n  for (const wall of after.walls) {\n    const ends = wallEnds(after, wall);\n    const mine = after.openings.filter((opening) => opening.wall === wall.id);\n    if (\n      !ends ||\n      (known.get(wall.id) === JSON.stringify(ends) &&\n        mine.every((opening) => oldOpenings.has(opening.id)))\n    ) {\n      continue;\n    }\n    for (const [a, b] of wallSegments(ends[0], ends[1], mine)) {\n      specs.push({ kind: \"line\", a, b, thickness: wall.thickness });\n    }\n  }\n  const oldRooms = new Set(before.rooms.map((room) => room.id));\n  for (const room of after.rooms) {\n    if (!oldRooms.has(room.id)) {\n      specs.push({\n        kind: \"text\",\n        at: polygonCentroid(polygonOf(after, room)),\n        text: room.name,\n      });\n    }\n  }\n  return specs;\n}\n", "// Which Design.updated the editor's figures were worked out from\n// (apps/design/freshness.py). The editor loads the design at one `updated`;\n// each of its own changes moves it on, and the response says from what to\n// what. Chained from the loaded value, those give the latest `updated` the\n// editor has seen all of. Someone else's change breaks the chain, so figures\n// stamped with it are older than the plan and the server refuses them.\n\nexport const CHANGES_HEADER = \"X-Design-Changes\";\n\n/** Thrown when the server refuses figures worked out before the plan's last change. */\nexport class StaleDesignError extends Error {}\n\nexport class Freshness {\n  private design: number | null = null;\n  private loaded: string | null = null;\n  private readonly moves = new Map<string, string>();\n  private pending = 0;\n  private waiting: (() => void)[] = [];\n\n  /** The design as the editor loaded it. */\n  load(design: number, updated: string | undefined): void {\n    this.design = design;\n    this.loaded = updated ?? null;\n    this.moves.clear();\n  }\n\n  /** A response's header: `<pk> <before> <after>, ...`. */\n  note(header: string | null): void {\n    for (const change of (header ?? \"\").split(\",\")) {\n      const [pk, before, after] = change.trim().split(\" \");\n      if (Number(pk) === this.design && before && after) {\n        this.moves.set(before, after);\n      }\n    }\n  }\n\n  /** The latest `updated` the editor has seen every change up to. */\n  seen(): string | null {\n    let at = this.loaded;\n    const visited = new Set<string>();\n    while (at !== null && this.moves.has(at) && !visited.has(at)) {\n      visited.add(at);\n      at = this.moves.get(at) ?? null;\n    }\n    return at;\n  }\n\n  /** Counts a change in flight, so `settled` can wait for its answer. */\n  async track<T>(request: Promise<T>): Promise<T> {\n    this.pending += 1;\n    try {\n      return await request;\n    } finally {\n      this.pending -= 1;\n      if (this.pending === 0) {\n        for (const resolve of this.waiting.splice(0)) {\n          resolve();\n        }\n      }\n    }\n  }\n\n  /** Once every change in flight has answered. */\n  settled(): Promise<void> {\n    return this.pending === 0\n      ? Promise.resolve()\n      : new Promise((resolve) => this.waiting.push(resolve));\n  }\n\n  /**\n   * Run `write` with the `updated` its figures are worked out from. Refused\n   * because one of the editor's own changes was still answering, it's worked\n   * out again once; refused for someone else's, the error stands.\n   */\n  async fresh<T>(write: (seen: string | null) => Promise<T>): Promise<T> {\n    const seen = this.seen();\n    try {\n      return await write(seen);\n    } catch (error) {\n      if (!(error instanceof StaleDesignError)) {\n        throw error;\n      }\n      await this.settled();\n      if (this.seen() === seen) {\n        throw error;\n      }\n      return write(this.seen());\n    }\n  }\n}\n\n/** The editor's: api.ts notes every change's answer on it. */\nexport const freshness = new Freshness();\n", "{\n  \"description\": \"Seasonal efficiency and responsiveness by heating system\",\n  \"key_type\": \"text\",\n  \"shape\": \"tuple\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"4b\",\n  \"value_type\": \"integer\",\n  \"values\": {\n    \"AIR_SOURCE_HEAT_PUMP_LOW_FLOW\": [170, 170, 214],\n    \"COMBI_OIL_POST_98\": [77, 68, 129],\n    \"CONDENSING_COMBI_AUTOMATIC_POST_98\": [84, 75, 104],\n    \"ELECTRIC_BOILER\": [100, 100, 191],\n    \"ELECTRIC_IMMERSION\": [100, 100, 903],\n    \"ELECTRIC_LIQUID_RADIATORS\": [100, 100, 694],\n    \"ELECTRIC_ROOM_HEATERS\": [100, 100, 691],\n    \"ELECTRIC_STORAGE_HEATERS\": [100, 100, 403],\n    \"ELECTRIC_UNDERFLOOR\": [100, 100, 421],\n    \"GAS_FIRE_OPEN_FLUE\": [63, 63, 603],\n    \"GROUND_SOURCE_HEAT_PUMP_LOW_FLOW\": [230, 170, 211],\n    \"SOLID_FUEL_OPEN_FIRE\": [37, 37, 631],\n    \"STANDARD_OIL_POST_98\": [80, 68, 126],\n    \"STOVE_PELLET_TO_RADIATORS\": [75, 70, 159],\n    \"WARM_AIR_ELECTRIC\": [100, 100, 515],\n    \"WARM_AIR_GAS\": [76, 76, 502]\n  }\n}\n", "{\n  \"description\": \"Thermal bridging and other utilisation factors\",\n  \"key_type\": \"text\",\n  \"shape\": \"scalar\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"10c\",\n  \"units\": \"\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"A\": \"5.1\",\n    \"A_PLUS\": \"5.6\",\n    \"A_PLUS_PLUS\": \"6.1\",\n    \"A_PLUS_PLUS_PLUS\": \"8.5\",\n    \"B\": \"4.6\",\n    \"C\": \"4.1\",\n    \"D\": \"3.6\",\n    \"E\": \"3.1\",\n    \"F\": \"2.6\",\n    \"G\": \"2.6\",\n    \"UNKNOWN\": \"4.3\"\n  }\n}\n", "{\n  \"description\": \"Monthly emission factors by fuel\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"12d\",\n  \"units\": \"kilogram / kilowatt_hour\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"EIGHTEEN_HOUR_TARIFF_HIGH_RATE\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"EIGHTEEN_HOUR_TARIFF_LOW_RATE\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"ELECTRICITY_ANY_TARIFF\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"ELECTRICITY_FOR_PUMPING_IN_DISTRIBUTION_NETWORK\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"ELECTRICITY_SOLD_TO_GRID_OTHER\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"ELECTRICITY_SOLD_TO_GRID_PV\": [\"0.196\", \"0.190\", \"0.175\", \"0.153\", \"0.129\", \"0.106\", \"0.092\", \"0.093\", \"0.110\", \"0.138\", \"0.169\", \"0.197\"],\n    \"HEAT_FROM_ELECTRIC_HEAT_PUMP\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"LOW_GRADE_HEAT_RECOVERED_FROM_PROCESS\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"SEVEN_HOUR_TARIFF_HIGH_RATE\": [\"0.171\", \"0.168\", \"0.161\", \"0.150\", \"0.138\", \"0.125\", \"0.117\", \"0.118\", \"0.128\", \"0.143\", \"0.158\", \"0.171\"],\n    \"SEVEN_HOUR_TARIFF_LOW_RATE\": [\"0.143\", \"0.141\", \"0.135\", \"0.126\", \"0.116\", \"0.105\", \"0.098\", \"0.099\", \"0.107\", \"0.120\", \"0.133\", \"0.144\"],\n    \"STANDARD_TARIFF\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"],\n    \"TEN_HOUR_TARIFF_HIGH_RATE\": [\"0.168\", \"0.165\", \"0.159\", \"0.148\", \"0.136\", \"0.124\", \"0.115\", \"0.116\", \"0.126\", \"0.141\", \"0.156\", \"0.168\"],\n    \"TEN_HOUR_TARIFF_LOW_RATE\": [\"0.155\", \"0.153\", \"0.146\", \"0.137\", \"0.126\", \"0.114\", \"0.106\", \"0.107\", \"0.116\", \"0.130\", \"0.144\", \"0.155\"],\n    \"TWENTYFOUR_HOUR_HEATING_TARIFF\": [\"0.163\", \"0.160\", \"0.153\", \"0.143\", \"0.132\", \"0.120\", \"0.111\", \"0.112\", \"0.122\", \"0.136\", \"0.151\", \"0.163\"]\n  }\n}\n", "{\n  \"description\": \"Fuel prices and emission factors for PV and generation\",\n  \"key_type\": \"text\",\n  \"shape\": \"tuple\",\n  \"source\": \"apps/twin/rdsap/tables.py\",\n  \"standard\": \"RdSAP 10\",\n  \"table\": \"32\",\n  \"units\": [\"GBP / year\", \"pence / kilowatt_hour\", \"kilogram / kilowatt_hour\", \"\", \"\"],\n  \"value_type\": [\"quantity\", \"quantity\", \"quantity\", \"quantity\", \"integer\"],\n  \"values\": {\n    \"ANTHRACITE\": [\"0\", \"3.64\", \"0.395\", \"1.064\", 15],\n    \"B30K\": [\"0\", \"6.10\", \"0.214\", \"1.136\", 75],\n    \"BIOETHANOL_FROM_ANY_BIOMASS_SOURCE\": [\"0\", \"47\", \"0.105\", \"1.472\", 76],\n    \"BIOGAS_INCLUDING_ANAEROBIC_DIGESTION\": [\"70\", \"7.60\", \"0.024\", \"1.286\", 7],\n    \"BIO_LIQUID_FAME_FROM_ANIMAL_OR_VEGETABLE_OILS\": [\"0\", \"5.44\", \"0.018\", \"1.18\", 73],\n    \"BIO_LIQUID_HVO_FROM_USED_COOKING_OIL\": [\"0\", \"7.64\", \"0.036\", \"1.18\", 71],\n    \"BOTTLED_LPG_FOR_MAIN_HEATING_SYSTEM\": [\"0\", \"10.30\", \"0.241\", \"1.141\", 3],\n    \"BOTTLED_LPG_FOR_SECONDARY_HEATING\": [\"0\", \"12.19\", \"0.241\", \"1.133\", 5],\n    \"BULK_LPG\": [\"70\", \"7.60\", \"0.241\", \"1.141\", 2],\n    \"DUAL_FUEL_APPLIANCE_MINERAL_AND_WOOD\": [\"0\", \"3.99\", \"0.087\", \"1.049\", 10],\n    \"EIGHTEEN_HOUR_TARIFF_HIGH_RATE\": [\"40\", \"13.67\", \"0.136\", \"1.501\", 38],\n    \"EIGHTEEN_HOUR_TARIFF_LOW_RATE\": [\"0\", \"7.41\", \"0.136\", \"1.501\", 40],\n    \"ELECTRICITY_ANY_TARIFF\": [\"0\", \"0\", \"0.136\", \"1.501\", 39],\n    \"ELECTRICITY_FOR_PUMPING_IN_DISTRIBUTION_NETWORK\": [\"0\", \"0\", \"0.136\", \"1.501\", 50],\n    \"ELECTRICITY_GENERATED_BY_CHP_EXISTING_POST_2015_EXPORT\": [\"0\", \"0\", \"0.394\", \"2.345\", 84],\n    \"ELECTRICITY_GENERATED_BY_CHP_EXISTING_POST_2015_FLEXIBLE\": [\"0\", \"0\", \"0.42\", \"2.369\", 85],\n    \"ELECTRICITY_GENERATED_BY_CHP_EXISTING_POST_2015_STANDARD\": [\"0\", \"0\", \"0.348\", \"2.149\", 86],\n    \"ELECTRICITY_GENERATED_BY_CHP_EXISTING_PRE_2015_EXPORT\": [\"0\", \"0\", \"0.394\", \"2.345\", 87],\n    \"ELECTRICITY_GENERATED_BY_CHP_EXISTING_PRE_2015_FLEXIBLE\": [\"0\", \"0\", \"0.42\", \"2.369\", 88],\n    \"ELECTRICITY_GENERATED_BY_CHP_EXISTING_PRE_2015_STANDARD\": [\"0\", \"0\", \"0.374\", \"2.23\", 89],\n    \"ELECTRICITY_GENERATED_BY_CHP_NEW_EXPORT\": [\"0\", \"0\", \"0.394\", \"2.345\", 81],\n    \"ELECTRICITY_GENERATED_BY_CHP_NEW_FLEXIBLE\": [\"0\", \"0\", \"0.42\", \"2.369\", 82],\n    \"ELECTRICITY_GENERATED_BY_CHP_NEW_STANDARD\": [\"0\", \"0\", \"0.311\", \"2.107\", 83],\n    \"ELECTRICITY_SOLD_TO_GRID_OTHER\": [\"0\", \"0\", \"0.136\", \"0.501\", 36],\n    \"ELECTRICITY_SOLD_TO_GRID_PV\": [\"0\", \"13.19\", \"0.136\", \"0.501\", 60],\n    \"HEATING_OIL\": [\"0\", \"7.64\", \"0.298\", \"1.18\", 4],\n    \"HEAT_FROM_BOILERS_B30D\": [\"120\", \"4.24\", \"0.269\", \"1.09\", 55],\n    \"HEAT_FROM_BOILERS_BIOGAS_LANDFILL_OR_SEWAGE_GAS\": [\"120\", \"4.24\", \"0.024\", \"1.286\", 44],\n    \"HEAT_FROM_BOILERS_BIOMASS\": [\"120\", \"4.24\", \"0.029\", \"1.037\", 43],\n    \"HEAT_FROM_BOILERS_COAL\": [\"120\", \"4.24\", \"0.375\", \"1.064\", 54],\n    \"HEAT_FROM_BOILERS_FAME_FROM_ANIMAL_OR_VEGETABLE_OILS\": [\"120\", \"4.24\", \"0.018\", \"1.18\", 58],\n    \"HEAT_FROM_BOILERS_LPG\": [\"120\", \"4.24\", \"0.241\", \"1.141\", 52],\n    \"HEAT_FROM_BOILERS_MAINS_GAS\": [\"120\", \"4.24\", \"0.21\", \"1.13\", 51],\n    \"HEAT_FROM_BOILERS_OIL\": [\"120\", \"4.24\", \"0.335\", \"1.18\", 53],\n    \"HEAT_FROM_BOILERS_THAT_CAN_USE_MINERAL_OIL_OR_BIODIESEL\": [\"120\", \"4.24\", \"0.335\", \"1.18\", 56],\n    \"HEAT_FROM_BOILERS_USING_HVO_FROM_USED_COOKING_OIL\": [\"120\", \"4.24\", \"0.036\", \"1.18\", 57],\n    \"HEAT_FROM_CHP\": [\"120\", \"2.97\", \"0.011\", \"0.051\", 48],\n    \"HEAT_FROM_ELECTRIC_HEAT_PUMP\": [\"120\", \"4.24\", \"0.136\", \"1.501\", 41],\n    \"HEAT_RECOVERED_FROM_GEOTHERMAL_OR_OTHER_NATURAL_PROCESSES\": [\"120\", \"2.97\", \"0.011\", \"0.051\", 46],\n    \"HEAT_RECOVERED_FROM_POWER_STATION\": [\"120\", \"2.97\", \"0.015\", \"0.063\", 45],\n    \"HEAT_RECOVERED_FROM_WASTE_COMBUSTION\": [\"120\", \"4.24\", \"0.015\", \"0.063\", 42],\n    \"HIGH_GRADE_HEAT_RECOVERED_FROM_PROCESS\": [\"120\", \"2.97\", \"0.011\", \"0.051\", 47],\n    \"HOUSE_COAL\": [\"0\", \"3.67\", \"0.395\", \"1.064\", 11],\n    \"LOW_GRADE_HEAT_RECOVERED_FROM_PROCESS\": [\"120\", \"2.97\", \"0.136\", \"1.501\", 49],\n    \"LPG_SUBJECT_TO_SPECIAL_CONDITION_11F\": [\"120\", \"3.48\", \"0.241\", \"1.163\", 9],\n    \"MAINS_GAS\": [\"120\", \"3.48\", \"0.21\", \"1.13\", 1],\n    \"MANUFACTURED_SMOKELESS_FUEL\": [\"0\", \"4.61\", \"0.366\", \"1.261\", 12],\n    \"SEVEN_HOUR_TARIFF_HIGH_RATE\": [\"24\", \"15.29\", \"0.136\", \"1.501\", 32],\n    \"SEVEN_HOUR_TARIFF_LOW_RATE\": [\"0\", \"5.50\", \"0.136\", \"1.501\", 31],\n    \"STANDARD_TARIFF\": [\"54\", \"13.19\", \"0.136\", \"1.501\", 30],\n    \"TEN_HOUR_TARIFF_HIGH_RATE\": [\"23\", \"14.68\", \"0.136\", \"1.501\", 34],\n    \"TEN_HOUR_TARIFF_LOW_RATE\": [\"0\", \"7.50\", \"0.136\", \"1.501\", 33],\n    \"TWENTYFOUR_HOUR_HEATING_TARIFF\": [\"70\", \"6.61\", \"0.136\", \"1.501\", 35],\n    \"WOOD_CHIPS\": [\"0\", \"3.07\", \"0.023\", \"1.046\", 21],\n    \"WOOD_LOGS\": [\"0\", \"4.23\", \"0.028\", \"1.046\", 20],\n    \"WOOD_PELLETS_BULK_SUPPLY_FOR_MAIN_HEATING\": [\"0\", \"5.26\", \"0.053\", \"1.325\", 23],\n    \"WOOD_PELLETS_IN_BAGS_FOR_SECONDARY_HEATING\": [\"0\", \"5.81\", \"0.053\", \"1.325\", 22]\n  }\n}\n", "{\n  \"description\": \"Solar declination by month, the last row of Table U3\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U3\",\n  \"units\": \"degree\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"MONTHLY\": [\"-20.7\", \"-12.8\", \"-1.8\", \"9.8\", \"18.8\", \"23.1\", \"21.2\", \"13.7\", \"2.9\", \"-8.7\", \"-18.4\", \"-23.0\"]\n  }\n}\n", "{\n  \"description\": \"Glazing g-value and light transmittance by glazing type\",\n  \"key_type\": \"text\",\n  \"shape\": \"tuple\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"6b\",\n  \"value_type\": \"decimal\",\n  \"values\": {\n    \"DOUBLE_GLAZED\": [\"0.76\", \"0.8\"],\n    \"DOUBLE_GLAZED_LOW_E_HARD_COAT\": [\"0.72\", \"0.8\"],\n    \"DOUBLE_GLAZED_LOW_E_SOFT_COAT\": [\"0.63\", \"0.8\"],\n    \"SECONDARY_GLAZED\": [\"0.76\", \"0.8\"],\n    \"SINGLE_GLAZED\": [\"0.85\", \"0.9\"],\n    \"TRIPLE_GLAZED\": [\"0.68\", \"0.7\"],\n    \"TRIPLE_GLAZED_LOW_E_HARD_COAT\": [\"0.64\", \"0.7\"],\n    \"TRIPLE_GLAZED_LOW_E_SOFT_COAT\": [\"0.57\", \"0.7\"]\n  }\n}\n", "{\n  \"description\": \"Frame factor by frame type\",\n  \"key_type\": \"text\",\n  \"shape\": \"scalar\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"6c\",\n  \"value_type\": \"decimal\",\n  \"values\": {\n    \"METAL\": \"0.8\",\n    \"PVC\": \"0.7\",\n    \"WOOD\": \"0.7\"\n  }\n}\n", "{\n  \"description\": \"Solar access and shading factors by overshading\",\n  \"key_type\": \"text\",\n  \"shape\": \"tuple\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"6d\",\n  \"value_type\": \"decimal\",\n  \"values\": {\n    \"AVERAGE_OR_UNKNOWN\": [\"0.77\", \"0.9\", \"0.83\"],\n    \"HEAVY\": [\"0.3\", \"0.5\", \"0.5\"],\n    \"MORE_THAN_AVERAGE\": [\"0.54\", \"0.7\", \"0.67\"],\n    \"VERY_LITTLE\": [\"1.0\", \"1.0\", \"1.0\"]\n  }\n}\n", "{\n  \"description\": \"Mean external temperature by region and month\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U1\",\n  \"units\": \"degree_Celsius\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"0\": [\"4.3\", \"4.9\", \"6.5\", \"8.9\", \"11.7\", \"14.6\", \"16.6\", \"16.4\", \"14.1\", \"10.6\", \"7.1\", \"4.2\"],\n    \"1\": [\"5.1\", \"5.6\", \"7.4\", \"9.9\", \"13.0\", \"16.0\", \"17.9\", \"17.8\", \"15.2\", \"11.6\", \"8.0\", \"5.1\"],\n    \"10\": [\"4.0\", \"4.6\", \"6.1\", \"8.3\", \"10.9\", \"13.8\", \"15.8\", \"15.6\", \"13.5\", \"10.1\", \"6.7\", \"3.8\"],\n    \"11\": [\"4.3\", \"4.9\", \"6.5\", \"8.9\", \"11.7\", \"14.6\", \"16.6\", \"16.4\", \"14.1\", \"10.6\", \"7.1\", \"4.2\"],\n    \"12\": [\"4.7\", \"5.2\", \"7.0\", \"9.5\", \"12.5\", \"15.4\", \"17.6\", \"17.6\", \"15.0\", \"11.4\", \"7.7\", \"4.7\"],\n    \"13\": [\"5.0\", \"5.3\", \"6.5\", \"8.5\", \"11.2\", \"13.7\", \"15.3\", \"15.3\", \"13.5\", \"10.7\", \"7.8\", \"5.2\"],\n    \"14\": [\"4.0\", \"4.4\", \"5.6\", \"7.9\", \"10.4\", \"13.0\", \"14.5\", \"14.4\", \"12.5\", \"9.3\", \"6.5\", \"3.8\"],\n    \"15\": [\"3.6\", \"4.0\", \"5.4\", \"7.7\", \"10.1\", \"12.9\", \"14.6\", \"14.5\", \"12.5\", \"9.2\", \"6.1\", \"3.2\"],\n    \"16\": [\"3.3\", \"3.6\", \"5.0\", \"7.1\", \"9.3\", \"12.2\", \"14.0\", \"13.9\", \"12.0\", \"8.8\", \"5.7\", \"2.9\"],\n    \"17\": [\"3.1\", \"3.2\", \"4.4\", \"6.6\", \"8.9\", \"11.4\", \"13.2\", \"13.1\", \"11.3\", \"8.2\", \"5.4\", \"2.7\"],\n    \"18\": [\"5.2\", \"5.0\", \"5.8\", \"7.6\", \"9.7\", \"11.8\", \"13.4\", \"13.6\", \"12.1\", \"9.6\", \"7.3\", \"5.2\"],\n    \"19\": [\"4.4\", \"4.2\", \"5.0\", \"7.0\", \"8.9\", \"11.2\", \"13.1\", \"13.2\", \"11.7\", \"9.1\", \"6.6\", \"4.3\"],\n    \"2\": [\"5.0\", \"5.4\", \"7.1\", \"9.5\", \"12.6\", \"15.4\", \"17.4\", \"17.5\", \"15.0\", \"11.7\", \"8.1\", \"5.2\"],\n    \"20\": [\"4.6\", \"4.1\", \"4.7\", \"6.5\", \"8.3\", \"10.5\", \"12.4\", \"12.8\", \"11.4\", \"8.8\", \"6.5\", \"4.6\"],\n    \"21\": [\"4.8\", \"5.2\", \"6.4\", \"8.4\", \"10.9\", \"13.5\", \"15.0\", \"14.9\", \"13.1\", \"10.0\", \"7.2\", \"4.7\"],\n    \"3\": [\"5.4\", \"5.7\", \"7.3\", \"9.6\", \"12.6\", \"15.4\", \"17.3\", \"17.3\", \"15.0\", \"11.8\", \"8.4\", \"5.5\"],\n    \"4\": [\"6.1\", \"6.4\", \"7.5\", \"9.3\", \"11.9\", \"14.5\", \"16.2\", \"16.3\", \"14.6\", \"11.8\", \"9.0\", \"6.4\"],\n    \"5E\": [\"4.9\", \"5.3\", \"7.0\", \"9.3\", \"12.2\", \"15.0\", \"16.7\", \"16.7\", \"14.4\", \"11.1\", \"7.8\", \"4.9\"],\n    \"5W\": [\"4.9\", \"5.3\", \"7.0\", \"9.3\", \"12.2\", \"15.0\", \"16.7\", \"16.7\", \"14.4\", \"11.1\", \"7.8\", \"4.9\"],\n    \"6\": [\"4.3\", \"4.8\", \"6.6\", \"9.0\", \"11.8\", \"14.8\", \"16.6\", \"16.5\", \"14.0\", \"10.5\", \"7.1\", \"4.2\"],\n    \"7E\": [\"4.7\", \"5.2\", \"6.7\", \"9.1\", \"12.0\", \"14.7\", \"16.4\", \"16.3\", \"14.1\", \"10.7\", \"7.5\", \"4.6\"],\n    \"7W\": [\"4.7\", \"5.2\", \"6.7\", \"9.1\", \"12.0\", \"14.7\", \"16.4\", \"16.3\", \"14.1\", \"10.7\", \"7.5\", \"4.6\"],\n    \"8E\": [\"3.9\", \"4.3\", \"5.6\", \"7.9\", \"10.7\", \"13.2\", \"14.9\", \"14.8\", \"12.8\", \"9.7\", \"6.6\", \"3.7\"],\n    \"8S\": [\"3.9\", \"4.3\", \"5.6\", \"7.9\", \"10.7\", \"13.2\", \"14.9\", \"14.8\", \"12.8\", \"9.7\", \"6.6\", \"3.7\"],\n    \"9E\": [\"4.0\", \"4.5\", \"5.8\", \"7.9\", \"10.4\", \"13.3\", \"15.2\", \"15.1\", \"13.1\", \"9.7\", \"6.6\", \"3.7\"],\n    \"9S\": [\"4.0\", \"4.5\", \"5.8\", \"7.9\", \"10.4\", \"13.3\", \"15.2\", \"15.1\", \"13.1\", \"9.7\", \"6.6\", \"3.7\"]\n  }\n}\n", "{\n  \"description\": \"Mean horizontal solar irradiance by region and month\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U3\",\n  \"units\": \"watt / meter ** 2\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"0\": [\"26\", \"54\", \"96\", \"150\", \"192\", \"200\", \"189\", \"157\", \"115\", \"66\", \"33\", \"21\"],\n    \"1\": [\"30\", \"56\", \"98\", \"157\", \"195\", \"217\", \"203\", \"173\", \"127\", \"73\", \"39\", \"24\"],\n    \"10\": [\"25\", \"51\", \"95\", \"152\", \"196\", \"198\", \"190\", \"156\", \"115\", \"64\", \"32\", \"20\"],\n    \"11\": [\"26\", \"54\", \"96\", \"150\", \"192\", \"200\", \"189\", \"157\", \"115\", \"66\", \"33\", \"21\"],\n    \"12\": [\"30\", \"58\", \"101\", \"165\", \"203\", \"220\", \"206\", \"173\", \"128\", \"74\", \"39\", \"24\"],\n    \"13\": [\"29\", \"57\", \"104\", \"164\", \"205\", \"220\", \"199\", \"167\", \"120\", \"68\", \"35\", \"22\"],\n    \"14\": [\"19\", \"46\", \"88\", \"148\", \"196\", \"193\", \"185\", \"150\", \"101\", \"55\", \"25\", \"15\"],\n    \"15\": [\"21\", \"46\", \"89\", \"146\", \"198\", \"191\", \"183\", \"150\", \"106\", \"57\", \"27\", \"15\"],\n    \"16\": [\"19\", \"45\", \"89\", \"143\", \"194\", \"188\", \"177\", \"144\", \"101\", \"54\", \"25\", \"14\"],\n    \"17\": [\"17\", \"43\", \"85\", \"145\", \"189\", \"185\", \"170\", \"139\", \"98\", \"51\", \"22\", \"12\"],\n    \"18\": [\"16\", \"41\", \"87\", \"155\", \"205\", \"206\", \"185\", \"148\", \"101\", \"51\", \"21\", \"11\"],\n    \"19\": [\"14\", \"39\", \"84\", \"143\", \"205\", \"201\", \"178\", \"145\", \"100\", \"50\", \"19\", \"9\"],\n    \"2\": [\"32\", \"59\", \"104\", \"170\", \"208\", \"231\", \"216\", \"182\", \"133\", \"77\", \"41\", \"25\"],\n    \"20\": [\"12\", \"34\", \"79\", \"135\", \"196\", \"190\", \"168\", \"144\", \"90\", \"46\", \"16\", \"7\"],\n    \"21\": [\"24\", \"52\", \"96\", \"155\", \"201\", \"198\", \"183\", \"150\", \"107\", \"61\", \"30\", \"18\"],\n    \"3\": [\"35\", \"62\", \"109\", \"172\", \"209\", \"235\", \"217\", \"185\", \"138\", \"80\", \"44\", \"27\"],\n    \"4\": [\"36\", \"63\", \"111\", \"174\", \"210\", \"233\", \"204\", \"182\", \"136\", \"78\", \"44\", \"28\"],\n    \"5E\": [\"32\", \"59\", \"105\", \"167\", \"201\", \"226\", \"206\", \"175\", \"130\", \"74\", \"40\", \"25\"],\n    \"5W\": [\"32\", \"59\", \"105\", \"167\", \"201\", \"226\", \"206\", \"175\", \"130\", \"74\", \"40\", \"25\"],\n    \"6\": [\"28\", \"55\", \"97\", \"153\", \"191\", \"208\", \"194\", \"163\", \"121\", \"69\", \"35\", \"23\"],\n    \"7E\": [\"24\", \"51\", \"95\", \"152\", \"191\", \"203\", \"186\", \"152\", \"115\", \"65\", \"31\", \"20\"],\n    \"7W\": [\"24\", \"51\", \"95\", \"152\", \"191\", \"203\", \"186\", \"152\", \"115\", \"65\", \"31\", \"20\"],\n    \"8E\": [\"23\", \"51\", \"95\", \"157\", \"200\", \"203\", \"194\", \"156\", \"113\", \"62\", \"30\", \"19\"],\n    \"8S\": [\"23\", \"51\", \"95\", \"157\", \"200\", \"203\", \"194\", \"156\", \"113\", \"62\", \"30\", \"19\"],\n    \"9E\": [\"23\", \"50\", \"92\", \"151\", \"200\", \"196\", \"187\", \"153\", \"111\", \"61\", \"30\", \"18\"],\n    \"9S\": [\"23\", \"50\", \"92\", \"151\", \"200\", \"196\", \"187\", \"153\", \"111\", \"61\", \"30\", \"18\"]\n  }\n}\n", "{\n  \"description\": \"Latitude and altitude of each region's reference point\",\n  \"key_type\": \"text\",\n  \"shape\": \"tuple\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U4\",\n  \"units\": [\"degree\", \"meter\"],\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"0\": [\"53.5\", \"79\"],\n    \"1\": [\"51.6\", \"53\"],\n    \"10\": [\"54.4\", \"78\"],\n    \"11\": [\"53.5\", \"79\"],\n    \"12\": [\"52.1\", \"29\"],\n    \"13\": [\"52.6\", \"138\"],\n    \"14\": [\"55.9\", \"113\"],\n    \"15\": [\"56.2\", \"117\"],\n    \"16\": [\"57.3\", \"123\"],\n    \"17\": [\"57.5\", \"218\"],\n    \"18\": [\"57.7\", \"59\"],\n    \"19\": [\"59.0\", \"53\"],\n    \"2\": [\"51.1\", \"55\"],\n    \"20\": [\"60.1\", \"50\"],\n    \"21\": [\"54.6\", \"72\"],\n    \"3\": [\"50.9\", \"50\"],\n    \"4\": [\"50.5\", \"85\"],\n    \"5E\": [\"51.5\", \"99\"],\n    \"5W\": [\"51.5\", \"99\"],\n    \"6\": [\"52.6\", \"116\"],\n    \"7E\": [\"53.5\", \"71\"],\n    \"7W\": [\"53.5\", \"71\"],\n    \"8E\": [\"54.6\", \"119\"],\n    \"8S\": [\"54.6\", \"119\"],\n    \"9E\": [\"55.2\", \"101\"],\n    \"9S\": [\"55.2\", \"101\"]\n  }\n}\n", "{\n  \"description\": \"Exposure and shelter factors\",\n  \"key_type\": \"text\",\n  \"shape\": \"tuple\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U5\",\n  \"units\": \"\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"EAST_WEST\": [\"1.44\", \"-2.36\", \"1.07\", \"-0.514\", \"1.89\", \"-1.64\", \"-0.542\", \"-0.757\", \"0.604\"],\n    \"NE_NW\": [\"0.165\", \"-3.68\", \"3.0\", \"6.38\", \"-4.53\", \"-0.405\", \"-4.38\", \"4.89\", \"-1.99\"],\n    \"NORTH\": [\"26.3\", \"-38.5\", \"14.8\", \"-16.5\", \"27.3\", \"-11.9\", \"-1.06\", \"0.0872\", \"-0.191\"],\n    \"SE_SW\": [\"-2.95\", \"2.89\", \"1.17\", \"5.67\", \"-3.54\", \"-4.28\", \"-2.72\", \"-0.25\", \"3.07\"],\n    \"SOUTH\": [\"-0.66\", \"-0.106\", \"2.93\", \"3.63\", \"-0.374\", \"-7.4\", \"-2.71\", \"-0.991\", \"4.59\"]\n  }\n}\n", "// CPython's round(float(x), dp), which produced every golden value. Ties go to\n// even, where toFixed goes away from zero ((0.125).toFixed(2) is \"0.13\", Python\n// says 0.12), so this rounds the exact decimal expansion instead. Checked\n// against parity.json.\n\n// A true tie terminates one digit after `places`, so 20 extra digits tell it\n// from a near miss. toFixed caps at 100.\nconst GUARD_DIGITS = 20;\n\nfunction roundMagnitude(exact: string, places: number): string {\n  const dot = exact.indexOf(\".\");\n  const whole = dot === -1 ? exact : exact.slice(0, dot);\n  const fraction = dot === -1 ? \"\" : exact.slice(dot + 1);\n\n  const digits = BigInt(whole + fraction);\n  const divisor = 10n ** BigInt(fraction.length - places);\n\n  let quotient = digits / divisor;\n  const remainder = digits % divisor;\n  const half = divisor / 2n;\n\n  if (remainder > half || (remainder === half && quotient % 2n !== 0n)) {\n    quotient += 1n;\n  }\n\n  const text = quotient.toString().padStart(places + 1, \"0\");\n  if (places === 0) {\n    return text;\n  }\n\n  return `${text.slice(0, text.length - places)}.${text.slice(text.length - places)}`;\n}\n\nexport function roundTo(x: number, places: number): number {\n  if (!Number.isFinite(x)) {\n    return x;\n  }\n\n  const magnitude = Math.abs(x).toFixed(Math.min(100, places + GUARD_DIGITS));\n  const rounded = Number(roundMagnitude(magnitude, places));\n\n  return x < 0 ? -rounded : rounded;\n}\n\nexport function sum<T extends number>(values: readonly T[]): T {\n  return values.reduce((total, value) => (total + value) as T, 0 as T);\n}\n", "// Units live in the type: branded float64, free at runtime, unlike pint.\n// Constructors are unchecked assertions, so use them where a value enters the\n// engine, not mid-calculation.\n\ndeclare const unit: unique symbol;\n\ntype Quantity<U extends string> = number & { readonly [unit]: U };\n\nexport type Area = Quantity<\"m2\">;\nexport type Length = Quantity<\"m\">;\nexport type Volume = Quantity<\"m3\">;\nexport type UValue = Quantity<\"W/m2K\">;\nexport type HeatLoss = Quantity<\"W/K\">;\nexport type Watts = Quantity<\"W\">;\nexport type Celsius = Quantity<\"degC\">;\nexport type AirChanges = Quantity<\"1/h\">;\nexport type AirFlow = Quantity<\"m3/h\">;\nexport type Speed = Quantity<\"m/s\">;\nexport type KilowattHours = Quantity<\"kWh\">;\nexport type KilowattHoursPerDay = Quantity<\"kWh/d\">;\nexport type LitresPerDay = Quantity<\"l/d\">;\nexport type KilowattHoursPerMonth = Quantity<\"kWh/month\">;\nexport type PoundsPerYear = Quantity<\"GBP/a\">;\nexport type KilogramsPerYear = Quantity<\"kg/a\">;\nexport type Factor = Quantity<\"1\">;\n\nconst brand = <U extends string>(value: number) => value as Quantity<U>;\n\nexport const area = (value: number): Area => brand<\"m2\">(value);\nexport const length = (value: number): Length => brand<\"m\">(value);\nexport const volume = (value: number): Volume => brand<\"m3\">(value);\nexport const uValue = (value: number): UValue => brand<\"W/m2K\">(value);\nexport const heatLoss = (value: number): HeatLoss => brand<\"W/K\">(value);\nexport const watts = (value: number): Watts => brand<\"W\">(value);\nexport const celsius = (value: number): Celsius => brand<\"degC\">(value);\nexport const airChanges = (value: number): AirChanges => brand<\"1/h\">(value);\nexport const airFlow = (value: number): AirFlow => brand<\"m3/h\">(value);\nexport const speed = (value: number): Speed => brand<\"m/s\">(value);\nexport const kilowattHours = (value: number): KilowattHours =>\n  brand<\"kWh\">(value);\nexport const kilowattHoursPerDay = (value: number): KilowattHoursPerDay =>\n  brand<\"kWh/d\">(value);\nexport const litresPerDay = (value: number): LitresPerDay =>\n  brand<\"l/d\">(value);\nexport const kilowattHoursPerMonth = (value: number): KilowattHoursPerMonth =>\n  brand<\"kWh/month\">(value);\nexport const poundsPerYear = (value: number): PoundsPerYear =>\n  brand<\"GBP/a\">(value);\nexport const kilogramsPerYear = (value: number): KilogramsPerYear =>\n  brand<\"kg/a\">(value);\nexport const factor = (value: number): Factor => brand<\"1\">(value);\n\n/** January first. */\nexport type Monthly<T> = readonly [T, T, T, T, T, T, T, T, T, T, T, T];\n\nexport const MONTHS = 12;\n\nexport const WATT_DAYS_TO_KWH = 24 / 1000;\n\n// Written out rather than Array.from: a looped tuple needs a cast, and then\n// noUncheckedIndexedAccess makes every read of it nullable.\nexport function monthly<T>(value: (month: number) => T): Monthly<T> {\n  return [\n    value(0),\n    value(1),\n    value(2),\n    value(3),\n    value(4),\n    value(5),\n    value(6),\n    value(7),\n    value(8),\n    value(9),\n    value(10),\n    value(11),\n  ];\n}\n\nexport function mapMonthly<T, U>(\n  values: Monthly<T>,\n  transform: (value: T, month: number) => U,\n): Monthly<U> {\n  const [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] = values;\n  return [\n    transform(jan, 0),\n    transform(feb, 1),\n    transform(mar, 2),\n    transform(apr, 3),\n    transform(may, 4),\n    transform(jun, 5),\n    transform(jul, 6),\n    transform(aug, 7),\n    transform(sep, 8),\n    transform(oct, 9),\n    transform(nov, 10),\n    transform(dec, 11),\n  ];\n}\n", "// The SAP tables, imported from the same apps/twin/tables/*.json the Python\n// engine reads. A JSON import widens its string literals, hence spec().\n\nimport { MONTHS, type Monthly, monthly } from \"./units\";\n\nexport type ValueType = \"text\" | \"integer\" | \"decimal\" | \"quantity\";\nexport type Shape = \"scalar\" | \"tuple\" | \"list\" | \"tuple_of_tuples\";\n\nexport interface TableSpec {\n  table: string;\n  standard: string;\n  description: string;\n  source: string;\n  key_type?: \"text\" | \"integer\";\n  /** One type for the whole table, or one per tuple position. */\n  value_type: ValueType | ValueType[];\n  shape: Shape;\n  /** Pint unit names, positional where `value_type` is. */\n  units?: string | string[];\n  values: Record<string, unknown>;\n}\n\nexport interface TableJson {\n  table: string;\n  standard: string;\n  description: string;\n  source: string;\n  key_type?: string;\n  value_type: string | string[];\n  shape: string;\n  units?: string | string[];\n  values: Record<string, unknown>;\n}\n\nconst VALUE_TYPES: readonly string[] = [\n  \"text\",\n  \"integer\",\n  \"decimal\",\n  \"quantity\",\n];\nconst SHAPES: readonly string[] = [\n  \"scalar\",\n  \"tuple\",\n  \"list\",\n  \"tuple_of_tuples\",\n];\n\nfunction checked<T extends string>(\n  value: string,\n  allowed: readonly string[],\n  what: string,\n): T {\n  if (!allowed.includes(value)) {\n    throw new Error(`Unknown ${what} ${value}`);\n  }\n  return value as T;\n}\n\nexport function spec(json: TableJson): TableSpec {\n  const valueType = Array.isArray(json.value_type)\n    ? json.value_type.map((item) =>\n        checked<ValueType>(item, VALUE_TYPES, \"value_type\"),\n      )\n    : checked<ValueType>(json.value_type, VALUE_TYPES, \"value_type\");\n\n  return {\n    ...json,\n    key_type: json.key_type === \"integer\" ? \"integer\" : \"text\",\n    value_type: valueType,\n    shape: checked<Shape>(json.shape, SHAPES, \"shape\"),\n  };\n}\n\nexport interface Measured {\n  value: number;\n  unit: string;\n}\n\nexport type Leaf = string | number | Measured;\nexport type TableValue = Leaf | Leaf[] | Leaf[][];\n\n/** Integer-keyed tables are keyed by the number, not \"3\". */\nexport type Table = Map<string | number, TableValue>;\n\nfunction leaf(raw: unknown, valueType: ValueType, unit: string): Leaf {\n  switch (valueType) {\n    case \"text\":\n      return String(raw);\n    case \"integer\":\n      return Number.parseInt(String(raw), 10);\n    case \"decimal\":\n      return Number(raw);\n    case \"quantity\":\n      return { value: Number(raw), unit };\n    default: {\n      const exhaustive: never = valueType;\n      throw new Error(`Unknown value_type ${String(exhaustive)}`);\n    }\n  }\n}\n\nfunction at<T>(value: T | T[], index: number): T {\n  if (!Array.isArray(value)) {\n    return value;\n  }\n  const item = value[index];\n  if (item === undefined) {\n    throw new Error(`No entry at position ${index}`);\n  }\n  return item;\n}\n\nfunction tableValue(raw: unknown, spec: TableSpec): TableValue {\n  const units = spec.units ?? \"\";\n\n  if (spec.shape === \"scalar\") {\n    return leaf(raw, at(spec.value_type, 0), at(units, 0));\n  }\n\n  if (!Array.isArray(raw)) {\n    throw new Error(`Expected an array for shape ${spec.shape}`);\n  }\n\n  if (spec.shape === \"tuple\") {\n    return raw.map((item, index) =>\n      leaf(item, at(spec.value_type, index), at(units, index)),\n    );\n  }\n\n  if (spec.shape === \"list\") {\n    return raw.map((item) => leaf(item, at(spec.value_type, 0), at(units, 0)));\n  }\n\n  return raw.map((row) => {\n    if (!Array.isArray(row)) {\n      throw new Error(\"Expected an array of arrays\");\n    }\n    return row.map((item) => leaf(item, at(spec.value_type, 0), at(units, 0)));\n  });\n}\n\nexport function loadTable(spec: TableSpec): Table {\n  const table: Table = new Map();\n\n  for (const [key, raw] of Object.entries(spec.values)) {\n    const typedKey =\n      spec.key_type === \"integer\" ? Number.parseInt(key, 10) : key;\n    table.set(typedKey, tableValue(raw, spec));\n  }\n\n  return table;\n}\n\nexport function lookup(\n  spec: TableSpec,\n  table: Table,\n  key: string | number,\n): TableValue {\n  const value = table.get(key);\n  if (value === undefined) {\n    throw new Error(`Table ${spec.table} has no entry for ${String(key)}`);\n  }\n  return value;\n}\n\nexport function quantities(\n  specification: TableSpec,\n  table: Table,\n  key: string | number,\n): Measured[] {\n  const value = lookup(specification, table, key);\n\n  if (!Array.isArray(value)) {\n    throw new Error(`Table ${specification.table} entry ${key} is not a row`);\n  }\n\n  return value.map((item) => {\n    if (Array.isArray(item) || typeof item !== \"object\") {\n      throw new Error(\n        `Table ${specification.table} entry ${key} is not quantities`,\n      );\n    }\n    return item;\n  });\n}\n\n/** A table entry as plain numbers, whether it holds decimals or quantities. */\nexport function values(\n  specification: TableSpec,\n  table: Table,\n  key: string | number,\n): number[] {\n  const value = lookup(specification, table, key);\n  const row = Array.isArray(value) ? value : [value];\n\n  return row.map((item) => {\n    if (Array.isArray(item)) {\n      throw new Error(`Table ${specification.table} entry ${key} is nested`);\n    }\n    return typeof item === \"object\" ? item.value : Number(item);\n  });\n}\n\nexport function monthlyValues(\n  specification: TableSpec,\n  table: Table,\n  key: string,\n): Monthly<number> {\n  const row = values(specification, table, key);\n\n  if (row.length !== MONTHS) {\n    throw new Error(`Table ${specification.table} ${key} is not twelve months`);\n  }\n\n  return monthly((month) => row[month] ?? 0);\n}\n", "// Appendix L (apps/twin/sap/appendices/l.py), numbered by its equations. The\n// appliance and cooking energy (L13)\u2013(L21) is for Appendix M's PV self-use;\n// Section 5 computes those gains its own way.\n\nimport table6b from \"../../../apps/twin/tables/table6b.json\";\nimport table6c from \"../../../apps/twin/tables/table6c.json\";\nimport table6d from \"../../../apps/twin/tables/table6d.json\";\nimport { sum } from \"./numeric\";\nimport { loadTable, spec, values } from \"./tables\";\nimport {\n  type Area,\n  type Factor,\n  type KilowattHours,\n  type Monthly,\n  type Watts,\n  kilowattHours,\n  mapMonthly,\n  watts,\n} from \"./units\";\nimport type { BuildingElement } from \"./worksheet\";\n\nconst TABLE_6B = spec(table6b);\nconst TABLE_6C = spec(table6c);\nconst TABLE_6D = spec(table6d);\n\nconst GLAZING = loadTable(TABLE_6B);\nconst FRAMES = loadTable(TABLE_6C);\nconst SHADING = loadTable(TABLE_6D);\n\n/** lm/m\u00B2. */\nconst REFERENCE_LUMENS = 330;\nconst FIXED_LUMENS = 185;\n\n/** lm/W: fixed fittings, and top-up or portable lamps. */\nconst FIXED_EFFICACY = 80;\nconst LOOSE_EFFICACY = 21.3;\n\nconst DAYS_IN_YEAR = 365;\n\nfunction lightTransmittance(glazing: string): number {\n  return values(TABLE_6B, GLAZING, glazing)[1] ?? 0;\n}\n\nfunction frameFactor(frame: string): number {\n  return values(TABLE_6C, FRAMES, frame)[0] ?? 0;\n}\n\nfunction lightAccessFactor(shading: string): number {\n  return values(TABLE_6D, SHADING, shading)[2] ?? 0;\n}\n\nfunction equation1(totalFloorArea4: Area, occupancy: Factor): number {\n  return 11.2 * 59.73 * (totalFloorArea4 * occupancy) ** 0.4714;\n}\n\nfunction equation2a(\n  elements: readonly BuildingElement[],\n  totalFloorArea4: Area,\n): number {\n  let total = 0;\n\n  for (const element of elements) {\n    if (element.tag !== \"WINDOW\" && element.tag !== \"ROOF_WINDOW\") {\n      continue;\n    }\n\n    total +=\n      0.9 *\n      element.area *\n      lightTransmittance(element.glazing ?? \"\") *\n      frameFactor(element.frame ?? \"\") *\n      lightAccessFactor(element.shading ?? \"\");\n  }\n\n  return total / totalFloorArea4;\n}\n\nfunction equation2b(daylightAccess: number): number {\n  if (daylightAccess <= 0.095) {\n    return 52.2 * daylightAccess ** 2 - 9.94 * daylightAccess + 1.433;\n  }\n\n  return 0.96;\n}\n\nexport function equation10(\n  elements: readonly BuildingElement[],\n  totalFloorArea4: Area,\n  daysInMonth: Monthly<number>,\n  occupancy: Factor,\n): Monthly<KilowattHours> {\n  const basic = equation1(totalFloorArea4, occupancy);\n  const daylight = equation2b(equation2a(elements, totalFloorArea4));\n\n  // (L3)\u2013(L6). The floor area cancels out of (L6).\n  const required = (2 * basic * daylight) / 3;\n  const provided = (required * FIXED_LUMENS) / REFERENCE_LUMENS;\n\n  // (L7)\n  const topUp = provided < required / 3 ? required / 3 - provided : 0;\n\n  // (L9a)\u2013(L9d)\n  const fixed = (required >= provided ? required : provided) / FIXED_EFFICACY;\n  const loose = topUp / LOOSE_EFFICACY;\n  const portable = (basic * daylight) / 3 / LOOSE_EFFICACY;\n\n  const annual = fixed + loose + portable;\n\n  return mapMonthly(daysInMonth, (days, month) =>\n    kilowattHours(\n      annual *\n        (1 + 0.5 * Math.cos((2 * Math.PI * (month - 0.2)) / 12)) *\n        (days / DAYS_IN_YEAR),\n    ),\n  );\n}\n\nexport function equation11(\n  elements: readonly BuildingElement[],\n  totalFloorArea4: Area,\n  daysInMonth: Monthly<number>,\n  occupancy: Factor,\n): KilowattHours {\n  return sum(equation10(elements, totalFloorArea4, daysInMonth, occupancy));\n}\n\n/** 85% of the lighting energy, as mean watts. */\nexport function equation12(\n  elements: readonly BuildingElement[],\n  totalFloorArea4: Area,\n  daysInMonth: Monthly<number>,\n  occupancy: Factor,\n): Monthly<Watts> {\n  const energy = equation10(elements, totalFloorArea4, daysInMonth, occupancy);\n\n  return mapMonthly(energy, (kwh, month) =>\n    watts((kwh * 0.85 * 1000) / ((daysInMonth[month] ?? 0) * 24)),\n  );\n}\n\nexport function equation13(totalFloorArea4: Area, occupancy: Factor): number {\n  return 207.8 * (totalFloorArea4 * occupancy) ** 0.4714;\n}\n\nexport function equation14(\n  daysInMonth: number,\n  month: number,\n  annual: number,\n): number {\n  return (\n    (annual *\n      (1 + 0.157 * Math.cos((2 * Math.PI * (month - 1.78)) / 12)) *\n      daysInMonth) /\n    DAYS_IN_YEAR\n  );\n}\n\n/** (L20) Ecook = 138 + 28N, kWh a year. */\nexport function equation20(occupancy: Factor): number {\n  return 138 + 28 * occupancy;\n}\n\nexport function equation21(daysInMonth: number, annual: number): number {\n  return (annual * daysInMonth) / DAYS_IN_YEAR;\n}\n", "// Sections 5\u20137, rows (66)\u2013(96): internal and solar gains, then the mean\n// internal temperature, with Appendix U's solar geometry and Table 9.\n\nimport declinationTable from \"../../../apps/twin/tables/declination.json\";\nimport table6b from \"../../../apps/twin/tables/table6b.json\";\nimport table6c from \"../../../apps/twin/tables/table6c.json\";\nimport table6d from \"../../../apps/twin/tables/table6d.json\";\nimport tableu1 from \"../../../apps/twin/tables/tableu1.json\";\nimport tableu3 from \"../../../apps/twin/tables/tableu3.json\";\nimport tableu4 from \"../../../apps/twin/tables/tableu4.json\";\nimport tableu5 from \"../../../apps/twin/tables/tableu5.json\";\nimport type { DimensionResults } from \"./dimensions\";\nimport type { FabricResults } from \"./fabric\";\nimport { equation12 as lightingGains } from \"./lighting\";\nimport { loadTable, monthlyValues, spec, values } from \"./tables\";\nimport {\n  type Area,\n  type Celsius,\n  type Factor,\n  type Monthly,\n  WATT_DAYS_TO_KWH,\n  type Watts,\n  celsius,\n  factor,\n  mapMonthly,\n  monthly,\n  watts,\n} from \"./units\";\nimport type { WaterResults } from \"./water\";\nimport type {\n  BuildingElement,\n  RegionResult,\n  WorksheetInput,\n} from \"./worksheet\";\n\nconst U1 = spec(tableu1);\nconst U3 = spec(tableu3);\nconst U4 = spec(tableu4);\nconst U5 = spec(tableu5);\nconst TABLE_6B = spec(table6b);\nconst TABLE_6C = spec(table6c);\nconst TABLE_6D = spec(table6d);\nconst DECLINATION = spec(declinationTable);\n\nconst EXTERNAL_TEMPERATURE = loadTable(U1);\nconst SOLAR_IRRADIANCE = loadTable(U3);\nconst LATITUDE = loadTable(U4);\nconst SHELTER = loadTable(U5);\nconst GLAZING = loadTable(TABLE_6B);\nconst FRAMES = loadTable(TABLE_6C);\nconst SHADING = loadTable(TABLE_6D);\nconst DECLINATIONS = monthlyValues(\n  DECLINATION,\n  loadTable(DECLINATION),\n  \"MONTHLY\",\n);\n\n/** Table 5a: systems with a circulation pump in the heated space. */\nexport const WET_SYSTEMS = [\n  \"CONDENSING_COMBI_AUTOMATIC_POST_98\",\n  \"STANDARD_OIL_POST_98\",\n  \"COMBI_OIL_POST_98\",\n  \"STOVE_PELLET_TO_RADIATORS\",\n  \"GROUND_SOURCE_HEAT_PUMP_LOW_FLOW\",\n  \"AIR_SOURCE_HEAT_PUMP_LOW_FLOW\",\n  \"ELECTRIC_BOILER\",\n  \"ELECTRIC_LIQUID_RADIATORS\",\n];\n\nconst LIVING_TEMPERATURE = 21.0;\nconst LIVING_OFF_PERIODS = [7, 8];\n\nconst DEGREE = Math.PI / 180;\n\n/** Table U5's rows either side of each 45\u00B0 sector, clockwise from north. */\nconst SECTORS: readonly [string, string][] = [\n  [\"NORTH\", \"NE_NW\"],\n  [\"NE_NW\", \"EAST_WEST\"],\n  [\"EAST_WEST\", \"SE_SW\"],\n  [\"SE_SW\", \"SOUTH\"],\n  [\"SOUTH\", \"SE_SW\"],\n  [\"SE_SW\", \"EAST_WEST\"],\n  [\"EAST_WEST\", \"NE_NW\"],\n  [\"NE_NW\", \"NORTH\"],\n];\n\nconst SECTOR_DEGREES = 45;\n\nexport interface GainsResults {\n  gains_metabolic_66: Monthly<Watts>;\n  gains_lighting_67: Monthly<Watts>;\n  gains_appliances_68: Monthly<Watts>;\n  gains_cooking_69: Monthly<Watts>;\n  gains_pumps_and_fans_70: Monthly<Watts>;\n  gains_losses_71: Monthly<Watts>;\n  gains_water_heating_72: Monthly<Watts>;\n  gains_total_internal_73: Monthly<Watts>;\n  solar_gains_north_74: Monthly<Watts>;\n  solar_gains_north_east_75: Monthly<Watts>;\n  solar_gains_east_76: Monthly<Watts>;\n  solar_gains_south_east_77: Monthly<Watts>;\n  solar_gains_south_78: Monthly<Watts>;\n  solar_gains_south_west_79: Monthly<Watts>;\n  solar_gains_west_80: Monthly<Watts>;\n  solar_gains_north_west_81: Monthly<Watts>;\n  solar_gains_roof_window_82: Monthly<Watts>;\n  solar_gains_83: Monthly<Watts>;\n  total_gains_84: Monthly<Watts>;\n  temperature_85: Celsius;\n  average_external_temperature_96: Monthly<Celsius>;\n  utilisation_factor_86: Monthly<Factor>;\n  mean_internal_living_temperature_87: Monthly<Celsius>;\n  temperature_88: Monthly<Celsius>;\n  utilisation_factor_89: Monthly<Factor>;\n  mean_internal_rest_temperature_90: Monthly<Celsius>;\n  living_area_fraction_91: Factor;\n  mean_internal_temperature_92: Monthly<Celsius>;\n  adjusted_mean_internal_temperature_93: Monthly<Celsius>;\n}\n\n/** Table U1. */\nexport function averageExternalTemperature96(region: string): Monthly<Celsius> {\n  return mapMonthly(monthlyValues(U1, EXTERNAL_TEMPERATURE, region), celsius);\n}\n\n/** Appendix U equation 3; orientation from north, pitch from horizontal. */\nexport function equation3(\n  orientation: number,\n  pitch: number,\n): [number, number, number] {\n  let azimuth = orientation % 360;\n  if (azimuth < 0) {\n    azimuth += 360;\n  }\n\n  const index = Math.min(\n    Math.floor(azimuth / SECTOR_DEGREES),\n    SECTORS.length - 1,\n  );\n  const [lower, upper] = SECTORS[index] ?? [\"NORTH\", \"NE_NW\"];\n  const a = (azimuth - index * SECTOR_DEGREES) / SECTOR_DEGREES;\n\n  const from = values(U5, SHELTER, lower);\n  const to = values(U5, SHELTER, upper);\n  const k = from.map((value, at) => value * (1 - a) + (to[at] ?? 0) * a);\n\n  const t = Math.sin((pitch * DEGREE) / 2);\n\n  return [\n    (k[0] ?? 0) * t ** 3 + (k[1] ?? 0) * t ** 2 + (k[2] ?? 0) * t,\n    (k[3] ?? 0) * t ** 3 + (k[4] ?? 0) * t ** 2 + (k[5] ?? 0) * t,\n    (k[6] ?? 0) * t ** 3 + (k[7] ?? 0) * t ** 2 + (k[8] ?? 0) * t + 1,\n  ];\n}\n\n/** Appendix U equation 2: tilted over horizontal irradiance. */\nexport function equation2(\n  region: string,\n  month: number,\n  coefficients: [number, number, number],\n): number {\n  const [a, b, c] = coefficients;\n  const latitude = values(U4, LATITUDE, region)[0] ?? 0;\n  const t = Math.cos((latitude - (DECLINATIONS[month] ?? 0)) * DEGREE);\n\n  return a * t * t + b * t + c;\n}\n\n/** Appendix U equation 1, W/m\u00B2. */\nexport function solarFlux(\n  region: string,\n  orientation: number,\n  pitch: number,\n): Monthly<number> {\n  const horizontal = monthlyValues(U3, SOLAR_IRRADIANCE, region);\n  const coefficients = equation3(orientation, pitch);\n\n  return mapMonthly(horizontal, (irradiance, month) =>\n    irradiance === 0 ? 0 : irradiance * equation2(region, month, coefficients),\n  );\n}\n\n/** Appendix U equation 4, kWh/m\u00B2 a year. */\nexport function annualIrradiance(\n  flux: Monthly<number>,\n  daysInMonth: Monthly<number>,\n): number {\n  return flux.reduce(\n    (total, value, month) =>\n      total + value * (daysInMonth[month] ?? 0) * WATT_DAYS_TO_KWH,\n    0,\n  );\n}\n\nfunction solarGain(window: BuildingElement, flux: number): number {\n  const transmittance = values(TABLE_6B, GLAZING, window.glazing ?? \"\")[0] ?? 0;\n  const frame = values(TABLE_6C, FRAMES, window.frame ?? \"\")[0] ?? 0;\n  const access = values(TABLE_6D, SHADING, window.shading ?? \"\")[0] ?? 0;\n\n  return access * window.area * flux * 0.9 * transmittance * frame;\n}\n\nfunction solarGainsFacing(\n  elements: readonly BuildingElement[],\n  region: string,\n  orientation: string,\n  azimuth: number,\n): Monthly<Watts> {\n  const windows = elements.filter(\n    (element) =>\n      element.tag === \"WINDOW\" && element.orientation === orientation,\n  );\n\n  if (windows.length === 0) {\n    return monthly(() => watts(0));\n  }\n\n  const flux = solarFlux(region, azimuth, 90);\n\n  return mapMonthly(flux, (irradiance) =>\n    watts(\n      windows.reduce(\n        (total, window) => total + solarGain(window, irradiance),\n        0,\n      ),\n    ),\n  );\n}\n\n/** SAP's \u03C4, hours. */\nfunction timeConstant(\n  thermalMassParameter35: number,\n  heatLossParameter40: number,\n): number {\n  return (thermalMassParameter35 * 1000) / (3600 * heatLossParameter40);\n}\n\n/** (86)/(89) Table 9a, the utilisation factor. */\nexport function table9a(\n  thermalMassParameter35: number,\n  heatTransferCoefficient39: number,\n  heatLossParameter40: number,\n  totalGains84: number,\n  internal: number,\n  external: number,\n): Factor {\n  const tau = timeConstant(thermalMassParameter35, heatLossParameter40);\n  const a = 1 + tau / 15;\n\n  const loss = heatTransferCoefficient39 * (internal - external);\n  const ratio = loss === 0 ? 1000000 : totalGains84 / loss;\n  // Python rounds \u03B3 to 8dp before branching on it.\n  const gamma = Math.round(ratio * 1e8) / 1e8;\n\n  if (gamma < 0) {\n    return factor(1);\n  }\n\n  if (gamma === 1) {\n    return factor(a / (a + 1));\n  }\n\n  return factor((1 - gamma ** a) / (1 - gamma ** (a + 1)));\n}\n\n/** Table 9b, the drop over one off period, taking responsiveness as 1. */\nfunction table9b(\n  thermalMassParameter35: number,\n  heatTransferCoefficient39: number,\n  heatLossParameter40: number,\n  totalGains84: number,\n  utilisation: Factor,\n  external: Celsius,\n  heated: number,\n  offHours: number,\n): number {\n  const tau = timeConstant(thermalMassParameter35, heatLossParameter40);\n  const constant = 4 + 0.25 * tau;\n\n  const settled =\n    external + (utilisation * totalGains84) / heatTransferCoefficient39;\n\n  if (offHours <= constant) {\n    return (0.5 * offHours ** 2 * (heated - settled)) / (24 * constant);\n  }\n\n  return ((heated - settled) * (offHours - 0.5 * constant)) / 24;\n}\n\n/** (87)/(90) Table 9c. */\nexport function table9c(\n  thermalMassParameter35: number,\n  heatTransferCoefficient39: number,\n  heatLossParameter40: number,\n  totalGains84: number,\n  utilisation: Factor,\n  external: Celsius,\n  heated: number,\n  offPeriods: readonly number[],\n): Celsius {\n  const drop = offPeriods.reduce(\n    (total, hours) =>\n      total +\n      table9b(\n        thermalMassParameter35,\n        heatTransferCoefficient39,\n        heatLossParameter40,\n        totalGains84,\n        utilisation,\n        external,\n        heated,\n        hours,\n      ),\n    0,\n  );\n\n  return celsius(heated - drop);\n}\n\n/** (88) Table 9, the rest-of-dwelling heating temperature. */\nexport function temperature88(\n  heatingControlType: number,\n  heatLossParameter40: number,\n): Celsius {\n  const hlp = Math.min(heatLossParameter40, 6);\n\n  if (heatingControlType === 1) {\n    return celsius(LIVING_TEMPERATURE - 0.5 * hlp);\n  }\n\n  return celsius(LIVING_TEMPERATURE - hlp + hlp ** 2 / 12);\n}\n\n/** Table 9's rest-of-dwelling off periods, hours. */\nexport function offPeriods(heatingControlType: number): readonly number[] {\n  return heatingControlType === 3 ? [9, 8] : [7, 8];\n}\n\nexport function gains(\n  input: WorksheetInput,\n  prior: RegionResult & DimensionResults & FabricResults & WaterResults,\n): GainsResults {\n  const occupancy = prior.assumed_occupancy_42;\n  const area: Area = prior.total_floor_area_4;\n\n  const gains_metabolic_66 = monthly(() => watts(60 * occupancy));\n\n  const gains_lighting_67 = lightingGains(\n    input.building_elements,\n    area,\n    prior.days_in_month_41,\n    occupancy,\n  );\n\n  const appliances = watts(\n    207.8 + (occupancy / 3.1) ** 0.2 + (0.4714 * area) ** 0.4714,\n  );\n  const gains_appliances_68 = monthly(() => appliances);\n\n  const gains_cooking_69 = monthly(() => watts(35 + occupancy * 7));\n\n  const pump = WET_SYSTEMS.includes(input.first_main_heat_system) ? 7 : 0;\n  const gains_pumps_and_fans_70 = monthly(() => watts(pump));\n\n  const gains_losses_71 = monthly(() => watts(occupancy * -40));\n\n  const gains_water_heating_72 = mapMonthly(\n    prior.water_heat_gains_65,\n    (kwh, month) =>\n      watts((kwh * 1000) / ((prior.days_in_month_41[month] ?? 0) * 24)),\n  );\n\n  const gains_total_internal_73 = monthly((month) =>\n    watts(\n      (gains_metabolic_66[month] ?? 0) +\n        (gains_lighting_67[month] ?? 0) +\n        (gains_appliances_68[month] ?? 0) +\n        (gains_cooking_69[month] ?? 0) +\n        (gains_pumps_and_fans_70[month] ?? 0) +\n        (gains_losses_71[month] ?? 0) +\n        (gains_water_heating_72[month] ?? 0),\n    ),\n  );\n\n  const facing = (orientation: string, azimuth: number) =>\n    solarGainsFacing(\n      input.building_elements,\n      prior.region,\n      orientation,\n      azimuth,\n    );\n\n  const solar = {\n    solar_gains_north_74: facing(\"NORTH\", 0),\n    solar_gains_north_east_75: facing(\"NORTH_EAST\", 45),\n    solar_gains_east_76: facing(\"EAST\", 90),\n    solar_gains_south_east_77: facing(\"SOUTH_EAST\", 135),\n    solar_gains_south_78: facing(\"SOUTH\", 180),\n    solar_gains_south_west_79: facing(\"SOUTH_WEST\", 225),\n    solar_gains_west_80: facing(\"WEST\", 270),\n    solar_gains_north_west_81: facing(\"NORTH_WEST\", 315),\n  };\n  const directions = Object.values(solar);\n\n  // A flat 25 W per roof window, whatever the month or region.\n  const roofWindows = input.building_elements.filter(\n    (element) => element.tag === \"ROOF_WINDOW\",\n  ).length;\n  const solar_gains_roof_window_82 = monthly(() => watts(25 * roofWindows));\n\n  const solar_gains_83 = monthly((month) =>\n    watts(\n      directions.reduce(\n        (total, direction) => total + (direction[month] ?? 0),\n        0,\n      ) + (solar_gains_roof_window_82[month] ?? 0),\n    ),\n  );\n\n  const total_gains_84 = monthly((month) =>\n    watts((gains_total_internal_73[month] ?? 0) + (solar_gains_83[month] ?? 0)),\n  );\n\n  const temperature_85 = celsius(LIVING_TEMPERATURE);\n  const average_external_temperature_96 = averageExternalTemperature96(\n    prior.region,\n  );\n\n  const mass = input.thermal_mass_parameter_35;\n\n  const utilisation_factor_86 = monthly((month) =>\n    table9a(\n      mass,\n      prior.heat_transfer_coefficient_39[month] ?? 0,\n      prior.heat_loss_parameter_40[month] ?? 0,\n      total_gains_84[month] ?? 0,\n      temperature_85,\n      average_external_temperature_96[month] ?? 0,\n    ),\n  );\n\n  const mean_internal_living_temperature_87 = monthly((month) =>\n    table9c(\n      mass,\n      prior.heat_transfer_coefficient_39[month] ?? 0,\n      prior.heat_loss_parameter_40[month] ?? 0,\n      total_gains_84[month] ?? 0,\n      utilisation_factor_86[month] ?? factor(0),\n      average_external_temperature_96[month] ?? celsius(0),\n      LIVING_TEMPERATURE,\n      LIVING_OFF_PERIODS,\n    ),\n  );\n\n  const temperature_88 = monthly((month) =>\n    temperature88(\n      input.heating_control_type,\n      prior.heat_loss_parameter_40[month] ?? 0,\n    ),\n  );\n\n  const utilisation_factor_89 = monthly((month) =>\n    table9a(\n      mass,\n      prior.heat_transfer_coefficient_39[month] ?? 0,\n      prior.heat_loss_parameter_40[month] ?? 0,\n      total_gains_84[month] ?? 0,\n      temperature_88[month] ?? 0,\n      average_external_temperature_96[month] ?? 0,\n    ),\n  );\n\n  const mean_internal_rest_temperature_90 = monthly((month) =>\n    table9c(\n      mass,\n      prior.heat_transfer_coefficient_39[month] ?? 0,\n      prior.heat_loss_parameter_40[month] ?? 0,\n      total_gains_84[month] ?? 0,\n      utilisation_factor_89[month] ?? factor(0),\n      average_external_temperature_96[month] ?? celsius(0),\n      temperature_88[month] ?? 0,\n      offPeriods(input.heating_control_type),\n    ),\n  );\n\n  const living_area_fraction_91 = factor(input.living_area / area);\n\n  const mean_internal_temperature_92 = monthly((month) =>\n    celsius(\n      living_area_fraction_91 *\n        (mean_internal_living_temperature_87[month] ?? 0) +\n        (1 - living_area_fraction_91) *\n          (mean_internal_rest_temperature_90[month] ?? 0),\n    ),\n  );\n\n  return {\n    gains_metabolic_66,\n    gains_lighting_67,\n    gains_appliances_68,\n    gains_cooking_69,\n    gains_pumps_and_fans_70,\n    gains_losses_71,\n    gains_water_heating_72,\n    gains_total_internal_73,\n    ...solar,\n    solar_gains_roof_window_82,\n    solar_gains_83,\n    total_gains_84,\n    temperature_85,\n    average_external_temperature_96,\n    utilisation_factor_86,\n    mean_internal_living_temperature_87,\n    temperature_88,\n    utilisation_factor_89,\n    mean_internal_rest_temperature_90,\n    living_area_fraction_91,\n    mean_internal_temperature_92,\n    adjusted_mean_internal_temperature_93: mean_internal_temperature_92,\n  };\n}\n", "{\n  \"name\": \"October 2026 price cap\",\n  \"from\": \"2026-10-01\",\n  \"to\": \"2026-12-31\",\n  \"source\": \"Ofgem, 'Energy price cap unit rates and standing charges', 1 October to 31 December 2026: average Direct Debit unit rates and standing charges, England, Scotland and Wales. https://www.ofgem.gov.uk/your-energy-supply/your-energy-bill/energy-price-cap-unit-rates-and-standing-charges. Gas includes 5% VAT; Ofgem: 'There is no VAT on electricity from 1 October 2026 to 31 March 2027.' Refresh each quarter with manage.py refresh_tariffs; the Price-cap tariffs workflow opens the issue that asks for it.\",\n  \"electricity\": {\n    \"pence_per_kwh\": \"26.32\",\n    \"standing_pence_per_day\": \"54.83\"\n  },\n  \"gas\": {\n    \"pence_per_kwh\": \"7.97\",\n    \"standing_pence_per_day\": \"29.68\"\n  }\n}\n", "// Bills at today's prices, for wherever a customer sees one: apps/twin/tariffs.py's twin.\n//\n// SAP's rating is defined on RdSAP 10 Table 32's prices, so the worksheet\n// keeps them. A bill is the same energy priced at apps/twin/tariffs.json: the\n// Ofgem price cap for gas and electricity, with both standing charges, and\n// the appliances and cooking SAP leaves out (Appendix L), so it reads as a\n// whole year's bill. Fuels the cap doesn't cover (oil, LPG, solid fuel, heat\n// networks) keep Table 32's prices.\n\nimport table32 from \"../../../apps/twin/tables/table32.json\";\nimport tariffs from \"../../../apps/twin/tariffs.json\";\nimport { equation13 as applianceEnergy, equation20 } from \"./lighting\";\nimport { sum } from \"./numeric\";\nimport { loadTable, spec, values } from \"./tables\";\nimport type { Area, Factor } from \"./units\";\n\nconst TABLE_32 = spec(table32);\nconst FUELS = loadTable(TABLE_32);\n\n/** The tariff's name, to say beside a bill: \"at the October 2026 price cap\". */\nexport const TARIFF_NAME = tariffs.name;\n/** The day the tariff's prices start, ISO. */\nexport const TARIFF_FROM = tariffs.from;\n\nconst ELECTRICITY_PENCE = Number(tariffs.electricity.pence_per_kwh);\nconst GAS_PENCE = Number(tariffs.gas.pence_per_kwh);\nconst DAYS_IN_YEAR = 365;\nconst PENCE_PER_POUND = 100;\n\n/** Table 32 codes: 1 mains gas; 30 standard electricity; 39 any tariff. */\nconst MAINS_GAS = 1;\nconst STANDARD_ELECTRICITY = [30, 39];\n/** Off-peak rates, which the cap doesn't publish. */\nconst OFF_PEAK_ELECTRICITY = [31, 32, 33, 34, 35, 38, 40];\n\nconst ELECTRICITY = \"STANDARD_TARIFF\";\n\nfunction table32Row(fuel: string): {\n  standing: number;\n  price: number;\n  code: number;\n} {\n  const row = values(TABLE_32, FUELS, fuel);\n  return { standing: row[0] ?? 0, price: row[1] ?? 0, code: row[4] ?? 0 };\n}\n\n/** Pence a kWh. Off-peak electricity scales with the cap's unit rate. */\nexport function rate(fuel: string): number {\n  const { price, code } = table32Row(fuel);\n  if (code === MAINS_GAS) {\n    return GAS_PENCE;\n  }\n  if (STANDARD_ELECTRICITY.includes(code)) {\n    return ELECTRICITY_PENCE;\n  }\n  if (OFF_PEAK_ELECTRICITY.includes(code)) {\n    return (price * ELECTRICITY_PENCE) / table32Row(ELECTRICITY).price;\n  }\n  return price;\n}\n\n/** What the worksheet says the home uses, as tariffs.uses() reads it. */\nexport interface BillInput {\n  first_main_heat_system_fuel: string;\n  second_main_heat_system_fuel: string;\n  secondary_heat_system_fuel: string;\n  water_heater_fuel: string;\n  space_cooling_fuel: string;\n  lighting_fuel: string;\n}\n\nexport interface BillRows {\n  first_main_heat_system_fuel_211: readonly number[];\n  second_main_heat_system_fuel_213: readonly number[];\n  secondary_heat_system_fuel_215: readonly number[];\n  water_heater_fuel_219: readonly number[];\n  space_cooling_fuel_221: readonly number[];\n  total_electricity_231: number;\n  electricity_for_lighting_232: number;\n  water_electric_shower_64a: readonly number[];\n  pv_energy_used_233a: readonly number[];\n  total_floor_area_4: Area;\n  assumed_occupancy_42: Factor;\n}\n\nexport interface BillLine {\n  /** A Table 32 fuel code. */\n  fuel: string;\n  /** kWh a year; 0 on a standing charge, negative for PV's own use. */\n  kwh: number;\n  /** \u00A3 a year. */\n  pounds: number;\n}\n\n/**\n * kWh a year by fuel. `main` and `water` are what's left of a heat pump's fuel\n * at a real SCOP; `pvUsed` overrides the PV the home uses itself.\n */\nexport function uses(\n  input: BillInput,\n  rows: BillRows,\n  main = 1,\n  water = 1,\n  pvUsed: number | null = null,\n): [string, number][] {\n  const occupancy = rows.assumed_occupancy_42;\n  return [\n    [\n      input.first_main_heat_system_fuel,\n      sum(rows.first_main_heat_system_fuel_211) * main,\n    ],\n    [\n      input.second_main_heat_system_fuel,\n      sum(rows.second_main_heat_system_fuel_213),\n    ],\n    [\n      input.secondary_heat_system_fuel,\n      sum(rows.secondary_heat_system_fuel_215),\n    ],\n    [input.water_heater_fuel, sum(rows.water_heater_fuel_219) * water],\n    [input.space_cooling_fuel, sum(rows.space_cooling_fuel_221)],\n    [ELECTRICITY, rows.total_electricity_231],\n    [input.lighting_fuel, rows.electricity_for_lighting_232],\n    [ELECTRICITY, sum(rows.water_electric_shower_64a)],\n    [ELECTRICITY, applianceEnergy(rows.total_floor_area_4, occupancy)],\n    [ELECTRICITY, equation20(occupancy)],\n    [ELECTRICITY, -(pvUsed ?? sum(rows.pv_energy_used_233a))],\n  ];\n}\n\n/**\n * \u00A3 a year: electricity always, gas and the rest when they heat. Table 32's\n * own charge stands for a fuel the cap doesn't cover; off-peak meters share\n * the one electricity charge.\n */\nexport function standingCharges(heating: readonly string[]): BillLine[] {\n  const charges: BillLine[] = [\n    {\n      fuel: ELECTRICITY,\n      kwh: 0,\n      pounds:\n        (Number(tariffs.electricity.standing_pence_per_day) * DAYS_IN_YEAR) /\n        PENCE_PER_POUND,\n    },\n  ];\n  const seen = new Set<string>();\n  for (const fuel of heating) {\n    const { standing, code } = table32Row(fuel);\n    const electric =\n      STANDARD_ELECTRICITY.includes(code) ||\n      OFF_PEAK_ELECTRICITY.includes(code);\n    if (electric || seen.has(fuel)) {\n      continue;\n    }\n    seen.add(fuel);\n    if (code === MAINS_GAS) {\n      charges.push({\n        fuel,\n        kwh: 0,\n        pounds:\n          (Number(tariffs.gas.standing_pence_per_day) * DAYS_IN_YEAR) /\n          PENCE_PER_POUND,\n      });\n    } else if (standing) {\n      charges.push({ fuel, kwh: 0, pounds: standing });\n    }\n  }\n  return charges;\n}\n\n/** Every line of the year's bill, standing charges as lines of 0 kWh. */\nexport function billLines(\n  input: BillInput,\n  rows: BillRows,\n  main = 1,\n  water = 1,\n  pvUsed: number | null = null,\n): BillLine[] {\n  const used = uses(input, rows, main, water, pvUsed);\n  const priced = used.map(([fuel, kwh]) => ({\n    fuel,\n    kwh,\n    pounds: (kwh * rate(fuel)) / PENCE_PER_POUND,\n  }));\n  const heating = used\n    .slice(0, 4)\n    .filter(([, kwh]) => kwh > 0)\n    .map(([fuel]) => fuel);\n  return [...priced, ...standingCharges(heating)];\n}\n\n/** \u00A3 a year at today's prices. */\nexport function bill(\n  input: BillInput,\n  rows: BillRows,\n  main = 1,\n  water = 1,\n  pvUsed: number | null = null,\n): number {\n  return sum(\n    billLines(input, rows, main, water, pvUsed).map((line) => line.pounds),\n  );\n}\n", "// Sections 9a\u201312a, rows (201)\u2013(272), with Appendix M's PV and the Furbnow\n// adjustments (apps/twin/adjustments.py) that engine.calculate() applies.\n\nimport table4b from \"../../../apps/twin/tables/table4b.json\";\nimport table10c from \"../../../apps/twin/tables/table10c.json\";\nimport table12d from \"../../../apps/twin/tables/table12d.json\";\nimport table32 from \"../../../apps/twin/tables/table32.json\";\nimport type { DimensionResults } from \"./dimensions\";\nimport type { FabricResults } from \"./fabric\";\nimport {\n  type GainsResults,\n  WET_SYSTEMS,\n  annualIrradiance,\n  solarFlux,\n} from \"./gains\";\nimport type { HeatingResults } from \"./heating\";\nimport {\n  equation10 as lightingEnergy,\n  equation11 as lightingElectricity,\n  equation13 as applianceEnergy,\n  equation14 as applianceMonth,\n  equation20 as cookingEnergy,\n  equation21 as cookingMonth,\n} from \"./lighting\";\nimport { sum } from \"./numeric\";\nimport { loadTable, spec, values } from \"./tables\";\nimport { bill } from \"./tariffs\";\nimport {\n  type Factor,\n  type KilogramsPerYear,\n  type KilowattHours,\n  type KilowattHoursPerMonth,\n  type Monthly,\n  type PoundsPerYear,\n  factor,\n  kilogramsPerYear,\n  kilowattHours,\n  kilowattHoursPerMonth,\n  monthly,\n  poundsPerYear,\n} from \"./units\";\nimport type { VentilationResults } from \"./ventilation\";\nimport type { RegionResult, WorksheetInput } from \"./worksheet\";\nimport type { WaterResults } from \"./water\";\n\nconst TABLE_4B = spec(table4b);\nconst TABLE_10C = spec(table10c);\nconst TABLE_12D = spec(table12d);\nconst TABLE_32 = spec(table32);\n\nconst SYSTEMS = loadTable(TABLE_4B);\nconst COOLING = loadTable(TABLE_10C);\nconst MONTHLY_CARBON = loadTable(TABLE_12D);\nconst FUELS = loadTable(TABLE_32);\n\nconst OIL_FUELS = [\n  \"HEATING_OIL\",\n  \"BIO_LIQUID_HVO_FROM_USED_COOKING_OIL\",\n  \"BIO_LIQUID_FAME_FROM_ANIMAL_OR_VEGETABLE_OILS\",\n  \"B30K\",\n];\n\nconst HEAT_PUMP_SYSTEMS = [\n  \"AIR_SOURCE_HEAT_PUMP_LOW_FLOW\",\n  \"GROUND_SOURCE_HEAT_PUMP_LOW_FLOW\",\n];\n\n/** Table 4b's ~1.7 heat pump CoP is pessimistic for a modern MCS install. */\nexport const FURBNOW_HEAT_PUMP_SCOP = 3.2;\n\nexport function isHeatPump(system: unknown): boolean {\n  return typeof system === \"string\" && HEAT_PUMP_SYSTEMS.includes(system);\n}\n\n/**\n * What's left of a system's fuel at `scop` against the `modelled` Table 4b\n * efficiency: 1 for anything not a heat pump. apps/twin/scoring.py's twin.\n */\nexport function heatPumpShare(\n  system: string,\n  modelled: number,\n  scop: number,\n): number {\n  return isHeatPump(system) ? modelled / (scop * 100) : 1;\n}\n\n/** Appendix M: Table 32 codes for electricity above the low rate. */\nconst STANDARD_TARIFF_CODE = 30;\nconst HIGH_RATE_ELECTRICITY = [30, 32, 34, 35, 38];\n\nconst DAYS_IN_YEAR = 365;\nconst PENCE_PER_POUND = 100;\n\nexport interface RatingResults {\n  secondary_heat_system_fraction_201: Factor;\n  main_heat_system_fraction_202: Factor;\n  second_main_heat_system_fraction_203: Factor;\n  first_main_heat_system_fraction_204: Factor;\n  second_main_heat_system_fraction_205: Factor;\n  first_main_heat_system_efficiency_206: Factor;\n  second_main_heat_system_efficiency_207: Factor;\n  secondary_heat_system_efficiency_208: Factor;\n  cooling_system_efficiency_209: Factor;\n  first_main_heat_system_fuel_211: Monthly<KilowattHoursPerMonth>;\n  first_main_heat_system_fuel_211_sum: KilowattHours;\n  second_main_heat_system_fuel_213: Monthly<KilowattHoursPerMonth>;\n  secondary_heat_system_fuel_215: Monthly<KilowattHoursPerMonth>;\n  water_heater_efficiency_217: Monthly<Factor>;\n  water_heater_fuel_219: Monthly<KilowattHoursPerMonth>;\n  water_heater_fuel_219_sum: KilowattHours;\n  space_cooling_fuel_221: Monthly<KilowattHoursPerMonth>;\n  mechanical_ventilation_fans_230a: KilowattHours;\n  total_electricity_231: KilowattHours;\n  electricity_for_lighting_232: KilowattHours;\n  pv_energy_used_233a: Monthly<KilowattHoursPerMonth>;\n  pv_energy_used_233a_sum: KilowattHours;\n  water_heating_electric_243: Factor;\n  total_delivered_energy_238: KilowattHours;\n  first_main_heat_system_cost_240e: PoundsPerYear;\n  second_main_heat_system_cost_241e: PoundsPerYear;\n  secondary_heat_system_cost_242e: PoundsPerYear;\n  water_heater_cost_247: PoundsPerYear;\n  space_cooling_cost_248: PoundsPerYear;\n  pumps_and_fans_cost_249: PoundsPerYear;\n  energy_for_lighting_250: PoundsPerYear;\n  standing_charges_251: PoundsPerYear;\n  energy_saving_technologies_252: PoundsPerYear;\n  total_energy_cost_255: PoundsPerYear;\n  energy_cost_deflator_256: Factor;\n  /** \u00A3/m\u00B2 a year. */\n  energy_cost_factor_257: number;\n  sap_rating_258: number;\n  first_main_heat_system_co2_261: KilogramsPerYear;\n  second_main_heat_system_co2_262: KilogramsPerYear;\n  secondary_heat_system_co2_263: KilogramsPerYear;\n  water_heater_co2_264: KilogramsPerYear;\n  space_cooling_co2_266: KilogramsPerYear;\n  pumps_and_fans_co2_267: KilogramsPerYear;\n  energy_for_lighting_co2_268: KilogramsPerYear;\n  energy_generating_co2_269: KilogramsPerYear;\n  total_energy_co2_272: KilogramsPerYear;\n  /** kWh a year of PV a battery holds for later, at most a cycle a day. */\n  furbnow_battery_stored: KilowattHours;\n  /** kWh a year of its own PV the home uses, as its bills credit it. */\n  furbnow_pv_used: KilowattHours;\n  furbnow_heat_pump_scop: Factor;\n  furbnow_corrected_energy_cost: PoundsPerYear;\n  furbnow_corrected_sap_rating: number;\n  /** \u00A3 a year at today's prices (tariffs.ts), as RdSAP has the fuel. */\n  furbnow_bills: PoundsPerYear;\n  /** The same with a heat pump at the SCOP. */\n  furbnow_corrected_bills: PoundsPerYear;\n}\n\n/** Table 32: standing charge \u00A3/yr, price p/kWh, carbon kg/kWh, \u2026, code. */\nfunction fuelRow(fuel: string): number[] {\n  return values(TABLE_32, FUELS, fuel);\n}\n\nexport function standingCharge(fuel: string): number {\n  return fuelRow(fuel)[0] ?? 0;\n}\n\nfunction price(fuel: string): number {\n  return fuelRow(fuel)[1] ?? 0;\n}\n\nfunction carbon(fuel: string): number {\n  return fuelRow(fuel)[2] ?? 0;\n}\n\nfunction fuelCode(fuel: string): number {\n  return fuelRow(fuel)[4] ?? 0;\n}\n\n/** Table 4b's winter and summer efficiencies, as percentages. */\nfunction efficiency(system: string): [number, number] {\n  const row = values(TABLE_4B, SYSTEMS, system);\n  return [row[0] ?? 0, row[1] ?? 0];\n}\n\nfunction cost(fuel: string, fuelUsed: Monthly<number>): PoundsPerYear {\n  return poundsPerYear((sum(fuelUsed) * price(fuel)) / PENCE_PER_POUND);\n}\n\n/** Table 12d's monthly carbon factors where it has the fuel, else 32's. */\nfunction emissions(fuel: string, fuelUsed: Monthly<number>): KilogramsPerYear {\n  if (MONTHLY_CARBON.has(fuel)) {\n    const factors = values(TABLE_12D, MONTHLY_CARBON, fuel);\n    return kilogramsPerYear(\n      fuelUsed.reduce(\n        (total, value, month) => total + value * (factors[month] ?? 0),\n        0,\n      ),\n    );\n  }\n\n  return kilogramsPerYear(sum(fuelUsed) * carbon(fuel));\n}\n\n/** (201) Table 11. */\nexport function secondaryFraction201(\n  firstMainHeatSystem: string,\n  hasSecondaryHeating: boolean,\n): Factor {\n  if (!hasSecondaryHeating) {\n    return factor(0);\n  }\n\n  if (HEAT_PUMP_SYSTEMS.includes(firstMainHeatSystem)) {\n    return factor(0);\n  }\n\n  if (firstMainHeatSystem === \"ELECTRIC_STORAGE_HEATERS\") {\n    // Not fan-assisted, the RdSAP default.\n    return factor(0.15);\n  }\n\n  if (firstMainHeatSystem === \"ELECTRIC_ROOM_HEATERS\") {\n    return factor(0.2);\n  }\n\n  return factor(0.1);\n}\n\n/** SAP 10.2 Table 4g: default specific fan power, W/(l/s). */\nconst DEFAULT_SFP: Record<string, number> = {\n  DMEV: 0.8,\n  MECHANICAL_EXTRACT_VENTILATION: 0.8,\n  MVHR: 2.0,\n};\n\n/**\n * SAP 10.2 section 2.6.3 multiplies the SFP by an in-use factor held in the\n * PCDB (Table 4h is no longer used). We don't hold the PCDB's default-data\n * factor, so the Table 4g SFP is used as it stands.\n */\nconst FAN_IN_USE_FACTOR = 1;\n\n/**\n * (230a) Table 4f, kWh a year: IUF \u00D7 SFP \u00D7 1.22 \u00D7 V for extract,\n * IUF \u00D7 SFP \u00D7 2.44 \u00D7 nmech \u00D7 V for balanced (MVHR).\n */\nexport function mechanicalVentilationFans230a(\n  system: string,\n  volume: number,\n  throughput: number,\n): KilowattHours {\n  const sfp = DEFAULT_SFP[system];\n  if (sfp === undefined) {\n    return kilowattHours(0);\n  }\n  const fans = system === \"MVHR\" ? 2.44 * throughput * volume : 1.22 * volume;\n  return kilowattHours(FAN_IN_USE_FACTOR * sfp * fans);\n}\n\n/** (231) Table 4f: ventilation fans, pump and boiler auxiliaries, kWh a year. */\nexport function totalElectricity231(\n  firstMainHeatSystem: string,\n  fuel: string,\n  fans230a = 0,\n): KilowattHours {\n  if (!WET_SYSTEMS.includes(firstMainHeatSystem)) {\n    return kilowattHours(fans230a);\n  }\n\n  // A circulation pump of unknown date, plus the boiler's auxiliaries.\n  let electricity = fans230a + 115;\n\n  if (fuel === \"MAINS_GAS\") {\n    electricity += 45;\n  } else if (OIL_FUELS.includes(fuel)) {\n    electricity += 100;\n  }\n\n  return kilowattHours(electricity);\n}\n\n/** Table M1. */\nexport function tableM1(overshading: string): Factor {\n  switch (overshading) {\n    case \"SEVERE\":\n      return factor(0.2);\n    case \"HEAVY\":\n      return factor(0.35);\n    case \"SIGNIFICANT\":\n      return factor(0.5);\n    case \"MODEST\":\n      return factor(0.8);\n    case \"NONE\":\n      return factor(1);\n    default:\n      throw new Error(`Unknown PV overshading ${overshading}`);\n  }\n}\n\n/** Appendix M's \u03B2: the share of a month's generation used on site. */\nexport function beta(\n  generated: number,\n  demand: number,\n  batteryCapacity: number,\n): number {\n  const ratio = generated / demand;\n  const battery = Math.min(batteryCapacity, 15);\n\n  const c1 = 1.61 - 0.0973 * battery;\n  const c2 = 0.415 - 0.00776 * battery;\n  const c3 = 0.511 + 0.0866 * battery;\n\n  return Math.min(1 / ratio, Math.exp(-c1 * (ratio * c2) ** c3));\n}\n\nexport function sapRating258(energyCostFactor257: number): number {\n  if (energyCostFactor257 >= 3.5) {\n    return 108.8 - 120.5 * Math.log10(energyCostFactor257);\n  }\n\n  return 100 - 16.21 * energyCostFactor257;\n}\n\nexport function energyCostFactor257(\n  totalFloorArea4: number,\n  totalEnergyCost255: number,\n  deflator: number,\n): number {\n  return (totalEnergyCost255 * deflator) / (totalFloorArea4 + 45);\n}\n\nexport function rating(\n  input: WorksheetInput,\n  prior: RegionResult &\n    DimensionResults &\n    VentilationResults &\n    FabricResults &\n    WaterResults &\n    GainsResults &\n    HeatingResults,\n): RatingResults {\n  const days = prior.days_in_month_41;\n  const heat = prior.space_heating_98c;\n\n  const secondary_heat_system_fraction_201 = secondaryFraction201(\n    input.first_main_heat_system,\n    input.has_secondary_heating,\n  );\n  const main_heat_system_fraction_202 = factor(\n    1 - secondary_heat_system_fraction_201,\n  );\n  const second_main_heat_system_fraction_203 = factor(0);\n  const first_main_heat_system_fraction_204 = factor(\n    main_heat_system_fraction_202 * (1 - second_main_heat_system_fraction_203),\n  );\n  const second_main_heat_system_fraction_205 = factor(\n    main_heat_system_fraction_202 * second_main_heat_system_fraction_203,\n  );\n\n  const first_main_heat_system_efficiency_206 = factor(\n    efficiency(input.first_main_heat_system)[0],\n  );\n  const second_main_heat_system_efficiency_207 = factor(\n    efficiency(input.second_main_heat_system)[0],\n  );\n  const secondary_heat_system_efficiency_208 = factor(\n    efficiency(input.secondary_heat_system)[0],\n  );\n  const cooling_system_efficiency_209 = factor(\n    values(TABLE_10C, COOLING, input.air_conditioner_efficiency)[0] ?? 0,\n  );\n\n  const heatingFuel = (fraction: Factor, percent: number) =>\n    monthly((month) =>\n      kilowattHoursPerMonth(((heat[month] ?? 0) * fraction * 100) / percent),\n    );\n\n  const first_main_heat_system_fuel_211 = heatingFuel(\n    first_main_heat_system_fraction_204,\n    first_main_heat_system_efficiency_206,\n  );\n  const second_main_heat_system_fuel_213 = heatingFuel(\n    second_main_heat_system_fraction_205,\n    second_main_heat_system_efficiency_207,\n  );\n  const secondary_heat_system_fuel_215 = heatingFuel(\n    secondary_heat_system_fraction_201,\n    secondary_heat_system_efficiency_208,\n  );\n\n  // (217) Winter efficiency for the space heat, summer for the water.\n  const [winter, summer] = efficiency(input.water_heater_system);\n  const water_heater_efficiency_217 = monthly((month) => {\n    const space = heat[month] ?? 0;\n    const water = prior.water_heater_output_64[month] ?? 0;\n    return factor((space + water) / (space / winter + water / summer));\n  });\n\n  const water_heater_fuel_219 = monthly((month) =>\n    kilowattHoursPerMonth(\n      ((prior.water_heater_output_64[month] ?? 0) * 100) /\n        (water_heater_efficiency_217[month] ?? 1),\n    ),\n  );\n\n  const space_cooling_fuel_221 = monthly((month) =>\n    kilowattHoursPerMonth(\n      (prior.space_cooling_requirement_107[month] ?? 0) /\n        cooling_system_efficiency_209,\n    ),\n  );\n\n  const mechanical_ventilation_fans_230a = mechanicalVentilationFans230a(\n    input.ventilation_system,\n    prior.dwelling_volume_5,\n    prior.mvhr_air_change_rate_23b,\n  );\n  const total_electricity_231 = totalElectricity231(\n    input.first_main_heat_system,\n    input.first_main_heat_system_fuel,\n    mechanical_ventilation_fans_230a,\n  );\n\n  const electricity_for_lighting_232 = lightingElectricity(\n    input.building_elements,\n    prior.total_floor_area_4,\n    days,\n    prior.assumed_occupancy_42,\n  );\n\n  const lightingMonths = lightingEnergy(\n    input.building_elements,\n    prior.total_floor_area_4,\n    days,\n    prior.assumed_occupancy_42,\n  );\n\n  const demand: ElectricDemand = {\n    lighting: lightingMonths,\n    electricity: total_electricity_231,\n    space: [\n      [input.first_main_heat_system_fuel, first_main_heat_system_fuel_211],\n      [input.second_main_heat_system_fuel, second_main_heat_system_fuel_213],\n      [input.secondary_heat_system_fuel, secondary_heat_system_fuel_215],\n    ],\n    water: water_heater_fuel_219,\n  };\n  const pv_energy_used_233a = pvEnergyUsed233a(input, prior, demand);\n\n  // apps/twin/adjustments.py battery_stored(): Appendix M's beta already\n  // counts what a battery holds for later, and nothing else does until a\n  // time-of-use tariff is modelled. A cycle a day caps it.\n  const pvAlone = sum(\n    pvEnergyUsed233a({ ...input, battery_capacity: 0 }, prior, demand),\n  );\n  const furbnow_battery_stored = kilowattHours(\n    Math.min(\n      sum(pv_energy_used_233a) - pvAlone,\n      input.battery_capacity * DAYS_IN_YEAR,\n    ),\n  );\n  const furbnow_pv_used = kilowattHours(pvAlone + furbnow_battery_stored);\n\n  const first_main_heat_system_cost_240e = cost(\n    input.first_main_heat_system_fuel,\n    first_main_heat_system_fuel_211,\n  );\n  const second_main_heat_system_cost_241e = cost(\n    input.second_main_heat_system_fuel,\n    second_main_heat_system_fuel_213,\n  );\n  const secondary_heat_system_cost_242e = cost(\n    input.secondary_heat_system_fuel,\n    secondary_heat_system_fuel_215,\n  );\n  const water_heater_cost_247 = cost(\n    input.water_heater_fuel,\n    water_heater_fuel_219,\n  );\n  const space_cooling_cost_248 = cost(\n    input.space_cooling_fuel,\n    space_cooling_fuel_221,\n  );\n\n  const pumps_and_fans_cost_249 = poundsPerYear(\n    (total_electricity_231 * price(\"STANDARD_TARIFF\")) / PENCE_PER_POUND,\n  );\n\n  const energy_for_lighting_250 = poundsPerYear(\n    (electricity_for_lighting_232 * price(input.lighting_fuel)) /\n      PENCE_PER_POUND,\n  );\n\n  // Table 32 note (a): standing charges only for heating fuels, never the\n  // standard electricity tariff.\n  const charged = new Set<string>();\n  if (first_main_heat_system_cost_240e > 0) {\n    charged.add(input.first_main_heat_system_fuel);\n  }\n  if (second_main_heat_system_cost_241e > 0) {\n    charged.add(input.second_main_heat_system_fuel);\n  }\n  if (secondary_heat_system_cost_242e > 0) {\n    charged.add(input.secondary_heat_system_fuel);\n  }\n  if (water_heater_cost_247 > 0) {\n    charged.add(input.water_heater_fuel);\n  }\n  charged.delete(\"STANDARD_TARIFF\");\n\n  const standing_charges_251 = poundsPerYear(\n    [...charged].reduce((total, fuel) => total + standingCharge(fuel), 0),\n  );\n\n  const energy_saving_technologies_252 = poundsPerYear(\n    -(sum(pv_energy_used_233a) * price(\"STANDARD_TARIFF\")) / PENCE_PER_POUND,\n  );\n\n  const total_energy_cost_255 = poundsPerYear(\n    first_main_heat_system_cost_240e +\n      second_main_heat_system_cost_241e +\n      secondary_heat_system_cost_242e +\n      water_heater_cost_247 +\n      space_cooling_cost_248 +\n      pumps_and_fans_cost_249 +\n      energy_for_lighting_250 +\n      standing_charges_251 +\n      energy_saving_technologies_252,\n  );\n\n  const energy_cost_deflator_256 = factor(0.42);\n  const energy_cost_factor_257 = energyCostFactor257(\n    prior.total_floor_area_4,\n    total_energy_cost_255,\n    energy_cost_deflator_256,\n  );\n\n  const energy_for_lighting_co2_268 = MONTHLY_CARBON.has(input.lighting_fuel)\n    ? emissions(input.lighting_fuel, lightingMonths)\n    : kilogramsPerYear(\n        electricity_for_lighting_232 * carbon(input.lighting_fuel),\n      );\n\n  const energy_generating_co2_269 = kilogramsPerYear(\n    -sum(pv_energy_used_233a) * carbon(\"STANDARD_TARIFF\"),\n  );\n\n  const first_main_heat_system_co2_261 = emissions(\n    input.first_main_heat_system_fuel,\n    first_main_heat_system_fuel_211,\n  );\n  const second_main_heat_system_co2_262 = emissions(\n    input.second_main_heat_system_fuel,\n    second_main_heat_system_fuel_213,\n  );\n  const secondary_heat_system_co2_263 = emissions(\n    input.secondary_heat_system_fuel,\n    secondary_heat_system_fuel_215,\n  );\n  const water_heater_co2_264 = emissions(\n    input.water_heater_fuel,\n    water_heater_fuel_219,\n  );\n  const space_cooling_co2_266 = emissions(\n    input.space_cooling_fuel,\n    space_cooling_fuel_221,\n  );\n  // (267): (231) spread over the year by days, at Table 12d's monthly factors.\n  const yearDays = sum(days);\n  const pumps_and_fans_co2_267 = emissions(\n    \"STANDARD_TARIFF\",\n    monthly((month) =>\n      kilowattHoursPerMonth(\n        (total_electricity_231 * (days[month] ?? 0)) / yearDays,\n      ),\n    ),\n  );\n\n  const corrected = (system: string, spent: number, modelled: number) =>\n    spent * heatPumpShare(system, modelled, input.heat_pump_scop);\n\n  const furbnow_corrected_energy_cost = poundsPerYear(\n    total_energy_cost_255 -\n      first_main_heat_system_cost_240e +\n      corrected(\n        input.first_main_heat_system,\n        first_main_heat_system_cost_240e,\n        first_main_heat_system_efficiency_206,\n      ) -\n      water_heater_cost_247 +\n      corrected(\n        input.water_heater_system,\n        water_heater_cost_247,\n        water_heater_efficiency_217[0],\n      ),\n  );\n\n  const billed = {\n    first_main_heat_system_fuel_211,\n    second_main_heat_system_fuel_213,\n    secondary_heat_system_fuel_215,\n    water_heater_fuel_219,\n    space_cooling_fuel_221,\n    total_electricity_231,\n    electricity_for_lighting_232,\n    water_electric_shower_64a: prior.water_electric_shower_64a,\n    pv_energy_used_233a,\n    total_floor_area_4: prior.total_floor_area_4,\n    assumed_occupancy_42: prior.assumed_occupancy_42,\n  };\n\n  return {\n    secondary_heat_system_fraction_201,\n    main_heat_system_fraction_202,\n    second_main_heat_system_fraction_203,\n    first_main_heat_system_fraction_204,\n    second_main_heat_system_fraction_205,\n    first_main_heat_system_efficiency_206,\n    second_main_heat_system_efficiency_207,\n    secondary_heat_system_efficiency_208,\n    cooling_system_efficiency_209,\n    first_main_heat_system_fuel_211,\n    first_main_heat_system_fuel_211_sum: kilowattHours(\n      sum(first_main_heat_system_fuel_211),\n    ),\n    second_main_heat_system_fuel_213,\n    secondary_heat_system_fuel_215,\n    water_heater_efficiency_217,\n    water_heater_fuel_219,\n    water_heater_fuel_219_sum: kilowattHours(sum(water_heater_fuel_219)),\n    space_cooling_fuel_221,\n    mechanical_ventilation_fans_230a,\n    total_electricity_231,\n    electricity_for_lighting_232,\n    pv_energy_used_233a,\n    pv_energy_used_233a_sum: kilowattHours(sum(pv_energy_used_233a)),\n    water_heating_electric_243: factor(0),\n    total_delivered_energy_238: kilowattHours(\n      sum(first_main_heat_system_fuel_211) +\n        sum(second_main_heat_system_fuel_213) +\n        sum(secondary_heat_system_fuel_215) +\n        sum(water_heater_fuel_219) +\n        sum(space_cooling_fuel_221) +\n        total_electricity_231 +\n        electricity_for_lighting_232 -\n        sum(pv_energy_used_233a),\n    ),\n    first_main_heat_system_cost_240e,\n    second_main_heat_system_cost_241e,\n    secondary_heat_system_cost_242e,\n    water_heater_cost_247,\n    space_cooling_cost_248,\n    pumps_and_fans_cost_249,\n    energy_for_lighting_250,\n    standing_charges_251,\n    energy_saving_technologies_252,\n    total_energy_cost_255,\n    energy_cost_deflator_256,\n    energy_cost_factor_257,\n    sap_rating_258: sapRating258(energy_cost_factor_257),\n    first_main_heat_system_co2_261,\n    second_main_heat_system_co2_262,\n    secondary_heat_system_co2_263,\n    water_heater_co2_264,\n    space_cooling_co2_266,\n    pumps_and_fans_co2_267,\n    energy_for_lighting_co2_268,\n    energy_generating_co2_269,\n    total_energy_co2_272: kilogramsPerYear(\n      first_main_heat_system_co2_261 +\n        second_main_heat_system_co2_262 +\n        secondary_heat_system_co2_263 +\n        water_heater_co2_264 +\n        space_cooling_co2_266 +\n        pumps_and_fans_co2_267 +\n        energy_for_lighting_co2_268 +\n        energy_generating_co2_269,\n    ),\n    furbnow_battery_stored,\n    furbnow_pv_used,\n    furbnow_heat_pump_scop: factor(input.heat_pump_scop),\n    furbnow_corrected_energy_cost,\n    furbnow_corrected_sap_rating: sapRating258(\n      energyCostFactor257(\n        prior.total_floor_area_4,\n        furbnow_corrected_energy_cost,\n        energy_cost_deflator_256,\n      ),\n    ),\n    furbnow_bills: poundsPerYear(bill(input, billed, 1, 1, furbnow_pv_used)),\n    furbnow_corrected_bills: poundsPerYear(\n      bill(\n        input,\n        billed,\n        heatPumpShare(\n          input.first_main_heat_system,\n          first_main_heat_system_efficiency_206,\n          input.heat_pump_scop,\n        ),\n        heatPumpShare(\n          input.water_heater_system,\n          water_heater_efficiency_217[0] ?? 100,\n          input.heat_pump_scop,\n        ),\n        furbnow_pv_used,\n      ),\n    ),\n  };\n}\n\n/** What the dwelling would otherwise buy electricity for. */\ninterface ElectricDemand {\n  lighting: Monthly<number>;\n  electricity: number;\n  /** Fuel and use, per space heating system. */\n  space: readonly [string, Monthly<number>][];\n  water: Monthly<number>;\n}\n\n/** Appendix M, M1: kWh a year the array generates, used or exported. */\nexport function pvGeneration(\n  input: Pick<\n    WorksheetInput,\n    \"pv_peak_power\" | \"pv_orientation\" | \"pv_pitch\" | \"pv_overshading\"\n  >,\n  prior: RegionResult & Pick<FabricResults, \"days_in_month_41\">,\n): number {\n  const flux = solarFlux(prior.region, input.pv_orientation, input.pv_pitch);\n  return (\n    0.8 *\n    input.pv_peak_power *\n    annualIrradiance(flux, prior.days_in_month_41) *\n    tableM1(input.pv_overshading)\n  );\n}\n\n/** (233a) Appendix M. */\nfunction pvEnergyUsed233a(\n  input: WorksheetInput,\n  prior: RegionResult &\n    DimensionResults &\n    FabricResults &\n    GainsResults &\n    WaterResults,\n  demandFrom: ElectricDemand,\n): Monthly<KilowattHoursPerMonth> {\n  const days = prior.days_in_month_41;\n  const flux = solarFlux(prior.region, input.pv_orientation, input.pv_pitch);\n  const generated = pvGeneration(input, prior);\n  const yearly = sum(flux);\n\n  const appliances = applianceEnergy(\n    prior.total_floor_area_4,\n    prior.assumed_occupancy_42,\n  );\n  const cooking = cookingEnergy(prior.assumed_occupancy_42);\n\n  return monthly((month) => {\n    const share = yearly === 0 ? 0 : (flux[month] ?? 0) / yearly;\n    const generatedThisMonth = generated * share;\n\n    if (generatedThisMonth === 0) {\n      return kilowattHoursPerMonth(0);\n    }\n\n    // Heating counts only on electricity above the low rate; off-peak\n    // immersion would be row (243), always zero here.\n    const electricSpace = demandFrom.space.reduce(\n      (total, [fuel, used]) =>\n        HIGH_RATE_ELECTRICITY.includes(fuelCode(fuel))\n          ? total + (used[month] ?? 0)\n          : total,\n      0,\n    );\n\n    const electricWater =\n      fuelCode(input.water_heater_fuel) === STANDARD_TARIFF_CODE\n        ? (demandFrom.water[month] ?? 0)\n        : 0;\n\n    const demand =\n      (demandFrom.lighting[month] ?? 0) +\n      applianceMonth(days[month] ?? 0, month, appliances) +\n      cookingMonth(days[month] ?? 0, cooking) +\n      (prior.water_electric_shower_64a[month] ?? 0) +\n      (demandFrom.electricity * (days[month] ?? 0)) / DAYS_IN_YEAR +\n      electricSpace +\n      electricWater;\n\n    return kilowattHoursPerMonth(\n      generatedThisMonth *\n        beta(generatedThisMonth, demand, input.battery_capacity),\n    );\n  });\n}\n", "// Section 1, rows (1)\u2013(5).\n\nimport { sum } from \"./numeric\";\nimport { type Area, type Length, type Volume, area, volume } from \"./units\";\nimport type { WorksheetInput } from \"./worksheet\";\n\nexport interface DimensionResults {\n  floor_volume_3: readonly Volume[];\n  total_floor_area_4: Area;\n  dwelling_volume_5: Volume;\n}\n\nexport function floorVolume3(\n  floorArea1: readonly Area[],\n  floorHeight2: readonly Length[],\n): Volume[] {\n  // Python zips with strict=False, so an unpaired storey is dropped.\n  const storeys = Math.min(floorArea1.length, floorHeight2.length);\n\n  return Array.from({ length: storeys }, (_, storey) =>\n    volume((floorArea1[storey] ?? area(0)) * (floorHeight2[storey] ?? 0)),\n  );\n}\n\nexport function dimensions(input: WorksheetInput): DimensionResults {\n  const floor_volume_3 = floorVolume3(input.floor_area_1, input.floor_height_2);\n\n  return {\n    floor_volume_3,\n    total_floor_area_4: sum(input.floor_area_1),\n    dwelling_volume_5: sum(floor_volume_3),\n  };\n}\n", "// Section 3, rows (26)\u2013(41). The heat capacity rows (28)\u2013(34) aren't ported:\n// worksheet.py comments them out and takes the thermal mass parameter as input.\n\nimport type { DimensionResults } from \"./dimensions\";\nimport { sum } from \"./numeric\";\nimport {\n  type Area,\n  type HeatLoss,\n  type Monthly,\n  type UValue,\n  type Volume,\n  area,\n  heatLoss,\n  mapMonthly,\n  uValue,\n} from \"./units\";\nimport type { VentilationResults } from \"./ventilation\";\nimport type { BuildingElement, WorksheetInput } from \"./worksheet\";\n\n/** Openings are subtracted from these and nothing else. */\nconst HAS_OPENINGS = [\"BASEMENT_WALL\", \"EXTERNAL_WALL\", \"ROOF\"];\n\nconst EXTERNAL = [\n  \"SOLID_DOOR\",\n  \"SEMI_GLAZED_DOOR\",\n  \"WINDOW\",\n  \"ROOF_WINDOW\",\n  \"BASEMENT_FLOOR\",\n  \"GROUND_FLOOR\",\n  \"EXPOSED_FLOOR\",\n  \"BASEMENT_WALL\",\n  \"EXTERNAL_WALL\",\n  \"ROOF\",\n];\n\n/** W\u00B7h/m\u00B3K. */\nconst AIR_HEAT_CAPACITY = 0.33;\n\nconst DAYS_IN_MONTH: Monthly<number> = [\n  31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,\n];\n\nexport interface FabricResults {\n  solid_door_fabric_heat_loss_26: HeatLoss;\n  semi_glazed_door_fabric_heat_loss_26a: HeatLoss;\n  window_fabric_heat_loss_27: HeatLoss;\n  roof_window_fabric_heat_loss_27a: HeatLoss;\n  basement_floor_fabric_heat_loss_28: HeatLoss;\n  ground_floor_fabric_heat_loss_28a: HeatLoss;\n  exposed_floor_fabric_heat_loss_28b: HeatLoss;\n  basement_wall_fabric_heat_loss_29: HeatLoss;\n  external_wall_fabric_heat_loss_29a: HeatLoss;\n  roof_fabric_heat_loss_30: HeatLoss;\n  total_external_area_31: Area;\n  party_wall_fabric_heat_loss_32: HeatLoss;\n  fabric_heat_loss_33: HeatLoss;\n  thermal_bridges_36: HeatLoss;\n  total_fabric_heat_loss_37: HeatLoss;\n  ventilation_heat_loss_38: Monthly<HeatLoss>;\n  heat_transfer_coefficient_39: Monthly<HeatLoss>;\n  heat_loss_parameter_40: Monthly<number>;\n  days_in_month_41: Monthly<number>;\n}\n\nfunction elementUValue(element: BuildingElement): UValue {\n  if (element.uvalue === undefined) {\n    throw new Error(`A ${element.tag} has no u-value`);\n  }\n\n  return element.uvalue;\n}\n\nfunction losingArea(element: BuildingElement): Area {\n  if (!HAS_OPENINGS.includes(element.tag)) {\n    return element.area;\n  }\n\n  if (element.openings === undefined) {\n    throw new Error(`A ${element.tag} has no openings area`);\n  }\n\n  return area(element.area - element.openings);\n}\n\nexport function fabricHeatLoss(\n  elements: readonly BuildingElement[],\n  tag: string,\n): HeatLoss {\n  return sum(\n    elements\n      .filter((element) => element.tag === tag)\n      .map((element) => heatLoss(losingArea(element) * elementUValue(element))),\n  );\n}\n\nexport function totalExternalArea31(\n  elements: readonly BuildingElement[],\n): Area {\n  return sum(\n    elements\n      .filter((element) => EXTERNAL.includes(element.tag))\n      .map((element) => losingArea(element)),\n  );\n}\n\n/** Table 21's y, from the first external wall: the main building part's. */\nexport function table21(elements: readonly BuildingElement[]): UValue {\n  const wall = elements.find((element) => element.tag === \"EXTERNAL_WALL\");\n  const age = wall?.age ?? \"A\";\n\n  if (wall?.construction === \"PARK_HOME\") {\n    return uValue(0.15);\n  }\n\n  if (age === \"J\") {\n    return uValue(0.11);\n  }\n\n  if (age === \"K\" || age === \"L\" || age === \"M\") {\n    return uValue(0.08);\n  }\n\n  return uValue(0.15);\n}\n\nexport function ventilationHeatLoss38(\n  effectiveAirChangeRate25: VentilationResults[\"effective_air_change_rate_25\"],\n  dwellingVolume5: Volume,\n): Monthly<HeatLoss> {\n  return mapMonthly(effectiveAirChangeRate25, (changes) =>\n    heatLoss(AIR_HEAT_CAPACITY * changes * dwellingVolume5),\n  );\n}\n\nexport function fabric(\n  input: WorksheetInput,\n  prior: DimensionResults & VentilationResults,\n): FabricResults {\n  const elements = input.building_elements;\n  const loss = (tag: string) => fabricHeatLoss(elements, tag);\n\n  const solid_door_fabric_heat_loss_26 = loss(\"SOLID_DOOR\");\n  const semi_glazed_door_fabric_heat_loss_26a = loss(\"SEMI_GLAZED_DOOR\");\n  const window_fabric_heat_loss_27 = loss(\"WINDOW\");\n  const roof_window_fabric_heat_loss_27a = loss(\"ROOF_WINDOW\");\n  const basement_floor_fabric_heat_loss_28 = loss(\"BASEMENT_FLOOR\");\n  const ground_floor_fabric_heat_loss_28a = loss(\"GROUND_FLOOR\");\n  const exposed_floor_fabric_heat_loss_28b = loss(\"EXPOSED_FLOOR\");\n  const basement_wall_fabric_heat_loss_29 = loss(\"BASEMENT_WALL\");\n  const external_wall_fabric_heat_loss_29a = loss(\"EXTERNAL_WALL\");\n  const roof_fabric_heat_loss_30 = loss(\"ROOF\");\n  const total_external_area_31 = totalExternalArea31(elements);\n  const party_wall_fabric_heat_loss_32 = loss(\"PARTY_WALL\");\n\n  const fabric_heat_loss_33 = sum([\n    solid_door_fabric_heat_loss_26,\n    semi_glazed_door_fabric_heat_loss_26a,\n    window_fabric_heat_loss_27,\n    roof_window_fabric_heat_loss_27a,\n    basement_floor_fabric_heat_loss_28,\n    ground_floor_fabric_heat_loss_28a,\n    exposed_floor_fabric_heat_loss_28b,\n    basement_wall_fabric_heat_loss_29,\n    external_wall_fabric_heat_loss_29a,\n    roof_fabric_heat_loss_30,\n    party_wall_fabric_heat_loss_32,\n  ]);\n\n  const thermal_bridges_36 = heatLoss(\n    table21(elements) * total_external_area_31,\n  );\n  const total_fabric_heat_loss_37 = heatLoss(\n    fabric_heat_loss_33 + thermal_bridges_36,\n  );\n\n  const ventilation_heat_loss_38 = ventilationHeatLoss38(\n    prior.effective_air_change_rate_25,\n    prior.dwelling_volume_5,\n  );\n\n  const heat_transfer_coefficient_39 = mapMonthly(\n    ventilation_heat_loss_38,\n    (ventilation) => heatLoss(total_fabric_heat_loss_37 + ventilation),\n  );\n\n  const heat_loss_parameter_40 = mapMonthly(\n    heat_transfer_coefficient_39,\n    (coefficient) => coefficient / prior.total_floor_area_4,\n  );\n\n  return {\n    solid_door_fabric_heat_loss_26,\n    semi_glazed_door_fabric_heat_loss_26a,\n    window_fabric_heat_loss_27,\n    roof_window_fabric_heat_loss_27a,\n    basement_floor_fabric_heat_loss_28,\n    ground_floor_fabric_heat_loss_28a,\n    exposed_floor_fabric_heat_loss_28b,\n    basement_wall_fabric_heat_loss_29,\n    external_wall_fabric_heat_loss_29a,\n    roof_fabric_heat_loss_30,\n    total_external_area_31,\n    party_wall_fabric_heat_loss_32,\n    fabric_heat_loss_33,\n    thermal_bridges_36,\n    total_fabric_heat_loss_37,\n    ventilation_heat_loss_38,\n    heat_transfer_coefficient_39,\n    heat_loss_parameter_40,\n    days_in_month_41: DAYS_IN_MONTH,\n  };\n}\n", "// Sections 8 and 8c, rows (94)\u2013(108). Like worksheet.py, whole months are\n// zeroed rather than deriving SAP's heating season from the numbers.\n\nimport type { DimensionResults } from \"./dimensions\";\nimport type { FabricResults } from \"./fabric\";\nimport { type GainsResults, table9a } from \"./gains\";\nimport { sum } from \"./numeric\";\nimport {\n  type Factor,\n  type KilowattHoursPerMonth,\n  type Monthly,\n  WATT_DAYS_TO_KWH,\n  type Watts,\n  celsius,\n  factor,\n  kilowattHoursPerMonth,\n  monthly,\n  watts,\n} from \"./units\";\nimport type { WorksheetInput } from \"./worksheet\";\n\n/** June to September. */\nconst UNHEATED_MONTHS = [5, 6, 7, 8];\n\n/** June to August. */\nconst COOLED_MONTHS = [5, 6, 7];\n\nconst COOLING_TEMPERATURE = 24;\n\nexport interface HeatingResults {\n  utilisation_factor_94: Monthly<Factor>;\n  useful_gains_95: Monthly<Watts>;\n  heat_loss_rate_97: Monthly<Watts>;\n  space_heating_98a: Monthly<KilowattHoursPerMonth>;\n  solar_space_heating_98b: Monthly<KilowattHoursPerMonth>;\n  space_heating_98c: Monthly<KilowattHoursPerMonth>;\n  /** Annual kWh/m\u00B2, though worksheet.py's unit says per month. */\n  space_heating_99: number;\n  heat_loss_rate_100: Monthly<Watts>;\n  utilisation_factor_101: Monthly<Factor>;\n  useful_loss_102: Monthly<Watts>;\n  total_gains_103: Monthly<Watts>;\n  space_cooling_requirement_104: Monthly<KilowattHoursPerMonth>;\n  cooled_fraction_105: Factor;\n  intermittency_factor_106: Monthly<Factor>;\n  space_cooling_requirement_107: Monthly<KilowattHoursPerMonth>;\n  /** kWh/m\u00B2 a year. */\n  space_cooling_requirement_108: number;\n}\n\nfunction only<T extends number>(\n  values: Monthly<T>,\n  months: readonly number[],\n  zero: T,\n): Monthly<T> {\n  return monthly((month) =>\n    months.includes(month) ? (values[month] ?? zero) : zero,\n  );\n}\n\n/** Table 10b: under 1 kWh a month counts as no cooling. */\nexport function table10b(\n  requirement: KilowattHoursPerMonth,\n  cooledFraction: Factor,\n  intermittency: Factor,\n): KilowattHoursPerMonth {\n  const cooling = requirement * cooledFraction * intermittency;\n\n  return kilowattHoursPerMonth(cooling < 1 ? 0 : cooling);\n}\n\nexport function heating(\n  input: WorksheetInput,\n  prior: DimensionResults & FabricResults & GainsResults,\n): HeatingResults {\n  const mass = input.thermal_mass_parameter_35;\n  const days = prior.days_in_month_41;\n  const coefficient = prior.heat_transfer_coefficient_39;\n  const parameter = prior.heat_loss_parameter_40;\n  const external = prior.average_external_temperature_96;\n\n  const utilisation_factor_94 = monthly((month) =>\n    table9a(\n      mass,\n      coefficient[month] ?? 0,\n      parameter[month] ?? 0,\n      prior.total_gains_84[month] ?? 0,\n      prior.adjusted_mean_internal_temperature_93[month] ?? celsius(0),\n      external[month] ?? celsius(0),\n    ),\n  );\n\n  const useful_gains_95 = monthly((month) =>\n    watts(\n      (utilisation_factor_94[month] ?? 0) * (prior.total_gains_84[month] ?? 0),\n    ),\n  );\n\n  const heat_loss_rate_97 = monthly((month) =>\n    watts(\n      (coefficient[month] ?? 0) *\n        ((prior.adjusted_mean_internal_temperature_93[month] ?? 0) -\n          (external[month] ?? 0)),\n    ),\n  );\n\n  const space_heating_98a = monthly((month) =>\n    kilowattHoursPerMonth(\n      UNHEATED_MONTHS.includes(month)\n        ? 0\n        : ((heat_loss_rate_97[month] ?? 0) - (useful_gains_95[month] ?? 0)) *\n            (days[month] ?? 0) *\n            WATT_DAYS_TO_KWH,\n    ),\n  );\n\n  const solar_space_heating_98b = monthly(() => kilowattHoursPerMonth(0));\n\n  const space_heating_98c = monthly((month) =>\n    kilowattHoursPerMonth(\n      (space_heating_98a[month] ?? 0) + (solar_space_heating_98b[month] ?? 0),\n    ),\n  );\n\n  const space_heating_99 = sum(space_heating_98c) / prior.total_floor_area_4;\n\n  const heat_loss_rate_100 = only(\n    monthly((month) =>\n      watts(\n        (coefficient[month] ?? 0) *\n          (COOLING_TEMPERATURE - (external[month] ?? 0)),\n      ),\n    ),\n    COOLED_MONTHS,\n    watts(0),\n  );\n\n  const total_gains_103 = only(prior.total_gains_84, COOLED_MONTHS, watts(0));\n\n  const utilisation_factor_101 = only(\n    monthly((month) =>\n      table9a(\n        mass,\n        coefficient[month] ?? 0,\n        parameter[month] ?? 0,\n        total_gains_103[month] ?? 0,\n        celsius(COOLING_TEMPERATURE),\n        external[month] ?? celsius(0),\n      ),\n    ),\n    COOLED_MONTHS,\n    factor(0),\n  );\n\n  // (102), (104) and (107) are products of rows already zero outside\n  // COOLED_MONTHS, so need no masking of their own.\n  const useful_loss_102 = monthly((month) =>\n    watts(\n      (heat_loss_rate_100[month] ?? 0) * (utilisation_factor_101[month] ?? 0),\n    ),\n  );\n\n  const space_cooling_requirement_104 = monthly((month) =>\n    kilowattHoursPerMonth(\n      ((total_gains_103[month] ?? 0) - (useful_loss_102[month] ?? 0)) *\n        (days[month] ?? 0) *\n        WATT_DAYS_TO_KWH,\n    ),\n  );\n\n  const cooled_fraction_105 = factor(1);\n  const intermittency_factor_106 = only(\n    monthly(() => factor(0.25)),\n    COOLED_MONTHS,\n    factor(0),\n  );\n\n  const space_cooling_requirement_107 = monthly((month) =>\n    table10b(\n      space_cooling_requirement_104[month] ?? kilowattHoursPerMonth(0),\n      cooled_fraction_105,\n      intermittency_factor_106[month] ?? factor(0),\n    ),\n  );\n\n  const space_cooling_requirement_108 =\n    sum(space_cooling_requirement_107) / prior.total_floor_area_4;\n\n  return {\n    utilisation_factor_94,\n    useful_gains_95,\n    heat_loss_rate_97,\n    space_heating_98a,\n    solar_space_heating_98b,\n    space_heating_98c,\n    space_heating_99,\n    heat_loss_rate_100,\n    utilisation_factor_101,\n    useful_loss_102,\n    total_gains_103,\n    space_cooling_requirement_104,\n    cooled_fraction_105,\n    intermittency_factor_106,\n    space_cooling_requirement_107,\n    space_cooling_requirement_108,\n  };\n}\n", "{\n  \"description\": \"Postcode area to region number\",\n  \"key_type\": \"text\",\n  \"shape\": \"scalar\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U6\",\n  \"value_type\": \"text\",\n  \"values\": {\n    \"AB\": \"16\",\n    \"AL\": \"1\",\n    \"B\": \"6\",\n    \"BA\": \"5E\",\n    \"BB\": \"7E\",\n    \"BD\": \"11\",\n    \"BD23\": \"10\",\n    \"BD24\": \"10\",\n    \"BH\": \"3\",\n    \"BL\": \"7E\",\n    \"BN\": \"2\",\n    \"BR\": \"2\",\n    \"BS\": \"5E\",\n    \"BT\": \"21\",\n    \"CA\": \"8E\",\n    \"CB\": \"12\",\n    \"CF\": \"5W\",\n    \"CH\": \"7E\",\n    \"CH5\": \"7W\",\n    \"CH6\": \"7W\",\n    \"CH7\": \"7W\",\n    \"CH8\": \"7W\",\n    \"CM\": \"12\",\n    \"CM21\": \"1\",\n    \"CM22\": \"1\",\n    \"CM23\": \"1\",\n    \"CO\": \"12\",\n    \"CR\": \"1\",\n    \"CT\": \"2\",\n    \"CV\": \"6\",\n    \"CW\": \"7E\",\n    \"DA\": \"2\",\n    \"DD\": \"15\",\n    \"DE\": \"6\",\n    \"DG\": \"8S\",\n    \"DH\": \"10\",\n    \"DH4\": \"9E\",\n    \"DH5\": \"9E\",\n    \"DL\": \"10\",\n    \"DN\": \"11\",\n    \"DT\": \"3\",\n    \"DY\": \"6\",\n    \"E\": \"1\",\n    \"EC\": \"1\",\n    \"EH\": \"15\",\n    \"EH43\": \"9S\",\n    \"EH44\": \"9S\",\n    \"EH45\": \"9S\",\n    \"EH46\": \"9S\",\n    \"EN\": \"1\",\n    \"EN9\": \"12\",\n    \"EX\": \"4\",\n    \"FK\": \"14\",\n    \"FY\": \"7E\",\n    \"G\": \"14\",\n    \"GL\": \"5E\",\n    \"GU\": \"1\",\n    \"GU11\": \"3\",\n    \"GU12\": \"3\",\n    \"GU14\": \"3\",\n    \"GU28\": \"2\",\n    \"GU29\": \"2\",\n    \"GU30\": \"3\",\n    \"GU31\": \"3\",\n    \"GU32\": \"3\",\n    \"GU33\": \"3\",\n    \"GU34\": \"3\",\n    \"GU35\": \"3\",\n    \"GU46\": \"3\",\n    \"GU51\": \"3\",\n    \"GU52\": \"3\",\n    \"HA\": \"1\",\n    \"HD\": \"11\",\n    \"HG\": \"10\",\n    \"HP\": \"1\",\n    \"HR\": \"6\",\n    \"HS\": \"18\",\n    \"HU\": \"11\",\n    \"HX\": \"11\",\n    \"IG\": \"12\",\n    \"IP\": \"12\",\n    \"IV\": \"17\",\n    \"IV30\": \"16\",\n    \"IV31\": \"16\",\n    \"IV32\": \"16\",\n    \"IV36\": \"16\",\n    \"KA\": \"14\",\n    \"KT\": \"1\",\n    \"KW\": \"17\",\n    \"KW15\": \"19\",\n    \"KW16\": \"19\",\n    \"KW17\": \"19\",\n    \"KY\": \"15\",\n    \"L\": \"7E\",\n    \"LA\": \"7E\",\n    \"LA10\": \"8E\",\n    \"LA11\": \"8E\",\n    \"LA12\": \"8E\",\n    \"LA13\": \"8E\",\n    \"LA14\": \"8E\",\n    \"LA15\": \"8E\",\n    \"LA16\": \"8E\",\n    \"LA17\": \"8E\",\n    \"LA18\": \"8E\",\n    \"LA19\": \"8E\",\n    \"LA20\": \"8E\",\n    \"LA21\": \"8E\",\n    \"LA22\": \"8E\",\n    \"LA23\": \"8E\",\n    \"LA7\": \"8E\",\n    \"LA8\": \"8E\",\n    \"LA9\": \"8E\",\n    \"LD\": \"13\",\n    \"LE\": \"6\",\n    \"LL\": \"7W\",\n    \"LL23\": \"13\",\n    \"LL24\": \"13\",\n    \"LL25\": \"13\",\n    \"LL26\": \"13\",\n    \"LL27\": \"13\",\n    \"LL30\": \"13\",\n    \"LL31\": \"13\",\n    \"LL32\": \"13\",\n    \"LL33\": \"13\",\n    \"LL34\": \"13\",\n    \"LL35\": \"13\",\n    \"LL36\": \"13\",\n    \"LL37\": \"13\",\n    \"LL38\": \"13\",\n    \"LL39\": \"13\",\n    \"LL40\": \"13\",\n    \"LL41\": \"13\",\n    \"LL42\": \"13\",\n    \"LL43\": \"13\",\n    \"LL44\": \"13\",\n    \"LL45\": \"13\",\n    \"LL46\": \"13\",\n    \"LL47\": \"13\",\n    \"LL48\": \"13\",\n    \"LL49\": \"13\",\n    \"LL50\": \"13\",\n    \"LL51\": \"13\",\n    \"LL52\": \"13\",\n    \"LL53\": \"13\",\n    \"LL54\": \"13\",\n    \"LL55\": \"13\",\n    \"LL56\": \"13\",\n    \"LL57\": \"13\",\n    \"LL58\": \"13\",\n    \"LL59\": \"13\",\n    \"LL60\": \"13\",\n    \"LL61\": \"13\",\n    \"LL62\": \"13\",\n    \"LL63\": \"13\",\n    \"LL64\": \"13\",\n    \"LL65\": \"13\",\n    \"LL66\": \"13\",\n    \"LL67\": \"13\",\n    \"LL68\": \"13\",\n    \"LL69\": \"13\",\n    \"LL70\": \"13\",\n    \"LL71\": \"13\",\n    \"LL72\": \"13\",\n    \"LL73\": \"13\",\n    \"LL74\": \"13\",\n    \"LL75\": \"13\",\n    \"LL76\": \"13\",\n    \"LL77\": \"13\",\n    \"LL78\": \"13\",\n    \"LN\": \"11\",\n    \"LS\": \"11\",\n    \"LS24\": \"10\",\n    \"LU\": \"1\",\n    \"M\": \"7E\",\n    \"ME\": \"2\",\n    \"MK\": \"1\",\n    \"ML\": \"14\",\n    \"N\": \"1\",\n    \"NE\": \"9E\",\n    \"NG\": \"11\",\n    \"NN\": \"6\",\n    \"NP\": \"5W\",\n    \"NP8\": \"13\",\n    \"NR\": \"12\",\n    \"NW\": \"1\",\n    \"OL\": \"7E\",\n    \"OX\": \"1\",\n    \"PA\": \"14\",\n    \"PE\": \"12\",\n    \"PE10\": \"11\",\n    \"PE11\": \"11\",\n    \"PE12\": \"11\",\n    \"PE20\": \"11\",\n    \"PE21\": \"11\",\n    \"PE22\": \"11\",\n    \"PE23\": \"11\",\n    \"PE24\": \"11\",\n    \"PE25\": \"11\",\n    \"PE9\": \"11\",\n    \"PH\": \"15\",\n    \"PH19\": \"17\",\n    \"PH20\": \"17\",\n    \"PH21\": \"17\",\n    \"PH22\": \"17\",\n    \"PH23\": \"17\",\n    \"PH24\": \"17\",\n    \"PH25\": \"17\",\n    \"PH26\": \"16\",\n    \"PH30\": \"17\",\n    \"PH31\": \"17\",\n    \"PH32\": \"17\",\n    \"PH33\": \"17\",\n    \"PH34\": \"17\",\n    \"PH35\": \"17\",\n    \"PH36\": \"17\",\n    \"PH37\": \"17\",\n    \"PH38\": \"17\",\n    \"PH39\": \"17\",\n    \"PH40\": \"17\",\n    \"PH41\": \"17\",\n    \"PH42\": \"17\",\n    \"PH43\": \"17\",\n    \"PH44\": \"17\",\n    \"PH49\": \"14\",\n    \"PH50\": \"14\",\n    \"PL\": \"4\",\n    \"PO\": \"3\",\n    \"PO18\": \"2\",\n    \"PO19\": \"2\",\n    \"PO20\": \"2\",\n    \"PO21\": \"2\",\n    \"PO22\": \"2\",\n    \"PR\": \"7E\",\n    \"RG\": \"1\",\n    \"RG21\": \"3\",\n    \"RG22\": \"3\",\n    \"RG23\": \"3\",\n    \"RG24\": \"3\",\n    \"RG25\": \"3\",\n    \"RG26\": \"3\",\n    \"RG27\": \"3\",\n    \"RG28\": \"3\",\n    \"RG29\": \"3\",\n    \"RH\": \"1\",\n    \"RH10\": \"2\",\n    \"RH11\": \"2\",\n    \"RH12\": \"2\",\n    \"RH13\": \"2\",\n    \"RH14\": \"2\",\n    \"RH15\": \"2\",\n    \"RH16\": \"2\",\n    \"RH17\": \"2\",\n    \"RH18\": \"2\",\n    \"RH19\": \"2\",\n    \"RH20\": \"2\",\n    \"RM\": \"12\",\n    \"S\": \"11\",\n    \"S18\": \"6\",\n    \"S32\": \"6\",\n    \"S33\": \"6\",\n    \"S40\": \"6\",\n    \"S41\": \"6\",\n    \"S42\": \"6\",\n    \"S43\": \"6\",\n    \"S44\": \"6\",\n    \"S45\": \"6\",\n    \"SA\": \"5W\",\n    \"SA14\": \"13\",\n    \"SA15\": \"13\",\n    \"SA16\": \"13\",\n    \"SA17\": \"13\",\n    \"SA18\": \"13\",\n    \"SA19\": \"13\",\n    \"SA20\": \"13\",\n    \"SA31\": \"13\",\n    \"SA32\": \"13\",\n    \"SA33\": \"13\",\n    \"SA34\": \"13\",\n    \"SA35\": \"13\",\n    \"SA36\": \"13\",\n    \"SA37\": \"13\",\n    \"SA38\": \"13\",\n    \"SA39\": \"13\",\n    \"SA40\": \"13\",\n    \"SA41\": \"13\",\n    \"SA42\": \"13\",\n    \"SA43\": \"13\",\n    \"SA44\": \"13\",\n    \"SA45\": \"13\",\n    \"SA46\": \"13\",\n    \"SA47\": \"13\",\n    \"SA48\": \"13\",\n    \"SA61\": \"13\",\n    \"SA62\": \"13\",\n    \"SA63\": \"13\",\n    \"SA64\": \"13\",\n    \"SA65\": \"13\",\n    \"SA66\": \"13\",\n    \"SA67\": \"13\",\n    \"SA68\": \"13\",\n    \"SA69\": \"13\",\n    \"SA70\": \"13\",\n    \"SA71\": \"13\",\n    \"SA72\": \"13\",\n    \"SA73\": \"13\",\n    \"SE\": \"1\",\n    \"SG\": \"1\",\n    \"SK\": \"7E\",\n    \"SK13\": \"6\",\n    \"SK17\": \"6\",\n    \"SK22\": \"6\",\n    \"SK23\": \"6\",\n    \"SL\": \"1\",\n    \"SM\": \"1\",\n    \"SN\": \"5E\",\n    \"SN7\": \"1\",\n    \"SO\": \"3\",\n    \"SP\": \"5E\",\n    \"SP10\": \"3\",\n    \"SP11\": \"3\",\n    \"SP6\": \"3\",\n    \"SP7\": \"3\",\n    \"SP8\": \"3\",\n    \"SP9\": \"3\",\n    \"SR\": \"9E\",\n    \"SR7\": \"10\",\n    \"SR8\": \"10\",\n    \"SS\": \"12\",\n    \"ST\": \"6\",\n    \"SW\": \"1\",\n    \"SY\": \"6\",\n    \"SY14\": \"7E\",\n    \"SY15\": \"13\",\n    \"SY16\": \"13\",\n    \"SY17\": \"13\",\n    \"SY18\": \"13\",\n    \"SY19\": \"13\",\n    \"SY20\": \"13\",\n    \"SY21\": \"13\",\n    \"SY22\": \"13\",\n    \"SY23\": \"13\",\n    \"SY24\": \"13\",\n    \"SY25\": \"13\",\n    \"TA\": \"5E\",\n    \"TD\": \"9S\",\n    \"TD12\": \"9E\",\n    \"TD15\": \"9E\",\n    \"TF\": \"6\",\n    \"TN\": \"2\",\n    \"TQ\": \"4\",\n    \"TR\": \"4\",\n    \"TS\": \"10\",\n    \"TW\": \"1\",\n    \"UB\": \"1\",\n    \"W\": \"1\",\n    \"WA\": \"7E\",\n    \"WC\": \"1\",\n    \"WD\": \"1\",\n    \"WF\": \"11\",\n    \"WN\": \"7E\",\n    \"WR\": \"6\",\n    \"WS\": \"6\",\n    \"WV\": \"6\",\n    \"YO\": \"10\",\n    \"YO15\": \"11\",\n    \"YO16\": \"11\",\n    \"YO25\": \"11\",\n    \"ZE\": \"20\"\n  }\n}\n", "// Table U6 is keyed by outcode where a postcode area spans two regions (CH5 is\n// Wales, the rest of CH is North West) and by area otherwise, so try both.\n\nimport tableu6 from \"../../../apps/twin/tables/tableu6.json\";\nimport { loadTable, spec } from \"./tables\";\n\nconst TABLE = loadTable(spec(tableu6));\n\n/** ASCII only, uppercased, with one space before the last three characters. */\nexport function normalise(value: string): string {\n  const compact = value\n    .replace(/\\s+/g, \"\")\n    .replace(/[\\u0080-\uFFFF]/g, \"\")\n    .toUpperCase();\n\n  return `${compact.slice(0, -3)} ${compact.slice(-3)}`;\n}\n\n/** \"BS1\" of \"BS1 1AA\". */\nexport function outcode(code: string): string {\n  const [outward, inward] = normalise(code).split(\" \");\n\n  if (outward === undefined || outward === \"\" || inward === undefined) {\n    throw new Error(`Not a postcode: ${code}`);\n  }\n\n  return outward;\n}\n\n/** \"BS\" of \"BS1\", \"E\" of \"E17\". */\nexport function area(code: string): string {\n  const outward = outcode(code);\n  const second = outward.slice(1, 2);\n\n  return second !== \"\" && second >= \"0\" && second <= \"9\"\n    ? outward.slice(0, 1)\n    : outward.slice(0, 2);\n}\n\n/** The Table U6 region: \"5E\", \"13\", \"21\". */\nexport function region(code: string): string {\n  const value = TABLE.get(outcode(code)) ?? TABLE.get(area(code));\n\n  if (typeof value !== \"string\") {\n    throw new Error(`Table U6 has no entry for ${code}`);\n  }\n\n  return value;\n}\n", "{\n  \"description\": \"Monthly average wind speed by region\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/tables.py\",\n  \"standard\": \"unstated\",\n  \"table\": \"U2\",\n  \"units\": \"meter / second\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"0\": [\"5.1\", \"5.0\", \"4.9\", \"4.4\", \"4.3\", \"3.8\", \"3.8\", \"3.7\", \"4.0\", \"4.3\", \"4.5\", \"4.7\"],\n    \"1\": [\"4.2\", \"4.0\", \"4.0\", \"3.7\", \"3.7\", \"3.3\", \"3.4\", \"3.2\", \"3.3\", \"3.5\", \"3.5\", \"3.8\"],\n    \"10\": [\"5.3\", \"5.2\", \"5.0\", \"4.3\", \"4.2\", \"3.9\", \"3.6\", \"3.6\", \"4.1\", \"4.3\", \"4.6\", \"4.8\"],\n    \"11\": [\"5.1\", \"5.0\", \"4.9\", \"4.4\", \"4.3\", \"3.8\", \"3.8\", \"3.7\", \"4.0\", \"4.3\", \"4.5\", \"4.7\"],\n    \"12\": [\"4.9\", \"4.8\", \"4.7\", \"4.2\", \"4.2\", \"3.7\", \"3.8\", \"3.8\", \"4.0\", \"4.2\", \"4.3\", \"4.5\"],\n    \"13\": [\"6.5\", \"6.2\", \"5.9\", \"5.2\", \"5.1\", \"4.7\", \"4.5\", \"4.5\", \"5.0\", \"5.7\", \"6.0\", \"6.0\"],\n    \"14\": [\"6.2\", \"6.2\", \"5.9\", \"5.2\", \"4.9\", \"4.7\", \"4.3\", \"4.3\", \"4.9\", \"5.4\", \"5.7\", \"5.4\"],\n    \"15\": [\"5.7\", \"5.8\", \"5.7\", \"5.0\", \"4.8\", \"4.6\", \"4.1\", \"4.1\", \"4.7\", \"5.0\", \"5.2\", \"5.0\"],\n    \"16\": [\"5.7\", \"5.8\", \"5.7\", \"5.0\", \"4.6\", \"4.4\", \"4.0\", \"4.1\", \"4.6\", \"5.2\", \"5.3\", \"5.1\"],\n    \"17\": [\"6.5\", \"6.8\", \"6.4\", \"5.7\", \"5.1\", \"5.1\", \"4.6\", \"4.5\", \"5.3\", \"5.8\", \"6.1\", \"5.7\"],\n    \"18\": [\"8.3\", \"8.4\", \"7.9\", \"6.6\", \"6.1\", \"6.1\", \"5.6\", \"5.6\", \"6.3\", \"7.3\", \"7.7\", \"7.5\"],\n    \"19\": [\"7.9\", \"8.3\", \"7.9\", \"7.1\", \"6.2\", \"6.1\", \"5.5\", \"5.6\", \"6.4\", \"7.3\", \"7.8\", \"7.3\"],\n    \"2\": [\"4.8\", \"4.5\", \"4.4\", \"3.9\", \"3.9\", \"3.6\", \"3.7\", \"3.5\", \"3.7\", \"4.0\", \"4.1\", \"4.4\"],\n    \"20\": [\"9.5\", \"9.4\", \"8.7\", \"7.5\", \"6.6\", \"6.4\", \"5.7\", \"6.0\", \"7.2\", \"8.5\", \"8.9\", \"8.5\"],\n    \"21\": [\"5.4\", \"5.3\", \"5.0\", \"4.7\", \"4.5\", \"4.1\", \"3.9\", \"3.7\", \"4.2\", \"4.6\", \"5.0\", \"5.0\"],\n    \"3\": [\"5.1\", \"4.7\", \"4.6\", \"4.3\", \"4.3\", \"4.0\", \"4.0\", \"3.9\", \"4.0\", \"4.5\", \"4.4\", \"4.7\"],\n    \"4\": [\"6.0\", \"5.6\", \"5.6\", \"5.0\", \"5.0\", \"4.4\", \"4.4\", \"4.3\", \"4.7\", \"5.4\", \"5.5\", \"5.9\"],\n    \"5E\": [\"4.9\", \"4.6\", \"4.7\", \"4.3\", \"4.3\", \"3.8\", \"3.8\", \"3.7\", \"3.8\", \"4.3\", \"4.3\", \"4.6\"],\n    \"5W\": [\"4.9\", \"4.6\", \"4.7\", \"4.3\", \"4.3\", \"3.8\", \"3.8\", \"3.7\", \"3.8\", \"4.3\", \"4.3\", \"4.6\"],\n    \"6\": [\"4.5\", \"4.5\", \"4.4\", \"3.9\", \"3.8\", \"3.4\", \"3.3\", \"3.3\", \"3.5\", \"3.8\", \"3.9\", \"4.1\"],\n    \"7E\": [\"4.8\", \"4.7\", \"4.6\", \"4.2\", \"4.1\", \"3.7\", \"3.7\", \"3.7\", \"3.7\", \"4.2\", \"4.3\", \"4.5\"],\n    \"7W\": [\"4.8\", \"4.7\", \"4.6\", \"4.2\", \"4.1\", \"3.7\", \"3.7\", \"3.7\", \"3.7\", \"4.2\", \"4.3\", \"4.5\"],\n    \"8E\": [\"5.2\", \"5.2\", \"5.0\", \"4.4\", \"4.3\", \"3.9\", \"3.7\", \"3.7\", \"4.1\", \"4.6\", \"4.8\", \"4.7\"],\n    \"8S\": [\"5.2\", \"5.2\", \"5.0\", \"4.4\", \"4.3\", \"3.9\", \"3.7\", \"3.7\", \"4.1\", \"4.6\", \"4.8\", \"4.7\"],\n    \"9E\": [\"5.2\", \"5.2\", \"5.0\", \"4.4\", \"4.1\", \"3.8\", \"3.5\", \"3.5\", \"3.9\", \"4.2\", \"4.6\", \"4.7\"],\n    \"9S\": [\"5.2\", \"5.2\", \"5.0\", \"4.4\", \"4.1\", \"3.8\", \"3.5\", \"3.5\", \"3.9\", \"4.2\", \"4.6\", \"4.7\"]\n  }\n}\n", "// Section 2, rows (6a)\u2013(25).\n\nimport tableu2 from \"../../../apps/twin/tables/tableu2.json\";\nimport type { DimensionResults } from \"./dimensions\";\nimport { sum } from \"./numeric\";\nimport { loadTable, monthlyValues, spec } from \"./tables\";\nimport {\n  type AirChanges,\n  type AirFlow,\n  type Factor,\n  type Monthly,\n  type Speed,\n  airChanges,\n  airFlow,\n  factor,\n  mapMonthly,\n  speed,\n} from \"./units\";\nimport type {\n  BuildingElement,\n  RegionResult,\n  WorksheetInput,\n} from \"./worksheet\";\n\nconst U2 = spec(tableu2);\nconst TABLE_U2 = loadTable(U2);\n\nconst NOT_MASONRY = [\"TIMBER\", \"PARK_HOME\", \"SYSTEM_BUILD\"];\n\nconst MECHANICAL = [\"DMEV\", \"MECHANICAL_EXTRACT_VENTILATION\", \"MVHR\"];\n\nexport const EXTRACT_SYSTEMS = [\"DMEV\", \"MECHANICAL_EXTRACT_VENTILATION\"];\n\nexport interface VentilationResults {\n  ventilation_open_chimney_6a: AirFlow;\n  ventilation_open_flue_6b: AirFlow;\n  ventilation_fire_flue_6c: AirFlow;\n  ventilation_boiler_flue_6d: AirFlow;\n  ventilation_other_flue_6e: AirFlow;\n  ventilation_blocked_chimney_6f: AirFlow;\n  ventilation_extract_fan_7a: AirFlow;\n  ventilation_passive_vent_7b: AirFlow;\n  ventilation_flueless_gas_fire_7c: AirFlow;\n  ventilation_infiltration_8: AirFlow;\n  ventilation_air_changes_8: AirChanges;\n  storeys_9: number;\n  additional_infiltration_10: AirChanges;\n  structural_infiltration_11: AirChanges;\n  ground_infiltration_12: AirChanges;\n  lobby_infiltration_13: AirChanges;\n  draught_proof_window_percentage_14: Factor;\n  window_infiltration_15: AirChanges;\n  infiltration_rate_16: AirChanges;\n  infiltration_rate_18: AirChanges;\n  shelter_factor_20: Factor;\n  sheltered_infiltration_rate_21: AirChanges;\n  monthly_average_wind_speed_22: Monthly<Speed>;\n  monthly_wind_factor_22a: Monthly<Factor>;\n  adjusted_infiltration_rate_22b: Monthly<AirChanges>;\n  mvhr_air_change_rate_23a: Factor;\n  mvhr_air_change_rate_23b: Factor;\n  mvhr_air_change_rate_23c: Factor;\n  /** Null unless that kind of system is fitted. */\n  mechanical_ventilation_with_hr_24a: Monthly<AirChanges> | null;\n  whole_house_extract_24c: Monthly<AirChanges> | null;\n  effective_air_change_rate_24d: Monthly<AirChanges>;\n  effective_air_change_rate_25: Monthly<AirChanges>;\n}\n\n/** (9) An extension adds floors but not storeys, so the parser's count wins. */\nexport function storeys9(\n  storeys: number,\n  floorHeight2: readonly unknown[],\n): number {\n  return storeys > 0 ? storeys : floorHeight2.length;\n}\n\nexport function additionalInfiltration10(storeys: number): AirChanges {\n  return airChanges(0.1 * (storeys - 1));\n}\n\nfunction netArea(element: BuildingElement): number {\n  if (element.openings === undefined) {\n    throw new Error(`A ${element.tag} has no openings area`);\n  }\n\n  return element.area - element.openings;\n}\n\n/** (11) Whichever of masonry or not has more net wall area; ties to masonry. */\nexport function structuralInfiltration11(\n  elements: readonly BuildingElement[],\n): AirChanges {\n  const walls = elements.filter((element) => element.tag === \"EXTERNAL_WALL\");\n  const area = (masonry: boolean) =>\n    sum(\n      walls\n        .filter(\n          (wall) => NOT_MASONRY.includes(wall.construction ?? \"\") !== masonry,\n        )\n        .map(netArea),\n    );\n\n  return airChanges(area(true) >= area(false) ? 0.35 : 0.25);\n}\n\nexport function groundInfiltration12(\n  elements: readonly BuildingElement[],\n): AirChanges {\n  for (const floor of elements) {\n    if (floor.tag !== \"GROUND_FLOOR\") {\n      continue;\n    }\n    if (floor.construction === \"UNSEALED_SUSPENDED_TIMBER\") {\n      return airChanges(0.2);\n    }\n    if (floor.construction === \"SEALED_SUSPENDED_TIMBER\") {\n      return airChanges(0.1);\n    }\n  }\n\n  return airChanges(0);\n}\n\n/** (14) Counted by window, not by area. */\nexport function draughtProofWindowPercentage14(\n  elements: readonly BuildingElement[],\n): Factor {\n  const windows = elements.filter(\n    (element) => element.tag === \"WINDOW\" || element.tag === \"ROOF_WINDOW\",\n  );\n\n  if (windows.length === 0) {\n    return factor(100);\n  }\n\n  const proofed = windows.filter((window) => window.draught_proofed);\n\n  return factor((100 * proofed.length) / windows.length);\n}\n\nexport function windowInfiltration15(percentage: Factor): AirChanges {\n  return airChanges(0.25 - (percentage * 0.2) / 100);\n}\n\nexport function infiltrationRate18(\n  airChanges8: AirChanges,\n  infiltrationRate16: AirChanges,\n  ap50: number | null,\n  ap4: number | null,\n): AirChanges {\n  // Truthiness as in Python: a recorded zero means no test.\n  if (ap50) {\n    return airChanges(ap50 / 20.0 + airChanges8);\n  }\n\n  if (ap4) {\n    return airChanges(0.263 * ap4 ** 0.924 + airChanges8);\n  }\n\n  return infiltrationRate16;\n}\n\nexport function monthlyAverageWindSpeed22(region: string): Monthly<Speed> {\n  return mapMonthly(monthlyValues(U2, TABLE_U2, region), speed);\n}\n\nexport function effectiveAirChangeRate24d(adjusted: AirChanges): AirChanges {\n  if (adjusted > 1) {\n    return adjusted;\n  }\n\n  return airChanges(0.5 + adjusted * adjusted * 0.5);\n}\n\n/**\n * SAP 10.2 (24c), centralised or decentralised MEV (section 2.6.1(b)). The\n * fans' 0.5 ach (2.6.5) is drawn in through the same cracks as infiltration,\n * so only half of it adds to the infiltration, and never less than the fans'\n * own rate. (24b) is for balanced systems, which supply air.\n */\nexport function wholeHouseExtract24c(\n  adjusted: AirChanges,\n  throughput: number,\n): AirChanges {\n  if (adjusted < 0.5 * throughput) {\n    return airChanges(throughput);\n  }\n  return airChanges(adjusted + 0.5 * throughput);\n}\n\nexport function ventilation(\n  input: WorksheetInput,\n  prior: DimensionResults & RegionResult,\n): VentilationResults {\n  const ventilation_open_chimney_6a = airFlow(80.0 * input.open_chimneys);\n  const ventilation_open_flue_6b = airFlow(20.0 * input.open_flues);\n  const ventilation_fire_flue_6c = airFlow(10.0 * input.fire_flues);\n  const ventilation_boiler_flue_6d = airFlow(20.0 * input.boiler_flues);\n  const ventilation_other_flue_6e = airFlow(35.0 * input.other_flues);\n  const ventilation_blocked_chimney_6f = airFlow(20.0 * input.blocked_chimneys);\n  const ventilation_extract_fan_7a = airFlow(10.0 * input.fans);\n  const ventilation_passive_vent_7b = airFlow(10.0 * input.vents);\n  const ventilation_flueless_gas_fire_7c = airFlow(40.0 * input.gas_fires);\n\n  const ventilation_infiltration_8 = sum([\n    ventilation_open_chimney_6a,\n    ventilation_open_flue_6b,\n    ventilation_fire_flue_6c,\n    ventilation_boiler_flue_6d,\n    ventilation_other_flue_6e,\n    ventilation_blocked_chimney_6f,\n    ventilation_extract_fan_7a,\n    ventilation_passive_vent_7b,\n    ventilation_flueless_gas_fire_7c,\n  ]);\n\n  const ventilation_air_changes_8 = airChanges(\n    ventilation_infiltration_8 / prior.dwelling_volume_5,\n  );\n\n  const storeys = storeys9(input.storeys_9, input.floor_height_2);\n  const additional_infiltration_10 = additionalInfiltration10(storeys);\n  const structural_infiltration_11 = structuralInfiltration11(\n    input.building_elements,\n  );\n  const ground_infiltration_12 = groundInfiltration12(input.building_elements);\n  const lobby_infiltration_13 = airChanges(input.has_draught_lobby ? 0 : 0.05);\n  const draught_proof_window_percentage_14 = draughtProofWindowPercentage14(\n    input.building_elements,\n  );\n  const window_infiltration_15 = windowInfiltration15(\n    draught_proof_window_percentage_14,\n  );\n\n  const infiltration_rate_16 = airChanges(\n    ventilation_air_changes_8 +\n      additional_infiltration_10 +\n      structural_infiltration_11 +\n      ground_infiltration_12 +\n      lobby_infiltration_13 +\n      window_infiltration_15,\n  );\n\n  const infiltration_rate_18 = infiltrationRate18(\n    ventilation_air_changes_8,\n    infiltration_rate_16,\n    input.air_permeability_value_ap50_17,\n    input.air_permeability_value_ap4_17a,\n  );\n\n  const shelter_factor_20 = factor(1.0 - 0.075 * input.sheltered_sides_19);\n  const sheltered_infiltration_rate_21 = airChanges(\n    shelter_factor_20 * infiltration_rate_18,\n  );\n\n  const monthly_average_wind_speed_22 = monthlyAverageWindSpeed22(prior.region);\n  const monthly_wind_factor_22a = mapMonthly(\n    monthly_average_wind_speed_22,\n    (wind) => factor(wind / 4),\n  );\n  const adjusted_infiltration_rate_22b = mapMonthly(\n    monthly_wind_factor_22a,\n    (wind) => airChanges(sheltered_infiltration_rate_21 * wind),\n  );\n\n  const mechanical = MECHANICAL.includes(input.ventilation_system);\n  const mvhr_air_change_rate_23a = factor(mechanical ? 0.5 : 0);\n  const mvhr_air_change_rate_23b = factor(\n    mechanical ? mvhr_air_change_rate_23a : 0,\n  );\n  const mvhr_air_change_rate_23c = factor(mechanical ? 0.7 : 0);\n\n  const mechanical_ventilation_with_hr_24a =\n    input.ventilation_system === \"MVHR\"\n      ? mapMonthly(adjusted_infiltration_rate_22b, (adjusted) =>\n          airChanges(\n            adjusted +\n              mvhr_air_change_rate_23b * (1 - mvhr_air_change_rate_23c),\n          ),\n        )\n      : null;\n\n  const whole_house_extract_24c = EXTRACT_SYSTEMS.includes(\n    input.ventilation_system,\n  )\n    ? mapMonthly(adjusted_infiltration_rate_22b, (adjusted) =>\n        wholeHouseExtract24c(adjusted, mvhr_air_change_rate_23b),\n      )\n    : null;\n\n  const effective_air_change_rate_24d = mapMonthly(\n    adjusted_infiltration_rate_22b,\n    effectiveAirChangeRate24d,\n  );\n\n  const effective_air_change_rate_25 =\n    mechanical_ventilation_with_hr_24a ??\n    whole_house_extract_24c ??\n    effective_air_change_rate_24d;\n\n  return {\n    ventilation_open_chimney_6a,\n    ventilation_open_flue_6b,\n    ventilation_fire_flue_6c,\n    ventilation_boiler_flue_6d,\n    ventilation_other_flue_6e,\n    ventilation_blocked_chimney_6f,\n    ventilation_extract_fan_7a,\n    ventilation_passive_vent_7b,\n    ventilation_flueless_gas_fire_7c,\n    ventilation_infiltration_8,\n    ventilation_air_changes_8,\n    storeys_9: storeys,\n    additional_infiltration_10,\n    structural_infiltration_11,\n    ground_infiltration_12,\n    lobby_infiltration_13,\n    draught_proof_window_percentage_14,\n    window_infiltration_15,\n    infiltration_rate_16,\n    infiltration_rate_18,\n    shelter_factor_20,\n    sheltered_infiltration_rate_21,\n    monthly_average_wind_speed_22,\n    monthly_wind_factor_22a,\n    adjusted_infiltration_rate_22b,\n    mvhr_air_change_rate_23a,\n    mvhr_air_change_rate_23b,\n    mvhr_air_change_rate_23c,\n    mechanical_ventilation_with_hr_24a,\n    whole_house_extract_24c,\n    effective_air_change_rate_24d,\n    effective_air_change_rate_25,\n  };\n}\n", "{\n  \"description\": \"Cold water mains temperature by month and supply kind\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/appendices/j.py\",\n  \"standard\": \"SAP 2012 Appendix J\",\n  \"table\": \"J1\",\n  \"units\": \"degree_Celsius\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"COMBI_OR_UNVENTED\": [\"8.0\", \"8.2\", \"9.3\", \"12.7\", \"14.6\", \"16.7\", \"18.4\", \"17.6\", \"16.6\", \"14.3\", \"11.1\", \"8.5\"],\n    \"FROM_HEADER_TANK\": [\"11.1\", \"11.3\", \"12.3\", \"14.5\", \"16.2\", \"18.8\", \"21.3\", \"19.3\", \"18.7\", \"16.2\", \"13.2\", \"11.2\"],\n    \"FROM_MAINS\": [\"8.0\", \"8.2\", \"9.3\", \"12.7\", \"14.6\", \"16.7\", \"18.4\", \"17.6\", \"16.6\", \"14.3\", \"11.1\", \"8.5\"],\n    \"UNKNOWN\": [\"8.0\", \"8.2\", \"9.3\", \"12.7\", \"14.6\", \"16.7\", \"18.4\", \"17.6\", \"16.6\", \"14.3\", \"11.1\", \"8.5\"],\n    \"VENTED\": [\"11.1\", \"11.3\", \"12.3\", \"14.5\", \"16.2\", \"18.8\", \"21.3\", \"19.3\", \"18.7\", \"16.2\", \"13.2\", \"11.2\"],\n    \"VENTED_WITH_PUMP\": [\"11.1\", \"11.3\", \"12.3\", \"14.5\", \"16.2\", \"18.8\", \"21.3\", \"19.3\", \"18.7\", \"16.2\", \"13.2\", \"11.2\"]\n  }\n}\n", "{\n  \"description\": \"Monthly factor for other hot water use; ANNUAL is the mean\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/appendices/j.py\",\n  \"standard\": \"SAP 2012 Appendix J\",\n  \"table\": \"J2\",\n  \"units\": \"\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"ANNUAL\": [\"1.00\"],\n    \"MONTHLY\": [\"1.10\", \"1.06\", \"1.02\", \"0.98\", \"0.94\", \"0.90\", \"0.90\", \"0.94\", \"0.98\", \"1.02\", \"1.06\", \"1.10\"]\n  }\n}\n", "{\n  \"description\": \"Shower flow rate by hot water supply kind\",\n  \"key_type\": \"text\",\n  \"shape\": \"scalar\",\n  \"source\": \"apps/twin/sap/appendices/j.py\",\n  \"standard\": \"SAP 2012 Appendix J\",\n  \"table\": \"J4\",\n  \"units\": \"liter / minute\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"COMBI_OR_UNVENTED\": \"11\",\n    \"UNKNOWN\": \"9\",\n    \"VENTED\": \"7\",\n    \"VENTED_WITH_PUMP\": \"12\"\n  }\n}\n", "{\n  \"description\": \"Monthly factor for bath and shower use\",\n  \"key_type\": \"text\",\n  \"shape\": \"list\",\n  \"source\": \"apps/twin/sap/appendices/j.py\",\n  \"standard\": \"SAP 2012 Appendix J\",\n  \"table\": \"J5\",\n  \"units\": \"\",\n  \"value_type\": \"quantity\",\n  \"values\": {\n    \"MONTHLY\": [\"1.035\", \"1.021\", \"1.007\", \"0.993\", \"0.979\", \"0.965\", \"0.965\", \"0.979\", \"0.993\", \"1.007\", \"1.021\", \"1.035\"]\n  }\n}\n", "// Section 4, rows (42)\u2013(65), with Appendix J (apps/twin/sap/appendices/j.py).\n// Heat recovery rows (63a)\u2013(63d) are zero: RdSAP records none of it.\n\nimport table32 from \"../../../apps/twin/tables/table32.json\";\nimport tablej1 from \"../../../apps/twin/tables/tablej1.json\";\nimport tablej2 from \"../../../apps/twin/tables/tablej2.json\";\nimport tablej4 from \"../../../apps/twin/tables/tablej4.json\";\nimport tablej5 from \"../../../apps/twin/tables/tablej5.json\";\nimport type { DimensionResults } from \"./dimensions\";\nimport type { FabricResults } from \"./fabric\";\nimport { loadTable, monthlyValues, spec, values } from \"./tables\";\nimport {\n  type Celsius,\n  type Factor,\n  type KilowattHoursPerDay,\n  type KilowattHoursPerMonth,\n  type LitresPerDay,\n  type Monthly,\n  celsius,\n  factor,\n  kilowattHoursPerDay,\n  kilowattHoursPerMonth,\n  litresPerDay,\n  mapMonthly,\n  monthly,\n} from \"./units\";\nimport type { WorksheetInput } from \"./worksheet\";\n\nconst J1 = spec(tablej1);\nconst J4 = spec(tablej4);\nconst TABLE_32 = spec(table32);\n\nconst TABLE_J1 = loadTable(J1);\nconst TABLE_J4 = loadTable(J4);\nconst TABLE_32_ROWS = loadTable(TABLE_32);\n\nconst J2 = spec(tablej2);\nconst J5 = spec(tablej5);\nconst FACTOR_J2 = monthlyValues(J2, loadTable(J2), \"MONTHLY\");\nconst FACTOR_J5 = monthlyValues(J5, loadTable(J5), \"MONTHLY\");\n\n/** Table 3's summer, June to September. */\nconst SUMMER_MONTHS = [5, 6, 7, 8];\n\n/** Table 32 codes for electricity. */\nconst ELECTRICITY_FUEL_CODES = [30, 31, 32, 33, 34, 35, 38, 39, 40];\n\n/** \u00B0C. */\nconst DRAWN = 41;\nconst STORED = 52;\n\n/** kJ/litre\u00B7K, and kJ/kWh. */\nconst WATER_HEAT_CAPACITY = 4.18;\nconst KILOJOULES_PER_KILOWATT_HOUR = 3600;\n\nexport interface WaterResults {\n  assumed_occupancy_42: Factor;\n  hot_water_showers_42a: Monthly<LitresPerDay>;\n  hot_water_baths_42b: Monthly<LitresPerDay>;\n  hot_water_other_42c: Monthly<LitresPerDay>;\n  hot_water_usage_43: LitresPerDay;\n  monthly_hot_water_usage_44: Monthly<LitresPerDay>;\n  energy_content_of_water_used_45: Monthly<KilowattHoursPerMonth>;\n  distribution_loss_46: Monthly<KilowattHoursPerMonth>;\n  total_hot_water_loss_55: KilowattHoursPerDay;\n  water_storage_loss_57: Monthly<KilowattHoursPerMonth>;\n  water_primary_circuit_loss_59: Monthly<KilowattHoursPerMonth>;\n  water_combi_loss_61: Monthly<KilowattHoursPerMonth>;\n  water_heat_required_62: Monthly<KilowattHoursPerMonth>;\n  water_wwhrs_input_63a: Monthly<number>;\n  water_pv_input_63b: Monthly<number>;\n  water_solar_input_63c: Monthly<number>;\n  water_fghrs_input_63d: Monthly<number>;\n  water_heater_output_64: Monthly<KilowattHoursPerMonth>;\n  water_electric_shower_64a: Monthly<KilowattHoursPerMonth>;\n  water_heat_gains_65: Monthly<KilowattHoursPerMonth>;\n}\n\nexport function assumedOccupancy42(totalFloorArea4: number): Factor {\n  if (totalFloorArea4 <= 13.9) {\n    return factor(1);\n  }\n\n  return factor(\n    1 +\n      1.76 * (1 - Math.exp(-0.000349 * (totalFloorArea4 - 13.19) ** 2)) +\n      0.0013 * (totalFloorArea4 - 13.9),\n  );\n}\n\n/** Table J1, the cold water temperature. */\nexport function tableJ1(hotWaterSupply: string): Monthly<Celsius> {\n  return mapMonthly(monthlyValues(J1, TABLE_J1, hotWaterSupply), celsius);\n}\n\n/** Appendix J equations 4 and 9: the hot share of water drawn at 41 \u00B0C. */\nfunction hotFraction(mains: Celsius): number {\n  return (DRAWN - mains) / (STORED - mains);\n}\n\n/** Appendix J equation 1. */\nexport function showersPerDay(\n  numberOfBaths: number,\n  numberOfShowers: number,\n  occupancy: Factor,\n): number {\n  if (numberOfShowers === 0) {\n    return 0;\n  }\n\n  if (numberOfBaths > 0) {\n    return 0.45 * occupancy + 0.65;\n  }\n\n  return 0.58 * occupancy + 0.83;\n}\n\n/** Appendix J equation 6. */\nexport function bathsPerDay(\n  numberOfBaths: number,\n  numberOfShowers: number,\n  occupancy: Factor,\n): number {\n  if (numberOfBaths === 0 && numberOfShowers > 0) {\n    return 0;\n  }\n\n  if (numberOfBaths > 0 && numberOfShowers > 0) {\n    return 0.13 * occupancy + 0.19;\n  }\n\n  return 0.35 * occupancy + 0.5;\n}\n\n/** Appendix J equations 2 and 3. */\nfunction hotWaterShowers42a(\n  input: WorksheetInput,\n  occupancy: Factor,\n): Monthly<LitresPerDay> {\n  const showers = showersPerDay(\n    input.number_of_baths,\n    input.number_of_showers,\n    occupancy,\n  );\n\n  // Equation 2 divides by the shower count and 3 multiplies it back, so only\n  // zero matters.\n  if (input.number_of_showers === 0) {\n    return monthly(() => litresPerDay(0));\n  }\n\n  const flowRate = values(J4, TABLE_J4, input.hot_water_supply)[0] ?? 0;\n  const mains = tableJ1(input.hot_water_supply);\n\n  return mapMonthly(FACTOR_J5, (seasonal, month) =>\n    litresPerDay(\n      flowRate *\n        6 *\n        seasonal *\n        showers *\n        hotFraction(mains[month] ?? celsius(0)),\n    ),\n  );\n}\n\n/** Appendix J equations 7 and 8. */\nfunction hotWaterBaths42b(\n  input: WorksheetInput,\n  occupancy: Factor,\n): Monthly<LitresPerDay> {\n  const baths = bathsPerDay(\n    input.number_of_baths,\n    input.number_of_showers,\n    occupancy,\n  );\n  const mains = tableJ1(input.hot_water_supply);\n\n  return mapMonthly(FACTOR_J5, (seasonal, month) =>\n    litresPerDay(\n      baths * 73 * seasonal * hotFraction(mains[month] ?? celsius(0)),\n    ),\n  );\n}\n\n/** Appendix J equation 11. */\nfunction hotWaterOther42c(occupancy: Factor): Monthly<LitresPerDay> {\n  return mapMonthly(FACTOR_J2, (seasonal) =>\n    litresPerDay((9.8 * occupancy + 14) * seasonal),\n  );\n}\n\n/** Appendix J equation 14. */\nfunction energyContent45(\n  daysInMonth: number,\n  litres: LitresPerDay,\n  mains: Celsius,\n): KilowattHoursPerMonth {\n  return kilowattHoursPerMonth(\n    (WATER_HEAT_CAPACITY * litres * daysInMonth * (STORED - mains)) /\n      KILOJOULES_PER_KILOWATT_HOUR,\n  );\n}\n\n/** (55) Tables 2, 2a, 2b; anything not factory insulated is a jacket. */\nexport function totalHotWaterLoss55(\n  input: WorksheetInput,\n): KilowattHoursPerDay {\n  const volume = input.water_storage_volume_47;\n\n  if (volume <= 0) {\n    return kilowattHoursPerDay(0);\n  }\n\n  const thickness = input.cylinder_insulation_thickness ?? 0;\n\n  const lossFactor =\n    input.cylinder_insulation === \"FACTORY\"\n      ? 0.005 + 0.55 / (thickness + 4)\n      : 0.005 + 1.76 / (thickness + 12.8);\n\n  const volumeFactor = Math.cbrt(120 / volume);\n  const temperatureFactor = input.cylinder_thermostat ? 0.6 : 0.6 * 1.3;\n\n  return kilowattHoursPerDay(\n    volume * lossFactor * volumeFactor * temperatureFactor,\n  );\n}\n\n/** (59) Table 3, with the pipework uninsulated: RdSAP doesn't record it. */\nexport function waterPrimaryCircuitLoss59(\n  input: WorksheetInput,\n  daysInMonth: Monthly<number>,\n): Monthly<KilowattHoursPerMonth> {\n  const code = values(TABLE_32, TABLE_32_ROWS, input.water_heater_fuel)[4];\n\n  if (\n    input.water_storage_volume_47 <= 0 ||\n    ELECTRICITY_FUEL_CODES.includes(code ?? Number.NaN)\n  ) {\n    return monthly(() => kilowattHoursPerMonth(0));\n  }\n\n  const winterHours = input.cylinder_thermostat ? 5 : 11;\n\n  return mapMonthly(daysInMonth, (days, month) =>\n    kilowattHoursPerMonth(\n      days *\n        14 *\n        (0.0245 * (SUMMER_MONTHS.includes(month) ? 3 : winterHours) + 0.0263),\n    ),\n  );\n}\n\n/** (61) Table 3a, instantaneous combi, no keep-hot. A cylinder rules it out. */\nexport function waterCombiLoss61(\n  input: WorksheetInput,\n  usage: Monthly<LitresPerDay>,\n  daysInMonth: Monthly<number>,\n): Monthly<KilowattHoursPerMonth> {\n  if (\n    input.water_storage_volume_47 > 0 ||\n    !input.water_heater_system.includes(\"COMBI\")\n  ) {\n    return monthly(() => kilowattHoursPerMonth(0));\n  }\n\n  return mapMonthly(daysInMonth, (days, month) =>\n    kilowattHoursPerMonth(\n      (600 * Math.min(1, (usage[month] ?? 0) / 100) * days) / 365,\n    ),\n  );\n}\n\nexport function water(\n  input: WorksheetInput,\n  prior: DimensionResults & FabricResults,\n): WaterResults {\n  const days = prior.days_in_month_41;\n\n  const assumed_occupancy_42 = assumedOccupancy42(prior.total_floor_area_4);\n\n  const hot_water_showers_42a = hotWaterShowers42a(input, assumed_occupancy_42);\n  const hot_water_baths_42b = hotWaterBaths42b(input, assumed_occupancy_42);\n  const hot_water_other_42c = hotWaterOther42c(assumed_occupancy_42);\n\n  const hot_water_usage_43 = litresPerDay(25 * assumed_occupancy_42 + 36);\n\n  const monthly_hot_water_usage_44 = mapMonthly(\n    hot_water_showers_42a,\n    (showers, month) =>\n      litresPerDay(\n        showers +\n          (hot_water_baths_42b[month] ?? 0) +\n          (hot_water_other_42c[month] ?? 0),\n      ),\n  );\n\n  // (45) heats from the mains temperature even where a header tank feeds it.\n  const mains = tableJ1(\"FROM_MAINS\");\n\n  const energy_content_of_water_used_45 = mapMonthly(\n    monthly_hot_water_usage_44,\n    (litres, month) =>\n      energyContent45(days[month] ?? 0, litres, mains[month] ?? celsius(0)),\n  );\n\n  const distribution_loss_46 = mapMonthly(\n    energy_content_of_water_used_45,\n    (energy) => kilowattHoursPerMonth(0.15 * energy),\n  );\n\n  const total_hot_water_loss_55 = totalHotWaterLoss55(input);\n\n  const water_storage_loss_57 = mapMonthly(days, (day) =>\n    kilowattHoursPerMonth(total_hot_water_loss_55 * day),\n  );\n\n  const water_primary_circuit_loss_59 = waterPrimaryCircuitLoss59(input, days);\n\n  const water_combi_loss_61 = waterCombiLoss61(\n    input,\n    monthly_hot_water_usage_44,\n    days,\n  );\n\n  const water_heat_required_62 = mapMonthly(\n    energy_content_of_water_used_45,\n    (energy, month) =>\n      kilowattHoursPerMonth(\n        0.85 * energy +\n          (distribution_loss_46[month] ?? 0) +\n          (water_storage_loss_57[month] ?? 0) +\n          (water_primary_circuit_loss_59[month] ?? 0) +\n          (water_combi_loss_61[month] ?? 0),\n      ),\n  );\n\n  const water_heat_gains_65 = mapMonthly(\n    energy_content_of_water_used_45,\n    (energy, month) =>\n      kilowattHoursPerMonth(\n        0.25 * (0.85 * energy + (water_combi_loss_61[month] ?? 0)) +\n          0.8 *\n            ((distribution_loss_46[month] ?? 0) +\n              (water_storage_loss_57[month] ?? 0) +\n              (water_primary_circuit_loss_59[month] ?? 0)),\n      ),\n  );\n\n  const none = monthly(() => 0);\n\n  return {\n    assumed_occupancy_42,\n    hot_water_showers_42a,\n    hot_water_baths_42b,\n    hot_water_other_42c,\n    hot_water_usage_43,\n    monthly_hot_water_usage_44,\n    energy_content_of_water_used_45,\n    distribution_loss_46,\n    total_hot_water_loss_55,\n    water_storage_loss_57,\n    water_primary_circuit_loss_59,\n    water_combi_loss_61,\n    water_heat_required_62,\n    water_wwhrs_input_63a: none,\n    water_pv_input_63b: none,\n    water_solar_input_63c: none,\n    water_fghrs_input_63d: none,\n    water_heater_output_64: water_heat_required_62,\n    water_electric_shower_64a: monthly(() => kilowattHoursPerMonth(0)),\n    water_heat_gains_65,\n  };\n}\n", "// Port of apps/twin/sap/worksheet.py. Result fields keep the worksheet's row\n// names (floor_volume_3, computed by floorVolume3), which the goldens are keyed\n// by. Each section takes the input and earlier results, returning its own rows.\n\nimport { type DimensionResults, dimensions } from \"./dimensions\";\nimport { type FabricResults, fabric } from \"./fabric\";\nimport { type GainsResults, gains } from \"./gains\";\nimport { type HeatingResults, heating } from \"./heating\";\nimport { type RatingResults, rating } from \"./rating\";\nimport { region } from \"./region\";\nimport type { Area, Length, UValue } from \"./units\";\nimport { type VentilationResults, ventilation } from \"./ventilation\";\nimport { type WaterResults, water } from \"./water\";\n\n/** From the RdSAP serializer; which optional fields exist depends on `tag`. */\nexport interface BuildingElement {\n  tag: string;\n  area: Area;\n  uvalue?: UValue | undefined;\n  /** Area of the windows and doors set into it. */\n  openings?: Area | undefined;\n  construction?: string | undefined;\n  /** Age band, A to M. */\n  age?: string | undefined;\n  glazing?: string | undefined;\n  frame?: string | undefined;\n  shading?: string | undefined;\n  orientation?: string | undefined;\n  draught_proofed?: boolean | undefined;\n}\n\nexport interface WorksheetInput {\n  postcode: string;\n  building_elements: readonly BuildingElement[];\n\n  // Section 1\n  floor_area_1: readonly Area[];\n  floor_height_2: readonly Length[];\n\n  // Section 2\n  open_chimneys: number;\n  open_flues: number;\n  fire_flues: number;\n  boiler_flues: number;\n  other_flues: number;\n  blocked_chimneys: number;\n  fans: number;\n  vents: number;\n  gas_fires: number;\n  ventilation_system: string;\n  has_draught_lobby: boolean;\n  air_permeability_value_ap50_17: number | null;\n  air_permeability_value_ap4_17a: number | null;\n  /** 0 means count the floor heights. */\n  storeys_9: number;\n  sheltered_sides_19: number;\n\n  // Section 4\n  hot_water_supply: string;\n  number_of_baths: number;\n  number_of_showers: number;\n  /** Litres; 0 means no cylinder. */\n  water_storage_volume_47: number;\n  cylinder_insulation: string;\n  /** mm, or null where not measured. */\n  cylinder_insulation_thickness: number | null;\n  cylinder_thermostat: boolean;\n  water_heater_system: string;\n  water_heater_fuel: string;\n\n  // Sections 5 to 7\n  /** kJ/m\u00B2K. */\n  thermal_mass_parameter_35: number;\n  first_main_heat_system: string;\n  heating_control_type: number;\n  living_area: Area;\n\n  // Sections 8c to 12a\n  has_secondary_heating: boolean;\n  second_main_heat_system: string;\n  secondary_heat_system: string;\n  air_conditioner_efficiency: string;\n  first_main_heat_system_fuel: string;\n  second_main_heat_system_fuel: string;\n  secondary_heat_system_fuel: string;\n  space_cooling_fuel: string;\n  lighting_fuel: string;\n  /** kWp. */\n  pv_peak_power: number;\n  pv_overshading: string;\n  /** Degrees. */\n  pv_orientation: number;\n  pv_pitch: number;\n  /** kWh. */\n  battery_capacity: number;\n  /** A heat pump's seasonal performance, for the corrected rows (not RdSAP's). */\n  heat_pump_scop: number;\n}\n\nexport interface RegionResult {\n  region: string;\n}\n\nexport interface WorksheetResults\n  extends RegionResult,\n    DimensionResults,\n    VentilationResults,\n    FabricResults,\n    WaterResults,\n    GainsResults,\n    HeatingResults,\n    RatingResults {}\n\nexport function worksheet(input: WorksheetInput): WorksheetResults {\n  const rows = {\n    region: region(input.postcode),\n    ...dimensions(input),\n  };\n  const ventilated = { ...rows, ...ventilation(input, rows) };\n  const lost = { ...ventilated, ...fabric(input, ventilated) };\n  const heated = { ...lost, ...water(input, lost) };\n  const gained = { ...heated, ...gains(input, heated) };\n  const demanded = { ...gained, ...heating(input, gained) };\n\n  return { ...demanded, ...rating(input, demanded) };\n}\n", "import { polygonArea, projectOnSegment } from \"./geometry\";\nimport { pointAlong, wallFrame } from \"./openings\";\nimport type {\n  Emitter,\n  Point,\n  Radiator,\n  RadiatorType,\n  Room,\n  Scene,\n  Underfloor,\n  Wall,\n} from \"./scene\";\nimport { polygonOf, wallEnds } from \"./topology\";\n\n// Where a radiator or underfloor heating sits, and what it gives at the\n// design flow temperature against the room's own. Everything here is pure.\n\nexport const RADIATOR_DEFAULTS = {\n  length: 1000,\n  height: 600,\n  type: \"22\",\n} as const satisfies Pick<Radiator, \"length\" | \"height\" | \"type\">;\n\n/** Front to back, mm, roughly: the plan draws it to scale. */\nconst RADIATOR_DEPTH: Record<RadiatorType, number> = {\n  \"10\": 50,\n  \"11\": 60,\n  \"21\": 80,\n  \"22\": 100,\n  \"33\": 155,\n};\n\n/** Off the wall's face, on its brackets. */\nconst RADIATOR_GAP_MM = 40;\n\n/** W per metre of length at \u0394T50, by height (mm): Stelrad Compact range,\n * 1000 mm models (Compact K3 technical data sheet, BS EN 442 at 75/65/20 \u00B0C). */\nconst RATED: Record<RadiatorType, readonly [number, number][]> = {\n  \"10\": [\n    [450, 474],\n    [600, 619],\n  ],\n  \"11\": [\n    [300, 509],\n    [450, 756],\n    [600, 980],\n    [700, 1117],\n  ],\n  \"21\": [\n    [300, 745],\n    [450, 1055],\n    [600, 1345],\n    [700, 1530],\n  ],\n  \"22\": [\n    [300, 982],\n    [450, 1371],\n    [600, 1732],\n    [700, 1961],\n  ],\n  \"33\": [\n    [300, 1349],\n    [500, 2056],\n    [600, 2389],\n    [700, 2712],\n  ],\n};\n\nexport const RADIATOR_LABELS: Record<RadiatorType, string> = {\n  \"10\": \"Type 10 (P1)\",\n  \"11\": \"Type 11 (K1)\",\n  \"21\": \"Type 21 (P+)\",\n  \"22\": \"Type 22 (K2)\",\n  \"33\": \"Type 33 (K3)\",\n};\n\n/** BS EN 442's n for steel panels; Stelrad's certified ones run 1.26 to 1.33. */\nexport const RADIATOR_EXPONENT = 1.3;\n\n/** K between flow and return: a heat pump's usual design. */\nexport const FLOW_DROP_K = 5;\n\n/** W/m\u00B2 per K of mean water over room, through a 45 mm screed with pipes at\n * 150 mm (Multipipe, \"Pipe centres & UFH\": 55.5 W/m\u00B2 tiled, 27.8 under 22 mm\n * wood block, at 30 \u00B0C mean water and 20 \u00B0C air). */\nexport const UNDERFLOOR_W_PER_M2K = { tile: 5.55, wood: 2.78 } as const;\n\nexport const UNDERFLOOR_LABELS = {\n  tile: \"Tiles or stone\",\n  wood: \"Wood or carpet\",\n} as const;\n\n/** BS EN 1264's limit on the floor's surface: 29 \u00B0C, 33 \u00B0C in a bathroom. */\nconst FLOOR_SURFACE_MAX_C = 29;\nconst WET_FLOOR_SURFACE_MAX_C = 33;\nconst WET_ROOMS = new Set([\"bathroom\", \"shower\"]);\n\nexport function meanWaterC(flowC: number): number {\n  return flowC - FLOW_DROP_K / 2;\n}\n\n/** W per metre at \u0394T50, interpolated between the heights the maker lists. */\nexport function ratedWattsPerMetre(\n  type: RadiatorType,\n  heightMm: number,\n): number {\n  const rows = RATED[type];\n  let index = 0;\n  while (\n    index < rows.length - 2 &&\n    heightMm > (rows[index + 1] as [number, number])[0]\n  ) {\n    index++;\n  }\n  const [h0, w0] = rows[index] as [number, number];\n  const [h1, w1] = rows[index + 1] as [number, number];\n  return Math.max(0, w0 + ((w1 - w0) * (heightMm - h0)) / (h1 - h0));\n}\n\n/** The share of its \u0394T50 rating a radiator gives at `deltaK`. */\nexport function correction(deltaK: number): number {\n  return deltaK > 0 ? (deltaK / 50) ** RADIATOR_EXPONENT : 0;\n}\n\nexport function radiatorWatts(\n  radiator: Pick<Radiator, \"type\" | \"height\" | \"length\">,\n  flowC: number,\n  roomC: number,\n): number {\n  const rated =\n    (ratedWattsPerMetre(radiator.type, radiator.height) * radiator.length) /\n    1000;\n  return rated * correction(meanWaterC(flowC) - roomC);\n}\n\n/** BS EN 1264's basic characteristic, q = 8.92 (\u03B8 floor \u2212 \u03B8 room)^1.1. */\nexport function floorLimitWPerM2(roomC: number, roomType: string): number {\n  const surface = WET_ROOMS.has(roomType)\n    ? WET_FLOOR_SURFACE_MAX_C\n    : FLOOR_SURFACE_MAX_C;\n  return surface > roomC ? 8.92 * (surface - roomC) ** 1.1 : 0;\n}\n\nexport function underfloorWatts(\n  underfloor: Pick<Underfloor, \"area\" | \"finish\">,\n  room: { areaM2: number; internalC: number; type: string },\n  flowC: number,\n): number {\n  const area = Math.min(underfloor.area ?? room.areaM2, room.areaM2);\n  const water =\n    UNDERFLOOR_W_PER_M2K[underfloor.finish] *\n    Math.max(0, meanWaterC(flowC) - room.internalC);\n  return area * Math.min(water, floorLimitWPerM2(room.internalC, room.type));\n}\n\n/** Panel lengths (mm) the Stelrad Compact range is made in (Compact technical\n * data sheet); heights come from RATED above. */\nconst RADIATOR_LENGTHS_MM = [\n  400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1400, 1600, 1800, 2000,\n] as const;\n\n/** Flow temperatures a heat pump is usually designed at: 35 underfloor, 45 and\n * 50 radiators sized up, 55 the top of the efficient range. */\nexport const FLOW_PRESETS_C = [35, 45, 50, 55] as const;\n\nexport interface Suggestion {\n  /** The smallest single radiator that covers the shortfall, if one does. */\n  radiator: Pick<Radiator, \"type\" | \"height\" | \"length\"> | null;\n  /** Underfloor heating over the whole floor covers it. */\n  underfloor: boolean;\n}\n\n/** What would close a shortfall of `shortW` in a room, with one new emitter. */\nexport function suggestEmitter(\n  shortW: number,\n  room: { areaM2: number; internalC: number; type: string },\n  flowC: number,\n): Suggestion {\n  let radiator: Suggestion[\"radiator\"] = null;\n  let best = Number.POSITIVE_INFINITY;\n  for (const type of Object.keys(RATED) as RadiatorType[]) {\n    for (const [height] of RATED[type]) {\n      for (const length of RADIATOR_LENGTHS_MM) {\n        const watts = radiatorWatts(\n          { type, height, length },\n          flowC,\n          room.internalC,\n        );\n        if (watts >= shortW && watts < best) {\n          best = watts;\n          radiator = { type, height, length };\n        }\n      }\n    }\n  }\n  const underfloor =\n    underfloorWatts({ area: null, finish: \"tile\" }, room, flowC) >= shortW;\n  return { radiator, underfloor };\n}\n\n/** \"Type 22 (K2), 600 \u00D7 800, or underfloor\", for a room short by `shortW`. */\nexport function suggestionText(suggestion: Suggestion): string {\n  const parts: string[] = [];\n  if (suggestion.radiator) {\n    const { type, height, length } = suggestion.radiator;\n    parts.push(`${RADIATOR_LABELS[type]}, ${height} \u00D7 ${length}`);\n  }\n  if (suggestion.underfloor) {\n    parts.push(\"underfloor heating\");\n  }\n  return parts.length > 0\n    ? parts.join(\", or \")\n    : \"more than one emitter, or a warmer flow\";\n}\n\nexport interface Delivered {\n  id: string;\n  label: string;\n  watts: number;\n}\n\n/** What a room's emitters give, against what it loses on the design day. */\nexport interface Cover {\n  watts: number;\n  neededW: number;\n  short: boolean;\n  emitters: Delivered[];\n}\n\nexport function emitterLabel(emitter: Emitter): string {\n  if (emitter.kind === \"radiator\") {\n    return `${RADIATOR_LABELS[emitter.type]}, ${emitter.height} \u00D7 ${emitter.length}`;\n  }\n  const area = emitter.area === null ? \"whole floor\" : `${emitter.area} m\u00B2`;\n  return `Underfloor, ${UNDERFLOOR_LABELS[emitter.finish].toLowerCase()}, ${area}`;\n}\n\nexport function emitterWatts(\n  emitter: Emitter,\n  room: { areaM2: number; internalC: number; type: string },\n  flowC: number,\n): number {\n  return emitter.kind === \"radiator\"\n    ? radiatorWatts(emitter, flowC, room.internalC)\n    : underfloorWatts(emitter, room, flowC);\n}\n\n/** The room's emitters at `flowC`, or null when it has none. */\nexport function roomCover(\n  emitters: readonly Emitter[],\n  room: {\n    id: string;\n    areaM2: number;\n    internalC: number;\n    type: string;\n    designW: number;\n  },\n  flowC: number,\n): Cover | null {\n  const mine = emitters.filter((emitter) => emitter.room === room.id);\n  if (mine.length === 0) {\n    return null;\n  }\n  const delivered = mine.map((emitter) => ({\n    id: emitter.id,\n    label: emitterLabel(emitter),\n    watts: emitterWatts(emitter, room, flowC),\n  }));\n  const watts = delivered.reduce((total, each) => total + each.watts, 0);\n  return {\n    watts,\n    neededW: room.designW,\n    short: watts < room.designW,\n    emitters: delivered,\n  };\n}\n\n/** The room's boundary runs along the wall. */\nexport function holdsWall(room: Room, wall: Wall): boolean {\n  return room.boundary.some((vertex, index) => {\n    const next = room.boundary[(index + 1) % room.boundary.length];\n    return (\n      (vertex === wall.a && next === wall.b) ||\n      (vertex === wall.b && next === wall.a)\n    );\n  });\n}\n\nfunction signedArea(polygon: readonly Point[]): number {\n  let doubled = 0;\n  polygon.forEach((a, index) => {\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  });\n  return doubled / 2;\n}\n\n/** Which side of the wall a\u2192b the room is on: 1 along the wall's left normal\n * (\u2212uy, ux), \u22121 the other way, null if the room doesn't hold the wall. */\nexport function roomSide(scene: Scene, room: Room, wall: Wall): 1 | -1 | null {\n  const count = room.boundary.length;\n  let forward: boolean | null = null;\n  for (let index = 0; index < count; index++) {\n    const vertex = room.boundary[index];\n    const next = room.boundary[(index + 1) % count];\n    if (vertex === wall.a && next === wall.b) {\n      forward = true;\n    } else if (vertex === wall.b && next === wall.a) {\n      forward = false;\n    }\n  }\n  if (forward === null) {\n    return null;\n  }\n  // A ring with positive area has its inside on the left as it goes round.\n  const inLeft = signedArea(polygonOf(scene, room)) > 0;\n  return inLeft === forward ? 1 : -1;\n}\n\nexport interface Bar {\n  from: Point;\n  to: Point;\n  /** Front to back, mm. */\n  depth: number;\n  /** Unit vector from the wall into the room. */\n  inward: Point;\n}\n\n/** The radiator's centreline just inside its wall, or null if it's lost. */\nexport function radiatorBar(scene: Scene, radiator: Radiator): Bar | null {\n  const wall = scene.walls.find((candidate) => candidate.id === radiator.wall);\n  const room = scene.rooms.find((candidate) => candidate.id === radiator.room);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  const side = wall && room ? roomSide(scene, room, wall) : null;\n  if (!wall || !ends || side === null) {\n    return null;\n  }\n  const frame = wallFrame(ends[0], ends[1]);\n  const depth = RADIATOR_DEPTH[radiator.type];\n  const inward: Point = [-frame.uy * side, frame.ux * side];\n  const away = wall.thickness / 2 + RADIATOR_GAP_MM + depth / 2;\n  const shift = (point: Point): Point => [\n    point[0] + inward[0] * away,\n    point[1] + inward[1] * away,\n  ];\n  return {\n    from: shift(pointAlong(ends[0], ends[1], radiator.offset)),\n    to: shift(pointAlong(ends[0], ends[1], radiator.offset + radiator.length)),\n    depth,\n    inward,\n  };\n}\n\nexport interface Placement {\n  wall: Wall;\n  room: Room;\n  offset: number;\n}\n\n/** Where a radiator `length` long goes for the pointer at `point`: centred\n * on the nearest wall within `tolerance`, in the room on the pointer's side\n * (or the wall's only room). */\nexport function radiatorPlacement(\n  point: Point,\n  scene: Scene,\n  length: number,\n  tolerance: number,\n): Placement | null {\n  let best: { wall: Wall; ends: [Point, Point]; t: number; d: number } | null =\n    null;\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    const projection = projectOnSegment(point, ends[0], ends[1]);\n    if (\n      projection.distance <= tolerance &&\n      (best === null || projection.distance < best.d)\n    ) {\n      best = { wall, ends, t: projection.t, d: projection.distance };\n    }\n  }\n  if (!best) {\n    return null;\n  }\n  const { wall, ends, t } = best;\n  const frame = wallFrame(ends[0], ends[1]);\n  if (length > frame.length) {\n    return null;\n  }\n  const across =\n    (point[0] - ends[0][0]) * -frame.uy + (point[1] - ends[0][1]) * frame.ux;\n  const holders = scene.rooms\n    .map((room) => ({ room, side: roomSide(scene, room, wall) }))\n    .filter((holder) => holder.side !== null);\n  const chosen =\n    holders.find((holder) => (holder.side ?? 0) * across > 0) ?? holders[0];\n  if (!chosen) {\n    return null;\n  }\n  const centre = t * frame.length;\n  const offset = Math.round(\n    Math.max(0, Math.min(frame.length - length, centre - length / 2)),\n  );\n  return { wall, room: chosen.room, offset };\n}\n\nfunction inside(point: Point, polygon: readonly Point[]): boolean {\n  let within = false;\n  polygon.forEach((a, index) => {\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    if (\n      a[1] > point[1] !== b[1] > point[1] &&\n      point[0] < ((b[0] - a[0]) * (point[1] - a[1])) / (b[1] - a[1]) + a[0]\n    ) {\n      within = !within;\n    }\n  });\n  return within;\n}\n\n/** The smallest room the point is in, so one inside another wins. */\nexport function roomAt(scene: Scene, point: Point): Room | null {\n  let best: { room: Room; area: number } | null = null;\n  for (const room of scene.rooms) {\n    const polygon = polygonOf(scene, room);\n    if (!inside(point, polygon)) {\n      continue;\n    }\n    const area = polygonArea(polygon);\n    if (best === null || area < best.area) {\n      best = { room, area };\n    }\n  }\n  return best?.room ?? null;\n}\n\n/** Drop emitters whose room is gone, or whose wall is gone, no longer\n * borders the room or is now too short, and clamp the rest onto their wall.\n * Called after every scene mutation. */\nexport function normalizeEmitters(scene: Scene): void {\n  const rooms = new Map(scene.rooms.map((room) => [room.id, room]));\n  const walls = new Map(scene.walls.map((wall) => [wall.id, wall]));\n  scene.emitters = scene.emitters.filter((emitter) => {\n    const room = rooms.get(emitter.room);\n    if (!room) {\n      return false;\n    }\n    if (emitter.kind === \"underfloor\") {\n      return true;\n    }\n    const wall = walls.get(emitter.wall);\n    const ends = wall ? wallEnds(scene, wall) : null;\n    if (!wall || !ends || !holdsWall(room, wall)) {\n      return false;\n    }\n    const length = wallFrame(ends[0], ends[1]).length;\n    if (emitter.length > length) {\n      return false;\n    }\n    emitter.offset = Math.round(\n      Math.max(0, Math.min(length - emitter.length, emitter.offset)),\n    );\n    return true;\n  });\n}\n", "// What a heat pump costs beyond its unit: a cylinder, bigger emitters in rooms\n// that fall short, and a fixed allowance for enabling work.\n\nimport { roomCover } from \"./emitters\";\nimport type { Emitter } from \"./scene\";\nimport type { PlacedFixture } from \"./fixtures\";\n\n/** Pence for each part of a heat pump install; mirrors HEAT_PUMP_EXTRAS. */\nexport interface HeatPumpExtras {\n  cylinder: number;\n  cylinder_min_l: number;\n  emitter_room: number;\n  enabling: number;\n}\n\n/** What the house has now that decides which extras apply. */\nexport interface HeatPumpSite {\n  /** The largest cylinder there, litres, or null with none. */\n  cylinderLitres: number | null;\n  /** False when nothing says whether there's a cylinder: none is a guess. */\n  cylinderKnown: boolean;\n  /** Rooms whose emitters fall short at the design flow temperature. */\n  shortRooms: number;\n}\n\n/** Without a scene to read: no cylinder, and no shortfall known. */\nexport const UNKNOWN_SITE: HeatPumpSite = {\n  cylinderLitres: null,\n  cylinderKnown: false,\n  shortRooms: 0,\n};\n\nexport interface CostLine {\n  label: string;\n  pence: number;\n}\n\n/**\n * The house's recorded hot water cylinder (RdSAP or the baseline's answers):\n * litres, 0 for none, or null when nothing is recorded.\n */\nexport function recordedCylinder(\n  worksheet: Readonly<Record<string, unknown>>,\n): number | null {\n  const given = worksheet[\"water_storage_volume_47\"];\n  const litres =\n    typeof given === \"object\" && given !== null\n      ? (given as Record<string, unknown>)[\"value\"]\n      : given;\n  return typeof litres === \"number\" && Number.isFinite(litres) ? litres : null;\n}\n\nconst litresOf = (fixtures: readonly PlacedFixture[]): number[] =>\n  fixtures\n    .filter(({ fixture }) => fixture.kind === \"cylinder\")\n    .map(({ fixture }) => Number(fixture.props?.[\"volume_l\"] ?? 0));\n\n/**\n * The site for a scenario. Where cylinders are drawn (in the baseline, or added\n * by the scenario) the scenario's own decide, so removing the only one means\n * a new cylinder; where none is drawn, the house's recorded answer does.\n */\nexport function siteOf(\n  baseline: readonly PlacedFixture[],\n  scenario: readonly PlacedFixture[],\n  recorded: number | null,\n  emitters: readonly Emitter[],\n  rooms: readonly {\n    id: string;\n    areaM2: number;\n    internalC: number;\n    type: string;\n    designW: number;\n  }[],\n  flowC: number,\n): HeatPumpSite {\n  const drawn = litresOf(scenario);\n  const shortRooms = rooms.filter(\n    (room) => roomCover(emitters, room, flowC)?.short === true,\n  ).length;\n  if (drawn.length > 0) {\n    return {\n      cylinderLitres: Math.max(...drawn),\n      cylinderKnown: true,\n      shortRooms,\n    };\n  }\n  if (litresOf(baseline).length > 0 || recorded !== null) {\n    const litres = litresOf(baseline).length > 0 ? 0 : recorded;\n    return {\n      cylinderLitres: litres === 0 || litres === null ? null : litres,\n      cylinderKnown: true,\n      shortRooms,\n    };\n  }\n  return { cylinderLitres: null, cylinderKnown: false, shortRooms };\n}\n\n/** The extras a heat pump needs on `site`, as lines; unit not included. */\nexport function extraLines(\n  extras: HeatPumpExtras,\n  site: HeatPumpSite,\n): CostLine[] {\n  const lines: CostLine[] = [];\n  if (site.cylinderLitres === null) {\n    lines.push({\n      label: site.cylinderKnown ? \"New cylinder\" : \"Cylinder (none recorded)\",\n      pence: extras.cylinder,\n    });\n  } else if (site.cylinderLitres < extras.cylinder_min_l) {\n    lines.push({\n      label: `New cylinder (${site.cylinderLitres} L is too small)`,\n      pence: extras.cylinder,\n    });\n  }\n  if (site.shortRooms > 0) {\n    lines.push({\n      label: `Emitters in ${site.shortRooms} ${site.shortRooms === 1 ? \"room\" : \"rooms\"}`,\n      pence: site.shortRooms * extras.emitter_room,\n    });\n  }\n  lines.push({ label: \"Enabling work\", pence: extras.enabling });\n  return lines;\n}\n", "// A room's ceiling shape: flat, sloped, or a room in the roof. Heights are mm and\n// vary linearly across the room along the direction the ceiling falls. A sloped\n// ceiling is low on the side it falls to and high on the other; with a ridge it\n// is low on both sides and high down the middle. A room in the roof is that\n// double pitch, its low edge the knee wall. Ported from `apps/design/ceiling.py`.\n\nimport type { Room } from \"./scene\";\n\ntype Point = [number, number];\ntype Pt = readonly [number, number];\n\nexport interface Ceiling {\n  shape: \"sloped\" | \"roof_room\";\n  low: number;\n  high: number;\n  /** Degrees from +x in the plan, towards the low side. */\n  fall: number;\n  ridge: boolean;\n}\n\ntype Shaped = Pick<\n  Room,\n  \"ceiling\" | \"ceiling_low\" | \"ceiling_high\" | \"ceiling_fall\" | \"ceiling_ridge\"\n>;\n\n/** The room's `Ceiling`, or null where it is flat (or a height is missing). */\nexport function ceilingOf(room: Shaped): Ceiling | null {\n  const { ceiling: shape, ceiling_low: low, ceiling_high: high } = room;\n  if (shape !== \"sloped\" && shape !== \"roof_room\") {\n    return null;\n  }\n  if (!low || !high || low <= 0 || high <= 0) {\n    return null;\n  }\n  return {\n    shape,\n    low,\n    high,\n    fall: room.ceiling_fall ?? 0,\n    ridge: shape === \"roof_room\" || room.ceiling_ridge === true,\n  };\n}\n\ntype Flagged = [number, number, number];\n\n/** The part of the polygon below (or above) the ridge, where t = 0. */\nfunction clip(polygon: Flagged[], below: boolean): Flagged[] {\n  const kept: Flagged[] = [];\n  const inside = (p: Flagged) => (below ? p[2] <= 0 : p[2] >= 0);\n  polygon.forEach((current, index) => {\n    const previous = polygon[(index + polygon.length - 1) % polygon.length];\n    if (!previous) {\n      return;\n    }\n    if (inside(current) !== inside(previous)) {\n      const span = current[2] - previous[2];\n      const along = span ? -previous[2] / span : 0;\n      kept.push([\n        previous[0] + (current[0] - previous[0]) * along,\n        previous[1] + (current[1] - previous[1]) * along,\n        0,\n      ]);\n    }\n    if (inside(current)) {\n      kept.push(current);\n    }\n  });\n  return kept;\n}\n\n/** Height at any point, and what follows from it, for one room's polygon. */\nexport class Profile {\n  private readonly d: Point;\n  private readonly tMin: number;\n  private readonly tMax: number;\n  private readonly extent: number;\n\n  constructor(\n    private readonly polygon: readonly Pt[],\n    readonly ceiling: Ceiling,\n  ) {\n    const radians = (ceiling.fall * Math.PI) / 180;\n    this.d = [Math.cos(radians), Math.sin(radians)];\n    const ts = polygon.map((point) => this.t(point));\n    this.tMin = Math.min(...ts);\n    this.tMax = Math.max(...ts);\n    this.extent = this.tMax - this.tMin;\n  }\n\n  private t(point: Pt): number {\n    return point[0] * this.d[0] + point[1] * this.d[1];\n  }\n\n  private get middle(): number {\n    return (this.tMin + this.tMax) / 2;\n  }\n\n  heightAt(point: Pt): number {\n    const { low, high, ridge } = this.ceiling;\n    if (this.extent <= 0) {\n      return low;\n    }\n    const t = Math.min(Math.max(this.t(point), this.tMin), this.tMax);\n    if (ridge) {\n      const across = Math.abs(t - this.middle) / (this.extent / 2);\n      return high - (high - low) * across;\n    }\n    return low + ((high - low) * (this.tMax - t)) / this.extent;\n  }\n\n  /** The sloping surface's area over its plan area. */\n  get roofFactor(): number {\n    const { low, high, ridge } = this.ceiling;\n    if (this.extent <= 0) {\n      return 1;\n    }\n    const run = ridge ? this.extent / 2 : this.extent;\n    return Math.sqrt(1 + ((high - low) / run) ** 2);\n  }\n\n  /** The polygon cut where the height stops being linear: at the ridge. */\n  pieces(): Point[][] {\n    const flagged: Flagged[] = this.polygon.map((point) => [\n      point[0],\n      point[1],\n      this.t(point) - this.middle,\n    ]);\n    if (!this.ceiling.ridge) {\n      return [this.polygon.map((point) => [point[0], point[1]] as Point)];\n    }\n    return [true, false].map((below) =>\n      clip(flagged, below).map((p) => [p[0], p[1]] as Point),\n    );\n  }\n\n  /** Volume over plan area, so a storey's one height keeps its volume. */\n  meanHeight(): number {\n    let totalArea = 0;\n    let volume = 0;\n    for (const piece of this.pieces()) {\n      if (piece.length < 3) {\n        continue;\n      }\n      let doubled = 0;\n      let cx = 0;\n      let cy = 0;\n      piece.forEach((a, index) => {\n        const b = piece[(index + 1) % piece.length] as Point;\n        const cross = a[0] * b[1] - b[0] * a[1];\n        doubled += cross;\n        cx += (a[0] + b[0]) * cross;\n        cy += (a[1] + b[1]) * cross;\n      });\n      if (doubled === 0) {\n        continue;\n      }\n      const area = Math.abs(doubled) / 2;\n      totalArea += area;\n      volume += area * this.heightAt([cx / (3 * doubled), cy / (3 * doubled)]);\n    }\n    return totalArea ? volume / totalArea : this.ceiling.low;\n  }\n\n  /** Points along `a` to `b` where its height changes slope: the ends, and the ridge. */\n  edgeStops(a: Pt, b: Pt): Point[] {\n    const stops: Point[] = [[a[0], a[1]]];\n    if (this.ceiling.ridge) {\n      const ta = this.t(a);\n      const tb = this.t(b);\n      const atRidge = ta === tb ? 0 : (this.middle - ta) / (tb - ta);\n      if (atRidge > 0 && atRidge < 1) {\n        stops.push([\n          a[0] + (b[0] - a[0]) * atRidge,\n          a[1] + (b[1] - a[1]) * atRidge,\n        ]);\n      }\n    }\n    stops.push([b[0], b[1]]);\n    return stops;\n  }\n\n  /** Area of a wall from `a` to `b`, its height following the ceiling. */\n  wallArea(a: Pt, b: Pt): number {\n    const stops = this.edgeStops(a, b);\n    let total = 0;\n    stops.forEach((from, index) => {\n      const to = stops[index + 1];\n      if (to) {\n        const length = Math.hypot(to[0] - from[0], to[1] - from[1]);\n        total += (length * (this.heightAt(from) + this.heightAt(to))) / 2;\n      }\n    });\n    return total;\n  }\n}\n\nexport function profileOf(\n  polygon: readonly Pt[],\n  ceiling: Ceiling | null,\n): Profile | null {\n  return ceiling && polygon.length >= 3 ? new Profile(polygon, ceiling) : null;\n}\n\n/** A resolved room's height for volume: the mean if sloped, else its own. */\nexport function volumeHeightMm(room: {\n  polygon: readonly Pt[];\n  ceiling: Ceiling | null;\n  ceilingHeight: number | null;\n}): number | null {\n  return (\n    profileOf(room.polygon, room.ceiling)?.meanHeight() ?? room.ceilingHeight\n  );\n}\n", "// Plane geometry for the heat load: rooms are drawn on wall centrelines, but\n// BS EN 12831-1 (and the DHDG) measure to the internal faces, and floors and\n// ceilings belong to whatever is above or below them.\n\nexport type Point = readonly [number, number];\n\nfunction signedArea(polygon: readonly Point[]): number {\n  let doubled = 0;\n  for (let i = 0; i < polygon.length; i++) {\n    const a = polygon[i] as Point;\n    const b = polygon[(i + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  }\n  return doubled / 2;\n}\n\nexport function area(polygon: readonly Point[]): number {\n  return Math.abs(signedArea(polygon));\n}\n\nfunction lineIntersection(\n  p: Point,\n  d: Point,\n  q: Point,\n  e: Point,\n): Point | null {\n  const cross = d[0] * e[1] - d[1] * e[0];\n  if (Math.abs(cross) < 1e-9 * Math.hypot(...d) * Math.hypot(...e)) {\n    return null;\n  }\n  const t = ((q[0] - p[0]) * e[1] - (q[1] - p[1]) * e[0]) / cross;\n  return [p[0] + t * d[0], p[1] + t * d[1]];\n}\n\n/**\n * How far a corner between nearly collinear edges may move, in their larger\n * offset. Further, their offset lines meet far away along the wall.\n */\nconst MITRE_LIMIT = 4;\n\n/**\n * The polygon with each edge moved inwards by its own distance: edge `i` runs\n * from point `i` to point `i + 1`. Collinear neighbours with different offsets\n * meet halfway, which a drawn plan never makes visible; so do nearly collinear\n * ones, a millimetre's drift along a wall. A sharp corner keeps its mitre,\n * however far that is.\n */\nexport function inset(\n  polygon: readonly Point[],\n  offsets: readonly number[],\n): Point[] {\n  const count = polygon.length;\n  if (count < 3) {\n    return [...polygon];\n  }\n  // Inward is left of travel for a clockwise ring in y-down space.\n  const sign = signedArea(polygon) > 0 ? 1 : -1;\n  const lines = polygon.map((a, i) => {\n    const b = polygon[(i + 1) % count] as Point;\n    const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n    const direction: Point = [(b[0] - a[0]) / length, (b[1] - a[1]) / length];\n    const normal: Point = [-direction[1] * sign, direction[0] * sign];\n    const offset = offsets[i] ?? 0;\n    const start: Point = [a[0] + normal[0] * offset, a[1] + normal[1] * offset];\n    return { start, direction, normal, offset };\n  });\n  return polygon.map((corner, i) => {\n    const before = lines[(i - 1 + count) % count] as (typeof lines)[number];\n    const after = lines[i] as (typeof lines)[number];\n    const met = lineIntersection(\n      before.start,\n      before.direction,\n      after.start,\n      after.direction,\n    );\n    const turn =\n      before.direction[0] * after.direction[0] +\n      before.direction[1] * after.direction[1];\n    const reach = MITRE_LIMIT * Math.max(before.offset, after.offset);\n    if (\n      met &&\n      (turn <= 0 || Math.hypot(met[0] - corner[0], met[1] - corner[1]) <= reach)\n    ) {\n      return met;\n    }\n    const offset = (before.offset + after.offset) / 2;\n    return [\n      corner[0] + after.normal[0] * offset,\n      corner[1] + after.normal[1] * offset,\n    ];\n  });\n}\n\nfunction isConvexCorner(a: Point, b: Point, c: Point, sign: number): boolean {\n  return (\n    ((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0])) * sign > 0\n  );\n}\n\nfunction inTriangle(p: Point, a: Point, b: Point, c: Point): boolean {\n  const d1 = (p[0] - b[0]) * (a[1] - b[1]) - (a[0] - b[0]) * (p[1] - b[1]);\n  const d2 = (p[0] - c[0]) * (b[1] - c[1]) - (b[0] - c[0]) * (p[1] - c[1]);\n  const d3 = (p[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (p[1] - a[1]);\n  const negative = d1 < 0 || d2 < 0 || d3 < 0;\n  const positive = d1 > 0 || d2 > 0 || d3 > 0;\n  return !(negative && positive);\n}\n\n/** Ear-clipped triangles of a simple polygon. */\nexport function triangulate(\n  polygon: readonly Point[],\n): [Point, Point, Point][] {\n  const ring = polygon.filter((point, i) => {\n    const next = polygon[(i + 1) % polygon.length] as Point;\n    return point[0] !== next[0] || point[1] !== next[1];\n  });\n  const sign = signedArea(ring) > 0 ? 1 : -1;\n  const indexes = ring.map((_point, i) => i);\n  const triangles: [Point, Point, Point][] = [];\n  let guard = indexes.length * indexes.length;\n  while (indexes.length > 3 && guard-- > 0) {\n    let clipped = false;\n    for (let i = 0; i < indexes.length; i++) {\n      const a = ring[\n        indexes[(i - 1 + indexes.length) % indexes.length] as number\n      ] as Point;\n      const b = ring[indexes[i] as number] as Point;\n      const c = ring[indexes[(i + 1) % indexes.length] as number] as Point;\n      if (!isConvexCorner(a, b, c, sign)) {\n        continue;\n      }\n      const blocked = indexes.some((index) => {\n        const p = ring[index] as Point;\n        if (p === a || p === b || p === c) {\n          return false;\n        }\n        return inTriangle(p, a, b, c);\n      });\n      if (blocked) {\n        continue;\n      }\n      triangles.push([a, b, c]);\n      indexes.splice(i, 1);\n      clipped = true;\n      break;\n    }\n    if (!clipped) {\n      // Collinear or self-touching leftovers: fan what remains.\n      break;\n    }\n  }\n  for (let i = 1; i + 1 < indexes.length; i++) {\n    triangles.push([\n      ring[indexes[0] as number] as Point,\n      ring[indexes[i] as number] as Point,\n      ring[indexes[i + 1] as number] as Point,\n    ]);\n  }\n  return triangles;\n}\n\n/** Sutherland\u2013Hodgman: `subject` clipped by a convex `clip`. */\nfunction clipConvex(\n  subject: readonly Point[],\n  clip: readonly Point[],\n): Point[] {\n  const sign = signedArea(clip) > 0 ? 1 : -1;\n  let output: Point[] = [...subject];\n  for (let i = 0; i < clip.length && output.length > 0; i++) {\n    const a = clip[i] as Point;\n    const b = clip[(i + 1) % clip.length] as Point;\n    const inside = (p: Point) =>\n      ((b[0] - a[0]) * (p[1] - a[1]) - (b[1] - a[1]) * (p[0] - a[0])) * sign >=\n      0;\n    const input = output;\n    output = [];\n    for (let j = 0; j < input.length; j++) {\n      const current = input[j] as Point;\n      const previous = input[(j - 1 + input.length) % input.length] as Point;\n      const crossing = (): Point => {\n        const met = lineIntersection(\n          previous,\n          [current[0] - previous[0], current[1] - previous[1]],\n          a,\n          [b[0] - a[0], b[1] - a[1]],\n        );\n        return met ?? current;\n      };\n      if (inside(current)) {\n        if (!inside(previous)) {\n          output.push(crossing());\n        }\n        output.push(current);\n      } else if (inside(previous)) {\n        output.push(crossing());\n      }\n    }\n  }\n  return output;\n}\n\n/** The area two simple polygons share. */\nexport function overlap(one: readonly Point[], two: readonly Point[]): number {\n  if (one.length < 3 || two.length < 3) {\n    return 0;\n  }\n  let total = 0;\n  for (const triangle of triangulate(two)) {\n    total += area(clipConvex(one, triangle));\n  }\n  return total;\n}\n\nexport function length(a: Point, b: Point): number {\n  return Math.hypot(b[0] - a[0], b[1] - a[1]);\n}\n", "// What the plan holds besides walls, openings, rooms and emitters: chimney\n// breasts, which hang off a wall into a room, and the areas a proposal builds\n// new. Pure.\n\nimport { overlap } from \"../heatload/geometry\";\nimport { holdsWall, roomSide } from \"./emitters\";\nimport { pointAlong, wallFrame } from \"./openings\";\nimport { polygonArea } from \"./geometry\";\nimport type { ChimneyBreast, NewBuild, Point, Room, Scene } from \"./scene\";\nimport { polygonOf, wallEnds } from \"./topology\";\n\n/** A new-build area with less room on it than this, mm\u00B2, has nothing on it. */\nconst SOME_FLOOR_MM2 = 10_000;\n\nexport function breasts(scene: Scene): ChimneyBreast[] {\n  return (scene.features ?? []).filter(\n    (feature): feature is ChimneyBreast => feature.kind === \"chimney_breast\",\n  );\n}\n\nexport function newBuilds(scene: Scene): NewBuild[] {\n  return (scene.features ?? []).filter(\n    (feature): feature is NewBuild => feature.kind === \"new_build\",\n  );\n}\n\n/** The breast's footprint to centrelines, as the room's polygon is measured:\n * from its wall's line `depth` into the room. Null once it's lost its wall. */\nexport function breastOutline(\n  scene: Scene,\n  breast: ChimneyBreast,\n): Point[] | null {\n  const wall = scene.walls.find((candidate) => candidate.id === breast.wall);\n  const room = scene.rooms.find((candidate) => candidate.id === breast.room);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  const side = wall && room ? roomSide(scene, room, wall) : null;\n  if (!ends || side === null) {\n    return null;\n  }\n  const frame = wallFrame(ends[0], ends[1]);\n  const inward: Point = [-frame.uy * side, frame.ux * side];\n  const from = pointAlong(ends[0], ends[1], breast.offset);\n  const to = pointAlong(ends[0], ends[1], breast.offset + breast.length);\n  const into = (point: Point): Point => [\n    point[0] + inward[0] * breast.depth,\n    point[1] + inward[1] * breast.depth,\n  ];\n  return [from, to, into(to), into(from)];\n}\n\n/** The breast's masonry as it stands in the room: from the wall's line to the\n * breast's face, as wide as its returns' faces. What the plan, 3D and the\n * drawing sheets draw, joined to the wall it stands on. */\nexport function breastBlock(\n  scene: Scene,\n  breast: ChimneyBreast,\n): Point[] | null {\n  const wall = scene.walls.find((candidate) => candidate.id === breast.wall);\n  const outline = breastOutline(scene, breast);\n  if (!wall || !outline) {\n    return null;\n  }\n  const [from, to, toIn, fromIn] = outline as [Point, Point, Point, Point];\n  const half = wall.thickness / 2;\n  const along = unit([to[0] - from[0], to[1] - from[1]]);\n  const inward = unit([fromIn[0] - from[0], fromIn[1] - from[1]]);\n  const shift = (point: Point, a: number, i: number): Point => [\n    point[0] + along[0] * a + inward[0] * i,\n    point[1] + along[1] * a + inward[1] * i,\n  ];\n  return [\n    shift(from, -half, 0),\n    shift(to, half, 0),\n    shift(toIn, half, half),\n    shift(fromIn, -half, half),\n  ];\n}\n\nfunction unit([x, y]: Point): Point {\n  const length = Math.hypot(x, y) || 1;\n  return [x / length, y / length];\n}\n\n/** The room's floor, mm\u00B2, less its breasts: what the room panel shows. */\nexport function roomAreaMm2(scene: Scene, room: Room): number {\n  return (\n    Math.abs(polygonArea(polygonOf(scene, room))) -\n    breastAreaMm2(scene, room.id)\n  );\n}\n\n/** The floor the room's breasts take, mm\u00B2, measured as its polygon is. */\nexport function breastAreaMm2(scene: Scene, roomId: string): number {\n  return breasts(scene)\n    .filter((breast) => breast.room === roomId)\n    .reduce((total, breast) => total + breast.length * breast.depth, 0);\n}\n\n/** The floor the room's breasts take inside its walls' faces, mm\u00B2: each is as\n * wide again as its wall is thick, the returns' faces standing that far out. */\nexport function innerBreastAreaMm2(scene: Scene, roomId: string): number {\n  return breasts(scene)\n    .filter((breast) => breast.room === roomId)\n    .reduce((total, breast) => {\n      const wall = scene.walls.find((each) => each.id === breast.wall);\n      return total + (breast.length + (wall?.thickness ?? 0)) * breast.depth;\n    }, 0);\n}\n\n/** Drop breasts whose room or wall is gone or no longer meet, and new-build\n * areas no room stands on any more; keep the rest of the breasts on their\n * wall. Called after every scene mutation, as emitters are. */\nexport function normalizeFeatures(scene: Scene): void {\n  if (!scene.features) {\n    return;\n  }\n  const rooms = new Map(scene.rooms.map((room) => [room.id, room]));\n  const walls = new Map(scene.walls.map((wall) => [wall.id, wall]));\n  const outlines = scene.rooms.map((room) => polygonOf(scene, room));\n  scene.features = scene.features.filter((feature) => {\n    if (feature.kind === \"new_build\") {\n      // Once the extension's gone, a room drawn there later isn't new-built.\n      return outlines.some(\n        (outline) => overlap(outline, feature.polygon) >= SOME_FLOOR_MM2,\n      );\n    }\n    const room = rooms.get(feature.room);\n    const wall = walls.get(feature.wall);\n    const ends = wall ? wallEnds(scene, wall) : null;\n    if (!room || !wall || !ends || !holdsWall(room, wall)) {\n      return false;\n    }\n    const length = Math.floor(wallFrame(ends[0], ends[1]).length);\n    feature.length = Math.max(1, Math.min(feature.length, length));\n    feature.offset = Math.round(\n      Math.max(0, Math.min(feature.offset, length - feature.length)),\n    );\n    return true;\n  });\n}\n", "// What a proposal builds new over and under: an extension's floor and roof\n// are built to today's regulations, not the house's, and retrofit measures\n// leave them out. Pure, but for the fabric types the editor makes.\n\nimport { overlap, type Point as Corner } from \"../heatload/geometry\";\nimport { newBuilds } from \"./features\";\nimport { newId } from \"./ids\";\nimport type { FabricType, NewBuild, Point, Scene } from \"./scene\";\n\n/** Approved Document L 2021's limiting U-values for an extension: 0.18 for a\n * floor and a flat roof. SAP reads the construction, the room-by-room heat\n * load the stated U-value, as with the extension's walls. */\nexport const NEW_BUILD_FLOOR = {\n  element: \"FLOOR\",\n  name: \"New build floor (2023 on)\",\n  spec: {\n    construction: \"SOLID_SLAB\",\n    insulation_thickness_mm: 150,\n    uvalue: 0.18,\n  },\n} as const;\n\nexport const NEW_BUILD_ROOF = {\n  element: \"ROOF\",\n  name: \"New build flat roof (2023 on)\",\n  spec: {\n    insulation_kind: \"JOISTS\",\n    insulation_thickness_mm: 250,\n    room_in_roof: false,\n    uvalue: 0.18,\n  },\n} as const;\n\nexport function newBuildType(\n  types: readonly FabricType[],\n  made: typeof NEW_BUILD_FLOOR | typeof NEW_BUILD_ROOF,\n): FabricType | null {\n  return (\n    types.find(\n      (type) => type.element === made.element && type.name === made.name,\n    ) ?? null\n  );\n}\n\n/** Mark where a proposal builds new, so its floor and roof take their own. */\nexport function markNewBuild(\n  scene: Scene,\n  polygon: readonly Point[],\n  floor: number | null,\n  roof: number | null,\n): void {\n  if (polygon.length < 3) {\n    return;\n  }\n  scene.features = [\n    ...(scene.features ?? []),\n    {\n      id: newId(\"f\"),\n      kind: \"new_build\",\n      polygon: polygon.map(([x, y]) => [Math.round(x), Math.round(y)]),\n      floor,\n      roof,\n    },\n  ];\n}\n\n/** How much of `outline` each new-build area covers, mm\u00B2, largest first. */\nexport function newBuildParts(\n  scene: Scene,\n  outline: readonly Corner[],\n): { area: NewBuild; mm2: number }[] {\n  return newBuilds(scene)\n    .map((area) => ({ area, mm2: overlap(outline, area.polygon) }))\n    .filter(({ mm2 }) => mm2 > 0)\n    .sort((one, two) => two.mm2 - one.mm2);\n}\n\n/** The new-build area a point lies in or on, if any: an extension's own walls\n * run round its edge. */\nexport function newBuildAt(\n  scene: Scene,\n  point: Point,\n  slack = 10,\n): NewBuild | undefined {\n  return newBuilds(scene).find(\n    ({ polygon }) => overlap(square(point, slack), polygon) > 0,\n  );\n}\n\nfunction square([x, y]: Point, half: number): Point[] {\n  return [\n    [x - half, y - half],\n    [x + half, y - half],\n    [x + half, y + half],\n    [x - half, y + half],\n  ];\n}\n", "// Which way a window faces, ported from `apps/design/orientation.py`.\n// `north_deg` is where north points on the plan, clockwise from the plan's up.\n\nimport type { Point } from \"./scene\";\n\n/** RdSAP's eight points, clockwise from north. */\nexport const POINTS = [\n  \"NORTH\",\n  \"NORTH_EAST\",\n  \"EAST\",\n  \"SOUTH_EAST\",\n  \"SOUTH\",\n  \"SOUTH_WEST\",\n  \"WEST\",\n  \"NORTH_WEST\",\n] as const;\n\n/** Until north is set. RdSAP has no unknown, and west is the precedent. */\nexport const UNKNOWN = \"WEST\";\n\nconst PROBE_MM = 10;\n\n/** Even-odd: whether `point` lies inside `polygon`. */\nexport function contains(polygon: readonly Point[], [x, y]: Point): boolean {\n  let inside = false;\n  polygon.forEach(([ax, ay], index) => {\n    const [bx, by] = polygon[(index + 1) % polygon.length] as Point;\n    if (ay > y !== by > y && x < ax + ((y - ay) * (bx - ax)) / (by - ay)) {\n      inside = !inside;\n    }\n  });\n  return inside;\n}\n\n/** The way the wall a\u2192b faces, away from the `inside` polygons: \u00B0 clockwise\n * from the plan's up, or null for a wall of no length. */\nexport function outwardDeg(\n  a: Point,\n  b: Point,\n  inside: readonly (readonly Point[])[],\n): number | null {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]);\n  if (length === 0) {\n    return null;\n  }\n  let nx = -(b[1] - a[1]) / length;\n  let ny = (b[0] - a[0]) / length;\n  const probe: Point = [\n    (a[0] + b[0]) / 2 + nx * PROBE_MM,\n    (a[1] + b[1]) / 2 + ny * PROBE_MM,\n  ];\n  if (inside.some((polygon) => contains(polygon, probe))) {\n    nx = -nx;\n    ny = -ny;\n  }\n  // The plan is y-down, so its up is -y.\n  const degrees = (Math.atan2(nx, -ny) * 180) / Math.PI;\n  return ((degrees % 360) + 360) % 360;\n}\n\n/** The point a window in the wall a\u2192b faces, away from the `inside` polygons. */\nexport function facing(\n  a: Point,\n  b: Point,\n  inside: readonly (readonly Point[])[],\n  northDeg: number | null,\n): string {\n  const outward = outwardDeg(a, b, inside);\n  if (northDeg === null || outward === null) {\n    return UNKNOWN;\n  }\n  const turned = (((outward - northDeg) % 360) + 360) % 360;\n  return POINTS[Math.floor(turned / 45 + 0.5) % POINTS.length] as string;\n}\n", "// Design -> RdSAP building elements, ported from `apps/design/twin_bridge.py`.\n// Wall areas are gross: the SAP worksheet subtracts the openings itself.\n\nimport { profileOf, volumeHeightMm } from \"./ceiling\";\nimport { newBuildAt, newBuildParts } from \"./newbuild\";\nimport { facing } from \"./orientation\";\nimport { type Room as ResolvedRoom, resolve as resolveScene } from \"./resolve\";\nimport type { FabricType, Point, Scene } from \"./scene\";\n\nexport type { FabricType, Opening, Scene, Wall } from \"./scene\";\n\nexport type Element = Record<string, unknown>;\n\n/** A scene entity's share of an element: a wall, an opening, or a room's floor or roof. */\nexport interface Part {\n  /** `<floor>:<entity id>`: ids are numbered per floor, so every floor has a `w_0001`. */\n  id: string;\n  areaMm2: number;\n  /** A wall's windows and doors. */\n  openingsMm2: number;\n}\n\nexport interface Bridged {\n  elements: Element[];\n  /** Parallel to `elements`: what produced each one. */\n  keys: string[];\n  /**\n   * Parallel to `elements`: the entities that make each one up, adding to its\n   * area. Empty where no measure can be targeted (party walls, new-build).\n   */\n  parts: Part[][];\n  summary: Record<string, unknown>;\n}\n\nexport class BridgeError extends Error {}\n\nconst MM_PER_M = 1000;\nconst MM2_PER_M2 = 1_000_000;\n\n/** As Python's `f\"{x:.2f}\"`. */\nfunction metres2(areaMm2: number): string {\n  return (areaMm2 / MM2_PER_M2).toFixed(2);\n}\n\nfunction text(\n  spec: Record<string, unknown>,\n  key: string,\n  fallback: string,\n): string {\n  const value = spec[key];\n  return typeof value === \"string\" && value !== \"\" ? value : fallback;\n}\n\nfunction nested(\n  spec: Record<string, unknown>,\n  key: string,\n): Record<string, unknown> {\n  const value = spec[key];\n  return typeof value === \"object\" && value !== null\n    ? (value as Record<string, unknown>)\n    : {};\n}\n\n/** The fabric type an entity references, or the default for its kind. */\nexport function resolve(\n  types: readonly FabricType[],\n  element: string,\n  reference: number | null | undefined,\n): FabricType | undefined {\n  if (reference !== null && reference !== undefined) {\n    const referenced = types.find(\n      (type) => type.id === reference && type.element === element,\n    );\n    if (referenced) {\n      return referenced;\n    }\n  }\n\n  return types.find((type) => type.element === element && type.is_default);\n}\n\n/** The shoelace area of a room polygon, mm\u00B2. */\nexport function polygonAreaMm2(polygon: readonly [number, number][]): number {\n  let total = 0;\n\n  for (let index = 0; index < polygon.length; index += 1) {\n    const here = polygon[index];\n    const next = polygon[(index + 1) % polygon.length];\n    if (here && next) {\n      total += here[0] * next[1] - next[0] * here[1];\n    }\n  }\n\n  return Math.abs(total) / 2;\n}\n\n/** Weighted by floor area, so the storey's volume stays exact. */\nexport function storeyHeightMm(\n  rooms: readonly {\n    polygon: readonly [number, number][];\n    /** mm\u00B2, where it isn't the polygon's: less a chimney breast. */\n    areaMm2?: number;\n    ceiling_height: number | null;\n  }[],\n  defaultMm: number,\n): number {\n  let totalArea = 0;\n  let weighted = 0;\n\n  for (const room of rooms) {\n    const area = room.areaMm2 ?? polygonAreaMm2(room.polygon);\n    totalArea += area;\n    weighted += area * (room.ceiling_height || defaultMm);\n  }\n\n  return totalArea > 0 ? weighted / totalArea : defaultMm;\n}\n\n/** A wall's gross area: its length by the storey's height, or, along a sloped\n * ceiling, the height following the slope. */\nfunction wallMm2(\n  wall: { a: Point; b: Point; lengthMm: number; rooms: readonly string[] },\n  rooms: readonly ResolvedRoom[],\n  storeyMm: number,\n): number {\n  for (const id of wall.rooms) {\n    const room = rooms.find((candidate) => candidate.id === id);\n    const shaped = room?.heated ? profileOf(room.polygon, room.ceiling) : null;\n    if (shaped) {\n      return shaped.wallArea(wall.a, wall.b);\n    }\n  }\n  return wall.lengthMm * storeyMm;\n}\n\nfunction wallElement(\n  type: FabricType,\n  areaMm2: number,\n  openingsMm2: number,\n  thicknessMm: number | null,\n): Element {\n  const insulation = nested(type.spec, \"insulation\");\n  // RdSAP has no uninsulated wall: score one as an as-built band E wall.\n  const uninsulated = text(insulation, \"kind\", \"AS_BUILT\") === \"NONE\";\n  const age = text(type.spec, \"age\", \"D\");\n\n  const raw = type.spec[\"uvalue\"];\n  const measured = typeof raw === \"number\" && raw > 0 ? raw : null;\n  return {\n    tag: \"EXTERNAL_WALL\",\n    ...(measured ? { uvalue: String(measured) } : {}),\n    age: uninsulated && age > \"E\" ? \"E\" : age,\n    construction: text(type.spec, \"construction\", \"UNFILLED_CAVITY\"),\n    thickness: thicknessMm,\n    area: metres2(areaMm2),\n    openings: metres2(openingsMm2),\n    insulation: {\n      kind: uninsulated ? \"AS_BUILT\" : text(insulation, \"kind\", \"AS_BUILT\"),\n      thickness: insulation[\"thickness_mm\"] ?? null,\n    },\n  };\n}\n\nfunction builtOf<T extends { type: FabricType; mm2: number }>(\n  map: Map<number, T>,\n  type: FabricType,\n): T {\n  let built = map.get(type.id);\n  if (!built) {\n    built = { type, mm2: 0, perimeterMm: 0 } as unknown as T;\n    map.set(type.id, built);\n  }\n  return built;\n}\n\ninterface WallGroup {\n  type: FabricType;\n  areaMm2: number;\n  openingsMm2: number;\n  thicknessAreas: Map<number, number>;\n  parts: Part[];\n}\n\n/** The RdSAP elements a design's floors and fabric types produce. */\nexport function buildElements(\n  scenes: readonly Scene[],\n  ceilingHeightsMm: readonly number[],\n  types: readonly FabricType[],\n  names: readonly string[] = [],\n  northDeg: number | null = null,\n  /** Each scene's floor pk, which qualifies its `Part` ids; its index without. */\n  floorIds: readonly (number | string)[] = [],\n): Bridged {\n  if (scenes.length === 0) {\n    throw new BridgeError(\"The design has no floors.\");\n  }\n\n  const defaultWall = resolve(types, \"WALL\", null);\n  const defaultFloor = resolve(types, \"FLOOR\", null);\n  const defaultRoof = resolve(types, \"ROOF\", null);\n\n  if (!defaultWall || !defaultFloor || !defaultRoof) {\n    throw new BridgeError(\"The design is missing default fabric types.\");\n  }\n\n  const wallGroups = new Map<number, WallGroup>();\n  const windowGroups = new Map<\n    string,\n    { type: FabricType; areaMm2: number; orientation: string; parts: Part[] }\n  >();\n  const doorKinds: string[] = [];\n  const doorIds: string[] = [];\n  const groundParts: Part[] = [];\n  const roofParts: Part[] = [];\n  let roofExtraMm2 = 0;\n  let roofRoomMm2 = 0;\n\n  let partyAreaMm2 = 0;\n  let groundPerimeterMm = 0;\n  // What a proposal builds new: by floor or roof type, mm\u00B2 and mm.\n  const builtFloors = new Map<\n    number,\n    { type: FabricType; mm2: number; perimeterMm: number }\n  >();\n  const builtRoofs = new Map<number, { type: FabricType; mm2: number }>();\n  const floorAreasMm2: number[] = [];\n  const withoutRooms: string[] = [];\n\n  scenes.forEach((scene, index) => {\n    const floor = floorIds[index] ?? index;\n    const qualified = (id: string) => `${floor}:${id}`;\n    const view = resolveScene(scene, types);\n    const heated = view.rooms.filter((room) => room.heated);\n    const polygons = new Map(heated.map((room) => [room.id, room.polygon]));\n    const roomsArea = heated.reduce((total, room) => total + room.areaMm2, 0);\n    floorAreasMm2.push(roomsArea);\n    const top = index === scenes.length - 1;\n    for (const room of index === 0 || top ? heated : []) {\n      let ownFloorMm2 = room.areaMm2;\n      let ownRoofMm2 = room.areaMm2;\n      // A sloped ceiling's roof is bigger than the room under it.\n      const shaped = top ? profileOf(room.polygon, room.ceiling) : null;\n      const factor = shaped?.roofFactor ?? 1;\n      roofExtraMm2 += room.areaMm2 * (factor - 1);\n      if (shaped && room.ceiling?.shape === \"roof_room\") {\n        roofRoomMm2 += room.areaMm2;\n      }\n      for (const { area, mm2 } of newBuildParts(scene, room.polygon)) {\n        const floorType = resolve(types, \"FLOOR\", area.floor);\n        if (index === 0 && floorType && !floorType.is_default) {\n          builtOf(builtFloors, floorType).mm2 += mm2;\n          ownFloorMm2 -= mm2;\n        }\n        const roofType = resolve(types, \"ROOF\", area.roof);\n        if (top && roofType && !roofType.is_default) {\n          builtOf(builtRoofs, roofType).mm2 += mm2 * factor;\n          ownRoofMm2 -= mm2;\n        }\n      }\n      if (index === 0) {\n        groundParts.push({\n          id: qualified(room.id),\n          areaMm2: ownFloorMm2,\n          openingsMm2: 0,\n        });\n      }\n      if (top) {\n        roofParts.push({\n          id: qualified(room.id),\n          areaMm2: ownRoofMm2 * factor,\n          openingsMm2: 0,\n        });\n      }\n    }\n    if (roomsArea <= 0) {\n      withoutRooms.push(names[index] ?? `Level ${index}`);\n    }\n\n    const ceilingMm = storeyHeightMm(\n      heated.map((room) => ({\n        polygon: room.polygon as [number, number][],\n        areaMm2: room.areaMm2,\n        ceiling_height: volumeHeightMm(room),\n      })),\n      ceilingHeightsMm[index] ?? 0,\n    );\n\n    for (const wall of view.walls) {\n      if (!wall.inEnvelope) {\n        continue;\n      }\n\n      const grossMm2 = wallMm2(wall, view.rooms, ceilingMm);\n      const openings = view.openingsByWall.get(wall.id) ?? [];\n      const openingsMm2 = openings.reduce(\n        (total, opening) => total + opening.width * opening.height,\n        0,\n      );\n\n      if (wall.kind === \"PARTY\") {\n        partyAreaMm2 += grossMm2;\n        continue;\n      }\n\n      const wallType = wall.fabric ?? defaultWall;\n      let group = wallGroups.get(wallType.id);\n      if (!group) {\n        group = {\n          type: wallType,\n          areaMm2: 0,\n          openingsMm2: 0,\n          thicknessAreas: new Map(),\n          parts: [],\n        };\n        wallGroups.set(wallType.id, group);\n      }\n\n      group.areaMm2 += grossMm2;\n      group.openingsMm2 += openingsMm2;\n      group.parts.push({\n        id: qualified(wall.id),\n        areaMm2: grossMm2,\n        openingsMm2,\n      });\n      group.thicknessAreas.set(\n        wall.thickness,\n        (group.thicknessAreas.get(wall.thickness) ?? 0) + grossMm2,\n      );\n\n      if (index === 0) {\n        groundPerimeterMm += wall.lengthMm;\n        const middle: [number, number] = [\n          (wall.a[0] + wall.b[0]) / 2,\n          (wall.a[1] + wall.b[1]) / 2,\n        ];\n        const area = newBuildAt(scene, middle);\n        const type = area ? resolve(types, \"FLOOR\", area.floor) : undefined;\n        if (type && !type.is_default) {\n          builtOf(builtFloors, type).perimeterMm += wall.lengthMm;\n        }\n      }\n\n      const orientation = facing(\n        wall.a,\n        wall.b,\n        wall.rooms.flatMap((room) => {\n          const polygon = polygons.get(room);\n          return polygon ? [polygon] : [];\n        }),\n        northDeg,\n      );\n      for (const opening of openings) {\n        const area = opening.width * opening.height;\n\n        if (opening.type === \"window\") {\n          const windowType = resolve(types, \"WINDOW\", opening.fabric);\n          if (windowType) {\n            // Grouped by the way they face too, once north is known.\n            const key =\n              northDeg === null\n                ? String(windowType.id)\n                : `${windowType.id}:${orientation}`;\n            const part = {\n              id: qualified(opening.id),\n              areaMm2: area,\n              openingsMm2: 0,\n            };\n            const existing = windowGroups.get(key);\n            if (existing) {\n              existing.areaMm2 += area;\n              existing.parts.push(part);\n            } else {\n              windowGroups.set(key, {\n                type: windowType,\n                areaMm2: area,\n                orientation,\n                parts: [part],\n              });\n            }\n          }\n        } else if (opening.type === \"door\") {\n          const doorType = resolve(types, \"DOOR\", opening.fabric);\n          doorKinds.push(text(doorType?.spec ?? {}, \"kind\", \"UNINSULATED\"));\n          doorIds.push(qualified(opening.id));\n        }\n      }\n    }\n  });\n\n  if (withoutRooms.length > 0) {\n    throw new BridgeError(\n      `Storey areas come from rooms \u2014 draw rooms on: ${withoutRooms.join(\", \")}`,\n    );\n  }\n\n  if (wallGroups.size === 0) {\n    throw new BridgeError(\"The design has no external walls.\");\n  }\n\n  const groundMm2 = floorAreasMm2[0] ?? 0;\n  const topMm2 = floorAreasMm2[floorAreasMm2.length - 1] ?? 0;\n  const roofMm2 = topMm2 + roofExtraMm2;\n  const perimeterM = (groundPerimeterMm / MM_PER_M).toFixed(2);\n  const elements: Element[] = [];\n  const keys: string[] = [];\n  const parts: Part[][] = [];\n\n  for (const [id, group] of wallGroups) {\n    // Area-weighted mode: the drawn thickness covering the most area.\n    let thicknessMm = 0;\n    let most = -1;\n    for (const [thickness, area] of group.thicknessAreas) {\n      if (area > most) {\n        most = area;\n        thicknessMm = thickness;\n      }\n    }\n\n    elements.push(\n      wallElement(\n        group.type,\n        group.areaMm2,\n        group.openingsMm2,\n        Math.round(thicknessMm),\n      ),\n    );\n    keys.push(`wall:${id}`);\n    parts.push(group.parts);\n  }\n\n  if (partyAreaMm2 > 0) {\n    elements.push({\n      tag: \"PARTY_WALL\",\n      area: metres2(partyAreaMm2),\n      openings: \"0\",\n    });\n    keys.push(\"party-wall\");\n    parts.push([]);\n  }\n\n  for (const [id, group] of windowGroups) {\n    const spec = group.type.spec;\n    elements.push({\n      tag: \"WINDOW\",\n      area: metres2(group.areaMm2),\n      glazing: text(spec, \"glazing\", \"DOUBLE_GLAZED\"),\n      frame: text(spec, \"frame\", \"PVC\"),\n      gap: text(spec, \"gap\", \"UNKNOWN\"),\n      draught_proofed: Boolean(spec[\"draught_proofed\"] ?? false),\n      orientation: group.orientation,\n    });\n    keys.push(`window:${id}`);\n    parts.push(group.parts);\n  }\n\n  doorKinds.forEach((kind, index) => {\n    elements.push({ tag: \"EXTERNAL_DOOR\", kind });\n    keys.push(`door:${kind}`);\n    parts.push([{ id: doorIds[index] ?? \"\", areaMm2: 0, openingsMm2: 0 }]);\n  });\n\n  // The house's own floor and roof first: measures improve the first.\n  const floors = [...builtFloors.values()].filter(\n    (built) => built.perimeterMm > 0,\n  );\n  const builtFloorMm2 = floors.reduce((total, built) => total + built.mm2, 0);\n  const builtPerimeterMm = floors.reduce(\n    (total, built) => total + built.perimeterMm,\n    0,\n  );\n  const floorElement = (\n    type: FabricType,\n    areaMm2: number,\n    perimeterMm: number,\n  ): Element => ({\n    tag: \"GROUND_FLOOR\",\n    age: text(defaultWall.spec, \"age\", \"D\"),\n    area: metres2(areaMm2),\n    construction: text(type.spec, \"construction\", \"UNSEALED_SUSPENDED_TIMBER\"),\n    perimeter: (perimeterMm / MM_PER_M).toFixed(2),\n    insulation: { thickness: type.spec[\"insulation_thickness_mm\"] ?? null },\n    wall: wallElement(defaultWall, 0, 0, null),\n  });\n  elements.push(\n    floorElement(\n      defaultFloor,\n      groundMm2 - builtFloorMm2,\n      groundPerimeterMm - builtPerimeterMm,\n    ),\n  );\n  keys.push(\"ground-floor\");\n  parts.push(groundParts);\n  for (const built of floors) {\n    elements.push(floorElement(built.type, built.mm2, built.perimeterMm));\n    keys.push(`ground-floor:${built.type.id}`);\n    parts.push([]);\n  }\n\n  const roofElement = (\n    type: FabricType,\n    areaMm2: number,\n    inRoof = false,\n  ): Element => ({\n    tag: \"ROOF\",\n    area: metres2(areaMm2),\n    insulation: {\n      kind: text(type.spec, \"insulation_kind\", \"JOISTS\"),\n      thickness: type.spec[\"insulation_thickness_mm\"] ?? null,\n    },\n    room_in_roof: Boolean(type.spec[\"room_in_roof\"] ?? false) || inRoof,\n  });\n  const roofs = [...builtRoofs.values()];\n  elements.push(\n    roofElement(\n      defaultRoof,\n      roofMm2 - roofs.reduce((total, built) => total + built.mm2, 0),\n      // RdSAP's room in roof where most of the top storey is one.\n      roofRoomMm2 * 2 > topMm2,\n    ),\n  );\n  keys.push(\"roof\");\n  parts.push(roofParts);\n  for (const built of roofs) {\n    elements.push(roofElement(built.type, built.mm2));\n    keys.push(`roof:${built.type.id}`);\n    parts.push([]);\n  }\n\n  const summary = {\n    external_walls: [...wallGroups.values()].map((group) => ({\n      name: group.type.name,\n      area_m2: metres2(group.areaMm2),\n      openings_m2: metres2(group.openingsMm2),\n    })),\n    party_wall_m2: metres2(partyAreaMm2),\n    windows: [...windowGroups.values()].map((group) => ({\n      name: group.type.name,\n      area_m2: metres2(group.areaMm2),\n      ...(northDeg === null ? {} : { facing: group.orientation }),\n    })),\n    doors: doorKinds.length,\n    ground_floor_m2: metres2(groundMm2),\n    perimeter_m: perimeterM,\n    roof_m2: metres2(roofMm2),\n    storeys: scenes.length,\n    floor_areas_m2: floorAreasMm2.map(metres2),\n  };\n\n  return { elements, keys, parts, summary };\n}\n", "// A read-only view of a floor with vertex references resolved to points,\n// ported from `apps/design/scene_resolve.py`.\n\nimport { polygonAreaMm2, resolve as resolveFabric } from \"./bridge\";\nimport { type Ceiling, ceilingOf } from \"./ceiling\";\nimport { breastAreaMm2 } from \"./features\";\nimport type { FabricType, Opening, Point, Scene } from \"./scene\";\n\nexport interface Wall {\n  readonly id: string;\n  readonly a: Point;\n  readonly b: Point;\n  readonly thickness: number;\n  readonly lengthMm: number;\n  readonly fabric: FabricType | null;\n  /** \"EXTERNAL\", \"INTERNAL\" or \"PARTY\". */\n  readonly kind: string;\n  /** The ids of the one or two rooms along it. */\n  readonly rooms: readonly string[];\n  /** False for a garage's outside walls: exposed, but no heated room behind. */\n  readonly inEnvelope: boolean;\n  /** The bridge element key for this wall's fabric. */\n  readonly key: string;\n  readonly name: string;\n}\n\nexport interface Room {\n  readonly id: string;\n  readonly name: string;\n  readonly roomType: string;\n  readonly polygon: readonly Point[];\n  /** mm\u00B2 to centrelines, less what its chimney breasts take. */\n  readonly areaMm2: number;\n  readonly ceilingHeight: number | null;\n  /** Where it slopes; null where it is flat. */\n  readonly ceiling: Ceiling | null;\n  readonly heated: boolean;\n}\n\n/** The stretch of a wall a room owns, in mm from the wall's `a` end. */\nexport interface Claim {\n  readonly wall: string;\n  readonly startMm: number;\n  readonly endMm: number;\n  readonly lengthMm: number;\n}\n\nexport interface ResolvedFloor {\n  readonly walls: readonly Wall[];\n  readonly rooms: readonly Room[];\n  readonly claims: ReadonlyMap<string, readonly Claim[]>;\n  readonly openingsByWall: ReadonlyMap<string, readonly Opening[]>;\n  wall(id: string): Wall | undefined;\n}\n\nfunction wallKind(\n  party: boolean,\n  holders: readonly string[],\n  heated: ReadonlySet<string>,\n): string {\n  if (holders.length !== 2) {\n    return party ? \"PARTY\" : \"EXTERNAL\";\n  }\n  const inside = holders.filter((room) => heated.has(room)).length;\n  return inside === 1 ? \"EXTERNAL\" : \"INTERNAL\";\n}\n\nexport function resolve(\n  scene: Scene,\n  types: readonly FabricType[],\n): ResolvedFloor {\n  const at = new Map(scene.vertices.map((vertex) => [vertex.id, vertex.at]));\n\n  const rooms: Room[] = scene.rooms.map((room) => {\n    const polygon = room.boundary\n      .map((vertex) => at.get(vertex))\n      .filter((point): point is Point => Boolean(point));\n    return {\n      id: room.id,\n      name: room.name || \"Room\",\n      roomType: room.room_type ?? \"\",\n      polygon,\n      areaMm2: Math.max(\n        polygonAreaMm2(polygon) - breastAreaMm2(scene, room.id),\n        0,\n      ),\n      ceilingHeight: room.ceiling_height ?? null,\n      ceiling: ceilingOf(room),\n      heated: room.heated !== false,\n    };\n  });\n  const heated = new Set(rooms.filter((room) => room.heated).map((r) => r.id));\n\n  const byPair = new Map<string, string>();\n  for (const wall of scene.walls) {\n    byPair.set([wall.a, wall.b].sort().join(\"|\"), wall.id);\n  }\n  const holders = new Map<string, string[]>(\n    scene.walls.map((wall) => [wall.id, []]),\n  );\n  for (const room of scene.rooms) {\n    for (let index = 0; index < room.boundary.length; index++) {\n      const from = room.boundary[index] as string;\n      const to = room.boundary[(index + 1) % room.boundary.length] as string;\n      const wallId = byPair.get([from, to].sort().join(\"|\"));\n      const list = wallId ? holders.get(wallId) : undefined;\n      if (list && !list.includes(room.id)) {\n        list.push(room.id);\n      }\n    }\n  }\n\n  const walls: Wall[] = [];\n  for (const wall of scene.walls) {\n    const a = at.get(wall.a);\n    const b = at.get(wall.b);\n    if (!a || !b) {\n      continue;\n    }\n    const fabric = resolveFabric(types, \"WALL\", wall.fabric) ?? null;\n    const mine = holders.get(wall.id) ?? [];\n    const kind = wallKind(wall.party === true, mine, heated);\n    walls.push({\n      id: wall.id,\n      a,\n      b,\n      thickness: wall.thickness,\n      lengthMm: Math.hypot(b[0] - a[0], b[1] - a[1]),\n      fabric,\n      kind,\n      rooms: mine,\n      inEnvelope: kind !== \"INTERNAL\" && mine.some((room) => heated.has(room)),\n      key: fabric ? `wall:${fabric.id}` : \"wall:?\",\n      name: fabric?.name ?? \"External wall\",\n    });\n  }\n\n  const openingsByWall = new Map<string, Opening[]>();\n  for (const opening of scene.openings) {\n    const existing = openingsByWall.get(opening.wall);\n    if (existing) {\n      existing.push(opening);\n    } else {\n      openingsByWall.set(opening.wall, [opening]);\n    }\n  }\n\n  const claims = new Map<string, Claim[]>();\n  for (const room of rooms) {\n    claims.set(\n      room.id,\n      walls\n        .filter((wall) => wall.rooms.includes(room.id))\n        .map((wall) => ({\n          wall: wall.id,\n          startMm: 0,\n          endMm: wall.lengthMm,\n          lengthMm: wall.lengthMm,\n        })),\n    );\n  }\n\n  return {\n    walls,\n    rooms,\n    claims,\n    openingsByWall,\n    wall: (id) => walls.find((wall) => wall.id === id),\n  };\n}\n", "// Packages of retrofit measures, scored live. The server sends each option as a\n// patch on the calc context (apps/design/scenarios.py); any pick of one option\n// per group composes, so every package is one worksheet run here.\n\nimport { z } from \"zod\";\nimport { heatPumpShare, isHeatPump } from \"../calc/rating\";\nimport {\n  type WorksheetInput,\n  type WorksheetResults,\n  worksheet,\n} from \"../calc/worksheet\";\nimport type { FabricType, Scene } from \"./bridge\";\nimport type { PeakModel } from \"./heatload\";\nimport {\n  type CostLine,\n  extraLines,\n  type HeatPumpSite,\n  UNKNOWN_SITE,\n} from \"./heatpumpcost\";\nimport type { Patch, Prepared } from \"./heatloss\";\nimport { resolve } from \"./resolve\";\nimport type { DesignPackage, ScheduleRow } from \"./scene\";\n\nexport const ScenarioOptionSchema = z.object({\n  id: z.string(),\n  label: z.string(),\n  kind: z.string(),\n  elements: z.record(z.string(), z.record(z.string(), z.unknown())),\n  fields: z.record(z.string(), z.unknown()),\n  cost: z.object({\n    basis: z.string(),\n    rate: z.number().nullable(),\n    fixed: z.number(),\n  }),\n  default: z.boolean(),\n  /** A heat pump's output, kW. */\n  capacity_kw: z.number().nullable().default(null),\n  /** A grant towards it, pence. */\n  grant: z\n    .object({ name: z.string(), amount: z.number() })\n    .nullable()\n    .default(null),\n  /** A heat pump's costs beyond the unit, pence; null for anything else. */\n  extras: z\n    .object({\n      cylinder: z.number(),\n      cylinder_min_l: z.number(),\n      emitter_room: z.number(),\n      enabling: z.number(),\n    })\n    .nullable()\n    .default(null),\n});\n\nexport const ScenarioGroupSchema = z.object({\n  id: z.string(),\n  label: z.string(),\n  category: z.string(),\n  /** One line on why an expected option is missing, or empty. */\n  note: z.string().default(\"\"),\n  options: z.array(ScenarioOptionSchema),\n});\n\nexport const ScenarioContextSchema = z.object({\n  keys: z.array(z.string()),\n  groups: z.array(ScenarioGroupSchema),\n});\n\nexport type ScenarioOption = z.infer<typeof ScenarioOptionSchema>;\nexport type ScenarioGroup = z.infer<typeof ScenarioGroupSchema>;\nexport type ScenarioContext = z.infer<typeof ScenarioContextSchema>;\n\n/** One option index per group, -1 for none. */\nexport type Choice = readonly number[];\n\nexport interface Outcome {\n  sap: number;\n  /** \u00A3 a year, as Options Evaluation counts it. */\n  bills: number;\n  /** kg CO\u2082 a year. */\n  carbon: number;\n  /** W/K, in January. */\n  heatLoss: number;\n  /**\n   * Pence net of grants (when counted), or null when something has no price:\n   * what the search ranks on and payback repays. Shown as `gross`, less `grant`.\n   */\n  cost: number | null;\n  /** Pence before grants: the one cost every surface shows. */\n  gross: number | null;\n  /** Pence of grants counted towards it, shown as its own line. */\n  grant: number;\n  /** The design heat load, kW: what a heat pump has to cover. */\n  peak: number;\n  /** False when a heat pump in it is smaller than that. */\n  fits: boolean;\n  /** Years the bill savings take to repay the cost, or null. */\n  payback: number | null;\n}\n\n/** Below this, the bill barely moves and a payback means nothing. */\nconst MIN_SAVING = 10;\n\n/** Indoor 21 \u00B0C against a typical UK design day, when there's no room-by-room load. */\nconst DESIGN_DELTA_K = 24;\n\n/** A heat pump must beat the design heat load by this much. */\nexport const SIZING_MARGIN = 1.15;\n\n/** The smallest heat pump, kW, for a design heat load of `peak` kW. */\nexport function neededKw(peak: number): number {\n  return peak * SIZING_MARGIN;\n}\n\nexport { bandFloor, sapBand as band } from \"../calc/sapscore\";\n\n/** Whether an option puts in a heat pump, for space or water heating. */\nexport function installsHeatPump(option: ScenarioOption): boolean {\n  return (\n    isHeatPump(option.fields[\"first_main_heat_system\"]) ||\n    isHeatPump(option.fields[\"water_heater_system\"])\n  );\n}\n\n/** A worksheet run: what went in, and the rows. */\nexport interface Run {\n  input: WorksheetInput;\n  rows: WorksheetResults;\n  /**\n   * Whether the package, or the scene, installs a heat pump, scored at the\n   * SCOP. Otherwise it's RdSAP's, so today's rating is the lodged EPC's even\n   * with a heat pump already in.\n   */\n  corrected: boolean;\n}\n\n/** The heat-pump shares of the main and water heating's fuel at the input's SCOP. */\nexport function sharesOf({ input, rows, corrected }: Run): {\n  main: number;\n  water: number;\n} {\n  if (!corrected) {\n    return { main: 1, water: 1 };\n  }\n  return {\n    main: heatPumpShare(\n      input.first_main_heat_system,\n      rows.first_main_heat_system_efficiency_206,\n      input.heat_pump_scop,\n    ),\n    water: heatPumpShare(\n      input.water_heater_system,\n      rows.water_heater_efficiency_217[0] ?? 100,\n      input.heat_pump_scop,\n    ),\n  };\n}\n\n/**\n * SAP, \u00A3 and kg CO\u2082 a year with a heat pump the package installs at the\n * design's SCOP, not RdSAP's 170%: the worksheet's corrected rows, and its\n * carbon scaled the same way (apps/twin/scoring.py). Without one, RdSAP's.\n * Bills are at today's prices (calc/tariffs.ts); SAP stays on Table 32.\n */\nexport function scoreOf(run: Run): {\n  sap: number;\n  bills: number;\n  carbon: number;\n} {\n  const { rows } = run;\n  if (!run.corrected) {\n    return {\n      sap: rows.sap_rating_258,\n      bills: rows.furbnow_bills,\n      carbon: rows.total_energy_co2_272,\n    };\n  }\n  const { main, water } = sharesOf(run);\n  return {\n    sap: rows.furbnow_corrected_sap_rating,\n    bills: rows.furbnow_corrected_bills,\n    carbon:\n      rows.total_energy_co2_272 -\n      rows.first_main_heat_system_co2_261 * (1 - main) -\n      rows.water_heater_co2_264 * (1 - water),\n  };\n}\n\nexport function outcomeOf(\n  run: Run,\n  cost: number | null,\n  /** W, the package's heat generator sizing component, where it's known. */\n  peakWatts: number | null = null,\n  baseBills: number | null = null,\n): Outcome {\n  const { rows } = run;\n  const heatLoss = rows.heat_transfer_coefficient_39[0] ?? 0;\n  const { sap, bills, carbon } = scoreOf(run);\n  const saving = baseBills === null ? 0 : baseBills - bills;\n  return {\n    sap,\n    bills,\n    carbon,\n    heatLoss,\n    cost,\n    gross: cost,\n    grant: 0,\n    peak: (peakWatts ?? heatLoss * DESIGN_DELTA_K) / 1000,\n    fits: true,\n    payback: cost !== null && saving >= MIN_SAVING ? cost / 100 / saving : null,\n  };\n}\n\nfunction metres2(value: unknown): number {\n  const number = Number.parseFloat(String(value ?? \"0\"));\n  return Number.isFinite(number) ? number : 0;\n}\n\n/** What each cost basis measures on the live plan: m\u00B2, or a count. */\nexport function quantities(\n  prepared: Prepared,\n  scenes: readonly Scene[],\n  types: readonly FabricType[],\n): Record<string, number> {\n  const amounts: Record<string, number> = { fixed: 1, windows: 0, doors: 0 };\n  prepared.bridged.keys.forEach((key, index) => {\n    const element = prepared.bridged.elements[index] ?? {};\n    if (key.startsWith(\"wall:\")) {\n      amounts[key] =\n        (amounts[key] ?? 0) +\n        metres2(element[\"area\"]) -\n        metres2(element[\"openings\"]);\n    } else if (key === \"roof\" || key === \"ground-floor\") {\n      amounts[key] = metres2(element[\"area\"]);\n    } else if (key.startsWith(\"door:\")) {\n      amounts[\"doors\"] = (amounts[\"doors\"] ?? 0) + 1;\n    }\n  });\n  for (const scene of scenes) {\n    const view = resolve(scene, types);\n    for (const wall of view.walls) {\n      if (!wall.inEnvelope || wall.kind === \"PARTY\") {\n        continue;\n      }\n      for (const opening of view.openingsByWall.get(wall.id) ?? []) {\n        if (opening.type === \"window\") {\n          amounts[\"windows\"] = (amounts[\"windows\"] ?? 0) + 1;\n        }\n      }\n    }\n  }\n  return amounts;\n}\n\n/**\n * Pence a Measures tab row puts on its kind: the typed cost, else the estimate\n * from what's drawn by hand, else null. The Build Pack and Scenarios both price by it.\n */\nexport function scheduleCost(row: ScheduleRow): number | null {\n  if (row.cost_override != null) {\n    return row.cost_override;\n  }\n  // Marks an option drew show where it goes; it's priced as the option.\n  const drawn = row.by_hand ?? row.count;\n  return drawn > 0 && row.est_central > 0 ? row.est_central : null;\n}\n\n/** Which calc elements a cost basis counts: a key, or every window or door. */\nfunction counts(basis: string, key: string): boolean {\n  if (basis === \"windows\") {\n    return key.startsWith(\"window:\");\n  }\n  if (basis === \"doors\") {\n    return key.startsWith(\"door:\");\n  }\n  return key === basis;\n}\n\n/** The entities (`<floor pk>:<id>`) a cost basis can be targeted at. */\nexport function candidateIds(prepared: Prepared, basis: string): string[] {\n  const { keys, parts } = prepared.bridged;\n  return keys.flatMap((key, index) =>\n    counts(basis, key) ? (parts[index] ?? []).map((part) => part.id) : [],\n  );\n}\n\n/**\n * What an option's cost basis measures over just `targets`: m\u00B2 of the walls,\n * room floors or roofs, or a count of the windows or doors. `whole` when they\n * cover every part, so full targeting costs exactly what no targets do.\n */\nexport function targetedAmount(\n  prepared: Prepared,\n  basis: string,\n  targets: ReadonlySet<string>,\n  whole: number,\n): number {\n  const { keys, parts } = prepared.bridged;\n  let amount = 0;\n  let every = true;\n  keys.forEach((key, index) => {\n    if (!counts(basis, key)) {\n      return;\n    }\n    for (const part of parts[index] ?? []) {\n      if (!targets.has(part.id)) {\n        every = false;\n        continue;\n      }\n      amount +=\n        basis === \"windows\" || basis === \"doors\"\n          ? 1\n          : (part.areaMm2 - part.openingsMm2) / 1_000_000;\n    }\n  });\n  return every ? whole : amount;\n}\n\n/**\n * Options whose effect counts elements rather than area, so they can't cover\n * part of their group: draught proofing counts the window elements it proofs,\n * and a split window group would count twice. Their targets are ignored.\n * Mirrors COUNTED_OPTIONS in apps/design/scenarios.py.\n */\nexport const COUNTED_OPTIONS: ReadonlySet<string> = new Set([\n  \"windows:DRAUGHT_PROOFING\",\n]);\n\n/** A scenario's `targets`: option id to `<floor pk>:<entity id>`s. */\nexport type Targets = Readonly<Record<string, readonly string[]>>;\n\n/** Pence, or null without a price. `rate` overrides the server's. */\nexport function costOf(\n  option: ScenarioOption,\n  amounts: Record<string, number>,\n  rate: number | null = option.cost.rate,\n): number | null {\n  if (rate === null) {\n    return null;\n  }\n  const amount = amounts[option.cost.basis] ?? 0;\n  return Math.round(rate * amount + option.cost.fixed);\n}\n\n/** Packages scored by a search, in flat typed arrays. */\nexport interface Packages {\n  count: number;\n  groups: number;\n  /** `choices[i * groups + g]`: package i's option index in group g, or -1. */\n  choices: Int16Array;\n  /** 0 where a heat pump in the package is too small for its heat load. */\n  fits: Uint8Array;\n  sap: Float64Array;\n  bills: Float64Array;\n  carbon: Float64Array;\n  cost: Float64Array;\n}\n\nexport type Metric = \"sap\" | \"bills\" | \"carbon\";\n\n/** Whether more of a metric is better. */\nexport const HIGHER_IS_BETTER: Record<Metric, boolean> = {\n  sap: true,\n  bills: false,\n  carbon: false,\n};\n\n/**\n * The packages no other beats on both cost and `metric`, cheapest first.\n * Ties on cost keep the better metric; ties on both keep the first found.\n */\nexport function frontier(packages: Packages, metric: Metric): number[] {\n  const values = packages[metric];\n  const sign = HIGHER_IS_BETTER[metric] ? 1 : -1;\n  const order = Array.from({ length: packages.count }, (_, index) => index);\n  order.sort(\n    (left, right) =>\n      (packages.cost[left] ?? 0) - (packages.cost[right] ?? 0) ||\n      sign * ((values[right] ?? 0) - (values[left] ?? 0)) ||\n      left - right,\n  );\n  const front: number[] = [];\n  let best = -Infinity;\n  for (const index of order) {\n    if (!packages.fits[index]) {\n      continue;\n    }\n    const score = sign * (values[index] ?? 0);\n    if (score > best + 1e-9) {\n      front.push(index);\n      best = score;\n    }\n  }\n  return front;\n}\n\n/** The house a heat pump is priced against, given the scenario's fixtures. */\nexport type SiteSource = (\n  fixtures: Pick<DesignPackage, \"fixtures\"> | null,\n) => HeatPumpSite;\n\nexport class Explorer {\n  readonly groups: readonly ScenarioGroup[];\n  readonly amounts: Record<string, number>;\n  readonly base: Outcome;\n  /** Count grants: rank and repay packages net of them, and show them as lines. */\n  grants = true;\n  private readonly rates = new Map<string, number | null>();\n  private readonly kindCosts = new Map<string, number>();\n  /** The scene entities each option covers; an option missing covers all. */\n  private readonly targets: ReadonlyMap<string, ReadonlySet<string>> =\n    new Map();\n  private readonly targeted = new Map<string, Patch>();\n  /** The room-by-room heat load, rescored for each package's measures. */\n  private readonly peak: PeakModel | null;\n  /** The house a heat pump's cylinder and emitters are priced against. */\n  private siteSource: SiteSource = () => UNKNOWN_SITE;\n  /** What the scenario being scored adds and removes; none for the baseline. */\n  private fixtures: Pick<DesignPackage, \"fixtures\"> | null = null;\n\n  constructor(\n    readonly prepared: Prepared,\n    context: ScenarioContext,\n    scenes: readonly Scene[],\n    types: readonly FabricType[],\n    rates: ReadonlyMap<string, number | null> = new Map(),\n    peak: PeakModel | null = null,\n  ) {\n    this.groups = context.groups;\n    this.amounts = quantities(prepared, scenes, types);\n    for (const [id, rate] of rates) {\n      this.rates.set(id, rate);\n    }\n    this.peak = peak;\n    this.base = outcomeOf(this.run([]), 0, this.peakWatts([]));\n  }\n\n  /** W for a package's heat pump to cover, or null without a room-by-room load. */\n  peakWatts(patches: readonly Patch[]): number | null {\n    return this.peak ? this.peak.watts(patches) : null;\n  }\n\n  /**\n   * A view of this explorer scoring a scenario's `targets`: each option there\n   * covers just those elements, and one missing covers everything its group\n   * does. It shares the prepared plan and starts with this explorer's prices,\n   * Measures tab costs and grants, which then change on each separately.\n   * Targets for `COUNTED_OPTIONS` are ignored.\n   */\n  withTargets(\n    targets: Targets,\n    fixtures: Pick<DesignPackage, \"fixtures\"> | null = null,\n  ): Explorer {\n    const view = Object.create(Explorer.prototype) as Explorer;\n    return Object.assign(view, this, {\n      targets: new Map(\n        Object.entries(targets)\n          .filter(([id]) => !COUNTED_OPTIONS.has(id))\n          .map(([id, ids]) => [id, new Set(ids)]),\n      ),\n      targeted: new Map(),\n      fixtures,\n      rates: new Map(this.rates),\n      kindCosts: new Map(this.kindCosts),\n    });\n  }\n\n  /** What the option can be pointed at; none for a counted or fixed one. */\n  candidatesOf(option: ScenarioOption): string[] {\n    return option.cost.basis === \"fixed\" || COUNTED_OPTIONS.has(option.id)\n      ? []\n      : candidateIds(this.prepared, option.cost.basis);\n  }\n\n  /**\n   * The option as a patch on just its targets, or itself without any. Its\n   * `fields` (the thermal mass IWI brings, say) are the whole option's, so\n   * they come only with at least half its quantity: none with no targets.\n   */\n  patchOf(option: ScenarioOption): Patch {\n    const targets = this.targets.get(option.id);\n    if (!targets || option.cost.basis === \"fixed\") {\n      return option;\n    }\n    let patch = this.targeted.get(option.id);\n    if (!patch) {\n      const amount = this.amountOf(option);\n      const whole = this.amounts[option.cost.basis] ?? 0;\n      patch = {\n        elements: option.elements,\n        fields: amount > 0 && amount >= whole / 2 ? option.fields : {},\n        targets,\n        ...this.sharesOf(option, targets),\n      };\n      this.targeted.set(option.id, patch);\n    }\n    return patch;\n  }\n\n  /**\n   * The share, 0 to 1, of each patched element the targets cover, by net\n   * area (a count for doors), and each element's net area to weigh it by.\n   */\n  private sharesOf(\n    option: ScenarioOption,\n    targets: ReadonlySet<string>,\n  ): { shares: Record<string, number>; areas: Record<string, number> } {\n    const sums = new Map<string, { covered: number; total: number }>();\n    const { keys, parts } = this.prepared.bridged;\n    keys.forEach((key, index) => {\n      if (!(key in option.elements)) {\n        return;\n      }\n      const sum = sums.get(key) ?? { covered: 0, total: 0 };\n      for (const part of parts[index] ?? []) {\n        const net = part.areaMm2 - part.openingsMm2;\n        const weight = net > 0 ? net : 1;\n        sum.total += weight;\n        sum.covered += targets.has(part.id) ? weight : 0;\n      }\n      sums.set(key, sum);\n    });\n    const entries = [...sums];\n    return {\n      shares: Object.fromEntries(\n        entries.map(([key, { covered, total }]) => [\n          key,\n          total > 0 ? covered / total : 0,\n        ]),\n      ),\n      areas: Object.fromEntries(\n        entries.map(([key, { total }]) => [key, total]),\n      ),\n    };\n  }\n\n  /** A typed-in price beats the server's; null clears it back. */\n  setRate(optionId: string, rate: number | null): void {\n    this.rates.set(optionId, rate);\n  }\n\n  rateOf(option: ScenarioOption): number | null {\n    return this.rates.has(option.id)\n      ? (this.rates.get(option.id) ?? null)\n      : option.cost.rate;\n  }\n\n  /** Net of its grant when grants are counted. */\n  costOf(option: ScenarioOption): number | null {\n    const gross = this.grossCostOf(option);\n    return gross === null ? null : gross - this.grantOf(option);\n  }\n\n  /** Pence of its grant, when grants are counted, up to its price. */\n  grantOf(option: ScenarioOption): number {\n    if (!this.grants || !option.grant) {\n      return 0;\n    }\n    const gross = this.grossCostOf(option);\n    return Math.min(gross ?? option.grant.amount, option.grant.amount);\n  }\n\n  /** The grants a package gets, when they're counted: {name, amount} each. */\n  grantsIn(choice: Choice): { name: string; amount: number }[] {\n    return this.picked(choice).flatMap((option) => {\n      const amount = this.grantOf(option);\n      return option.grant && amount > 0\n        ? [{ name: option.grant.name, amount }]\n        : [];\n    });\n  }\n\n  /**\n   * Before grants: the Measures tab's cost for the option's kind when it has\n   * one, as the Build Pack takes it, else the option's own price.\n   */\n  grossCostOf(option: ScenarioOption): number | null {\n    return this.kindCosts.get(option.kind) ?? this.ownCostOf(option);\n  }\n\n  /** The option's own price, from its rate and what it covers on the plan. */\n  ownCostOf(option: ScenarioOption): number | null {\n    const unit = this.unitCostOf(option);\n    return unit === null\n      ? null\n      : unit + this.extrasOf(option).reduce((sum, line) => sum + line.pence, 0);\n  }\n\n  private unitCostOf(option: ScenarioOption): number | null {\n    const amounts = {\n      ...this.amounts,\n      [option.cost.basis]: this.amountOf(option),\n    };\n    return costOf(option, amounts, this.rateOf(option));\n  }\n\n  /** What a heat pump needs beyond its unit on this house; none for others. */\n  extrasOf(option: ScenarioOption): CostLine[] {\n    // A price someone typed is the total: the extras are already in it.\n    return option.extras && !this.rates.has(option.id)\n      ? extraLines(option.extras, this.siteSource(this.fixtures))\n      : [];\n  }\n\n  /**\n   * Set what the house has, for pricing heat pumps: read each time a price is\n   * asked for, so the flow temperature and heat load it depends on stay current.\n   */\n  setSite(site: HeatPumpSite | SiteSource): void {\n    this.siteSource = typeof site === \"function\" ? site : () => site;\n  }\n\n  /**\n   * The lines an option's price is made of, or none when it's one number: a\n   * heat pump's unit and what comes with it. A Measures tab cost replaces them.\n   */\n  breakdownOf(option: ScenarioOption): CostLine[] {\n    const unit = this.unitCostOf(option);\n    if (\n      !option.extras ||\n      unit === null ||\n      this.rates.has(option.id) ||\n      this.kindCosts.has(option.kind)\n    ) {\n      return [];\n    }\n    const lines = [\n      {\n        label: `Heat pump${option.capacity_kw ? ` (${option.capacity_kw} kW)` : \"\"}`,\n        pence: unit,\n      },\n      ...this.extrasOf(option),\n    ];\n    const grant = this.grantOf(option);\n    return option.grant && grant > 0\n      ? [...lines, { label: option.grant.name, pence: -grant }]\n      : lines;\n  }\n\n  /** What the option's cost basis measures over the elements it covers. */\n  amountOf(option: ScenarioOption): number {\n    const { basis } = option.cost;\n    const targets = this.targets.get(option.id);\n    const whole = this.amounts[basis] ?? 0;\n    return targets && basis !== \"fixed\"\n      ? targetedAmount(this.prepared, basis, targets, whole)\n      : whole;\n  }\n\n  /** The Measures tab's costs, by kind (`scheduleCost`). */\n  setKindCosts(rows: readonly ScheduleRow[]): void {\n    this.kindCosts.clear();\n    for (const row of rows) {\n      const cost = scheduleCost(row);\n      if (cost !== null) {\n        this.kindCosts.set(row.kind, cost);\n      }\n    }\n  }\n\n  /** Whether every heat pump in the package covers `peak` kW with the margin. */\n  fits(choice: Choice, peak: number): boolean {\n    return this.picked(choice).every(\n      (option) =>\n        option.capacity_kw === null || option.capacity_kw >= neededKw(peak),\n    );\n  }\n\n  option(group: number, index: number): ScenarioOption | undefined {\n    return index < 0 ? undefined : this.groups[group]?.options[index];\n  }\n\n  /** The options a choice picks, in group order. */\n  picked(choice: Choice): ScenarioOption[] {\n    return choice.flatMap((index, group) => {\n      const option = this.option(group, index);\n      return option ? [option] : [];\n    });\n  }\n\n  patches(choice: Choice): Patch[] {\n    return this.picked(choice).map((option) => this.patchOf(option));\n  }\n\n  cost(choice: Choice): number | null {\n    let total = 0;\n    // A kind's Measures tab cost is the whole kind's, so counted once.\n    const priced = new Set<string>();\n    for (const [group, index] of choice.entries()) {\n      const option = this.option(group, index);\n      if (!option || priced.has(option.kind)) {\n        continue;\n      }\n      if (this.kindCosts.has(option.kind)) {\n        priced.add(option.kind);\n      }\n      const cost = this.costOf(option);\n      if (cost === null) {\n        return null;\n      }\n      total += cost;\n    }\n    return total;\n  }\n\n  rows(choice: Choice): WorksheetResults {\n    return this.prepared.run(this.patches(choice));\n  }\n\n  /** The worksheet's input and rows for a choice. */\n  run(choice: Choice): Run {\n    const picked = this.picked(choice);\n    const input = this.prepared.input(this.patches(choice));\n    return {\n      input,\n      rows: worksheet(input),\n      corrected:\n        this.prepared.context.installs_heat_pump === true ||\n        picked.some(installsHeatPump),\n    };\n  }\n\n  evaluate(choice: Choice): Outcome {\n    const outcome = outcomeOf(\n      this.run(choice),\n      this.cost(choice),\n      this.peakWatts(this.patches(choice)),\n      this.base.bills,\n    );\n    const grant = this.grantsIn(choice).reduce((sum, g) => sum + g.amount, 0);\n    return {\n      ...outcome,\n      gross: outcome.cost === null ? null : outcome.cost + grant,\n      grant,\n      fits: this.fits(choice, outcome.peak),\n    };\n  }\n\n  /** How many packages a search over `enabled` would score. */\n  size(enabled: readonly (readonly number[])[]): number {\n    return enabled.reduce((total, options) => total * (options.length + 1), 1);\n  }\n\n  /**\n   * Score every package drawn from `enabled` (option indexes per group, each\n   * group also tried without), yielding to the page between slices.\n   */\n  async search(\n    enabled: readonly (readonly number[])[],\n    progress?: (done: number, total: number) => void,\n    cancelled: () => boolean = () => false,\n    sliceMs = 12,\n  ): Promise<Packages | null> {\n    const groups = this.groups.length;\n    const total = this.size(enabled);\n    const packages: Packages = {\n      count: total,\n      groups,\n      choices: new Int16Array(total * groups),\n      fits: new Uint8Array(total),\n      sap: new Float64Array(total),\n      bills: new Float64Array(total),\n      carbon: new Float64Array(total),\n      cost: new Float64Array(total),\n    };\n    // An odometer over each group's \"none\" then its enabled options.\n    const digits = new Array<number>(groups).fill(0);\n    const choice = new Array<number>(groups).fill(-1);\n    const capacities = this.groups.map((_group, g) =>\n      (enabled[g] ?? []).map(\n        (index) => this.option(g, index)?.capacity_kw ?? Infinity,\n      ),\n    );\n    const costs = this.groups.map((_group, g) =>\n      (enabled[g] ?? []).map((index) => {\n        const option = this.option(g, index);\n        return option ? (this.costOf(option) ?? 0) : 0;\n      }),\n    );\n\n    let started = performance.now();\n    for (let n = 0; n < total; n++) {\n      let cost = 0;\n      let capacity = Infinity;\n      for (let g = 0; g < groups; g++) {\n        const digit = digits[g] ?? 0;\n        const index = digit === 0 ? -1 : (enabled[g]?.[digit - 1] ?? -1);\n        choice[g] = index;\n        packages.choices[n * groups + g] = index;\n        if (digit > 0) {\n          cost += costs[g]?.[digit - 1] ?? 0;\n          capacity = Math.min(capacity, capacities[g]?.[digit - 1] ?? Infinity);\n        }\n      }\n      const run = this.run(choice);\n      const { rows } = run;\n      const score = scoreOf(run);\n      const peak =\n        (this.peakWatts(this.patches(choice)) ??\n          (rows.heat_transfer_coefficient_39[0] ?? 0) * DESIGN_DELTA_K) / 1000;\n      packages.fits[n] = capacity >= neededKw(peak) ? 1 : 0;\n      packages.sap[n] = score.sap;\n      packages.bills[n] = score.bills;\n      packages.carbon[n] = score.carbon;\n      packages.cost[n] = cost;\n\n      for (let g = 0; g < groups; g++) {\n        const next = (digits[g] ?? 0) + 1;\n        if (next <= (enabled[g]?.length ?? 0)) {\n          digits[g] = next;\n          break;\n        }\n        digits[g] = 0;\n      }\n\n      if (performance.now() - started > sliceMs) {\n        progress?.(n + 1, total);\n        await new Promise((resolve) => setTimeout(resolve, 0));\n        if (cancelled()) {\n          return null;\n        }\n        started = performance.now();\n      }\n    }\n    progress?.(total, total);\n    return packages;\n  }\n\n  choiceOf(packages: Packages, index: number): number[] {\n    return Array.from(\n      packages.choices.subarray(\n        index * packages.groups,\n        (index + 1) * packages.groups,\n      ),\n    );\n  }\n\n  /**\n   * What each option in a package adds, taken fabric first in group order:\n   * the convention for crediting a measure's savings.\n   */\n  increments(choice: Choice): {\n    group: number;\n    option: ScenarioOption;\n    before: Outcome;\n    after: Outcome;\n  }[] {\n    const steps = [];\n    const sofar = choice.map(() => -1);\n    let before = this.base;\n    for (const [group, index] of choice.entries()) {\n      const option = this.option(group, index);\n      if (!option) {\n        continue;\n      }\n      sofar[group] = index;\n      const after = this.evaluate(sofar);\n      steps.push({ group, option, before, after });\n      before = after;\n    }\n    return steps;\n  }\n}\n", "import { type Draft, DraftSchema } from \"./draft\";\nimport { CHANGES_HEADER, freshness, StaleDesignError } from \"./freshness\";\nimport type { CalcContext } from \"./heatloss\";\nimport { type ScenarioContext, ScenarioContextSchema } from \"./scenarios\";\nimport {\n  Annotation,\n  AnnotationGeometry,\n  AnnotationSchema,\n  Design,\n  type DesignPackage,\n  DesignPackageSchema,\n  DesignSchema,\n  FabricType,\n  FabricTypeSchema,\n  type HeatLoadContext,\n  HeatLoadContextSchema,\n  type OverheatingContext,\n  OverheatingContextSchema,\n  Floor,\n  FloorSchema,\n  Revision,\n  RevisionSchema,\n  Scene,\n  SceneSchema,\n  Schedule,\n  ScheduleSchema,\n  Trace,\n  TraceSchema,\n} from \"./scene\";\nimport { z } from \"zod\";\nimport type { Site } from \"./three/site\";\n\nexport function getCookie(name: string): string {\n  for (const part of document.cookie.split(\";\")) {\n    const [key, ...rest] = part.trim().split(\"=\");\n    if (key === name) {\n      return decodeURIComponent(rest.join(\"=\"));\n    }\n  }\n  return \"\";\n}\n\nexport async function fetchDesign(url: string): Promise<Design> {\n  const response = await fetch(url, {\n    headers: { Accept: \"application/json\" },\n  });\n  if (!response.ok) {\n    throw new Error(`Loading the design failed (${response.status}).`);\n  }\n  return DesignSchema.parse(await response.json());\n}\n\nexport type SceneSaveResult =\n  | { kind: \"saved\"; version: number }\n  | { kind: \"conflict\"; version: number; scene: Scene }\n  | { kind: \"error\" };\n\nconst SavedResponse = z.object({ version: z.number() });\n\nconst ConflictResponse = z.object({\n  version: z.number(),\n  scene: SceneSchema,\n});\n\nfunction jsonHeaders(): Record<string, string> {\n  return {\n    \"Content-Type\": \"application/json\",\n    \"X-CSRFToken\": getCookie(\"csrftoken\"),\n  };\n}\n\n/** A change to the design: its answer says what it moved `updated` from and to. */\nfunction change(url: string, init: RequestInit): Promise<Response> {\n  return freshness.track(\n    fetch(url, init).then((response) => {\n      freshness.note(response.headers.get(CHANGES_HEADER));\n      return response;\n    }),\n  );\n}\n\n/** POST/PATCH/DELETE returning the parsed JSON body, or throwing on failure. */\nasync function send(\n  url: string,\n  method: string,\n  body?: unknown,\n): Promise<unknown> {\n  const response = await change(url, {\n    method,\n    headers: jsonHeaders(),\n    ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n  });\n  if (response.status === 409) {\n    throw new StaleDesignError(\n      await detail(response, `${method} ${url} failed`),\n    );\n  }\n  if (!response.ok) {\n    throw new Error(await detail(response, `${method} ${url} failed`));\n  }\n  if (response.status === 204) {\n    return null;\n  }\n  return response.json();\n}\n\nexport async function createFloor(\n  url: string,\n  design: number,\n  level: number,\n  name: string,\n): Promise<Floor> {\n  return FloorSchema.parse(await send(url, \"POST\", { design, level, name }));\n}\n\nexport async function renameFloor(url: string, name: string): Promise<void> {\n  await send(url, \"PATCH\", { name });\n}\n\nexport async function deleteFloor(url: string): Promise<void> {\n  await send(url, \"DELETE\");\n}\n\nexport async function reorderFloors(\n  url: string,\n  floors: number[],\n): Promise<void> {\n  await send(url, \"POST\", { floors });\n}\n\n/** A DRF error's `detail`, falling back to the status code. */\nasync function detail(response: Response, fallback: string): Promise<string> {\n  try {\n    const body = (await response.json()) as { detail?: unknown };\n    if (typeof body.detail === \"string\" && body.detail !== \"\") {\n      return body.detail;\n    }\n  } catch {\n    // Not JSON.\n  }\n\n  return `${fallback} (${response.status}).`;\n}\n\nexport async function fetchCalcContext(url: string): Promise<CalcContext> {\n  const response = await fetch(url, {\n    headers: { Accept: \"application/json\" },\n  });\n  if (!response.ok) {\n    throw new Error(\n      await detail(response, \"Loading the calculation context failed\"),\n    );\n  }\n  const body = (await response.json()) as CalcContext & {\n    unavailable?: string;\n  };\n  if (typeof body.unavailable === \"string\") {\n    throw new Error(body.unavailable);\n  }\n  return body;\n}\n\nexport async function fetchSchedule(url: string): Promise<Schedule> {\n  const response = await fetch(url, {\n    headers: { Accept: \"application/json\" },\n  });\n  if (!response.ok) {\n    throw new Error(`Loading the schedule failed (${response.status}).`);\n  }\n  return ScheduleSchema.parse(await response.json());\n}\n\nexport async function postScheduleMeasure(\n  url: string,\n  body: Record<string, unknown>,\n): Promise<Schedule> {\n  return ScheduleSchema.parse(await send(url, \"POST\", body));\n}\n\nconst RevisionsResponse = z.object({ revisions: z.array(RevisionSchema) });\n\nexport async function fetchRevisions(url: string): Promise<Revision[]> {\n  const response = await fetch(url, {\n    headers: { Accept: \"application/json\" },\n  });\n  if (!response.ok) {\n    throw new Error(`Loading the history failed (${response.status}).`);\n  }\n  return RevisionsResponse.parse(await response.json()).revisions;\n}\n\nconst RestoreResponse = z.object({\n  design: DesignSchema,\n  untouched_floors: z.array(z.string()),\n  missing_floors: z.array(z.string()),\n  dropped: z\n    .array(\n      z.object({\n        package: z.number(),\n        option: z.string().optional(),\n        id: z.string().optional(),\n        fixture: z.string().optional(),\n      }),\n    )\n    .default([]),\n});\n\nexport async function postRestore(\n  url: string,\n  revision: number,\n  scenario: number | null = null,\n): Promise<z.infer<typeof RestoreResponse>> {\n  return RestoreResponse.parse(await send(url, \"POST\", { revision, scenario }));\n}\n\nexport async function createFabricType(\n  url: string,\n  body: Record<string, unknown>,\n): Promise<FabricType> {\n  return FabricTypeSchema.parse(await send(url, \"POST\", body));\n}\n\n/** The street round the house, as the 3D view reads it. */\nexport async function getSite(modelUrl: string, keep = true): Promise<Site> {\n  // `keep` reads what's stored and never asks the map or the council. The\n  // plan's plot reads that way; Line up with the map, which staff ask for, doesn't.\n  return (await send(\n    `${modelUrl}site/${keep ? \"?keep=1\" : \"\"}`,\n    \"GET\",\n  )) as Site;\n}\n\n/** RdSAP's default U-value for a wall spec (null if it has none), and the nation's table. */\nexport async function wallDefaultU(\n  fabricTypesUrl: string,\n  spec: Record<string, unknown>,\n  design: number,\n): Promise<{ u: number | null; nation: string }> {\n  return z\n    .object({ u: z.number().nullable(), nation: z.string() })\n    .parse(await send(`${fabricTypesUrl}u-value/`, \"POST\", { spec, design }));\n}\n\nexport async function patchFabricType(\n  url: string,\n  body: Record<string, unknown>,\n): Promise<FabricType> {\n  return FabricTypeSchema.parse(await send(url, \"PATCH\", body));\n}\n\nexport async function patchHeatLoad(\n  url: string,\n  settings: Record<string, unknown>,\n): Promise<HeatLoadContext> {\n  return HeatLoadContextSchema.parse(await send(url, \"PATCH\", settings));\n}\n\nexport async function patchOverheating(\n  url: string,\n  settings: Record<string, unknown>,\n): Promise<OverheatingContext> {\n  return OverheatingContextSchema.parse(await send(url, \"PATCH\", settings));\n}\n\nconst OrientationSchema = z.object({\n  north_deg: z.number().nullable(),\n  plan_rotation: z.number(),\n});\n\nexport async function patchOrientation(\n  url: string,\n  body: { north_deg?: number | null; plan_rotation?: number },\n): Promise<z.infer<typeof OrientationSchema>> {\n  return OrientationSchema.parse(await send(url, \"PATCH\", body));\n}\n\nexport async function postTwin(\n  url: string,\n): Promise<{ baseline: { source: \"rdsap\" | \"assumed\" } }> {\n  return z\n    .object({\n      baseline: z.object({ source: z.enum([\"rdsap\", \"assumed\"]) }),\n    })\n    .parse(await send(url, \"POST\", {}));\n}\n\nexport async function patchBaseline(\n  url: string,\n  answers: Record<string, string | number>,\n): Promise<Design> {\n  return DesignSchema.parse(await send(url, \"PATCH\", answers));\n}\n\nexport async function patchChanges(\n  url: string,\n  changes: Record<string, string | number | null>,\n): Promise<Design> {\n  return DesignSchema.parse(await send(url, \"PATCH\", changes));\n}\n\nconst SceneNameSchema = z.object({ id: z.number(), name: z.string() });\n\nexport async function copyScene(\n  url: string,\n  name: string,\n): Promise<z.infer<typeof SceneNameSchema>> {\n  return SceneNameSchema.parse(await send(url, \"POST\", { name }));\n}\n\nexport async function renameScene(url: string, name: string): Promise<void> {\n  await send(url, \"PATCH\", { name });\n}\n\nexport async function deleteScene(url: string): Promise<void> {\n  await send(url, \"DELETE\");\n}\n\nexport async function deleteFabricType(url: string): Promise<void> {\n  await send(url, \"DELETE\");\n}\n\nexport async function createAnnotation(\n  url: string,\n  floor: number,\n  kind: string,\n  geometry: AnnotationGeometry,\n  /** The scenario proposing it: a baseline has no measures. */\n  pkg: number,\n  /** The scenario option drawing it; none when drawn by hand. */\n  option = \"\",\n): Promise<Annotation> {\n  return AnnotationSchema.parse(\n    await send(url, \"POST\", { floor, kind, geometry, package: pkg, option }),\n  );\n}\n\nexport async function patchAnnotation(\n  url: string,\n  patch: Record<string, unknown>,\n): Promise<Annotation> {\n  return AnnotationSchema.parse(await send(url, \"PATCH\", patch));\n}\n\nexport async function deleteAnnotation(url: string): Promise<void> {\n  await send(url, \"DELETE\");\n}\n\nexport const ProjectDocumentSchema = z.object({\n  id: z.number(),\n  name: z.string(),\n  folder: z.string(),\n  kind: z.string(),\n  pages: z.number().nullable(),\n  /** Labelled LAYOUT, or in an Architect folder. */\n  suggested: z.boolean(),\n});\n\nexport type ProjectDocument = z.infer<typeof ProjectDocumentSchema>;\n\n/** The project's PDFs and images to trace from, likeliest drawings first. */\nexport async function projectDocuments(\n  url: string,\n): Promise<ProjectDocument[]> {\n  const response = await fetch(url, {\n    headers: { Accept: \"application/json\" },\n  });\n  if (!response.ok) {\n    throw new Error(\n      `Listing the project's documents failed (${response.status}).`,\n    );\n  }\n  return z.array(ProjectDocumentSchema).parse(await response.json());\n}\n\n/** A trace from a file, or from one of the project's documents by id. */\nexport async function uploadTrace(\n  url: string,\n  floor: number,\n  source: File | number,\n  /** A PDF document's page, counting from 1. */\n  page = 1,\n): Promise<Trace> {\n  const body = new FormData();\n  body.append(\"floor\", String(floor));\n  if (typeof source === \"number\") {\n    body.append(\"document\", String(source));\n    body.append(\"page\", String(page));\n  } else {\n    body.append(\"file\", source);\n  }\n  const response = await change(url, {\n    method: \"POST\",\n    headers: { \"X-CSRFToken\": getCookie(\"csrftoken\") },\n    body,\n  });\n  if (!response.ok) {\n    const detail = await response.json().catch(() => null);\n    const message = detail?.file?.[0];\n    throw new Error(\n      typeof message === \"string\"\n        ? message\n        : `Uploading the trace failed (${response.status}).`,\n    );\n  }\n  return TraceSchema.parse(await response.json());\n}\n\nexport async function patchTrace(\n  url: string,\n  patch: Record<string, unknown>,\n): Promise<Trace> {\n  return TraceSchema.parse(await send(url, \"PATCH\", patch));\n}\n\n/** Claude's reading of a calibrated trace, in its pixels. */\nexport async function postDraft(url: string): Promise<Draft> {\n  return DraftSchema.parse(await send(url, \"POST\"));\n}\n\n/** Where the floor's traces and annotations sit, saved with the scene\n * after a whole-floor move. */\nexport interface Placements {\n  traces: Pick<Trace, \"id\" | \"offset_x_mm\" | \"offset_y_mm\" | \"rotation_deg\">[];\n  annotations: Pick<Annotation, \"id\" | \"geometry\">[];\n}\n\nexport async function putScene(\n  url: string,\n  version: number,\n  scene: Scene,\n  placed?: Placements,\n): Promise<SceneSaveResult> {\n  try {\n    const response = await change(url, {\n      method: \"PUT\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-CSRFToken\": getCookie(\"csrftoken\"),\n      },\n      body: JSON.stringify({ version, scene, ...placed }),\n    });\n    if (response.status === 409) {\n      const body = ConflictResponse.parse(await response.json());\n      return { kind: \"conflict\", version: body.version, scene: body.scene };\n    }\n    if (!response.ok) {\n      return { kind: \"error\" };\n    }\n    const body = SavedResponse.parse(await response.json());\n    return { kind: \"saved\", version: body.version };\n  } catch {\n    return { kind: \"error\" };\n  }\n}\n\nasync function getJson(url: string, what: string): Promise<unknown> {\n  const response = await fetch(url, {\n    headers: { Accept: \"application/json\" },\n  });\n  if (!response.ok) {\n    throw new Error(await detail(response, `Loading ${what} failed`));\n  }\n  return response.json();\n}\n\nexport async function fetchScenarioContext(\n  url: string,\n): Promise<ScenarioContext> {\n  return ScenarioContextSchema.parse(\n    await getJson(url, \"the retrofit options\"),\n  );\n}\n\nexport const MagicplanPlanSchema = z.object({\n  id: z.string(),\n  name: z.string(),\n  address: z.string(),\n  postcode: z.string(),\n  updated: z.string().nullable(),\n  thumbnail_url: z.string().nullable(),\n  match: z.boolean(),\n});\n\nexport type MagicplanPlan = z.infer<typeof MagicplanPlanSchema>;\n\nexport async function fetchMagicplanPlans(\n  url: string,\n): Promise<MagicplanPlan[]> {\n  return z\n    .object({ plans: z.array(MagicplanPlanSchema) })\n    .parse(await getJson(url, \"the magicplan plans\")).plans;\n}\n\nexport const MagicplanPreviewSchema = z.object({\n  name: z.string(),\n  floors_note: z.string().default(\"\"),\n  contents: z.object({\n    photos: z.number(),\n    videos: z.number(),\n    exports: z.array(z.string()),\n    notes: z.number(),\n    captions: z.number(),\n    forms: z.array(z.object({ title: z.string(), answered: z.number() })),\n    files: z.number(),\n    megabytes: z.number(),\n    postcode: z.string(),\n  }),\n  floors: z.array(\n    z.object({\n      uid: z.string(),\n      name: z.string(),\n      level: z.number(),\n      rooms: z.number(),\n      area_m2: z.string(),\n      doors: z.number(),\n      windows: z.number(),\n    }),\n  ),\n});\n\nexport type MagicplanPreview = z.infer<typeof MagicplanPreviewSchema>;\n\nexport async function fetchMagicplanPreview(\n  url: string,\n): Promise<MagicplanPreview> {\n  return MagicplanPreviewSchema.parse(await getJson(url, \"the plan\"));\n}\n\nconst ImportResponse = z.object({\n  design: DesignSchema,\n  warnings: z.array(z.string()),\n});\n\nexport async function postMagicplanImport(\n  url: string,\n  body: {\n    plan_id: string;\n    floors: string[];\n    replace: boolean;\n    confirmed: boolean;\n  },\n): Promise<z.infer<typeof ImportResponse>> {\n  return ImportResponse.parse(await send(url, \"POST\", body));\n}\n\nexport async function createPackage(\n  url: string,\n  body: Omit<DesignPackage, \"id\" | \"url\">,\n): Promise<DesignPackage> {\n  return DesignPackageSchema.parse(await send(url, \"POST\", body));\n}\n\n/** A copy of the scenario under a new name, with its annotations. */\nexport async function duplicatePackage(url: string): Promise<DesignPackage> {\n  return DesignPackageSchema.parse(await send(`${url}duplicate/`, \"POST\", {}));\n}\n\nexport async function patchPackage(\n  url: string,\n  body: Partial<DesignPackage>,\n): Promise<DesignPackage> {\n  return DesignPackageSchema.parse(await send(url, \"PATCH\", body));\n}\n\nexport async function deletePackage(url: string): Promise<void> {\n  await send(url, \"DELETE\");\n}\n\nconst SideSchema = z.object({\n  floors: z.array(z.object({ level: z.number(), scene: SceneSchema })),\n  fabric_types: z.array(\n    z.object({ id: z.number(), element: z.string(), name: z.string() }),\n  ),\n});\n\nexport const BringForwardSchema = z.object({\n  base: SideSchema.nullable(),\n  theirs: SideSchema,\n  token: z.string(),\n});\n\nexport async function fetchBringForward(\n  url: string,\n): Promise<z.infer<typeof BringForwardSchema>> {\n  return BringForwardSchema.parse(await send(url, \"GET\"));\n}\n\nexport async function postBringForward(\n  url: string,\n  token: string,\n): Promise<void> {\n  await send(url, \"POST\", { token });\n}\n", "import { FabricType, Scene } from \"./scene\";\nimport { wallKinds } from \"./topology\";\n\n// Resolution rule shared with the backend: a scene entity's `fabric` id\n// resolves to a matching-element type, and null/absent/dangling/mismatched\n// all fall back to the element's default type.\n\nexport type FabricElement = FabricType[\"element\"];\n\nexport function resolveFabric(\n  types: FabricType[],\n  element: FabricElement,\n  ref: number | null | undefined,\n): FabricType | null {\n  if (ref !== null && ref !== undefined) {\n    const match = types.find(\n      (type) => type.id === ref && type.element === element,\n    );\n    if (match) {\n      return match;\n    }\n  }\n  return (\n    types.find((type) => type.element === element && type.is_default) ?? null\n  );\n}\n\n// The default wall type renders in the standard wall colour so plans look\n// normal until types genuinely differ; non-default types take hues.\nexport const DEFAULT_WALL_COLOR = \"#334155\"; // slate-700\n\nconst TYPE_HUES = [\n  \"#b45309\", // amber-700\n  \"#0f766e\", // teal-700\n  \"#7e22ce\", // purple-700\n  \"#be123c\", // rose-700\n  \"#4d7c0f\", // lime-700\n  \"#1d4ed8\", // blue-700\n  \"#a21caf\", // fuchsia-700\n];\n\n/** A stable colour per wall type: default = standard, others by position\n * among the design's non-default wall types. */\nexport function fabricColor(\n  types: FabricType[],\n  type: FabricType | null,\n): string {\n  if (!type || type.is_default) {\n    return DEFAULT_WALL_COLOR;\n  }\n  const siblings = types.filter(\n    (candidate) => candidate.element === type.element && !candidate.is_default,\n  );\n  const index = siblings.findIndex((candidate) => candidate.id === type.id);\n  return TYPE_HUES[(index < 0 ? 0 : index) % TYPE_HUES.length] as string;\n}\n\n/** How many glass lines the window glyph draws. */\nexport function glazingLineCount(type: FabricType | null): number {\n  const glazing = String(type?.spec[\"glazing\"] ?? \"\");\n  if (glazing.startsWith(\"TRIPLE\")) {\n    return 3;\n  }\n  if (glazing.startsWith(\"SINGLE\")) {\n    return 1;\n  }\n  return 2; // double, secondary, unknown\n}\n\nexport function doorInsulated(type: FabricType | null): boolean {\n  return type?.spec[\"kind\"] === \"INSULATED\";\n}\n\nconst TITLES: Record<string, string> = {\n  AS_BUILT: \"as built\",\n  NONE: \"uninsulated\",\n  UNFILLED_CAVITY: \"unfilled cavity\",\n  FILLED_CAVITY: \"filled cavity\",\n  SYSTEM_BUILD: \"system build\",\n  PARK_HOME: \"park home\",\n  UNSEALED_SUSPENDED_TIMBER: \"suspended timber (unsealed)\",\n  SEALED_SUSPENDED_TIMBER: \"suspended timber (sealed)\",\n  SOLID_SLAB: \"solid slab\",\n  SINGLE_GLAZED: \"single glazed\",\n  DOUBLE_GLAZED: \"double glazed\",\n  DOUBLE_GLAZED_LOW_E_HARD_COAT: \"double glazed (low-E hard)\",\n  DOUBLE_GLAZED_LOW_E_SOFT_COAT: \"double glazed (low-E soft)\",\n  SECONDARY_GLAZED: \"secondary glazed\",\n  TRIPLE_GLAZED: \"triple glazed\",\n  TRIPLE_GLAZED_LOW_E_HARD_COAT: \"triple glazed (low-E hard)\",\n  TRIPLE_GLAZED_LOW_E_SOFT_COAT: \"triple glazed (low-E soft)\",\n};\n\nfunction word(value: unknown): string {\n  const key = String(value ?? \"\");\n  return TITLES[key] ?? key.toLowerCase().replaceAll(\"_\", \" \");\n}\n\n/** A one-line human summary of a type's spec for the fabric panel. */\nexport function specSummary(\n  type: FabricType,\n  ageLabels: Record<string, string> = {},\n): string {\n  const spec = type.spec;\n  if (type.element === \"WALL\") {\n    const insulation = spec[\"insulation\"] as\n      | { kind?: string; thickness_mm?: number | null }\n      | undefined;\n    const parts = [\n      word(spec[\"construction\"]),\n      spec[\"thickness_mm\"] ? `${String(spec[\"thickness_mm\"])} mm` : null,\n      `age ${ageLabels[String(spec[\"age\"])] ?? String(spec[\"age\"] ?? \"?\")}`,\n      insulation && insulation.kind !== \"AS_BUILT\"\n        ? `${word(insulation.kind)}${\n            insulation.thickness_mm ? ` ${insulation.thickness_mm} mm` : \"\"\n          }`\n        : word(\"AS_BUILT\"),\n      spec[\"kind\"] === \"EXTERNAL\" ? null : word(spec[\"kind\"]),\n    ];\n    return parts.filter(Boolean).join(\" \u00B7 \");\n  }\n  if (type.element === \"WINDOW\") {\n    return [\n      word(spec[\"glazing\"]),\n      word(spec[\"frame\"]).toUpperCase() === \"PVC\" ? \"PVC\" : word(spec[\"frame\"]),\n      spec[\"draught_proofed\"] ? \"draught proofed\" : null,\n    ]\n      .filter(Boolean)\n      .join(\" \u00B7 \");\n  }\n  if (type.element === \"DOOR\") {\n    return word(spec[\"kind\"]);\n  }\n  if (type.element === \"FLOOR\") {\n    return [\n      word(spec[\"construction\"]),\n      spec[\"insulation_thickness_mm\"]\n        ? `${String(spec[\"insulation_thickness_mm\"])} mm insulation`\n        : spec[\"insulation_thickness_mm\"] === 0\n          ? \"uninsulated\"\n          : \"as built\",\n    ].join(\" \u00B7 \");\n  }\n  return [\n    `${word(spec[\"insulation_kind\"])} insulation`,\n    spec[\"insulation_thickness_mm\"]\n      ? `${String(spec[\"insulation_thickness_mm\"])} mm`\n      : \"none\",\n    spec[\"room_in_roof\"] ? \"room in roof\" : null,\n  ]\n    .filter(Boolean)\n    .join(\" \u00B7 \");\n}\n\n/** How many walls, over every floor, use a wall type: the ones that name it,\n * and for the default the outside walls that name nothing. */\nexport function wallsUsing(scenes: Scene[], type: FabricType): number {\n  let count = 0;\n  for (const scene of scenes) {\n    const kinds = wallKinds(scene);\n    for (const wall of scene.walls) {\n      if (wall.fabric === type.id) {\n        count += 1;\n      } else if (\n        type.is_default &&\n        (wall.fabric === null || wall.fabric === undefined) &&\n        kinds.get(wall.id) !== \"INTERNAL\"\n      ) {\n        count += 1;\n      }\n    }\n  }\n  return count;\n}\n\n/** \"Used by 3 walls\". */\nexport function usedByText(count: number): string {\n  return `Used by ${count} ${count === 1 ? \"wall\" : \"walls\"}`;\n}\n\nexport type InsulationMode = \"NONE\" | \"AS_BUILT\" | \"ADDED\";\n\n/** Where added insulation goes: the twin's wall insulation kinds. */\nexport const INSULATION_PLACES: [string, string][] = [\n  [\"EXTERNAL\", \"Outside the wall\"],\n  [\"INTERNAL\", \"Inside the wall\"],\n  [\"FILLED_CAVITY\", \"In the cavity\"],\n  [\"CAVITY_AND_EXTERNAL\", \"Cavity and outside\"],\n  [\"CAVITY_AND_INTERNAL\", \"Cavity and inside\"],\n];\n\n/** The three-way choice behind a wall's insulation kind. Unknown reads as built. */\nexport function insulationChoice(kind: string): {\n  mode: InsulationMode;\n  place: string;\n} {\n  if (kind === \"NONE\") {\n    return { mode: \"NONE\", place: \"EXTERNAL\" };\n  }\n  if (INSULATION_PLACES.some(([place]) => place === kind)) {\n    return { mode: \"ADDED\", place: kind };\n  }\n  return { mode: \"AS_BUILT\", place: \"EXTERNAL\" };\n}\n\nexport function insulationKindOf(mode: InsulationMode, place: string): string {\n  return mode === \"ADDED\" ? place : mode;\n}\n\n/** The wall's U-value and where it came from, in a few words. */\nexport function wallUSource(\n  spec: {\n    construction: string;\n    age: string;\n    thicknessMm: number | null;\n    mode: InsulationMode;\n    place: string;\n    insulationMm: number | null;\n  },\n  measured: number | null,\n  ageLabels: Record<string, string> = {},\n): string {\n  if (measured !== null) {\n    return \"Measured\";\n  }\n  const thickness = spec.thicknessMm ? ` ${spec.thicknessMm}` : \"\";\n  const age = ageLabels[spec.age] ?? spec.age;\n  const base = `RdSAP default for ${word(spec.construction)}${thickness}, built ${age}`;\n  if (spec.mode === \"NONE\") {\n    return `${base}, uninsulated`;\n  }\n  if (spec.mode === \"ADDED\") {\n    const place = INSULATION_PLACES.find(([key]) => key === spec.place)?.[1];\n    const amount = spec.insulationMm ? `${spec.insulationMm} mm ` : \"\";\n    return `${base}, with ${amount}insulation ${(place ?? \"\").toLowerCase()}`.trim();\n  }\n  return base;\n}\n", "// Every scored package as a dot of cost against one outcome, with the frontier\n// drawn over them. Canvas, because a search can score tens of thousands.\n\nimport type { Metric, Packages } from \"./scenarios\";\n\nconst PAD = { left: 52, right: 28, top: 14, bottom: 34 };\n\nconst INK = {\n  axis: \"#94a3b8\", // slate-400\n  grid: \"#e2e8f0\", // slate-200\n  text: \"#64748b\", // slate-500\n  cloud: \"rgba(100, 116, 139, 0.28)\", // slate-500\n  frontier: \"#2563eb\", // blue-600\n  selected: \"#1e3a8a\", // blue-900\n  saved: \"#475569\", // slate-600\n  recommended: \"#15803d\", // green-700\n  surface: \"#ffffff\",\n};\n\n/** EPC band floors, drawn as faint reference lines on the SAP chart. */\nconst BAND_LINES: [string, number][] = [\n  [\"B\", 81],\n  [\"C\", 69],\n  [\"D\", 55],\n  [\"E\", 39],\n];\n\nconst HIT_PX = 10;\n\nexport interface Point {\n  cost: number;\n  value: number;\n}\n\n/** A kept package, lettered on the chart. */\nexport interface Marker extends Point {\n  label: string;\n  recommended: boolean;\n}\n\nfunction niceStep(span: number, ticks: number): number {\n  const raw = span / Math.max(ticks, 1);\n  const power = 10 ** Math.floor(Math.log10(raw || 1));\n  const scaled = raw / power;\n  const nice = scaled < 1.5 ? 1 : scaled < 3 ? 2 : scaled < 7 ? 5 : 10;\n  return nice * power;\n}\n\nexport function formatPounds(pence: number): string {\n  const pounds = pence / 100;\n  if (Math.abs(pounds) >= 1000) {\n    return `\u00A3${(pounds / 1000).toFixed(pounds >= 10_000 ? 0 : 1)}k`;\n  }\n  return `\u00A3${Math.round(pounds)}`;\n}\n\nexport function formatMetric(metric: Metric, value: number): string {\n  if (metric === \"sap\") {\n    return value.toFixed(0);\n  }\n  if (metric === \"bills\") {\n    return `\u00A3${Math.round(value).toLocaleString(\"en-GB\")}`;\n  }\n  return value >= 1000\n    ? `${(value / 1000).toFixed(1)} t`\n    : `${Math.round(value)} kg`;\n}\n\nexport class ScatterChart {\n  private packages: Packages | null = null;\n  private metric: Metric = \"sap\";\n  private front: number[] = [];\n  private selected: Point | null = null;\n  private markers: Marker[] = [];\n  private hovered: number | null = null;\n  private pointer: { x: number; y: number } | null = null;\n  private x0 = 0;\n  private x1 = 1;\n  private y0 = 0;\n  private y1 = 1;\n  private width = 0;\n  private height = 0;\n\n  constructor(\n    private readonly canvas: HTMLCanvasElement,\n    private readonly onPick: (index: number) => void,\n    private readonly onHover: (\n      index: number | null,\n      x: number,\n      y: number,\n    ) => void,\n  ) {\n    canvas.addEventListener(\"pointermove\", (event) => {\n      this.pointer = { x: event.clientX, y: event.clientY };\n      this.rehover();\n    });\n    canvas.addEventListener(\"pointerleave\", () => {\n      this.pointer = null;\n      this.hovered = null;\n      this.draw();\n      this.onHover(null, 0, 0);\n    });\n    // The pick is whatever the tooltip would name at the click itself, so the\n    // two can't disagree after a scroll or a redraw moved the dots under a\n    // still pointer.\n    canvas.addEventListener(\"click\", (event) => {\n      this.pointer = { x: event.clientX, y: event.clientY };\n      this.rehover();\n      if (this.hovered !== null) {\n        this.onPick(this.hovered);\n      }\n    });\n    // A scroll moves the chart under a still pointer without a pointermove.\n    window.addEventListener(\"scroll\", () => this.rehover(), {\n      capture: true,\n      passive: true,\n    });\n  }\n\n  /** The one hit test: tooltip and click both read `hovered`, set here. */\n  private rehover(): void {\n    const pointer = this.pointer;\n    if (!pointer) {\n      return;\n    }\n    const rect = this.canvas.getBoundingClientRect();\n    const x = pointer.x - rect.left;\n    const y = pointer.y - rect.top;\n    const index = this.hit(x, y);\n    if (index !== this.hovered) {\n      this.hovered = index;\n      this.draw();\n    }\n    this.onHover(index, x, y);\n  }\n\n  setData(packages: Packages | null, metric: Metric, front: number[]): void {\n    this.packages = packages;\n    this.metric = metric;\n    this.front = front;\n    this.fit();\n    this.draw();\n    // New dots under a still pointer: the tooltip must name them, not the old.\n    this.rehover();\n  }\n\n  setMarkers(markers: Marker[]): void {\n    this.markers = markers;\n    this.draw();\n  }\n\n  /** The package on show, which a manual pick can put off the searched set. */\n  setSelected(point: Point | null): void {\n    this.selected = point;\n    this.draw();\n  }\n\n  private values(): Float64Array | null {\n    return this.packages ? this.packages[this.metric] : null;\n  }\n\n  private fit(): void {\n    const values = this.values();\n    const packages = this.packages;\n    if (!packages || !values || packages.count === 0) {\n      return;\n    }\n    let maxCost = 0;\n    let low = Infinity;\n    let high = -Infinity;\n    for (let index = 0; index < packages.count; index++) {\n      maxCost = Math.max(maxCost, packages.cost[index] ?? 0);\n      low = Math.min(low, values[index] ?? 0);\n      high = Math.max(high, values[index] ?? 0);\n    }\n    const margin = Math.max((high - low) * 0.06, 1);\n    this.x0 = 0;\n    this.x1 = Math.max(maxCost * 1.04, 100);\n    this.y0 = Math.max(0, low - margin);\n    this.y1 =\n      this.metric === \"sap\" ? Math.min(110, high + margin) : high + margin;\n  }\n\n  private sx(cost: number): number {\n    const span = this.width - PAD.left - PAD.right;\n    return PAD.left + ((cost - this.x0) / (this.x1 - this.x0 || 1)) * span;\n  }\n\n  private sy(value: number): number {\n    const span = this.height - PAD.top - PAD.bottom;\n    return (\n      this.height -\n      PAD.bottom -\n      ((value - this.y0) / (this.y1 - this.y0 || 1)) * span\n    );\n  }\n\n  private hit(x: number, y: number): number | null {\n    const packages = this.packages;\n    const values = this.values();\n    if (!packages || !values) {\n      return null;\n    }\n    let best: number | null = null;\n    let bestDistance = HIT_PX * HIT_PX;\n    // The frontier wins ties: it is what people are reading.\n    for (const index of this.front) {\n      const dx = this.sx(packages.cost[index] ?? 0) - x;\n      const dy = this.sy(values[index] ?? 0) - y;\n      const distance = dx * dx + dy * dy;\n      if (distance <= bestDistance) {\n        best = index;\n        bestDistance = distance;\n      }\n    }\n    if (best !== null) {\n      return best;\n    }\n    const tight = (HIT_PX / 2) ** 2;\n    for (let index = 0; index < packages.count; index++) {\n      const dx = this.sx(packages.cost[index] ?? 0) - x;\n      const dy = this.sy(values[index] ?? 0) - y;\n      const distance = dx * dx + dy * dy;\n      if (distance <= tight && distance < bestDistance) {\n        best = index;\n        bestDistance = distance;\n      }\n    }\n    return best;\n  }\n\n  draw(): void {\n    const rect = this.canvas.getBoundingClientRect();\n    const ratio = window.devicePixelRatio || 1;\n    this.width = Math.max(rect.width, 1);\n    this.height = Math.max(rect.height, 1);\n    this.canvas.width = Math.round(this.width * ratio);\n    this.canvas.height = Math.round(this.height * ratio);\n    const context = this.canvas.getContext(\"2d\");\n    if (!context) {\n      return;\n    }\n    context.setTransform(ratio, 0, 0, ratio, 0, 0);\n    context.clearRect(0, 0, this.width, this.height);\n    context.font = \"11px ui-sans-serif, system-ui, sans-serif\";\n\n    const packages = this.packages;\n    const values = this.values();\n    if (!packages || !values || packages.count === 0) {\n      return;\n    }\n\n    this.axes(context);\n\n    context.fillStyle = INK.cloud;\n    for (let index = 0; index < packages.count; index++) {\n      context.fillRect(\n        this.sx(packages.cost[index] ?? 0) - 1,\n        this.sy(values[index] ?? 0) - 1,\n        2.5,\n        2.5,\n      );\n    }\n\n    context.strokeStyle = INK.frontier;\n    context.lineWidth = 2;\n    context.lineJoin = \"round\";\n    context.beginPath();\n    this.front.forEach((index, n) => {\n      const x = this.sx(packages.cost[index] ?? 0);\n      const y = this.sy(values[index] ?? 0);\n      if (n === 0) {\n        context.moveTo(x, y);\n      } else {\n        context.lineTo(x, y);\n      }\n    });\n    context.stroke();\n    for (const index of this.front) {\n      this.dot(\n        context,\n        this.sx(packages.cost[index] ?? 0),\n        this.sy(values[index] ?? 0),\n        index === this.hovered ? 6 : 4,\n        INK.frontier,\n      );\n    }\n\n    if (this.hovered !== null && !this.front.includes(this.hovered)) {\n      this.dot(\n        context,\n        this.sx(packages.cost[this.hovered] ?? 0),\n        this.sy(values[this.hovered] ?? 0),\n        5,\n        INK.text,\n      );\n    }\n\n    context.font = \"600 10px ui-sans-serif, system-ui, sans-serif\";\n    context.textAlign = \"center\";\n    context.textBaseline = \"middle\";\n    for (const marker of this.markers) {\n      const x = this.sx(marker.cost);\n      const y = this.sy(marker.value);\n      this.dot(\n        context,\n        x,\n        y,\n        8,\n        marker.recommended ? INK.recommended : INK.saved,\n      );\n      context.fillStyle = INK.surface;\n      context.fillText(marker.label, x, y + 0.5);\n    }\n\n    if (this.selected) {\n      const x = this.sx(this.selected.cost);\n      const y = this.sy(this.selected.value);\n      context.strokeStyle = INK.surface;\n      context.lineWidth = 5;\n      context.beginPath();\n      context.arc(x, y, 8, 0, Math.PI * 2);\n      context.stroke();\n      context.strokeStyle = INK.selected;\n      context.lineWidth = 2.5;\n      context.beginPath();\n      context.arc(x, y, 8, 0, Math.PI * 2);\n      context.stroke();\n    }\n  }\n\n  private dot(\n    context: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    radius: number,\n    color: string,\n  ): void {\n    context.fillStyle = INK.surface;\n    context.beginPath();\n    context.arc(x, y, radius + 2, 0, Math.PI * 2);\n    context.fill();\n    context.fillStyle = color;\n    context.beginPath();\n    context.arc(x, y, radius, 0, Math.PI * 2);\n    context.fill();\n  }\n\n  private axes(context: CanvasRenderingContext2D): void {\n    const right = this.width - PAD.right;\n    const bottom = this.height - PAD.bottom;\n\n    context.lineWidth = 1;\n    context.textBaseline = \"middle\";\n    context.textAlign = \"right\";\n    const yStep = niceStep(this.y1 - this.y0, 4);\n    for (\n      let value = Math.ceil(this.y0 / yStep) * yStep;\n      value <= this.y1;\n      value += yStep\n    ) {\n      const y = Math.round(this.sy(value)) + 0.5;\n      context.strokeStyle = INK.grid;\n      context.beginPath();\n      context.moveTo(PAD.left, y);\n      context.lineTo(right, y);\n      context.stroke();\n      context.fillStyle = INK.text;\n      context.fillText(formatMetric(this.metric, value), PAD.left - 6, y);\n    }\n\n    if (this.metric === \"sap\") {\n      context.textAlign = \"left\";\n      context.setLineDash([3, 3]);\n      for (const [letter, floor] of BAND_LINES) {\n        if (floor < this.y0 || floor > this.y1) {\n          continue;\n        }\n        const y = Math.round(this.sy(floor)) + 0.5;\n        context.strokeStyle = INK.axis;\n        context.beginPath();\n        context.moveTo(PAD.left, y);\n        context.lineTo(right, y);\n        context.stroke();\n        context.fillStyle = INK.text;\n        context.fillText(letter, right + 6, y);\n      }\n      context.setLineDash([]);\n    }\n\n    context.textAlign = \"center\";\n    context.textBaseline = \"top\";\n    const xStep = niceStep(this.x1 - this.x0, 5);\n    for (let cost = 0; cost <= this.x1; cost += xStep) {\n      const x = Math.round(this.sx(cost)) + 0.5;\n      context.strokeStyle = INK.axis;\n      context.beginPath();\n      context.moveTo(x, bottom);\n      context.lineTo(x, bottom + 4);\n      context.stroke();\n      context.fillStyle = INK.text;\n      context.fillText(formatPounds(cost), x, bottom + 7);\n    }\n    context.strokeStyle = INK.axis;\n    context.beginPath();\n    context.moveTo(PAD.left, bottom + 0.5);\n    context.lineTo(right, bottom + 0.5);\n    context.stroke();\n  }\n}\n", "{\n \"source\": \"CIBSE Domestic Heating Design Guide 2026-02, section 2.5.4-2.5.5: Tables 2-11 to 2-16.\",\n \"air_capacity\": 0.34,\n \"orientation_factor\": 2,\n \"air_permeability\": {\n  \"all\": 8.6,\n  \"built_form\": {\n   \"Flat\": 7.3,\n   \"Terrace\": 9.1,\n   \"Semi-detached\": 9.2,\n   \"Detached\": 8.7,\n   \"Bungalow\": 7.6\n  },\n  \"age_band\": {\n   \"Pre 1919\": 8.9,\n   \"1919-1944\": 8.7,\n   \"1945-1964\": 8.1,\n   \"1965-1980\": 7.9,\n   \"1981-1990\": 8.6,\n   \"Post 1990\": 9.3\n  },\n  \"wall\": {\n   \"Cavity uninsulated\": 8.2,\n   \"Cavity with insulation\": 8.6,\n   \"Solid uninsulated\": 8.9,\n   \"Solid with insulation\": 8.2,\n   \"Other\": 7.9\n  }\n },\n \"additions_m3h\": {\n  \"vent\": 54,\n  \"fan\": 54,\n  \"flue_small\": 109,\n  \"flue_large\": 435,\n  \"open_fire\": 109\n },\n \"typical_factor\": {\n  \"height_bands_m\": [\n   5,\n   10,\n   20\n  ],\n  \"sheltered\": [\n   0.03,\n   0.05,\n   0.08,\n   0.11\n  ],\n  \"average\": [\n   0.05,\n   0.05,\n   0.08,\n   0.11\n  ],\n  \"exposed\": [\n   0.07,\n   0.07,\n   0.08,\n   0.11\n  ]\n },\n \"minimum_ach\": {\n  \"living\": 0.5,\n  \"wet\": 0.5,\n  \"other\": 0\n },\n \"reheat_setback\": {\n  \"reheat_h\": [\n   0.5,\n   1,\n   2,\n   3,\n   4\n  ],\n  \"drop_c\": [\n   1,\n   2,\n   3,\n   4,\n   5\n  ],\n  \"low\": [\n   [\n    14,\n    29,\n    44,\n    58,\n    null\n   ],\n   [\n    10,\n    21,\n    32,\n    41,\n    null\n   ],\n   [\n    7,\n    13,\n    21,\n    28,\n    47\n   ],\n   [\n    5,\n    10,\n    15,\n    21,\n    37\n   ],\n   [\n    4,\n    8,\n    13,\n    17,\n    31\n   ]\n  ],\n  \"high\": [\n   [\n    18,\n    35,\n    53,\n    69,\n    null\n   ],\n   [\n    14,\n    28,\n    43,\n    56,\n    null\n   ],\n   [\n    11,\n    22,\n    33,\n    43,\n    94\n   ],\n   [\n    10,\n    19,\n    27,\n    37,\n    84\n   ],\n   [\n    9,\n    17,\n    25,\n    34,\n    76\n   ]\n  ]\n },\n \"reheat_disuse\": {\n  \"reheat_h\": [\n   0.5,\n   1,\n   2,\n   3,\n   4,\n   6,\n   12\n  ],\n  \"disuse_h\": [\n   8,\n   11\n  ],\n  \"low\": [\n   [\n    74,\n    83\n   ],\n   [\n    43,\n    47\n   ],\n   [\n    21,\n    25\n   ],\n   [\n    10,\n    14\n   ],\n   [\n    3,\n    8\n   ],\n   [\n    0,\n    3\n   ],\n   [\n    0,\n    0\n   ]\n  ],\n  \"high\": [\n   [\n    26,\n    41\n   ],\n   [\n    16,\n    30\n   ],\n   [\n    8,\n    19\n   ],\n   [\n    2,\n    12\n   ],\n   [\n    0,\n    8\n   ],\n   [\n    0,\n    3\n   ],\n   [\n    0,\n    0\n   ]\n  ]\n }\n}", "// Ventilation heat loss by the DHDG's reduced BS EN 12831-1 method (section\n// 2.5.4, Worksheet A2 stages 4 to 6): the room leaks through its exposed\n// envelope at the dwelling's air permeability, plus what its vents, fans and\n// flues add, scaled from 50 Pa to a typical day.\n\nimport data from \"../../../apps/design/dhdg/ventilation.json\";\n\nexport type Exposure = \"sheltered\" | \"average\" | \"exposed\";\n\nexport type BuiltForm = keyof typeof data.air_permeability.built_form;\nexport type AgeBand = keyof typeof data.air_permeability.age_band;\nexport type WallType = keyof typeof data.air_permeability.wall;\n\nexport const AIR_CAPACITY = data.air_capacity;\n\nexport interface PermeabilityBasis {\n  builtForm: BuiltForm | null;\n  ageBand: AgeBand | null;\n  wallType: WallType | null;\n}\n\n/**\n * Table 2-11, with no air test: the dwelling's mean by built form, age and wall,\n * taking the highest of those known, as the DHDG suggests when they disagree.\n */\nexport function defaultAirPermeability(basis: PermeabilityBasis): {\n  q50: number;\n  from: string;\n} {\n  const candidates: [number, string][] = [];\n  const table = data.air_permeability;\n  if (basis.builtForm) {\n    candidates.push([table.built_form[basis.builtForm], basis.builtForm]);\n  }\n  if (basis.ageBand) {\n    candidates.push([table.age_band[basis.ageBand], basis.ageBand]);\n  }\n  if (basis.wallType) {\n    candidates.push([table.wall[basis.wallType], basis.wallType]);\n  }\n  if (candidates.length === 0) {\n    return { q50: table.all, from: \"All dwellings\" };\n  }\n  const [q50, from] = candidates.reduce((best, next) =>\n    next[0] > best[0] ? next : best,\n  );\n  return { q50, from };\n}\n\n/** Table 2-13: 50 Pa to a typical pressure, by shielding and building height. */\nexport function typicalFactor(exposure: Exposure, heightM: number): number {\n  const bands = data.typical_factor.height_bands_m;\n  let index = bands.findIndex((limit) => heightM <= limit);\n  if (index < 0) {\n    index = bands.length;\n  }\n  return data.typical_factor[exposure][index] ?? 0.05;\n}\n\nexport interface RoomFeatures {\n  backgroundVents: number;\n  extractFans: number;\n  openFlues: number;\n}\n\n/** Table 2-12, m\u00B3/h at 50 Pa. Open flues are taken as blocked-off flues or open fires. */\nexport function additionsM3h(features: RoomFeatures): number {\n  const add = data.additions_m3h;\n  return (\n    features.backgroundVents * add.vent +\n    features.extractFans * add.fan +\n    features.openFlues * add.open_fire\n  );\n}\n\n/** Table 2-14: living rooms, kitchens and bathrooms need half an air change. */\nexport function minimumAch(type: string): number {\n  const living = [\n    \"living\",\n    \"dining\",\n    \"breakfast\",\n    \"games\",\n    \"study\",\n    \"bedroom-study\",\n  ];\n  const wet = [\"kitchen\", \"bathroom\", \"shower\", \"wc\", \"utility\"];\n  if (living.includes(type)) {\n    return data.minimum_ach.living;\n  }\n  if (wet.includes(type)) {\n    return data.minimum_ach.wet;\n  }\n  return data.minimum_ach.other;\n}\n\nexport type System =\n  | { kind: \"natural\" }\n  /** Continuous extract, balanced in the room, no heat recovery. */\n  | { kind: \"extract\" }\n  /** Heat recovery, with the unit's efficiency as a fraction. */\n  | { kind: \"mvhr\"; efficiency: number };\n\nexport interface RoomVentilationInput {\n  /** m\u00B2, the surfaces that leak to outside (Worksheet A2 cell 400). */\n  envelopeM2: number;\n  q50: number;\n  features: RoomFeatures;\n  factor: number;\n  volumeM3: number;\n  type: string;\n  /** m\u00B3/h continuously extracted and resupplied, where there's a system. */\n  continuousM3h: number;\n  system: System;\n  internalC: number;\n  designC: number;\n  referenceC: number;\n}\n\nexport interface RoomVentilation {\n  envelopeM2: number;\n  leakage50M3h: number;\n  additionsM3h: number;\n  factor: number;\n  /** m\u00B3/h on a typical day: cell 406. */\n  leakageM3h: number;\n  minimumM3h: number;\n  /** Below the room's minimum: worth more ventilation, not more watts. */\n  underVentilated: boolean;\n  continuousM3h: number;\n  /** W, with the \u00D72 orientation factor: sizes the room's emitter (cell 604). */\n  designW: number;\n  /** W, without it: what the heat generator has to cover (cell 606). */\n  generatorW: number;\n  /** W on a typical day (cell 610). */\n  typicalW: number;\n}\n\n/** MVHR supply temperature, Equation 2.4. */\nfunction supplyC(\n  outsideC: number,\n  insideC: number,\n  efficiency: number,\n): number {\n  return outsideC + efficiency * (insideC - outsideC);\n}\n\nexport function roomVentilation(input: RoomVentilationInput): RoomVentilation {\n  const leakage50 = input.envelopeM2 * input.q50;\n  const additions = additionsM3h(input.features);\n  const leakage = (leakage50 + additions) * input.factor;\n  const minimum = input.volumeM3 * minimumAch(input.type);\n\n  const designDelta = input.internalC - input.designC;\n  const typicalDelta = input.internalC - input.referenceC;\n\n  let continuousDesignDelta = 0;\n  let continuousTypicalDelta = 0;\n  const continuous = input.system.kind === \"natural\" ? 0 : input.continuousM3h;\n  if (input.system.kind === \"extract\") {\n    continuousDesignDelta = designDelta;\n    continuousTypicalDelta = typicalDelta;\n  } else if (input.system.kind === \"mvhr\") {\n    const { efficiency } = input.system;\n    continuousDesignDelta =\n      input.internalC - supplyC(input.designC, input.internalC, efficiency);\n    continuousTypicalDelta =\n      input.internalC - supplyC(input.referenceC, input.internalC, efficiency);\n  }\n\n  const leakageDesign = leakage * designDelta;\n  const leakageTypical = leakage * typicalDelta;\n  const continuousDesign = continuous * continuousDesignDelta;\n  const continuousTypical = continuous * continuousTypicalDelta;\n\n  return {\n    envelopeM2: input.envelopeM2,\n    leakage50M3h: leakage50,\n    additionsM3h: additions,\n    factor: input.factor,\n    leakageM3h: leakage,\n    minimumM3h: minimum,\n    underVentilated: leakage + continuous < minimum,\n    continuousM3h: continuous,\n    designW:\n      (leakageDesign * data.orientation_factor + continuousDesign) *\n      AIR_CAPACITY,\n    generatorW: (leakageDesign + continuousDesign) * AIR_CAPACITY,\n    typicalW: (leakageTypical + continuousTypical) * AIR_CAPACITY,\n  };\n}\n\nexport type ThermalMass = \"low\" | \"high\";\n\nexport type Heating =\n  /** Constant heating, or start/stop optimisation: no reheat allowance. */\n  | { kind: \"constant\" }\n  | { kind: \"setback\"; dropC: number; reheatH: number; mass: ThermalMass }\n  | {\n      kind: \"intermittent\";\n      disuseH: number;\n      reheatH: number;\n      mass: ThermalMass;\n      dropC: number | null;\n    };\n\nfunction nearestAtLeast(values: readonly number[], wanted: number): number {\n  const index = values.findIndex((value) => value >= wanted);\n  return index < 0 ? values.length - 1 : index;\n}\n\n/** A reheat time between rows takes the shorter one: the larger allowance. */\nfunction nearestAtMost(values: readonly number[], wanted: number): number {\n  let found = 0;\n  values.forEach((value, index) => {\n    if (value <= wanted) {\n      found = index;\n    }\n  });\n  return found;\n}\n\n/**\n * Table 2-15 leaves a 5 \u00B0C setback blank for reheats under 2 h: read on to the\n * next reheat time with a figure, the most the table allows for that drop.\n */\nfunction setbackCell(\n  dropC: number,\n  reheatH: number,\n  mass: ThermalMass,\n): { w: number; atH: number } | null {\n  const table = data.reheat_setback;\n  const column = nearestAtLeast(table.drop_c, dropC);\n  for (\n    let row = nearestAtMost(table.reheat_h, reheatH);\n    row < table.reheat_h.length;\n    row++\n  ) {\n    const w = table[mass][row]?.[column];\n    if (w !== null && w !== undefined) {\n      return { w, atH: table.reheat_h[row] as number };\n    }\n  }\n  return null;\n}\n\n/** The longer reheat time Table 2-15 was read at, where it has no figure for the one asked. */\nexport function setbackReadLonger(heating: Heating): number | null {\n  if (heating.kind === \"constant\" || heating.dropC === null) {\n    return null;\n  }\n  const hours = data.reheat_setback.reheat_h;\n  const asked = hours[nearestAtMost(hours, heating.reheatH)];\n  const cell = setbackCell(heating.dropC, heating.reheatH, heating.mass);\n  return cell && cell.atH !== asked ? cell.atH : null;\n}\n\n/** Tables 2-15 and 2-16: W/m\u00B2 of floor to reheat after a setback or time off. */\nexport function reheatWPerM2(heating: Heating): number {\n  if (heating.kind === \"constant\") {\n    return 0;\n  }\n  const setback = (dropC: number) =>\n    setbackCell(dropC, heating.reheatH, heating.mass)?.w ?? 0;\n  if (heating.kind === \"setback\") {\n    return setback(heating.dropC);\n  }\n  const table = data.reheat_disuse;\n  const row =\n    table[heating.mass][nearestAtMost(table.reheat_h, heating.reheatH)];\n  const disuse = row?.[nearestAtLeast(table.disuse_h, heating.disuseH)] ?? 0;\n  const withSetback = heating.dropC === null ? 0 : setback(heating.dropC);\n  return Math.max(disuse, withSetback);\n}\n", "{\n \"source\": \"CIBSE Domestic Heating Design Guide 2026-02, section 2.5.2: Tables 2-2, 2-3, 2-4; Figure 2-12.\",\n \"rooms\": {\n  \"living\": {\n   \"label\": \"Living room\",\n   \"pre_2006\": 21\n  },\n  \"dining\": {\n   \"label\": \"Dining room\",\n   \"pre_2006\": 21\n  },\n  \"breakfast\": {\n   \"label\": \"Breakfast or family room\",\n   \"pre_2006\": 21\n  },\n  \"games\": {\n   \"label\": \"Games room\",\n   \"pre_2006\": 21\n  },\n  \"study\": {\n   \"label\": \"Study\",\n   \"pre_2006\": 21\n  },\n  \"kitchen\": {\n   \"label\": \"Kitchen\",\n   \"pre_2006\": 18\n  },\n  \"hall\": {\n   \"label\": \"Hall\",\n   \"pre_2006\": 18\n  },\n  \"landing\": {\n   \"label\": \"Landing\",\n   \"pre_2006\": 18\n  },\n  \"corridor\": {\n   \"label\": \"Internal room or corridor\",\n   \"pre_2006\": 18\n  },\n  \"wc\": {\n   \"label\": \"Cloakroom or WC\",\n   \"pre_2006\": 18\n  },\n  \"utility\": {\n   \"label\": \"Utility room\",\n   \"pre_2006\": 18\n  },\n  \"bedroom\": {\n   \"label\": \"Bedroom\",\n   \"pre_2006\": 18\n  },\n  \"bedroom-ensuite\": {\n   \"label\": \"Bedroom with en suite\",\n   \"pre_2006\": 21\n  },\n  \"bedroom-study\": {\n   \"label\": \"Bedroom/study\",\n   \"pre_2006\": 21\n  },\n  \"dressing\": {\n   \"label\": \"Dressing room\",\n   \"pre_2006\": 18\n  },\n  \"store\": {\n   \"label\": \"Store room\",\n   \"pre_2006\": 18\n  },\n  \"bathroom\": {\n   \"label\": \"Bathroom\",\n   \"pre_2006\": 22\n  },\n  \"shower\": {\n   \"label\": \"Shower room\",\n   \"pre_2006\": 22\n  }\n },\n \"post_2006\": {\n  \"default\": 21,\n  \"bathroom\": 22,\n  \"shower\": 22\n },\n \"fallback\": \"living\",\n \"synonyms\": {\n  \"lounge\": \"living\",\n  \"sitting\": \"living\",\n  \"sitting room\": \"living\",\n  \"living room\": \"living\",\n  \"front room\": \"living\",\n  \"reception\": \"living\",\n  \"family room\": \"breakfast\",\n  \"playroom\": \"living\",\n  \"snug\": \"living\",\n  \"conservatory\": \"living\",\n  \"dining room\": \"dining\",\n  \"diner\": \"dining\",\n  \"breakfast room\": \"breakfast\",\n  \"kitchen diner\": \"kitchen\",\n  \"office\": \"study\",\n  \"hallway\": \"hall\",\n  \"entrance\": \"hall\",\n  \"porch\": \"hall\",\n  \"stairs\": \"landing\",\n  \"staircase\": \"landing\",\n  \"stairwell\": \"landing\",\n  \"passage\": \"corridor\",\n  \"toilet\": \"wc\",\n  \"cloakroom\": \"wc\",\n  \"half bathroom\": \"wc\",\n  \"laundry\": \"utility\",\n  \"laundry room\": \"utility\",\n  \"utility room\": \"utility\",\n  \"boot room\": \"utility\",\n  \"bed\": \"bedroom\",\n  \"master\": \"bedroom\",\n  \"master bedroom\": \"bedroom\",\n  \"box room\": \"bedroom\",\n  \"nursery\": \"bedroom\",\n  \"en suite\": \"shower\",\n  \"ensuite\": \"shower\",\n  \"bath\": \"bathroom\",\n  \"shower room\": \"shower\",\n  \"storage\": \"store\",\n  \"cupboard\": \"store\",\n  \"closet\": \"store\",\n  \"airing cupboard\": \"store\",\n  \"pantry\": \"store\",\n  \"larder\": \"store\",\n  \"garage\": \"store\",\n  \"dressing room\": \"dressing\",\n  \"games room\": \"games\",\n  \"hatched room\": \"landing\"\n },\n \"zones\": [\n  {\n   \"zone\": 1,\n   \"design\": {\n    \"99.6\": -3.8,\n    \"99\": -2.3,\n    \"98\": -1.1,\n    \"95\": 1.0\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 30\n   },\n   \"reference\": 11.3\n  },\n  {\n   \"zone\": 2,\n   \"design\": {\n    \"99.6\": -1.7,\n    \"99\": -0.5,\n    \"98\": 0.5,\n    \"95\": 2.2\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 10,\n    \"95\": 24\n   },\n   \"reference\": 11.1\n  },\n  {\n   \"zone\": 3,\n   \"design\": {\n    \"99.6\": -2.9,\n    \"99\": -1.6,\n    \"98\": -0.5,\n    \"95\": 1.3\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 28\n   },\n   \"reference\": 11.1\n  },\n  {\n   \"zone\": 4,\n   \"design\": {\n    \"99.6\": -3.0,\n    \"99\": -1.7,\n    \"98\": -0.5,\n    \"95\": 1.2\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 26\n   },\n   \"reference\": 11.0\n  },\n  {\n   \"zone\": 5,\n   \"design\": {\n    \"99.6\": -1.8,\n    \"99\": -0.5,\n    \"98\": 0.8,\n    \"95\": 2.8\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 12,\n    \"95\": 27\n   },\n   \"reference\": 11.3\n  },\n  {\n   \"zone\": 6,\n   \"design\": {\n    \"99.6\": -0.7,\n    \"99\": 0.6,\n    \"98\": 1.7,\n    \"95\": 3.4\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 10,\n    \"95\": 24\n   },\n   \"reference\": 10.9\n  },\n  {\n   \"zone\": 7,\n   \"design\": {\n    \"99.6\": -1.4,\n    \"99\": -0.4,\n    \"98\": 0.6,\n    \"95\": 2.2\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 4,\n    \"98\": 9,\n    \"95\": 23\n   },\n   \"reference\": 10.5\n  },\n  {\n   \"zone\": 8,\n   \"design\": {\n    \"99.6\": -4.1,\n    \"99\": -2.6,\n    \"98\": -1.4,\n    \"95\": 0.4\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 27\n   },\n   \"reference\": 10.3\n  },\n  {\n   \"zone\": 9,\n   \"design\": {\n    \"99.6\": -2.3,\n    \"99\": -1.1,\n    \"98\": -0.2,\n    \"95\": 1.4\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 9,\n    \"95\": 24\n   },\n   \"reference\": 10.6\n  },\n  {\n   \"zone\": 10,\n   \"design\": {\n    \"99.6\": -4.2,\n    \"99\": -2.5,\n    \"98\": -1.1,\n    \"95\": 1.0\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 27\n   },\n   \"reference\": 10.3\n  },\n  {\n   \"zone\": 11,\n   \"design\": {\n    \"99.6\": -1.8,\n    \"99\": -0.7,\n    \"98\": 0.2,\n    \"95\": 1.6\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 9,\n    \"95\": 24\n   },\n   \"reference\": 10.0\n  },\n  {\n   \"zone\": 12,\n   \"design\": {\n    \"99.6\": -4.5,\n    \"99\": -2.9,\n    \"98\": -1.6,\n    \"95\": 0.8\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 12,\n    \"95\": 29\n   },\n   \"reference\": 10.3\n  },\n  {\n   \"zone\": 13,\n   \"design\": {\n    \"99.6\": -3.8,\n    \"99\": -2.1,\n    \"98\": -0.8,\n    \"95\": 1.3\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 6,\n    \"98\": 11,\n    \"95\": 25\n   },\n   \"reference\": 10.3\n  },\n  {\n   \"zone\": 14,\n   \"design\": {\n    \"99.6\": -4.4,\n    \"99\": -2.8,\n    \"98\": -1.5,\n    \"95\": 0.4\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 7,\n    \"98\": 13,\n    \"95\": 30\n   },\n   \"reference\": 9.7\n  },\n  {\n   \"zone\": 15,\n   \"design\": {\n    \"99.6\": -3.3,\n    \"99\": -1.7,\n    \"98\": -0.6,\n    \"95\": 0.9\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 10,\n    \"95\": 22\n   },\n   \"reference\": 9.2\n  },\n  {\n   \"zone\": 16,\n   \"design\": {\n    \"99.6\": -4.9,\n    \"99\": -3.1,\n    \"98\": -1.7,\n    \"95\": 0.3\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 26\n   },\n   \"reference\": 9.2\n  },\n  {\n   \"zone\": 17,\n   \"design\": {\n    \"99.6\": -5.0,\n    \"99\": -3.1,\n    \"98\": -1.7,\n    \"95\": 0.2\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 7,\n    \"98\": 13,\n    \"95\": 29\n   },\n   \"reference\": 9.0\n  },\n  {\n   \"zone\": 18,\n   \"design\": {\n    \"99.6\": -5.3,\n    \"99\": -3.3,\n    \"98\": -1.5,\n    \"95\": 0.8\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 7,\n    \"98\": 13,\n    \"95\": 29\n   },\n   \"reference\": 9.8\n  },\n  {\n   \"zone\": 19,\n   \"design\": {\n    \"99.6\": -2.6,\n    \"99\": -1.0,\n    \"98\": 0.2,\n    \"95\": 1.8\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 27\n   },\n   \"reference\": 9.9\n  },\n  {\n   \"zone\": 20,\n   \"design\": {\n    \"99.6\": -0.5,\n    \"99\": 0.5,\n    \"98\": 1.3,\n    \"95\": 2.6\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 9,\n    \"95\": 23\n   },\n   \"reference\": 9.7\n  },\n  {\n   \"zone\": 21,\n   \"design\": {\n    \"99.6\": -4.3,\n    \"99\": -2.2,\n    \"98\": -0.8,\n    \"95\": 1.0\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 6,\n    \"98\": 12,\n    \"95\": 26\n   },\n   \"reference\": 9.0\n  },\n  {\n   \"zone\": 22,\n   \"design\": {\n    \"99.6\": -6.2,\n    \"99\": -4.3,\n    \"98\": -2.8,\n    \"95\": -0.6\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 7,\n    \"98\": 12,\n    \"95\": 30\n   },\n   \"reference\": 8.8\n  },\n  {\n   \"zone\": 23,\n   \"design\": {\n    \"99.6\": -7.4,\n    \"99\": -4.5,\n    \"98\": -2.5,\n    \"95\": -0.1\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 7,\n    \"98\": 12,\n    \"95\": 28\n   },\n   \"reference\": 8.9\n  },\n  {\n   \"zone\": 24,\n   \"design\": {\n    \"99.6\": -7.1,\n    \"99\": -4.2,\n    \"98\": -2.1,\n    \"95\": 0.4\n   },\n   \"shortfall_days\": {\n    \"99.6\": 3,\n    \"99\": 7,\n    \"98\": 13,\n    \"95\": 28\n   },\n   \"reference\": 9.0\n  },\n  {\n   \"zone\": 25,\n   \"design\": {\n    \"99.6\": -2.9,\n    \"99\": -1.6,\n    \"98\": -0.4,\n    \"95\": 1.5\n   },\n   \"shortfall_days\": {\n    \"99.6\": 1,\n    \"99\": 3,\n    \"98\": 6,\n    \"95\": 19\n   },\n   \"reference\": 9.0\n  },\n  {\n   \"zone\": 26,\n   \"design\": {\n    \"99.6\": -2.9,\n    \"99\": -1.6,\n    \"98\": -0.4,\n    \"95\": 1.5\n   },\n   \"shortfall_days\": {\n    \"99.6\": 1,\n    \"99\": 3,\n    \"98\": 6,\n    \"95\": 19\n   },\n   \"reference\": 9.0\n  },\n  {\n   \"zone\": 27,\n   \"design\": {\n    \"99.6\": -1.8,\n    \"99\": -0.5,\n    \"98\": 0.6,\n    \"95\": 2.1\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 11,\n    \"95\": 26\n   },\n   \"reference\": 9.3\n  },\n  {\n   \"zone\": 28,\n   \"design\": {\n    \"99.6\": -1.9,\n    \"99\": -0.8,\n    \"98\": 0.2,\n    \"95\": 1.5\n   },\n   \"shortfall_days\": {\n    \"99.6\": 2,\n    \"99\": 5,\n    \"98\": 10,\n    \"95\": 21\n   },\n   \"reference\": 8.0\n  }\n ],\n \"elevation\": {\n  \"free_m\": 50,\n  \"step_m\": 50,\n  \"per_step_c\": 0.3\n },\n \"adjoining\": {\n  \"heated_c\": 15,\n  \"unheated_c\": 5\n },\n \"high_ceiling\": [\n  [\n   2.3,\n   1.0\n  ],\n  [\n   3.4,\n   1.01\n  ],\n  [\n   4.1,\n   1.02\n  ],\n  [\n   4.65,\n   1.03\n  ],\n  [\n   5.1,\n   1.04\n  ],\n  [\n   5.5,\n   1.05\n  ],\n  [\n   5.95,\n   1.06\n  ],\n  [\n   6.35,\n   1.07\n  ],\n  [\n   6.75,\n   1.08\n  ]\n ]\n}", "// Design temperatures from the DHDG (section 2.5.2): the room's indoor\n// temperature by type, and the zone's outdoor design and reference temperatures.\n\nimport data from \"../../../apps/design/dhdg/temperatures.json\";\n\nexport type Percentile = \"99.6\" | \"99\" | \"98\" | \"95\";\n\nexport type Indoor = \"pre-2006\" | \"post-2006\";\n\ninterface Zone {\n  zone: number;\n  design: Record<Percentile, number>;\n  shortfall_days: Record<Percentile, number>;\n  reference: number;\n}\n\nconst ROOMS: Record<string, { label: string; pre_2006: number }> = data.rooms;\nconst SYNONYMS: Record<string, string> = data.synonyms;\nconst ZONES = data.zones as Zone[];\n\nexport const ADJOINING = data.adjoining;\n\n/** `[type, assumed]` for a room's free text: its type, else its name, else a living room. */\nexport function roomType(\n  ...candidates: (string | null | undefined)[]\n): [string, boolean] {\n  for (const candidate of candidates) {\n    const text = (candidate ?? \"\").trim().toLowerCase();\n    if (!text) {\n      continue;\n    }\n    for (const option of [text, text.replace(/\\s*\\d+$/, \"\")]) {\n      if (option in ROOMS) {\n        return [option, false];\n      }\n      const synonym = SYNONYMS[option];\n      if (synonym) {\n        return [synonym, false];\n      }\n    }\n    // \"Bedroom 2\", \"Kitchen/diner\": the type is usually the first word.\n    const head = text.split(/[\\s/-]+/)[0] ?? \"\";\n    if (head in ROOMS) {\n      return [head, false];\n    }\n    const synonym = SYNONYMS[head];\n    if (synonym) {\n      return [synonym, false];\n    }\n  }\n  return [data.fallback, true];\n}\n\n/** Table 2-2 before 2006; 21 \u00B0C throughout after, 22 \u00B0C in bathrooms. */\nexport function indoorC(type: string, indoor: Indoor): number {\n  if (indoor === \"post-2006\") {\n    const post: Record<string, number> = data.post_2006;\n    return post[type] ?? data.post_2006.default;\n  }\n  return ROOMS[type]?.pre_2006 ?? ROOMS[data.fallback]?.pre_2006 ?? 21;\n}\n\nexport function zone(number: number): Zone {\n  const found = ZONES.find((candidate) => candidate.zone === number);\n  if (!found) {\n    throw new RangeError(`No outdoor design temperature zone ${number}.`);\n  }\n  return found;\n}\n\n/** Table 2-4: 0.3 \u00B0C colder for every 50 m above the first 50 m. */\nexport function elevationCorrectionC(elevationM: number): number {\n  const { free_m, step_m, per_step_c } = data.elevation;\n  if (elevationM <= free_m) {\n    return 0;\n  }\n  return (\n    Math.round(Math.ceil((elevationM - free_m) / step_m) * per_step_c * 10) / 10\n  );\n}\n\nexport interface Outdoor {\n  zone: number;\n  percentile: Percentile;\n  elevationM: number;\n  /** \u00B0C, the design day. */\n  designC: number;\n  /** \u00B0C, the annual mean: the typical day, and the ground. */\n  referenceC: number;\n  shortfallDays: number;\n}\n\nexport function outdoor(\n  zoneNumber: number,\n  percentile: Percentile,\n  elevationM: number,\n): Outdoor {\n  const found = zone(zoneNumber);\n  const correction = elevationCorrectionC(elevationM);\n  return {\n    zone: zoneNumber,\n    percentile,\n    elevationM,\n    designC: round1(found.design[percentile] - correction),\n    referenceC: round1(found.reference - correction),\n    shortfallDays: found.shortfall_days[percentile],\n  };\n}\n\n/** Figure 2-12, for rooms on radiators: a few percent more for tall rooms. */\nexport function highCeilingFactor(heightM: number): number {\n  const points = data.high_ceiling as [number, number][];\n  const first = points[0] as [number, number];\n  if (heightM <= first[0]) {\n    return 1;\n  }\n  for (let i = 1; i < points.length; i++) {\n    const [h1, f1] = points[i] as [number, number];\n    const [h0, f0] = points[i - 1] as [number, number];\n    if (heightM <= h1) {\n      return (\n        Math.round((f0 + ((heightM - h0) / (h1 - h0)) * (f1 - f0)) * 1000) /\n        1000\n      );\n    }\n  }\n  return (points[points.length - 1] as [number, number])[1];\n}\n\nfunction round1(value: number): number {\n  return Math.round(value * 10) / 10;\n}\n", "// Room by room design heat load, BS EN 12831-1 as the CIBSE Domestic Heating\n// Design Guide sets it out (section 2.7, Worksheets A2 and A3). Fabric is\n// A \u00D7 U \u00D7 \u0394T for every surface; ventilation is ventilation.ts; the totals that\n// size the heat generator leave out the orientation factor and high ceilings.\n\nimport type { Boundary, Model, ModelRoom, Surface, SurfaceRef } from \"./model\";\nimport {\n  ADJOINING,\n  highCeilingFactor,\n  type Indoor,\n  indoorC,\n  type Outdoor,\n  roomType,\n} from \"./temperatures\";\nimport {\n  type Exposure,\n  type Heating,\n  type RoomVentilation,\n  reheatWPerM2,\n  roomVentilation,\n  type System,\n  typicalFactor,\n} from \"./ventilation\";\n\nexport interface Resolved {\n  /** W/m\u00B2K, before the thermal bridging allowance. */\n  u: number;\n  /** Where the U-value came from, for the designer to check. */\n  source: string;\n  /** A suspended ground floor leaks air; a solid one doesn't. */\n  leaks?: boolean;\n}\n\n/** `deltaDesign` says which way heat crosses an internal floor. */\nexport type UValues = (\n  surface: Surface,\n  room: ModelRoom,\n  deltaDesign: number,\n) => Resolved;\n\nexport interface Conditions {\n  outdoor: Outdoor;\n  indoor: Indoor;\n  /** m\u00B3/(h\u00B7m\u00B2) at 50 Pa: measured, or Table 2-11. */\n  q50: number;\n  exposure: Exposure;\n  /** m, ground to the top of the highest storey, for Table 2-13. */\n  buildingHeightM: number;\n  system: System;\n  heating: Heating;\n  /** W/m\u00B2K added to every U-value (Table 2-9). */\n  thermalBridging: number;\n  /** Panel radiators, so tall rooms get Figure 2-12's allowance. */\n  highCeilings: boolean;\n  /** Most rooms reheat at once, so their allowances add up at the generator. */\n  reheatAtGenerator: boolean;\n}\n\nexport interface ElementResult {\n  kind: Surface[\"kind\"];\n  /** The surface's fabric key, as the model gave it. */\n  fabric: string;\n  what: string;\n  /** What's on the other side, in words. */\n  facing: string;\n  boundary: Boundary;\n  /** What it is on the plan, where the model said. */\n  ref?: SurfaceRef;\n  areaM2: number;\n  /** W/m\u00B2K, thermal bridging included. */\n  u: number;\n  source: string;\n  deltaDesign: number;\n  deltaTypical: number;\n  designW: number;\n  typicalW: number;\n}\n\nexport interface RoomResult {\n  id: string;\n  name: string;\n  floor: string;\n  level: number;\n  type: string;\n  assumedType: boolean;\n  internalC: number;\n  areaM2: number;\n  heightM: number;\n  volumeM3: number;\n  elements: ElementResult[];\n  /** Surfaces with no heat flowing through them, such as the floor over a\n   * room at the same temperature: left out of the sums, listed to be seen. */\n  unlisted: ElementResult[];\n  fabricDesignW: number;\n  fabricTypicalW: number;\n  ventilation: RoomVentilation;\n  reheatW: number;\n  highCeilingFactor: number;\n  /** W: sizes this room's emitters (cell 708). */\n  designW: number;\n  /** W on a typical day (cell 709). */\n  typicalW: number;\n  wattsPerM2: number;\n}\n\nexport interface HeatLoad {\n  rooms: RoomResult[];\n  unheated: Model[\"unheated\"];\n  conditions: Conditions;\n  totals: {\n    /** \u03A3 room design heat loss: what the emitters add up to. */\n    roomsW: number;\n    fabricW: number;\n    ventilationW: number;\n    reheatW: number;\n    /** Space heating design heat generator sizing component (A3 cell 303). */\n    generatorW: number;\n    /** Space heating typical heat generator sizing component (A3 cell 304). */\n    typicalW: number;\n    areaM2: number;\n    wattsPerM2: number;\n  };\n}\n\nfunction facingLabel(boundary: Boundary, names: Map<string, string>): string {\n  switch (boundary.kind) {\n    case \"outside\":\n      return \"outside\";\n    case \"ground\":\n      return \"the ground\";\n    case \"adjoining\":\n      return \"next door\";\n    case \"unheated\":\n      return boundary.space ? `${boundary.space} (unheated)` : \"unheated space\";\n    case \"room\":\n      return names.get(boundary.room) ?? \"another room\";\n  }\n}\n\nexport function heatLoad(\n  model: Model,\n  conditions: Conditions,\n  uvalues: UValues,\n): HeatLoad {\n  const { outdoor } = conditions;\n  const typed = new Map(\n    model.rooms.map((room) => {\n      const [type, assumed] = roomType(room.roomType, room.name);\n      const internal = room.temperatureC ?? indoorC(type, conditions.indoor);\n      return [room.id, { type, assumed, internal }];\n    }),\n  );\n  const names = new Map(model.rooms.map((room) => [room.id, room.name]));\n  const factor = typicalFactor(conditions.exposure, conditions.buildingHeightM);\n\n  const rooms = model.rooms.map((room): RoomResult => {\n    const { type, assumed, internal } = typed.get(room.id) as {\n      type: string;\n      assumed: boolean;\n      internal: number;\n    };\n\n    const elements: ElementResult[] = [];\n    const unlisted: ElementResult[] = [];\n    let envelopeM2 = 0;\n    for (const surface of room.surfaces) {\n      if (surface.areaM2 <= 0) {\n        continue;\n      }\n      let farDesign: number;\n      let farTypical: number;\n      switch (surface.boundary.kind) {\n        case \"outside\":\n          farDesign = outdoor.designC;\n          farTypical = outdoor.referenceC;\n          break;\n        case \"ground\":\n          // The ground sits at the annual mean, design day or not.\n          farDesign = outdoor.referenceC;\n          farTypical = outdoor.referenceC;\n          break;\n        case \"adjoining\":\n          farDesign = ADJOINING.heated_c;\n          farTypical = ADJOINING.heated_c;\n          break;\n        case \"unheated\":\n          farDesign = ADJOINING.unheated_c;\n          farTypical = ADJOINING.unheated_c;\n          break;\n        case \"room\": {\n          const other = typed.get(surface.boundary.room)?.internal ?? internal;\n          farDesign = other;\n          farTypical = other;\n          break;\n        }\n      }\n      const deltaDesign = internal - farDesign;\n      const deltaTypical = internal - farTypical;\n      const resolved = uvalues(surface, room, deltaDesign);\n\n      const leaks =\n        surface.boundary.kind === \"outside\" ||\n        surface.boundary.kind === \"unheated\" ||\n        (surface.kind === \"ground-floor\" && resolved.leaks === true);\n      if (leaks) {\n        envelopeM2 += surface.areaM2;\n      }\n\n      const u = resolved.u + conditions.thermalBridging;\n      const element: ElementResult = {\n        kind: surface.kind,\n        fabric: surface.fabric,\n        what: surface.label,\n        facing: facingLabel(surface.boundary, names),\n        boundary: surface.boundary,\n        ...(surface.ref ? { ref: surface.ref } : {}),\n        areaM2: surface.areaM2,\n        u,\n        source: resolved.source,\n        deltaDesign,\n        deltaTypical,\n        designW: surface.areaM2 * u * deltaDesign,\n        typicalW: surface.areaM2 * u * deltaTypical,\n      };\n      if (deltaDesign === 0 && deltaTypical === 0) {\n        // Same temperature both sides: the DHDG disregards the surface, but\n        // the designer still wants to see it is there.\n        unlisted.push(element);\n        continue;\n      }\n      elements.push(element);\n    }\n\n    const volumeM3 = room.areaM2 * room.heightM;\n    const ventilation = roomVentilation({\n      envelopeM2,\n      q50: conditions.q50,\n      features: room.ventilation,\n      factor,\n      volumeM3,\n      type,\n      continuousM3h: room.continuousM3h,\n      system: conditions.system,\n      internalC: internal,\n      designC: outdoor.designC,\n      referenceC: outdoor.referenceC,\n    });\n\n    const fabricDesignW = elements.reduce((sum, row) => sum + row.designW, 0);\n    const fabricTypicalW = elements.reduce((sum, row) => sum + row.typicalW, 0);\n    const reheatW = room.areaM2 * reheatWPerM2(conditions.heating);\n    const ceiling = conditions.highCeilings\n      ? highCeilingFactor(room.heightM)\n      : 1;\n    const designW = (fabricDesignW + ventilation.designW + reheatW) * ceiling;\n    const typicalW = (fabricTypicalW + ventilation.typicalW) * ceiling;\n\n    return {\n      id: room.id,\n      name: room.name,\n      floor: room.floor,\n      level: room.level,\n      type,\n      assumedType: assumed,\n      internalC: internal,\n      areaM2: room.areaM2,\n      heightM: room.heightM,\n      volumeM3,\n      elements,\n      unlisted,\n      fabricDesignW,\n      fabricTypicalW,\n      ventilation,\n      reheatW,\n      highCeilingFactor: ceiling,\n      designW,\n      typicalW,\n      wattsPerM2: room.areaM2 > 0 ? designW / room.areaM2 : 0,\n    };\n  });\n\n  const sum = (pick: (room: RoomResult) => number) =>\n    rooms.reduce((total, room) => total + pick(room), 0);\n  const roomsW = sum((room) => room.designW);\n  const areaM2 = sum((room) => room.areaM2);\n  const fabricW = sum((room) => room.fabricDesignW);\n  const reheatW = sum((room) => room.reheatW);\n\n  return {\n    rooms,\n    unheated: model.unheated,\n    conditions,\n    totals: {\n      roomsW,\n      fabricW,\n      ventilationW: sum((room) => room.ventilation.designW),\n      reheatW,\n      generatorW:\n        sum((room) => room.ventilation.generatorW) +\n        fabricW +\n        (conditions.reheatAtGenerator ? reheatW : 0),\n      typicalW: sum((room) => room.typicalW),\n      areaM2,\n      wattsPerM2: areaM2 > 0 ? roomsW / areaM2 : 0,\n    },\n  };\n}\n", "{\"source\":\"CIBSE Domestic Heating Design Guide 2026-02, section 2.8.9: Tables 2-19 to 2-38.\",\"tables\":[{\"id\":\"2-19\",\"element\":\"wall\",\"title\":\"Solid brick, uninsulated\",\"dims\":[{\"key\":\"brick_depth_mm\",\"label\":\"Brick\",\"values\":[102,228,343]}],\"descriptions\":[\"brick, 13 mm plaster\",\"brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[],\"rows\":[0,-1,0,3.07,115,0,-1,1,2.05,241,0,-1,2,1.57,356,1,-1,0,2.11,133,1,-1,1,1.56,259,1,-1,2,1.27,374],\"corrections\":[],\"width\":5},{\"id\":\"2-20\",\"element\":\"wall\",\"title\":\"Stone, uninsulated\",\"dims\":[{\"key\":\"stone_depth_mm\",\"label\":\"Stone\",\"values\":[305,457,610]}],\"descriptions\":[\"sandstone or granite\",\"sandstone or granite, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[],\"rows\":[0,-1,0,3.3,305,0,-1,1,2.71,457,0,-1,2,2.3,610,1,-1,0,2.11,336,1,-1,1,1.85,488,1,-1,2,1.64,641],\"corrections\":[],\"width\":5},{\"id\":\"2-21\",\"element\":\"wall\",\"title\":\"Cast concrete, uninsulated\",\"dims\":[{\"key\":\"concrete_depth_mm\",\"label\":\"Concrete\",\"values\":[102,152,204,254]}],\"descriptions\":[\"dense cast concrete\",\"dense cast concrete, 13 mm plaster\",\"dense cast concrete, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[],\"rows\":[0,-1,0,4.05,102,0,-1,1,3.52,152,0,-1,2,3.09,204,0,-1,3,2.77,254,1,-1,0,3.71,115,1,-1,1,3.26,165,1,-1,2,2.89,217,1,-1,3,2.61,267,2,-1,0,2.39,133,2,-1,1,2.19,183,2,-1,2,2.02,235,2,-1,3,1.87,285],\"corrections\":[],\"width\":5},{\"id\":\"2-22\",\"element\":\"wall\",\"title\":\"Solid block, uninsulated\",\"dims\":[],\"descriptions\":[\"12 mm timber or tile, 15 mm cavity (ventilated), 215 mm HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 215 mm HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 215 mm dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 215 mm dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 215 mm HP block, 13 mm plaster\",\"19 mm external render (cement, sand), 215 mm HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 215 mm dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), 215 mm dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[],\"rows\":[0,-1,0.47,255,1,-1,0.43,273,2,-1,3.17,255,3,-1,2.15,273,4,-1,0.46,247,5,-1,0.43,265,6,-1,2.99,247,7,-1,2.07,265],\"corrections\":[],\"width\":4},{\"id\":\"2-23\",\"element\":\"wall\",\"title\":\"Solid brick, insulated\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[25,50,75,100,150,200,250,300]},{\"key\":\"brick_depth_mm\",\"label\":\"Brick\",\"values\":[102,228,343]}],\"descriptions\":[\"12 mm timber or tile, 15 mm cavity (ventilated), brick, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), brick, 13 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"brick, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0,1.0,170,0,0,0,1,0.81,296,0,0,0,2,0.7,411,0,0,1,0,0.68,195,0,0,1,1,0.58,321,0,0,1,2,0.52,436,0,0,2,0,0.51,220,0,0,2,1,0.46,346,0,0,2,2,0.42,461,0,0,3,0,0.42,245,0,0,3,1,0.38,371,0,0,3,2,0.35,486,0,0,4,0,0.3,295,0,0,4,1,0.28,421,0,0,4,2,0.27,536,0,0,5,0,0.24,345,0,0,5,1,0.23,471,0,0,5,2,0.21,586,0,0,6,0,0.2,395,0,0,6,1,0.19,521,0,0,6,2,0.18,636,0,0,7,0,0.17,445,0,0,7,1,0.16,571,0,0,7,2,0.16,686,0,1,0,0,0.91,170,0,1,0,1,0.82,296,0,1,0,2,0.7,411,0,1,1,0,0.69,195,0,1,1,1,0.6,321,0,1,1,2,0.53,436,0,1,2,0,0.53,220,0,1,2,1,0.47,346,0,1,2,2,0.43,461,0,1,3,0,0.43,245,0,1,3,1,0.39,371,0,1,3,2,0.36,486,0,1,4,0,0.31,295,0,1,4,1,0.29,421,0,1,4,2,0.27,536,0,1,5,0,0.25,345,0,1,5,1,0.23,471,0,1,5,2,0.22,586,0,1,6,0,0.2,395,0,1,6,1,0.19,521,0,1,6,2,0.19,636,0,1,7,0,0.17,445,0,1,7,1,0.17,571,0,1,7,2,0.16,686,0,2,0,0,0.83,170,0,2,0,1,0.7,296,0,2,0,2,0.61,411,0,2,1,0,0.54,195,0,2,1,1,0.48,321,0,2,1,2,0.43,436,0,2,2,0,0.41,220,0,2,2,1,0.37,346,0,2,2,2,0.34,461,0,2,3,0,0.33,245,0,2,3,1,0.3,371,0,2,3,2,0.28,486,0,2,4,0,0.24,295,0,2,4,1,0.22,421,0,2,4,2,0.21,536,0,2,5,0,0.19,345,0,2,5,1,0.18,471,0,2,5,2,0.17,586,0,2,6,0,0.15,395,0,2,6,1,0.15,521,0,2,6,2,0.14,636,0,2,7,0,0.13,445,0,2,7,1,0.13,571,0,2,7,2,0.12,686,1,0,0,0,0.99,159,1,0,0,1,0.81,285,1,0,0,2,0.69,400,1,0,1,0,0.62,184,1,0,1,1,0.54,310,1,0,1,2,0.49,425,1,0,2,0,0.45,209,1,0,2,1,0.41,335,1,0,2,2,0.38,450,1,0,3,0,0.35,234,1,0,3,1,0.33,360,1,0,3,2,0.31,475,1,0,4,0,0.25,284,1,0,4,1,0.24,410,1,0,4,2,0.23,525,1,0,5,0,0.19,334,1,0,5,1,0.19,460,1,0,5,2,0.18,575,1,0,6,0,0.16,384,1,0,6,1,0.15,510,1,0,6,2,0.15,625,1,0,7,0,0.14,434,1,0,7,1,0.13,560,1,0,7,2,0.13,675,1,2,0,0,0.73,159,1,2,0,1,0.62,285,1,2,0,2,0.55,400,1,2,1,0,0.43,184,1,2,1,1,0.39,310,1,2,1,2,0.36,425,1,2,2,0,0.3,209,1,2,2,1,0.28,335,1,2,2,2,0.27,450,1,2,3,0,0.24,234,1,2,3,1,0.22,360,1,2,3,2,0.22,475,1,2,4,0,0.17,284,1,2,4,1,0.16,410,1,2,4,2,0.15,525,1,2,5,0,0.13,334,1,2,5,1,0.13,460,1,2,5,2,0.12,575,1,2,6,0,0.11,384,1,2,6,1,0.1,510,1,2,6,2,0.1,625,1,2,7,0,0.09,434,1,2,7,1,0.09,560,1,2,7,2,0.09,675,2,0,0,0,0.86,177,2,0,0,1,0.73,303,2,0,0,2,0.63,418,2,0,1,0,0.56,202,2,0,1,1,0.5,328,2,0,1,2,0.45,443,2,0,2,0,0.42,227,2,0,2,1,0.38,353,2,0,2,2,0.36,468,2,0,3,0,0.34,252,2,0,3,1,0.31,378,2,0,3,2,0.29,493,2,0,4,0,0.24,302,2,0,4,1,0.23,428,2,0,4,2,0.22,543,2,0,5,0,0.19,352,2,0,5,1,0.18,478,2,0,5,2,0.17,593,2,0,6,0,0.16,402,2,0,6,1,0.15,528,2,0,6,2,0.15,643,2,0,7,0,0.13,452,2,0,7,1,0.13,578,2,0,7,2,0.13,693,2,2,0,0,0.64,177,2,2,0,1,0.57,303,2,2,0,2,0.51,418,2,2,1,0,0.4,202,2,2,1,1,0.37,328,2,2,1,2,0.34,443,2,2,2,0,0.29,227,2,2,2,1,0.27,353,2,2,2,2,0.26,468,2,2,3,0,0.23,252,2,2,3,1,0.22,378,2,2,3,2,0.21,493,2,2,4,0,0.16,302,2,2,4,1,0.16,428,2,2,4,2,0.15,543,2,2,5,0,0.13,352,2,2,5,1,0.12,478,2,2,5,2,0.12,593,2,2,6,0,0.1,402,2,2,6,1,0.1,528,2,2,6,2,0.1,643,2,2,7,0,0.09,452,2,2,7,1,0.09,578,2,2,7,2,0.09,693,3,0,0,0,1.16,143,3,0,0,1,0.97,269,3,0,0,2,0.85,384,3,0,1,0,0.75,168,3,0,1,1,0.66,294,3,0,1,2,0.6,409,3,0,2,0,0.56,193,3,0,2,1,0.51,319,3,0,2,2,0.47,434,3,0,3,0,0.44,218,3,0,3,1,0.41,344,3,0,3,2,0.39,459,3,0,4,0,0.32,268,3,0,4,1,0.3,394,3,0,4,2,0.29,509,3,0,5,0,0.25,318,3,0,5,1,0.24,444,3,0,5,2,0.23,559,3,0,6,0,0.2,368,3,0,6,1,0.2,494,3,0,6,2,0.19,609,3,0,7,0,0.17,418,3,0,7,1,0.17,544,3,0,7,2,0.16,659,3,1,0,0,1.19,143,3,1,0,1,0.99,269,3,1,0,2,0.86,384,3,1,1,0,0.77,168,3,1,1,1,0.68,294,3,1,1,2,0.62,409,3,1,2,0,0.57,193,3,1,2,1,0.52,319,3,1,2,2,0.48,434,3,1,3,0,0.46,218,3,1,3,1,0.42,344,3,1,3,2,0.4,459,3,1,4,0,0.33,268,3,1,4,1,0.31,394,3,1,4,2,0.29,509,3,1,5,0,0.26,318,3,1,5,1,0.24,444,3,1,5,2,0.23,559,3,1,6,0,0.21,368,3,1,6,1,0.2,494,3,1,6,2,0.2,609,3,1,7,0,0.18,418,3,1,7,1,0.17,544,3,1,7,2,0.17,659,3,2,0,0,0.97,143,3,2,0,1,0.82,269,3,2,0,2,0.72,384,3,2,1,0,0.6,168,3,2,1,1,0.54,294,3,2,1,2,0.49,409,3,2,2,0,0.44,193,3,2,2,1,0.4,319,3,2,2,2,0.38,434,3,2,3,0,0.35,218,3,2,3,1,0.32,344,3,2,3,2,0.31,459,3,2,4,0,0.25,268,3,2,4,1,0.23,394,3,2,4,2,0.23,509,3,2,5,0,0.19,318,3,2,5,1,0.19,444,3,2,5,2,0.18,559,3,2,6,0,0.16,368,3,2,6,1,0.15,494,3,2,6,2,0.15,609,3,2,7,0,0.14,418,3,2,7,1,0.13,544,3,2,7,2,0.13,659],\"corrections\":[{\"row\":121,\"printed\":1.3,\"used\":0.73},{\"row\":144,\"printed\":1.84,\"used\":0.64},{\"row\":216,\"printed\":2.72,\"used\":0.97}],\"width\":6},{\"id\":\"2-24\",\"element\":\"wall\",\"title\":\"Stone, insulated\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[25,50,75,100,150,200,250,300]},{\"key\":\"stone_depth_mm\",\"label\":\"Stone\",\"values\":[305,457,610]}],\"descriptions\":[\"sandstone or granite, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0,1.16,346,0,0,0,1,1.08,498,0,0,0,2,1.0,651,0,0,1,0,0.75,371,0,0,1,1,0.71,523,0,0,1,2,0.68,676,0,0,2,0,0.56,396,0,0,2,1,0.54,548,0,0,2,2,0.52,701,0,0,3,0,0.44,421,0,0,3,1,0.43,573,0,0,3,2,0.42,726,0,0,4,0,0.32,471,0,0,4,1,0.31,623,0,0,4,2,0.3,776,0,0,5,0,0.25,521,0,0,5,1,0.24,673,0,0,5,2,0.24,826,0,0,6,0,0.2,571,0,0,6,1,0.2,723,0,0,6,2,0.2,876,0,0,7,0,0.17,621,0,0,7,1,0.17,773,0,0,7,2,0.17,926,0,1,0,0,1.19,346,0,1,0,1,1.1,498,0,1,0,2,1.02,651,0,1,1,0,0.77,371,0,1,1,1,0.73,523,0,1,1,2,0.7,676,0,1,2,0,0.57,396,0,1,2,1,0.55,548,0,1,2,2,0.53,701,0,1,3,0,0.46,421,0,1,3,1,0.44,573,0,1,3,2,0.43,726,0,1,4,0,0.33,471,0,1,4,1,0.32,623,0,1,4,2,0.31,776,0,1,5,0,0.26,521,0,1,5,1,0.25,673,0,1,5,2,0.25,826,0,1,6,0,0.21,571,0,1,6,1,0.21,723,0,1,6,2,0.2,876,0,1,7,0,0.18,621,0,1,7,1,0.18,773,0,1,7,2,0.17,926,0,2,0,0,0.95,346,0,2,0,1,0.89,498,0,2,0,2,0.84,651,0,2,1,0,0.6,371,0,2,1,1,0.57,523,0,2,1,2,0.55,676,0,2,2,0,0.44,396,0,2,2,1,0.42,548,0,2,2,2,0.41,701,0,2,3,0,0.35,421,0,2,3,1,0.34,573,0,2,3,2,0.33,726,0,2,4,0,0.25,471,0,2,4,1,0.24,623,0,2,4,2,0.24,776,0,2,5,0,0.19,521,0,2,5,1,0.19,673,0,2,5,2,0.19,826,0,2,6,0,0.16,571,0,2,6,1,0.16,723,0,2,6,2,0.15,876,0,2,7,0,0.14,621,0,2,7,1,0.13,773,0,2,7,2,0.13,926],\"corrections\":[],\"width\":6},{\"id\":\"2-25\",\"element\":\"wall\",\"title\":\"Cast concrete, insulated\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[25,50,75,100,150,200,250,300]},{\"key\":\"concrete_depth_mm\",\"label\":\"Concrete\",\"values\":[102,152,204,254]}],\"descriptions\":[\"19 mm external render (cement, sand), dense cast concrete, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), dense cast concrete, 13 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), dense cast concrete, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0,1.22,162,0,0,0,1,1.16,212,0,0,0,2,1.11,264,0,0,0,3,1.06,314,0,0,1,0,0.77,187,0,0,1,1,0.75,237,0,0,1,2,0.73,289,0,0,1,3,0.71,339,0,0,2,0,0.57,212,0,0,2,1,0.56,262,0,0,2,2,0.54,314,0,0,2,3,0.53,364,0,0,3,0,0.45,237,0,0,3,1,0.44,287,0,0,3,2,0.44,339,0,0,3,3,0.43,389,0,0,4,0,0.32,287,0,0,4,1,0.32,337,0,0,4,2,0.31,389,0,0,4,3,0.31,439,0,0,5,0,0.25,337,0,0,5,1,0.25,387,0,0,5,2,0.25,439,0,0,5,3,0.24,489,0,0,6,0,0.21,387,0,0,6,1,0.2,437,0,0,6,2,0.2,489,0,0,6,3,0.2,539,0,0,7,0,0.18,437,0,0,7,1,0.17,487,0,0,7,2,0.17,539,0,0,7,3,0.17,589,0,1,0,0,1.38,60,0,1,0,1,1.19,212,0,1,0,2,1.13,264,0,1,0,3,1.08,314,0,1,1,0,0.79,187,0,1,1,1,0.77,237,0,1,1,2,0.75,289,0,1,1,3,0.72,339,0,1,2,0,0.59,212,0,1,2,1,0.57,262,0,1,2,2,0.56,314,0,1,2,3,0.55,364,0,1,3,0,0.47,237,0,1,3,1,0.46,287,0,1,3,2,0.45,339,0,1,3,3,0.44,389,0,1,4,0,0.33,287,0,1,4,1,0.33,337,0,1,4,2,0.32,389,0,1,4,3,0.32,439,0,1,5,0,0.26,337,0,1,5,1,0.26,387,0,1,5,2,0.25,439,0,1,5,3,0.25,489,0,1,6,0,0.21,387,0,1,6,1,0.21,437,0,1,6,2,0.21,489,0,1,6,3,0.21,539,0,1,7,0,0.18,437,0,1,7,1,0.18,487,0,1,7,2,0.18,539,0,1,7,3,0.18,589,0,2,0,0,0.99,162,0,2,0,1,0.95,212,0,2,0,2,0.92,264,0,2,0,3,0.88,314,0,2,1,0,0.61,187,0,2,1,1,0.6,237,0,2,1,2,0.58,289,0,2,1,3,0.57,339,0,2,2,0,0.45,212,0,2,2,1,0.44,262,0,2,2,2,0.43,314,0,2,2,3,0.42,364,0,2,3,0,0.35,237,0,2,3,1,0.35,287,0,2,3,2,0.34,339,0,2,3,3,0.34,389,0,2,4,0,0.25,287,0,2,4,1,0.25,337,0,2,4,2,0.24,389,0,2,4,3,0.24,439,0,2,5,0,0.19,337,0,2,5,1,0.19,387,0,2,5,2,0.19,439,0,2,5,3,0.19,489,0,2,6,0,0.16,387,0,2,6,1,0.16,437,0,2,6,2,0.16,489,0,2,6,3,0.16,539,0,2,7,0,0.14,437,0,2,7,1,0.14,487,0,2,7,2,0.13,539,0,2,7,3,0.13,589,1,0,0,0,1.1,159,1,0,0,1,1.06,209,1,0,0,2,1.02,261,1,0,0,3,0.98,311,1,0,1,0,0.66,184,1,0,1,1,0.64,234,1,0,1,2,0.63,286,1,0,1,3,0.61,336,1,0,2,0,0.47,209,1,0,2,1,0.46,259,1,0,2,2,0.45,311,1,0,2,3,0.45,361,1,0,3,0,0.37,234,1,0,3,1,0.36,284,1,0,3,2,0.36,336,1,0,3,3,0.35,386,1,0,4,0,0.26,284,1,0,4,1,0.25,334,1,0,4,2,0.25,386,1,0,4,3,0.25,436,1,0,5,0,0.2,334,1,0,5,1,0.2,384,1,0,5,2,0.2,436,1,0,5,3,0.19,486,1,0,6,0,0.16,384,1,0,6,1,0.16,434,1,0,6,2,0.16,486,1,0,6,3,0.16,536,1,0,7,0,0.14,434,1,0,7,1,0.14,484,1,0,7,2,0.14,536,1,0,7,3,0.14,586,1,2,0,0,0.79,159,1,2,0,1,0.76,209,1,2,0,2,0.74,261,1,2,0,3,0.72,311,1,2,1,0,0.45,184,1,2,1,1,0.44,234,1,2,1,2,0.43,286,1,2,1,3,0.42,336,1,2,2,0,0.31,209,1,2,2,1,0.31,259,1,2,2,2,0.31,311,1,2,2,3,0.3,361,1,2,3,0,0.24,234,1,2,3,1,0.24,284,1,2,3,2,0.24,336,1,2,3,3,0.24,386,1,2,4,0,0.17,284,1,2,4,1,0.17,334,1,2,4,2,0.17,386,1,2,4,3,0.17,436,1,2,5,0,0.13,334,1,2,5,1,0.13,384,1,2,5,2,0.13,436,1,2,5,3,0.13,486,1,2,6,0,0.11,384,1,2,6,1,0.11,434,1,2,6,2,0.11,486,1,2,6,3,0.11,536,1,2,7,0,0.09,434,1,2,7,1,0.09,484,1,2,7,2,0.09,536,1,2,7,3,0.09,586,2,0,0,0,0.94,177,2,0,0,1,0.91,227,2,0,0,2,0.88,279,2,0,0,3,0.85,329,2,0,1,0,0.6,202,2,0,1,1,0.59,252,2,0,1,2,0.57,304,2,0,1,3,0.56,354,2,0,2,0,0.44,227,2,0,2,1,0.43,277,2,0,2,2,0.43,329,2,0,2,3,0.42,379,2,0,3,0,0.35,252,2,0,3,1,0.34,302,2,0,3,2,0.34,354,2,0,3,3,0.33,404,2,0,4,0,0.25,302,2,0,4,1,0.24,352,2,0,4,2,0.24,404,2,0,4,3,0.24,454,2,0,5,0,0.19,352,2,0,5,1,0.19,402,2,0,5,2,0.19,454,2,0,5,3,0.19,504,2,0,6,0,0.16,402,2,0,6,1,0.16,452,2,0,6,2,0.16,504,2,0,6,3,0.16,554,2,0,7,0,0.14,452,2,0,7,1,0.13,502,2,0,7,2,0.13,554,2,0,7,3,0.13,604,2,2,0,0,0.7,177,2,2,0,1,0.68,227,2,2,0,2,0.67,279,2,2,0,3,0.65,329,2,2,1,0,0.42,202,2,2,1,1,0.41,252,2,2,1,2,0.41,304,2,2,1,3,0.4,354,2,2,2,0,0.3,227,2,2,2,1,0.3,277,2,2,2,2,0.29,329,2,2,2,3,0.29,379,2,2,3,0,0.23,252,2,2,3,1,0.23,302,2,2,3,2,0.23,354,2,2,3,3,0.23,404,2,2,4,0,0.16,302,2,2,4,1,0.16,352,2,2,4,2,0.16,404,2,2,4,3,0.16,454,2,2,5,0,0.13,352,2,2,5,1,0.13,402,2,2,5,2,0.13,454,2,2,5,3,0.13,504,2,2,6,0,0.11,402,2,2,6,1,0.1,452,2,2,6,2,0.1,504,2,2,6,3,0.1,554,2,2,7,0,0.09,452,2,2,7,1,0.09,502,2,2,7,2,0.09,554,2,2,7,3,0.09,604],\"corrections\":[],\"width\":6},{\"id\":\"2-26\",\"element\":\"wall\",\"title\":\"Solid block, insulated\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[25,50,75,100,150,200,250,300]}],\"descriptions\":[\"12 mm timber or tile, 15 mm cavity (ventilated), 215 mm HP block, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 215 mm dense concrete block, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 215 mm HP block, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 215 mm dense concrete block, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), 215 mm HP block, 13 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), 215 mm HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), 215 mm dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), insulation (polypropylene fixings), 215 mm dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0.36,283,0,0,1,0.3,308,0,0,2,0.27,333,0,0,3,0.24,358,0,0,4,0.19,408,0,0,5,0.16,458,0,0,6,0.14,508,0,0,7,0.13,558,0,1,0,0.36,283,0,1,1,0.31,308,0,1,2,0.27,333,0,1,3,0.24,358,0,1,4,0.2,408,0,1,5,0.17,458,0,1,6,0.15,508,0,1,7,0.13,558,0,2,0,0.33,283,0,2,1,0.27,308,0,2,2,0.23,333,0,2,3,0.2,358,0,2,4,0.16,408,0,2,5,0.13,458,0,2,6,0.12,508,0,2,7,0.1,558,1,0,0,1.06,283,1,0,1,0.71,308,1,0,2,0.53,333,1,0,3,0.43,358,1,0,4,0.31,408,1,0,5,0.24,458,1,0,6,0.16,508,1,0,7,0.17,558,1,1,0,1.08,283,1,1,1,0.72,308,1,1,2,0.55,333,1,1,3,0.44,358,1,1,4,0.32,408,1,1,5,0.25,458,1,1,6,0.21,508,1,1,7,0.18,558,1,2,0,0.88,283,1,2,1,0.56,308,1,2,2,0.42,333,1,2,3,0.34,358,1,2,4,0.24,408,1,2,5,0.19,458,1,2,6,0.16,508,1,2,7,0.13,558,2,0,0,0.35,275,2,0,1,0.31,300,2,0,2,0.27,325,2,0,3,0.24,350,2,0,4,0.2,400,2,0,5,0.17,450,2,0,6,0.15,500,2,0,7,0.13,550,2,1,0,0.36,275,2,1,1,0.32,300,2,1,2,0.27,325,2,1,3,0.24,350,2,1,4,0.2,400,2,1,5,0.17,450,2,1,6,0.15,500,2,1,7,0.13,550,2,2,0,0.34,275,2,2,1,0.28,300,2,2,2,0.23,325,2,2,3,0.2,350,2,2,4,0.16,400,2,2,5,0.14,450,2,2,6,0.12,500,2,2,7,0.1,550,3,0,0,1.15,275,3,0,1,0.75,300,3,0,2,0.55,325,3,0,3,0.44,350,3,0,4,0.32,400,3,0,5,0.25,450,3,0,6,0.2,500,3,0,7,0.17,550,3,1,0,1.17,275,3,1,1,0.76,300,3,1,2,0.57,325,3,1,3,0.45,350,3,1,4,0.33,400,3,1,5,0.25,450,3,1,6,0.21,500,3,1,7,0.18,550,3,2,0,0.95,272,3,2,1,0.59,300,3,2,2,0.44,325,3,2,3,0.35,350,3,2,4,0.25,400,3,2,5,0.19,450,3,2,6,0.16,500,3,2,7,0.14,550,4,0,0,0.36,272,4,0,1,0.29,297,4,0,2,0.25,322,4,0,3,0.22,347,4,0,4,0.17,397,4,0,5,0.14,447,4,0,6,0.12,497,4,0,7,0.11,547,4,2,0,0.32,272,4,2,1,0.24,297,4,2,2,0.2,322,4,2,3,0.17,347,4,2,4,0.13,397,4,2,5,0.1,447,4,2,6,0.09,497,4,2,7,0.08,547,5,0,0,0.34,290,5,0,1,0.28,315,5,0,2,0.24,340,5,0,3,0.21,365,5,0,4,0.17,415,5,0,5,0.14,465,5,0,6,0.12,515,5,0,7,0.11,565,5,2,0,0.27,290,5,2,1,0.23,315,5,2,2,0.19,340,5,2,3,0.16,365,5,2,4,0.13,415,5,2,5,0.1,465,5,2,6,0.09,515,5,2,7,0.08,565,6,0,0,1.05,272,6,0,1,0.64,297,6,0,2,0.46,322,6,0,3,0.36,347,6,0,4,0.25,397,6,0,5,0.2,447,6,0,6,0.16,497,6,0,7,0.14,547,6,2,0,0.76,272,6,2,1,0.44,297,6,2,2,0.31,322,6,2,3,0.24,347,6,2,4,0.17,397,6,2,5,0.13,447,6,2,6,0.11,497,6,2,7,0.09,332,7,0,0,0.9,290,7,0,1,0.58,315,7,0,2,0.43,340,7,0,3,0.34,365,7,0,4,0.24,415,7,0,5,0.19,465,7,0,6,0.16,515,7,0,7,0.13,565,7,2,0,0.65,290,7,2,1,0.41,315,7,2,2,0.3,340,7,2,3,0.23,365,7,2,4,0.16,415,7,2,5,0.13,465,7,2,6,0.1,515,7,2,7,0.09,565],\"corrections\":[{\"row\":56,\"printed\":1.38,\"used\":0.36},{\"row\":120,\"printed\":0.74,\"used\":0.27},{\"row\":159,\"printed\":2.07,\"used\":0.09}],\"width\":5},{\"id\":\"2-27\",\"element\":\"wall\",\"title\":\"Timber frame\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[25,50,75,100,125,150,175,200,225,250,275,300]}],\"descriptions\":[\"102 mm brick, 50 mm cavity (uninsulated) (mild steel frame fixings), 15 mm oriented strand board or plywood sheathing, insulation (timber studding - 15%), 0.5 mm breathable membrane or felt, 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 15 mm oriented strand board or plywood sheathing, insulation (timber studding - 15%), 0.5 mm breathable membrane or felt, 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"blown fibre\",\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0.85,208,0,0,1,0.6,233,0,0,2,0.47,258,0,0,3,0.38,283,0,0,4,0.32,308,0,0,5,0.28,333,0,0,6,0.25,358,0,0,7,0.22,383,0,0,8,0.2,408,0,0,9,0.18,433,0,0,10,0.17,458,0,0,11,0.16,483,0,1,0,0.85,208,0,1,1,0.61,233,0,1,2,0.47,258,0,1,3,0.39,283,0,1,4,0.33,308,0,1,5,0.29,333,0,1,6,0.25,358,0,1,7,0.23,383,0,1,8,0.21,408,0,1,9,0.19,433,0,1,10,0.18,458,0,1,11,0.16,483,0,2,0,0.87,208,0,2,1,0.62,233,0,2,2,0.48,258,0,2,3,0.4,283,0,2,4,0.34,308,0,2,5,0.29,333,0,2,6,0.26,358,0,2,7,0.24,383,0,2,8,0.21,408,0,2,9,0.2,433,0,2,10,0.18,458,0,2,11,0.17,483,0,3,0,0.73,208,0,3,1,0.49,233,0,3,2,0.38,258,0,3,3,0.31,283,0,3,4,0.26,308,0,3,5,0.23,333,0,3,6,0.2,358,0,3,7,0.18,383,0,3,8,0.16,408,0,3,9,0.15,433,0,3,10,0.14,458,0,3,11,0.13,483,1,0,0,1.06,83,1,0,1,0.7,108,1,0,2,0.53,133,1,0,3,0.42,158,1,0,4,0.35,183,1,0,5,0.3,208,1,0,6,0.26,233,1,0,7,0.24,258,1,0,8,0.21,283,1,0,9,0.19,308,1,0,10,0.18,333,1,0,11,0.16,358,1,1,0,1.06,83,1,1,1,0.7,108,1,1,2,0.53,133,1,1,3,0.43,158,1,1,4,0.36,183,1,1,5,0.31,208,1,1,6,0.27,233,1,1,7,0.24,258,1,1,8,0.22,283,1,1,9,0.2,308,1,1,10,0.18,333,1,1,11,0.17,358,1,2,0,1.08,83,1,2,1,0.72,108,1,2,2,0.54,133,1,2,3,0.44,158,1,2,4,0.37,183,1,2,5,0.32,208,1,2,6,0.28,233,1,2,7,0.25,258,1,2,8,0.23,283,1,2,9,0.21,308,1,2,10,0.19,333,1,2,11,0.18,358,1,3,0,0.88,83,1,3,1,0.56,108,1,3,2,0.42,133,1,3,3,0.33,158,1,3,4,0.28,183,1,3,5,0.24,208,1,3,6,0.21,233,1,3,7,0.19,258,1,3,8,0.17,283,1,3,9,0.16,308,1,3,10,0.14,333,1,3,11,0.13,358],\"corrections\":[],\"width\":5},{\"id\":\"2-28\",\"element\":\"wall\",\"title\":\"Brick/brick cavity\",\"dims\":[{\"key\":\"cavity_depth_mm\",\"label\":\"Cavity\",\"values\":[25,50,75,100,125,150,175,200]},{\"key\":\"wall_ties\",\"label\":\"Wall ties\",\"values\":[\"insulated\",\"metal\"]}],\"descriptions\":[\"102 mm brick, cavity (wall ties), 102 mm brick, 13 mm plaster\",\"102 mm brick, cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, full\\u2013fill cavity (wall ties), 102 mm brick, 13 mm plaster\",\"102 mm brick, full\\u2013fill cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, partial\\u2013fill cavity (wall ties), 102 mm brick, 13 mm plaster\",\"102 mm brick, partial\\u2013fill cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, cavity (wall ties), 102 mm brick, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, full\\u2013fill cavity (wall ties), 102 mm brick, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, full\\u2013fill cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, partial\\u2013fill cavity (wall ties), 102 mm brick, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, partial\\u2013fill cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick (wall ties), partial\\u2013fill cavity , 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, cavity (wall ties), 102 mm brick, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, full\\u2013fill cavity (wall ties), 102 mm brick, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, full\\u2013fill cavity (wall ties), 102 mm brick, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, partial\\u2013fill cavity (wall ties), 102 mm brick, 13 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (batts)\",\"open cavity\",\"polyurethane foam\"],\"rows\":[0,2,0,1,1.46,242,0,2,0,0,1.45,242,0,2,1,1,1.46,267,0,2,1,0,1.45,267,0,2,2,1,1.46,292,0,2,2,0,1.45,292,0,2,3,1,1.46,317,0,2,3,0,1.45,317,0,2,4,1,1.46,342,0,2,4,0,1.45,342,0,2,5,1,1.46,367,0,2,5,0,1.45,367,0,2,6,1,1.46,392,0,2,6,0,1.45,392,0,2,7,1,1.46,417,0,2,7,0,1.45,417,1,2,0,1,1.19,260,1,2,0,0,1.19,260,1,2,1,1,1.19,285,1,2,1,0,1.19,285,1,2,2,1,1.19,310,1,2,2,0,1.19,310,1,2,3,1,1.19,335,1,2,3,0,1.19,335,1,2,4,1,1.19,360,1,2,4,0,1.19,360,1,2,5,1,1.19,385,1,2,5,0,1.19,385,1,2,6,1,1.19,410,1,2,6,0,1.19,410,1,2,7,1,1.19,435,1,2,7,0,1.19,435,2,0,0,1,0.9,242,2,0,0,0,0.88,242,2,0,1,1,0.58,267,2,0,1,0,0.57,267,2,0,2,1,0.43,292,2,0,2,0,0.42,292,2,0,3,1,0.34,317,2,0,3,0,0.33,317,2,0,4,1,0.28,342,2,0,4,0,0.28,342,2,0,5,1,0.24,367,2,0,5,0,0.23,367,2,0,6,1,0.21,392,2,0,6,0,0.2,392,2,0,7,1,0.19,417,2,0,7,0,0.18,417,2,1,0,1,0.88,242,2,1,0,0,0.86,242,2,1,1,1,0.57,267,2,1,1,0,0.55,267,2,1,2,1,0.42,292,2,1,2,0,0.41,292,2,1,3,1,0.33,317,2,1,3,0,0.33,317,2,1,4,1,0.28,342,2,1,4,0,0.27,342,2,1,5,1,0.24,367,2,1,5,0,0.23,367,2,1,6,1,0.21,392,2,1,6,0,0.2,392,2,1,7,1,0.19,417,2,1,7,0,0.18,417,2,3,0,1,0.69,242,2,3,0,0,0.67,242,2,3,1,1,0.42,267,2,3,1,0,0.41,267,2,3,2,1,0.3,292,2,3,2,0,0.29,292,2,3,3,1,0.24,317,2,3,3,0,0.23,317,2,3,4,1,0.2,342,2,3,4,0,0.19,342,2,3,5,1,0.17,367,2,3,5,0,0.16,367,2,3,6,1,0.15,392,2,3,6,0,0.14,392,2,3,7,1,0.13,417,2,3,7,0,0.13,417,3,0,0,1,0.79,260,3,0,0,0,0.78,260,3,0,1,1,0.53,285,3,0,1,0,0.52,285,3,0,2,1,0.4,310,3,0,2,0,0.39,310,3,0,3,1,0.32,335,3,0,3,0,0.32,335,3,0,4,1,0.27,360,3,0,4,0,0.26,360,3,0,5,1,0.23,385,3,0,5,0,0.23,385,3,0,6,1,0.2,410,3,0,6,0,0.2,410,3,0,7,1,0.18,435,3,0,7,0,0.18,435,3,1,0,1,0.77,260,3,1,0,0,0.76,260,3,1,1,1,0.52,285,3,1,1,0,0.51,285,3,1,2,1,0.39,310,3,1,2,0,0.39,310,3,1,3,1,0.32,335,3,1,3,0,0.31,335,3,1,4,1,0.27,360,3,1,4,0,0.26,360,3,1,5,1,0.23,385,3,1,5,0,0.22,385,3,1,6,1,0.2,410,3,1,6,0,0.2,410,3,1,7,1,0.18,435,3,1,7,0,0.18,435,3,3,0,1,0.62,260,3,3,0,0,0.61,260,3,3,1,1,0.4,285,3,3,1,0,0.38,285,3,3,2,1,0.29,310,3,3,2,0,0.28,310,3,3,3,1,0.23,335,3,3,3,0,0.22,335,3,3,4,1,0.19,360,3,3,4,0,0.18,360,3,3,5,1,0.17,385,3,3,5,0,0.16,385,3,3,6,1,0.14,410,3,3,6,0,0.14,410,3,3,7,1,0.13,435,3,3,7,0,0.12,435,4,0,2,1,0.77,292,4,0,2,0,0.76,292,4,0,3,1,0.53,317,4,0,3,0,0.52,317,4,0,4,1,0.4,342,4,0,4,0,0.39,342,4,0,5,1,0.32,367,4,0,5,0,0.31,367,4,0,6,1,0.27,392,4,0,6,0,0.26,392,4,0,7,1,0.23,417,4,0,7,0,0.23,417,4,1,2,1,0.76,292,4,1,2,0,0.75,292,4,1,3,1,0.51,317,4,1,3,0,0.5,317,4,1,4,1,0.39,342,4,1,4,0,0.38,342,4,1,5,1,0.32,367,4,1,5,0,0.31,367,4,1,6,1,0.27,392,4,1,6,0,0.26,392,4,1,7,1,0.23,417,4,1,7,0,0.22,417,4,3,2,1,0.61,292,4,3,2,0,0.6,292,4,3,3,1,0.39,317,4,3,3,0,0.38,317,4,3,4,1,0.29,342,4,3,4,0,0.28,342,4,3,5,1,0.23,367,4,3,5,0,0.22,367,4,3,6,1,0.19,392,4,3,6,0,0.18,392,4,3,7,1,0.16,417,4,3,7,0,0.16,417,5,0,2,1,0.69,310,5,0,2,0,0.68,310,5,0,3,1,0.49,335,5,0,3,0,0.48,335,5,0,4,1,0.38,360,5,0,4,0,0.37,360,5,0,5,1,0.31,385,5,0,5,0,0.3,385,5,0,6,1,0.26,410,5,0,6,0,0.25,410,5,0,7,1,0.22,435,5,0,7,0,0.22,435,5,1,2,1,0.68,310,5,1,2,0,0.67,310,5,1,3,1,0.48,335,5,1,3,0,0.47,335,5,1,4,1,0.37,360,5,1,4,0,0.36,360,5,1,5,1,0.3,385,5,1,5,0,0.29,385,5,1,6,1,0.25,410,5,1,6,0,0.25,410,5,1,7,1,0.22,435,5,1,7,0,0.22,435,5,3,2,1,0.56,310,5,3,2,0,0.55,310,5,3,3,1,0.37,335,5,3,3,0,0.36,335,5,3,4,1,0.28,360,5,3,4,0,0.27,360,5,3,5,1,0.22,385,5,3,5,0,0.21,385,5,3,6,1,0.19,410,5,3,6,0,0.18,410,5,3,7,1,0.16,435,5,3,7,0,0.15,435,6,2,0,1,1.21,269,6,2,0,0,1.21,269,6,2,1,1,1.21,294,6,2,1,0,1.21,294,6,2,2,1,1.21,319,6,2,2,0,1.21,319,6,2,3,1,1.21,344,6,2,3,0,1.21,344,6,2,4,1,1.21,369,6,2,4,0,1.21,369,6,2,5,1,1.21,394,6,2,5,0,1.21,394,6,2,6,1,1.21,419,6,2,6,0,1.21,419,6,2,7,1,1.21,444,6,2,7,0,1.21,444,7,2,0,1,1.02,287,7,2,0,0,1.02,287,7,2,1,1,1.02,312,7,2,1,0,1.02,312,7,2,2,1,1.02,337,7,2,2,0,1.02,337,7,2,3,1,1.02,362,7,2,3,0,1.02,362,7,2,4,1,1.02,387,7,2,4,0,1.02,387,7,2,5,1,1.02,412,7,2,5,0,1.02,412,7,2,6,1,1.02,437,7,2,6,0,1.02,437,7,2,7,1,1.02,462,7,2,7,0,1.02,462,8,0,0,1,0.8,269,8,0,0,0,0.79,269,8,0,1,1,0.54,294,8,0,1,0,0.53,294,8,0,2,1,0.41,319,8,0,2,0,0.4,319,8,0,3,1,0.33,344,8,0,3,0,0.32,344,8,0,4,1,0.27,369,8,0,4,0,0.27,369,8,0,5,1,0.23,394,8,0,5,0,0.23,394,8,0,6,1,0.2,419,8,0,6,0,0.2,419,8,0,7,1,0.18,444,8,0,7,0,0.18,444,8,1,0,1,0.78,269,8,1,0,0,0.77,269,8,1,1,1,0.53,294,8,1,1,0,0.51,294,8,1,2,1,0.4,319,8,1,2,0,0.39,319,8,1,3,1,0.32,344,8,1,3,0,0.31,344,8,1,4,1,0.27,369,8,1,4,0,0.26,369,8,1,5,1,0.23,394,8,1,5,0,0.23,394,8,1,6,1,0.2,419,8,1,6,0,0.2,419,8,1,7,1,0.18,444,8,1,7,0,0.18,444,8,3,0,1,0.63,269,8,3,0,0,0.61,269,8,3,1,1,0.4,294,8,3,1,0,0.38,294,8,3,2,1,0.29,319,8,3,2,0,0.28,319,8,3,3,1,0.23,344,8,3,3,0,0.22,344,8,3,4,1,0.19,369,8,3,4,0,0.19,369,8,3,5,1,0.17,394,8,3,5,0,0.16,394,8,3,6,1,0.15,419,8,3,6,0,0.14,419,8,3,7,1,0.13,444,8,3,7,0,0.12,444,9,0,0,1,0.71,287,9,0,0,0,0.7,287,9,0,1,1,0.5,312,9,0,1,0,0.49,312,9,0,2,1,0.38,337,9,0,2,0,0.37,337,9,0,3,1,0.31,362,9,0,3,0,0.3,362,9,0,4,1,0.26,387,9,0,4,0,0.25,387,9,0,5,1,0.23,412,9,0,5,0,0.22,412,9,0,6,1,0.2,437,9,0,6,0,0.19,437,9,0,7,1,0.18,462,9,0,7,0,0.17,462,9,1,0,1,0.7,287,9,1,0,0,0.69,287,9,1,1,1,0.49,312,9,1,1,0,0.48,312,9,1,2,1,0.37,337,9,1,2,0,0.37,337,9,1,3,1,0.3,362,9,1,3,0,0.3,362,9,1,4,1,0.26,387,9,1,4,0,0.25,387,9,1,5,1,0.22,412,9,1,5,0,0.22,412,9,1,6,1,0.2,437,9,1,6,0,0.19,437,9,1,7,1,0.18,462,9,1,7,0,0.17,462,9,3,0,1,0.57,287,9,3,0,0,0.56,287,9,3,1,1,0.38,312,9,3,1,0,0.36,312,9,3,2,1,0.28,337,9,3,2,0,0.27,337,9,3,3,1,0.22,362,9,3,3,0,0.22,362,9,3,4,1,0.19,387,9,3,4,0,0.18,387,9,3,5,1,0.16,412,9,3,5,0,0.15,412,9,3,6,1,0.14,437,9,3,6,0,0.14,437,9,3,7,1,0.13,462,9,3,7,0,0.12,462,10,0,2,1,0.7,319,10,0,2,0,0.69,319,10,0,3,1,0.49,344,10,0,3,0,0.48,344,10,0,4,1,0.38,369,10,0,4,0,0.37,369,10,0,5,1,0.31,394,10,0,5,0,0.3,394,10,0,6,1,0.26,419,10,0,6,0,0.25,419,10,0,7,1,0.22,444,10,0,7,0,0.22,444,10,1,2,1,0.69,319,10,1,2,0,0.68,319,10,1,3,1,0.48,344,10,1,3,0,0.47,344,10,1,4,1,0.37,369,10,1,4,0,0.36,369,10,1,5,1,0.3,394,10,1,5,0,0.3,394,10,1,6,1,0.26,419,10,1,6,0,0.25,419,10,1,7,1,0.22,444,10,1,7,0,0.22,444,10,3,2,1,0.57,319,10,3,2,0,0.55,319,10,3,3,1,0.37,344,10,3,3,0,0.36,344,10,3,4,1,0.28,369,10,3,4,0,0.27,369,10,3,5,1,0.22,394,10,3,5,0,0.21,394,10,3,6,1,0.19,419,10,3,6,0,0.18,419,10,3,7,1,0.16,444,10,3,7,0,0.15,444,11,0,2,1,0.63,337,11,0,2,0,0.62,337,11,0,3,1,0.46,362,11,0,3,0,0.45,362,11,0,4,1,0.36,387,11,0,4,0,0.35,387,11,0,5,1,0.29,412,11,0,5,0,0.29,412,11,0,6,1,0.25,437,11,0,6,0,0.24,437,11,0,7,1,0.22,462,11,0,7,0,0.21,462,11,1,2,1,0.62,337,11,1,2,0,0.61,337,11,1,3,1,0.45,362,11,1,3,0,0.44,362,11,1,4,1,0.35,387,11,1,4,0,0.34,387,11,1,5,1,0.29,412,11,1,5,0,0.28,412,11,1,6,1,0.25,437,11,1,6,0,0.24,437,11,1,7,1,0.21,462,11,1,7,0,0.21,462,11,3,2,1,0.52,337,11,3,2,0,0.51,337,11,3,3,1,0.35,362,11,3,3,0,0.34,362,11,3,4,1,0.27,387,11,3,4,0,0.26,387,11,3,5,1,0.22,412,11,3,5,0,0.21,412,11,3,6,1,0.18,437,11,3,6,0,0.17,437,11,3,7,1,0.16,462,11,3,7,0,0.15,462,12,0,2,1,0.67,329,12,0,2,0,0.67,329,12,0,3,1,0.47,354,12,0,3,0,0.47,354,12,0,4,1,0.37,379,12,0,4,0,0.37,379,12,0,5,1,0.3,404,12,0,5,0,0.3,404,12,0,6,1,0.25,429,12,0,6,0,0.25,429,12,0,7,1,0.22,454,12,0,7,0,0.22,454,12,1,2,1,0.66,329,12,1,2,0,0.66,329,12,1,3,1,0.46,354,12,1,3,0,0.46,354,12,1,4,1,0.35,379,12,1,4,0,0.35,379,12,1,5,1,0.29,404,12,1,5,0,0.29,404,12,1,6,1,0.24,429,12,1,6,0,0.24,429,12,1,7,1,0.21,454,12,1,7,0,0.21,454,12,3,2,1,0.54,329,12,3,2,0,0.54,329,12,3,3,1,0.35,354,12,3,3,0,0.35,354,12,3,4,1,0.26,379,12,3,4,0,0.26,379,12,3,5,1,0.21,404,12,3,5,0,0.21,404,12,3,6,1,0.17,429,12,3,6,0,0.17,429,12,3,7,1,0.15,454,12,3,7,0,0.15,454,13,2,0,1,1.42,261,13,2,0,0,1.42,261,13,2,1,1,1.42,286,13,2,1,0,1.42,286,13,2,2,1,1.42,311,13,2,2,0,1.42,311,13,2,3,1,1.42,336,13,2,3,0,1.42,336,13,2,4,1,1.42,361,13,2,4,0,1.42,361,13,2,5,1,1.42,386,13,2,5,0,1.42,386,13,2,6,1,1.42,411,13,2,6,0,1.42,411,13,2,7,1,1.42,436,13,2,7,0,1.42,436,14,2,0,1,1.17,279,14,2,0,0,1.17,279,14,2,1,1,1.17,304,14,2,1,0,1.17,304,14,2,2,1,1.17,329,14,2,2,0,1.17,329,14,2,3,1,1.17,354,14,2,3,0,1.17,354,14,2,4,1,1.17,379,14,2,4,0,1.17,379,14,2,5,1,1.17,404,14,2,5,0,1.17,404,14,2,6,1,1.17,429,14,2,6,0,1.17,429,14,2,7,1,1.17,454,14,2,7,0,1.17,454,15,0,0,1,0.88,261,15,0,0,0,0.87,261,15,0,1,1,0.58,286,15,0,1,0,0.56,286,15,0,2,1,0.43,311,15,0,2,0,0.42,311,15,0,3,1,0.34,336,15,0,3,0,0.33,336,15,0,4,1,0.28,361,15,0,4,0,0.27,361,15,0,5,1,0.24,386,15,0,5,0,0.23,386,15,0,6,1,0.21,411,15,0,6,0,0.2,411,15,0,7,1,0.19,436,15,0,7,0,0.18,436,15,1,0,1,0.86,261,15,1,0,0,0.85,261,15,1,1,1,0.56,286,15,1,1,0,0.55,286,15,1,2,1,0.42,311,15,1,2,0,0.41,311,15,1,3,1,0.33,336,15,1,3,0,0.32,336,15,1,4,1,0.28,361,15,1,4,0,0.27,361,15,1,5,1,0.24,386,15,1,5,0,0.23,386,15,1,6,1,0.21,411,15,1,6,0,0.2,411,15,1,7,1,0.19,436,15,1,7,0,0.18,436,15,3,0,1,0.68,261,15,3,0,0,0.66,261,15,3,1,1,0.42,286,15,3,1,0,0.4,286,15,3,2,1,0.3,311,15,3,2,0,0.29,311,15,3,3,1,0.24,336,15,3,3,0,0.23,336,15,3,4,1,0.2,361,15,3,4,0,0.19,361,15,3,5,1,0.17,386,15,3,5,0,0.16,386,15,3,6,1,0.15,411,15,3,6,0,0.14,411,15,3,7,1,0.13,436,15,3,7,0,0.13,436,16,0,0,1,0.78,279,16,0,0,0,0.77,279,16,0,1,1,0.53,304,16,0,1,0,0.52,304,16,0,2,1,0.4,329,16,0,2,0,0.39,329,16,0,3,1,0.32,354,16,0,3,0,0.31,354,16,0,4,1,0.27,379,16,0,4,0,0.26,379,16,0,5,1,0.23,404,16,0,5,0,0.23,404,16,0,6,1,0.2,429,16,0,6,0,0.2,429,16,0,7,1,0.18,454,16,0,7,0,0.18,454,16,1,0,1,0.76,279,16,1,0,0,0.75,279,16,1,1,1,0.52,304,16,1,1,0,0.51,304,16,1,2,1,0.39,329,16,1,2,0,0.38,329,16,1,3,1,0.32,354,16,1,3,0,0.31,354,16,1,4,1,0.27,379,16,1,4,0,0.26,379,16,1,5,1,0.23,404,16,1,5,0,0.22,404,16,1,6,1,0.2,429,16,1,6,0,0.2,429,16,1,7,1,0.18,454,16,1,7,0,0.18,454,16,3,0,1,0.62,279,16,3,0,0,0.6,279,16,3,1,1,0.39,304,16,3,1,0,0.38,304,16,3,2,1,0.29,329,16,3,2,0,0.28,329,16,3,3,1,0.23,354,16,3,3,0,0.22,354,16,3,4,1,0.19,379,16,3,4,0,0.18,379,16,3,5,1,0.16,404,16,3,5,0,0.16,404,16,3,6,1,0.14,429,16,3,6,0,0.14,429,16,3,7,1,0.13,454,16,3,7,0,0.12,454,17,0,2,1,0.76,311,17,0,2,0,0.75,311,17,0,3,1,0.52,336,17,0,3,0,0.51,336,17,0,4,1,0.4,361,17,0,4,0,0.39,361,17,0,5,1,0.32,386,17,0,5,0,0.31,386,17,0,6,1,0.27,411,17,0,6,0,0.26,411,17,0,7,1,0.23,436,17,0,7,0,0.22,436,17,1,2,1,0.75,311,17,1,2,0,0.74,311,17,1,3,1,0.51,336,17,1,3,0,0.5,336,17,1,4,1,0.39,361,17,1,4,0,0.38,361,17,1,5,1,0.31,386,17,1,5,0,0.31,386,17,1,6,1,0.26,411,17,1,6,0,0.26,411,17,1,7,1,0.23,436,17,1,7,0,0.22,436,17,3,2,1,0.61,311,17,3,2,0,0.59,311,17,3,3,1,0.39,336,17,3,3,0,0.38,336,17,3,4,1,0.29,361,17,3,4,0,0.28,361,17,3,5,1,0.23,386,17,3,5,0,0.22,386,17,3,6,1,0.19,411,17,3,6,0,0.18,411,17,3,7,1,0.16,436,17,3,7,0,0.16,436],\"corrections\":[],\"width\":6},{\"id\":\"2-29\",\"element\":\"wall\",\"title\":\"Brick/block cavity\",\"dims\":[{\"key\":\"cavity_depth_mm\",\"label\":\"Cavity\",\"values\":[25,50,75,100,125,150,175,200]},{\"key\":\"wall_ties\",\"label\":\"Wall ties\",\"values\":[\"insulated\",\"metal\"]},{\"key\":\"inner_leaf_depth_mm\",\"label\":\"Inner leaf\",\"values\":[100,125]},{\"key\":\"inner_leaf\",\"label\":\"Inner leaf block\",\"values\":[\"HP block\",\"dense concrete block\"]}],\"descriptions\":[\"102 mm brick, cavity (wall ties), HP block, 13 mm plaster\",\"102 mm brick, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, cavity (wall ties), dense concrete block, 13 mm plaster\",\"102 mm brick, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"102 mm brick, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"102 mm brick, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"102 mm brick, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"102 mm brick, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"102 mm brick, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), 102 mm brick, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), 102 mm brick, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (batts)\",\"open cavity\",\"polyurethane foam\"],\"rows\":[0,2,0,1,0,0,0.71,240,0,2,0,1,1,0,0.61,265,0,2,0,0,0,0,0.71,240,0,2,0,0,1,0,0.61,265,0,2,1,1,0,0,0.71,265,0,2,1,1,1,0,0.61,290,0,2,1,0,0,0,0.71,265,0,2,1,0,1,0,0.61,290,0,2,2,1,0,0,0.71,290,0,2,2,1,1,0,0.61,315,0,2,2,0,0,0,0.71,290,0,2,2,0,1,0,0.61,315,0,2,3,1,0,0,0.71,315,0,2,3,1,1,0,0.61,340,0,2,3,0,0,0,0.71,315,0,2,3,0,1,0,0.61,340,0,2,4,1,0,0,0.71,340,0,2,4,1,1,0,0.61,365,0,2,4,0,0,0,0.71,340,0,2,4,0,1,0,0.61,365,0,2,5,1,0,0,0.71,365,0,2,5,1,1,0,0.61,390,0,2,5,0,0,0,0.71,365,0,2,5,0,1,0,0.61,390,0,2,6,1,0,0,0.71,390,0,2,6,1,1,0,0.61,415,0,2,6,0,0,0,0.71,390,0,2,6,0,1,0,0.61,415,0,2,7,1,0,0,0.71,415,0,2,7,1,1,0,0.61,440,0,2,7,0,0,0,0.71,415,0,2,7,0,1,0,0.61,440,1,2,0,1,0,0,0.64,258,1,2,0,1,1,0,0.56,283,1,2,0,0,0,0,0.64,258,1,2,0,0,1,0,0.56,283,1,2,1,1,0,0,0.64,283,1,2,1,1,1,0,0.56,308,1,2,1,0,0,0,0.64,283,1,2,1,0,1,0,0.56,308,1,2,2,1,0,0,0.64,308,1,2,2,1,1,0,0.56,333,1,2,2,0,0,0,0.64,308,1,2,2,0,1,0,0.56,333,1,2,3,1,0,0,0.64,333,1,2,3,1,1,0,0.56,358,1,2,3,0,0,0,0.64,333,1,2,3,0,1,0,0.56,358,1,2,4,1,0,0,0.64,358,1,2,4,1,1,0,0.56,383,1,2,4,0,0,0,0.64,358,1,2,4,0,1,0,0.56,383,1,2,5,1,0,0,0.64,383,1,2,5,1,1,0,0.56,408,1,2,5,0,0,0,0.64,383,1,2,5,0,1,0,0.56,408,1,2,6,1,0,0,0.64,408,1,2,6,1,1,0,0.56,433,1,2,6,0,0,0,0.64,408,1,2,6,0,1,0,0.56,433,1,2,7,1,0,0,0.64,433,1,2,7,1,1,0,0.56,458,1,2,7,0,0,0,0.64,433,1,2,7,0,1,0,0.56,458,2,2,0,1,0,1,1.78,240,2,2,0,1,1,1,1.74,265,2,2,0,0,0,1,1.78,240,2,2,0,0,1,1,1.73,265,2,2,1,1,0,1,1.78,265,2,2,1,1,1,1,1.74,290,2,2,1,0,0,1,1.78,265,2,2,1,0,1,1,1.73,290,2,2,2,1,0,1,1.78,290,2,2,2,1,1,1,1.74,315,2,2,2,0,0,1,1.78,290,2,2,2,0,1,1,1.73,315,2,2,3,1,0,1,1.78,315,2,2,3,1,1,1,1.74,340,2,2,3,0,0,1,1.78,315,2,2,3,0,1,1,1.73,340,2,2,4,1,0,1,1.78,340,2,2,4,1,1,1,1.73,365,2,2,4,0,0,1,1.78,340,2,2,4,0,1,1,1.73,365,2,2,5,1,0,1,1.78,365,2,2,5,1,1,1,1.73,390,2,2,5,0,0,1,1.78,365,2,2,5,0,1,1,1.73,390,2,2,6,1,0,1,1.78,390,2,2,6,1,1,1,1.73,415,2,2,6,0,0,1,1.78,390,2,2,6,0,1,1,1.73,415,2,2,7,1,0,1,1.78,415,2,2,7,1,1,1,1.73,440,2,2,7,0,0,1,1.78,415,2,2,7,0,1,1,1.73,440,3,2,0,1,0,1,1.41,258,3,2,0,1,1,1,1.38,283,3,2,0,0,0,1,1.4,258,3,2,0,0,1,1,1.37,283,3,2,1,1,0,1,1.4,283,3,2,1,1,1,1,1.38,308,3,2,1,0,0,1,1.4,283,3,2,1,0,1,1,1.37,308,3,2,2,1,0,1,1.4,308,3,2,2,1,1,1,1.38,333,3,2,2,0,0,1,1.4,308,3,2,2,0,1,1,1.37,333,3,2,3,1,0,1,1.4,333,3,2,3,1,1,1,1.38,358,3,2,3,0,0,1,1.4,333,3,2,3,0,1,1,1.37,358,3,2,4,1,0,1,1.4,358,3,2,4,1,1,1,1.38,383,3,2,4,0,0,1,1.4,358,3,2,4,0,1,1,1.37,383,3,2,5,1,0,1,1.4,383,3,2,5,1,1,1,1.38,408,3,2,5,0,0,1,1.4,383,3,2,5,0,1,1,1.37,408,3,2,6,1,0,1,1.4,408,3,2,6,1,1,1,1.38,433,3,2,6,0,0,1,1.4,408,3,2,6,0,1,1,1.37,433,3,2,7,1,0,1,1.4,433,3,2,7,1,1,1,1.37,458,3,2,7,0,0,1,1.4,433,3,2,7,0,1,1,1.37,458,4,0,0,1,0,0,0.54,240,4,0,0,1,1,0,0.48,265,4,0,0,0,0,0,0.54,240,4,0,0,0,1,0,0.48,265,4,0,1,1,0,0,0.41,265,4,0,1,1,1,0,0.37,290,4,0,1,0,0,0,0.4,265,4,0,1,0,1,0,0.37,290,4,0,2,1,0,0,0.33,290,4,0,2,1,1,0,0.3,315,4,0,2,0,0,0,0.32,290,4,0,2,0,1,0,0.3,315,4,0,3,1,0,0,0.27,315,4,0,3,1,1,0,0.26,340,4,0,3,0,0,0,0.27,315,4,0,3,0,1,0,0.25,340,4,0,4,1,0,0,0.23,340,4,0,4,1,1,0,0.22,365,4,0,4,0,0,0,0.23,340,4,0,4,0,1,0,0.22,365,4,0,5,1,0,0,0.21,365,4,0,5,1,1,0,0.2,390,4,0,5,0,0,0,0.2,365,4,0,5,0,1,0,0.19,390,4,0,6,1,0,0,0.18,390,4,0,6,1,1,0,0.18,415,4,0,6,0,0,0,0.18,390,4,0,6,0,1,0,0.17,415,4,0,7,1,0,0,0.16,415,4,0,7,1,1,0,0.16,440,4,0,7,0,0,0,0.16,415,4,0,7,0,1,0,0.15,440,4,1,0,1,0,0,0.54,240,4,1,0,1,1,0,0.48,265,4,1,0,0,0,0,0.53,240,4,1,0,0,1,0,0.47,265,4,1,1,1,0,0,0.4,265,4,1,1,1,1,0,0.37,290,4,1,1,0,0,0,0.39,265,4,1,1,0,1,0,0.36,290,4,1,2,1,0,0,0.32,290,4,1,2,1,1,0,0.3,315,4,1,2,0,0,0,0.32,290,4,1,2,0,1,0,0.29,315,4,1,3,1,0,0,0.27,315,4,1,3,1,1,0,0.25,340,4,1,3,0,0,0,0.26,315,4,1,3,0,1,0,0.25,340,4,1,4,1,0,0,0.23,340,4,1,4,1,1,0,0.22,365,4,1,4,0,0,0,0.23,340,4,1,4,0,1,0,0.22,365,4,1,5,1,0,0,0.2,365,4,1,5,1,1,0,0.19,390,4,1,5,0,0,0,0.2,365,4,1,5,0,1,0,0.19,390,4,1,6,1,0,0,0.18,390,4,1,6,1,1,0,0.17,415,4,1,6,0,0,0,0.18,390,4,1,6,0,1,0,0.17,415,4,1,7,1,0,0,0.16,415,4,1,7,1,1,0,0.16,440,4,1,7,0,0,0,0.16,415,4,1,7,0,1,0,0.15,440,4,3,0,1,0,0,0.46,240,4,3,0,1,1,0,0.42,265,4,3,0,0,0,0,0.45,240,4,3,0,0,1,0,0.41,265,4,3,1,1,0,0,0.32,265,4,3,1,1,1,0,0.3,290,4,3,1,0,0,0,0.31,265,4,3,1,0,1,0,0.29,290,4,3,2,1,0,0,0.25,290,4,3,2,1,1,0,0.24,315,4,3,2,0,0,0,0.24,290,4,3,2,0,1,0,0.23,315,4,3,3,1,0,0,0.2,315,4,3,3,1,1,0,0.2,340,4,3,3,0,0,0,0.2,315,4,3,3,0,1,0,0.19,340,4,3,4,1,0,0,0.17,340,4,3,4,1,1,0,0.17,365,4,3,4,0,0,0,0.17,340,4,3,4,0,1,0,0.16,365,4,3,5,1,0,0,0.15,365,4,3,5,1,1,0,0.15,390,4,3,5,0,0,0,0.15,365,4,3,5,0,1,0,0.14,390,4,3,6,1,0,0,0.13,390,4,3,6,1,1,0,0.13,415,4,3,6,0,0,0,0.13,390,4,3,6,0,1,0,0.13,415,4,3,7,1,0,0,0.12,415,4,3,7,1,1,0,0.12,440,4,3,7,0,0,0,0.12,415,4,3,7,0,1,0,0.11,440,5,0,0,1,0,0,0.5,258,5,0,0,1,1,0,0.45,283,5,0,0,0,0,0,0.5,258,5,0,0,0,1,0,0.45,283,5,0,1,1,0,0,0.38,283,5,0,1,1,1,0,0.35,308,5,0,1,0,0,0,0.38,283,5,0,1,0,1,0,0.35,308,5,0,2,1,0,0,0.31,308,5,0,2,1,1,0,0.29,333,5,0,2,0,0,0,0.31,308,5,0,2,0,1,0,0.29,333,5,0,3,1,0,0,0.26,333,5,0,3,1,1,0,0.25,358,5,0,3,0,0,0,0.26,333,5,0,3,0,1,0,0.24,358,5,0,4,1,0,0,0.23,358,5,0,4,1,1,0,0.22,383,5,0,4,0,0,0,0.22,358,5,0,4,0,1,0,0.21,383,5,0,5,1,0,0,0.2,383,5,0,5,1,1,0,0.19,408,5,0,5,0,0,0,0.19,383,5,0,5,0,1,0,0.19,408,5,0,6,1,0,0,0.18,408,5,0,6,1,1,0,0.17,433,5,0,6,0,0,0,0.17,408,5,0,6,0,1,0,0.17,433,5,0,7,1,0,0,0.16,433,5,0,7,1,1,0,0.15,458,5,0,7,0,0,0,0.16,433,5,0,7,0,1,0,0.15,458,5,1,0,1,0,0,0.5,258,5,1,0,1,1,0,0.45,283,5,1,0,0,0,0,0.49,258,5,1,0,0,1,0,0.44,283,5,1,1,1,0,0,0.38,283,5,1,1,1,1,0,0.35,308,5,1,1,0,0,0,0.37,283,5,1,1,0,1,0,0.34,308,5,1,2,1,0,0,0.31,308,5,1,2,1,1,0,0.29,333,5,1,2,0,0,0,0.3,308,5,1,2,0,1,0,0.28,333,5,1,3,1,0,0,0.26,333,5,1,3,1,1,0,0.24,358,5,1,3,0,0,0,0.25,333,5,1,3,0,1,0,0.24,358,5,1,4,1,0,0,0.22,358,5,1,4,1,1,0,0.21,383,5,1,4,0,0,0,0.22,358,5,1,4,0,1,0,0.21,383,5,1,5,1,0,0,0.2,383,5,1,5,1,1,0,0.19,408,5,1,5,0,0,0,0.19,383,5,1,5,0,1,0,0.18,408,5,1,6,1,0,0,0.18,408,5,1,6,1,1,0,0.17,433,5,1,6,0,0,0,0.17,408,5,1,6,0,1,0,0.17,433,5,1,7,1,0,0,0.16,433,5,1,7,1,1,0,0.15,458,5,1,7,0,0,0,0.16,433,5,1,7,0,1,0,0.15,458,5,3,0,1,0,0,0.43,258,5,3,0,1,1,0,0.39,283,5,3,0,0,0,0,0.42,258,5,3,0,0,1,0,0.38,283,5,3,1,1,0,0,0.31,283,5,3,1,1,1,0,0.29,308,5,3,1,0,0,0,0.3,283,5,3,1,0,1,0,0.28,308,5,3,2,1,0,0,0.24,308,5,3,2,1,1,0,0.23,333,5,3,2,0,0,0,0.23,308,5,3,2,0,1,0,0.22,333,5,3,3,1,0,0,0.2,333,5,3,3,1,1,0,0.19,358,5,3,3,0,0,0,0.19,333,5,3,3,0,1,0,0.18,358,5,3,4,1,0,0,0.17,358,5,3,4,1,1,0,0.16,383,5,3,4,0,0,0,0.16,358,5,3,4,0,1,0,0.16,383,5,3,5,1,0,0,0.15,383,5,3,5,1,1,0,0.14,408,5,3,5,0,0,0,0.14,383,5,3,5,0,1,0,0.14,408,5,3,6,1,0,0,0.13,408,5,3,6,1,1,0,0.13,433,5,3,6,0,0,0,0.13,408,5,3,6,0,1,0,0.12,433,5,3,7,1,0,0,0.12,433,5,3,7,1,1,0,0.12,458,5,3,7,0,0,0,0.11,433,5,3,7,0,1,0,0.11,458,6,0,0,1,0,1,1.01,240,6,0,0,1,1,1,1.0,265,6,0,0,0,0,1,0.99,240,6,0,0,0,1,1,0.98,265,6,0,1,1,0,1,0.63,265,6,0,1,1,1,1,0.62,290,6,0,1,0,0,1,0.61,265,6,0,1,0,1,1,0.61,290,6,0,2,1,0,1,0.45,290,6,0,2,1,1,1,0.45,315,6,0,2,0,0,1,0.44,290,6,0,2,0,1,1,0.44,315,6,0,3,1,0,1,0.36,315,6,0,3,1,1,1,0.35,340,6,0,3,0,0,1,0.35,315,6,0,3,0,1,1,0.35,340,6,0,4,1,0,1,0.29,340,6,0,4,1,1,1,0.29,365,6,0,4,0,0,1,0.29,340,6,0,4,0,1,1,0.28,365,6,0,5,1,0,1,0.25,365,6,0,5,1,1,1,0.25,390,6,0,5,0,0,1,0.24,365,6,0,5,0,1,1,0.24,390,6,0,6,1,0,1,0.22,390,6,0,6,1,1,1,0.22,415,6,0,6,0,0,1,0.21,390,6,0,6,0,1,1,0.21,415,6,0,7,1,0,1,0.19,415,6,0,7,1,1,1,0.19,440,6,0,7,0,0,1,0.19,415,6,0,7,0,1,1,0.19,440,6,1,0,1,0,1,0.99,240,6,1,0,1,1,1,0.97,265,6,1,0,0,0,1,0.97,240,6,1,0,0,1,1,0.95,265,6,1,1,1,0,1,0.61,265,6,1,1,1,1,1,0.6,290,6,1,1,0,0,1,0.6,265,6,1,1,0,1,1,0.59,290,6,1,2,1,0,1,0.44,290,6,1,2,1,1,1,0.44,315,6,1,2,0,0,1,0.43,290,6,1,2,0,1,1,0.43,315,6,1,3,1,0,1,0.35,315,6,1,3,1,1,1,0.35,340,6,1,3,0,0,1,0.34,315,6,1,3,0,1,1,0.34,340,6,1,4,1,0,1,0.29,340,6,1,4,1,1,1,0.29,365,6,1,4,0,0,1,0.28,340,6,1,4,0,1,1,0.28,365,6,1,5,1,0,1,0.25,365,6,1,5,1,1,1,0.25,390,6,1,5,0,0,1,0.24,365,6,1,5,0,1,1,0.24,390,6,1,6,1,0,1,0.22,390,6,1,6,1,1,1,0.21,415,6,1,6,0,0,1,0.21,390,6,1,6,0,1,1,0.21,415,6,1,7,1,0,1,0.19,415,6,1,7,1,1,1,0.19,440,6,1,7,0,0,1,0.19,415,6,1,7,0,1,1,0.19,440,6,3,0,1,0,1,0.75,240,6,3,0,1,1,1,0.75,265,6,3,0,0,0,1,0.73,240,6,3,0,0,1,1,0.72,265,6,3,1,1,0,1,0.44,265,6,3,1,1,1,1,0.44,290,6,3,1,0,0,1,0.43,265,6,3,1,0,1,1,0.42,290,6,3,2,1,0,1,0.32,290,6,3,2,1,1,1,0.32,315,6,3,2,0,0,1,0.3,290,6,3,2,0,1,1,0.3,315,6,3,3,1,0,1,0.25,315,6,3,3,1,1,1,0.25,340,6,3,3,0,0,1,0.24,315,6,3,3,0,1,1,0.24,340,6,3,4,1,0,1,0.2,340,6,3,4,1,1,1,0.2,365,6,3,4,0,0,1,0.19,340,6,3,4,0,1,1,0.19,365,6,3,5,1,0,1,0.17,365,6,3,5,1,1,1,0.17,390,6,3,5,0,0,1,0.17,365,6,3,5,0,1,1,0.17,390,6,3,6,1,0,1,0.15,390,6,3,6,1,1,1,0.15,415,6,3,6,0,0,1,0.14,390,6,3,6,0,1,1,0.14,415,6,3,7,1,0,1,0.13,415,6,3,7,1,1,1,0.13,440,6,3,7,0,0,1,0.13,415,6,3,7,0,1,1,0.13,440,7,0,0,1,0,1,0.88,258,7,0,0,1,1,1,0.87,283,7,0,0,0,0,1,0.86,258,7,0,0,0,1,1,0.85,283,7,0,1,1,0,1,0.57,283,7,0,1,1,1,1,0.57,308,7,0,1,0,0,1,0.56,283,7,0,1,0,1,1,0.56,308,7,0,2,1,0,1,0.43,308,7,0,2,1,1,1,0.42,333,7,0,2,0,0,1,0.42,308,7,0,2,0,1,1,0.41,333,7,0,3,1,0,1,0.34,333,7,0,3,1,1,1,0.34,358,7,0,3,0,0,1,0.33,333,7,0,3,0,1,1,0.33,358,7,0,4,1,0,1,0.28,358,7,0,4,1,1,1,0.28,383,7,0,4,0,0,1,0.27,358,7,0,4,0,1,1,0.27,383,7,0,5,1,0,1,0.24,383,7,0,5,1,1,1,0.24,408,7,0,5,0,0,1,0.23,383,7,0,5,0,1,1,0.23,408,7,0,6,1,0,1,0.21,408,7,0,6,1,1,1,0.21,433,7,0,6,0,0,1,0.2,408,7,0,6,0,1,1,0.2,433,7,0,7,1,0,1,0.19,433,7,0,7,1,1,1,0.19,458,7,0,7,0,0,1,0.18,433,7,0,7,0,1,1,0.18,458,7,1,0,1,0,1,0.86,258,7,1,0,1,1,1,0.85,283,7,1,0,0,0,1,0.84,258,7,1,0,0,1,1,0.83,283,7,1,1,1,0,1,0.56,283,7,1,1,1,1,1,0.55,308,7,1,1,0,0,1,0.55,283,7,1,1,0,1,1,0.54,308,7,1,2,1,0,1,0.42,308,7,1,2,1,1,1,0.41,333,7,1,2,0,0,1,0.4,308,7,1,2,0,1,1,0.4,333,7,1,3,1,0,1,0.33,333,7,1,3,1,1,1,0.33,358,7,1,3,0,0,1,0.32,333,7,1,3,0,1,1,0.32,358,7,1,4,1,0,1,0.28,358,7,1,4,1,1,1,0.28,383,7,1,4,0,0,1,0.27,358,7,1,4,0,1,1,0.27,383,7,1,5,1,0,1,0.24,383,7,1,5,1,1,1,0.24,408,7,1,5,0,0,1,0.23,383,7,1,5,0,1,1,0.23,408,7,1,6,1,0,1,0.21,408,7,1,6,1,1,1,0.21,433,7,1,6,0,0,1,0.2,408,7,1,6,0,1,1,0.2,433,7,1,7,1,0,1,0.19,433,7,1,7,1,1,1,0.19,458,7,1,7,0,0,1,0.18,433,7,1,7,0,1,1,0.18,458,7,3,0,1,0,1,0.68,258,7,3,0,1,1,1,0.67,283,7,3,0,0,0,1,0.66,258,7,3,0,0,1,1,0.65,283,7,3,1,1,0,1,0.42,283,7,3,1,1,1,1,0.41,308,7,3,1,0,0,1,0.4,283,7,3,1,0,1,1,0.4,308,7,3,2,1,0,1,0.3,308,7,3,2,1,1,1,0.3,333,7,3,2,0,0,1,0.29,308,7,3,2,0,1,1,0.29,333,7,3,3,1,0,1,0.24,333,7,3,3,1,1,1,0.24,358,7,3,3,0,0,1,0.23,333,7,3,3,0,1,1,0.23,358,7,3,4,1,0,1,0.2,358,7,3,4,1,1,1,0.2,383,7,3,4,0,0,1,0.19,358,7,3,4,0,1,1,0.19,383,7,3,5,1,0,1,0.17,383,7,3,5,1,1,1,0.17,408,7,3,5,0,0,1,0.16,383,7,3,5,0,1,1,0.16,408,7,3,6,1,0,1,0.15,408,7,3,6,1,1,1,0.15,433,7,3,6,0,0,1,0.14,408,7,3,6,0,1,1,0.14,433,7,3,7,1,0,1,0.13,433,7,3,7,1,1,1,0.13,458,7,3,7,0,0,1,0.13,433,7,3,7,0,1,1,0.13,458,8,0,2,1,0,0,0.5,290,8,0,2,1,1,0,0.44,315,8,0,2,0,0,0,0.49,290,8,0,2,0,1,0,0.44,315,8,0,3,1,0,0,0.38,315,8,0,3,1,1,0,0.35,340,8,0,3,0,0,0,0.38,315,8,0,3,0,1,0,0.35,340,8,0,4,1,0,0,0.31,340,8,0,4,1,1,0,0.29,365,8,0,4,0,0,0,0.3,340,8,0,4,0,1,0,0.28,365,8,0,5,1,0,0,0.26,365,8,0,5,1,1,0,0.25,390,8,0,5,0,0,0,0.26,365,8,0,5,0,1,0,0.24,390,8,0,6,1,0,0,0.23,390,8,0,6,1,1,0,0.21,415,8,0,6,0,0,0,0.22,390,8,0,6,0,1,0,0.21,415,8,0,7,1,0,0,0.2,415,8,0,7,1,1,0,0.19,440,8,0,7,0,0,0,0.19,415,8,0,7,0,1,0,0.19,440,8,1,2,1,0,0,0.49,290,8,1,2,1,1,0,0.44,315,8,1,2,0,0,0,0.48,290,8,1,2,0,1,0,0.44,315,8,1,3,1,0,0,0.37,315,8,1,3,1,1,0,0.35,340,8,1,3,0,0,0,0.37,315,8,1,3,0,1,0,0.34,340,8,1,4,1,0,0,0.3,340,8,1,4,1,1,0,0.28,365,8,1,4,0,0,0,0.3,340,8,1,4,0,1,0,0.28,365,8,1,5,1,0,0,0.26,365,8,1,5,1,1,0,0.24,390,8,1,5,0,0,0,0.25,365,8,1,5,0,1,0,0.24,390,8,1,6,1,0,0,0.22,390,8,1,6,1,1,0,0.21,415,8,1,6,0,0,0,0.22,390,8,1,6,0,1,0,0.21,415,8,1,7,1,0,0,0.2,415,8,1,7,1,1,0,0.19,440,8,1,7,0,0,0,0.19,415,8,1,7,0,1,0,0.18,440,8,3,2,1,0,0,0.42,290,8,3,2,1,1,0,0.39,315,8,3,2,0,0,0,0.42,290,8,3,2,0,1,0,0.38,315,8,3,3,1,0,0,0.3,315,8,3,3,1,1,0,0.29,340,8,3,3,0,0,0,0.3,315,8,3,3,0,1,0,0.28,340,8,3,4,1,0,0,0.24,340,8,3,4,1,1,0,0.23,365,8,3,4,0,0,0,0.23,340,8,3,4,0,1,0,0.22,365,8,3,5,1,0,0,0.2,365,8,3,5,1,1,0,0.19,390,8,3,5,0,0,0,0.19,365,8,3,5,0,1,0,0.18,390,8,3,6,1,0,0,0.17,390,8,3,6,1,1,0,0.16,415,8,3,6,0,0,0,0.16,390,8,3,6,0,1,0,0.16,415,8,3,7,1,0,0,0.15,415,8,3,7,1,1,0,0.14,440,8,3,7,0,0,0,0.14,415,8,3,7,0,1,0,0.14,440,9,0,2,1,0,0,0.46,308,9,0,2,1,1,0,0.42,333,9,0,2,0,0,0,0.46,308,9,0,2,0,1,0,0.41,333,9,0,3,1,0,0,0.36,333,9,0,3,1,1,0,0.33,358,9,0,3,0,0,0,0.36,333,9,0,3,0,1,0,0.33,358,9,0,4,1,0,0,0.3,358,9,0,4,1,1,0,0.28,383,9,0,4,0,0,0,0.29,358,9,0,4,0,1,0,0.27,383,9,0,5,1,0,0,0.25,383,9,0,5,1,1,0,0.24,408,9,0,5,0,0,0,0.25,383,9,0,5,0,1,0,0.23,408,9,0,6,1,0,0,0.22,408,9,0,6,1,1,0,0.21,433,9,0,6,0,0,0,0.21,408,9,0,6,0,1,0,0.2,433,9,0,7,1,0,0,0.19,433,9,0,7,1,1,0,0.18,458,9,0,7,0,0,0,0.19,433,9,0,7,0,1,0,0.18,458,9,1,2,1,0,0,0.45,308,9,1,2,1,1,0,0.41,333,9,1,2,0,0,0,0.45,308,9,1,2,0,1,0,0.41,333,9,1,3,1,0,0,0.35,333,9,1,3,1,1,0,0.33,358,9,1,3,0,0,0,0.35,333,9,1,3,0,1,0,0.32,358,9,1,4,1,0,0,0.29,358,9,1,4,1,1,0,0.27,383,9,1,4,0,0,0,0.29,358,9,1,4,0,1,0,0.27,383,9,1,5,1,0,0,0.25,383,9,1,5,1,1,0,0.23,408,9,1,5,0,0,0,0.24,383,9,1,5,0,1,0,0.23,408,9,1,6,1,0,0,0.22,408,9,1,6,1,1,0,0.21,433,9,1,6,0,0,0,0.21,408,9,1,6,0,1,0,0.2,433,9,1,7,1,0,0,0.19,433,9,1,7,1,1,0,0.18,458,9,1,7,0,0,0,0.19,433,9,1,7,0,1,0,0.18,458,9,3,2,1,0,0,0.4,308,9,3,2,1,1,0,0.37,333,9,3,2,0,0,0,0.39,308,9,3,2,0,1,0,0.36,333,9,3,3,1,0,0,0.29,333,9,3,3,1,1,0,0.27,358,9,3,3,0,0,0,0.28,333,9,3,3,0,1,0,0.27,358,9,3,4,1,0,0,0.23,358,9,3,4,1,1,0,0.22,383,9,3,4,0,0,0,0.22,358,9,3,4,0,1,0,0.21,383,9,3,5,1,0,0,0.19,383,9,3,5,1,1,0,0.18,408,9,3,5,0,0,0,0.18,383,9,3,5,0,1,0,0.18,408,9,3,6,1,0,0,0.16,408,9,3,6,1,1,0,0.16,433,9,3,6,0,0,0,0.16,408,9,3,6,0,1,0,0.15,433,9,3,7,1,0,0,0.14,433,9,3,7,1,1,0,0.14,458,9,3,7,0,0,0,0.14,433,9,3,7,0,1,0,0.13,458,10,0,2,1,0,1,0.86,290,10,0,2,1,1,1,0.85,315,10,0,2,0,0,1,0.84,290,10,0,2,0,1,1,0.83,315,10,0,3,1,0,1,0.56,315,10,0,3,1,1,1,0.56,340,10,0,3,0,0,1,0.55,315,10,0,3,0,1,1,0.55,340,10,0,4,1,0,1,0.42,340,10,0,4,1,1,1,0.42,365,10,0,4,0,0,1,0.41,340,10,0,4,0,1,1,0.41,365,10,0,5,1,0,1,0.33,365,10,0,5,1,1,1,0.33,390,10,0,5,0,0,1,0.33,365,10,0,5,0,1,1,0.33,390,10,0,6,1,0,1,0.28,390,10,0,6,1,1,1,0.28,415,10,0,6,0,0,1,0.27,390,10,0,6,0,1,1,0.27,415,10,0,7,1,0,1,0.24,415,10,0,7,1,1,1,0.24,440,10,0,7,0,0,1,0.23,415,10,0,7,0,1,1,0.23,440,10,1,2,1,0,1,0.84,290,10,1,2,1,1,1,0.83,315,10,1,2,0,0,1,0.82,290,10,1,2,0,1,1,0.81,315,10,1,3,1,0,1,0.55,315,10,1,3,1,1,1,0.55,340,10,1,3,0,0,1,0.54,315,10,1,3,0,1,1,0.53,340,10,1,4,1,0,1,0.41,340,10,1,4,1,1,1,0.41,365,10,1,4,0,0,1,0.4,340,10,1,4,0,1,1,0.4,365,10,1,5,1,0,1,0.33,365,10,1,5,1,1,1,0.33,390,10,1,5,0,0,1,0.32,365,10,1,5,0,1,1,0.32,390,10,1,6,1,0,1,0.27,390,10,1,6,1,1,1,0.27,415,10,1,6,0,0,1,0.27,390,10,1,6,0,1,1,0.27,415,10,1,7,1,0,1,0.24,415,10,1,7,1,1,1,0.23,440,10,1,7,0,0,1,0.23,415,10,1,7,0,1,1,0.23,440,10,3,2,1,0,1,0.64,290,10,3,2,1,1,1,0.64,315,10,3,2,0,0,1,0.64,290,10,3,2,0,1,1,0.64,315,10,3,3,1,0,1,0.4,315,10,3,3,1,1,1,0.39,340,10,3,3,0,0,1,0.4,315,10,3,3,0,1,1,0.39,340,10,3,4,1,0,1,0.29,340,10,3,4,1,1,1,0.29,365,10,3,4,0,0,1,0.29,340,10,3,4,0,1,1,0.29,365,10,3,5,1,0,1,0.23,365,10,3,5,1,1,1,0.23,390,10,3,5,0,0,1,0.23,365,10,3,5,0,1,1,0.23,390,10,3,6,1,0,1,0.19,390,10,3,6,1,1,1,0.19,415,10,3,6,0,0,1,0.19,390,10,3,6,0,1,1,0.19,415,10,3,7,1,0,1,0.16,415,10,3,7,1,1,1,0.16,440,10,3,7,0,0,1,0.16,415,10,3,7,0,1,1,0.16,440,11,0,2,1,0,1,0.76,308,11,0,2,1,1,1,0.75,333,11,0,2,0,0,1,0.75,308,11,0,2,0,1,1,0.74,333,11,0,3,1,0,1,0.52,333,11,0,3,1,1,1,0.52,358,11,0,3,0,0,1,0.51,333,11,0,3,0,1,1,0.51,358,11,0,4,1,0,1,0.39,358,11,0,4,1,1,1,0.39,383,11,0,4,0,0,1,0.39,358,11,0,4,0,1,1,0.38,383,11,0,5,1,0,1,0.32,383,11,0,5,1,1,1,0.32,408,11,0,5,0,0,1,0.31,383,11,0,5,0,1,1,0.31,408,11,0,6,1,0,1,0.27,408,11,0,6,1,1,1,0.27,433,11,0,6,0,0,1,0.26,408,11,0,6,0,1,1,0.26,433,11,0,7,1,0,1,0.23,433,11,0,7,1,1,1,0.23,458,11,0,7,0,0,1,0.22,433,11,0,7,0,1,1,0.22,458,11,1,2,1,0,1,0.74,308,11,1,2,1,1,1,0.73,333,11,1,2,0,0,1,0.73,308,11,1,2,0,1,1,0.72,333,11,1,3,1,0,1,0.51,333,11,1,3,1,1,1,0.5,358,11,1,3,0,0,1,0.5,333,11,1,3,0,1,1,0.49,358,11,1,4,1,0,1,0.39,358,11,1,4,1,1,1,0.38,383,11,1,4,0,0,1,0.38,358,11,1,4,0,1,1,0.38,383,11,1,5,1,0,1,0.31,383,11,1,5,1,1,1,0.31,408,11,1,5,0,0,1,0.31,383,11,1,5,0,1,1,0.3,408,11,1,6,1,0,1,0.26,408,11,1,6,1,1,1,0.26,433,11,1,6,0,0,1,0.26,408,11,1,6,0,1,1,0.26,433,11,1,7,1,0,1,0.23,433,11,1,7,1,1,1,0.23,458,11,1,7,0,0,1,0.22,433,11,1,7,0,1,1,0.22,458,11,3,2,1,0,1,0.6,308,11,3,2,1,1,1,0.6,333,11,3,2,0,0,1,0.59,308,11,3,2,0,1,1,0.58,333,11,3,3,1,0,1,0.39,333,11,3,3,1,1,1,0.39,358,11,3,3,0,0,1,0.37,333,11,3,3,0,1,1,0.37,358,11,3,4,1,0,1,0.29,358,11,3,4,1,1,1,0.29,383,11,3,4,0,0,1,0.28,358,11,3,4,0,1,1,0.27,383,11,3,5,1,0,1,0.23,383,11,3,5,1,1,1,0.23,408,11,3,5,0,0,1,0.22,383,11,3,5,0,1,1,0.22,408,11,3,6,1,0,1,0.19,408,11,3,6,1,1,1,0.19,433,11,3,6,0,0,1,0.18,408,11,3,6,0,1,1,0.18,433,11,3,7,1,0,1,0.16,433,11,3,7,1,1,1,0.16,458,11,3,7,0,0,1,0.16,433,11,3,7,0,1,1,0.16,458,12,2,0,1,0,0,0.64,267,12,2,0,1,1,0,0.56,292,12,2,0,0,0,0,0.64,267,12,2,0,0,1,0,0.56,292,12,2,1,1,0,0,0.64,292,12,2,1,1,1,0,0.56,317,12,2,1,0,0,0,0.64,292,12,2,1,0,1,0,0.56,317,12,2,2,1,0,0,0.64,317,12,2,2,1,1,0,0.56,342,12,2,2,0,0,0,0.64,317,12,2,2,0,1,0,0.56,342,12,2,3,1,0,0,0.64,342,12,2,3,1,1,0,0.56,367,12,2,3,0,0,0,0.64,342,12,2,3,0,1,0,0.56,367,12,2,4,1,0,0,0.64,367,12,2,4,1,1,0,0.56,392,12,2,4,0,0,0,0.64,367,12,2,4,0,1,0,0.56,392,12,2,5,1,0,0,0.64,392,12,2,5,1,1,0,0.56,417,12,2,5,0,0,0,0.64,392,12,2,5,0,1,0,0.56,417,12,2,6,1,0,0,0.64,417,12,2,6,1,1,0,0.56,442,12,2,6,0,0,0,0.64,417,12,2,6,0,1,0,0.56,442,12,2,7,1,0,0,0.64,442,12,2,7,1,1,0,0.56,467,12,2,7,0,0,0,0.64,442,12,2,7,0,1,0,0.56,467,13,2,0,1,0,0,0.59,285,13,2,0,1,1,0,0.52,310,13,2,0,0,0,0,0.59,285,13,2,0,0,1,0,0.52,310,13,2,1,1,0,0,0.59,310,13,2,1,1,1,0,0.52,335,13,2,1,0,0,0,0.59,310,13,2,1,0,1,0,0.52,335,13,2,2,1,0,0,0.59,335,13,2,2,1,1,0,0.52,360,13,2,2,0,0,0,0.59,335,13,2,2,0,1,0,0.52,360,13,2,3,1,0,0,0.59,360,13,2,3,1,1,0,0.52,385,13,2,3,0,0,0,0.59,360,13,2,3,0,1,0,0.52,385,13,2,4,1,0,0,0.59,385,13,2,4,1,1,0,0.52,410,13,2,4,0,0,0,0.59,385,13,2,4,0,1,0,0.52,410,13,2,5,1,0,0,0.59,410,13,2,5,1,1,0,0.52,435,13,2,5,0,0,0,0.59,410,13,2,5,0,1,0,0.52,435,13,2,6,1,0,0,0.59,435,13,2,6,1,1,0,0.52,460,13,2,6,0,0,0,0.59,435,13,2,6,0,1,0,0.52,460,13,2,7,1,0,0,0.59,460,13,2,7,1,1,0,0.52,485,13,2,7,0,0,0,0.59,460,13,2,7,0,1,0,0.52,485,14,2,0,1,0,1,1.43,267,14,2,0,1,1,1,1.4,292,14,2,0,0,0,1,1.42,267,14,2,0,0,1,1,1.4,292,14,2,1,1,0,1,1.43,292,14,2,1,1,1,1,1.4,317,14,2,1,0,0,1,1.42,292,14,2,1,0,1,1,1.4,317,14,2,2,1,0,1,1.43,317,14,2,2,1,1,1,1.4,342,14,2,2,0,0,1,1.42,317,14,2,2,0,1,1,1.4,342,14,2,3,1,0,1,1.43,342,14,2,3,1,1,1,1.4,367,14,2,3,0,0,1,1.42,342,14,2,3,0,1,1,1.4,367,14,2,4,1,0,1,1.42,367,14,2,4,1,1,1,1.4,392,14,2,4,0,0,1,1.42,367,14,2,4,0,1,1,1.4,392,14,2,5,1,0,1,1.42,392,14,2,5,1,1,1,1.4,417,14,2,5,0,0,1,1.42,392,14,2,5,0,1,1,1.4,417,14,2,6,1,0,1,1.42,417,14,2,6,1,1,1,1.4,442,14,2,6,0,0,1,1.42,417,14,2,6,0,1,1,1.4,442,14,2,7,1,0,1,1.42,442,14,2,7,1,1,1,1.4,467,14,2,7,0,0,1,1.42,442,14,2,7,0,1,1,1.4,467,15,2,0,1,0,1,1.17,285,15,2,0,1,1,1,1.15,310,15,2,0,0,0,1,1.17,285,15,2,0,0,1,1,1.15,310,15,2,1,1,0,1,1.17,310,15,2,1,1,1,1,1.15,335,15,2,1,0,0,1,1.17,310,15,2,1,0,1,1,1.15,335,15,2,2,1,0,1,1.17,335,15,2,2,1,1,1,1.15,360,15,2,2,0,0,1,1.17,335,15,2,2,0,1,1,1.15,360,15,2,3,1,0,1,1.17,360,15,2,3,1,1,1,1.15,385,15,2,3,0,0,1,1.17,360,15,2,3,0,1,1,1.15,385,15,2,4,1,0,1,1.17,385,15,2,4,1,1,1,1.15,410,15,2,4,0,0,1,1.17,385,15,2,4,0,1,1,1.15,410,15,2,5,1,0,1,1.17,410,15,2,5,1,1,1,1.15,435,15,2,5,0,0,1,1.17,410,15,2,5,0,1,1,1.15,435,15,2,6,1,0,1,1.17,435,15,2,6,1,1,1,1.15,460,15,2,6,0,0,1,1.17,435,15,2,6,0,1,1,1.15,460,15,2,7,1,0,1,1.17,460,15,2,7,1,1,1,1.15,485,15,2,7,0,0,1,1.17,460,15,2,7,0,1,1,1.15,485,16,0,0,1,0,0,0.51,267,16,0,0,1,1,0,0.45,292,16,0,0,0,0,0,0.5,267,16,0,0,0,1,0,0.45,292,16,0,1,1,0,0,0.39,292,16,0,1,1,1,0,0.36,317,16,0,1,0,0,0,0.38,292,16,0,1,0,1,0,0.35,317,16,0,2,1,0,0,0.31,317,16,0,2,1,1,0,0.29,342,16,0,2,0,0,0,0.31,317,16,0,2,0,1,0,0.29,342,16,0,3,1,0,0,0.26,342,16,0,3,1,1,0,0.25,367,16,0,3,0,0,0,0.26,342,16,0,3,0,1,0,0.24,367,16,0,4,1,0,0,0.23,367,16,0,4,1,1,0,0.22,392,16,0,4,0,0,0,0.22,367,16,0,4,0,1,0,0.21,392,16,0,5,1,0,0,0.2,392,16,0,5,1,1,0,0.19,417,16,0,5,0,0,0,0.2,392,16,0,5,0,1,0,0.19,417,16,0,6,1,0,0,0.18,417,16,0,6,1,1,0,0.17,442,16,0,6,0,0,0,0.17,417,16,0,6,0,1,0,0.17,442,16,0,7,1,0,0,0.16,442,16,0,7,1,1,0,0.16,467,16,0,7,0,0,0,0.16,442,16,0,7,0,1,0,0.15,467,16,1,0,1,0,0,0.5,267,16,1,0,1,1,0,0.45,292,16,1,0,0,0,0,0.49,267,16,1,0,0,1,0,0.44,292,16,1,1,1,0,0,0.38,292,16,1,1,1,1,0,0.35,317,16,1,1,0,0,0,0.37,292,16,1,1,0,1,0,0.34,317,16,1,2,1,0,0,0.31,317,16,1,2,1,1,0,0.29,342,16,1,2,0,0,0,0.3,317,16,1,2,0,1,0,0.28,342,16,1,3,1,0,0,0.26,342,16,1,3,1,1,0,0.24,367,16,1,3,0,0,0,0.25,342,16,1,3,0,1,0,0.24,367,16,1,4,1,0,0,0.22,367,16,1,4,1,1,0,0.21,392,16,1,4,0,0,0,0.22,367,16,1,4,0,1,0,0.21,392,16,1,5,1,0,0,0.2,392,16,1,5,1,1,0,0.19,417,16,1,5,0,0,0,0.19,392,16,1,5,0,1,0,0.19,417,16,1,6,1,0,0,0.18,417,16,1,6,1,1,0,0.17,442,16,1,6,0,0,0,0.17,417,16,1,6,0,1,0,0.17,442,16,1,7,1,0,0,0.16,442,16,1,7,1,1,0,0.16,467,16,1,7,0,0,0,0.16,442,16,1,7,0,1,0,0.15,467,16,3,0,1,0,0,0.43,267,16,3,0,1,1,0,0.39,292,16,3,0,0,0,0,0.42,267,16,3,0,0,1,0,0.39,292,16,3,1,1,0,0,0.31,292,16,3,1,1,1,0,0.29,317,16,3,1,0,0,0,0.3,292,16,3,1,0,1,0,0.28,317,16,3,2,1,0,0,0.24,317,16,3,2,1,1,0,0.23,342,16,3,2,0,0,0,0.23,317,16,3,2,0,1,0,0.22,342,16,3,3,1,0,0,0.2,342,16,3,3,1,1,0,0.19,367,16,3,3,0,0,0,0.19,342,16,3,3,0,1,0,0.18,367,16,3,4,1,0,0,0.17,367,16,3,4,1,1,0,0.16,392,16,3,4,0,0,0,0.16,367,16,3,4,0,1,0,0.16,392,16,3,5,1,0,0,0.15,392,16,3,5,1,1,0,0.14,417,16,3,5,0,0,0,0.14,392,16,3,5,0,1,0,0.14,417,16,3,6,1,0,0,0.13,417,16,3,6,1,1,0,0.13,442,16,3,6,0,0,0,0.13,417,16,3,6,0,1,0,0.12,442,16,3,7,1,0,0,0.12,442,16,3,7,1,1,0,0.12,467,16,3,7,0,0,0,0.11,442,16,3,7,0,1,0,0.11,467,17,0,0,1,0,0,0.47,285,17,0,0,1,1,0,0.42,310,17,0,0,0,0,0,0.46,285,17,0,0,0,1,0,0.42,310,17,0,1,1,0,0,0.37,310,17,0,1,1,1,0,0.34,335,17,0,1,0,0,0,0.36,310,17,0,1,0,1,0,0.33,335,17,0,2,1,0,0,0.3,335,17,0,2,1,1,0,0.28,360,17,0,2,0,0,0,0.29,335,17,0,2,0,1,0,0.28,360,17,0,3,1,0,0,0.25,360,17,0,3,1,1,0,0.24,385,17,0,3,0,0,0,0.25,360,17,0,3,0,1,0,0.24,385,17,0,4,1,0,0,0.22,385,17,0,4,1,1,0,0.21,410,17,0,4,0,0,0,0.22,385,17,0,4,0,1,0,0.21,410,17,0,5,1,0,0,0.19,410,17,0,5,1,1,0,0.19,435,17,0,5,0,0,0,0.19,410,17,0,5,0,1,0,0.18,435,17,0,6,1,0,0,0.17,435,17,0,6,1,1,0,0.17,460,17,0,6,0,0,0,0.17,435,17,0,6,0,1,0,0.16,460,17,0,7,1,0,0,0.16,460,17,0,7,1,1,0,0.15,485,17,0,7,0,0,0,0.15,460,17,0,7,0,1,0,0.15,485,17,1,0,1,0,0,0.46,285,17,1,0,1,1,0,0.42,310,17,1,0,0,0,0,0.46,285,17,1,0,0,1,0,0.42,310,17,1,1,1,0,0,0.36,310,17,1,1,1,1,0,0.33,335,17,1,1,0,0,0,0.35,310,17,1,1,0,1,0,0.33,335,17,1,2,1,0,0,0.29,335,17,1,2,1,1,0,0.28,360,17,1,2,0,0,0,0.29,335,17,1,2,0,1,0,0.27,360,17,1,3,1,0,0,0.25,360,17,1,3,1,1,0,0.24,385,17,1,3,0,0,0,0.24,360,17,1,3,0,1,0,0.23,385,17,1,4,1,0,0,0.22,385,17,1,4,1,1,0,0.21,410,17,1,4,0,0,0,0.21,385,17,1,4,0,1,0,0.2,410,17,1,5,1,0,0,0.19,410,17,1,5,1,1,0,0.18,435,17,1,5,0,0,0,0.19,410,17,1,5,0,1,0,0.18,435,17,1,6,1,0,0,0.17,435,17,1,6,1,1,0,0.17,460,17,1,6,0,0,0,0.17,435,17,1,6,0,1,0,0.16,460,17,1,7,1,0,0,0.16,460,17,1,7,1,1,0,0.15,485,17,1,7,0,0,0,0.15,460,17,1,7,0,1,0,0.15,485,17,3,0,1,0,0,0.41,285,17,3,0,1,1,0,0.37,310,17,3,0,0,0,0,0.4,285,17,3,0,0,1,0,0.36,310,17,3,1,1,0,0,0.29,310,17,3,1,1,1,0,0.28,335,17,3,1,0,0,0,0.29,310,17,3,1,0,1,0,0.27,335,17,3,2,1,0,0,0.23,335,17,3,2,1,1,0,0.22,360,17,3,2,0,0,0,0.23,335,17,3,2,0,1,0,0.21,360,17,3,3,1,0,0,0.19,360,17,3,3,1,1,0,0.18,385,17,3,3,0,0,0,0.19,360,17,3,3,0,1,0,0.18,385,17,3,4,1,0,0,0.16,385,17,3,4,1,1,0,0.16,410,17,3,4,0,0,0,0.16,385,17,3,4,0,1,0,0.15,410,17,3,5,1,0,0,0.14,410,17,3,5,1,1,0,0.14,435,17,3,5,0,0,0,0.14,410,17,3,5,0,1,0,0.14,435,17,3,6,1,0,0,0.13,435,17,3,6,1,1,0,0.13,460,17,3,6,0,0,0,0.12,435,17,3,6,0,1,0,0.12,460,17,3,7,1,0,0,0.12,460,17,3,7,1,1,0,0.11,485,17,3,7,0,0,0,0.11,460,17,3,7,0,1,0,0.11,485,18,0,0,1,0,1,0.89,267,18,0,0,1,1,1,0.88,292,18,0,0,0,0,1,0.87,267,18,0,0,0,1,1,0.86,292,18,0,1,1,0,1,0.58,292,18,0,1,1,1,1,0.57,317,18,0,1,0,0,1,0.56,292,18,0,1,0,1,1,0.56,317,18,0,2,1,0,1,0.43,317,18,0,2,1,1,1,0.42,342,18,0,2,0,0,1,0.42,317,18,0,2,0,1,1,0.41,342,18,0,3,1,0,1,0.34,342,18,0,3,1,1,1,0.34,367,18,0,3,0,0,1,0.33,342,18,0,3,0,1,1,0.33,367,18,0,4,1,0,1,0.28,367,18,0,4,1,1,1,0.28,392,18,0,4,0,0,1,0.27,367,18,0,4,0,1,1,0.27,392,18,0,5,1,0,1,0.24,392,18,0,5,1,1,1,0.24,417,18,0,5,0,0,1,0.23,392,18,0,5,0,1,1,0.23,417,18,0,6,1,0,1,0.21,417,18,0,6,1,1,1,0.21,442,18,0,6,0,0,1,0.2,417,18,0,6,0,1,1,0.2,442,18,0,7,1,0,1,0.19,442,18,0,7,1,1,1,0.19,467,18,0,7,0,0,1,0.18,442,18,0,7,0,1,1,0.18,467,18,1,0,1,0,1,0.87,267,18,1,0,1,1,1,0.86,292,18,1,0,0,0,1,0.85,267,18,1,0,0,1,1,0.84,292,18,1,1,1,0,1,0.56,292,18,1,1,1,1,1,0.56,317,18,1,1,0,0,1,0.55,292,18,1,1,0,1,1,0.55,317,18,1,2,1,0,1,0.42,317,18,1,2,1,1,1,0.41,342,18,1,2,0,0,1,0.41,317,18,1,2,0,1,1,0.4,342,18,1,3,1,0,1,0.33,342,18,1,3,1,1,1,0.33,367,18,1,3,0,0,1,0.32,342,18,1,3,0,1,1,0.32,367,18,1,4,1,0,1,0.28,367,18,1,4,1,1,1,0.28,392,18,1,4,0,0,1,0.27,367,18,1,4,0,1,1,0.27,392,18,1,5,1,0,1,0.24,392,18,1,5,1,1,1,0.24,417,18,1,5,0,0,1,0.23,392,18,1,5,0,1,1,0.23,417,18,1,6,1,0,1,0.21,417,18,1,6,1,1,1,0.21,442,18,1,6,0,0,1,0.2,417,18,1,6,0,1,1,0.2,442,18,1,7,1,0,1,0.19,442,18,1,7,1,1,1,0.19,467,18,1,7,0,0,1,0.18,442,18,1,7,0,1,1,0.18,467,18,3,0,1,0,1,0.68,267,18,3,0,1,1,1,0.68,292,18,3,0,0,0,1,0.66,267,18,3,0,0,1,1,0.66,292,18,3,1,1,0,1,0.42,292,18,3,1,1,1,1,0.42,317,18,3,1,0,0,1,0.4,292,18,3,1,0,1,1,0.4,317,18,3,2,1,0,1,0.3,317,18,3,2,1,1,1,0.3,342,18,3,2,0,0,1,0.29,317,18,3,2,0,1,1,0.29,342,18,3,3,1,0,1,0.24,342,18,3,3,1,1,1,0.24,367,18,3,3,0,0,1,0.23,342,18,3,3,0,1,1,0.23,367,18,3,4,1,0,1,0.2,367,18,3,4,1,1,1,0.2,392,18,3,4,0,0,1,0.19,367,18,3,4,0,1,1,0.19,392,18,3,5,1,0,1,0.17,392,18,3,5,1,1,1,0.17,417,18,3,5,0,0,1,0.16,392,18,3,5,0,1,1,0.16,417,18,3,6,1,0,1,0.15,417,18,3,6,1,1,1,0.15,442,18,3,6,0,0,1,0.14,417,18,3,6,0,1,1,0.14,442,18,3,7,1,0,1,0.13,442,18,3,7,1,1,1,0.13,467,18,3,7,0,0,1,0.13,442,18,3,7,0,1,1,0.13,467,19,0,0,1,0,1,0.78,285,19,0,0,1,1,1,0.77,310,19,0,0,0,0,1,0.77,285,19,0,0,0,1,1,0.76,310,19,0,1,1,0,1,0.53,310,19,0,1,1,1,1,0.53,335,19,0,1,0,0,1,0.52,310,19,0,1,0,1,1,0.52,335,19,0,2,1,0,1,0.4,335,19,0,2,1,1,1,0.4,360,19,0,2,0,0,1,0.39,335,19,0,2,0,1,1,0.39,360,19,0,3,1,0,1,0.32,360,19,0,3,1,1,1,0.32,385,19,0,3,0,0,1,0.32,360,19,0,3,0,1,1,0.31,385,19,0,4,1,0,1,0.27,385,19,0,4,1,1,1,0.27,410,19,0,4,0,0,1,0.26,385,19,0,4,0,1,1,0.26,410,19,0,5,1,0,1,0.23,410,19,0,5,1,1,1,0.23,435,19,0,5,0,0,1,0.23,410,19,0,5,0,1,1,0.23,435,19,0,6,1,0,1,0.2,435,19,0,6,1,1,1,0.2,460,19,0,6,0,0,1,0.2,435,19,0,6,0,1,1,0.2,460,19,0,7,1,0,1,0.18,460,19,0,7,1,1,1,0.18,485,19,0,7,0,0,1,0.18,460,19,0,7,0,1,1,0.18,485,19,1,0,1,0,1,0.77,285,19,1,0,1,1,1,0.76,310,19,1,0,0,0,1,0.75,285,19,1,0,0,1,1,0.75,310,19,1,1,1,0,1,0.52,310,19,1,1,1,1,1,0.51,335,19,1,1,0,0,1,0.51,310,19,1,1,0,1,1,0.5,335,19,1,2,1,0,1,0.39,335,19,1,2,1,1,1,0.39,360,19,1,2,0,0,1,0.38,335,19,1,2,0,1,1,0.38,360,19,1,3,1,0,1,0.32,360,19,1,3,1,1,1,0.32,385,19,1,3,0,0,1,0.31,360,19,1,3,0,1,1,0.31,385,19,1,4,1,0,1,0.27,385,19,1,4,1,1,1,0.27,410,19,1,4,0,0,1,0.26,385,19,1,4,0,1,1,0.26,410,19,1,5,1,0,1,0.23,410,19,1,5,1,1,1,0.23,435,19,1,5,0,0,1,0.22,410,19,1,5,0,1,1,0.22,435,19,1,6,1,0,1,0.2,435,19,1,6,1,1,1,0.2,460,19,1,6,0,0,1,0.2,435,19,1,6,0,1,1,0.2,460,19,1,7,1,0,1,0.18,460,19,1,7,1,1,1,0.18,485,19,1,7,0,0,1,0.18,460,19,1,7,0,1,1,0.18,485,19,3,0,1,0,1,0.62,285,19,3,0,1,1,1,0.61,310,19,3,0,0,0,1,0.6,285,19,3,0,0,1,1,0.6,310,19,3,1,1,0,1,0.39,310,19,3,1,1,1,1,0.39,335,19,3,1,0,0,1,0.38,310,19,3,1,0,1,1,0.38,335,19,3,2,1,0,1,0.29,335,19,3,2,1,1,1,0.29,360,19,3,2,0,0,1,0.28,335,19,3,2,0,1,1,0.28,360,19,3,3,1,0,1,0.23,360,19,3,3,1,1,1,0.23,385,19,3,3,0,0,1,0.22,360,19,3,3,0,1,1,0.22,385,19,3,4,1,0,1,0.19,385,19,3,4,1,1,1,0.19,410,19,3,4,0,0,1,0.18,385,19,3,4,0,1,1,0.18,410,19,3,5,1,0,1,0.16,410,19,3,5,1,1,1,0.16,435,19,3,5,0,0,1,0.16,410,19,3,5,0,1,1,0.16,435,19,3,6,1,0,1,0.14,435,19,3,6,1,1,1,0.14,460,19,3,6,0,0,1,0.14,435,19,3,6,0,1,1,0.14,460,19,3,7,1,0,1,0.13,460,19,3,7,1,1,1,0.13,485,19,3,7,0,0,1,0.12,460,19,3,7,0,1,1,0.12,485,20,0,2,1,0,0,0.46,317,20,0,2,1,1,0,0.42,342,20,0,2,0,0,0,0.46,317,20,0,2,0,1,0,0.42,342,20,0,3,1,0,0,0.36,342,20,0,3,1,1,0,0.33,367,20,0,3,0,0,0,0.36,342,20,0,3,0,1,0,0.33,367,20,0,4,1,0,0,0.3,367,20,0,4,1,1,0,0.28,392,20,0,4,0,0,0,0.29,367,20,0,4,0,1,0,0.27,392,20,0,5,1,0,0,0.25,392,20,0,5,1,1,0,0.24,417,20,0,5,0,0,0,0.25,392,20,0,5,0,1,0,0.23,417,20,0,6,1,0,0,0.22,417,20,0,6,1,1,0,0.21,442,20,0,6,0,0,0,0.21,417,20,0,6,0,1,0,0.2,442,20,0,7,1,0,0,0.19,442,20,0,7,1,1,0,0.18,467,20,0,7,0,0,0,0.19,442,20,0,7,0,1,0,0.18,467,20,1,2,1,0,0,0.46,317,20,1,2,1,1,0,0.41,342,20,1,2,0,0,0,0.45,317,20,1,2,0,1,0,0.41,342,20,1,3,1,0,0,0.36,342,20,1,3,1,1,0,0.33,367,20,1,3,0,0,0,0.35,342,20,1,3,0,1,0,0.32,367,20,1,4,1,0,0,0.29,367,20,1,4,1,1,0,0.27,392,20,1,4,0,0,0,0.29,367,20,1,4,0,1,0,0.27,392,20,1,5,1,0,0,0.25,392,20,1,5,1,1,0,0.23,417,20,1,5,0,0,0,0.24,392,20,1,5,0,1,0,0.23,417,20,1,6,1,0,0,0.22,417,20,1,6,1,1,0,0.21,442,20,1,6,0,0,0,0.21,417,20,1,6,0,1,0,0.2,442,20,1,7,1,0,0,0.19,442,20,1,7,1,1,0,0.18,467,20,1,7,0,0,0,0.19,442,20,1,7,0,1,0,0.18,467,20,3,2,1,0,0,0.4,317,20,3,2,1,1,0,0.37,342,20,3,2,0,0,0,0.39,317,20,3,2,0,1,0,0.36,342,20,3,3,1,0,0,0.29,342,20,3,3,1,1,0,0.27,367,20,3,3,0,0,0,0.28,342,20,3,3,0,1,0,0.27,367,20,3,4,1,0,0,0.23,367,20,3,4,1,1,0,0.22,392,20,3,4,0,0,0,0.22,367,20,3,4,0,1,0,0.21,392,20,3,5,1,0,0,0.19,392,20,3,5,1,1,0,0.18,417,20,3,5,0,0,0,0.19,392,20,3,5,0,1,0,0.18,417,20,3,6,1,0,0,0.16,417,20,3,6,1,1,0,0.16,442,20,3,6,0,0,0,0.16,417,20,3,6,0,1,0,0.15,442,20,3,7,1,0,0,0.14,442,20,3,7,1,1,0,0.14,467,20,3,7,0,0,0,0.14,442,20,3,7,0,1,0,0.13,467,21,0,2,1,0,0,0.43,335,21,0,2,1,1,0,0.39,360,21,0,2,0,0,0,0.43,335,21,0,2,0,1,0,0.39,360,21,0,3,1,0,0,0.34,360,21,0,3,1,1,0,0.32,385,21,0,3,0,0,0,0.34,360,21,0,3,0,1,0,0.31,385,21,0,4,1,0,0,0.28,385,21,0,4,1,1,0,0.27,410,21,0,4,0,0,0,0.28,385,21,0,4,0,1,0,0.26,410,21,0,5,1,0,0,0.24,410,21,0,5,1,1,0,0.23,435,21,0,5,0,0,0,0.24,410,21,0,5,0,1,0,0.23,435,21,0,6,1,0,0,0.21,435,21,0,6,1,1,0,0.2,460,21,0,6,0,0,0,0.21,435,21,0,6,0,1,0,0.2,460,21,0,7,1,0,0,0.19,460,21,0,7,1,1,0,0.18,485,21,0,7,0,0,0,0.18,460,21,0,7,0,1,0,0.18,485,21,1,2,1,0,0,0.43,335,21,1,2,1,1,0,0.39,360,21,1,2,0,0,0,0.42,335,21,1,2,0,1,0,0.39,360,21,1,3,1,0,0,0.34,360,21,1,3,1,1,0,0.31,385,21,1,3,0,0,0,0.33,360,21,1,3,0,1,0,0.31,385,21,1,4,1,0,0,0.28,385,21,1,4,1,1,0,0.26,410,21,1,4,0,0,0,0.27,385,21,1,4,0,1,0,0.26,410,21,1,5,1,0,0,0.24,410,21,1,5,1,1,0,0.23,435,21,1,5,0,0,0,0.23,410,21,1,5,0,1,0,0.22,435,21,1,6,1,0,0,0.21,435,21,1,6,1,1,0,0.2,460,21,1,6,0,0,0,0.2,435,21,1,6,0,1,0,0.2,460,21,1,7,1,0,0,0.19,460,21,1,7,1,1,0,0.18,485,21,1,7,0,0,0,0.18,460,21,1,7,0,1,0,0.17,485,21,3,2,1,0,0,0.38,335,21,3,2,1,1,0,0.35,360,21,3,2,0,0,0,0.37,335,21,3,2,0,1,0,0.34,360,21,3,3,1,0,0,0.28,360,21,3,3,1,1,0,0.26,385,21,3,3,0,0,0,0.27,360,21,3,3,0,1,0,0.26,385,21,3,4,1,0,0,0.22,385,21,3,4,0,0,0,0.22,385,21,3,4,0,1,0,0.21,410,21,3,5,1,0,0,0.19,410,21,3,5,1,1,0,0.18,435,21,3,5,0,0,0,0.18,410,21,3,5,0,1,0,0.17,435,21,3,6,1,0,0,0.16,435,21,3,6,1,1,0,0.15,460,21,3,6,0,0,0,0.15,435,21,3,6,0,1,0,0.15,460,21,3,7,1,0,0,0.14,460,21,3,7,1,1,0,0.14,485,21,3,7,0,0,0,0.14,460,21,3,7,0,1,0,0.13,485,22,0,2,1,0,1,0.76,317,22,0,2,1,1,1,0.76,342,22,0,2,0,0,1,0.75,317,22,0,2,0,1,1,0.75,342,22,0,3,1,0,1,0.52,342,22,0,3,1,1,1,0.52,367,22,0,3,0,0,1,0.51,342,22,0,3,0,1,1,0.51,367,22,0,4,1,0,1,0.4,367,22,0,4,1,1,1,0.39,392,22,0,4,0,0,1,0.39,367,22,0,4,0,1,1,0.39,392,22,0,5,1,0,1,0.32,392,22,0,5,1,1,1,0.32,417,22,0,5,0,0,1,0.31,392,22,0,5,0,1,1,0.31,417,22,0,6,1,0,1,0.27,417,22,0,6,1,1,1,0.27,442,22,0,6,0,0,1,0.26,417,22,0,6,0,1,1,0.26,442,22,0,7,1,0,1,0.23,442,22,0,7,1,1,1,0.23,467,22,0,7,0,0,1,0.22,442,22,0,7,0,1,1,0.22,467,22,1,2,1,0,1,0.75,317,22,1,2,1,1,1,0.74,342,22,1,2,0,0,1,0.74,317,22,1,2,0,1,1,0.73,342,22,1,3,1,0,1,0.51,342,22,1,3,1,1,1,0.51,367,22,1,3,0,0,1,0.5,342,22,1,3,0,1,1,0.5,367,22,1,4,1,0,1,0.39,367,22,1,4,1,1,1,0.39,392,22,1,4,0,0,1,0.38,367,22,1,4,0,1,1,0.38,392,22,1,5,1,0,1,0.31,392,22,1,5,1,1,1,0.31,417,22,1,5,0,0,1,0.31,392,22,1,5,0,1,1,0.3,417,22,1,6,1,0,1,0.26,417,22,1,6,1,1,1,0.26,442,22,1,6,0,0,1,0.26,417,22,1,6,0,1,1,0.26,442,22,1,7,1,0,1,0.23,442,22,1,7,1,1,1,0.23,467,22,1,7,0,0,1,0.22,442,22,1,7,0,1,1,0.22,467,22,3,2,1,0,1,0.61,317,22,3,2,1,1,1,0.6,342,22,3,2,0,0,1,0.59,317,22,3,2,0,1,1,0.59,342,22,3,3,1,0,1,0.39,342,22,3,3,1,1,1,0.39,367,22,3,3,0,0,1,0.38,342,22,3,3,0,1,1,0.37,367,22,3,4,1,0,1,0.29,367,22,3,4,1,1,1,0.29,392,22,3,4,0,0,1,0.28,367,22,3,4,0,1,1,0.28,392,22,3,5,1,0,1,0.23,392,22,3,5,1,1,1,0.23,417,22,3,5,0,0,1,0.22,392,22,3,5,0,1,1,0.22,417,22,3,6,1,0,1,0.19,417,22,3,6,1,1,1,0.19,442,22,3,6,0,0,1,0.18,417,22,3,6,0,1,1,0.18,442,22,3,7,1,0,1,0.16,442,22,3,7,1,1,1,0.16,467,22,3,7,0,0,1,0.16,442,22,3,7,0,1,1,0.16,467,23,0,2,1,0,1,0.68,335,23,0,2,1,1,1,0.68,360,23,0,2,0,0,1,0.68,335,23,0,2,0,1,1,0.67,360,23,0,3,1,0,1,0.48,360,23,0,3,1,1,1,0.48,385,23,0,3,0,0,1,0.48,360,23,0,3,0,1,1,0.47,385,23,0,4,1,0,1,0.37,385,23,0,4,1,1,1,0.37,410,23,0,4,0,0,1,0.37,385,23,0,4,0,1,1,0.36,410,23,0,5,1,0,1,0.31,410,23,0,5,1,1,1,0.3,435,23,0,5,0,0,1,0.3,410,23,0,5,0,1,1,0.3,435,23,0,6,1,0,1,0.26,435,23,0,6,1,1,1,0.26,460,23,0,6,0,0,1,0.25,435,23,0,6,0,1,1,0.25,460,23,0,7,1,0,1,0.22,460,23,0,7,1,1,1,0.22,485,23,0,7,0,0,1,0.22,460,23,0,7,0,1,1,0.22,485,23,1,2,1,0,1,0.67,335,23,1,2,1,1,1,0.67,360,23,1,2,0,0,1,0.66,335,23,1,2,0,1,1,0.66,360,23,1,3,1,0,1,0.47,360,23,1,3,1,1,1,0.47,385,23,1,3,0,0,1,0.46,360,23,1,3,0,1,1,0.46,385,23,1,4,1,0,1,0.37,385,23,1,4,1,1,1,0.36,410,23,1,4,0,0,1,0.36,385,23,1,4,0,1,1,0.36,410,23,1,5,1,0,1,0.3,410,23,1,5,1,1,1,0.3,435,23,1,5,0,0,1,0.29,410,23,1,5,0,1,1,0.29,435,23,1,6,1,0,1,0.25,435,23,1,6,1,1,1,0.25,460,23,1,6,0,0,1,0.25,435,23,1,6,0,1,1,0.25,460,23,1,7,1,0,1,0.22,460,23,1,7,1,1,1,0.22,485,23,1,7,0,0,1,0.22,460,23,1,7,0,1,1,0.21,485,23,3,2,1,0,1,0.56,335,23,3,2,1,1,1,0.55,360,23,3,2,0,0,1,0.54,335,23,3,2,0,1,1,0.54,360,23,3,3,1,0,1,0.37,360,23,3,3,1,1,1,0.37,385,23,3,3,0,0,1,0.36,360,23,3,3,0,1,1,0.35,385,23,3,4,1,0,1,0.28,385,23,3,4,1,1,1,0.27,410,23,3,4,0,0,1,0.27,385,23,3,4,0,1,1,0.26,410,23,3,5,1,0,1,0.22,410,23,3,5,1,1,1,0.22,435,23,3,5,0,0,1,0.21,410,23,3,5,0,1,1,0.21,435,23,3,6,1,0,1,0.19,435,23,3,6,1,1,1,0.18,460,23,3,6,0,0,1,0.18,435,23,3,6,0,1,1,0.18,460,23,3,7,1,0,1,0.16,460,23,3,7,1,1,1,0.16,485,23,3,7,0,0,1,0.15,460,23,3,7,0,1,1,0.15,485,24,2,0,1,0,0,0.68,259,24,2,0,1,1,0,0.59,284,24,2,0,0,0,0,0.67,259,24,2,0,0,1,0,0.58,284,24,2,1,1,0,0,0.67,284,24,2,1,1,1,0,0.58,309,24,2,1,0,0,0,0.67,284,24,2,1,0,1,0,0.58,309,24,2,2,1,0,0,0.67,309,24,2,2,1,1,0,0.58,334,24,2,2,0,0,0,0.67,309,24,2,2,0,1,0,0.58,334,24,2,3,1,0,0,0.67,334,24,2,3,1,1,0,0.58,359,24,2,3,0,0,0,0.67,334,24,2,3,0,1,0,0.58,359,24,2,4,1,0,0,0.67,359,24,2,4,1,1,0,0.58,384,24,2,4,0,0,0,0.67,359,24,2,4,0,1,0,0.58,384,24,2,5,1,0,0,0.67,384,24,2,5,1,1,0,0.58,409,24,2,5,0,0,0,0.67,384,24,2,5,0,1,0,0.58,409,24,2,6,1,0,0,0.67,409,24,2,6,1,1,0,0.58,434,24,2,6,0,0,0,0.67,409,24,2,6,0,1,0,0.58,434,24,2,7,1,0,0,0.67,434,24,2,7,1,1,0,0.58,459,24,2,7,0,0,0,0.67,434,24,2,7,0,1,0,0.58,459,25,2,0,1,0,0,0.61,277,25,2,0,1,1,0,0.54,302,25,2,0,0,0,0,0.61,277,25,2,0,0,1,0,0.54,302,25,2,1,1,0,0,0.61,302,25,2,1,1,1,0,0.54,327,25,2,1,0,0,0,0.61,302,25,2,1,0,1,0,0.54,327,25,2,2,1,0,0,0.61,327,25,2,2,1,1,0,0.54,352,25,2,2,0,0,0,0.61,327,25,2,2,0,1,0,0.54,352,25,2,3,1,0,0,0.61,352,25,2,3,1,1,0,0.54,377,25,2,3,0,0,0,0.61,352,25,2,3,0,1,0,0.54,377,25,2,4,1,0,0,0.61,377,25,2,4,1,1,0,0.54,402,25,2,4,0,0,0,0.61,377,25,2,4,0,1,0,0.54,402,25,2,5,1,0,0,0.61,402,25,2,5,1,1,0,0.54,427,25,2,5,0,0,0,0.61,402,25,2,5,0,1,0,0.54,427,25,2,6,1,0,0,0.61,427,25,2,6,1,1,0,0.54,452,25,2,6,0,0,0,0.61,427,25,2,6,0,1,0,0.54,452,25,2,7,1,0,0,0.61,452,25,2,7,1,1,0,0.54,477,25,2,7,0,0,0,0.61,452,25,2,7,0,1,0,0.54,477,26,2,0,1,0,1,1.59,259,26,2,0,1,1,1,1.55,284,26,2,0,0,0,1,1.58,259,26,2,0,0,1,1,1.55,284,26,2,1,1,0,1,1.59,284,26,2,1,1,1,1,1.55,309,26,2,1,0,0,1,1.58,284,26,2,1,0,1,1,1.55,309,26,2,2,1,0,1,1.59,309,26,2,2,1,1,1,1.55,334,26,2,2,0,0,1,1.58,309,26,2,2,0,1,1,1.55,334,26,2,3,1,0,1,1.59,334,26,2,3,1,1,1,1.55,359,26,2,3,0,0,1,1.58,334,26,2,3,0,1,1,1.55,359,26,2,4,1,0,1,1.59,359,26,2,4,1,1,1,1.55,384,26,2,4,0,0,1,1.58,359,26,2,4,0,1,1,1.55,384,26,2,5,1,0,1,1.59,384,26,2,5,1,1,1,1.55,409,26,2,5,0,0,1,1.58,384,26,2,5,0,1,1,1.55,409,26,2,6,1,0,1,1.59,409,26,2,6,1,1,1,1.55,434,26,2,6,0,0,1,1.58,409,26,2,6,0,1,1,1.55,434,26,2,7,1,0,1,1.59,434,26,2,7,1,1,1,1.55,459,26,2,7,0,0,1,1.58,434,26,2,7,0,1,1,1.55,459,27,2,0,1,0,1,1.28,277,27,2,0,1,1,1,1.26,302,27,2,0,0,0,1,1.28,277,27,2,0,0,1,1,1.26,302,27,2,1,1,0,1,1.28,302,27,2,1,1,1,1,1.26,327,27,2,1,0,0,1,1.28,302,27,2,1,0,1,1,1.26,327,27,2,2,1,0,1,1.28,327,27,2,2,1,1,1,1.26,352,27,2,2,0,0,1,1.28,327,27,2,2,0,1,1,1.26,352,27,2,3,1,0,1,1.28,352,27,2,3,1,1,1,1.26,377,27,2,3,0,0,1,1.28,352,27,2,3,0,1,1,1.26,377,27,2,4,1,0,1,1.28,377,27,2,4,1,1,1,1.26,402,27,2,4,0,0,1,1.28,377,27,2,4,0,1,1,1.26,402,27,2,5,1,0,1,1.28,402,27,2,5,1,1,1,1.26,427,27,2,5,0,0,1,1.28,402,27,2,5,0,1,1,1.26,427,27,2,6,1,0,1,1.28,427,27,2,6,1,1,1,1.26,452,27,2,6,0,0,1,1.28,427,27,2,6,0,1,1,1.26,452,27,2,7,1,0,1,1.28,452,27,2,7,1,1,1,1.26,477,27,2,7,0,0,1,1.28,452,27,2,7,0,1,1,1.26,477,28,0,0,1,0,0,0.52,259,28,0,0,1,1,0,0.47,284,28,0,0,0,0,0,0.52,259,28,0,0,0,1,0,0.46,284,28,0,1,1,0,0,0.4,284,28,0,1,1,1,0,0.36,309,28,0,1,0,0,0,0.39,284,28,0,1,0,1,0,0.36,309,28,0,2,1,0,0,0.32,309,28,0,2,1,1,0,0.3,334,28,0,2,0,0,0,0.31,309,28,0,2,0,1,0,0.29,334,28,0,3,1,0,0,0.27,334,28,0,3,1,1,0,0.25,359,28,0,3,0,0,0,0.26,334,28,0,3,0,1,0,0.25,359,28,0,4,1,0,0,0.23,359,28,0,4,1,1,0,0.22,384,28,0,4,0,0,0,0.23,359,28,0,4,0,1,0,0.21,384,28,0,5,1,0,0,0.2,384,28,0,5,1,1,0,0.19,409,28,0,5,0,0,0,0.2,384,28,0,5,0,1,0,0.19,409,28,0,6,1,0,0,0.18,409,28,0,6,1,1,0,0.17,434,28,0,6,0,0,0,0.18,409,28,0,6,0,1,0,0.17,434,28,0,7,1,0,0,0.16,434,28,0,7,1,1,0,0.16,459,28,0,7,0,0,0,0.16,434,28,0,7,0,1,0,0.15,459,28,1,0,1,0,0,0.52,259,28,1,0,1,1,0,0.46,284,28,1,0,0,0,0,0.51,259,28,1,0,0,1,0,0.46,284,28,1,1,1,0,0,0.39,284,28,1,1,1,1,0,0.36,309,28,1,1,0,0,0,0.38,284,28,1,1,0,1,0,0.35,309,28,1,2,1,0,0,0.31,309,28,1,2,1,1,0,0.29,334,28,1,2,0,0,0,0.31,309,28,1,2,0,1,0,0.29,334,28,1,3,1,0,0,0.26,334,28,1,3,1,1,0,0.25,359,28,1,3,0,0,0,0.26,334,28,1,3,0,1,0,0.24,359,28,1,4,1,0,0,0.23,359,28,1,4,1,1,0,0.22,384,28,1,4,0,0,0,0.22,359,28,1,4,0,1,0,0.21,384,28,1,5,1,0,0,0.2,384,28,1,5,1,1,0,0.19,409,28,1,5,0,0,0,0.2,384,28,1,5,0,1,0,0.19,409,28,1,6,1,0,0,0.18,409,28,1,6,1,1,0,0.17,434,28,1,6,0,0,0,0.18,409,28,1,6,0,1,0,0.17,434,28,1,7,1,0,0,0.16,434,28,1,7,1,1,0,0.16,459,28,1,7,0,0,0,0.16,434,28,1,7,0,1,0,0.15,459,28,3,0,1,0,0,0.45,259,28,3,0,1,1,0,0.4,284,28,3,0,0,0,0,0.44,259,28,3,0,0,1,0,0.4,284,28,3,1,1,0,0,0.32,284,28,3,1,1,1,0,0.29,309,28,3,1,0,0,0,0.31,284,28,3,1,0,1,0,0.29,309,28,3,2,1,0,0,0.25,309,28,3,2,1,1,0,0.23,334,28,3,2,0,0,0,0.24,309,28,3,2,0,1,0,0.23,334,28,3,3,1,0,0,0.2,334,28,3,3,1,1,0,0.19,359,28,3,3,0,0,0,0.19,334,28,3,3,0,1,0,0.19,359,28,3,4,1,0,0,0.17,359,28,3,4,1,1,0,0.16,384,28,3,4,0,0,0,0.17,359,28,3,4,0,1,0,0.16,384,28,3,5,1,0,0,0.15,384,28,3,5,1,1,0,0.14,409,28,3,5,0,0,0,0.14,384,28,3,5,0,1,0,0.14,409,28,3,6,1,0,0,0.13,409,28,3,6,1,1,0,0.13,434,28,3,6,0,0,0,0.13,409,28,3,6,0,1,0,0.12,434,28,3,7,1,0,0,0.12,434,28,3,7,1,1,0,0.12,459,28,3,7,0,0,0,0.11,434,28,3,7,0,1,0,0.11,459,29,0,0,1,0,0,0.49,277,29,0,0,1,1,0,0.44,302,29,0,0,0,0,0,0.48,277,29,0,0,0,1,0,0.43,302,29,0,1,1,0,0,0.37,302,29,0,1,1,1,0,0.35,327,29,0,1,0,0,0,0.37,302,29,0,1,0,1,0,0.34,327,29,0,2,1,0,0,0.31,327,29,0,2,1,1,0,0.29,352,29,0,2,0,0,0,0.3,327,29,0,2,0,1,0,0.28,352,29,0,3,1,0,0,0.26,352,29,0,3,1,1,0,0.24,377,29,0,3,0,0,0,0.25,352,29,0,3,0,1,0,0.24,377,29,0,4,1,0,0,0.22,377,29,0,4,1,1,0,0.21,402,29,0,4,0,0,0,0.22,377,29,0,4,0,1,0,0.21,402,29,0,5,1,0,0,0.2,402,29,0,5,1,1,0,0.19,427,29,0,5,0,0,0,0.19,402,29,0,5,0,1,0,0.18,427,29,0,6,1,0,0,0.18,427,29,0,6,1,1,0,0.17,452,29,0,6,0,0,0,0.17,427,29,0,6,0,1,0,0.17,452,29,0,7,1,0,0,0.16,452,29,0,7,1,1,0,0.15,477,29,0,7,0,0,0,0.15,452,29,0,7,0,1,0,0.15,477,29,1,0,1,0,0,0.48,277,29,1,0,1,1,0,0.43,302,29,1,0,0,0,0,0.47,277,29,1,0,0,1,0,0.43,302,29,1,1,1,0,0,0.37,302,29,1,1,1,1,0,0.34,327,29,1,1,0,0,0,0.36,302,29,1,1,0,1,0,0.34,327,29,1,2,1,0,0,0.3,327,29,1,2,1,1,0,0.28,352,29,1,2,0,0,0,0.29,327,29,1,2,0,1,0,0.28,352,29,1,3,1,0,0,0.25,352,29,1,3,1,1,0,0.24,377,29,1,3,0,0,0,0.25,352,29,1,3,0,1,0,0.24,377,29,1,4,1,0,0,0.22,377,29,1,4,1,1,0,0.21,402,29,1,4,0,0,0,0.22,377,29,1,4,0,1,0,0.21,402,29,1,5,1,0,0,0.19,402,29,1,5,1,1,0,0.19,427,29,1,5,0,0,0,0.19,402,29,1,5,0,1,0,0.18,427,29,1,6,1,0,0,0.17,427,29,1,6,1,1,0,0.17,452,29,1,6,0,0,0,0.17,427,29,1,6,0,1,0,0.16,452,29,1,7,1,0,0,0.16,452,29,1,7,1,1,0,0.15,477,29,1,7,0,0,0,0.16,452,29,1,7,0,1,0,0.15,477,29,3,0,1,0,0,0.42,277,29,3,0,1,1,0,0.38,302,29,3,0,0,0,0,0.41,277,29,3,0,0,1,0,0.37,302,29,3,1,1,0,0,0.3,302,29,3,1,1,1,0,0.28,327,29,3,1,0,0,0,0.29,302,29,3,1,0,1,0,0.27,327,29,3,2,1,0,0,0.24,327,29,3,2,1,1,0,0.22,352,29,3,2,0,0,0,0.23,327,29,3,2,0,1,0,0.22,352,29,3,3,1,0,0,0.2,352,29,3,3,1,1,0,0.19,377,29,3,3,0,0,0,0.19,352,29,3,3,0,1,0,0.18,377,29,3,4,1,0,0,0.17,377,29,3,4,1,1,0,0.16,402,29,3,4,0,0,0,0.16,377,29,3,4,0,1,0,0.16,402,29,3,5,1,0,0,0.15,402,29,3,5,1,1,0,0.14,427,29,3,5,0,0,0,0.14,402,29,3,5,0,1,0,0.14,427,29,3,6,1,0,0,0.13,427,29,3,6,1,1,0,0.13,452,29,3,6,0,0,0,0.13,427,29,3,6,0,1,0,0.12,452,29,3,7,1,0,0,0.12,452,29,3,7,1,1,0,0.11,477,29,3,7,0,0,0,0.11,452,29,3,7,0,1,0,0.11,477,30,0,0,1,0,1,0.95,259,30,0,0,1,1,1,0.93,284,30,0,0,0,0,1,0.93,259,30,0,0,0,1,1,0.92,284,30,0,1,1,0,1,0.6,284,30,0,1,1,1,1,0.6,309,30,0,1,0,0,1,0.59,284,30,0,1,0,1,1,0.58,309,30,0,2,1,0,1,0.44,309,30,0,2,1,1,1,0.44,334,30,0,2,0,0,1,0.43,309,30,0,2,0,1,1,0.43,334,30,0,3,1,0,1,0.35,334,30,0,3,1,1,1,0.35,359,30,0,3,0,0,1,0.34,334,30,0,3,0,1,1,0.34,359,30,0,4,1,0,1,0.29,359,30,0,4,1,1,1,0.29,384,30,0,4,0,0,1,0.28,359,30,0,4,0,1,1,0.28,384,30,0,5,1,0,1,0.24,384,30,0,5,1,1,1,0.24,409,30,0,5,0,0,1,0.24,384,30,0,5,0,1,1,0.24,409,30,0,6,1,0,1,0.21,409,30,0,6,1,1,1,0.21,434,30,0,6,0,0,1,0.21,409,30,0,6,0,1,1,0.21,434,30,0,7,1,0,1,0.19,434,30,0,7,1,1,1,0.19,459,30,0,7,0,0,1,0.18,434,30,0,7,0,1,1,0.18,459,30,1,0,1,0,1,0.92,259,30,1,0,1,1,1,0.91,284,30,1,0,0,0,1,0.91,259,30,1,0,0,1,1,0.89,284,30,1,1,1,0,1,0.59,284,30,1,1,1,1,1,0.58,309,30,1,1,0,0,1,0.57,284,30,1,1,0,1,1,0.57,309,30,1,2,1,0,1,0.43,309,30,1,2,1,1,1,0.43,334,30,1,2,0,0,1,0.42,309,30,1,2,0,1,1,0.42,334,30,1,3,1,0,1,0.34,334,30,1,3,1,1,1,0.34,359,30,1,3,0,0,1,0.33,334,30,1,3,0,1,1,0.33,359,30,1,4,1,0,1,0.28,359,30,1,4,1,1,1,0.28,384,30,1,4,0,0,1,0.28,359,30,1,4,0,1,1,0.27,384,30,1,5,1,0,1,0.24,384,30,1,5,1,1,1,0.24,409,30,1,5,0,0,1,0.24,384,30,1,5,0,1,1,0.23,409,30,1,6,1,0,1,0.21,409,30,1,6,1,1,1,0.21,434,30,1,6,0,0,1,0.21,409,30,1,6,0,1,1,0.21,434,30,1,7,1,0,1,0.19,434,30,1,7,1,1,1,0.19,459,30,1,7,0,0,1,0.18,434,30,1,7,0,1,1,0.18,459,30,3,0,1,0,1,0.72,259,30,3,0,1,1,1,0.71,284,30,3,0,0,0,1,0.69,259,30,3,0,0,1,1,0.69,284,30,3,1,1,0,1,0.43,284,30,3,1,1,1,1,0.43,309,30,3,1,0,0,1,0.41,284,30,3,1,0,1,1,0.41,309,30,3,2,1,0,1,0.31,309,30,3,2,1,1,1,0.31,334,30,3,2,0,0,1,0.3,309,30,3,2,0,1,1,0.3,334,30,3,3,1,0,1,0.24,334,30,3,3,1,1,1,0.24,359,30,3,3,0,0,1,0.23,334,30,3,3,0,1,1,0.23,359,30,3,4,1,0,1,0.2,359,30,3,4,1,1,1,0.2,384,30,3,4,0,0,1,0.19,359,30,3,4,0,1,1,0.19,384,30,3,5,1,0,1,0.17,384,30,3,5,1,1,1,0.17,409,30,3,5,0,0,1,0.16,384,30,3,5,0,1,1,0.16,409,30,3,6,1,0,1,0.15,409,30,3,6,1,1,1,0.15,434,30,3,6,0,0,1,0.14,409,30,3,6,0,1,1,0.14,434,30,3,7,1,0,1,0.13,434,30,3,7,1,1,1,0.13,459,30,3,7,0,0,1,0.13,434,30,3,7,0,1,1,0.13,459,31,0,0,1,0,1,0.83,277,31,0,0,1,1,1,0.82,302,31,0,0,0,0,1,0.81,277,31,0,0,0,1,1,0.81,302,31,0,1,1,0,1,0.55,302,31,0,1,1,1,1,0.55,327,31,0,1,0,0,1,0.54,302,31,0,1,0,1,1,0.54,327,31,0,2,1,0,1,0.41,327,31,0,2,1,1,1,0.41,352,31,0,2,0,0,1,0.4,327,31,0,2,0,1,1,0.4,352,31,0,3,1,0,1,0.33,352,31,0,3,1,1,1,0.33,377,31,0,3,0,0,1,0.32,352,31,0,3,0,1,1,0.32,377,31,0,4,1,0,1,0.28,377,31,0,4,1,1,1,0.27,402,31,0,4,0,0,1,0.27,377,31,0,4,0,1,1,0.27,402,31,0,5,1,0,1,0.24,402,31,0,5,1,1,1,0.24,427,31,0,5,0,0,1,0.23,402,31,0,5,0,1,1,0.23,427,31,0,6,1,0,1,0.21,427,31,0,6,1,1,1,0.21,452,31,0,6,0,0,1,0.2,427,31,0,6,0,1,1,0.2,452,31,0,7,1,0,1,0.18,452,31,0,7,1,1,1,0.18,477,31,0,7,0,0,1,0.18,452,31,0,7,0,1,1,0.18,477,31,1,0,1,0,1,0.81,277,31,1,0,1,1,1,0.8,302,31,1,0,0,0,1,0.8,277,31,1,0,0,1,1,0.79,302,31,1,1,1,0,1,0.54,302,31,1,1,1,1,1,0.53,327,31,1,1,0,0,1,0.53,302,31,1,1,0,1,1,0.52,327,31,1,2,1,0,1,0.4,327,31,1,2,1,1,1,0.4,352,31,1,2,0,0,1,0.39,327,31,1,2,0,1,1,0.39,352,31,1,3,1,0,1,0.32,352,31,1,3,1,1,1,0.32,377,31,1,3,0,0,1,0.32,352,31,1,3,0,1,1,0.31,377,31,1,4,1,0,1,0.27,377,31,1,4,1,1,1,0.27,402,31,1,4,0,0,1,0.26,377,31,1,4,0,1,1,0.26,402,31,1,5,1,0,1,0.23,402,31,1,5,1,1,1,0.23,427,31,1,5,0,0,1,0.23,402,31,1,5,0,1,1,0.23,427,31,1,6,1,0,1,0.21,427,31,1,6,1,1,1,0.2,452,31,1,6,0,0,1,0.2,427,31,1,6,0,1,1,0.2,452,31,1,7,1,0,1,0.18,452,31,1,7,1,1,1,0.18,477,31,1,7,0,0,1,0.18,452,31,1,7,0,1,1,0.18,477,31,3,0,1,0,1,0.65,277,31,3,0,1,1,1,0.64,302,31,3,0,0,0,1,0.63,277,31,3,0,0,1,1,0.62,302,31,3,1,1,0,1,0.4,302,31,3,1,1,1,1,0.4,327,31,3,1,0,0,1,0.39,302,31,3,1,0,1,1,0.39,327,31,3,2,1,0,1,0.3,327,31,3,2,1,1,1,0.29,352,31,3,2,0,0,1,0.28,327,31,3,2,0,1,1,0.28,352,31,3,3,1,0,1,0.23,352,31,3,3,1,1,1,0.23,377,31,3,3,0,0,1,0.22,352,31,3,3,0,1,1,0.22,377,31,3,4,1,0,1,0.19,377,31,3,4,1,1,1,0.19,402,31,3,4,0,0,1,0.19,377,31,3,4,0,1,1,0.19,402,31,3,5,1,0,1,0.17,402,31,3,5,1,1,1,0.17,427,31,3,5,0,0,1,0.16,402,31,3,5,0,1,1,0.16,427,31,3,6,1,0,1,0.15,427,31,3,6,1,1,1,0.15,452,31,3,6,0,0,1,0.14,427,31,3,6,0,1,1,0.14,452,31,3,7,1,0,1,0.13,452,31,3,7,1,1,1,0.13,477,31,3,7,0,0,1,0.12,452,31,3,7,0,1,1,0.12,477,32,0,2,1,0,0,0.48,309,32,0,2,1,1,0,0.43,334,32,0,2,0,0,0,0.47,309,32,0,2,0,1,0,0.43,334,32,0,3,1,0,0,0.37,334,32,0,3,1,1,0,0.34,359,32,0,3,0,0,0,0.37,334,32,0,3,0,1,0,0.34,359,32,0,4,1,0,0,0.3,359,32,0,4,1,1,0,0.28,384,32,0,4,0,0,0,0.3,359,32,0,4,0,1,0,0.28,384,32,0,5,1,0,0,0.26,384,32,0,5,1,1,0,0.24,409,32,0,5,0,0,0,0.25,384,32,0,5,0,1,0,0.24,409,32,0,6,1,0,0,0.22,409,32,0,6,1,1,0,0.21,434,32,0,6,0,0,0,0.22,409,32,0,6,0,1,0,0.21,434,32,0,7,1,0,0,0.2,434,32,0,7,1,1,0,0.19,459,32,0,7,0,0,0,0.19,434,32,0,7,0,1,0,0.18,459,32,1,2,1,0,0,0.47,309,32,1,2,1,1,0,0.43,334,32,1,2,0,0,0,0.47,309,32,1,2,0,1,0,0.42,334,32,1,3,1,0,0,0.37,334,32,1,3,1,1,0,0.34,359,32,1,3,0,0,0,0.36,334,32,1,3,0,1,0,0.33,359,32,1,4,1,0,0,0.3,359,32,1,4,1,1,0,0.28,384,32,1,4,0,0,0,0.29,359,32,1,4,0,1,0,0.27,384,32,1,5,1,0,0,0.25,384,32,1,5,1,1,0,0.24,409,32,1,5,0,0,0,0.25,384,32,1,5,0,1,0,0.23,409,32,1,6,1,0,0,0.22,409,32,1,6,1,1,0,0.21,434,32,1,6,0,0,0,0.21,409,32,1,6,0,1,0,0.2,434,32,1,7,1,0,0,0.19,434,32,1,7,1,1,0,0.19,459,32,1,7,0,0,0,0.19,434,32,1,7,0,1,0,0.18,459,32,3,2,1,0,0,0.41,309,32,3,2,1,1,0,0.38,334,32,3,2,0,0,0,0.4,309,32,3,2,0,1,0,0.37,334,32,3,3,1,0,0,0.3,334,32,3,3,1,1,0,0.28,359,32,3,3,0,0,0,0.29,334,32,3,3,0,1,0,0.27,359,32,3,4,1,0,0,0.24,359,32,3,4,1,1,0,0.22,384,32,3,4,0,0,0,0.23,359,32,3,4,0,1,0,0.22,384,32,3,5,1,0,0,0.19,384,32,3,5,1,1,0,0.19,409,32,3,5,0,0,0,0.19,384,32,3,5,0,1,0,0.18,409,32,3,6,1,0,0,0.17,409,32,3,6,1,1,0,0.16,434,32,3,6,0,0,0,0.16,409,32,3,6,0,1,0,0.15,434,32,3,7,1,0,0,0.15,434,32,3,7,1,1,0,0.14,459,32,3,7,0,0,0,0.14,434,32,3,7,0,1,0,0.14,459,33,0,2,1,0,0,0.45,327,33,0,2,1,1,0,0.41,352,33,0,2,0,0,0,0.44,327,33,0,2,0,1,0,0.4,352,33,0,3,1,0,0,0.35,352,33,0,3,1,1,0,0.33,377,33,0,3,0,0,0,0.35,352,33,0,3,0,1,0,0.32,377,33,0,4,1,0,0,0.29,377,33,0,4,1,1,0,0.27,402,33,0,4,0,0,0,0.28,377,33,0,4,0,1,0,0.27,402,33,0,5,1,0,0,0.25,402,33,0,5,1,1,0,0.23,427,33,0,5,0,0,0,0.24,402,33,0,5,0,1,0,0.23,427,33,0,6,1,0,0,0.21,427,33,0,6,1,1,0,0.2,452,33,0,6,0,0,0,0.21,427,33,0,6,0,1,0,0.2,452,33,0,7,1,0,0,0.19,452,33,0,7,1,1,0,0.18,477,33,0,7,0,0,0,0.19,452,33,0,7,0,1,0,0.18,477,33,1,2,1,0,0,0.44,327,33,1,2,1,1,0,0.4,352,33,1,2,0,0,0,0.44,327,33,1,2,0,1,0,0.4,352,33,1,3,1,0,0,0.35,352,33,1,3,1,1,0,0.32,377,33,1,3,0,0,0,0.34,352,33,1,3,0,1,0,0.32,377,33,1,4,1,0,0,0.29,377,33,1,4,1,1,0,0.27,402,33,1,4,0,0,0,0.28,377,33,1,4,0,1,0,0.26,402,33,1,5,1,0,0,0.24,402,33,1,5,1,1,0,0.23,427,33,1,5,0,0,0,0.24,402,33,1,5,0,1,0,0.23,427,33,1,6,1,0,0,0.21,427,33,1,6,1,1,0,0.2,452,33,1,6,0,0,0,0.21,427,33,1,6,0,1,0,0.2,452,33,1,7,1,0,0,0.19,452,33,1,7,1,1,0,0.18,477,33,1,7,0,0,0,0.18,452,33,1,7,0,1,0,0.18,477,33,3,2,1,0,0,0.39,327,33,3,2,1,1,0,0.36,352,33,3,2,0,0,0,0.38,327,33,3,2,0,1,0,0.35,352,33,3,3,1,0,0,0.29,352,33,3,3,1,1,0,0.27,377,33,3,3,0,0,0,0.28,352,33,3,3,0,1,0,0.26,377,33,3,4,1,0,0,0.23,377,33,3,4,1,1,0,0.22,402,33,3,4,0,0,0,0.22,377,33,3,4,0,1,0,0.21,402,33,3,5,1,0,0,0.19,402,33,3,5,1,1,0,0.18,427,33,3,5,0,0,0,0.18,402,33,3,5,0,1,0,0.18,427,33,3,6,1,0,0,0.16,427,33,3,6,1,1,0,0.16,452,33,3,6,0,0,0,0.16,427,33,3,6,0,1,0,0.15,452,33,3,7,1,0,0,0.14,452,33,3,7,1,1,0,0.14,477,33,3,7,0,0,0,0.14,452,33,3,7,0,1,0,0.13,477,34,0,2,1,0,1,0.81,309,34,0,2,1,1,1,0.8,334,34,0,2,0,0,1,0.8,309,34,0,2,0,1,1,0.79,334,34,0,3,1,0,1,0.54,334,34,0,3,1,1,1,0.54,359,34,0,3,0,0,1,0.53,334,34,0,3,0,1,1,0.53,359,34,0,4,1,0,1,0.41,359,34,0,4,1,1,1,0.41,384,34,0,4,0,0,1,0.4,359,34,0,4,0,1,1,0.4,384,34,0,5,1,0,1,0.33,384,34,0,5,1,1,1,0.33,409,34,0,5,0,0,1,0.32,384,34,0,5,0,1,1,0.32,409,34,0,6,1,0,1,0.27,409,34,0,6,1,1,1,0.27,434,34,0,6,0,0,1,0.27,409,34,0,6,0,1,1,0.27,434,34,0,7,1,0,1,0.23,434,34,0,7,1,1,1,0.23,459,34,0,7,0,0,1,0.23,434,34,0,7,0,1,1,0.23,459,34,1,2,1,0,1,0.79,309,34,1,2,1,1,1,0.78,334,34,1,2,0,0,1,0.78,309,34,1,2,0,1,1,0.77,334,34,1,3,1,0,1,0.53,334,34,1,3,1,1,1,0.53,359,34,1,3,0,0,1,0.52,334,34,1,3,0,1,1,0.51,359,34,1,4,1,0,1,0.4,359,34,1,4,1,1,1,0.4,384,34,1,4,0,0,1,0.39,359,34,1,4,0,1,1,0.39,384,34,1,5,1,0,1,0.32,384,34,1,5,1,1,1,0.32,409,34,1,5,0,0,1,0.31,384,34,1,5,0,1,1,0.31,409,34,1,6,1,0,1,0.27,409,34,1,6,1,1,1,0.27,434,34,1,6,0,0,1,0.26,409,34,1,6,0,1,1,0.26,434,34,1,7,1,0,1,0.23,434,34,1,7,1,1,1,0.23,459,34,1,7,0,0,1,0.23,434,34,1,7,0,1,1,0.23,459,34,3,2,1,0,1,0.64,309,34,3,2,1,1,1,0.63,334,34,3,2,0,0,1,0.62,309,34,3,2,0,1,1,0.61,334,34,3,3,1,0,1,0.4,334,34,3,3,1,1,1,0.4,359,34,3,3,0,0,1,0.39,334,34,3,3,0,1,1,0.38,359,34,3,4,1,0,1,0.29,359,34,3,4,1,1,1,0.29,384,34,3,4,0,0,1,0.28,359,34,3,4,0,1,1,0.28,384,34,3,5,1,0,1,0.23,384,34,3,5,1,1,1,0.23,409,34,3,5,0,0,1,0.22,384,34,3,5,0,1,1,0.22,409,34,3,6,1,0,1,0.19,409,34,3,6,1,1,1,0.19,434,34,3,6,0,0,1,0.19,409,34,3,6,0,1,1,0.19,434,34,3,7,1,0,1,0.17,434,34,3,7,1,1,1,0.17,459,34,3,7,0,0,1,0.16,434,34,3,7,0,1,1,0.16,459,35,0,2,1,0,1,0.72,327,35,0,2,1,1,1,0.71,352,35,0,2,0,0,1,0.71,327,35,0,2,0,1,1,0.7,352,35,0,3,1,0,1,0.5,352,35,0,3,1,1,1,0.5,377,35,0,3,0,0,1,0.49,352,35,0,3,0,1,1,0.49,377,35,0,4,1,0,1,0.38,377,35,0,4,1,1,1,0.38,402,35,0,4,0,0,1,0.38,377,35,0,4,0,1,1,0.37,402,35,0,5,1,0,1,0.31,402,35,0,5,1,1,1,0.31,427,35,0,5,0,0,1,0.3,402,35,0,5,0,1,1,0.3,427,35,0,6,1,0,1,0.26,427,35,0,6,1,1,1,0.26,452,35,0,6,0,0,1,0.26,427,35,0,6,0,1,1,0.25,452,35,0,7,1,0,1,0.23,452,35,0,7,1,1,1,0.23,477,35,0,7,0,0,1,0.22,452,35,0,7,0,1,1,0.22,477,35,1,2,1,0,1,0.71,327,35,1,2,1,1,1,0.7,352,35,1,2,0,0,1,0.7,327,35,1,2,0,1,1,0.69,352,35,1,3,1,0,1,0.49,352,35,1,3,1,1,1,0.49,377,35,1,3,0,0,1,0.48,352,35,1,3,0,1,1,0.48,377,35,1,4,1,0,1,0.38,377,35,1,4,1,1,1,0.37,402,35,1,4,0,0,1,0.37,377,35,1,4,0,1,1,0.37,402,35,1,5,1,0,1,0.31,402,35,1,5,1,1,1,0.3,427,35,1,5,0,0,1,0.3,402,35,1,5,0,1,1,0.3,427,35,1,6,1,0,1,0.26,427,35,1,6,1,1,1,0.26,452,35,1,6,0,0,1,0.25,427,35,1,6,0,1,1,0.25,452,35,1,7,1,0,1,0.22,452,35,1,7,1,1,1,0.22,477,35,1,7,0,0,1,0.22,452,35,1,7,0,1,1,0.22,477,35,3,2,1,0,1,0.58,327,35,3,2,1,1,1,0.57,352,35,3,2,0,0,1,0.56,327,35,3,2,0,1,1,0.56,352,35,3,3,1,0,1,0.38,352,35,3,3,1,1,1,0.38,377,35,3,3,0,0,1,0.36,352,35,3,3,0,1,1,0.36,377,35,3,4,1,0,1,0.28,377,35,3,4,1,1,1,0.28,402,35,3,4,0,0,1,0.27,377,35,3,4,0,1,1,0.27,402,35,3,5,1,0,1,0.22,402,35,3,5,1,1,1,0.22,427,35,3,5,0,0,1,0.22,402,35,3,5,0,1,1,0.22,427,35,3,6,1,0,1,0.19,427,35,3,6,1,1,1,0.19,452,35,3,6,0,0,1,0.18,427,35,3,6,0,1,1,0.18,452,35,3,7,1,0,1,0.16,452,35,3,7,1,1,1,0.16,477,35,3,7,0,0,1,0.16,452,35,3,7,0,1,1,0.15,477],\"corrections\":[],\"width\":8},{\"id\":\"2-30\",\"element\":\"wall\",\"title\":\"Block/block cavity, 100 mm outer leaf\",\"dims\":[{\"key\":\"cavity_depth_mm\",\"label\":\"Cavity\",\"values\":[25,50,75,100,125,150,175,200]},{\"key\":\"wall_ties\",\"label\":\"Wall ties\",\"values\":[\"insulated\",\"metal\"]},{\"key\":\"outer_leaf_mm\",\"label\":\"Outer leaf\",\"values\":[100]},{\"key\":\"inner_leaf_mm\",\"label\":\"Inner leaf\",\"values\":[100,125]},{\"key\":\"outer_leaf_material\",\"label\":\"Outer leaf block\",\"values\":[\"HP block\",\"dense concrete block\"]},{\"key\":\"inner_leaf_material\",\"label\":\"Inner leaf block\",\"values\":[\"HP block\",\"dense concrete block\"]},{\"key\":\"external_finish\",\"label\":\"Outside\",\"values\":[\"12 mm timber or tile, 15 mm cavity (ventilated)\",\"19 mm external render (cement, sand)\"]},{\"key\":\"internal_finish\",\"label\":\"Inside\",\"values\":[\"13 mm plaster\",\"15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"]}],\"descriptions\":[\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), HP block, cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), HP block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), HP block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), HP block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), HP block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), HP block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (batts)\",\"open cavity\",\"polyurethane foam\"],\"rows\":[0,2,0,1,0,0,0,0,0,0,0.44,265,0,2,0,1,0,1,0,0,0,0,0.4,290,0,2,0,0,0,0,0,0,0,0,0.44,265,0,2,0,0,0,1,0,0,0,0,0.4,290,0,2,1,1,0,0,0,0,0,0,0.44,290,0,2,1,1,0,1,0,0,0,0,0.4,315,0,2,1,0,0,0,0,0,0,0,0.44,290,0,2,1,0,0,1,0,0,0,0,0.4,315,0,2,2,1,0,0,0,0,0,0,0.44,315,0,2,2,1,0,1,0,0,0,0,0.4,340,0,2,2,0,0,0,0,0,0,0,0.44,315,0,2,2,0,0,1,0,0,0,0,0.4,340,0,2,3,1,0,0,0,0,0,0,0.44,340,0,2,3,1,0,1,0,0,0,0,0.4,365,0,2,3,0,0,0,0,0,0,0,0.44,340,0,2,3,0,0,1,0,0,0,0,0.4,365,0,2,4,1,0,0,0,0,0,0,0.44,365,0,2,4,1,0,1,0,0,0,0,0.4,390,0,2,4,0,0,0,0,0,0,0,0.44,365,0,2,4,0,0,1,0,0,0,0,0.4,390,0,2,5,1,0,0,0,0,0,0,0.44,390,0,2,5,1,0,1,0,0,0,0,0.4,415,0,2,5,0,0,0,0,0,0,0,0.44,390,0,2,5,0,0,1,0,0,0,0,0.4,415,0,2,6,1,0,0,0,0,0,0,0.44,415,0,2,6,1,0,1,0,0,0,0,0.4,440,0,2,6,0,0,0,0,0,0,0,0.44,415,0,2,6,0,0,1,0,0,0,0,0.4,440,0,2,7,1,0,0,0,0,0,0,0.44,440,0,2,7,1,0,1,0,0,0,0,0.4,465,0,2,7,0,0,0,0,0,0,0,0.44,440,0,2,7,0,0,1,0,0,0,0,0.4,465,1,2,0,1,0,0,0,0,0,1,0.41,283,1,2,0,1,0,1,0,0,0,1,0.38,308,1,2,0,0,0,0,0,0,0,1,0.41,283,1,2,0,0,0,1,0,0,0,1,0.38,308,1,2,1,1,0,0,0,0,0,1,0.41,308,1,2,1,1,0,1,0,0,0,1,0.38,333,1,2,1,0,0,0,0,0,0,1,0.41,308,1,2,1,0,0,1,0,0,0,1,0.38,333,1,2,2,1,0,0,0,0,0,1,0.41,333,1,2,2,1,0,1,0,0,0,1,0.38,358,1,2,2,0,0,0,0,0,0,1,0.41,333,1,2,2,0,0,1,0,0,0,1,0.38,358,1,2,3,1,0,0,0,0,0,1,0.41,358,1,2,3,1,0,1,0,0,0,1,0.38,383,1,2,3,0,0,0,0,0,0,1,0.41,358,1,2,3,0,0,1,0,0,0,1,0.38,383,1,2,4,1,0,0,0,0,0,1,0.41,383,1,2,4,1,0,1,0,0,0,1,0.38,408,1,2,4,0,0,0,0,0,0,1,0.41,383,1,2,4,0,0,1,0,0,0,1,0.38,408,1,2,5,1,0,0,0,0,0,1,0.41,408,1,2,5,1,0,1,0,0,0,1,0.38,433,1,2,5,0,0,0,0,0,0,1,0.41,408,1,2,5,0,0,1,0,0,0,1,0.38,433,1,2,6,1,0,0,0,0,0,1,0.41,433,1,2,6,1,0,1,0,0,0,1,0.38,458,1,2,6,0,0,0,0,0,0,1,0.41,433,1,2,6,0,0,1,0,0,0,1,0.38,458,1,2,7,1,0,0,0,0,0,1,0.41,458,1,2,7,1,0,1,0,0,0,1,0.38,483,1,2,7,0,0,0,0,0,0,1,0.41,458,1,2,7,0,0,1,0,0,0,1,0.38,483,2,0,0,1,0,0,0,0,0,0,0.37,265,2,0,0,1,0,1,0,0,0,0,0.34,290,2,0,0,0,0,0,0,0,0,0,0.37,265,2,0,0,0,0,1,0,0,0,0,0.34,290,2,0,1,1,0,0,0,0,0,0,0.3,290,2,0,1,1,0,1,0,0,0,0,0.28,315,2,0,1,0,0,0,0,0,0,0,0.3,290,2,0,1,0,0,1,0,0,0,0,0.28,315,2,0,2,1,0,0,0,0,0,0,0.26,315,2,0,2,1,0,1,0,0,0,0,0.24,340,2,0,2,0,0,0,0,0,0,0,0.25,315,2,0,2,0,0,1,0,0,0,0,0.24,340,2,0,3,1,0,0,0,0,0,0,0.22,340,2,0,3,1,0,1,0,0,0,0,0.21,365,2,0,3,0,0,0,0,0,0,0,0.22,340,2,0,3,0,0,1,0,0,0,0,0.21,365,2,0,4,1,0,0,0,0,0,0,0.19,365,2,0,4,1,0,1,0,0,0,0,0.19,390,2,0,4,0,0,0,0,0,0,0,0.19,365,2,0,4,0,0,1,0,0,0,0,0.18,390,2,0,5,1,0,0,0,0,0,0,0.17,390,2,0,5,1,0,1,0,0,0,0,0.17,415,2,0,5,0,0,0,0,0,0,0,0.17,390,2,0,5,0,0,1,0,0,0,0,0.16,415,2,0,6,1,0,0,0,0,0,0,0.16,415,2,0,6,1,0,1,0,0,0,0,0.15,440,2,0,6,0,0,0,0,0,0,0,0.15,415,2,0,6,0,0,1,0,0,0,0,0.15,440,2,0,7,1,0,0,0,0,0,0,0.14,440,2,0,7,1,0,1,0,0,0,0,0.14,465,2,0,7,0,0,0,0,0,0,0,0.14,440,2,0,7,0,0,1,0,0,0,0,0.14,465,2,1,0,1,0,0,0,0,0,0,0.37,265,2,1,0,1,0,1,0,0,0,0,0.34,290,2,1,0,0,0,0,0,0,0,0,0.36,265,2,1,0,0,0,1,0,0,0,0,0.34,290,2,1,1,1,0,0,0,0,0,0,0.3,290,2,1,1,1,0,1,0,0,0,0,0.28,315,2,1,1,0,0,0,0,0,0,0,0.29,290,2,1,1,0,0,1,0,0,0,0,0.28,315,2,1,2,1,0,0,0,0,0,0,0.25,315,2,1,2,1,0,1,0,0,0,0,0.24,340,2,1,2,0,0,0,0,0,0,0,0.25,315,2,1,2,0,0,1,0,0,0,0,0.23,340,2,1,3,1,0,0,0,0,0,0,0.22,340,2,1,3,1,0,1,0,0,0,0,0.21,365,2,1,3,0,0,0,0,0,0,0,0.21,340,2,1,3,0,0,1,0,0,0,0,0.2,365,2,1,4,1,0,0,0,0,0,0,0.19,365,2,1,4,1,0,1,0,0,0,0,0.18,390,2,1,4,0,0,0,0,0,0,0,0.19,365,2,1,4,0,0,1,0,0,0,0,0.18,390,2,1,5,1,0,0,0,0,0,0,0.17,390,2,1,5,1,0,1,0,0,0,0,0.17,415,2,1,5,0,0,0,0,0,0,0,0.17,390,2,1,5,0,0,1,0,0,0,0,0.16,415,2,1,6,1,0,0,0,0,0,0,0.16,415,2,1,6,1,0,1,0,0,0,0,0.15,440,2,1,6,0,0,0,0,0,0,0,0.15,415,2,1,6,0,0,1,0,0,0,0,0.15,440,2,1,7,1,0,0,0,0,0,0,0.14,440,2,1,7,1,0,1,0,0,0,0,0.14,465,2,1,7,0,0,0,0,0,0,0,0.14,440,2,1,7,0,0,1,0,0,0,0,0.14,465,2,3,0,1,0,0,0,0,0,0,0.33,265,2,3,0,1,0,1,0,0,0,0,0.31,290,2,3,0,0,0,0,0,0,0,0,0.32,265,2,3,0,0,0,1,0,0,0,0,0.3,290,2,3,1,1,0,0,0,0,0,0,0.25,290,2,3,1,1,0,1,0,0,0,0,0.24,315,2,3,1,0,0,0,0,0,0,0,0.25,290,2,3,1,0,0,1,0,0,0,0,0.23,315,2,3,2,1,0,0,0,0,0,0,0.21,315,2,3,2,1,0,1,0,0,0,0,0.2,340,2,3,2,0,0,0,0,0,0,0,0.2,315,2,3,2,0,0,1,0,0,0,0,0.19,340,2,3,3,1,0,0,0,0,0,0,0.17,340,2,3,3,1,0,1,0,0,0,0,0.17,365,2,3,3,0,0,0,0,0,0,0,0.17,340,2,3,3,0,0,1,0,0,0,0,0.16,365,2,3,4,1,0,0,0,0,0,0,0.15,365,2,3,4,1,0,1,0,0,0,0,0.15,390,2,3,4,0,0,0,0,0,0,0,0.15,365,2,3,4,0,0,1,0,0,0,0,0.14,390,2,3,5,1,0,0,0,0,0,0,0.13,390,2,3,5,1,0,1,0,0,0,0,0.13,415,2,3,5,0,0,0,0,0,0,0,0.13,390,2,3,5,0,0,1,0,0,0,0,0.13,415,2,3,6,1,0,0,0,0,0,0,0.12,415,2,3,6,1,0,1,0,0,0,0,0.12,440,2,3,6,0,0,0,0,0,0,0,0.12,415,2,3,6,0,0,1,0,0,0,0,0.11,440,2,3,7,1,0,0,0,0,0,0,0.11,440,2,3,7,1,0,1,0,0,0,0,0.11,465,2,3,7,0,0,0,0,0,0,0,0.11,440,2,3,7,0,0,1,0,0,0,0,0.1,465,3,0,0,1,0,0,0,0,0,1,0.35,283,3,0,0,1,0,1,0,0,0,1,0.32,308,3,0,0,0,0,0,0,0,0,1,0.35,283,3,0,0,0,0,1,0,0,0,1,0.32,308,3,0,1,1,0,0,0,0,0,1,0.29,308,3,0,1,1,0,1,0,0,0,1,0.27,333,3,0,1,0,0,0,0,0,0,1,0.29,308,3,0,1,0,0,1,0,0,0,1,0.27,333,3,0,2,1,0,0,0,0,0,1,0.25,333,3,0,2,1,0,1,0,0,0,1,0.23,358,3,0,2,0,0,0,0,0,0,1,0.24,333,3,0,2,0,0,1,0,0,0,1,0.23,358,3,0,3,1,0,0,0,0,0,1,0.21,358,3,0,3,1,0,1,0,0,0,1,0.2,383,3,0,3,0,0,0,0,0,0,1,0.21,358,3,0,3,0,0,1,0,0,0,1,0.2,383,3,0,4,1,0,0,0,0,0,1,0.19,383,3,0,4,1,0,1,0,0,0,1,0.18,408,3,0,4,0,0,0,0,0,0,1,0.19,383,3,0,4,0,0,1,0,0,0,1,0.18,408,3,0,5,1,0,0,0,0,0,1,0.17,408,3,0,5,1,0,1,0,0,0,1,0.16,433,3,0,5,0,0,0,0,0,0,1,0.17,408,3,0,5,0,0,1,0,0,0,1,0.16,433,3,0,6,1,0,0,0,0,0,1,0.15,433,3,0,6,1,0,1,0,0,0,1,0.15,458,3,0,6,0,0,0,0,0,0,1,0.15,433,3,0,6,0,0,1,0,0,0,1,0.15,458,3,0,7,1,0,0,0,0,0,1,0.14,458,3,0,7,1,0,1,0,0,0,1,0.14,483,3,0,7,0,0,0,0,0,0,1,0.14,458,3,0,7,0,0,1,0,0,0,1,0.13,483,3,1,0,1,0,0,0,0,0,1,0.35,283,3,1,0,1,0,1,0,0,0,1,0.32,308,3,1,0,0,0,0,0,0,0,1,0.34,283,3,1,0,0,0,1,0,0,0,1,0.32,308,3,1,1,1,0,0,0,0,0,1,0.28,308,3,1,1,1,0,1,0,0,0,1,0.27,333,3,1,1,0,0,0,0,0,0,1,0.28,308,3,1,1,0,0,1,0,0,0,1,0.26,333,3,1,2,1,0,0,0,0,0,1,0.24,333,3,1,2,1,0,1,0,0,0,1,0.23,358,3,1,2,0,0,0,0,0,0,1,0.24,333,3,1,2,0,0,1,0,0,0,1,0.23,358,3,1,3,1,0,0,0,0,0,1,0.21,358,3,1,3,1,0,1,0,0,0,1,0.2,383,3,1,3,0,0,0,0,0,0,1,0.21,358,3,1,3,0,0,1,0,0,0,1,0.2,383,3,1,4,1,0,0,0,0,0,1,0.19,383,3,1,4,1,0,1,0,0,0,1,0.18,408,3,1,4,0,0,0,0,0,0,1,0.18,383,3,1,4,0,0,1,0,0,0,1,0.18,408,3,1,5,1,0,0,0,0,0,1,0.17,408,3,1,5,1,0,1,0,0,0,1,0.16,433,3,1,5,0,0,0,0,0,0,1,0.17,408,3,1,5,0,0,1,0,0,0,1,0.16,433,3,1,6,1,0,0,0,0,0,1,0.15,433,3,1,6,1,0,1,0,0,0,1,0.15,458,3,1,6,0,0,0,0,0,0,1,0.15,433,3,1,6,0,0,1,0,0,0,1,0.15,458,3,1,7,1,0,0,0,0,0,1,0.14,458,3,1,7,1,0,1,0,0,0,1,0.14,483,3,1,7,0,0,0,0,0,0,1,0.14,458,3,1,7,0,0,1,0,0,0,1,0.13,483,3,3,0,1,0,0,0,0,0,1,0.31,283,3,3,0,1,0,1,0,0,0,1,0.29,308,3,3,0,0,0,0,0,0,0,1,0.31,283,3,3,0,0,0,1,0,0,0,1,0.29,308,3,3,1,1,0,0,0,0,0,1,0.24,308,3,3,1,1,0,1,0,0,0,1,0.23,333,3,3,1,0,0,0,0,0,0,1,0.24,308,3,3,1,0,0,1,0,0,0,1,0.23,333,3,3,2,1,0,0,0,0,0,1,0.2,333,3,3,2,1,0,1,0,0,0,1,0.19,358,3,3,2,0,0,0,0,0,0,1,0.19,333,3,3,2,0,0,1,0,0,0,1,0.19,358,3,3,3,1,0,0,0,0,0,1,0.17,358,3,3,3,1,0,1,0,0,0,1,0.16,383,3,3,3,0,0,0,0,0,0,1,0.16,358,3,3,3,0,0,1,0,0,0,1,0.16,383,3,3,4,1,0,0,0,0,0,1,0.15,383,3,3,4,1,0,1,0,0,0,1,0.14,408,3,3,4,0,0,0,0,0,0,1,0.14,383,3,3,4,0,0,1,0,0,0,1,0.14,408,3,3,5,1,0,0,0,0,0,1,0.13,408,3,3,5,1,0,1,0,0,0,1,0.13,433,3,3,5,0,0,0,0,0,0,1,0.13,408,3,3,5,0,0,1,0,0,0,1,0.12,433,3,3,6,1,0,0,0,0,0,1,0.12,433,3,3,6,1,0,1,0,0,0,1,0.11,458,3,3,6,0,0,0,0,0,0,1,0.11,433,3,3,6,0,0,1,0,0,0,1,0.11,458,3,3,7,1,0,0,0,0,0,1,0.11,458,3,3,7,1,0,1,0,0,0,1,0.1,483,3,3,7,0,0,0,0,0,0,1,0.1,458,3,3,7,0,0,1,0,0,0,1,0.1,483,4,0,2,1,0,0,0,0,0,0,0.35,315,4,0,2,1,0,1,0,0,0,0,0.32,340,4,0,2,0,0,0,0,0,0,0,0.34,315,4,0,2,0,0,1,0,0,0,0,0.32,340,4,0,3,1,0,0,0,0,0,0,0.29,340,4,0,3,1,0,1,0,0,0,0,0.27,365,4,0,3,0,0,0,0,0,0,0,0.28,340,4,0,3,0,0,1,0,0,0,0,0.27,365,4,0,4,1,0,0,0,0,0,0,0.24,365,4,0,4,1,0,1,0,0,0,0,0.23,390,4,0,4,0,0,0,0,0,0,0,0.24,365,4,0,4,0,0,1,0,0,0,0,0.23,390,4,0,5,1,0,0,0,0,0,0,0.21,390,4,0,5,1,0,1,0,0,0,0,0.2,415,4,0,5,0,0,0,0,0,0,0,0.21,390,4,0,5,0,0,1,0,0,0,0,0.2,415,4,0,6,1,0,0,0,0,0,0,0.19,415,4,0,6,1,0,1,0,0,0,0,0.18,440,4,0,6,0,0,0,0,0,0,0,0.19,415,4,0,6,0,0,1,0,0,0,0,0.18,440,4,0,7,1,0,0,0,0,0,0,0.17,440,4,0,7,1,0,1,0,0,0,0,0.16,465,4,0,7,0,0,0,0,0,0,0,0.17,440,4,0,7,0,0,1,0,0,0,0,0.16,465,4,1,2,1,0,0,0,0,0,0,0.34,315,4,1,2,1,0,1,0,0,0,0,0.32,340,4,1,2,0,0,0,0,0,0,0,0.34,315,4,1,2,0,0,1,0,0,0,0,0.32,340,4,1,3,1,0,0,0,0,0,0,0.28,340,4,1,3,1,0,1,0,0,0,0,0.27,365,4,1,3,0,0,0,0,0,0,0,0.28,340,4,1,3,0,0,1,0,0,0,0,0.26,365,4,1,4,1,0,0,0,0,0,0,0.24,365,4,1,4,1,0,1,0,0,0,0,0.23,390,4,1,4,0,0,0,0,0,0,0,0.24,365,4,1,4,0,0,1,0,0,0,0,0.23,390,4,1,5,1,0,0,0,0,0,0,0.21,390,4,1,5,1,0,1,0,0,0,0,0.2,415,4,1,5,0,0,0,0,0,0,0,0.21,390,4,1,5,0,0,1,0,0,0,0,0.2,415,4,1,6,1,0,0,0,0,0,0,0.19,415,4,1,6,1,0,1,0,0,0,0,0.18,440,4,1,6,0,0,0,0,0,0,0,0.18,415,4,1,6,0,0,1,0,0,0,0,0.18,440,4,1,7,1,0,0,0,0,0,0,0.17,440,4,1,7,1,0,1,0,0,0,0,0.16,465,4,1,7,0,0,0,0,0,0,0,0.16,440,4,1,7,0,0,1,0,0,0,0,0.16,465,4,3,2,1,0,0,0,0,0,0,0.31,315,4,3,2,1,0,1,0,0,0,0,0.29,340,4,3,2,0,0,0,0,0,0,0,0.31,315,4,3,2,0,0,1,0,0,0,0,0.29,340,4,3,3,1,0,0,0,0,0,0,0.24,340,4,3,3,1,0,1,0,0,0,0,0.23,365,4,3,3,0,0,0,0,0,0,0,0.24,340,4,3,3,0,0,1,0,0,0,0,0.22,365,4,3,4,1,0,0,0,0,0,0,0.2,365,4,3,4,1,0,1,0,0,0,0,0.19,390,4,3,4,0,0,0,0,0,0,0,0.19,365,4,3,4,0,0,1,0,0,0,0,0.18,390,4,3,5,1,0,0,0,0,0,0,0.17,390,4,3,5,1,0,1,0,0,0,0,0.16,415,4,3,5,0,0,0,0,0,0,0,0.16,390,4,3,5,0,0,1,0,0,0,0,0.16,415,4,3,6,1,0,0,0,0,0,0,0.15,415,4,3,6,1,0,1,0,0,0,0,0.14,440,4,3,6,0,0,0,0,0,0,0,0.14,415,4,3,6,0,0,1,0,0,0,0,0.14,440,4,3,7,1,0,0,0,0,0,0,0.13,440,4,3,7,1,0,1,0,0,0,0,0.13,465,4,3,7,0,0,0,0,0,0,0,0.13,440,4,3,7,0,0,1,0,0,0,0,0.12,465,5,0,2,1,0,0,0,0,0,1,0.33,333,5,0,2,1,0,1,0,0,0,1,0.31,358,5,0,2,0,0,0,0,0,0,1,0.33,333,5,0,2,0,0,1,0,0,0,1,0.3,358,5,0,3,1,0,0,0,0,0,1,0.27,358,5,0,3,1,0,1,0,0,0,1,0.26,383,5,0,3,0,0,0,0,0,0,1,0.27,358,5,0,3,0,0,1,0,0,0,1,0.26,383,5,0,4,1,0,0,0,0,0,1,0.24,383,5,0,4,1,0,1,0,0,0,1,0.22,408,5,0,4,0,0,0,0,0,0,1,0.23,383,5,0,4,0,0,1,0,0,0,1,0.22,408,5,0,5,1,0,0,0,0,0,1,0.21,408,5,0,5,1,0,1,0,0,0,1,0.2,433,5,0,5,0,0,0,0,0,0,1,0.2,408,5,0,5,0,0,1,0,0,0,1,0.19,433,5,0,6,1,0,0,0,0,0,1,0.18,433,5,0,6,1,0,1,0,0,0,1,0.18,458,5,0,6,0,0,0,0,0,0,1,0.18,433,5,0,6,0,0,1,0,0,0,1,0.17,458,5,0,7,1,0,0,0,0,0,1,0.16,458,5,0,7,1,0,1,0,0,0,1,0.16,483,5,0,7,0,0,0,0,0,0,1,0.16,458,5,0,7,0,0,1,0,0,0,1,0.16,483,5,1,2,1,0,0,0,0,0,1,0.33,333,5,1,2,1,0,1,0,0,0,1,0.3,358,5,1,2,0,0,0,0,0,0,1,0.32,333,5,1,2,0,0,1,0,0,0,1,0.3,358,5,1,3,1,0,0,0,0,0,1,0.27,358,5,1,3,1,0,1,0,0,0,1,0.26,383,5,1,3,0,0,0,0,0,0,1,0.27,358,5,1,3,0,0,1,0,0,0,1,0.25,383,5,1,4,1,0,0,0,0,0,1,0.23,383,5,1,4,1,0,1,0,0,0,1,0.22,408,5,1,4,0,0,0,0,0,0,1,0.23,383,5,1,4,0,0,1,0,0,0,1,0.22,408,5,1,5,1,0,0,0,0,0,1,0.2,408,5,1,5,1,0,1,0,0,0,1,0.19,433,5,1,5,0,0,0,0,0,0,1,0.2,408,5,1,5,0,0,1,0,0,0,1,0.19,433,5,1,6,1,0,0,0,0,0,1,0.18,433,5,1,6,1,0,1,0,0,0,1,0.17,458,5,1,6,0,0,0,0,0,0,1,0.18,433,5,1,6,0,0,1,0,0,0,1,0.17,458,5,1,7,1,0,0,0,0,0,1,0.16,458,5,1,7,1,0,1,0,0,0,1,0.16,483,5,1,7,0,0,0,0,0,0,1,0.16,458,5,1,7,0,0,1,0,0,0,1,0.15,483,5,3,2,1,0,0,0,0,0,1,0.3,333,5,3,2,1,0,1,0,0,0,1,0.28,358,5,3,2,0,0,0,0,0,0,1,0.29,333,5,3,2,0,0,1,0,0,0,1,0.27,358,5,3,3,1,0,0,0,0,0,1,0.23,358,5,3,3,1,0,1,0,0,0,1,0.22,383,5,3,3,0,0,0,0,0,0,1,0.23,358,5,3,3,0,0,1,0,0,0,1,0.22,383,5,3,4,1,0,0,0,0,0,1,0.19,383,5,3,4,1,0,1,0,0,0,1,0.18,408,5,3,4,0,0,0,0,0,0,1,0.19,383,5,3,4,0,0,1,0,0,0,1,0.18,408,5,3,5,1,0,0,0,0,0,1,0.16,408,5,3,5,1,0,1,0,0,0,1,0.16,433,5,3,5,0,0,0,0,0,0,1,0.16,408,5,3,5,0,0,1,0,0,0,1,0.15,433,5,3,6,1,0,0,0,0,0,1,0.14,433,5,3,6,1,0,1,0,0,0,1,0.14,458,5,3,6,0,0,0,0,0,0,1,0.14,433,5,3,6,0,0,1,0,0,0,1,0.13,458,5,3,7,1,0,0,0,0,0,1,0.13,458,5,3,7,1,0,1,0,0,0,1,0.12,483,5,3,7,0,0,0,0,0,0,1,0.12,458,5,3,7,0,0,1,0,0,0,1,0.12,483,6,2,0,1,0,0,1,0,0,0,0.7,265,6,2,0,1,0,1,1,0,0,0,0.6,290,6,2,0,0,0,0,1,0,0,0,0.7,265,6,2,0,0,0,1,1,0,0,0,0.6,290,6,2,1,1,0,0,1,0,0,0,0.7,290,6,2,1,1,0,1,1,0,0,0,0.6,315,6,2,1,0,0,0,1,0,0,0,0.7,290,6,2,1,0,0,1,1,0,0,0,0.6,315,6,2,2,1,0,0,1,0,0,0,0.7,315,6,2,2,1,0,1,1,0,0,0,0.6,340,6,2,2,0,0,0,1,0,0,0,0.7,315,6,2,2,0,0,1,1,0,0,0,0.6,340,6,2,3,1,0,0,1,0,0,0,0.7,340,6,2,3,1,0,1,1,0,0,0,0.6,365,6,2,3,0,0,0,1,0,0,0,0.7,340,6,2,3,0,0,1,1,0,0,0,0.6,365,6,2,4,1,0,0,1,0,0,0,0.7,365,6,2,4,1,0,1,1,0,0,0,0.6,390,6,2,4,0,0,0,1,0,0,0,0.7,365,6,2,4,0,0,1,1,0,0,0,0.6,390,6,2,5,1,0,0,1,0,0,0,0.7,390,6,2,5,1,0,1,1,0,0,0,0.6,415,6,2,5,0,0,0,1,0,0,0,0.7,390,6,2,5,0,0,1,1,0,0,0,0.6,415,6,2,6,1,0,0,1,0,0,0,0.7,415,6,2,6,1,0,1,1,0,0,0,0.6,440,6,2,6,0,0,0,1,0,0,0,0.7,415,6,2,6,0,0,1,1,0,0,0,0.6,440,6,2,7,1,0,0,1,0,0,0,0.7,440,6,2,7,1,0,1,1,0,0,0,0.6,465,6,2,7,0,0,0,1,0,0,0,0.7,440,6,2,7,0,0,1,1,0,0,0,0.6,465,7,2,0,1,0,0,1,0,0,1,0.63,283,7,2,0,1,0,1,1,0,0,1,0.55,308,7,2,0,0,0,0,1,0,0,1,0.63,283,7,2,0,0,0,1,1,0,0,1,0.55,308,7,2,1,1,0,0,1,0,0,1,0.63,308,7,2,1,1,0,1,1,0,0,1,0.55,333,7,2,1,0,0,0,1,0,0,1,0.63,308,7,2,1,0,0,1,1,0,0,1,0.55,333,7,2,2,1,0,0,1,0,0,1,0.63,333,7,2,2,1,0,1,1,0,0,1,0.55,358,7,2,2,0,0,0,1,0,0,1,0.63,333,7,2,2,0,0,1,1,0,0,1,0.55,358,7,2,3,1,0,0,1,0,0,1,0.63,358,7,2,3,1,0,1,1,0,0,1,0.55,383,7,2,3,0,0,0,1,0,0,1,0.63,358,7,2,3,0,0,1,1,0,0,1,0.55,383,7,2,4,1,0,0,1,0,0,1,0.63,383,7,2,4,1,0,1,1,0,0,1,0.55,408,7,2,4,0,0,0,1,0,0,1,0.63,383,7,2,4,0,0,1,1,0,0,1,0.55,408,7,2,5,1,0,0,1,0,0,1,0.63,408,7,2,5,1,0,1,1,0,0,1,0.55,433,7,2,5,0,0,0,1,0,0,1,0.63,408,7,2,5,0,0,1,1,0,0,1,0.55,433,7,2,6,1,0,0,1,0,0,1,0.63,433,7,2,6,1,0,1,1,0,0,1,0.55,458,7,2,6,0,0,0,1,0,0,1,0.63,433,7,2,6,0,0,1,1,0,0,1,0.55,458,7,2,7,1,0,0,1,0,0,1,0.63,458,7,2,7,1,0,1,1,0,0,1,0.55,483,7,2,7,0,0,0,1,0,0,1,0.63,458,7,2,7,0,0,1,1,0,0,1,0.55,483,8,2,0,1,0,0,1,1,0,0,1.74,265,8,2,0,1,0,1,1,1,0,0,1.7,290,8,2,0,0,0,0,1,1,0,0,1.73,265,8,2,0,0,0,1,1,1,0,0,1.69,290,8,2,1,1,0,0,1,1,0,0,1.74,290,8,2,1,1,0,1,1,1,0,0,1.69,315,8,2,1,0,0,0,1,1,0,0,1.73,290,8,2,1,0,0,1,1,1,0,0,1.69,315,8,2,2,1,0,0,1,1,0,0,1.73,315,8,2,2,1,0,1,1,1,0,0,1.69,340,8,2,2,0,0,0,1,1,0,0,1.73,315,8,2,2,0,0,1,1,1,0,0,1.69,340,8,2,3,1,0,0,1,1,0,0,1.73,340,8,2,3,1,0,1,1,1,0,0,1.69,365,8,2,3,0,0,0,1,1,0,0,1.73,340,8,2,3,0,0,1,1,1,0,0,1.69,365,8,2,4,1,0,0,1,1,0,0,1.73,365,8,2,4,1,0,1,1,1,0,0,1.69,390,8,2,4,0,0,0,1,1,0,0,1.73,365,8,2,4,0,0,1,1,1,0,0,1.69,390,8,2,5,1,0,0,1,1,0,0,1.73,390,8,2,5,1,0,1,1,1,0,0,1.69,415,8,2,5,0,0,0,1,1,0,0,1.73,390,8,2,5,0,0,1,1,1,0,0,1.69,415,8,2,6,1,0,0,1,1,0,0,1.73,415,8,2,6,1,0,1,1,1,0,0,1.69,440,8,2,6,0,0,0,1,1,0,0,1.73,415,8,2,6,0,0,1,1,1,0,0,1.69,440,8,2,7,1,0,0,1,1,0,0,1.73,440,8,2,7,1,0,1,1,1,0,0,1.69,465,8,2,7,0,0,0,1,1,0,0,1.73,440,8,2,7,0,0,1,1,1,0,0,1.69,465,9,2,0,1,0,0,1,1,0,1,1.38,283,9,2,0,1,0,1,1,1,0,1,1.35,308,9,2,0,0,0,0,1,1,0,1,1.37,283,9,2,0,0,0,1,1,1,0,1,1.35,308,9,2,1,1,0,0,1,1,0,1,1.38,308,9,2,1,1,0,1,1,1,0,1,1.35,333,9,2,1,0,0,0,1,1,0,1,1.37,308,9,2,1,0,0,1,1,1,0,1,1.35,333,9,2,2,1,0,0,1,1,0,1,1.37,333,9,2,2,1,0,1,1,1,0,1,1.35,358,9,2,2,0,0,0,1,1,0,1,1.37,333,9,2,2,0,0,1,1,1,0,1,1.35,358,9,2,3,1,0,0,1,1,0,1,1.37,358,9,2,3,1,0,1,1,1,0,1,1.35,383,9,2,3,0,0,0,1,1,0,1,1.37,358,9,2,3,0,0,1,1,1,0,1,1.35,383,9,2,4,1,0,0,1,1,0,1,1.37,383,9,2,4,1,0,1,1,1,0,1,1.35,408,9,2,4,0,0,0,1,1,0,1,1.37,383,9,2,4,0,0,1,1,1,0,1,1.35,408,9,2,5,1,0,0,1,1,0,1,1.37,408,9,2,5,1,0,1,1,1,0,1,1.35,433,9,2,5,0,0,0,1,1,0,1,1.37,408,9,2,5,0,0,1,1,1,0,1,1.35,433,9,2,6,1,0,0,1,1,0,1,1.37,433,9,2,6,1,0,1,1,1,0,1,1.35,458,9,2,6,0,0,0,1,1,0,1,1.37,433,9,2,6,0,0,1,1,1,0,1,1.35,458,9,2,7,1,0,0,1,1,0,1,1.37,458,9,2,7,1,0,1,1,1,0,1,1.35,483,9,2,7,0,0,0,1,1,0,1,1.37,458,9,2,7,0,0,1,1,1,0,1,1.35,483,10,0,0,1,0,0,1,0,0,0,0.54,265,10,0,0,1,0,1,1,0,0,0,0.48,290,10,0,0,0,0,0,1,0,0,0,0.53,265,10,0,0,0,0,1,1,0,0,0,0.48,290,10,0,1,1,0,0,1,0,0,0,0.41,290,10,0,1,1,0,1,1,0,0,0,0.37,315,10,0,1,0,0,0,1,0,0,0,0.4,290,10,0,1,0,0,1,1,0,0,0,0.37,315,10,0,2,1,0,0,1,0,0,0,0.33,315,10,0,2,1,0,1,1,0,0,0,0.3,340,10,0,2,0,0,0,1,0,0,0,0.32,315,10,0,2,0,0,1,1,0,0,0,0.3,340,10,0,3,1,0,0,1,0,0,0,0.27,340,10,0,3,1,0,1,1,0,0,0,0.26,365,10,0,3,0,0,0,1,0,0,0,0.27,340,10,0,3,0,0,1,1,0,0,0,0.25,365,10,0,4,1,0,0,1,0,0,0,0.23,365,10,0,4,1,0,1,1,0,0,0,0.22,390,10,0,4,0,0,0,1,0,0,0,0.23,365,10,0,4,0,0,1,1,0,0,0,0.22,390,10,0,5,1,0,0,1,0,0,0,0.2,390,10,0,5,1,0,1,1,0,0,0,0.2,415,10,0,5,0,0,0,1,0,0,0,0.2,390,10,0,5,0,0,1,1,0,0,0,0.19,415,10,0,6,1,0,0,1,0,0,0,0.18,415,10,0,6,1,0,1,1,0,0,0,0.17,440,10,0,6,0,0,0,1,0,0,0,0.18,415,10,0,6,0,0,1,1,0,0,0,0.17,440,10,0,7,1,0,0,1,0,0,0,0.16,440,10,0,7,1,0,1,1,0,0,0,0.16,465,10,0,7,0,0,0,1,0,0,0,0.16,440,10,0,7,0,0,1,1,0,0,0,0.15,465,10,1,0,1,0,0,1,0,0,0,0.53,265,10,1,0,1,0,1,1,0,0,0,0.47,290,10,1,0,0,0,0,1,0,0,0,0.53,265,10,1,0,0,0,1,1,0,0,0,0.47,290,10,1,1,1,0,0,1,0,0,0,0.4,290,10,1,1,1,0,1,1,0,0,0,0.37,315,10,1,1,0,0,0,1,0,0,0,0.39,290,10,1,1,0,0,1,1,0,0,0,0.36,315,10,1,2,1,0,0,1,0,0,0,0.32,315,10,1,2,1,0,1,1,0,0,0,0.3,340,10,1,2,0,0,0,1,0,0,0,0.31,315,10,1,2,0,0,1,1,0,0,0,0.29,340,10,1,3,1,0,0,1,0,0,0,0.27,340,10,1,3,1,0,1,1,0,0,0,0.25,365,10,1,3,0,0,0,1,0,0,0,0.26,340,10,1,3,0,0,1,1,0,0,0,0.25,365,10,1,4,1,0,0,1,0,0,0,0.23,365,10,1,4,1,0,1,1,0,0,0,0.22,390,10,1,4,0,0,0,1,0,0,0,0.23,365,10,1,4,0,0,1,1,0,0,0,0.21,390,10,1,5,1,0,0,1,0,0,0,0.2,390,10,1,5,1,0,1,1,0,0,0,0.19,415,10,1,5,0,0,0,1,0,0,0,0.2,390,10,1,5,0,0,1,1,0,0,0,0.19,415,10,1,6,1,0,0,1,0,0,0,0.18,415,10,1,6,1,0,1,1,0,0,0,0.17,440,10,1,6,0,0,0,1,0,0,0,0.18,415,10,1,6,0,0,1,1,0,0,0,0.17,440,10,1,7,1,0,0,1,0,0,0,0.16,440,10,1,7,1,0,1,1,0,0,0,0.16,465,10,1,7,0,0,0,1,0,0,0,0.16,440,10,1,7,0,0,1,1,0,0,0,0.15,465,10,3,0,1,0,0,1,0,0,0,0.46,265,10,3,0,1,0,1,1,0,0,0,0.41,290,10,3,0,0,0,0,1,0,0,0,0.45,265,10,3,0,0,0,1,1,0,0,0,0.41,290,10,3,1,1,0,0,1,0,0,0,0.32,290,10,3,1,1,0,1,1,0,0,0,0.3,315,10,3,1,0,0,0,1,0,0,0,0.31,290,10,3,1,0,0,1,1,0,0,0,0.29,315,10,3,2,1,0,0,1,0,0,0,0.25,315,10,3,2,1,0,1,1,0,0,0,0.24,340,10,3,2,0,0,0,1,0,0,0,0.24,315,10,3,2,0,0,1,1,0,0,0,0.23,340,10,3,3,1,0,0,1,0,0,0,0.2,340,10,3,3,1,0,1,1,0,0,0,0.19,365,10,3,3,0,0,0,1,0,0,0,0.2,340,10,3,3,0,0,1,1,0,0,0,0.19,365,10,3,4,1,0,0,1,0,0,0,0.17,365,10,3,4,1,0,1,1,0,0,0,0.17,390,10,3,4,0,0,0,1,0,0,0,0.17,365,10,3,4,0,0,1,1,0,0,0,0.16,390,10,3,5,1,0,0,1,0,0,0,0.15,390,10,3,5,1,0,1,1,0,0,0,0.15,415,10,3,5,0,0,0,1,0,0,0,0.14,390,10,3,5,0,0,1,1,0,0,0,0.14,415,10,3,6,1,0,0,1,0,0,0,0.13,415,10,3,6,1,0,1,1,0,0,0,0.13,440,10,3,6,0,0,0,1,0,0,0,0.13,415,10,3,6,0,0,1,1,0,0,0,0.12,440,10,3,7,1,0,0,1,0,0,0,0.12,440,10,3,7,1,0,1,1,0,0,0,0.12,465,10,3,7,0,0,0,1,0,0,0,0.12,440,10,3,7,0,0,1,1,0,0,0,0.11,465,11,0,0,1,0,0,1,0,0,1,0.5,283,11,0,0,1,0,1,1,0,0,1,0.45,308,11,0,0,0,0,0,1,0,0,1,0.49,283,11,0,0,0,0,1,1,0,0,1,0.44,308,11,0,1,1,0,0,1,0,0,1,0.38,308,11,0,1,1,0,1,1,0,0,1,0.35,333,11,0,1,0,0,0,1,0,0,1,0.38,308,11,0,1,0,0,1,1,0,0,1,0.35,333,11,0,2,1,0,0,1,0,0,1,0.31,333,11,0,2,1,0,1,1,0,0,1,0.29,358,11,0,2,0,0,0,1,0,0,1,0.31,333,11,0,2,0,0,1,1,0,0,1,0.29,358,11,0,3,1,0,0,1,0,0,1,0.26,358,11,0,3,1,0,1,1,0,0,1,0.25,383,11,0,3,0,0,0,1,0,0,1,0.26,358,11,0,3,0,0,1,1,0,0,1,0.24,383,11,0,4,1,0,0,1,0,0,1,0.23,383,11,0,4,1,0,1,1,0,0,1,0.21,408,11,0,4,0,0,0,1,0,0,1,0.22,383,11,0,4,0,0,1,1,0,0,1,0.21,408,11,0,5,1,0,0,1,0,0,1,0.2,408,11,0,5,1,0,1,1,0,0,1,0.19,433,11,0,5,0,0,0,1,0,0,1,0.19,408,11,0,5,0,0,1,1,0,0,1,0.19,433,11,0,6,1,0,0,1,0,0,1,0.18,433,11,0,6,1,0,1,1,0,0,1,0.17,458,11,0,6,0,0,0,1,0,0,1,0.17,433,11,0,6,0,0,1,1,0,0,1,0.17,458,11,0,7,1,0,0,1,0,0,1,0.16,458,11,0,7,1,0,1,1,0,0,1,0.15,483,11,0,7,0,0,0,1,0,0,1,0.16,458,11,0,7,0,0,1,1,0,0,1,0.15,483,11,1,0,1,0,0,1,0,0,1,0.49,283,11,1,0,1,0,1,1,0,0,1,0.44,308,11,1,0,0,0,0,1,0,0,1,0.49,283,11,1,0,0,0,1,1,0,0,1,0.44,308,11,1,1,1,0,0,1,0,0,1,0.38,308,11,1,1,1,0,1,1,0,0,1,0.35,333,11,1,1,0,0,0,1,0,0,1,0.37,308,11,1,1,0,0,1,1,0,0,1,0.34,333,11,1,2,1,0,0,1,0,0,1,0.31,333,11,1,2,1,0,1,1,0,0,1,0.29,358,11,1,2,0,0,0,1,0,0,1,0.3,333,11,1,2,0,0,1,1,0,0,1,0.28,358,11,1,3,1,0,0,1,0,0,1,0.26,358,11,1,3,1,0,1,1,0,0,1,0.24,383,11,1,3,0,0,0,1,0,0,1,0.25,358,11,1,3,0,0,1,1,0,0,1,0.24,383,11,1,4,1,0,0,1,0,0,1,0.22,383,11,1,4,1,0,1,1,0,0,1,0.21,408,11,1,4,0,0,0,1,0,0,1,0.22,383,11,1,4,0,0,1,1,0,0,1,0.21,408,11,1,5,1,0,0,1,0,0,1,0.2,408,11,1,5,1,0,1,1,0,0,1,0.19,433,11,1,5,0,0,0,1,0,0,1,0.19,408,11,1,5,0,0,1,1,0,0,1,0.18,433,11,1,6,1,0,0,1,0,0,1,0.18,433,11,1,6,1,0,1,1,0,0,1,0.17,458,11,1,6,0,0,0,1,0,0,1,0.17,433,11,1,6,0,0,1,1,0,0,1,0.17,458,11,1,7,1,0,0,1,0,0,1,0.16,458,11,1,7,1,0,1,1,0,0,1,0.15,483,11,1,7,0,0,0,1,0,0,1,0.16,458,11,1,7,0,0,1,1,0,0,1,0.15,483,11,3,0,1,0,0,1,0,0,1,0.43,283,11,3,0,1,0,1,1,0,0,1,0.39,308,11,3,0,0,0,0,1,0,0,1,0.42,283,11,3,0,0,0,1,1,0,0,1,0.38,308,11,3,1,1,0,0,1,0,0,1,0.31,308,11,3,1,1,0,1,1,0,0,1,0.29,333,11,3,1,0,0,0,1,0,0,1,0.3,308,11,3,1,0,0,1,1,0,0,1,0.28,333,11,3,2,1,0,0,1,0,0,1,0.24,333,11,3,2,1,0,1,1,0,0,1,0.23,358,11,3,2,0,0,0,1,0,0,1,0.23,333,11,3,2,0,0,1,1,0,0,1,0.22,358,11,3,3,1,0,0,1,0,0,1,0.2,358,11,3,3,1,0,1,1,0,0,1,0.19,383,11,3,3,0,0,0,1,0,0,1,0.19,358,11,3,3,0,0,1,1,0,0,1,0.18,383,11,3,4,1,0,0,1,0,0,1,0.17,383,11,3,4,1,0,1,1,0,0,1,0.16,408,11,3,4,0,0,0,1,0,0,1,0.16,383,11,3,4,0,0,1,1,0,0,1,0.16,408,11,3,5,1,0,0,1,0,0,1,0.15,408,11,3,5,1,0,1,1,0,0,1,0.14,433,11,3,5,0,0,0,1,0,0,1,0.14,408,11,3,5,0,0,1,1,0,0,1,0.14,433,11,3,6,1,0,0,1,0,0,1,0.13,433,11,3,6,1,0,1,1,0,0,1,0.13,458,11,3,6,0,0,0,1,0,0,1,0.13,433,11,3,6,0,0,1,1,0,0,1,0.12,458,11,3,7,1,0,0,1,0,0,1,0.12,458,11,3,7,1,0,1,1,0,0,1,0.12,483,11,3,7,0,0,0,1,0,0,1,0.11,458,11,3,7,0,0,1,1,0,0,1,0.11,483,12,0,0,1,0,0,1,1,0,0,1.0,265,12,0,0,1,0,1,1,1,0,0,0.98,290,12,0,0,0,0,0,1,1,0,0,0.98,265,12,0,0,0,0,1,1,1,0,0,0.97,290,12,0,1,1,0,0,1,1,0,0,0.62,290,12,0,1,1,0,1,1,1,0,0,0.62,315,12,0,1,0,0,0,1,1,0,0,0.61,290,12,0,1,0,0,1,1,1,0,0,0.6,315,12,0,2,1,0,0,1,1,0,0,0.45,315,12,0,2,1,0,1,1,1,0,0,0.45,340,12,0,2,0,0,0,1,1,0,0,0.44,315,12,0,2,0,0,1,1,1,0,0,0.44,340,12,0,3,1,0,0,1,1,0,0,0.35,340,12,0,3,1,0,1,1,1,0,0,0.35,365,12,0,3,0,0,0,1,1,0,0,0.35,340,12,0,3,0,0,1,1,1,0,0,0.34,365,12,0,4,1,0,0,1,1,0,0,0.29,365,12,0,4,1,0,1,1,1,0,0,0.29,390,12,0,4,0,0,0,1,1,0,0,0.28,365,12,0,4,0,0,1,1,1,0,0,0.28,390,12,0,5,1,0,0,1,1,0,0,0.25,390,12,0,5,1,0,1,1,1,0,0,0.25,415,12,0,5,0,0,0,1,1,0,0,0.24,390,12,0,5,0,0,1,1,1,0,0,0.24,415,12,0,6,1,0,0,1,1,0,0,0.22,415,12,0,6,1,0,1,1,1,0,0,0.21,440,12,0,6,0,0,0,1,1,0,0,0.21,415,12,0,6,0,0,1,1,1,0,0,0.21,440,12,0,7,1,0,0,1,1,0,0,0.19,440,12,0,7,1,0,1,1,1,0,0,0.19,465,12,0,7,0,0,0,1,1,0,0,0.19,440,12,0,7,0,0,1,1,1,0,0,0.18,465,12,1,0,1,0,0,1,1,0,0,0.97,265,12,1,0,1,0,1,1,1,0,0,0.96,290,12,1,0,0,0,0,1,1,0,0,0.95,265,12,1,0,0,0,1,1,1,0,0,0.94,290,12,1,1,1,0,0,1,1,0,0,0.6,290,12,1,1,1,0,1,1,1,0,0,0.6,315,12,1,1,0,0,0,1,1,0,0,0.59,290,12,1,1,0,0,1,1,1,0,0,0.58,315,12,1,2,1,0,0,1,1,0,0,0.44,315,12,1,2,1,0,1,1,1,0,0,0.44,340,12,1,2,0,0,0,1,1,0,0,0.43,315,12,1,2,0,0,1,1,1,0,0,0.43,340,12,1,3,1,0,0,1,1,0,0,0.35,340,12,1,3,1,0,1,1,1,0,0,0.35,365,12,1,3,0,0,0,1,1,0,0,0.34,340,12,1,3,0,0,1,1,1,0,0,0.34,365,12,1,4,1,0,0,1,1,0,0,0.29,365,12,1,4,1,0,1,1,1,0,0,0.29,390,12,1,4,0,0,0,1,1,0,0,0.28,365,12,1,4,0,0,1,1,1,0,0,0.28,390,12,1,5,1,0,0,1,1,0,0,0.25,390,12,1,5,1,0,1,1,1,0,0,0.24,415,12,1,5,0,0,0,1,1,0,0,0.24,390,12,1,5,0,0,1,1,1,0,0,0.24,415,12,1,6,1,0,0,1,1,0,0,0.21,415,12,1,6,1,0,1,1,1,0,0,0.21,440,12,1,6,0,0,0,1,1,0,0,0.21,415,12,1,6,0,0,1,1,1,0,0,0.21,440,12,1,7,1,0,0,1,1,0,0,0.19,440,12,1,7,1,0,1,1,1,0,0,0.19,465,12,1,7,0,0,0,1,1,0,0,0.19,440,12,1,7,0,0,1,1,1,0,0,0.18,465,12,3,0,1,0,0,1,1,0,0,0.75,265,12,3,0,1,0,1,1,1,0,0,0.74,290,12,3,0,0,0,0,1,1,0,0,0.72,265,12,3,0,0,0,1,1,1,0,0,0.71,290,12,3,1,1,0,0,1,1,0,0,0.44,290,12,3,1,1,0,1,1,1,0,0,0.44,315,12,3,1,0,0,0,1,1,0,0,0.42,290,12,3,1,0,0,1,1,1,0,0,0.42,315,12,3,2,1,0,0,1,1,0,0,0.32,315,12,3,2,1,0,1,1,1,0,0,0.31,340,12,3,2,0,0,0,1,1,0,0,0.3,315,12,3,2,0,0,1,1,1,0,0,0.3,340,12,3,3,1,0,0,1,1,0,0,0.25,340,12,3,3,1,0,1,1,1,0,0,0.25,365,12,3,3,0,0,0,1,1,0,0,0.24,340,12,3,3,0,0,1,1,1,0,0,0.24,365,12,3,4,1,0,0,1,1,0,0,0.2,365,12,3,4,1,0,1,1,1,0,0,0.2,390,12,3,4,0,0,0,1,1,0,0,0.19,365,12,3,4,0,0,1,1,1,0,0,0.19,390,12,3,5,1,0,0,1,1,0,0,0.17,390,12,3,5,1,0,1,1,1,0,0,0.17,415,12,3,5,0,0,0,1,1,0,0,0.17,390,12,3,5,0,0,1,1,1,0,0,0.16,415,12,3,6,1,0,0,1,1,0,0,0.15,415,12,3,6,1,0,1,1,1,0,0,0.15,440,12,3,6,0,0,0,1,1,0,0,0.14,415,12,3,6,0,0,1,1,1,0,0,0.14,440,12,3,7,1,0,0,1,1,0,0,0.13,440,12,3,7,1,0,1,1,1,0,0,0.13,465,12,3,7,0,0,0,1,1,0,0,0.13,440,12,3,7,0,0,1,1,1,0,0,0.13,465,13,0,0,1,0,0,1,1,0,1,0.87,283,13,0,0,1,0,1,1,1,0,1,0.86,308,13,0,0,0,0,0,1,1,0,1,0.85,283,13,0,0,0,0,1,1,1,0,1,0.84,308,13,0,1,1,0,0,1,1,0,1,0.57,308,13,0,1,1,0,1,1,1,0,1,0.56,333,13,0,1,0,0,0,1,1,0,1,0.56,308,13,0,1,0,0,1,1,1,0,1,0.55,333,13,0,2,1,0,0,1,1,0,1,0.42,333,13,0,2,1,0,1,1,1,0,1,0.42,358,13,0,2,0,0,0,1,1,0,1,0.41,333,13,0,2,0,0,1,1,1,0,1,0.41,358,13,0,3,1,0,0,1,1,0,1,0.34,358,13,0,3,1,0,1,1,1,0,1,0.33,383,13,0,3,0,0,0,1,1,0,1,0.33,358,13,0,3,0,0,1,1,1,0,1,0.33,383,13,0,4,1,0,0,1,1,0,1,0.28,383,13,0,4,1,0,1,1,1,0,1,0.28,408,13,0,4,0,0,0,1,1,0,1,0.27,383,13,0,4,0,0,1,1,1,0,1,0.27,408,13,0,5,1,0,0,1,1,0,1,0.24,408,13,0,5,1,0,1,1,1,0,1,0.24,433,13,0,5,0,0,0,1,1,0,1,0.23,408,13,0,5,0,0,1,1,1,0,1,0.23,433,13,0,6,1,0,0,1,1,0,1,0.21,433,13,0,6,1,0,1,1,1,0,1,0.21,458,13,0,6,0,0,0,1,1,0,1,0.2,433,13,0,6,0,0,1,1,1,0,1,0.2,458,13,0,7,1,0,0,1,1,0,1,0.19,458,13,0,7,1,0,1,1,1,0,1,0.18,483,13,0,7,0,0,0,1,1,0,1,0.18,458,13,0,7,0,0,1,1,1,0,1,0.18,483,13,1,0,1,0,0,1,1,0,1,0.85,283,13,1,0,1,0,1,1,1,0,1,0.84,308,13,1,0,0,0,0,1,1,0,1,0.83,283,13,1,0,0,0,1,1,1,0,1,0.82,308,13,1,1,1,0,0,1,1,0,1,0.55,308,13,1,1,1,0,1,1,1,0,1,0.55,333,13,1,1,0,0,0,1,1,0,1,0.54,308,13,1,1,0,0,1,1,1,0,1,0.54,333,13,1,2,1,0,0,1,1,0,1,0.41,333,13,1,2,1,0,1,1,1,0,1,0.41,358,13,1,2,0,0,0,1,1,0,1,0.4,333,13,1,2,0,0,1,1,1,0,1,0.4,358,13,1,3,1,0,0,1,1,0,1,0.33,358,13,1,3,1,0,1,1,1,0,1,0.33,383,13,1,3,0,0,0,1,1,0,1,0.32,358,13,1,3,0,0,1,1,1,0,1,0.32,383,13,1,4,1,0,0,1,1,0,1,0.28,383,13,1,4,1,0,1,1,1,0,1,0.27,408,13,1,4,0,0,0,1,1,0,1,0.27,383,13,1,4,0,0,1,1,1,0,1,0.27,408,13,1,5,1,0,0,1,1,0,1,0.24,408,13,1,5,1,0,1,1,1,0,1,0.24,433,13,1,5,0,0,0,1,1,0,1,0.23,408,13,1,5,0,0,1,1,1,0,1,0.23,433,13,1,6,1,0,0,1,1,0,1,0.21,433,13,1,6,1,0,1,1,1,0,1,0.21,458,13,1,6,0,0,0,1,1,0,1,0.2,433,13,1,6,0,0,1,1,1,0,1,0.2,458,13,1,7,1,0,0,1,1,0,1,0.19,458,13,1,7,1,0,1,1,1,0,1,0.18,483,13,1,7,0,0,0,1,1,0,1,0.18,458,13,1,7,0,0,1,1,1,0,1,0.18,483,13,3,0,1,0,0,1,1,0,1,0.67,283,13,3,0,1,0,1,1,1,0,1,0.66,308,13,3,0,0,0,0,1,1,0,1,0.65,283,13,3,0,0,0,1,1,1,0,1,0.64,308,13,3,1,1,0,0,1,1,0,1,0.41,308,13,3,1,1,0,1,1,1,0,1,0.41,333,13,3,1,0,0,0,1,1,0,1,0.4,308,13,3,1,0,0,1,1,1,0,1,0.4,333,13,3,2,1,0,0,1,1,0,1,0.3,333,13,3,2,1,0,1,1,1,0,1,0.3,358,13,3,2,0,0,0,1,1,0,1,0.29,333,13,3,2,0,0,1,1,1,0,1,0.29,358,13,3,3,1,0,0,1,1,0,1,0.24,358,13,3,3,1,0,1,1,1,0,1,0.24,383,13,3,3,0,0,0,1,1,0,1,0.23,358,13,3,3,0,0,1,1,1,0,1,0.23,383,13,3,4,1,0,0,1,1,0,1,0.2,383,13,3,4,1,0,1,1,1,0,1,0.2,408,13,3,4,0,0,0,1,1,0,1,0.19,383,13,3,4,0,0,1,1,1,0,1,0.19,408,13,3,5,1,0,0,1,1,0,1,0.17,408,13,3,5,1,0,1,1,1,0,1,0.17,433,13,3,5,0,0,0,1,1,0,1,0.16,408,13,3,5,0,0,1,1,1,0,1,0.16,433,13,3,6,1,0,0,1,1,0,1,0.15,433,13,3,6,1,0,1,1,1,0,1,0.15,458,13,3,6,0,0,0,1,1,0,1,0.14,433,13,3,6,0,0,1,1,1,0,1,0.14,458,13,3,7,1,0,0,1,1,0,1,0.13,458,13,3,7,1,0,1,1,1,0,1,0.13,483,13,3,7,0,0,0,1,1,0,1,0.13,458,13,3,7,0,0,1,1,1,0,1,0.13,483,14,0,2,1,0,0,1,0,0,0,0.49,315,14,0,2,1,0,1,1,0,0,0,0.44,340,14,0,2,0,0,0,1,0,0,0,0.49,315,14,0,2,0,0,1,1,0,0,0,0.44,340,14,0,3,1,0,0,1,0,0,0,0.38,340,14,0,3,1,0,1,1,0,0,0,0.35,365,14,0,3,0,0,0,1,0,0,0,0.37,340,14,0,3,0,0,1,1,0,0,0,0.34,365,14,0,4,1,0,0,1,0,0,0,0.31,365,14,0,4,1,0,1,1,0,0,0,0.29,390,14,0,4,0,0,0,1,0,0,0,0.3,365,14,0,4,0,0,1,1,0,0,0,0.28,390,14,0,5,1,0,0,1,0,0,0,0.26,390,14,0,5,1,0,1,1,0,0,0,0.25,415,14,0,5,0,0,0,1,0,0,0,0.25,390,14,0,5,0,0,1,1,0,0,0,0.24,415,14,0,6,1,0,0,1,0,0,0,0.22,415,14,0,6,1,0,1,1,0,0,0,0.21,440,14,0,6,0,0,0,1,0,0,0,0.22,415,14,0,6,0,0,1,1,0,0,0,0.21,440,14,0,7,1,0,0,1,0,0,0,0.2,440,14,0,7,1,0,1,1,0,0,0,0.19,465,14,0,7,0,0,0,1,0,0,0,0.19,440,14,0,7,0,0,1,1,0,0,0,0.19,465,14,1,2,1,0,0,1,0,0,0,0.49,315,14,1,2,1,0,1,1,0,0,0,0.44,340,14,1,2,0,0,0,1,0,0,0,0.48,315,14,1,2,0,0,1,1,0,0,0,0.43,340,14,1,3,1,0,0,1,0,0,0,0.37,340,14,1,3,1,0,1,1,0,0,0,0.34,365,14,1,3,0,0,0,1,0,0,0,0.37,340,14,1,3,0,0,1,1,0,0,0,0.34,365,14,1,4,1,0,0,1,0,0,0,0.3,365,14,1,4,1,0,1,1,0,0,0,0.28,390,14,1,4,0,0,0,1,0,0,0,0.3,365,14,1,4,0,0,1,1,0,0,0,0.28,390,14,1,5,1,0,0,1,0,0,0,0.26,390,14,1,5,1,0,1,1,0,0,0,0.24,415,14,1,5,0,0,0,1,0,0,0,0.25,390,14,1,5,0,0,1,1,0,0,0,0.24,415,14,1,6,1,0,0,1,0,0,0,0.22,415,14,1,6,1,0,1,1,0,0,0,0.21,440,14,1,6,0,0,0,1,0,0,0,0.22,415,14,1,6,0,0,1,1,0,0,0,0.21,440,14,1,7,1,0,0,1,0,0,0,0.2,440,14,1,7,1,0,1,1,0,0,0,0.19,465,14,1,7,0,0,0,1,0,0,0,0.19,440,14,1,7,0,0,1,1,0,0,0,0.18,465,14,3,2,1,0,0,1,0,0,0,0.42,315,14,3,2,1,0,1,1,0,0,0,0.38,340,14,3,2,0,0,0,1,0,0,0,0.41,315,14,3,2,0,0,1,1,0,0,0,0.38,340,14,3,3,1,0,0,1,0,0,0,0.3,340,14,3,3,1,0,1,1,0,0,0,0.28,365,14,3,3,0,0,0,1,0,0,0,0.3,340,14,3,3,0,0,1,1,0,0,0,0.28,365,14,3,4,1,0,0,1,0,0,0,0.24,365,14,3,4,1,0,1,1,0,0,0,0.23,390,14,3,4,0,0,0,1,0,0,0,0.23,365,14,3,4,0,0,1,1,0,0,0,0.22,390,14,3,5,1,0,0,1,0,0,0,0.2,390,14,3,5,1,0,1,1,0,0,0,0.19,415,14,3,5,0,0,0,1,0,0,0,0.19,390,14,3,5,0,0,1,1,0,0,0,0.18,415,14,3,6,1,0,0,1,0,0,0,0.17,415,14,3,6,1,0,1,1,0,0,0,0.16,440,14,3,6,0,0,0,1,0,0,0,0.16,415,14,3,6,0,0,1,1,0,0,0,0.16,440,14,3,7,1,0,0,1,0,0,0,0.15,440,14,3,7,1,0,1,1,0,0,0,0.14,465,14,3,7,0,0,0,1,0,0,0,0.14,440,14,3,7,0,0,1,1,0,0,0,0.14,465,15,0,2,1,0,0,1,0,0,1,0.46,333,15,0,2,1,0,1,1,0,0,1,0.41,358,15,0,2,0,0,0,1,0,0,1,0.45,333,15,0,2,0,0,1,1,0,0,1,0.41,358,15,0,3,1,0,0,1,0,0,1,0.36,358,15,0,3,1,0,1,1,0,0,1,0.33,383,15,0,3,0,0,0,1,0,0,1,0.35,358,15,0,3,0,0,1,1,0,0,1,0.33,383,15,0,4,1,0,0,1,0,0,1,0.29,383,15,0,4,1,0,1,1,0,0,1,0.28,408,15,0,4,0,0,0,1,0,0,1,0.29,383,15,0,4,0,0,1,1,0,0,1,0.27,408,15,0,5,1,0,0,1,0,0,1,0.25,408,15,0,5,1,0,1,1,0,0,1,0.24,433,15,0,5,0,0,0,1,0,0,1,0.25,408,15,0,5,0,0,1,1,0,0,1,0.23,433,15,0,6,1,0,0,1,0,0,1,0.22,433,15,0,6,1,0,1,1,0,0,1,0.21,458,15,0,6,0,0,0,1,0,0,1,0.21,433,15,0,6,0,0,1,1,0,0,1,0.2,458,15,0,7,1,0,0,1,0,0,1,0.19,458,15,0,7,1,0,1,1,0,0,1,0.18,483,15,0,7,0,0,0,1,0,0,1,0.19,458,15,0,7,0,0,1,1,0,0,1,0.18,483,15,1,2,1,0,0,1,0,0,1,0.45,333,15,1,2,1,0,1,1,0,0,1,0.41,358,15,1,2,0,0,0,1,0,0,1,0.45,333,15,1,2,0,0,1,1,0,0,1,0.41,358,15,1,3,1,0,0,1,0,0,1,0.35,358,15,1,3,1,0,1,1,0,0,1,0.33,383,15,1,3,0,0,0,1,0,0,1,0.35,358,15,1,3,0,0,1,1,0,0,1,0.32,383,15,1,4,1,0,0,1,0,0,1,0.29,383,15,1,4,1,0,1,1,0,0,1,0.27,408,15,1,4,0,0,0,1,0,0,1,0.28,383,15,1,4,0,0,1,1,0,0,1,0.27,408,15,1,5,1,0,0,1,0,0,1,0.25,408,15,1,5,1,0,1,1,0,0,1,0.23,433,15,1,5,0,0,0,1,0,0,1,0.24,408,15,1,5,0,0,1,1,0,0,1,0.23,433,15,1,6,1,0,0,1,0,0,1,0.21,433,15,1,6,1,0,1,1,0,0,1,0.2,458,15,1,6,0,0,0,1,0,0,1,0.21,433,15,1,6,0,0,1,1,0,0,1,0.2,458,15,1,7,1,0,0,1,0,0,1,0.19,458,15,1,7,1,0,1,1,0,0,1,0.18,483,15,1,7,0,0,0,1,0,0,1,0.19,458,15,1,7,0,0,1,1,0,0,1,0.18,483,15,3,2,1,0,0,1,0,0,1,0.4,333,15,3,2,1,0,1,1,0,0,1,0.36,358,15,3,2,0,0,0,1,0,0,1,0.39,333,15,3,2,0,0,1,1,0,0,1,0.36,358,15,3,3,1,0,0,1,0,0,1,0.29,358,15,3,3,1,0,1,1,0,0,1,0.27,383,15,3,3,0,0,0,1,0,0,1,0.28,358,15,3,3,0,0,1,1,0,0,1,0.27,383,15,3,4,1,0,0,1,0,0,1,0.23,383,15,3,4,1,0,1,1,0,0,1,0.22,408,15,3,4,0,0,0,1,0,0,1,0.22,383,15,3,4,0,0,1,1,0,0,1,0.21,408,15,3,5,1,0,0,1,0,0,1,0.19,408,15,3,5,1,0,1,1,0,0,1,0.18,433,15,3,5,0,0,0,1,0,0,1,0.18,408,15,3,5,0,0,1,1,0,0,1,0.18,433,15,3,6,1,0,0,1,0,0,1,0.16,433,15,3,6,1,0,1,1,0,0,1,0.16,458,15,3,6,0,0,0,1,0,0,1,0.16,433,15,3,6,0,0,1,1,0,0,1,0.15,458,15,3,7,1,0,0,1,0,0,1,0.14,458,15,3,7,1,0,1,1,0,0,1,0.14,483,15,3,7,0,0,0,1,0,0,1,0.14,458,15,3,7,0,0,1,1,0,0,1,0.13,483,16,0,2,1,0,0,1,1,0,0,0.85,315,16,0,2,1,0,1,1,1,0,0,0.84,340,16,0,2,0,0,0,1,1,0,0,0.83,315,16,0,2,0,0,1,1,1,0,0,0.82,340,16,0,3,1,0,0,1,1,0,0,0.56,340,16,0,3,1,0,1,1,1,0,0,0.55,365,16,0,3,0,0,0,1,1,0,0,0.55,340,16,0,3,0,0,1,1,1,0,0,0.54,365,16,0,4,1,0,0,1,1,0,0,0.42,365,16,0,4,1,0,1,1,1,0,0,0.42,390,16,0,4,0,0,0,1,1,0,0,0.41,365,16,0,4,0,0,1,1,1,0,0,0.41,390,16,0,5,1,0,0,1,1,0,0,0.33,390,16,0,5,1,0,1,1,1,0,0,0.33,415,16,0,5,0,0,0,1,1,0,0,0.33,390,16,0,5,0,0,1,1,1,0,0,0.32,415,16,0,6,1,0,0,1,1,0,0,0.28,415,16,0,6,1,0,1,1,1,0,0,0.28,440,16,0,6,0,0,0,1,1,0,0,0.27,415,16,0,6,0,0,1,1,1,0,0,0.27,440,16,0,7,1,0,0,1,1,0,0,0.24,440,16,0,7,1,0,1,1,1,0,0,0.24,465,16,0,7,0,0,0,1,1,0,0,0.23,440,16,0,7,0,0,1,1,1,0,0,0.23,465,16,1,2,1,0,0,1,1,0,0,0.83,315,16,1,2,1,0,1,1,1,0,0,0.82,340,16,1,2,0,0,0,1,1,0,0,0.81,315,16,1,2,0,0,1,1,1,0,0,0.8,340,16,1,3,1,0,0,1,1,0,0,0.55,340,16,1,3,1,0,1,1,1,0,0,0.54,365,16,1,3,0,0,0,1,1,0,0,0.53,340,16,1,3,0,0,1,1,1,0,0,0.53,365,16,1,4,1,0,0,1,1,0,0,0.41,365,16,1,4,1,0,1,1,1,0,0,0.41,390,16,1,4,0,0,0,1,1,0,0,0.4,365,16,1,4,0,0,1,1,1,0,0,0.4,390,16,1,5,1,0,0,1,1,0,0,0.33,390,16,1,5,1,0,1,1,1,0,0,0.33,415,16,1,5,0,0,0,1,1,0,0,0.32,390,16,1,5,0,0,1,1,1,0,0,0.32,415,16,1,6,1,0,0,1,1,0,0,0.27,415,16,1,6,1,0,1,1,1,0,0,0.27,440,16,1,6,0,0,0,1,1,0,0,0.27,415,16,1,6,0,0,1,1,1,0,0,0.26,440,16,1,7,1,0,0,1,1,0,0,0.23,440,16,1,7,1,0,1,1,1,0,0,0.23,465,16,1,7,0,0,0,1,1,0,0,0.23,440,16,1,7,0,0,1,1,1,0,0,0.23,465,16,3,2,1,0,0,1,1,0,0,0.66,315,16,3,2,1,0,1,1,1,0,0,0.65,340,16,3,2,0,0,0,1,1,0,0,0.64,315,16,3,2,0,0,1,1,1,0,0,0.63,340,16,3,3,1,0,0,1,1,0,0,0.41,340,16,3,3,1,0,1,1,1,0,0,0.41,365,16,3,3,0,0,0,1,1,0,0,0.39,340,16,3,3,0,0,1,1,1,0,0,0.39,365,16,3,4,1,0,0,1,1,0,0,0.3,365,16,3,4,1,0,1,1,1,0,0,0.3,390,16,3,4,0,0,0,1,1,0,0,0.29,365,16,3,4,0,0,1,1,1,0,0,0.29,390,16,3,5,1,0,0,1,1,0,0,0.24,390,16,3,5,1,0,1,1,1,0,0,0.23,415,16,3,5,0,0,0,1,1,0,0,0.23,390,16,3,5,0,0,1,1,1,0,0,0.23,415,16,3,6,1,0,0,1,1,0,0,0.2,415,16,3,6,1,0,1,1,1,0,0,0.19,440,16,3,6,0,0,0,1,1,0,0,0.19,415,16,3,6,0,0,1,1,1,0,0,0.19,440,16,3,7,1,0,0,1,1,0,0,0.17,440,16,3,7,1,0,1,1,1,0,0,0.17,465,16,3,7,0,0,0,1,1,0,0,0.16,440,16,3,7,0,0,1,1,1,0,0,0.16,465,17,0,2,1,0,0,1,1,0,1,0.75,333,17,0,2,1,0,1,1,1,0,1,0.74,358,17,0,2,0,0,0,1,1,0,1,0.74,333,17,0,2,0,0,1,1,1,0,1,0.73,358,17,0,3,1,0,0,1,1,0,1,0.52,358,17,0,3,1,0,1,1,1,0,1,0.51,383,17,0,3,0,0,0,1,1,0,1,0.51,358,17,0,3,0,0,1,1,1,0,1,0.5,383,17,0,4,1,0,0,1,1,0,1,0.39,383,17,0,4,1,0,1,1,1,0,1,0.39,408,17,0,4,0,0,0,1,1,0,1,0.38,383,17,0,4,0,0,1,1,1,0,1,0.38,408,17,0,5,1,0,0,1,1,0,1,0.32,408,17,0,5,1,0,1,1,1,0,1,0.32,433,17,0,5,0,0,0,1,1,0,1,0.31,408,17,0,5,0,0,1,1,1,0,1,0.31,433,17,0,6,1,0,0,1,1,0,1,0.27,433,17,0,6,1,0,1,1,1,0,1,0.26,458,17,0,6,0,0,0,1,1,0,1,0.26,433,17,0,6,0,0,1,1,1,0,1,0.26,458,17,0,7,1,0,0,1,1,0,1,0.23,458,17,0,7,1,0,1,1,1,0,1,0.23,483,17,0,7,0,0,0,1,1,0,1,0.22,458,17,0,7,0,0,1,1,1,0,1,0.22,483,17,1,2,1,0,0,1,1,0,1,0.73,333,17,1,2,1,0,1,1,1,0,1,0.73,358,17,1,2,0,0,0,1,1,0,1,0.72,333,17,1,2,0,0,1,1,1,0,1,0.72,358,17,1,3,1,0,0,1,1,0,1,0.5,358,17,1,3,1,0,1,1,1,0,1,0.5,383,17,1,3,0,0,0,1,1,0,1,0.49,358,17,1,3,0,0,1,1,1,0,1,0.49,383,17,1,4,1,0,0,1,1,0,1,0.38,383,17,1,4,1,0,1,1,1,0,1,0.38,408,17,1,4,0,0,0,1,1,0,1,0.38,383,17,1,4,0,0,1,1,1,0,1,0.37,408,17,1,5,1,0,0,1,1,0,1,0.31,408,17,1,5,1,0,1,1,1,0,1,0.31,433,17,1,5,0,0,0,1,1,0,1,0.3,408,17,1,5,0,0,1,1,1,0,1,0.3,433,17,1,6,1,0,0,1,1,0,1,0.26,433,17,1,6,1,0,1,1,1,0,1,0.26,458,17,1,6,0,0,0,1,1,0,1,0.26,433,17,1,6,0,0,1,1,1,0,1,0.25,458,17,1,7,1,0,0,1,1,0,1,0.23,458,17,1,7,1,0,1,1,1,0,1,0.23,483,17,1,7,0,0,0,1,1,0,1,0.22,458,17,1,7,0,0,1,1,1,0,1,0.22,483,17,3,2,1,0,0,1,1,0,1,0.6,333,17,3,2,1,0,1,1,1,0,1,0.59,358,17,3,2,0,0,0,1,1,0,1,0.58,333,17,3,2,0,0,1,1,1,0,1,0.58,358,17,3,3,1,0,0,1,1,0,1,0.39,358,17,3,3,1,0,1,1,1,0,1,0.38,383,17,3,3,0,0,0,1,1,0,1,0.37,358,17,3,3,0,0,1,1,1,0,1,0.37,383,17,3,4,1,0,0,1,1,0,1,0.29,383,17,3,4,1,0,1,1,1,0,1,0.28,408,17,3,4,0,0,0,1,1,0,1,0.27,383,17,3,4,0,0,1,1,1,0,1,0.27,408,17,3,5,1,0,0,1,1,0,1,0.23,408,17,3,5,1,0,1,1,1,0,1,0.23,433,17,3,5,0,0,0,1,1,0,1,0.22,408,17,3,5,0,0,1,1,1,0,1,0.22,433,17,3,6,1,0,0,1,1,0,1,0.19,433,17,3,6,1,0,1,1,1,0,1,0.19,458,17,3,6,0,0,0,1,1,0,1,0.18,433,17,3,6,0,0,1,1,1,0,1,0.18,458,17,3,7,1,0,0,1,1,0,1,0.16,458,17,3,7,1,0,1,1,1,0,1,0.16,483,17,3,7,0,0,0,1,1,0,1,0.16,458,17,3,7,0,0,1,1,1,0,1,0.16,483,18,2,0,1,0,0,0,0,1,0,0.45,257,18,2,0,1,0,1,0,0,1,0,0.41,282,18,2,0,0,0,0,0,0,1,0,0.45,257,18,2,0,0,0,1,0,0,1,0,0.41,282,18,2,1,1,0,0,0,0,1,0,0.45,282,18,2,1,1,0,1,0,0,1,0,0.41,307,18,2,1,0,0,0,0,0,1,0,0.45,282,18,2,1,0,0,1,0,0,1,0,0.41,307,18,2,2,1,0,0,0,0,1,0,0.45,307,18,2,2,1,0,1,0,0,1,0,0.41,332,18,2,2,0,0,0,0,0,1,0,0.45,307,18,2,2,0,0,1,0,0,1,0,0.41,332,18,2,3,1,0,0,0,0,1,0,0.45,332,18,2,3,1,0,1,0,0,1,0,0.41,357,18,2,3,0,0,0,0,0,1,0,0.45,332,18,2,3,0,0,1,0,0,1,0,0.41,357,18,2,4,1,0,0,0,0,1,0,0.45,357,18,2,4,1,0,1,0,0,1,0,0.41,382,18,2,4,0,0,0,0,0,1,0,0.45,357,18,2,4,0,0,1,0,0,1,0,0.41,382,18,2,5,1,0,0,0,0,1,0,0.45,382,18,2,5,1,0,1,0,0,1,0,0.41,407,18,2,5,0,0,0,0,0,1,0,0.45,382,18,2,5,0,0,1,0,0,1,0,0.41,407,18,2,6,1,0,0,0,0,1,0,0.45,407,18,2,6,1,0,1,0,0,1,0,0.41,432,18,2,6,0,0,0,0,0,1,0,0.45,407,18,2,6,0,0,1,0,0,1,0,0.41,432,18,2,7,1,0,0,0,0,1,0,0.45,432,18,2,7,1,0,1,0,0,1,0,0.41,457,18,2,7,0,0,0,0,0,1,0,0.45,432,18,2,7,0,0,1,0,0,1,0,0.41,457,19,2,0,1,0,0,0,0,1,1,0.42,275,19,2,0,1,0,1,0,0,1,1,0.39,300,19,2,0,0,0,0,0,0,1,1,0.42,275,19,2,0,0,0,1,0,0,1,1,0.39,300,19,2,1,1,0,0,0,0,1,1,0.42,300,19,2,1,1,0,1,0,0,1,1,0.39,325,19,2,1,0,0,0,0,0,1,1,0.42,300,19,2,1,0,0,1,0,0,1,1,0.39,325,19,2,2,1,0,0,0,0,1,1,0.42,325,19,2,2,1,0,1,0,0,1,1,0.39,350,19,2,2,0,0,0,0,0,1,1,0.42,325,19,2,2,0,0,1,0,0,1,1,0.39,350,19,2,3,1,0,0,0,0,1,1,0.42,350,19,2,3,1,0,1,0,0,1,1,0.39,375,19,2,3,0,0,0,0,0,1,1,0.42,350,19,2,3,0,0,1,0,0,1,1,0.39,375,19,2,4,1,0,0,0,0,1,1,0.42,375,19,2,4,1,0,1,0,0,1,1,0.39,400,19,2,4,0,0,0,0,0,1,1,0.42,375,19,2,4,0,0,1,0,0,1,1,0.39,400,19,2,5,1,0,0,0,0,1,1,0.42,400,19,2,5,1,0,1,0,0,1,1,0.39,425,19,2,5,0,0,0,0,0,1,1,0.42,400,19,2,5,0,0,1,0,0,1,1,0.39,425,19,2,6,1,0,0,0,0,1,1,0.42,425,19,2,6,1,0,1,0,0,1,1,0.39,450,19,2,6,0,0,0,0,0,1,1,0.42,425,19,2,6,0,0,1,0,0,1,1,0.39,450,19,2,7,1,0,0,0,0,1,1,0.42,450,19,2,7,1,0,1,0,0,1,1,0.39,475,19,2,7,0,0,0,0,0,1,1,0.42,450,19,2,7,0,0,1,0,0,1,1,0.39,475,20,0,0,1,0,0,0,0,1,0,0.38,257,20,0,0,1,0,1,0,0,1,0,0.35,282,20,0,0,0,0,0,0,0,1,0,0.38,257,20,0,0,0,0,1,0,0,1,0,0.35,282,20,0,1,1,0,0,0,0,1,0,0.31,282,20,0,1,1,0,1,0,0,1,0,0.29,307,20,0,1,0,0,0,0,0,1,0,0.3,282,20,0,1,0,0,1,0,0,1,0,0.29,307,20,0,2,1,0,0,0,0,1,0,0.26,307,20,0,2,1,0,1,0,0,1,0,0.25,332,20,0,2,0,0,0,0,0,1,0,0.26,307,20,0,2,0,0,1,0,0,1,0,0.24,332,20,0,3,1,0,0,0,0,1,0,0.22,332,20,0,3,1,0,1,0,0,1,0,0.21,357,20,0,3,0,0,0,0,0,1,0,0.22,332,20,0,3,0,0,1,0,0,1,0,0.21,357,20,0,4,1,0,0,0,0,1,0,0.2,357,20,0,4,1,0,1,0,0,1,0,0.19,382,20,0,4,0,0,0,0,0,1,0,0.19,357,20,0,4,0,0,1,0,0,1,0,0.19,382,20,0,5,1,0,0,0,0,1,0,0.18,382,20,0,5,1,0,1,0,0,1,0,0.17,407,20,0,5,0,0,0,0,0,1,0,0.17,382,20,0,5,0,0,1,0,0,1,0,0.17,407,20,0,6,1,0,0,0,0,1,0,0.16,407,20,0,6,1,0,1,0,0,1,0,0.15,432,20,0,6,0,0,0,0,0,1,0,0.16,407,20,0,6,0,0,1,0,0,1,0,0.15,432,20,0,7,1,0,0,0,0,1,0,0.15,432,20,0,7,1,0,1,0,0,1,0,0.14,457,20,0,7,0,0,0,0,0,1,0,0.14,432,20,0,7,0,0,1,0,0,1,0,0.14,457,20,1,0,1,0,0,0,0,1,0,0.38,257,20,1,0,1,0,1,0,0,1,0,0.35,282,20,1,0,0,0,0,0,0,1,0,0.37,257,20,1,0,0,0,1,0,0,1,0,0.34,282,20,1,1,1,0,0,0,0,1,0,0.3,282,20,1,1,1,0,1,0,0,1,0,0.28,307,20,1,1,0,0,0,0,0,1,0,0.3,282,20,1,1,0,0,1,0,0,1,0,0.28,307,20,1,2,1,0,0,0,0,1,0,0.26,307,20,1,2,1,0,1,0,0,1,0,0.24,332,20,1,2,0,0,0,0,0,1,0,0.25,307,20,1,2,0,0,1,0,0,1,0,0.24,332,20,1,3,1,0,0,0,0,1,0,0.22,332,20,1,3,1,0,1,0,0,1,0,0.21,357,20,1,3,0,0,0,0,0,1,0,0.22,332,20,1,3,0,0,1,0,0,1,0,0.21,357,20,1,4,1,0,0,0,0,1,0,0.2,357,20,1,4,1,0,1,0,0,1,0,0.19,382,20,1,4,0,0,0,0,0,1,0,0.19,357,20,1,4,0,0,1,0,0,1,0,0.18,382,20,1,5,1,0,0,0,0,1,0,0.18,382,20,1,5,1,0,1,0,0,1,0,0.17,407,20,1,5,0,0,0,0,0,1,0,0.17,382,20,1,5,0,0,1,0,0,1,0,0.17,407,20,1,6,1,0,0,0,0,1,0,0.16,407,20,1,6,1,0,1,0,0,1,0,0.15,432,20,1,6,0,0,0,0,0,1,0,0.16,407,20,1,6,0,0,1,0,0,1,0,0.15,432,20,1,7,1,0,0,0,0,1,0,0.15,432,20,1,7,1,0,1,0,0,1,0,0.14,457,20,1,7,0,0,0,0,0,1,0,0.14,432,20,1,7,0,0,1,0,0,1,0,0.14,457,20,3,0,1,0,0,0,0,1,0,0.34,257,20,3,0,1,0,1,0,0,1,0,0.31,282,20,3,0,0,0,0,0,0,1,0,0.33,257,20,3,0,0,0,1,0,0,1,0,0.31,282,20,3,1,1,0,0,0,0,1,0,0.26,282,20,3,1,1,0,1,0,0,1,0,0.24,307,20,3,1,0,0,0,0,0,1,0,0.25,282,20,3,1,0,0,1,0,0,1,0,0.24,307,20,3,2,1,0,0,0,0,1,0,0.21,307,20,3,2,1,0,1,0,0,1,0,0.2,332,20,3,2,0,0,0,0,0,1,0,0.2,307,20,3,2,0,0,1,0,0,1,0,0.19,332,20,3,3,1,0,0,0,0,1,0,0.18,332,20,3,3,1,0,1,0,0,1,0,0.17,357,20,3,3,0,0,0,0,0,1,0,0.17,332,20,3,3,0,0,1,0,0,1,0,0.16,357,20,3,4,1,0,0,0,0,1,0,0.15,357,20,3,4,1,0,1,0,0,1,0,0.15,382,20,3,4,0,0,0,0,0,1,0,0.15,357,20,3,4,0,0,1,0,0,1,0,0.14,382,20,3,5,1,0,0,0,0,1,0,0.13,382,20,3,5,1,0,1,0,0,1,0,0.13,407,20,3,5,0,0,0,0,0,1,0,0.13,382,20,3,5,0,0,1,0,0,1,0,0.13,407,20,3,6,1,0,0,0,0,1,0,0.12,407,20,3,6,1,0,1,0,0,1,0,0.12,432,20,3,6,0,0,0,0,0,1,0,0.12,407,20,3,6,0,0,1,0,0,1,0,0.11,432,20,3,7,1,0,0,0,0,1,0,0.11,432,20,3,7,1,0,1,0,0,1,0,0.11,457,20,3,7,0,0,0,0,0,1,0,0.11,432,20,3,7,0,0,1,0,0,1,0,0.1,457,21,0,0,1,0,0,0,0,1,1,0.36,275,21,0,0,1,0,1,0,0,1,1,0.33,300,21,0,0,0,0,0,0,0,1,1,0.36,275,21,0,0,0,0,1,0,0,1,1,0.33,300,21,0,1,1,0,0,0,0,1,1,0.29,300,21,0,1,1,0,1,0,0,1,1,0.28,325,21,0,1,0,0,0,0,0,1,1,0.29,300,21,0,1,0,0,1,0,0,1,1,0.27,325,21,0,2,1,0,0,0,0,1,1,0.25,325,21,0,2,1,0,1,0,0,1,1,0.24,350,21,0,2,0,0,0,0,0,1,1,0.25,325,21,0,2,0,0,1,0,0,1,1,0.23,350,21,0,3,1,0,0,0,0,1,1,0.22,350,21,0,3,1,0,1,0,0,1,1,0.21,375,21,0,3,0,0,0,0,0,1,1,0.21,350,21,0,3,0,0,1,0,0,1,1,0.2,375,21,0,4,1,0,0,0,0,1,1,0.19,375,21,0,4,1,0,1,0,0,1,1,0.18,400,21,0,4,0,0,0,0,0,1,1,0.19,375,21,0,4,0,0,1,0,0,1,1,0.18,400,21,0,5,1,0,0,0,0,1,1,0.17,400,21,0,5,1,0,1,0,0,1,1,0.17,425,21,0,5,0,0,0,0,0,1,1,0.17,400,21,0,5,0,0,1,0,0,1,1,0.16,425,21,0,6,1,0,0,0,0,1,1,0.16,425,21,0,6,1,0,1,0,0,1,1,0.15,450,21,0,6,0,0,0,0,0,1,1,0.15,425,21,0,6,0,0,1,0,0,1,1,0.15,450,21,0,7,1,0,0,0,0,1,1,0.14,450,21,0,7,1,0,1,0,0,1,1,0.14,475,21,0,7,0,0,0,0,0,1,1,0.14,450,21,0,7,0,0,1,0,0,1,1,0.13,475,21,1,0,1,0,0,0,0,1,1,0.36,275,21,1,0,1,0,1,0,0,1,1,0.33,300,21,1,0,0,0,0,0,0,1,1,0.35,275,21,1,0,0,0,1,0,0,1,1,0.33,300,21,1,1,1,0,0,0,0,1,1,0.29,300,21,1,1,1,0,1,0,0,1,1,0.27,325,21,1,1,0,0,0,0,0,1,1,0.29,300,21,1,1,0,0,1,0,0,1,1,0.27,325,21,1,2,1,0,0,0,0,1,1,0.25,325,21,1,2,1,0,1,0,0,1,1,0.23,350,21,1,2,0,0,0,0,0,1,1,0.24,325,21,1,2,0,0,1,0,0,1,1,0.23,350,21,1,3,1,0,0,0,0,1,1,0.21,350,21,1,3,1,0,1,0,0,1,1,0.2,375,21,1,3,0,0,0,0,0,1,1,0.21,350,21,1,3,0,0,1,0,0,1,1,0.2,375,21,1,4,1,0,0,0,0,1,1,0.19,375,21,1,4,1,0,1,0,0,1,1,0.18,400,21,1,4,0,0,0,0,0,1,1,0.19,375,21,1,4,0,0,1,0,0,1,1,0.18,400,21,1,5,1,0,0,0,0,1,1,0.17,400,21,1,5,1,0,1,0,0,1,1,0.16,425,21,1,5,0,0,0,0,0,1,1,0.17,400,21,1,5,0,0,1,0,0,1,1,0.16,425,21,1,6,1,0,0,0,0,1,1,0.16,425,21,1,6,1,0,1,0,0,1,1,0.15,450,21,1,6,0,0,0,0,0,1,1,0.15,425,21,1,6,0,0,1,0,0,1,1,0.15,450,21,1,7,1,0,0,0,0,1,1,0.14,450,21,1,7,1,0,1,0,0,1,1,0.14,475,21,1,7,0,0,0,0,0,1,1,0.14,450,21,1,7,0,0,1,0,0,1,1,0.14,475,21,3,0,1,0,0,0,0,1,1,0.32,275,21,3,0,1,0,1,0,0,1,1,0.3,300,21,3,0,0,0,0,0,0,1,1,0.32,275,21,3,0,0,0,1,0,0,1,1,0.29,300,21,3,1,1,0,0,0,0,1,1,0.25,300,21,3,1,1,0,1,0,0,1,1,0.23,325,21,3,1,0,0,0,0,0,1,1,0.24,300,21,3,1,0,0,1,0,0,1,1,0.23,325,21,3,2,1,0,0,0,0,1,1,0.2,325,21,3,2,1,0,1,0,0,1,1,0.19,350,21,3,2,0,0,0,0,0,1,1,0.2,325,21,3,2,0,0,1,0,0,1,1,0.19,350,21,3,3,1,0,0,0,0,1,1,0.17,350,21,3,3,1,0,1,0,0,1,1,0.16,375,21,3,3,0,0,0,0,0,1,1,0.17,350,21,3,3,0,0,1,0,0,1,1,0.16,375,21,3,4,1,0,0,0,0,1,1,0.15,375,21,3,4,1,0,1,0,0,1,1,0.14,400,21,3,4,0,0,0,0,0,1,1,0.14,375,21,3,4,0,0,1,0,0,1,1,0.14,400,21,3,5,1,0,0,0,0,1,1,0.13,400,21,3,5,1,0,1,0,0,1,1,0.13,425,21,3,5,0,0,0,0,0,1,1,0.13,400,21,3,5,0,0,1,0,0,1,1,0.12,425,21,3,6,1,0,0,0,0,1,1,0.12,425,21,3,6,1,0,1,0,0,1,1,0.12,450,21,3,6,0,0,0,0,0,1,1,0.11,425,21,3,6,0,0,1,0,0,1,1,0.11,450,21,3,7,1,0,0,0,0,1,1,0.11,450,21,3,7,1,0,1,0,0,1,1,0.11,475,21,3,7,0,0,0,0,0,1,1,0.1,450,21,3,7,0,0,1,0,0,1,1,0.1,475,22,0,2,1,0,0,0,0,1,0,0.36,307,22,0,2,1,0,1,0,0,1,0,0.33,332,22,0,2,0,0,0,0,0,1,0,0.35,307,22,0,2,0,0,1,0,0,1,0,0.33,332,22,0,3,1,0,0,0,0,1,0,0.29,332,22,0,3,1,0,1,0,0,1,0,0.27,357,22,0,3,0,0,0,0,0,1,0,0.29,332,22,0,3,0,0,1,0,0,1,0,0.27,357,22,0,4,1,0,0,0,0,1,0,0.25,357,22,0,4,1,0,1,0,0,1,0,0.24,382,22,0,4,0,0,0,0,0,1,0,0.24,357,22,0,4,0,0,1,0,0,1,0,0.23,382,22,0,5,1,0,0,0,0,1,0,0.22,382,22,0,5,1,0,1,0,0,1,0,0.21,407,22,0,5,0,0,0,0,0,1,0,0.21,382,22,0,5,0,0,1,0,0,1,0,0.2,407,22,0,6,1,0,0,0,0,1,0,0.19,407,22,0,6,1,0,1,0,0,1,0,0.18,432,22,0,6,0,0,0,0,0,1,0,0.19,407,22,0,6,0,0,1,0,0,1,0,0.18,432,22,0,7,1,0,0,0,0,1,0,0.17,432,22,0,7,1,0,1,0,0,1,0,0.16,457,22,0,7,0,0,0,0,0,1,0,0.17,432,22,0,7,0,0,1,0,0,1,0,0.16,457,22,1,2,1,0,0,0,0,1,0,0.35,307,22,1,2,1,0,1,0,0,1,0,0.33,332,22,1,2,0,0,0,0,0,1,0,0.35,307,22,1,2,0,0,1,0,0,1,0,0.32,332,22,1,3,1,0,0,0,0,1,0,0.29,332,22,1,3,1,0,1,0,0,1,0,0.27,357,22,1,3,0,0,0,0,0,1,0,0.29,332,22,1,3,0,0,1,0,0,1,0,0.27,357,22,1,4,1,0,0,0,0,1,0,0.24,357,22,1,4,1,0,1,0,0,1,0,0.23,382,22,1,4,0,0,0,0,0,1,0,0.24,357,22,1,4,0,0,1,0,0,1,0,0.23,382,22,1,5,1,0,0,0,0,1,0,0.21,382,22,1,5,1,0,1,0,0,1,0,0.2,407,22,1,5,0,0,0,0,0,1,0,0.21,382,22,1,5,0,0,1,0,0,1,0,0.2,407,22,1,6,1,0,0,0,0,1,0,0.19,407,22,1,6,1,0,1,0,0,1,0,0.18,432,22,1,6,0,0,0,0,0,1,0,0.19,407,22,1,6,0,0,1,0,0,1,0,0.18,432,22,1,7,1,0,0,0,0,1,0,0.17,432,22,1,7,1,0,1,0,0,1,0,0.16,457,22,1,7,0,0,0,0,0,1,0,0.17,432,22,1,7,0,0,1,0,0,1,0,0.16,457,22,3,2,1,0,0,0,0,1,0,0.32,307,22,3,2,1,0,1,0,0,1,0,0.3,332,22,3,2,0,0,0,0,0,1,0,0.31,307,22,3,2,0,0,1,0,0,1,0,0.29,332,22,3,3,1,0,0,0,0,1,0,0.25,332,22,3,3,1,0,1,0,0,1,0,0.23,357,22,3,3,0,0,0,0,0,1,0,0.24,332,22,3,3,0,0,1,0,0,1,0,0.23,357,22,3,4,1,0,0,0,0,1,0,0.2,357,22,3,4,1,0,1,0,0,1,0,0.19,382,22,3,4,0,0,0,0,0,1,0,0.2,357,22,3,4,0,0,1,0,0,1,0,0.19,382,22,3,5,1,0,0,0,0,1,0,0.17,382,22,3,5,1,0,1,0,0,1,0,0.16,407,22,3,5,0,0,0,0,0,1,0,0.17,382,22,3,5,0,0,1,0,0,1,0,0.16,407,22,3,6,1,0,0,0,0,1,0,0.15,407,22,3,6,1,0,1,0,0,1,0,0.14,432,22,3,6,0,0,0,0,0,1,0,0.14,407,22,3,6,0,0,1,0,0,1,0,0.14,432,22,3,7,1,0,0,0,0,1,0,0.13,432,22,3,7,1,0,1,0,0,1,0,0.13,457,22,3,7,0,0,0,0,0,1,0,0.13,432,22,3,7,0,0,1,0,0,1,0,0.12,457,23,0,2,1,0,0,0,0,1,1,0.34,325,23,0,2,1,0,1,0,0,1,1,0.31,350,23,0,2,0,0,0,0,0,1,1,0.33,325,23,0,2,0,0,1,0,0,1,1,0.31,350,23,0,3,1,0,0,0,0,1,1,0.28,350,23,0,3,1,0,1,0,0,1,1,0.26,375,23,0,3,0,0,0,0,0,1,1,0.28,350,23,0,3,0,0,1,0,0,1,1,0.26,375,23,0,4,1,0,0,0,0,1,1,0.24,375,23,0,4,1,0,1,0,0,1,1,0.23,400,23,0,4,0,0,0,0,0,1,1,0.24,375,23,0,4,0,0,1,0,0,1,1,0.22,400,23,0,5,1,0,0,0,0,1,1,0.21,400,23,0,5,1,0,1,0,0,1,1,0.2,425,23,0,5,0,0,0,0,0,1,1,0.21,400,23,0,5,0,0,1,0,0,1,1,0.2,425,23,0,6,1,0,0,0,0,1,1,0.19,425,23,0,6,1,0,1,0,0,1,1,0.18,450,23,0,6,0,0,0,0,0,1,1,0.18,425,23,0,6,0,0,1,0,0,1,1,0.18,450,23,0,7,1,0,0,0,0,1,1,0.17,450,23,0,7,1,0,1,0,0,1,1,0.16,475,23,0,7,0,0,0,0,0,1,1,0.16,450,23,0,7,0,0,1,0,0,1,1,0.16,475,23,1,2,1,0,0,0,0,1,1,0.33,325,23,1,2,1,0,1,0,0,1,1,0.31,350,23,1,2,0,0,0,0,0,1,1,0.33,325,23,1,2,0,0,1,0,0,1,1,0.31,350,23,1,3,1,0,0,0,0,1,1,0.28,350,23,1,3,1,0,1,0,0,1,1,0.26,375,23,1,3,0,0,0,0,0,1,1,0.27,350,23,1,3,0,0,1,0,0,1,1,0.26,375,23,1,4,1,0,0,0,0,1,1,0.24,375,23,1,4,1,0,1,0,0,1,1,0.22,400,23,1,4,0,0,0,0,0,1,1,0.23,375,23,1,4,0,0,1,0,0,1,1,0.22,400,23,1,5,1,0,0,0,0,1,1,0.21,400,23,1,5,1,0,1,0,0,1,1,0.2,425,23,1,5,0,0,0,0,0,1,1,0.2,400,23,1,5,0,0,1,0,0,1,1,0.19,425,23,1,6,1,0,0,0,0,1,1,0.18,425,23,1,6,1,0,1,0,0,1,1,0.18,450,23,1,6,0,0,0,0,0,1,1,0.18,425,23,1,6,0,0,1,0,0,1,1,0.17,450,23,1,7,1,0,0,0,0,1,1,0.17,450,23,1,7,1,0,1,0,0,1,1,0.16,475,23,1,7,0,0,0,0,0,1,1,0.16,450,23,1,7,0,0,1,0,0,1,1,0.16,475,23,3,2,1,0,0,0,0,1,1,0.3,325,23,3,2,1,0,1,0,0,1,1,0.28,350,23,3,2,0,0,0,0,0,1,1,0.3,325,23,3,2,0,0,1,0,0,1,1,0.28,350,23,3,3,1,0,0,0,0,1,1,0.24,350,23,3,3,1,0,1,0,0,1,1,0.22,375,23,3,3,0,0,0,0,0,1,1,0.23,350,23,3,3,0,0,1,0,0,1,1,0.22,375,23,3,4,1,0,0,0,0,1,1,0.19,375,23,3,4,1,0,1,0,0,1,1,0.19,400,23,3,4,0,0,0,0,0,1,1,0.19,375,23,3,4,0,0,1,0,0,1,1,0.18,400,23,3,5,1,0,0,0,0,1,1,0.17,400,23,3,5,1,0,1,0,0,1,1,0.16,425,23,3,5,0,0,0,0,0,1,1,0.16,400,23,3,5,0,0,1,0,0,1,1,0.16,425,23,3,6,1,0,0,0,0,1,1,0.15,425,23,3,6,1,0,1,0,0,1,1,0.14,450,23,3,6,0,0,0,0,0,1,1,0.14,425,23,3,6,0,0,1,0,0,1,1,0.14,450,23,3,7,1,0,0,0,0,1,1,0.13,450,23,3,7,1,0,1,0,0,1,1,0.13,475,23,3,7,0,0,0,0,0,1,1,0.12,450,23,3,7,0,0,1,0,0,1,1,0.12,475,24,2,0,1,0,0,1,0,1,0,0.74,257,24,2,0,1,0,1,1,0,1,0,0.63,282,24,2,0,0,0,0,1,0,1,0,0.74,257,24,2,0,0,0,1,1,0,1,0,0.63,282,24,2,1,1,0,0,1,0,1,0,0.74,282,24,2,1,1,0,1,1,0,1,0,0.63,307,24,2,1,0,0,0,1,0,1,0,0.74,282,24,2,1,0,0,1,1,0,1,0,0.63,307,24,2,2,1,0,0,1,0,1,0,0.74,307,24,2,2,1,0,1,1,0,1,0,0.63,332,24,2,2,0,0,0,1,0,1,0,0.74,307,24,2,2,0,0,1,1,0,1,0,0.63,332,24,2,3,1,0,0,1,0,1,0,0.74,332,24,2,3,1,0,1,1,0,1,0,0.63,357,24,2,3,0,0,0,1,0,1,0,0.74,332,24,2,3,0,0,1,1,0,1,0,0.63,357,24,2,4,1,0,0,1,0,1,0,0.74,357,24,2,4,1,0,1,1,0,1,0,0.63,382,24,2,4,0,0,0,1,0,1,0,0.74,357,24,2,4,0,0,1,1,0,1,0,0.63,382,24,2,5,1,0,0,1,0,1,0,0.74,382,24,2,5,1,0,1,1,0,1,0,0.63,407,24,2,5,0,0,0,1,0,1,0,0.74,382,24,2,5,0,0,1,1,0,1,0,0.63,407,24,2,6,1,0,0,1,0,1,0,0.74,407,24,2,6,1,0,1,1,0,1,0,0.63,432,24,2,6,0,0,0,1,0,1,0,0.74,407,24,2,6,0,0,1,1,0,1,0,0.63,432,24,2,7,1,0,0,1,0,1,0,0.74,432,24,2,7,1,0,1,1,0,1,0,0.63,457,24,2,7,0,0,0,1,0,1,0,0.74,432,24,2,7,0,0,1,1,0,1,0,0.63,457,25,2,0,1,0,0,1,0,1,1,0.66,275,25,2,0,1,0,1,1,0,1,1,0.58,300,25,2,0,0,0,0,1,0,1,1,0.66,275,25,2,0,0,0,1,1,0,1,1,0.58,300,25,2,1,1,0,0,1,0,1,1,0.66,300,25,2,1,1,0,1,1,0,1,1,0.58,325,25,2,1,0,0,0,1,0,1,1,0.66,300,25,2,1,0,0,1,1,0,1,1,0.58,325,25,2,2,1,0,0,1,0,1,1,0.66,325,25,2,2,1,0,1,1,0,1,1,0.58,350,25,2,2,0,0,0,1,0,1,1,0.66,325,25,2,2,0,0,1,1,0,1,1,0.58,350,25,2,3,1,0,0,1,0,1,1,0.66,350,25,2,3,1,0,1,1,0,1,1,0.58,375,25,2,3,0,0,0,1,0,1,1,0.66,350,25,2,3,0,0,1,1,0,1,1,0.58,375,25,2,4,1,0,0,1,0,1,1,0.66,375,25,2,4,1,0,1,1,0,1,1,0.58,400,25,2,4,0,0,0,1,0,1,1,0.66,375,25,2,4,0,0,1,1,0,1,1,0.58,400,25,2,5,1,0,0,1,0,1,1,0.66,400,25,2,5,1,0,1,1,0,1,1,0.58,425,25,2,5,0,0,0,1,0,1,1,0.66,400,25,2,5,0,0,1,1,0,1,1,0.58,425,25,2,6,1,0,0,1,0,1,1,0.66,425,25,2,6,1,0,1,1,0,1,1,0.58,450,25,2,6,0,0,0,1,0,1,1,0.66,425,25,2,6,0,0,1,1,0,1,1,0.58,450,25,2,7,1,0,0,1,0,1,1,0.66,450,25,2,7,1,0,1,1,0,1,1,0.58,475,25,2,7,0,0,0,1,0,1,1,0.66,450,25,2,7,0,0,1,1,0,1,1,0.58,475,26,2,0,1,0,0,1,1,1,0,1.98,257,26,2,0,1,0,1,1,1,1,0,1.93,282,26,2,0,0,0,0,1,1,1,0,1.98,257,26,2,0,0,0,1,1,1,1,0,1.92,282,26,2,1,1,0,0,1,1,1,0,1.98,282,26,2,1,1,0,1,1,1,1,0,1.92,307,26,2,1,0,0,0,1,1,1,0,1.98,282,26,2,1,0,0,1,1,1,1,0,1.92,307,26,2,2,1,0,0,1,1,1,0,1.98,307,26,2,2,1,0,1,1,1,1,0,1.92,332,26,2,2,0,0,0,1,1,1,0,1.98,307,26,2,2,0,0,1,1,1,1,0,1.92,332,26,2,3,1,0,0,1,1,1,0,1.98,332,26,2,3,1,0,1,1,1,1,0,1.92,357,26,2,3,0,0,0,1,1,1,0,1.98,332,26,2,3,0,0,1,1,1,1,0,1.92,357,26,2,4,1,0,0,1,1,1,0,1.98,357,26,2,4,1,0,1,1,1,1,0,1.92,382,26,2,4,0,0,0,1,1,1,0,1.98,357,26,2,4,0,0,1,1,1,1,0,1.92,382,26,2,5,1,0,0,1,1,1,0,1.98,382,26,2,5,1,0,1,1,1,1,0,1.92,407,26,2,5,0,0,0,1,1,1,0,1.98,382,26,2,5,0,0,1,1,1,1,0,1.92,407,26,2,6,1,0,0,1,1,1,0,1.98,407,26,2,6,1,0,1,1,1,1,0,1.92,432,26,2,6,0,0,0,1,1,1,0,1.98,407,26,2,6,0,0,1,1,1,1,0,1.92,432,26,2,7,1,0,0,1,1,1,0,1.98,432,26,2,7,1,0,1,1,1,1,0,1.92,457,26,2,7,0,0,0,1,1,1,0,1.98,432,26,2,7,0,0,1,1,1,1,0,1.92,457,27,2,0,1,0,0,1,1,1,1,1.53,275,27,2,0,1,0,1,1,1,1,1,1.49,300,27,2,0,0,0,0,1,1,1,1,1.52,275,27,2,0,0,0,1,1,1,1,1,1.49,300,27,2,1,1,0,0,1,1,1,1,1.52,300,27,2,1,1,0,1,1,1,1,1,1.49,325,27,2,1,0,0,0,1,1,1,1,1.52,300,27,2,1,0,0,1,1,1,1,1,1.49,325,27,2,2,1,0,0,1,1,1,1,1.52,325,27,2,2,1,0,1,1,1,1,1,1.49,350,27,2,2,0,0,0,1,1,1,1,1.52,325,27,2,2,0,0,1,1,1,1,1,1.49,350,27,2,3,1,0,0,1,1,1,1,1.52,350,27,2,3,1,0,1,1,1,1,1,1.49,375,27,2,3,0,0,0,1,1,1,1,1.52,350,27,2,3,0,0,1,1,1,1,1,1.49,375,27,2,4,1,0,0,1,1,1,1,1.52,375,27,2,4,1,0,1,1,1,1,1,1.49,400,27,2,4,0,0,0,1,1,1,1,1.52,375,27,2,4,0,0,1,1,1,1,1,1.49,400,27,2,5,1,0,0,1,1,1,1,1.52,400,27,2,5,1,0,1,1,1,1,1,1.49,425,27,2,5,0,0,0,1,1,1,1,1.52,400,27,2,5,0,0,1,1,1,1,1,1.49,425,27,2,6,1,0,0,1,1,1,1,1.52,425,27,2,6,1,0,1,1,1,1,1,1.49,450,27,2,6,0,0,0,1,1,1,1,1.52,425,27,2,6,0,0,1,1,1,1,1,1.49,450,27,2,7,1,0,0,1,1,1,1,1.52,450,27,2,7,1,0,1,1,1,1,1,1.49,475,27,2,7,0,0,0,1,1,1,1,1.52,450,27,2,7,0,0,1,1,1,1,1,1.49,475,28,0,0,1,0,0,1,0,1,0,0.56,257,28,0,0,1,0,1,1,0,1,0,0.5,282,28,0,0,0,0,0,1,0,1,0,0.55,257,28,0,0,0,0,1,1,0,1,0,0.49,282,28,0,1,1,0,0,1,0,1,0,0.42,282,28,0,1,1,0,1,1,0,1,0,0.38,307,28,0,1,0,0,0,1,0,1,0,0.41,282,28,0,1,0,0,1,1,0,1,0,0.38,307,28,0,2,1,0,0,1,0,1,0,0.33,307,28,0,2,1,0,1,1,0,1,0,0.31,332,28,0,2,0,0,0,1,0,1,0,0.33,307,28,0,2,0,0,1,1,0,1,0,0.3,332,28,0,3,1,0,0,1,0,1,0,0.28,332,28,0,3,1,0,1,1,0,1,0,0.26,357,28,0,3,0,0,0,1,0,1,0,0.27,332,28,0,3,0,0,1,1,0,1,0,0.26,357,28,0,4,1,0,0,1,0,1,0,0.24,357,28,0,4,1,0,1,1,0,1,0,0.23,382,28,0,4,0,0,0,1,0,1,0,0.23,357,28,0,4,0,0,1,1,0,1,0,0.22,382,28,0,5,1,0,0,1,0,1,0,0.21,382,28,0,5,1,0,1,1,0,1,0,0.2,407,28,0,5,0,0,0,1,0,1,0,0.2,382,28,0,5,0,0,1,1,0,1,0,0.19,407,28,0,6,1,0,0,1,0,1,0,0.18,407,28,0,6,1,0,1,1,0,1,0,0.18,432,28,0,6,0,0,0,1,0,1,0,0.18,407,28,0,6,0,0,1,1,0,1,0,0.17,432,28,0,7,1,0,0,1,0,1,0,0.17,432,28,0,7,1,0,1,1,0,1,0,0.16,457,28,0,7,0,0,0,1,0,1,0,0.16,432,28,0,7,0,0,1,1,0,1,0,0.16,457,28,1,0,1,0,0,1,0,1,0,0.55,257,28,1,0,1,0,1,1,0,1,0,0.49,282,28,1,0,0,0,0,1,0,1,0,0.55,257,28,1,0,0,0,1,1,0,1,0,0.49,282,28,1,1,1,0,0,1,0,1,0,0.41,282,28,1,1,1,0,1,1,0,1,0,0.38,307,28,1,1,0,0,0,1,0,1,0,0.4,282,28,1,1,0,0,1,1,0,1,0,0.37,307,28,1,2,1,0,0,1,0,1,0,0.33,307,28,1,2,1,0,1,1,0,1,0,0.31,332,28,1,2,0,0,0,1,0,1,0,0.32,307,28,1,2,0,0,1,1,0,1,0,0.3,332,28,1,3,1,0,0,1,0,1,0,0.27,332,28,1,3,1,0,1,1,0,1,0,0.26,357,28,1,3,0,0,0,1,0,1,0,0.27,332,28,1,3,0,0,1,1,0,1,0,0.25,357,28,1,4,1,0,0,1,0,1,0,0.23,357,28,1,4,1,0,1,1,0,1,0,0.22,382,28,1,4,0,0,0,1,0,1,0,0.23,357,28,1,4,0,0,1,1,0,1,0,0.22,382,28,1,5,1,0,0,1,0,1,0,0.21,382,28,1,5,1,0,1,1,0,1,0,0.2,407,28,1,5,0,0,0,1,0,1,0,0.2,382,28,1,5,0,0,1,1,0,1,0,0.19,407,28,1,6,1,0,0,1,0,1,0,0.18,407,28,1,6,1,0,1,1,0,1,0,0.18,432,28,1,6,0,0,0,1,0,1,0,0.18,407,28,1,6,0,0,1,1,0,1,0,0.17,432,28,1,7,1,0,0,1,0,1,0,0.17,432,28,1,7,1,0,1,1,0,1,0,0.16,457,28,1,7,0,0,0,1,0,1,0,0.16,432,28,1,7,0,0,1,1,0,1,0,0.16,457,28,3,0,1,0,0,1,0,1,0,0.47,257,28,3,0,1,0,1,1,0,1,0,0.43,282,28,3,0,0,0,0,1,0,1,0,0.46,257,28,3,0,0,0,1,1,0,1,0,0.42,282,28,3,1,1,0,0,1,0,1,0,0.33,282,28,3,1,1,0,1,1,0,1,0,0.31,307,28,3,1,0,0,0,1,0,1,0,0.32,282,28,3,1,0,0,1,1,0,1,0,0.3,307,28,3,2,1,0,0,1,0,1,0,0.25,307,28,3,2,1,0,1,1,0,1,0,0.24,332,28,3,2,0,0,0,1,0,1,0,0.24,307,28,3,2,0,0,1,1,0,1,0,0.23,332,28,3,3,1,0,0,1,0,1,0,0.21,332,28,3,3,1,0,1,1,0,1,0,0.2,357,28,3,3,0,0,0,1,0,1,0,0.2,332,28,3,3,0,0,1,1,0,1,0,0.19,357,28,3,4,1,0,0,1,0,1,0,0.17,357,28,3,4,1,0,1,1,0,1,0,0.17,382,28,3,4,0,0,0,1,0,1,0,0.17,357,28,3,4,0,0,1,1,0,1,0,0.16,382,28,3,5,1,0,0,1,0,1,0,0.15,382,28,3,5,1,0,1,1,0,1,0,0.15,407,28,3,5,0,0,0,1,0,1,0,0.15,382,28,3,5,0,0,1,1,0,1,0,0.14,407,28,3,6,1,0,0,1,0,1,0,0.13,407,28,3,6,1,0,1,1,0,1,0,0.13,432,28,3,6,0,0,0,1,0,1,0,0.13,407,28,3,6,0,0,1,1,0,1,0,0.13,432,28,3,7,1,0,0,1,0,1,0,0.12,432,28,3,7,1,0,1,1,0,1,0,0.12,457,28,3,7,0,0,0,1,0,1,0,0.12,432,28,3,7,0,0,1,1,0,1,0,0.11,457,29,0,0,1,0,0,1,0,1,1,0.52,275,29,0,0,1,0,1,1,0,1,1,0.46,300,29,0,0,0,0,0,1,0,1,1,0.51,275,29,0,0,0,0,1,1,0,1,1,0.46,300,29,0,1,1,0,0,1,0,1,1,0.39,300,29,0,1,1,0,1,1,0,1,1,0.36,325,29,0,1,0,0,0,1,0,1,1,0.39,300,29,0,1,0,0,1,1,0,1,1,0.36,325,29,0,2,1,0,0,1,0,1,1,0.32,325,29,0,2,1,0,1,1,0,1,1,0.3,350,29,0,2,0,0,0,1,0,1,1,0.31,325,29,0,2,0,0,1,1,0,1,1,0.29,350,29,0,3,1,0,0,1,0,1,1,0.27,350,29,0,3,1,0,1,1,0,1,1,0.25,375,29,0,3,0,0,0,1,0,1,1,0.26,350,29,0,3,0,0,1,1,0,1,1,0.25,375,29,0,4,1,0,0,1,0,1,1,0.23,375,29,0,4,1,0,1,1,0,1,1,0.22,400,29,0,4,0,0,0,1,0,1,1,0.22,375,29,0,4,0,0,1,1,0,1,1,0.21,400,29,0,5,1,0,0,1,0,1,1,0.2,400,29,0,5,1,0,1,1,0,1,1,0.19,425,29,0,5,0,0,0,1,0,1,1,0.2,400,29,0,5,0,0,1,1,0,1,1,0.19,425,29,0,6,1,0,0,1,0,1,1,0.18,425,29,0,6,1,0,1,1,0,1,1,0.17,450,29,0,6,0,0,0,1,0,1,1,0.18,425,29,0,6,0,0,1,1,0,1,1,0.17,450,29,0,7,1,0,0,1,0,1,1,0.16,450,29,0,7,1,0,1,1,0,1,1,0.16,475,29,0,7,0,0,0,1,0,1,1,0.16,450,29,0,7,0,0,1,1,0,1,1,0.15,475,29,1,0,1,0,0,1,0,1,1,0.51,275,29,1,0,1,0,1,1,0,1,1,0.46,300,29,1,0,0,0,0,1,0,1,1,0.5,275,29,1,0,0,0,1,1,0,1,1,0.45,300,29,1,1,1,0,0,1,0,1,1,0.39,300,29,1,1,1,0,1,1,0,1,1,0.36,325,29,1,1,0,0,0,1,0,1,1,0.38,300,29,1,1,0,0,1,1,0,1,1,0.35,325,29,1,2,1,0,0,1,0,1,1,0.31,325,29,1,2,1,0,1,1,0,1,1,0.29,350,29,1,2,0,0,0,1,0,1,1,0.31,325,29,1,2,0,0,1,1,0,1,1,0.29,350,29,1,3,1,0,0,1,0,1,1,0.26,350,29,1,3,1,0,1,1,0,1,1,0.25,375,29,1,3,0,0,0,1,0,1,1,0.26,350,29,1,3,0,0,1,1,0,1,1,0.24,375,29,1,4,1,0,0,1,0,1,1,0.23,375,29,1,4,1,0,1,1,0,1,1,0.22,400,29,1,4,0,0,0,1,0,1,1,0.22,375,29,1,4,0,0,1,1,0,1,1,0.21,400,29,1,5,1,0,0,1,0,1,1,0.2,400,29,1,5,1,0,1,1,0,1,1,0.19,425,29,1,5,0,0,0,1,0,1,1,0.2,400,29,1,5,0,0,1,1,0,1,1,0.19,425,29,1,6,1,0,0,1,0,1,1,0.18,425,29,1,6,1,0,1,1,0,1,1,0.17,450,29,1,6,0,0,0,1,0,1,1,0.17,425,29,1,6,0,0,1,1,0,1,1,0.17,450,29,1,7,1,0,0,1,0,1,1,0.16,450,29,1,7,1,0,1,1,0,1,1,0.16,475,29,1,7,0,0,0,1,0,1,1,0.16,450,29,1,7,0,0,1,1,0,1,1,0.15,475,29,3,0,1,0,0,1,0,1,1,0.44,275,29,3,0,1,0,1,1,0,1,1,0.4,300,29,3,0,0,0,0,1,0,1,1,0.43,275,29,3,0,0,0,1,1,0,1,1,0.39,300,29,3,1,1,0,0,1,0,1,1,0.31,300,29,3,1,1,0,1,1,0,1,1,0.29,325,29,3,1,0,0,0,1,0,1,1,0.3,300,29,3,1,0,0,1,1,0,1,1,0.28,325,29,3,2,1,0,0,1,0,1,1,0.24,325,29,3,2,1,0,1,1,0,1,1,0.23,350,29,3,2,0,0,0,1,0,1,1,0.24,325,29,3,2,0,0,1,1,0,1,1,0.22,350,29,3,3,1,0,0,1,0,1,1,0.2,350,29,3,3,1,0,1,1,0,1,1,0.19,375,29,3,3,0,0,0,1,0,1,1,0.19,350,29,3,3,0,0,1,1,0,1,1,0.19,375,29,3,4,1,0,0,1,0,1,1,0.17,375,29,3,4,1,0,1,1,0,1,1,0.16,400,29,3,4,0,0,0,1,0,1,1,0.16,375,29,3,4,0,0,1,1,0,1,1,0.16,400,29,3,5,1,0,0,1,0,1,1,0.15,400,29,3,5,1,0,1,1,0,1,1,0.14,425,29,3,5,0,0,0,1,0,1,1,0.14,400,29,3,5,0,0,1,1,0,1,1,0.14,425,29,3,6,1,0,0,1,0,1,1,0.13,425,29,3,6,1,0,1,1,0,1,1,0.13,450,29,3,6,0,0,0,1,0,1,1,0.13,425,29,3,6,0,0,1,1,0,1,1,0.12,450,29,3,7,1,0,0,1,0,1,1,0.12,450,29,3,7,1,0,1,1,0,1,1,0.12,475,29,3,7,0,0,0,1,0,1,1,0.11,450,29,3,7,0,0,1,1,0,1,1,0.11,475,30,0,0,1,0,0,1,1,1,0,1.07,257,30,0,0,1,0,1,1,1,1,0,1.06,282,30,0,0,0,0,0,1,1,1,0,1.05,257,30,0,0,0,0,1,1,1,1,0,1.04,282,30,0,1,1,0,0,1,1,1,0,0.65,282,30,0,1,1,0,1,1,1,1,0,0.64,307,30,0,1,0,0,0,1,1,1,0,0.63,282,30,0,1,0,0,1,1,1,1,0,0.63,307,30,0,2,1,0,0,1,1,1,0,0.47,307,30,0,2,1,0,1,1,1,1,0,0.46,332,30,0,2,0,0,0,1,1,1,0,0.45,307,30,0,2,0,0,1,1,1,1,0,0.45,332,30,0,3,1,0,0,1,1,1,0,0.36,332,30,0,3,1,0,1,1,1,1,0,0.36,357,30,0,3,0,0,0,1,1,1,0,0.35,332,30,0,3,0,0,1,1,1,1,0,0.35,357,30,0,4,1,0,0,1,1,1,0,0.3,357,30,0,4,1,0,1,1,1,1,0,0.3,382,30,0,4,0,0,0,1,1,1,0,0.29,357,30,0,4,0,0,1,1,1,1,0,0.29,382,30,0,5,1,0,0,1,1,1,0,0.25,382,30,0,5,1,0,1,1,1,1,0,0.25,407,30,0,5,0,0,0,1,1,1,0,0.25,382,30,0,5,0,0,1,1,1,1,0,0.24,407,30,0,6,1,0,0,1,1,1,0,0.22,407,30,0,6,1,0,1,1,1,1,0,0.22,432,30,0,6,0,0,0,1,1,1,0,0.21,407,30,0,6,0,0,1,1,1,1,0,0.21,432,30,0,7,1,0,0,1,1,1,0,0.19,432,30,0,7,1,0,1,1,1,1,0,0.19,457,30,0,7,0,0,0,1,1,1,0,0.19,432,30,0,7,0,0,1,1,1,1,0,0.19,457,30,1,0,1,0,0,1,1,1,0,1.04,257,30,1,0,1,0,1,1,1,1,0,1.03,282,30,1,0,0,0,0,1,1,1,0,1.02,257,30,1,0,0,0,1,1,1,1,0,1.01,282,30,1,1,1,0,0,1,1,1,0,0.63,282,30,1,1,1,0,1,1,1,1,0,0.63,307,30,1,1,0,0,0,1,1,1,0,0.62,282,30,1,1,0,0,1,1,1,1,0,0.61,307,30,1,2,1,0,0,1,1,1,0,0.45,307,30,1,2,1,0,1,1,1,1,0,0.45,332,30,1,2,0,0,0,1,1,1,0,0.44,307,30,1,2,0,0,1,1,1,1,0,0.44,332,30,1,3,1,0,0,1,1,1,0,0.36,332,30,1,3,1,0,1,1,1,1,0,0.35,357,30,1,3,0,0,0,1,1,1,0,0.35,332,30,1,3,0,0,1,1,1,1,0,0.34,357,30,1,4,1,0,0,1,1,1,0,0.29,357,30,1,4,1,0,1,1,1,1,0,0.29,382,30,1,4,0,0,0,1,1,1,0,0.28,357,30,1,4,0,0,1,1,1,1,0,0.28,382,30,1,5,1,0,0,1,1,1,0,0.25,382,30,1,5,1,0,1,1,1,1,0,0.25,407,30,1,5,0,0,0,1,1,1,0,0.24,382,30,1,5,0,0,1,1,1,1,0,0.24,407,30,1,6,1,0,0,1,1,1,0,0.22,407,30,1,6,1,0,1,1,1,1,0,0.22,432,30,1,6,0,0,0,1,1,1,0,0.21,407,30,1,6,0,0,1,1,1,1,0,0.21,432,30,1,7,1,0,0,1,1,1,0,0.19,432,30,1,7,1,0,1,1,1,1,0,0.19,457,30,1,7,0,0,0,1,1,1,0,0.19,432,30,1,7,0,0,1,1,1,1,0,0.19,457,30,3,0,1,0,0,1,1,1,0,0.79,257,30,3,0,1,0,1,1,1,1,0,0.78,282,30,3,0,0,0,0,1,1,1,0,0.76,257,30,3,0,0,0,1,1,1,1,0,0.75,282,30,3,1,1,0,0,1,1,1,0,0.46,282,30,3,1,1,0,1,1,1,1,0,0.45,307,30,3,1,0,0,0,1,1,1,0,0.44,282,30,3,1,0,0,1,1,1,1,0,0.43,307,30,3,2,1,0,0,1,1,1,0,0.32,307,30,3,2,1,0,1,1,1,1,0,0.32,332,30,3,2,0,0,0,1,1,1,0,0.31,307,30,3,2,0,0,1,1,1,1,0,0.31,332,30,3,3,1,0,0,1,1,1,0,0.25,332,30,3,3,1,0,1,1,1,1,0,0.25,357,30,3,3,0,0,0,1,1,1,0,0.24,332,30,3,3,0,0,1,1,1,1,0,0.24,357,30,3,4,1,0,0,1,1,1,0,0.21,357,30,3,4,1,0,1,1,1,1,0,0.2,382,30,3,4,0,0,0,1,1,1,0,0.2,357,30,3,4,0,0,1,1,1,1,0,0.2,382,30,3,5,1,0,0,1,1,1,0,0.17,382,30,3,5,1,0,1,1,1,1,0,0.17,407,30,3,5,0,0,0,1,1,1,0,0.17,382,30,3,5,0,0,1,1,1,1,0,0.17,407,30,3,6,1,0,0,1,1,1,0,0.15,407,30,3,6,1,0,1,1,1,1,0,0.15,432,30,3,6,0,0,0,1,1,1,0,0.15,407,30,3,6,0,0,1,1,1,1,0,0.15,432,30,3,7,1,0,0,1,1,1,0,0.14,432,30,3,7,1,0,1,1,1,1,0,0.13,457,30,3,7,0,0,0,1,1,1,0,0.13,432,30,3,7,0,0,1,1,1,1,0,0.13,457,31,0,0,1,0,0,1,1,1,1,0.92,275,31,0,0,1,0,1,1,1,1,1,0.91,300,31,0,0,0,0,0,1,1,1,1,0.91,275,31,0,0,0,0,1,1,1,1,1,0.9,300,31,0,1,1,0,0,1,1,1,1,0.59,300,31,0,1,1,0,1,1,1,1,1,0.59,325,31,0,1,0,0,0,1,1,1,1,0.58,300,31,0,1,0,0,1,1,1,1,1,0.57,325,31,0,2,1,0,0,1,1,1,1,0.44,325,31,0,2,1,0,1,1,1,1,1,0.43,350,31,0,2,0,0,0,1,1,1,1,0.43,325,31,0,2,0,0,1,1,1,1,1,0.42,350,31,0,3,1,0,0,1,1,1,1,0.34,350,31,0,3,1,0,1,1,1,1,1,0.34,375,31,0,3,0,0,0,1,1,1,1,0.34,350,31,0,3,0,0,1,1,1,1,1,0.33,375,31,0,4,1,0,0,1,1,1,1,0.28,375,31,0,4,1,0,1,1,1,1,1,0.28,400,31,0,4,0,0,0,1,1,1,1,0.28,375,31,0,4,0,0,1,1,1,1,1,0.28,400,31,0,5,1,0,0,1,1,1,1,0.24,400,31,0,5,1,0,1,1,1,1,1,0.24,425,31,0,5,0,0,0,1,1,1,1,0.24,400,31,0,5,0,0,1,1,1,1,1,0.24,425,31,0,6,1,0,0,1,1,1,1,0.21,425,31,0,6,1,0,1,1,1,1,1,0.21,450,31,0,6,0,0,0,1,1,1,1,0.21,425,31,0,6,0,0,1,1,1,1,1,0.21,450,31,0,7,1,0,0,1,1,1,1,0.19,450,31,0,7,1,0,1,1,1,1,1,0.19,475,31,0,7,0,0,0,1,1,1,1,0.18,450,31,0,7,0,0,1,1,1,1,1,0.18,475,31,1,0,1,0,0,1,1,1,1,0.9,275,31,1,0,1,0,1,1,1,1,1,0.89,300,31,1,0,0,0,0,1,1,1,1,0.88,275,31,1,0,0,0,1,1,1,1,1,0.87,300,31,1,1,1,0,0,1,1,1,1,0.58,300,31,1,1,1,0,1,1,1,1,1,0.57,325,31,1,1,0,0,0,1,1,1,1,0.56,300,31,1,1,0,0,1,1,1,1,1,0.56,325,31,1,2,1,0,0,1,1,1,1,0.43,325,31,1,2,1,0,1,1,1,1,1,0.42,350,31,1,2,0,0,0,1,1,1,1,0.41,325,31,1,2,0,0,1,1,1,1,1,0.41,350,31,1,3,1,0,0,1,1,1,1,0.34,350,31,1,3,1,0,1,1,1,1,1,0.34,375,31,1,3,0,0,0,1,1,1,1,0.33,350,31,1,3,0,0,1,1,1,1,1,0.33,375,31,1,4,1,0,0,1,1,1,1,0.28,375,31,1,4,1,0,1,1,1,1,1,0.28,400,31,1,4,0,0,0,1,1,1,1,0.27,375,31,1,4,0,0,1,1,1,1,1,0.27,400,31,1,5,1,0,0,1,1,1,1,0.24,400,31,1,5,1,0,1,1,1,1,1,0.24,425,31,1,5,0,0,0,1,1,1,1,0.23,400,31,1,5,0,0,1,1,1,1,1,0.23,425,31,1,6,1,0,0,1,1,1,1,0.21,425,31,1,6,1,0,1,1,1,1,1,0.21,450,31,1,6,0,0,0,1,1,1,1,0.2,425,31,1,6,0,0,1,1,1,1,1,0.2,450,31,1,7,1,0,0,1,1,1,1,0.19,450,31,1,7,1,0,1,1,1,1,1,0.19,475,31,1,7,0,0,0,1,1,1,1,0.18,450,31,1,7,0,0,1,1,1,1,1,0.18,475,31,3,0,1,0,0,1,1,1,1,0.7,275,31,3,0,1,0,1,1,1,1,1,0.7,300,31,3,0,0,0,0,1,1,1,1,0.68,275,31,3,0,0,0,1,1,1,1,1,0.67,300,31,3,1,1,0,0,1,1,1,1,0.43,300,31,3,1,1,0,1,1,1,1,1,0.42,325,31,3,1,0,0,0,1,1,1,1,0.41,300,31,3,1,0,0,1,1,1,1,1,0.41,325,31,3,2,1,0,0,1,1,1,1,0.31,325,31,3,2,1,0,1,1,1,1,1,0.31,350,31,3,2,0,0,0,1,1,1,1,0.3,325,31,3,2,0,0,1,1,1,1,1,0.29,350,31,3,3,1,0,0,1,1,1,1,0.24,350,31,3,3,1,0,1,1,1,1,1,0.24,375,31,3,3,0,0,0,1,1,1,1,0.23,350,31,3,3,0,0,1,1,1,1,1,0.23,375,31,3,4,1,0,0,1,1,1,1,0.2,375,31,3,4,1,0,1,1,1,1,1,0.2,400,31,3,4,0,0,0,1,1,1,1,0.19,375,31,3,4,0,0,1,1,1,1,1,0.19,400,31,3,5,1,0,0,1,1,1,1,0.17,400,31,3,5,1,0,1,1,1,1,1,0.17,425,31,3,5,0,0,0,1,1,1,1,0.16,400,31,3,5,0,0,1,1,1,1,1,0.16,425,31,3,6,1,0,0,1,1,1,1,0.15,425,31,3,6,1,0,1,1,1,1,1,0.15,450,31,3,6,0,0,0,1,1,1,1,0.14,425,31,3,6,0,0,1,1,1,1,1,0.14,450,31,3,7,1,0,0,1,1,1,1,0.13,450,31,3,7,1,0,1,1,1,1,1,0.13,475,31,3,7,0,0,0,1,1,1,1,0.13,450,31,3,7,0,0,1,1,1,1,1,0.13,475,32,0,2,1,0,0,1,0,1,0,0.51,307,32,0,2,1,0,1,1,0,1,0,0.46,332,32,0,2,0,0,0,1,0,1,0,0.5,307,32,0,2,0,0,1,1,0,1,0,0.45,332,32,0,3,1,0,0,1,0,1,0,0.39,332,32,0,3,1,0,1,1,0,1,0,0.36,357,32,0,3,0,0,0,1,0,1,0,0.38,332,32,0,3,0,0,1,1,0,1,0,0.35,357,32,0,4,1,0,0,1,0,1,0,0.31,357,32,0,4,1,0,1,1,0,1,0,0.29,382,32,0,4,0,0,0,1,0,1,0,0.31,357,32,0,4,0,0,1,1,0,1,0,0.29,382,32,0,5,1,0,0,1,0,1,0,0.26,382,32,0,5,1,0,1,1,0,1,0,0.25,407,32,0,5,0,0,0,1,0,1,0,0.26,382,32,0,5,0,0,1,1,0,1,0,0.24,407,32,0,6,1,0,0,1,0,1,0,0.23,407,32,0,6,1,0,1,1,0,1,0,0.22,432,32,0,6,0,0,0,1,0,1,0,0.22,407,32,0,6,0,0,1,1,0,1,0,0.21,432,32,0,7,1,0,0,1,0,1,0,0.2,432,32,0,7,1,0,1,1,0,1,0,0.19,457,32,0,7,0,0,0,1,0,1,0,0.2,432,32,0,7,0,0,1,1,0,1,0,0.19,457,32,1,2,1,0,0,1,0,1,0,0.5,307,32,1,2,1,0,1,1,0,1,0,0.45,332,32,1,2,0,0,0,1,0,1,0,0.5,307,32,1,2,0,0,1,1,0,1,0,0.45,332,32,1,3,1,0,0,1,0,1,0,0.38,332,32,1,3,1,0,1,1,0,1,0,0.35,357,32,1,3,0,0,0,1,0,1,0,0.38,332,32,1,3,0,0,1,1,0,1,0,0.35,357,32,1,4,1,0,0,1,0,1,0,0.31,357,32,1,4,1,0,1,1,0,1,0,0.29,382,32,1,4,0,0,0,1,0,1,0,0.3,357,32,1,4,0,0,1,1,0,1,0,0.28,382,32,1,5,1,0,0,1,0,1,0,0.26,382,32,1,5,1,0,1,1,0,1,0,0.25,407,32,1,5,0,0,0,1,0,1,0,0.26,382,32,1,5,0,0,1,1,0,1,0,0.24,407,32,1,6,1,0,0,1,0,1,0,0.23,407,32,1,6,1,0,1,1,0,1,0,0.21,432,32,1,6,0,0,0,1,0,1,0,0.22,407,32,1,6,0,0,1,1,0,1,0,0.21,432,32,1,7,1,0,0,1,0,1,0,0.2,432,32,1,7,1,0,1,1,0,1,0,0.19,457,32,1,7,0,0,0,1,0,1,0,0.19,432,32,1,7,0,0,1,1,0,1,0,0.19,457,32,3,2,1,0,0,1,0,1,0,0.43,307,32,3,2,1,0,1,1,0,1,0,0.4,332,32,3,2,0,0,0,1,0,1,0,0.43,307,32,3,2,0,0,1,1,0,1,0,0.39,332,32,3,3,1,0,0,1,0,1,0,0.31,332,32,3,3,1,0,1,1,0,1,0,0.29,357,32,3,3,0,0,0,1,0,1,0,0.3,332,32,3,3,0,0,1,1,0,1,0,0.28,357,32,3,4,1,0,0,1,0,1,0,0.24,357,32,3,4,1,0,1,1,0,1,0,0.23,382,32,3,4,0,0,0,1,0,1,0,0.23,357,32,3,4,0,0,1,1,0,1,0,0.22,382,32,3,5,1,0,0,1,0,1,0,0.2,382,32,3,5,1,0,1,1,0,1,0,0.19,407,32,3,5,0,0,0,1,0,1,0,0.19,382,32,3,5,0,0,1,1,0,1,0,0.18,407,32,3,6,1,0,0,1,0,1,0,0.17,407,32,3,6,1,0,1,1,0,1,0,0.16,432,32,3,6,0,0,0,1,0,1,0,0.16,407,32,3,6,0,0,1,1,0,1,0,0.16,432,32,3,7,1,0,0,1,0,1,0,0.15,432,32,3,7,1,0,1,1,0,1,0,0.14,457,32,3,7,0,0,0,1,0,1,0,0.14,432,32,3,7,0,0,1,1,0,1,0,0.14,457,33,0,2,1,0,0,1,0,1,1,0.47,325,33,0,2,1,0,1,1,0,1,1,0.43,350,33,0,2,0,0,0,1,0,1,1,0.47,325,33,0,2,0,0,1,1,0,1,1,0.42,350,33,0,3,1,0,0,1,0,1,1,0.37,350,33,0,3,1,0,1,1,0,1,1,0.34,375,33,0,3,0,0,0,1,0,1,1,0.36,350,33,0,3,0,0,1,1,0,1,1,0.33,375,33,0,4,1,0,0,1,0,1,1,0.3,375,33,0,4,1,0,1,1,0,1,1,0.28,400,33,0,4,0,0,0,1,0,1,1,0.3,375,33,0,4,0,0,1,1,0,1,1,0.28,400,33,0,5,1,0,0,1,0,1,1,0.25,400,33,0,5,1,0,1,1,0,1,1,0.24,425,33,0,5,0,0,0,1,0,1,1,0.25,400,33,0,5,0,0,1,1,0,1,1,0.24,425,33,0,6,1,0,0,1,0,1,1,0.22,425,33,0,6,1,0,1,1,0,1,1,0.21,450,33,0,6,0,0,0,1,0,1,1,0.22,425,33,0,6,0,0,1,1,0,1,1,0.21,450,33,0,7,1,0,0,1,0,1,1,0.19,450,33,0,7,1,0,1,1,0,1,1,0.19,475,33,0,7,0,0,0,1,0,1,1,0.19,450,33,0,7,0,0,1,1,0,1,1,0.18,475,33,1,2,1,0,0,1,0,1,1,0.47,325,33,1,2,1,0,1,1,0,1,1,0.42,350,33,1,2,0,0,0,1,0,1,1,0.46,325,33,1,2,0,0,1,1,0,1,1,0.42,350,33,1,3,1,0,0,1,0,1,1,0.36,350,33,1,3,1,0,1,1,0,1,1,0.33,375,33,1,3,0,0,0,1,0,1,1,0.36,350,33,1,3,0,0,1,1,0,1,1,0.33,375,33,1,4,1,0,0,1,0,1,1,0.3,375,33,1,4,1,0,1,1,0,1,1,0.28,400,33,1,4,0,0,0,1,0,1,1,0.29,375,33,1,4,0,0,1,1,0,1,1,0.27,400,33,1,5,1,0,0,1,0,1,1,0.25,400,33,1,5,1,0,1,1,0,1,1,0.24,425,33,1,5,0,0,0,1,0,1,1,0.25,400,33,1,5,0,0,1,1,0,1,1,0.23,425,33,1,6,1,0,0,1,0,1,1,0.22,425,33,1,6,1,0,1,1,0,1,1,0.21,450,33,1,6,0,0,0,1,0,1,1,0.21,425,33,1,6,0,0,1,1,0,1,1,0.2,450,33,1,7,1,0,0,1,0,1,1,0.19,450,33,1,7,1,0,1,1,0,1,1,0.18,475,33,1,7,0,0,0,1,0,1,1,0.19,450,33,1,7,0,0,1,1,0,1,1,0.18,475,33,3,2,1,0,0,1,0,1,1,0.41,325,33,3,2,1,0,1,1,0,1,1,0.37,350,33,3,2,0,0,0,1,0,1,1,0.4,325,33,3,2,0,0,1,1,0,1,1,0.37,350,33,3,3,1,0,0,1,0,1,1,0.3,350,33,3,3,1,0,1,1,0,1,1,0.28,375,33,3,3,0,0,0,1,0,1,1,0.29,350,33,3,3,0,0,1,1,0,1,1,0.27,375,33,3,4,1,0,0,1,0,1,1,0.23,375,33,3,4,1,0,1,1,0,1,1,0.22,400,33,3,4,0,0,0,1,0,1,1,0.23,375,33,3,4,0,0,1,1,0,1,1,0.22,400,33,3,5,1,0,0,1,0,1,1,0.19,400,33,3,5,1,0,1,1,0,1,1,0.19,425,33,3,5,0,0,0,1,0,1,1,0.19,400,33,3,5,0,0,1,1,0,1,1,0.18,425,33,3,6,1,0,0,1,0,1,1,0.17,425,33,3,6,1,0,1,1,0,1,1,0.16,450,33,3,6,0,0,0,1,0,1,1,0.16,425,33,3,6,0,0,1,1,0,1,1,0.15,450,33,3,7,1,0,0,1,0,1,1,0.14,450,33,3,7,1,0,1,1,0,1,1,0.14,475,33,3,7,0,0,0,1,0,1,1,0.14,450,33,3,7,0,0,1,1,0,1,1,0.14,475,34,0,2,1,0,0,1,1,1,0,0.9,307,34,0,2,1,0,1,1,1,1,0,0.89,332,34,0,2,0,0,0,1,1,1,0,0.88,307,34,0,2,0,0,1,1,1,1,0,0.87,332,34,0,3,1,0,0,1,1,1,0,0.58,332,34,0,3,1,0,1,1,1,1,0,0.58,357,34,0,3,0,0,0,1,1,1,0,0.57,332,34,0,3,0,0,1,1,1,1,0,0.57,357,34,0,4,1,0,0,1,1,1,0,0.43,357,34,0,4,1,0,1,1,1,1,0,0.43,382,34,0,4,0,0,0,1,1,1,0,0.42,357,34,0,4,0,0,1,1,1,1,0,0.42,382,34,0,5,1,0,0,1,1,1,0,0.34,382,34,0,5,1,0,1,1,1,1,0,0.34,407,34,0,5,0,0,0,1,1,1,0,0.33,382,34,0,5,0,0,1,1,1,1,0,0.33,407,34,0,6,1,0,0,1,1,1,0,0.28,407,34,0,6,1,0,1,1,1,1,0,0.28,432,34,0,6,0,0,0,1,1,1,0,0.28,407,34,0,6,0,0,1,1,1,1,0,0.27,432,34,0,7,1,0,0,1,1,1,0,0.24,432,34,0,7,1,0,1,1,1,1,0,0.24,457,34,0,7,0,0,0,1,1,1,0,0.24,432,34,0,7,0,0,1,1,1,1,0,0.23,457,34,1,2,1,0,0,1,1,1,0,0.88,307,34,1,2,1,0,1,1,1,1,0,0.87,332,34,1,2,0,0,0,1,1,1,0,0.86,307,34,1,2,0,0,1,1,1,1,0,0.85,332,34,1,3,1,0,0,1,1,1,0,0.57,332,34,1,3,1,0,1,1,1,1,0,0.56,357,34,1,3,0,0,0,1,1,1,0,0.55,332,34,1,3,0,0,1,1,1,1,0,0.55,357,34,1,4,1,0,0,1,1,1,0,0.42,357,34,1,4,1,0,1,1,1,1,0,0.42,382,34,1,4,0,0,0,1,1,1,0,0.41,357,34,1,4,0,0,1,1,1,1,0,0.41,382,34,1,5,1,0,0,1,1,1,0,0.33,382,34,1,5,1,0,1,1,1,1,0,0.33,407,34,1,5,0,0,0,1,1,1,0,0.33,382,34,1,5,0,0,1,1,1,1,0,0.32,407,34,1,6,1,0,0,1,1,1,0,0.28,407,34,1,6,1,0,1,1,1,1,0,0.28,432,34,1,6,0,0,0,1,1,1,0,0.27,407,34,1,6,0,0,1,1,1,1,0,0.27,432,34,1,7,1,0,0,1,1,1,0,0.24,432,34,1,7,1,0,1,1,1,1,0,0.24,457,34,1,7,0,0,0,1,1,1,0,0.23,432,34,1,7,0,0,1,1,1,1,0,0.23,457,34,3,2,1,0,0,1,1,1,0,0.69,307,34,3,2,1,0,1,1,1,1,0,0.68,332,34,3,2,0,0,0,1,1,1,0,0.67,307,34,3,2,0,0,1,1,1,1,0,0.66,332,34,3,3,1,0,0,1,1,1,0,0.42,332,34,3,3,1,0,1,1,1,1,0,0.42,357,34,3,3,0,0,0,1,1,1,0,0.41,332,34,3,3,0,0,1,1,1,1,0,0.4,357,34,3,4,1,0,0,1,1,1,0,0.3,357,34,3,4,1,0,1,1,1,1,0,0.3,382,34,3,4,0,0,0,1,1,1,0,0.29,357,34,3,4,0,0,1,1,1,1,0,0.29,382,34,3,5,1,0,0,1,1,1,0,0.24,382,34,3,5,1,0,1,1,1,1,0,0.24,407,34,3,5,0,0,0,1,1,1,0,0.23,382,34,3,5,0,0,1,1,1,1,0,0.23,407,34,3,6,1,0,0,1,1,1,0,0.2,407,34,3,6,1,0,1,1,1,1,0,0.2,432,34,3,6,0,0,0,1,1,1,0,0.19,407,34,3,6,0,0,1,1,1,1,0,0.19,432,34,3,7,1,0,0,1,1,1,0,0.17,432,34,3,7,1,0,1,1,1,1,0,0.17,457,34,3,7,0,0,0,1,1,1,0,0.16,432,34,3,7,0,0,1,1,1,1,0,0.16,457,35,0,2,1,0,0,1,1,1,1,0.79,325,35,0,2,1,0,1,1,1,1,1,0.78,350,35,0,2,0,0,0,1,1,1,1,0.78,325,35,0,2,0,0,1,1,1,1,1,0.77,350,35,0,3,1,0,0,1,1,1,1,0.53,350,35,0,3,1,0,1,1,1,1,1,0.53,375,35,0,3,0,0,0,1,1,1,1,0.52,350,35,0,3,0,0,1,1,1,1,1,0.52,375,35,0,4,1,0,0,1,1,1,1,0.4,375,35,0,4,1,0,1,1,1,1,1,0.4,400,35,0,4,0,0,0,1,1,1,1,0.39,375,35,0,4,0,0,1,1,1,1,1,0.39,400,35,0,5,1,0,0,1,1,1,1,0.32,400,35,0,5,1,0,1,1,1,1,1,0.32,425,35,0,5,0,0,0,1,1,1,1,0.32,400,35,0,5,0,0,1,1,1,1,1,0.32,425,35,0,6,1,0,0,1,1,1,1,0.27,425,35,0,6,1,0,1,1,1,1,1,0.27,450,35,0,6,0,0,0,1,1,1,1,0.26,425,35,0,6,0,0,1,1,1,1,1,0.26,450,35,0,7,1,0,0,1,1,1,1,0.23,450,35,0,7,1,0,1,1,1,1,1,0.23,475,35,0,7,0,0,0,1,1,1,1,0.23,450,35,0,7,0,0,1,1,1,1,1,0.23,475,35,1,2,1,0,0,1,1,1,1,0.77,325,35,1,2,1,0,1,1,1,1,1,0.77,350,35,1,2,0,0,0,1,1,1,1,0.76,325,35,1,2,0,0,1,1,1,1,1,0.75,350,35,1,3,1,0,0,1,1,1,1,0.52,350,35,1,3,1,0,1,1,1,1,1,0.52,375,35,1,3,0,0,0,1,1,1,1,0.51,350,35,1,3,0,0,1,1,1,1,1,0.51,375,35,1,4,1,0,0,1,1,1,1,0.39,375,35,1,4,1,0,1,1,1,1,1,0.39,400,35,1,4,0,0,0,1,1,1,1,0.39,375,35,1,4,0,0,1,1,1,1,1,0.38,400,35,1,5,1,0,0,1,1,1,1,0.32,400,35,1,5,1,0,1,1,1,1,1,0.32,425,35,1,5,0,0,0,1,1,1,1,0.31,400,35,1,5,0,0,1,1,1,1,1,0.31,425,35,1,6,1,0,0,1,1,1,1,0.27,425,35,1,6,1,0,1,1,1,1,1,0.27,450,35,1,6,0,0,0,1,1,1,1,0.26,425,35,1,6,0,0,1,1,1,1,1,0.26,450,35,1,7,1,0,0,1,1,1,1,0.23,450,35,1,7,1,0,1,1,1,1,1,0.23,475,35,1,7,0,0,0,1,1,1,1,0.22,450,35,1,7,0,0,1,1,1,1,1,0.22,475,35,3,2,1,0,0,1,1,1,1,0.62,325,35,3,2,1,0,1,1,1,1,1,0.62,350,35,3,2,0,0,0,1,1,1,1,0.61,325,35,3,2,0,0,1,1,1,1,1,0.6,350,35,3,3,1,0,0,1,1,1,1,0.4,350,35,3,3,1,0,1,1,1,1,1,0.39,375,35,3,3,0,0,0,1,1,1,1,0.38,350,35,3,3,0,0,1,1,1,1,1,0.38,375,35,3,4,1,0,0,1,1,1,1,0.29,375,35,3,4,1,0,1,1,1,1,1,0.29,400,35,3,4,0,0,0,1,1,1,1,0.28,375,35,3,4,0,0,1,1,1,1,1,0.28,400,35,3,5,1,0,0,1,1,1,1,0.23,400,35,3,5,1,0,1,1,1,1,1,0.23,425,35,3,5,0,0,0,1,1,1,1,0.22,400,35,3,5,0,0,1,1,1,1,1,0.22,425,35,3,6,1,0,0,1,1,1,1,0.19,425,35,3,6,1,0,1,1,1,1,1,0.19,450,35,3,6,0,0,0,1,1,1,1,0.18,425,35,3,6,0,0,1,1,1,1,1,0.18,450,35,3,7,1,0,0,1,1,1,1,0.17,450,35,3,7,1,0,1,1,1,1,1,0.16,475,35,3,7,0,0,0,1,1,1,1,0.16,450,35,3,7,0,0,1,1,1,1,1,0.16,475],\"corrections\":[],\"width\":12},{\"id\":\"2-31\",\"element\":\"wall\",\"title\":\"Block/block cavity, 125 mm outer leaf\",\"dims\":[{\"key\":\"cavity_depth_mm\",\"label\":\"Cavity\",\"values\":[25,50,75,100,125,150,175,200]},{\"key\":\"wall_ties\",\"label\":\"Wall ties\",\"values\":[\"insulated\",\"metal\"]},{\"key\":\"outer_leaf_mm\",\"label\":\"Outer leaf\",\"values\":[125]},{\"key\":\"inner_leaf_mm\",\"label\":\"Inner leaf\",\"values\":[100,125]},{\"key\":\"outer_leaf_material\",\"label\":\"Outer leaf block\",\"values\":[\"HP block\",\"dense concrete block\"]},{\"key\":\"inner_leaf_material\",\"label\":\"Inner leaf block\",\"values\":[\"HP block\",\"dense concrete block\"]},{\"key\":\"external_finish\",\"label\":\"Outside\",\"values\":[\"12 mm timber or tile, 15 mm cavity (ventilated)\",\"19 mm external render (cement, sand)\"]},{\"key\":\"internal_finish\",\"label\":\"Inside\",\"values\":[\"13 mm plaster\",\"15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"]}],\"descriptions\":[\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), HP block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"12 mm timber or tile, 15 mm cavity (ventilated), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), HP block, cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), HP block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), HP block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), HP block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), HP block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), HP block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, full\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), HP block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 13 mm plaster\",\"19 mm external render (cement, sand), dense concrete block, partial\\u2013fill cavity (wall ties), dense concrete block, 15 mm cavity (dabs - 20%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (batts)\",\"open cavity\",\"polyurethane foam\"],\"rows\":[0,2,0,1,0,0,0,0,0,0,0.4,290,0,2,0,1,0,1,0,0,0,0,0.37,315,0,2,0,0,0,0,0,0,0,0,0.4,290,0,2,0,0,0,1,0,0,0,0,0.37,315,0,2,1,1,0,0,0,0,0,0,0.4,315,0,2,1,1,0,1,0,0,0,0,0.37,340,0,2,1,0,0,0,0,0,0,0,0.4,315,0,2,1,0,0,1,0,0,0,0,0.37,340,0,2,2,1,0,0,0,0,0,0,0.4,340,0,2,2,1,0,1,0,0,0,0,0.37,365,0,2,2,0,0,0,0,0,0,0,0.4,340,0,2,2,0,0,1,0,0,0,0,0.37,365,0,2,3,1,0,0,0,0,0,0,0.4,365,0,2,3,1,0,1,0,0,0,0,0.37,390,0,2,3,0,0,0,0,0,0,0,0.4,365,0,2,3,0,0,1,0,0,0,0,0.37,390,0,2,4,1,0,0,0,0,0,0,0.4,390,0,2,4,1,0,1,0,0,0,0,0.37,415,0,2,4,0,0,0,0,0,0,0,0.4,390,0,2,4,0,0,1,0,0,0,0,0.37,415,0,2,5,1,0,0,0,0,0,0,0.4,415,0,2,5,1,0,1,0,0,0,0,0.37,440,0,2,5,0,0,0,0,0,0,0,0.4,415,0,2,5,0,0,1,0,0,0,0,0.37,440,0,2,6,1,0,0,0,0,0,0,0.4,440,0,2,6,1,0,1,0,0,0,0,0.37,465,0,2,6,0,0,0,0,0,0,0,0.4,440,0,2,6,0,0,1,0,0,0,0,0.37,465,0,2,7,1,0,0,0,0,0,0,0.4,465,0,2,7,1,0,1,0,0,0,0,0.37,490,0,2,7,0,0,0,0,0,0,0,0.4,465,0,2,7,0,0,1,0,0,0,0,0.37,490,1,2,0,1,0,0,0,0,0,1,0.38,308,1,2,0,1,0,1,0,0,0,1,0.35,333,1,2,0,0,0,0,0,0,0,1,0.38,308,1,2,0,0,0,1,0,0,0,1,0.35,333,1,2,1,1,0,0,0,0,0,1,0.38,333,1,2,1,1,0,1,0,0,0,1,0.35,358,1,2,1,0,0,0,0,0,0,1,0.38,333,1,2,1,0,0,1,0,0,0,1,0.35,358,1,2,2,1,0,0,0,0,0,1,0.38,358,1,2,2,1,0,1,0,0,0,1,0.35,383,1,2,2,0,0,0,0,0,0,1,0.38,358,1,2,2,0,0,1,0,0,0,1,0.35,383,1,2,3,1,0,0,0,0,0,1,0.38,383,1,2,3,1,0,1,0,0,0,1,0.35,408,1,2,3,0,0,0,0,0,0,1,0.38,383,1,2,3,0,0,1,0,0,0,1,0.35,408,1,2,4,1,0,0,0,0,0,1,0.38,408,1,2,4,1,0,1,0,0,0,1,0.35,433,1,2,4,0,0,0,0,0,0,1,0.38,408,1,2,4,0,0,1,0,0,0,1,0.35,433,1,2,5,1,0,0,0,0,0,1,0.38,433,1,2,5,1,0,1,0,0,0,1,0.35,458,1,2,5,0,0,0,0,0,0,1,0.38,433,1,2,5,0,0,1,0,0,0,1,0.35,458,1,2,6,1,0,0,0,0,0,1,0.38,458,1,2,6,1,0,1,0,0,0,1,0.35,483,1,2,6,0,0,0,0,0,0,1,0.38,458,1,2,6,0,0,1,0,0,0,1,0.35,483,1,2,7,1,0,0,0,0,0,1,0.38,483,1,2,7,1,0,1,0,0,0,1,0.35,508,1,2,7,0,0,0,0,0,0,1,0.38,483,1,2,7,0,0,1,0,0,0,1,0.35,508,2,0,0,1,0,0,0,0,0,0,0.34,290,2,0,0,1,0,1,0,0,0,0,0.32,315,2,0,0,0,0,0,0,0,0,0,0.34,290,2,0,0,0,0,1,0,0,0,0,0.31,315,2,0,1,1,0,0,0,0,0,0,0.28,315,2,0,1,1,0,1,0,0,0,0,0.27,340,2,0,1,0,0,0,0,0,0,0,0.28,315,2,0,1,0,0,1,0,0,0,0,0.26,340,2,0,2,1,0,0,0,0,0,0,0.24,340,2,0,2,1,0,1,0,0,0,0,0.23,365,2,0,2,0,0,0,0,0,0,0,0.24,340,2,0,2,0,0,1,0,0,0,0,0.23,365,2,0,3,1,0,0,0,0,0,0,0.21,365,2,0,3,1,0,1,0,0,0,0,0.2,390,2,0,3,0,0,0,0,0,0,0,0.21,365,2,0,3,0,0,1,0,0,0,0,0.2,390,2,0,4,1,0,0,0,0,0,0,0.19,390,2,0,4,1,0,1,0,0,0,0,0.18,415,2,0,4,0,0,0,0,0,0,0,0.18,390,2,0,4,0,0,1,0,0,0,0,0.18,415,2,0,5,1,0,0,0,0,0,0,0.17,415,2,0,5,1,0,1,0,0,0,0,0.16,440,2,0,5,0,0,0,0,0,0,0,0.16,415,2,0,5,0,0,1,0,0,0,0,0.16,440,2,0,6,1,0,0,0,0,0,0,0.15,440,2,0,6,1,0,1,0,0,0,0,0.15,465,2,0,6,0,0,0,0,0,0,0,0.15,440,2,0,6,0,0,1,0,0,0,0,0.14,465,2,0,7,1,0,0,0,0,0,0,0.14,465,2,0,7,1,0,1,0,0,0,0,0.14,490,2,0,7,0,0,0,0,0,0,0,0.14,465,2,0,7,0,0,1,0,0,0,0,0.13,490,2,1,0,1,0,0,0,0,0,0,0.34,290,2,1,0,1,0,1,0,0,0,0,0.31,315,2,1,0,0,0,0,0,0,0,0,0.34,290,2,1,0,0,0,1,0,0,0,0,0.31,315,2,1,1,1,0,0,0,0,0,0,0.28,315,2,1,1,1,0,1,0,0,0,0,0.26,340,2,1,1,0,0,0,0,0,0,0,0.28,315,2,1,1,0,0,1,0,0,0,0,0.26,340,2,1,2,1,0,0,0,0,0,0,0.24,340,2,1,2,1,0,1,0,0,0,0,0.23,365,2,1,2,0,0,0,0,0,0,0,0.23,340,2,1,2,0,0,1,0,0,0,0,0.22,365,2,1,3,1,0,0,0,0,0,0,0.21,365,2,1,3,1,0,1,0,0,0,0,0.2,390,2,1,3,0,0,0,0,0,0,0,0.2,365,2,1,3,0,0,1,0,0,0,0,0.2,390,2,1,4,1,0,0,0,0,0,0,0.18,390,2,1,4,1,0,1,0,0,0,0,0.18,415,2,1,4,0,0,0,0,0,0,0,0.18,390,2,1,4,0,0,1,0,0,0,0,0.17,415,2,1,5,1,0,0,0,0,0,0,0.17,415,2,1,5,1,0,1,0,0,0,0,0.16,440,2,1,5,0,0,0,0,0,0,0,0.16,415,2,1,5,0,0,1,0,0,0,0,0.16,440,2,1,6,1,0,0,0,0,0,0,0.15,440,2,1,6,1,0,1,0,0,0,0,0.15,465,2,1,6,0,0,0,0,0,0,0,0.15,440,2,1,6,0,0,1,0,0,0,0,0.14,465,2,1,7,1,0,0,0,0,0,0,0.14,465,2,1,7,1,0,1,0,0,0,0,0.14,490,2,1,7,0,0,0,0,0,0,0,0.14,465,2,1,7,0,0,1,0,0,0,0,0.13,490,2,3,0,1,0,0,0,0,0,0,0.31,290,2,3,0,1,0,1,0,0,0,0,0.29,315,2,3,0,0,0,0,0,0,0,0,0.3,290,2,3,0,0,0,1,0,0,0,0,0.28,315,2,3,1,1,0,0,0,0,0,0,0.24,315,2,3,1,1,0,1,0,0,0,0,0.23,340,2,3,1,0,0,0,0,0,0,0,0.23,315,2,3,1,0,0,1,0,0,0,0,0.22,340,2,3,2,1,0,0,0,0,0,0,0.2,340,2,3,2,1,0,1,0,0,0,0,0.19,365,2,3,2,0,0,0,0,0,0,0,0.19,340,2,3,2,0,0,1,0,0,0,0,0.18,365,2,3,3,1,0,0,0,0,0,0,0.17,365,2,3,3,1,0,1,0,0,0,0,0.16,390,2,3,3,0,0,0,0,0,0,0,0.16,365,2,3,3,0,0,1,0,0,0,0,0.16,390,2,3,4,1,0,0,0,0,0,0,0.15,390,2,3,4,1,0,1,0,0,0,0,0.14,415,2,3,4,0,0,0,0,0,0,0,0.14,390,2,3,4,0,0,1,0,0,0,0,0.14,415,2,3,5,1,0,0,0,0,0,0,0.13,415,2,3,5,1,0,1,0,0,0,0,0.13,440,2,3,5,0,0,0,0,0,0,0,0.13,415,2,3,5,0,0,1,0,0,0,0,0.12,440,2,3,6,1,0,0,0,0,0,0,0.12,440,2,3,6,1,0,1,0,0,0,0,0.11,465,2,3,6,0,0,0,0,0,0,0,0.11,440,2,3,6,0,0,1,0,0,0,0,0.11,465,2,3,7,1,0,0,0,0,0,0,0.11,465,2,3,7,1,0,1,0,0,0,0,0.1,490,2,3,7,0,0,0,0,0,0,0,0.1,465,2,3,7,0,0,1,0,0,0,0,0.1,490,3,0,0,1,0,0,0,0,0,1,0.32,308,3,0,0,1,0,1,0,0,0,1,0.3,333,3,0,0,0,0,0,0,0,0,1,0.32,308,3,0,0,0,0,1,0,0,0,1,0.3,333,3,0,1,1,0,0,0,0,0,1,0.27,333,3,0,1,1,0,1,0,0,0,1,0.26,358,3,0,1,0,0,0,0,0,0,1,0.27,333,3,0,1,0,0,1,0,0,0,1,0.25,358,3,0,2,1,0,0,0,0,0,1,0.23,358,3,0,2,1,0,1,0,0,0,1,0.22,383,3,0,2,0,0,0,0,0,0,1,0.23,358,3,0,2,0,0,1,0,0,0,1,0.22,383,3,0,3,1,0,0,0,0,0,1,0.2,383,3,0,3,1,0,1,0,0,0,1,0.19,408,3,0,3,0,0,0,0,0,0,1,0.2,383,3,0,3,0,0,1,0,0,0,1,0.19,408,3,0,4,1,0,0,0,0,0,1,0.18,408,3,0,4,1,0,1,0,0,0,1,0.17,433,3,0,4,0,0,0,0,0,0,1,0.18,408,3,0,4,0,0,1,0,0,0,1,0.17,433,3,0,5,1,0,0,0,0,0,1,0.16,433,3,0,5,1,0,1,0,0,0,1,0.16,458,3,0,5,0,0,0,0,0,0,1,0.16,433,3,0,5,0,0,1,0,0,0,1,0.15,458,3,0,6,1,0,0,0,0,0,1,0.15,458,3,0,6,1,0,1,0,0,0,1,0.14,483,3,0,6,0,0,0,0,0,0,1,0.15,458,3,0,6,0,0,1,0,0,0,1,0.14,483,3,0,7,1,0,0,0,0,0,1,0.14,483,3,0,7,1,0,1,0,0,0,1,0.13,508,3,0,7,0,0,0,0,0,0,1,0.13,483,3,0,7,0,0,1,0,0,0,1,0.13,508,3,1,0,1,0,0,0,0,0,1,0.32,308,3,1,0,1,0,1,0,0,0,1,0.3,333,3,1,0,0,0,0,0,0,0,1,0.32,308,3,1,0,0,0,1,0,0,0,1,0.3,333,3,1,1,1,0,0,0,0,0,1,0.27,333,3,1,1,1,0,1,0,0,0,1,0.25,358,3,1,1,0,0,0,0,0,0,1,0.26,333,3,1,1,0,0,1,0,0,0,1,0.25,358,3,1,2,1,0,0,0,0,0,1,0.23,358,3,1,2,1,0,1,0,0,0,1,0.22,383,3,1,2,0,0,0,0,0,0,1,0.23,358,3,1,2,0,0,1,0,0,0,1,0.22,383,3,1,3,1,0,0,0,0,0,1,0.2,383,3,1,3,1,0,1,0,0,0,1,0.19,408,3,1,3,0,0,0,0,0,0,1,0.2,383,3,1,3,0,0,1,0,0,0,1,0.19,408,3,1,4,1,0,0,0,0,0,1,0.18,408,3,1,4,1,0,1,0,0,0,1,0.17,433,3,1,4,0,0,0,0,0,0,1,0.18,408,3,1,4,0,0,1,0,0,0,1,0.17,433,3,1,5,1,0,0,0,0,0,1,0.16,433,3,1,5,1,0,1,0,0,0,1,0.16,458,3,1,5,0,0,0,0,0,0,1,0.16,433,3,1,5,0,0,1,0,0,0,1,0.15,458,3,1,6,1,0,0,0,0,0,1,0.15,458,3,1,6,1,0,1,0,0,0,1,0.14,483,3,1,6,0,0,0,0,0,0,1,0.15,458,3,1,6,0,0,1,0,0,0,1,0.14,483,3,1,7,1,0,0,0,0,0,1,0.14,483,3,1,7,1,0,1,0,0,0,1,0.13,508,3,1,7,0,0,0,0,0,0,1,0.13,483,3,1,7,0,0,1,0,0,0,1,0.13,508,3,3,0,1,0,0,0,0,0,1,0.29,308,3,3,0,1,0,1,0,0,0,1,0.27,333,3,3,0,0,0,0,0,0,0,1,0.29,308,3,3,0,0,0,1,0,0,0,1,0.27,333,3,3,1,1,0,0,0,0,0,1,0.23,333,3,3,1,1,0,1,0,0,0,1,0.22,358,3,3,1,0,0,0,0,0,0,1,0.23,333,3,3,1,0,0,1,0,0,0,1,0.21,358,3,3,2,1,0,0,0,0,0,1,0.19,358,3,3,2,1,0,1,0,0,0,1,0.18,383,3,3,2,0,0,0,0,0,0,1,0.19,358,3,3,2,0,0,1,0,0,0,1,0.18,383,3,3,3,1,0,0,0,0,0,1,0.16,383,3,3,3,1,0,1,0,0,0,1,0.16,408,3,3,3,0,0,0,0,0,0,1,0.16,383,3,3,3,0,0,1,0,0,0,1,0.15,408,3,3,4,1,0,0,0,0,0,1,0.14,408,3,3,4,1,0,1,0,0,0,1,0.14,433,3,3,4,0,0,0,0,0,0,1,0.14,408,3,3,4,0,0,1,0,0,0,1,0.13,433,3,3,5,1,0,0,0,0,0,1,0.13,433,3,3,5,1,0,1,0,0,0,1,0.12,458,3,3,5,0,0,0,0,0,0,1,0.12,433,3,3,5,0,0,1,0,0,0,1,0.12,458,3,3,6,1,0,0,0,0,0,1,0.11,458,3,3,6,1,0,1,0,0,0,1,0.11,483,3,3,6,0,0,0,0,0,0,1,0.11,458,3,3,6,0,0,1,0,0,0,1,0.11,483,3,3,7,1,0,0,0,0,0,1,0.1,483,3,3,7,1,0,1,0,0,0,1,0.1,508,3,3,7,0,0,0,0,0,0,1,0.1,483,3,3,7,0,0,1,0,0,0,1,0.1,508,4,0,2,1,0,0,0,0,0,0,0.32,340,4,0,2,1,0,1,0,0,0,0,0.3,365,4,0,2,0,0,0,0,0,0,0,0.32,340,4,0,2,0,0,1,0,0,0,0,0.3,365,4,0,3,1,0,0,0,0,0,0,0.27,365,4,0,3,1,0,1,0,0,0,0,0.25,390,4,0,3,0,0,0,0,0,0,0,0.27,365,4,0,3,0,0,1,0,0,0,0,0.25,390,4,0,4,1,0,0,0,0,0,0,0.23,390,4,0,4,1,0,1,0,0,0,0,0.22,415,4,0,4,0,0,0,0,0,0,0,0.23,390,4,0,4,0,0,1,0,0,0,0,0.22,415,4,0,5,1,0,0,0,0,0,0,0.2,415,4,0,5,1,0,1,0,0,0,0,0.19,440,4,0,5,0,0,0,0,0,0,0,0.2,415,4,0,5,0,0,1,0,0,0,0,0.19,440,4,0,6,1,0,0,0,0,0,0,0.18,440,4,0,6,1,0,1,0,0,0,0,0.17,465,4,0,6,0,0,0,0,0,0,0,0.18,440,4,0,6,0,0,1,0,0,0,0,0.17,465,4,0,7,1,0,0,0,0,0,0,0.16,465,4,0,7,1,0,1,0,0,0,0,0.16,490,4,0,7,0,0,0,0,0,0,0,0.16,465,4,0,7,0,0,1,0,0,0,0,0.15,490,4,1,2,1,0,0,0,0,0,0,0.32,340,4,1,2,1,0,1,0,0,0,0,0.3,365,4,1,2,0,0,0,0,0,0,0,0.32,340,4,1,2,0,0,1,0,0,0,0,0.3,365,4,1,3,1,0,0,0,0,0,0,0.27,365,4,1,3,1,0,1,0,0,0,0,0.25,390,4,1,3,0,0,0,0,0,0,0,0.26,365,4,1,3,0,0,1,0,0,0,0,0.25,390,4,1,4,1,0,0,0,0,0,0,0.23,390,4,1,4,1,0,1,0,0,0,0,0.22,415,4,1,4,0,0,0,0,0,0,0,0.23,390,4,1,4,0,0,1,0,0,0,0,0.21,415,4,1,5,1,0,0,0,0,0,0,0.2,415,4,1,5,1,0,1,0,0,0,0,0.19,440,4,1,5,0,0,0,0,0,0,0,0.2,415,4,1,5,0,0,1,0,0,0,0,0.19,440,4,1,6,1,0,0,0,0,0,0,0.18,440,4,1,6,1,0,1,0,0,0,0,0.17,465,4,1,6,0,0,0,0,0,0,0,0.18,440,4,1,6,0,0,1,0,0,0,0,0.17,465,4,1,7,1,0,0,0,0,0,0,0.16,465,4,1,7,1,0,1,0,0,0,0,0.16,490,4,1,7,0,0,0,0,0,0,0,0.16,465,4,1,7,0,0,1,0,0,0,0,0.15,490,4,3,2,1,0,0,0,0,0,0,0.29,340,4,3,2,1,0,1,0,0,0,0,0.27,365,4,3,2,0,0,0,0,0,0,0,0.29,340,4,3,2,0,0,1,0,0,0,0,0.27,365,4,3,3,1,0,0,0,0,0,0,0.23,365,4,3,3,1,0,1,0,0,0,0,0.22,390,4,3,3,0,0,0,0,0,0,0,0.22,365,4,3,3,0,0,1,0,0,0,0,0.21,390,4,3,4,1,0,0,0,0,0,0,0.19,390,4,3,4,1,0,1,0,0,0,0,0.18,415,4,3,4,0,0,0,0,0,0,0,0.18,390,4,3,4,0,0,1,0,0,0,0,0.18,415,4,3,5,1,0,0,0,0,0,0,0.16,415,4,3,5,1,0,1,0,0,0,0,0.16,440,4,3,5,0,0,0,0,0,0,0,0.16,415,4,3,5,0,0,1,0,0,0,0,0.15,440,4,3,6,1,0,0,0,0,0,0,0.14,440,4,3,6,1,0,1,0,0,0,0,0.14,465,4,3,6,0,0,0,0,0,0,0,0.14,440,4,3,6,0,0,1,0,0,0,0,0.13,465,4,3,7,1,0,0,0,0,0,0,0.13,465,4,3,7,1,0,1,0,0,0,0,0.12,490,4,3,7,0,0,0,0,0,0,0,0.12,465,4,3,7,0,0,1,0,0,0,0,0.12,490,5,0,2,1,0,0,0,0,0,1,0.31,358,5,0,2,1,0,1,0,0,0,1,0.29,383,5,0,2,0,0,0,0,0,0,1,0.3,358,5,0,2,0,0,1,0,0,0,1,0.28,383,5,0,3,1,0,0,0,0,0,1,0.26,383,5,0,3,1,0,1,0,0,0,1,0.24,408,5,0,3,0,0,0,0,0,0,1,0.26,383,5,0,3,0,0,1,0,0,0,1,0.24,408,5,0,4,1,0,0,0,0,0,1,0.22,408,5,0,4,1,0,1,0,0,0,1,0.21,433,5,0,4,0,0,0,0,0,0,1,0.22,408,5,0,4,0,0,1,0,0,0,1,0.21,433,5,0,5,1,0,0,0,0,0,1,0.2,433,5,0,5,1,0,1,0,0,0,1,0.19,458,5,0,5,0,0,0,0,0,0,1,0.19,433,5,0,5,0,0,1,0,0,0,1,0.19,458,5,0,6,1,0,0,0,0,0,1,0.18,458,5,0,6,1,0,1,0,0,0,1,0.17,483,5,0,6,0,0,0,0,0,0,1,0.17,458,5,0,6,0,0,1,0,0,0,1,0.17,483,5,0,7,1,0,0,0,0,0,1,0.16,483,5,0,7,1,0,1,0,0,0,1,0.15,508,5,0,7,0,0,0,0,0,0,1,0.16,483,5,0,7,0,0,1,0,0,0,1,0.15,508,5,1,2,1,0,0,0,0,0,1,0.3,358,5,1,2,1,0,1,0,0,0,1,0.28,383,5,1,2,0,0,0,0,0,0,1,0.3,358,5,1,2,0,0,1,0,0,0,1,0.28,383,5,1,3,1,0,0,0,0,0,1,0.26,383,5,1,3,1,0,1,0,0,0,1,0.24,408,5,1,3,0,0,0,0,0,0,1,0.25,383,5,1,3,0,0,1,0,0,0,1,0.24,408,5,1,4,1,0,0,0,0,0,1,0.22,408,5,1,4,1,0,1,0,0,0,1,0.21,433,5,1,4,0,0,0,0,0,0,1,0.22,408,5,1,4,0,0,1,0,0,0,1,0.21,433,5,1,5,1,0,0,0,0,0,1,0.19,433,5,1,5,1,0,1,0,0,0,1,0.19,458,5,1,5,0,0,0,0,0,0,1,0.19,433,5,1,5,0,0,1,0,0,0,1,0.18,458,5,1,6,1,0,0,0,0,0,1,0.17,458,5,1,6,1,0,1,0,0,0,1,0.17,483,5,1,6,0,0,0,0,0,0,1,0.17,458,5,1,6,0,0,1,0,0,0,1,0.16,483,5,1,7,1,0,0,0,0,0,1,0.16,483,5,1,7,1,0,1,0,0,0,1,0.15,508,5,1,7,0,0,0,0,0,0,1,0.15,483,5,1,7,0,0,1,0,0,0,1,0.15,508,5,3,2,1,0,0,0,0,0,1,0.28,358,5,3,2,1,0,1,0,0,0,1,0.26,383,5,3,2,0,0,0,0,0,0,1,0.27,358,5,3,2,0,0,1,0,0,0,1,0.26,383,5,3,3,1,0,0,0,0,0,1,0.22,383,5,3,3,1,0,1,0,0,0,1,0.21,408,5,3,3,0,0,0,0,0,0,1,0.22,383,5,3,3,0,0,1,0,0,0,1,0.21,408,5,3,4,1,0,0,0,0,0,1,0.18,408,5,3,4,1,0,1,0,0,0,1,0.18,433,5,3,4,0,0,0,0,0,0,1,0.18,408,5,3,4,0,0,1,0,0,0,1,0.17,433,5,3,5,1,0,0,0,0,0,1,0.16,433,5,3,5,1,0,1,0,0,0,1,0.15,458,5,3,5,0,0,0,0,0,0,1,0.15,433,5,3,5,0,0,1,0,0,0,1,0.15,458,5,3,6,1,0,0,0,0,0,1,0.14,458,5,3,6,1,0,1,0,0,0,1,0.13,483,5,3,6,0,0,0,0,0,0,1,0.13,458,5,3,6,0,0,1,0,0,0,1,0.13,483,5,3,7,1,0,0,0,0,0,1,0.12,483,5,3,7,1,0,1,0,0,0,1,0.12,508,5,3,7,0,0,0,0,0,0,1,0.12,483,5,3,7,0,0,1,0,0,0,1,0.12,508,6,2,0,1,0,0,1,0,0,0,0.69,290,6,2,0,1,0,1,1,0,0,0,0.6,315,6,2,0,0,0,0,1,0,0,0,0.69,290,6,2,0,0,0,1,1,0,0,0,0.6,315,6,2,1,1,0,0,1,0,0,0,0.69,315,6,2,1,1,0,1,1,0,0,0,0.6,340,6,2,1,0,0,0,1,0,0,0,0.69,315,6,2,1,0,0,1,1,0,0,0,0.6,340,6,2,2,1,0,0,1,0,0,0,0.69,340,6,2,2,1,0,1,1,0,0,0,0.6,365,6,2,2,0,0,0,1,0,0,0,0.69,340,6,2,2,0,0,1,1,0,0,0,0.6,365,6,2,3,1,0,0,1,0,0,0,0.69,365,6,2,3,1,0,1,1,0,0,0,0.6,390,6,2,3,0,0,0,1,0,0,0,0.69,365,6,2,3,0,0,1,1,0,0,0,0.6,390,6,2,4,1,0,0,1,0,0,0,0.69,390,6,2,4,1,0,1,1,0,0,0,0.6,415,6,2,4,0,0,0,1,0,0,0,0.69,390,6,2,4,0,0,1,1,0,0,0,0.6,415,6,2,5,1,0,0,1,0,0,0,0.69,415,6,2,5,1,0,1,1,0,0,0,0.6,440,6,2,5,0,0,0,1,0,0,0,0.69,415,6,2,5,0,0,1,1,0,0,0,0.6,440,6,2,6,1,0,0,1,0,0,0,0.69,440,6,2,6,1,0,1,1,0,0,0,0.6,465,6,2,6,0,0,0,1,0,0,0,0.69,440,6,2,6,0,0,1,1,0,0,0,0.6,465,6,2,7,1,0,0,1,0,0,0,0.69,465,6,2,7,1,0,1,1,0,0,0,0.6,490,6,2,7,0,0,0,1,0,0,0,0.69,465,6,2,7,0,0,1,1,0,0,0,0.6,490,7,2,0,1,0,0,1,0,0,1,0.63,308,7,2,0,1,0,1,1,0,0,1,0.55,333,7,2,0,0,0,0,1,0,0,1,0.63,308,7,2,0,0,0,1,1,0,0,1,0.55,333,7,2,1,1,0,0,1,0,0,1,0.63,333,7,2,1,1,0,1,1,0,0,1,0.55,358,7,2,1,0,0,0,1,0,0,1,0.63,333,7,2,1,0,0,1,1,0,0,1,0.55,358,7,2,2,1,0,0,1,0,0,1,0.63,358,7,2,2,1,0,1,1,0,0,1,0.55,383,7,2,2,0,0,0,1,0,0,1,0.63,358,7,2,2,0,0,1,1,0,0,1,0.55,383,7,2,3,1,0,0,1,0,0,1,0.63,383,7,2,3,1,0,1,1,0,0,1,0.55,408,7,2,3,0,0,0,1,0,0,1,0.63,383,7,2,3,0,0,1,1,0,0,1,0.55,408,7,2,4,1,0,0,1,0,0,1,0.63,408,7,2,4,1,0,1,1,0,0,1,0.55,433,7,2,4,0,0,0,1,0,0,1,0.63,408,7,2,4,0,0,1,1,0,0,1,0.55,433,7,2,5,1,0,0,1,0,0,1,0.63,433,7,2,5,1,0,1,1,0,0,1,0.55,458,7,2,5,0,0,0,1,0,0,1,0.63,433,7,2,5,0,0,1,1,0,0,1,0.55,458,7,2,6,1,0,0,1,0,0,1,0.63,458,7,2,6,1,0,1,1,0,0,1,0.55,483,7,2,6,0,0,0,1,0,0,1,0.63,458,7,2,6,0,0,1,1,0,0,1,0.55,483,7,2,7,1,0,0,1,0,0,1,0.63,483,7,2,7,1,0,1,1,0,0,1,0.55,508,7,2,7,0,0,0,1,0,0,1,0.63,483,7,2,7,0,0,1,1,0,0,1,0.55,508,8,2,0,1,0,0,1,1,0,0,1.7,290,8,2,0,1,0,1,1,1,0,0,1.66,315,8,2,0,0,0,0,1,1,0,0,1.69,290,8,2,0,0,0,1,1,1,0,0,1.65,315,8,2,1,1,0,0,1,1,0,0,1.69,315,8,2,1,1,0,1,1,1,0,0,1.65,340,8,2,1,0,0,0,1,1,0,0,1.69,315,8,2,1,0,0,1,1,1,0,0,1.65,340,8,2,2,1,0,0,1,1,0,0,1.69,340,8,2,2,1,0,1,1,1,0,0,1.65,365,8,2,2,0,0,0,1,1,0,0,1.69,340,8,2,2,0,0,1,1,1,0,0,1.65,365,8,2,3,1,0,0,1,1,0,0,1.69,365,8,2,3,1,0,1,1,1,0,0,1.65,390,8,2,3,0,0,0,1,1,0,0,1.69,365,8,2,3,0,0,1,1,1,0,0,1.65,390,8,2,4,1,0,0,1,1,0,0,1.69,390,8,2,4,1,0,1,1,1,0,0,1.65,415,8,2,4,0,0,0,1,1,0,0,1.69,390,8,2,4,0,0,1,1,1,0,0,1.65,415,8,2,5,1,0,0,1,1,0,0,1.69,415,8,2,5,1,0,1,1,1,0,0,1.65,440,8,2,5,0,0,0,1,1,0,0,1.69,415,8,2,5,0,0,1,1,1,0,0,1.65,440,8,2,6,1,0,0,1,1,0,0,1.69,440,8,2,6,1,0,1,1,1,0,0,1.65,465,8,2,6,0,0,0,1,1,0,0,1.69,440,8,2,6,0,0,1,1,1,0,0,1.65,465,8,2,7,1,0,0,1,1,0,0,1.69,465,8,2,7,1,0,1,1,1,0,0,1.65,490,8,2,7,0,0,0,1,1,0,0,1.69,465,8,2,7,0,0,1,1,1,0,0,1.65,490,9,2,0,1,0,0,1,1,0,1,1.35,308,9,2,0,1,0,1,1,1,0,1,1.32,333,9,2,0,0,0,0,1,1,0,1,1.35,308,9,2,0,0,0,1,1,1,0,1,1.32,333,9,2,1,1,0,0,1,1,0,1,1.35,333,9,2,1,1,0,1,1,1,0,1,1.32,358,9,2,1,0,0,0,1,1,0,1,1.35,333,9,2,1,0,0,1,1,1,0,1,1.32,358,9,2,2,1,0,0,1,1,0,1,1.35,358,9,2,2,1,0,1,1,1,0,1,1.32,383,9,2,2,0,0,0,1,1,0,1,1.35,358,9,2,2,0,0,1,1,1,0,1,1.32,383,9,2,3,1,0,0,1,1,0,1,1.35,383,9,2,3,1,0,1,1,1,0,1,1.32,408,9,2,3,0,0,0,1,1,0,1,1.35,383,9,2,3,0,0,1,1,1,0,1,1.32,408,9,2,4,1,0,0,1,1,0,1,1.35,408,9,2,4,1,0,1,1,1,0,1,1.32,433,9,2,4,0,0,0,1,1,0,1,1.35,408,9,2,4,0,0,1,1,1,0,1,1.32,433,9,2,5,1,0,0,1,1,0,1,1.35,433,9,2,5,1,0,1,1,1,0,1,1.32,458,9,2,5,0,0,0,1,1,0,1,1.35,433,9,2,5,0,0,1,1,1,0,1,1.32,458,9,2,6,1,0,0,1,1,0,1,1.35,458,9,2,6,1,0,1,1,1,0,1,1.32,483,9,2,6,0,0,0,1,1,0,1,1.35,458,9,2,6,0,0,1,1,1,0,1,1.32,483,9,2,7,1,0,0,1,1,0,1,1.35,483,9,2,7,1,0,1,1,1,0,1,1.32,508,9,2,7,0,0,0,1,1,0,1,1.35,483,9,2,7,0,0,1,1,1,0,1,1.32,508,10,0,0,1,0,0,1,0,0,0,0.54,290,10,0,0,1,0,1,1,0,0,0,0.48,315,10,0,0,0,0,0,1,0,0,0,0.53,290,10,0,0,0,0,1,1,0,0,0,0.47,315,10,0,1,1,0,0,1,0,0,0,0.4,315,10,0,1,1,0,1,1,0,0,0,0.37,340,10,0,1,0,0,0,1,0,0,0,0.4,315,10,0,1,0,0,1,1,0,0,0,0.36,340,10,0,2,1,0,0,1,0,0,0,0.32,340,10,0,2,1,0,1,1,0,0,0,0.3,365,10,0,2,0,0,0,1,0,0,0,0.32,340,10,0,2,0,0,1,1,0,0,0,0.3,365,10,0,3,1,0,0,1,0,0,0,0.27,365,10,0,3,1,0,1,1,0,0,0,0.26,390,10,0,3,0,0,0,1,0,0,0,0.27,365,10,0,3,0,0,1,1,0,0,0,0.25,390,10,0,4,1,0,0,1,0,0,0,0.23,390,10,0,4,1,0,1,1,0,0,0,0.22,415,10,0,4,0,0,0,1,0,0,0,0.23,390,10,0,4,0,0,1,1,0,0,0,0.22,415,10,0,5,1,0,0,1,0,0,0,0.2,415,10,0,5,1,0,1,1,0,0,0,0.2,440,10,0,5,0,0,0,1,0,0,0,0.2,415,10,0,5,0,0,1,1,0,0,0,0.19,440,10,0,6,1,0,0,1,0,0,0,0.18,440,10,0,6,1,0,1,1,0,0,0,0.17,465,10,0,6,0,0,0,1,0,0,0,0.18,440,10,0,6,0,0,1,1,0,0,0,0.17,465,10,0,7,1,0,0,1,0,0,0,0.16,465,10,0,7,1,0,1,1,0,0,0,0.16,490,10,0,7,0,0,0,1,0,0,0,0.16,465,10,0,7,0,0,1,1,0,0,0,0.15,490,10,1,0,1,0,0,1,0,0,0,0.53,290,10,1,0,1,0,1,1,0,0,0,0.47,315,10,1,0,0,0,0,1,0,0,0,0.52,290,10,1,0,0,0,1,1,0,0,0,0.47,315,10,1,1,1,0,0,1,0,0,0,0.4,315,10,1,1,1,0,1,1,0,0,0,0.36,340,10,1,1,0,0,0,1,0,0,0,0.39,315,10,1,1,0,0,1,1,0,0,0,0.36,340,10,1,2,1,0,0,1,0,0,0,0.32,340,10,1,2,1,0,1,1,0,0,0,0.3,365,10,1,2,0,0,0,1,0,0,0,0.31,340,10,1,2,0,0,1,1,0,0,0,0.29,365,10,1,3,1,0,0,1,0,0,0,0.27,365,10,1,3,1,0,1,1,0,0,0,0.25,390,10,1,3,0,0,0,1,0,0,0,0.26,365,10,1,3,0,0,1,1,0,0,0,0.25,390,10,1,4,1,0,0,1,0,0,0,0.23,390,10,1,4,1,0,1,1,0,0,0,0.22,415,10,1,4,0,0,0,1,0,0,0,0.22,390,10,1,4,0,0,1,1,0,0,0,0.21,415,10,1,5,1,0,0,1,0,0,0,0.2,415,10,1,5,1,0,1,1,0,0,0,0.19,440,10,1,5,0,0,0,1,0,0,0,0.2,415,10,1,5,0,0,1,1,0,0,0,0.19,440,10,1,6,1,0,0,1,0,0,0,0.18,440,10,1,6,1,0,1,1,0,0,0,0.17,465,10,1,6,0,0,0,1,0,0,0,0.18,440,10,1,6,0,0,1,1,0,0,0,0.17,465,10,1,7,1,0,0,1,0,0,0,0.16,465,10,1,7,1,0,1,1,0,0,0,0.16,490,10,1,7,0,0,0,1,0,0,0,0.16,465,10,1,7,0,0,1,1,0,0,0,0.15,490,10,3,0,1,0,0,1,0,0,0,0.45,290,10,3,0,1,0,1,1,0,0,0,0.41,315,10,3,0,0,0,0,1,0,0,0,0.44,290,10,3,0,0,0,1,1,0,0,0,0.4,315,10,3,1,1,0,0,1,0,0,0,0.32,315,10,3,1,1,0,1,1,0,0,0,0.3,340,10,3,1,0,0,0,1,0,0,0,0.31,315,10,3,1,0,0,1,1,0,0,0,0.29,340,10,3,2,1,0,0,1,0,0,0,0.25,340,10,3,2,1,0,1,1,0,0,0,0.23,365,10,3,2,0,0,0,1,0,0,0,0.24,340,10,3,2,0,0,1,1,0,0,0,0.23,365,10,3,3,1,0,0,1,0,0,0,0.2,365,10,3,3,1,0,1,1,0,0,0,0.19,390,10,3,3,0,0,0,1,0,0,0,0.2,365,10,3,3,0,0,1,1,0,0,0,0.19,390,10,3,4,1,0,0,1,0,0,0,0.17,390,10,3,4,1,0,1,1,0,0,0,0.17,415,10,3,4,0,0,0,1,0,0,0,0.17,390,10,3,4,0,0,1,1,0,0,0,0.16,415,10,3,5,1,0,0,1,0,0,0,0.15,415,10,3,5,1,0,1,1,0,0,0,0.15,440,10,3,5,0,0,0,1,0,0,0,0.14,415,10,3,5,0,0,1,1,0,0,0,0.14,440,10,3,6,1,0,0,1,0,0,0,0.13,440,10,3,6,1,0,1,1,0,0,0,0.13,465,10,3,6,0,0,0,1,0,0,0,0.13,440,10,3,6,0,0,1,1,0,0,0,0.12,465,10,3,7,1,0,0,1,0,0,0,0.12,465,10,3,7,1,0,1,1,0,0,0,0.12,490,10,3,7,0,0,0,1,0,0,0,0.12,465,10,3,7,0,0,1,1,0,0,0,0.11,490,11,0,0,1,0,0,1,0,0,1,0.49,308,11,0,0,1,0,1,1,0,0,1,0.44,333,11,0,0,0,0,0,1,0,0,1,0.49,308,11,0,0,0,0,1,1,0,0,1,0.44,333,11,0,1,1,0,0,1,0,0,1,0.38,333,11,0,1,1,0,1,1,0,0,1,0.35,358,11,0,1,0,0,0,1,0,0,1,0.38,333,11,0,1,0,0,1,1,0,0,1,0.35,358,11,0,2,1,0,0,1,0,0,1,0.31,358,11,0,2,1,0,1,1,0,0,1,0.29,383,11,0,2,0,0,0,1,0,0,1,0.3,358,11,0,2,0,0,1,1,0,0,1,0.28,383,11,0,3,1,0,0,1,0,0,1,0.26,383,11,0,3,1,0,1,1,0,0,1,0.25,408,11,0,3,0,0,0,1,0,0,1,0.26,383,11,0,3,0,0,1,1,0,0,1,0.24,408,11,0,4,1,0,0,1,0,0,1,0.22,408,11,0,4,1,0,1,1,0,0,1,0.21,433,11,0,4,0,0,0,1,0,0,1,0.22,408,11,0,4,0,0,1,1,0,0,1,0.21,433,11,0,5,1,0,0,1,0,0,1,0.2,433,11,0,5,1,0,1,1,0,0,1,0.19,458,11,0,5,0,0,0,1,0,0,1,0.19,433,11,0,5,0,0,1,1,0,0,1,0.19,458,11,0,6,1,0,0,1,0,0,1,0.18,458,11,0,6,1,0,1,1,0,0,1,0.17,483,11,0,6,0,0,0,1,0,0,1,0.17,458,11,0,6,0,0,1,1,0,0,1,0.17,483,11,0,7,1,0,0,1,0,0,1,0.16,483,11,0,7,1,0,1,1,0,0,1,0.15,508,11,0,7,0,0,0,1,0,0,1,0.16,483,11,0,7,0,0,1,1,0,0,1,0.15,508,11,1,0,1,0,0,1,0,0,1,0.49,308,11,1,0,1,0,1,1,0,0,1,0.44,333,11,1,0,0,0,0,1,0,0,1,0.48,308,11,1,0,0,0,1,1,0,0,1,0.44,333,11,1,1,1,0,0,1,0,0,1,0.37,333,11,1,1,1,0,1,1,0,0,1,0.34,358,11,1,1,0,0,0,1,0,0,1,0.37,333,11,1,1,0,0,1,1,0,0,1,0.34,358,11,1,2,1,0,0,1,0,0,1,0.3,358,11,1,2,1,0,1,1,0,0,1,0.28,383,11,1,2,0,0,0,1,0,0,1,0.3,358,11,1,2,0,0,1,1,0,0,1,0.28,383,11,1,3,1,0,0,1,0,0,1,0.26,383,11,1,3,1,0,1,1,0,0,1,0.24,408,11,1,3,0,0,0,1,0,0,1,0.25,383,11,1,3,0,0,1,1,0,0,1,0.24,408,11,1,4,1,0,0,1,0,0,1,0.22,408,11,1,4,1,0,1,1,0,0,1,0.21,433,11,1,4,0,0,0,1,0,0,1,0.22,408,11,1,4,0,0,1,1,0,0,1,0.21,433,11,1,5,1,0,0,1,0,0,1,0.2,433,11,1,5,1,0,1,1,0,0,1,0.19,458,11,1,5,0,0,0,1,0,0,1,0.19,433,11,1,5,0,0,1,1,0,0,1,0.18,458,11,1,6,1,0,0,1,0,0,1,0.18,458,11,1,6,1,0,1,1,0,0,1,0.17,483,11,1,6,0,0,0,1,0,0,1,0.17,458,11,1,6,0,0,1,1,0,0,1,0.17,483,11,1,7,1,0,0,1,0,0,1,0.16,483,11,1,7,1,0,1,1,0,0,1,0.15,508,11,1,7,0,0,0,1,0,0,1,0.16,483,11,1,7,0,0,1,1,0,0,1,0.15,508,11,3,0,1,0,0,1,0,0,1,0.42,308,11,3,0,1,0,1,1,0,0,1,0.39,333,11,3,0,0,0,0,1,0,0,1,0.42,308,11,3,0,0,0,1,1,0,0,1,0.38,333,11,3,1,1,0,0,1,0,0,1,0.3,333,11,3,1,1,0,1,1,0,0,1,0.29,358,11,3,1,0,0,0,1,0,0,1,0.3,333,11,3,1,0,0,1,1,0,0,1,0.28,358,11,3,2,1,0,0,1,0,0,1,0.24,358,11,3,2,1,0,1,1,0,0,1,0.23,383,11,3,2,0,0,0,1,0,0,1,0.23,358,11,3,2,0,0,1,1,0,0,1,0.22,383,11,3,3,1,0,0,1,0,0,1,0.2,383,11,3,3,1,0,1,1,0,0,1,0.19,408,11,3,3,0,0,0,1,0,0,1,0.19,383,11,3,3,0,0,1,1,0,0,1,0.18,408,11,3,4,1,0,0,1,0,0,1,0.17,408,11,3,4,1,0,1,1,0,0,1,0.16,433,11,3,4,0,0,0,1,0,0,1,0.16,408,11,3,4,0,0,1,1,0,0,1,0.16,433,11,3,5,1,0,0,1,0,0,1,0.15,433,11,3,5,1,0,1,1,0,0,1,0.14,458,11,3,5,0,0,0,1,0,0,1,0.14,433,11,3,5,0,0,1,1,0,0,1,0.14,458,11,3,6,1,0,0,1,0,0,1,0.13,458,11,3,6,1,0,1,1,0,0,1,0.13,483,11,3,6,0,0,0,1,0,0,1,0.13,458,11,3,6,0,0,1,1,0,0,1,0.12,483,11,3,7,1,0,0,1,0,0,1,0.12,483,11,3,7,1,0,1,1,0,0,1,0.11,508,11,3,7,0,0,0,1,0,0,1,0.11,483,11,3,7,0,0,1,1,0,0,1,0.11,508,12,0,0,1,0,0,1,1,0,0,0.98,290,12,0,0,1,0,1,1,1,0,0,0.97,315,12,0,0,0,0,0,1,1,0,0,0.97,290,12,0,0,0,0,1,1,1,0,0,0.95,315,12,0,1,1,0,0,1,1,0,0,0.62,315,12,0,1,1,0,1,1,1,0,0,0.61,340,12,0,1,0,0,0,1,1,0,0,0.6,315,12,0,1,0,0,1,1,1,0,0,0.6,340,12,0,2,1,0,0,1,1,0,0,0.45,340,12,0,2,1,0,1,1,1,0,0,0.45,365,12,0,2,0,0,0,1,1,0,0,0.44,340,12,0,2,0,0,1,1,1,0,0,0.43,365,12,0,3,1,0,0,1,1,0,0,0.35,365,12,0,3,1,0,1,1,1,0,0,0.35,390,12,0,3,0,0,0,1,1,0,0,0.34,365,12,0,3,0,0,1,1,1,0,0,0.34,390,12,0,4,1,0,0,1,1,0,0,0.29,390,12,0,4,1,0,1,1,1,0,0,0.29,415,12,0,4,0,0,0,1,1,0,0,0.28,390,12,0,4,0,0,1,1,1,0,0,0.28,415,12,0,5,1,0,0,1,1,0,0,0.25,415,12,0,5,1,0,1,1,1,0,0,0.25,440,12,0,5,0,0,0,1,1,0,0,0.24,415,12,0,5,0,0,1,1,1,0,0,0.24,440,12,0,6,1,0,0,1,1,0,0,0.21,440,12,0,6,1,0,1,1,1,0,0,0.21,465,12,0,6,0,0,0,1,1,0,0,0.21,440,12,0,6,0,0,1,1,1,0,0,0.21,465,12,0,7,1,0,0,1,1,0,0,0.19,465,12,0,7,1,0,1,1,1,0,0,0.19,490,12,0,7,0,0,0,1,1,0,0,0.18,465,12,0,7,0,0,1,1,1,0,0,0.18,490,12,1,0,1,0,0,1,1,0,0,0.96,290,12,1,0,1,0,1,1,1,0,0,0.95,315,12,1,0,0,0,0,1,1,0,0,0.94,290,12,1,0,0,0,1,1,1,0,0,0.93,315,12,1,1,1,0,0,1,1,0,0,0.6,315,12,1,1,1,0,1,1,1,0,0,0.59,340,12,1,1,0,0,0,1,1,0,0,0.58,315,12,1,1,0,0,1,1,1,0,0,0.58,340,12,1,2,1,0,0,1,1,0,0,0.44,340,12,1,2,1,0,1,1,1,0,0,0.43,365,12,1,2,0,0,0,1,1,0,0,0.43,340,12,1,2,0,0,1,1,1,0,0,0.42,365,12,1,3,1,0,0,1,1,0,0,0.35,365,12,1,3,1,0,1,1,1,0,0,0.34,390,12,1,3,0,0,0,1,1,0,0,0.34,365,12,1,3,0,0,1,1,1,0,0,0.33,390,12,1,4,1,0,0,1,1,0,0,0.29,390,12,1,4,1,0,1,1,1,0,0,0.28,415,12,1,4,0,0,0,1,1,0,0,0.28,390,12,1,4,0,0,1,1,1,0,0,0.28,415,12,1,5,1,0,0,1,1,0,0,0.24,415,12,1,5,1,0,1,1,1,0,0,0.24,440,12,1,5,0,0,0,1,1,0,0,0.24,415,12,1,5,0,0,1,1,1,0,0,0.24,440,12,1,6,1,0,0,1,1,0,0,0.21,440,12,1,6,1,0,1,1,1,0,0,0.21,465,12,1,6,0,0,0,1,1,0,0,0.21,440,12,1,6,0,0,1,1,1,0,0,0.21,465,12,1,7,1,0,0,1,1,0,0,0.19,465,12,1,7,1,0,1,1,1,0,0,0.19,490,12,1,7,0,0,0,1,1,0,0,0.18,465,12,1,7,0,0,1,1,1,0,0,0.18,490,12,3,0,1,0,0,1,1,0,0,0.74,290,12,3,0,1,0,1,1,1,0,0,0.73,315,12,3,0,0,0,0,1,1,0,0,0.71,290,12,3,0,0,0,1,1,1,0,0,0.71,315,12,3,1,1,0,0,1,1,0,0,0.44,315,12,3,1,1,0,1,1,1,0,0,0.44,340,12,3,1,0,0,0,1,1,0,0,0.42,315,12,3,1,0,0,1,1,1,0,0,0.42,340,12,3,2,1,0,0,1,1,0,0,0.31,340,12,3,2,1,0,1,1,1,0,0,0.31,365,12,3,2,0,0,0,1,1,0,0,0.3,340,12,3,2,0,0,1,1,1,0,0,0.3,365,12,3,3,1,0,0,1,1,0,0,0.25,365,12,3,3,1,0,1,1,1,0,0,0.24,390,12,3,3,0,0,0,1,1,0,0,0.24,365,12,3,3,0,0,1,1,1,0,0,0.23,390,12,3,4,1,0,0,1,1,0,0,0.2,390,12,3,4,1,0,1,1,1,0,0,0.2,415,12,3,4,0,0,0,1,1,0,0,0.19,390,12,3,4,0,0,1,1,1,0,0,0.19,415,12,3,5,1,0,0,1,1,0,0,0.17,415,12,3,5,1,0,1,1,1,0,0,0.17,440,12,3,5,0,0,0,1,1,0,0,0.16,415,12,3,5,0,0,1,1,1,0,0,0.16,440,12,3,6,1,0,0,1,1,0,0,0.15,440,12,3,6,1,0,1,1,1,0,0,0.15,465,12,3,6,0,0,0,1,1,0,0,0.14,440,12,3,6,0,0,1,1,1,0,0,0.14,465,12,3,7,1,0,0,1,1,0,0,0.13,465,12,3,7,1,0,1,1,1,0,0,0.13,490,12,3,7,0,0,0,1,1,0,0,0.13,465,12,3,7,0,0,1,1,1,0,0,0.13,490,13,0,0,1,0,0,1,1,0,1,0.86,308,13,0,0,1,0,1,1,1,0,1,0.85,333,13,0,0,0,0,0,1,1,0,1,0.84,308,13,0,0,0,0,1,1,1,0,1,0.83,333,13,0,1,1,0,0,1,1,0,1,0.56,333,13,0,1,1,0,1,1,1,0,1,0.56,358,13,0,1,0,0,0,1,1,0,1,0.55,333,13,0,1,0,0,1,1,1,0,1,0.55,358,13,0,2,1,0,0,1,1,0,1,0.42,358,13,0,2,1,0,1,1,1,0,1,0.42,383,13,0,2,0,0,0,1,1,0,1,0.41,358,13,0,2,0,0,1,1,1,0,1,0.41,383,13,0,3,1,0,0,1,1,0,1,0.33,383,13,0,3,1,0,1,1,1,0,1,0.33,408,13,0,3,0,0,0,1,1,0,1,0.33,383,13,0,3,0,0,1,1,1,0,1,0.32,408,13,0,4,1,0,0,1,1,0,1,0.28,408,13,0,4,1,0,1,1,1,0,1,0.28,433,13,0,4,0,0,0,1,1,0,1,0.27,408,13,0,4,0,0,1,1,1,0,1,0.27,433,13,0,5,1,0,0,1,1,0,1,0.24,433,13,0,5,1,0,1,1,1,0,1,0.24,458,13,0,5,0,0,0,1,1,0,1,0.23,433,13,0,5,0,0,1,1,1,0,1,0.23,458,13,0,6,1,0,0,1,1,0,1,0.21,458,13,0,6,1,0,1,1,1,0,1,0.21,483,13,0,6,0,0,0,1,1,0,1,0.2,458,13,0,6,0,0,1,1,1,0,1,0.2,483,13,0,7,1,0,0,1,1,0,1,0.18,483,13,0,7,1,0,1,1,1,0,1,0.18,508,13,0,7,0,0,0,1,1,0,1,0.18,483,13,0,7,0,0,1,1,1,0,1,0.18,508,13,1,0,1,0,0,1,1,0,1,0.84,308,13,1,0,1,0,1,1,1,0,1,0.83,333,13,1,0,0,0,0,1,1,0,1,0.82,308,13,1,0,0,0,1,1,1,0,1,0.81,333,13,1,1,1,0,0,1,1,0,1,0.55,333,13,1,1,1,0,1,1,1,0,1,0.54,358,13,1,1,0,0,0,1,1,0,1,0.54,333,13,1,1,0,0,1,1,1,0,1,0.53,358,13,1,2,1,0,0,1,1,0,1,0.41,358,13,1,2,1,0,1,1,1,0,1,0.41,383,13,1,2,0,0,0,1,1,0,1,0.4,358,13,1,2,0,0,1,1,1,0,1,0.4,383,13,1,3,1,0,0,1,1,0,1,0.33,383,13,1,3,1,0,1,1,1,0,1,0.33,408,13,1,3,0,0,0,1,1,0,1,0.32,383,13,1,3,0,0,1,1,1,0,1,0.32,408,13,1,4,1,0,0,1,1,0,1,0.27,408,13,1,4,1,0,1,1,1,0,1,0.27,433,13,1,4,0,0,0,1,1,0,1,0.27,408,13,1,4,0,0,1,1,1,0,1,0.27,433,13,1,5,1,0,0,1,1,0,1,0.24,433,13,1,5,1,0,1,1,1,0,1,0.23,458,13,1,5,0,0,0,1,1,0,1,0.23,433,13,1,5,0,0,1,1,1,0,1,0.23,458,13,1,6,1,0,0,1,1,0,1,0.21,458,13,1,6,1,0,1,1,1,0,1,0.21,483,13,1,6,0,0,0,1,1,0,1,0.2,458,13,1,6,0,0,1,1,1,0,1,0.2,483,13,1,7,1,0,0,1,1,0,1,0.18,483,13,1,7,1,0,1,1,1,0,1,0.18,508,13,1,7,0,0,0,1,1,0,1,0.18,483,13,1,7,0,0,1,1,1,0,1,0.18,508,13,3,0,1,0,0,1,1,0,1,0.66,308,13,3,0,1,0,1,1,1,0,1,0.66,333,13,3,0,0,0,0,1,1,0,1,0.64,308,13,3,0,0,0,1,1,1,0,1,0.64,333,13,3,1,1,0,0,1,1,0,1,0.41,333,13,3,1,1,0,1,1,1,0,1,0.41,358,13,3,1,0,0,0,1,1,0,1,0.4,333,13,3,1,0,0,1,1,1,0,1,0.39,358,13,3,2,1,0,0,1,1,0,1,0.3,358,13,3,2,1,0,1,1,1,0,1,0.3,383,13,3,2,0,0,0,1,1,0,1,0.29,358,13,3,2,0,0,1,1,1,0,1,0.29,383,13,3,3,1,0,0,1,1,0,1,0.24,383,13,3,3,1,0,1,1,1,0,1,0.24,408,13,3,3,0,0,0,1,1,0,1,0.23,383,13,3,3,0,0,1,1,1,0,1,0.23,408,13,3,4,1,0,0,1,1,0,1,0.2,408,13,3,4,1,0,1,1,1,0,1,0.2,433,13,3,4,0,0,0,1,1,0,1,0.19,408,13,3,4,0,0,1,1,1,0,1,0.19,433,13,3,5,1,0,0,1,1,0,1,0.17,433,13,3,5,1,0,1,1,1,0,1,0.17,458,13,3,5,0,0,0,1,1,0,1,0.16,433,13,3,5,0,0,1,1,1,0,1,0.16,458,13,3,6,1,0,0,1,1,0,1,0.15,458,13,3,6,1,0,1,1,1,0,1,0.15,483,13,3,6,0,0,0,1,1,0,1,0.14,458,13,3,6,0,0,1,1,1,0,1,0.14,483,13,3,7,1,0,0,1,1,0,1,0.13,483,13,3,7,1,0,1,1,1,0,1,0.13,508,13,3,7,0,0,0,1,1,0,1,0.13,483,13,3,7,0,0,1,1,1,0,1,0.13,508,14,0,2,1,0,0,1,0,0,0,0.49,340,14,0,2,1,0,1,1,0,0,0,0.44,365,14,0,2,0,0,0,1,0,0,0,0.48,340,14,0,2,0,0,1,1,0,0,0,0.44,365,14,0,3,1,0,0,1,0,0,0,0.38,365,14,0,3,1,0,1,1,0,0,0,0.35,390,14,0,3,0,0,0,1,0,0,0,0.37,365,14,0,3,0,0,1,1,0,0,0,0.34,390,14,0,4,1,0,0,1,0,0,0,0.31,390,14,0,4,1,0,1,1,0,0,0,0.29,415,14,0,4,0,0,0,1,0,0,0,0.3,390,14,0,4,0,0,1,1,0,0,0,0.28,415,14,0,5,1,0,0,1,0,0,0,0.26,415,14,0,5,1,0,1,1,0,0,0,0.24,440,14,0,5,0,0,0,1,0,0,0,0.25,415,14,0,5,0,0,1,1,0,0,0,0.24,440,14,0,6,1,0,0,1,0,0,0,0.22,440,14,0,6,1,0,1,1,0,0,0,0.21,465,14,0,6,0,0,0,1,0,0,0,0.22,440,14,0,6,0,0,1,1,0,0,0,0.21,465,14,0,7,1,0,0,1,0,0,0,0.2,465,14,0,7,1,0,1,1,0,0,0,0.19,490,14,0,7,0,0,0,1,0,0,0,0.19,465,14,0,7,0,0,1,1,0,0,0,0.18,490,14,1,2,1,0,0,1,0,0,0,0.48,340,14,1,2,1,0,1,1,0,0,0,0.43,365,14,1,2,0,0,0,1,0,0,0,0.48,340,14,1,2,0,0,1,1,0,0,0,0.43,365,14,1,3,1,0,0,1,0,0,0,0.37,365,14,1,3,1,0,1,1,0,0,0,0.34,390,14,1,3,0,0,0,1,0,0,0,0.36,365,14,1,3,0,0,1,1,0,0,0,0.34,390,14,1,4,1,0,0,1,0,0,0,0.3,390,14,1,4,1,0,1,1,0,0,0,0.28,415,14,1,4,0,0,0,1,0,0,0,0.3,390,14,1,4,0,0,1,1,0,0,0,0.28,415,14,1,5,1,0,0,1,0,0,0,0.25,415,14,1,5,1,0,1,1,0,0,0,0.24,440,14,1,5,0,0,0,1,0,0,0,0.25,415,14,1,5,0,0,1,1,0,0,0,0.24,440,14,1,6,1,0,0,1,0,0,0,0.22,440,14,1,6,1,0,1,1,0,0,0,0.21,465,14,1,6,0,0,0,1,0,0,0,0.22,440,14,1,6,0,0,1,1,0,0,0,0.21,465,14,1,7,1,0,0,1,0,0,0,0.2,465,14,1,7,1,0,1,1,0,0,0,0.19,490,14,1,7,0,0,0,1,0,0,0,0.19,465,14,1,7,0,0,1,1,0,0,0,0.18,490,14,3,2,1,0,0,1,0,0,0,0.42,340,14,3,2,1,0,1,1,0,0,0,0.38,365,14,3,2,0,0,0,1,0,0,0,0.41,340,14,3,2,0,0,1,1,0,0,0,0.38,365,14,3,3,1,0,0,1,0,0,0,0.3,365,14,3,3,1,0,1,1,0,0,0,0.28,390,14,3,3,0,0,0,1,0,0,0,0.29,365,14,3,3,0,0,1,1,0,0,0,0.28,390,14,3,4,1,0,0,1,0,0,0,0.24,390,14,3,4,1,0,1,1,0,0,0,0.23,415,14,3,4,0,0,0,1,0,0,0,0.23,390,14,3,4,0,0,1,1,0,0,0,0.22,415,14,3,5,1,0,0,1,0,0,0,0.2,415,14,3,5,1,0,1,1,0,0,0,0.19,440,14,3,5,0,0,0,1,0,0,0,0.19,415,14,3,5,0,0,1,1,0,0,0,0.18,440,14,3,6,1,0,0,1,0,0,0,0.17,440,14,3,6,1,0,1,1,0,0,0,0.16,465,14,3,6,0,0,0,1,0,0,0,0.16,440,14,3,6,0,0,1,1,0,0,0,0.16,465,14,3,7,1,0,0,1,0,0,0,0.15,465,14,3,7,1,0,1,1,0,0,0,0.14,490,14,3,7,0,0,0,1,0,0,0,0.14,465,14,3,7,0,0,1,1,0,0,0,0.14,490,15,0,2,1,0,0,1,0,0,1,0.45,358,15,0,2,1,0,1,1,0,0,1,0.41,383,15,0,2,0,0,0,1,0,0,1,0.45,358,15,0,2,0,0,1,1,0,0,1,0.41,383,15,0,3,1,0,0,1,0,0,1,0.36,383,15,0,3,1,0,1,1,0,0,1,0.33,408,15,0,3,0,0,0,1,0,0,1,0.35,383,15,0,3,0,0,1,1,0,0,1,0.33,408,15,0,4,1,0,0,1,0,0,1,0.29,408,15,0,4,1,0,1,1,0,0,1,0.27,433,15,0,4,0,0,0,1,0,0,1,0.29,408,15,0,4,0,0,1,1,0,0,1,0.27,433,15,0,5,1,0,0,1,0,0,1,0.25,433,15,0,5,1,0,1,1,0,0,1,0.24,458,15,0,5,0,0,0,1,0,0,1,0.24,433,15,0,5,0,0,1,1,0,0,1,0.23,458,15,0,6,1,0,0,1,0,0,1,0.22,458,15,0,6,1,0,1,1,0,0,1,0.21,483,15,0,6,0,0,0,1,0,0,1,0.21,458,15,0,6,0,0,1,1,0,0,1,0.2,483,15,0,7,1,0,0,1,0,0,1,0.19,483,15,0,7,1,0,1,1,0,0,1,0.18,508,15,0,7,0,0,0,1,0,0,1,0.19,483,15,0,7,0,0,1,1,0,0,1,0.18,508,15,1,2,1,0,0,1,0,0,1,0.45,358,15,1,2,1,0,1,1,0,0,1,0.41,383,15,1,2,0,0,0,1,0,0,1,0.44,358,15,1,2,0,0,1,1,0,0,1,0.4,383,15,1,3,1,0,0,1,0,0,1,0.35,383,15,1,3,1,0,1,1,0,0,1,0.32,408,15,1,3,0,0,0,1,0,0,1,0.35,383,15,1,3,0,0,1,1,0,0,1,0.32,408,15,1,4,1,0,0,1,0,0,1,0.29,408,15,1,4,1,0,1,1,0,0,1,0.27,433,15,1,4,0,0,0,1,0,0,1,0.28,408,15,1,4,0,0,1,1,0,0,1,0.27,433,15,1,5,1,0,0,1,0,0,1,0.25,433,15,1,5,1,0,1,1,0,0,1,0.23,458,15,1,5,0,0,0,1,0,0,1,0.24,433,15,1,5,0,0,1,1,0,0,1,0.23,458,15,1,6,1,0,0,1,0,0,1,0.21,458,15,1,6,1,0,1,1,0,0,1,0.2,483,15,1,6,0,0,0,1,0,0,1,0.21,458,15,1,6,0,0,1,1,0,0,1,0.2,483,15,1,7,1,0,0,1,0,0,1,0.19,483,15,1,7,1,0,1,1,0,0,1,0.18,508,15,1,7,0,0,0,1,0,0,1,0.19,483,15,1,7,0,0,1,1,0,0,1,0.18,508,15,3,2,1,0,0,1,0,0,1,0.39,358,15,3,2,1,0,1,1,0,0,1,0.36,383,15,3,2,0,0,0,1,0,0,1,0.39,358,15,3,2,0,0,1,1,0,0,1,0.36,383,15,3,3,1,0,0,1,0,0,1,0.29,383,15,3,3,1,0,1,1,0,0,1,0.27,408,15,3,3,0,0,0,1,0,0,1,0.28,383,15,3,3,0,0,1,1,0,0,1,0.26,408,15,3,4,1,0,0,1,0,0,1,0.23,408,15,3,4,1,0,1,1,0,0,1,0.22,433,15,3,4,0,0,0,1,0,0,1,0.22,408,15,3,4,0,0,1,1,0,0,1,0.21,433,15,3,5,1,0,0,1,0,0,1,0.19,433,15,3,5,1,0,1,1,0,0,1,0.18,458,15,3,5,0,0,0,1,0,0,1,0.18,433,15,3,5,0,0,1,1,0,0,1,0.18,458,15,3,6,1,0,0,1,0,0,1,0.16,458,15,3,6,1,0,1,1,0,0,1,0.16,483,15,3,6,0,0,0,1,0,0,1,0.16,458,15,3,6,0,0,1,1,0,0,1,0.15,483,15,3,7,1,0,0,1,0,0,1,0.14,483,15,3,7,1,0,1,1,0,0,1,0.14,508,15,3,7,0,0,0,1,0,0,1,0.14,483,15,3,7,0,0,1,1,0,0,1,0.13,508,16,0,2,1,0,0,1,1,0,0,0.84,340,16,0,2,1,0,1,1,1,0,0,0.83,365,16,0,2,0,0,0,1,1,0,0,0.82,340,16,0,2,0,0,1,1,1,0,0,0.81,365,16,0,3,1,0,0,1,1,0,0,0.55,365,16,0,3,1,0,1,1,1,0,0,0.55,390,16,0,3,0,0,0,1,1,0,0,0.54,365,16,0,3,0,0,1,1,1,0,0,0.54,390,16,0,4,1,0,0,1,1,0,0,0.42,390,16,0,4,1,0,1,1,1,0,0,0.41,415,16,0,4,0,0,0,1,1,0,0,0.41,390,16,0,4,0,0,1,1,1,0,0,0.4,415,16,0,5,1,0,0,1,1,0,0,0.33,415,16,0,5,1,0,1,1,1,0,0,0.33,440,16,0,5,0,0,0,1,1,0,0,0.32,415,16,0,5,0,0,1,1,1,0,0,0.32,440,16,0,6,1,0,0,1,1,0,0,0.28,440,16,0,6,1,0,1,1,1,0,0,0.28,465,16,0,6,0,0,0,1,1,0,0,0.27,440,16,0,6,0,0,1,1,1,0,0,0.27,465,16,0,7,1,0,0,1,1,0,0,0.24,465,16,0,7,1,0,1,1,1,0,0,0.24,490,16,0,7,0,0,0,1,1,0,0,0.23,465,16,0,7,0,0,1,1,1,0,0,0.23,490,16,1,2,1,0,0,1,1,0,0,0.82,340,16,1,2,1,0,1,1,1,0,0,0.81,365,16,1,2,0,0,0,1,1,0,0,0.8,340,16,1,2,0,0,1,1,1,0,0,0.79,365,16,1,3,1,0,0,1,1,0,0,0.54,365,16,1,3,1,0,1,1,1,0,0,0.54,390,16,1,3,0,0,0,1,1,0,0,0.53,365,16,1,3,0,0,1,1,1,0,0,0.53,390,16,1,4,1,0,0,1,1,0,0,0.41,390,16,1,4,1,0,1,1,1,0,0,0.4,415,16,1,4,0,0,0,1,1,0,0,0.4,390,16,1,4,0,0,1,1,1,0,0,0.39,415,16,1,5,1,0,0,1,1,0,0,0.33,415,16,1,5,1,0,1,1,1,0,0,0.32,440,16,1,5,0,0,0,1,1,0,0,0.32,415,16,1,5,0,0,1,1,1,0,0,0.32,440,16,1,6,1,0,0,1,1,0,0,0.27,440,16,1,6,1,0,1,1,1,0,0,0.27,465,16,1,6,0,0,0,1,1,0,0,0.26,440,16,1,6,0,0,1,1,1,0,0,0.26,465,16,1,7,1,0,0,1,1,0,0,0.23,465,16,1,7,1,0,1,1,1,0,0,0.23,490,16,1,7,0,0,0,1,1,0,0,0.23,465,16,1,7,0,0,1,1,1,0,0,0.23,490,16,3,2,1,0,0,1,1,0,0,0.65,340,16,3,2,1,0,1,1,1,0,0,0.65,365,16,3,2,0,0,0,1,1,0,0,0.63,340,16,3,2,0,0,1,1,1,0,0,0.63,365,16,3,3,1,0,0,1,1,0,0,0.41,365,16,3,3,1,0,1,1,1,0,0,0.4,390,16,3,3,0,0,0,1,1,0,0,0.39,365,16,3,3,0,0,1,1,1,0,0,0.39,390,16,3,4,1,0,0,1,1,0,0,0.3,390,16,3,4,1,0,1,1,1,0,0,0.3,415,16,3,4,0,0,0,1,1,0,0,0.29,390,16,3,4,0,0,1,1,1,0,0,0.28,415,16,3,5,1,0,0,1,1,0,0,0.23,415,16,3,5,1,0,1,1,1,0,0,0.23,440,16,3,5,0,0,0,1,1,0,0,0.23,415,16,3,5,0,0,1,1,1,0,0,0.22,440,16,3,6,1,0,0,1,1,0,0,0.19,440,16,3,6,1,0,1,1,1,0,0,0.19,465,16,3,6,0,0,0,1,1,0,0,0.19,440,16,3,6,0,0,1,1,1,0,0,0.19,465,16,3,7,1,0,0,1,1,0,0,0.17,465,16,3,7,1,0,1,1,1,0,0,0.17,490,16,3,7,0,0,0,1,1,0,0,0.16,465,16,3,7,0,0,1,1,1,0,0,0.16,490,17,0,2,1,0,0,1,1,0,1,0.74,358,17,0,2,1,0,1,1,1,0,1,0.73,383,17,0,2,0,0,0,1,1,0,1,0.73,358,17,0,2,0,0,1,1,1,0,1,0.72,383,17,0,3,1,0,0,1,1,0,1,0.51,383,17,0,3,1,0,1,1,1,0,1,0.51,408,17,0,3,0,0,0,1,1,0,1,0.5,383,17,0,3,0,0,1,1,1,0,1,0.5,408,17,0,4,1,0,0,1,1,0,1,0.39,408,17,0,4,1,0,1,1,1,0,1,0.39,433,17,0,4,0,0,0,1,1,0,1,0.38,408,17,0,4,0,0,1,1,1,0,1,0.38,433,17,0,5,1,0,0,1,1,0,1,0.32,433,17,0,5,1,0,1,1,1,0,1,0.31,458,17,0,5,0,0,0,1,1,0,1,0.31,433,17,0,5,0,0,1,1,1,0,1,0.31,458,17,0,6,1,0,0,1,1,0,1,0.26,458,17,0,6,1,0,1,1,1,0,1,0.26,483,17,0,6,0,0,0,1,1,0,1,0.26,458,17,0,6,0,0,1,1,1,0,1,0.26,483,17,0,7,1,0,0,1,1,0,1,0.23,483,17,0,7,1,0,1,1,1,0,1,0.23,508,17,0,7,0,0,0,1,1,0,1,0.22,483,17,0,7,0,0,1,1,1,0,1,0.22,508,17,1,2,1,0,0,1,1,0,1,0.73,358,17,1,2,1,0,1,1,1,0,1,0.72,383,17,1,2,0,0,0,1,1,0,1,0.72,358,17,1,2,0,0,1,1,1,0,1,0.71,383,17,1,3,1,0,0,1,1,0,1,0.5,383,17,1,3,1,0,1,1,1,0,1,0.5,408,17,1,3,0,0,0,1,1,0,1,0.49,383,17,1,3,0,0,1,1,1,0,1,0.49,408,17,1,4,1,0,0,1,1,0,1,0.38,408,17,1,4,1,0,1,1,1,0,1,0.38,433,17,1,4,0,0,0,1,1,0,1,0.37,408,17,1,4,0,0,1,1,1,0,1,0.37,433,17,1,5,1,0,0,1,1,0,1,0.31,433,17,1,5,1,0,1,1,1,0,1,0.31,458,17,1,5,0,0,0,1,1,0,1,0.3,433,17,1,5,0,0,1,1,1,0,1,0.3,458,17,1,6,1,0,0,1,1,0,1,0.26,458,17,1,6,1,0,1,1,1,0,1,0.26,483,17,1,6,0,0,0,1,1,0,1,0.25,458,17,1,6,0,0,1,1,1,0,1,0.25,483,17,1,7,1,0,0,1,1,0,1,0.23,483,17,1,7,1,0,1,1,1,0,1,0.23,508,17,1,7,0,0,0,1,1,0,1,0.22,483,17,1,7,0,0,1,1,1,0,1,0.22,508,17,3,2,1,0,0,1,1,0,1,0.59,358,17,3,2,1,0,1,1,1,0,1,0.59,383,17,3,2,0,0,0,1,1,0,1,0.58,358,17,3,2,0,0,1,1,1,0,1,0.57,383,17,3,3,1,0,0,1,1,0,1,0.38,383,17,3,3,1,0,1,1,1,0,1,0.38,408,17,3,3,0,0,0,1,1,0,1,0.37,383,17,3,3,0,0,1,1,1,0,1,0.37,408,17,3,4,1,0,0,1,1,0,1,0.28,408,17,3,4,1,0,1,1,1,0,1,0.28,433,17,3,4,0,0,0,1,1,0,1,0.27,408,17,3,4,0,0,1,1,1,0,1,0.27,433,17,3,5,1,0,0,1,1,0,1,0.23,433,17,3,5,1,0,1,1,1,0,1,0.23,458,17,3,5,0,0,0,1,1,0,1,0.22,433,17,3,5,0,0,1,1,1,0,1,0.22,458,17,3,6,1,0,0,1,1,0,1,0.19,458,17,3,6,1,0,1,1,1,0,1,0.19,483,17,3,6,0,0,0,1,1,0,1,0.18,458,17,3,6,0,0,1,1,1,0,1,0.18,483,17,3,7,1,0,0,1,1,0,1,0.16,483,17,3,7,1,0,1,1,1,0,1,0.16,508,17,3,7,0,0,0,1,1,0,1,0.16,483,17,3,7,0,0,1,1,1,0,1,0.16,508,18,2,0,1,0,0,0,0,1,0,0.41,282,18,2,0,1,0,1,0,0,1,0,0.38,307,18,2,0,0,0,0,0,0,1,0,0.41,282,18,2,0,0,0,1,0,0,1,0,0.38,307,18,2,1,1,0,0,0,0,1,0,0.41,307,18,2,1,1,0,1,0,0,1,0,0.38,332,18,2,1,0,0,0,0,0,1,0,0.41,307,18,2,1,0,0,1,0,0,1,0,0.38,332,18,2,2,1,0,0,0,0,1,0,0.41,332,18,2,2,1,0,1,0,0,1,0,0.38,357,18,2,2,0,0,0,0,0,1,0,0.41,332,18,2,2,0,0,1,0,0,1,0,0.38,357,18,2,3,1,0,0,0,0,1,0,0.41,357,18,2,3,1,0,1,0,0,1,0,0.38,382,18,2,3,0,0,0,0,0,1,0,0.41,357,18,2,3,0,0,1,0,0,1,0,0.38,382,18,2,4,1,0,0,0,0,1,0,0.41,382,18,2,4,1,0,1,0,0,1,0,0.38,407,18,2,4,0,0,0,0,0,1,0,0.41,382,18,2,4,0,0,1,0,0,1,0,0.38,407,18,2,5,1,0,0,0,0,1,0,0.41,407,18,2,5,1,0,1,0,0,1,0,0.38,432,18,2,5,0,0,0,0,0,1,0,0.41,407,18,2,5,0,0,1,0,0,1,0,0.38,432,18,2,6,1,0,0,0,0,1,0,0.41,432,18,2,6,1,0,1,0,0,1,0,0.38,457,18,2,6,0,0,0,0,0,1,0,0.41,432,18,2,6,0,0,1,0,0,1,0,0.38,457,18,2,7,1,0,0,0,0,1,0,0.41,457,18,2,7,1,0,1,0,0,1,0,0.38,482,18,2,7,0,0,0,0,0,1,0,0.41,457,18,2,7,0,0,1,0,0,1,0,0.38,482,19,2,0,1,0,0,0,0,1,1,0.39,300,19,2,0,1,0,1,0,0,1,1,0.36,325,19,2,0,0,0,0,0,0,1,1,0.39,300,19,2,0,0,0,1,0,0,1,1,0.35,325,19,2,1,1,0,0,0,0,1,1,0.39,325,19,2,1,1,0,1,0,0,1,1,0.36,350,19,2,1,0,0,0,0,0,1,1,0.39,325,19,2,1,0,0,1,0,0,1,1,0.35,350,19,2,2,1,0,0,0,0,1,1,0.39,350,19,2,2,1,0,1,0,0,1,1,0.36,375,19,2,2,0,0,0,0,0,1,1,0.39,350,19,2,2,0,0,1,0,0,1,1,0.35,375,19,2,3,1,0,0,0,0,1,1,0.39,375,19,2,3,1,0,1,0,0,1,1,0.36,400,19,2,3,0,0,0,0,0,1,1,0.39,375,19,2,3,0,0,1,0,0,1,1,0.35,400,19,2,4,1,0,0,0,0,1,1,0.39,400,19,2,4,1,0,1,0,0,1,1,0.36,425,19,2,4,0,0,0,0,0,1,1,0.39,400,19,2,4,0,0,1,0,0,1,1,0.35,425,19,2,5,1,0,0,0,0,1,1,0.39,425,19,2,5,1,0,1,0,0,1,1,0.35,450,19,2,5,0,0,0,0,0,1,1,0.39,425,19,2,5,0,0,1,0,0,1,1,0.35,450,19,2,6,1,0,0,0,0,1,1,0.39,450,19,2,6,1,0,1,0,0,1,1,0.35,475,19,2,6,0,0,0,0,0,1,1,0.39,450,19,2,6,0,0,1,0,0,1,1,0.35,475,19,2,7,1,0,0,0,0,1,1,0.39,475,19,2,7,1,0,1,0,0,1,1,0.35,500,19,2,7,0,0,0,0,0,1,1,0.39,475,19,2,7,0,0,1,0,0,1,1,0.35,500,20,0,0,1,0,0,0,0,1,0,0.35,282,20,0,0,1,0,1,0,0,1,0,0.32,307,20,0,0,0,0,0,0,0,1,0,0.35,282,20,0,0,0,0,1,0,0,1,0,0.32,307,20,0,1,1,0,0,0,0,1,0,0.29,307,20,0,1,1,0,1,0,0,1,0,0.27,332,20,0,1,0,0,0,0,0,1,0,0.29,307,20,0,1,0,0,1,0,0,1,0,0.27,332,20,0,2,1,0,0,0,0,1,0,0.25,332,20,0,2,1,0,1,0,0,1,0,0.23,357,20,0,2,0,0,0,0,0,1,0,0.24,332,20,0,2,0,0,1,0,0,1,0,0.23,357,20,0,3,1,0,0,0,0,1,0,0.21,357,20,0,3,1,0,1,0,0,1,0,0.2,382,20,0,3,0,0,0,0,0,1,0,0.21,357,20,0,3,0,0,1,0,0,1,0,0.2,382,20,0,4,1,0,0,0,0,1,0,0.19,382,20,0,4,1,0,1,0,0,1,0,0.18,407,20,0,4,0,0,0,0,0,1,0,0.19,382,20,0,4,0,0,1,0,0,1,0,0.18,407,20,0,5,1,0,0,0,0,1,0,0.17,407,20,0,5,1,0,1,0,0,1,0,0.16,432,20,0,5,0,0,0,0,0,1,0,0.17,407,20,0,5,0,0,1,0,0,1,0,0.16,432,20,0,6,1,0,0,0,0,1,0,0.15,432,20,0,6,1,0,1,0,0,1,0,0.15,457,20,0,6,0,0,0,0,0,1,0,0.15,432,20,0,6,0,0,1,0,0,1,0,0.15,457,20,0,7,1,0,0,0,0,1,0,0.14,457,20,0,7,1,0,1,0,0,1,0,0.14,482,20,0,7,0,0,0,0,0,1,0,0.14,457,20,0,7,0,0,1,0,0,1,0,0.13,482,20,1,0,1,0,0,0,0,1,0,0.35,282,20,1,0,1,0,1,0,0,1,0,0.32,307,20,1,0,0,0,0,0,0,1,0,0.34,282,20,1,0,0,0,1,0,0,1,0,0.32,307,20,1,1,1,0,0,0,0,1,0,0.28,307,20,1,1,1,0,1,0,0,1,0,0.27,332,20,1,1,0,0,0,0,0,1,0,0.28,307,20,1,1,0,0,1,0,0,1,0,0.26,332,20,1,2,1,0,0,0,0,1,0,0.24,332,20,1,2,1,0,1,0,0,1,0,0.23,357,20,1,2,0,0,0,0,0,1,0,0.24,332,20,1,2,0,0,1,0,0,1,0,0.23,357,20,1,3,1,0,0,0,0,1,0,0.21,357,20,1,3,1,0,1,0,0,1,0,0.2,382,20,1,3,0,0,0,0,0,1,0,0.21,357,20,1,3,0,0,1,0,0,1,0,0.2,382,20,1,4,1,0,0,0,0,1,0,0.19,382,20,1,4,1,0,1,0,0,1,0,0.18,407,20,1,4,0,0,0,0,0,1,0,0.18,382,20,1,4,0,0,1,0,0,1,0,0.18,407,20,1,5,1,0,0,0,0,1,0,0.17,407,20,1,5,1,0,1,0,0,1,0,0.16,432,20,1,5,0,0,0,0,0,1,0,0.17,407,20,1,5,0,0,1,0,0,1,0,0.16,432,20,1,6,1,0,0,0,0,1,0,0.15,432,20,1,6,1,0,1,0,0,1,0,0.15,457,20,1,6,0,0,0,0,0,1,0,0.15,432,20,1,6,0,0,1,0,0,1,0,0.15,457,20,1,7,1,0,0,0,0,1,0,0.14,457,20,1,7,1,0,1,0,0,1,0,0.14,482,20,1,7,0,0,0,0,0,1,0,0.14,457,20,1,7,0,0,1,0,0,1,0,0.13,482,20,3,0,1,0,0,0,0,1,0,0.31,282,20,3,0,1,0,1,0,0,1,0,0.29,307,20,3,0,0,0,0,0,0,1,0,0.31,282,20,3,0,0,0,1,0,0,1,0,0.29,307,20,3,1,1,0,0,0,0,1,0,0.24,307,20,3,1,1,0,1,0,0,1,0,0.23,332,20,3,1,0,0,0,0,0,1,0,0.24,307,20,3,1,0,0,1,0,0,1,0,0.23,332,20,3,2,1,0,0,0,0,1,0,0.2,332,20,3,2,1,0,1,0,0,1,0,0.19,357,20,3,2,0,0,0,0,0,1,0,0.19,332,20,3,2,0,0,1,0,0,1,0,0.19,357,20,3,3,1,0,0,0,0,1,0,0.17,357,20,3,3,1,0,1,0,0,1,0,0.16,382,20,3,3,0,0,0,0,0,1,0,0.16,357,20,3,3,0,0,1,0,0,1,0,0.16,382,20,3,4,1,0,0,0,0,1,0,0.15,382,20,3,4,1,0,1,0,0,1,0,0.14,407,20,3,4,0,0,0,0,0,1,0,0.14,382,20,3,4,0,0,1,0,0,1,0,0.14,407,20,3,5,1,0,0,0,0,1,0,0.13,407,20,3,5,1,0,1,0,0,1,0,0.13,432,20,3,5,0,0,0,0,0,1,0,0.13,407,20,3,5,0,0,1,0,0,1,0,0.12,432,20,3,6,1,0,0,0,0,1,0,0.12,432,20,3,6,1,0,1,0,0,1,0,0.11,457,20,3,6,0,0,0,0,0,1,0,0.11,432,20,3,6,0,0,1,0,0,1,0,0.11,457,20,3,7,1,0,0,0,0,1,0,0.11,457,20,3,7,1,0,1,0,0,1,0,0.1,482,20,3,7,0,0,0,0,0,1,0,0.1,457,20,3,7,0,0,1,0,0,1,0,0.1,482,21,0,0,1,0,0,0,0,1,1,0.33,300,21,0,0,1,0,1,0,0,1,1,0.31,325,21,0,0,0,0,0,0,0,1,1,0.33,300,21,0,0,0,0,1,0,0,1,1,0.31,325,21,0,1,1,0,0,0,0,1,1,0.28,325,21,0,1,1,0,1,0,0,1,1,0.26,350,21,0,1,0,0,0,0,0,1,1,0.27,325,21,0,1,0,0,1,0,0,1,1,0.26,350,21,0,2,1,0,0,0,0,1,1,0.24,350,21,0,2,1,0,1,0,0,1,1,0.22,375,21,0,2,0,0,0,0,0,1,1,0.23,350,21,0,2,0,0,1,0,0,1,1,0.22,375,21,0,3,1,0,0,0,0,1,1,0.21,375,21,0,3,1,0,1,0,0,1,1,0.2,400,21,0,3,0,0,0,0,0,1,1,0.2,375,21,0,3,0,0,1,0,0,1,1,0.19,400,21,0,4,1,0,0,0,0,1,1,0.18,400,21,0,4,1,0,1,0,0,1,1,0.18,425,21,0,4,0,0,0,0,0,1,1,0.18,400,21,0,4,0,0,1,0,0,1,1,0.17,425,21,0,5,1,0,0,0,0,1,1,0.17,425,21,0,5,1,0,1,0,0,1,1,0.16,450,21,0,5,0,0,0,0,0,1,1,0.16,425,21,0,5,0,0,1,0,0,1,1,0.16,450,21,0,6,1,0,0,0,0,1,1,0.15,450,21,0,6,1,0,1,0,0,1,1,0.15,475,21,0,6,0,0,0,0,0,1,1,0.15,450,21,0,6,0,0,1,0,0,1,1,0.14,475,21,0,7,1,0,0,0,0,1,1,0.14,475,21,0,7,1,0,1,0,0,1,1,0.13,500,21,0,7,0,0,0,0,0,1,1,0.13,475,21,0,7,0,0,1,0,0,1,1,0.13,500,21,1,0,1,0,0,0,0,1,1,0.33,300,21,1,0,1,0,1,0,0,1,1,0.31,325,21,1,0,0,0,0,0,0,1,1,0.33,300,21,1,0,0,0,1,0,0,1,1,0.3,325,21,1,1,1,0,0,0,0,1,1,0.27,325,21,1,1,1,0,1,0,0,1,1,0.26,350,21,1,1,0,0,0,0,0,1,1,0.27,325,21,1,1,0,0,1,0,0,1,1,0.25,350,21,1,2,1,0,0,0,0,1,1,0.23,350,21,1,2,1,0,1,0,0,1,1,0.22,375,21,1,2,0,0,0,0,0,1,1,0.23,350,21,1,2,0,0,1,0,0,1,1,0.22,375,21,1,3,1,0,0,0,0,1,1,0.2,375,21,1,3,1,0,1,0,0,1,1,0.2,400,21,1,3,0,0,0,0,0,1,1,0.2,375,21,1,3,0,0,1,0,0,1,1,0.19,400,21,1,4,1,0,0,0,0,1,1,0.18,400,21,1,4,1,0,1,0,0,1,1,0.17,425,21,1,4,0,0,0,0,0,1,1,0.18,400,21,1,4,0,0,1,0,0,1,1,0.17,425,21,1,5,1,0,0,0,0,1,1,0.16,425,21,1,5,1,0,1,0,0,1,1,0.16,450,21,1,5,0,0,0,0,0,1,1,0.16,425,21,1,5,0,0,1,0,0,1,1,0.16,450,21,1,6,1,0,0,0,0,1,1,0.15,450,21,1,6,1,0,1,0,0,1,1,0.14,475,21,1,6,0,0,0,0,0,1,1,0.15,450,21,1,6,0,0,1,0,0,1,1,0.14,475,21,1,7,1,0,0,0,0,1,1,0.14,475,21,1,7,1,0,1,0,0,1,1,0.13,500,21,1,7,0,0,0,0,0,1,1,0.14,475,21,1,7,0,0,1,0,0,1,1,0.13,500,21,3,0,1,0,0,0,0,1,1,0.3,300,21,3,0,1,0,1,0,0,1,1,0.28,325,21,3,0,0,0,0,0,0,1,1,0.29,300,21,3,0,0,0,1,0,0,1,1,0.28,325,21,3,1,1,0,0,0,0,1,1,0.23,325,21,3,1,1,0,1,0,0,1,1,0.22,350,21,3,1,0,0,0,0,0,1,1,0.23,325,21,3,1,0,0,1,0,0,1,1,0.22,350,21,3,2,1,0,0,0,0,1,1,0.19,350,21,3,2,1,0,1,0,0,1,1,0.18,375,21,3,2,0,0,0,0,0,1,1,0.19,350,21,3,2,0,0,1,0,0,1,1,0.18,375,21,3,3,1,0,0,0,0,1,1,0.16,375,21,3,3,1,0,1,0,0,1,1,0.16,400,21,3,3,0,0,0,0,0,1,1,0.16,375,21,3,3,0,0,1,0,0,1,1,0.15,400,21,3,4,1,0,0,0,0,1,1,0.14,400,21,3,4,1,0,1,0,0,1,1,0.14,425,21,3,4,0,0,0,0,0,1,1,0.14,400,21,3,4,0,0,1,0,0,1,1,0.14,425,21,3,5,1,0,0,0,0,1,1,0.13,425,21,3,5,1,0,1,0,0,1,1,0.12,450,21,3,5,0,0,0,0,0,1,1,0.12,425,21,3,5,0,0,1,0,0,1,1,0.12,450,21,3,6,1,0,0,0,0,1,1,0.12,450,21,3,6,1,0,1,0,0,1,1,0.11,475,21,3,6,0,0,0,0,0,1,1,0.11,450,21,3,6,0,0,1,0,0,1,1,0.11,475,21,3,7,1,0,0,0,0,1,1,0.11,475,21,3,7,1,0,1,0,0,1,1,0.1,500,21,3,7,0,0,0,0,0,1,1,0.1,475,21,3,7,0,0,1,0,0,1,1,0.1,500,22,0,2,1,0,0,0,0,1,0,0.33,332,22,0,2,1,0,1,0,0,1,0,0.31,357,22,0,2,0,0,0,0,0,1,0,0.33,332,22,0,2,0,0,1,0,0,1,0,0.3,357,22,0,3,1,0,0,0,0,1,0,0.27,357,22,0,3,1,0,1,0,0,1,0,0.26,382,22,0,3,0,0,0,0,0,1,0,0.27,357,22,0,3,0,0,1,0,0,1,0,0.26,382,22,0,4,1,0,0,0,0,1,0,0.24,382,22,0,4,1,0,1,0,0,1,0,0.22,407,22,0,4,0,0,0,0,0,1,0,0.23,382,22,0,4,0,0,1,0,0,1,0,0.22,407,22,0,5,1,0,0,0,0,1,0,0.21,407,22,0,5,1,0,1,0,0,1,0,0.2,432,22,0,5,0,0,0,0,0,1,0,0.2,407,22,0,5,0,0,1,0,0,1,0,0.19,432,22,0,6,1,0,0,0,0,1,0,0.18,432,22,0,6,1,0,1,0,0,1,0,0.18,457,22,0,6,0,0,0,0,0,1,0,0.18,432,22,0,6,0,0,1,0,0,1,0,0.17,457,22,0,7,1,0,0,0,0,1,0,0.16,457,22,0,7,1,0,1,0,0,1,0,0.16,482,22,0,7,0,0,0,0,0,1,0,0.16,457,22,0,7,0,0,1,0,0,1,0,0.16,482,22,1,2,1,0,0,0,0,1,0,0.33,332,22,1,2,1,0,1,0,0,1,0,0.3,357,22,1,2,0,0,0,0,0,1,0,0.32,332,22,1,2,0,0,1,0,0,1,0,0.3,357,22,1,3,1,0,0,0,0,1,0,0.27,357,22,1,3,1,0,1,0,0,1,0,0.26,382,22,1,3,0,0,0,0,0,1,0,0.27,357,22,1,3,0,0,1,0,0,1,0,0.25,382,22,1,4,1,0,0,0,0,1,0,0.23,382,22,1,4,1,0,1,0,0,1,0,0.22,407,22,1,4,0,0,0,0,0,1,0,0.23,382,22,1,4,0,0,1,0,0,1,0,0.22,407,22,1,5,1,0,0,0,0,1,0,0.2,407,22,1,5,1,0,1,0,0,1,0,0.19,432,22,1,5,0,0,0,0,0,1,0,0.2,407,22,1,5,0,0,1,0,0,1,0,0.19,432,22,1,6,1,0,0,0,0,1,0,0.18,432,22,1,6,1,0,1,0,0,1,0,0.17,457,22,1,6,0,0,0,0,0,1,0,0.18,432,22,1,6,0,0,1,0,0,1,0,0.17,457,22,1,7,1,0,0,0,0,1,0,0.16,457,22,1,7,1,0,1,0,0,1,0,0.16,482,22,1,7,0,0,0,0,0,1,0,0.16,457,22,1,7,0,0,1,0,0,1,0,0.15,482,22,3,2,1,0,0,0,0,1,0,0.3,332,22,3,2,1,0,1,0,0,1,0,0.28,357,22,3,2,0,0,0,0,0,1,0,0.29,332,22,3,2,0,0,1,0,0,1,0,0.27,357,22,3,3,1,0,0,0,0,1,0,0.23,357,22,3,3,1,0,1,0,0,1,0,0.22,382,22,3,3,0,0,0,0,0,1,0,0.23,357,22,3,3,0,0,1,0,0,1,0,0.22,382,22,3,4,1,0,0,0,0,1,0,0.19,382,22,3,4,1,0,1,0,0,1,0,0.18,407,22,3,4,0,0,0,0,0,1,0,0.19,382,22,3,4,0,0,1,0,0,1,0,0.18,407,22,3,5,1,0,0,0,0,1,0,0.16,407,22,3,5,1,0,1,0,0,1,0,0.16,432,22,3,5,0,0,0,0,0,1,0,0.16,407,22,3,5,0,0,1,0,0,1,0,0.15,432,22,3,6,1,0,0,0,0,1,0,0.14,432,22,3,6,1,0,1,0,0,1,0,0.14,457,22,3,6,0,0,0,0,0,1,0,0.14,432,22,3,6,0,0,1,0,0,1,0,0.13,457,22,3,7,1,0,0,0,0,1,0,0.13,457,22,3,7,1,0,1,0,0,1,0,0.12,482,22,3,7,0,0,0,0,0,1,0,0.12,457,22,3,7,0,0,1,0,0,1,0,0.12,482,23,0,2,1,0,0,0,0,1,1,0.31,350,23,0,2,1,0,1,0,0,1,1,0.29,375,23,0,2,0,0,0,0,0,1,1,0.31,350,23,0,2,0,0,1,0,0,1,1,0.29,375,23,0,3,1,0,0,0,0,1,1,0.26,375,23,0,3,1,0,1,0,0,1,1,0.25,400,23,0,3,0,0,0,0,0,1,1,0.26,375,23,0,3,0,0,1,0,0,1,1,0.25,400,23,0,4,1,0,0,0,0,1,1,0.23,400,23,0,4,1,0,1,0,0,1,1,0.22,425,23,0,4,0,0,0,0,0,1,1,0.22,400,23,0,4,0,0,1,0,0,1,1,0.21,425,23,0,5,1,0,0,0,0,1,1,0.2,425,23,0,5,1,0,1,0,0,1,1,0.19,450,23,0,5,0,0,0,0,0,1,1,0.2,425,23,0,5,0,0,1,0,0,1,1,0.19,450,23,0,6,1,0,0,0,0,1,1,0.18,450,23,0,6,1,0,1,0,0,1,1,0.17,475,23,0,6,0,0,0,0,0,1,1,0.18,450,23,0,6,0,0,1,0,0,1,1,0.17,475,23,0,7,1,0,0,0,0,1,1,0.16,475,23,0,7,1,0,1,0,0,1,1,0.15,500,23,0,7,0,0,0,0,0,1,1,0.16,475,23,0,7,0,0,1,0,0,1,1,0.15,500,23,1,2,1,0,0,0,0,1,1,0.31,350,23,1,2,1,0,1,0,0,1,1,0.29,375,23,1,2,0,0,0,0,0,1,1,0.31,350,23,1,2,0,0,1,0,0,1,1,0.29,375,23,1,3,1,0,0,0,0,1,1,0.26,375,23,1,3,1,0,1,0,0,1,1,0.25,400,23,1,3,0,0,0,0,0,1,1,0.26,375,23,1,3,0,0,1,0,0,1,1,0.24,400,23,1,4,1,0,0,0,0,1,1,0.22,400,23,1,4,1,0,1,0,0,1,1,0.21,425,23,1,4,0,0,0,0,0,1,1,0.22,400,23,1,4,0,0,1,0,0,1,1,0.21,425,23,1,5,1,0,0,0,0,1,1,0.2,425,23,1,5,1,0,1,0,0,1,1,0.19,450,23,1,5,0,0,0,0,0,1,1,0.19,425,23,1,5,0,0,1,0,0,1,1,0.19,450,23,1,6,1,0,0,0,0,1,1,0.18,450,23,1,6,1,0,1,0,0,1,1,0.17,475,23,1,6,0,0,0,0,0,1,1,0.17,450,23,1,6,0,0,1,0,0,1,1,0.17,475,23,1,7,1,0,0,0,0,1,1,0.16,475,23,1,7,1,0,1,0,0,1,1,0.15,500,23,1,7,0,0,0,0,0,1,1,0.16,475,23,1,7,0,0,1,0,0,1,1,0.15,500,23,3,2,1,0,0,0,0,1,1,0.28,350,23,3,2,1,0,1,0,0,1,1,0.27,375,23,3,2,0,0,0,0,0,1,1,0.28,350,23,3,2,0,0,1,0,0,1,1,0.26,375,23,3,3,1,0,0,0,0,1,1,0.22,375,23,3,3,1,0,1,0,0,1,1,0.21,400,23,3,3,0,0,0,0,0,1,1,0.22,375,23,3,3,0,0,1,0,0,1,1,0.21,400,23,3,4,1,0,0,0,0,1,1,0.19,400,23,3,4,1,0,1,0,0,1,1,0.18,425,23,3,4,0,0,0,0,0,1,1,0.18,400,23,3,4,0,0,1,0,0,1,1,0.17,425,23,3,5,1,0,0,0,0,1,1,0.16,425,23,3,5,1,0,1,0,0,1,1,0.15,450,23,3,5,0,0,0,0,0,1,1,0.16,425,23,3,5,0,0,1,0,0,1,1,0.15,450,23,3,6,1,0,0,0,0,1,1,0.14,450,23,3,6,1,0,1,0,0,1,1,0.14,475,23,3,6,0,0,0,0,0,1,1,0.14,450,23,3,6,0,0,1,0,0,1,1,0.13,475,23,3,7,1,0,0,0,0,1,1,0.13,475,23,3,7,1,0,1,0,0,1,1,0.12,500,23,3,7,0,0,0,0,0,1,1,0.12,475,23,3,7,0,0,1,0,0,1,1,0.12,500,24,2,0,1,0,0,1,0,1,0,0.73,282,24,2,0,1,0,1,1,0,1,0,0.63,307,24,2,0,0,0,0,1,0,1,0,0.73,282,24,2,0,0,0,1,1,0,1,0,0.63,307,24,2,1,1,0,0,1,0,1,0,0.73,307,24,2,1,1,0,1,1,0,1,0,0.63,332,24,2,1,0,0,0,1,0,1,0,0.73,307,24,2,1,0,0,1,1,0,1,0,0.63,332,24,2,2,1,0,0,1,0,1,0,0.73,332,24,2,2,1,0,1,1,0,1,0,0.63,357,24,2,2,0,0,0,1,0,1,0,0.73,332,24,2,2,0,0,1,1,0,1,0,0.63,357,24,2,3,1,0,0,1,0,1,0,0.73,357,24,2,3,1,0,1,1,0,1,0,0.63,382,24,2,3,0,0,0,1,0,1,0,0.73,357,24,2,3,0,0,1,1,0,1,0,0.63,382,24,2,4,1,0,0,1,0,1,0,0.73,382,24,2,4,1,0,1,1,0,1,0,0.63,407,24,2,4,0,0,0,1,0,1,0,0.73,382,24,2,4,0,0,1,1,0,1,0,0.63,407,24,2,5,1,0,0,1,0,1,0,0.73,407,24,2,5,1,0,1,1,0,1,0,0.63,432,24,2,5,0,0,0,1,0,1,0,0.73,407,24,2,5,0,0,1,1,0,1,0,0.63,432,24,2,6,1,0,0,1,0,1,0,0.73,432,24,2,6,1,0,1,1,0,1,0,0.63,457,24,2,6,0,0,0,1,0,1,0,0.73,432,24,2,6,0,0,1,1,0,1,0,0.63,457,24,2,7,1,0,0,1,0,1,0,0.73,457,24,2,7,1,0,1,1,0,1,0,0.63,482,24,2,7,0,0,0,1,0,1,0,0.73,457,24,2,7,0,0,1,1,0,1,0,0.63,482,25,2,0,1,0,0,1,0,1,1,0.66,300,25,2,0,1,0,1,1,0,1,1,0.57,325,25,2,0,0,0,0,1,0,1,1,0.66,300,25,2,0,0,0,1,1,0,1,1,0.57,325,25,2,1,1,0,0,1,0,1,1,0.66,325,25,2,1,1,0,1,1,0,1,1,0.57,350,25,2,1,0,0,0,1,0,1,1,0.66,325,25,2,1,0,0,1,1,0,1,1,0.57,350,25,2,2,1,0,0,1,0,1,1,0.66,350,25,2,2,1,0,1,1,0,1,1,0.57,375,25,2,2,0,0,0,1,0,1,1,0.66,350,25,2,2,0,0,1,1,0,1,1,0.57,375,25,2,3,1,0,0,1,0,1,1,0.66,375,25,2,3,1,0,1,1,0,1,1,0.57,400,25,2,3,0,0,0,1,0,1,1,0.66,375,25,2,3,0,0,1,1,0,1,1,0.57,400,25,2,4,1,0,0,1,0,1,1,0.66,400,25,2,4,1,0,1,1,0,1,1,0.57,425,25,2,4,0,0,0,1,0,1,1,0.66,400,25,2,4,0,0,1,1,0,1,1,0.57,425,25,2,5,1,0,0,1,0,1,1,0.66,425,25,2,5,1,0,1,1,0,1,1,0.57,450,25,2,5,0,0,0,1,0,1,1,0.66,425,25,2,5,0,0,1,1,0,1,1,0.57,450,25,2,6,1,0,0,1,0,1,1,0.66,450,25,2,6,1,0,1,1,0,1,1,0.57,475,25,2,6,0,0,0,1,0,1,1,0.66,450,25,2,6,0,0,1,1,0,1,1,0.57,475,25,2,7,1,0,0,1,0,1,1,0.66,475,25,2,7,1,0,1,1,0,1,1,0.57,500,25,2,7,0,0,0,1,0,1,1,0.66,475,25,2,7,0,0,1,1,0,1,1,0.57,500,26,2,0,1,0,0,1,1,1,0,1.93,282,26,2,0,1,0,1,1,1,1,0,1.88,307,26,2,0,0,0,0,1,1,1,0,1.92,282,26,2,0,0,0,1,1,1,1,0,1.87,307,26,2,1,1,0,0,1,1,1,0,1.92,307,26,2,1,1,0,1,1,1,1,0,1.87,332,26,2,1,0,0,0,1,1,1,0,1.92,307,26,2,1,0,0,1,1,1,1,0,1.87,332,26,2,2,1,0,0,1,1,1,0,1.92,332,26,2,2,1,0,1,1,1,1,0,1.87,357,26,2,2,0,0,0,1,1,1,0,1.92,332,26,2,2,0,0,1,1,1,1,0,1.87,357,26,2,3,1,0,0,1,1,1,0,1.92,357,26,2,3,1,0,1,1,1,1,0,1.87,382,26,2,3,0,0,0,1,1,1,0,1.92,357,26,2,3,0,0,1,1,1,1,0,1.87,382,26,2,4,1,0,0,1,1,1,0,1.92,382,26,2,4,1,0,1,1,1,1,0,1.87,407,26,2,4,0,0,0,1,1,1,0,1.92,382,26,2,4,0,0,1,1,1,1,0,1.87,407,26,2,5,1,0,0,1,1,1,0,1.92,407,26,2,5,1,0,1,1,1,1,0,1.87,432,26,2,5,0,0,0,1,1,1,0,1.92,407,26,2,5,0,0,1,1,1,1,0,1.87,432,26,2,6,1,0,0,1,1,1,0,1.92,432,26,2,6,1,0,1,1,1,1,0,1.87,457,26,2,6,0,0,0,1,1,1,0,1.92,432,26,2,6,0,0,1,1,1,1,0,1.87,457,26,2,7,1,0,0,1,1,1,0,1.92,457,26,2,7,1,0,1,1,1,1,0,1.87,482,26,2,7,0,0,0,1,1,1,0,1.92,457,26,2,7,0,0,1,1,1,1,0,1.87,482,27,2,0,1,0,0,1,1,1,1,1.49,300,27,2,0,1,0,1,1,1,1,1,1.46,325,27,2,0,0,0,0,1,1,1,1,1.49,300,27,2,0,0,0,1,1,1,1,1,1.46,325,27,2,1,1,0,0,1,1,1,1,1.49,325,27,2,1,1,0,1,1,1,1,1,1.46,350,27,2,1,0,0,0,1,1,1,1,1.49,325,27,2,1,0,0,1,1,1,1,1,1.46,350,27,2,2,1,0,0,1,1,1,1,1.49,350,27,2,2,1,0,1,1,1,1,1,1.46,375,27,2,2,0,0,0,1,1,1,1,1.49,350,27,2,2,0,0,1,1,1,1,1,1.46,375,27,2,3,1,0,0,1,1,1,1,1.49,375,27,2,3,1,0,1,1,1,1,1,1.46,400,27,2,3,0,0,0,1,1,1,1,1.49,375,27,2,3,0,0,1,1,1,1,1,1.46,400,27,2,4,1,0,0,1,1,1,1,1.49,400,27,2,4,1,0,1,1,1,1,1,1.46,425,27,2,4,0,0,0,1,1,1,1,1.49,400,27,2,4,0,0,1,1,1,1,1,1.46,425,27,2,5,1,0,0,1,1,1,1,1.49,425,27,2,5,1,0,1,1,1,1,1,1.46,450,27,2,5,0,0,0,1,1,1,1,1.49,425,27,2,5,0,0,1,1,1,1,1,1.46,450,27,2,6,1,0,0,1,1,1,1,1.49,450,27,2,6,1,0,1,1,1,1,1,1.46,475,27,2,6,0,0,0,1,1,1,1,1.49,450,27,2,6,0,0,1,1,1,1,1,1.46,475,27,2,7,1,0,0,1,1,1,1,1.49,475,27,2,7,1,0,1,1,1,1,1,1.46,500,27,2,7,0,0,0,1,1,1,1,1.49,475,27,2,7,0,0,1,1,1,1,1,1.46,500,28,0,0,1,0,0,1,0,1,0,0.56,282,28,0,0,1,0,1,1,0,1,0,0.49,307,28,0,0,0,0,0,1,0,1,0,0.55,282,28,0,0,0,0,1,1,0,1,0,0.49,307,28,0,1,1,0,0,1,0,1,0,0.42,307,28,0,1,1,0,1,1,0,1,0,0.38,332,28,0,1,0,0,0,1,0,1,0,0.41,307,28,0,1,0,0,1,1,0,1,0,0.37,332,28,0,2,1,0,0,1,0,1,0,0.33,332,28,0,2,1,0,1,1,0,1,0,0.31,357,28,0,2,0,0,0,1,0,1,0,0.33,332,28,0,2,0,0,1,1,0,1,0,0.3,357,28,0,3,1,0,0,1,0,1,0,0.28,357,28,0,3,1,0,1,1,0,1,0,0.26,382,28,0,3,0,0,0,1,0,1,0,0.27,357,28,0,3,0,0,1,1,0,1,0,0.26,382,28,0,4,1,0,0,1,0,1,0,0.24,382,28,0,4,1,0,1,1,0,1,0,0.22,407,28,0,4,0,0,0,1,0,1,0,0.23,382,28,0,4,0,0,1,1,0,1,0,0.22,407,28,0,5,1,0,0,1,0,1,0,0.21,407,28,0,5,1,0,1,1,0,1,0,0.2,432,28,0,5,0,0,0,1,0,1,0,0.2,407,28,0,5,0,0,1,1,0,1,0,0.19,432,28,0,6,1,0,0,1,0,1,0,0.18,432,28,0,6,1,0,1,1,0,1,0,0.18,457,28,0,6,0,0,0,1,0,1,0,0.18,432,28,0,6,0,0,1,1,0,1,0,0.17,457,28,0,7,1,0,0,1,0,1,0,0.17,457,28,0,7,1,0,1,1,0,1,0,0.16,482,28,0,7,0,0,0,1,0,1,0,0.16,457,28,0,7,0,0,1,1,0,1,0,0.16,482,28,1,0,1,0,0,1,0,1,0,0.55,282,28,1,0,1,0,1,1,0,1,0,0.49,307,28,1,0,0,0,0,1,0,1,0,0.54,282,28,1,0,0,0,1,1,0,1,0,0.48,307,28,1,1,1,0,0,1,0,1,0,0.41,307,28,1,1,1,0,1,1,0,1,0,0.37,332,28,1,1,0,0,0,1,0,1,0,0.4,307,28,1,1,0,0,1,1,0,1,0,0.37,332,28,1,2,1,0,0,1,0,1,0,0.33,332,28,1,2,1,0,1,1,0,1,0,0.3,357,28,1,2,0,0,0,1,0,1,0,0.32,332,28,1,2,0,0,1,1,0,1,0,0.3,357,28,1,3,1,0,0,1,0,1,0,0.27,357,28,1,3,1,0,1,1,0,1,0,0.26,382,28,1,3,0,0,0,1,0,1,0,0.27,357,28,1,3,0,0,1,1,0,1,0,0.25,382,28,1,4,1,0,0,1,0,1,0,0.23,382,28,1,4,1,0,1,1,0,1,0,0.22,407,28,1,4,0,0,0,1,0,1,0,0.23,382,28,1,4,0,0,1,1,0,1,0,0.22,407,28,1,5,1,0,0,1,0,1,0,0.21,407,28,1,5,1,0,1,1,0,1,0,0.2,432,28,1,5,0,0,0,1,0,1,0,0.2,407,28,1,5,0,0,1,1,0,1,0,0.19,432,28,1,6,1,0,0,1,0,1,0,0.18,432,28,1,6,1,0,1,1,0,1,0,0.18,457,28,1,6,0,0,0,1,0,1,0,0.18,432,28,1,6,0,0,1,1,0,1,0,0.17,457,28,1,7,1,0,0,1,0,1,0,0.17,457,28,1,7,1,0,1,1,0,1,0,0.16,482,28,1,7,0,0,0,1,0,1,0,0.16,457,28,1,7,0,0,1,1,0,1,0,0.16,482,28,3,0,1,0,0,1,0,1,0,0.47,282,28,3,0,1,0,1,1,0,1,0,0.42,307,28,3,0,0,0,0,1,0,1,0,0.46,282,28,3,0,0,0,1,1,0,1,0,0.42,307,28,3,1,1,0,0,1,0,1,0,0.33,307,28,3,1,1,0,1,1,0,1,0,0.3,332,28,3,1,0,0,0,1,0,1,0,0.32,307,28,3,1,0,0,1,1,0,1,0,0.3,332,28,3,2,1,0,0,1,0,1,0,0.25,332,28,3,2,1,0,1,1,0,1,0,0.24,357,28,3,2,0,0,0,1,0,1,0,0.24,332,28,3,2,0,0,1,1,0,1,0,0.23,357,28,3,3,1,0,0,1,0,1,0,0.21,357,28,3,3,1,0,1,1,0,1,0,0.2,382,28,3,3,0,0,0,1,0,1,0,0.2,357,28,3,3,0,0,1,1,0,1,0,0.19,382,28,3,4,1,0,0,1,0,1,0,0.17,382,28,3,4,1,0,1,1,0,1,0,0.17,407,28,3,4,0,0,0,1,0,1,0,0.17,382,28,3,4,0,0,1,1,0,1,0,0.16,407,28,3,5,1,0,0,1,0,1,0,0.15,407,28,3,5,1,0,1,1,0,1,0,0.15,432,28,3,5,0,0,0,1,0,1,0,0.15,407,28,3,5,0,0,1,1,0,1,0,0.14,432,28,3,6,1,0,0,1,0,1,0,0.13,432,28,3,6,1,0,1,1,0,1,0,0.13,457,28,3,6,0,0,0,1,0,1,0,0.13,432,28,3,6,0,0,1,1,0,1,0,0.13,457,28,3,7,1,0,0,1,0,1,0,0.12,457,28,3,7,1,0,1,1,0,1,0,0.12,482,28,3,7,0,0,0,1,0,1,0,0.12,457,28,3,7,0,0,1,1,0,1,0,0.11,482,29,0,0,1,0,0,1,0,1,1,0.51,300,29,0,0,1,0,1,1,0,1,1,0.46,325,29,0,0,0,0,0,1,0,1,1,0.51,300,29,0,0,0,0,1,1,0,1,1,0.46,325,29,0,1,1,0,0,1,0,1,1,0.39,325,29,0,1,1,0,1,1,0,1,1,0.36,350,29,0,1,0,0,0,1,0,1,1,0.39,325,29,0,1,0,0,1,1,0,1,1,0.35,350,29,0,2,1,0,0,1,0,1,1,0.32,350,29,0,2,1,0,1,1,0,1,1,0.3,375,29,0,2,0,0,0,1,0,1,1,0.31,350,29,0,2,0,0,1,1,0,1,1,0.29,375,29,0,3,1,0,0,1,0,1,1,0.27,375,29,0,3,1,0,1,1,0,1,1,0.25,400,29,0,3,0,0,0,1,0,1,1,0.26,375,29,0,3,0,0,1,1,0,1,1,0.25,400,29,0,4,1,0,0,1,0,1,1,0.23,400,29,0,4,1,0,1,1,0,1,1,0.22,425,29,0,4,0,0,0,1,0,1,1,0.22,400,29,0,4,0,0,1,1,0,1,1,0.21,425,29,0,5,1,0,0,1,0,1,1,0.2,425,29,0,5,1,0,1,1,0,1,1,0.19,450,29,0,5,0,0,0,1,0,1,1,0.2,425,29,0,5,0,0,1,1,0,1,1,0.19,450,29,0,6,1,0,0,1,0,1,1,0.18,450,29,0,6,1,0,1,1,0,1,1,0.17,475,29,0,6,0,0,0,1,0,1,1,0.17,450,29,0,6,0,0,1,1,0,1,1,0.17,475,29,0,7,1,0,0,1,0,1,1,0.16,475,29,0,7,1,0,1,1,0,1,1,0.16,500,29,0,7,0,0,0,1,0,1,1,0.16,475,29,0,7,0,0,1,1,0,1,1,0.15,500,29,1,0,1,0,0,1,0,1,1,0.51,300,29,1,0,1,0,1,1,0,1,1,0.45,325,29,1,0,0,0,0,1,0,1,1,0.5,300,29,1,0,0,0,1,1,0,1,1,0.45,325,29,1,1,1,0,0,1,0,1,1,0.38,325,29,1,1,1,0,1,1,0,1,1,0.35,350,29,1,1,0,0,0,1,0,1,1,0.38,325,29,1,1,0,0,1,1,0,1,1,0.35,350,29,1,2,1,0,0,1,0,1,1,0.31,350,29,1,2,1,0,1,1,0,1,1,0.29,375,29,1,2,0,0,0,1,0,1,1,0.3,350,29,1,2,0,0,1,1,0,1,1,0.29,375,29,1,3,1,0,0,1,0,1,1,0.26,375,29,1,3,1,0,1,1,0,1,1,0.25,400,29,1,3,0,0,0,1,0,1,1,0.26,375,29,1,3,0,0,1,1,0,1,1,0.24,400,29,1,4,1,0,0,1,0,1,1,0.23,400,29,1,4,1,0,1,1,0,1,1,0.21,425,29,1,4,0,0,0,1,0,1,1,0.22,400,29,1,4,0,0,1,1,0,1,1,0.21,425,29,1,5,1,0,0,1,0,1,1,0.2,425,29,1,5,1,0,1,1,0,1,1,0.19,450,29,1,5,0,0,0,1,0,1,1,0.19,425,29,1,5,0,0,1,1,0,1,1,0.19,450,29,1,6,1,0,0,1,0,1,1,0.18,450,29,1,6,1,0,1,1,0,1,1,0.17,475,29,1,6,0,0,0,1,0,1,1,0.17,450,29,1,6,0,0,1,1,0,1,1,0.17,475,29,1,7,1,0,0,1,0,1,1,0.16,475,29,1,7,1,0,1,1,0,1,1,0.16,500,29,1,7,0,0,0,1,0,1,1,0.16,475,29,1,7,0,0,1,1,0,1,1,0.15,500,29,3,0,1,0,0,1,0,1,1,0.44,300,29,3,0,1,0,1,1,0,1,1,0.4,325,29,3,0,0,0,0,1,0,1,1,0.43,300,29,3,0,0,0,1,1,0,1,1,0.39,325,29,3,1,1,0,0,1,0,1,1,0.31,325,29,3,1,1,0,1,1,0,1,1,0.29,350,29,3,1,0,0,0,1,0,1,1,0.3,325,29,3,1,0,0,1,1,0,1,1,0.28,350,29,3,2,1,0,0,1,0,1,1,0.24,350,29,3,2,1,0,1,1,0,1,1,0.23,375,29,3,2,0,0,0,1,0,1,1,0.24,350,29,3,2,0,0,1,1,0,1,1,0.22,375,29,3,3,1,0,0,1,0,1,1,0.2,375,29,3,3,1,0,1,1,0,1,1,0.19,400,29,3,3,0,0,0,1,0,1,1,0.19,375,29,3,3,0,0,1,1,0,1,1,0.18,400,29,3,4,1,0,0,1,0,1,1,0.17,400,29,3,4,1,0,1,1,0,1,1,0.16,425,29,3,4,0,0,0,1,0,1,1,0.16,400,29,3,4,0,0,1,1,0,1,1,0.16,425,29,3,5,1,0,0,1,0,1,1,0.15,425,29,3,5,1,0,1,1,0,1,1,0.14,450,29,3,5,0,0,0,1,0,1,1,0.14,425,29,3,5,0,0,1,1,0,1,1,0.14,450,29,3,6,1,0,0,1,0,1,1,0.13,450,29,3,6,1,0,1,1,0,1,1,0.13,475,29,3,6,0,0,0,1,0,1,1,0.13,450,29,3,6,0,0,1,1,0,1,1,0.12,475,29,3,7,1,0,0,1,0,1,1,0.12,475,29,3,7,1,0,1,1,0,1,1,0.12,500,29,3,7,0,0,0,1,0,1,1,0.11,475,29,3,7,0,0,1,1,0,1,1,0.11,500,30,0,0,1,0,0,1,1,1,0,1.06,282,30,0,0,1,0,1,1,1,1,0,1.04,307,30,0,0,0,0,0,1,1,1,0,1.04,282,30,0,0,0,0,1,1,1,1,0,1.02,307,30,0,1,1,0,0,1,1,1,0,0.64,307,30,0,1,1,0,1,1,1,1,0,0.64,332,30,0,1,0,0,0,1,1,1,0,0.63,307,30,0,1,0,0,1,1,1,1,0,0.62,332,30,0,2,1,0,0,1,1,1,0,0.46,332,30,0,2,1,0,1,1,1,1,0,0.46,357,30,0,2,0,0,0,1,1,1,0,0.45,332,30,0,2,0,0,1,1,1,1,0,0.45,357,30,0,3,1,0,0,1,1,1,0,0.36,357,30,0,3,1,0,1,1,1,1,0,0.36,382,30,0,3,0,0,0,1,1,1,0,0.35,357,30,0,3,0,0,1,1,1,1,0,0.35,382,30,0,4,1,0,0,1,1,1,0,0.3,382,30,0,4,1,0,1,1,1,1,0,0.3,407,30,0,4,0,0,0,1,1,1,0,0.29,382,30,0,4,0,0,1,1,1,1,0,0.29,407,30,0,5,1,0,0,1,1,1,0,0.25,407,30,0,5,1,0,1,1,1,1,0,0.25,432,30,0,5,0,0,0,1,1,1,0,0.24,407,30,0,5,0,0,1,1,1,1,0,0.24,432,30,0,6,1,0,0,1,1,1,0,0.22,432,30,0,6,1,0,1,1,1,1,0,0.22,457,30,0,6,0,0,0,1,1,1,0,0.21,432,30,0,6,0,0,1,1,1,1,0,0.21,457,30,0,7,1,0,0,1,1,1,0,0.19,457,30,0,7,1,0,1,1,1,1,0,0.19,482,30,0,7,0,0,0,1,1,1,0,0.19,457,30,0,7,0,0,1,1,1,1,0,0.19,482,30,1,0,1,0,0,1,1,1,0,1.03,282,30,1,0,1,0,1,1,1,1,0,1.01,307,30,1,0,0,0,0,1,1,1,0,1.01,282,30,1,0,0,0,1,1,1,1,0,0.99,307,30,1,1,1,0,0,1,1,1,0,0.63,307,30,1,1,1,0,1,1,1,1,0,0.62,332,30,1,1,0,0,0,1,1,1,0,0.61,307,30,1,1,0,0,1,1,1,1,0,0.61,332,30,1,2,1,0,0,1,1,1,0,0.45,332,30,1,2,1,0,1,1,1,1,0,0.45,357,30,1,2,0,0,0,1,1,1,0,0.44,332,30,1,2,0,0,1,1,1,1,0,0.44,357,30,1,3,1,0,0,1,1,1,0,0.35,357,30,1,3,1,0,1,1,1,1,0,0.35,382,30,1,3,0,0,0,1,1,1,0,0.34,357,30,1,3,0,0,1,1,1,1,0,0.34,382,30,1,4,1,0,0,1,1,1,0,0.29,382,30,1,4,1,0,1,1,1,1,0,0.29,407,30,1,4,0,0,0,1,1,1,0,0.28,382,30,1,4,0,0,1,1,1,1,0,0.28,407,30,1,5,1,0,0,1,1,1,0,0.25,407,30,1,5,1,0,1,1,1,1,0,0.25,432,30,1,5,0,0,0,1,1,1,0,0.24,407,30,1,5,0,0,1,1,1,1,0,0.24,432,30,1,6,1,0,0,1,1,1,0,0.22,432,30,1,6,1,0,1,1,1,1,0,0.22,457,30,1,6,0,0,0,1,1,1,0,0.21,432,30,1,6,0,0,1,1,1,1,0,0.21,457,30,1,7,1,0,0,1,1,1,0,0.19,457,30,1,7,1,0,1,1,1,1,0,0.19,482,30,1,7,0,0,0,1,1,1,0,0.19,457,30,1,7,0,0,1,1,1,1,0,0.19,482,30,3,0,1,0,0,1,1,1,0,0.78,282,30,3,0,1,0,1,1,1,1,0,0.77,307,30,3,0,0,0,0,1,1,1,0,0.75,282,30,3,0,0,0,1,1,1,1,0,0.74,307,30,3,1,1,0,0,1,1,1,0,0.45,307,30,3,1,1,0,1,1,1,1,0,0.45,332,30,3,1,0,0,0,1,1,1,0,0.43,307,30,3,1,0,0,1,1,1,1,0,0.43,332,30,3,2,1,0,0,1,1,1,0,0.32,332,30,3,2,1,0,1,1,1,1,0,0.32,357,30,3,2,0,0,0,1,1,1,0,0.31,332,30,3,2,0,0,1,1,1,1,0,0.31,357,30,3,3,1,0,0,1,1,1,0,0.25,357,30,3,3,1,0,1,1,1,1,0,0.25,382,30,3,3,0,0,0,1,1,1,0,0.24,357,30,3,3,0,0,1,1,1,1,0,0.24,382,30,3,4,1,0,0,1,1,1,0,0.2,382,30,3,4,1,0,1,1,1,1,0,0.2,407,30,3,4,0,0,0,1,1,1,0,0.2,382,30,3,4,0,0,1,1,1,1,0,0.2,407,30,3,5,1,0,0,1,1,1,0,0.17,407,30,3,5,1,0,1,1,1,1,0,0.17,432,30,3,5,0,0,0,1,1,1,0,0.17,407,30,3,5,0,0,1,1,1,1,0,0.17,432,30,3,6,1,0,0,1,1,1,0,0.15,432,30,3,6,1,0,1,1,1,1,0,0.15,457,30,3,6,0,0,0,1,1,1,0,0.15,432,30,3,6,0,0,1,1,1,1,0,0.15,457,30,3,7,1,0,0,1,1,1,0,0.13,457,30,3,7,1,0,1,1,1,1,0,0.13,482,30,3,7,0,0,0,1,1,1,0,0.13,457,30,3,7,0,0,1,1,1,1,0,0.13,482,31,0,0,1,0,0,1,1,1,1,0.91,300,31,0,0,1,0,1,1,1,1,1,0.9,325,31,0,0,0,0,0,1,1,1,1,0.9,300,31,0,0,0,0,1,1,1,1,1,0.88,325,31,0,1,1,0,0,1,1,1,1,0.59,325,31,0,1,1,0,1,1,1,1,1,0.58,350,31,0,1,0,0,0,1,1,1,1,0.57,325,31,0,1,0,0,1,1,1,1,1,0.57,350,31,0,2,1,0,0,1,1,1,1,0.43,350,31,0,2,1,0,1,1,1,1,1,0.43,375,31,0,2,0,0,0,1,1,1,1,0.42,350,31,0,2,0,0,1,1,1,1,1,0.42,375,31,0,3,1,0,0,1,1,1,1,0.34,375,31,0,3,1,0,1,1,1,1,1,0.34,400,31,0,3,0,0,0,1,1,1,1,0.33,375,31,0,3,0,0,1,1,1,1,1,0.33,400,31,0,4,1,0,0,1,1,1,1,0.28,400,31,0,4,1,0,1,1,1,1,1,0.28,425,31,0,4,0,0,0,1,1,1,1,0.28,400,31,0,4,0,0,1,1,1,1,1,0.28,425,31,0,5,1,0,0,1,1,1,1,0.24,425,31,0,5,1,0,1,1,1,1,1,0.24,450,31,0,5,0,0,0,1,1,1,1,0.24,425,31,0,5,0,0,1,1,1,1,1,0.23,450,31,0,6,1,0,0,1,1,1,1,0.21,450,31,0,6,1,0,1,1,1,1,1,0.21,475,31,0,6,0,0,0,1,1,1,1,0.21,450,31,0,6,0,0,1,1,1,1,1,0.2,475,31,0,7,1,0,0,1,1,1,1,0.19,475,31,0,7,1,0,1,1,1,1,1,0.19,500,31,0,7,0,0,0,1,1,1,1,0.18,475,31,0,7,0,0,1,1,1,1,1,0.18,500,31,1,0,1,0,0,1,1,1,1,0.89,300,31,1,0,1,0,1,1,1,1,1,0.88,325,31,1,0,0,0,0,1,1,1,1,0.87,300,31,1,0,0,0,1,1,1,1,1,0.86,325,31,1,1,1,0,0,1,1,1,1,0.57,325,31,1,1,1,0,1,1,1,1,1,0.57,350,31,1,1,0,0,0,1,1,1,1,0.56,325,31,1,1,0,0,1,1,1,1,1,0.55,350,31,1,2,1,0,0,1,1,1,1,0.42,350,31,1,2,1,0,1,1,1,1,1,0.42,375,31,1,2,0,0,0,1,1,1,1,0.41,350,31,1,2,0,0,1,1,1,1,1,0.41,375,31,1,3,1,0,0,1,1,1,1,0.34,375,31,1,3,1,0,1,1,1,1,1,0.33,400,31,1,3,0,0,0,1,1,1,1,0.33,375,31,1,3,0,0,1,1,1,1,1,0.33,400,31,1,4,1,0,0,1,1,1,1,0.28,400,31,1,4,1,0,1,1,1,1,1,0.28,425,31,1,4,0,0,0,1,1,1,1,0.27,400,31,1,4,0,0,1,1,1,1,1,0.27,425,31,1,5,1,0,0,1,1,1,1,0.24,425,31,1,5,1,0,1,1,1,1,1,0.24,450,31,1,5,0,0,0,1,1,1,1,0.23,425,31,1,5,0,0,1,1,1,1,1,0.23,450,31,1,6,1,0,0,1,1,1,1,0.21,450,31,1,6,1,0,1,1,1,1,1,0.21,475,31,1,6,0,0,0,1,1,1,1,0.2,450,31,1,6,0,0,1,1,1,1,1,0.2,475,31,1,7,1,0,0,1,1,1,1,0.19,475,31,1,7,1,0,1,1,1,1,1,0.19,500,31,1,7,0,0,0,1,1,1,1,0.18,475,31,1,7,0,0,1,1,1,1,1,0.18,500,31,3,0,1,0,0,1,1,1,1,0.7,300,31,3,0,1,0,1,1,1,1,1,0.69,325,31,3,0,0,0,0,1,1,1,1,0.67,300,31,3,0,0,0,1,1,1,1,1,0.67,325,31,3,1,1,0,0,1,1,1,1,0.42,325,31,3,1,1,0,1,1,1,1,1,0.42,350,31,3,1,0,0,0,1,1,1,1,0.41,325,31,3,1,0,0,1,1,1,1,1,0.41,350,31,3,2,1,0,0,1,1,1,1,0.31,350,31,3,2,1,0,1,1,1,1,1,0.3,375,31,3,2,0,0,0,1,1,1,1,0.29,350,31,3,2,0,0,1,1,1,1,1,0.29,375,31,3,3,1,0,0,1,1,1,1,0.24,375,31,3,3,1,0,1,1,1,1,1,0.24,400,31,3,3,0,0,0,1,1,1,1,0.23,375,31,3,3,0,0,1,1,1,1,1,0.23,400,31,3,4,1,0,0,1,1,1,1,0.2,400,31,3,4,1,0,1,1,1,1,1,0.2,425,31,3,4,0,0,0,1,1,1,1,0.19,400,31,3,4,0,0,1,1,1,1,1,0.19,425,31,3,5,1,0,0,1,1,1,1,0.17,425,31,3,5,1,0,1,1,1,1,1,0.17,450,31,3,5,0,0,0,1,1,1,1,0.16,425,31,3,5,0,0,1,1,1,1,1,0.16,450,31,3,6,1,0,0,1,1,1,1,0.15,450,31,3,6,1,0,1,1,1,1,1,0.15,475,31,3,6,0,0,0,1,1,1,1,0.14,450,31,3,6,0,0,1,1,1,1,1,0.14,475,31,3,7,1,0,0,1,1,1,1,0.13,475,31,3,7,1,0,1,1,1,1,1,0.13,500,31,3,7,0,0,0,1,1,1,1,0.13,475,31,3,7,0,0,1,1,1,1,1,0.13,500,32,0,2,1,0,0,1,0,1,0,0.51,332,32,0,2,1,0,1,1,0,1,0,0.45,357,32,0,2,0,0,0,1,0,1,0,0.5,332,32,0,2,0,0,1,1,0,1,0,0.45,357,32,0,3,1,0,0,1,0,1,0,0.39,357,32,0,3,1,0,1,1,0,1,0,0.36,382,32,0,3,0,0,0,1,0,1,0,0.38,357,32,0,3,0,0,1,1,0,1,0,0.35,382,32,0,4,1,0,0,1,0,1,0,0.31,382,32,0,4,1,0,1,1,0,1,0,0.29,407,32,0,4,0,0,0,1,0,1,0,0.31,382,32,0,4,0,0,1,1,0,1,0,0.29,407,32,0,5,1,0,0,1,0,1,0,0.26,407,32,0,5,1,0,1,1,0,1,0,0.25,432,32,0,5,0,0,0,1,0,1,0,0.26,407,32,0,5,0,0,1,1,0,1,0,0.24,432,32,0,6,1,0,0,1,0,1,0,0.23,432,32,0,6,1,0,1,1,0,1,0,0.22,457,32,0,6,0,0,0,1,0,1,0,0.22,432,32,0,6,0,0,1,1,0,1,0,0.21,457,32,0,7,1,0,0,1,0,1,0,0.2,457,32,0,7,1,0,1,1,0,1,0,0.19,482,32,0,7,0,0,0,1,0,1,0,0.2,457,32,0,7,0,0,1,1,0,1,0,0.19,482,32,1,2,1,0,0,1,0,1,0,0.5,332,32,1,2,1,0,1,1,0,1,0,0.45,357,32,1,2,0,0,0,1,0,1,0,0.49,332,32,1,2,0,0,1,1,0,1,0,0.44,357,32,1,3,1,0,0,1,0,1,0,0.38,357,32,1,3,1,0,1,1,0,1,0,0.35,382,32,1,3,0,0,0,1,0,1,0,0.37,357,32,1,3,0,0,1,1,0,1,0,0.35,382,32,1,4,1,0,0,1,0,1,0,0.31,382,32,1,4,1,0,1,1,0,1,0,0.29,407,32,1,4,0,0,0,1,0,1,0,0.3,382,32,1,4,0,0,1,1,0,1,0,0.28,407,32,1,5,1,0,0,1,0,1,0,0.26,407,32,1,5,1,0,1,1,0,1,0,0.25,432,32,1,5,0,0,0,1,0,1,0,0.25,407,32,1,5,0,0,1,1,0,1,0,0.24,432,32,1,6,1,0,0,1,0,1,0,0.22,432,32,1,6,1,0,1,1,0,1,0,0.21,457,32,1,6,0,0,0,1,0,1,0,0.22,432,32,1,6,0,0,1,1,0,1,0,0.21,457,32,1,7,1,0,0,1,0,1,0,0.2,457,32,1,7,1,0,1,1,0,1,0,0.19,482,32,1,7,0,0,0,1,0,1,0,0.19,457,32,1,7,0,0,1,1,0,1,0,0.19,482,32,3,2,1,0,0,1,0,1,0,0.43,332,32,3,2,1,0,1,1,0,1,0,0.39,357,32,3,2,0,0,0,1,0,1,0,0.42,332,32,3,2,0,0,1,1,0,1,0,0.39,357,32,3,3,1,0,0,1,0,1,0,0.31,357,32,3,3,1,0,1,1,0,1,0,0.29,382,32,3,3,0,0,0,1,0,1,0,0.3,357,32,3,3,0,0,1,1,0,1,0,0.28,382,32,3,4,1,0,0,1,0,1,0,0.24,382,32,3,4,1,0,1,1,0,1,0,0.23,407,32,3,4,0,0,0,1,0,1,0,0.23,382,32,3,4,0,0,1,1,0,1,0,0.22,407,32,3,5,1,0,0,1,0,1,0,0.2,407,32,3,5,1,0,1,1,0,1,0,0.19,432,32,3,5,0,0,0,1,0,1,0,0.19,407,32,3,5,0,0,1,1,0,1,0,0.18,432,32,3,6,1,0,0,1,0,1,0,0.17,432,32,3,6,1,0,1,1,0,1,0,0.16,457,32,3,6,0,0,0,1,0,1,0,0.16,432,32,3,6,0,0,1,1,0,1,0,0.16,457,32,3,7,1,0,0,1,0,1,0,0.15,457,32,3,7,1,0,1,1,0,1,0,0.14,482,32,3,7,0,0,0,1,0,1,0,0.14,457,32,3,7,0,0,1,1,0,1,0,0.14,482,33,0,2,1,0,0,1,0,1,1,0.47,350,33,0,2,1,0,1,1,0,1,1,0.42,375,33,0,2,0,0,0,1,0,1,1,0.47,350,33,0,2,0,0,1,1,0,1,1,0.42,375,33,0,3,1,0,0,1,0,1,1,0.37,375,33,0,3,1,0,1,1,0,1,1,0.34,400,33,0,3,0,0,0,1,0,1,1,0.36,375,33,0,3,0,0,1,1,0,1,1,0.33,400,33,0,4,1,0,0,1,0,1,1,0.3,400,33,0,4,1,0,1,1,0,1,1,0.28,425,33,0,4,0,0,0,1,0,1,1,0.29,400,33,0,4,0,0,1,1,0,1,1,0.28,425,33,0,5,1,0,0,1,0,1,1,0.25,425,33,0,5,1,0,1,1,0,1,1,0.24,450,33,0,5,0,0,0,1,0,1,1,0.25,425,33,0,5,0,0,1,1,0,1,1,0.24,450,33,0,6,1,0,0,1,0,1,1,0.22,450,33,0,6,1,0,1,1,0,1,1,0.21,475,33,0,6,0,0,0,1,0,1,1,0.22,450,33,0,6,0,0,1,1,0,1,1,0.21,475,33,0,7,1,0,0,1,0,1,1,0.19,475,33,0,7,1,0,1,1,0,1,1,0.19,500,33,0,7,0,0,0,1,0,1,1,0.19,475,33,0,7,0,0,1,1,0,1,1,0.18,500,33,1,2,1,0,0,1,0,1,1,0.46,350,33,1,2,1,0,1,1,0,1,1,0.42,375,33,1,2,0,0,0,1,0,1,1,0.46,350,33,1,2,0,0,1,1,0,1,1,0.42,375,33,1,3,1,0,0,1,0,1,1,0.36,375,33,1,3,1,0,1,1,0,1,1,0.33,400,33,1,3,0,0,0,1,0,1,1,0.35,375,33,1,3,0,0,1,1,0,1,1,0.33,400,33,1,4,1,0,0,1,0,1,1,0.29,400,33,1,4,1,0,1,1,0,1,1,0.28,425,33,1,4,0,0,0,1,0,1,1,0.29,400,33,1,4,0,0,1,1,0,1,1,0.27,425,33,1,5,1,0,0,1,0,1,1,0.25,425,33,1,5,1,0,1,1,0,1,1,0.24,450,33,1,5,0,0,0,1,0,1,1,0.24,425,33,1,5,0,0,1,1,0,1,1,0.23,450,33,1,6,1,0,0,1,0,1,1,0.22,450,33,1,6,1,0,1,1,0,1,1,0.21,475,33,1,6,0,0,0,1,0,1,1,0.21,450,33,1,6,0,0,1,1,0,1,1,0.2,475,33,1,7,1,0,0,1,0,1,1,0.19,475,33,1,7,1,0,1,1,0,1,1,0.18,500,33,1,7,0,0,0,1,0,1,1,0.19,475,33,1,7,0,0,1,1,0,1,1,0.18,500,33,3,2,1,0,0,1,0,1,1,0.41,350,33,3,2,1,0,1,1,0,1,1,0.37,375,33,3,2,0,0,0,1,0,1,1,0.4,350,33,3,2,0,0,1,1,0,1,1,0.36,375,33,3,3,1,0,0,1,0,1,1,0.29,375,33,3,3,1,0,1,1,0,1,1,0.28,400,33,3,3,0,0,0,1,0,1,1,0.29,375,33,3,3,0,0,1,1,0,1,1,0.27,400,33,3,4,1,0,0,1,0,1,1,0.23,400,33,3,4,1,0,1,1,0,1,1,0.22,425,33,3,4,0,0,0,1,0,1,1,0.23,400,33,3,4,0,0,1,1,0,1,1,0.21,425,33,3,5,1,0,0,1,0,1,1,0.19,425,33,3,5,1,0,1,1,0,1,1,0.18,450,33,3,5,0,0,0,1,0,1,1,0.19,425,33,3,5,0,0,1,1,0,1,1,0.18,450,33,3,6,1,0,0,1,0,1,1,0.16,450,33,3,6,1,0,1,1,0,1,1,0.16,475,33,3,6,0,0,0,1,0,1,1,0.16,450,33,3,6,0,0,1,1,0,1,1,0.15,475,33,3,7,1,0,0,1,0,1,1,0.14,475,33,3,7,1,0,1,1,0,1,1,0.14,500,33,3,7,0,0,0,1,0,1,1,0.14,475,33,3,7,0,0,1,1,0,1,1,0.14,500,34,0,2,1,0,0,1,1,1,0,0.89,332,34,0,2,1,0,1,1,1,1,0,0.88,357,34,0,2,0,0,0,1,1,1,0,0.87,332,34,0,2,0,0,1,1,1,1,0,0.86,357,34,0,3,1,0,0,1,1,1,0,0.58,357,34,0,3,1,0,1,1,1,1,0,0.57,382,34,0,3,0,0,0,1,1,1,0,0.57,357,34,0,3,0,0,1,1,1,1,0,0.56,382,34,0,4,1,0,0,1,1,1,0,0.43,382,34,0,4,1,0,1,1,1,1,0,0.43,407,34,0,4,0,0,0,1,1,1,0,0.42,382,34,0,4,0,0,1,1,1,1,0,0.42,407,34,0,5,1,0,0,1,1,1,0,0.34,407,34,0,5,1,0,1,1,1,1,0,0.34,432,34,0,5,0,0,0,1,1,1,0,0.33,407,34,0,5,0,0,1,1,1,1,0,0.33,432,34,0,6,1,0,0,1,1,1,0,0.28,432,34,0,6,1,0,1,1,1,1,0,0.28,457,34,0,6,0,0,0,1,1,1,0,0.27,432,34,0,6,0,0,1,1,1,1,0,0.27,457,34,0,7,1,0,0,1,1,1,0,0.24,457,34,0,7,1,0,1,1,1,1,0,0.24,482,34,0,7,0,0,0,1,1,1,0,0.23,457,34,0,7,0,0,1,1,1,1,0,0.23,482,34,1,2,1,0,0,1,1,1,0,0.87,332,34,1,2,1,0,1,1,1,1,0,0.86,357,34,1,2,0,0,0,1,1,1,0,0.85,332,34,1,2,0,0,1,1,1,1,0,0.84,357,34,1,3,1,0,0,1,1,1,0,0.56,357,34,1,3,1,0,1,1,1,1,0,0.56,382,34,1,3,0,0,0,1,1,1,0,0.55,357,34,1,3,0,0,1,1,1,1,0,0.55,382,34,1,4,1,0,0,1,1,1,0,0.42,382,34,1,4,1,0,1,1,1,1,0,0.42,407,34,1,4,0,0,0,1,1,1,0,0.41,382,34,1,4,0,0,1,1,1,1,0,0.41,407,34,1,5,1,0,0,1,1,1,0,0.33,407,34,1,5,1,0,1,1,1,1,0,0.33,432,34,1,5,0,0,0,1,1,1,0,0.32,407,34,1,5,0,0,1,1,1,1,0,0.32,432,34,1,6,1,0,0,1,1,1,0,0.28,432,34,1,6,1,0,1,1,1,1,0,0.28,457,34,1,6,0,0,0,1,1,1,0,0.27,432,34,1,6,0,0,1,1,1,1,0,0.27,457,34,1,7,1,0,0,1,1,1,0,0.24,457,34,1,7,1,0,1,1,1,1,0,0.24,482,34,1,7,0,0,0,1,1,1,0,0.23,457,34,1,7,0,0,1,1,1,1,0,0.23,482,34,3,2,1,0,0,1,1,1,0,0.68,332,34,3,2,1,0,1,1,1,1,0,0.68,357,34,3,2,0,0,0,1,1,1,0,0.66,332,34,3,2,0,0,1,1,1,1,0,0.66,357,34,3,3,1,0,0,1,1,1,0,0.42,357,34,3,3,1,0,1,1,1,1,0,0.42,382,34,3,3,0,0,0,1,1,1,0,0.4,357,34,3,3,0,0,1,1,1,1,0,0.4,382,34,3,4,1,0,0,1,1,1,0,0.3,382,34,3,4,1,0,1,1,1,1,0,0.3,407,34,3,4,0,0,0,1,1,1,0,0.29,382,34,3,4,0,0,1,1,1,1,0,0.29,407,34,3,5,1,0,0,1,1,1,0,0.24,407,34,3,5,1,0,1,1,1,1,0,0.24,432,34,3,5,0,0,0,1,1,1,0,0.23,407,34,3,5,0,0,1,1,1,1,0,0.23,432,34,3,6,1,0,0,1,1,1,0,0.2,432,34,3,6,1,0,1,1,1,1,0,0.2,457,34,3,6,0,0,0,1,1,1,0,0.19,432,34,3,6,0,0,1,1,1,1,0,0.19,457,34,3,7,1,0,0,1,1,1,0,0.17,457,34,3,7,1,0,1,1,1,1,0,0.17,482,34,3,7,0,0,0,1,1,1,0,0.16,457,34,3,7,0,0,1,1,1,1,0,0.16,482,35,0,2,1,0,0,1,1,1,1,0.78,350,35,0,2,1,0,1,1,1,1,1,0.77,375,35,0,2,0,0,0,1,1,1,1,0.77,350,35,0,2,0,0,1,1,1,1,1,0.76,375,35,0,3,1,0,0,1,1,1,1,0.53,375,35,0,3,1,0,1,1,1,1,1,0.53,400,35,0,3,0,0,0,1,1,1,1,0.52,375,35,0,3,0,0,1,1,1,1,1,0.52,400,35,0,4,1,0,0,1,1,1,1,0.4,400,35,0,4,1,0,1,1,1,1,1,0.4,425,35,0,4,0,0,0,1,1,1,1,0.39,400,35,0,4,0,0,1,1,1,1,1,0.39,425,35,0,5,1,0,0,1,1,1,1,0.32,425,35,0,5,1,0,1,1,1,1,1,0.32,450,35,0,5,0,0,0,1,1,1,1,0.32,425,35,0,5,0,0,1,1,1,1,1,0.31,450,35,0,6,1,0,0,1,1,1,1,0.27,450,35,0,6,1,0,1,1,1,1,1,0.27,475,35,0,6,0,0,0,1,1,1,1,0.26,450,35,0,6,0,0,1,1,1,1,1,0.26,475,35,0,7,1,0,0,1,1,1,1,0.23,475,35,0,7,1,0,1,1,1,1,1,0.23,500,35,0,7,0,0,0,1,1,1,1,0.23,475,35,0,7,0,0,1,1,1,1,1,0.23,500,35,1,2,1,0,0,1,1,1,1,0.77,350,35,1,2,1,0,1,1,1,1,1,0.76,375,35,1,2,0,0,0,1,1,1,1,0.75,350,35,1,2,0,0,1,1,1,1,1,0.75,375,35,1,3,1,0,0,1,1,1,1,0.52,375,35,1,3,1,0,1,1,1,1,1,0.51,400,35,1,3,0,0,0,1,1,1,1,0.51,375,35,1,3,0,0,1,1,1,1,1,0.5,400,35,1,4,1,0,0,1,1,1,1,0.39,400,35,1,4,1,0,1,1,1,1,1,0.39,425,35,1,4,0,0,0,1,1,1,1,0.38,400,35,1,4,0,0,1,1,1,1,1,0.38,425,35,1,5,1,0,0,1,1,1,1,0.32,425,35,1,5,1,0,1,1,1,1,1,0.32,450,35,1,5,0,0,0,1,1,1,1,0.31,425,35,1,5,0,0,1,1,1,1,1,0.31,450,35,1,6,1,0,0,1,1,1,1,0.27,450,35,1,6,1,0,1,1,1,1,1,0.27,475,35,1,6,0,0,0,1,1,1,1,0.26,450,35,1,6,0,0,1,1,1,1,1,0.26,475,35,1,7,1,0,0,1,1,1,1,0.23,475,35,1,7,1,0,1,1,1,1,1,0.23,500,35,1,7,0,0,0,1,1,1,1,0.22,475,35,1,7,0,0,1,1,1,1,1,0.22,500,35,3,2,1,0,0,1,1,1,1,0.62,350,35,3,2,1,0,1,1,1,1,1,0.61,375,35,3,2,0,0,0,1,1,1,1,0.6,350,35,3,2,0,0,1,1,1,1,1,0.6,375,35,3,3,1,0,0,1,1,1,1,0.39,375,35,3,3,1,0,1,1,1,1,1,0.39,400,35,3,3,0,0,0,1,1,1,1,0.38,375,35,3,3,0,0,1,1,1,1,1,0.38,400,35,3,4,1,0,0,1,1,1,1,0.29,400,35,3,4,1,0,1,1,1,1,1,0.29,425,35,3,4,0,0,0,1,1,1,1,0.28,400,35,3,4,0,0,1,1,1,1,1,0.28,425,35,3,5,1,0,0,1,1,1,1,0.23,425,35,3,5,1,0,1,1,1,1,1,0.23,450,35,3,5,0,0,0,1,1,1,1,0.22,425,35,3,5,0,0,1,1,1,1,1,0.22,450,35,3,6,1,0,0,1,1,1,1,0.19,450,35,3,6,1,0,1,1,1,1,1,0.19,475,35,3,6,0,0,0,1,1,1,1,0.18,450,35,3,6,0,0,1,1,1,1,1,0.18,475,35,3,7,1,0,0,1,1,1,1,0.16,475,35,3,7,1,0,1,1,1,1,1,0.16,500,35,3,7,0,0,0,1,1,1,1,0.16,475,35,3,7,0,0,1,1,1,1,1,0.16,500],\"corrections\":[],\"width\":12},{\"id\":\"2-32\",\"element\":\"internal-wall\",\"title\":\"Internal walls\",\"dims\":[],\"descriptions\":[\"13 mm plaster, 100 mm HP block, 13 mm plaster\",\"13 mm plaster, 100 mm HP block, 50 mm open cavity (mild steel double triangle wall ties), 100 mm HP block, 13 mm plaster\",\"13 mm plaster, 100 mm dense concrete block, 13 mm plaster\",\"13 mm plaster, 100 mm dense concrete block, 50 mm open cavity (mild steel double triangle wall ties), 100 mm dense concrete block, 13 mm plaster\",\"13 mm plaster, 102 mm brick, 13 mm plaster\",\"13 mm plaster, 125 mm HP block, 13 mm plaster\",\"13 mm plaster, 125 mm HP block, 50 mm open cavity (mild steel double triangle wall ties), 125 mm HP block, 13 mm plaster\",\"13 mm plaster, 125 mm dense concrete block, 13 mm plaster\",\"13 mm plaster, 125 mm dense concrete block, 50 mm open cavity (mild steel double triangle wall ties), 125 mm dense concrete block, 13 mm plaster\",\"13 mm plaster, 215 mm brick, 13 mm plaster\",\"3 mm plaster, 12.5 mm plasterboard, 75 mm open cavity, 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[],\"rows\":[0,-1,0.82,126,1,-1,0.43,276,2,-1,2.76,126,3,-1,1.67,276,4,-1,2.05,128,5,-1,0.69,151,6,-1,0.36,326,7,-1,2.65,151,8,-1,1.59,326,9,-1,1.45,241,10,-1,1.76,106],\"corrections\":[],\"width\":4},{\"id\":\"2-33\",\"element\":\"roof\",\"title\":\"Roofs, uninsulated\",\"dims\":[{\"key\":\"roof_type\",\"label\":\"Roof\",\"values\":[\"flat roof\",\"pitched roof, flat ceiling, no membrane\",\"pitched roof, flat ceiling, with membrane\",\"pitched roof, pitched ceiling\"]}],\"descriptions\":[\"1.5 mm butyl rubber or roofing felt, 18 mm oriented strand board or plywood sheathing, 150 mm cavity (uninsulated) (rafters - 10%), 12.5 mm plasterboard, 3 mm plaster\",\"roof tile, cavity (ventilated, timber battens), breathable membrane or felt, 150 mm cavity (uninsulated) (rafters - 10%), 12.5 mm plasterboard, 3 mm plaster\",\"roof tile, cavity (ventilated, timber battens), breathable membrane or felt, roof space (ventilated inc. rafters and joists), 12.5 mm plasterboard, 3 mm plaster\",\"roof tile, cavity (ventilated, timber battens), roof space (ventilated inc. rafters and joists), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[],\"rows\":[0,-1,0,1.74,-1,1,-1,3,1.85,-1,2,-1,2,2.3,-1,3,-1,1,3.39,-1],\"corrections\":[],\"width\":5},{\"id\":\"2-34\",\"element\":\"roof\",\"title\":\"Pitched roof, insulated at the joists\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[50,100,150,200,250,300,350,400]}],\"descriptions\":[\"roof tile, cavity (ventilated, timber battens), breathable membrane or felt, roof space (ventilated inc. rafters), insulation (timber joists - 10%), 12.5 mm plasterboard, 3 mm plaster\",\"roof tile, cavity (ventilated, timber battens), roof space (ventilated inc. rafters), insulation (timber joists - 10%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"blown fibre\",\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0.67,-1,0,0,1,0.4,-1,0,0,2,0.26,-1,0,0,3,0.2,-1,0,0,4,0.16,-1,0,0,5,0.13,-1,0,0,6,0.11,-1,0,0,7,0.1,-1,0,1,0,0.68,-1,0,1,1,0.4,-1,0,1,2,0.26,-1,0,1,3,0.2,-1,0,1,4,0.16,-1,0,1,5,0.13,-1,0,1,6,0.11,-1,0,1,7,0.1,-1,0,2,0,0.69,-1,0,2,1,0.42,-1,0,2,2,0.28,-1,0,2,3,0.21,-1,0,2,4,0.17,-1,0,2,5,0.14,-1,0,2,6,0.12,-1,0,2,7,0.1,-1,0,3,0,0.52,-1,0,3,1,0.3,-1,0,3,2,0.18,-1,0,3,3,0.13,-1,0,3,4,0.1,-1,0,3,5,0.09,-1,0,3,6,0.07,-1,0,3,7,0.06,-1,1,0,0,0.75,-1,1,0,1,0.43,-1,1,0,2,0.28,-1,1,0,3,0.2,-1,1,0,4,0.16,-1,1,0,5,0.13,-1,1,0,6,0.12,-1,1,0,7,0.1,-1,1,1,0,0.75,-1,1,1,1,0.43,-1,1,1,2,0.28,-1,1,1,3,0.2,-1,1,1,4,0.16,-1,1,1,5,0.13,-1,1,1,6,0.12,-1,1,1,7,0.1,-1,1,2,0,0.77,-1,1,2,1,0.44,-1,1,2,2,0.29,-1,1,2,3,0.21,-1,1,2,4,0.17,-1,1,2,5,0.14,-1,1,2,6,0.12,-1,1,2,7,0.11,-1,1,3,0,0.57,-1,1,3,1,0.32,-1,1,3,2,0.19,-1,1,3,3,0.14,-1,1,3,4,0.11,-1,1,3,5,0.09,-1,1,3,6,0.07,-1,1,3,7,0.06,-1],\"corrections\":[],\"width\":5},{\"id\":\"2-35\",\"element\":\"roof\",\"title\":\"Pitched roof, insulated at the rafters (sloped ceiling)\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[50,100,150,200,250,300,350,400]}],\"descriptions\":[\"roof tile, cavity (ventilated, timber battens), breathable membrane or felt, cavity (uninsulated) (rafters - 10%), insulation (rafters - 10%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (batts)\",\"polyurethane foam\"],\"rows\":[0,0,0,0.62,-1,0,0,1,0.38,-1,0,0,2,0.27,-1,0,0,3,0.21,-1,0,0,4,0.18,-1,0,0,5,0.15,-1,0,0,6,0.13,-1,0,0,7,0.11,-1,0,1,0,0.61,-1,0,1,1,0.37,-1,0,1,2,0.27,-1,0,1,3,0.21,-1,0,1,4,0.17,-1,0,1,5,0.14,-1,0,1,6,0.12,-1,0,1,7,0.11,-1,0,2,0,0.49,-1,0,2,1,0.29,-1,0,2,2,0.2,-1,0,2,3,0.16,-1,0,2,4,0.13,-1,0,2,5,0.11,-1,0,2,6,0.09,-1,0,2,7,0.08,-1],\"corrections\":[],\"width\":5},{\"id\":\"2-36\",\"element\":\"roof\",\"title\":\"Pitched roof, insulated at the rafters (flat ceiling)\",\"dims\":[{\"key\":\"roof_pitch_deg\",\"label\":\"Pitch\",\"values\":[\"12-20\",\"21-30\",\"31-35\",\"36-40\",\"41-45\",\"46-50\",\"51-55\",\"56-60\",\"61-65\",\"66-70\",\"71-75\"]},{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[50,100,150,200,250,300,350,400]}],\"descriptions\":[\"roof tile, cavity (ventilated, timber battens), breathable membrane or felt, cavity (uninsulated) (rafters - 10%), insulation (rafters - 10%), roof space (ventilated), 100 mm cavity (uninsulated) (timber joists - 10%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"expanded polystyrene\",\"mineral wool (batts)\",\"polyurethane foam\"],\"rows\":[0,0,0,0,0.5,-1,0,0,0,1,0.32,-1,0,0,0,2,0.24,-1,0,0,0,3,0.19,-1,0,0,0,4,0.16,-1,0,0,0,5,0.14,-1,0,0,0,6,0.12,-1,0,0,0,7,0.11,-1,0,0,1,0,0.48,-1,0,0,1,1,0.31,-1,0,0,1,2,0.23,-1,0,0,1,3,0.18,-1,0,0,1,4,0.15,-1,0,0,1,5,0.13,-1,0,0,1,6,0.11,-1,0,0,1,7,0.1,-1,0,0,2,0,0.47,-1,0,0,2,1,0.3,-1,0,0,2,2,0.22,-1,0,0,2,3,0.18,-1,0,0,2,4,0.15,-1,0,0,2,5,0.12,-1,0,0,2,6,0.11,-1,0,0,2,7,0.1,-1,0,0,3,0,0.45,-1,0,0,3,1,0.29,-1,0,0,3,2,0.21,-1,0,0,3,3,0.17,-1,0,0,3,4,0.14,-1,0,0,3,5,0.12,-1,0,0,3,6,0.1,-1,0,0,3,7,0.09,-1,0,0,4,0,0.44,-1,0,0,4,1,0.28,-1,0,0,4,2,0.2,-1,0,0,4,3,0.16,-1,0,0,4,4,0.13,-1,0,0,4,5,0.11,-1,0,0,4,6,0.1,-1,0,0,4,7,0.09,-1,0,0,5,0,0.42,-1,0,0,5,1,0.27,-1,0,0,5,2,0.19,-1,0,0,5,3,0.15,-1,0,0,5,4,0.13,-1,0,0,5,5,0.11,-1,0,0,5,6,0.09,-1,0,0,5,7,0.08,-1,0,0,6,0,0.4,-1,0,0,6,1,0.25,-1,0,0,6,2,0.18,-1,0,0,6,3,0.14,-1,0,0,6,4,0.12,-1,0,0,6,5,0.1,-1,0,0,6,6,0.09,-1,0,0,6,7,0.08,-1,0,0,7,0,0.38,-1,0,0,7,1,0.23,-1,0,0,7,2,0.17,-1,0,0,7,3,0.13,-1,0,0,7,4,0.11,-1,0,0,7,5,0.09,-1,0,0,7,6,0.08,-1,0,0,7,7,0.07,-1,0,0,8,0,0.35,-1,0,0,8,1,0.21,-1,0,0,8,2,0.16,-1,0,0,8,3,0.12,-1,0,0,8,4,0.1,-1,0,0,8,5,0.09,-1,0,0,8,6,0.08,-1,0,0,8,7,0.07,-1,0,0,9,0,0.32,-1,0,0,9,1,0.19,-1,0,0,9,2,0.14,-1,0,0,9,3,0.11,-1,0,0,9,4,0.09,-1,0,0,9,5,0.08,-1,0,0,9,6,0.07,-1,0,0,9,7,0.06,-1,0,0,10,0,0.28,-1,0,0,10,1,0.17,-1,0,0,10,2,0.12,-1,0,0,10,3,0.1,-1,0,0,10,4,0.08,-1,0,0,10,5,0.07,-1,0,0,10,6,0.06,-1,0,0,10,7,0.05,-1,0,1,0,0,0.48,-1,0,1,0,1,0.32,-1,0,1,0,2,0.23,-1,0,1,0,3,0.19,-1,0,1,0,4,0.15,-1,0,1,0,5,0.13,-1,0,1,0,6,0.12,-1,0,1,0,7,0.1,-1,0,1,1,0,0.47,-1,0,1,1,1,0.3,-1,0,1,1,2,0.23,-1,0,1,1,3,0.18,-1,0,1,1,4,0.15,-1,0,1,1,5,0.13,-1,0,1,1,6,0.11,-1,0,1,1,7,0.1,-1,0,1,2,0,0.46,-1,0,1,2,1,0.29,-1,0,1,2,2,0.22,-1,0,1,2,3,0.17,-1,0,1,2,4,0.14,-1,0,1,2,5,0.12,-1,0,1,2,6,0.11,-1,0,1,2,7,0.09,-1,0,1,3,0,0.44,-1,0,1,3,1,0.28,-1,0,1,3,2,0.21,-1,0,1,3,3,0.16,-1,0,1,3,4,0.14,-1,0,1,3,5,0.12,-1,0,1,3,6,0.1,-1,0,1,3,7,0.09,-1,0,1,4,0,0.43,-1,0,1,4,1,0.27,-1,0,1,4,2,0.2,-1,0,1,4,3,0.16,-1,0,1,4,4,0.13,-1,0,1,4,5,0.11,-1,0,1,4,6,0.1,-1,0,1,4,7,0.09,-1,0,1,5,0,0.41,-1,0,1,5,1,0.26,-1,0,1,5,2,0.19,-1,0,1,5,3,0.15,-1,0,1,5,4,0.12,-1,0,1,5,5,0.1,-1,0,1,5,6,0.09,-1,0,1,5,7,0.08,-1,0,1,6,0,0.39,-1,0,1,6,1,0.24,-1,0,1,6,2,0.18,-1,0,1,6,3,0.14,-1,0,1,6,4,0.12,-1,0,1,6,5,0.1,-1,0,1,6,6,0.09,-1,0,1,6,7,0.08,-1,0,1,7,0,0.37,-1,0,1,7,1,0.23,-1,0,1,7,2,0.16,-1,0,1,7,3,0.13,-1,0,1,7,4,0.11,-1,0,1,7,5,0.09,-1,0,1,7,6,0.08,-1,0,1,7,7,0.07,-1,0,1,8,0,0.34,-1,0,1,8,1,0.21,-1,0,1,8,2,0.15,-1,0,1,8,3,0.12,-1,0,1,8,4,0.1,-1,0,1,8,5,0.08,-1,0,1,8,6,0.07,-1,0,1,8,7,0.06,-1,0,1,9,0,0.31,-1,0,1,9,1,0.19,-1,0,1,9,2,0.14,-1,0,1,9,3,0.11,-1,0,1,9,4,0.09,-1,0,1,9,5,0.08,-1,0,1,9,6,0.07,-1,0,1,9,7,0.06,-1,0,1,10,0,0.28,-1,0,1,10,1,0.17,-1,0,1,10,2,0.12,-1,0,1,10,3,0.1,-1,0,1,10,4,0.08,-1,0,1,10,5,0.07,-1,0,1,10,6,0.06,-1,0,1,10,7,0.05,-1,0,2,0,0,0.4,-1,0,2,0,1,0.25,-1,0,2,0,2,0.18,-1,0,2,0,3,0.14,-1,0,2,0,4,0.12,-1,0,2,0,5,0.1,-1,0,2,0,6,0.09,-1,0,2,0,7,0.08,-1,0,2,1,0,0.39,-1,0,2,1,1,0.24,-1,0,2,1,2,0.18,-1,0,2,1,3,0.14,-1,0,2,1,4,0.11,-1,0,2,1,5,0.1,-1,0,2,1,6,0.09,-1,0,2,1,7,0.08,-1,0,2,2,0,0.37,-1,0,2,2,1,0.23,-1,0,2,2,2,0.17,-1,0,2,2,3,0.13,-1,0,2,2,4,0.11,-1,0,2,2,5,0.09,-1,0,2,2,6,0.08,-1,0,2,2,7,0.07,-1,0,2,3,0,0.36,-1,0,2,3,1,0.22,-1,0,2,3,2,0.16,-1,0,2,3,3,0.13,-1,0,2,3,4,0.11,-1,0,2,3,5,0.09,-1,0,2,3,6,0.08,-1,0,2,3,7,0.07,-1,0,2,4,0,0.35,-1,0,2,4,1,0.22,-1,0,2,4,2,0.16,-1,0,2,4,3,0.12,-1,0,2,4,4,0.1,-1,0,2,4,5,0.09,-1,0,2,4,6,0.08,-1,0,2,4,7,0.07,-1,0,2,5,0,0.34,-1,0,2,5,1,0.21,-1,0,2,5,2,0.15,-1,0,2,5,3,0.12,-1,0,2,5,4,0.1,-1,0,2,5,5,0.08,-1,0,2,5,6,0.07,-1,0,2,5,7,0.06,-1,0,2,6,0,0.32,-1,0,2,6,1,0.19,-1,0,2,6,2,0.14,-1,0,2,6,3,0.11,-1,0,2,6,4,0.09,-1,0,2,6,5,0.08,-1,0,2,6,6,0.07,-1,0,2,6,7,0.06,-1,0,2,7,0,0.3,-1,0,2,7,1,0.18,-1,0,2,7,2,0.13,-1,0,2,7,3,0.1,-1,0,2,7,4,0.09,-1,0,2,7,5,0.07,-1,0,2,7,6,0.06,-1,0,2,7,7,0.06,-1,0,2,8,0,0.28,-1,0,2,8,1,0.17,-1,0,2,8,2,0.12,-1,0,2,8,3,0.1,-1,0,2,8,4,0.08,-1,0,2,8,5,0.07,-1,0,2,8,6,0.06,-1,0,2,8,7,0.05,-1,0,2,9,0,0.26,-1,0,2,9,1,0.16,-1,0,2,9,2,0.11,-1,0,2,9,3,0.09,-1,0,2,9,4,0.07,-1,0,2,9,5,0.06,-1,0,2,9,6,0.05,-1,0,2,9,7,0.05,-1,0,2,10,0,0.23,-1,0,2,10,1,0.14,-1,0,2,10,2,0.1,-1,0,2,10,3,0.08,-1,0,2,10,4,0.07,-1,0,2,10,5,0.06,-1,0,2,10,6,0.05,-1,0,2,10,7,0.04,-1],\"corrections\":[],\"width\":6},{\"id\":\"2-37\",\"element\":\"roof\",\"title\":\"Flat roof, insulated\",\"dims\":[{\"key\":\"insulation_depth_mm\",\"label\":\"Insulation thickness\",\"values\":[50,100,150,200,250,300,350,400]}],\"descriptions\":[\"1.5 mm butyl rubber or roofing felt, 18 mm oriented strand board or plywood sheathing, cavity (uninsulated) (rafters - 10%), insulation (rafters - 10%), 12.5 mm plasterboard, 3 mm plaster\"],\"insulations\":[\"blown fibre\",\"expanded polystyrene\",\"mineral wool (quilt)\",\"polyurethane foam\"],\"rows\":[0,0,0,0.62,-1,0,0,1,0.38,-1,0,0,2,0.28,-1,0,0,3,0.22,-1,0,0,4,0.18,-1,0,0,5,0.16,-1,0,0,6,0.14,-1,0,0,7,0.12,-1,0,1,0,0.62,-1,0,1,1,0.38,-1,0,1,2,0.28,-1,0,1,3,0.22,-1,0,1,4,0.18,-1,0,1,5,0.16,-1,0,1,6,0.14,-1,0,1,7,0.12,-1,0,2,0,0.63,-1,0,2,1,0.39,-1,0,2,2,0.29,-1,0,2,3,0.23,-1,0,2,4,0.19,-1,0,2,5,0.16,-1,0,2,6,0.14,-1,0,2,7,0.13,-1,0,3,0,0.48,-1,0,3,1,0.29,-1,0,3,2,0.21,-1,0,3,3,0.16,-1,0,3,4,0.14,-1,0,3,5,0.12,-1,0,3,6,0.1,-1,0,3,7,0.09,-1],\"corrections\":[],\"width\":5},{\"id\":\"2-38\",\"element\":\"window\",\"title\":\"Windows\",\"dims\":[{\"key\":\"pane_gap_mm\",\"label\":\"Gap between panes\",\"values\":[6,12,16,null]}],\"descriptions\":[\"Wood or PVC-U frame, single glazed\",\"Wood or PVC-U frame, double glazed\",\"Wood or PVC-U frame, double glazed, low-e\",\"Wood or PVC-U frame, double glazed, argon\",\"Wood or PVC-U frame, double glazed, low-e, argon\",\"Wood or PVC-U frame, triple glazed\",\"Wood or PVC-U frame, triple glazed, low-e\",\"Wood or PVC-U frame, triple glazed, argon\",\"Wood or PVC-U frame, triple glazed, low-e, argon\",\"Metal frame, 4 mm thermal break, single glazed\",\"Metal frame, 4 mm thermal break, double glazed\",\"Metal frame, 4 mm thermal break, double glazed, low-e\",\"Metal frame, 4 mm thermal break, double glazed, argon\",\"Metal frame, 4 mm thermal break, double glazed, low-e, argon\",\"Metal frame, 4 mm thermal break, triple glazed\",\"Metal frame, 4 mm thermal break, triple glazed, low-e\",\"Metal frame, 4 mm thermal break, triple glazed, argon\",\"Metal frame, 4 mm thermal break, triple glazed, low-e, argon\"],\"insulations\":[],\"rows\":[0,-1,3,4.8,-1,1,-1,0,3.1,-1,1,-1,1,2.8,-1,1,-1,2,2.7,-1,2,-1,0,2.7,-1,2,-1,1,2.2,-1,2,-1,2,2.1,-1,3,-1,0,2.9,-1,3,-1,1,2.7,-1,3,-1,2,2.6,-1,4,-1,0,2.5,-1,4,-1,1,2.1,-1,4,-1,2,2.0,-1,5,-1,0,2.4,-1,5,-1,1,2.1,-1,5,-1,2,2.0,-1,6,-1,0,2.1,-1,6,-1,1,1.7,-1,6,-1,2,1.6,-1,7,-1,0,2.2,-1,7,-1,1,2.0,-1,7,-1,2,1.9,-1,8,-1,0,1.9,-1,8,-1,1,1.6,-1,8,-1,2,1.5,-1,9,-1,3,5.7,-1,10,-1,0,3.7,-1,10,-1,1,3.4,-1,10,-1,2,3.3,-1,11,-1,0,3.3,-1,11,-1,1,2.8,-1,11,-1,2,2.6,-1,12,-1,0,3.5,-1,12,-1,1,3.3,-1,12,-1,2,3.2,-1,13,-1,0,3.0,-1,13,-1,1,2.6,-1,13,-1,2,2.5,-1,14,-1,0,2.9,-1,14,-1,1,2.6,-1,14,-1,2,2.5,-1,15,-1,0,2.6,-1,15,-1,1,2.1,-1,15,-1,2,2.0,-1,16,-1,0,2.8,-1,16,-1,1,2.5,-1,16,-1,2,2.4,-1,17,-1,0,2.3,-1,17,-1,1,2.0,-1,17,-1,2,1.9,-1],\"width\":5},{\"id\":\"2-38-doors\",\"element\":\"door\",\"title\":\"Doors\",\"dims\":[{\"key\":\"pane_gap_mm\",\"label\":\"Gap between panes\",\"values\":[6,12,16,null]}],\"descriptions\":[\"Solid wooden door\",\"Solid wooden door, 25% single glazed\",\"Solid wooden door, 50% single glazed\",\"Solid wooden door, 75% single glazed\",\"Solid wooden door, 25% double glazed\",\"Solid wooden door, 50% double glazed\",\"Solid wooden door, 75% double glazed\"],\"insulations\":[],\"rows\":[0,-1,3,3.0,-1,1,-1,3,3.5,-1,2,-1,3,3.9,-1,3,-1,3,4.4,-1,4,-1,0,3.0,-1,4,-1,1,3.0,-1,4,-1,2,2.9,-1,5,-1,0,3.1,-1,5,-1,1,2.9,-1,5,-1,2,2.9,-1,6,-1,0,3.1,-1,6,-1,1,2.9,-1,6,-1,2,2.8,-1],\"width\":5},{\"id\":\"2-41\",\"element\":\"internal-floor\",\"title\":\"Internal and exposed floors\",\"dims\":[{\"key\":\"insulation_mm\",\"label\":\"Insulation thickness\",\"values\":[0,100,150]}],\"descriptions\":[\"Timber floor over outside or unheated space (heat flows down)\",\"Concrete slab over outside or unheated space (heat flows down)\",\"Intermediate floor, heat flows up\",\"Intermediate floor, heat flows down\"],\"insulations\":[],\"rows\":[0,-1,0,1.75,-1,0,-1,1,0.33,-1,0,-1,2,0.23,-1,1,-1,0,1.82,-1,1,-1,1,0.57,-1,2,-1,0,1.73,-1,2,-1,1,0.32,-1,3,-1,0,1.41,-1,3,-1,1,0.31,-1],\"width\":5}]}", "// The DHDG's construction U-value tables (section 2.8.9), packed by\n// apps/design/dhdg/constructions.json: a construction's id is\n// \"<table>:<row>\", which is what a fabric type's spec stores.\n\nimport data from \"../../../apps/design/dhdg/constructions.json\";\n\nexport type Element =\n  | \"wall\"\n  | \"internal-wall\"\n  | \"roof\"\n  | \"window\"\n  | \"door\"\n  | \"internal-floor\";\n\ninterface Dim {\n  key: string;\n  label: string;\n  values: (number | string | null)[];\n}\n\ninterface Table {\n  id: string;\n  element: Element;\n  title: string;\n  dims: Dim[];\n  descriptions: string[];\n  insulations: string[];\n  rows: number[];\n  width: number;\n  corrections?: { row: number; printed: number; used: number }[];\n}\n\nexport interface Construction {\n  id: string;\n  table: string;\n  tableTitle: string;\n  element: Element;\n  description: string;\n  insulation: string | null;\n  dims: Record<string, number | string | null>;\n  u: number;\n  depthMm: number | null;\n  /** The guide prints something else here; this is the value used. */\n  printed: number | null;\n}\n\nexport const TABLES = data.tables as unknown as Table[];\n\nfunction decode(table: Table, row: number): Construction | null {\n  const at = row * table.width;\n  if (row < 0 || at + table.width > table.rows.length) {\n    return null;\n  }\n  const cells = table.rows.slice(at, at + table.width);\n  const insulation = cells[1] as number;\n  const dims: Record<string, number | string | null> = {};\n  table.dims.forEach((dim, n) => {\n    dims[dim.key] = dim.values[cells[2 + n] as number] ?? null;\n  });\n  const depth = cells[table.width - 1] as number;\n  const correction = table.corrections?.find((entry) => entry.row === row);\n  return {\n    id: `${table.id}:${row}`,\n    table: table.id,\n    tableTitle: table.title,\n    element: table.element,\n    description: table.descriptions[cells[0] as number] ?? \"\",\n    insulation:\n      insulation >= 0 ? (table.insulations[insulation] ?? null) : null,\n    dims,\n    u: cells[table.width - 2] as number,\n    depthMm: depth >= 0 ? depth : null,\n    printed: correction ? correction.printed : null,\n  };\n}\n\nconst cache = new Map<string, Construction[]>();\n\nexport function rows(tableId: string): Construction[] {\n  const cached = cache.get(tableId);\n  if (cached) {\n    return cached;\n  }\n  const table = TABLES.find((candidate) => candidate.id === tableId);\n  const decoded: Construction[] = [];\n  if (table) {\n    const count = table.rows.length / table.width;\n    for (let row = 0; row < count; row++) {\n      const construction = decode(table, row);\n      if (construction) {\n        decoded.push(construction);\n      }\n    }\n  }\n  cache.set(tableId, decoded);\n  return decoded;\n}\n\nexport function construction(\n  id: string | null | undefined,\n): Construction | null {\n  if (!id) {\n    return null;\n  }\n  const [tableId, row] = id.split(\":\");\n  const table = TABLES.find((candidate) => candidate.id === tableId);\n  return table ? decode(table, Number(row)) : null;\n}\n\nexport function tablesFor(element: Element): Table[] {\n  return TABLES.filter((table) => table.element === element);\n}\n\n/** The row closest to what's wanted: exact text, then the nearest numbers. */\nexport function nearest(\n  tableId: string,\n  description: string,\n  insulation: string | null,\n  wanted: Record<string, number | string>,\n): Construction | null {\n  let best: Construction | null = null;\n  let bestScore = Infinity;\n  for (const row of rows(tableId)) {\n    if (row.description !== description || row.insulation !== insulation) {\n      continue;\n    }\n    let score = 0;\n    for (const [key, value] of Object.entries(wanted)) {\n      const have = row.dims[key];\n      if (typeof value === \"number\" && typeof have === \"number\") {\n        score += Math.abs(have - value);\n      } else if (have !== value) {\n        score += 1e6;\n      }\n    }\n    if (score < bestScore) {\n      best = row;\n      bestScore = score;\n    }\n  }\n  return best;\n}\n\n/** One line for the designer: the table, the build-up and its numbers. */\nexport function describe(row: Construction): string {\n  const parts = [row.description];\n  if (row.insulation) {\n    parts.push(row.insulation);\n  }\n  const table = TABLES.find((candidate) => candidate.id === row.table);\n  for (const dim of table?.dims ?? []) {\n    const value = row.dims[dim.key];\n    if (value === null || value === undefined) {\n      continue;\n    }\n    parts.push(\n      typeof value === \"number\" && dim.key.endsWith(\"_mm\")\n        ? `${dim.label.toLowerCase()} ${value} mm`\n        : `${dim.label.toLowerCase()} ${value}`,\n    );\n  }\n  return parts.join(\", \");\n}\n", "// Ground floor U-values by BS EN ISO 13370, with the assumptions behind DHDG\n// Tables 2-43 to 2-54, which this reproduces to the tables' rounding. Like the\n// tables, it works per room: the room's exposed perimeter over its area.\n\nexport type Soil = \"clay\" | \"sand\" | \"rock\";\nexport type Shielding = \"sheltered\" | \"average\" | \"exposed\";\nexport type GroundFloor = \"solid\" | \"suspended\";\n\nconst GROUND_LAMBDA: Record<Soil, number> = { clay: 1.5, sand: 2.0, rock: 3.5 };\nconst WIND_SHIELDING: Record<Shielding, number> = {\n  sheltered: 0.02,\n  average: 0.05,\n  exposed: 0.1,\n};\n\nconst WALL_M = 0.3;\nconst RSI = 0.17;\nconst RSE = 0.04;\nconst INSULATION_LAMBDA = 0.04;\n/** Insulation between joists at 400 mm centres: 12.5 % softwood. */\nconst BRIDGED_LAMBDA = 0.125 * 0.13 + 0.875 * INSULATION_LAMBDA;\nconst DECK_R = 0.4057;\nconst VOID_R = 0.2;\nconst VOID_HEIGHT_M = 0.5;\nconst VOID_WALL_U = 1.7;\nconst VENTS_M2_PER_M = 0.0015;\nconst WIND_M_S = 3;\n\n/** \"0.01 or less\": the tables' smallest ratio. */\nconst MIN_RATIO = 0.01;\n\nfunction slab(b: number, lambda: number, resistance: number): number {\n  const dt = WALL_M + lambda * (RSI + resistance + RSE);\n  if (dt < b) {\n    return (\n      ((2 * lambda) / (Math.PI * b + dt)) * Math.log((Math.PI * b) / dt + 1)\n    );\n  }\n  return lambda / (0.457 * b + dt);\n}\n\nexport interface GroundInput {\n  construction: GroundFloor;\n  /** m of the room's walls to outside or to unheated space. */\n  exposedPerimeterM: number;\n  areaM2: number;\n  insulationMm: number;\n  soil: Soil;\n  shielding: Shielding;\n}\n\nexport function perimeterRatio(\n  exposedPerimeterM: number,\n  areaM2: number,\n): number {\n  if (areaM2 <= 0) {\n    return MIN_RATIO;\n  }\n  return Math.max(MIN_RATIO, exposedPerimeterM / areaM2);\n}\n\nexport function groundFloorU(input: GroundInput): number {\n  const ratio = perimeterRatio(input.exposedPerimeterM, input.areaM2);\n  const b = 2 / ratio;\n  const lambda = GROUND_LAMBDA[input.soil];\n  const insulationM = Math.max(0, input.insulationMm) / 1000;\n  if (input.construction === \"solid\") {\n    return slab(b, lambda, insulationM / INSULATION_LAMBDA);\n  }\n  const ground = slab(b, lambda, 0);\n  const underfloor =\n    (2 * VOID_HEIGHT_M * VOID_WALL_U) / b +\n    (1450 * VENTS_M2_PER_M * WIND_SHIELDING[input.shielding] * WIND_M_S) / b;\n  return (\n    1 /\n    (1 / (ground + underfloor) + DECK_R + insulationM / BRIDGED_LAMBDA + VOID_R)\n  );\n}\n", "// U-values for the heat load from the design's fabric types: a known U-value\n// first, then the DHDG construction the type names, then the DHDG construction\n// its RdSAP description most resembles, and only then RdSAP's own default.\n\nimport {\n  type Construction,\n  construction,\n  describe,\n  nearest,\n} from \"../heatload/constructions\";\nimport type { Resolved, UValues } from \"../heatload/engine\";\nimport {\n  type GroundFloor,\n  groundFloorU,\n  type Shielding,\n  type Soil,\n} from \"../heatload/ground\";\nimport type { ModelRoom, Surface } from \"../heatload/model\";\nimport type { FabricType } from \"./scene\";\n\n/** DHDG section 2.5.3.5: added insulation is a layer of t/\u03BB, \u03BB = 0.04 W/mK. */\nconst ADDED_LAMBDA = 0.04;\n/** Insulation of unknown thickness. */\nconst ASSUMED_INSULATION_MM = 100;\n\ntype Spec = Record<string, unknown>;\n\nfunction text(spec: Spec, key: string, fallback = \"\"): string {\n  const value = spec[key];\n  return typeof value === \"string\" && value ? value : fallback;\n}\n\nfunction number(spec: Spec, key: string): number | null {\n  const value = spec[key];\n  return typeof value === \"number\" && Number.isFinite(value) && value > 0\n    ? value\n    : null;\n}\n\nfunction nested(spec: Spec, key: string): Spec {\n  const value = spec[key];\n  return typeof value === \"object\" && value !== null ? (value as Spec) : {};\n}\n\n/** Timber frame insulation by age band, where the type doesn't say. */\nconst TIMBER_MM: Record<string, number> = {\n  A: 50,\n  B: 50,\n  C: 50,\n  D: 50,\n  E: 50,\n  F: 50,\n  G: 75,\n  H: 75,\n  I: 75,\n  J: 75,\n  K: 100,\n  L: 150,\n  M: 150,\n};\n\nconst LATE = new Set([\"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\"]);\nconst EARLY = new Set([\"A\", \"B\", \"C\"]);\n\nexport interface Mapped {\n  row: Construction;\n  /** mm of insulation added on top of the table's build-up. */\n  addedMm: number;\n}\n\n/** The DHDG wall a wall type's RdSAP description most resembles. */\nexport function mappedWall(spec: Spec, internal = false): Mapped | null {\n  const kind = text(spec, \"construction\", \"UNFILLED_CAVITY\");\n  const insulation = nested(spec, \"insulation\");\n  const insulationKind = text(insulation, \"kind\", \"AS_BUILT\");\n  // An uninsulated wall is scored as an as-built band E one, as RdSAP does.\n  const specAge = text(spec, \"age\", \"D\");\n  const age = insulationKind === \"NONE\" && specAge > \"E\" ? \"E\" : specAge;\n  const thickness = number(spec, \"thickness_mm\");\n  const insulationMm = number(insulation, \"thickness_mm\");\n\n  if (internal) {\n    const studs = !EARLY.has(age) && kind !== \"BRICK\";\n    const row = studs\n      ? nearest(\n          \"2-32\",\n          \"3 mm plaster, 12.5 mm plasterboard, 75 mm open cavity, 12.5 mm plasterboard, 3 mm plaster\",\n          null,\n          {},\n        )\n      : nearest(\n          \"2-32\",\n          (thickness ?? 100) > 170\n            ? \"13 mm plaster, 215 mm brick, 13 mm plaster\"\n            : \"13 mm plaster, 102 mm brick, 13 mm plaster\",\n          null,\n          {},\n        );\n    return row ? { row, addedMm: 0 } : null;\n  }\n\n  const external =\n    insulationKind === \"EXTERNAL\" || insulationKind.endsWith(\"_AND_EXTERNAL\");\n  const internalInsulation =\n    insulationKind === \"INTERNAL\" || insulationKind.endsWith(\"_AND_INTERNAL\");\n  const filled =\n    kind === \"FILLED_CAVITY\" ||\n    insulationKind === \"FILLED_CAVITY\" ||\n    insulationKind.startsWith(\"CAVITY_AND_\");\n  const added = insulationMm ?? ASSUMED_INSULATION_MM;\n\n  switch (kind) {\n    case \"BRICK\": {\n      const brick =\n        !thickness || thickness <= 170 ? 102 : thickness <= 290 ? 228 : 343;\n      if (internalInsulation) {\n        const row = nearest(\n          \"2-23\",\n          \"brick, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\n          \"mineral wool (quilt)\",\n          { brick_depth_mm: brick, insulation_depth_mm: added },\n        );\n        return row ? { row, addedMm: 0 } : null;\n      }\n      if (external) {\n        const row = nearest(\n          \"2-23\",\n          \"19 mm external render (cement, sand), insulation (polypropylene fixings), brick, 13 mm plaster\",\n          \"expanded polystyrene\",\n          { brick_depth_mm: brick, insulation_depth_mm: added },\n        );\n        return row ? { row, addedMm: 0 } : null;\n      }\n      const row = nearest(\"2-19\", \"brick, 13 mm plaster\", null, {\n        brick_depth_mm: brick,\n      });\n      return row ? { row, addedMm: 0 } : null;\n    }\n    case \"GRANITE\":\n    case \"WHINSTONE\":\n    case \"SANDSTONE\":\n    case \"LIMESTONE\": {\n      const stone = thickness ?? 457;\n      if (internalInsulation) {\n        const row = nearest(\n          \"2-24\",\n          \"sandstone or granite, insulation (timber studding - 15%), 12.5 mm plasterboard, 3 mm plaster\",\n          \"mineral wool (quilt)\",\n          { stone_depth_mm: stone, insulation_depth_mm: added },\n        );\n        return row ? { row, addedMm: 0 } : null;\n      }\n      const row = nearest(\"2-20\", \"sandstone or granite\", null, {\n        stone_depth_mm: stone,\n      });\n      return row ? { row, addedMm: external ? added : 0 } : null;\n    }\n    case \"UNFILLED_CAVITY\":\n    case \"FILLED_CAVITY\": {\n      const cavity =\n        thickness && thickness > 240 ? Math.max(25, thickness - 217) : 50;\n      const fill = filled ? \"full\u2013fill \" : \"\";\n      const block = LATE.has(age);\n      const description = block\n        ? `102 mm brick, ${fill}cavity (wall ties), dense concrete block, 13 mm plaster`\n        : `102 mm brick, ${fill}cavity (wall ties), 102 mm brick, 13 mm plaster`;\n      const wanted: Record<string, number | string> = {\n        cavity_depth_mm: cavity,\n        wall_ties: \"metal\",\n      };\n      if (block) {\n        wanted[\"inner_leaf_depth_mm\"] = 100;\n        wanted[\"inner_leaf\"] = \"dense concrete block\";\n      }\n      const row = nearest(\n        block ? \"2-29\" : \"2-28\",\n        description,\n        fill ? \"mineral wool (batts)\" : \"open cavity\",\n        wanted,\n      );\n      return row\n        ? { row, addedMm: external || internalInsulation ? added : 0 }\n        : null;\n    }\n    case \"TIMBER\": {\n      const depth = insulationMm ?? TIMBER_MM[age] ?? 75;\n      const row = nearest(\n        \"2-27\",\n        \"102 mm brick, 50 mm cavity (uninsulated) (mild steel frame fixings), 15 mm oriented strand board or plywood sheathing, insulation (timber studding - 15%), 0.5 mm breathable membrane or felt, 12.5 mm plasterboard, 3 mm plaster\",\n        \"mineral wool (quilt)\",\n        { insulation_depth_mm: depth },\n      );\n      return row ? { row, addedMm: 0 } : null;\n    }\n    case \"SYSTEM_BUILD\": {\n      const row = nearest(\"2-21\", \"dense cast concrete, 13 mm plaster\", null, {\n        concrete_depth_mm: 152,\n      });\n      return row\n        ? { row, addedMm: external || internalInsulation ? added : 0 }\n        : null;\n    }\n    default:\n      return null;\n  }\n}\n\n/** The DHDG roof a roof type's RdSAP description most resembles. */\nexport function mappedRoof(spec: Spec): Mapped | null {\n  const kind = text(spec, \"insulation_kind\", \"JOISTS\");\n  const thickness = number(spec, \"insulation_thickness_mm\");\n  const roomInRoof = spec[\"room_in_roof\"] === true;\n  if (thickness === null) {\n    if (kind === \"UNKNOWN\") {\n      return null;\n    }\n    const row = nearest(\n      \"2-33\",\n      \"roof tile, cavity (ventilated, timber battens), roof space (ventilated inc. rafters and joists), 12.5 mm plasterboard, 3 mm plaster\",\n      null,\n      {},\n    );\n    return row ? { row, addedMm: 0 } : null;\n  }\n  if (kind === \"RAFTERS\" || roomInRoof) {\n    const row = nearest(\n      \"2-35\",\n      \"roof tile, cavity (ventilated, timber battens), breathable membrane or felt, cavity (uninsulated) (rafters - 10%), insulation (rafters - 10%), 12.5 mm plasterboard, 3 mm plaster\",\n      \"mineral wool (batts)\",\n      { insulation_depth_mm: thickness },\n    );\n    return row ? { row, addedMm: 0 } : null;\n  }\n  const row = nearest(\n    \"2-34\",\n    \"roof tile, cavity (ventilated, timber battens), roof space (ventilated inc. rafters), insulation (timber joists - 10%), 12.5 mm plasterboard, 3 mm plaster\",\n    \"mineral wool (quilt)\",\n    { insulation_depth_mm: thickness },\n  );\n  return row ? { row, addedMm: 0 } : null;\n}\n\n/** Table 2-38 from the window's glazing, frame and gap. */\nexport function mappedWindow(spec: Spec): Mapped | null {\n  const glazing = text(spec, \"glazing\", \"DOUBLE_GLAZED\");\n  const metal = text(spec, \"frame\", \"PVC\") === \"METAL\";\n  const frame = metal\n    ? \"Metal frame, 4 mm thermal break\"\n    : \"Wood or PVC-U frame\";\n  if (glazing === \"SINGLE_GLAZED\") {\n    const row = nearest(\"2-38\", `${frame}, single glazed`, null, {});\n    return row ? { row, addedMm: 0 } : null;\n  }\n  const triple = glazing.startsWith(\"TRIPLE\");\n  const lowE = glazing.includes(\"LOW_E\");\n  const argon = spec[\"gas_filled\"] === true;\n  const panes = [triple ? \"triple glazed\" : \"double glazed\"];\n  if (lowE) {\n    panes.push(\"low-e\");\n  }\n  if (argon) {\n    panes.push(\"argon\");\n  }\n  const gapText = text(spec, \"gap\", \"UNKNOWN\");\n  // Secondary glazing sits well back from the window: a wide gap.\n  const gap =\n    glazing === \"SECONDARY_GLAZED\"\n      ? 16\n      : gapText === \"6\"\n        ? 6\n        : gapText === \"16_OR_OVER\"\n          ? 16\n          : 12;\n  const row = nearest(\"2-38\", `${frame}, ${panes.join(\", \")}`, null, {\n    pane_gap_mm: gap,\n  });\n  return row ? { row, addedMm: 0 } : null;\n}\n\nexport function mappedDoor(spec: Spec): Mapped | null {\n  if (text(spec, \"kind\", \"UNINSULATED\") !== \"UNINSULATED\") {\n    return null;\n  }\n  const row = nearest(\"2-38-doors\", \"Solid wooden door\", null, {});\n  return row ? { row, addedMm: 0 } : null;\n}\n\nfunction withAdded(u: number, addedMm: number): number {\n  return addedMm > 0 ? 1 / (1 / u + addedMm / 1000 / ADDED_LAMBDA) : u;\n}\n\n/** The U-value the heat load gives a wall type, with its source in a few words. */\nexport function wallHeatLoadU(\n  spec: Spec,\n): { u: number; source: string } | null {\n  const mapped = mappedWall(spec);\n  return mapped\n    ? {\n        u: withAdded(mapped.row.u, mapped.addedMm),\n        source: `CIBSE DHDG ${mapped.row.table}`,\n      }\n    : null;\n}\n\nfunction fromMapping(mapped: Mapped, how: string): Resolved {\n  const added = mapped.addedMm > 0 ? ` + ${mapped.addedMm} mm insulation` : \"\";\n  return {\n    u: withAdded(mapped.row.u, mapped.addedMm),\n    source: `DHDG Table ${mapped.row.table}${how}: ${describe(mapped.row)}${added}`,\n  };\n}\n\nexport interface FabricSettings {\n  soil: Soil;\n  shielding: Shielding;\n}\n\nexport function groundConstruction(spec: Spec): GroundFloor {\n  const kind = text(spec, \"construction\", \"UNSEALED_SUSPENDED_TIMBER\");\n  return kind.includes(\"SUSPENDED\") ? \"suspended\" : \"solid\";\n}\n\nconst INTERNAL_FLOOR = {\n  up: \"Intermediate floor, heat flows up\",\n  down: \"Intermediate floor, heat flows down\",\n  exposed: \"Timber floor over outside or unheated space (heat flows down)\",\n};\n\nfunction internalFloor(which: keyof typeof INTERNAL_FLOOR): Resolved {\n  const row = nearest(\"2-41\", INTERNAL_FLOOR[which], null, {\n    insulation_mm: 0,\n  });\n  return {\n    u: row?.u ?? 1.73,\n    source: `DHDG Table 2-41: ${INTERNAL_FLOOR[which].toLowerCase()}`,\n  };\n}\n\ntype Elements = Record<string, Record<string, unknown>>;\n\n/** An element by bridge key. Once north is set a window type's elements are\n * split by the way they face, but they share its U-value. */\nexport function elementOf(\n  elements: Elements,\n  key: string,\n): Record<string, unknown> | undefined {\n  return (\n    elements[key] ??\n    Object.entries(elements).find(([candidate]) =>\n      candidate.startsWith(`${key}:`),\n    )?.[1]\n  );\n}\n\n/** The number in an RdSAP element's U-value, which may carry units. */\nexport function rdsapU(\n  element: Record<string, unknown> | undefined,\n): number | null {\n  const raw = element?.[\"uvalue\"];\n  const u =\n    typeof raw === \"number\" ? raw : Number.parseFloat(String(raw ?? \"\").trim());\n  return Number.isFinite(u) && u > 0 ? u : null;\n}\n\n/** The bridge key RdSAP knows a surface's fabric by, or null for internal fabric. */\nexport function rdsapKey(\n  fabric: string,\n  types: readonly FabricType[],\n): string | null {\n  const [element, id] = fabric.split(\":\");\n  if (element === \"wall\" || element === \"window\") {\n    return fabric;\n  }\n  // A measure on the roof or floor improves the house's own, not what a\n  // proposal builds new under its own type.\n  if (element === \"roof\" || element === \"floor\") {\n    const type = types.find((candidate) => String(candidate.id) === id);\n    const own = element === \"roof\" ? \"roof\" : \"ground-floor\";\n    return type && !type.is_default ? `${own}:${id}` : own;\n  }\n  if (element === \"door\") {\n    const type = types.find((candidate) => String(candidate.id) === id);\n    return `door:${text(type?.spec ?? {}, \"kind\", \"UNINSULATED\")}`;\n  }\n  return null;\n}\n\n/**\n * m\u00B2K/W a measure adds to a fabric, as RdSAP sees it: what the DHDG U-value\n * gains when a scenario patches that element.\n */\nexport function addedResistance(\n  key: string | null,\n  patched: Elements,\n  baseline: Elements,\n): number {\n  if (key === null) {\n    return 0;\n  }\n  const after = rdsapU(elementOf(patched, key));\n  const before = rdsapU(elementOf(baseline, key));\n  if (after === null || before === null || after === before) {\n    return 0;\n  }\n  return 1 / after - 1 / before;\n}\n\nexport function withResistance(u: number, resistance: number): number {\n  return resistance === 0 ? u : 1 / Math.max(1 / u + resistance, 0.01);\n}\n\n/**\n * U-values for a design. `derived` is the server's RdSAP elements by bridge key,\n * the last resort for a fabric the DHDG has no table for; where a scenario has\n * patched them, `baseline` is the unpatched set and the difference is a measure.\n */\nexport function designUValues(\n  types: readonly FabricType[],\n  derived: Elements,\n  settings: FabricSettings,\n  baseline: Elements = derived,\n): UValues {\n  const byKey = new Map(\n    types.map((type) => [`${type.element.toLowerCase()}:${type.id}`, type]),\n  );\n\n  const rdsap = (key: string, what: string): Resolved => {\n    const u = rdsapU(elementOf(derived, key));\n    if (u === null) {\n      throw new HeatFabricError(`No U-value for the ${what}.`);\n    }\n    return { u, source: `RdSAP default for the ${what} (no DHDG table)` };\n  };\n\n  const chosen = (type: FabricType): Resolved | null => {\n    const known = number(type.spec, \"uvalue\");\n    if (known !== null) {\n      return { u: known, source: \"Known U-value\" };\n    }\n    const row = construction(text(type.spec, \"dhdg\") || null);\n    if (row) {\n      return { u: row.u, source: `DHDG Table ${row.table}: ${describe(row)}` };\n    }\n    return null;\n  };\n\n  const resolve = (\n    surface: Surface,\n    room: ModelRoom,\n    deltaDesign: number,\n  ): Resolved => {\n    const type = byKey.get(surface.fabric);\n    switch (surface.kind) {\n      case \"wall\": {\n        const internal = surface.boundary.kind === \"room\";\n        if (type) {\n          const picked = chosen(type);\n          if (picked) {\n            return picked;\n          }\n          const mapped = mappedWall(type.spec, internal);\n          if (mapped) {\n            return fromMapping(mapped, \" (from the wall type)\");\n          }\n          return rdsap(surface.fabric, `wall \"${type.name}\"`);\n        }\n        const mapped = mappedWall(\n          { construction: \"UNFILLED_CAVITY\", age: \"D\" },\n          true,\n        );\n        if (internal && mapped) {\n          return fromMapping(mapped, \"\");\n        }\n        throw new HeatFabricError(`No wall type for ${surface.label}.`);\n      }\n      case \"window\": {\n        if (type) {\n          const picked = chosen(type);\n          if (picked) {\n            return picked;\n          }\n          const mapped = mappedWindow(type.spec);\n          if (mapped) {\n            return fromMapping(mapped, \" (from the window type)\");\n          }\n        }\n        return rdsap(surface.fabric, \"window\");\n      }\n      case \"door\": {\n        if (surface.fabric === \"internal-door\") {\n          const mapped = mappedDoor({ kind: \"UNINSULATED\" });\n          if (mapped) {\n            return fromMapping(mapped, \" (internal door)\");\n          }\n        }\n        if (type) {\n          const picked = chosen(type);\n          if (picked) {\n            return picked;\n          }\n          const mapped = mappedDoor(type.spec);\n          if (mapped) {\n            return fromMapping(mapped, \" (from the door type)\");\n          }\n          return rdsap(\n            `door:${text(type.spec, \"kind\", \"UNINSULATED\")}`,\n            `door \"${type.name}\"`,\n          );\n        }\n        return rdsap(\"door:UNINSULATED\", \"door\");\n      }\n      case \"roof\": {\n        if (type) {\n          const picked = chosen(type);\n          if (picked) {\n            return picked;\n          }\n          const mapped = mappedRoof(type.spec);\n          if (mapped) {\n            return fromMapping(mapped, \" (from the roof type)\");\n          }\n        }\n        return rdsap(\"roof\", \"roof\");\n      }\n      case \"ground-floor\": {\n        const spec = type?.spec ?? {};\n        const construction = groundConstruction(spec);\n        const leaks = construction === \"suspended\";\n        const known = number(spec, \"uvalue\");\n        if (known !== null) {\n          return { u: known, source: \"Known U-value\", leaks };\n        }\n        const insulationMm = number(spec, \"insulation_thickness_mm\") ?? 0;\n        return {\n          u: groundFloorU({\n            construction,\n            exposedPerimeterM: room.exposedPerimeterM,\n            areaM2: room.areaM2,\n            insulationMm,\n            soil: settings.soil,\n            shielding: settings.shielding,\n          }),\n          source: `BS EN ISO 13370 as DHDG Tables 2-43 to 2-54: ${construction}, ${insulationMm} mm insulation, P/A ${(room.exposedPerimeterM / Math.max(room.areaM2, 0.01)).toFixed(2)}`,\n          leaks,\n        };\n      }\n      case \"floor\":\n        if (surface.boundary.kind === \"room\") {\n          return internalFloor(deltaDesign > 0 ? \"down\" : \"up\");\n        }\n        return internalFloor(\"exposed\");\n      case \"ceiling\":\n        if (surface.boundary.kind === \"room\") {\n          return internalFloor(deltaDesign > 0 ? \"up\" : \"down\");\n        }\n        return internalFloor(\"up\");\n    }\n  };\n\n  return (surface: Surface, room: ModelRoom, deltaDesign: number): Resolved => {\n    const resolved = resolve(surface, room, deltaDesign);\n    if (resolved.source.startsWith(\"RdSAP\")) {\n      return resolved;\n    }\n    const resistance = addedResistance(\n      rdsapKey(surface.fabric, types),\n      derived,\n      baseline,\n    );\n    if (resistance === 0) {\n      return resolved;\n    }\n    return {\n      ...resolved,\n      u: withResistance(resolved.u, resistance),\n      source: `${resolved.source}, with the measure`,\n    };\n  };\n}\n\nexport class HeatFabricError extends Error {}\n\n/** What U-value a fabric type gives the heat load, before bridging, in a few words. */\nexport function fabricUValue(type: FabricType): string | null {\n  const known = number(type.spec, \"uvalue\");\n  if (known !== null) {\n    return `U ${known} known`;\n  }\n  const row = construction(text(type.spec, \"dhdg\") || null);\n  if (row) {\n    return `U ${row.u}`;\n  }\n  let mapped: Mapped | null = null;\n  switch (type.element) {\n    case \"WALL\":\n      mapped = mappedWall(type.spec);\n      break;\n    case \"ROOF\":\n      mapped = mappedRoof(type.spec);\n      break;\n    case \"WINDOW\":\n      mapped = mappedWindow(type.spec);\n      break;\n    case \"DOOR\":\n      mapped = mappedDoor(type.spec);\n      break;\n    case \"FLOOR\": {\n      // A floor's U-value follows its shape, so this is a typical house's\n      // (12 m exposed edge to 30 m\u00B2); each room gets its own in the heat load.\n      const raw = type.spec[\"insulation_thickness_mm\"];\n      const insulationMm = typeof raw === \"number\" ? raw : null;\n      if (insulationMm === null) {\n        // \"As built\" is RdSAP's age-based default, which only the twin has.\n        return \"U by age (RdSAP), as built\";\n      }\n      const u = groundFloorU({\n        construction: groundConstruction(type.spec),\n        exposedPerimeterM: 12,\n        areaM2: 30,\n        insulationMm,\n        soil: \"clay\",\n        shielding: \"average\",\n      });\n      return `U ${u.toFixed(2)} for a typical floor`;\n    }\n  }\n  if (!mapped) {\n    return null;\n  }\n  const u = withAdded(mapped.row.u, mapped.addedMm);\n  return `U ${u.toFixed(2)}`;\n}\n", "// The house as the heat load sees it: rooms bounded by surfaces, each surface\n// facing something at a known temperature. Built from the design tool's plan\n// (`assets/ts/design/heatmodel.ts`), but nothing here knows about scenes.\n\n/** What is on the far side of a surface. */\nexport type Boundary =\n  | { kind: \"outside\" }\n  | { kind: \"ground\" }\n  /** The neighbouring dwelling, through a party wall or floor. */\n  | { kind: \"adjoining\" }\n  /** Inside the house but not heated: a garage, porch or store. */\n  | { kind: \"unheated\"; space: string }\n  /** Another heated room, which may be kept warmer or cooler. */\n  | { kind: \"room\"; room: string };\n\nexport type SurfaceKind =\n  | \"wall\"\n  | \"window\"\n  | \"door\"\n  | \"floor\"\n  | \"ceiling\"\n  | \"roof\"\n  | \"ground-floor\";\n\nexport interface Surface {\n  kind: SurfaceKind;\n  label: string;\n  areaM2: number;\n  boundary: Boundary;\n  /** The fabric this surface is made of; resolved to a U-value by the caller. */\n  fabric: string;\n  /** The drawn thing it comes from, so a row can point at it on the plan. */\n  ref?: SurfaceRef;\n}\n\nexport interface SurfaceRef {\n  layer: \"walls\" | \"openings\" | \"rooms\";\n  id: string;\n}\n\nexport interface ModelRoom {\n  id: string;\n  name: string;\n  /** Free text as drawn; matched to a DHDG room type. */\n  roomType: string;\n  floor: string;\n  level: number;\n  /** Internal floor area, m\u00B2. */\n  areaM2: number;\n  /** Floor to ceiling, m. */\n  heightM: number;\n  /** The room's own exposed perimeter, m: walls to outside or to unheated space. */\n  exposedPerimeterM: number;\n  surfaces: Surface[];\n  /** \u00B0C, where the designer has set one; otherwise the room type decides. */\n  temperatureC: number | null;\n  /** Ventilation features in the room (DHDG Table 2-12). */\n  ventilation: RoomVentilation;\n  /** m\u00B3/h a continuous system extracts and resupplies here. */\n  continuousM3h: number;\n}\n\nexport interface RoomVentilation {\n  /** Trickle vents or other background ventilators. */\n  backgroundVents: number;\n  /** Intermittent extract fans. */\n  extractFans: number;\n  /** Open chimneys or disused flues. */\n  openFlues: number;\n}\n\nexport const NO_VENTILATION: RoomVentilation = {\n  backgroundVents: 0,\n  extractFans: 0,\n  openFlues: 0,\n};\n\nexport interface Model {\n  rooms: ModelRoom[];\n  /** Rooms drawn but not heated: listed, not loaded. */\n  unheated: {\n    id: string;\n    name: string;\n    roomType: string;\n    floor: string;\n    areaM2: number;\n  }[];\n}\n", "// Setting the house up once its plan exists: the pure parts of the guided flow.\n\nimport type { FixtureKind, Scene } from \"./scene\";\nimport { wallKinds } from \"./topology\";\n\nexport const STEPS = [\n  { key: \"house\", title: \"The house\" },\n  { key: \"fabric\", title: \"Fabric types\" },\n  { key: \"walls\", title: \"Walls\" },\n  { key: \"wet\", title: \"Baths and showers\" },\n  { key: \"ventilation\", title: \"Ventilation\" },\n  { key: \"heating\", title: \"Heating plant\" },\n  { key: \"north\", title: \"Orientation\" },\n] as const;\n\nexport type StepKey = (typeof STEPS)[number][\"key\"];\n\n/** The flow needs rooms with walls to work on. */\nexport function planExists(scenes: readonly Scene[]): boolean {\n  return scenes.some(\n    (scene) => scene.rooms.length > 0 && scene.walls.length > 0,\n  );\n}\n\nexport function doneSteps(raw: unknown): StepKey[] {\n  const known = new Set<string>(STEPS.map((step) => step.key));\n  return String(raw ?? \"\")\n    .split(\",\")\n    .filter((key): key is StepKey => known.has(key));\n}\n\n/** The first step not yet done, or the first. */\nexport function firstOpen(done: readonly StepKey[]): number {\n  const index = STEPS.findIndex((step) => !done.includes(step.key));\n  return index < 0 ? 0 : index;\n}\n\n/** The thickness most external walls share. */\nfunction commonThickness(thicknesses: number[]): number | null {\n  const counts = new Map<number, number>();\n  for (const value of thicknesses) {\n    counts.set(value, (counts.get(value) ?? 0) + 1);\n  }\n  let best: number | null = null;\n  for (const [value, count] of counts) {\n    if (best === null || count > (counts.get(best) ?? 0)) {\n      best = value;\n    }\n  }\n  return best;\n}\n\n/** Walls a surveyor should look at: outside walls of another thickness from\n * most (an extension, or a different import), and not yet given a type. */\nexport function toCheck(scene: Scene): string[] {\n  const kinds = wallKinds(scene);\n  const outside = scene.walls.filter(\n    (wall) => kinds.get(wall.id) === \"EXTERNAL\",\n  );\n  const common = commonThickness(outside.map((wall) => wall.thickness));\n  if (common === null) {\n    return [];\n  }\n  return outside\n    .filter(\n      (wall) => wall.fabric == null && Math.abs(wall.thickness - common) >= 40,\n    )\n    .map((wall) => wall.id);\n}\n\n/** \"12 walls \u00B7 3 to check\", across floors. */\nexport function wallCount(scenes: readonly Scene[]): string {\n  let walls = 0;\n  let check = 0;\n  for (const scene of scenes) {\n    const kinds = wallKinds(scene);\n    walls += scene.walls.filter(\n      (wall) => kinds.get(wall.id) === \"EXTERNAL\",\n    ).length;\n    check += toCheck(scene).length;\n  }\n  return `${walls} ${walls === 1 ? \"wall\" : \"walls\"} \u00B7 ${check} to check`;\n}\n\n/** How many of a kind of fixture the scenes place. */\nexport function fixtureCount(\n  scenes: readonly Scene[],\n  kind: FixtureKind,\n): number {\n  return scenes.reduce(\n    (total, scene) =>\n      total +\n      (scene.fixtures ?? []).filter((fixture) => fixture.kind === kind).length,\n    0,\n  );\n}\n\nexport function trickleCount(scenes: readonly Scene[]): number {\n  return scenes.reduce(\n    (total, scene) =>\n      total + scene.openings.filter((opening) => opening.trickle).length,\n    0,\n  );\n}\n\n/**\n * A room's background vents and extract fans. A room that has trickle windows\n * or fans placed takes those counts; every other room keeps its own numbers,\n * imported or typed.\n */\nexport function roomVentilation(\n  scenes: readonly Scene[],\n  scene: Scene,\n  roomId: string,\n): { vents: number | undefined; fans: number | undefined } {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  let vents = room?.vents;\n  let fans = room?.fans;\n  if (room && trickleCount(scenes) > 0) {\n    const edges = new Set(\n      room.boundary.map((vertex, index) => {\n        const next = room.boundary[\n          (index + 1) % room.boundary.length\n        ] as string;\n        return [vertex, next].sort().join(\"|\");\n      }),\n    );\n    const walls = new Set(\n      scene.walls\n        .filter((wall) => edges.has([wall.a, wall.b].sort().join(\"|\")))\n        .map((wall) => wall.id),\n    );\n    const trickles = scene.openings.filter(\n      (opening) => opening.trickle && walls.has(opening.wall),\n    ).length;\n    if (trickles > 0) {\n      vents = trickles;\n    }\n  }\n  const extracts = (scene.fixtures ?? []).filter(\n    (fixture) => fixture.kind === \"extract_fan\" && fixture.room === roomId,\n  ).length;\n  if (extracts > 0) {\n    fans = extracts;\n  }\n  return { vents, fans };\n}\n\nconst POINT_NAMES = [\n  \"north\",\n  \"north-east\",\n  \"east\",\n  \"south-east\",\n  \"south\",\n  \"south-west\",\n  \"west\",\n  \"north-west\",\n];\n\n/** Which way the front faces: the bottom of the plan as it is on the page,\n * given where north points on screen (clockwise from up). */\nexport function frontFaces(northOnScreen: number | null): string {\n  if (northOnScreen === null) {\n    return \"Set north to see which way the front faces\";\n  }\n  const bearing = (((180 - northOnScreen) % 360) + 360) % 360;\n  const name = POINT_NAMES[Math.floor(bearing / 45 + 0.5) % 8] as string;\n  return `Front faces ${name}`;\n}\n", "// The design's floors as the heat load's model: rooms measured to their inner\n// faces, every wall, floor and ceiling paired with what lies beyond it. Floors\n// are stacked in one frame, so a ceiling is a roof wherever no room is above.\n\nimport { area, inset, length, overlap, type Point } from \"../heatload/geometry\";\nimport {\n  type Boundary,\n  type Model,\n  NO_VENTILATION,\n  type Surface,\n} from \"../heatload/model\";\nimport { resolve as resolveFabric } from \"./bridge\";\nimport { profileOf } from \"./ceiling\";\nimport { innerBreastAreaMm2 } from \"./features\";\nimport { newBuildParts } from \"./newbuild\";\nimport { resolve } from \"./resolve\";\nimport { roomVentilation } from \"./setup\";\nimport type { FabricType, Opening, Scene } from \"./scene\";\n\nconst MM_PER_M = 1000;\nconst MM2_PER_M2 = 1_000_000;\n\n/** Below this a sliver of overlap is drawing noise, not a ceiling. */\nconst SLIVER = 0.01;\n\nexport interface FloorInput {\n  name: string;\n  level: number;\n  ceiling_height_mm: number;\n  scene: Scene;\n}\n\nexport class ModelError extends Error {}\n\ninterface Placed {\n  id: string;\n  heated: boolean;\n  roomType: string;\n  /** The centreline polygon: the frame floors are stacked in. */\n  outline: Point[];\n  outlineArea: number;\n}\n\nfunction pairKey(a: string, b: string): string {\n  return a < b ? `${a}|${b}` : `${b}|${a}`;\n}\n\nfunction openingsOn(\n  openings: readonly Opening[],\n  wallLengthMm: number,\n): Opening[] {\n  return openings.filter((opening) => {\n    const start = Math.min(Math.max(opening.offset, 0), wallLengthMm);\n    const centre = start + opening.width / 2;\n    return centre >= 0 && centre <= wallLengthMm;\n  });\n}\n\nfunction count(value: unknown): number {\n  return typeof value === \"number\" && Number.isFinite(value) && value > 0\n    ? Math.round(value)\n    : 0;\n}\n\nfunction fabricKey(\n  types: readonly FabricType[],\n  element: string,\n  reference: number | null | undefined,\n  fallback: string,\n): string {\n  const type = resolveFabric(types, element, reference);\n  return type ? `${element.toLowerCase()}:${type.id}` : fallback;\n}\n\nexport function buildModel(\n  floors: readonly FloorInput[],\n  types: readonly FabricType[],\n): Model {\n  if (floors.length === 0) {\n    throw new ModelError(\"The design has no floors.\");\n  }\n  const ordered = [...floors].sort((a, b) => a.level - b.level);\n  const views = ordered.map((floor) => resolve(floor.scene, types));\n\n  const placed: Placed[][] = ordered.map((_floor, index) => {\n    const view = views[index];\n    return (view?.rooms ?? []).map((room) => {\n      const outline = room.polygon as unknown as Point[];\n      return {\n        id: room.id,\n        heated: room.heated,\n        roomType: room.roomType || room.name,\n        outline,\n        outlineArea: area(outline),\n      };\n    });\n  });\n\n  const roofKey = fabricKey(types, \"ROOF\", null, \"roof\");\n  const groundKey = fabricKey(types, \"FLOOR\", null, \"ground-floor\");\n\n  const model: Model = { rooms: [], unheated: [] };\n\n  ordered.forEach((floor, index) => {\n    const view = views[index];\n    if (!view) {\n      return;\n    }\n    const floorName = floor.name || `Level ${floor.level}`;\n    const byPair = new Map(\n      floor.scene.walls.map((wall) => [pairKey(wall.a, wall.b), wall.id]),\n    );\n    const at = new Map(floor.scene.vertices.map((v) => [v.id, v.at]));\n    const sceneRooms = new Map(floor.scene.rooms.map((r) => [r.id, r]));\n    const roomsById = new Map(view.rooms.map((room) => [room.id, room]));\n\n    for (const room of view.rooms) {\n      const drawn = sceneRooms.get(room.id);\n      if (!drawn) {\n        continue;\n      }\n      const ring = drawn.boundary.filter((vertex) => at.has(vertex));\n      const outline = ring.map((vertex) => at.get(vertex) as Point);\n      if (area(outline) <= 0) {\n        continue;\n      }\n      const edgeWalls = ring.map((vertex, i) => {\n        const next = ring[(i + 1) % ring.length] as string;\n        const wallId = byPair.get(pairKey(vertex, next));\n        return wallId ? view.wall(wallId) : undefined;\n      });\n      const inner = inset(\n        outline,\n        edgeWalls.map((wall) => (wall ? wall.thickness / 2 : 0)),\n      );\n      const areaM2 =\n        Math.max(area(inner) - innerBreastAreaMm2(floor.scene, room.id), 0) /\n        MM2_PER_M2;\n\n      if (!room.heated) {\n        model.unheated.push({\n          id: room.id,\n          name: room.name,\n          roomType: room.roomType || room.name,\n          floor: floorName,\n          areaM2,\n        });\n        continue;\n      }\n\n      // A sloped ceiling: the mean height keeps the volume, each wall follows\n      // the slope, and the roof is the sloping surface.\n      const shaped = profileOf(inner, room.ceiling);\n      const heightM =\n        (shaped?.meanHeight() ||\n          room.ceilingHeight ||\n          floor.ceiling_height_mm) / MM_PER_M;\n      const surfaces: Surface[] = [];\n      let exposedPerimeterM = 0;\n\n      edgeWalls.forEach((wall, i) => {\n        if (!wall) {\n          return;\n        }\n        const lengthM =\n          length(inner[i] as Point, inner[(i + 1) % inner.length] as Point) /\n          MM_PER_M;\n        const other = wall.rooms.find((id) => id !== room.id);\n        const neighbour = other ? roomsById.get(other) : undefined;\n\n        let boundary: Boundary;\n        if (neighbour) {\n          boundary = neighbour.heated\n            ? { kind: \"room\", room: neighbour.id }\n            : {\n                kind: \"unheated\",\n                space: neighbour.roomType || neighbour.name,\n              };\n        } else if (wall.kind === \"PARTY\") {\n          boundary = { kind: \"adjoining\" };\n        } else {\n          boundary = { kind: \"outside\" };\n        }\n        if (boundary.kind === \"outside\" || boundary.kind === \"unheated\") {\n          exposedPerimeterM += lengthM;\n        }\n\n        const explicit = floor.scene.walls.find(\n          (w) => w.id === wall.id,\n        )?.fabric;\n        const wallFabric =\n          boundary.kind === \"room\" &&\n          (explicit === null || explicit === undefined)\n            ? \"internal-wall\"\n            : wall.key;\n\n        const grossM2 = shaped\n          ? shaped.wallArea(\n              inner[i] as Point,\n              inner[(i + 1) % inner.length] as Point,\n            ) / MM2_PER_M2\n          : lengthM * heightM;\n        let openingM2 = 0;\n        for (const opening of openingsOn(\n          view.openingsByWall.get(wall.id) ?? [],\n          wall.lengthMm,\n        )) {\n          const openingArea = (opening.width * opening.height) / MM2_PER_M2;\n          openingM2 += openingArea;\n          if (opening.type === \"opening\") {\n            continue;\n          }\n          const element = opening.type === \"window\" ? \"WINDOW\" : \"DOOR\";\n          const type = resolveFabric(types, element, opening.fabric);\n          surfaces.push({\n            kind: opening.type,\n            label:\n              type?.name ?? (opening.type === \"window\" ? \"Window\" : \"Door\"),\n            areaM2: openingArea,\n            boundary,\n            fabric:\n              boundary.kind === \"room\" && opening.type === \"door\"\n                ? \"internal-door\"\n                : type\n                  ? `${element.toLowerCase()}:${type.id}`\n                  : opening.type,\n            ref: { layer: \"openings\", id: opening.id },\n          });\n        }\n        surfaces.push({\n          kind: \"wall\",\n          label: wallFabric === \"internal-wall\" ? \"Internal wall\" : wall.name,\n          areaM2: Math.max(grossM2 - openingM2, 0),\n          boundary,\n          fabric: wallFabric,\n          ref: { layer: \"walls\", id: wall.id },\n        });\n      });\n\n      const self = placed[index]?.find((candidate) => candidate.id === room.id);\n      const outlineArea = self?.outlineArea ?? area(outline);\n      const shares = (others: Placed[] | undefined) => {\n        const found: { other: Placed; share: number }[] = [];\n        let covered = 0;\n        for (const other of others ?? []) {\n          const share = overlap(outline, other.outline) / outlineArea;\n          if (share > SLIVER) {\n            found.push({ other, share });\n            covered += share;\n          }\n        }\n        return { found, rest: Math.max(0, 1 - Math.min(covered, 1)) };\n      };\n\n      const facing = (other: Placed): Boundary =>\n        other.heated\n          ? { kind: \"room\", room: other.id }\n          : { kind: \"unheated\", space: other.roomType };\n\n      const above = shares(placed[index + 1]);\n      for (const { other, share } of above.found) {\n        surfaces.push({\n          kind: \"ceiling\",\n          ref: { layer: \"rooms\", id: room.id },\n          label: \"Ceiling\",\n          areaM2: areaM2 * share,\n          boundary: facing(other),\n          fabric: \"internal-floor\",\n        });\n      }\n      // Where a proposal builds new, its own floor and roof.\n      const built = newBuildParts(floor.scene, outline).map(\n        ({ area, mm2 }) => ({\n          share: Math.min(mm2 / outlineArea, 1),\n          roof: fabricKey(types, \"ROOF\", area.roof, roofKey),\n          floor: fabricKey(types, \"FLOOR\", area.floor, groundKey),\n        }),\n      );\n      const split = (\n        whole: number,\n        pick: (part: (typeof built)[number]) => string,\n        fallback: string,\n      ): [string, number][] => {\n        const parts = new Map<string, number>();\n        let left = 1;\n        for (const part of built) {\n          const share = Math.min(part.share, left);\n          left -= share;\n          const key = pick(part);\n          parts.set(key, (parts.get(key) ?? 0) + whole * share);\n        }\n        parts.set(fallback, (parts.get(fallback) ?? 0) + whole * left);\n        return [...parts].filter(([, each]) => each > 0);\n      };\n\n      if (above.rest > SLIVER) {\n        for (const [fabric, part] of split(\n          areaM2 * above.rest * (shaped?.roofFactor ?? 1),\n          (each) => each.roof,\n          roofKey,\n        )) {\n          surfaces.push({\n            kind: \"roof\",\n            ref: { layer: \"rooms\", id: room.id },\n            label: \"Roof\",\n            areaM2: part,\n            boundary: { kind: \"outside\" },\n            fabric,\n          });\n        }\n      }\n\n      const below =\n        index > 0 ? shares(placed[index - 1]) : { found: [], rest: 1 };\n      for (const { other, share } of below.found) {\n        surfaces.push({\n          kind: \"floor\",\n          ref: { layer: \"rooms\", id: room.id },\n          label: \"Floor\",\n          areaM2: areaM2 * share,\n          boundary: facing(other),\n          fabric: \"internal-floor\",\n        });\n      }\n      // A storey at ground level or below sits on the ground wherever no\n      // room is under it: a cellar under one room leaves the rest on soil.\n      const onGround = index === 0 || floor.level <= 0;\n      if (below.rest > SLIVER && onGround) {\n        for (const [fabric, part] of split(\n          areaM2 * below.rest,\n          (each) => each.floor,\n          groundKey,\n        )) {\n          surfaces.push({\n            kind: \"ground-floor\",\n            ref: { layer: \"rooms\", id: room.id },\n            label: \"Ground floor\",\n            areaM2: part,\n            boundary: { kind: \"ground\" },\n            fabric,\n          });\n        }\n      } else if (below.rest > SLIVER) {\n        surfaces.push(\n          onGround\n            ? {\n                kind: \"ground-floor\",\n                ref: { layer: \"rooms\", id: room.id },\n                label: \"Ground floor\",\n                areaM2: areaM2 * below.rest,\n                boundary: { kind: \"ground\" },\n                fabric: groundKey,\n              }\n            : {\n                kind: \"floor\",\n                ref: { layer: \"rooms\", id: room.id },\n                label: \"Exposed floor\",\n                areaM2: areaM2 * below.rest,\n                boundary: { kind: \"outside\" },\n                fabric: \"exposed-floor\",\n              },\n        );\n      }\n\n      const temperature = drawn.temperature;\n      const vented = roomVentilation(\n        ordered.map((placed) => placed.scene),\n        floor.scene,\n        room.id,\n      );\n      model.rooms.push({\n        id: room.id,\n        name: room.name,\n        roomType: room.roomType || room.name,\n        floor: floorName,\n        level: floor.level,\n        areaM2,\n        heightM,\n        exposedPerimeterM,\n        surfaces,\n        temperatureC:\n          typeof temperature === \"number\" && Number.isFinite(temperature)\n            ? temperature\n            : null,\n        ventilation: {\n          ...NO_VENTILATION,\n          backgroundVents: count(vented.vents),\n          extractFans: count(vented.fans),\n          openFlues: count(drawn.flues),\n        },\n        continuousM3h: count(drawn.extract),\n      });\n    }\n  });\n\n  return model;\n}\n", "// The design's room-by-room heat load: its floors as a model, its fabric as\n// DHDG U-values, and its saved design conditions filled in from the property\n// wherever the designer hasn't said.\n\nimport { type Conditions, type HeatLoad, heatLoad } from \"../heatload/engine\";\nimport { outdoor } from \"../heatload/temperatures\";\nimport {\n  AIR_CAPACITY,\n  type AgeBand,\n  type BuiltForm,\n  defaultAirPermeability,\n  type Heating,\n  type System,\n  type WallType,\n} from \"../heatload/ventilation\";\nimport { resolve as resolveFabric } from \"./bridge\";\nimport {\n  addedResistance,\n  elementOf,\n  designUValues,\n  rdsapKey,\n  rdsapU,\n  withResistance,\n} from \"./heatfabric\";\nimport { buildModel, type FloorInput } from \"./heatmodel\";\nimport type { FabricType, HeatLoadContext } from \"./scene\";\n\nexport type { HeatLoadContext, HeatLoadSettings } from \"./scene\";\n\n/** Where the postcode can't be placed: the middle of England. */\nexport const FALLBACK_ZONE = 13;\n\nconst BUILT_FORMS: Record<string, BuiltForm> = {\n  FLAT: \"Flat\",\n  MAISONETTE: \"Flat\",\n  MID_TERRACE: \"Terrace\",\n  END_TERRACE: \"Terrace\",\n  SEMI_DETACHED: \"Semi-detached\",\n  DETACHED: \"Detached\",\n  BUNGALOW: \"Bungalow\",\n};\n\n/** RdSAP age bands onto Table 2-11's. */\nconst AGE_BANDS: Record<string, AgeBand> = {\n  A: \"Pre 1919\",\n  B: \"Pre 1919\",\n  C: \"1919-1944\",\n  D: \"1945-1964\",\n  E: \"1965-1980\",\n  F: \"1965-1980\",\n  G: \"1981-1990\",\n  H: \"Post 1990\",\n  I: \"Post 1990\",\n  J: \"Post 1990\",\n  K: \"Post 1990\",\n  L: \"Post 1990\",\n  M: \"Post 1990\",\n};\n\nconst ERA_BANDS: Record<string, AgeBand> = {\n  PRE_1900: \"Pre 1919\",\n  \"1900_1929\": \"Pre 1919\",\n  \"1983_2011\": \"Post 1990\",\n  \"2012_2021\": \"Post 1990\",\n};\n\nconst POST_2006_AGES = new Set([\"K\", \"L\", \"M\"]);\n\nfunction wallSpec(types: readonly FabricType[]): Record<string, unknown> {\n  return resolveFabric(types, \"WALL\", null)?.spec ?? {};\n}\n\nexport function wallType(spec: Record<string, unknown>): WallType {\n  const construction = String(spec[\"construction\"] ?? \"\");\n  const insulation = String(\n    (spec[\"insulation\"] as Record<string, unknown> | undefined)?.[\"kind\"] ??\n      \"AS_BUILT\",\n  );\n  const insulated = ![\"AS_BUILT\", \"UNKNOWN\", \"NONE\"].includes(insulation);\n  if (construction === \"FILLED_CAVITY\") {\n    return \"Cavity with insulation\";\n  }\n  if (construction === \"UNFILLED_CAVITY\") {\n    return insulated ? \"Cavity with insulation\" : \"Cavity uninsulated\";\n  }\n  if (\n    [\"BRICK\", \"GRANITE\", \"WHINSTONE\", \"SANDSTONE\", \"LIMESTONE\"].includes(\n      construction,\n    )\n  ) {\n    return insulated ? \"Solid with insulation\" : \"Solid uninsulated\";\n  }\n  return \"Other\";\n}\n\nexport interface Resolution {\n  conditions: Conditions;\n  /** The zone's source, and how the air permeability was chosen. */\n  zoneFrom: \"design\" | \"postcode\" | \"fallback\";\n  q50From: string;\n}\n\nexport function resolveConditions(\n  context: HeatLoadContext,\n  floors: readonly FloorInput[],\n  types: readonly FabricType[],\n): Resolution {\n  const { settings } = context;\n  const spec = wallSpec(types);\n  const age = String(spec[\"age\"] ?? \"\");\n\n  let zone = settings.zone;\n  let zoneFrom: Resolution[\"zoneFrom\"] = \"design\";\n  if (zone === null) {\n    zone = context.location.zone;\n    zoneFrom = \"postcode\";\n  }\n  if (zone === null) {\n    zone = FALLBACK_ZONE;\n    zoneFrom = \"fallback\";\n  }\n\n  let q50: number;\n  let q50From: string;\n  if (settings.air_permeability !== null) {\n    q50 = settings.air_permeability;\n    q50From = \"air test\";\n  } else {\n    const chosen = defaultAirPermeability({\n      builtForm:\n        settings.built_form ?? BUILT_FORMS[context.property_type] ?? null,\n      ageBand:\n        settings.age_band ??\n        AGE_BANDS[age] ??\n        ERA_BANDS[context.property_age] ??\n        null,\n      wallType: wallType(spec),\n    });\n    q50 = chosen.q50;\n    q50From = `DHDG Table 2-11: ${chosen.from}`;\n  }\n\n  const indoor =\n    settings.indoor === \"auto\"\n      ? POST_2006_AGES.has(age) || context.property_age === \"2012_2021\"\n        ? \"post-2006\"\n        : \"pre-2006\"\n      : settings.indoor;\n\n  // Table 2-13's bands go by storeys: two of them is \"5 m or less\".\n  const heightM = floors.reduce(\n    (total, floor) => total + floor.ceiling_height_mm / 1000,\n    0,\n  );\n\n  let system: System = { kind: \"natural\" };\n  if (settings.ventilation === \"extract\") {\n    system = { kind: \"extract\" };\n  } else if (settings.ventilation === \"mvhr\") {\n    system = { kind: \"mvhr\", efficiency: settings.mvhr_efficiency };\n  }\n\n  let heating: Heating = { kind: \"constant\" };\n  if (settings.heating === \"setback\") {\n    heating = {\n      kind: \"setback\",\n      dropC: settings.setback_c,\n      reheatH: settings.reheat_h,\n      mass: settings.thermal_mass,\n    };\n  } else if (settings.heating === \"intermittent\") {\n    heating = {\n      kind: \"intermittent\",\n      disuseH: settings.disuse_h,\n      reheatH: settings.reheat_h,\n      mass: settings.thermal_mass,\n      dropC: null,\n    };\n  }\n\n  return {\n    conditions: {\n      outdoor: outdoor(zone, settings.percentile, settings.elevation_m),\n      indoor,\n      q50,\n      exposure: settings.exposure,\n      buildingHeightM: heightM,\n      system,\n      heating,\n      thermalBridging: settings.thermal_bridging,\n      highCeilings: settings.emitters === \"radiators\",\n      reheatAtGenerator: settings.reheat_at_generator,\n    },\n    zoneFrom,\n    q50From,\n  };\n}\n\nexport interface DesignHeatLoad extends HeatLoad {\n  zoneFrom: Resolution[\"zoneFrom\"];\n  q50From: string;\n}\n\n/** `baseline` is the unpatched calc context where `derived` carries a package. */\nexport function designHeatLoad(\n  floors: readonly FloorInput[],\n  types: readonly FabricType[],\n  derived: Record<string, Record<string, unknown>>,\n  context: HeatLoadContext,\n  baseline: Record<string, Record<string, unknown>> = derived,\n): DesignHeatLoad {\n  const resolution = resolveConditions(context, floors, types);\n  const model = buildModel(floors, types);\n  const uvalues = designUValues(\n    types,\n    derived,\n    { soil: context.settings.soil, shielding: context.settings.exposure },\n    baseline,\n  );\n  return {\n    ...heatLoad(model, resolution.conditions, uvalues),\n    zoneFrom: resolution.zoneFrom,\n    q50From: resolution.q50From,\n  };\n}\n\n/** SAP's living room temperature, for putting its W/K on the design day. */\nconst SAP_INDOOR_C = 21;\n\nexport interface Reconciliation {\n  /** K: SAP's W/K are multiplied by this to compare. */\n  deltaK: number;\n  sap: { fabricW: number; ventilationW: number; totalW: number };\n  dhdg: { fabricW: number; ventilationW: number; totalW: number };\n  /** The DHDG fabric loss by what it faces, and the bridging within it. */\n  fabric: { facing: string; watts: number }[];\n  bridgingW: number;\n}\n\n/**\n * Why the room-by-room figure isn't SAP's heat transfer coefficient on the\n * design day: fabric and ventilation side by side, and where the DHDG's\n * fabric loss goes. Heat between rooms cancels out at the generator.\n */\nexport function reconcile(\n  result: HeatLoad,\n  sapCoefficientWK: number,\n  sapFabricWK: number,\n): Reconciliation {\n  const deltaK = SAP_INDOOR_C - result.conditions.outdoor.designC;\n  const buckets = new Map<string, number>([\n    [\"outside\", 0],\n    [\"the ground\", 0],\n    [\"next door\", 0],\n    [\"unheated space\", 0],\n  ]);\n  let bridgingW = 0;\n  for (const room of result.rooms) {\n    for (const element of room.elements) {\n      const kind = element.boundary.kind;\n      bridgingW +=\n        element.areaM2 *\n        result.conditions.thermalBridging *\n        element.deltaDesign;\n      const facing =\n        kind === \"outside\"\n          ? \"outside\"\n          : kind === \"ground\"\n            ? \"the ground\"\n            : kind === \"adjoining\"\n              ? \"next door\"\n              : kind === \"unheated\"\n                ? \"unheated space\"\n                : null;\n      if (facing) {\n        buckets.set(facing, (buckets.get(facing) ?? 0) + element.designW);\n      }\n    }\n  }\n  const ventilationW = result.rooms.reduce(\n    (total, room) => total + room.ventilation.generatorW,\n    0,\n  );\n  return {\n    deltaK,\n    sap: {\n      fabricW: sapFabricWK * deltaK,\n      ventilationW: (sapCoefficientWK - sapFabricWK) * deltaK,\n      totalW: sapCoefficientWK * deltaK,\n    },\n    dhdg: {\n      fabricW: result.totals.fabricW,\n      ventilationW,\n      totalW: result.totals.fabricW + ventilationW,\n    },\n    fabric: [...buckets]\n      .filter(([, watts]) => Math.abs(watts) >= 1)\n      .map(([facing, watts]) => ({ facing, watts })),\n    bridgingW,\n  };\n}\n\ntype Elements = Record<string, Record<string, unknown>>;\n\ninterface PeakPatch {\n  elements: Elements;\n  fields?: Record<string, unknown>;\n  /** The share of each key's surfaces the patch covers; absent is all. */\n  shares?: Readonly<Record<string, number>>;\n  /** Each key's net area, to weigh its share by; absent weighs them alike. */\n  areas?: Readonly<Record<string, number>>;\n}\n\n/** What sizes the heat pump once a package's measures are in. */\nexport interface PeakModel {\n  /** W, the generator sizing component with the patches applied. */\n  watts(patches: readonly PeakPatch[]): number;\n}\n\n/** The RdSAP systems that extract continuously, as the worksheet has them. */\nconst EXTRACT_SYSTEMS = new Set([\"DMEV\", \"MECHANICAL_EXTRACT_VENTILATION\"]);\n\n/** SAP 10.2 section 2.6.4: an extract fan's flow, 13 l/s in a kitchen, 8 elsewhere. */\nconst EXTRACT_M3H: Record<string, number> = {\n  kitchen: 13 * 3.6,\n  bathroom: 8 * 3.6,\n  shower: 8 * 3.6,\n};\n\n/**\n * W a package's extract fans add at the generator, where the design has none:\n * each kitchen and bathroom's flow at the design \u0394T, as the engine counts a\n * continuous extract (heatload/ventilation.ts). SAP's (24c) sees the same fans.\n */\nexport function extractWatts(\n  result: HeatLoad,\n  patches: readonly PeakPatch[],\n): number {\n  const fitted = patches.some((patch) =>\n    EXTRACT_SYSTEMS.has(String(patch.fields?.[\"ventilation_system\"] ?? \"\")),\n  );\n  if (!fitted || result.conditions.system.kind !== \"natural\") {\n    return 0;\n  }\n  const designC = result.conditions.outdoor.designC;\n  return result.rooms.reduce((total, room) => {\n    const flow = EXTRACT_M3H[room.type] ?? 0;\n    if (flow === 0 || room.ventilation.continuousM3h > 0) {\n      return total;\n    }\n    return total + flow * (room.internalC - designC) * AIR_CAPACITY;\n  }, 0);\n}\n\n/**\n * How much of a fabric key's surfaces a package's measure covers: all of them,\n * or its targets' share by net area (the bridge's keys for it, such as one per\n * window orientation, weighed by theirs), spread evenly over the rooms.\n */\nfunction shareOf(patches: readonly PeakPatch[], key: string): number {\n  const patch = patches.find(\n    (candidate) => elementOf(candidate.elements, key) !== undefined,\n  );\n  if (!patch?.shares) {\n    return 1;\n  }\n  let covered = 0;\n  let total = 0;\n  for (const [candidate, share] of Object.entries(patch.shares)) {\n    if (candidate === key || candidate.startsWith(`${key}:`)) {\n      const area = patch.areas?.[candidate] ?? 1;\n      covered += share * area;\n      total += area;\n    }\n  }\n  return total > 0 ? covered / total : 1;\n}\n\n/**\n * Fabric loss is linear in U, so a package's peak is the design's plus each\n * patched surface's \u0394U \u00D7 A \u00D7 \u0394T: exact, and cheap enough for every package.\n */\nexport function peakModel(\n  result: HeatLoad,\n  types: readonly FabricType[],\n  derived: Elements,\n): PeakModel {\n  const bridging = result.conditions.thermalBridging;\n  const surfaces = new Map<\n    string,\n    { uaDelta: number; u: number; rdsap: boolean }[]\n  >();\n  for (const room of result.rooms) {\n    for (const element of room.elements) {\n      const key = rdsapKey(element.fabric, types);\n      if (key === null) {\n        continue;\n      }\n      const list = surfaces.get(key) ?? [];\n      list.push({\n        uaDelta: element.areaM2 * element.deltaDesign,\n        u: element.u - bridging,\n        rdsap: element.source.startsWith(\"RdSAP\"),\n      });\n      surfaces.set(key, list);\n    }\n  }\n  return {\n    watts(patches) {\n      let watts = result.totals.generatorW;\n      if (patches.length === 0) {\n        return watts;\n      }\n      watts += extractWatts(result, patches);\n      const patched: Elements = Object.assign(\n        {},\n        derived,\n        ...patches.map((patch) => patch.elements),\n      );\n      for (const [key, list] of surfaces) {\n        if (elementOf(patched, key) === elementOf(derived, key)) {\n          continue;\n        }\n        const resistance = addedResistance(key, patched, derived);\n        const replaced = rdsapU(elementOf(patched, key));\n        const share = shareOf(patches, key);\n        for (const surface of list) {\n          const after = surface.rdsap\n            ? (replaced ?? surface.u)\n            : withResistance(surface.u, resistance);\n          watts += share * surface.uaDelta * (after - surface.u);\n        }\n      }\n      return watts;\n    },\n  };\n}\n", "// Chimney breasts in crinkly party and outside walls. A survey draws a breast\n// as a rectangular notch in the room, so the envelope zig-zags and gains the\n// notch's returns as wall. Finding them is pure; straightening one takes the\n// notch out of the walls and keeps the breast as a feature of the room.\n\nimport { overlap } from \"../heatload/geometry\";\nimport { breastOutline, breasts } from \"./features\";\nimport { pointInPolygon } from \"./faces\";\nimport { projectOnSegment } from \"./geometry\";\nimport { newId } from \"./ids\";\nimport type { ChimneyBreast, Point, Scene } from \"./scene\";\nimport {\n  findWall,\n  polygonOf,\n  roomsOn,\n  straightenPath,\n  wallKinds,\n} from \"./topology\";\n\n/** A breast stands about this far into the room, mm, to centrelines. */\nexport const BREAST_DEPTH_MM: readonly [number, number] = [250, 600];\n\n/** And is about this wide. */\nexport const BREAST_WIDTH_MM: readonly [number, number] = [800, 2000];\n\n/** Surveys measure loosely: this much either side of the ranges still counts. */\nconst SLACK_MM = 50;\n\n/** A jog deeper than this is a recess or a wing, not a crinkle. */\nconst JOG_DEPTH_MM = 1000;\n\n/** A step out of line shallower than this is drawing noise. */\nconst NOISE_MM = 30;\n\n/** The wall's line either side may wander this far and still be one line. */\nconst IN_LINE_MM = 60;\n\n/** Square enough, as a sine. */\nconst SQUARE = Math.sin((12 * Math.PI) / 180);\n\n/** Straight on, as a sine. */\nconst STRAIGHT = Math.sin((3 * Math.PI) / 180);\n\n/** An alcove beside a breast is about this long, mm. */\nconst ALCOVE_MM: readonly [number, number] = [250, 2100];\n\nexport interface FloorScene {\n  id: number;\n  level: number;\n  scene: Scene;\n}\n\nexport interface Jog {\n  /** The room and the corner where it leaves the line: stable while the plan\n   * stands, so a check keeps its place. */\n  id: string;\n  /** A breast's shape, or any other short jog off the wall's line. */\n  kind: \"breast\" | \"jog\";\n  floor: number;\n  room: string;\n  /** Corner ids from where it leaves the line to where it rejoins. */\n  path: string[];\n  /** The wall the line runs on before it: the straightened wall is built so. */\n  like: string;\n  /** mm to centrelines: into the room, and along the line. */\n  depth: number;\n  width: number;\n  party: boolean;\n  /** Its footprint, between the line and the notch. */\n  outline: Point[];\n  /** What else says it's a breast, strongest first. */\n  signs: string[];\n  /** One click can straighten it: a notch with nothing in its walls. */\n  fixable: boolean;\n  /** What hangs on its walls and would go with them, if anything. */\n  held?: string;\n}\n\ninterface Corner {\n  /** Index into the room's ring. */\n  at: number;\n  /** +1 turns into the room, -1 away from it. */\n  turn: 1 | -1;\n}\n\nfunction sub(a: Point, b: Point): Point {\n  return [a[0] - b[0], a[1] - b[1]];\n}\n\nfunction cross(a: Point, b: Point): number {\n  return a[0] * b[1] - a[1] * b[0];\n}\n\nfunction dot(a: Point, b: Point): number {\n  return a[0] * b[0] + a[1] * b[1];\n}\n\nfunction unit(a: Point): Point {\n  const length = Math.hypot(a[0], a[1]) || 1;\n  return [a[0] / length, a[1] / length];\n}\n\nfunction signedArea(polygon: readonly Point[]): number {\n  let doubled = 0;\n  polygon.forEach((a, index) => {\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  });\n  return doubled / 2;\n}\n\nfunction within(value: number, [low, high]: readonly [number, number]) {\n  return value >= low - SLACK_MM && value <= high + SLACK_MM;\n}\n\n/** The ring's corners, straight-through vertices left out. */\nfunction corners(points: readonly Point[]): Corner[] {\n  const n = points.length;\n  const inside = Math.sign(signedArea(points));\n  const found: Corner[] = [];\n  for (let at = 0; at < n; at++) {\n    const here = points[at] as Point;\n    const into = unit(sub(here, points[(at + n - 1) % n] as Point));\n    const out = unit(sub(points[(at + 1) % n] as Point, here));\n    const turn = cross(into, out);\n    if (Math.abs(turn) < STRAIGHT && dot(into, out) > 0) {\n      continue;\n    }\n    found.push({ at, turn: Math.sign(turn) === inside ? 1 : -1 });\n  }\n  return found;\n}\n\n/** The ring's vertex ids from one index to another, going round. */\nfunction slice(ring: readonly string[], from: number, to: number): string[] {\n  const out: string[] = [];\n  for (let at = from; ; at = (at + 1) % ring.length) {\n    out.push(ring[at] as string);\n    if (at === to) {\n      return out;\n    }\n  }\n}\n\n/** The walls with outside or next door behind them: one room's, or party. A\n * wall between a heated room and an unheated one counts as exposed, but a\n * store or porch filling a notch makes it no breast. */\nexport function outsideWalls(scene: Scene): Set<string> {\n  const kinds = wallKinds(scene);\n  const held = new Map<string, number>();\n  for (const room of scene.rooms) {\n    room.boundary.forEach((vertex, index) => {\n      const next = room.boundary[(index + 1) % room.boundary.length] ?? \"\";\n      const wall = findWall(scene, vertex, next);\n      if (wall) {\n        held.set(wall.id, (held.get(wall.id) ?? 0) + 1);\n      }\n    });\n  }\n  return new Set(\n    scene.walls\n      .filter(\n        (wall) =>\n          kinds.get(wall.id) !== \"INTERNAL\" &&\n          (wall.party === true || held.get(wall.id) === 1),\n      )\n      .map((wall) => wall.id),\n  );\n}\n\n/** Jogs in one room's walls where they run on the outside or a party wall. */\nfunction roomJogs(\n  scene: Scene,\n  floor: number,\n  roomId: string,\n  outside: ReadonlySet<string>,\n): Jog[] {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  if (!room) {\n    return [];\n  }\n  const ring = room.boundary;\n  const points = polygonOf(scene, room);\n  if (points.length !== ring.length || ring.length < 6) {\n    return [];\n  }\n  const turns = corners(points);\n  const count = turns.length;\n  if (count < 6) {\n    return [];\n  }\n  const wallOf = (from: string, to: string) => findWall(scene, from, to);\n  const envelope = (id: string | undefined) =>\n    id !== undefined && outside.has(id);\n\n  const jogs: Jog[] = [];\n  const used = new Set<number>();\n  for (let k = 0; k < count; k++) {\n    const c = (offset: number) => turns[(k + offset) % count] as Corner;\n    const pattern = [c(0), c(1), c(2), c(3)].map((corner) => corner.turn);\n    // Into the room, round the breast's two outer corners, and back out.\n    if (pattern.join() === \"-1,1,1,-1\") {\n      // Out and back again: a bay or a wing, built so, not a step.\n      for (const offset of [0, 1, 2, 3]) {\n        used.add(c(offset).at);\n      }\n      continue;\n    }\n    if (pattern.join() !== \"1,-1,-1,1\") {\n      continue;\n    }\n    const prior = turns[(k + count - 1) % count] as Corner;\n    const p = (corner: Corner) => points[corner.at] as Point;\n    const v1 = p(c(0));\n    const v2 = p(c(1));\n    const v3 = p(c(2));\n    const v4 = p(c(3));\n    const along = unit(sub(v1, p(prior)));\n    const after = unit(sub(p(c(4)), v4));\n    if (\n      Math.abs(cross(along, after)) > STRAIGHT ||\n      dot(along, after) <= 0 ||\n      Math.abs(dot(along, unit(sub(v2, v1)))) > SQUARE ||\n      Math.abs(cross(along, unit(sub(v3, v2)))) > SQUARE ||\n      Math.abs(dot(along, unit(sub(v4, v3)))) > SQUARE ||\n      Math.abs(cross(along, sub(v4, v1))) > IN_LINE_MM\n    ) {\n      continue;\n    }\n    // As wide as the wall that will close it, and as deep as keeps the\n    // room's floor what it was.\n    const width = Math.round(Math.hypot(...sub(v4, v1)));\n    const depth = Math.round(Math.abs(signedArea([v1, v2, v3, v4])) / width);\n    if (depth < NOISE_MM || depth > JOG_DEPTH_MM || width <= 0) {\n      continue;\n    }\n\n    const path = slice(ring, c(0).at, c(3).at);\n    const before = ring[(c(0).at + ring.length - 1) % ring.length] as string;\n    const beyond = ring[(c(3).at + 1) % ring.length] as string;\n    const lineWalls = [\n      wallOf(before, path[0] as string),\n      wallOf(path[path.length - 1] as string, beyond),\n    ];\n    const notchWalls = path\n      .slice(1)\n      .map((vertex, index) => wallOf(path[index] as string, vertex));\n    if (![...lineWalls, ...notchWalls].every((wall) => envelope(wall?.id))) {\n      continue;\n    }\n    const like = lineWalls[0]?.id;\n    if (!like) {\n      continue;\n    }\n    const opened = notchWalls.some((wall) =>\n      scene.openings.some((opening) => opening.wall === wall?.id),\n    );\n    // Straightening takes the notch's walls down, and what hangs on them.\n    const hung = notchWalls.some((wall) =>\n      scene.emitters.some(\n        (emitter) => emitter.kind === \"radiator\" && emitter.wall === wall?.id,\n      ),\n    );\n    const breast =\n      !opened &&\n      within(depth, BREAST_DEPTH_MM) &&\n      within(width, BREAST_WIDTH_MM);\n    const signs: string[] = [];\n    if (breast) {\n      const alcoves = [\n        dot(along, sub(v1, p(prior))),\n        dot(along, sub(p(c(4)), v4)),\n      ];\n      if (alcoves.every((length) => within(length, ALCOVE_MM))) {\n        signs.push(\"alcoves either side\");\n      }\n      if ((room.flues ?? 0) > 0) {\n        signs.push(`a fireplace or flue in ${room.name || \"the room\"}`);\n      }\n    }\n    for (const offset of [0, 1, 2, 3]) {\n      used.add(c(offset).at);\n    }\n    jogs.push({\n      id: `${roomId}:${path[0]}`,\n      kind: breast ? \"breast\" : \"jog\",\n      floor,\n      room: roomId,\n      path,\n      like,\n      depth,\n      width,\n      party: lineWalls.some((wall) => wall?.party === true),\n      outline: [v1, v2, v3, v4],\n      signs,\n      fixable: !opened && !hung,\n      ...(hung ? { held: \"a radiator\" } : {}),\n    });\n  }\n\n  // A step out of line that doesn't come back: flagged for a person to\n  // look at, since which side is right isn't the plan's to say.\n  for (let k = 0; k < count; k++) {\n    const one = turns[k] as Corner;\n    const two = turns[(k + 1) % count] as Corner;\n    if (one.turn === two.turn || used.has(one.at) || used.has(two.at)) {\n      continue;\n    }\n    const prior = turns[(k + count - 1) % count] as Corner;\n    const next = turns[(k + 2) % count] as Corner;\n    const v1 = points[one.at] as Point;\n    const v2 = points[two.at] as Point;\n    const along = unit(sub(v1, points[prior.at] as Point));\n    const after = unit(sub(points[next.at] as Point, v2));\n    const step = Math.abs(cross(along, sub(v2, v1)));\n    if (\n      Math.abs(cross(along, after)) > STRAIGHT ||\n      dot(along, after) <= 0 ||\n      step < NOISE_MM ||\n      step > BREAST_DEPTH_MM[1] + SLACK_MM\n    ) {\n      continue;\n    }\n    const path = slice(ring, one.at, two.at);\n    const walls = [\n      wallOf(\n        ring[(one.at + ring.length - 1) % ring.length] as string,\n        path[0] as string,\n      ),\n      ...path\n        .slice(1)\n        .map((vertex, index) => wallOf(path[index] as string, vertex)),\n      wallOf(\n        path[path.length - 1] as string,\n        ring[(two.at + 1) % ring.length] as string,\n      ),\n    ];\n    if (\n      !walls.every((wall) => envelope(wall?.id)) ||\n      walls.some((wall) =>\n        scene.openings.some((opening) => opening.wall === wall?.id),\n      )\n    ) {\n      continue;\n    }\n    jogs.push({\n      id: `${roomId}:${path[0]}`,\n      kind: \"jog\",\n      floor,\n      room: roomId,\n      path,\n      like: walls[0]?.id ?? \"\",\n      depth: Math.round(step),\n      width: 0,\n      party: walls.some((wall) => wall?.party === true),\n      outline: [v1, v2],\n      signs: [],\n      fixable: false,\n    });\n  }\n  return jogs;\n}\n\nfunction centre(points: readonly Point[]): Point {\n  const sum = points.reduce<Point>(\n    (total, point) => [total[0] + point[0], total[1] + point[1]],\n    [0, 0],\n  );\n  return [sum[0] / points.length, sum[1] / points.length];\n}\n\n/** A breast already straightened on a floor, as a footprint. */\nfunction keptOutlines(scene: Scene): Point[][] {\n  return breasts(scene)\n    .map((breast) => breastOutline(scene, breast))\n    .filter((outline): outline is Point[] => outline !== null);\n}\n\n/** Every jog off an outside or party wall's line, breasts first and the\n * likeliest of those first. Floors share one frame, as they're stacked. */\nexport function findJogs(floors: readonly FloorScene[]): Jog[] {\n  const ordered = [...floors].sort((one, two) => one.level - two.level);\n  const found = ordered.map((floor) => {\n    const outside = outsideWalls(floor.scene);\n    return floor.scene.rooms.flatMap((room) =>\n      roomJogs(floor.scene, floor.id, room.id, outside),\n    );\n  });\n  const footprints = ordered.map((floor, index) => [\n    ...keptOutlines(floor.scene),\n    ...(found[index] ?? [])\n      .filter((jog) => jog.kind === \"breast\")\n      .map((jog) => jog.outline),\n  ]);\n\n  found.forEach((jogs, index) => {\n    for (const jog of jogs) {\n      if (jog.kind !== \"breast\") {\n        continue;\n      }\n      const stacked = [index - 1, index + 1].some((other) =>\n        (footprints[other] ?? []).some(\n          (outline) => overlap(jog.outline, outline) > 0,\n        ),\n      );\n      if (stacked) {\n        jog.signs.unshift(\"the same jog on the floor above or below\");\n      }\n      const middle = centre(jog.outline);\n      const reach = jog.depth + 400;\n      const across = (footprints[index] ?? []).some(\n        (outline) =>\n          outline !== jog.outline &&\n          overlap(jog.outline, outline) === 0 &&\n          Math.hypot(...sub(centre(outline), middle)) < reach,\n      );\n      if (across) {\n        jog.signs.splice(stacked ? 1 : 0, 0, \"back to back with another\");\n      }\n    }\n  });\n\n  const rank = (jog: Jog) =>\n    jog.kind === \"breast\" ? 10 + jog.signs.length : jog.fixable ? 1 : 0;\n  return found.flat().sort((one, two) => rank(two) - rank(one));\n}\n\nexport interface Straightened {\n  /** The breast kept, or null for a jog that was only a wobble. */\n  breast: string | null;\n}\n\n/** Straighten the wall's line through the jog. A breast is kept as a feature\n * of the room: it takes the floor it stood on, and no wall. Null when the plan\n * has moved on. */\nexport function straighten(scene: Scene, jog: Jog): Straightened | null {\n  if (!jog.fixable || jog.outline.length !== 4) {\n    return null;\n  }\n  const [v1, , , v4] = jog.outline as [Point, Point, Point, Point];\n  const depth = jog.depth;\n  const width = jog.width;\n  if (!straightenPath(scene, jog.path, jog.like)) {\n    return null;\n  }\n  if (jog.kind !== \"breast\") {\n    return { breast: null };\n  }\n\n  // The line's walls may since have joined up: find the one under the breast.\n  const middle: Point = [(v1[0] + v4[0]) / 2, (v1[1] + v4[1]) / 2];\n  for (const wall of scene.walls) {\n    const a = scene.vertices.find((vertex) => vertex.id === wall.a)?.at;\n    const b = scene.vertices.find((vertex) => vertex.id === wall.b)?.at;\n    if (!a || !b || projectOnSegment(middle, a, b).distance > IN_LINE_MM) {\n      continue;\n    }\n    const length = Math.hypot(b[0] - a[0], b[1] - a[1]);\n    const start = Math.min(\n      projectOnSegment(v1, a, b).t,\n      projectOnSegment(v4, a, b).t,\n    );\n    const inward: Point = unit([-(v4[1] - v1[1]), v4[0] - v1[0]]);\n    const probe = (sign: number): Point => [\n      middle[0] + inward[0] * sign * (depth / 2),\n      middle[1] + inward[1] * sign * (depth / 2),\n    ];\n    const room = roomsOn(scene, wall.id).find((candidate) => {\n      const polygon = polygonOf(scene, candidate);\n      return [1, -1].some((sign) => pointInPolygon(probe(sign), polygon));\n    });\n    if (!room) {\n      continue;\n    }\n    const breast: ChimneyBreast = {\n      id: newId(\"f\"),\n      kind: \"chimney_breast\",\n      room: room.id,\n      wall: wall.id,\n      offset: Math.max(0, Math.round(start * length)),\n      length: Math.min(width, Math.floor(length)),\n      depth,\n    };\n    scene.features = [...(scene.features ?? []), breast];\n    return { breast: breast.id };\n  }\n  return { breast: null };\n}\n", "// Which outside walls are shared with next door, for a semi or a terrace: the\n// longest straight run with no window or door in it, with the jogs a chimney\n// breast puts in it. A proposal for a person to look at, never applied unasked.\n\nimport type { Point, Scene } from \"./scene\";\nimport { outsideWalls } from \"./chimney\";\nimport { wallEnds } from \"./topology\";\n\n/** A breast's face stands this far off the party wall's line, at most, mm. */\nconst BAND_MM = 650;\n\n/** Walls this close to the line are on it, mm. */\nconst ON_LINE_MM = 60;\n\n/** A run shorter than this is no party wall, mm. */\nconst SHORTEST_MM = 2500;\n\n/** Runs within this of each other's span are as long, mm. */\nconst TIE_MM = 200;\n\n/** Two party walls of a terrace are at least this far apart, mm. */\nconst APART_MM = 2000;\n\nconst PARALLEL = Math.sin((3 * Math.PI) / 180);\n\nexport interface PartyRun {\n  /** The walls to mark party: the run, and its breasts' returns and faces. */\n  walls: string[];\n  /** mm the run spans along its line. */\n  length: number;\n  /** Another run looks just as likely, so a person should pick. */\n  tied: boolean;\n}\n\ninterface Line {\n  at: Point;\n  along: Point;\n}\n\nfunction offset(line: Line, point: Point): number {\n  return (\n    (point[0] - line.at[0]) * line.along[1] -\n    (point[1] - line.at[1]) * line.along[0]\n  );\n}\n\n/** The run of outside wall most likely to be shared, and for a terrace the\n * one opposite it too; none where nothing long and blank enough stands. */\nexport function proposeParty(scene: Scene, sides: 1 | 2 = 1): PartyRun[] {\n  // Outside walls with one room behind them: not a garage's wall to the house.\n  const exposed = outsideWalls(scene);\n  const opened = new Set(scene.openings.map((opening) => opening.wall));\n  const outside = scene.walls.flatMap((wall) => {\n    const ends = wallEnds(scene, wall);\n    if (!ends || !exposed.has(wall.id) || wall.party) {\n      return [];\n    }\n    const length = Math.hypot(ends[1][0] - ends[0][0], ends[1][1] - ends[0][1]);\n    return length > 0 ? [{ wall, ends, length }] : [];\n  });\n\n  const runs: (PartyRun & { line: Line; jogs: number })[] = [];\n  const seen = new Set<string>();\n  for (const seed of outside) {\n    if (opened.has(seed.wall.id) || seed.length < 1000) {\n      continue;\n    }\n    const [a, b] = seed.ends;\n    const line: Line = {\n      at: a,\n      along: [(b[0] - a[0]) / seed.length, (b[1] - a[1]) / seed.length],\n    };\n    const members = outside.filter(({ ends }) =>\n      ends.every((end) => Math.abs(offset(line, end)) <= BAND_MM),\n    );\n    const key = members\n      .map(({ wall }) => wall.id)\n      .sort()\n      .join();\n    if (seen.has(key)) {\n      continue;\n    }\n    seen.add(key);\n    if (members.some(({ wall }) => opened.has(wall.id))) {\n      continue;\n    }\n    const length = members\n      .filter(({ ends }) =>\n        ends.every((end) => Math.abs(offset(line, end)) <= ON_LINE_MM),\n      )\n      .filter(({ ends: [p, q] }) => {\n        const cross =\n          ((q[0] - p[0]) * line.along[1] - (q[1] - p[1]) * line.along[0]) /\n          (Math.hypot(q[0] - p[0], q[1] - p[1]) || 1);\n        return Math.abs(cross) < PARALLEL;\n      })\n      .reduce((total, member) => total + member.length, 0);\n    if (length < SHORTEST_MM) {\n      continue;\n    }\n    // A breast's faces and returns fill the run in, and say it's shared.\n    const along = members.flatMap(({ ends }) =>\n      ends.map(\n        ([x, y]) =>\n          (x - line.at[0]) * line.along[0] + (y - line.at[1]) * line.along[1],\n      ),\n    );\n    runs.push({\n      walls: members.map(({ wall }) => wall.id),\n      length: Math.max(...along) - Math.min(...along),\n      jogs: members.filter(({ ends }) =>\n        ends.some((end) => Math.abs(offset(line, end)) > ON_LINE_MM),\n      ).length,\n      tied: false,\n      line,\n    });\n  }\n\n  const bucket = (run: (typeof runs)[number]) =>\n    Math.round(run.length / TIE_MM);\n  runs.sort((one, two) => bucket(two) - bucket(one) || two.jogs - one.jogs);\n  const [best, next] = runs;\n  if (!best) {\n    return [];\n  }\n  best.tied =\n    next !== undefined &&\n    sides === 1 &&\n    bucket(next) === bucket(best) &&\n    next.jogs === best.jogs;\n  const picked = [best];\n  if (sides === 2) {\n    const opposite = runs.find(\n      (run) =>\n        Math.abs(\n          run.line.along[0] * best.line.along[1] -\n            run.line.along[1] * best.line.along[0],\n        ) < PARALLEL && Math.abs(offset(best.line, run.line.at)) > APART_MM,\n    );\n    if (opposite) {\n      picked.push(opposite);\n    }\n  }\n  return picked.map(({ walls, length, tied }) => ({ walls, length, tied }));\n}\n", "// Checks on how the plan was drawn that a click can put right: a chimney\n// breast drawn as a jog in the envelope, a room taller than its storey, a\n// sliver a survey left beside a room. Pure; the editor applies the fixes.\n\nimport type { RoomResult } from \"../heatload/engine\";\nimport { findJogs, type Jog } from \"./chimney\";\nimport { proposeParty } from \"./partywalls\";\nimport type { Floor, Room } from \"./scene\";\nimport { findWall, neighbours, wallEnds } from \"./topology\";\n\nexport type CheckFix =\n  | { kind: \"straighten\"; floor: number; jog: Jog }\n  | { kind: \"height\"; floor: number; room: string }\n  | { kind: \"absorb\"; floor: number; room: string; into: string }\n  | { kind: \"party\"; floor: number; walls: string[] };\n\nexport interface PlanCheck {\n  id: string;\n  level: \"warn\" | \"info\";\n  message: string;\n  floor: number;\n  selection?: { type: \"room\" | \"wall\"; id: string };\n  /** One click puts it right: the button's words, and what it does. */\n  fix?: { label: string; action: CheckFix };\n}\n\n/** Taller than its storey by more than this, mm, and it's likely a survey slip:\n * magicplan measured the WC at 3.81 m in a 2.75 m storey. */\nexport const TALLER_MM = 300;\n\n/** Lower by more than this, mm: more than a dropped ceiling or a step down. */\nexport const LOWER_MM = 500;\n\n/** Under this, m\u00B2, a room is a sliver a survey left, not a room. */\nexport const SLIVER_M2 = 0.1;\n\nfunction label(floor: Floor): string {\n  return floor.name || `Level ${floor.level}`;\n}\n\nconst metres = (mm: number) => (mm / 1000).toFixed(2);\n\nfunction jogCheck(floor: Floor, jog: Jog): PlanCheck {\n  const room =\n    floor.scene.rooms.find((each) => each.id === jog.room)?.name || \"a room\";\n  const wall = jog.party ? \"party wall\" : \"outside wall\";\n  const face =\n    findWall(floor.scene, jog.path[1] ?? \"\", jog.path[2] ?? \"\")?.id ??\n    findWall(floor.scene, jog.path[0] ?? \"\", jog.path[1] ?? \"\")?.id ??\n    jog.like;\n  const selection = { type: \"wall\" as const, id: face };\n  if (jog.kind === \"breast\") {\n    const why = jog.signs.length > 0 ? `, with ${jog.signs.join(\" and \")}` : \"\";\n    const then = jog.held\n      ? `Move ${jog.held} off it, then straighten the wall and keep the breast.`\n      : \"Straighten the wall and keep the breast.\";\n    return {\n      id: `jog:${jog.id}`,\n      level: \"warn\",\n      message: `Likely a chimney breast in ${room} on ${label(floor)}: a ${metres(jog.width)} \u00D7 ${metres(jog.depth)} m jog in the ${wall}${why}. Its returns count as ${wall}. ${then}`,\n      floor: floor.id,\n      selection,\n      ...(jog.fixable\n        ? {\n            fix: {\n              label: \"Straighten\",\n              action: { kind: \"straighten\" as const, floor: floor.id, jog },\n            },\n          }\n        : {}),\n    };\n  }\n  return {\n    id: `jog:${jog.id}`,\n    level: \"info\",\n    message: `The ${wall} of ${room} on ${label(floor)} jogs ${jog.depth} mm off its line, which adds ${wall} that may not be there. Check it against the survey.`,\n    floor: floor.id,\n    selection,\n    ...(jog.fixable\n      ? {\n          fix: {\n            label: \"Straighten\",\n            action: { kind: \"straighten\" as const, floor: floor.id, jog },\n          },\n        }\n      : {}),\n  };\n}\n\nfunction heightCheck(floor: Floor, room: Room): PlanCheck | null {\n  const height = room.ceiling_height;\n  if (height === null || room.heated === false) {\n    return null;\n  }\n  const off = height - floor.ceiling_height_mm;\n  if (off <= TALLER_MM && off >= -LOWER_MM) {\n    return null;\n  }\n  const name = room.name || \"A room\";\n  const what =\n    off > 0\n      ? \"taller than its storey, which a survey can get wrong. Check the ceiling height; leave it if the room is double-height or vaulted\"\n      : \"well below its storey. Check the ceiling height\";\n  return {\n    id: `height:${room.id}`,\n    level: off > 0 ? \"warn\" : \"info\",\n    message: `${name} on ${label(floor)} is ${metres(height)} m to its ceiling in a ${metres(floor.ceiling_height_mm)} m storey: ${what}.`,\n    floor: floor.id,\n    selection: { type: \"room\", id: room.id },\n    fix: {\n      label: `Use ${metres(floor.ceiling_height_mm)} m`,\n      action: { kind: \"height\", floor: floor.id, room: room.id },\n    },\n  };\n}\n\n/** Jogs off the envelope's line, breasts first, and rooms far off their\n * storey's height. */\nexport function planChecks(floors: readonly Floor[]): PlanCheck[] {\n  const byId = new Map(floors.map((floor) => [floor.id, floor]));\n  const jogs = findJogs(floors).flatMap((jog) => {\n    const floor = byId.get(jog.floor);\n    return floor ? [jogCheck(floor, jog)] : [];\n  });\n  const heights = floors.flatMap((floor) =>\n    floor.scene.rooms.flatMap((room) => heightCheck(floor, room) ?? []),\n  );\n  return [...jogs, ...heights];\n}\n\n/** A sliver's neighbour to merge it into, when the room is one. */\nexport function absorbFix(\n  floors: readonly Floor[],\n  room: RoomResult,\n): PlanCheck[\"fix\"] | undefined {\n  if (room.areaM2 >= SLIVER_M2) {\n    return undefined;\n  }\n  const floor = floors.find((each) =>\n    each.scene.rooms.some((candidate) => candidate.id === room.id),\n  );\n  const into = floor ? neighbours(floor.scene, room.id)[0]?.room : undefined;\n  if (!floor || !into) {\n    return undefined;\n  }\n  return {\n    label: `Absorb into ${into.name || \"its neighbour\"}`,\n    action: { kind: \"absorb\", floor: floor.id, room: room.id, into: into.id },\n  };\n}\n\n/** What most of a room's loss comes from, in words: its height when that's\n * off its storey's, else the element losing the most. */\nexport function lossCause(floors: readonly Floor[], room: RoomResult): string {\n  const floor = floors.find((each) =>\n    each.scene.rooms.some((candidate) => candidate.id === room.id),\n  );\n  const storeyMm = floor?.ceiling_height_mm ?? null;\n  if (storeyMm !== null && room.heightM * 1000 - storeyMm > TALLER_MM) {\n    return `most of ${room.name}'s is ${room.heightM.toFixed(2)} m of wall height in a ${metres(storeyMm)} m storey`;\n  }\n  const by = new Map<string, { watts: number; area: number }>();\n  for (const element of room.elements) {\n    const key = element.what;\n    const sum = by.get(key) ?? { watts: 0, area: 0 };\n    sum.watts += element.designW;\n    sum.area += element.areaM2;\n    by.set(key, sum);\n  }\n  const [top] = [...by].sort((one, two) => two[1].watts - one[1].watts);\n  if (!top || room.designW <= 0) {\n    return \"\";\n  }\n  const share = Math.round((top[1].watts / room.designW) * 100);\n  return `${share}% of ${room.name}'s is ${top[1].area.toFixed(1)} m\u00B2 of ${top[0]}`;\n}\n\n/** For a semi or terrace with no party walls yet: each floor's likeliest\n * shared wall, to look at in violet and mark with one click. */\nexport function partyChecks(\n  floors: readonly Floor[],\n  propertyType: string,\n): PlanCheck[] {\n  const sides = propertyType === \"MID_TERRACE\" ? 2 : 1;\n  const kind = propertyType.toLowerCase().replaceAll(\"_\", \"-\");\n  return floors.flatMap((floor) => {\n    const runs = proposeParty(floor.scene, sides);\n    const walls = runs.flatMap((run) => run.walls);\n    if (walls.length === 0) {\n      return [];\n    }\n    const length = walls.reduce((total, id) => {\n      const wall = floor.scene.walls.find((each) => each.id === id);\n      const ends = wall ? wallEnds(floor.scene, wall) : null;\n      return (\n        total +\n        (ends\n          ? Math.hypot(ends[1][0] - ends[0][0], ends[1][1] - ends[0][1])\n          : 0)\n      );\n    }, 0);\n    const which = runs.length === 2 ? \"two straight runs\" : \"a straight run\";\n    const tie = runs.some((run) => run.tied)\n      ? \" Another run is as long and as blank, so check it's the right side.\"\n      : \"\";\n    return [\n      {\n        id: `party:${floor.id}`,\n        level: \"warn\" as const,\n        message: `A ${kind} home with no party walls, so every shared wall counts as losing heat outside. On ${label(floor)}, ${which} with no windows or doors, ${metres(length)} m with any breasts' returns, looks like the wall with next door: shown in violet.${tie}`,\n        floor: floor.id,\n        fix: {\n          label: \"Mark as party\",\n          action: { kind: \"party\" as const, floor: floor.id, walls },\n        },\n      },\n    ];\n  });\n}\n", "// Moving a whole floor: a turn and a shift, baked into everything drawn on\n// it. Everything downstream (heat loss, 3D, drawings, the SAP bridge) reads\n// absolute coordinates, so the floor's geometry is rewritten rather than\n// carrying an offset each of them would have to apply.\n\nimport type {\n  Annotation,\n  AnnotationGeometry,\n  Point,\n  Scene,\n  Trace,\n} from \"./scene\";\n\n/** p \u21A6 R(angle)\u00B7p + (dx, dy); angle in degrees, clockwise on the y-down plan. */\nexport interface Rigid {\n  angle: number;\n  dx: number;\n  dy: number;\n}\n\nexport const IDENTITY: Rigid = { angle: 0, dx: 0, dy: 0 };\n\nconst RADIANS = Math.PI / 180;\n\n/** Degrees in (-180, 180]. */\nexport function normalAngle(degrees: number): number {\n  const turned = ((((degrees + 180) % 360) + 360) % 360) - 180;\n  return turned === -180 ? 180 : turned;\n}\n\nfunction turn([x, y]: Point, degrees: number): Point {\n  // Exact on quarter turns, so a 90\u00B0 turn doesn't drift a corner by a mm.\n  const quarter = Math.round(degrees / 90);\n  if (Math.abs(degrees - quarter * 90) < 1e-9) {\n    const q = ((quarter % 4) + 4) % 4;\n    return q === 0 ? [x, y] : q === 1 ? [-y, x] : q === 2 ? [-x, -y] : [y, -x];\n  }\n  const cos = Math.cos(degrees * RADIANS);\n  const sin = Math.sin(degrees * RADIANS);\n  return [x * cos - y * sin, x * sin + y * cos];\n}\n\nexport function apply(m: Rigid, point: Point): Point {\n  const [x, y] = turn(point, m.angle);\n  return [x + m.dx, y + m.dy];\n}\n\nexport function translation(dx: number, dy: number): Rigid {\n  return { angle: 0, dx, dy };\n}\n\n/** A turn of `degrees` about `pivot`. */\nexport function rotationAbout(degrees: number, pivot: Point): Rigid {\n  const [x, y] = turn(pivot, degrees);\n  return { angle: degrees, dx: pivot[0] - x, dy: pivot[1] - y };\n}\n\n/** `second` after `first`. */\nexport function followedBy(first: Rigid, second: Rigid): Rigid {\n  const [dx, dy] = apply(second, [first.dx, first.dy]);\n  return { angle: normalAngle(first.angle + second.angle), dx, dy };\n}\n\nexport function inverse(m: Rigid): Rigid {\n  const [dx, dy] = turn([-m.dx, -m.dy], -m.angle);\n  return { angle: normalAngle(-m.angle), dx, dy };\n}\n\nexport function isIdentity(m: Rigid): boolean {\n  return (\n    Math.abs(normalAngle(m.angle)) < 1e-6 &&\n    Math.abs(m.dx) < 0.5 &&\n    Math.abs(m.dy) < 0.5\n  );\n}\n\n/** Takes `from` onto `to`; with a second pair, also turns about the first so\n * the line between them runs the same way (AutoCAD's ALIGN, without scaling). */\nexport function matching(\n  from: Point,\n  to: Point,\n  fromNext?: Point,\n  toNext?: Point,\n): Rigid {\n  let angle = 0;\n  if (fromNext && toNext) {\n    const before = Math.atan2(fromNext[1] - from[1], fromNext[0] - from[0]);\n    const after = Math.atan2(toNext[1] - to[1], toNext[0] - to[0]);\n    if (\n      Math.hypot(fromNext[0] - from[0], fromNext[1] - from[1]) > 0 &&\n      Math.hypot(toNext[0] - to[0], toNext[1] - to[1]) > 0\n    ) {\n      angle = normalAngle((after - before) / RADIANS);\n    }\n  }\n  const [x, y] = turn(from, angle);\n  return { angle, dx: to[0] - x, dy: to[1] - y };\n}\n\nfunction rounded(m: Rigid, point: Point): Point {\n  const [x, y] = apply(m, point);\n  // `|| 0` turns a rounded -0 into 0.\n  return [Math.round(x) || 0, Math.round(y) || 0];\n}\n\n/** The scene's corners moved; walls, openings, rooms, emitters and breasts\n * hang off them by id and offset, so they come along. New-build areas are\n * drawn in their own right, so they move too. */\nexport function movedScene(scene: Scene, m: Rigid): Scene {\n  return {\n    ...scene,\n    vertices: scene.vertices.map((vertex) => ({\n      ...vertex,\n      at: rounded(m, vertex.at),\n    })),\n    ...(scene.features\n      ? {\n          features: scene.features.map((feature) =>\n            feature.kind === \"new_build\"\n              ? {\n                  ...feature,\n                  polygon: feature.polygon.map((point) => rounded(m, point)),\n                }\n              : feature,\n          ),\n        }\n      : {}),\n  };\n}\n\nexport function movedGeometry(\n  geometry: AnnotationGeometry,\n  m: Rigid,\n): AnnotationGeometry {\n  if (geometry.type === \"point\") {\n    return { type: \"point\", at: rounded(m, geometry.at) };\n  }\n  if (geometry.type === \"line\") {\n    return {\n      type: \"line\",\n      points: geometry.points.map((point) => rounded(m, point)),\n    };\n  }\n  return {\n    type: \"area\",\n    polygon: geometry.polygon.map((point) => rounded(m, point)),\n  };\n}\n\nexport function movedAnnotations(\n  annotations: readonly Annotation[],\n  m: Rigid,\n): Annotation[] {\n  return annotations.map((annotation) => ({\n    ...annotation,\n    geometry: movedGeometry(annotation.geometry, m),\n  }));\n}\n\n/** The trace's calibration with the floor moved under it: world = offset +\n * R(pixel \u00D7 scale), so the offset moves as a point and the turns add. */\nexport function movedTrace(trace: Trace, m: Rigid): Trace {\n  const [x, y] = rounded(m, [trace.offset_x_mm, trace.offset_y_mm]);\n  const rotation = normalAngle(Number(trace.rotation_deg) + m.angle);\n  return {\n    ...trace,\n    offset_x_mm: x,\n    offset_y_mm: y,\n    // DecimalField(6, 2), kept in [0, 360) like the importer writes it.\n    rotation_deg: (((rotation % 360) + 360) % 360).toFixed(2),\n  };\n}\n\n/** \"turned 90\u00B0 clockwise, moved 1.20 m\": how a move reads in the panel; the\n * distance is how far `centre` goes. */\nexport function describe(m: Rigid, centre: Point = [0, 0]): string {\n  const parts: string[] = [];\n  const angle = normalAngle(m.angle);\n  if (Math.abs(angle) >= 0.05) {\n    const shown = Number(Math.abs(angle).toFixed(1));\n    parts.push(\n      shown === 180\n        ? \"turned 180\u00B0\"\n        : `turned ${shown}\u00B0 ${angle > 0 ? \"clockwise\" : \"anticlockwise\"}`,\n    );\n  }\n  const [x, y] = apply(m, centre);\n  const shift = Math.hypot(x - centre[0], y - centre[1]);\n  if (shift >= 0.5) {\n    parts.push(\n      shift >= 1000\n        ? `moved ${(shift / 1000).toFixed(2)} m`\n        : `moved ${Math.round(shift)} mm`,\n    );\n  }\n  return parts.join(\", \") || \"where it is\";\n}\n", "// Fitting a floor over the one below: apps/design/stacking.py, which stacks\n// floors at import, run again on demand. An upper floor's outside corners sit\n// on the walls below it, so try each quarter turn from a grid of starts,\n// slide to the nearest walls (trimmed, so an overhang doesn't drag it), and\n// offer every distinct place that fits, best first, for someone to pick.\n\nimport { findFaces, measure, overlapArea } from \"./faces\";\nimport { projectOnSegment } from \"./geometry\";\nimport {\n  type Rigid,\n  apply,\n  isIdentity,\n  movedScene,\n  normalAngle,\n} from \"./rigid\";\nimport type { Point, Scene } from \"./scene\";\nimport { wallEnds } from \"./topology\";\n\n/** The share of corners that must agree; the rest may overhang. */\nconst KEEP = 0.7;\nconst ITERATIONS = 25;\nconst GRID = 5;\n/** Fits closer than this are the same placement. */\nconst SAME_PLACE_MM = 300;\n/** Worse than this on average isn't a fit worth offering. */\nexport const FIT_MM = 200;\n/** No more places than this are offered. */\nconst MOST = 6;\n\ntype Segment = [Point, Point];\n\nexport interface Fit {\n  move: Rigid;\n  /** Mean distance, mm, of the closest 70% of corners to the walls below. */\n  score: number;\n  /** The same over every corner. */\n  overall: number;\n}\n\n/** The floor's outside corners and walls, along its outline. */\nexport function outside(scene: Scene): { corners: Point[]; walls: Segment[] } {\n  const corners: Point[] = [];\n  const walls: Segment[] = [];\n  const byId = new Map(scene.walls.map((wall) => [wall.id, wall]));\n  for (const outline of findFaces(scene).outlines) {\n    corners.push(...outline.polygon);\n    for (const id of outline.walls) {\n      const wall = byId.get(id);\n      const ends = wall ? wallEnds(scene, wall) : null;\n      if (ends) {\n        walls.push(ends);\n      }\n    }\n  }\n  return { corners, walls };\n}\n\nfunction everyWall(scene: Scene): Segment[] {\n  const walls: Segment[] = [];\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (ends) {\n      walls.push(ends);\n    }\n  }\n  return walls;\n}\n\nfunction nearest(point: Point, walls: readonly Segment[]): [Point, number] {\n  let best: Point = point;\n  let gap = Number.POSITIVE_INFINITY;\n  for (const [a, b] of walls) {\n    const projection = projectOnSegment(point, a, b);\n    if (projection.distance < gap) {\n      gap = projection.distance;\n      best = projection.point;\n    }\n  }\n  return [best, gap];\n}\n\nfunction kept<T>(pairs: T[]): T[] {\n  return pairs.slice(0, Math.max(3, Math.ceil(pairs.length * KEEP)));\n}\n\nfunction slide(\n  corners: readonly Point[],\n  walls: readonly Segment[],\n  start: Point,\n): { score: number; overall: number; offset: Point } {\n  let [dx, dy] = start;\n  let score = Number.POSITIVE_INFINITY;\n  let overall = Number.POSITIVE_INFINITY;\n  for (let iteration = 0; iteration < ITERATIONS; iteration++) {\n    const pairs = corners.map(([x, y]) => {\n      const moved: Point = [x + dx, y + dy];\n      const [foot, gap] = nearest(moved, walls);\n      return { gap, moved, foot };\n    });\n    pairs.sort((left, right) => left.gap - right.gap);\n    const close = kept(pairs);\n    let stepX = 0;\n    let stepY = 0;\n    for (const { moved, foot } of close) {\n      stepX += foot[0] - moved[0];\n      stepY += foot[1] - moved[1];\n    }\n    stepX /= close.length;\n    stepY /= close.length;\n    dx += stepX;\n    dy += stepY;\n    score = close.reduce((sum, pair) => sum + pair.gap, 0) / close.length;\n    overall = pairs.reduce((sum, pair) => sum + pair.gap, 0) / pairs.length;\n    if (Math.hypot(stepX, stepY) < 1) {\n      break;\n    }\n  }\n  return { score, overall, offset: [dx, dy] };\n}\n\nfunction bounds(points: readonly Point[]): [number, number, number, number] {\n  const xs = points.map((point) => point[0]);\n  const ys = points.map((point) => point[1]);\n  return [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)];\n}\n\nfunction quarter(m: Rigid): number {\n  return ((Math.round(m.angle / 90) % 4) + 4) % 4;\n}\n\n/** Every distinct place `upper` fits over `lower`, best first; empty when\n * either has no outline. Moves are from where `upper` is drawn now. */\nexport function fits(lower: Scene, upper: Scene): Fit[] {\n  const { walls } = outside(lower);\n  const { corners } = outside(upper);\n  if (walls.length < 3 || corners.length < 3) {\n    return [];\n  }\n  const below = bounds(walls.flat());\n  const found: Fit[] = [];\n  for (let q = 0; q < 4; q++) {\n    const turn: Rigid = { angle: 90 * q, dx: 0, dy: 0 };\n    const turned = corners.map((point) => apply(turn, point));\n    const above = bounds(turned);\n    const starts: Point[] = [\n      [0, 0],\n      [below[0] - above[0], below[1] - above[1]],\n      [below[2] - above[2], below[1] - above[1]],\n      [below[0] - above[0], below[3] - above[3]],\n      [below[2] - above[2], below[3] - above[3]],\n    ];\n    const middle: Point = [\n      (above[0] + above[2]) / 2,\n      (above[1] + above[3]) / 2,\n    ];\n    for (let i = 0; i < GRID; i++) {\n      for (let j = 0; j < GRID; j++) {\n        const x = below[0] + ((below[2] - below[0]) * i) / (GRID - 1);\n        const y = below[1] + ((below[3] - below[1]) * j) / (GRID - 1);\n        starts.push([x - middle[0], y - middle[1]]);\n      }\n    }\n    for (const start of starts) {\n      const { score, overall, offset } = slide(turned, walls, start);\n      found.push({\n        move: { angle: normalAngle(90 * q), dx: offset[0], dy: offset[1] },\n        score,\n        overall,\n      });\n    }\n  }\n  // Many starts land in the same place: keep each place's tightest fit.\n  found.sort(\n    (left, right) => left.score - right.score || left.overall - right.overall,\n  );\n  const places: Fit[] = [];\n  for (const fit of found) {\n    if (\n      !places.some(\n        (place) =>\n          quarter(place.move) === quarter(fit.move) &&\n          Math.hypot(\n            place.move.dx - fit.move.dx,\n            place.move.dy - fit.move.dy,\n          ) <= SAME_PLACE_MM,\n      )\n    ) {\n      places.push(fit);\n    }\n  }\n  // Nothing fitting well still offers the closest few to start from.\n  const good = places.filter((place) => place.score <= FIT_MM);\n  const offered = good.length > 0 ? good : places.slice(0, 3);\n  // Within a few mm of each other the corners decide, then staying unturned.\n  return offered\n    .slice(0, MOST)\n    .sort(\n      (left, right) =>\n        Math.round(left.score / 25) - Math.round(right.score / 25) ||\n        Math.round(left.overall / 25) - Math.round(right.overall / 25) ||\n        Number(!isIdentity({ ...left.move, dx: 0, dy: 0 })) -\n          Number(!isIdentity({ ...right.move, dx: 0, dy: 0 })),\n    );\n}\n\nexport interface Misfit {\n  /** mm on average `upper`'s outside corners sit off any wall of `lower` (a\n   * storey can stand on a spine wall), the worst 30% left out as overhangs. */\n  corners: number;\n  /** m\u00B2 of `upper`'s footprint over nothing on `lower`: exposed floor. */\n  overhang: number;\n  /** That, as a share of `upper`'s footprint. */\n  share: number;\n}\n\n/** How badly `upper` disagrees with `lower`; null without two outlines. */\nexport function misfit(lower: Scene, upper: Scene): Misfit | null {\n  const walls = everyWall(lower);\n  const { corners } = outside(upper);\n  if (walls.length < 3 || corners.length < 3) {\n    return null;\n  }\n  const gaps = kept(\n    corners\n      .map((corner) => nearest(corner, walls)[1])\n      .sort((left, right) => left - right),\n  );\n  const footprints = findFaces(lower).outlines.map(\n    (outline) => outline.polygon,\n  );\n  let area = 0;\n  let over = 0;\n  for (const outline of findFaces(upper).outlines) {\n    const shape = measure(outline.polygon);\n    area += shape.area;\n    over += footprints.reduce(\n      (sum, footprint) => sum + overlapArea(shape, footprint),\n      0,\n    );\n  }\n  const overhang = Math.max(0, area - over);\n  return {\n    corners: gaps.reduce((sum, gap) => sum + gap, 0) / gaps.length,\n    overhang: overhang / 1e6,\n    share: area > 0 ? overhang / area : 0,\n  };\n}\n\n/** Better than where it is by this much counts as out of place. */\nconst BETTER_MM = 100;\nconst BETTER_M2 = 2;\n\nconst searched = new Map<string, Fit | null>();\n\n/** The best place Find fits offers `upper` over `lower`, if it fits there\n * clearly better than where it is now: on the corners, or with less of it\n * over nothing. Searches are kept by the two outlines, so edits inside a\n * floor don't repeat them. */\nexport function betterFit(lower: Scene, upper: Scene, now: Misfit): Fit | null {\n  const key = JSON.stringify([outside(lower).walls, outside(upper).corners]);\n  let best = searched.get(key);\n  if (best === undefined) {\n    best = fits(lower, upper)[0] ?? null;\n    if (searched.size >= 16) {\n      searched.delete(searched.keys().next().value as string);\n    }\n    searched.set(key, best);\n  }\n  if (!best || best.score > FIT_MM) {\n    return null;\n  }\n  const there = misfit(lower, movedScene(upper, best.move));\n  const closer = best.score + BETTER_MM < now.corners;\n  const fuller = there !== null && there.overhang + BETTER_M2 < now.overhang;\n  return closer || fuller ? best : null;\n}\n", "// What the live figures rest on that someone should look at: warnings, never\n// gates, each pointing at the thing to fix.\n\nimport { reheatWPerM2, setbackReadLonger } from \"../heatload/ventilation\";\nimport type { Selection } from \"./core\";\nimport { resolve } from \"./resolve\";\nimport { type DesignHeatLoad, FALLBACK_ZONE } from \"./heatload\";\nimport type { FabricType, Floor } from \"./scene\";\nimport {\n  absorbFix,\n  type CheckFix,\n  lossCause,\n  partyChecks,\n  planChecks,\n} from \"./planchecks\";\nimport { betterFit, misfit } from \"./stacking\";\nimport { emptySpaces, roomsWithIslands } from \"./topology\";\n\nexport interface Check {\n  id: string;\n  level: \"warn\" | \"info\";\n  message: string;\n  /** Where to look: a floor, and what to select on it. */\n  floor?: number;\n  selection?: Selection;\n  /** Arm the brush with party walls to fix it. */\n  brush?: \"party\";\n  /** The tool that fixes it. */\n  tool?: \"floor\";\n  /** One click puts it right: the button's words, and what it does. */\n  fix?: { label: string; action: CheckFix };\n}\n\n/** Property types that share a wall with a neighbour. */\nconst ATTACHED = new Set([\n  \"SEMI_DETACHED\",\n  \"MID_TERRACE\",\n  \"END_TERRACE\",\n  \"FLAT\",\n  \"MAISONETTE\",\n]);\n\n/** The starter fabric every design begins with (apps/design/fabrics.py). */\nconst STARTER_WALL = \"Cavity \u2014 as built\";\n\n/** Unusually lossy for a room once it's drawn; worth a second look. */\nconst HIGH_W_PER_M2 = 150;\n\n/**\n * Beyond what real rooms reach, so most likely a drawing gone wrong. A small\n * top-floor shower room with three solid walls in a cold zone comes to ~420.\n */\nexport const IMPLAUSIBLE_W_PER_M2 = 600;\n\n/** Corners further than this off the walls below, on average, are worth a\n * look for a better place, mm. */\nconst OFF_WALLS_MM = 150;\n\n/** A share of a storey over nothing below beyond this, and at least\n * `OVER_NOTHING_M2`, is said: more than a jetty or a bay. */\nconst OVER_NOTHING = 0.15;\nconst OVER_NOTHING_M2 = 2;\n\n/** Less than this over nothing, m\u00B2, and a floor is standing on the one below. */\nconst ADRIFT_M2 = 0.5;\n\nfunction label(floor: Floor): string {\n  return floor.name || `Level ${floor.level}`;\n}\n\nexport function modelChecks(input: {\n  floors: readonly Floor[];\n  types: readonly FabricType[];\n  roomLoss: DesignHeatLoad | null;\n  propertyType: string;\n  modelError: string;\n  northDeg?: number | null;\n}): Check[] {\n  const { floors, types, roomLoss, propertyType, modelError } = input;\n  const checks: Check[] = [];\n  const drawn = floors.filter((floor) => floor.scene.rooms.length > 0);\n  if (drawn.length === 0) {\n    return checks;\n  }\n\n  if (modelError) {\n    checks.push({ id: \"model\", level: \"warn\", message: modelError });\n  }\n\n  for (const floor of drawn) {\n    for (const room of roomsWithIslands(floor.scene)) {\n      checks.push({\n        id: `island:${room.id}`,\n        level: \"warn\",\n        message: `Walls stand in a loop on their own inside ${room.name || \"a room\"} on ${label(floor)}, so its area takes them in. Join them to a wall.`,\n        floor: floor.id,\n        selection: { type: \"room\", id: room.id },\n      });\n    }\n    const empties = emptySpaces(floor.scene).length;\n    if (empties > 0) {\n      checks.push({\n        id: `empty:${floor.id}`,\n        level: \"info\",\n        message: `${label(floor)} has ${empties === 1 ? \"an empty space\" : `${empties} empty spaces`} inside its walls, counted as unheated. Click one with the Room tool to make it a room.`,\n        floor: floor.id,\n      });\n    }\n    if (!floor.scene.rooms.some((room) => room.heated !== false)) {\n      checks.push({\n        id: `unheated:${floor.id}`,\n        level: \"warn\",\n        message: `${label(floor)} has no heated rooms, so it adds nothing to the model.`,\n        floor: floor.id,\n      });\n    }\n  }\n\n  checks.push(...planChecks(drawn));\n\n  const windows = drawn.some((floor) =>\n    floor.scene.openings.some((opening) => opening.type === \"window\"),\n  );\n  if (windows && (input.northDeg ?? null) === null) {\n    checks.push({\n      id: \"north\",\n      level: \"warn\",\n      message:\n        \"North isn't set, so every window is taken as facing west and its sun is a guess. Set it on the compass.\",\n    });\n  }\n\n  const party = drawn.some((floor) =>\n    floor.scene.walls.some((wall) => wall.party),\n  );\n  const proposed = ATTACHED.has(propertyType) && !party;\n  const proposals = proposed ? partyChecks(drawn, propertyType) : [];\n  checks.push(...proposals);\n  if (proposed && proposals.length === 0) {\n    const kind = propertyType.toLowerCase().replaceAll(\"_\", \"-\");\n    checks.push({\n      id: \"party\",\n      level: \"warn\",\n      message: `A ${kind} home with no party walls: every shared wall is counted as losing heat outside.`,\n      brush: \"party\",\n    });\n  }\n\n  const outside = drawn.flatMap((floor) =>\n    resolve(floor.scene, types).walls.filter(\n      (wall) => wall.kind === \"EXTERNAL\",\n    ),\n  );\n  if (\n    outside.length > 0 &&\n    outside.every((wall) => wall.name === STARTER_WALL)\n  ) {\n    checks.push({\n      id: \"starter-walls\",\n      level: \"info\",\n      message: `Every outside wall is still the starter \"${STARTER_WALL}\". Set the real construction.`,\n    });\n  }\n\n  for (const [index, floor] of drawn.entries()) {\n    const below = drawn[index - 1];\n    const off = below ? misfit(below.scene, floor.scene) : null;\n    const over =\n      off !== null &&\n      off.share > OVER_NOTHING &&\n      off.overhang >= OVER_NOTHING_M2;\n    // Out of place is part of it over nothing and a better place to put it:\n    // a dormer set in from the walls stands wholly on the floor below, and a\n    // room over a garage left out has nowhere better to go.\n    const better =\n      below &&\n      off &&\n      off.overhang >= ADRIFT_M2 &&\n      (off.corners > OFF_WALLS_MM || over)\n        ? betterFit(below.scene, floor.scene, off)\n        : null;\n    if (below && off && better) {\n      const why = [\n        off.corners > OFF_WALLS_MM\n          ? `its outside corners sit ${Math.round(off.corners)} mm off the walls below on average`\n          : \"\",\n        over\n          ? `${off.overhang.toFixed(1)} m\u00B2 of it is over nothing, so counted as exposed floor`\n          : \"\",\n      ].filter(Boolean);\n      checks.push({\n        id: `stack:${floor.id}`,\n        level: \"warn\",\n        message: `${label(floor)} doesn't line up over ${label(below)}: ${why.join(\", and \")}. Line it up with Move floor (M).`,\n        floor: floor.id,\n        tool: \"floor\",\n      });\n    } else if (below && off && over) {\n      checks.push({\n        id: `overhang:${floor.id}`,\n        level: \"info\",\n        message: `${off.overhang.toFixed(1)} m\u00B2 of ${label(floor)} is over nothing on ${label(below)}, so counted as exposed floor. Right over a garage or a jettied front; if there are rooms under it, draw them on ${label(below)}.`,\n        floor: floor.id,\n      });\n    }\n    const view = resolve(floor.scene, types);\n    const windows = view.walls.some((wall) =>\n      (view.openingsByWall.get(wall.id) ?? []).some(\n        (opening) => opening.type === \"window\",\n      ),\n    );\n    if (!windows) {\n      checks.push({\n        id: `windows:${floor.id}`,\n        level: \"info\",\n        message: `${label(floor)} has no windows drawn.`,\n        floor: floor.id,\n      });\n    }\n  }\n\n  const assumed = (roomLoss?.rooms ?? []).filter((room) => room.assumedType);\n  if (assumed.length > 0) {\n    const first = assumed[0];\n    const floor = floors.find((candidate) =>\n      candidate.scene.rooms.some((room) => room.id === first?.id),\n    );\n    checks.push({\n      id: \"room-types\",\n      level: \"info\",\n      message: `${assumed.length === 1 ? \"A room is\" : `${assumed.length} rooms are`} taken as living space for heat loss: ${assumed\n        .slice(0, 4)\n        .map((room) => room.name)\n        .join(\", \")}${assumed.length > 4 ? \"\u2026\" : \"\"}. Set the room type.`,\n      ...(floor && first\n        ? { floor: floor.id, selection: { type: \"room\", id: first.id } }\n        : {}),\n    });\n  }\n\n  const byLoss = [...(roomLoss?.rooms ?? [])].sort(\n    (left, right) => right.wattsPerM2 - left.wattsPerM2,\n  );\n  const implausible = byLoss.filter(\n    (room) => room.wattsPerM2 > IMPLAUSIBLE_W_PER_M2,\n  );\n  const wildest = implausible[0];\n  if (wildest) {\n    const floor = floors.find((candidate) =>\n      candidate.scene.rooms.some((each) => each.id === wildest.id),\n    );\n    const named = implausible\n      .slice(0, 3)\n      .map((room) => `${room.name} ${Math.round(room.wattsPerM2)}`)\n      .join(\", \");\n    const fix = absorbFix(floors, wildest);\n    checks.push({\n      id: \"implausible\",\n      level: \"warn\",\n      message: `${implausible.length === 1 ? \"A room loses\" : `${implausible.length} rooms lose`} over ${IMPLAUSIBLE_W_PER_M2} W/m\u00B2 (${named}${implausible.length > 3 ? \"\u2026\" : \"\"}), beyond what real rooms reach. ${fix ? `${wildest.name} is a sliver the survey left: absorb it into the room beside it.` : \"Check the drawing: the room's corners, its walls' thickness and what's either side.\"}`,\n      ...(floor\n        ? { floor: floor.id, selection: { type: \"room\", id: wildest.id } }\n        : {}),\n      ...(fix ? { fix } : {}),\n    });\n  }\n\n  const lossy = byLoss.filter(\n    (room) =>\n      room.wattsPerM2 > HIGH_W_PER_M2 &&\n      room.wattsPerM2 <= IMPLAUSIBLE_W_PER_M2,\n  );\n  const worst = lossy[0];\n  if (worst) {\n    const floor = floors.find((candidate) =>\n      candidate.scene.rooms.some((each) => each.id === worst.id),\n    );\n    const named = lossy\n      .slice(0, 3)\n      .map((room) => `${room.name} ${Math.round(room.wattsPerM2)}`)\n      .join(\", \");\n    checks.push({\n      id: \"lossy\",\n      level: \"info\",\n      message: `${lossy.length === 1 ? \"A room loses\" : `${lossy.length} rooms lose`} over ${HIGH_W_PER_M2} W/m\u00B2 (${named}${lossy.length > 3 ? \"\u2026\" : \"\"}): ${lossCause(floors, worst) || \"check their walls, windows and types\"}.`,\n      ...(floor\n        ? { floor: floor.id, selection: { type: \"room\", id: worst.id } }\n        : {}),\n    });\n  }\n\n  if (roomLoss?.zoneFrom === \"fallback\") {\n    checks.push({\n      id: \"zone\",\n      level: \"warn\",\n      message: `The postcode isn't one we can place, so the outdoor design temperature is zone ${FALLBACK_ZONE}'s. Set the zone in the design conditions.`,\n    });\n  }\n\n  const airless = (roomLoss?.rooms ?? []).filter(\n    (room) => room.ventilation.underVentilated,\n  );\n  if (airless.length > 0) {\n    checks.push({\n      id: \"ventilation\",\n      level: \"info\",\n      message: `${airless.length === 1 ? \"A room leaks\" : `${airless.length} rooms leak`} less than half an air change an hour (${airless\n        .slice(0, 3)\n        .map((room) => room.name)\n        .join(\", \")}): DHDG says check its ventilation, not add heat.`,\n    });\n  }\n\n  const heating = roomLoss?.conditions.heating;\n  const longer = heating ? setbackReadLonger(heating) : null;\n  if (heating && heating.kind !== \"constant\" && longer !== null) {\n    checks.push({\n      id: \"reheat\",\n      level: \"warn\",\n      message: `DHDG Table 2-15 has no reheat allowance for a ${heating.dropC} \u00B0C setback in ${heating.reheatH} h, so it takes ${longer} h's ${reheatWPerM2(heating)} W/m\u00B2, and the real need is more. Lengthen the reheat or lessen the setback.`,\n    });\n  }\n\n  const defaulted = new Set(\n    (roomLoss?.rooms ?? []).flatMap((room) =>\n      room.elements\n        .filter((element) => element.source.startsWith(\"RdSAP\"))\n        .map((element) => element.what),\n    ),\n  );\n  if (defaulted.size > 0) {\n    checks.push({\n      id: \"rdsap-fabric\",\n      level: \"info\",\n      message: `No DHDG table matches ${[...defaulted].slice(0, 3).join(\", \")}, so it takes RdSAP's default U-value. Pick a construction or enter a known U-value.`,\n    });\n  }\n\n  return checks;\n}\n", "// Stepping through the checks one at a time, as an IDE steps through its\n// problems: the place is kept by id, and by position for when the check\n// stepped to has since been fixed and gone.\n\nimport type { Check } from \"./checks\";\nimport type { Selection } from \"./core\";\nimport type { Bounds, Point, Scene } from \"./scene\";\nimport { polygonOf, wallEnds } from \"./topology\";\n\nexport interface CheckPlace {\n  id: string;\n  index: number;\n}\n\n/** The check `step` along from `at`, wrapping round; null when none are left. */\nexport function stepCheck(\n  checks: Check[],\n  at: CheckPlace | null,\n  step: 1 | -1,\n): Check | null {\n  const count = checks.length;\n  if (count === 0) {\n    return null;\n  }\n  if (!at) {\n    return checks[step === 1 ? 0 : count - 1] ?? null;\n  }\n  const index = checks.findIndex((check) => check.id === at.id);\n  if (index >= 0) {\n    return checks[(index + step + count) % count] ?? null;\n  }\n  // Fixed and gone: the next one has moved up into its place.\n  const next = step === 1 ? at.index : at.index - 1;\n  return checks[((next % count) + count) % count] ?? null;\n}\n\n/** Where `id` sits now, or null once it's been fixed. */\nexport function placeOf(checks: Check[], id: string): CheckPlace | null {\n  const index = checks.findIndex((check) => check.id === id);\n  return index >= 0 ? { id, index } : null;\n}\n\n/** Where on the plan a check points, so stepping to it can bring it into view. */\nexport function boundsOfSelection(\n  scene: Scene,\n  selection: Selection,\n): Bounds | null {\n  if (!selection) {\n    return null;\n  }\n  const wallPoints = (id: string): Point[] => {\n    const wall = scene.walls.find((each) => each.id === id);\n    return (wall && wallEnds(scene, wall)) || [];\n  };\n  let points: Point[] = [];\n  if (selection.type === \"room\") {\n    const room = scene.rooms.find((each) => each.id === selection.id);\n    points = room ? polygonOf(scene, room) : [];\n  } else if (selection.type === \"wall\") {\n    points = wallPoints(selection.id);\n  } else if (selection.type === \"opening\") {\n    const opening = scene.openings.find((each) => each.id === selection.id);\n    points = opening ? wallPoints(opening.wall) : [];\n  } else if (selection.type === \"emitter\") {\n    const emitter = scene.emitters.find((each) => each.id === selection.id);\n    points = emitter?.kind === \"radiator\" ? wallPoints(emitter.wall) : [];\n  }\n  if (points.length === 0) {\n    return null;\n  }\n  const xs = points.map((point) => point[0]);\n  const ys = points.map((point) => point[1]);\n  return {\n    minX: Math.min(...xs),\n    minY: Math.min(...ys),\n    maxX: Math.max(...xs),\n    maxY: Math.max(...ys),\n  };\n}\n", "// Pan and zoom from a trackpad and from fingers, as Figma and Google Maps do,\n// while a mouse wheel's notches keep zooming as they always have.\n\nexport type WheelIntent =\n  | { kind: \"zoom\"; factor: number }\n  | { kind: \"pan\"; dx: number; dy: number };\n\nexport interface WheelLike {\n  deltaX: number;\n  deltaY: number;\n  deltaMode: number;\n  ctrlKey: boolean;\n  metaKey: boolean;\n  timeStamp: number;\n  /** Chrome's legacy delta, a multiple of 120 for each mouse-wheel notch. */\n  wheelDeltaY?: number;\n}\n\n/** A wheel notch's zoom step: past 1 zooms out. */\nconst NOTCH = 1.1;\n/** A pinch's step that zooms as far as one notch, so neither outruns it. */\nconst PINCH_STEP = Math.log(NOTCH) / 0.01;\n/** A trackpad's swipe keeps panning through a gap this long (ms). */\nconst STREAM_MS = 150;\nconst LINE_PX = 16;\nconst PAGE_PX = 400;\n\n/** Reads wheel events as zooms or pans, remembering a swipe in progress so a\n * fast flick in the middle of one doesn't read as a mouse notch. */\nexport class WheelReader {\n  private panUntil = -Infinity;\n\n  read(event: WheelLike): WheelIntent {\n    const scale =\n      event.deltaMode === 1 ? LINE_PX : event.deltaMode === 2 ? PAGE_PX : 1;\n    const dx = event.deltaX * scale;\n    const dy = event.deltaY * scale;\n    // A pinch arrives as a wheel with Ctrl held, as does Ctrl and a wheel.\n    if (event.ctrlKey || event.metaKey) {\n      const step = Math.max(-PINCH_STEP, Math.min(PINCH_STEP, dy));\n      return { kind: \"zoom\", factor: Math.exp(step * 0.01) };\n    }\n    // Mouse wheels move a whole notch at a time, straight up or down. Chrome\n    // divides the delta by the page's zoom, so it needn't be a whole number.\n    const legacy = event.wheelDeltaY ?? 0;\n    const notch =\n      event.deltaMode !== 0 ||\n      (dx === 0 &&\n        (Math.abs(dy) >= 50 || (legacy !== 0 && legacy % 120 === 0)));\n    if (notch && event.timeStamp > this.panUntil) {\n      return { kind: \"zoom\", factor: dy > 0 ? NOTCH : 1 / NOTCH };\n    }\n    this.panUntil = event.timeStamp + STREAM_MS;\n    return { kind: \"pan\", dx: -dx, dy: -dy };\n  }\n}\n\nexport interface TouchStep {\n  /** How far the fingers' midpoint moved, in screen pixels. */\n  dx: number;\n  dy: number;\n  /** Where they are now, to zoom about. */\n  x: number;\n  y: number;\n  /** Past 1 zooms out, as for a wheel. */\n  factor: number;\n}\n\ntype Spot = [number, number];\n\nfunction middle(a: Spot, b: Spot): Spot {\n  return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n}\n\nfunction apart(a: Spot, b: Spot): number {\n  return Math.max(Math.hypot(a[0] - b[0], a[1] - b[1]), 1);\n}\n\n/** Two fingers on the plan: their midpoint pans it, their spread zooms it. */\nexport class TouchGesture {\n  private readonly fingers = new Map<number, Spot>();\n\n  /** True while two or more fingers are down. */\n  get active(): boolean {\n    return this.fingers.size >= 2;\n  }\n\n  down(id: number, x: number, y: number): void {\n    this.fingers.set(id, [x, y]);\n  }\n\n  up(id: number): void {\n    this.fingers.delete(id);\n  }\n\n  move(id: number, x: number, y: number): TouchStep | null {\n    if (!this.fingers.has(id)) {\n      return null;\n    }\n    const pair = [...this.fingers.entries()].slice(0, 2);\n    const before = pair.map(([, spot]) => spot);\n    this.fingers.set(id, [x, y]);\n    const [first, second] = before;\n    if (pair.length < 2 || !first || !second) {\n      return null;\n    }\n    const after = pair.map(([key, spot]) => (key === id ? [x, y] : spot));\n    const [one, two] = after as [Spot, Spot];\n    const was = middle(first, second);\n    const now = middle(one, two);\n    return {\n      dx: now[0] - was[0],\n      dy: now[1] - was[1],\n      x: now[0],\n      y: now[1],\n      factor: apart(first, second) / apart(one, two),\n    };\n  }\n}\n\n/** How far a finger moves, or how long it stays, before it's drawing. */\nexport const TOUCH_SLOP_PX = 8;\nexport const TOUCH_HOLD_MS = 150;\n\n/** A finger's press held back from the tool until it's plainly drawing:\n * moved past the slop, lifted, or held. A second finger landing first makes\n * it a pinch, without a stray point put down that cancelling would undo\n * along with the whole path. */\nexport class HeldTouch<T> {\n  private held: { id: number; x: number; y: number; press: T } | null = null;\n\n  hold(id: number, x: number, y: number, press: T): void {\n    this.held = { id, x, y, press };\n  }\n\n  holds(id: number): boolean {\n    return this.held?.id === id;\n  }\n\n  /** The held press, once its finger has moved past the slop. */\n  moved(id: number, x: number, y: number): T | null {\n    const held = this.held;\n    if (!held || held.id !== id) {\n      return null;\n    }\n    return Math.hypot(x - held.x, y - held.y) > TOUCH_SLOP_PX\n      ? this.take()\n      : null;\n  }\n\n  /** The held press, to give the tool now. */\n  take(): T | null {\n    const press = this.held?.press ?? null;\n    this.held = null;\n    return press;\n  }\n\n  drop(): void {\n    this.held = null;\n  }\n}\n\nexport interface KeyLike {\n  key: string;\n  code: string;\n  ctrlKey: boolean;\n  metaKey: boolean;\n  shiftKey: boolean;\n}\n\n/** Figma's zoom keys: a zoom step (past 1 zooms out), \"fit\", or null to\n * leave the key be. Only while the plan's in view; over the 3D view\n * Ctrl +/\u2212 is the browser's page zoom again. */\nexport function zoomKey(\n  event: KeyLike,\n  planShown: boolean,\n): number | \"fit\" | null {\n  if (!planShown) {\n    return null;\n  }\n  if ((event.ctrlKey || event.metaKey) && [\"=\", \"+\", \"-\"].includes(event.key)) {\n    return event.key === \"-\" ? 1.25 : 1 / 1.25;\n  }\n  if (event.shiftKey && event.code === \"Digit1\") {\n    return \"fit\";\n  }\n  return null;\n}\n", "// What's under the pointer with the select tool: tinted on the plan and named\n// in the status bar, so you know whether a click takes the wall, the window\n// in it or the room behind it before you click.\n\nimport { roomAreaMm2 } from \"./features\";\nimport { formatAreaM2 } from \"./geometry\";\nimport type { Scene } from \"./scene\";\nimport { wallEnds, wallKinds } from \"./topology\";\n\nexport interface Hover {\n  layer: string;\n  id: string;\n}\n\nconst OPENINGS = { door: \"Door\", window: \"Window\", opening: \"Opening\" };\n\nconst KINDS: Record<string, string> = {\n  INTERNAL: \"inside\",\n  PARTY: \"party\",\n  EXTERNAL: \"outside\",\n};\n\nfunction mm(value: number): string {\n  return `${Math.round(value).toLocaleString(\"en-GB\")} mm`;\n}\n\n/** A line for the status bar naming what a click would take. */\nexport function describeHover(scene: Scene, hover: Hover | null): string {\n  if (!hover) {\n    return \"\";\n  }\n  if (hover.layer === \"rooms\") {\n    const room = scene.rooms.find((each) => each.id === hover.id);\n    if (!room) {\n      return \"\";\n    }\n    const area = formatAreaM2(roomAreaMm2(scene, room));\n    return `Room: ${room.name || \"unnamed\"}, ${area}`;\n  }\n  if (hover.layer === \"walls\") {\n    const wall = scene.walls.find((each) => each.id === hover.id);\n    const ends = wall ? wallEnds(scene, wall) : null;\n    if (!wall || !ends) {\n      return \"\";\n    }\n    const length = Math.hypot(ends[1][0] - ends[0][0], ends[1][1] - ends[0][1]);\n    const kind =\n      KINDS[wallKinds(scene).get(wall.id) ?? \"EXTERNAL\"] ?? \"outside\";\n    return `Wall, ${kind}: ${mm(length)} long, ${mm(wall.thickness)} thick`;\n  }\n  if (hover.layer === \"openings\") {\n    const opening = scene.openings.find((each) => each.id === hover.id);\n    return opening\n      ? `${OPENINGS[opening.type]}: ${mm(opening.width)} wide`\n      : \"\";\n  }\n  if (hover.layer === \"emitters\") {\n    const emitter = scene.emitters.find((each) => each.id === hover.id);\n    if (!emitter) {\n      return \"\";\n    }\n    return emitter.kind === \"radiator\"\n      ? `Radiator: type ${emitter.type}, ${mm(emitter.length)} long`\n      : \"Underfloor heating\";\n  }\n  if (hover.layer === \"annotations\") {\n    return \"Measure on the plan\";\n  }\n  return \"\";\n}\n\n/** Keeps `data-hover` on the one entity under the pointer, for the CSS. */\nexport class HoverMarker {\n  private marked: Element | null = null;\n  private key = \"\";\n\n  /** Mark what `target` is part of. Its description when that changed,\n   * else null, so a pointer moving over one wall describes it once. */\n  at(target: EventTarget | null, scene: Scene): string | null {\n    const group =\n      target instanceof Element ? target.closest(\"g[data-id]\") : null;\n    if (group !== this.marked) {\n      this.marked?.removeAttribute(\"data-hover\");\n      group?.setAttribute(\"data-hover\", \"\");\n      this.marked = group;\n    }\n    const layer = group?.parentElement?.getAttribute(\"data-layer\") ?? \"\";\n    const id = group?.getAttribute(\"data-id\") ?? \"\";\n    const key = `${layer}:${id}`;\n    if (key === this.key) {\n      return null;\n    }\n    this.key = key;\n    return describeHover(scene, layer && id ? { layer, id } : null);\n  }\n}\n", "// A readable log of edits. Each undo entry is the floor as it was before an\n// edit, so describing one is a pure diff of two snapshots: no new bookkeeping\n// in the tools, and the same words for an edit made now or replayed later.\n\nimport type { FloorSnapshot } from \"./history\";\nimport type { Annotation, Opening, Scene } from \"./scene\";\nimport { roomsOn } from \"./topology\";\n\nexport type ChangeKind = \"geometry\" | \"fabric\" | \"measures\" | \"settings\";\n\n/** What a click on a log line shows: a plan layer and the id in it. */\nexport interface Target {\n  layer: \"walls\" | \"openings\" | \"rooms\" | \"emitters\" | \"annotations\";\n  id: string;\n}\n\nexport interface Change {\n  kind: ChangeKind;\n  text: string;\n  target: Target | null;\n}\n\nexport const KIND_TITLES: Record<ChangeKind, string> = {\n  geometry: \"Shape\",\n  fabric: \"Fabric\",\n  measures: \"Measures\",\n  settings: \"Settings\",\n};\n\n/** A session ends when the next edit comes this long after the last. */\nexport const SESSION_GAP_MS = 30 * 60 * 1000;\n\nconst OPENING_NAMES = { window: \"Window\", door: \"Door\", opening: \"Opening\" };\nconst OPENING_LETTERS = { window: \"W\", door: \"D\", opening: \"O\" };\n\n/** The fabric types' names by id, for \"\u2192 Solid brick 225\". */\nexport type FabricNames = ReadonlyMap<number, string>;\n\nfunction roomName(scene: Scene, id: string): string {\n  return scene.rooms.find((room) => room.id === id)?.name || \"Room\";\n}\n\n/** A wall's number in its first room, counted round the room's edges as the\n * room inspector lists them; null for a wall no room runs along. */\nexport function wallNumber(\n  scene: Scene,\n  roomId: string,\n  wallId: string,\n): number | null {\n  const room = scene.rooms.find((each) => each.id === roomId);\n  if (!room) {\n    return null;\n  }\n  const index = room.boundary.findIndex((from, at) => {\n    const to = room.boundary[(at + 1) % room.boundary.length];\n    const wall = scene.walls.find(\n      (each) =>\n        (each.a === from && each.b === to) ||\n        (each.a === to && each.b === from),\n    );\n    return wall?.id === wallId;\n  });\n  return index < 0 ? null : index + 1;\n}\n\n/** \"Kitchen: wall 3\", or \"Wall\" for one that bounds no room. */\nexport function wallLabel(scene: Scene, wallId: string): string {\n  const room = roomsOn(scene, wallId)[0];\n  const number = room ? wallNumber(scene, room.id, wallId) : null;\n  return room && number ? `${room.name || \"Room\"}: wall ${number}` : \"Wall\";\n}\n\n/** \"W4\": the opening's place among those of its kind. */\nexport function openingTag(scene: Scene, opening: Opening): string {\n  const same = scene.openings.filter((each) => each.type === opening.type);\n  return `${OPENING_LETTERS[opening.type]}${same.indexOf(opening) + 1}`;\n}\n\nfunction openingRoom(scene: Scene, opening: Opening): string {\n  const room = roomsOn(scene, opening.wall)[0];\n  return room ? ` (${room.name || \"Room\"})` : \"\";\n}\n\nfunction fabricName(names: FabricNames, id: number | null | undefined): string {\n  return id === null || id === undefined\n    ? \"the default\"\n    : (names.get(id) ?? \"another type\");\n}\n\nfunction byId<T extends { id: string | number }>(list: readonly T[]) {\n  return new Map(list.map((item) => [item.id, item]));\n}\n\nfunction same(a: unknown, b: unknown): boolean {\n  return JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction wallChanges(\n  before: Scene,\n  after: Scene,\n  names: FabricNames,\n): Change[] {\n  const changes: Change[] = [];\n  const old = byId(before.walls);\n  const now = byId(after.walls);\n  for (const wall of after.walls) {\n    const was = old.get(wall.id);\n    const target: Target = { layer: \"walls\", id: wall.id };\n    if (\n      was &&\n      was.fabric === wall.fabric &&\n      was.thickness === wall.thickness &&\n      was.party === wall.party\n    ) {\n      continue;\n    }\n    // Only a changed or new wall is worth the label's lookups.\n    const label = wallLabel(after, wall.id);\n    if (!was) {\n      changes.push({\n        kind: \"geometry\",\n        text: `Added ${label}`,\n        target,\n      });\n      continue;\n    }\n    if ((was.fabric ?? null) !== (wall.fabric ?? null)) {\n      changes.push({\n        kind: \"fabric\",\n        text: `${label} \u2192 ${fabricName(names, wall.fabric)}`,\n        target,\n      });\n    }\n    if (was.thickness !== wall.thickness) {\n      changes.push({\n        kind: \"geometry\",\n        text: `${label}: ${wall.thickness} mm thick`,\n        target,\n      });\n    }\n    if (was.party !== wall.party) {\n      changes.push({\n        kind: \"geometry\",\n        text: `${label} ${wall.party ? \"is now a party wall\" : \"is no longer a party wall\"}`,\n        target,\n      });\n    }\n  }\n  for (const wall of before.walls) {\n    if (!now.has(wall.id)) {\n      changes.push({\n        kind: \"geometry\",\n        text: `Removed ${wallLabel(before, wall.id)}`,\n        target: null,\n      });\n    }\n  }\n  return changes;\n}\n\nfunction openingChanges(\n  before: Scene,\n  after: Scene,\n  names: FabricNames,\n): Change[] {\n  const changes: Change[] = [];\n  const old = byId(before.openings);\n  const now = byId(after.openings);\n  for (const opening of after.openings) {\n    const was = old.get(opening.id);\n    const target: Target = { layer: \"openings\", id: opening.id };\n    if (\n      was &&\n      was.fabric === opening.fabric &&\n      was.wall === opening.wall &&\n      was.offset === opening.offset &&\n      was.width === opening.width &&\n      was.height === opening.height &&\n      was.sill === opening.sill\n    ) {\n      continue;\n    }\n    const tag = `${OPENING_NAMES[opening.type]} ${openingTag(after, opening)}`;\n    const lower = `${OPENING_NAMES[opening.type].toLowerCase()} ${openingTag(after, opening)}`;\n    if (!was) {\n      changes.push({\n        kind: \"geometry\",\n        text: `Added ${lower}${openingRoom(after, opening)}`,\n        target,\n      });\n      continue;\n    }\n    if ((was.fabric ?? null) !== (opening.fabric ?? null)) {\n      changes.push({\n        kind: \"fabric\",\n        text: `${tag} \u2192 ${fabricName(names, opening.fabric)}`,\n        target,\n      });\n    }\n    const sizeOrPlace = [\"wall\", \"offset\", \"width\", \"height\", \"sill\"] as const;\n    if (sizeOrPlace.some((key) => was[key] !== opening[key])) {\n      const moved = was.wall !== opening.wall || was.offset !== opening.offset;\n      changes.push({\n        kind: \"geometry\",\n        text: `${moved ? \"Moved\" : \"Resized\"} ${lower}`,\n        target,\n      });\n    }\n  }\n  for (const opening of before.openings) {\n    if (!now.has(opening.id)) {\n      changes.push({\n        kind: \"geometry\",\n        text: `Removed ${OPENING_NAMES[opening.type].toLowerCase()} ${openingTag(before, opening)}${openingRoom(before, opening)}`,\n        target: null,\n      });\n    }\n  }\n  return changes;\n}\n\nconst ROOM_FIELDS: [keyof Scene[\"rooms\"][number], string][] = [\n  [\"room_type\", \"room type\"],\n  [\"ceiling_height\", \"ceiling height\"],\n  [\"temperature\", \"temperature\"],\n];\n\nfunction roomChanges(before: Scene, after: Scene): Change[] {\n  const changes: Change[] = [];\n  const old = byId(before.rooms);\n  const now = byId(after.rooms);\n  for (const room of after.rooms) {\n    const was = old.get(room.id);\n    const target: Target = { layer: \"rooms\", id: room.id };\n    const name = room.name || \"Room\";\n    if (!was) {\n      changes.push({ kind: \"geometry\", text: `Added room ${name}`, target });\n      continue;\n    }\n    if (was.name !== room.name) {\n      changes.push({\n        kind: \"settings\",\n        text: `Renamed ${was.name || \"room\"} \u2192 ${name}`,\n        target,\n      });\n    }\n    if (was.heated !== room.heated) {\n      changes.push({\n        kind: \"settings\",\n        text: `${name} is now ${room.heated ? \"heated\" : \"unheated\"}`,\n        target,\n      });\n    }\n    for (const [key, label] of ROOM_FIELDS) {\n      if (!same(was[key], room[key])) {\n        const value = room[key];\n        changes.push({\n          kind: \"settings\",\n          text: `${name}: ${label} ${value === null || value === undefined || value === \"\" ? \"cleared\" : `\u2192 ${String(value)}`}`,\n          target,\n        });\n      }\n    }\n    if (!same(was.boundary, room.boundary)) {\n      changes.push({ kind: \"geometry\", text: `Reshaped ${name}`, target });\n    }\n  }\n  for (const room of before.rooms) {\n    if (!now.has(room.id)) {\n      changes.push({\n        kind: \"geometry\",\n        text: `Removed room ${room.name || \"\"}`.trim(),\n        target: null,\n      });\n    }\n  }\n  return changes;\n}\n\nfunction emitterChanges(before: Scene, after: Scene): Change[] {\n  const changes: Change[] = [];\n  const old = byId(before.emitters);\n  const now = byId(after.emitters);\n  const name = (scene: Scene, emitter: Scene[\"emitters\"][number]) =>\n    `${emitter.kind === \"radiator\" ? \"radiator\" : \"underfloor heating\"} (${roomName(scene, emitter.room)})`;\n  for (const emitter of after.emitters) {\n    const target: Target = { layer: \"emitters\", id: emitter.id };\n    const was = old.get(emitter.id);\n    if (!was) {\n      changes.push({\n        kind: \"settings\",\n        text: `Added ${name(after, emitter)}`,\n        target,\n      });\n    } else if (!same(was, emitter)) {\n      changes.push({\n        kind: \"settings\",\n        text: `Changed ${name(after, emitter)}`,\n        target,\n      });\n    }\n  }\n  for (const emitter of before.emitters) {\n    if (!now.has(emitter.id)) {\n      changes.push({\n        kind: \"settings\",\n        text: `Removed ${name(before, emitter)}`,\n        target: null,\n      });\n    }\n  }\n  return changes;\n}\n\nfunction fixtureChanges(before: Scene, after: Scene): Change[] {\n  const changes: Change[] = [];\n  const old = byId(before.fixtures ?? []);\n  const now = byId(after.fixtures ?? []);\n  const name = (fixture: { kind: string }) => fixture.kind.replaceAll(\"_\", \" \");\n  for (const fixture of after.fixtures ?? []) {\n    const was = old.get(fixture.id);\n    if (!was) {\n      changes.push({\n        kind: \"settings\",\n        text: `Added ${name(fixture)}`,\n        target: null,\n      });\n    } else if (!same(was, fixture)) {\n      changes.push({\n        kind: \"settings\",\n        text: `Changed ${name(fixture)}`,\n        target: null,\n      });\n    }\n  }\n  for (const fixture of before.fixtures ?? []) {\n    if (!now.has(fixture.id)) {\n      changes.push({\n        kind: \"settings\",\n        text: `Removed ${name(fixture)}`,\n        target: null,\n      });\n    }\n  }\n  return changes;\n}\n\nfunction cornersMoved(before: Scene, after: Scene): number {\n  const old = byId(before.vertices);\n  return after.vertices.filter((vertex) => {\n    const was = old.get(vertex.id);\n    return was && !same(was.at, vertex.at);\n  }).length;\n}\n\nfunction annotationChanges(\n  before: readonly Annotation[],\n  after: readonly Annotation[],\n  measureNames: ReadonlyMap<string, string>,\n): Change[] {\n  const changes: Change[] = [];\n  const live = (list: readonly Annotation[]) =>\n    new Map(\n      list.filter((each) => !each.deleted).map((each) => [each.id, each]),\n    );\n  const old = live(before);\n  const now = live(after);\n  const title = (each: Annotation) =>\n    each.label || measureNames.get(each.kind) || each.kind;\n  for (const [id, each] of now) {\n    const was = old.get(id);\n    const target: Target = { layer: \"annotations\", id: String(id) };\n    if (!was) {\n      changes.push({ kind: \"measures\", text: `Added ${title(each)}`, target });\n    } else if (was.status !== each.status) {\n      changes.push({\n        kind: \"measures\",\n        text: `${title(each)} is now ${each.status.toLowerCase()}`,\n        target,\n      });\n    } else if (!same(was.geometry, each.geometry)) {\n      changes.push({ kind: \"measures\", text: `Moved ${title(each)}`, target });\n    } else if (was.label !== each.label || was.notes !== each.notes) {\n      changes.push({ kind: \"measures\", text: `Edited ${title(each)}`, target });\n    }\n  }\n  for (const [id, each] of old) {\n    if (!now.has(id)) {\n      changes.push({\n        kind: \"measures\",\n        text: `Removed ${title(each)}`,\n        target: null,\n      });\n    }\n  }\n  return changes;\n}\n\n/** What changed between two states of a floor, in words. */\nexport function describeChange(\n  before: FloorSnapshot,\n  after: FloorSnapshot,\n  names: FabricNames = new Map(),\n  measureNames: ReadonlyMap<string, string> = new Map(),\n): Change[] {\n  const changes: Change[] = [];\n  if (before.moved || after.moved) {\n    changes.push({ kind: \"geometry\", text: \"Moved the floor\", target: null });\n  }\n  changes.push(\n    ...wallChanges(before.scene, after.scene, names),\n    ...openingChanges(before.scene, after.scene, names),\n    ...roomChanges(before.scene, after.scene),\n    ...emitterChanges(before.scene, after.scene),\n    ...fixtureChanges(before.scene, after.scene),\n  );\n  const corners = cornersMoved(before.scene, after.scene);\n  if (corners > 0 && !changes.some((each) => each.kind === \"geometry\")) {\n    changes.push({\n      kind: \"geometry\",\n      text: corners === 1 ? \"Moved a corner\" : `Moved ${corners} corners`,\n      target: null,\n    });\n  }\n  changes.push(\n    ...annotationChanges(before.annotations, after.annotations, measureNames),\n  );\n  return changes;\n}\n\n/** An undo entry's states as the log wants them. */\nexport interface Step {\n  /** Epoch ms of the edit. */\n  at: number;\n  before: FloorSnapshot;\n  after: FloorSnapshot;\n}\n\nexport interface LogLine extends Change {\n  /** The step it came from, oldest first: where Revert to here goes back to. */\n  step: number;\n  at: number;\n}\n\nexport interface Session {\n  start: number;\n  end: number;\n  /** Kinds in the order they first appear, newest line first within each. */\n  kinds: { kind: ChangeKind; lines: LogLine[] }[];\n}\n\n/** Steps as log lines, then as sessions, newest first. A step that changed\n * nothing visible (a preview, a drag put back) leaves no line. */\nexport function sessionsOf(\n  steps: readonly Step[],\n  names: FabricNames = new Map(),\n  measureNames: ReadonlyMap<string, string> = new Map(),\n  gapMs: number = SESSION_GAP_MS,\n): Session[] {\n  const lines: LogLine[] = steps.flatMap((step, index) =>\n    describeChange(step.before, step.after, names, measureNames).map(\n      (change) => ({ ...change, step: index, at: step.at }),\n    ),\n  );\n  const sessions: Session[] = [];\n  let current: LogLine[] = [];\n  const close = () => {\n    if (current.length === 0) {\n      return;\n    }\n    const kinds: Session[\"kinds\"] = [];\n    for (const line of [...current].reverse()) {\n      let group = kinds.find((each) => each.kind === line.kind);\n      if (!group) {\n        group = { kind: line.kind, lines: [] };\n        kinds.push(group);\n      }\n      group.lines.push(line);\n    }\n    sessions.unshift({\n      start: current[0]?.at ?? 0,\n      end: current[current.length - 1]?.at ?? 0,\n      kinds,\n    });\n    current = [];\n  };\n  for (const line of lines) {\n    const last = current[current.length - 1];\n    if (last && line.at - last.at > gapMs) {\n      close();\n    }\n    current.push(line);\n  }\n  close();\n  return sessions;\n}\n\n/** \"Saved 14:02, 5 changes\": a revision from an earlier day. */\nexport function savedLabel(created: string, changes: number | null): string {\n  const when = new Date(created).toLocaleString(\"en-GB\", {\n    day: \"numeric\",\n    month: \"short\",\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n  });\n  if (changes === null) {\n    return `Saved ${when}`;\n  }\n  return `Saved ${when}, ${changes === 1 ? \"1 change\" : `${changes} changes`}`;\n}\n", "// The room inspector: every wall, window, door, floor and ceiling of the\n// selected room, one row each. The rows are the heat load's own surfaces\n// (heatmodel.ts pairs each with what lies beyond it, as the stacking does), so\n// what's listed here is what the calc used, not a second reading of the plan.\n\nimport type { ElementResult, RoomResult } from \"../heatload/engine\";\nimport type { Boundary } from \"../heatload/model\";\nimport { resolve as resolveFabric } from \"./bridge\";\nimport { openingTag, wallNumber } from \"./changelog\";\nimport type { FabricType, Scene } from \"./scene\";\n\nexport type RowGroup = \"walls\" | \"openings\" | \"floor\" | \"ceiling\" | \"other\";\n\nexport interface Row {\n  group: RowGroup;\n  /** \"Wall 3\", \"Window W4\", \"Floor\", \"Ceiling\". */\n  label: string;\n  /** What's beyond it: \"external\", \"party\", \"internal, to Hall\", \u2026 */\n  beyond: string;\n  /** The fabric's name, or \"\" where the calc used a standard assumption. */\n  fabric: string;\n  /** Which fabric types its picker would offer; null where it isn't one. */\n  element: FabricType[\"element\"] | null;\n  /** The fabric type to open from the row, where it has one. */\n  typeId: number | null;\n  u: number;\n  areaM2: number;\n  /** W lost through it; 0 where both sides are the same temperature. */\n  watts: number;\n  /** Plan layer and id to highlight, and to select on a click. */\n  layer: \"walls\" | \"openings\" | \"rooms\" | null;\n  id: string;\n}\n\nexport interface Inspection {\n  rows: Row[];\n  watts: number;\n  wattsPerM2: number;\n}\n\nexport function beyond(boundary: Boundary, facing: string): string {\n  switch (boundary.kind) {\n    case \"outside\":\n      return \"external\";\n    case \"adjoining\":\n      return \"party\";\n    case \"unheated\":\n      return `to unheated space, ${boundary.space || \"unnamed\"}`;\n    case \"room\":\n      return `internal, to ${facing}`;\n    case \"ground\":\n      return \"ground\";\n  }\n}\n\nfunction floorBeyond(element: ElementResult): string {\n  const { boundary } = element;\n  if (boundary.kind === \"ground\") {\n    return \"on the ground\";\n  }\n  if (boundary.kind === \"room\") {\n    return `over ${element.facing}`;\n  }\n  if (boundary.kind === \"unheated\") {\n    return `over ${boundary.space || \"an unheated space\"} (unheated)`;\n  }\n  return beyond(boundary, element.facing);\n}\n\nfunction ceilingBeyond(element: ElementResult): string {\n  const { boundary } = element;\n  if (boundary.kind === \"outside\") {\n    return \"roof or loft\";\n  }\n  if (boundary.kind === \"room\") {\n    return `room above: ${element.facing}`;\n  }\n  if (boundary.kind === \"unheated\") {\n    return `above ${boundary.space || \"an unheated space\"} (unheated)`;\n  }\n  return beyond(boundary, element.facing);\n}\n\n/** The fabric type a surface is made of: the one its key names, else the\n * type its wall or opening is drawn with, else the design's default. */\nfunction typeOf(\n  element: ElementResult,\n  scene: Scene,\n  types: readonly FabricType[],\n): FabricType | undefined {\n  const match = /^(?:wall|window|door|floor|roof):(\\d+)$/.exec(element.fabric);\n  const named = match\n    ? types.find((type) => type.id === Number(match[1]))\n    : undefined;\n  if (named) {\n    return named;\n  }\n  const kind = ELEMENT_OF[element.kind];\n  if (kind !== \"WALL\" && kind !== \"WINDOW\" && kind !== \"DOOR\") {\n    return undefined;\n  }\n  const id = element.ref?.id;\n  const drawn =\n    kind === \"WALL\"\n      ? scene.walls.find((wall) => wall.id === id)\n      : scene.openings.find((opening) => opening.id === id);\n  return resolveFabric(types, kind, drawn?.fabric);\n}\n\nconst ELEMENT_OF: Partial<\n  Record<ElementResult[\"kind\"], FabricType[\"element\"]>\n> = {\n  wall: \"WALL\",\n  window: \"WINDOW\",\n  door: \"DOOR\",\n  floor: \"FLOOR\",\n  \"ground-floor\": \"FLOOR\",\n  roof: \"ROOF\",\n};\n\nfunction row(\n  element: ElementResult,\n  group: RowGroup,\n  label: string,\n  where: string,\n  scene: Scene,\n  types: readonly FabricType[],\n): Row {\n  const type = typeOf(element, scene, types);\n  return {\n    group,\n    label,\n    beyond: where,\n    fabric: type?.name ?? element.what,\n    element: ELEMENT_OF[element.kind] ?? null,\n    typeId: type?.id ?? null,\n    u: element.u,\n    areaM2: element.areaM2,\n    watts: element.designW,\n    layer: element.ref?.layer ?? null,\n    id: element.ref?.id ?? \"\",\n  };\n}\n\nconst ORDER: RowGroup[] = [\"walls\", \"openings\", \"floor\", \"ceiling\", \"other\"];\n\n/** The room's elements, walls first as they run round it, then its windows\n * and doors, floor and ceiling. */\nexport function inspect(\n  result: RoomResult,\n  scene: Scene,\n  types: readonly FabricType[] = [],\n): Inspection {\n  const rows: Row[] = [];\n  for (const element of [...result.elements, ...result.unlisted]) {\n    if (element.kind === \"wall\") {\n      const number = wallNumber(scene, result.id, element.ref?.id ?? \"\");\n      rows.push(\n        row(\n          element,\n          \"walls\",\n          number ? `Wall ${number}` : \"Wall\",\n          beyond(element.boundary, element.facing),\n          scene,\n          types,\n        ),\n      );\n    } else if (element.kind === \"window\" || element.kind === \"door\") {\n      const opening = scene.openings.find(\n        (each) => each.id === element.ref?.id,\n      );\n      const tag = opening ? ` ${openingTag(scene, opening)}` : \"\";\n      rows.push(\n        row(\n          element,\n          \"openings\",\n          `${element.kind === \"window\" ? \"Window\" : \"Door\"}${tag}`,\n          beyond(element.boundary, element.facing),\n          scene,\n          types,\n        ),\n      );\n    } else if (element.kind === \"floor\" || element.kind === \"ground-floor\") {\n      rows.push(\n        row(element, \"floor\", \"Floor\", floorBeyond(element), scene, types),\n      );\n    } else if (element.kind === \"ceiling\" || element.kind === \"roof\") {\n      rows.push(\n        row(\n          element,\n          \"ceiling\",\n          \"Ceiling\",\n          ceilingBeyond(element),\n          scene,\n          types,\n        ),\n      );\n    } else {\n      // A kind the inspector doesn't know still lost heat: show it, so the\n      // rows add up to the room's watts.\n      const kind: string = element.kind;\n      rows.push(\n        row(\n          element,\n          \"other\",\n          element.what || kind,\n          beyond(element.boundary, element.facing),\n          scene,\n          types,\n        ),\n      );\n    }\n  }\n  const place = (each: Row) =>\n    each.group === \"walls\" ? Number(/\\d+/.exec(each.label)?.[0] ?? 99) : 0;\n  rows.sort(\n    (a, b) =>\n      ORDER.indexOf(a.group) - ORDER.indexOf(b.group) || place(a) - place(b),\n  );\n  return {\n    rows,\n    watts: result.designW,\n    wattsPerM2: result.wattsPerM2,\n  };\n}\n\n/** Light up one plan element while its row is hovered; null clears it. Reuses\n * the plan's own hover mark, so it looks as the pointer's does. */\nexport function highlight(\n  svg: Element | null,\n  layer: Row[\"layer\"],\n  id: string,\n): void {\n  if (!svg) {\n    return;\n  }\n  for (const marked of svg.querySelectorAll(\"[data-inspect]\")) {\n    marked.removeAttribute(\"data-inspect\");\n  }\n  if (!layer || !id) {\n    return;\n  }\n  const group = svg.querySelector(\n    `g[data-layer=\"${layer}\"] g[data-id=\"${CSS.escape(id)}\"]`,\n  );\n  group?.setAttribute(\"data-inspect\", \"\");\n}\n", "import type { FloorPlacement } from \"../core\";\nimport { distance, formatLengthM } from \"../geometry\";\nimport type { OverlaySpec } from \"../overlay\";\nimport {\n  type Rigid,\n  IDENTITY,\n  followedBy,\n  isIdentity,\n  matching,\n  normalAngle,\n  rotationAbout,\n  translation,\n} from \"../rigid\";\nimport type { Point, Scene } from \"../scene\";\nimport { type SnapKind, houseAngle, snapPoint } from \"../snap\";\nimport type { Tool, ToolContext } from \"./types\";\n\n/** What the Move floor tool is waiting for, for the panel to say. */\nexport type FloorStage = \"move\" | \"pivot\" | \"from\" | \"to\" | \"from2\" | \"to2\";\n\n/** The editor's side of moving a floor; see EditorCore's move methods. */\nexport interface FloorHost {\n  /** The floor being lined up against, or null when there's none. */\n  reference(): Scene | null;\n  placement(): FloorPlacement;\n  preview(base: FloorPlacement, move: Rigid): void;\n  commit(base: FloorPlacement, move: Rigid): void;\n  cancel(base: FloorPlacement): void;\n  /** What the floor turns about. */\n  pivot(): Point | null;\n  setPivot(point: Point): void;\n  waiting(stage: FloorStage): void;\n}\n\nexport interface FloorTool extends Tool {\n  /** Draw the pivot and turning handle. */\n  show(ctx: ToolContext): void;\n  /** Match a point on this floor to one on the floor below. */\n  match(ctx: ToolContext): void;\n  /** The next click sets the pivot. */\n  pickPivot(ctx: ToolContext): void;\n}\n\n/** Screen pixels from the pivot to the turning handle, and to catch either. */\nconst HANDLE_PX = 70;\nconst CATCH_PX = 10;\n/** Within this of square with the floor below, a turn lands square, degrees. */\nconst SQUARE_DEG = 1.5;\n\ninterface Caught {\n  point: Point;\n  kind: SnapKind;\n}\n\n/** A corner or wall of `scene` near `point`, or the point itself. */\nfunction catchOn(\n  scene: Scene | null,\n  point: Point,\n  tolerance: number,\n  free: boolean,\n): Caught {\n  if (!scene || free) {\n    return { point, kind: \"none\" };\n  }\n  const snapped = snapPoint(point, scene, { tolerance });\n  return snapped.kind === \"endpoint\" || snapped.kind === \"wall\"\n    ? snapped\n    : { point, kind: \"none\" };\n}\n\n/** The turn nearest `degrees` that sets `scene` square with `reference`. */\nfunction squareTurn(\n  degrees: number,\n  scene: Scene,\n  reference: Scene | null,\n): number | null {\n  if (!reference) {\n    return null;\n  }\n  const gap = ((houseAngle(reference) - houseAngle(scene)) * 180) / Math.PI;\n  const square = gap + Math.round((degrees - gap) / 90) * 90;\n  return Math.abs(square - degrees) <= SQUARE_DEG ? square : null;\n}\n\nfunction bearing(from: Point, to: Point): number {\n  return (Math.atan2(to[1] - from[1], to[0] - from[0]) * 180) / Math.PI;\n}\n\n/** The turn a handle dragged from `start`\u00B0 to `point` makes: Shift in 15\u00B0\n * steps, else to a tenth of a degree, landing square with the floor below\n * when near it. */\nfunction turnTo(\n  pivot: Point,\n  start: number,\n  point: Point,\n  steps: boolean,\n  scene: Scene,\n  reference: Scene | null,\n): number {\n  const degrees = normalAngle(bearing(pivot, point) - start);\n  if (steps) {\n    return Math.round(degrees / 15) * 15;\n  }\n  return squareTurn(degrees, scene, reference) ?? Math.round(degrees * 10) / 10;\n}\n\n/** Drag the floor to move it, drag the round handle to turn it about the\n * pivot, or match points with the floor below (AutoCAD's ALIGN). */\nexport function floorTool(host: FloorHost): FloorTool {\n  type Drag =\n    | { kind: \"move\"; base: FloorPlacement; grab: Point; moved: boolean }\n    | { kind: \"turn\"; base: FloorPlacement; pivot: Point; start: number }\n    | { kind: \"pivot\" };\n  let drag: Drag | null = null;\n  let stage: FloorStage = \"move\";\n  /** Matching: the move so far, from where the floor started. */\n  let matchBase: FloorPlacement | null = null;\n  let first: { from: Point; to?: Point } | null = null;\n  let second: Point | null = null;\n\n  const setStage = (next: FloorStage): void => {\n    stage = next;\n    host.waiting(next);\n  };\n\n  const tolerance = (ctx: ToolContext): number =>\n    CATCH_PX * ctx.worldPerPixel();\n\n  const handleOf = (ctx: ToolContext, pivot: Point): Point => [\n    pivot[0] + HANDLE_PX * ctx.worldPerPixel(),\n    pivot[1],\n  ];\n\n  const furniture = (ctx: ToolContext): OverlaySpec[] => {\n    const pivot = host.pivot();\n    if (!pivot || stage !== \"move\") {\n      return [];\n    }\n    return [\n      {\n        kind: \"line\",\n        a: pivot,\n        b: handleOf(ctx, pivot),\n        thickness: 1.5 * ctx.worldPerPixel(),\n      },\n      { kind: \"pivot\", at: pivot },\n      { kind: \"handle\", at: handleOf(ctx, pivot) },\n    ];\n  };\n\n  const matched = (): Rigid => {\n    if (!first?.to) {\n      return IDENTITY;\n    }\n    return matching(first.from, first.to);\n  };\n\n  const endMatch = (ctx: ToolContext, keep: boolean): void => {\n    const base = matchBase;\n    if (base) {\n      const move = matched();\n      if (keep && !isIdentity(move)) {\n        host.commit(base, move);\n      } else {\n        host.cancel(base);\n      }\n    }\n    matchBase = null;\n    first = null;\n    second = null;\n    setStage(\"move\");\n    ctx.preview(furniture(ctx));\n  };\n\n  const tool: FloorTool = {\n    name: \"floor\",\n    hint:\n      \"Drag the floor to move it \u2014 a corner you grab snaps onto the floor\" +\n      \" below. Drag the round handle to turn it (Shift: 15\u00B0 steps). Arrows\" +\n      \" nudge 10 mm (Shift 100 mm); [ and ] turn 1\u00B0 (Shift 0.1\u00B0).\",\n\n    show(ctx) {\n      ctx.preview(furniture(ctx));\n    },\n\n    match(ctx) {\n      tool.cancel(ctx);\n      matchBase = host.placement();\n      setStage(\"from\");\n      ctx.preview([]);\n    },\n\n    pickPivot(ctx) {\n      tool.cancel(ctx);\n      setStage(\"pivot\");\n      ctx.preview([]);\n    },\n\n    down(point, event, ctx) {\n      const free = event.altKey;\n      const tol = tolerance(ctx);\n      if (stage === \"pivot\") {\n        host.setPivot(catchOn(ctx.scene(), point, tol, free).point);\n        setStage(\"move\");\n        ctx.preview(furniture(ctx));\n        return;\n      }\n      if (stage === \"from\" || stage === \"from2\") {\n        const caught = catchOn(ctx.scene(), point, tol, free).point;\n        if (stage === \"from\") {\n          first = { from: caught };\n          setStage(\"to\");\n        } else {\n          second = caught;\n          setStage(\"to2\");\n        }\n        ctx.preview([{ kind: \"marker\", at: caught, snap: \"endpoint\" }]);\n        return;\n      }\n      if (stage === \"to\" || stage === \"to2\") {\n        const caught = catchOn(host.reference(), point, tol, free).point;\n        const base = matchBase;\n        if (!base || !first) {\n          return;\n        }\n        if (stage === \"to\") {\n          first.to = caught;\n          host.preview(base, matched());\n          setStage(\"from2\");\n          ctx.preview([{ kind: \"marker\", at: caught, snap: \"below\" }]);\n          return;\n        }\n        // The second pair turns the floor about the first matched point.\n        const target = first.to;\n        if (second && target) {\n          const turn = normalAngle(\n            bearing(target, caught) - bearing(target, second),\n          );\n          const move = followedBy(matched(), rotationAbout(turn, target));\n          host.commit(base, move);\n        }\n        matchBase = null;\n        first = null;\n        second = null;\n        setStage(\"move\");\n        ctx.preview(furniture(ctx));\n        return;\n      }\n\n      const pivot = host.pivot();\n      if (pivot && distance(point, handleOf(ctx, pivot)) <= tol) {\n        drag = {\n          kind: \"turn\",\n          base: host.placement(),\n          pivot,\n          start: bearing(pivot, point),\n        };\n        return;\n      }\n      if (pivot && distance(point, pivot) <= tol) {\n        drag = { kind: \"pivot\" };\n        return;\n      }\n      drag = {\n        kind: \"move\",\n        base: host.placement(),\n        grab: catchOn(ctx.scene(), point, tol, free).point,\n        moved: false,\n      };\n    },\n\n    move(point, event, ctx) {\n      const tol = tolerance(ctx);\n      const free = event.altKey;\n      if (stage === \"from\" || stage === \"from2\") {\n        const caught = catchOn(ctx.scene(), point, tol, free);\n        ctx.preview([\n          {\n            kind: \"marker\",\n            at: caught.point,\n            snap: caught.kind === \"none\" ? \"none\" : \"endpoint\",\n          },\n        ]);\n        return;\n      }\n      if (stage === \"to\" || stage === \"to2\") {\n        const caught = catchOn(host.reference(), point, tol, free);\n        const specs: OverlaySpec[] = [\n          {\n            kind: \"marker\",\n            at: caught.point,\n            snap: caught.kind === \"none\" ? \"none\" : \"below\",\n          },\n        ];\n        const from = stage === \"to\" ? first?.from : second;\n        if (from) {\n          specs.unshift({\n            kind: \"line\",\n            a: from,\n            b: caught.point,\n            thickness: 1.5 * ctx.worldPerPixel(),\n          });\n        }\n        ctx.preview(specs);\n        return;\n      }\n      if (stage === \"pivot\") {\n        const caught = catchOn(ctx.scene(), point, tol, free);\n        ctx.preview([{ kind: \"pivot\", at: caught.point }]);\n        return;\n      }\n      if (!drag) {\n        ctx.preview(furniture(ctx));\n        return;\n      }\n      if (drag.kind === \"pivot\") {\n        host.setPivot(catchOn(ctx.scene(), point, tol, free).point);\n        ctx.preview(furniture(ctx));\n        return;\n      }\n      if (drag.kind === \"turn\") {\n        const degrees = turnTo(\n          drag.pivot,\n          drag.start,\n          point,\n          event.shiftKey,\n          drag.base.scene,\n          host.reference(),\n        );\n        host.preview(drag.base, rotationAbout(degrees, drag.pivot));\n        ctx.preview([\n          {\n            kind: \"line\",\n            a: drag.pivot,\n            b: point,\n            thickness: 1.5 * ctx.worldPerPixel(),\n          },\n          { kind: \"pivot\", at: drag.pivot },\n          { kind: \"text\", at: point, text: `${Number(degrees.toFixed(1))}\u00B0` },\n        ]);\n        return;\n      }\n      const caught = catchOn(host.reference(), point, tol, free);\n      const shift: Point = [\n        caught.point[0] - drag.grab[0],\n        caught.point[1] - drag.grab[1],\n      ];\n      drag.moved = drag.moved || distance(point, drag.grab) > tol;\n      if (!drag.moved) {\n        return;\n      }\n      host.preview(drag.base, translation(shift[0], shift[1]));\n      ctx.preview([\n        {\n          kind: \"line\",\n          a: drag.grab,\n          b: caught.point,\n          thickness: 1.5 * ctx.worldPerPixel(),\n        },\n        {\n          kind: \"marker\",\n          at: caught.point,\n          snap: caught.kind === \"none\" ? \"none\" : \"below\",\n        },\n        {\n          kind: \"text\",\n          at: caught.point,\n          text: formatLengthM(Math.hypot(...shift)),\n        },\n      ]);\n    },\n\n    up(point, event, ctx) {\n      const current = drag;\n      drag = null;\n      if (!current || current.kind === \"pivot\") {\n        ctx.preview(furniture(ctx));\n        return;\n      }\n      if (current.kind === \"turn\") {\n        const degrees = turnTo(\n          current.pivot,\n          current.start,\n          point,\n          event.shiftKey,\n          current.base.scene,\n          host.reference(),\n        );\n        if (degrees !== 0) {\n          host.commit(current.base, rotationAbout(degrees, current.pivot));\n        } else {\n          host.cancel(current.base);\n        }\n        ctx.preview(furniture(ctx));\n        return;\n      }\n      if (!current.moved) {\n        host.cancel(current.base);\n        ctx.preview(furniture(ctx));\n        return;\n      }\n      const caught = catchOn(\n        host.reference(),\n        point,\n        tolerance(ctx),\n        event.altKey,\n      );\n      const move = translation(\n        caught.point[0] - current.grab[0],\n        caught.point[1] - current.grab[1],\n      );\n      if (isIdentity(move)) {\n        host.cancel(current.base);\n      } else {\n        host.commit(current.base, move);\n      }\n      ctx.preview(furniture(ctx));\n    },\n\n    finish(ctx) {\n      // Enter after the first pair keeps the slide without a turn.\n      if (stage === \"from2\" || stage === \"to2\") {\n        endMatch(ctx, true);\n      } else {\n        tool.cancel(ctx);\n      }\n    },\n\n    cancel(ctx) {\n      if (drag && drag.kind !== \"pivot\") {\n        host.cancel(drag.base);\n      }\n      drag = null;\n      if (matchBase) {\n        endMatch(ctx, false);\n      } else if (stage !== \"move\") {\n        setStage(\"move\");\n      }\n      ctx.preview(furniture(ctx));\n    },\n  };\n  return tool;\n}\n", "// The Move floor panel and the tool behind it: lining a storey up over\n// another by hand, the way Revit shows an underlay and Archicad a ghost\n// story. Holds no Alpine state of its own: it writes to the view it's given.\n\nimport type { EditorCore, FloorPlacement } from \"./core\";\nimport {\n  type Rigid,\n  apply,\n  describe,\n  rotationAbout,\n  translation,\n} from \"./rigid\";\nimport {\n  type Bounds,\n  type Floor,\n  type Point,\n  type Scene,\n  floorBounds,\n} from \"./scene\";\nimport { fits, misfit } from \"./stacking\";\nimport { type FloorStage, type FloorTool, floorTool } from \"./tools/floor\";\nimport type { ToolContext, ToolName } from \"./tools/types\";\n\nconst UNDERLAY_KEY = \"design:underlay\";\n\n/** Nudges and turns closer together than this are one move, ms. */\nconst RUN_MS = 2000;\n\nexport interface FitView {\n  label: string;\n  detail: string;\n}\n\nexport interface AlignView {\n  /** The floor lined up against is drawn under this one. */\n  underlay: boolean;\n  /** Its id; null lines up with the floor below, and the lowest with none. */\n  target: number | null;\n  /** The floors there are to line up with, and the one in use. */\n  targets: { id: number; name: string }[];\n  targetName: string;\n  floorName: string;\n  stage: FloorStage;\n  /** Typed degrees to turn by. */\n  angle: string;\n  pivotSet: boolean;\n  /** How far off it sits now, in words; empty without a floor to compare. */\n  readout: string;\n  fits: FitView[];\n  searching: boolean;\n  /** Said once a search has run: what it found, or that nothing fits. */\n  searched: string;\n}\n\nexport function alignView(): AlignView {\n  let underlay = true;\n  try {\n    underlay = window.localStorage.getItem(UNDERLAY_KEY) !== \"off\";\n  } catch {\n    // Storage can be blocked; the floor below shows.\n  }\n  return {\n    underlay,\n    target: null,\n    targets: [],\n    targetName: \"\",\n    floorName: \"\",\n    stage: \"move\",\n    angle: \"\",\n    pivotSet: false,\n    readout: \"\",\n    fits: [],\n    searching: false,\n    searched: \"\",\n  };\n}\n\nexport interface AlignDeps {\n  view(): AlignView;\n  core(): EditorCore | null;\n  setGhost(scene: Scene | null, strong: boolean): void;\n  /** Send trace edits still waiting, so none lands after the move. */\n  beforeMove(): void;\n  tool(): ToolName;\n  setTool(name: ToolName): void;\n  ctx(): ToolContext;\n}\n\nexport interface FloorAligner {\n  tool: FloorTool;\n  /** The floor shown under this one, to snap to while drawing. */\n  underlayScene(): Scene | null;\n  /** This floor and the one it lines up against, to fit the view to. */\n  extent(): Bounds | null;\n  /** Re-read the floors: after switching floor or tool, or any edit. */\n  refresh(): void;\n  toggleUnderlay(): void;\n  setTarget(id: number | null): void;\n  turn(degrees: number): void;\n  turnTyped(): void;\n  nudge(dx: number, dy: number): void;\n  match(): void;\n  pickPivot(): void;\n  resetPivot(): void;\n  findFits(): void;\n  previewFit(index: number): void;\n  endPreview(): void;\n  useFit(index: number): void;\n}\n\nfunction label(floor: Floor): string {\n  return floor.name || `Level ${floor.level}`;\n}\n\nfunction centre(floor: Floor): Point | null {\n  const bounds = floorBounds({ ...floor, annotations: [] });\n  return bounds\n    ? [\n        Math.round((bounds.minX + bounds.maxX) / 2),\n        Math.round((bounds.minY + bounds.maxY) / 2),\n      ]\n    : null;\n}\n\nfunction readoutOf(floor: Floor, reference: Floor | null): string {\n  const off = reference ? misfit(reference.scene, floor.scene) : null;\n  if (!off || !reference) {\n    return \"\";\n  }\n  const corners = `Its outside corners sit ${Math.round(off.corners)} mm off ${label(reference)}'s walls on average`;\n  return off.overhang >= 0.1\n    ? `${corners}; ${off.overhang.toFixed(1)} m\u00B2 is over nothing.`\n    : `${corners}.`;\n}\n\nexport function floorAligner(deps: AlignDeps): FloorAligner {\n  /** Pivot, set by hand; null is the floor's middle. */\n  let pivot: Point | null = null;\n  let pivotFloor: number | null = null;\n  let found: Rigid[] = [];\n  let foundFor = \"\";\n\n  const floors = (): Floor[] => deps.core()?.floors() ?? [];\n\n  const reference = (): Floor | null => {\n    const core = deps.core();\n    if (!core) {\n      return null;\n    }\n    const all = floors();\n    const view = deps.view();\n    const chosen = all.find(\n      (floor) => floor.id === view.target && floor !== core.floor(),\n    );\n    if (chosen) {\n      return chosen;\n    }\n    return all[all.indexOf(core.floor()) - 1] ?? null;\n  };\n\n  /** Which floors the fits are for, and where both stood: fits are moves\n   * from there, so any change to either makes them wrong. */\n  const signature = (): string => {\n    const core = deps.core();\n    const other = reference();\n    // A fit pointed at moves the floor, but not where its fits start from.\n    const scene = core?.previewBase()?.scene ?? core?.floor().scene;\n    return JSON.stringify([\n      core?.floor().id,\n      other?.id,\n      scene?.vertices,\n      other?.scene.vertices,\n    ]);\n  };\n\n  const commit = (base: FloorPlacement, move: Rigid): void => {\n    const core = deps.core();\n    if (!core) {\n      return;\n    }\n    deps.beforeMove();\n    core.commitMove(base, move);\n    if (pivot) {\n      pivot = apply(move, pivot);\n    }\n    found = [];\n    deps.view().fits = [];\n    deps.view().searched = \"\";\n    aligner.refresh();\n    // The pivot and handle follow the floor, whatever moved it.\n    if (deps.tool() === \"floor\") {\n      tool.show(deps.ctx());\n    }\n  };\n\n  const host = {\n    reference: () => reference()?.scene ?? null,\n    placement: (): FloorPlacement => {\n      const core = deps.core();\n      if (!core) {\n        throw new Error(\"Editor not started.\");\n      }\n      return core.placement();\n    },\n    preview: (base: FloorPlacement, move: Rigid) => {\n      deps.core()?.previewMove(base, move);\n      readout();\n    },\n    commit,\n    cancel: (base: FloorPlacement) => {\n      deps.core()?.cancelMove(base);\n      readout();\n    },\n    pivot: (): Point | null => {\n      const floor = deps.core()?.floor();\n      if (!floor) {\n        return null;\n      }\n      return pivot && pivotFloor === floor.id ? pivot : centre(floor);\n    },\n    setPivot: (point: Point) => {\n      pivot = point;\n      pivotFloor = deps.core()?.floor().id ?? null;\n      deps.view().pivotSet = true;\n    },\n    waiting: (stage: FloorStage) => {\n      deps.view().stage = stage;\n    },\n  };\n\n  /** Only for Move floor's panel: it measures both floors. */\n  const readout = (): void => {\n    const floor = deps.core()?.floor();\n    deps.view().readout =\n      floor && deps.tool() === \"floor\" ? readoutOf(floor, reference()) : \"\";\n  };\n\n  const tool = floorTool(host);\n\n  /** When the last nudge or turn was, to run the next on from it. */\n  let lastStep = Number.NEGATIVE_INFINITY;\n\n  const moveBy = (move: Rigid): void => {\n    const core = deps.core();\n    if (!core) {\n      return;\n    }\n    const now = Date.now();\n    const running = now - lastStep < RUN_MS;\n    lastStep = now;\n    if (running && core.continueMove(move)) {\n      if (pivot) {\n        pivot = apply(move, pivot);\n      }\n      aligner.refresh();\n      if (deps.tool() === \"floor\") {\n        tool.show(deps.ctx());\n      }\n      return;\n    }\n    commit(host.placement(), move);\n  };\n\n  const aligner: FloorAligner = {\n    tool,\n\n    underlayScene() {\n      return deps.view().underlay ? (reference()?.scene ?? null) : null;\n    },\n\n    extent() {\n      const floor = deps.core()?.floor();\n      const other = reference();\n      const boxes = [floor, other]\n        .map((each) => (each ? floorBounds(each) : null))\n        .filter((box): box is Bounds => box !== null);\n      if (boxes.length === 0) {\n        return null;\n      }\n      return {\n        minX: Math.min(...boxes.map((box) => box.minX)),\n        minY: Math.min(...boxes.map((box) => box.minY)),\n        maxX: Math.max(...boxes.map((box) => box.maxX)),\n        maxY: Math.max(...boxes.map((box) => box.maxY)),\n      };\n    },\n\n    refresh() {\n      const core = deps.core();\n      const view = deps.view();\n      if (!core) {\n        return;\n      }\n      const floor = core.floor();\n      if (pivotFloor !== floor.id) {\n        pivot = null;\n        view.pivotSet = false;\n      }\n      const other = reference();\n      view.floorName = label(floor);\n      view.targets = floors()\n        .filter((each) => each !== floor)\n        .map((each) => ({ id: each.id, name: label(each) }));\n      view.targetName = other ? label(other) : \"\";\n      if (found.length > 0 && foundFor !== signature()) {\n        found = [];\n        view.fits = [];\n        view.searched = \"\";\n      }\n      readout();\n      const moving = deps.tool() === \"floor\";\n      deps.setGhost(\n        view.underlay || moving ? (other?.scene ?? null) : null,\n        moving,\n      );\n    },\n\n    toggleUnderlay() {\n      const view = deps.view();\n      view.underlay = !view.underlay;\n      try {\n        window.localStorage.setItem(UNDERLAY_KEY, view.underlay ? \"on\" : \"off\");\n      } catch {\n        // Not remembered, then.\n      }\n      aligner.refresh();\n    },\n\n    setTarget(id) {\n      deps.view().target = id;\n      aligner.refresh();\n    },\n\n    turn(degrees) {\n      const about = host.pivot();\n      if (about && degrees !== 0) {\n        moveBy(rotationAbout(degrees, about));\n      }\n    },\n\n    turnTyped() {\n      const degrees = Number(deps.view().angle);\n      if (Number.isFinite(degrees) && degrees !== 0) {\n        aligner.turn(degrees);\n        deps.view().angle = \"\";\n      }\n    },\n\n    nudge(dx, dy) {\n      moveBy(translation(dx, dy));\n    },\n\n    match() {\n      if (deps.tool() !== \"floor\") {\n        deps.setTool(\"floor\");\n      }\n      tool.match(deps.ctx());\n    },\n\n    pickPivot() {\n      if (deps.tool() !== \"floor\") {\n        deps.setTool(\"floor\");\n      }\n      tool.pickPivot(deps.ctx());\n    },\n\n    resetPivot() {\n      pivot = null;\n      deps.view().pivotSet = false;\n      tool.show(deps.ctx());\n    },\n\n    findFits() {\n      const core = deps.core();\n      const other = reference();\n      const view = deps.view();\n      if (!core || !other) {\n        return;\n      }\n      view.searching = true;\n      view.searched = \"\";\n      // A beat for the panel to say it's looking before the search blocks.\n      setTimeout(() => {\n        const floor = core.floor();\n        const result = fits(other.scene, floor.scene);\n        const middle = centre(floor) ?? [0, 0];\n        found = result.map((fit) => fit.move);\n        foundFor = signature();\n        view.fits = result.map((fit) => {\n          const off = misfit(other.scene, {\n            ...floor.scene,\n            vertices: floor.scene.vertices.map((vertex) => ({\n              ...vertex,\n              at: apply(fit.move, vertex.at),\n            })),\n          });\n          const words = describe(fit.move, middle);\n          return {\n            label: words.charAt(0).toUpperCase() + words.slice(1),\n            detail: `corners ${Math.round(fit.score)} mm off${\n              off && off.overhang >= 0.1\n                ? `, ${off.overhang.toFixed(1)} m\u00B2 over nothing`\n                : \"\"\n            }`,\n          };\n        });\n        view.searching = false;\n        view.searched =\n          result.length === 0\n            ? `${label(floor)} has no outline to fit, or ${label(other)} hasn't.`\n            : result.every((fit) => fit.score > 200)\n              ? `Nothing fits ${label(other)} well; these come closest.`\n              : \"\";\n      }, 30);\n    },\n\n    previewFit(index) {\n      const move = found[index];\n      const core = deps.core();\n      if (!move || !core || foundFor !== signature()) {\n        return;\n      }\n      core.previewMove(core.previewBase() ?? core.placement(), move);\n      readout();\n    },\n\n    endPreview() {\n      const core = deps.core();\n      if (core?.previewBase()) {\n        core.endPreview();\n        readout();\n      }\n    },\n\n    useFit(index) {\n      const move = found[index];\n      const core = deps.core();\n      if (!move || !core || foundFor !== signature()) {\n        return;\n      }\n      commit(core.previewBase() ?? core.placement(), move);\n    },\n  };\n  return aligner;\n}\n", "import { Measure } from \"./scene\";\n\n// The server sends the measure vocabulary as {kind, name, img, figure} from\n// MEASURE_CHOICES. Categories, colours and default annotation geometry are a\n// presentation concern, derived here by keyword.\n\nexport type MeasureCategory =\n  | \"fabric\"\n  | \"heating\"\n  | \"cooling\"\n  | \"ventilation\"\n  | \"renewables\"\n  | \"other\";\n\nexport type AnnotationMode = \"point\" | \"line\" | \"area\";\n\nexport const CATEGORY_COLORS: Record<MeasureCategory, string> = {\n  fabric: \"#d97706\", // amber-600\n  heating: \"#dc2626\", // red-600\n  cooling: \"#2563eb\", // blue-600\n  ventilation: \"#0891b2\", // cyan-600\n  renewables: \"#16a34a\", // green-600\n  other: \"#7c3aed\", // violet-600\n};\n\n/** What a scenario treats, on the plan and in 3D: its fabric measures' colour. */\nexport const TREATED_COLOR = CATEGORY_COLORS.fabric;\n\nexport const CATEGORY_LABELS: Record<MeasureCategory, string> = {\n  fabric: \"Fabric\",\n  heating: \"Heating & hot water\",\n  cooling: \"Cooling\",\n  ventilation: \"Ventilation\",\n  renewables: \"Renewables\",\n  other: \"Other\",\n};\n\nexport const CATEGORY_ORDER: MeasureCategory[] = [\n  \"fabric\",\n  \"heating\",\n  \"cooling\",\n  \"ventilation\",\n  \"renewables\",\n  \"other\",\n];\n\nfunction matches(kind: string, ...terms: string[]): boolean {\n  return terms.some((term) => kind.includes(term));\n}\n\nexport function categoryOf(kind: string): MeasureCategory {\n  if (matches(kind, \"VENTILATION\", \"VENTS\", \"DUCT\", \"UNDERCUTS\", \"HATCHES\")) {\n    return \"ventilation\";\n  }\n  if (matches(kind, \"SOLAR\", \"PV\", \"BATTERY\", \"WIND\")) {\n    return \"renewables\";\n  }\n  if (matches(kind, \"AIR_CONDITIONING\")) {\n    return \"cooling\";\n  }\n  if (\n    matches(\n      kind,\n      \"HEAT_PUMP\",\n      \"HEATING\",\n      \"HOT_WATER\",\n      \"BIOMASS\",\n      \"MAIN_SYSTEM\",\n      \"DISTRIBUTION\",\n    )\n  ) {\n    return \"heating\";\n  }\n  if (\n    matches(\n      kind,\n      \"INSULATION\",\n      \"GLAZING\",\n      \"WINDOWS\",\n      \"DOORS\",\n      \"DRAUGHT\",\n      \"CAVITY_WALL\",\n    )\n  ) {\n    return \"fabric\";\n  }\n  return \"other\";\n}\n\n/** The natural way to draw a measure on a plan: wall treatments follow\n * walls, roof/floor blankets cover areas, equipment sits at a point. */\nexport function defaultModeOf(kind: string): AnnotationMode {\n  if (matches(kind, \"WALL_INSULATION\", \"CAVITY_WALL\")) {\n    return \"line\";\n  }\n  if (\n    matches(kind, \"ROOF\", \"LOFT\", \"FLOOR_INSULATION\", \"SOLAR_PV\", \"OVERHEATING\")\n  ) {\n    return \"area\";\n  }\n  return \"point\";\n}\n\nexport interface PaletteEntry {\n  kind: string;\n  name: string;\n  img: string | null;\n  figure: string | null;\n  category: MeasureCategory;\n  color: string;\n  mode: AnnotationMode;\n}\n\nexport interface PaletteGroup {\n  category: MeasureCategory;\n  label: string;\n  entries: PaletteEntry[];\n}\n\nexport function paletteEntries(measures: Measure[]): PaletteEntry[] {\n  return measures.map((measure) => {\n    const category = categoryOf(measure.kind);\n    return {\n      kind: measure.kind,\n      name: measure.name,\n      img: measure.img,\n      figure: measure.figure,\n      category,\n      color: CATEGORY_COLORS[category],\n      mode: defaultModeOf(measure.kind),\n    };\n  });\n}\n\n/** Palette groups filtered by a search query, empty groups dropped. */\nexport function paletteGroups(\n  entries: PaletteEntry[],\n  query: string,\n): PaletteGroup[] {\n  const needle = query.trim().toLowerCase();\n  const groups: PaletteGroup[] = [];\n  for (const category of CATEGORY_ORDER) {\n    const matching = entries.filter(\n      (entry) =>\n        entry.category === category &&\n        (needle === \"\" || entry.name.toLowerCase().includes(needle)),\n    );\n    if (matching.length > 0) {\n      groups.push({\n        category,\n        label: CATEGORY_LABELS[category],\n        entries: matching,\n      });\n    }\n  }\n  return groups;\n}\n", "// Where a measure goes on the plan: along the walls it treats, over the rooms it\n// covers, on the windows or doors it replaces, or beside the house for kit.\n\nimport { polygonArea, polygonCentroid } from \"./geometry\";\nimport { pointAlong } from \"./openings\";\nimport { resolve } from \"./resolve\";\nimport type { AnnotationGeometry, FabricType, Point, Scene } from \"./scene\";\nimport { polygonOf, wallEnds } from \"./topology\";\n\n/** How far outside the house a piece of kit is drawn, in mm. */\nconst OUTSIDE_MM = 1500;\n\n/** Kit along the same wall is spaced this far apart, in mm. */\nconst KIT_SPACING_MM = 1200;\n\nexport interface Placement {\n  /** Index into the design's floors, in level order. */\n  floor: number;\n  geometry: AnnotationGeometry;\n}\n\n/** The chosen walls joined end to end: open runs first, then closed loops. */\nexport function chains(scene: Scene, wallIds: ReadonlySet<string>): Point[][] {\n  const at = new Map(scene.vertices.map((vertex) => [vertex.id, vertex.at]));\n  const edges = scene.walls.filter((wall) => wallIds.has(wall.id));\n  const incident = new Map<string, string[]>();\n  for (const wall of edges) {\n    for (const vertex of [wall.a, wall.b]) {\n      incident.set(vertex, [...(incident.get(vertex) ?? []), wall.id]);\n    }\n  }\n  const byId = new Map(edges.map((wall) => [wall.id, wall]));\n  const used = new Set<string>();\n\n  const walk = (start: string, first: string): string[] => {\n    const path = [start];\n    let vertex = start;\n    let edge: string | undefined = first;\n    while (edge && !used.has(edge)) {\n      used.add(edge);\n      const wall = byId.get(edge);\n      if (!wall) {\n        break;\n      }\n      vertex = wall.a === vertex ? wall.b : wall.a;\n      path.push(vertex);\n      if ((incident.get(vertex) ?? []).length !== 2) {\n        break;\n      }\n      edge = (incident.get(vertex) ?? []).find((next) => !used.has(next));\n    }\n    return path;\n  };\n\n  const paths: string[][] = [];\n  for (const [vertex, walls] of incident) {\n    if (walls.length === 2) {\n      continue;\n    }\n    for (const wall of walls) {\n      if (!used.has(wall)) {\n        paths.push(walk(vertex, wall));\n      }\n    }\n  }\n  for (const wall of edges) {\n    if (!used.has(wall.id)) {\n      paths.push(walk(wall.a, wall.id));\n    }\n  }\n  return paths.map((path) =>\n    path\n      .map((vertex) => at.get(vertex))\n      .filter((point): point is Point => !!point),\n  );\n}\n\n/** The plan's outline, or its heated rooms where the outline won't close. */\nexport function outline(scene: Scene, types: readonly FabricType[]): Point[][] {\n  const view = resolve(scene, types);\n  const envelope = new Set(\n    view.walls.filter((wall) => wall.inEnvelope).map((wall) => wall.id),\n  );\n  const loops = chains(scene, envelope);\n  const closed = loops.every(\n    (loop) =>\n      loop.length > 3 &&\n      loop[0]?.[0] === loop.at(-1)?.[0] &&\n      loop[0]?.[1] === loop.at(-1)?.[1],\n  );\n  if (loops.length > 0 && closed) {\n    return loops\n      .map((loop) => loop.slice(0, -1))\n      .filter((loop) => polygonArea(loop) > 0);\n  }\n  return scene.rooms\n    .filter((room) => room.heated !== false)\n    .map((room) => polygonOf(scene, room));\n}\n\n/** A point beside the house: out from the middle of its longest outside wall. */\nexport function besideHouse(\n  scene: Scene,\n  types: readonly FabricType[],\n  slot = 0,\n): Point | null {\n  const view = resolve(scene, types);\n  const outside = view.walls\n    .filter((wall) => wall.inEnvelope && wall.kind === \"EXTERNAL\")\n    .sort((left, right) => right.lengthMm - left.lengthMm)[0];\n  if (!outside) {\n    return null;\n  }\n  const room = view.rooms.find((candidate) =>\n    outside.rooms.includes(candidate.id),\n  );\n  const length = outside.lengthMm || 1;\n  const along = Math.min(\n    length / 2 + (slot - 1) * KIT_SPACING_MM,\n    length - KIT_SPACING_MM / 2,\n  );\n  const [x, y] = pointAlong(outside.a, outside.b, Math.max(along, 0));\n  // The normal away from the room the wall belongs to.\n  let nx = -(outside.b[1] - outside.a[1]) / length;\n  let ny = (outside.b[0] - outside.a[0]) / length;\n  if (room) {\n    const [cx, cy] = polygonCentroid([...room.polygon]);\n    if ((cx - x) * nx + (cy - y) * ny > 0) {\n      nx = -nx;\n      ny = -ny;\n    }\n  }\n  return [Math.round(x + nx * OUTSIDE_MM), Math.round(y + ny * OUTSIDE_MM)];\n}\n\nfunction openingPoints(\n  scene: Scene,\n  types: readonly FabricType[],\n  type: \"window\" | \"door\",\n): Point[] {\n  const view = resolve(scene, types);\n  const points: Point[] = [];\n  for (const wall of view.walls) {\n    if (!wall.inEnvelope || wall.kind === \"PARTY\") {\n      continue;\n    }\n    for (const opening of view.openingsByWall.get(wall.id) ?? []) {\n      if (opening.type === type) {\n        const [x, y] = pointAlong(\n          wall.a,\n          wall.b,\n          opening.offset + opening.width / 2,\n        );\n        points.push([Math.round(x), Math.round(y)]);\n      }\n    }\n  }\n  return points;\n}\n\nfunction areas(polygons: Point[][]): AnnotationGeometry[] {\n  return polygons\n    .filter((polygon) => polygon.length >= 3)\n    .map((polygon) => ({ type: \"area\", polygon }));\n}\n\nconst ON_THE_HOUSE = new Set([\n  \"roof\",\n  \"ground-floor\",\n  \"windows\",\n  \"doors\",\n  \"solar\",\n]);\n\n/** Whether a group's option is kit, drawn beside the house in its own slot. */\nexport function besideTheHouse(group: string): boolean {\n  return !group.startsWith(\"wall:\") && !ON_THE_HOUSE.has(group);\n}\n\n/** Where a scenario group's option is drawn, floor by floor (lowest first). */\nexport function placements(\n  group: string,\n  scenes: readonly Scene[],\n  types: readonly FabricType[],\n  slot = 0,\n): Placement[] {\n  const top = scenes.length - 1;\n  const found: Placement[] = [];\n  const add = (floor: number, geometries: AnnotationGeometry[]) => {\n    for (const geometry of geometries) {\n      found.push({ floor, geometry });\n    }\n  };\n\n  if (group.startsWith(\"wall:\")) {\n    scenes.forEach((scene, floor) => {\n      const view = resolve(scene, types);\n      const mine = new Set(\n        view.walls\n          .filter(\n            (wall) =>\n              wall.inEnvelope && wall.kind === \"EXTERNAL\" && wall.key === group,\n          )\n          .map((wall) => wall.id),\n      );\n      add(\n        floor,\n        chains(scene, mine)\n          .filter((points) => points.length >= 2)\n          .map((points) => ({ type: \"line\", points })),\n      );\n    });\n  } else if (group === \"roof\" && scenes[top]) {\n    add(top, areas(outline(scenes[top], types)));\n  } else if (group === \"ground-floor\" && scenes[0]) {\n    add(0, areas(outline(scenes[0], types)));\n  } else if (group === \"windows\" || group === \"doors\") {\n    const type = group === \"windows\" ? \"window\" : \"door\";\n    scenes.forEach((scene, floor) => {\n      add(\n        floor,\n        openingPoints(scene, types, type).map((at) => ({ type: \"point\", at })),\n      );\n    });\n  } else if (group === \"solar\" && scenes[top]) {\n    const roof = outline(scenes[top], types)[0];\n    if (roof) {\n      add(top, [{ type: \"point\", at: roundPoint(polygonCentroid(roof)) }]);\n    }\n  } else if (scenes[0]) {\n    const at = besideHouse(scenes[0], types, slot);\n    if (at) {\n      add(0, [{ type: \"point\", at }]);\n    }\n  }\n  return found;\n}\n\n/**\n * Where an option is drawn when its scenario points it at some elements\n * (`<floor pk>:<id>`s, as `targets` holds them): its walls joined into runs,\n * its rooms as areas and its windows and doors as points. Ids the plan has\n * lost are skipped.\n */\nexport function targetPlacements(\n  targets: readonly string[],\n  floors: readonly { id: number; scene: Scene }[],\n): Placement[] {\n  const found: Placement[] = [];\n  floors.forEach(({ id, scene }, floor) => {\n    const prefix = `${id}:`;\n    const mine = new Set(\n      targets\n        .filter((target) => target.startsWith(prefix))\n        .map((target) => target.slice(prefix.length)),\n    );\n    if (mine.size === 0) {\n      return;\n    }\n    const walls = new Set(\n      scene.walls.filter((wall) => mine.has(wall.id)).map((wall) => wall.id),\n    );\n    for (const points of chains(scene, walls)) {\n      if (points.length >= 2) {\n        found.push({ floor, geometry: { type: \"line\", points } });\n      }\n    }\n    for (const room of scene.rooms) {\n      const geometry = mine.has(room.id) ? overRoom(scene, room.id) : null;\n      if (geometry) {\n        found.push({ floor, geometry });\n      }\n    }\n    for (const opening of scene.openings) {\n      const geometry = mine.has(opening.id)\n        ? atOpening(scene, opening.id)\n        : null;\n      if (geometry) {\n        found.push({ floor, geometry });\n      }\n    }\n  });\n  return found;\n}\n\nfunction roundPoint([x, y]: Point): Point {\n  return [Math.round(x), Math.round(y)];\n}\n\n/** A measure drawn along one wall. */\nexport function alongWall(\n  scene: Scene,\n  wallId: string,\n): AnnotationGeometry | null {\n  const wall = scene.walls.find((candidate) => candidate.id === wallId);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  return ends ? { type: \"line\", points: [ends[0], ends[1]] } : null;\n}\n\n/** A measure covering one room. */\nexport function overRoom(\n  scene: Scene,\n  roomId: string,\n): AnnotationGeometry | null {\n  const room = scene.rooms.find((candidate) => candidate.id === roomId);\n  const polygon = room ? polygonOf(scene, room) : [];\n  return polygon.length >= 3 ? { type: \"area\", polygon } : null;\n}\n\n/** A measure on one door or window. */\nexport function atOpening(\n  scene: Scene,\n  openingId: string,\n): AnnotationGeometry | null {\n  const opening = scene.openings.find(\n    (candidate) => candidate.id === openingId,\n  );\n  const wall =\n    opening && scene.walls.find((candidate) => candidate.id === opening.wall);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!opening || !ends) {\n    return null;\n  }\n  return {\n    type: \"point\",\n    at: roundPoint(\n      pointAlong(ends[0], ends[1], opening.offset + opening.width / 2),\n    ),\n  };\n}\n", "import { projectOnSegment } from \"../geometry\";\nimport type { Point, Scene, Wall } from \"../scene\";\nimport { roomsOn, wallEnds } from \"../topology\";\nimport type { Tool, ToolContext } from \"./types\";\n\n/** What the brush puts on a wall. */\nexport type Brush =\n  | { kind: \"fabric\"; id: number }\n  | { kind: \"party\"; on: boolean };\n\n/** How near a wall the pointer must pass, in screen pixels past its face. */\nconst REACH_PX = 8;\n\n/** The wall nearest `point`, if the pointer is on or beside it. */\nexport function wallAt(\n  scene: Scene,\n  point: Point,\n  worldPerPixel: number,\n): Wall | undefined {\n  let best: Wall | undefined;\n  let bestDistance = Infinity;\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    const projection = projectOnSegment(point, ends[0], ends[1]);\n    const reach = wall.thickness / 2 + REACH_PX * worldPerPixel;\n    if (projection.distance <= reach && projection.distance < bestDistance) {\n      best = wall;\n      bestDistance = projection.distance;\n    }\n  }\n  return best;\n}\n\n/** A party wall has a room on one side only, as the server insists. */\nexport function canBeParty(scene: Scene, wall: Wall): boolean {\n  return roomsOn(scene, wall.id).length === 1;\n}\n\n/** Whether the brush changes this wall. */\nexport function paint(scene: Scene, wall: Wall, brush: Brush): boolean {\n  if (brush.kind === \"fabric\") {\n    if (wall.fabric === brush.id) {\n      return false;\n    }\n    wall.fabric = brush.id;\n    return true;\n  }\n  if (wall.party === brush.on || (brush.on && !canBeParty(scene, wall))) {\n    return false;\n  }\n  wall.party = brush.on;\n  return true;\n}\n\n/** Click or drag across walls to give them a fabric type, or mark party walls. */\nexport function brushTool(brush: () => Brush | null): Tool {\n  let painting = false;\n  const done = new Set<string>();\n\n  const stroke = (point: Point, ctx: ToolContext) => {\n    const chosen = brush();\n    const wall = chosen\n      ? wallAt(ctx.scene(), point, ctx.worldPerPixel())\n      : undefined;\n    if (!chosen || !wall || done.has(wall.id)) {\n      return;\n    }\n    done.add(wall.id);\n    ctx.mutateLive((scene) => {\n      const target = scene.walls.find((candidate) => candidate.id === wall.id);\n      if (target) {\n        paint(scene, target, chosen);\n      }\n    });\n  };\n\n  return {\n    name: \"brush\",\n    hint:\n      \"Pick a wall type or party wall in the panel, then click or drag across\" +\n      \" walls to paint it on.\",\n\n    down(point, _event, ctx) {\n      if (!brush()) {\n        return;\n      }\n      painting = true;\n      done.clear();\n      ctx.beginGesture();\n      stroke(point, ctx);\n    },\n\n    move(point, _event, ctx) {\n      const wall = wallAt(ctx.scene(), point, ctx.worldPerPixel());\n      const ends = wall ? wallEnds(ctx.scene(), wall) : null;\n      ctx.preview(\n        ends\n          ? [\n              {\n                kind: \"line\",\n                a: ends[0],\n                b: ends[1],\n                thickness: wall?.thickness ?? 0,\n              },\n            ]\n          : [],\n      );\n      if (painting) {\n        stroke(point, ctx);\n      }\n    },\n\n    up(_point, _event, ctx) {\n      if (painting) {\n        painting = false;\n        ctx.endGesture();\n      }\n    },\n\n    cancel(ctx) {\n      if (painting) {\n        painting = false;\n        ctx.cancelGesture();\n      }\n      ctx.preview([]);\n    },\n  };\n}\n", "// Where a measure dropped from the catalogue lands: the wall, room, window or\n// door under the pointer, or with Shift every one like it on the floor.\n\nimport { defaultModeOf } from \"./catalog\";\nimport { distance } from \"./geometry\";\nimport type { OverlaySpec } from \"./overlay\";\nimport { pointAlong } from \"./openings\";\nimport { alongWall, atOpening, chains, outline, overRoom } from \"./placement\";\nimport { resolve } from \"./resolve\";\nimport type { AnnotationGeometry, FabricType, Point, Scene } from \"./scene\";\nimport { wallAt } from \"./tools/brush\";\nimport { polygonOf } from \"./topology\";\n\nconst WINDOW_KINDS = new Set([\n  \"WINDOWS\",\n  \"SECONDARY_GLAZING\",\n  \"FENESTRATION_DRAUGHT_PROOFING\",\n  \"TRICKLE_VENTS\",\n]);\n\nconst DOOR_KINDS = new Set([\n  \"SINGLE_DOORS\",\n  \"BIFOLD_AND_ARCHITECTURAL_DOORS\",\n  \"PATIO_DOORS\",\n  \"DOOR_UNDERCUTS\",\n]);\n\n/** How far from a window or door a drop still means it, mm. */\nconst OPENING_REACH_MM = 1200;\n\ntype Target = \"wall\" | \"room\" | \"window\" | \"door\" | \"point\";\n\nexport function targetOf(kind: string): Target {\n  if (WINDOW_KINDS.has(kind)) {\n    return \"window\";\n  }\n  if (DOOR_KINDS.has(kind)) {\n    return \"door\";\n  }\n  const mode = defaultModeOf(kind);\n  return mode === \"line\" ? \"wall\" : mode === \"area\" ? \"room\" : \"point\";\n}\n\nfunction inside(point: Point, polygon: readonly Point[]): boolean {\n  let within = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const a = polygon[i] as Point;\n    const b = polygon[j] as Point;\n    if (\n      a[1] > point[1] !== b[1] > point[1] &&\n      point[0] < ((b[0] - a[0]) * (point[1] - a[1])) / (b[1] - a[1]) + a[0]\n    ) {\n      within = !within;\n    }\n  }\n  return within;\n}\n\nfunction openings(\n  scene: Scene,\n  types: readonly FabricType[],\n  type: \"window\" | \"door\",\n): { id: string; at: Point }[] {\n  const view = resolve(scene, types);\n  return view.walls\n    .filter((wall) => wall.inEnvelope && wall.kind !== \"PARTY\")\n    .flatMap((wall) =>\n      (view.openingsByWall.get(wall.id) ?? [])\n        .filter((opening) => opening.type === type)\n        .map((opening) => ({\n          id: opening.id,\n          at: pointAlong(wall.a, wall.b, opening.offset + opening.width / 2),\n        })),\n    );\n}\n\n/** The annotations a drop of `kind` at `point` makes; `all` for every one like it. */\nexport function dropped(\n  scene: Scene,\n  types: readonly FabricType[],\n  kind: string,\n  point: Point,\n  worldPerPixel: number,\n  all: boolean,\n): AnnotationGeometry[] {\n  const target = targetOf(kind);\n\n  if (target === \"wall\") {\n    const wall = wallAt(scene, point, worldPerPixel);\n    if (!all) {\n      const geometry = wall ? alongWall(scene, wall.id) : null;\n      return geometry ? [geometry] : [];\n    }\n    const view = resolve(scene, types);\n    const key = wall ? view.wall(wall.id)?.key : undefined;\n    const same = view.walls.filter(\n      (each) =>\n        each.inEnvelope &&\n        each.kind === \"EXTERNAL\" &&\n        (key === undefined || each.key === key),\n    );\n    return chains(scene, new Set(same.map((each) => each.id)))\n      .filter((points) => points.length >= 2)\n      .map((points) => ({ type: \"line\", points }));\n  }\n\n  if (target === \"room\") {\n    if (all) {\n      return outline(scene, types)\n        .filter((polygon) => polygon.length >= 3)\n        .map((polygon) => ({ type: \"area\", polygon }));\n    }\n    const room = scene.rooms.find((candidate) =>\n      inside(point, polygonOf(scene, candidate)),\n    );\n    const geometry = room ? overRoom(scene, room.id) : null;\n    return geometry ? [geometry] : [];\n  }\n\n  if (target === \"window\" || target === \"door\") {\n    const found = openings(scene, types, target);\n    if (all) {\n      return found.map((each) => ({\n        type: \"point\",\n        at: [Math.round(each.at[0]), Math.round(each.at[1])],\n      }));\n    }\n    const nearest = found.sort(\n      (left, right) => distance(left.at, point) - distance(right.at, point),\n    )[0];\n    if (nearest && distance(nearest.at, point) <= OPENING_REACH_MM) {\n      const geometry = atOpening(scene, nearest.id);\n      return geometry ? [geometry] : [];\n    }\n    return [];\n  }\n\n  return [{ type: \"point\", at: [Math.round(point[0]), Math.round(point[1])] }];\n}\n\n/** The drop's footprint, for the preview while dragging. */\nexport function dropPreview(geometries: AnnotationGeometry[]): OverlaySpec[] {\n  return geometries.flatMap((geometry): OverlaySpec[] => {\n    if (geometry.type === \"point\") {\n      return [{ kind: \"marker\", at: geometry.at, snap: \"endpoint\" }];\n    }\n    const points =\n      geometry.type === \"line\"\n        ? geometry.points\n        : [...geometry.polygon, geometry.polygon[0] as Point];\n    return points.slice(1).map((b, index) => ({\n      kind: \"line\",\n      a: points[index] as Point,\n      b,\n      thickness: 250,\n    }));\n  });\n}\n", "// A package's figures for the Build Pack (apps/projects/BUILDPACK.md,\n// \"Contracts\"): the house today, after each phase in turn, what each measure\n// adds with the rest of its phase in, and the drawings. Phase i applies the\n// options of every kind in phases 1..i, scored by the same engines as the\n// scenarios step.\n\nimport type { HeatPumpFigures } from \"./heatpump/report\";\nimport { pvGeneration } from \"../calc/rating\";\nimport { billLines, TARIFF_NAME } from \"../calc/tariffs\";\nimport type { WorksheetResults } from \"../calc/worksheet\";\nimport type { Drawings } from \"./drawings\";\nimport type { Patch } from \"./heatloss\";\nimport type { OverheatingFigures } from \"./partofigures\";\nimport {\n  type Choice,\n  type Explorer,\n  type Outcome,\n  type Run,\n  type ScenarioOption,\n  band,\n  scheduleCost,\n  sharesOf,\n} from \"./scenarios\";\nimport type { ScheduleRow } from \"./scene\";\nimport type { Today } from \"./today\";\n\nexport const FIGURES_VERSION = 2;\n\nexport interface Phase {\n  name: string;\n  kinds: string[];\n  /** What the write-up page set on the phase; carried through unchanged. */\n  description?: string;\n  timing?: { rel: string; ref: string };\n  enabling?: Record<string, unknown>[];\n}\n\n/** A copy of `phase`, every key it has kept. */\nexport function copyPhase(phase: Phase): Phase {\n  return {\n    ...phase,\n    kinds: [...phase.kinds],\n    ...(phase.timing ? { timing: { ...phase.timing } } : {}),\n    ...(phase.enabling\n      ? { enabling: phase.enabling.map((work) => ({ ...work })) }\n      : {}),\n  };\n}\n\nexport interface RoomLoad {\n  name: string;\n  floor: string;\n  /** \u00B0C, the room's design temperature. */\n  temp_c: number;\n  watts: number;\n  area_m2: number;\n}\n\n/** The heat load's design day and where it came from. */\nexport interface Conditions {\n  outside_c: number;\n  zone: number | null;\n  percentile: string;\n  indoor: string;\n}\n\nexport interface Performance {\n  /** m\u00B2, heated; on the baseline only. */\n  floor_area_m2?: number;\n  sap: number;\n  band: string;\n  /** \u00A3 a year. */\n  bills: number;\n  /** kg CO\u2082e a year. */\n  carbon: number;\n  /** Design heat load, kW. */\n  peak: number;\n  /** W/K. */\n  heat_loss: number;\n  fabric: { name: string; value: number }[];\n  rooms?: RoomLoad[];\n  end_use: { name: string; kwh: number }[];\n  /** `cost` is \u00A3 a year. */\n  fuels: { name: string; kwh: number; cost: number }[];\n  overheating?: OverheatingFigures;\n}\n\nexport interface Delta {\n  sap: number;\n  bills: number;\n  carbon: number;\n  peak: number;\n}\n\nexport interface MeasureFigures {\n  /** Index into `phases`. */\n  phase: number;\n  /** Pence, or null without a price. */\n  cost: number | null;\n  quantity: { area_m2?: number; length_m?: number; count?: number };\n  delta: Delta | null;\n  /** A grant towards it, when the editor counts grants: never off `cost`. */\n  grant: Grant | null;\n}\n\nexport interface Grant {\n  name: string;\n  /** Pence. */\n  amount: number;\n}\n\nexport interface Figures {\n  version: number;\n  letter?: string;\n  sap: number;\n  /** Pence: the options alone, net of grants when the editor counts them. */\n  cost: number | null;\n  /**\n   * Pence: the phases' costs added up, gross and schedule first whatever the\n   * grants toggle, so packages compare on one basis; null if any is unpriced.\n   */\n  gross_cost: number | null;\n  bills: number;\n  carbon: number;\n  peak: number;\n  conditions?: Conditions;\n  /**\n   * The SCOP a heat pump is scored at, the prices the bills are at, and the\n   * flow temperature the emitters are sized for (\u00B0C), with a room-by-room load.\n   */\n  assumptions: { scop: number; tariff: string; flow_c?: number };\n  /** The array the package installs: kWp, and kWh a year it generates. */\n  solar?: { kwp: number; kwh: number };\n  /** The heat pump the package places: its model, where it goes, the noise result. */\n  heat_pump?: HeatPumpFigures;\n  baseline: Performance;\n  /**\n   * The house as it is, when the package is kept in a proposal: the pack's\n   * \"today\", where `baseline` is the proposal before any measure.\n   */\n  today?: Today;\n  /** Pence of grants, each a line of its own under the gross costs. */\n  grant: number;\n  phases: (Phase & {\n    cost: number | null;\n    /** Pence of its measures' grants. */\n    grant: number;\n    after: Performance;\n  })[];\n  measures: Record<string, MeasureFigures>;\n  drawings?: Drawings;\n}\n\nexport interface FiguresInput {\n  explorer: Explorer;\n  /** The package's option ids. */\n  options: readonly string[];\n  phases: readonly Phase[];\n  schedule: readonly ScheduleRow[];\n  /** The room-by-room load with patches in, or null without one. */\n  rooms: (patches: readonly Patch[]) => RoomLoad[] | null;\n  /** Part O with patches in, or null when it can't be assessed. */\n  overheating?: (patches: readonly Patch[]) => OverheatingFigures | null;\n  letter?: string;\n  /** Null without a room-by-room load. */\n  conditions?: Conditions | null;\n  /** \u00B0C: the emitters' flow temperature, with a room-by-room load. */\n  flow_c?: number | null;\n  drawings?: Drawings;\n}\n\nfunction round(value: number, digits = 0): number {\n  const factor = 10 ** digits;\n  return Math.round(value * factor) / factor;\n}\n\nfunction total(values: readonly number[]): number {\n  return values.reduce((sum, value) => sum + value, 0);\n}\n\n/** The package's options' kinds, in the explorer's group order, once each. */\nexport function packagedKinds(\n  explorer: Explorer,\n  options: readonly string[],\n): string[] {\n  const wanted = new Set(options);\n  const kinds: string[] = [];\n  for (const group of explorer.groups) {\n    for (const option of group.options) {\n      if (\n        wanted.has(option.id) &&\n        option.kind &&\n        !kinds.includes(option.kind)\n      ) {\n        kinds.push(option.kind);\n      }\n    }\n  }\n  return kinds;\n}\n\n/** The stored phases, or one unnamed phase holding every kind. */\nexport function phasesOf(\n  phases: readonly Phase[],\n  kinds: readonly string[],\n): Phase[] {\n  if (phases.length === 0) {\n    return [{ name: \"\", kinds: [...kinds] }];\n  }\n  return phases.map(copyPhase);\n}\n\n/** The package's options of `kinds`, as a choice over the explorer's groups. */\nfunction choiceFor(\n  explorer: Explorer,\n  options: ReadonlySet<string>,\n  kinds: ReadonlySet<string>,\n): Choice {\n  return explorer.groups.map((group) =>\n    group.options.findIndex(\n      (option) => options.has(option.id) && kinds.has(option.kind),\n    ),\n  );\n}\n\n// Grouped as apps/projects/serializers.py's get_chart_data groups the\n// Python engine's rows, for the customer's building fabric donut.\nexport function fabricOf(rows: WorksheetResults): Performance[\"fabric\"] {\n  const ventilation = rows.ventilation_heat_loss_38;\n  const groups: [string, number][] = [\n    [\n      \"Walls\",\n      rows.external_wall_fabric_heat_loss_29a +\n        rows.basement_wall_fabric_heat_loss_29,\n    ],\n    [\"Roof\", rows.roof_fabric_heat_loss_30],\n    [\n      \"Floor\",\n      rows.ground_floor_fabric_heat_loss_28a +\n        rows.exposed_floor_fabric_heat_loss_28b +\n        rows.basement_floor_fabric_heat_loss_28,\n    ],\n    [\n      \"Windows\",\n      rows.window_fabric_heat_loss_27 + rows.roof_window_fabric_heat_loss_27a,\n    ],\n    [\n      \"Doors\",\n      rows.solid_door_fabric_heat_loss_26 +\n        rows.semi_glazed_door_fabric_heat_loss_26a,\n    ],\n    [\"Party Walls\", rows.party_wall_fabric_heat_loss_32],\n    [\"Vents and Draughts\", total(ventilation) / (ventilation.length || 1)],\n  ];\n  return groups\n    .map(([name, value]) => ({ name, value: round(value, 1) }))\n    .filter((group) => group.value !== 0);\n}\n\n/** Heat pumps' kWh at the design's SCOP, as everything else is scored. */\nexport function endUseOf(run: Run): Performance[\"end_use\"] {\n  const { rows } = run;\n  const { main, water } = sharesOf(run);\n  const uses: [string, number][] = [\n    [\n      \"Space heating\",\n      rows.first_main_heat_system_fuel_211_sum * main +\n        total(rows.second_main_heat_system_fuel_213) +\n        total(rows.secondary_heat_system_fuel_215),\n    ],\n    [\"Hot water\", rows.water_heater_fuel_219_sum * water],\n    [\"Lighting\", rows.electricity_for_lighting_232],\n    [\"Pumps and fans\", rows.total_electricity_231],\n    [\"Cooling\", total(rows.space_cooling_fuel_221)],\n  ];\n  return uses\n    .map(([name, kwh]) => ({ name, kwh: round(kwh) }))\n    .filter((use) => use.kwh !== 0);\n}\n\nexport function fuelName(code: string): string {\n  if (/TARIFF|ELECTRICITY/.test(code)) {\n    return \"Electricity\";\n  }\n  if (code === \"MAINS_GAS\") {\n    return \"Mains gas\";\n  }\n  if (code.includes(\"LPG\")) {\n    return \"LPG\";\n  }\n  if (code === \"HEATING_OIL\") {\n    return \"Oil\";\n  }\n  const words = code.toLowerCase().replaceAll(\"_\", \" \");\n  return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * kWh and \u00A3 a year by fuel at today's prices, standing charges and PV's\n * offset included, so the costs add up to the bills (calc/tariffs.ts).\n */\nexport function fuelsOf(run: Run): Performance[\"fuels\"] {\n  const { input, rows } = run;\n  const { main, water } = sharesOf(run);\n  const fuels = new Map<string, { kwh: number; cost: number }>();\n  for (const line of billLines(\n    input,\n    rows,\n    main,\n    water,\n    rows.furbnow_pv_used,\n  )) {\n    const name = fuelName(line.fuel);\n    const entry = fuels.get(name) ?? { kwh: 0, cost: 0 };\n    entry.kwh += line.kwh;\n    entry.cost += line.pounds;\n    fuels.set(name, entry);\n  }\n  return [...fuels]\n    .map(([name, entry]) => ({\n      name,\n      kwh: round(entry.kwh),\n      cost: round(entry.cost),\n    }))\n    .filter((fuel) => fuel.kwh !== 0 || fuel.cost !== 0);\n}\n\nexport function performanceOf(\n  explorer: Explorer,\n  choice: Choice,\n  outcome: Outcome,\n  input: Pick<FiguresInput, \"rooms\" | \"overheating\">,\n): Performance {\n  const patches = explorer.patches(choice);\n  const run = explorer.run(choice);\n  const loads = input.rooms(patches);\n  // Only reglazing changes what Part O looks at, so other phases match the baseline.\n  const overheating = input.overheating?.(patches) ?? null;\n  return {\n    // Unrounded, so the pack rounds it once, as the design tool does.\n    sap: outcome.sap,\n    band: band(outcome.sap),\n    bills: round(outcome.bills),\n    carbon: round(outcome.carbon),\n    peak: round(outcome.peak, 2),\n    heat_loss: round(outcome.heatLoss, 1),\n    fabric: fabricOf(run.rows),\n    ...(loads ? { rooms: loads } : {}),\n    end_use: endUseOf(run),\n    fuels: fuelsOf(run),\n    ...(overheating ? { overheating } : {}),\n  };\n}\n\nfunction quantityOf(\n  explorer: Explorer,\n  row: ScheduleRow | undefined,\n  options: readonly ScenarioOption[],\n): MeasureFigures[\"quantity\"] {\n  // Marks an option drew are the option's: its own quantity, as its cost.\n  if (row && row.count > 0 && (row.by_hand ?? row.count) > 0) {\n    return {\n      ...(row.area_m2 ? { area_m2: Number(row.area_m2) } : {}),\n      ...(row.length_m ? { length_m: Number(row.length_m) } : {}),\n      count: row.count,\n    };\n  }\n  // Nothing drawn: what the option is priced by on the plan.\n  const quantity: MeasureFigures[\"quantity\"] = {};\n  for (const option of options) {\n    const basis = option.cost.basis;\n    const amount = explorer.amountOf(option);\n    if (basis === \"windows\" || basis === \"doors\") {\n      quantity.count = (quantity.count ?? 0) + amount;\n    } else if (basis !== \"fixed\" && amount > 0) {\n      quantity.area_m2 = round((quantity.area_m2 ?? 0) + amount, 1);\n    }\n  }\n  return quantity;\n}\n\n/**\n * Pence: the schedule's override, else its estimate from what's drawn, else\n * the options' prices before grants (as \"Put this package on the plan\" files\n * them), else null.\n */\nfunction costOf(\n  explorer: Explorer,\n  row: ScheduleRow | undefined,\n  options: readonly ScenarioOption[],\n): number | null {\n  const scheduled = row ? scheduleCost(row) : null;\n  if (scheduled !== null) {\n    return scheduled;\n  }\n  if (options.length === 0) {\n    return null;\n  }\n  let sum = 0;\n  for (const option of options) {\n    const cost = explorer.ownCostOf(option);\n    if (cost === null) {\n      return null;\n    }\n    sum += cost;\n  }\n  return sum;\n}\n\nfunction solarOf({ input, rows }: Run): Figures[\"solar\"] | null {\n  if (input.pv_peak_power <= 0) {\n    return null;\n  }\n  return {\n    kwp: round(input.pv_peak_power, 2),\n    kwh: round(pvGeneration(input, rows)),\n  };\n}\n\nfunction deltaOf(after: Outcome, without: Outcome): Delta {\n  return {\n    sap: after.sap - without.sap,\n    bills: round(after.bills) - round(without.bills),\n    carbon: round(after.carbon - without.carbon),\n    peak: round(after.peak - without.peak, 2),\n  };\n}\n\nexport function figuresOf(input: FiguresInput): Figures {\n  const { explorer } = input;\n  const options = new Set(input.options);\n  const packaged = packagedKinds(explorer, input.options);\n  const phases = phasesOf(input.phases, packaged);\n  const rows = new Map(input.schedule.map((row) => [row.kind, row]));\n  const optionsOf = (kind: string) =>\n    explorer.groups.flatMap((group) =>\n      group.options.filter(\n        (option) => options.has(option.id) && option.kind === kind,\n      ),\n    );\n\n  const none = explorer.groups.map(() => -1);\n  const baseline: Performance = {\n    floor_area_m2: round(explorer.rows(none).total_floor_area_4, 1),\n    ...performanceOf(explorer, none, explorer.evaluate(none), input),\n  };\n\n  const measures: Record<string, MeasureFigures> = {};\n  const done = new Set<string>();\n  const phased = phases.map((phase, index) => {\n    for (const kind of phase.kinds) {\n      done.add(kind);\n    }\n    const choice = choiceFor(explorer, options, done);\n    const after = explorer.evaluate(choice);\n    let cost: number | null = 0;\n    let grant = 0;\n    for (const kind of phase.kinds) {\n      const mine = optionsOf(kind);\n      const row = rows.get(kind);\n      const measureCost = costOf(explorer, row, mine);\n      let delta: Delta | null = null;\n      if (mine.length > 0) {\n        const others = new Set([...done].filter((other) => other !== kind));\n        delta = deltaOf(\n          after,\n          explorer.evaluate(choiceFor(explorer, options, others)),\n        );\n      }\n      const grants = mine.flatMap((option) => {\n        const amount = explorer.grantOf(option);\n        return option.grant && amount > 0\n          ? [{ name: option.grant.name, amount }]\n          : [];\n      });\n      const measureGrant = grants.length\n        ? {\n            name: grants[0]?.name ?? \"\",\n            amount: grants.reduce((sum, g) => sum + g.amount, 0),\n          }\n        : null;\n      grant += measureGrant?.amount ?? 0;\n      measures[kind] = {\n        phase: index,\n        cost: measureCost,\n        quantity: quantityOf(explorer, row, mine),\n        delta,\n        grant: measureGrant,\n      };\n      cost = cost === null || measureCost === null ? null : cost + measureCost;\n    }\n    return {\n      name: phase.name,\n      kinds: phase.kinds,\n      cost,\n      grant,\n      after: performanceOf(explorer, choice, after, input),\n    };\n  });\n\n  const wholeChoice = choiceFor(explorer, options, new Set(packaged));\n  const whole = explorer.evaluate(wholeChoice);\n  const solar = packaged.includes(\"SOLAR_PV\")\n    ? solarOf(explorer.run(wholeChoice))\n    : null;\n  return {\n    version: FIGURES_VERSION,\n    ...(input.letter ? { letter: input.letter } : {}),\n    // Bills are priced at this; SAP stays on RdSAP's Table 32.\n    assumptions: {\n      scop: explorer.run(none).input.heat_pump_scop,\n      tariff: TARIFF_NAME,\n      ...(input.flow_c ? { flow_c: input.flow_c } : {}),\n    },\n    sap: whole.sap,\n    cost: whole.cost,\n    gross_cost: phased.reduce<number | null>(\n      (sum, phase) =>\n        sum === null || phase.cost === null ? null : sum + phase.cost,\n      0,\n    ),\n    grant: phased.reduce((sum, phase) => sum + phase.grant, 0),\n    bills: round(whole.bills, 2),\n    carbon: round(whole.carbon, 1),\n    peak: round(whole.peak, 2),\n    ...(input.conditions ? { conditions: input.conditions } : {}),\n    ...(solar ? { solar } : {}),\n    baseline,\n    phases: phased,\n    measures,\n    ...(input.drawings ? { drawings: input.drawings } : {}),\n  };\n}\n", "// The server renders the worksheet input with quantities as \"60.0 m ** 2\" and\n// decimals as strings. goldens.ts and design/heatloss.ts both parse it here, so\n// the live editor's path is exercised by the whole golden corpus.\n\nimport { FURBNOW_HEAT_PUMP_SCOP } from \"./rating\";\nimport { area, length, uValue } from \"./units\";\nimport type { BuildingElement, WorksheetInput } from \"./worksheet\";\n\nconst QUANTITY = /^(-?\\d+(?:\\.\\d+)?(?:[eE][-+]?\\d+)?) (.+)$/;\n\n/** \"1 / h\" of \"0.95 1 / h\", or \"\" when it has no unit. */\nexport function unitOf(value: unknown): string {\n  if (typeof value !== \"string\") {\n    return \"\";\n  }\n\n  return QUANTITY.exec(value)?.[2] ?? \"\";\n}\n\nexport function magnitude(value: unknown): number {\n  if (typeof value === \"number\") {\n    return value;\n  }\n\n  if (typeof value === \"string\") {\n    const number = Number(QUANTITY.exec(value)?.[1] ?? value);\n    if (!Number.isNaN(number)) {\n      return number;\n    }\n  }\n\n  throw new Error(`Not a number: ${JSON.stringify(value)}`);\n}\n\nfunction list<T>(value: unknown, as: (magnitude: number) => T): T[] {\n  if (!Array.isArray(value)) {\n    throw new Error(`Not a list: ${JSON.stringify(value)}`);\n  }\n\n  return value.map((item) => as(magnitude(item)));\n}\n\nfunction text(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction element(value: unknown): BuildingElement {\n  if (typeof value !== \"object\" || value === null) {\n    throw new Error(`Not a building element: ${JSON.stringify(value)}`);\n  }\n\n  const raw = value as Record<string, unknown>;\n  const openings = raw[\"openings\"];\n  const u = raw[\"uvalue\"];\n  const proofed = raw[\"draught_proofed\"];\n\n  return {\n    tag: String(raw[\"tag\"]),\n    area: area(magnitude(raw[\"area\"])),\n    uvalue: u === undefined ? undefined : uValue(magnitude(u)),\n    openings: openings === undefined ? undefined : area(magnitude(openings)),\n    construction: text(raw[\"construction\"]),\n    age: text(raw[\"age\"]),\n    glazing: text(raw[\"glazing\"]),\n    frame: text(raw[\"frame\"]),\n    shading: text(raw[\"shading\"]),\n    orientation: text(raw[\"orientation\"]),\n    draught_proofed: typeof proofed === \"boolean\" ? proofed : undefined,\n  };\n}\n\nfunction count(value: unknown): number {\n  return typeof value === \"number\" ? value : Number(value);\n}\n\nexport function worksheetInputFrom(\n  given: Record<string, unknown>,\n): WorksheetInput {\n  const optional = (value: unknown) =>\n    value === null || value === undefined ? null : magnitude(value);\n\n  return {\n    postcode: String(given[\"postcode\"]),\n    building_elements: (given[\"building_elements\"] as unknown[]).map(element),\n\n    floor_area_1: list(given[\"floor_area_1\"], area),\n    floor_height_2: list(given[\"floor_height_2\"], length),\n\n    open_chimneys: count(given[\"open_chimneys\"]),\n    open_flues: count(given[\"open_flues\"]),\n    fire_flues: count(given[\"fire_flues\"]),\n    boiler_flues: count(given[\"boiler_flues\"]),\n    other_flues: count(given[\"other_flues\"]),\n    blocked_chimneys: count(given[\"blocked_chimneys\"]),\n    fans: count(given[\"fans\"]),\n    vents: count(given[\"vents\"]),\n    gas_fires: count(given[\"gas_fires\"]),\n    ventilation_system: String(given[\"ventilation_system\"]),\n    has_draught_lobby: given[\"has_draught_lobby\"] === true,\n    air_permeability_value_ap50_17: optional(\n      given[\"air_permeability_value_ap50_17\"],\n    ),\n    air_permeability_value_ap4_17a: optional(\n      given[\"air_permeability_value_ap4_17a\"],\n    ),\n    storeys_9: count(given[\"storeys_9\"]),\n    sheltered_sides_19: count(given[\"sheltered_sides_19\"]),\n\n    hot_water_supply: String(given[\"hot_water_supply\"]),\n    number_of_baths: count(given[\"number_of_baths\"]),\n    number_of_showers: count(given[\"number_of_showers\"]),\n    water_storage_volume_47: magnitude(given[\"water_storage_volume_47\"]),\n    cylinder_insulation: String(given[\"cylinder_insulation\"]),\n    cylinder_insulation_thickness: optional(\n      given[\"cylinder_insulation_thickness\"],\n    ),\n    cylinder_thermostat: given[\"cylinder_thermostat\"] === true,\n    water_heater_system: String(given[\"water_heater_system\"]),\n    water_heater_fuel: String(given[\"water_heater_fuel\"]),\n\n    thermal_mass_parameter_35: magnitude(given[\"thermal_mass_parameter_35\"]),\n    first_main_heat_system: String(given[\"first_main_heat_system\"]),\n    heating_control_type: count(given[\"heating_control_type\"]),\n    living_area: area(magnitude(given[\"living_area\"])),\n\n    has_secondary_heating: given[\"has_secondary_heating\"] === true,\n    second_main_heat_system: String(given[\"second_main_heat_system\"]),\n    secondary_heat_system: String(given[\"secondary_heat_system\"]),\n    air_conditioner_efficiency: String(given[\"air_conditioner_efficiency\"]),\n    first_main_heat_system_fuel: String(given[\"first_main_heat_system_fuel\"]),\n    second_main_heat_system_fuel: String(given[\"second_main_heat_system_fuel\"]),\n    secondary_heat_system_fuel: String(given[\"secondary_heat_system_fuel\"]),\n    space_cooling_fuel: String(given[\"space_cooling_fuel\"]),\n    lighting_fuel: String(given[\"lighting_fuel\"]),\n    pv_peak_power: magnitude(given[\"pv_peak_power\"]),\n    pv_overshading: String(given[\"pv_overshading\"]),\n    pv_orientation: magnitude(given[\"pv_orientation\"]),\n    pv_pitch: magnitude(given[\"pv_pitch\"]),\n    battery_capacity: magnitude(given[\"battery_capacity\"]),\n    heat_pump_scop:\n      given[\"heat_pump_scop\"] === undefined\n        ? FURBNOW_HEAT_PUMP_SCOP\n        : magnitude(given[\"heat_pump_scop\"]),\n  };\n}\n", "// The live heat-loss figure. U-values come from the server's calc context,\n// because deriving them needs RdSAP's construction tables, which aren't ported;\n// only the geometry is rebuilt here. So a fabric spec change needs a refetch.\n\nimport { worksheetInputFrom } from \"../calc/inputs\";\nimport {\n  type BuildingElement,\n  type WorksheetInput,\n  type WorksheetResults,\n  worksheet,\n} from \"../calc/worksheet\";\nimport {\n  type Bridged,\n  type FabricType,\n  type Part,\n  type Scene,\n  buildElements,\n  storeyHeightMm,\n} from \"./bridge\";\nimport { volumeHeightMm } from \"./ceiling\";\nimport { resolve as resolveScene } from \"./resolve\";\n\n/** What `/design/designs/<pk>/calc-context/` returns. */\nexport interface CalcContext {\n  worksheet: Record<string, unknown>;\n  /** Keyed as the bridge keys elements. */\n  elements: Record<string, Record<string, unknown>>;\n  keys: string[];\n  summary: Record<string, unknown>;\n  /** The design's north, which windows are keyed by the way they face from. */\n  north_deg?: number | null;\n  /** The design's heat pump SCOP, for scoring options; RdSAP assumes 1.7. */\n  heat_pump_scop?: number;\n  /** A proposed scene's own heat pump, scored at the SCOP as a package's is. */\n  installs_heat_pump?: boolean;\n  /** Whether an EPC's RdSAP is behind the figures, or stated assumptions. */\n  baseline?: { source: \"rdsap\" | \"assumed\"; assumptions: Assumption[] };\n}\n\nexport interface Assumption {\n  key: string;\n  label: string;\n  value: string;\n  why: string;\n}\n\nexport interface HeatLoss {\n  /** W/K, in January. */\n  heatTransferCoefficient: number;\n  /** W/m\u00B2K, in January. */\n  heatLossParameter: number;\n  /** W/K, thermal bridging included. */\n  fabricHeatLoss: number;\n  /** kWh/year. */\n  spaceHeating: number;\n  sapRating: number;\n  rows: WorksheetResults;\n}\n\n/** Replacement derived elements by key, and replacement raw worksheet fields. */\nexport interface Patch {\n  elements: Record<string, Record<string, unknown>>;\n  fields: Record<string, unknown>;\n  /**\n   * The scene entities (`Part` ids) the elements apply to; absent is all of\n   * them. An element only partly targeted splits in two by area.\n   */\n  targets?: ReadonlySet<string>;\n  /** With targets: the share, 0 to 1, of each element's key they cover. */\n  shares?: Readonly<Record<string, number>>;\n  /** With targets: each key's net area, mm\u00B2, to weigh its share by. */\n  areas?: Readonly<Record<string, number>>;\n}\n\n/** How much of an element a patch's targets cover. */\nexport type Coverage = \"all\" | \"none\" | Part[];\n\n/** The targeted parts of an element, or whether it's all or none of it. */\nexport function coverage(\n  parts: readonly Part[],\n  targets: ReadonlySet<string> | undefined,\n): Coverage {\n  if (targets === undefined) {\n    return \"all\";\n  }\n  const chosen = parts.filter((part) => targets.has(part.id));\n  if (chosen.length === 0) {\n    return \"none\";\n  }\n  return chosen.length === parts.length ? \"all\" : chosen;\n}\n\nconst MM_PER_M = 1000;\nconst MM2_PER_M2 = 1_000_000;\n\n/** `element`'s area and openings as just `parts` of it. */\nfunction share(\n  element: Record<string, unknown>,\n  parts: readonly Part[],\n): Record<string, unknown> {\n  const sum = (field: \"areaMm2\" | \"openingsMm2\") =>\n    (\n      parts.reduce((total, part) => total + part[field], 0) / MM2_PER_M2\n    ).toFixed(2);\n  return {\n    ...element,\n    area: sum(\"areaMm2\"),\n    ...(\"openings\" in element ? { openings: sum(\"openingsMm2\") } : {}),\n  };\n}\nconst JANUARY = 0;\n\nexport class HeatLossError extends Error {}\n\n/** The derived element for a key with the live geometry's areas swapped in. */\nfunction withGeometry(\n  derived: Record<string, unknown>,\n  fresh: Record<string, unknown>,\n): Record<string, unknown> {\n  const swapped: Record<string, unknown> = { ...derived };\n\n  // Doors have no area field: RdSAP assigns a standard one.\n  for (const field of [\"area\", \"openings\"]) {\n    if (field in derived && fresh[field] !== undefined) {\n      swapped[field] = fresh[field];\n    }\n  }\n\n  return swapped;\n}\n\n/** The design's geometry bridged once, so many patches can be scored cheaply. */\nexport class Prepared {\n  readonly bridged: Bridged;\n  private readonly raw: Record<string, unknown>;\n  private readonly base: WorksheetInput;\n  private readonly fieldCache = new WeakMap<object, Partial<WorksheetInput>>();\n  private readonly elementCache = new WeakMap<object, BuildingElement[]>();\n\n  constructor(\n    readonly context: CalcContext,\n    scenes: readonly Scene[],\n    ceilingHeightsMm: readonly number[],\n    types: readonly FabricType[],\n    /** Each scene's floor pk, which qualifies the bridge's `Part` ids. */\n    floors: readonly (number | string)[] = [],\n  ) {\n    this.bridged = buildElements(\n      scenes,\n      ceilingHeightsMm,\n      types,\n      [],\n      context.north_deg ?? null,\n      floors,\n    );\n    this.raw = {\n      ...context.worksheet,\n      building_elements: this.elementsFor({}),\n      floor_area_1: this.bridged.summary[\"floor_areas_m2\"],\n      // The same area-weighted height the wall areas were built from.\n      floor_height_2: scenes.map((scene, index) =>\n        (\n          storeyHeightMm(\n            resolveScene(scene, types)\n              .rooms.filter((room) => room.heated)\n              .map((room) => ({\n                polygon: room.polygon as [number, number][],\n                ceiling_height: volumeHeightMm(room),\n              })),\n            ceilingHeightsMm[index] ?? 0,\n          ) / MM_PER_M\n        ).toFixed(2),\n      ),\n      storeys_9: scenes.length,\n      ...(context.heat_pump_scop === undefined\n        ? {}\n        : { heat_pump_scop: context.heat_pump_scop }),\n    };\n    this.base = worksheetInputFrom(this.raw);\n  }\n\n  /** The server's raw input with the geometry-derived fields rebuilt. */\n  rawInput(): Record<string, unknown> {\n    return this.raw;\n  }\n\n  private elementsFor(\n    overrides: Record<string, Record<string, unknown>>,\n  ): Record<string, unknown>[] {\n    return this.bridged.keys.map((key, index) => {\n      const derived = overrides[key] ?? this.context.elements[key];\n      if (derived === undefined) {\n        throw new HeatLossError(\n          `No derived element for ${key}; refetch first.`,\n        );\n      }\n      return withGeometry(derived, this.bridged.elements[index] ?? {});\n    });\n  }\n\n  /** Typed field overrides for one patch, parsed once per patch object. */\n  private fieldsOf(patch: Patch): Partial<WorksheetInput> {\n    const cached = this.fieldCache.get(patch);\n    if (cached) {\n      return cached;\n    }\n    const names = Object.keys(patch.fields);\n    const typed: Partial<WorksheetInput> = {};\n    if (names.length > 0) {\n      const parsed = worksheetInputFrom({ ...this.raw, ...patch.fields });\n      for (const name of names) {\n        if (name in parsed) {\n          Object.assign(typed, {\n            [name]: parsed[name as keyof WorksheetInput],\n          });\n        }\n      }\n    }\n    this.fieldCache.set(patch, typed);\n    return typed;\n  }\n\n  /**\n   * Each element as the patch leaves it, parsed once per patch object. Where\n   * targets cover only part of an element, its place keeps the rest as it was\n   * and the targeted part, patched, comes after every element.\n   */\n  private elementsOf(patch: Patch): BuildingElement[] {\n    const cached = this.elementCache.get(patch);\n    if (cached) {\n      return cached;\n    }\n    const base = this.elementsFor({});\n    const patched = this.elementsFor(patch.elements);\n    const split: Record<string, unknown>[] = [];\n    const elements = this.bridged.keys.map((key, index) => {\n      const before = base[index] ?? {};\n      if (!(key in patch.elements)) {\n        return before;\n      }\n      const after = patched[index] ?? {};\n      const covered = coverage(this.bridged.parts[index] ?? [], patch.targets);\n      if (covered === \"all\" || covered === \"none\") {\n        return covered === \"all\" ? after : before;\n      }\n      const rest = (this.bridged.parts[index] ?? []).filter(\n        (part) => !covered.includes(part),\n      );\n      split.push(share(after, covered));\n      return share(before, rest);\n    });\n    const parsed = worksheetInputFrom({\n      ...this.raw,\n      building_elements: [...elements, ...split],\n    }).building_elements as BuildingElement[];\n    this.elementCache.set(patch, parsed);\n    return parsed;\n  }\n\n  /** The worksheet input with every patch laid over it, in order. */\n  input(patches: readonly Patch[] = []): WorksheetInput {\n    if (patches.length === 0) {\n      return this.base;\n    }\n    let elements: BuildingElement[] | null = null;\n    let input: WorksheetInput = this.base;\n    for (const patch of patches) {\n      const keys = Object.keys(patch.elements);\n      if (keys.length > 0) {\n        const mine = this.elementsOf(patch);\n        const next: BuildingElement[] = elements ?? [\n          ...this.base.building_elements,\n        ];\n        this.bridged.keys.forEach((key, index) => {\n          if (key in patch.elements) {\n            next[index] = mine[index] as BuildingElement;\n          }\n        });\n        next.push(...mine.slice(this.bridged.keys.length));\n        elements = next;\n      }\n      const fields = this.fieldsOf(patch);\n      if (Object.keys(fields).length > 0) {\n        input = { ...input, ...fields };\n      }\n    }\n    return elements ? { ...input, building_elements: elements } : input;\n  }\n\n  /** The derived elements by key with the patches applied, for room losses. */\n  derived(patches: readonly Patch[] = []): CalcContext[\"elements\"] {\n    const elements = { ...this.context.elements };\n    for (const patch of patches) {\n      Object.assign(elements, patch.elements);\n    }\n    return elements;\n  }\n\n  run(patches: readonly Patch[] = []): WorksheetResults {\n    return worksheet(this.input(patches));\n  }\n}\n\n/** The server's worksheet input with the geometry-derived fields rebuilt from the scenes. */\nexport function inputFor(\n  context: CalcContext,\n  scenes: readonly Scene[],\n  ceilingHeightsMm: readonly number[],\n  types: readonly FabricType[],\n): Record<string, unknown> {\n  return new Prepared(context, scenes, ceilingHeightsMm, types).rawInput();\n}\n\nexport function summarise(rows: WorksheetResults, corrected = false): HeatLoss {\n  return {\n    heatTransferCoefficient: rows.heat_transfer_coefficient_39[JANUARY],\n    heatLossParameter: rows.heat_loss_parameter_40[JANUARY],\n    fabricHeatLoss: rows.total_fabric_heat_loss_37,\n    spaceHeating: rows.space_heating_98c.reduce(\n      (total, month) => total + month,\n      0,\n    ),\n    sapRating: corrected\n      ? rows.furbnow_corrected_sap_rating\n      : rows.sap_rating_258,\n    rows,\n  };\n}\n\nexport function heatLoss(\n  context: CalcContext,\n  scenes: readonly Scene[],\n  ceilingHeightsMm: readonly number[],\n  types: readonly FabricType[],\n): HeatLoss {\n  return summarise(\n    new Prepared(context, scenes, ceilingHeightsMm, types).run(),\n    context.installs_heat_pump === true,\n  );\n}\n", "{\n  \"description\": \"How far two engines may disagree about a value, by its unit\",\n  \"note\": \"Hand-written. Read by apps/twin/tolerance.py and assets/ts/calc/goldens.ts; a unit missing here is an error.\",\n  \"units\": {\n    \"\": \"0.001\",\n    \"1 / h\": \"0.001\",\n    \"m\": \"0.01\",\n    \"mm\": \"0.01\",\n    \"m ** 2\": \"0.01\",\n    \"m ** 3\": \"0.01\",\n    \"m ** 3 / h\": \"0.01\",\n    \"m / s\": \"0.01\",\n    \"l\": \"0.01\",\n    \"l / d\": \"0.01\",\n    \"W / K\": \"0.01\",\n    \"W / K / m ** 2\": \"0.01\",\n    \"kJ / K / m ** 2\": \"0.01\",\n    \"\u00B0C\": \"0.01\",\n    \"GBP / a\": \"0.01\",\n    \"GBP / m ** 2 / a\": \"0.01\",\n    \"W\": \"0.1\",\n    \"kW\": \"0.1\",\n    \"kWh\": \"0.1\",\n    \"kWh / d\": \"0.1\",\n    \"kWh / a\": \"0.1\",\n    \"kWh / month\": \"0.1\",\n    \"kWh / m ** 2 / a\": \"0.1\",\n    \"kWh / m ** 2 / month\": \"0.1\",\n    \"kg / a\": \"0.1\"\n  }\n}\n", "// Each worksheet line's plain name and its formula as SAP 10.2 writes it.\n// `{name}` is a line or an input the formula reads. worksheetlines.test.ts\n// checks them against what worksheet.py's lines are called with\n// (worksheet-flow.json) and what the TS sections read. The type makes a line\n// the engine computes without an entry a compile error.\n\nimport type { WorksheetResults } from \"./worksheet\";\n\nexport interface Formula {\n  name: string;\n  formula: string;\n  /** Where the engines, or the engines and SAP, part company. */\n  note?: string;\n  /** Lines or inputs only the TS engine reads; worksheet.py doesn't. */\n  tsOnly?: readonly string[];\n}\n\nconst PER_ELEMENT = \"\u03A3 A \u00D7 U of the\";\n\nexport const FORMULAS: { readonly [K in keyof WorksheetResults]: Formula } = {\n  region: {\n    name: \"Climate region\",\n    formula: \"Appendix U region of {postcode}\",\n  },\n\n  // Section 1\n  floor_volume_3: {\n    name: \"Volume of each storey\",\n    formula: \"{floor_area_1} \u00D7 {floor_height_2}\",\n  },\n  total_floor_area_4: {\n    name: \"Total floor area\",\n    formula: \"\u03A3 {floor_area_1}\",\n  },\n  dwelling_volume_5: {\n    name: \"Dwelling volume\",\n    formula: \"\u03A3 {floor_volume_3}\",\n  },\n\n  // Section 2\n  ventilation_open_chimney_6a: {\n    name: \"Open chimneys\",\n    formula: \"80 \u00D7 {open_chimneys}\",\n  },\n  ventilation_open_flue_6b: {\n    name: \"Open flues\",\n    formula: \"20 \u00D7 {open_flues}\",\n  },\n  ventilation_fire_flue_6c: {\n    name: \"Chimneys and flues of closed fires\",\n    formula: \"10 \u00D7 {fire_flues}\",\n  },\n  ventilation_boiler_flue_6d: {\n    name: \"Flues of solid-fuel boilers\",\n    formula: \"20 \u00D7 {boiler_flues}\",\n  },\n  ventilation_other_flue_6e: {\n    name: \"Flues of other heaters\",\n    formula: \"35 \u00D7 {other_flues}\",\n  },\n  ventilation_blocked_chimney_6f: {\n    name: \"Blocked chimneys\",\n    formula: \"20 \u00D7 {blocked_chimneys}\",\n  },\n  ventilation_extract_fan_7a: {\n    name: \"Intermittent extract fans\",\n    formula: \"10 \u00D7 {fans}\",\n  },\n  ventilation_passive_vent_7b: {\n    name: \"Passive vents\",\n    formula: \"10 \u00D7 {vents}\",\n  },\n  ventilation_flueless_gas_fire_7c: {\n    name: \"Flueless gas fires\",\n    formula: \"40 \u00D7 {gas_fires}\",\n  },\n  ventilation_infiltration_8: {\n    name: \"Air flow from chimneys, flues and fans\",\n    formula:\n      \"{ventilation_open_chimney_6a} + {ventilation_open_flue_6b} + {ventilation_fire_flue_6c} + {ventilation_boiler_flue_6d} + {ventilation_other_flue_6e} + {ventilation_blocked_chimney_6f} + {ventilation_extract_fan_7a} + {ventilation_passive_vent_7b} + {ventilation_flueless_gas_fire_7c}\",\n  },\n  ventilation_air_changes_8: {\n    name: \"Air changes from chimneys, flues and fans\",\n    formula: \"{ventilation_infiltration_8} \u00F7 {dwelling_volume_5}\",\n  },\n  storeys_9: {\n    name: \"Number of storeys\",\n    formula: \"{storeys_9} as surveyed, else the count of {floor_height_2}\",\n  },\n  additional_infiltration_10: {\n    name: \"Additional infiltration\",\n    formula: \"0.1 \u00D7 ({storeys_9} \u2212 1)\",\n  },\n  structural_infiltration_11: {\n    name: \"Structural infiltration\",\n    formula:\n      \"0.35 masonry or 0.25 timber or steel frame, by the larger net wall area of {building_elements}\",\n  },\n  ground_infiltration_12: {\n    name: \"Suspended wooden ground floor\",\n    formula:\n      \"0.2 unsealed, 0.1 sealed, else 0, from the ground floor in {building_elements}\",\n  },\n  lobby_infiltration_13: {\n    name: \"No draught lobby\",\n    formula: \"0 with {has_draught_lobby}, else 0.05\",\n  },\n  draught_proof_window_percentage_14: {\n    name: \"Windows and doors draught-proofed\",\n    formula: \"% of the windows in {building_elements} draught-proofed\",\n  },\n  window_infiltration_15: {\n    name: \"Window infiltration\",\n    formula: \"0.25 \u2212 0.2 \u00D7 {draught_proof_window_percentage_14} \u00F7 100\",\n  },\n  infiltration_rate_16: {\n    name: \"Infiltration rate\",\n    formula:\n      \"{ventilation_air_changes_8} + {additional_infiltration_10} + {structural_infiltration_11} + {ground_infiltration_12} + {lobby_infiltration_13} + {window_infiltration_15}\",\n  },\n  infiltration_rate_18: {\n    name: \"Infiltration rate, from any air test\",\n    formula:\n      \"{air_permeability_value_ap50_17} \u00F7 20 + {ventilation_air_changes_8} if tested at 50 Pa; 0.263 \u00D7 {air_permeability_value_ap4_17a}^0.924 + {ventilation_air_changes_8} at 4 Pa; else {infiltration_rate_16}\",\n  },\n  shelter_factor_20: {\n    name: \"Shelter factor\",\n    formula: \"1 \u2212 0.075 \u00D7 {sheltered_sides_19}\",\n  },\n  sheltered_infiltration_rate_21: {\n    name: \"Infiltration rate with shelter\",\n    formula: \"{infiltration_rate_18} \u00D7 {shelter_factor_20}\",\n  },\n  monthly_average_wind_speed_22: {\n    name: \"Average wind speed\",\n    formula: \"Table U2 for {region}\",\n  },\n  monthly_wind_factor_22a: {\n    name: \"Wind factor\",\n    formula: \"{monthly_average_wind_speed_22} \u00F7 4\",\n  },\n  adjusted_infiltration_rate_22b: {\n    name: \"Infiltration rate adjusted for wind\",\n    formula: \"{sheltered_infiltration_rate_21} \u00D7 {monthly_wind_factor_22a}\",\n  },\n  mvhr_air_change_rate_23a: {\n    name: \"Mechanical ventilation air change rate\",\n    formula: \"0.5 if {ventilation_system} is mechanical, else 0\",\n  },\n  mvhr_air_change_rate_23b: {\n    name: \"Air change rate through the system\",\n    formula:\n      \"{mvhr_air_change_rate_23a} if {ventilation_system} is mechanical, else 0\",\n  },\n  mvhr_air_change_rate_23c: {\n    name: \"Heat recovery efficiency\",\n    formula: \"0.7 if {ventilation_system} is mechanical, else 0\",\n  },\n  mechanical_ventilation_with_hr_24a: {\n    name: \"Balanced ventilation with heat recovery\",\n    formula:\n      \"{adjusted_infiltration_rate_22b} + {mvhr_air_change_rate_23b} \u00D7 (1 \u2212 {mvhr_air_change_rate_23c}), if {ventilation_system} is MVHR\",\n  },\n  whole_house_extract_24c: {\n    name: \"Whole-house extract ventilation\",\n    formula:\n      \"{mvhr_air_change_rate_23b} if {adjusted_infiltration_rate_22b} < 0.5 \u00D7 {mvhr_air_change_rate_23b}, else {adjusted_infiltration_rate_22b} + 0.5 \u00D7 {mvhr_air_change_rate_23b}, if {ventilation_system} is extract\",\n  },\n  effective_air_change_rate_24d: {\n    name: \"Natural ventilation\",\n    formula:\n      \"{adjusted_infiltration_rate_22b} if \u2265 1, else 0.5 + {adjusted_infiltration_rate_22b}\u00B2 \u00D7 0.5\",\n  },\n  effective_air_change_rate_25: {\n    name: \"Effective air change rate\",\n    formula:\n      \"{mechanical_ventilation_with_hr_24a}, {whole_house_extract_24c} or {effective_air_change_rate_24d}, whichever applies\",\n  },\n\n  // Section 3\n  solid_door_fabric_heat_loss_26: {\n    name: \"Solid doors\",\n    formula: `${PER_ELEMENT} solid doors in {building_elements}`,\n  },\n  semi_glazed_door_fabric_heat_loss_26a: {\n    name: \"Semi-glazed doors\",\n    formula: `${PER_ELEMENT} semi-glazed doors in {building_elements}`,\n  },\n  window_fabric_heat_loss_27: {\n    name: \"Windows\",\n    formula: `${PER_ELEMENT} windows in {building_elements}, each at the U-value entered`,\n  },\n  roof_window_fabric_heat_loss_27a: {\n    name: \"Roof windows\",\n    formula: `${PER_ELEMENT} roof windows in {building_elements}, each at the U-value entered`,\n  },\n  basement_floor_fabric_heat_loss_28: {\n    name: \"Basement floor\",\n    formula: `${PER_ELEMENT} basement floors in {building_elements}`,\n  },\n  ground_floor_fabric_heat_loss_28a: {\n    name: \"Ground floor\",\n    formula: `${PER_ELEMENT} ground floors in {building_elements}`,\n  },\n  exposed_floor_fabric_heat_loss_28b: {\n    name: \"Exposed floor\",\n    formula: `${PER_ELEMENT} exposed floors in {building_elements}`,\n  },\n  basement_wall_fabric_heat_loss_29: {\n    name: \"Basement walls\",\n    formula: `${PER_ELEMENT} basement walls in {building_elements}, net of openings`,\n  },\n  external_wall_fabric_heat_loss_29a: {\n    name: \"External walls\",\n    formula: `${PER_ELEMENT} external walls in {building_elements}, net of openings`,\n  },\n  roof_fabric_heat_loss_30: {\n    name: \"Roof\",\n    formula: `${PER_ELEMENT} roofs in {building_elements}`,\n  },\n  total_external_area_31: {\n    name: \"Total area of external elements\",\n    formula: \"\u03A3 A of the heat-losing elements in {building_elements}\",\n  },\n  party_wall_fabric_heat_loss_32: {\n    name: \"Party walls\",\n    formula: `${PER_ELEMENT} party walls in {building_elements}`,\n  },\n  fabric_heat_loss_33: {\n    name: \"Fabric heat loss\",\n    formula:\n      \"{solid_door_fabric_heat_loss_26} + {semi_glazed_door_fabric_heat_loss_26a} + {window_fabric_heat_loss_27} + {roof_window_fabric_heat_loss_27a} + {basement_floor_fabric_heat_loss_28} + {ground_floor_fabric_heat_loss_28a} + {exposed_floor_fabric_heat_loss_28b} + {basement_wall_fabric_heat_loss_29} + {external_wall_fabric_heat_loss_29a} + {roof_fabric_heat_loss_30} + {party_wall_fabric_heat_loss_32}\",\n  },\n  thermal_bridges_36: {\n    name: \"Thermal bridges\",\n    formula:\n      \"y \u00D7 {total_external_area_31}, y by the age band of {building_elements}\",\n  },\n  total_fabric_heat_loss_37: {\n    name: \"Total fabric heat loss\",\n    formula: \"{fabric_heat_loss_33} + {thermal_bridges_36}\",\n  },\n  ventilation_heat_loss_38: {\n    name: \"Ventilation heat loss\",\n    formula: \"0.33 \u00D7 {effective_air_change_rate_25} \u00D7 {dwelling_volume_5}\",\n  },\n  heat_transfer_coefficient_39: {\n    name: \"Heat transfer coefficient\",\n    formula: \"{total_fabric_heat_loss_37} + {ventilation_heat_loss_38}\",\n  },\n  heat_loss_parameter_40: {\n    name: \"Heat loss parameter\",\n    formula: \"{heat_transfer_coefficient_39} \u00F7 {total_floor_area_4}\",\n  },\n  days_in_month_41: {\n    name: \"Days in the month\",\n    formula: \"Table 1a\",\n  },\n\n  // Section 4\n  assumed_occupancy_42: {\n    name: \"Assumed occupancy\",\n    formula:\n      \"1 + 1.76 \u00D7 [1 \u2212 exp(\u22120.000349 \u00D7 ({total_floor_area_4} \u2212 13.19)\u00B2)] + 0.0013 \u00D7 ({total_floor_area_4} \u2212 13.9), or 1 if {total_floor_area_4} \u2264 13.9\",\n    note: \"SAP 10.2 Table 1b squares (TFA \u2212 13.9); both engines use 13.19.\",\n  },\n  hot_water_showers_42a: {\n    name: \"Hot water for showers\",\n    formula:\n      \"Appendix J (J1, J4, J5) for {number_of_showers} showers and {number_of_baths} baths fed by {hot_water_supply}, for {assumed_occupancy_42} people\",\n  },\n  hot_water_baths_42b: {\n    name: \"Hot water for baths\",\n    formula:\n      \"Appendix J (J1, J4, J5) for {number_of_baths} baths and {number_of_showers} showers fed by {hot_water_supply}, for {assumed_occupancy_42} people\",\n  },\n  hot_water_other_42c: {\n    name: \"Other hot water use\",\n    formula: \"(9.8 \u00D7 {assumed_occupancy_42} + 14) \u00D7 Table J2\",\n  },\n  hot_water_usage_43: {\n    name: \"Average daily hot water use\",\n    formula: \"25 \u00D7 {assumed_occupancy_42} + 36\",\n  },\n  monthly_hot_water_usage_44: {\n    name: \"Hot water use in the month\",\n    formula:\n      \"{hot_water_showers_42a} + {hot_water_baths_42b} + {hot_water_other_42c}\",\n  },\n  energy_content_of_water_used_45: {\n    name: \"Energy content of the hot water used\",\n    formula:\n      \"4.18 \u00D7 {monthly_hot_water_usage_44} \u00D7 {days_in_month_41} \u00D7 \u0394T \u00F7 3600, \u0394T from Table J1\",\n  },\n  distribution_loss_46: {\n    name: \"Distribution loss\",\n    formula: \"0.15 \u00D7 {energy_content_of_water_used_45}\",\n  },\n  total_hot_water_loss_55: {\n    name: \"Cylinder storage loss a day\",\n    formula:\n      \"{water_storage_volume_47} \u00D7 Table 2 for {cylinder_insulation} at {cylinder_insulation_thickness} mm \u00D7 Table 2a \u00D7 Table 2b ({cylinder_thermostat})\",\n  },\n  water_storage_loss_57: {\n    name: \"Cylinder storage loss\",\n    formula: \"{total_hot_water_loss_55} \u00D7 {days_in_month_41}\",\n  },\n  water_primary_circuit_loss_59: {\n    name: \"Primary circuit loss\",\n    formula:\n      \"Table 3 for {days_in_month_41} days, with a cylinder ({water_storage_volume_47}) heated by {water_heater_fuel}, thermostat {cylinder_thermostat}\",\n  },\n  water_combi_loss_61: {\n    name: \"Combi loss\",\n    formula:\n      \"600 \u00D7 min(1, {monthly_hot_water_usage_44} \u00F7 100) \u00D7 {days_in_month_41} \u00F7 365 if {water_heater_system} is a combi and no cylinder ({water_storage_volume_47}), else 0\",\n  },\n  water_heat_required_62: {\n    name: \"Heat required for water heating\",\n    formula:\n      \"0.85 \u00D7 {energy_content_of_water_used_45} + {distribution_loss_46} + {water_storage_loss_57} + {water_primary_circuit_loss_59} + {water_combi_loss_61}\",\n  },\n  water_wwhrs_input_63a: {\n    name: \"Waste water heat recovery\",\n    formula: \"0, not modelled\",\n  },\n  water_pv_input_63b: {\n    name: \"PV diverter\",\n    formula: \"0, not modelled\",\n  },\n  water_solar_input_63c: {\n    name: \"Solar water heating\",\n    formula: \"0, not modelled\",\n  },\n  water_fghrs_input_63d: {\n    name: \"Flue gas heat recovery\",\n    formula: \"0, not modelled\",\n  },\n  water_heater_output_64: {\n    name: \"Output from the water heater\",\n    formula: \"{water_heat_required_62} \u2212 (63a) \u2212 (63b) \u2212 (63c) \u2212 (63d)\",\n  },\n  water_electric_shower_64a: {\n    name: \"Electric showers\",\n    formula: \"0, not modelled\",\n  },\n  water_heat_gains_65: {\n    name: \"Heat gains from water heating\",\n    formula:\n      \"0.25 \u00D7 (0.85 \u00D7 {energy_content_of_water_used_45} + {water_combi_loss_61}) + 0.8 \u00D7 ({distribution_loss_46} + {water_storage_loss_57} + {water_primary_circuit_loss_59})\",\n  },\n\n  // Section 5\n  gains_metabolic_66: {\n    name: \"Metabolic gains\",\n    formula: \"60 \u00D7 {assumed_occupancy_42}\",\n  },\n  gains_lighting_67: {\n    name: \"Lighting gains\",\n    formula:\n      \"Appendix L (L12) from the glazing of {building_elements}, {total_floor_area_4}, {assumed_occupancy_42} and {days_in_month_41}\",\n  },\n  gains_appliances_68: {\n    name: \"Appliance gains\",\n    formula:\n      \"207.8 + ({assumed_occupancy_42} \u00F7 3.1)^0.2 + (0.4714 \u00D7 {total_floor_area_4})^0.4714\",\n  },\n  gains_cooking_69: {\n    name: \"Cooking gains\",\n    formula: \"35 + 7 \u00D7 {assumed_occupancy_42}\",\n  },\n  gains_pumps_and_fans_70: {\n    name: \"Pump and fan gains\",\n    formula: \"Table 5a for {first_main_heat_system}\",\n  },\n  gains_losses_71: {\n    name: \"Losses, evaporation\",\n    formula: \"\u221240 \u00D7 {assumed_occupancy_42}\",\n  },\n  gains_water_heating_72: {\n    name: \"Water heating gains\",\n    formula: \"1000 \u00D7 {water_heat_gains_65} \u00F7 (24 \u00D7 {days_in_month_41})\",\n  },\n  gains_total_internal_73: {\n    name: \"Total internal gains\",\n    formula:\n      \"{gains_metabolic_66} + {gains_lighting_67} + {gains_appliances_68} + {gains_cooking_69} + {gains_pumps_and_fans_70} + {gains_losses_71} + {gains_water_heating_72}\",\n  },\n\n  // Section 6\n  solar_gains_north_74: {\n    name: \"Solar gains, north\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the north windows in {building_elements}, S from Appendix U for {region}\",\n  },\n  solar_gains_north_east_75: {\n    name: \"Solar gains, north-east\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the north-east windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_east_76: {\n    name: \"Solar gains, east\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the east windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_south_east_77: {\n    name: \"Solar gains, south-east\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the south-east windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_south_78: {\n    name: \"Solar gains, south\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the south windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_south_west_79: {\n    name: \"Solar gains, south-west\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the south-west windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_west_80: {\n    name: \"Solar gains, west\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the west windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_north_west_81: {\n    name: \"Solar gains, north-west\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the north-west windows in {building_elements}, S for {region}\",\n  },\n  solar_gains_roof_window_82: {\n    name: \"Solar gains, roof windows\",\n    formula:\n      \"\u03A3 0.9 \u00D7 A \u00D7 S \u00D7 g\u22A5 \u00D7 FF \u00D7 Z of the roof windows in {building_elements}\",\n  },\n  solar_gains_83: {\n    name: \"Total solar gains\",\n    formula:\n      \"{solar_gains_north_74} + {solar_gains_north_east_75} + {solar_gains_east_76} + {solar_gains_south_east_77} + {solar_gains_south_78} + {solar_gains_south_west_79} + {solar_gains_west_80} + {solar_gains_north_west_81} + {solar_gains_roof_window_82}\",\n  },\n  total_gains_84: {\n    name: \"Total gains\",\n    formula: \"{gains_total_internal_73} + {solar_gains_83}\",\n  },\n\n  // Section 7\n  temperature_85: {\n    name: \"Living area heating temperature\",\n    formula: \"21 \u00B0C, Table 9\",\n  },\n  average_external_temperature_96: {\n    name: \"External temperature\",\n    formula: \"Table U1 for {region}\",\n  },\n  utilisation_factor_86: {\n    name: \"Utilisation factor, living area\",\n    formula:\n      \"Table 9a: \u03B7 from \u03B3 = {total_gains_84} \u00F7 ({heat_transfer_coefficient_39} \u00D7 ({temperature_85} \u2212 {average_external_temperature_96})) and \u03C4 from {thermal_mass_parameter_35}, {heat_loss_parameter_40}\",\n  },\n  mean_internal_living_temperature_87: {\n    name: \"Mean temperature, living area\",\n    formula:\n      \"Table 9c steps 3\u20137 from {utilisation_factor_86}, {total_gains_84}, {heat_transfer_coefficient_39}, {heat_loss_parameter_40}, {thermal_mass_parameter_35} and {average_external_temperature_96}\",\n  },\n  temperature_88: {\n    name: \"Heating temperature, rest of dwelling\",\n    formula:\n      \"Table 9 Th2 for control {heating_control_type} and {heat_loss_parameter_40}\",\n  },\n  utilisation_factor_89: {\n    name: \"Utilisation factor, rest of dwelling\",\n    formula:\n      \"Table 9a: \u03B7 from \u03B3 = {total_gains_84} \u00F7 ({heat_transfer_coefficient_39} \u00D7 ({temperature_88} \u2212 {average_external_temperature_96})) and \u03C4 from {thermal_mass_parameter_35}, {heat_loss_parameter_40}\",\n  },\n  mean_internal_rest_temperature_90: {\n    name: \"Mean temperature, rest of dwelling\",\n    formula:\n      \"Table 9c steps 3\u20137 from {utilisation_factor_89}, {total_gains_84}, {heat_transfer_coefficient_39}, {heat_loss_parameter_40}, {thermal_mass_parameter_35}, {average_external_temperature_96} and control {heating_control_type}\",\n  },\n  living_area_fraction_91: {\n    name: \"Living area fraction\",\n    formula: \"{living_area} \u00F7 {total_floor_area_4}\",\n  },\n  mean_internal_temperature_92: {\n    name: \"Mean internal temperature\",\n    formula:\n      \"{living_area_fraction_91} \u00D7 {mean_internal_living_temperature_87} + (1 \u2212 {living_area_fraction_91}) \u00D7 {mean_internal_rest_temperature_90}\",\n  },\n  adjusted_mean_internal_temperature_93: {\n    name: \"Adjusted mean internal temperature\",\n    formula: \"{mean_internal_temperature_92}, with no Table 4e adjustment\",\n  },\n\n  // Section 8\n  utilisation_factor_94: {\n    name: \"Utilisation factor for gains\",\n    formula:\n      \"Table 9a: \u03B7 from {total_gains_84}, {heat_transfer_coefficient_39}, {adjusted_mean_internal_temperature_93} \u2212 {average_external_temperature_96}, \u03C4 from {thermal_mass_parameter_35}, {heat_loss_parameter_40}\",\n  },\n  useful_gains_95: {\n    name: \"Useful gains\",\n    formula: \"{utilisation_factor_94} \u00D7 {total_gains_84}\",\n  },\n  heat_loss_rate_97: {\n    name: \"Heat loss rate\",\n    formula:\n      \"{heat_transfer_coefficient_39} \u00D7 ({adjusted_mean_internal_temperature_93} \u2212 {average_external_temperature_96})\",\n  },\n  space_heating_98a: {\n    name: \"Space heating requirement\",\n    formula:\n      \"0.024 \u00D7 ({heat_loss_rate_97} \u2212 {useful_gains_95}) \u00D7 {days_in_month_41}, October to May\",\n  },\n  solar_space_heating_98b: {\n    name: \"Solar space heating\",\n    formula: \"0, not modelled\",\n  },\n  space_heating_98c: {\n    name: \"Space heating requirement after solar\",\n    formula: \"{space_heating_98a} \u2212 {solar_space_heating_98b}\",\n  },\n  space_heating_99: {\n    name: \"Space heating per m\u00B2\",\n    formula: \"\u03A3 {space_heating_98c} \u00F7 {total_floor_area_4}\",\n  },\n\n  // Section 8c\n  heat_loss_rate_100: {\n    name: \"Heat loss rate for cooling\",\n    formula:\n      \"{heat_transfer_coefficient_39} \u00D7 (24 \u2212 {average_external_temperature_96})\",\n  },\n  total_gains_103: {\n    name: \"Gains for cooling\",\n    formula: \"{total_gains_84}\",\n  },\n  utilisation_factor_101: {\n    name: \"Utilisation factor for loss\",\n    formula:\n      \"Table 10a: \u03B7 from {total_gains_103}, {heat_transfer_coefficient_39}, 24 \u2212 {average_external_temperature_96}, \u03C4 from {thermal_mass_parameter_35}, {heat_loss_parameter_40}\",\n  },\n  useful_loss_102: {\n    name: \"Useful loss\",\n    formula: \"{utilisation_factor_101} \u00D7 {heat_loss_rate_100}\",\n  },\n  space_cooling_requirement_104: {\n    name: \"Space cooling requirement, continuous\",\n    formula:\n      \"0.024 \u00D7 ({total_gains_103} \u2212 {useful_loss_102}) \u00D7 {days_in_month_41}, June to August\",\n  },\n  cooled_fraction_105: {\n    name: \"Cooled fraction\",\n    formula: \"cooled area \u00F7 {total_floor_area_4}\",\n  },\n  intermittency_factor_106: {\n    name: \"Intermittency factor\",\n    formula: \"0.25 June to August, else 0\",\n  },\n  space_cooling_requirement_107: {\n    name: \"Space cooling requirement\",\n    formula:\n      \"{space_cooling_requirement_104} \u00D7 {cooled_fraction_105} \u00D7 {intermittency_factor_106}\",\n  },\n  space_cooling_requirement_108: {\n    name: \"Space cooling per m\u00B2\",\n    formula: \"\u03A3 {space_cooling_requirement_107} \u00F7 {total_floor_area_4}\",\n  },\n\n  // Section 9a\n  secondary_heat_system_fraction_201: {\n    name: \"Fraction from secondary heating\",\n    formula:\n      \"Table 11 for {first_main_heat_system} if {has_secondary_heating}, else 0\",\n  },\n  main_heat_system_fraction_202: {\n    name: \"Fraction from main heating\",\n    formula: \"1 \u2212 {secondary_heat_system_fraction_201}\",\n  },\n  second_main_heat_system_fraction_203: {\n    name: \"Fraction of main heating from the second system\",\n    formula: \"0, one main system\",\n  },\n  first_main_heat_system_fraction_204: {\n    name: \"Fraction from main system 1\",\n    formula:\n      \"{main_heat_system_fraction_202} \u00D7 (1 \u2212 {second_main_heat_system_fraction_203})\",\n  },\n  second_main_heat_system_fraction_205: {\n    name: \"Fraction from main system 2\",\n    formula:\n      \"{main_heat_system_fraction_202} \u00D7 {second_main_heat_system_fraction_203}\",\n  },\n  first_main_heat_system_efficiency_206: {\n    name: \"Efficiency of main system 1\",\n    formula: \"Table 4a/4b for {first_main_heat_system}\",\n  },\n  second_main_heat_system_efficiency_207: {\n    name: \"Efficiency of main system 2\",\n    formula: \"Table 4a/4b for {second_main_heat_system}\",\n  },\n  secondary_heat_system_efficiency_208: {\n    name: \"Efficiency of secondary heating\",\n    formula: \"Table 4a for {secondary_heat_system}\",\n  },\n  cooling_system_efficiency_209: {\n    name: \"Cooling system energy efficiency ratio\",\n    formula: \"Table 10c for {air_conditioner_efficiency}\",\n  },\n  first_main_heat_system_fuel_211: {\n    name: \"Fuel for main system 1\",\n    formula:\n      \"{space_heating_98c} \u00D7 {first_main_heat_system_fraction_204} \u00D7 100 \u00F7 {first_main_heat_system_efficiency_206}\",\n  },\n  first_main_heat_system_fuel_211_sum: {\n    name: \"Fuel for main system 1, a year\",\n    formula: \"\u03A3 {first_main_heat_system_fuel_211}\",\n  },\n  second_main_heat_system_fuel_213: {\n    name: \"Fuel for main system 2\",\n    formula:\n      \"{space_heating_98c} \u00D7 {second_main_heat_system_fraction_205} \u00D7 100 \u00F7 {second_main_heat_system_efficiency_207}\",\n  },\n  secondary_heat_system_fuel_215: {\n    name: \"Fuel for secondary heating\",\n    formula:\n      \"{space_heating_98c} \u00D7 {secondary_heat_system_fraction_201} \u00D7 100 \u00F7 {secondary_heat_system_efficiency_208}\",\n  },\n  water_heater_efficiency_217: {\n    name: \"Water heater efficiency\",\n    formula:\n      \"Table 4a/4b for {water_heater_system}, weighted by {water_heater_output_64} and {space_heating_98c} (Appendix D)\",\n  },\n  water_heater_fuel_219: {\n    name: \"Fuel for water heating\",\n    formula: \"{water_heater_output_64} \u00D7 100 \u00F7 {water_heater_efficiency_217}\",\n  },\n  water_heater_fuel_219_sum: {\n    name: \"Fuel for water heating, a year\",\n    formula: \"\u03A3 {water_heater_fuel_219}\",\n  },\n  space_cooling_fuel_221: {\n    name: \"Electricity for cooling\",\n    formula:\n      \"{space_cooling_requirement_107} \u00F7 {cooling_system_efficiency_209}\",\n  },\n  mechanical_ventilation_fans_230a: {\n    name: \"Mechanical ventilation fans\",\n    formula:\n      \"IUF \u00D7 SFP \u00D7 1.22 \u00D7 {dwelling_volume_5} for extract, IUF \u00D7 SFP \u00D7 2.44 \u00D7 {mvhr_air_change_rate_23b} \u00D7 {dwelling_volume_5} for MVHR, by {ventilation_system}\",\n  },\n  total_electricity_231: {\n    name: \"Pumps, fans and boiler auxiliaries\",\n    formula:\n      \"{mechanical_ventilation_fans_230a} + Table 4f pump (115) for a wet {first_main_heat_system}, + flue fan 45 for gas or 100 for oil ({first_main_heat_system_fuel})\",\n  },\n  electricity_for_lighting_232: {\n    name: \"Electricity for lighting\",\n    formula:\n      \"Appendix L (L11) from the glazing of {building_elements}, {total_floor_area_4}, {assumed_occupancy_42} and {days_in_month_41}\",\n  },\n  water_heating_electric_243: {\n    name: \"Electric water heating fraction\",\n    formula: \"0\",\n  },\n  pv_energy_used_233a: {\n    name: \"PV used in the dwelling\",\n    formula:\n      \"Appendix M: \u03B2 \u00D7 generation from {pv_peak_power} at {pv_orientation}\u00B0, {pv_pitch}\u00B0 pitch, {pv_overshading} in {region}, against the demand of {first_main_heat_system_fuel} {first_main_heat_system_fuel_211}, {second_main_heat_system_fuel} {second_main_heat_system_fuel_213}, {secondary_heat_system_fuel} {secondary_heat_system_fuel_215}, {water_heater_fuel} {water_heater_fuel_219}, {total_electricity_231}, {water_electric_shower_64a}, lighting from {building_elements}, {total_floor_area_4}, {assumed_occupancy_42}, {days_in_month_41}, and a {battery_capacity} battery\",\n  },\n  pv_energy_used_233a_sum: {\n    name: \"PV used in the dwelling, a year\",\n    formula: \"\u03A3 {pv_energy_used_233a}\",\n  },\n  total_delivered_energy_238: {\n    name: \"Total delivered energy\",\n    formula:\n      \"\u03A3 {first_main_heat_system_fuel_211} + \u03A3 {second_main_heat_system_fuel_213} + \u03A3 {secondary_heat_system_fuel_215} + \u03A3 {water_heater_fuel_219} + \u03A3 {space_cooling_fuel_221} + {total_electricity_231} + {electricity_for_lighting_232} \u2212 \u03A3 {pv_energy_used_233a}\",\n  },\n\n  // Section 10a\n  first_main_heat_system_cost_240e: {\n    name: \"Main system 1\",\n    formula:\n      \"\u03A3 {first_main_heat_system_fuel_211} \u00D7 Table 32 price of {first_main_heat_system_fuel}\",\n  },\n  second_main_heat_system_cost_241e: {\n    name: \"Main system 2\",\n    formula:\n      \"\u03A3 {second_main_heat_system_fuel_213} \u00D7 Table 32 price of {second_main_heat_system_fuel}\",\n  },\n  secondary_heat_system_cost_242e: {\n    name: \"Secondary heating\",\n    formula:\n      \"\u03A3 {secondary_heat_system_fuel_215} \u00D7 Table 32 price of {secondary_heat_system_fuel}\",\n  },\n  water_heater_cost_247: {\n    name: \"Water heating\",\n    formula:\n      \"\u03A3 {water_heater_fuel_219} \u00D7 Table 32 price of {water_heater_fuel}\",\n  },\n  space_cooling_cost_248: {\n    name: \"Space cooling\",\n    formula:\n      \"\u03A3 {space_cooling_fuel_221} \u00D7 Table 32 price of {space_cooling_fuel}\",\n  },\n  pumps_and_fans_cost_249: {\n    name: \"Pumps and fans\",\n    formula: \"{total_electricity_231} \u00D7 Table 32 standard electricity price\",\n  },\n  energy_for_lighting_250: {\n    name: \"Lighting\",\n    formula:\n      \"{electricity_for_lighting_232} \u00D7 Table 32 price of {lighting_fuel}\",\n  },\n  standing_charges_251: {\n    name: \"Standing charges\",\n    formula:\n      \"Table 32 standing charges of the heating fuels in use: {first_main_heat_system_fuel} if {first_main_heat_system_cost_240e} > 0, {second_main_heat_system_fuel} if {second_main_heat_system_cost_241e} > 0, {secondary_heat_system_fuel} if {secondary_heat_system_cost_242e} > 0, {water_heater_fuel} if {water_heater_cost_247} > 0; never standard electricity\",\n  },\n  energy_saving_technologies_252: {\n    name: \"PV savings\",\n    formula: \"\u2212\u03A3 {pv_energy_used_233a} \u00D7 Table 32 standard electricity price\",\n  },\n  total_energy_cost_255: {\n    name: \"Total energy cost\",\n    formula:\n      \"{first_main_heat_system_cost_240e} + {second_main_heat_system_cost_241e} + {secondary_heat_system_cost_242e} + {water_heater_cost_247} + {space_cooling_cost_248} + {pumps_and_fans_cost_249} + {energy_for_lighting_250} + {standing_charges_251} + {energy_saving_technologies_252}\",\n  },\n\n  // Section 11a\n  energy_cost_deflator_256: {\n    name: \"Energy cost deflator\",\n    formula: \"0.42, Table 12\",\n  },\n  energy_cost_factor_257: {\n    name: \"Energy cost factor\",\n    formula:\n      \"{total_energy_cost_255} \u00D7 {energy_cost_deflator_256} \u00F7 ({total_floor_area_4} + 45)\",\n  },\n  sap_rating_258: {\n    name: \"SAP rating\",\n    formula:\n      \"108.8 \u2212 120.5 \u00D7 log\u2081\u2080({energy_cost_factor_257}) if \u2265 3.5, else 100 \u2212 16.21 \u00D7 {energy_cost_factor_257}\",\n  },\n\n  // Section 12a\n  first_main_heat_system_co2_261: {\n    name: \"Main system 1\",\n    formula:\n      \"\u03A3 {first_main_heat_system_fuel_211} \u00D7 Table 12 emissions of {first_main_heat_system_fuel}\",\n  },\n  second_main_heat_system_co2_262: {\n    name: \"Main system 2\",\n    formula:\n      \"\u03A3 {second_main_heat_system_fuel_213} \u00D7 Table 12 emissions of {second_main_heat_system_fuel}\",\n  },\n  secondary_heat_system_co2_263: {\n    name: \"Secondary heating\",\n    formula:\n      \"\u03A3 {secondary_heat_system_fuel_215} \u00D7 Table 12 emissions of {secondary_heat_system_fuel}\",\n  },\n  water_heater_co2_264: {\n    name: \"Water heating\",\n    formula:\n      \"\u03A3 {water_heater_fuel_219} \u00D7 Table 12 emissions of {water_heater_fuel}\",\n  },\n  space_cooling_co2_266: {\n    name: \"Space cooling\",\n    formula:\n      \"\u03A3 {space_cooling_fuel_221} \u00D7 Table 12 emissions of {space_cooling_fuel}\",\n  },\n  pumps_and_fans_co2_267: {\n    name: \"Pumps and fans\",\n    formula:\n      \"\u03A3 {total_electricity_231} spread by {days_in_month_41} \u00D7 Table 12d monthly emissions of standard electricity\",\n  },\n  energy_for_lighting_co2_268: {\n    name: \"Lighting\",\n    formula:\n      \"\u03A3 monthly {electricity_for_lighting_232} (L11 from {building_elements}, {total_floor_area_4}, {assumed_occupancy_42}, {days_in_month_41}) \u00D7 Table 12d emissions of {lighting_fuel}\",\n  },\n  energy_generating_co2_269: {\n    name: \"PV generation\",\n    formula:\n      \"\u2212\u03A3 {pv_energy_used_233a} \u00D7 Table 12 standard electricity emissions\",\n  },\n  total_energy_co2_272: {\n    name: \"Total CO\u2082 emissions\",\n    formula:\n      \"{first_main_heat_system_co2_261} + {second_main_heat_system_co2_262} + {secondary_heat_system_co2_263} + {water_heater_co2_264} + {space_cooling_co2_266} + {pumps_and_fans_co2_267} + {energy_for_lighting_co2_268} + {energy_generating_co2_269}\",\n  },\n\n  // Furbnow's own lines, after SAP's (apps/twin/adjustments.py)\n  furbnow_battery_stored: {\n    name: \"PV a battery holds for later\",\n    formula:\n      \"min(\u03A3 {pv_energy_used_233a} \u2212 \u03A3 (233a) without the battery, 365 \u00D7 {battery_capacity})\",\n  },\n  furbnow_pv_used: {\n    name: \"PV used, battery included\",\n    formula: \"\u03A3 (233a) without the battery + {furbnow_battery_stored}\",\n  },\n  furbnow_heat_pump_scop: {\n    name: \"Heat pump SCOP\",\n    formula: \"the design's {heat_pump_scop}\",\n    note: \"Python fixes it at 3.2; the TS engine takes the design's SCOP.\",\n    tsOnly: [\"heat_pump_scop\"],\n  },\n  furbnow_corrected_energy_cost: {\n    name: \"Energy cost, heat pump at its SCOP\",\n    formula:\n      \"{total_energy_cost_255} \u2212 {first_main_heat_system_cost_240e} + {first_main_heat_system_cost_240e} \u00D7 {first_main_heat_system_efficiency_206} \u00F7 (100 \u00D7 {furbnow_heat_pump_scop}) \u2212 {water_heater_cost_247} + {water_heater_cost_247} \u00D7 {water_heater_efficiency_217} \u00F7 (100 \u00D7 {furbnow_heat_pump_scop}), where {first_main_heat_system} or {water_heater_system} is a heat pump\",\n    tsOnly: [\"furbnow_heat_pump_scop\"],\n  },\n  furbnow_corrected_sap_rating: {\n    name: \"SAP rating, heat pump at its SCOP\",\n    formula:\n      \"(258) of {furbnow_corrected_energy_cost} \u00D7 0.42 \u00F7 ({total_floor_area_4} + 45)\",\n  },\n  furbnow_bills: {\n    name: \"Bills at today's prices\",\n    formula:\n      \"\u03A3 fuel \u00D7 tariff price + standing charges, for {first_main_heat_system_fuel_211}, {water_heater_fuel_219}, {total_electricity_231}, {electricity_for_lighting_232}, less {furbnow_pv_used}\",\n  },\n  furbnow_corrected_bills: {\n    name: \"Bills, heat pump at its SCOP\",\n    formula:\n      \"As the bills, with the heat-pump share of {first_main_heat_system} at {first_main_heat_system_efficiency_206} and {water_heater_system} at {water_heater_efficiency_217} re-run at {furbnow_heat_pump_scop}\",\n    tsOnly: [\"furbnow_heat_pump_scop\"],\n  },\n};\n", "{\n \"region\": {\n  \"reads\": [\n   \"postcode\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"floor_volume_3\": {\n  \"reads\": [\n   \"floor_area_1\",\n   \"floor_height_2\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3\"\n },\n \"total_floor_area_4\": {\n  \"reads\": [\n   \"floor_area_1\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 2\"\n },\n \"dwelling_volume_5\": {\n  \"reads\": [\n   \"floor_volume_3\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3\"\n },\n \"ventilation_open_chimney_6a\": {\n  \"reads\": [\n   \"open_chimneys\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_open_flue_6b\": {\n  \"reads\": [\n   \"open_flues\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_fire_flue_6c\": {\n  \"reads\": [\n   \"fire_flues\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_boiler_flue_6d\": {\n  \"reads\": [\n   \"boiler_flues\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_other_flue_6e\": {\n  \"reads\": [\n   \"other_flues\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_blocked_chimney_6f\": {\n  \"reads\": [\n   \"blocked_chimneys\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_extract_fan_7a\": {\n  \"reads\": [\n   \"fans\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_passive_vent_7b\": {\n  \"reads\": [\n   \"vents\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_flueless_gas_fire_7c\": {\n  \"reads\": [\n   \"gas_fires\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_infiltration_8\": {\n  \"reads\": [\n   \"ventilation_open_chimney_6a\",\n   \"ventilation_open_flue_6b\",\n   \"ventilation_fire_flue_6c\",\n   \"ventilation_boiler_flue_6d\",\n   \"ventilation_other_flue_6e\",\n   \"ventilation_blocked_chimney_6f\",\n   \"ventilation_extract_fan_7a\",\n   \"ventilation_passive_vent_7b\",\n   \"ventilation_flueless_gas_fire_7c\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 3 / h\"\n },\n \"ventilation_air_changes_8\": {\n  \"reads\": [\n   \"ventilation_infiltration_8\",\n   \"dwelling_volume_5\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"storeys_9\": {\n  \"reads\": [\n   \"storeys_9\",\n   \"floor_height_2\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"additional_infiltration_10\": {\n  \"reads\": [\n   \"storeys_9\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"structural_infiltration_11\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"ground_infiltration_12\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"lobby_infiltration_13\": {\n  \"reads\": [\n   \"has_draught_lobby\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"draught_proof_window_percentage_14\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"window_infiltration_15\": {\n  \"reads\": [\n   \"draught_proof_window_percentage_14\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"infiltration_rate_16\": {\n  \"reads\": [\n   \"ventilation_air_changes_8\",\n   \"additional_infiltration_10\",\n   \"structural_infiltration_11\",\n   \"ground_infiltration_12\",\n   \"lobby_infiltration_13\",\n   \"window_infiltration_15\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"infiltration_rate_18\": {\n  \"reads\": [\n   \"ventilation_air_changes_8\",\n   \"infiltration_rate_16\",\n   \"air_permeability_value_ap50_17\",\n   \"air_permeability_value_ap4_17a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"shelter_factor_20\": {\n  \"reads\": [\n   \"sheltered_sides_19\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"sheltered_infiltration_rate_21\": {\n  \"reads\": [\n   \"shelter_factor_20\",\n   \"infiltration_rate_18\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"monthly_average_wind_speed_22\": {\n  \"reads\": [\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m / s\"\n },\n \"monthly_wind_factor_22a\": {\n  \"reads\": [\n   \"monthly_average_wind_speed_22\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"adjusted_infiltration_rate_22b\": {\n  \"reads\": [\n   \"sheltered_infiltration_rate_21\",\n   \"monthly_wind_factor_22a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"mvhr_air_change_rate_23a\": {\n  \"reads\": [\n   \"ventilation_system\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"mvhr_air_change_rate_23b\": {\n  \"reads\": [\n   \"ventilation_system\",\n   \"mvhr_air_change_rate_23a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"mvhr_air_change_rate_23c\": {\n  \"reads\": [\n   \"ventilation_system\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"mechanical_ventilation_with_hr_24a\": {\n  \"reads\": [\n   \"ventilation_system\",\n   \"adjusted_infiltration_rate_22b\",\n   \"mvhr_air_change_rate_23b\",\n   \"mvhr_air_change_rate_23c\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"whole_house_extract_24c\": {\n  \"reads\": [\n   \"ventilation_system\",\n   \"adjusted_infiltration_rate_22b\",\n   \"mvhr_air_change_rate_23b\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"effective_air_change_rate_24d\": {\n  \"reads\": [\n   \"adjusted_infiltration_rate_22b\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"effective_air_change_rate_25\": {\n  \"reads\": [\n   \"mechanical_ventilation_with_hr_24a\",\n   \"whole_house_extract_24c\",\n   \"effective_air_change_rate_24d\"\n  ],\n  \"partial\": false,\n  \"unit\": \"1 / h\"\n },\n \"solid_door_fabric_heat_loss_26\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"semi_glazed_door_fabric_heat_loss_26a\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"window_fabric_heat_loss_27\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"roof_window_fabric_heat_loss_27a\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"basement_floor_fabric_heat_loss_28\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"ground_floor_fabric_heat_loss_28a\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"exposed_floor_fabric_heat_loss_28b\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"basement_wall_fabric_heat_loss_29\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"external_wall_fabric_heat_loss_29a\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"roof_fabric_heat_loss_30\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"total_external_area_31\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"m ** 2\"\n },\n \"party_wall_fabric_heat_loss_32\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"fabric_heat_loss_33\": {\n  \"reads\": [\n   \"solid_door_fabric_heat_loss_26\",\n   \"semi_glazed_door_fabric_heat_loss_26a\",\n   \"window_fabric_heat_loss_27\",\n   \"roof_window_fabric_heat_loss_27a\",\n   \"basement_floor_fabric_heat_loss_28\",\n   \"ground_floor_fabric_heat_loss_28a\",\n   \"exposed_floor_fabric_heat_loss_28b\",\n   \"basement_wall_fabric_heat_loss_29\",\n   \"external_wall_fabric_heat_loss_29a\",\n   \"roof_fabric_heat_loss_30\",\n   \"party_wall_fabric_heat_loss_32\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"thermal_bridges_36\": {\n  \"reads\": [\n   \"building_elements\",\n   \"total_external_area_31\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"total_fabric_heat_loss_37\": {\n  \"reads\": [\n   \"fabric_heat_loss_33\",\n   \"thermal_bridges_36\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"ventilation_heat_loss_38\": {\n  \"reads\": [\n   \"effective_air_change_rate_25\",\n   \"dwelling_volume_5\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"heat_transfer_coefficient_39\": {\n  \"reads\": [\n   \"total_fabric_heat_loss_37\",\n   \"ventilation_heat_loss_38\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K\"\n },\n \"heat_loss_parameter_40\": {\n  \"reads\": [\n   \"total_floor_area_4\",\n   \"heat_transfer_coefficient_39\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W / K / m ** 2\"\n },\n \"days_in_month_41\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"assumed_occupancy_42\": {\n  \"reads\": [\n   \"total_floor_area_4\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"hot_water_showers_42a\": {\n  \"reads\": [\n   \"hot_water_supply\",\n   \"number_of_baths\",\n   \"number_of_showers\",\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"l / d\"\n },\n \"hot_water_baths_42b\": {\n  \"reads\": [\n   \"hot_water_supply\",\n   \"number_of_baths\",\n   \"number_of_showers\",\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"l / d\"\n },\n \"hot_water_other_42c\": {\n  \"reads\": [\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"l / d\"\n },\n \"hot_water_usage_43\": {\n  \"reads\": [\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"l / d\"\n },\n \"monthly_hot_water_usage_44\": {\n  \"reads\": [\n   \"hot_water_showers_42a\",\n   \"hot_water_baths_42b\",\n   \"hot_water_other_42c\"\n  ],\n  \"partial\": false,\n  \"unit\": \"l / d\"\n },\n \"energy_content_of_water_used_45\": {\n  \"reads\": [\n   \"days_in_month_41\",\n   \"monthly_hot_water_usage_44\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"distribution_loss_46\": {\n  \"reads\": [\n   \"energy_content_of_water_used_45\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"total_hot_water_loss_55\": {\n  \"reads\": [\n   \"water_storage_volume_47\",\n   \"cylinder_insulation\",\n   \"cylinder_insulation_thickness\",\n   \"cylinder_thermostat\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / d\"\n },\n \"water_storage_loss_57\": {\n  \"reads\": [\n   \"total_hot_water_loss_55\",\n   \"days_in_month_41\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_primary_circuit_loss_59\": {\n  \"reads\": [\n   \"water_storage_volume_47\",\n   \"water_heater_fuel\",\n   \"cylinder_thermostat\",\n   \"days_in_month_41\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_combi_loss_61\": {\n  \"reads\": [\n   \"water_storage_volume_47\",\n   \"water_heater_system\",\n   \"monthly_hot_water_usage_44\",\n   \"days_in_month_41\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_heat_required_62\": {\n  \"reads\": [\n   \"energy_content_of_water_used_45\",\n   \"distribution_loss_46\",\n   \"water_storage_loss_57\",\n   \"water_primary_circuit_loss_59\",\n   \"water_combi_loss_61\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_wwhrs_input_63a\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"water_pv_input_63b\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"water_solar_input_63c\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"water_fghrs_input_63d\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"water_heater_output_64\": {\n  \"reads\": [\n   \"water_heat_required_62\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_electric_shower_64a\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_heat_gains_65\": {\n  \"reads\": [\n   \"energy_content_of_water_used_45\",\n   \"distribution_loss_46\",\n   \"water_storage_loss_57\",\n   \"water_primary_circuit_loss_59\",\n   \"water_combi_loss_61\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"gains_metabolic_66\": {\n  \"reads\": [\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_lighting_67\": {\n  \"reads\": [\n   \"building_elements\",\n   \"total_floor_area_4\",\n   \"days_in_month_41\",\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_appliances_68\": {\n  \"reads\": [\n   \"total_floor_area_4\",\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_cooking_69\": {\n  \"reads\": [\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_pumps_and_fans_70\": {\n  \"reads\": [\n   \"first_main_heat_system\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_losses_71\": {\n  \"reads\": [\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_water_heating_72\": {\n  \"reads\": [\n   \"days_in_month_41\",\n   \"water_heat_gains_65\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"gains_total_internal_73\": {\n  \"reads\": [\n   \"gains_metabolic_66\",\n   \"gains_lighting_67\",\n   \"gains_appliances_68\",\n   \"gains_cooking_69\",\n   \"gains_pumps_and_fans_70\",\n   \"gains_losses_71\",\n   \"gains_water_heating_72\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_north_74\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_north_east_75\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_east_76\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_south_east_77\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_south_78\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_south_west_79\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_west_80\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_north_west_81\": {\n  \"reads\": [\n   \"building_elements\",\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_roof_window_82\": {\n  \"reads\": [\n   \"building_elements\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"solar_gains_83\": {\n  \"reads\": [\n   \"solar_gains_north_74\",\n   \"solar_gains_north_east_75\",\n   \"solar_gains_east_76\",\n   \"solar_gains_south_east_77\",\n   \"solar_gains_south_78\",\n   \"solar_gains_south_west_79\",\n   \"solar_gains_west_80\",\n   \"solar_gains_north_west_81\",\n   \"solar_gains_roof_window_82\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"total_gains_84\": {\n  \"reads\": [\n   \"gains_total_internal_73\",\n   \"solar_gains_83\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"temperature_85\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"average_external_temperature_96\": {\n  \"reads\": [\n   \"region\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"utilisation_factor_86\": {\n  \"reads\": [\n   \"thermal_mass_parameter_35\",\n   \"heat_transfer_coefficient_39\",\n   \"heat_loss_parameter_40\",\n   \"total_gains_84\",\n   \"temperature_85\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"mean_internal_living_temperature_87\": {\n  \"reads\": [\n   \"thermal_mass_parameter_35\",\n   \"heat_transfer_coefficient_39\",\n   \"heat_loss_parameter_40\",\n   \"total_gains_84\",\n   \"utilisation_factor_86\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"temperature_88\": {\n  \"reads\": [\n   \"heating_control_type\",\n   \"heat_loss_parameter_40\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"utilisation_factor_89\": {\n  \"reads\": [\n   \"thermal_mass_parameter_35\",\n   \"heat_transfer_coefficient_39\",\n   \"heat_loss_parameter_40\",\n   \"total_gains_84\",\n   \"temperature_88\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"mean_internal_rest_temperature_90\": {\n  \"reads\": [\n   \"thermal_mass_parameter_35\",\n   \"heat_transfer_coefficient_39\",\n   \"heat_loss_parameter_40\",\n   \"total_gains_84\",\n   \"utilisation_factor_89\",\n   \"average_external_temperature_96\",\n   \"heating_control_type\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"living_area_fraction_91\": {\n  \"reads\": [\n   \"living_area\",\n   \"total_floor_area_4\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"mean_internal_temperature_92\": {\n  \"reads\": [\n   \"mean_internal_living_temperature_87\",\n   \"mean_internal_rest_temperature_90\",\n   \"living_area_fraction_91\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"adjusted_mean_internal_temperature_93\": {\n  \"reads\": [\n   \"mean_internal_temperature_92\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\u00B0C\"\n },\n \"utilisation_factor_94\": {\n  \"reads\": [\n   \"thermal_mass_parameter_35\",\n   \"heat_transfer_coefficient_39\",\n   \"heat_loss_parameter_40\",\n   \"total_gains_84\",\n   \"adjusted_mean_internal_temperature_93\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"useful_gains_95\": {\n  \"reads\": [\n   \"total_gains_84\",\n   \"utilisation_factor_94\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"heat_loss_rate_97\": {\n  \"reads\": [\n   \"heat_transfer_coefficient_39\",\n   \"adjusted_mean_internal_temperature_93\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"space_heating_98a\": {\n  \"reads\": [\n   \"days_in_month_41\",\n   \"useful_gains_95\",\n   \"heat_loss_rate_97\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"solar_space_heating_98b\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"space_heating_98c\": {\n  \"reads\": [\n   \"space_heating_98a\",\n   \"solar_space_heating_98b\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"space_heating_99\": {\n  \"reads\": [\n   \"total_floor_area_4\",\n   \"space_heating_98c\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / m ** 2 / month\"\n },\n \"heat_loss_rate_100\": {\n  \"reads\": [\n   \"heat_transfer_coefficient_39\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"total_gains_103\": {\n  \"reads\": [\n   \"total_gains_84\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"utilisation_factor_101\": {\n  \"reads\": [\n   \"thermal_mass_parameter_35\",\n   \"heat_transfer_coefficient_39\",\n   \"heat_loss_parameter_40\",\n   \"total_gains_103\",\n   \"average_external_temperature_96\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"useful_loss_102\": {\n  \"reads\": [\n   \"heat_loss_rate_100\",\n   \"utilisation_factor_101\"\n  ],\n  \"partial\": false,\n  \"unit\": \"W\"\n },\n \"space_cooling_requirement_104\": {\n  \"reads\": [\n   \"days_in_month_41\",\n   \"useful_loss_102\",\n   \"total_gains_103\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"cooled_fraction_105\": {\n  \"reads\": [\n   \"total_floor_area_4\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"intermittency_factor_106\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"space_cooling_requirement_107\": {\n  \"reads\": [\n   \"space_cooling_requirement_104\",\n   \"cooled_fraction_105\",\n   \"intermittency_factor_106\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"space_cooling_requirement_108\": {\n  \"reads\": [\n   \"total_floor_area_4\",\n   \"space_cooling_requirement_107\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / m ** 2 / a\"\n },\n \"secondary_heat_system_fraction_201\": {\n  \"reads\": [\n   \"first_main_heat_system\",\n   \"has_secondary_heating\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"main_heat_system_fraction_202\": {\n  \"reads\": [\n   \"secondary_heat_system_fraction_201\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"second_main_heat_system_fraction_203\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"first_main_heat_system_fraction_204\": {\n  \"reads\": [\n   \"main_heat_system_fraction_202\",\n   \"second_main_heat_system_fraction_203\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"second_main_heat_system_fraction_205\": {\n  \"reads\": [\n   \"main_heat_system_fraction_202\",\n   \"second_main_heat_system_fraction_203\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"first_main_heat_system_efficiency_206\": {\n  \"reads\": [\n   \"first_main_heat_system\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"second_main_heat_system_efficiency_207\": {\n  \"reads\": [\n   \"second_main_heat_system\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"secondary_heat_system_efficiency_208\": {\n  \"reads\": [\n   \"secondary_heat_system\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"cooling_system_efficiency_209\": {\n  \"reads\": [\n   \"air_conditioner_efficiency\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"first_main_heat_system_fuel_211\": {\n  \"reads\": [\n   \"space_heating_98c\",\n   \"first_main_heat_system_fraction_204\",\n   \"first_main_heat_system_efficiency_206\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"first_main_heat_system_fuel_211_sum\": {\n  \"reads\": [\n   \"first_main_heat_system_fuel_211\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"second_main_heat_system_fuel_213\": {\n  \"reads\": [\n   \"space_heating_98c\",\n   \"second_main_heat_system_fraction_205\",\n   \"second_main_heat_system_efficiency_207\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"secondary_heat_system_fuel_215\": {\n  \"reads\": [\n   \"space_heating_98c\",\n   \"secondary_heat_system_fraction_201\",\n   \"secondary_heat_system_efficiency_208\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_heater_efficiency_217\": {\n  \"reads\": [\n   \"water_heater_system\",\n   \"water_heater_output_64\",\n   \"space_heating_98c\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"water_heater_fuel_219\": {\n  \"reads\": [\n   \"water_heater_output_64\",\n   \"water_heater_efficiency_217\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"water_heater_fuel_219_sum\": {\n  \"reads\": [\n   \"water_heater_fuel_219\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"space_cooling_fuel_221\": {\n  \"reads\": [\n   \"space_cooling_requirement_107\",\n   \"cooling_system_efficiency_209\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"mechanical_ventilation_fans_230a\": {\n  \"reads\": [\n   \"ventilation_system\",\n   \"dwelling_volume_5\",\n   \"mvhr_air_change_rate_23b\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"total_electricity_231\": {\n  \"reads\": [\n   \"first_main_heat_system\",\n   \"first_main_heat_system_fuel\",\n   \"mechanical_ventilation_fans_230a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"electricity_for_lighting_232\": {\n  \"reads\": [\n   \"building_elements\",\n   \"total_floor_area_4\",\n   \"days_in_month_41\",\n   \"assumed_occupancy_42\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"water_heating_electric_243\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"pv_energy_used_233a\": {\n  \"reads\": [\n   \"region\",\n   \"building_elements\",\n   \"pv_peak_power\",\n   \"pv_overshading\",\n   \"pv_orientation\",\n   \"pv_pitch\",\n   \"total_floor_area_4\",\n   \"days_in_month_41\",\n   \"assumed_occupancy_42\",\n   \"water_electric_shower_64a\",\n   \"first_main_heat_system_fuel\",\n   \"first_main_heat_system_fuel_211\",\n   \"second_main_heat_system_fuel\",\n   \"second_main_heat_system_fuel_213\",\n   \"secondary_heat_system_fuel\",\n   \"secondary_heat_system_fuel_215\",\n   \"water_heater_fuel\",\n   \"water_heater_fuel_219\",\n   \"total_electricity_231\",\n   \"battery_capacity\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / month\"\n },\n \"pv_energy_used_233a_sum\": {\n  \"reads\": [\n   \"pv_energy_used_233a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"total_delivered_energy_238\": {\n  \"reads\": [\n   \"first_main_heat_system_fuel_211\",\n   \"second_main_heat_system_fuel_213\",\n   \"secondary_heat_system_fuel_215\",\n   \"water_heater_fuel_219\",\n   \"space_cooling_fuel_221\",\n   \"total_electricity_231\",\n   \"electricity_for_lighting_232\",\n   \"pv_energy_used_233a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kWh / a\"\n },\n \"first_main_heat_system_cost_240e\": {\n  \"reads\": [\n   \"first_main_heat_system_fuel\",\n   \"first_main_heat_system_fuel_211\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"second_main_heat_system_cost_241e\": {\n  \"reads\": [\n   \"second_main_heat_system_fuel\",\n   \"second_main_heat_system_fuel_213\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"secondary_heat_system_cost_242e\": {\n  \"reads\": [\n   \"secondary_heat_system_fuel\",\n   \"secondary_heat_system_fuel_215\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"water_heater_cost_247\": {\n  \"reads\": [\n   \"water_heater_fuel\",\n   \"water_heater_fuel_219\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"space_cooling_cost_248\": {\n  \"reads\": [\n   \"space_cooling_fuel\",\n   \"space_cooling_fuel_221\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"energy_for_lighting_250\": {\n  \"reads\": [\n   \"lighting_fuel\",\n   \"electricity_for_lighting_232\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"pumps_and_fans_cost_249\": {\n  \"reads\": [\n   \"total_electricity_231\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"standing_charges_251\": {\n  \"reads\": [\n   \"first_main_heat_system_fuel\",\n   \"second_main_heat_system_fuel\",\n   \"secondary_heat_system_fuel\",\n   \"water_heater_fuel\",\n   \"first_main_heat_system_cost_240e\",\n   \"second_main_heat_system_cost_241e\",\n   \"secondary_heat_system_cost_242e\",\n   \"water_heater_cost_247\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"energy_saving_technologies_252\": {\n  \"reads\": [\n   \"pv_energy_used_233a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"total_energy_cost_255\": {\n  \"reads\": [\n   \"first_main_heat_system_cost_240e\",\n   \"second_main_heat_system_cost_241e\",\n   \"secondary_heat_system_cost_242e\",\n   \"water_heater_cost_247\",\n   \"space_cooling_cost_248\",\n   \"pumps_and_fans_cost_249\",\n   \"energy_for_lighting_250\",\n   \"standing_charges_251\",\n   \"energy_saving_technologies_252\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"energy_cost_deflator_256\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"energy_cost_factor_257\": {\n  \"reads\": [\n   \"total_floor_area_4\",\n   \"total_energy_cost_255\",\n   \"energy_cost_deflator_256\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / m ** 2 / a\"\n },\n \"sap_rating_258\": {\n  \"reads\": [\n   \"energy_cost_factor_257\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"first_main_heat_system_co2_261\": {\n  \"reads\": [\n   \"first_main_heat_system_fuel\",\n   \"first_main_heat_system_fuel_211\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"second_main_heat_system_co2_262\": {\n  \"reads\": [\n   \"second_main_heat_system_fuel\",\n   \"second_main_heat_system_fuel_213\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"secondary_heat_system_co2_263\": {\n  \"reads\": [\n   \"secondary_heat_system_fuel\",\n   \"secondary_heat_system_fuel_215\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"water_heater_co2_264\": {\n  \"reads\": [\n   \"water_heater_fuel\",\n   \"water_heater_fuel_219\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"space_cooling_co2_266\": {\n  \"reads\": [\n   \"space_cooling_fuel\",\n   \"space_cooling_fuel_221\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"pumps_and_fans_co2_267\": {\n  \"reads\": [\n   \"total_electricity_231\",\n   \"days_in_month_41\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"energy_for_lighting_co2_268\": {\n  \"reads\": [\n   \"building_elements\",\n   \"lighting_fuel\",\n   \"total_floor_area_4\",\n   \"days_in_month_41\",\n   \"assumed_occupancy_42\",\n   \"electricity_for_lighting_232\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"energy_generating_co2_269\": {\n  \"reads\": [\n   \"pv_energy_used_233a\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"total_energy_co2_272\": {\n  \"reads\": [\n   \"first_main_heat_system_co2_261\",\n   \"second_main_heat_system_co2_262\",\n   \"secondary_heat_system_co2_263\",\n   \"water_heater_co2_264\",\n   \"space_cooling_co2_266\",\n   \"pumps_and_fans_co2_267\",\n   \"energy_for_lighting_co2_268\",\n   \"energy_generating_co2_269\"\n  ],\n  \"partial\": false,\n  \"unit\": \"kg / a\"\n },\n \"furbnow_battery_stored\": {\n  \"reads\": [],\n  \"partial\": true,\n  \"unit\": \"kWh / a\"\n },\n \"furbnow_pv_used\": {\n  \"reads\": [],\n  \"partial\": true,\n  \"unit\": \"kWh / a\"\n },\n \"furbnow_heat_pump_scop\": {\n  \"reads\": [],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"furbnow_corrected_energy_cost\": {\n  \"reads\": [\n   \"water_heater_cost_247\",\n   \"total_energy_cost_255\",\n   \"first_main_heat_system_cost_240e\",\n   \"water_heater_system\",\n   \"water_heater_efficiency_217\",\n   \"first_main_heat_system\",\n   \"first_main_heat_system_efficiency_206\"\n  ],\n  \"partial\": false,\n  \"unit\": \"GBP / a\"\n },\n \"furbnow_corrected_sap_rating\": {\n  \"reads\": [\n   \"total_floor_area_4\",\n   \"furbnow_corrected_energy_cost\"\n  ],\n  \"partial\": false,\n  \"unit\": \"\"\n },\n \"furbnow_bills\": {\n  \"reads\": [],\n  \"partial\": true,\n  \"unit\": \"GBP / a\"\n },\n \"furbnow_corrected_bills\": {\n  \"reads\": [\n   \"first_main_heat_system\",\n   \"first_main_heat_system_efficiency_206\",\n   \"water_heater_system\",\n   \"water_heater_efficiency_217\"\n  ],\n  \"partial\": true,\n  \"unit\": \"GBP / a\"\n }\n}\n", "// The worksheet as numbered lines, for the design tool's Worksheet tab: each\n// line the engine computed, with its SAP number, name, formula (formulas.ts),\n// value and unit (worksheet-flow.json, from the Python goldens).\n\nimport tolerances from \"../../../apps/twin/tolerances.json\";\nimport { type Formula, FORMULAS } from \"./formulas\";\nimport { magnitude } from \"./inputs\";\nimport { roundTo } from \"./numeric\";\nimport type { WorksheetInput, WorksheetResults } from \"./worksheet\";\nimport flowJson from \"./worksheet-flow.json\";\n\nexport type LineKey = keyof WorksheetResults;\n\nexport interface FlowEntry {\n  reads: readonly string[];\n  partial: boolean;\n  unit: string;\n}\n\nexport const FLOW: Readonly<Record<string, FlowEntry>> = flowJson;\n\nexport interface Section {\n  id: string;\n  number: string;\n  title: string;\n}\n\nexport const SECTIONS: readonly Section[] = [\n  { id: \"dimensions\", number: \"1\", title: \"Dimensions\" },\n  { id: \"ventilation\", number: \"2\", title: \"Ventilation\" },\n  { id: \"losses\", number: \"3\", title: \"Heat losses\" },\n  { id: \"water\", number: \"4\", title: \"Water heating\" },\n  { id: \"gains\", number: \"5\", title: \"Internal gains\" },\n  { id: \"solar\", number: \"6\", title: \"Solar gains\" },\n  { id: \"temperature\", number: \"7\", title: \"Mean internal temperature\" },\n  { id: \"heating\", number: \"8\", title: \"Space heating\" },\n  { id: \"cooling\", number: \"8c\", title: \"Space cooling\" },\n  { id: \"energy\", number: \"9\", title: \"Energy requirements\" },\n  { id: \"costs\", number: \"10\", title: \"Fuel costs\" },\n  { id: \"rating\", number: \"11\", title: \"SAP rating\" },\n  { id: \"co2\", number: \"12\", title: \"CO\u2082 emissions\" },\n  { id: \"primary\", number: \"13\", title: \"Primary energy\" },\n  { id: \"furbnow\", number: \"F\", title: \"Furbnow adjustments\" },\n];\n\n/** The first line number of each section, in order. */\nconst SECTION_STARTS: readonly [number, string][] = [\n  [1, \"dimensions\"],\n  [6, \"ventilation\"],\n  [26, \"losses\"],\n  [42, \"water\"],\n  [66, \"gains\"],\n  [74, \"solar\"],\n  [85, \"temperature\"],\n  [94, \"heating\"],\n  [100, \"cooling\"],\n  [201, \"energy\"],\n  [240, \"costs\"],\n  [256, \"rating\"],\n  [261, \"co2\"],\n  [273, \"primary\"],\n];\n\nexport const MONTHS = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nexport type Part =\n  | { kind: \"text\"; text: string }\n  | { kind: \"line\"; key: LineKey }\n  | { kind: \"input\"; name: string };\n\nexport interface Line {\n  key: LineKey;\n  /** As the worksheet prints it, \"(6a)\"; \"\" for a line SAP doesn't number. */\n  number: string;\n  section: string;\n  name: string;\n  parts: Part[];\n  /** Every line and input the formula names. */\n  reads: string[];\n  note: string;\n  /** The Python engine's unit, \"W / K\". */\n  unit: string;\n  value: unknown;\n}\n\nconst NUMBERED = /_(\\d+)([a-z]?)(_sum)?$/;\n\nexport function numberOf(key: string): {\n  label: string;\n  sort: number;\n  section: string;\n} {\n  if (key.startsWith(\"furbnow_\")) {\n    return { label: \"\", sort: 1000, section: \"furbnow\" };\n  }\n  const match = NUMBERED.exec(key);\n  if (!match) {\n    return { label: \"\", sort: 0, section: \"dimensions\" };\n  }\n  const line = Number(match[1]);\n  const letter = match[2] ?? \"\";\n  const section =\n    [...SECTION_STARTS].reverse().find(([start]) => line >= start)?.[1] ??\n    \"dimensions\";\n  return {\n    label: `(${line}${letter})`,\n    sort: line + (letter ? (letter.charCodeAt(0) - 96) / 100 : 0),\n    section,\n  };\n}\n\nconst TOKEN = /\\{([a-z0-9_]+)\\}/g;\n\nexport function isLine(name: string): name is LineKey {\n  return name in FORMULAS;\n}\n\n/** The formula's text and the lines and inputs it names, in order. */\nexport function parseFormula(key: LineKey, formula: string): Part[] {\n  const parts: Part[] = [];\n  let at = 0;\n  for (const match of formula.matchAll(TOKEN)) {\n    const name = match[1] ?? \"\";\n    if (match.index > at) {\n      parts.push({ kind: \"text\", text: formula.slice(at, match.index) });\n    }\n    // A line that reads an input of its own name, as (9) does, reads the input.\n    parts.push(\n      isLine(name) && name !== key\n        ? { kind: \"line\", key: name }\n        : { kind: \"input\", name },\n    );\n    at = match.index + match[0].length;\n  }\n  if (at < formula.length) {\n    parts.push({ kind: \"text\", text: formula.slice(at) });\n  }\n  return parts;\n}\n\nexport function readsOf(parts: readonly Part[]): string[] {\n  const names = parts.flatMap((part) =>\n    part.kind === \"line\"\n      ? [part.key]\n      : part.kind === \"input\"\n        ? [part.name]\n        : [],\n  );\n  return [...new Set(names)];\n}\n\nexport function formulaOf(key: LineKey): Formula {\n  return FORMULAS[key];\n}\n\n/** Every line the engine computed, in worksheet order. */\nexport function worksheetLines(results: WorksheetResults): Line[] {\n  const order = Object.keys(FLOW);\n  return (Object.keys(results) as LineKey[])\n    .filter(isLine)\n    .map((key) => {\n      const formula = FORMULAS[key];\n      const parts = parseFormula(key, formula.formula);\n      const numbered = numberOf(key);\n      return {\n        line: {\n          key,\n          number: numbered.label,\n          section: numbered.section,\n          name: formula.name,\n          parts,\n          reads: readsOf(parts),\n          note: formula.note ?? \"\",\n          unit: FLOW[key]?.unit ?? \"\",\n          value: results[key],\n        },\n        sort: numbered.sort,\n        index: order.indexOf(key),\n      };\n    })\n    .sort((a, b) => a.sort - b.sort || a.index - b.index)\n    .map(({ line }) => line);\n}\n\nconst UNITS: Record<string, string> = {\n  \"1 / h\": \"ach\",\n  \"m ** 2\": \"m\u00B2\",\n  \"m ** 3\": \"m\u00B3\",\n  \"m ** 3 / h\": \"m\u00B3/h\",\n  \"m / s\": \"m/s\",\n  l: \"litres\",\n  \"l / d\": \"l/day\",\n  \"W / K\": \"W/K\",\n  \"W / K / m ** 2\": \"W/m\u00B2K\",\n  \"kJ / K / m ** 2\": \"kJ/m\u00B2K\",\n  \"GBP / a\": \"\u00A3/yr\",\n  \"GBP / m ** 2 / a\": \"\u00A3/m\u00B2yr\",\n  \"kWh / a\": \"kWh/yr\",\n  \"kWh / d\": \"kWh/day\",\n  \"kWh / month\": \"kWh/mo\",\n  \"kWh / m ** 2 / a\": \"kWh/m\u00B2yr\",\n  // Python's (99) keeps the months' unit on a year's sum.\n  \"kWh / m ** 2 / month\": \"kWh/m\u00B2yr\",\n  \"kg / a\": \"kg/yr\",\n};\n\nexport function displayUnit(unit: string): string {\n  return UNITS[unit] ?? unit.replaceAll(\" ** 2\", \"\u00B2\").replaceAll(\" / \", \"/\");\n}\n\n/** Lines whose months add up to a year; the rest average. */\nexport function sums(key: string, unit: string): boolean {\n  return unit.endsWith(\"/ month\") || key === \"days_in_month_41\";\n}\n\n/** The year's figure for a line of months. */\nexport function annual(key: string, unit: string, months: readonly number[]) {\n  const total = months.reduce((sum, month) => sum + month, 0);\n  return sums(key, unit) ? total : total / months.length;\n}\n\nexport function isMonthly(value: unknown): value is number[] {\n  return (\n    Array.isArray(value) &&\n    value.length === 12 &&\n    value.every((month) => typeof month === \"number\")\n  );\n}\n\nconst FIGURE_SPACE = \"\u2007\";\n\n/** Fixed places so decimals line up; whole numbers pad where the places were. */\nexport function formatNumber(value: number, places = 3): string {\n  if (Number.isInteger(value) && places > 0) {\n    return `${(value || 0).toLocaleString(\"en-GB\")}${FIGURE_SPACE.repeat(places + 1)}`;\n  }\n  const fixed = value.toLocaleString(\"en-GB\", {\n    minimumFractionDigits: places,\n    maximumFractionDigits: places,\n  });\n  // \u22120.0004 rounds to \"-0.000\".\n  return /^-0\\.0*$/.test(fixed) ? fixed.slice(1) : fixed;\n}\n\n/** A value of any shape as one cell of text. */\nexport function formatValue(value: unknown, places = 3): string {\n  if (value === null || value === undefined) {\n    return \"\u2014\";\n  }\n  if (typeof value === \"number\") {\n    return formatNumber(value, places);\n  }\n  if (typeof value === \"boolean\") {\n    return value ? \"yes\" : \"no\";\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => formatValue(item, places)).join(\", \");\n  }\n  return String(value);\n}\n\n/** \"air_permeability_value_ap50_17\" as \"air permeability value ap50\". */\nexport function inputLabel(name: string): string {\n  return name.replace(/_\\d+[a-z]?$/, \"\").replaceAll(\"_\", \" \");\n}\n\n/** An input's value, short enough to sit in a formula. */\nexport function inputValue(input: Partial<WorksheetInput>, name: string) {\n  const value = (input as Record<string, unknown>)[name];\n  if (name === \"building_elements\" && Array.isArray(value)) {\n    return `${value.length} elements`;\n  }\n  if (Array.isArray(value)) {\n    return value\n      .map((item) =>\n        typeof item === \"number\" ? formatValue(roundTo(item, 2), 2) : \"\u2026\",\n      )\n      .join(\", \");\n  }\n  if (typeof value === \"number\") {\n    return String(roundTo(value, 3));\n  }\n  if (typeof value === \"string\") {\n    return value.replaceAll(\"_\", \" \").toLowerCase();\n  }\n  if (value === null || value === undefined) {\n    return \"none\";\n  }\n  return formatValue(value);\n}\n\n/** The formula as one line of text, inputs at their values. */\nexport function plainFormula(\n  line: Line,\n  input: Partial<WorksheetInput>,\n  numbers: (key: LineKey) => string,\n): string {\n  return line.parts\n    .map((part) => {\n      if (part.kind === \"text\") {\n        return part.text;\n      }\n      if (part.kind === \"line\") {\n        return numbers(part.key);\n      }\n      return `${inputLabel(part.name)} [${inputValue(input, part.name)}]`;\n    })\n    .join(\"\");\n}\n\nconst TOLERANCE: Record<string, string> = tolerances.units;\n\n/**\n * Whether Python's value disagrees with TS's beyond the documented tolerance\n * for its unit (tolerances.json). Python sends \"306.296 W / K\".\n */\nexport function pythonDiffers(\n  unit: string,\n  ts: unknown,\n  python: unknown,\n): boolean {\n  if (python === undefined) {\n    return false;\n  }\n  if (Array.isArray(ts) || Array.isArray(python)) {\n    if (!Array.isArray(ts) || !Array.isArray(python)) {\n      return true;\n    }\n    return (\n      ts.length !== python.length ||\n      ts.some((item, index) => pythonDiffers(unit, item, python[index]))\n    );\n  }\n  if (typeof ts !== \"number\") {\n    return ts !== python && !(ts === null && python === null);\n  }\n  if (python === null || typeof python === \"boolean\") {\n    return true;\n  }\n  const allowed = Number(TOLERANCE[unit] ?? \"0.001\");\n  const thousandths = Math.round(\n    Math.abs(roundTo(ts, 3) - magnitude(python)) * 1000,\n  );\n  return thousandths > Math.round(allowed * 1000);\n}\n\n/** Python's value with its unit stripped, in the shape TS's has. */\nexport function pythonValue(python: unknown): unknown {\n  if (Array.isArray(python)) {\n    return python.map(pythonValue);\n  }\n  if (typeof python === \"string\") {\n    try {\n      return magnitude(python);\n    } catch {\n      return python;\n    }\n  }\n  return python;\n}\n\nfunction csvCell(value: unknown): string {\n  const text = value === null || value === undefined ? \"\" : String(value);\n  return /[\",\\n]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n\nexport function rawNumber(value: unknown): unknown {\n  return typeof value === \"number\" ? roundTo(value, 6) : value;\n}\n\n/** One row per line: number, name, formula, value and each month. */\nexport function toCsv(\n  lines: readonly Line[],\n  input: Partial<WorksheetInput>,\n  python: Readonly<Record<string, unknown>> | null = null,\n): string {\n  const numbers = (key: LineKey) => numberOf(key).label || key;\n  const header = [\n    \"section\",\n    \"line\",\n    \"key\",\n    \"name\",\n    \"formula\",\n    \"unit\",\n    \"value\",\n    ...MONTHS,\n    \"python\",\n  ];\n  const rows = lines.map((line) => {\n    const months = isMonthly(line.value) ? line.value : null;\n    const value = months\n      ? annual(line.key, line.unit, months)\n      : Array.isArray(line.value)\n        ? line.value.map(rawNumber).join(\" \")\n        : line.value;\n    const theirs = python?.[line.key];\n    return [\n      SECTIONS.find((section) => section.id === line.section)?.number ?? \"\",\n      line.number,\n      line.key,\n      line.name,\n      plainFormula(line, input, numbers),\n      displayUnit(line.unit),\n      rawNumber(value),\n      ...(months ? months.map(rawNumber) : MONTHS.map(() => \"\")),\n      theirs === undefined\n        ? \"\"\n        : JSON.stringify(pythonValue(theirs)).replaceAll(\",\", \" \"),\n    ];\n  });\n  const table = [header, ...rows].map((row) => row.map(csvCell).join(\",\"));\n  const note = python\n    ? []\n    : [\n        \"# The python column is empty: Python hadn't answered when this was exported. Export again once the tab shows it.\",\n      ];\n  return `${[...table, ...note].join(\"\\n\")}\\n`;\n}\n", "// The editor's Worksheet tab: every SAP line the engine computed for the scene\n// on show, as it is or with the package picked, with Python's value beside a\n// line where the two engines differ. Staff only; opened from the toolbar.\n\nimport type { AlpineComponent } from \"alpinejs\";\nimport {\n  type WorksheetInput,\n  type WorksheetResults,\n  worksheet,\n} from \"../calc/worksheet\";\nimport {\n  type Line,\n  type LineKey,\n  MONTHS,\n  SECTIONS,\n  annual,\n  displayUnit,\n  formatValue,\n  inputLabel,\n  inputValue,\n  isMonthly,\n  numberOf,\n  plainFormula,\n  pythonDiffers,\n  pythonValue,\n  rawNumber,\n  sums,\n  toCsv,\n  worksheetLines,\n} from \"../calc/worksheetlines\";\nimport { getCookie } from \"./api\";\nimport type { Patch, Prepared } from \"./heatloss\";\n\nexport type Which = \"asis\" | \"package\";\n\n/** What the editor hands over when the tab opens. */\nexport interface WorksheetSources {\n  asIs: WorksheetInput;\n  proposed: WorksheetInput | null;\n  packageLabel: string;\n  /** The package's figures haven't caught up with the plan, so it's left out. */\n  packageStale: boolean;\n}\n\n/** The scene as it is, and with the package picked in Scenarios, if any. */\nexport function worksheetSources(\n  prepared: Prepared,\n  view: {\n    patches(): Patch[];\n    picks(): { label: string }[];\n    explorer: { prepared: Prepared };\n  } | null,\n  current = true,\n): WorksheetSources {\n  const patches = current ? (view?.patches() ?? []) : [];\n  return {\n    asIs: prepared.input(),\n    // The package's own Prepared, so its lines are the ones its figures came from.\n    proposed:\n      view && patches.length > 0 ? view.explorer.prepared.input(patches) : null,\n    packageStale: !current && (view?.patches().length ?? 0) > 0,\n    packageLabel: view\n      ? view\n          .picks()\n          .map((pick) => pick.label)\n          .join(\" + \")\n      : \"\",\n  };\n}\n\nexport interface ViewPart {\n  kind: \"text\" | \"line\" | \"input\";\n  text: string;\n  /** A line's row id; an input's value. */\n  target: string;\n  title: string;\n}\n\nexport interface Row {\n  key: LineKey;\n  id: string;\n  number: string;\n  name: string;\n  section: string;\n  parts: ViewPart[];\n  /** The value, or a line of months' year: \u03A3 or the average. */\n  value: string;\n  total: \"\" | \"\u03A3\" | \"avg\";\n  unit: string;\n  /** Twelve months, or one per storey. */\n  cells: string[] | null;\n  cellLabels: readonly string[];\n  note: string;\n  python: string;\n  pythonCells: string[] | null;\n  differs: boolean;\n  /** Lower-cased number, key and name, for the search. */\n  haystack: string;\n}\n\nexport interface SectionView {\n  id: string;\n  number: string;\n  title: string;\n  rows: Row[];\n}\n\nconst rowId = (key: string) => `ws-${key}`;\n\nfunction cellsOf(value: unknown): string[] | null {\n  if (!Array.isArray(value) || value.length === 0) {\n    return null;\n  }\n  return value.map((item) => formatValue(item));\n}\n\nfunction headline(line: Line, value: unknown) {\n  if (isMonthly(value)) {\n    return {\n      value: formatValue(annual(line.key, line.unit, value)),\n      total: sums(line.key, line.unit) ? (\"\u03A3\" as const) : (\"avg\" as const),\n    };\n  }\n  if (Array.isArray(value) && value.every((item) => typeof item === \"number\")) {\n    return {\n      value: formatValue(value.reduce((sum, item) => sum + item, 0)),\n      total: \"\u03A3\" as const,\n    };\n  }\n  return { value: formatValue(value), total: \"\" as const };\n}\n\n/** The rows on show, Python's values beside them once they've come. */\nexport function buildRows(\n  lines: readonly Line[],\n  input: Partial<WorksheetInput>,\n  python: Readonly<Record<string, unknown>> | null,\n): Row[] {\n  const byKey = new Map(lines.map((line) => [line.key, line]));\n  return lines.map((line) => {\n    const theirs = python?.[line.key];\n    const differs =\n      python !== null && pythonDiffers(line.unit, line.value, theirs);\n    const mine = headline(line, line.value);\n    const pythonShown = differs ? pythonValue(theirs) : undefined;\n    return {\n      key: line.key,\n      id: rowId(line.key),\n      number: line.number,\n      name: line.name,\n      section: line.section,\n      parts: line.parts.map((part): ViewPart => {\n        if (part.kind === \"text\") {\n          return { kind: \"text\", text: part.text, target: \"\", title: \"\" };\n        }\n        if (part.kind === \"line\") {\n          const target = byKey.get(part.key);\n          const monthly = target && isMonthly(target.value);\n          return {\n            kind: \"line\",\n            text: `${target?.number || target?.name.toLowerCase() || part.key}${monthly ? \"m\" : \"\"}`,\n            target: rowId(part.key),\n            title: target?.name ?? part.key,\n          };\n        }\n        return {\n          kind: \"input\",\n          text: inputLabel(part.name),\n          target: inputValue(input, part.name),\n          title: `Input ${part.name}`,\n        };\n      }),\n      value: mine.value,\n      total: mine.total,\n      unit: displayUnit(line.unit),\n      cells: cellsOf(line.value),\n      cellLabels: isMonthly(line.value)\n        ? MONTHS\n        : (Array.isArray(line.value) ? line.value : []).map(\n            (_item, index) => `Floor ${index + 1}`,\n          ),\n      note: line.note,\n      python:\n        pythonShown === undefined ? \"\" : headline(line, pythonShown).value,\n      pythonCells: differs ? cellsOf(pythonShown) : null,\n      differs,\n      haystack: `${line.number} ${line.key} ${line.name}`.toLowerCase(),\n    };\n  });\n}\n\nexport function sectionsOf(rows: readonly Row[]): SectionView[] {\n  return SECTIONS.map((section) => ({\n    ...section,\n    rows: rows.filter((row) => row.section === section.id),\n  }));\n}\n\n/** Whether a row answers the search: a line number, or words of its name or key. */\nexport function matches(row: Row, query: string): boolean {\n  const wanted = query.trim().toLowerCase().replace(/[()]/g, \"\");\n  if (!wanted) {\n    return true;\n  }\n  const number = /^(\\d+)([a-z]?)$/.exec(wanted);\n  if (number) {\n    const own = row.number.replace(/[()]/g, \"\");\n    // \"6\" finds (6a)\u2013(6f); \"6a\" only (6a).\n    return number[2] ? own === wanted : own.replace(/[a-z]$/, \"\") === wanted;\n  }\n  return wanted.split(/\\s+/).every((word) => row.haystack.includes(word));\n}\n\n/** Tab-separated, to paste into a spreadsheet beside BRE's worksheet. */\nexport function tsv(\n  lines: readonly Line[],\n  input: Partial<WorksheetInput>,\n): string {\n  return lines\n    .map((line) => {\n      const value = line.value;\n      const months = isMonthly(value) ? value : null;\n      return [\n        line.number,\n        line.name,\n        plainFormula(line, input, (key) => numberOf(key).label || key),\n        months\n          ? annual(line.key, line.unit, months)\n          : formatValue(value).trim(),\n        displayUnit(line.unit),\n        ...(months ?? []).map(rawNumber),\n      ].join(\"\\t\");\n    })\n    .join(\"\\n\");\n}\n\nasync function fetchPython(\n  url: string,\n  input: WorksheetInput,\n): Promise<Record<string, unknown>> {\n  const response = await fetch(url, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      \"X-CSRFToken\": getCookie(\"csrftoken\"),\n    },\n    body: JSON.stringify(input),\n  });\n  const body: unknown = await response.json().catch(() => ({}));\n  if (!response.ok) {\n    const detail =\n      typeof body === \"object\" && body !== null && \"detail\" in body\n        ? String(body.detail)\n        : `${response.status}`;\n    throw new Error(detail);\n  }\n  return body as Record<string, unknown>;\n}\n\ninterface Computed {\n  input: WorksheetInput;\n  results: WorksheetResults;\n  lines: Line[];\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  open: boolean;\n  which: Which;\n  hasPackage: boolean;\n  packageStale: boolean;\n  packageLabel: string;\n  error: string;\n  query: string;\n  onlyDiffs: boolean;\n  sections: SectionView[];\n  generation: number;\n  shown: Record<string, boolean>;\n  matched: number;\n  flash: string;\n  back: string[];\n  copied: string;\n  pythonStatus: \"\" | \"loading\" | \"ready\" | \"error\";\n  pythonMessage: string;\n  diffCount: number;\n  months: readonly string[];\n  show(sources: WorksheetSources): void;\n  close(): void;\n  setWhich(which: Which): void;\n  filter(): void;\n  sectionShown(id: string): boolean;\n  goto(id: string, from?: string): void;\n  goBack(): void;\n  copyRow(key: string): void;\n  copySection(id: string): void;\n  exportCsv(): void;\n  backLabel(): string;\n  key(event: KeyboardEvent): void;\n  render(): void;\n  loadPython(which: Which, input: WorksheetInput): void;\n  copy(text: string, what: string): void;\n  destroy(): void;\n}\n\nexport default (): AlpineComponent<State> => {\n  let sources: WorksheetSources | null = null;\n  const computed: Partial<Record<Which, Computed>> = {};\n  const python: Partial<Record<Which, Record<string, unknown>>> = {};\n  let onKey: ((event: KeyboardEvent) => void) | null = null;\n  // Each fetch is tagged, so one from an earlier open can't fill a later one.\n  const pythonFetch: Record<Which, number> = { asis: 0, package: 0 };\n  let flashTimer = 0;\n  let copiedTimer = 0;\n\n  const current = (which: Which): Computed | null => {\n    if (computed[which]) {\n      return computed[which];\n    }\n    const input = which === \"asis\" ? sources?.asIs : sources?.proposed;\n    if (!input) {\n      return null;\n    }\n    const results = worksheet(input);\n    computed[which] = { input, results, lines: worksheetLines(results) };\n    return computed[which];\n  };\n\n  return {\n    open: false,\n    which: \"asis\",\n    hasPackage: false,\n    packageStale: false,\n    packageLabel: \"\",\n    error: \"\",\n    query: \"\",\n    onlyDiffs: false,\n    sections: [],\n    generation: 0,\n    shown: {},\n    matched: 0,\n    flash: \"\",\n    back: [],\n    copied: \"\",\n    pythonStatus: \"\",\n    pythonMessage: \"\",\n    diffCount: 0,\n    months: MONTHS,\n\n    show(given) {\n      sources = given;\n      for (const which of [\"asis\", \"package\"] as const) {\n        delete computed[which];\n        delete python[which];\n        pythonFetch[which] += 1;\n      }\n      this.hasPackage = given.proposed !== null;\n      this.packageStale = given.packageStale;\n      this.packageLabel = given.packageLabel;\n      this.which =\n        this.which === \"package\" && this.hasPackage ? \"package\" : \"asis\";\n      this.open = true;\n      this.back = [];\n      this.$dispatch(\"worksheet-state\", true);\n      if (!onKey) {\n        onKey = (event) => this.key(event);\n        // Capture, so the editor's own shortcuts don't act on the plan underneath.\n        window.addEventListener(\"keydown\", onKey, true);\n      }\n      this.render();\n      this.$nextTick(() => this.$refs[\"search\"]?.focus());\n    },\n\n    close() {\n      this.open = false;\n      this.$dispatch(\"worksheet-state\", false);\n      if (onKey) {\n        window.removeEventListener(\"keydown\", onKey, true);\n        onKey = null;\n      }\n    },\n\n    key(event: KeyboardEvent) {\n      if (!this.open) {\n        return;\n      }\n      const search = this.$refs[\"search\"];\n      if (event.key === \"Escape\") {\n        event.preventDefault();\n        if (this.query) {\n          this.query = \"\";\n          this.filter();\n        } else {\n          this.close();\n        }\n      } else if (event.key === \"/\" && event.target !== search) {\n        event.preventDefault();\n        search?.focus();\n      }\n      // Typing still types; only the editor's listeners are kept out.\n      event.stopImmediatePropagation();\n    },\n\n    setWhich(which) {\n      if (which === \"package\" && !this.hasPackage) {\n        return;\n      }\n      this.which = which;\n      this.back = [];\n      this.render();\n    },\n\n    render() {\n      this.error = \"\";\n      let found: Computed | null = null;\n      try {\n        found = current(this.which);\n      } catch (error: unknown) {\n        this.error = error instanceof Error ? error.message : String(error);\n      }\n      const rows = found\n        ? buildRows(found.lines, found.input, python[this.which] ?? null)\n        : [];\n      if (python[this.which]) {\n        this.pythonStatus = \"ready\";\n      }\n      this.diffCount = rows.filter((row) => row.differs).length;\n      this.sections = sectionsOf(rows);\n      this.generation += 1;\n      this.filter();\n      if (found && !python[this.which]) {\n        this.loadPython(this.which, found.input);\n      }\n    },\n\n    loadPython(which: Which, input: WorksheetInput) {\n      const url = this.$root.dataset[\"pythonUrl\"];\n      if (!url) {\n        return;\n      }\n      this.pythonStatus = \"loading\";\n      const token = ++pythonFetch[which];\n      fetchPython(url, input)\n        .then((lines) => {\n          if (token !== pythonFetch[which]) {\n            return;\n          }\n          python[which] = lines;\n          if (this.which === which && this.open) {\n            this.pythonStatus = \"ready\";\n            this.render();\n          }\n        })\n        .catch((error: unknown) => {\n          if (token === pythonFetch[which] && this.which === which) {\n            this.pythonStatus = \"error\";\n            this.pythonMessage =\n              error instanceof Error ? error.message : String(error);\n          }\n        });\n    },\n\n    filter() {\n      const shown: Record<string, boolean> = {};\n      let matched = 0;\n      for (const section of this.sections) {\n        for (const row of section.rows) {\n          const visible =\n            matches(row, this.query) && (!this.onlyDiffs || row.differs);\n          shown[row.key] = visible;\n          matched += visible ? 1 : 0;\n        }\n      }\n      this.shown = shown;\n      this.matched = matched;\n    },\n\n    sectionShown(id) {\n      const section = this.sections.find((item) => item.id === id);\n      return Boolean(section?.rows.some((row) => this.shown[row.key]));\n    },\n\n    goto(id, from = \"\") {\n      const key = id.replace(/^ws-/, \"\");\n      if (from) {\n        this.back = [...this.back, from];\n      }\n      if (!this.shown[key]) {\n        this.query = \"\";\n        this.onlyDiffs = false;\n        this.filter();\n      }\n      this.$nextTick(() => {\n        document\n          .getElementById(id)\n          ?.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n        this.flash = key;\n        window.clearTimeout(flashTimer);\n        flashTimer = window.setTimeout(() => {\n          this.flash = \"\";\n        }, 1600);\n      });\n    },\n\n    goBack() {\n      const last = this.back.at(-1);\n      if (last) {\n        this.back = this.back.slice(0, -1);\n        this.goto(last);\n      }\n    },\n\n    backLabel() {\n      const last = this.back.at(-1)?.replace(/^ws-/, \"\");\n      const line = current(this.which)?.lines.find((item) => item.key === last);\n      return line ? `Back to ${line.number || line.name}` : \"Back\";\n    },\n\n    copyRow(key) {\n      const found = current(this.which);\n      const line = found?.lines.find((item) => item.key === key);\n      if (found && line) {\n        this.copy(tsv([line], found.input), line.number || line.name);\n      }\n    },\n\n    copySection(id) {\n      const found = current(this.which);\n      const section = SECTIONS.find((item) => item.id === id);\n      if (found && section) {\n        const lines = found.lines.filter(\n          (line) => line.section === id && this.shown[line.key],\n        );\n        this.copy(tsv(lines, found.input), `Section ${section.number}`);\n      }\n    },\n\n    copy(text: string, what: string) {\n      void navigator.clipboard.writeText(text).then(() => {\n        this.copied = `Copied ${what}`;\n        window.clearTimeout(copiedTimer);\n        copiedTimer = window.setTimeout(() => {\n          this.copied = \"\";\n        }, 1500);\n      });\n    },\n\n    exportCsv() {\n      const found = current(this.which);\n      if (!found) {\n        return;\n      }\n      const blob = new Blob(\n        [toCsv(found.lines, found.input, python[this.which] ?? null)],\n        { type: \"text/csv\" },\n      );\n      const link = document.createElement(\"a\");\n      link.href = URL.createObjectURL(blob);\n      link.download = `sap-worksheet-${this.which === \"asis\" ? \"as-is\" : \"package\"}.csv`;\n      link.click();\n      URL.revokeObjectURL(link.href);\n    },\n\n    destroy() {\n      if (onKey) {\n        window.removeEventListener(\"keydown\", onKey, true);\n      }\n    },\n  };\n};\n", "// Rearranging a package's phases. Each change returns new phases; a kind sits\n// in one phase, and the package's own kinds are never dropped.\n\nimport { copyPhase, type Phase, phasesOf } from \"./figures\";\n\nfunction copy(phases: readonly Phase[]): Phase[] {\n  return phases.map(copyPhase);\n}\n\n/**\n * The phases as they'll be kept: kinds no longer packaged or scheduled\n * dropped, repeats dropped, and packaged kinds no phase holds put in the last.\n */\nexport function tidy(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n  scheduled: ReadonlySet<string>,\n): Phase[] {\n  if (phases.length === 0) {\n    return [];\n  }\n  const seen = new Set<string>();\n  const kept = phases.map((phase) => ({\n    ...copyPhase(phase),\n    kinds: phase.kinds.filter((kind) => {\n      const keep =\n        !seen.has(kind) && (packaged.includes(kind) || scheduled.has(kind));\n      seen.add(kind);\n      return keep;\n    }),\n  }));\n  const missing = packaged.filter((kind) => !seen.has(kind));\n  kept[kept.length - 1]?.kinds.push(...missing);\n  return kept;\n}\n\n/** `kind` into phase `index`, out of wherever it was. */\nexport function placed(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n  kind: string,\n  index: number,\n): Phase[] {\n  const next = copy(phasesOf(phases, packaged));\n  for (const phase of next) {\n    phase.kinds = phase.kinds.filter((other) => other !== kind);\n  }\n  next[Math.max(0, Math.min(next.length - 1, index))]?.kinds.push(kind);\n  return next;\n}\n\nexport function without(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n  kind: string,\n): Phase[] {\n  return copy(phasesOf(phases, packaged)).map((phase) => ({\n    ...phase,\n    kinds: phase.kinds.filter((other) => other !== kind),\n  }));\n}\n\nexport function added(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n): Phase[] {\n  return [...copy(phasesOf(phases, packaged)), { name: \"\", kinds: [] }];\n}\n\n/** Phase `index` gone, its kinds into the one before it (or after, for the first). */\nexport function removed(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n  index: number,\n): Phase[] {\n  const next = copy(phasesOf(phases, packaged));\n  const [gone] = next.splice(index, 1);\n  if (next.length === 0 || !gone) {\n    return [];\n  }\n  next[Math.max(0, index - 1)]?.kinds.push(...gone.kinds);\n  return next;\n}\n\nexport function moved(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n  index: number,\n  delta: number,\n): Phase[] {\n  const next = copy(phasesOf(phases, packaged));\n  const target = index + delta;\n  if (target < 0 || target >= next.length) {\n    return next;\n  }\n  const [phase] = next.splice(index, 1);\n  if (phase) {\n    next.splice(target, 0, phase);\n  }\n  return next;\n}\n\nexport function renamed(\n  phases: readonly Phase[],\n  packaged: readonly string[],\n  index: number,\n  name: string,\n): Phase[] {\n  const next = copy(phasesOf(phases, packaged));\n  const phase = next[index];\n  if (phase) {\n    phase.name = name.trim().slice(0, 80);\n  }\n  return next;\n}\n", "// One hue, light to dark, for a room's design heat loss per m\u00B2 of floor. Pink,\n// because no measure category (catalog.ts) is pink: amber is what a scenario treats.\n\n/** Pink 50 \u2192 800: [W/m\u00B2, hex]. */\nexport const HEAT_STOPS: [number, string][] = [\n  [0, \"#fdf2f8\"],\n  [25, \"#fce7f3\"],\n  [50, \"#fbcfe8\"],\n  [75, \"#f9a8d4\"],\n  [100, \"#f472b6\"],\n  [125, \"#db2777\"],\n  [150, \"#be185d\"],\n  [200, \"#9d174d\"],\n];\n\nfunction channels(hex: string): [number, number, number] {\n  const value = Number.parseInt(hex.slice(1), 16);\n  return [(value >> 16) & 255, (value >> 8) & 255, value & 255];\n}\n\nexport function heatColor(wattsPerM2: number): string {\n  const first = HEAT_STOPS[0] as [number, string];\n  if (wattsPerM2 <= first[0]) {\n    return first[1];\n  }\n  for (let index = 1; index < HEAT_STOPS.length; index++) {\n    const [high, highColor] = HEAT_STOPS[index] as [number, string];\n    const [low, lowColor] = HEAT_STOPS[index - 1] as [number, string];\n    if (wattsPerM2 <= high) {\n      const t = (wattsPerM2 - low) / (high - low);\n      const a = channels(lowColor);\n      const b = channels(highColor);\n      const mixed = a.map((channel, i) =>\n        Math.round(channel + ((b[i] ?? 0) - channel) * t),\n      );\n      return `#${mixed.map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")}`;\n    }\n  }\n  return (HEAT_STOPS.at(-1) as [number, string])[1];\n}\n\n/** Dark enough that a label on it needs light text. */\nexport function heatIsDark(wattsPerM2: number): boolean {\n  return wattsPerM2 >= 110;\n}\n", "{\n  \"source\": \"Approved Document O, 2021 edition (England)\",\n  \"glazing\": {\n    \"description\": \"Tables 1.1 and 1.2: maximum glazing, % of floor area, by the orientation of the most glazed facade: [dwelling, most glazed room].\",\n    \"cross\": {\n      \"high\": {\n        \"north\": [15, 37],\n        \"east\": [18, 37],\n        \"south\": [15, 22],\n        \"west\": [18, 37]\n      },\n      \"moderate\": {\n        \"north\": [18, 37],\n        \"east\": [18, 37],\n        \"south\": [15, 30],\n        \"west\": [11, 22]\n      }\n    },\n    \"single\": {\n      \"high\": {\n        \"north\": [15, 26],\n        \"east\": [11, 18],\n        \"south\": [11, 11],\n        \"west\": [11, 18]\n      },\n      \"moderate\": {\n        \"north\": [18, 26],\n        \"east\": [18, 26],\n        \"south\": [15, 15],\n        \"west\": [11, 11]\n      }\n    }\n  },\n  \"free_area\": {\n    \"description\": \"Tables 1.3 and 1.4: minimum free area, %: the greater of floor and glazing area for the dwelling, and of a bedroom's floor area.\",\n    \"cross\": {\n      \"high\": {\n        \"floor\": 6,\n        \"glazing\": 70,\n        \"bedroom\": 13\n      },\n      \"moderate\": {\n        \"floor\": 9,\n        \"glazing\": 55,\n        \"bedroom\": 4\n      }\n    },\n    \"single\": {\n      \"high\": {\n        \"floor\": 10,\n        \"glazing\": 95,\n        \"bedroom\": 13\n      },\n      \"moderate\": {\n        \"floor\": 12,\n        \"glazing\": 80,\n        \"bedroom\": 4\n      }\n    }\n  },\n  \"shading\": {\n    \"description\": \"Paragraph 1.9: in the high risk location, glazing facing north-east to north-west via south is shaded by shutters, glass with g at most 0.4 and light transmittance at least 0.7, or a 50 degree overhang on a due south facade.\",\n    \"max_g\": 0.4,\n    \"min_light_transmittance\": 0.7\n  },\n  \"high_risk\": {\n    \"description\": \"Table C1: postcode districts in the high risk part of London.\",\n    \"postcodes\": [\n      \"CR4\",\n      \"E17\",\n      \"EC3R\",\n      \"KT6\",\n      \"N22\",\n      \"SE8\",\n      \"SE27\",\n      \"SW11\",\n      \"TW10\",\n      \"W1F\",\n      \"W12\",\n      \"CR7\",\n      \"E18\",\n      \"EC3V\",\n      \"KT7\",\n      \"NW1\",\n      \"SE9\",\n      \"SE28\",\n      \"SW12\",\n      \"TW11\",\n      \"W1G\",\n      \"W13\",\n      \"E1\",\n      \"E20\",\n      \"EC4A\",\n      \"KT8\",\n      \"NW2\",\n      \"SE10\",\n      \"SW1A\",\n      \"SW13\",\n      \"TW12\",\n      \"W1H\",\n      \"W14\",\n      \"E1W\",\n      \"EC1A\",\n      \"EC4M\",\n      \"IG11\",\n      \"NW3\",\n      \"SE11\",\n      \"SW1E\",\n      \"SW14\",\n      \"TW13\",\n      \"W1J\",\n      \"WC1A\",\n      \"E2\",\n      \"EC1M\",\n      \"EC4N\",\n      \"N1\",\n      \"NW5\",\n      \"SE12\",\n      \"SW1H\",\n      \"SW15\",\n      \"TW14\",\n      \"W1K\",\n      \"WC1B\",\n      \"E3\",\n      \"EC1N\",\n      \"EC4R\",\n      \"N1C\",\n      \"NW6\",\n      \"SE13\",\n      \"SW1P\",\n      \"SW16\",\n      \"TW15\",\n      \"W1S\",\n      \"WC1E\",\n      \"E4\",\n      \"EC1R\",\n      \"EC4V\",\n      \"N2\",\n      \"NW8\",\n      \"SE14\",\n      \"SW1V\",\n      \"SW17\",\n      \"TW19\",\n      \"W1T\",\n      \"WC1H\",\n      \"E5\",\n      \"EC1V\",\n      \"EC4Y\",\n      \"N4\",\n      \"NW10\",\n      \"SE15\",\n      \"SW1W\",\n      \"SW18\",\n      \"UB1\",\n      \"W1U\",\n      \"WC1N\",\n      \"E6\",\n      \"EC1Y\",\n      \"HA0\",\n      \"N5\",\n      \"NW11\",\n      \"SE16\",\n      \"SW1X\",\n      \"SW19\",\n      \"UB2\",\n      \"W1W\",\n      \"WC1R\",\n      \"E7\",\n      \"EC2A\",\n      \"HA9\",\n      \"N6\",\n      \"RM8\",\n      \"SE17\",\n      \"SW1Y\",\n      \"SW20\",\n      \"UB3\",\n      \"W2\",\n      \"WC1V\",\n      \"E8\",\n      \"EC2M\",\n      \"IG1\",\n      \"N7\",\n      \"RM9\",\n      \"SE18\",\n      \"SW2\",\n      \"TW1\",\n      \"UB4\",\n      \"W3\",\n      \"WC1X\",\n      \"E9\",\n      \"EC2N\",\n      \"IG2\",\n      \"N8\",\n      \"RM10\",\n      \"SE19\",\n      \"SW3\",\n      \"TW2\",\n      \"UB5\",\n      \"W4\",\n      \"WC2A\",\n      \"E10\",\n      \"EC2P\",\n      \"IG3\",\n      \"N9\",\n      \"SE1\",\n      \"SE20\",\n      \"SW4\",\n      \"TW3\",\n      \"UB6\",\n      \"W5\",\n      \"WC2B\",\n      \"E11\",\n      \"EC2R\",\n      \"IG4\",\n      \"N13\",\n      \"SE2\",\n      \"SE21\",\n      \"SW5\",\n      \"TW4\",\n      \"UB7\",\n      \"W6\",\n      \"WC2E\",\n      \"E12\",\n      \"EC2V\",\n      \"KT1\",\n      \"N15\",\n      \"SE3\",\n      \"SE22\",\n      \"SW6\",\n      \"TW5\",\n      \"UB8\",\n      \"W7\",\n      \"WC2H\",\n      \"E13\",\n      \"EC2Y\",\n      \"KT2\",\n      \"N16\",\n      \"SE4\",\n      \"SE23\",\n      \"SW7\",\n      \"TW6\",\n      \"UB11\",\n      \"W8\",\n      \"WC2N\",\n      \"E14\",\n      \"EC3A\",\n      \"KT3\",\n      \"N17\",\n      \"SE5\",\n      \"SE24\",\n      \"SW8\",\n      \"TW7\",\n      \"W1B\",\n      \"W9\",\n      \"WC2R\",\n      \"E15\",\n      \"EC3M\",\n      \"KT4\",\n      \"N18\",\n      \"SE6\",\n      \"SE25\",\n      \"SW9\",\n      \"TW8\",\n      \"W1C\",\n      \"W10\",\n      \"E16\",\n      \"EC3N\",\n      \"KT5\",\n      \"N19\",\n      \"SE7\",\n      \"SE26\",\n      \"SW10\",\n      \"TW9\",\n      \"W1D\",\n      \"W11\"\n    ]\n  },\n  \"elevated\": {\n    \"description\": \"Appendix C note: central Manchester may also have elevated night time temperatures.\",\n    \"postcodes\": [\"M1\", \"M2\", \"M3\", \"M5\", \"M15\", \"M16\", \"M50\"]\n  },\n  \"equivalent_area\": {\n    \"description\": \"Tables D1 to D9: equivalent area, m2, of a hinged window by opening angle (degrees), then hinge length h (m, rows), then opening width w (m, columns).\",\n    \"h\": [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3],\n    \"w\": [0.5, 0.75, 1, 1.25, 1.5],\n    \"angles\": {\n      \"10\": [\n        [0.08, 0.14, 0.18, 0.28, 0.34],\n        [0.11, 0.17, 0.27, 0.34, 0.41],\n        [0.14, 0.23, 0.3, 0.45, 0.54],\n        [0.18, 0.28, 0.38, 0.47, 0.68],\n        [0.21, 0.32, 0.45, 0.57, 0.68],\n        [0.25, 0.37, 0.53, 0.66, 0.79],\n        [0.28, 0.42, 0.56, 0.75, 0.91],\n        [0.32, 0.47, 0.63, 0.85, 1.02],\n        [0.35, 0.53, 0.7, 0.88, 1.13],\n        [0.39, 0.58, 0.77, 0.96, 1.25],\n        [0.42, 0.63, 0.84, 1.05, 1.26]\n      ],\n      \"20\": [\n        [0.13, 0.22, 0.29, 0.43, 0.52],\n        [0.19, 0.28, 0.44, 0.55, 0.66],\n        [0.24, 0.38, 0.5, 0.73, 0.88],\n        [0.29, 0.47, 0.63, 0.79, 1.1],\n        [0.35, 0.53, 0.76, 0.94, 1.13],\n        [0.41, 0.62, 0.88, 1.1, 1.32],\n        [0.47, 0.71, 0.94, 1.26, 1.51],\n        [0.53, 0.8, 1.06, 1.42, 1.7],\n        [0.59, 0.88, 1.18, 1.47, 1.89],\n        [0.65, 0.97, 1.3, 1.62, 2.08],\n        [0.71, 1.06, 1.42, 1.77, 2.12]\n      ],\n      \"30\": [\n        [0.16, 0.27, 0.36, 0.52, 0.62],\n        [0.24, 0.36, 0.54, 0.68, 0.81],\n        [0.3, 0.48, 0.64, 0.9, 1.08],\n        [0.38, 0.6, 0.8, 1.0, 1.36],\n        [0.45, 0.68, 0.96, 1.2, 1.43],\n        [0.53, 0.79, 1.12, 1.4, 1.67],\n        [0.6, 0.9, 1.21, 1.59, 1.91],\n        [0.68, 1.02, 1.36, 1.79, 2.15],\n        [0.75, 1.13, 1.51, 1.88, 2.39],\n        [0.83, 1.24, 1.66, 2.07, 2.63],\n        [0.9, 1.36, 1.81, 2.26, 2.71]\n      ],\n      \"40\": [\n        [0.18, 0.3, 0.4, 0.56, 0.67],\n        [0.27, 0.41, 0.61, 0.76, 0.91],\n        [0.35, 0.55, 0.73, 1.01, 1.21],\n        [0.43, 0.68, 0.91, 1.14, 1.52],\n        [0.52, 0.78, 1.09, 1.36, 1.64],\n        [0.61, 0.91, 1.27, 1.59, 1.91],\n        [0.69, 1.04, 1.38, 1.82, 2.18],\n        [0.78, 1.17, 1.56, 2.05, 2.46],\n        [0.86, 1.3, 1.73, 2.16, 2.73],\n        [0.95, 1.43, 1.9, 2.38, 3.0],\n        [1.04, 1.56, 2.08, 2.59, 3.11]\n      ],\n      \"50\": [\n        [0.2, 0.32, 0.43, 0.59, 0.7],\n        [0.3, 0.44, 0.65, 0.81, 0.97],\n        [0.38, 0.59, 0.79, 1.08, 1.29],\n        [0.47, 0.74, 0.98, 1.23, 1.62],\n        [0.56, 0.85, 1.18, 1.48, 1.77],\n        [0.66, 0.99, 1.38, 1.72, 2.07],\n        [0.75, 1.13, 1.51, 1.97, 2.36],\n        [0.85, 1.27, 1.69, 2.21, 2.66],\n        [0.94, 1.41, 1.88, 2.35, 2.95],\n        [1.04, 1.55, 2.07, 2.59, 3.25],\n        [1.13, 1.69, 2.26, 2.82, 3.39]\n      ],\n      \"60\": [\n        [0.21, 0.34, 0.45, 0.6, 0.72],\n        [0.31, 0.47, 0.67, 0.84, 1.01],\n        [0.4, 0.62, 0.83, 1.12, 1.34],\n        [0.5, 0.78, 1.03, 1.29, 1.68],\n        [0.6, 0.89, 1.24, 1.55, 1.86],\n        [0.7, 1.04, 1.45, 1.81, 2.17],\n        [0.79, 1.19, 1.59, 2.07, 2.48],\n        [0.89, 1.34, 1.79, 2.33, 2.79],\n        [0.99, 1.49, 1.99, 2.48, 3.1],\n        [1.09, 1.64, 2.19, 2.73, 3.41],\n        [1.19, 1.79, 2.38, 2.98, 3.58]\n      ],\n      \"70\": [\n        [0.21, 0.34, 0.46, 0.61, 0.73],\n        [0.32, 0.48, 0.69, 0.86, 1.03],\n        [0.41, 0.64, 0.85, 1.15, 1.37],\n        [0.51, 0.8, 1.07, 1.33, 1.72],\n        [0.62, 0.93, 1.28, 1.6, 1.92],\n        [0.72, 1.08, 1.49, 1.87, 2.24],\n        [0.82, 1.23, 1.65, 2.13, 2.56],\n        [0.93, 1.39, 1.85, 2.4, 2.88],\n        [1.03, 1.54, 2.06, 2.57, 3.2],\n        [1.13, 1.7, 2.26, 2.83, 3.52],\n        [1.23, 1.85, 2.47, 3.09, 3.7]\n      ],\n      \"80\": [\n        [0.22, 0.35, 0.46, 0.61, 0.73],\n        [0.33, 0.49, 0.7, 0.87, 1.04],\n        [0.42, 0.65, 0.87, 1.16, 1.39],\n        [0.53, 0.82, 1.09, 1.36, 1.74],\n        [0.63, 0.95, 1.31, 1.63, 1.96],\n        [0.74, 1.11, 1.53, 1.91, 2.29],\n        [0.84, 1.26, 1.68, 2.18, 2.61],\n        [0.95, 1.42, 1.9, 2.45, 2.94],\n        [1.05, 1.58, 2.11, 2.63, 3.27],\n        [1.16, 1.74, 2.32, 2.9, 3.6],\n        [1.26, 1.9, 2.53, 3.16, 3.79]\n      ],\n      \"90\": [\n        [0.22, 0.35, 0.47, 0.61, 0.74],\n        [0.33, 0.5, 0.7, 0.88, 1.05],\n        [0.43, 0.66, 0.88, 1.17, 1.4],\n        [0.53, 0.83, 1.1, 1.38, 1.76],\n        [0.64, 0.96, 1.33, 1.66, 1.99],\n        [0.75, 1.12, 1.55, 1.93, 2.32],\n        [0.86, 1.28, 1.71, 2.21, 2.65],\n        [0.96, 1.44, 1.93, 2.48, 2.98],\n        [1.07, 1.6, 2.14, 2.67, 3.31],\n        [1.18, 1.76, 2.35, 2.94, 3.64],\n        [1.28, 1.93, 2.57, 3.21, 3.85]\n      ]\n    }\n  }\n}\n", "// Approved Document O's simplified method (Section 1), with Section 3's limits\n// on which openings count. No plan knowledge: assets/ts/design/overheating.ts\n// builds the dwelling from the floors.\n\nimport data from \"../../../apps/twin/parto.json\";\n\nexport type Risk = \"moderate\" | \"high\";\nexport type Cardinal = \"north\" | \"east\" | \"south\" | \"west\";\nexport type Status = \"pass\" | \"fail\" | \"na\";\n\n/** How a window or door opens, for Appendix D's equivalent area. */\nexport type VentStyle =\n  | \"side\"\n  | \"top\"\n  | \"bottom\"\n  | \"pivot\"\n  | \"sash\"\n  | \"slider\"\n  | \"fixed\";\n\n/** What shades a glazed area, per paragraph 1.9. */\nexport type Shading = \"none\" | \"shutters\" | \"overhang\";\n\nexport const CARDINALS: readonly Cardinal[] = [\n  \"north\",\n  \"east\",\n  \"south\",\n  \"west\",\n];\n\n/** An opening's gap, m, above which a fall needs guarding (paragraph 3.9). */\nexport const RESTRICTOR_M = 0.1;\n\nexport interface Opening {\n  id: string;\n  label: string;\n  /** Transparent area, frame excluded, m\u00B2. */\n  glazingM2: number;\n  /** Bearing of its outward face, \u00B0 clockwise from north; null when north isn't set. */\n  bearing: number | null;\n  /** Its outward face in the plan's own frame, for telling fa\u00E7ades apart. */\n  planDeg: number;\n  /** The sash that opens, m: w swings away from the hinge of length h. */\n  vent: { style: VentStyle; widthM: number; heightM: number; angleDeg: number };\n  shading: Shading;\n  gValue: number;\n  lightTransmittance: number;\n  /** Can be left open at night without letting a burglar in (paragraph 3.7). */\n  secure: boolean;\n  /** Opened wider than 100 mm it could let someone fall, unless guarded. */\n  fallRisk: boolean;\n  guarded: boolean;\n}\n\nexport interface Room {\n  id: string;\n  name: string;\n  bedroom: boolean;\n  /** Ground floor or within 2 m of a reachable surface (Appendix A). */\n  accessible: boolean;\n  floorM2: number;\n  /** Open plan: the 4.5 m deep strip off its most glazed fa\u00E7ade (Appendix A). */\n  assessedM2: number;\n  openings: Opening[];\n}\n\nexport interface Dwelling {\n  floorM2: number;\n  risk: Risk;\n  crossVentilated: boolean;\n  rooms: Room[];\n  /** Night noise means windows shut while people sleep (paragraph 3.2). */\n  noise: boolean;\n  pollution: boolean;\n  /** Communal heating with long horizontal runs (paragraph 1.13). */\n  communalHeating: boolean;\n}\n\nexport interface Check {\n  key: string;\n  label: string;\n  status: Status;\n  detail: string;\n}\n\nexport interface RoomResult {\n  id: string;\n  name: string;\n  bedroom: boolean;\n  glazingM2: number;\n  /** Glazing over the room's assessed floor area, %. */\n  glazingPct: number;\n  /** The most glazed room's limit, % (only that room is held to it). */\n  limitPct: number | null;\n  freeM2: number;\n  /** What a bedroom can leave open while people sleep, m\u00B2. */\n  nightM2: number;\n  /** A bedroom's minimum free area, m\u00B2. */\n  requiredM2: number | null;\n  status: Status;\n  notes: string[];\n}\n\nexport interface Assessment {\n  risk: Risk;\n  crossVentilated: boolean;\n  /** Orientation the limits are read at; null when north isn't set. */\n  facade: Cardinal | null;\n  glazingM2: number;\n  glazingPct: number;\n  limitPct: number;\n  mostGlazed: string | null;\n  freeM2: number;\n  requiredM2: number;\n  rooms: RoomResult[];\n  checks: Check[];\n  /** Why this method can't show compliance, so TM59 modelling is needed. */\n  unsuitable: string[];\n  notes: string[];\n  status: Status;\n}\n\nconst TABLES = data.equivalent_area;\nconst ANGLES = Object.keys(TABLES.angles)\n  .map(Number)\n  .sort((a, b) => a - b);\nconst HIGH = new Set(data.high_risk.postcodes);\nconst ELEVATED = new Set(data.elevated.postcodes);\n\ntype Glazing = typeof data.glazing.cross;\n\nfunction round(value: number, places = 1): number {\n  const scale = 10 ** places;\n  return Math.round(value * scale) / scale;\n}\n\n/** The postcode's outward code, upper case: \"SW1A 1AA\" is \"SW1A\". */\nexport function outcode(postcode: string): string {\n  const compact = postcode.replace(/\\s+/g, \"\").toUpperCase();\n  // The inward code is always three characters.\n  return compact.length > 4 ? compact.slice(0, -3) : compact;\n}\n\n/** Paragraph 1.3 and Appendix C: high risk in Table C1, and central Manchester. */\nexport function riskOf(postcode: string): {\n  risk: Risk;\n  manchester: boolean;\n} {\n  const code = outcode(postcode);\n  if (HIGH.has(code)) {\n    return { risk: \"high\", manchester: false };\n  }\n  // Part O says to consider the high risk guidance there; we follow it.\n  if (ELEVATED.has(code)) {\n    return { risk: \"high\", manchester: true };\n  }\n  return { risk: \"moderate\", manchester: false };\n}\n\nexport function cardinal(bearing: number): Cardinal {\n  const turned = ((bearing % 360) + 360) % 360;\n  return CARDINALS[Math.floor(turned / 90 + 0.5) % 4] as Cardinal;\n}\n\n/** Faces north-east to north-west via south: paragraph 1.9's shaded arc. */\nexport function sunward(bearing: number | null): boolean {\n  if (bearing === null) {\n    return true;\n  }\n  const turned = ((bearing % 360) + 360) % 360;\n  return turned >= 45 && turned <= 315;\n}\n\n/** Linear in a dimension past the table's edges, as the area scales with it. */\nfunction along(\n  axis: readonly number[],\n  value: number,\n): [number, number, number] {\n  const first = axis[0] as number;\n  const last = axis.at(-1) as number;\n  if (value <= first) {\n    return [0, 0, value / first];\n  }\n  if (value >= last) {\n    return [axis.length - 1, axis.length - 1, value / last];\n  }\n  const upper = axis.findIndex((point) => point >= value);\n  const low = axis[upper - 1] as number;\n  const high = axis[upper] as number;\n  return [upper - 1, upper, (value - low) / (high - low)];\n}\n\nfunction atAngle(angle: number, hM: number, wM: number): number {\n  const rows = (TABLES.angles as Record<string, number[][]>)[String(angle)];\n  if (!rows) {\n    throw new RangeError(`No Appendix D table at ${angle}\u00B0.`);\n  }\n  const cell = (h: number, w: number) => rows[h]?.[w] ?? 0;\n  const [h0, h1, ht] = along(TABLES.h, hM);\n  const [w0, w1, wt] = along(TABLES.w, wM);\n  // Past an edge, `along` returns a scale rather than a fraction.\n  const hScale = h0 === h1 ? ht : 1;\n  const wScale = w0 === w1 ? wt : 1;\n  const hf = h0 === h1 ? 0 : ht;\n  const wf = w0 === w1 ? 0 : wt;\n  const top = cell(h0, w0) * (1 - wf) + cell(h0, w1) * wf;\n  const bottom = cell(h1, w0) * (1 - wf) + cell(h1, w1) * wf;\n  return (top * (1 - hf) + bottom * hf) * hScale * wScale;\n}\n\n/** Tables D1\u2013D9: a hinged sash's equivalent area, m\u00B2, between their angles. */\nexport function hingedArea(angleDeg: number, hM: number, wM: number): number {\n  if (angleDeg <= 0 || hM <= 0 || wM <= 0) {\n    return 0;\n  }\n  const angle = Math.min(angleDeg, ANGLES.at(-1) as number);\n  const first = ANGLES[0] as number;\n  if (angle <= first) {\n    return atAngle(first, hM, wM) * (angle / first);\n  }\n  const upper = ANGLES.findIndex((candidate) => candidate >= angle);\n  const high = ANGLES[upper] as number;\n  const low = ANGLES[upper - 1] as number;\n  const t = (angle - low) / (high - low);\n  return atAngle(low, hM, wM) * (1 - t) + atAngle(high, hM, wM) * t;\n}\n\n/** The angle a sash swinging `wM` wide opens to, leaving a `gapM` gap. */\nexport function angleForGap(wM: number, gapM: number): number {\n  if (wM <= 0) {\n    return 0;\n  }\n  return (2 * Math.asin(Math.min(gapM / (2 * wM), 1)) * 180) / Math.PI;\n}\n\n/**\n * Appendix D's equivalent area, m\u00B2. A sash or slider is Table D9 at 90\u00B0 on the\n * part that opens; a centre pivot is two hinged halves (D3b). Unguarded, an\n * opening that could let someone fall counts only to 100 mm (paragraph 3.9).\n */\nexport function equivalentArea(opening: Opening): number {\n  const { style, widthM, heightM, angleDeg } = opening.vent;\n  const capped = opening.fallRisk && !opening.guarded;\n  switch (style) {\n    case \"fixed\":\n      return 0;\n    case \"side\":\n    case \"top\":\n    case \"bottom\": {\n      // D3a: h is the hinge's length, so top and bottom hung swap h and w.\n      const [h, w] = style === \"side\" ? [heightM, widthM] : [widthM, heightM];\n      const angle = capped\n        ? Math.min(angleDeg, angleForGap(w, RESTRICTOR_M))\n        : angleDeg;\n      return hingedArea(angle, h, w);\n    }\n    case \"pivot\": {\n      const half = heightM / 2;\n      const angle = capped\n        ? Math.min(angleDeg, angleForGap(half, RESTRICTOR_M))\n        : angleDeg;\n      return 2 * hingedArea(angle, widthM, half);\n    }\n    case \"sash\": {\n      const open = capped ? Math.min(heightM / 2, RESTRICTOR_M) : heightM / 2;\n      return hingedArea(90, open, widthM);\n    }\n    case \"slider\": {\n      const open = capped ? Math.min(widthM / 2, RESTRICTOR_M) : widthM / 2;\n      return hingedArea(90, heightM, open);\n    }\n  }\n}\n\n/** Whether openings on opposite fa\u00E7ades let air through (paragraph 1.4). */\nexport function crossVentilated(rooms: readonly Room[]): boolean {\n  const faces = rooms.flatMap((room) =>\n    room.openings\n      .filter((opening) => opening.vent.style !== \"fixed\")\n      .map((opening) => opening.planDeg),\n  );\n  return faces.some((a) =>\n    faces.some((b) => {\n      const apart = Math.abs(((a - b + 540) % 360) - 180);\n      return apart >= 135;\n    }),\n  );\n}\n\nfunction limits(\n  table: Glazing,\n  risk: Risk,\n  facing: Cardinal | null,\n): { dwelling: number; room: number } {\n  const row = table[risk] as Record<Cardinal, [number, number]>;\n  // Without north, the strictest orientation.\n  const points = facing ? [facing] : CARDINALS;\n  return {\n    dwelling: Math.min(...points.map((point) => row[point][0])),\n    room: Math.min(...points.map((point) => row[point][1])),\n  };\n}\n\n/** The orientation with the most glazing, or null when north isn't set. */\nfunction mostGlazedFacade(openings: readonly Opening[]): Cardinal | null {\n  if (openings.some((opening) => opening.bearing === null)) {\n    return null;\n  }\n  const totals = new Map<Cardinal, number>();\n  for (const opening of openings) {\n    const point = cardinal(opening.bearing as number);\n    totals.set(point, (totals.get(point) ?? 0) + opening.glazingM2);\n  }\n  let best: Cardinal | null = null;\n  for (const point of CARDINALS) {\n    if ((totals.get(point) ?? 0) > (best ? (totals.get(best) ?? 0) : 0)) {\n      best = point;\n    }\n  }\n  return best;\n}\n\nfunction shaded(opening: Opening): boolean {\n  if (opening.shading === \"shutters\") {\n    return true;\n  }\n  if (opening.shading === \"overhang\") {\n    // Only on a due south fa\u00E7ade.\n    return opening.bearing !== null && Math.abs(opening.bearing - 180) <= 22.5;\n  }\n  return (\n    opening.gValue <= data.shading.max_g &&\n    opening.lightTransmittance >= data.shading.min_light_transmittance\n  );\n}\n\nfunction pct(value: number): string {\n  return `${round(value)}%`;\n}\n\nfunction m2(value: number): string {\n  return `${round(value, 2)} m\u00B2`;\n}\n\nexport function assess(dwelling: Dwelling): Assessment {\n  const { risk } = dwelling;\n  const cross = dwelling.crossVentilated;\n  const glazingTable = cross ? data.glazing.cross : data.glazing.single;\n  const freeTable = (cross ? data.free_area.cross : data.free_area.single)[\n    risk\n  ];\n  const openings = dwelling.rooms.flatMap((room) => room.openings);\n  const glazingM2 = openings.reduce((sum, o) => sum + o.glazingM2, 0);\n  const facade = mostGlazedFacade(openings);\n  const dwellingLimit = limits(glazingTable, risk, facade).dwelling;\n  const glazingPct =\n    dwelling.floorM2 > 0 ? (glazingM2 / dwelling.floorM2) * 100 : 0;\n  const checks: Check[] = [];\n  const north = facade === null && openings.length > 0;\n\n  checks.push({\n    key: \"glazing\",\n    label: \"Maximum area of glazing\",\n    status: glazingPct <= dwellingLimit ? \"pass\" : \"fail\",\n    detail:\n      `${m2(glazingM2)} of glazing is ${pct(glazingPct)} of ${m2(dwelling.floorM2)}` +\n      ` floor; the limit is ${dwellingLimit}%` +\n      (facade\n        ? ` with most glazing facing ${facade}.`\n        : \" (north isn't set, so the strictest orientation).\"),\n  });\n\n  const rooms: RoomResult[] = dwelling.rooms.map((room) => {\n    const roomGlazing = room.openings.reduce((sum, o) => sum + o.glazingM2, 0);\n    const notes: string[] = [];\n    let freeM2 = 0;\n    let nightM2 = 0;\n    for (const opening of room.openings) {\n      const area = equivalentArea(opening);\n      if (area <= 0) {\n        continue;\n      }\n      if (opening.fallRisk && !opening.guarded) {\n        notes.push(`${opening.label} counts only 100 mm open: guard it.`);\n      }\n      freeM2 += area;\n      // Paragraph 3.6: while people sleep, a reachable bedroom counts only\n      // what can be left open securely.\n      if (room.bedroom && room.accessible && !opening.secure) {\n        notes.push(`${opening.label} can't be left open securely at night.`);\n      } else {\n        nightM2 += area;\n      }\n    }\n    const requiredM2 = room.bedroom\n      ? (room.floorM2 * freeTable.bedroom) / 100\n      : null;\n    return {\n      id: room.id,\n      name: room.name,\n      bedroom: room.bedroom,\n      glazingM2: roomGlazing,\n      glazingPct:\n        room.assessedM2 > 0 ? (roomGlazing / room.assessedM2) * 100 : 0,\n      limitPct: null,\n      freeM2,\n      nightM2,\n      requiredM2,\n      status:\n        requiredM2 === null ? \"na\" : nightM2 >= requiredM2 ? \"pass\" : \"fail\",\n      notes,\n    };\n  });\n\n  const glazedRooms = rooms.filter((room) => room.glazingM2 > 0);\n  const most = glazedRooms.reduce<RoomResult | null>(\n    (best, room) => (!best || room.glazingPct > best.glazingPct ? room : best),\n    null,\n  );\n  if (most) {\n    const source = dwelling.rooms.find((room) => room.id === most.id);\n    const roomFacade = mostGlazedFacade(source?.openings ?? []);\n    most.limitPct = limits(glazingTable, risk, roomFacade).room;\n    const over = most.glazingPct > most.limitPct;\n    if (over) {\n      most.status = \"fail\";\n    } else if (most.status === \"na\") {\n      most.status = \"pass\";\n    }\n    checks.push({\n      key: \"room\",\n      label: \"Maximum area of glazing in the most glazed room\",\n      status: over ? \"fail\" : \"pass\",\n      detail:\n        `${most.name}: ${m2(most.glazingM2)} is ${pct(most.glazingPct)} of its` +\n        ` floor; the limit is ${most.limitPct}%` +\n        (roomFacade ? ` facing ${roomFacade}.` : \".\"),\n    });\n  } else {\n    checks.push({\n      key: \"room\",\n      label: \"Maximum area of glazing in the most glazed room\",\n      status: \"na\",\n      detail: \"No room has glazing.\",\n    });\n  }\n\n  if (risk === \"high\") {\n    const exposed = openings.filter(\n      (opening) => opening.glazingM2 > 0 && sunward(opening.bearing),\n    );\n    const bare = exposed.filter((opening) => !shaded(opening));\n    checks.push({\n      key: \"shading\",\n      label: \"Shading strategy\",\n      status: bare.length === 0 ? \"pass\" : \"fail\",\n      detail:\n        bare.length === 0\n          ? `All ${exposed.length} glazed areas facing north-east to north-west via south are shaded.`\n          : `Not shaded: ${bare.map((o) => o.label).join(\", \")}. Use shutters, glass with g \u2264 0.4 and light transmittance \u2265 0.7, or a 50\u00B0 overhang on a due south fa\u00E7ade.`,\n    });\n  } else {\n    checks.push({\n      key: \"shading\",\n      label: \"Shading strategy\",\n      status: \"na\",\n      detail: \"Only the high risk location needs shading.\",\n    });\n  }\n\n  const freeM2 = rooms.reduce((sum, room) => sum + room.freeM2, 0);\n  const byFloor = (dwelling.floorM2 * freeTable.floor) / 100;\n  const byGlazing = (glazingM2 * freeTable.glazing) / 100;\n  const requiredM2 = Math.max(byFloor, byGlazing);\n  checks.push({\n    key: \"free\",\n    label: \"Total minimum free area\",\n    status: freeM2 >= requiredM2 ? \"pass\" : \"fail\",\n    detail:\n      `${m2(freeM2)} opens; ${m2(requiredM2)} needed, the greater of` +\n      ` ${freeTable.floor}% of the floor and ${freeTable.glazing}% of the glazing.`,\n  });\n\n  const bedrooms = rooms.filter((room) => room.requiredM2 !== null);\n  const short = bedrooms.filter(\n    (room) => room.nightM2 < (room.requiredM2 ?? 0),\n  );\n  checks.push({\n    key: \"bedrooms\",\n    label: \"Bedroom minimum free area\",\n    status: bedrooms.length === 0 ? \"na\" : short.length === 0 ? \"pass\" : \"fail\",\n    detail:\n      bedrooms.length === 0\n        ? \"No bedrooms.\"\n        : short.length === 0\n          ? `Every bedroom opens at least ${freeTable.bedroom}% of its floor.`\n          : `Short: ${short\n              .map(\n                (room) =>\n                  `${room.name} ${m2(room.nightM2)} of ${m2(room.requiredM2 ?? 0)}`,\n              )\n              .join(\", \")}.`,\n  });\n\n  const unsuitable: string[] = [];\n  if (dwelling.noise) {\n    unsuitable.push(\n      \"Night noise will keep bedroom windows shut while people sleep (paragraph 3.2).\",\n    );\n  }\n  if (dwelling.communalHeating) {\n    unsuitable.push(\n      \"Communal heating with long horizontal pipe runs (paragraph 1.13).\",\n    );\n  }\n  const notes: string[] = [];\n  if (north) {\n    notes.push(\n      \"North isn't set, so the limits are the strictest orientation's.\",\n    );\n  }\n  if (dwelling.pollution) {\n    notes.push(\n      \"Near a pollution source: keep openings away from it (Approved Document F, Section 2).\",\n    );\n  }\n\n  const failed = checks.some((check) => check.status === \"fail\");\n  return {\n    risk,\n    crossVentilated: cross,\n    facade,\n    glazingM2,\n    glazingPct,\n    limitPct: dwellingLimit,\n    mostGlazed: most?.id ?? null,\n    freeM2,\n    requiredM2,\n    rooms,\n    checks,\n    unsuitable,\n    notes,\n    status:\n      failed || dwelling.noise || dwelling.communalHeating ? \"fail\" : \"pass\",\n  };\n}\n", "// The design's floors as Approved Document O's dwelling: rooms measured to\n// their inner faces, and every window or glazed door in an outside wall with\n// the way it faces, its glass and how far it opens.\n\nimport table6b from \"../../../apps/twin/tables/table6b.json\";\nimport table6c from \"../../../apps/twin/tables/table6c.json\";\nimport { area, inset, length, type Point } from \"../heatload/geometry\";\nimport { roomType } from \"../heatload/temperatures\";\nimport {\n  type Assessment,\n  assess,\n  crossVentilated,\n  type Opening as PartOOpening,\n  type Room as PartORoom,\n  riskOf,\n  type VentStyle,\n} from \"../overheating/parto\";\nimport { resolve as resolveFabric } from \"./bridge\";\nimport type { FloorInput } from \"./heatmodel\";\nimport { outwardDeg } from \"./orientation\";\nimport type { HeatFill } from \"./renderer\";\nimport { resolve } from \"./resolve\";\nimport type {\n  FabricType,\n  Opening,\n  OverheatingContext,\n  Point as PlanPoint,\n} from \"./scene\";\n\nconst MM_PER_M = 1000;\nconst MM2_PER_M2 = 1_000_000;\n\nconst BEDROOMS = new Set([\"bedroom\", \"bedroom-ensuite\", \"bedroom-study\"]);\n\n/** Appendix A: an open plan room is assessed this deep off its glazing. */\nconst OPEN_PLAN_DEPTH_M = 4.5;\n\n/** Table 3.1: a drop of more than 600 mm wants guarding to 1.1 m. */\nconst GUARDING_MM = 1100;\n\nconst HINGED_ANGLE: Record<VentStyle, number> = {\n  side: 90,\n  top: 30,\n  bottom: 30,\n  pivot: 30,\n  sash: 90,\n  slider: 90,\n  fixed: 0,\n};\n\nfunction glass(type: FabricType | undefined): {\n  frameFactor: number;\n  gValue: number;\n  lightTransmittance: number;\n} {\n  const spec = type?.spec ?? {};\n  const glazing = String(spec[\"glazing\"] ?? \"DOUBLE_GLAZED\");\n  const frame = String(spec[\"frame\"] ?? \"PVC\");\n  const row = (table6b.values as Record<string, string[]>)[glazing] ?? [\n    \"0.76\",\n    \"0.8\",\n  ];\n  const own = (key: string, fallback: string | undefined) => {\n    const value = spec[key];\n    return typeof value === \"number\" && value > 0 ? value : Number(fallback);\n  };\n  return {\n    frameFactor: Number(\n      (table6c.values as Record<string, string>)[frame] ?? \"0.7\",\n    ),\n    gValue: own(\"g_value\", row[0]),\n    lightTransmittance: own(\"light_transmittance\", row[1]),\n  };\n}\n\nfunction ventOf(opening: Opening, glazed: boolean): VentStyle | null {\n  if (opening.type === \"opening\") {\n    return null;\n  }\n  if (opening.vent) {\n    return opening.vent;\n  }\n  // An entrance door stays shut; a glazed door is a French door until told.\n  return opening.type === \"window\" || glazed ? \"side\" : \"fixed\";\n}\n\nfunction pairKey(a: string, b: string): string {\n  return a < b ? `${a}|${b}` : `${b}|${a}`;\n}\n\nfunction openPlan(name: string): boolean {\n  return /[/&+]|open.?plan|diner|kitchen.?living|living.?kitchen/i.test(name);\n}\n\n/**\n * Part O's rooms, heated ones only, the floor area they add up to, and how\n * many openings had no vent recorded (saved before #3416), so were assumed to\n * open fully side hung: the most free area any of them could have.\n */\nexport function buildDwelling(\n  floors: readonly FloorInput[],\n  types: readonly FabricType[],\n  northDeg: number | null,\n): { rooms: PartORoom[]; floorM2: number; assumedVents: number } {\n  const rooms: PartORoom[] = [];\n  let floorM2 = 0;\n  let assumedVents = 0;\n  const ordered = [...floors].sort((a, b) => a.level - b.level);\n  const ground = ordered[0]?.level ?? 0;\n\n  for (const floor of ordered) {\n    const view = resolve(floor.scene, types);\n    const at = new Map(floor.scene.vertices.map((v) => [v.id, v.at]));\n    const byPair = new Map(\n      floor.scene.walls.map((wall) => [pairKey(wall.a, wall.b), wall.id]),\n    );\n    const upstairs = floor.level > Math.max(ground, 0);\n\n    for (const room of view.rooms) {\n      const drawn = floor.scene.rooms.find((r) => r.id === room.id);\n      if (!drawn || !room.heated) {\n        continue;\n      }\n      const ring = drawn.boundary.filter((vertex) => at.has(vertex));\n      const outline = ring.map((vertex) => at.get(vertex) as PlanPoint);\n      const walls = ring.map((vertex, i) => {\n        const next = ring[(i + 1) % ring.length] as string;\n        const id = byPair.get(pairKey(vertex, next));\n        return id ? view.wall(id) : undefined;\n      });\n      const inner = inset(\n        outline,\n        walls.map((wall) => (wall ? wall.thickness / 2 : 0)),\n      );\n      const roomM2 = area(inner) / MM2_PER_M2;\n      if (roomM2 <= 0) {\n        continue;\n      }\n      floorM2 += roomM2;\n      const [type] = roomType(room.roomType, room.name);\n      const label = room.name || \"Room\";\n\n      const openings: PartOOpening[] = [];\n      const glazingByWall = new Map<number, number>();\n      walls.forEach((wall, edge) => {\n        // A fa\u00E7ade: outside, not a party wall or a wall onto a garage.\n        if (!wall || wall.kind !== \"EXTERNAL\" || wall.rooms.length !== 1) {\n          return;\n        }\n        const planDeg = outwardDeg(wall.a, wall.b, [outline]);\n        if (planDeg === null) {\n          return;\n        }\n        const bearing =\n          northDeg === null ? null : (((planDeg - northDeg) % 360) + 360) % 360;\n        for (const opening of view.openingsByWall.get(wall.id) ?? []) {\n          const glazed = opening.type === \"window\" || opening.glazed === true;\n          const style = ventOf(opening, glazed);\n          if (style === null) {\n            continue;\n          }\n          if (!opening.vent && style !== \"fixed\") {\n            assumedVents += 1;\n          }\n          // A door's own fabric is a door's: its glass is the default window's.\n          const { frameFactor, gValue, lightTransmittance } = glass(\n            resolveFabric(\n              types,\n              \"WINDOW\",\n              opening.type === \"window\" ? opening.fabric : null,\n            ),\n          );\n          const widthM = (opening.vent_width ?? opening.width) / MM_PER_M;\n          const heightM = (opening.vent_height ?? opening.height) / MM_PER_M;\n          const glazingM2 = glazed\n            ? ((opening.width * opening.height) / MM2_PER_M2) * frameFactor\n            : 0;\n          glazingByWall.set(edge, (glazingByWall.get(edge) ?? 0) + glazingM2);\n          const kind = opening.type === \"window\" ? \"Window\" : \"Door\";\n          openings.push({\n            id: opening.id,\n            label: `${label} ${kind.toLowerCase()} ${openings.length + 1}`,\n            glazingM2,\n            bearing,\n            planDeg,\n            vent: {\n              style,\n              widthM,\n              heightM,\n              angleDeg: opening.vent_angle ?? HINGED_ANGLE[style],\n            },\n            shading: opening.shading ?? \"none\",\n            gValue,\n            lightTransmittance,\n            secure: opening.secure === true,\n            fallRisk: upstairs && (opening.sill ?? 0) < GUARDING_MM,\n            guarded: opening.guarded === true,\n          });\n        }\n      });\n\n      let assessedM2 = roomM2;\n      if (!BEDROOMS.has(type) && openPlan(`${room.name} ${room.roomType}`)) {\n        const [edge] = [...glazingByWall.entries()].sort(\n          (a, b) => b[1] - a[1],\n        )[0] ?? [null];\n        if (edge !== null) {\n          const a = inner[edge] as Point;\n          const b = inner[(edge + 1) % inner.length] as Point;\n          const deep = (length(a, b) / MM_PER_M) * OPEN_PLAN_DEPTH_M;\n          assessedM2 = Math.min(roomM2, deep);\n        }\n      }\n\n      rooms.push({\n        id: room.id,\n        name: label,\n        bedroom: BEDROOMS.has(type),\n        // Appendix A: within 2 m of the ground. A window over a low flat\n        // roof is easily accessible too; mark it secure or not by hand.\n        accessible: !upstairs,\n        floorM2: roomM2,\n        assessedM2,\n        openings,\n      });\n    }\n  }\n  return { rooms, floorM2, assumedVents };\n}\n\nexport interface DesignOverheating extends Assessment {\n  /** Where the location's risk came from. */\n  riskSource: \"postcode\" | \"set\";\n  crossSource: \"plan\" | \"set\";\n}\n\nexport const ASSUMED_VENTS =\n  \"Some windows' openings weren't recorded, so they're assumed to open fully side hung; check them in the design tool.\";\n\nexport const UNSEEN_ROOFLIGHTS =\n  \"The EPC lists rooflights, which the plan doesn't show, so they aren't in the room-by-room check; check those rooms separately.\";\n\nexport function designOverheating(\n  floors: readonly FloorInput[],\n  types: readonly FabricType[],\n  context: OverheatingContext,\n  northDeg: number | null,\n): DesignOverheating {\n  const { settings } = context;\n  const { rooms, floorM2, assumedVents } = buildDwelling(\n    floors,\n    types,\n    northDeg,\n  );\n  const located = riskOf(context.postcode);\n  const risk = settings.location === \"auto\" ? located.risk : settings.location;\n  const cross =\n    settings.cross_ventilation === \"auto\"\n      ? crossVentilated(rooms)\n      : settings.cross_ventilation === \"yes\";\n  const result = assess({\n    floorM2,\n    risk,\n    crossVentilated: cross,\n    rooms,\n    noise: settings.noise,\n    pollution: settings.pollution,\n    communalHeating: settings.communal_heating,\n  });\n  if (settings.location === \"auto\" && located.manchester) {\n    result.notes.unshift(\n      \"Central Manchester: Part O suggests the high risk guidance here, so it's applied.\",\n    );\n  }\n  if (assumedVents > 0) {\n    result.notes.push(ASSUMED_VENTS);\n  }\n  if ((context.rooflights ?? 0) > 0) {\n    result.notes.push(UNSEEN_ROOFLIGHTS);\n  }\n  return {\n    ...result,\n    riskSource: settings.location === \"auto\" ? \"postcode\" : \"set\",\n    crossSource: settings.cross_ventilation === \"auto\" ? \"plan\" : \"set\",\n  };\n}\n\nconst PASS = \"#bbf7d0\";\nconst FAIL = \"#fecaca\";\nconst QUIET = \"#f1f5f9\";\n\nexport const OVERHEATING_LEGEND = [\n  { color: PASS, label: \"Meets\" },\n  { color: FAIL, label: \"Fails\" },\n  { color: QUIET, label: \"Not tested\" },\n];\n\n/** Rooms coloured by their own Part O test: the most glazed room's glazing,\n * or a bedroom's free area at night. */\nexport function overheatingFills(\n  result: Assessment | null,\n): Map<string, HeatFill> {\n  const fills = new Map<string, HeatFill>();\n  for (const room of result?.rooms ?? []) {\n    const glazed = `${Math.round(room.glazingPct)}% glazed`;\n    let label = glazed;\n    if (room.limitPct !== null) {\n      label = `${glazed}, max ${room.limitPct}%`;\n    } else if (room.requiredM2 !== null) {\n      label = `${room.nightM2.toFixed(2)} of ${room.requiredM2.toFixed(2)} m\u00B2 open`;\n    }\n    fills.set(room.id, {\n      color:\n        room.status === \"pass\" ? PASS : room.status === \"fail\" ? FAIL : QUIET,\n      label,\n      dark: false,\n    });\n  }\n  return fills;\n}\n\n/** The editor's fields for how an opening opens; blanks take the defaults. */\nexport interface VentProps {\n  vent: VentStyle | \"\";\n  ventAngle: number | \"\";\n  ventWidth: number | \"\";\n  ventHeight: number | \"\";\n  shading: Opening[\"shading\"];\n  secure: boolean;\n  guarded: boolean;\n  glazed: boolean;\n  trickle?: boolean;\n}\n\n/** Writes the fields onto the opening, leaving defaults off the scene. */\nexport function setVent(opening: Opening, props: VentProps): void {\n  const positive = (raw: number | \"\") =>\n    raw !== \"\" && Number(raw) > 0 ? Math.round(Number(raw)) : null;\n  if (props.vent) {\n    opening.vent = props.vent;\n  } else {\n    delete opening.vent;\n  }\n  const angle = positive(props.ventAngle);\n  if (angle === null) {\n    delete opening.vent_angle;\n  } else {\n    opening.vent_angle = Math.min(90, angle);\n  }\n  for (const [key, raw] of [\n    [\"vent_width\", props.ventWidth],\n    [\"vent_height\", props.ventHeight],\n  ] as const) {\n    const value = positive(raw);\n    if (value === null) {\n      delete opening[key];\n    } else {\n      opening[key] = value;\n    }\n  }\n  if (props.shading && props.shading !== \"none\") {\n    opening.shading = props.shading;\n  } else {\n    delete opening.shading;\n  }\n  if (props.trickle && opening.type === \"window\") {\n    opening.trickle = true;\n  } else {\n    delete opening.trickle;\n  }\n  for (const key of [\"secure\", \"guarded\", \"glazed\"] as const) {\n    if (props[key] && (key !== \"glazed\" || opening.type === \"door\")) {\n      opening[key] = true;\n    } else {\n      delete opening[key];\n    }\n  }\n}\n", "// A plain outline icon for each kind of fixture, on a 24 x 24 grid.\n\nimport { CATEGORY_COLORS, type MeasureCategory } from \"./catalog\";\nimport type { FixtureKind } from \"./scene\";\n\nexport const FIXTURE_ICONS: Record<FixtureKind, readonly string[]> = {\n  gas_boiler: [\n    \"M7 3h10a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\",\n    \"M12 18c-2 0-3-1.2-3-2.6 0-1.7 2-2.6 2-4.6 1.6 1 4 2.4 4 4.6 0 1.4-1 2.6-3 2.6z\",\n  ],\n  oil_boiler: [\n    \"M7 3h10a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z\",\n    \"M12 8c-2 3-3 4.500-3 6a3 3 0 0 0 6 0c0-1.500-1-3-3-6z\",\n  ],\n  cylinder: [\"M7 5a5 2 0 0 1 10 0v14a5 2 0 0 1-10 0z\", \"M7 5a5 2 0 0 0 10 0\"],\n  heat_pump: [\n    \"M3 5h18v14H3z\",\n    \"M12 8a4 4 0 1 0 0 8 4 4 0 1 0 0-8\",\n    \"M12 8v8\",\n    \"M8 12h8\",\n  ],\n  solar_pv: [\"M3 6h18l-2 12H5z\", \"M9 6l-1 12\", \"M15 6l1 12\", \"M4 12h16\"],\n  extract_fan: [\n    \"M12 4a8 8 0 1 0 0 16 8 8 0 1 0 0-16\",\n    \"M12 12c0-4 3-5 4-3\",\n    \"M12 12c4 0 5 3 3 4\",\n    \"M12 12c0 4-3 5-4 3\",\n    \"M12 12c-4 0-5-3-3-4\",\n  ],\n  mvhr: [\n    \"M3 6h18v12H3z\",\n    \"M7 10h7\",\n    \"M12 8l2 2-2 2\",\n    \"M17 14h-7\",\n    \"M12 12l-2 2 2 2\",\n  ],\n  bath: [\"M3 12h18v3a4 4 0 0 1-4 4H7a4 4 0 0 1-4-4z\", \"M6 12V6a2 2 0 0 1 4 0\"],\n  shower: [\n    \"M4 20V8a4 4 0 0 1 4-4h6\",\n    \"M14 9h6\",\n    \"M15 13v.01\",\n    \"M18 13v.01\",\n    \"M16.500 16v.01\",\n    \"M19.500 16v.01\",\n  ],\n};\n\nconst CATEGORIES: Record<FixtureKind, MeasureCategory> = {\n  gas_boiler: \"heating\",\n  oil_boiler: \"heating\",\n  cylinder: \"heating\",\n  heat_pump: \"heating\",\n  solar_pv: \"renewables\",\n  extract_fan: \"ventilation\",\n  mvhr: \"ventilation\",\n  bath: \"other\",\n  shower: \"other\",\n};\n\n/** What's there now is grey; what's proposed takes its category's colour. */\nexport const EXISTING_COLOR = \"#6b7280\"; // gray-500\n\nexport function proposedColor(kind: FixtureKind): string {\n  return CATEGORY_COLORS[CATEGORIES[kind]];\n}\n\n/** The icon as an svg, for the sidebar. */\nexport function iconSvg(kind: FixtureKind): string {\n  const paths = FIXTURE_ICONS[kind].map((d) => `<path d=\"${d}\"/>`).join(\"\");\n  return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" class=\"h-6 w-6\">${paths}</svg>`;\n}\n", "import { distance } from \"./geometry\";\nimport { Point, Trace } from \"./scene\";\n\n// A trace image maps into world mm as: world = offset + R(pixel \u00D7 scale),\n// R turning it by `rotation` degrees clockwise on screen. Until calibrated,\n// a provisional 10 mm/px is used (a 1000 px scan \u2248 10 m).\n\nexport const DEFAULT_TRACE_MM_PER_PX = 10;\n\nexport interface TraceTransform {\n  scale: number;\n  offsetX: number;\n  offsetY: number;\n  rotation: number;\n}\n\nexport interface Size {\n  width: number;\n  height: number;\n}\n\nexport function traceTransform(trace: Trace): TraceTransform {\n  const parsed = Number(trace.scale_mm_per_px);\n  return {\n    scale:\n      trace.scale_mm_per_px !== null && Number.isFinite(parsed) && parsed > 0\n        ? parsed\n        : DEFAULT_TRACE_MM_PER_PX,\n    offsetX: trace.offset_x_mm,\n    offsetY: trace.offset_y_mm,\n    rotation: Number(trace.rotation_deg) || 0,\n  };\n}\n\n/** The fields a transform saves as, rounded as the server stores them.\n * Moving or turning an uncalibrated `trace` leaves its scale unsaved, so the\n * provisional one isn't taken for a calibration; scaling it saves one. */\nexport function tracePatch(\n  transform: TraceTransform,\n  trace?: Trace,\n): {\n  scale_mm_per_px?: string;\n  offset_x_mm: number;\n  offset_y_mm: number;\n  rotation_deg: string;\n} {\n  const placed = {\n    offset_x_mm: Math.round(transform.offsetX),\n    offset_y_mm: Math.round(transform.offsetY),\n    rotation_deg: normalizedDegrees(transform.rotation).toFixed(2),\n  };\n  if (\n    trace?.scale_mm_per_px === null &&\n    transform.scale === traceTransform(trace).scale\n  ) {\n    return placed;\n  }\n  return { scale_mm_per_px: transform.scale.toFixed(4), ...placed };\n}\n\nexport function normalizedDegrees(degrees: number): number {\n  const turned = ((degrees % 360) + 360) % 360;\n  // 359.996 would save as \"360.00\".\n  return turned >= 359.995 ? 0 : turned;\n}\n\nfunction turn(point: Point, degrees: number): Point {\n  const radians = (degrees * Math.PI) / 180;\n  const cos = Math.cos(radians);\n  const sin = Math.sin(radians);\n  return [point[0] * cos - point[1] * sin, point[0] * sin + point[1] * cos];\n}\n\nexport function toWorld(transform: TraceTransform, pixel: Point): Point {\n  const [x, y] = turn(\n    [pixel[0] * transform.scale, pixel[1] * transform.scale],\n    transform.rotation,\n  );\n  return [transform.offsetX + x, transform.offsetY + y];\n}\n\nexport function toPixel(transform: TraceTransform, world: Point): Point {\n  const [x, y] = turn(\n    [world[0] - transform.offsetX, world[1] - transform.offsetY],\n    -transform.rotation,\n  );\n  return [x / transform.scale, y / transform.scale];\n}\n\n/** The image's corners on the plan: top left, top right, bottom right,\n * bottom left as the image itself has them. */\nexport function traceCorners(transform: TraceTransform, size: Size): Point[] {\n  return [\n    [0, 0],\n    [size.width, 0],\n    [size.width, size.height],\n    [0, size.height],\n  ].map((pixel) => toWorld(transform, pixel as Point));\n}\n\nexport function traceCentre(transform: TraceTransform, size: Size): Point {\n  return toWorld(transform, [size.width / 2, size.height / 2]);\n}\n\nexport function moved(\n  transform: TraceTransform,\n  dx: number,\n  dy: number,\n): TraceTransform {\n  return {\n    ...transform,\n    offsetX: transform.offsetX + dx,\n    offsetY: transform.offsetY + dy,\n  };\n}\n\n/** Turned by `degrees` about a point on the plan, which stays put. */\nexport function turnedAbout(\n  transform: TraceTransform,\n  pivot: Point,\n  degrees: number,\n): TraceTransform {\n  const [x, y] = turn(\n    [transform.offsetX - pivot[0], transform.offsetY - pivot[1]],\n    degrees,\n  );\n  return {\n    scale: transform.scale,\n    rotation: transform.rotation + degrees,\n    offsetX: pivot[0] + x,\n    offsetY: pivot[1] + y,\n  };\n}\n\n/** Scaled by `factor` about a point on the plan, which stays put. */\nexport function scaledAbout(\n  transform: TraceTransform,\n  pivot: Point,\n  factor: number,\n): TraceTransform {\n  return {\n    rotation: transform.rotation,\n    scale: transform.scale * factor,\n    offsetX: pivot[0] + (transform.offsetX - pivot[0]) * factor,\n    offsetY: pivot[1] + (transform.offsetY - pivot[1]) * factor,\n  };\n}\n\n/** Recalibrate from two clicked world points and the feature's real length.\n * The clicked line's midpoint stays put so the image doesn't jump. */\nexport function calibrated(\n  current: TraceTransform,\n  a: Point,\n  b: Point,\n  realLengthMm: number,\n): TraceTransform | null {\n  const drawn = distance(a, b);\n  if (drawn <= 0 || realLengthMm <= 0) {\n    return null;\n  }\n  return scaledAbout(\n    current,\n    [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2],\n    realLengthMm / drawn,\n  );\n}\n\n/** Moved, turned and scaled so the two points clicked on the trace land on\n * the two clicked on the plan, as AutoCAD's ALIGN and a two-point Helmert\n * georeference do. */\nexport function aligned(\n  current: TraceTransform,\n  from: [Point, Point],\n  to: [Point, Point],\n): TraceTransform | null {\n  const before = distance(from[0], from[1]);\n  const after = distance(to[0], to[1]);\n  if (before <= 0 || after <= 0) {\n    return null;\n  }\n  const degrees =\n    ((Math.atan2(to[1][1] - to[0][1], to[1][0] - to[0][0]) -\n      Math.atan2(from[1][1] - from[0][1], from[1][0] - from[0][0])) *\n      180) /\n    Math.PI;\n  const shifted = moved(current, to[0][0] - from[0][0], to[0][1] - from[0][1]);\n  return scaledAbout(\n    turnedAbout(shifted, to[0], degrees),\n    to[0],\n    after / before,\n  );\n}\n\n/** Rotations a turned trace settles on: square to the page, and square to the\n * house as drawn. */\nexport function rotationTargets(houseDegrees: number): number[] {\n  const targets = new Set<number>();\n  for (const base of [0, houseDegrees]) {\n    for (let quarter = 0; quarter < 4; quarter++) {\n      targets.add(normalizedDegrees(base + quarter * 90));\n    }\n  }\n  return [...targets];\n}\n\n/** The nearest target within `tolerance` degrees, else the angle as given. */\nexport function snapRotation(\n  degrees: number,\n  targets: number[],\n  tolerance: number,\n): { degrees: number; snapped: boolean } {\n  let best: number | null = null;\n  let gap = tolerance;\n  for (const target of targets) {\n    const apart = Math.abs(((((degrees - target) % 360) + 540) % 360) - 180);\n    if (apart <= gap) {\n      gap = apart;\n      best = target;\n    }\n  }\n  return best === null\n    ? { degrees, snapped: false }\n    : { degrees: best, snapped: true };\n}\n\n/** A length typed for a calibration, in mm: \"4.2\" or \"4.2 m\" are metres,\n * \"4200\" or \"4200 mm\" millimetres, as a plan's dimensions are written. */\nexport function parseLengthMm(text: string): number | null {\n  const match = /^\\s*(\\d+(?:\\.\\d+)?|\\.\\d+)\\s*(mm|cm|m)?\\s*$/i.exec(\n    text.replace(/,/g, \"\"),\n  );\n  if (!match) {\n    return null;\n  }\n  const value = Number(match[1]);\n  const unit = match[2]?.toLowerCase();\n  const mm =\n    unit === \"mm\"\n      ? value\n      : unit === \"cm\"\n        ? value * 10\n        : unit === \"m\"\n          ? value * 1000\n          : // Bare numbers: a house's dimension in metres is under 100.\n            value < 100\n            ? value * 1000\n            : value;\n  return mm > 0 ? mm : null;\n}\n\nconst SAVED = [\n  \"name\",\n  \"scale_mm_per_px\",\n  \"offset_x_mm\",\n  \"offset_y_mm\",\n  \"rotation_deg\",\n  \"opacity\",\n  \"locked\",\n  \"hidden\",\n  \"order\",\n] as const;\n\nexport interface TracePatch {\n  id: number;\n  url: string;\n  body: Record<string, unknown>;\n}\n\n/** The PATCHes that take the server from `before` to `after`, as undo and\n * redo swap a floor's traces. A removed trace is only flagged deleted, so\n * bringing it back is a PATCH too. */\nexport function traceDiff(before: Trace[], after: Trace[]): TracePatch[] {\n  const patches: TracePatch[] = [];\n  const was = new Map(before.map((trace) => [trace.id, trace]));\n  const now = new Set(after.map((trace) => trace.id));\n  for (const trace of after) {\n    const previous = was.get(trace.id);\n    const body: Record<string, unknown> = previous ? {} : { deleted: false };\n    for (const field of SAVED) {\n      if (!previous || previous[field] !== trace[field]) {\n        body[field] = trace[field];\n      }\n    }\n    if (Object.keys(body).length > 0) {\n      patches.push({ id: trace.id, url: trace.url, body });\n    }\n  }\n  for (const trace of before) {\n    if (!now.has(trace.id)) {\n      patches.push({ id: trace.id, url: trace.url, body: { deleted: true } });\n    }\n  }\n  return patches;\n}\n", "import { distance } from \"./geometry\";\nimport { Point } from \"./scene\";\nimport { Size, TraceTransform, traceCorners } from \"./trace\";\n\n// The box round the trace being fitted, with a handle on each corner to scale\n// it and one above it to turn it, as PowerPoint and Figma frame an image.\n// Sizes are screen pixels, multiplied by world mm per pixel.\n\nexport const HANDLE_PX = 5;\nconst ROTATE_PX = 32;\nconst REACH_PX = 9;\n\nexport interface Frame {\n  corners: Point[];\n  /** Where the rotate handle's stem leaves the top edge. */\n  stem: Point;\n  rotate: Point;\n}\n\nexport type FrameHit =\n  | { kind: \"rotate\" }\n  | { kind: \"corner\"; index: number }\n  | { kind: \"inside\" };\n\nexport function frameOf(\n  transform: TraceTransform,\n  size: Size,\n  worldPerPixel: number,\n): Frame {\n  const corners = traceCorners(transform, size);\n  const [topLeft, topRight, , bottomLeft] = corners as [\n    Point,\n    Point,\n    Point,\n    Point,\n  ];\n  const stem: Point = [\n    (topLeft[0] + topRight[0]) / 2,\n    (topLeft[1] + topRight[1]) / 2,\n  ];\n  const up = distance(bottomLeft, topLeft) || 1;\n  const reach = ROTATE_PX * worldPerPixel;\n  return {\n    corners,\n    stem,\n    rotate: [\n      stem[0] + ((topLeft[0] - bottomLeft[0]) / up) * reach,\n      stem[1] + ((topLeft[1] - bottomLeft[1]) / up) * reach,\n    ],\n  };\n}\n\nexport function insidePolygon(point: Point, polygon: Point[]): boolean {\n  let inside = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const [xi, yi] = polygon[i] as Point;\n    const [xj, yj] = polygon[j] as Point;\n    if (\n      yi > point[1] !== yj > point[1] &&\n      point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi) + xi\n    ) {\n      inside = !inside;\n    }\n  }\n  return inside;\n}\n\n/** What a press at `point` takes hold of: handles first, as they sit on or\n * just outside the image. */\nexport function hitFrame(\n  frame: Frame,\n  point: Point,\n  worldPerPixel: number,\n): FrameHit | null {\n  const reach = REACH_PX * worldPerPixel;\n  if (distance(point, frame.rotate) <= reach) {\n    return { kind: \"rotate\" };\n  }\n  let nearest = -1;\n  let gap = reach;\n  frame.corners.forEach((corner, index) => {\n    const apart = distance(point, corner);\n    if (apart <= gap) {\n      gap = apart;\n      nearest = index;\n    }\n  });\n  if (nearest >= 0) {\n    return { kind: \"corner\", index: nearest };\n  }\n  return insidePolygon(point, frame.corners) ? { kind: \"inside\" } : null;\n}\n", "import {\n  doorInsulated,\n  fabricColor,\n  glazingLineCount,\n  resolveFabric,\n} from \"./fabric\";\nimport { radiatorBar } from \"./emitters\";\nimport { EXISTING_COLOR, FIXTURE_ICONS, proposedColor } from \"./fixtureicons\";\nimport { breastAreaMm2, breastBlock, breasts } from \"./features\";\nimport { formatAreaM2, polygonArea, polygonCentroid } from \"./geometry\";\nimport { doorLeaves, pointAlong, wallFrame, wallSegments } from \"./openings\";\nimport { findFaces } from \"./faces\";\nimport {\n  pointOf,\n  polygonOf,\n  unroomedSpaces,\n  wallEnds,\n  wallKinds,\n} from \"./topology\";\nimport {\n  Annotation,\n  Emitter,\n  FabricType,\n  Floor,\n  FixtureKind,\n  Opening,\n  Point,\n  Room,\n  Scene,\n  Trace,\n  Wall,\n} from \"./scene\";\nimport { Size, TraceTransform, traceTransform } from \"./trace\";\nimport { Frame, HANDLE_PX, frameOf } from \"./traceframe\";\n\nexport interface AnnotationStyle {\n  color: string;\n  name: string;\n}\n\n/** A room's fill on the heat map, and the figure printed in it. */\nexport interface HeatFill {\n  color: string;\n  label: string;\n  dark: boolean;\n}\n\n/** What a package of measures touches on the plan, by entity id. */\nexport interface Highlights {\n  walls: Map<string, string>;\n  openings: Map<string, string>;\n  rooms: Map<string, string>;\n  /** Left out of what's being chosen: washed over so the rest stands out. */\n  dim?: { walls: Set<string>; openings: Set<string>; rooms: Set<string> };\n}\n\n/** A fixture as drawn: where, in what state, and whether it's the one being edited. */\nexport interface DrawnFixture {\n  key: string;\n  kind: FixtureKind;\n  at: Point;\n  name: string;\n  /** There now; a scenario's own; or there now and a scenario takes it away. */\n  state: \"existing\" | \"proposed\" | \"removed\";\n  selected: boolean;\n  /** An outdoor unit's footprint and its clearance zone, in plan. */\n  shape?: { footprint: Point[]; zone: Point[] };\n  /** The zone runs into something. */\n  warned?: boolean;\n  /** Where its noise is assessed, and the level there. */\n  assess?: { at: Point; label: string; passes: boolean };\n}\n\nexport const NO_HIGHLIGHTS: Highlights = {\n  walls: new Map(),\n  openings: new Map(),\n  rooms: new Map(),\n};\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst INTERNAL_OPACITY = 0.45;\n\n// Styling is applied with presentation attributes, not classes, so a\n// serialized copy of the svg renders identically outside the page.\nexport const COLORS = {\n  wall: \"#334155\", // slate-700\n  wallSelected: \"#2563eb\", // blue-600\n  room: \"#e0f2fe\", // sky-100\n  roomEdge: \"#7dd3fc\", // sky-300\n  label: \"#475569\", // slate-600\n  gridMinor: \"#e2e8f0\", // slate-200\n  gridMajor: \"#cbd5e1\", // slate-300\n  ghost: \"#94a3b8\", // slate-400\n  underlay: \"#0d9488\", // teal-600\n  footprint: \"#f1f5f9\", // slate-100\n  empty: \"#cbd5e1\", // slate-300\n  party: \"#8b5cf6\", // violet-500\n  emitter: \"#ea580c\", // orange-600\n};\n\n// Comparing a trace with the plan, as Bluebeam Revu overlays two drawings:\n// each in its own colour, multiplied, so where they agree turns near black.\nexport const COMPARE_COLORS = {\n  trace: \"#e11d48\", // rose-600\n  plan: \"#0891b2\", // cyan-600\n};\n\n// Bottom \u2192 top; interaction overlays land in later commits.\nconst LAYERS = [\n  \"grid\",\n  \"trace\",\n  // The house's plot from HM Land Registry, faint under everything.\n  \"plot\",\n  // The map's outline of the house, while north is being lined up.\n  \"map\",\n  \"asis\",\n  \"spaces\",\n  \"rooms\",\n  \"heat\",\n  \"underfloor\",\n  // Over the room fills, so the floor below shows through the rooms.\n  \"ghost\",\n  \"features\",\n  \"walls\",\n  \"openings\",\n  \"phases\",\n  \"emitters\",\n  \"fixtures\",\n  \"highlights\",\n  \"annotations\",\n  \"labels\",\n  \"selection\",\n  \"traceframe\",\n  \"preview\",\n] as const;\n\ntype LayerName = (typeof LAYERS)[number];\n\n/** What can be hidden from the plan, each the layers it draws on. */\nexport const PLAN_LAYERS = {\n  walls: [\"walls\"],\n  rooms: [\"rooms\", \"spaces\"],\n  names: [\"labels\"],\n  openings: [\"openings\"],\n  emitters: [\"emitters\", \"underfloor\", \"fixtures\"],\n  features: [\"features\"],\n  measures: [\"annotations\"],\n  grid: [\"grid\"],\n} as const satisfies Record<string, readonly LayerName[]>;\n\nexport type PlanLayer = keyof typeof PLAN_LAYERS;\n\nexport function element<K extends keyof SVGElementTagNameMap>(\n  tag: K,\n  attrs: Record<string, string> = {},\n): SVGElementTagNameMap[K] {\n  const node = document.createElementNS(SVG_NS, tag);\n  for (const [name, value] of Object.entries(attrs)) {\n    node.setAttribute(name, value);\n  }\n  return node;\n}\n\n/** Sync `items` into `layer`, one keyed <g data-id> per item, creating,\n * updating and removing groups as needed. Only changed items are touched. */\nfunction syncLayer<T>(\n  layer: SVGGElement,\n  items: T[],\n  key: (item: T) => string,\n  draw: (item: T, group: SVGGElement) => void,\n): void {\n  const seen = new Set<string>();\n  const existing = new Map<string, SVGGElement>();\n  for (const child of Array.from(layer.children)) {\n    const id = child.getAttribute(\"data-id\");\n    if (id !== null && child instanceof SVGGElement) {\n      existing.set(id, child);\n    }\n  }\n  for (const item of items) {\n    const id = key(item);\n    seen.add(id);\n    let group = existing.get(id);\n    if (group === undefined) {\n      group = element(\"g\", { \"data-id\": id });\n      layer.appendChild(group);\n    }\n    group.replaceChildren();\n    draw(item, group);\n  }\n  for (const [id, group] of existing) {\n    if (!seen.has(id)) {\n      group.remove();\n    }\n  }\n}\n\nconst GRID_EXTENT = 200_000; // \u00B1200 m of grid around the origin\n\n// Blue stripes over a room's pale fill, white ones over a wall's blue.\nconst HATCH = \"url(#design-hatch)\";\nconst HATCH_LIGHT = \"url(#design-hatch-light)\";\n\n/** A rectangle `half` either side of the segment a\u2192b. */\nfunction band(a: Point, b: Point, half: number): string {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n  const nx = (-(b[1] - a[1]) / length) * half;\n  const ny = ((b[0] - a[0]) / length) * half;\n  return polygonPoints([\n    [a[0] + nx, a[1] + ny],\n    [b[0] + nx, b[1] + ny],\n    [b[0] - nx, b[1] - ny],\n    [a[0] - nx, a[1] - ny],\n  ]);\n}\n\n/** Whether an annotation is the open scenario's (`scope`). A measure is what\n * a scenario adds, so a baseline (null) has none. */\nexport function inScope(\n  annotation: { package?: number | null | undefined },\n  scope: number | null,\n): boolean {\n  return scope !== null && (annotation.package ?? null) === scope;\n}\n\n/** What is selected together on the floor in view, and the pill hovered. */\nexport interface MultiDraw {\n  items: { type: \"wall\" | \"opening\" | \"room\"; id: string }[];\n  colour: string | null;\n  preview: { type: \"wall\" | \"opening\" | \"room\"; id: string }[];\n  previewColour: string | null;\n}\n\nconst NO_MULTI: MultiDraw = {\n  items: [],\n  colour: null,\n  preview: [],\n  previewColour: null,\n};\n\nexport class Renderer {\n  readonly svg: SVGSVGElement;\n  private readonly layers: Record<LayerName, SVGGElement>;\n  private traceImages = new Map<number, SVGImageElement>();\n  private traceFrame: {\n    transform: TraceTransform;\n    size: Size;\n    locked: boolean;\n  } | null = null;\n  private exactWpp = 10;\n  /** The trace being compared with the plan, alone and in ink. */\n  private compared: number | null = null;\n  private roomsFaded = false;\n  private annotationStyles = new Map<string, AnnotationStyle>();\n  private hiddenKinds: ReadonlySet<string> = new Set();\n  /** Whose measures to draw: the open scenario's id, or null in a\n   * baseline, which has none. */\n  private annotationScope: number | null = null;\n  private fabricTypes: FabricType[] = [];\n  private wpp = 10;\n  private lastFloor: Floor | null = null;\n  private fixtures: DrawnFixture[] = [];\n  private heat: Map<string, HeatFill> | null = null;\n  private highlights: Highlights = NO_HIGHLIGHTS;\n  private hatches: SVGPatternElement[] = [];\n  private multi: MultiDraw = NO_MULTI;\n  /** Everything drawn, turned as a whole when the plan is. */\n  private readonly root: SVGGElement;\n  private rotation = 0;\n\n  constructor(mount: HTMLElement) {\n    this.svg = element(\"svg\", {\n      width: \"100%\",\n      height: \"100%\",\n      \"data-editor\": \"canvas\",\n    });\n    this.svg.style.display = \"block\";\n    this.svg.style.touchAction = \"none\";\n    // A brush stroke or a dragged handle would otherwise select the labels.\n    this.svg.style.userSelect = \"none\";\n    this.svg.appendChild(this.gridDefs());\n    this.root = element(\"g\", { \"data-layer\": \"plan\" });\n    this.svg.appendChild(this.root);\n    this.layers = {} as Record<LayerName, SVGGElement>;\n    for (const name of LAYERS) {\n      const layer = element(\"g\", { \"data-layer\": name });\n      // Overlays and labels must not intercept clicks meant for the entities\n      // beneath them \u2014 otherwise a selected wall's own highlight swallows\n      // the next click (deselecting it) and a room's name label blocks\n      // selecting the room. Handles opt back in individually.\n      if (\n        name === \"selection\" ||\n        name === \"preview\" ||\n        name === \"traceframe\" ||\n        name === \"grid\" ||\n        name === \"labels\" ||\n        name === \"heat\" ||\n        name === \"underfloor\" ||\n        name === \"highlights\" ||\n        name === \"ghost\" ||\n        name === \"spaces\" ||\n        name === \"features\" ||\n        name === \"fixtures\" ||\n        name === \"asis\" ||\n        name === \"map\" ||\n        name === \"plot\" ||\n        name === \"phases\"\n      ) {\n        layer.setAttribute(\"pointer-events\", \"none\");\n      }\n      this.layers[name] = layer;\n      this.root.appendChild(layer);\n    }\n    this.drawGrid();\n    mount.replaceChildren(this.svg);\n  }\n\n  private gridDefs(): SVGDefsElement {\n    const defs = element(\"defs\");\n    const minor = element(\"pattern\", {\n      id: \"design-grid-minor\",\n      width: \"100\",\n      height: \"100\",\n      patternUnits: \"userSpaceOnUse\",\n    });\n    minor.appendChild(\n      element(\"path\", {\n        d: \"M 100 0 L 0 0 0 100\",\n        fill: \"none\",\n        stroke: COLORS.gridMinor,\n        \"stroke-width\": \"4\",\n      }),\n    );\n    const major = element(\"pattern\", {\n      id: \"design-grid-major\",\n      width: \"1000\",\n      height: \"1000\",\n      patternUnits: \"userSpaceOnUse\",\n    });\n    major.appendChild(\n      element(\"path\", {\n        d: \"M 1000 0 L 0 0 0 1000\",\n        fill: \"none\",\n        stroke: COLORS.gridMajor,\n        \"stroke-width\": \"6\",\n      }),\n    );\n    defs.appendChild(minor);\n    defs.appendChild(major);\n    // Stripes as well as blue, so a selection reads without colour.\n    for (const [id, stroke] of [\n      [\"design-hatch\", COLORS.wallSelected],\n      [\"design-hatch-light\", \"#ffffff\"],\n    ] as const) {\n      const hatch = element(\"pattern\", {\n        id,\n        patternUnits: \"userSpaceOnUse\",\n        patternTransform: \"rotate(45)\",\n      });\n      hatch.appendChild(element(\"line\", { x1: \"0\", y1: \"0\", x2: \"0\", stroke }));\n      defs.appendChild(hatch);\n      this.hatches.push(hatch);\n    }\n    // An empty space: walls round it, no room in it.\n    const empty = element(\"pattern\", {\n      id: \"design-empty\",\n      width: \"200\",\n      height: \"200\",\n      patternUnits: \"userSpaceOnUse\",\n      patternTransform: \"rotate(45)\",\n    });\n    empty.appendChild(\n      element(\"line\", {\n        x1: \"0\",\n        y1: \"0\",\n        x2: \"0\",\n        y2: \"200\",\n        stroke: COLORS.empty,\n        \"stroke-width\": \"24\",\n      }),\n    );\n    defs.appendChild(empty);\n    // Underfloor heating: pipe runs zig-zagging across the room, 150 mm apart.\n    const pipes = element(\"pattern\", {\n      id: \"design-underfloor\",\n      width: \"300\",\n      height: \"150\",\n      patternUnits: \"userSpaceOnUse\",\n    });\n    pipes.appendChild(\n      element(\"path\", {\n        d: \"M 0 120 L 75 30 L 150 120 L 225 30 L 300 120\",\n        fill: \"none\",\n        stroke: COLORS.emitter,\n        \"stroke-width\": \"14\",\n        \"stroke-opacity\": \"0.45\",\n      }),\n    );\n    defs.appendChild(pipes);\n    defs.appendChild(inkFilter(\"design-trace-ink\", COMPARE_COLORS.trace, true));\n    defs.appendChild(inkFilter(\"design-plan-ink\", COMPARE_COLORS.plan, false));\n    return defs;\n  }\n\n  private drawGrid(): void {\n    for (const id of [\"design-grid-minor\", \"design-grid-major\"]) {\n      this.layers.grid.appendChild(\n        element(\"rect\", {\n          x: String(-GRID_EXTENT),\n          y: String(-GRID_EXTENT),\n          width: String(GRID_EXTENT * 2),\n          height: String(GRID_EXTENT * 2),\n          fill: `url(#${id})`,\n        }),\n      );\n    }\n  }\n\n  /** Show the plan turned clockwise by `degrees`; text stays upright. */\n  setRotation(degrees: number): void {\n    this.rotation = degrees;\n    this.root.setAttribute(\"transform\", degrees ? `rotate(${degrees})` : \"\");\n    if (this.lastFloor) {\n      this.syncEmitters(this.lastFloor);\n    }\n    this.upright(this.root);\n  }\n\n  private upright(within: Element): void {\n    for (const text of Array.from(within.querySelectorAll(\"text\"))) {\n      // Lines stacked under a room's name turn about the name, not themselves.\n      const pivot =\n        text.getAttribute(\"data-pivot\") ??\n        `${text.getAttribute(\"x\") ?? \"0\"} ${text.getAttribute(\"y\") ?? \"0\"}`;\n      if (this.rotation) {\n        text.setAttribute(\"transform\", `rotate(${-this.rotation} ${pivot})`);\n      } else {\n        text.removeAttribute(\"transform\");\n      }\n    }\n  }\n\n  /** Text keeps a near-constant screen size: re-sync the label-bearing\n   * layers when the zoom changes meaningfully. */\n  setWorldPerPixel(wpp: number): void {\n    this.exactWpp = wpp;\n    this.drawTraceFrame();\n    if (Math.abs(wpp - this.wpp) / this.wpp < 0.1) {\n      return;\n    }\n    this.wpp = wpp;\n    if (this.lastFloor) {\n      this.syncLabels(this.lastFloor);\n    }\n  }\n\n  private labelFont(px: number): string {\n    return String(Math.max(120, Math.min(700, px * this.wpp)));\n  }\n\n  private syncLabels(floor: Floor): void {\n    this.syncOverlays(floor);\n    const order = { area: 0, line: 1, point: 2 };\n    const annotations = floor.annotations\n      .filter((annotation) => inScope(annotation, this.annotationScope))\n      .sort(\n        (left, right) => order[left.geometry.type] - order[right.geometry.type],\n      );\n    syncLayer(\n      this.layers.annotations,\n      annotations,\n      (annotation) => `a_${annotation.id}`,\n      (annotation, group) => {\n        group.setAttribute(\"data-kind\", annotation.kind);\n        drawAnnotation(\n          annotation,\n          this.styleFor(annotation.kind),\n          group,\n          (px) => this.labelFont(px),\n        );\n      },\n    );\n    this.hideKinds();\n    syncLayer(\n      this.layers.labels,\n      [\n        ...floor.scene.rooms.map((room) => ({\n          key: `label:${room.id}`,\n          name: room.name,\n          polygon: polygonOf(floor.scene, room),\n          taken: breastAreaMm2(floor.scene, room.id),\n        })),\n        ...unroomedSpaces(floor.scene).map((space) => ({\n          key: `empty:${space.ring.join(\",\")}`,\n          name: \"Empty space\",\n          polygon: space.polygon,\n          taken: 0,\n        })),\n      ],\n      (label) => label.key,\n      (label, group) =>\n        drawSpaceLabel(\n          label.name,\n          label.polygon,\n          group,\n          (px) => this.labelFont(px),\n          label.taken,\n        ),\n    );\n    this.syncEmitters(floor);\n    this.syncFixtures();\n    this.upright(this.layers.annotations);\n    this.upright(this.layers.labels);\n  }\n\n  setFixtures(fixtures: DrawnFixture[]): void {\n    this.fixtures = fixtures;\n    if (this.lastFloor) {\n      this.syncFixtures();\n    }\n  }\n\n  /** A small icon in a disc, a screen size, grey if it's there now, in its\n   * category's colour if proposed, struck through if a scenario removes it. */\n  private syncFixtures(): void {\n    const size = 13 * this.wpp;\n    syncLayer(\n      this.layers.fixtures,\n      this.fixtures,\n      (fixture) => `fx:${fixture.key}`,\n      (fixture, group) => {\n        const color =\n          fixture.state === \"proposed\"\n            ? proposedColor(fixture.kind)\n            : EXISTING_COLOR;\n        const [x, y] = fixture.at;\n        group.setAttribute(\"data-state\", fixture.state);\n        group.setAttribute(\n          \"opacity\",\n          fixture.state === \"removed\" ? \"0.6\" : \"1\",\n        );\n        if (this.rotation) {\n          group.setAttribute(\n            \"transform\",\n            `rotate(${-this.rotation} ${x} ${y})`,\n          );\n        } else {\n          group.removeAttribute(\"transform\");\n        }\n        const title = element(\"title\");\n        title.textContent = `${fixture.name}${fixture.state === \"proposed\" ? \" (proposed)\" : fixture.state === \"removed\" ? \" (removed)\" : \" (existing)\"}`;\n        group.appendChild(title);\n        if (fixture.shape && fixture.state !== \"removed\") {\n          const dashed = fixture.warned ? \"#dc2626\" : color;\n          group.appendChild(\n            element(\"polygon\", {\n              points: polygonPoints(fixture.shape.zone),\n              fill: \"none\",\n              stroke: dashed,\n              \"stroke-width\": String(1.5 * this.wpp),\n              \"stroke-dasharray\": `${6 * this.wpp} ${4 * this.wpp}`,\n            }),\n          );\n          group.appendChild(\n            element(\"polygon\", {\n              points: polygonPoints(fixture.shape.footprint),\n              fill: color,\n              \"fill-opacity\": \"0.25\",\n              stroke: color,\n              \"stroke-width\": String(1.5 * this.wpp),\n            }),\n          );\n        }\n        if (fixture.assess) {\n          const [ax, ay] = fixture.assess.at;\n          const tone = fixture.assess.passes ? \"#15803d\" : \"#dc2626\";\n          group.appendChild(\n            element(\"line\", {\n              x1: String(x),\n              y1: String(y),\n              x2: String(ax),\n              y2: String(ay),\n              stroke: tone,\n              \"stroke-width\": String(1 * this.wpp),\n              \"stroke-dasharray\": `${2 * this.wpp} ${3 * this.wpp}`,\n            }),\n          );\n          group.appendChild(\n            element(\"circle\", {\n              cx: String(ax),\n              cy: String(ay),\n              r: String(5 * this.wpp),\n              fill: tone,\n            }),\n          );\n          if (fixture.assess.label) {\n            const label = element(\"text\", {\n              x: String(ax + 8 * this.wpp),\n              y: String(ay + 4 * this.wpp),\n              fill: tone,\n              \"font-size\": String(12 * this.wpp),\n            });\n            label.textContent = fixture.assess.label;\n            group.appendChild(label);\n          }\n        }\n        group.appendChild(\n          element(\"circle\", {\n            cx: String(x),\n            cy: String(y),\n            r: String(size),\n            fill: \"#ffffff\",\n            stroke: fixture.selected ? \"#2563eb\" : color,\n            \"stroke-width\": String((fixture.selected ? 3 : 1.5) * this.wpp),\n          }),\n        );\n        const icon = element(\"g\", {\n          transform: `translate(${x - size * 0.62} ${y - size * 0.62}) scale(${(size * 1.24) / 24})`,\n          fill: \"none\",\n          stroke: color,\n          \"stroke-width\": \"2\",\n          \"stroke-linecap\": \"round\",\n          \"stroke-linejoin\": \"round\",\n        });\n        for (const path of FIXTURE_ICONS[fixture.kind]) {\n          icon.appendChild(element(\"path\", { d: path }));\n        }\n        group.appendChild(icon);\n        if (fixture.state === \"removed\") {\n          group.appendChild(\n            element(\"line\", {\n              x1: String(x - size),\n              y1: String(y + size),\n              x2: String(x + size),\n              y2: String(y - size),\n              stroke: \"#dc2626\",\n              \"stroke-width\": String(2 * this.wpp),\n            }),\n          );\n        }\n      },\n    );\n  }\n\n  /** Here rather than in sync(): their labels keep a screen size, and sit\n   * beside a radiator by which way it faces on screen. */\n  private syncEmitters(floor: Floor): void {\n    const scene = floor.scene;\n    // Beneath the walls, so the pipes stop at the room's inner face.\n    syncLayer(\n      this.layers.underfloor,\n      scene.emitters.filter((emitter) => emitter.kind === \"underfloor\"),\n      (emitter) => `pipes:${emitter.id}`,\n      (emitter, group) => {\n        const room = scene.rooms.find((r) => r.id === emitter.room);\n        if (room) {\n          group.appendChild(\n            element(\"polygon\", {\n              points: polygonPoints(polygonOf(scene, room)),\n              fill: \"url(#design-underfloor)\",\n            }),\n          );\n        }\n      },\n    );\n    syncLayer(\n      this.layers.emitters,\n      scene.emitters,\n      (emitter) => emitter.id,\n      (emitter, group) =>\n        drawEmitter(\n          emitter,\n          scene,\n          group,\n          (px) => this.labelFont(px),\n          this.rotation,\n        ),\n    );\n    this.upright(this.layers.emitters);\n  }\n\n  /** Redraw every entity layer from the floor's current state. */\n  sync(floor: Floor): void {\n    this.lastFloor = floor;\n    const scene = floor.scene;\n    this.syncTraces(floor.traces);\n    this.syncSpaces(scene);\n    syncLayer(\n      this.layers.rooms,\n      scene.rooms,\n      (room) => room.id,\n      (room, group) => drawRoom(room, scene, group),\n    );\n    syncLayer(\n      this.layers.features,\n      breasts(scene),\n      (breast) => breast.id,\n      (breast, group) => {\n        const block = breastBlock(scene, breast);\n        if (block) {\n          group.appendChild(\n            element(\"polygon\", {\n              points: polygonPoints(block),\n              fill: COLORS.wall,\n              \"fill-opacity\": \"0.55\",\n              \"data-hover\":\n                \"Chimney breast: its floor is taken out of the room\",\n            }),\n          );\n        }\n      },\n    );\n    const kinds = wallKinds(scene);\n    syncLayer(\n      this.layers.walls,\n      scene.walls,\n      (wall) => wall.id,\n      (wall, group) =>\n        drawWall(\n          wall,\n          scene,\n          group,\n          fabricColor(\n            this.fabricTypes,\n            resolveFabric(this.fabricTypes, \"WALL\", wall.fabric),\n          ),\n          this.wpp,\n          kinds.get(wall.id) ?? \"EXTERNAL\",\n        ),\n    );\n    syncLayer(\n      this.layers.openings,\n      scene.openings,\n      (opening) => opening.id,\n      (opening, group) =>\n        drawOpening(opening, scene, group, this.openingGlyph(opening)),\n    );\n    // Annotation and room labels live in syncLabels so zoom changes can\n    // re-render them at a near-constant screen size.\n    this.syncLabels(floor);\n  }\n\n  /** The floor's footprint inside its outline, and the empty spaces in it. */\n  private syncSpaces(scene: Scene): void {\n    const layer = this.layers.spaces;\n    layer.replaceChildren();\n    const faces = findFaces(scene);\n    for (const outline of faces.outlines) {\n      layer.appendChild(\n        element(\"polygon\", {\n          points: polygonPoints(outline.polygon),\n          fill: COLORS.footprint,\n        }),\n      );\n    }\n    for (const space of unroomedSpaces(scene, faces)) {\n      layer.appendChild(\n        element(\"polygon\", {\n          points: polygonPoints(space.polygon),\n          fill: \"url(#design-empty)\",\n        }),\n      );\n    }\n  }\n\n  /** The floor below (or whichever is lined up against), drawn faintly in\n   * its own colour so a storey can be checked against it; `strong` while\n   * the floor is being moved over it. */\n  setGhost(scene: Scene | null, strong = false): void {\n    const layer = this.layers.ghost;\n    layer.replaceChildren();\n    if (!scene) {\n      return;\n    }\n    const kinds = wallKinds(scene);\n    for (const wall of scene.walls) {\n      const ends = wallEnds(scene, wall);\n      if (!ends) {\n        continue;\n      }\n      const internal = kinds.get(wall.id) === \"INTERNAL\";\n      const opacity = (strong ? 0.55 : 0.3) * (internal ? 0.6 : 1);\n      layer.appendChild(\n        element(\"line\", {\n          x1: String(ends[0][0]),\n          y1: String(ends[0][1]),\n          x2: String(ends[1][0]),\n          y2: String(ends[1][1]),\n          stroke: COLORS.underlay,\n          \"stroke-width\": String(wall.thickness),\n          \"stroke-opacity\": String(opacity),\n          \"stroke-linecap\": internal ? \"butt\" : \"square\",\n        }),\n      );\n    }\n  }\n\n  /** The map's outline of the house, drawn under the plan; null clears it. */\n  setMapOutline(outline: Point[] | null): void {\n    const layer = this.layers.map;\n    layer.replaceChildren();\n    if (!outline || outline.length < 3) {\n      return;\n    }\n    layer.appendChild(\n      element(\"polygon\", {\n        points: outline.map(([x, y]) => `${x},${y}`).join(\" \"),\n        fill: COLORS.underlay,\n        \"fill-opacity\": \"0.12\",\n        stroke: COLORS.underlay,\n        \"stroke-width\": \"60\",\n        \"stroke-dasharray\": \"300 200\",\n        \"stroke-opacity\": \"0.8\",\n      }),\n    );\n  }\n\n  /** The house's plot (outer ring, then any holes); null clears it. */\n  setPlot(rings: Point[][] | null): void {\n    this.layers.plot.replaceChildren(\n      ...(rings ?? [])\n        .filter((ring) => ring.length >= 3)\n        .map((ring) =>\n          element(\"polygon\", {\n            points: ring.map(([x, y]) => `${x},${y}`).join(\" \"),\n            fill: \"none\",\n            stroke: \"#6f7a68\",\n            \"stroke-width\": \"30\",\n            \"stroke-dasharray\": \"360 220\",\n            \"stroke-opacity\": \"0.45\",\n            \"data-plot\": \"\",\n          }),\n        ),\n    );\n  }\n\n  /** The house as it is under a proposal, and what the proposal changes. */\n  setPhases(under: SVGElement[], over: SVGElement[]): void {\n    this.layers.asis.replaceChildren(...under);\n    this.layers.phases.replaceChildren(...over);\n  }\n\n  /** Room fills by heat loss, or null to show the plain plan. */\n  setHeat(heat: Map<string, HeatFill> | null): void {\n    this.heat = heat;\n    if (this.lastFloor) {\n      this.syncOverlays(this.lastFloor);\n    }\n  }\n\n  setHighlights(highlights: Highlights): void {\n    this.highlights = highlights;\n    if (this.lastFloor) {\n      this.syncOverlays(this.lastFloor);\n    }\n  }\n\n  private syncOverlays(floor: Floor): void {\n    const scene = floor.scene;\n    const heat = this.heat;\n    this.layers.heat.replaceChildren();\n    if (heat) {\n      for (const room of scene.rooms) {\n        const fill = heat.get(room.id);\n        if (!fill) {\n          continue;\n        }\n        const polygon = polygonOf(scene, room);\n        this.layers.heat.appendChild(\n          element(\"polygon\", {\n            points: polygonPoints(polygon),\n            fill: fill.color,\n            \"fill-opacity\": \"0.85\",\n          }),\n        );\n        const [cx, cy] = polygonCentroid(polygon);\n        const text = element(\"text\", {\n          \"data-pivot\": `${cx} ${cy}`,\n          x: String(cx),\n          y: String(cy + 2.2 * Number(this.labelFont(13))),\n          fill: fill.dark ? \"#ffffff\" : COLORS.label,\n          \"font-size\": this.labelFont(11),\n          \"font-family\": \"sans-serif\",\n          \"font-weight\": \"600\",\n          \"text-anchor\": \"middle\",\n        });\n        text.textContent = fill.label;\n        this.layers.heat.appendChild(text);\n      }\n      this.upright(this.layers.heat);\n    }\n\n    const layer = this.layers.highlights;\n    layer.replaceChildren();\n    const { walls, openings, rooms, dim } = this.highlights;\n    if (dim) {\n      this.dimmed(layer, scene, dim);\n    }\n    for (const room of scene.rooms) {\n      const color = rooms.get(room.id);\n      if (color) {\n        layer.appendChild(\n          element(\"polygon\", {\n            points: polygonPoints(polygonOf(scene, room)),\n            fill: \"none\",\n            stroke: color,\n            \"stroke-width\": String(4 * this.wpp),\n            \"stroke-dasharray\": `${10 * this.wpp} ${6 * this.wpp}`,\n            \"stroke-opacity\": \"0.9\",\n          }),\n        );\n      }\n    }\n    for (const wall of scene.walls) {\n      const color = walls.get(wall.id);\n      const ends = color ? wallEnds(scene, wall) : null;\n      if (!color || !ends) {\n        continue;\n      }\n      layer.appendChild(\n        element(\"line\", {\n          x1: String(ends[0][0]),\n          y1: String(ends[0][1]),\n          x2: String(ends[1][0]),\n          y2: String(ends[1][1]),\n          stroke: color,\n          \"stroke-opacity\": \"0.75\",\n          \"stroke-width\": String(wall.thickness + 10 * this.wpp),\n          \"stroke-linecap\": \"square\",\n        }),\n      );\n    }\n    for (const opening of scene.openings) {\n      const color = openings.get(opening.id);\n      const wall = color && scene.walls.find((w) => w.id === opening.wall);\n      const ends = wall ? wallEnds(scene, wall) : null;\n      if (!color || !wall || !ends) {\n        continue;\n      }\n      const from = pointAlong(ends[0], ends[1], opening.offset);\n      const to = pointAlong(ends[0], ends[1], opening.offset + opening.width);\n      layer.appendChild(\n        element(\"line\", {\n          x1: String(from[0]),\n          y1: String(from[1]),\n          x2: String(to[0]),\n          y2: String(to[1]),\n          stroke: color,\n          \"stroke-width\": String(wall.thickness + 14 * this.wpp),\n          \"stroke-opacity\": \"0.8\",\n        }),\n      );\n    }\n  }\n\n  private dimmed(\n    layer: SVGElement,\n    scene: Scene,\n    dim: NonNullable<Highlights[\"dim\"]>,\n  ): void {\n    const wash = { fill: \"#ffffff\", \"fill-opacity\": \"0.6\", stroke: \"none\" };\n    for (const room of scene.rooms) {\n      if (dim.rooms.has(room.id)) {\n        layer.appendChild(\n          element(\"polygon\", {\n            points: polygonPoints(polygonOf(scene, room)),\n            ...wash,\n          }),\n        );\n      }\n    }\n    const line = (a: Point, b: Point, width: number) =>\n      element(\"line\", {\n        x1: String(a[0]),\n        y1: String(a[1]),\n        x2: String(b[0]),\n        y2: String(b[1]),\n        stroke: \"#ffffff\",\n        \"stroke-opacity\": \"0.65\",\n        \"stroke-width\": String(width),\n        \"stroke-linecap\": \"square\",\n      });\n    for (const wall of scene.walls) {\n      const ends = dim.walls.has(wall.id) ? wallEnds(scene, wall) : null;\n      if (ends) {\n        layer.appendChild(\n          line(ends[0], ends[1], wall.thickness + 12 * this.wpp),\n        );\n      }\n    }\n    for (const opening of scene.openings) {\n      const wall = dim.openings.has(opening.id)\n        ? scene.walls.find((w) => w.id === opening.wall)\n        : undefined;\n      const ends = wall ? wallEnds(scene, wall) : null;\n      if (wall && ends) {\n        layer.appendChild(\n          line(\n            pointAlong(ends[0], ends[1], opening.offset),\n            pointAlong(ends[0], ends[1], opening.offset + opening.width),\n            wall.thickness + 16 * this.wpp,\n          ),\n        );\n      }\n    }\n  }\n\n  /** Colour/name lookup for annotation kinds, fed from the palette. */\n  setAnnotationStyles(styles: Map<string, AnnotationStyle>): void {\n    this.annotationStyles = styles;\n  }\n\n  /** The design's fabric palette, for wall colours and opening glyphs. */\n  setFabricTypes(types: FabricType[]): void {\n    this.fabricTypes = types;\n  }\n\n  private styleFor(kind: string): AnnotationStyle {\n    return this.annotationStyles.get(kind) ?? { color: \"#7c3aed\", name: kind };\n  }\n\n  private openingGlyph(opening: Opening): OpeningGlyph {\n    if (opening.type === \"window\") {\n      return {\n        glassLines: glazingLineCount(\n          resolveFabric(this.fabricTypes, \"WINDOW\", opening.fabric),\n        ),\n        insulated: false,\n      };\n    }\n    if (opening.type === \"door\") {\n      return {\n        glassLines: 0,\n        insulated: doorInsulated(\n          resolveFabric(this.fabricTypes, \"DOOR\", opening.fabric),\n        ),\n      };\n    }\n    return { glassLines: 0, insulated: false };\n  }\n\n  /** Highlight the selection: outline + endpoint handles for a wall, a bar\n   * across the gap for an opening, a dashed box around an annotation. */\n  syncSelection(\n    floor: Floor,\n    selection: {\n      type: \"wall\" | \"opening\" | \"room\" | \"annotation\" | \"emitter\";\n      id: string;\n    } | null,\n    worldPerPixel: number,\n  ): void {\n    const layer = this.layers.selection;\n    layer.replaceChildren();\n    this.drawMulti(floor, worldPerPixel);\n    if (selection === null) {\n      return;\n    }\n    // The stripes keep a fixed screen spacing at any zoom.\n    const spacing = 8 * worldPerPixel;\n    for (const hatch of this.hatches) {\n      hatch.setAttribute(\"width\", String(spacing));\n      hatch.setAttribute(\"height\", String(spacing));\n      hatch.firstElementChild?.setAttribute(\"y2\", String(spacing));\n      hatch.firstElementChild?.setAttribute(\n        \"stroke-width\",\n        String(spacing / 3),\n      );\n    }\n    if (selection.type === \"room\") {\n      const room = floor.scene.rooms.find(\n        (candidate) => candidate.id === selection.id,\n      );\n      if (!room) {\n        return;\n      }\n      layer.appendChild(\n        element(\"polygon\", {\n          points: polygonOf(floor.scene, room)\n            .map(([x, y]) => `${x},${y}`)\n            .join(\" \"),\n          fill: HATCH,\n          \"fill-opacity\": \"0.35\",\n          stroke: COLORS.wallSelected,\n          \"stroke-width\": String(2 * worldPerPixel),\n          \"stroke-dasharray\": `${6 * worldPerPixel} ${4 * worldPerPixel}`,\n        }),\n      );\n      // Keyed by vertex id: a neighbour's split shifts boundary indices.\n      for (const id of room.boundary) {\n        const at = pointOf(floor.scene, id);\n        if (at) {\n          layer.appendChild(handleRect(at, `v:${id}`, worldPerPixel));\n        }\n      }\n      return;\n    }\n    if (selection.type === \"emitter\") {\n      this.selectEmitter(floor.scene, selection.id, worldPerPixel);\n      return;\n    }\n    if (selection.type === \"annotation\") {\n      const annotation = floor.annotations.find(\n        (candidate) => `a_${candidate.id}` === selection.id,\n      );\n      if (!annotation) {\n        return;\n      }\n      const points = annotationPoints(annotation);\n      const margin = 12 * worldPerPixel;\n      const xs = points.map((point) => point[0]);\n      const ys = points.map((point) => point[1]);\n      layer.appendChild(\n        element(\"rect\", {\n          x: String(Math.min(...xs) - margin),\n          y: String(Math.min(...ys) - margin),\n          width: String(Math.max(...xs) - Math.min(...xs) + margin * 2),\n          height: String(Math.max(...ys) - Math.min(...ys) + margin * 2),\n          fill: HATCH,\n          \"fill-opacity\": \"0.3\",\n          stroke: COLORS.wallSelected,\n          \"stroke-width\": String(1.5 * worldPerPixel),\n          \"stroke-dasharray\": `${6 * worldPerPixel} ${4 * worldPerPixel}`,\n        }),\n      );\n      return;\n    }\n    if (selection.type === \"opening\") {\n      const opening = floor.scene.openings.find((o) => o.id === selection.id);\n      const wall =\n        opening && floor.scene.walls.find((w) => w.id === opening.wall);\n      if (!opening || !wall) {\n        return;\n      }\n      const ends = wallEnds(floor.scene, wall);\n      if (!ends) {\n        return;\n      }\n      const from = pointAlong(ends[0], ends[1], opening.offset);\n      const to = pointAlong(ends[0], ends[1], opening.offset + opening.width);\n      layer.appendChild(\n        element(\"line\", {\n          x1: String(from[0]),\n          y1: String(from[1]),\n          x2: String(to[0]),\n          y2: String(to[1]),\n          stroke: COLORS.wallSelected,\n          \"stroke-opacity\": \"0.5\",\n          \"stroke-width\": String(wall.thickness + 8 * worldPerPixel),\n        }),\n      );\n      layer.appendChild(\n        element(\"polygon\", {\n          points: band(from, to, wall.thickness / 2 + 4 * worldPerPixel),\n          fill: HATCH_LIGHT,\n          \"fill-opacity\": \"0.6\",\n        }),\n      );\n      return;\n    }\n    const wall = floor.scene.walls.find((w) => w.id === selection.id);\n    const ends = wall ? wallEnds(floor.scene, wall) : null;\n    if (!wall || !ends) {\n      return;\n    }\n    layer.appendChild(\n      element(\"line\", {\n        x1: String(ends[0][0]),\n        y1: String(ends[0][1]),\n        x2: String(ends[1][0]),\n        y2: String(ends[1][1]),\n        stroke: COLORS.wallSelected,\n        \"stroke-opacity\": \"0.6\",\n        \"stroke-width\": String(wall.thickness + 8 * worldPerPixel),\n        \"stroke-linecap\": \"square\",\n      }),\n    );\n    layer.appendChild(\n      element(\"polygon\", {\n        points: band(ends[0], ends[1], wall.thickness / 2 + 4 * worldPerPixel),\n        fill: HATCH_LIGHT,\n        \"fill-opacity\": \"0.6\",\n      }),\n    );\n    layer.appendChild(handleRect(ends[0], `v:${wall.a}`, worldPerPixel));\n    layer.appendChild(handleRect(ends[1], `v:${wall.b}`, worldPerPixel));\n  }\n\n  /** The walls, windows and rooms selected together, and what a hovered\n   * pill would select (lighter), on this floor. */\n  setMulti(multi: MultiDraw): void {\n    this.multi = multi;\n  }\n\n  private drawMulti(floor: Floor, worldPerPixel: number): void {\n    const layer = this.layers.selection;\n    const sets: [MultiDraw[\"items\"], string | null, boolean][] = [\n      [this.multi.items, this.multi.colour, false],\n      [this.multi.preview, this.multi.previewColour, true],\n    ];\n    for (const [items, colour, light] of sets) {\n      const stroke = colour ?? COLORS.wallSelected;\n      const fade = light ? 0.4 : 0.75;\n      for (const { type, id } of items) {\n        if (type === \"room\") {\n          const room = floor.scene.rooms.find((r) => r.id === id);\n          if (room) {\n            layer.appendChild(\n              element(\"polygon\", {\n                points: polygonPoints(polygonOf(floor.scene, room)),\n                fill: stroke,\n                \"fill-opacity\": String(fade * 0.45),\n                stroke,\n                \"stroke-opacity\": String(fade),\n                \"stroke-width\": String(2 * worldPerPixel),\n              }),\n            );\n          }\n          continue;\n        }\n        const opening =\n          type === \"opening\"\n            ? floor.scene.openings.find((o) => o.id === id)\n            : undefined;\n        const wall = floor.scene.walls.find(\n          (w) => w.id === (opening ? opening.wall : id),\n        );\n        const ends = wall ? wallEnds(floor.scene, wall) : null;\n        if (!wall || !ends || (type === \"opening\" && !opening)) {\n          continue;\n        }\n        const from = opening\n          ? pointAlong(ends[0], ends[1], opening.offset)\n          : ends[0];\n        const to = opening\n          ? pointAlong(ends[0], ends[1], opening.offset + opening.width)\n          : ends[1];\n        layer.appendChild(\n          element(\"line\", {\n            x1: String(from[0]),\n            y1: String(from[1]),\n            x2: String(to[0]),\n            y2: String(to[1]),\n            stroke,\n            \"stroke-opacity\": String(fade),\n            \"stroke-width\": String(wall.thickness + 8 * worldPerPixel),\n            \"stroke-linecap\": opening ? \"butt\" : \"square\",\n          }),\n        );\n      }\n    }\n  }\n\n  private selectEmitter(scene: Scene, id: string, worldPerPixel: number): void {\n    const layer = this.layers.selection;\n    const emitter = scene.emitters.find((candidate) => candidate.id === id);\n    if (emitter?.kind === \"underfloor\") {\n      const room = scene.rooms.find((r) => r.id === emitter.room);\n      if (room) {\n        layer.appendChild(\n          element(\"polygon\", {\n            points: polygonPoints(polygonOf(scene, room)),\n            fill: HATCH,\n            \"fill-opacity\": \"0.25\",\n            stroke: COLORS.emitter,\n            \"stroke-width\": String(2 * worldPerPixel),\n            \"stroke-dasharray\": `${6 * worldPerPixel} ${4 * worldPerPixel}`,\n          }),\n        );\n      }\n      return;\n    }\n    const bar = emitter ? radiatorBar(scene, emitter) : null;\n    if (!bar) {\n      return;\n    }\n    const half = bar.depth / 2 + 4 * worldPerPixel;\n    layer.appendChild(\n      element(\"polygon\", {\n        points: band(bar.from, bar.to, half),\n        fill: HATCH_LIGHT,\n        \"fill-opacity\": \"0.7\",\n        stroke: COLORS.wallSelected,\n        \"stroke-width\": String(2 * worldPerPixel),\n      }),\n    );\n  }\n\n  /** Replace the tool preview overlay. */\n  setPreview(nodes: SVGElement[]): void {\n    this.layers.preview.replaceChildren(...nodes);\n    this.upright(this.layers.preview);\n  }\n\n  /** The floor's traces, bottom to top. An image is made once per trace and\n   * then only moved, so dragging one never reloads it. */\n  syncTraces(\n    traces: Trace[],\n    live?: { id: number; transform: TraceTransform },\n  ): void {\n    const layer = this.layers.trace;\n    const seen = new Set<number>();\n    for (const trace of traces) {\n      if (this.compared === null ? trace.hidden : trace.id !== this.compared) {\n        continue;\n      }\n      seen.add(trace.id);\n      let image = this.traceImages.get(trace.id);\n      if (!image) {\n        image = element(\"image\", { \"data-trace\": String(trace.id) });\n        this.traceImages.set(trace.id, image);\n      }\n      if (image.getAttribute(\"href\") !== trace.file_url) {\n        image.setAttribute(\"href\", trace.file_url);\n      }\n      const transform =\n        live && live.id === trace.id ? live.transform : traceTransform(trace);\n      image.setAttribute(\n        \"transform\",\n        `translate(${transform.offsetX} ${transform.offsetY}) rotate(${transform.rotation}) scale(${transform.scale})`,\n      );\n      image.setAttribute(\n        \"opacity\",\n        this.compared !== null\n          ? \"1\"\n          : String(Math.max(0, Math.min(100, trace.opacity)) / 100),\n      );\n      layer.appendChild(image);\n    }\n    for (const [id, image] of this.traceImages) {\n      if (!seen.has(id)) {\n        image.remove();\n        this.traceImages.delete(id);\n      }\n    }\n  }\n\n  /** The box and handles round the trace being fitted; null hides them. */\n  setTraceFrame(\n    frame: { transform: TraceTransform; size: Size; locked: boolean } | null,\n  ): void {\n    this.traceFrame = frame;\n    this.drawTraceFrame();\n  }\n\n  private drawTraceFrame(): void {\n    const layer = this.layers.traceframe;\n    if (!this.traceFrame) {\n      layer.replaceChildren();\n      return;\n    }\n    const wpp = this.exactWpp;\n    const { transform, size, locked } = this.traceFrame;\n    layer.replaceChildren(\n      ...frameNodes(frameOf(transform, size, wpp), wpp, locked),\n    );\n  }\n\n  /** Hidden layers, and measures of hidden kinds, leave what's under them\n   * free to click and edit. */\n  setHidden(layers: ReadonlySet<PlanLayer>, kinds: ReadonlySet<string>): void {\n    for (const [layer, names] of Object.entries(PLAN_LAYERS)) {\n      const hidden = layers.has(layer as PlanLayer);\n      for (const name of names) {\n        this.layers[name].style.display = hidden ? \"none\" : \"\";\n      }\n    }\n    this.hiddenKinds = kinds;\n    this.hideKinds();\n  }\n\n  /** Off while a scenario aims a measure, so clicks reach the walls. */\n  setAnnotationsClickable(on: boolean): void {\n    this.layers.annotations.style.pointerEvents = on ? \"\" : \"none\";\n  }\n\n  /** Draw the open scenario's measures; a baseline (null) has none. */\n  setAnnotationScope(scope: number | null): void {\n    this.annotationScope = scope;\n  }\n\n  private hideKinds(): void {\n    for (const group of Array.from(this.layers.annotations.children)) {\n      const kind = group.getAttribute(\"data-kind\") ?? \"\";\n      (group as SVGGElement).style.display = this.hiddenKinds.has(kind)\n        ? \"none\"\n        : \"\";\n    }\n  }\n\n  /** The rooms' fills fade so a trace under them shows. */\n  setRoomsFaded(on: boolean): void {\n    if (on !== this.roomsFaded) {\n      this.roomsFaded = on;\n      this.fadeRooms();\n    }\n  }\n\n  private fadeRooms(): void {\n    for (const layer of [this.layers.rooms, this.layers.spaces]) {\n      if (this.compared !== null) {\n        layer.setAttribute(\"opacity\", \"0\");\n      } else if (this.roomsFaded) {\n        layer.setAttribute(\"opacity\", \"0.35\");\n      } else {\n        layer.removeAttribute(\"opacity\");\n      }\n    }\n  }\n\n  /** Trace and plan in contrasting inks, the plan multiplied over the trace,\n   * the rooms' fills out of the way. */\n  setCompare(traceId: number | null): void {\n    if (traceId === this.compared) {\n      return;\n    }\n    this.compared = traceId;\n    const on = traceId !== null;\n    const { trace, walls, openings } = this.layers;\n    for (const layer of [trace, walls, openings]) {\n      if (on) {\n        layer.setAttribute(\n          \"filter\",\n          layer === trace ? \"url(#design-trace-ink)\" : \"url(#design-plan-ink)\",\n        );\n      } else {\n        layer.removeAttribute(\"filter\");\n      }\n    }\n    for (const layer of [walls, openings]) {\n      layer.style.mixBlendMode = on ? \"multiply\" : \"\";\n    }\n    this.fadeRooms();\n    if (this.lastFloor) {\n      this.syncTraces(this.lastFloor.traces);\n    }\n  }\n}\n\n/** Recolours whatever it filters in one ink. A trace's paper goes clear and\n * its lines take the ink by how dark they are; the plan keeps its shapes. */\nfunction inkFilter(\n  id: string,\n  color: string,\n  byDarkness: boolean,\n): SVGFilterElement {\n  const filter = element(\"filter\", {\n    id,\n    \"color-interpolation-filters\": \"sRGB\",\n    x: \"0\",\n    y: \"0\",\n    width: \"1\",\n    height: \"1\",\n  });\n  const [r, g, b] = [1, 3, 5].map(\n    (at) => Number.parseInt(color.slice(at, at + 2), 16) / 255,\n  );\n  const alpha = byDarkness ? \"-0.32 -1.07 -0.11 1.5 0\" : \"0 0 0 1 0\";\n  filter.appendChild(\n    element(\"feColorMatrix\", {\n      type: \"matrix\",\n      values: `0 0 0 0 ${r} 0 0 0 0 ${g} 0 0 0 0 ${b} ${alpha}`,\n    }),\n  );\n  return filter;\n}\n\nfunction frameNodes(frame: Frame, wpp: number, locked: boolean): SVGElement[] {\n  const color = locked ? COLORS.ghost : COLORS.wallSelected;\n  const nodes: SVGElement[] = [\n    element(\"polygon\", {\n      points: polygonPoints(frame.corners),\n      fill: \"none\",\n      stroke: color,\n      \"stroke-width\": String(1.5 * wpp),\n      \"stroke-dasharray\": locked ? `${4 * wpp} ${4 * wpp}` : \"\",\n    }),\n  ];\n  if (locked) {\n    return nodes;\n  }\n  const handle = HANDLE_PX * wpp;\n  nodes.push(\n    element(\"line\", {\n      x1: String(frame.stem[0]),\n      y1: String(frame.stem[1]),\n      x2: String(frame.rotate[0]),\n      y2: String(frame.rotate[1]),\n      stroke: color,\n      \"stroke-width\": String(1.5 * wpp),\n    }),\n    element(\"circle\", {\n      \"data-trace-handle\": \"rotate\",\n      cx: String(frame.rotate[0]),\n      cy: String(frame.rotate[1]),\n      r: String(handle + wpp),\n      fill: \"#ffffff\",\n      stroke: color,\n      \"stroke-width\": String(1.5 * wpp),\n    }),\n    ...frame.corners.map((corner, index) =>\n      element(\"rect\", {\n        \"data-trace-handle\": `corner:${index}`,\n        x: String(corner[0] - handle),\n        y: String(corner[1] - handle),\n        width: String(2 * handle),\n        height: String(2 * handle),\n        fill: \"#ffffff\",\n        stroke: color,\n        \"stroke-width\": String(1.5 * wpp),\n      }),\n    ),\n  );\n  return nodes;\n}\n\nfunction drawWall(\n  wall: Wall,\n  scene: Scene,\n  group: SVGGElement,\n  color: string,\n  worldPerPixel: number,\n  kind: string,\n): void {\n  const ends = wallEnds(scene, wall);\n  if (!ends) {\n    return;\n  }\n  const internal = kind === \"INTERNAL\";\n  // A party wall loses no heat, and the brush that marks one paints it violet.\n  const stroke = kind === \"PARTY\" ? COLORS.party : color;\n  const mine = scene.openings.filter((opening) => opening.wall === wall.id);\n  // The centreline is split into solid segments around the wall's openings.\n  for (const [from, to] of wallSegments(ends[0], ends[1], mine)) {\n    group.appendChild(\n      element(\"line\", {\n        x1: String(from[0]),\n        y1: String(from[1]),\n        x2: String(to[0]),\n        y2: String(to[1]),\n        stroke,\n        // Lighter, not dashed: on a plan a dash means hidden or overhead.\n        \"stroke-opacity\": internal ? String(INTERNAL_OPACITY) : \"1\",\n        \"stroke-width\": String(wall.thickness),\n        // A square cap fills an external corner but pokes a partition through.\n        \"stroke-linecap\": internal ? \"butt\" : \"square\",\n      }),\n    );\n  }\n  // An invisible full-length fat twin so thin walls stay easy to click; sized\n  // in screen pixels, as a fixed pad swallows a small room when zoomed in.\n  group.appendChild(\n    element(\"line\", {\n      x1: String(ends[0][0]),\n      y1: String(ends[0][1]),\n      x2: String(ends[1][0]),\n      y2: String(ends[1][1]),\n      stroke: \"transparent\",\n      \"stroke-width\": String(Math.max(wall.thickness, 8 * worldPerPixel)),\n      \"stroke-linecap\": \"square\",\n    }),\n  );\n}\n\nconst GLYPH_STROKE = \"24\";\n\ninterface OpeningGlyph {\n  /** Glass lines for a window: 1/2/3 for single/double/triple glazing. */\n  glassLines: number;\n  /** Insulated doors draw a heavier leaf. */\n  insulated: boolean;\n}\n\nfunction drawOpening(\n  opening: Opening,\n  scene: Scene,\n  group: SVGGElement,\n  glyph: OpeningGlyph,\n): void {\n  const wall = scene.walls.find((w) => w.id === opening.wall);\n  if (!wall) {\n    return;\n  }\n  const ends = wallEnds(scene, wall);\n  if (!ends) {\n    return;\n  }\n  const frame = wallFrame(ends[0], ends[1]);\n  const [ox, oy] = pointAlong(ends[0], ends[1], opening.offset);\n  group.setAttribute(\n    \"transform\",\n    `translate(${ox} ${oy}) rotate(${frame.angleDeg})`,\n  );\n  const width = opening.width;\n  const half = wall.thickness / 2;\n\n  // Jamb ticks across the wall at both ends of the gap.\n  for (const x of [0, width]) {\n    group.appendChild(\n      element(\"line\", {\n        x1: String(x),\n        y1: String(-half),\n        x2: String(x),\n        y2: String(half),\n        stroke: COLORS.wall,\n        \"stroke-width\": GLYPH_STROKE,\n      }),\n    );\n  }\n\n  if (opening.type === \"door\") {\n    const side = opening.swing === \"right\" ? 1 : -1;\n    // Each leaf perpendicular to the wall (heavier when insulated), then a\n    // quarter arc back to where it closes.\n    for (const [hingeX, farX] of doorLeaves(opening, 0, width)) {\n      const leaf = Math.abs(farX - hingeX);\n      group.appendChild(\n        element(\"line\", {\n          x1: String(hingeX),\n          y1: \"0\",\n          x2: String(hingeX),\n          y2: String(side * leaf),\n          stroke: COLORS.wall,\n          \"stroke-width\": glyph.insulated ? \"72\" : GLYPH_STROKE,\n        }),\n      );\n      const sweep = hingeX < farX === (side === 1) ? 1 : 0;\n      group.appendChild(\n        element(\"path\", {\n          d: `M ${farX} 0 A ${leaf} ${leaf} 0 0 ${sweep} ${hingeX} ${side * leaf}`,\n          fill: \"none\",\n          stroke: COLORS.wall,\n          \"stroke-width\": \"12\",\n          \"stroke-dasharray\": \"60 60\",\n        }),\n      );\n    }\n  } else if (opening.type === \"window\") {\n    // Frame edges plus one glass line per glazing pane (1/2/3).\n    for (const y of [-half, half]) {\n      group.appendChild(\n        element(\"line\", {\n          x1: \"0\",\n          y1: String(y),\n          x2: String(width),\n          y2: String(y),\n          stroke: COLORS.wall,\n          \"stroke-width\": GLYPH_STROKE,\n        }),\n      );\n    }\n    const lines = Math.max(1, glyph.glassLines);\n    const spread = half; // glass lines sit within the frame edges\n    for (let index = 0; index < lines; index++) {\n      const y = lines === 1 ? 0 : -spread / 2 + (spread / (lines - 1)) * index;\n      group.appendChild(\n        element(\"line\", {\n          x1: \"0\",\n          y1: String(y),\n          x2: String(width),\n          y2: String(y),\n          stroke: COLORS.wall,\n          \"stroke-width\": \"12\",\n        }),\n      );\n    }\n  } else {\n    // A plain opening: dashed gap edges.\n    for (const y of [-half, half]) {\n      group.appendChild(\n        element(\"line\", {\n          x1: \"0\",\n          y1: String(y),\n          x2: String(width),\n          y2: String(y),\n          stroke: COLORS.wall,\n          \"stroke-width\": \"12\",\n          \"stroke-dasharray\": \"80 80\",\n        }),\n      );\n    }\n  }\n\n  // An invisible hit pad over the gap so the opening is easy to select.\n  group.appendChild(\n    element(\"rect\", {\n      x: \"0\",\n      y: String(-Math.max(half, 100)),\n      width: String(width),\n      height: String(Math.max(wall.thickness, 200)),\n      fill: \"transparent\",\n    }),\n  );\n}\n\nfunction polygonPoints(polygon: [number, number][]): string {\n  return polygon.map(([x, y]) => `${x},${y}`).join(\" \");\n}\n\n/** A radiator as a bar just inside its wall, named by its type and size;\n * underfloor heating as pipe runs over its room, named above the room's. */\nfunction drawEmitter(\n  emitter: Emitter,\n  scene: Scene,\n  group: SVGGElement,\n  font: LabelFont,\n  rotation: number,\n): void {\n  const tag = (at: Point, text: string, anchor = \"middle\", pivot = at) => {\n    const label = element(\"text\", {\n      \"data-pivot\": `${pivot[0]} ${pivot[1]}`,\n      x: String(at[0]),\n      y: String(at[1]),\n      fill: COLORS.emitter,\n      \"font-size\": font(10),\n      \"font-family\": \"sans-serif\",\n      \"font-weight\": \"600\",\n      \"text-anchor\": anchor,\n      \"dominant-baseline\": \"middle\",\n      \"paint-order\": \"stroke\",\n      stroke: \"#ffffff\",\n      \"stroke-width\": String(Number(font(10)) / 4),\n    });\n    label.textContent = text;\n    group.appendChild(label);\n  };\n\n  if (emitter.kind === \"underfloor\") {\n    const room = scene.rooms.find((candidate) => candidate.id === emitter.room);\n    if (!room) {\n      return;\n    }\n    // Its pipes are in the underfloor layer; this tag is what selects it.\n    // Turns about the room's name, so it stays above it on a turned plan.\n    const [cx, cy] = polygonCentroid(polygonOf(scene, room));\n    tag([cx, cy - 1.4 * Number(font(13))], \"Underfloor\", \"middle\", [cx, cy]);\n    return;\n  }\n\n  const bar = radiatorBar(scene, emitter);\n  if (!bar) {\n    return;\n  }\n  group.appendChild(\n    element(\"polygon\", {\n      points: band(bar.from, bar.to, bar.depth / 2),\n      fill: COLORS.emitter,\n      stroke: \"#ffffff\",\n      \"stroke-width\": \"10\",\n    }),\n  );\n  // A fat invisible twin so a thin radiator is easy to grab, short of the wall.\n  group.appendChild(\n    element(\"polygon\", {\n      points: band(bar.from, bar.to, Math.max(bar.depth / 2, 100)),\n      fill: \"transparent\",\n    }),\n  );\n  // Upright text runs across the screen, so off a radiator facing sideways\n  // on screen it starts beside the bar rather than centring over it.\n  const turn = (rotation * Math.PI) / 180;\n  const across =\n    bar.inward[0] * Math.cos(turn) - bar.inward[1] * Math.sin(turn);\n  const sideways = Math.abs(across) > Math.SQRT1_2;\n  const size = Number(font(10));\n  const away = bar.depth / 2 + (sideways ? 0.4 : 0.9) * size;\n  tag(\n    [\n      (bar.from[0] + bar.to[0]) / 2 + bar.inward[0] * away,\n      (bar.from[1] + bar.to[1]) / 2 + bar.inward[1] * away,\n    ],\n    `T${emitter.type} ${emitter.height}\u00D7${emitter.length}`,\n    sideways ? (across > 0 ? \"start\" : \"end\") : \"middle\",\n  );\n}\n\nfunction drawRoom(room: Room, scene: Scene, group: SVGGElement): void {\n  group.appendChild(\n    element(\"polygon\", {\n      points: polygonPoints(polygonOf(scene, room)),\n      fill: COLORS.room,\n      \"fill-opacity\": \"0.6\",\n      stroke: COLORS.roomEdge,\n      \"stroke-width\": \"10\",\n    }),\n  );\n}\n\n/** A draggable endpoint/vertex handle: a visible square plus an invisible\n * fat hit pad, both opting back into pointer events (the selection layer\n * itself is pointer-transparent). */\nfunction handleRect(\n  at: Point,\n  handle: string,\n  worldPerPixel: number,\n): SVGGElement {\n  const group = element(\"g\", {\n    \"data-handle\": handle,\n    \"pointer-events\": \"all\",\n  });\n  const size = 12 * worldPerPixel;\n  const pad = 28 * worldPerPixel;\n  group.appendChild(\n    element(\"rect\", {\n      x: String(at[0] - size / 2),\n      y: String(at[1] - size / 2),\n      width: String(size),\n      height: String(size),\n      fill: \"#ffffff\",\n      stroke: COLORS.wallSelected,\n      \"stroke-width\": String(2.5 * worldPerPixel),\n    }),\n  );\n  group.appendChild(\n    element(\"rect\", {\n      x: String(at[0] - pad / 2),\n      y: String(at[1] - pad / 2),\n      width: String(pad),\n      height: String(pad),\n      fill: \"transparent\",\n    }),\n  );\n  return group;\n}\n\nfunction annotationPoints(annotation: Annotation): Point[] {\n  const geometry = annotation.geometry;\n  if (geometry.type === \"point\") {\n    return [geometry.at];\n  }\n  if (geometry.type === \"line\") {\n    return geometry.points;\n  }\n  return geometry.polygon;\n}\n\ntype LabelFont = (px: number) => string;\n\nfunction annotationLabel(\n  annotation: Annotation,\n  style: AnnotationStyle,\n  at: Point,\n  group: SVGGElement,\n  font: LabelFont,\n): void {\n  const text = element(\"text\", {\n    x: String(at[0]),\n    y: String(at[1]),\n    fill: style.color,\n    \"font-size\": font(13),\n    \"font-family\": \"sans-serif\",\n    \"font-weight\": \"600\",\n    \"text-anchor\": \"middle\",\n    \"paint-order\": \"stroke\",\n    stroke: \"#ffffff\",\n    \"stroke-width\": \"60\",\n  });\n  text.textContent = annotation.label || style.name;\n  group.appendChild(text);\n}\n\nfunction drawAnnotation(\n  annotation: Annotation,\n  style: AnnotationStyle,\n  group: SVGGElement,\n  font: LabelFont,\n): void {\n  const geometry = annotation.geometry;\n  const faded = annotation.status === \"REJECTED\" ? \"0.35\" : \"1\";\n  group.setAttribute(\"opacity\", faded);\n\n  if (geometry.type === \"point\") {\n    const [x, y] = geometry.at;\n    group.appendChild(\n      element(\"circle\", {\n        cx: String(x),\n        cy: String(y),\n        r: \"250\",\n        fill: style.color,\n        stroke: \"#ffffff\",\n        \"stroke-width\": \"50\",\n      }),\n    );\n    annotationLabel(annotation, style, [x, y + 550], group, font);\n    return;\n  }\n\n  if (geometry.type === \"line\") {\n    const points = geometry.points.map(([x, y]) => `${x},${y}`).join(\" \");\n    group.appendChild(\n      element(\"polyline\", {\n        points,\n        fill: \"none\",\n        stroke: style.color,\n        \"stroke-opacity\": \"0.45\",\n        \"stroke-width\": \"160\",\n        \"stroke-linecap\": \"round\",\n        \"stroke-linejoin\": \"round\",\n      }),\n    );\n    // A fat invisible twin keeps thin runs clickable.\n    group.appendChild(\n      element(\"polyline\", {\n        points,\n        fill: \"none\",\n        stroke: \"transparent\",\n        \"stroke-width\": \"300\",\n      }),\n    );\n    const a = geometry.points[0];\n    const b = geometry.points[1];\n    if (a && b) {\n      annotationLabel(\n        annotation,\n        style,\n        [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2 - 250],\n        group,\n        font,\n      );\n    }\n    return;\n  }\n\n  group.appendChild(\n    element(\"polygon\", {\n      points: geometry.polygon.map(([x, y]) => `${x},${y}`).join(\" \"),\n      fill: style.color,\n      \"fill-opacity\": \"0.15\",\n      stroke: style.color,\n      \"stroke-opacity\": \"0.7\",\n      \"stroke-width\": \"30\",\n      \"stroke-dasharray\": \"120 80\",\n    }),\n  );\n  annotationLabel(\n    annotation,\n    style,\n    polygonCentroid(geometry.polygon),\n    group,\n    font,\n  );\n}\n\nfunction drawSpaceLabel(\n  text: string,\n  polygon: Point[],\n  group: SVGGElement,\n  font: LabelFont,\n  takenMm2 = 0,\n): void {\n  const [cx, cy] = polygonCentroid(polygon);\n  const name = element(\"text\", {\n    x: String(cx),\n    y: String(cy),\n    fill: COLORS.label,\n    \"font-size\": font(13),\n    \"font-family\": \"sans-serif\",\n    \"text-anchor\": \"middle\",\n  });\n  name.textContent = text;\n  const area = element(\"text\", {\n    \"data-pivot\": `${cx} ${cy}`,\n    x: String(cx),\n    y: String(cy + Number(font(15))),\n    fill: COLORS.label,\n    \"font-size\": font(11),\n    \"font-family\": \"sans-serif\",\n    \"text-anchor\": \"middle\",\n  });\n  area.textContent = formatAreaM2(polygonArea(polygon) - takenMm2);\n  group.appendChild(name);\n  group.appendChild(area);\n}\n\n/** The annotation a plan element is, if it's the open scenario's own to edit. */\nexport function annotationIn<\n  T extends { id: number; package?: number | null | undefined },\n>(\n  annotations: readonly T[],\n  domId: string,\n  scope: number | null,\n): T | undefined {\n  return annotations.find(\n    (annotation) =>\n      `a_${annotation.id}` === domId && inScope(annotation, scope),\n  );\n}\n\n/** Marks stop taking clicks while a scenario aims a measure, so walls under them do. */\nexport function annotationsClickable(\n  targetOption: string,\n  mode: string,\n): boolean {\n  return !(targetOption && mode === \"design\");\n}\n", "// Triangle soup for the 3D model, in metres. A plan point [x, y] (mm, y down)\n// sits at X = x, Z = y, with Y up, so the plan reads the same from above.\n\nimport type { Point } from \"../scene\";\n\nexport type Vec3 = [number, number, number];\n\nconst MM = 0.001;\n\nexport function at(point: Point, heightMm: number): Vec3 {\n  return [point[0] * MM, heightMm * MM, point[1] * MM];\n}\n\nfunction sub(a: Vec3, b: Vec3): Vec3 {\n  return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n  return [\n    a[1] * b[2] - a[2] * b[1],\n    a[2] * b[0] - a[0] * b[2],\n    a[0] * b[1] - a[1] * b[0],\n  ];\n}\n\nfunction dot(a: Vec3, b: Vec3): number {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/** Flat-shaded triangles, each wound to face the way it's told. */\nexport class Soup {\n  readonly positions: number[] = [];\n\n  /** A convex or gently concave polygon, fanned, facing `outward`. */\n  polygon(points: readonly Vec3[], outward: Vec3): void {\n    if (points.length < 3) {\n      return;\n    }\n    const first = points[0] as Vec3;\n    for (let index = 1; index < points.length - 1; index++) {\n      this.triangle(\n        first,\n        points[index] as Vec3,\n        points[index + 1] as Vec3,\n        outward,\n      );\n    }\n  }\n\n  triangle(a: Vec3, b: Vec3, c: Vec3, outward: Vec3): void {\n    const normal = cross(sub(b, a), sub(c, a));\n    if (Math.hypot(...normal) < 1e-12) {\n      return;\n    }\n    if (dot(normal, outward) < 0) {\n      this.positions.push(...a, ...c, ...b);\n    } else {\n      this.positions.push(...a, ...b, ...c);\n    }\n  }\n\n  /** A plan polygon as a flat face at `heightMm`, triangulated by `triangles`. */\n  flat(\n    triangles: readonly (readonly [Point, Point, Point])[],\n    heightMm: number,\n    up: boolean,\n  ): void {\n    const outward: Vec3 = [0, up ? 1 : -1, 0];\n    for (const [a, b, c] of triangles) {\n      this.triangle(at(a, heightMm), at(b, heightMm), at(c, heightMm), outward);\n    }\n  }\n\n  /** The upright face from `a` to `b` between two heights. */\n  upright(\n    a: Point,\n    b: Point,\n    fromMm: number,\n    toMm: number,\n    outward: Point,\n  ): void {\n    if (toMm - fromMm < 1) {\n      return;\n    }\n    this.polygon(\n      [at(a, fromMm), at(b, fromMm), at(b, toMm), at(a, toMm)],\n      [outward[0], 0, outward[1]],\n    );\n  }\n\n  get triangles(): number {\n    return this.positions.length / 9;\n  }\n}\n", "// Roofs from a storey's outline. The outline is squared up and covered by\n// every largest rectangle that fits in it; each rectangle gets a gable or hip\n// roof at the same pitch from the same eaves, and together they make the\n// valleys and hips of an L, T or U without a straight skeleton. Pure.\n\nimport { pointInPolygon, triangulate } from \"../faces\";\nimport type { FabricType, Point } from \"../scene\";\nimport { squareAngle } from \"../snap\";\nimport { Soup, type Vec3, at } from \"./mesh\";\n\nexport type RoofKind = \"gable\" | \"hip\" | \"flat\";\n\nexport interface RoofSpec {\n  kind: RoofKind;\n  pitchDeg: number;\n  /** How far the eaves overhang the walls, mm. */\n  overhangMm: number;\n}\n\nexport interface Roof {\n  /** The roof's surfaces. */\n  roof: Soup;\n  /** Gable ends: wall up to the roof. */\n  gables: Soup;\n  /** Of the roof itself, slopes included, m\u00B2. */\n  areaM2: number;\n  /** Highest point, mm. */\n  ridgeMm: number;\n}\n\n/** The roof as saved (apps/design/model3d.py): blanks take the defaults. */\nexport interface RoofSettings {\n  kind: \"auto\" | RoofKind;\n  pitch: number | null;\n  overhang: number | null;\n}\n\n/** What the EPC and the survey say the roof is. */\nexport interface RoofHints {\n  flat: boolean;\n  room_in_roof: boolean;\n  property_type: string;\n}\n\nconst TERRACES = new Set([\"MID_TERRACE\", \"END_TERRACE\"]);\n\n/** The roof the settings make, with Auto read from the EPC and the plan. */\nexport function roofFor(\n  saved: RoofSettings,\n  hints: RoofHints,\n  types: readonly FabricType[],\n): { spec: RoofSpec; roomInRoof: boolean; auto: RoofKind } {\n  const roofType = types.find(\n    (type) => type.element === \"ROOF\" && type.is_default,\n  );\n  const auto: RoofKind = hints.flat\n    ? \"flat\"\n    : TERRACES.has(hints.property_type)\n      ? \"gable\"\n      : \"hip\";\n  const kind = saved.kind === \"auto\" ? auto : saved.kind;\n  // Only the plan's own roof cuts the top storey down to a knee wall: the EPC\n  // can say roof room when the loft isn't drawn at all.\n  const roomInRoof = kind !== \"flat\" && roofType?.spec[\"room_in_roof\"] === true;\n  const steep = roomInRoof || hints.room_in_roof;\n  const pitch = kind === \"flat\" ? 0 : (saved.pitch ?? (steep ? 45 : 35));\n  const overhang = kind === \"flat\" ? 0 : (saved.overhang ?? 300);\n  return {\n    spec: { kind, pitchDeg: pitch, overhangMm: overhang },\n    roomInRoof,\n    auto,\n  };\n}\n\n/** Coordinates closer than this, mm, are one grid line. A roof rides over a\n * jog in the walls smaller than its overhang; an open storey's edge doesn't. */\nconst ROOF_MERGE_MM = 450;\nconst EDGE_MERGE_MM = 40;\n/** A rectangle narrower than this either way isn't worth a roof. */\nconst SLIVER_MM = 500;\n/** Thickness of a flat roof and of a gable's wall, mm. */\nconst FLAT_MM = 200;\n/** A party wall this near a roof's side, mm, gables it: storeys and the\n * map's footprint never line up exactly. */\nconst PARTY_REACH_MM = 750;\nconst GABLE_MM = 250;\n\ninterface Frame {\n  to(point: Point): Point;\n  from(point: Point): Point;\n}\n\nfunction frame(angle: number): Frame {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  return {\n    to: ([x, y]) => [x * cos + y * sin, -x * sin + y * cos],\n    from: ([u, v]) => [u * cos - v * sin, u * sin + v * cos],\n  };\n}\n\nfunction lines(values: number[], merge: number): number[] {\n  const sorted = [...values].sort((a, b) => a - b);\n  const merged: number[][] = [];\n  for (const value of sorted) {\n    const last = merged[merged.length - 1];\n    if (last && value - (last[last.length - 1] as number) < merge) {\n      last.push(value);\n    } else {\n      merged.push([value]);\n    }\n  }\n  return merged.map(\n    (group) => group.reduce((sum, value) => sum + value, 0) / group.length,\n  );\n}\n\nexport interface Rect {\n  x0: number;\n  y0: number;\n  x1: number;\n  y1: number;\n}\n\n/** Cells of a grid laid on the polygons' corners, and which are inside. */\ninterface Grid {\n  xs: number[];\n  ys: number[];\n  inside: boolean[][];\n}\n\nfunction grid(\n  polygons: readonly Point[][],\n  inside: (centre: Point) => boolean,\n  merge: number,\n): Grid {\n  const xs = lines(\n    polygons.flatMap((polygon) => polygon.map((p) => p[0])),\n    merge,\n  );\n  const ys = lines(\n    polygons.flatMap((polygon) => polygon.map((p) => p[1])),\n    merge,\n  );\n  const cells = ys.slice(0, -1).map((y, row) =>\n    xs.slice(0, -1).map((x, column) => {\n      const centre: Point = [\n        (x + (xs[column + 1] as number)) / 2,\n        (y + (ys[row + 1] as number)) / 2,\n      ];\n      return inside(centre);\n    }),\n  );\n  return { xs, ys, inside: cells };\n}\n\n/** Every rectangle of inside cells that can't grow any way. */\nexport function largestRectangles(cells: Grid): Rect[] {\n  const { xs, ys, inside } = cells;\n  const rows = inside.length;\n  const rects = new Map<string, Rect>();\n  const all = (row: number, c0: number, c1: number): boolean => {\n    const cellsRow = inside[row];\n    if (!cellsRow) {\n      return false;\n    }\n    for (let column = c0; column <= c1; column++) {\n      if (!cellsRow[column]) {\n        return false;\n      }\n    }\n    return true;\n  };\n  for (let top = 0; top < rows; top++) {\n    let open = [...(inside[top] as boolean[])];\n    for (let bottom = top; bottom < rows; bottom++) {\n      open = open.map((value, column) =>\n        Boolean(value && (inside[bottom] as boolean[])[column]),\n      );\n      if (!open.some(Boolean)) {\n        break;\n      }\n      let column = 0;\n      while (column < open.length) {\n        if (!open[column]) {\n          column++;\n          continue;\n        }\n        const start = column;\n        while (column < open.length && open[column]) {\n          column++;\n        }\n        const end = column - 1;\n        if (all(top - 1, start, end) || all(bottom + 1, start, end)) {\n          continue;\n        }\n        const rect = {\n          x0: xs[start] as number,\n          x1: xs[end + 1] as number,\n          y0: ys[top] as number,\n          y1: ys[bottom + 1] as number,\n        };\n        rects.set(`${start},${end},${top},${bottom}`, rect);\n      }\n    }\n  }\n  return [...rects.values()].filter(\n    (rect) => rect.x1 - rect.x0 >= SLIVER_MM && rect.y1 - rect.y0 >= SLIVER_MM,\n  );\n}\n\n/** Area of a union of rectangles, mm\u00B2. */\nexport function unionArea(rects: readonly Rect[]): number {\n  if (rects.length === 0) {\n    return 0;\n  }\n  const xs = [...new Set(rects.flatMap((r) => [r.x0, r.x1]))].sort(\n    (a, b) => a - b,\n  );\n  const ys = [...new Set(rects.flatMap((r) => [r.y0, r.y1]))].sort(\n    (a, b) => a - b,\n  );\n  let area = 0;\n  for (let i = 0; i < xs.length - 1; i++) {\n    for (let j = 0; j < ys.length - 1; j++) {\n      const cx = ((xs[i] as number) + (xs[i + 1] as number)) / 2;\n      const cy = ((ys[j] as number) + (ys[j + 1] as number)) / 2;\n      if (\n        rects.some((r) => r.x0 <= cx && cx <= r.x1 && r.y0 <= cy && cy <= r.y1)\n      ) {\n        area +=\n          ((xs[i + 1] as number) - (xs[i] as number)) *\n          ((ys[j + 1] as number) - (ys[j] as number));\n      }\n    }\n  }\n  return area;\n}\n\n/** Which of a rectangle's sides lie along a party wall. */\nfunction partySides(\n  rect: Rect,\n  party: readonly [Point, Point][],\n): { x0: boolean; x1: boolean; y0: boolean; y1: boolean } {\n  const along = (\n    fixed: number,\n    from: number,\n    to: number,\n    vertical: boolean,\n  ): boolean =>\n    party.some(([a, b]) => {\n      const [fa, ma] = vertical ? [a[0], a[1]] : [a[1], a[0]];\n      const [fb, mb] = vertical ? [b[0], b[1]] : [b[1], b[0]];\n      if (\n        Math.abs(fa - fixed) > PARTY_REACH_MM ||\n        Math.abs(fb - fixed) > PARTY_REACH_MM\n      ) {\n        return false;\n      }\n      const overlap =\n        Math.min(to, Math.max(ma, mb)) - Math.max(from, Math.min(ma, mb));\n      return overlap > (to - from) / 2;\n    });\n  return {\n    x0: along(rect.x0, rect.y0, rect.y1, true),\n    x1: along(rect.x1, rect.y0, rect.y1, true),\n    y0: along(rect.y0, rect.x0, rect.x1, false),\n    y1: along(rect.y1, rect.x0, rect.x1, false),\n  };\n}\n\n/**\n * One rectangle's roof, with its ridge along u. `walls` is the rectangle the\n * walls make; the roof runs out past it by the overhang. `place` takes a\n * point in (u, v) back to the plan.\n */\nfunction rectangleRoof(\n  walls: { u0: number; u1: number; v0: number; v1: number },\n  ends: { start: boolean; end: boolean },\n  spec: RoofSpec,\n  eaveMm: number,\n  place: (u: number, v: number) => Point,\n  roof: Soup,\n  gables: Soup,\n): number {\n  const slope = Math.tan((spec.pitchDeg * Math.PI) / 180);\n  const o = spec.overhangMm;\n  const u0 = walls.u0 - o;\n  const u1 = walls.u1 + o;\n  const v0 = walls.v0 - o;\n  const v1 = walls.v1 + o;\n  const half = (v1 - v0) / 2;\n  const middle = (v0 + v1) / 2;\n  const edge = eaveMm - o * slope;\n  const ridge = edge + half * slope;\n  // A gable end runs the ridge out to the verge; a hip pulls it back.\n  let r0 = ends.start ? u0 : u0 + half;\n  let r1 = ends.end ? u1 : u1 - half;\n  if (r0 > r1) {\n    r0 = r1 = (r0 + r1) / 2;\n  }\n  const p = (u: number, v: number, height: number): Vec3 =>\n    at(place(u, v), height);\n  const up = (u: number, v: number): Vec3 => {\n    const [x, , z] = p(u, v, 0);\n    const [cx, , cz] = p((u0 + u1) / 2, middle, 0);\n    return [x - cx, 1, z - cz];\n  };\n  // The two long slopes.\n  roof.polygon(\n    [\n      p(u0, v0, edge),\n      p(u1, v0, edge),\n      p(r1, middle, ridge),\n      p(r0, middle, ridge),\n    ],\n    up((u0 + u1) / 2, v0),\n  );\n  roof.polygon(\n    [\n      p(u0, v1, edge),\n      p(u1, v1, edge),\n      p(r1, middle, ridge),\n      p(r0, middle, ridge),\n    ],\n    up((u0 + u1) / 2, v1),\n  );\n  for (const [isGable, uEdge, uWall, inward] of [\n    [ends.start, u0, walls.u0, 1],\n    [ends.end, u1, walls.u1, -1],\n  ] as const) {\n    const rEnd = uEdge === u0 ? r0 : r1;\n    if (!isGable) {\n      roof.triangle(\n        p(uEdge, v0, edge),\n        p(uEdge, v1, edge),\n        p(rEnd, middle, ridge),\n        up(uEdge, middle),\n      );\n      continue;\n    }\n    // The gable wall, from the eaves to just under the roof, a wall thick.\n    const top = eaveMm + ((walls.v1 - walls.v0) / 2) * slope;\n    for (const [uFace, out] of [\n      [uWall, -inward],\n      [uWall + inward * GABLE_MM, inward],\n    ] as const) {\n      const [ox, , oz] = p(uFace + out, middle, 0);\n      const [fx, , fz] = p(uFace, middle, 0);\n      gables.triangle(\n        p(uFace, walls.v0, eaveMm),\n        p(uFace, walls.v1, eaveMm),\n        p(uFace, middle, top),\n        [ox - fx, 0, oz - fz],\n      );\n    }\n    for (const [va, ha, vb, hb] of [\n      [walls.v0, eaveMm, middle, top],\n      [middle, top, walls.v1, eaveMm],\n    ] as const) {\n      const a = p(uWall, va, ha);\n      const b = p(uWall, vb, hb);\n      const c = p(uWall + inward * GABLE_MM, vb, hb);\n      const d = p(uWall + inward * GABLE_MM, va, ha);\n      gables.polygon([a, b, c, d], [0, 1, 0]);\n    }\n  }\n  return ridge;\n}\n\n/** The roof over `outlines`, which sit with their eaves at `eaveMm`. */\nexport function roofOver(\n  outlines: readonly Point[][],\n  party: readonly [Point, Point][],\n  spec: RoofSpec,\n  eaveMm: number,\n): Roof {\n  const roof = new Soup();\n  const gables = new Soup();\n  const usable = outlines.filter((outline) => outline.length >= 3);\n  if (usable.length === 0) {\n    return { roof, gables, areaM2: 0, ridgeMm: eaveMm };\n  }\n  if (spec.kind === \"flat\" || spec.pitchDeg < 3) {\n    return flatRoof(usable, eaveMm);\n  }\n  const angle = squareAngle(\n    usable.flatMap((outline) =>\n      outline.map(\n        (point, index) =>\n          [point, outline[(index + 1) % outline.length] as Point] as [\n            Point,\n            Point,\n          ],\n      ),\n    ),\n  );\n  const turn = frame(angle);\n  const turned = usable.map((outline) => outline.map(turn.to));\n  const turnedParty = party.map(\n    ([a, b]) => [turn.to(a), turn.to(b)] as [Point, Point],\n  );\n  const cells = grid(\n    turned,\n    (centre) => turned.some((outline) => pointInPolygon(centre, outline)),\n    ROOF_MERGE_MM,\n  );\n  const rects = largestRectangles(cells);\n  let ridgeMm = eaveMm;\n  for (const rect of rects) {\n    const sides = partySides(rect, turnedParty);\n    const width = rect.x1 - rect.x0;\n    const depth = rect.y1 - rect.y0;\n    const partyX = sides.x0 || sides.x1;\n    const partyY = sides.y0 || sides.y1;\n    // The ridge runs between party walls, else along the longer side.\n    const alongX = partyX === partyY ? width >= depth : partyX;\n    const gable = spec.kind === \"gable\";\n    if (alongX) {\n      ridgeMm = Math.max(\n        ridgeMm,\n        rectangleRoof(\n          { u0: rect.x0, u1: rect.x1, v0: rect.y0, v1: rect.y1 },\n          { start: gable || sides.x0, end: gable || sides.x1 },\n          spec,\n          eaveMm,\n          (u, v) => turn.from([u, v]),\n          roof,\n          gables,\n        ),\n      );\n    } else {\n      ridgeMm = Math.max(\n        ridgeMm,\n        rectangleRoof(\n          { u0: rect.y0, u1: rect.y1, v0: rect.x0, v1: rect.x1 },\n          { start: gable || sides.y0, end: gable || sides.y1 },\n          spec,\n          eaveMm,\n          (u, v) => turn.from([v, u]),\n          roof,\n          gables,\n        ),\n      );\n    }\n  }\n  const o = spec.overhangMm;\n  const planMm2 = unionArea(\n    rects.map((r) => ({\n      x0: r.x0 - o,\n      x1: r.x1 + o,\n      y0: r.y0 - o,\n      y1: r.y1 + o,\n    })),\n  );\n  const cos = Math.cos((spec.pitchDeg * Math.PI) / 180);\n  return { roof, gables, areaM2: planMm2 / 1e6 / cos, ridgeMm };\n}\n\nfunction polygonArea(polygon: readonly Point[]): number {\n  let doubled = 0;\n  polygon.forEach((a, index) => {\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  });\n  return Math.abs(doubled / 2);\n}\n\n/** A flat roof: a slab on the walls, the outline's own shape. */\nexport function flatRoof(outlines: readonly Point[][], eaveMm: number): Roof {\n  const roof = new Soup();\n  let area = 0;\n  for (const outline of outlines) {\n    const triangles = triangulate(outline);\n    if (!triangles) {\n      continue;\n    }\n    area += polygonArea(outline);\n    roof.flat(triangles, eaveMm + FLAT_MM, true);\n    roof.flat(triangles, eaveMm, false);\n    outline.forEach((a, index) => {\n      const b = outline[(index + 1) % outline.length] as Point;\n      const centre = outline.reduce<Point>(\n        (sum, point) => [\n          sum[0] + point[0] / outline.length,\n          sum[1] + point[1] / outline.length,\n        ],\n        [0, 0],\n      );\n      const mid: Point = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n      const normal: Point = [b[1] - a[1], a[0] - b[0]];\n      const outward =\n        normal[0] * (mid[0] - centre[0]) + normal[1] * (mid[1] - centre[1]) >= 0\n          ? normal\n          : ([-normal[0], -normal[1]] as Point);\n      roof.upright(a, b, eaveMm, eaveMm + FLAT_MM, outward);\n    });\n  }\n  return {\n    roof,\n    gables: new Soup(),\n    areaM2: area / 1e6,\n    ridgeMm: eaveMm + FLAT_MM,\n  };\n}\n\n/** Clip a polygon to an axis-aligned rectangle (Sutherland\u2013Hodgman). */\nfunction clip(polygon: readonly Point[], rect: Rect): Point[] {\n  let output = [...polygon];\n  const edges: [(p: Point) => number, number][] = [\n    [(p) => p[0] - rect.x0, 0],\n    [(p) => rect.x1 - p[0], 0],\n    [(p) => p[1] - rect.y0, 0],\n    [(p) => rect.y1 - p[1], 0],\n  ];\n  for (const [inside] of edges) {\n    const input = output;\n    output = [];\n    input.forEach((current, index) => {\n      const previous = input[\n        (index - 1 + input.length) % input.length\n      ] as Point;\n      const a = inside(previous);\n      const b = inside(current);\n      if (b >= 0) {\n        if (a < 0) {\n          const t = a / (a - b);\n          output.push([\n            previous[0] + (current[0] - previous[0]) * t,\n            previous[1] + (current[1] - previous[1]) * t,\n          ]);\n        }\n        output.push(current);\n      } else if (a >= 0) {\n        const t = a / (a - b);\n        output.push([\n          previous[0] + (current[0] - previous[0]) * t,\n          previous[1] + (current[1] - previous[1]) * t,\n        ]);\n      }\n    });\n    if (output.length === 0) {\n      break;\n    }\n  }\n  return output;\n}\n\n/**\n * What of a storey is open to the sky: inside `lower` but not under `upper`,\n * as squared-up pieces. A rear extension, a bay, a garage.\n */\nexport function exposed(\n  lower: readonly Point[][],\n  upper: readonly Point[][],\n): Point[][] {\n  const all = [...lower, ...upper].filter((outline) => outline.length >= 3);\n  if (lower.length === 0) {\n    return [];\n  }\n  const angle = squareAngle(\n    all.flatMap((outline) =>\n      outline.map(\n        (point, index) =>\n          [point, outline[(index + 1) % outline.length] as Point] as [\n            Point,\n            Point,\n          ],\n      ),\n    ),\n  );\n  const turn = frame(angle);\n  const turnedLower = lower.map((outline) => outline.map(turn.to));\n  const turnedUpper = upper.map((outline) => outline.map(turn.to));\n  const cells = grid(\n    [...turnedLower, ...turnedUpper],\n    (centre) =>\n      turnedLower.some((outline) => pointInPolygon(centre, outline)) &&\n      !turnedUpper.some((outline) => pointInPolygon(centre, outline)),\n    EDGE_MERGE_MM,\n  );\n  // Merge each row's runs, then stack runs of the same span.\n  const pieces: Point[][] = [];\n  cells.inside.forEach((row, index) => {\n    let column = 0;\n    while (column < row.length) {\n      if (!row[column]) {\n        column++;\n        continue;\n      }\n      const start = column;\n      while (column < row.length && row[column]) {\n        column++;\n      }\n      const rect = {\n        x0: cells.xs[start] as number,\n        x1: cells.xs[column] as number,\n        y0: cells.ys[index] as number,\n        y1: cells.ys[index + 1] as number,\n      };\n      for (const outline of turnedLower) {\n        const piece = clip(outline, rect);\n        if (piece.length >= 3 && polygonArea(piece) > 10_000) {\n          pieces.push(piece.map(turn.from));\n        }\n      }\n    }\n  });\n  return pieces;\n}\n", "// The street around the house, from OpenStreetMap: which building is the\n// house, how the plan turns and moves to sit on it, its plot from HM Land\n// Registry, and the neighbours, roads and greens as solids. Pure: the server\n// fetched and cached the map.\n\nimport { pointInPolygon, triangulate } from \"../faces\";\nimport type { Point } from \"../scene\";\nimport { squareAngle } from \"../snap\";\nimport { Soup } from \"./mesh\";\nimport { type Roof, roofOver } from \"./roof\";\n\n/** As apps/design/site.py sends it: metres east and north of `centre`. */\nexport interface SiteBuilding {\n  id: string;\n  ring: [number, number][];\n  height: number | null;\n  levels: number | null;\n  roof: string | null;\n  kind: string;\n}\n\nexport interface SiteRoad {\n  id: string;\n  kind: string;\n  line: [number, number][];\n}\n\n/** Parks, gardens and grass. */\nexport interface SiteGreen {\n  id: string;\n  kind: string;\n  ring: [number, number][];\n}\n\n/** A freehold plot: its outer ring, then any holes. */\nexport interface SiteParcel {\n  id: string;\n  rings: [number, number][][];\n}\n\nexport interface SitePlots {\n  /** Loading while the queue worker fetches them; none where there are none. */\n  status: \"ready\" | \"none\" | \"failed\" | \"loading\" | \"waiting\";\n  message: string;\n  parcels: SiteParcel[];\n  /** HM Land Registry's two statements, joined. */\n  attribution: string;\n  /** The same, word for word, one to a line. */\n  statements?: string[];\n  /** Where the INSPIRE licence conditions are. */\n  conditions?: string;\n}\n\nexport interface Site {\n  status: \"ready\" | \"failed\" | \"nowhere\" | \"waiting\";\n  message: string;\n  /** Why fetching it again failed, while the street it had still shows. */\n  warning?: string;\n  buildings: SiteBuilding[];\n  roads: SiteRoad[];\n  greens?: SiteGreen[];\n  /** The house's building, matched by address or picked by hand. */\n  house: string;\n  match: \"\" | \"address\" | \"picked\" | \"confirmed\";\n  /** Who said the house is right, and when. */\n  confirmed_by?: string;\n  confirmed_at?: string;\n  /** The postcode is unknown: the map is round the middle of its district. */\n  approximate?: boolean;\n  attribution: string;\n  plot?: SitePlots;\n}\n\n/** Map metres to the 3D frame's plan millimetres: X east, Z (plan y) south. */\nexport function toPlan([east, north]: [number, number]): Point {\n  return [east * 1000, -north * 1000];\n}\n\nexport function area(polygon: readonly Point[]): number {\n  let doubled = 0;\n  polygon.forEach((a, index) => {\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  });\n  return Math.abs(doubled / 2);\n}\n\nexport function centroid(polygon: readonly Point[]): Point {\n  let doubled = 0;\n  let x = 0;\n  let y = 0;\n  polygon.forEach((a, index) => {\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    const cross = a[0] * b[1] - b[0] * a[1];\n    doubled += cross;\n    x += (a[0] + b[0]) * cross;\n    y += (a[1] + b[1]) * cross;\n  });\n  if (Math.abs(doubled) < 1e-9) {\n    const n = polygon.length || 1;\n    return [\n      polygon.reduce((sum, p) => sum + p[0], 0) / n,\n      polygon.reduce((sum, p) => sum + p[1], 0) / n,\n    ];\n  }\n  return [x / (3 * doubled), y / (3 * doubled)];\n}\n\nfunction edgesOf(polygons: readonly Point[][]): [Point, Point][] {\n  return polygons.flatMap((polygon) =>\n    polygon.map(\n      (point, index) =>\n        [point, polygon[(index + 1) % polygon.length] as Point] as [\n          Point,\n          Point,\n        ],\n    ),\n  );\n}\n\n/** A plan point turned by `angle` (radians, as three's rotation about Y). */\nexport function turn([x, y]: Point, angle: number): Point {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  return [x * cos + y * sin, -x * sin + y * cos];\n}\n\n/** Share of the two shapes' combined area they have in common, sampled. */\nexport function overlap(a: readonly Point[][], b: readonly Point[]): number {\n  const all = [...a.flat(), ...b];\n  const xs = all.map((p) => p[0]);\n  const ys = all.map((p) => p[1]);\n  const [x0, x1, y0, y1] = [\n    Math.min(...xs),\n    Math.max(...xs),\n    Math.min(...ys),\n    Math.max(...ys),\n  ];\n  const step = Math.max((x1 - x0) / 60, (y1 - y0) / 60, 1);\n  let both = 0;\n  let either = 0;\n  for (let x = x0 + step / 2; x < x1; x += step) {\n    for (let y = y0 + step / 2; y < y1; y += step) {\n      const inA = a.some((polygon) => pointInPolygon([x, y], polygon));\n      const inB = pointInPolygon([x, y], b);\n      both += inA && inB ? 1 : 0;\n      either += inA || inB ? 1 : 0;\n    }\n  }\n  return either === 0 ? 0 : both / either;\n}\n\nexport interface Placement {\n  /** Radians about Y: the plan's turn onto the map. */\n  rotation: number;\n  /** Plan mm: where the plan's origin lands. */\n  offset: Point;\n  /** The house's building on the map, if one was found. */\n  building: SiteBuilding | null;\n  how: \"address\" | \"picked\" | \"guess\" | \"none\";\n}\n\n/** How a plan turned by `rotation` lines up with `ring`: \u03B4 to square them. */\nfunction squareUp(\n  footprint: Point[][],\n  ring: Point[],\n  rotation: number,\n): number {\n  const house = squareAngle(\n    edgesOf(footprint.map((polygon) => polygon.map((p) => turn(p, rotation)))),\n  );\n  const map = squareAngle(edgesOf([ring]));\n  let delta = house - map;\n  const quarter = Math.PI / 2;\n  delta = ((delta % quarter) + quarter) % quarter;\n  return delta > quarter / 2 ? delta - quarter : delta;\n}\n\n/**\n * Sit the house on the map. The building is the one named (by address or by\n * hand), else the nearest of about the house's size. North on the plan turns\n * it, squared up to the footprint within 15\u00B0; without north, the footprint's\n * best fit of its four squarings decides.\n */\nexport function place(\n  footprint: Point[][],\n  site: Site,\n  northDeg: number | null,\n): Placement {\n  const plan = footprint.filter((polygon) => polygon.length >= 3);\n  const north = northDeg === null ? null : (northDeg * Math.PI) / 180;\n  const none: Placement = {\n    rotation: north ?? 0,\n    offset: [0, 0],\n    building: null,\n    how: \"none\",\n  };\n  if (plan.length === 0) {\n    return none;\n  }\n  const houseArea = plan.reduce((sum, polygon) => sum + area(polygon), 0);\n  const rings = site.buildings.map((building) => ({\n    building,\n    ring: building.ring.map(toPlan),\n  }));\n  let chosen = site.house\n    ? rings.find((entry) => entry.building.id === site.house)\n    : undefined;\n  const how: Placement[\"how\"] =\n    chosen && (site.match === \"picked\" || site.match === \"confirmed\")\n      ? \"picked\"\n      : chosen\n        ? \"address\"\n        : \"guess\";\n  if (!chosen) {\n    let best = Number.POSITIVE_INFINITY;\n    for (const entry of rings) {\n      const size = area(entry.ring);\n      const ratio = size / houseArea;\n      if (ratio < 0.4 || ratio > 2.5) {\n        continue;\n      }\n      const [cx, cy] = centroid(entry.ring);\n      const metres = Math.hypot(cx, cy) / 1000;\n      if (metres > 90) {\n        continue;\n      }\n      const score = metres / 25 + Math.abs(Math.log(ratio)) * 2;\n      if (score < best) {\n        best = score;\n        chosen = entry;\n      }\n    }\n  }\n  if (!chosen) {\n    return none;\n  }\n  const ring = chosen.ring;\n  const fitAt = (rotation: number): { rotation: number; offset: Point } => {\n    const turned = plan.map((polygon) => polygon.map((p) => turn(p, rotation)));\n    const here = centroid(turned.flat().length ? largest(turned) : []);\n    const there = centroid(ring);\n    return { rotation, offset: [there[0] - here[0], there[1] - here[1]] };\n  };\n  const score = (fit: { rotation: number; offset: Point }) =>\n    overlap(\n      plan.map((polygon) =>\n        polygon.map((p) => {\n          const [x, y] = turn(p, fit.rotation);\n          return [x + fit.offset[0], y + fit.offset[1]] as Point;\n        }),\n      ),\n      ring,\n    );\n  let fit: { rotation: number; offset: Point };\n  if (north !== null) {\n    const delta = squareUp(plan, ring, north);\n    fit = fitAt(\n      Math.abs(delta) <= (15 * Math.PI) / 180 ? north + delta : north,\n    );\n  } else {\n    const delta = squareUp(plan, ring, 0);\n    const tries = [0, 1, 2, 3].map((k) => fitAt(delta + (k * Math.PI) / 2));\n    fit = tries.reduce((a, b) => (score(b) > score(a) ? b : a));\n  }\n  if (how === \"guess\" && score(fit) < 0.35) {\n    // Nothing on the map looks like this house: leave it where the plan is.\n    return none;\n  }\n  return { ...fit, building: chosen.building, how };\n}\n\nfunction largest(polygons: Point[][]): Point[] {\n  return polygons.reduce((a, b) => (area(b) > area(a) ? b : a));\n}\n\n/** The north bearing a placement implies, whole degrees in [0, 360). */\nexport function northOf(placement: Placement): number {\n  const degrees = Math.round((placement.rotation * 180) / Math.PI);\n  return ((degrees % 360) + 360) % 360;\n}\n\nconst HOUSE_KINDS = new Set([\n  \"house\",\n  \"detached\",\n  \"semidetached_house\",\n  \"terrace\",\n  \"bungalow\",\n  \"residential\",\n  \"yes\",\n]);\n\nconst STOREY_M = 2.7;\n\n/** Smaller than this, a building is a garage or a shed: one low storey. */\nconst OUTBUILDING_M2 = 30;\nconst OUTBUILDING_M = 2.6;\n\n/** A big building without a height: two tall storeys. */\nconst LARGE_M = 7;\n\n/** How tall a neighbour stands to its eaves, and its roof's shape. */\nexport function massing(\n  building: SiteBuilding,\n  ring: readonly Point[],\n): { eavesM: number; shape: string } {\n  const size = area(ring) / 1e6;\n  const looksLikeHome =\n    HOUSE_KINDS.has(building.kind) &&\n    size >= OUTBUILDING_M2 &&\n    size < 250 &&\n    (building.levels ?? 2) <= 3;\n  const shape = building.roof ?? (looksLikeHome ? \"gabled\" : \"flat\");\n  const pitched = shape === \"gabled\" || shape === \"hipped\";\n  if (building.height !== null) {\n    // OSM's height includes the roof; take the eaves as two thirds of a pitched one.\n    return { eavesM: building.height * (pitched ? 0.72 : 1), shape };\n  }\n  if (building.levels !== null) {\n    return { eavesM: building.levels * STOREY_M, shape };\n  }\n  if (size < OUTBUILDING_M2) {\n    return { eavesM: OUTBUILDING_M, shape };\n  }\n  return { eavesM: looksLikeHome ? 2 * STOREY_M : LARGE_M, shape };\n}\n\n/** Lines two buildings share: where one's wall is the other's. */\nexport function sharedEdges(\n  rings: readonly Point[][],\n  tolerance = 400,\n): [Point, Point][][] {\n  const edges = rings.map((ring) => edgesOf([ring]));\n  return edges.map((own, index) =>\n    own.filter(([a, b]) =>\n      edges.some(\n        (other, j) =>\n          j !== index &&\n          other.some(([c, d]) => collinearOverlap(a, b, c, d, tolerance)),\n      ),\n    ),\n  );\n}\n\nfunction collinearOverlap(\n  a: Point,\n  b: Point,\n  c: Point,\n  d: Point,\n  tolerance: number,\n): boolean {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]);\n  if (length < 1000) {\n    return false;\n  }\n  const ux = (b[0] - a[0]) / length;\n  const uy = (b[1] - a[1]) / length;\n  const off = (p: Point) => Math.abs((p[0] - a[0]) * uy - (p[1] - a[1]) * ux);\n  if (off(c) > tolerance || off(d) > tolerance) {\n    return false;\n  }\n  const along = (p: Point) => (p[0] - a[0]) * ux + (p[1] - a[1]) * uy;\n  const from = Math.max(0, Math.min(along(c), along(d)));\n  const to = Math.min(length, Math.max(along(c), along(d)));\n  return to - from > length * 0.4;\n}\n\nfunction outward(ring: readonly Point[], a: Point, b: Point): Point {\n  let doubled = 0;\n  ring.forEach((p, index) => {\n    const q = ring[(index + 1) % ring.length] as Point;\n    doubled += p[0] * q[1] - q[0] * p[1];\n  });\n  const normal: Point = [b[1] - a[1], a[0] - b[0]];\n  return doubled > 0 ? normal : [-normal[0], -normal[1]];\n}\n\n/** A neighbour as a solid: walls to its eaves, and a roof that fits it. */\nexport function neighbour(\n  building: SiteBuilding,\n  ring: Point[],\n  party: [Point, Point][],\n  groundMm: number,\n  walls: Soup,\n  roofs: Soup,\n): void {\n  const { eavesM, shape } = massing(building, ring);\n  const pitched = shape === \"gabled\" || shape === \"hipped\";\n  const eaveMm = groundMm + eavesM * 1000;\n  for (const [index, a] of ring.entries()) {\n    const b = ring[(index + 1) % ring.length] as Point;\n    walls.upright(a, b, groundMm, eaveMm, outward(ring, a, b));\n  }\n  let roof: Roof | null = null;\n  if (pitched) {\n    roof = roofOver(\n      [ring],\n      party,\n      {\n        kind: shape === \"hipped\" ? \"hip\" : \"gable\",\n        pitchDeg: 35,\n        overhangMm: 150,\n      },\n      eaveMm,\n    );\n  }\n  if (!roof || roof.roof.triangles === 0) {\n    const triangles = triangulate(ring);\n    if (triangles) {\n      walls.flat(triangles, eaveMm, true);\n    }\n    return;\n  }\n  roofs.positions.push(...roof.roof.positions);\n  walls.positions.push(...roof.gables.positions);\n  // Close the top under the roof, so a gap at a hip never shows the sky.\n  const triangles = triangulate(ring);\n  if (triangles) {\n    walls.flat(triangles, eaveMm, true);\n  }\n}\n\nconst ROAD_WIDTHS: Record<string, number> = {\n  motorway: 12,\n  trunk: 10,\n  primary: 9,\n  secondary: 8,\n  tertiary: 7,\n  unclassified: 6,\n  residential: 6,\n  living_street: 5,\n  service: 3.5,\n  track: 3,\n  pedestrian: 4,\n  footway: 2,\n  path: 1.6,\n  cycleway: 2,\n  bridleway: 2,\n  steps: 1.6,\n};\n\nexport function isPath(kind: string): boolean {\n  return [\n    \"footway\",\n    \"path\",\n    \"cycleway\",\n    \"bridleway\",\n    \"steps\",\n    \"pedestrian\",\n    \"track\",\n  ].includes(kind);\n}\n\n/** Roads that have a pavement each side, and how wide one is. */\nconst PAVED = new Set([\n  \"primary\",\n  \"secondary\",\n  \"tertiary\",\n  \"unclassified\",\n  \"residential\",\n  \"living_street\",\n]);\nexport const PAVEMENT_M = 2;\n\nexport function hasPavements(kind: string): boolean {\n  return PAVED.has(kind);\n}\n\n/** A road as a flat ribbon, its width from its class, plus `extraM` a side. */\nexport function ribbon(\n  line: readonly Point[],\n  kind: string,\n  heightMm: number,\n  soup: Soup,\n  extraM = 0,\n): void {\n  const half = ((ROAD_WIDTHS[kind] ?? 5) * 1000) / 2 + extraM * 1000;\n  if (line.length < 2) {\n    return;\n  }\n  const sides = line.map((point, index) => {\n    const prev = line[Math.max(0, index - 1)] as Point;\n    const next = line[Math.min(line.length - 1, index + 1)] as Point;\n    let dx = next[0] - prev[0];\n    let dy = next[1] - prev[1];\n    const length = Math.hypot(dx, dy) || 1;\n    dx /= length;\n    dy /= length;\n    // Mitre at a bend, but not so far that a hairpin spikes.\n    let scale = 1;\n    if (index > 0 && index < line.length - 1) {\n      const ax = point[0] - prev[0];\n      const ay = point[1] - prev[1];\n      const al = Math.hypot(ax, ay) || 1;\n      const cos = (ax / al) * dx + (ay / al) * dy;\n      scale = Math.min(1 / Math.max(cos, 0.35), 2.5);\n    }\n    return [\n      [point[0] - dy * half * scale, point[1] + dx * half * scale],\n      [point[0] + dy * half * scale, point[1] - dx * half * scale],\n    ] as [Point, Point];\n  });\n  for (let index = 0; index < sides.length - 1; index++) {\n    const [a, b] = sides[index] as [Point, Point];\n    const [c, d] = sides[index + 1] as [Point, Point];\n    soup.flat(\n      [\n        [a, b, d],\n        [a, d, c],\n      ],\n      heightMm,\n      true,\n    );\n  }\n}\n\n/** Which way the house faces: towards the nearest road, flat on the ground. */\nexport function facing(centre: Point, roads: readonly Point[][]): Point | null {\n  let best: { distance: number; point: Point } | null = null;\n  for (const line of roads) {\n    for (let index = 0; index < line.length - 1; index++) {\n      const a = line[index] as Point;\n      const b = line[index + 1] as Point;\n      const dx = b[0] - a[0];\n      const dy = b[1] - a[1];\n      const lengthSq = dx * dx + dy * dy || 1;\n      const t = Math.max(\n        0,\n        Math.min(\n          1,\n          ((centre[0] - a[0]) * dx + (centre[1] - a[1]) * dy) / lengthSq,\n        ),\n      );\n      const point: Point = [a[0] + dx * t, a[1] + dy * t];\n      const distance = Math.hypot(point[0] - centre[0], point[1] - centre[1]);\n      if (!best || distance < best.distance) {\n        best = { distance, point };\n      }\n    }\n  }\n  if (!best || best.distance > 60000 || best.distance < 1) {\n    return null;\n  }\n  return [\n    (best.point[0] - centre[0]) / best.distance,\n    (best.point[1] - centre[1]) / best.distance,\n  ];\n}\n\n/** Where a ring sits on the plan in the 3D frame, from map metres. */\nexport function onPlan(ring: readonly [number, number][]): Point[] {\n  return ring.map(toPlan);\n}\n\nfunction inParcel(point: Point, parcel: SiteParcel): boolean {\n  const [outer, ...holes] = parcel.rings.map(onPlan);\n  return (\n    !!outer &&\n    pointInPolygon(point, outer) &&\n    !holes.some((hole) => pointInPolygon(point, hole))\n  );\n}\n\n/**\n * The house's own plot: the one its middle stands in, once the house sits on\n * the map. `footprint` is the plan's, already turned and moved there.\n */\nexport function housePlot(\n  site: Site,\n  footprint: readonly Point[][],\n): SiteParcel | null {\n  const parcels = site.plot?.status === \"ready\" ? site.plot.parcels : [];\n  const plan = footprint.filter((polygon) => polygon.length >= 3);\n  if (parcels.length === 0 || plan.length === 0) {\n    return null;\n  }\n  const middle = centroid(plan.reduce((a, b) => (area(b) > area(a) ? b : a)));\n  const own = parcels.filter((parcel) => inParcel(middle, parcel));\n  // A plot inside another (a garage on the house's land) is the smaller one.\n  return own.length\n    ? own.reduce((a, b) =>\n        area(onPlan(b.rings[0] ?? [])) < area(onPlan(a.rings[0] ?? [])) ? b : a,\n      )\n    : null;\n}\n", "// \"Line up with the map\": which way north is, from the OpenStreetMap outline\n// of the house. Pure geometry over `three/site.ts`'s placement, which squares\n// the plan to the building's walls and picks the best of the four quarter turns.\n\nimport type { Point } from \"./scene\";\nimport {\n  area,\n  centroid,\n  northOf,\n  place,\n  type Site,\n  type SiteBuilding,\n  toPlan,\n  turn,\n} from \"./three/site\";\nimport { pointInPolygon } from \"./faces\";\n\nexport type NorthFit =\n  | {\n      status: \"found\";\n      /** Where north points on the plan: \u00B0 clockwise from up, whole degrees. */\n      northDeg: number;\n      building: SiteBuilding;\n    }\n  | { status: \"none\"; message: string };\n\n/** The building the property's own location falls in, if the map has one. */\nexport function buildingAtProperty(site: Site): SiteBuilding | null {\n  return (\n    site.buildings.find((building) =>\n      pointInPolygon([0, 0], building.ring.map(toPlan)),\n    ) ?? null\n  );\n}\n\n/** How much bigger than the plan a map building can be and still be this house. */\nconst MAX_AREA_RATIO = 2.5;\n\n/** The rotation that best fits the plan's outline to the map's, offered whole. */\nexport function fitNorth(footprint: Point[][], site: Site): NorthFit {\n  if (site.status !== \"ready\" || site.buildings.length === 0) {\n    return { status: \"none\", message: \"The map has no building here.\" };\n  }\n  const plan = footprint.filter((polygon) => polygon.length >= 3);\n  if (plan.length === 0) {\n    return { status: \"none\", message: \"Draw or import the plan first.\" };\n  }\n  // Prefer the building the address names, then the one at the property.\n  const here = site.house ? null : buildingAtProperty(site);\n  const placed = place(plan, here ? { ...site, house: here.id } : site, null);\n  if (!placed.building || placed.how === \"none\") {\n    return {\n      status: \"none\",\n      message: \"No building on the map matches this plan.\",\n    };\n  }\n  // A terrace is mapped as one building, so its outline is the whole row:\n  // squaring the plan to that would be a guess at best.\n  const planArea = plan.reduce((sum, polygon) => sum + area(polygon), 0);\n  if (area(placed.building.ring.map(toPlan)) > planArea * MAX_AREA_RATIO) {\n    return {\n      status: \"none\",\n      message: \"The map's building is the whole terrace: line up by hand.\",\n    };\n  }\n  return {\n    status: \"found\",\n    northDeg: northOf(placed),\n    building: placed.building,\n  };\n}\n\nfunction largest(polygons: readonly Point[][]): Point[] {\n  return polygons.reduce<Point[]>(\n    (best, polygon) => (area(polygon) > area(best) ? polygon : best),\n    [],\n  );\n}\n\n/**\n * The building's outline in the plan's own frame, were north `northDeg`:\n * what to draw under the plan to check the fit. It is centred on the plan's\n * largest piece, so nudging the angle turns it about the house.\n */\nexport function outlineOnPlan(\n  footprint: Point[][],\n  building: SiteBuilding,\n  northDeg: number,\n): Point[] {\n  const plan = footprint.filter((polygon) => polygon.length >= 3);\n  if (plan.length === 0) {\n    return [];\n  }\n  const angle = (northDeg * Math.PI) / 180;\n  const ring = building.ring.map(toPlan);\n  const [rx, ry] = centroid(ring);\n  const [px, py] = centroid(largest(plan));\n  return ring.map(([x, y]) => {\n    const [tx, ty] = turn([x - rx, y - ry], -angle);\n    return [tx + px, ty + py] as Point;\n  });\n}\n", "// The house's plot from HM Land Registry, drawn faint under the plan. Sits\n// the plan on the map as the 3D view does (three/site.ts), finds the plot its\n// middle stands in, and turns that back into the plan's own millimetres.\n\nimport { getSite } from \"./api\";\nimport type { Point } from \"./scene\";\nimport { housePlot, onPlan, place, type Site, turn } from \"./three/site\";\n\n/** The plot's rings on the plan, or null if the house isn't on the map. */\nexport function plotOnPlan(\n  footprint: Point[][],\n  site: Site,\n  northDeg: number | null,\n): Point[][] | null {\n  const plan = footprint.filter((polygon) => polygon.length >= 3);\n  if (\n    site.status !== \"ready\" ||\n    site.plot?.status !== \"ready\" ||\n    !plan.length\n  ) {\n    return null;\n  }\n  const placement = place(plan, site, northDeg);\n  if (!placement.building) {\n    return null;\n  }\n  const [dx, dy] = placement.offset;\n  const placed = plan.map((polygon) =>\n    polygon.map((p) => {\n      const [x, y] = turn(p, placement.rotation);\n      return [x + dx, y + dy] as Point;\n    }),\n  );\n  const parcel = housePlot(site, placed);\n  if (!parcel) {\n    return null;\n  }\n  return parcel.rings.map((ring) =>\n    onPlan(ring).map(([x, y]) => turn([x - dx, y - dy], -placement.rotation)),\n  );\n}\n\n/** What the INSPIRE licence has us show while the plot is drawn. */\nexport interface PlotCredit {\n  text: string;\n  url: string;\n}\n\nconst POLL_MS = 5000;\nconst POLLS = 24;\n\n/** Loads the street once, waits for the plots, and redraws on a change. */\nexport class PlanPlot {\n  private site: Site | null = null;\n  private key = \"\";\n  private polls = 0;\n\n  constructor(\n    private readonly draw: (\n      rings: Point[][] | null,\n      credit: PlotCredit | null,\n    ) => void,\n  ) {}\n\n  load(\n    modelUrl: string,\n    footprint: () => Point[][],\n    north: () => number | null,\n  ): void {\n    getSite(modelUrl)\n      .then((site) => {\n        this.site = site;\n        this.key = \"\";\n        this.show(footprint(), north());\n        if (site.plot?.status === \"loading\" && this.polls < POLLS) {\n          this.polls += 1;\n          setTimeout(() => this.load(modelUrl, footprint, north), POLL_MS);\n        }\n      })\n      // The plot is a nicety: the plan is whole without it.\n      .catch(() => undefined);\n  }\n\n  /** Redraw if the ground floor or north moved since the last time. */\n  show(footprint: Point[][], northDeg: number | null): void {\n    if (!this.site) {\n      return;\n    }\n    const key = JSON.stringify([footprint, northDeg]);\n    if (key === this.key) {\n      return;\n    }\n    this.key = key;\n    const rings = plotOnPlan(footprint, this.site, northDeg);\n    const plot = this.site.plot;\n    const text = plot?.statements?.length\n      ? plot.statements.join(\" \")\n      : (plot?.attribution ?? \"\");\n    this.draw(\n      rings,\n      rings && text ? { text, url: plot?.conditions ?? \"\" } : null,\n    );\n  }\n}\n", "// Which marks on a scenario's plan belong to which of its options. A mark an\n// option drew carries the option's id; one drawn by hand carries none. Several\n// groups can offer the same kind (external wall insulation on each wall\n// type), so what's drawn is the option's, never the kind's.\n\n/** A mark on the plan, as far as this needs. */\nexport interface Mark {\n  kind: string;\n  /** The option that drew it; blank or absent when drawn by hand. */\n  option?: string | undefined;\n}\n\n/** A picked option, as far as this needs. */\nexport interface Picked {\n  option: { id: string; kind: string };\n}\n\n/**\n * Whether a mark is drawn by hand as far as `ids` (a scenario's options) go:\n * none, or the option of one no longer picked, whose marks Undo or another tab\n * brought back. The server counts the same way.\n */\nexport function isByHand(mark: Mark, ids: ReadonlySet<string>): boolean {\n  return !mark.option || !ids.has(mark.option);\n}\n\n/**\n * The picks with nothing on the plan: no mark of their own, and none drawn\n * by hand of their kind. Which option a hand-drawn mark is for can't be told,\n * so it counts for each of its kind (every mark made before options were\n * recorded is one).\n */\nexport function undrawn<T extends Picked>(\n  picked: readonly T[],\n  marks: readonly Mark[],\n): T[] {\n  const ids = new Set(picked.map((entry) => entry.option.id));\n  const drawn = new Set(marks.map((mark) => mark.option ?? \"\"));\n  const byHand = new Set(\n    marks.filter((mark) => isByHand(mark, ids)).map((mark) => mark.kind),\n  );\n  return picked.filter(\n    (entry) => !drawn.has(entry.option.id) && !byHand.has(entry.option.kind),\n  );\n}\n\n/** What a click changed: the picks it added, and the options it dropped. */\nexport function pickChange<T extends Picked>(\n  before: readonly T[],\n  after: readonly T[],\n): { added: T[]; dropped: T[\"option\"][] } {\n  const was = new Set(before.map((entry) => entry.option.id));\n  const now = new Set(after.map((entry) => entry.option.id));\n  return {\n    added: after.filter((entry) => !was.has(entry.option.id)),\n    dropped: before\n      .filter((entry) => !now.has(entry.option.id))\n      .map((entry) => entry.option),\n  };\n}\n\n/**\n * What dropping options takes off the plan: their own marks, and, to ask\n * about, the marks drawn by hand of a kind none of the picks left still has.\n */\nexport function dropping<M extends Mark>(\n  dropped: readonly { id: string; kind: string }[],\n  still: readonly Picked[],\n  marks: readonly M[],\n): { own: M[]; hand: M[]; kinds: string[] } {\n  const ids = new Set(dropped.map((option) => option.id));\n  const scenario = new Set([...ids, ...still.map((entry) => entry.option.id)]);\n  const kept = new Set(still.map((entry) => entry.option.kind));\n  const kinds = new Set(\n    dropped.map((option) => option.kind).filter((kind) => !kept.has(kind)),\n  );\n  return {\n    own: marks.filter((mark) => mark.option && ids.has(mark.option)),\n    hand: marks.filter(\n      (mark) => isByHand(mark, scenario) && kinds.has(mark.kind),\n    ),\n    kinds: [...kinds],\n  };\n}\n", "// An outdoor unit's footprint and the clearance zone around it, in plan, and\n// what the zone runs into.\n\nimport type { Point, Scene } from \"../scene\";\nimport { wallEnds } from \"../topology\";\nimport type { HeatPumpModel } from \"./models\";\n\n/** Which way the unit's front (the fan side) faces on the plan. */\nexport const FACINGS = [\"down\", \"up\", \"left\", \"right\"] as const;\nexport type Facing = (typeof FACINGS)[number];\n\nexport const FRONT: Record<Facing, Point> = {\n  up: [0, -1],\n  down: [0, 1],\n  left: [-1, 0],\n  right: [1, 0],\n};\n\nexport function facingOf(value: unknown): Facing {\n  return FACINGS.find((facing) => facing === value) ?? \"down\";\n}\n\n/** The unit's footprint and its clearance zone, each as a four-corner polygon. */\nexport interface UnitShape {\n  footprint: Point[];\n  zone: Point[];\n}\n\n/** `at` is the footprint's middle; the front's clearance runs out from the fan side. */\nexport function unitShape(\n  model: Pick<HeatPumpModel, \"width\" | \"depth\" | \"clear\">,\n  at: Point,\n  facing: Facing,\n): UnitShape {\n  const front = FRONT[facing];\n  const side: Point = [-front[1], front[0]];\n  const corners = (\n    halfAcross: number,\n    ahead: number,\n    behind: number,\n  ): Point[] => {\n    const at4 = (across: number, along: number): Point => [\n      at[0] + side[0] * across + front[0] * along,\n      at[1] + side[1] * across + front[1] * along,\n    ];\n    return [\n      at4(-halfAcross, -behind),\n      at4(halfAcross, -behind),\n      at4(halfAcross, ahead),\n      at4(-halfAcross, ahead),\n    ];\n  };\n  const half = model.width / 2;\n  const deep = model.depth / 2;\n  return {\n    footprint: corners(half, deep, deep),\n    zone: corners(\n      half + model.clear.side,\n      deep + model.clear.front,\n      deep + model.clear.back,\n    ),\n  };\n}\n\n/** How far a point sits from the infinite line through a and b. */\nexport function lineGap(p: Point, a: Point, b: Point): number {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]);\n  return length === 0\n    ? Math.hypot(p[0] - a[0], p[1] - a[1])\n    : Math.abs((b[0] - a[0]) * (a[1] - p[1]) - (a[0] - p[0]) * (b[1] - a[1])) /\n        length;\n}\n\n/** Whether a wall runs along the same straight line as `host`, in pieces or whole. */\nexport function alongWall(\n  ends: readonly [Point, Point],\n  host: readonly [Point, Point],\n): boolean {\n  return (\n    lineGap(ends[0], host[0], host[1]) < 100 &&\n    lineGap(ends[1], host[0], host[1]) < 100\n  );\n}\n\nfunction inside(point: Point, polygon: readonly Point[]): boolean {\n  let within = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const [xi, yi] = polygon[i] as Point;\n    const [xj, yj] = polygon[j] as Point;\n    if (\n      yi > point[1] !== yj > point[1] &&\n      point[0] < ((xj - xi) * (point[1] - yi)) / (yj - yi) + xi\n    ) {\n      within = !within;\n    }\n  }\n  return within;\n}\n\nfunction cross(o: Point, a: Point, b: Point): number {\n  return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);\n}\n\nfunction segmentsCross(a: Point, b: Point, c: Point, d: Point): boolean {\n  return (\n    cross(a, b, c) * cross(a, b, d) < 0 && cross(c, d, a) * cross(c, d, b) < 0\n  );\n}\n\n/** Whether the segment touches the polygon: an end inside it, or a crossing. */\nexport function segmentMeets(\n  a: Point,\n  b: Point,\n  polygon: readonly Point[],\n): boolean {\n  if (inside(a, polygon) || inside(b, polygon)) {\n    return true;\n  }\n  return polygon.some((corner, i) =>\n    segmentsCross(a, b, corner, polygon[(i + 1) % polygon.length] as Point),\n  );\n}\n\n/** Whether two convex-ish polygons overlap, by corners inside or edges crossing. */\nexport function polygonsMeet(\n  one: readonly Point[],\n  two: readonly Point[],\n): boolean {\n  return (\n    one.some((corner, i) =>\n      segmentMeets(corner, one[(i + 1) % one.length] as Point, two),\n    ) || two.some((corner) => inside(corner, one))\n  );\n}\n\nexport interface Obstacle {\n  /** Another fixture's name, or \"a wall\". */\n  what: string;\n  at: Point;\n}\n\n/**\n * What the zone runs into: walls of the house and other fixtures (the point\n * each is drawn at). The plan carries no plot boundary, so a fence or the edge\n * of the garden isn't checked.\n */\nexport function zoneWarnings(\n  scene: Scene,\n  zone: readonly Point[],\n  others: readonly { name: string; at: Point }[],\n  /** The wall a wall-mounted unit hangs on: it's meant to touch that. */\n  hostWall?: string,\n): string[] {\n  const out: string[] = [];\n  const hostWallEnds = hostWall\n    ? scene.walls\n        .filter((wall) => wall.id === hostWall)\n        .map((wall) => wallEnds(scene, wall))[0]\n    : null;\n  const walls = scene.walls.filter((wall) => {\n    const ends = wallEnds(scene, wall);\n    if (!ends || (hostWallEnds && alongWall(ends, hostWallEnds))) {\n      return false;\n    }\n    return segmentMeets(ends[0], ends[1], zone);\n  });\n  if (walls.length > 0) {\n    out.push(\n      walls.length === 1\n        ? \"The clearance zone runs into a wall.\"\n        : `The clearance zone runs into ${walls.length} walls.`,\n    );\n  }\n  for (const other of others) {\n    if (inside(other.at, zone)) {\n      out.push(`The clearance zone takes in the ${other.name.toLowerCase()}.`);\n    }\n  }\n  return out;\n}\n", "// Common air-source heat pump outdoor units: footprint, the manual's\n// clearances, maximum sound power and output. One list, one row per model, each with\n// its source. Every row is `check: true`: the figures were entered from the\n// manufacturers' published sheets without a person having the installation\n// manual open, so they must be confirmed against it before a design is\n// issued. Nothing here is a spec to buy by.\n\nexport interface HeatPumpModel {\n  /** `<make> <name>`, stored in the fixture's `props.model`. */\n  id: string;\n  make: string;\n  name: string;\n  /** Nominal output, kW. */\n  kw: number;\n  /** Outdoor unit size, mm. */\n  width: number;\n  depth: number;\n  height: number;\n  /** Clearances the installation manual asks for, mm. */\n  clear: { front: number; back: number; side: number; top: number };\n  /**\n   * The maximum sound power level the manufacturer gives, dB(A) (MCS 020 step\n   * 1). Until `check` is cleared these are the figures first entered, not\n   * confirmed as maxima.\n   */\n  lw: number;\n  /** Where the row came from. */\n  source: string;\n  /** True until a person has confirmed the row against the manual. */\n  check: boolean;\n}\n\nconst row = (\n  make: string,\n  name: string,\n  kw: number,\n  size: [number, number, number],\n  clear: [number, number, number, number],\n  lw: number,\n  source: string,\n): HeatPumpModel => ({\n  id: `${make} ${name}`,\n  make,\n  name,\n  kw,\n  width: size[0],\n  depth: size[1],\n  height: size[2],\n  clear: { front: clear[0], back: clear[1], side: clear[2], top: clear[3] },\n  lw,\n  source,\n  check: true,\n});\n\nconst VAILLANT = \"Vaillant aroTHERM plus installation manual, technical data\";\nconst MITSUBISHI =\n  \"Mitsubishi Electric Ecodan R32 data book, installation manual\";\nconst DAIKIN = \"Daikin Altherma 3 R F data book, installation manual\";\nconst SAMSUNG = \"Samsung EHS Mono R32 (Gen 6) installation manual\";\n\n/** Width \u00D7 depth \u00D7 height; clearances front, back, side, top. */\nexport const HEAT_PUMP_MODELS: readonly HeatPumpModel[] = [\n  row(\n    \"Vaillant\",\n    \"aroTHERM plus 5 kW\",\n    5,\n    [1100, 450, 765],\n    [1000, 300, 150, 1000],\n    52,\n    VAILLANT,\n  ),\n  row(\n    \"Vaillant\",\n    \"aroTHERM plus 7 kW\",\n    7,\n    [1100, 450, 965],\n    [1000, 300, 150, 1000],\n    54,\n    VAILLANT,\n  ),\n  row(\n    \"Vaillant\",\n    \"aroTHERM plus 10 kW\",\n    10,\n    [1100, 450, 1565],\n    [1000, 300, 150, 1000],\n    58,\n    VAILLANT,\n  ),\n  row(\n    \"Vaillant\",\n    \"aroTHERM plus 12 kW\",\n    12,\n    [1100, 450, 1565],\n    [1000, 300, 150, 1000],\n    60,\n    VAILLANT,\n  ),\n  row(\n    \"Mitsubishi\",\n    \"Ecodan 5 kW\",\n    5,\n    [1050, 330, 740],\n    [500, 100, 100, 1000],\n    59,\n    MITSUBISHI,\n  ),\n  row(\n    \"Mitsubishi\",\n    \"Ecodan 8.5 kW\",\n    8.5,\n    [1050, 330, 943],\n    [500, 100, 100, 1000],\n    61,\n    MITSUBISHI,\n  ),\n  row(\n    \"Mitsubishi\",\n    \"Ecodan 11.2 kW\",\n    11.2,\n    [1050, 480, 1020],\n    [500, 100, 100, 1000],\n    62,\n    MITSUBISHI,\n  ),\n  row(\n    \"Mitsubishi\",\n    \"Ecodan 14 kW\",\n    14,\n    [1050, 480, 1020],\n    [500, 100, 100, 1000],\n    63,\n    MITSUBISHI,\n  ),\n  row(\n    \"Daikin\",\n    \"Altherma 3 R 4 kW\",\n    4,\n    [1100, 320, 870],\n    [600, 100, 100, 1000],\n    58,\n    DAIKIN,\n  ),\n  row(\n    \"Daikin\",\n    \"Altherma 3 R 6 kW\",\n    6,\n    [1100, 320, 870],\n    [600, 100, 100, 1000],\n    59,\n    DAIKIN,\n  ),\n  row(\n    \"Daikin\",\n    \"Altherma 3 R 8 kW\",\n    8,\n    [1100, 320, 870],\n    [600, 100, 100, 1000],\n    61,\n    DAIKIN,\n  ),\n  row(\n    \"Samsung\",\n    \"Gen 6 5 kW\",\n    5,\n    [940, 330, 888],\n    [500, 150, 150, 1000],\n    57,\n    SAMSUNG,\n  ),\n  row(\n    \"Samsung\",\n    \"Gen 6 8 kW\",\n    8,\n    [940, 330, 888],\n    [500, 150, 150, 1000],\n    60,\n    SAMSUNG,\n  ),\n  row(\n    \"Samsung\",\n    \"Gen 6 12 kW\",\n    12,\n    [940, 360, 1350],\n    [500, 150, 150, 1000],\n    62,\n    SAMSUNG,\n  ),\n];\n\nexport function modelById(id: unknown): HeatPumpModel | null {\n  return HEAT_PUMP_MODELS.find((model) => model.id === id) ?? null;\n}\n", "// MCS 020 noise assessment, the permitted-development test for an air source\n// heat pump: the sound pressure level at a neighbour's window or door, from\n// the unit's sound power, the distance, the unit's surroundings and any barrier.\n//\n// Method (MCS 020, \"Planning standards for permitted development installations\n// of wall-mounted air source heat pumps ... noise assessment\", the procedure\n// of Section 3 with its directivity and barrier tables):\n//   Lp = Lw + 10\u00B7log10(Q / (4\u03C0\u00B7r\u00B2)) + barrier\n// Lw is the unit's maximum sound power, dB(A) (step 1); r the distance from\n// the unit to the assessment position, m, read at the Note 4 table's next\n// lower row (2.5 m reads as 2 m); Q the directivity factor; barrier a\n// correction, dB.\n//\n// Transcribed, not verified against the standard in hand: the Q table (2 on\n// the ground with nothing within 1 m, 4 with one reflecting surface, 8 with\n// two, the most it has), the rows of the distance table (every whole metre)\n// and the barrier table (none 0, partial -5, full -10). A person must check\n// these against the issue of MCS 020 in force.\n//\n// The limit is MCS 020(a)'s 37 dB(A) for the heat pump alone. Confirm 37 dB(A)\n// for the unit alone vs issue 1.3's 42 dB(A) with a 40 dB(A) background\n// (MCS 020 issue 1.3, as the brief for #3592 read it).\n\nimport type { Point, Scene } from \"../scene\";\nimport { wallEnds } from \"../topology\";\nimport { alongWall, type Facing, segmentMeets, unitShape } from \"./clearance\";\nimport type { HeatPumpModel } from \"./models\";\n\n/** The level the assessment position must not exceed, dB(A). */\nexport const NOISE_LIMIT_DB = 37;\n\n/** Reflecting surfaces count within this distance of the unit, mm. */\nexport const REFLECT_WITHIN_MM = 1000;\n\nexport const BARRIERS = [\"none\", \"partial\", \"full\"] as const;\nexport type Barrier = (typeof BARRIERS)[number];\n\nexport const BARRIER_LABELS: Record<Barrier, string> = {\n  none: \"No barrier\",\n  partial: \"Partial barrier\",\n  full: \"Full barrier\",\n};\n\n/** Barrier correction, dB (MCS 020 barrier table; see the note above). */\nconst BARRIER_DB: Record<Barrier, number> = {\n  none: 0,\n  partial: -5,\n  full: -10,\n};\n\nexport function barrierOf(value: unknown): Barrier {\n  return BARRIERS.find((barrier) => barrier === value) ?? \"none\";\n}\n\n/**\n * Directivity factor: the ground (unless the unit is bracketed high up the\n * wall) and each wall within 1 m reflect, and the table stops at Q = 8.\n */\nexport function directivity(walls: number, ground = true): number {\n  return Math.min(8, 2 ** (walls + (ground ? 1 : 0)));\n}\n\n/** A bracket this far up a wall (mm) no longer has the ground beside it. */\nexport const GROUND_REFLECTS_BELOW_MM = 1000;\n\n/** The distance table's rows are whole metres; read the next lower one. */\nexport function distanceRow(distanceMm: number): number {\n  return Math.max(1, Math.floor(distanceMm / 1000));\n}\n\nexport interface Noise {\n  /** Sound pressure level at the position, dB(A), to one decimal. */\n  level: number;\n  limit: number;\n  passes: boolean;\n  distanceM: number;\n  surfaces: number;\n  q: number;\n  barrier: Barrier;\n}\n\nexport function noiseAt(\n  lw: number,\n  distanceMm: number,\n  walls: number,\n  barrier: Barrier,\n  ground = true,\n): Noise {\n  const r = distanceRow(distanceMm);\n  const q = directivity(walls, ground);\n  const level =\n    lw + 10 * Math.log10(q / (4 * Math.PI * r * r)) + BARRIER_DB[barrier];\n  const rounded = Math.round(level * 10) / 10;\n  return {\n    level: rounded,\n    limit: NOISE_LIMIT_DB,\n    passes: rounded <= NOISE_LIMIT_DB,\n    distanceM: r,\n    surfaces: walls,\n    q,\n    barrier,\n  };\n}\n\n/**\n * The walls within 1 m that the unit can see, as surfaces: pieces of one\n * straight wall count once. A wall-mounted unit counts its own wall, and sees\n * nothing behind it.\n */\nexport function reflectingSurfaces(\n  scene: Scene,\n  unit: Pick<HeatPumpModel, \"width\" | \"depth\">,\n  at: Point,\n  facing: Facing,\n  hostWall?: string,\n): number {\n  const reach = REFLECT_WITHIN_MM;\n  const { zone } = unitShape(\n    {\n      ...unit,\n      clear: {\n        front: reach,\n        back: hostWall ? 0 : reach,\n        side: reach,\n        top: 0,\n      },\n    },\n    at,\n    facing,\n  );\n  const host = scene.walls.find((wall) => wall.id === hostWall);\n  const hostEnds = host ? wallEnds(scene, host) : null;\n  const distinct: [Point, Point][] = hostEnds ? [hostEnds] : [];\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends || !segmentMeets(ends[0], ends[1], zone)) {\n      continue;\n    }\n    if (!distinct.some((other) => alongWall(ends, other))) {\n      distinct.push(ends);\n    }\n  }\n  return distinct.length;\n}\n", "// A unit placed on a wall hangs on the wall's outside face, facing away from it.\n\nimport { pointAlong } from \"../openings\";\nimport type { Fixture, Point, Scene } from \"../scene\";\nimport { roomAt, wallEnds } from \"../topology\";\nimport { type Facing, facingOf, FRONT } from \"./clearance\";\nimport { modelById } from \"./models\";\n\nexport interface Mount {\n  /** The middle of the unit's footprint. */\n  at: Point;\n  facing: Facing;\n  /** The wall it hangs on. */\n  wall: string;\n}\n\n/** The cardinal facing nearest a direction. */\nexport function facingToward(dx: number, dy: number): Facing {\n  if (Math.abs(dx) > Math.abs(dy)) {\n    return dx < 0 ? \"left\" : \"right\";\n  }\n  return dy < 0 ? \"up\" : \"down\";\n}\n\n/**\n * Which side of the wall faces away: the side with no room on it, else the\n * side `prefer` (a click, or the fixture's saved facing) points to.\n */\nexport function outward(\n  scene: Scene,\n  wallId: string,\n  prefer: Point,\n): { normal: Point; half: number } | null {\n  const wall = scene.walls.find((found) => found.id === wallId);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!wall || !ends) {\n    return null;\n  }\n  const length = Math.hypot(ends[1][0] - ends[0][0], ends[1][1] - ends[0][1]);\n  if (length === 0) {\n    return null;\n  }\n  const along: Point = [\n    (ends[1][0] - ends[0][0]) / length,\n    (ends[1][1] - ends[0][1]) / length,\n  ];\n  const left: Point = [along[1], -along[0]];\n  const mid: Point = [\n    (ends[0][0] + ends[1][0]) / 2,\n    (ends[0][1] + ends[1][1]) / 2,\n  ];\n  const half = wall.thickness / 2;\n  const open = [left, [-left[0], -left[1]] as Point].filter(\n    (side) => !roomAt(scene, [mid[0] + side[0] * 100, mid[1] + side[1] * 100]),\n  );\n  const options =\n    open.length === 1 ? open : [left, [-left[0], -left[1]] as Point];\n  const best = options.reduce((a, b) =>\n    a[0] * prefer[0] + a[1] * prefer[1] >= b[0] * prefer[0] + b[1] * prefer[1]\n      ? a\n      : b,\n  );\n  return { normal: best, half };\n}\n\n/** Where a heat pump on a wall hangs, or null when it isn't on one. */\nexport function mountOf(scene: Scene, fixture: Fixture): Mount | null {\n  if (fixture.kind !== \"heat_pump\" || !fixture.wall) {\n    return null;\n  }\n  const wall = scene.walls.find((found) => found.id === fixture.wall);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!ends || fixture.offset === undefined) {\n    return null;\n  }\n  const saved = FRONT[facingOf(fixture.props?.[\"facing\"])];\n  const side = outward(scene, fixture.wall, saved);\n  if (!side) {\n    return null;\n  }\n  const depth = modelById(fixture.props?.[\"model\"])?.depth ?? 0;\n  const base = pointAlong(ends[0], ends[1], fixture.offset);\n  const reach = side.half + depth / 2;\n  return {\n    at: [\n      Math.round(base[0] + side.normal[0] * reach),\n      Math.round(base[1] + side.normal[1] * reach),\n    ],\n    facing: facingToward(side.normal[0], side.normal[1]),\n    wall: fixture.wall,\n  };\n}\n\n/** How high a wall bracket sits, mm above the ground. */\nexport function mountHeight(fixture: Fixture): number {\n  const height = Number(fixture.props?.[\"height_mm\"] ?? 0);\n  return Number.isFinite(height) && height > 0 ? height : 0;\n}\n", "// Fixtures are placed equipment. A baseline's are what's there now; a scenario\n// adds some and takes some away.\n\nimport { distance, polygonCentroid, projectOnSegment } from \"./geometry\";\nimport { pointAlong } from \"./openings\";\nimport type {\n  DesignPackage,\n  Fixture,\n  FixtureKind,\n  Point,\n  Scene,\n  ScenarioFixture,\n} from \"./scene\";\nimport { FIXTURE_KINDS } from \"./scene\";\nimport { FACINGS } from \"./heatpump/clearance\";\nimport { HEAT_PUMP_MODELS } from \"./heatpump/models\";\nimport { BARRIERS } from \"./heatpump/noise\";\nimport { facingToward, mountOf, outward } from \"./heatpump/mount\";\nimport { polygonOf, roomAt, wallEnds } from \"./topology\";\n\nexport { FIXTURE_KINDS, type Fixture, type FixtureKind } from \"./scene\";\n\nexport interface PlacedFixture {\n  /** The floor's id. */\n  floor: number;\n  fixture: Fixture;\n  /** Added by the scenario; otherwise it's there now. */\n  proposed: boolean;\n}\n\n/**\n * The baseline's fixtures less the scenario's removals (`<floor pk>:<id>`, as\n * ids are per floor), plus its additions.\n */\nexport function scenarioFixtures(\n  floors: readonly { id: number; scene: Scene }[],\n  scenario: Pick<DesignPackage, \"fixtures\"> | null,\n): PlacedFixture[] {\n  const removed = new Set(scenario?.fixtures?.remove ?? []);\n  const kept = floors.flatMap((floor) =>\n    (floor.scene.fixtures ?? [])\n      .filter((fixture) => !removed.has(`${floor.id}:${fixture.id}`))\n      .map((fixture) => ({ floor: floor.id, fixture, proposed: false })),\n  );\n  const added = (scenario?.fixtures?.add ?? []).map(\n    ({ floor, ...fixture }) => ({ floor, fixture, proposed: true }),\n  );\n  return [...kept, ...added];\n}\n\n/** The kinds the Fixtures tool places; the rest are for later phases. */\nexport const PLACEABLE: readonly FixtureKind[] = [\n  \"gas_boiler\",\n  \"cylinder\",\n  \"heat_pump\",\n  \"solar_pv\",\n  \"extract_fan\",\n  \"mvhr\",\n  \"bath\",\n  \"shower\",\n];\n\n/** What each kind's panel edits: a label, its unit, and the starting value. */\nexport interface PropField {\n  key: string;\n  label: string;\n  unit?: string;\n  /** A fixed list to choose from, else a number or free text. */\n  options?: readonly string[];\n  numeric: boolean;\n  start: string | number;\n}\n\nexport const PROP_FIELDS: Partial<Record<FixtureKind, readonly PropField[]>> = {\n  gas_boiler: [\n    {\n      key: \"type\",\n      label: \"Type\",\n      options: [\"combi\", \"system\", \"regular\"],\n      numeric: false,\n      start: \"combi\",\n    },\n  ],\n  heat_pump: [\n    {\n      key: \"capacity_kw\",\n      label: \"Output\",\n      unit: \"kW\",\n      numeric: true,\n      start: 8,\n    },\n    {\n      key: \"model\",\n      label: \"Model\",\n      options: [\"\", ...HEAT_PUMP_MODELS.map((model) => model.id)],\n      numeric: false,\n      start: \"\",\n    },\n    {\n      key: \"facing\",\n      label: \"Fan faces\",\n      options: FACINGS,\n      numeric: false,\n      start: \"down\",\n    },\n    {\n      key: \"height_mm\",\n      label: \"Bracket height\",\n      unit: \"mm\",\n      numeric: true,\n      start: 0,\n    },\n    {\n      key: \"barrier\",\n      label: \"Noise barrier\",\n      options: BARRIERS,\n      numeric: false,\n      start: \"none\",\n    },\n  ],\n  cylinder: [\n    {\n      key: \"volume_l\",\n      label: \"Size\",\n      unit: \"litres\",\n      numeric: true,\n      start: 200,\n    },\n  ],\n  solar_pv: [\n    { key: \"kwp\", label: \"Size\", unit: \"kWp\", numeric: true, start: 4 },\n    // A baseline's count in its figures (apps/design/assumptions.py `solar`).\n    {\n      key: \"battery_kwh\",\n      label: \"Battery\",\n      unit: \"kWh\",\n      numeric: true,\n      start: 0,\n    },\n  ],\n};\n\n/** A new fixture's props: each field's starting value. */\nexport function startingProps(\n  kind: FixtureKind,\n): Record<string, string | number> {\n  return Object.fromEntries(\n    (PROP_FIELDS[kind] ?? [])\n      .filter((field) => field.start !== \"\")\n      .map((field) => [field.key, field.start]),\n  );\n}\n\n/** Where a fixture is drawn: its point, else its place on its wall, else its room's middle. */\nexport function fixturePoint(scene: Scene, fixture: Fixture): Point | null {\n  const mount = mountOf(scene, fixture);\n  if (mount) {\n    return mount.at;\n  }\n  if (fixture.at) {\n    return fixture.at;\n  }\n  const wall = fixture.wall\n    ? scene.walls.find((found) => found.id === fixture.wall)\n    : undefined;\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (ends && fixture.offset !== undefined) {\n    return pointAlong(ends[0], ends[1], fixture.offset);\n  }\n  const room = fixture.room\n    ? scene.rooms.find((found) => found.id === fixture.room)\n    : undefined;\n  return room ? polygonCentroid(polygonOf(scene, room)) : null;\n}\n\n/**\n * Where a click puts a fixture: against a wall when it's within `reach` mm of\n * one, else in the room it's in (at the point), else at the point outside.\n */\nexport function placementAt(\n  scene: Scene,\n  point: Point,\n  reach: number,\n): Pick<Fixture, \"room\" | \"wall\" | \"offset\" | \"at\"> {\n  let nearest: {\n    id: string;\n    offset: number;\n    room?: string;\n    gap: number;\n  } | null = null;\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    const found = projectOnSegment(point, ends[0], ends[1]);\n    if (found.distance <= reach && (!nearest || found.distance < nearest.gap)) {\n      nearest = {\n        id: wall.id,\n        offset: Math.round(found.t * distance(ends[0], ends[1])),\n        gap: found.distance,\n      };\n    }\n  }\n  const room = roomAt(scene, point);\n  if (nearest) {\n    return {\n      wall: nearest.id,\n      offset: nearest.offset,\n      ...(room ? { room: room.id } : {}),\n    };\n  }\n  const at: Point = [Math.round(point[0]), Math.round(point[1])];\n  return room ? { room: room.id, at } : { at };\n}\n\n/**\n * Which way a heat pump hung on `wallId` faces when placed by a click at\n * `point`: away from the wall, on the side with no room, else the click's side.\n */\nexport function wallFacing(scene: Scene, wallId: string, point: Point): string {\n  const wall = scene.walls.find((found) => found.id === wallId);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!ends) {\n    return \"down\";\n  }\n  const near = projectOnSegment(point, ends[0], ends[1]);\n  const prefer: Point = [\n    point[0] - (ends[0][0] + (ends[1][0] - ends[0][0]) * near.t),\n    point[1] - (ends[0][1] + (ends[1][1] - ends[0][1]) * near.t),\n  ];\n  const side = outward(scene, wallId, prefer);\n  return side ? facingToward(side.normal[0], side.normal[1]) : \"down\";\n}\n\n/** The nearest of `placed` within `reach` mm of the point. */\nexport function fixtureNear<T extends { fixture: Fixture }>(\n  scene: Scene,\n  placed: readonly T[],\n  point: Point,\n  reach: number,\n): T | null {\n  let best: { item: T; gap: number } | null = null;\n  for (const item of placed) {\n    const where = fixturePoint(scene, item.fixture);\n    const gap = where ? distance(where, point) : Number.POSITIVE_INFINITY;\n    if (gap <= reach && (!best || gap < best.gap)) {\n      best = { item, gap };\n    }\n  }\n  return best?.item ?? null;\n}\n\n/**\n * Keep every fixture somewhere the plan still has: a room or wall that's gone\n * is let go, a wall that got shorter caps the offset, and one with nowhere\n * left is dropped. The server refuses a scene with a fixture in no room.\n */\nexport function normalizeFixtures(scene: Scene): void {\n  if (!scene.fixtures) {\n    return;\n  }\n  const rooms = new Set(scene.rooms.map((room) => room.id));\n  scene.fixtures = scene.fixtures.flatMap((fixture) => {\n    const next = { ...fixture };\n    const point = fixturePoint(scene, fixture);\n    if (next.room && !rooms.has(next.room)) {\n      delete next.room;\n    }\n    const wall = next.wall\n      ? scene.walls.find((found) => found.id === next.wall)\n      : undefined;\n    const ends = wall ? wallEnds(scene, wall) : null;\n    if (ends && next.offset !== undefined) {\n      next.offset = Math.min(\n        next.offset,\n        Math.floor(distance(ends[0], ends[1])),\n      );\n    } else {\n      delete next.wall;\n      delete next.offset;\n    }\n    if (!next.room && !next.wall && !next.at && point) {\n      next.at = [Math.round(point[0]), Math.round(point[1])];\n    }\n    return next.room || next.wall || next.at ? [next] : [];\n  });\n}\n\n/** A fixture as the plan and its panel see it, by `<floor pk>:<id>`. */\nexport interface ShownFixture {\n  key: string;\n  floor: number;\n  fixture: Fixture;\n  state: \"existing\" | \"proposed\" | \"removed\";\n}\n\n/**\n * Every fixture to show for the scenario open (or none, in a baseline): the\n * baseline's, with what the scenario removes marked, and its additions.\n */\nexport function shownFixtures(\n  floors: readonly { id: number; scene: Scene }[],\n  scenario: Pick<DesignPackage, \"fixtures\"> | null,\n): ShownFixture[] {\n  const removed = new Set(scenario?.fixtures?.remove ?? []);\n  const there = floors.flatMap((floor) =>\n    (floor.scene.fixtures ?? []).map((fixture) => {\n      const key = `${floor.id}:${fixture.id}`;\n      return {\n        key,\n        floor: floor.id,\n        fixture,\n        state: removed.has(key) ? (\"removed\" as const) : (\"existing\" as const),\n      };\n    }),\n  );\n  const added = (scenario?.fixtures?.add ?? []).map(\n    ({ floor, ...fixture }) => ({\n      key: `${floor}:${fixture.id}`,\n      floor,\n      fixture,\n      state: \"proposed\" as const,\n    }),\n  );\n  return [...there, ...added];\n}\n\n/** The props House lists beside a fixture's name: what it is, not where it hangs. */\nconst SUMMARY_KEYS = [\"type\", \"capacity_kw\", \"volume_l\", \"kwp\", \"battery_kwh\"];\n\n/** A row of House's fixtures: the kind, and what its props say. */\nexport interface KitRow {\n  key: string;\n  name: string;\n  detail: string;\n}\n\n/** House's list of the fixtures there now, each with its size: \"4 kWp \u00B7 5 kWh\". */\nexport function kitRows(\n  shown: readonly Pick<ShownFixture, \"key\" | \"fixture\" | \"state\">[],\n): KitRow[] {\n  return shown\n    .filter((row) => row.state === \"existing\")\n    .map(({ key, fixture }) => ({\n      key,\n      name: FIXTURE_KINDS[fixture.kind],\n      detail: (PROP_FIELDS[fixture.kind] ?? [])\n        .filter((field) => SUMMARY_KEYS.includes(field.key))\n        .flatMap((field) => {\n          const value = fixture.props?.[field.key] ?? field.start;\n          if (value === \"\" || value === 0) {\n            return [];\n          }\n          const text = field.unit ? `${value} ${field.unit}` : String(value);\n          return [field.key === \"battery_kwh\" ? `${text} battery` : text];\n        })\n        .join(\" \u00B7 \"),\n    }));\n}\n\n/** What the 3D view draws of the shown fixtures: all but those a scenario removes. */\nexport function placedFromShown(\n  shown: readonly Pick<ShownFixture, \"floor\" | \"fixture\" | \"state\">[],\n): PlacedFixture[] {\n  return shown.flatMap((one) =>\n    one.state === \"removed\"\n      ? []\n      : [\n          {\n            floor: one.floor,\n            fixture: one.fixture,\n            proposed: one.state === \"proposed\",\n          },\n        ],\n  );\n}\n\n/** The scenario's fixture changes with `change` applied; fresh objects throughout. */\nexport function changedFixtures(\n  current: DesignPackage[\"fixtures\"],\n  change: {\n    add?: (add: ScenarioFixture[]) => ScenarioFixture[];\n    remove?: (remove: string[]) => string[];\n  },\n): { add: ScenarioFixture[]; remove: string[] } {\n  const add = [...(current?.add ?? [])];\n  const remove = [...(current?.remove ?? [])];\n  return {\n    add: change.add ? change.add(add) : add,\n    remove: change.remove ? change.remove(remove) : remove,\n  };\n}\n", "// The hot water cylinder: how big it should be for the household, and whether\n// it fits where it's put.\n\nimport type { Fixture, Point, Scene } from \"../scene\";\nimport { polygonOf } from \"../topology\";\n\n/**\n * The size rule, in one place. About 45 L of cylinder for each person, plus\n * 50 L for each bathroom after the first: the usual heat pump heuristic (the\n * Heat Pump Association's and MCS installer guidance give 40\u201350 L a person),\n * which is more than a boiler's because a heat pump heats the store more\n * slowly and at a lower temperature.\n */\nexport const CYLINDER_RULE = \"\u224845 L per person, plus 50 L per extra bathroom\";\nconst PER_PERSON_L = 45;\nconst PER_EXTRA_BATHROOM_L = 50;\n\n/** Litres wanted for `people` and `bathrooms`, to the next 10. */\nexport function neededLitres(people: number, bathrooms: number): number {\n  const litres =\n    PER_PERSON_L * people + PER_EXTRA_BATHROOM_L * Math.max(0, bathrooms - 1);\n  return Math.ceil(litres / 10) * 10;\n}\n\n/**\n * Bathrooms from the baths and showers placed: the rooms holding any, at\n * least one. Without any placed the house has the one it's assumed to.\n */\nexport function bathroomCount(\n  fixtures: readonly Pick<Fixture, \"kind\" | \"room\">[],\n): number {\n  const wet = new Set(\n    fixtures\n      .filter(\n        (fixture) =>\n          (fixture.kind === \"bath\" || fixture.kind === \"shower\") &&\n          fixture.room,\n      )\n      .map((fixture) => fixture.room),\n  );\n  return Math.max(1, wet.size);\n}\n\n/** A typical floor-standing cylinder's diameter, mm, by size. Approximate. */\nexport function cylinderDiameter(litres: number): number {\n  if (litres <= 200) {\n    return 550;\n  }\n  if (litres <= 250) {\n    return 600;\n  }\n  return litres <= 300 ? 650 : 700;\n}\n\n/** Room left round the cylinder's footprint, mm a side. */\nconst SPARE_MM = 50;\n\n/** Whether the cylinder's footprint fits the room it's in, by the room's bounding box. */\nexport function fitsRoom(\n  scene: Scene,\n  fixture: Pick<Fixture, \"room\">,\n  litres: number,\n): { fits: boolean; need: number } | null {\n  const room = scene.rooms.find((found) => found.id === fixture.room);\n  if (!room) {\n    return null;\n  }\n  const corners: Point[] = polygonOf(scene, room);\n  const xs = corners.map((corner) => corner[0]);\n  const ys = corners.map((corner) => corner[1]);\n  const across = Math.min(\n    Math.max(...xs) - Math.min(...xs),\n    Math.max(...ys) - Math.min(...ys),\n  );\n  const need = cylinderDiameter(litres) + 2 * SPARE_MM;\n  return { fits: across >= need, need };\n}\n", "// What a placed heat pump and cylinder come to: the notes the Fixtures panel\n// shows, and the figures the Build Pack's heat pump section reads.\n\nimport { SIZING_MARGIN } from \"../scenarios\";\nimport type { Fixture, Point, Scene } from \"../scene\";\nimport { roomAt } from \"../topology\";\nimport {\n  bathroomCount,\n  CYLINDER_RULE,\n  fitsRoom,\n  neededLitres,\n} from \"./cylinder\";\nimport {\n  type Facing,\n  facingOf,\n  unitShape,\n  type UnitShape,\n  zoneWarnings,\n} from \"./clearance\";\nimport { type HeatPumpModel, modelById } from \"./models\";\nimport { mountHeight, mountOf } from \"./mount\";\nimport {\n  barrierOf,\n  GROUND_REFLECTS_BELOW_MM,\n  type Noise,\n  noiseAt,\n  reflectingSurfaces,\n} from \"./noise\";\n\nexport interface Note {\n  text: string;\n  tone: \"ok\" | \"warn\";\n}\n\n/** A fixture on a floor, as the report reads it. */\nexport interface Placed {\n  floor: number;\n  fixture: Fixture;\n  /** The package adds it; false is what the plan already has. */\n  proposed?: boolean;\n}\n\nexport interface UnitReport {\n  model: HeatPumpModel;\n  at: Point;\n  shape: UnitShape;\n  /** Where the noise is assessed, if the designer has put one down. */\n  assessAt: Point | null;\n  noise: Noise | null;\n  notes: Note[];\n}\n\n/** Where a fixture is drawn, given by the caller (it knows the wall offsets). */\nexport type PointOf = (floor: number, fixture: Fixture) => Point | null;\n\nexport function assessmentPoint(fixture: Fixture): Point | null {\n  const x = fixture.props?.[\"assess_x\"];\n  const y = fixture.props?.[\"assess_y\"];\n  return typeof x === \"number\" && typeof y === \"number\" ? [x, y] : null;\n}\n\n/** The notes for one outdoor unit: kW cover, clearance, noise. */\nexport function unitReport(\n  scene: Scene,\n  unit: Placed,\n  all: readonly Placed[],\n  pointOf: PointOf,\n  neededKw: number | null,\n  names: Record<string, string>,\n): UnitReport | null {\n  const model = modelById(unit.fixture.props?.[\"model\"]);\n  // On a wall it hangs at the outside face, facing away; nothing's behind it.\n  const mount = mountOf(scene, unit.fixture);\n  const at = mount?.at ?? pointOf(unit.floor, unit.fixture);\n  if (!model || !at) {\n    return null;\n  }\n  const facing: Facing =\n    mount?.facing ?? facingOf(unit.fixture.props?.[\"facing\"]);\n  const shape = unitShape(\n    mount ? { ...model, clear: { ...model.clear, back: 0 } } : model,\n    at,\n    facing,\n  );\n  const notes: Note[] = [];\n  if (neededKw !== null) {\n    const covers = model.kw >= neededKw;\n    notes.push({\n      text: `${model.kw} kW ${covers ? \"covers\" : \"falls short of\"} the ${neededKw.toFixed(1)} kW needed (heat load + ${Math.round((SIZING_MARGIN - 1) * 100)}%)`,\n      tone: covers ? \"ok\" : \"warn\",\n    });\n  }\n  const others = all\n    .filter((other) => other.fixture.id !== unit.fixture.id)\n    .flatMap((other) => {\n      const where = pointOf(other.floor, other.fixture);\n      return where && other.floor === unit.floor\n        ? [{ name: names[other.fixture.kind] ?? other.fixture.kind, at: where }]\n        : [];\n    });\n  for (const text of zoneWarnings(scene, shape.zone, others, mount?.wall)) {\n    notes.push({ text, tone: \"warn\" });\n  }\n  if (\n    !notes.some((note) => note.tone === \"warn\" && note.text.includes(\"zone\"))\n  ) {\n    notes.push({ text: \"The clearance zone is free.\", tone: \"ok\" });\n  }\n  const assessAt = assessmentPoint(unit.fixture);\n  let noise: Noise | null = null;\n  if (assessAt) {\n    const distance = Math.hypot(assessAt[0] - at[0], assessAt[1] - at[1]);\n    noise = noiseAt(\n      model.lw,\n      distance,\n      reflectingSurfaces(scene, model, at, facing, mount?.wall),\n      barrierOf(unit.fixture.props?.[\"barrier\"]),\n      // A bracket high up the wall has no ground beside it.\n      !mount || mountHeight(unit.fixture) <= GROUND_REFLECTS_BELOW_MM,\n    );\n    notes.push({\n      text: `${noise.level} dB(A) at the assessment position: ${noise.passes ? \"passes\" : \"fails\"} MCS 020's ${noise.limit}`,\n      tone: noise.passes ? \"ok\" : \"warn\",\n    });\n  }\n  if (model.check) {\n    notes.push({\n      text: \"Size, clearances and sound power are unconfirmed: check them against the manual.\",\n      tone: \"warn\",\n    });\n  }\n  return { model, at, shape, assessAt, noise, notes };\n}\n\n/** The household a cylinder is sized for. */\nexport interface Household {\n  people: number;\n  /** Baths and showers placed, else the one bathroom assumed. */\n  fixtures: readonly Pick<Fixture, \"kind\" | \"room\">[];\n}\n\nexport function cylinderNotes(\n  scene: Scene,\n  cylinder: Fixture,\n  household: Household,\n): Note[] {\n  const litres = Number(cylinder.props?.[\"volume_l\"] ?? 0);\n  const bathrooms = bathroomCount(household.fixtures);\n  const needed = neededLitres(household.people, bathrooms);\n  const notes: Note[] = [\n    {\n      text: `${litres >= needed ? \"Big enough\" : \"Too small\"}: ${needed} L for ${household.people} ${household.people === 1 ? \"person\" : \"people\"} and ${bathrooms} ${bathrooms === 1 ? \"bathroom\" : \"bathrooms\"}. Rule: ${CYLINDER_RULE}.`,\n      tone: litres >= needed ? \"ok\" : \"warn\",\n    },\n  ];\n  const fit = fitsRoom(scene, cylinder, litres);\n  if (fit) {\n    notes.push({\n      text: fit.fits\n        ? \"It fits the room it's in.\"\n        : `The room is too narrow: it needs ${fit.need} mm each way.`,\n      tone: fit.fits ? \"ok\" : \"warn\",\n    });\n  }\n  return notes;\n}\n\n/** The Build Pack's heat pump section: JSON in `figures.heat_pump`. */\nexport interface HeatPumpFigures {\n  /** The make and model, \"Vaillant aroTHERM plus 7 kW\": the output is in it. */\n  model: string;\n  /** Nominal output, kW, for the cover check. */\n  kw: number;\n  /** kW the design heat load asks for, null without a room-by-room load. */\n  needed_kw: number | null;\n  covers: boolean | null;\n  /** \"Kitchen\", or \"Outside the house\". */\n  where: string;\n  floor: string;\n  cylinder: { litres: number; needed_l: number; ok: boolean } | null;\n  /** Rooms whose emitters fall short at the flow temperature. */\n  emitters: { flow_c: number; rooms: string[] } | null;\n  noise: {\n    level: number;\n    limit: number;\n    passes: boolean;\n    distance_m: number;\n  } | null;\n  /** The model's figures weren't confirmed against its manual. */\n  unconfirmed: boolean;\n}\n\nexport interface FigureInput {\n  floors: readonly { id: number; name: string; scene: Scene }[];\n  placed: readonly Placed[];\n  pointOf: PointOf;\n  neededKw: number | null;\n  household: Household;\n  flowC: number | null;\n  shortRooms: readonly string[] | null;\n  names: Record<string, string>;\n}\n\n/** Null when the package places no heat pump with a model chosen. */\nexport function heatPumpFigures(input: FigureInput): HeatPumpFigures | null {\n  const unit = input.placed.find(\n    ({ fixture, proposed }) =>\n      proposed !== false &&\n      fixture.kind === \"heat_pump\" &&\n      modelById(fixture.props?.[\"model\"]),\n  );\n  const floor = input.floors.find((found) => found.id === unit?.floor);\n  if (!unit || !floor) {\n    return null;\n  }\n  const report = unitReport(\n    floor.scene,\n    unit,\n    input.placed,\n    input.pointOf,\n    input.neededKw,\n    input.names,\n  );\n  if (!report) {\n    return null;\n  }\n  const room = roomAt(floor.scene, report.at);\n  const cylinder = input.placed.find(\n    ({ fixture }) => fixture.kind === \"cylinder\",\n  );\n  const litres = Number(cylinder?.fixture.props?.[\"volume_l\"] ?? 0);\n  const needed = neededLitres(\n    input.household.people,\n    bathroomCount(input.household.fixtures),\n  );\n  return {\n    model: report.model.id,\n    kw: report.model.kw,\n    needed_kw:\n      input.neededKw === null ? null : Math.round(input.neededKw * 10) / 10,\n    covers: input.neededKw === null ? null : report.model.kw >= input.neededKw,\n    where: room ? room.name : \"Outside the house\",\n    floor: floor.name,\n    cylinder: cylinder\n      ? { litres, needed_l: needed, ok: litres >= needed }\n      : null,\n    emitters:\n      input.flowC === null || input.shortRooms === null\n        ? null\n        : { flow_c: input.flowC, rooms: [...input.shortRooms] },\n    noise: report.noise && {\n      level: report.noise.level,\n      limit: report.noise.limit,\n      passes: report.noise.passes,\n      distance_m: report.noise.distanceM,\n    },\n    unconfirmed: report.model.check,\n  };\n}\n", "// The house in 3D: storeys stacked, walls stood up, drawn in isometric\n// projection back to front. Plain SVG polygons, so it stays light and prints.\n\nimport { pointAlong } from \"./openings\";\nimport { resolve } from \"./resolve\";\nimport type { FabricType, Floor, Point } from \"./scene\";\nimport { polygonOf } from \"./topology\";\n\n/** The depth of a floor between storeys, mm. */\nconst FLOOR_ZONE_MM = 250;\n\nconst COS30 = Math.cos(Math.PI / 6);\nconst SIN30 = Math.sin(Math.PI / 6);\n\nexport const ISO_COLORS = {\n  wall: \"#cbd5e1\", // slate-300\n  wallEdge: \"#64748b\", // slate-500\n  party: \"#c4b5fd\", // violet-300\n  treated: \"#f59e0b\", // amber-500\n  floor: \"#f8fafc\", // slate-50\n  floorEdge: \"#cbd5e1\", // slate-300\n  window: \"#bae6fd\", // sky-200\n  windowTreated: \"#0284c7\", // sky-600\n  door: \"#e2e8f0\", // slate-200\n  doorTreated: \"#16a34a\", // green-600\n  roof: \"#7c3aed\", // violet-600\n  groundTreated: \"#14b8a6\", // teal-500\n};\n\nexport interface IsoFace {\n  points: Point[];\n  fill: string;\n  stroke: string;\n  opacity: number;\n  /** Larger is nearer the viewer; faces are drawn in increasing depth. */\n  depth: number;\n}\n\n/** What the package on show treats, and the rooms' heat-map colours. */\nexport interface IsoPaint {\n  /** Bridge keys the package patches (`wall:3`, `window:5`, `roof`, \u2026). */\n  keys: ReadonlySet<string>;\n  /** Room fills by room id, when the heat map is on. */\n  rooms: ReadonlyMap<string, string>;\n}\n\n/** Shade a hex colour by `amount` (\u22121 darker \u2026 +1 lighter). */\nexport function shade(hex: string, amount: number): string {\n  const value = Number.parseInt(hex.slice(1), 16);\n  const channels = [(value >> 16) & 255, (value >> 8) & 255, value & 255].map(\n    (channel) =>\n      Math.round(\n        amount < 0\n          ? channel * (1 + amount)\n          : channel + (255 - channel) * amount,\n      ),\n  );\n  return `#${channels.map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nexport class Iso {\n  private readonly cos: number;\n  private readonly sin: number;\n\n  constructor(\n    angleDeg: number,\n    private readonly centre: Point,\n  ) {\n    const angle = (angleDeg * Math.PI) / 180;\n    this.cos = Math.cos(angle);\n    this.sin = Math.sin(angle);\n  }\n\n  /** Plan point turned about the centre: [across, into the screen]. */\n  private turned([x, y]: Point): Point {\n    const dx = x - this.centre[0];\n    const dy = y - this.centre[1];\n    return [dx * this.cos - dy * this.sin, dx * this.sin + dy * this.cos];\n  }\n\n  project(point: Point, z: number): Point {\n    const [x, y] = this.turned(point);\n    return [(x - y) * COS30, (x + y) * SIN30 - z];\n  }\n\n  depth(point: Point): number {\n    const [x, y] = this.turned(point);\n    return x + y;\n  }\n\n  /** Light from the upper left: walls turned towards it are lighter. */\n  light(a: Point, b: Point): number {\n    const [ax, ay] = this.turned(a);\n    const [bx, by] = this.turned(b);\n    const length = Math.hypot(bx - ax, by - ay) || 1;\n    // The wall's normal, compared with a light direction across the view.\n    const nx = (by - ay) / length;\n    const ny = -(bx - ax) / length;\n    return Math.abs(nx * 0.8 - ny * 0.6);\n  }\n}\n\n/** Where each storey starts, mm above the ground floor. */\nexport function storeyBases(floors: readonly Floor[]): number[] {\n  let base = 0;\n  return floors.map((floor) => {\n    const here = base;\n    base += floor.ceiling_height_mm + FLOOR_ZONE_MM;\n    return here;\n  });\n}\n\n/** Every face of the stacked house, back to front. */\nexport function isoFaces(\n  floors: readonly Floor[],\n  types: readonly FabricType[],\n  iso: Iso,\n  paint: IsoPaint,\n): IsoFace[] {\n  const faces: IsoFace[] = [];\n  const bases = storeyBases(floors);\n  const top = floors.length - 1;\n\n  floors.forEach((floor, index) => {\n    const scene = floor.scene;\n    const z = bases[index] ?? 0;\n    const height = floor.ceiling_height_mm;\n    const view = resolve(scene, types);\n    // Storeys draw in order: everything on a floor sits behind the one above.\n    const storey = index * 1e9;\n\n    for (const room of scene.rooms) {\n      const polygon = polygonOf(scene, room);\n      if (polygon.length < 3) {\n        continue;\n      }\n      const treated =\n        index === 0 && paint.keys.has(\"ground-floor\") && room.heated !== false;\n      faces.push({\n        points: polygon.map((point) => iso.project(point, z)),\n        fill: treated\n          ? ISO_COLORS.groundTreated\n          : (paint.rooms.get(room.id) ?? ISO_COLORS.floor),\n        stroke: ISO_COLORS.floorEdge,\n        opacity: room.heated === false ? 0.5 : 1,\n        depth: storey - 1e8,\n      });\n    }\n\n    const windows = [...paint.keys].some((key) => key.startsWith(\"window:\"));\n    const doors = [...paint.keys].some((key) => key.startsWith(\"door:\"));\n    for (const wall of view.walls) {\n      if (wall.kind === \"INTERNAL\") {\n        continue;\n      }\n      const party = wall.kind === \"PARTY\";\n      const treated = !party && paint.keys.has(wall.key);\n      const base = party\n        ? ISO_COLORS.party\n        : treated\n          ? ISO_COLORS.treated\n          : ISO_COLORS.wall;\n      const depth = storey + (iso.depth(wall.a) + iso.depth(wall.b)) / 2;\n      faces.push({\n        points: [\n          iso.project(wall.a, z),\n          iso.project(wall.b, z),\n          iso.project(wall.b, z + height),\n          iso.project(wall.a, z + height),\n        ],\n        fill: shade(base, iso.light(wall.a, wall.b) * 0.35 - 0.15),\n        stroke: ISO_COLORS.wallEdge,\n        opacity: 1,\n        depth,\n      });\n      for (const opening of view.openingsByWall.get(wall.id) ?? []) {\n        if (opening.type === \"opening\") {\n          continue;\n        }\n        const from = pointAlong(wall.a, wall.b, opening.offset);\n        const to = pointAlong(wall.a, wall.b, opening.offset + opening.width);\n        const sill =\n          z + (opening.type === \"window\" ? (opening.sill ?? 900) : 0);\n        const head = Math.min(z + height, sill + opening.height);\n        const glazing = opening.type === \"window\";\n        const lit = glazing ? windows && !party : doors && !party;\n        faces.push({\n          points: [\n            iso.project(from, sill),\n            iso.project(to, sill),\n            iso.project(to, head),\n            iso.project(from, head),\n          ],\n          fill: glazing\n            ? lit\n              ? ISO_COLORS.windowTreated\n              : ISO_COLORS.window\n            : lit\n              ? ISO_COLORS.doorTreated\n              : ISO_COLORS.door,\n          stroke: ISO_COLORS.wallEdge,\n          opacity: 1,\n          depth: depth + 0.5,\n        });\n      }\n    }\n\n    if (index === top && paint.keys.has(\"roof\")) {\n      for (const room of scene.rooms) {\n        const polygon = polygonOf(scene, room);\n        if (room.heated === false || polygon.length < 3) {\n          continue;\n        }\n        faces.push({\n          points: polygon.map((point) => iso.project(point, z + height)),\n          fill: ISO_COLORS.roof,\n          stroke: ISO_COLORS.roof,\n          opacity: 0.25,\n          depth: storey + 9e8,\n        });\n      }\n    }\n  });\n\n  return faces.sort((left, right) => left.depth - right.depth);\n}\n\n/** The middle of everything drawn, to turn the house about. */\nexport function centreOf(floors: readonly Floor[]): Point {\n  const points = floors.flatMap((floor) =>\n    floor.scene.vertices.map((vertex) => vertex.at),\n  );\n  if (points.length === 0) {\n    return [0, 0];\n  }\n  const xs = points.map((point) => point[0]);\n  const ys = points.map((point) => point[1]);\n  return [\n    (Math.min(...xs) + Math.max(...xs)) / 2,\n    (Math.min(...ys) + Math.max(...ys)) / 2,\n  ];\n}\n\n/** The faces' bounds in projected space, padded. */\nexport function boundsOf(\n  faces: readonly IsoFace[],\n): [number, number, number, number] {\n  const points = faces.flatMap((face) => face.points);\n  if (points.length === 0) {\n    return [0, 0, 1, 1];\n  }\n  const xs = points.map((point) => point[0]);\n  const ys = points.map((point) => point[1]);\n  const pad = 600;\n  const minX = Math.min(...xs) - pad;\n  const minY = Math.min(...ys) - pad;\n  return [\n    minX,\n    minY,\n    Math.max(...xs) + pad - minX,\n    Math.max(...ys) + pad - minY,\n  ];\n}\n", "// The Build Pack's drawings as SVG text: each floor's plan, the plan again\n// with one measure's annotations picked out, the house in 3D with a pin\n// where each measure goes, and the measures plan with every measure on every\n// floor. Styles are inline attributes with no references out, so Typst and an\n// <img> render them as they are.\n\nimport {\n  CATEGORY_COLORS,\n  CATEGORY_LABELS,\n  CATEGORY_ORDER,\n  categoryOf,\n} from \"./catalog\";\nimport { polygonCentroid } from \"./geometry\";\nimport { Iso, boundsOf, centreOf, isoFaces, shade, storeyBases } from \"./iso\";\nimport { pointAlong, wallSegments } from \"./openings\";\nimport { type ResolvedFloor, resolve } from \"./resolve\";\nimport type { Annotation, FabricType, Floor, Point } from \"./scene\";\nimport { polygonOf } from \"./topology\";\n\n/** Drawn in centimetres: plenty for a plan, and half the digits of mm. */\nconst SCALE = 0.1;\nconst PAD_MM = 600;\n/** The angle the editor's 3D view opens at. */\nexport const ISO_ANGLE = 30;\n\nconst INK = {\n  wall: \"#334155\", // slate-700\n  party: \"#8b5cf6\", // violet-500\n  room: \"#f1f5f9\", // slate-100\n  unheated: \"#ffffff\",\n  window: \"#38bdf8\", // sky-400\n  label: \"#475569\", // slate-600\n};\n\n/** The measures plan's ink: an architect's plan, dark on white. */\nconst SHEET = {\n  external: \"#262624\",\n  party: \"#57544e\",\n  internal: \"#b3afa6\",\n  unheated: \"#f3f2ee\",\n  edge: \"#a9a59c\",\n  label: \"#55534d\",\n};\n/** Half a symbol's width on the measures plan. */\nconst SYMBOL_MM = 300;\n\nexport type DrawnFloor = Pick<\n  Floor,\n  \"name\" | \"scene\" | \"ceiling_height_mm\" | \"annotations\"\n>;\n\nexport interface MeasuresPlan {\n  /** Every floor at one scale with the package's measures drawn on it, and\n   * how many marks of each are there: 0 for a run along walls or an area. */\n  floors: { name: string; svg: string; counts: Record<string, number> }[];\n  /** The legend: the measures drawn, by category, each with its symbol. */\n  groups: {\n    label: string;\n    color: string;\n    kinds: { kind: string; symbol: string }[];\n  }[];\n  /** What the plans' walls and fills mean, for those they show. */\n  key: { label: string; symbol: string }[];\n}\n\nexport interface Drawings {\n  floors: { name: string; svg: string }[];\n  locations: Record<string, { floor: string; svg: string }[]>;\n  iso: string;\n  pins: Record<string, [number, number][]>;\n  measures: MeasuresPlan;\n}\n\nfunction n(value: number): string {\n  return String(Math.round(value * SCALE));\n}\n\nfunction points(list: readonly Point[]): string {\n  return list.map(([x, y]) => `${n(x)},${n(y)}`).join(\" \");\n}\n\nfunction escapeXml(text: string): string {\n  return text\n    .replaceAll(\"&\", \"&amp;\")\n    .replaceAll(\"<\", \"&lt;\")\n    .replaceAll(\">\", \"&gt;\")\n    .replaceAll('\"', \"&quot;\");\n}\n\nfunction svg(\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  body: string,\n) {\n  const w = Math.max(1, Math.round(width));\n  const h = Math.max(1, Math.round(height));\n  return (\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${Math.round(x)} ${Math.round(y)} ${w} ${h}\"` +\n    ` width=\"${w}\" height=\"${h}\" font-family=\"Helvetica, Arial, sans-serif\">${body}</svg>`\n  );\n}\n\nfunction liveAnnotations(floor: DrawnFloor): Annotation[] {\n  return floor.annotations.filter(\n    (annotation) => !annotation.deleted && annotation.status !== \"REJECTED\",\n  );\n}\n\n/** Where a pin for an annotation goes: the point, a line's middle, an area's centre. */\nexport function anchorOf(annotation: Annotation): Point {\n  const geometry = annotation.geometry;\n  if (geometry.type === \"point\") {\n    return geometry.at;\n  }\n  if (geometry.type === \"area\") {\n    return polygonCentroid(geometry.polygon);\n  }\n  const lengths = geometry.points.slice(1).map((point, index) => {\n    const from = geometry.points[index] as Point;\n    return Math.hypot(point[0] - from[0], point[1] - from[1]);\n  });\n  let left = lengths.reduce((total, length) => total + length, 0) / 2;\n  for (const [index, length] of lengths.entries()) {\n    const from = geometry.points[index] as Point;\n    const to = geometry.points[index + 1] as Point;\n    if (left <= length) {\n      return pointAlong(from, to, left);\n    }\n    left -= length;\n  }\n  return geometry.points[0] as Point;\n}\n\nfunction boundsOfFloor(floor: DrawnFloor): [number, number, number, number] {\n  const all: Point[] = floor.scene.vertices.map((vertex) => vertex.at);\n  for (const annotation of liveAnnotations(floor)) {\n    const geometry = annotation.geometry;\n    if (geometry.type === \"point\") {\n      all.push(geometry.at);\n    } else if (geometry.type === \"line\") {\n      all.push(...geometry.points);\n    } else {\n      all.push(...geometry.polygon);\n    }\n  }\n  if (all.length === 0) {\n    return [0, 0, 1000, 1000];\n  }\n  const xs = all.map((point) => point[0]);\n  const ys = all.map((point) => point[1]);\n  const minX = Math.min(...xs) - PAD_MM;\n  const minY = Math.min(...ys) - PAD_MM;\n  return [\n    minX,\n    minY,\n    Math.max(...xs) + PAD_MM - minX,\n    Math.max(...ys) + PAD_MM - minY,\n  ];\n}\n\n/** The plan without annotations: rooms, walls, windows and doors, named rooms. */\nfunction planBody(floor: DrawnFloor, types: readonly FabricType[]): string {\n  const scene = floor.scene;\n  const view = resolve(scene, types);\n  const parts: string[] = [];\n  for (const room of scene.rooms) {\n    const polygon = polygonOf(scene, room);\n    if (polygon.length >= 3) {\n      parts.push(\n        `<polygon points=\"${points(polygon)}\" fill=\"${room.heated === false ? INK.unheated : INK.room}\"/>`,\n      );\n    }\n  }\n  for (const wall of view.walls) {\n    const internal = wall.kind === \"INTERNAL\";\n    const color = wall.kind === \"PARTY\" ? INK.party : INK.wall;\n    const width = n(Math.max(internal ? 80 : 150, wall.thickness));\n    const openings = view.openingsByWall.get(wall.id) ?? [];\n    for (const [a, b] of wallSegments(wall.a, wall.b, [...openings])) {\n      parts.push(\n        `<line x1=\"${n(a[0])}\" y1=\"${n(a[1])}\" x2=\"${n(b[0])}\" y2=\"${n(b[1])}\" stroke=\"${color}\"` +\n          ` stroke-width=\"${width}\"${internal ? ' stroke-opacity=\"0.45\"' : \"\"}/>`,\n      );\n    }\n    for (const opening of openings) {\n      if (opening.type !== \"window\") {\n        continue;\n      }\n      const a = pointAlong(wall.a, wall.b, opening.offset);\n      const b = pointAlong(wall.a, wall.b, opening.offset + opening.width);\n      parts.push(\n        `<line x1=\"${n(a[0])}\" y1=\"${n(a[1])}\" x2=\"${n(b[0])}\" y2=\"${n(b[1])}\" stroke=\"${INK.window}\" stroke-width=\"${n(80)}\"/>`,\n      );\n    }\n  }\n  for (const room of view.rooms) {\n    if (room.polygon.length < 3) {\n      continue;\n    }\n    const [x, y] = polygonCentroid([...room.polygon]);\n    parts.push(\n      `<text x=\"${n(x)}\" y=\"${n(y)}\" font-size=\"${n(260)}\" fill=\"${INK.label}\" text-anchor=\"middle\">${escapeXml(room.name)}</text>`,\n    );\n  }\n  return parts.join(\"\");\n}\n\nfunction annotationMarks(annotations: readonly Annotation[], color: string) {\n  return annotations\n    .map((annotation) => {\n      const geometry = annotation.geometry;\n      if (geometry.type === \"area\") {\n        return `<polygon points=\"${points(geometry.polygon)}\" fill=\"${color}\" fill-opacity=\"0.35\" stroke=\"${color}\" stroke-width=\"${n(60)}\"/>`;\n      }\n      if (geometry.type === \"line\") {\n        return `<polyline points=\"${points(geometry.points)}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${n(180)}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`;\n      }\n      const [x, y] = geometry.at;\n      return `<circle cx=\"${n(x)}\" cy=\"${n(y)}\" r=\"${n(220)}\" fill=\"${color}\" stroke=\"#ffffff\" stroke-width=\"${n(50)}\"/>`;\n    })\n    .join(\"\");\n}\n\nexport function planSvg(\n  floor: DrawnFloor,\n  types: readonly FabricType[],\n  highlight: { kind: string; color: string } | null = null,\n): string {\n  const [x, y, width, height] = boundsOfFloor(floor);\n  let body = planBody(floor, types);\n  if (highlight) {\n    const mine = liveAnnotations(floor).filter(\n      (annotation) => annotation.kind === highlight.kind,\n    );\n    body = `<g opacity=\"0.6\">${body}</g>${annotationMarks(mine, highlight.color)}`;\n  }\n  return svg(x * SCALE, y * SCALE, width * SCALE, height * SCALE, body);\n}\n\n/**\n * The house in 3D with what the package treats coloured, and where each\n * kind's annotations sit in the same drawing, for pins over it.\n */\nexport function isoDrawing(\n  floors: readonly DrawnFloor[],\n  types: readonly FabricType[],\n  treated: ReadonlySet<string>,\n  kinds: readonly string[],\n): { svg: string; pins: Record<string, [number, number][]> } {\n  const asFloors = floors as unknown as Floor[];\n  const iso = new Iso(ISO_ANGLE, centreOf(asFloors));\n  const faces = isoFaces(asFloors, types, iso, {\n    keys: treated,\n    rooms: new Map(),\n  });\n  const [minX, minY, width, height] = boundsOf(faces);\n  const at = ([px, py]: Point): [number, number] => [\n    Math.round((px - minX) * SCALE),\n    Math.round((py - minY) * SCALE),\n  ];\n  const body = faces\n    .map(\n      (face) =>\n        `<polygon points=\"${face.points.map((point) => at(point).join(\",\")).join(\" \")}\" fill=\"${face.fill}\"` +\n        ` stroke=\"${face.stroke}\" stroke-width=\"2\" stroke-linejoin=\"round\"` +\n        `${face.opacity < 1 ? ` fill-opacity=\"${face.opacity}\"` : \"\"}/>`,\n    )\n    .join(\"\");\n\n  const wanted = new Set(kinds);\n  const bases = storeyBases(asFloors);\n  const pins: Record<string, [number, number][]> = {};\n  floors.forEach((floor, index) => {\n    const z = (bases[index] ?? 0) + floor.ceiling_height_mm / 2;\n    for (const annotation of liveAnnotations(floor)) {\n      if (!wanted.has(annotation.kind)) {\n        continue;\n      }\n      const list = pins[annotation.kind] ?? [];\n      list.push(at(iso.project(anchorOf(annotation), z)));\n      pins[annotation.kind] = list;\n    }\n  });\n  return { svg: svg(0, 0, width * SCALE, height * SCALE, body), pins };\n}\n\ntype Glyph = \"heat-pump\" | \"cylinder\" | \"unit\" | \"fan\" | \"mark\";\n\nfunction glyphOf(kind: string): Glyph {\n  if (kind.includes(\"HEAT_PUMP\")) {\n    return \"heat-pump\";\n  }\n  if (kind.includes(\"HOT_WATER\")) {\n    return \"cylinder\";\n  }\n  if (kind.includes(\"AIR_CONDITIONING\")) {\n    return \"unit\";\n  }\n  if (kind.includes(\"VENTILATION\") || kind.includes(\"DUCT\")) {\n    return \"fan\";\n  }\n  return \"mark\";\n}\n\nfunction f(value: number): string {\n  return String(Math.round(value * 10) / 10);\n}\n\n/** A measure's symbol centred on [x, y], `r` its half-width, in drawn units. */\nfunction glyph(kind: string, color: string, [x, y]: Point, r: number): string {\n  const tint = shade(color, 0.85);\n  const line = `stroke=\"${color}\" stroke-width=\"${f(r * 0.14)}\"`;\n  const thin = `stroke=\"${color}\" stroke-width=\"${f(r * 0.09)}\"`;\n  switch (glyphOf(kind)) {\n    case \"heat-pump\": {\n      const cx = x - r * 0.35;\n      const fan = r * 0.42;\n      return (\n        `<rect x=\"${f(x - r)}\" y=\"${f(y - r * 0.65)}\" width=\"${f(2 * r)}\" height=\"${f(1.3 * r)}\"` +\n        ` rx=\"${f(r * 0.2)}\" fill=\"${tint}\" ${line}/>` +\n        `<circle cx=\"${f(cx)}\" cy=\"${f(y)}\" r=\"${f(fan)}\" fill=\"#ffffff\" ${thin}/>` +\n        `<path d=\"M${f(cx - fan)} ${f(y)}H${f(cx + fan)}M${f(cx)} ${f(y - fan)}V${f(y + fan)}\" fill=\"none\" ${thin}/>`\n      );\n    }\n    case \"cylinder\":\n      return (\n        `<circle cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"${f(r * 0.8)}\" fill=\"${tint}\" ${line}/>` +\n        `<circle cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"${f(r * 0.4)}\" fill=\"none\" ${thin}/>`\n      );\n    case \"unit\":\n      return (\n        `<rect x=\"${f(x - r)}\" y=\"${f(y - r * 0.45)}\" width=\"${f(2 * r)}\" height=\"${f(r * 0.9)}\"` +\n        ` rx=\"${f(r * 0.2)}\" fill=\"${tint}\" ${line}/>` +\n        `<path d=\"M${f(x - r * 0.75)} ${f(y + r * 0.2)}H${f(x + r * 0.75)}\" fill=\"none\" ${thin}/>`\n      );\n    case \"fan\":\n      return (\n        `<circle cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"${f(r)}\" fill=\"${tint}\" ${line}/>` +\n        [0, 120, 240]\n          .map(\n            (angle) =>\n              `<ellipse cx=\"${f(x)}\" cy=\"${f(y - r * 0.42)}\" rx=\"${f(r * 0.25)}\" ry=\"${f(r * 0.42)}\"` +\n              ` fill=\"${color}\" transform=\"rotate(${angle} ${f(x)} ${f(y)})\"/>`,\n          )\n          .join(\"\") +\n        `<circle cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"${f(r * 0.16)}\" fill=\"#ffffff\" ${thin}/>`\n      );\n    default:\n      return `<circle cx=\"${f(x)}\" cy=\"${f(y)}\" r=\"${f(r * 0.7)}\" fill=\"${color}\" stroke=\"#ffffff\" stroke-width=\"${f(r * 0.18)}\"/>`;\n  }\n}\n\n/** The four corners of a strip `width` wide along a to b. */\nfunction strip(a: Point, b: Point, width: number): Point[] {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n  const dx = (((a[1] - b[1]) / length) * width) / 2;\n  const dy = (((b[0] - a[0]) / length) * width) / 2;\n  return [\n    [a[0] + dx, a[1] + dy],\n    [b[0] + dx, b[1] + dy],\n    [b[0] - dx, b[1] - dy],\n    [a[0] - dx, a[1] - dy],\n  ];\n}\n\nfunction wallInk(kind: string): string {\n  if (kind === \"INTERNAL\") {\n    return SHEET.internal;\n  }\n  return kind === \"PARTY\" ? SHEET.party : SHEET.external;\n}\n\n/** A floor as an architect draws it, with the measures marked on it as\n * symbols, runs and areas in their category's colour. */\nfunction sheetBody(\n  view: ResolvedFloor,\n  marks: readonly Annotation[],\n  colorOf: (kind: string) => string,\n): string {\n  const inkOf = (mark: Annotation) => colorOf(mark.kind);\n  const parts: string[] = [];\n  for (const room of view.rooms) {\n    if (room.polygon.length >= 3) {\n      parts.push(\n        `<polygon points=\"${points(room.polygon)}\" fill=\"${room.heated ? \"#ffffff\" : SHEET.unheated}\"/>`,\n      );\n    }\n  }\n  for (const mark of marks) {\n    if (mark.geometry.type === \"area\") {\n      const color = inkOf(mark);\n      parts.push(\n        `<polygon points=\"${points(mark.geometry.polygon)}\" fill=\"${shade(color, 0.85)}\" stroke=\"${color}\"` +\n          ` stroke-width=\"${n(30)}\" stroke-dasharray=\"${n(160)} ${n(100)}\"/>`,\n      );\n    }\n  }\n  // Internal walls first, so the outside walls they meet cover their ends.\n  const walls = [\n    ...view.walls.filter((wall) => wall.kind === \"INTERNAL\"),\n    ...view.walls.filter((wall) => wall.kind !== \"INTERNAL\"),\n  ];\n  for (const wall of walls) {\n    const color = wallInk(wall.kind);\n    const width = Math.max(wall.kind === \"INTERNAL\" ? 80 : 150, wall.thickness);\n    const openings = view.openingsByWall.get(wall.id) ?? [];\n    for (const [a, b] of wallSegments(wall.a, wall.b, [...openings])) {\n      parts.push(\n        `<line x1=\"${n(a[0])}\" y1=\"${n(a[1])}\" x2=\"${n(b[0])}\" y2=\"${n(b[1])}\" stroke=\"${color}\" stroke-width=\"${n(width)}\"/>`,\n      );\n    }\n    for (const opening of openings) {\n      if (opening.type !== \"window\") {\n        continue;\n      }\n      const a = pointAlong(wall.a, wall.b, opening.offset);\n      const b = pointAlong(wall.a, wall.b, opening.offset + opening.width);\n      parts.push(\n        `<polygon points=\"${points(strip(a, b, width))}\" fill=\"#ffffff\" stroke=\"${SHEET.external}\" stroke-width=\"${n(12)}\"/>` +\n          `<line x1=\"${n(a[0])}\" y1=\"${n(a[1])}\" x2=\"${n(b[0])}\" y2=\"${n(b[1])}\" stroke=\"${SHEET.external}\" stroke-width=\"${n(25)}\"/>`,\n      );\n    }\n  }\n  for (const room of view.rooms) {\n    if (room.polygon.length < 3 || !room.name) {\n      continue;\n    }\n    const [x, y] = polygonCentroid([...room.polygon]);\n    parts.push(\n      `<text x=\"${n(x)}\" y=\"${n(y + 80)}\" font-size=\"${n(220)}\" font-weight=\"500\" letter-spacing=\"${n(30)}\"` +\n        ` fill=\"${SHEET.label}\" text-anchor=\"middle\">${escapeXml(room.name.toUpperCase())}</text>`,\n    );\n  }\n  for (const mark of marks) {\n    if (mark.geometry.type === \"line\") {\n      parts.push(\n        `<polyline points=\"${points(mark.geometry.points)}\" fill=\"none\" stroke=\"${inkOf(mark)}\"` +\n          ` stroke-width=\"${n(140)}\" stroke-linejoin=\"round\"/>`,\n      );\n    }\n  }\n  for (const mark of marks) {\n    if (mark.geometry.type === \"point\") {\n      const [x, y] = mark.geometry.at;\n      parts.push(\n        glyph(\n          mark.kind,\n          inkOf(mark),\n          [x * SCALE, y * SCALE],\n          SYMBOL_MM * SCALE,\n        ),\n      );\n    }\n  }\n  return parts.join(\"\");\n}\n\n/** A kind's legend symbol, drawn as the plans draw its marks. */\nfunction symbolSvg(\n  kind: string,\n  color: string,\n  marks: readonly Annotation[],\n): string {\n  const types = new Set(marks.map((mark) => mark.geometry.type));\n  let body = glyph(kind, color, [16, 16], 13);\n  if (!types.has(\"point\") && types.has(\"line\")) {\n    body =\n      `<rect x=\"2\" y=\"11\" width=\"28\" height=\"10\" fill=\"${SHEET.external}\"/>` +\n      `<line x1=\"2\" y1=\"16\" x2=\"30\" y2=\"16\" stroke=\"${color}\" stroke-width=\"5\"/>`;\n  } else if (!types.has(\"point\")) {\n    body = `<rect x=\"4\" y=\"7\" width=\"24\" height=\"18\" fill=\"${shade(color, 0.85)}\" stroke=\"${color}\" stroke-width=\"1.5\" stroke-dasharray=\"4 2.5\"/>`;\n  }\n  return svg(0, 0, 32, 32, body);\n}\n\nconst KEY: [string, string, string][] = [\n  [\n    \"EXTERNAL\",\n    \"External wall\",\n    `<rect x=\"0\" y=\"2\" width=\"28\" height=\"10\" fill=\"${SHEET.external}\"/>`,\n  ],\n  [\n    \"PARTY\",\n    \"Party wall\",\n    `<rect x=\"0\" y=\"2\" width=\"28\" height=\"10\" fill=\"${SHEET.party}\"/>`,\n  ],\n  [\n    \"INTERNAL\",\n    \"Internal wall\",\n    `<rect x=\"0\" y=\"4\" width=\"28\" height=\"6\" fill=\"${SHEET.internal}\"/>`,\n  ],\n  [\n    \"window\",\n    \"Window\",\n    `<rect x=\"0.5\" y=\"2.5\" width=\"27\" height=\"9\" fill=\"#ffffff\" stroke=\"${SHEET.external}\" stroke-width=\"1\"/>` +\n      `<line x1=\"0\" y1=\"7\" x2=\"28\" y2=\"7\" stroke=\"${SHEET.external}\" stroke-width=\"2\"/>`,\n  ],\n  [\n    \"unheated\",\n    \"Unheated space\",\n    `<rect x=\"0.5\" y=\"0.5\" width=\"27\" height=\"13\" fill=\"${SHEET.unheated}\" stroke=\"${SHEET.edge}\" stroke-width=\"1\"/>`,\n  ],\n];\n\nfunction keyOf(views: readonly ResolvedFloor[]): MeasuresPlan[\"key\"] {\n  const shown = new Set<string>();\n  for (const view of views) {\n    for (const wall of view.walls) {\n      shown.add(wall.kind);\n      const openings = view.openingsByWall.get(wall.id) ?? [];\n      if (openings.some((opening) => opening.type === \"window\")) {\n        shown.add(\"window\");\n      }\n    }\n    if (view.rooms.some((room) => !room.heated && room.polygon.length >= 3)) {\n      shown.add(\"unheated\");\n    }\n  }\n  return KEY.filter(([key]) => shown.has(key)).map(([, label, body]) => ({\n    label,\n    symbol: svg(0, 0, 28, 14, body),\n  }));\n}\n\n/**\n * The measures plan: every floor at one scale with the package's measures\n * drawn where they go, and the legend and key that read it. Empty when none\n * of the package's measures is marked on a floor.\n */\nexport function measuresPlan(\n  every: readonly DrawnFloor[],\n  types: readonly FabricType[],\n  kinds: readonly string[],\n  colors: ReadonlyMap<string, string>,\n): MeasuresPlan {\n  // A floor with no walls yet would stretch the shared box out to the origin.\n  const floors = every.filter((floor) => floor.scene.vertices.length > 0);\n  const wanted = new Set(kinds);\n  const marked = floors.map((floor) =>\n    liveAnnotations(floor).filter((annotation) => wanted.has(annotation.kind)),\n  );\n  const all = marked.flat();\n  const drawn = kinds.filter((kind) => all.some((mark) => mark.kind === kind));\n  if (drawn.length === 0) {\n    return { floors: [], groups: [], key: [] };\n  }\n  const colorOf = (kind: string) =>\n    colors.get(kind) ?? CATEGORY_COLORS[categoryOf(kind)];\n  const views = floors.map((floor) => resolve(floor.scene, types));\n  const boxes = floors.map(boundsOfFloor);\n  const minX = Math.min(...boxes.map(([x]) => x));\n  const minY = Math.min(...boxes.map(([, y]) => y));\n  const maxX = Math.max(...boxes.map(([x, , width]) => x + width));\n  const maxY = Math.max(...boxes.map(([, y, , height]) => y + height));\n  return {\n    floors: floors.map((floor, index) => {\n      const marks = marked[index] ?? [];\n      const counts: Record<string, number> = {};\n      for (const kind of drawn) {\n        const mine = marks.filter((mark) => mark.kind === kind);\n        if (mine.length > 0) {\n          counts[kind] = mine.filter(\n            (mark) => mark.geometry.type === \"point\",\n          ).length;\n        }\n      }\n      return {\n        name: floor.name,\n        svg: svg(\n          minX * SCALE,\n          minY * SCALE,\n          (maxX - minX) * SCALE,\n          (maxY - minY) * SCALE,\n          sheetBody(views[index] as ResolvedFloor, marks, colorOf),\n        ),\n        counts,\n      };\n    }),\n    groups: CATEGORY_ORDER.map((category) => ({\n      label: CATEGORY_LABELS[category],\n      color: CATEGORY_COLORS[category],\n      kinds: drawn\n        .filter((kind) => categoryOf(kind) === category)\n        .map((kind) => ({\n          kind,\n          symbol: symbolSvg(\n            kind,\n            colorOf(kind),\n            all.filter((mark) => mark.kind === kind),\n          ),\n        })),\n    })).filter((group) => group.kinds.length > 0),\n    key: keyOf(views),\n  };\n}\n\n/** Every drawing the pack shows for a package's measures. */\nexport function drawingsOf(\n  floors: readonly DrawnFloor[],\n  types: readonly FabricType[],\n  kinds: readonly string[],\n  colors: ReadonlyMap<string, string>,\n  treated: ReadonlySet<string>,\n): Drawings {\n  const locations: Drawings[\"locations\"] = {};\n  for (const kind of kinds) {\n    const color = colors.get(kind) ?? \"#f59e0b\";\n    const here = floors.filter((floor) =>\n      liveAnnotations(floor).some((annotation) => annotation.kind === kind),\n    );\n    if (here.length > 0) {\n      locations[kind] = here.map((floor) => ({\n        floor: floor.name,\n        svg: planSvg(floor, types, { kind, color }),\n      }));\n    }\n  }\n  const iso = isoDrawing(floors, types, treated, kinds);\n  return {\n    floors: floors.map((floor) => ({\n      name: floor.name,\n      svg: planSvg(floor, types),\n    })),\n    locations,\n    iso: iso.svg,\n    pins: iso.pins,\n    measures: measuresPlan(floors, types, kinds, colors),\n  };\n}\n", "// Approved Document O's simplified method as the Build Pack shows it: whether\n// the house meets it, room by room, and what to do when it doesn't. After a\n// phase, the windows it reglazes are checked with their new glass.\n\nimport type { Assessment, RoomResult } from \"../overheating/parto\";\nimport type { Patch } from \"./heatloss\";\nimport type { FabricType } from \"./scene\";\n\nexport const PART_O_METHOD = \"Approved Document O, simplified method\";\n\nexport interface OverheatingFigures {\n  method: string;\n  location_risk: \"high\" | \"moderate\";\n  /** Null when the simplified method can't show compliance at all. */\n  passes: boolean | null;\n  rooms: { name: string; floor: string; passes: boolean; why: string }[];\n  notes: string[];\n}\n\nfunction m2(value: number): string {\n  return `${value.toFixed(2)} m\u00B2`;\n}\n\nfunction whyOf(room: RoomResult): string {\n  const reasons: string[] = [];\n  if (room.limitPct !== null) {\n    reasons.push(\n      `the most glazed room, ${room.glazingPct.toFixed(1)}% glazed against a` +\n        ` ${room.limitPct}% limit`,\n    );\n  }\n  if (room.requiredM2 !== null) {\n    reasons.push(\n      `opens ${m2(room.nightM2)} while people sleep, of ${m2(room.requiredM2)} needed`,\n    );\n  }\n  const said = reasons.join(\"; \");\n  const sentence = `${said.charAt(0).toUpperCase()}${said.slice(1)}.`;\n  return [sentence, ...room.notes].join(\" \");\n}\n\n/** The pack's shape of an assessment; `floorOf` names a room's floor. */\nexport function overheatingFigures(\n  assessment: Assessment,\n  floorOf: (roomId: string) => string,\n): OverheatingFigures {\n  const unsuitable = assessment.unsuitable.length > 0;\n  const failed = assessment.checks\n    .filter((check) => check.status === \"fail\")\n    .map((check) => `${check.label}: ${check.detail}`);\n  return {\n    method: PART_O_METHOD,\n    location_risk: assessment.risk,\n    passes: unsuitable ? null : assessment.status === \"pass\",\n    // Only bedrooms and the most glazed room are held to a limit.\n    rooms: assessment.rooms\n      .filter((room) => room.status !== \"na\")\n      .map((room) => ({\n        name: room.name,\n        floor: floorOf(room.id),\n        passes: room.status === \"pass\",\n        why: whyOf(room),\n      })),\n    notes: [\n      ...(unsuitable\n        ? [\n            \"The simplified method can't show compliance here; model it to CIBSE TM59 instead.\",\n            ...assessment.unsuitable,\n          ]\n        : []),\n      ...failed,\n      ...assessment.notes,\n    ],\n  };\n}\n\n/**\n * The window types with a package's glass in place: its patches carry each\n * window type's new glazing and frame, and the old glass's own figures go.\n */\nexport function reglazed(\n  types: readonly FabricType[],\n  patches: readonly Patch[],\n): FabricType[] {\n  const glass = new Map<number, Record<string, unknown>>();\n  for (const patch of patches) {\n    for (const [key, element] of Object.entries(patch.elements)) {\n      const id = Number(key.split(\":\")[1]);\n      if (key.startsWith(\"window:\") && Number.isInteger(id)) {\n        glass.set(id, element);\n      }\n    }\n  }\n  return types.map((type) => {\n    const element = glass.get(type.id);\n    if (type.element !== \"WINDOW\" || !element) {\n      return type;\n    }\n    const { g_value: _g, light_transmittance: _lt, ...spec } = type.spec;\n    return {\n      ...type,\n      spec: {\n        ...spec,\n        glazing: element[\"glazing\"] ?? spec[\"glazing\"],\n        frame: element[\"frame\"] ?? spec[\"frame\"],\n      },\n    };\n  });\n}\n", "// \"Your home today\" for a package kept in a proposal: the house as it is,\n// scored as a package's baseline is, so the Build Pack's before is today's\n// house and not the proposal with its unbuilt extension.\n\nimport { fetchCalcContext, fetchDesign } from \"./api\";\nimport { type DrawnFloor, planSvg } from \"./drawings\";\nimport { type Performance, performanceOf } from \"./figures\";\nimport { designHeatLoad, peakModel } from \"./heatload\";\nimport type { FloorInput } from \"./heatmodel\";\nimport { type CalcContext, Prepared } from \"./heatloss\";\nimport { Explorer } from \"./scenarios\";\nimport type { FabricType, HeatLoadContext } from \"./scene\";\n\nexport interface Today extends Performance {\n  floor_area_m2: number;\n  /** The as-is scene's floor plans, as surveyed. */\n  floors: { name: string; svg: string }[];\n  /** When the as-is scene last changed, so the pack can tell it's moved on. */\n  design_updated: string;\n}\n\nexport interface TodayInput {\n  context: CalcContext;\n  floors: readonly (DrawnFloor & FloorInput)[];\n  types: readonly FabricType[];\n  heatLoad: HeatLoadContext | null;\n  updated: string;\n}\n\nexport function todayOf(input: TodayInput): Today {\n  const { context, floors, types, heatLoad } = input;\n  const scenes = floors.map((floor) => floor.scene);\n  let loads: ReturnType<typeof designHeatLoad> | null = null;\n  if (heatLoad) {\n    try {\n      loads = designHeatLoad(floors, types, context.elements, heatLoad);\n    } catch {\n      loads = null;\n    }\n  }\n  const explorer = new Explorer(\n    new Prepared(\n      context,\n      scenes,\n      floors.map((floor) => floor.ceiling_height_mm),\n      types,\n    ),\n    { keys: [], groups: [] },\n    scenes,\n    types,\n    new Map(),\n    loads ? peakModel(loads, types, context.elements) : null,\n  );\n  const rooms = loads?.rooms.map((room) => ({\n    name: room.name,\n    floor: room.floor,\n    temp_c: room.internalC,\n    watts: Math.round(room.designW),\n    area_m2: Math.round(room.areaM2 * 10) / 10,\n  }));\n  return {\n    floor_area_m2: Math.round(explorer.rows([]).total_floor_area_4 * 10) / 10,\n    ...performanceOf(explorer, [], explorer.evaluate([]), {\n      rooms: () => rooms ?? null,\n    }),\n    floors: floors.map((floor) => ({\n      name: floor.name,\n      svg: planSvg(floor, types),\n    })),\n    design_updated: input.updated,\n  };\n}\n\n/** Today from the as-is scene's own design and calc context. */\nexport async function loadToday(designUrl: string): Promise<Today> {\n  const design = await fetchDesign(designUrl);\n  const context = await fetchCalcContext(design.calc_context_url);\n  return todayOf({\n    context,\n    floors: design.floors,\n    types: design.fabric_types,\n    heatLoad: design.heat_load,\n    updated: design.updated ?? \"\",\n  });\n}\n\n/**\n * Today, or null when the as-is scene can't be scored: the package is kept\n * without it, and the pack calls its figures stale until it's kept again.\n */\nexport async function todayOrNone(designUrl: string): Promise<Today | null> {\n  try {\n    return await loadToday(designUrl);\n  } catch {\n    return null;\n  }\n}\n", "import { assumedOccupancy42 } from \"../calc/water\";\nimport { fetchSchedule } from \"./api\";\nimport { roomCover } from \"./emitters\";\nimport { FIXTURE_KINDS, fixturePoint, scenarioFixtures } from \"./fixtures\";\nimport { type HeatPumpFigures, heatPumpFigures } from \"./heatpump/report\";\nimport { drawingsOf } from \"./drawings\";\nimport {\n  type Figures,\n  type Phase,\n  type RoomLoad,\n  figuresOf,\n  packagedKinds,\n  phasesOf,\n} from \"./figures\";\nimport * as phaseOps from \"./phases\";\nimport {\n  type HeatLoadContext,\n  designHeatLoad,\n  resolveConditions,\n} from \"./heatload\";\nimport { type CalcContext, type Patch } from \"./heatloss\";\nimport { designOverheating } from \"./overheating\";\nimport { overheatingFigures, reglazed } from \"./partofigures\";\nimport type { PaletteEntry } from \"./catalog\";\nimport {\n  type DesignPackage,\n  type FabricType,\n  type Floor,\n  type OverheatingContext,\n} from \"./scene\";\nimport { type Targets, neededKw } from \"./scenarios\";\nimport { ScenarioView } from \"./scenarioview\";\nimport { todayOrNone } from \"./today\";\n\n/** The editor's state a package's figures are worked out from. */\nexport interface FigureSources {\n  view: ScenarioView;\n  floors: Floor[];\n  types: FabricType[];\n  heatLoad: HeatLoadContext | null;\n  /** The calc context's elements: the house before any measure. */\n  baseElements: CalcContext[\"elements\"];\n  palette: readonly PaletteEntry[];\n  scheduleUrl: string;\n  overheating: OverheatingContext | null;\n  northDeg: number | null;\n  /** The as-is scene, when the package is kept in a proposal. */\n  existingUrl: string;\n}\n\n/** A package as its figures are worked out. */\nexport interface Scoring {\n  id?: number;\n  options: string[];\n  phases: Phase[];\n  letter: string;\n  targets?: Targets | undefined;\n  fixtures?: DesignPackage[\"fixtures\"];\n}\n\n/**\n * A package's own view of the explorer, for its targets and priced from its\n * own schedule once it's saved, and its phases tidied to match.\n */\nasync function scoring(\n  sources: Pick<FigureSources, \"view\" | \"scheduleUrl\">,\n  saved: Scoring,\n) {\n  const explorer = sources.view.explorer.withTargets(\n    saved.targets ?? {},\n    saved.fixtures ? { fixtures: saved.fixtures } : null,\n  );\n  const schedule = await fetchSchedule(\n    saved.id === undefined\n      ? sources.scheduleUrl\n      : `${sources.scheduleUrl}?package=${saved.id}`,\n  );\n  explorer.setKindCosts(schedule.rows);\n  const packaged = packagedKinds(explorer, saved.options);\n  const phases = phaseOps.tidy(\n    saved.phases,\n    packaged,\n    new Set(schedule.rows.map((row) => row.kind)),\n  );\n  return { explorer, schedule, packaged, phases };\n}\n\n/**\n * A package's totals alone, as Compare's table shows them: none of the\n * drawings, room-by-room loads, Part O or heat pump the Build Pack needs.\n */\nexport async function headlineFigures(\n  sources: Pick<FigureSources, \"view\" | \"scheduleUrl\">,\n  saved: Scoring,\n): Promise<Figures> {\n  const { explorer, schedule, phases } = await scoring(sources, saved);\n  return figuresOf({\n    explorer,\n    options: saved.options,\n    phases,\n    schedule: schedule.rows,\n    rooms: () => null,\n    letter: saved.letter,\n  });\n}\n\n/**\n * The figures the Build Pack shows for a package, phases tidied to match:\n * scored on its own view of the explorer, for its targets, and priced from\n * its own schedule once it's saved.\n */\nexport async function packageFigures(\n  sources: FigureSources,\n  saved: Scoring,\n): Promise<{ phases: Phase[]; figures: Figures }> {\n  const { view, floors, types, heatLoad } = sources;\n  const { explorer, schedule, packaged, phases } = await scoring(\n    sources,\n    saved,\n  );\n  const kinds = phasesOf(phases, packaged).flatMap((phase) => phase.kinds);\n  const treated = new Set(\n    explorer\n      .patches(view.choiceOf(saved.options))\n      .flatMap((patch) => Object.keys(patch.elements)),\n  );\n  const patchesOf = explorer.patches(view.choiceOf(saved.options));\n  const rooms = (patches: readonly Patch[]): RoomLoad[] | null => {\n    if (!heatLoad) {\n      return null;\n    }\n    try {\n      return designHeatLoad(\n        floors,\n        types,\n        explorer.prepared.derived(patches),\n        heatLoad,\n        sources.baseElements,\n      ).rooms.map((room) => ({\n        name: room.name,\n        floor: room.floor,\n        temp_c: room.internalC,\n        watts: Math.round(room.designW),\n        area_m2: Math.round(room.areaM2 * 10) / 10,\n      }));\n    } catch {\n      return null;\n    }\n  };\n  const floorOf = new Map(\n    floors.flatMap((floor) =>\n      floor.scene.rooms.map((room) => [room.id, floor.name] as const),\n    ),\n  );\n  const partO = sources.overheating;\n  const overheating = (patches: readonly Patch[]) => {\n    if (!partO) {\n      return null;\n    }\n    try {\n      return overheatingFigures(\n        designOverheating(\n          floors,\n          reglazed(types, patches),\n          partO,\n          sources.northDeg,\n        ),\n        (id) => floorOf.get(id) ?? \"\",\n      );\n    } catch {\n      return null;\n    }\n  };\n  const resolution = heatLoad\n    ? resolveConditions(heatLoad, floors, types)\n    : null;\n  const today = sources.existingUrl\n    ? await todayOrNone(sources.existingUrl)\n    : null;\n  const figures = figuresOf({\n    explorer,\n    options: saved.options,\n    phases,\n    schedule: schedule.rows,\n    rooms,\n    overheating,\n    letter: saved.letter,\n    flow_c: heatLoad?.settings.flow_c ?? null,\n    conditions: resolution && {\n      outside_c: resolution.conditions.outdoor.designC,\n      zone: resolution.conditions.outdoor.zone,\n      percentile: resolution.conditions.outdoor.percentile,\n      indoor: resolution.conditions.indoor,\n    },\n    // Only the package's own annotations; a new one has none yet.\n    drawings: drawingsOf(\n      floors.map((floor) => ({\n        ...floor,\n        annotations: floor.annotations.filter(\n          (annotation) =>\n            saved.id !== undefined && annotation.package === saved.id,\n        ),\n      })),\n      types,\n      kinds,\n      new Map(sources.palette.map((entry) => [entry.kind, entry.color])),\n      treated,\n    ),\n  });\n  const pump = heatPumpOf(\n    sources,\n    saved.fixtures,\n    patchesOf,\n    (p) => explorer.prepared.derived(p),\n    // The one heat load the package is scored on.\n    neededKw(figures.peak),\n    explorer.rows([]).total_floor_area_4,\n  );\n  return {\n    phases,\n    figures: {\n      ...figures,\n      ...(today ? { today } : {}),\n      ...(pump ? { heat_pump: pump } : {}),\n    },\n  };\n}\n\n/** The package's heat pump, from its fixtures and the house with its measures in. */\nfunction heatPumpOf(\n  sources: FigureSources,\n  fixtures: DesignPackage[\"fixtures\"] | undefined,\n  patches: readonly Patch[],\n  derived: (patches: readonly Patch[]) => CalcContext[\"elements\"],\n  needed: number,\n  floorAreaM2: number,\n): HeatPumpFigures | null {\n  const { floors, types, heatLoad } = sources;\n  const placed = scenarioFixtures(floors, fixtures ? { fixtures } : null);\n  // Only a heat pump the package installs; one already on the plan isn't its.\n  if (\n    !placed.some(\n      ({ fixture, proposed }) => proposed && fixture.kind === \"heat_pump\",\n    )\n  ) {\n    return null;\n  }\n  let load: ReturnType<typeof designHeatLoad> | null = null;\n  if (heatLoad) {\n    try {\n      load = designHeatLoad(\n        floors,\n        types,\n        derived(patches),\n        heatLoad,\n        sources.baseElements,\n      );\n    } catch {\n      load = null;\n    }\n  }\n  const flowC = heatLoad?.settings.flow_c ?? null;\n  const emitters = floors.flatMap((floor) => floor.scene.emitters);\n  return heatPumpFigures({\n    floors,\n    placed: placed.map(({ floor, fixture, proposed }) => ({\n      floor,\n      fixture,\n      proposed,\n    })),\n    pointOf: (id, fixture) => {\n      const found = floors.find((floor) => floor.id === id);\n      return found ? fixturePoint(found.scene, fixture) : null;\n    },\n    neededKw: needed,\n    household: {\n      people: assumedOccupancy42(floorAreaM2),\n      fixtures: placed.map(({ fixture }) => fixture),\n    },\n    flowC,\n    shortRooms:\n      load && flowC !== null\n        ? load.rooms\n            .filter((room) => roomCover(emitters, room, flowC)?.short === true)\n            .map((room) => room.name)\n        : null,\n    names: FIXTURE_KINDS,\n  });\n}\n", "// The scenarios tab's working state: which options the search may use, typed-in\n// prices, and the package on show. The editor\n// copies the view models out into Alpine; everything heavy stays here.\n\nimport { sapScore } from \"../calc/sapscore\";\nimport type { HeatPumpSite } from \"./heatpumpcost\";\nimport { CATEGORY_COLORS, type MeasureCategory } from \"./catalog\";\nimport type { FabricType, Scene } from \"./bridge\";\nimport type { DesignPackage, ScheduleRow } from \"./scene\";\n\nimport type { PeakModel } from \"./heatload\";\nimport { type CalcContext, type Patch, Prepared } from \"./heatloss\";\nimport {\n  Explorer,\n  HIGHER_IS_BETTER,\n  type Metric,\n  type Outcome,\n  type Packages,\n  type ScenarioContext,\n  type ScenarioOption,\n  type SiteSource,\n  type Targets,\n  band,\n  frontier,\n  neededKw,\n} from \"./scenarios\";\n\n/** The first search is trimmed to this, so the tab opens on a frontier in seconds. */\nexport const START_PACKAGES = 50_000;\n\n/** Searches bigger than this ask for options to be switched off first. */\nexport const MAX_PACKAGES = 500_000;\n\nexport interface OptionView {\n  id: string;\n  label: string;\n  cost: string;\n  priced: boolean;\n  enabled: boolean;\n  /** Pounds per unit of the basis (or in total), as typed. */\n  rate: string;\n  unit: string;\n  /** What the cost is made of, one per line; empty for a single price. */\n  breakdown: string;\n}\n\nexport interface GroupView {\n  id: string;\n  label: string;\n  color: string;\n  note: string;\n  choice: number;\n  options: OptionView[];\n}\n\nexport interface OutcomeView {\n  sap: string;\n  band: string;\n  bills: string;\n  carbon: string;\n  cost: string;\n  heatLoss: string;\n  sapDelta: string;\n  billsDelta: string;\n  carbonDelta: string;\n  /** Design heat load. */\n  peak: string;\n  /** The same, kW unrounded: what the heat pump is sized against. */\n  peakKw: number;\n  /** What the package's heat pump makes of it, or \"\". */\n  sizing: string;\n  /** False when the heat pump is too small. */\n  fits: boolean;\n  payback: string;\n  /** \"less \u00A37,500 Boiler Upgrade Scheme grant\", or \"\": `cost` is before it. */\n  grants: string;\n  /** \"\u2212\u00A37,500\", or \"\". */\n  grant: string;\n}\n\nexport interface Pick {\n  /** The option's id, to find what it covers. */\n  id: string;\n  label: string;\n  color: string;\n}\n\n/**\n * \"less \u00A37,500 Boiler Upgrade Scheme grant\", or \"\": a package's costs are\n * before grants everywhere, with the grant as a line of its own.\n */\nexport function grantLine(\n  grants: readonly { name: string; amount: number }[],\n): string {\n  const total = grants.reduce((sum, grant) => sum + grant.amount, 0);\n  if (total <= 0) {\n    return \"\";\n  }\n  return `less ${pounds(total)} ${grants[0]?.name ?? \"\"} grant`;\n}\n\nexport function pounds(pence: number): string {\n  return `\u00A3${Math.round(pence / 100).toLocaleString(\"en-GB\")}`;\n}\n\nfunction signed(value: number, digits = 0): string {\n  const rounded = Number(Math.abs(value).toFixed(digits));\n  if (rounded === 0) {\n    return \"\u00B10\";\n  }\n  const text = rounded.toLocaleString(\"en-GB\", {\n    minimumFractionDigits: digits,\n    maximumFractionDigits: digits,\n  });\n  return `${value > 0 ? \"+\" : \"\u2212\"}${text}`;\n}\n\nfunction unitOf(option: ScenarioOption): string {\n  const basis = option.cost.basis;\n  if (basis === \"fixed\") {\n    return \"total\";\n  }\n  if (basis === \"windows\" || basis === \"doors\") {\n    return `per ${basis.slice(0, -1)}`;\n  }\n  return \"per m\u00B2\";\n}\n\nfunction colorOf(category: string): string {\n  return CATEGORY_COLORS[category as MeasureCategory] ?? CATEGORY_COLORS.other;\n}\n\nexport class ScenarioView {\n  private readonly plain: Explorer;\n  /** The open scenario's targets and fixtures, scored on a view of `plain`. */\n  private aimed: Explorer | null = null;\n  /** The explorer, aimed at the open scenario's targets when it has been. */\n  get explorer(): Explorer {\n    return this.aimed ?? this.plain;\n  }\n\n  /**\n   * Score for a scenario's targets and fixtures (null for neither). The search\n   * in Compare stays on the whole house.\n   */\n  aim(\n    targets: Targets | null,\n    fixtures: { fixtures?: DesignPackage[\"fixtures\"] } | null = null,\n  ): void {\n    this.aim_ = targets ? { targets, fixtures } : null;\n    this.aimed = targets ? this.plain.withTargets(targets, fixtures) : null;\n  }\n\n  private aim_: {\n    targets: Targets;\n    fixtures: { fixtures?: DesignPackage[\"fixtures\"] } | null;\n  } | null = null;\n\n  /** Re-aim after the plain explorer changed, which the aimed view copied. */\n  private reaim(): void {\n    if (this.aim_) {\n      this.aim(this.aim_.targets, this.aim_.fixtures);\n    }\n  }\n\n  /** The Measures tab's costs, kept through an open scenario. */\n  setKindCosts(rows: readonly ScheduleRow[]): void {\n    this.plain.setKindCosts(rows);\n    this.reaim();\n  }\n\n  /** What the house has, for pricing heat pumps. */\n  setSite(site: HeatPumpSite | SiteSource): void {\n    this.plain.setSite(site);\n    this.reaim();\n  }\n\n  packages: Packages | null = null;\n  front: number[] = [];\n  metric: Metric = \"sap\";\n  choice: number[];\n  private readonly enabled = new Set<string>();\n  /** Switched off by `fit`, not by a person. */\n  private readonly trimmed = new Set<string>();\n  /** A person asked for more than `fit` would search, so it leaves it be. */\n  private widened = false;\n  private readonly rates = new Map<string, number | null>();\n\n  constructor(\n    context: CalcContext,\n    scenario: ScenarioContext,\n    scenes: readonly Scene[],\n    ceilingHeightsMm: readonly number[],\n    types: readonly FabricType[],\n    previous: ScenarioView | null = null,\n    peak: PeakModel | null = null,\n    /** Each scene's floor pk, which a scenario's targets name entities by. */\n    floors: readonly number[] = [],\n  ) {\n    const prepared = new Prepared(\n      context,\n      scenes,\n      ceilingHeightsMm,\n      types,\n      floors,\n    );\n    this.plain = new Explorer(\n      prepared,\n      scenario,\n      scenes,\n      types,\n      new Map(),\n      peak,\n    );\n    this.plain.grants = previous ? previous.explorer.grants : true;\n    const picked = new Set(\n      previous\n        ? previous.explorer.picked(previous.choice).map((option) => option.id)\n        : [],\n    );\n    this.choice = scenario.groups.map((group) =>\n      group.options.findIndex((option) => picked.has(option.id)),\n    );\n    for (const group of scenario.groups) {\n      for (const option of group.options) {\n        const rate = previous?.rates.get(option.id);\n        if (rate !== undefined) {\n          this.rates.set(option.id, rate);\n          this.plain.setRate(option.id, rate);\n        }\n        const wasOn = previous?.knows(option.id)\n          ? previous.enabled.has(option.id)\n          : option.default;\n        if (wasOn) {\n          this.enabled.add(option.id);\n        }\n        if (previous?.trimmed.has(option.id)) {\n          this.trimmed.add(option.id);\n        }\n      }\n    }\n    if (previous) {\n      this.metric = previous.metric;\n      this.widened = previous.widened;\n    }\n  }\n\n  /** Typed prices and the options switched on and off, for keeping between visits. */\n  settings(): {\n    rates: Record<string, number | null>;\n    on: string[];\n    off: string[];\n    trimmed: string[];\n    widened: boolean;\n    grants: boolean;\n  } {\n    return {\n      rates: Object.fromEntries(this.rates),\n      on: [...this.enabled],\n      off: this.explorer.groups.flatMap((group) =>\n        group.options\n          .filter((option) => !this.enabled.has(option.id))\n          .map((option) => option.id),\n      ),\n      trimmed: [...this.trimmed],\n      widened: this.widened,\n      grants: this.explorer.grants,\n    };\n  }\n\n  setGrants(on: boolean): void {\n    this.plain.grants = on;\n    this.reaim();\n  }\n\n  /**\n   * Settings kept from an earlier visit; options since removed are ignored,\n   * and options since added take their default.\n   */\n  restore(settings: {\n    rates?: unknown;\n    on?: unknown;\n    off?: unknown;\n    trimmed?: unknown;\n    widened?: unknown;\n    grants?: unknown;\n  }): void {\n    if (typeof settings.grants === \"boolean\") {\n      this.plain.grants = settings.grants;\n      this.reaim();\n    }\n    if (typeof settings.widened === \"boolean\") {\n      this.widened = settings.widened;\n    } else if (Array.isArray(settings.on)) {\n      // Saved before the first search was trimmed: a person chose these.\n      this.widened = true;\n    }\n    if (Array.isArray(settings.trimmed)) {\n      this.trimmed.clear();\n      for (const id of settings.trimmed) {\n        if (typeof id === \"string\" && this.option(id)) {\n          this.trimmed.add(id);\n        }\n      }\n    }\n    if (settings.rates && typeof settings.rates === \"object\") {\n      for (const [id, rate] of Object.entries(settings.rates)) {\n        if (this.option(id) && (rate === null || typeof rate === \"number\")) {\n          this.rates.set(id, rate);\n          this.plain.setRate(id, rate);\n        }\n      }\n      this.reaim();\n    }\n    if (Array.isArray(settings.on)) {\n      const on = new Set<unknown>(settings.on);\n      // Settings saved before `off` was kept: `on` is the whole list.\n      const off = Array.isArray(settings.off)\n        ? new Set<unknown>(settings.off)\n        : null;\n      for (const group of this.explorer.groups) {\n        for (const option of group.options) {\n          if (\n            on.has(option.id) ||\n            (off !== null && !off.has(option.id) && option.default)\n          ) {\n            this.enabled.add(option.id);\n          } else {\n            this.enabled.delete(option.id);\n          }\n        }\n      }\n    }\n  }\n\n  private knows(optionId: string): boolean {\n    return this.explorer.groups.some((group) =>\n      group.options.some((option) => option.id === optionId),\n    );\n  }\n\n  private priced(option: ScenarioOption): boolean {\n    return this.explorer.rateOf(option) !== null;\n  }\n\n  /** Each group's options the search may use: enabled and priced. */\n  searchable(): number[][] {\n    return this.explorer.groups.map((group) =>\n      group.options\n        .map((option, index) =>\n          this.enabled.has(option.id) && this.priced(option) ? index : -1,\n        )\n        .filter((index) => index >= 0),\n    );\n  }\n\n  size(): number {\n    return this.explorer.size(this.searchable());\n  }\n\n  /**\n   * A greedy first pass: switch off what does least for its cost, on the\n   * chart's measure, until the search fits `budget`.\n   */\n  fit(budget: number = START_PACKAGES): void {\n    if (this.widened || this.size() <= budget) {\n      return;\n    }\n    const metric = this.metric;\n    const sign = HIGHER_IS_BETTER[metric] ? 1 : -1;\n    const base = this.explorer.base[metric];\n    const worth = new Map<string, number>();\n    this.explorer.groups.forEach((group, g) => {\n      group.options.forEach((option, index) => {\n        const cost = this.explorer.costOf(option);\n        if (cost === null || !this.enabled.has(option.id)) {\n          return;\n        }\n        const solo = this.explorer.groups.map((_group, other) =>\n          other === g ? index : -1,\n        );\n        const gain = sign * (this.explorer.evaluate(solo)[metric] - base);\n        worth.set(option.id, gain / Math.max(cost, 100));\n      });\n    });\n    const order = [...worth].sort(([, left], [, right]) => left - right);\n    for (const [id] of order) {\n      if (this.size() <= budget) {\n        break;\n      }\n      this.enabled.delete(id);\n      this.trimmed.add(id);\n    }\n  }\n\n  /** Priced options out of the search only to keep it quick. */\n  leftOut(): ScenarioOption[] {\n    return this.explorer.groups.flatMap((group) =>\n      group.options.filter(\n        (option) =>\n          this.priced(option) &&\n          !this.enabled.has(option.id) &&\n          (!option.default || this.trimmed.has(option.id)),\n      ),\n    );\n  }\n\n  /** How many packages the search would score with them back. */\n  moreSize(): number {\n    const back = new Set(this.leftOut().map((option) => option.id));\n    return this.explorer.size(\n      this.explorer.groups.map((group) =>\n        group.options.flatMap((option, index) =>\n          this.priced(option) &&\n          (this.enabled.has(option.id) || back.has(option.id))\n            ? [index]\n            : [],\n        ),\n      ),\n    );\n  }\n\n  searchMore(): void {\n    for (const option of this.leftOut()) {\n      this.enabled.add(option.id);\n    }\n    this.trimmed.clear();\n    this.widened = true;\n  }\n\n  async search(\n    progress?: (done: number, total: number) => void,\n    cancelled?: () => boolean,\n  ): Promise<boolean> {\n    const found = await this.explorer.search(\n      this.searchable(),\n      progress,\n      cancelled,\n    );\n    if (!found) {\n      return false;\n    }\n    this.packages = found;\n    this.refront();\n    return true;\n  }\n\n  setMetric(metric: Metric): void {\n    this.metric = metric;\n    this.refront();\n  }\n\n  private refront(): void {\n    this.front = this.packages ? frontier(this.packages, this.metric) : [];\n  }\n\n  pick(group: number, option: number): void {\n    this.choice[group] = this.choice[group] === option ? -1 : option;\n  }\n\n  /**\n   * The package of what's annotated on the plan: in each group, the option of\n   * an annotated kind that rates best on its own. False if nothing matches.\n   */\n  pickKinds(kinds: ReadonlySet<string>): boolean {\n    let found = false;\n    this.choice = this.explorer.groups.map((group, g) => {\n      let best = -1;\n      let bestSap = -Infinity;\n      // Options switched off for the search only when nothing else fits.\n      const fits = group.options.filter((option) => kinds.has(option.kind));\n      const on = fits.some((option) => this.enabled.has(option.id));\n      group.options.forEach((option, index) => {\n        if (!kinds.has(option.kind) || (on && !this.enabled.has(option.id))) {\n          return;\n        }\n        const solo = this.explorer.groups.map((_group, other) =>\n          other === g ? index : -1,\n        );\n        const sap = this.explorer.evaluate(solo).sap;\n        if (sap > bestSap) {\n          best = index;\n          bestSap = sap;\n        }\n      });\n      found ||= best >= 0;\n      return best;\n    });\n    return found;\n  }\n\n  clear(): void {\n    this.choice = this.choice.map(() => -1);\n  }\n\n  showPackage(index: number): void {\n    if (!this.packages) {\n      return;\n    }\n    this.choice = this.explorer.choiceOf(this.packages, index);\n  }\n\n  toggleEnabled(optionId: string): void {\n    this.trimmed.delete(optionId);\n    if (this.enabled.has(optionId)) {\n      this.enabled.delete(optionId);\n    } else {\n      this.enabled.add(optionId);\n      this.widened = true;\n    }\n  }\n\n  /** A typed price in pounds; blank goes back to the price on file. */\n  setRate(optionId: string, text: string): void {\n    const trimmed = text.trim().replace(/^\u00A3/, \"\").replaceAll(\",\", \"\");\n    const option = this.option(optionId);\n    if (!option) {\n      return;\n    }\n    if (trimmed === \"\") {\n      this.rates.delete(optionId);\n      this.plain.setRate(optionId, option.cost.rate);\n      this.reaim();\n      return;\n    }\n    const value = Number(trimmed);\n    if (!Number.isFinite(value) || value < 0) {\n      return;\n    }\n    const pence = Math.round(value * 100);\n    this.rates.set(optionId, pence);\n    this.plain.setRate(optionId, pence);\n    this.reaim();\n    this.enabled.add(optionId);\n    this.trimmed.delete(optionId);\n    this.widened = true;\n  }\n\n  option(optionId: string): ScenarioOption | undefined {\n    for (const group of this.explorer.groups) {\n      const found = group.options.find((option) => option.id === optionId);\n      if (found) {\n        return found;\n      }\n    }\n    return undefined;\n  }\n\n  patches(): Patch[] {\n    return this.explorer.patches(this.choice);\n  }\n\n  outcome(): Outcome {\n    return this.explorer.evaluate(this.choice);\n  }\n\n  picks(): Pick[] {\n    return this.choice.flatMap((index, group) => {\n      const option = this.explorer.option(group, index);\n      const category = this.explorer.groups[group]?.category ?? \"other\";\n      return option\n        ? [{ id: option.id, label: option.label, color: colorOf(category) }]\n        : [];\n    });\n  }\n\n  groupsView(): GroupView[] {\n    return this.explorer.groups.map((group, g) => ({\n      id: group.id,\n      label: group.label,\n      color: colorOf(group.category),\n      note: group.note,\n      choice: this.choice[g] ?? -1,\n      options: group.options.map((option) => {\n        const cost = this.explorer.grossCostOf(option);\n        const rate = this.explorer.rateOf(option);\n        return {\n          id: option.id,\n          label: option.label,\n          cost: cost === null ? \"price?\" : pounds(cost),\n          priced: rate !== null,\n          enabled: this.enabled.has(option.id),\n          rate: rate === null ? \"\" : String(rate / 100),\n          unit: unitOf(option),\n          breakdown: this.explorer\n            .breakdownOf(option)\n            .map((line) => `${line.label}: ${pounds(line.pence)}`)\n            .join(\"\\n\"),\n        };\n      }),\n    }));\n  }\n\n  /** A choice from option ids; ids no longer offered are dropped. */\n  choiceOf(ids: readonly string[]): number[] {\n    const wanted = new Set(ids);\n    return this.explorer.groups.map((group) =>\n      group.options.findIndex((option) => wanted.has(option.id)),\n    );\n  }\n\n  ids(choice: readonly number[] = this.choice): string[] {\n    return this.explorer.picked(choice).map((option) => option.id);\n  }\n\n  showIds(ids: readonly string[]): void {\n    this.choice = this.choiceOf(ids);\n  }\n\n  outcomeView(\n    outcome: Outcome = this.outcome(),\n    choice: readonly number[] = this.choice,\n  ): OutcomeView {\n    const base = this.explorer.base;\n    return {\n      sap: String(sapScore(outcome.sap)),\n      band: band(outcome.sap),\n      bills: pounds(outcome.bills * 100),\n      carbon: `${(outcome.carbon / 1000).toFixed(1)} t`,\n      cost: outcome.gross === null ? \"price?\" : pounds(outcome.gross),\n      heatLoss: outcome.heatLoss.toFixed(0),\n      sapDelta: signed(sapScore(outcome.sap) - sapScore(base.sap)),\n      billsDelta: `${signed(Math.round(outcome.bills) - Math.round(base.bills)).replace(/^([+\u2212])/, \"$1\u00A3\")}`,\n      carbonDelta: signed((outcome.carbon - base.carbon) / 1000, 1),\n      peak: `${outcome.peak.toFixed(1)} kW`,\n      peakKw: outcome.peak,\n      sizing: this.sizing(outcome, choice),\n      fits: outcome.fits,\n      payback:\n        outcome.payback === null ? \"\u2014\" : `${Math.round(outcome.payback)} yrs`,\n      grants: grantLine(this.explorer.grantsIn(choice)),\n      grant: outcome.grant > 0 ? `\u2212${pounds(outcome.grant)}` : \"\",\n    };\n  }\n\n  private sizing(outcome: Outcome, choice: readonly number[]): string {\n    const needed = `${neededKw(outcome.peak).toFixed(1)} kW`;\n    const pump = this.explorer\n      .picked(choice)\n      .find((option) => option.capacity_kw !== null);\n    if (!pump?.capacity_kw) {\n      return `A heat pump needs ${needed} (heat load + 15%)`;\n    }\n    const verdict = outcome.fits ? \"covers\" : \"falls short of\";\n    return `${pump.capacity_kw} kW heat pump ${verdict} the ${needed} needed (heat load + 15%)`;\n  }\n}\n", "// A baseline's scenarios, scored now on its plan as it is, the way the Build\n// Pack's figures are (packageFigures), so Compare never shows a snapshot. Only\n// the totals the table shows are worked out (headlineFigures).\n\nimport {\n  fetchCalcContext,\n  fetchDesign,\n  fetchScenarioContext,\n  fetchSchedule,\n} from \"./api\";\nimport { scenarioFixtures } from \"./fixtures\";\nimport { designHeatLoad, peakModel } from \"./heatload\";\nimport { recordedCylinder, siteOf } from \"./heatpumpcost\";\nimport { headlineFigures } from \"./packagefigures\";\nimport type { Kept } from \"./scenariocompare\";\nimport { ScenarioView } from \"./scenarioview\";\nimport type { DesignPackage } from \"./scene\";\n\nconst FLOW_C = 45;\n\nexport interface Scored {\n  id: number;\n  name: string;\n  recommended: boolean;\n  /** Null when a scenario can't be scored; `error` says why. */\n  figures: Kept | null;\n  error: string;\n}\n\n/** A baseline as Compare's table lists it. */\nexport interface Baseline {\n  id: number;\n  design_url: string;\n  /** When its plan last changed: what its scores are kept against. */\n  updated?: string;\n}\n\n/** The baseline open in the editor: its plan and scenarios in memory. */\nexport interface OpenBaseline {\n  id: number;\n  view: ScenarioView;\n  scheduleUrl: string;\n  packages: readonly DesignPackage[];\n}\n\nlet open: () => OpenBaseline | null = () => null;\nconst kept = new Map<string, Promise<Scored[]>>();\n\n/** Where the baseline open is read from, so it's scored without a fetch. */\nexport function setOpenBaseline(source: () => OpenBaseline | null): void {\n  open = source;\n}\n\n/** Forget what's kept, as a test needs. */\nexport function forgetScores(): void {\n  kept.clear();\n}\n\nexport function reason(error: unknown): string {\n  return error instanceof Error && error.message\n    ? error.message\n    : \"It couldn't be worked out.\";\n}\n\n/**\n * Every scenario on a baseline, scored on its current plan: the one open from\n * the editor's memory, every time; another once per change to its plan.\n */\nexport function scoreScenarios(baseline: Baseline): Promise<Scored[]> {\n  const here = open();\n  if (here && here.id === baseline.id) {\n    return scoreEach(here.view, here.scheduleUrl, here.packages);\n  }\n  const key = `${baseline.design_url}@${baseline.updated ?? \"\"}`;\n  const found = kept.get(key);\n  if (found) {\n    return found;\n  }\n  const scoring = scoreFetched(baseline.design_url);\n  kept.set(key, scoring);\n  scoring.catch(() => kept.delete(key));\n  return scoring;\n}\n\n/** One scenario after another, each on its own targets and schedule. */\nasync function scoreEach(\n  view: ScenarioView,\n  scheduleUrl: string,\n  packages: readonly DesignPackage[],\n): Promise<Scored[]> {\n  const scored: Scored[] = [];\n  for (const [index, saved] of packages.entries()) {\n    let figures: Kept | null = null;\n    let error = \"\";\n    try {\n      figures = (await headlineFigures(\n        { view, scheduleUrl },\n        {\n          id: saved.id,\n          options: saved.options,\n          phases: saved.phases,\n          letter: String.fromCharCode(65 + (index % 26)),\n          targets: saved.targets,\n          fixtures: saved.fixtures,\n        },\n      )) as unknown as Kept;\n    } catch (failed: unknown) {\n      error = reason(failed);\n    }\n    scored.push({\n      id: saved.id,\n      name: saved.name,\n      recommended: saved.recommended,\n      figures,\n      error,\n    });\n  }\n  return scored;\n}\n\nasync function scoreFetched(designUrl: string): Promise<Scored[]> {\n  const design = await fetchDesign(designUrl);\n  if (design.packages.length === 0) {\n    return [];\n  }\n  const [calc, context, schedule] = await Promise.all([\n    fetchCalcContext(design.calc_context_url),\n    fetchScenarioContext(design.scenario_context_url),\n    fetchSchedule(design.schedule_url),\n  ]);\n  const { floors, fabric_types: types } = design;\n  let roomLoss: ReturnType<typeof designHeatLoad> | null = null;\n  if (design.heat_load) {\n    try {\n      roomLoss = designHeatLoad(floors, types, calc.elements, design.heat_load);\n    } catch {\n      roomLoss = null;\n    }\n  }\n  const view = new ScenarioView(\n    calc,\n    context,\n    floors.map((floor) => floor.scene),\n    floors.map((floor) => floor.ceiling_height_mm),\n    types,\n    null,\n    roomLoss ? peakModel(roomLoss, types, calc.elements) : null,\n    floors.map((floor) => floor.id),\n  );\n  view.setKindCosts(schedule.rows);\n  const flowC = design.heat_load?.settings.flow_c ?? FLOW_C;\n  view.setSite((scenario) =>\n    siteOf(\n      scenarioFixtures(floors, null),\n      scenarioFixtures(floors, scenario),\n      recordedCylinder(calc.worksheet),\n      floors.flatMap((floor) => floor.scene.emitters),\n      roomLoss?.rooms ?? [],\n      flowC,\n    ),\n  );\n  return scoreEach(view, design.schedule_url, design.packages);\n}\n", "// The editor header: what's being edited (a baseline, or a scenario on one),\n// and a menu of every baseline with its scenarios. Moving between them is a\n// page load, so the editor only ever holds one baseline and one scenario.\n\nimport { AlpineComponent } from \"alpinejs\";\nimport {\n  copyScene,\n  createPackage,\n  duplicatePackage,\n  deleteScene,\n  renameScene,\n} from \"./api\";\n\nexport interface ScenarioLink {\n  id: number;\n  name: string;\n  recommended: boolean;\n  current: boolean;\n  url: string;\n}\n\nexport interface SceneLink {\n  id: number;\n  name: string;\n  url: string;\n  current: boolean;\n  scenarios: ScenarioLink[];\n}\n\n/** A scenario's name and star, as the editor sends them (`scenario-renamed`). */\nexport interface Named {\n  id: number;\n  name: string;\n  recommended: boolean;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  /** The baselines and scenarios menu. */\n  menu: boolean;\n  scenes: SceneLink[];\n  /** Which form is open under the strip. */\n  open: \"\" | \"copy\" | \"rename\";\n  name: string;\n  busy: boolean;\n  error: string;\n  start(form: \"copy\" | \"rename\"): void;\n  close(): void;\n  submit(): void;\n  remove(): void;\n  newScenario(): void;\n  duplicateScenario(): void;\n  leave(event: Event, url: string): void;\n  removed(gone: { id: number }): void;\n  renamed(detail: { scenarios: Named[] }): void;\n}\n\n/** Wait for the open editor to write any edit it is holding back. */\nexport function flushEditor(): Promise<unknown> {\n  const waits: Promise<unknown>[] = [];\n  window.dispatchEvent(\n    new CustomEvent(\"flush-scenario\", { detail: { waits } }),\n  );\n  return Promise.allSettled(waits);\n}\n\n/** The editor at `scene`, or at the house as it is; any `next` stays. */\nexport function sceneUrl(href: string, scene: number | null): string {\n  const url = new URL(href);\n  url.searchParams.delete(\"scenario\");\n  if (scene === null) {\n    url.searchParams.delete(\"scene\");\n  } else {\n    url.searchParams.set(\"scene\", String(scene));\n  }\n  return url.toString();\n}\n\n/** The editor at the baseline `href` opens, with `scenario` open. */\nexport function scenarioUrl(\n  href: string,\n  scenario: number,\n  base = typeof window === \"undefined\" ? undefined : window.location.href,\n): string {\n  const url = new URL(href, base);\n  url.searchParams.set(\"scenario\", String(scenario));\n  return url.toString();\n}\n\n/**\n * The first letter no scenario has: not as its letter, and not in a name\n * (\"Scenario C\"), even one a scenario was renamed to.\n */\nexport function nextLetter(\n  names: readonly string[],\n  letters: readonly string[] = [],\n): string {\n  const taken = new Set(names);\n  const used = new Set(letters);\n  for (let index = 0; index < 26; index += 1) {\n    const letter = String.fromCharCode(65 + index);\n    if (!used.has(letter) && !taken.has(`Scenario ${letter}`)) {\n      return letter;\n    }\n  }\n  return String(names.length + 1);\n}\n\n/** \"Scenario C\": named for the first letter no scenario has. */\nexport function nextName(names: readonly string[]): string {\n  return `Scenario ${nextLetter(names)}`;\n}\n\nexport default (): AlpineComponent<State> => ({\n  menu: false,\n  scenes: [],\n  open: \"\",\n  name: \"\",\n  busy: false,\n  error: \"\",\n\n  init() {\n    this.scenes = JSON.parse(\n      this.$root.dataset[\"scenes\"] ?? \"[]\",\n    ) as SceneLink[];\n  },\n\n  // A link to another scenario, once the open one has saved.\n  leave(event, url) {\n    event.preventDefault();\n    flushEditor().then(() => window.location.assign(url));\n  },\n\n  start(form) {\n    this.menu = false;\n    this.open = form;\n    this.error = \"\";\n    this.name = form === \"rename\" ? (this.$root.dataset[\"name\"] ?? \"\") : \"\";\n    this.$nextTick(() => this.$refs[\"name\"]?.focus());\n  },\n\n  close() {\n    this.open = \"\";\n  },\n\n  submit() {\n    const name = this.name.trim();\n    if (!name || this.busy) {\n      return;\n    }\n    this.busy = true;\n    this.error = \"\";\n    const data = this.$root.dataset;\n    const done =\n      this.open === \"copy\"\n        ? copyScene(data[\"copyUrl\"] ?? \"\", name).then((scene) => {\n            window.location.assign(sceneUrl(window.location.href, scene.id));\n          })\n        : renameScene(data[\"designUrl\"] ?? \"\", name).then(() => {\n            window.location.reload();\n          });\n    done.catch((error: unknown) => {\n      this.busy = false;\n      this.error = error instanceof Error ? error.message : String(error);\n    });\n  },\n\n  remove() {\n    const name = this.$root.dataset[\"name\"] ?? \"this baseline\";\n    if (this.busy || !window.confirm(`Delete ${name}, and its scenarios?`)) {\n      return;\n    }\n    this.busy = true;\n    deleteScene(this.$root.dataset[\"designUrl\"] ?? \"\")\n      .then(() => {\n        window.location.assign(sceneUrl(window.location.href, null));\n      })\n      .catch((error: unknown) => {\n        this.busy = false;\n        this.error = error instanceof Error ? error.message : String(error);\n      });\n  },\n\n  // An empty scenario on this baseline; its figures come with its first pick.\n  newScenario() {\n    const data = this.$root.dataset;\n    const design = Number(data[\"scene\"]);\n    const scene = this.scenes.find((row) => row.id === design);\n    if (this.busy || !scene) {\n      return;\n    }\n    this.busy = true;\n    this.error = \"\";\n    flushEditor()\n      .then(() =>\n        createPackage(data[\"packagesUrl\"] ?? \"\", {\n          design,\n          name: nextName(scene.scenarios.map((row) => row.name)),\n          options: [],\n          phases: [],\n          figures: {},\n          recommended: false,\n        }),\n      )\n      .then((saved) => {\n        window.location.assign(scenarioUrl(scene.url, saved.id));\n      })\n      .catch((error: unknown) => {\n        this.busy = false;\n        this.error = error instanceof Error ? error.message : String(error);\n      });\n  },\n\n  // The open scenario, copied: swap a measure to try the alternative.\n  duplicateScenario() {\n    const data = this.$root.dataset;\n    const design = Number(data[\"scene\"]);\n    const scene = this.scenes.find((row) => row.id === design);\n    if (this.busy || !scene || !data[\"scenario\"]) {\n      return;\n    }\n    this.busy = true;\n    this.error = \"\";\n    flushEditor()\n      .then(() =>\n        duplicatePackage(`${data[\"packagesUrl\"] ?? \"\"}${data[\"scenario\"]}/`),\n      )\n      .then((saved) => {\n        window.location.assign(scenarioUrl(scene.url, saved.id));\n      })\n      .catch((error: unknown) => {\n        this.busy = false;\n        this.error = error instanceof Error ? error.message : String(error);\n      });\n  },\n\n  removed(gone) {\n    for (const scene of this.scenes) {\n      scene.scenarios = scene.scenarios.filter((row) => row.id !== gone.id);\n    }\n  },\n\n  renamed(detail) {\n    const byId = new Map(detail.scenarios.map((row) => [row.id, row]));\n    for (const scene of this.scenes) {\n      for (const row of scene.scenarios) {\n        const now = byId.get(row.id);\n        if (now) {\n          row.name = now.name;\n          row.recommended = now.recommended;\n        }\n      }\n    }\n  },\n});\n", "// Which elements a measure covers in a scenario: the groups staff choose from,\n// what a choice reads as, and clicking one wall, window or room on or off.\n// Ids are `<floor pk>:<entity id>`; a missing key covers all.\n\nimport { CATEGORY_COLORS, type MeasureCategory } from \"./catalog\";\nimport { outwardDeg } from \"./orientation\";\nimport { resolve as resolveScene } from \"./resolve\";\nimport type { FabricType, Scene } from \"./scene\";\nimport { type Targets } from \"./scenarios\";\nimport type { ScenarioView } from \"./scenarioview\";\n\nexport type EntityKind = \"wall\" | \"opening\" | \"room\";\n\n/** What the plan knows about one entity an option can cover. */\nexport interface Entity {\n  id: string;\n  kind: EntityKind;\n  floor: number;\n  floorName: string;\n  /** N, E, S or W: the way a wall, or a window's wall, faces. */\n  elevation: string | null;\n  /** Qualified ids of the rooms it belongs to. */\n  rooms: string[];\n}\n\nexport interface TargetFloor {\n  id: number;\n  name: string;\n  scene: Scene;\n}\n\nexport interface TargetGroup {\n  key: string;\n  label: string;\n  ids: string[];\n}\n\nconst ELEVATIONS = [\"N\", \"E\", \"S\", \"W\"] as const;\nconst ELEVATION_NAMES: Record<string, string> = {\n  N: \"North\",\n  E: \"East\",\n  S: \"South\",\n  W: \"West\",\n};\n\n/** The cardinal side `outward` (degrees clockwise from up) faces, north at `northDeg`. */\nexport function elevationOf(outward: number, northDeg: number): string {\n  const turned = (((outward - northDeg) % 360) + 360) % 360;\n  return ELEVATIONS[Math.floor(turned / 90 + 0.5) % 4] as string;\n}\n\n/** Every wall, opening and room, by qualified id. */\nexport function describe(\n  floors: readonly TargetFloor[],\n  types: readonly FabricType[],\n  northDeg: number | null,\n): Map<string, Entity> {\n  const entities = new Map<string, Entity>();\n  for (const floor of floors) {\n    const q = (id: string) => `${floor.id}:${id}`;\n    const view = resolveScene(floor.scene, types);\n    const polygons = new Map(\n      view.rooms.filter((room) => room.heated).map((r) => [r.id, r.polygon]),\n    );\n    const facing = new Map<string, string | null>();\n    for (const wall of view.walls) {\n      const outward =\n        northDeg === null || wall.kind !== \"EXTERNAL\"\n          ? null\n          : outwardDeg(\n              wall.a,\n              wall.b,\n              wall.rooms.flatMap((room) => {\n                const polygon = polygons.get(room);\n                return polygon ? [polygon] : [];\n              }),\n            );\n      const elevation =\n        outward === null || northDeg === null\n          ? null\n          : elevationOf(outward, northDeg);\n      facing.set(wall.id, elevation);\n      entities.set(q(wall.id), {\n        id: q(wall.id),\n        kind: \"wall\",\n        floor: floor.id,\n        floorName: floor.name,\n        elevation,\n        rooms: wall.rooms.map(q),\n      });\n    }\n    for (const opening of floor.scene.openings) {\n      const wall = view.wall(opening.wall);\n      entities.set(q(opening.id), {\n        id: q(opening.id),\n        kind: \"opening\",\n        floor: floor.id,\n        floorName: floor.name,\n        elevation: facing.get(opening.wall) ?? null,\n        rooms: (wall?.rooms ?? []).map(q),\n      });\n    }\n    for (const room of floor.scene.rooms) {\n      entities.set(q(room.id), {\n        id: q(room.id),\n        kind: \"room\",\n        floor: floor.id,\n        floorName: floor.name,\n        elevation: null,\n        rooms: [q(room.id)],\n      });\n    }\n  }\n  return entities;\n}\n\n/** The groups to choose from for `candidates`; \"All\" is always first. */\nexport function groupsFor(\n  candidates: readonly string[],\n  entities: ReadonlyMap<string, Entity>,\n  roomNames: ReadonlyMap<string, string>,\n): TargetGroup[] {\n  const groups: TargetGroup[] = [\n    { key: \"all\", label: \"All\", ids: [...candidates] },\n  ];\n  const by = (pick: (entity: Entity) => string[]): Map<string, string[]> => {\n    const found = new Map<string, string[]>();\n    for (const id of candidates) {\n      const entity = entities.get(id);\n      for (const key of entity ? pick(entity) : []) {\n        found.set(key, [...(found.get(key) ?? []), id]);\n      }\n    }\n    return found;\n  };\n  const add = (\n    prefix: string,\n    found: Map<string, string[]>,\n    label: (key: string) => string,\n    order: readonly string[] = [...found.keys()],\n  ) => {\n    for (const key of order) {\n      const ids = found.get(key);\n      if (ids) {\n        groups.push({\n          key: `${prefix}:${key}`,\n          label: `${label(key)} (${ids.length})`,\n          ids,\n        });\n      }\n    }\n  };\n  const elevations = by((e) => (e.elevation ? [e.elevation] : []));\n  add(\n    \"elevation\",\n    elevations,\n    (key) => ELEVATION_NAMES[key] ?? key,\n    ELEVATIONS,\n  );\n  const floors = by((e) => [e.floorName]);\n  if (floors.size > 1) {\n    add(\"floor\", floors, (key) => key);\n  }\n  const rooms = by((e) => e.rooms);\n  add(\"room\", rooms, (key) => roomNames.get(key) ?? \"Room\");\n  return groups;\n}\n\nconst NOUNS: Record<string, [string, string]> = {\n  windows: [\"window\", \"windows\"],\n  doors: [\"door\", \"doors\"],\n  roof: [\"room\", \"rooms\"],\n  \"ground-floor\": [\"room\", \"rooms\"],\n};\n\n/** What the option covers, e.g. \"All walls (14)\" or \"6 of 12 windows\". */\nexport function coverageText(\n  basis: string,\n  candidates: readonly string[],\n  covered: readonly string[] | undefined,\n): string {\n  const [one, many] = NOUNS[basis] ?? [\"wall\", \"walls\"];\n  const total = candidates.length;\n  const has = new Set(covered);\n  const count = covered ? candidates.filter((id) => has.has(id)).length : total;\n  const noun = total === 1 ? one : many;\n  if (count === total) {\n    return `All ${many} (${total})`;\n  }\n  return count === 0 ? `No ${many}` : `${count} of ${total} ${noun}`;\n}\n\n/** The targets with `id` switched on or off for `option` (all, if unset). */\nexport function toggled(\n  targets: Targets,\n  option: string,\n  candidates: readonly string[],\n  id: string,\n): Record<string, string[]> {\n  const current = targets[option] ?? candidates;\n  const next = current.includes(id)\n    ? current.filter((other) => other !== id)\n    : [...current, id];\n  return setTargets(targets, option, candidates, next);\n}\n\n/** The targets with `ids` as the option's cover; all of them is no entry. */\nexport function setTargets(\n  targets: Targets,\n  option: string,\n  candidates: readonly string[],\n  ids: readonly string[],\n): Record<string, string[]> {\n  const rest = Object.fromEntries(\n    Object.entries(targets)\n      .filter(([key]) => key !== option)\n      .map(([key, list]) => [key, [...list]]),\n  );\n  const every = candidates.every((id) => ids.includes(id));\n  return every ? rest : { ...rest, [option]: [...ids] };\n}\n\n/** One chosen option as the Measures section shows it. */\nexport interface TargetRow {\n  id: string;\n  label: string;\n  color: string;\n  /** What it covers: \"All walls (14)\", \"6 of 12 windows\" or \"Whole house\". */\n  text: string;\n  /** Not every element: shown as such. */\n  partial: boolean;\n  /** Empty for an option that applies to the whole house. */\n  groups: { key: string; label: string }[];\n}\n\n/** The rows for the options picked, in group order. */\nexport function targetRows(\n  view: ScenarioView,\n  targets: Targets,\n  entities: ReadonlyMap<string, Entity>,\n  roomNames: ReadonlyMap<string, string>,\n): TargetRow[] {\n  const { explorer } = view;\n  return explorer.picked(view.choice).flatMap((option) => {\n    const candidates = explorer.candidatesOf(option);\n    const group = explorer.groups.find((g) => g.options.includes(option));\n    const color =\n      CATEGORY_COLORS[(group?.category ?? \"other\") as MeasureCategory] ??\n      CATEGORY_COLORS.other;\n    if (candidates.length === 0) {\n      return [\n        {\n          id: option.id,\n          label: option.label,\n          color,\n          text: \"Whole house\",\n          partial: false,\n          groups: [],\n        },\n      ];\n    }\n    const covered = targets[option.id];\n    return [\n      {\n        id: option.id,\n        label: option.label,\n        color,\n        text: coverageText(option.cost.basis, candidates, covered),\n        partial: covered !== undefined,\n        groups: groupsFor(candidates, entities, roomNames).map(\n          ({ key, label }) => ({ key, label }),\n        ),\n      },\n    ];\n  });\n}\n", "import { Annotation } from \"./scene\";\n\n// Undo/redo restores a floor snapshot locally, then reconciles the server by\n// diffing the annotation arrays. Soft delete keeps ids stable, so every\n// difference is expressible as a PATCH \u2014 no recreates, no id remapping.\n\nexport interface AnnotationPatch {\n  id: number;\n  url: string;\n  body: Record<string, unknown>;\n}\n\nconst FIELDS = [\"label\", \"notes\", \"status\"] as const;\n\nexport function annotationDiff(\n  before: Annotation[],\n  after: Annotation[],\n): AnnotationPatch[] {\n  const patches: AnnotationPatch[] = [];\n  const beforeById = new Map(before.map((row) => [row.id, row]));\n  const afterById = new Map(after.map((row) => [row.id, row]));\n\n  for (const row of after) {\n    if (row.id < 0) {\n      continue; // Unacked creates never enter history; skip defensively.\n    }\n    const previous = beforeById.get(row.id);\n    if (!previous) {\n      // Present now, absent before: resurrect the soft-deleted row with the\n      // snapshot's full state.\n      patches.push({\n        id: row.id,\n        url: row.url,\n        body: {\n          deleted: false,\n          geometry: row.geometry,\n          label: row.label,\n          notes: row.notes,\n          status: row.status,\n        },\n      });\n      continue;\n    }\n    const body: Record<string, unknown> = {};\n    if (JSON.stringify(previous.geometry) !== JSON.stringify(row.geometry)) {\n      body[\"geometry\"] = row.geometry;\n    }\n    for (const field of FIELDS) {\n      if (previous[field] !== row[field]) {\n        body[field] = row[field];\n      }\n    }\n    if (Object.keys(body).length > 0) {\n      patches.push({ id: row.id, url: row.url, body });\n    }\n  }\n\n  for (const row of before) {\n    if (row.id >= 0 && !afterById.has(row.id)) {\n      patches.push({ id: row.id, url: row.url, body: { deleted: true } });\n    }\n  }\n\n  return patches;\n}\n", "// Measures are rows of free geometry, laid where a wall, room or opening was\n// when they were dropped. Editing the plan under them carries them along.\nimport { atOpening, overRoom } from \"./placement\";\nimport { Annotation, AnnotationGeometry, Point, Scene } from \"./scene\";\n\nconst key = (point: Point): string => `${point[0]},${point[1]}`;\n\n/** `annotations` as the edit from `before` to `after` leaves them: a measure\n * over a room or at an opening takes its new shape or place, and any other\n * corner sitting on a plan corner goes where that corner went. Unchanged\n * rows, and rows still being created, are returned as they are. */\nexport function followed(\n  before: Scene,\n  after: Scene,\n  annotations: readonly Annotation[],\n): Annotation[] {\n  const now = new Map(after.vertices.map((vertex) => [vertex.id, vertex.at]));\n  const moves = new Map<string, Point>();\n  for (const vertex of before.vertices) {\n    const to = now.get(vertex.id);\n    if (to && key(to) !== key(vertex.at) && !moves.has(key(vertex.at))) {\n      moves.set(key(vertex.at), to);\n    }\n  }\n  const rooms = new Map(\n    before.rooms.map((room) => [\n      JSON.stringify(overRoom(before, room.id)),\n      room.id,\n    ]),\n  );\n  const openings = new Map(\n    before.openings.map((opening) => [\n      JSON.stringify(atOpening(before, opening.id)),\n      opening.id,\n    ]),\n  );\n  const moved = (point: Point): Point => moves.get(key(point)) ?? point;\n\n  const follow = (geometry: AnnotationGeometry): AnnotationGeometry => {\n    const was = JSON.stringify(geometry);\n    if (geometry.type === \"area\") {\n      const room = rooms.get(was);\n      const shape = room === undefined ? null : overRoom(after, room);\n      return shape ?? { ...geometry, polygon: geometry.polygon.map(moved) };\n    }\n    if (geometry.type === \"point\") {\n      const opening = openings.get(was);\n      const place = opening === undefined ? null : atOpening(after, opening);\n      return place ?? { ...geometry, at: moved(geometry.at) };\n    }\n    return { ...geometry, points: geometry.points.map(moved) };\n  };\n\n  return annotations.map((annotation) => {\n    if (annotation.id < 0) {\n      return annotation;\n    }\n    const geometry = follow(annotation.geometry);\n    return JSON.stringify(geometry) === JSON.stringify(annotation.geometry)\n      ? annotation\n      : { ...annotation, geometry };\n  });\n}\n", "import { Annotation, Scene, Trace } from \"./scene\";\n\nconst CAP = 100;\n\n/** What undo restores: the drawn geometry and the floor's live annotation\n * and trace rows, captured together so mixed edit sequences reverse\n * consistently. */\nexport interface FloorSnapshot {\n  scene: Scene;\n  annotations: Annotation[];\n  traces: Trace[];\n  /** This entry and the state after it differ by a whole-floor move, whose\n   * trace placements are saved with the scene rather than one by one. */\n  moved?: boolean;\n}\n\n/** `current`, marked as a move when the entry it trades places with is. */\nfunction counterpart(\n  current: FloorSnapshot,\n  restored: FloorSnapshot,\n): FloorSnapshot {\n  const { moved: _, ...rest } = current;\n  return restored.moved ? { ...rest, moved: true } : rest;\n}\n\ninterface Stacks {\n  undo: FloorSnapshot[];\n  redo: FloorSnapshot[];\n  /** When each undo entry was pushed, epoch ms, beside `undo`. */\n  undoAt: number[];\n  redoAt: number[];\n}\n\n/** Per-floor snapshot stacks. Snapshots are small (tens of KB), so\n * whole-state clones beat inverse-operation bookkeeping on both simplicity\n * and safety. */\nexport class History {\n  private readonly floors = new Map<number, Stacks>();\n\n  constructor(private readonly now: () => number = Date.now) {}\n\n  private stacks(floorId: number): Stacks {\n    let stacks = this.floors.get(floorId);\n    if (!stacks) {\n      stacks = { undo: [], redo: [], undoAt: [], redoAt: [] };\n      this.floors.set(floorId, stacks);\n    }\n    return stacks;\n  }\n\n  /** Record the state *before* a mutation. Clears the redo stack. */\n  push(floorId: number, snapshot: FloorSnapshot): void {\n    const stacks = this.stacks(floorId);\n    stacks.undo.push(structuredClone(snapshot));\n    stacks.undoAt.push(this.now());\n    if (stacks.undo.length > CAP) {\n      stacks.undo.shift();\n      stacks.undoAt.shift();\n    }\n    stacks.redo = [];\n    stacks.redoAt = [];\n  }\n\n  /** The edits on this floor, oldest first, each as the state before it and\n   * the state after (the next entry's, or `current` for the last). */\n  steps(\n    floorId: number,\n    current: FloorSnapshot,\n  ): { at: number; before: FloorSnapshot; after: FloorSnapshot }[] {\n    const { undo, undoAt } = this.stacks(floorId);\n    return undo.map((before, index) => ({\n      at: undoAt[index] ?? 0,\n      before,\n      after: undo[index + 1] ?? current,\n    }));\n  }\n\n  /** Changes whenever this floor's undo stack gains, loses or replaces its\n   * last entry: what the change log's lines depend on. */\n  signature(floorId: number): string {\n    const { undo, undoAt } = this.stacks(floorId);\n    return `${floorId}:${undo.length}:${undoAt[undoAt.length - 1] ?? 0}`;\n  }\n\n  /** The state before edit `index` (as `steps` numbers them), for reverting\n   * to it. The caller pushes the current state first, so the revert undoes. */\n  before(floorId: number, index: number): FloorSnapshot | null {\n    const entry = this.stacks(floorId).undo[index];\n    return entry ? structuredClone(entry) : null;\n  }\n\n  undo(floorId: number, current: FloorSnapshot): FloorSnapshot | null {\n    const stacks = this.stacks(floorId);\n    const previous = stacks.undo.pop();\n    const at = stacks.undoAt.pop() ?? this.now();\n    if (!previous) {\n      return null;\n    }\n    stacks.redoAt.push(at);\n    stacks.redo.push(structuredClone(counterpart(current, previous)));\n    return previous;\n  }\n\n  redo(floorId: number, current: FloorSnapshot): FloorSnapshot | null {\n    const stacks = this.stacks(floorId);\n    const next = stacks.redo.pop();\n    const at = stacks.redoAt.pop() ?? this.now();\n    if (!next) {\n      return null;\n    }\n    stacks.undoAt.push(at);\n    stacks.undo.push(structuredClone(counterpart(current, next)));\n    return next;\n  }\n\n  canUndo(floorId: number): boolean {\n    return this.stacks(floorId).undo.length > 0;\n  }\n\n  canRedo(floorId: number): boolean {\n    return this.stacks(floorId).redo.length > 0;\n  }\n}\n", "// More than one thing selected: a set of walls, windows and rooms across\n// floors, as shift-click or a measure pill builds it. Pure; the core holds it.\n\nimport type { Scene } from \"./scene\";\n\nexport type MultiType = \"wall\" | \"opening\" | \"room\";\n\n/** One selected element; its id is the scene's, so it needs its floor. */\nexport interface Item {\n  floor: number;\n  type: MultiType;\n  id: string;\n}\n\n/** What the set needs of a floor. */\nexport interface MultiFloor {\n  id: number;\n  name: string;\n  scene: Scene;\n}\n\nexport function isMultiType(type: string): type is MultiType {\n  return type === \"wall\" || type === \"opening\" || type === \"room\";\n}\n\n/** `<floor pk>:<id>`, the form measures' targets use. */\nexport function keyOf(item: Item): string {\n  return `${item.floor}:${item.id}`;\n}\n\nconst same = (a: Item, b: Item) =>\n  a.floor === b.floor && a.type === b.type && a.id === b.id;\n\n/** The items with `item` on if it was off, off if it was on. */\nexport function toggleItem(items: readonly Item[], item: Item): Item[] {\n  return items.some((each) => same(each, item))\n    ? items.filter((each) => !same(each, item))\n    : [...items, item];\n}\n\n/** The same elements, whatever the order. */\nexport function sameItems(a: readonly Item[], b: readonly Item[]): boolean {\n  return a.length === b.length && a.every((x) => b.some((y) => same(x, y)));\n}\n\n/** The elements named by `<floor pk>:<id>` targets that the floors still have. */\nexport function itemsFromTargets(\n  targets: readonly string[],\n  floors: readonly MultiFloor[],\n): Item[] {\n  const items: Item[] = [];\n  for (const target of targets) {\n    const colon = target.indexOf(\":\");\n    if (colon < 0) {\n      continue;\n    }\n    const floor = floors.find(\n      (each) => String(each.id) === target.slice(0, colon),\n    );\n    const id = target.slice(colon + 1);\n    if (!floor) {\n      continue;\n    }\n    const { scene } = floor;\n    const type: MultiType | null = scene.walls.some((w) => w.id === id)\n      ? \"wall\"\n      : scene.openings.some((o) => o.id === id)\n        ? \"opening\"\n        : scene.rooms.some((r) => r.id === id)\n          ? \"room\"\n          : null;\n    if (type) {\n      items.push({ floor: floor.id, type, id });\n    }\n  }\n  return items;\n}\n\n/** What to draw on one floor. */\nexport function forFloor(\n  items: readonly Item[],\n  floorId: number | null,\n): { type: MultiType; id: string }[] {\n  return items\n    .filter((item) => item.floor === floorId)\n    .map(({ type, id }) => ({ type, id }));\n}\n\n/** How many are selected on each floor but the one in view. */\nexport function elsewhere(\n  items: readonly Item[],\n  activeId: number | null,\n): Record<number, number> {\n  const counts: Record<number, number> = {};\n  for (const item of items) {\n    if (item.floor !== activeId) {\n      counts[item.floor] = (counts[item.floor] ?? 0) + 1;\n    }\n  }\n  return counts;\n}\n\n/** A floor's name, with how many are selected on it when it isn't in view. */\nexport function floorLabel(name: string, count: number): string {\n  return count > 0 ? `${name} (${count} selected)` : name;\n}\n\n/** The areas, in m\u00B2, by `<floor pk>:<id>`; what has none is counted only. */\nexport type Areas = ReadonlyMap<string, number>;\n\nfunction formatArea(area: number): string {\n  return area >= 10 ? String(Math.round(area)) : area.toFixed(1);\n}\n\n/** \"6 walls \u00B7 74 m\u00B2, 2 windows \u00B7 3.1 m\u00B2\": counts and areas by kind. */\nexport function summarise(\n  items: readonly Item[],\n  floors: readonly MultiFloor[],\n  areas: Areas,\n): string {\n  const groups = new Map<string, { noun: [string, string]; items: Item[] }>();\n  const add = (key: string, noun: [string, string], item: Item) => {\n    const group = groups.get(key);\n    if (group) {\n      group.items.push(item);\n    } else {\n      groups.set(key, { noun, items: [item] });\n    }\n  };\n  for (const kind of [\"wall\", \"opening\", \"room\"] as const) {\n    for (const item of items.filter((each) => each.type === kind)) {\n      if (kind === \"wall\") {\n        add(\"wall\", [\"wall\", \"walls\"], item);\n      } else if (kind === \"room\") {\n        add(\"room\", [\"room\", \"rooms\"], item);\n      } else {\n        const opening = floors\n          .find((f) => f.id === item.floor)\n          ?.scene.openings.find((o) => o.id === item.id);\n        if (opening?.type === \"door\") {\n          add(\"door\", [\"door\", \"doors\"], item);\n        } else {\n          add(\"window\", [\"window\", \"windows\"], item);\n        }\n      }\n    }\n  }\n  return [...groups.entries()]\n    .map(([key, { noun, items: found }]) => {\n      const label = `${found.length} ${noun[found.length === 1 ? 0 : 1]}`;\n      const known = found.filter((item) => areas.has(keyOf(item)));\n      if (known.length === 0 || key === \"door\") {\n        return label;\n      }\n      const area = known.reduce(\n        (sum, item) => sum + (areas.get(keyOf(item)) ?? 0),\n        0,\n      );\n      return `${label} \u00B7 ${formatArea(area)} m\u00B2`;\n    })\n    .join(\", \");\n}\n\n/** Delete order: what hangs off a wall goes before it, rooms last. */\nexport function deleteOrder(items: readonly Item[]): Item[] {\n  const rank: Record<MultiType, number> = { opening: 0, wall: 1, room: 2 };\n  return [...items].sort((a, b) => rank[a.type] - rank[b.type]);\n}\n\n/** Delete acts on the set only when all of it is on the floor in view. */\nexport function deletableOn(\n  items: readonly Item[],\n  floorId: number | null,\n): boolean {\n  return items.length > 0 && items.every((item) => item.floor === floorId);\n}\n", "import { AnnotationPatch, annotationDiff } from \"./annotationsync\";\nimport { followed } from \"./follow\";\nimport { SceneSaveResult } from \"./api\";\nimport type { Step } from \"./changelog\";\nimport { FloorSnapshot, History } from \"./history\";\nimport { normalizeEmitters } from \"./emitters\";\nimport { normalizeFixtures } from \"./fixtures\";\nimport { normalizeFeatures } from \"./features\";\nimport { normalizeOpenings } from \"./openings\";\nimport {\n  type Rigid,\n  followedBy,\n  movedAnnotations,\n  movedScene,\n  movedTrace,\n} from \"./rigid\";\nimport {\n  deleteRoom,\n  normalizeScene,\n  removeWall,\n  removeWallSet,\n  untidyWalls,\n} from \"./topology\";\nimport {\n  type Item,\n  deletableOn,\n  sameItems,\n  deleteOrder,\n  isMultiType,\n  keyOf,\n  toggleItem,\n} from \"./multiselect\";\nimport { Annotation, Design, Floor, Scene, Trace } from \"./scene\";\nimport { TracePatch, traceDiff } from \"./trace\";\n\n/** Where a trace or annotation sits: what a whole-floor move changes. */\nconst PLACEMENT = [\"offset_x_mm\", \"offset_y_mm\", \"rotation_deg\", \"geometry\"];\n\n/** The patches without where things sit, which goes with the scene. */\nfunction unplaced<T extends { body: Record<string, unknown> }>(\n  patches: T[],\n): T[] {\n  return patches\n    .map((patch) => ({\n      ...patch,\n      body: Object.fromEntries(\n        Object.entries(patch.body).filter(\n          ([field]) => !PLACEMENT.includes(field),\n        ),\n      ),\n    }))\n    .filter((patch) => Object.keys(patch.body).length > 0);\n}\n\nexport type Selection = {\n  type: \"wall\" | \"opening\" | \"room\" | \"annotation\" | \"emitter\";\n  id: string;\n} | null;\n\nexport type SaveState = \"saved\" | \"dirty\" | \"saving\" | \"error\" | \"conflict\";\n\nexport interface UiState {\n  saveState: SaveState;\n  canUndo: boolean;\n  canRedo: boolean;\n}\n\nexport interface CoreDelegate {\n  /** Redraw the floor (scene changed, floor switched or selection changed). */\n  render(floor: Floor, selection: Selection): void;\n  /** Reflect save/undo state into the reactive UI. */\n  ui(state: UiState): void;\n  /** Persist a floor's scene; the core handles the outcome. */\n  save(floor: Floor, moved: boolean): Promise<SceneSaveResult>;\n  /** Persist annotation changes produced by undo/redo, or by an edit\n   * carrying measures along (diff PATCHes). */\n  persistAnnotations(patches: AnnotationPatch[]): void;\n  /** Persist trace changes produced by undo/redo. */\n  persistTraces(patches: TracePatch[]): void;\n  /** An edit tidied this many walls it didn't touch, on a plan drawn before\n   * walls joined up. */\n  tidied?(walls: number): void;\n  /** The set or its hover preview changed and nothing else did: redraw just\n   * that. Without it, a full render. */\n  previewed?(floor: Floor, selection: Selection): void;\n}\n\n/** Where a whole-floor move starts from. */\nexport interface FloorPlacement {\n  scene: Scene;\n  annotations: Annotation[];\n  traces: Trace[];\n  /** The edit it was taken after: a move from an older one is refused. */\n  at: number;\n}\n\nexport const AUTOSAVE_DEBOUNCE_MS = 1500;\nexport const RETRY_DELAY_MS = 5000;\n\n/** Owns the design document and is its single writer. Every mutation goes\n * through commit() or a begin/end gesture, which handles undo snapshots,\n * dirty tracking, debounced autosave and re-rendering. Lives outside\n * Alpine's reactive state. */\nexport class EditorCore {\n  readonly design: Design;\n  /** What the property panels edit: the one thing selected, or null while\n   * `multi` is in use. */\n  selection: Selection = null;\n  /** Several walls, windows or rooms selected at once, over any floors. Empty\n   * for a single selection. */\n  multi: Item[] = [];\n  /** A measure's colour when a pill picked the set. */\n  multiColour: string | null = null;\n  /** What hovering a pill would select, drawn lighter. */\n  hovered: { items: Item[]; colour: string | null } | null = null;\n\n  private active: Floor;\n  private readonly history = new History();\n  private readonly dirty = new Set<number>();\n  /** Floors a whole-floor move shifted: where their traces and annotations\n   * sit goes with the scene's next save, under its version check, so the\n   * drawing and what's laid on it can't part. */\n  private readonly moved = new Set<number>();\n  private readonly delegate: CoreDelegate;\n  private readonly debounceMs: number;\n  private saveState: SaveState = \"saved\";\n  private timer: ReturnType<typeof setTimeout> | null = null;\n  private saving = false;\n  private locked = false;\n  /** A scenario can't change its baseline: plan edits are refused while set. */\n  private planLocked = false;\n  private gestureDepth = 0;\n  /** Where a whole-floor move being previewed started: saves wait, and any\n   * edit puts the floor back here first. */\n  private preview: FloorPlacement | null = null;\n  /** Counts the floor's edits, undos and switches, to spot a stale move. */\n  private generation = 0;\n  /** The last move, while nothing else has happened since: a run of nudges\n   * carries it on rather than adding moves up, rounding and all. */\n  private lastMove: { base: FloorPlacement; move: Rigid; at: number } | null =\n    null;\n  /** Scenes settling leaves as they are, so an edit tidies nothing else. */\n  private readonly tidy = new WeakSet<Scene>();\n  /** The walls the gesture under way will tidy when it settles. */\n  private gestureUntidy = 0;\n  /** The plan and its measures as the gesture under way found them. */\n  private gestureFrom: { scene: Scene; annotations: Annotation[] } | null =\n    null;\n\n  constructor(\n    design: Design,\n    delegate: CoreDelegate,\n    debounceMs = AUTOSAVE_DEBOUNCE_MS,\n  ) {\n    if (design.floors.length === 0) {\n      throw new Error(\"A design needs at least one floor.\");\n    }\n    this.design = design;\n    this.delegate = delegate;\n    this.debounceMs = debounceMs;\n    this.active = design.floors[0] as Floor;\n  }\n\n  floor(): Floor {\n    return this.active;\n  }\n\n  floors(): Floor[] {\n    return this.design.floors;\n  }\n\n  scene(): Scene {\n    return this.active.scene;\n  }\n\n  isLocked(): boolean {\n    return this.locked;\n  }\n\n  setPlanLocked(on: boolean): void {\n    this.planLocked = on;\n  }\n\n  isPlanLocked(): boolean {\n    return this.planLocked;\n  }\n\n  isDirty(): boolean {\n    return this.dirty.size > 0;\n  }\n\n  setFloor(id: number): boolean {\n    const floor = this.design.floors.find((candidate) => candidate.id === id);\n    if (!floor) {\n      return false;\n    }\n    this.endPreview();\n    this.generation++;\n    this.active = floor;\n    this.selection = null;\n    this.hovered = null;\n    this.render();\n    this.pushUi();\n    return true;\n  }\n\n  select(selection: Selection): void {\n    this.selection = selection;\n    this.clearMulti();\n    this.render();\n  }\n\n  /** Empty the set, and the lighter preview a pill's hover left with it. */\n  private clearMulti(): void {\n    this.multi = [];\n    this.multiColour = null;\n    this.hovered = null;\n  }\n\n  /** Drop what an edit has taken from the set. */\n  private pruneMulti(): void {\n    if (this.multi.length === 0) {\n      return;\n    }\n    const kept = this.multi.filter((item) => {\n      const scene = this.design.floors.find((f) => f.id === item.floor)?.scene;\n      const list: readonly { id: string }[] | undefined = scene\n        ? { wall: scene.walls, opening: scene.openings, room: scene.rooms }[\n            item.type\n          ]\n        : undefined;\n      return list?.some((each) => each.id === item.id) ?? false;\n    });\n    if (kept.length === this.multi.length) {\n      return;\n    }\n    this.multi = kept;\n    if (kept.length === 0) {\n      this.clearMulti();\n    }\n  }\n\n  /** Shift-click: add `selection` to what is selected, or take it off. One\n   * left is a single selection again. Others (annotations, emitters) just\n   * select. */\n  toggleSelection(selection: NonNullable<Selection>): void {\n    if (!isMultiType(selection.type)) {\n      this.select(selection);\n      return;\n    }\n    const item: Item = {\n      floor: this.active.id,\n      type: selection.type,\n      id: selection.id,\n    };\n    const primary = this.selection;\n    const start: Item[] =\n      this.multi.length > 0 || !primary || !isMultiType(primary.type)\n        ? this.multi\n        : [{ floor: this.active.id, type: primary.type, id: primary.id }];\n    const next = toggleItem(start, item);\n    if (next.length <= 1) {\n      const only = next[0];\n      this.select(only ? { type: only.type, id: only.id } : null);\n      return;\n    }\n    this.selection = null;\n    this.multi = next;\n    this.multiColour = null;\n    this.render();\n  }\n\n  /** Select exactly `items` (a measure's cover); empty clears. */\n  selectItems(items: Item[], colour: string | null = null): void {\n    this.selection = null;\n    this.multi = items;\n    this.multiColour = items.length > 0 ? colour : null;\n    if (items.length === 0) {\n      this.hovered = null;\n    }\n    this.render();\n  }\n\n  /** A pill's click: select its cover, or clear if that is already the set.\n   * Returns whether the set is on. */\n  toggleItems(items: Item[], colour: string | null = null): boolean {\n    if (sameItems(this.multi, items)) {\n      this.select(null);\n      return false;\n    }\n    this.hovered = null;\n    this.selectItems(items, colour);\n    return true;\n  }\n\n  /** Why Delete can't act on the set, or null when it can. */\n  deleteRefusal(): string | null {\n    if (this.planLocked) {\n      return \"A scenario can't change the plan.\";\n    }\n    if (this.locked) {\n      return \"Someone else saved this design: reload to edit it.\";\n    }\n    return deletableOn(this.multi, this.active.id)\n      ? null\n      : \"Select elements on one floor to delete them together.\";\n  }\n\n  /** Show what `items` would select, lighter; null to stop. */\n  previewItems(items: Item[] | null, colour: string | null = null): void {\n    this.hovered = items && items.length > 0 ? { items, colour } : null;\n    if (this.delegate.previewed) {\n      this.delegate.previewed(this.active, this.selection);\n    } else {\n      this.render();\n    }\n  }\n\n  /** The keys of what is selected: `<floor pk>:<id>`. */\n  multiKeys(): string[] {\n    return this.multi.map(keyOf);\n  }\n\n  /** The current floor's undoable state (uncloned \u2014 History clones). */\n  snapshot(): FloorSnapshot {\n    return {\n      scene: this.active.scene,\n      annotations: this.active.annotations,\n      traces: this.active.traces,\n    };\n  }\n\n  /** Push an undo entry for the current floor state. Used internally before\n   * scene mutations, and by the editor before annotation mutations. */\n  pushHistory(): void {\n    if (this.locked) {\n      return;\n    }\n    this.endPreview();\n    this.generation++;\n    this.history.push(this.active.id, this.snapshot());\n    this.pushUi();\n  }\n\n  /** Deferred history entry for annotation creates: the pre-create state is\n   * captured immediately but only pushed once the server acks the row (temp\n   * ids must never enter history). */\n  captureSnapshot(): { floorId: number; snapshot: FloorSnapshot } {\n    this.endPreview();\n    return {\n      floorId: this.active.id,\n      snapshot: structuredClone(this.snapshot()),\n    };\n  }\n\n  pushCapturedSnapshot(captured: {\n    floorId: number;\n    snapshot: FloorSnapshot;\n  }): void {\n    if (this.locked) {\n      return;\n    }\n    this.generation++;\n    this.history.push(captured.floorId, captured.snapshot);\n    this.pushUi();\n  }\n\n  /** One-shot mutation: undo snapshot, mutate, mark dirty, redraw, save. */\n  commit(mutate: (scene: Scene) => void): void {\n    if (this.locked || this.planLocked) {\n      return;\n    }\n    this.endPreview();\n    this.history.push(this.active.id, this.snapshot());\n    const untidy = this.untidy();\n    const from = this.measuresFrom();\n    mutate(this.active.scene);\n    normalizeScene(this.active.scene);\n    normalizeOpenings(this.active.scene);\n    normalizeEmitters(this.active.scene);\n    normalizeFixtures(this.active.scene);\n    normalizeFeatures(this.active.scene);\n    this.followPlan(from);\n    this.persistFollowed(from);\n    this.sayTidied(untidy);\n    this.pruneMulti();\n    this.touch();\n  }\n\n  /** The plan and its measures before an edit, when it has any to carry. */\n  private measuresFrom(): { scene: Scene; annotations: Annotation[] } | null {\n    const annotations = this.active.annotations;\n    return annotations.length > 0\n      ? { scene: structuredClone(this.active.scene), annotations }\n      : null;\n  }\n\n  /** Lay the measures where the edit since `from` carried them. */\n  private followPlan(\n    from: { scene: Scene; annotations: Annotation[] } | null,\n  ): void {\n    if (from) {\n      this.active.annotations = followed(\n        from.scene,\n        this.active.scene,\n        from.annotations,\n      );\n    }\n  }\n\n  /** Save where the measures went. After a floor move they go with the\n   * scene's save instead, as everything that move shifted does. */\n  private persistFollowed(\n    from: { scene: Scene; annotations: Annotation[] } | null,\n  ): void {\n    if (!from || this.moved.has(this.active.id)) {\n      return;\n    }\n    const patches = annotationDiff(from.annotations, this.active.annotations);\n    if (patches.length > 0) {\n      this.delegate.persistAnnotations(patches);\n    }\n  }\n\n  /** A drag gesture: snapshot once at the start, mutate live on every\n   * pointermove, settle dirty/save state once at the end. */\n  beginGesture(): void {\n    if (this.locked || this.planLocked || this.gestureDepth > 0) {\n      return;\n    }\n    this.endPreview();\n    this.gestureDepth = 1;\n    this.history.push(this.active.id, this.snapshot());\n    this.gestureUntidy = this.untidy();\n    this.gestureFrom = this.measuresFrom();\n  }\n\n  mutateLive(mutate: (scene: Scene) => void): void {\n    if (this.locked || this.planLocked || this.gestureDepth === 0) {\n      return;\n    }\n    mutate(this.active.scene);\n    normalizeOpenings(this.active.scene);\n    normalizeEmitters(this.active.scene);\n    normalizeFixtures(this.active.scene);\n    normalizeFeatures(this.active.scene);\n    this.followPlan(this.gestureFrom);\n    this.render();\n  }\n\n  endGesture(): void {\n    if (this.gestureDepth === 0) {\n      return;\n    }\n    this.gestureDepth = 0;\n    this.persistFollowed(this.gestureFrom);\n    this.gestureFrom = null;\n    this.sayTidied(this.gestureUntidy);\n    this.touch();\n  }\n\n  cancelGesture(): void {\n    if (this.gestureDepth === 0) {\n      return;\n    }\n    this.gestureDepth = 0;\n    this.gestureFrom = null;\n    this.generation++;\n    const restored = this.history.undo(this.active.id, this.snapshot());\n    if (restored) {\n      this.active.scene = restored.scene;\n      this.active.annotations = restored.annotations;\n      this.active.traces = restored.traces;\n    }\n    this.render();\n    this.pushUi();\n  }\n\n  /** The current floor, to move as a whole from. */\n  placement(): FloorPlacement {\n    return {\n      ...structuredClone({\n        scene: this.active.scene,\n        annotations: this.active.annotations,\n        traces: this.active.traces,\n      }),\n      at: this.generation,\n    };\n  }\n\n  /** Draw the floor moved from `base`, saving and recording nothing. */\n  previewMove(base: FloorPlacement, move: Rigid): void {\n    if (this.locked || this.planLocked || base.at !== this.generation) {\n      return;\n    }\n    if (this.preview && this.preview !== base) {\n      this.endPreview();\n    }\n    this.preview = base;\n    this.place(base, move);\n    this.render();\n  }\n\n  /** Where the move being previewed started, if one is. */\n  previewBase(): FloorPlacement | null {\n    return this.preview;\n  }\n\n  /** Put the floor back from a move only previewed. */\n  endPreview(): void {\n    if (this.preview) {\n      this.cancelMove(this.preview);\n    }\n  }\n\n  /** Move the whole floor from `base`, everything on it and every trace\n   * under it, as one undo entry. */\n  commitMove(base: FloorPlacement, move: Rigid): void {\n    if (this.locked || this.planLocked || base.at !== this.generation) {\n      this.endPreview();\n      return;\n    }\n    if (this.preview && this.preview !== base) {\n      this.endPreview();\n    }\n    this.preview = null;\n    this.history.push(this.active.id, {\n      scene: base.scene,\n      annotations: base.annotations,\n      traces: base.traces,\n      moved: true,\n    });\n    this.place(base, move);\n    this.moved.add(this.active.id);\n    this.touch();\n    this.lastMove = { base, move, at: this.generation };\n  }\n\n  /** Carry the last move on by `step`, still as one undo entry, worked out\n   * from where it began; false when anything has happened since. */\n  continueMove(step: Rigid): boolean {\n    const last = this.lastMove;\n    if (this.locked || !last || last.at !== this.generation) {\n      return false;\n    }\n    const move = followedBy(last.move, step);\n    this.place(last.base, move);\n    this.moved.add(this.active.id);\n    this.touch();\n    this.lastMove = { ...last, move, at: this.generation };\n    return true;\n  }\n\n  /** Put the floor back where `base` had it, as if nothing happened. */\n  cancelMove(base: FloorPlacement): void {\n    if (this.preview !== base) {\n      return;\n    }\n    this.preview = null;\n    const copy = structuredClone(base);\n    this.active.scene = copy.scene;\n    this.active.annotations = copy.annotations;\n    this.active.traces = copy.traces;\n    this.render();\n  }\n\n  private place(base: FloorPlacement, move: Rigid): void {\n    this.active.scene = movedScene(structuredClone(base.scene), move);\n    // Rounding the corners can shorten a wall by a mm: keep what's on it in.\n    normalizeOpenings(this.active.scene);\n    normalizeEmitters(this.active.scene);\n    normalizeFixtures(this.active.scene);\n    normalizeFeatures(this.active.scene);\n    this.active.annotations = movedAnnotations(\n      structuredClone(base.annotations),\n      move,\n    );\n    this.active.traces = base.traces.map((trace) => movedTrace(trace, move));\n  }\n\n  /** Delete the whole set as one undo step; refuses unless all of it is on\n   * this floor. Returns whether it acted. */\n  deleteMulti(): boolean {\n    if (\n      this.locked ||\n      this.planLocked ||\n      !deletableOn(this.multi, this.active.id)\n    ) {\n      return false;\n    }\n    const items = deleteOrder(this.multi);\n    this.commit((scene) => {\n      const walls = new Set<string>();\n      const rooms: string[] = [];\n      for (const { type, id } of items) {\n        if (type === \"opening\") {\n          scene.openings = scene.openings.filter((o) => o.id !== id);\n        } else if (type === \"wall\") {\n          walls.add(id);\n        } else {\n          rooms.push(id);\n        }\n      }\n      // One batch: taking walls one at a time heals, merges and renumbers\n      // walls that aren't in the set.\n      removeWallSet(scene, walls);\n      for (const id of rooms) {\n        // May already be gone with its walls.\n        if (scene.rooms.some((room) => room.id === id)) {\n          deleteRoom(scene, id);\n        }\n      }\n    });\n    this.select(null);\n    return true;\n  }\n\n  deleteSelection(): void {\n    const selection = this.selection;\n    // Annotations are rows, not scene content \u2014 the editor deletes them\n    // through the API instead.\n    if (this.planLocked || !selection || selection.type === \"annotation\") {\n      return;\n    }\n    this.commit((scene) => {\n      if (selection.type === \"wall\") {\n        // Between two rooms this knocks them into one.\n        removeWall(scene, selection.id);\n      } else if (selection.type === \"opening\") {\n        scene.openings = scene.openings.filter(\n          (opening) => opening.id !== selection.id,\n        );\n      } else if (selection.type === \"emitter\") {\n        scene.emitters = scene.emitters.filter(\n          (emitter) => emitter.id !== selection.id,\n        );\n      } else {\n        // Its walls stay, round an empty space.\n        deleteRoom(scene, selection.id);\n      }\n    });\n    this.select(null);\n  }\n\n  /** This floor's edits, oldest first, for the change log. */\n  historySteps(): Step[] {\n    return this.history.steps(this.active.id, this.snapshot());\n  }\n\n  /** What the change log depends on, or null while a drag is under way: the\n   * last line's \"after\" is the live plan, which moves every frame. */\n  historySignature(): string | null {\n    return this.gestureDepth > 0\n      ? null\n      : this.history.signature(this.active.id);\n  }\n\n  /** Go back to how the floor was before edit `step`. The present goes on the\n   * undo stack first, so the revert is one more edit to undo. */\n  revertTo(step: number): void {\n    const state = this.history.before(this.active.id, step);\n    if (!state || this.locked || this.planLocked) {\n      return;\n    }\n    this.pushHistory();\n    this.applySnapshot(state);\n  }\n\n  undo(): void {\n    if (this.locked) {\n      return;\n    }\n    this.endPreview();\n    this.applySnapshot(this.history.undo(this.active.id, this.snapshot()));\n  }\n\n  redo(): void {\n    if (this.locked) {\n      return;\n    }\n    this.endPreview();\n    this.applySnapshot(this.history.redo(this.active.id, this.snapshot()));\n  }\n\n  private applySnapshot(restored: FloorSnapshot | null): void {\n    if (!restored) {\n      return;\n    }\n    const before = this.active.annotations;\n    const traces = this.active.traces;\n    this.active.scene = restored.scene;\n    this.active.annotations = restored.annotations;\n    this.active.traces = restored.traces;\n    let patches = annotationDiff(before, restored.annotations);\n    let moves = traceDiff(traces, restored.traces);\n    if (restored.moved) {\n      // Undoing a floor move: where things sit goes with the scene.\n      patches = unplaced(patches);\n      moves = unplaced(moves);\n      this.moved.add(this.active.id);\n    }\n    if (patches.length > 0) {\n      this.delegate.persistAnnotations(patches);\n    }\n    if (moves.length > 0) {\n      this.delegate.persistTraces(moves);\n    }\n    this.selection = null;\n    this.clearMulti();\n    this.touch();\n  }\n\n  /** Save every dirty floor now; used by tests and the retry path. */\n  async flush(): Promise<void> {\n    if (this.saving || this.locked || this.dirty.size === 0) {\n      return;\n    }\n    if (this.preview) {\n      this.schedule(this.debounceMs);\n      return;\n    }\n    this.saving = true;\n    this.setSaveState(\"saving\");\n    try {\n      for (const floorId of [...this.dirty]) {\n        const floor = this.design.floors.find((f) => f.id === floorId);\n        if (!floor) {\n          this.dirty.delete(floorId);\n          continue;\n        }\n        // Cleared before the wait, so a move made meanwhile isn't lost.\n        const moved = this.moved.delete(floorId);\n        const result = await this.delegate.save(floor, moved);\n        if (result.kind !== \"saved\" && moved) {\n          this.moved.add(floorId);\n        }\n        if (result.kind === \"saved\") {\n          floor.version = result.version;\n          this.dirty.delete(floorId);\n        } else if (result.kind === \"conflict\") {\n          // Someone else saved first: take their scene, lock editing and\n          // leave recovery (reload) to the user.\n          floor.scene = result.scene;\n          floor.version = result.version;\n          this.dirty.clear();\n          this.locked = true;\n          this.selection = null;\n          this.clearMulti();\n          this.setSaveState(\"conflict\");\n          this.render();\n          return;\n        } else {\n          this.setSaveState(\"error\");\n          this.schedule(RETRY_DELAY_MS);\n          return;\n        }\n      }\n      this.setSaveState(this.dirty.size > 0 ? \"dirty\" : \"saved\");\n      if (this.dirty.size > 0) {\n        this.schedule(this.debounceMs);\n      }\n    } finally {\n      this.saving = false;\n    }\n  }\n\n  /** How many walls settling the floor would tidy, 0 once it's tidy. */\n  private untidy(): number {\n    const scene = this.active.scene;\n    if (this.tidy.has(scene)) {\n      return 0;\n    }\n    const walls = untidyWalls(scene);\n    if (walls === 0) {\n      this.tidy.add(scene);\n    }\n    return walls;\n  }\n\n  /** Say the edit just made tidied the walls an untidy plan had. */\n  private sayTidied(untidy: number): void {\n    if (untidy > 0 && this.untidy() === 0) {\n      this.delegate.tidied?.(untidy);\n    }\n  }\n\n  private touch(): void {\n    this.generation++;\n    this.dirty.add(this.active.id);\n    this.setSaveState(\"dirty\");\n    this.schedule(this.debounceMs);\n    this.render();\n    this.pushUi();\n  }\n\n  private schedule(delayMs: number): void {\n    if (this.timer !== null) {\n      clearTimeout(this.timer);\n    }\n    this.timer = setTimeout(() => {\n      this.timer = null;\n      void this.flush();\n    }, delayMs);\n  }\n\n  private render(): void {\n    this.delegate.render(this.active, this.selection);\n  }\n\n  private setSaveState(state: SaveState): void {\n    this.saveState = state;\n    this.pushUi();\n  }\n\n  private pushUi(): void {\n    this.delegate.ui({\n      saveState: this.saveState,\n      canUndo: this.history.canUndo(this.active.id),\n      canRedo: this.history.canRedo(this.active.id),\n    });\n  }\n}\n", "import { COLORS, element } from \"./renderer\";\nimport { Point } from \"./scene\";\nimport { SnapKind } from \"./snap\";\n\n// Tools describe their preview as data; the editor renders it. This keeps\n// tools free of DOM so they run under vitest's node environment.\n\nexport type OverlaySpec =\n  | {\n      kind: \"line\";\n      a: Point;\n      b: Point;\n      thickness: number;\n      /** Square to a wall already drawn: shown green. */\n      square?: boolean;\n    }\n  | { kind: \"text\"; at: Point; text: string }\n  | { kind: \"marker\"; at: Point; snap: SnapKind }\n  | { kind: \"area\"; polygon: Point[] }\n  /** What a moved floor turns about, and the handle that turns it. */\n  | { kind: \"pivot\"; at: Point }\n  | { kind: \"handle\"; at: Point };\n\nexport const PREVIEW_COLOR = \"#2563eb\"; // blue-600\nexport const SQUARE_COLOR = \"#16a34a\"; // green-600\n\nexport function renderOverlay(\n  specs: OverlaySpec[],\n  worldPerPixel: number,\n): SVGElement[] {\n  return specs.map((spec) => {\n    if (spec.kind === \"area\") {\n      return element(\"polygon\", {\n        points: spec.polygon.map(([x, y]) => `${x},${y}`).join(\" \"),\n        fill: PREVIEW_COLOR,\n        \"fill-opacity\": \"0.15\",\n        stroke: PREVIEW_COLOR,\n        \"stroke-width\": String(2 * worldPerPixel),\n      });\n    }\n    if (spec.kind === \"line\") {\n      return element(\"line\", {\n        x1: String(spec.a[0]),\n        y1: String(spec.a[1]),\n        x2: String(spec.b[0]),\n        y2: String(spec.b[1]),\n        stroke: spec.square ? SQUARE_COLOR : PREVIEW_COLOR,\n        \"stroke-opacity\": spec.square ? \"0.7\" : \"0.5\",\n        \"stroke-width\": String(spec.thickness),\n        \"stroke-linecap\": \"square\",\n      });\n    }\n    if (spec.kind === \"text\") {\n      const label = element(\"text\", {\n        // On a turned plan it turns about the point, so it stays above it.\n        \"data-pivot\": `${spec.at[0]} ${spec.at[1]}`,\n        x: String(spec.at[0]),\n        y: String(spec.at[1] - 12 * worldPerPixel),\n        fill: PREVIEW_COLOR,\n        \"font-size\": String(13 * worldPerPixel),\n        \"font-family\": \"sans-serif\",\n        \"text-anchor\": \"middle\",\n      });\n      label.textContent = spec.text;\n      return label;\n    }\n    if (spec.kind === \"pivot\") {\n      const r = 7 * worldPerPixel;\n      const [x, y] = spec.at;\n      const pivot = element(\"g\", {});\n      pivot.appendChild(\n        element(\"circle\", {\n          cx: String(x),\n          cy: String(y),\n          r: String(r),\n          fill: \"#ffffff\",\n          stroke: PREVIEW_COLOR,\n          \"stroke-width\": String(2 * worldPerPixel),\n        }),\n      );\n      pivot.appendChild(\n        element(\"path\", {\n          d: `M ${x - r * 1.6} ${y} H ${x + r * 1.6} M ${x} ${y - r * 1.6} V ${y + r * 1.6}`,\n          stroke: PREVIEW_COLOR,\n          \"stroke-width\": String(1.5 * worldPerPixel),\n        }),\n      );\n      return pivot;\n    }\n    if (spec.kind === \"handle\") {\n      return element(\"circle\", {\n        cx: String(spec.at[0]),\n        cy: String(spec.at[1]),\n        r: String(6 * worldPerPixel),\n        fill: PREVIEW_COLOR,\n        stroke: \"#ffffff\",\n        \"stroke-width\": String(2 * worldPerPixel),\n      });\n    }\n    if (spec.snap === \"below\") {\n      // Caught on the floor below: a diamond in its colour.\n      const r = 7 * worldPerPixel;\n      const [x, y] = spec.at;\n      return element(\"polygon\", {\n        points: `${x},${y - r} ${x + r},${y} ${x},${y + r} ${x - r},${y}`,\n        fill: \"none\",\n        stroke: COLORS.underlay,\n        \"stroke-width\": String(2 * worldPerPixel),\n      });\n    }\n    // Snap marker: a filled dot on endpoints, a ring on walls, a faint dot\n    // otherwise.\n    const emphasised = spec.snap === \"endpoint\" || spec.snap === \"wall\";\n    return element(\"circle\", {\n      cx: String(spec.at[0]),\n      cy: String(spec.at[1]),\n      r: String((emphasised ? 6 : 3) * worldPerPixel),\n      fill: spec.snap === \"endpoint\" ? PREVIEW_COLOR : \"none\",\n      stroke: PREVIEW_COLOR,\n      \"stroke-width\": String(1.5 * worldPerPixel),\n    });\n  });\n}\n", "// What the editor and the 3D bundle share. Nothing here imports three.js:\n// the editor loads static/model3d.js only when someone opens 3D.\n\nimport type { Selection } from \"../core\";\nimport type { PlacedFixture } from \"../fixtures\";\nimport type { FabricType, Floor } from \"../scene\";\n\nexport type ColourMode = \"materials\" | \"heat\" | \"phase\";\nexport type RoofChoice = \"auto\" | \"gable\" | \"hip\" | \"flat\";\nexport type ViewPreset = \"iso\" | \"front\" | \"back\" | \"left\" | \"right\" | \"top\";\n\n/** The 3D panel's reactive state, kept on the editor. */\nexport interface Model3dState {\n  ready: boolean;\n  failed: string;\n  /** Index of the highest storey shown; null is the whole house, roof on. */\n  storey: number | null;\n  /** Just that storey, not the ones under it. */\n  only: boolean;\n  section: boolean;\n  /** How far into the house the section cuts, 0\u2013100. */\n  sectionAt: number;\n  colour: ColourMode;\n  street: boolean;\n  /** Draw the kit: emitters, fixtures, panels. */\n  kit: boolean;\n  /** The heat pump's clearance zones, with the kit. */\n  clearances: boolean;\n  site: \"idle\" | \"loading\" | \"ready\" | \"failed\" | \"nowhere\" | \"waiting\";\n  siteMessage: string;\n  /** Where the house's plot from Land Registry stands, if not drawn. */\n  plotMessage: string;\n  /** Who to credit for the map on show. */\n  attribution: string;\n  plotAttribution: string;\n  /** How the house was found on the map: by address, best guess, or by hand. */\n  siteMatch: \"\" | \"address\" | \"guess\" | \"picked\" | \"none\";\n  /** Who confirmed the house, once someone has. */\n  confirmedBy: string;\n  picking: boolean;\n  roof: { kind: RoofChoice; pitch: string; overhang: string };\n  /** What \"Auto\" makes, and the roof's figures, for the panel. */\n  roofAuto: string;\n  roofArea: string;\n  roofSaving: boolean;\n  /** North read off the map's footprint, when it differs from the plan's. */\n  mapNorth: number | null;\n  hover: string;\n  storeys: string[];\n}\n\nexport function initialModel3d(): Model3dState {\n  return {\n    ready: false,\n    failed: \"\",\n    storey: null,\n    only: false,\n    section: false,\n    sectionAt: 50,\n    colour: \"materials\",\n    street: true,\n    kit: true,\n    clearances: false,\n    site: \"idle\",\n    siteMessage: \"\",\n    plotMessage: \"\",\n    attribution: \"\",\n    plotAttribution: \"\",\n    siteMatch: \"\",\n    confirmedBy: \"\",\n    picking: false,\n    roof: { kind: \"auto\", pitch: \"\", overhang: \"\" },\n    roofAuto: \"\",\n    roofArea: \"\",\n    roofSaving: false,\n    mapNorth: null,\n    hover: \"\",\n    storeys: [],\n  };\n}\n\n/** Everything the model is drawn from, gathered by the editor. */\nexport interface ModelInput {\n  floors: readonly Floor[];\n  types: readonly FabricType[];\n  /** Heat-map fills by room id. */\n  heat: ReadonlyMap<string, string>;\n  /** Bridge keys the package on show treats (`wall:3`, `roof`, \u2026). */\n  treated: ReadonlySet<string>;\n  selection: { floor: number; selection: Selection } | null;\n  northDeg: number | null;\n  modelUrl: string;\n  /** The baseline's fixtures and a scenario's changes, as the plan shows. */\n  fixtures: readonly PlacedFixture[];\n}\n\nexport interface Model3dCallbacks {\n  select(floor: number, selection: Selection): void;\n  /** North was set from the map; the editor saves and redraws. */\n  setNorth(degrees: number): void;\n}\n\nexport type Model3dAction =\n  | \"view\"\n  | \"fit\"\n  | \"storey\"\n  | \"only\"\n  | \"section\"\n  | \"sectionAt\"\n  | \"colour\"\n  | \"street\"\n  | \"kit\"\n  | \"clearances\"\n  | \"retrySite\"\n  | \"pick\"\n  | \"confirm\"\n  | \"roof\"\n  | \"export\"\n  | \"useMapNorth\";\n\nexport interface Model3dHandle {\n  update(input: ModelInput): void;\n  act(action: Model3dAction, value?: unknown): void;\n  resize(): void;\n}\n\nexport interface Model3dBundle {\n  create(\n    mount: HTMLElement,\n    state: Model3dState,\n    callbacks: Model3dCallbacks,\n  ): Model3dHandle;\n}\n\ndeclare global {\n  interface Window {\n    furbnowModel3d?: Model3dBundle;\n  }\n}\n\nlet loading: Promise<Model3dBundle> | null = null;\n\n/** The 3D bundle, fetched the first time it's asked for. */\nexport function loadModel3d(src: string): Promise<Model3dBundle> {\n  if (window.furbnowModel3d) {\n    return Promise.resolve(window.furbnowModel3d);\n  }\n  loading ??= new Promise((resolve, reject) => {\n    const script = document.createElement(\"script\");\n    script.src = src;\n    script.async = true;\n    script.onload = () =>\n      window.furbnowModel3d\n        ? resolve(window.furbnowModel3d)\n        : reject(new Error(\"The 3D viewer didn't load.\"));\n    script.onerror = () => {\n      loading = null;\n      reject(new Error(\"The 3D viewer didn't load.\"));\n    };\n    document.head.appendChild(script);\n  });\n  return loading;\n}\n", "// The outliner's floors: each floor's rooms, in the order they were drawn,\n// with the floor area the plan labels them with.\n\nimport { breastAreaMm2 } from \"./features\";\nimport { formatAreaM2, polygonArea } from \"./geometry\";\nimport type { Scene } from \"./scene\";\nimport { polygonOf } from \"./topology\";\n\nexport interface RoomRow {\n  id: string;\n  name: string;\n  /** \"12.0 m\u00B2\", as on the plan. */\n  area: string;\n}\n\n/** Whether a rebuilt list says what the one in use does, so it needn't replace\n * it: a replaced list re-runs every row's bindings, and a keyed row can show the\n * previous selection (templates/AGENTS.md). */\nexport function same(left: unknown, right: unknown): boolean {\n  return JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport function roomRows(\n  floors: readonly { id: number; scene: Scene }[],\n): Record<number, RoomRow[]> {\n  return Object.fromEntries(\n    floors.map((floor) => [\n      floor.id,\n      floor.scene.rooms.map((room) => ({\n        id: room.id,\n        name: room.name || \"Room\",\n        area: formatAreaM2(\n          polygonArea(polygonOf(floor.scene, room)) -\n            breastAreaMm2(floor.scene, room.id),\n        ),\n      })),\n    ]),\n  );\n}\n", "// The design tool's panes: which properties tab is open, and the drawers\n// and strips each person leaves open or shut, kept per browser.\n\n/** The properties pane's tabs, in order (templates/design/sidebar). */\nexport const TABS = [\n  \"selection\",\n  \"measures\",\n  \"house\",\n  \"results\",\n  \"history\",\n] as const;\n\nexport type Tab = (typeof TABS)[number];\n\n/** Exactly one tab open: the first one kept open, else Selection. */\nexport function oneTab(kept: unknown): Record<string, boolean> {\n  const open =\n    kept && typeof kept === \"object\"\n      ? TABS.find((tab) => (kept as Record<string, unknown>)[tab] === true)\n      : undefined;\n  return { [open ?? \"selection\"]: true };\n}\n\n/** A remembered yes or no; `fallback` when storage is blocked or empty. */\nexport function loadFlag(key: string, fallback: boolean): boolean {\n  try {\n    const kept = window.localStorage.getItem(key);\n    return kept === null ? fallback : kept === \"1\";\n  } catch {\n    return fallback;\n  }\n}\n\nexport function saveFlag(key: string, on: boolean): void {\n  try {\n    window.localStorage.setItem(key, on ? \"1\" : \"0\");\n  } catch {\n    // Private windows and blocked storage: it lasts the visit.\n  }\n}\n", "/** The size on paper of the PDF page a trace was drawn from, in mm.\n *\n * The server writes it into the PNG's text chunks (`apps/design/trace.py`).\n * A scan or photo has none, so a ratio such as 1:50 can't be set on it. */\n\nconst PAGE_MM_KEY = \"furbnow-page-mm\";\nconst SIGNATURE_LENGTH = 8;\n\nexport interface PageMm {\n  width: number;\n  height: number;\n}\n\nexport function pageMmFromPng(bytes: Uint8Array): PageMm | null {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  let at = SIGNATURE_LENGTH;\n  while (at + 12 <= bytes.length) {\n    const length = view.getUint32(at);\n    const type = String.fromCharCode(...bytes.subarray(at + 4, at + 8));\n    if (type === \"IDAT\" || type === \"IEND\") {\n      return null;\n    }\n    if (type === \"tEXt\") {\n      const text = new TextDecoder(\"latin1\").decode(\n        bytes.subarray(at + 8, at + 8 + length),\n      );\n      const [key = \"\", value = \"\"] = text.split(\"\\0\");\n      if (key === PAGE_MM_KEY) {\n        const [width, height] = value.split(\",\").map(Number);\n        return width && height && width > 0 && height > 0\n          ? { width, height }\n          : null;\n      }\n    }\n    at += 12 + length;\n  }\n  return null;\n}\n", "import {\n  type ProjectDocument,\n  patchTrace,\n  projectDocuments,\n  uploadTrace,\n} from \"./api\";\nimport { EditorCore } from \"./core\";\nimport { formatLengthM } from \"./geometry\";\nimport { PageMm, pageMmFromPng } from \"./pagesize\";\nimport { Renderer } from \"./renderer\";\nimport { Floor, Point, Trace } from \"./scene\";\nimport { houseAngle } from \"./snap\";\nimport {\n  Size,\n  TracePatch,\n  TraceTransform,\n  aligned,\n  calibrated,\n  moved,\n  normalizedDegrees,\n  scaledAbout,\n  traceCentre,\n  traceCorners,\n  tracePatch,\n  traceTransform,\n  turnedAbout,\n} from \"./trace\";\nimport { insidePolygon } from \"./traceframe\";\nimport { ToolName, TraceTools } from \"./tools/types\";\n\n// Everything a floor's traces need beyond drawing: which one is being\n// fitted, live drags, undo entries and saving. Lives outside Alpine, like\n// the core; the side panel reads a plain copy (rows / view).\n\nexport interface TraceHost {\n  core(): EditorCore | undefined;\n  renderer(): Renderer | undefined;\n  worldPerPixel(): number;\n  /** The view's centre on the plan. */\n  centre(): Point;\n  planRotation(): number;\n  setTool(name: ToolName): void;\n  say(hint: string): void;\n  cursor(cursor: string): void;\n  fail(error: unknown): void;\n}\n\nexport interface TraceRow {\n  id: number;\n  name: string;\n  imported: boolean;\n  locked: boolean;\n  hidden: boolean;\n  calibrated: boolean;\n}\n\nexport interface TraceView extends TraceRow {\n  opacity: number;\n  /** Degrees, as typed into the panel. */\n  rotation: string;\n  /** The image's width on the plan, metres, as typed into the panel. */\n  width: string;\n  /** Whether the image knows its size on paper, so a ratio can be typed. */\n  paper: boolean;\n  /** The drawing's ratio, the n in 1:n, as typed into the panel. */\n  ratio: string;\n}\n\nconst SAVE_DELAY_MS = 300;\n\n/** Arrow presses this close together undo as one nudge. */\nconst NUDGE_RUN_MS = 1000;\n\nexport class TraceDesk {\n  private activeId: number | null = null;\n  private fitting = false;\n  private tool: ToolName = \"select\";\n  private comparing = false;\n  private readonly sizes = new Map<string, Size | \"loading\">();\n  private readonly pages = new Map<string, PageMm | null | \"loading\">();\n  private live: { id: number; transform: TraceTransform } | null = null;\n  private captured: ReturnType<EditorCore[\"captureSnapshot\"]> | null = null;\n  private nudged: { id: number; at: number } | null = null;\n  private readonly pending = new Map<\n    number,\n    { url: string; body: Record<string, unknown>; timer: number }\n  >();\n  private writes: Promise<unknown> = Promise.resolve();\n  private listeners: (() => void)[] = [];\n\n  constructor(private readonly host: TraceHost) {}\n\n  /** Called whenever what the panel shows may have changed. */\n  onChange(listener: () => void): void {\n    this.listeners.push(listener);\n  }\n\n  floor(): Floor | null {\n    return this.host.core()?.floor() ?? null;\n  }\n\n  list(): Trace[] {\n    return [...(this.floor()?.traces ?? [])].sort(\n      (a, b) => a.order - b.order || a.id - b.id,\n    );\n  }\n\n  active(): Trace | null {\n    const traces = this.list();\n    return (\n      traces.find((trace) => trace.id === this.activeId) ??\n      traces[traces.length - 1] ??\n      null\n    );\n  }\n\n  pick(id: number): void {\n    this.activeId = id;\n    this.refresh();\n  }\n\n  isComparing(): boolean {\n    return this.comparing;\n  }\n\n  /** The frame shows for the fit tool. */\n  toolChanged(tool: ToolName): void {\n    this.fitting = tool === \"trace\";\n    this.tool = tool;\n    this.refresh();\n  }\n\n  setCompare(on: boolean): void {\n    this.comparing = on;\n    this.refresh();\n  }\n\n  /** The image's own size in pixels, once loaded. */\n  size(trace: Trace): Size | null {\n    const known = this.sizes.get(trace.file_url);\n    if (known === \"loading\") {\n      return null;\n    }\n    if (known) {\n      return known;\n    }\n    this.sizes.set(trace.file_url, \"loading\");\n    const image = new Image();\n    image.onload = () => {\n      this.sizes.set(trace.file_url, {\n        width: image.naturalWidth,\n        height: image.naturalHeight,\n      });\n      this.refresh();\n    };\n    image.onerror = () => this.sizes.delete(trace.file_url);\n    image.src = trace.file_url;\n    return null;\n  }\n\n  /** The page's size on paper, once read: null for an image with none. */\n  paper(trace: Trace): PageMm | null {\n    const known = this.pages.get(trace.file_url);\n    if (known === \"loading\") {\n      return null;\n    }\n    if (known !== undefined) {\n      return known;\n    }\n    this.pages.set(trace.file_url, \"loading\");\n    fetch(trace.file_url)\n      .then((response) => response.arrayBuffer())\n      .then((buffer) => {\n        const bytes = new Uint8Array(buffer);\n        this.pages.set(trace.file_url, pageMmFromPng(bytes));\n        this.refresh();\n      })\n      .catch(() => this.pages.set(trace.file_url, null));\n    return null;\n  }\n\n  transform(trace: Trace): TraceTransform {\n    return this.live?.id === trace.id\n      ? this.live.transform\n      : traceTransform(trace);\n  }\n\n  /** Redraw the traces and the frame, and tell the panel. */\n  refresh(): void {\n    const floor = this.floor();\n    const renderer = this.host.renderer();\n    if (renderer && floor) {\n      renderer.setCompare(this.comparing ? (this.active()?.id ?? null) : null);\n      // Rooms fade over a plan to draw on, and while any trace is fitted;\n      // magicplan's own drawing already matches them.\n      renderer.setRoomsFaded(\n        [\"trace\", \"align\", \"calibrate\"].includes(this.tool) ||\n          floor.traces.some((trace) => !trace.hidden && !trace.imported),\n      );\n      renderer.syncTraces(floor.traces, this.live ?? undefined);\n      const trace = this.fitting ? this.active() : null;\n      const size = trace ? this.size(trace) : null;\n      renderer.setTraceFrame(\n        trace && size && !trace.hidden\n          ? { transform: this.transform(trace), size, locked: trace.locked }\n          : null,\n      );\n    }\n    for (const listener of this.listeners) {\n      listener();\n    }\n  }\n\n  rows(): TraceRow[] {\n    // Top of the stack first, as Figma lists layers.\n    return this.list()\n      .reverse()\n      .map((trace) => ({\n        id: trace.id,\n        name: trace.name || \"Trace\",\n        imported: trace.imported,\n        locked: trace.locked,\n        hidden: trace.hidden,\n        calibrated: trace.scale_mm_per_px !== null,\n      }));\n  }\n\n  view(): TraceView | null {\n    const trace = this.active();\n    if (!trace) {\n      return null;\n    }\n    const transform = this.transform(trace);\n    const size = this.size(trace);\n    const page = this.paper(trace);\n    return {\n      id: trace.id,\n      name: trace.name || \"Trace\",\n      imported: trace.imported,\n      locked: trace.locked,\n      hidden: trace.hidden,\n      calibrated: trace.scale_mm_per_px !== null,\n      opacity: trace.opacity,\n      rotation: String(\n        Math.round(normalizedDegrees(transform.rotation) * 100) / 100,\n      ),\n      width: size ? ((size.width * transform.scale) / 1000).toFixed(2) : \"\",\n      paper: page !== null,\n      ratio:\n        size && page\n          ? String(\n              Math.round(((size.width * transform.scale) / page.width) * 10) /\n                10,\n            )\n          : \"\",\n    };\n  }\n\n  // --- Edits. Each one is an undo entry and a save. ---\n\n  /** Move, turn or scale the active trace in one step. */\n  place(next: TraceTransform): void {\n    const trace = this.editable();\n    if (!trace) {\n      return;\n    }\n    this.host.core()?.pushHistory();\n    this.write(trace, tracePatch(next, trace));\n  }\n\n  turnTo(degrees: number): void {\n    const trace = this.editable();\n    const size = trace ? this.size(trace) : null;\n    if (!trace || !size || !Number.isFinite(degrees)) {\n      return;\n    }\n    const transform = traceTransform(trace);\n    this.place(\n      turnedAbout(\n        transform,\n        traceCentre(transform, size),\n        degrees - transform.rotation,\n      ),\n    );\n  }\n\n  turnBy(degrees: number): void {\n    const trace = this.active();\n    if (trace) {\n      this.turnTo(traceTransform(trace).rotation + degrees);\n    }\n  }\n\n  /** Free scale: the image this wide on the plan, about its centre. */\n  widthTo(metres: number): void {\n    const trace = this.editable();\n    const size = trace ? this.size(trace) : null;\n    if (!trace || !size || !(metres > 0)) {\n      return;\n    }\n    const transform = traceTransform(trace);\n    this.place(\n      scaledAbout(\n        transform,\n        traceCentre(transform, size),\n        (metres * 1000) / (size.width * transform.scale),\n      ),\n    );\n  }\n\n  /** Scale to 1:n, the page's size on paper times n, about the image's centre. */\n  ratioTo(n: number): void {\n    const trace = this.editable();\n    const size = trace ? this.size(trace) : null;\n    const page = trace ? this.paper(trace) : null;\n    if (!trace || !size || !page || !(n > 0)) {\n      return;\n    }\n    const transform = traceTransform(trace);\n    this.place(\n      scaledAbout(\n        transform,\n        traceCentre(transform, size),\n        (page.width * n) / (size.width * transform.scale),\n      ),\n    );\n  }\n\n  calibrate(a: Point, b: Point, lengthMm: number): void {\n    const trace = this.editable();\n    const next = trace\n      ? calibrated(traceTransform(trace), a, b, lengthMm)\n      : null;\n    if (next) {\n      this.place(next);\n    }\n  }\n\n  /** Arrow keys: screen pixels, whichever way the plan is turned. */\n  nudge(dxPx: number, dyPx: number): void {\n    const trace = this.editable();\n    if (!trace) {\n      return;\n    }\n    const now = Date.now();\n    if (\n      !this.nudged ||\n      this.nudged.id !== trace.id ||\n      now - this.nudged.at > NUDGE_RUN_MS\n    ) {\n      this.host.core()?.pushHistory();\n    }\n    this.nudged = { id: trace.id, at: now };\n    const wpp = this.host.worldPerPixel();\n    const turn = (-this.host.planRotation() * Math.PI) / 180;\n    const dx = (dxPx * Math.cos(turn) - dyPx * Math.sin(turn)) * wpp;\n    const dy = (dxPx * Math.sin(turn) + dyPx * Math.cos(turn)) * wpp;\n    this.write(trace, tracePatch(moved(traceTransform(trace), dx, dy), trace));\n  }\n\n  /** Opacity, lock, hide or name: an undo entry and a save. */\n  update(\n    id: number,\n    fields: Partial<Pick<Trace, \"opacity\" | \"locked\" | \"hidden\" | \"name\">>,\n  ): void {\n    const trace = this.list().find((candidate) => candidate.id === id);\n    if (!trace) {\n      return;\n    }\n    this.host.core()?.pushHistory();\n    this.write(trace, fields);\n  }\n\n  /** The opacity slider while it's dragged: shown, not yet an edit. */\n  previewOpacity(id: number, opacity: number): void {\n    const floor = this.floor();\n    const trace = floor?.traces.find((candidate) => candidate.id === id);\n    if (floor && trace) {\n      this.host\n        .renderer()\n        ?.syncTraces(\n          floor.traces.map((row) =>\n            row === trace ? { ...row, opacity } : row,\n          ),\n        );\n    }\n  }\n\n  remove(id: number): void {\n    const core = this.host.core();\n    const floor = this.floor();\n    const trace = floor?.traces.find((candidate) => candidate.id === id);\n    if (!core || !floor || !trace) {\n      return;\n    }\n    core.pushHistory();\n    floor.traces = floor.traces.filter((candidate) => candidate !== trace);\n    this.save(trace.id, trace.url, { deleted: true }, true);\n    this.refresh();\n  }\n\n  /**\n   * Upload a plan, or take one of the project's documents, as a new trace on\n   * top, laid in the middle of the view.\n   */\n  add(file: File | number, page = 1): Promise<Trace | null> {\n    const core = this.host.core();\n    const floor = this.floor();\n    if (!core || !floor) {\n      return Promise.resolve(null);\n    }\n    const captured = core.captureSnapshot();\n    return uploadTrace(core.design.traces_url, floor.id, file, page)\n      .then((trace) => this.loaded(trace))\n      .then((trace) => {\n        const transform = traceTransform(trace);\n        const size = this.size(trace);\n        if (size) {\n          const [cx, cy] = traceCentre(transform, size);\n          const [vx, vy] = this.host.centre();\n          // Only where it sits: an uncalibrated plan keeps no scale.\n          const placed = tracePatch(moved(transform, vx - cx, vy - cy));\n          trace.offset_x_mm = placed.offset_x_mm;\n          trace.offset_y_mm = placed.offset_y_mm;\n          this.save(trace.id, trace.url, {\n            offset_x_mm: trace.offset_x_mm,\n            offset_y_mm: trace.offset_y_mm,\n          });\n        }\n        floor.traces.push(trace);\n        core.pushCapturedSnapshot(captured);\n        this.activeId = trace.id;\n        this.refresh();\n        return trace;\n      });\n  }\n\n  /** Resolves once the image's size is known, so it can be placed. */\n  private loaded(trace: Trace): Promise<Trace> {\n    return new Promise((resolve) => {\n      const image = new Image();\n      image.onload = () => {\n        this.sizes.set(trace.file_url, {\n          width: image.naturalWidth,\n          height: image.naturalHeight,\n        });\n        resolve(trace);\n      };\n      image.onerror = () => resolve(trace);\n      image.src = trace.file_url;\n    });\n  }\n\n  /** Undo and redo reconcile the server with what they restored. */\n  persist(patches: TracePatch[]): void {\n    for (const patch of patches) {\n      this.save(patch.id, patch.url, patch.body, true);\n    }\n    if (!this.list().some((trace) => trace.id === this.activeId)) {\n      this.activeId = null;\n    }\n    this.refresh();\n  }\n\n  /** The top visible trace under a point on the plan. */\n  traceAt(point: Point): Trace | null {\n    for (const trace of this.list().reverse()) {\n      const size = this.size(trace);\n      if (\n        !trace.hidden &&\n        size &&\n        insidePolygon(point, traceCorners(this.transform(trace), size))\n      ) {\n        return trace;\n      }\n    }\n    return null;\n  }\n\n  houseDegrees(): number {\n    const scene = this.host.core()?.scene();\n    return scene ? (houseAngle(scene) * 180) / Math.PI : 0;\n  }\n\n  /** What the fitting tools see. */\n  tools(): TraceTools {\n    return {\n      active: () => {\n        const trace = this.active();\n        if (!trace || trace.hidden) {\n          return null;\n        }\n        return {\n          transform: this.transform(trace),\n          size: this.size(trace),\n          locked: trace.locked,\n        };\n      },\n      pickAt: (point) => {\n        const trace = this.traceAt(point);\n        if (trace) {\n          this.pick(trace.id);\n        }\n        return trace !== null;\n      },\n      houseDegrees: () => this.houseDegrees(),\n      begin: () => {\n        const trace = this.editable();\n        const core = this.host.core();\n        if (trace && core) {\n          this.captured = core.captureSnapshot();\n          this.live = { id: trace.id, transform: traceTransform(trace) };\n        }\n      },\n      live: (transform) => {\n        if (this.live) {\n          this.live = { id: this.live.id, transform };\n          this.refresh();\n        }\n      },\n      commit: () => {\n        const live = this.live;\n        const captured = this.captured;\n        this.live = null;\n        this.captured = null;\n        const trace = this.list().find((row) => row.id === live?.id);\n        if (live && captured && trace) {\n          const patch = tracePatch(live.transform, trace);\n          const before = tracePatch(traceTransform(trace), trace);\n          if (JSON.stringify(patch) !== JSON.stringify(before)) {\n            this.host.core()?.pushCapturedSnapshot(captured);\n            this.write(trace, patch);\n            return;\n          }\n        }\n        this.refresh();\n      },\n      revert: () => {\n        this.live = null;\n        this.captured = null;\n        this.refresh();\n      },\n      align: (from, to) => {\n        const trace = this.editable();\n        const next = trace ? aligned(traceTransform(trace), from, to) : null;\n        if (next) {\n          this.place(next);\n        }\n      },\n      aligned: (from, to) => {\n        const trace = this.active();\n        return trace ? aligned(traceTransform(trace), from, to) : null;\n      },\n      say: (hint) => this.host.say(hint),\n      cursor: (cursor) => this.host.cursor(cursor),\n      done: () => this.host.setTool(\"trace\"),\n      length: (mm) => formatLengthM(mm),\n    };\n  }\n\n  /** The active trace, unless locked or hidden; says why not. */\n  private editable(): Trace | null {\n    const trace = this.active();\n    if (!trace) {\n      this.host.say(\"Upload a plan to trace first.\");\n      return null;\n    }\n    if (trace.locked) {\n      this.host.say(\n        `${trace.name || \"This trace\"} is locked. Unlock it to move it.`,\n      );\n      return null;\n    }\n    if (trace.hidden) {\n      this.host.say(\n        `${trace.name || \"This trace\"} is hidden. Show it to move it.`,\n      );\n      return null;\n    }\n    return trace;\n  }\n\n  private write(trace: Trace, fields: Partial<Trace>): void {\n    Object.assign(trace, fields);\n    this.save(trace.id, trace.url, fields);\n    this.refresh();\n  }\n\n  /** Saves batch per trace for a moment, so a held arrow is one request. */\n  private save(\n    id: number,\n    url: string,\n    body: Record<string, unknown>,\n    now = false,\n  ): void {\n    const waiting = this.pending.get(id);\n    if (waiting) {\n      window.clearTimeout(waiting.timer);\n    }\n    const merged = { ...waiting?.body, ...body };\n    const flush = () => {\n      this.pending.delete(id);\n      const send = () => patchTrace(url, merged);\n      const next = this.writes.then(send, send);\n      this.writes = next.catch((error: unknown) => this.host.fail(error));\n    };\n    if (now) {\n      flush();\n      return;\n    }\n    this.pending.set(id, {\n      url,\n      body: merged,\n      timer: window.setTimeout(flush, SAVE_DELAY_MS),\n    });\n  }\n\n  /** Send anything still waiting, as the page closes. */\n  flush(): void {\n    for (const [id, waiting] of [...this.pending]) {\n      window.clearTimeout(waiting.timer);\n      this.save(id, waiting.url, {}, true);\n    }\n  }\n\n  hasUnsaved(): boolean {\n    return this.pending.size > 0;\n  }\n\n  documentsUrl(): string {\n    return this.host.core()?.design.documents_url ?? \"\";\n  }\n}\n\n/** The side panel's copy of the floor's traces, and what it can do. Spread\n * into the editor component. */\nexport interface TracePanel {\n  traceRows: TraceRow[];\n  traceView: TraceView | null;\n  traceCompare: boolean;\n  traceUploading: boolean;\n  /** The \"From Documents\u2026\" list. */\n  traceDocuments: { open: boolean; loading: boolean; rows: ProjectDocument[] };\n  showTraces(): void;\n  uploadTraceFile(event: Event): void;\n  openTraceDocuments(): void;\n  closeTraceDocuments(): void;\n  traceFromDocument(id: number, page?: number): void;\n  addTrace(source: File | number, page?: number): void;\n  pickTrace(id: number): void;\n  toggleTraceHidden(id: number): void;\n  toggleTraceLocked(id: number): void;\n  previewTraceOpacity(value: string): void;\n  setTraceOpacity(value: string): void;\n  setTraceRotation(value: string): void;\n  turnTrace(degrees: number): void;\n  setTraceWidth(value: string): void;\n  setTraceRatio(value: string): void;\n  removeTrace(id: number): void;\n  toggleTraceCompare(): void;\n  fittingTrace(): boolean;\n}\n\ninterface PanelHost extends TracePanel {\n  tool: ToolName;\n  setTool(name: ToolName): void;\n  fail(error: unknown): void;\n}\n\nexport function tracePanel(desk: TraceDesk): TracePanel {\n  return {\n    traceRows: [],\n    traceView: null,\n    traceCompare: false,\n    traceUploading: false,\n    traceDocuments: { open: false, loading: false, rows: [] },\n\n    showTraces(this: PanelHost) {\n      this.traceRows = desk.rows();\n      this.traceView = desk.view();\n      this.traceCompare = desk.isComparing();\n    },\n\n    uploadTraceFile(this: PanelHost, event: Event) {\n      const input = event.target;\n      if (!(input instanceof HTMLInputElement)) {\n        return;\n      }\n      const file = input.files?.[0];\n      input.value = \"\";\n      if (file) {\n        this.addTrace(file);\n      }\n    },\n\n    openTraceDocuments(this: PanelHost) {\n      const url = desk.documentsUrl();\n      if (!url) {\n        return;\n      }\n      this.traceDocuments = { open: true, loading: true, rows: [] };\n      projectDocuments(url)\n        .then((rows) => {\n          this.traceDocuments = { open: true, loading: false, rows };\n        })\n        .catch((error: unknown) => {\n          this.traceDocuments = { open: false, loading: false, rows: [] };\n          this.fail(error);\n        });\n    },\n\n    closeTraceDocuments(this: PanelHost) {\n      this.traceDocuments = { ...this.traceDocuments, open: false };\n    },\n\n    traceFromDocument(this: PanelHost, id: number, page = 1) {\n      this.closeTraceDocuments();\n      this.addTrace(id, page);\n    },\n\n    addTrace(this: PanelHost, source: File | number, page = 1) {\n      this.traceUploading = true;\n      desk\n        .add(source, page)\n        .then((trace) => {\n          if (!trace) {\n            return;\n          }\n          // With walls to line it up with, align; on a blank floor, scale it.\n          const walls = desk.floor()?.scene.walls.length ?? 0;\n          this.setTool(walls > 0 ? \"align\" : \"calibrate\");\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.traceUploading = false;\n        });\n    },\n\n    pickTrace(this: PanelHost, id: number) {\n      desk.pick(id);\n    },\n\n    toggleTraceHidden(this: PanelHost, id: number) {\n      const row = this.traceRows.find((candidate) => candidate.id === id);\n      if (row) {\n        desk.update(id, { hidden: !row.hidden });\n      }\n    },\n\n    toggleTraceLocked(this: PanelHost, id: number) {\n      const row = this.traceRows.find((candidate) => candidate.id === id);\n      if (row) {\n        desk.update(id, { locked: !row.locked });\n      }\n    },\n\n    previewTraceOpacity(this: PanelHost, value: string) {\n      if (this.traceView) {\n        desk.previewOpacity(this.traceView.id, Number(value));\n      }\n    },\n\n    setTraceOpacity(this: PanelHost, value: string) {\n      const opacity = Math.round(Number(value));\n      if (this.traceView && opacity >= 0 && opacity <= 100) {\n        desk.update(this.traceView.id, { opacity });\n      }\n    },\n\n    setTraceRotation(this: PanelHost, value: string) {\n      const degrees = Number(value.replace(\"\u00B0\", \"\").trim());\n      if (value.trim() !== \"\" && Number.isFinite(degrees)) {\n        desk.turnTo(degrees);\n      }\n      this.showTraces();\n    },\n\n    turnTrace(this: PanelHost, degrees: number) {\n      desk.turnBy(degrees);\n    },\n\n    setTraceWidth(this: PanelHost, value: string) {\n      const metres = Number(value.replace(/m$/i, \"\").trim());\n      if (metres > 0) {\n        desk.widthTo(metres);\n      }\n      this.showTraces();\n    },\n\n    setTraceRatio(this: PanelHost, value: string) {\n      const n = Number(value.replace(/^1\\s*:/, \"\").trim());\n      if (n > 0) {\n        desk.ratioTo(n);\n      }\n      this.showTraces();\n    },\n\n    removeTrace(this: PanelHost, id: number) {\n      desk.remove(id);\n    },\n\n    toggleTraceCompare(this: PanelHost) {\n      desk.setCompare(!desk.isComparing());\n    },\n\n    fittingTrace(this: PanelHost) {\n      return (\n        this.tool === \"trace\" ||\n        this.tool === \"align\" ||\n        this.tool === \"calibrate\"\n      );\n    },\n  };\n}\n", "import { OverlaySpec } from \"../overlay\";\nimport { AnnotationGeometry, Point } from \"../scene\";\nimport { Tool, ToolContext } from \"./types\";\n\n/** Place EEM annotations: point = one click; line/area = click vertices,\n * double-click (or Enter via finish) to complete, Esc to abort. */\nexport function annotateTool(): Tool {\n  let vertices: Point[] = [];\n\n  const preview = (ctx: ToolContext, cursor: Point | null): void => {\n    const specs: OverlaySpec[] = [];\n    const points = cursor ? [...vertices, cursor] : vertices;\n    for (let i = 1; i < points.length; i++) {\n      const a = points[i - 1];\n      const b = points[i];\n      if (a && b) {\n        specs.push({ kind: \"line\", a, b, thickness: 80 });\n      }\n    }\n    if (ctx.annotationMode() === \"area\" && points.length > 2) {\n      const first = points[0];\n      const last = points[points.length - 1];\n      if (first && last) {\n        specs.push({ kind: \"line\", a: last, b: first, thickness: 40 });\n      }\n    }\n    for (const vertex of vertices) {\n      specs.push({ kind: \"marker\", at: vertex, snap: \"endpoint\" });\n    }\n    if (cursor) {\n      specs.push({ kind: \"marker\", at: cursor, snap: \"none\" });\n    }\n    ctx.preview(specs);\n  };\n\n  const complete = (ctx: ToolContext): void => {\n    const mode = ctx.annotationMode();\n    let geometry: AnnotationGeometry | null = null;\n    if (mode === \"line\" && vertices.length >= 2) {\n      geometry = { type: \"line\", points: vertices };\n    } else if (mode === \"area\" && vertices.length >= 3) {\n      geometry = { type: \"area\", polygon: vertices };\n    }\n    vertices = [];\n    ctx.preview([]);\n    if (geometry) {\n      ctx.createAnnotation(ctx.measureKind(), geometry);\n    }\n  };\n\n  return {\n    name: \"annotate\",\n    hint:\n      \"Pick a measure, then click to place it \u2014 for runs and areas, click\" +\n      \" each corner; double-click, right-click or Enter finishes.\",\n\n    down(point, event, ctx) {\n      if (!ctx.measureKind()) {\n        return;\n      }\n      const snapped = ctx.snap(point, { disabled: event.altKey });\n      if (ctx.annotationMode() === \"point\") {\n        ctx.createAnnotation(ctx.measureKind(), {\n          type: \"point\",\n          at: snapped.point,\n        });\n        return;\n      }\n      const tolerance = 12 * ctx.worldPerPixel();\n      // Close an area by clicking back on its first vertex.\n      const first = vertices[0];\n      if (\n        ctx.annotationMode() === \"area\" &&\n        first &&\n        vertices.length >= 3 &&\n        Math.hypot(snapped.point[0] - first[0], snapped.point[1] - first[1]) <\n          tolerance\n      ) {\n        complete(ctx);\n        return;\n      }\n      // Clicking the last vertex again finishes (and swallows the duplicate\n      // vertex a double-click would otherwise leave behind).\n      const last = vertices[vertices.length - 1];\n      if (\n        last &&\n        Math.hypot(snapped.point[0] - last[0], snapped.point[1] - last[1]) <\n          tolerance\n      ) {\n        complete(ctx);\n        return;\n      }\n      vertices.push(snapped.point);\n      preview(ctx, null);\n    },\n\n    move(point, event, ctx) {\n      if (!ctx.measureKind()) {\n        return;\n      }\n      const snapped = ctx.snap(point, {\n        disabled: event.altKey,\n        ...(vertices.length > 0\n          ? { anchor: vertices[vertices.length - 1] as Point }\n          : {}),\n      });\n      if (ctx.annotationMode() === \"point\") {\n        ctx.preview([\n          { kind: \"marker\", at: snapped.point, snap: snapped.kind },\n        ]);\n        return;\n      }\n      preview(ctx, snapped.point);\n    },\n\n    up() {\n      // Vertices land on pointerdown.\n    },\n\n    finish(ctx) {\n      complete(ctx);\n    },\n\n    busy: () => vertices.length > 0,\n\n    cancel(ctx) {\n      vertices = [];\n      ctx.preview([]);\n    },\n  };\n}\n", "import { OverlaySpec } from \"../overlay\";\nimport { Point } from \"../scene\";\nimport { Tool, ToolContext } from \"./types\";\n\nconst STEPS = [\n  \"Align, 1 of 4: click a point on the trace you can also find on the plan, such as a corner.\",\n  \"Align, 2 of 4: click a second point on the trace, as far from the first as you can.\",\n  \"Align, 3 of 4: click where the first point belongs on the plan.\",\n  \"Align, 4 of 4: click where the second point belongs on the plan. The trace follows the pointer.\",\n];\n\n/** Two points on the trace, then where they belong on the plan: one click\n * moves, turns and scales it, as AutoCAD's ALIGN and QGIS's georeferencer\n * do. Plan points snap to the walls; Alt picks freely. */\nexport function alignTool(): Tool {\n  let picks: Point[] = [];\n\n  const target = (point: Point, event: PointerEvent, ctx: ToolContext) =>\n    picks.length >= 2\n      ? ctx.snap(point, { disabled: event.altKey })\n      : { point, kind: \"none\" as const };\n\n  const show = (\n    ctx: ToolContext,\n    hover?: { point: Point; snapped: boolean },\n  ) => {\n    const specs: OverlaySpec[] = [];\n    picks.forEach((at, index) => {\n      specs.push(\n        { kind: \"marker\", at, snap: index < 2 ? \"endpoint\" : \"wall\" },\n        {\n          kind: \"text\",\n          at,\n          text: index < 2 ? String(index + 1) : `${index - 1}\u2032`,\n        },\n      );\n    });\n    const pairs: [Point | undefined, Point | undefined][] = [\n      [picks[0], picks[2] ?? (picks.length === 2 ? hover?.point : undefined)],\n      [picks[1], picks[3] ?? (picks.length === 3 ? hover?.point : undefined)],\n    ];\n    for (const [from, to] of pairs) {\n      if (from && to) {\n        specs.push({\n          kind: \"line\",\n          a: from,\n          b: to,\n          thickness: 1.5 * ctx.worldPerPixel(),\n        });\n      }\n    }\n    if (hover) {\n      specs.push({\n        kind: \"marker\",\n        at: hover.point,\n        snap: hover.snapped ? \"endpoint\" : \"none\",\n      });\n    }\n    ctx.preview(specs);\n  };\n\n  const reset = (ctx: ToolContext) => {\n    if (picks.length === 3) {\n      ctx.traces.revert();\n    }\n    picks = [];\n    ctx.preview([]);\n    ctx.traces.say(STEPS[0] as string);\n  };\n\n  return {\n    name: \"align\",\n    hint: STEPS[0] as string,\n\n    down(point, event, ctx) {\n      const active = ctx.traces.active();\n      if (!active) {\n        ctx.traces.say(\"Upload a plan to trace first.\");\n        return;\n      }\n      if (active.locked) {\n        ctx.traces.say(\n          \"This trace is locked. Unlock it in the side panel to align it.\",\n        );\n        return;\n      }\n      picks.push(target(point, event, ctx).point);\n      if (picks.length === 3) {\n        ctx.traces.begin();\n      }\n      if (picks.length < 4) {\n        ctx.traces.say(STEPS[picks.length] as string);\n        show(ctx);\n        return;\n      }\n      const [a, b, c, d] = picks as [Point, Point, Point, Point];\n      const next = ctx.traces.aligned([a, b], [c, d]);\n      picks = [];\n      ctx.preview([]);\n      if (!next) {\n        ctx.traces.revert();\n        ctx.traces.say(\n          \"Those points are on top of each other. Pick two points apart, on the trace and on the plan.\",\n        );\n        return;\n      }\n      ctx.traces.live(next);\n      ctx.traces.commit();\n      ctx.traces.done();\n    },\n\n    move(point, event, ctx) {\n      if (picks.length === 0) {\n        return;\n      }\n      const hover = target(point, event, ctx);\n      if (picks.length === 3) {\n        const [a, b, c] = picks as [Point, Point, Point];\n        const next = ctx.traces.aligned([a, b], [c, hover.point]);\n        if (next) {\n          ctx.traces.live(next);\n        }\n      }\n      show(ctx, { point: hover.point, snapped: hover.kind !== \"none\" });\n    },\n\n    up() {\n      // Points land on pointerdown.\n    },\n\n    cancel(ctx) {\n      reset(ctx);\n    },\n  };\n}\n", "import { distance, formatLengthM } from \"../geometry\";\nimport { Point } from \"../scene\";\nimport { Tool } from \"./types\";\n\n/** Two clicks over the trace image, then the editor asks for the feature's\n * real length and rescales the trace so drawn and real agree. */\nexport function calibrateTool(): Tool {\n  let first: Point | null = null;\n\n  return {\n    name: \"calibrate\",\n    hint: \"Click both ends of a feature you know the length of \u2014 a door or a dimension line.\",\n\n    down(point, _event, ctx) {\n      if (!first) {\n        first = point;\n        ctx.preview([{ kind: \"marker\", at: point, snap: \"none\" }]);\n        return;\n      }\n      const a = first;\n      first = null;\n      ctx.preview([]);\n      ctx.requestCalibration(a, point);\n    },\n\n    move(point, _event, ctx) {\n      if (!first) {\n        ctx.preview([{ kind: \"marker\", at: point, snap: \"none\" }]);\n        return;\n      }\n      ctx.preview([\n        { kind: \"line\", a: first, b: point, thickness: 30 },\n        {\n          kind: \"text\",\n          at: [(first[0] + point[0]) / 2, (first[1] + point[1]) / 2],\n          text: formatLengthM(distance(first, point)),\n        },\n        { kind: \"marker\", at: point, snap: \"none\" },\n      ]);\n    },\n\n    up() {\n      // Calibration points land on pointerdown.\n    },\n\n    cancel(ctx) {\n      first = null;\n      ctx.preview([]);\n    },\n  };\n}\n", "import { distance } from \"../geometry\";\nimport { Point } from \"../scene\";\nimport {\n  TraceTransform,\n  moved,\n  rotationTargets,\n  scaledAbout,\n  snapRotation,\n  traceCentre,\n  turnedAbout,\n} from \"../trace\";\nimport { frameOf, hitFrame } from \"../traceframe\";\nimport { Tool } from \"./types\";\n\n/** Within this a turned trace settles square to the page or the house. */\nconst SNAP_DEGREES = 2;\n\n/** Shift turns in these steps, as PowerPoint and Figma do. */\nconst STEP_DEGREES = 15;\n\ntype Drag =\n  | { kind: \"move\"; from: Point; base: TraceTransform }\n  | { kind: \"turn\"; pivot: Point; from: number; base: TraceTransform }\n  | {\n      kind: \"scale\";\n      pivot: Point;\n      from: number;\n      base: TraceTransform;\n      width: number;\n    };\n\nconst CURSORS = [\"nwse-resize\", \"nesw-resize\", \"nwse-resize\", \"nesw-resize\"];\n\n/** Fit a trace by hand, as Chief Architect and PowerPoint fit a picture:\n * drag it to move, a corner to scale it, the round handle to turn it. */\nexport function traceTool(): Tool {\n  let drag: Drag | null = null;\n\n  return {\n    name: \"trace\",\n    hint:\n      \"Drag the trace to move it, a corner to scale it, the round handle to turn it \" +\n      \"(Shift: 15\u00B0 steps). Arrows nudge it, Shift \u00D710.\",\n\n    down(point, event, ctx) {\n      const traces = ctx.traces;\n      const wpp = ctx.worldPerPixel();\n      let active = traces.active();\n      let hit =\n        active?.size && !active.locked\n          ? hitFrame(frameOf(active.transform, active.size, wpp), point, wpp)\n          : null;\n      if (!hit) {\n        // A press on another trace fits that one instead.\n        if (!traces.pickAt(point)) {\n          return;\n        }\n        active = traces.active();\n        hit = { kind: \"inside\" };\n      }\n      if (!active?.size) {\n        return;\n      }\n      if (active.locked) {\n        traces.say(\n          \"This trace is locked. Unlock it in the side panel to move it.\",\n        );\n        return;\n      }\n      const base = active.transform;\n      traces.begin();\n      if (hit.kind === \"inside\") {\n        drag = { kind: \"move\", from: point, base };\n      } else if (hit.kind === \"rotate\") {\n        const pivot = traceCentre(base, active.size);\n        drag = {\n          kind: \"turn\",\n          pivot,\n          from: Math.atan2(point[1] - pivot[1], point[0] - pivot[0]),\n          base,\n        };\n      } else {\n        const corners = frameOf(base, active.size, wpp).corners;\n        const pivot = event.altKey\n          ? traceCentre(base, active.size)\n          : (corners[(hit.index + 2) % 4] as Point);\n        drag = {\n          kind: \"scale\",\n          pivot,\n          from: distance(point, pivot) || 1,\n          base,\n          width: active.size.width,\n        };\n      }\n    },\n\n    move(point, event, ctx) {\n      const traces = ctx.traces;\n      if (!drag) {\n        const active = traces.active();\n        const wpp = ctx.worldPerPixel();\n        const hit =\n          active?.size && !active.locked\n            ? hitFrame(frameOf(active.transform, active.size, wpp), point, wpp)\n            : null;\n        traces.cursor(\n          !hit\n            ? \"default\"\n            : hit.kind === \"inside\"\n              ? \"move\"\n              : hit.kind === \"rotate\"\n                ? \"grab\"\n                : (CURSORS[hit.index] ?? \"move\"),\n        );\n        return;\n      }\n      if (drag.kind === \"move\") {\n        traces.live(\n          moved(drag.base, point[0] - drag.from[0], point[1] - drag.from[1]),\n        );\n        return;\n      }\n      if (drag.kind === \"turn\") {\n        const swept =\n          ((Math.atan2(point[1] - drag.pivot[1], point[0] - drag.pivot[0]) -\n            drag.from) *\n            180) /\n          Math.PI;\n        let target = drag.base.rotation + swept;\n        if (event.shiftKey) {\n          target = Math.round(target / STEP_DEGREES) * STEP_DEGREES;\n        } else if (!event.altKey) {\n          target = snapRotation(\n            target,\n            rotationTargets(traces.houseDegrees()),\n            SNAP_DEGREES,\n          ).degrees;\n        }\n        traces.live(\n          turnedAbout(drag.base, drag.pivot, target - drag.base.rotation),\n        );\n        ctx.preview([\n          {\n            kind: \"text\",\n            at: drag.pivot,\n            text: `${(((target % 360) + 360) % 360).toFixed(1)}\u00B0`,\n          },\n        ]);\n        return;\n      }\n      const factor = Math.max(0.01, distance(point, drag.pivot) / drag.from);\n      const next = scaledAbout(drag.base, drag.pivot, factor);\n      traces.live(next);\n      ctx.preview([\n        {\n          kind: \"text\",\n          at: point,\n          text: `${traces.length(drag.width * next.scale)} wide`,\n        },\n      ]);\n    },\n\n    up(_point, _event, ctx) {\n      if (drag) {\n        drag = null;\n        ctx.preview([]);\n        ctx.traces.commit();\n      }\n    },\n\n    cancel(ctx) {\n      if (drag) {\n        drag = null;\n        ctx.traces.revert();\n      }\n      ctx.preview([]);\n    },\n  };\n}\n", "import { newId } from \"../ids\";\nimport {\n  type OpeningSpot,\n  OPENING_DEFAULTS,\n  openingSpot,\n  pointAlong,\n} from \"../openings\";\nimport { OverlaySpec } from \"../overlay\";\nimport { Tool } from \"./types\";\n\nconst HOVER_TOLERANCE_PX = 24;\n\nfunction ghost(candidate: OpeningSpot, width: number): OverlaySpec[] {\n  const [a, b] = candidate.ends;\n  const from = pointAlong(a, b, candidate.offset);\n  const to = pointAlong(a, b, candidate.offset + width);\n  return [\n    {\n      kind: \"line\",\n      a: from,\n      b: to,\n      thickness: candidate.wall.thickness + 60,\n    },\n    { kind: \"marker\", at: from, snap: \"wall\" },\n    { kind: \"marker\", at: to, snap: \"wall\" },\n  ];\n}\n\n/** Hover a wall to preview the opening sliding along it; click to place.\n * The door/window/opening sub-mode comes from the toolbar via context. */\nexport function openingTool(): Tool {\n  return {\n    name: \"opening\",\n    hint:\n      \"Set the width, then hover a wall and click to place the door or\" +\n      \" window \u2014 Esc to cancel.\",\n\n    down(point, _event, ctx) {\n      const kind = ctx.openingType();\n      const defaults = OPENING_DEFAULTS[kind];\n      const width = ctx.openingWidth();\n      const candidate = openingSpot(\n        point,\n        ctx.scene(),\n        width,\n        HOVER_TOLERANCE_PX * ctx.worldPerPixel(),\n      );\n      if (!candidate) {\n        return;\n      }\n      const id = newId(\"o\");\n      ctx.commit((scene) => {\n        scene.openings.push({\n          id,\n          wall: candidate.wall.id,\n          type: kind,\n          offset: candidate.offset,\n          width,\n          height: defaults.height,\n          sill: defaults.sill,\n          swing: kind === \"door\" ? \"left\" : \"none\",\n          flip: false,\n        });\n      });\n      ctx.select({ type: \"opening\", id });\n    },\n\n    move(point, _event, ctx) {\n      const width = ctx.openingWidth();\n      const candidate = openingSpot(\n        point,\n        ctx.scene(),\n        width,\n        HOVER_TOLERANCE_PX * ctx.worldPerPixel(),\n      );\n      ctx.preview(candidate ? ghost(candidate, width) : []);\n    },\n\n    up() {\n      // Openings commit on pointerdown.\n    },\n\n    cancel(ctx) {\n      ctx.preview([]);\n    },\n  };\n}\n", "import { radiatorBar, radiatorPlacement, roomAt } from \"../emitters\";\nimport { newId } from \"../ids\";\nimport { OverlaySpec } from \"../overlay\";\nimport { Point } from \"../scene\";\nimport { polygonOf } from \"../topology\";\nimport { Tool, ToolContext } from \"./types\";\n\nconst HOVER_TOLERANCE_PX = 24;\n\nfunction ghost(point: Point, ctx: ToolContext): OverlaySpec[] {\n  const draft = ctx.emitter();\n  const scene = ctx.scene();\n  if (draft.kind === \"underfloor\") {\n    const room = roomAt(scene, point);\n    return room ? [{ kind: \"area\", polygon: polygonOf(scene, room) }] : [];\n  }\n  const placed = radiatorPlacement(\n    point,\n    scene,\n    draft.length,\n    HOVER_TOLERANCE_PX * ctx.worldPerPixel(),\n  );\n  const bar =\n    placed &&\n    radiatorBar(scene, {\n      ...draft,\n      id: \"\",\n      room: placed.room.id,\n      wall: placed.wall.id,\n      offset: placed.offset,\n    });\n  return bar\n    ? [{ kind: \"line\", a: bar.from, b: bar.to, thickness: bar.depth }]\n    : [];\n}\n\n/** A radiator goes against the hovered wall, in the room on the pointer's\n * side; underfloor heating goes in the clicked room. What's placed, and its\n * size and type, come from the toolbar. */\nexport function emitterTool(): Tool {\n  return {\n    name: \"emitter\",\n    hint:\n      \"Set the radiator's type and size, then hover a wall on the room's\" +\n      \" side and click to place it. Underfloor: click a room. Esc to cancel.\",\n\n    down(point, _event, ctx) {\n      const draft = ctx.emitter();\n      const scene = ctx.scene();\n      let id = newId(\"e\");\n      if (draft.kind === \"radiator\") {\n        const placed = radiatorPlacement(\n          point,\n          scene,\n          draft.length,\n          HOVER_TOLERANCE_PX * ctx.worldPerPixel(),\n        );\n        if (!placed) {\n          return;\n        }\n        ctx.commit((next) => {\n          next.emitters.push({\n            ...draft,\n            id,\n            room: placed.room.id,\n            wall: placed.wall.id,\n            offset: placed.offset,\n          });\n        });\n      } else {\n        const room = roomAt(scene, point);\n        if (!room) {\n          return;\n        }\n        // One per room: its area says how much of the floor it covers.\n        const existing = scene.emitters.find(\n          (emitter) =>\n            emitter.kind === \"underfloor\" && emitter.room === room.id,\n        );\n        if (existing) {\n          id = existing.id;\n        } else {\n          ctx.commit((next) => {\n            next.emitters.push({ ...draft, id, room: room.id, area: null });\n          });\n        }\n      }\n      ctx.select({ type: \"emitter\", id });\n    },\n\n    move(point, _event, ctx) {\n      ctx.preview(ghost(point, ctx));\n    },\n\n    up() {\n      // Emitters commit on pointerdown.\n    },\n\n    cancel(ctx) {\n      ctx.preview([]);\n    },\n  };\n}\n", "import {\n  fixtureNear,\n  placementAt,\n  startingProps,\n  wallFacing,\n} from \"../fixtures\";\nimport { newId } from \"../ids\";\nimport type { Tool } from \"./types\";\n\n/** How near, in screen pixels, a click takes hold of a fixture or a wall. */\nconst REACH_PX = 16;\n\n/**\n * Click a fixture to select it; click anywhere else to put the kind chosen\n * in the panel there: against a wall, in a room, or at a point outside.\n */\nexport function fixtureTool(): Tool {\n  return {\n    name: \"fixture\",\n    hint: \"Pick a kind, then click a room, a wall or outside to place it. Click a fixture to edit it.\",\n\n    down(point, _event, ctx) {\n      if (ctx.fixtures.assessing()) {\n        ctx.fixtures.assess(point);\n        return;\n      }\n      const reach = REACH_PX * ctx.worldPerPixel();\n      const scene = ctx.scene();\n      const near = fixtureNear(scene, ctx.fixtures.shown(), point, reach);\n      if (near) {\n        ctx.fixtures.select(near.key);\n        return;\n      }\n      const kind = ctx.fixtures.kind();\n      const placed = placementAt(scene, point, reach);\n      ctx.fixtures.add({\n        id: newId(\"fx\"),\n        kind,\n        ...placed,\n        props: {\n          ...startingProps(kind),\n          // On a wall, a heat pump hangs outside it, facing away.\n          ...(kind === \"heat_pump\" && placed.wall\n            ? { facing: wallFacing(scene, placed.wall, point) }\n            : {}),\n        },\n      });\n    },\n\n    move: () => undefined,\n    up: () => undefined,\n    cancel(ctx) {\n      ctx.fixtures.select(null);\n    },\n  };\n}\n", "import { normalizeEmitters } from \"../emitters\";\nimport { normalizeFeatures } from \"../features\";\nimport { distance, formatLengthM } from \"../geometry\";\nimport { normalizeOpenings } from \"../openings\";\nimport { OverlaySpec } from \"../overlay\";\nimport { Point, Scene } from \"../scene\";\nimport { type SnapResult, squareToWalls } from \"../snap\";\nimport { ToolContext } from \"./types\";\n\n/** Click corner after corner, as the room and wall tools do. */\nexport interface PathClicks {\n  points: Point[];\n  /** Clicking the first point again closes the path; the last ends it. */\n  click(point: Point, ctx: ToolContext): \"closed\" | \"ended\" | \"added\";\n  /** The cursor is a point, or a snap result whose kind the marker shows. */\n  preview(\n    ctx: ToolContext,\n    cursor: Point | SnapResult | null,\n    closing: boolean,\n  ): void;\n  reset(ctx: ToolContext): void;\n}\n\n/** Within this many screen pixels, a click lands on a corner already placed. */\nconst SAME_CORNER_PX = 12;\n\nexport function pathClicks(minimumToClose: number): PathClicks {\n  const path: PathClicks = {\n    points: [],\n\n    click(point, ctx) {\n      const tolerance = SAME_CORNER_PX * ctx.worldPerPixel();\n      const first = path.points[0];\n      if (\n        first &&\n        path.points.length >= minimumToClose &&\n        distance(point, first) < tolerance\n      ) {\n        return \"closed\";\n      }\n      // Clicking the last corner again ends the path (and swallows the\n      // duplicate a double-click would otherwise leave behind).\n      const last = path.points[path.points.length - 1];\n      if (last && distance(point, last) < tolerance) {\n        return \"ended\";\n      }\n      path.points.push(point);\n      return \"added\";\n    },\n\n    preview(ctx, pointer, closing) {\n      const specs: OverlaySpec[] = [];\n      const cursor = pointer && \"kind\" in pointer ? pointer.point : pointer;\n      const snap = pointer && \"kind\" in pointer ? pointer.kind : \"none\";\n      const points = cursor ? [...path.points, cursor] : path.points;\n      const scene = ctx.scene();\n      for (let i = 1; i < points.length; i++) {\n        const a = points[i - 1];\n        const b = points[i];\n        if (a && b) {\n          specs.push({\n            kind: \"line\",\n            a,\n            b,\n            thickness: 60,\n            square: squareToWalls(a, b, scene),\n          });\n        }\n      }\n      const last = path.points[path.points.length - 1];\n      if (cursor && last && distance(last, cursor) > 0) {\n        specs.push({\n          kind: \"text\",\n          at: [(last[0] + cursor[0]) / 2, (last[1] + cursor[1]) / 2],\n          text: formatLengthM(distance(last, cursor)),\n        });\n      }\n      const first = points[0];\n      const end = points[points.length - 1];\n      if (closing && points.length > 2 && first && end) {\n        specs.push({ kind: \"line\", a: end, b: first, thickness: 30 });\n      }\n      for (const vertex of path.points) {\n        specs.push({ kind: \"marker\", at: vertex, snap: \"endpoint\" });\n      }\n      if (cursor) {\n        // Only the floor below's catch shows here; the rest read off the line.\n        specs.push({\n          kind: \"marker\",\n          at: cursor,\n          snap: snap === \"below\" ? \"below\" : \"none\",\n        });\n      }\n      ctx.preview(specs);\n    },\n\n    reset(ctx) {\n      path.points = [];\n      ctx.preview([]);\n    },\n  };\n  return path;\n}\n\n/** Snapping while drawing: Shift squares up from the last corner, Alt frees. */\nexport function drawingSnap(event: PointerEvent, anchor: Point | undefined) {\n  return {\n    disabled: event.altKey,\n    ortho: event.shiftKey,\n    ...(anchor ? { anchor } : {}),\n  };\n}\n\n/** Commit a drawing edit, warning of any door, window or radiator it took\n * out: a wall drawn into the middle of one can leave it too little wall. */\nexport function commitDrawing(\n  ctx: ToolContext,\n  draw: (scene: Scene) => void,\n): void {\n  const lost: string[] = [];\n  ctx.commit((scene) => {\n    const before = [\n      ...scene.openings.map((opening) => [opening.id, opening.type] as const),\n      ...scene.emitters\n        .filter((emitter) => emitter.kind === \"radiator\")\n        .map((emitter) => [emitter.id, \"radiator\"] as const),\n    ];\n    draw(scene);\n    normalizeOpenings(scene);\n    normalizeEmitters(scene);\n    normalizeFeatures(scene);\n    const kept = new Set([\n      ...scene.openings.map((opening) => opening.id),\n      ...scene.emitters.map((emitter) => emitter.id),\n    ]);\n    for (const [id, what] of before) {\n      if (!kept.has(id)) {\n        lost.push(what);\n      }\n    }\n  });\n  if (lost.length > 0) {\n    ctx.warn(tookOut(lost));\n  }\n}\n\nfunction tookOut(lost: readonly string[]): string {\n  const counts = new Map<string, number>();\n  for (const what of lost) {\n    counts.set(what, (counts.get(what) ?? 0) + 1);\n  }\n  const parts = [...counts].map(([what, count]) =>\n    count > 1\n      ? `${count} ${what}s`\n      : `${what === \"opening\" ? \"an\" : \"a\"} ${what}`,\n  );\n  const list =\n    parts.length > 1\n      ? `${parts.slice(0, -1).join(\", \")} and ${parts[parts.length - 1]}`\n      : parts[0];\n  const one = lost.length === 1;\n  return `That took out ${list}: too little of ${one ? \"its\" : \"their\"} wall was left. Undo to put ${one ? \"it\" : \"them\"} back.`;\n}\n", "import { emptySpaceAt, insertRoom, placeRoom } from \"../topology\";\nimport { commitDrawing, drawingSnap, pathClicks } from \"./path\";\nimport { Tool, ToolContext } from \"./types\";\n\n/** Draw a room's walls corner by corner (snapping to corners and walls),\n * closing on the first corner or with a double-click; the space they enclose\n * becomes the room. A click inside an empty space makes it a room. */\nexport function roomTool(): Tool {\n  const path = pathClicks(3);\n\n  const complete = (ctx: ToolContext): void => {\n    const polygon = path.points;\n    path.reset(ctx);\n    if (polygon.length < 3) {\n      return;\n    }\n    let id: string | null = null;\n    commitDrawing(ctx, (scene) => {\n      id = insertRoom(scene, polygon);\n    });\n    if (id) {\n      ctx.select({ type: \"room\", id });\n    }\n  };\n\n  return {\n    name: \"room\",\n    hint:\n      \"Click each corner of the room \u2014 Shift squares it up with the house;\" +\n      \" click the first corner again, double-click, right-click or Enter\" +\n      \" closes it. Click inside an empty space to make it a room.\",\n\n    down(point, event, ctx) {\n      const snapped = ctx.snap(\n        point,\n        drawingSnap(event, path.points[path.points.length - 1]),\n      );\n      const free = snapped.kind !== \"endpoint\" && snapped.kind !== \"wall\";\n      if (\n        path.points.length === 0 &&\n        free &&\n        emptySpaceAt(ctx.scene(), point)\n      ) {\n        let id: string | null = null;\n        ctx.commit((scene) => {\n          id = placeRoom(scene, point);\n        });\n        if (id) {\n          ctx.select({ type: \"room\", id });\n        }\n        return;\n      }\n      if (path.click(snapped.point, ctx) !== \"added\") {\n        complete(ctx);\n        return;\n      }\n      path.preview(ctx, null, true);\n    },\n\n    move(point, event, ctx) {\n      path.preview(\n        ctx,\n        ctx.snap(\n          point,\n          drawingSnap(event, path.points[path.points.length - 1]),\n        ),\n        true,\n      );\n    },\n\n    up() {\n      // Vertices land on pointerdown.\n    },\n\n    finish(ctx) {\n      complete(ctx);\n    },\n\n    cancel(ctx) {\n      path.reset(ctx);\n    },\n  };\n}\n", "import { Point } from \"../scene\";\nimport { chordThrough, polygonOf, roomAt, splitRoom } from \"../topology\";\nimport { commitDrawing, drawingSnap } from \"./path\";\nimport { Tool, ToolContext } from \"./types\";\n\n/** Split a room in two: click two points on the line the new wall takes, and\n * it runs on to the room's walls either side. */\nexport function splitTool(): Tool {\n  let first: Point | null = null;\n\n  const roomFor = (ctx: ToolContext, a: Point, b: Point) =>\n    roomAt(ctx.scene(), [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]) ??\n    roomAt(ctx.scene(), a);\n\n  return {\n    name: \"split\",\n    hint:\n      \"Click two points on the line to split a room along \u2014 Shift squares it\" +\n      \" up with the house. The new wall runs on to the room's walls.\",\n\n    down(point, event, ctx) {\n      const snapped = ctx.snap(point, drawingSnap(event, first ?? undefined));\n      if (!first) {\n        first = snapped.point;\n        ctx.preview([{ kind: \"marker\", at: first, snap: snapped.kind }]);\n        return;\n      }\n      const from = first;\n      first = null;\n      ctx.preview([]);\n      const room = roomFor(ctx, from, snapped.point);\n      if (!room) {\n        return;\n      }\n      let made: string | null = null;\n      commitDrawing(ctx, (scene) => {\n        made = splitRoom(scene, room.id, from, snapped.point);\n      });\n      if (made) {\n        ctx.select({ type: \"room\", id: made });\n      }\n    },\n\n    move(point, event, ctx) {\n      const snapped = ctx.snap(point, drawingSnap(event, first ?? undefined));\n      if (!first) {\n        ctx.preview([\n          { kind: \"marker\", at: snapped.point, snap: snapped.kind },\n        ]);\n        return;\n      }\n      const room = roomFor(ctx, first, snapped.point);\n      const chord = room\n        ? chordThrough(polygonOf(ctx.scene(), room), first, snapped.point)\n        : null;\n      ctx.preview([\n        ...(room\n          ? [{ kind: \"area\" as const, polygon: polygonOf(ctx.scene(), room) }]\n          : []),\n        chord\n          ? { kind: \"line\", a: chord[0], b: chord[1], thickness: 100 }\n          : { kind: \"line\", a: first, b: snapped.point, thickness: 30 },\n        { kind: \"marker\", at: first, snap: \"endpoint\" },\n      ]);\n    },\n\n    up() {\n      // Points land on pointerdown.\n    },\n\n    cancel(ctx) {\n      first = null;\n      ctx.preview([]);\n    },\n  };\n}\n", "// A proposal against the house as it is, as Revit's phases show it: what's\n// existing, what's new, and what's demolished. Matched by where things are\n// rather than by id, so a wall split to take an extension stays existing and a\n// scene drafted from an architect's drawing still lines up.\n\nimport { findFaces, measure, overlapArea } from \"./faces\";\nimport { distance, polygonArea } from \"./geometry\";\nimport { pointAlong, wallSegments } from \"./openings\";\nimport type { Opening, Point, Scene } from \"./scene\";\nimport { polygonOf, wallEnds, wallKinds } from \"./topology\";\n\nexport type Phase = \"existing\" | \"new\" | \"demolished\";\n\nexport interface PhasedWall {\n  a: Point;\n  b: Point;\n  thickness: number;\n  phase: Phase;\n  internal: boolean;\n}\n\nexport interface PhasedOpening {\n  a: Point;\n  b: Point;\n  thickness: number;\n  phase: Phase;\n}\n\nexport interface Phasing {\n  walls: PhasedWall[];\n  openings: PhasedOpening[];\n  /** Rooms mostly outside the house as it is. */\n  newRooms: string[];\n  /** mm of wall built and taken down. */\n  built: number;\n  demolished: number;\n  /** mm\u00B2 of rooms gained over the house as it is. */\n  addedArea: number;\n}\n\n/** How far apart, mm, two walls can run and still be the same wall. */\nconst ALONG_MM = 60;\n/** Pieces shorter than this, mm, are where walls meet, not a change. */\nconst PIECE_MM = 80;\nconst OPENING_MM = 100;\n/** New or taken down, but shorter than this, mm: tidying, not a change. */\nconst NOISE_MM = 150;\n\ntype Interval = [number, number];\n\nfunction frame(a: Point, b: Point) {\n  const length = distance(a, b);\n  const ux = length ? (b[0] - a[0]) / length : 1;\n  const uy = length ? (b[1] - a[1]) / length : 0;\n  return {\n    length,\n    along: (p: Point) => (p[0] - a[0]) * ux + (p[1] - a[1]) * uy,\n    off: (p: Point) => (p[0] - a[0]) * uy - (p[1] - a[1]) * ux,\n  };\n}\n\n/** The stretches of a\u2192b that `others` run along. */\nfunction covered(a: Point, b: Point, others: readonly [Point, Point][]) {\n  const f = frame(a, b);\n  const found: Interval[] = [];\n  for (const [p, q] of others) {\n    if (Math.abs(f.off(p)) > ALONG_MM || Math.abs(f.off(q)) > ALONG_MM) {\n      continue;\n    }\n    const lo = Math.max(0, Math.min(f.along(p), f.along(q)));\n    const hi = Math.min(f.length, Math.max(f.along(p), f.along(q)));\n    if (hi - lo > 0) {\n      found.push([lo, hi]);\n    }\n  }\n  found.sort((x, y) => x[0] - y[0]);\n  const merged: Interval[] = [];\n  for (const piece of found) {\n    const last = merged[merged.length - 1];\n    if (last && piece[0] <= last[1] + 1) {\n      last[1] = Math.max(last[1], piece[1]);\n    } else {\n      merged.push([...piece]);\n    }\n  }\n  return merged;\n}\n\n/** [from, to] split into the stretches `inside` covers and the rest. */\nfunction split(\n  from: number,\n  to: number,\n  inside: readonly Interval[],\n): { lo: number; hi: number; in: boolean }[] {\n  const pieces: { lo: number; hi: number; in: boolean }[] = [];\n  let cursor = from;\n  for (const [lo, hi] of inside) {\n    const start = Math.max(lo, from);\n    const end = Math.min(hi, to);\n    if (end <= start) {\n      continue;\n    }\n    if (start > cursor) {\n      pieces.push({ lo: cursor, hi: start, in: false });\n    }\n    pieces.push({ lo: start, hi: end, in: true });\n    cursor = end;\n  }\n  if (cursor < to) {\n    pieces.push({ lo: cursor, hi: to, in: false });\n  }\n  // A sliver where walls meet takes the phase of the longer piece beside it.\n  const real = pieces.filter((piece) => piece.hi - piece.lo >= 1);\n  const size = (piece?: { lo: number; hi: number }) =>\n    piece ? piece.hi - piece.lo : 0;\n  real.forEach((piece, index) => {\n    const before = real[index - 1];\n    const after = real[index + 1];\n    const beside = size(before) >= size(after) ? before : after;\n    if (beside && size(piece) < PIECE_MM && size(beside) >= PIECE_MM) {\n      piece.in = beside.in;\n    }\n  });\n  const joined: typeof pieces = [];\n  for (const piece of real) {\n    const last = joined[joined.length - 1];\n    if (last && last.in === piece.in) {\n      last.hi = piece.hi;\n    } else {\n      joined.push({ ...piece });\n    }\n  }\n  return joined;\n}\n\n/** How much of a\u2192b runs along `others`, mm. */\nexport function coveredLength(\n  a: Point,\n  b: Point,\n  others: readonly [Point, Point][],\n): number {\n  return covered(a, b, others).reduce((total, [lo, hi]) => total + hi - lo, 0);\n}\n\nexport function segmentsOf(scene: Scene): [Point, Point][] {\n  return scene.walls.flatMap((wall) => {\n    const ends = wallEnds(scene, wall);\n    return ends ? [ends] : [];\n  });\n}\n\nfunction openingSpan(scene: Scene, opening: Opening) {\n  const wall = scene.walls.find((candidate) => candidate.id === opening.wall);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!wall || !ends) {\n    return null;\n  }\n  const a = pointAlong(ends[0], ends[1], opening.offset);\n  const b = pointAlong(ends[0], ends[1], opening.offset + opening.width);\n  return {\n    a,\n    b,\n    middle: [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2] as Point,\n    thickness: wall.thickness,\n    type: opening.type,\n    width: opening.width,\n  };\n}\n\ntype Span = NonNullable<ReturnType<typeof openingSpan>>;\n\nfunction sameOpening(one: Span, two: Span): boolean {\n  return (\n    one.type === two.type &&\n    distance(one.middle, two.middle) <= OPENING_MM &&\n    Math.abs(one.width - two.width) <= OPENING_MM\n  );\n}\n\nfunction roomsArea(scene: Scene): number {\n  return scene.rooms.reduce(\n    (total, room) => total + polygonArea(polygonOf(scene, room)),\n    0,\n  );\n}\n\n/** `proposed` against `asIs`, a floor of each at the same level. */\nexport function phasing(asIs: Scene, proposed: Scene): Phasing {\n  const before = segmentsOf(asIs);\n  const after = segmentsOf(proposed);\n  const kinds = wallKinds(proposed);\n  const walls: PhasedWall[] = [];\n  let built = 0;\n  let demolished = 0;\n\n  for (const wall of proposed.walls) {\n    const ends = wallEnds(proposed, wall);\n    if (!ends) {\n      continue;\n    }\n    const f = frame(ends[0], ends[1]);\n    const old = covered(ends[0], ends[1], before);\n    const internal = kinds.get(wall.id) === \"INTERNAL\";\n    const mine = proposed.openings.filter((o) => o.wall === wall.id);\n    for (const [from, to] of wallSegments(ends[0], ends[1], mine)) {\n      for (const piece of split(f.along(from), f.along(to), old)) {\n        const phase =\n          piece.in || piece.hi - piece.lo < NOISE_MM ? \"existing\" : \"new\";\n        if (phase === \"new\") {\n          built += piece.hi - piece.lo;\n        }\n        walls.push({\n          a: pointAlong(ends[0], ends[1], piece.lo),\n          b: pointAlong(ends[0], ends[1], piece.hi),\n          thickness: wall.thickness,\n          phase,\n          internal,\n        });\n      }\n    }\n  }\n\n  for (const wall of asIs.walls) {\n    const ends = wallEnds(asIs, wall);\n    if (!ends) {\n      continue;\n    }\n    const kept = covered(ends[0], ends[1], after);\n    for (const piece of split(0, frame(ends[0], ends[1]).length, kept)) {\n      if (piece.in || piece.hi - piece.lo < NOISE_MM) {\n        continue;\n      }\n      demolished += piece.hi - piece.lo;\n      walls.push({\n        a: pointAlong(ends[0], ends[1], piece.lo),\n        b: pointAlong(ends[0], ends[1], piece.hi),\n        thickness: wall.thickness,\n        phase: \"demolished\",\n        internal: false,\n      });\n    }\n  }\n\n  const oldSpans = asIs.openings.flatMap((o) => openingSpan(asIs, o) ?? []);\n  const newSpans = proposed.openings.flatMap(\n    (o) => openingSpan(proposed, o) ?? [],\n  );\n  const openings: PhasedOpening[] = [\n    ...newSpans.map((span) => ({\n      a: span.a,\n      b: span.b,\n      thickness: span.thickness,\n      phase: oldSpans.some((old) => sameOpening(old, span))\n        ? (\"existing\" as const)\n        : (\"new\" as const),\n    })),\n    ...oldSpans\n      .filter((old) => !newSpans.some((span) => sameOpening(old, span)))\n      .map((old) => ({\n        a: old.a,\n        b: old.b,\n        thickness: old.thickness,\n        phase: \"demolished\" as const,\n      })),\n  ];\n\n  const outlines = findFaces(asIs).outlines.map((outline) => outline.polygon);\n  const newRooms = proposed.rooms\n    .filter((room) => {\n      const shape = measure(polygonOf(proposed, room));\n      if (shape.area <= 0) {\n        return false;\n      }\n      const inside = outlines.reduce(\n        (total, outline) => total + overlapArea(shape, outline),\n        0,\n      );\n      return inside / shape.area < 0.5;\n    })\n    .map((room) => room.id);\n\n  return {\n    walls,\n    openings,\n    newRooms,\n    built: Math.round(built),\n    demolished: Math.round(demolished),\n    addedArea: roomsArea(proposed) - roomsArea(asIs),\n  };\n}\n\n/** Whether a proposal changes anything on this floor. */\nexport function changed(result: Phasing): boolean {\n  return (\n    result.built > 0 ||\n    result.demolished > 0 ||\n    result.openings.some((opening) => opening.phase !== \"existing\")\n  );\n}\n", "// Building out from the house, as Chief Architect adds a room onto a wall:\n// pick an outside wall, say how deep and wide, and the extension's walls join\n// the house's. The wall between becomes internal, or is knocked through.\n\nimport { findFaces, measure, overlapArea, pointInPolygon } from \"./faces\";\nimport { coveredLength, segmentsOf } from \"./phasing\";\nimport { distance } from \"./geometry\";\nimport type { Point, Room, Scene } from \"./scene\";\nimport {\n  insertRoom,\n  mergeRooms,\n  neighbours,\n  wallEnds,\n  wallKinds,\n} from \"./topology\";\n\n/** A run of outside walls in one straight line: a fa\u00E7ade. */\nexport interface Facade {\n  walls: string[];\n  a: Point;\n  b: Point;\n  /** Unit, pointing away from the house. */\n  outward: Point;\n  length: number;\n}\n\nexport interface ExtensionSpec {\n  /** mm out from the fa\u00E7ade. */\n  depth: number;\n  /** mm along the fa\u00E7ade from the start end; 0 is all of it. */\n  width: number;\n  /** mm along the fa\u00E7ade before the extension starts. */\n  inset: number;\n  /** Round the corner at the start end, along the side fa\u00E7ade. */\n  wrap: { width: number; length: number } | null;\n  /** Take down the wall between, opening the extension to the house. */\n  knockThrough: boolean;\n}\n\nexport interface Placed {\n  facade: Facade;\n  /** Which end of the fa\u00E7ade the extension starts from. */\n  from: \"a\" | \"b\";\n}\n\nconst PARALLEL = Math.sin((1 * Math.PI) / 180);\n/** Within about 25\u00B0 of square. */\nconst SQUARE = 0.9;\nexport const MIN_DEPTH = 500;\n/** Overlap with the house, mm\u00B2, past which an extension is refused. */\nconst CLASH_MM2 = 50_000;\n\nfunction unit(from: Point, to: Point): Point {\n  const length = distance(from, to) || 1;\n  return [(to[0] - from[0]) / length, (to[1] - from[1]) / length];\n}\n\nfunction dot(p: Point, q: Point): number {\n  return p[0] * q[0] + p[1] * q[1];\n}\n\nfunction plus(p: Point, d: Point, k: number): Point {\n  return [p[0] + d[0] * k, p[1] + d[1] * k];\n}\n\nfunction outlinesOf(scene: Scene): Point[][] {\n  return findFaces(scene).outlines.map((outline) => outline.polygon);\n}\n\nfunction outside(point: Point, outlines: readonly Point[][]): boolean {\n  return !outlines.some((outline) => pointInPolygon(point, outline));\n}\n\nfunction outwardOf(\n  a: Point,\n  b: Point,\n  thickness: number,\n  outlines: readonly Point[][],\n): Point | null {\n  const u = unit(a, b);\n  const middle: Point = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n  const away = thickness / 2 + 50;\n  for (const normal of [\n    [-u[1], u[0]],\n    [u[1], -u[0]],\n  ] as Point[]) {\n    const ahead = outside(plus(middle, normal, away), outlines);\n    const behind = outside(plus(middle, normal, -away), outlines);\n    if (ahead && !behind) {\n      return normal;\n    }\n  }\n  return null;\n}\n\n/** The fa\u00E7ade a wall is part of, if it's an outside wall facing outside. */\nexport function facadeOf(scene: Scene, wallId: string): Facade | null {\n  const kinds = wallKinds(scene);\n  const outlines = outlinesOf(scene);\n  const faces = findFaces(scene);\n  const open = (id: string) =>\n    kinds.get(id) === \"EXTERNAL\" &&\n    (faces.sides.get(id) ?? [0, 0]).includes(-1);\n  const start = scene.walls.find((wall) => wall.id === wallId);\n  const ends = start ? wallEnds(scene, start) : null;\n  if (!start || !ends || !open(start.id)) {\n    return null;\n  }\n  const outward = outwardOf(ends[0], ends[1], start.thickness, outlines);\n  if (!outward) {\n    return null;\n  }\n  const along = unit(ends[0], ends[1]);\n  const run = new Set([start.id]);\n  let grew = true;\n  while (grew) {\n    grew = false;\n    for (const wall of scene.walls) {\n      if (run.has(wall.id) || !open(wall.id)) {\n        continue;\n      }\n      const touches = scene.walls.some(\n        (other) =>\n          run.has(other.id) &&\n          [other.a, other.b].some((v) => v === wall.a || v === wall.b),\n      );\n      const mine = wallEnds(scene, wall);\n      if (!touches || !mine) {\n        continue;\n      }\n      const dir = unit(mine[0], mine[1]);\n      const across = Math.abs(dir[0] * along[1] - dir[1] * along[0]);\n      const sideways =\n        (mine[0][0] - ends[0][0]) * outward[0] +\n        (mine[0][1] - ends[0][1]) * outward[1];\n      if (across < PARALLEL && Math.abs(sideways) < 20) {\n        run.add(wall.id);\n        grew = true;\n      }\n    }\n  }\n  let lo = Number.POSITIVE_INFINITY;\n  let hi = Number.NEGATIVE_INFINITY;\n  for (const wall of scene.walls) {\n    const mine = run.has(wall.id) ? wallEnds(scene, wall) : null;\n    for (const p of mine ?? []) {\n      const t = (p[0] - ends[0][0]) * along[0] + (p[1] - ends[0][1]) * along[1];\n      lo = Math.min(lo, t);\n      hi = Math.max(hi, t);\n    }\n  }\n  return {\n    walls: scene.walls.filter((w) => run.has(w.id)).map((w) => w.id),\n    a: plus(ends[0], along, lo),\n    b: plus(ends[0], along, hi),\n    outward,\n    length: hi - lo,\n  };\n}\n\n/** The fa\u00E7ade nearest `point`, within `tolerance` mm of its centreline. */\nexport function facadeNear(\n  scene: Scene,\n  point: Point,\n  tolerance: number,\n): Facade | null {\n  let best: { wall: string; off: number } | null = null;\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends) {\n      continue;\n    }\n    const u = unit(ends[0], ends[1]);\n    const length = distance(ends[0], ends[1]);\n    const t = (point[0] - ends[0][0]) * u[0] + (point[1] - ends[0][1]) * u[1];\n    if (t < 0 || t > length) {\n      continue;\n    }\n    const off = Math.abs(\n      (point[0] - ends[0][0]) * u[1] - (point[1] - ends[0][1]) * u[0],\n    );\n    if (\n      off <= Math.max(tolerance, wall.thickness / 2) &&\n      (!best || off < best.off)\n    ) {\n      if (facadeOf(scene, wall.id)) {\n        best = { wall: wall.id, off };\n      }\n    }\n  }\n  return best ? facadeOf(scene, best.wall) : null;\n}\n\n/** The end of the fa\u00E7ade nearer `point`. */\nexport function nearerEnd(facade: Facade, point: Point): \"a\" | \"b\" {\n  return distance(point, facade.a) <= distance(point, facade.b) ? \"a\" : \"b\";\n}\n\n/** How far `point` is out from the fa\u00E7ade, mm. */\nexport function depthAt(facade: Facade, point: Point): number {\n  return (\n    (point[0] - facade.a[0]) * facade.outward[0] +\n    (point[1] - facade.a[1]) * facade.outward[1]\n  );\n}\n\n/** The outside wall run round the corner at the fa\u00E7ade's `end`. */\nexport function sideFacade(\n  scene: Scene,\n  facade: Facade,\n  end: \"a\" | \"b\",\n): Facade | null {\n  const corner = facade[end];\n  for (const wall of scene.walls) {\n    if (facade.walls.includes(wall.id)) {\n      continue;\n    }\n    const ends = wallEnds(scene, wall);\n    if (!ends || !ends.some((p) => distance(p, corner) < 20)) {\n      continue;\n    }\n    const side = facadeOf(scene, wall.id);\n    if (side) {\n      return side;\n    }\n  }\n  return null;\n}\n\nexport interface Planned {\n  /** Corner by corner, starting on the fa\u00E7ade; null when it can't be built. */\n  outline: Point[] | null;\n  problem: string;\n}\n\n/** Where the extension would go, or why it can't. */\nexport function planExtension(\n  scene: Scene,\n  placed: Placed,\n  spec: ExtensionSpec,\n): Planned {\n  const refuse = (problem: string): Planned => ({ outline: null, problem });\n  const { facade, from } = placed;\n  const start = facade[from];\n  const along = unit(start, facade[from === \"a\" ? \"b\" : \"a\"]);\n  const n = facade.outward;\n  const room = facade.length - spec.inset;\n  const width = Math.min(spec.width > 0 ? spec.width : room, room);\n  if (spec.depth < MIN_DEPTH || width < MIN_DEPTH) {\n    return refuse(\"Too small to build: at least 0.5 m each way.\");\n  }\n  const near = plus(start, along, spec.inset);\n  const far = plus(near, along, width);\n  let outline: Point[];\n  if (!spec.wrap || spec.inset > 0) {\n    outline = [near, plus(near, n, spec.depth), plus(far, n, spec.depth), far];\n  } else {\n    const side = sideFacade(scene, facade, from);\n    if (!side) {\n      return refuse(\"No outside wall round this corner to wrap down.\");\n    }\n    // Along the side fa\u00E7ade, away from the corner, and out from it.\n    const away =\n      distance(side.a, start) < distance(side.b, start) ? side.b : side.a;\n    const down = unit(start, away);\n    const length = Math.min(spec.wrap.length, side.length);\n    const out = side.outward;\n    if (dot(down, n) > -SQUARE || dot(out, along) > -SQUARE) {\n      return refuse(\"A wrap goes round an outside corner: start at one.\");\n    }\n    const w = spec.wrap.width;\n    if (w < MIN_DEPTH || length < MIN_DEPTH) {\n      return refuse(\"Too small to wrap: at least 0.5 m each way.\");\n    }\n    outline = [\n      far,\n      plus(far, n, spec.depth),\n      plus(plus(start, n, spec.depth), out, w),\n      plus(plus(start, down, length), out, w),\n      plus(start, down, length),\n      start,\n    ];\n  }\n  const shape = measure(outline);\n  const clash = outlinesOf(scene).reduce(\n    (total, house) => total + overlapArea(shape, house),\n    0,\n  );\n  if (clash > CLASH_MM2) {\n    return refuse(\"It would run into the house: make it smaller.\");\n  }\n  return { outline, problem: \"\" };\n}\n\nexport function extensionOutline(\n  scene: Scene,\n  placed: Placed,\n  spec: ExtensionSpec,\n): Point[] | null {\n  return planExtension(scene, placed, spec).outline;\n}\n\nexport interface Built {\n  room: string | null;\n  /** The walls the extension added. */\n  walls: string[];\n}\n\n/** The outside walls that run where no wall ran `before`: settling gives\n * the far half of a split wall a new id, so ids can't tell. */\nfunction newWalls(\n  scene: Scene,\n  before: readonly [Point, Point][],\n  fabric: number | null,\n  thickness: number | null,\n): string[] {\n  const kinds = wallKinds(scene);\n  const walls: string[] = [];\n  for (const wall of scene.walls) {\n    const ends = wallEnds(scene, wall);\n    if (!ends || kinds.get(wall.id) !== \"EXTERNAL\") {\n      continue;\n    }\n    const length = distance(ends[0], ends[1]);\n    if (coveredLength(ends[0], ends[1], before) > length / 2) {\n      continue;\n    }\n    walls.push(wall.id);\n    if (fabric !== null) {\n      wall.fabric = fabric;\n    }\n    if (thickness) {\n      wall.thickness = thickness;\n    }\n  }\n  return walls;\n}\n\n/** Rooms on this floor over `outlines` from the floor below: a room built on\n * top of one, or a whole storey. Returns the rooms made. */\nexport function buildOver(\n  scene: Scene,\n  outlines: readonly Point[][],\n  fields: Partial<Room>,\n  fabric: number | null,\n  thickness: number | null,\n): string[] {\n  const before = segmentsOf(scene);\n  const rooms = outlines.flatMap(\n    (outline) => insertRoom(scene, outline, fields) ?? [],\n  );\n  newWalls(scene, before, fabric, thickness);\n  return rooms;\n}\n\n/** The floor's outline: what a storey over it covers. */\nexport function footprint(scene: Scene): Point[][] {\n  return outlinesOf(scene);\n}\n\n/** Build the extension into the plan. New outside walls take `fabric`. */\nexport function addExtension(\n  scene: Scene,\n  placed: Placed,\n  spec: ExtensionSpec,\n  fields: Partial<Room>,\n  fabric: number | null,\n  thickness: number | null,\n): Built {\n  const outline = extensionOutline(scene, placed, spec);\n  if (!outline) {\n    return { room: null, walls: [] };\n  }\n  const before = segmentsOf(scene);\n  const room = insertRoom(scene, outline, fields);\n  if (!room) {\n    return { room: null, walls: [] };\n  }\n  const walls = newWalls(scene, before, fabric, thickness);\n  if (spec.knockThrough) {\n    // Into the house, not the garage beside it.\n    const host = neighbours(scene, room).find(\n      ({ room: other }) => other.heated !== false,\n    )?.room;\n    if (host && mergeRooms(scene, host.id, room)) {\n      return { room: host.id, walls };\n    }\n  }\n  return { room, walls };\n}\n", "import {\n  depthAt,\n  extensionOutline,\n  type Facade,\n  facadeNear,\n  facadeOf,\n  MIN_DEPTH,\n  nearerEnd,\n  type Placed,\n  planExtension,\n} from \"../extension\";\nimport { formatLengthM } from \"../geometry\";\nimport type { OverlaySpec } from \"../overlay\";\nimport type { Point } from \"../scene\";\nimport { wallEnds } from \"../topology\";\nimport type { Tool, ToolContext } from \"./types\";\n\n/** Depths snap to this, mm, as the pointer moves out. */\nconst STEP = 100;\nconst REACH_PX = 14;\n\n/** Click an outside wall, move out to the depth and click again; or type the\n * depth and width in the panel and press Enter. */\nexport function extendTool(): Tool & {\n  /** Start from a wall picked elsewhere, at the fa\u00E7ade's end nearer it. */\n  pick(ctx: ToolContext, wallId: string): boolean;\n} {\n  let placed: Placed | null = null;\n\n  const facadeLine = (facade: Facade): OverlaySpec => ({\n    kind: \"line\",\n    a: facade.a,\n    b: facade.b,\n    thickness: 120,\n    square: true,\n  });\n\n  const show = (ctx: ToolContext): void => {\n    if (!placed) {\n      ctx.preview([]);\n      return;\n    }\n    const spec = ctx.extension();\n    const { outline, problem } = planExtension(ctx.scene(), placed, spec);\n    const label: Point = [\n      placed.facade[placed.from][0] + placed.facade.outward[0] * spec.depth,\n      placed.facade[placed.from][1] + placed.facade.outward[1] * spec.depth,\n    ];\n    ctx.preview([\n      facadeLine(placed.facade),\n      ...(outline\n        ? [\n            { kind: \"area\" as const, polygon: outline },\n            {\n              kind: \"text\" as const,\n              at: label,\n              text: `${formatLengthM(spec.depth)} deep`,\n            },\n          ]\n        : [{ kind: \"text\" as const, at: label, text: problem }]),\n      { kind: \"marker\", at: placed.facade[placed.from], snap: \"endpoint\" },\n    ]);\n  };\n\n  const build = (ctx: ToolContext): void => {\n    if (!placed || !extensionOutline(ctx.scene(), placed, ctx.extension())) {\n      return;\n    }\n    const done = placed;\n    placed = null;\n    ctx.preview([]);\n    ctx.extend(done);\n  };\n\n  return {\n    name: \"extend\",\n    hint:\n      \"Click an outside wall near the corner to build from, move out to the\" +\n      \" depth and click \u2014 or type the sizes in the panel and press Enter.\",\n\n    down(point, _event, ctx) {\n      if (placed) {\n        build(ctx);\n        return;\n      }\n      const facade = facadeNear(\n        ctx.scene(),\n        point,\n        REACH_PX * ctx.worldPerPixel(),\n      );\n      if (!facade) {\n        return;\n      }\n      placed = { facade, from: nearerEnd(facade, point) };\n      ctx.picked(placed);\n      show(ctx);\n    },\n\n    move(point, _event, ctx) {\n      if (!placed) {\n        const facade = facadeNear(\n          ctx.scene(),\n          point,\n          REACH_PX * ctx.worldPerPixel(),\n        );\n        ctx.preview(\n          facade\n            ? [\n                facadeLine(facade),\n                {\n                  kind: \"marker\",\n                  at: facade[nearerEnd(facade, point)],\n                  snap: \"endpoint\",\n                },\n              ]\n            : [],\n        );\n        return;\n      }\n      const depth = Math.round(depthAt(placed.facade, point) / STEP) * STEP;\n      if (depth >= MIN_DEPTH) {\n        ctx.setExtensionDepth(depth);\n      }\n      show(ctx);\n    },\n\n    up() {\n      // Clicks land on pointerdown.\n    },\n\n    finish(ctx) {\n      build(ctx);\n    },\n\n    pick(ctx, wallId) {\n      const scene = ctx.scene();\n      const facade = facadeOf(scene, wallId);\n      const wall = scene.walls.find((candidate) => candidate.id === wallId);\n      const ends = wall ? wallEnds(scene, wall) : null;\n      if (!facade || !ends) {\n        return false;\n      }\n      const middle: Point = [\n        (ends[0][0] + ends[1][0]) / 2,\n        (ends[0][1] + ends[1][1]) / 2,\n      ];\n      placed = { facade, from: nearerEnd(facade, middle) };\n      ctx.picked(placed);\n      show(ctx);\n      return true;\n    },\n\n    refresh(ctx) {\n      show(ctx);\n    },\n\n    cancel(ctx) {\n      placed = null;\n      ctx.preview([]);\n    },\n  };\n}\n", "// The extension panel's settings, in metres as typed, and the walls an\n// extension is built with.\n\nimport type { ExtensionSpec } from \"./extension\";\nimport type { FabricType } from \"./scene\";\n\nexport interface ExtensionForm {\n  shape: \"straight\" | \"wrap\";\n  depth: number | \"\";\n  /** Blank is the whole fa\u00E7ade. */\n  width: number | \"\";\n  inset: number | \"\";\n  wrapWidth: number | \"\";\n  wrapLength: number | \"\";\n  knockThrough: boolean;\n  name: string;\n  roomType: string;\n  /** The fa\u00E7ade picked, m, to show against the width. */\n  facade: number;\n}\n\nexport function emptyExtensionForm(): ExtensionForm {\n  return {\n    shape: \"straight\",\n    depth: 3,\n    width: \"\",\n    inset: 0,\n    wrapWidth: 1.5,\n    wrapLength: 3,\n    knockThrough: true,\n    name: \"Extension\",\n    roomType: \"kitchen\",\n    facade: 0,\n  };\n}\n\nconst mm = (metres: number | \"\", fallback = 0): number =>\n  metres === \"\" || !Number.isFinite(Number(metres))\n    ? fallback\n    : Math.round(Number(metres) * 1000);\n\nexport function specOf(form: ExtensionForm): ExtensionSpec {\n  return {\n    depth: mm(form.depth),\n    width: mm(form.width),\n    inset: mm(form.inset),\n    wrap:\n      form.shape === \"wrap\"\n        ? { width: mm(form.wrapWidth), length: mm(form.wrapLength) }\n        : null,\n    knockThrough: form.knockThrough,\n  };\n}\n\n/** SAP scores it as RdSAP's newest filled cavity (0.26); the room-by-room\n * heat load takes Approved Document L 2021's 0.18 for an extension's walls. */\nexport const NEW_BUILD_WALL = {\n  element: \"WALL\",\n  name: \"New build cavity (2023 on)\",\n  spec: {\n    construction: \"FILLED_CAVITY\",\n    age: \"M\",\n    thickness_mm: 300,\n    insulation: { kind: \"AS_BUILT\", thickness_mm: null },\n    uvalue: 0.18,\n  },\n} as const;\n\nexport function newBuildWall(types: readonly FabricType[]): FabricType | null {\n  return (\n    types.find(\n      (type) => type.element === \"WALL\" && type.name === NEW_BUILD_WALL.name,\n    ) ?? null\n  );\n}\n", "// A proposal drawn over the house as it is: existing walls grey, new ones in\n// the accent, demolished ones dashed red, as Revit's \"Show All\" phase filter\n// and planning drawings show them.\n\nimport { formatAreaM2, formatLengthM } from \"./geometry\";\nimport { type Phasing, phasing } from \"./phasing\";\nimport { element } from \"./renderer\";\nimport type { Floor, Point, Scene } from \"./scene\";\nimport { polygonOf, wallEnds } from \"./topology\";\n\nexport const PHASE_COLORS = {\n  existing: \"#94a3b8\", // slate-400\n  new: \"#059669\", // emerald-600\n  demolished: \"#dc2626\", // red-600\n};\n\nconst UNDERLAY = \"#cbd5e1\"; // slate-300\n\n/** What a proposal's floor stood on: the as-is floor at its level, or\n * nothing at all for a floor the proposal adds, so all of it reads new. */\nexport function asIsSceneFor(floors: readonly Floor[], floor: Floor): Scene {\n  return (\n    floors.find((candidate) => candidate.level === floor.level)?.scene ?? {\n      schema: 2,\n      units: \"mm\",\n      vertices: [],\n      walls: [],\n      openings: [],\n      rooms: [],\n      emitters: [],\n    }\n  );\n}\n\nfunction line(a: Point, b: Point, attrs: Record<string, string>) {\n  return element(\"line\", {\n    x1: String(a[0]),\n    y1: String(a[1]),\n    x2: String(b[0]),\n    y2: String(b[1]),\n    ...attrs,\n  });\n}\n\n/** The outline of a stretch of wall, for drawing it dashed. */\nfunction band(a: Point, b: Point, thickness: number): string {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n  const nx = (-(b[1] - a[1]) / length) * (thickness / 2);\n  const ny = ((b[0] - a[0]) / length) * (thickness / 2);\n  return [\n    [a[0] + nx, a[1] + ny],\n    [b[0] + nx, b[1] + ny],\n    [b[0] - nx, b[1] - ny],\n    [a[0] - nx, a[1] - ny],\n  ]\n    .map(([x, y]) => `${x},${y}`)\n    .join(\" \");\n}\n\nfunction demolishedBand(\n  a: Point,\n  b: Point,\n  thickness: number,\n  wpp: number,\n): SVGElement {\n  return element(\"polygon\", {\n    points: band(a, b, thickness),\n    fill: PHASE_COLORS.demolished,\n    \"fill-opacity\": \"0.06\",\n    stroke: PHASE_COLORS.demolished,\n    \"stroke-width\": String(1.5 * wpp),\n    \"stroke-dasharray\": `${6 * wpp} ${4 * wpp}`,\n    \"data-phase\": \"demolished\",\n  });\n}\n\nexport interface PhaseView {\n  under: SVGElement[];\n  over: SVGElement[];\n  result: Phasing;\n}\n\nexport function phaseView(\n  asIs: Scene,\n  proposed: Scene,\n  wpp: number,\n): PhaseView {\n  const result = phasing(asIs, proposed);\n  const under: SVGElement[] = [];\n  for (const wall of asIs.walls) {\n    const ends = wallEnds(asIs, wall);\n    if (ends) {\n      under.push(\n        line(ends[0], ends[1], {\n          stroke: UNDERLAY,\n          \"stroke-width\": String(wall.thickness),\n          \"stroke-opacity\": \"0.6\",\n          \"stroke-linecap\": \"square\",\n        }),\n      );\n    }\n  }\n\n  const over: SVGElement[] = [];\n  for (const id of result.newRooms) {\n    const room = proposed.rooms.find((candidate) => candidate.id === id);\n    if (room) {\n      over.push(\n        element(\"polygon\", {\n          points: polygonOf(proposed, room)\n            .map(([x, y]) => `${x},${y}`)\n            .join(\" \"),\n          fill: PHASE_COLORS.new,\n          \"fill-opacity\": \"0.1\",\n          \"data-phase\": \"new-room\",\n        }),\n      );\n    }\n  }\n  for (const wall of result.walls) {\n    if (wall.phase === \"demolished\") {\n      over.push(demolishedBand(wall.a, wall.b, wall.thickness, wpp));\n      continue;\n    }\n    over.push(\n      line(wall.a, wall.b, {\n        stroke: PHASE_COLORS[wall.phase],\n        \"stroke-width\": String(wall.thickness),\n        \"stroke-opacity\": wall.internal ? \"0.6\" : \"1\",\n        \"stroke-linecap\": wall.internal ? \"butt\" : \"square\",\n        \"data-phase\": wall.phase,\n      }),\n    );\n  }\n  for (const opening of result.openings) {\n    if (opening.phase === \"demolished\") {\n      over.push(demolishedBand(opening.a, opening.b, opening.thickness, wpp));\n    } else if (opening.phase === \"new\") {\n      over.push(\n        line(opening.a, opening.b, {\n          stroke: PHASE_COLORS.new,\n          \"stroke-width\": String(opening.thickness * 0.3),\n          \"stroke-opacity\": \"0.6\",\n          \"data-phase\": \"new-opening\",\n        }),\n      );\n    }\n  }\n  return { under, over, result };\n}\n\n/** \"+12.0 m\u00B2 \u00B7 10.0 m built \u00B7 4.0 m taken down\", or \"\" for no change. */\nexport function phaseSummary(result: Phasing): string {\n  const parts: string[] = [];\n  if (Math.abs(result.addedArea) >= 50_000) {\n    parts.push(\n      `${result.addedArea > 0 ? \"+\" : \"\u2212\"}${formatAreaM2(Math.abs(result.addedArea))}`,\n    );\n  }\n  if (result.built > 0) {\n    parts.push(`${formatLengthM(result.built)} built`);\n  }\n  if (result.demolished > 0) {\n    parts.push(`${formatLengthM(result.demolished)} taken down`);\n  }\n  return parts.join(\" \u00B7 \");\n}\n", "// How the design tool writes a kept package's figures, so its phases panel\n// reads as the Scenarios column and the Build Pack do: SAP rounded half up,\n// costs before grants, and the grant as its own line.\n\nimport { sapScore } from \"../calc/sapscore\";\nimport type { Figures } from \"./figures\";\nimport { pounds } from \"./scenarioview\";\n\n/** \"SAP 87 B \u00B7 \u00A322,000 \u00B7 less \u00A37,500 grant\": a phase in the phases panel. */\nexport function phaseLine(phase: Figures[\"phases\"][number]): string {\n  return [\n    `SAP ${sapScore(phase.after.sap)} ${phase.after.band}`,\n    phase.cost === null ? \"price?\" : pounds(phase.cost),\n    phase.grant ? `less ${pounds(phase.grant)} grant` : \"\",\n  ]\n    .filter(Boolean)\n    .join(\" \u00B7 \");\n}\n", "/**\n * A write held back a moment so a burst of edits goes out as one. `flush`\n * sends it now, so leaving (a mode switch, another scenario, closing the tab)\n * never loses it.\n */\nexport class LateWrite {\n  private timer: number | undefined;\n\n  constructor(\n    private readonly write: () => void,\n    private readonly delayMs = 500,\n  ) {}\n\n  get pending(): boolean {\n    return this.timer !== undefined;\n  }\n\n  schedule(): void {\n    window.clearTimeout(this.timer);\n    this.timer = window.setTimeout(() => {\n      this.timer = undefined;\n      this.write();\n    }, this.delayMs);\n  }\n\n  /** Write now if one is waiting. */\n  flush(): boolean {\n    if (this.timer === undefined) {\n      return false;\n    }\n    window.clearTimeout(this.timer);\n    this.timer = undefined;\n    this.write();\n    return true;\n  }\n}\n", "// Corrections to the house as it is, carried into a proposal: a three-way\n// merge per entity, as git merges per line. What the proposal hasn't touched\n// takes the correction; what both changed keeps the proposal's and is counted.\n\nimport type { FabricType, Floor, Scene } from \"./scene\";\nimport { settle } from \"./topology\";\n\nexport interface Side {\n  floors: { level: number; scene: Scene }[];\n  fabric_types: { id: number; element: string; name: string }[];\n}\n\nexport interface Forward {\n  /** The proposal's floors that change, with their merged scenes. */\n  floors: { id: number; scene: Scene }[];\n  applied: number;\n  /** Changed in both, kept as the proposal has them. */\n  conflicts: number;\n}\n\nconst COLLECTIONS = [\n  \"vertices\",\n  \"walls\",\n  \"openings\",\n  \"rooms\",\n  \"emitters\",\n  \"features\",\n  \"fixtures\",\n] as const;\n\ntype Entity = { id: string; fabric?: number | null };\n\ntype Names = Map<number, string>;\n\nfunction names(\n  types: readonly { id: number; element: string; name: string }[],\n) {\n  return new Map(\n    types.map((type) => [type.id, `${type.element}:${type.name}`]),\n  );\n}\n\n/** An entity as text, its fabric by name so each scene's ids compare. */\nfunction key(entity: Entity | undefined, fabric: Names): string {\n  if (!entity) {\n    return \"\";\n  }\n  const named =\n    entity.fabric == null ? null : (fabric.get(entity.fabric) ?? null);\n  return stable({ ...entity, fabric: named });\n}\n\n/** One field as text, a fabric by its name. */\nfunction value(entity: Entity, field: string, fabric: Names): string {\n  if (field === \"fabric\") {\n    return key({ id: \"\", fabric: entity.fabric ?? null }, fabric);\n  }\n  return stable((entity as Record<string, unknown>)[field] ?? null);\n}\n\n/** JSON with its keys sorted, so the same entity always reads the same. */\nfunction stable(value: unknown): string {\n  if (Array.isArray(value)) {\n    return `[${value.map(stable).join(\",\")}]`;\n  }\n  if (value && typeof value === \"object\") {\n    const entries = Object.entries(value)\n      .filter(([, inner]) => inner !== undefined)\n      .sort(([one], [two]) => (one < two ? -1 : 1));\n    return `{${entries.map(([k, inner]) => `${JSON.stringify(k)}:${stable(inner)}`).join(\",\")}}`;\n  }\n  return JSON.stringify(value);\n}\n\nfunction byId(list: readonly Entity[]): Map<string, Entity> {\n  return new Map(list.map((entity) => [entity.id, entity]));\n}\n\nexport function bringForward(\n  base: Side,\n  theirs: Side,\n  ours: readonly Floor[],\n  types: readonly FabricType[],\n): Forward {\n  const baseNames = names(base.fabric_types);\n  const theirNames = names(theirs.fabric_types);\n  const ourNames = names(types);\n  const ourIds = new Map([...ourNames].map(([id, name]) => [name, id]));\n  const result: Forward = { floors: [], applied: 0, conflicts: 0 };\n\n  for (const floor of ours) {\n    const was = base.floors.find((f) => f.level === floor.level)?.scene;\n    const now = theirs.floors.find((f) => f.level === floor.level)?.scene;\n    if (!was || !now) {\n      continue;\n    }\n    const scene = structuredClone(floor.scene);\n    let applied = 0;\n    let structural = false;\n    for (const name of COLLECTIONS) {\n      const b = byId((was[name] ?? []) as Entity[]);\n      const t = byId((now[name] ?? []) as Entity[]);\n      const o = byId((scene[name] ?? []) as Entity[]);\n      const kept: Entity[] = [];\n      const ids = new Set([...o.keys(), ...t.keys()]);\n      const take = (field: string, from: Entity): unknown => {\n        if (field !== \"fabric\") {\n          return structuredClone((from as Record<string, unknown>)[field]);\n        }\n        const named = from.fabric == null ? null : theirNames.get(from.fabric);\n        return named ? (ourIds.get(named) ?? null) : null;\n      };\n      // A type the house was given since, which the proposal hasn't got.\n      const unknownType = (from: Entity): boolean => {\n        const named = from.fabric == null ? null : theirNames.get(from.fabric);\n        return named !== null && !(named && ourIds.has(named));\n      };\n      for (const id of ids) {\n        const was = b.get(id);\n        const there = t.get(id);\n        const mine = o.get(id);\n        if (was && there && mine) {\n          // Field by field, so a room renamed in the house and reshaped by\n          // the proposal takes the name and keeps the shape.\n          const merged: Record<string, unknown> = { ...mine };\n          const fields = new Set([\n            ...Object.keys(was),\n            ...Object.keys(there),\n            ...Object.keys(mine),\n          ]);\n          for (const field of fields) {\n            const before = value(was, field, baseNames);\n            const now = value(there, field, theirNames);\n            const here = value(mine, field, ourNames);\n            if (now === before || now === here) {\n              continue;\n            }\n            if (here !== before || (field === \"fabric\" && unknownType(there))) {\n              result.conflicts += 1;\n              continue;\n            }\n            merged[field] = take(field, there);\n            applied += 1;\n            structural ||= name === \"vertices\" || name === \"walls\";\n          }\n          kept.push(merged as Entity);\n          continue;\n        }\n        const before = key(was, baseNames);\n        const now = key(there, theirNames);\n        const here = key(mine, ourNames);\n        if (now === before || now === here) {\n          if (mine) {\n            kept.push(mine);\n          }\n          continue;\n        }\n        if (here !== before) {\n          result.conflicts += 1;\n          if (mine) {\n            kept.push(mine);\n          }\n          continue;\n        }\n        applied += 1;\n        structural ||= name === \"vertices\" || name === \"walls\";\n        if (there) {\n          if (unknownType(there)) {\n            result.conflicts += 1;\n          }\n          kept.push(\n            \"fabric\" in there\n              ? { ...there, fabric: take(\"fabric\", there) as number | null }\n              : { ...there },\n          );\n        }\n      }\n      (scene as Record<string, unknown>)[name] = kept;\n    }\n    if (applied > 0) {\n      // Walls joined up anew; a renamed room or a moved window needs nothing.\n      if (structural) {\n        settle(scene);\n      }\n      result.applied += applied;\n      result.floors.push({ id: floor.id, scene });\n    }\n  }\n  return result;\n}\n\nexport interface Saver {\n  flush(): Promise<void>;\n  isDirty(): boolean;\n  isLocked(): boolean;\n}\n\n/** Whether everything saved: a conflict, or saves still failing after\n * `tries`, means the merge may be lost, so the base mustn't move. */\nexport async function saved(\n  core: Saver,\n  tries = 20,\n  pause = (ms: number) => new Promise((done) => setTimeout(done, ms)),\n): Promise<boolean> {\n  for (let attempt = 0; attempt < tries; attempt++) {\n    if (!core.isDirty() || core.isLocked()) {\n      break;\n    }\n    await core.flush();\n    if (core.isDirty()) {\n      await pause(250);\n    }\n  }\n  return !core.isDirty() && !core.isLocked();\n}\n", "import { drawWalls } from \"../topology\";\nimport { commitDrawing, drawingSnap, pathClicks } from \"./path\";\nimport { Tool, ToolContext } from \"./types\";\n\n/** Draw a run of walls corner by corner. A wall joins whatever it meets or\n * crosses, and any space the walls enclose becomes a room: a wall across a\n * room splits it, four round an empty patch make one. */\nexport function wallTool(): Tool {\n  const path = pathClicks(3);\n\n  const complete = (ctx: ToolContext, closed: boolean): void => {\n    const run = path.points;\n    path.reset(ctx);\n    if (run.length < 2) {\n      return;\n    }\n    commitDrawing(ctx, (scene) => {\n      drawWalls(scene, run, closed);\n    });\n    ctx.select(null);\n  };\n\n  return {\n    name: \"wall\",\n    hint:\n      \"Click each corner of the wall \u2014 Shift squares it up with the house;\" +\n      \" double-click, right-click or Enter ends it, and clicking where it\" +\n      \" started closes it. Walls join what they meet; what they enclose\" +\n      \" becomes a room.\",\n\n    down(point, event, ctx) {\n      const snapped = ctx.snap(\n        point,\n        drawingSnap(event, path.points[path.points.length - 1]),\n      );\n      const clicked = path.click(snapped.point, ctx);\n      if (clicked !== \"added\") {\n        complete(ctx, clicked === \"closed\");\n        return;\n      }\n      path.preview(ctx, null, false);\n    },\n\n    move(point, event, ctx) {\n      path.preview(\n        ctx,\n        ctx.snap(\n          point,\n          drawingSnap(event, path.points[path.points.length - 1]),\n        ),\n        false,\n      );\n    },\n\n    up() {\n      // Corners land on pointerdown.\n    },\n\n    finish(ctx) {\n      complete(ctx, false);\n    },\n\n    cancel(ctx) {\n      path.reset(ctx);\n    },\n  };\n}\n", "import { distance, projectOnSegment } from \"./geometry\";\nimport { pointAlong, wallFrame } from \"./openings\";\nimport { Point, Scene } from \"./scene\";\nimport { translateVertices, wallEnds } from \"./topology\";\n\n/** Walls within this of square to the one resized move with its far end. */\nconst ACROSS = Math.sin((1 * Math.PI) / 180);\n\n/** The corners that move with `start`: those reached along walls running\n * square across the direction (ux, uy), so the far side shifts whole. */\nfunction farSide(\n  scene: Scene,\n  start: string,\n  ux: number,\n  uy: number,\n  skip: string,\n): Set<string> {\n  const side = new Set([start]);\n  const queue = [start];\n  while (queue.length > 0) {\n    const vertex = queue.pop() as string;\n    for (const wall of scene.walls) {\n      if (wall.id === skip || (wall.a !== vertex && wall.b !== vertex)) {\n        continue;\n      }\n      const ends = wallEnds(scene, wall);\n      if (!ends) {\n        continue;\n      }\n      const frame = wallFrame(ends[0], ends[1]);\n      if (\n        frame.length === 0 ||\n        Math.abs(frame.ux * ux + frame.uy * uy) > ACROSS\n      ) {\n        continue;\n      }\n      const next = wall.a === vertex ? wall.b : wall.a;\n      if (!side.has(next)) {\n        side.add(next);\n        queue.push(next);\n      }\n    }\n  }\n  return side;\n}\n\n/** The shortest a wall stretched or squeezed by a resize may end up, mm. */\nconst MIN_WALL_MM = 100;\n\nexport type Resized = \"resized\" | \"unchanged\" | \"blocked\";\n\n/** Make a wall `length` mm long. The right-hand (or lower) end moves along the\n * wall, taking the side square across it, so the room grows or shrinks and the\n * walls running alongside stretch; nothing else moves. Openings stay where\n * they are on their walls. \"blocked\", with the scene untouched, when that would\n * close up or turn inside out a wall alongside, or leave an opening no room. */\nexport function resizeWall(\n  scene: Scene,\n  wallId: string,\n  length: number,\n): Resized {\n  const wall = scene.walls.find((candidate) => candidate.id === wallId);\n  const ends = wall ? wallEnds(scene, wall) : null;\n  if (!wall || !ends || !(length > 0)) {\n    return \"unchanged\";\n  }\n  const [a, b] = ends;\n  const current = distance(a, b);\n  if (current === 0 || Math.round(length) === Math.round(current)) {\n    return \"unchanged\";\n  }\n  const { ux, uy } = wallFrame(a, b);\n  const movesB = Math.abs(b[0] - a[0]) > 1 ? b[0] > a[0] : b[1] >= a[1];\n  const fixed = movesB ? wall.a : wall.b;\n  let side = farSide(scene, movesB ? wall.b : wall.a, ux, uy, wall.id);\n  // A side that comes back round to the fixed end can't shift whole.\n  if (side.has(fixed)) {\n    side = new Set([movesB ? wall.b : wall.a]);\n  }\n\n  const starts = scene.openings.map((opening) => {\n    const host = scene.walls.find((candidate) => candidate.id === opening.wall);\n    const hostEnds = host ? wallEnds(scene, host) : null;\n    return hostEnds\n      ? pointAlong(hostEnds[0], hostEnds[1], opening.offset)\n      : null;\n  });\n\n  const before = new Map(\n    scene.walls.map((candidate) => [candidate.id, wallEnds(scene, candidate)]),\n  );\n  const was = new Map(\n    scene.vertices\n      .filter((vertex) => side.has(vertex.id))\n      .map((vertex) => [vertex.id, vertex.at]),\n  );\n  const shift = (length - current) * (movesB ? 1 : -1);\n  translateVertices(scene, side, ux * shift, uy * shift);\n\n  const squeezed = scene.walls.some((candidate) => {\n    const old = before.get(candidate.id);\n    const now = wallEnds(scene, candidate);\n    if (!old || !now || (!side.has(candidate.a) && !side.has(candidate.b))) {\n      return false;\n    }\n    const along =\n      (now[1][0] - now[0][0]) * (old[1][0] - old[0][0]) +\n      (now[1][1] - now[0][1]) * (old[1][1] - old[0][1]);\n    const hosted = scene.openings\n      .filter((opening) => opening.wall === candidate.id)\n      .reduce((total, opening) => Math.max(total, opening.width), 0);\n    return (\n      along <= 0 || distance(now[0], now[1]) < Math.max(MIN_WALL_MM, hosted)\n    );\n  });\n  if (squeezed) {\n    for (const vertex of scene.vertices) {\n      vertex.at = was.get(vertex.id) ?? vertex.at;\n    }\n    return \"blocked\";\n  }\n\n  scene.openings.forEach((opening, index) => {\n    const start = starts[index];\n    const host = scene.walls.find((candidate) => candidate.id === opening.wall);\n    const hostEnds = host ? wallEnds(scene, host) : null;\n    if (!start || !hostEnds) {\n      return;\n    }\n    const along = projectOnSegment(start as Point, hostEnds[0], hostEnds[1]);\n    opening.offset = Math.round(along.t * distance(hostEnds[0], hostEnds[1]));\n  });\n  return \"resized\";\n}\n", "import { distance, projectOnSegment } from \"../geometry\";\nimport { wallFrame } from \"../openings\";\nimport { Point, Wall } from \"../scene\";\nimport { lineUpShift } from \"../snap\";\nimport {\n  detachRoom,\n  emptySpaces,\n  polygonOf,\n  settle,\n  setVertexAt,\n  translateVertices,\n  wallEnds,\n} from \"../topology\";\nimport { Tool, ToolContext } from \"./types\";\n\nconst DRAG_THRESHOLD_PX = 4;\n\n/** How near, on screen, a dragged corner lines up with one that stays. */\nconst LINE_UP_PX = 8;\n\ntype DragState =\n  | { kind: \"idle\" }\n  | { kind: \"maybe\"; wallId: string; start: Point }\n  | { kind: \"maybe-opening\"; openingId: string; start: Point }\n  | { kind: \"maybe-emitter\"; emitterId: string; start: Point }\n  | { kind: \"maybe-room\"; roomId: string; start: Point }\n  | { kind: \"maybe-vertex\"; vertexId: string; start: Point }\n  | { kind: \"maybe-annotation\"; domId: string; start: Point }\n  | {\n      kind: \"wall\" | \"room\";\n      start: Point;\n      /** How far the corners have been moved so far. */\n      shift: Point;\n      vertices: string[];\n      empties: Point[][];\n    }\n  | { kind: \"opening\"; openingId: string }\n  | { kind: \"emitter\"; emitterId: string }\n  | {\n      kind: \"vertex\";\n      vertexId: string;\n      from: Point | null;\n      empties: Point[][];\n    }\n  | { kind: \"annotation\"; domId: string; last: Point };\n\nfunction wallById(ctx: ToolContext, id: string): Wall | undefined {\n  return ctx.scene().walls.find((wall) => wall.id === id);\n}\n\n/** Click selects, drag moves. Walls and rooms move whole, corners by handle;\n * openings and radiators slide along their wall, clamped by normalisation. */\nexport function selectTool(): Tool {\n  let drag: DragState = { kind: \"idle\" };\n\n  const slideOpening = (openingId: string, point: Point, ctx: ToolContext) => {\n    ctx.mutateLive((scene) => {\n      const opening = scene.openings.find((o) => o.id === openingId);\n      const wall = opening && scene.walls.find((w) => w.id === opening.wall);\n      if (!opening || !wall) {\n        return;\n      }\n      const ends = wallEnds(scene, wall);\n      if (!ends) {\n        return;\n      }\n      const projection = projectOnSegment(point, ends[0], ends[1]);\n      const along = projection.t * wallFrame(ends[0], ends[1]).length;\n      opening.offset = Math.round(along - opening.width / 2);\n    });\n  };\n\n  const slideRadiator = (emitterId: string, point: Point, ctx: ToolContext) => {\n    ctx.mutateLive((scene) => {\n      const radiator = scene.emitters.find((e) => e.id === emitterId);\n      if (radiator?.kind !== \"radiator\") {\n        return;\n      }\n      const wall = scene.walls.find((w) => w.id === radiator.wall);\n      const ends = wall && wallEnds(scene, wall);\n      if (!ends) {\n        return;\n      }\n      const projection = projectOnSegment(point, ends[0], ends[1]);\n      const along = projection.t * wallFrame(ends[0], ends[1]).length;\n      radiator.offset = Math.round(along - radiator.length / 2);\n    });\n  };\n\n  return {\n    name: \"select\",\n    hint:\n      \"Click to select \u2014 drag to move, drag a handle to reshape (Shift keeps\" +\n      \" it square), Del deletes.\",\n\n    down(point, event, ctx) {\n      const handle = ctx.hitHandle(event);\n      // A shared corner is one handle, so dragging it reshapes every room on it.\n      if (handle?.startsWith(\"v:\")) {\n        drag = {\n          kind: \"maybe-vertex\",\n          vertexId: handle.slice(2),\n          start: point,\n        };\n        return;\n      }\n      const id = ctx.hitId(event);\n      if (id !== null && event.shiftKey) {\n        const scene = ctx.scene();\n        const type = wallById(ctx, id)\n          ? \"wall\"\n          : scene.openings.some((opening) => opening.id === id)\n            ? \"opening\"\n            : scene.rooms.some((room) => room.id === id)\n              ? \"room\"\n              : null;\n        if (type) {\n          ctx.toggleSelect({ type, id });\n          drag = { kind: \"idle\" };\n          return;\n        }\n      }\n      if (id !== null) {\n        if (wallById(ctx, id)) {\n          ctx.select({ type: \"wall\", id });\n          drag = { kind: \"maybe\", wallId: id, start: point };\n          return;\n        }\n        if (ctx.scene().openings.some((opening) => opening.id === id)) {\n          ctx.select({ type: \"opening\", id });\n          drag = { kind: \"maybe-opening\", openingId: id, start: point };\n          return;\n        }\n        const emitter = ctx.scene().emitters.find((e) => e.id === id);\n        if (emitter) {\n          ctx.select({ type: \"emitter\", id });\n          // Underfloor covers its room, so only a radiator moves.\n          drag =\n            emitter.kind === \"radiator\"\n              ? { kind: \"maybe-emitter\", emitterId: id, start: point }\n              : { kind: \"idle\" };\n          return;\n        }\n        if (ctx.hasAnnotation(id)) {\n          ctx.select({ type: \"annotation\", id });\n          drag = { kind: \"maybe-annotation\", domId: id, start: point };\n          return;\n        }\n        if (ctx.scene().rooms.some((room) => room.id === id)) {\n          ctx.select({ type: \"room\", id });\n          drag = { kind: \"maybe-room\", roomId: id, start: point };\n          return;\n        }\n      }\n      ctx.select(null);\n      drag = { kind: \"idle\" };\n    },\n\n    move(point, event, ctx) {\n      if (\n        drag.kind === \"maybe\" ||\n        drag.kind === \"maybe-opening\" ||\n        drag.kind === \"maybe-emitter\" ||\n        drag.kind === \"maybe-room\" ||\n        drag.kind === \"maybe-vertex\" ||\n        drag.kind === \"maybe-annotation\"\n      ) {\n        const threshold = DRAG_THRESHOLD_PX * ctx.worldPerPixel();\n        if (distance(point, drag.start) < threshold) {\n          return;\n        }\n        if (drag.kind === \"maybe-annotation\") {\n          // Annotations are rows, not scene content \u2014 their undo entry is\n          // pushed through the annotation path rather than a scene gesture.\n          ctx.beginAnnotationMove(drag.domId);\n          drag = { kind: \"annotation\", domId: drag.domId, last: drag.start };\n        } else {\n          ctx.beginGesture();\n          if (drag.kind === \"maybe-opening\") {\n            drag = { kind: \"opening\", openingId: drag.openingId };\n          } else if (drag.kind === \"maybe-emitter\") {\n            drag = { kind: \"emitter\", emitterId: drag.emitterId };\n          } else if (drag.kind === \"maybe-room\") {\n            // Rigid: the room takes its own copies of shared corners, and\n            // the space it leaves stays empty rather than becoming a room.\n            const roomId = drag.roomId;\n            let vertices: string[] = [];\n            let empties: Point[][] = [];\n            ctx.mutateLive((scene) => {\n              const room = scene.rooms.find((r) => r.id === roomId);\n              empties = [\n                ...emptySpaces(scene),\n                ...(room ? [polygonOf(scene, room)] : []),\n              ];\n              vertices = detachRoom(scene, roomId);\n            });\n            drag = {\n              kind: \"room\",\n              start: drag.start,\n              shift: [0, 0],\n              vertices,\n              empties,\n            };\n          } else if (drag.kind === \"maybe-vertex\") {\n            const vertexId = drag.vertexId;\n            const from = ctx.scene().vertices.find((v) => v.id === vertexId);\n            drag = {\n              kind: \"vertex\",\n              vertexId,\n              from: from ? from.at : null,\n              empties: emptySpaces(ctx.scene()),\n            };\n          } else {\n            const wall = wallById(ctx, drag.wallId);\n            drag = {\n              kind: \"wall\",\n              start: drag.start,\n              shift: [0, 0],\n              vertices: wall ? [wall.a, wall.b] : [],\n              empties: emptySpaces(ctx.scene()),\n            };\n          }\n        }\n      }\n      if (drag.kind === \"annotation\") {\n        const annotationDrag = drag;\n        ctx.moveAnnotationBy(\n          annotationDrag.domId,\n          point[0] - annotationDrag.last[0],\n          point[1] - annotationDrag.last[1],\n        );\n        drag = { ...annotationDrag, last: point };\n        return;\n      }\n      if (drag.kind === \"wall\" || drag.kind === \"room\") {\n        const bodyDrag = drag;\n        const moving = new Set(bodyDrag.vertices);\n        let shift: Point = [\n          point[0] - bodyDrag.start[0],\n          point[1] - bodyDrag.start[1],\n        ];\n        ctx.mutateLive((scene) => {\n          // Back to where it started, so lining up measures from there.\n          translateVertices(\n            scene,\n            moving,\n            -bodyDrag.shift[0],\n            -bodyDrag.shift[1],\n          );\n          if (!event.altKey) {\n            shift = lineUpShift(\n              scene,\n              moving,\n              shift,\n              LINE_UP_PX * ctx.worldPerPixel(),\n            );\n          }\n          translateVertices(scene, moving, shift[0], shift[1]);\n        });\n        drag = { ...bodyDrag, shift };\n        return;\n      }\n      if (drag.kind === \"vertex\") {\n        const vertexDrag = drag;\n        // Shift keeps the corner square with the house from where it was.\n        const snapped = ctx.snap(point, {\n          excludeVertices: [vertexDrag.vertexId],\n          disabled: event.altKey,\n          ortho: event.shiftKey,\n          ...(event.shiftKey && vertexDrag.from\n            ? { anchor: vertexDrag.from }\n            : {}),\n        });\n        ctx.mutateLive((scene) => {\n          setVertexAt(scene, vertexDrag.vertexId, snapped.point);\n        });\n        return;\n      }\n      if (drag.kind === \"opening\") {\n        slideOpening(drag.openingId, point, ctx);\n      }\n      if (drag.kind === \"emitter\") {\n        slideRadiator(drag.emitterId, point, ctx);\n      }\n    },\n\n    up(_point, _event, ctx) {\n      if (\n        drag.kind === \"wall\" ||\n        drag.kind === \"opening\" ||\n        drag.kind === \"emitter\" ||\n        drag.kind === \"room\" ||\n        drag.kind === \"vertex\"\n      ) {\n        // Settle topology on release only, so ids stay stable mid-drag.\n        const released = drag;\n        ctx.mutateLive((scene) => {\n          if (released.kind === \"opening\" || released.kind === \"emitter\") {\n            return;\n          }\n          settle(scene, {\n            moved: new Set(\n              released.kind === \"vertex\"\n                ? [released.vertexId]\n                : released.vertices,\n            ),\n            empties: released.empties,\n          });\n        });\n        ctx.endGesture();\n      } else if (drag.kind === \"annotation\") {\n        ctx.commitAnnotationMove(drag.domId);\n      }\n      drag = { kind: \"idle\" };\n    },\n\n    cancel(ctx) {\n      if (\n        drag.kind === \"wall\" ||\n        drag.kind === \"opening\" ||\n        drag.kind === \"emitter\" ||\n        drag.kind === \"room\" ||\n        drag.kind === \"vertex\"\n      ) {\n        ctx.cancelGesture();\n      } else if (drag.kind === \"annotation\") {\n        ctx.commitAnnotationMove(drag.domId);\n      } else {\n        ctx.select(null);\n      }\n      drag = { kind: \"idle\" };\n      ctx.preview([]);\n    },\n  };\n}\n", "import { Bounds, Point } from \"./scene\";\n\n// Pan/zoom is a plain viewBox in world millimetres; all functions are pure so\n// they run under vitest's node environment. The editor owns the current\n// ViewBox and applies it to the <svg> element.\n\nexport interface ViewBox {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\n/** The size of the svg element on screen, in CSS pixels. */\nexport interface ScreenRect {\n  width: number;\n  height: number;\n  left: number;\n  top: number;\n}\n\nexport const MIN_VIEW_WIDTH_MM = 500;\nexport const MAX_VIEW_WIDTH_MM = 200_000;\n\nexport function worldPerPixel(view: ViewBox, rect: ScreenRect): number {\n  return view.w / rect.width;\n}\n\nexport function screenToWorld(\n  view: ViewBox,\n  rect: ScreenRect,\n  clientX: number,\n  clientY: number,\n): Point {\n  return [\n    view.x + ((clientX - rect.left) / rect.width) * view.w,\n    view.y + ((clientY - rect.top) / rect.height) * view.h,\n  ];\n}\n\nexport function panBy(\n  view: ViewBox,\n  rect: ScreenRect,\n  dxPx: number,\n  dyPx: number,\n): ViewBox {\n  const scale = worldPerPixel(view, rect);\n  return {\n    ...view,\n    x: view.x - dxPx * scale,\n    y: view.y - dyPx * scale,\n  };\n}\n\n/** Zoom by `factor` keeping the world point under the cursor stationary. */\nexport function zoomAt(\n  view: ViewBox,\n  rect: ScreenRect,\n  clientX: number,\n  clientY: number,\n  factor: number,\n): ViewBox {\n  const clamped = Math.max(\n    MIN_VIEW_WIDTH_MM / view.w,\n    Math.min(MAX_VIEW_WIDTH_MM / view.w, factor),\n  );\n  const [wx, wy] = screenToWorld(view, rect, clientX, clientY);\n  const w = view.w * clamped;\n  const h = view.h * clamped;\n  return {\n    x: wx - ((clientX - rect.left) / rect.width) * w,\n    y: wy - ((clientY - rect.top) / rect.height) * h,\n    w,\n    h,\n  };\n}\n\n/** A view showing `bounds` centred with `padding` (fraction of the larger\n * side), preserving the screen's aspect ratio. */\n/** `left` screen pixels are kept clear, for what floats over the plan there. */\nexport function fitBounds(\n  bounds: Bounds,\n  rect: ScreenRect,\n  padding = 0.1,\n  left = 0,\n): ViewBox {\n  const spanX = Math.max(bounds.maxX - bounds.minX, 1);\n  const spanY = Math.max(bounds.maxY - bounds.minY, 1);\n  const pad = Math.max(spanX, spanY) * padding;\n  const paddedW = spanX + pad * 2;\n  const paddedH = spanY + pad * 2;\n  const clear = Math.min(Math.max(left, 0), rect.width / 2);\n  const aspect = (rect.width - clear) / rect.height;\n  let w = paddedW;\n  let h = paddedH;\n  if (paddedW / paddedH > aspect) {\n    h = paddedW / aspect;\n  } else {\n    w = paddedH * aspect;\n  }\n  const kept = (w * clear) / (rect.width - clear);\n  return {\n    x: bounds.minX + spanX / 2 - w / 2 - kept,\n    y: bounds.minY + spanY / 2 - h / 2,\n    w: w + kept,\n    h,\n  };\n}\n\n/** The default view for an empty floor: roughly a 12 m wide plot. */\nexport function defaultView(rect: ScreenRect): ViewBox {\n  const w = 12_000;\n  const h = (w * rect.height) / rect.width;\n  return { x: -w / 2, y: -h / 2, w, h };\n}\n\n/** A point turned clockwise by `degrees` about the origin, as SVG's rotate(). */\nexport function turnPoint([x, y]: Point, degrees: number): Point {\n  const radians = (degrees * Math.PI) / 180;\n  const cos = Math.round(Math.cos(radians) * 1e9) / 1e9;\n  const sin = Math.round(Math.sin(radians) * 1e9) / 1e9;\n  return [x * cos - y * sin, x * sin + y * cos];\n}\n\n/** The box around `bounds` once turned clockwise by `degrees`. */\nexport function turnBounds(bounds: Bounds, degrees: number): Bounds {\n  const corners = [\n    turnPoint([bounds.minX, bounds.minY], degrees),\n    turnPoint([bounds.maxX, bounds.minY], degrees),\n    turnPoint([bounds.maxX, bounds.maxY], degrees),\n    turnPoint([bounds.minX, bounds.maxY], degrees),\n  ];\n  return {\n    minX: Math.min(...corners.map(([x]) => x)),\n    minY: Math.min(...corners.map(([, y]) => y)),\n    maxX: Math.max(...corners.map(([x]) => x)),\n    maxY: Math.max(...corners.map(([, y]) => y)),\n  };\n}\n\n/** The view slid, not zoomed, to centre `bounds` when any of it is out of\n * sight; as it was when it's all in view. `left` world units down the left\n * edge are hidden, under what floats there. */\nexport function bringIntoView(\n  view: ViewBox,\n  bounds: Bounds,\n  left = 0,\n): ViewBox {\n  const inside =\n    bounds.minX >= view.x + left &&\n    bounds.maxX <= view.x + view.w &&\n    bounds.minY >= view.y &&\n    bounds.maxY <= view.y + view.h;\n  if (inside) {\n    return view;\n  }\n  return {\n    ...view,\n    x: (bounds.minX + bounds.maxX) / 2 - (view.w + left) / 2,\n    y: (bounds.minY + bounds.maxY) / 2 - view.h / 2,\n  };\n}\n", "import { AlpineComponent } from \"alpinejs\";\nimport { sapScore } from \"../calc/sapscore\";\nimport {\n  createAnnotation,\n  createFabricType,\n  createPackage,\n  deletePackage,\n  patchPackage,\n  fetchMagicplanPlans,\n  fetchMagicplanPreview,\n  fetchScenarioContext,\n  getCookie,\n  type MagicplanPlan,\n  type MagicplanPreview,\n  postMagicplanImport,\n  createFloor,\n  deleteFabricType,\n  deleteFloor,\n  fetchCalcContext,\n  fetchBringForward,\n  fetchDesign,\n  postBringForward,\n  fetchRevisions,\n  fetchSchedule,\n  patchAnnotation,\n  postRestore,\n  patchFabricType,\n  patchBaseline,\n  patchChanges,\n  postTwin,\n  patchHeatLoad,\n  patchOverheating,\n  patchOrientation,\n  postScheduleMeasure,\n  postDraft,\n  putScene,\n  renameFloor as renameFloorRequest,\n  getSite,\n  reorderFloors,\n  wallDefaultU,\n} from \"./api\";\nimport {\n  fabricColor,\n  type InsulationMode,\n  insulationChoice,\n  insulationKindOf,\n  resolveFabric,\n  specSummary,\n  usedByText,\n  wallUSource,\n  wallsUsing,\n} from \"./fabric\";\nimport { formatPounds, ScatterChart } from \"./chart\";\nimport { type Check, IMPLAUSIBLE_W_PER_M2, modelChecks } from \"./checks\";\nimport { straighten } from \"./chimney\";\nimport { breastAreaMm2 } from \"./features\";\nimport {\n  boundsOfSelection,\n  type CheckPlace,\n  placeOf,\n  stepCheck,\n} from \"./checklist\";\nimport {\n  HeldTouch,\n  TOUCH_HOLD_MS,\n  TouchGesture,\n  WheelReader,\n  zoomKey,\n} from \"./gestures\";\nimport { HoverMarker } from \"./hover\";\nimport {\n  type ChangeKind,\n  KIND_TITLES,\n  type LogLine,\n  type Session,\n  savedLabel,\n  sessionsOf,\n} from \"./changelog\";\nimport { type Inspection, type Row, highlight, inspect } from \"./roominspector\";\nimport {\n  applyDraft,\n  type Draft,\n  draftPreview,\n  draftToWorld,\n  tidy,\n} from \"./draft\";\nimport {\n  type AlignView,\n  type FloorAligner,\n  alignView,\n  floorAligner,\n} from \"./flooralign\";\nimport { dropPreview, dropped } from \"./drop\";\nimport {\n  FIGURES_VERSION,\n  type Figures,\n  type Phase,\n  packagedKinds,\n  phasesOf,\n} from \"./figures\";\nimport { freshness } from \"./freshness\";\nimport {\n  type Assumption,\n  type CalcContext,\n  Prepared,\n  heatLoss as heatLossOf,\n} from \"./heatloss\";\nimport { worksheetSources } from \"./worksheetview\";\nimport * as phaseOps from \"./phases\";\nimport { heatColor, heatIsDark } from \"./heatmap\";\nimport { OPENING_DEFAULTS } from \"./openings\";\nimport {\n  type DesignOverheating,\n  designOverheating,\n  OVERHEATING_LEGEND,\n  overheatingFills,\n  setVent,\n} from \"./overheating\";\nimport type {\n  RoomResult as OverheatingRoom,\n  Shading,\n  VentStyle,\n} from \"../overheating/parto\";\nimport {\n  alongWall,\n  atOpening,\n  besideTheHouse,\n  overRoom,\n  type Placement,\n  placements,\n  targetPlacements,\n} from \"./placement\";\nimport {\n  COLORS,\n  type HeatFill,\n  type Highlights,\n  NO_HIGHLIGHTS,\n} from \"./renderer\";\nimport type { RoomResult } from \"../heatload/engine\";\nimport { fabricUValue, wallHeatLoadU } from \"./heatfabric\";\nimport { fitNorth, outlineOnPlan } from \"./northfit\";\nimport { PlanPlot, type PlotCredit } from \"./plotplan\";\nimport type { SiteBuilding } from \"./three/site\";\nimport {\n  type DesignHeatLoad,\n  designHeatLoad,\n  type HeatLoadContext,\n  peakModel,\n  type Reconciliation,\n  reconcile,\n} from \"./heatload\";\nimport { resolve as resolveScene } from \"./resolve\";\nimport { dropping, isByHand, pickChange, undrawn } from \"./scenariomarks\";\nimport { setOpenBaseline } from \"./scenelive\";\nimport { nextLetter } from \"./scenestrip\";\nimport {\n  COUNTED_OPTIONS,\n  type Metric,\n  type ScenarioContext,\n  type ScenarioOption,\n  band,\n  neededKw,\n} from \"./scenarios\";\nimport {\n  type TargetRow,\n  describe,\n  groupsFor,\n  setTargets,\n  targetRows,\n  toggled,\n} from \"./targets\";\nimport {\n  type GroupView,\n  MAX_PACKAGES,\n  type OutcomeView,\n  type Pick,\n  ScenarioView,\n  pounds,\n} from \"./scenarioview\";\nimport {\n  AnnotationMode,\n  PaletteEntry,\n  PaletteGroup,\n  TREATED_COLOR,\n  paletteEntries,\n  paletteGroups,\n} from \"./catalog\";\nimport { EditorCore, Selection, SaveState } from \"./core\";\nimport {\n  elsewhere,\n  floorLabel as labelWithCount,\n  forFloor,\n  itemsFromTargets,\n  summarise,\n} from \"./multiselect\";\nimport { distance, formatAreaM2, formatLengthM, polygonArea } from \"./geometry\";\nimport { renderOverlay } from \"./overlay\";\nimport {\n  AnnotationStyle,\n  PlanLayer,\n  Renderer,\n  type DrawnFixture,\n  annotationIn,\n  annotationsClickable,\n  inScope,\n} from \"./renderer\";\nimport {\n  type Model3dAction,\n  type Model3dHandle,\n  type Model3dState,\n  initialModel3d,\n  loadModel3d,\n} from \"./three/state\";\nimport {\n  Annotation,\n  AnnotationGeometry,\n  type Baseline,\n  type OverheatingContext,\n  Design,\n  type DesignPackage,\n  FabricType,\n  Floor,\n  Point,\n  type RadiatorType,\n  type Room,\n  Revision,\n  type Scene,\n  Schedule,\n  ScheduleRow,\n  floorBounds,\n  type FabricPick,\n} from \"./scene\";\nimport {\n  doneSteps,\n  firstOpen,\n  fixtureCount,\n  frontFaces,\n  planExists,\n  STEPS,\n  type StepKey,\n  toCheck,\n  wallCount,\n} from \"./setup\";\n\n// Schedule rows carry string editing buffers (pounds, not pence) for the\n// inline inputs; parsing happens on save.\ninterface EditableScheduleRow extends ScheduleRow {\n  editCost: string;\n  editSavings: string;\n  editCarbon: string;\n  editEpc: string;\n  editNotes: string;\n}\n\ninterface EditableSchedule {\n  rows: EditableScheduleRow[];\n  totals: Schedule[\"totals\"];\n}\n\nfunction editableSchedule(schedule: Schedule): EditableSchedule {\n  return {\n    totals: schedule.totals,\n    rows: schedule.rows.map((row) => ({\n      ...row,\n      editCost:\n        row.cost_override === null ? \"\" : String(row.cost_override / 100),\n      editSavings:\n        row.annual_cost_savings === null\n          ? \"\"\n          : String(row.annual_cost_savings / 100),\n      editCarbon: row.annual_carbon_savings ?? \"\",\n      editEpc: row.energy_rating_improvement ?? \"\",\n      editNotes: row.notes,\n    })),\n  };\n}\n\nfunction parsePounds(value: string): number | null {\n  const trimmed = value.trim().replace(/^\u00A3/, \"\");\n  if (trimmed === \"\") {\n    return null;\n  }\n  const parsed = Number(trimmed.replaceAll(\",\", \"\"));\n  return Number.isFinite(parsed) ? Math.round(parsed * 100) : null;\n}\nimport { snapPoint } from \"./snap\";\nimport { parseLengthMm, traceTransform } from \"./trace\";\nimport { type RoomRow, roomRows, same } from \"./outliner\";\nimport { oneTab, type Tab } from \"./panes\";\nimport { TraceDesk, type TracePanel, tracePanel } from \"./traces\";\nimport { annotateTool } from \"./tools/annotate\";\nimport { type Brush, brushTool, canBeParty, paint } from \"./tools/brush\";\nimport { alignTool } from \"./tools/align\";\nimport { calibrateTool } from \"./tools/calibrate\";\nimport { traceTool } from \"./tools/trace\";\nimport { openingTool } from \"./tools/opening\";\nimport { emitterTool } from \"./tools/emitter\";\nimport { fixtureTool } from \"./tools/fixture\";\nimport {\n  assessmentPoint,\n  cylinderNotes,\n  type Note,\n  type UnitReport,\n  unitReport,\n} from \"./heatpump/report\";\nimport { modelById } from \"./heatpump/models\";\nimport { assumedOccupancy42 } from \"../calc/water\";\nimport { iconSvg } from \"./fixtureicons\";\nimport {\n  FIXTURE_KINDS,\n  type Fixture,\n  type FixtureKind,\n  PLACEABLE,\n  type ShownFixture,\n  PROP_FIELDS,\n  changedFixtures,\n  fixturePoint,\n  shownFixtures,\n  kitRows,\n  type KitRow,\n} from \"./fixtures\";\nimport {\n  type Cover,\n  emitterWatts,\n  RADIATOR_DEFAULTS,\n  roomCover,\n  suggestEmitter,\n  suggestionText,\n} from \"./emitters\";\nimport { placedFromShown, scenarioFixtures } from \"./fixtures\";\nimport { type HeatPumpSite, recordedCylinder, siteOf } from \"./heatpumpcost\";\nimport { roomTool } from \"./tools/room\";\nimport { splitTool } from \"./tools/split\";\nimport { extendTool } from \"./tools/extend\";\nimport {\n  addExtension,\n  buildOver,\n  extensionOutline,\n  footprint,\n  type Placed,\n} from \"./extension\";\nimport {\n  markNewBuild,\n  NEW_BUILD_FLOOR,\n  NEW_BUILD_ROOF,\n  newBuildType,\n} from \"./newbuild\";\nimport {\n  emptyExtensionForm,\n  type ExtensionForm,\n  NEW_BUILD_WALL,\n  newBuildWall,\n  specOf,\n} from \"./extensionform\";\nimport { asIsSceneFor, phaseSummary, phaseView } from \"./proposal\";\nimport { phaseLine } from \"./packfigures\";\nimport { LateWrite } from \"./latewrite\";\nimport { type FigureSources, packageFigures } from \"./packagefigures\";\nimport { bringForward, type Side, saved } from \"./bringforward\";\nimport { wallTool } from \"./tools/wall\";\nimport { type Resized, resizeWall } from \"./resize\";\nimport {\n  emptySpaces,\n  largerFirst,\n  mergeRooms,\n  neighbours,\n  outlineFigures,\n  polygonOf,\n  removeRoomWithWalls,\n  settle,\n  wallEnds,\n  wallKind,\n  wallKinds,\n} from \"./topology\";\nimport { selectTool } from \"./tools/select\";\nimport {\n  type EmitterDraft,\n  OpeningType,\n  Tool,\n  ToolContext,\n  ToolName,\n} from \"./tools/types\";\nimport {\n  ScreenRect,\n  ViewBox,\n  bringIntoView,\n  defaultView,\n  fitBounds,\n  panBy,\n  turnBounds,\n  turnPoint,\n  screenToWorld,\n  worldPerPixel,\n  zoomAt,\n} from \"./viewport\";\n\n/** The fixture being edited, as its panel shows it. */\ninterface FixtureEdit {\n  name: string;\n  state: \"existing\" | \"proposed\" | \"removed\";\n  /** Its details can be changed (a scenario can only remove what's there). */\n  editable: boolean;\n  fields: {\n    key: string;\n    label: string;\n    options: readonly string[];\n    numeric: boolean;\n    value: string;\n  }[];\n  /** What the placement comes to: sizing, clearance, noise, the cylinder's size. */\n  notes: Note[];\n  /** An outdoor unit, which has a noise position to drop. */\n  unit: boolean;\n  /** Its noise position is down. */\n  assessed: boolean;\n}\n\nconst SNAP_TOLERANCE_PX = 10;\n\nconst STOREY_NAMES: Record<number, string> = {\n  1: \"First floor\",\n  2: \"Second floor\",\n  3: \"Third floor\",\n};\n\nconst TOOL_CURSORS: Record<ToolName, string> = {\n  select: \"default\",\n  opening: \"copy\",\n  emitter: \"copy\",\n  room: \"crosshair\",\n  wall: \"crosshair\",\n  split: \"crosshair\",\n  extend: \"crosshair\",\n  calibrate: \"crosshair\",\n  trace: \"default\",\n  align: \"crosshair\",\n  annotate: \"crosshair\",\n  brush: \"cell\",\n  floor: \"move\",\n  fixture: \"copy\",\n};\n\n/** The layer a tool draws on, shown again when it's picked. */\nconst TOOL_LAYERS: Partial<Record<ToolName, PlanLayer>> = {\n  opening: \"openings\",\n  emitter: \"emitters\",\n  room: \"rooms\",\n  wall: \"walls\",\n  split: \"walls\",\n  brush: \"walls\",\n  annotate: \"measures\",\n};\n\n/** The layer each kind of selection is drawn on. */\nconst SELECTED_LAYER: Record<\n  Exclude<NonNullable<Selection>[\"type\"], \"annotation\">,\n  PlanLayer\n> = {\n  wall: \"walls\",\n  opening: \"openings\",\n  room: \"rooms\",\n  emitter: \"emitters\",\n};\n\ninterface LayersMenu {\n  hidden: PlanLayer[];\n  hiddenKinds: string[];\n  /** The measures on this floor, kind by kind, read as the plan redraws. */\n  kinds: { kind: string; name: string; color: string; count: number }[];\n}\n\n/** The tool rail over the plan's left edge, and its margin. */\nconst RAIL_WIDTH_PX = 56;\n\n/** Per design: typed scenario prices and the options switched on. */\nfunction scenarioKey(design: number): string {\n  return `design:${design}:scenarios`;\n}\n\nfunction loadScenarioSettings(design: number): Record<string, unknown> | null {\n  try {\n    const stored = window.localStorage.getItem(scenarioKey(design));\n    return stored ? (JSON.parse(stored) as Record<string, unknown>) : null;\n  } catch {\n    return null;\n  }\n}\n\n/** Every end of putting a package on the plan, so the Drawings stop waiting. */\nfunction placementEnded(placed: boolean): void {\n  window.dispatchEvent(\n    new CustomEvent(\"placement-ended\", { detail: { placed } }),\n  );\n}\n\nfunction saveScenarioSettings(design: number, view: ScenarioView): void {\n  try {\n    window.localStorage.setItem(\n      scenarioKey(design),\n      JSON.stringify(view.settings()),\n    );\n  } catch {\n    // Private windows and blocked storage: the settings last the visit.\n  }\n}\n\ninterface OutlineView {\n  area: string;\n  perimeter: string;\n  exposed: string;\n  party: string;\n  empties: number;\n}\n\nfunction outlineView(scene: Scene | null): OutlineView {\n  const figures = scene\n    ? outlineFigures(scene)\n    : { area: 0, perimeter: 0, party: 0, empties: 0 };\n  return {\n    area: formatAreaM2(figures.area),\n    perimeter: formatLengthM(figures.perimeter),\n    exposed: formatLengthM(figures.perimeter - figures.party),\n    party: formatLengthM(figures.party),\n    empties: figures.empties,\n  };\n}\n\ninterface FloorSummary {\n  id: number;\n  name: string;\n  level: number;\n}\n\ninterface WallProps {\n  type: \"wall\";\n  id: string;\n  thickness: number;\n  /** mm; typing one moves the wall's far side to suit. */\n  length: number | \"\";\n  fabric: string; // FabricType id as string; \"\" = design default\n  kind: string; // derived from the rooms either side, not stored\n  party: boolean;\n  canBeParty: boolean;\n}\n\ninterface OpeningProps {\n  type: \"opening\";\n  id: string;\n  openingType: OpeningType;\n  width: number;\n  height: number;\n  sill: number | \"\";\n  swing: \"left\" | \"right\" | \"none\";\n  flip: boolean;\n  double: boolean;\n  fabric: string;\n  kind: string; // its wall's, derived from the rooms either side\n  /** Part O: how it opens; \"\" and blanks take the defaults. */\n  vent: VentStyle | \"\";\n  ventAngle: number | \"\";\n  ventWidth: number | \"\";\n  ventHeight: number | \"\";\n  shading: Shading;\n  secure: boolean;\n  guarded: boolean;\n  glazed: boolean;\n  trickle: boolean;\n}\n\n/** The flat editing buffer behind the fabric type dialog. */\ninterface SetupState {\n  open: boolean;\n  step: number;\n  saving: boolean;\n  /** The baseline's answers, edited in the flow before they're saved. */\n  answers: Record<string, string | number>;\n  /** Elements that have had a type picked this time round. */\n  added: Record<string, boolean>;\n}\n\n/** The north on offer from the map, and where the offer stands. */\ninterface NorthFitView {\n  state: \"idle\" | \"loading\" | \"found\" | \"none\";\n  message: string;\n  deg: number;\n}\n\ninterface FabricForm {\n  open: boolean;\n  id: number | null;\n  element: FabricType[\"element\"];\n  name: string;\n  isDefault: boolean;\n  wallKind: string;\n  construction: string;\n  age: string;\n  thicknessMm: string;\n  insulationMode: InsulationMode;\n  insulationPlace: string;\n  insulationThicknessMm: string;\n  glazing: string;\n  frame: string;\n  draughtProofed: boolean;\n  doorKind: string;\n  floorConstruction: string;\n  floorInsulationMm: string;\n  roofInsulationKind: string;\n  roofInsulationMm: string;\n  roomInRoof: boolean;\n  gap: string;\n  gasFilled: boolean;\n  /** The glass's g-value and light transmittance; \"\" takes SAP Table 6b. */\n  gValue: string;\n  lightTransmittance: string;\n  /** W/m\u00B2K, measured on site or known from the maker; \"\" takes RdSAP's. */\n  uvalue: string;\n  /** Walls using this type, and the selected wall it was opened from, if any. */\n  usedBy: number;\n  wallId: string;\n}\n\nfunction emptyFabricForm(): FabricForm {\n  return {\n    open: false,\n    id: null,\n    element: \"WALL\",\n    name: \"\",\n    isDefault: false,\n    wallKind: \"EXTERNAL\",\n    construction: \"UNFILLED_CAVITY\",\n    age: \"D\",\n    thicknessMm: \"\",\n    insulationMode: \"AS_BUILT\",\n    insulationPlace: \"EXTERNAL\",\n    insulationThicknessMm: \"\",\n    glazing: \"DOUBLE_GLAZED\",\n    frame: \"PVC\",\n    draughtProofed: false,\n    doorKind: \"UNINSULATED\",\n    floorConstruction: \"UNSEALED_SUSPENDED_TIMBER\",\n    floorInsulationMm: \"\",\n    roofInsulationKind: \"JOISTS\",\n    roofInsulationMm: \"\",\n    roomInRoof: false,\n    gap: \"UNKNOWN\",\n    gasFilled: false,\n    gValue: \"\",\n    lightTransmittance: \"\",\n    uvalue: \"\",\n    usedBy: 0,\n    wallId: \"\",\n  };\n}\n\n/** What the heat load and SAP each take for the wall being edited. */\nfunction liveWallUs(\n  form: FabricForm,\n  live: { u: number | null; nation: string } | null,\n): {\n  heat: { u: number; source: string } | null;\n  rdsap: number | null;\n  nation: string;\n} {\n  return {\n    heat: wallHeatLoadU(elementSpec(form)),\n    rdsap: live?.u ?? null,\n    nation: live?.nation ?? \"England\",\n  };\n}\n\nfunction parseU(value: string): number | null {\n  const parsed = Number(value.trim());\n  return value.trim() !== \"\" && Number.isFinite(parsed) && parsed > 0\n    ? Math.round(parsed * 1000) / 1000\n    : null;\n}\n\n/** What every element's spec carries for the heat load. */\nfunction heatLoadSpec(form: FabricForm): Record<string, unknown> {\n  return { uvalue: parseU(form.uvalue), dhdg: null };\n}\n\nfunction parseFraction(value: string): number | null {\n  const parsed = Number(value.trim());\n  return value.trim() !== \"\" && parsed > 0 && parsed <= 1 ? parsed : null;\n}\n\nfunction parseMm(value: string): number | null {\n  const parsed = Number(value.trim());\n  return Number.isFinite(parsed) && parsed > 0 ? Math.round(parsed) : null;\n}\n\nfunction fabricFormSpec(form: FabricForm): Record<string, unknown> {\n  return { ...elementSpec(form), ...heatLoadSpec(form) };\n}\n\nfunction elementSpec(form: FabricForm): Record<string, unknown> {\n  switch (form.element) {\n    case \"WALL\":\n      return {\n        kind: form.wallKind,\n        construction: form.construction,\n        age: form.age,\n        thickness_mm: parseMm(form.thicknessMm),\n        insulation: {\n          kind: insulationKindOf(form.insulationMode, form.insulationPlace),\n          thickness_mm: parseMm(form.insulationThicknessMm),\n        },\n      };\n    case \"WINDOW\":\n      return {\n        glazing: form.glazing,\n        frame: form.frame,\n        gap: form.gap,\n        gas_filled: form.gasFilled,\n        draught_proofed: form.draughtProofed,\n        g_value: parseFraction(form.gValue),\n        light_transmittance: parseFraction(form.lightTransmittance),\n      };\n    case \"DOOR\":\n      return { kind: form.doorKind };\n    case \"FLOOR\":\n      return {\n        construction: form.floorConstruction,\n        insulation_thickness_mm: parseMm(form.floorInsulationMm),\n      };\n    case \"ROOF\":\n      return {\n        insulation_kind: form.roofInsulationKind,\n        insulation_thickness_mm: parseMm(form.roofInsulationMm),\n        room_in_roof: form.roomInRoof,\n      };\n  }\n}\n\nfunction filledFabricForm(type: FabricType): FabricForm {\n  const form = emptyFabricForm();\n  form.id = type.id;\n  form.element = type.element;\n  form.name = type.name;\n  form.isDefault = type.is_default;\n  const spec = type.spec;\n  const text = (key: string): string =>\n    spec[key] === null || spec[key] === undefined ? \"\" : String(spec[key]);\n  form.uvalue = text(\"uvalue\");\n  form.gap = text(\"gap\") || \"UNKNOWN\";\n  form.gasFilled = spec[\"gas_filled\"] === true;\n  if (type.element === \"WALL\") {\n    form.wallKind = text(\"kind\") || \"EXTERNAL\";\n    form.construction = text(\"construction\") || \"UNFILLED_CAVITY\";\n    form.age = text(\"age\") || \"D\";\n    form.thicknessMm = text(\"thickness_mm\");\n    const insulation = (spec[\"insulation\"] ?? {}) as Record<string, unknown>;\n    const choice = insulationChoice(String(insulation[\"kind\"] ?? \"AS_BUILT\"));\n    form.insulationMode = choice.mode;\n    form.insulationPlace = choice.place;\n    form.insulationThicknessMm =\n      insulation[\"thickness_mm\"] === null ||\n      insulation[\"thickness_mm\"] === undefined\n        ? \"\"\n        : String(insulation[\"thickness_mm\"]);\n  } else if (type.element === \"WINDOW\") {\n    form.glazing = text(\"glazing\") || \"DOUBLE_GLAZED\";\n    form.frame = text(\"frame\") || \"PVC\";\n    form.draughtProofed = spec[\"draught_proofed\"] === true;\n    form.gValue = text(\"g_value\");\n    form.lightTransmittance = text(\"light_transmittance\");\n  } else if (type.element === \"DOOR\") {\n    form.doorKind = text(\"kind\") || \"UNINSULATED\";\n  } else if (type.element === \"FLOOR\") {\n    form.floorConstruction =\n      text(\"construction\") || \"UNSEALED_SUSPENDED_TIMBER\";\n    form.floorInsulationMm = text(\"insulation_thickness_mm\");\n  } else {\n    form.roofInsulationKind = text(\"insulation_kind\") || \"JOISTS\";\n    form.roofInsulationMm = text(\"insulation_thickness_mm\");\n    form.roomInRoof = spec[\"room_in_roof\"] === true;\n  }\n  return form;\n}\n\ninterface RoomProps {\n  type: \"room\";\n  id: string;\n  name: string;\n  roomType: string;\n  ceilingHeight: number | \"\";\n  /** Sloped and room-in-roof ceilings: see `ceiling.ts`. */\n  ceiling: \"flat\" | \"sloped\" | \"roof_room\";\n  ceilingLow: number | \"\";\n  ceilingHigh: number | \"\";\n  /** The plan degrees it falls to, as the select's string. */\n  ceilingFall: string;\n  ceilingRidge: boolean;\n  heated: boolean;\n  area: string;\n  /** \u00B0C over the room type's design temperature; \"\" keeps the type's. */\n  temperature: number | \"\";\n  vents: number;\n  fans: number;\n  flues: number;\n  extract: number;\n  /** Rooms it shares a wall with, the longest shared first: merge targets. */\n  neighbours: { id: string; label: string }[];\n}\n\n/** Writes the shape the row sets; a flat room carries none, as drawn. */\nfunction applyCeiling(room: Room, props: RoomProps): void {\n  for (const key of [\n    \"ceiling\",\n    \"ceiling_low\",\n    \"ceiling_high\",\n    \"ceiling_fall\",\n    \"ceiling_ridge\",\n  ] as const) {\n    delete room[key];\n  }\n  if (props.ceiling === \"flat\") {\n    return;\n  }\n  const mm = (raw: number | \"\", fallback: number) =>\n    Math.max(1, Math.round(Number(raw) || fallback));\n  const low = mm(props.ceilingLow, 1200);\n  room.ceiling = props.ceiling;\n  room.ceiling_low = low;\n  room.ceiling_high = Math.max(low, mm(props.ceilingHigh, 2400));\n  room.ceiling_fall = Number(props.ceilingFall) || 0;\n  if (props.ceiling === \"sloped\" && props.ceilingRidge) {\n    room.ceiling_ridge = true;\n  }\n}\n\ninterface AnnotationProps {\n  type: \"annotation\";\n  domId: string;\n  name: string;\n  figure: string | null;\n  label: string;\n  notes: string;\n  status: \"PROPOSED\" | \"CONFIRMED\" | \"REJECTED\";\n  quantity: string;\n}\n\n/** A radiator's or underfloor's editing buffer; the other kind's fields idle. */\ninterface EmitterProps {\n  type: \"emitter\";\n  id: string;\n  kind: \"radiator\" | \"underfloor\";\n  length: number | \"\";\n  height: number | \"\";\n  radiatorType: RadiatorType;\n  /** m\u00B2; \"\" covers the whole room. */\n  area: number | \"\";\n  finish: \"tile\" | \"wood\";\n  room: string;\n  roomId: string;\n}\n\n/** The next emitter, as the toolbar sets it. */\ninterface EmitterForm {\n  kind: \"radiator\" | \"underfloor\";\n  length: number | \"\";\n  height: number | \"\";\n  type: RadiatorType;\n  finish: \"tile\" | \"wood\";\n}\n\ntype SelectionProps =\n  | WallProps\n  | OpeningProps\n  | EmitterProps\n  | RoomProps\n  | AnnotationProps\n  | null;\n\n/** Design edits the baseline or the scenario open; Compare puts scenarios side by side. */\nexport type Mode = \"design\" | \"compare\" | \"overheating\";\n\n/** The Overheating tab is hidden; keep in step with SHOW_OVERHEATING in workspace.py. */\nconst SHOW_OVERHEATING = false;\n\nconst MODES: readonly Mode[] = [\"design\", \"compare\", \"overheating\"];\n\n/** What the editing header calls a selected thing that has no name. */\nconst SELECTION_NAMES: Record<string, string> = {\n  wall: \"Wall\",\n  opening: \"Opening\",\n  emitter: \"Radiator\",\n  room: \"Room\",\n  annotation: \"Measure\",\n};\n\n/** A measure is what a scenario adds; the house as it is goes in House. */\nconst NO_BASELINE_MEASURES =\n  \"Measures are what a scenario adds: open or create one. Record what the house has now in House.\";\n\n/** The tools a scenario offers: it adds measures, not walls. */\nconst SCENARIO_TOOLS: ReadonlySet<ToolName> = new Set([\n  \"select\",\n  \"annotate\",\n  \"fixture\",\n]);\n\nconst FOLDS_KEY = \"design.folds\";\n\n/** The properties tab left open, per browser; Selection when unknown. */\nfunction loadFolds(): Record<string, boolean> {\n  try {\n    return oneTab(JSON.parse(window.localStorage.getItem(FOLDS_KEY) ?? \"{}\"));\n  } catch {\n    return oneTab(null);\n  }\n}\n\nfunction saveFolds(folds: Record<string, boolean>): void {\n  try {\n    window.localStorage.setItem(FOLDS_KEY, JSON.stringify(folds));\n  } catch {\n    // Private windows and blocked storage: the sections last the visit.\n  }\n}\n\n/** The old tabs' names still open where they went. */\nconst OLD_MODES: Record<string, Mode> = {\n  plan: \"design\",\n  measures: \"design\",\n  scenarios: \"compare\",\n};\n\nexport function asMode(value: string | undefined): Mode | null {\n  return MODES.find((mode) => mode === value) ?? OLD_MODES[value ?? \"\"] ?? null;\n}\n\ninterface Importer {\n  open: boolean;\n  loading: boolean;\n  error: string;\n  query: string;\n  plans: MagicplanPlan[];\n  plan: MagicplanPlan | null;\n  preview: MagicplanPreview | null;\n  floors: string[];\n  replace: boolean;\n  confirmed: boolean;\n  importing: boolean;\n}\n\nfunction closedImporter(): Importer {\n  return {\n    open: false,\n    loading: false,\n    error: \"\",\n    query: \"\",\n    plans: [],\n    plan: null,\n    preview: null,\n    floors: [],\n    replace: false,\n    confirmed: false,\n    importing: false,\n  };\n}\n\ninterface ScenarioState {\n  status: \"idle\" | \"loading\" | \"built\" | \"searching\" | \"ready\" | \"error\";\n  error: string;\n  progress: number;\n  count: number;\n  size: number;\n  metric: Metric;\n  applying: boolean;\n  /** Options are going on or coming off the plan; picks wait for it. */\n  placing: boolean;\n  /** Options left out to keep the first search quick, by name. */\n  leftOut: string;\n  /** Packages a search with them back would score. */\n  more: number;\n}\n\n/** An option a scenario picks that draws a measure on the plan. */\ninterface PickedOption {\n  option: ScenarioOption;\n  /** Its group's id: where `placements` draws it. */\n  group: string;\n  /** For kit, its place in the row beside the house. */\n  slot: number;\n}\n\ninterface InventoryRow {\n  kind: string;\n  name: string;\n  figure: string | null;\n  color: string;\n  quantity: string;\n  cost: string;\n}\n\ninterface QuickMeasure {\n  kind: string;\n  name: string;\n  color: string;\n}\n\n/** A kept package, scored against the plan as it is now. */\ninterface SavedView {\n  id: number;\n  name: string;\n  letter: string;\n  recommended: boolean;\n  /** It's the package on show. */\n  current: boolean;\n  picks: string[];\n  figures: OutcomeView;\n  /** The plan has changed its figures since it was kept. */\n  drifted: boolean;\n}\n\n/** A kept package's phases, as the scenarios step arranges them. */\ninterface PhasingView {\n  id: number;\n  phases: {\n    key: string;\n    name: string;\n    label: string;\n    /** SAP and cost once this phase is done, as kept. */\n    figures: string;\n    kinds: { kind: string; name: string; color: string; option: boolean }[];\n  }[];\n  /** Kinds that could join a phase without a scenario option. */\n  extras: { kind: string; name: string }[];\n  kept: string;\n  busy: boolean;\n}\n\ninterface ChartTip {\n  show: boolean;\n  x: number;\n  y: number;\n  title: string;\n  lines: string[];\n}\n\ninterface State extends Record<string | symbol, unknown>, TracePanel {\n  mode: Mode;\n  setMode(mode: Mode): void;\n  /** The scenario open (`?scenario=`), or null editing the baseline. */\n  scenarioId: number | null;\n  /** The properties pane's tabs, the one open true (sidebar/ in templates). */\n  folds: Record<string, boolean>;\n  setFold(key: string, open: boolean): void;\n  /** Opens one properties tab, shutting the one that was open. */\n  setTab(key: Tab): void;\n  /** The editing header's place: \"Ground floor \u00B7 Kitchen\". */\n  editingPlace(): string;\n  /** Staff: the SAP worksheet behind the figures (worksheetview.ts). */\n  openWorksheet(): void;\n  staff: boolean;\n  v2: boolean;\n  emptyDesign: boolean;\n  heatMap: boolean;\n  toggleHeatMap(): void;\n  /** What's hidden from the plan, so what's under it can be edited. */\n  layers: LayersMenu;\n  refreshRooms(): void;\n  refreshLayers(): void;\n  /** The outliner's rooms, floor by floor. */\n  floorRooms: Record<number, RoomRow[]>;\n  toggleLayer(layer: PlanLayer): void;\n  toggleKind(kind: string): void;\n  showAllLayers(): void;\n  /** Measures on and off together (H). */\n  toggleMeasures(): void;\n  /** Show a layer again, and a measure kind on it, to draw on it. */\n  showLayer(layer: PlanLayer, kind?: string): void;\n  applyLayers(): void;\n  heatLegend: { color: string; label: string }[];\n  importer: Importer;\n  /** Where the project's one magicplan import stands; empty until it runs. */\n  magicplanStatus: string;\n  /** The plan it came from: later the importer only redraws its floors. */\n  magicplanPlan: string;\n  notice: string;\n  /** A link the notice carries, while that notice is showing. */\n  noticeLink: { notice: string; text: string; href: string } | null;\n  openImporter(): void;\n  closeImporter(): void;\n  filteredPlans(): MagicplanPlan[];\n  choosePlan(plan: MagicplanPlan): void;\n  toggleImportFloor(uid: string): void;\n  runImport(): void;\n  scenario: ScenarioState;\n  scenarioGroups: GroupView[];\n  outcome: OutcomeView | null;\n  baseOutcome: OutcomeView | null;\n  picks: Pick[];\n  fixtureKind: FixtureKind;\n  /** The fixture being edited, as `<floor pk>:<id>`; empty for none. */\n  fixtureKey: string;\n  fixtureKinds: { kind: FixtureKind; label: string; icon: string }[];\n  fixtureEdit: FixtureEdit | null;\n  /** The next click on the plan drops the selected unit's noise position. */\n  assessing: boolean;\n  armAssess(): void;\n  clearAssess(): void;\n  dropAssess(point: Point): void;\n  fixtureNotes(found: ShownFixture): Note[];\n  fixtureReport(found: ShownFixture): UnitReport | null;\n  fixtureOverlay(shown: ShownFixture): Partial<DrawnFixture>;\n  setFixtureProps(values: Record<string, number | null>): void;\n  armFixture(kind: FixtureKind): void;\n  setFixtureField(key: string, value: string): void;\n  removeFixture(): void;\n  restoreFixture(): void;\n  drawFixtures(): void;\n  /** What the plan shows: grey for what's there, colour for what's proposed. */\n  legend: { existing: boolean; proposed: boolean };\n  shownFixtureList(): ShownFixture[];\n  refreshFixtureEdit(): void;\n  addFixture(fixture: Fixture): void;\n  selectFixture(key: string | null): void;\n  /** House's list of the fixtures there now, refreshed as they're drawn. */\n  houseKit: KitRow[];\n  openFixture(key: string): void;\n  targetClick(event: Event): void;\n  targetHighlights(): Highlights;\n  scenarioEdited(): void;\n  /** The picked options and what each covers, for the Measures section. */\n  targetRows: TargetRow[];\n  /** The option whose coverage is being edited by clicking the plan. */\n  targetOption: string;\n  /** The option whose \"Choose\u2026\" menu is open. */\n  targetMenu: string;\n  refreshTargets(): void;\n  chooseTargets(option: string, group: string): void;\n  editTargets(option: string): void;\n  chartTip: ChartTip;\n  loadScenarios(): void;\n  runSearch(): void;\n  pickOption(group: number, option: number): void;\n  /** Save the picks onto the scenario open, with its figures. */\n  keepScenarioOptions(): void;\n  toggleOption(id: string): void;\n  searchMore(): void;\n  setOptionRate(id: string, value: string): void;\n  setMetric(metric: Metric): void;\n  clearPackage(): void;\n  view3d: boolean;\n  model3d: Model3dState;\n  toggle3d(): void;\n  act3d(action: Model3dAction, value?: unknown): void;\n  draw3d(): void;\n  queue3d(): void;\n  checks: Check[];\n  propertyType: string;\n  refreshChecks(): void;\n  goToCheck(check: Check): void;\n  fixCheck(check: Check): void;\n  checkAt: CheckPlace | null;\n  stepCheck(step: 1 | -1): void;\n  brushName: string;\n  setBrush(kind: \"fabric\" | \"party\", value: number | boolean): void;\n  brushFloor(): void;\n  saved: SavedView[];\n  refreshSaved(): void;\n  creating: boolean;\n  createScenario(): void;\n  scenarioAction(detail: {\n    action: \"recommend\" | \"rename\" | \"delete\";\n    id: number;\n  }): void;\n  renameSaved(id: number, name: string): void;\n  recommendSaved(id: number): void;\n  deleteSaved(id: number): void;\n  figureSources(view: ScenarioView, calc: CalcContext): FigureSources;\n  phasing: PhasingView | null;\n  /** The kept package whose phases are on show; null is the recommended one. */\n  phasingId: number | null;\n  refreshPhasing(): void;\n  changePhases(change: (phases: Phase[], packaged: string[]) => Phase[]): void;\n  keepPhases(id: number, phases: Phase[]): void;\n  addPhase(): void;\n  renamePhase(index: number, name: string): void;\n  movePhase(index: number, delta: number): void;\n  removePhase(index: number): void;\n  moveKind(kind: string, index: number): void;\n  addPhaseKind(kind: string): void;\n  dropPhaseKind(kind: string): void;\n  refreshFigures(): void;\n  grantsOn: boolean;\n  setGrants(on: boolean): void;\n  applyPackage(): void;\n  placeSteps(target: number): Promise<{ annotations: number }>;\n  /** The scenario open's picked options with nothing on the plan, by name. */\n  undrawn: string[];\n  refreshUndrawn(): void;\n  /** Draw every picked option that isn't on the plan, after a snapshot. */\n  drawUndrawn(): void;\n  /** Marks drawn by hand of a measure just dropped: kept unless removed. */\n  handDrawn: {\n    count: number;\n    label: string;\n    kinds: string[];\n    target: number;\n  } | null;\n  removeHandDrawn(): void;\n  whereOption(\n    entry: PickedOption,\n    target: number,\n    aimed?: { at: readonly string[] | undefined },\n  ): Placement[];\n  placeOptions(\n    entries: readonly PickedOption[],\n    target: number,\n  ): Promise<number>;\n  dropOptions(\n    dropped: readonly ScenarioOption[],\n    target: number,\n  ): Promise<void>;\n  /** Take marks off the plan, as one undoable edit on each floor. */\n  removeMarks(gone: readonly Annotation[]): Promise<void>;\n  /** Move an option's own marks onto what it covers now. */\n  /** `was`: the targets its marks were drawn for, to see if any were moved. */\n  redrawOption(\n    optionId: string,\n    was?: { at: readonly string[] | undefined },\n  ): void;\n  /** Run placement writes one after another, the options off meanwhile. */\n  placeSerially(work: () => Promise<unknown>): Promise<void>;\n  /** The scenario a package goes on the plan in: the one open in Design,\n   * else the saved one Compare shows; null when it isn't saved. */\n  placeTarget(): number | null;\n  /** The recommended package onto the plan, asked for by the Drawings. */\n  placePackage(): void;\n  placeQueuedPackage(): void;\n  showScenario(): void;\n  refreshOverlays(): void;\n  inventory: InventoryRow[];\n  refreshInventory(): void;\n  /** The schedule of what's being edited: the baseline's, or the scenario's. */\n  scopeScheduleUrl(): string;\n  scheduleInventory(): void;\n  selectKind(kind: string): void;\n  quickMeasures(): QuickMeasure[];\n  quickAdd(kind: string): void;\n  /** Into `pkg` (a scenario), else into what's being edited. */\n  addAnnotations(\n    entries: {\n      floor: Floor;\n      kind: string;\n      geometry: AnnotationGeometry;\n      /** The scenario option drawing it; none when drawn by hand. */\n      option?: string;\n    }[],\n    pkg?: number | null,\n  ): Promise<number>;\n  refetchCalc(): void;\n  loading: boolean;\n  error: string;\n  floors: FloorSummary[];\n  currentFloorId: number | null;\n  zoomPercent: number;\n  tool: ToolName;\n  openingType: OpeningType;\n  /** What the next door, window or opening is placed at, mm. */\n  openingWidths: Record<OpeningType, number | \"\">;\n  emitterForm: EmitterForm;\n  setEmitterKind(kind: EmitterForm[\"kind\"]): void;\n  extensionForm: ExtensionForm;\n  /** A proposal, over the house as it is when `phases.available`. */\n  proposed: boolean;\n  phases: { available: boolean; show: boolean; summary: string };\n  syncPhases(): void;\n  togglePhases(): void;\n  refreshExtension(): void;\n  buildExtension(): void;\n  extendFromSelected(): void;\n  extendFrom(placed: Placed): void;\n  /** Rooms on the floor above, over the selected room or this whole floor. */\n  buildOver(scope: \"room\" | \"floor\"): void;\n  extensionWall(): Promise<FabricType | null>;\n  /** A proposal's new-build floor and roof types, made the first time. */\n  extensionFloorAndRoof(): Promise<\n    readonly [FabricType | null, FabricType | null]\n  >;\n  /** Corrections to the house as it is this proposal hasn't taken yet. */\n  forward: { count: number; conflicts: number; busy: boolean };\n  checkForward(): void;\n  applyForward(): void;\n  hint: string;\n  /** What a click with the select tool would take. */\n  hovered: string;\n  saveState: SaveState;\n  canUndo: boolean;\n  canRedo: boolean;\n  selection: SelectionProps;\n  /** Several selected at once: what they add up to, the measures that cover\n   * them, and how many sit on each other floor. */\n  multiSummary: string;\n  multiMeasures: { label: string; color: string }[];\n  floorCounts: Record<number, number>;\n  /** \"2 on First floor\": what is selected on the floors not in view. */\n  floorBadge: string;\n  /** The pill whose cover is selected (its option id), or \"\". */\n  pillOn: string;\n  /** The current floor's outline, in figures for the side panel. */\n  outline: OutlineView;\n  /** A draft from the trace, shown to accept or discard. */\n  draft: { busy: boolean; ready: boolean; rooms: number; openings: number };\n  calibration: { active: boolean; length: string };\n  measureQuery: string;\n  figureOf(kind: string): string | null;\n  pickedMeasure: string;\n  annotationMode: AnnotationMode;\n  scheduleOpen: boolean;\n  schedule: EditableSchedule | null;\n  toggleSchedule(): void;\n  refreshSchedule(): void;\n  saveScheduleRow(row: EditableScheduleRow): void;\n  formatPence(pence: number): string;\n  fabricTypes: FabricType[];\n  fabricForm: FabricForm;\n  /** RdSAP's default U for the wall type being edited, once the server says. */\n  fabricLive: { u: number | null; nation: string } | null;\n  /** Line up with the map: what it found, and the north on offer. */\n  northFit: NorthFitView;\n  /** HM Land Registry's credit, while the house's plot is drawn on the plan. */\n  plotCredit: PlotCredit | null;\n  historyOpen: boolean;\n  revisions: Revision[];\n  /** This session's edits on the open floor, newest first. */\n  sessions: Session[];\n  roomInspection(): Inspection | null;\n  hoverRow(row: Row | null): void;\n  pickRow(row: Row): void;\n  openRowFabric(row: Row): void;\n  refreshLog(): void;\n  showLine(line: LogLine): void;\n  revertLine(line: LogLine): void;\n  kindTitle(kind: ChangeKind): string;\n  sessionTitle(session: Session): string;\n  clock(at: number): string;\n  savedTitle(revision: Revision): string;\n  heatLoss: {\n    coefficient: string;\n    parameter: string;\n    rating: string;\n    band: string;\n  } | null;\n  heatLossError: string;\n  roomLoss: DesignHeatLoad | null;\n  selectedRoomLoss(): RoomResult | null;\n  /** \u00B0C the emitters are sized at. */\n  flowC(): number;\n  heatPumpSite(\n    scenario: { fixtures?: DesignPackage[\"fixtures\"] } | null,\n  ): HeatPumpSite;\n  siteKey(): string;\n  siteChanged(): void;\n  /** Sets the design flow temperature, saved with the heat load settings. */\n  setFlow(celsius: number): void;\n  /** What would close a room's shortfall, or \"\" when it has none. */\n  suggestionFor(roomId: string): string;\n  /** A room's emitters against its heat loss; null with none or no figure. */\n  coverOf(roomId: string): Cover | null;\n  /** W the selected emitter gives at the flow temperature, or null. */\n  selectedEmitterWatts(): number | null;\n  heatLoadContext: HeatLoadContext | null;\n  overheatingContext: OverheatingContext | null;\n  /** Part O's simplified method on the plan as drawn. */\n  overheating: DesignOverheating | null;\n  overheatingError: string;\n  overheatingLegend: { color: string; label: string }[];\n  scheduleOverheating(): void;\n  recomputeOverheating(): void;\n  saveOverheating(): void;\n  overheatingRoom(id: string): OverheatingRoom | null;\n  heatLoadOpen: boolean;\n  heatLoadError: string;\n  /** Quarter turns of the view, clockwise, in degrees. */\n  planRotation: number;\n  /** Where north points on the plan as drawn; null until set. */\n  northDeg: number | null;\n  compassOpen: boolean;\n  /** True while a click in the properties pane shouldn't switch its tab. */\n  tabLock: boolean;\n  /** The set-up answers, while no EPC's RdSAP stands behind the figures. */\n  baseline: Baseline | null;\n  /** What the figures assumed, when they rest on the answers. */\n  assumptions: Assumption[];\n  assumptionsOpen: boolean;\n  setup: SetupState;\n  openSetup(announce?: boolean): void;\n  closeSetup(): void;\n  setupKey(): StepKey;\n  setupTitle(): string;\n  setupNext(): void;\n  setupBack(): void;\n  setupGo(index: number): void;\n  setupReady(): boolean;\n  setupAnswer(key: string, raw: string): void;\n  setupHouse(): void;\n  setupSaveDone(): void;\n  setupWalls(): string;\n  setupPicked(element: string): FabricPick[];\n  setupIsAdded(element: string, pick: FabricPick): boolean;\n  setupAdd(element: string, pick: FabricPick): void;\n  setupMakeDefault(id: number): void;\n  setupWallTypes(): FabricType[];\n  setupPaint(id: number): void;\n  setupParty(): void;\n  setupAssignDifferent(): void;\n  setupCount(kind: FixtureKind): number;\n  setupTrickle(on: boolean): void;\n  openSetupIfUnconfirmed(): void;\n  onEveryFloor(mutate: (scene: Scene) => void): void;\n  setupFront(): string;\n  lineUpWithMap(): void;\n  showLineUp(): void;\n  nudgeLineUp(degrees: number): void;\n  acceptLineUp(): void;\n  cancelLineUp(): void;\n  setupPlace(kind: FixtureKind): void;\n  changesSaving: boolean;\n  /** Set what a proposed scene changes; \"\" puts it back as the house has it. */\n  saveChange(key: string, raw: string): void;\n  /** One set-up answer, from the House tab, as the guided flow saves them. */\n  saveAnswer(key: string, raw: string): void;\n  twinPushing: boolean;\n  /** Move floor: the panel, and what it does. */\n  align: AlignView;\n  aligner: FloorAligner;\n  pushTwin(): void;\n  turnPlan(quarters: number): void;\n  /** North as it shows on screen, or null. */\n  northOnScreen(): number | null;\n  setNorthOnScreen(raw: string): void;\n  nudgeNorth(degrees: number): void;\n  clearNorth(): void;\n  saveOrientation(body: {\n    north_deg?: number | null;\n    plan_rotation?: number;\n  }): void;\n  recomputeRoomLoss(\n    floors: Floor[],\n    elements: Record<string, Record<string, unknown>>,\n  ): void;\n  saveHeatLoad(): void;\n  setHeatLoad(key: string, raw: string | boolean): void;\n  heatLoadSummary(): string;\n  reconciliation(): Reconciliation | null;\n  selectRoom(id: string): void;\n  kilowatts(watts: number): string;\n  toggleHistory(): void;\n  loadRevisions(): void;\n  restoreRevision(id: number): void;\n  revisionLabel(revision: Revision): string;\n  fabricSummary(type: FabricType): string;\n  loadCalcContext(url: string): void;\n  scheduleHeatLoss(): void;\n  recomputeHeatLoss(): void;\n  fabricChip(type: FabricType): string;\n  openFabricForm(element: FabricType[\"element\"], id: number | null): void;\n  fabricLiveU(): string;\n  fabricLiveSource(): string;\n  refreshFabricU(): void;\n  saveFabricForm(scope?: \"all\" | \"wall\"): void;\n  editWallType(): void;\n  fabricUsedBy(): string;\n  fabricSharedWithWall(): boolean;\n  cancelFabricForm(): void;\n  makeDefaultFabric(id: number): void;\n  removeFabricType(id: number): void;\n  syncFabric(): void;\n  measureGroups(): PaletteGroup[];\n  catalogue: PaletteEntry[];\n  pickMeasure(kind: string): void;\n  dropMeasure(): void;\n  setAnnotationMode(mode: AnnotationMode): void;\n  redraw(): void;\n  setFloor(id: number): void;\n  setTool(name: ToolName): void;\n  setOpeningType(type: OpeningType): void;\n  undo(): void;\n  redo(): void;\n  updateSelected(): void;\n  deleteSelected(): void;\n  /** Knock the selected room through into a neighbour; it keeps its name. */\n  mergeSelectedWith(roomId: string): void;\n  /** Delete the selected room with the walls only it had. */\n  removeSelectedWithWalls(): void;\n  reload(): void;\n  zoomToFit(): void;\n  zoomBy(factor: number): void;\n  applyView(): void;\n  start(design: Design): void;\n  refreshFloors(): void;\n  syncGhost(): void;\n  /** Arrows and [ ] with Move floor; whether the key was one. */\n  nudgeFloor(event: KeyboardEvent): boolean;\n  addFloor(): void;\n  renameFloor(id: number, name: string): void;\n  moveFloor(id: number, delta: number): void;\n  removeFloor(id: number): void;\n  draftFromImage(): void;\n  draftSummary(): string;\n  acceptDraft(): void;\n  discardDraft(): void;\n  applyCalibration(): void;\n  cancelCalibration(): void;\n  fail(error: unknown): void;\n  selectionProps(floor: Floor, selection: Selection): SelectionProps;\n  syncMulti(): void;\n  /** Select every element in `targets` (`<floor pk>:<id>`), drawn in\n   * `colour`; the same set again clears it. */\n  selectTargets(targets: string[], colour?: string, pill?: string): void;\n  /** Show what `targets` would select, lighter; none to stop. */\n  previewTargets(targets: string[] | null, colour?: string): void;\n  endPreview(): void;\n  pillsChanged(): void;\n  /** What an option covers: its targets, or every element it can reach. */\n  optionCover(optionId: string): string[];\n  floorLabel(floor: { id: number; name: string }): string;\n  currentWorldPerPixel(): number;\n  toolContext(): ToolContext;\n  worldPoint(svg: SVGSVGElement, event: MouseEvent): Point;\n  dragMeasure(event: DragEvent, kind: string): void;\n  dragOverCanvas(event: DragEvent): void;\n  dropOnCanvas(event: DragEvent): void;\n  endDrag(): void;\n  bindPointer(svg: SVGSVGElement): void;\n  bindKeyboard(): void;\n  init(): void;\n  destroy(): void;\n}\n\nfunction floorLabel(floor: Floor): string {\n  return floor.name || `Level ${floor.level}`;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n  return (\n    target instanceof HTMLInputElement ||\n    target instanceof HTMLTextAreaElement ||\n    target instanceof HTMLSelectElement\n  );\n}\n\nexport default (): AlpineComponent<State> => {\n  // The design document, core, renderer, tools and viewport all live outside\n  // Alpine's reactive state \u2014 proxying the scene graph breaks identity checks\n  // and costs performance (see coveragemap.ts for the original pattern).\n  let core: EditorCore | undefined;\n  let renderer: Renderer | undefined;\n  let calcContext: CalcContext | null = null;\n  // SAP's January heat transfer coefficient and fabric share, W/K.\n  let sapFigures: { coefficient: number; fabric: number } | null = null;\n  let heatLossFrame: number | null = null;\n  let overheatingFrame: number | null = null;\n  let scenarioContext: ScenarioContext | null = null;\n  let scenarioView: ScenarioView | null = null;\n  let model3d: Model3dHandle | null = null;\n  let draw3dQueued = false;\n  let scenarioSignature = \"\";\n  const planSignature = (\n    floors: ReturnType<NonNullable<typeof core>[\"floors\"]>,\n    fabricTypes: unknown,\n  ) =>\n    JSON.stringify([\n      floors.map((floor) => [floor.scene, floor.ceiling_height_mm]),\n      fabricTypes,\n    ]);\n  let searchToken = 0;\n  let scenarioFetch = 0;\n  let roomCount = -1;\n  // What the house has placed, to tell a fixture commit from any other.\n  let fixtureSignature = \"\";\n  // The undo stack the log was last built from; it only rebuilds when it moves.\n  let logSignature: string | null = null;\n  let setupSeen = false;\n  let ageLabels: Record<string, string> = {};\n  let fabricUTimer = 0;\n  let fabricUAsked = 0;\n  let lineUpBuilding: SiteBuilding | null = null;\n  // The house's plot, faint under the plan (#3617).\n  let setPlotCredit: (credit: PlotCredit | null) => void = () => undefined;\n  const planPlot = new PlanPlot((rings, credit) => {\n    renderer?.setPlot(rings);\n    // The licence's words show only while the plot does.\n    setPlotCredit(credit);\n  });\n  let plotAsked = false;\n  /** The ground floor's outline, which the map is lined up against. */\n  const groundFootprint = (): Point[][] => {\n    const floors = core?.floors() ?? [];\n    const lowest = floors.reduce<Floor | null>(\n      (best, floor) =>\n        best === null || floor.level < best.level ? floor : best,\n      null,\n    );\n    return lowest ? footprint(lowest.scene) : [];\n  };\n  // A link can open a mode (the Build Pack's \"Update figures\"), once the live\n  // model is there to fill it.\n  let startMode: Mode | null = null;\n  let rebuildTimer: number | null = null;\n  let inventoryTimer: number | null = null;\n  const targetWrite = new LateWrite(() => component?.keepScenarioOptions());\n  /** What the option can be pointed at, as `<floor pk>:<id>`s. */\n  const targetCandidates = (optionId: string): string[] => {\n    const explorer = scenarioView?.explorer;\n    const option = explorer?.groups\n      .flatMap((group) => group.options)\n      .find((found) => found.id === optionId);\n    return explorer && option ? explorer.candidatesOf(option) : [];\n  };\n  let calcRefetch: number | null = null;\n  let calcStale = false;\n  let chart: ScatterChart | null = null;\n  let brush: Brush | null = null;\n  let dragKind = \"\";\n  let packages: DesignPackage[] = [];\n  /** Option ids to put on the plan once the scenarios are built. */\n  let placeQueued: string[] | null = null;\n  // Options go on and come off the plan one write after another.\n  let placing: Promise<unknown> = Promise.resolve();\n  let placingCount = 0;\n  /**\n   * Options whose targets were clicked since they were last drawn, with the\n   * targets they had then (none: the default), to tell moved marks from drawn.\n   */\n  const retargeted = new Map<string, readonly string[] | undefined>();\n  /** Tell Compare and the strip the scenarios' names and stars now. */\n  const sayRenamed = () =>\n    window.dispatchEvent(\n      new CustomEvent(\"scenario-renamed\", {\n        detail: {\n          scenarios: packages.map(({ id, name, recommended }) => ({\n            id,\n            name,\n            recommended,\n          })),\n        },\n      }),\n    );\n  /** A scenario's marks, on every floor. */\n  const marksIn = (target: number): Annotation[] =>\n    (core?.floors() ?? []).flatMap((floor) =>\n      floor.annotations.filter((annotation) => annotation.package === target),\n    );\n  /** The options a view picks that draw a measure, in group order. */\n  const pickedOf = (view: ScenarioView): PickedOption[] => {\n    let slot = 0;\n    return view.choice.flatMap((index, g) => {\n      const option = view.explorer.option(g, index);\n      const group = view.explorer.groups[g]?.id ?? \"\";\n      if (!option?.kind) {\n        return [];\n      }\n      const mine = besideTheHouse(group) ? slot++ : 0;\n      return [{ option, group, slot: mine }];\n    });\n  };\n  // Phase changes save one after another, each from the last one's phases.\n  let phaseWrites: Promise<unknown> = Promise.resolve();\n  let phasePending = 0;\n  let phasingGeneration = 0;\n  const inventoryCursor = new Map<string, number>();\n  let view: ViewBox | undefined;\n  let panning: { pointerId: number; lastX: number; lastY: number } | undefined;\n  let spaceHeld = false;\n  let toolPointerDown = false;\n  let onKeyDown: ((event: KeyboardEvent) => void) | undefined;\n  const hover = new HoverMarker();\n  let onKeyUp: ((event: KeyboardEvent) => void) | undefined;\n  let onBeforeUnload: ((event: BeforeUnloadEvent) => void) | undefined;\n  let onFlushScenario: ((event: Event) => void) | undefined;\n\n  // Bound to the component in init(), as the aligner writes to its view.\n  let component: State | null = null;\n  /**\n   * Write the open scenario's debounced edit now. Resolves once every write\n   * so far has landed.\n   */\n  const flushScenario = (): Promise<unknown> => {\n    targetWrite.flush();\n    return phaseWrites;\n  };\n  const aligner = floorAligner({\n    view: () => component?.align ?? alignView(),\n    core: () => core ?? null,\n    setGhost: (scene, strong) => renderer?.setGhost(scene, strong),\n    beforeMove: () => traces.flush(),\n    tool: () => component?.tool ?? \"select\",\n    setTool: (name) => component?.setTool(name),\n    ctx: () => {\n      if (!component) {\n        throw new Error(\"Editor not started.\");\n      }\n      return component.toolContext();\n    },\n  });\n\n  // What heat pump prices were last worked out from: the flow and shortfall.\n  let siteKey = \"\";\n  const extender = extendTool();\n  let asIsFloors: Floor[] | null = null;\n  // The as-is scene's design, when this is a proposal: the pack's \"today\".\n  let existingDesignUrl = \"\";\n  // The Measures tab's rows, so Scenarios prices a kind as the pack does.\n  let scheduleRows: ScheduleRow[] | null = null;\n  const applySchedule = (rows: ScheduleRow[]) => {\n    scheduleRows = rows;\n    scenarioView?.setKindCosts(rows);\n  };\n  let forwardSides: { base: Side; theirs: Side; token: string } | null = null;\n  const tools: Record<ToolName, Tool> = {\n    select: selectTool(),\n    opening: openingTool(),\n    emitter: emitterTool(),\n    room: roomTool(),\n    wall: wallTool(),\n    split: splitTool(),\n    extend: extender,\n    calibrate: calibrateTool(),\n    trace: traceTool(),\n    align: alignTool(),\n    annotate: annotateTool(),\n    brush: brushTool(() => brush),\n    floor: aligner.tool,\n    fixture: fixtureTool(),\n  };\n  let activeTool: Tool = tools.select;\n  let self: State | undefined;\n  const traces = new TraceDesk({\n    core: () => core,\n    renderer: () => renderer,\n    worldPerPixel: () => self?.currentWorldPerPixel() ?? 10,\n    centre: () =>\n      view\n        ? turnPoint(\n            [view.x + view.w / 2, view.y + view.h / 2],\n            -(self?.planRotation ?? 0),\n          )\n        : [0, 0],\n    planRotation: () => self?.planRotation ?? 0,\n    setTool: (name) => self?.setTool(name),\n    say: (hint) => {\n      if (self) {\n        self.hint = hint;\n      }\n    },\n    cursor: (cursor) => {\n      if (renderer) {\n        renderer.svg.style.cursor = cursor;\n      }\n    },\n    fail: (error) => self?.fail(error),\n  });\n  let pendingCalibration: { a: Point; b: Point } | null = null;\n  let pendingDraft: Draft | null = null;\n  let palette: PaletteEntry[] = [];\n  let nextTempId = -1;\n\n  // All annotation writes flow through one FIFO chain so rapid\n  // delete/undo/redo sequences land on the server in editor order.\n  let annotationWrites: Promise<unknown> = Promise.resolve();\n  const enqueueAnnotationWrite = <T>(write: () => Promise<T>): Promise<T> => {\n    const next = annotationWrites.then(write, write);\n    annotationWrites = next.then(\n      () => undefined,\n      () => undefined,\n    );\n    return next;\n  };\n\n  // Only the open scenario's own: another's aren't drawn or reached.\n  const annotationByDomId = (\n    floor: Floor,\n    domId: string,\n  ): Annotation | undefined =>\n    annotationIn(floor.annotations, domId, component?.scenarioId ?? null);\n\n  const translated = (\n    geometry: AnnotationGeometry,\n    dx: number,\n    dy: number,\n  ): AnnotationGeometry => {\n    const shift = ([x, y]: Point): Point => [\n      Math.round(x + dx),\n      Math.round(y + dy),\n    ];\n    if (geometry.type === \"point\") {\n      return { type: \"point\", at: shift(geometry.at) };\n    }\n    if (geometry.type === \"line\") {\n      return { type: \"line\", points: geometry.points.map(shift) };\n    }\n    return { type: \"area\", polygon: geometry.polygon.map(shift) };\n  };\n\n  return {\n    mode: \"design\",\n    scenarioId: null,\n    folds: loadFolds(),\n    staff: false,\n    v2: false,\n    emptyDesign: false,\n    heatMap: false,\n    layers: { hidden: [], hiddenKinds: [], kinds: [] },\n    floorRooms: {},\n    heatLegend: [0, 50, 100, 150].map((watts) => ({\n      color: heatColor(watts),\n      label: watts === 150 ? \"150+\" : String(watts),\n    })),\n    importer: closedImporter(),\n    magicplanStatus: \"\",\n    magicplanPlan: \"\",\n    notice: \"\",\n    noticeLink: null,\n    scenario: {\n      status: \"idle\",\n      error: \"\",\n      progress: 0,\n      count: 0,\n      size: 0,\n      metric: \"sap\",\n      applying: false,\n      placing: false,\n      leftOut: \"\",\n      more: 0,\n    },\n    scenarioGroups: [],\n    outcome: null,\n    baseOutcome: null,\n    creating: false,\n    undrawn: [],\n    handDrawn: null,\n    picks: [],\n    targetRows: [],\n    targetOption: \"\",\n    targetMenu: \"\",\n    fixtureKind: \"gas_boiler\",\n    fixtureKey: \"\",\n    fixtureKinds: PLACEABLE.map((kind) => ({\n      kind,\n      label: FIXTURE_KINDS[kind],\n      icon: iconSvg(kind),\n    })),\n    fixtureEdit: null,\n    assessing: false,\n    legend: { existing: false, proposed: false },\n    houseKit: [],\n    view3d: false,\n    model3d: initialModel3d(),\n    checks: [],\n    checkAt: null,\n    propertyType: \"\",\n    brushName: \"\",\n    grantsOn: true,\n    saved: [],\n    phasing: null,\n    phasingId: null,\n    chartTip: { show: false, x: 0, y: 0, title: \"\", lines: [] },\n    inventory: [],\n    catalogue: [],\n    loading: true,\n    error: \"\",\n    floors: [],\n    currentFloorId: null,\n    zoomPercent: 100,\n    tool: \"select\",\n    openingType: \"door\",\n    openingWidths: {\n      door: OPENING_DEFAULTS.door.width,\n      window: OPENING_DEFAULTS.window.width,\n      opening: OPENING_DEFAULTS.opening.width,\n    },\n    emitterForm: { kind: \"radiator\", ...RADIATOR_DEFAULTS, finish: \"tile\" },\n    extensionForm: emptyExtensionForm(),\n    proposed: false,\n    phases: { available: false, show: true, summary: \"\" },\n    forward: { count: 0, conflicts: 0, busy: false },\n    hint: \"\",\n    hovered: \"\",\n    saveState: \"saved\",\n    canUndo: false,\n    canRedo: false,\n    selection: null,\n    multiSummary: \"\",\n    multiMeasures: [],\n    floorCounts: {},\n    floorBadge: \"\",\n    pillOn: \"\",\n    outline: outlineView(null),\n    ...tracePanel(traces),\n    draft: { busy: false, ready: false, rooms: 0, openings: 0 },\n    calibration: { active: false, length: \"\" },\n    measureQuery: \"\",\n    pickedMeasure: \"\",\n    annotationMode: \"point\",\n    scheduleOpen: false,\n    schedule: null,\n    fabricTypes: [],\n    fabricForm: emptyFabricForm(),\n    fabricLive: null,\n    northFit: { state: \"idle\", message: \"\", deg: 0 },\n    plotCredit: null,\n    historyOpen: false,\n    revisions: [],\n    sessions: [],\n    heatLoss: null,\n    heatLossError: \"\",\n    roomLoss: null,\n    heatLoadContext: null,\n    overheatingContext: null,\n    overheating: null,\n    overheatingError: \"\",\n    overheatingLegend: OVERHEATING_LEGEND,\n    heatLoadOpen: false,\n    heatLoadError: \"\",\n    planRotation: 0,\n    northDeg: null,\n    compassOpen: false,\n    tabLock: false,\n    baseline: null,\n    assumptions: [],\n    assumptionsOpen: false,\n    setup: { open: false, step: 0, saving: false, answers: {}, added: {} },\n    changesSaving: false,\n    twinPushing: false,\n    align: alignView(),\n    aligner,\n\n    init() {\n      // Compare scores this baseline's scenarios from the plan in memory.\n      setOpenBaseline(() =>\n        core && scenarioView\n          ? {\n              id: core.design.id,\n              view: scenarioView,\n              scheduleUrl: core.design.schedule_url,\n              packages,\n            }\n          : null,\n      );\n      const mount = this.$refs[\"canvas\"];\n      const designUrl = this.$el.dataset[\"designUrl\"];\n      if (!(mount instanceof HTMLElement) || !designUrl) {\n        this.error = \"The editor is missing its configuration.\";\n        this.loading = false;\n        return;\n      }\n      renderer = new Renderer(mount);\n      component = this;\n      this.staff = this.$el.dataset[\"staff\"] === \"true\";\n      this.v2 = this.$el.dataset[\"v2\"] === \"true\";\n      this.propertyType = this.$el.dataset[\"propertyType\"] ?? \"\";\n      ageLabels = JSON.parse(this.$el.dataset[\"ageLabels\"] ?? \"{}\");\n      this.$watch(\"fabricForm\", () => this.refreshFabricU());\n      startMode = asMode(this.$el.dataset[\"startMode\"]);\n      // The Build Pack's \"Update figures\" lands on the scenario's measures.\n      if (\n        new URLSearchParams(window.location.search).get(\"focus\") === \"figures\"\n      ) {\n        this.setTab(\"measures\");\n      }\n      const scenario = Number(this.$el.dataset[\"scenario\"] ?? \"\");\n      this.scenarioId = scenario > 0 ? scenario : null;\n      renderer.setAnnotationScope(this.scenarioId);\n      this.hint = activeTool.hint;\n      self = this;\n      traces.onChange(() => this.showTraces());\n      this.bindPointer(renderer.svg);\n      this.bindKeyboard();\n      // The canvas narrows when the side panel grows a scrollbar: keep the\n      // view the canvas's shape, or the svg letterboxes and clicks land off.\n      new ResizeObserver(() => {\n        if (!renderer || !view) {\n          return;\n        }\n        const rect = screenRect(renderer.svg);\n        const scale = Math.max(view.w / rect.width, view.h / rect.height);\n        const [cx, cy] = [view.x + view.w / 2, view.y + view.h / 2];\n        view = {\n          x: cx - (rect.width * scale) / 2,\n          y: cy - (rect.height * scale) / 2,\n          w: rect.width * scale,\n          h: rect.height * scale,\n        };\n        this.applyView();\n      }).observe(renderer.svg);\n      const existingUrl = this.$el.dataset[\"existingUrl\"];\n      existingDesignUrl = existingUrl ?? \"\";\n      this.proposed = Boolean(existingUrl);\n      if (existingUrl) {\n        fetchDesign(existingUrl)\n          .then((asIs) => {\n            asIsFloors = asIs.floors;\n            this.phases.available = true;\n            this.syncPhases();\n          })\n          .catch((error: unknown) => this.fail(error));\n      }\n\n      fetchDesign(designUrl)\n        .then((payload) => {\n          this.loading = false;\n          this.start(payload);\n          this.loadCalcContext(payload.calc_context_url);\n          this.checkForward();\n        })\n        .catch((error: unknown) => {\n          this.loading = false;\n          this.error =\n            error instanceof Error\n              ? error.message\n              : \"Loading the design failed.\";\n        });\n    },\n\n    destroy() {\n      if (onKeyDown) {\n        window.removeEventListener(\"keydown\", onKeyDown);\n      }\n      if (onKeyUp) {\n        window.removeEventListener(\"keyup\", onKeyUp);\n      }\n      if (onBeforeUnload) {\n        window.removeEventListener(\"beforeunload\", onBeforeUnload);\n      }\n      if (onFlushScenario) {\n        window.removeEventListener(\"flush-scenario\", onFlushScenario);\n      }\n    },\n\n    start(design: Design) {\n      if (design.floors.length === 0) {\n        this.error = \"This design has no floors yet.\";\n        return;\n      }\n      freshness.load(design.id, design.updated);\n      this.heatLoadContext = design.heat_load;\n      this.overheatingContext = design.overheating;\n      this.planRotation = design.plan_rotation;\n      this.northDeg = design.north_deg;\n      this.baseline = design.baseline;\n      renderer?.setRotation(this.planRotation);\n      core = new EditorCore(design, {\n        render: (floor, selection) => {\n          renderer?.sync(floor);\n          aligner.refresh();\n          this.syncMulti();\n          renderer?.syncSelection(\n            floor,\n            selection,\n            this.currentWorldPerPixel(),\n          );\n          this.selection = this.selectionProps(floor, selection);\n          this.outline = outlineView(floor.scene);\n          if (core) {\n            this.refreshRooms();\n            this.refreshLayers();\n            // The fixtures, and House's list of them, follow every draw.\n            this.drawFixtures();\n          }\n          this.syncPhases();\n          this.scheduleHeatLoss();\n          this.scheduleOverheating();\n          const modelUrl = core?.design.model_url;\n          if (modelUrl && !plotAsked) {\n            plotAsked = true;\n            setPlotCredit = (credit) => {\n              this.plotCredit = credit;\n            };\n            planPlot.load(modelUrl, groundFootprint, () => this.northDeg);\n          }\n          planPlot.show(groundFootprint(), this.northDeg);\n          this.emptyDesign = core ? blank(core.floors()) : this.emptyDesign;\n          // The context's living area (when assumed) and its very existence\n          // (before the first room) follow the rooms drawn, so fetch it again.\n          const rooms = core\n            ? core\n                .floors()\n                .reduce((total, f) => total + f.scene.rooms.length, 0)\n            : 0;\n          // A baseline with no EPC counts its fixtures in the figures, so a\n          // fixture added, edited or deleted refetches them.\n          const fixtures = core\n            ? JSON.stringify(core.floors().map((f) => f.scene.fixtures ?? []))\n            : \"\";\n          const fixturesChanged =\n            fixtureSignature !== \"\" && fixtures !== fixtureSignature;\n          fixtureSignature = fixtures;\n          if (\n            (rooms !== roomCount &&\n              (!calcContext || calcContext.baseline?.source === \"assumed\")) ||\n            (fixturesChanged && calcContext?.baseline?.source === \"assumed\")\n          ) {\n            this.refetchCalc();\n          }\n          if (roomCount === 0 && rooms > 0 && setupSeen) {\n            this.openSetupIfUnconfirmed();\n          }\n          roomCount = rooms;\n          // Every tab shows the package, so it follows the plan everywhere.\n          if (scenarioContext) {\n            this.loadScenarios();\n          }\n        },\n        previewed: (floor, selection) => {\n          this.syncMulti();\n          renderer?.syncSelection(\n            floor,\n            selection,\n            this.currentWorldPerPixel(),\n          );\n        },\n        tidied: (walls) => {\n          this.notice = `Tidied the plan: joined ${walls} wall${walls === 1 ? \"\" : \"s\"}. Undo to keep them as they were.`;\n        },\n        ui: (state) => {\n          this.saveState = state.saveState;\n          this.canUndo = state.canUndo;\n          this.canRedo = state.canRedo;\n          if (this.historyOpen) {\n            this.refreshLog();\n          }\n          if (state.saveState === \"saved\" && calcStale) {\n            this.refetchCalc();\n          }\n        },\n        save: (floor, moved) =>\n          putScene(\n            floor.scene_url,\n            floor.version,\n            floor.scene,\n            moved\n              ? {\n                  traces: floor.traces.map((trace) => ({\n                    id: trace.id,\n                    offset_x_mm: trace.offset_x_mm,\n                    offset_y_mm: trace.offset_y_mm,\n                    rotation_deg: trace.rotation_deg,\n                  })),\n                  // Rows still being created have no id to save by yet.\n                  annotations: floor.annotations\n                    .filter((annotation) => annotation.id > 0)\n                    .map(({ id, geometry }) => ({ id, geometry })),\n                }\n              : undefined,\n          ),\n        persistAnnotations: (patches) => {\n          for (const patch of patches) {\n            enqueueAnnotationWrite(() => patchAnnotation(patch.url, patch.body))\n              .then((updated) => {\n                const floor = core?.floor();\n                const row = floor?.annotations.find(\n                  (candidate) => candidate.id === patch.id,\n                );\n                if (row) {\n                  Object.assign(row, updated);\n                  this.redraw();\n                }\n              })\n              .catch((error: unknown) => this.fail(error));\n          }\n        },\n        persistTraces: (patches) => traces.persist(patches),\n      });\n      core.setPlanLocked(this.scenarioId !== null);\n      if (!setupSeen) {\n        setupSeen = true;\n        const asked = new URLSearchParams(window.location.search).has(\"setup\");\n        if (asked) {\n          this.openSetup(true);\n        } else {\n          this.openSetupIfUnconfirmed();\n        }\n      }\n      roomCount = design.floors.reduce(\n        (total, floor) => total + floor.scene.rooms.length,\n        0,\n      );\n      palette = paletteEntries(design.measures);\n      this.catalogue = palette;\n      renderer?.setAnnotationStyles(\n        new Map<string, AnnotationStyle>(\n          palette.map((entry) => [\n            entry.kind,\n            { color: entry.color, name: entry.name },\n          ]),\n        ),\n      );\n      logSignature = null;\n      this.fabricTypes = design.fabric_types;\n      renderer?.setFabricTypes(design.fabric_types);\n      this.refreshFloors();\n      this.setFloor(core.floor().id);\n      this.emptyDesign = blank(design.floors);\n      this.magicplanStatus = design.magicplan_import?.status ?? \"\";\n      this.magicplanPlan = design.magicplan_import?.plan_id ?? \"\";\n      packages = [...design.packages];\n      scenarioFetch += 1;\n      scenarioContext = null;\n      scenarioView = null;\n      scenarioSignature = \"\";\n      this.scenario.status = \"idle\";\n      if (this.mode === \"compare\") {\n        this.loadScenarios();\n      }\n\n      // start() reruns after a restore \u2014 replace the guard, don't stack it.\n      if (onBeforeUnload) {\n        window.removeEventListener(\"beforeunload\", onBeforeUnload);\n      }\n      onBeforeUnload = (event: BeforeUnloadEvent) => {\n        traces.flush();\n        const unsaved = targetWrite.pending || phasePending > 0;\n        flushScenario();\n        if (core?.isDirty() || unsaved) {\n          event.preventDefault();\n        }\n      };\n      window.addEventListener(\"beforeunload\", onBeforeUnload);\n      // The strip waits on this before it leaves for another scenario.\n      if (onFlushScenario) {\n        window.removeEventListener(\"flush-scenario\", onFlushScenario);\n      }\n      onFlushScenario = (event: Event) => {\n        (event as CustomEvent<{ waits: Promise<unknown>[] }>).detail.waits.push(\n          flushScenario(),\n        );\n      };\n      window.addEventListener(\"flush-scenario\", onFlushScenario);\n    },\n\n    toggleHistory() {\n      this.historyOpen = !this.historyOpen;\n      if (this.historyOpen) {\n        this.refreshLog();\n        this.loadRevisions();\n      }\n    },\n\n    roomInspection() {\n      const loss = this.selectedRoomLoss();\n      return core && loss\n        ? inspect(loss, core.scene(), this.fabricTypes)\n        : null;\n    },\n\n    hoverRow(row) {\n      highlight(renderer?.svg ?? null, row?.layer ?? null, row?.id ?? \"\");\n    },\n\n    pickRow(row) {\n      if (core && (row.layer === \"walls\" || row.layer === \"openings\")) {\n        core.select({\n          type: row.layer === \"walls\" ? \"wall\" : \"opening\",\n          id: row.id,\n        });\n      }\n    },\n\n    openRowFabric(row) {\n      if (row.element && row.typeId !== null) {\n        this.openFabricForm(row.element, row.typeId);\n      }\n    },\n\n    refreshLog() {\n      if (!core) {\n        return;\n      }\n      const signature = core.historySignature();\n      if (signature === null || signature === logSignature) {\n        return;\n      }\n      logSignature = signature;\n      const names = new Map(this.fabricTypes.map((t) => [t.id, t.name]));\n      const measures = new Map(\n        (core.design.measures ?? []).map((m) => [m.kind, m.name]),\n      );\n      this.sessions = sessionsOf(core.historySteps(), names, measures);\n    },\n\n    showLine(line) {\n      const target = line.target;\n      if (!core || !target) {\n        return;\n      }\n      const type = {\n        walls: \"wall\",\n        openings: \"opening\",\n        rooms: \"room\",\n        emitters: \"emitter\",\n        annotations: \"annotation\",\n      } as const;\n      core.select({ type: type[target.layer], id: target.id });\n    },\n\n    revertLine(line) {\n      if (core?.isPlanLocked()) {\n        return;\n      }\n      core?.revertTo(line.step);\n    },\n\n    kindTitle(kind) {\n      return KIND_TITLES[kind];\n    },\n\n    sessionTitle(session) {\n      const day = new Date(session.start).toLocaleDateString(\"en-GB\", {\n        day: \"numeric\",\n        month: \"short\",\n      });\n      return `${day}, ${this.clock(session.start)}`;\n    },\n\n    clock(at) {\n      return new Date(at).toLocaleTimeString(\"en-GB\", {\n        hour: \"2-digit\",\n        minute: \"2-digit\",\n      });\n    },\n\n    savedTitle(revision) {\n      return savedLabel(revision.created, revision.changes);\n    },\n\n    loadRevisions() {\n      const url = core?.design.revisions_url;\n      if (!url) {\n        return;\n      }\n      fetchRevisions(url)\n        .then((revisions) => {\n          this.revisions = revisions;\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    revisionLabel(revision: Revision): string {\n      const reasons: Record<string, string> = {\n        IMPORT: \"Import\",\n        CHECKPOINT: \"Checkpoint\",\n        MANUAL: \"Snapshot\",\n      };\n      const reason = reasons[revision.reason];\n      const when = new Date(revision.created).toLocaleString(\"en-GB\", {\n        day: \"numeric\",\n        month: \"short\",\n        hour: \"2-digit\",\n        minute: \"2-digit\",\n      });\n      const who = revision.created_by ? ` \u00B7 ${revision.created_by}` : \"\";\n      return `${reason ?? revision.reason} \u00B7 ${when}${who}`;\n    },\n\n    restoreRevision(id: number) {\n      const url = core?.design.restore_url;\n      if (!url || core?.isPlanLocked()) {\n        return;\n      }\n      const confirmed = window.confirm(\n        \"Restore the design to this point? The current state is snapshotted\" +\n          \" first, and floors added since stay as they are.\",\n      );\n      if (!confirmed) {\n        return;\n      }\n      postRestore(url, id, this.scenarioId)\n        .then((result) => {\n          if (result.untouched_floors.length > 0) {\n            window.alert(\n              `Left untouched (added since): ${result.untouched_floors.join(\", \")}`,\n            );\n          }\n          if (result.dropped.length > 0) {\n            window.alert(\n              `${result.dropped.length} scenario target(s) or fixture change(s) no longer match the restored plan.`,\n            );\n          }\n          this.historyOpen = false;\n          this.start(result.design);\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    loadCalcContext(url: string) {\n      fetchCalcContext(url)\n        .then((loaded) => {\n          calcContext = loaded;\n          this.assumptions =\n            loaded.baseline?.source === \"assumed\"\n              ? loaded.baseline.assumptions\n              : [];\n          this.heatLossError = \"\";\n          this.recomputeHeatLoss();\n          scenarioSignature = \"\";\n          if (startMode) {\n            this.setMode(startMode);\n            startMode = null;\n          }\n          this.loadScenarios();\n          // Sections left open last time fill in.\n          if (this.folds[\"measures\"]) {\n            this.refreshInventory();\n          }\n          if (this.folds[\"history\"] && !this.historyOpen) {\n            this.toggleHistory();\n          }\n        })\n        .catch((error: unknown) => {\n          calcContext = null;\n          this.heatLoss = null;\n          // Not fail(): a design with nothing drawn yet is ordinary, not an error.\n          this.heatLossError =\n            error instanceof Error ? error.message : \"No live figure.\";\n        });\n    },\n\n    // One per frame, not debounced, so the figure keeps up with a drag.\n    scheduleHeatLoss() {\n      if (heatLossFrame !== null || !calcContext) {\n        return;\n      }\n      heatLossFrame = window.requestAnimationFrame(() => {\n        heatLossFrame = null;\n        this.recomputeHeatLoss();\n      });\n    },\n\n    openWorksheet() {\n      if (!core || !calcContext) {\n        return;\n      }\n      const floors = core.floors();\n      // The package's figures are rebuilt on a debounce after an edit: until\n      // they have caught up, they aren't this plan's.\n      const stale =\n        scenarioView !== null &&\n        scenarioSignature !== planSignature(floors, this.fabricTypes);\n      if (stale) {\n        this.loadScenarios();\n      }\n      try {\n        const sources = worksheetSources(\n          new Prepared(\n            calcContext,\n            floors.map((floor) => floor.scene),\n            floors.map((floor) => floor.ceiling_height_mm),\n            this.fabricTypes,\n          ),\n          scenarioView,\n          !stale,\n        );\n        window.dispatchEvent(\n          new CustomEvent(\"worksheet-open\", { detail: sources }),\n        );\n      } catch (error: unknown) {\n        this.heatLossError =\n          error instanceof Error ? error.message : \"No worksheet yet.\";\n      }\n    },\n\n    recomputeHeatLoss() {\n      if (!core || !calcContext) {\n        return;\n      }\n      const floors = core.floors();\n      try {\n        const computed = heatLossOf(\n          calcContext,\n          floors.map((floor) => floor.scene),\n          floors.map((floor) => floor.ceiling_height_mm),\n          this.fabricTypes,\n        );\n        this.heatLoss = {\n          coefficient: computed.heatTransferCoefficient.toFixed(1),\n          parameter: computed.heatLossParameter.toFixed(2),\n          rating: String(sapScore(computed.sapRating)),\n          band: band(computed.sapRating),\n        };\n        this.heatLossError = \"\";\n        sapFigures = {\n          coefficient: computed.heatTransferCoefficient,\n          fabric: computed.fabricHeatLoss,\n        };\n        this.recomputeRoomLoss(floors, calcContext.elements);\n      } catch (error: unknown) {\n        const message =\n          error instanceof Error ? error.message : \"No live figure.\";\n        // A wall given a fabric type the context hasn't derived yet: keep the\n        // last figures up while it's fetched, rather than flash its message.\n        if (message.includes(\"refetch\")) {\n          this.refetchCalc();\n        } else {\n          this.heatLoss = null;\n          this.roomLoss = null;\n          this.heatLossError = message;\n        }\n      }\n      this.refreshOverlays();\n      this.refreshChecks();\n    },\n\n    refreshChecks() {\n      if (!core) {\n        return;\n      }\n      this.checks = modelChecks({\n        floors: core.floors(),\n        types: this.fabricTypes,\n        roomLoss: this.roomLoss,\n        propertyType: this.propertyType,\n        northDeg: this.northDeg,\n        modelError: this.heatLossError,\n      });\n    },\n\n    goToCheck(check: Check) {\n      if (!core) {\n        return;\n      }\n      this.checkAt = placeOf(this.checks, check.id);\n      if (check.brush === \"party\") {\n        this.setMode(\"design\");\n        this.setBrush(\"party\", true);\n        return;\n      }\n      if (check.floor !== undefined && check.floor !== this.currentFloorId) {\n        this.setFloor(check.floor);\n      }\n      if (check.fix?.action.kind === \"party\") {\n        this.setMode(\"design\");\n      }\n      this.refreshOverlays();\n      if (check.tool) {\n        this.setMode(\"design\");\n        this.setTool(check.tool);\n      }\n      if (check.selection) {\n        this.setMode(\"design\");\n        this.setTool(\"select\");\n        core.select(check.selection);\n        const bounds = boundsOfSelection(core.scene(), check.selection);\n        if (view && bounds) {\n          view = bringIntoView(\n            view,\n            turnBounds(bounds, this.planRotation),\n            RAIL_WIDTH_PX * this.currentWorldPerPixel(),\n          );\n          this.applyView();\n        }\n        this.redraw();\n      }\n    },\n\n    fixCheck(check: Check) {\n      const action = check.fix?.action;\n      if (!core || !action) {\n        return;\n      }\n      if (action.floor !== this.currentFloorId) {\n        this.setFloor(action.floor);\n      }\n      this.checkAt = placeOf(this.checks, check.id);\n      if (action.kind === \"straighten\") {\n        core.commit((scene) => {\n          straighten(scene, action.jog);\n        });\n        core.select({ type: \"room\", id: action.jog.room });\n      } else if (action.kind === \"party\") {\n        const marking = new Set(action.walls);\n        core.commit((scene) => {\n          for (const wall of scene.walls) {\n            if (marking.has(wall.id)) {\n              wall.party = true;\n            }\n          }\n        });\n      } else if (action.kind === \"height\") {\n        core.commit((scene) => {\n          const room = scene.rooms.find((each) => each.id === action.room);\n          if (room) {\n            room.ceiling_height = null;\n          }\n        });\n        core.select({ type: \"room\", id: action.room });\n      } else if (action.kind === \"absorb\") {\n        core.commit((scene) => {\n          mergeRooms(scene, action.into, action.room);\n        });\n        core.select({ type: \"room\", id: action.into });\n      }\n      this.redraw();\n    },\n\n    stepCheck(step: 1 | -1) {\n      const next = stepCheck(this.checks, this.checkAt, step);\n      if (next) {\n        this.goToCheck(next);\n      }\n    },\n\n    refetchCalc() {\n      const url = core?.design.calc_context_url;\n      // The server derives from the saved plan, so wait for the save.\n      calcStale = true;\n      if (!url || calcRefetch !== null || this.saveState !== \"saved\") {\n        return;\n      }\n      calcRefetch = window.setTimeout(() => {\n        calcRefetch = null;\n        // An edit since: the save that follows fetches it again.\n        if (this.saveState !== \"saved\") {\n          return;\n        }\n        calcStale = false;\n        this.loadCalcContext(url);\n        // The options' patches carry u-values and element keys too, so one\n        // still in flight is stale as well.\n        scenarioFetch += 1;\n        const loading = this.scenario.status === \"loading\";\n        if (scenarioContext || loading) {\n          scenarioContext = null;\n          scenarioSignature = \"\";\n          if (loading) {\n            this.scenario.status = \"idle\";\n          }\n          this.loadScenarios();\n        }\n      }, 300);\n    },\n\n    turnPlan(quarters: number) {\n      const turned = (((this.planRotation + quarters * 90) % 360) + 360) % 360;\n      this.planRotation = turned;\n      renderer?.setRotation(turned);\n      this.zoomToFit();\n      this.saveOrientation({ plan_rotation: turned });\n    },\n\n    northOnScreen() {\n      return this.northDeg === null\n        ? null\n        : (this.northDeg + this.planRotation) % 360;\n    },\n\n    setNorthOnScreen(raw: string) {\n      const degrees = Math.round(Number(raw));\n      if (raw.trim() === \"\" || !Number.isFinite(degrees)) {\n        return;\n      }\n      const north = (((degrees - this.planRotation) % 360) + 360) % 360;\n      this.northDeg = north;\n      this.saveOrientation({ north_deg: north });\n    },\n\n    nudgeNorth(degrees: number) {\n      this.setNorthOnScreen(String((this.northOnScreen() ?? 0) + degrees));\n    },\n\n    clearNorth() {\n      this.northDeg = null;\n      this.saveOrientation({ north_deg: null });\n    },\n\n    saveOrientation(body) {\n      const design = core?.design;\n      if (!design?.orientation_url) {\n        return;\n      }\n      if (body.north_deg !== undefined) {\n        this.refreshChecks();\n      }\n      patchOrientation(design.orientation_url, body)\n        .then((saved) => {\n          const moved = saved.north_deg !== design.north_deg;\n          design.north_deg = saved.north_deg;\n          planPlot.show(groundFootprint(), saved.north_deg);\n          design.plan_rotation = saved.plan_rotation;\n          // Windows are keyed by the way they face, so the context changes.\n          if (moved) {\n            this.refetchCalc();\n          }\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    pushTwin() {\n      const url = this.baseline?.twin_url;\n      if (!url || this.twinPushing) {\n        return;\n      }\n      this.twinPushing = true;\n      postTwin(url)\n        .then((pushed) => {\n          this.notice =\n            pushed.baseline.source === \"rdsap\"\n              ? \"Sent to Options Evaluation, on the EPC's heating and ventilation.\"\n              : \"Sent to Options Evaluation, on the set-up answers and their assumptions.\";\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.twinPushing = false;\n        });\n    },\n\n    setupReady() {\n      return (\n        core !== undefined &&\n        this.baseline !== null &&\n        !this.baseline.proposed &&\n        this.scenarioId === null &&\n        planExists(core.floors().map((floor) => floor.scene))\n      );\n    },\n\n    /** Opens the flow, quietly, for a house nobody has set up yet. */\n    openSetupIfUnconfirmed() {\n      const baseline = this.baseline;\n      if (\n        baseline &&\n        !baseline.rdsap &&\n        !baseline.answered &&\n        !baseline.proposed\n      ) {\n        this.openSetup(false);\n      }\n    },\n\n    openSetup(announce = true) {\n      if (!this.baseline) {\n        return;\n      }\n      if (!this.setupReady()) {\n        if (announce) {\n          if (this.baseline.proposed || this.scenarioId !== null) {\n            // The flow works on the house as it is: link there.\n            const url = new URL(\n              this.baseline.proposed && existingDesignUrl\n                ? existingDesignUrl\n                : window.location.href,\n              window.location.href,\n            );\n            url.searchParams.delete(\"scenario\");\n            url.searchParams.set(\"setup\", \"1\");\n            this.notice = \"Set up the house in As it is.\";\n            this.noticeLink = {\n              notice: this.notice,\n              text: \"Open As it is\",\n              href: url.pathname + url.search,\n            };\n          } else {\n            this.notice = \"Import or draw the plan first.\";\n          }\n        }\n        return;\n      }\n      const done = doneSteps(this.baseline.answers[\"setup_done\"]);\n      this.setup = {\n        open: true,\n        step: firstOpen(done),\n        saving: false,\n        answers: { ...this.baseline.answers },\n        added: {},\n      };\n      this.setTool(\"select\");\n      // It asks what the House tab holds, so it opens beside it.\n      this.setTab(\"house\");\n    },\n\n    closeSetup() {\n      this.setup.open = false;\n      this.assumptionsOpen =\n        this.assumptionsOpen || Boolean(this.baseline?.answered);\n    },\n\n    setupTitle() {\n      return `${this.setup.step + 1}. ${(STEPS[this.setup.step] ?? STEPS[0]).title}`;\n    },\n\n    setupKey() {\n      return (STEPS[this.setup.step] ?? STEPS[0]).key;\n    },\n\n    setupGo(index: number) {\n      this.setup.step = Math.max(0, Math.min(STEPS.length - 1, index));\n      this.setTool(\"select\");\n      if (this.setupKey() === \"north\") {\n        this.compassOpen = true;\n      }\n    },\n\n    setupBack() {\n      this.setupGo(this.setup.step - 1);\n    },\n\n    setupNext() {\n      const key = this.setupKey();\n      const done = new Set(doneSteps(this.setup.answers[\"setup_done\"]));\n      done.add(key);\n      this.setup.answers[\"setup_done\"] = [...done].join(\",\");\n      if (key === \"house\") {\n        this.setupHouse();\n        return;\n      }\n      this.setupSaveDone();\n    },\n\n    setupAnswer(key: string, raw: string) {\n      this.setup.answers[key] = raw;\n    },\n\n    /** Heating and age first: the fabric types are made from the age. */\n    setupHouse() {\n      this.setupSaveDone();\n    },\n\n    setupSaveDone() {\n      const url = this.baseline?.url;\n      if (!url) {\n        return;\n      }\n      this.setup.saving = true;\n      const last = this.setup.step === STEPS.length - 1;\n      const body = {\n        heating: this.setup.answers[\"heating\"] ?? \"\",\n        age_band: this.setup.answers[\"age_band\"] ?? \"\",\n        setup_done: String(this.setup.answers[\"setup_done\"] ?? \"\"),\n      };\n      patchBaseline(url, body as Record<string, string>)\n        .then((design) => {\n          this.baseline = design.baseline;\n          this.heatLoadContext = design.heat_load;\n          this.fabricTypes = design.fabric_types;\n          this.syncFabric();\n          if (last) {\n            this.setup.open = false;\n            this.assumptionsOpen = true;\n          } else {\n            this.setupGo(this.setup.step + 1);\n          }\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.setup.saving = false;\n        });\n    },\n\n    setupWalls() {\n      return core ? wallCount(core.floors().map((floor) => floor.scene)) : \"\";\n    },\n\n    setupIsAdded(element: string, pick: FabricPick) {\n      return this.fabricTypes.some(\n        (type) => type.element === element && type.name === pick.name,\n      );\n    },\n\n    setupPicked(element: string) {\n      return (this.baseline?.picks[element] ?? []).filter((pick) =>\n        this.setupIsAdded(element, pick),\n      );\n    },\n\n    /** The first type picked for an element becomes its default, in place; the\n     * rest are new types to give to the walls, floors or roofs that differ. */\n    setupAdd(element: string, pick: FabricPick) {\n      const url = this.baseline?.url;\n      if (!core || !url || this.setupIsAdded(element, pick)) {\n        return;\n      }\n      // Reopening the flow must not rewrite the default: once the fabric step\n      // is done, every pick is a new type.\n      const reopened = doneSteps(this.baseline?.answers[\"setup_done\"]).includes(\n        \"fabric\",\n      );\n      const first = !reopened && !this.setup.added[element];\n      this.setup.added[element] = true;\n      const request = first\n        ? patchBaseline(url, pick.answers).then((design) => {\n            this.baseline = design.baseline;\n            this.fabricTypes = design.fabric_types;\n          })\n        : createFabricType(core.design.fabric_types_url, {\n            design: core.design.id,\n            element,\n            name: pick.name,\n            spec: pick.spec,\n          }).then((saved) => {\n            this.fabricTypes.push(saved);\n          });\n      request\n        .then(() => this.syncFabric())\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    setupMakeDefault(id: number) {\n      const type = this.fabricTypes.find((candidate) => candidate.id === id);\n      if (!type) {\n        return;\n      }\n      patchFabricType(type.url, { is_default: true })\n        .then((saved) => {\n          for (const other of this.fabricTypes) {\n            if (other.element === saved.element) {\n              other.is_default = other.id === saved.id;\n            }\n          }\n          this.syncFabric();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    setupWallTypes() {\n      return this.fabricTypes.filter(\n        (type) =>\n          type.element === \"WALL\" &&\n          !type.is_default &&\n          type.name !== \"Internal partition\",\n      );\n    },\n\n    setupPaint(id: number) {\n      this.setBrush(\"fabric\", id);\n    },\n\n    setupParty() {\n      this.setBrush(\"party\", true);\n    },\n\n    /** Gives the walls that look different the first other type picked. */\n    setupAssignDifferent() {\n      const type = this.setupWallTypes()[0];\n      if (!core || !type) {\n        return;\n      }\n      this.onEveryFloor((scene) => {\n        const ids = new Set(toCheck(scene));\n        for (const wall of scene.walls) {\n          if (ids.has(wall.id)) {\n            wall.fabric = type.id;\n          }\n        }\n      });\n      this.syncFabric();\n    },\n\n    setupCount(kind: FixtureKind) {\n      return core\n        ? fixtureCount(\n            core.floors().map((floor) => floor.scene),\n            kind,\n          )\n        : 0;\n    },\n\n    setupPlace(kind: FixtureKind) {\n      this.armFixture(kind);\n    },\n\n    /** Every window gets a trickle vent, or none do. */\n    setupTrickle(on: boolean) {\n      if (!core) {\n        return;\n      }\n      this.onEveryFloor((scene) => {\n        for (const opening of scene.openings) {\n          if (opening.type !== \"window\") {\n            continue;\n          }\n          if (on) {\n            opening.trickle = true;\n          } else {\n            delete opening.trickle;\n          }\n        }\n      });\n    },\n\n    /** One undoable edit on each floor, leaving the one being looked at. */\n    onEveryFloor(mutate: (scene: Scene) => void) {\n      if (!core) {\n        return;\n      }\n      const shown = core.floor().id;\n      for (const floor of core.floors()) {\n        core.setFloor(floor.id);\n        core.commit(mutate);\n      }\n      core.setFloor(shown);\n    },\n\n    setupFront() {\n      return frontFaces(this.northDeg);\n    },\n\n    /** Offer the north that best lines the plan up with the map's house. */\n    lineUpWithMap() {\n      const url = core?.design.model_url;\n      if (!core || !url) {\n        return;\n      }\n      this.northFit = {\n        state: \"loading\",\n        message: \"Finding the house\u2026\",\n        deg: 0,\n      };\n      getSite(url, false)\n        .then((site) => {\n          const fit = fitNorth(groundFootprint(), site);\n          if (fit.status === \"none\") {\n            this.northFit = { state: \"none\", message: fit.message, deg: 0 };\n            return;\n          }\n          lineUpBuilding = fit.building;\n          this.northFit = { state: \"found\", message: \"\", deg: fit.northDeg };\n          this.showLineUp();\n        })\n        .catch(() => {\n          this.northFit = {\n            state: \"none\",\n            message: \"The map didn't load. Try again.\",\n            deg: 0,\n          };\n        });\n    },\n\n    showLineUp() {\n      renderer?.setMapOutline(\n        this.northFit.state === \"found\" && lineUpBuilding\n          ? outlineOnPlan(groundFootprint(), lineUpBuilding, this.northFit.deg)\n          : null,\n      );\n    },\n\n    nudgeLineUp(degrees: number) {\n      this.northFit.deg = (((this.northFit.deg + degrees) % 360) + 360) % 360;\n      this.showLineUp();\n    },\n\n    acceptLineUp() {\n      const deg = Math.round(this.northFit.deg);\n      this.cancelLineUp();\n      this.northDeg = deg;\n      this.saveOrientation({ north_deg: deg });\n    },\n\n    cancelLineUp() {\n      lineUpBuilding = null;\n      this.northFit = { state: \"idle\", message: \"\", deg: 0 };\n      renderer?.setMapOutline(null);\n    },\n\n    saveAnswer(key: string, raw: string) {\n      const url = this.baseline?.url;\n      if (!url || this.baseline?.proposed) {\n        return;\n      }\n      const counts = [\"baths\", \"showers\"];\n      this.changesSaving = true;\n      patchBaseline(url, { [key]: counts.includes(key) ? Number(raw) : raw })\n        .then((design) => {\n          this.baseline = design.baseline;\n          // The guided flow reads its answers from here, so keep them level.\n          this.setup.answers[key] = raw;\n          if (key === \"age_band\") {\n            this.notice = \"The default wall type now follows the age band.\";\n          }\n          this.heatLoadContext = design.heat_load;\n          this.fabricTypes = design.fabric_types;\n          this.syncFabric();\n          this.refetchCalc();\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.changesSaving = false;\n        });\n    },\n\n    saveChange(key: string, raw: string) {\n      const url = this.baseline?.changes_url;\n      if (!url) {\n        return;\n      }\n      const counts = [\"baths\", \"showers\"];\n      const value =\n        raw === \"\" ? null : counts.includes(key) ? Number(raw) : raw;\n      this.changesSaving = true;\n      patchChanges(url, { [key]: value })\n        .then((design) => {\n          this.baseline = design.baseline;\n          this.heatLoadContext = design.heat_load;\n          this.refetchCalc();\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.changesSaving = false;\n        });\n    },\n\n    // Apart from SAP's figure, so a fabric the heat load can't price leaves SAP showing.\n    recomputeRoomLoss(\n      floors: Floor[],\n      elements: Record<string, Record<string, unknown>>,\n    ) {\n      if (!this.heatLoadContext) {\n        this.roomLoss = null;\n        this.siteChanged();\n        return;\n      }\n      try {\n        this.roomLoss = designHeatLoad(\n          floors,\n          this.fabricTypes,\n          elements,\n          this.heatLoadContext,\n        );\n        this.heatLoadError = \"\";\n      } catch (error: unknown) {\n        this.roomLoss = null;\n        this.heatLoadError =\n          error instanceof Error ? error.message : \"No heat load.\";\n      }\n      this.siteChanged();\n    },\n\n    setHeatLoad(key: string, raw: string | boolean) {\n      const context = this.heatLoadContext;\n      if (!context) {\n        return;\n      }\n      const settings = context.settings as Record<string, unknown>;\n      const current = settings[key];\n      let next: unknown = raw;\n      if (typeof raw === \"string\") {\n        const nullable = [\n          \"zone\",\n          \"air_permeability\",\n          \"built_form\",\n          \"age_band\",\n        ].includes(key);\n        const numeric =\n          typeof current === \"number\" ||\n          [\"zone\", \"air_permeability\", \"elevation_m\"].includes(key);\n        if (raw === \"\" && nullable) {\n          next = null;\n        } else if (numeric) {\n          const parsed = Number(raw);\n          if (!Number.isFinite(parsed)) {\n            return;\n          }\n          next = parsed;\n        }\n      }\n      settings[key] = next;\n      this.siteChanged();\n      this.saveHeatLoad();\n    },\n\n    reconciliation() {\n      return this.roomLoss && sapFigures\n        ? reconcile(this.roomLoss, sapFigures.coefficient, sapFigures.fabric)\n        : null;\n    },\n\n    heatLoadSummary() {\n      const load = this.roomLoss;\n      if (!load) {\n        return \"\";\n      }\n      const { outdoor } = load.conditions;\n      const zone =\n        load.zoneFrom === \"postcode\"\n          ? `zone ${outdoor.zone} by postcode`\n          : load.zoneFrom === \"design\"\n            ? `zone ${outdoor.zone}`\n            : `zone ${outdoor.zone}, a guess`;\n      return (\n        `${outdoor.designC} \u00B0C outside on the ${outdoor.percentile}th percentile day ` +\n        `(${zone}, ${outdoor.elevationM} m), ${outdoor.referenceC} \u00B0C typically and in the ground. ` +\n        `${load.conditions.q50} m\u00B3/h\u00B7m\u00B2 at 50 Pa (${load.q50From}).`\n      );\n    },\n\n    saveHeatLoad() {\n      const context = this.heatLoadContext;\n      if (!context) {\n        return;\n      }\n      // Show the change at once; the server's answer brings the zone back.\n      this.recomputeHeatLoss();\n      const scop = context.settings.heat_pump_scop;\n      patchHeatLoad(context.url, { ...context.settings })\n        .then((saved) => {\n          this.heatLoadContext = saved;\n          // The calc context carries the SCOP every option is scored at.\n          if (calcContext && calcContext.heat_pump_scop !== scop) {\n            this.refetchCalc();\n          }\n          this.recomputeHeatLoss();\n          // Package peaks are scored against the room-by-room load.\n          scenarioSignature = \"\";\n          this.loadScenarios();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    selectedRoomLoss() {\n      const selection = this.selection;\n      if (!this.roomLoss || !selection || selection.type !== \"room\") {\n        return null;\n      }\n      return (\n        this.roomLoss.rooms.find((room) => room.id === selection.id) ?? null\n      );\n    },\n\n    flowC() {\n      return this.heatLoadContext?.settings.flow_c ?? 45;\n    },\n\n    /** The house a heat pump is priced against, for a scenario's fixtures. */\n    heatPumpSite(scenario: { fixtures?: DesignPackage[\"fixtures\"] } | null) {\n      const floors = core?.floors() ?? [];\n      return siteOf(\n        scenarioFixtures(floors, null),\n        scenarioFixtures(floors, scenario),\n        calcContext ? recordedCylinder(calcContext.worksheet) : null,\n        floors.flatMap((floor) => floor.scene.emitters),\n        this.roomLoss?.rooms ?? [],\n        this.flowC(),\n      );\n    },\n\n    siteKey() {\n      return `${this.flowC()}:${this.heatPumpSite(null).shortRooms}`;\n    },\n\n    /** Heat pump prices depend on the flow and heat load: refresh when they move. */\n    siteChanged() {\n      const key = this.siteKey();\n      if (key === siteKey || !scenarioView) {\n        return;\n      }\n      siteKey = key;\n      this.showScenario();\n      if (this.mode === \"compare\" && scenarioView.packages) {\n        this.runSearch();\n      }\n    },\n\n    setFlow(celsius: number) {\n      this.setHeatLoad(\"flow_c\", String(celsius));\n    },\n\n    suggestionFor(roomId: string) {\n      const cover = this.coverOf(roomId);\n      const room = this.roomLoss?.rooms.find((each) => each.id === roomId);\n      if (!cover?.short || !room) {\n        return \"\";\n      }\n      return suggestionText(\n        suggestEmitter(cover.neededW - cover.watts, room, this.flowC()),\n      );\n    },\n\n    // Reads roomLoss, which every redraw replaces, so Alpine re-runs it.\n    coverOf(roomId: string) {\n      const room = this.roomLoss?.rooms.find((each) => each.id === roomId);\n      if (!room || !core) {\n        return null;\n      }\n      const emitters = core.floors().flatMap((floor) => floor.scene.emitters);\n      return roomCover(emitters, room, this.flowC());\n    },\n\n    selectedEmitterWatts() {\n      const props = this.selection;\n      if (props?.type !== \"emitter\" || !core) {\n        return null;\n      }\n      const room = this.roomLoss?.rooms.find(\n        (each) => each.id === props.roomId,\n      );\n      const emitter = core.scene().emitters.find((e) => e.id === props.id);\n      return room && emitter ? emitterWatts(emitter, room, this.flowC()) : null;\n    },\n\n    selectRoom(id: string) {\n      if (!core) {\n        return;\n      }\n      const floor = core\n        .floors()\n        .find((candidate) =>\n          candidate.scene.rooms.some((room) => room.id === id),\n        );\n      if (!floor) {\n        return;\n      }\n      if (floor.id !== this.currentFloorId) {\n        this.setFloor(floor.id);\n      }\n      core.select({ type: \"room\", id });\n      this.redraw();\n    },\n\n    kilowatts(watts: number) {\n      return (watts / 1000).toFixed(2);\n    },\n\n    redraw() {\n      if (!core || !renderer) {\n        return;\n      }\n      renderer.sync(core.floor());\n      this.syncMulti();\n      renderer.syncSelection(\n        core.floor(),\n        core.selection,\n        this.currentWorldPerPixel(),\n      );\n      this.selection = this.selectionProps(core.floor(), core.selection);\n      this.outline = outlineView(core.floor().scene);\n      this.refreshRooms();\n      this.refreshLayers();\n      this.syncPhases();\n      this.drawFixtures();\n    },\n\n    syncPhases() {\n      if (!core || !renderer) {\n        return;\n      }\n      const asIs = asIsFloors && asIsSceneFor(asIsFloors, core.floor());\n      // The brush paints wall types, which the phase colours would hide.\n      if (!asIs || !this.phases.show || this.tool === \"brush\") {\n        renderer.setPhases([], []);\n        this.phases.summary = \"\";\n        return;\n      }\n      const view = phaseView(\n        asIs,\n        core.floor().scene,\n        this.currentWorldPerPixel(),\n      );\n      renderer.setPhases(view.under, view.over);\n      this.phases.summary = phaseSummary(view.result);\n    },\n\n    togglePhases() {\n      this.phases.show = !this.phases.show;\n      this.syncPhases();\n    },\n\n    checkForward() {\n      const url = this.$root.dataset[\"forwardUrl\"];\n      if (!url) {\n        return;\n      }\n      fetchBringForward(url)\n        .then(({ base, theirs, token }) => {\n          if (!core || !base) {\n            return;\n          }\n          forwardSides = { base, theirs, token };\n          const plan = bringForward(\n            base,\n            theirs,\n            core.floors(),\n            this.fabricTypes,\n          );\n          this.forward.count = plan.applied;\n          this.forward.conflicts = plan.conflicts;\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    applyForward() {\n      const url = this.$root.dataset[\"forwardUrl\"];\n      const sides = forwardSides;\n      if (!core || !url || !sides || this.forward.busy) {\n        return;\n      }\n      // Against the plan as it is now, edits since loading included.\n      const plan = bringForward(\n        sides.base,\n        sides.theirs,\n        core.floors(),\n        this.fabricTypes,\n      );\n      const back = this.currentFloorId;\n      this.forward.busy = true;\n      for (const { id, scene: merged } of plan.floors) {\n        this.setFloor(id);\n        core.commit((scene) => {\n          Object.assign(scene, merged);\n        });\n      }\n      if (back !== null) {\n        this.setFloor(back);\n      }\n      // The base moves only once the merged plan is saved, or a lost save\n      // would never be offered again.\n      saved(core)\n        .then((ok) => {\n          if (!ok) {\n            throw new Error(\n              \"The merged plan didn't save, so it will be offered again.\",\n            );\n          }\n          return postBringForward(url, sides.token);\n        })\n        .then(() => {\n          this.forward.count = 0;\n          this.forward.conflicts = plan.conflicts;\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.forward.busy = false;\n        });\n    },\n\n    extensionWall() {\n      const found = newBuildWall(this.fabricTypes);\n      // The house as it is was built as it was; only a proposal builds new.\n      if (!core || !this.proposed || found) {\n        return Promise.resolve(this.proposed ? found : null);\n      }\n      return createFabricType(core.design.fabric_types_url, {\n        design: core.design.id,\n        ...NEW_BUILD_WALL,\n        is_default: false,\n      }).then((saved) => {\n        this.fabricTypes.push(saved);\n        this.syncFabric();\n        return saved;\n      });\n    },\n\n    extensionFloorAndRoof() {\n      const design = core?.design;\n      // Only a proposal builds new; the house as it is was built as it was.\n      if (!design || !this.proposed) {\n        return Promise.resolve([null, null] as const);\n      }\n      const made = (wanted: typeof NEW_BUILD_FLOOR | typeof NEW_BUILD_ROOF) => {\n        const found = newBuildType(this.fabricTypes, wanted);\n        return found\n          ? Promise.resolve(found)\n          : createFabricType(design.fabric_types_url, {\n              design: design.id,\n              ...wanted,\n              is_default: false,\n            }).then((saved) => {\n              this.fabricTypes.push(saved);\n              return saved;\n            });\n      };\n      return Promise.all([made(NEW_BUILD_FLOOR), made(NEW_BUILD_ROOF)]).then(\n        (types) => {\n          this.syncFabric();\n          return types;\n        },\n      );\n    },\n\n    buildOver(scope) {\n      if (!core) {\n        return;\n      }\n      const floor = core.floor();\n      const room =\n        core.selection?.type === \"room\"\n          ? floor.scene.rooms.find((r) => r.id === core?.selection?.id)\n          : undefined;\n      const outlines =\n        scope === \"floor\"\n          ? footprint(floor.scene)\n          : room\n            ? [polygonOf(floor.scene, room)]\n            : [];\n      if (outlines.length === 0) {\n        return;\n      }\n      const design = core.design;\n      const above = design.floors\n        .filter((other) => other.level > floor.level)\n        .sort((x, y) => x.level - y.level)[0];\n      const level = Math.max(...design.floors.map((f) => f.level)) + 1;\n      const target = above\n        ? Promise.resolve(above)\n        : createFloor(\n            design.floors_url,\n            design.id,\n            level,\n            STOREY_NAMES[level] ?? `Floor ${level}`,\n          ).then((made) => {\n            design.floors.push(made);\n            this.refreshFloors();\n            return made;\n          });\n      Promise.all([target, this.extensionWall(), this.extensionFloorAndRoof()])\n        .then(([upstairs, fabric, [floorType, roofType]]) => {\n          this.setFloor(upstairs.id);\n          let made: string[] = [];\n          core?.commit((scene) => {\n            made = buildOver(\n              scene,\n              outlines,\n              scope === \"floor\"\n                ? { name: \"Loft room\", room_type: \"bedroom\" }\n                : { name: \"Bedroom\", room_type: \"bedroom\" },\n              fabric?.id ?? null,\n              fabric ? NEW_BUILD_WALL.spec.thickness_mm : null,\n            );\n            if (made.length > 0 && roofType) {\n              for (const outline of outlines) {\n                markNewBuild(\n                  scene,\n                  outline,\n                  floorType?.id ?? null,\n                  roofType.id,\n                );\n              }\n            }\n          });\n          if (made[0]) {\n            core?.select({ type: \"room\", id: made[0] });\n            this.zoomToFit();\n          }\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    refreshExtension() {\n      activeTool.refresh?.(this.toolContext());\n    },\n\n    buildExtension() {\n      activeTool.finish?.(this.toolContext());\n    },\n\n    extendFromSelected() {\n      const id = core?.selection?.type === \"wall\" ? core.selection.id : null;\n      this.setTool(\"extend\");\n      if (id) {\n        extender.pick(this.toolContext(), id);\n      }\n    },\n\n    extendFrom(placed: Placed) {\n      if (!core) {\n        return;\n      }\n      const form = this.extensionForm;\n      const spec = specOf(form);\n      const fields = {\n        name: form.name.trim() || \"Extension\",\n        room_type: form.roomType,\n      };\n      // The wall type may need making first; build on the floor clicked.\n      const floor = core.floor().id;\n      Promise.all([this.extensionWall(), this.extensionFloorAndRoof()])\n        .then(([fabric, [floorType, roofType]]) => {\n          let room: string | null = null;\n          if (core?.floor().id !== floor) {\n            this.setFloor(floor);\n          }\n          core?.commit((scene) => {\n            const outline = extensionOutline(scene, placed, spec);\n            room = addExtension(\n              scene,\n              placed,\n              spec,\n              fields,\n              fabric?.id ?? null,\n              fabric ? NEW_BUILD_WALL.spec.thickness_mm : null,\n            ).room;\n            if (room && outline && (floorType || roofType)) {\n              markNewBuild(\n                scene,\n                outline,\n                floorType?.id ?? null,\n                roofType?.id ?? null,\n              );\n            }\n          });\n          if (room) {\n            core?.select({ type: \"room\", id: room });\n          }\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    syncMulti() {\n      if (!core || !renderer) {\n        return;\n      }\n      const floorId = core.floor().id;\n      const { multi, hovered } = core;\n      renderer.setMulti({\n        items: forFloor(multi, floorId),\n        colour: core.multiColour,\n        preview: forFloor(hovered?.items ?? [], floorId),\n        previewColour: hovered?.colour ?? null,\n      });\n      this.floorCounts = elsewhere(multi, floorId);\n      this.floorBadge = core\n        .floors()\n        .filter((each) => this.floorCounts[each.id])\n        .map((each) => `${this.floorCounts[each.id]} on ${each.name}`)\n        .join(\", \");\n      if (multi.length === 0) {\n        this.multiSummary = \"\";\n        this.multiMeasures = [];\n        this.pillOn = \"\";\n        return;\n      }\n      const areas = new Map<string, number>();\n      for (const parts of scenarioView?.explorer.prepared.bridged.parts ?? []) {\n        for (const part of parts) {\n          areas.set(part.id, (part.areaMm2 - part.openingsMm2) / 1_000_000);\n        }\n      }\n      this.multiSummary = summarise(multi, core.floors(), areas);\n      const selected = new Set(core.multiKeys());\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      this.multiMeasures = this.targetRows\n        .filter((row) =>\n          (saved?.targets?.[row.id] ?? targetCandidates(row.id)).some((key) =>\n            selected.has(key),\n          ),\n        )\n        .map(({ label, color }) => ({ label, color }));\n    },\n\n    selectTargets(targets: string[], colour?: string, pill = \"\") {\n      if (!core) {\n        return;\n      }\n      const items = itemsFromTargets(targets, core.floors());\n      if (items.length === 0) {\n        return;\n      }\n      if (!core.toggleItems(items, colour ?? null)) {\n        this.pillOn = \"\";\n        return;\n      }\n      this.pillOn = pill;\n      // Nothing on this floor: show where it is.\n      if (!items.some((item) => item.floor === core?.floor().id)) {\n        const first = items[0];\n        if (first) {\n          this.setFloor(first.floor);\n        }\n      }\n    },\n\n    /** Mouse left the pills: nothing is hovered any more. */\n    endPreview() {\n      core?.previewItems(null);\n    },\n\n    previewTargets(targets: string[] | null, colour?: string) {\n      if (!core) {\n        return;\n      }\n      core.previewItems(\n        targets ? itemsFromTargets(targets, core.floors()) : null,\n        colour ?? null,\n      );\n    },\n\n    optionCover(optionId: string): string[] {\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      return saved?.targets?.[optionId] ?? targetCandidates(optionId);\n    },\n\n    floorLabel(floor: { id: number; name: string }) {\n      return labelWithCount(floor.name, this.floorCounts[floor.id] ?? 0);\n    },\n\n    selectionProps(floor: Floor, selection: Selection): SelectionProps {\n      if (!selection) {\n        return null;\n      }\n      if (selection.type === \"annotation\") {\n        const annotation = annotationByDomId(floor, selection.id);\n        if (!annotation) {\n          return null;\n        }\n        const entry = palette.find((c) => c.kind === annotation.kind);\n        const quantity = annotation.length_m\n          ? `${annotation.length_m} m`\n          : annotation.area_m2\n            ? `${annotation.area_m2} m\u00B2`\n            : \"\";\n        return {\n          type: \"annotation\",\n          domId: selection.id,\n          name: entry?.name ?? annotation.kind,\n          figure: entry?.figure ?? null,\n          label: annotation.label,\n          notes: annotation.notes,\n          status: annotation.status,\n          quantity,\n        };\n      }\n      if (selection.type === \"opening\") {\n        const opening = floor.scene.openings.find((o) => o.id === selection.id);\n        if (!opening) {\n          return null;\n        }\n        return {\n          type: \"opening\",\n          id: opening.id,\n          openingType: opening.type,\n          width: opening.width,\n          height: opening.height,\n          sill: opening.sill ?? \"\",\n          swing: opening.swing,\n          flip: opening.flip,\n          double: Boolean(opening.double),\n          fabric: opening.fabric == null ? \"\" : String(opening.fabric),\n          kind: wallKind(floor.scene, opening.wall),\n          vent: opening.vent ?? \"\",\n          ventAngle: opening.vent_angle ?? \"\",\n          ventWidth: opening.vent_width ?? \"\",\n          ventHeight: opening.vent_height ?? \"\",\n          shading: opening.shading ?? \"none\",\n          secure: opening.secure === true,\n          guarded: opening.guarded === true,\n          glazed: opening.glazed === true,\n          trickle: opening.trickle === true,\n        };\n      }\n      if (selection.type === \"emitter\") {\n        const emitter = floor.scene.emitters.find((e) => e.id === selection.id);\n        if (!emitter) {\n          return null;\n        }\n        const room = floor.scene.rooms.find((r) => r.id === emitter.room);\n        const radiator = emitter.kind === \"radiator\" ? emitter : null;\n        return {\n          type: \"emitter\",\n          id: emitter.id,\n          kind: emitter.kind,\n          length: radiator?.length ?? \"\",\n          height: radiator?.height ?? \"\",\n          radiatorType: radiator?.type ?? RADIATOR_DEFAULTS.type,\n          area: emitter.kind === \"underfloor\" ? (emitter.area ?? \"\") : \"\",\n          finish: emitter.kind === \"underfloor\" ? emitter.finish : \"tile\",\n          room: room?.name || \"the room\",\n          roomId: emitter.room,\n        };\n      }\n      if (selection.type === \"room\") {\n        const room = floor.scene.rooms.find((r) => r.id === selection.id);\n        if (!room) {\n          return null;\n        }\n        return {\n          type: \"room\",\n          id: room.id,\n          name: room.name,\n          roomType: room.room_type,\n          ceilingHeight: room.ceiling_height ?? \"\",\n          ceiling: room.ceiling ?? \"flat\",\n          ceilingLow: room.ceiling_low ?? \"\",\n          ceilingHigh: room.ceiling_high ?? \"\",\n          ceilingFall: String(room.ceiling_fall ?? 0),\n          ceilingRidge: room.ceiling_ridge === true,\n          heated: room.heated !== false,\n          area: formatAreaM2(\n            polygonArea(polygonOf(floor.scene, room)) -\n              breastAreaMm2(floor.scene, room.id),\n          ),\n          temperature: room.temperature ?? \"\",\n          vents: room.vents ?? 0,\n          fans: room.fans ?? 0,\n          flues: room.flues ?? 0,\n          extract: room.extract ?? 0,\n          neighbours: neighbours(floor.scene, room.id).map(\n            ({ room: other, length }) => ({\n              id: other.id,\n              label: `${other.name || other.room_type || \"Room\"} (${formatLengthM(length)} shared)`,\n            }),\n          ),\n        };\n      }\n      const wall = floor.scene.walls.find((w) => w.id === selection.id);\n      if (!wall) {\n        return null;\n      }\n      const ends = wallEnds(floor.scene, wall);\n      return {\n        type: \"wall\",\n        id: wall.id,\n        thickness: wall.thickness,\n        length: ends ? Math.round(distance(ends[0], ends[1])) : \"\",\n        fabric: wall.fabric == null ? \"\" : String(wall.fabric),\n        kind: wallKind(floor.scene, wall.id),\n        party: wall.party,\n        canBeParty: canBeParty(floor.scene, wall),\n      };\n    },\n\n    setFloor(id: number) {\n      if (!core) {\n        return;\n      }\n      // A set picked across floors outlasts the switch (a tool's cancel clears it).\n      const kept = core.multi;\n      const keptColour = core.multiColour;\n      activeTool.cancel(this.toolContext());\n      this.discardDraft();\n      if (core.setFloor(id)) {\n        this.currentFloorId = id;\n        if (kept.length > 0) {\n          core.selectItems(kept, keptColour);\n        }\n        traces.refresh();\n        this.syncGhost();\n        this.zoomToFit();\n      }\n    },\n\n    syncGhost() {\n      aligner.refresh();\n    },\n\n    nudgeFloor(event: KeyboardEvent) {\n      const step = event.shiftKey ? 100 : 10;\n      const arrows: Record<string, Point> = {\n        ArrowLeft: [-step, 0],\n        ArrowRight: [step, 0],\n        ArrowUp: [0, -step],\n        ArrowDown: [0, step],\n      };\n      const arrow = arrows[event.key];\n      if (arrow) {\n        // Along the screen, however the plan is turned.\n        const [dx, dy] = turnPoint(arrow, -this.planRotation);\n        aligner.nudge(Math.round(dx), Math.round(dy));\n        return true;\n      }\n      if (\n        event.key === \"[\" ||\n        event.key === \"]\" ||\n        event.key === \"{\" ||\n        event.key === \"}\"\n      ) {\n        const degrees = event.shiftKey ? 0.1 : 1;\n        aligner.turn(\n          event.key === \"[\" || event.key === \"{\" ? -degrees : degrees,\n        );\n        return true;\n      }\n      return false;\n    },\n\n    refreshFloors() {\n      if (!core) {\n        return;\n      }\n      core.design.floors.sort(\n        (left, right) => left.level - right.level || left.id - right.id,\n      );\n      this.floors = core.design.floors.map((floor) => ({\n        id: floor.id,\n        name: floorLabel(floor),\n        level: floor.level,\n      }));\n      this.syncGhost();\n    },\n\n    addFloor() {\n      if (!core) {\n        return;\n      }\n      const design = core.design;\n      const level = Math.max(...design.floors.map((floor) => floor.level)) + 1;\n      createFloor(design.floors_url, design.id, level, `Floor ${level}`)\n        .then((floor) => {\n          design.floors.push(floor);\n          this.refreshFloors();\n          this.setFloor(floor.id);\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    renameFloor(id: number, name: string) {\n      const floor = core?.design.floors.find((f) => f.id === id);\n      if (!floor || !name.trim()) {\n        return;\n      }\n      renameFloorRequest(floor.url, name.trim())\n        .then(() => {\n          floor.name = name.trim();\n          this.refreshFloors();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    moveFloor(id: number, delta: number) {\n      if (!core) {\n        return;\n      }\n      const design = core.design;\n      const ordered = [...design.floors];\n      const index = ordered.findIndex((floor) => floor.id === id);\n      const target = index + delta;\n      if (index < 0 || target < 0 || target >= ordered.length) {\n        return;\n      }\n      const [moved] = ordered.splice(index, 1);\n      if (!moved) {\n        return;\n      }\n      ordered.splice(target, 0, moved);\n      reorderFloors(\n        design.reorder_floors_url,\n        ordered.map((floor) => floor.id),\n      )\n        .then(() => {\n          ordered.forEach((floor, level) => {\n            floor.level = level;\n          });\n          this.refreshFloors();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    removeFloor(id: number) {\n      if (!core || core.design.floors.length <= 1) {\n        return;\n      }\n      const floor = core.design.floors.find((f) => f.id === id);\n      if (!floor || !window.confirm(`Delete ${floorLabel(floor)}?`)) {\n        return;\n      }\n      deleteFloor(floor.url)\n        .then(() => {\n          if (!core) {\n            return;\n          }\n          core.design.floors = core.design.floors.filter((f) => f.id !== id);\n          this.refreshFloors();\n          if (this.currentFloorId === id) {\n            const first = core.design.floors[0];\n            if (first) {\n              this.setFloor(first.id);\n            }\n          }\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    draftFromImage() {\n      if (!core || this.draft.busy) {\n        return;\n      }\n      const floor = core.floor();\n      const rooms = floor.scene.rooms.length;\n      if (\n        rooms > 0 &&\n        !window.confirm(\n          `${floorLabel(floor)} already has ${rooms === 1 ? \"a room\" : `${rooms} rooms`}. ` +\n            \"Draft more alongside? Nothing already drawn is replaced.\",\n        )\n      ) {\n        return;\n      }\n      this.discardDraft();\n      this.setTool(\"select\");\n      this.draft.busy = true;\n      const trace = traces.active();\n      if (!trace) {\n        return;\n      }\n      postDraft(trace.draft_url)\n        .then((read) => {\n          if (!core || core.floor() !== floor) {\n            return;\n          }\n          const draft = tidy(draftToWorld(read, traceTransform(trace)));\n          const after = structuredClone(floor.scene);\n          const counts = applyDraft(after, draft);\n          pendingDraft = draft;\n          const bounds = floorBounds({ ...floor, scene: after });\n          if (bounds && renderer) {\n            view = fitBounds(\n              turnBounds(bounds, this.planRotation),\n              screenRect(renderer.svg),\n            );\n            this.applyView();\n          }\n          renderer?.setPreview(\n            renderOverlay(\n              draftPreview(floor.scene, after),\n              this.currentWorldPerPixel(),\n            ),\n          );\n          this.draft = { busy: false, ready: true, ...counts };\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          this.draft.busy = false;\n        });\n    },\n\n    draftSummary() {\n      const { rooms, openings } = this.draft;\n      const count = (n: number, one: string, many: string) =>\n        `${n} ${n === 1 ? one : many}`;\n      return (\n        `Drafted ${count(rooms, \"room\", \"rooms\")} and ` +\n        `${count(openings, \"door or window\", \"doors and windows\")}, in blue. ` +\n        \"Check them against the plan.\"\n      );\n    },\n\n    acceptDraft() {\n      const draft = pendingDraft;\n      if (!core || !draft) {\n        return;\n      }\n      core.commit((scene) => {\n        applyDraft(scene, draft);\n      });\n      this.discardDraft();\n    },\n\n    discardDraft() {\n      if (pendingDraft) {\n        renderer?.setPreview([]);\n      }\n      pendingDraft = null;\n      this.draft = { ...this.draft, ready: false, rooms: 0, openings: 0 };\n    },\n\n    applyCalibration() {\n      const pending = pendingCalibration;\n      const length = parseLengthMm(this.calibration.length);\n      if (!pending || length === null) {\n        return;\n      }\n      pendingCalibration = null;\n      this.calibration = { active: false, length: \"\" };\n      traces.calibrate(pending.a, pending.b, length);\n      this.setTool(\"trace\");\n    },\n\n    cancelCalibration() {\n      pendingCalibration = null;\n      this.calibration = { active: false, length: \"\" };\n    },\n\n    toggleSchedule() {\n      this.scheduleOpen = !this.scheduleOpen;\n      if (this.scheduleOpen) {\n        this.refreshSchedule();\n      }\n    },\n\n    refreshSchedule() {\n      const url = this.scopeScheduleUrl();\n      if (!url) {\n        return;\n      }\n      fetchSchedule(url)\n        .then((schedule) => {\n          if (this.scenarioId === null) {\n            applySchedule(schedule.rows);\n          }\n          this.schedule = editableSchedule(schedule);\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    saveScheduleRow(row: EditableScheduleRow) {\n      const design = core?.design;\n      if (!design?.schedule_measure_url) {\n        return;\n      }\n      const carbon = row.editCarbon.trim();\n      const epc = row.editEpc.trim();\n      // Answered with the open scenario's schedule, as the table shows it.\n      postScheduleMeasure(\n        this.scenarioId === null\n          ? design.schedule_measure_url\n          : `${design.schedule_measure_url}?package=${this.scenarioId}`,\n        {\n          kind: row.kind,\n          cost_override: parsePounds(row.editCost),\n          annual_cost_savings: parsePounds(row.editSavings),\n          annual_carbon_savings: carbon === \"\" ? null : carbon,\n          energy_rating_improvement: epc === \"\" ? null : epc,\n          notes: row.editNotes,\n        },\n      )\n        .then((schedule) => {\n          this.schedule = editableSchedule(schedule);\n          // The search prices from the baseline's typed figures.\n          return this.scenarioId === null\n            ? schedule\n            : fetchSchedule(design.schedule_url);\n        })\n        .then((schedule) => applySchedule(schedule.rows))\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    formatPence(pence: number): string {\n      return `\u00A3${Math.round(pence / 100).toLocaleString(\"en-GB\")}`;\n    },\n\n    measureGroups(): PaletteGroup[] {\n      return paletteGroups(this.catalogue, this.measureQuery);\n    },\n\n    figureOf(kind: string): string | null {\n      return palette.find((entry) => entry.kind === kind)?.figure ?? null;\n    },\n\n    fabricSummary(type: FabricType): string {\n      const u = fabricUValue(type);\n      const summary = specSummary(type, ageLabels);\n      return u ? `${u} \u00B7 ${summary}` : summary;\n    },\n\n    fabricChip(type: FabricType): string {\n      if (type.element !== \"WALL\") {\n        return \"#94a3b8\";\n      }\n      return fabricColor(this.fabricTypes, type);\n    },\n\n    syncFabric() {\n      if (!core) {\n        return;\n      }\n      core.design.fabric_types = [...this.fabricTypes];\n      renderer?.setFabricTypes(core.design.fabric_types);\n      this.redraw();\n      // U-values come from the server, so a spec change needs them again.\n      this.refetchCalc();\n    },\n\n    /** The U-value the type has as it's described now, shown as it's edited.\n     * Empty when the heat load and SAP use different ones, which the line\n     * below then gives side by side. */\n    fabricLiveU() {\n      const known = parseU(this.fabricForm.uvalue);\n      if (known !== null) {\n        return `${known} W/m\u00B2K`;\n      }\n      if (this.fabricForm.element !== \"WALL\") {\n        return \"RdSAP default\";\n      }\n      const us = liveWallUs(this.fabricForm, this.fabricLive);\n      if (us.heat && us.rdsap !== null) {\n        return us.heat.u.toFixed(2) === us.rdsap.toFixed(2)\n          ? `${us.rdsap.toFixed(2)} W/m\u00B2K`\n          : \"\";\n      }\n      const only = us.heat?.u ?? us.rdsap;\n      return only === null ? \"RdSAP default\" : `${only.toFixed(2)} W/m\u00B2K`;\n    },\n\n    /** Where that figure comes from, in a few words. */\n    fabricLiveSource() {\n      const form = this.fabricForm;\n      const known = parseU(form.uvalue);\n      if (form.element !== \"WALL\") {\n        return known === null\n          ? \"Set by RdSAP unless you measure it\"\n          : \"Measured\";\n      }\n      const us = liveWallUs(form, this.fabricLive);\n      if (known === null && us.heat && us.rdsap !== null) {\n        const rdsap = `SAP ${us.rdsap.toFixed(2)} (RdSAP, ${us.nation})`;\n        if (us.heat.u.toFixed(2) !== us.rdsap.toFixed(2)) {\n          return `Heat load ${us.heat.u.toFixed(2)} (${us.heat.source}) \u00B7 ${rdsap}`;\n        }\n      }\n      return wallUSource(\n        {\n          construction: form.construction,\n          age: form.age,\n          thicknessMm: parseMm(form.thicknessMm),\n          mode: form.insulationMode,\n          place: form.insulationPlace,\n          insulationMm: parseMm(form.insulationThicknessMm),\n        },\n        known,\n        ageLabels,\n      );\n    },\n\n    /** Ask the server for RdSAP's default for the wall as it's described. */\n    refreshFabricU() {\n      const form = this.fabricForm;\n      window.clearTimeout(fabricUTimer);\n      // A reply to an earlier ask is stale once this one is made.\n      fabricUAsked += 1;\n      if (!core || !form.open || form.element !== \"WALL\") {\n        this.fabricLive = null;\n        return;\n      }\n      const url = core.design.fabric_types_url;\n      const spec = elementSpec(form);\n      const asked = fabricUAsked;\n      const design = core.design.id;\n      fabricUTimer = window.setTimeout(() => {\n        wallDefaultU(url, spec, design)\n          .then((live) => {\n            if (asked === fabricUAsked) {\n              this.fabricLive = live;\n            }\n          })\n          .catch(() => {\n            if (asked === fabricUAsked) {\n              this.fabricLive = null;\n            }\n          });\n      }, 150);\n    },\n\n    openFabricForm(element: FabricType[\"element\"], id: number | null) {\n      if (id === null) {\n        const form = emptyFabricForm();\n        form.element = element;\n        form.open = true;\n        this.fabricForm = form;\n        return;\n      }\n      const type = this.fabricTypes.find((candidate) => candidate.id === id);\n      if (!type) {\n        return;\n      }\n      const form = filledFabricForm(type);\n      form.open = true;\n      form.usedBy =\n        type.element === \"WALL\" && core\n          ? wallsUsing(\n              core.floors().map((floor) => floor.scene),\n              type,\n            )\n          : 0;\n      this.fabricForm = form;\n    },\n\n    saveFabricForm(scope: \"all\" | \"wall\" = \"all\") {\n      const form = this.fabricForm;\n      if (!core || !form.name.trim()) {\n        return;\n      }\n      const original = this.fabricTypes.find((t) => t.id === form.id);\n      // Just this wall: a new type, taken by the wall alone.\n      const justWall = scope === \"wall\" && form.wallId !== \"\";\n      const name = form.name.trim();\n      const body = {\n        design: core.design.id,\n        element: form.element,\n        name: justWall && name === original?.name ? `${name} (copy)` : name,\n        spec: fabricFormSpec(form),\n      };\n      const wallId = form.wallId;\n      const request =\n        form.id === null || justWall\n          ? createFabricType(core.design.fabric_types_url, body)\n          : patchFabricType(\n              this.fabricTypes.find((t) => t.id === form.id)?.url ?? \"\",\n              body,\n            );\n      request\n        .then((saved) => {\n          const index = this.fabricTypes.findIndex((t) => t.id === saved.id);\n          if (index >= 0) {\n            this.fabricTypes.splice(index, 1, saved);\n          } else {\n            this.fabricTypes.push(saved);\n          }\n          this.fabricForm = emptyFabricForm();\n          if (justWall && core) {\n            core.commit((scene) => {\n              const wall = scene.walls.find((w) => w.id === wallId);\n              if (wall) {\n                wall.fabric = saved.id;\n              }\n            });\n          }\n          this.syncFabric();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    /** Edit the type of the selected wall, which every wall of it shares. */\n    editWallType() {\n      const selection = core?.selection;\n      if (!core || selection?.type !== \"wall\") {\n        return;\n      }\n      const wall = core.scene().walls.find((w) => w.id === selection.id);\n      const type = resolveFabric(this.fabricTypes, \"WALL\", wall?.fabric);\n      if (!type) {\n        return;\n      }\n      this.openFabricForm(\"WALL\", type.id);\n      this.fabricForm.wallId = selection.id;\n    },\n\n    fabricUsedBy() {\n      return usedByText(this.fabricForm.usedBy);\n    },\n\n    fabricSharedWithWall() {\n      return this.fabricForm.wallId !== \"\" && this.fabricForm.usedBy > 1;\n    },\n\n    cancelFabricForm() {\n      this.fabricForm = emptyFabricForm();\n    },\n\n    makeDefaultFabric(id: number) {\n      const type = this.fabricTypes.find((candidate) => candidate.id === id);\n      if (!type) {\n        return;\n      }\n      patchFabricType(type.url, { is_default: true })\n        .then((saved) => {\n          for (const candidate of this.fabricTypes) {\n            if (candidate.element === saved.element) {\n              candidate.is_default = candidate.id === saved.id;\n            }\n          }\n          this.syncFabric();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    removeFabricType(id: number) {\n      const type = this.fabricTypes.find((candidate) => candidate.id === id);\n      if (!type || type.is_default) {\n        return;\n      }\n      if (!window.confirm(`Delete the ${type.name} type?`)) {\n        return;\n      }\n      deleteFabricType(type.url)\n        .then(() => {\n          this.fabricTypes = this.fabricTypes.filter((t) => t.id !== id);\n          this.syncFabric();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    pickMeasure(kind: string) {\n      const entry = palette.find((candidate) => candidate.kind === kind);\n      if (!entry || this.scenarioId === null) {\n        return;\n      }\n      if (this.pickedMeasure === kind && this.tool === \"annotate\") {\n        this.dropMeasure();\n        return;\n      }\n      this.pickedMeasure = kind;\n      this.annotationMode = entry.mode;\n      if (this.tool !== \"annotate\") {\n        this.setTool(\"annotate\");\n      } else {\n        activeTool.cancel(this.toolContext());\n      }\n    },\n\n    /** Put the picked measure down, so a click on the plan places nothing. */\n    dropMeasure() {\n      this.pickedMeasure = \"\";\n      this.setTool(\"select\");\n    },\n\n    setAnnotationMode(mode: AnnotationMode) {\n      activeTool.cancel(this.toolContext());\n      this.annotationMode = mode;\n    },\n\n    fail(error: unknown) {\n      const message =\n        error instanceof Error\n          ? error.message\n          : typeof error === \"string\"\n            ? error\n            : \"Something went wrong.\";\n      this.error = message;\n      setTimeout(() => {\n        if (this.error === message) {\n          this.error = \"\";\n        }\n      }, 6000);\n    },\n\n    setTool(name: ToolName) {\n      if (this.mode === \"compare\" && name !== \"select\") {\n        return;\n      }\n      // A scenario proposes measures; its baseline is the plan to change.\n      if (this.scenarioId !== null && !SCENARIO_TOOLS.has(name)) {\n        this.notice = \"Open the baseline to change the plan.\";\n        return;\n      }\n      if (this.scenarioId === null && name === \"annotate\") {\n        this.notice = NO_BASELINE_MEASURES;\n        return;\n      }\n      activeTool.cancel(this.toolContext());\n      this.assessing = false;\n      // A fit pointed at in the panel the switch takes away.\n      core?.endPreview();\n      activeTool = tools[name];\n      this.tool = name;\n      const draws = TOOL_LAYERS[name];\n      if (draws) {\n        this.showLayer(draws);\n      }\n      this.hint = activeTool.hint;\n      traces.toolChanged(name);\n      this.syncPhases();\n      if (renderer) {\n        renderer.svg.style.cursor = TOOL_CURSORS[name];\n      }\n      aligner.refresh();\n      if (name === \"floor\") {\n        this.zoomToFit();\n        aligner.tool.show(this.toolContext());\n      }\n    },\n\n    zoomBy(factor: number) {\n      if (!renderer || !view) {\n        return;\n      }\n      const rect = screenRect(renderer.svg);\n      view = zoomAt(\n        view,\n        rect,\n        rect.left + rect.width / 2,\n        rect.top + rect.height / 2,\n        factor,\n      );\n      this.applyView();\n    },\n\n    setOpeningType(type: OpeningType) {\n      this.openingType = type;\n      if (this.tool !== \"opening\") {\n        this.setTool(\"opening\");\n      }\n    },\n\n    setEmitterKind(kind) {\n      this.emitterForm.kind = kind;\n      if (this.tool === \"emitter\") {\n        activeTool.cancel(this.toolContext());\n      } else {\n        this.setTool(\"emitter\");\n      }\n    },\n\n    undo() {\n      // A move under way would land from before the undo.\n      if (this.tool === \"floor\") {\n        activeTool.cancel(this.toolContext());\n      }\n      core?.undo();\n    },\n\n    redo() {\n      if (this.tool === \"floor\") {\n        activeTool.cancel(this.toolContext());\n      }\n      core?.redo();\n    },\n\n    updateSelected() {\n      const props = this.selection;\n      if (!core || !props) {\n        return;\n      }\n      if (props.type === \"annotation\") {\n        const annotation = annotationByDomId(core.floor(), props.domId);\n        if (!annotation || annotation.id < 0) {\n          return;\n        }\n        core.pushHistory();\n        annotation.label = props.label;\n        annotation.notes = props.notes;\n        annotation.status = props.status;\n        this.redraw();\n        enqueueAnnotationWrite(() =>\n          patchAnnotation(annotation.url, {\n            label: props.label,\n            notes: props.notes,\n            status: props.status,\n          }),\n        )\n          .then((updated) => {\n            Object.assign(annotation, updated);\n            this.redraw();\n          })\n          .catch((error: unknown) => this.fail(error));\n        return;\n      }\n      if (props.type === \"room\") {\n        const ceiling =\n          props.ceilingHeight === \"\"\n            ? null\n            : Math.max(1, Math.round(Number(props.ceilingHeight)));\n        core.commit((scene) => {\n          const room = scene.rooms.find((r) => r.id === props.id);\n          if (room) {\n            room.name = props.name;\n            room.room_type = props.roomType.trim().toLowerCase();\n            room.ceiling_height = ceiling;\n            applyCeiling(room, props);\n            room.heated = props.heated;\n            const temperature = Number(props.temperature);\n            if (props.temperature === \"\" || !Number.isFinite(temperature)) {\n              delete room.temperature;\n            } else {\n              room.temperature = Math.min(30, Math.max(5, temperature));\n            }\n            // Kept off the scene at zero, so an untouched room stays as drawn.\n            for (const key of [\"vents\", \"fans\", \"flues\", \"extract\"] as const) {\n              const count = Math.max(0, Math.round(Number(props[key]) || 0));\n              if (count > 0) {\n                room[key] = count;\n              } else {\n                delete room[key];\n              }\n            }\n          }\n        });\n        return;\n      }\n      if (props.type === \"emitter\") {\n        const mm = (raw: number | \"\", low: number, high: number) =>\n          Math.min(high, Math.max(low, Math.round(Number(raw) || 0)));\n        const area = Number(props.area);\n        core.commit((scene) => {\n          const emitter = scene.emitters.find((e) => e.id === props.id);\n          if (emitter?.kind === \"radiator\") {\n            emitter.length = mm(props.length, 100, 6000);\n            emitter.height = mm(props.height, 100, 2000);\n            emitter.type = props.radiatorType;\n          } else if (emitter) {\n            emitter.finish = props.finish;\n            emitter.area =\n              props.area === \"\" || !(area > 0)\n                ? null\n                : Math.min(1000, Math.round(area * 10) / 10);\n          }\n        });\n        return;\n      }\n      if (props.type === \"opening\") {\n        const width = Math.max(100, Math.round(Number(props.width) || 0));\n        const height = Math.max(100, Math.round(Number(props.height) || 0));\n        const sill =\n          props.sill === \"\"\n            ? null\n            : Math.max(0, Math.round(Number(props.sill)));\n        const openingFabric = props.fabric === \"\" ? null : Number(props.fabric);\n        core.commit((scene) => {\n          const opening = scene.openings.find((o) => o.id === props.id);\n          if (opening) {\n            opening.type = props.openingType;\n            opening.width = width;\n            opening.height = height;\n            opening.sill = sill;\n            // A door swings one way or the other; only a window is fixed.\n            opening.swing =\n              props.openingType === \"door\" && props.swing === \"none\"\n                ? \"left\"\n                : props.swing;\n            opening.flip = Boolean(props.flip);\n            if (props.openingType === \"door\" && props.double) {\n              opening.double = true;\n            } else {\n              delete opening.double;\n            }\n            opening.fabric = openingFabric;\n            setVent(opening, props);\n          }\n        });\n        return;\n      }\n      const thickness = Math.max(10, Math.round(Number(props.thickness) || 0));\n      const wallFabric = props.fabric === \"\" ? null : Number(props.fabric);\n      const length = Math.round(Number(props.length));\n      let resized = \"unchanged\" as Resized;\n      core.commit((scene) => {\n        const wall = scene.walls.find((w) => w.id === props.id);\n        if (wall) {\n          wall.thickness = thickness;\n          wall.fabric = wallFabric;\n          wall.party = props.party;\n        }\n        if (props.length !== \"\" && length >= 100) {\n          const empties = emptySpaces(scene);\n          resized = resizeWall(scene, props.id, length);\n          if (resized === \"resized\") {\n            settle(scene, { empties });\n          }\n        }\n      });\n      if (resized === \"blocked\") {\n        this.fail(\n          \"That length would close up a wall alongside, or leave a window\" +\n            \" or door no room. Move the wall next door first.\",\n        );\n        this.redraw();\n      }\n    },\n\n    mergeSelectedWith(roomId: string) {\n      const selection = core?.selection;\n      if (!core || selection?.type !== \"room\" || !roomId) {\n        return;\n      }\n      const [keep, other] = largerFirst(core.scene(), selection.id, roomId);\n      core.commit((scene) => {\n        mergeRooms(scene, keep, other);\n      });\n      core.select({ type: \"room\", id: keep });\n    },\n\n    removeSelectedWithWalls() {\n      const selection = core?.selection;\n      if (!core || selection?.type !== \"room\") {\n        return;\n      }\n      core.commit((scene) => {\n        removeRoomWithWalls(scene, selection.id);\n      });\n      core.select(null);\n    },\n\n    deleteSelected() {\n      if (this.tool === \"fixture\" && this.fixtureKey) {\n        this.removeFixture();\n        return;\n      }\n      if (!core) {\n        return;\n      }\n      const selection = core.selection;\n      if (selection?.type === \"annotation\") {\n        const floor = core.floor();\n        const annotation = annotationByDomId(floor, selection.id);\n        if (!annotation || annotation.id < 0) {\n          return;\n        }\n        // Soft delete: the row survives server-side so undo can resurrect\n        // it by id.\n        core.pushHistory();\n        floor.annotations = floor.annotations.filter(\n          (candidate) => candidate.id !== annotation.id,\n        );\n        core.select(null);\n        this.redraw();\n        enqueueAnnotationWrite(() =>\n          patchAnnotation(annotation.url, { deleted: true }),\n        )\n          .then(() => this.scheduleInventory())\n          .catch((error: unknown) => this.fail(error));\n        return;\n      }\n      if (core.multi.length > 0) {\n        // Refuses rather than guesses, and keeps the set.\n        const refusal = core.deleteRefusal();\n        if (refusal) {\n          this.fail(refusal);\n        } else {\n          core.deleteMulti();\n        }\n        return;\n      }\n      core.deleteSelection();\n    },\n\n    reload() {\n      window.location.reload();\n    },\n\n    zoomToFit() {\n      if (!renderer || !core) {\n        return;\n      }\n      const rect = screenRect(renderer.svg);\n      // Moving a floor, the one it lines up against is in view too.\n      const bounds =\n        this.tool === \"floor\" ? aligner.extent() : floorBounds(core.floor());\n      // Clear of the tool rail, on the tabs that have one.\n      const rail = this.mode === \"design\" ? RAIL_WIDTH_PX : 0;\n      view = bounds\n        ? fitBounds(turnBounds(bounds, this.planRotation), rect, 0.1, rail)\n        : defaultView(rect);\n      this.applyView();\n    },\n\n    applyView() {\n      if (!renderer || !view) {\n        return;\n      }\n      renderer.svg.setAttribute(\n        \"viewBox\",\n        `${view.x} ${view.y} ${view.w} ${view.h}`,\n      );\n      // 100% \u2248 a 12 m wide plot filling the canvas.\n      this.zoomPercent = Math.round((12_000 / view.w) * 100);\n      renderer.setWorldPerPixel(this.currentWorldPerPixel());\n      if (core) {\n        renderer.syncSelection(\n          core.floor(),\n          core.selection,\n          this.currentWorldPerPixel(),\n        );\n      }\n    },\n\n    currentWorldPerPixel(): number {\n      if (!renderer || !view) {\n        return 10;\n      }\n      return worldPerPixel(view, screenRect(renderer.svg));\n    },\n\n    toolContext(): ToolContext {\n      return {\n        scene: () => {\n          if (!core) {\n            throw new Error(\"Editor not started.\");\n          }\n          return core.scene();\n        },\n        selected: () => core?.selection ?? null,\n        select: (selection) => core?.select(selection),\n        toggleSelect: (selection) => core?.toggleSelection(selection),\n        commit: (mutate) => core?.commit(mutate),\n        warn: (message) => this.fail(message),\n        beginGesture: () => core?.beginGesture(),\n        mutateLive: (mutate) => core?.mutateLive(mutate),\n        endGesture: () => core?.endGesture(),\n        cancelGesture: () => core?.cancelGesture(),\n        snap: (point, options = {}) => {\n          if (!core) {\n            return { point, kind: \"none\" };\n          }\n          return snapPoint(point, core.scene(), {\n            tolerance: SNAP_TOLERANCE_PX * this.currentWorldPerPixel(),\n            underlay: aligner.underlayScene(),\n            ...options,\n          });\n        },\n        preview: (specs) =>\n          renderer?.setPreview(\n            renderOverlay(specs, this.currentWorldPerPixel()),\n          ),\n        worldPerPixel: () => this.currentWorldPerPixel(),\n        hitId: (event) => {\n          const target = event.target;\n          if (!(target instanceof Element)) {\n            return null;\n          }\n          return target.closest(\"[data-id]\")?.getAttribute(\"data-id\") ?? null;\n        },\n        hitHandle: (event) => {\n          const target = event.target;\n          if (!(target instanceof Element)) {\n            return null;\n          }\n          return (\n            target.closest(\"[data-handle]\")?.getAttribute(\"data-handle\") ?? null\n          );\n        },\n        openingType: () => this.openingType,\n        extension: () => specOf(this.extensionForm),\n        setExtensionDepth: (depth) => {\n          this.extensionForm.depth = depth / 1000;\n        },\n        picked: (placed) => {\n          this.extensionForm.facade = Math.round(placed.facade.length) / 1000;\n          this.extensionForm.width = \"\";\n          this.extensionForm.inset = 0;\n        },\n        extend: (placed) => this.extendFrom(placed),\n        emitter: (): EmitterDraft => {\n          const form = this.emitterForm;\n          if (form.kind === \"underfloor\") {\n            return { kind: \"underfloor\", finish: form.finish };\n          }\n          const mm = (raw: number | \"\", fallback: number) => {\n            const value = Math.round(Number(raw));\n            return raw !== \"\" && value >= 100 ? value : fallback;\n          };\n          return {\n            kind: \"radiator\",\n            length: mm(form.length, RADIATOR_DEFAULTS.length),\n            height: mm(form.height, RADIATOR_DEFAULTS.height),\n            type: form.type,\n          };\n        },\n        openingWidth: () => {\n          const width = Math.round(\n            Number(this.openingWidths[this.openingType]),\n          );\n          return Number.isFinite(width) && width >= 100\n            ? width\n            : OPENING_DEFAULTS[this.openingType].width;\n        },\n        requestCalibration: (a, b) => {\n          pendingCalibration = { a, b };\n          this.calibration = { active: true, length: \"\" };\n        },\n        measureKind: () => this.pickedMeasure,\n        annotationMode: () => this.annotationMode,\n        createAnnotation: (kind, geometry) => {\n          const scenario = this.scenarioId;\n          if (!core || scenario === null) {\n            return;\n          }\n          const floor = core.floor();\n          this.showLayer(\"measures\", kind);\n          const temp: Annotation = {\n            id: nextTempId--,\n            kind,\n            geometry,\n            label: \"\",\n            notes: \"\",\n            status: \"PROPOSED\",\n            deleted: false,\n            order: 0,\n            length_m: null,\n            area_m2: null,\n            url: \"\",\n            package: scenario,\n          };\n          const annotationsUrl = core.design.annotations_url;\n          // Capture the pre-create state now; it enters history on server\n          // ack so temp ids never appear in undo snapshots.\n          const captured = core.captureSnapshot();\n          floor.annotations.push(temp);\n          this.redraw();\n          enqueueAnnotationWrite(() =>\n            createAnnotation(\n              annotationsUrl,\n              floor.id,\n              kind,\n              geometry,\n              scenario,\n            ),\n          )\n            .then((saved) => {\n              Object.assign(temp, saved);\n              core?.pushCapturedSnapshot(captured);\n              core?.select({ type: \"annotation\", id: `a_${saved.id}` });\n              this.redraw();\n              this.scheduleInventory();\n            })\n            .catch((error: unknown) => {\n              floor.annotations = floor.annotations.filter(\n                (candidate) => candidate.id !== temp.id,\n              );\n              this.redraw();\n              this.fail(error);\n            });\n        },\n        hasAnnotation: (domId) => {\n          if (!core) {\n            return false;\n          }\n          return annotationByDomId(core.floor(), domId) !== undefined;\n        },\n        beginAnnotationMove: (domId) => {\n          if (!core) {\n            return;\n          }\n          const annotation = annotationByDomId(core.floor(), domId);\n          if (annotation && annotation.id >= 0) {\n            core.pushHistory();\n          }\n        },\n        moveAnnotationBy: (domId, dx, dy) => {\n          if (!core) {\n            return;\n          }\n          const annotation = annotationByDomId(core.floor(), domId);\n          if (annotation) {\n            annotation.geometry = translated(annotation.geometry, dx, dy);\n            this.redraw();\n          }\n        },\n        traces: traces.tools(),\n        fixtures: {\n          shown: () =>\n            this.shownFixtureList().filter(\n              (shown) => shown.floor === this.currentFloorId,\n            ),\n          kind: () => this.fixtureKind,\n          add: (fixture) => this.addFixture(fixture),\n          select: (key) => this.selectFixture(key),\n          assessing: () => this.assessing,\n          assess: (point) => this.dropAssess(point),\n        },\n        commitAnnotationMove: (domId) => {\n          if (!core) {\n            return;\n          }\n          const annotation = annotationByDomId(core.floor(), domId);\n          if (!annotation || annotation.id < 0) {\n            return;\n          }\n          enqueueAnnotationWrite(() =>\n            patchAnnotation(annotation.url, { geometry: annotation.geometry }),\n          )\n            .then((updated) => {\n              Object.assign(annotation, updated);\n              this.redraw();\n            })\n            .catch((error: unknown) => this.fail(error));\n        },\n      };\n    },\n\n    setTab(key: Tab) {\n      for (const [open, on] of Object.entries(this.folds)) {\n        if (on && open !== key) {\n          this.setFold(open, false);\n        }\n      }\n      if (!this.folds[key]) {\n        this.setFold(key, true);\n      }\n    },\n\n    setFold(key: string, open: boolean) {\n      this.folds = { ...this.folds, [key]: open };\n      saveFolds(this.folds);\n      if (key === \"measures\" && open) {\n        this.refreshInventory();\n      }\n      if (key === \"history\" && open !== this.historyOpen) {\n        this.toggleHistory();\n      }\n    },\n\n    editingPlace() {\n      const floor = this.floors.find((row) => row.id === this.currentFloorId);\n      const selected = this.selection;\n      const what = !selected\n        ? \"\"\n        : selected.type === \"room\"\n          ? selected.name || \"Room\"\n          : SELECTION_NAMES[selected.type];\n      return [floor?.name, what].filter(Boolean).join(\" \u00B7 \");\n    },\n\n    setMode(mode: Mode) {\n      if (this.mode === mode) {\n        return;\n      }\n      // keepScenarioOptions only writes in Design.\n      flushScenario();\n      this.mode = mode;\n      if (mode !== \"design\" && this.tool === \"floor\") {\n        this.setTool(\"select\");\n      }\n      if (mode === \"compare\") {\n        this.setTool(\"select\");\n        this.loadScenarios();\n      } else if (mode === \"design\") {\n        this.scheduleInventory();\n      } else if (mode === \"overheating\") {\n        if (this.tool !== \"select\") {\n          this.setTool(\"select\");\n        }\n        this.recomputeOverheating();\n      }\n      this.refreshOverlays();\n      // The canvas resizes with the side panel.\n      window.requestAnimationFrame(() => {\n        this.applyView();\n        if (mode === \"compare\" && scenarioView) {\n          this.showScenario();\n        }\n      });\n    },\n\n    toggleHeatMap() {\n      this.heatMap = !this.heatMap;\n      this.refreshOverlays();\n    },\n\n    refreshRooms() {\n      if (!core) {\n        return;\n      }\n      const rows = roomRows(core.floors());\n      if (!same(rows, this.floorRooms)) {\n        this.floorRooms = rows;\n      }\n    },\n\n    refreshLayers() {\n      if (!core) {\n        return;\n      }\n      const counts = new Map<string, number>();\n      for (const annotation of core.floor().annotations) {\n        if (!inScope(annotation, this.scenarioId)) {\n          continue;\n        }\n        counts.set(annotation.kind, (counts.get(annotation.kind) ?? 0) + 1);\n      }\n      const style = new Map(palette.map((entry) => [entry.kind, entry]));\n      const kinds = [...counts]\n        .map(([kind, count]) => ({\n          kind,\n          count,\n          name: style.get(kind)?.name ?? kind,\n          color: style.get(kind)?.color ?? \"#7c3aed\",\n        }))\n        .sort((left, right) => left.name.localeCompare(right.name));\n      if (!same(kinds, this.layers.kinds)) {\n        this.layers.kinds = kinds;\n      }\n    },\n\n    toggleLayer(layer: PlanLayer) {\n      const hidden = this.layers.hidden;\n      this.layers.hidden = hidden.includes(layer)\n        ? hidden.filter((each) => each !== layer)\n        : [...hidden, layer];\n      this.applyLayers();\n    },\n\n    toggleKind(kind: string) {\n      const hidden = this.layers.hiddenKinds;\n      this.layers.hiddenKinds = hidden.includes(kind)\n        ? hidden.filter((each) => each !== kind)\n        : [...hidden, kind];\n      this.applyLayers();\n    },\n\n    showAllLayers() {\n      this.layers.hidden = [];\n      this.layers.hiddenKinds = [];\n      this.applyLayers();\n    },\n\n    toggleMeasures() {\n      this.toggleLayer(\"measures\");\n    },\n\n    showLayer(layer: PlanLayer, kind?: string) {\n      const hidden = this.layers.hidden.filter((each) => each !== layer);\n      const kinds = this.layers.hiddenKinds.filter((each) => each !== kind);\n      if (\n        hidden.length !== this.layers.hidden.length ||\n        kinds.length !== this.layers.hiddenKinds.length\n      ) {\n        this.layers.hidden = hidden;\n        this.layers.hiddenKinds = kinds;\n        this.applyLayers();\n      }\n    },\n\n    applyLayers() {\n      const hidden = new Set(this.layers.hidden);\n      const kinds = new Set(this.layers.hiddenKinds);\n      renderer?.setHidden(hidden, kinds);\n      if (!core) {\n        return;\n      }\n      // Nor can Delete take what a hidden layer hides.\n      if (core.multi.length > 0) {\n        const shown = core.multi.filter(\n          (item) => !hidden.has(SELECTED_LAYER[item.type]),\n        );\n        if (shown.length < core.multi.length) {\n          core.selectItems(shown, core.multiColour);\n          this.redraw();\n        }\n      }\n      // What's selected can't stay selected once it can't be seen.\n      const selected = core.selection;\n      if (!selected) {\n        return;\n      }\n      const annotation =\n        selected.type === \"annotation\"\n          ? annotationByDomId(core.floor(), selected.id)\n          : undefined;\n      const gone =\n        selected.type === \"annotation\"\n          ? hidden.has(\"measures\") || kinds.has(annotation?.kind ?? \"\")\n          : hidden.has(SELECTED_LAYER[selected.type]);\n      if (gone) {\n        core.select(null);\n        this.redraw();\n      }\n    },\n\n    scheduleOverheating() {\n      if (overheatingFrame !== null || this.mode !== \"overheating\") {\n        return;\n      }\n      overheatingFrame = window.requestAnimationFrame(() => {\n        overheatingFrame = null;\n        this.recomputeOverheating();\n        this.refreshOverlays();\n      });\n    },\n\n    recomputeOverheating() {\n      const context = this.overheatingContext;\n      if (!core || !context) {\n        return;\n      }\n      try {\n        this.overheating = designOverheating(\n          core.floors(),\n          this.fabricTypes,\n          context,\n          this.northDeg,\n        );\n        this.overheatingError = \"\";\n      } catch (error: unknown) {\n        this.overheating = null;\n        this.overheatingError =\n          error instanceof Error ? error.message : \"No Part O figure.\";\n      }\n    },\n\n    saveOverheating() {\n      const context = this.overheatingContext;\n      if (!context) {\n        return;\n      }\n      this.recomputeOverheating();\n      this.refreshOverlays();\n      patchOverheating(context.url, { ...context.settings })\n        .then((saved) => {\n          this.overheatingContext = saved;\n          this.recomputeOverheating();\n          this.refreshOverlays();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    overheatingRoom(id: string) {\n      return this.overheating?.rooms.find((room) => room.id === id) ?? null;\n    },\n\n    refreshOverlays() {\n      if (!renderer || !core) {\n        return;\n      }\n      // Wall clicks under an IWI/EWI line must reach the walls.\n      renderer.setAnnotationsClickable(\n        annotationsClickable(this.targetOption, this.mode),\n      );\n      const showPackage = this.mode === \"compare\" && scenarioView !== null;\n      let losses = this.roomLoss;\n      let highlights: Highlights = NO_HIGHLIGHTS;\n      if (showPackage && scenarioView && calcContext) {\n        const patches = scenarioView.patches();\n        try {\n          losses = this.heatLoadContext\n            ? designHeatLoad(\n                core.floors(),\n                this.fabricTypes,\n                scenarioView.explorer.prepared.derived(patches),\n                this.heatLoadContext,\n                calcContext.elements,\n              )\n            : null;\n        } catch {\n          losses = this.roomLoss;\n        }\n        highlights = packageHighlights(\n          core.floors(),\n          core.floor(),\n          this.fabricTypes,\n          scenarioView,\n        );\n      }\n      if (this.targetOption && this.mode === \"design\") {\n        highlights = this.targetHighlights();\n      }\n      const stepped = this.checks.find((check) => check.id === this.checkAt?.id)\n        ?.fix?.action;\n      if (\n        !showPackage &&\n        stepped?.kind === \"party\" &&\n        stepped.floor === this.currentFloorId\n      ) {\n        highlights = {\n          ...NO_HIGHLIGHTS,\n          walls: new Map(stepped.walls.map((id) => [id, COLORS.party])),\n        };\n      }\n      if (this.mode === \"overheating\") {\n        renderer.setHeat(overheatingFills(this.overheating));\n      } else if (showPackage || (this.mode === \"design\" && this.heatMap)) {\n        const fills = new Map<string, HeatFill>();\n        for (const room of losses?.rooms ?? []) {\n          fills.set(room.id, {\n            color: heatColor(room.wattsPerM2),\n            label: `${room.wattsPerM2 > IMPLAUSIBLE_W_PER_M2 ? \"\u26A0 \" : \"\"}${Math.round(room.wattsPerM2)} W/m\u00B2`,\n            dark: heatIsDark(room.wattsPerM2),\n          });\n        }\n        renderer.setHeat(fills);\n      } else {\n        renderer.setHeat(null);\n      }\n      renderer.setHighlights(highlights);\n      this.queue3d();\n    },\n\n    /** Redraw the 3D view once a frame, however many edits land in it. */\n    queue3d() {\n      if (!this.view3d || draw3dQueued) {\n        return;\n      }\n      draw3dQueued = true;\n      window.requestAnimationFrame(() => {\n        draw3dQueued = false;\n        this.draw3d();\n      });\n    },\n\n    toggle3d() {\n      this.view3d = !this.view3d;\n      if (!this.view3d || model3d) {\n        window.requestAnimationFrame(() => this.draw3d());\n        return;\n      }\n      const mount = this.$refs[\"model3d\"];\n      if (!(mount instanceof HTMLElement)) {\n        return;\n      }\n      loadModel3d(mount.dataset[\"src\"] ?? \"\")\n        .then((bundle) => {\n          model3d ??= bundle.create(mount, this.model3d, {\n            select: (floor, selection) => {\n              if (!core) {\n                return;\n              }\n              if (floor !== this.currentFloorId) {\n                this.setFloor(floor);\n              }\n              core.select(selection);\n              this.redraw();\n            },\n            setNorth: (degrees) => {\n              this.northDeg = degrees;\n              this.saveOrientation({ north_deg: degrees });\n              this.draw3d();\n            },\n          });\n          this.draw3d();\n        })\n        .catch((error: unknown) => {\n          this.model3d.failed =\n            error instanceof Error ? error.message : String(error);\n        });\n    },\n\n    act3d(action: Model3dAction, value?: unknown) {\n      model3d?.act(action, value);\n    },\n\n    /** The house in 3D, coloured by heat loss and what the package treats. */\n    draw3d() {\n      if (!core || !model3d || !this.view3d) {\n        return;\n      }\n      const floors = core.floors();\n      const patches = scenarioView?.patches() ?? [];\n      const heat = new Map<string, string>();\n      if (calcContext && this.heatLoadContext) {\n        try {\n          const elements = scenarioView\n            ? scenarioView.explorer.prepared.derived(patches)\n            : calcContext.elements;\n          const losses = designHeatLoad(\n            floors,\n            this.fabricTypes,\n            elements,\n            this.heatLoadContext,\n            calcContext.elements,\n          );\n          for (const room of losses.rooms) {\n            heat.set(room.id, heatColor(room.wattsPerM2));\n          }\n        } catch {\n          // Without a model the house still draws, uncoloured.\n        }\n      }\n      model3d.update({\n        floors,\n        types: this.fabricTypes,\n        heat,\n        treated: new Set(\n          patches.flatMap((patch) => Object.keys(patch.elements)),\n        ),\n        selection: { floor: core.floor().id, selection: core.selection },\n        northDeg: this.northDeg,\n        modelUrl: core.design.model_url,\n        fixtures: placedFromShown(this.shownFixtureList()),\n      });\n    },\n\n    openImporter() {\n      const url = core?.design.magicplan_url;\n      if (!url) {\n        return;\n      }\n      this.importer = { ...closedImporter(), open: true, loading: true };\n      fetchMagicplanPlans(url)\n        .then((plans) => {\n          this.importer.plans = plans;\n          this.importer.loading = false;\n          if (this.magicplanPlan) {\n            const imported = plans.find(\n              (plan) => plan.id === this.magicplanPlan,\n            );\n            if (imported) {\n              this.choosePlan(imported);\n            } else {\n              this.importer.error =\n                \"The plan this project imported is no longer in magicplan.\";\n            }\n            return;\n          }\n          const [first] = plans;\n          if (first?.match && plans.filter((plan) => plan.match).length === 1) {\n            this.choosePlan(first);\n          }\n        })\n        .catch((error: unknown) => {\n          this.importer.loading = false;\n          this.importer.error =\n            error instanceof Error ? error.message : \"magicplan didn't answer.\";\n        });\n    },\n\n    closeImporter() {\n      this.importer = closedImporter();\n    },\n\n    filteredPlans() {\n      const needle = this.importer.query.trim().toLowerCase();\n      if (!needle) {\n        return this.importer.plans;\n      }\n      return this.importer.plans.filter((plan) =>\n        [plan.name, plan.address, plan.postcode]\n          .join(\" \")\n          .toLowerCase()\n          .includes(needle),\n      );\n    },\n\n    choosePlan(plan: MagicplanPlan) {\n      const url = core?.design.magicplan_url;\n      if (!url) {\n        return;\n      }\n      this.importer.plan = plan;\n      this.importer.preview = null;\n      this.importer.error = \"\";\n      this.importer.loading = true;\n      fetchMagicplanPreview(`${url}${plan.id}/`)\n        .then((preview) => {\n          this.importer.preview = preview;\n          this.importer.floors = preview.floors\n            .filter((floor) => floor.rooms > 0)\n            .map((floor) => floor.uid);\n          this.importer.loading = false;\n        })\n        .catch((error: unknown) => {\n          this.importer.loading = false;\n          this.importer.error =\n            error instanceof Error ? error.message : \"The plan didn't load.\";\n        });\n    },\n\n    toggleImportFloor(uid: string) {\n      const floors = this.importer.floors;\n      this.importer.floors = floors.includes(uid)\n        ? floors.filter((floor) => floor !== uid)\n        : [...floors, uid];\n    },\n\n    runImport() {\n      const url = core?.design.import_magicplan_url;\n      const plan = this.importer.plan;\n      if (!(url && plan && this.importer.confirmed)) {\n        return;\n      }\n      this.importer.importing = true;\n      this.importer.error = \"\";\n      const drawing = this.emptyDesign || this.importer.replace;\n      const firstImport = !this.magicplanStatus;\n      postMagicplanImport(url, {\n        plan_id: plan.id,\n        floors: this.importer.floors,\n        replace: this.importer.replace,\n        confirmed: true,\n      })\n        .then(({ design, warnings }) => {\n          this.closeImporter();\n          this.start(design);\n          // After the empty state goes, so the fit sees the canvas's size.\n          window.requestAnimationFrame(() => this.zoomToFit());\n          if (calcContext || this.heatLossError) {\n            this.loadCalcContext(design.calc_context_url);\n          }\n          const rooms = design.floors.reduce(\n            (total, floor) => total + floor.scene.rooms.length,\n            0,\n          );\n          const drew = drawing && rooms > 0;\n          this.notice = [\n            drew\n              ? `Drew ${design.floors.length} floors and ${rooms} rooms from magicplan.`\n              : \"\",\n            ...warnings,\n            drew\n              ? \"magicplan can't tell a party wall: select any and tick Party wall.\"\n              : \"\",\n            firstImport\n              ? \"Its photos, videos and exports are copying into Documents > MagicPlan.\"\n              : \"\",\n          ]\n            .filter(Boolean)\n            .join(\" \");\n        })\n        .catch((error: unknown) => {\n          this.importer.importing = false;\n          this.importer.error =\n            error instanceof Error ? error.message : \"The import failed.\";\n          if (this.importer.error.includes(\"already been imported\")) {\n            this.magicplanStatus = this.importer.error;\n          }\n        });\n    },\n\n    loadScenarios() {\n      if (!core) {\n        return;\n      }\n      if (!calcContext) {\n        this.scenario.status = \"error\";\n        this.scenario.error =\n          this.heatLossError ||\n          \"Scenarios need the live model: draw the rooms first.\";\n        return;\n      }\n      if (!scenarioContext) {\n        if (this.scenario.status === \"loading\") {\n          return;\n        }\n        this.scenario.status = \"loading\";\n        const token = ++scenarioFetch;\n        fetchScenarioContext(core.design.scenario_context_url)\n          .then((loaded) => {\n            if (token !== scenarioFetch) {\n              return;\n            }\n            scenarioContext = loaded;\n            scenarioSignature = \"\";\n            this.loadScenarios();\n          })\n          .catch((error: unknown) => {\n            if (token !== scenarioFetch) {\n              return;\n            }\n            this.scenario.status = \"error\";\n            this.scenario.error =\n              error instanceof Error ? error.message : \"No options to compare.\";\n            this.placeQueuedPackage();\n          });\n        return;\n      }\n      // Rebuild when the plan has changed since the last search.\n      const floors = core.floors();\n      const signature = planSignature(floors, this.fabricTypes);\n      if (signature === scenarioSignature && scenarioView) {\n        // Built while another tab was open: search on arriving.\n        if (\n          this.mode === \"compare\" &&\n          !scenarioView.packages &&\n          this.scenario.status !== \"searching\"\n        ) {\n          this.runSearch();\n        }\n        return;\n      }\n      if (rebuildTimer !== null) {\n        window.clearTimeout(rebuildTimer);\n      }\n      const context = scenarioContext;\n      const calc = calcContext;\n      rebuildTimer = window.setTimeout(\n        () => {\n          rebuildTimer = null;\n          const previous = scenarioView;\n          searchToken += 1;\n          try {\n            scenarioView = new ScenarioView(\n              calc,\n              context,\n              floors.map((floor) => floor.scene),\n              floors.map((floor) => floor.ceiling_height_mm),\n              this.fabricTypes,\n              scenarioView,\n              this.roomLoss\n                ? peakModel(this.roomLoss, this.fabricTypes, calc.elements)\n                : null,\n              floors.map((floor) => floor.id),\n            );\n            if (!previous && core) {\n              const kept = loadScenarioSettings(core.design.id);\n              if (kept) {\n                scenarioView.restore(kept);\n              }\n            }\n            scenarioView.setSite((scenario) => this.heatPumpSite(scenario));\n            siteKey = this.siteKey();\n            if (scheduleRows) {\n              scenarioView.setKindCosts(scheduleRows);\n            } else if (core?.design.schedule_url) {\n              fetchSchedule(core.design.schedule_url)\n                .then((schedule) => {\n                  applySchedule(schedule.rows);\n                  this.showScenario();\n                })\n                .catch((error: unknown) => this.fail(error));\n            }\n            scenarioView.fit();\n            scenarioSignature = signature;\n          } catch (error: unknown) {\n            this.scenario.status = \"error\";\n            this.scenario.error =\n              error instanceof Error\n                ? error.message\n                : \"The plan can't be modelled.\";\n            this.placeQueuedPackage();\n            return;\n          }\n          this.baseOutcome = scenarioView.outcomeView(\n            scenarioView.explorer.base,\n          );\n          this.grantsOn = scenarioView.explorer.grants;\n          // The scenario open starts from its own picks, once.\n          const open = packages.find((row) => row.id === this.scenarioId);\n          if (!previous && open) {\n            scenarioView.showIds(open.options);\n          }\n          this.showScenario();\n          this.placeQueuedPackage();\n          if (this.mode === \"compare\") {\n            this.runSearch();\n          } else {\n            this.scenario.status = \"built\";\n          }\n        },\n        scenarioView ? 400 : 0,\n      );\n    },\n\n    runSearch() {\n      const view = scenarioView;\n      if (!view) {\n        return;\n      }\n      const token = ++searchToken;\n      const size = view.size();\n      this.scenario.size = size;\n      if (size > MAX_PACKAGES) {\n        this.scenario.status = \"error\";\n        this.scenario.error = `${size.toLocaleString(\"en-GB\")} packages is too many to score; switch some options off.`;\n        return;\n      }\n      this.scenario.status = \"searching\";\n      this.scenario.error = \"\";\n      this.scenario.progress = 0;\n      view\n        .search(\n          (done, total) => {\n            if (token === searchToken) {\n              this.scenario.progress = Math.round((done / total) * 100);\n            }\n          },\n          () => token !== searchToken,\n        )\n        .then((finished) => {\n          if (!finished || token !== searchToken) {\n            return;\n          }\n          this.scenario.status = \"ready\";\n          this.scenario.count = view.packages?.count ?? 0;\n          this.showScenario();\n        });\n    },\n\n    showScenario() {\n      const view = scenarioView;\n      if (!view) {\n        return;\n      }\n      const open = packages.find((row) => row.id === this.scenarioId);\n      // The scenario open is scored on its own targets; Compare's search isn't.\n      view.aim(\n        this.mode === \"design\" && open ? (open.targets ?? {}) : null,\n        open ?? null,\n      );\n      const outcome = view.outcome();\n      this.outcome = view.outcomeView(outcome);\n      this.picks = view.picks();\n      this.refreshTargets();\n      this.scenarioGroups = view.groupsView();\n      this.scenario.leftOut = view\n        .leftOut()\n        .map((option) => option.label)\n        .join(\", \");\n      this.scenario.more = view.moreSize();\n      this.refreshSaved();\n      this.refreshUndrawn();\n      this.scenario.metric = view.metric;\n      const canvas = this.$refs[\"chart\"];\n      if (canvas instanceof HTMLCanvasElement) {\n        if (!chart) {\n          chart = new ScatterChart(\n            canvas,\n            (index) => {\n              scenarioView?.showPackage(index);\n              this.showScenario();\n            },\n            (index, x, y) => {\n              const packages = scenarioView?.packages;\n              if (index === null || !packages || !scenarioView) {\n                this.chartTip.show = false;\n                return;\n              }\n              const choice = scenarioView.explorer.choiceOf(packages, index);\n              const picks = scenarioView.explorer\n                .picked(choice)\n                .map((option) => option.label);\n              // Placed net of grants, and shown before them like every cost.\n              const net = packages.cost[index] ?? 0;\n              const grant = scenarioView.explorer\n                .grantsIn(choice)\n                .reduce((sum, each) => sum + each.amount, 0);\n              const cost = grant\n                ? `${formatPounds(net + grant)}, ${formatPounds(net)} after grant`\n                : formatPounds(net);\n              this.chartTip = {\n                show: true,\n                x,\n                y,\n                title: `${cost} \u00B7 SAP ${sapScore(packages.sap[index] ?? 0)}`,\n                lines: picks.length > 0 ? picks : [\"Nothing done\"],\n              };\n            },\n          );\n        }\n        chart.setData(view.packages, view.metric, view.front);\n        chart.setMarkers(\n          packages.map((saved, index) => {\n            const outcome = view.explorer.evaluate(\n              view.choiceOf(saved.options),\n            );\n            return {\n              cost: outcome.cost ?? 0,\n              value: outcome[view.metric],\n              label: letterFor(saved, index),\n              recommended: saved.recommended,\n            };\n          }),\n        );\n        chart.setSelected(\n          outcome.cost === null\n            ? null\n            : { cost: outcome.cost, value: outcome[view.metric] },\n        );\n      }\n      this.refreshOverlays();\n    },\n\n    /**\n     * Picking an option in the scenario open is putting it on the plan; the\n     * figures it keeps are worked out once the measures are drawn.\n     */\n    pickOption(group: number, option: number) {\n      const view = scenarioView;\n      if (!view) {\n        return;\n      }\n      const target = this.scenarioId;\n      const before = pickedOf(view);\n      view.pick(group, option);\n      this.showScenario();\n      if (!this.staff || this.mode !== \"design\" || target === null) {\n        this.keepScenarioOptions();\n        return;\n      }\n      // Worked out now, so a second click queues behind the first.\n      const { added, dropped } = pickChange(before, pickedOf(view));\n      this.handDrawn = null;\n      this.placeSerially(async () => {\n        await this.dropOptions(dropped, target);\n        await this.placeOptions(added, target);\n      }).then(() => this.keepScenarioOptions());\n    },\n\n    armFixture(kind: FixtureKind) {\n      this.fixtureKind = kind;\n      this.setTool(\"fixture\");\n    },\n\n    selectFixture(key: string | null) {\n      this.assessing = false;\n      this.fixtureKey = key ?? \"\";\n      this.refreshFixtureEdit();\n      this.drawFixtures();\n    },\n\n    /** From House: its floor, in the Fixtures tool, ready to edit. */\n    openFixture(key: string) {\n      const found = this.shownFixtureList().find((shown) => shown.key === key);\n      if (!found) {\n        return;\n      }\n      if (found.floor !== this.currentFloorId) {\n        this.setFloor(found.floor);\n      }\n      this.setTool(\"fixture\");\n      this.selectFixture(key);\n    },\n\n    /** The fixtures to show: the baseline's, and a scenario's changes to them. */\n    shownFixtureList() {\n      const open =\n        this.scenarioId === null\n          ? null\n          : (packages.find((row) => row.id === this.scenarioId) ?? null);\n      return shownFixtures(core?.floors() ?? [], open);\n    },\n\n    drawFixtures() {\n      if (!renderer || !core) {\n        return;\n      }\n      const scene = core.floor().scene;\n      const here = this.shownFixtureList().filter(\n        (shown) => shown.floor === this.currentFloorId,\n      );\n      this.houseKit =\n        this.scenarioId === null ? kitRows(this.shownFixtureList()) : [];\n      this.legend = {\n        existing: here.some((shown) => shown.state !== \"proposed\"),\n        proposed:\n          here.some((shown) => shown.state === \"proposed\") ||\n          core\n            .floor()\n            .annotations.some(\n              (note) => !note.deleted && inScope(note, this.scenarioId),\n            ),\n      };\n      renderer.setFixtures(\n        this.shownFixtureList()\n          .filter((shown) => shown.floor === this.currentFloorId)\n          .flatMap((shown) => {\n            const at = fixturePoint(scene, shown.fixture);\n            return at\n              ? [\n                  {\n                    key: shown.key,\n                    kind: shown.fixture.kind,\n                    at,\n                    name: FIXTURE_KINDS[shown.fixture.kind],\n                    state: shown.state,\n                    selected: shown.key === this.fixtureKey,\n                    ...this.fixtureOverlay(shown),\n                  },\n                ]\n              : [];\n          }),\n      );\n      this.queue3d();\n    },\n\n    refreshFixtureEdit() {\n      const found = this.shownFixtureList().find(\n        (shown) => shown.key === this.fixtureKey,\n      );\n      if (!found) {\n        this.fixtureKey = \"\";\n        this.fixtureEdit = null;\n        return;\n      }\n      const { fixture, state } = found;\n      // A scenario can take away what's there, not change it.\n      const editable = state === \"proposed\" || this.scenarioId === null;\n      this.fixtureEdit = {\n        name: FIXTURE_KINDS[fixture.kind],\n        state,\n        editable,\n        notes: this.fixtureNotes(found),\n        unit:\n          fixture.kind === \"heat_pump\" &&\n          modelById(fixture.props?.[\"model\"]) !== null,\n        assessed: assessmentPoint(fixture) !== null,\n        // The battery is a baseline's: a scenario adds one as its own option.\n        fields: (PROP_FIELDS[fixture.kind] ?? [])\n          .filter(\n            (field) => field.key !== \"battery_kwh\" || this.scenarioId === null,\n          )\n          .map((field) => ({\n            key: field.key,\n            label: field.unit ? `${field.label} (${field.unit})` : field.label,\n            options: field.options ?? [],\n            numeric: field.numeric,\n            value: String(fixture.props?.[field.key] ?? field.start),\n          })),\n      };\n    },\n\n    addFixture(fixture: Fixture) {\n      const floor = this.currentFloorId;\n      if (!core || floor === null) {\n        return;\n      }\n      if (this.scenarioId !== null) {\n        const saved = packages.find((row) => row.id === this.scenarioId);\n        if (!saved || !this.staff) {\n          return;\n        }\n        saved.fixtures = changedFixtures(saved.fixtures, {\n          add: (add) => [...add, { ...fixture, floor }],\n        });\n      } else {\n        core.commit((scene) => {\n          scene.fixtures = [...(scene.fixtures ?? []), fixture];\n        });\n      }\n      this.fixtureKey = `${floor}:${fixture.id}`;\n      this.refreshFixtureEdit();\n      if (this.scenarioId !== null) {\n        this.scenarioEdited();\n      }\n    },\n\n    setFixtureField(key: string, value: string) {\n      const found = this.shownFixtureList().find(\n        (shown) => shown.key === this.fixtureKey,\n      );\n      if (!core || !found || !this.fixtureEdit?.editable) {\n        return;\n      }\n      const field = (PROP_FIELDS[found.fixture.kind] ?? []).find(\n        (candidate) => candidate.key === key,\n      );\n      const typed = field?.numeric ? Number(value) : value;\n      if (typeof typed === \"number\" && !Number.isFinite(typed)) {\n        return;\n      }\n      const set = (fixture: Fixture): Fixture => {\n        const props = { ...fixture.props };\n        if (typed === \"\") {\n          delete props[key];\n        } else {\n          props[key] = typed;\n        }\n        const model = key === \"model\" ? modelById(typed) : null;\n        if (model) {\n          props[\"capacity_kw\"] = model.kw;\n        }\n        return { ...fixture, props };\n      };\n      if (this.scenarioId !== null) {\n        const saved = packages.find((row) => row.id === this.scenarioId);\n        if (!saved) {\n          return;\n        }\n        saved.fixtures = changedFixtures(saved.fixtures, {\n          add: (add) =>\n            add.map((added) =>\n              `${added.floor}:${added.id}` === this.fixtureKey\n                ? { ...set(added), floor: added.floor }\n                : added,\n            ),\n        });\n        this.refreshFixtureEdit();\n        this.scenarioEdited();\n        return;\n      }\n      core.commit((scene) => {\n        scene.fixtures = (scene.fixtures ?? []).map((fixture) =>\n          `${found.floor}:${fixture.id}` === this.fixtureKey\n            ? set(fixture)\n            : fixture,\n        );\n      });\n      this.refreshFixtureEdit();\n    },\n\n    /** Notes for a fixture: a unit's sizing, clearance and noise; a cylinder's size. */\n    fixtureNotes(found: ShownFixture) {\n      const floors = core?.floors() ?? [];\n      const floor = floors.find((candidate) => candidate.id === found.floor);\n      if (!floor) {\n        return [];\n      }\n      const shown = this.shownFixtureList().filter(\n        (other) => other.state !== \"removed\",\n      );\n      const area = scenarioView?.explorer.rows([]).total_floor_area_4 ?? 0;\n      if (found.fixture.kind === \"cylinder\") {\n        return cylinderNotes(floor.scene, found.fixture, {\n          people: assumedOccupancy42(area),\n          fixtures: shown.map((other) => other.fixture),\n        });\n      }\n      if (found.fixture.kind !== \"heat_pump\") {\n        return [];\n      }\n      return this.fixtureReport(found)?.notes ?? [];\n    },\n\n    fixtureReport(found: ShownFixture) {\n      const floors = core?.floors() ?? [];\n      const floor = floors.find((candidate) => candidate.id === found.floor);\n      if (!floor) {\n        return null;\n      }\n      const shown = this.shownFixtureList().filter(\n        (other) => other.state !== \"removed\",\n      );\n      // The heat load of the scenario open, the one the package is scored on.\n      const needed = this.outcome ? neededKw(this.outcome.peakKw) : null;\n      return unitReport(\n        floor.scene,\n        found,\n        shown,\n        (id, fixture) => {\n          const at = floors.find((candidate) => candidate.id === id);\n          return at ? fixturePoint(at.scene, fixture) : null;\n        },\n        needed,\n        FIXTURE_KINDS,\n      );\n    },\n\n    /** A unit's footprint, zone and noise position, drawn with it. */\n    fixtureOverlay(shown: ShownFixture): Partial<DrawnFixture> {\n      if (shown.fixture.kind !== \"heat_pump\" || shown.state === \"removed\") {\n        return {};\n      }\n      const found = this.fixtureReport(shown);\n      if (!found) {\n        return {};\n      }\n      const warned = found.notes.some(\n        (note) => note.tone === \"warn\" && note.text.includes(\"zone\"),\n      );\n      return {\n        shape: found.shape,\n        warned,\n        ...(found.assessAt\n          ? {\n              assess: {\n                at: found.assessAt,\n                label: found.noise ? `${found.noise.level} dB(A)` : \"\",\n                passes: found.noise?.passes ?? true,\n              },\n            }\n          : {}),\n      };\n    },\n\n    armAssess() {\n      this.assessing = true;\n    },\n\n    dropAssess(point: Point) {\n      this.assessing = false;\n      this.setFixtureProps({\n        assess_x: Math.round(point[0]),\n        assess_y: Math.round(point[1]),\n      });\n    },\n\n    clearAssess() {\n      this.assessing = false;\n      this.setFixtureProps({ assess_x: null, assess_y: null });\n    },\n\n    /** Set (or with null, clear) props on the selected fixture, wherever it lives. */\n    setFixtureProps(values: Record<string, number | null>) {\n      const apply = (fixture: Fixture): Fixture => {\n        const props = { ...fixture.props };\n        for (const [key, value] of Object.entries(values)) {\n          if (value === null) {\n            delete props[key];\n          } else {\n            props[key] = value;\n          }\n        }\n        return { ...fixture, props };\n      };\n      const found = this.shownFixtureList().find(\n        (shown) => shown.key === this.fixtureKey,\n      );\n      if (!core || !found || !this.fixtureEdit?.editable) {\n        return;\n      }\n      if (this.scenarioId !== null) {\n        const saved = packages.find((row) => row.id === this.scenarioId);\n        if (!saved) {\n          return;\n        }\n        saved.fixtures = changedFixtures(saved.fixtures, {\n          add: (add) =>\n            add.map((added) =>\n              `${added.floor}:${added.id}` === this.fixtureKey\n                ? { ...apply(added), floor: added.floor }\n                : added,\n            ),\n        });\n        this.refreshFixtureEdit();\n        this.scenarioEdited();\n        return;\n      }\n      core.commit((scene) => {\n        scene.fixtures = (scene.fixtures ?? []).map((fixture) =>\n          `${found.floor}:${fixture.id}` === this.fixtureKey\n            ? apply(fixture)\n            : fixture,\n        );\n      });\n      this.refreshFixtureEdit();\n    },\n\n    /** Delete it, or in a scenario take away what's there now. */\n    removeFixture() {\n      const found = this.shownFixtureList().find(\n        (shown) => shown.key === this.fixtureKey,\n      );\n      if (!core || !found) {\n        return;\n      }\n      if (this.scenarioId === null) {\n        core.commit((scene) => {\n          scene.fixtures = (scene.fixtures ?? []).filter(\n            (fixture) => `${found.floor}:${fixture.id}` !== found.key,\n          );\n        });\n        this.selectFixture(null);\n        return;\n      }\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      if (!saved || !this.staff) {\n        return;\n      }\n      saved.fixtures = changedFixtures(\n        saved.fixtures,\n        found.state === \"proposed\"\n          ? {\n              add: (add) =>\n                add.filter(\n                  (added) => `${added.floor}:${added.id}` !== found.key,\n                ),\n            }\n          : { remove: (remove) => [...remove, found.key] },\n      );\n      if (found.state === \"proposed\") {\n        this.fixtureKey = \"\";\n      }\n      this.refreshFixtureEdit();\n      this.scenarioEdited();\n    },\n\n    restoreFixture() {\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      if (!saved || !this.staff) {\n        return;\n      }\n      saved.fixtures = changedFixtures(saved.fixtures, {\n        remove: (remove) => remove.filter((key) => key !== this.fixtureKey),\n      });\n      this.refreshFixtureEdit();\n      this.scenarioEdited();\n    },\n\n    refreshTargets() {\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      if (!core || !scenarioView || !saved || !this.staff) {\n        this.targetRows = [];\n        this.pillsChanged();\n        return;\n      }\n      const floors = core.floors();\n      this.targetRows = targetRows(\n        scenarioView,\n        saved.targets ?? {},\n        describe(floors, this.fabricTypes, this.northDeg),\n        roomNames(floors),\n      );\n      if (!this.targetRows.some((row) => row.id === this.targetOption)) {\n        this.targetOption = \"\";\n      }\n      this.pillsChanged();\n    },\n\n    /** The pills are rebuilt (a scenario changed): a set one of them picked,\n     * or hovered, that is no longer among them goes, and the chips follow. */\n    pillsChanged() {\n      if (!core) {\n        return;\n      }\n      if (this.pillOn && !this.targetRows.some((r) => r.id === this.pillOn)) {\n        this.pillOn = \"\";\n        core.select(null);\n        return;\n      }\n      core.previewItems(null);\n      this.syncMulti();\n    },\n\n    chooseTargets(option: string, key: string) {\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      const candidates = targetCandidates(option);\n      if (!core || !saved || candidates.length === 0) {\n        return;\n      }\n      const floors = core.floors();\n      const group = groupsFor(\n        candidates,\n        describe(floors, this.fabricTypes, this.northDeg),\n        roomNames(floors),\n      ).find((found) => found.key === key);\n      if (group) {\n        const before = saved.targets?.[option];\n        saved.targets = setTargets(\n          saved.targets ?? {},\n          option,\n          candidates,\n          group.ids,\n        );\n        this.targetOption = option;\n        this.targetMenu = \"\";\n        this.scenarioEdited();\n        this.redrawOption(option, { at: before });\n      }\n    },\n\n    /** What the option being edited covers on this floor, and what it leaves. */\n    targetHighlights(): Highlights {\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      const row = this.targetRows.find(\n        (found) => found.id === this.targetOption,\n      );\n      const candidates = targetCandidates(this.targetOption);\n      const floorId = this.currentFloorId;\n      const floor = core?.floor();\n      if (!saved || !row || !floor || floorId === null) {\n        return NO_HIGHLIGHTS;\n      }\n      const covered = new Set(saved.targets?.[this.targetOption] ?? candidates);\n      const out = {\n        walls: new Map<string, string>(),\n        openings: new Map<string, string>(),\n        rooms: new Map<string, string>(),\n        dim: {\n          walls: new Set<string>(),\n          openings: new Set<string>(),\n          rooms: new Set<string>(),\n        },\n      };\n      const walls = new Set(floor.scene.walls.map((wall) => wall.id));\n      const openings = new Set(floor.scene.openings.map((o) => o.id));\n      for (const qualified of candidates) {\n        const [pk, id = \"\"] = qualified.split(\":\");\n        if (Number(pk) !== floorId) {\n          continue;\n        }\n        const kind = walls.has(id)\n          ? \"walls\"\n          : openings.has(id)\n            ? \"openings\"\n            : \"rooms\";\n        if (covered.has(qualified)) {\n          out[kind].set(id, row.color);\n        } else {\n          out.dim[kind].add(id);\n        }\n      }\n      return out;\n    },\n\n    editTargets(option: string) {\n      // Clicked on and off the plan: its marks follow once it's done.\n      if (this.targetOption && retargeted.has(this.targetOption)) {\n        const was = retargeted.get(this.targetOption);\n        retargeted.delete(this.targetOption);\n        this.redrawOption(this.targetOption, { at: was });\n      }\n      this.targetOption = this.targetOption === option ? \"\" : option;\n      this.targetMenu = \"\";\n      this.refreshOverlays();\n    },\n\n    targetClick(event: Event) {\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      const target = event.target;\n      const id =\n        target instanceof Element\n          ? target.closest(\"[data-id]\")?.getAttribute(\"data-id\")\n          : null;\n      if (!saved || !id || this.currentFloorId === null) {\n        return;\n      }\n      const option = this.targetOption;\n      const candidates = targetCandidates(option);\n      const qualified = `${this.currentFloorId}:${id}`;\n      if (candidates.includes(qualified)) {\n        const before = saved.targets?.[option];\n        saved.targets = toggled(\n          saved.targets ?? {},\n          option,\n          candidates,\n          qualified,\n        );\n        if (!retargeted.has(option)) {\n          retargeted.set(option, before);\n        }\n        this.scenarioEdited();\n      }\n    },\n\n    /** Show a change to the open scenario's targets now, and save it soon. */\n    scenarioEdited() {\n      this.showScenario();\n      this.refreshOverlays();\n      this.drawFixtures();\n      targetWrite.schedule();\n    },\n\n    /** In Design, the picks are the open scenario's: keep them (staff only). */\n    keepScenarioOptions() {\n      if (!this.staff || this.mode !== \"design\" || this.scenarioId === null) {\n        return;\n      }\n      const saved = packages.find((row) => row.id === this.scenarioId);\n      const view = scenarioView;\n      const calc = calcContext;\n      if (!saved || !view || !calc) {\n        return;\n      }\n      const options = [...view.ids()];\n      saved.options = options;\n      phasePending += 1;\n      const sources = this.figureSources(view, calc);\n      const sentTargets = saved.targets;\n      const sentFixtures = saved.fixtures;\n      phaseWrites = phaseWrites\n        .then(() =>\n          freshness.fresh((seen) =>\n            packageFigures(sources, {\n              id: saved.id,\n              options,\n              phases: saved.phases,\n              letter: letterFor(saved, packages.indexOf(saved)),\n              targets: sentTargets,\n              fixtures: sentFixtures,\n            }).then(({ phases, figures }) =>\n              patchPackage(saved.url, {\n                options,\n                phases,\n                figures: { ...figures, design_updated: seen },\n                ...(sentTargets ? { targets: sentTargets } : {}),\n                ...(sentFixtures ? { fixtures: sentFixtures } : {}),\n              }),\n            ),\n          ),\n        )\n        .then((updated) => {\n          // A click since this write went out is newer than its answer.\n          const { targets, fixtures, ...rest } = updated;\n          Object.assign(saved, rest);\n          if (saved.targets === sentTargets) {\n            saved.targets = targets;\n          }\n          if (saved.fixtures === sentFixtures) {\n            saved.fixtures = fixtures;\n            this.refreshFixtureEdit();\n            this.drawFixtures();\n          }\n          if (updated.dropped?.length) {\n            this.notice = `Left out ${updated.dropped.length} element${updated.dropped.length === 1 ? \"\" : \"s\"} the plan no longer has.`;\n            this.refreshTargets();\n          }\n        })\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          phasePending -= 1;\n          this.refreshSaved();\n        });\n    },\n\n    toggleOption(id: string) {\n      if (!core || !scenarioView) {\n        return;\n      }\n      scenarioView.toggleEnabled(id);\n      saveScenarioSettings(core.design.id, scenarioView);\n      this.showScenario();\n      this.runSearch();\n    },\n\n    searchMore() {\n      if (!core || !scenarioView) {\n        return;\n      }\n      scenarioView.searchMore();\n      saveScenarioSettings(core.design.id, scenarioView);\n      this.showScenario();\n      this.runSearch();\n    },\n\n    setOptionRate(id: string, value: string) {\n      if (!core || !scenarioView) {\n        return;\n      }\n      scenarioView.setRate(id, value);\n      saveScenarioSettings(core.design.id, scenarioView);\n      this.showScenario();\n      this.runSearch();\n    },\n\n    setMetric(metric: Metric) {\n      scenarioView?.setMetric(metric);\n      this.showScenario();\n    },\n\n    clearPackage() {\n      scenarioView?.clear();\n      this.showScenario();\n      this.keepScenarioOptions();\n    },\n\n    refreshSaved() {\n      const view = scenarioView;\n      if (!view) {\n        this.saved = [];\n        this.phasing = null;\n        return;\n      }\n      const showing = [...view.ids()].sort().join();\n      this.saved = packages.map((saved, index) => {\n        const choice = view.choiceOf(saved.options);\n        const outcome = view.explorer.evaluate(choice);\n        const keptSap = Number(saved.figures[\"sap\"]);\n        return {\n          id: saved.id,\n          name: saved.name,\n          letter: letterFor(saved, index),\n          recommended: saved.recommended,\n          current: [...view.ids(choice)].sort().join() === showing,\n          picks: view.explorer.picked(choice).map((option) => option.label),\n          figures: view.outcomeView(outcome, choice),\n          drifted:\n            Number.isFinite(keptSap) && Math.abs(keptSap - outcome.sap) >= 0.5,\n        };\n      });\n      this.refreshPhasing();\n    },\n\n    /**\n     * Keep the combination previewed as a scenario on this baseline and open\n     * it in Design, where its measures are drawn on the plan.\n     */\n    createScenario() {\n      const view = scenarioView;\n      const design = core?.design;\n      if (\n        !design ||\n        !calcContext ||\n        !view ||\n        view.ids().length === 0 ||\n        this.creating\n      ) {\n        return;\n      }\n      const letter = nextLetter(\n        packages.map((row) => row.name),\n        packages.map(letterFor),\n      );\n      const options = view.ids();\n      const sources = this.figureSources(view, calcContext);\n      this.creating = true;\n      freshness\n        .fresh((seen) =>\n          packageFigures(sources, { options, phases: [], letter }).then(\n            ({ figures }) =>\n              createPackage(design.packages_url, {\n                design: design.id,\n                name: `Scenario ${letter}`,\n                options,\n                phases: [],\n                figures: { ...figures, design_updated: seen },\n                recommended: packages.length === 0,\n              }),\n          ),\n        )\n        .then((saved) => {\n          packages.push(saved);\n          const url = new URL(window.location.href);\n          url.searchParams.set(\"scenario\", String(saved.id));\n          url.searchParams.delete(\"mode\");\n          window.location.assign(url.toString());\n        })\n        .catch((error: unknown) => {\n          this.creating = false;\n          this.fail(error);\n        });\n    },\n\n    /** A scenario's star, name or delete, asked for in Compare's table. */\n    scenarioAction(detail: {\n      action: \"recommend\" | \"rename\" | \"delete\";\n      id: number;\n    }) {\n      const saved = packages.find((candidate) => candidate.id === detail.id);\n      if (!saved) {\n        return;\n      }\n      if (detail.action === \"recommend\") {\n        this.recommendSaved(saved.id);\n      } else if (detail.action === \"delete\") {\n        this.deleteSaved(saved.id);\n      } else {\n        const name = window.prompt(\"Rename the scenario\", saved.name);\n        if (name) {\n          this.renameSaved(saved.id, name);\n        }\n      }\n    },\n\n    figureSources(view: ScenarioView, calc: CalcContext): FigureSources {\n      return {\n        view,\n        floors: core?.floors() ?? [],\n        types: this.fabricTypes,\n        heatLoad: this.heatLoadContext,\n        baseElements: calc.elements,\n        palette,\n        scheduleUrl: core?.design.schedule_url ?? \"\",\n        overheating: this.overheatingContext,\n        northDeg: this.northDeg,\n        existingUrl: existingDesignUrl,\n      };\n    },\n\n    refreshPhasing() {\n      const view = scenarioView;\n      // Phases are the open scenario's: its measures in the order they're done.\n      const saved =\n        packages.find((candidate) => candidate.id === this.scenarioId) ??\n        packages.find((candidate) => candidate.id === this.phasingId) ??\n        packages.find((candidate) => candidate.recommended) ??\n        packages[0];\n      if (!view || !saved) {\n        this.phasing = null;\n        return;\n      }\n      const packaged = packagedKinds(view.explorer, saved.options);\n      const phases = phasesOf(saved.phases, packaged);\n      const kept = keptPhases(saved.figures, phases.length);\n      const taken = new Set(phases.flatMap((phase) => phase.kinds));\n      const entry = (kind: string) =>\n        palette.find((candidate) => candidate.kind === kind);\n      // Fresh keys every time, so no row shows the last arrangement.\n      phasingGeneration += 1;\n      this.phasing = {\n        id: saved.id,\n        phases: phases.map((phase, index) => {\n          const figures = kept[index];\n          return {\n            key: `${phasingGeneration}:${index}`,\n            name: phase.name,\n            label: phase.name || `Phase ${index + 1}`,\n            figures: figures ? phaseLine(figures) : \"\",\n            kinds: phase.kinds.map((kind) => ({\n              kind,\n              name:\n                entry(kind)?.name ??\n                scheduleRows?.find((row) => row.kind === kind)?.name ??\n                kind,\n              color: entry(kind)?.color ?? \"#94a3b8\",\n              option: packaged.includes(kind),\n            })),\n          };\n        }),\n        extras: [\n          ...palette\n            .filter((candidate) => !taken.has(candidate.kind))\n            .map((candidate) => ({\n              kind: candidate.kind,\n              name: candidate.name,\n            })),\n          // Work typed into the schedule, such as scaffolding: never drawn.\n          ...(scheduleRows ?? [])\n            .filter((row) => !taken.has(row.kind) && !entry(row.kind))\n            .map((row) => ({ kind: row.kind, name: row.name })),\n        ],\n        kept: keptLine(\n          saved.figures,\n          this.saved.find((option) => option.id === saved.id)?.drifted ?? false,\n        ),\n        busy: phasePending > 0,\n      };\n    },\n\n    changePhases(change) {\n      const view = scenarioView;\n      const saved = packages.find(\n        (candidate) => candidate.id === this.phasing?.id,\n      );\n      if (!view || !saved) {\n        return;\n      }\n      const packaged = packagedKinds(view.explorer, saved.options);\n      this.keepPhases(saved.id, change(saved.phases, packaged));\n    },\n\n    /** Show the new phases now, then keep them with their figures. */\n    keepPhases(id: number, phases: Phase[]) {\n      const saved = packages.find((candidate) => candidate.id === id);\n      const view = scenarioView;\n      const calc = calcContext;\n      if (!saved || !view || !calc) {\n        return;\n      }\n      const before = saved.phases;\n      saved.phases = phases;\n      phasePending += 1;\n      this.refreshPhasing();\n      const sources = this.figureSources(view, calc);\n      phaseWrites = phaseWrites\n        .then(() =>\n          freshness.fresh((seen) =>\n            packageFigures(sources, {\n              id: saved.id,\n              options: saved.options,\n              phases: saved.phases,\n              letter: letterFor(saved, packages.indexOf(saved)),\n              targets: saved.targets,\n              fixtures: saved.fixtures,\n            }).then(({ phases: tidied, figures }) =>\n              patchPackage(saved.url, {\n                phases: tidied,\n                figures: { ...figures, design_updated: seen },\n              }),\n            ),\n          ),\n        )\n        .then((updated) => {\n          Object.assign(saved, updated);\n        })\n        .catch((error: unknown) => {\n          saved.phases = before;\n          this.fail(error);\n        })\n        .finally(() => {\n          phasePending -= 1;\n          this.refreshSaved();\n        });\n    },\n\n    addPhase() {\n      this.changePhases(phaseOps.added);\n    },\n\n    renamePhase(index: number, name: string) {\n      this.changePhases((phases, packaged) =>\n        phaseOps.renamed(phases, packaged, index, name),\n      );\n    },\n\n    movePhase(index: number, delta: number) {\n      this.changePhases((phases, packaged) =>\n        phaseOps.moved(phases, packaged, index, delta),\n      );\n    },\n\n    removePhase(index: number) {\n      this.changePhases((phases, packaged) =>\n        phaseOps.removed(phases, packaged, index),\n      );\n    },\n\n    moveKind(kind: string, index: number) {\n      this.changePhases((phases, packaged) =>\n        phaseOps.placed(phases, packaged, kind, index),\n      );\n    },\n\n    /** A kind with no option (scaffolding, say) joins the last phase. */\n    addPhaseKind(kind: string) {\n      const design = core?.design;\n      if (!design || !kind || !this.phasing) {\n        return;\n      }\n      const last = this.phasing.phases.length - 1;\n      const drawn = core\n        ?.floors()\n        .some((floor) => floor.annotations.some((a) => a.kind === kind));\n      // On the schedule, where its cost is typed, before a phase holds it.\n      (drawn\n        ? Promise.resolve()\n        : postScheduleMeasure(design.schedule_measure_url, { kind })\n      )\n        .then(() =>\n          this.changePhases((phases, packaged) =>\n            phaseOps.placed(phases, packaged, kind, last),\n          ),\n        )\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    dropPhaseKind(kind: string) {\n      this.changePhases((phases, packaged) =>\n        phaseOps.without(phases, packaged, kind),\n      );\n    },\n\n    refreshFigures() {\n      const saved = packages.find(\n        (candidate) => candidate.id === this.phasing?.id,\n      );\n      if (saved) {\n        this.keepPhases(saved.id, saved.phases);\n      }\n    },\n\n    renameSaved(id: number, name: string) {\n      const saved = packages.find((candidate) => candidate.id === id);\n      if (!saved || !name.trim()) {\n        return;\n      }\n      patchPackage(saved.url, { name: name.trim() })\n        .then((updated) => {\n          Object.assign(saved, updated);\n          this.refreshSaved();\n          sayRenamed();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    recommendSaved(id: number) {\n      const saved = packages.find((candidate) => candidate.id === id);\n      if (!saved) {\n        return;\n      }\n      patchPackage(saved.url, { recommended: !saved.recommended })\n        .then((updated) => {\n          for (const candidate of packages) {\n            candidate.recommended =\n              candidate.id === updated.id ? updated.recommended : false;\n          }\n          this.showScenario();\n          sayRenamed();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    deleteSaved(id: number) {\n      const saved = packages.find((candidate) => candidate.id === id);\n      if (!saved || !window.confirm(`Delete ${saved.name}?`)) {\n        return;\n      }\n      deletePackage(saved.url)\n        .then(() => {\n          packages = packages.filter((candidate) => candidate.id !== id);\n          // Its measures on the plan go with it.\n          for (const floor of core?.floors() ?? []) {\n            floor.annotations = floor.annotations.filter(\n              (annotation) => annotation.package !== id,\n            );\n          }\n          if (id === this.scenarioId) {\n            const url = new URL(window.location.href);\n            url.searchParams.delete(\"scenario\");\n            window.location.assign(url.toString());\n            return;\n          }\n          window.dispatchEvent(\n            new CustomEvent(\"scenario-removed\", { detail: { id } }),\n          );\n          this.redraw();\n          this.showScenario();\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    setBrush(kind: \"fabric\" | \"party\", value: number | boolean) {\n      brush =\n        kind === \"fabric\"\n          ? { kind, id: Number(value) }\n          : { kind, on: Boolean(value) };\n      this.brushName =\n        kind === \"fabric\"\n          ? `fabric:${Number(value)}`\n          : value\n            ? \"party:on\"\n            : \"party:off\";\n      this.setTool(\"brush\");\n    },\n\n    /** The brush on every outside wall of the floor in view, in one undo. */\n    brushFloor() {\n      const chosen = brush;\n      if (!core || !chosen) {\n        return;\n      }\n      core.commit((scene) => {\n        const kinds = wallKinds(scene);\n        for (const wall of scene.walls) {\n          if (kinds.get(wall.id) !== \"INTERNAL\") {\n            paint(scene, wall, chosen);\n          }\n        }\n      });\n    },\n\n    setGrants(on: boolean) {\n      if (!core || !scenarioView) {\n        return;\n      }\n      scenarioView.setGrants(on);\n      this.grantsOn = on;\n      saveScenarioSettings(core.design.id, scenarioView);\n      this.showScenario();\n      this.runSearch();\n    },\n\n    async addAnnotations(entries, pkg) {\n      if (!core) {\n        return 0;\n      }\n      const into = pkg === undefined ? this.scenarioId : pkg;\n      if (into === null) {\n        this.notice = NO_BASELINE_MEASURES;\n        return 0;\n      }\n      const url = core.design.annotations_url;\n      let added = 0;\n      for (const entry of entries) {\n        this.showLayer(\"measures\", entry.kind);\n        const saved = await enqueueAnnotationWrite(() =>\n          createAnnotation(\n            url,\n            entry.floor.id,\n            entry.kind,\n            entry.geometry,\n            into,\n            entry.option,\n          ),\n        );\n        entry.floor.annotations.push(saved);\n        added += 1;\n      }\n      this.emptyDesign = blank(core.floors());\n      this.redraw();\n      this.scheduleInventory();\n      return added;\n    },\n\n    placeTarget() {\n      const view = scenarioView;\n      if (!view) {\n        return null;\n      }\n      const showing = [...view.ids()].sort().join();\n      const shows = (row: DesignPackage) =>\n        [...row.options].sort().join() === showing;\n      const open = packages.find((row) => row.id === this.scenarioId);\n      if (open && (this.mode === \"design\" || shows(open))) {\n        return open.id;\n      }\n      return packages.find(shows)?.id ?? null;\n    },\n\n    /**\n     * The explicit \"put it on the plan\": draw the options that aren't drawn\n     * yet. Only marks: an option's marks are priced as the option, and the\n     * schedule's rows (typed costs, the design-wide modelled savings every\n     * scenario shares) change only when someone edits them.\n     */\n    async placeSteps(target: number): Promise<{ annotations: number }> {\n      const view = scenarioView;\n      if (!core || !view) {\n        return { annotations: 0 };\n      }\n      return { annotations: await this.placeOptions(pickedOf(view), target) };\n    },\n\n    /** Where an option goes: what its scenario points it at, else its default. */\n    whereOption(\n      entry: PickedOption,\n      target: number,\n      aimed?: { at: readonly string[] | undefined },\n    ): Placement[] {\n      if (!core) {\n        return [];\n      }\n      const floors = core.floors();\n      const saved = packages.find((row) => row.id === target);\n      const at = aimed ? aimed.at : saved?.targets?.[entry.option.id];\n      if (at && !COUNTED_OPTIONS.has(entry.option.id)) {\n        return targetPlacements(at, floors);\n      }\n      return placements(\n        entry.group,\n        floors.map((floor) => floor.scene),\n        this.fabricTypes,\n        entry.slot,\n      );\n    },\n\n    /**\n     * Draw options on a scenario's plan, each one that has no marks there\n     * yet. Only marks: the schedule's rows aren't touched.\n     */\n    async placeOptions(entries: readonly PickedOption[], target: number) {\n      if (!core) {\n        return 0;\n      }\n      const floors = core.floors();\n      const todo = new Set(undrawn(entries, marksIn(target)));\n      const adding: {\n        floor: Floor;\n        kind: string;\n        geometry: AnnotationGeometry;\n        option: string;\n      }[] = [];\n      for (const entry of todo) {\n        for (const placement of this.whereOption(entry, target)) {\n          const floor = floors[placement.floor];\n          if (floor) {\n            adding.push({\n              floor,\n              kind: entry.option.kind,\n              geometry: placement.geometry,\n              option: entry.option.id,\n            });\n          }\n        }\n      }\n      return this.addAnnotations(adding, target);\n    },\n\n    /**\n     * Take dropped options' own marks off the plan. Marks drawn by hand of a\n     * measure no option still picks stay, and staff are asked about them.\n     */\n    async dropOptions(dropped: readonly ScenarioOption[], target: number) {\n      if (!core || dropped.length === 0) {\n        return;\n      }\n      const { own, hand, kinds } = dropping(\n        dropped,\n        scenarioView ? pickedOf(scenarioView) : [],\n        marksIn(target),\n      );\n      await this.removeMarks(own);\n      this.handDrawn =\n        hand.length > 0\n          ? {\n              count: hand.length,\n              label: dropped\n                .filter((option) => kinds.includes(option.kind))\n                .map((option) => option.label)\n                .join(\", \"),\n              kinds,\n              target,\n            }\n          : null;\n    },\n\n    removeHandDrawn() {\n      const asked = this.handDrawn;\n      this.handDrawn = null;\n      if (!asked) {\n        return;\n      }\n      const kinds = new Set(asked.kinds);\n      const ids = new Set(\n        (scenarioView ? pickedOf(scenarioView) : []).map(\n          (entry) => entry.option.id,\n        ),\n      );\n      const gone = marksIn(asked.target).filter(\n        (mark) => isByHand(mark, ids) && kinds.has(mark.kind),\n      );\n      this.placeSerially(() => this.removeMarks(gone)).then(() => {\n        this.notice = `Removed ${gone.length} mark${gone.length === 1 ? \"\" : \"s\"} you drew. Undo (Ctrl+Z) on ${gone.length === 1 ? \"its floor\" : \"each floor\"} puts them back.`;\n      });\n    },\n\n    async removeMarks(gone: readonly Annotation[]) {\n      if (!core) {\n        return;\n      }\n      const going = new Set(gone.filter((mark) => mark.id > 0));\n      if (going.size === 0) {\n        return;\n      }\n      const shown = core.floor().id;\n      for (const floor of core.floors()) {\n        if (!floor.annotations.some((mark) => going.has(mark))) {\n          continue;\n        }\n        // One undo entry on each floor it changes, as onEveryFloor does.\n        core.setFloor(floor.id);\n        core.pushHistory();\n        floor.annotations = floor.annotations.filter(\n          (mark) => !going.has(mark),\n        );\n      }\n      core.setFloor(shown);\n      this.redraw();\n      for (const mark of going) {\n        await enqueueAnnotationWrite(() =>\n          patchAnnotation(mark.url, { deleted: true }),\n        );\n      }\n      this.scheduleInventory();\n    },\n\n    redrawOption(\n      optionId: string,\n      was?: { at: readonly string[] | undefined },\n    ) {\n      const view = scenarioView;\n      const target = this.scenarioId;\n      const entry = view\n        ? pickedOf(view).find((found) => found.option.id === optionId)\n        : undefined;\n      if (!entry || target === null || !this.staff) {\n        return;\n      }\n      this.placeSerially(async () => {\n        const own = marksIn(target).filter((mark) => mark.option === optionId);\n        // One never drawn waits for Draw them.\n        if (own.length === 0) {\n          return;\n        }\n        // Redrawing puts back what the targets say: ask before it replaces a\n        // mark someone moved or reshaped since it was drawn.\n        const drawn = new Set(\n          this.whereOption(entry, target, was).map((placement) =>\n            JSON.stringify(placement.geometry),\n          ),\n        );\n        const edited = own.filter(\n          (mark) => !drawn.has(JSON.stringify(mark.geometry)),\n        );\n        if (\n          edited.length > 0 &&\n          !window.confirm(\n            `${edited.length} of this option's marks were moved or reshaped by hand. Redraw them from its targets and lose those edits?`,\n          )\n        ) {\n          return;\n        }\n        await this.removeMarks(own);\n        await this.placeOptions([entry], target);\n      });\n    },\n\n    placeSerially(work: () => Promise<unknown>) {\n      placingCount += 1;\n      this.scenario.placing = true;\n      const run = placing\n        .then(work)\n        .then(() => undefined)\n        .catch((error: unknown) => this.fail(error))\n        .finally(() => {\n          placingCount -= 1;\n          this.scenario.placing = placingCount > 0;\n          this.refreshUndrawn();\n        });\n      placing = run;\n      return run;\n    },\n\n    refreshUndrawn() {\n      const view = scenarioView;\n      const target = this.scenarioId;\n      if (\n        !core ||\n        !view ||\n        target === null ||\n        !this.staff ||\n        this.mode !== \"design\"\n      ) {\n        this.undrawn = [];\n        return;\n      }\n      // An option with nowhere to go on this plan isn't counted.\n      this.undrawn = undrawn(pickedOf(view), marksIn(target))\n        .filter((entry) => this.whereOption(entry, target).length > 0)\n        .map((entry) => entry.option.label);\n    },\n\n    drawUndrawn() {\n      const view = scenarioView;\n      const target = this.scenarioId;\n      if (!core || !view || target === null || this.undrawn.length === 0) {\n        return;\n      }\n      this.placeSerially(async () => {\n        const added = await this.placeOptions(pickedOf(view), target);\n        this.notice = `Drew ${added} mark${added === 1 ? \"\" : \"s\"} on the plan.`;\n      }).then(() => this.keepScenarioOptions());\n    },\n\n    applyPackage() {\n      const view = scenarioView;\n      if (!core || !view || this.scenario.applying) {\n        return;\n      }\n      const steps = view.explorer.increments(view.choice);\n      if (steps.length === 0) {\n        this.notice = \"Nothing in this scenario can go on the plan.\";\n        placementEnded(false);\n        return;\n      }\n      const confirmed = window.confirm(\n        `Put these ${steps.length} measures on the plan? The design is snapshotted first.`,\n      );\n      if (!confirmed) {\n        placementEnded(false);\n        return;\n      }\n      const target = this.placeTarget();\n      if (target === null) {\n        this.notice =\n          \"Create a scenario from these options first: its measures go on the plan in it.\";\n        placementEnded(false);\n        return;\n      }\n      this.scenario.applying = true;\n      postSnapshot(core.design.snapshot_url, \"Before applying a scenario\")\n        .then(() => this.placeSteps(target))\n        .then((placed) => {\n          this.scenario.applying = false;\n          const name =\n            packages.find((row) => row.id === target)?.name ?? \"the scenario\";\n          this.notice = `Added ${placed.annotations} annotations to ${name}.`;\n          if (target === this.scenarioId) {\n            this.setMode(\"design\");\n            this.setTab(\"measures\");\n          } else {\n            this.notice += \" Open it from the menu at the top to see them.\";\n          }\n          placementEnded(true);\n        })\n        .catch((error: unknown) => {\n          this.scenario.applying = false;\n          this.fail(error);\n          placementEnded(false);\n        });\n    },\n\n    placePackage() {\n      const saved =\n        packages.find((candidate) => candidate.recommended) ?? packages[0];\n      this.setMode(\"compare\");\n      if (!saved) {\n        this.notice =\n          \"Keep a package here first, then put it on the plan for the drawings.\";\n        placementEnded(false);\n        return;\n      }\n      placeQueued = saved.options;\n      this.placeQueuedPackage();\n    },\n\n    placeQueuedPackage() {\n      if (!placeQueued) {\n        return;\n      }\n      if (!scenarioView || rebuildTimer !== null) {\n        // Waiting for the scenarios, unless they failed to build.\n        if (this.scenario.status === \"error\") {\n          placeQueued = null;\n          placementEnded(false);\n        }\n        return;\n      }\n      scenarioView.showIds(placeQueued);\n      placeQueued = null;\n      this.showScenario();\n      this.applyPackage();\n    },\n\n    scheduleInventory() {\n      if (!this.folds[\"measures\"] && !this.scheduleOpen) {\n        return;\n      }\n      if (inventoryTimer !== null) {\n        window.clearTimeout(inventoryTimer);\n      }\n      inventoryTimer = window.setTimeout(() => {\n        inventoryTimer = null;\n        this.refreshInventory();\n      }, 500);\n    },\n\n    scopeScheduleUrl() {\n      const url = core?.design.schedule_url ?? \"\";\n      return url && this.scenarioId !== null\n        ? `${url}?package=${this.scenarioId}`\n        : url;\n    },\n\n    refreshInventory() {\n      const url = this.scopeScheduleUrl();\n      if (!url) {\n        return;\n      }\n      fetchSchedule(url)\n        .then((schedule) => {\n          // The search prices from the baseline's schedule; a scenario's\n          // own is read into its figures (packageFigures).\n          if (this.scenarioId === null) {\n            applySchedule(schedule.rows);\n          }\n          this.inventory = schedule.rows.map((row) => {\n            const entry = palette.find(\n              (candidate) => candidate.kind === row.kind,\n            );\n            const quantity = [\n              row.count > 1 ? `${row.count}\u00D7` : null,\n              row.length_m ? `${row.length_m} m` : null,\n              row.area_m2 ? `${row.area_m2} m\u00B2` : null,\n            ]\n              .filter(Boolean)\n              .join(\" \u00B7 \");\n            return {\n              kind: row.kind,\n              name: row.name,\n              figure: entry?.figure ?? null,\n              color: entry?.color ?? \"#7c3aed\",\n              quantity: quantity || \"1\",\n              cost: row.cost ? pounds(row.cost) : \"\u2014\",\n            };\n          });\n          if (this.scheduleOpen) {\n            this.schedule = editableSchedule(schedule);\n          }\n        })\n        .catch((error: unknown) => this.fail(error));\n    },\n\n    selectKind(kind: string) {\n      if (!core) {\n        return;\n      }\n      const all = core\n        .floors()\n        .flatMap((floor) =>\n          floor.annotations\n            .filter(\n              (annotation) =>\n                annotation.kind === kind &&\n                annotation.id > 0 &&\n                inScope(annotation, this.scenarioId),\n            )\n            .map((annotation) => ({ floor, annotation })),\n        );\n      if (all.length === 0) {\n        return;\n      }\n      const next = ((inventoryCursor.get(kind) ?? -1) + 1) % all.length;\n      inventoryCursor.set(kind, next);\n      const target = all[next];\n      if (!target) {\n        return;\n      }\n      if (target.floor.id !== this.currentFloorId) {\n        this.setFloor(target.floor.id);\n      }\n      core.select({ type: \"annotation\", id: `a_${target.annotation.id}` });\n      this.redraw();\n    },\n\n    quickMeasures() {\n      const selection = this.selection;\n      if (!selection || selection.type === \"annotation\") {\n        return [];\n      }\n      const fits: Record<string, string[]> = {\n        wall: [\n          \"EXTERNAL_WALL_INSULATION_EWI\",\n          \"INTERNAL_WALL_INSULATION_IWI\",\n          \"CAVITY_WALL_INSULATION_CWI\",\n        ],\n        room: [\n          \"LOFT_INSULATION\",\n          \"SUSPENDED_FLOOR_INSULATION\",\n          \"SOLID_FLOOR_INSULATION\",\n          \"ROOM_IN_ROOF_INSULATION\",\n          \"FLAT_ROOF_INSULATION\",\n        ],\n        window: [\n          \"WINDOWS\",\n          \"SECONDARY_GLAZING\",\n          \"FENESTRATION_DRAUGHT_PROOFING\",\n        ],\n        door: [\"SINGLE_DOORS\", \"BIFOLD_AND_ARCHITECTURAL_DOORS\"],\n      };\n      const key =\n        selection.type === \"opening\"\n          ? selection.openingType === \"window\"\n            ? \"window\"\n            : \"door\"\n          : selection.type;\n      const wanted = fits[key] ?? [];\n      return palette\n        .filter((entry) => wanted.includes(entry.kind))\n        .map((entry) => ({\n          kind: entry.kind,\n          name: entry.name,\n          color: entry.color,\n        }));\n    },\n\n    quickAdd(kind: string) {\n      const selection = this.selection;\n      if (!core || !selection) {\n        return;\n      }\n      const floor = core.floor();\n      let geometry: AnnotationGeometry | null = null;\n      if (selection.type === \"wall\") {\n        geometry = alongWall(floor.scene, selection.id);\n      } else if (selection.type === \"room\") {\n        geometry = overRoom(floor.scene, selection.id);\n      } else if (selection.type === \"opening\") {\n        geometry = atOpening(floor.scene, selection.id);\n      }\n      if (!geometry) {\n        return;\n      }\n      this.addAnnotations([{ floor, kind, geometry }]).catch((error: unknown) =>\n        this.fail(error),\n      );\n    },\n\n    dragMeasure(event: DragEvent, kind: string) {\n      dragKind = kind;\n      event.dataTransfer?.setData(\"text/plain\", kind);\n      if (event.dataTransfer) {\n        event.dataTransfer.effectAllowed = \"copy\";\n      }\n    },\n\n    dragOverCanvas(event: DragEvent) {\n      if (!dragKind || !core || !renderer) {\n        return;\n      }\n      event.preventDefault();\n      const geometries = dropped(\n        core.scene(),\n        this.fabricTypes,\n        dragKind,\n        this.worldPoint(renderer.svg, event),\n        this.currentWorldPerPixel(),\n        event.shiftKey,\n      );\n      renderer.setPreview(\n        renderOverlay(dropPreview(geometries), this.currentWorldPerPixel()),\n      );\n      this.hint = geometries.length\n        ? `Drop to add ${geometries.length === 1 ? \"it here\" : `${geometries.length}`}; hold Shift for every one like it.`\n        : \"Drop it on what it goes on: a wall, room, window or door.\";\n    },\n\n    dropOnCanvas(event: DragEvent) {\n      const kind = dragKind;\n      if (!kind || !core || !renderer) {\n        return;\n      }\n      event.preventDefault();\n      const floor = core.floor();\n      const geometries = dropped(\n        floor.scene,\n        this.fabricTypes,\n        kind,\n        this.worldPoint(renderer.svg, event),\n        this.currentWorldPerPixel(),\n        event.shiftKey,\n      );\n      this.endDrag();\n      if (geometries.length === 0) {\n        this.fail(\n          new Error(\n            \"Drop it on what it goes on: a wall, room, window or door.\",\n          ),\n        );\n        return;\n      }\n      this.addAnnotations(\n        geometries.map((geometry) => ({ floor, kind, geometry })),\n      ).catch((error: unknown) => this.fail(error));\n    },\n\n    endDrag() {\n      dragKind = \"\";\n      renderer?.setPreview([]);\n      this.hint = activeTool.hint;\n    },\n\n    worldPoint(svg: SVGSVGElement, event: MouseEvent): Point {\n      if (!view) {\n        return [0, 0];\n      }\n      return turnPoint(\n        screenToWorld(view, screenRect(svg), event.clientX, event.clientY),\n        -this.planRotation,\n      );\n    },\n\n    bindPointer(svg: SVGSVGElement) {\n      const wheel = new WheelReader();\n      const touch = new TouchGesture();\n      const held = new HeldTouch<PointerEvent>();\n      let holding = 0;\n      const press = (event: PointerEvent) => {\n        if (core && this.targetOption && this.mode === \"design\") {\n          this.targetClick(event);\n          return;\n        }\n        if (core) {\n          toolPointerDown = true;\n          activeTool.down(\n            this.worldPoint(svg, event),\n            event,\n            this.toolContext(),\n          );\n        }\n      };\n      const release = () => {\n        window.clearTimeout(holding);\n        const event = held.take();\n        if (event) {\n          press(event);\n        }\n      };\n      svg.addEventListener(\n        \"wheel\",\n        (event: WheelEvent) => {\n          if (!view) {\n            return;\n          }\n          event.preventDefault();\n          const intent = wheel.read(event);\n          view =\n            intent.kind === \"zoom\"\n              ? zoomAt(\n                  view,\n                  screenRect(svg),\n                  event.clientX,\n                  event.clientY,\n                  intent.factor,\n                )\n              : panBy(view, screenRect(svg), intent.dx, intent.dy);\n          this.applyView();\n        },\n        { passive: false },\n      );\n\n      svg.addEventListener(\"pointerdown\", (event: PointerEvent) => {\n        svg.setPointerCapture(event.pointerId);\n        this.compassOpen = false;\n        if (event.pointerType === \"touch\") {\n          touch.down(event.pointerId, event.clientX, event.clientY);\n          // A second finger turns a stroke just begun into a pan or pinch.\n          if (touch.active) {\n            window.clearTimeout(holding);\n            held.drop();\n            if (toolPointerDown) {\n              toolPointerDown = false;\n              activeTool.cancel(this.toolContext());\n            }\n            return;\n          }\n          if (event.button === 0 && core) {\n            held.hold(event.pointerId, event.clientX, event.clientY, event);\n            holding = window.setTimeout(release, TOUCH_HOLD_MS);\n            return;\n          }\n        }\n        // Middle button or held space pans from any tool.\n        if (event.button === 1 || spaceHeld) {\n          panning = {\n            pointerId: event.pointerId,\n            lastX: event.clientX,\n            lastY: event.clientY,\n          };\n          return;\n        }\n        if (event.button !== 0 || !core) {\n          return;\n        }\n        press(event);\n      });\n\n      svg.addEventListener(\"pointermove\", (event: PointerEvent) => {\n        if (touch.active && view) {\n          const step = touch.move(\n            event.pointerId,\n            event.clientX,\n            event.clientY,\n          );\n          if (step) {\n            const rect = screenRect(svg);\n            view = zoomAt(\n              panBy(view, rect, step.dx, step.dy),\n              rect,\n              step.x,\n              step.y,\n              step.factor,\n            );\n            this.applyView();\n          }\n          return;\n        }\n        if (event.pointerType === \"touch\") {\n          touch.move(event.pointerId, event.clientX, event.clientY);\n          if (held.holds(event.pointerId)) {\n            // Pressed where the finger landed, not where it's got to.\n            const landed = held.moved(\n              event.pointerId,\n              event.clientX,\n              event.clientY,\n            );\n            if (!landed) {\n              return;\n            }\n            window.clearTimeout(holding);\n            press(landed);\n          }\n        }\n        if (panning && panning.pointerId === event.pointerId && view) {\n          view = panBy(\n            view,\n            screenRect(svg),\n            event.clientX - panning.lastX,\n            event.clientY - panning.lastY,\n          );\n          panning.lastX = event.clientX;\n          panning.lastY = event.clientY;\n          this.applyView();\n          return;\n        }\n        if (!core) {\n          return;\n        }\n        activeTool.move(this.worldPoint(svg, event), event, this.toolContext());\n        const over =\n          this.tool === \"select\" && !toolPointerDown ? event.target : null;\n        const described = hover.at(over, core.scene());\n        if (described !== null) {\n          this.hovered = described;\n        }\n      });\n      svg.addEventListener(\"pointerleave\", () => {\n        if (core) {\n          this.hovered = hover.at(null, core.scene()) ?? this.hovered;\n        }\n      });\n\n      const finish = (event: PointerEvent) => {\n        const pinching = touch.active;\n        touch.up(event.pointerId);\n        if (pinching) {\n          return;\n        }\n        // A tap: the press goes in before the lift.\n        if (held.holds(event.pointerId)) {\n          release();\n        }\n        if (panning?.pointerId === event.pointerId) {\n          panning = undefined;\n          return;\n        }\n        if (toolPointerDown && core) {\n          toolPointerDown = false;\n          activeTool.up(this.worldPoint(svg, event), event, this.toolContext());\n        }\n      };\n      svg.addEventListener(\"pointerup\", finish);\n      svg.addEventListener(\"pointercancel\", finish);\n\n      const finishTool = () => {\n        const ctx = this.toolContext();\n        if (activeTool.finish) {\n          activeTool.finish(ctx);\n        } else {\n          activeTool.cancel(ctx);\n        }\n      };\n      svg.addEventListener(\"dblclick\", finishTool);\n      svg.addEventListener(\"contextmenu\", (event: MouseEvent) => {\n        event.preventDefault();\n        finishTool();\n      });\n    },\n\n    bindKeyboard() {\n      onKeyDown = (event: KeyboardEvent) => {\n        // Saves itself anyway; this is for the habit, and not the page.\n        if (\n          (event.metaKey || event.ctrlKey) &&\n          event.key.toLowerCase() === \"s\"\n        ) {\n          event.preventDefault();\n          // A field saves on change, so let the one being typed in finish.\n          if (document.activeElement instanceof HTMLElement) {\n            document.activeElement.blur();\n          }\n          void core?.flush();\n          return;\n        }\n        if (isEditableTarget(event.target)) {\n          return;\n        }\n        if (event.key === \" \") {\n          spaceHeld = true;\n          event.preventDefault();\n          return;\n        }\n        if (event.key === \"Escape\") {\n          const idle = !activeTool.busy?.();\n          if (idle && core && core.multi.length > 0) {\n            core.select(null);\n            return;\n          }\n          activeTool.cancel(this.toolContext());\n          if (idle && this.tool === \"annotate\") {\n            this.dropMeasure();\n          }\n          return;\n        }\n        if (event.key === \"Enter\") {\n          const ctx = this.toolContext();\n          if (activeTool.finish) {\n            event.preventDefault();\n            activeTool.finish(ctx);\n          }\n          return;\n        }\n        if (\n          (event.metaKey || event.ctrlKey) &&\n          event.key.toLowerCase() === \"z\"\n        ) {\n          event.preventDefault();\n          if (event.shiftKey) {\n            this.redo();\n          } else {\n            this.undo();\n          }\n          return;\n        }\n        // Figma's: the browser's own page zoom would scale the toolbars too.\n        const zoom = zoomKey(event, !this.view3d);\n        if (zoom !== null) {\n          event.preventDefault();\n          if (zoom === \"fit\") {\n            this.zoomToFit();\n          } else {\n            this.zoomBy(zoom);\n          }\n          return;\n        }\n        if (event.key === \"Delete\" || event.key === \"Backspace\") {\n          event.preventDefault();\n          this.deleteSelected();\n          return;\n        }\n        const modes: Record<string, Mode> = {\n          \"1\": \"design\",\n          \"2\": \"compare\",\n          ...(SHOW_OVERHEATING ? { \"3\": \"overheating\" as Mode } : {}),\n        };\n        const mode = modes[event.key];\n        if (mode && !event.metaKey && !event.ctrlKey) {\n          this.setMode(mode);\n          return;\n        }\n        if (this.mode === \"compare\") {\n          return;\n        }\n        if (this.tool === \"floor\" && this.nudgeFloor(event)) {\n          event.preventDefault();\n          return;\n        }\n        // Ctrl B, Cmd W and the like are the browser's, not a tool's.\n        if (event.ctrlKey || event.metaKey || event.altKey) {\n          return;\n        }\n        if (event.key === \"v\" || event.key === \"V\") {\n          this.setTool(\"select\");\n        } else if (event.key === \"d\" || event.key === \"D\") {\n          this.setTool(\"opening\");\n        } else if (event.key === \"e\" || event.key === \"E\") {\n          this.setTool(\"emitter\");\n        } else if (event.key === \"r\" || event.key === \"R\") {\n          this.setTool(\"room\");\n        } else if (event.key === \"w\" || event.key === \"W\") {\n          this.setTool(\"wall\");\n        } else if (event.key === \"s\" || event.key === \"S\") {\n          this.setTool(\"split\");\n        } else if (event.key === \"x\" || event.key === \"X\") {\n          this.setTool(\"extend\");\n        } else if (event.key === \"a\" || event.key === \"A\") {\n          this.setTool(\"annotate\");\n        } else if (event.key === \"f\" || event.key === \"F\") {\n          this.setTool(\"fixture\");\n        } else if (event.key === \"b\" || event.key === \"B\") {\n          this.setTool(\"brush\");\n        } else if (event.key === \"t\" || event.key === \"T\") {\n          this.setTool(\"trace\");\n        } else if (event.key === \"h\" || event.key === \"H\") {\n          this.toggleMeasures();\n        } else if (this.tool === \"trace\" && event.key.startsWith(\"Arrow\")) {\n          event.preventDefault();\n          const step = event.shiftKey ? 10 : 1;\n          const [dx, dy] = {\n            ArrowLeft: [-step, 0],\n            ArrowRight: [step, 0],\n            ArrowUp: [0, -step],\n            ArrowDown: [0, step],\n          }[event.key] ?? [0, 0];\n          traces.nudge(dx ?? 0, dy ?? 0);\n        } else if (\n          (event.key === \"m\" || event.key === \"M\") &&\n          this.mode === \"design\"\n        ) {\n          this.setTool(\"floor\");\n        }\n      };\n      onKeyUp = (event: KeyboardEvent) => {\n        if (event.key === \" \") {\n          spaceHeld = false;\n        }\n      };\n      window.addEventListener(\"keydown\", onKeyDown);\n      window.addEventListener(\"keyup\", onKeyUp);\n    },\n  };\n};\n\nfunction screenRect(svg: SVGSVGElement): ScreenRect {\n  const rect = svg.getBoundingClientRect();\n  return {\n    width: Math.max(rect.width, 1),\n    height: Math.max(rect.height, 1),\n    left: rect.left,\n    top: rect.top,\n  };\n}\n\nasync function postSnapshot(url: string, note: string): Promise<void> {\n  const response = await fetch(url, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      \"X-CSRFToken\": getCookie(\"csrftoken\"),\n    },\n    body: JSON.stringify({ note }),\n  });\n  if (!response.ok) {\n    throw new Error(`Snapshotting the design failed (${response.status}).`);\n  }\n}\n\n// One colour for what a scenario treats: its fabric measures' chip colour,\n// and the same in 3D.\nconst HIGHLIGHT = {\n  wall: TREATED_COLOR,\n  window: TREATED_COLOR,\n  door: TREATED_COLOR,\n  floor: TREATED_COLOR,\n  roof: TREATED_COLOR,\n};\n\n/** What the package on show treats on the floor in view. */\nfunction packageHighlights(\n  floors: Floor[],\n  floor: Floor,\n  types: FabricType[],\n  view: ScenarioView,\n): Highlights {\n  const keys = new Set(\n    view.patches().flatMap((patch) => Object.keys(patch.elements)),\n  );\n  const highlights: Highlights = {\n    walls: new Map(),\n    openings: new Map(),\n    rooms: new Map(),\n  };\n  if (keys.size === 0) {\n    return highlights;\n  }\n  const resolved = resolveScene(floor.scene, types);\n  const windows = [...keys].some((key) => key.startsWith(\"window:\"));\n  const doors = [...keys].some((key) => key.startsWith(\"door:\"));\n  for (const wall of resolved.walls) {\n    if (!wall.inEnvelope) {\n      continue;\n    }\n    if (wall.kind === \"EXTERNAL\" && keys.has(wall.key)) {\n      highlights.walls.set(wall.id, HIGHLIGHT.wall);\n    }\n    for (const opening of resolved.openingsByWall.get(wall.id) ?? []) {\n      if (opening.type === \"window\" && windows) {\n        highlights.openings.set(opening.id, HIGHLIGHT.window);\n      } else if (opening.type === \"door\" && doors && wall.kind !== \"PARTY\") {\n        highlights.openings.set(opening.id, HIGHLIGHT.door);\n      }\n    }\n  }\n  const index = floors.indexOf(floor);\n  const heated = resolved.rooms.filter((room) => room.heated);\n  if (keys.has(\"ground-floor\") && index === 0) {\n    for (const room of heated) {\n      highlights.rooms.set(room.id, HIGHLIGHT.floor);\n    }\n  }\n  if (keys.has(\"roof\") && index === floors.length - 1) {\n    for (const room of heated) {\n      highlights.rooms.set(room.id, HIGHLIGHT.roof);\n    }\n  }\n  return highlights;\n}\n\n/** Room names by `<floor pk>:<room id>`, for choosing rooms. */\nfunction roomNames(floors: Floor[]): Map<string, string> {\n  return new Map(\n    floors.flatMap((floor) =>\n      floor.scene.rooms.map(\n        (room) => [`${floor.id}:${room.id}`, room.name || \"Room\"] as const,\n      ),\n    ),\n  );\n}\n\n/** Nothing drawn: what the magicplan import may replace without asking. */\nfunction blank(floors: Floor[]): boolean {\n  return floors.every(\n    (floor) =>\n      floor.scene.rooms.length === 0 &&\n      floor.scene.walls.length === 0 &&\n      floor.annotations.length === 0,\n  );\n}\n\nfunction letterOf(index: number): string {\n  return String.fromCharCode(65 + (index % 26));\n}\n\n/** The letter a kept package was given, so deleting one doesn't reletter the rest. */\nfunction letterFor(saved: DesignPackage, index: number): string {\n  const letter = saved.figures[\"letter\"];\n  return typeof letter === \"string\" && letter ? letter : letterOf(index);\n}\n\n/** The kept per-phase figures, when they match the phases on show. */\nfunction keptPhases(\n  figures: Record<string, unknown>,\n  count: number,\n): Figures[\"phases\"] {\n  const phases = figures[\"phases\"];\n  return figures[\"version\"] === FIGURES_VERSION &&\n    Array.isArray(phases) &&\n    phases.length === count\n    ? (phases as Figures[\"phases\"])\n    : [];\n}\n\nfunction keptLine(figures: Record<string, unknown>, drifted: boolean): string {\n  const computed = figures[\"computed\"];\n  if (figures[\"version\"] !== FIGURES_VERSION || typeof computed !== \"string\") {\n    return \"Not kept for the Build Pack yet.\";\n  }\n  const when = new Date(computed).toLocaleString(\"en-GB\", {\n    day: \"numeric\",\n    month: \"short\",\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n  });\n  return drifted\n    ? `Kept for the Build Pack ${when}; the plan has changed since.`\n    : `Kept for the Build Pack ${when}.`;\n}\n", "// The design tool's menu bar (templates/design/menubar.py): menus open on a\n// click, then follow the pointer across the bar, as a desktop app's do. The\n// arrow keys move through a menu and across the bar; Escape shuts it.\n\nimport { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  /** The menu open, by name, or \"\". */\n  open: string;\n  toggle(name: string): void;\n  hover(name: string): void;\n  close(focus?: boolean): void;\n  key(event: KeyboardEvent): void;\n}\n\n/** The enabled, shown items of a menu, in order. */\nfunction items(menu: Element | null): HTMLElement[] {\n  if (!menu) {\n    return [];\n  }\n  return [...menu.querySelectorAll<HTMLElement>(\"[role=menuitem]\")].filter(\n    (item) => item.offsetParent !== null && !item.hasAttribute(\"disabled\"),\n  );\n}\n\n/** One step through `count` things from `index`, wrapping round. */\nexport function step(index: number, count: number, by: 1 | -1): number {\n  if (count === 0) {\n    return -1;\n  }\n  return index < 0 ? (by === 1 ? 0 : count - 1) : (index + by + count) % count;\n}\n\nexport default (): AlpineComponent<State> => ({\n  open: \"\",\n\n  toggle(name) {\n    this.open = this.open === name ? \"\" : name;\n  },\n\n  hover(name) {\n    if (this.open && this.open !== name) {\n      this.open = name;\n    }\n  },\n\n  close(focus = false) {\n    const was = this.open;\n    this.open = \"\";\n    if (focus && was) {\n      this.$root\n        .querySelector<HTMLElement>(`[data-menu=\"${was}\"] > button`)\n        ?.focus();\n    }\n  },\n\n  key(event) {\n    const names = [\n      ...this.$root.querySelectorAll<HTMLElement>(\"[data-menu]\"),\n    ].map((menu) => menu.dataset[\"menu\"] ?? \"\");\n    const here = (event.target as Element | null)?.closest<HTMLElement>(\n      \"[data-menu]\",\n    );\n    const name = here?.dataset[\"menu\"] ?? \"\";\n    const shift = (by: 1 | -1) => {\n      const next = names[step(names.indexOf(name), names.length, by)] ?? \"\";\n      this.open = next;\n      this.$nextTick(() => {\n        const menu = this.$root.querySelector(`[data-menu=\"${next}\"]`);\n        items(menu)[0]?.focus();\n      });\n    };\n    const move = (by: 1 | -1) => {\n      this.open = this.open || name;\n      this.$nextTick(() => {\n        const list = items(this.$root.querySelector(`[data-menu=\"${name}\"]`));\n        const at = list.indexOf(document.activeElement as HTMLElement);\n        list[step(at, list.length, by)]?.focus();\n      });\n    };\n    const target = event.target as HTMLElement | null;\n    if (!this.open) {\n      // Closed, the bar leaves every key to the editor but ArrowDown on a button.\n      if (\n        event.key === \"ArrowDown\" &&\n        name &&\n        target?.closest(\"[data-menu] > button\")\n      ) {\n        move(1);\n        event.preventDefault();\n        event.stopPropagation();\n      }\n      return;\n    }\n    if (\n      (event.key === \"Enter\" || event.key === \" \") &&\n      target?.matches(\"[role=menuitem]\")\n    ) {\n      target.click();\n      event.preventDefault();\n      event.stopPropagation();\n      return;\n    }\n    switch (event.key) {\n      case \"Escape\":\n        this.close(true);\n        break;\n      case \"ArrowDown\":\n        move(1);\n        break;\n      case \"ArrowUp\":\n        move(-1);\n        break;\n      case \"ArrowRight\":\n        shift(1);\n        break;\n      case \"ArrowLeft\":\n        shift(-1);\n        break;\n      default:\n        break;\n    }\n    // Open, the menu has every key: tool letters, Space-pan and Enter-finish\n    // don't fire behind it.\n    event.stopPropagation();\n    if (event.key.startsWith(\"Arrow\") || event.key === \"Escape\") {\n      event.preventDefault();\n    }\n  },\n});\n", "// The Statistics drawer under the plan (templates/design/stats.py): the heat\n// loss room by room as bars, worst first, and the whole house's figures. It\n// opens and shuts per browser.\n\nimport { AlpineComponent } from \"alpinejs\";\nimport type { HeatLoad } from \"../heatload/engine\";\nimport { loadFlag, saveFlag } from \"./panes\";\nimport { SIZING_MARGIN } from \"./scenarios\";\n\nconst OPEN_KEY = \"design.stats\";\n\n/** Below this window height the drawer starts folded. */\nconst TALL = 860;\n\nexport interface Bar {\n  id: string;\n  name: string;\n  /** The floor, as initials: \"GF\". */\n  floor: string;\n  watts: string;\n  perM2: string;\n  /** Of the worst room's watts, 0 to 100. */\n  width: number;\n  color: string;\n}\n\nexport interface Tiles {\n  loadKw: string;\n  pumpKw: string;\n  worst: { name: string; perM2: string } | null;\n}\n\n/** \"Ground floor\" \u2192 \"GF\". */\nexport function initials(name: string): string {\n  return name\n    .split(/\\s+/)\n    .filter(Boolean)\n    .map((word) => word[0]?.toUpperCase() ?? \"\")\n    .join(\"\");\n}\n\n/** The colour of the band `perM2` falls in, as the heat map has them. */\nexport function bandColor(\n  perM2: number,\n  legend: readonly { color: string; label: string }[],\n): string {\n  let color = legend[0]?.color ?? \"#fdba74\";\n  for (const stop of legend) {\n    if (perM2 >= Number.parseFloat(stop.label)) {\n      color = stop.color;\n    }\n  }\n  return color;\n}\n\nexport function bars(\n  loss: HeatLoad | null,\n  legend: readonly { color: string; label: string }[],\n): Bar[] {\n  if (!loss) {\n    return [];\n  }\n  const rooms = [...loss.rooms].sort((a, b) => b.designW - a.designW);\n  const most = Math.max(rooms[0]?.designW ?? 0, 1);\n  return rooms.map((room) => {\n    const perM2 = room.areaM2 > 0 ? room.designW / room.areaM2 : 0;\n    return {\n      id: room.id,\n      name: room.name,\n      floor: initials(room.floor),\n      watts: `${Math.round(room.designW).toLocaleString(\"en-GB\")} W`,\n      perM2: String(Math.round(perM2)),\n      width: (room.designW / most) * 100,\n      color: bandColor(perM2, legend),\n    };\n  });\n}\n\nexport function tiles(loss: HeatLoad | null): Tiles | null {\n  if (!loss) {\n    return null;\n  }\n  let worst: Tiles[\"worst\"] = null;\n  let most = -1;\n  // A sliver of a room under a square metre isn't the worst room.\n  for (const room of loss.rooms.filter((each) => each.areaM2 >= 1)) {\n    const perM2 = room.designW / room.areaM2;\n    if (perM2 > most) {\n      most = perM2;\n      worst = { name: room.name, perM2: String(Math.round(perM2)) };\n    }\n  }\n  const watts = loss.totals.generatorW;\n  return {\n    loadKw: (watts / 1000).toFixed(2),\n    pumpKw: ((watts * SIZING_MARGIN) / 1000).toFixed(1),\n    worst,\n  };\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  statsOpen: boolean;\n  toggleStats(): void;\n  bars: typeof bars;\n  tiles: typeof tiles;\n}\n\nexport default (): AlpineComponent<State> => ({\n  // A short window keeps its height for the plan until the user opens it.\n  statsOpen: loadFlag(OPEN_KEY, window.innerHeight >= TALL),\n\n  toggleStats() {\n    this.statsOpen = !this.statsOpen;\n    saveFlag(OPEN_KEY, this.statsOpen);\n  },\n\n  bars,\n  tiles,\n});\n", "// Every baseline's figures side by side, as deltas from the house as it is,\n// the way Revit's schedules compare design options.\n\nimport { AlpineComponent } from \"alpinejs\";\nimport { fetchCalcContext, fetchDesign } from \"./api\";\nimport { roomAreaMm2 } from \"./features\";\nimport { designHeatLoad } from \"./heatload\";\nimport { type CalcContext, heatLoss } from \"./heatloss\";\nimport type { Design, FabricType, Floor, HeatLoadContext } from \"./scene\";\n\nexport interface Figures {\n  /** m\u00B2 of heated rooms. */\n  area: number;\n  /** W/K. */\n  loss: number;\n  /** W/m\u00B2K. */\n  hlp: number;\n  sap: number;\n  /** kWh a year. */\n  heating: number;\n  /** kW, room by room; null without design conditions. */\n  peak: number | null;\n}\n\nexport function figuresOf(\n  floors: readonly Floor[],\n  types: readonly FabricType[],\n  context: CalcContext,\n  conditions: HeatLoadContext | null,\n): Figures {\n  const scenes = floors.map((floor) => floor.scene);\n  const computed = heatLoss(\n    context,\n    scenes,\n    floors.map((floor) => floor.ceiling_height_mm),\n    types,\n  );\n  const area = scenes.reduce(\n    (total, scene) =>\n      total +\n      scene.rooms\n        .filter((room) => room.heated !== false)\n        .reduce((sum, room) => sum + roomAreaMm2(scene, room), 0),\n    0,\n  );\n  let peak: number | null = null;\n  if (conditions) {\n    try {\n      peak =\n        designHeatLoad(floors, types, context.elements, conditions).totals\n          .generatorW / 1000;\n    } catch {\n      peak = null;\n    }\n  }\n  return {\n    area: area / 1_000_000,\n    loss: computed.heatTransferCoefficient,\n    hlp: computed.heatLossParameter,\n    sap: computed.sapRating,\n    heating: computed.spaceHeating,\n    peak,\n  };\n}\n\nexport async function loadFigures(designUrl: string): Promise<Figures> {\n  const design: Design = await fetchDesign(designUrl);\n  const context = await fetchCalcContext(design.calc_context_url);\n  return figuresOf(\n    design.floors,\n    design.fabric_types,\n    context,\n    design.heat_load,\n  );\n}\n\nexport type Column = keyof Figures;\n\n/** Decimal places each figure is shown to. */\nexport const PLACES: Record<Column, number> = {\n  area: 1,\n  loss: 0,\n  hlp: 2,\n  sap: 0,\n  heating: 0,\n  peak: 1,\n};\n\nexport function shown(value: number | null, column: Column): string {\n  if (value === null || !Number.isFinite(value)) {\n    return \"\u2014\";\n  }\n  return value.toLocaleString(\"en-GB\", {\n    minimumFractionDigits: PLACES[column],\n    maximumFractionDigits: PLACES[column],\n  });\n}\n\n/** \"+12.3\", \"\u22120.40\", or \"\" where nothing moved at the figure's precision. */\nexport function delta(\n  value: number | null,\n  base: number | null,\n  column: Column,\n): string {\n  if (value === null || base === null) {\n    return \"\";\n  }\n  const change = value - base;\n  const text = shown(Math.abs(change), column);\n  if (Number(text.replaceAll(\",\", \"\")) === 0) {\n    return \"\";\n  }\n  return `${change > 0 ? \"+\" : \"\u2212\"}${text}`;\n}\n\n/** Whether a change in this figure is for the better. */\nexport function better(column: Column, change: number): boolean | null {\n  if (column === \"area\") {\n    return null;\n  }\n  return column === \"sap\" ? change > 0 : change < 0;\n}\n\ninterface SceneLink {\n  id: number;\n  name: string;\n  url: string;\n  design_url: string;\n  current: boolean;\n}\n\ninterface Row extends SceneLink {\n  figures: Figures | null;\n  error: string;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  loading: boolean;\n  rows: Row[];\n  load(): void;\n  cell(row: Row, column: Column): string;\n  change(row: Row, column: Column): string;\n  tone(row: Row, column: Column): string;\n}\n\nexport default (): AlpineComponent<State> => ({\n  loading: false,\n  rows: [],\n\n  load() {\n    const scenes = JSON.parse(\n      this.$root.dataset[\"scenes\"] ?? \"[]\",\n    ) as SceneLink[];\n    this.loading = true;\n    this.rows = scenes.map((scene) => ({ ...scene, figures: null, error: \"\" }));\n    Promise.all(\n      this.rows.map((row, index) =>\n        loadFigures(row.design_url)\n          .then((figures) => {\n            const target = this.rows[index];\n            if (target) {\n              target.figures = figures;\n            }\n          })\n          .catch((error: unknown) => {\n            const target = this.rows[index];\n            if (target) {\n              target.error =\n                error instanceof Error ? error.message : \"No figures yet.\";\n            }\n          }),\n      ),\n    ).finally(() => {\n      this.loading = false;\n    });\n  },\n\n  cell(row, column) {\n    return row.figures ? shown(row.figures[column], column) : \"\";\n  },\n\n  change(row, column) {\n    const base = this.rows[0]?.figures;\n    if (!row.figures || !base || row === this.rows[0]) {\n      return \"\";\n    }\n    return delta(row.figures[column], base[column], column);\n  },\n\n  tone(row, column) {\n    const base = this.rows[0]?.figures;\n    const value = row.figures?.[column];\n    const from = base?.[column];\n    if (value == null || from == null || !this.change(row, column)) {\n      return \"text-gray-400\";\n    }\n    const good = better(column, value - from);\n    return good === null\n      ? \"text-gray-500\"\n      : good\n        ? \"text-emerald-700\"\n        : \"text-red-600\";\n  },\n});\n", "// A scenario's figures as the change from a baseline: by default its own scene\n// with no measures, so what's there in both (fixtures, insulation) cancels.\n\nimport type { Figures } from \"./figures\";\n\n/** The figures a change is taken between; a `Performance` is one. */\nexport interface Point {\n  sap: number;\n  /** \u00A3 a year. */\n  bills: number;\n  /** kg CO\u2082e a year. */\n  carbon: number;\n  /** Design heat load, kW. */\n  peak: number;\n  /** m\u00B2, heated. */\n  floor_area_m2?: number | undefined;\n}\n\nexport interface Change {\n  sap: number;\n  /** \u00A3 a year. */\n  bills: number;\n  /** kg CO\u2082e a year. */\n  carbon: number;\n  /** W: the design heat load. */\n  heat_loss_w: number;\n  /** W/m\u00B2 of heated floor, each side over its own; null without floor areas. */\n  heat_loss_w_m2: number | null;\n  /** Pence, or null where something has no price. */\n  cost: number | null;\n}\n\nexport interface Delta {\n  total: Change;\n  /** Each measure kind's own change, as the figures credit it. */\n  measures: Record<string, Change>;\n}\n\nconst W_PER_KW = 1000;\n\nfunction perM2(watts: number, area: number | undefined): number | null {\n  return area ? watts / area : null;\n}\n\n/** `after` less `before`. */\nexport function change(\n  after: Point,\n  before: Point,\n  cost: number | null = null,\n): Change {\n  const afterW = after.peak * W_PER_KW;\n  const beforeW = before.peak * W_PER_KW;\n  const afterM2 = perM2(afterW, after.floor_area_m2);\n  const beforeM2 = perM2(beforeW, before.floor_area_m2);\n  return {\n    sap: after.sap - before.sap,\n    bills: after.bills - before.bills,\n    carbon: after.carbon - before.carbon,\n    heat_loss_w: afterW - beforeW,\n    heat_loss_w_m2:\n      afterM2 === null || beforeM2 === null ? null : afterM2 - beforeM2,\n    cost,\n  };\n}\n\n/**\n * What a scenario changes: in total from `from` (its own baseline unless\n * another is given, such as As it is), and per measure kind from its own.\n * Cost is the gross one every surface shows.\n */\nexport function delta(scenario: Figures, from?: Point): Delta {\n  const own = scenario.baseline;\n  const after = { ...scenario, floor_area_m2: own.floor_area_m2 };\n  const measures: Record<string, Change> = {};\n  for (const [kind, measure] of Object.entries(scenario.measures)) {\n    const watts = (measure.delta?.peak ?? 0) * W_PER_KW;\n    measures[kind] = {\n      sap: measure.delta?.sap ?? 0,\n      bills: measure.delta?.bills ?? 0,\n      carbon: measure.delta?.carbon ?? 0,\n      heat_loss_w: watts,\n      heat_loss_w_m2: perM2(watts, own.floor_area_m2),\n      cost: measure.cost,\n    };\n  }\n  return {\n    total: change(after, from ?? own, scenario.gross_cost),\n    measures,\n  };\n}\n", "// Every scenario on every baseline side by side, as its change from its own\n// baseline, scored live on the plan as it is now (scenelive.ts).\n\nimport { AlpineComponent } from \"alpinejs\";\nimport { type Change, change, type Point } from \"./delta\";\nimport { type Scored, reason, scoreScenarios } from \"./scenelive\";\n\n/** A scenario's figures: the totals, and the point its change is taken from. */\nexport interface Kept extends Point {\n  band?: string;\n  /** Pence. */\n  gross_cost: number | null;\n  baseline: Point;\n}\n\ninterface ScenarioLink {\n  id: number;\n  name: string;\n  recommended: boolean;\n  current: boolean;\n  url: string;\n}\n\ninterface SceneLink {\n  id: number;\n  name: string;\n  design_url: string;\n  /** When its plan last changed. */\n  updated?: string;\n  scenarios: ScenarioLink[];\n}\n\n/** A scenario's name and star, as the editor changes them. */\nexport interface Named {\n  id: number;\n  name: string;\n  recommended: boolean;\n}\n\nexport interface Row {\n  id: number;\n  name: string;\n  baseline: string;\n  url: string;\n  current: boolean;\n  recommended: boolean;\n  /** On the baseline open, where it can be starred, renamed and deleted. */\n  here: boolean;\n  /** Null until it is scored, or when it can't be. */\n  change: Change | null;\n  /** Why it couldn't be scored. */\n  error: string;\n}\n\n/** A scenario's change from its own baseline. */\nexport function changeOf(figures: Kept): Change {\n  const after = { ...figures, floor_area_m2: figures.baseline.floor_area_m2 };\n  return change(after, figures.baseline, figures.gross_cost);\n}\n\nexport function rowsOf(\n  scenes: readonly SceneLink[],\n  scored: ReadonlyMap<number, Scored>,\n  here: number,\n): Row[] {\n  return scenes.flatMap((scene) =>\n    scene.scenarios.map((scenario) => {\n      const live = scored.get(scenario.id);\n      return {\n        id: scenario.id,\n        name: live?.name ?? scenario.name,\n        baseline: scene.name,\n        url: scenario.url,\n        current: scenario.current,\n        recommended: live?.recommended ?? scenario.recommended,\n        here: scene.id === here,\n        change: live?.figures ? changeOf(live.figures) : null,\n        error: live?.error ?? \"\",\n      };\n    }),\n  );\n}\n\n/** The scenes with a scenario gone, and its score. */\nexport function withoutScenario(\n  scenes: readonly SceneLink[],\n  scored: Map<number, Scored>,\n  id: number,\n): SceneLink[] {\n  scored.delete(id);\n  return scenes.map((scene) => ({\n    ...scene,\n    scenarios: scene.scenarios.filter((row) => row.id !== id),\n  }));\n}\n\n/** The scenes and scores with names and stars as the editor has them now. */\nexport function withNames(\n  scenes: readonly SceneLink[],\n  scored: Map<number, Scored>,\n  named: readonly Named[],\n): SceneLink[] {\n  const byId = new Map(named.map((row) => [row.id, row]));\n  for (const [id, row] of scored) {\n    const now = byId.get(id);\n    if (now) {\n      scored.set(id, { ...row, name: now.name, recommended: now.recommended });\n    }\n  }\n  return scenes.map((scene) => ({\n    ...scene,\n    scenarios: scene.scenarios.map((row) => {\n      const now = byId.get(row.id);\n      return now\n        ? { ...row, name: now.name, recommended: now.recommended }\n        : row;\n    }),\n  }));\n}\n\nexport type Column = \"sap\" | \"bills\" | \"carbon\" | \"heat_loss_w_m2\" | \"cost\";\n\nfunction signed(value: number, digits: number, prefix = \"\"): string {\n  const text = Math.abs(value).toLocaleString(\"en-GB\", {\n    minimumFractionDigits: digits,\n    maximumFractionDigits: digits,\n  });\n  if (Number(text.replaceAll(\",\", \"\")) === 0) {\n    return \"0\";\n  }\n  return `${value > 0 ? \"+\" : \"\u2212\"}${prefix}${text}`;\n}\n\n/** One cell: \"+12\", \"\u2212\u00A3340\", \"\u22121.2 t\", \"\u22128.5\", \"\u00A312,400\". */\nexport function shown(row: Row, column: Column): string {\n  const moved = row.change;\n  if (!moved) {\n    return \"\u2014\";\n  }\n  switch (column) {\n    case \"sap\":\n      return signed(Math.round(moved.sap), 0);\n    case \"bills\":\n      return signed(Math.round(moved.bills), 0, \"\u00A3\");\n    case \"carbon\":\n      return signed(moved.carbon / 1000, 1);\n    case \"heat_loss_w_m2\":\n      return moved.heat_loss_w_m2 === null\n        ? \"\u2014\"\n        : signed(moved.heat_loss_w_m2, 1);\n    case \"cost\":\n      return moved.cost === null\n        ? \"\u2014\"\n        : `\u00A3${Math.round(moved.cost / 100).toLocaleString(\"en-GB\")}`;\n  }\n}\n\n/** Green for better, red for worse; cost and nothing moved stay grey. */\nexport function tone(row: Row, column: Column): string {\n  const moved = row.change;\n  if (!moved || column === \"cost\") {\n    return \"text-gray-700\";\n  }\n  const value = column === \"sap\" ? moved.sap : (moved[column] ?? 0);\n  if (shown(row, column) === \"0\") {\n    return \"text-gray-400\";\n  }\n  const better = column === \"sap\" ? value > 0 : value < 0;\n  return better ? \"text-emerald-700\" : \"text-red-600\";\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  rows: Row[];\n  loading: boolean;\n  load(): void;\n  /** A scenario deleted in the editor: off the table, and not scored again. */\n  removed(gone: { id: number }): void;\n  /** Names and stars changed in the editor, patched in without rescoring. */\n  renamed(detail: { scenarios: Named[] }): void;\n  act(action: \"recommend\" | \"rename\" | \"delete\", row: Row): void;\n  cell(row: Row, column: Column): string;\n  tone(row: Row, column: Column): string;\n}\n\nexport default (): AlpineComponent<State> => {\n  let scenes: SceneLink[] = [];\n  let here = 0;\n  let token = 0;\n  const scored = new Map<number, Scored>();\n  return {\n    rows: [],\n    loading: false,\n\n    init() {\n      scenes = JSON.parse(this.$root.dataset[\"scenes\"] ?? \"[]\") as SceneLink[];\n      here = Number(this.$root.dataset[\"here\"] ?? 0);\n      this.rows = rowsOf(scenes, scored, here);\n    },\n\n    /**\n     * Scores every baseline's scenarios on the plan as it is now, one\n     * baseline after another; one whose plan hasn't changed is kept.\n     */\n    load() {\n      const mine = ++token;\n      this.loading = true;\n      const run = async () => {\n        for (const scene of scenes) {\n          let found: Scored[];\n          try {\n            found = await scoreScenarios(scene);\n          } catch (error: unknown) {\n            const why = reason(error);\n            found = scene.scenarios.map((row) => ({\n              id: row.id,\n              name: row.name,\n              recommended: row.recommended,\n              figures: null,\n              error: why,\n            }));\n          }\n          if (mine !== token) {\n            return;\n          }\n          for (const row of found) {\n            scored.set(row.id, row);\n          }\n          this.rows = rowsOf(scenes, scored, here);\n        }\n      };\n      run().finally(() => {\n        if (mine === token) {\n          this.loading = false;\n        }\n      });\n    },\n\n    removed(gone) {\n      scenes = withoutScenario(scenes, scored, gone.id);\n      this.rows = rowsOf(scenes, scored, here);\n    },\n\n    renamed(detail) {\n      scenes = withNames(scenes, scored, detail.scenarios);\n      this.rows = rowsOf(scenes, scored, here);\n    },\n\n    act(action, row) {\n      window.dispatchEvent(\n        new CustomEvent(\"scenario-action\", { detail: { action, id: row.id } }),\n      );\n    },\n\n    cell(row, column) {\n      return shown(row, column);\n    },\n\n    tone(row, column) {\n      return tone(row, column);\n    },\n  };\n};\n", "// How wide a line of text is on paper, so labels and dimensions can be kept\n// clear of each other before anything is drawn. Advance widths are Liberation\n// Sans's (Arial's metrics, which is what Revit and most UK practices letter\n// in), per 1000 units of the em; the PDF embeds the same font.\n\nconst CHARS =\n  \" !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u00D7\u00B2\u00B0\u2013\u2014\u2018\u2019\u201C\u201D\u00A3\u00B7\u2026\";\n\nconst REGULAR = [\n  278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278,\n  278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584,\n  584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556,\n  833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278,\n  278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222,\n  500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500,\n  500, 334, 260, 334, 584, 584, 333, 400, 556, 1000, 222, 222, 333, 333, 556,\n  333, 1000,\n];\n\nconst BOLD = [\n  278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278,\n  278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584,\n  584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611,\n  833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333,\n  278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278,\n  556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556,\n  500, 389, 280, 389, 584, 584, 333, 400, 556, 1000, 278, 278, 500, 500, 556,\n  333, 1000,\n];\n\n/** Cap height as a share of the font size. */\nexport const CAP = 0.688;\n/** Descender depth as a share of the font size. */\nexport const DESCENT = 0.212;\n\nconst index = new Map([...CHARS].map((char, at) => [char, at]));\n\n/** The width on paper of `text` set at `size` (the em, in mm). */\nexport function textWidth(text: string, size: number, bold = false): number {\n  const table = bold ? BOLD : REGULAR;\n  let units = 0;\n  for (const char of text) {\n    const at = index.get(char);\n    units += at === undefined ? 600 : (table[at] ?? 600);\n  }\n  return (units / 1000) * size;\n}\n\n/** `text` broken into lines no wider than `width` at `size`. */\nexport function wrap(\n  text: string,\n  size: number,\n  width: number,\n  bold = false,\n): string[] {\n  const lines: string[] = [];\n  for (const paragraph of text.split(\"\\n\")) {\n    let line = \"\";\n    for (const word of paragraph.split(/\\s+/).filter(Boolean)) {\n      const next = line ? `${line} ${word}` : word;\n      if (line && textWidth(next, size, bold) > width) {\n        lines.push(line);\n        line = word;\n      } else {\n        line = next;\n      }\n    }\n    lines.push(line);\n  }\n  return lines;\n}\n", "// A drawing as a list of marks on paper, in millimetres with y down, and the\n// two ways out of it: SVG (which the PDF places page by page) and DXF. Line\n// weights follow ISO 128's pen series; hatches are paper-scaled, as CAD's\n// annotative hatches are, so they read the same at 1:50 and 1:100.\n\nimport { CAP, textWidth } from \"./text\";\n\nexport type P = readonly [number, number];\n\n/** ISO 128 pen widths, mm. */\nexport const PEN = {\n  heavy: 0.7,\n  cut: 0.5,\n  medium: 0.35,\n  beyond: 0.25,\n  light: 0.18,\n  fine: 0.13,\n} as const;\n\nexport const INK = \"#1a1a1a\";\nexport const GREY = \"#6b6b6b\";\nexport const RED = \"#c8102e\";\n\nexport type Hatch =\n  | \"brick\"\n  | \"block\"\n  | \"insulation\"\n  | \"stud\"\n  | \"new\"\n  | \"ground\"\n  | \"poche\";\n\nexport interface Stroke {\n  w: number;\n  color?: string;\n  dash?: readonly number[];\n  cap?: \"butt\" | \"round\" | \"square\";\n}\n\nexport type Fill = string | { hatch: Hatch; bg?: string };\n\nexport type Item =\n  | { t: \"line\"; a: P; b: P; s: Stroke; layer: string }\n  | {\n      t: \"poly\";\n      pts: readonly P[];\n      closed: boolean;\n      s?: Stroke;\n      fill?: Fill;\n      opacity?: number;\n      layer: string;\n    }\n  | { t: \"arc\"; c: P; r: number; from: P; to: P; s: Stroke; layer: string }\n  | { t: \"circle\"; c: P; r: number; s?: Stroke; fill?: Fill; layer: string }\n  | {\n      t: \"text\";\n      at: P;\n      text: string;\n      size: number;\n      anchor?: \"start\" | \"middle\" | \"end\";\n      /** Where `at` sits vertically: the baseline, or the middle of the caps. */\n      valign?: \"baseline\" | \"middle\" | \"top\";\n      rot?: number;\n      bold?: boolean;\n      color?: string;\n      layer: string;\n    }\n  | { t: \"group\"; items: Item[]; clip?: readonly P[] };\n\nexport interface Box {\n  x0: number;\n  y0: number;\n  x1: number;\n  y1: number;\n}\n\nexport function box(points: readonly P[]): Box {\n  const xs = points.map((point) => point[0]);\n  const ys = points.map((point) => point[1]);\n  return {\n    x0: Math.min(...xs),\n    y0: Math.min(...ys),\n    x1: Math.max(...xs),\n    y1: Math.max(...ys),\n  };\n}\n\nexport function grow(b: Box, by: number): Box {\n  return { x0: b.x0 - by, y0: b.y0 - by, x1: b.x1 + by, y1: b.y1 + by };\n}\n\nexport function overlaps(a: Box, b: Box): boolean {\n  return a.x0 < b.x1 && b.x0 < a.x1 && a.y0 < b.y1 && b.y0 < a.y1;\n}\n\nexport function union(boxes: readonly Box[]): Box {\n  return {\n    x0: Math.min(...boxes.map((b) => b.x0)),\n    y0: Math.min(...boxes.map((b) => b.y0)),\n    x1: Math.max(...boxes.map((b) => b.x1)),\n    y1: Math.max(...boxes.map((b) => b.y1)),\n  };\n}\n\n/** The box a text item covers on paper, caps and descenders. */\nexport function textBox(item: Extract<Item, { t: \"text\" }>): Box {\n  const width = textWidth(item.text, item.size, item.bold);\n  const cap = item.size * CAP;\n  const anchor = item.anchor ?? \"start\";\n  const x0 = anchor === \"start\" ? 0 : anchor === \"middle\" ? -width / 2 : -width;\n  const valign = item.valign ?? \"baseline\";\n  const base = valign === \"middle\" ? cap / 2 : valign === \"top\" ? cap : 0;\n  const corners: P[] = [\n    [x0, base - cap],\n    [x0 + width, base - cap],\n    [x0 + width, base + item.size * 0.21],\n    [x0, base + item.size * 0.21],\n  ];\n  const turn = ((item.rot ?? 0) * Math.PI) / 180;\n  const cos = Math.cos(turn);\n  const sin = Math.sin(turn);\n  return box(\n    corners.map(([x, y]) => [\n      item.at[0] + x * cos - y * sin,\n      item.at[1] + x * sin + y * cos,\n    ]),\n  );\n}\n\n/** Everything the items cover, roughly: strokes count as their centrelines. */\nexport function extent(items: readonly Item[]): Box | null {\n  const boxes: Box[] = [];\n  for (const item of items) {\n    if (item.t === \"line\") {\n      boxes.push(box([item.a, item.b]));\n    } else if (item.t === \"poly\" && item.pts.length > 0) {\n      boxes.push(box(item.pts));\n    } else if (item.t === \"arc\") {\n      boxes.push(box([item.from, item.to, item.c]));\n    } else if (item.t === \"circle\") {\n      boxes.push(grow(box([item.c]), item.r));\n    } else if (item.t === \"text\") {\n      boxes.push(textBox(item));\n    } else if (item.t === \"group\") {\n      const inner = extent(item.items);\n      if (inner) {\n        boxes.push(inner);\n      }\n    }\n  }\n  return boxes.length > 0 ? union(boxes) : null;\n}\n\n/** The items moved by [dx, dy] and scaled by k about the origin first. */\nexport function place(\n  items: readonly Item[],\n  dx: number,\n  dy: number,\n  k = 1,\n): Item[] {\n  const at = ([x, y]: P): P => [x * k + dx, y * k + dy];\n  return items.map((item): Item => {\n    switch (item.t) {\n      case \"line\":\n        return { ...item, a: at(item.a), b: at(item.b) };\n      case \"poly\":\n        return { ...item, pts: item.pts.map(at) };\n      case \"arc\":\n        return {\n          ...item,\n          c: at(item.c),\n          from: at(item.from),\n          to: at(item.to),\n          r: item.r * k,\n        };\n      case \"circle\":\n        return { ...item, c: at(item.c), r: item.r * k };\n      case \"text\":\n        return { ...item, at: at(item.at), size: item.size * k };\n      case \"group\":\n        return {\n          ...item,\n          items: place(item.items, dx, dy, k),\n          ...(item.clip ? { clip: item.clip.map(at) } : {}),\n        };\n    }\n  });\n}\n\n// --- SVG -------------------------------------------------------------------\n\nfunction num(value: number): string {\n  return String(Math.round(value * 100) / 100);\n}\n\n/** Whether XML 1.0 can hold a code point: no C0 controls but tab, LF and\n * CR, no lone surrogates, no U+FFFE or U+FFFF. */\nfunction xmlChar(code: number): boolean {\n  if (code < 0x20) {\n    return code === 0x9 || code === 0xa || code === 0xd;\n  }\n  return (\n    !(code >= 0xd800 && code <= 0xdfff) && code !== 0xfffe && code !== 0xffff\n  );\n}\n\n/** `text` without what XML can't hold. Iterating by code point keeps whole\n * surrogate pairs and meets a lone half on its own. */\nexport function xmlSafe(text: string): string {\n  let out = \"\";\n  for (const char of text) {\n    if (xmlChar(char.codePointAt(0) ?? 0)) {\n      out += char;\n    }\n  }\n  return out;\n}\n\nexport function escapeXml(text: string): string {\n  return xmlSafe(text)\n    .replaceAll(\"&\", \"&amp;\")\n    .replaceAll(\"<\", \"&lt;\")\n    .replaceAll(\">\", \"&gt;\")\n    .replaceAll('\"', \"&quot;\");\n}\n\n/** The paper-scaled hatch patterns, by name. */\nexport const HATCH_DEFS =\n  // Brickwork: 45\u00B0 lines (BS 1192 / Archicad \"Brick\").\n  `<pattern id=\"h-brick\" width=\"1.2\" height=\"1.2\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">` +\n  `<line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1.2\" stroke=\"${INK}\" stroke-width=\"0.1\"/></pattern>` +\n  // Blockwork: crossed 45\u00B0 lines, wider.\n  `<pattern id=\"h-block\" width=\"1.6\" height=\"1.6\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">` +\n  `<path d=\"M0 0V1.6M0 0H1.6\" stroke=\"${INK}\" stroke-width=\"0.09\" fill=\"none\"/></pattern>` +\n  // Insulation: the batt zigzag.\n  `<pattern id=\"h-insulation\" width=\"2\" height=\"2\" patternUnits=\"userSpaceOnUse\">` +\n  `<path d=\"M0 2L1 0L2 2\" stroke=\"${INK}\" stroke-width=\"0.1\" fill=\"none\"/></pattern>` +\n  // Studwork partitions: a light tone.\n  `<pattern id=\"h-stud\" width=\"1\" height=\"1\" patternUnits=\"userSpaceOnUse\">` +\n  `<rect width=\"1\" height=\"1\" fill=\"#d9d9d9\"/></pattern>` +\n  // New construction: dense 45\u00B0 in red, as UK planning drawings mark it.\n  `<pattern id=\"h-new\" width=\"0.8\" height=\"0.8\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(-45)\">` +\n  `<line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"0.8\" stroke=\"${RED}\" stroke-width=\"0.12\"/></pattern>` +\n  // Ground in section and elevation.\n  `<pattern id=\"h-ground\" width=\"2.4\" height=\"2.4\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\">` +\n  `<line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"2.4\" stroke=\"${INK}\" stroke-width=\"0.12\"/></pattern>` +\n  `<pattern id=\"h-poche\" width=\"1\" height=\"1\" patternUnits=\"userSpaceOnUse\">` +\n  `<rect width=\"1\" height=\"1\" fill=\"#3c3c3c\"/></pattern>`;\n\nfunction fillAttr(fill: Fill | undefined): string {\n  if (fill === undefined) {\n    return ' fill=\"none\"';\n  }\n  if (typeof fill === \"string\") {\n    return ` fill=\"${fill}\"`;\n  }\n  return ` fill=\"url(#h-${fill.hatch})\"`;\n}\n\nfunction strokeAttr(stroke: Stroke | undefined): string {\n  if (!stroke) {\n    return \"\";\n  }\n  let out = ` stroke=\"${stroke.color ?? INK}\" stroke-width=\"${num(stroke.w)}\"`;\n  if (stroke.dash) {\n    out += ` stroke-dasharray=\"${stroke.dash.map(num).join(\" \")}\"`;\n  }\n  if (stroke.cap && stroke.cap !== \"butt\") {\n    out += ` stroke-linecap=\"${stroke.cap}\"`;\n  }\n  return out;\n}\n\nfunction pointsAttr(points: readonly P[]): string {\n  return points.map(([x, y]) => `${num(x)},${num(y)}`).join(\" \");\n}\n\nlet clips = 0;\n\nfunction svgItem(item: Item): string {\n  switch (item.t) {\n    case \"line\":\n      return `<line x1=\"${num(item.a[0])}\" y1=\"${num(item.a[1])}\" x2=\"${num(item.b[0])}\" y2=\"${num(item.b[1])}\"${strokeAttr(item.s)}/>`;\n    case \"poly\": {\n      const tag = item.closed ? \"polygon\" : \"polyline\";\n      const background =\n        item.fill && typeof item.fill !== \"string\" && item.fill.bg\n          ? `<${tag} points=\"${pointsAttr(item.pts)}\" fill=\"${item.fill.bg}\"/>`\n          : \"\";\n      const opacity =\n        item.opacity !== undefined ? ` fill-opacity=\"${item.opacity}\"` : \"\";\n      return `${background}<${tag} points=\"${pointsAttr(item.pts)}\"${fillAttr(item.closed ? item.fill : undefined)}${opacity}${strokeAttr(item.s)} stroke-linejoin=\"miter\" stroke-miterlimit=\"4\"/>`;\n    }\n    case \"arc\": {\n      const [fx, fy] = item.from;\n      const [tx, ty] = item.to;\n      // Sweep the short way round, the way the cross product turns.\n      const cross =\n        (fx - item.c[0]) * (ty - item.c[1]) -\n        (fy - item.c[1]) * (tx - item.c[0]);\n      return `<path d=\"M${num(fx)} ${num(fy)}A${num(item.r)} ${num(item.r)} 0 0 ${cross > 0 ? 1 : 0} ${num(tx)} ${num(ty)}\" fill=\"none\"${strokeAttr(item.s)}/>`;\n    }\n    case \"circle\":\n      return `<circle cx=\"${num(item.c[0])}\" cy=\"${num(item.c[1])}\" r=\"${num(item.r)}\"${fillAttr(item.fill)}${strokeAttr(item.s)}/>`;\n    case \"text\": {\n      const cap = item.size * CAP;\n      const valign = item.valign ?? \"baseline\";\n      const dy = valign === \"middle\" ? cap / 2 : valign === \"top\" ? cap : 0;\n      const turn = item.rot\n        ? ` transform=\"rotate(${num(item.rot)} ${num(item.at[0])} ${num(item.at[1])})\"`\n        : \"\";\n      const anchor =\n        item.anchor && item.anchor !== \"start\"\n          ? ` text-anchor=\"${item.anchor}\"`\n          : \"\";\n      const weight = item.bold ? ' font-weight=\"bold\"' : \"\";\n      const color = item.color ? ` fill=\"${item.color}\"` : \"\";\n      return `<text x=\"${num(item.at[0])}\" y=\"${num(item.at[1] + dy)}\" font-size=\"${num(item.size)}\"${anchor}${weight}${color}${turn}>${escapeXml(item.text)}</text>`;\n    }\n    case \"group\": {\n      const body = item.items.map(svgItem).join(\"\");\n      if (!item.clip) {\n        return `<g>${body}</g>`;\n      }\n      clips += 1;\n      const id = `c${clips}`;\n      return `<clipPath id=\"${id}\"><polygon points=\"${pointsAttr(item.clip)}\"/></clipPath><g clip-path=\"url(#${id})\">${body}</g>`;\n    }\n  }\n}\n\n/** A sheet of paper `width` \u00D7 `height` mm with the items on it. */\nexport function toSvg(items: readonly Item[], width: number, height: number) {\n  clips = 0;\n  const body = items.map(svgItem).join(\"\");\n  return (\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${num(width)} ${num(height)}\"` +\n    ` width=\"${num(width)}mm\" height=\"${num(height)}mm\"` +\n    ` font-family=\"Liberation Sans, Arial, Helvetica, sans-serif\" fill=\"${INK}\">` +\n    `<defs>${HATCH_DEFS}</defs><rect width=\"${num(width)}\" height=\"${num(height)}\" fill=\"#ffffff\"/>${body}</svg>`\n  );\n}\n\n// --- DXF (R12, the version everything opens) --------------------------------\n\n/** Text as R12 reads it: one line, ASCII, anything else as \\U+XXXX. */\nexport function dxfText(text: string): string {\n  let out = \"\";\n  for (const char of xmlSafe(text).replace(/[\\r\\n\\t]+/g, \" \")) {\n    const code = char.codePointAt(0) ?? 32;\n    if (code < 32) {\n      out += \" \";\n    } else if (code < 127) {\n      out += char;\n    } else if (code <= 0xffff) {\n      out += `\\\\U+${code.toString(16).toUpperCase().padStart(4, \"0\")}`;\n    }\n  }\n  return out;\n}\n\nfunction pair(code: number, value: string | number): string {\n  return `${code}\\n${typeof value === \"number\" ? num(value) : value}\\n`;\n}\n\nfunction dxfItems(\n  items: readonly Item[],\n  at: (point: P) => P,\n  k: number,\n  out: string[],\n  layers: Set<string>,\n): void {\n  for (const item of items) {\n    if (item.t === \"group\") {\n      dxfItems(item.items, at, k, out, layers);\n      continue;\n    }\n    layers.add(item.layer);\n    const head = pair(8, item.layer);\n    if (item.t === \"line\") {\n      const [x1, y1] = at(item.a);\n      const [x2, y2] = at(item.b);\n      out.push(\n        pair(0, \"LINE\") +\n          head +\n          pair(10, x1) +\n          pair(20, y1) +\n          pair(30, 0) +\n          pair(11, x2) +\n          pair(21, y2) +\n          pair(31, 0),\n      );\n    } else if (item.t === \"poly\") {\n      if (!item.s && typeof item.fill === \"object\") {\n        continue; // a hatch fill on its own has no outline to send\n      }\n      let body =\n        pair(0, \"POLYLINE\") +\n        head +\n        pair(66, 1) +\n        pair(70, item.closed ? 1 : 0);\n      for (const point of item.pts) {\n        const [x, y] = at(point);\n        body +=\n          pair(0, \"VERTEX\") + head + pair(10, x) + pair(20, y) + pair(30, 0);\n      }\n      out.push(body + pair(0, \"SEQEND\") + head);\n    } else if (item.t === \"circle\") {\n      const [x, y] = at(item.c);\n      out.push(\n        pair(0, \"CIRCLE\") +\n          head +\n          pair(10, x) +\n          pair(20, y) +\n          pair(30, 0) +\n          pair(40, item.r * k),\n      );\n    } else if (item.t === \"arc\") {\n      const [cx, cy] = at(item.c);\n      const [fx, fy] = at(item.from);\n      const [tx, ty] = at(item.to);\n      let start = (Math.atan2(fy - cy, fx - cx) * 180) / Math.PI;\n      let end = (Math.atan2(ty - cy, tx - cx) * 180) / Math.PI;\n      // DXF arcs run anticlockwise; take the short way.\n      let sweep = (((end - start) % 360) + 360) % 360;\n      if (sweep > 180) {\n        [start, end] = [end, start];\n        sweep = 360 - sweep;\n      }\n      out.push(\n        pair(0, \"ARC\") +\n          head +\n          pair(10, cx) +\n          pair(20, cy) +\n          pair(30, 0) +\n          pair(40, item.r * k) +\n          pair(50, start) +\n          pair(51, end),\n      );\n    } else if (item.t === \"text\") {\n      const [x, y] = at(item.at);\n      const align = { start: 0, middle: 1, end: 2 }[item.anchor ?? \"start\"];\n      const vertical = { baseline: 0, middle: 2, top: 3 }[\n        item.valign ?? \"baseline\"\n      ];\n      let body =\n        pair(0, \"TEXT\") +\n        head +\n        pair(10, x) +\n        pair(20, y) +\n        pair(30, 0) +\n        pair(40, item.size * CAP * k) +\n        pair(1, dxfText(item.text)) +\n        pair(50, -(item.rot ?? 0));\n      if (align !== 0 || vertical !== 0) {\n        body +=\n          pair(72, align) +\n          pair(73, vertical) +\n          pair(11, x) +\n          pair(21, y) +\n          pair(31, 0);\n      }\n      out.push(body);\n    }\n  }\n}\n\nexport interface DxfView {\n  items: readonly Item[];\n  /** Model mm per paper mm: 50 at 1:50. */\n  scale: number;\n  /** Where the view's paper origin goes in model space, mm. */\n  origin: P;\n}\n\n/** The views at full size in one DXF, y up, in millimetres. */\nexport function toDxf(views: readonly DxfView[]): string {\n  const entities: string[] = [];\n  const layers = new Set<string>();\n  for (const view of views) {\n    const at = ([x, y]: P): P => [\n      view.origin[0] + x * view.scale,\n      view.origin[1] - y * view.scale,\n    ];\n    dxfItems(view.items, at, view.scale, entities, layers);\n  }\n  const table =\n    pair(0, \"TABLE\") +\n    pair(2, \"LAYER\") +\n    pair(70, layers.size) +\n    [...layers]\n      .sort()\n      .map(\n        (layer) =>\n          pair(0, \"LAYER\") +\n          pair(2, layer) +\n          pair(70, 0) +\n          pair(62, 7) +\n          pair(6, \"CONTINUOUS\"),\n      )\n      .join(\"\") +\n    pair(0, \"ENDTAB\");\n  return (\n    pair(0, \"SECTION\") +\n    pair(2, \"HEADER\") +\n    pair(9, \"$ACADVER\") +\n    pair(1, \"AC1009\") +\n    // Millimetres, metric: so CAD inserts the drawing at the right size.\n    pair(9, \"$INSUNITS\") +\n    pair(70, 4) +\n    pair(9, \"$MEASUREMENT\") +\n    pair(70, 1) +\n    pair(0, \"ENDSEC\") +\n    pair(0, \"SECTION\") +\n    pair(2, \"TABLES\") +\n    table +\n    pair(0, \"ENDSEC\") +\n    pair(0, \"SECTION\") +\n    pair(2, \"ENTITIES\") +\n    entities.join(\"\") +\n    pair(0, \"ENDSEC\") +\n    pair(0, \"EOF\")\n  );\n}\n", "// The house as the drawings see it: every floor turned as the editor shows\n// the plan, walls with the faces either side of their centreline, the\n// outside of each floor as loops, and each room's clear internal outline.\n\nimport { resolveFabric } from \"../fabric\";\nimport { resolve } from \"../resolve\";\nimport type { FabricType, Floor, Opening, Point } from \"../scene\";\n\n/** The depth of a floor between storeys, mm (as the 3D view takes it). */\nexport const FLOOR_ZONE_MM = 250;\n\nexport type Construction =\n  | \"cavity\"\n  | \"filled-cavity\"\n  | \"solid\"\n  | \"timber\"\n  | \"stud\";\n\nexport interface ModelWall {\n  id: string;\n  a: Point;\n  b: Point;\n  thickness: number;\n  /** \"EXTERNAL\", \"INTERNAL\" or \"PARTY\". */\n  kind: string;\n  rooms: readonly string[];\n  openings: readonly Opening[];\n  construction: Construction;\n  /** Unit normal pointing out of the house (or out of its first room). */\n  out: Point;\n}\n\nexport interface ModelRoom {\n  id: string;\n  name: string;\n  heated: boolean;\n  /** The centreline outline, wound with its inside on the left of y-down. */\n  outline: Point[];\n  /** The wall ids along each edge of `outline` (null where none). */\n  edges: (string | null)[];\n  /** The clear internal outline: each edge in by half its wall. */\n  clear: Point[];\n}\n\n/** One edge of a floor's outside, wound like the rooms. */\nexport interface LoopEdge {\n  a: Point;\n  b: Point;\n  wall: ModelWall | null;\n}\n\nexport interface ModelFloor {\n  id: number;\n  name: string;\n  level: number;\n  /** Storey base above the ground floor, mm. */\n  base: number;\n  ceiling: number;\n  walls: ModelWall[];\n  rooms: ModelRoom[];\n  loops: LoopEdge[][];\n}\n\nexport interface Building {\n  floors: ModelFloor[];\n  /** Plan bearing of north: degrees clockwise from up, as drawn. */\n  north: number | null;\n}\n\nexport function rotate([x, y]: Point, deg: number): Point {\n  const turn = (deg * Math.PI) / 180;\n  const cos = Math.cos(turn);\n  const sin = Math.sin(turn);\n  return [x * cos - y * sin, x * sin + y * cos];\n}\n\nexport function signedArea(polygon: readonly Point[]): number {\n  let doubled = 0;\n  for (let index = 0; index < polygon.length; index++) {\n    const a = polygon[index] as Point;\n    const b = polygon[(index + 1) % polygon.length] as Point;\n    doubled += a[0] * b[1] - b[0] * a[1];\n  }\n  return doubled / 2;\n}\n\nfunction unit(a: Point, b: Point): Point {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n  return [(b[0] - a[0]) / length, (b[1] - a[1]) / length];\n}\n\n/** The left-hand normal of a\u2192b in y-down coordinates: the inside of a\n * polygon with positive signed area. */\nexport function inward(a: Point, b: Point): Point {\n  const [ux, uy] = unit(a, b);\n  return [-uy, ux];\n}\n\nfunction intersect(p: Point, d: Point, q: Point, e: Point): Point | null {\n  const cross = d[0] * e[1] - d[1] * e[0];\n  if (Math.abs(cross) < 1e-9) {\n    return null;\n  }\n  const t = ((q[0] - p[0]) * e[1] - (q[1] - p[1]) * e[0]) / cross;\n  return [p[0] + d[0] * t, p[1] + d[1] * t];\n}\n\n/**\n * A closed polygon with each edge moved `by[i]` along its inward normal\n * (negative moves it out), corners mitred. A corner whose mitre would run\n * long, or between parallel edges, keeps both edges' ends instead.\n */\nexport function offsetPolygon(\n  polygon: readonly Point[],\n  by: readonly number[],\n): Point[] {\n  const count = polygon.length;\n  const out: Point[] = [];\n  for (let index = 0; index < count; index++) {\n    const prev = (index + count - 1) % count;\n    const a0 = polygon[prev] as Point;\n    const a1 = polygon[index] as Point;\n    const a2 = polygon[(index + 1) % count] as Point;\n    const n0 = inward(a0, a1);\n    const n1 = inward(a1, a2);\n    const d0 = by[prev] ?? 0;\n    const d1 = by[index] ?? 0;\n    const p0: Point = [a1[0] + n0[0] * d0, a1[1] + n0[1] * d0];\n    const p1: Point = [a1[0] + n1[0] * d1, a1[1] + n1[1] * d1];\n    const corner = intersect(p0, unit(a0, a1), p1, unit(a1, a2));\n    const limit = 4 * Math.max(Math.abs(d0), Math.abs(d1), 1);\n    if (corner && Math.hypot(corner[0] - a1[0], corner[1] - a1[1]) <= limit) {\n      out.push(corner);\n    } else if (Math.hypot(p0[0] - p1[0], p0[1] - p1[1]) < 0.5) {\n      out.push(p0);\n    } else {\n      out.push(p0, p1);\n    }\n  }\n  return out;\n}\n\nfunction constructionOf(\n  kind: string,\n  thickness: number,\n  fabric: FabricType | null,\n  explicit: boolean,\n): Construction {\n  const spec = fabric?.spec ?? {};\n  const construction = String(spec[\"construction\"] ?? \"\");\n  const insulation = spec[\"insulation\"] as { kind?: string } | undefined;\n  if (kind === \"INTERNAL\") {\n    if (explicit && /BRICK|BLOCK|STONE|SOLID/.test(construction)) {\n      return \"solid\";\n    }\n    return thickness >= 200 ? \"solid\" : \"stud\";\n  }\n  if (kind === \"PARTY\") {\n    return \"solid\";\n  }\n  if (construction.includes(\"TIMBER\")) {\n    return \"timber\";\n  }\n  if (construction.includes(\"CAVITY\") && thickness >= 230) {\n    return construction.includes(\"FILLED\") ||\n      insulation?.kind === \"FILLED_CAVITY\"\n      ? \"filled-cavity\"\n      : \"cavity\";\n  }\n  return \"solid\";\n}\n\nfunction key(a: string, b: string): string {\n  return a < b ? `${a}|${b}` : `${b}|${a}`;\n}\n\n/** A floor seen as the drawings need it, turned `turn` degrees clockwise. */\nexport function modelFloor(\n  floor: Floor,\n  types: readonly FabricType[],\n  turn: number,\n  base: number,\n): ModelFloor {\n  const scene = floor.scene;\n  const view = resolve(scene, types);\n  const at = new Map(\n    scene.vertices.map((vertex) => [vertex.id, rotate(vertex.at, turn)]),\n  );\n  const wallByPair = new Map<string, string>();\n  for (const wall of scene.walls) {\n    wallByPair.set(key(wall.a, wall.b), wall.id);\n  }\n\n  const rooms: ModelRoom[] = [];\n  const held = new Map<string, number>();\n  const directed: { from: string; to: string; wall: string | null }[] = [];\n  for (const room of scene.rooms) {\n    let ring = [...room.boundary];\n    let outline = ring\n      .map((id) => at.get(id))\n      .filter((point): point is Point => Boolean(point));\n    if (outline.length < 3 || outline.length !== ring.length) {\n      continue;\n    }\n    if (signedArea(outline) < 0) {\n      ring = ring.reverse();\n      outline = outline.reverse();\n    }\n    const edges = ring.map(\n      (id, index) =>\n        wallByPair.get(key(id, ring[(index + 1) % ring.length] as string)) ??\n        null,\n    );\n    rooms.push({\n      id: room.id,\n      name: room.name || \"Room\",\n      heated: room.heated !== false,\n      outline,\n      edges,\n      clear: [],\n    });\n    ring.forEach((id, index) => {\n      const next = ring[(index + 1) % ring.length] as string;\n      const pair = key(id, next);\n      held.set(pair, (held.get(pair) ?? 0) + 1);\n      directed.push({ from: id, to: next, wall: edges[index] ?? null });\n    });\n  }\n\n  const walls: ModelWall[] = [];\n  const sourceById = new Map(scene.walls.map((wall) => [wall.id, wall]));\n  for (const wall of view.walls) {\n    const source = sourceById.get(wall.id);\n    const a = source ? at.get(source.a) : undefined;\n    const b = source ? at.get(source.b) : undefined;\n    if (!source || !a || !b) {\n      continue;\n    }\n    const explicit = source.fabric !== null && source.fabric !== undefined;\n    const fabric = resolveFabric([...types], \"WALL\", source.fabric);\n    // Out of the house: away from the first room that holds the wall.\n    let out: Point = inward(a, b);\n    const holder = rooms.find((room) => room.edges.includes(wall.id));\n    if (holder) {\n      const index = holder.edges.indexOf(wall.id);\n      const p = holder.outline[index] as Point;\n      const q = holder.outline[(index + 1) % holder.outline.length] as Point;\n      const inside = inward(p, q);\n      out = [-inside[0], -inside[1]];\n    }\n    walls.push({\n      id: wall.id,\n      a,\n      b,\n      thickness: wall.thickness,\n      kind: wall.kind,\n      rooms: wall.rooms,\n      openings: view.openingsByWall.get(wall.id) ?? [],\n      construction: constructionOf(wall.kind, wall.thickness, fabric, explicit),\n      out,\n    });\n  }\n  const wallById = new Map(walls.map((wall) => [wall.id, wall]));\n\n  for (const room of rooms) {\n    room.clear = offsetPolygon(\n      room.outline,\n      room.edges.map((id) => (id ? (wallById.get(id)?.thickness ?? 0) / 2 : 0)),\n    );\n  }\n\n  // The outside: edges only one room holds, followed round head to tail.\n  const outer = directed.filter(\n    (edge) => held.get(key(edge.from, edge.to)) === 1,\n  );\n  const byStart = new Map<string, typeof outer>();\n  for (const edge of outer) {\n    byStart.set(edge.from, [...(byStart.get(edge.from) ?? []), edge]);\n  }\n  const used = new Set<(typeof outer)[number]>();\n  const loops: LoopEdge[][] = [];\n  for (const first of outer) {\n    if (used.has(first)) {\n      continue;\n    }\n    const loop: LoopEdge[] = [];\n    let edge: (typeof outer)[number] | undefined = first;\n    while (edge && !used.has(edge)) {\n      used.add(edge);\n      loop.push({\n        a: at.get(edge.from) as Point,\n        b: at.get(edge.to) as Point,\n        wall: edge.wall ? (wallById.get(edge.wall) ?? null) : null,\n      });\n      edge = (byStart.get(edge.to) ?? []).find((next) => !used.has(next));\n    }\n    if (loop.length >= 3) {\n      loops.push(loop);\n    }\n  }\n\n  return {\n    id: floor.id,\n    name: floor.name,\n    level: floor.level,\n    base,\n    ceiling: floor.ceiling_height_mm,\n    walls,\n    rooms,\n    loops,\n  };\n}\n\n/** Every floor with walls, stacked, turned as the editor shows the plan. */\nexport function building(\n  floors: readonly Floor[],\n  types: readonly FabricType[],\n  turn: number,\n  northDeg: number | null,\n): Building {\n  const sorted = [...floors]\n    .filter((floor) => floor.scene.walls.length > 0)\n    .sort((a, b) => a.level - b.level);\n  let base = 0;\n  const model = sorted.map((floor) => {\n    const here = modelFloor(floor, types, turn, base);\n    base += floor.ceiling_height_mm + FLOOR_ZONE_MM;\n    return here;\n  });\n  return {\n    floors: model,\n    north: northDeg === null ? null : (((northDeg + turn) % 360) + 360) % 360,\n  };\n}\n\n/** The loop's outer face: each edge out by half its wall. */\nexport function outerFace(loop: readonly LoopEdge[]): Point[] {\n  return offsetPolygon(\n    loop.map((edge) => edge.a),\n    loop.map((edge) => -(edge.wall?.thickness ?? 0) / 2),\n  );\n}\n\n/** The bounding box of every floor's outer faces, mm. */\nexport function footprint(floors: readonly ModelFloor[]): {\n  minX: number;\n  minY: number;\n  maxX: number;\n  maxY: number;\n} {\n  const points: Point[] = floors.flatMap((floor) => [\n    ...floor.loops.flatMap(outerFace),\n    ...floor.walls.flatMap((wall) => [wall.a, wall.b]),\n  ]);\n  if (points.length === 0) {\n    return { minX: 0, minY: 0, maxX: 1000, maxY: 1000 };\n  }\n  return {\n    minX: Math.min(...points.map((point) => point[0])),\n    minY: Math.min(...points.map((point) => point[1])),\n    maxX: Math.max(...points.map((point) => point[0])),\n    maxY: Math.max(...points.map((point) => point[1])),\n  };\n}\n", "// What is already on the paper, so a label or a dimension can find somewhere\n// clear to go. Boxes for text and symbols; thick segments for linework.\n\nimport { type Box, type P, overlaps } from \"./draw\";\n\ninterface Segment {\n  a: P;\n  b: P;\n  /** Half the clearance either side, mm. */\n  half: number;\n}\n\n/** Whether segment a\u2192b passes through the box (Liang\u2013Barsky). */\nexport function segmentHitsBox(a: P, b: P, box: Box): boolean {\n  let t0 = 0;\n  let t1 = 1;\n  const dx = b[0] - a[0];\n  const dy = b[1] - a[1];\n  const checks: [number, number][] = [\n    [-dx, a[0] - box.x0],\n    [dx, box.x1 - a[0]],\n    [-dy, a[1] - box.y0],\n    [dy, box.y1 - a[1]],\n  ];\n  for (const [p, q] of checks) {\n    if (p === 0) {\n      if (q < 0) {\n        return false;\n      }\n      continue;\n    }\n    const r = q / p;\n    if (p < 0) {\n      if (r > t1) {\n        return false;\n      }\n      t0 = Math.max(t0, r);\n    } else {\n      if (r < t0) {\n        return false;\n      }\n      t1 = Math.min(t1, r);\n    }\n  }\n  return t0 <= t1;\n}\n\nexport class Space {\n  private readonly boxes: Box[] = [];\n  private readonly segments: Segment[] = [];\n\n  addBox(box: Box): void {\n    this.boxes.push(box);\n  }\n\n  addSegment(a: P, b: P, half = 0.3): void {\n    this.segments.push({ a, b, half });\n  }\n\n  addPolyline(points: readonly P[], closed: boolean, half = 0.3): void {\n    for (let index = 0; index + 1 < points.length; index++) {\n      this.addSegment(points[index] as P, points[index + 1] as P, half);\n    }\n    if (closed && points.length > 2) {\n      this.addSegment(points[points.length - 1] as P, points[0] as P, half);\n    }\n  }\n\n  /** Whether `box` is clear of everything so far. */\n  clear(box: Box): boolean {\n    if (this.boxes.some((other) => overlaps(box, other))) {\n      return false;\n    }\n    return !this.segments.some((segment) =>\n      segmentHitsBox(segment.a, segment.b, {\n        x0: box.x0 - segment.half,\n        y0: box.y0 - segment.half,\n        x1: box.x1 + segment.half,\n        y1: box.y1 + segment.half,\n      }),\n    );\n  }\n\n  /** Whether a line a\u2192b crosses anything already placed (boxes only). */\n  lineClear(a: P, b: P): boolean {\n    return !this.boxes.some((other) => segmentHitsBox(a, b, other));\n  }\n}\n", "// A floor plan as an architect draws it: walls cut and hatched by what they\n// are made of (or solid poch\u00E9 at 1:100), the outside face and the room faces\n// in the cut pen, openings cut through with jambs, doors with their leaf and\n// swing, windows with frame, glass and sills, and each room named with its\n// clear area. Items are on paper: model millimetres over the scale.\n\nimport { doorLeaves } from \"../openings\";\nimport type { Point } from \"../scene\";\nimport {\n  type Box,\n  type Fill,\n  GREY,\n  INK,\n  type Item,\n  type P,\n  PEN,\n  RED,\n  type Stroke,\n  textBox,\n} from \"./draw\";\nimport {\n  type LoopEdge,\n  type ModelFloor,\n  type ModelRoom,\n  type ModelWall,\n  inward,\n  signedArea,\n} from \"./model\";\nimport { Space } from \"./space\";\n\n/** A stretch of wall a proposal builds or takes down, turned as the plan. */\nexport interface PhasedPiece {\n  a: Point;\n  b: Point;\n  thickness: number;\n  phase: \"new\" | \"demolished\";\n}\n\n/** How a proposal's walls compare with the house as it is (phasing.ts). */\nexport interface Phasing {\n  pieces: readonly PhasedPiece[];\n}\n\nexport interface PlanOptions {\n  scale: number;\n  /** Drawn in grey without hatching, under a measure's marks. */\n  muted?: boolean;\n  phasing?: Phasing | null;\n  /** Window and door marks (W01, D01) by opening id. */\n  tags?: ReadonlyMap<string, string>;\n  /** Drawn on the rooms' white, under the walls' lines and the labels. */\n  under?: Item[];\n}\n\nexport interface PlanView {\n  items: Item[];\n  space: Space;\n  /** The building's own extent on paper, without labels. */\n  body: Box;\n  scale: number;\n}\n\nconst OUTER_LEAF = 102.5;\nconst INNER_LEAF = 100;\n\ntype Band = { from: number; to: number; fill: Fill };\n\nfunction add(p: Point, d: Point, k: number): Point {\n  return [p[0] + d[0] * k, p[1] + d[1] * k];\n}\n\nfunction along(a: Point, b: Point): Point {\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n  return [(b[0] - a[0]) / length, (b[1] - a[1]) / length];\n}\n\nfunction cross(p: Point, d: Point, q: Point, e: Point): Point | null {\n  const det = d[0] * e[1] - d[1] * e[0];\n  if (Math.abs(det) < 1e-9) {\n    return null;\n  }\n  const t = ((q[0] - p[0]) * e[1] - (q[1] - p[1]) * e[0]) / det;\n  return [p[0] + d[0] * t, p[1] + d[1] * t];\n}\n\n/** The bands a wall's thickness is drawn in, from its outer face in. */\nfunction bands(wall: ModelWall | null, muted: boolean, scale: number): Band[] {\n  const thickness = wall?.thickness ?? 0;\n  if (muted) {\n    return [{ from: 0, to: thickness, fill: \"#cfcfcf\" }];\n  }\n  if (scale > 60) {\n    return [\n      {\n        from: 0,\n        to: thickness,\n        fill: wall?.construction === \"stud\" ? \"#bdbdbd\" : \"#3c3c3c\",\n      },\n    ];\n  }\n  const brick: Fill = { hatch: \"brick\", bg: \"#ffffff\" };\n  switch (wall?.construction) {\n    case \"cavity\":\n    case \"filled-cavity\":\n      return [\n        { from: 0, to: OUTER_LEAF, fill: brick },\n        {\n          from: OUTER_LEAF,\n          to: thickness - INNER_LEAF,\n          fill:\n            wall.construction === \"filled-cavity\"\n              ? { hatch: \"insulation\", bg: \"#ffffff\" }\n              : \"#ffffff\",\n        },\n        {\n          from: thickness - INNER_LEAF,\n          to: thickness,\n          fill: { hatch: \"block\", bg: \"#ffffff\" },\n        },\n      ];\n    case \"timber\":\n      return [\n        { from: 0, to: OUTER_LEAF, fill: brick },\n        {\n          from: OUTER_LEAF + 50,\n          to: thickness,\n          fill: { hatch: \"insulation\", bg: \"#ffffff\" },\n        },\n      ];\n    case \"stud\":\n      return [{ from: 0, to: thickness, fill: { hatch: \"stud\" } }];\n    default:\n      return [{ from: 0, to: thickness, fill: brick }];\n  }\n}\n\n/**\n * Where edge `index` of a loop, `depth` in from its outer face, starts and\n * ends: mitred against the neighbours at the same depth into their walls.\n */\nexport function bandEnds(\n  loop: readonly LoopEdge[],\n  index: number,\n  depth: number,\n): [Point, Point] {\n  const count = loop.length;\n  const edge = loop[index] as LoopEdge;\n  const line = (which: LoopEdge, at: number): [Point, Point] => {\n    const thickness = which.wall?.thickness ?? 0;\n    const shift = -thickness / 2 + Math.min(at, thickness);\n    return [\n      add(which.a, inward(which.a, which.b), shift),\n      along(which.a, which.b),\n    ];\n  };\n  const [p, d] = line(edge, depth);\n  const ends: Point[] = [];\n  for (const [neighbour, vertex] of [\n    [loop[(index + count - 1) % count] as LoopEdge, edge.a],\n    [loop[(index + 1) % count] as LoopEdge, edge.b],\n  ] as const) {\n    const [q, e] = line(neighbour, depth);\n    const corner = cross(p, d, q, e);\n    const foot = add(\n      vertex,\n      inward(edge.a, edge.b),\n      -(edge.wall?.thickness ?? 0) / 2 +\n        Math.min(depth, edge.wall?.thickness ?? 0),\n    );\n    ends.push(\n      corner &&\n        Math.hypot(corner[0] - vertex[0], corner[1] - vertex[1]) <\n          4 * Math.max(edge.wall?.thickness ?? 0, 100)\n        ? corner\n        : foot,\n    );\n  }\n  return [ends[0] as Point, ends[1] as Point];\n}\n\nfunction pointInPolygon([x, y]: P, polygon: readonly P[]): boolean {\n  let inside = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const [xi, yi] = polygon[i] as P;\n    const [xj, yj] = polygon[j] as P;\n    if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\n      inside = !inside;\n    }\n  }\n  return inside;\n}\n\nfunction distanceToEdges(point: P, polygon: readonly P[]): number {\n  let best = Number.POSITIVE_INFINITY;\n  for (let index = 0; index < polygon.length; index++) {\n    const a = polygon[index] as P;\n    const b = polygon[(index + 1) % polygon.length] as P;\n    const dx = b[0] - a[0];\n    const dy = b[1] - a[1];\n    const t = Math.max(\n      0,\n      Math.min(\n        1,\n        ((point[0] - a[0]) * dx + (point[1] - a[1]) * dy) /\n          (dx * dx + dy * dy || 1),\n      ),\n    );\n    best = Math.min(\n      best,\n      Math.hypot(point[0] - (a[0] + dx * t), point[1] - (a[1] + dy * t)),\n    );\n  }\n  return best;\n}\n\n/** Points inside the polygon, the roomiest first: a grid ranked by\n * clearance to the edges, near enough the pole of inaccessibility. */\nexport function roomySpots(polygon: readonly P[], steps = 14): Point[] {\n  const xs = polygon.map((point) => point[0]);\n  const ys = polygon.map((point) => point[1]);\n  const [x0, x1, y0, y1] = [\n    Math.min(...xs),\n    Math.max(...xs),\n    Math.min(...ys),\n    Math.max(...ys),\n  ];\n  const spots: { at: Point; room: number }[] = [];\n  for (let i = 0; i <= steps; i++) {\n    for (let j = 0; j <= steps; j++) {\n      const at: Point = [\n        x0 + ((x1 - x0) * i) / steps,\n        y0 + ((y1 - y0) * j) / steps,\n      ];\n      if (pointInPolygon(at, polygon)) {\n        spots.push({ at, room: distanceToEdges(at, polygon) });\n      }\n    }\n  }\n  return spots.sort((a, b) => b.room - a.room).map((spot) => spot.at);\n}\n\nexport function boxInside(box: Box, polygon: readonly P[]): boolean {\n  return (\n    [\n      [box.x0, box.y0],\n      [box.x1, box.y0],\n      [box.x1, box.y1],\n      [box.x0, box.y1],\n    ] as P[]\n  ).every((corner) => pointInPolygon(corner, polygon));\n}\n\nexport function areaM2(polygon: readonly Point[]): number {\n  return Math.abs(signedArea(polygon)) / 1e6;\n}\n\n/** Text sizes on paper, mm: the same at every scale. */\nexport const TEXT = {\n  room: 2.5,\n  area: 2.0,\n  dim: 2.0,\n  tag: 1.8,\n  note: 2.2,\n};\n\nexport function planView(floor: ModelFloor, options: PlanOptions): PlanView {\n  const scale = options.scale;\n  const k = 1 / scale;\n  const muted = options.muted === true;\n  const ink = muted ? GREY : INK;\n  const pen = (w: number, extra: Partial<Stroke> = {}): Stroke => ({\n    w: muted ? Math.min(w, PEN.light) : w,\n    color: ink,\n    ...extra,\n  });\n  const at = (point: Point): P => [point[0] * k, point[1] * k];\n  const items: Item[] = [];\n  const space = new Space();\n  const pieces = options.phasing?.pieces ?? [];\n  const strip = (piece: PhasedPiece): Point[] => {\n    const n = inward(piece.a, piece.b);\n    const half = piece.thickness / 2;\n    return [\n      add(piece.a, n, half),\n      add(piece.b, n, half),\n      add(piece.b, n, -half),\n      add(piece.a, n, -half),\n    ];\n  };\n\n  const quad = (points: Point[], fill: Fill, layer: string): Item => ({\n    t: \"poly\",\n    pts: points.map(at),\n    closed: true,\n    fill,\n    layer,\n  });\n\n  // Internal walls: a strip each, run on past both ends so corners close;\n  // the rooms' white then trims whatever pokes into them.\n  const internal = floor.walls.filter((wall) => wall.kind === \"INTERNAL\");\n  for (const wall of internal) {\n    const u = along(wall.a, wall.b);\n    const n = inward(wall.a, wall.b);\n    const half = wall.thickness / 2;\n    const a = add(wall.a, u, -half);\n    const b = add(wall.b, u, half);\n    const fill: Fill = bands(wall, muted, scale)[0]?.fill ?? \"#cccccc\";\n    items.push(\n      quad(\n        [add(a, n, half), add(b, n, half), add(b, n, -half), add(a, n, -half)],\n        fill,\n        \"A-WALL-PATT\",\n      ),\n    );\n  }\n\n  // The outside walls, band by band, mitred round each loop.\n  for (const loop of floor.loops) {\n    loop.forEach((edge, index) => {\n      for (const band of bands(edge.wall, muted, scale)) {\n        const [s0, e0] = bandEnds(loop, index, band.from);\n        const [s1, e1] = bandEnds(loop, index, band.to);\n        items.push(quad([s0, e0, e1, s1], band.fill, \"A-WALL-PATT\"));\n      }\n    });\n  }\n\n  // What a proposal builds: hatched over the wall, piece by piece.\n  for (const piece of pieces.filter((p) => p.phase === \"new\")) {\n    items.push(\n      quad(strip(piece), { hatch: \"new\", bg: \"#ffffff\" }, \"A-WALL-NEWW\"),\n    );\n  }\n\n  // Clear the rooms back to paper.\n  for (const room of floor.rooms) {\n    items.push({\n      t: \"poly\",\n      pts: room.clear.map(at),\n      closed: true,\n      fill: \"#ffffff\",\n      layer: \"A-AREA\",\n    });\n  }\n\n  items.push(...(options.under ?? []));\n\n  // Walls no room holds would vanish under the rooms' white: draw them now.\n  for (const wall of floor.walls.filter((wall) => wall.rooms.length === 0)) {\n    const n = inward(wall.a, wall.b);\n    const half = wall.thickness / 2;\n    items.push(\n      quad(\n        [\n          add(wall.a, n, half),\n          add(wall.b, n, half),\n          add(wall.b, n, -half),\n          add(wall.a, n, -half),\n        ],\n        muted ? \"#cfcfcf\" : \"#3c3c3c\",\n        \"A-WALL\",\n      ),\n    );\n  }\n\n  // Linework: room faces and the outer face in the cut pen; the leaves and\n  // where walls meet in the fine pen.\n  const cut = pen(scale > 60 ? PEN.medium : PEN.cut);\n  for (const room of floor.rooms) {\n    room.clear.forEach((point, index) => {\n      // Offsetting can add corners, so match edges to walls by position.\n      const next = room.clear[(index + 1) % room.clear.length] as Point;\n      if (wallAlong(room, point, next)) {\n        items.push({\n          t: \"line\",\n          a: at(point),\n          b: at(next),\n          s: cut,\n          layer: \"A-WALL\",\n        });\n      }\n    });\n  }\n  for (const loop of floor.loops) {\n    loop.forEach((edge, index) => {\n      const thickness = edge.wall?.thickness ?? 0;\n      const [s0, e0] = bandEnds(loop, index, 0);\n      items.push({ t: \"line\", a: at(s0), b: at(e0), s: cut, layer: \"A-WALL\" });\n      const [s1, e1] = bandEnds(loop, index, thickness);\n      items.push({\n        t: \"line\",\n        a: at(s1),\n        b: at(e1),\n        s: pen(PEN.fine),\n        layer: \"A-WALL\",\n      });\n      if (!muted && scale <= 60) {\n        for (const band of bands(edge.wall, false, scale).slice(1)) {\n          const [s, e] = bandEnds(loop, index, band.from);\n          items.push({\n            t: \"line\",\n            a: at(s),\n            b: at(e),\n            s: pen(PEN.fine),\n            layer: \"A-WALL\",\n          });\n        }\n      }\n      space.addSegment(at(s0), at(e0), (thickness * k) / 2 + 0.3);\n    });\n  }\n  for (const wall of internal) {\n    space.addSegment(at(wall.a), at(wall.b), (wall.thickness * k) / 2 + 0.3);\n  }\n\n  // Openings: cut through, then drawn in.\n  for (const wall of floor.walls) {\n    for (const opening of wall.openings) {\n      items.push(...openingItems(wall, opening, scale, muted, at, space));\n      const tag = options.tags?.get(opening.id);\n      if (tag) {\n        const centre = add(\n          wall.a,\n          along(wall.a, wall.b),\n          opening.offset + opening.width / 2,\n        );\n        const inside = add(\n          centre,\n          wall.out,\n          -(wall.thickness / 2) -\n            2.5 * scale -\n            (opening.type === \"door\" ? opening.width : 0),\n        );\n        items.push(...tagItems(tag, at(inside), space));\n      }\n    }\n  }\n\n  // What a proposal takes out: dashed where it stood.\n  for (const piece of pieces.filter((p) => p.phase === \"demolished\")) {\n    items.push({\n      t: \"poly\",\n      pts: strip(piece).map(at),\n      closed: true,\n      s: { w: PEN.medium, color: RED, dash: [1.5, 1] },\n      fill: \"#ffffff\",\n      opacity: 0,\n      layer: \"A-WALL-DEMO\",\n    });\n  }\n\n  // Rooms named, with their clear area.\n  for (const room of floor.rooms) {\n    items.push(...roomLabel(room, at, space, muted));\n  }\n\n  const points = floor.loops.flatMap((loop) =>\n    loop.flatMap((_edge, index) => bandEnds(loop, index, 0)),\n  );\n  const all =\n    points.length > 0\n      ? points\n      : floor.walls.flatMap((wall) => [wall.a, wall.b]);\n  const xs = all.map((point) => point[0] * k);\n  const ys = all.map((point) => point[1] * k);\n  const body: Box = {\n    x0: Math.min(...xs),\n    y0: Math.min(...ys),\n    x1: Math.max(...xs),\n    y1: Math.max(...ys),\n  };\n  return { items, space, body, scale };\n}\n\n/** Whether a clear-outline edge runs along one of the room's walls. */\nfunction wallAlong(room: ModelRoom, a: Point, b: Point): boolean {\n  const mid: Point = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n  let best = Number.POSITIVE_INFINITY;\n  let walled = false;\n  room.outline.forEach((p, index) => {\n    const q = room.outline[(index + 1) % room.outline.length] as Point;\n    const d = distanceToEdges(mid, [p, q]);\n    if (d < best) {\n      best = d;\n      walled = room.edges[index] !== null;\n    }\n  });\n  return walled;\n}\n\nfunction openingItems(\n  wall: ModelWall,\n  opening: ModelWall[\"openings\"][number],\n  scale: number,\n  muted: boolean,\n  at: (point: Point) => P,\n  space: Space,\n): Item[] {\n  const items: Item[] = [];\n  const ink = muted ? GREY : INK;\n  const u = along(wall.a, wall.b);\n  const out = wall.out;\n  const half = wall.thickness / 2;\n  const s0 = Math.max(0, opening.offset);\n  const s1 = s0 + opening.width;\n  const point = (s: number, across: number): Point =>\n    add(add(wall.a, u, s), out, across);\n  const line = (\n    a: Point,\n    b: Point,\n    w: number,\n    extra: Partial<Stroke> = {},\n  ): Item => ({\n    t: \"line\",\n    a: at(a),\n    b: at(b),\n    s: { w: muted ? Math.min(w, PEN.light) : w, color: ink, ...extra },\n    layer: opening.type === \"window\" ? \"A-GLAZ\" : \"A-DOOR\",\n  });\n  const bleed = 0.4 * scale;\n  items.push({\n    t: \"poly\",\n    pts: [\n      point(s0, -half - bleed),\n      point(s1, -half - bleed),\n      point(s1, half + bleed),\n      point(s0, half + bleed),\n    ].map(at),\n    closed: true,\n    fill: \"#ffffff\",\n    layer: \"A-WALL\",\n  });\n  const jamb = scale > 60 ? PEN.medium : PEN.cut;\n  items.push(\n    line(point(s0, -half), point(s0, half), jamb),\n    line(point(s1, -half), point(s1, half), jamb),\n  );\n\n  if (opening.type === \"window\") {\n    const depth = Math.min(70, wall.thickness * 0.4);\n    const centre = half - Math.min(wall.thickness / 3, 110);\n    items.push(\n      line(\n        point(s0, centre - depth / 2),\n        point(s1, centre - depth / 2),\n        PEN.light,\n      ),\n      line(\n        point(s0, centre + depth / 2),\n        point(s1, centre + depth / 2),\n        PEN.light,\n      ),\n      line(point(s0, centre), point(s1, centre), PEN.fine),\n    );\n    if (scale <= 60) {\n      // The sill outside, the window board inside.\n      const sill = half + 40;\n      items.push(\n        line(point(s0 - 40, half), point(s0 - 40, sill), PEN.fine),\n        line(point(s0 - 40, sill), point(s1 + 40, sill), PEN.light),\n        line(point(s1 + 40, sill), point(s1 + 40, half), PEN.fine),\n        line(point(s0 - 20, -half), point(s0 - 20, -half - 25), PEN.fine),\n        line(point(s0 - 20, -half - 25), point(s1 + 20, -half - 25), PEN.fine),\n        line(point(s1 + 20, -half - 25), point(s1 + 20, -half), PEN.fine),\n      );\n    }\n  } else if (opening.type === \"door\") {\n    // The renderer's convention: hinge at the start (the end when flipped),\n    // swinging to the wall's right (+) or left (\u2212) side.\n    const side = opening.swing === \"right\" ? 1 : -1;\n    const n = inward(wall.a, wall.b);\n    const across = (out[0] * n[0] + out[1] * n[1]) * side; // in `out` terms\n    const face = across * half;\n    for (const [hingeS, farS] of doorLeaves(opening, s0, s1)) {\n      const hinge = point(hingeS, face);\n      const leafWidth = Math.abs(farS - hingeS);\n      const leafEnd = add(hinge, out, across * leafWidth);\n      const thick = Math.min(45, leafWidth * 0.06);\n      const toward = hingeS < farS ? 1 : -1;\n      items.push({\n        t: \"poly\",\n        pts: [\n          hinge,\n          leafEnd,\n          add(leafEnd, u, toward * thick),\n          add(hinge, u, toward * thick),\n        ].map(at),\n        closed: true,\n        fill: \"#ffffff\",\n        s: { w: muted ? PEN.fine : PEN.medium, color: ink },\n        layer: \"A-DOOR\",\n      });\n      items.push({\n        t: \"arc\",\n        c: at(hinge),\n        r: leafWidth / scale,\n        from: at(point(farS, face)),\n        to: at(leafEnd),\n        s: { w: PEN.fine, color: ink },\n        layer: \"A-DOOR\",\n      });\n      const corners = [\n        hinge,\n        leafEnd,\n        point(farS, face),\n        add(point(farS, face), out, across * leafWidth),\n      ];\n      const xs = corners.map((corner) => at(corner)[0]);\n      const ys = corners.map((corner) => at(corner)[1]);\n      space.addBox({\n        x0: Math.min(...xs),\n        y0: Math.min(...ys),\n        x1: Math.max(...xs),\n        y1: Math.max(...ys),\n      });\n    }\n  } else {\n    // An opening with no door: the head overhead, dashed.\n    items.push(\n      line(point(s0, -half), point(s1, -half), PEN.fine, { dash: [1, 0.7] }),\n      line(point(s0, half), point(s1, half), PEN.fine, { dash: [1, 0.7] }),\n    );\n  }\n  return items;\n}\n\n/** A window or door mark in a box, nudged until it's clear. */\nfunction tagItems(tag: string, at: P, space: Space): Item[] {\n  const tries: P[] = [at];\n  for (const d of [3, 6, 9]) {\n    tries.push(\n      [at[0] + d, at[1]],\n      [at[0] - d, at[1]],\n      [at[0], at[1] + d],\n      [at[0], at[1] - d],\n    );\n  }\n  for (const spot of tries) {\n    const text: Item = {\n      t: \"text\",\n      at: spot,\n      text: tag,\n      size: TEXT.tag,\n      anchor: \"middle\",\n      valign: \"middle\",\n      layer: \"A-ANNO-TAGS\",\n    };\n    const box = textBox(text);\n    const frame: Box = {\n      x0: box.x0 - 0.8,\n      y0: spot[1] - 1.6,\n      x1: box.x1 + 0.8,\n      y1: spot[1] + 1.6,\n    };\n    if (space.clear(frame) || spot === tries[tries.length - 1]) {\n      space.addBox(frame);\n      return [\n        {\n          t: \"poly\",\n          pts: [\n            [frame.x0, frame.y0],\n            [frame.x1, frame.y0],\n            [frame.x1, frame.y1],\n            [frame.x0, frame.y1],\n          ],\n          closed: true,\n          fill: \"#ffffff\",\n          s: { w: PEN.fine },\n          layer: \"A-ANNO-TAGS\",\n        },\n        text,\n      ];\n    }\n  }\n  return [];\n}\n\nfunction roomLabel(\n  room: ModelRoom,\n  at: (point: Point) => P,\n  space: Space,\n  muted: boolean,\n): Item[] {\n  const clear = room.clear.map(at);\n  if (clear.length < 3) {\n    return [];\n  }\n  const area = areaM2(room.clear);\n  const name = room.name.toUpperCase();\n  const color = muted ? GREY : INK;\n  for (const spot of roomySpots(clear)) {\n    const title: Extract<Item, { t: \"text\" }> = {\n      t: \"text\",\n      at: [spot[0], spot[1] - 0.4],\n      text: name,\n      size: TEXT.room,\n      anchor: \"middle\",\n      layer: \"A-ANNO-ROOM\",\n      color,\n    };\n    const size: Extract<Item, { t: \"text\" }> = {\n      t: \"text\",\n      at: [spot[0], spot[1] + 2.6],\n      text: `${area.toFixed(1)} m\u00B2`,\n      size: TEXT.area,\n      anchor: \"middle\",\n      layer: \"A-ANNO-ROOM\",\n      color,\n    };\n    const a = textBox(title);\n    const b = textBox(size);\n    const both: Box = {\n      x0: Math.min(a.x0, b.x0) - 0.6,\n      y0: a.y0 - 0.6,\n      x1: Math.max(a.x1, b.x1) + 0.6,\n      y1: b.y1 + 0.4,\n    };\n    if (boxInside(both, clear) && space.clear(both)) {\n      space.addBox(both);\n      return [title, size];\n    }\n  }\n  // Too small to hold its name: leave it to the schedule.\n  return [];\n}\n", "// Dimension strings as UK practice draws them: 45\u00B0 ticks, not arrowheads;\n// witness lines stopping short of the work; millimetres, no unit. Outside\n// each face, up to three strings run outward: the openings and piers, the\n// steps in the wall, then the overall. Inside, each room's clear width and\n// depth. Every figure is placed clear of the drawing and of every other\n// label, staggered or moved off the end of its line when it won't fit.\n\nimport type { Point } from \"../scene\";\nimport { type Box, type Item, type P, PEN, textBox } from \"./draw\";\nimport type { ModelFloor } from \"./model\";\nimport { type PlanView, TEXT, bandEnds, boxInside, roomySpots } from \"./plan\";\nimport type { Space } from \"./space\";\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** Mm on paper from the building to the first string, and between strings. */\nconst FIRST = 9;\nconst STEP = 7;\nconst TICK = 1.2;\nconst GAP = 1.5;\n\n/** The outward normal of each side, in y-down paper terms. */\nconst NORMAL: Record<Side, Point> = {\n  top: [0, -1],\n  bottom: [0, 1],\n  left: [-1, 0],\n  right: [1, 0],\n};\n\ninterface Station {\n  /** Along the side's axis, paper mm. */\n  s: number;\n  /** How far out the measured point is, paper mm, along the side's normal. */\n  reach: number;\n}\n\nfunction dedupe(stations: Station[], within = 0.5): Station[] {\n  const sorted = [...stations].sort((a, b) => a.s - b.s);\n  const out: Station[] = [];\n  for (const station of sorted) {\n    const last = out[out.length - 1];\n    if (last && station.s - last.s < within) {\n      last.reach = Math.max(last.reach, station.reach);\n    } else {\n      out.push({ ...station });\n    }\n  }\n  return out;\n}\n\nfunction formatMm(mm: number): string {\n  return String(Math.round(mm));\n}\n\n/**\n * One string of dimensions along `side`, `offset` mm out from the body: the\n * line, ticks, witness lines back to the work, and each figure placed clear.\n */\nfunction dimensionString(\n  side: Side,\n  stations: Station[],\n  line: number,\n  scale: number,\n  space: Space,\n  witnessFrom: (station: Station) => number,\n): Item[] {\n  const items: Item[] = [];\n  const horizontal = side === \"top\" || side === \"bottom\";\n  const sign = side === \"top\" || side === \"left\" ? -1 : 1;\n  // Paper point for (along, across): along the axis, across at a coordinate.\n  const pt = (s: number, across: number): P =>\n    horizontal ? [s, across] : [across, s];\n  const first = stations[0] as Station;\n  const last = stations[stations.length - 1] as Station;\n  items.push({\n    t: \"line\",\n    a: pt(first.s - 2, line),\n    b: pt(last.s + 2, line),\n    s: { w: PEN.fine },\n    layer: \"A-ANNO-DIMS\",\n  });\n  space.addSegment(pt(first.s - 2, line), pt(last.s + 2, line), 0.2);\n  for (const station of stations) {\n    const from = witnessFrom(station);\n    items.push({\n      t: \"line\",\n      a: pt(station.s, from),\n      b: pt(station.s, line + sign * 1.5),\n      s: { w: PEN.fine },\n      layer: \"A-ANNO-DIMS\",\n    });\n    // The tick leans the same way on every string: bottom-left to top-right.\n    const d = TICK / Math.SQRT2;\n    items.push({\n      t: \"line\",\n      a: horizontal ? [station.s - d, line + d] : [line - d, station.s + d],\n      b: horizontal ? [station.s + d, line - d] : [line + d, station.s - d],\n      s: { w: PEN.medium },\n      layer: \"A-ANNO-DIMS\",\n    });\n  }\n  // Figures: above the line (outside it, for strings reading from the\n  // right), rotated to read from the bottom or the right of the sheet.\n  const rot = horizontal ? 0 : -90;\n  // Above the line as it reads: up the sheet, or left for a vertical one.\n  const above = -1;\n  let previousEnd = Number.NEGATIVE_INFINITY;\n  for (let index = 0; index + 1 < stations.length; index++) {\n    const a = stations[index] as Station;\n    const b = stations[index + 1] as Station;\n    const length = b.s - a.s;\n    const text = formatMm(length * scale);\n    const mid = (a.s + b.s) / 2;\n    const rows = [0.7, 0.7 + TEXT.dim * 1.15];\n    const candidates: { s: number; row: number; leader: boolean }[] = [];\n    for (const row of rows) {\n      candidates.push({ s: mid, row, leader: row !== rows[0] });\n    }\n    const width = textBox({\n      t: \"text\",\n      at: [0, 0],\n      text,\n      size: TEXT.dim,\n      layer: \"\",\n    }).x1;\n    // Along its own span, either side of the middle, when there's room.\n    for (const shift of [0.8, 1.6, 2.4]) {\n      for (const sign of [1, -1]) {\n        const s = mid + sign * shift * width;\n        if (s - width / 2 > a.s + 0.4 && s + width / 2 < b.s - 0.4) {\n          candidates.push({ s, row: rows[0] as number, leader: false });\n        }\n      }\n    }\n    // Off either end of the span, further each time, on either row.\n    for (const step of [1, 2, 3]) {\n      for (const row of rows) {\n        candidates.push(\n          {\n            s: b.s + width / 2 + 1.2 + (step - 1) * (width + 1),\n            row,\n            leader: true,\n          },\n          {\n            s: a.s - width / 2 - 1.2 - (step - 1) * (width + 1),\n            row,\n            leader: true,\n          },\n        );\n      }\n    }\n    let chosen: Extract<Item, { t: \"text\" }> | null = null;\n    let chosenBox: Box | null = null;\n    let chosenSpot: (typeof candidates)[number] | null = null;\n    for (const candidate of candidates) {\n      const fits = candidate.leader || width + 0.8 <= length;\n      const across = line + above * candidate.row;\n      const item: Extract<Item, { t: \"text\" }> = {\n        t: \"text\",\n        at: pt(candidate.s, across),\n        text,\n        size: TEXT.dim,\n        anchor: \"middle\",\n        rot,\n        layer: \"A-ANNO-DIMS\",\n      };\n      const tb = textBox(item);\n      const start = candidate.s - width / 2;\n      const ordered = candidate.leader || start > previousEnd + 0.4;\n      if (fits && ordered && space.clear(tb)) {\n        chosen = item;\n        chosenBox = tb;\n        chosenSpot = candidate;\n        break;\n      }\n    }\n    if (!chosen) {\n      // Nothing clear: the second row it is, over its own span.\n      const across = line + above * (rows[1] as number);\n      chosen = {\n        t: \"text\",\n        at: pt(mid, across),\n        text,\n        size: TEXT.dim,\n        anchor: \"middle\",\n        rot,\n        layer: \"A-ANNO-DIMS\",\n      };\n      chosenBox = textBox(chosen);\n      chosenSpot = { s: mid, row: rows[1] as number, leader: true };\n    }\n    items.push(chosen);\n    space.addBox(chosenBox as Box);\n    previousEnd = Math.max(previousEnd, (chosenSpot?.s ?? mid) + width / 2);\n    if (chosenSpot?.leader) {\n      // A short leader from the span's middle to the moved figure.\n      const tip = chosenSpot.s;\n      items.push({\n        t: \"line\",\n        a: pt(mid, line),\n        b: pt(tip, line + above * (chosenSpot.row - 0.5)),\n        s: { w: PEN.fine },\n        layer: \"A-ANNO-DIMS\",\n      });\n    }\n  }\n  return items;\n}\n\n/** Whether a ray from `from` along `d` hits any of the segments. */\nfunction blocked(from: Point, d: Point, segments: [Point, Point][]): boolean {\n  for (const [a, b] of segments) {\n    const e: Point = [b[0] - a[0], b[1] - a[1]];\n    const det = d[0] * -e[1] + e[0] * d[1];\n    if (Math.abs(det) < 1e-9) {\n      continue;\n    }\n    const rx = a[0] - from[0];\n    const ry = a[1] - from[1];\n    const t = (rx * -e[1] + e[0] * ry) / det;\n    const u = (d[0] * ry - d[1] * rx) / det;\n    if (t > 1 && u >= 0 && u <= 1) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/** The outer faces seen from a side, as stations: the corners of each face\n * that looks that way with nothing in front of it, and its openings. */\nfunction sideStations(\n  floor: ModelFloor,\n  side: Side,\n  k: number,\n): { corners: Station[]; openings: Station[] } {\n  const normal = NORMAL[side];\n  const horizontal = side === \"top\" || side === \"bottom\";\n  const project = (point: Point): Station => ({\n    s: (horizontal ? point[0] : point[1]) * k,\n    reach: (point[0] * normal[0] + point[1] * normal[1]) * k,\n  });\n  const faces = floor.loops.flatMap((loop) =>\n    loop.map((edge, index) => ({ edge, ends: bandEnds(loop, index, 0) })),\n  );\n  const segments = faces.map((face) => face.ends);\n  const corners: Station[] = [];\n  const openings: Station[] = [];\n  for (const { edge, ends } of faces) {\n    const wall = edge.wall;\n    if (!wall) {\n      continue;\n    }\n    const facing = wall.out[0] * normal[0] + wall.out[1] * normal[1];\n    if (facing < 0.9) {\n      continue;\n    }\n    const [a, b] = ends;\n    const mid: Point = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n    const others = segments.filter((segment) => segment !== ends);\n    if (blocked(mid, normal, others)) {\n      continue;\n    }\n    corners.push(project(a), project(b));\n    const length =\n      Math.hypot(wall.b[0] - wall.a[0], wall.b[1] - wall.a[1]) || 1;\n    const u: Point = [\n      (wall.b[0] - wall.a[0]) / length,\n      (wall.b[1] - wall.a[1]) / length,\n    ];\n    const half = wall.thickness / 2;\n    for (const opening of wall.openings) {\n      for (const s of [opening.offset, opening.offset + opening.width]) {\n        openings.push(\n          project([\n            wall.a[0] + u[0] * s + wall.out[0] * half,\n            wall.a[1] + u[1] * s + wall.out[1] * half,\n          ]),\n        );\n      }\n    }\n  }\n  return { corners, openings };\n}\n\n/** Running, step and overall strings round the outside of a plan. */\nexport function externalDimensions(view: PlanView, floor: ModelFloor): Item[] {\n  const items: Item[] = [];\n  const k = 1 / view.scale;\n  for (const side of [\"bottom\", \"right\", \"top\", \"left\"] as Side[]) {\n    const { corners, openings } = sideStations(floor, side, k);\n    if (corners.length < 2) {\n      continue;\n    }\n    const sign = side === \"top\" || side === \"left\" ? -1 : 1;\n    const edge =\n      side === \"top\"\n        ? view.body.y0\n        : side === \"bottom\"\n          ? view.body.y1\n          : side === \"left\"\n            ? view.body.x0\n            : view.body.x1;\n    const all = dedupe(corners);\n    const overall = [all[0] as Station, all[all.length - 1] as Station];\n    const strings: Station[][] = [];\n    // Openings with the corners of the walls they sit in.\n    if (openings.length > 0) {\n      strings.push(dedupe([...corners, ...openings]));\n    }\n    if (all.length > 2) {\n      strings.push(all);\n    }\n    strings.push(overall);\n    // The same string twice adds nothing.\n    const unique = strings.filter(\n      (string, index) =>\n        index === 0 ||\n        string.length !== (strings[index - 1] as Station[]).length,\n    );\n    unique.forEach((string, index) => {\n      const line = edge + sign * (FIRST + STEP * index);\n      items.push(\n        ...dimensionString(\n          side,\n          string,\n          line,\n          view.scale,\n          view.space,\n          (station) =>\n            index === 0\n              ? sign * (station.reach + GAP)\n              : line - sign * (STEP - 1.5),\n        ),\n      );\n    });\n  }\n  return items;\n}\n\n/** Where a horizontal or vertical line through `at` crosses the polygon,\n * as the span of the polygon around `at` on that line. */\nfunction spanThrough(\n  polygon: readonly P[],\n  at: P,\n  horizontal: boolean,\n): [number, number] | null {\n  const hits: number[] = [];\n  const c = horizontal ? at[1] : at[0];\n  for (let index = 0; index < polygon.length; index++) {\n    const a = polygon[index] as P;\n    const b = polygon[(index + 1) % polygon.length] as P;\n    const [ac, bc] = horizontal ? [a[1], b[1]] : [a[0], b[0]];\n    if ((ac <= c && bc > c) || (bc <= c && ac > c)) {\n      const t = (c - ac) / (bc - ac);\n      hits.push(\n        horizontal ? a[0] + (b[0] - a[0]) * t : a[1] + (b[1] - a[1]) * t,\n      );\n    }\n  }\n  hits.sort((x, y) => x - y);\n  const v = horizontal ? at[0] : at[1];\n  for (let index = 0; index + 1 < hits.length; index += 2) {\n    const lo = hits[index] as number;\n    const hi = hits[index + 1] as number;\n    if (lo <= v && v <= hi) {\n      return [lo, hi];\n    }\n  }\n  return null;\n}\n\n/** Each room's clear width and depth, inside it, clear of its label. */\nexport function internalDimensions(view: PlanView, floor: ModelFloor): Item[] {\n  const items: Item[] = [];\n  const k = 1 / view.scale;\n  for (const room of floor.rooms) {\n    const clear: P[] = room.clear.map(([x, y]) => [x * k, y * k]);\n    if (clear.length < 3) {\n      continue;\n    }\n    for (const horizontal of [true, false]) {\n      const spots = roomySpots(clear as Point[], 10);\n      let placed = false;\n      for (const spot of spots) {\n        const span = spanThrough(clear, spot, horizontal);\n        if (!span || span[1] - span[0] < 14) {\n          continue;\n        }\n        const [lo, hi] = span;\n        const across = horizontal ? spot[1] : spot[0];\n        const pt = (s: number, c: number): P => (horizontal ? [s, c] : [c, s]);\n        const text = formatMm((hi - lo) * view.scale);\n        const label: Extract<Item, { t: \"text\" }> = {\n          t: \"text\",\n          at: pt((lo + hi) / 2, across - 0.7),\n          text,\n          size: TEXT.dim,\n          anchor: \"middle\",\n          rot: horizontal ? 0 : -90,\n          layer: \"A-ANNO-DIMS\",\n        };\n        const tb = textBox(label);\n        const lineBox: Box = horizontal\n          ? { x0: lo + 3, y0: across - 0.3, x1: hi - 3, y1: across + 0.3 }\n          : { x0: across - 0.3, y0: lo + 3, x1: across + 0.3, y1: hi - 3 };\n        if (\n          !boxInside(tb, clear as Point[]) ||\n          !view.space.clear(tb) ||\n          !view.space.clear(lineBox)\n        ) {\n          continue;\n        }\n        const d = TICK / Math.SQRT2;\n        items.push({\n          t: \"line\",\n          a: pt(lo, across),\n          b: pt(hi, across),\n          s: { w: PEN.fine },\n          layer: \"A-ANNO-DIMS\",\n        });\n        for (const s of [lo, hi]) {\n          items.push({\n            t: \"line\",\n            a: horizontal ? [s - d, across + d] : [across - d, s + d],\n            b: horizontal ? [s + d, across - d] : [across + d, s - d],\n            s: { w: PEN.medium },\n            layer: \"A-ANNO-DIMS\",\n          });\n        }\n        items.push(label);\n        view.space.addBox(tb);\n        view.space.addBox(lineBox);\n        placed = true;\n        break;\n      }\n      if (!placed) {\n        continue;\n      }\n    }\n  }\n  return items;\n}\n", "// The roof the elevations and section draw, behind one small interface. The\n// editor passes the 3D view's roof (modelroof.ts); without its settings the\n// fallback here gables each rectangle of the top storey, and either way a\n// lower storey sticking out gets a flat roof with a fascia.\n\nimport type { Point } from \"../scene\";\nimport {\n  type Building,\n  FLOOR_ZONE_MM,\n  type ModelFloor,\n  outerFace,\n} from \"./model\";\n\nexport type Point3 = readonly [number, number, number];\n\n/** A planar piece of roof in plan millimetres, z up from ground floor level. */\nexport interface RoofFace {\n  points: Point3[];\n  /** A slope, a gable end (wall), or a flat roof's fascia. */\n  kind: \"slope\" | \"gable\" | \"fascia\" | \"flat\";\n}\n\n/** What a roof can take from the drawings: which way the front faces. */\nexport interface RoofHints {\n  front?: Point | null;\n}\n\n/** Anything that can roof the building: the default below, or #3517's. */\nexport type RoofSource = (building: Building, hints?: RoofHints) => RoofFace[];\n\nexport const PITCH_DEG = 40;\nconst EAVES_OVERHANG = 300;\nconst VERGE_OVERHANG = 150;\nconst FASCIA = 225;\n\n/** Wall plate height of a floor: the top of its walls. */\nexport function wallTop(floor: ModelFloor): number {\n  return floor.base + floor.ceiling + FLOOR_ZONE_MM;\n}\n\nfunction inside([x, y]: Point, polygon: readonly Point[]): boolean {\n  let hit = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const [xi, yi] = polygon[i] as Point;\n    const [xj, yj] = polygon[j] as Point;\n    if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\n      hit = !hit;\n    }\n  }\n  return hit;\n}\n\n/** The floor's main direction: its longest wall's, folded into 0\u201390\u00B0. */\nfunction axisOf(floor: ModelFloor): number {\n  let best = 0;\n  let angle = 0;\n  for (const wall of floor.walls) {\n    const length = Math.hypot(wall.b[0] - wall.a[0], wall.b[1] - wall.a[1]);\n    if (length > best) {\n      best = length;\n      angle = Math.atan2(wall.b[1] - wall.a[1], wall.b[0] - wall.a[0]);\n    }\n  }\n  return ((angle % (Math.PI / 2)) + Math.PI / 2) % (Math.PI / 2);\n}\n\ninterface Rect {\n  x0: number;\n  y0: number;\n  x1: number;\n  y1: number;\n}\n\n/** A footprint cut into rectangles, biggest first, on its own axes. */\nexport function rectangles(\n  polygons: readonly Point[][],\n  minSide = 1500,\n): Rect[] {\n  const xs = [...new Set(polygons.flat().map((p) => Math.round(p[0])))].sort(\n    (a, b) => a - b,\n  );\n  const ys = [...new Set(polygons.flat().map((p) => Math.round(p[1])))].sort(\n    (a, b) => a - b,\n  );\n  const filled = xs.slice(0, -1).map((x, i) =>\n    ys.slice(0, -1).map((y, j) => {\n      const centre: Point = [\n        (x + (xs[i + 1] as number)) / 2,\n        (y + (ys[j + 1] as number)) / 2,\n      ];\n      return polygons.some((polygon) => inside(centre, polygon));\n    }),\n  );\n  const out: Rect[] = [];\n  for (;;) {\n    let best: {\n      i0: number;\n      j0: number;\n      i1: number;\n      j1: number;\n      area: number;\n    } | null = null;\n    for (let i0 = 0; i0 < filled.length; i0++) {\n      for (let j0 = 0; j0 < (filled[0]?.length ?? 0); j0++) {\n        if (!filled[i0]?.[j0]) {\n          continue;\n        }\n        let jMax = (filled[0]?.length ?? 0) - 1;\n        for (let i1 = i0; i1 < filled.length && filled[i1]?.[j0]; i1++) {\n          let j1 = j0;\n          while (j1 + 1 <= jMax && filled[i1]?.[j1 + 1]) {\n            j1++;\n          }\n          jMax = Math.min(jMax, j1);\n          const area =\n            ((xs[i1 + 1] as number) - (xs[i0] as number)) *\n            ((ys[jMax + 1] as number) - (ys[j0] as number));\n          if (!best || area > best.area) {\n            best = { i0, j0, i1, j1: jMax, area };\n          }\n        }\n      }\n    }\n    if (!best) {\n      break;\n    }\n    const rect = {\n      x0: xs[best.i0] as number,\n      y0: ys[best.j0] as number,\n      x1: xs[best.i1 + 1] as number,\n      y1: ys[best.j1 + 1] as number,\n    };\n    for (let i = best.i0; i <= best.i1; i++) {\n      for (let j = best.j0; j <= best.j1; j++) {\n        (filled[i] as boolean[])[j] = false;\n      }\n    }\n    if (Math.min(rect.x1 - rect.x0, rect.y1 - rect.y0) >= minSide) {\n      out.push(rect);\n    }\n  }\n  return out;\n}\n\nfunction turn([x, y]: Point, angle: number): Point {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  return [x * cos - y * sin, x * sin + y * cos];\n}\n\n/** A gabled roof over a rectangle (in the turned frame), the ridge along\n * x when `along`, else along y. */\nfunction gabled(\n  rect: Rect,\n  eaves: number,\n  angle: number,\n  along: boolean,\n): RoofFace[] {\n  const tan = Math.tan((PITCH_DEG * Math.PI) / 180);\n  const back = (x: number, y: number, z: number): Point3 => {\n    const [px, py] = turn([x, y], angle);\n    return [px, py, z];\n  };\n  if (along) {\n    const x0 = rect.x0 - VERGE_OVERHANG;\n    const x1 = rect.x1 + VERGE_OVERHANG;\n    const y0 = rect.y0 - EAVES_OVERHANG;\n    const y1 = rect.y1 + EAVES_OVERHANG;\n    const ym = (rect.y0 + rect.y1) / 2;\n    // The slopes run on past the wall plate and drop to the fascia.\n    const ridge = eaves + ((rect.y1 - rect.y0) / 2) * tan;\n    const fascia = eaves - EAVES_OVERHANG * tan;\n    return [\n      {\n        kind: \"slope\",\n        points: [\n          back(x0, y0, fascia),\n          back(x1, y0, fascia),\n          back(x1, ym, ridge),\n          back(x0, ym, ridge),\n        ],\n      },\n      {\n        kind: \"slope\",\n        points: [\n          back(x0, y1, fascia),\n          back(x1, y1, fascia),\n          back(x1, ym, ridge),\n          back(x0, ym, ridge),\n        ],\n      },\n      {\n        kind: \"gable\",\n        points: [\n          back(rect.x0, rect.y0, eaves),\n          back(rect.x0, rect.y1, eaves),\n          back(rect.x0, ym, ridge),\n        ],\n      },\n      {\n        kind: \"gable\",\n        points: [\n          back(rect.x1, rect.y0, eaves),\n          back(rect.x1, rect.y1, eaves),\n          back(rect.x1, ym, ridge),\n        ],\n      },\n    ];\n  }\n  const swapped = gabled(\n    { x0: rect.y0, y0: -rect.x1, x1: rect.y1, y1: -rect.x0 },\n    eaves,\n    0,\n    true,\n  );\n  return swapped.map((face) => ({\n    ...face,\n    points: face.points.map(([x, y, z]) => {\n      const [px, py] = turn([-y, x], angle);\n      return [px, py, z] as Point3;\n    }),\n  }));\n}\n\n/** The default roof: pitched over the top of each storey nothing sits on,\n * flat with a fascia over lower storeys' outshots. */\nexport const simpleRoof: RoofSource = (building, hints) => {\n  const faces = outshots(building);\n  const floor = building.floors[building.floors.length - 1];\n  if (!floor) {\n    return faces;\n  }\n  const angle = axisOf(floor);\n  const local = floor.loops.map((loop) =>\n    outerFace(loop).map((point) => turn(point, -angle)),\n  );\n  // The main block's ridge runs along the front, as a UK house's does;\n  // anything behind it (an outrigger) runs on its own long axis.\n  const front = hints?.front ? turn(hints.front, -angle) : null;\n  rectangles(local).forEach((rect, index) => {\n    const long = rect.x1 - rect.x0 >= rect.y1 - rect.y0;\n    const along =\n      index === 0 && front ? Math.abs(front[1]) > Math.abs(front[0]) : long;\n    faces.push(...gabled(rect, wallTop(floor), angle, along));\n  });\n  return faces;\n};\n\n/** Where a storey sticks out past the one above (a rear extension, say):\n * its flat roof, and a fascia along each edge the storey above doesn't\n * cover. */\nexport function outshots(building: Building): RoofFace[] {\n  const faces: RoofFace[] = [];\n  const floors = building.floors;\n  floors.forEach((floor, index) => {\n    const above = floors[index + 1];\n    if (!above) {\n      return;\n    }\n    const top = wallTop(floor);\n    const outlines = floor.loops.map(outerFace);\n    const upper = above.loops.map(outerFace);\n    for (const outline of outlines) {\n      outline.forEach((a, i) => {\n        const b = outline[(i + 1) % outline.length] as Point;\n        const mid: Point = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n        const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n        // Just inside the edge and just outside: under the storey above\n        // either way, it has no roof edge of its own.\n        const covered = [200, -200].some((by) => {\n          const probe: Point = [\n            mid[0] - ((b[1] - a[1]) / length) * by,\n            mid[1] + ((b[0] - a[0]) / length) * by,\n          ];\n          return upper.some((polygon) => inside(probe, polygon));\n        });\n        if (covered) {\n          return;\n        }\n        faces.push({\n          kind: \"fascia\",\n          points: [\n            [a[0], a[1], top],\n            [b[0], b[1], top],\n            [b[0], b[1], top + FASCIA],\n            [a[0], a[1], top + FASCIA],\n          ],\n        });\n      });\n      faces.push({\n        kind: \"flat\",\n        points: outline.map(([x, y]) => [x, y, top + FASCIA] as Point3),\n      });\n    }\n  });\n  return faces;\n}\n", "// Elevations projected from the plan and the storey heights: every outside\n// face that looks towards the viewer, drawn far to near so the nearer hide\n// the further, the nearest plane in a heavier pen, openings with frames and\n// sills, the roof, a ground line, and level datums down the side.\n\nimport type { Point } from \"../scene\";\nimport { INK, type Item, type P, PEN, type Stroke } from \"./draw\";\nimport { shade } from \"../iso\";\nimport type { Building, ModelWall } from \"./model\";\nimport { bandEnds } from \"./plan\";\nimport { type Point3, type RoofFace, wallTop } from \"./roof\";\n\n/** Ground level below the ground floor's finished floor, mm. */\nexport const GROUND_MM = 150;\n\nexport interface Facing {\n  /** The direction the faces look, in plan (y down). */\n  normal: Point;\n  /** \"Front elevation\", \"North-east elevation\" and so on. */\n  title: string;\n}\n\ninterface Face {\n  depth: number;\n  near: boolean;\n  items: (pen: Stroke) => Item[];\n  outline: P[];\n}\n\nconst COMPASS = [\n  \"North\",\n  \"North-east\",\n  \"East\",\n  \"South-east\",\n  \"South\",\n  \"South-west\",\n  \"West\",\n  \"North-west\",\n];\n\nfunction inside([x, y]: P, polygon: readonly P[]): boolean {\n  let hit = false;\n  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n    const [xi, yi] = polygon[i] as P;\n    const [xj, yj] = polygon[j] as P;\n    if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {\n      hit = !hit;\n    }\n  }\n  return hit;\n}\n\n/** The compass point a plan direction faces, given north's plan bearing. */\nexport function compassOf(normal: Point, north: number): string {\n  // Plan bearing of the normal, clockwise from up.\n  const bearing = (Math.atan2(normal[0], -normal[1]) * 180) / Math.PI;\n  const compass = (((bearing - north) % 360) + 360) % 360;\n  return COMPASS[Math.round(compass / 45) % 8] as string;\n}\n\n/** The four sides of the building to draw, on its own axes. */\nexport function facings(\n  building: Building,\n  frontNormal: Point | null,\n): Facing[] {\n  // The main axis: the longest outside wall's direction.\n  let axis: Point = [1, 0];\n  let best = 0;\n  for (const floor of building.floors) {\n    for (const wall of floor.walls) {\n      const length = Math.hypot(wall.b[0] - wall.a[0], wall.b[1] - wall.a[1]);\n      if (wall.kind !== \"INTERNAL\" && length > best) {\n        best = length;\n        axis = [\n          (wall.b[0] - wall.a[0]) / length,\n          (wall.b[1] - wall.a[1]) / length,\n        ];\n      }\n    }\n  }\n  // Front first when the entrance says which it is, then rear, then the\n  // sides as you'd see them standing at the front: left, then right.\n  let front: Point = [-axis[1], axis[0]];\n  if (frontNormal) {\n    const candidates: Point[] = [\n      front,\n      [-front[0], -front[1]],\n      axis,\n      [-axis[0], -axis[1]],\n    ];\n    front = candidates.reduce((a, b) =>\n      b[0] * frontNormal[0] + b[1] * frontNormal[1] >\n      a[0] * frontNormal[0] + a[1] * frontNormal[1]\n        ? b\n        : a,\n    );\n  }\n  const right: Point = [front[1], -front[0]];\n  const sides: [Point, string][] = [\n    [front, \"Front\"],\n    [[-front[0], -front[1]], \"Rear\"],\n    [[-right[0], -right[1]], \"Left side\"],\n    [right, \"Right side\"],\n  ];\n  return sides.map(([normal, name], index) => {\n    const compass =\n      building.north === null ? \"\" : compassOf(normal, building.north);\n    let title = `Elevation ${String.fromCharCode(65 + index)}`;\n    if (frontNormal) {\n      title = compass ? `${name} (${compass}) elevation` : `${name} elevation`;\n    } else if (compass) {\n      title = `${compass} elevation`;\n    }\n    return { normal, title };\n  });\n}\n\n/** The entrance's direction: the outside door into a hall, or any outside door. */\nexport function entranceNormal(building: Building): Point | null {\n  const ground = building.floors[0];\n  if (!ground) {\n    return null;\n  }\n  const outside = ground.walls.filter(\n    (wall) =>\n      wall.kind !== \"INTERNAL\" && wall.openings.some((o) => o.type === \"door\"),\n  );\n  const hall = outside.find((wall) =>\n    wall.rooms.some((id) =>\n      /hall|entr|porch|lobby/i.test(\n        ground.rooms.find((room) => room.id === id)?.name ?? \"\",\n      ),\n    ),\n  );\n  return (hall ?? outside[0])?.out ?? null;\n}\n\nexport interface ElevationOptions {\n  scale: number;\n  roof: RoofFace[];\n  /** Window and door marks by opening id, written under each opening. */\n  tags?: ReadonlyMap<string, string>;\n  /** Walls drawn in the new-work colour, by id. */\n  added?: ReadonlySet<string>;\n  /** Faces a measure treats, toned in its colour: `floorId:wallId` \u2192 colour. */\n  highlight?: ReadonlyMap<string, string>;\n  /** Filled in with the middle of each highlighted face, on paper. */\n  anchors?: Map<string, P>;\n}\n\nfunction openingItems(\n  wall: ModelWall,\n  opening: ModelWall[\"openings\"][number],\n  base: number,\n  project: (point: Point, z: number) => P,\n  k: number,\n  tag: string | undefined,\n): Item[] {\n  const length = Math.hypot(wall.b[0] - wall.a[0], wall.b[1] - wall.a[1]) || 1;\n  const u: Point = [\n    (wall.b[0] - wall.a[0]) / length,\n    (wall.b[1] - wall.a[1]) / length,\n  ];\n  const half = wall.thickness / 2;\n  const at = (s: number): Point => [\n    wall.a[0] + u[0] * s + wall.out[0] * half,\n    wall.a[1] + u[1] * s + wall.out[1] * half,\n  ];\n  const sill = opening.type === \"window\" ? (opening.sill ?? 900) : 0;\n  const z0 = base + sill;\n  const z1 = z0 + opening.height;\n  const a = project(at(opening.offset), z0);\n  const b = project(at(opening.offset + opening.width), z1);\n  const x0 = Math.min(a[0], b[0]);\n  const x1 = Math.max(a[0], b[0]);\n  const y0 = Math.min(a[1], b[1]);\n  const y1 = Math.max(a[1], b[1]);\n  if (x1 - x0 < 0.3) {\n    return [];\n  }\n  const rect = (\n    l: number,\n    t: number,\n    r: number,\n    bt: number,\n    w: number,\n    fill?: string,\n  ): Item => ({\n    t: \"poly\",\n    pts: [\n      [l, t],\n      [r, t],\n      [r, bt],\n      [l, bt],\n    ],\n    closed: true,\n    s: { w, color: INK },\n    ...(fill ? { fill } : {}),\n    layer: opening.type === \"window\" ? \"A-GLAZ-ELEV\" : \"A-DOOR-ELEV\",\n  });\n  const frame = 60 * k;\n  const items: Item[] = [rect(x0, y0, x1, y1, PEN.light, \"#ffffff\")];\n  if (x1 - x0 > 2 * frame && y1 - y0 > 2 * frame) {\n    items.push(\n      rect(x0 + frame, y0 + frame, x1 - frame, y1 - frame, PEN.fine, \"#eef2f4\"),\n    );\n  }\n  if (opening.type === \"window\") {\n    // Casements: a mullion each 600-odd mm, and the sill below.\n    const panes = Math.max(1, Math.round(opening.width / 650));\n    for (let index = 1; index < panes; index++) {\n      const x = x0 + ((x1 - x0) * index) / panes;\n      items.push({\n        t: \"line\",\n        a: [x, y0 + frame],\n        b: [x, y1 - frame],\n        s: { w: PEN.light },\n        layer: \"A-GLAZ-ELEV\",\n      });\n    }\n    if (opening.height > 900) {\n      const y = y0 + (y1 - y0) * 0.3;\n      items.push({\n        t: \"line\",\n        a: [x0 + frame, y],\n        b: [x1 - frame, y],\n        s: { w: PEN.fine },\n        layer: \"A-GLAZ-ELEV\",\n      });\n    }\n    items.push(\n      rect(x0 - 40 * k, y1, x1 + 40 * k, y1 + 50 * k, PEN.fine, \"#ffffff\"),\n    );\n  } else if (opening.type === \"door\") {\n    items.push({\n      t: \"line\",\n      a: [x0 + frame, y0 + (y1 - y0) * 0.45],\n      b: [x1 - frame, y0 + (y1 - y0) * 0.45],\n      s: { w: PEN.fine },\n      layer: \"A-DOOR-ELEV\",\n    });\n    items.push({\n      t: \"circle\",\n      c: [\n        opening.flip ? x0 + frame * 2.2 : x1 - frame * 2.2,\n        y0 + (y1 - y0) * 0.5,\n      ],\n      r: 0.35,\n      fill: INK,\n      layer: \"A-DOOR-ELEV\",\n    });\n  }\n  if (tag) {\n    items.push({\n      t: \"text\",\n      at: [(x0 + x1) / 2, y0 - 1.6],\n      text: tag,\n      size: 1.8,\n      anchor: \"middle\",\n      layer: \"A-ANNO-TAGS\",\n    });\n  }\n  return items;\n}\n\n/** One elevation, on paper: x across the face, y down, ground at y=+150/scale. */\nexport function elevationView(\n  building: Building,\n  facing: Facing,\n  options: ElevationOptions,\n): Item[] {\n  const k = 1 / options.scale;\n  const f = facing.normal;\n  const right: Point = [f[1], -f[0]];\n  const across = (p: Point) => p[0] * right[0] + p[1] * right[1];\n  const depthOf = (p: Point) => p[0] * f[0] + p[1] * f[1];\n  const project = (p: Point, z: number): P => [across(p) * k, -z * k];\n  const faces: Face[] = [];\n  const keyed: { key: string; at: P; depth: number }[] = [];\n\n  let nearest = Number.NEGATIVE_INFINITY;\n  for (const floor of building.floors) {\n    for (const loop of floor.loops) {\n      loop.forEach((_edge, index) => {\n        const [a] = bandEnds(loop, index, 0);\n        nearest = Math.max(nearest, depthOf(a));\n      });\n    }\n  }\n\n  building.floors.forEach((floor, level) => {\n    const z0 = level === 0 ? -GROUND_MM : floor.base;\n    const z1 = wallTop(floor);\n    for (const loop of floor.loops) {\n      loop.forEach((edge, index) => {\n        const wall = edge.wall;\n        if (!wall) {\n          return;\n        }\n        const facingBy = wall.out[0] * f[0] + wall.out[1] * f[1];\n        if (facingBy < 0.02) {\n          return;\n        }\n        const [a, b] = bandEnds(loop, index, 0);\n        const depth = (depthOf(a) + depthOf(b)) / 2;\n        const outline: P[] = [\n          project(a, z0),\n          project(b, z0),\n          project(b, z1),\n          project(a, z1),\n        ];\n        const tone = options.highlight?.get(`${floor.id}:${wall.id}`);\n        // Only a face that looks this way shows its treatment well enough to key.\n        if (tone && facingBy > 0.5) {\n          const [p0, p1, p2] = outline as [P, P, P, P];\n          keyed.push({\n            key: `${floor.id}:${wall.id}`,\n            at: [(p0[0] + p1[0]) / 2, (p0[1] + p2[1]) / 2],\n            depth,\n          });\n        }\n        faces.push({\n          depth,\n          near: nearest - depth < 400,\n          outline,\n          items: (pen) => [\n            {\n              t: \"poly\",\n              pts: outline,\n              closed: true,\n              fill: tone\n                ? { hatch: \"insulation\", bg: shade(tone, 0.78) }\n                : options.added?.has(wall.id)\n                  ? \"#fbe9ec\"\n                  : \"#ffffff\",\n              s: pen,\n              layer: tone ? \"M-MARK\" : \"A-ELEV\",\n            },\n            ...wall.openings.flatMap((opening) =>\n              openingItems(\n                wall,\n                opening,\n                floor.base,\n                project,\n                k,\n                options.tags?.get(opening.id),\n              ),\n            ),\n          ],\n        });\n      });\n    }\n  });\n\n  for (const face of options.roof) {\n    if (face.kind === \"flat\") {\n      continue;\n    }\n    const pts = face.points.map(([x, y, z]: Point3) => project([x, y], z));\n    const xs = pts.map((p) => p[0]);\n    const ys = pts.map((p) => p[1]);\n    const area = Math.abs(\n      pts.reduce((sum, p, i) => {\n        const q = pts[(i + 1) % pts.length] as P;\n        return sum + p[0] * q[1] - q[0] * p[1];\n      }, 0),\n    );\n    if (\n      area < 0.05 ||\n      Math.max(...xs) - Math.min(...xs) < 0.2 ||\n      Math.max(...ys) - Math.min(...ys) < 0.05\n    ) {\n      continue;\n    }\n    const depth =\n      face.points.reduce((sum, [x, y]) => sum + depthOf([x, y]), 0) /\n      face.points.length;\n    faces.push({\n      depth: face.kind === \"slope\" ? depth - 1 : depth,\n      near: false,\n      outline: pts,\n      items: (pen) => [\n        {\n          t: \"poly\",\n          pts,\n          closed: true,\n          fill: face.kind === \"slope\" ? \"#f4f4f2\" : \"#ffffff\",\n          s: pen,\n          layer: \"A-ROOF\",\n        },\n      ],\n    });\n  }\n\n  faces.sort((a, b) => a.depth - b.depth);\n  // A keyed face's middle hidden by a nearer face isn't seen: no callout.\n  for (const mark of keyed) {\n    const hidden = faces.some(\n      (face) => face.depth > mark.depth + 50 && inside(mark.at, face.outline),\n    );\n    if (!hidden) {\n      options.anchors?.set(mark.key, mark.at);\n    }\n  }\n  const items: Item[] = [];\n  for (const face of faces) {\n    items.push(\n      ...face.items({ w: face.near ? PEN.medium : PEN.beyond, color: INK }),\n    );\n  }\n\n  // Ground: a heavy line well past the house, earth hatched below.\n  const xs = faces.flatMap((face) => face.outline.map((p) => p[0]));\n  const ys = faces.flatMap((face) => face.outline.map((p) => p[1]));\n  if (xs.length === 0) {\n    return items;\n  }\n  const left = Math.min(...xs) - 1500 * k;\n  const rightEdge = Math.max(...xs) + 1500 * k;\n  const ground = GROUND_MM * k;\n  items.push({\n    t: \"poly\",\n    pts: [\n      [left, ground],\n      [rightEdge, ground],\n      [rightEdge, ground + 2.2],\n      [left, ground + 2.2],\n    ],\n    closed: true,\n    fill: { hatch: \"ground\" },\n    layer: \"A-ELEV-GRND\",\n  });\n  items.push({\n    t: \"line\",\n    a: [left, ground],\n    b: [rightEdge, ground],\n    s: { w: PEN.heavy },\n    layer: \"A-ELEV-GRND\",\n  });\n\n  // Levels down the right: each floor's FFL, the eaves and the ridge.\n  const levels: [string, number][] = building.floors.map((floor) => [\n    `${floor.name} FFL`,\n    floor.base,\n  ]);\n  const top = building.floors[building.floors.length - 1];\n  if (top) {\n    levels.push([\"Eaves\", wallTop(top)]);\n  }\n  const ridge = -Math.min(...ys) / k;\n  if (top && ridge > wallTop(top) + 300) {\n    levels.push([\"Ridge\", ridge]);\n  }\n  items.push(...datums(levels, rightEdge + 2, k, Math.max(...xs)));\n  return items;\n}\n\n/** Level datums: a marker, the level in metres, and its name. */\nexport function datums(\n  levels: [string, number][],\n  x: number,\n  k: number,\n  from: number,\n): Item[] {\n  const items: Item[] = [];\n  for (const [name, z] of levels) {\n    const y = -z * k;\n    items.push(\n      {\n        t: \"line\",\n        a: [from + 1, y],\n        b: [x + 5, y],\n        s: { w: PEN.fine, dash: [2, 1] },\n        layer: \"A-ANNO-LEVL\",\n      },\n      {\n        t: \"poly\",\n        pts: [\n          [x + 5, y],\n          [x + 3.6, y - 1.6],\n          [x + 6.4, y - 1.6],\n        ],\n        closed: true,\n        fill: INK,\n        layer: \"A-ANNO-LEVL\",\n      },\n      {\n        t: \"text\",\n        at: [x + 8, y - 0.6],\n        text: `${z >= 0 ? \"+\" : \"\"}${(z / 1000).toFixed(3)}`,\n        size: 2.0,\n        layer: \"A-ANNO-LEVL\",\n      },\n      {\n        t: \"text\",\n        at: [x + 8, y + 2.4],\n        text: name,\n        size: 1.8,\n        layer: \"A-ANNO-LEVL\",\n      },\n    );\n  }\n  return items;\n}\n", "// What the retrofit puts where, as annotated drawings: the plan in grey, each\n// measure's runs, areas and positions marked over it, and a numbered bubble\n// on a leader for each, set out round the plan so the leaders don't cross,\n// keyed to notes in the sheet's panel. And the window and door schedule.\n\nimport { CATEGORY_COLORS, categoryOf } from \"../catalog\";\nimport { resolveFabric } from \"../fabric\";\nimport { shade } from \"../iso\";\nimport type { Annotation, Design, FabricType, Point } from \"../scene\";\nimport { anchorOf } from \"../drawings\";\nimport { type Box, INK, type Item, type P, PEN } from \"./draw\";\nimport type { ModelFloor, ModelWall } from \"./model\";\nimport { rotate } from \"./model\";\nimport { TEXT } from \"./plan\";\nimport type { Space } from \"./space\";\nimport { wrap } from \"./text\";\n\nexport function liveAnnotations(\n  annotations: readonly Annotation[],\n): Annotation[] {\n  return annotations.filter((a) => !a.deleted && a.status !== \"REJECTED\");\n}\n\n/** The design's measures marked on its plan: what the measure sheets draw. */\nexport function markedKinds(\n  design: Pick<Design, \"floors\" | \"measures\">,\n): string[] {\n  const marked = new Set(\n    design.floors.flatMap((floor) =>\n      liveAnnotations(floor.annotations).map((mark) => mark.kind),\n    ),\n  );\n  return design.measures.map((m) => m.kind).filter((kind) => marked.has(kind));\n}\n\nexport function colorOf(kind: string): string {\n  return CATEGORY_COLORS[categoryOf(kind)];\n}\n\n/** One measure's marks on a plan, turned as the plan is. */\nexport function markItems(\n  annotation: Annotation,\n  turn: number,\n  scale: number,\n): Item[] {\n  const k = 1 / scale;\n  const color = colorOf(annotation.kind);\n  const at = (point: Point): P => {\n    const [x, y] = rotate(point, turn);\n    return [x * k, y * k];\n  };\n  const geometry = annotation.geometry;\n  if (geometry.type === \"line\") {\n    const pts = geometry.points.map(at);\n    return [\n      {\n        t: \"poly\",\n        pts,\n        closed: false,\n        s: {\n          w: Math.max(1.4, 120 * k),\n          color: shade(color, 0.55),\n          cap: \"square\",\n        },\n        layer: \"M-MARK\",\n      },\n      {\n        t: \"poly\",\n        pts,\n        closed: false,\n        s: { w: 0.25, color, dash: [1.6, 0.8] },\n        layer: \"M-MARK\",\n      },\n    ];\n  }\n  if (geometry.type === \"area\") {\n    return [\n      {\n        t: \"poly\",\n        pts: geometry.polygon.map(at),\n        closed: true,\n        fill: shade(color, 0.82),\n        opacity: 0.75,\n        s: { w: PEN.light, color, dash: [2, 1] },\n        layer: \"M-MARK\",\n      },\n    ];\n  }\n  const c = at(geometry.at);\n  return [\n    {\n      t: \"circle\",\n      c,\n      r: 1.9,\n      fill: \"#ffffff\",\n      s: { w: PEN.medium, color },\n      layer: \"M-MARK\",\n    },\n    { t: \"circle\", c, r: 0.8, fill: color, layer: \"M-MARK\" },\n  ];\n}\n\nexport function quantity(annotation: Annotation): string {\n  if (annotation.area_m2) {\n    return `${Number(annotation.area_m2).toFixed(1)} m\u00B2`;\n  }\n  if (annotation.length_m) {\n    return `${Number(annotation.length_m).toFixed(1)} m run`;\n  }\n  return \"\";\n}\n\nexport interface Callout {\n  /** Paper point the leader starts from. */\n  anchor: P;\n  number: number;\n}\n\n/**\n * Bubbles round the outside of `body`, each on a straight leader to its\n * anchor. Each anchor goes to its nearest side; along a side they keep the\n * anchors' order and spread to a pitch, so leaders don't cross.\n */\nexport function callouts(\n  calls: readonly Callout[],\n  body: Box,\n  space: Space,\n): Item[] {\n  const items: Item[] = [];\n  const ring = 9;\n  const pitch = 6.5;\n  const sides: Record<\"top\" | \"bottom\" | \"left\" | \"right\", Callout[]> = {\n    top: [],\n    bottom: [],\n    left: [],\n    right: [],\n  };\n  for (const call of calls) {\n    const [x, y] = call.anchor;\n    const d = {\n      top: y - body.y0,\n      bottom: body.y1 - y,\n      left: x - body.x0,\n      right: body.x1 - x,\n    };\n    const side = (Object.keys(d) as (keyof typeof d)[]).reduce((a, b) =>\n      d[b] < d[a] ? b : a,\n    );\n    sides[side].push(call);\n  }\n  for (const [side, list] of Object.entries(sides) as [\n    keyof typeof sides,\n    Callout[],\n  ][]) {\n    const horizontal = side === \"top\" || side === \"bottom\";\n    const sorted = [...list].sort((a, b) =>\n      horizontal ? a.anchor[0] - b.anchor[0] : a.anchor[1] - b.anchor[1],\n    );\n    const along = sorted.map((call) =>\n      horizontal ? call.anchor[0] : call.anchor[1],\n    );\n    // Spread forward, then back, to a pitch.\n    for (let i = 1; i < along.length; i++) {\n      along[i] = Math.max(along[i] as number, (along[i - 1] as number) + pitch);\n    }\n    const limit = horizontal ? body.x1 : body.y1;\n    const overflow = (along[along.length - 1] ?? limit) - limit;\n    if (overflow > 0) {\n      for (let i = along.length - 1; i >= 0; i--) {\n        along[i] = (along[i] as number) - overflow;\n        if (i > 0) {\n          along[i - 1] = Math.min(\n            along[i - 1] as number,\n            (along[i] as number) - pitch,\n          );\n        }\n      }\n    }\n    sorted.forEach((call, index) => {\n      const s = along[index] as number;\n      const centre: P =\n        side === \"top\"\n          ? [s, body.y0 - ring]\n          : side === \"bottom\"\n            ? [s, body.y1 + ring]\n            : side === \"left\"\n              ? [body.x0 - ring, s]\n              : [body.x1 + ring, s];\n      const dx = centre[0] - call.anchor[0];\n      const dy = centre[1] - call.anchor[1];\n      const length = Math.hypot(dx, dy) || 1;\n      const r = 2.4;\n      items.push(\n        { t: \"circle\", c: call.anchor, r: 0.45, fill: INK, layer: \"M-ANNO\" },\n        {\n          t: \"line\",\n          a: call.anchor,\n          b: [centre[0] - (dx / length) * r, centre[1] - (dy / length) * r],\n          s: { w: PEN.light },\n          layer: \"M-ANNO\",\n        },\n        {\n          t: \"circle\",\n          c: centre,\n          r,\n          fill: \"#ffffff\",\n          s: { w: PEN.medium },\n          layer: \"M-ANNO\",\n        },\n        {\n          t: \"text\",\n          at: centre,\n          text: String(call.number),\n          size: 2.4,\n          anchor: \"middle\",\n          valign: \"middle\",\n          bold: true,\n          layer: \"M-ANNO\",\n        },\n      );\n      space.addBox({\n        x0: centre[0] - r,\n        y0: centre[1] - r,\n        x1: centre[0] + r,\n        y1: centre[1] + r,\n      });\n    });\n  }\n  return items;\n}\n\n/** Where the leader for an annotation starts: on the mark, turned. */\nexport function anchorOnPaper(\n  annotation: Annotation,\n  turn: number,\n  scale: number,\n): P {\n  const [x, y] = rotate(anchorOf(annotation), turn);\n  return [x / scale, y / scale];\n}\n\n// --- Window and door schedule ------------------------------------------------\n\nexport interface ScheduleEntry {\n  ref: string;\n  openingId: string;\n  floor: string;\n  room: string;\n  type: string;\n  width: number;\n  height: number;\n  sill: number | null;\n  operation: string;\n  spec: string;\n  proposed: string;\n}\n\nconst VENTS: Record<string, string> = {\n  side: \"Side-hung casement\",\n  top: \"Top-hung casement\",\n  bottom: \"Bottom-hung\",\n  pivot: \"Pivot\",\n  sash: \"Sliding sash\",\n  slider: \"Horizontal slider\",\n  fixed: \"Fixed light\",\n};\n\nconst OPENING_MEASURES = [\n  \"WINDOWS\",\n  \"SECONDARY_GLAZING\",\n  \"FENESTRATION_DRAUGHT_PROOFING\",\n  \"TRICKLE_VENTS\",\n  \"SINGLE_DOORS\",\n  \"PATIO_DOORS\",\n  \"BIFOLD_AND_ARCHITECTURAL_DOORS\",\n  \"DOOR_UNDERCUTS\",\n];\n\n/** Every window and door, numbered floor by floor round the outside, then\n * the inside doors: W01\u2026, D01\u2026. */\nexport function scheduleOf(\n  floors: readonly ModelFloor[],\n  types: readonly FabricType[],\n  marks: ReadonlyMap<number, Annotation[]>,\n  measureName: (kind: string) => string,\n  turn: number,\n): ScheduleEntry[] {\n  const windows: ScheduleEntry[] = [];\n  const doors: ScheduleEntry[] = [];\n  for (const floor of floors) {\n    const roomName = (wall: ModelWall) => {\n      const names = wall.rooms\n        .map((id) => floor.rooms.find((room) => room.id === id)?.name)\n        .filter((name): name is string => Boolean(name));\n      return names.join(\" / \") || \"\u2014\";\n    };\n    const ordered: ModelWall[] = [];\n    for (const loop of floor.loops) {\n      for (const edge of loop) {\n        if (edge.wall && !ordered.includes(edge.wall)) {\n          ordered.push(edge.wall);\n        }\n      }\n    }\n    for (const wall of floor.walls) {\n      if (!ordered.includes(wall)) {\n        ordered.push(wall);\n      }\n    }\n    const nearby = (marks.get(floor.id) ?? []).filter(\n      (mark) =>\n        OPENING_MEASURES.includes(mark.kind) && mark.geometry.type === \"point\",\n    );\n    for (const wall of ordered) {\n      const length =\n        Math.hypot(wall.b[0] - wall.a[0], wall.b[1] - wall.a[1]) || 1;\n      const u: Point = [\n        (wall.b[0] - wall.a[0]) / length,\n        (wall.b[1] - wall.a[1]) / length,\n      ];\n      const sorted = [...wall.openings].sort((a, b) => a.offset - b.offset);\n      for (const opening of sorted) {\n        if (opening.type === \"opening\") {\n          continue;\n        }\n        const centre: Point = [\n          wall.a[0] + u[0] * (opening.offset + opening.width / 2),\n          wall.a[1] + u[1] * (opening.offset + opening.width / 2),\n        ];\n        const proposed = nearby\n          .filter((mark) => {\n            const [x, y] = rotate(anchorOf(mark), turn);\n            return (\n              Math.hypot(x - centre[0], y - centre[1]) <\n              Math.max(900, opening.width)\n            );\n          })\n          .map((mark) =>\n            [measureName(mark.kind), mark.notes].filter(Boolean).join(\": \"),\n          );\n        const element = opening.type === \"window\" ? \"WINDOW\" : \"DOOR\";\n        const fabric = resolveFabric([...types], element, opening.fabric);\n        const entry: ScheduleEntry = {\n          ref: \"\",\n          openingId: opening.id,\n          floor: floor.name,\n          room: roomName(wall),\n          type:\n            opening.type === \"window\"\n              ? \"Window\"\n              : wall.kind === \"INTERNAL\"\n                ? \"Internal door\"\n                : \"External door\",\n          width: opening.width,\n          height: opening.height,\n          sill: opening.type === \"window\" ? opening.sill : null,\n          operation:\n            opening.type === \"window\"\n              ? (VENTS[opening.vent ?? \"side\"] ?? \"Casement\")\n              : opening.swing === \"none\"\n                ? \"Fixed\"\n                : opening.double\n                  ? \"Double, hinged both sides\"\n                  : `Hinged ${opening.flip ? (opening.swing === \"left\" ? \"right\" : \"left\") : opening.swing}`,\n          spec: fabric?.name ?? \"\",\n          proposed: proposed.join(\"; \"),\n        };\n        (opening.type === \"window\" ? windows : doors).push(entry);\n      }\n    }\n  }\n  windows.forEach((entry, index) => {\n    entry.ref = `W${String(index + 1).padStart(2, \"0\")}`;\n  });\n  doors.forEach((entry, index) => {\n    entry.ref = `D${String(index + 1).padStart(2, \"0\")}`;\n  });\n  return [...windows, ...doors];\n}\n\nconst COLUMNS: {\n  label: string;\n  width: number;\n  value: (entry: ScheduleEntry) => string;\n  align?: \"end\";\n}[] = [\n  { label: \"Ref\", width: 13, value: (e) => e.ref },\n  { label: \"Floor\", width: 24, value: (e) => e.floor },\n  { label: \"Room\", width: 38, value: (e) => e.room },\n  { label: \"Type\", width: 26, value: (e) => e.type },\n  {\n    label: \"Width\",\n    width: 14,\n    value: (e) => String(Math.round(e.width)),\n    align: \"end\",\n  },\n  {\n    label: \"Height\",\n    width: 14,\n    value: (e) => String(Math.round(e.height)),\n    align: \"end\",\n  },\n  {\n    label: \"Sill\",\n    width: 13,\n    value: (e) => (e.sill === null ? \"\u2014\" : String(Math.round(e.sill))),\n    align: \"end\",\n  },\n  { label: \"Operation\", width: 34, value: (e) => e.operation },\n  { label: \"As existing\", width: 42, value: (e) => e.spec },\n  { label: \"Proposed\", width: 0, value: (e) => e.proposed || \"\u2014\" },\n];\n\n/** The schedule as a ruled table, `width` wide from (x, y); rows that\n * don't fit in `height` come back to go on the next sheet. */\nexport function scheduleTable(\n  entries: readonly ScheduleEntry[],\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n): { items: Item[]; rest: ScheduleEntry[] } {\n  const items: Item[] = [];\n  const fixed = COLUMNS.reduce((sum, column) => sum + column.width, 0);\n  const columns = COLUMNS.map((column) => ({\n    ...column,\n    width: column.width || width - fixed,\n  }));\n  const head = 8;\n  const line = 2.9;\n  items.push(\n    {\n      t: \"text\",\n      at: [x, y - 4],\n      text: \"WINDOW AND DOOR SCHEDULE\",\n      size: 3.2,\n      bold: true,\n      layer: \"A-ANNO-SCHD\",\n    },\n    {\n      t: \"line\",\n      a: [x, y],\n      b: [x + width, y],\n      s: { w: PEN.cut },\n      layer: \"A-ANNO-SCHD\",\n    },\n  );\n  let cx = x;\n  for (const column of columns) {\n    items.push({\n      t: \"text\",\n      at: [\n        column.align === \"end\" ? cx + column.width - 1.5 : cx + 1.5,\n        y + 5.2,\n      ],\n      text: column.label.toUpperCase(),\n      size: 1.8,\n      bold: true,\n      anchor: column.align === \"end\" ? \"end\" : \"start\",\n      layer: \"A-ANNO-SCHD\",\n    });\n    cx += column.width;\n  }\n  let row = y + head;\n  items.push({\n    t: \"line\",\n    a: [x, row],\n    b: [x + width, row],\n    s: { w: PEN.medium },\n    layer: \"A-ANNO-SCHD\",\n  });\n  let rest: ScheduleEntry[] = [];\n  for (const [index, entry] of entries.entries()) {\n    let cells = columns.map((column) =>\n      wrap(column.value(entry), TEXT.dim, column.width - 3),\n    );\n    let rowHeight =\n      Math.max(...cells.map((lines) => lines.length)) * line + 2.4;\n    if (row + rowHeight > y + height) {\n      if (index > 0) {\n        // In order: this row and the rest start the next sheet.\n        rest = entries.slice(index);\n        break;\n      }\n      // Taller than a blank sheet: cut its cells short, and say so.\n      const fit = Math.max(1, Math.floor((y + height - row - 2.4) / line));\n      cells = cells.map((lines) =>\n        lines.length > fit\n          ? [...lines.slice(0, fit - 1), `${lines[fit - 1] ?? \"\"}\u2026`]\n          : lines,\n      );\n      rowHeight = fit * line + 2.4;\n    }\n    let at = x;\n    columns.forEach((column, index) => {\n      (cells[index] as string[]).forEach((text, n) => {\n        items.push({\n          t: \"text\",\n          at: [\n            column.align === \"end\" ? at + column.width - 1.5 : at + 1.5,\n            row + 3.6 + n * line,\n          ],\n          text,\n          size: TEXT.dim,\n          bold: index === 0,\n          anchor: column.align === \"end\" ? \"end\" : \"start\",\n          layer: \"A-ANNO-SCHD\",\n        });\n      });\n      at += column.width;\n    });\n    row += rowHeight;\n    items.push({\n      t: \"line\",\n      a: [x, row],\n      b: [x + width, row],\n      s: { w: PEN.fine },\n      layer: \"A-ANNO-SCHD\",\n    });\n  }\n  let vx = x;\n  for (const column of columns.slice(0, -1)) {\n    vx += column.width;\n    items.push({\n      t: \"line\",\n      a: [vx, y],\n      b: [vx, row],\n      s: { w: PEN.fine },\n      layer: \"A-ANNO-SCHD\",\n    });\n  }\n  return { items, rest };\n}\n", "// A section through the house along one line across the plan: the walls it\n// cuts poch\u00E9'd from slab to wall plate (gapped where it passes a window or\n// door), the floor zones between storeys, the ground slab, the roof cut, the\n// roof beyond in the light pen, rooms named, levels down the side. And the\n// mark the plans carry to say where it was taken.\n\nimport type { Point } from \"../scene\";\nimport { type Fill, INK, type Item, type P, PEN } from \"./draw\";\nimport { GROUND_MM, datums } from \"./elevation\";\nimport { type Building, FLOOR_ZONE_MM } from \"./model\";\nimport { TEXT } from \"./plan\";\nimport type { RoofFace } from \"./roof\";\nimport { wallTop } from \"./roof\";\n\nexport interface Cut {\n  /** The section runs left to right at this plan y, looking up the sheet. */\n  y: number;\n  x0: number;\n  x1: number;\n}\n\n/** Where to cut: across the top storey's middle, clear of walls along it. */\nexport function chooseCut(building: Building): Cut | null {\n  const top = building.floors[building.floors.length - 1];\n  const all = building.floors.flatMap((floor) =>\n    floor.walls.flatMap((wall) => [wall.a, wall.b]),\n  );\n  if (!top || all.length === 0) {\n    return null;\n  }\n  const ys = top.walls.flatMap((wall) => [wall.a[1], wall.b[1]]);\n  const mid = (Math.min(...ys) + Math.max(...ys)) / 2;\n  const along = building.floors.flatMap((floor) =>\n    floor.walls.filter(\n      (wall) =>\n        Math.abs(wall.a[1] - wall.b[1]) < 0.2 * Math.abs(wall.a[0] - wall.b[0]),\n    ),\n  );\n  let y = mid;\n  for (const shift of [0, 400, -400, 800, -800, 1200, -1200]) {\n    const candidate = mid + shift;\n    if (\n      along.every(\n        (wall) => Math.abs((wall.a[1] + wall.b[1]) / 2 - candidate) > 350,\n      )\n    ) {\n      y = candidate;\n      break;\n    }\n  }\n  return {\n    y,\n    x0: Math.min(...all.map((point) => point[0])),\n    x1: Math.max(...all.map((point) => point[0])),\n  };\n}\n\n/** The section mark on a plan, at paper y between paper x `left` and\n * `right` (clear of the dimensions): heavy ends, A in a circle, an arrow the\n * way it looks. */\nexport function sectionMark(\n  cut: Cut,\n  scale: number,\n  left: number,\n  right: number,\n  label = \"A\",\n): Item[] {\n  const k = 1 / scale;\n  const y = cut.y * k;\n  const items: Item[] = [];\n  for (const [x, dir] of [\n    [left - 2, 1],\n    [right + 2, -1],\n  ] as const) {\n    items.push(\n      {\n        t: \"line\",\n        a: [x, y],\n        b: [x + dir * 8, y],\n        s: { w: PEN.heavy },\n        layer: \"A-ANNO-SECT\",\n      },\n      {\n        t: \"circle\",\n        c: [x - dir * 3.2, y],\n        r: 3.2,\n        s: { w: PEN.light },\n        fill: \"#ffffff\",\n        layer: \"A-ANNO-SECT\",\n      },\n      {\n        t: \"text\",\n        at: [x - dir * 3.2, y],\n        text: label,\n        size: 2.6,\n        anchor: \"middle\",\n        valign: \"middle\",\n        bold: true,\n        layer: \"A-ANNO-SECT\",\n      },\n      {\n        t: \"poly\",\n        pts: [\n          [x + dir * 3, y - 1],\n          [x + dir * 6, y - 1],\n          [x + dir * 4.5, y - 4],\n        ],\n        closed: true,\n        fill: INK,\n        layer: \"A-ANNO-SECT\",\n      },\n    );\n  }\n  // A light chain line between, so the eye can follow it across.\n  items.push({\n    t: \"line\",\n    a: [left + 6, y],\n    b: [right - 6, y],\n    s: { w: PEN.fine, dash: [6, 1, 0.6, 1] },\n    layer: \"A-ANNO-SECT\",\n  });\n  return items;\n}\n\nfunction rect(\n  x0: number,\n  y0: number,\n  x1: number,\n  y1: number,\n  fill: Fill,\n  w: number = PEN.cut,\n): Item {\n  return {\n    t: \"poly\",\n    pts: [\n      [x0, y0],\n      [x1, y0],\n      [x1, y1],\n      [x0, y1],\n    ],\n    closed: true,\n    fill,\n    s: { w, color: INK },\n    layer: \"A-SECT\",\n  };\n}\n\n/** The section on paper: x along the cut, y down, ground at +150/scale. */\nexport function sectionView(\n  building: Building,\n  cut: Cut,\n  roof: RoofFace[],\n  scale: number,\n): Item[] {\n  const k = 1 / scale;\n  const items: Item[] = [];\n  const poche: Fill =\n    scale > 60 ? \"#3c3c3c\" : { hatch: \"brick\", bg: \"#ffffff\" };\n  const pz = (z: number) => -z * k;\n\n  // The roof beyond, light: every slope's and gable's outline.\n  for (const face of roof) {\n    if (face.kind === \"flat\" || face.kind === \"fascia\") {\n      continue;\n    }\n    const behind = face.points.some(([, y]) => y < cut.y);\n    if (!behind) {\n      continue;\n    }\n    items.push({\n      t: \"poly\",\n      pts: face.points.map(([x, , z]) => [x * k, pz(z)] as P),\n      closed: true,\n      fill: \"#ffffff\",\n      s: { w: PEN.fine, color: INK },\n      layer: \"A-SECT-BYND\",\n    });\n  }\n\n  let minX = Number.POSITIVE_INFINITY;\n  let maxX = Number.NEGATIVE_INFINITY;\n  building.floors.forEach((floor, level) => {\n    const z0 = level === 0 ? -GROUND_MM : floor.base;\n    const z1 = wallTop(floor);\n    const hits: number[] = [];\n    for (const wall of floor.walls) {\n      const [ax, ay] = wall.a;\n      const [bx, by] = wall.b;\n      if ((ay - cut.y) * (by - cut.y) > 0 || ay === by) {\n        continue;\n      }\n      const t = (cut.y - ay) / (by - ay);\n      const x = ax + (bx - ax) * t;\n      const length = Math.hypot(bx - ax, by - ay) || 1;\n      const sin = Math.abs(by - ay) / length;\n      if (sin < 0.2) {\n        continue;\n      }\n      const half = wall.thickness / 2 / sin;\n      hits.push(x);\n      const s = t * length;\n      const opening = wall.openings.find(\n        (o) => o.offset <= s && s <= o.offset + o.width,\n      );\n      const left = (x - half) * k;\n      const right = (x + half) * k;\n      if (!opening) {\n        items.push(rect(left, pz(z1), right, pz(z0), poche));\n        continue;\n      }\n      const sill = opening.type === \"window\" ? (opening.sill ?? 900) : 0;\n      const head = floor.base + sill + opening.height;\n      items.push(rect(left, pz(z1), right, pz(head), poche));\n      if (sill > 0) {\n        items.push(rect(left, pz(floor.base + sill), right, pz(z0), poche));\n        // The window in the gap: frame and glass.\n        const mid = (left + right) / 2;\n        items.push(\n          {\n            t: \"line\",\n            a: [mid - 0.4, pz(head)],\n            b: [mid - 0.4, pz(floor.base + sill)],\n            s: { w: PEN.fine },\n            layer: \"A-SECT\",\n          },\n          {\n            t: \"line\",\n            a: [mid + 0.4, pz(head)],\n            b: [mid + 0.4, pz(floor.base + sill)],\n            s: { w: PEN.fine },\n            layer: \"A-SECT\",\n          },\n        );\n      }\n    }\n    if (hits.length < 2) {\n      return;\n    }\n    const lo = Math.min(...hits);\n    const hi = Math.max(...hits);\n    minX = Math.min(minX, lo);\n    maxX = Math.max(maxX, hi);\n    // The floor this storey stands on: a slab on the ground, joists above.\n    if (level === 0) {\n      items.push(\n        rect(\n          lo * k,\n          pz(0),\n          hi * k,\n          pz(-GROUND_MM),\n          { hatch: \"block\", bg: \"#ffffff\" },\n          PEN.medium,\n        ),\n      );\n    } else {\n      items.push(\n        rect(\n          lo * k,\n          pz(floor.base),\n          hi * k,\n          pz(floor.base - FLOOR_ZONE_MM),\n          { hatch: \"stud\" },\n          PEN.medium,\n        ),\n      );\n    }\n    // The ceiling under the roof on the top storey.\n    if (level === building.floors.length - 1) {\n      items.push(\n        rect(\n          lo * k,\n          pz(floor.base + floor.ceiling + 40),\n          hi * k,\n          pz(floor.base + floor.ceiling),\n          \"#ffffff\",\n          PEN.light,\n        ),\n      );\n    }\n    // Rooms the cut passes through, named at head height.\n    for (const room of floor.rooms) {\n      const xs: number[] = [];\n      room.clear.forEach((p, index) => {\n        const q = room.clear[(index + 1) % room.clear.length] as Point;\n        if ((p[1] - cut.y) * (q[1] - cut.y) < 0) {\n          xs.push(p[0] + ((q[0] - p[0]) * (cut.y - p[1])) / (q[1] - p[1]));\n        }\n      });\n      if (xs.length >= 2) {\n        const span = (Math.max(...xs) - Math.min(...xs)) * k;\n        if (span > 14) {\n          items.push({\n            t: \"text\",\n            at: [\n              ((Math.min(...xs) + Math.max(...xs)) / 2) * k,\n              pz(floor.base + 1300),\n            ],\n            text: room.name.toUpperCase(),\n            size: TEXT.room,\n            anchor: \"middle\",\n            layer: \"A-ANNO-ROOM\",\n          });\n        }\n      }\n    }\n  });\n\n  // The roof as cut: each slope crossing the line, drawn with its depth.\n  for (const face of roof) {\n    if (face.kind !== \"slope\") {\n      continue;\n    }\n    const crossings: P[] = [];\n    face.points.forEach((p, index) => {\n      const q = face.points[(index + 1) % face.points.length] as typeof p;\n      if ((p[1] - cut.y) * (q[1] - cut.y) < 0) {\n        const t = (cut.y - p[1]) / (q[1] - p[1]);\n        crossings.push([\n          (p[0] + (q[0] - p[0]) * t) * k,\n          pz(p[2] + (q[2] - p[2]) * t),\n        ]);\n      } else if (p[1] === cut.y) {\n        crossings.push([p[0] * k, pz(p[2])]);\n      }\n    });\n    if (crossings.length < 2) {\n      continue;\n    }\n    const [a, b] = crossings as [P, P];\n    const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n    // Down-slope normal, 200 mm of rafter and covering.\n    let nx = -(b[1] - a[1]) / length;\n    let ny = (b[0] - a[0]) / length;\n    if (ny < 0) {\n      nx = -nx;\n      ny = -ny;\n    }\n    const d = 200 * k;\n    items.push({\n      t: \"poly\",\n      pts: [\n        a,\n        b,\n        [b[0] + nx * d, b[1] + ny * d],\n        [a[0] + nx * d, a[1] + ny * d],\n      ],\n      closed: true,\n      fill: { hatch: \"insulation\", bg: \"#ffffff\" },\n      s: { w: PEN.cut },\n      layer: \"A-SECT\",\n    });\n  }\n\n  if (!Number.isFinite(minX)) {\n    return items;\n  }\n  const left = minX * k - 30;\n  const right = maxX * k + 30;\n  const ground = GROUND_MM * k;\n  items.push(\n    {\n      t: \"poly\",\n      pts: [\n        [left, ground],\n        [right, ground],\n        [right, ground + 2.2],\n        [left, ground + 2.2],\n      ],\n      closed: true,\n      fill: { hatch: \"ground\" },\n      layer: \"A-SECT-GRND\",\n    },\n    {\n      t: \"line\",\n      a: [left, ground],\n      b: [right, ground],\n      s: { w: PEN.heavy },\n      layer: \"A-SECT-GRND\",\n    },\n  );\n  const levels: [string, number][] = building.floors.map((floor) => [\n    `${floor.name} FFL`,\n    floor.base,\n  ]);\n  const top = building.floors[building.floors.length - 1];\n  if (top) {\n    levels.push([\"Ceiling\", top.base + top.ceiling]);\n  }\n  items.push(...datums(levels, right + 2, k, maxX * k));\n  return items;\n}\n", "// A drawing sheet as UK practice lays one out (the Archicad and Revit UK\n// templates, after BS EN ISO 7200 and BS 1192): a framed ISO sheet, the\n// drawing area on the left, and down the right a panel of general notes, the\n// key, the revisions, the north point and the title block, with the drawing\n// number and revision largest in its bottom corner. Each view carries its\n// own title, scale and scale bar beneath it.\n\nimport {\n  type Box,\n  GREY,\n  INK,\n  type Item,\n  type P,\n  PEN,\n  extent,\n  place,\n  textBox,\n  toSvg,\n} from \"./draw\";\nimport { wrap } from \"./text\";\n\nexport type Paper = \"A3\" | \"A1\";\n\nexport const PAPER: Record<\n  Paper,\n  { width: number; height: number; panel: number }\n> = {\n  A3: { width: 420, height: 297, panel: 78 },\n  A1: { width: 841, height: 594, panel: 100 },\n};\n\nconst MARGIN = 10;\nconst VIEW_GAP = 14;\n/** Room under a view for its title and scale bar, mm. */\nconst TITLE_SPACE = 13;\n\nexport interface View {\n  title: string;\n  /** 50 for 1:50. */\n  scale: number;\n  /** On paper, mm, anywhere: the sheet moves them into place. */\n  items: Item[];\n}\n\nexport interface Revision {\n  rev: string;\n  date: string;\n  description: string;\n  by: string;\n}\n\nexport interface LegendEntry {\n  label: string;\n  /** Drawn in a 12 \u00D7 5 mm box with its top left at the origin. */\n  symbol: Item[];\n}\n\nexport interface KeyNote {\n  number: number;\n  title: string;\n  text: string;\n}\n\nexport interface SheetMeta {\n  project: string;\n  address: string;\n  client: string;\n  date: string;\n  drawn: string;\n  checked: string;\n  status: string;\n  revisions: Revision[];\n}\n\nexport interface SheetSpec {\n  paper: Paper;\n  number: string;\n  title: string;\n  views: View[];\n  notes: string[];\n  legend: LegendEntry[];\n  /** The plan bearing of north, when the sheet has a plan to point it on. */\n  north: number | null;\n  keyNotes?: KeyNote[];\n  /** Extra items in the drawing area, already placed (a schedule table). */\n  extra?: Item[];\n  /** Views share one plan grid: floors line up over each other. */\n  align?: boolean;\n}\n\nexport interface Sheet {\n  number: string;\n  title: string;\n  paper: Paper;\n  width: number;\n  height: number;\n  svg: string;\n  /** Each view placed: its items on the sheet and where its origin went. */\n  placed: { view: View; dx: number; dy: number }[];\n}\n\n/** The drawing area's box on a paper size, mm. */\nexport function drawingArea(paper: Paper): Box {\n  const size = PAPER[paper];\n  return {\n    x0: MARGIN + 6,\n    y0: MARGIN + 6,\n    x1: size.width - MARGIN - size.panel - 6,\n    y1: size.height - MARGIN - 6,\n  };\n}\n\n/** The size a view takes on the sheet, title and all. */\nexport function viewSize(view: View): { width: number; height: number } {\n  const box = extent(view.items) ?? { x0: 0, y0: 0, x1: 10, y1: 10 };\n  return {\n    width: Math.max(box.x1 - box.x0, titleWidth(view)),\n    height: box.y1 - box.y0 + TITLE_SPACE,\n  };\n}\n\n/** The views laid out in rows, as many sheets as it takes. */\nexport function pack(views: readonly View[], paper: Paper): View[][] {\n  const area = drawingArea(paper);\n  const width = area.x1 - area.x0;\n  const height = area.y1 - area.y0;\n  const sheets: View[][] = [];\n  let current: View[] = [];\n  let rowWidth = 0;\n  let rowHeight = 0;\n  let used = 0;\n  for (const view of views) {\n    const size = viewSize(view);\n    if (\n      current.length > 0 &&\n      rowWidth + VIEW_GAP + size.width <= width &&\n      used + Math.max(rowHeight, size.height) <= height\n    ) {\n      rowWidth += VIEW_GAP + size.width;\n      rowHeight = Math.max(rowHeight, size.height);\n      current.push(view);\n      continue;\n    }\n    if (\n      current.length > 0 &&\n      used + rowHeight + VIEW_GAP + size.height <= height\n    ) {\n      used += rowHeight + VIEW_GAP;\n      rowWidth = size.width;\n      rowHeight = size.height;\n      current.push(view);\n      continue;\n    }\n    if (current.length > 0) {\n      sheets.push(current);\n    }\n    current = [view];\n    rowWidth = size.width;\n    rowHeight = size.height;\n    used = 0;\n  }\n  if (current.length > 0) {\n    sheets.push(current);\n  }\n  return sheets;\n}\n\n/** Whether a view fits a sheet's drawing area on its own. */\nexport function fits(view: View, paper: Paper): boolean {\n  const area = drawingArea(paper);\n  const size = viewSize(view);\n  return size.width <= area.x1 - area.x0 && size.height <= area.y1 - area.y0;\n}\n\nfunction text(\n  at: P,\n  value: string,\n  size: number,\n  extra: Partial<Extract<Item, { t: \"text\" }>> = {},\n): Extract<Item, { t: \"text\" }> {\n  return { t: \"text\", at, text: value, size, layer: \"A-SHEET\", ...extra };\n}\n\nfunction rule(a: P, b: P, w: number = PEN.light): Item {\n  return { t: \"line\", a, b, s: { w }, layer: \"A-SHEET\" };\n}\n\nfunction rect(\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  pen: number,\n  fill?: string,\n): Item {\n  return {\n    t: \"poly\",\n    pts: [\n      [x, y],\n      [x + w, y],\n      [x + w, y + h],\n      [x, y + h],\n    ],\n    closed: true,\n    s: { w: pen },\n    ...(fill ? { fill } : {}),\n    layer: \"A-SHEET\",\n  };\n}\n\n/** A scale bar: alternate metres filled, labelled 0 \u2026 n m. */\nexport function scaleBar(at: P, scale: number): Item[] {\n  const metres = scale <= 50 ? 3 : scale <= 100 ? 5 : 10;\n  const step = scale <= 50 ? 0.5 : scale <= 100 ? 1 : 2;\n  const unit = 1000 / scale;\n  const items: Item[] = [];\n  const [x, y] = at;\n  for (let index = 0; index * step < metres; index++) {\n    items.push(\n      rect(\n        x + index * step * unit,\n        y,\n        step * unit,\n        1.4,\n        PEN.fine,\n        index % 2 === 0 ? INK : \"#ffffff\",\n      ),\n    );\n  }\n  for (let m = 0; m <= metres; m += step < 1 ? 1 : step) {\n    items.push(\n      text([x + m * unit, y + 4], `${m}${m === metres ? \" m\" : \"\"}`, 1.8, {\n        anchor: \"middle\",\n      }),\n    );\n  }\n  return items;\n}\n\n/** The north point: a circle and arrow turned to north, N at its head. */\nexport function northPoint(centre: P, bearing: number, r = 7): Item[] {\n  const turn = (bearing * Math.PI) / 180;\n  const at = (x: number, y: number): P => [\n    centre[0] + x * Math.cos(turn) - y * Math.sin(turn),\n    centre[1] + x * Math.sin(turn) + y * Math.cos(turn),\n  ];\n  const head = at(0, -r * 1.05);\n  return [\n    { t: \"circle\", c: centre, r, s: { w: PEN.light }, layer: \"A-SHEET\" },\n    {\n      t: \"poly\",\n      pts: [head, at(r * 0.35, r * 0.75), at(0, r * 0.4)],\n      closed: true,\n      fill: INK,\n      s: { w: PEN.fine },\n      layer: \"A-SHEET\",\n    },\n    {\n      t: \"poly\",\n      pts: [head, at(-r * 0.35, r * 0.75), at(0, r * 0.4)],\n      closed: true,\n      fill: \"#ffffff\",\n      s: { w: PEN.fine },\n      layer: \"A-SHEET\",\n    },\n    text(at(0, -r * 1.55), \"N\", 3, {\n      anchor: \"middle\",\n      valign: \"middle\",\n      bold: true,\n      rot: bearing,\n    }),\n  ];\n}\n\nfunction barLength(scale: number): number {\n  return ((scale <= 50 ? 3 : scale <= 100 ? 5 : 10) * 1000) / scale;\n}\n\n/** How wide a view's title and scale bar run. */\nfunction titleWidth(view: View): number {\n  const title = textBox(\n    text([0, 0], view.title.toUpperCase(), 3.2, { bold: true }),\n  ).x1;\n  return Math.max(title, 34) + 6 + barLength(view.scale) + 4;\n}\n\n/** A view's title: the name underlined, the scale at paper size, a bar. */\nfunction viewTitle(view: View, x: number, y: number, paper: Paper): Item[] {\n  const title = text([x, y + 4], view.title.toUpperCase(), 3.2, { bold: true });\n  const width = textBox(title).x1 - x;\n  return [\n    title,\n    rule([x, y + 5.4], [x + width, y + 5.4], PEN.medium),\n    text([x, y + 9.6], `Scale 1:${view.scale} @ ${paper}`, 2.2),\n    ...scaleBar([x + Math.max(width, 34) + 6, y + 2.4], view.scale),\n  ];\n}\n\nfunction cell(\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  label: string,\n  value: string,\n  size = 2.6,\n  bold = false,\n): Item[] {\n  const lines = wrap(value, size, w - 3, bold).slice(0, 2);\n  // Values sit on the cell's foot, as many lines as they take.\n  const foot = y + h - 1.7;\n  return [\n    rect(x, y, w, h, PEN.fine),\n    text([x + 1.5, y + 2.6], label.toUpperCase(), 1.5, { color: GREY }),\n    ...lines.map((line, index) =>\n      text(\n        [x + 1.5, foot - (lines.length - 1 - index) * size * 1.2],\n        line,\n        size,\n        { bold },\n      ),\n    ),\n  ];\n}\n\nfunction panel(spec: SheetSpec, meta: SheetMeta): Item[] {\n  const size = PAPER[spec.paper];\n  const x0 = size.width - MARGIN - size.panel;\n  const x1 = size.width - MARGIN;\n  const w = x1 - x0;\n  const items: Item[] = [\n    rule([x0, MARGIN], [x0, size.height - MARGIN], PEN.cut),\n  ];\n  const pad = 3;\n  let y = MARGIN + 6;\n\n  const heading = (label: string) => {\n    items.push(text([x0 + pad, y], label, 2.4, { bold: true }));\n    y += 4;\n  };\n\n  // Key notes on a measure drawing come first: they're what it's for.\n  if (spec.keyNotes && spec.keyNotes.length > 0) {\n    heading(\"KEY\");\n    for (const note of spec.keyNotes) {\n      items.push(\n        {\n          t: \"circle\",\n          c: [x0 + pad + 2.2, y - 0.9],\n          r: 2.2,\n          s: { w: PEN.light },\n          fill: \"#ffffff\",\n          layer: \"A-SHEET\",\n        },\n        text([x0 + pad + 2.2, y - 0.9], String(note.number), 2.2, {\n          anchor: \"middle\",\n          valign: \"middle\",\n          bold: true,\n        }),\n        text([x0 + pad + 6.5, y], note.title, 2.2, { bold: true }),\n      );\n      y += 3.2;\n      for (const line of wrap(note.text, 2.0, w - pad * 2 - 6.5)) {\n        if (line) {\n          items.push(text([x0 + pad + 6.5, y], line, 2.0));\n          y += 2.7;\n        }\n      }\n      y += 2.2;\n    }\n    y += 1;\n    items.push(rule([x0, y - 2.5], [x1, y - 2.5]));\n    y += 2;\n  }\n\n  heading(\"NOTES\");\n  spec.notes.forEach((note, index) => {\n    const lines = wrap(note, 2.0, w - pad * 2 - 4);\n    lines.forEach((line, at) => {\n      if (at === 0) {\n        items.push(text([x0 + pad, y], `${index + 1}.`, 2.0));\n      }\n      items.push(text([x0 + pad + 4, y], line, 2.0));\n      y += 2.7;\n    });\n    y += 0.8;\n  });\n\n  if (spec.legend.length > 0) {\n    y += 2;\n    items.push(rule([x0, y - 2.5], [x1, y - 2.5]));\n    y += 2;\n    heading(\"LEGEND\");\n    for (const entry of spec.legend) {\n      items.push(...place(entry.symbol, x0 + pad, y - 3.6));\n      items.push(text([x0 + pad + 15, y - 0.4], entry.label, 2.0));\n      y += 6;\n    }\n  }\n\n  // From the bottom up: the title block, then revisions, then the north point.\n  const blockTop = size.height - MARGIN - 66;\n  const rows = Math.max(meta.revisions.length, 1);\n  const revTop = blockTop - 8 - 4 * (rows + 1);\n  if (spec.north !== null) {\n    items.push(...northPoint([x0 + w / 2, revTop - 24], spec.north));\n  }\n  items.push(rule([x0, revTop - 6], [x1, revTop - 6]));\n  items.push(text([x0 + pad, revTop - 1.5], \"REVISIONS\", 2.4, { bold: true }));\n  const cols = [x0 + pad, x0 + pad + 9, x0 + pad + 25, x1 - pad - 8];\n  [\"REV\", \"DATE\", \"DESCRIPTION\", \"BY\"].forEach((label, index) => {\n    items.push(\n      text([cols[index] as number, revTop + 3], label, 1.6, { color: GREY }),\n    );\n  });\n  meta.revisions.forEach((revision, index) => {\n    const row = revTop + 7 + 4 * index;\n    [revision.rev, revision.date, revision.description, revision.by].forEach(\n      (value, at) => {\n        items.push(text([cols[at] as number, row], value, 2.0));\n      },\n    );\n  });\n\n  // The title block.\n  const top = blockTop;\n  items.push(rule([x0, top], [x1, top], PEN.medium));\n  items.push(text([x0 + pad, top + 7], \"Furbnow\", 5, { bold: true }));\n  items.push(\n    text([x0 + pad, top + 11], \"Home retrofit design \u00B7 furbnow.com\", 1.9, {\n      color: GREY,\n    }),\n  );\n  let row = top + 14;\n  items.push(...cell(x0, row, w, 10, \"Project\", `${meta.address}`, 2.6, true));\n  row += 10;\n  items.push(...cell(x0, row, w, 10, \"Drawing\", spec.title, 2.6, true));\n  row += 10;\n  const half = w / 2;\n  items.push(\n    ...cell(x0, row, half, 7, \"Scale\", scaleText(spec), 2.2),\n    ...cell(x0 + half, row, half, 7, \"Date\", meta.date, 2.2),\n  );\n  row += 7;\n  items.push(\n    ...cell(x0, row, half, 7, \"Drawn\", meta.drawn, 2.2),\n    ...cell(x0 + half, row, half, 7, \"Checked\", meta.checked, 2.2),\n  );\n  row += 7;\n  items.push(...cell(x0, row, w, 7, \"Status\", meta.status, 2.2));\n  row += 7;\n  const revWidth = 16;\n  items.push(\n    ...cell(\n      x0,\n      row,\n      w - revWidth,\n      size.height - MARGIN - row,\n      \"Drawing number\",\n      spec.number,\n      2.8,\n      true,\n    ),\n    ...cell(\n      x1 - revWidth,\n      row,\n      revWidth,\n      size.height - MARGIN - row,\n      \"Rev\",\n      meta.revisions.at(-1)?.rev ?? \"\",\n      2.8,\n      true,\n    ),\n  );\n  return items;\n}\n\nfunction scaleText(spec: SheetSpec): string {\n  const scales = [...new Set(spec.views.map((view) => view.scale))].sort(\n    (a, b) => a - b,\n  );\n  if (scales.length === 0) {\n    return `NTS @ ${spec.paper}`;\n  }\n  return `${scales.map((scale) => `1:${scale}`).join(\", \")} @ ${spec.paper}`;\n}\n\n/** The sheet: frame, panel, and each view placed in rows, titled. */\nexport function composeSheet(spec: SheetSpec, meta: SheetMeta): Sheet {\n  const size = PAPER[spec.paper];\n  const area = drawingArea(spec.paper);\n  const items: Item[] = [\n    rect(\n      MARGIN,\n      MARGIN,\n      size.width - 2 * MARGIN,\n      size.height - 2 * MARGIN,\n      PEN.cut,\n    ),\n  ];\n  const placed: Sheet[\"placed\"] = [];\n\n  // Rows, each centred in the drawing area; the rows centred top to bottom.\n  const rows: View[][] = [];\n  let row: View[] = [];\n  let rowWidth = 0;\n  for (const view of spec.views) {\n    const width = viewSize(view).width;\n    if (row.length > 0 && rowWidth + VIEW_GAP + width > area.x1 - area.x0) {\n      rows.push(row);\n      row = [];\n      rowWidth = 0;\n    }\n    rowWidth += (row.length > 0 ? VIEW_GAP : 0) + width;\n    row.push(view);\n  }\n  if (row.length > 0) {\n    rows.push(row);\n  }\n  const heights = rows.map((views) =>\n    Math.max(...views.map((view) => viewSize(view).height)),\n  );\n  const total =\n    heights.reduce((sum, h) => sum + h, 0) +\n    VIEW_GAP * Math.max(0, rows.length - 1);\n  let y = area.y0 + Math.max(0, (area.y1 - area.y0 - total) / 2);\n  // Plans on a shared grid: one column lines up across, one row lines up down.\n  const boxes = spec.views.map(\n    (view) => extent(view.items) ?? { x0: 0, y0: 0, x1: 0, y1: 0 },\n  );\n  const unionX0 = Math.min(...boxes.map((b) => b.x0));\n  const unionX1 = Math.max(...boxes.map((b) => b.x1));\n  const column =\n    spec.align === true &&\n    rows.every((views) => views.length === 1) &&\n    unionX1 - unionX0 <= area.x1 - area.x0;\n  const sharedDx =\n    area.x0 + (area.x1 - area.x0 - (unionX1 - unionX0)) / 2 - unionX0;\n  const unionY0 = Math.min(...boxes.map((b) => b.y0));\n  const unionY1 = Math.max(...boxes.map((b) => b.y1));\n  const line = spec.align === true && rows.length === 1 && !column;\n  rows.forEach((views, index) => {\n    const widths = views.map((view) => viewSize(view).width);\n    const used =\n      widths.reduce((sum, w) => sum + w, 0) + VIEW_GAP * (views.length - 1);\n    let x = area.x0 + Math.max(0, (area.x1 - area.x0 - used) / 2);\n    const height = heights[index] as number;\n    views.forEach((view, at) => {\n      const box = extent(view.items) ?? { x0: 0, y0: 0, x1: 0, y1: 0 };\n      const own = viewSize(view);\n      // Sit each view on its row's baseline, centred in its slot.\n      const dx = column\n        ? sharedDx\n        : x - box.x0 + ((widths[at] as number) - (box.x1 - box.x0)) / 2;\n      // In a shared row, every plan's grid starts at the same height.\n      const dy = line ? y - unionY0 : y + (height - own.height) - box.y0;\n      items.push(...place(view.items, dx, dy));\n      const titleX = column\n        ? dx + box.x0\n        : x + ((widths[at] as number) - own.width) / 2;\n      const titleY = line ? y - unionY0 + unionY1 + 3 : dy + box.y1 + 3;\n      items.push(...viewTitle(view, titleX, titleY, spec.paper));\n      placed.push({ view, dx, dy });\n      x += (widths[at] as number) + VIEW_GAP;\n    });\n    y += height + VIEW_GAP;\n  });\n\n  if (spec.extra) {\n    items.push(...spec.extra);\n  }\n  items.push(...panel(spec, meta));\n  return {\n    number: spec.number,\n    title: spec.title,\n    paper: spec.paper,\n    width: size.width,\n    height: size.height,\n    svg: toSvg(items, size.width, size.height),\n    placed,\n  };\n}\n", "// The drawing set for a design: plans (existing and, for a proposal,\n// proposed), elevations, a section, the measures as annotated drawings, and\n// the window and door schedule, each on numbered sheets in the BS 1192 /\n// BS EN ISO 19650 form (project-originator-volume-level-type-role-number).\n\nimport { phasing } from \"../phasing\";\nimport type { Annotation, Design, Floor, Point, ScheduleRow } from \"../scene\";\nimport {\n  type DxfView,\n  type Item,\n  type P,\n  PEN,\n  RED,\n  extent,\n  toDxf,\n} from \"./draw\";\nimport { externalDimensions, internalDimensions } from \"./dims\";\nimport {\n  type Facing,\n  elevationView,\n  entranceNormal,\n  facings,\n} from \"./elevation\";\nimport {\n  anchorOnPaper,\n  callouts,\n  colorOf,\n  liveAnnotations,\n  markItems,\n  markedKinds,\n  quantity,\n  scheduleOf,\n  scheduleTable,\n} from \"./measures\";\nimport { type Building, building as buildingOf, rotate } from \"./model\";\nimport { type Phasing, type PlanView, planView } from \"./plan\";\nimport { type RoofFace, type RoofSource, simpleRoof } from \"./roof\";\nimport { Space } from \"./space\";\nimport { chooseCut, sectionMark, sectionView } from \"./section\";\nimport {\n  type KeyNote,\n  type LegendEntry,\n  type Paper,\n  type Sheet,\n  type SheetMeta,\n  type SheetSpec,\n  type View,\n  composeSheet,\n  drawingArea,\n  fits,\n  pack,\n} from \"./sheet\";\n\nexport type { Sheet } from \"./sheet\";\n\nexport type PlanScale = \"auto\" | 50 | 100;\n\nexport type SheetKind =\n  | \"plans\"\n  | \"existing\"\n  | \"elevations\"\n  | \"section\"\n  | \"measures\"\n  | \"schedule\";\n\nexport interface DrawingInput {\n  design: Design;\n  /** The house as it is, when `design` is a proposal. */\n  asIs?: Design | null;\n  address: string;\n  /** Who drew it, initials. */\n  drawn: string;\n  /** dd.mm.yy */\n  date: string;\n  paper: Paper;\n  planScale: PlanScale;\n  kinds: ReadonlySet<SheetKind>;\n  /** The design's measures schedule, for each measure's notes. */\n  schedule?: readonly ScheduleRow[];\n  roof?: RoofSource;\n  /** What the elevations' notes say about the roof drawn. */\n  roofNote?: string;\n}\n\nexport const GENERAL_NOTES = [\n  \"Do not scale from this drawing. Use figured dimensions only.\",\n  \"All dimensions are in millimetres unless stated otherwise.\",\n  \"Read with the specification and all other relevant drawings.\",\n  \"Drawn from a measured survey. Check all dimensions on site before work starts or anything is made, and report any discrepancy to Furbnow.\",\n  \"Wall constructions are as surveyed or assumed from the age of the house; confirm on site.\",\n];\n\nfunction projectCode(design: Design): string {\n  return `P${String(design.project).padStart(4, \"0\")}`;\n}\n\nfunction number(design: Design, level: string, n: number): string {\n  return `${projectCode(design)}-FUR-XX-${level}-DR-A-${n}`;\n}\n\nfunction levelCode(level: number): string {\n  return level < 0 ? `B${-level}` : String(level).padStart(2, \"0\");\n}\n\nfunction swatch(\n  fill: Extract<Item, { t: \"poly\" }>[\"fill\"],\n  stroke: number = PEN.light,\n): Item[] {\n  return [rectItem(fill, stroke)];\n}\n\nfunction rectItem(fill: Extract<Item, { t: \"poly\" }>[\"fill\"], w: number): Item {\n  return {\n    t: \"poly\",\n    pts: [\n      [0, 0],\n      [12, 0],\n      [12, 5],\n      [0, 5],\n    ],\n    closed: true,\n    ...(fill ? { fill } : {}),\n    s: { w },\n    layer: \"A-SHEET\",\n  };\n}\n\nfunction planLegend(scale: number, phasing: boolean): LegendEntry[] {\n  const detailed = scale <= 60;\n  const entries: LegendEntry[] = detailed\n    ? [\n        {\n          label: \"Cavity wall: brick, cavity, block\",\n          symbol: [\n            {\n              t: \"poly\",\n              pts: [\n                [0, 0],\n                [12, 0],\n                [12, 1.8],\n                [0, 1.8],\n              ],\n              closed: true,\n              fill: { hatch: \"brick\", bg: \"#ffffff\" },\n              s: { w: PEN.fine },\n              layer: \"A-SHEET\",\n            },\n            {\n              t: \"poly\",\n              pts: [\n                [0, 3.2],\n                [12, 3.2],\n                [12, 5],\n                [0, 5],\n              ],\n              closed: true,\n              fill: { hatch: \"block\", bg: \"#ffffff\" },\n              s: { w: PEN.fine },\n              layer: \"A-SHEET\",\n            },\n            {\n              t: \"line\",\n              a: [0, 0],\n              b: [12, 0],\n              s: { w: PEN.cut },\n              layer: \"A-SHEET\",\n            },\n            {\n              t: \"line\",\n              a: [0, 5],\n              b: [12, 5],\n              s: { w: PEN.cut },\n              layer: \"A-SHEET\",\n            },\n          ],\n        },\n        {\n          label: \"Solid masonry\",\n          symbol: swatch({ hatch: \"brick\", bg: \"#ffffff\" }, PEN.cut),\n        },\n        { label: \"Partition\", symbol: swatch({ hatch: \"stud\" }, PEN.cut) },\n      ]\n    : [\n        { label: \"Masonry wall\", symbol: swatch(\"#3c3c3c\", PEN.medium) },\n        { label: \"Partition\", symbol: swatch(\"#bdbdbd\", PEN.medium) },\n      ];\n  if (phasing) {\n    entries.push(\n      {\n        label: \"New wall\",\n        symbol: swatch({ hatch: \"new\", bg: \"#ffffff\" }, PEN.cut),\n      },\n      {\n        label: \"Wall to be removed\",\n        symbol: [\n          {\n            t: \"poly\",\n            pts: [\n              [0, 0],\n              [12, 0],\n              [12, 5],\n              [0, 5],\n            ],\n            closed: true,\n            s: { w: PEN.medium, color: RED, dash: [1.5, 1] },\n            layer: \"A-SHEET\",\n          },\n        ],\n      },\n    );\n  }\n  entries.push({\n    label: \"W01 / D01: window and door marks\",\n    symbol: [\n      {\n        t: \"poly\",\n        pts: [\n          [1.5, 0.9],\n          [10.5, 0.9],\n          [10.5, 4.1],\n          [1.5, 4.1],\n        ],\n        closed: true,\n        fill: \"#ffffff\",\n        s: { w: PEN.fine },\n        layer: \"A-SHEET\",\n      },\n      {\n        t: \"text\",\n        at: [6, 2.5],\n        text: \"W01\",\n        size: 1.8,\n        anchor: \"middle\",\n        valign: \"middle\",\n        layer: \"A-SHEET\",\n      },\n    ],\n  });\n  return entries;\n}\n\nfunction measureLegend(\n  kinds: readonly string[],\n  name: (kind: string) => string,\n  marks: Annotation[],\n): LegendEntry[] {\n  return kinds.map((kind) => {\n    const color = colorOf(kind);\n    const types = new Set(\n      marks\n        .filter((mark) => mark.kind === kind)\n        .map((mark) => mark.geometry.type),\n    );\n    let symbol: Item[];\n    if (types.has(\"line\")) {\n      symbol = [\n        {\n          t: \"line\",\n          a: [0, 2.5],\n          b: [12, 2.5],\n          s: { w: 1.4, color: shadeHex(color) },\n          layer: \"A-SHEET\",\n        },\n        {\n          t: \"line\",\n          a: [0, 2.5],\n          b: [12, 2.5],\n          s: { w: 0.25, color, dash: [1.6, 0.8] },\n          layer: \"A-SHEET\",\n        },\n      ];\n    } else if (types.has(\"area\")) {\n      symbol = [\n        {\n          t: \"poly\",\n          pts: [\n            [0, 0],\n            [12, 0],\n            [12, 5],\n            [0, 5],\n          ],\n          closed: true,\n          fill: shadeHex(color, 0.82),\n          s: { w: PEN.light, color, dash: [2, 1] },\n          layer: \"A-SHEET\",\n        },\n      ];\n    } else {\n      symbol = [\n        {\n          t: \"circle\",\n          c: [6, 2.5],\n          r: 1.9,\n          fill: \"#ffffff\",\n          s: { w: PEN.medium, color },\n          layer: \"A-SHEET\",\n        },\n        { t: \"circle\", c: [6, 2.5], r: 0.8, fill: color, layer: \"A-SHEET\" },\n      ];\n    }\n    return { label: name(kind), symbol };\n  });\n}\n\nfunction shadeHex(hex: string, amount = 0.55): string {\n  const value = Number.parseInt(hex.slice(1), 16);\n  const channels = [(value >> 16) & 255, (value >> 8) & 255, value & 255].map(\n    (channel) => Math.round(channel + (255 - channel) * amount),\n  );\n  return `#${channels.map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** How a proposal's walls differ from the house as it is, floor by floor,\n * as the editor's phases see it (phasing.ts): matched by position, so a\n * wall split to take an extension stays existing. */\nexport function phasingOf(\n  proposed: readonly Floor[],\n  asIs: readonly Floor[],\n  turn: number,\n): Map<number, Phasing> {\n  const out = new Map<number, Phasing>();\n  for (const floor of proposed) {\n    const before = asIs.find((other) => other.level === floor.level);\n    const { walls } = phasing(before?.scene ?? emptyScene(), floor.scene);\n    out.set(floor.id, {\n      pieces: walls.flatMap((wall) =>\n        wall.phase === \"existing\"\n          ? []\n          : [\n              {\n                a: rotate(wall.a, turn),\n                b: rotate(wall.b, turn),\n                thickness: wall.thickness,\n                phase: wall.phase,\n              },\n            ],\n      ),\n    });\n  }\n  return out;\n}\n\nfunction emptyScene(): Floor[\"scene\"] {\n  return {\n    schema: 2,\n    units: \"mm\",\n    vertices: [],\n    walls: [],\n    openings: [],\n    rooms: [],\n    emitters: [],\n  };\n}\n\ninterface Built {\n  sheets: Sheet[];\n  dxf: DxfView[];\n  /** What the set couldn't do as asked, for the dialog to say. */\n  notices: string[];\n}\n\n/** A plan at a scale, with its dimensions, tags and section mark. */\nfunction plan(\n  floor: Building[\"floors\"][number],\n  scale: number,\n  tags: ReadonlyMap<string, string>,\n  phasing: Phasing | null,\n  cut: ReturnType<typeof chooseCut>,\n): { view: PlanView; items: Item[] } {\n  const view = planView(floor, { scale, tags, phasing });\n  const items = [...view.items];\n  if (cut) {\n    // Keep the dimension figures off the section line's path.\n    const y = cut.y / scale;\n    view.space.addBox({\n      x0: view.body.x0 - 60,\n      y0: y - 1,\n      x1: view.body.x0,\n      y1: y + 1,\n    });\n    view.space.addBox({\n      x0: view.body.x1,\n      y0: y - 1,\n      x1: view.body.x1 + 60,\n      y1: y + 1,\n    });\n  }\n  items.push(\n    ...internalDimensions(view, floor),\n    ...externalDimensions(view, floor),\n  );\n  const box = extent(items);\n  if (cut && box) {\n    // Past the dimension strings at both ends, from the building's extent.\n    const k = 1 / scale;\n    items.push(\n      ...sectionMark(\n        cut,\n        scale,\n        Math.min(box.x0, cut.x0 * k) - 4,\n        Math.max(box.x1, cut.x1 * k) + 4,\n      ),\n    );\n  }\n  return { view, items };\n}\n\n/** The scale plans are drawn at: 1:50 when every floor fits the paper. */\nfunction chooseScale(\n  model: Building,\n  input: DrawingInput,\n  tags: ReadonlyMap<string, string>,\n): { scale: number; notice: string } {\n  const fitsAt = (scale: number) =>\n    model.floors.every((floor) =>\n      fits(\n        {\n          title: floor.name,\n          scale,\n          items: plan(floor, scale, tags, null, null).items,\n        },\n        input.paper,\n      ),\n    );\n  const wanted = input.planScale === \"auto\" ? 50 : input.planScale;\n  if (wanted === 50 && !fitsAt(50)) {\n    return {\n      scale: 100,\n      notice:\n        input.planScale === 50\n          ? `The plans don't fit ${input.paper} at 1:50, so they're drawn at 1:100. Choose A1 for 1:50.`\n          : \"\",\n    };\n  }\n  if (!fitsAt(wanted)) {\n    return {\n      scale: wanted,\n      notice: `The plans run off ${input.paper} at 1:${wanted}. Choose A1.`,\n    };\n  }\n  return { scale: wanted, notice: \"\" };\n}\n\n/** Every sheet asked for, in drawing-number order. */\nexport function drawingSet(input: DrawingInput): Built {\n  const design = input.design;\n  const roofOf = input.roof ?? simpleRoof;\n  const turn = design.plan_rotation;\n  const model = buildingOf(\n    design.floors,\n    design.fabric_types,\n    turn,\n    design.north_deg,\n  );\n  const asIs = input.asIs\n    ? buildingOf(\n        input.asIs.floors,\n        input.asIs.fabric_types,\n        turn,\n        input.asIs.north_deg ?? design.north_deg,\n      )\n    : null;\n  const meta: SheetMeta = {\n    project: projectCode(design),\n    address: input.address,\n    client: \"\",\n    date: input.date,\n    drawn: input.drawn,\n    checked: \"\",\n    status: \"S2 \u00B7 Suitable for information\",\n    revisions: [\n      {\n        rev: \"P01\",\n        date: input.date,\n        description: \"First issue\",\n        by: input.drawn,\n      },\n    ],\n  };\n  const sheets: Sheet[] = [];\n  const dxf: DxfView[] = [];\n  let dxfX = 0;\n  const addDxf = (views: readonly View[]) => {\n    for (const view of views) {\n      const box = extent(view.items);\n      if (!box) {\n        continue;\n      }\n      dxf.push({\n        items: view.items,\n        scale: view.scale,\n        // Only moved across: each view keeps its own levels, so every\n        // elevation and the section share one ground line.\n        origin: [dxfX - box.x0 * view.scale, 0],\n      });\n      dxfX += (box.x1 - box.x0) * view.scale + 3000;\n    }\n  };\n  const proposal = Boolean(asIs);\n  const measureName = (kind: string) =>\n    design.measures.find((m) => m.kind === kind)?.name ?? kind;\n  const marksByFloor = new Map<number, Annotation[]>(\n    design.floors.map((floor) => [\n      floor.id,\n      liveAnnotations(floor.annotations),\n    ]),\n  );\n  const schedule = scheduleOf(\n    model.floors,\n    design.fabric_types,\n    marksByFloor,\n    measureName,\n    turn,\n  );\n  const tags = new Map(schedule.map((entry) => [entry.openingId, entry.ref]));\n  const { scale, notice } = chooseScale(model, input, tags);\n  const cut = chooseCut(model);\n  const roof = roofOf(model, { front: entranceNormal(model) });\n\n  const emit = (\n    first: number,\n    level: string,\n    title: (index: number, count: number) => string,\n    views: View[],\n    extra: Partial<SheetSpec>,\n  ) => {\n    const groups = pack(views, input.paper);\n    groups.forEach((group, index) => {\n      sheets.push(\n        composeSheet(\n          {\n            paper: input.paper,\n            number: number(\n              design,\n              group.length === 1 && level === \"auto\"\n                ? levelOf(group[0] as View)\n                : level === \"auto\"\n                  ? \"ZZ\"\n                  : level,\n              first + index,\n            ),\n            title: title(index, groups.length),\n            views: group,\n            notes: GENERAL_NOTES,\n            legend: [],\n            north: null,\n            ...extra,\n          },\n          meta,\n        ),\n      );\n    });\n  };\n  const levelByTitle = new Map<string, string>();\n  const levelOf = (view: View) => levelByTitle.get(view.title) ?? \"ZZ\";\n\n  const planViews = (\n    source: Building,\n    phasing: Map<number, Phasing> | null,\n    prefix: string,\n  ): View[] =>\n    source.floors.map((floor) => {\n      const title = `${prefix}${floor.name} plan`;\n      levelByTitle.set(title, levelCode(floor.level));\n      return {\n        title,\n        scale,\n        items: plan(floor, scale, tags, phasing?.get(floor.id) ?? null, cut)\n          .items,\n      };\n    });\n\n  if (input.kinds.has(\"existing\") && asIs) {\n    const views = planViews(asIs, null, \"Existing \");\n    emit(\n      1001,\n      \"auto\",\n      (i, n) =>\n        n > 1\n          ? `Existing plans (${i + 1} of ${n})`\n          : views.length === 1\n            ? (views[0] as View).title\n            : \"Existing plans\",\n      views,\n      {\n        legend: planLegend(scale, false),\n        north: model.north,\n        align: true,\n      },\n    );\n    addDxf(views);\n  }\n  if (input.kinds.has(\"plans\")) {\n    const phased = input.asIs\n      ? phasingOf(design.floors, input.asIs.floors, turn)\n      : null;\n    const prefix = proposal ? \"Proposed \" : \"\";\n    const views = planViews(model, phased, prefix);\n    const title = proposal ? \"Proposed plans\" : \"Floor plans\";\n    emit(\n      proposal ? 1101 : 1001,\n      \"auto\",\n      (i, n) =>\n        n > 1\n          ? `${title} (${i + 1} of ${n})`\n          : views.length === 1\n            ? (views[0] as View).title\n            : title,\n      views,\n      {\n        legend: planLegend(scale, proposal),\n        north: model.north,\n        align: true,\n      },\n    );\n    addDxf(views);\n  }\n  if (input.kinds.has(\"elevations\")) {\n    const front = entranceNormal(model);\n    const elevationScale = input.paper === \"A1\" ? 50 : 100;\n    const views = facings(model, front).map((facing: Facing) => ({\n      title: proposal\n        ? `Proposed ${facing.title.charAt(0).toLowerCase()}${facing.title.slice(1)}`\n        : facing.title,\n      scale: elevationScale,\n      items: elevationView(model, facing, {\n        scale: elevationScale,\n        roof,\n        tags,\n      }),\n    }));\n    emit(\n      proposal ? 2101 : 2001,\n      \"ZZ\",\n      (i, n) =>\n        `${proposal ? \"Proposed elevations\" : \"Elevations\"}${n > 1 ? ` (${i + 1} of ${n})` : \"\"}`,\n      views,\n      {\n        notes: [\n          ...GENERAL_NOTES,\n          input.roofNote ??\n            \"The roof is drawn indicatively, pitched at 40\u00B0 with gable ends, until it is surveyed.\",\n        ],\n      },\n    );\n    addDxf(views);\n  }\n  if (input.kinds.has(\"section\") && cut) {\n    // 1:50 where the paper takes it, as Building Regs sections are drawn.\n    const at50: View = {\n      title: \"Section A\u2013A\",\n      scale: 50,\n      items: sectionView(model, cut, roof, 50),\n    };\n    const views = fits(at50, input.paper)\n      ? [at50]\n      : [{ ...at50, scale: 100, items: sectionView(model, cut, roof, 100) }];\n    emit(\n      proposal ? 3101 : 3001,\n      \"ZZ\",\n      () => (proposal ? \"Proposed section A\u2013A\" : \"Section A\u2013A\"),\n      views,\n      {\n        notes: [\n          ...GENERAL_NOTES,\n          \"Section position is shown on the plans. Floor zones are taken as 250 mm; confirm on site.\",\n        ],\n      },\n    );\n    addDxf(views);\n  }\n  if (input.kinds.has(\"measures\")) {\n    sheets.push(\n      ...measureSheets(input, model, meta, turn, measureName, scale, roof),\n    );\n  }\n  if (input.kinds.has(\"schedule\") && schedule.length > 0) {\n    const area = drawingArea(input.paper);\n    let rest = schedule;\n    let n = 6001;\n    while (rest.length > 0) {\n      const { items, rest: next } = scheduleTable(\n        rest,\n        area.x0,\n        area.y0 + 8,\n        area.x1 - area.x0,\n        area.y1 - area.y0 - 8,\n      );\n      if (next.length >= rest.length) {\n        // scheduleTable always takes a row; if not, say so rather than lose them.\n        throw new Error(\"The window and door schedule couldn't be laid out.\");\n      }\n      sheets.push(\n        composeSheet(\n          {\n            paper: input.paper,\n            number: number(design, \"ZZ\", n),\n            title: \"Window and door schedule\",\n            views: [],\n            notes: [\n              ...GENERAL_NOTES.slice(0, 3),\n              \"Sizes are structural openings as surveyed, width \u00D7 height. Check on site before ordering.\",\n              \"Sill heights are above finished floor level.\",\n            ],\n            legend: [],\n            north: null,\n            extra: items,\n          },\n          meta,\n        ),\n      );\n      rest = next;\n      n += 1;\n    }\n  }\n  return { sheets, dxf, notices: notice ? [notice] : [] };\n}\n\n/** The measures overview, then one sheet per measure: grey plans with the\n * marks over them and numbered callouts keyed to notes. */\nfunction measureSheets(\n  input: DrawingInput,\n  model: Building,\n  meta: SheetMeta,\n  turn: number,\n  measureName: (kind: string) => string,\n  planScale: number,\n  roof: RoofFace[],\n): Sheet[] {\n  const design = input.design;\n  const floors = model.floors;\n  const marks = new Map(\n    design.floors.map((floor) => [\n      floor.id,\n      liveAnnotations(floor.annotations),\n    ]),\n  );\n  const all = [...marks.values()].flat();\n  const kinds = markedKinds(design);\n  if (kinds.length === 0) {\n    return [];\n  }\n  // Grey plans under marks read fine at 1:100; A1 has room for 1:50.\n  const scale = input.paper === \"A1\" ? planScale : Math.max(planScale, 100);\n  const specNotes = new Map(\n    (input.schedule ?? []).map((row) => [row.kind, row.notes]),\n  );\n  const sheets: Sheet[] = [];\n\n  const drawFloor = (\n    floor: (typeof floors)[number],\n    chosen: Annotation[],\n    numberOf: (mark: Annotation) => number,\n  ): View => {\n    const under = chosen\n      .filter((mark) => mark.geometry.type === \"area\")\n      .flatMap((mark) => markItems(mark, turn, scale));\n    const view = planView(floor, { scale, muted: true, under });\n    const items: Item[] = [...view.items];\n    for (const mark of chosen.filter((mark) => mark.geometry.type !== \"area\")) {\n      items.push(...markItems(mark, turn, scale));\n    }\n    const box = extent(items) ?? view.body;\n    const body = {\n      x0: Math.min(box.x0, view.body.x0),\n      y0: Math.min(box.y0, view.body.y0),\n      x1: Math.max(box.x1, view.body.x1),\n      y1: Math.max(box.y1, view.body.y1),\n    };\n    items.push(\n      ...callouts(\n        chosen.map((mark) => ({\n          anchor: anchorOnPaper(mark, turn, scale),\n          number: numberOf(mark),\n        })),\n        body,\n        view.space,\n      ),\n    );\n    return { title: `${floor.name} plan`, scale, items };\n  };\n\n  // The overview: one number per measure.\n  {\n    const numberOf = (mark: Annotation) => kinds.indexOf(mark.kind) + 1;\n    const views = floors\n      .map((floor) => ({\n        floor,\n        chosen: (marks.get(floor.id) ?? []).filter((mark) =>\n          kinds.includes(mark.kind),\n        ),\n      }))\n      .filter(({ chosen }) => chosen.length > 0)\n      .map(({ floor, chosen }) => drawFloor(floor, chosen, numberOf));\n    const keyNotes: KeyNote[] = kinds.map((kind, index) => {\n      const mine = all.filter((mark) => mark.kind === kind);\n      const quantities = mine.map(quantity).filter(Boolean);\n      const where = [\n        ...new Set(mine.map((mark) => mark.label).filter(Boolean)),\n      ];\n      return {\n        number: index + 1,\n        title: measureName(kind),\n        text: [\n          where.join(\"; \"),\n          quantities.length > 0 ? `Total ${sumQuantities(mine)}` : \"\",\n          specNotes.get(kind) ?? \"\",\n        ]\n          .filter(Boolean)\n          .join(\". \"),\n      };\n    });\n    for (const [index, group] of pack(views, input.paper).entries()) {\n      sheets.push(\n        composeSheet(\n          {\n            paper: input.paper,\n            number: number(design, \"ZZ\", 5001 + index),\n            title: \"Retrofit measures: key plan\",\n            views: group,\n            notes: [\n              ...GENERAL_NOTES.slice(0, 3),\n              \"Existing building shown grey. Measures are shown where they go; extents are indicative until confirmed by the installer's survey.\",\n            ],\n            legend: measureLegend(kinds, measureName, all),\n            north: model.north,\n            keyNotes,\n            align: true,\n          },\n          meta,\n        ),\n      );\n    }\n  }\n\n  // One sheet per measure, a number per mark.\n  // Numbered on from 5101, one after another, however many each takes.\n  let next = 5101;\n  kinds.forEach((kind) => {\n    const mine = all.filter((mark) => mark.kind === kind);\n    const order = new Map(mine.map((mark, at) => [mark.id, at + 1]));\n    const views = floors\n      .map((floor) => ({\n        floor,\n        chosen: (marks.get(floor.id) ?? []).filter(\n          (mark) => mark.kind === kind,\n        ),\n      }))\n      .filter(({ chosen }) => chosen.length > 0)\n      .map(({ floor, chosen }) =>\n        drawFloor(floor, chosen, (mark) => order.get(mark.id) ?? 0),\n      );\n    if (WALL_MEASURES.includes(kind)) {\n      views.push(\n        ...treatedElevations(model, mine, marks, turn, roof, order, kind),\n      );\n    }\n    const keyNotes: KeyNote[] = mine.map((mark) => {\n      const floor = design.floors.find((f) =>\n        f.annotations.some((a) => a.id === mark.id),\n      );\n      return {\n        number: order.get(mark.id) ?? 0,\n        title: mark.label || measureName(kind),\n        text: [floor?.name ?? \"\", mark.notes, quantity(mark)]\n          .filter(Boolean)\n          .join(\". \"),\n      };\n    });\n    const spec = specNotes.get(kind);\n    for (const group of pack(views, input.paper)) {\n      sheets.push(\n        composeSheet(\n          {\n            paper: input.paper,\n            number: number(design, \"ZZ\", next++),\n            title: `${measureName(kind)}`,\n            views: group,\n            notes: [\n              ...(spec ? [spec] : []),\n              ...GENERAL_NOTES.slice(0, 3),\n              \"Existing building shown grey.\",\n            ],\n            legend: measureLegend([kind], measureName, mine),\n            north: model.north,\n            keyNotes,\n            align: true,\n          },\n          meta,\n        ),\n      );\n    }\n  });\n  return sheets;\n}\n\n/** The wall insulation measures, which an elevation shows best. */\nconst WALL_MEASURES = [\n  \"EXTERNAL_WALL_INSULATION_EWI\",\n  \"INTERNAL_WALL_INSULATION_IWI\",\n  \"CAVITY_WALL_INSULATION_CWI\",\n];\n\n/** Whether a wall runs along a polyline: its middle near a segment of the\n * line that it lies parallel to. */\nfunction runsAlong(\n  a: Point,\n  b: Point,\n  line: readonly Point[],\n  reach: number,\n): boolean {\n  const mid: Point = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n  const length = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n  for (let index = 0; index + 1 < line.length; index++) {\n    const p = line[index] as Point;\n    const q = line[index + 1] as Point;\n    const dx = q[0] - p[0];\n    const dy = q[1] - p[1];\n    const span = Math.hypot(dx, dy);\n    if (span === 0) {\n      continue;\n    }\n    const parallel = Math.abs(\n      ((b[0] - a[0]) * dx + (b[1] - a[1]) * dy) / (length * span),\n    );\n    const t = Math.max(\n      0,\n      Math.min(\n        1,\n        ((mid[0] - p[0]) * dx + (mid[1] - p[1]) * dy) / (span * span),\n      ),\n    );\n    const near = Math.hypot(mid[0] - p[0] - dx * t, mid[1] - p[1] - dy * t);\n    if (parallel > 0.9 && near < reach) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/** The elevations that show a wall measure's runs: the outside walls each\n * run lies along toned, a numbered callout on each. */\nfunction treatedElevations(\n  model: Building,\n  mine: readonly Annotation[],\n  marks: ReadonlyMap<number, Annotation[]>,\n  turn: number,\n  roof: RoofFace[],\n  order: ReadonlyMap<number, number>,\n  kind: string,\n): View[] {\n  const color = colorOf(kind);\n  const highlight = new Map<string, string>();\n  const markOf = new Map<string, number>();\n  for (const floor of model.floors) {\n    for (const mark of (marks.get(floor.id) ?? []).filter((m) =>\n      mine.includes(m),\n    )) {\n      if (mark.geometry.type !== \"line\") {\n        continue;\n      }\n      const line = mark.geometry.points.map((point) => rotate(point, turn));\n      for (const wall of floor.walls.filter((w) => w.kind !== \"INTERNAL\")) {\n        if (runsAlong(wall.a, wall.b, line, wall.thickness + 200)) {\n          highlight.set(`${floor.id}:${wall.id}`, color);\n          markOf.set(`${floor.id}:${wall.id}`, order.get(mark.id) ?? 0);\n        }\n      }\n    }\n  }\n  if (highlight.size === 0) {\n    return [];\n  }\n  const views: View[] = [];\n  for (const facing of facings(model, entranceNormal(model))) {\n    const anchors = new Map<string, P>();\n    const items = elevationView(model, facing, {\n      scale: 100,\n      roof,\n      highlight,\n      anchors,\n    });\n    if (anchors.size === 0) {\n      continue;\n    }\n    // One callout per mark per elevation, on its widest face.\n    const seen = new Set<number>();\n    const calls = [...anchors.entries()]\n      .map(([key, anchor]) => ({ anchor, number: markOf.get(key) ?? 0 }))\n      .filter((call) => {\n        if (seen.has(call.number)) {\n          return false;\n        }\n        seen.add(call.number);\n        return true;\n      });\n    const body = extent(items);\n    if (body) {\n      items.push(...callouts(calls, body, new Space()));\n    }\n    views.push({ title: facing.title, scale: 100, items });\n  }\n  return views;\n}\n\nfunction sumQuantities(marks: Annotation[]): string {\n  const area = marks.reduce((sum, mark) => sum + Number(mark.area_m2 ?? 0), 0);\n  const length = marks.reduce(\n    (sum, mark) => sum + Number(mark.length_m ?? 0),\n    0,\n  );\n  const count = marks.filter((mark) => mark.geometry.type === \"point\").length;\n  const parts = [];\n  if (area > 0) {\n    parts.push(`${area.toFixed(1)} m\u00B2`);\n  }\n  if (length > 0) {\n    parts.push(`${length.toFixed(1)} m`);\n  }\n  if (count > 0 && area === 0 && length === 0) {\n    parts.push(`${count} no.`);\n  }\n  return parts.join(\", \");\n}\n\n/** The model-space DXF of every view drawn. */\nexport function dxfOf(built: Built): string {\n  return toDxf(built.dxf);\n}\n", "// The 3D view's roof (#3517) for the drawings: the same roofOver, at the same\n// pitch, overhang and kind, its triangles merged back into the planar faces\n// an elevation outlines.\n\nimport type { Point } from \"../scene\";\nimport { type RoofSpec, roofOver } from \"../three/roof\";\nimport {\n  type Point3,\n  type RoofFace,\n  type RoofSource,\n  outshots,\n  wallTop,\n} from \"./roof\";\n\ntype V = [number, number, number];\n\nfunction sub(a: V, b: V): V {\n  return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nfunction cross(a: V, b: V): V {\n  return [\n    a[1] * b[2] - a[2] * b[1],\n    a[2] * b[0] - a[0] * b[2],\n    a[0] * b[1] - a[1] * b[0],\n  ];\n}\n\nfunction dot(a: V, b: V): number {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction unit(v: V): V {\n  const length = Math.hypot(...v) || 1;\n  return [v[0] / length, v[1] / length, v[2] / length];\n}\n\n/** The convex hull of coplanar points, in order round the plane. */\nfunction hull(points: V[], normal: V): V[] {\n  const u = unit(\n    Math.abs(normal[2]) < 0.9\n      ? cross(normal, [0, 0, 1])\n      : cross(normal, [1, 0, 0]),\n  );\n  const v = cross(normal, u);\n  const flat = points\n    .map((point) => ({ point, x: dot(point, u), y: dot(point, v) }))\n    .sort((a, b) => a.x - b.x || a.y - b.y);\n  const turn = (\n    o: (typeof flat)[number],\n    a: (typeof flat)[number],\n    b: (typeof flat)[number],\n  ) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);\n  const half = (list: typeof flat) => {\n    const out: typeof flat = [];\n    for (const p of list) {\n      while (\n        out.length >= 2 &&\n        turn(out[out.length - 2] as never, out[out.length - 1] as never, p) <=\n          1e-6\n      ) {\n        out.pop();\n      }\n      out.push(p);\n    }\n    out.pop();\n    return out;\n  };\n  return [...half(flat), ...half([...flat].reverse())].map((p) => p.point);\n}\n\n/**\n * Triangles (metres, X across, Y up, Z the plan's y) as planar faces in plan\n * millimetres: each run of triangles on one plane becomes its hull, as\n * Soup.polygon fans a face out.\n */\nexport function facesOf(\n  positions: readonly number[],\n  kind: RoofFace[\"kind\"],\n): RoofFace[] {\n  const faces: RoofFace[] = [];\n  let group: V[] = [];\n  let plane: { normal: V; offset: number } | null = null;\n  const flush = () => {\n    if (plane && group.length >= 3) {\n      const points = hull(group, plane.normal).map(\n        ([x, y, z]) => [x, y, z] as Point3,\n      );\n      const flatTop = Math.abs(plane.normal[2]) > 0.98;\n      faces.push({ kind: flatTop && kind === \"slope\" ? \"flat\" : kind, points });\n    }\n    group = [];\n    plane = null;\n  };\n  for (let index = 0; index + 8 < positions.length; index += 9) {\n    const [a, b, c] = [0, 3, 6].map((at): V => {\n      const x = positions[index + at] as number;\n      const up = positions[index + at + 1] as number;\n      const y = positions[index + at + 2] as number;\n      return [x * 1000, y * 1000, up * 1000];\n    }) as [V, V, V];\n    const normal = unit(cross(sub(b, a), sub(c, a)));\n    const offset = dot(normal, a);\n    const same =\n      plane !== null &&\n      Math.abs(Math.abs(dot(normal, plane.normal)) - 1) < 1e-4 &&\n      Math.abs(Math.abs(offset) - Math.abs(plane.offset)) < 1;\n    if (!same) {\n      flush();\n      plane = { normal, offset };\n    }\n    group.push(a, b, c);\n  }\n  flush();\n  return faces;\n}\n\n/** The 3D view's roof over the top storey, outshots flat as ever. */\nexport function modelRoof(spec: RoofSpec): RoofSource {\n  return (building) => {\n    const faces = outshots(building);\n    const top = building.floors[building.floors.length - 1];\n    if (!top) {\n      return faces;\n    }\n    // On centrelines, as the 3D view takes each storey's outline.\n    const outlines: Point[][] = top.loops.map((loop) =>\n      loop.map((edge) => edge.a),\n    );\n    const party = top.walls\n      .filter((wall) => wall.kind === \"PARTY\")\n      .map((wall) => [wall.a, wall.b] as [Point, Point]);\n    const roof = roofOver(outlines, party, spec, wallTop(top));\n    return [\n      ...faces,\n      ...facesOf(roof.roof.positions, \"slope\"),\n      ...facesOf(roof.gables.positions, \"gable\"),\n    ];\n  };\n}\n", "// The editor's Drawings export: pick the paper, the plan scale and which\n// sheets, see each one as it will print, then download them as a PDF (drawn\n// here, set as pages on the server) or the views at full size as a DXF.\n// It reads the saved design, so it stands apart from the editor's state.\n\nimport { AlpineComponent } from \"alpinejs\";\nimport { fetchDesign, fetchSchedule, getCookie } from \"../api\";\nimport type { Design, ScheduleRow } from \"../scene\";\nimport {\n  type RoofHints,\n  type RoofKind,\n  type RoofSettings,\n  roofFor,\n} from \"../three/roof\";\nimport { type PlanScale, type SheetKind, drawingSet, dxfOf } from \"./index\";\nimport { markedKinds } from \"./measures\";\nimport { modelRoof } from \"./modelroof\";\nimport type { RoofSource } from \"./roof\";\nimport type { Paper, Sheet } from \"./sheet\";\n\ninterface Row {\n  number: string;\n  title: string;\n  include: boolean;\n  thumb: string;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  open: boolean;\n  loading: boolean;\n  busy: \"\" | \"pdf\" | \"dxf\";\n  error: string;\n  /** What the sheets couldn't do as asked: a scale that didn't fit. */\n  notice: string;\n  paper: Paper;\n  scale: \"auto\" | \"50\" | \"100\";\n  kinds: Record<SheetKind, boolean>;\n  proposal: boolean;\n  /** Measure sheets asked for, but nothing is marked on the plan. */\n  unmarked: boolean;\n  /** The package the editor would put on the plan, or \"\" with none kept. */\n  packageName: string;\n  /** Closed while the editor puts the package on the plan. */\n  placing: boolean;\n  rows: Row[];\n  selected: number;\n  preview: string;\n  show(): void;\n  close(): void;\n  build(): void;\n  pick(index: number): void;\n  chosen(): number;\n  downloadPdf(): void;\n  downloadDxf(): void;\n  placePackage(): void;\n  /** Drawn again when it went on; cancelled or failed, left closed. */\n  placementEnded(placed: boolean): void;\n}\n\n/** The package \"Put this package on the plan\" would use: the recommended one. */\nexport function packageToPlace(design: Pick<Design, \"packages\">): string {\n  const saved =\n    design.packages.find((candidate) => candidate.recommended) ??\n    design.packages[0];\n  return saved?.name ?? \"\";\n}\n\nconst KIND_NAMES: Record<RoofKind, string> = {\n  gable: \"gabled\",\n  hip: \"hipped\",\n  flat: \"flat\",\n};\n\n/** The roof as the 3D view draws it, from its saved settings; null leaves\n * the drawings' own indicative roof. */\nasync function roofOf(\n  design: Design,\n): Promise<{ roof: RoofSource; roofNote: string } | null> {\n  if (!design.model_url) {\n    return null;\n  }\n  try {\n    const response = await fetch(design.model_url, {\n      headers: { Accept: \"application/json\" },\n    });\n    if (!response.ok) {\n      return null;\n    }\n    const meta = (await response.json()) as {\n      roof: RoofSettings;\n      hints: RoofHints;\n    };\n    const { spec } = roofFor(meta.roof, meta.hints, design.fabric_types);\n    const how =\n      spec.kind === \"flat\"\n        ? \"flat\"\n        : `${KIND_NAMES[spec.kind]}, pitched at ${spec.pitchDeg}\u00B0 with ${spec.overhangMm} mm eaves`;\n    return {\n      roof: modelRoof(spec),\n      roofNote: `The roof is drawn ${how}, as set in the 3D view. Confirm on site.`,\n    };\n  } catch {\n    return null;\n  }\n}\n\nfunction dataUrl(svg: string): string {\n  return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nfunction today(): string {\n  const now = new Date();\n  const two = (value: number) => String(value).padStart(2, \"0\");\n  return `${two(now.getDate())}.${two(now.getMonth() + 1)}.${String(now.getFullYear()).slice(2)}`;\n}\n\nfunction save(blob: Blob, name: string): void {\n  const url = URL.createObjectURL(blob);\n  const link = document.createElement(\"a\");\n  link.href = url;\n  link.download = name;\n  document.body.appendChild(link);\n  link.click();\n  link.remove();\n  setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\nexport default (): AlpineComponent<State> => {\n  // The design and the built sheets stay out of Alpine's proxies.\n  let design: Design | null = null;\n  let asIs: Design | null = null;\n  let schedule: readonly ScheduleRow[] = [];\n  let roof: Awaited<ReturnType<typeof roofOf>> = null;\n  let sheets: Sheet[] = [];\n  let built: ReturnType<typeof drawingSet> | null = null;\n\n  return {\n    open: false,\n    loading: false,\n    busy: \"\",\n    error: \"\",\n    notice: \"\",\n    paper: \"A3\",\n    scale: \"auto\",\n    kinds: {\n      existing: true,\n      plans: true,\n      elevations: true,\n      section: true,\n      measures: true,\n      schedule: true,\n    },\n    proposal: false,\n    unmarked: false,\n    packageName: \"\",\n    placing: false,\n    rows: [],\n    selected: 0,\n    preview: \"\",\n\n    show() {\n      this.placing = false;\n      this.open = true;\n      this.error = \"\";\n      this.loading = true;\n      const data = this.$root.dataset;\n      this.proposal = Boolean(data[\"asIsUrl\"]);\n      // Always the saved design: the editor saves as it goes.\n      Promise.all([\n        fetchDesign(data[\"designUrl\"] ?? \"\"),\n        data[\"asIsUrl\"] ? fetchDesign(data[\"asIsUrl\"]) : Promise.resolve(null),\n      ])\n        .then(async ([current, existing]) => {\n          design = current;\n          asIs = existing;\n          schedule = await fetchSchedule(current.schedule_url)\n            .then((result) => result.rows)\n            .catch(() => []);\n          roof = await roofOf(current);\n          this.loading = false;\n          this.build();\n        })\n        .catch((error: unknown) => {\n          this.loading = false;\n          this.error = error instanceof Error ? error.message : String(error);\n        });\n    },\n\n    close() {\n      this.open = false;\n    },\n\n    build() {\n      if (!design) {\n        return;\n      }\n      const data = this.$root.dataset;\n      const kinds = new Set(\n        (Object.entries(this.kinds) as [SheetKind, boolean][])\n          .filter(([kind, on]) => on && (kind !== \"existing\" || this.proposal))\n          .map(([kind]) => kind),\n      );\n      try {\n        built = drawingSet({\n          design,\n          asIs,\n          address: data[\"address\"] ?? design.name,\n          drawn: data[\"drawn\"] ?? \"\",\n          date: today(),\n          paper: this.paper,\n          planScale: (this.scale === \"auto\"\n            ? \"auto\"\n            : Number(this.scale)) as PlanScale,\n          kinds,\n          schedule,\n          ...(roof ?? {}),\n        });\n      } catch (error) {\n        this.error = error instanceof Error ? error.message : String(error);\n        return;\n      }\n      sheets = built.sheets;\n      this.unmarked = kinds.has(\"measures\") && markedKinds(design).length === 0;\n      this.packageName = packageToPlace(design);\n      this.notice = built.notices.join(\" \");\n      this.error = \"\";\n      const was = new Map(this.rows.map((row) => [row.number, row.include]));\n      this.rows = sheets.map((sheet) => ({\n        number: sheet.number,\n        title: sheet.title,\n        include: was.get(sheet.number) ?? true,\n        thumb: dataUrl(sheet.svg),\n      }));\n      this.pick(Math.min(this.selected, Math.max(0, sheets.length - 1)));\n    },\n\n    pick(index) {\n      this.selected = index;\n      const sheet = sheets[index];\n      this.preview = sheet ? dataUrl(sheet.svg) : \"\";\n    },\n\n    chosen() {\n      return this.rows.filter((row) => row.include).length;\n    },\n\n    downloadPdf() {\n      const chosen = sheets.filter(\n        (_sheet, index) => this.rows[index]?.include,\n      );\n      if (chosen.length === 0 || this.busy) {\n        return;\n      }\n      this.busy = \"pdf\";\n      this.error = \"\";\n      const data = this.$root.dataset;\n      const title = `${data[\"address\"] ?? design?.name ?? \"Design\"} drawings`;\n      fetch(`${data[\"designUrl\"] ?? \"\"}drawings/`, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"X-CSRFToken\": getCookie(\"csrftoken\"),\n        },\n        body: JSON.stringify({\n          title,\n          sheets: chosen.map((sheet) => ({\n            number: sheet.number,\n            title: sheet.title,\n            paper: sheet.paper,\n            svg: sheet.svg,\n          })),\n        }),\n      })\n        .then(async (response) => {\n          if (!response.ok) {\n            throw new Error(`Making the PDF failed (${response.status}).`);\n          }\n          save(await response.blob(), `${title}.pdf`);\n        })\n        .catch((error: unknown) => {\n          this.error = error instanceof Error ? error.message : String(error);\n        })\n        .finally(() => {\n          this.busy = \"\";\n        });\n    },\n\n    // The editor holds the scenarios, so it puts the package on the plan and\n    // says when it's done; then the sheets are drawn again.\n    placePackage() {\n      this.placing = true;\n      this.open = false;\n      window.dispatchEvent(new CustomEvent(\"place-package\"));\n    },\n\n    placementEnded(placed) {\n      const waiting = this.placing;\n      this.placing = false;\n      if (waiting && placed) {\n        this.show();\n      }\n    },\n\n    downloadDxf() {\n      if (!built) {\n        return;\n      }\n      const data = this.$root.dataset;\n      save(\n        new Blob([dxfOf(built)], { type: \"application/dxf\" }),\n        `${data[\"address\"] ?? design?.name ?? \"Design\"} drawings.dxf`,\n      );\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\nfunction getCookie(name: string): string {\n  for (const part of document.cookie.split(\";\")) {\n    const [key, ...rest] = part.trim().split(\"=\");\n    if (key === name) {\n      return decodeURIComponent(rest.join(\"=\"));\n    }\n  }\n  return \"\";\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  deleting: boolean;\n  url: string;\n  message: string;\n  init(): void;\n  destroy(): Promise<void>;\n}\n\nexport default (): AlpineComponent<State> => ({\n  deleting: false,\n  url: \"\",\n  message: \"\",\n\n  init() {\n    this.url = this.$root.dataset[\"url\"] ?? \"\";\n    this.message = this.$root.dataset[\"confirm\"] ?? \"Delete this item?\";\n  },\n\n  async destroy() {\n    const { url, message } = this;\n    if (!url || !window.confirm(message)) {\n      return;\n    }\n    this.deleting = true;\n    try {\n      const response = await fetch(url, {\n        method: \"DELETE\",\n        headers: {\n          \"X-CSRFToken\": getCookie(\"csrftoken\"),\n          \"X-Requested-With\": \"XMLHttpRequest\",\n        },\n      });\n      if (response.ok) {\n        window.location.reload();\n        return;\n      }\n      window.alert(\"Could not delete \u2014 try again shortly.\");\n    } finally {\n      this.deleting = false;\n    }\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\nfunction getCookie(name: string): string {\n  for (const part of document.cookie.split(\";\")) {\n    const [key, ...rest] = part.trim().split(\"=\");\n    if (key === name) {\n      return decodeURIComponent(rest.join(\"=\"));\n    }\n  }\n  return \"\";\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  editing: boolean;\n  saving: boolean;\n  title: string;\n  edit(): void;\n  cancel(): void;\n  rename(): Promise<void>;\n}\n\n// Inline rename for a resource, configured by data attributes: data-url (a\n// POST endpoint accepting a `title` form field) and data-title (the current\n// value). Reloads on success so the server-rendered list reflects the change.\nexport default (): AlpineComponent<State> => ({\n  editing: false,\n  saving: false,\n  title: \"\",\n\n  edit() {\n    this.title = this.$root.dataset[\"title\"] ?? \"\";\n    this.editing = true;\n    this.$nextTick(() => {\n      const input =\n        this.$root.querySelector<HTMLInputElement>(\"input[name=title]\");\n      input?.focus();\n      input?.select();\n    });\n  },\n\n  cancel() {\n    this.editing = false;\n  },\n\n  async rename() {\n    const url = this.$root.dataset[\"url\"] ?? \"\";\n    if (!url) {\n      return;\n    }\n    this.saving = true;\n    try {\n      const response = await fetch(url, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/x-www-form-urlencoded\",\n          \"X-CSRFToken\": getCookie(\"csrftoken\"),\n          \"X-Requested-With\": \"XMLHttpRequest\",\n        },\n        body: new URLSearchParams({ title: this.title.trim() }).toString(),\n      });\n      if (response.ok) {\n        window.location.reload();\n        return;\n      }\n      window.alert(\"Could not rename \u2014 try again shortly.\");\n    } finally {\n      this.saving = false;\n    }\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\nexport interface State extends Record<string | symbol, unknown> {\n  drop(event: unknown): void;\n}\n\nexport default (): AlpineComponent<State> => ({\n  drop(event: unknown) {\n    if (!(event instanceof DragEvent)) {\n      return;\n    }\n    event.preventDefault();\n\n    const input = this.$el.closest(\"form\")?.querySelector(\"input[type='file']\");\n\n    if (!(input instanceof HTMLInputElement)) {\n      return;\n    }\n\n    input.files = event.dataTransfer?.files ?? null;\n    input.dispatchEvent(new Event(\"change\"));\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\n// A drag-and-drop zone wrapping a hidden multiple file input. Files dropped or\n// chosen accumulate (so you can add a few at a time), and the input's FileList\n// is kept in sync so the surrounding form posts every staged file. A bubbling\n// change event is dispatched so the save-all component notices unsaved changes.\n\ninterface State extends Record<string | symbol, unknown> {\n  over: boolean;\n  names: string[];\n  onDrop(event: unknown): void;\n  onPick(event: unknown): void;\n  add(list: FileList | null): void;\n  removeAt(index: number): void;\n  sync(): void;\n}\n\nconst fileId = (file: File): string =>\n  `${file.name}:${file.size}:${file.lastModified}`;\n\nexport default (): AlpineComponent<State> => {\n  const staged: File[] = [];\n\n  return {\n    over: false,\n    names: [],\n    onDrop(event: unknown) {\n      this.over = false;\n      if (event instanceof DragEvent) {\n        this.add(event.dataTransfer?.files ?? null);\n      }\n    },\n    onPick(event: unknown) {\n      // Ignore the synthetic change dispatched by sync(); only react to the\n      // user's own file-dialog selection.\n      if (!(event instanceof Event) || !event.isTrusted) {\n        return;\n      }\n      if (this.$refs[\"input\"] instanceof HTMLInputElement) {\n        this.add(this.$refs[\"input\"].files);\n      }\n    },\n    add(list: FileList | null) {\n      if (!list) {\n        return;\n      }\n      const have = new Set(staged.map(fileId));\n      for (const file of list) {\n        if (file instanceof File && !have.has(fileId(file))) {\n          staged.push(file);\n          have.add(fileId(file));\n        }\n      }\n      this.sync();\n    },\n    removeAt(index: number) {\n      staged.splice(index, 1);\n      this.sync();\n    },\n    sync() {\n      if (!(this.$refs[\"input\"] instanceof HTMLInputElement)) {\n        return;\n      }\n      const data = new DataTransfer();\n      for (const file of staged) {\n        data.items.add(file);\n      }\n      this.$refs[\"input\"].files = data.files;\n      this.names = staged.map((file) => file.name);\n      this.$refs[\"input\"].dispatchEvent(new Event(\"change\", { bubbles: true }));\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  files: File[];\n  error: string | null;\n}\n\nexport default (): AlpineComponent<State> => ({\n  files: [],\n  error: null,\n  change(event: unknown) {\n    if (typeof event !== \"object\" || event === null) {\n      return;\n    }\n\n    if (!(\"target\" in event)) {\n      return;\n    }\n\n    if (!(event.target instanceof HTMLInputElement)) {\n      return;\n    }\n\n    this.files = Array.from(event.target.files ?? []);\n    this.error = null;\n  },\n  empty() {\n    return this.files.length === 0;\n  },\n  handleDrop(event: DragEvent) {\n    const fileInput = this.$refs[\"input\"];\n    if (!fileInput || !(fileInput instanceof HTMLInputElement)) {\n      return;\n    }\n\n    this.files = [];\n    event.preventDefault();\n    this.error = null;\n    const fileList = event.dataTransfer?.files ?? [];\n    const dT = new DataTransfer();\n\n    for (const file of fileList) {\n      const fileType = file.type.toLowerCase();\n      if (\n        !fileType ||\n        (fileType !== \"application/pdf\" && !fileType.startsWith(\"image/\"))\n      ) {\n        this.error = \"Only PDF and image files are allowed\";\n      } else {\n        dT.items.add(file);\n        this.files.push(file);\n      }\n    }\n    fileInput.files = dT.files;\n  },\n  removeStoredFile(pk: number) {\n    const hiddenFileInput = document.getElementById(\n      `file_${pk}`,\n    ) as HTMLInputElement;\n    hiddenFileInput.remove();\n  },\n  removeFile(name: string) {\n    const fileInput = this.$refs[\"input\"];\n    if (\n      !fileInput ||\n      !(fileInput instanceof HTMLInputElement) ||\n      !fileInput.files\n    ) {\n      return;\n    }\n    const dt = new DataTransfer();\n\n    for (const file of fileInput.files) {\n      if (file.name !== name) {\n        dt.items.add(file);\n      }\n    }\n\n    fileInput.files = dt.files;\n    this.files = this.files.filter((file) => file.name !== name);\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  totalScore: number;\n}\n\nexport default (): AlpineComponent<State> => ({\n  totalScore: 0,\n\n  updateScore(score: number) {\n    this.totalScore = score;\n  },\n});\n", "import type { FigureMount, Readout } from \"./core/stage\";\nimport { inject } from \"./core/styles\";\n\n/**\n * Linework \u2014 the public wrapper around an engine. An engine draws into an svg\n * it is handed and writes its caption to a read-out; this makes both, dresses\n * the host element, and gives back the two calls a consumer needs. It only\n * ever removes what it added.\n */\n\nexport type Options = {\n  /** How strongly the figure answers the pointer, from 0 (subtle) to 1 (strong). Default 0.5. */\n  intensity?: number;\n  /** Default: follow the page (a `.dark` or `[data-theme=dark]` ancestor). */\n  theme?: \"auto\" | \"light\" | \"dark\";\n  /** The accessible name. Each figure has a default description. */\n  label?: string;\n  /** The figure's caption, each time it changes: `\"rest\"`, `\"270mm\"`, `\"layer 2\"`. */\n  onRead?: (text: string) => void;\n};\n\nexport type Figure = {\n  update(options: Options): void;\n  destroy(): void;\n};\n\n/** What a figure is: its engine, and what it says about itself. Its name lives in apps/projects/measures.py LINEWORK. */\nexport type Spec = {\n  /** The default accessible name: what the figure shows and what the pointer does. */\n  label: string;\n  /** The figure's number at intensity 0, 0.5 and 1. */\n  range: readonly [number, number, number];\n  /** A viewBox point on the part that answers the pointer, for the smoke test. */\n  probe: readonly [number, number];\n  engine: FigureMount;\n};\n\n/** The figure's own number for an intensity: two straight lines meeting at 0.5. */\nexport function parameter(spec: Spec, value: unknown): number {\n  const [lo, mid, hi] = spec.range;\n  const n = typeof value === \"number\" && Number.isFinite(value) ? value : 0.5;\n  const i = Math.min(1, Math.max(0, n));\n  const v =\n    i <= 0.5\n      ? lo + (i / 0.5) * (mid - lo)\n      : mid + ((i - 0.5) / 0.5) * (hi - mid);\n  return Math.round(v * 1000) / 1000;\n}\n\nconst NS = \"http://www.w3.org/2000/svg\";\nconst mounted = new WeakMap<Element, () => void>();\n\nexport function create(\n  id: string,\n  spec: Spec,\n  el: HTMLElement,\n  options: Options = {},\n): Figure {\n  mounted.get(el)?.();\n  const opts: Options = { ...options };\n  inject(el.ownerDocument);\n\n  const owned = new Set<string>();\n  const attr = (name: string, value: string | null) => {\n    if (!owned.has(name) && el.hasAttribute(name)) return;\n    if (value === null) {\n      el.removeAttribute(name);\n      owned.delete(name);\n    } else {\n      el.setAttribute(name, value);\n      owned.add(name);\n    }\n  };\n  const dress = () => {\n    attr(\n      \"data-linework-theme\",\n      opts.theme === \"light\" || opts.theme === \"dark\" ? opts.theme : null,\n    );\n    attr(\"aria-label\", opts.label ?? spec.label);\n  };\n  attr(\"data-linework\", id);\n  attr(\"role\", \"img\");\n  dress();\n\n  const svg = el.ownerDocument.createElementNS(NS, \"svg\");\n  svg.setAttribute(\"viewBox\", \"0 0 400 320\");\n  svg.setAttribute(\"aria-hidden\", \"true\");\n  el.appendChild(svg);\n\n  let text: string | null = null;\n  const read: Readout = {\n    get textContent() {\n      return text;\n    },\n    set textContent(value) {\n      const next = value ?? \"\";\n      if (next === text) return;\n      text = next;\n      opts.onRead?.(next);\n    },\n  };\n\n  let value = parameter(spec, opts.intensity);\n  const engine = spec.engine({ stage: el, svg, read }, value);\n  if (text === null) read.textContent = \"rest\";\n\n  let dead = false;\n  const destroy = () => {\n    if (dead) return;\n    dead = true;\n    if (mounted.get(el) === destroy) mounted.delete(el);\n    engine.destroy();\n    svg.remove();\n    for (const name of owned) el.removeAttribute(name);\n    owned.clear();\n  };\n  mounted.set(el, destroy);\n\n  return {\n    update(next) {\n      if (dead) return;\n      Object.assign(opts, next);\n      const v = parameter(spec, opts.intensity);\n      if (v !== value) {\n        value = v;\n        engine.set(v);\n      }\n      dress();\n    },\n    destroy,\n  };\n}\n", "import {\n  type Camera,\n  facing,\n  type PrismPaths,\n  type Projector,\n  prism,\n  rings,\n  seg,\n} from \"./core/iso\";\n\n/**\n * Small drawing helpers the measure figures share. The world is x/y on the\n * ground and z up; at Cam(45, 0.5, S) +x runs down to the right and +y down\n * to the left, so the faces you see are the +y face (lower left) and the +x\n * face (lower right), and painting goes by ascending x + y.\n */\n\n/** A rounded box from (x0, y0, z0) to (x1, y1, z1): a silhouette and one crease on its lid. */\nexport function box(\n  C: Camera,\n  P: Projector,\n  x0: number,\n  y0: number,\n  z0: number,\n  x1: number,\n  y1: number,\n  z1: number,\n  r = 1.2,\n  b = 0.8,\n): PrismPaths {\n  const [ring, inner] = rings(\n    x0,\n    y0,\n    x1,\n    y1,\n    r,\n    Math.min(b, (x1 - x0) / 3, (y1 - y0) / 3),\n  );\n  return prism(P, facing(C), ring, inner, z0, z1);\n}\n\n/** Lines across the +y face at y, every `step` up from z0: courses on a wall's front. */\nexport function coursesY(\n  P: Projector,\n  y: number,\n  x0: number,\n  x1: number,\n  z0: number,\n  z1: number,\n  step: number,\n): string {\n  let d = \"\";\n  for (let z = z0 + step; z < z1 - step * 0.3; z += step)\n    d += seg(P(x0, y, z), P(x1, y, z));\n  return d;\n}\n\n/** Lines across the +x face at x, every `step` up from z0. */\nexport function coursesX(\n  P: Projector,\n  x: number,\n  y0: number,\n  y1: number,\n  z0: number,\n  z1: number,\n  step: number,\n): string {\n  let d = \"\";\n  for (let z = z0 + step; z < z1 - step * 0.3; z += step)\n    d += seg(P(x, y0, z), P(x, y1, z));\n  return d;\n}\n\n/** Brick perpends on the +y face: a short upright every `len` along, offset by half on alternate courses. */\nexport function perpendsY(\n  P: Projector,\n  y: number,\n  x0: number,\n  x1: number,\n  z0: number,\n  z1: number,\n  course: number,\n  len: number,\n): string {\n  let d = \"\";\n  let row = 0;\n  for (let z = z0; z < z1 - course * 0.3; z += course, row++) {\n    const top = Math.min(z + course, z1);\n    for (let x = x0 + (row % 2 ? len / 2 : len); x < x1 - 1; x += len)\n      d += seg(P(x, y, z), P(x, y, top));\n  }\n  return d;\n}\n\n/** Brick perpends on the +x face. */\nexport function perpendsX(\n  P: Projector,\n  x: number,\n  y0: number,\n  y1: number,\n  z0: number,\n  z1: number,\n  course: number,\n  len: number,\n): string {\n  let d = \"\";\n  let row = 0;\n  for (let z = z0; z < z1 - course * 0.3; z += course, row++) {\n    const top = Math.min(z + course, z1);\n    for (let y = y0 + (row % 2 ? len / 2 : len); y < y1 - 1; y += len)\n      d += seg(P(x, y, z), P(x, y, top));\n  }\n  return d;\n}\n", "import { corners, hull, type Projector, r2, type Vec2 } from \"../core/iso\";\n\n/**\n * Helpers the insulation build-up figures share (walls, floor, roof): moving\n * a drawn layer by a world offset, and picking a layer by its pose.\n */\n\n/** Even-odd point-in-polygon, on screen. */\nexport function inside(pt: Vec2, pg: readonly Vec2[]): boolean {\n  let c = false;\n  for (let i = 0, j = pg.length - 1; i < pg.length; j = i++) {\n    const [xi, yi] = pg[i]!;\n    const [xj, yj] = pg[j]!;\n    if (\n      yi > pt[1] !== yj > pt[1] &&\n      pt[0] < ((xj - xi) * (pt[1] - yi)) / (yj - yi) + xi\n    )\n      c = !c;\n  }\n  return c;\n}\n\n/**\n * The svg transform that moves a drawing by (dx, dy, dz) in the world. The\n * camera is orthographic, so a world offset is one screen offset: a layer is\n * drawn once and slides by its group's transform.\n */\nexport function shift(P: Projector, dx: number, dy: number, dz: number) {\n  const o = P(0, 0, 0);\n  const q = P(dx, dy, dz);\n  return `translate(${r2(q[0] - o[0])} ${r2(q[1] - o[1])})`;\n}\n\n/** The screen outline of a box moved by (dx, dy, dz): what a pick tests against. */\nexport function outline(\n  P: Projector,\n  b: readonly [number, number, number, number, number, number],\n  dx = 0,\n  dy = 0,\n  dz = 0,\n): Vec2[] {\n  return hull(corners(...b).map(([x, y, z]) => P(x + dx, y + dy, z + dz)));\n}\n", "import {\n  Cam,\n  corners,\n  fit,\n  open,\n  poly,\n  proj,\n  ringAt,\n  rrect,\n  seg,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { shift } from \"./_walls\";\n\n/**\n * Bathroom refit: a room corner. Along the left wall a bath, its rim inset\n * round the tub, under a tiled surround with a bar valve and a shower riser\n * up to a round head; along the right wall a WC and a basin on its pedestal.\n * The pointer picks a fitting and the bright moves to it: the shower runs,\n * or the bath, WC or basin lifts off its footprint as if to be swapped. At\n * rest the shower is bright and runs a little.\n *\n * The pattern: pick, as Exploded. One tween per fitting and one for the\n * water; the pick is the nearest fitting's rest pose on screen.\n */\n\nconst T = 5;\nconst H = 90;\nconst LX = 128;\nconst LY = 92;\nconst BX = 30;\nconst BY = 72;\nconst BZ = 22;\nconst TOP = 82;\nconst HEAD: Vec3 = [14, 14, 76];\nconst FALL = 25;\nconst JETS = 7;\nconst REST_FLOW = 0.6;\nconst NAMES = [\"shower\", \"bath\", \"wc\", \"basin\"] as const;\nconst AT: Vec3[] = [\n  [6, 14, 62],\n  [15, 44, 22],\n  [61, 16, 30],\n  [106, 11, 46],\n];\n\ntype Box = [number, number, number, number, number, number, number?, number?];\ntype Quad = [number, number, number, number];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let D = value;\n  const C = Cam(45, 0.5, 1.5);\n  fit(C, corners(-T, -T, -3, LX, LY, H));\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n  const add = (to: Element, ...b: Box) => {\n    const s = solid(to);\n    put(s, box(C, P, ...b));\n    return s;\n  };\n  const ring = (to: Element, cls: string, q: Quad, r: number, z: number) =>\n    path(to, cls, poly(ringAt(P, rrect(...q, r, 6), z)));\n\n  // the floor, the two walls, and their tiles: a surround and a splashback\n  add(g, -T, -T, -3, LX, LY, 0, 3, 1.6);\n  add(g, -T, -T, 0, 0, LY, H, 1.2, 0.7);\n  add(g, 0, -T, 0, LX, 0, H, 1.2, 0.7);\n  path(\n    g,\n    \"nf lo\",\n    coursesX(P, 0, 0.5, BY, BZ, TOP, 10) +\n      perpendsX(P, 0, 0, BY, BZ, TOP, 10, 20) +\n      open([P(0, 0.5, TOP), P(0, BY, TOP), P(0, BY, BZ)]) +\n      coursesY(P, 0, 90, 122, 48, 66, 9) +\n      perpendsY(P, 0, 90, 122, 48, 66, 9, 16) +\n      open([P(90, 0, 48), P(90, 0, 66), P(122, 0, 66), P(122, 0, 48)]),\n  );\n\n  // the shower: a bar valve, the riser up from it, the arm and a round head\n  const [hx, hy, hz] = HEAD;\n  add(g, 0, 6, 39, 3.5, 22, 45, 2.4, 0.6);\n  const shower = [\n    add(g, 0, 13.2, 45, 1.6, 14.8, hz + 2, 0.7, 0.3),\n    add(g, 0, 13.2, hz + 0.5, hx, 14.8, hz + 2, 0.6, 0.3),\n    add(g, hx - 6.5, hy - 6.5, hz - 2.5, hx + 6.5, hy + 6.5, hz, 6.5, 1.2),\n  ];\n\n  /** A fitting that lifts: its foot's outline on the floor, its parts in a group. */\n  const fitting = (foot: Box, ...rest: Box[]) => {\n    const [x0, y0, , x1, y1, , r = 1.2] = foot;\n    ring(g, \"nf dash\", [x0, y0, x1, y1], r, 0);\n    const fg = mk(\"g\", {}, g);\n    const solids = [foot, ...rest].map((b) => add(fg, ...b));\n    return { g: fg, parts: solids, tw: tween(0), drawn: Number.NaN };\n  };\n\n  // the bath, its rim inset round the tub and a panel line down its side\n  const bath = fitting([0, 0, 0, BX, BY, BZ, 2.4, 0.8]);\n  ring(bath.g, \"nf\", [3.5, 3.5, BX - 3.5, BY - 3.5], 8, BZ);\n  path(bath.g, \"nf lo\", seg(P(BX, 3, BZ - 4), P(BX, BY - 3, BZ - 4)));\n  const spray = path(g, \"nf\");\n\n  // the WC: foot, cistern, pan and lid, and the flush button\n  const wc = fitting(\n    [55, 8, 0, 67, 26, 14, 5, 1],\n    [50, 0, 27, 72, 9, 52, 2.4, 0.8],\n    [51, 4, 14, 71, 34, 24, 9.5, 1],\n    [51.5, 4.5, 24, 70.5, 33.5, 26, 9, 1.4],\n  );\n  ring(wc.g, \"nf lo\", [58.8, 2.3, 63.2, 6.7], 2.2, 52);\n\n  // the basin: pedestal, bowl, tap and spout, and the bowl's opening\n  const basin = fitting(\n    [101, 1, 0, 111, 12, 40, 3, 0.8],\n    [92, 0, 40, 120, 22, 48, 5, 1],\n    [104.5, 1.5, 48, 107.5, 4.5, 55, 1.2, 0.4],\n    [105, 2, 53, 107, 10, 55.5, 0.8, 0.3],\n  );\n  ring(basin.g, \"nf\", [95, 5.5, 117, 19], 6, 48);\n  const lifts = [bath, wc, basin];\n  const lit = [shower, ...lifts.map((f) => f.parts)];\n  const flow = tween(REST_FLOW);\n  let time = 0;\n\n  /** The water: `w` of the jets running, dashes falling and spreading a little. */\n  const jets = (w: number) => {\n    let d = \"\";\n    for (let i = 0; i < Math.ceil(JETS * w); i++) {\n      const k = (i * 3) % JETS;\n      const a = (k / JETS) * Math.PI * 2 + 0.5;\n      const [c, s] = [Math.cos(a), Math.sin(a)];\n      const at = (t: number, r = 2.5 + 4.5 * t) =>\n        P(hx + r * c, hy + r * s, hz - 2.5 - t * (hz - 2.5 - FALL));\n      for (const p of [0, 0.5].map((j) => (time * 1.3 + k * 0.29 + j) % 1))\n        d += seg(at(p), at(Math.min(1, p + 0.05 + 0.09 * w)));\n    }\n    return d;\n  };\n\n  const B = register(stage, (dt, now) => {\n    let moving = !tdone(flow, now);\n    for (const f of lifts) {\n      const v = tval(f.tw, now) * D;\n      if (v !== f.drawn) f.g.setAttribute(\"transform\", shift(P, 0, 0, v));\n      f.drawn = v;\n      if (!tdone(f.tw, now)) moving = true;\n    }\n    const w = tval(flow, now);\n    const still = reducedMotion();\n    if (!still) time += dt;\n    draw(spray, w > 0.01 ? jets(w) : \"\");\n    return moving || (w > 0.01 && !still);\n  });\n  bag.add(B.unregister);\n\n  /** Fitting a takes the bright and lifts, or the shower runs; the rest settle 40ms apart. */\n  const choose = (a: number, rest: boolean) => {\n    const now = performance.now();\n    lifts.forEach((f, i) => {\n      tset(f.tw, !rest && i + 1 === a ? 1 : 0, now, Math.abs(i + 1 - a) * 40);\n    });\n    lit.forEach((parts, i) => {\n      for (const s of parts) s.sil.classList.toggle(\"hi\", i === a);\n    });\n    tset(flow, a === 0 ? (rest ? REST_FLOW : 1) : 0, now, 0);\n    B.wake();\n  };\n  choose(0, true);\n\n  const anchors = AT.map((q) => P(...q));\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const d = anchors.map((q) => Math.hypot(p[0] - q[0], p[1] - q[1]));\n        const a = d.indexOf(Math.min(...d));\n        if ((d[a] ?? 1e9) > 70) return;\n        choose(a, false);\n        read.textContent = NAMES[a] ?? \"rest\";\n      },\n      leave: () => {\n        choose(0, true);\n        read.textContent = \"rest\";\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      D = v;\n      for (const f of lifts) f.drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A bathroom corner: a bath under a tiled surround with a shower riser and head over it, a WC and a basin on its pedestal. Pointing at a fitting lifts it off its footprint as if to be swapped, or runs the shower.\",\n  range: [5, 9, 14],\n  probe: [229, 169],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  poly,\n  proj,\n  rrect,\n  seg,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\n\n/**\n * Battery storage: a slim unit hung on a wall plate, a cable duct running\n * from its foot to the floor. On its face is a gauge, a column of segment\n * bars. The pointer's height on the face sets the charge, on a spring; the\n * segments light up to it and the top lit one is the bright mark. At rest the\n * battery is at 62%.\n *\n * The pattern: scrub. One spring for the charge, read on the plane of the\n * unit's face, which never moves.\n */\n\nconst L = 150;\nconst WH = 104;\nconst FX = 34;\nconst X0 = 2;\nconst X1 = 15;\nconst Y0 = 52;\nconst Y1 = 88;\nconst Z0 = 22;\nconst Z1 = 96;\nconst N = 8;\nconst BAR = 5;\nconst PITCH = 7.6;\nconst GZ = Z0 + 9;\nconst REST = 0.62;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.55);\n  fit(C, corners(-6, 0, -3, FX, L, WH));\n  const P = proj(C);\n  const level = spring(REST, { k: value });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, -6, 0, -3, FX, L, 0, 2, 1));\n  put(solid(g), box(C, P, -6, 0, 0, 0, L, WH, 1.2, 0.7));\n  put(solid(g), box(C, P, 0, 0, 0, 1.6, L, 7, 0.6, 0.4));\n  const ym = (Y0 + Y1) / 2;\n  put(solid(g), box(C, P, 0, ym + 6, 0, 5, ym + 12, Z0, 0.8, 0.5));\n  put(solid(g), box(C, P, X0, Y0, Z0, X1, Y1, Z1, 3, 1.4));\n\n  // the side's vent slot, and the gauge's bars up the face\n  path(g, \"nf lo\", seg(P(X1 - 4, Y1, Z0 + 10), P(X1 - 4, Y1, Z1 - 10)));\n  const bars = Array.from({ length: N }, (_, i) => {\n    const z = GZ + i * PITCH;\n    const q = rrect(ym - 9, z, ym + 9, z + BAR, 1.4, 3);\n    const rim = path(g, \"nf lo\", poly(q.map((s) => P(X1, s.u, s.v))));\n    const mid = z + BAR / 2;\n    return {\n      rim,\n      fill: path(g, \"nf\", seg(P(X1, ym - 6, mid), P(X1, ym + 6, mid))),\n    };\n  });\n\n  let shown = -1;\n  const B = register(stage, (dt) => {\n    const moving = stepS(level, dt);\n    const lit = clamp(Math.round(level.x * N), 1, N);\n    if (lit !== shown) {\n      shown = lit;\n      bars.forEach((b, i) => {\n        const cls = i < lit - 1 ? \"nf\" : i === lit - 1 ? \"nf hi\" : \"nf lo\";\n        b.rim.setAttribute(\"class\", cls);\n        b.fill.setAttribute(\"class\", cls);\n        b.fill.style.display = i < lit ? \"\" : \"none\";\n      });\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [y, z] = onWall(P, [X1, 0, 0], [0, 1], p);\n        if (y < -10 || y > L + 10) return;\n        level.t = clamp((z - GZ + PITCH / 2) / (N * PITCH), 0.08, 1);\n        read.textContent = `${Math.round(level.t * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        level.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      level.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A slim home battery hung on a wall, with a column of charge bars on its face. Moving up and down the battery sets its charge.\",\n  range: [40, 100, 220],\n  probe: [215, 110],\n  engine,\n};\n", "import {\n  hull,\n  open,\n  type Projector,\n  poly,\n  type Ring,\n  run,\n  type Sample,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\n\n/**\n * Shared by the heat pump, ventilation, radiator and heat-controls figures:\n * round things on an upright face. A face is a frame (o, a, b) in the world,\n * with `a` and `b` its two in-plane unit axes; `on` maps (u, v) on it to the\n * screen. Fan blades are drawn on such a face.\n */\n\n/** Toward the viewer for Cam(45, 0.5): a face whose normal has a positive dot with it is seen. */\nconst V: Vec3 = [\n  Math.SQRT1_2 * Math.sqrt(0.75),\n  Math.SQRT1_2 * Math.sqrt(0.75),\n  0.5,\n];\n\n/** (u, v) on the plane through o spanned by a and b, projected. */\nexport const on =\n  (P: Projector, o: Vec3, a: Vec3, b: Vec3) =>\n  (u: number, v: number): Vec2 =>\n    P(\n      o[0] + a[0] * u + b[0] * v,\n      o[1] + a[1] * u + b[1] * v,\n      o[2] + a[2] * u + b[2] * v,\n    );\n\n/**\n * A rounded solid along axis e from s0 to s1, its cross-section `ring` in the\n * (a, b) plane round o: the hull of its two ends, and one crease on the end\n * at s1 where it meets the side the viewer sees.\n */\nexport function bar(\n  P: Projector,\n  o: Vec3,\n  e: Vec3,\n  a: Vec3,\n  b: Vec3,\n  ring: Ring,\n  inner: Ring,\n  s0: number,\n  s1: number,\n) {\n  const at = (q: Sample, s: number) =>\n    P(\n      o[0] + e[0] * s + a[0] * q.u + b[0] * q.v,\n      o[1] + e[1] * s + a[1] * q.u + b[1] * q.v,\n      o[2] + e[2] * s + a[2] * q.u + b[2] * q.v,\n    );\n  const seen = (q: Sample) =>\n    (a[0] * q.nu + b[0] * q.nv) * V[0] +\n      (a[1] * q.nu + b[1] * q.nv) * V[1] +\n      (a[2] * q.nu + b[2] * q.nv) * V[2] >\n    0;\n  return {\n    sil: poly(\n      hull(ring.map((q) => at(q, s0)).concat(ring.map((q) => at(q, s1)))),\n    ),\n    crease: open(run(inner, seen).map((q) => at(q, s1))),\n  };\n}\n\n/** A circle of radius r about (cu, cv) on a face, n points, as a closed path. */\nexport const circle = (\n  at: (u: number, v: number) => Vec2,\n  r: number,\n  n = 48,\n  cu = 0,\n  cv = 0,\n) =>\n  poly(\n    Array.from({ length: n }, (_, i) => {\n      const t = (i / n) * Math.PI * 2;\n      return at(cu + r * Math.cos(t), cv + r * Math.sin(t));\n    }),\n  );\n\nexport type Blades = {\n  n: number;\n  /** Hub and tip radius. */\n  r0: number;\n  r1: number;\n  /** How far round the blade sweeps from hub to tip, radians. */\n  sweep: number;\n  /** The blade's angular width at the hub and at the tip, radians. */\n  w0: number;\n  w1: number;\n};\n\n/** The outlines of n blades turned to `phase`, each a closed path: leading edge out, tip, trailing edge back. */\nexport function blades(\n  at: (u: number, v: number) => Vec2,\n  B: Blades,\n  phase: number,\n): string {\n  const K = 8;\n  let d = \"\";\n  for (let i = 0; i < B.n; i++) {\n    const th = phase + (i / B.n) * Math.PI * 2;\n    const pts: Vec2[] = [];\n    const edge = (t: number, side: number) => {\n      const r = B.r0 + (B.r1 - B.r0) * t;\n      const w = B.w0 + (B.w1 - B.w0) * t;\n      const a = th + B.sweep * t * t + (side * w) / 2;\n      return at(r * Math.cos(a), r * Math.sin(a));\n    };\n    for (let k = 0; k <= K; k++) pts.push(edge(k / K, 1));\n    // a round tip: the arc at r1 between the two edges\n    for (let k = 1; k < 4; k++) pts.push(edge(1, 1 - k / 2));\n    for (let k = K; k >= 0; k--) pts.push(edge(k / K, -1));\n    d += poly(pts);\n  }\n  return d;\n}\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  poly,\n  proj,\n  rrect,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { bar, circle, on } from \"./_fans\";\n\n/**\n * Main heating: a wall-hung boiler on a slice of wall, its flue rising from\n * the lid and bending back into the wall, the flow and return dropping from\n * its underside through their valves and bending away along the wall. A\n * window low on the front shows the burner's flame, which flickers on its own\n * while on screen. The pointer's height on the boiler sets the output, and\n * the flame grows and shrinks to it on a spring. The flame is the bright line;\n * at rest the boiler runs at 60%.\n *\n * The pattern: scrub, with ambient motion on top. One spring for the output,\n * read on the plane of the front face, which never moves.\n */\n\nconst D = 24;\nconst B0 = 38;\nconst B1 = 78;\nconst YC = (B0 + B1) / 2;\nconst Z0 = 44;\nconst Z1 = 104;\nconst FZ = 118;\nconst FR = 5;\nconst WY0 = -44;\nconst WY1 = 90;\nconst WZ = 128;\nconst PX = 7;\nconst BASE = 19;\nconst FH = 19;\nconst REST = 0.6;\nconst X: Vec3 = [1, 0, 0];\nconst Y: Vec3 = [0, 1, 0];\nconst Z: Vec3 = [0, 0, 1];\n\nconst at = (o: Vec3, d: Vec3, s: number) =>\n  o.map((v, i) => v + d[i]! * s) as Vec3;\nconst sub = (a: Vec3, b: Vec3) => at(a, b, -1);\nconst unit = (v: Vec3) => at([0, 0, 0], v, 1 / Math.hypot(...v));\n\n/** A pipe's centre line through `pts`, each corner turned on a radius `br` in three straight pieces. */\nfunction centre(pts: Vec3[], br: number): Vec3[] {\n  const out: Vec3[] = [pts[0]!];\n  for (let i = 1; i < pts.length - 1; i++) {\n    const di = unit(sub(pts[i]!, pts[i - 1]!));\n    const dn = unit(sub(pts[i + 1]!, pts[i]!));\n    const c = at(at(pts[i]!, di, -br), dn, br);\n    for (let t = 0; t <= Math.PI / 2 + 1e-9; t += Math.PI / 6)\n      out.push(at(at(c, dn, -br * Math.cos(t)), di, br * Math.sin(t)));\n  }\n  return out.concat([pts[pts.length - 1]!]);\n}\n\n/** A box's corners, then its corner radius and bevel. */\ntype Box = [number, number, number, number, number, number, number?, number?];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.56);\n  fit(C, corners(-8, WY0, 0, D, WY1, WZ));\n  const P = proj(C);\n  const out = spring(REST, { k: value });\n  let time = 0;\n\n  const g = mk(\"g\", {}, svg);\n  const add = (...b: Box) => put(solid(g), box(C, P, ...b));\n  /** A round pipe of radius r through corners `pts`, far end first, in the plane square to `n`. */\n  const pipe = (pts: Vec3[], br: number, r: number, n: Vec3) => {\n    const c = centre(pts, br);\n    for (let i = 0; i < c.length - 1; i++) {\n      const d = sub(c[i + 1]!, c[i]!);\n      const e = unit(d);\n      const b: Vec3 = [\n        e[1] * n[2] - e[2] * n[1],\n        e[2] * n[0] - e[0] * n[2],\n        e[0] * n[1] - e[1] * n[0],\n      ];\n      const len = Math.hypot(...d);\n      put(solid(g), bar(P, c[i]!, e, n, b, circ(r, 32), [], 0, len));\n    }\n  };\n\n  // the wall, and the flue's collar on it\n  add(-8, WY0, 0, 0, WY1, WZ, 1.6, 1.2);\n  const ring = [circ(FR + 2.6, 48), circ(FR + 1.4, 48)] as const;\n  put(solid(g), bar(P, [0, YC, FZ], X, Y, Z, ...ring, 0, 1.4));\n\n  // flow and return: along the wall from the far end, a bend up, a valve under the boiler\n  [YC - 8, YC + 8].forEach((y, i) => {\n    const knee: Vec3 = [PX, y, i ? 10 : 19];\n    pipe([at(knee, Y, WY0 + PX - y), knee, [PX, y, Z0 + 2]], 5, 1.8, X);\n    add(PX - 2.4, y - 2.4, 28, PX + 2.4, y + 2.4, 33, 1, 0.5);\n  });\n\n  // the casing, its fascia and controls, the flame window\n  add(0, B0, Z0, D, B1, Z1, 3, 1.4);\n  const f = on(P, [D, YC, Z0], [0, -1, 0], Z);\n  const rr = (u0: number, v0: number, u1: number, v1: number, r: number) =>\n    poly(rrect(u0, v0, u1, v1, r).map((q) => f(q.u, q.v)));\n  path(\n    g,\n    \"nf lo\",\n    seg(f(-18.5, 10), f(18.5, 10)) +\n      circle(f, 1.7, 20, -14, 5) +\n      circle(f, 1.7, 20, -8.5, 5) +\n      rr(3, 3, 15, 7.5, 0.8) +\n      rr(-10, 17, 10, 41, 1.6) +\n      seg(f(-8, BASE - 0.6), f(8, BASE - 0.6)),\n  );\n  path(g, \"nf\", rr(-12, 15, 12, 43, 2.6));\n  // three tongues of flame, the middle one painted last so it covers the other two\n  const flames = [0, 2, 1].map((i) => ({ i, el: path(g, \"hi\") }));\n\n  // the flue: up off the lid, turned back into the wall\n  const elbow: Vec3 = [D / 2, YC, FZ];\n  pipe([[0, YC, FZ], elbow, at(elbow, Z, Z1 - 0.5 - FZ)], 7, FR, Y);\n\n  /** One tongue of flame at u = cu: h tall, w wide, its tip swayed by s. */\n  const tongue = (cu: number, h: number, w: number, s: number) => {\n    const pts: Vec2[] = [];\n    const edge = (t: number, side: number) => {\n      const hw = (w / 2) * (1 - t) ** 0.8 * (1 + 0.9 * t) * (0.75 + t) ** 0.3;\n      return f(cu + side * hw + s * t * t, BASE + h * t);\n    };\n    for (let k = 0; k <= 10; k++) pts.push(edge(k / 10, -1));\n    for (let k = 9; k >= 0; k--) pts.push(edge(k / 10, 1));\n    return poly(pts);\n  };\n\n  const tick = (dt: number) => {\n    const moving = stepS(out, dt);\n    const still = reducedMotion();\n    if (!still) time += dt;\n    // the outer tongues shorter and leaning out, each flickering on its own\n    for (const { i, el } of flames) {\n      const fl = 1 + 0.08 * Math.sin(time * 9 + i * 2.3);\n      const h = Math.max(1.2, FH * out.x * (i === 1 ? 1 : 0.66) * fl);\n      const s = (i - 1) * 1.4 + 0.9 * Math.sin(time * 6.1 + i * 1.7);\n      const w = i === 1 ? 7.4 : 6;\n      draw(el, tongue((i - 1) * 4.6, h, w, s * Math.min(1, h / 8)));\n    }\n    return moving || !still;\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [y, z] = onWall(P, [D, 0, 0], [0, 1], p);\n        if (y < B0 - 14 || y > B1 + 14 || z < Z0 - 24 || z > FZ + 10) return;\n        out.t = clamp((z - Z0 - 4) / (Z1 - Z0 - 8), 0.05, 1);\n        read.textContent = `output ${Math.round(out.t * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        out.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      out.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A wall-hung boiler with its flue turned back into the wall and the flow and return pipes dropping from beneath it, a flame showing through a window on its front. Moving up and down the boiler turns the output, and the flame, up and down.\",\n  range: [40, 100, 220],\n  probe: [166, 150],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, onWall, open, proj, seg } from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  type Attrs,\n  disposer,\n  dot,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\n\n/**\n * Damp works: a cut-away solid brick wall on its footing, the ground outside\n * and the floor inside, with a damp-proof course a little above the ground.\n * Below it, rising damp: a soft stipple in the brickwork under a wavy tide\n * line. The pointer's height on the wall raises or lowers the tide with a\n * spring; it can't pass the course, which takes the bright when it holds the\n * damp back. At rest the tide stands below the course and the course is bright.\n *\n * The pattern: scrub, as the cavity wall. One spring for the tide, read on\n * the plane of the wall's cut face, which never moves.\n */\n\n/** The cut face is the +y face at Y; the wall runs from x W0 to W1, the ground outside beyond. */\nconst Y = 60;\nconst W0 = 32;\nconst W1 = 54;\nconst END = 92;\nconst BASE = -27;\nconst FOOT = -19.5;\nconst TOE = 8;\nconst DPC0 = 17.5;\nconst DPC1 = 20;\nconst H = 45;\nconst COURSE = 7.5;\nconst WAVE = 1.3;\n/** The tide's reach: just above the footing, to just under the course. */\nconst LOW = FOOT + 2.5;\nconst TOP = DPC0 - WAVE - 1;\nconst REST = 0.7;\nconst tideZ = (f: number) => LOW + f * (TOP - LOW);\n/** A fixed scatter in [0, 1): the same stipple on every mount. */\nconst rnd = (i: number) => {\n  const v = Math.sin(i * 127.1 + 311.7) * 43758.5453;\n  return v - Math.floor(v);\n};\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.25);\n  fit(C, corners(0, 0, BASE, END, Y, H));\n  const P = proj(C);\n  const tide = spring(REST, { k: value });\n  const g = mk(\"g\", {}, svg);\n\n  // inside: the fill and the floor slab on it, its top level with the course\n  put(solid(g), box(C, P, 0, 0, BASE, W0, Y, DPC1, 1.2, 0.7));\n  path(g, \"nf lo\", seg(P(1, Y, 9), P(W0, Y, 9)));\n  /** The footing's toe on the cut face, from the wall's face at x out to x + dx. */\n  const toe = (x: number, dx: number) => {\n    const a: Attrs = { class: \"sil\" };\n    a[\"d\"] = open([\n      P(x - Math.sign(dx) * 0.6, Y, FOOT),\n      P(x + dx, Y, FOOT),\n      P(x + dx, Y, BASE),\n      P(x - Math.sign(dx) * 0.6, Y, BASE),\n    ]);\n    mk(\"path\", a, g);\n  };\n  toe(W0, -TOE);\n\n  // the wall on its footing, below the course: coursed on its cut face and its outer face\n  put(solid(g), box(C, P, W0, 0, BASE, W1, Y, DPC0, 0.8, 0.5));\n  path(g, \"nf\", seg(P(W0, Y, FOOT), P(W1, Y, FOOT)));\n  const bricks = (z0: number, z1: number) =>\n    coursesY(P, Y, W0 + 1, W1 - 1, z0, z1, COURSE) +\n    perpendsY(P, Y, W0, W1, z0, z1, COURSE, 11) +\n    coursesX(P, W1, 1, Y - 1, z0, z1, COURSE) +\n    perpendsX(P, W1, 0, Y, z0, z1, COURSE, 22.5);\n  path(g, \"nf lo\", bricks(FOOT, DPC0));\n\n  // the damp: dots scattered on both faces, each with its own feather under the tide\n  const dg = mk(\"g\", {}, g);\n  const dots: Array<{ el: SVGEllipseElement; z: number }> = [];\n  const wet = (x: number, y: number, z: number) => {\n    const el = dot(dg, 0.9, \"dot off\");\n    place(el, P(x, y, z));\n    dots.push({ el, z: z + 0.6 + rnd(dots.length + 0.5) * 3 });\n  };\n  for (let i = 0; i < 80; i++) {\n    const [a, b] = [rnd(i), rnd(i + 0.25)];\n    wet(W0 + 1.5 + a * (W1 - W0 - 3), Y, FOOT + 1 + b * (DPC0 - FOOT - 2));\n  }\n  for (let i = 80; i < 200; i++) {\n    const [a, b] = [rnd(i), rnd(i + 0.25)];\n    wet(W1, 2 + a * (Y - 4), 1 + b * (DPC0 - 2));\n  }\n  const line = path(g, \"nf\");\n\n  // the course, then the wall above it\n  const dpc = solid(g);\n  put(dpc, box(C, P, W0, 0, DPC0, W1, Y, DPC1, 0.5, 0.3));\n  put(solid(g), box(C, P, W0, 0, DPC1, W1, Y, H, 0.8, 0.5));\n  path(g, \"nf lo\", bricks(DPC1, H));\n\n  // outside: the ground, and the footing's toe on the cut face in front of it\n  put(solid(g), box(C, P, W1, 0, BASE, END, Y, 0, 1.2, 0.7));\n  const soil = [];\n  for (let u = 1; u < END - W1 + Y - 1; u += 1.5) {\n    const z = -7 + 0.5 * Math.sin(u * 0.16);\n    soil.push(u < END - W1 ? P(W1 + u, Y, z) : P(END, Y - (u - END + W1), z));\n  }\n  path(g, \"nf lo\", open(soil));\n  toe(W1, TOE);\n\n  /** Who is bright: the course when it holds the tide (or at rest), else the tide. */\n  const light = (course: boolean) => {\n    dpc.sil.setAttribute(\"class\", course ? \"sil hi\" : \"sil\");\n    line.setAttribute(\"class\", course ? \"nf\" : \"nf hi\");\n  };\n  light(true);\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const moving = stepS(tide, dt);\n    if (tide.x !== drawn) {\n      drawn = tide.x;\n      const z = tideZ(tide.x);\n      const pts = [];\n      for (let u = 0; u <= W1 - W0 + Y; u += 1.5) {\n        const w = z + WAVE * Math.sin(u * 0.45) * Math.cos(u * 0.13);\n        pts.push(u < W1 - W0 ? P(W0 + u, Y, w) : P(W1, Y - (u - W1 + W0), w));\n      }\n      draw(line, open(pts));\n      for (const d of dots) d.el.style.display = d.z < z ? \"\" : \"none\";\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, z] = onWall(P, [0, Y, 0], [1, 0], p);\n        if (x < -10 || x > END + 10) return;\n        const held = z >= TOP;\n        tide.t = clamp((z - LOW) / (TOP - LOW), 0, 1);\n        light(held);\n        read.textContent = held ? \"dpc\" : `tide ${Math.round(tide.t * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        tide.t = REST;\n        light(true);\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      tide.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A cut-away solid brick wall on its footing, the ground outside and the floor inside, with a damp-proof course a little above the ground and rising damp below it. Moving up and down the wall raises and lowers the damp, which stops at the course.\",\n  range: [40, 100, 220],\n  probe: [200, 245],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  hull,\n  onWall,\n  open,\n  poly,\n  proj,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\n\n/**\n * Making good and redecoration: a plastered wall panel on the floor with its\n * skirting, a paint roller on an extension pole leaning on it and a roller\n * tray on the floor. The painted part of the wall is a field of fine upright\n * roller strokes; the rest is bare. The pointer's place along the wall sets\n * how far the paint has been rolled: the roller follows on a spring, bobbing\n * up and down its strip, and the field runs out to it. The roller and the\n * strip of fresh paint behind it are the bright. At rest the wall is a little\n * over half painted.\n *\n * The pattern: scrub, as Cavity. One spring for the painted edge, read on the\n * plane of the wall's face, which never moves.\n */\n\nconst L = 120;\nconst H = 66;\nconst T = 7;\nconst SK = 7;\nconst FLOOR = 44;\nconst RW = 22;\nconst R = 4.4;\nconst STEP = 3.2;\nconst TRAY = { x0: L - 38, y0: T + 7, x1: L - 8, y1: T + 29 };\nconst REST = 0.62;\nconst MIN = RW / L;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.0);\n  fit(C, corners(-4, -2, -3, L + 6, FLOOR, H));\n  const P = proj(C);\n  const edge = spring(REST, { k: value });\n  const g = mk(\"g\", {}, svg);\n\n  // the floor, the wall panel and its skirting\n  put(solid(g), box(C, P, -4, -2, -3, L + 6, FLOOR, 0, 2, 1.2));\n  let d = \"\";\n  for (let y = T + 6; y < FLOOR - 2; y += 7)\n    d += seg(P(-3, y, 0), P(L + 5, y, 0));\n  path(g, \"nf lo\", d);\n  put(solid(g), box(C, P, 0, 0, 0, L, T, H, 1, 0.6));\n  put(solid(g), box(C, P, 0, T, 0, L, T + 1.4, SK, 0.4, 0.3));\n\n  // the paint: a field of strokes, and the fresh strip behind the roller\n  const field = path(g, \"nf\");\n  const fresh = path(g, \"nf hi\");\n  // making good on the bare wall: a filled crack, lightly\n  const crack = path(\n    g,\n    \"nf lo\",\n    open([\n      P(L - 22, T, 50),\n      P(L - 18, T, 46),\n      P(L - 19, T, 41),\n      P(L - 14, T, 36),\n    ]),\n  );\n\n  // the tray: rim, its well at the near end, ribs up the ramp\n  put(solid(g), box(C, P, TRAY.x0, TRAY.y0, 0, TRAY.x1, TRAY.y1, 3, 1.2, 0.8));\n  let r = poly([\n    P(TRAY.x0 + 2, TRAY.y1 - 9, 3),\n    P(TRAY.x1 - 2, TRAY.y1 - 9, 3),\n    P(TRAY.x1 - 2, TRAY.y1 - 2, 3),\n    P(TRAY.x0 + 2, TRAY.y1 - 2, 3),\n  ]);\n  for (let y = TRAY.y0 + 3; y < TRAY.y1 - 10; y += 2.5)\n    r += seg(P(TRAY.x0 + 3, y, 3), P(TRAY.x1 - 3, y, 3));\n  path(g, \"nf lo\", r);\n\n  // the roller, its frame and the pole down to the floor\n  const roller = solid(g);\n  roller.sil.classList.add(\"hi\");\n  const wire = path(g, \"nf\");\n  const pole = path(g, \"sil\");\n  const grip = path(g, \"sil\");\n\n  /** A round-ended rod from a to b, w wide on screen. */\n  const rod = (a: Vec3, b: Vec3, w: number) => {\n    const pts: Vec2[] = [];\n    for (const q of [P(...a), P(...b)])\n      for (let i = 0; i < 12; i++) {\n        const t = (i / 12) * Math.PI * 2;\n        pts.push([q[0] + w * Math.cos(t), q[1] + w * Math.sin(t)]);\n      }\n    return poly(hull(pts));\n  };\n  /** The roller's end ring at x, round its axle at height z. */\n  const ring = (x: number, z: number) =>\n    Array.from({ length: 24 }, (_, i) => {\n      const t = (i / 24) * Math.PI * 2;\n      return P(x, T + R + R * Math.cos(t), z + R * Math.sin(t));\n    });\n\n  let drawn = Number.NaN;\n  const tick = (dt: number) => {\n    const moving = stepS(edge, dt);\n    if (edge.x === drawn) return moving;\n    drawn = edge.x;\n    const e = clamp(edge.x, MIN, 1) * L;\n    const z = 40 + 8 * Math.sin(e / 7);\n    let f = \"\";\n    let h = \"\";\n    for (let x = STEP / 2; x < e; x += STEP) {\n      const top = H - 1.5 - 1.2 * Math.abs(Math.sin(x * 1.7));\n      const s = seg(P(x, T, SK + 1.2), P(x, T, top));\n      if (x > e - RW) h += s;\n      else f += s;\n    }\n    draw(field, f);\n    draw(fresh, h);\n    crack.style.display = e > L - 13 ? \"none\" : \"\";\n\n    const a = ring(e - RW, z);\n    const b = ring(e, z);\n    put(roller, { sil: poly(hull(a.concat(b))), crease: poly(b) });\n    const yr = T + R;\n    const mid = e - RW / 2;\n    const top: Vec3 = [mid, yr + 7, z - 11];\n    const foot: Vec3 = [mid + 4, FLOOR - 3, 0];\n    draw(\n      wire,\n      open([P(e, yr, z), P(e + 3, yr, z), P(e + 3, yr + 3, z - 5), P(...top)]),\n    );\n    const u = 12 / Math.hypot(foot[1] - top[1], top[2]);\n    const lo: Vec3 = [\n      top[0] + 4 * u,\n      top[1] + (foot[1] - top[1]) * u,\n      top[2] * (1 - u),\n    ];\n    draw(pole, rod(lo, foot, 0.9));\n    draw(grip, rod(top, lo, 1.9));\n    return moving;\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, z] = onWall(P, [0, T, 0], [1, 0], p);\n        if (x < -12 || x > L + 12 || z < -40 || z > H + 20) return;\n        edge.t = clamp(x / L, MIN, 1);\n        read.textContent = `painted ${Math.round(edge.t * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        edge.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      edge.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A wall with its skirting being redecorated: a paint roller on an extension pole leans on it beside a roller tray, the painted part of the wall finely striped. Moving along the wall rolls the paint out to the pointer.\",\n  range: [40, 100, 220],\n  probe: [150, 130],\n  engine,\n};\n", "import {\n  type Camera,\n  hull,\n  open,\n  type Projector,\n  poly,\n  rad,\n  rrect,\n  seg,\n  type Vec2,\n} from \"../core/iso\";\nimport { draw, mk, path, put, solid } from \"../core/stage\";\nimport { box } from \"../kit\";\n\n/**\n * Helpers the door and window figures share: a slab with a hole through it\n * (a frame, or a wall with its reveal), and a plate hung on a hinge.\n *\n * The slab faces +y. Inside its hole you see the jamb on the low-x side and\n * the sill, never the head or the other jamb. Anything in the hole or in\n * front of it can only be wrongly over the head or the far jamb, so `cover`\n * paints those two back over whatever moved, and the drawing stays honest at\n * every pose.\n */\n\nexport type Hole = { x0: number; x1: number; z0: number; z1: number };\n\nconst E = 0.6;\n\n/** A slab x0..x1 \u00B7 y0..y1 \u00B7 z0..z1 with `hole` through it. Returns `cover`, to paint after what moves inside. */\nexport function holed(\n  C: Camera,\n  P: Projector,\n  g: Element,\n  b: readonly [number, number, number, number, number, number],\n  h: Hole,\n  r = 1.2,\n) {\n  const [x0, y0, z0, x1, y1, z1] = b;\n  const at = (y: number) => (q: Vec2) => P(q[0], y, q[1]);\n  const hole: Vec2[] = [\n    [h.x0, h.z0],\n    [h.x1, h.z0],\n    [h.x1, h.z1],\n    [h.x0, h.z1],\n  ];\n  put(solid(g), box(C, P, x0, y0, z0, x1, y1, z1, r, Math.min(1.2, r)));\n  path(\n    g,\n    \"nf lo\",\n    poly(hole.map(at(y0))) + seg(P(h.x0, y0, h.z0), P(h.x0, y1, h.z0)),\n  );\n  const face: Vec2[] = [\n    [x0 + E, z0 + E],\n    [x1 - E, z0 + E],\n    [x1 - E, z1 - E],\n    [x0 + E, z1 - E],\n  ];\n  path(g, \"fo\", poly(face.map(at(y1))) + poly([...hole].reverse().map(at(y1))));\n  path(g, \"nf\", poly(hole.map(at(y1))));\n  return (parent: Element) => {\n    const L: Vec2[] = [\n      [x0 + E, h.z1],\n      [h.x1, h.z1],\n      [h.x1, z0 + E],\n      [x1 - E, z0 + E],\n      [x1 - E, z1 - E],\n      [x0 + E, z1 - E],\n    ];\n    path(parent, \"fo\", poly(L.map(at(y1))));\n    path(\n      parent,\n      \"nf\",\n      open(\n        (\n          [\n            [h.x0, h.z1],\n            [h.x1, h.z1],\n            [h.x1, h.z0],\n          ] as Vec2[]\n        ).map(at(y1)),\n      ),\n    );\n  };\n}\n\n/** A point on a leaf: u from the hinge, v up, and w back from its face (negative stands proud). */\nexport type UV = [number, number] | [number, number, number];\n/** A line on a leaf. Closed unless `open`. */\nexport type Line = { pts: UV[]; open?: boolean };\n\n/** A rounded rectangle as a closed line. */\nexport const rr = (\n  u0: number,\n  v0: number,\n  u1: number,\n  v1: number,\n  r = 1,\n): Line => ({ pts: rrect(u0, v0, u1, v1, r, 3).map((q): UV => [q.u, q.v]) });\n\n/** A pane: its glazing bead and two short glints across its upper corner, all dim. */\nexport function glass(\n  u0: number,\n  v0: number,\n  u1: number,\n  v1: number,\n  far: boolean,\n): Line[] {\n  const L = Math.min(u1 - u0, v1 - v0);\n  const gu = far ? u0 + L * 0.28 : u1 - L * 0.28;\n  const gv = v1 - L * 0.28;\n  const k = far ? 1 : -1;\n  const glint = (o: number, n: number): Line => ({\n    pts: [\n      [gu + k * o - k * n, gv - o - n],\n      [gu + k * o + k * n, gv - o + n],\n    ],\n    open: true,\n  });\n  return [\n    rr(u0 + 1.2, v0 + 1.2, u1 - 1.2, v1 - 1.2, 0.6),\n    glint(0, L * 0.12),\n    glint(L * 0.14, L * 0.07),\n  ];\n}\n\n/**\n * A plate hung on a vertical hinge at (hx, hy, hz), lying along +x (side 1,\n * hinge on the left) or -x (side -1, on the right) with its face to +y when\n * shut. Turned th degrees it swings out toward +y. `at(th)` maps a leaf point\n * (u from the hinge, v up, w back from the face) to the screen, and says\n * whether the face looks at the viewer.\n */\nexport function hinge(\n  C: Camera,\n  P: Projector,\n  hx: number,\n  hy: number,\n  hz: number,\n  side: 1 | -1,\n) {\n  const sa = Math.sin(C.az);\n  const ca = Math.cos(C.az);\n  return (th: number) => {\n    const c = Math.cos(rad(th));\n    const s = Math.sin(rad(th));\n    const nx = -side * s;\n    const ny = c;\n    return {\n      facing: nx * sa + ny * ca >= 0,\n      p: (u: number, v: number, w = 0): Vec2 =>\n        P(hx + side * u * c - w * nx, hy + u * s - w * ny, hz + v),\n    };\n  };\n}\n\n/** A leaf's paths: its plate (both faces' hull), the face that shows, and its marks. */\nexport type Leaf = {\n  plate: SVGPathElement;\n  face: SVGPathElement;\n  lo: SVGPathElement;\n  mid: SVGPathElement;\n};\n\nexport function leaf(parent: Element): Leaf {\n  const g = mk(\"g\", {}, parent);\n  return {\n    plate: path(g, \"lo\"),\n    face: path(g, \"sil\"),\n    lo: path(g, \"nf lo\"),\n    mid: path(g, \"nf\"),\n  };\n}\n\n/** What a face of a leaf carries: dim marks (glass) and mid-weight ones (a handle, a sash's frame). */\nexport type Face = { lo: Line[]; mid: Line[] };\n\n/** Draws a leaf of outline `edge` and thickness T at a pose, with the marks of whichever face shows. */\nexport function drawLeaf(\n  el: Leaf,\n  pose: { facing: boolean; p: (u: number, v: number, w?: number) => Vec2 },\n  edge: Line,\n  T: number,\n  front: Face,\n  back: Face = front,\n) {\n  const f = pose.facing;\n  // a point's third number is how far it stands proud of the face it is on\n  const on = (q: UV) => pose.p(q[0], q[1], f ? -(q[2] ?? 0) : T + (q[2] ?? 0));\n  const trace = (ls: Line[]) =>\n    ls.map((l) => (l.open ? open : poly)(l.pts.map(on))).join(\"\");\n  const fr = edge.pts.map((q) => pose.p(q[0], q[1], 0));\n  const bk = edge.pts.map((q) => pose.p(q[0], q[1], T));\n  const m = f ? front : back;\n  draw(el.plate, poly(hull(fr.concat(bk))));\n  draw(el.face, poly(f ? fr : bk));\n  draw(el.lo, trace(m.lo));\n  draw(el.mid, trace(m.mid));\n}\n", "import {\n  Cam,\n  corners,\n  clamp,\n  fit,\n  onWall,\n  proj,\n  rad,\n  type Vec3,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { drawLeaf, glass, hinge, type Line, leaf, rr } from \"./_openings\";\nimport { holed } from \"./_openings\";\n\n/**\n * Doors: a front door in its frame. The leaf has a tall narrow glazed slot,\n * a letterbox low down and a long bar handle by its free edge, and hangs on\n * hinges down its right side. The pointer's position across the door pulls\n * it open toward you on a spring: further left, wider open. At rest it stands\n * a little ajar, its face bright. The slider is how far it can swing.\n *\n * The pattern: scrub. One spring for the swing, read on the plane of the\n * frame's face, which never moves; the frame's head and hinge jamb are\n * painted back over the leaf so its edge never shows through them.\n */\n\nconst F = 4.5;\nconst FD = 7;\nconst TH = 2.2;\nconst GAP = 0.8;\nconst DW = 38;\nconst DH = 86;\nconst T = 2.6;\nconst HOLE = { x0: F, x1: F + DW + 2 * GAP, z0: TH, z1: TH + DH + 2 * GAP };\nconst W = HOLE.x1 + F;\nconst H = HOLE.z1 + F;\nconst HX = HOLE.x1 - GAP;\nconst HY = FD - 1.4;\nconst REST = 14;\nconst FAR = 110;\nconst STEP = [-5, -4, -2.6, W + 5, 30, 0] as const;\n\nconst EDGE = rr(0, 0, DW, DH, 1.2);\nconst LO: Line[] = glass(13, 24, 24, 78, false);\nconst MID: Line[] = [\n  rr(13, 24, 24, 78, 0.8),\n  rr(11, 11, 26, 15, 1),\n  {\n    pts: [\n      [33.5, 29],\n      [33.5, 29, 2],\n      [33.5, 63, 2],\n      [33.5, 63],\n    ],\n    open: true,\n  },\n];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.25);\n  const pts: Vec3[] = [...corners(...STEP), [0, 0, H], [W, FD, H]];\n  for (let th = 0; th <= FAR; th += 15)\n    for (const z of [0, H])\n      pts.push([HX - DW * Math.cos(rad(th)), HY + DW * Math.sin(rad(th)), z]);\n  fit(C, pts);\n  const P = proj(C);\n  let max = value;\n  const swing = spring(REST, { eps: 0.05 });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, ...STEP, 1.6, 1.2));\n  const cover = holed(C, P, g, [0, 0, 0, W, FD, H], HOLE);\n  const L = leaf(g);\n  L.face.classList.add(\"hi\");\n  cover(g);\n  const at = hinge(C, P, HX, HY, HOLE.z0 + GAP, -1);\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const moving = stepS(swing, dt);\n    if (swing.x !== drawn) {\n      drawn = swing.x;\n      drawLeaf(L, at(swing.x), EDGE, T, { lo: LO, mid: MID });\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  let over = -1;\n  const aim = () => {\n    swing.t = over < 0 ? REST : over * max;\n    read.textContent = over < 0 ? \"rest\" : `${Math.round(swing.t)}\u00B0`;\n    B.wake();\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [a] = onWall(P, [0, FD, 0], [1, 0], p);\n        over = clamp((HOLE.x1 - a) / (DW + 20), 0, 1);\n        aim();\n      },\n      leave: () => {\n        over = -1;\n        aim();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      max = v;\n      aim();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A front door in its frame, with a glazed slot, a letterbox and a bar handle. Moving across the door swings it open on its hinges.\",\n  range: [50, 90, FAR],\n  probe: [175, 170],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  proj,\n  rad,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { drawLeaf, glass, holed, type Line, leaf, rr } from \"./_openings\";\n\n/**\n * Patio and bifold doors: a wide frame on a threshold, filled by four tall\n * glazed leaves hinged pairwise. The pointer's position across the frame\n * pulls the leading leaf toward it on a spring, and the set folds concertina\n * toward the left jamb: every other hinge runs in the track, the ones between\n * push out toward you, and the stack slides along the head. At rest the set\n * stands a little folded so it reads as bifold, the leading leaf bright. The\n * slider is how far the leaves can fold.\n *\n * The pattern: scrub. One spring for the fold angle, read on the plane of\n * the frame's face, which never moves. Every leaf turns by the same angle,\n * alternately, so left to right is also back to front at every pose; the\n * frame's head and far jamb are painted back over what sits inside the hole.\n */\n\nconst N = 4;\nconst F = 4.5;\nconst FD = 7;\nconst TH = 2.2;\nconst GAP = 0.8;\nconst LW = 26;\nconst DH = 64;\nconst T = 2.2;\nconst HOLE = { x0: F, x1: F + N * LW + 2 * GAP, z0: TH, z1: TH + DH + 2 * GAP };\nconst W = HOLE.x1 + F;\nconst H = HOLE.z1 + F;\nconst X0 = HOLE.x0 + GAP;\nconst Y0 = FD - 1.6;\nconst Z0 = HOLE.z0 + GAP;\nconst REST = 22;\nconst FAR = 86;\nconst STEP = [-5, -4, -2.6, W + 5, FD + LW + 3, 0] as const;\n\nconst ST = 4.2;\nconst EDGE = rr(0, 0, LW, DH, 0.8);\nconst PANE = rr(ST, ST, LW - ST, DH - ST, 0.6);\nconst GLASS: Line[] = glass(ST, ST, LW - ST, DH - ST, false);\nconst BAR: Line = {\n  pts: [\n    [LW - 2.1, 24],\n    [LW - 2.1, 24, 1.6],\n    [LW - 2.1, 42, 1.6],\n    [LW - 2.1, 42],\n  ],\n  open: true,\n};\n\n/** Hinge line k (0 at the jamb, N the leading edge) at fold angle th. */\nconst edge = (k: number, th: number): Vec2 => [\n  X0 + k * LW * Math.cos(rad(th)),\n  Y0 + (k % 2 ? LW * Math.sin(rad(th)) : 0),\n];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.1);\n  const pts: Vec3[] = [...corners(...STEP), [0, 0, H], [W, FD, H]];\n  for (let th = 0; th <= FAR; th += 10)\n    for (const z of [0, H]) pts.push([...edge(1, th), z]);\n  fit(C, pts);\n  const P = proj(C);\n  const sa = Math.sin(C.az);\n  const ca = Math.cos(C.az);\n  let max = value;\n  const fold = spring(REST, { eps: 0.05 });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, ...STEP, 1.6, 1.2));\n  const cover = holed(C, P, g, [0, 0, 0, W, FD, H], HOLE);\n  const leaves = Array.from({ length: N }, () => leaf(g));\n  const lead = leaves[N - 1];\n  lead?.face.classList.add(\"hi\");\n  cover(g);\n\n  /** The leaf between hinge lines a and b, centred on its own thickness. */\n  const pose = (a: Vec2, b: Vec2) => {\n    const dx = (b[0] - a[0]) / LW;\n    const dy = (b[1] - a[1]) / LW;\n    return {\n      facing: dx * ca - dy * sa >= 0,\n      p: (u: number, v: number, w = 0): Vec2 =>\n        P(\n          a[0] + u * dx + (w - T / 2) * dy,\n          a[1] + u * dy - (w - T / 2) * dx,\n          Z0 + v,\n        ),\n    };\n  };\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const moving = stepS(fold, dt);\n    if (fold.x !== drawn) {\n      drawn = fold.x;\n      leaves.forEach((L, i) => {\n        const mid = i === N - 1 ? [PANE, BAR] : [PANE];\n        const at = pose(edge(i, fold.x), edge(i + 1, fold.x));\n        drawLeaf(\n          L,\n          at,\n          EDGE,\n          T,\n          { lo: GLASS, mid },\n          { lo: GLASS, mid: [PANE] },\n        );\n      });\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  let over = Number.NaN;\n  const aim = () => {\n    const rest = Number.isNaN(over);\n    const c = clamp(over, Math.cos(rad(max)), 1);\n    fold.t = rest ? REST : (Math.acos(c) * 180) / Math.PI;\n    read.textContent = rest\n      ? \"rest\"\n      : `open ${Math.round((1 - Math.cos(rad(fold.t))) * 100)}%`;\n    B.wake();\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [a] = onWall(P, [0, FD, 0], [1, 0], p);\n        over = (a - X0) / (N * LW);\n        aim();\n      },\n      leave: () => {\n        over = Number.NaN;\n        aim();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      max = v;\n      aim();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A wide door frame on a threshold, filled by four tall glazed bifold leaves. Moving across the frame folds them concertina toward one side.\",\n  range: [60, 76, FAR],\n  probe: [170, 170],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  lerp,\n  onWall,\n  open,\n  proj,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { drawLeaf, hinge, holed, type Line, leaf, rr } from \"./_openings\";\n\n/**\n * Draught proofing: a panelled door shut in a wall. A seal strip runs round\n * the inside of its frame; where it hasn't reached, streams of draught blow\n * in through the gap. The pointer's place round the frame, hinge side to\n * latch side, springs the seal round. At rest it is up the hinge jamb and onto\n * the head, the strip bright. The slider is how far the draught blows.\n * The pattern: scrub over ambient motion, read on the frame's face plane.\n */\n\nconst [W, WD, H] = [100, 10, 100];\nconst YF = WD - 2;\nconst HOLE = { x0: 27, x1: 73, z0: 0, z1: 86 };\nconst FRAME = [HOLE.x0, YF - 5, 0, HOLE.x1, YF, HOLE.z1] as const;\nconst IN = { x0: 31, x1: 69, z0: 1.4, z1: 82 };\nconst GAP = 0.8;\nconst DW = IN.x1 - IN.x0 - 2 * GAP;\nconst DH = IN.z1 - IN.z0 - 2 * GAP;\nconst HV = DH * 0.42;\nconst REST = 0.46;\n\n// the seal's line on the frame's face: up the hinge jamb (right), over the\n// head, down the latch jamb; and which way the draught blows off each side\nconst G = GAP / 2;\nconst U: Vec2[] = [\n  [IN.x1 - G, IN.z0],\n  [IN.x1 - G, IN.z1 - G],\n  [IN.x0 + G, IN.z1 - G],\n  [IN.x0 + G, IN.z0],\n];\nconst BLOW: Vec3[] = [\n  [0.6, 1, 0],\n  [0, 0.5, 0.9],\n  [-0.6, 1, 0],\n];\ntype Side = { a: Vec2; b: Vec2; l: number; blow: Vec3 };\nconst SIDES: Side[] = BLOW.map((blow, i) => {\n  const [a, b] = [U[i] as Vec2, U[i + 1] as Vec2];\n  return { a, b, l: Math.hypot(b[0] - a[0], b[1] - a[1]), blow };\n});\nconst ALL = SIDES.reduce((n, s) => n + s.l, 0);\n\n/** The point s of the way round the seal, and the side it is on. */\nconst along = (s: number) => {\n  let d = clamp(s, 0, 1) * ALL;\n  let i = 0;\n  while (i < 2 && d > (SIDES[i] as Side).l) d -= (SIDES[i++] as Side).l;\n  const { a, b, l } = SIDES[i] as Side;\n  const q: Vec2 = [lerp(a[0], b[0], d / l), lerp(a[1], b[1], d / l)];\n  return { q, i, side: SIDES[i] as Side };\n};\n\n// a four-panel door with a lever on its latch stile\nconst EDGE = rr(0, 0, DW, DH, 0.8);\nconst LO: Line[] = [\n  rr(5, 5, DW / 2 - 2, HV, 0.6),\n  rr(DW / 2 + 2, 5, DW - 5, HV, 0.6),\n  rr(5, HV + 6, DW / 2 - 2, DH - 5, 0.6),\n  rr(DW / 2 + 2, HV + 6, DW - 5, DH - 5, 0.6),\n];\nconst LEVER: Line = {\n  pts: [\n    [DW - 2.5, HV + 3],\n    [DW - 2.5, HV + 3, 1.8],\n    [DW - 8, HV + 3, 1.8],\n  ],\n  open: true,\n};\nconst MID: Line[] = [rr(DW - 3.4, HV - 2, DW - 1.6, HV + 6, 0.6), LEVER];\n\n// the draught: a stream at each of 28 spots round the gap, each on its own clock\nconst SLOTS = Array.from({ length: 28 }, (_, i) => ({\n  s: (i + 0.5 + 0.35 * Math.sin(i * 7.1)) / 28,\n  off: (i * 0.618) % 1,\n  rate: 0.75 + 0.3 * ((i * 0.37) % 1),\n}));\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.8);\n  fit(C, [\n    ...corners(-6, -2, -3, W + 6, WD + 22, H),\n    ...corners(IN.x0 - 15, YF, IN.z0, IN.x1 + 15, YF + 25, IN.z1 + 18),\n  ]);\n  const P = proj(C);\n  let reach = value;\n  const seal = spring(REST, { eps: 0.002 });\n  let clock = 0;\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, -6, -2, -3, W + 6, WD + 22, 0, 2, 1.2));\n  const wall = holed(C, P, g, [0, 0, 0, W, WD, H], HOLE);\n  const frame = holed(C, P, g, FRAME, IN, 0.6);\n  const pose = hinge(C, P, IN.x1 - GAP, YF - 1.2, IN.z0 + GAP, -1)(0);\n  drawLeaf(leaf(g), pose, EDGE, 2.4, { lo: LO, mid: MID });\n  frame(g);\n  wall(g);\n  // skirting either side of the opening\n  put(solid(g), box(C, P, 0, WD, 0, HOLE.x0, WD + 1.4, 6, 0.4, 0.3));\n  put(solid(g), box(C, P, HOLE.x1, WD, 0, W, WD + 1.4, 6, 0.4, 0.3));\n  const strip = path(g, \"nf hi\");\n  const air = path(g, \"nf\");\n\n  let drawn = \"\";\n  const paint = () => {\n    const key = `${seal.x}:${clock}:${reach}`;\n    if (key === drawn) return;\n    drawn = key;\n    const end = along(seal.x);\n    const pts = [...U.slice(0, end.i + 1), end.q];\n    draw(strip, seal.x > 0.004 ? open(pts.map((q) => P(q[0], YF, q[1]))) : \"\");\n    let d = \"\";\n    for (const k of SLOTS) {\n      if (k.s < seal.x + 0.01) continue;\n      const { q, side } = along(k.s);\n      const [bx, by, bz] = side.blow;\n      const p = (t: number) => P(q[0] + bx * t, YF + by * t, q[1] + bz * t);\n      // two dashes half a cycle apart, so each spot is a broken stream\n      for (const h of [0, 0.5]) {\n        const f = (clock * k.rate + k.off + h) % 1;\n        const l = 6 * Math.sin(Math.PI * f);\n        if (l > 0.4) d += seg(p(reach * f), p(reach * f + l));\n      }\n    }\n    draw(air, d);\n  };\n\n  const B = register(stage, (dt) => {\n    const moving = stepS(seal, dt);\n    const blowing = seal.x < 0.99 && !reducedMotion();\n    if (blowing) clock += dt;\n    paint();\n    return moving || blowing;\n  });\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        // the angle seen from the threshold's middle is near enough the arc\n        const [x, z] = onWall(P, [0, YF, 0], [1, 0], p);\n        const a = Math.atan2(Math.max(z - IN.z0, 0), x - (IN.x0 + IN.x1) / 2);\n        seal.t = clamp((a / Math.PI) * 1.06 - 0.03, 0, 1);\n        read.textContent = `sealed ${Math.round(seal.t * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        seal.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      reach = v;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A panelled door shut in its frame, with a seal strip running round the inside of the frame and draughts blowing through the gap where it hasn't reached. Moving round the frame, from the hinge side to the latch side, fits the seal further round.\",\n  range: [8, 13, 18],\n  probe: [182, 175],\n  engine,\n};\n", "import {\n  hull,\n  open,\n  type PrismPaths,\n  type Projector,\n  poly,\n  type Ring,\n  run,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\n\n/**\n * Helpers for figures whose parts tilt out of the ground's axes: a rafter on\n * a pitch, a board hinged up, a roll on its side. A frame is an origin and\n * three unit axes; a solid in it is a ring on (u, v) stood from w0 to w1, so\n * `inFrame` is `prism` for any orientation.\n */\n\nexport type Frame = { o: Vec3; u: Vec3; v: Vec3; w: Vec3 };\n\nconst dot3 = (a: Vec3, b: Vec3) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n\n/** The unit direction toward the viewer: the one world direction P flattens to a point. */\nexport function eyeOf(P: Projector): Vec3 {\n  const o = P(0, 0, 0);\n  const ax = [P(1, 0, 0), P(0, 1, 0), P(0, 0, 1)].map(\n    (q) => [q[0] - o[0], q[1] - o[1]] as const,\n  );\n  const [a, b, c] = ax as [Vec2, Vec2, Vec2];\n  let e: Vec3 = [\n    b[0] * c[1] - c[0] * b[1],\n    c[0] * a[1] - a[0] * c[1],\n    a[0] * b[1] - b[0] * a[1],\n  ];\n  if (e[2] < 0) e = [-e[0], -e[1], -e[2]];\n  const n = Math.hypot(...e);\n  return [e[0] / n, e[1] / n, e[2] / n];\n}\n\n/** The world point at (u, v, w) in a frame. */\nexport const at = (F: Frame, u: number, v: number, w: number): Vec3 => [\n  F.o[0] + F.u[0] * u + F.v[0] * v + F.w[0] * w,\n  F.o[1] + F.u[1] * u + F.v[1] * v + F.w[1] * w,\n  F.o[2] + F.u[2] * u + F.v[2] * v + F.w[2] * w,\n];\n\n/** A ring on (u, v) stood from w0 to w1 in a frame: its silhouette, and the crease on whichever end faces the viewer. */\nexport function inFrame(\n  P: Projector,\n  eye: Vec3,\n  F: Frame,\n  ring: Ring,\n  inner: Ring | null,\n  w0: number,\n  w1: number,\n): PrismPaths {\n  const pr = (q: Ring, w: number) => q.map((s) => P(...at(F, s.u, s.v, w)));\n  const lid = dot3(F.w, eye) >= 0 ? w1 : w0;\n  const side = (s: { nu: number; nv: number }) =>\n    dot3(\n      [\n        F.u[0] * s.nu + F.v[0] * s.nv,\n        F.u[1] * s.nu + F.v[1] * s.nv,\n        F.u[2] * s.nu + F.v[2] * s.nv,\n      ],\n      eye,\n    ) >= -1e-6;\n  return {\n    sil: poly(hull(pr(ring, w0).concat(pr(ring, w1)))),\n    crease: inner ? open(pr(run(inner, side), lid)) : \"\",\n  };\n}\n\n/** The point (a, b) on the plane through `o` spanned by `ea` and `eb` that lies under a screen point. */\nexport function onPlane(\n  P: Projector,\n  o: Vec3,\n  ea: Vec3,\n  eb: Vec3,\n  p: Vec2,\n): Vec2 {\n  const q0 = P(...o);\n  const qa = P(o[0] + ea[0], o[1] + ea[1], o[2] + ea[2]);\n  const qb = P(o[0] + eb[0], o[1] + eb[1], o[2] + eb[2]);\n  const ax = qa[0] - q0[0];\n  const ay = qa[1] - q0[1];\n  const bx = qb[0] - q0[0];\n  const by = qb[1] - q0[1];\n  const det = ax * by - ay * bx;\n  const px = p[0] - q0[0];\n  const py = p[1] - q0[1];\n  return [(px * by - py * bx) / det, (ax * py - ay * px) / det];\n}\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  facing,\n  fit,\n  poly,\n  prism,\n  proj,\n  rad,\n  unproj,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { eyeOf } from \"./_timber\";\n\n/**\n * Ductwork: a ceiling void from above, joists on the ceiling board, and a\n * rectangular duct laid across them that turns a corner and runs on along a\n * joist. A tee off its side takes a short ribbed flexible duct round and down\n * through the ceiling to a round terminal's collar. Air moves along the run as\n * dots on the duct's lid and down the flex. The pointer picks the section\n * under it, which brightens with its air; at rest the terminal is the mark.\n * The slider is the air's speed.\n *\n * The pattern: one of many, as the solar tubes. A tween per section,\n * staggered by distance; the pick reads the plane through the duct's middle,\n * or the ceiling round the terminal, neither of which moves.\n */\n\nconst E = 6;\nconst D = 96;\nconst W = 98;\nconst JOISTS = [0, 32, 64];\nconst JW = 4;\nconst JH = 12;\nconst TOP = JH + 10;\nconst MID = JH + 5;\nconst [Y0, Y1] = [12, 28];\nconst [X0, X1] = [58, 74];\nconst CX = (X0 + X1) / 2;\nconst CY = (Y0 + Y1) / 2;\nconst YT = 66;\nconst RF = 4.5;\nconst RB = 8;\nconst XS = X1 + 3;\nconst XT = XS + RB;\nconst BEND = (RB * Math.PI) / 2;\nconst FLEX = 3 + BEND + (MID - RB - 1.2);\nconst MAIN = CX + D;\nconst SP = 9;\nconst NAMES = [\"run 1\", \"bend\", \"run 2\", \"valve\"];\n\nconst dot3 = (a: Vec3, b: Vec3) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n\n/** The flex at s from the tee: its centre and direction, out of the duct's side, round the bend and down. */\nfunction branch(s: number): [Vec3, Vec3] {\n  const th = clamp(s - 3, 0, BEND) / RB;\n  const [x, z] = [XS + Math.min(s, 3) - 3, MID - Math.max(0, s - 3 - BEND)];\n  return [\n    [x + RB * Math.sin(th), YT, z - RB + RB * Math.cos(th)],\n    [Math.cos(th), 0, -Math.sin(th)],\n  ];\n}\n\n/** A footprint rounded by r at its far (x1, y0) corner only: the bend's outer sweep. */\nconst sweep = (x0: number, y0: number, x1: number, y1: number, r: number) =>\n  [x1, x0, x0, x1].flatMap((x, i) => {\n    const [y, rr] = [i < 2 ? y1 : y0, i === 3 ? r : 0.6];\n    return Array.from({ length: 5 }, (_, k) => {\n      const a = rad(90 * i + 22.5 * k);\n      const [nu, nv] = [Math.cos(a), Math.sin(a)];\n      const [cu, cv] = [x + (i % 3 ? rr : -rr), y + (i < 2 ? -rr : rr)];\n      return { u: cu + rr * nu, v: cv + rr * nv, nu, nv };\n    });\n  });\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let speed = value;\n  const C = Cam(45, 0.5, 2);\n  fit(C, corners(-E, -E, -3, W, D + E, TOP));\n  const P = proj(C);\n  const eye = eyeOf(P);\n  const g = mk(\"g\", {}, svg);\n\n  put(solid(g), box(C, P, -E, -E, -3, W, D + E, 0, 1.6, 1));\n  for (const x of JOISTS)\n    put(solid(g), box(C, P, x, -E + 2, 0, x + JW, D + E - 2, JH, 0.8, 0.5));\n\n  // the duct: across the joists, a bend with a swept corner, and on along a joist\n  const run1 = solid(g);\n  put(run1, box(C, P, -E, Y0, JH, X0, Y1, TOP, 1, 0.6));\n  const elbow = solid(g);\n  const inset = sweep(X0 + 0.6, Y0 + 0.6, X1 - 0.6, Y1 - 0.6, 9.4);\n  put(elbow, prism(P, facing(C), sweep(X0, Y0, X1, Y1, 10), inset, JH, TOP));\n  const run2 = solid(g);\n  put(run2, box(C, P, X0, Y1, JH, X1, D + E, TOP, 1, 0.6));\n\n  // the terminal's collar on the ceiling, and the ribbed flex down into it\n  const collar = solid(g);\n  const ring = (r: number) => circ(r, 48, XT, YT);\n  put(collar, prism(P, facing(C), ring(7.5), ring(6), 0, 1.2));\n  const ribs: number[] = [];\n  for (let s = 0.4; s < FLEX; s += 1.3) ribs.push(s);\n  ribs.sort((a, b) => dot3(branch(a)[0], eye) - dot3(branch(b)[0], eye));\n  const flex = mk(\"g\", {}, g);\n  for (const s of ribs) {\n    const [c, t] = branch(s);\n    const pts = Array.from({ length: 28 }, (_, k) => {\n      const f = (k / 28) * Math.PI * 2;\n      const [u, v] = [RF * Math.cos(f), RF * Math.sin(f)];\n      return P(c[0] - v * t[2], c[1] + u, c[2] + v * t[0]);\n    });\n    path(flex, \"\", poly(pts));\n  }\n\n  // the air: dots along the lid and down the front of the flex\n  const air = mk(\"g\", {}, g);\n  const dots = [\n    ...Array.from({ length: Math.ceil(MAIN / SP) }, (_, k) => ({ k, br: 0 })),\n    ...Array.from({ length: Math.ceil(FLEX / SP) }, (_, k) => ({ k, br: 1 })),\n  ].map((d) => ({ ...d, el: dot(air, 0.8, \"dot m\"), cls: \"dot m\" }));\n\n  const parts = [run1, elbow, run2, collar];\n  const tws = parts.map(() => tween(0));\n  let act: number | null = null;\n  let phase = 0;\n\n  /** A dot's place on screen and its section: along the lid, or on the flex's near side. */\n  const where = (br: number, s: number): [Vec2, number] => {\n    if (br === 0) {\n      const [x, y] = s < CX + E ? [s - E, CY] : [CX, CY + s - CX - E];\n      return [P(x, y, TOP), y > Y1 ? 2 : x < X0 ? 0 : 1];\n    }\n    const [c, t] = branch(s);\n    const e = dot3(eye, t);\n    const n: Vec3 = [eye[0] - e * t[0], eye[1], eye[2] - e * t[2]];\n    const r = RF / Math.hypot(...n);\n    return [P(c[0] + n[0] * r, c[1] + n[1] * r, c[2] + n[2] * r), 3];\n  };\n\n  const B = register(stage, (dt, now) => {\n    if (!reducedMotion()) phase = (phase + dt * speed) % SP;\n    let moving = !reducedMotion();\n    const lit = tws.map((tw) => {\n      if (!tdone(tw, now)) moving = true;\n      return tval(tw, now);\n    });\n    for (const d of dots) {\n      const s = d.k * SP + phase;\n      const show = s > 1.5 && s < (d.br ? FLEX : MAIN) - 1.5;\n      d.el.style.display = show ? \"\" : \"none\";\n      if (!show) continue;\n      const [q, i] = where(d.br, s);\n      place(d.el, q);\n      const r = String(0.8 + 0.6 * (lit[i] ?? 0));\n      d.el.setAttribute(\"rx\", r);\n      d.el.setAttribute(\"ry\", r);\n      const cls = i === act ? \"dot\" : \"dot m\";\n      if (cls !== d.cls) d.el.setAttribute(\"class\", (d.cls = cls));\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  const choose = (a: number | null) => {\n    act = a;\n    const now = performance.now();\n    parts.forEach((ps, i) => {\n      ps.sil.classList.toggle(\"hi\", i === (a ?? 3));\n      tset(tws[i]!, i === a ? 1 : 0, now, Math.abs(i - (a ?? 3)) * 45);\n    });\n    for (const el of flex.children)\n      el.setAttribute(\"class\", a === 3 ? \"hi\" : \"\");\n    read.textContent = a === null ? \"rest\" : (NAMES[a] ?? \"rest\");\n    B.wake();\n  };\n  choose(null);\n\n  const pick = (p: Vec2) => {\n    const [gx, gy] = unproj(C, p[0], p[1], 0);\n    if (Math.hypot(gx - XT, gy - YT) < 12) return 3;\n    const [x, y] = unproj(C, p[0], p[1], MID);\n    if (x > X1 && x < XT + 8 && Math.abs(y - YT) < 10) return 3;\n    if (x < -E - 4 || x > X1 + 6 || y < Y0 - 6 || y > D + E + 4) return null;\n    if (y < Y1) return x < X0 ? 0 : 1;\n    return x > X0 - 6 ? 2 : null;\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const a = pick(p);\n        if (a !== act) choose(a);\n      },\n      leave: () => {\n        if (act !== null) choose(null);\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      speed = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A ceiling void from above: joists on the ceiling board, a rectangular ventilation duct laid across them that turns a corner, and a tee taking a short flexible duct down through the ceiling to a round terminal. Air moves along the run; moving over a section picks it out.\",\n  range: [8, 16, 32],\n  probe: [230, 150],\n  engine,\n};\n", "import {\n  hull,\n  open,\n  type PrismPaths,\n  type Projector,\n  poly,\n  rad,\n  rrect,\n  run,\n  type Sample,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\n\n/**\n * A pitched roof slope, for the figures that sit on one (solar PV, solar\n * thermal). It faces +x, the lower-right face: u runs along the eaves\n * (toward -y, up the screen to the right), v up the slope from the eaves,\n * and h out of the slope.\n */\nexport type Slope = (u: number, v: number, h: number) => Vec2;\n\n/** The world point at (u, v, h) on a slope of `pitch` degrees whose eaves run along x = 0, z = 0. */\nexport function world(\n  pitch: number,\n): (u: number, v: number, h: number) => Vec3 {\n  const c = Math.cos(rad(pitch));\n  const s = Math.sin(rad(pitch));\n  return (u, v, h) => [-v * c + h * s, -u, v * s + h * c];\n}\n\nexport function slope(P: Projector, pitch: number): Slope {\n  const W = world(pitch);\n  return (u, v, h) => P(...W(u, v, h));\n}\n\n/** A rounded plate lying on the slope from h0 to h1: its silhouette, and the crease along its near edges. */\nexport function plate(\n  S: Slope,\n  u0: number,\n  v0: number,\n  u1: number,\n  v1: number,\n  h0: number,\n  h1: number,\n  r: number,\n  b: number,\n): PrismPaths {\n  const ring = rrect(u0, v0, u1, v1, r);\n  const inner = rrect(u0 + b, v0 + b, u1 - b, v1 - b, Math.max(0.3, r - b));\n  const at = (h: number) => (q: Sample) => S(q.u, q.v, h);\n  // an edge is near when its outward normal points down the screen\n  const near = (q: Sample) =>\n    S(q.u + q.nu, q.v + q.nv, h1)[1] - S(q.u, q.v, h1)[1] > 1e-6;\n  return {\n    sil: poly(hull(ring.map(at(h1)).concat(ring.map(at(h0))))),\n    crease: open(run(inner, near).map(at(h1))),\n  };\n}\n\n/** Tile courses across the slope every `course` up it, with a joint every `len`, half-bonded. */\nexport function tiles(\n  S: Slope,\n  u0: number,\n  u1: number,\n  v0: number,\n  v1: number,\n  course: number,\n  len: number,\n): string {\n  let d = \"\";\n  let row = 0;\n  for (let v = v0; v < v1 - course * 0.3; v += course, row++) {\n    const top = Math.min(v + course, v1);\n    if (v > v0) d += seg(S(u0, v, 0), S(u1, v, 0));\n    for (let u = u0 + (row % 2 ? len / 2 : len); u < u1 - 2; u += len)\n      d += seg(S(u, v, 0), S(u, top, 0));\n  }\n  return d;\n}\n\n/** The slope's (u, v) under a screen point, on the plane h out of it, which never moves. */\nexport function onSlope(S: Slope, h: number, p: Vec2): Vec2 {\n  const o = S(0, 0, h);\n  const a = S(1, 0, h);\n  const b = S(0, 1, h);\n  const ex = [a[0] - o[0], a[1] - o[1]] as const;\n  const ey = [b[0] - o[0], b[1] - o[1]] as const;\n  const det = ex[0] * ey[1] - ex[1] * ey[0];\n  const qx = p[0] - o[0];\n  const qy = p[1] - o[1];\n  return [(qx * ey[1] - qy * ey[0]) / det, (ex[0] * qy - ex[1] * qx) / det];\n}\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  hull,\n  onWall,\n  poly,\n  proj,\n  rad,\n  open,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { plate, type Slope, tiles } from \"./_roof\";\nimport { shift } from \"./_walls\";\n\n/**\n * Ground floor extension: the back corner of a house, its pitched roof's\n * gable to the left and a window in the back wall, with a flat-roofed\n * single-storey extension built out from that wall. The extension has wide\n * bifold doors across its end and a rooflight on its roof. The pointer's\n * place along the extension's side sets how far it projects, on a spring;\n * the house never moves. The extension's outline is the bright line.\n *\n * The pattern: scrub. One spring for the depth, read on the plane of the\n * extension's side wall, which never moves.\n */\n\nconst HX = 70;\nconst HY = 56;\nconst E = 56;\nconst PITCH = 40;\nconst O = 3;\nconst T = 2.4;\nconst EY = [4, 44] as const;\nconst EH = 28;\nconst DMIN = 20;\nconst DTOP = 64;\nconst REST = 36;\nconst DOOR = { y0: EY[0] + 4, y1: EY[1] - 4, z: 22, n: 4 };\n/** The rooflight: x about the middle of the extension, then y. */\nconst LIGHT: Rect = [-6, 6, 16, 32];\nconst CP = Math.cos(rad(PITCH));\nconst SP = Math.sin(rad(PITCH));\nconst RIDGE = E + ((HX / 2) * SP) / CP;\nconst LEN = (HX / 2 + O) / CP;\nconst GROUND = [-4, -2, -4, HX + DTOP + 8, HY + 6, 0] as const;\nconst TOP: Vec3[] = [\n  [HX / 2, 0, RIDGE],\n  [HX / 2, HY, RIDGE],\n];\ntype Face = (a: number, b: number) => Vec2;\ntype Rect = readonly [number, number, number, number];\n\n/** A rectangle a0..a1 \u00D7 b0..b1 on a face, inset by i. */\nconst rect = (at: Face, [a0, a1, b0, b1]: Rect, i = 0) =>\n  poly([\n    at(a0 + i, b0 + i),\n    at(a1 - i, b0 + i),\n    at(a1 - i, b1 - i),\n    at(a0 + i, b1 - i),\n  ]);\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let DMAX = value;\n  const C = Cam(45, 0.5, 1.7);\n  fit(C, [...corners(...GROUND), ...TOP]);\n  const P = proj(C);\n  const depth = spring(REST);\n  const g = mk(\"g\", {}, svg);\n  const back: Face = (y, z) => P(HX, y, z);\n\n  // the ground; the house, walls and gable as one solid, a window on each face\n  put(solid(g), box(C, P, ...GROUND, 3, 1.6));\n  path(\n    g,\n    \"sil\",\n    poly(hull([...corners(0, 0, 0, HX, HY, E), ...TOP].map((q) => P(...q)))),\n  );\n  const win = (at: Face, r: Rect) => {\n    const [a0, a1, z0, z1] = r;\n    const m = (a0 + a1) / 2;\n    const sill = seg(at(a0 - 1.5, z0 - 1), at(a1 + 1.5, z0 - 1));\n    path(g, \"nf\", rect(at, r) + sill);\n    path(g, \"nf lo\", rect(at, r, 1.2) + seg(at(m, z0 + 1), at(m, z1 - 1)));\n  };\n  win((x, z) => P(x, HY, z), [27, 43, 34, 48]);\n  win(back, [18, 34, 38, 50]);\n\n  // the roof: the far pitch shows only its verge, the near pitch is tiled\n  const pitch =\n    (side: 1 | -1, lift = 0): Slope =>\n    (u, v, h) =>\n      P(\n        HX / 2 + side * (HX / 2 + O - v * CP + (h + lift) * SP),\n        HY + 2 - u,\n        E - (O * SP) / CP + v * SP + (h + lift) * CP,\n      );\n  put(solid(g), plate(pitch(-1), 0, 0, 2, LEN, 0, T, 0.4, 0.3));\n  put(solid(g), plate(pitch(1), 0, 0, HY + 4, LEN, 0, T, 0.8, 0.6));\n  path(g, \"nf lo\", tiles(pitch(1, T), 2, HY + 2, 0, LEN, 10, 15));\n\n  // the extension: one solid redrawn as it grows, and its fascia\n  const ext = solid(g);\n  ext.sil.setAttribute(\"class\", \"sil hi\");\n  const fascia = path(g, \"nf lo\");\n\n  // the bifold doors on its end and the rooflight, drawn at depth 0 and moved\n  const doors = mk(\"g\", {}, g);\n  const { y0, y1, z, n } = DOOR;\n  const w = (y1 - y0) / n;\n  let mid = rect(back, [y0, y1, 0, z]);\n  let lo = \"\";\n  for (let i = 0, a = y0; i < n; i++, a += w) {\n    if (i) mid += seg(back(a, 0), back(a, z));\n    lo += rect(back, [a, a + w, 0, z], 1.2);\n    lo += seg(back(a + w - 3, z - 3), back(a + w - 5.5, z - 5.5));\n  }\n  path(doors, \"nf\", mid);\n  path(doors, \"nf lo\", lo);\n  const lantern = mk(\"g\", {}, g);\n  const [lx0, lx1, ly0, ly1] = LIGHT;\n  const lid: Face = (x, y) => P(x, y, EH + 3);\n  put(solid(lantern), box(C, P, lx0, ly0, EH, lx1, ly1, EH + 3, 0.8, 0.6));\n  path(\n    lantern,\n    \"nf lo\",\n    rect(lid, LIGHT, 1.6) + seg(lid(lx1 - 4, ly0 + 4), lid(lx1 - 4, ly0 + 8)),\n  );\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const moving = stepS(depth, dt);\n    if (depth.x === drawn) return moving;\n    const d = (drawn = depth.x);\n    const f = EH - 3;\n    put(ext, box(C, P, HX, EY[0], 0, HX + d, EY[1], EH, 1, 0.8));\n    draw(\n      fascia,\n      open([P(HX, EY[1], f), P(HX + d, EY[1], f), P(HX + d, EY[0], f)]),\n    );\n    doors.setAttribute(\"transform\", shift(P, d, 0, 0));\n    lantern.setAttribute(\"transform\", shift(P, HX + d / 2, 0, 0));\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [a] = onWall(P, [HX, EY[1], 0], [1, 0], p);\n        depth.t = clamp(a, DMIN, DMAX);\n        read.textContent = `depth ${Math.round(depth.t / 5) / 2}m`;\n        B.wake();\n      },\n      leave: () => {\n        depth.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      DMAX = v;\n      depth.t = Math.min(depth.t, DMAX);\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"The back corner of a house with a pitched roof and a window, and a single-storey flat-roofed extension built out from its back wall, with bifold doors across its end and a rooflight. Moving away from the house makes the extension deeper.\",\n  range: [48, 56, DTOP],\n  probe: [300, 230],\n  engine,\n};\n", "import { Cam, corners, fit, proj, unproj } from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { shift } from \"./_walls\";\n\n/**\n * Flat roof insulation: a roof deck with a brick parapet and its coping along\n * the back, and a grid of insulation boards laid on the deck. The membrane is\n * bonded over the boards by the parapet and cut back in steps towards the near\n * corner, so the bare boards show there. The board under the pointer lifts\n * off the deck, its neighbours less the further they are, the lift spreading\n * out from it; its edge is the bright one. At rest the near corner board\n * stands a little proud, bright. The slider is the lift height.\n *\n * The pattern: one of many. A tween per board, staggered by distance; the\n * pick reads the boards' rest top plane, which never moves.\n */\n\nconst COLS = 3;\nconst ROWS = 2;\nconst X0 = 18;\nconst BW = 38;\nconst Y0 = 2;\nconst BD = 46;\nconst GAP = 0.7;\nconst T = 10;\nconst M = 2.2;\nconst PH = 36;\nconst LMAX = 22;\nconst REST = { i: 2, j: 1 };\n/** Boards the membrane covers: all but the near corner's three. */\nconst covered = (i: number, j: number) => i === 0 || (i === 1 && j === 0);\n/** The share of the lift a board takes, d boards from the chosen one. */\nconst fall = (d: number) => Math.max(0.04, Math.exp(-0.9 * d * d));\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let LIFT = value;\n  const X1 = X0 + COLS * BW;\n  const Y1 = Y0 + ROWS * BD;\n  const C = Cam(45, 0.5, 1.72);\n  fit(C, [\n    ...corners(-4, -4, -8, X1 + 4, Y1 + 4, 0),\n    ...corners(-3, -2, 0, 15, Y1 + 2, PH + 5),\n    ...corners(X0, Y0, 0, X1, Y1, T + M + LMAX),\n  ]);\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n\n  // the deck, then the parapet: coursed brick, the membrane turned up its foot\n  put(solid(g), box(C, P, -4, -4, -8, X1 + 4, Y1 + 4, 0, 3, 1.6));\n  put(solid(g), box(C, P, 0, -2, 0, 12, Y1 + 2, PH));\n  path(\n    g,\n    \"nf lo\",\n    coursesX(P, 12, -1, Y1 + 1, 0, PH, 5) +\n      perpendsX(P, 12, -2, Y1 + 2, 0, PH, 5, 15) +\n      coursesY(P, Y1 + 2, 1, 11, 0, PH, 5) +\n      perpendsY(P, Y1 + 2, 0, 12, 0, PH, 5, 7.5),\n  );\n  put(solid(g), box(C, P, 12, -2, 0, 14, Y1 + 2, T + M + 6, 0.6, 0.4));\n  put(solid(g), box(C, P, -3, -4, PH, 15, Y1 + 4, PH + 5, 1.2, 0.8));\n\n  // the boards, back to front; a covered one carries its membrane on top\n  const order: Array<[number, number]> = [];\n  for (let i = 0; i < COLS; i++)\n    for (let j = 0; j < ROWS; j++) order.push([i, j]);\n  order.sort((a, b) => a[0] * BW + a[1] * BD - (b[0] * BW + b[1] * BD));\n  const boards = order.map(([i, j]) => {\n    const x0 = X0 + i * BW + GAP;\n    const x1 = X0 + (i + 1) * BW - GAP;\n    const y0 = Y0 + j * BD + GAP;\n    const y1 = Y0 + (j + 1) * BD - GAP;\n    const bg = mk(\"g\", {}, g);\n    const sils = [solid(bg)];\n    put(sils[0]!, box(C, P, x0, y0, 0, x1, y1, T, 1, 0.9));\n    if (covered(i, j)) {\n      // the cap sheet: a skin a little proud of the board, its mineral grit\n      sils.push(solid(bg));\n      put(\n        sils[1]!,\n        box(C, P, x0 - 0.4, y0 - 0.4, T, x1 + 0.4, y1 + 0.4, T + M, 0.8, 0.8),\n      );\n      for (let u = 0; u < 5; u++)\n        for (let v = 0; v < 6; v++) {\n          const h =\n            Math.abs(\n              Math.sin((i * 31 + j * 17 + u * 7 + v) * 12.9898) * 437.5,\n            ) % 1;\n          const x = x0 + 4 + (u + h * 0.8) * ((x1 - x0 - 8) / 5);\n          const y = y0 + 4 + (v + ((h * 7) % 1) * 0.8) * ((y1 - y0 - 8) / 6);\n          place(dot(bg, 0.7, \"dot off\"), P(x, y, T + M));\n        }\n    }\n    return { i, j, bg, sils, tw: tween(0), drawn: Number.NaN };\n  });\n\n  let act: { i: number; j: number } | null = null;\n  const retarget = () => {\n    const a = act ?? REST;\n    const depth = act ? 1 : 0.4;\n    const now = performance.now();\n    for (const b of boards) {\n      const d = Math.hypot(b.i - a.i, b.j - a.j);\n      const to = act ? LIFT * fall(d) : d === 0 ? LIFT * depth : 0;\n      tset(b.tw, to, now, d * 45);\n      for (const e of b.sils) e.sil.classList.toggle(\"hi\", d === 0);\n    }\n    read.textContent = act ? `board ${act.i + 1}\u00B7${act.j + 1}` : \"rest\";\n    B.wake();\n  };\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const b of boards) {\n      const v = tval(b.tw, now);\n      if (!tdone(b.tw, now)) moving = true;\n      if (v === b.drawn) continue;\n      b.drawn = v;\n      b.bg.setAttribute(\"transform\", shift(P, 0, 0, v));\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n  retarget();\n  for (const b of boards) b.tw.t0 = -1e9;\n  B.wake();\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, y] = unproj(C, p[0], p[1], T);\n        const i = Math.floor((x - X0) / BW);\n        const j = Math.floor((y - Y0) / BD);\n        const next = i >= 0 && i < COLS && j >= 0 && j < ROWS ? { i, j } : null;\n        if (next?.i === act?.i && next?.j === act?.j) return;\n        act = next;\n        retarget();\n      },\n      leave: () => {\n        act = null;\n        retarget();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      LIFT = v;\n      retarget();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A flat roof deck with a brick parapet and coping along the back, insulation boards laid across it and the membrane cut back at the near corner. The board under the pointer lifts, its neighbours a little less.\",\n  range: [10, 16, LMAX],\n  probe: [240, 190],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  corners,\n  fit,\n  onWall,\n  open,\n  poly,\n  proj,\n  rrect,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { bar, on } from \"./_fans\";\n\n/**\n * Heating controls: a round smart thermostat on a slice of wall, a ring of\n * ticks round its glass face, and a phone leaning on the wall beside it whose\n * screen shows the same arc. The pointer's angle round the dial turns the\n * setpoint, on a spring, in half-degree detents across 10\u201330\u00B0C. The setpoint\n * tick is the bright mark; ticks up to it are medium, beyond it dim. At rest\n * the setpoint is 20\u00B0, straight up.\n *\n * The pattern: a dial. One spring for the setpoint, its target snapped to a\n * detent; the hit test is on the face's plane, which never moves.\n */\n\nconst WX0 = -40;\nconst WX1 = 82;\nconst WT = 8;\nconst WZ = 90;\nconst CX = 4;\nconst ZC = 54;\nconst R = 28;\nconst BD = 9;\nconst FR = 23;\nconst FY = BD + 1.6;\nconst T0 = 10;\nconst T1 = 30;\nconst SPAN = 270;\nconst REST = 20;\nconst PX = 47;\nconst PW = 26;\nconst PL = 52;\nconst PF = 14;\nconst PT = 2.6;\nconst PH = Math.sqrt(PL * PL - PF * PF);\nconst X: Vec3 = [1, 0, 0];\nconst Y: Vec3 = [0, 1, 0];\nconst Z: Vec3 = [0, 0, 1];\n/** Up the phone's face, and out of its screen. */\nconst U: Vec3 = [0, -PF / PL, PH / PL];\nconst N: Vec3 = [0, PH / PL, PF / PL];\n\n/** The angle of a temperature on the ring: 10\u00B0 lower left, 20\u00B0 at the top, 30\u00B0 lower right. */\nconst ang = (t: number) =>\n  ((225 - ((t - T0) / (T1 - T0)) * SPAN) * Math.PI) / 180;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.75);\n  fit(C, corners(WX0 - 6, -WT - 6, -3, WX1 + 6, 28, WZ));\n  const P = proj(C);\n  const set = spring(REST, { k: value });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, WX0 - 6, -WT - 6, -3, WX1 + 6, 28, 0, 3, 1.6));\n  put(solid(g), box(C, P, WX0, -WT, 0, WX1, 0, WZ, 1.6, 1.2));\n  put(solid(g), box(C, P, WX0, 0, 0, WX1, 2.2, 8, 0.8, 0.6));\n\n  // the thermostat: its body, the glass face, and the ring of ticks on it\n  const O: Vec3 = [CX, 0, ZC];\n  put(solid(g), bar(P, O, Y, X, Z, circ(R, 72), circ(R - 1.8, 72), 0, BD));\n  put(solid(g), bar(P, O, Y, X, Z, circ(FR, 64), circ(FR - 1.2, 64), BD, FY));\n  const f = on(P, [CX, FY, ZC], X, Z);\n  const tk = (t: number, r0: number, r1: number) => {\n    const a = ang(t);\n    const c = Math.cos(a);\n    const s = Math.sin(a);\n    return seg(f(r0 * c, r0 * s), f(r1 * c, r1 * s));\n  };\n  const lo = path(g, \"nf lo\");\n  const mid = path(g, \"nf\");\n  const hi = path(g, \"nf hi\");\n\n  // the phone, leaning on the wall: its screen, earpiece and the app's arc\n  put(\n    solid(g),\n    bar(\n      P,\n      [PX, PF, 0],\n      N,\n      X,\n      U,\n      rrect(0, 0, PW, PL, 4),\n      rrect(1.2, 1.2, PW - 1.2, PL - 1.2, 2.8),\n      0,\n      PT,\n    ),\n  );\n  const sc = on(P, [PX, PF + N[1] * PT, N[2] * PT], X, U);\n  const arc = (t0: number, t1: number) => {\n    const pts: Vec2[] = [];\n    const n = Math.max(2, Math.ceil(Math.abs(t1 - t0) * 2));\n    for (let i = 0; i <= n; i++) {\n      const a = ang(t0 + ((t1 - t0) * i) / n);\n      pts.push(sc(PW / 2 + 8 * Math.cos(a), PL * 0.58 + 8 * Math.sin(a)));\n    }\n    return open(pts);\n  };\n  path(\n    g,\n    \"nf lo\",\n    poly(rrect(2.6, 6, PW - 2.6, PL - 6, 1.6).map((q) => sc(q.u, q.v))) +\n      seg(sc(PW / 2 - 3, PL - 3.2), sc(PW / 2 + 3, PL - 3.2)) +\n      arc(T0, T1),\n  );\n  const app = path(g, \"nf\");\n\n  let drawn = Number.NaN;\n  const tick = (dt: number) => {\n    const moving = stepS(set, dt);\n    if (set.x !== drawn) {\n      drawn = set.x;\n      let m = \"\";\n      let l = \"\";\n      for (let t = T0; t <= T1; t++) {\n        // lit ticks reach further in than the dim ones, so the lit arc reads as a band\n        const lit = t <= set.x + 1e-6;\n        const d = tk(t, FR - (t % 5 ? 3.5 : 5) - (lit ? 3 : 0), FR - 2.4);\n        if (lit) m += d;\n        else l += d;\n      }\n      draw(mid, m);\n      draw(lo, l);\n      draw(hi, tk(set.x, FR - 13, FR - 1));\n      draw(app, arc(T0, set.x));\n    }\n    return moving;\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [u, v] = onWall(P, [CX, FY, ZC], [1, 0], p);\n        const r = Math.hypot(u, v);\n        if (r < 4 || r > R + 16) return;\n        const d =\n          (((225 - (Math.atan2(v, u) * 180) / Math.PI) % 360) + 360) % 360;\n        const k = d <= SPAN ? d / SPAN : d < (SPAN + 360) / 2 ? 1 : 0;\n        set.t = Math.round((T0 + k * (T1 - T0)) * 2) / 2;\n        read.textContent = `${set.t.toFixed(1)}\u00B0`;\n        B.wake();\n      },\n      leave: () => {\n        set.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      set.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A round smart thermostat on a wall, a ring of ticks round its face, with a phone leaning beside it showing the same arc. Circling the pointer round the dial turns the setpoint.\",\n  range: [40, 100, 220],\n  probe: [193, 138],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  proj,\n  seg,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { type Blades, bar, blades, circle, on } from \"./_fans\";\n\n/**\n * Air source heat pump: the outdoor unit on its two rubber feet, a round fan\n * behind a grille at one end of its front and the coil's fins at the other.\n * The fan turns slowly on its own while it is on screen; the pointer's\n * nearness to it spins it up on a spring, as far as the slider's multiple.\n * The shroud round the fan is the bright mark.\n *\n * The pattern: ambient motion whose rate the pointer changes. The rate is one\n * spring, softer than the default because a fan has inertia; the hit test is\n * on the front face's plane, which never moves.\n */\n\nconst D = 32;\nconst L = 100;\nconst FT = 6;\nconst HB = 60;\nconst FAN: Vec3 = [D, 67, FT + HB / 2];\nconst R = 24;\nconst W0 = 0.9;\nconst BL: Blades = { n: 5, r0: 5, r1: R - 4.5, sweep: 0.5, w0: 0.3, w1: 0.72 };\nconst X: Vec3 = [1, 0, 0];\nconst A: Vec3 = [0, -1, 0];\nconst Z: Vec3 = [0, 0, 1];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let boost = value;\n  const C = Cam(45, 0.5, 2.35);\n  fit(C, corners(-3, 0, 0, D + 3, L, FT + HB));\n  const P = proj(C);\n  const rate = spring(1, { k: 9, c: 6, eps: 0.002 });\n  let phase = 0.3;\n\n  const g = mk(\"g\", {}, svg);\n  for (const y of [9, 81])\n    put(solid(g), box(C, P, -3, y, 0, D + 3, y + 10, FT, 1.6, 0.6));\n  put(solid(g), box(C, P, 0, 0, FT, D, L, FT + HB, 4, 1.6));\n\n  // the coil's fins along the far end of the front\n  let fins = \"\";\n  for (let z = FT + 9; z < FT + HB - 6; z += 7)\n    fins += seg(P(D, 8, z), P(D, 38, z));\n  path(g, \"nf\", fins);\n\n  // the fan: shroud, blades behind the grille, hub\n  const shroud = solid(g);\n  put(shroud, bar(P, FAN, X, A, Z, circ(R, 72), circ(R - 1.6, 72), 0, 2.4));\n  shroud.sil.classList.add(\"hi\");\n  const face = on(P, FAN, A, Z);\n  const grille = on(P, [D + 2.4, FAN[1], FAN[2]], A, Z);\n  path(g, \"nf lo\", circle(grille, R - 3, 64));\n  const bl = path(g, \"nf\");\n  put(solid(g), bar(P, FAN, X, A, Z, circ(5.5, 28), circ(4.3, 28), 0, 3.4));\n  path(g, \"nf lo\", circle(grille, R * 0.6, 56));\n\n  let drawn = Number.NaN;\n  const tick = (dt: number) => {\n    stepS(rate, dt);\n    if (reducedMotion()) return false;\n    phase = (phase + dt * W0 * rate.x) % (Math.PI * 2);\n    if (phase !== drawn) {\n      drawn = phase;\n      draw(bl, blades(face, BL, phase));\n    }\n    return true;\n  };\n  draw(bl, blades(face, BL, phase));\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [u, v] = onWall(P, FAN, [0, -1], p);\n        const t = clamp(1 - (Math.hypot(u, v) - R * 0.6) / (R * 2.2), 0, 1);\n        rate.t = 1 + (boost - 1) * t * t * (3 - 2 * t);\n        read.textContent = `fan ${rate.t.toFixed(1)}\u00D7`;\n        B.wake();\n      },\n      leave: () => {\n        rate.t = 1;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      boost = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"An air source heat pump's outdoor unit on its feet, a fan behind a round grille and the coil's fins along its front. The fan turns on its own; bringing the pointer near it spins it up.\",\n  range: [1.6, 3, 5],\n  probe: [198, 187],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  poly,\n  proj,\n  ringAt,\n  rrect,\n  seg,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { shift } from \"./_walls\";\n\n/**\n * Kitchen refit: a straight run of base units in a wall corner, a worktop\n * with a sink and tap and a four-ring hob, wall cupboards above and a cooker\n * hood over the hob. Every unit has a top drawer; the pointer's place along\n * the run picks one and it slides out on a spring while the others close.\n * The picked drawer's front is the bright line. At rest the drawer under the\n * hob stands ajar.\n *\n * The pattern: one of many. A spring per drawer; the hit test is on the plane\n * of the unit fronts, which never moves.\n */\n\nconst N = 5;\nconst W = 28;\nconst D = 30;\nconst L = N * W;\nconst PL = 6;\nconst H = 42;\nconst ZT = H + 2.4;\nconst YF = D + 1.2;\nconst WH = 94;\nconst C0 = 62;\nconst HOB = 3;\nconst AJAR = 6;\nconst MAX = 22;\nconst TOP = H - 10;\n/** What sits under each unit's top drawer. */\nconst KIND = [\"door\", \"pair\", \"door\", \"drawers\", \"door\"] as const;\n\n/** A box's corners, then its corner radius and bevel. */\ntype Box = [number, number, number, number, number, number, number?, number?];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let out = value;\n  const C = Cam(45, 0.5, 1.58);\n  fit(C, corners(-12, -12, -3, L + 10, D + MAX + 6, WH));\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n  const add = (...b: Box) => {\n    const s = solid(g);\n    put(s, box(C, P, ...b));\n    return s;\n  };\n  const front = (x0: number, z0: number, x1: number, z1: number) =>\n    add(x0, D, z0, x1, YF, z1, 0.6, 0.4);\n  const flat = (r: ReturnType<typeof rrect>) => poly(ringAt(P, r, ZT));\n\n  add(-12, -12, -3, L + 10, D + MAX + 6, 0, 3, 1.6);\n  add(-6, -6, 0, L + 4, 0, WH, 1.6, 1);\n  add(-6, 0, 0, 0, D + 14, WH, 1.6, 1);\n\n  // wall cupboards, and the hood over the hob: its canopy, then the chimney to the ceiling\n  for (let i = 0; i < N; i++) {\n    const x0 = i * W;\n    if (i === HOB) {\n      add(x0 + 2, 0, C0 + 2, x0 + W - 2, 19, C0 + 7, 1, 0.6);\n      add(x0 + 8, 2, C0 + 7, x0 + W - 8, 11, WH, 0.8, 0.5);\n      continue;\n    }\n    add(x0 + 0.5, 0, C0, x0 + W - 0.5, 16, C0 + 26, 1, 0.6);\n    const hx = i % 2 ? x0 + 3 : x0 + W - 3;\n    path(g, \"nf\", seg(P(hx, 16, C0 + 3), P(hx, 16, C0 + 8)));\n  }\n\n  // the recessed plinth and the carcass the fronts hang on\n  add(0, 0, 0, L, D - 3, PL, 0.6, 0.4);\n  add(0, 0, PL, L, D, H, 0.8, 0.5);\n\n  const drawers = Array.from({ length: N }, (_, i) => {\n    const x0 = i * W + 0.5;\n    const x1 = (i + 1) * W - 0.5;\n    const xm = (x0 + x1) / 2;\n    const z1 = TOP - 1;\n    const z0 = PL + 0.4;\n    const across = (z: number) => seg(P(xm - 6, YF, z), P(xm + 6, YF, z));\n    const up = (x: number) => seg(P(x, YF, z1 - 3), P(x, YF, z1 - 9));\n    let marks: string;\n    if (KIND[i] === \"drawers\") {\n      const zm = (z0 + z1) / 2;\n      front(x0, zm + 0.5, x1, z1);\n      front(x0, z0, x1, zm - 0.5);\n      marks = across(z1 - 3) + across(zm - 3.5);\n    } else if (KIND[i] === \"pair\") {\n      front(x0, z0, xm - 0.5, z1);\n      front(xm + 0.5, z0, x1, z1);\n      marks = up(xm - 3) + up(xm + 3);\n    } else {\n      front(x0, z0, x1, z1);\n      marks = up(i % 2 ? x0 + 3 : x1 - 3);\n    }\n    path(g, \"nf\", marks);\n\n    // the top drawer: its body is redrawn as it runs out, its face slides as a group\n    const body = solid(g);\n    const grp = mk(\"g\", {}, g);\n    const face = solid(grp);\n    put(face, box(C, P, x0, D, TOP, x1, YF, H - 0.6, 0.6, 0.4));\n    path(grp, \"nf\", across(H - 3.6));\n    const s = spring(i === HOB ? AJAR : 0);\n    return { s, body, face, grp, x0, x1, drawn: -1 };\n  });\n\n  add(0, 0, H, L + 1, YF + 1.2, ZT, 1, 0.6);\n\n  // the sink: its rim, the bowl's lip and the waste, and the tap behind\n  const sx = W;\n  path(g, \"nf\", flat(rrect(sx + 4, 5, sx + W - 4, D - 2, 3)));\n  const lip = flat(rrect(sx + 6, 7, sx + W - 6, D - 4, 2));\n  path(g, \"nf lo\", lip + flat(circ(1.6, 24, sx + W / 2, (D + 3) / 2)));\n  const tx = sx + W / 2;\n  add(tx - 1.3, 1.2, ZT, tx + 1.3, 3.8, ZT + 12, 1.2, 0.4);\n  add(tx - 1, 1.6, ZT + 9.6, tx + 1, 11, ZT + 12, 0.9, 0.3);\n\n  // the hob: its glass and four rings\n  const hx = HOB * W;\n  path(g, \"nf\", flat(rrect(hx + 3, 4, hx + W - 3, D - 2, 2)));\n  let rings = \"\";\n  for (let k = 0; k < 4; k++) {\n    const c = [hx + (k % 2 ? 0.7 : 0.3) * W, k < 2 ? 10 : 20] as const;\n    rings += flat(circ(k % 3 ? 3.4 : 4.6, 40, ...c));\n  }\n  path(g, \"nf\", rings);\n\n  const light = (a: number) =>\n    drawers.forEach((d, j) => d.face.sil.classList.toggle(\"hi\", j === a));\n  light(HOB);\n\n  const tick = (dt: number) => {\n    let moving = false;\n    for (const d of drawers) {\n      if (stepS(d.s, dt)) moving = true;\n      if (d.s.x === d.drawn) continue;\n      d.drawn = d.s.x;\n      const s = Math.max(0, d.s.x);\n      d.grp.setAttribute(\"transform\", shift(P, 0, s, 0));\n      d.body.g.style.display = s > 0.6 ? \"\" : \"none\";\n      const b = box(C, P, d.x0 + 2.5, D, TOP + 1.6, d.x1 - 2.5, D + s, H - 3);\n      if (s > 0.6) put(d.body, b);\n    }\n    return moving;\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  let over: number | null = null;\n  const retarget = () => {\n    drawers.forEach((d, j) => {\n      d.s.t = over === null ? (j === HOB ? AJAR : 0) : j === over ? out : 0;\n    });\n    light(over ?? HOB);\n    read.textContent = over === null ? \"rest\" : `drawer ${over + 1}`;\n    B.wake();\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, z] = onWall(P, [0, D, 0], [1, 0], p);\n        const inside = x > -10 && x < L + 10 && z > -24 && z < WH + 10;\n        over = inside ? clamp(Math.floor(x / W), 0, N - 1) : null;\n        retarget();\n      },\n      leave: () => {\n        over = null;\n        retarget();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      out = v;\n      if (over !== null) retarget();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A run of kitchen base units in a wall corner, a worktop with a sink and a hob, wall cupboards and a cooker hood above. Moving along the run slides out that unit's top drawer.\",\n  range: [10, 16, MAX],\n  probe: [200, 200],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  corners,\n  facing,\n  fit,\n  poly,\n  prism,\n  proj,\n  seg,\n  unproj,\n  type Vec2,\n} from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\n\n/**\n * Low-energy lighting: the corner of a room, cut away, with three recessed\n * downlights in a row in its ceiling. A lit fitting throws a dashed cone of\n * light down to a pool on the floor. The pointer over the floor turns on the\n * fitting whose pool it is nearest: its cone falls and spreads to the floor\n * while the others draw theirs back up into their fittings, staggered by\n * distance. The lit fitting, its cone and its pool are the bright mark. At\n * rest the middle light is on.\n *\n * The pattern: one of many. A tween per light, picked on the floor plane,\n * which never moves.\n */\n\nconst L = 126;\nconst D = 58;\nconst H = 74;\nconst WT = 6;\nconst T = 3;\nconst CX = L - 12;\nconst CY = D - 14;\nconst ZC = H + T;\nconst YL = D / 2;\nconst XS = [26, 63, 100];\nconst RB = 6.5;\nconst RL = 4.2;\nconst REST = 1;\nconst RMAX = 24;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let R = value;\n  const C = Cam(45, 0.5, 1.65);\n  fit(C, corners(-WT - 6, -WT - 6, -3, L + 6, D + 6, ZC));\n  const P = proj(C);\n  const zf = Math.sqrt(1 - C.k * C.k);\n  const front = facing(C);\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, -WT - 6, -WT - 6, -3, L + 6, D + 6, 0, 3, 1.6));\n  put(solid(g), box(C, P, -WT, -WT, 0, L, 0, H, 1.2, 0.8));\n  put(solid(g), box(C, P, -WT, 0, 0, 0, D, H, 1.2, 0.8));\n  put(solid(g), box(C, P, 0, 0, 0, L, 1.6, 7, 0.6, 0.4));\n  put(solid(g), box(C, P, 0, 1.6, 0, 1.6, D, 7, 0.6, 0.4));\n  put(solid(g), box(C, P, -WT, -WT, H, CX, CY, ZC, 1.2, 0.8));\n\n  /** A level circle of radius r round (x, YL) at height z, at screen angle a. */\n  const at = (x: number, r: number, z: number, a: number) =>\n    P(x + r * Math.cos(a - Math.PI / 4), YL + r * Math.sin(a - Math.PI / 4), z);\n  const ring = (x: number, r: number, z: number) =>\n    poly(\n      Array.from({ length: 48 }, (_, i) => at(x, r, z, (i / 48) * 2 * Math.PI)),\n    );\n\n  const lights = XS.map((x, i) => {\n    put(\n      solid(g),\n      prism(P, front, circ(RB, 48, x, YL), circ(RB - 1, 48, x, YL), ZC, ZC + 1),\n    );\n    return {\n      x,\n      lens: path(g, \"nf\", ring(x, RL, ZC + 1)),\n      cone: path(g, \"nf dash\"),\n      tw: tween(i === REST ? 1 : 0),\n      drawn: Number.NaN,\n    };\n  });\n\n  /** The light's cone, fallen v of the way to the floor: its two sides and its foot. */\n  const cone = (x: number, v: number) => {\n    if (v < 0.01) return \"\";\n    const z = ZC * (1 - v);\n    const r = RL + (R - RL) * v;\n    let d = ring(x, r, z) + (v > 0.5 ? ring(x, r * 0.55 * (2 * v - 1), z) : \"\");\n    // the sides touch both rings where sin a = -(r - RL) k / (drop zf)\n    const s = (-(r - RL) * C.k) / ((ZC - z) * zf);\n    if (Math.abs(s) < 1) {\n      const a = Math.asin(s);\n      for (const b of [a, Math.PI - a])\n        d += seg(at(x, RL, ZC + 1, b), at(x, r, z, b));\n    }\n    return d;\n  };\n\n  let act = -2;\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const l of lights) {\n      const v = tval(l.tw, now);\n      if (v !== l.drawn) {\n        l.drawn = v;\n        draw(l.cone, cone(l.x, v));\n      }\n      if (!tdone(l.tw, now)) moving = true;\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  /** Turns on light n and the others off, staggered outward; -1 is rest. */\n  const choose = (n: number) => {\n    if (n === act) return;\n    act = n;\n    const on = n < 0 ? REST : n;\n    const now = performance.now();\n    lights.forEach((l, i) => {\n      tset(l.tw, i === on ? 1 : 0, now, Math.abs(i - on) * 50);\n      for (const el of [l.lens, l.cone]) el.classList.toggle(\"hi\", i === on);\n    });\n    read.textContent = n < 0 ? \"rest\" : `light ${n + 1}`;\n    B.wake();\n  };\n  choose(-1);\n\n  const hit = (p: Vec2) => {\n    const [x, y] = unproj(C, p[0], p[1], 0);\n    if (x < -14 || x > L + 14 || y < -14 || y > D + 20) return -1;\n    let best = 0;\n    XS.forEach((xi, i) => {\n      if (Math.abs(x - xi) < Math.abs(x - (XS[best] ?? 0))) best = i;\n    });\n    return best;\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => choose(hit(p)),\n      leave: () => choose(-1),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      R = v;\n      for (const l of lights) l.drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"The corner of a room with three LED downlights in its ceiling, one throwing a cone of light onto the floor. Moving over the floor turns on the light nearest the pointer.\",\n  range: [14, 19, RMAX],\n  probe: [245, 245],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  fit,\n  open,\n  proj,\n  seg,\n  unproj,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { eyeOf, type Frame, inFrame } from \"./_timber\";\n\n/**\n * Loft insulation: ceiling joists on the ceiling below, with quilt laid\n * between them a little below their tops, and the top layer being unrolled\n * across the joists from a roll that shrinks as it goes, its end showing the\n * spiral. The pointer along the joists sets how far the roll has gone, on a\n * spring. The roll is the bright mark. The slider is the spring's stiffness.\n */\n\nconst LEN = 148;\nconst JOISTS = [0, 24, 48, 72, 96, 120, 144];\nconst JW = 4;\nconst JH = 12;\nconst D = 96;\nconst T = 8;\nconst RUN = { y0: 34, y1: 90 };\nconst MID = (RUN.y0 + RUN.y1) / 2;\nconst CORE = 3.5;\nconst PITCH = 3.4;\nconst R0 = Math.sqrt(CORE * CORE + (T * LEN) / Math.PI);\nconst MIN = R0;\nconst MAX = LEN - 8;\nconst REST = 0.52 * LEN;\n\n/** The roll's radius once `l` has been laid: what is left, wound round the core. */\nconst radius = (l: number) =>\n  Math.sqrt(CORE * CORE + (T * (LEN - l)) / Math.PI);\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.62);\n  const pts: Vec3[] = corners(-5, -5, -3, LEN + 5, D + 5, JH);\n  pts.push([MIN - R0, RUN.y0, JH + 2 * R0], [MIN + R0, RUN.y1, JH]);\n  fit(C, pts);\n  const P = proj(C);\n  const eye = eyeOf(P);\n  const laid = spring(REST, { k: value, eps: 0.05 });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, -5, -5, -3, LEN + 5, D + 5, 0, 1.6, 1));\n\n  // joists across the ceiling, quilt between them a little below their tops\n  JOISTS.forEach((x, i) => {\n    put(solid(g), box(C, P, x, 0, 0, x + JW, D, JH, 0.8, 0.5));\n    const next = JOISTS[i + 1];\n    if (next !== undefined)\n      put(solid(g), box(C, P, x + JW, 0, 0, next, D, JH - 3.5, 1.4, 0.9));\n  });\n\n  // the top layer, rolled out across the joists, perforated down its middle\n  const sheet = solid(g);\n  const perf = path(g, \"nf lo dash\");\n  const roll = solid(g);\n  roll.sil.classList.add(\"hi\");\n  const spiral = path(roll.g, \"nf lo\");\n\n  let drawn = Number.NaN;\n  const tick = (dt: number) => {\n    const moving = stepS(laid, dt);\n    if (laid.x === drawn) return moving;\n    drawn = laid.x;\n    const l = laid.x;\n    const r = radius(l);\n    put(sheet, box(C, P, 0, RUN.y0, JH, l, RUN.y1, JH + T, 2, 1.1));\n    perf.setAttribute(\"d\", seg(P(3, MID, JH + T), P(l - r, MID, JH + T)));\n    const F: Frame = {\n      o: [l, 0, JH + r],\n      u: [1, 0, 0],\n      v: [0, 0, 1],\n      w: [0, 1, 0],\n    };\n    put(\n      roll,\n      inFrame(P, eye, F, circ(r, 48), circ(r - 0.9, 48), RUN.y0, RUN.y1),\n    );\n    // the wound quilt on the near end, its outer turn meeting the floor\n    const out: Vec2[] = [];\n    const turns = (r - 1.4 - CORE) / PITCH;\n    for (let k = 0; k <= 160; k++) {\n      const f = k / 160;\n      const rho = CORE + (r - 1.4 - CORE) * f;\n      const th = -Math.PI / 2 - 2 * Math.PI * turns * (1 - f);\n      out.push(P(l + rho * Math.cos(th), RUN.y1, JH + r + rho * Math.sin(th)));\n    }\n    spiral.setAttribute(\"d\", open(out));\n    return moving;\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, y] = unproj(C, p[0], p[1], JH);\n        if (y < -20 || y > D + 30 || x < -30 || x > LEN + 30) return;\n        laid.t = clamp(x, MIN, MAX);\n        read.textContent = `${((laid.t / LEN) * 4.8).toFixed(1)}m`;\n        B.wake();\n      },\n      leave: () => {\n        laid.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      laid.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"Ceiling joists with quilt laid between them and a top layer rolled out across them. Moving along the joists unrolls the next run.\",\n  range: [40, 100, 220],\n  probe: [260, 200],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, proj, rings, type Vec3 } from \"../core/iso\";\nimport { type Tween, tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  type Solid,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { at, eyeOf, type Frame, inFrame, onPlane } from \"./_timber\";\n\n/**\n * Room in roof: a 45\u00B0 roof cut at its gable, on a short brick wall each side.\n * Ceiling joists run across; slim rafters pair up at a ridge board, set out\n * along the ridge with open bays between them. The far pitch is bare; the\n * near pitch has a slab of insulation in each bay. The pointer picks a bay and\n * its slab slides up home between the rafters while its neighbours drop back,\n * staggered by distance. At rest every bay is filled but the third, whose slab\n * is part way in and bright. The slider is how far a slab drops.\n *\n * The pattern: one of many, on tweens, picked on the plane of the near\n * rafters' tops, which never moves.\n */\n\nconst c = Math.SQRT1_2;\nconst N = 4;\nconst GAP = 24;\nconst RW = 2.5;\nconst RD = 6;\nconst JH = 5;\nconst HALF = 44;\nconst RL = HALF / c - 1.8;\nconst TAIL = 7;\nconst Y1 = N * GAP + RW;\nconst WALL = { t: 8, h: 16 };\nconst SLAB = { v0: 2, v1: RL - 6 };\n/** The ridge board's top and foot: just proud of the rafters' square-cut ends. */\nconst RIDGE = [JH + c * (RL + RD) + 3, JH + c * RL - 2] as const;\nconst REST = 2;\nconst COURSE = 4;\n\n// each pitch: u along the ridge, v up the rafters, w out of the roof\nconst FRONT: Frame = {\n  o: [HALF, 0, JH],\n  u: [0, 1, 0],\n  v: [-c, 0, c],\n  w: [c, 0, c],\n};\nconst BACK: Frame = {\n  o: [-HALF, 0, JH],\n  u: [0, 1, 0],\n  v: [c, 0, c],\n  w: [-c, 0, c],\n};\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let slide = value;\n  const C = Cam(45, 0.5, 1.8);\n  const pts: Vec3[] = corners(-HALF - 2, -2, -WALL.h, HALF + 2, Y1 + 2, 0);\n  pts.push(\n    [0, 0, RIDGE[0]],\n    at(FRONT, 0, -TAIL, 0),\n    at(BACK, Y1, -TAIL, 0),\n    at(FRONT, Y1, SLAB.v0 - 32, 0),\n  );\n  fit(C, pts);\n  const P = proj(C);\n  const eye = eyeOf(P);\n  const g = mk(\"g\", {}, svg);\n\n  // the two walls, coursed where they show\n  for (const x of [-HALF - 2, HALF + 2 - WALL.t]) {\n    const x1 = x + WALL.t;\n    put(solid(g), box(C, P, x, -2, -WALL.h, x1, Y1 + 2, 0, 1, 0.6));\n    path(\n      g,\n      \"nf lo\",\n      (x > 0\n        ? coursesX(P, x1, -1, Y1 + 1, -WALL.h, 0, COURSE) +\n          perpendsX(P, x1, -2, Y1 + 2, -WALL.h, 0, COURSE, 12)\n        : \"\") +\n        coursesY(P, Y1 + 2, x + 1, x1 - 1, -WALL.h, 0, COURSE) +\n        perpendsY(P, Y1 + 2, x, x1, -WALL.h, 0, COURSE, 8),\n    );\n  }\n\n  const rafter = (F: Frame, y: number) => {\n    const [r] = rings(y, -TAIL, y + RW, RL, 0.6, 0.4);\n    put(solid(g), inFrame(P, eye, F, r, null, 0, RD));\n  };\n  // behind the near pitch: joists across, each under a bare far rafter\n  for (let b = 0; b <= N; b++) {\n    const y = b * GAP;\n    put(solid(g), box(C, P, -HALF - 2, y, 0, HALF + 2, y + RW, JH, 0.6, 0.4));\n    rafter(BACK, y);\n  }\n  // the ridge board the rafters meet at\n  put(solid(g), box(C, P, -1.2, -2, RIDGE[1], 1.2, Y1 + 2, RIDGE[0], 0.5, 0.4));\n\n  // the near pitch, rafter then the slab in front of it\n  const [sr, si] = rings(0, SLAB.v0, GAP - RW - 0.6, SLAB.v1, 1.2, 0.9);\n  const slabs: Array<{ el: Solid; tw: Tween; drawn: number; y: number }> = [];\n  for (let b = 0; b <= N; b++) {\n    rafter(FRONT, b * GAP);\n    if (b === N) break;\n    const y = b * GAP + RW + 0.3;\n    slabs.push({ el: solid(g), tw: tween(0), drawn: Number.NaN, y });\n  }\n\n  const drawSlab = (s: (typeof slabs)[number], d: number) => {\n    if (d === s.drawn) return;\n    s.drawn = d;\n    const F: Frame = { ...FRONT, o: at(FRONT, s.y, -d, 0) };\n    put(s.el, inFrame(P, eye, F, sr, si, 0.5, RD - 0.7));\n  };\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const s of slabs) {\n      drawSlab(s, tval(s.tw, now));\n      if (!tdone(s.tw, now)) moving = true;\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  let act = -1;\n  /** Sends bay a's slab home and drops the rest back (-1 is the rest pose); the stagger spreads from the bay chosen, or the one let go. */\n  const choose = (a: number, force = false) => {\n    if (a === act && !force) return;\n    const now = performance.now();\n    const from = a >= 0 ? a : act >= 0 ? act : REST;\n    const lit = a >= 0 ? a : REST;\n    act = a;\n    slabs.forEach((s, i) => {\n      const d = Math.abs(i - lit);\n      const out = a < 0 ? (d === 0 ? 0.55 : 0) : Math.min(0.5, 0.25 * d);\n      tset(s.tw, out * slide, now, force ? 0 : Math.abs(i - from) * 45);\n      s.el.sil.classList.toggle(\"hi\", i === lit);\n    });\n    read.textContent = a < 0 ? \"rest\" : `bay ${a + 1}`;\n    B.wake();\n  };\n  choose(-1, true);\n  for (const s of slabs) s.tw.t0 = -1e9;\n\n  const plane = at(FRONT, 0, 0, RD);\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [u, v] = onPlane(P, plane, FRONT.u, FRONT.v, p);\n        if (v < -TAIL - 24 || v > RL + 6 || u < -8 || u > Y1 + 8) choose(-1);\n        else choose(clamp(Math.floor((u - RW / 2) / GAP), 0, N - 1));\n      },\n      leave: () => choose(-1),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      slide = v;\n      choose(act, true);\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A pitched roof cut at its gable, on a brick wall each side: ceiling joists, slim rafters meeting at a ridge board, and insulation slabs between the rafters of the near pitch. Pointing at a bay slides its slab up into place.\",\n  range: [16, 24, 32],\n  probe: [230, 150],\n  engine,\n};\n", "import {\n  Cam,\n  corners,\n  fillet,\n  fit,\n  lerp,\n  onWall,\n  open,\n  proj,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\n\n/**\n * Heating distribution: the corner of a room, floor and two walls with their\n * skirting, a radiator on each wall, and a pair of pipes, flow over return,\n * running along the skirting from a manifold at the left end round the corner\n * to both. The pointer picks a radiator: warm water runs along the flow pipe\n * to it, up its tail, and its columns warm one by one from the flow end. At\n * rest the flow is run to the nearer radiator, and the lit run is the one\n * bright mark.\n *\n * The pattern: pick, then run along a path. A tween for how far the water\n * has run, one for the near tail, one per radiator for its warmth; the hit\n * test is on the two radiator faces' planes, which never move.\n */\n\nconst LA = 108;\nconst LB = 116;\nconst H = 64;\nconst WT = 6;\nconst SK = 1.2;\nconst OFF = 3;\nconst ZF = 14;\nconst ZR = 9.5;\nconst RX = [1.2, 4.8] as const;\nconst RZ = [23, 49] as const;\nconst VZ = RZ[0] - 5;\nconst MAN = 98;\n/** Radiator 1 runs along y on the left wall, radiator 2 along x on the right: its span, columns, flow end and return end. */\nconst N1 = { a: 26, b: 58, n: 5, f: 55, r: 29 };\nconst N2 = { a: 36, b: 94, n: 9, f: 39, r: 91 };\nconst RADS = [N1, N2];\n/** A box's corners, then its corner radius and bevel. */\ntype Box = [number, number, number, number, number, number, number?, number?];\n/** A point on wall k: s along it, d out from it, z up. */\nconst W = (k: number, s: number, d: number, z: number): Vec3 =>\n  k ? [s, d, z] : [d, s, z];\n\n/** The pipe along the skirting at height z, from the manifold round the corner to x = end, then up to the valve. */\nconst route = (z: number, end: number): Vec3[] => {\n  const g: Vec2[] = [\n    [OFF, MAN],\n    [OFF, OFF],\n    [end, OFF],\n  ];\n  const out = fillet(g, [0, 5, 0]).map(([x, y]): Vec3 => [x, y, z]);\n  return out.concat([[end, OFF, VZ]]);\n};\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.75);\n  fit(C, corners(-WT, -WT, -3, LA, LB, H));\n  const P = proj(C);\n  const line = (...pts: Vec3[]) => open(pts.map((q) => P(...q)));\n\n  const g = mk(\"g\", {}, svg);\n  const add = (...b: Box) => put(solid(g), box(C, P, ...b));\n  add(-WT, -WT, -3, LA, LB, 0, 2, 1.2);\n  add(-WT, -WT, 0, LA, 0, H, 1.2, 0.8);\n  add(-WT, 0, 0, 0, LB, H, 1.2, 0.8);\n  add(0, SK, 0, SK, LB, 5, 0.4, 0.3);\n  add(0, 0, 0, LA, SK, 5, 0.4, 0.3);\n\n  // the radiators: a panel each, its columns on the face, counted from the flow end\n  const rads = RADS.map(({ a, b, n }, k) => {\n    const [x0, y0, z0] = W(k, a, RX[0], RZ[0]);\n    const [x1, y1, z1] = W(k, b, RX[1], RZ[1]);\n    add(x0, y0, z0, x1, y1, z1, 0.8, 0.5);\n    const c = Array.from({ length: n }, (_, j) => {\n      const s = lerp(a, b, k ? (j + 1) / (n + 1) : 1 - (j + 1) / (n + 1));\n      return line(W(k, s, RX[1], RZ[0] + 2), W(k, s, RX[1], RZ[1] - 2));\n    });\n    return { c, warm: path(g, \"nf\"), cool: path(g, \"nf lo\"), tw: tween(0) };\n  });\n\n  // the pipes: return under flow, a tail up to each valve; flow and return end in radiator 2's\n  const flow = route(ZF, N2.f);\n  path(\n    g,\n    \"nf sil\",\n    line(...flow) +\n      line(...route(ZR, N2.r)) +\n      line([OFF, N1.f, ZF], [OFF, N1.f, VZ]) +\n      line([OFF, N1.r, ZR], [OFF, N1.r, VZ]),\n  );\n  const lit = path(g, \"nf hi\");\n  const L = [0];\n  for (let i = 1; i < flow.length; i++) {\n    const [p, q] = [flow[i - 1]!, flow[i]!];\n    L.push(L[i - 1]! + Math.hypot(q[0] - p[0], q[1] - p[1], q[2] - p[2]));\n  }\n  const J1 = MAN - N1.f;\n  const run = tween(J1);\n  const up = tween(1);\n\n  // a valve under each radiator's ends, and the manifold the pipes leave\n  RADS.forEach((r, k) => {\n    for (const s of [r.f, r.r]) {\n      const [x, y] = W(k, s, OFF, 0);\n      add(x - 1.5, y - 1.5, VZ, x + 1.5, y + 1.5, RZ[0], 0.7, 0.4);\n    }\n  });\n  add(SK, MAN, 3, 7, MAN + 13, 22, 1, 0.6);\n  for (const y of [MAN + 2.5, MAN + 7.5])\n    add(2.6, y, 22, 5.6, y + 3, 26, 1.2, 0.4);\n\n  /** The lit flow: s along the pipe, then u of the way up radiator 1's tail once the water is there. */\n  const water = (s: number, u: number) => {\n    const out: Vec2[] = [];\n    let i = 0;\n    for (; i < flow.length && L[i]! <= s; i++) out.push(P(...flow[i]!));\n    const [a, b] = [flow[i - 1], flow[i]];\n    if (a && b) {\n      const f = (s - L[i - 1]!) / (L[i]! - L[i - 1]!);\n      out.push(P(...(a.map((v, k) => lerp(v, b[k]!, f)) as Vec3)));\n    }\n    const top = lerp(ZF, VZ, u);\n    const tail = s >= J1 - 0.5 && u > 0.01;\n    return open(out) + (tail ? line([OFF, N1.f, ZF], [OFF, N1.f, top]) : \"\");\n  };\n\n  const B = register(stage, (_dt, now) => {\n    draw(lit, water(tval(run, now), tval(up, now)));\n    let moving = !tdone(run, now) || !tdone(up, now);\n    for (const r of rads) {\n      const n = Math.round(tval(r.tw, now) * r.c.length);\n      draw(r.warm, r.c.slice(0, n).join(\"\"));\n      draw(r.cool, r.c.slice(n).join(\"\"));\n      if (!tdone(r.tw, now)) moving = true;\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  let over = -1;\n  let dur = value;\n  /** Radiator k: the near one's tail fills after the run comes back; the far one's columns warm after the run arrives. */\n  const aim = (k: number, now: number) => {\n    for (const tw of [run, up, ...rads.map((r) => r.tw)]) tw.dur = dur;\n    tset(up, k ? 0 : 1, now, k ? 0 : dur * 0.6);\n    tset(run, k ? L[L.length - 1]! : J1, now, k ? 0 : 120);\n    rads.forEach((r, i) => {\n      tset(r.tw, i === k ? 1 : 0, now, i === k ? dur * 0.9 : 0);\n    });\n  };\n  aim(0, -1e9);\n  const choose = (a: number) => {\n    if (a === over) return;\n    over = a;\n    aim(Math.max(0, a), performance.now());\n    read.textContent = a < 0 ? \"rest\" : `radiator ${a + 1}`;\n    B.wake();\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [y, zb] = onWall(P, [RX[1], 0, 0], [0, 1], p);\n        const [x, za] = onWall(P, [0, RX[1], 0], [1, 0], p);\n        const k = y > RX[1] ? 0 : 1;\n        const [s, z] = k ? [x, za] : [y, zb];\n        const r = RADS[k]!;\n        choose(s > r.a - 14 && s < r.b + 14 && z > -8 && z < H ? k : -1);\n      },\n      leave: () => choose(-1),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      dur = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"The corner of a room with a radiator on each wall and a pair of heating pipes running along the skirting from a manifold to both. Pointing at a radiator runs warm water along the flow pipe to it.\",\n  range: [1100, 700, 450],\n  probe: [280, 138],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  corners,\n  fit,\n  hull,\n  open,\n  poly,\n  proj,\n  seg,\n  unproj,\n  type Vec2,\n} from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { eyeOf, type Frame, inFrame } from \"./_timber\";\nimport { shift } from \"./_walls\";\n\n/**\n * Design and professional services: a drawing sheet lying flat with a house\n * plan on it, a set square in its margin and a rolled drawing beside it. The\n * walls of the plan are the gaps between its rooms, each room a thin plate;\n * door swings and windows are marked. The room under the pointer lifts off\n * the sheet, bright. At rest the living room stands a little proud. The\n * slider is the lift height.\n *\n * The pattern: one of many, as the suspended floor. A tween per room; the\n * pick reads the sheet's top plane, which never moves.\n */\n\nconst X = 158;\nconst Y = 114;\nconst ST = 1.2;\nconst PT = ST + 0.7;\n/** The rooms, behind before in front: (x0, y0) to (x1, y1), the walls the gaps between them. */\nconst ROOMS = [\n  [15, 15, 48, 46],\n  [15, 48, 48, 87],\n  [50, 15, 62, 87],\n  [64, 15, 109, 60],\n] as const;\nconst LIVING = 3;\n/** Segments as x0, y0, x1, y1. The walls' outer face, an L broken at the front door, and its jambs. */\nconst OUTER = [\n  61, 90, 65, 90, 65, 90, 65, 63, 65, 63, 112, 63, 112, 63, 112, 12, 112, 12,\n  12, 12, 12, 12, 12, 90, 12, 90, 51, 90, 51, 87, 51, 90, 61, 87, 61, 90,\n];\n/** The windows, a sill and two jambs each across the wall. */\nconst WINDOWS = [\n  22, 88.5, 40, 88.5, 22, 87, 22, 90, 40, 87, 40, 90, 80, 61.5, 100, 61.5, 80,\n  60, 80, 63, 100, 60, 100, 63, 110.5, 24, 110.5, 50, 109, 24, 112, 24, 109, 50,\n  112, 50,\n];\n/** The sheet's border is drawn apart; this is its title block. */\nconst TITLE = [\n  118, 92, 153, 92, 118, 92, 118, 109, 118, 101, 153, 101, 138, 101, 138, 109,\n];\nconst ROLL = { x: X + 11, y0: 6, y1: 98, r: 6 };\nconst LMAX = 16;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let LIFT = value;\n  const C = Cam(45, 0.5, 1.5);\n  fit(C, [\n    ...corners(0, 0, 0, ROLL.x + ROLL.r, Y, 2 * ROLL.r),\n    ...corners(15, 15, 0, 109, 87, PT + LMAX),\n  ]);\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n  const lines = (s: readonly number[], z = ST) => {\n    let d = \"\";\n    for (let i = 0; i < s.length; i += 4)\n      d += seg(P(s[i]!, s[i + 1]!, z), P(s[i + 2]!, s[i + 3]!, z));\n    return d;\n  };\n  const rect = (x0: number, y0: number, x1: number, y1: number) =>\n    poly([P(x0, y0, ST), P(x1, y0, ST), P(x1, y1, ST), P(x0, y1, ST)]);\n\n  // the sheet, its border and title block\n  put(solid(g), { sil: box(C, P, 0, 0, 0, X, Y, ST, 0.8).sil, crease: \"\" });\n  path(g, \"nf lo\", rect(5, 5, X - 5, Y - 5) + lines(TITLE));\n\n  // the walls' outer face, broken at the front door; the windows across them\n  path(g, \"nf sil\", lines(OUTER));\n  path(g, \"nf\", lines(WINDOWS));\n\n  // the rooms: a footprint left on the sheet, and a plate that lifts off it\n  const rooms = ROOMS.map(([x0, y0, x1, y1], i) => {\n    path(g, \"nf lo dash\", rect(x0, y0, x1, y1));\n    const rg = mk(\"g\", {}, g);\n    const s = solid(rg);\n    put(s, { sil: box(C, P, x0, y0, ST, x1, y1, PT, 0.4).sil, crease: \"\" });\n    return { i, rg, s, tw: tween(0), drawn: Number.NaN };\n  });\n  /** A door on a room: its leaf from the hinge (x, y) along a, its swing round to b. */\n  const door = (room: number, x: number, y: number, a: Vec2, b: Vec2) => {\n    const sw: Vec2[] = [];\n    for (let k = 0; k <= 15; k++) {\n      const [c, s] = [Math.cos(k * 0.1047), Math.sin(k * 0.1047)];\n      sw.push(P(x + a[0] * c + b[0] * s, y + a[1] * c + b[1] * s, PT));\n    }\n    const rg = rooms[room]!.rg;\n    path(rg, \"nf\", seg(P(x, y, PT), P(x + a[0], y + a[1], PT)));\n    path(rg, \"nf lo\", open(sw));\n  };\n  door(2, 51, 87, [0, -10], [10, 0]);\n  door(LIVING, 64, 50, [10, 0], [0, -10]);\n\n  // the set square in the margin: a triangle plate with a triangle cut out\n  const tri = (a: number, z: number): Vec2[] => [\n    P(121 + a, 12 + a * 0.6, z),\n    P(150 - a * 2.2, 12 + a * 0.6, z),\n    P(121 + a, 60 - a * 3.4, z),\n  ];\n  solid(g).sil.setAttribute(\"d\", poly(hull([...tri(0, ST), ...tri(0, 2.6)])));\n  path(g, \"nf\", poly(tri(6, 2.6)));\n\n  // the rolled drawing beside the sheet, its near end wound\n  const roll = solid(g);\n  const F: Frame = {\n    o: [ROLL.x, 0, ROLL.r],\n    u: [1, 0, 0],\n    v: [0, 0, 1],\n    w: [0, 1, 0],\n  };\n  const [r0, r1] = [circ(ROLL.r, 48), circ(ROLL.r - 0.8, 48)];\n  put(roll, inFrame(P, eyeOf(P), F, r0, r1, ROLL.y0, ROLL.y1));\n  const coil = Array.from({ length: 121 }, (_, k) => {\n    const rho = 1.2 + k * 0.0317;\n    const th = -Math.PI / 2 - (120 - k) * 0.1309;\n    return P(ROLL.x + rho * Math.cos(th), ROLL.y1, ROLL.r + rho * Math.sin(th));\n  });\n  path(roll.g, \"nf lo\", open(coil));\n\n  let act: number | null = null;\n  const retarget = () => {\n    const a = act ?? LIVING;\n    const now = performance.now();\n    for (const r of rooms) {\n      const on = r.i === a;\n      tset(r.tw, on ? (act === null ? LIFT * 0.4 : LIFT) : 0, now, on ? 60 : 0);\n      r.s.sil.classList.toggle(\"hi\", on);\n    }\n    read.textContent = act === null ? \"rest\" : `room ${act + 1}`;\n    B.wake();\n  };\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const r of rooms) {\n      const v = tval(r.tw, now);\n      if (!tdone(r.tw, now)) moving = true;\n      if (v === r.drawn) continue;\n      r.drawn = v;\n      r.rg.setAttribute(\"transform\", shift(P, 0, 0, v));\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n  retarget();\n  for (const r of rooms) r.tw.t0 = -1e9;\n  B.wake();\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, y] = unproj(C, p[0], p[1], PT);\n        const k = ROOMS.findIndex(\n          (r) => x > r[0] - 1 && x < r[2] + 1 && y > r[1] - 1 && y < r[3] + 1,\n        );\n        if ((k < 0 ? null : k) === act) return;\n        act = k < 0 ? null : k;\n        retarget();\n      },\n      leave: () => {\n        act = null;\n        retarget();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      LIFT = v;\n      retarget();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A drawing sheet lying flat with a house plan on it, a set square in its margin and a rolled drawing beside it. The room under the pointer lifts off the plan.\",\n  range: [6, 10, LMAX],\n  probe: [168, 128],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  open,\n  proj,\n  type Vec2,\n} from \"../core/iso\";\nimport { reducedMotion, type Spring, spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  type Solid,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\n\n/**\n * Heating: a column radiator on its two feet, standing off a slice of wall on\n * the floor, its sections joined by their hubs into a top and a bottom\n * header, with a valve and its pipe at the near foot. The column nearest the\n * pointer and its neighbours give off rising wisps of warm air, falling off\n * with distance; the nearest column's outline is the bright line. At rest one\n * column breathes a couple of wisps.\n *\n * The pattern: a field, as Terrain, in one dimension. Each column's warmth is\n * a spring; the wisps rise on their own while any column is warm, and fade by\n * shortening. The hit test is on the radiator's face plane, which never moves.\n */\n\nconst N = 12;\nconst PITCH = 10;\nconst GAP = 1.1;\nconst D = 9;\nconst FT = 7;\nconst HUB = 7;\nconst TOP = FT + 44;\nconst L = N * PITCH;\nconst WALL = { x0: -9, x1: -3, z1: TOP + 27 };\nconst RISE = 22;\nconst LEN = 15;\nconst REST = 3;\nconst rest = (j: number) => (j === REST ? 0.85 : j === REST + 1 ? 0.3 : 0);\n/** Warmth by distance in columns, as a share of the reach: smooth to nothing at the edge. */\nconst falloff = (t: number) => (t >= 1 ? 0 : (1 - t) ** 2 * (1 + 2 * t));\n\n/** A box's corners, then its corner radius and bevel. */\ntype Box = [number, number, number, number, number, number, number?, number?];\n\n/** Column j, counted from the near (left) end. */\nconst y0 = (j: number) => L - (j + 1) * PITCH;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let R = value;\n  const C = Cam(45, 0.5, 1.92);\n  fit(\n    C,\n    corners(WALL.x0, -8, -3, D + 12, L + 12, WALL.z1).concat([\n      [D / 2, y0(N - 1), TOP + 3 + RISE + LEN],\n    ]),\n  );\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n  const add = (...b: Box) => {\n    const s = solid(g);\n    put(s, box(C, P, ...b));\n    return s;\n  };\n\n  add(WALL.x0, -8, -3, D + 12, L + 12, 0, 2, 1.2);\n  add(WALL.x0, -8, 0, WALL.x1, L + 12, WALL.z1, 1.6, 1);\n\n  // sections back to front: foot, bottom hub, column, top hub\n  const cols: Array<{ parts: Solid[]; s: Spring }> = [];\n  for (let j = N - 1; j >= 0; j--) {\n    const a = y0(j);\n    const b = a + PITCH;\n    if (j === 1 || j === N - 2) add(1.5, a + 2.5, 0, D - 1.5, b - 2.5, FT);\n    const parts = [\n      add(0, a, FT, D, b, FT + HUB, 2.6, 0.8),\n      add(0.6, a + GAP, FT + HUB, D - 0.6, b - GAP, TOP - HUB, 3, 0.6),\n      add(0, a, TOP - HUB, D, b, TOP, 2.6, 0.8),\n    ];\n    cols[j] = { parts, s: spring(rest(j), { eps: 0.004 }) };\n  }\n\n  // the valve at the near foot: a stub out of the end hub, the pipe down, its body and head\n  const vx = D / 2;\n  const vz = FT + HUB / 2;\n  for (const b of [\n    [vx - 1.6, L, vz - 1.6, vx + 1.6, L + 4, vz + 1.6, 1.5, 0.5],\n    [vx - 1.4, L + 5.2, 0, vx + 1.4, L + 8, vz - 2, 1.3, 0.5],\n    [vx - 2.6, L + 4, vz - 3, vx + 2.6, L + 9.4, vz + 2.6, 1.4, 0.6],\n    [vx - 2.2, L + 4.4, vz + 2.6, vx + 2.2, L + 9, vz + 10, 2.1, 0.6],\n  ] as Box[])\n    add(...b);\n\n  const wisps = path(g, \"nf\");\n  let time = 0;\n  const light = (a: number) =>\n    cols.forEach((c, j) => {\n      for (const p of c.parts) p.sil.classList.toggle(\"hi\", j === a);\n    });\n  light(REST);\n\n  /** A wisp: a short wavy line above column j, phase p from leaving the lid to gone. */\n  const wisp = (j: number, p: number, s: number, k: number) => {\n    const len = LEN * s * Math.min(1, p * 6) * (1 - p);\n    if (len < 0.8) return \"\";\n    const zb = TOP + 3 + p * RISE;\n    const o = (k - 1) * 2.2;\n    const seed = j * 1.7 + k * 2.1;\n    const yc = y0(j) + PITCH / 2;\n    const pts: Vec2[] = [];\n    for (let k = 0; k <= 6; k++) {\n      const z = zb + (len * k) / 6;\n      const w = o + 1.3 * Math.sin(z * 0.36 + seed - time * 2.2);\n      pts.push(P(vx + w / 2, yc - w / 2, z));\n    }\n    return open(pts);\n  };\n\n  const tick = (dt: number) => {\n    let moving = false;\n    for (const c of cols) if (stepS(c.s, dt)) moving = true;\n    const still = reducedMotion();\n    if (!still) time += dt;\n    let d = \"\";\n    let warm = false;\n    cols.forEach((c, j) => {\n      if (c.s.x < 0.02) return;\n      warm = true;\n      for (let k = 0; k < 3; k++) {\n        const p = (time * 0.3 + j * 0.37 + k * 0.38) % 1;\n        d += wisp(j, p, c.s.x, k);\n      }\n    });\n    draw(wisps, d);\n    return moving || (warm && !still);\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  let over: number | null = null;\n  const retarget = () => {\n    cols.forEach((c, j) => {\n      c.s.t = over === null ? rest(j) : falloff(Math.abs(j - over) / R);\n    });\n    const a = over === null ? REST : Math.round(over);\n    light(a);\n    read.textContent =\n      over === null ? \"rest\" : `col ${String(a + 1).padStart(2, \"0\")}`;\n    B.wake();\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [y, z] = onWall(P, [D, 0, 0], [0, 1], p);\n        const u = (L - y) / PITCH - 0.5;\n        const inside = z > -30 && z < TOP + 50 && u > -2 && u < N + 1;\n        over = inside ? clamp(u, 0, N - 1) : null;\n        retarget();\n      },\n      leave: () => {\n        over = null;\n        retarget();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      R = v;\n      if (over !== null) retarget();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A column radiator on its feet against a wall, with a valve at one foot. Warm air rises in wisps from the column nearest the pointer and, more faintly, from its neighbours.\",\n  range: [1.2, 2.5, 4.5],\n  probe: [200, 170],\n  engine,\n};\n", "import { Cam, corners, fit, onWall, poly, proj, seg } from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, perpendsX } from \"../kit\";\n\n/**\n * Scaffolding and general building works: the front of a two-storey house,\n * eaves along its top and a window on each floor, with a scaffold standing\n * in front of it. Standards rise in two rows, ledgers run along them at each\n * lift and transoms cross between them; two braces run up the face, and each\n * lift is boarded out with a toe board along its front. A gin wheel hangs off\n * the end, its bucket on the rope. The pointer's height picks the lift: that\n * deck takes the bright edge and the bucket is hauled to it. At rest the top\n * lift is bright and the bucket is up there with it.\n *\n * The pattern: one of many, picked on the plane of the outer standards, which\n * never moves. The highlight swaps; the bucket rides a tween.\n */\n\nconst L = 150;\nconst H = 72;\nconst WT = 12;\nconst STD = [50, 83, 116, 148];\nconst X0 = 46;\nconst X1 = 152;\nconst YI = 17;\nconst YO = 30;\nconst YB = YI - 1;\nconst YF = YO - 0.5;\nconst LIFTS = [20, 40, 60];\nconst DT = 1.6;\nconst TOP = 75;\n/** Where each board row along the deck is butted, front to back. */\nconst BUTTS = [[78, 128], [102], [66, 136]];\nconst WX = L + 12;\nconst WZ = 84;\nconst BX = WX - 2.4;\nconst REST = LIFTS.length - 1;\ntype Vec3 = [number, number, number];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.75);\n  fit(C, [\n    ...corners(-4, -4, -3, L + 20, YO + 6, 0),\n    ...corners(-3, -4, H, L + 3, WT + 4, H + 4),\n    ...corners(L, YO, WZ + 4, WX + 3, YO, WZ + 4),\n  ]);\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n  const tube = (a: Vec3, b: Vec3) => seg(P(...a), P(...b));\n\n  // the ground, the house wall with its eaves, coursed on its end\n  put(solid(g), box(C, P, -4, -4, -3, L + 20, YO + 6, 0, 3, 1.6));\n  put(solid(g), box(C, P, 0, 0, 0, L, WT, H));\n  path(\n    g,\n    \"nf lo\",\n    coursesX(P, L, 1, WT - 1, 0, H, 6) + perpendsX(P, L, 0, WT, 0, H, 6, 6),\n  );\n  // a window on each floor, clear of the scaffold: frame, mullion, sill\n  for (const z0 of [12, 46]) {\n    const ring = (e: number) =>\n      poly(\n        [10 + e, 36 - e, 36 - e, 10 + e].map((x, i) =>\n          P(x, WT, i < 2 ? z0 + e : z0 + 18 - e),\n        ),\n      );\n    path(g, \"nf\", ring(0) + tube([10, WT, z0 + 18], [10, WT - 3, z0 + 18]));\n    path(g, \"nf lo\", ring(1.8) + tube([23, WT, z0 + 2], [23, WT, z0 + 16]));\n    put(solid(g), box(C, P, 8.5, WT, z0 - 1.6, 37.5, WT + 1.8, z0, 0.4, 0.3));\n  }\n  put(solid(g), box(C, P, -3, -4, H, L + 3, WT + 4, H + 4, 0.8, 0.5));\n\n  // sole boards; the inner row (standards, ledgers, transoms) goes behind\n  for (const x of STD)\n    put(solid(g), box(C, P, x - 3, YI - 3, 0, x + 3, YO + 3, 1.2, 0.4, 0.3));\n  let inner = \"\";\n  let rails = \"\";\n  let outer = \"\";\n  for (const x of STD) {\n    inner += tube([x, YI, 1.2], [x, YI, TOP]);\n    outer += tube([x, YO, 1.2], [x, YO, x === 148 ? WZ + 4 : TOP]);\n  }\n  for (const z of LIFTS) {\n    inner += tube([X0, YI, z - 1], [X1, YI, z - 1]);\n    for (const x of STD)\n      inner += tube([x, YI - 2, z - 0.4], [x, YO + 2, z - 0.4]);\n    rails += tube([X0, YO, z - 1], [X1, YO, z - 1]);\n    rails += tube([X0, YO, z + 10], [X1, YO, z + 10]);\n  }\n  rails +=\n    tube([50, YO, 1.2], [116, YO, 40]) + tube([83, YO, 40], [148, YO, 70]);\n  path(g, \"nf\", inner);\n\n  // the lifts, bottom first: boards with their joints, a toe board in front\n  const decks = LIFTS.map((z) => {\n    const t = z + DT;\n    const s = solid(g);\n    put(s, box(C, P, X0, YB, z, X1, YF, t, 0.5, 0.3));\n    const w = (YF - YB) / BUTTS.length;\n    let d = \"\";\n    BUTTS.forEach((xs, k) => {\n      const y0 = YF - (k + 1) * w;\n      if (k) d += tube([X0 + 1, y0 + w, t], [X1 - 1, y0 + w, t]);\n      for (const x of xs) d += tube([x, y0, t], [x, y0 + w, t]);\n    });\n    path(g, \"nf lo\", d);\n    const toe = solid(g);\n    put(toe, box(C, P, X0, YF - 1.3, t, X1, YF, t + 4, 0.4, 0.3));\n    return [s.sil, toe.sil];\n  });\n\n  // the outer row in front: ledgers, guardrails, braces, standards\n  path(g, \"nf\", rails);\n  path(g, \"nf sil\", outer);\n\n  // the gin wheel off the end standard, its rope, and the bucket on it\n  path(g, \"nf sil\", tube([148, YO, WZ + 3], [WX + 3, YO, WZ + 3]));\n  path(g, \"nf lo\", tube([WX + 2.4, YO, WZ], [WX + 2.4, YO, 0]));\n  const rope = path(g, \"nf\");\n  const bucket = solid(g);\n  place(dot(g, 2.4, \"dot m\"), P(WX, YO, WZ));\n  const tw = tween(LIFTS[REST]!, value);\n\n  let act: number | null = null;\n  const choose = (a: number | null) => {\n    act = a;\n    const lit = a ?? REST;\n    decks.forEach((els, i) => {\n      for (const el of els) el.classList.toggle(\"hi\", i === lit);\n    });\n    tset(tw, LIFTS[lit]!, performance.now(), 0);\n    read.textContent = a === null ? \"rest\" : `lift ${a + 1}`;\n    B.wake();\n  };\n\n  let drawn = Number.NaN;\n  const B = register(stage, (_dt, now) => {\n    const z = tval(tw, now) + DT + 1;\n    if (z !== drawn) {\n      drawn = z;\n      put(\n        bucket,\n        box(C, P, BX - 4.5, YO - 4.5, z, BX + 4.5, YO + 4.5, z + 7.5, 2.2, 1.2),\n      );\n      draw(rope, tube([BX, YO, WZ], [BX, YO, z + 7.5]));\n    }\n    return !tdone(tw, now);\n  });\n  bag.add(B.unregister);\n  choose(null);\n  tw.t0 = -1e9;\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, z] = onWall(P, [0, YO, 0], [1, 0], p);\n        if (x < -12 || x > L + 20 || z < -6 || z > H + 12) return;\n        const a = Math.min(REST, Math.max(0, Math.round((z - 20) / 20)));\n        if (a !== act) choose(a);\n      },\n      leave: () => choose(null),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      tw.dur = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A scaffold in front of a two-storey house wall: standards, ledgers and transoms with two braces, three boarded lifts with toe boards, and a gin wheel with a bucket at the end. Moving up and down the scaffold picks a lift, and the bucket is hauled to it.\",\n  range: [1000, 700, 450],\n  probe: [220, 220],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  poly,\n  proj,\n  type Vec2,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport {\n  drawLeaf,\n  glass,\n  holed,\n  type Line,\n  leaf,\n  rr,\n  type UV,\n} from \"./_openings\";\n\n/**\n * Secondary glazing: a slice of wall with its window reveal. The primary\n * window sits set back toward the outside; a secondary unit is fitted on the\n * room side, two sashes on a top and bottom track. The pointer's position\n * across the window slides the near sash over the far one on a spring,\n * opening a gap down the left jamb that shows the primary behind and the\n * depth between the two layers. At rest it stands a little open, the sliding\n * sash bright. The slider is how far it can travel.\n *\n * The pattern: scrub. One spring for the slide, read on the plane of the\n * secondary frame's face, which never moves. Paint goes far to near: the\n * primary, the sill track, the far sash, the near sash, the head track; then\n * the wall's face, lid and end close back over whatever sits deep in the\n * reveal, and the window board stands proud in front.\n */\n\nconst HOLE = { x0: 11, x1: 81, z0: 7, z1: 47 };\nconst W = 92;\nconst H = 54;\nconst D = 20;\nconst HW = HOLE.x1 - HOLE.x0;\nconst HH = HOLE.z1 - HOLE.z0;\nconst YP = [2, 5] as const;\nconst YS = [11, 17] as const;\nconst TR = 2.2;\nconst T = 1.4;\nconst YF = YS[0] + 1 + T;\nconst YN = YF + 0.8 + T;\nconst OV = 4;\nconst SW = (HW - 2 * TR) / 2 + OV / 2;\nconst SH = HH - 2 * TR;\nconst RUN = SW - OV;\nconst REST = 0.42;\n\nconst pull = (u: number): Line => ({\n  pts: [\n    [u, SH * 0.42],\n    [u, SH * 0.42, 1],\n    [u, SH * 0.58, 1],\n    [u, SH * 0.58],\n  ] as UV[],\n  open: true,\n});\nconst sash = (far: boolean) => ({\n  lo: glass(3, 3, SW - 3, SH - 3, far),\n  mid: [rr(3, 3, SW - 3, SH - 3, 0.6), pull(far ? 1.5 : SW - 1.5)],\n});\nconst NEAR = sash(false);\nconst PANE = (v0: number, v1: number) => [\n  rr(3, v0, HW - 3, v1, 0.5),\n  ...glass(3, v0, HW - 3, v1, true).slice(1),\n];\nconst PRIMARY = [...PANE(3, HH / 2 - 1), ...PANE(HH / 2 + 1, HH - 3)];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.8);\n  fit(C, corners(0, 0, 0, W, D, H));\n  const P = proj(C);\n  let max = value;\n  const slide = spring(REST, { eps: 0.002 });\n  const at = (x: number, y: number, z: number) => ({\n    facing: true,\n    p: (u: number, v: number, w = 0): Vec2 => P(x + u, y - w, z + v),\n  });\n  const zb = HOLE.z0 + TR;\n  const xl = HOLE.x0 + TR;\n\n  const g = mk(\"g\", {}, svg);\n  holed(C, P, g, [0, 0, 0, W, D, H], HOLE);\n\n  // the primary window, set back: a sash window, its meeting rail across\n  drawLeaf(\n    leaf(g),\n    at(HOLE.x0, YP[1], HOLE.z0),\n    rr(0, 0, HW, HH, 0.4),\n    YP[1] - YP[0],\n    { lo: PRIMARY.filter((l) => l.open), mid: PRIMARY.filter((l) => !l.open) },\n  );\n\n  // the secondary frame's sill track and near rail, then its two sashes\n  const rail = (x0: number, x1: number, z0: number, z1: number) =>\n    put(solid(g), box(C, P, x0, YS[0], z0, x1, YS[1], z1, 0.5, 0.4));\n  rail(HOLE.x0, HOLE.x1, HOLE.z0, zb);\n  rail(HOLE.x0, xl, zb, HOLE.z1 - TR);\n  const edge = rr(0, 0, SW, SH, 0.8);\n  drawLeaf(leaf(g), at(HOLE.x1 - TR - SW, YF, zb), edge, T, sash(true));\n  const near = leaf(g);\n  near.face.classList.add(\"hi\");\n  rail(HOLE.x0, HOLE.x1, HOLE.z1 - TR, HOLE.z1);\n  rail(HOLE.x1 - TR, HOLE.x1, zb, HOLE.z1 - TR);\n  // the reveal runs deep, so the lid and the end close back over it too\n  const wall = box(C, P, 0, 0, 0, W, D, H, 1.2, 1.2);\n  const hole = poly(\n    (\n      [\n        [HOLE.x0, HOLE.z0],\n        [HOLE.x1, HOLE.z0],\n        [HOLE.x1, HOLE.z1],\n        [HOLE.x0, HOLE.z1],\n      ] as Vec2[]\n    ).map((q) => P(q[0], D, q[1])),\n  );\n  path(g, \"fo\", wall.sil + hole);\n  path(g, \"sil nf\", wall.sil);\n  path(g, \"nf lo\", wall.crease);\n  path(g, \"nf\", hole);\n  // the window board, proud of the room face\n  const [bx0, bx1, bz] = [HOLE.x0 - 3, HOLE.x1 + 3, HOLE.z0];\n  put(solid(g), box(C, P, bx0, D, bz - 1.8, bx1, D + 3, bz, 0.8, 0.6));\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const moving = stepS(slide, dt);\n    if (slide.x !== drawn) {\n      drawn = slide.x;\n      drawLeaf(near, at(xl + slide.x * RUN, YN, zb), edge, T, NEAR);\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  let over = -1;\n  const aim = () => {\n    slide.t = over < 0 ? REST : over * max;\n    read.textContent = over < 0 ? \"rest\" : `open ${Math.round(slide.t * 100)}%`;\n    B.wake();\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [a] = onWall(P, [0, YS[1], 0], [1, 0], p);\n        over = clamp((a - xl - 4) / RUN, 0, 1);\n        aim();\n      },\n      leave: () => {\n        over = -1;\n        aim();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      max = v;\n      aim();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A window reveal with the primary window set back and a sliding secondary unit fitted on the room side. Moving across the window slides one sash over the other, opening a gap onto the primary behind.\",\n  range: [0.55, 0.8, 1],\n  probe: [180, 170],\n  engine,\n};\n", "import { Cam, clamp, fit, proj, rad, seg, type Vec3 } from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { plate, slope, tiles, world } from \"./_roof\";\n\n/**\n * Solar PV: two framed modules on rails on a tiled roof slope, cells ruled\n * on their glass. The pointer is the sun: a dot on a dim dashed day arc over\n * the roof follows the pointer's x on a spring, and the read-out is the\n * honest share of peak output, the cosine of the angle between the sun and\n * the modules' normal on an equinox day in London. The sun is the bright mark.\n *\n * The pattern: scrub. One spring for the hour, read from the pointer's x\n * against the arc's two fixed ends.\n */\n\nconst PITCH = 35;\nconst LAT = 51.5;\nconst U = 150;\nconst V = 92;\nconst MODS = [\n  [20, 73],\n  [77, 130],\n] as const;\nconst MV = [12, 84] as const;\nconst COLS = 6;\nconst ROWS = 10;\nconst R = 84;\nconst TOP = 5;\nconst REST = 58;\nconst LO = 14;\nconst HI = 166;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 1.55);\n  const W = world(PITCH);\n  const AC = W(U / 2, V, 0);\n  const arc = (t: number): Vec3 => [\n    AC[0],\n    AC[1] + R * Math.cos(rad(t)),\n    AC[2] + R * 0.72 * Math.sin(rad(t)),\n  ];\n  const pts: Vec3[] = [W(0, 0, -3), W(U, 0, -3), W(0, V, 0), W(U, V, 0)];\n  for (let t = 0; t <= 180; t += 10) pts.push(arc(t));\n  fit(C, pts, 200, 164);\n  const P = proj(C);\n  const S = slope(P, PITCH);\n  const sun = spring(REST, { k: value });\n\n  const g = mk(\"g\", {}, svg);\n  let d = \"\";\n  for (let t = 0; t < 180; t += 4) d += seg(P(...arc(t)), P(...arc(t + 2)));\n  path(g, \"nf lo\", d);\n\n  put(solid(g), plate(S, 0, 0, U, V, -3, 0, 2, 1));\n  path(g, \"nf lo\", tiles(S, 1, U - 1, 0, V, 15.4, 26));\n\n  for (const [u0, u1] of MODS) {\n    put(solid(g), plate(S, u0, MV[0], u1, MV[1], 2, TOP, 1.4, 1.2));\n    const a0 = u0 + 2.2;\n    const a1 = u1 - 2.2;\n    const b0 = MV[0] + 2.2;\n    const b1 = MV[1] - 2.2;\n    let cells = \"\";\n    for (let i = 1; i < COLS; i++) {\n      const u = a0 + ((a1 - a0) * i) / COLS;\n      cells += seg(S(u, b0, TOP), S(u, b1, TOP));\n    }\n    for (let j = 1; j < ROWS; j++) {\n      const v = b0 + ((b1 - b0) * j) / ROWS;\n      cells += seg(S(a0, v, TOP), S(a1, v, TOP));\n    }\n    path(g, \"nf lo\", cells);\n  }\n\n  const mid = S((MODS[0][0] + MODS[1][1]) / 2, (MV[0] + MV[1]) / 2, TOP);\n  const ray = path(g, \"nf dash\");\n  const disc = dot(g, 4.2);\n\n  // the modules' normal, and the equinox sun at hour angle h\n  const p = rad(PITCH);\n  const n: Vec3 = [Math.sin(p), 0, Math.cos(p)];\n  const share = (t: number) => {\n    const h = rad(t - 90);\n    const l = rad(LAT);\n    const s: Vec3 = [\n      Math.sin(l) * Math.cos(h),\n      -Math.sin(h),\n      Math.cos(l) * Math.cos(h),\n    ];\n    return Math.max(0, s[0] * n[0] + s[1] * n[1] + s[2] * n[2]);\n  };\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const moving = stepS(sun, dt);\n    if (sun.x !== drawn) {\n      drawn = sun.x;\n      const q = P(...arc(sun.x));\n      place(disc, q);\n      draw(ray, seg(q, mid));\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  // the arc's screen x is linear in cos t between its two fixed ends\n  const east = P(...arc(0))[0];\n  const west = P(...arc(180))[0];\n  bag.add(\n    pointer(stage, {\n      move: ([x]) => {\n        const c = clamp((2 * x - east - west) / (east - west), -1, 1);\n        sun.t = clamp((Math.acos(c) * 180) / Math.PI, LO, HI);\n        read.textContent = `${Math.round(share(sun.t) * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        sun.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      sun.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"Two solar panels on a tiled roof slope, with the sun on its arc above them. Moving across the figure moves the sun and shows the share of the panels' peak output.\",\n  range: [40, 100, 220],\n  probe: [250, 120],\n  engine,\n};\n", "import { Cam, fit, hull, poly, proj, seg, type Vec2 } from \"../core/iso\";\nimport { type Tween, tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { onSlope, plate, slope, tiles, world } from \"./_roof\";\n\n/**\n * Solar thermal: a bank of evacuated tubes on a tiled roof slope, each\n * running up into the header manifold across the top and resting on a rail\n * at the bottom. Inside each tube is its absorber. The tube under the pointer\n * heats: its absorber line rises up it and goes bright, its neighbours rise\n * less the further away they are, each starting 40ms later per tube. At rest\n * tube 07 is hot, bright.\n *\n * The pattern: pick, then spread. A tween per tube, staggered by distance;\n * the hit test is on the plane of the tubes' axes, which never moves.\n */\n\nconst PITCH = 35;\nconst U = 150;\nconst V = 92;\nconst N = 14;\nconst U0 = 28;\nconst GAP = 7.4;\nconst TR = 2;\nconst HC = 3.2;\nconst VB = 10;\nconst VT = 74;\nconst MAN = [VT, VT + 7] as const;\nconst REST = 6;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let reach = value;\n  const C = Cam(45, 0.5, 1.7);\n  const W = world(PITCH);\n  fit(C, [W(0, 0, -3), W(U, 0, -3), W(0, V, 0), W(U, V, 0)], 200, 166);\n  const P = proj(C);\n  const S = slope(P, PITCH);\n  const uc = (i: number) => U0 + i * GAP;\n  // a glass tube: round in section, domed at its foot, into the manifold at its head\n  const tube = (u: number) => {\n    const pts: Vec2[] = [];\n    for (let k = 0; k < 16; k++) {\n      const a = (k / 16) * Math.PI * 2;\n      const [cu, ch] = [Math.cos(a) * TR, HC + Math.sin(a) * TR];\n      pts.push(S(u + cu, VT + 3, ch));\n      for (const b of [0, 0.5, 1, 1.4])\n        pts.push(\n          S(\n            u + cu * Math.cos(b),\n            VB + TR * (1 - Math.sin(b)),\n            HC + (ch - HC) * Math.cos(b),\n          ),\n        );\n    }\n    return poly(hull(pts));\n  };\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), plate(S, 0, 0, U, V, -3, 0, 2, 1));\n  path(g, \"nf lo\", tiles(S, 1, U - 1, 0, V, 15.4, 26));\n  const a0 = uc(0) - 5;\n  const a1 = uc(N - 1) + 5;\n  put(solid(g), plate(S, a0, VB + 3, a1, VB + 8, 0, HC - TR, 1, 0.6));\n\n  // back to front: the far end of the bank first\n  const tubes: Array<{ line: SVGPathElement; tw: Tween }> = [];\n  for (let i = N - 1; i >= 0; i--) {\n    const u = uc(i);\n    path(g, \"sil\", tube(u));\n    tubes[i] = { line: path(g, \"nf\"), tw: tween(0) };\n  }\n  put(solid(g), plate(S, a0 - 2, MAN[0], a1 + 2, MAN[1], 0, 10, 2, 1.2));\n\n  const heat = (i: number, a: number, r: number) =>\n    i === a ? 1 : Math.max(0.12, 1 - Math.abs(i - a) / (r + 1));\n  let lit = REST;\n  const aim = (a: number, r: number, now: number) => {\n    tubes.forEach((t, i) => {\n      tset(t.tw, heat(i, a, r), now, Math.abs(i - a) * 40);\n    });\n    tubes[lit]?.line.setAttribute(\"class\", \"nf\");\n    lit = a;\n    tubes[a]?.line.setAttribute(\"class\", \"nf hi\");\n  };\n  aim(REST, 2, -1e9);\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    tubes.forEach((t, i) => {\n      const f = tval(t.tw, now);\n      const u = uc(i);\n      draw(t.line, seg(S(u, VB + 3, HC), S(u, VB + 3 + f * (VT - VB - 3), HC)));\n      if (!tdone(t.tw, now)) moving = true;\n    });\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  let over = -1;\n  const choose = (a: number) => {\n    if (a === over) return;\n    over = a;\n    const now = performance.now();\n    if (a < 0) {\n      aim(REST, 2, now);\n      read.textContent = \"rest\";\n    } else {\n      aim(a, reach, now);\n      read.textContent = `tube ${String(a + 1).padStart(2, \"0\")}`;\n    }\n    B.wake();\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [u, v] = onSlope(S, HC, p);\n        const i = Math.round((u - U0) / GAP);\n        const inside = v > VB - 6 && v < MAN[1] + 4 && i >= -1 && i <= N;\n        choose(inside ? Math.max(0, Math.min(N - 1, i)) : -1);\n      },\n      leave: () => choose(-1),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      reach = v;\n      if (over >= 0) {\n        aim(over, reach, performance.now());\n        B.wake();\n      }\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A bank of evacuated solar tubes on a tiled roof slope, running up into a header manifold. Moving along the tubes heats the one under the pointer and, less, its neighbours.\",\n  range: [1.5, 3, 6],\n  probe: [230, 170],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, proj, seg } from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { shift } from \"./_walls\";\n\n/**\n * Solid floor insulation: a floor build-up against a short brick wall. The\n * concrete slab, the insulation boards, the screed and the timber finish\n * step back from the front so each shows its edge. The pointer's x lifts the\n * layers apart, each gap the same; its height picks the layer that is bright.\n * At rest the stack stands a little open and the insulation is bright.\n *\n * The pattern: scrub and pick, as Exploded. Layers are drawn once and lift by\n * their group's transform; the pick tests each layer's centre in the target\n * pose, which depends only on the pointer, never on the spring.\n */\n\nconst W = 9;\nconst H = 72;\n/** The layers, slab first: name, bottom and top (z), and the front corner (x1, y1). */\nconst LAYERS = [\n  { name: \"slab\", z0: 0, z1: 9, x1: 104, y1: 92 },\n  { name: \"insulation\", z0: 9, z1: 21, x1: 98, y1: 86 },\n  { name: \"screed\", z0: 21, z1: 26, x1: 93, y1: 81 },\n  { name: \"floor\", z0: 26, z1: 29, x1: 87, y1: 75 },\n] as const;\nconst INSULATION = 1;\nconst REST = 0.22;\nconst GMAX = 17;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let GAP = value;\n  const e = spring(REST);\n  const C = Cam(45, 0.5, 1.8);\n  const top = LAYERS[3];\n  fit(C, [\n    ...corners(0, 0, 0, LAYERS[0].x1, LAYERS[0].y1, H),\n    ...corners(W, 0, 0, top.x1, top.y1, top.z1 + 3 * GMAX),\n  ]);\n  const P = proj(C);\n  const root = mk(\"g\", {}, svg);\n\n  // the wall: a brick upstand behind the floor, coursed on its face and its end\n  const Y = LAYERS[0].y1;\n  put(solid(root), box(C, P, 0, 0, 0, W, Y, H, 1.2, 0.7));\n  path(\n    root,\n    \"nf lo\",\n    coursesX(P, W, 1, Y - 1, 0, H, 6) +\n      perpendsX(P, W, 0, Y, 0, H, 6, 18) +\n      coursesY(P, Y, 1, W - 1, 0, H, 6) +\n      perpendsY(P, Y, 0, W, 0, H, 6, 9),\n  );\n\n  const els = LAYERS.map((ly) => {\n    const g = mk(\"g\", {}, root);\n    const s = solid(g);\n    put(s, box(C, P, W, 0, ly.z0, ly.x1, ly.y1, ly.z1, 1.2, 0.7));\n    return { g, s, marks: path(g, \"nf lo\") };\n  });\n  const [slab, boards, , floor] = els;\n\n  // the slab: aggregate in the concrete, scattered on both faces that show\n  const sl = LAYERS[0];\n  for (let i = 0; i < 26; i++) {\n    const a = (i * 0.618) % 1;\n    const z = 1.6 + ((i * 0.382 + 0.17) % 1) * (sl.z1 - 3.2);\n    const q =\n      i % 2\n        ? P(W + 3 + a * (sl.x1 - W - 6), sl.y1, z)\n        : P(sl.x1, 3 + a * (sl.y1 - 6), z);\n    place(dot(slab!.g, 0.7, \"dot off\"), q);\n  }\n  // the insulation: boards butted every 24, joints down both faces\n  const bd = LAYERS[1];\n  let d = \"\";\n  for (let x = W + 24; x < bd.x1 - 4; x += 24)\n    d += seg(P(x, bd.y1, bd.z0), P(x, bd.y1, bd.z1));\n  for (let y = 20; y < bd.y1 - 4; y += 24)\n    d += seg(P(bd.x1, y, bd.z0), P(bd.x1, y, bd.z1));\n  boards!.marks.setAttribute(\"d\", d);\n  // the floor: timber boards along x, butt joints broken from row to row\n  const fl = LAYERS[3];\n  d = \"\";\n  for (let y = 7, row = 0; y < fl.y1 - 2; y += 7, row++) {\n    d += seg(P(W + 1, y, fl.z1), P(fl.x1 - 1, y, fl.z1));\n    const at = W + 12 + ((row * 23) % 46);\n    if (at < fl.x1 - 6) d += seg(P(at, y - 7, fl.z1), P(at, y, fl.z1));\n  }\n  for (let y = 7; y < fl.y1 - 2; y += 7)\n    d += seg(P(fl.x1, y, fl.z0 + 0.6), P(fl.x1, y, fl.z1 - 0.6));\n  floor!.marks.setAttribute(\"d\", d);\n\n  const light = (a: number) => {\n    const lit = a >= 0 ? a : INSULATION;\n    els.forEach((E, i) => E.s.sil.classList.toggle(\"hi\", i === lit));\n  };\n  light(-1);\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const m = stepS(e, dt);\n    if (e.x !== drawn) {\n      drawn = e.x;\n      els.forEach((E, i) =>\n        E.g.setAttribute(\"transform\", shift(P, 0, 0, i * GAP * e.x)),\n      );\n    }\n    return m;\n  });\n  bag.add(B.unregister);\n\n  /** The layer whose centre, where the layers are going, is nearest the pointer's height. */\n  const pick = (p: [number, number]) => {\n    let best = 0;\n    let gap = Number.POSITIVE_INFINITY;\n    LAYERS.forEach((ly, i) => {\n      const z = (ly.z0 + ly.z1) / 2 + i * GAP * e.t;\n      const c = P((W + ly.x1) / 2, ly.y1 / 2, z)[1];\n      if (Math.abs(p[1] - c) < gap) {\n        gap = Math.abs(p[1] - c);\n        best = i;\n      }\n    });\n    return best;\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        e.t = REST + (1 - REST) * clamp((p[0] - 90) / 220, 0, 1);\n        const act = pick(p);\n        light(act);\n        read.textContent = LAYERS[act]!.name;\n        B.wake();\n      },\n      leave: () => {\n        e.t = REST;\n        light(-1);\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      GAP = v;\n      drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A solid floor against a brick wall: concrete slab, insulation boards, screed and a timber finish, stepped back at the front. Moving across the floor lifts the layers apart; the height of the pointer picks the layer that lights up.\",\n  range: [9, 13, GMAX],\n  probe: [300, 135],\n  engine,\n};\n", "import { Cam, corners, fit, proj, seg, unproj, type Vec2 } from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { shift } from \"./_walls\";\n\n/**\n * Suspended floor insulation: a timber floor against a brick wall, over a\n * void. The joists bear on a wall plate on a sleeper wall; insulation batts\n * are slung between them, a little below their tops. A deck of floorboards\n * lies across the joists, butted edge to edge, but near the front it stops\n * short so the batts show. The board under the pointer lifts, its neighbours\n * less the further they are, the lift spreading from it. At rest the front\n * full board stands a little proud, bright. The slider is the lift height.\n *\n * The pattern: one of many, as the flat roof. A tween per board, staggered by\n * distance; the pick reads the deck's rest top plane, which never moves.\n */\n\nconst X = 140;\nconst Y = 104;\nconst BW = 12;\n/** Each board's length, back to front: the front two are cut back. */\nconst LEN = [X, X, X, X, X, 104, 56];\nconst BT = 3;\nconst JOISTS = [8, 46, 84, 122];\nconst JW = 6;\nconst JH = 16;\nconst PL = 3;\nconst VOID = 12;\nconst SLAB = 6;\nconst BASE = -JH - PL - VOID;\nconst SLEEPER = { y0: 40, y1: 49 };\nconst WALL = { t: 10, h: 48 };\nconst LMAX = 22;\nconst REST = 4;\n/** The share of the lift a board takes, d boards from the chosen one. */\nconst fall = (d: number) => [1, 0.4, 0.12][d] ?? 0;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let LIFT = value;\n  const C = Cam(45, 0.5, 1.5);\n  fit(C, [\n    ...corners(-WALL.t, 0, BASE - SLAB, X + 3, Y + 3, WALL.h),\n    ...corners(0, 0, 0, X, LEN.length * BW, BT + LMAX),\n  ]);\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n\n  // the wall behind and the oversite concrete\n  put(solid(g), box(C, P, -WALL.t, 0, BASE - SLAB, 0, Y, WALL.h, 1, 0.6));\n  path(\n    g,\n    \"nf lo\",\n    coursesY(P, Y, -WALL.t + 1, -1, BASE - SLAB, WALL.h, 7) +\n      perpendsY(P, Y, -WALL.t, 0, BASE - SLAB, WALL.h, 7, 10),\n  );\n  put(solid(g), box(C, P, 0, 0, BASE - SLAB, X + 3, Y + 3, BASE, 1.6, 1));\n\n  // the sleeper wall, coursed on its cut end, and the wall plate along it\n  const { y0: s0, y1: s1 } = SLEEPER;\n  put(solid(g), box(C, P, 0, s0, BASE, X, s1, -JH - PL, 0.8, 0.5));\n  path(\n    g,\n    \"nf lo\",\n    coursesX(P, X, s0 + 1, s1 - 1, BASE, -JH - PL, 4) +\n      perpendsX(P, X, s0, s1, BASE, -JH - PL, 4, 6),\n  );\n  put(solid(g), box(C, P, 0, s0 - 1, -JH - PL, X, s1 + 1, -JH, 0.5, 0.4));\n\n  // joists and the batts between them: soft, lower, with the quilt's weave\n  const batt = (x0: number, x1: number) => {\n    const zt = -4;\n    const zb = -JH + 1;\n    put(solid(g), box(C, P, x0 + 0.4, 0, zb, x1 - 0.4, Y - 1.5, zt, 2.4, 1.2));\n    const mid = (x0 + x1) / 2;\n    const top: Vec2[] = [];\n    for (let y = 2; y < Y - 3; y += 1.5)\n      top.push(P(mid + 0.18 * (x1 - x0) * Math.sin(y * 0.7), y, zt));\n    const face: Vec2[] = [];\n    for (let x = x0 + 2.5; x < x1 - 2; x += 0.6)\n      face.push(P(x, Y - 1.5, (zt + zb) / 2 + 3.6 * Math.sin((x - x0) * 0.75)));\n    path(g, \"nf lo\", `M${top.join(\"L\")}M${face.join(\"L\")}`);\n  };\n  let x0 = 0;\n  for (const x of JOISTS) {\n    if (x > x0) batt(x0, x);\n    put(solid(g), box(C, P, x, 0, -JH, x + JW, Y, 0, 0.5, 0.4));\n    x0 = x + JW;\n  }\n  batt(x0, X);\n\n  // the deck: boards butted edge to edge, joints dim, the deck's edge not\n  const boards = LEN.map((len, k) => {\n    const y0 = k * BW;\n    const y1 = y0 + BW;\n    const bg = mk(\"g\", {}, g);\n    const s = solid(bg);\n    put(s, box(C, P, 0, y0, 0, len, y1, BT, 0.5, 0.3));\n    const next = LEN[k + 1] ?? 0;\n    let d =\n      seg(P(len, y0, BT), P(len, y1, BT)) +\n      seg(P(len, y0, 0), P(len, y1, 0)) +\n      seg(P(0, y0, BT), P(0, y1, BT)) +\n      seg(P(next, y1, BT), P(len, y1, BT)) +\n      seg(P(next, y1, 0), P(len, y1, 0));\n    if (k === 0) d += seg(P(0, 0, BT), P(len, 0, BT));\n    const rim = path(bg, \"nf sil\", d);\n    return { k, bg, s, rim, tw: tween(0), drawn: Number.NaN };\n  });\n\n  let act: number | null = null;\n  const retarget = () => {\n    const a = act ?? REST;\n    const now = performance.now();\n    for (const b of boards) {\n      const d = Math.abs(b.k - a);\n      const to = act === null ? (d === 0 ? LIFT * 0.4 : 0) : LIFT * fall(d);\n      tset(b.tw, to, now, d * 45);\n      b.s.sil.classList.toggle(\"hi\", d === 0);\n      b.rim.classList.toggle(\"hi\", d === 0);\n      b.s.sil.classList.toggle(\"lo\", to < 3);\n    }\n    read.textContent = act === null ? \"rest\" : `board ${act + 1}`;\n    B.wake();\n  };\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const b of boards) {\n      const v = tval(b.tw, now);\n      if (!tdone(b.tw, now)) moving = true;\n      if (v === b.drawn) continue;\n      b.drawn = v;\n      b.bg.setAttribute(\"transform\", shift(P, 0, 0, v));\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n  retarget();\n  for (const b of boards) b.tw.t0 = -1e9;\n  B.wake();\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, y] = unproj(C, p[0], p[1], BT);\n        const k = Math.floor(y / BW);\n        const len = LEN[k];\n        const next =\n          len !== undefined && y >= 0 && x > -4 && x < len + 4 ? k : null;\n        if (next === act) return;\n        act = next;\n        retarget();\n      },\n      leave: () => {\n        act = null;\n        retarget();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      LIFT = v;\n      retarget();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A timber floor against a brick wall: floorboards laid across joists that bear on a sleeper wall, insulation batts slung between the joists, and the void below. The deck stops short at the front to show the batts; the board under the pointer lifts, its neighbours a little less.\",\n  range: [10, 16, LMAX],\n  probe: [226, 170],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, proj, type Ring, seg } from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { at, eyeOf, type Frame, inFrame, onPlane } from \"./_timber\";\nimport { shift } from \"./_walls\";\n\n/**\n * Thatched roof insulation: a 45\u00B0 roof cut at its gable, on a brick wall each\n * side. Each pitch is rafters, insulation board, battens and a thick reed coat\n * with a rounded eaves, the coats meeting under a ridge roll, each layer\n * stepped back at the cut. The pointer up and down the near pitch lifts the\n * course under it straight up, so the board shows beneath. The board is the\n * bright mark; at rest the middle course stands part lifted. The slider is\n * the lift height.\n *\n * The pattern: scrub. A spring for where on the slope and one for how much,\n * read on the plane of the coat's rest top, which never moves.\n */\n\nconst c = Math.SQRT1_2;\nconst [V, U] = [64, 100];\n/** Rafter width and depth, board thickness. */\nconst [RW, RD, BT] = [4, 6, 3.5];\nconst T0 = RD + BT + 2;\nconst T1 = T0 + 17;\n/** How far the coat overhangs the eaves, and the radius of its nose. */\nconst [EAV, NOSE] = [9, 8];\nconst TOP = V + (T0 + T1) / 2;\nconst CUT = { board: 3, batten: 6, thatch: 9 };\nconst N = 3;\nconst BAND = V / N;\nconst RUN = 2 * V * c;\nconst WALL = { t: 8, h: 16 };\nconst RR = 6.5;\nconst REST = { i: 1, amt: 0.6 };\n\n/** A pitch with its eaves at x: u up the rafters, v out of the roof, w along the ridge. */\nconst pitch = (x: number, s: number): Frame => ({\n  o: [x, 0, 0],\n  u: [-s * c, 0, c],\n  v: [s * c, 0, c],\n  w: [0, -1, 0],\n});\nconst NEAR = pitch(0, 1);\nconst FAR = pitch(-RUN, -1);\nconst RIDGE: Frame = {\n  ...NEAR,\n  o: [-V * c, 0, (V + 2 * T1) * c - RR * 0.7],\n  u: [1, 0, 0],\n  v: [0, 0, 1],\n};\n\nconst lo = (i: number) => (i === 0 ? -EAV : i * BAND);\nconst hi = (i: number) => (i === N - 1 ? TOP : (i + 1) * BAND);\nconst mid = (i: number) => (lo(i) + hi(i)) / 2;\nconst hash = (n: number) => Math.abs(Math.sin(n * 12.9898) * 437.5) % 1;\n\ntype Sec = readonly [number, number, number, number];\ntype Rad = Sec | number;\n\n/** A section a0..a1 by b0..b1, inset by e, with a radius per corner: top back, top front (the nose), bottom front, bottom back. */\nfunction section([a0, a1, b0, b1]: Sec, r: Rad, e = 0): Ring {\n  const out: Ring = [];\n  for (let k = 0; k < 4; k++) {\n    const rr = Math.max(0.3, (typeof r === \"number\" ? r : r[k]!) - e);\n    const ca = k === 1 || k === 2 ? a0 + e + rr : a1 - e - rr;\n    const cb = k < 2 ? b1 - e - rr : b0 + e + rr;\n    for (let j = 0; j <= 5; j++) {\n      const t = (Math.PI * (5 * k + j)) / 10;\n      const [nu, nv] = [Math.cos(t), Math.sin(t)];\n      out.push({ u: ca + rr * nu, v: cb + rr * nv, nu, nv });\n    }\n  }\n  return out;\n}\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let LIFT = value;\n  const C = Cam(45, 0.5, 1.6);\n  const pts = corners(-RUN, -U, -WALL.h, 0, 0, 0);\n  for (const F of [NEAR, FAR]) pts.push(at(F, -EAV, T1, 0), at(F, -EAV, T1, U));\n  pts.push(at(RIDGE, 0, RR + 26, 0));\n  fit(C, pts);\n  const P = proj(C);\n  const eye = eyeOf(P);\n  const Q = (F: Frame, a: number, b: number, u: number) => P(...at(F, a, b, u));\n  /** A layer of a pitch, in section, run along the ridge from u0 to u1. */\n  const slab = (el: Element, F: Frame, s: Sec, r: Rad, u0: number, u1 = U) => {\n    const sl = solid(el);\n    put(sl, inFrame(P, eye, F, section(s, r), section(s, r, 0.8), u0, u1));\n    return sl;\n  };\n  /** Reeds cut through on the gable, laid up the pitch. */\n  const reeds = (F: Frame, a0: number, a1: number, nose: number) => {\n    let d = \"\";\n    for (let b = T0 + 2.5, row = 0; b < T1 - 1.5; b += 2.8, row++) {\n      const from = a0 + (b > T1 - nose ? nose * 0.7 : 2) + (row % 2) * 2.5;\n      for (let a = from; a < a1 - 4; a += 5.5)\n        d += seg(Q(F, a, b, CUT.thatch), Q(F, a + 3, b, CUT.thatch));\n    }\n    return d;\n  };\n\n  const g = mk(\"g\", {}, svg);\n  const wall = (x: number) => {\n    const x1 = x + WALL.t;\n    put(solid(g), box(C, P, x, -U, -WALL.h, x1, 0, 0, 1, 0.6));\n    let d = coursesY(P, 0, x + 1, x1 - 1, -WALL.h, 0, 4);\n    d += perpendsY(P, 0, x, x1, -WALL.h, 0, 4, 8);\n    d += coursesX(P, x1, -U + 1, -1, -WALL.h, 0, 4);\n    d += perpendsX(P, x1, -U, 0, -WALL.h, 0, 4, 12);\n    path(g, \"nf lo\", d);\n  };\n\n  // the far pitch: its coat shows only on the gable and against the sky\n  wall(-RUN);\n  slab(g, FAR, [-2, V, 0, RD], 0.6, 0, RW);\n  slab(g, FAR, [-1, V, RD, RD + BT], 0.6, CUT.board);\n  slab(g, FAR, [-EAV, TOP, T0, T1], [1.2, NOSE, 3, 1.2], CUT.thatch);\n  path(g, \"nf lo\", reeds(FAR, -EAV, TOP, NOSE));\n\n  // the near pitch: rafters back to front, the board over them, then battens\n  wall(-WALL.t);\n  for (let u = U - RW; u >= 0; u -= 24)\n    slab(g, NEAR, [-2, V, 0, RD], 0.6, u, u + RW);\n  slab(g, NEAR, [-2, V, RD, RD + BT], 0.6, CUT.board).sil.classList.add(\"hi\");\n  for (let a = V - 5; a > 0; a -= 11)\n    slab(g, NEAR, [a, a + 2.5, RD + BT, T0], 0.4, CUT.batten);\n\n  // the near coat in courses, top first, each in a group of its own so it lifts\n  const courses: Array<{ g: SVGGElement; i: number; drawn: number }> = [];\n  for (let i = N - 1; i >= 0; i--) {\n    const cg = mk(\"g\", {}, g);\n    const nose = i ? 1.4 : NOSE;\n    const sec: Sec = [lo(i), hi(i), T0, T1];\n    slab(cg, NEAR, sec, i ? nose : [1.2, NOSE, 3, 1.2], CUT.thatch);\n    let d = reeds(NEAR, lo(i), hi(i), nose);\n    for (let a = lo(i) + nose * 0.6 + 1, row = 0; a < hi(i) - 5; a += 6, row++)\n      for (let u = CUT.thatch + 2 + (row % 2) * 1.7; u < U - 2; u += 3.4) {\n        const l = 3 + 2.5 * hash(u * 7 + a * 13);\n        d += seg(Q(NEAR, a, T1, u), Q(NEAR, a + l, T1, u));\n      }\n    if (i === N - 1) {\n      // the ridge roll over both coats, bound along its length\n      slab(cg, RIDGE, [-RR, RR, -RR, RR], RR, CUT.thatch - 2, U + 1);\n      const tie = (k: number, u: number) => Q(RIDGE, k * RR, RR * 0.84, u);\n      for (const k of [-0.55, 0.55])\n        d += seg(tie(k, CUT.thatch - 1), tie(k, U));\n    }\n    path(cg, \"nf lo\", d);\n    courses.push({ g: cg, i, drawn: Number.NaN });\n  }\n\n  const [where, amt] = [spring(mid(REST.i)), spring(REST.amt)];\n  const B = register(stage, (dt) => {\n    const moving = [stepS(where, dt), stepS(amt, dt)].includes(true);\n    for (const k of courses) {\n      const d = (mid(k.i) - where.x) / BAND;\n      const z = amt.x * LIFT * Math.exp(-3 * d * d);\n      if (Math.abs(z - k.drawn) < 0.01) continue;\n      k.drawn = z;\n      k.g.setAttribute(\"transform\", shift(P, 0, 0, z));\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  const aim = (t: number, a: number, text: string) => {\n    where.t = t;\n    amt.t = a;\n    read.textContent = text;\n    B.wake();\n  };\n  const plane = at(NEAR, 0, T1, 0);\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [a, u] = onPlane(P, plane, NEAR.u, NEAR.w, p);\n        if (u < -20 || u > U + 20) return;\n        // the top course stays under the ridge roll\n        const t = clamp(a, mid(0), mid(N - 2) + BAND * 0.3);\n        aim(t, 1, `course ${t < (mid(0) + mid(1)) / 2 ? 1 : 2}`);\n      },\n      leave: () => aim(mid(REST.i), REST.amt, \"rest\"),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      LIFT = v;\n      for (const k of courses) k.drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A thatched roof cut at its gable, on a brick wall each side: rafters, insulation board over them, battens, and a thick reed coat with a rounded eaves under a ridge roll. Moving up and down the near pitch lifts a course of thatch to show the board beneath.\",\n  range: [12, 18, 24],\n  probe: [250, 158],\n  engine,\n};\n", "import {\n  Cam,\n  clamp,\n  corners,\n  fillet,\n  fit,\n  open,\n  proj,\n  unproj,\n  type Vec2,\n} from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\n\n/**\n * Underfloor heating: an insulation board with one pipe laid on it in a\n * counter-flow coil, spiralling in from the inlet, turning in the middle and\n * spiralling back out between its own turns. Floorboards are laid over the\n * back of it, ends staggered. The pointer's place on the coil lights the pipe\n * from the inlet to there: warm water run in. At rest it has run round the\n * first corner, and the lit run is the one bright mark.\n *\n * The pattern: scrub along a path. One spring for the run, aimed by the\n * nearest point of the pipe to the pointer on the ground plane.\n */\n\nconst X = 110;\nconst Y = 110;\nconst PT = 8;\nconst PZ = PT + 1;\nconst A = 10;\nconst D = 10;\nconst TURNS = 2;\nconst B = A + (4 * TURNS + 1) * D;\nconst BW = 13;\nconst BOARDS = [Y, 0.66 * Y, 0.38 * Y];\nconst REST = 0.24;\n\n/** The coil in its own (u, v) square, inlet first; both tails leave at v = 0. */\nfunction coil(): Vec2[] {\n  const sq = (a: number, b: number): Vec2[] => {\n    const out: Vec2[] = [];\n    for (let t = 0, o = 0; t < TURNS; t++, o += 2 * D)\n      out.push([a + o, a + o], [a + o, b - o], [b - o, b - o]);\n    return out.flatMap((p, i) =>\n      i % 3 === 2 ? [p, [p[0], a + 2 * D * Math.floor(i / 3) + 2 * D]] : [p],\n    );\n  };\n  const inward = sq(A, B);\n  const back = sq(A + D, B - D).reverse();\n  const mid = A + 2 * D * TURNS;\n  return [[A, 0], ...inward, [mid, mid], [mid, mid + D], ...back, [A + D, 0]];\n}\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2);\n  fit(C, corners(0, 0, 0, X, Y, PT + 5));\n  const P = proj(C);\n\n  // the coil on the ground, its tails out through the front corner\n  const raw = coil().map(([u, v]): Vec2 => [X - v, Y - u]);\n  const pts = fillet(\n    raw,\n    raw.map((_, i) => (i === 0 || i === raw.length - 1 ? 0 : D / 2)),\n  );\n  const len = [0];\n  for (let i = 1; i < pts.length; i++) {\n    const a = pts[i - 1]!;\n    const b = pts[i]!;\n    len.push(len[i - 1]! + Math.hypot(b[0] - a[0], b[1] - a[1]));\n  }\n  const total = len[len.length - 1]!;\n  const scr = pts.map((q) => P(q[0], q[1], PZ));\n  const run = spring(REST * total, { k: value, eps: 0.3 });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, 0, 0, 0, X, Y, PT, 2, 1.2));\n  path(g, \"nf\", open(scr));\n  const lit = path(g, \"nf hi\");\n  // floorboards over the back, laid along x, their ends staggered\n  BOARDS.forEach((l, k) => {\n    put(solid(g), box(C, P, 0, k * BW, PT + 2, l, (k + 1) * BW - 0.5, PT + 5));\n  });\n\n  let drawn = Number.NaN;\n  const B2 = register(stage, (dt) => {\n    const moving = stepS(run, dt);\n    if (run.x === drawn) return moving;\n    drawn = run.x;\n    const s = clamp(run.x, 0, total);\n    const out: Vec2[] = [];\n    let i = 0;\n    for (; i < pts.length && len[i]! <= s; i++) out.push(scr[i]!);\n    const a = pts[i - 1];\n    const b = pts[i];\n    if (a && b) {\n      const f = (s - len[i - 1]!) / (len[i]! - len[i - 1]!);\n      out.push(P(a[0] + (b[0] - a[0]) * f, a[1] + (b[1] - a[1]) * f, PZ));\n    }\n    draw(lit, open(out));\n    return moving;\n  });\n  bag.add(B2.unregister);\n\n  /** How far along the pipe its nearest point to (x, y) lies. */\n  const along = (x: number, y: number) => {\n    let best = Number.POSITIVE_INFINITY;\n    let at = 0;\n    for (let i = 1; i < pts.length; i++) {\n      const [ax, ay] = pts[i - 1]!;\n      const [bx, by] = pts[i]!;\n      const l2 = (bx - ax) ** 2 + (by - ay) ** 2 || 1;\n      const f = clamp(((x - ax) * (bx - ax) + (y - ay) * (by - ay)) / l2, 0, 1);\n      const d = Math.hypot(ax + (bx - ax) * f - x, ay + (by - ay) * f - y);\n      if (d < best) {\n        best = d;\n        at = len[i - 1]! + f * Math.sqrt(l2);\n      }\n    }\n    return at;\n  };\n\n  const rest = () => {\n    run.t = REST * total;\n    read.textContent = \"rest\";\n    B2.wake();\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, y] = unproj(C, p[0], p[1], PZ);\n        if (x < -8 || x > X + 8 || y < -8 || y > Y + 8) return rest();\n        run.t = Math.max(along(x, y), 6);\n        read.textContent = `run ${(run.t / 100).toFixed(1)}m`;\n        B2.wake();\n      },\n      leave: rest,\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      run.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"An insulation board with one heating pipe laid on it in a coil, floorboards laid over part of it. Moving over the coil lights the pipe from the inlet to there, as warm water runs in.\",\n  range: [40, 100, 220],\n  probe: [200, 168],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  fit,\n  onWall,\n  open,\n  proj,\n  rrect,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesY } from \"../kit\";\nimport { type Blades, bar, blades, circle, on } from \"./_fans\";\n\n/**\n * Ventilation: a square extract fan on a slice of tiled wall, a rounded\n * square housing with a round opening, curved blades and a domed hub. The\n * blades turn slowly on their own; the pointer's nearness boosts the fan on a\n * spring, and the swirl of air it moves draws further out of the opening the\n * faster it turns. The opening's rim is the bright mark.\n *\n * The pattern: ambient motion whose rate the pointer changes, as the heat pump,\n * but the answer is shown twice: in the blades and in the air. The hit test is\n * on the housing's front plane, which never moves.\n */\n\nconst W = 132;\nconst H = 82;\nconst T = 8;\nconst FC: Vec3 = [W / 2 + 6, 0, H / 2 + 1];\nconst HS = 29;\nconst DEPTH = 9;\nconst R = 21;\nconst BL: Blades = { n: 7, r0: 6, r1: R - 1.5, sweep: 1.0, w0: 0.3, w1: 0.55 };\nconst W0 = 0.7;\nconst AIR = [150, 195, 240, 285].map((d) => (d * Math.PI) / 180);\nconst LONG = 46;\nconst TILE = 16.5;\nconst X: Vec3 = [1, 0, 0];\nconst Y: Vec3 = [0, 1, 0];\nconst Z: Vec3 = [0, 0, 1];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let boost = value;\n  const C = Cam(45, 0.5, 2);\n  const far = DEPTH + LONG;\n  fit(C, [\n    ...corners(0, -T, 0, W, 0, H),\n    [FC[0] - R - 10, far, FC[2] - R - 10],\n    [FC[0] - R, far, FC[2] + R],\n  ]);\n  const P = proj(C);\n  const rate = spring(1, { k: 9, c: 6, eps: 0.002 });\n  let phase = 0.4;\n\n  const g = mk(\"g\", {}, svg);\n  // the wall: a slab faced in square tiles\n  put(solid(g), box(C, P, 0, -T, 0, W, 0, H, 2, 0.8));\n  let tiles = \"\";\n  for (let x = TILE; x < W - 2; x += TILE)\n    tiles += seg(P(x, 0, 1), P(x, 0, H - 1));\n  path(g, \"nf lo\", coursesY(P, 0, 1, W - 1, 0, H, TILE) + tiles);\n\n  // the housing: a rounded square standing off the wall\n  const sq = (h: number, r: number) => rrect(-h, -h, h, h, r, 6);\n  put(solid(g), bar(P, FC, Y, X, Z, sq(HS, 10), sq(HS - 1.6, 8.4), 0, DEPTH));\n  const face = on(P, [FC[0], DEPTH, FC[2]], X, Z);\n\n  // the opening: a bright rim, the recess behind it, blades and a domed hub\n  path(g, \"nf hi\", circle(face, R + 1.5, 72));\n  path(g, \"nf lo\", circle(on(P, [FC[0], DEPTH - 2.5, FC[2]], X, Z), R, 72));\n  const bl = path(g, \"nf\");\n  const turn = on(P, [FC[0], DEPTH - 1.5, FC[2]], X, Z);\n  put(\n    solid(g),\n    bar(P, FC, Y, X, Z, circ(6.5, 32), circ(5, 32), DEPTH - 2, DEPTH + 2.5),\n  );\n\n  // the air it moves: a swirl out of the opening, longer the faster it turns\n  const air = path(g, \"nf\");\n  const swirl = (len: number) => {\n    let d = \"\";\n    for (const a0 of AIR) {\n      const pts: Vec2[] = [];\n      for (let k = 0; k <= 16; k++) {\n        const t = k / 16;\n        const r = R - 4 + t * 14;\n        const a = a0 - t * (0.5 + 0.25 * rate.x);\n        pts.push(\n          P(\n            FC[0] + r * Math.cos(a),\n            DEPTH - 1 + t * len,\n            FC[2] + r * Math.sin(a),\n          ),\n        );\n      }\n      d += open(pts);\n    }\n    return d;\n  };\n  const length = () => clamp(10 + (LONG - 10) * ((rate.x - 1) / 3), 6, LONG);\n\n  let drawn = \"\";\n  const paint = () => {\n    const key = `${phase}:${rate.x}`;\n    if (key === drawn) return;\n    drawn = key;\n    draw(bl, blades(turn, BL, phase));\n    draw(air, swirl(length()));\n  };\n  const tick = (dt: number) => {\n    const moving = stepS(rate, dt);\n    if (!reducedMotion()) phase = (phase + dt * W0 * rate.x) % (Math.PI * 2);\n    paint();\n    return !reducedMotion() || moving;\n  };\n  paint();\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [u, v] = onWall(P, [FC[0], DEPTH, FC[2]], [1, 0], p);\n        const d = Math.hypot(u, v);\n        const t = clamp(1 - (d - HS * 0.6) / (HS * 2.2), 0, 1);\n        rate.t = 1 + (boost - 1) * t * t * (3 - 2 * t);\n        read.textContent =\n          rate.t > 1.05 ? `boost ${rate.t.toFixed(1)}\u00D7` : \"rest\";\n        B.wake();\n      },\n      leave: () => {\n        rate.t = 1;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      boost = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A square extract fan on a tiled wall: a rounded housing, a round opening, curved blades and a domed hub. The fan turns on its own; bringing the pointer near it boosts it, and the swirl of air it moves reaches further out of the opening.\",\n  range: [1.6, 2.5, 4],\n  probe: [197, 172],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, onWall, proj } from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\n\n/**\n * Cavity wall insulation: a cut-away cavity wall on its footing. The block\n * inner leaf runs furthest, then the cavity's fill of beads, then the brick\n * outer leaf, stepped back so each layer shows at the end. The pointer's\n * height on the wall sets how far the fill has risen up the cavity; the fill's\n * top edge is the bright line. At rest the cavity is three-quarters full.\n *\n * The pattern: scrub. One spring for the fill level, read on the plane of the\n * fill's face, which never moves.\n */\n\nconst H = 75;\nconst COURSE = 7.5;\nconst BRICK = 22.5;\nconst OUT = { x1: 88, y0: 32, y1: 42 };\nconst CAV = { x1: 102, y0: 22, y1: 32 };\nconst INN = { x1: 118, y0: 8, y1: 22 };\nconst REST = 0.74;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.05);\n  fit(C, corners(-6, 2, -5, INN.x1 + 6, OUT.y1 + 6, H));\n  const P = proj(C);\n  const level = spring(REST, { k: value });\n\n  const g = mk(\"g\", {}, svg);\n  put(solid(g), box(C, P, -6, 2, -5, INN.x1 + 6, OUT.y1 + 6, 0, 3, 1.6));\n\n  // the block inner leaf, coursed on its end\n  put(solid(g), box(C, P, 0, INN.y0, 0, INN.x1, INN.y1, H));\n  path(g, \"nf lo\", coursesX(P, INN.x1, INN.y0 + 1, INN.y1 - 1, 0, H, 22.5));\n\n  // the fill: a solid that rises, beads on the faces that show\n  const fill = solid(g);\n  const beads: Array<{ el: SVGEllipseElement; z: number }> = [];\n  const bg = mk(\"g\", {}, g);\n  const bead = (x: number, y: number, z: number) => {\n    const el = dot(bg, 0.55, \"dot off\");\n    place(el, P(x, y, z));\n    beads.push({ el, z });\n  };\n  for (let z = 2, row = 0; z < H - 1; z += 2.6, row++) {\n    const off = (row % 2) * 1.3;\n    for (let x = OUT.x1 + 2.2 + off; x < CAV.x1 - 1.2; x += 2.6)\n      bead(x, CAV.y1, z);\n    for (let y = CAV.y0 + 1.6 + off; y < CAV.y1 - 1.2; y += 2.6)\n      bead(CAV.x1, y, z);\n  }\n  fill.cr.setAttribute(\"class\", \"nf hi\");\n\n  // the brick outer leaf, coursed and bonded on both faces that show\n  put(solid(g), box(C, P, 0, OUT.y0, 0, OUT.x1, OUT.y1, H));\n  path(\n    g,\n    \"nf lo\",\n    coursesY(P, OUT.y1, 1, OUT.x1 - 1, 0, H, COURSE) +\n      perpendsY(P, OUT.y1, 0, OUT.x1, 0, H, COURSE, BRICK) +\n      coursesX(P, OUT.x1, OUT.y0 + 1, OUT.y1 - 1, 0, H, COURSE) +\n      perpendsX(P, OUT.x1, OUT.y0, OUT.y1, 0, H, COURSE, 11.25),\n  );\n\n  let drawn = Number.NaN;\n  const tick = (dt: number) => {\n    const moving = stepS(level, dt);\n    if (level.x !== drawn) {\n      drawn = level.x;\n      const top = Math.max(0.6, level.x * H);\n      put(fill, box(C, P, 0, CAV.y0, 0, CAV.x1, CAV.y1, top, 0.8, 0.6));\n      for (const b of beads) b.el.style.display = b.z < top - 1 ? \"\" : \"none\";\n    }\n    return moving;\n  };\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, z] = onWall(P, [0, CAV.y1, 0], [1, 0], p);\n        if (x < -10 || x > INN.x1 + 10) return;\n        level.t = clamp(z / H, 0.06, 1);\n        read.textContent = `fill ${Math.round(level.t * 100)}%`;\n        B.wake();\n      },\n      leave: () => {\n        level.t = REST;\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      level.k = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A cut-away cavity wall: block inner leaf, a cavity filled with insulation beads, and a brick outer leaf. Moving up and down the wall fills the cavity.\",\n  range: [40, 100, 220],\n  probe: [230, 120],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, proj, seg } from \"../core/iso\";\nimport { spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  dot,\n  type FigureMount,\n  mk,\n  path,\n  place,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { inside, outline, shift } from \"./_walls\";\n\n/**\n * External wall insulation: a block wall with the build-up fixed to its\n * outside, cut back in steps so every layer shows at the end: insulation\n * boards with their joints and fixings, the base coat with its mesh, and the\n * render. The pointer's x peels the layers off the wall along +y, each gap\n * the same; the layer under the pointer takes the bright edge. At rest the\n * build-up stands a little proud of the wall and the boards are bright.\n *\n * The pattern: scrub and pick, as Exploded. Layers are drawn once and move by\n * their group's transform; the pick tests each layer's target pose, outermost\n * first, so it is the layer the pointer will be over once the spring lands.\n */\n\nconst H = 70;\nconst L = 112;\n/** The layers, wall first: name, depth (y0, y1) and where the step ends it (x1). */\nconst LAYERS = [\n  { name: \"wall\", y0: 0, y1: 16, x1: L },\n  { name: \"boards\", y0: 16, y1: 28, x1: 94 },\n  { name: \"mesh\", y0: 28, y1: 30.5, x1: 78 },\n  { name: \"render\", y0: 30.5, y1: 33, x1: 62 },\n] as const;\nconst BOARDS = 1;\nconst REST = 0.24;\nconst GMAX = 22;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let GAP = value;\n  let act = -1;\n  const e = spring(REST);\n  const C = Cam(45, 0.5, 2.0);\n  /** Each layer's offset along y: the stack opens both ways about its middle. */\n  const off = (i: number, g: number) => (i - 1.5) * g;\n  fit(C, [\n    ...corners(0, off(0, GMAX), 0, L, 16 + off(0, GMAX), H),\n    ...corners(0, 30.5 + off(3, GMAX), 0, 62, 33 + off(3, GMAX), H),\n  ]);\n  const P = proj(C);\n  const root = mk(\"g\", {}, svg);\n\n  const els = LAYERS.map((ly) => {\n    const g = mk(\"g\", {}, root);\n    const s = solid(g);\n    put(s, box(C, P, 0, ly.y0, 0, ly.x1, ly.y1, H, 1.2, 0.7));\n    return { g, s, marks: path(g, \"nf lo\") };\n  });\n  const [wall, boards, mesh, render] = els;\n\n  // the wall: blockwork, coursed and bonded on its face and its end\n  wall!.marks.setAttribute(\n    \"d\",\n    coursesY(P, 16, 1, L - 1, 0, H, 10) +\n      perpendsY(P, 16, 0, L, 0, H, 10, 22) +\n      coursesX(P, L, 1, 15, 0, H, 10) +\n      perpendsX(P, L, 0, 16, 0, H, 10, 11),\n  );\n  // the boards: laid broken-bond, a fixing at every joint\n  boards!.marks.setAttribute(\n    \"d\",\n    coursesY(P, 28, 1, 93, 0, H, 17.5) +\n      perpendsY(P, 28, 0, 94, 0, H, 17.5, 35),\n  );\n  for (let row = 0; row < 4; row++)\n    for (let x = row % 2 ? 17.5 : 35; x < 94; x += 35)\n      place(dot(boards!.g, 1.2, \"dot m\"), P(x, 28, 8.75 + row * 17.5));\n  // the base coat: the mesh bedded across it\n  let d = \"\";\n  for (let x = 4; x < 77; x += 4) d += seg(P(x, 30.5, 1), P(x, 30.5, H - 1));\n  for (let z = 4; z < H - 1; z += 4) d += seg(P(1, 30.5, z), P(77, 30.5, z));\n  mesh!.marks.setAttribute(\"d\", d);\n  // the render: a bead along its foot\n  render!.marks.setAttribute(\"d\", seg(P(1, 33, 3), P(61, 33, 3)));\n  render!.marks.setAttribute(\"class\", \"nf\");\n\n  const light = (a: number) => {\n    const lit = a >= 0 ? a : BOARDS;\n    els.forEach((E, i) => E.s.sil.classList.toggle(\"hi\", i === lit));\n  };\n  light(-1);\n\n  let drawn = Number.NaN;\n  const B = register(stage, (dt) => {\n    const m = stepS(e, dt);\n    if (e.x !== drawn) {\n      drawn = e.x;\n      els.forEach((E, i) =>\n        E.g.setAttribute(\"transform\", shift(P, 0, off(i, GAP * e.x), 0)),\n      );\n    }\n    return m;\n  });\n  bag.add(B.unregister);\n\n  /** The layer under the pointer where the layers are going: outermost first. */\n  const pick = (p: [number, number]) => {\n    for (let i = LAYERS.length - 1; i >= 0; i--) {\n      const ly = LAYERS[i]!;\n      const pg = outline(\n        P,\n        [0, ly.y0, 0, ly.x1, ly.y1, H],\n        0,\n        off(i, GAP * e.t),\n        0,\n      );\n      if (inside(p, pg)) return i;\n    }\n    return -1;\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        e.t = REST + (1 - REST) * clamp((p[0] - 70) / 260, 0, 1);\n        act = pick(p);\n        light(act);\n        read.textContent =\n          act >= 0 ? LAYERS[act]!.name : `gap ${Math.round(GAP * e.t)}`;\n        B.wake();\n      },\n      leave: () => {\n        e.t = REST;\n        act = -1;\n        light(-1);\n        read.textContent = \"rest\";\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      GAP = v;\n      drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A block wall with external insulation: boards fixed to its outside, a meshed base coat and a render finish, cut back in steps. Moving across the wall peels the layers away from it; the layer under the pointer lights up.\",\n  range: [8, 15, GMAX],\n  probe: [250, 150],\n  engine,\n};\n", "import { Cam, corners, fit, proj, seg, type Vec2 } from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { inside, outline, shift } from \"./_walls\";\n\n/**\n * Wall insulation, generic: a masonry wall with insulation and a brick finish,\n * cut away as a staircase so every layer shows, as the CGI does. Block at the\n * back, the insulation board in the middle, brick in front, its courses\n * stepping back half a brick at a time. The pointer picks the layer under it\n * and that layer lifts up out of the stack while the others settle. At rest\n * the insulation stands a little proud and bright.\n *\n * The pattern: pick and lift. One tween per layer, staggered out from the one\n * chosen; the pick tests the unlifted stack, which never moves.\n */\n\ntype Bx = readonly [number, number, number, number, number, number];\nconst L = 150;\nconst COURSE = 7;\nconst BRICK = 22.5;\nconst STEP = 15;\nconst BLOCK = { y0: 0, y1: 14, h: 60 };\nconst INS = { y0: 14, y1: 24, h: 46 };\nconst BR = { y0: 24, y1: 34, n: 6 };\nconst NAMES = [\"block\", \"insulation\", \"brick\"];\nconst REST = 1;\nconst PROUD = 0.35;\nconst GMAX = 22;\n\n/** Each layer as the boxes it is built from: the brick is one per course. */\nconst BOXES: Bx[][] = [\n  [[0, BLOCK.y0, 0, L, BLOCK.y1, BLOCK.h]],\n  [[0, INS.y0, 0, L, INS.y1, INS.h]],\n  Array.from({ length: BR.n }, (_, k) => [\n    k * STEP,\n    BR.y0,\n    k * COURSE,\n    L,\n    BR.y1,\n    (k + 1) * COURSE,\n  ]),\n];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let lift = value;\n  let act = -1;\n  const C = Cam(45, 0.5, 1.85);\n  fit(C, corners(0, 0, 0, L, BR.y1, BLOCK.h + GMAX));\n  const P = proj(C);\n  const root = mk(\"g\", {}, svg);\n\n  const layers = BOXES.map((bs, i) => {\n    const g = mk(\"g\", {}, root);\n    const ss = bs.map((b) => {\n      const s = solid(g);\n      put(s, box(C, P, ...b, 1, 0.7));\n      return s;\n    });\n    const tw = tween(i === REST ? PROUD : 0);\n    return { g, ss, marks: path(g, \"nf lo\"), tw, drawn: Number.NaN };\n  });\n  const [block, ins, brick] = layers;\n\n  // the block wall: big blocks, coursed and bonded on its face and its end\n  block!.marks.setAttribute(\n    \"d\",\n    coursesY(P, BLOCK.y1, 1, L - 1, 0, BLOCK.h, 15) +\n      perpendsY(P, BLOCK.y1, 0, L, 0, BLOCK.h, 15, 44) +\n      coursesX(P, L, 1, BLOCK.y1 - 1, 0, BLOCK.h, 15) +\n      perpendsX(P, L, 0, BLOCK.y1, 0, BLOCK.h, 15, 7),\n  );\n  // the insulation: board joints on its face, its two facings on its end\n  ins!.marks.setAttribute(\n    \"d\",\n    perpendsY(P, INS.y1, 0, L, 0, INS.h, INS.h, 60) +\n      seg(P(L, INS.y0 + 1.5, 1), P(L, INS.y0 + 1.5, INS.h - 1)) +\n      seg(P(L, INS.y1 - 1.5, 1), P(L, INS.y1 - 1.5, INS.h - 1)),\n  );\n  // the brick: a perpend every brick, half-bond from the step\n  let d = \"\";\n  for (let k = 0; k < BR.n; k++)\n    d += perpendsY(\n      P,\n      BR.y1,\n      k * STEP,\n      L,\n      k * COURSE,\n      (k + 1) * COURSE,\n      9,\n      BRICK,\n    );\n  brick!.marks.setAttribute(\"d\", d);\n\n  const light = (a: number) => {\n    const lit = a >= 0 ? a : REST;\n    layers.forEach((ly, i) => {\n      for (const s of ly.ss) s.sil.classList.toggle(\"hi\", i === lit);\n    });\n  };\n  light(-1);\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const ly of layers) {\n      const v = tval(ly.tw, now);\n      if (v !== ly.drawn) {\n        ly.drawn = v;\n        ly.g.setAttribute(\"transform\", shift(P, 0, 0, v * lift));\n      }\n      if (!tdone(ly.tw, now)) moving = true;\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  /** The unlifted stack, front first: where each layer stands, on screen. */\n  const rest = BOXES.map((bs) => bs.map((b) => outline(P, b)));\n  const pick = (p: Vec2) => {\n    for (let i = rest.length - 1; i >= 0; i--)\n      if (rest[i]!.some((pg) => inside(p, pg))) return i;\n    return -1;\n  };\n\n  const choose = (a: number) => {\n    if (a === act) return;\n    act = a;\n    const now = performance.now();\n    const from = a >= 0 ? a : REST;\n    layers.forEach((ly, i) => {\n      const to = a >= 0 ? (i === a ? 1 : 0) : i === REST ? PROUD : 0;\n      tset(ly.tw, to, now, Math.abs(i - from) * 45);\n    });\n    light(a);\n    read.textContent = a >= 0 ? NAMES[a]! : \"rest\";\n    B.wake();\n  };\n\n  bag.add(\n    pointer(stage, {\n      move: (p) => choose(pick(p)),\n      leave: () => choose(-1),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      lift = v;\n      for (const ly of layers) ly.drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A cut-away wall: blockwork at the back, an insulation board, and a brick finish stepped down course by course. The layer under the pointer lifts up out of the wall.\",\n  range: [10, 16, GMAX],\n  probe: [250, 200],\n  engine,\n};\n", "import { Cam, clamp, corners, fit, onWall, proj, seg } from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  type Solid,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box, coursesX, coursesY, perpendsX, perpendsY } from \"../kit\";\nimport { shift } from \"./_walls\";\n\n/**\n * Internal wall insulation: a brick wall on its slab with the room's floor\n * in front. On the room side of the brick: battens, insulation between them,\n * and plasterboard sheets on the battens, each with its length of skirting.\n * The lining stops short of the wall's end so every layer shows there. The\n * pointer picks a sheet; it slides out into the room, showing the\n * insulation behind it, whose edge is the bright line, and the sheet it\n * replaces goes back after it, staggered by distance. At rest one sheet\n * stands a little out.\n *\n * The pattern: pick, as Exploded. One tween per sheet; the pick reads the\n * plane of the lining's face at rest, which never moves.\n */\n\nconst H = 58;\nconst L = 120;\nconst N = 5;\n/** A sheet's width; the battens sit under the joints. */\nconst W = 22;\n/** Depths, wall first: brick, insulation and battens' face, plasterboard face. */\nconst BRICK = 12;\nconst BAT = 20;\nconst PB = 22.5;\nconst FLOOR = 60;\nconst REST_A = 1;\nconst REST = 0.6;\nconst GMAX = 32;\n/** How far sheet i comes out, as a share of the slide: all the way if picked, a little at rest. */\nconst reach = (i: number, a: number, rest: boolean) =>\n  i === a ? (rest ? REST : 1) : 0;\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let D = value;\n  const C = Cam(45, 0.5, 2.0);\n  fit(C, corners(0, 0, -8, L, FLOOR, H));\n  const P = proj(C);\n  const g = mk(\"g\", {}, svg);\n  const end = N * W + 1.5;\n\n  // the brick wall, down to the slab's foot, coursed on its end and past the lining\n  put(solid(g), box(C, P, 0, 0, -8, L, BRICK, H));\n  path(\n    g,\n    \"nf lo\",\n    coursesX(P, L, 1, BRICK - 1, -8, H, 7.5) +\n      perpendsX(P, L, 0, BRICK, -8, H, 7.5, 11.25) +\n      coursesY(P, BRICK, end, L - 1, -8, H, 7.5) +\n      perpendsY(P, BRICK, L - 45, L, -8, H, 7.5, 22.5),\n  );\n  // the slab, with the floor laid on it: one line for the floor's thickness, boards on top\n  put(solid(g), box(C, P, 0, BRICK, -8, L, FLOOR, 2, 1.2, 0.6));\n  path(\n    g,\n    \"nf\",\n    seg(P(0.6, FLOOR, 0), P(L, FLOOR, 0)) +\n      seg(P(L, BRICK + 0.6, 0), P(L, FLOOR, 0)),\n  );\n  let d = \"\";\n  for (let y = BRICK + 4; y < FLOOR - 2; y += 6.5)\n    d += seg(P(1, y, 2), P(L - 1, y, 2));\n  path(g, \"nf lo\", d);\n\n  // battens, and between them the insulation, flush, its boards' joints broken\n  const bays: Solid[] = [];\n  for (let i = 0; i <= N; i++) {\n    const x = i * W;\n    const bat = box(C, P, Math.max(0, x - 1.5), BRICK, 2, x + 1.5, BAT, H);\n    put(solid(g), bat);\n    if (i === N) break;\n    const s = solid(g);\n    put(s, box(C, P, x + 1.5, BRICK, 2, x + W - 1.5, BAT, H, 0.8, 0.5));\n    const z = [22, 40, 28, 46, 34][i] ?? 30;\n    path(s.g, \"nf lo\", seg(P(x + 2, BAT, z), P(x + W - 2, BAT, z)));\n    bays.push(s);\n  }\n\n  // the plasterboard: a sheet on each pair of battens, its skirting at its foot\n  const sheets = Array.from({ length: N }, (_, i) => {\n    const sg = mk(\"g\", {}, g);\n    put(solid(sg), box(C, P, i * W, BAT, 2, (i + 1) * W, PB, H, 0.8, 0.5));\n    put(\n      solid(sg),\n      box(C, P, i * W + 0.3, PB, 2, (i + 1) * W - 0.3, PB + 1.2, 6.5, 0.5, 0.3),\n    );\n    return { g: sg, tw: tween(reach(i, REST_A, true)), drawn: Number.NaN };\n  });\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const s of sheets) {\n      const v = tval(s.tw, now) * D;\n      if (v !== s.drawn) {\n        s.drawn = v;\n        s.g.setAttribute(\"transform\", shift(P, 0, v, 0));\n      }\n      if (!tdone(s.tw, now)) moving = true;\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  /** Sheet a comes out, the others go back 40ms later per sheet away; its bay takes the bright. */\n  const choose = (a: number, rest: boolean) => {\n    const now = performance.now();\n    sheets.forEach((s, i) => {\n      tset(s.tw, reach(i, a, rest), now, Math.abs(i - a) * 40);\n    });\n    bays.forEach((b, i) => {\n      b.sil.classList.toggle(\"hi\", i === a);\n      b.cr.setAttribute(\"class\", i === a ? \"nf hi\" : \"nf lo\");\n    });\n    B.wake();\n  };\n  choose(REST_A, true);\n\n  let act = -1;\n  bag.add(\n    pointer(stage, {\n      move: (p) => {\n        const [x, z] = onWall(P, [0, PB, 0], [1, 0], p);\n        if (x < -6 || x > N * W + 6 || z < -30 || z > H + 8) return;\n        const a = clamp(Math.floor(x / W), 0, N - 1);\n        if (a !== act) choose(a, false);\n        act = a;\n        read.textContent = `sheet ${a + 1}`;\n      },\n      leave: () => {\n        act = -1;\n        choose(REST_A, true);\n        read.textContent = \"rest\";\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      D = v;\n      for (const s of sheets) s.drawn = Number.NaN;\n      B.wake();\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A brick wall lined on the room side with battens, insulation between them and plasterboard sheets, the floor in front. Pointing at a sheet slides it out into the room to show the insulation behind it.\",\n  range: [16, 24, GMAX],\n  probe: [230, 170],\n  engine,\n};\n", "import {\n  Cam,\n  circ,\n  clamp,\n  corners,\n  fit,\n  hull,\n  poly,\n  proj,\n  rad,\n  seg,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { reducedMotion, spring, stepS } from \"../core/motion\";\nimport {\n  disposer,\n  draw,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport { bar, circle, on } from \"./_fans\";\n\n/**\n * Small wind turbine: a slim tapered mast on a round footing in a patch of\n * lawn, a nacelle with a tail fin behind, and a three-bladed rotor turned\n * most of the way toward the viewer. The rotor turns slowly on its own; the\n * pointer's x across the figure sets the wind, and the rotor's speed follows\n * it on a soft spring. At rest the hub is the bright mark; under the pointer\n * the bright moves to the circle the blade tips sweep.\n *\n * The pattern: ambient motion whose rate the pointer scrubs. One spring for\n * the wind, read from the pointer's x against two fixed screen ends.\n */\n\nconst HH = 110;\nconst R = 54;\nconst TH = rad(18);\nconst E: Vec3 = [Math.cos(TH), Math.sin(TH), 0];\nconst A: Vec3 = [-Math.sin(TH), Math.cos(TH), 0];\nconst X: Vec3 = [1, 0, 0];\nconst Y: Vec3 = [0, 1, 0];\nconst Z: Vec3 = [0, 0, 1];\nconst HUB: Vec3 = [0, 0, HH];\nconst ROT = 10;\nconst W0 = 0.55;\nconst REST = 0.25;\nconst SX = [70, 330] as const;\nconst G = 50;\nconst TUFTS: Vec2[] = [\n  [-36, 26],\n  [-12, 38],\n  [28, 34],\n  [36, -8],\n  [-34, -20],\n  [12, -36],\n  [42, 18],\n  [-18, 8],\n];\n\n/** One blade on the rotor face, along angle th: a narrow root, a broad shoulder, a long taper to a round tip. */\nfunction blade(at: (u: number, v: number) => Vec2, th: number) {\n  const c = Math.cos(th);\n  const s = Math.sin(th);\n  const pt = (r: number, w: number) => at(r * c - w * s, r * s + w * c);\n  const chord = (t: number) =>\n    t < 0.16 ? 2.4 + (6.8 - 2.4) * (t / 0.16) : 6.8 - 4.6 * ((t - 0.16) / 0.84);\n  const lead: Vec2[] = [];\n  const trail: Vec2[] = [];\n  for (let k = 0; k <= 10; k++) {\n    const t = k / 10;\n    const r = 4 + (R - 4) * t;\n    lead.push(pt(r, 0.38 * chord(t)));\n    trail.push(pt(r, -0.62 * chord(t)));\n  }\n  return poly([...lead, pt(R + 0.8, -0.3), ...trail.reverse()]);\n}\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  let boost = value;\n  const C = Cam(45, 0.5, 1.36);\n  const rc: Vec3 = [HUB[0] + E[0] * ROT, HUB[1] + E[1] * ROT, HH];\n  const ext = corners(-G, -G, -5, G, G, 0);\n  for (let i = 0; i < 16; i++) {\n    const a = (i / 16) * Math.PI * 2;\n    const u = (R + 2) * Math.cos(a);\n    const v = (R + 2) * Math.sin(a);\n    ext.push([rc[0] + A[0] * u, rc[1] + A[1] * u, HH + v]);\n  }\n  fit(C, ext);\n  const P = proj(C);\n  const wind = spring(REST, { k: 6, c: 5, eps: 0.002 });\n  let phase = 0.5;\n\n  const g = mk(\"g\", {}, svg);\n  // the lawn, a few tufts, and the round footing\n  put(solid(g), box(C, P, -G, -G, -5, G, G, 0, 6, 2));\n  let grass = \"\";\n  for (const [x, y] of TUFTS)\n    for (const d of [-2, 0, 2])\n      grass += seg(\n        P(x + d * 0.4, y, 0),\n        P(x + d, y + d * 0.3, 4.4 - Math.abs(d) * 0.7),\n      );\n  path(g, \"nf lo\", grass);\n  put(solid(g), bar(P, [0, 0, 0], Z, X, Y, circ(8, 40), circ(6.4, 40), 0, 3));\n\n  // the tail fin and its boom, behind the nacelle\n  const side = on(P, HUB, E, Z);\n  const fin: Vec2[] = [\n    [-30, 1.5],\n    [-40, 19],\n    [-54, 20],\n    [-54, -9],\n    [-42, -9],\n  ];\n  path(g, \"sil\", poly(fin.map(([s, z]) => side(s, z))));\n  path(g, \"nf lo\", seg(side(-33, 0.5), side(-53, 0.5)));\n  put(solid(g), bar(P, HUB, E, A, Z, circ(1.2, 16), circ(0.6, 16), -40, -10));\n\n  // the mast, tapering, and the nacelle on top\n  const ring = (r: number, z: number) => circ(r, 24).map((q) => P(q.u, q.v, z));\n  put(solid(g), {\n    sil: poly(hull([...ring(2.8, 3), ...ring(1.7, HH)])),\n    crease: \"\",\n  });\n  put(solid(g), bar(P, HUB, E, A, Z, circ(5.4, 40), circ(4.2, 40), -14, 8));\n\n  // the rotor: the circle its tips sweep, three blades, the hub\n  const face = on(P, rc, A, Z);\n  const sweep = path(g, \"nf lo dash\", circle(face, R + 2, 96));\n  const bl = path(g, \"sil\");\n  const hub = solid(g);\n  put(hub, bar(P, HUB, E, A, Z, circ(3.6, 32), circ(2.4, 32), 8, 14));\n  hub.sil.classList.add(\"hi\");\n\n  const paint = () => {\n    let d = \"\";\n    for (let i = 0; i < 3; i++) d += blade(face, phase + (i * Math.PI * 2) / 3);\n    draw(bl, d);\n  };\n  const rate = (w: number) =>\n    w <= REST ? w / REST : 1 + ((boost - 1) * (w - REST)) / (1 - REST);\n  const tick = (dt: number) => {\n    stepS(wind, dt);\n    if (reducedMotion()) return false;\n    phase = (phase + dt * W0 * rate(wind.x)) % (Math.PI * 2);\n    paint();\n    return true;\n  };\n  paint();\n  const B = register(stage, tick);\n  bag.add(B.unregister);\n\n  const lit = (on: boolean) => {\n    hub.sil.classList.toggle(\"hi\", !on);\n    sweep.classList.toggle(\"hi\", on);\n    sweep.classList.toggle(\"lo\", !on);\n  };\n  bag.add(\n    pointer(stage, {\n      move: ([x]) => {\n        wind.t = clamp((x - SX[0]) / (SX[1] - SX[0]), 0, 1);\n        read.textContent = `wind ${Math.round(wind.t * 100)}%`;\n        lit(true);\n        B.wake();\n      },\n      leave: () => {\n        wind.t = REST;\n        read.textContent = \"rest\";\n        lit(false);\n        B.wake();\n      },\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      boost = v;\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A small wind turbine on a slim mast in a patch of lawn: a nacelle with a tail fin and a three-bladed rotor. The rotor turns on its own; moving across the figure sets the wind, and the rotor speeds up or slows to match.\",\n  range: [2, 3.5, 6],\n  probe: [300, 130],\n  engine,\n};\n", "import {\n  Cam,\n  corners,\n  fit,\n  onWall,\n  open,\n  poly,\n  proj,\n  rad,\n  type Vec2,\n  type Vec3,\n} from \"../core/iso\";\nimport { tdone, tset, tval, tween } from \"../core/motion\";\nimport {\n  disposer,\n  type FigureMount,\n  mk,\n  path,\n  pointer,\n  put,\n  register,\n  solid,\n} from \"../core/stage\";\nimport type { Spec } from \"../figure\";\nimport { box } from \"../kit\";\nimport {\n  drawLeaf,\n  glass,\n  type Hole,\n  hinge,\n  holed,\n  type Line,\n  leaf,\n  rr,\n} from \"./_openings\";\n\n/**\n * Windows: a double casement window set back in a slice of wall, on a sill\n * that stands proud of the wall's face. Each casement has its glazing bead,\n * a lever on its meeting stile and a dim glint; the frame's head carries a\n * trickle-vent slot over each. The pointer picks a casement and it swings out\n * on its hinge while the other shuts. At rest the right one stands ajar, its\n * edge bright. The slider is how far a casement swings.\n *\n * The pattern: one of many. A tween per casement, picked on the plane of the\n * frame's face, which never moves. The frame's head and the wall's head and\n * right jamb are painted back over the casements, so nothing shows through.\n */\n\nconst WD = 8;\nconst R = 3;\nconst YF = WD - R;\nconst HOLE: Hole = { x0: 10, x1: 94, z0: 9, z1: 53 };\nconst W = HOLE.x1 + 10;\nconst H = HOLE.z1 + 8;\nconst FRAME = [HOLE.x0, YF - 4, HOLE.z0, HOLE.x1, YF, HOLE.z1] as const;\n// the frame's opening: 3.5 round the sides and foot, a deeper head for the vents\nconst IN: Hole = { x0: 13.5, x1: 90.5, z0: 12.5, z1: 46.5 };\nconst GAP = 0.6;\nconst CW = (IN.x1 - IN.x0 - 3 * GAP) / 2;\nconst CH = IN.z1 - IN.z0 - 2 * GAP;\nconst T = 2.4;\nconst SW = 4;\nconst MID = (IN.x0 + IN.x1) / 2;\nconst REST = 16;\nconst FAR = 110;\nconst SILL = [7, WD, 6.4, 97, WD + 5, HOLE.z0] as const;\nconst E = 0.6;\n\nconst EDGE = rr(0, 0, CW, CH, 0.8);\nconst LEVER: Line = {\n  pts: [\n    [CW - 2, CH / 2 + 2],\n    [CW - 2, CH / 2 + 2, 1.4],\n    [CW - 2, CH / 2 - 4, 1.4],\n  ],\n  open: true,\n};\nconst sash = (far: boolean) => ({\n  lo: glass(SW, SW, CW - SW, CH - SW, far),\n  mid: [rr(SW, SW, CW - SW, CH - SW, 0.6), LEVER],\n});\nconst SASH = [\n  { side: 1 as const, hx: IN.x0 + GAP, face: sash(true) },\n  { side: -1 as const, hx: IN.x1 - GAP, face: sash(false) },\n];\n\nconst engine: FigureMount = ({ stage, svg, read }, value) => {\n  const bag = disposer();\n  const C = Cam(45, 0.5, 2.6);\n  const pts: Vec3[] = [...corners(0, 0, 0, W, WD, H)];\n  for (const s of SASH)\n    for (let th = 0; th <= FAR; th += 10)\n      for (const z of [IN.z0, IN.z1])\n        pts.push([\n          s.hx + s.side * CW * Math.cos(rad(th)),\n          YF + CW * Math.sin(rad(th)),\n          z,\n        ]);\n  fit(C, pts);\n  const P = proj(C);\n  const on = (y: number) => (q: readonly number[]) =>\n    P(q[0] ?? 0, y, q[1] ?? 0);\n  let max = value;\n  let act = -2;\n\n  const g = mk(\"g\", {}, svg);\n  holed(C, P, g, [0, 0, 0, W, WD, H], HOLE);\n  put(solid(g), box(C, P, ...SILL, 0.8, 0.6));\n  const cover = holed(C, P, g, FRAME, IN, 0.6);\n  const leaves = SASH.map((s, i) => ({\n    ...s,\n    el: leaf(g),\n    at: hinge(C, P, s.hx, YF - GAP, IN.z0 + GAP, s.side),\n    tw: tween(i ? REST : 0),\n    drawn: Number.NaN,\n  }));\n  cover(g);\n  // a trickle-vent slot on the frame's head over each casement\n  const vent = (c: number) =>\n    poly(rr(c - 9, IN.z1 + 1.6, c + 9, IN.z1 + 2.9, 0.6).pts.map(on(YF)));\n  path(g, \"nf\", vent(IN.x0 + CW / 2) + vent(IN.x1 - CW / 2));\n  // the wall's head and right jamb, back over whatever swung behind them\n  const band: Vec2[] = [\n    [E, HOLE.z1],\n    [HOLE.x1, HOLE.z1],\n    [HOLE.x1, HOLE.z0 + 0.4],\n    [W - E, HOLE.z0 + 0.4],\n    [W - E, H - E],\n    [E, H - E],\n  ];\n  path(g, \"fo\", poly(band.map(on(WD))));\n  const edge: Vec2[] = [\n    [HOLE.x0, HOLE.z1],\n    [HOLE.x1, HOLE.z1],\n    [HOLE.x1, HOLE.z0],\n  ];\n  path(g, \"nf\", open(edge.map(on(WD))));\n\n  const B = register(stage, (_dt, now) => {\n    let moving = false;\n    for (const L of leaves) {\n      const th = tval(L.tw, now);\n      if (th !== L.drawn) {\n        L.drawn = th;\n        drawLeaf(L.el, L.at(th), EDGE, T, L.face);\n      }\n      if (!tdone(L.tw, now)) moving = true;\n    }\n    return moving;\n  });\n  bag.add(B.unregister);\n\n  /** Opens casement n (0 left, 1 right) and shuts the other; -1 is rest. */\n  const choose = (n: number, force = false) => {\n    if (n === act && !force) return;\n    act = n;\n    const now = performance.now();\n    leaves.forEach((L, i) => {\n      const to = i === n ? max : n < 0 && i === 1 ? REST : 0;\n      tset(L.tw, to, now, i === n || n < 0 ? 0 : 40);\n      L.el.face.classList.toggle(\"hi\", i === (n < 0 ? 1 : n));\n    });\n    read.textContent = n < 0 ? \"rest\" : n ? \"right\" : \"left\";\n    B.wake();\n  };\n  choose(-1);\n\n  const hit = (p: Vec2) => {\n    const [x, z] = onWall(P, [0, YF, 0], [1, 0], p);\n    const out = x < 6 || x > 98 || z < 5 || z > 57;\n    return out ? -1 : x < MID ? 0 : 1;\n  };\n  bag.add(\n    pointer(stage, {\n      move: (p) => choose(hit(p)),\n      leave: () => choose(-1),\n    }),\n  );\n  bag.add(() => svg.replaceChildren());\n\n  return {\n    set: (v) => {\n      max = v;\n      if (act >= 0) choose(act, true);\n    },\n    destroy: bag.dispose,\n  };\n};\n\nexport const spec: Spec = {\n  label:\n    \"A double casement window set in a wall above a projecting sill, with a trickle vent in its head. Pointing at a casement swings it open on its hinges.\",\n  range: [60, 85, FAR],\n  probe: [170, 170],\n  engine,\n};\n", "import { create, type Figure, type Options, type Spec } from \"./figure\";\nimport { spec as bathroom } from \"./figures/bathroom\";\nimport { spec as batteryStorage } from \"./figures/battery\";\nimport { spec as boiler } from \"./figures/boiler\";\nimport { spec as damp } from \"./figures/damp\";\nimport { spec as decoration } from \"./figures/decoration\";\nimport { spec as door } from \"./figures/door\";\nimport { spec as doorWindow } from \"./figures/door-window\";\nimport { spec as draughtProofing } from \"./figures/draught-proofing\";\nimport { spec as ductwork } from \"./figures/ductwork\";\nimport { spec as extension } from \"./figures/extension\";\nimport { spec as flatRoof } from \"./figures/flat-roof\";\nimport { spec as heatControls } from \"./figures/heat-controls\";\nimport { spec as heatPump } from \"./figures/heat-pump\";\nimport { spec as kitchen } from \"./figures/kitchen\";\nimport { spec as lighting } from \"./figures/lighting\";\nimport { spec as loftInsulation } from \"./figures/loft-insulation\";\nimport { spec as loftRoom } from \"./figures/loft-room\";\nimport { spec as pipework } from \"./figures/pipework\";\nimport { spec as plans } from \"./figures/plans\";\nimport { spec as radiator } from \"./figures/radiator\";\nimport { spec as scaffolding } from \"./figures/scaffolding\";\nimport { spec as secondaryGlazing } from \"./figures/secondary-glazing\";\nimport { spec as solarPv } from \"./figures/solar-pv\";\nimport { spec as solarThermal } from \"./figures/solar-thermal\";\nimport { spec as solidFloor } from \"./figures/solid-floor\";\nimport { spec as suspendedFloor } from \"./figures/suspended-floor\";\nimport { spec as thatch } from \"./figures/thatch\";\nimport { spec as underfloorHeating } from \"./figures/underfloor-heating\";\nimport { spec as ventilation } from \"./figures/ventilation\";\nimport { spec as wallCavity } from \"./figures/wall-cavity\";\nimport { spec as wallExternal } from \"./figures/wall-external\";\nimport { spec as wallGeneric } from \"./figures/wall-generic\";\nimport { spec as wallInternal } from \"./figures/wall-internal\";\nimport { spec as windTurbine } from \"./figures/wind-turbine\";\nimport { spec as window_ } from \"./figures/window\";\n\n/**\n * Linework: animated line drawings of the measures, one for every kind\n * (apps/projects/measures.py LINEWORK). Plain DOM, no framework:\n *\n *   const figure = mount(\"heat-pump\", el, { onRead: (t) => ... });\n *   figure.update({ intensity: 0.8 });\n *   figure.destroy();\n *\n * Every figure is a 400 \u00D7 320 isometric hairline drawing at a 5:4 aspect\n * ratio that fills its element's width, rests as a composition, answers the\n * pointer, and sleeps when offscreen. See AGENTS.md in this folder for the\n * rules a figure keeps.\n */\n\nexport const FIGURES = {\n  bathroom: bathroom,\n  battery: batteryStorage,\n  boiler: boiler,\n  damp: damp,\n  decoration: decoration,\n  door: door,\n  \"door-window\": doorWindow,\n  \"draught-proofing\": draughtProofing,\n  ductwork: ductwork,\n  extension: extension,\n  \"flat-roof\": flatRoof,\n  \"heat-controls\": heatControls,\n  \"heat-pump\": heatPump,\n  kitchen: kitchen,\n  lighting: lighting,\n  \"loft-insulation\": loftInsulation,\n  \"loft-room\": loftRoom,\n  pipework: pipework,\n  plans: plans,\n  radiator: radiator,\n  scaffolding: scaffolding,\n  \"secondary-glazing\": secondaryGlazing,\n  \"solar-pv\": solarPv,\n  \"solar-thermal\": solarThermal,\n  \"solid-floor\": solidFloor,\n  \"suspended-floor\": suspendedFloor,\n  thatch: thatch,\n  \"underfloor-heating\": underfloorHeating,\n  ventilation: ventilation,\n  \"wall-cavity\": wallCavity,\n  \"wall-external\": wallExternal,\n  \"wall-generic\": wallGeneric,\n  \"wall-internal\": wallInternal,\n  \"wind-turbine\": windTurbine,\n  window: window_,\n} as const satisfies Record<string, Spec>;\n\nexport type FigureId = keyof typeof FIGURES;\n\nexport const isFigureId = (id: string): id is FigureId =>\n  Object.hasOwn(FIGURES, id);\n\nexport function mount(\n  id: FigureId,\n  el: HTMLElement,\n  options?: Options,\n): Figure {\n  return create(id, FIGURES[id], el, options);\n}\n\nexport type { Figure, Options };\n", "import type { AlpineComponent } from \"alpinejs\";\nimport { type Figure, isFigureId, mount } from \"../linework\";\n\ninterface State extends Record<string | symbol, unknown> {\n  read: string;\n  init(): void;\n  destroy(): void;\n}\n\n/**\n * Mounts a linework figure into `x-ref=\"stage\"` (or the root) from\n * `data-figure=\"heat-pump\"`, or from the argument in `x-data=\"linework(id)\"`\n * inside an `x-for`, where a bound `data-figure` isn't set yet at init. An\n * optional `data-intensity` sets how strongly it answers. `read` holds the\n * figure's caption for an `x-text`.\n */\nexport default (name?: string | null): AlpineComponent<State> => {\n  let figure: Figure | null = null;\n  return {\n    read: \"rest\",\n    init() {\n      const root = this.$el;\n      const stage = this.$refs[\"stage\"] ?? root;\n      const id = name ?? root.dataset[\"figure\"] ?? \"\";\n      if (!isFigureId(id) || !(stage instanceof HTMLElement)) {\n        return;\n      }\n      const intensity = Number(root.dataset[\"intensity\"] ?? 0.5);\n      figure = mount(id, stage, {\n        intensity,\n        onRead: (text) => {\n          this.read = text;\n        },\n      });\n    },\n    destroy() {\n      figure?.destroy();\n      figure = null;\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\nexport default (\n  id: unknown,\n): AlpineComponent<Record<string | symbol, unknown>> => {\n  if (typeof id !== \"string\") {\n    return {};\n  }\n\n  const j = document.createElement(\"script\");\n\n  j.async = true;\n  j.defer = true;\n  j.id = \"hs-script-loader\";\n  j.src = `https://js-eu1.hs-scripts.com/${id}.js`;\n\n  document.body.appendChild(j);\n\n  return {};\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  hash: string;\n}\n\nconst highest = (a: HTMLElement, b: HTMLElement) =>\n  a.getBoundingClientRect().top - b.getBoundingClientRect().top;\n\nexport default (): AlpineComponent<State> => ({\n  active() {\n    const link = this.$el.querySelector(\"a\");\n\n    if (link === null || link.hash === \"\") {\n      return;\n    }\n\n    return new URL(link.href).hash === this.hash;\n  },\n\n  init() {\n    const hashes: HTMLElement[] = Array.from(\n      this.$el.querySelectorAll(\"a\") ?? [],\n    )\n      .map((x) => new URL(x.href))\n      .map((x) => x.hash.substring(1))\n      .filter((x) => x !== \"\")\n      .map((x) => document.getElementById(x))\n      .filter((x) => x !== null);\n\n    if (hashes.length === 0) {\n      return;\n    }\n\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach(() => {\n        hashes.sort(highest);\n\n        this.hash =\n          hashes\n            .filter((x) => x.getBoundingClientRect().top >= 0)\n            .map((x) => \"#\" + x.id)[0] ?? \"\";\n      });\n    });\n\n    hashes.forEach((x) => observer.observe(x));\n  },\n\n  hash: window.location.hash,\n});\n", "// Ranks the command palette's local entries (pages, project sections,\n// recents) against what has been typed, and splits text for highlighting.\n// Runs on every keystroke, so it stays allocation-light and DOM-free.\n\nexport interface Part {\n  text: string;\n  hit: boolean;\n}\n\nconst SEPARATORS = /[\\s\u00B7,&'\u2019()/-]+/;\n\nexport const normalise = (text: string): string =>\n  text.toLocaleLowerCase().replace(/\\s+/g, \" \").trim();\n\nconst words = (text: string): string[] =>\n  normalise(text).split(SEPARATORS).filter(Boolean);\n\nconst initials = (text: string): string =>\n  words(text)\n    .map((word) => word[0])\n    .join(\"\");\n\n/**\n * How well `query` matches an entry titled `title`, 0 for not at all.\n *\n * Every word typed has to start a word of the title or its keywords (or, at a\n * pinch, appear inside the title); a whole-title or leading match beats that,\n * and initials (\"bp\" for Build Packs) count too. Higher is better.\n */\nexport const score = (query: string, title: string, keywords = \"\"): number => {\n  const q = normalise(query);\n  if (!q) return 1;\n  const t = normalise(title);\n  if (t === q) return 1000;\n  if (t.startsWith(q)) return 800 - Math.min(t.length, 100);\n\n  const titleWords = words(title);\n  const keywordWords = words(keywords);\n  let total = 0;\n  let allInTitle = true;\n  for (const term of q.split(SEPARATORS).filter(Boolean)) {\n    if (titleWords.some((word) => word.startsWith(term))) {\n      total += 100;\n    } else if (keywordWords.some((word) => word.startsWith(term))) {\n      total += 40;\n      allInTitle = false;\n    } else if (term.length > 1 && t.includes(term)) {\n      total += 20;\n      allInTitle = false;\n    } else {\n      total = 0;\n      break;\n    }\n  }\n  if (total > 0) return total + (allInTitle ? 300 : 0) - t.length / 100;\n\n  if (!q.includes(\" \") && q.length > 1 && initials(title).startsWith(q)) {\n    return 250;\n  }\n  return 0;\n};\n\n/** The entries that match, best first; ties keep their original order. */\nexport const rank = <T>(\n  query: string,\n  entries: readonly T[],\n  title: (entry: T) => string,\n  keywords: (entry: T) => string = () => \"\",\n): T[] =>\n  entries\n    .map((entry, order) => ({\n      entry,\n      order,\n      score: score(query, title(entry), keywords(entry)),\n    }))\n    .filter((scored) => scored.score > 0)\n    .sort((a, b) => b.score - a.score || a.order - b.order)\n    .map((scored) => scored.entry);\n\n/** `text` split into runs, with the runs that the query's words matched. */\nexport const highlight = (text: string, query: string): Part[] => {\n  const terms = normalise(query).split(SEPARATORS).filter(Boolean);\n  if (!text || terms.length === 0) return [{ text, hit: false }];\n\n  const lower = text.toLocaleLowerCase();\n  const hits = new Array<boolean>(text.length).fill(false);\n  for (const term of terms) {\n    // Prefer the start of a word, as the ranking does; fall back to anywhere.\n    let at = -1;\n    for (let from = 0; ; ) {\n      const found = lower.indexOf(term, from);\n      if (found === -1) break;\n      if (found === 0 || SEPARATORS.test(lower[found - 1] ?? \"\")) {\n        at = found;\n        break;\n      }\n      if (at === -1) at = found;\n      from = found + 1;\n    }\n    if (at !== -1) hits.fill(true, at, at + term.length);\n  }\n\n  const parts: Part[] = [];\n  for (let i = 0; i < text.length; i += 1) {\n    const hit = hits[i] ?? false;\n    const last = parts.at(-1);\n    if (last && last.hit === hit) last.text += text[i];\n    else parts.push({ text: text[i] ?? \"\", hit });\n  }\n  return parts;\n};\n", "// What the command palette lists, and in what order. Pure, so it is tested\n// without a browser; palette.ts owns the DOM, the keyboard and the network.\n\nimport { normalise, rank, score } from \"./rank\";\n\nexport type Kind =\n  | \"page\"\n  | \"section\"\n  | \"action\"\n  | \"project\"\n  | \"file\"\n  | \"customer\"\n  | \"supplier\"\n  | \"person\";\n\n/** A destination a record can be opened at: a project section, say. */\nexport interface Child {\n  title: string;\n  group: string;\n  url: string;\n}\n\nexport interface Item {\n  id: string;\n  kind: Kind;\n  title: string;\n  subtitle?: string;\n  badge?: string;\n  keywords?: string;\n  url?: string;\n  /** For actions: the text to put on the clipboard instead of navigating. */\n  copy?: string;\n  pk?: number;\n  children?: Child[];\n}\n\nexport interface Group {\n  id: string;\n  label: string;\n  items: Item[];\n}\n\nexport interface Row {\n  key: string;\n  heading?: string;\n  item?: Item;\n  /** The item's position among the selectable rows, -1 for a heading. */\n  index: number;\n}\n\nexport interface Page {\n  id: string;\n  title: string;\n  url: string;\n  keywords: string;\n}\n\nexport interface Config {\n  search_url: string;\n  pages: Page[];\n  sections: Child[];\n  /** List pages that take `?search=`, offered for any query. */\n  searches: { title: string; url: string }[];\n  project: (Item & { reference: string; address: string }) | null;\n}\n\nexport const RECORDS: readonly Kind[] = [\n  \"project\",\n  \"file\",\n  \"customer\",\n  \"supplier\",\n  \"person\",\n];\n\nexport const RECENT_LIMIT = 8;\n\nconst LOCAL_LIMIT = 8;\n\n/** A strong local match (every word starts a title word) goes above records. */\nconst STRONG = 300;\n\n/** Whether `item` can be opened into a list of its own destinations. */\nexport const drillable = (item: Item | undefined, config: Config): boolean =>\n  Boolean(\n    item &&\n      ((item.kind === \"project\" && item.pk && config.sections.length) ||\n        item.children?.length),\n  );\n\n/** The destinations inside `item`: a project's sections, a person's pages. */\nexport const childrenOf = (item: Item, config: Config): Item[] => {\n  const children =\n    item.kind === \"project\" && item.pk\n      ? config.sections.map((section) => ({\n          ...section,\n          url: section.url.replace(\"{pk}\", String(item.pk)),\n        }))\n      : (item.children ?? []);\n  return children.map((child) => ({\n    id: `${item.id}>${child.url}`,\n    kind: \"section\",\n    title: child.title,\n    subtitle: child.group,\n    keywords: child.group,\n    url: child.url,\n  }));\n};\n\nconst pageItems = (config: Config): Item[] =>\n  config.pages.map((page) => ({\n    id: page.id,\n    kind: \"page\",\n    title: page.title,\n    keywords: page.keywords,\n    url: page.url,\n  }));\n\nconst projectActions = (config: Config, href: string): Item[] => {\n  const actions: Item[] = [\n    {\n      id: \"action:copy-link\",\n      kind: \"action\",\n      title: \"Copy link to this page\",\n      keywords: \"url share\",\n      copy: href,\n    },\n  ];\n  const project = config.project;\n  if (project) {\n    if (project.reference) {\n      actions.push({\n        id: \"action:copy-reference\",\n        kind: \"action\",\n        title: `Copy reference ${project.reference}`,\n        keywords: \"project\",\n        copy: project.reference,\n      });\n    }\n    actions.push({\n      id: \"action:copy-address\",\n      kind: \"action\",\n      title: \"Copy address\",\n      subtitle: project.address,\n      keywords: \"project postcode\",\n      copy: project.address,\n    });\n  }\n  return actions;\n};\n\nconst byTitle = (query: string, items: Item[], limit = LOCAL_LIMIT) =>\n  rank(\n    query,\n    items,\n    (item) => item.title,\n    (item) => `${item.keywords ?? \"\"} ${item.subtitle ?? \"\"}`,\n  ).slice(0, limit);\n\nconst best = (query: string, items: Item[]): number =>\n  Math.max(\n    0,\n    ...items.map((item) =>\n      score(query, item.title, `${item.keywords ?? \"\"} ${item.subtitle ?? \"\"}`),\n    ),\n  );\n\n/**\n * Records still worth showing while a newer search is in flight: the ones\n * whose visible text still contains every word, so typing narrows at once.\n */\nexport const narrow = (query: string, groups: Group[]): Group[] => {\n  const terms = normalise(query).split(\" \").filter(Boolean);\n  return groups\n    .map((group) => ({\n      ...group,\n      items: group.items.filter((item) => {\n        const text = normalise(\n          `${item.title} ${item.subtitle ?? \"\"} ${item.badge ?? \"\"}`,\n        );\n        return terms.every((term) => text.includes(term));\n      }),\n    }))\n    .filter((group) => group.items.length);\n};\n\nexport interface State {\n  query: string;\n  config: Config;\n  href: string;\n  recent: Item[];\n  /** Records from the server for the query (or a narrowed older answer). */\n  remote: Group[];\n  /** The record the list has been opened into, if any. */\n  scope: Item | null;\n}\n\n/** The groups to show, in order. */\nexport const groups = ({\n  query,\n  config,\n  href,\n  recent,\n  remote,\n  scope,\n}: State): Group[] => {\n  const q = normalise(query);\n\n  if (scope) {\n    const items = byTitle(q, childrenOf(scope, config), Infinity);\n    return items.length ? [{ id: \"scope\", label: scope.title, items }] : [];\n  }\n\n  const here = config.project\n    ? childrenOf(config.project, config).map((item) => ({\n        ...item,\n        id: `here>${item.url}`,\n      }))\n    : [];\n  const hereLabel = config.project\n    ? `This project \u00B7 ${config.project.title}`\n    : \"\";\n  const pages = pageItems(config);\n\n  // The page you're on is under \"This project\", not a place to go back to.\n  const elsewhere = recent.filter((item) => item.id !== config.project?.id);\n\n  if (!q) {\n    // Recent first: \u2318K, Enter goes back to whatever you had open before.\n    return [\n      { id: \"recent\", label: \"Recent\", items: elsewhere.slice(0, 5) },\n      { id: \"here\", label: hereLabel, items: here },\n      { id: \"pages\", label: \"Go to\", items: pages },\n    ].filter((group) => group.items.length);\n  }\n\n  const seen = new Set(remote.flatMap((group) => group.items.map((i) => i.id)));\n  const local = [\n    { id: \"here\", label: hereLabel, items: byTitle(q, here) },\n    {\n      id: \"recent\",\n      label: \"Recent\",\n      items: byTitle(\n        q,\n        elsewhere.filter((item) => !seen.has(item.id)),\n        4,\n      ),\n    },\n    { id: \"pages\", label: \"Go to\", items: byTitle(q, pages) },\n    {\n      id: \"actions\",\n      label: \"Actions\",\n      items: byTitle(q, projectActions(config, href), 3),\n    },\n  ].filter((group) => group.items.length);\n\n  const lists: Group = {\n    id: \"lists\",\n    label: \"Search the lists\",\n    items: config.searches.map((search) => ({\n      id: `list:${search.url}`,\n      kind: \"page\",\n      title: `${search.title} for \u201C${query.trim()}\u201D`,\n      url: `${search.url}?search=${encodeURIComponent(query.trim())}`,\n    })),\n  };\n\n  const strong = local.some((group) => best(q, group.items) >= STRONG);\n  return [\n    ...(strong ? [...local, ...remote] : [...remote, ...local]),\n    lists,\n  ].filter((group) => group.items.length);\n};\n\n/** Groups flattened into headed rows, numbering the selectable ones. */\nexport const layout = (list: Group[]): { rows: Row[]; items: Item[] } => {\n  const rows: Row[] = [];\n  const items: Item[] = [];\n  for (const group of list) {\n    rows.push({ key: `h:${group.id}`, heading: group.label, index: -1 });\n    for (const item of group.items) {\n      rows.push({ key: `${group.id}:${item.id}`, item, index: items.length });\n      items.push(item);\n    }\n  }\n  return { rows, items };\n};\n\n/** `recent` with `item` moved to the front, kept short. */\nexport const remember = (recent: Item[], item: Item): Item[] => {\n  if (!RECORDS.includes(item.kind) || !item.url) return recent;\n  const { id, kind, title, subtitle, badge, url, pk, children } = item;\n  const kept: Item = { id, kind, title, url };\n  if (subtitle) kept.subtitle = subtitle;\n  if (badge) kept.badge = badge;\n  if (pk !== undefined) kept.pk = pk;\n  if (children?.length) kept.children = children;\n  return [kept, ...recent.filter((other) => other.id !== id)].slice(\n    0,\n    RECENT_LIMIT,\n  );\n};\n\n/** Recents read back from storage, dropping anything malformed. */\nexport const parseRecent = (raw: string | null): Item[] => {\n  if (!raw) return [];\n  try {\n    const value: unknown = JSON.parse(raw);\n    if (!Array.isArray(value)) return [];\n    return value\n      .filter(\n        (entry): entry is Item =>\n          typeof entry === \"object\" &&\n          entry !== null &&\n          typeof entry.id === \"string\" &&\n          typeof entry.title === \"string\" &&\n          typeof entry.url === \"string\" &&\n          // Only ever a path on this site.\n          /^\\/(?!\\/)/.test(entry.url) &&\n          RECORDS.includes(entry.kind),\n      )\n      .slice(0, RECENT_LIMIT);\n  } catch {\n    return [];\n  }\n};\n", "// The ops command palette: \u2318K / Ctrl+K anywhere in ops, type, Enter.\n//\n// Pages, personal views and project sections come with the page\n// (`data-config`, from apps/operations/palette.py) and are ranked locally on\n// every keystroke. Records come from the search endpoint: one request per\n// settled query, the previous one cancelled, answers cached by query and\n// applied only if they still match what is typed. While a request is in\n// flight the last answer is narrowed locally, so the list never waits.\n\nimport { AlpineComponent } from \"alpinejs\";\n\nimport {\n  type Config,\n  type Group,\n  type Item,\n  type Kind,\n  type Row,\n  drillable,\n  groups,\n  layout,\n  narrow,\n  parseRecent,\n  remember,\n} from \"./palette/model\";\nimport { type Part, highlight } from \"./palette/rank\";\n\ninterface State extends Record<string | symbol, unknown> {\n  open: boolean;\n  query: string;\n  active: number;\n  loading: boolean;\n  failed: string;\n  notice: string;\n  scope: Item | null;\n  rows: Row[];\n  items: Item[];\n  show(): void;\n  hide(restoreFocus?: boolean): void;\n  refresh(): void;\n  fetch(): void;\n  request(query: string): Promise<void>;\n  settle(): void;\n  move(by: number): void;\n  reveal(): void;\n  enter(item: Item | undefined): boolean;\n  leave(): void;\n  setQuery(query: string): void;\n  remember(item: Item): void;\n  go(item: Item | undefined, newTab?: boolean): void;\n  copy(text: string): Promise<void>;\n}\n\nconst KINDS: Record<Kind, string> = {\n  action: \"Action\",\n  customer: \"Customer\",\n  file: \"File\",\n  page: \"Page\",\n  person: \"Person\",\n  project: \"Project\",\n  section: \"Section\",\n  supplier: \"Supplier\",\n};\n\nconst STORAGE_KEY = \"ops.palette.recent\";\nconst DEBOUNCE = 70;\n// The spinner only shows for a request slow enough to notice.\nconst SPINNER_DELAY = 150;\nconst CACHE_SIZE = 50;\n\nconst readStored = (): string | null => {\n  try {\n    return window.localStorage.getItem(STORAGE_KEY);\n  } catch {\n    return null;\n  }\n};\n\nconst writeStored = (recent: Item[]): string => {\n  const raw = JSON.stringify(recent);\n  try {\n    window.localStorage.setItem(STORAGE_KEY, raw);\n  } catch {\n    // Private windows and full storage just go without recents.\n  }\n  return raw;\n};\n\nconst searchable = (query: string): boolean =>\n  query.length >= 2 || /^\\d+$/.test(query);\n\nexport const optionId = (index: number): string => `palette-option-${index}`;\n\nexport default (): AlpineComponent<State> => {\n  let config: Config = {\n    search_url: \"\",\n    pages: [],\n    sections: [],\n    searches: [],\n    project: null,\n  };\n  let recent: Item[] = [];\n  // What storage held when `recent` was read, to notice another tab's picks.\n  let stored: string | null = null;\n  let remote: Group[] = [];\n  let remoteQuery = \"\";\n  // The query to restore when leaving a record's destinations.\n  let outerQuery = \"\";\n  let lastFocus: Element | null = null;\n  // Whether the selection was moved since the last keystroke; until it is,\n  // the top result stays selected as answers arrive.\n  let chosen = false;\n  // Rows are keyed afresh on every rebuild. Reusing a row's element lets\n  // Alpine run its bindings before the row's new values land and then skip\n  // them for the rest of that flush, leaving the old text on screen.\n  let generation = 0;\n  // Whether an answer for what is typed is still to come, and whether Enter\n  // was pressed meanwhile: typing a reference and hitting Enter at once\n  // should open the project, not whatever was on top a moment before.\n  let pending = false;\n  let enterWhenReady: { newTab: boolean } | null = null;\n  let debounce = 0;\n  let spinner = 0;\n  let controller: AbortController | null = null;\n  const cache = new Map<string, Group[]>();\n  const cleanup: (() => void)[] = [];\n\n  return {\n    open: false,\n    query: \"\",\n    active: 0,\n    loading: false,\n    failed: \"\",\n    notice: \"\",\n    scope: null,\n    rows: [],\n    items: [],\n\n    init() {\n      try {\n        config = { ...config, ...JSON.parse(this.$el.dataset[\"config\"] ?? \"\") };\n      } catch {\n        // A page without config still gets an empty palette, not an error.\n      }\n      stored = readStored();\n      recent = parseRecent(stored);\n      if (config.project) {\n        recent = remember(recent, config.project);\n        stored = writeStored(recent);\n      }\n\n      const onKey = (event: KeyboardEvent) => {\n        if (\n          event.key.toLowerCase() === \"k\" &&\n          (event.metaKey || event.ctrlKey) &&\n          !event.altKey &&\n          !event.shiftKey\n        ) {\n          event.preventDefault();\n          if (this.open) this.hide();\n          else this.show();\n        } else if (event.key === \"Escape\" && this.open) {\n          event.preventDefault();\n          this.hide();\n        }\n      };\n      // Coming Back to a page restored from the back/forward cache must not\n      // find the palette still open over it.\n      const onShow = (event: PageTransitionEvent) => {\n        if (event.persisted) this.hide(false);\n      };\n      window.addEventListener(\"keydown\", onKey);\n      window.addEventListener(\"pageshow\", onShow);\n      cleanup.push(() => window.removeEventListener(\"keydown\", onKey));\n      cleanup.push(() => window.removeEventListener(\"pageshow\", onShow));\n\n      // Build the list while the page is idle, so opening only shows it.\n      const warm = () => {\n        if (!this.rows.length) this.refresh();\n      };\n      // Safari has no requestIdleCallback.\n      if (typeof window.requestIdleCallback === \"function\") {\n        window.requestIdleCallback(warm, { timeout: 2000 });\n      } else {\n        setTimeout(warm, 200);\n      }\n    },\n\n    destroy() {\n      for (const undo of cleanup) undo();\n      controller?.abort();\n      window.clearTimeout(debounce);\n      window.clearTimeout(spinner);\n    },\n\n    show() {\n      if (this.open) return;\n      lastFocus = document.activeElement;\n      this.open = true;\n      this.notice = \"\";\n      document.documentElement.style.overflow = \"hidden\";\n      const now = readStored();\n      if (now !== stored || !this.rows.length) {\n        stored = now;\n        recent = parseRecent(now);\n        this.refresh();\n      }\n      this.$nextTick(() => {\n        const input = this.$refs[\"input\"];\n        if (input instanceof HTMLInputElement) {\n          input.focus();\n          input.select();\n        }\n      });\n    },\n\n    hide(restoreFocus = true) {\n      if (!this.open) return;\n      this.open = false;\n      document.documentElement.style.overflow = \"\";\n      if (this.scope) this.leave();\n      if (restoreFocus && lastFocus instanceof HTMLElement) lastFocus.focus();\n    },\n\n    /** Rebuilds the list from what is typed and what has arrived. */\n    refresh() {\n      const query = this.query.trim();\n      const shown =\n        remoteQuery === query || this.scope ? remote : narrow(query, remote);\n      const list = groups({\n        query,\n        config,\n        href: window.location.href,\n        recent,\n        remote: this.scope ? [] : shown,\n        scope: this.scope,\n      });\n      const previous = chosen ? this.items[this.active]?.id : undefined;\n      const { rows, items } = layout(list);\n      generation += 1;\n      this.rows = rows.map((row) => ({\n        ...row,\n        key: `${generation}:${row.key}`,\n      }));\n      this.items = items;\n      const kept = items.findIndex((item) => item.id === previous);\n      this.active = kept === -1 ? 0 : kept;\n    },\n\n    type() {\n      const input = this.$refs[\"input\"];\n      this.query = input instanceof HTMLInputElement ? input.value : \"\";\n      this.failed = \"\";\n      chosen = false;\n      enterWhenReady = null;\n      if (!this.scope) this.fetch();\n      this.refresh();\n      this.$nextTick(() => this.reveal());\n    },\n\n    fetch() {\n      const query = this.query.trim();\n      window.clearTimeout(debounce);\n      if (!searchable(query) || !config.search_url) {\n        controller?.abort();\n        remote = [];\n        remoteQuery = query;\n        this.settle();\n        return;\n      }\n      const cached = cache.get(query);\n      if (cached) {\n        controller?.abort();\n        remote = cached;\n        remoteQuery = query;\n        this.settle();\n        return;\n      }\n      // An answer to a query that this one doesn't extend is no help.\n      if (!query.startsWith(remoteQuery) || !remoteQuery) {\n        remote = [];\n        remoteQuery = \"\";\n      }\n      pending = true;\n      window.clearTimeout(spinner);\n      spinner = window.setTimeout(() => {\n        this.loading = true;\n      }, SPINNER_DELAY);\n      debounce = window.setTimeout(() => this.request(query), DEBOUNCE);\n    },\n\n    async request(query: string) {\n      controller?.abort();\n      const mine = new AbortController();\n      controller = mine;\n      try {\n        const response = await fetch(\n          `${config.search_url}?q=${encodeURIComponent(query)}`,\n          {\n            credentials: \"same-origin\",\n            headers: { Accept: \"application/json\" },\n            signal: mine.signal,\n          },\n        );\n        if (response.status === 401 || response.status === 403) {\n          throw new Error(\"Signed out: reload the page to sign in again.\");\n        }\n        if (!response.ok) throw new Error(\"Search isn't answering right now.\");\n        const body = (await response.json()) as { groups?: Group[] };\n        const answer = Array.isArray(body.groups) ? body.groups : [];\n        cache.set(query, answer);\n        if (cache.size > CACHE_SIZE) {\n          const oldest = cache.keys().next().value;\n          if (oldest !== undefined) cache.delete(oldest);\n        }\n        if (controller !== mine) return;\n        const now = this.query.trim();\n        // Typed on since: the answer still narrows while the next one comes.\n        if (now !== query) {\n          if (now.startsWith(query) && !this.scope) {\n            remote = answer;\n            remoteQuery = query;\n            this.refresh();\n          }\n          return;\n        }\n        remote = answer;\n        remoteQuery = query;\n        this.failed = \"\";\n      } catch (error) {\n        if (mine.signal.aborted) return;\n        this.failed =\n          error instanceof Error && error.message.startsWith(\"Signed out\")\n            ? error.message\n            : \"Search isn't answering right now. Pages still work.\";\n        remote = [];\n        remoteQuery = query;\n      }\n      if (controller === mine) controller = null;\n      this.settle();\n    },\n\n    settle() {\n      pending = false;\n      window.clearTimeout(spinner);\n      this.loading = false;\n      this.refresh();\n      if (enterWhenReady && this.open) {\n        const { newTab } = enterWhenReady;\n        enterWhenReady = null;\n        this.go(this.items[this.active], newTab);\n      }\n      enterWhenReady = null;\n    },\n\n    move(by: number) {\n      const count = this.items.length;\n      if (!count) return;\n      this.active = (((this.active + by) % count) + count) % count;\n      chosen = true;\n      this.$nextTick(() => this.reveal());\n    },\n\n    reveal() {\n      document\n        .getElementById(optionId(this.active))\n        ?.scrollIntoView({ block: \"nearest\" });\n    },\n\n    hover(index: number) {\n      if (this.active === index) return;\n      this.active = index;\n      chosen = true;\n    },\n\n    /** Opens the record's own destinations: a project's sections. */\n    enter(item: Item | undefined) {\n      if (!item || !drillable(item, config)) return false;\n      if (!this.scope) outerQuery = this.query;\n      this.scope = item;\n      this.remember(item);\n      this.setQuery(\"\");\n      this.active = 0;\n      return true;\n    },\n\n    leave() {\n      const left = this.scope?.id;\n      this.scope = null;\n      this.setQuery(outerQuery);\n      outerQuery = \"\";\n      // Back where you were: on the record you went into.\n      const at = this.items.findIndex((item) => item.id === left);\n      if (at !== -1) {\n        this.active = at;\n        chosen = true;\n      }\n    },\n\n    setQuery(query: string) {\n      this.query = query;\n      chosen = false;\n      const input = this.$refs[\"input\"];\n      if (input instanceof HTMLInputElement) input.value = query;\n      // Back out of a record, the outer query's answer is usually cached.\n      if (!this.scope) this.fetch();\n      this.refresh();\n    },\n\n    remember(item: Item) {\n      recent = remember(recent, item);\n      stored = writeStored(recent);\n    },\n\n    go(item: Item | undefined, newTab = false) {\n      if (!item) return;\n      if (item.copy !== undefined) {\n        this.copy(item.copy);\n        return;\n      }\n      if (!item.url) return;\n      this.remember(item);\n      if (newTab) {\n        window.open(item.url, \"_blank\", \"noopener\");\n        return;\n      }\n      this.hide(false);\n      window.location.assign(item.url);\n    },\n\n    async copy(text: string) {\n      try {\n        await navigator.clipboard.writeText(text);\n        this.notice = \"Copied\";\n        window.setTimeout(() => this.hide(), 500);\n      } catch {\n        this.notice = \"Couldn't copy: the browser said no.\";\n      }\n    },\n\n    /** A click on a row: modified clicks open as the browser would. */\n    click(event: MouseEvent, item: Item) {\n      if (\n        item.url &&\n        (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey)\n      ) {\n        this.remember(item);\n        return;\n      }\n      event.preventDefault();\n      this.go(item);\n    },\n\n    key(event: KeyboardEvent) {\n      if (event.isComposing) return;\n      const item = this.items[this.active];\n      const input = event.target;\n      const atEnd =\n        input instanceof HTMLInputElement &&\n        input.selectionStart === input.value.length &&\n        input.selectionEnd === input.value.length;\n      const ctrl = event.ctrlKey && !event.metaKey && !event.altKey;\n\n      if (event.key === \"ArrowDown\" || (ctrl && event.key === \"n\")) {\n        event.preventDefault();\n        this.move(1);\n      } else if (event.key === \"ArrowUp\" || (ctrl && event.key === \"p\")) {\n        event.preventDefault();\n        this.move(-1);\n      } else if (event.key === \"PageDown\") {\n        event.preventDefault();\n        this.move(Math.min(8, this.items.length - 1 - this.active) || 0);\n      } else if (event.key === \"PageUp\") {\n        event.preventDefault();\n        this.move(-Math.min(8, this.active));\n      } else if (event.key === \"Enter\") {\n        event.preventDefault();\n        const newTab = event.metaKey || event.ctrlKey || event.shiftKey;\n        if (pending && !chosen && !this.scope) {\n          enterWhenReady = { newTab };\n          return;\n        }\n        this.go(item, newTab);\n      } else if (event.key === \"Tab\") {\n        event.preventDefault();\n        if (event.shiftKey) {\n          if (this.scope) this.leave();\n        } else {\n          this.enter(item);\n        }\n      } else if (\n        event.key === \"ArrowRight\" &&\n        atEnd &&\n        drillable(item, config)\n      ) {\n        event.preventDefault();\n        this.enter(item);\n      } else if (\n        (event.key === \"Backspace\" || event.key === \"ArrowLeft\") &&\n        this.scope &&\n        !this.query\n      ) {\n        event.preventDefault();\n        this.leave();\n      } else if (event.key === \"Escape\") {\n        event.preventDefault();\n        event.stopPropagation();\n        if (this.scope) this.leave();\n        else this.hide();\n      }\n    },\n\n    canEnter(item: Item | undefined): boolean {\n      return drillable(item, config);\n    },\n\n    kind(item: Item): string {\n      return KINDS[item.kind];\n    },\n\n    parts(text: string | undefined): Part[] {\n      return highlight(text ?? \"\", this.scope ? this.query : this.query.trim());\n    },\n\n    optionId,\n\n    get activeId(): string {\n      return this.items.length ? optionId(this.active) : \"\";\n    },\n\n    get hint(): string {\n      const item = this.items[this.active];\n      if (this.scope) return \"\u21E7\u21E5 or \u232B to go back\";\n      if (drillable(item, config)) return \"\u21E5 for its sections\";\n      return \"\";\n    },\n\n    get empty(): string {\n      if (this.items.length) return \"\";\n      if (this.loading) return \"Searching\u2026\";\n      if (this.scope) return \"No section matches that.\";\n      return this.query.trim()\n        ? \"Nothing matches that. Try a reference, postcode, name, email, phone or file name.\"\n        : \"\";\n    },\n  };\n};\n", "import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n    DeadClicksAutoCaptureConfig,\n    ExternalIntegrationKind,\n    Properties,\n    RemoteConfig,\n    SiteAppLoader,\n    SessionStartReason,\n} from '../types'\nimport type {\n    ConversationsRemoteConfig,\n    GetMessagesResponse,\n    GetTicketsOptions,\n    GetTicketsResponse,\n    MarkAsReadResponse,\n    RestoreFromTokenResponse,\n    RequestRestoreLinkResponse,\n    SendMessageResponse,\n    UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n    typeof globalThis & {\n        /*\n         * Main PostHog instance\n         */\n        posthog: any\n\n        /*\n         * This is our contract between (potentially) lazily loaded extensions and the SDK\n         */\n        __PosthogExtensions__?: PostHogExtensions\n\n        /**\n         * When loading remote config, we assign it to this global configuration\n         * for ease of sharing it with the rest of the SDK\n         */\n        _POSTHOG_REMOTE_CONFIG?: Record<\n            string,\n            {\n                config: RemoteConfig\n                siteApps: SiteAppLoader[]\n            }\n        >\n\n        /**\n         * If this is set on the window, our logger will log to the console\n         * for ease of debugging. Used for testing purposes only.\n         *\n         * @see {Config.DEBUG} from config.ts\n         */\n        POSTHOG_DEBUG: any\n\n        // Exposed by the browser\n        doNotTrack: any\n\n        // See entrypoints/customizations.full.ts\n        posthogCustomizations: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/exception-autocapture.ts\n         *\n         * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n         */\n        posthogErrorWrappingFunctions: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/posthog-recorder.ts\n         *\n         * @deprecated use `__PosthogExtensions__.rrweb` instead\n         */\n        rrweb: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/posthog-recorder.ts\n         *\n         * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n         */\n        rrwebConsoleRecord: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/posthog-recorder.ts\n         *\n         * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n         */\n        getRecordNetworkPlugin: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/web-vitals.ts\n         *\n         * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n         */\n        postHogWebVitalsCallbacks: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/tracing-headers.ts\n         *\n         * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n         */\n        postHogTracingHeadersPatchFns: any\n\n        /**\n         * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n         * Can be removed once we drop support for 1.161.1\n         *\n         * See entrypoints/surveys.ts\n         *\n         * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n         */\n        extendPostHogWithSurveys: any\n\n        /*\n         * These are used to handle our toolbar state.\n         * @see {Toolbar} from extensions/toolbar.ts\n         */\n        ph_load_toolbar: any\n        ph_load_editor: any\n        ph_toolbar_state: any\n    } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n    | 'toolbar'\n    | 'exception-autocapture'\n    | 'web-vitals'\n    | 'web-vitals-with-attribution'\n    | 'recorder'\n    | 'lazy-recorder'\n    | 'tracing-headers'\n    | 'surveys'\n    | 'logs'\n    | 'conversations'\n    | 'product-tours'\n    | 'dead-clicks-autocapture'\n    | 'remote-config'\n    | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n    start: (startReason?: SessionStartReason) => void\n    stop: () => void\n    discard: () => void\n    sessionId: string\n    status: SessionRecordingStatus\n    onRRwebEmit: (rawEvent: eventWithTime) => void\n    log: (message: string, level: 'log' | 'warn' | 'error') => void\n    sdkDebugProperties: Properties\n    overrideLinkedFlag: () => void\n    overrideSampling: () => void\n    overrideTrigger: (triggerType: TriggerType) => void\n    isStarted: boolean\n    tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n    start: (observerTarget: Node) => void\n    stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n    // Widget control\n    show: () => void\n    hide: () => void\n    isVisible: () => boolean\n\n    // Lifecycle\n    reset: () => void\n\n    // Identity verification\n    setIdentity: () => void\n    clearIdentity: () => void\n\n    // API methods\n    sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n    getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n    markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n    getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n    requestRestoreLink: (email: string) => Promise<RequestRestoreLinkResponse>\n    restoreFromToken: (restoreToken: string) => Promise<RestoreFromTokenResponse>\n    restoreFromUrlToken: () => Promise<RestoreFromTokenResponse | null>\n    getCurrentTicketId: () => string | null\n    getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n    loadExternalDependency?: (\n        posthog: PostHog,\n        kind: PostHogExtensionKind,\n        callback: (error?: string | Event, event?: Event) => void\n    ) => void\n\n    loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n    errorWrappingFunctions?: {\n        wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n        wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n        wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n    }\n    rrweb?: { record: any; version: string; wasMaxDepthReached?: () => boolean; resetMaxDepthState?: () => void }\n    rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n    generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n    generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n    logs?: {\n        initializeLogs?: (posthog: PostHog) => any | undefined\n    }\n    postHogWebVitalsCallbacks?: {\n        onLCP: (metric: any) => void\n        onCLS: (metric: any) => void\n        onFCP: (metric: any) => void\n        onINP: (metric: any) => void\n    }\n    /**\n     * @deprecated\n     *\n     * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n     */\n    loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n    tracingHeadersPatchFns?: {\n        _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n        _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n    }\n    initDeadClicksAutocapture?: (\n        ph: PostHog,\n        config: DeadClicksAutoCaptureConfig\n    ) => LazyLoadedDeadClicksAutocaptureInterface\n    integrations?: {\n        [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n    }\n    initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n    initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n    ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n    ;(global as any).File = function () {}\n}\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n    global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const CompressionStream = global?.CompressionStream\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n", "import packageInfo from '../package.json'\n\n// overridden in posthog-core,\n// e.g.     Config.DEBUG = Config.DEBUG || instance.config.debug\nconst Config = {\n    DEBUG: false,\n    LIB_VERSION: packageInfo.version,\n    LIB_NAME: 'web',\n    /** The actual JS SDK version, unaffected by _overrideSDKInfo. Used for the `ver` request param. */\n    JS_SDK_VERSION: packageInfo.version,\n}\n\nexport default Config\n", "function isGzipSupported() {\n    return 'CompressionStream' in globalThis && 'TextEncoder' in globalThis && 'Response' in globalThis && 'function' == typeof Response.prototype.blob;\n}\nconst isNativeAsyncGzipReadError = (error)=>{\n    if (!error || 'object' != typeof error) return false;\n    const name = 'name' in error ? String(error.name) : '';\n    return 'NotReadableError' === name;\n};\nasync function gzipCompress(input, isDebug = true, options) {\n    try {\n        const compressedStream = new CompressionStream('gzip');\n        const writer = compressedStream.writable.getWriter();\n        const writePromise = writer.write(new TextEncoder().encode(input)).then(()=>writer.close()).catch(async (err)=>{\n            try {\n                await writer.abort(err);\n            } catch  {}\n            throw err;\n        });\n        const responsePromise = new Response(compressedStream.readable).blob();\n        const [compressed] = await Promise.all([\n            responsePromise,\n            writePromise\n        ]);\n        return compressed;\n    } catch (error) {\n        if (options?.rethrow) throw error;\n        if (isDebug) console.error('Failed to gzip compress data', error);\n        return null;\n    }\n}\nexport { gzipCompress, isGzipSupported, isNativeAsyncGzipReadError };\n", "const DEFAULT_BLOCKED_UA_STRS = [\n    'amazonbot',\n    'amazonproductbot',\n    'app.hypefactors.com',\n    'applebot',\n    'archive.org_bot',\n    'awariobot',\n    'backlinksextendedbot',\n    'baiduspider',\n    'bingbot',\n    'bingpreview',\n    'chrome-lighthouse',\n    'dataforseobot',\n    'deepscan',\n    'duckduckbot',\n    'facebookexternal',\n    'facebookcatalog',\n    'http://yandex.com/bots',\n    'hubspot',\n    'ia_archiver',\n    'leikibot',\n    'linkedinbot',\n    'meta-externalagent',\n    'mj12bot',\n    'msnbot',\n    'nessus',\n    'petalbot',\n    'pinterest',\n    'prerender',\n    'rogerbot',\n    'screaming frog',\n    'sebot-wa',\n    'sitebulb',\n    'slackbot',\n    'slurp',\n    'trendictionbot',\n    'turnitin',\n    'twitterbot',\n    'vercel-screenshot',\n    'vercelbot',\n    'yahoo! slurp',\n    'yandexbot',\n    'zoombot',\n    'bot.htm',\n    'bot.php',\n    '(bot;',\n    'bot/',\n    'crawler',\n    'ahrefsbot',\n    'ahrefssiteaudit',\n    'semrushbot',\n    'siteauditbot',\n    'splitsignalbot',\n    'gptbot',\n    'oai-searchbot',\n    'chatgpt-user',\n    'perplexitybot',\n    'better uptime bot',\n    'sentryuptimebot',\n    'uptimerobot',\n    'headlesschrome',\n    'cypress',\n    'google-hoteladsverifier',\n    'adsbot-google',\n    'apis-google',\n    'duplexweb-google',\n    'feedfetcher-google',\n    'google favicon',\n    'google web preview',\n    'google-read-aloud',\n    'googlebot',\n    'googleother',\n    'google-cloudvertexbot',\n    'googleweblight',\n    'mediapartners-google',\n    'storebot-google',\n    'google-inspectiontool',\n    'bytespider'\n];\nconst isBlockedUA = function(ua, customBlockedUserAgents = []) {\n    if (!ua) return false;\n    const uaLower = ua.toLowerCase();\n    return DEFAULT_BLOCKED_UA_STRS.concat(customBlockedUserAgents).some((blockedUA)=>{\n        const blockedUaLower = blockedUA.toLowerCase();\n        return -1 !== uaLower.indexOf(blockedUaLower);\n    });\n};\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA };\n", "var types_PostHogPersistedProperty = /*#__PURE__*/ function(PostHogPersistedProperty) {\n    PostHogPersistedProperty[\"AnonymousId\"] = \"anonymous_id\";\n    PostHogPersistedProperty[\"DistinctId\"] = \"distinct_id\";\n    PostHogPersistedProperty[\"Props\"] = \"props\";\n    PostHogPersistedProperty[\"EnablePersonProcessing\"] = \"enable_person_processing\";\n    PostHogPersistedProperty[\"PersonMode\"] = \"person_mode\";\n    PostHogPersistedProperty[\"FeatureFlagDetails\"] = \"feature_flag_details\";\n    PostHogPersistedProperty[\"FeatureFlags\"] = \"feature_flags\";\n    PostHogPersistedProperty[\"FeatureFlagPayloads\"] = \"feature_flag_payloads\";\n    PostHogPersistedProperty[\"BootstrapFeatureFlagDetails\"] = \"bootstrap_feature_flag_details\";\n    PostHogPersistedProperty[\"BootstrapFeatureFlags\"] = \"bootstrap_feature_flags\";\n    PostHogPersistedProperty[\"BootstrapFeatureFlagPayloads\"] = \"bootstrap_feature_flag_payloads\";\n    PostHogPersistedProperty[\"OverrideFeatureFlags\"] = \"override_feature_flags\";\n    PostHogPersistedProperty[\"Queue\"] = \"queue\";\n    PostHogPersistedProperty[\"LogsQueue\"] = \"logs_queue\";\n    PostHogPersistedProperty[\"OptedOut\"] = \"opted_out\";\n    PostHogPersistedProperty[\"SessionId\"] = \"session_id\";\n    PostHogPersistedProperty[\"SessionStartTimestamp\"] = \"session_start_timestamp\";\n    PostHogPersistedProperty[\"SessionLastTimestamp\"] = \"session_timestamp\";\n    PostHogPersistedProperty[\"PersonProperties\"] = \"person_properties\";\n    PostHogPersistedProperty[\"GroupProperties\"] = \"group_properties\";\n    PostHogPersistedProperty[\"InstalledAppBuild\"] = \"installed_app_build\";\n    PostHogPersistedProperty[\"InstalledAppVersion\"] = \"installed_app_version\";\n    PostHogPersistedProperty[\"SessionReplay\"] = \"session_replay\";\n    PostHogPersistedProperty[\"SurveyLastSeenDate\"] = \"survey_last_seen_date\";\n    PostHogPersistedProperty[\"SurveysSeen\"] = \"surveys_seen\";\n    PostHogPersistedProperty[\"Surveys\"] = \"surveys\";\n    PostHogPersistedProperty[\"RemoteConfig\"] = \"remote_config\";\n    PostHogPersistedProperty[\"FlagsEndpointWasHit\"] = \"flags_endpoint_was_hit\";\n    PostHogPersistedProperty[\"DeviceId\"] = \"device_id\";\n    return PostHogPersistedProperty;\n}({});\nvar types_Compression = /*#__PURE__*/ function(Compression) {\n    Compression[\"GZipJS\"] = \"gzip-js\";\n    Compression[\"Base64\"] = \"base64\";\n    return Compression;\n}({});\nconst FeatureFlagError = {\n    ERRORS_WHILE_COMPUTING: 'errors_while_computing_flags',\n    FLAG_MISSING: 'flag_missing',\n    QUOTA_LIMITED: 'quota_limited',\n    TIMEOUT: 'timeout',\n    CONNECTION_ERROR: 'connection_error',\n    UNKNOWN_ERROR: 'unknown_error',\n    apiError: (status)=>`api_error_${status}`\n};\nvar types_SurveyPosition = /*#__PURE__*/ function(SurveyPosition) {\n    SurveyPosition[\"TopLeft\"] = \"top_left\";\n    SurveyPosition[\"TopCenter\"] = \"top_center\";\n    SurveyPosition[\"TopRight\"] = \"top_right\";\n    SurveyPosition[\"MiddleLeft\"] = \"middle_left\";\n    SurveyPosition[\"MiddleCenter\"] = \"middle_center\";\n    SurveyPosition[\"MiddleRight\"] = \"middle_right\";\n    SurveyPosition[\"Left\"] = \"left\";\n    SurveyPosition[\"Right\"] = \"right\";\n    SurveyPosition[\"Center\"] = \"center\";\n    return SurveyPosition;\n}({});\nvar types_SurveyWidgetType = /*#__PURE__*/ function(SurveyWidgetType) {\n    SurveyWidgetType[\"Button\"] = \"button\";\n    SurveyWidgetType[\"Tab\"] = \"tab\";\n    SurveyWidgetType[\"Selector\"] = \"selector\";\n    return SurveyWidgetType;\n}({});\nvar types_SurveyType = /*#__PURE__*/ function(SurveyType) {\n    SurveyType[\"Popover\"] = \"popover\";\n    SurveyType[\"API\"] = \"api\";\n    SurveyType[\"Widget\"] = \"widget\";\n    SurveyType[\"ExternalSurvey\"] = \"external_survey\";\n    return SurveyType;\n}({});\nvar types_SurveyQuestionDescriptionContentType = /*#__PURE__*/ function(SurveyQuestionDescriptionContentType) {\n    SurveyQuestionDescriptionContentType[\"Html\"] = \"html\";\n    SurveyQuestionDescriptionContentType[\"Text\"] = \"text\";\n    return SurveyQuestionDescriptionContentType;\n}({});\nvar types_SurveyValidationType = /*#__PURE__*/ function(SurveyValidationType) {\n    SurveyValidationType[\"MinLength\"] = \"min_length\";\n    SurveyValidationType[\"MaxLength\"] = \"max_length\";\n    return SurveyValidationType;\n}({});\nvar types_SurveyRatingDisplay = /*#__PURE__*/ function(SurveyRatingDisplay) {\n    SurveyRatingDisplay[\"Number\"] = \"number\";\n    SurveyRatingDisplay[\"Emoji\"] = \"emoji\";\n    return SurveyRatingDisplay;\n}({});\nvar types_SurveyQuestionType = /*#__PURE__*/ function(SurveyQuestionType) {\n    SurveyQuestionType[\"Open\"] = \"open\";\n    SurveyQuestionType[\"MultipleChoice\"] = \"multiple_choice\";\n    SurveyQuestionType[\"SingleChoice\"] = \"single_choice\";\n    SurveyQuestionType[\"Rating\"] = \"rating\";\n    SurveyQuestionType[\"Link\"] = \"link\";\n    return SurveyQuestionType;\n}({});\nvar types_SurveyQuestionBranchingType = /*#__PURE__*/ function(SurveyQuestionBranchingType) {\n    SurveyQuestionBranchingType[\"NextQuestion\"] = \"next_question\";\n    SurveyQuestionBranchingType[\"End\"] = \"end\";\n    SurveyQuestionBranchingType[\"ResponseBased\"] = \"response_based\";\n    SurveyQuestionBranchingType[\"SpecificQuestion\"] = \"specific_question\";\n    return SurveyQuestionBranchingType;\n}({});\nvar types_SurveyMatchType = /*#__PURE__*/ function(SurveyMatchType) {\n    SurveyMatchType[\"Regex\"] = \"regex\";\n    SurveyMatchType[\"NotRegex\"] = \"not_regex\";\n    SurveyMatchType[\"Exact\"] = \"exact\";\n    SurveyMatchType[\"IsNot\"] = \"is_not\";\n    SurveyMatchType[\"Icontains\"] = \"icontains\";\n    SurveyMatchType[\"NotIcontains\"] = \"not_icontains\";\n    return SurveyMatchType;\n}({});\nvar types_SurveySchedule = /*#__PURE__*/ function(SurveySchedule) {\n    SurveySchedule[\"Once\"] = \"once\";\n    SurveySchedule[\"Recurring\"] = \"recurring\";\n    SurveySchedule[\"Always\"] = \"always\";\n    return SurveySchedule;\n}({});\nvar types_ActionStepStringMatching = /*#__PURE__*/ function(ActionStepStringMatching) {\n    ActionStepStringMatching[\"Contains\"] = \"contains\";\n    ActionStepStringMatching[\"Exact\"] = \"exact\";\n    ActionStepStringMatching[\"Regex\"] = \"regex\";\n    return ActionStepStringMatching;\n}({});\nconst knownUnsafeEditableEvent = [\n    '$snapshot',\n    '$pageview',\n    '$pageleave',\n    '$set',\n    'survey dismissed',\n    'survey sent',\n    'survey shown',\n    '$identify',\n    '$groupidentify',\n    '$create_alias',\n    '$$client_ingestion_warning',\n    '$web_experiment_applied',\n    '$feature_enrollment_update',\n    '$feature_flag_called'\n];\nexport { types_ActionStepStringMatching as ActionStepStringMatching, types_Compression as Compression, FeatureFlagError, types_PostHogPersistedProperty as PostHogPersistedProperty, types_SurveyMatchType as SurveyMatchType, types_SurveyPosition as SurveyPosition, types_SurveyQuestionBranchingType as SurveyQuestionBranchingType, types_SurveyQuestionDescriptionContentType as SurveyQuestionDescriptionContentType, types_SurveyQuestionType as SurveyQuestionType, types_SurveyRatingDisplay as SurveyRatingDisplay, types_SurveySchedule as SurveySchedule, types_SurveyType as SurveyType, types_SurveyValidationType as SurveyValidationType, types_SurveyWidgetType as SurveyWidgetType, knownUnsafeEditableEvent };\n", "function includes(str, needle) {\n    return -1 !== str.indexOf(needle);\n}\nconst trim = function(str) {\n    return str.trim();\n};\nconst stripLeadingDollar = function(s) {\n    return s.replace(/^\\$/, '');\n};\nfunction isDistinctIdStringLike(value) {\n    return [\n        'distinct_id',\n        'distinctid'\n    ].includes(value.toLowerCase());\n}\nfunction deepSortKeys(value) {\n    if (null === value || 'object' != typeof value) return value;\n    if (Array.isArray(value)) return value.map(deepSortKeys);\n    return Object.keys(value).sort().reduce((acc, key)=>{\n        acc[key] = deepSortKeys(value[key]);\n        return acc;\n    }, {});\n}\nfunction getPersonPropertiesHash(distinct_id, userPropertiesToSet, userPropertiesToSetOnce) {\n    return JSON.stringify({\n        distinct_id,\n        userPropertiesToSet: userPropertiesToSet ? deepSortKeys(userPropertiesToSet) : void 0,\n        userPropertiesToSetOnce: userPropertiesToSetOnce ? deepSortKeys(userPropertiesToSetOnce) : void 0\n    });\n}\nexport { getPersonPropertiesHash, includes, isDistinctIdStringLike, stripLeadingDollar, trim };\n", "import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n    return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n    if (isObject(x)) {\n        for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n        return true;\n    }\n    return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n    return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n    return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n    switch(Object.prototype.toString.call(candidate)){\n        case '[object Error]':\n        case '[object Exception]':\n        case '[object DOMException]':\n        case '[object DOMError]':\n        case '[object WebAssembly.Exception]':\n            return true;\n        default:\n            return isInstanceOf(candidate, Error);\n    }\n}\nfunction isErrorEvent(event) {\n    return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n    return 'undefined' != typeof Event && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n    return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n    try {\n        return candidate instanceof base;\n    } catch  {\n        return false;\n    }\n}\nconst yesLikeValues = [\n    true,\n    'true',\n    1,\n    '1',\n    'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n    false,\n    'false',\n    0,\n    '0',\n    'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n", "import { isNumber } from \"./type-utils.mjs\";\nfunction clampToRange(value, min, max, logger, fallbackValue) {\n    if (min > max) {\n        logger.warn('min cannot be greater than max.');\n        min = max;\n    }\n    if (isNumber(value)) if (value > max) {\n        logger.warn(' cannot be  greater than max: ' + max + '. Using max value instead.');\n        return max;\n    } else {\n        if (!(value < min)) return value;\n        logger.warn(' cannot be less than min: ' + min + '. Using min value instead.');\n        return min;\n    }\n    logger.warn(' must be a number. using max or fallback. max: ' + max + ', fallback: ' + fallbackValue);\n    return clampToRange(fallbackValue || max, min, max, logger);\n}\nfunction getRemoteConfigBool(field, key, defaultValue = true) {\n    if (null == field) return defaultValue;\n    if ('boolean' == typeof field) return field;\n    if ('object' == typeof field) {\n        const value = field[key];\n        return 'boolean' == typeof value ? value : defaultValue;\n    }\n    return defaultValue;\n}\nfunction getRemoteConfigNumber(field, key) {\n    if (null == field || 'object' != typeof field) return;\n    const value = field[key];\n    if ('number' == typeof value && Number.isFinite(value)) return value;\n    if ('string' == typeof value) {\n        const trimmed = value.trim();\n        if ('' === trimmed) return;\n        const parsed = Number(trimmed);\n        return Number.isFinite(parsed) ? parsed : void 0;\n    }\n}\nfunction isValidSampleRate(value) {\n    return 'number' == typeof value && Number.isFinite(value) && value >= 0 && value <= 1;\n}\nexport { clampToRange, getRemoteConfigBool, getRemoteConfigNumber, isValidSampleRate };\n", "import { clampToRange } from \"./number-utils.mjs\";\nconst ONE_DAY_IN_MS = 86400000;\nclass BucketedRateLimiter {\n    constructor(options){\n        this._buckets = {};\n        this._onBucketRateLimited = options._onBucketRateLimited;\n        this._bucketSize = clampToRange(options.bucketSize, 0, 100, options._logger);\n        this._refillRate = clampToRange(options.refillRate, 0, this._bucketSize, options._logger);\n        this._refillInterval = clampToRange(options.refillInterval, 0, ONE_DAY_IN_MS, options._logger);\n    }\n    _applyRefill(bucket, now) {\n        const elapsedMs = now - bucket.lastAccess;\n        const refillIntervals = Math.floor(elapsedMs / this._refillInterval);\n        if (refillIntervals > 0) {\n            const tokensToAdd = refillIntervals * this._refillRate;\n            bucket.tokens = Math.min(bucket.tokens + tokensToAdd, this._bucketSize);\n            bucket.lastAccess = bucket.lastAccess + refillIntervals * this._refillInterval;\n        }\n    }\n    consumeRateLimit(key) {\n        const now = Date.now();\n        const keyStr = String(key);\n        let bucket = this._buckets[keyStr];\n        if (bucket) this._applyRefill(bucket, now);\n        else {\n            bucket = {\n                tokens: this._bucketSize,\n                lastAccess: now\n            };\n            this._buckets[keyStr] = bucket;\n        }\n        if (0 === bucket.tokens) return true;\n        bucket.tokens--;\n        if (0 === bucket.tokens) this._onBucketRateLimited?.(key);\n        return 0 === bucket.tokens;\n    }\n    stop() {\n        this._buckets = {};\n    }\n}\nexport { BucketedRateLimiter };\n", "import { includes } from \"./string-utils.mjs\";\nimport { isFunction, isUndefined } from \"./type-utils.mjs\";\nconst FACEBOOK = 'Facebook';\nconst MOBILE = 'Mobile';\nconst IOS = 'iOS';\nconst ANDROID = 'Android';\nconst TABLET = 'Tablet';\nconst ANDROID_TABLET = ANDROID + ' ' + TABLET;\nconst IPAD = 'iPad';\nconst APPLE = 'Apple';\nconst APPLE_WATCH = APPLE + ' Watch';\nconst SAFARI = 'Safari';\nconst BLACKBERRY = 'BlackBerry';\nconst SAMSUNG = 'Samsung';\nconst SAMSUNG_BROWSER = SAMSUNG + 'Browser';\nconst SAMSUNG_INTERNET = SAMSUNG + ' Internet';\nconst CHROME = 'Chrome';\nconst CHROME_OS = CHROME + ' OS';\nconst CHROME_IOS = CHROME + ' ' + IOS;\nconst INTERNET_EXPLORER = 'Internet Explorer';\nconst INTERNET_EXPLORER_MOBILE = INTERNET_EXPLORER + ' ' + MOBILE;\nconst OPERA = 'Opera';\nconst OPERA_MINI = OPERA + ' Mini';\nconst EDGE = 'Edge';\nconst MICROSOFT_EDGE = 'Microsoft ' + EDGE;\nconst FIREFOX = 'Firefox';\nconst FIREFOX_IOS = FIREFOX + ' ' + IOS;\nconst NINTENDO = 'Nintendo';\nconst PLAYSTATION = 'PlayStation';\nconst XBOX = 'Xbox';\nconst ANDROID_MOBILE = ANDROID + ' ' + MOBILE;\nconst MOBILE_SAFARI = MOBILE + ' ' + SAFARI;\nconst WINDOWS = 'Windows';\nconst WINDOWS_PHONE = WINDOWS + ' Phone';\nconst NOKIA = 'Nokia';\nconst OUYA = 'Ouya';\nconst GENERIC = 'Generic';\nconst GENERIC_MOBILE = GENERIC + ' ' + MOBILE.toLowerCase();\nconst GENERIC_TABLET = GENERIC + ' ' + TABLET.toLowerCase();\nconst KONQUEROR = 'Konqueror';\nconst BROWSER_VERSION_REGEX_SUFFIX = '(\\\\d+(\\\\.\\\\d+)?)';\nconst DEFAULT_BROWSER_VERSION_REGEX = new RegExp('Version/' + BROWSER_VERSION_REGEX_SUFFIX);\nconst XBOX_REGEX = new RegExp(XBOX, 'i');\nconst PLAYSTATION_REGEX = new RegExp(PLAYSTATION + ' \\\\w+', 'i');\nconst NINTENDO_REGEX = new RegExp(NINTENDO + ' \\\\w+', 'i');\nconst BLACKBERRY_REGEX = new RegExp(BLACKBERRY + '|PlayBook|BB10', 'i');\nconst windowsVersionMap = {\n    'NT3.51': 'NT 3.11',\n    'NT4.0': 'NT 4.0',\n    '5.0': '2000',\n    '5.1': 'XP',\n    '5.2': 'XP',\n    '6.0': 'Vista',\n    '6.1': '7',\n    '6.2': '8',\n    '6.3': '8.1',\n    '6.4': '10',\n    '10.0': '10'\n};\nfunction isSafari(userAgent) {\n    return includes(userAgent, SAFARI) && !includes(userAgent, CHROME) && !includes(userAgent, ANDROID);\n}\nconst safariCheck = (ua, vendor)=>vendor && includes(vendor, APPLE) || isSafari(ua);\nconst detectBrowser = function(user_agent, vendor) {\n    vendor = vendor || '';\n    if (includes(user_agent, ' OPR/') && includes(user_agent, 'Mini')) return OPERA_MINI;\n    if (includes(user_agent, ' OPR/')) return OPERA;\n    if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n    if (includes(user_agent, 'IE' + MOBILE) || includes(user_agent, 'WPDesktop')) return INTERNET_EXPLORER_MOBILE;\n    if (includes(user_agent, SAMSUNG_BROWSER)) return SAMSUNG_INTERNET;\n    else if (includes(user_agent, EDGE) || includes(user_agent, 'Edg/')) return MICROSOFT_EDGE;\n    else if (includes(user_agent, 'FBIOS')) return FACEBOOK + ' ' + MOBILE;\n    else if (includes(user_agent, 'UCWEB') || includes(user_agent, 'UCBrowser')) return 'UC Browser';\n    else if (includes(user_agent, 'CriOS')) return CHROME_IOS;\n    else if (includes(user_agent, 'CrMo')) return CHROME;\n    else if (includes(user_agent, CHROME)) return CHROME;\n    else if (includes(user_agent, ANDROID) && includes(user_agent, SAFARI)) return ANDROID_MOBILE;\n    else if (includes(user_agent, 'FxiOS')) return FIREFOX_IOS;\n    else if (includes(user_agent.toLowerCase(), KONQUEROR.toLowerCase())) return KONQUEROR;\n    else if (safariCheck(user_agent, vendor)) return includes(user_agent, MOBILE) ? MOBILE_SAFARI : SAFARI;\n    else if (includes(user_agent, FIREFOX)) return FIREFOX;\n    else if (includes(user_agent, 'MSIE') || includes(user_agent, 'Trident/')) return INTERNET_EXPLORER;\n    else if (includes(user_agent, 'Gecko')) return FIREFOX;\n    return '';\n};\nconst versionRegexes = {\n    [INTERNET_EXPLORER_MOBILE]: [\n        new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [MICROSOFT_EDGE]: [\n        new RegExp(EDGE + '?\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [CHROME]: [\n        new RegExp('(' + CHROME + '|CrMo)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [CHROME_IOS]: [\n        new RegExp('CriOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    'UC Browser': [\n        new RegExp('(UCBrowser|UCWEB)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [SAFARI]: [\n        DEFAULT_BROWSER_VERSION_REGEX\n    ],\n    [MOBILE_SAFARI]: [\n        DEFAULT_BROWSER_VERSION_REGEX\n    ],\n    [OPERA]: [\n        new RegExp('(' + OPERA + '|OPR)\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [FIREFOX]: [\n        new RegExp(FIREFOX + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [FIREFOX_IOS]: [\n        new RegExp('FxiOS\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [KONQUEROR]: [\n        new RegExp('Konqueror[:/]?' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n    ],\n    [BLACKBERRY]: [\n        new RegExp(BLACKBERRY + ' ' + BROWSER_VERSION_REGEX_SUFFIX),\n        DEFAULT_BROWSER_VERSION_REGEX\n    ],\n    [ANDROID_MOBILE]: [\n        new RegExp('android\\\\s' + BROWSER_VERSION_REGEX_SUFFIX, 'i')\n    ],\n    [SAMSUNG_INTERNET]: [\n        new RegExp(SAMSUNG_BROWSER + '\\\\/' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    [INTERNET_EXPLORER]: [\n        new RegExp('(rv:|MSIE )' + BROWSER_VERSION_REGEX_SUFFIX)\n    ],\n    Mozilla: [\n        new RegExp('rv:' + BROWSER_VERSION_REGEX_SUFFIX)\n    ]\n};\nconst detectBrowserVersion = function(userAgent, vendor) {\n    const browser = detectBrowser(userAgent, vendor);\n    const regexes = versionRegexes[browser];\n    if (isUndefined(regexes)) return null;\n    for(let i = 0; i < regexes.length; i++){\n        const regex = regexes[i];\n        const matches = userAgent.match(regex);\n        if (matches) return parseFloat(matches[matches.length - 2]);\n    }\n    return null;\n};\nconst osMatchers = [\n    [\n        new RegExp(XBOX + '; ' + XBOX + ' (.*?)[);]', 'i'),\n        (match)=>[\n                XBOX,\n                match && match[1] || ''\n            ]\n    ],\n    [\n        new RegExp(NINTENDO, 'i'),\n        [\n            NINTENDO,\n            ''\n        ]\n    ],\n    [\n        new RegExp(PLAYSTATION, 'i'),\n        [\n            PLAYSTATION,\n            ''\n        ]\n    ],\n    [\n        BLACKBERRY_REGEX,\n        [\n            BLACKBERRY,\n            ''\n        ]\n    ],\n    [\n        new RegExp(WINDOWS, 'i'),\n        (_, user_agent)=>{\n            if (/Phone/.test(user_agent) || /WPDesktop/.test(user_agent)) return [\n                WINDOWS_PHONE,\n                ''\n            ];\n            if (new RegExp(MOBILE).test(user_agent) && !/IEMobile\\b/.test(user_agent)) return [\n                WINDOWS + ' ' + MOBILE,\n                ''\n            ];\n            const match = /Windows NT ([0-9.]+)/i.exec(user_agent);\n            if (match && match[1]) {\n                const version = match[1];\n                let osVersion = windowsVersionMap[version] || '';\n                if (/arm/i.test(user_agent)) osVersion = 'RT';\n                return [\n                    WINDOWS,\n                    osVersion\n                ];\n            }\n            return [\n                WINDOWS,\n                ''\n            ];\n        }\n    ],\n    [\n        /((iPhone|iPad|iPod).*?OS (\\d+)_(\\d+)_?(\\d+)?|iPhone)/,\n        (match)=>{\n            if (match && match[3]) {\n                const versionParts = [\n                    match[3],\n                    match[4],\n                    match[5] || '0'\n                ];\n                return [\n                    IOS,\n                    versionParts.join('.')\n                ];\n            }\n            return [\n                IOS,\n                ''\n            ];\n        }\n    ],\n    [\n        /(watch.*\\/(\\d+\\.\\d+\\.\\d+)|watch os,(\\d+\\.\\d+),)/i,\n        (match)=>{\n            let version = '';\n            if (match && match.length >= 3) version = isUndefined(match[2]) ? match[3] : match[2];\n            return [\n                'watchOS',\n                version\n            ];\n        }\n    ],\n    [\n        new RegExp('(' + ANDROID + ' (\\\\d+)\\\\.(\\\\d+)\\\\.?(\\\\d+)?|' + ANDROID + ')', 'i'),\n        (match)=>{\n            if (match && match[2]) {\n                const versionParts = [\n                    match[2],\n                    match[3],\n                    match[4] || '0'\n                ];\n                return [\n                    ANDROID,\n                    versionParts.join('.')\n                ];\n            }\n            return [\n                ANDROID,\n                ''\n            ];\n        }\n    ],\n    [\n        /Mac OS X (\\d+)[_.](\\d+)[_.]?(\\d+)?/i,\n        (match)=>{\n            const result = [\n                'Mac OS X',\n                ''\n            ];\n            if (match && match[1]) {\n                const versionParts = [\n                    match[1],\n                    match[2],\n                    match[3] || '0'\n                ];\n                result[1] = versionParts.join('.');\n            }\n            return result;\n        }\n    ],\n    [\n        /Mac/i,\n        [\n            'Mac OS X',\n            ''\n        ]\n    ],\n    [\n        /CrOS/,\n        [\n            CHROME_OS,\n            ''\n        ]\n    ],\n    [\n        /Linux|debian/i,\n        [\n            'Linux',\n            ''\n        ]\n    ]\n];\nconst detectOS = function(user_agent) {\n    for(let i = 0; i < osMatchers.length; i++){\n        const [rgex, resultOrFn] = osMatchers[i];\n        const match = rgex.exec(user_agent);\n        const result = match && (isFunction(resultOrFn) ? resultOrFn(match, user_agent) : resultOrFn);\n        if (result) return result;\n    }\n    return [\n        '',\n        ''\n    ];\n};\nconst detectDevice = function(user_agent) {\n    if (NINTENDO_REGEX.test(user_agent)) return NINTENDO;\n    if (PLAYSTATION_REGEX.test(user_agent)) return PLAYSTATION;\n    if (XBOX_REGEX.test(user_agent)) return XBOX;\n    if (new RegExp(OUYA, 'i').test(user_agent)) return OUYA;\n    if (new RegExp('(' + WINDOWS_PHONE + '|WPDesktop)', 'i').test(user_agent)) return WINDOWS_PHONE;\n    else if (/iPad/.test(user_agent)) return IPAD;\n    else if (/iPod/.test(user_agent)) return 'iPod Touch';\n    else if (/iPhone/.test(user_agent)) return 'iPhone';\n    else if (/(watch)(?: ?os[,/]|\\d,\\d\\/)[\\d.]+/i.test(user_agent)) return APPLE_WATCH;\n    else if (BLACKBERRY_REGEX.test(user_agent)) return BLACKBERRY;\n    else if (/(kobo)\\s(ereader|touch)/i.test(user_agent)) return 'Kobo';\n    else if (new RegExp(NOKIA, 'i').test(user_agent)) return NOKIA;\n    else if (/(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i.test(user_agent) || /(kf[a-z]+)( bui|\\)).+silk\\//i.test(user_agent)) return 'Kindle Fire';\n    else if (/(Android|ZTE)/i.test(user_agent)) if (!(!new RegExp(MOBILE).test(user_agent) || /(9138B|TB782B|Nexus [97]|pixel c|HUAWEISHT|BTV|noble nook|smart ultra 6)/i.test(user_agent))) return ANDROID;\n    else {\n        if (/pixel[\\daxl ]{1,6}/i.test(user_agent) && !/pixel c/i.test(user_agent) || /(huaweimed-al00|tah-|APA|SM-G92|i980|zte|U304AA)/i.test(user_agent) || /lmy47v/i.test(user_agent) && !/QTAQZ3/i.test(user_agent)) return ANDROID;\n        return ANDROID_TABLET;\n    }\n    else if (new RegExp('(pda|' + MOBILE + ')', 'i').test(user_agent)) return GENERIC_MOBILE;\n    else if (new RegExp(TABLET, 'i').test(user_agent) && !new RegExp(TABLET + ' pc', 'i').test(user_agent)) return GENERIC_TABLET;\n    else return '';\n};\nconst detectDeviceType = function(user_agent, options) {\n    const device = detectDevice(user_agent);\n    if (device === IPAD || device === ANDROID_TABLET || 'Kobo' === device || 'Kindle Fire' === device || device === GENERIC_TABLET) return TABLET;\n    if (device === NINTENDO || device === XBOX || device === PLAYSTATION || device === OUYA) return 'Console';\n    if (device === APPLE_WATCH) return 'Wearable';\n    if (device) return MOBILE;\n    if (options?.userAgentDataPlatform === 'Android' && (options?.maxTouchPoints ?? 0) > 0) {\n        const shortSide = Math.min(options?.screenWidth ?? 0, options?.screenHeight ?? 0);\n        const shortSideDp = shortSide / (options?.devicePixelRatio ?? 1);\n        return shortSideDp >= 600 ? TABLET : MOBILE;\n    }\n    return 'Desktop';\n};\nexport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS };\n", "let parsedStackResults;\nlet lastKeysCount;\nlet cachedFilenameChunkIds;\nfunction getFilenameToChunkIdMap(stackParser) {\n    const chunkIdMap = globalThis._posthogChunkIds;\n    if (!chunkIdMap) return;\n    const chunkIdKeys = Object.keys(chunkIdMap);\n    if (cachedFilenameChunkIds && chunkIdKeys.length === lastKeysCount) return cachedFilenameChunkIds;\n    lastKeysCount = chunkIdKeys.length;\n    cachedFilenameChunkIds = chunkIdKeys.reduce((acc, stackKey)=>{\n        if (!parsedStackResults) parsedStackResults = {};\n        const result = parsedStackResults[stackKey];\n        if (result) acc[result[0]] = result[1];\n        else {\n            const parsedStack = stackParser(stackKey);\n            for(let i = parsedStack.length - 1; i >= 0; i--){\n                const stackFrame = parsedStack[i];\n                const filename = stackFrame?.filename;\n                const chunkId = chunkIdMap[stackKey];\n                if (filename && chunkId) {\n                    acc[filename] = chunkId;\n                    parsedStackResults[stackKey] = [\n                        filename,\n                        chunkId\n                    ];\n                    break;\n                }\n            }\n        }\n        return acc;\n    }, {});\n    return cachedFilenameChunkIds;\n}\nexport { getFilenameToChunkIdMap };\n", "export * from \"./bot-detection.mjs\";\nexport * from \"./bucketed-rate-limiter.mjs\";\nexport * from \"./number-utils.mjs\";\nexport * from \"./string-utils.mjs\";\nexport * from \"./type-utils.mjs\";\nexport * from \"./promise-queue.mjs\";\nexport * from \"./logger.mjs\";\nexport * from \"./user-agent-utils.mjs\";\nconst STRING_FORMAT = 'utf8';\nfunction assert(truthyValue, message) {\n    if (!truthyValue || 'string' != typeof truthyValue || isEmpty(truthyValue)) throw new Error(message);\n}\nfunction isEmpty(truthyValue) {\n    if (0 === truthyValue.trim().length) return true;\n    return false;\n}\nfunction removeTrailingSlash(url) {\n    return url?.replace(/\\/+$/, '');\n}\nasync function retriable(fn, props) {\n    let lastError = null;\n    for(let i = 0; i < props.retryCount + 1; i++){\n        if (i > 0) await new Promise((r)=>setTimeout(r, props.retryDelay));\n        try {\n            const res = await fn();\n            return res;\n        } catch (e) {\n            lastError = e;\n            if (!props.retryCheck(e)) throw e;\n        }\n    }\n    throw lastError;\n}\nfunction currentTimestamp() {\n    return new Date().getTime();\n}\nfunction currentISOTime() {\n    return new Date().toISOString();\n}\nfunction safeSetTimeout(fn, timeout) {\n    const t = setTimeout(fn, timeout);\n    t?.unref && t?.unref();\n    return t;\n}\nconst isPromise = (obj)=>obj && 'function' == typeof obj.then;\nconst isError = (x)=>x instanceof Error;\nfunction getFetch() {\n    return 'undefined' != typeof fetch ? fetch : void 0 !== globalThis.fetch ? globalThis.fetch : void 0;\n}\nfunction allSettled(promises) {\n    return Promise.all(promises.map((p)=>(p ?? Promise.resolve()).then((value)=>({\n                status: 'fulfilled',\n                value\n            }), (reason)=>({\n                status: 'rejected',\n                reason\n            }))));\n}\nexport { STRING_FORMAT, allSettled, assert, currentISOTime, currentTimestamp, getFetch, isError, isPromise, removeTrailingSlash, retriable, safeSetTimeout };\n", "import { isArray, isBoolean, isNull, isUndefined } from \"../utils/index.mjs\";\nconst OTLP_SEVERITY_MAP = {\n    trace: {\n        text: 'TRACE',\n        number: 1\n    },\n    debug: {\n        text: 'DEBUG',\n        number: 5\n    },\n    info: {\n        text: 'INFO',\n        number: 9\n    },\n    warn: {\n        text: 'WARN',\n        number: 13\n    },\n    error: {\n        text: 'ERROR',\n        number: 17\n    },\n    fatal: {\n        text: 'FATAL',\n        number: 21\n    }\n};\nconst DEFAULT_OTLP_SEVERITY = OTLP_SEVERITY_MAP.info;\nfunction getOtlpSeverityText(level) {\n    return (OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY).text;\n}\nfunction getOtlpSeverityNumber(level) {\n    return (OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY).number;\n}\nfunction toOtlpAnyValue(value) {\n    if (isBoolean(value)) return {\n        boolValue: value\n    };\n    if ('number' == typeof value) {\n        if (!Number.isFinite(value)) return {\n            stringValue: String(value)\n        };\n        if (Number.isInteger(value)) return {\n            intValue: value\n        };\n        return {\n            doubleValue: value\n        };\n    }\n    if ('string' == typeof value) return {\n        stringValue: value\n    };\n    if (isArray(value)) return {\n        arrayValue: {\n            values: value.map((v)=>toOtlpAnyValue(v))\n        }\n    };\n    try {\n        return {\n            stringValue: JSON.stringify(value)\n        };\n    } catch  {\n        return {\n            stringValue: String(value)\n        };\n    }\n}\nfunction toOtlpKeyValueList(attrs) {\n    const result = [];\n    for(const key in attrs){\n        const value = attrs[key];\n        if (!(isNull(value) || isUndefined(value))) result.push({\n            key,\n            value: toOtlpAnyValue(value)\n        });\n    }\n    return result;\n}\nfunction timestampToUnixNano() {\n    return String(Date.now()) + '000000';\n}\nfunction buildOtlpLogRecord(options, sdkContext) {\n    const level = options.level || 'info';\n    const { text: severityText, number: severityNumber } = OTLP_SEVERITY_MAP[level] || DEFAULT_OTLP_SEVERITY;\n    const now = timestampToUnixNano();\n    const autoAttributes = {};\n    if (sdkContext.distinctId) autoAttributes.posthogDistinctId = sdkContext.distinctId;\n    if (sdkContext.sessionId) autoAttributes.sessionId = sdkContext.sessionId;\n    if (sdkContext.currentUrl) autoAttributes['url.full'] = sdkContext.currentUrl;\n    if (sdkContext.screenName) autoAttributes['screen.name'] = sdkContext.screenName;\n    if (sdkContext.appState) autoAttributes['app.state'] = sdkContext.appState;\n    if (sdkContext.activeFeatureFlags && sdkContext.activeFeatureFlags.length > 0) autoAttributes.feature_flags = sdkContext.activeFeatureFlags;\n    const mergedAttributes = {\n        ...autoAttributes,\n        ...options.attributes || {}\n    };\n    const record = {\n        timeUnixNano: now,\n        observedTimeUnixNano: now,\n        severityNumber,\n        severityText,\n        body: {\n            stringValue: options.body\n        },\n        attributes: toOtlpKeyValueList(mergedAttributes)\n    };\n    if (options.trace_id) record.traceId = options.trace_id;\n    if (options.span_id) record.spanId = options.span_id;\n    if (!isUndefined(options.trace_flags)) record.flags = options.trace_flags;\n    return record;\n}\nfunction buildOtlpLogsPayload(logRecords, resourceAttributes, scopeName, scopeVersion) {\n    return {\n        resourceLogs: [\n            {\n                resource: {\n                    attributes: toOtlpKeyValueList(resourceAttributes)\n                },\n                scopeLogs: [\n                    {\n                        scope: {\n                            name: scopeName,\n                            version: scopeVersion\n                        },\n                        logRecords\n                    }\n                ]\n            }\n        ]\n    };\n}\nexport { buildOtlpLogRecord, buildOtlpLogsPayload, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList };\n", "import { isArray } from \"../utils/index.mjs\";\nimport { getFilenameToChunkIdMap } from \"./chunk-ids.mjs\";\nconst MAX_CAUSE_RECURSION = 4;\nclass ErrorPropertiesBuilder {\n    constructor(coercers, stackParser, modifiers = []){\n        this.coercers = coercers;\n        this.stackParser = stackParser;\n        this.modifiers = modifiers;\n    }\n    buildFromUnknown(input, hint = {}) {\n        const providedMechanism = hint && hint.mechanism;\n        const mechanism = providedMechanism || {\n            handled: true,\n            type: 'generic'\n        };\n        const coercingContext = this.buildCoercingContext(mechanism, hint, 0);\n        const exceptionWithCause = coercingContext.apply(input);\n        const parsingContext = this.buildParsingContext(hint);\n        const exceptionWithStack = this.parseStacktrace(exceptionWithCause, parsingContext);\n        const exceptionList = this.convertToExceptionList(exceptionWithStack, mechanism);\n        return {\n            $exception_list: exceptionList,\n            $exception_level: 'error'\n        };\n    }\n    async modifyFrames(exceptionList) {\n        for (const exc of exceptionList)if (exc.stacktrace && exc.stacktrace.frames && isArray(exc.stacktrace.frames)) exc.stacktrace.frames = await this.applyModifiers(exc.stacktrace.frames);\n        return exceptionList;\n    }\n    coerceFallback(ctx) {\n        return {\n            type: 'Error',\n            value: 'Unknown error',\n            stack: ctx.syntheticException?.stack,\n            synthetic: true\n        };\n    }\n    parseStacktrace(err, ctx) {\n        let cause;\n        if (null != err.cause) cause = this.parseStacktrace(err.cause, ctx);\n        let stack;\n        if ('' != err.stack && null != err.stack) stack = this.applyChunkIds(this.stackParser(err.stack, err.synthetic ? ctx.skipFirstLines : 0), ctx.chunkIdMap);\n        return {\n            ...err,\n            cause,\n            stack\n        };\n    }\n    applyChunkIds(frames, chunkIdMap) {\n        return frames.map((frame)=>{\n            if (frame.filename && chunkIdMap) frame.chunk_id = chunkIdMap[frame.filename];\n            return frame;\n        });\n    }\n    applyCoercers(input, ctx) {\n        for (const adapter of this.coercers)if (adapter.match(input)) return adapter.coerce(input, ctx);\n        return this.coerceFallback(ctx);\n    }\n    async applyModifiers(frames) {\n        let newFrames = frames;\n        for (const modifier of this.modifiers)newFrames = await modifier(newFrames);\n        return newFrames;\n    }\n    convertToExceptionList(exceptionWithStack, mechanism) {\n        const currentException = {\n            type: exceptionWithStack.type,\n            value: exceptionWithStack.value,\n            mechanism: {\n                type: mechanism.type ?? 'generic',\n                handled: mechanism.handled ?? true,\n                synthetic: exceptionWithStack.synthetic ?? false\n            }\n        };\n        if (exceptionWithStack.stack) currentException.stacktrace = {\n            type: 'raw',\n            frames: exceptionWithStack.stack\n        };\n        const exceptionList = [\n            currentException\n        ];\n        if (null != exceptionWithStack.cause) exceptionList.push(...this.convertToExceptionList(exceptionWithStack.cause, {\n            ...mechanism,\n            handled: true\n        }));\n        return exceptionList;\n    }\n    buildParsingContext(hint) {\n        const context = {\n            chunkIdMap: getFilenameToChunkIdMap(this.stackParser),\n            skipFirstLines: hint.skipFirstLines ?? 1\n        };\n        return context;\n    }\n    buildCoercingContext(mechanism, hint, depth = 0) {\n        const coerce = (input, depth)=>{\n            if (!(depth <= MAX_CAUSE_RECURSION)) return;\n            {\n                const ctx = this.buildCoercingContext(mechanism, hint, depth);\n                return this.applyCoercers(input, ctx);\n            }\n        };\n        const context = {\n            ...hint,\n            syntheticException: 0 == depth ? hint.syntheticException : void 0,\n            mechanism,\n            apply: (input)=>coerce(input, depth),\n            next: (input)=>coerce(input, depth + 1)\n        };\n        return context;\n    }\n}\nexport { ErrorPropertiesBuilder };\n", "import { isUndefined } from \"../../utils/index.mjs\";\nconst UNKNOWN_FUNCTION = '?';\nfunction createFrame(platform, filename, func, lineno, colno) {\n    const frame = {\n        platform,\n        filename,\n        function: '<anonymous>' === func ? UNKNOWN_FUNCTION : func,\n        in_app: true\n    };\n    if (!isUndefined(lineno)) frame.lineno = lineno;\n    if (!isUndefined(colno)) frame.colno = colno;\n    return frame;\n}\nexport { UNKNOWN_FUNCTION, createFrame };\n", "import { UNKNOWN_FUNCTION } from \"./base.mjs\";\nconst extractSafariExtensionDetails = (func, filename)=>{\n    const isSafariExtension = -1 !== func.indexOf('safari-extension');\n    const isSafariWebExtension = -1 !== func.indexOf('safari-web-extension');\n    return isSafariExtension || isSafariWebExtension ? [\n        -1 !== func.indexOf('@') ? func.split('@')[0] : UNKNOWN_FUNCTION,\n        isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`\n    ] : [\n        func,\n        filename\n    ];\n};\nexport { extractSafariExtensionDetails };\n", "import { UNKNOWN_FUNCTION, createFrame } from \"./base.mjs\";\nimport { extractSafariExtensionDetails } from \"./safari.mjs\";\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\nconst chromeRegex = /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\nconst chromeStackLineParser = (line, platform)=>{\n    const noFnParts = chromeRegexNoFnName.exec(line);\n    if (noFnParts) {\n        const [, filename, line, col] = noFnParts;\n        return createFrame(platform, filename, UNKNOWN_FUNCTION, +line, +col);\n    }\n    const parts = chromeRegex.exec(line);\n    if (parts) {\n        const isEval = parts[2] && 0 === parts[2].indexOf('eval');\n        if (isEval) {\n            const subMatch = chromeEvalRegex.exec(parts[2]);\n            if (subMatch) {\n                parts[2] = subMatch[1];\n                parts[3] = subMatch[2];\n                parts[4] = subMatch[3];\n            }\n        }\n        const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n        return createFrame(platform, filename, func, parts[3] ? +parts[3] : void 0, parts[4] ? +parts[4] : void 0);\n    }\n};\nexport { chromeStackLineParser };\n", "import { UNKNOWN_FUNCTION, createFrame } from \"./base.mjs\";\nimport { extractSafariExtensionDetails } from \"./safari.mjs\";\nconst geckoREgex = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nconst geckoStackLineParser = (line, platform)=>{\n    const parts = geckoREgex.exec(line);\n    if (parts) {\n        const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n        if (isEval) {\n            const subMatch = geckoEvalRegex.exec(parts[3]);\n            if (subMatch) {\n                parts[1] = parts[1] || 'eval';\n                parts[3] = subMatch[1];\n                parts[4] = subMatch[2];\n                parts[5] = '';\n            }\n        }\n        let filename = parts[3];\n        let func = parts[1] || UNKNOWN_FUNCTION;\n        [func, filename] = extractSafariExtensionDetails(func, filename);\n        return createFrame(platform, filename, func, parts[4] ? +parts[4] : void 0, parts[5] ? +parts[5] : void 0);\n    }\n};\nexport { geckoStackLineParser };\n", "import { UNKNOWN_FUNCTION } from \"./base.mjs\";\nimport { chromeStackLineParser } from \"./chrome.mjs\";\nimport { geckoStackLineParser } from \"./gecko.mjs\";\nimport { winjsStackLineParser } from \"./winjs.mjs\";\nimport { opera10StackLineParser, opera11StackLineParser } from \"./opera.mjs\";\nimport { nodeStackLineParser } from \"./node.mjs\";\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STACKTRACE_FRAME_LIMIT = 50;\nfunction reverseAndStripFrames(stack) {\n    if (!stack.length) return [];\n    const localStack = Array.from(stack);\n    localStack.reverse();\n    return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map((frame)=>({\n            ...frame,\n            filename: frame.filename || getLastStackFrame(localStack).filename,\n            function: frame.function || UNKNOWN_FUNCTION\n        }));\n}\nfunction getLastStackFrame(arr) {\n    return arr[arr.length - 1] || {};\n}\nfunction createDefaultStackParser() {\n    return createStackParser(\"web:javascript\", chromeStackLineParser, geckoStackLineParser);\n}\nfunction createStackParser(platform, ...parsers) {\n    return (stack, skipFirstLines = 0)=>{\n        const frames = [];\n        const lines = stack.split('\\n');\n        for(let i = skipFirstLines; i < lines.length; i++){\n            const line = lines[i];\n            if (line.length > 1024) continue;\n            const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n            if (!cleanedLine.match(/\\S*Error: /)) {\n                for (const parser of parsers){\n                    const frame = parser(cleanedLine, platform);\n                    if (frame) {\n                        frames.push(frame);\n                        break;\n                    }\n                }\n                if (frames.length >= STACKTRACE_FRAME_LIMIT) break;\n            }\n        }\n        return reverseAndStripFrames(frames);\n    };\n}\nexport { chromeStackLineParser, createDefaultStackParser, createStackParser, geckoStackLineParser, nodeStackLineParser, opera10StackLineParser, opera11StackLineParser, reverseAndStripFrames, winjsStackLineParser };\n", "import { isBuiltin, isString } from \"../../utils/index.mjs\";\nclass DOMExceptionCoercer {\n    match(err) {\n        return this.isDOMException(err) || this.isDOMError(err);\n    }\n    coerce(err, ctx) {\n        const hasStack = isString(err.stack);\n        return {\n            type: this.getType(err),\n            value: this.getValue(err),\n            stack: hasStack ? err.stack : void 0,\n            cause: err.cause ? ctx.next(err.cause) : void 0,\n            synthetic: false\n        };\n    }\n    getType(candidate) {\n        return this.isDOMError(candidate) ? 'DOMError' : 'DOMException';\n    }\n    getValue(err) {\n        const name = err.name || (this.isDOMError(err) ? 'DOMError' : 'DOMException');\n        const message = err.message ? `${name}: ${err.message}` : name;\n        return message;\n    }\n    isDOMException(err) {\n        return isBuiltin(err, 'DOMException');\n    }\n    isDOMError(err) {\n        return isBuiltin(err, 'DOMError');\n    }\n}\nexport { DOMExceptionCoercer };\n", "import { isPlainError } from \"../../utils/index.mjs\";\nclass ErrorCoercer {\n    match(err) {\n        return isPlainError(err);\n    }\n    coerce(err, ctx) {\n        return {\n            type: this.getType(err),\n            value: this.getMessage(err, ctx),\n            stack: this.getStack(err),\n            cause: err.cause ? ctx.next(err.cause) : void 0,\n            synthetic: false\n        };\n    }\n    getType(err) {\n        return err.name || err.constructor.name;\n    }\n    getMessage(err, _ctx) {\n        const message = err.message;\n        if (message.error && 'string' == typeof message.error.message) return String(message.error.message);\n        return String(message);\n    }\n    getStack(err) {\n        return err.stacktrace || err.stack || void 0;\n    }\n}\nexport { ErrorCoercer };\n", "import { isErrorEvent } from \"../../utils/index.mjs\";\nclass ErrorEventCoercer {\n    constructor(){}\n    match(err) {\n        return isErrorEvent(err) && void 0 != err.error;\n    }\n    coerce(err, ctx) {\n        const exceptionLike = ctx.apply(err.error);\n        if (!exceptionLike) return {\n            type: 'ErrorEvent',\n            value: err.message,\n            stack: ctx.syntheticException?.stack,\n            synthetic: true\n        };\n        return exceptionLike;\n    }\n}\nexport { ErrorEventCoercer };\n", "const ERROR_TYPES_PATTERN = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\nclass StringCoercer {\n    match(input) {\n        return 'string' == typeof input;\n    }\n    coerce(input, ctx) {\n        const [type, value] = this.getInfos(input);\n        return {\n            type: type ?? 'Error',\n            value: value ?? input,\n            stack: ctx.syntheticException?.stack,\n            synthetic: true\n        };\n    }\n    getInfos(candidate) {\n        let type = 'Error';\n        let value = candidate;\n        const groups = candidate.match(ERROR_TYPES_PATTERN);\n        if (groups) {\n            type = groups[1];\n            value = groups[2];\n        }\n        return [\n            type,\n            value\n        ];\n    }\n}\nexport { StringCoercer };\n", "const severityLevels = [\n    'fatal',\n    'error',\n    'warning',\n    'log',\n    'info',\n    'debug'\n];\nexport { severityLevels };\n", "function truncate(str, max = 0) {\n    if ('string' != typeof str || 0 === max) return str;\n    return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\nfunction extractExceptionKeysForMessage(err, maxLength = 40) {\n    const keys = Object.keys(err);\n    keys.sort();\n    if (!keys.length) return '[object has no keys]';\n    for(let i = keys.length; i > 0; i--){\n        const serialized = keys.slice(0, i).join(', ');\n        if (!(serialized.length > maxLength)) {\n            if (i === keys.length) return serialized;\n            return serialized.length <= maxLength ? serialized : `${serialized.slice(0, maxLength)}...`;\n        }\n    }\n    return '';\n}\nexport { extractExceptionKeysForMessage, truncate };\n", "import { isEmptyString, isError, isEvent, isString } from \"../../utils/index.mjs\";\nimport { severityLevels } from \"../types.mjs\";\nimport { extractExceptionKeysForMessage } from \"./utils.mjs\";\nclass ObjectCoercer {\n    match(candidate) {\n        return 'object' == typeof candidate && null !== candidate;\n    }\n    coerce(candidate, ctx) {\n        const errorProperty = this.getErrorPropertyFromObject(candidate);\n        if (errorProperty) return ctx.apply(errorProperty);\n        return {\n            type: this.getType(candidate),\n            value: this.getValue(candidate),\n            stack: ctx.syntheticException?.stack,\n            level: this.isSeverityLevel(candidate.level) ? candidate.level : 'error',\n            synthetic: true\n        };\n    }\n    getType(err) {\n        return isEvent(err) ? err.constructor.name : 'Error';\n    }\n    getValue(err) {\n        if ('name' in err && 'string' == typeof err.name) {\n            let message = `'${err.name}' captured as exception`;\n            if ('message' in err && 'string' == typeof err.message) message += ` with message: '${err.message}'`;\n            return message;\n        }\n        if ('message' in err && 'string' == typeof err.message) return err.message;\n        const className = this.getObjectClassName(err);\n        const keys = extractExceptionKeysForMessage(err);\n        return `${className && 'Object' !== className ? `'${className}'` : 'Object'} captured as exception with keys: ${keys}`;\n    }\n    isSeverityLevel(x) {\n        return isString(x) && !isEmptyString(x) && severityLevels.indexOf(x) >= 0;\n    }\n    getErrorPropertyFromObject(obj) {\n        for(const prop in obj)if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n            const value = obj[prop];\n            if (isError(value)) return value;\n        }\n    }\n    getObjectClassName(obj) {\n        try {\n            const prototype = Object.getPrototypeOf(obj);\n            return prototype ? prototype.constructor.name : void 0;\n        } catch (e) {\n            return;\n        }\n    }\n}\nexport { ObjectCoercer };\n", "import { isEvent } from \"../../utils/index.mjs\";\nimport { extractExceptionKeysForMessage } from \"./utils.mjs\";\nclass EventCoercer {\n    match(err) {\n        return isEvent(err);\n    }\n    coerce(evt, ctx) {\n        const constructorName = evt.constructor.name;\n        return {\n            type: constructorName,\n            value: `${constructorName} captured as exception with keys: ${extractExceptionKeysForMessage(evt)}`,\n            stack: ctx.syntheticException?.stack,\n            synthetic: true\n        };\n    }\n}\nexport { EventCoercer };\n", "import { isPrimitive } from \"../../utils/index.mjs\";\nclass PrimitiveCoercer {\n    match(candidate) {\n        return isPrimitive(candidate);\n    }\n    coerce(value, ctx) {\n        return {\n            type: 'Error',\n            value: `Primitive value captured as exception: ${String(value)}`,\n            stack: ctx.syntheticException?.stack,\n            synthetic: true\n        };\n    }\n}\nexport { PrimitiveCoercer };\n", "import { isBuiltin, isEvent, isPrimitive } from \"../../utils/index.mjs\";\nclass PromiseRejectionEventCoercer {\n    match(err) {\n        return isBuiltin(err, 'PromiseRejectionEvent') || this.isCustomEventWrappingRejection(err);\n    }\n    isCustomEventWrappingRejection(err) {\n        if (!isEvent(err)) return false;\n        try {\n            const detail = err.detail;\n            return null != detail && 'object' == typeof detail && 'reason' in detail;\n        } catch  {\n            return false;\n        }\n    }\n    coerce(err, ctx) {\n        const reason = this.getUnhandledRejectionReason(err);\n        if (isPrimitive(reason)) return {\n            type: 'UnhandledRejection',\n            value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n            stack: ctx.syntheticException?.stack,\n            synthetic: true\n        };\n        return ctx.apply(reason);\n    }\n    getUnhandledRejectionReason(error) {\n        try {\n            if ('reason' in error) return error.reason;\n            if ('detail' in error && null != error.detail && 'object' == typeof error.detail && 'reason' in error.detail) return error.detail.reason;\n        } catch  {}\n        return error;\n    }\n}\nexport { PromiseRejectionEventCoercer };\n", "import { isNumber, isObject, isString } from \"../utils/index.mjs\";\nconst EXCEPTION_STEP_INTERNAL_FIELDS = {\n    MESSAGE: '$message',\n    TIMESTAMP: '$timestamp'\n};\nconst RESERVED_EXCEPTION_STEP_KEYS = new Set([\n    EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE,\n    EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP\n]);\nconst DEFAULT_EXCEPTION_STEPS_CONFIG = {\n    enabled: true,\n    max_bytes: 32768\n};\nfunction resolveExceptionStepsConfig(config) {\n    if (!config) return {\n        ...DEFAULT_EXCEPTION_STEPS_CONFIG\n    };\n    return {\n        enabled: config.enabled ?? DEFAULT_EXCEPTION_STEPS_CONFIG.enabled,\n        max_bytes: normalizePositiveInteger(config.max_bytes, DEFAULT_EXCEPTION_STEPS_CONFIG.max_bytes)\n    };\n}\nfunction stripReservedExceptionStepFields(properties) {\n    if (!properties) return {\n        sanitizedProperties: {},\n        droppedKeys: []\n    };\n    const droppedKeys = [];\n    const sanitizedProperties = Object.keys(properties).reduce((acc, key)=>{\n        if (RESERVED_EXCEPTION_STEP_KEYS.has(key)) {\n            droppedKeys.push(key);\n            return acc;\n        }\n        acc[key] = properties[key];\n        return acc;\n    }, {});\n    return {\n        sanitizedProperties,\n        droppedKeys\n    };\n}\nclass ExceptionStepsBuffer {\n    constructor(config){\n        this._entries = [];\n        this._totalBytes = 0;\n        this._config = resolveExceptionStepsConfig(config);\n    }\n    setConfig(config) {\n        this._config = resolveExceptionStepsConfig(config);\n        this._trimToMaxBytes();\n    }\n    add(step) {\n        const serialized = normalizeAndSerializeStep(step);\n        if (!serialized) return;\n        const bytes = getUtf8ByteLength(serialized.json);\n        if (bytes > this._config.max_bytes) return;\n        this._entries.push({\n            step: serialized.step,\n            bytes\n        });\n        this._totalBytes += bytes;\n        this._trimToMaxBytes();\n    }\n    getAttachable() {\n        return this._entries.map((e)=>e.step);\n    }\n    clear() {\n        this._entries = [];\n        this._totalBytes = 0;\n    }\n    size() {\n        return this._entries.length;\n    }\n    _trimToMaxBytes() {\n        while(this._totalBytes > this._config.max_bytes && this._entries.length > 0){\n            const evicted = this._entries.shift();\n            if (evicted) this._totalBytes -= evicted.bytes;\n        }\n    }\n}\nfunction normalizePositiveInteger(input, fallback) {\n    if (!isNumber(input) || input === 1 / 0 || input === -1 / 0) return fallback;\n    const normalized = Math.floor(input);\n    if (normalized < 0) return fallback;\n    return normalized;\n}\nfunction normalizeAndSerializeStep(step) {\n    const json = safeStringify(step);\n    if (!json) return;\n    try {\n        const parsed = JSON.parse(json);\n        if (!isObject(parsed)) return;\n        const parsedStep = parsed;\n        const message = parsedStep[EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE];\n        const timestamp = parsedStep[EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP];\n        if (!isString(message) || 0 === message.trim().length) return;\n        if (!isString(timestamp) && !isNumber(timestamp)) return;\n        return {\n            step: parsedStep,\n            json\n        };\n    } catch  {\n        return;\n    }\n}\nfunction safeStringify(value) {\n    const seen = new WeakSet();\n    try {\n        return JSON.stringify(value, (_key, replacementValue)=>{\n            if ('bigint' == typeof replacementValue) return replacementValue.toString();\n            if ('function' == typeof replacementValue || 'symbol' == typeof replacementValue) return;\n            if (replacementValue instanceof Date) return replacementValue.toISOString();\n            if (replacementValue instanceof Error) return {\n                name: replacementValue.name,\n                message: replacementValue.message,\n                stack: replacementValue.stack\n            };\n            if (replacementValue && 'object' == typeof replacementValue) {\n                if (seen.has(replacementValue)) return '[Circular]';\n                seen.add(replacementValue);\n            }\n            return replacementValue;\n        });\n    } catch  {\n        return;\n    }\n}\nfunction getUtf8ByteLength(value) {\n    if ('undefined' != typeof TextEncoder) return new TextEncoder().encode(value).length;\n    const encoded = encodeURIComponent(value);\n    let byteLength = 0;\n    for(let i = 0; i < encoded.length; i++)if ('%' === encoded[i]) {\n        byteLength += 1;\n        i += 2;\n    } else byteLength += 1;\n    return byteLength;\n}\nexport { DEFAULT_EXCEPTION_STEPS_CONFIG, EXCEPTION_STEP_INTERNAL_FIELDS, ExceptionStepsBuffer, getUtf8ByteLength, resolveExceptionStepsConfig, stripReservedExceptionStepFields };\n", "import Config from '../config'\nimport { isUndefined } from '@posthog/core'\nimport { assignableWindow, window } from './globals'\nimport type { Logger } from '@posthog/core'\n\ntype CreateLoggerOptions = {\n    debugEnabled?: boolean\n}\n\ntype PosthogJsLogger = Omit<Logger, 'createLogger'> & {\n    _log: (level: 'debug' | 'log' | 'warn' | 'error', ...args: any[]) => void\n    uninitializedWarning: (methodName: string) => void\n    createLogger: (prefix: string, options?: CreateLoggerOptions) => PosthogJsLogger\n}\n\nconst _createLogger = (prefix: string, { debugEnabled }: CreateLoggerOptions = {}): PosthogJsLogger => {\n    const logger: PosthogJsLogger = {\n        _log: (level: 'debug' | 'log' | 'warn' | 'error', ...args: any[]) => {\n            if (\n                window &&\n                (Config.DEBUG || assignableWindow.POSTHOG_DEBUG || debugEnabled) &&\n                !isUndefined(window.console) &&\n                window.console\n            ) {\n                const consoleLog =\n                    '__rrweb_original__' in window.console[level]\n                        ? (window.console[level] as any)['__rrweb_original__']\n                        : window.console[level]\n\n                // eslint-disable-next-line no-console\n                consoleLog(prefix, ...args)\n            }\n        },\n\n        debug: (...args: any[]) => {\n            logger._log('debug', ...args)\n        },\n\n        info: (...args: any[]) => {\n            logger._log('log', ...args)\n        },\n\n        warn: (...args: any[]) => {\n            logger._log('warn', ...args)\n        },\n\n        error: (...args: any[]) => {\n            logger._log('error', ...args)\n        },\n\n        critical: (...args: any[]) => {\n            // Critical errors are always logged to the console\n            // eslint-disable-next-line no-console\n            console.error(prefix, ...args)\n        },\n\n        uninitializedWarning: (methodName: string) => {\n            logger.error(`You must initialize PostHog before calling ${methodName}`)\n        },\n\n        createLogger: (additionalPrefix: string, options?: CreateLoggerOptions) =>\n            _createLogger(`${prefix} ${additionalPrefix}`, options),\n    }\n    return logger\n}\n\nexport const logger = _createLogger('[PostHog.js]')\n\nexport const createLogger = logger.createLogger\n", "import type { PostHog } from '../posthog-core'\nimport { assignableWindow, document, PostHogExtensionKind } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\n\nconst logger = createLogger('[ExternalScriptsLoader]')\n\nconst loadScript = (posthog: PostHog, url: string, callback: (error?: string | Event, event?: Event) => void) => {\n    if (posthog.config.disable_external_dependency_loading) {\n        logger.warn(`${url} was requested but loading of external scripts is disabled.`)\n        return callback('Loading of external scripts is disabled')\n    }\n\n    // If we add a script more than once then the browser will parse and execute it\n    // So, even if idempotent we waste parsing and processing time\n    const existingScripts = document?.querySelectorAll('script')\n    if (existingScripts) {\n        for (let i = 0; i < existingScripts.length; i++) {\n            if (existingScripts[i].src === url) {\n                const alreadyExistingScriptTag = existingScripts[i]\n\n                if ((alreadyExistingScriptTag as any).__posthog_loading_callback_fired) {\n                    // script already exists and fired its load event,\n                    // we call the callback again, they need to be idempotent\n                    return callback()\n                }\n\n                // eslint-disable-next-line posthog-js/no-add-event-listener\n                alreadyExistingScriptTag.addEventListener('load', (event) => {\n                    // it hasn't already loaded\n                    // we probably called loadScript twice in quick succession,\n                    // so we attach a callback to the onload event\n                    ;(alreadyExistingScriptTag as any).__posthog_loading_callback_fired = true\n                    callback(undefined, event)\n                })\n                alreadyExistingScriptTag.onerror = (error) => callback(error)\n\n                return // and finish processing here\n            }\n        }\n    }\n\n    const addScript = () => {\n        if (!document) {\n            return callback('document not found')\n        }\n        let scriptTag: HTMLScriptElement | null = document.createElement('script')\n        scriptTag.type = 'text/javascript'\n        scriptTag.crossOrigin = 'anonymous'\n        scriptTag.src = url\n        scriptTag.onload = (event) => {\n            // mark the script as having had its callback fired, so we can avoid double-calling it\n            ;(scriptTag as any).__posthog_loading_callback_fired = true\n            callback(undefined, event)\n        }\n        scriptTag.onerror = (error) => callback(error)\n\n        if (posthog.config.prepare_external_dependency_script) {\n            scriptTag = posthog.config.prepare_external_dependency_script(scriptTag)\n        }\n\n        if (!scriptTag) {\n            return callback('prepare_external_dependency_script returned null')\n        }\n\n        if (posthog.config.external_scripts_inject_target === 'head') {\n            document.head.appendChild(scriptTag)\n        } else {\n            const scripts = document.querySelectorAll('body > script')\n            if (scripts.length > 0) {\n                scripts[0].parentNode?.insertBefore(scriptTag, scripts[0])\n            } else {\n                document.body.appendChild(scriptTag)\n            }\n        }\n    }\n\n    if (document?.body) {\n        addScript()\n    } else {\n        // Inlining this because we don't care about `passive: true` here\n        // and this saves us ~3% of the bundle size\n        // eslint-disable-next-line posthog-js/no-add-event-listener\n        document?.addEventListener('DOMContentLoaded', addScript)\n    }\n}\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.loadExternalDependency = (\n    posthog: PostHog,\n    kind: PostHogExtensionKind,\n    callback: (error?: string | Event, event?: Event) => void\n): void => {\n    // remote-config always loads from the token-specific path\n    if (kind === 'remote-config') {\n        const url = posthog.requestRouter.endpointFor('assets', `/array/${posthog.config.token}/config.js`)\n        loadScript(posthog, url, callback)\n        return\n    }\n\n    let url: string\n\n    if (posthog.config.__preview_external_dependency_versioned_paths) {\n        // posthog.version is baked into the executing array.js bundle, so this points at\n        // the exact semver-qualified sibling asset without relying on alias redirects.\n        url = posthog.requestRouter.endpointFor('assets', `/static/${posthog.version}/${kind}.js`)\n    } else {\n        let scriptUrlToLoad = `/static/${kind}.js?v=${posthog.version}`\n\n        if (kind === 'toolbar') {\n            // toolbar.js has a 24-hour CDN TTL but contains a rotating token valid for\n            // only 5 minutes. Bust the cache on a 5-minute boundary so the browser always\n            // fetches a fresh copy with a valid token.\n            const fiveMinutesInMillis = 5 * 60 * 1000\n            const timestampToNearestFiveMinutes = Math.floor(Date.now() / fiveMinutesInMillis) * fiveMinutesInMillis\n            scriptUrlToLoad = `${scriptUrlToLoad}&t=${timestampToNearestFiveMinutes}`\n        }\n\n        url = posthog.requestRouter.endpointFor('assets', scriptUrlToLoad)\n    }\n\n    loadScript(posthog, url, callback)\n}\n\nassignableWindow.__PosthogExtensions__.loadSiteApp = (\n    posthog: PostHog,\n    url: string,\n    callback: (error?: string | Event, event?: Event) => void\n): void => {\n    const scriptUrl = posthog.requestRouter.endpointFor('api', url)\n\n    loadScript(posthog, scriptUrl, callback)\n}\n", "/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\n// V2 Trigger Groups: Per-group persistence key prefixes (suffix with group ID)\nexport const SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX = '$posthog_sr_group_event_trigger_'\nexport const SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX = '$posthog_sr_group_url_trigger_'\nexport const SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX = '$posthog_sr_group_sampling_'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\nexport const PERSISTENCE_FEATURE_FLAG_REQUEST_ID = '$feature_flag_request_id'\nexport const PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nexport const PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS = '$override_feature_flag_payloads'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS = 'ph_product_tours'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const CONVERSATIONS_LEGACY_WIDGET_SESSION_ID = '$conversations_widget_session_id'\nexport const CONVERSATIONS_LEGACY_TICKET_ID = '$conversations_ticket_id'\nexport const CONVERSATIONS_LEGACY_WIDGET_STATE = '$conversations_widget_state'\nexport const CONVERSATIONS_LEGACY_USER_TRAITS = '$conversations_user_traits'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const FLAG_CALL_REPORTED_SESSION_ID = '$flag_call_reported_session_id'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const PERSISTENCE_FEATURE_FLAG_EVALUATED_AT = '$feature_flag_evaluated_at'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\nexport const SDK_DEBUG_EXTENSIONS_INIT_METHOD = '$sdk_debug_extensions_init_method'\nexport const SDK_DEBUG_EXTENSIONS_INIT_TIME_MS = '$sdk_debug_extensions_init_time_ms'\nexport const SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED = '$sdk_debug_recording_script_not_loaded'\nexport const SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS = '$sdk_debug_replay_event_trigger_status'\nexport const SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS = '$sdk_debug_replay_linked_flag_trigger_status'\nexport const SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS = '$sdk_debug_replay_matched_recording_trigger_groups'\nexport const SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG = '$sdk_debug_replay_remote_trigger_matching_config'\nexport const SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT = '$sdk_debug_replay_trigger_groups_count'\nexport const SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS = '$sdk_debug_replay_url_trigger_status'\nexport const SESSION_RECORDING_START_REASON = '$session_recording_start_reason'\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\nexport const LOAD_EXT_NOT_FOUND = 'PostHog loadExternalDependency extension not found.'\n\n/* EVENT NAMES - interned to reduce bundle size */\n/* COOKIELESS MODE VALUES */\nexport const COOKIELESS_ON_REJECT = 'on_reject' as const\nexport const COOKIELESS_ALWAYS = 'always' as const\n\n/* USER STATE VALUES */\nexport const USER_STATE_ANONYMOUS = 'anonymous'\nexport const USER_STATE_IDENTIFIED = 'identified'\n\n/* PERSON PROFILE MODES */\nexport const PERSON_PROFILES_IDENTIFIED_ONLY = 'identified_only' as const\n\n/* DOM EVENT NAMES - interned to reduce bundle size */\nexport const DOM_EVENT_VISIBILITYCHANGE = 'visibilitychange'\nexport const DOM_EVENT_BEFOREUNLOAD = 'beforeunload'\n\nexport const EVENT_PAGEVIEW = '$pageview'\nexport const EVENT_PAGELEAVE = '$pageleave'\nexport const EVENT_IDENTIFY = '$identify'\nexport const EVENT_GROUPIDENTIFY = '$groupidentify'\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n", "import { PostHogConfig, Properties } from '../types'\nimport { logger } from './logger'\nimport { isFormData, isNullish, isNumber, isString, hasOwnProperty, isArray } from '@posthog/core'\n\nexport function find<T>(value: T[], predicate: (value: T) => boolean): T | undefined {\n    for (let i = 0; i < value.length; i++) {\n        if (predicate(value[i])) {\n            return value[i]\n        }\n    }\n    return undefined\n}\n\nexport function eachArray<E = any>(obj: E[] | null | undefined, iterator: (value: E, key: number) => void): void {\n    if (isArray(obj)) {\n        obj.forEach(iterator)\n    }\n}\n\nexport function each(obj: any, iterator: (value: any, key: any) => void): void {\n    if (isNullish(obj)) {\n        return\n    }\n    if (isArray(obj)) {\n        obj.forEach(iterator)\n        return\n    }\n    if (isFormData(obj)) {\n        obj.forEach((val: any, key: any) => iterator(val, key))\n        return\n    }\n    for (const key in obj) {\n        if (hasOwnProperty.call(obj, key)) {\n            iterator(obj[key], key)\n        }\n    }\n}\n\nexport const extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n    for (const source of args) {\n        for (const prop in source) {\n            if (source[prop] !== void 0) {\n                obj[prop] = source[prop]\n            }\n        }\n    }\n    return obj\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function entries<T = any>(obj: Record<string, T>): [string, T][] {\n    const ownProps = Object.keys(obj)\n    let i = ownProps.length\n    const resArray = new Array(i) // preallocate the Array\n\n    while (i--) {\n        resArray[i] = [ownProps[i], obj[ownProps[i]]]\n    }\n    return resArray\n}\n\nexport const trySafe = function <T>(fn: () => T): T | undefined {\n    try {\n        return fn()\n    } catch {\n        return undefined\n    }\n}\n\nexport const safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n    return function (...args) {\n        try {\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            return f.apply(this, args)\n        } catch (e) {\n            logger.critical(\n                'Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.'\n            )\n            logger.critical(e)\n        }\n    } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const safewrapClass = function (klass: Function, functions: string[]): void {\n    for (let i = 0; i < functions.length; i++) {\n        klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]])\n    }\n}\n\nexport const stripEmptyProperties = function (p: Properties): Properties {\n    const ret: Properties = {}\n    each(p, function (v, k) {\n        if ((isString(v) && v.length > 0) || isNumber(v)) {\n            ret[k] = v\n        }\n    })\n    return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n    value: T,\n    customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n    const COPY_IN_PROGRESS_SET = new Set()\n\n    function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n        if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n        if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n        COPY_IN_PROGRESS_SET.add(value)\n        let result: T\n\n        if (isArray(value)) {\n            result = [] as any as T\n            eachArray(value, (it) => {\n                result.push(internalDeepCircularCopy(it))\n            })\n        } else {\n            result = {} as T\n            each(value, (val, key) => {\n                if (!COPY_IN_PROGRESS_SET.has(val)) {\n                    ;(result as any)[key] = internalDeepCircularCopy(val, key)\n                }\n            })\n        }\n        return result\n    }\n    return internalDeepCircularCopy(value)\n}\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n    object: T,\n    maxStringLength: number\n): T {\n    return deepCircularCopy(object, (value: any) => {\n        if (isString(value)) {\n            return (value as string).slice(0, maxStringLength)\n        }\n        return value\n    }) as T\n}\n\n// NOTE: Update PostHogConfig docs if you change this list\n// We will not try to catch all bullets here, but we should make an effort to catch the most common ones\n// You should be highly against adding more to this list, because ultimately customers can configure\n// their `cross_subdomain_cookie` setting to anything they want.\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = ['herokuapp.com', 'vercel.app', 'netlify.app']\nexport function isCrossDomainCookie(documentLocation: Location | undefined) {\n    const hostname = documentLocation?.hostname\n\n    if (!isString(hostname)) {\n        return false\n    }\n    // split and slice isn't a great way to match arbitrary domains,\n    // but it's good enough for ensuring we only match herokuapp.com when it is the TLD\n    // for the hostname\n    const lastTwoParts = hostname.split('.').slice(-2).join('.')\n\n    for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE) {\n        if (lastTwoParts === excluded) {\n            return false\n        }\n    }\n\n    return true\n}\n\n// Use this instead of element.addEventListener to avoid eslint errors\n// this properly implements the default options for passive event listeners\nexport function addEventListener(\n    element: Window | Document | Element | undefined,\n    event: string,\n    callback: EventListener,\n    options?: AddEventListenerOptions\n): void {\n    const { capture = false, passive = true } = options ?? {}\n\n    // This is the only place where we are allowed to call this function\n    // because the whole idea is that we should be calling this instead of the built-in one\n    // eslint-disable-next-line posthog-js/no-add-event-listener\n    element?.addEventListener(event, callback, { capture, passive })\n}\n\n/**\n * Helper to migrate deprecated config fields to new field names with appropriate warnings\n * @param config - The config object to check\n * @param newField - The new field name to use\n * @param oldField - The deprecated field name to check for\n * @param defaultValue - The default value if neither field is set\n * @param loggerInstance - Optional logger instance for deprecation warnings\n * @returns The value to use (new field takes precedence over old field)\n */\nexport function migrateConfigField<T>(\n    config: Record<string, any>,\n    newField: string,\n    oldField: string,\n    defaultValue: T,\n    loggerInstance?: { warn: (message: string) => void }\n): T {\n    const hasNewField = newField in config && !isNullish(config[newField])\n    const hasOldField = oldField in config && !isNullish(config[oldField])\n\n    if (hasNewField) {\n        return config[newField]\n    }\n\n    if (hasOldField) {\n        if (loggerInstance) {\n            loggerInstance.warn(\n                `Config field '${oldField}' is deprecated. Please use '${newField}' instead. ` +\n                    `The old field will be removed in a future major version.`\n            )\n        }\n        return config[oldField]\n    }\n\n    return defaultValue\n}\n\nconst TOOLBAR_INTERNAL_INSTANCE_NAME = 'ph_toolbar_internal'\n\nexport function isToolbarInstance(config: Pick<PostHogConfig, 'name'>): boolean {\n    return config.name === TOOLBAR_INTERNAL_INSTANCE_NAME\n}\n", "/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nimport { window } from './utils/globals'\n\nimport { isNumber, isUndefined } from '@posthog/core'\n\nif (!Math.trunc) {\n    Math.trunc = function (v) {\n        return v < 0 ? Math.ceil(v) : Math.floor(v)\n    }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n    Number.isInteger = function (value) {\n        return isNumber(value) && isFinite(value) && Math.floor(value) === value\n    }\n}\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n    /** @param bytes - The 16-byte byte array representation. */\n    constructor(readonly bytes: Readonly<Uint8Array>) {\n        if (bytes.length !== 16) {\n            throw new TypeError('not 128-bit length')\n        }\n    }\n\n    /**\n     * Builds a byte array from UUIDv7 field values.\n     *\n     * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n     * @param randA - A 12-bit `rand_a` field value.\n     * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n     * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n     */\n    static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n        if (\n            !Number.isInteger(unixTsMs) ||\n            !Number.isInteger(randA) ||\n            !Number.isInteger(randBHi) ||\n            !Number.isInteger(randBLo) ||\n            unixTsMs < 0 ||\n            randA < 0 ||\n            randBHi < 0 ||\n            randBLo < 0 ||\n            unixTsMs > 0xffff_ffff_ffff ||\n            randA > 0xfff ||\n            randBHi > 0x3fff_ffff ||\n            randBLo > 0xffff_ffff\n        ) {\n            throw new RangeError('invalid field value')\n        }\n\n        const bytes = new Uint8Array(16)\n        bytes[0] = unixTsMs / 2 ** 40\n        bytes[1] = unixTsMs / 2 ** 32\n        bytes[2] = unixTsMs / 2 ** 24\n        bytes[3] = unixTsMs / 2 ** 16\n        bytes[4] = unixTsMs / 2 ** 8\n        bytes[5] = unixTsMs\n        bytes[6] = 0x70 | (randA >>> 8)\n        bytes[7] = randA\n        bytes[8] = 0x80 | (randBHi >>> 24)\n        bytes[9] = randBHi >>> 16\n        bytes[10] = randBHi >>> 8\n        bytes[11] = randBHi\n        bytes[12] = randBLo >>> 24\n        bytes[13] = randBLo >>> 16\n        bytes[14] = randBLo >>> 8\n        bytes[15] = randBLo\n        return new UUID(bytes)\n    }\n\n    /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n    toString(): string {\n        let text = ''\n        for (let i = 0; i < this.bytes.length; i++) {\n            text = text + (this.bytes[i] >>> 4).toString(16) + (this.bytes[i] & 0xf).toString(16)\n            if (i === 3 || i === 5 || i === 7 || i === 9) {\n                text += '-'\n            }\n        }\n\n        if (text.length !== 36) {\n            // We saw one customer whose bundling code was mangling the UUID generation\n            // rather than accept a bad UUID, we throw an error here.\n            throw new Error('Invalid UUIDv7 was generated')\n        }\n        return text\n    }\n\n    /** Creates an object from `this`. */\n    clone(): UUID {\n        return new UUID(this.bytes.slice(0))\n    }\n\n    /** Returns true if `this` is equivalent to `other`. */\n    equals(other: UUID): boolean {\n        return this.compareTo(other) === 0\n    }\n\n    /**\n     * Returns a negative integer, zero, or positive integer if `this` is less\n     * than, equal to, or greater than `other`, respectively.\n     */\n    compareTo(other: UUID): number {\n        for (let i = 0; i < 16; i++) {\n            const diff = this.bytes[i] - other.bytes[i]\n            if (diff !== 0) {\n                return Math.sign(diff)\n            }\n        }\n        return 0\n    }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n    private _timestamp = 0\n    private _counter = 0\n    private readonly _random = new DefaultRandom()\n\n    /**\n     * Generates a new UUIDv7 object from the current timestamp, or resets the\n     * generator upon significant timestamp rollback.\n     *\n     * This method returns monotonically increasing UUIDs unless the up-to-date\n     * timestamp is significantly (by ten seconds or more) smaller than the one\n     * embedded in the immediately preceding UUID. If such a significant clock\n     * rollback is detected, this method resets the generator and returns a new\n     * UUID based on the current timestamp.\n     */\n    generate(): UUID {\n        const value = this.generateOrAbort()\n        if (!isUndefined(value)) {\n            return value\n        } else {\n            // reset state and resume\n            this._timestamp = 0\n            const valueAfterReset = this.generateOrAbort()\n            if (isUndefined(valueAfterReset)) {\n                throw new Error('Could not generate UUID after timestamp reset')\n            }\n            return valueAfterReset\n        }\n    }\n\n    /**\n     * Generates a new UUIDv7 object from the current timestamp, or returns\n     * `undefined` upon significant timestamp rollback.\n     *\n     * This method returns monotonically increasing UUIDs unless the up-to-date\n     * timestamp is significantly (by ten seconds or more) smaller than the one\n     * embedded in the immediately preceding UUID. If such a significant clock\n     * rollback is detected, this method aborts and returns `undefined`.\n     */\n    generateOrAbort(): UUID | undefined {\n        const MAX_COUNTER = 0x3ff_ffff_ffff\n        const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n        const ts = Date.now()\n        if (ts > this._timestamp) {\n            this._timestamp = ts\n            this._resetCounter()\n        } else if (ts + ROLLBACK_ALLOWANCE > this._timestamp) {\n            // go on with previous timestamp if new one is not much smaller\n            this._counter++\n            if (this._counter > MAX_COUNTER) {\n                // increment timestamp at counter overflow\n                this._timestamp++\n                this._resetCounter()\n            }\n        } else {\n            // abort if clock went backwards to unbearable extent\n            return undefined\n        }\n\n        return UUID.fromFieldsV7(\n            this._timestamp,\n            Math.trunc(this._counter / 2 ** 30),\n            this._counter & (2 ** 30 - 1),\n            this._random.nextUint32()\n        )\n    }\n\n    /** Initializes the counter at a 42-bit random integer. */\n    private _resetCounter(): void {\n        this._counter = this._random.nextUint32() * 0x400 + (this._random.nextUint32() & 0x3ff)\n    }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n    // fall back on Math.random() unless the flag is set to true\n    // TRICKY: don't use the isUndefined method here as can't pass the reference\n    if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n        throw new Error('no cryptographically strong RNG available')\n    }\n\n    for (let i = 0; i < buffer.length; i++) {\n        buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n    }\n    return buffer\n}\n\n// detect Web Crypto API\nif (window && !isUndefined(window.crypto) && crypto.getRandomValues) {\n    getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n    private readonly _buffer = new Uint32Array(8)\n    private _cursor = Infinity\n    nextUint32(): number {\n        if (this._cursor >= this._buffer.length) {\n            getRandomValues(this._buffer)\n            this._cursor = 0\n        }\n        return this._buffer[this._cursor++]\n    }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n\nexport const uuid7ToTimestampMs = (uuid: string): number => {\n    // remove hyphens\n    const hex = uuid.replace(/-/g, '')\n    // ensure that it's a version 7 UUID\n    if (hex.length !== 32) {\n        throw new Error('Not a valid UUID')\n    }\n    if (hex[12] !== '7') {\n        throw new Error('Not a UUIDv7')\n    }\n    // the first 6 bytes are the timestamp, which means that we can read only the first 12 hex characters\n    return parseInt(hex.substring(0, 12), 16)\n}\n", "import { extend } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport {\n    DEVICE_ID,\n    DISTINCT_ID,\n    ENABLE_PERSON_PROCESSING,\n    INITIAL_PERSON_INFO,\n    SESSION_ID,\n    SESSION_RECORDING_IS_SAMPLED,\n    USER_STATE,\n} from './constants'\n\nimport { isNull, isUndefined } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window, document } from './utils/globals'\nimport { uuidv7 } from './uuidv7'\n\n// we store the discovered subdomain in memory because it might be read multiple times\nlet firstNonPublicSubDomain = ''\n\n// helper to allow tests to clear this \"cache\"\nexport const resetSubDomainCache = () => {\n    firstNonPublicSubDomain = ''\n}\n\n/**\n * Browsers don't offer a way to check if something is a public suffix\n * e.g. `.com.au`, `.io`, `.org.uk`\n *\n * But they do reject cookies set on public suffixes\n * Setting a cookie on `.co.uk` would mean it was sent for every `.co.uk` site visited\n *\n * So, we can use this to check if a domain is a public suffix\n * by trying to set a cookie on a subdomain of the provided hostname\n * until the browser accepts it\n *\n * inspired by https://github.com/AngusFu/browser-root-domain\n */\nexport function seekFirstNonPublicSubDomain(hostname: string, cookieJar = document): string {\n    if (firstNonPublicSubDomain) {\n        return firstNonPublicSubDomain\n    }\n\n    if (!cookieJar) {\n        return ''\n    }\n    if (['localhost', '127.0.0.1'].includes(hostname)) return ''\n\n    const list = hostname.split('.')\n    let len = Math.min(list.length, 8) // paranoia - we know this number should be small\n    const key = 'dmn_chk_' + uuidv7()\n\n    while (!firstNonPublicSubDomain && len--) {\n        const candidate = list.slice(len).join('.')\n        const candidateCookieValue = key + '=1;domain=.' + candidate + ';path=/'\n\n        // try to set cookie, include a short expiry in seconds since we'll check immediately\n        cookieJar.cookie = candidateCookieValue + ';max-age=3'\n\n        if (cookieJar.cookie.includes(key)) {\n            // the cookie was accepted by the browser, remove the test cookie\n            cookieJar.cookie = candidateCookieValue + ';max-age=0'\n            firstNonPublicSubDomain = candidate\n        }\n    }\n\n    return firstNonPublicSubDomain\n}\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z]{2,}$/i\nconst originalCookieDomainFn = (hostname: string): string => {\n    const matches = hostname.match(DOMAIN_MATCH_REGEX)\n    return matches ? matches[0] : ''\n}\n\nexport function chooseCookieDomain(hostname: string, cross_subdomain: boolean | undefined): string {\n    if (cross_subdomain) {\n        // NOTE: Could we use this for cross domain tracking?\n        let matchedSubDomain = seekFirstNonPublicSubDomain(hostname)\n\n        if (!matchedSubDomain) {\n            const originalMatch = originalCookieDomainFn(hostname)\n            if (originalMatch !== matchedSubDomain) {\n                logger.info('Warning: cookie subdomain discovery mismatch', originalMatch, matchedSubDomain)\n            }\n            matchedSubDomain = originalMatch\n        }\n\n        return matchedSubDomain ? '; domain=.' + matchedSubDomain : ''\n    }\n    return ''\n}\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n    _is_supported: () => !!document,\n\n    _error: function (msg) {\n        logger.error('cookieStore error: ' + msg)\n    },\n\n    _get: function (name) {\n        if (!document) {\n            return\n        }\n\n        try {\n            const nameEQ = name + '='\n            const ca = document.cookie.split(';').filter((x) => x.length)\n            for (let i = 0; i < ca.length; i++) {\n                let c = ca[i]\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1, c.length)\n                }\n                if (c.indexOf(nameEQ) === 0) {\n                    return decodeURIComponent(c.substring(nameEQ.length, c.length))\n                }\n            }\n        } catch {}\n        return null\n    },\n\n    _parse: function (name) {\n        let cookie\n        try {\n            cookie = JSON.parse(cookieStore._get(name)) || {}\n        } catch {\n            // noop\n        }\n        return cookie\n    },\n\n    _set: function (name, value, days, cross_subdomain, is_secure) {\n        if (!document) {\n            return\n        }\n        try {\n            let expires = '',\n                secure = ''\n\n            const cdomain = chooseCookieDomain(document.location.hostname, cross_subdomain)\n\n            if (days) {\n                const date = new Date()\n                date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n                expires = '; expires=' + date.toUTCString()\n            }\n\n            if (is_secure) {\n                secure = '; secure'\n            }\n\n            const new_cookie_val =\n                name +\n                '=' +\n                encodeURIComponent(JSON.stringify(value)) +\n                expires +\n                '; SameSite=Lax; path=/' +\n                cdomain +\n                secure\n\n            // 4096 bytes is the size at which some browsers (e.g. firefox) will not store a cookie, warn slightly before that\n            if (new_cookie_val.length > 4096 * 0.9) {\n                logger.warn('cookieStore warning: large cookie, len=' + new_cookie_val.length)\n            }\n\n            document.cookie = new_cookie_val\n            return new_cookie_val\n        } catch {\n            return\n        }\n    },\n\n    _remove: function (name, cross_subdomain) {\n        if (!document?.cookie) {\n            return\n        }\n        try {\n            cookieStore._set(name, '', -1, cross_subdomain)\n        } catch {\n            return\n        }\n    },\n}\n\nlet _localStorage_supported: boolean | null = null\nexport const resetLocalStorageSupported = () => {\n    _localStorage_supported = null\n}\n\nexport const localStore: PersistentStore = {\n    _is_supported: function () {\n        if (!isNull(_localStorage_supported)) {\n            return _localStorage_supported\n        }\n\n        let supported = true\n        if (!isUndefined(window)) {\n            try {\n                const key = '__mplssupport__',\n                    val = 'xyz'\n                localStore._set(key, val)\n                if (localStore._get(key) !== '\"xyz\"') {\n                    supported = false\n                }\n                localStore._remove(key)\n            } catch {\n                supported = false\n            }\n        } else {\n            supported = false\n        }\n        if (!supported) {\n            logger.error('localStorage unsupported; falling back to cookie store')\n        }\n\n        _localStorage_supported = supported\n        return supported\n    },\n\n    _error: function (msg) {\n        logger.error('localStorage error: ' + msg)\n    },\n\n    _get: function (name) {\n        try {\n            return window?.localStorage.getItem(name)\n        } catch (err) {\n            localStore._error(err)\n        }\n        return null\n    },\n\n    _parse: function (name) {\n        try {\n            return JSON.parse(localStore._get(name)) || {}\n        } catch {\n            // noop\n        }\n        return null\n    },\n\n    _set: function (name, value) {\n        try {\n            window?.localStorage.setItem(name, JSON.stringify(value))\n        } catch (err) {\n            localStore._error(err)\n        }\n    },\n\n    _remove: function (name) {\n        try {\n            window?.localStorage.removeItem(name)\n        } catch (err) {\n            localStore._error(err)\n        }\n    },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [\n    DEVICE_ID,\n    DISTINCT_ID,\n    SESSION_ID,\n    SESSION_RECORDING_IS_SAMPLED,\n    ENABLE_PERSON_PROCESSING,\n    INITIAL_PERSON_INFO,\n    USER_STATE,\n]\n\n/**\n * Creates a localPlusCookieStore instance with custom cookie-persisted properties\n */\nexport const createLocalPlusCookieStore = (customCookieProperties: readonly string[] = []): PersistentStore => {\n    const cookiePropertiesToPersist = [...COOKIE_PERSISTED_PROPERTIES, ...customCookieProperties]\n\n    return {\n        ...localStore,\n        _parse: function (name) {\n            try {\n                let cookieProperties: Properties = {}\n                try {\n                    // See if there's a cookie stored with data.\n                    cookieProperties = cookieStore._parse(name) || {}\n                } catch {}\n                const value = extend(cookieProperties, JSON.parse(localStore._get(name) || '{}'))\n                localStore._set(name, value)\n                return value\n            } catch {\n                // noop\n            }\n            return null\n        },\n\n        _set: function (name, value, days, cross_subdomain, is_secure, debug) {\n            try {\n                localStore._set(name, value, undefined, undefined, debug)\n                const cookiePersistedProperties: Record<string, any> = {}\n                cookiePropertiesToPersist.forEach((key) => {\n                    if (value[key]) {\n                        cookiePersistedProperties[key] = value[key]\n                    }\n                })\n\n                if (Object.keys(cookiePersistedProperties).length) {\n                    cookieStore._set(name, cookiePersistedProperties, days, cross_subdomain, is_secure, debug)\n                }\n            } catch (err) {\n                localStore._error(err)\n            }\n        },\n\n        _remove: function (name, cross_subdomain) {\n            try {\n                window?.localStorage.removeItem(name)\n                cookieStore._remove(name, cross_subdomain)\n            } catch (err) {\n                localStore._error(err)\n            }\n        },\n    }\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n    _is_supported: function () {\n        return true\n    },\n\n    _error: function (msg) {\n        logger.error('memoryStorage error: ' + msg)\n    },\n\n    _get: function (name) {\n        return memoryStorage[name] || null\n    },\n\n    _parse: function (name) {\n        return memoryStorage[name] || null\n    },\n\n    _set: function (name, value) {\n        memoryStorage[name] = value\n    },\n\n    _remove: function (name) {\n        delete memoryStorage[name]\n    },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n    sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n    _is_supported: function () {\n        if (!isNull(sessionStorageSupported)) {\n            return sessionStorageSupported\n        }\n        sessionStorageSupported = true\n        if (!isUndefined(window)) {\n            try {\n                const key = '__support__',\n                    val = 'xyz'\n                sessionStore._set(key, val)\n                if (sessionStore._get(key) !== '\"xyz\"') {\n                    sessionStorageSupported = false\n                }\n                sessionStore._remove(key)\n            } catch {\n                sessionStorageSupported = false\n            }\n        } else {\n            sessionStorageSupported = false\n        }\n        return sessionStorageSupported\n    },\n\n    _error: function (msg) {\n        logger.error('sessionStorage error: ', msg)\n    },\n\n    _get: function (name) {\n        try {\n            return window?.sessionStorage.getItem(name)\n        } catch (err) {\n            sessionStore._error(err)\n        }\n        return null\n    },\n\n    _parse: function (name) {\n        try {\n            return JSON.parse(sessionStore._get(name)) || null\n        } catch {\n            // noop\n        }\n        return null\n    },\n\n    _set: function (name, value) {\n        try {\n            window?.sessionStorage.setItem(name, JSON.stringify(value))\n        } catch (err) {\n            sessionStore._error(err)\n        }\n    },\n\n    _remove: function (name) {\n        try {\n            window?.sessionStorage.removeItem(name)\n        } catch (err) {\n            sessionStore._error(err)\n        }\n    },\n}\n", "import { PostHog } from './posthog-core'\nimport { COOKIELESS_ALWAYS, COOKIELESS_ON_REJECT } from './constants'\nimport { assignableWindow, navigator } from './utils/globals'\nimport { cookieStore, localStore } from './storage'\nimport { PersistentStore } from './types'\nimport { isNoLike, isYesLike } from '@posthog/core'\n\nconst OPT_OUT_PREFIX = '__ph_opt_in_out_'\n\nexport const ConsentStatus = {\n    PENDING: -1,\n    DENIED: 0,\n    GRANTED: 1,\n} as const\nexport type ConsentStatus = (typeof ConsentStatus)[keyof typeof ConsentStatus]\n\n/**\n * ConsentManager provides tools for managing user consent as configured by the application.\n */\nexport class ConsentManager {\n    private _persistentStore?: PersistentStore\n\n    constructor(private _instance: PostHog) {}\n\n    private get _config() {\n        return this._instance.config\n    }\n\n    public get consent(): ConsentStatus {\n        if (this._getDnt()) {\n            return ConsentStatus.DENIED\n        }\n\n        return this._storedConsent\n    }\n\n    public isOptedOut() {\n        if (this._config.cookieless_mode === COOKIELESS_ALWAYS) {\n            return true\n        }\n        // we are opted out if we are rejected, or if consent is pending and we are in cookieless mode \"on_reject\"\n        return (\n            this.isRejected() ||\n            (this.consent === ConsentStatus.PENDING && this._config.cookieless_mode === COOKIELESS_ON_REJECT)\n        )\n    }\n\n    public isOptedIn() {\n        return !this.isOptedOut()\n    }\n\n    public isExplicitlyOptedOut() {\n        return this.consent === ConsentStatus.DENIED\n    }\n\n    public isRejected() {\n        return (\n            this.consent === ConsentStatus.DENIED ||\n            (this.consent === ConsentStatus.PENDING && this._config.opt_out_capturing_by_default)\n        )\n    }\n\n    public optInOut(isOptedIn: boolean) {\n        this._storage._set(\n            this._storageKey,\n            isOptedIn ? 1 : 0,\n            this._config.cookie_expiration,\n            this._config.cross_subdomain_cookie,\n            this._config.secure_cookie\n        )\n    }\n\n    public reset() {\n        this._storage._remove(this._storageKey, this._config.cross_subdomain_cookie)\n    }\n\n    private get _storageKey() {\n        const { token, opt_out_capturing_cookie_prefix, consent_persistence_name } = this._instance.config\n        if (consent_persistence_name) {\n            return consent_persistence_name\n        } else if (opt_out_capturing_cookie_prefix) {\n            // Deprecated, but we still support it for backwards compatibility.\n            // This was deprecated because it differed in behaviour from storage.ts, and appends the token.\n            // This meant it was not possible to share the same consent state across multiple PostHog instances,\n            // and made it harder for people to migrate from other systems.\n            return opt_out_capturing_cookie_prefix + token\n        } else {\n            return OPT_OUT_PREFIX + token\n        }\n    }\n\n    private get _storedConsent(): ConsentStatus {\n        const value = this._storage._get(this._storageKey)\n        // be somewhat permissive in what we accept as yes/opt-in, to make it easier for people to migrate from other systems\n        return isYesLike(value) ? ConsentStatus.GRANTED : isNoLike(value) ? ConsentStatus.DENIED : ConsentStatus.PENDING\n    }\n\n    private get _storage() {\n        // Re-evaluate the store on every access so that a config change after the first\n        // access (e.g. init() called after _dom_loaded() fires in bundled apps) is picked\n        // up and any value already stored under the old backend is migrated across.\n        const persistenceType = this._config.opt_out_capturing_persistence_type\n        const expectedStore = persistenceType === 'localStorage' ? localStore : cookieStore\n\n        if (!this._persistentStore || this._persistentStore !== expectedStore) {\n            this._persistentStore = expectedStore\n            const otherStorage = persistenceType === 'localStorage' ? cookieStore : localStore\n\n            if (otherStorage._get(this._storageKey)) {\n                if (!this._persistentStore._get(this._storageKey)) {\n                    // This indicates we have moved to a new storage format so we migrate the value over\n                    this.optInOut(isYesLike(otherStorage._get(this._storageKey)))\n                }\n\n                otherStorage._remove(this._storageKey, this._config.cross_subdomain_cookie)\n            }\n        }\n\n        return this._persistentStore\n    }\n\n    private _getDnt(): boolean {\n        if (!this._config.respect_dnt) {\n            return false\n        }\n        return [\n            navigator?.doNotTrack, // standard\n            (navigator as any)?.['msDoNotTrack'],\n            assignableWindow['doNotTrack'],\n        ].some((dntValue) => isYesLike(dntValue))\n    }\n}\n", "import { PostHog } from '../posthog-core'\nimport { DEAD_CLICKS_ENABLED_SERVER_SIDE } from '../constants'\nimport { isBoolean, isObject } from '@posthog/core'\nimport { assignableWindow, document, LazyLoadedDeadClicksAutocaptureInterface } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\nimport { DeadClicksAutoCaptureConfig, RemoteConfig } from '../types'\nimport type { Extension } from './types'\n\nconst logger = createLogger('[Dead Clicks]')\n\nexport const isDeadClicksEnabledForHeatmaps = () => {\n    return true\n}\nexport const isDeadClicksEnabledForAutocapture = (instance: DeadClicksAutocapture) => {\n    const isRemoteEnabled = !!instance.instance.persistence?.get_property(DEAD_CLICKS_ENABLED_SERVER_SIDE)\n    const clientConfig = instance.instance.config.capture_dead_clicks\n    if (isBoolean(clientConfig)) {\n        return clientConfig\n    }\n    if (isObject(clientConfig)) {\n        return true\n    }\n    return isRemoteEnabled\n}\n\nexport class DeadClicksAutocapture implements Extension {\n    get lazyLoadedDeadClicksAutocapture(): LazyLoadedDeadClicksAutocaptureInterface | undefined {\n        return this._lazyLoadedDeadClicksAutocapture\n    }\n\n    private _lazyLoadedDeadClicksAutocapture: LazyLoadedDeadClicksAutocaptureInterface | undefined\n\n    constructor(\n        readonly instance: PostHog,\n        readonly isEnabled: (dca: DeadClicksAutocapture) => boolean,\n        readonly onCapture?: DeadClicksAutoCaptureConfig['__onCapture']\n    ) {\n        this.startIfEnabledOrStop()\n    }\n\n    public onRemoteConfig(response: RemoteConfig) {\n        if (!('captureDeadClicks' in response)) {\n            return\n        }\n\n        if (this.instance.persistence) {\n            this.instance.persistence.register({\n                [DEAD_CLICKS_ENABLED_SERVER_SIDE]: response.captureDeadClicks,\n            })\n        }\n        this.startIfEnabledOrStop()\n    }\n\n    public startIfEnabledOrStop() {\n        if (this.isEnabled(this)) {\n            this._loadScript(() => {\n                this._start()\n            })\n        } else {\n            this.stop()\n        }\n    }\n\n    private _loadScript(cb: () => void): void {\n        if (assignableWindow.__PosthogExtensions__?.initDeadClicksAutocapture) {\n            // already loaded\n            cb()\n        }\n        assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n            this.instance,\n            'dead-clicks-autocapture',\n            (err) => {\n                if (err) {\n                    logger.error('failed to load script', err)\n                    return\n                }\n                cb()\n            }\n        )\n    }\n\n    private _start() {\n        if (!document) {\n            logger.error('`document` not found. Cannot start.')\n            return\n        }\n\n        if (\n            !this._lazyLoadedDeadClicksAutocapture &&\n            assignableWindow.__PosthogExtensions__?.initDeadClicksAutocapture\n        ) {\n            const config = isObject(this.instance.config.capture_dead_clicks)\n                ? this.instance.config.capture_dead_clicks\n                : {}\n            config.__onCapture = this.onCapture\n\n            this._lazyLoadedDeadClicksAutocapture = assignableWindow.__PosthogExtensions__.initDeadClicksAutocapture(\n                this.instance,\n                config\n            )\n            this._lazyLoadedDeadClicksAutocapture.start(document)\n            logger.info(`starting...`)\n        }\n    }\n\n    stop() {\n        if (this._lazyLoadedDeadClicksAutocapture) {\n            this._lazyLoadedDeadClicksAutocapture.stop()\n            this._lazyLoadedDeadClicksAutocapture = undefined\n            logger.info(`stopping...`)\n        }\n    }\n}\n", "/**\n * Extend Segment with extra PostHog JS functionality. Required for things like Recordings and feature flags to work correctly.\n *\n * ### Usage\n *\n *  ```js\n *  // After your standard segment anyalytics install\n *  analytics.load(\"GOEDfA21zZTtR7clsBuDvmBKAtAdZ6Np\");\n *\n *  analytics.ready(() => {\n *    posthog.init('<posthog-api-key>', {\n *      capture_pageview: false,\n *      segment: window.analytics, // NOTE: Be sure to use window.analytics here!\n *    });\n *    window.analytics.page();\n *  })\n *  ```\n */\nimport { PostHog } from '../posthog-core'\nimport { createLogger } from '../utils/logger'\n\nimport { EVENT_IDENTIFY, EVENT_PAGEVIEW, USER_STATE, USER_STATE_IDENTIFIED } from '../constants'\nimport { isFunction } from '@posthog/core'\nimport { uuidv7 } from '../uuidv7'\n\nimport type { SegmentUser, SegmentAnalytics, SegmentContext, SegmentPlugin } from '@posthog/types'\n\n// Re-export for backwards compatibility\nexport type { SegmentUser, SegmentAnalytics, SegmentContext, SegmentPlugin }\n\nconst logger = createLogger('[SegmentIntegration]')\n\nconst createSegmentIntegration = (posthog: PostHog): SegmentPlugin => {\n    if (!Promise || !Promise.resolve) {\n        logger.warn('This browser does not have Promise support, and can not use the segment integration')\n    }\n\n    const enrichEvent = (ctx: SegmentContext, eventName: string | undefined) => {\n        if (!eventName) {\n            return ctx\n        }\n        if (!ctx.event.userId && ctx.event.anonymousId !== posthog.get_distinct_id()) {\n            // This is our only way of detecting that segment's analytics.reset() has been called so we also call it\n            logger.info('No userId set, resetting PostHog')\n            posthog.reset()\n        }\n        if (ctx.event.userId && ctx.event.userId !== posthog.get_distinct_id()) {\n            logger.info('UserId set, identifying with PostHog')\n            posthog.identify(ctx.event.userId)\n        }\n\n        const additionalProperties = posthog.calculateEventProperties(eventName, ctx.event.properties)\n        ctx.event.properties = Object.assign({}, additionalProperties, ctx.event.properties)\n        return ctx\n    }\n\n    return {\n        name: 'PostHog JS',\n        type: 'enrichment',\n        version: '1.0.0',\n        isLoaded: () => true,\n        // check and early return above\n        // eslint-disable-next-line compat/compat\n        load: () => Promise.resolve(),\n        track: (ctx) => enrichEvent(ctx, ctx.event.event),\n        page: (ctx) => enrichEvent(ctx, EVENT_PAGEVIEW),\n        identify: (ctx) => enrichEvent(ctx, EVENT_IDENTIFY),\n        screen: (ctx) => enrichEvent(ctx, '$screen'),\n    }\n}\n\nfunction setupPostHogFromSegment(posthog: PostHog, done: () => void) {\n    const segment = posthog.config.segment\n    if (!segment) {\n        return done()\n    }\n\n    const bootstrapUser = (user: SegmentUser) => {\n        // Use segments anonymousId instead\n        const getSegmentAnonymousId = () => user.anonymousId() || uuidv7()\n        posthog.config.get_device_id = getSegmentAnonymousId\n\n        // If a segment user ID exists, set it as the distinct_id\n        if (user.id()) {\n            posthog.register({\n                distinct_id: user.id(),\n                $device_id: getSegmentAnonymousId(),\n            })\n            posthog.persistence!.set_property(USER_STATE, USER_STATE_IDENTIFIED)\n        }\n\n        done()\n    }\n\n    const segmentUser = segment.user()\n    if ('then' in segmentUser && isFunction(segmentUser.then)) {\n        segmentUser.then(bootstrapUser)\n    } else {\n        bootstrapUser(segmentUser as SegmentUser)\n    }\n}\n\nexport function setupSegmentIntegration(posthog: PostHog, done: () => void) {\n    const segment = posthog.config.segment\n    if (!segment) {\n        return done()\n    }\n\n    setupPostHogFromSegment(posthog, () => {\n        segment.register(createSegmentIntegration(posthog)).then(() => {\n            done()\n        })\n    })\n}\n", "/**\n * Integrate Sentry with PostHog. This will add a direct link to the person in Sentry, and an $exception event in PostHog\n *\n * ### Usage\n *\n *     Sentry.init({\n *          dsn: 'https://example',\n *          integrations: [\n *              new posthog.SentryIntegration(posthog)\n *          ]\n *     })\n *\n * @param {Object} [posthog] The posthog object\n * @param {string} [organization] Optional: The Sentry organization, used to send a direct link from PostHog to Sentry\n * @param {Number} [projectId] Optional: The Sentry project id, used to send a direct link from PostHog to Sentry\n * @param {string} [prefix] Optional: Url of a self-hosted sentry instance (default: https://sentry.io/organizations/)\n * @param {SeverityLevel[] | '*'} [severityAllowList] Optional: send events matching the provided levels. Use '*' to send all events (default: ['error'])\n * @param {boolean} [sendExceptionsToPostHog] Optional: capture exceptions as events in PostHog (default: true)\n */\n\nimport { PostHog } from '../posthog-core'\nimport { SeverityLevel } from '../types'\n\n// NOTE - we can't import from @sentry/types because it changes frequently and causes clashes\n// We only use a small subset of the types, so we can just define the integration overall and use any for the rest\n\n// import {\n//     Event as _SentryEvent,\n//     EventProcessor as _SentryEventProcessor,\n//     Hub as _SentryHub,\n//     Integration as _SentryIntegration,\n//     SeverityLevel as _SeverityLevel,\n//     IntegrationClass as _SentryIntegrationClass,\n// } from '@sentry/types'\n\n// Uncomment the above and comment the below to get type checking for development\n\ntype _SentryEvent = any\ntype _SentryException = any\ntype _SentryEventProcessor = any\ntype _SentryHub = any\n\ninterface _SentryIntegration {\n    name: string\n    processEvent(event: _SentryEvent): _SentryEvent\n}\n\ninterface _SentryIntegrationClass {\n    name: string\n    setupOnce(addGlobalEventProcessor: (callback: _SentryEventProcessor) => void, getCurrentHub: () => _SentryHub): void\n}\n\ninterface SentryExceptionProperties {\n    $sentry_event_id: any\n    $sentry_exception: any\n    $sentry_exception_message: any\n    $sentry_exception_type: any\n    $sentry_tags: any\n    $sentry_url?: string\n}\n\nexport type SentryIntegrationOptions = {\n    organization?: string\n    projectId?: number\n    prefix?: string\n    severityAllowList?: SeverityLevel[] | '*'\n    sendExceptionsToPostHog?: boolean\n}\n\nconst NAME = 'posthog-js'\n\nexport function createEventProcessor(\n    _posthog: PostHog,\n    {\n        organization,\n        projectId,\n        prefix,\n        severityAllowList = ['error'],\n        sendExceptionsToPostHog = true,\n    }: SentryIntegrationOptions = {}\n): (event: _SentryEvent) => _SentryEvent {\n    return (event) => {\n        const shouldProcessLevel = severityAllowList === '*' || severityAllowList.includes(event.level as SeverityLevel)\n        if (!shouldProcessLevel || !_posthog.__loaded) return event\n        if (!event.tags) event.tags = {}\n\n        const personUrl = _posthog.requestRouter.endpointFor(\n            'ui',\n            `/project/${_posthog.config.token}/person/${_posthog.get_distinct_id()}`\n        )\n        event.tags['PostHog Person URL'] = personUrl\n        if (_posthog.sessionRecordingStarted()) {\n            event.tags['PostHog Recording URL'] = _posthog.get_session_replay_url({ withTimestamp: true })\n        }\n\n        const exceptions: _SentryException[] = event.exception?.values || []\n\n        const exceptionList = exceptions.map((exception) => {\n            return {\n                ...exception,\n                stacktrace: exception.stacktrace\n                    ? {\n                          ...exception.stacktrace,\n                          type: 'raw',\n                          frames: (exception.stacktrace.frames || []).map((frame: any) => {\n                              return { ...frame, platform: 'web:javascript' }\n                          }),\n                      }\n                    : undefined,\n            }\n        })\n\n        const data: SentryExceptionProperties & {\n            // two properties added to match any exception auto-capture\n            // added manually to avoid any dependency on the lazily loaded content\n            $exception_message: any\n            $exception_type: any\n            $exception_list: any\n            $exception_level: SeverityLevel\n        } = {\n            // PostHog Exception Properties,\n            $exception_message: exceptions[0]?.value || event.message,\n            $exception_type: exceptions[0]?.type,\n            $exception_level: event.level,\n            $exception_list: exceptionList,\n            // Sentry Exception Properties\n            $sentry_event_id: event.event_id,\n            $sentry_exception: event.exception,\n            $sentry_exception_message: exceptions[0]?.value || event.message,\n            $sentry_exception_type: exceptions[0]?.type,\n            $sentry_tags: event.tags,\n        }\n\n        if (organization && projectId) {\n            data['$sentry_url'] =\n                (prefix || 'https://sentry.io/organizations/') +\n                organization +\n                '/issues/?project=' +\n                projectId +\n                '&query=' +\n                event.event_id\n        }\n\n        if (sendExceptionsToPostHog) {\n            _posthog.exceptions?.sendExceptionEvent(data)\n        }\n\n        return event\n    }\n}\n\n// V8 integration - function based\nexport function sentryIntegration(_posthog: PostHog, options?: SentryIntegrationOptions): _SentryIntegration {\n    const processor = createEventProcessor(_posthog, options)\n    return {\n        name: NAME,\n        processEvent(event) {\n            return processor(event)\n        },\n    }\n}\n// V7 integration - class based\nexport class SentryIntegration implements _SentryIntegrationClass {\n    name: string\n\n    setupOnce: (\n        addGlobalEventProcessor: (callback: _SentryEventProcessor) => void,\n        getCurrentHub: () => _SentryHub\n    ) => void\n\n    constructor(\n        _posthog: PostHog,\n        organization?: string,\n        projectId?: number,\n        prefix?: string,\n        severityAllowList?: SeverityLevel[] | '*',\n        sendExceptionsToPostHog?: boolean\n    ) {\n        // setupOnce gets called by Sentry when it intializes the plugin\n        this.name = NAME\n        this.setupOnce = function (addGlobalEventProcessor: (callback: _SentryEventProcessor) => void) {\n            addGlobalEventProcessor(\n                createEventProcessor(_posthog, {\n                    organization,\n                    projectId,\n                    prefix,\n                    severityAllowList,\n                    sendExceptionsToPostHog: sendExceptionsToPostHog ?? true,\n                })\n            )\n        }\n    }\n}\n", "import { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { clampToRange, isUndefined } from '@posthog/core'\nimport { extend } from './utils'\nimport { logger } from './utils/logger'\nimport { SessionIdChangedCallback } from './types'\n\ninterface PageViewEventProperties {\n    $pageview_id?: string\n    $prev_pageview_id?: string\n    $prev_pageview_pathname?: string\n    $prev_pageview_duration?: number // seconds\n    $prev_pageview_last_scroll?: number\n    $prev_pageview_last_scroll_percentage?: number\n    $prev_pageview_max_scroll?: number\n    $prev_pageview_max_scroll_percentage?: number\n    $prev_pageview_last_content?: number\n    $prev_pageview_last_content_percentage?: number\n    $prev_pageview_max_content?: number\n    $prev_pageview_max_content_percentage?: number\n}\n\n// This keeps track of the PageView state (such as the previous PageView's path, timestamp, id, and scroll properties).\n// We store the state in memory, which means that for non-SPA sites, the state will be lost on page reload. This means\n// that non-SPA sites should always send a $pageleave event on any navigation, before the page unloads. For SPA sites,\n// they only need to send a $pageleave event when the user navigates away from the site, as the information is not lost\n// on an internal navigation, and is included as the $prev_pageview_ properties in the next $pageview event.\n\n// Practically, this means that to find the scroll properties for a given pageview, you need to find the event where\n// event name is $pageview or $pageleave and where $prev_pageview_id matches the original pageview event's id.\n\nexport class PageViewManager {\n    _currentPageview?: { timestamp: Date; pageViewId: string | undefined; pathname: string | undefined }\n    _instance: PostHog\n    private _unsubscribeSessionId?: () => void\n\n    constructor(instance: PostHog) {\n        this._instance = instance\n        this._setupSessionRotationHandler()\n    }\n\n    private _setupSessionRotationHandler(): void {\n        this._unsubscribeSessionId = this._instance.sessionManager?.onSessionId(this._onSessionIdChange)\n    }\n\n    private _onSessionIdChange: SessionIdChangedCallback = (sessionId, _windowId, changeReason) => {\n        // Only act on actual session rotations, not initial session creation\n        if (!changeReason) {\n            return\n        }\n\n        // Clear state when session changes for any of these reasons:\n        // - noSessionId: after posthog.reset() or forced idle reset\n        // - activityTimeout: 30 min idle (default, configurable up to 10 hours)\n        // - sessionPastMaximumLength: 24 hour max session\n        if (changeReason.noSessionId || changeReason.activityTimeout || changeReason.sessionPastMaximumLength) {\n            logger.info('[PageViewManager] Session rotated, clearing pageview state', {\n                sessionId,\n                changeReason,\n            })\n            this._currentPageview = undefined\n            this._instance.scrollManager.resetContext()\n        }\n    }\n\n    destroy(): void {\n        this._unsubscribeSessionId?.()\n        this._unsubscribeSessionId = undefined\n    }\n\n    doPageView(timestamp: Date, pageViewId?: string): PageViewEventProperties {\n        const response = this._previousPageViewProperties(timestamp, pageViewId)\n\n        // On a pageview we reset the contexts\n        this._currentPageview = { pathname: window?.location.pathname ?? '', pageViewId, timestamp }\n        this._instance.scrollManager.resetContext()\n\n        return response\n    }\n\n    doPageLeave(timestamp: Date): PageViewEventProperties {\n        return this._previousPageViewProperties(timestamp, this._currentPageview?.pageViewId)\n    }\n\n    doEvent(): PageViewEventProperties {\n        return { $pageview_id: this._currentPageview?.pageViewId }\n    }\n\n    private _previousPageViewProperties(timestamp: Date, pageviewId: string | undefined): PageViewEventProperties {\n        const previousPageView = this._currentPageview\n\n        if (!previousPageView) {\n            return { $pageview_id: pageviewId }\n        }\n\n        let properties: PageViewEventProperties = {\n            $pageview_id: pageviewId,\n            $prev_pageview_id: previousPageView.pageViewId,\n        }\n\n        const scrollContext = this._instance.scrollManager.getContext()\n\n        if (scrollContext && !this._instance.config.disable_scroll_properties) {\n            let { maxScrollHeight, lastScrollY, maxScrollY, maxContentHeight, lastContentY, maxContentY } =\n                scrollContext\n\n            if (\n                !isUndefined(maxScrollHeight) &&\n                !isUndefined(lastScrollY) &&\n                !isUndefined(maxScrollY) &&\n                !isUndefined(maxContentHeight) &&\n                !isUndefined(lastContentY) &&\n                !isUndefined(maxContentY)\n            ) {\n                // Use ceil, so that e.g. scrolling 999.5px of a 1000px page is considered 100% scrolled\n                maxScrollHeight = Math.ceil(maxScrollHeight)\n                lastScrollY = Math.ceil(lastScrollY)\n                maxScrollY = Math.ceil(maxScrollY)\n                maxContentHeight = Math.ceil(maxContentHeight)\n                lastContentY = Math.ceil(lastContentY)\n                maxContentY = Math.ceil(maxContentY)\n\n                // if the maximum scroll height is near 0, then the percentage is 1\n                const lastScrollPercentage =\n                    maxScrollHeight <= 1 ? 1 : clampToRange(lastScrollY / maxScrollHeight, 0, 1, logger)\n                const maxScrollPercentage =\n                    maxScrollHeight <= 1 ? 1 : clampToRange(maxScrollY / maxScrollHeight, 0, 1, logger)\n                const lastContentPercentage =\n                    maxContentHeight <= 1 ? 1 : clampToRange(lastContentY / maxContentHeight, 0, 1, logger)\n                const maxContentPercentage =\n                    maxContentHeight <= 1 ? 1 : clampToRange(maxContentY / maxContentHeight, 0, 1, logger)\n\n                properties = extend(properties, {\n                    $prev_pageview_last_scroll: lastScrollY,\n                    $prev_pageview_last_scroll_percentage: lastScrollPercentage,\n                    $prev_pageview_max_scroll: maxScrollY,\n                    $prev_pageview_max_scroll_percentage: maxScrollPercentage,\n                    $prev_pageview_last_content: lastContentY,\n                    $prev_pageview_last_content_percentage: lastContentPercentage,\n                    $prev_pageview_max_content: maxContentY,\n                    $prev_pageview_max_content_percentage: maxContentPercentage,\n                })\n            }\n        }\n\n        if (previousPageView.pathname) {\n            properties.$prev_pageview_pathname = previousPageView.pathname\n        }\n        if (previousPageView.timestamp) {\n            // Use seconds, for consistency with our other duration-related properties like $duration\n            properties.$prev_pageview_duration = (timestamp.getTime() - previousPageView.timestamp.getTime()) / 1000\n        }\n\n        return properties\n    }\n}\n", "import type { Properties } from './types'\n\nimport { isObject } from '@posthog/core'\n\nexport const transformEnabledFeatureFlagsToEventProperties = (value: Properties | undefined): Properties => {\n    if (!isObject(value)) {\n        return {}\n    }\n\n    const eventProperties: Properties = {}\n    const keys = Object.keys(value)\n    for (let i = 0; i < keys.length; i++) {\n        eventProperties[`$feature/${keys[i]}`] = value[keys[i]]\n    }\n    return eventProperties\n}\n", "import {\n    ALIAS_ID_KEY,\n    AUTOCAPTURE_DISABLED_SERVER_SIDE,\n    CAMPAIGN_IDS_KEY,\n    CAPTURE_RATE_LIMIT,\n    CLIENT_SESSION_PROPS,\n    CONVERSATIONS_LEGACY_TICKET_ID,\n    CONVERSATIONS_LEGACY_USER_TRAITS,\n    CONVERSATIONS_LEGACY_WIDGET_SESSION_ID,\n    CONVERSATIONS_LEGACY_WIDGET_STATE,\n    DEAD_CLICKS_ENABLED_SERVER_SIDE,\n    ENABLE_PERSON_PROCESSING,\n    ENABLED_FEATURE_FLAGS,\n    ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS,\n    ERROR_TRACKING_SUPPRESSION_RULES,\n    EVENT_TIMERS_KEY,\n    EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE,\n    FLAG_CALL_REPORTED,\n    FLAG_CALL_REPORTED_SESSION_ID,\n    HEATMAPS_ENABLED_SERVER_SIDE,\n    INITIAL_CAMPAIGN_PARAMS,\n    INITIAL_PERSON_INFO,\n    INITIAL_REFERRER_INFO,\n    PEOPLE_DISTINCT_ID_KEY,\n    PERSISTENCE_ACTIVE_FEATURE_FLAGS,\n    PERSISTENCE_EARLY_ACCESS_FEATURES,\n    PERSISTENCE_FEATURE_FLAG_DETAILS,\n    PERSISTENCE_FEATURE_FLAG_ERRORS,\n    PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n    PERSISTENCE_FEATURE_FLAG_PAYLOADS,\n    PERSISTENCE_FEATURE_FLAG_REQUEST_ID,\n    PERSISTENCE_OVERRIDE_FEATURE_FLAGS,\n    PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS,\n    PRODUCT_TOURS,\n    PRODUCT_TOURS_ACTIVATED,\n    PRODUCT_TOURS_ENABLED_SERVER_SIDE,\n    SDK_DEBUG_EXTENSIONS_INIT_METHOD,\n    SDK_DEBUG_EXTENSIONS_INIT_TIME_MS,\n    SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED,\n    SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS,\n    SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS,\n    SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS,\n    SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG,\n    SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT,\n    SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS,\n    SESSION_ID,\n    SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_START_REASON,\n    SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP,\n    SESSION_RECORDING_IS_SAMPLED,\n    SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n    SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n    SESSION_RECORDING_OVERRIDE_SAMPLING,\n    SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n    SESSION_RECORDING_PAST_MINIMUM_DURATION,\n    SESSION_RECORDING_REMOTE_CONFIG,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n    SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_ENABLED_SERVER_SIDE,\n    STORED_GROUP_PROPERTIES_KEY,\n    STORED_PERSON_PROPERTIES_KEY,\n    SURVEYS,\n    SURVEYS_ACTIVATED,\n    USER_STATE,\n    WEB_VITALS_ALLOWED_METRICS,\n    WEB_VITALS_ENABLED_SERVER_SIDE,\n} from './constants'\nimport { transformEnabledFeatureFlagsToEventProperties } from './persistence-key-transforms'\nimport type { Properties, Property } from './types'\n\n/**\n * - `event`: include the stored key/value on captured events as-is.\n * - `hidden`: keep the key in persistence only; never expose it on captured events.\n * - `derived`: do not expose the stored key directly, but derive one or more event properties from its value.\n *   For example, `ENABLED_FEATURE_FLAGS` is stored as `$enabled_feature_flags`, but exposed on events as\n *   `$feature/<flag-key>` properties via `transformToEventProperties`.\n */\nexport type PersistenceKeyExposure = 'event' | 'hidden' | 'derived'\n\ninterface PersistenceKeyPolicyEntry {\n    exposure: PersistenceKeyExposure\n    shouldSkipFromEventProperties?: (value: Property, shouldSkip: () => boolean) => boolean\n    transformToEventProperties?: (value: Property) => Properties\n}\n\nexport const PERSISTENCE_KEY_POLICY: Record<string, PersistenceKeyPolicyEntry> = {\n    [PEOPLE_DISTINCT_ID_KEY]: { exposure: 'hidden' },\n    [ALIAS_ID_KEY]: { exposure: 'hidden' },\n    [CAMPAIGN_IDS_KEY]: { exposure: 'hidden' },\n    [EVENT_TIMERS_KEY]: { exposure: 'hidden' },\n    [AUTOCAPTURE_DISABLED_SERVER_SIDE]: { exposure: 'event' },\n    [HEATMAPS_ENABLED_SERVER_SIDE]: { exposure: 'hidden' },\n    [EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]: { exposure: 'event' },\n    [ERROR_TRACKING_SUPPRESSION_RULES]: { exposure: 'hidden' },\n    [ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS]: { exposure: 'event' },\n    [WEB_VITALS_ENABLED_SERVER_SIDE]: { exposure: 'event' },\n    [DEAD_CLICKS_ENABLED_SERVER_SIDE]: { exposure: 'event' },\n    [PRODUCT_TOURS_ENABLED_SERVER_SIDE]: { exposure: 'hidden' },\n    [WEB_VITALS_ALLOWED_METRICS]: { exposure: 'event' },\n    [SESSION_RECORDING_REMOTE_CONFIG]: { exposure: 'hidden' },\n    [SESSION_RECORDING_ENABLED_SERVER_SIDE]: { exposure: 'hidden' },\n    [SESSION_ID]: { exposure: 'hidden' },\n    [SESSION_RECORDING_IS_SAMPLED]: { exposure: 'event' },\n    [SESSION_RECORDING_PAST_MINIMUM_DURATION]: { exposure: 'event' },\n    [SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION]: { exposure: 'event' },\n    [SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION]: { exposure: 'event' },\n    [SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP]: { exposure: 'event' },\n    [ENABLED_FEATURE_FLAGS]: {\n        exposure: 'derived',\n        shouldSkipFromEventProperties: (_, shouldSkip) => shouldSkip(),\n        transformToEventProperties: transformEnabledFeatureFlagsToEventProperties,\n    },\n    [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: { exposure: 'event' },\n    [PERSISTENCE_EARLY_ACCESS_FEATURES]: { exposure: 'hidden' },\n    [PERSISTENCE_FEATURE_FLAG_DETAILS]: { exposure: 'hidden' },\n    [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: { exposure: 'event' },\n    [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: { exposure: 'event' },\n    [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: { exposure: 'event' },\n    [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: { exposure: 'hidden' },\n    [STORED_PERSON_PROPERTIES_KEY]: { exposure: 'hidden' },\n    [STORED_GROUP_PROPERTIES_KEY]: { exposure: 'hidden' },\n    [SURVEYS]: { exposure: 'hidden' },\n    [SURVEYS_ACTIVATED]: { exposure: 'event' },\n    [PRODUCT_TOURS]: { exposure: 'hidden' },\n    [PRODUCT_TOURS_ACTIVATED]: { exposure: 'hidden' },\n    [CONVERSATIONS_LEGACY_WIDGET_SESSION_ID]: { exposure: 'event' },\n    [CONVERSATIONS_LEGACY_TICKET_ID]: { exposure: 'event' },\n    [CONVERSATIONS_LEGACY_WIDGET_STATE]: { exposure: 'event' },\n    [CONVERSATIONS_LEGACY_USER_TRAITS]: { exposure: 'event' },\n    [FLAG_CALL_REPORTED]: { exposure: 'hidden' },\n    [FLAG_CALL_REPORTED_SESSION_ID]: { exposure: 'hidden' },\n    [PERSISTENCE_FEATURE_FLAG_ERRORS]: { exposure: 'hidden' },\n    [PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]: { exposure: 'hidden' },\n    [USER_STATE]: { exposure: 'hidden' },\n    [CLIENT_SESSION_PROPS]: { exposure: 'hidden' },\n    [CAPTURE_RATE_LIMIT]: { exposure: 'hidden' },\n    [INITIAL_CAMPAIGN_PARAMS]: { exposure: 'hidden' },\n    [INITIAL_REFERRER_INFO]: { exposure: 'hidden' },\n    [INITIAL_PERSON_INFO]: { exposure: 'hidden' },\n    [ENABLE_PERSON_PROCESSING]: { exposure: 'hidden' },\n    [SESSION_RECORDING_OVERRIDE_SAMPLING]: { exposure: 'event' },\n    [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: { exposure: 'event' },\n    [SESSION_RECORDING_OVERRIDE_URL_TRIGGER]: { exposure: 'event' },\n    [SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: { exposure: 'event' },\n    [SDK_DEBUG_EXTENSIONS_INIT_METHOD]: { exposure: 'event' },\n    [SDK_DEBUG_EXTENSIONS_INIT_TIME_MS]: { exposure: 'event' },\n    [SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED]: { exposure: 'event' },\n    [SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS]: { exposure: 'event' },\n    [SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS]: { exposure: 'event' },\n    [SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS]: { exposure: 'event' },\n    [SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG]: { exposure: 'event' },\n    [SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT]: { exposure: 'event' },\n    [SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS]: { exposure: 'event' },\n    [SESSION_RECORDING_START_REASON]: { exposure: 'event' },\n}\n\nconst PERSISTENCE_KEY_PREFIX_POLICY: Array<[string, PersistenceKeyPolicyEntry]> = [\n    [SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX, { exposure: 'hidden' }],\n    [SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX, { exposure: 'hidden' }],\n    [SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX, { exposure: 'hidden' }],\n]\n\nexport const getPersistenceKeyPolicy = (key: string): PersistenceKeyPolicyEntry | undefined => {\n    const exactMatch = PERSISTENCE_KEY_POLICY[key]\n    if (exactMatch) {\n        return exactMatch\n    }\n\n    for (const [prefix, policy] of PERSISTENCE_KEY_PREFIX_POLICY) {\n        if (key.indexOf(prefix) === 0) {\n            return policy\n        }\n    }\n\n    return undefined\n}\n", "import { each } from './'\n\nimport { isArray, isFile, isUndefined } from '@posthog/core'\nimport { logger } from './logger'\nimport { document } from './globals'\n\nconst localDomains = ['localhost', '127.0.0.1']\n\n/**\n * IE11 doesn't support `new URL`\n * so we can create an anchor element and use that to parse the URL\n * there's a lot of overlap between HTMLHyperlinkElementUtils and URL\n * meaning useful properties like `pathname` are available on both\n */\nexport const convertToURL = (url: string): HTMLAnchorElement | null => {\n    const location = document?.createElement('a')\n    if (isUndefined(location)) {\n        return null\n    }\n\n    location.href = url\n    return location\n}\n\nexport const formDataToQuery = function (formdata: Record<string, any> | FormData, arg_separator = '&'): string {\n    let use_val: string\n    let use_key: string\n    const tph_arr: string[] = []\n\n    each(formdata, function (val: File | string | undefined, key: string | undefined) {\n        // the key might be literally the string undefined for e.g. if {undefined: 'something'}\n        if (isUndefined(val) || isUndefined(key) || key === 'undefined') {\n            return\n        }\n\n        use_val = encodeURIComponent(isFile(val) ? val.name : val.toString())\n        use_key = encodeURIComponent(key)\n        tph_arr[tph_arr.length] = use_key + '=' + use_val\n    })\n\n    return tph_arr.join(arg_separator)\n}\n\nexport const getQueryParam = function (url: string, param: string): string {\n    const withoutHash: string = url.split('#')[0] || ''\n\n    // Split only on the first ? to sort problem out for those with multiple ?s\n    // and then remove them\n    const queryParams: string = withoutHash.split(/\\?(.*)/)[1] || ''\n    const cleanedQueryParams = queryParams.replace(/^\\?+/g, '')\n\n    const queryParts = cleanedQueryParams.split('&')\n    let keyValuePair\n\n    for (let i = 0; i < queryParts.length; i++) {\n        const parts = queryParts[i].split('=')\n        if (parts[0] === param) {\n            keyValuePair = parts\n            break\n        }\n    }\n\n    if (!isArray(keyValuePair) || keyValuePair.length < 2) {\n        return ''\n    } else {\n        let result = keyValuePair[1]\n        try {\n            result = decodeURIComponent(result)\n        } catch {\n            logger.error('Skipping decoding for malformed query param: ' + result)\n        }\n        return result.replace(/\\+/g, ' ')\n    }\n}\n\n// replace any query params in the url with the provided mask value. Tries to keep the URL as instant as possible,\n// including preserving malformed text in most cases\nexport const maskQueryParams = function <T extends string | undefined>(\n    url: T,\n    maskedParams: string[] | undefined,\n    mask: string\n): T extends string ? string : undefined {\n    if (!url || !maskedParams || !maskedParams.length) {\n        return url as any\n    }\n\n    const splitHash = url.split('#')\n    const withoutHash: string = splitHash[0] || ''\n    const hash = splitHash[1]\n\n    const splitQuery: string[] = withoutHash.split('?')\n    const queryString: string = splitQuery[1]\n    const urlWithoutQueryAndHash: string = splitQuery[0]\n    const queryParts = (queryString || '').split('&')\n\n    // use an array of strings rather than an object to preserve ordering and duplicates\n    const paramStrings: string[] = []\n\n    for (let i = 0; i < queryParts.length; i++) {\n        const keyValuePair = queryParts[i].split('=')\n        if (!isArray(keyValuePair)) {\n            continue\n        } else if (maskedParams.includes(keyValuePair[0])) {\n            paramStrings.push(keyValuePair[0] + '=' + mask)\n        } else {\n            paramStrings.push(queryParts[i])\n        }\n    }\n\n    let result = urlWithoutQueryAndHash\n    if (queryString != null) {\n        result += '?' + paramStrings.join('&')\n    }\n    if (hash != null) {\n        result += '#' + hash\n    }\n\n    return result as any\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n    const matches = hash.match(new RegExp(param + '=([^&]*)'))\n    return matches ? matches[1] : null\n}\n\nexport const isLocalhost = (): boolean => {\n    return localDomains.includes(location.hostname)\n}\n", "import { convertToURL, getQueryParam, maskQueryParams } from './request-utils'\nimport { isNull, stripLeadingDollar } from '@posthog/core'\nimport { Properties } from '../types'\nimport Config from '../config'\nimport { each, extend, stripEmptyProperties } from './index'\nimport { document, location, userAgent, window } from './globals'\nimport { detectBrowser, detectBrowserVersion, detectDevice, detectDeviceType, detectOS } from '@posthog/core'\nimport { cookieStore } from '../storage'\n\nconst URL_REGEX_PREFIX = 'https?://(.*)'\n\n// CAMPAIGN_PARAMS and EVENT_TO_PERSON_PROPERTIES should be kept in sync with\n// https://github.com/PostHog/posthog/blob/master/plugin-server/src/utils/db/utils.ts#L60\n\n// The list of campaign parameters that could be considered personal data under e.g. GDPR.\n// These can be masked in URLs and properties before being sent to posthog.\nexport const PERSONAL_DATA_CAMPAIGN_PARAMS = [\n    'gclid', // google ads\n    'gclsrc', // google ads 360\n    'dclid', // google display ads\n    'gbraid', // google ads, web to app\n    'wbraid', // google ads, app to web\n    'fbclid', // facebook\n    'msclkid', // microsoft\n    'twclid', // twitter\n    'li_fat_id', // linkedin\n    'igshid', // instagram\n    'ttclid', // tiktok\n    'rdt_cid', // reddit\n    'epik', // pinterest\n    'qclid', // quora\n    'sccid', // snapchat\n    'irclid', // impact\n    '_kx', // klaviyo\n]\n\nexport const CAMPAIGN_PARAMS = [\n    'utm_source',\n    'utm_medium',\n    'utm_campaign',\n    'utm_content',\n    'utm_term',\n    'gad_source', // google ads source\n    'mc_cid', // mailchimp campaign id\n    ...PERSONAL_DATA_CAMPAIGN_PARAMS,\n]\n\nexport const EVENT_TO_PERSON_PROPERTIES = [\n    // mobile params\n    '$app_build',\n    '$app_name',\n    '$app_namespace',\n    '$app_version',\n    // web params\n    '$browser',\n    '$browser_version',\n    '$device_type',\n    '$current_url',\n    '$pathname',\n    '$os',\n    '$os_name', // $os_name is a special case, it's treated as an alias of $os!\n    '$os_version',\n    '$referring_domain',\n    '$referrer',\n    '$screen_height',\n    '$screen_width',\n    '$viewport_height',\n    '$viewport_width',\n    '$raw_user_agent',\n]\n\nexport const MASKED = '<masked>'\n\n// Campaign params that can be read from the cookie store\nexport const COOKIE_CAMPAIGN_PARAMS = [\n    'li_fat_id', // linkedin\n]\n\nexport function getCampaignParams(\n    customTrackedParams?: string[],\n    maskPersonalDataProperties?: boolean,\n    customPersonalDataProperties?: string[] | undefined\n): Record<string, string> {\n    if (!document) {\n        return {}\n    }\n\n    const paramsToMask = maskPersonalDataProperties\n        ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n        : []\n\n    // Initially get campaign params from the URL\n    const urlCampaignParams = _getCampaignParamsFromUrl(\n        maskQueryParams(document.URL, paramsToMask, MASKED),\n        customTrackedParams\n    )\n\n    // But we can also get some of them from the cookie store\n    // For example: https://learn.microsoft.com/en-us/linkedin/marketing/conversions/enabling-first-party-cookies?view=li-lms-2025-05#reading-li_fat_id-from-cookies\n    const cookieCampaignParams = _getCampaignParamsFromCookie()\n\n    // Prefer the values found in the urlCampaignParams if possible\n    // `extend` will override the values if found in the second argument\n    return extend(cookieCampaignParams, urlCampaignParams)\n}\n\nfunction _getCampaignParamsFromUrl(url: string, customParams?: string[]): Record<string, string> {\n    const campaign_keywords = CAMPAIGN_PARAMS.concat(customParams || [])\n\n    const params: Record<string, any> = {}\n    each(campaign_keywords, function (kwkey) {\n        const kw = getQueryParam(url, kwkey)\n        params[kwkey] = kw ? kw : null\n    })\n\n    return params\n}\n\nfunction _getCampaignParamsFromCookie(): Record<string, string> {\n    const params: Record<string, any> = {}\n    each(COOKIE_CAMPAIGN_PARAMS, function (kwkey) {\n        const kw = cookieStore._get(kwkey)\n        params[kwkey] = kw ? kw : null\n    })\n\n    return params\n}\n\nfunction _getSearchEngine(referrer: string): string | null {\n    if (!referrer) {\n        return null\n    } else {\n        if (referrer.search(URL_REGEX_PREFIX + 'google.([^/?]*)') === 0) {\n            return 'google'\n        } else if (referrer.search(URL_REGEX_PREFIX + 'bing.com') === 0) {\n            return 'bing'\n        } else if (referrer.search(URL_REGEX_PREFIX + 'yahoo.com') === 0) {\n            return 'yahoo'\n        } else if (referrer.search(URL_REGEX_PREFIX + 'duckduckgo.com') === 0) {\n            return 'duckduckgo'\n        } else {\n            return null\n        }\n    }\n}\n\nfunction _getSearchInfoFromReferrer(referrer: string): Record<string, any> {\n    const search = _getSearchEngine(referrer)\n    const param = search != 'yahoo' ? 'q' : 'p'\n    const ret: Record<string, any> = {}\n\n    if (!isNull(search)) {\n        ret['$search_engine'] = search\n\n        const keyword = document ? getQueryParam(document.referrer, param) : ''\n        if (keyword.length) {\n            ret['ph_keyword'] = keyword\n        }\n    }\n\n    return ret\n}\n\nexport function getSearchInfo(): Record<string, any> {\n    const referrer = document?.referrer\n    if (!referrer) {\n        return {}\n    }\n    return _getSearchInfoFromReferrer(referrer)\n}\n\nexport function getBrowserLanguage(): string | undefined {\n    return (\n        navigator.language || // Any modern browser\n        (navigator as Record<string, any>).userLanguage // IE11\n    )\n}\n\nexport function getBrowserLanguagePrefix(): string | undefined {\n    const lang = getBrowserLanguage()\n    return typeof lang === 'string' ? lang.split('-')[0] : undefined\n}\n\nconst DIRECT = '$direct'\n\nexport function getReferrer(): string {\n    return document?.referrer || DIRECT\n}\n\nexport function getReferringDomain(): string {\n    if (!document?.referrer) {\n        return DIRECT\n    }\n    return convertToURL(document.referrer)?.host || DIRECT\n}\n\nexport function getReferrerInfo(): Record<string, any> {\n    return {\n        $referrer: getReferrer(),\n        $referring_domain: getReferringDomain(),\n    }\n}\n\nexport function getPersonInfo(maskPersonalDataProperties?: boolean, customPersonalDataProperties?: string[]) {\n    const paramsToMask = maskPersonalDataProperties\n        ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n        : []\n    const url = location?.href.substring(0, 1000)\n    // we're being a bit more economical with bytes here because this is stored in the cookie\n    return {\n        r: getReferrer().substring(0, 1000),\n        u: url ? maskQueryParams(url, paramsToMask, MASKED) : undefined,\n    }\n}\n\nexport function getPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n    const { r: referrer, u: url } = info\n    const referring_domain = referrer == null ? undefined : referrer == DIRECT ? DIRECT : convertToURL(referrer)?.host\n\n    const props: Record<string, string | undefined> = {\n        $referrer: referrer,\n        $referring_domain: referring_domain,\n    }\n    if (url) {\n        props['$current_url'] = url\n        const location = convertToURL(url)\n        props['$host'] = location?.host\n        props['$pathname'] = location?.pathname\n        const campaignParams = _getCampaignParamsFromUrl(url)\n        extend(props, campaignParams)\n    }\n    if (referrer) {\n        const searchInfo = _getSearchInfoFromReferrer(referrer)\n        extend(props, searchInfo)\n    }\n    return props\n}\n\nexport function getInitialPersonPropsFromInfo(info: Record<string, any>): Record<string, any> {\n    const personProps = getPersonPropsFromInfo(info)\n    const props: Record<string, any> = {}\n    each(personProps, function (val: any, key: string) {\n        props[`$initial_${stripLeadingDollar(key)}`] = val\n    })\n    return props\n}\n\nexport function getTimezone(): string | undefined {\n    try {\n        return Intl.DateTimeFormat().resolvedOptions().timeZone\n    } catch {\n        return undefined\n    }\n}\n\nexport function getTimezoneOffset(): number | undefined {\n    try {\n        return new Date().getTimezoneOffset()\n    } catch {\n        return undefined\n    }\n}\n\nexport function getEventProperties(\n    maskPersonalDataProperties?: boolean,\n    customPersonalDataProperties?: string[]\n): Properties {\n    if (!userAgent) {\n        return {}\n    }\n    const paramsToMask = maskPersonalDataProperties\n        ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n        : []\n    const [os_name, os_version] = detectOS(userAgent)\n\n    return extend(\n        stripEmptyProperties({\n            $os: os_name,\n            $os_version: os_version,\n            $browser: detectBrowser(userAgent, navigator.vendor),\n            $device: detectDevice(userAgent),\n            $device_type: detectDeviceType(userAgent, {\n                // eslint-disable-next-line compat/compat\n                userAgentDataPlatform: navigator?.userAgentData?.platform,\n                maxTouchPoints: navigator?.maxTouchPoints,\n                screenWidth: window?.screen?.width,\n                screenHeight: window?.screen?.height,\n                devicePixelRatio: window?.devicePixelRatio,\n            }),\n            $timezone: getTimezone(),\n            $timezone_offset: getTimezoneOffset(),\n        }),\n        {\n            $current_url: maskQueryParams(location?.href, paramsToMask, MASKED),\n            $host: location?.host,\n            $pathname: location?.pathname,\n            $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,\n            $browser_version: detectBrowserVersion(userAgent, navigator.vendor),\n            $browser_language: getBrowserLanguage(),\n            $browser_language_prefix: getBrowserLanguagePrefix(),\n            $screen_height: window?.screen.height,\n            $screen_width: window?.screen.width,\n            $viewport_height: window?.innerHeight,\n            $viewport_width: window?.innerWidth,\n            $lib: Config.LIB_NAME,\n            $lib_version: Config.LIB_VERSION,\n            $insert_id: Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10),\n            $time: Date.now() / 1000, // epoch time in seconds\n        }\n    )\n}\n", "/* eslint camelcase: \"off\" */\n\nimport { each, extend, stripEmptyProperties } from './utils'\nimport { cookieStore, createLocalPlusCookieStore, localStore, memoryStore, sessionStore } from './storage'\nimport { PersistentStore, PostHogConfig, Properties } from './types'\nimport {\n    ENABLED_FEATURE_FLAGS,\n    EVENT_TIMERS_KEY,\n    INITIAL_CAMPAIGN_PARAMS,\n    INITIAL_PERSON_INFO,\n    INITIAL_REFERRER_INFO,\n    PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n} from './constants'\nimport { getPersistenceKeyPolicy } from './persistence-key-policy'\n\nimport { isUndefined } from '@posthog/core'\nimport {\n    getCampaignParams,\n    getInitialPersonPropsFromInfo,\n    getPersonInfo,\n    getReferrerInfo,\n    getSearchInfo,\n} from './utils/event-utils'\nimport { logger } from './utils/logger'\nimport { stripLeadingDollar, isEmptyObject, isObject } from '@posthog/core'\n\nconst CASE_INSENSITIVE_PERSISTENCE_TYPES: readonly Lowercase<PostHogConfig['persistence']>[] = [\n    'cookie',\n    'localstorage',\n    'localstorage+cookie',\n    'sessionstorage',\n    'memory',\n]\n\nconst parseName = (config: PostHogConfig): string => {\n    let token = ''\n    if (config['token']) {\n        token = config['token'].replace(/\\+/g, 'PL').replace(/\\//g, 'SL').replace(/=/g, 'EQ')\n    }\n\n    if (config['persistence_name']) {\n        return 'ph_' + config['persistence_name']\n    } else {\n        return 'ph_' + token + '_posthog'\n    }\n}\n\nconst isArrayContentsEqual = (arr1: readonly string[], arr2: readonly string[]): boolean => {\n    if (arr1.length !== arr2.length) {\n        return false\n    }\n\n    const sortedArr1 = [...arr1].sort()\n    const sortedArr2 = [...arr2].sort()\n    return sortedArr1.every((item, index) => item === sortedArr2[index])\n}\n\n/**\n * PostHog Persistence Object\n * @constructor\n */\nexport class PostHogPersistence {\n    private _config: PostHogConfig\n    props: Properties\n    private _storage: PersistentStore\n    private _campaign_params_saved: boolean\n    private readonly _name: string\n    _disabled: boolean | undefined\n    private _secure: boolean | undefined\n    private _expire_days: number | undefined\n    private _default_expiry: number | undefined\n    private _cross_subdomain: boolean | undefined\n\n    /**\n     * @param {PostHogConfig} config initial PostHog configuration\n     * @param {boolean=} isDisabled should persistence be disabled (e.g. because of consent management)\n     */\n    constructor(config: PostHogConfig, isDisabled?: boolean) {\n        this._config = config\n        this.props = {}\n        this._campaign_params_saved = false\n        this._name = parseName(config)\n        this._storage = this._buildStorage(config)\n        this.load()\n        if (config.debug) {\n            logger.info('Persistence loaded', config['persistence'], { ...this.props })\n        }\n        this.update_config(config, config, isDisabled)\n        this.save()\n    }\n\n    /**\n     * Returns whether persistence is disabled. Only available in SDKs > 1.257.1. Do not use on extensions, otherwise\n     * it'll break backwards compatibility for any version before 1.257.1.\n     */\n    public isDisabled?(): boolean {\n        return !!this._disabled\n    }\n\n    private _buildStorage(config: PostHogConfig) {\n        if (\n            CASE_INSENSITIVE_PERSISTENCE_TYPES.indexOf(\n                config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n            ) === -1\n        ) {\n            logger.critical(\n                'Unknown persistence type ' + config['persistence'] + '; falling back to localStorage+cookie'\n            )\n            config['persistence'] = 'localStorage+cookie'\n        }\n\n        // Create this before hand to avoid creating it multiple times\n        // Creating it inside each individual condition below is too complicated and will break backwards compatibility\n        // so create it once for this specific config and use it if necessary\n        const localPlusCookieStore = createLocalPlusCookieStore(config['cookie_persisted_properties'] || [])\n\n        let store: PersistentStore\n\n        // We handle storage type in a case-insensitive way for backwards compatibility\n        const storage_type = config['persistence'].toLowerCase() as Lowercase<PostHogConfig['persistence']>\n        if (storage_type === 'localstorage' && localStore._is_supported()) {\n            store = localStore\n        } else if (storage_type === 'localstorage+cookie' && localPlusCookieStore._is_supported()) {\n            store = localPlusCookieStore\n        } else if (storage_type === 'sessionstorage' && sessionStore._is_supported()) {\n            store = sessionStore\n        } else if (storage_type === 'memory') {\n            store = memoryStore\n        } else if (storage_type === 'cookie') {\n            store = cookieStore\n        } else if (localPlusCookieStore._is_supported()) {\n            // selected storage type wasn't supported, fallback to 'localstorage+cookie' if possible\n            store = localPlusCookieStore\n        } else {\n            store = cookieStore\n        }\n\n        return store\n    }\n\n    /**\n     * Check if the feature flag cache is stale based on the configured TTL.\n     * @param ttl Optional TTL override (uses config value if not provided)\n     * @internal\n     */\n    _isFeatureFlagCacheStale(ttl?: number): boolean {\n        const effectiveTtl = ttl ?? this._config.feature_flag_cache_ttl_ms\n        if (!effectiveTtl || effectiveTtl <= 0) {\n            return false\n        }\n        const evaluatedAt = this.props[PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]\n        // If evaluatedAt is missing or not a numeric timestamp, consider cache stale.\n        // This handles SDK upgrades where old cached flags lack evaluatedAt.\n        if (!evaluatedAt || typeof evaluatedAt !== 'number') {\n            return true\n        }\n        return Date.now() - evaluatedAt > effectiveTtl\n    }\n\n    properties(): Properties {\n        const p: Properties = {}\n\n        each(this.props, (v, k) => {\n            const policy = getPersistenceKeyPolicy(k)\n\n            if (policy?.exposure === 'derived') {\n                const shouldSkip = k === ENABLED_FEATURE_FLAGS ? () => this._isFeatureFlagCacheStale() : () => false\n\n                if (policy.shouldSkipFromEventProperties?.(v, shouldSkip)) {\n                    return\n                }\n\n                if (policy.transformToEventProperties) {\n                    extend(p, policy.transformToEventProperties(v))\n                }\n            } else if (!policy || policy.exposure === 'event') {\n                // Unknown keys are treated as user-defined super properties and remain event-visible.\n                p[k] = v\n            }\n        })\n        return p\n    }\n\n    load(): void {\n        if (this._disabled) {\n            return\n        }\n\n        const entry = this._storage._parse(this._name)\n\n        if (entry) {\n            this.props = extend({}, entry)\n        }\n    }\n\n    /**\n     * NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which\n     * observe cookie changes, and modify their UI, often causing infinite loops.\n     * As such callers of this should ideally check that the data has changed beforehand\n     */\n    save(): void {\n        if (this._disabled) {\n            return\n        }\n        this._storage._set(\n            this._name,\n            this.props,\n            this._expire_days,\n            this._cross_subdomain,\n            this._secure,\n            this._config.debug\n        )\n    }\n\n    remove(): void {\n        // remove both domain and subdomain cookies\n        this._storage._remove(this._name, false)\n        this._storage._remove(this._name, true)\n    }\n\n    // removes the storage entry and deletes all loaded data\n    // forced name for tests\n\n    clear(): void {\n        this.remove()\n        this.props = {}\n    }\n\n    /**\n     * @param {Object} props\n     * @param {*=} default_value\n     * @param {number=} days\n     */\n\n    register_once(props: Properties, default_value: any, days?: number): boolean {\n        if (isObject(props)) {\n            if (isUndefined(default_value)) {\n                default_value = 'None'\n            }\n            this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n            let hasChanges = false\n\n            each(props, (val, prop) => {\n                if (!this.props.hasOwnProperty(prop) || this.props[prop] === default_value) {\n                    this._setProp(prop, val)\n                    hasChanges = true\n                }\n            })\n\n            if (hasChanges) {\n                this.save()\n                return true\n            }\n        }\n        return false\n    }\n\n    /**\n     * @param {Object} props\n     * @param {number=} days\n     */\n\n    register(props: Properties, days?: number): boolean {\n        if (isObject(props)) {\n            this._expire_days = isUndefined(days) ? this._default_expiry : days\n\n            let hasChanges = false\n\n            each(props, (val, prop) => {\n                if (props.hasOwnProperty(prop) && this.props[prop] !== val) {\n                    this._setProp(prop, val)\n                    hasChanges = true\n                }\n            })\n\n            if (hasChanges) {\n                this.save()\n                return true\n            }\n        }\n        return false\n    }\n\n    unregister(prop: string): void {\n        if (prop in this.props) {\n            this._deleteProp(prop)\n            this.save()\n        }\n    }\n\n    update_campaign_params(): void {\n        if (!this._campaign_params_saved) {\n            const campaignParams = getCampaignParams(\n                this._config.custom_campaign_params,\n                this._config.mask_personal_data_properties,\n                this._config.custom_personal_data_properties\n            )\n            // only save campaign params if there were any\n            if (!isEmptyObject(stripEmptyProperties(campaignParams))) {\n                this.register(campaignParams)\n            }\n            this._campaign_params_saved = true\n        }\n    }\n    update_search_keyword(): void {\n        this.register(getSearchInfo())\n    }\n\n    update_referrer_info(): void {\n        this.register_once(getReferrerInfo(), undefined)\n    }\n\n    set_initial_person_info(): void {\n        if (this.props[INITIAL_CAMPAIGN_PARAMS] || this.props[INITIAL_REFERRER_INFO]) {\n            // the user has initial properties stored the previous way, don't save them again\n            return\n        }\n\n        this.register_once(\n            {\n                [INITIAL_PERSON_INFO]: getPersonInfo(\n                    this._config.mask_personal_data_properties,\n                    this._config.custom_personal_data_properties\n                ),\n            },\n            undefined\n        )\n    }\n\n    get_initial_props(): Properties {\n        const p: Properties = {}\n\n        // this section isn't written to anymore, but we should keep reading from it for backwards compatibility\n        // for a while\n        each([INITIAL_REFERRER_INFO, INITIAL_CAMPAIGN_PARAMS], (key) => {\n            const initialReferrerInfo = this.props[key]\n            if (initialReferrerInfo) {\n                each(initialReferrerInfo, function (v, k) {\n                    p['$initial_' + stripLeadingDollar(k)] = v\n                })\n            }\n        })\n        const initialPersonInfo = this.props[INITIAL_PERSON_INFO]\n        if (initialPersonInfo) {\n            const initialPersonProps = getInitialPersonPropsFromInfo(initialPersonInfo)\n            extend(p, initialPersonProps)\n        }\n\n        return p\n    }\n\n    // safely fills the passed in object with stored properties,\n    // does not override any properties defined in both\n    // returns the passed in object\n\n    safe_merge(props: Properties): Properties {\n        each(this.props, function (val, prop) {\n            if (!(prop in props)) {\n                props[prop] = val\n            }\n        })\n\n        return props\n    }\n\n    update_config(config: PostHogConfig, oldConfig: PostHogConfig, isDisabled?: boolean): void {\n        this._default_expiry = this._expire_days = config['cookie_expiration']\n        this.set_disabled(config['disable_persistence'] || !!isDisabled)\n        this.set_cross_subdomain(config['cross_subdomain_cookie'])\n        this.set_secure(config['secure_cookie'])\n\n        // If the persistence type has changed, we need to migrate the data.\n        if (\n            config.persistence !== oldConfig.persistence ||\n            !isArrayContentsEqual(config.cookie_persisted_properties || [], oldConfig.cookie_persisted_properties || [])\n        ) {\n            const newStore = this._buildStorage(config)\n            const props = this.props\n\n            // Clear the old store\n            this.clear()\n\n            // Set up the new store data\n            this._storage = newStore\n            this.props = props\n            this.save()\n        }\n    }\n\n    set_disabled(disabled: boolean): void {\n        this._disabled = disabled\n        if (this._disabled) {\n            this.remove()\n        } else {\n            this.save()\n        }\n    }\n\n    set_cross_subdomain(cross_subdomain: boolean): void {\n        if (cross_subdomain !== this._cross_subdomain) {\n            this._cross_subdomain = cross_subdomain\n            this.remove()\n            this.save()\n        }\n    }\n\n    set_secure(secure: boolean): void {\n        if (secure !== this._secure) {\n            this._secure = secure\n            this.remove()\n            this.save()\n        }\n    }\n\n    set_event_timer(event_name: string, timestamp: number): void {\n        const timers = this.props[EVENT_TIMERS_KEY] || {}\n        timers[event_name] = timestamp\n        this._setProp(EVENT_TIMERS_KEY, timers)\n        this.save()\n    }\n\n    remove_event_timer(event_name: string): number {\n        const timers = this.props[EVENT_TIMERS_KEY] || {}\n        const timestamp = timers[event_name]\n        if (!isUndefined(timestamp)) {\n            delete timers[event_name]\n            this._setProp(EVENT_TIMERS_KEY, timers)\n            this.save()\n        }\n        return timestamp\n    }\n\n    get_property(prop: string): any {\n        return this.props[prop]\n    }\n\n    set_property(prop: string, to: any): void {\n        this._setProp(prop, to)\n        this.save()\n    }\n\n    private _setProp(prop: string, to: any): void {\n        this.props[prop] = to\n    }\n\n    private _deleteProp(prop: string): void {\n        delete this.props[prop]\n    }\n}\n", "/**\n * Having Survey types in types.ts was confusing tsc\n * and generating an invalid module.d.ts\n * See https://github.com/PostHog/posthog-js/issues/698\n */\n\nimport type { Properties, PropertyMatchType } from './types'\nimport type {\n    SurveyAppearance as CoreSurveyAppearance,\n    SurveyQuestionTranslation,\n    SurveyResponseValue as CoreSurveyResponseValue,\n    SurveyTranslation,\n    SurveyValidationRule,\n} from '@posthog/core'\n\n// Extended operator type to include numeric operators not in PropertyMatchType\nexport type PropertyOperator = PropertyMatchType | 'gt' | 'lt'\n\nexport type PropertyFilters = {\n    [propertyName: string]: {\n        values: string[]\n        operator: PropertyOperator\n    }\n}\n\nexport interface SurveyEventWithFilters {\n    name: string\n    propertyFilters?: PropertyFilters\n}\n\n// Extends core SurveyAppearance with browser-specific fields\n// Omit 'position' from core because browser's SurveyPosition has additional values (e.g., NextToTrigger)\nexport interface SurveyAppearance extends Omit<CoreSurveyAppearance, 'position' | 'widgetType'> {\n    // Browser-specific fields not in core\n    /** @deprecated - not currently used */\n    descriptionTextColor?: string\n    ratingButtonHoverColor?: string\n    whiteLabel?: boolean\n    tabPosition?: SurveyTabPosition\n    fontFamily?: string\n    maxWidth?: string\n    zIndex?: string\n    disabledButtonOpacity?: string\n    boxPadding?: string\n    /** @deprecated Use inputBackground instead (inherited from core) */\n    inputBackgroundColor?: string\n    // Hide the X (cancel) button - defaults to false (show the button)\n    hideCancelButton?: boolean\n    // Browser's SurveyPosition has more options than core (e.g., NextToTrigger)\n    position?: SurveyPosition\n    widgetType?: SurveyWidgetType\n}\n\nexport type SurveyQuestion = BasicSurveyQuestion | LinkSurveyQuestion | RatingSurveyQuestion | MultipleSurveyQuestion\n\nexport type SurveyQuestionDescriptionContentType = 'html' | 'text'\n\ninterface SurveyQuestionBase {\n    question: string\n    id?: string\n    description?: string | null\n    descriptionContentType?: SurveyQuestionDescriptionContentType\n    optional?: boolean\n    buttonText?: string\n    branching?: NextQuestionBranching | EndBranching | ResponseBasedBranching | SpecificQuestionBranching\n    validation?: SurveyValidationRule[]\n    translations?: Record<string, SurveyQuestionTranslation>\n}\n\nexport interface BasicSurveyQuestion extends SurveyQuestionBase {\n    type: typeof SurveyQuestionType.Open\n}\n\nexport interface LinkSurveyQuestion extends SurveyQuestionBase {\n    type: typeof SurveyQuestionType.Link\n    link?: string | null\n}\n\nexport interface RatingSurveyQuestion extends SurveyQuestionBase {\n    type: typeof SurveyQuestionType.Rating\n    display: 'number' | 'emoji'\n    scale: 2 | 3 | 5 | 7 | 10\n    lowerBoundLabel: string\n    upperBoundLabel: string\n    skipSubmitButton?: boolean\n}\n\nexport interface MultipleSurveyQuestion extends SurveyQuestionBase {\n    type: typeof SurveyQuestionType.SingleChoice | typeof SurveyQuestionType.MultipleChoice\n    choices: string[]\n    hasOpenChoice?: boolean\n    shuffleOptions?: boolean\n    skipSubmitButton?: boolean\n}\n\ninterface NextQuestionBranching {\n    type: typeof SurveyQuestionBranchingType.NextQuestion\n}\n\ninterface EndBranching {\n    type: typeof SurveyQuestionBranchingType.End\n}\n\ninterface ResponseBasedBranching {\n    type: typeof SurveyQuestionBranchingType.ResponseBased\n    responseValues: Record<string, any>\n}\n\ninterface SpecificQuestionBranching {\n    type: typeof SurveyQuestionBranchingType.SpecificQuestion\n    index: number\n}\n\nexport type SurveyCallback = (surveys: Survey[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport interface SurveyElement {\n    text?: string\n    $el_text?: string\n    tag_name?: string\n    href?: string\n    attr_id?: string\n    attr_class?: string[]\n    nth_child?: number\n    nth_of_type?: number\n    attributes?: Record<string, any>\n    event_id?: number\n    order?: number\n    group_id?: number\n}\n\n// Re-export from @posthog/types to avoid duplication\nexport type { SurveyRenderReason } from '@posthog/types'\n\nexport interface Survey {\n    // Sync this with the backend's SurveyAPISerializer!\n    id: string\n    name: string\n    description?: string\n    type: SurveyType\n    translations?: Record<string, SurveyTranslation>\n    feature_flag_keys:\n        | {\n              key: string\n              value?: string\n          }[]\n        | null\n    // the linked flag key is the flag key that is used to link the survey to a flag\n    linked_flag_key: string | null\n    targeting_flag_key: string | null\n    // the internal targeting flag key is the flag key that is used to target users who have seen the survey\n    // eg survey-targeting-<survey-id>\n    internal_targeting_flag_key: string | null\n    questions: SurveyQuestion[]\n    appearance: SurveyAppearance | null\n    conditions: {\n        url?: string\n        selector?: string\n        seenSurveyWaitPeriodInDays?: number\n        urlMatchType?: PropertyMatchType\n        /** events that trigger surveys */\n        events: {\n            repeatedActivation?: boolean\n            values: SurveyEventWithFilters[]\n        } | null\n        /** events that cancel \"pending\" (time-delayed) surveys */\n        cancelEvents: {\n            values: SurveyEventWithFilters[]\n        } | null\n        actions: {\n            values: SurveyActionType[]\n        } | null\n        deviceTypes?: string[]\n        deviceTypesMatchType?: PropertyMatchType\n        linkedFlagVariant?: string\n    } | null\n    start_date: string | null\n    end_date: string | null\n    current_iteration: number | null\n    current_iteration_start_date: string | null\n    schedule?: SurveySchedule | null\n    enable_partial_responses?: boolean | null\n}\n\nexport type SurveyWithTypeAndAppearance = Pick<Survey, 'id' | 'type' | 'appearance'>\n\nexport interface SurveyActionType {\n    id: number\n    name: string | null\n    steps?: ActionStepType[]\n}\n\n/** Sync with plugin-server/src/types.ts */\nexport type ActionStepStringMatching = 'contains' | 'exact' | 'regex'\n\nexport interface ActionStepType {\n    event?: string | null\n    selector?: string | null\n    /** pre-compiled regex pattern for matching selector against $elements_chain */\n    selector_regex?: string | null\n    /** @deprecated Only `selector` should be used now. */\n    tag_name?: string\n    text?: string | null\n    /** @default StringMatching.Exact */\n    text_matching?: ActionStepStringMatching | null\n    href?: string | null\n    /** @default ActionStepStringMatching.Exact */\n    href_matching?: ActionStepStringMatching | null\n    url?: string | null\n    /** @default StringMatching.Contains */\n    url_matching?: ActionStepStringMatching | null\n    /** Property filters for action step matching */\n    properties?: {\n        key: string\n        value?: string | number | boolean | (string | number | boolean)[] | null\n        operator?: PropertyMatchType\n        type?: string\n    }[]\n}\n\ninterface DisplaySurveyOptionsBase {\n    ignoreConditions: boolean\n    ignoreDelay: boolean\n    displayType: DisplaySurveyType\n    /** Additional properties to include in all survey events (shown, sent, dismissed) */\n    properties?: Properties\n    /** Pre-filled responses by question index (0-based) */\n    initialResponses?: Record<number, SurveyResponseValue>\n}\n\nexport interface DisplaySurveyPopoverOptions extends DisplaySurveyOptionsBase {\n    displayType: typeof DisplaySurveyType.Popover\n    /** Override the survey's configured position */\n    position?: SurveyPosition\n    /** CSS selector for the element to position the survey next to (when position is NextToTrigger) */\n    selector?: string\n    /** When true, `survey shown` events will not be emitted automatically */\n    skipShownEvent?: boolean\n}\n\ninterface DisplaySurveyInlineOptions extends DisplaySurveyOptionsBase {\n    displayType: typeof DisplaySurveyType.Inline\n    selector: string\n}\n\nexport type DisplaySurveyOptions = DisplaySurveyPopoverOptions | DisplaySurveyInlineOptions\n\nexport interface SurveyConfig {\n    prefillFromUrl?: boolean\n    /**\n     * @deprecated No longer used. Surveys will automatically advance past\n     * prefilled questions with skipSubmitButton enabled. If partial response\n     * collection is enabled, partial responses for pre-filled questions will\n     * be submitted automatically on page load.\n     */\n    autoSubmitIfComplete?: boolean\n    /**\n     * @deprecated No longer used. Pre-filled responses are now sent\n     * immediately when partial responses are enabled, or all required\n     * quesions have been pre-filled.\n     */\n    autoSubmitDelay?: number\n}\n\nexport type SurveyResponseValue = CoreSurveyResponseValue\n\n/**\n * Surveys related enums and constants.\n * We use const objects instead of TypeScript enums to allow for easier tree-shaking and to avoid issues with enum imports in JavaScript.\n */\n\nexport const SurveyEventType = {\n    Activation: 'events',\n    Cancellation: 'cancelEvents',\n} as const\nexport type SurveyEventType = (typeof SurveyEventType)[keyof typeof SurveyEventType]\n\nexport const SurveyWidgetType = {\n    Button: 'button',\n    Tab: 'tab',\n    Selector: 'selector',\n} as const\nexport type SurveyWidgetType = (typeof SurveyWidgetType)[keyof typeof SurveyWidgetType]\n\nexport const SurveyPosition = {\n    TopLeft: 'top_left',\n    TopRight: 'top_right',\n    TopCenter: 'top_center',\n    MiddleLeft: 'middle_left',\n    MiddleRight: 'middle_right',\n    MiddleCenter: 'middle_center',\n    Left: 'left',\n    Center: 'center',\n    Right: 'right',\n    NextToTrigger: 'next_to_trigger',\n} as const\nexport type SurveyPosition = (typeof SurveyPosition)[keyof typeof SurveyPosition]\n\nexport const SurveyTabPosition = {\n    Top: 'top',\n    Left: 'left',\n    Right: 'right',\n    Bottom: 'bottom',\n} as const\nexport type SurveyTabPosition = (typeof SurveyTabPosition)[keyof typeof SurveyTabPosition]\n\nexport const SurveyType = {\n    Popover: 'popover',\n    API: 'api',\n    Widget: 'widget',\n    ExternalSurvey: 'external_survey',\n} as const\nexport type SurveyType = (typeof SurveyType)[keyof typeof SurveyType]\n\nexport const SurveyQuestionType = {\n    Open: 'open',\n    MultipleChoice: 'multiple_choice',\n    SingleChoice: 'single_choice',\n    Rating: 'rating',\n    Link: 'link',\n} as const\nexport type SurveyQuestionType = (typeof SurveyQuestionType)[keyof typeof SurveyQuestionType]\n\nexport const SurveyQuestionBranchingType = {\n    NextQuestion: 'next_question',\n    End: 'end',\n    ResponseBased: 'response_based',\n    SpecificQuestion: 'specific_question',\n} as const\nexport type SurveyQuestionBranchingType = (typeof SurveyQuestionBranchingType)[keyof typeof SurveyQuestionBranchingType]\n\nexport const SurveySchedule = {\n    Once: 'once',\n    Recurring: 'recurring',\n    Always: 'always',\n} as const\nexport type SurveySchedule = (typeof SurveySchedule)[keyof typeof SurveySchedule]\n\nexport const SurveyEventName = {\n    SHOWN: 'survey shown',\n    DISMISSED: 'survey dismissed',\n    SENT: 'survey sent',\n    ABANDONED: 'survey abandoned',\n} as const\nexport type SurveyEventName = (typeof SurveyEventName)[keyof typeof SurveyEventName]\n\nexport const SurveyEventProperties = {\n    SURVEY_ID: '$survey_id',\n    SURVEY_NAME: '$survey_name',\n    SURVEY_RESPONSE: '$survey_response',\n    SURVEY_ITERATION: '$survey_iteration',\n    SURVEY_ITERATION_START_DATE: '$survey_iteration_start_date',\n    SURVEY_PARTIALLY_COMPLETED: '$survey_partially_completed',\n    SURVEY_SUBMISSION_ID: '$survey_submission_id',\n    SURVEY_QUESTIONS: '$survey_questions',\n    SURVEY_COMPLETED: '$survey_completed',\n    PRODUCT_TOUR_ID: '$product_tour_id',\n    SURVEY_LAST_SEEN_DATE: '$survey_last_seen_date',\n    SURVEY_LANGUAGE: '$survey_language',\n} as const\nexport type SurveyEventProperties = (typeof SurveyEventProperties)[keyof typeof SurveyEventProperties]\n\nexport const DisplaySurveyType = {\n    Popover: 'popover',\n    Inline: 'inline',\n} as const\nexport type DisplaySurveyType = (typeof DisplaySurveyType)[keyof typeof DisplaySurveyType]\n", "import { PropertyMatchType } from './types'\nimport { SurveyActionType, SurveyEventWithFilters } from './posthog-surveys-types'\nimport type { InferredSelector } from './extensions/product-tours/element-inference'\nimport { SurveyPosition } from '@posthog/core'\nimport { Z_INDEX_TOURS } from './constants'\n\nexport interface JSONContent {\n    type?: string\n    attrs?: Record<string, any>\n    content?: JSONContent[]\n    marks?: { type: string; attrs?: Record<string, any> }[]\n    text?: string\n}\n\nexport type ProductTourStepType = 'element' | 'modal' | 'survey' | 'banner'\n\nexport interface ProductTourBannerConfig {\n    behavior: 'sticky' | 'static' | 'custom'\n    selector?: string\n    action?: {\n        type: 'none' | 'link' | 'trigger_tour'\n        link?: string\n        tourId?: string\n    }\n    animation?: {\n        duration?: number\n    }\n}\n\n/** Button actions available on modal steps */\nexport type ProductTourButtonAction = 'dismiss' | 'link' | 'next_step' | 'previous_step' | 'trigger_tour'\n\nexport interface ProductTourStepButton {\n    text: string\n    action: ProductTourButtonAction\n    /** URL to open when action is 'link' */\n    link?: string\n    /** Tour ID to trigger when action is 'trigger_tour' */\n    tourId?: string\n}\n\nexport interface ProductTourStepButtons {\n    primary?: ProductTourStepButton\n    secondary?: ProductTourStepButton\n}\n\nexport type ProductTourSurveyQuestionType = 'open' | 'rating'\n\nexport interface ProductTourSurveyQuestion {\n    type: ProductTourSurveyQuestionType\n    questionText: string\n    /** Rating display type - emoji or number */\n    display?: 'emoji' | 'number'\n    /** Rating scale - 3 or 5 for emoji, 5 or 10 for number */\n    scale?: 3 | 5 | 10\n    /** Label for low end of rating scale (e.g., \"Not likely\") */\n    lowerBoundLabel?: string\n    /** Label for high end of rating scale (e.g., \"Very likely\") */\n    upperBoundLabel?: string\n    submitButtonText?: string\n    backButtonText?: string\n}\n\nexport interface ProductTourStep {\n    id: string\n    type: ProductTourStepType\n    selector?: string\n    progressionTrigger: 'button' | 'click'\n    content: JSONContent | null\n    /** Pre-rendered HTML content from the editor. If present, SDK should use this instead of rendering from JSONContent. */\n    contentHtml?: string\n    /** Inline survey question config - if present, this is a survey step */\n    survey?: ProductTourSurveyQuestion\n    /** ID of the auto-created survey for this step (set by backend) */\n    linkedSurveyId?: string\n    /** ID of the survey question (set by backend, used for event tracking) */\n    linkedSurveyQuestionId?: string\n    /** Enhanced element data for more reliable lookup at runtime */\n    inferenceData?: InferredSelector\n    /** Use CSS selector instead of inference. Defaults to false (use inference). */\n    useManualSelector?: boolean\n    /** Maximum tooltip width in pixels (defaults to 320px) */\n    maxWidth?: number\n    /** Position for modal/survey steps (defaults to middle_center) */\n    modalPosition?: SurveyPosition\n    /** Button configuration for modal steps */\n    buttons?: ProductTourStepButtons\n    /** Banner configuration (only for banner steps) */\n    bannerConfig?: ProductTourBannerConfig\n    /** translation data for this tour step */\n    translations?: Record<string, ProductTourStepTranslation>\n}\n\n/** all translatable content for a given tour step */\nexport interface ProductTourStepTranslation {\n    content?: ProductTourStep['content']\n    contentHtml?: ProductTourStep['contentHtml']\n    buttons?: {\n        primary?: Pick<ProductTourStepButton, 'text'>\n        secondary?: Pick<ProductTourStepButton, 'text'>\n    }\n    survey?: Pick<\n        ProductTourSurveyQuestion,\n        'questionText' | 'lowerBoundLabel' | 'upperBoundLabel' | 'submitButtonText' | 'backButtonText'\n    >\n}\n\n/** maps to main repo EffectiveProductTourType */\nexport type ProductTourType = 'tour' | 'announcement' | 'banner'\n\nexport interface ProductTourWaitPeriod {\n    days: number\n    types: ProductTourType[]\n}\n\nexport interface ProductTourConditions {\n    url?: string\n    urlMatchType?: PropertyMatchType\n    selector?: string\n    autoShowDelaySeconds?: number\n    events?: {\n        values: SurveyEventWithFilters[]\n    } | null\n    cancelEvents?: {\n        values: SurveyEventWithFilters[]\n    } | null\n    actions?: {\n        values: SurveyActionType[]\n    } | null\n    linkedFlagVariant?: string\n    deviceTypes?: string[]\n    seenTourWaitPeriod?: ProductTourWaitPeriod\n}\n\nexport interface ProductTourAppearance {\n    backgroundColor?: string\n    textColor?: string\n    buttonColor?: string\n    borderRadius?: number\n    buttonBorderRadius?: number\n    borderColor?: string\n    fontFamily?: string\n    boxShadow?: string\n    showOverlay?: boolean\n    whiteLabel?: boolean\n    /** defaults to true, auto-set to false for announcements/banners */\n    dismissOnClickOutside?: boolean\n    zIndex?: number\n}\n\nexport type ProductTourDisplayFrequency = 'show_once' | 'until_interacted' | 'always'\n\nexport interface ProductTour {\n    id: string\n    name: string\n    description?: string\n    tour_type: ProductTourType // inferred in API based on tour content\n    auto_launch?: boolean\n    start_date: string | null\n    end_date: string | null\n    current_iteration?: number\n    conditions?: ProductTourConditions\n    appearance?: ProductTourAppearance\n    steps: ProductTourStep[]\n    internal_targeting_flag_key?: string\n    linked_flag_key?: string\n    display_frequency?: ProductTourDisplayFrequency\n    disable_image_preload?: boolean\n}\n\nexport type ProductTourCallback = (tours: ProductTour[], context?: { isLoaded: boolean; error?: string }) => void\n\nexport type ProductTourSelectorError = 'not_found' | 'multiple_matches' | 'not_visible'\n\nexport type ProductTourDismissReason =\n    | 'user_clicked_skip'\n    | 'user_clicked_outside'\n    | 'escape_key'\n    | 'element_unavailable'\n    | 'container_unavailable'\n\nexport type ProductTourRenderReason = 'auto' | 'api' | 'trigger' | 'event'\n\nexport const DEFAULT_PRODUCT_TOUR_APPEARANCE: Required<ProductTourAppearance> = {\n    backgroundColor: '#ffffff',\n    textColor: '#1d1f27',\n    buttonColor: '#1d1f27',\n    borderRadius: 8,\n    buttonBorderRadius: 6,\n    borderColor: '#e5e7eb',\n    fontFamily: 'system-ui',\n    boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n    showOverlay: true,\n    whiteLabel: false,\n    dismissOnClickOutside: true,\n    zIndex: Z_INDEX_TOURS,\n}\n\nexport interface ShowTourOptions {\n    reason?: ProductTourRenderReason\n    enableStrictValidation?: boolean\n}\n\nexport const ProductTourEventName = {\n    SHOWN: 'product tour shown',\n    DISMISSED: 'product tour dismissed',\n    COMPLETED: 'product tour completed',\n    STEP_SHOWN: 'product tour step shown',\n    STEP_COMPLETED: 'product tour step completed',\n    BUTTON_CLICKED: 'product tour button clicked',\n    STEP_SELECTOR_FAILED: 'product tour step selector failed',\n    BANNER_CONTAINER_SELECTOR_FAILED: 'product tour banner container selector failed',\n    BANNER_ACTION_CLICKED: 'product tour banner action clicked',\n} as const\nexport type ProductTourEventName = (typeof ProductTourEventName)[keyof typeof ProductTourEventName]\n\nexport const ProductTourEventProperties = {\n    TOUR_ID: '$product_tour_id',\n    TOUR_NAME: '$product_tour_name',\n    TOUR_ITERATION: '$product_tour_iteration',\n    TOUR_RENDER_REASON: '$product_tour_render_reason',\n    TOUR_STEP_ID: '$product_tour_step_id',\n    TOUR_STEP_ORDER: '$product_tour_step_order',\n    TOUR_STEP_TYPE: '$product_tour_step_type',\n    TOUR_DISMISS_REASON: '$product_tour_dismiss_reason',\n    TOUR_BUTTON_TEXT: '$product_tour_button_text',\n    TOUR_BUTTON_ACTION: '$product_tour_button_action',\n    TOUR_BUTTON_LINK: '$product_tour_button_link',\n    TOUR_BUTTON_TOUR_ID: '$product_tour_button_tour_id',\n    TOUR_STEPS_COUNT: '$product_tour_steps_count',\n    TOUR_STEP_SELECTOR: '$product_tour_step_selector',\n    TOUR_STEP_SELECTOR_FOUND: '$product_tour_step_selector_found',\n    TOUR_STEP_ELEMENT_TAG: '$product_tour_step_element_tag',\n    TOUR_STEP_ELEMENT_ID: '$product_tour_step_element_id',\n    TOUR_STEP_ELEMENT_CLASSES: '$product_tour_step_element_classes',\n    TOUR_STEP_ELEMENT_TEXT: '$product_tour_step_element_text',\n    TOUR_ERROR: '$product_tour_error',\n    TOUR_MATCHES_COUNT: '$product_tour_matches_count',\n    TOUR_FAILURE_PHASE: '$product_tour_failure_phase',\n    TOUR_WAITED_FOR_ELEMENT: '$product_tour_waited_for_element',\n    TOUR_WAIT_DURATION_MS: '$product_tour_wait_duration_ms',\n    TOUR_BANNER_SELECTOR: '$product_tour_banner_selector',\n    TOUR_LINKED_SURVEY_ID: '$product_tour_linked_survey_id',\n    USE_MANUAL_SELECTOR: '$use_manual_selector',\n    INFERENCE_DATA_PRESENT: '$inference_data_present',\n    TOUR_LAST_SEEN_DATE: '$product_tour_last_seen_date',\n    TOUR_TYPE: '$product_tour_type',\n} as const\nexport type ProductTourEventProperties = (typeof ProductTourEventProperties)[keyof typeof ProductTourEventProperties]\n", "import { CAPTURE_RATE_LIMIT } from './constants'\nimport type { PostHog } from './posthog-core'\nimport { RequestResponse } from './types'\nimport { createLogger } from './utils/logger'\n\nconst logger = createLogger('[RateLimiter]')\n\nconst ONE_MINUTE_IN_MILLISECONDS = 60 * 1000\nconst RATE_LIMIT_EVENT = '$$client_ingestion_warning'\nconst DEFAULT_EVENTS_PER_SECOND = 10\nconst BURST_LIMIT_MULTIPLIER = 10\n\ninterface CaptureResponse {\n    quota_limited?: string[]\n}\n\nexport class RateLimiter {\n    instance: PostHog\n    serverLimits: Record<string, number> = {}\n    lastEventRateLimited = false\n\n    constructor(instance: PostHog) {\n        this.instance = instance\n        this.lastEventRateLimited = this.clientRateLimitContext(true).isRateLimited\n    }\n\n    get captureEventsPerSecond(): number {\n        return this.instance.config.rate_limiting?.events_per_second || DEFAULT_EVENTS_PER_SECOND\n    }\n\n    get captureEventsBurstLimit(): number {\n        return Math.max(\n            this.instance.config.rate_limiting?.events_burst_limit ||\n                this.captureEventsPerSecond * BURST_LIMIT_MULTIPLIER,\n            this.captureEventsPerSecond\n        )\n    }\n\n    public clientRateLimitContext(checkOnly = false): {\n        isRateLimited: boolean\n        remainingTokens: number\n    } {\n        // This is primarily to prevent runaway loops from flooding capture with millions of events for a single user.\n        // It's as much for our protection as theirs.\n        const { captureEventsBurstLimit, captureEventsPerSecond } = this\n        const now = new Date().getTime()\n        const bucket = this.instance.persistence?.get_property(CAPTURE_RATE_LIMIT) ?? {\n            tokens: captureEventsBurstLimit,\n            last: now,\n        }\n\n        bucket.tokens += ((now - bucket.last) / 1000) * captureEventsPerSecond\n        bucket.last = now\n\n        if (bucket.tokens > captureEventsBurstLimit) {\n            bucket.tokens = captureEventsBurstLimit\n        }\n\n        const isRateLimited = bucket.tokens < 1\n\n        if (!isRateLimited && !checkOnly) {\n            bucket.tokens = Math.max(0, bucket.tokens - 1)\n        }\n\n        if (isRateLimited && !this.lastEventRateLimited && !checkOnly) {\n            this.instance.capture(\n                RATE_LIMIT_EVENT,\n                {\n                    $$client_ingestion_warning_message: `posthog-js client rate limited. Config is set to ${captureEventsPerSecond} events per second and ${captureEventsBurstLimit} events burst limit.`,\n                },\n                {\n                    skip_client_rate_limiting: true,\n                }\n            )\n        }\n\n        this.lastEventRateLimited = isRateLimited\n        this.instance.persistence?.set_property(CAPTURE_RATE_LIMIT, bucket)\n\n        return {\n            isRateLimited,\n            remainingTokens: bucket.tokens,\n        }\n    }\n\n    public isServerRateLimited(batchKey: string | undefined): boolean {\n        const retryAfter = this.serverLimits[batchKey || 'events'] || false\n\n        if (retryAfter === false) {\n            return false\n        }\n        return new Date().getTime() < retryAfter\n    }\n\n    public checkForLimiting = (httpResponse: RequestResponse): void => {\n        const text = httpResponse.text\n\n        if (!text || !text.length) {\n            return\n        }\n\n        try {\n            const response: CaptureResponse = JSON.parse(text)\n            const quotaLimitedProducts = response.quota_limited || []\n            quotaLimitedProducts.forEach((batchKey) => {\n                logger.info(`${batchKey || 'events'} is quota limited.`)\n                this.serverLimits[batchKey] = new Date().getTime() + ONE_MINUTE_IN_MILLISECONDS\n            })\n        } catch (e: any) {\n            logger.warn(`could not rate limit - continuing. Error: \"${e?.message}\"`, { text })\n            return\n        }\n    }\n}\n", "import { PostHog } from './posthog-core'\nimport { RemoteConfig } from './types'\n\nimport { createLogger } from './utils/logger'\nimport { assignableWindow, document } from './utils/globals'\n\nconst logger = createLogger('[RemoteConfig]')\n\n// Default refresh interval for feature flags in long-running sessions.\n// 5 minutes balances freshness with server load - flags typically don't change\n// frequently, and most sessions are shorter than this anyway.\nconst DEFAULT_REFRESH_INTERVAL = 5 * 60 * 1000\n\nexport class RemoteConfigLoader {\n    private _refreshInterval: ReturnType<typeof setInterval> | undefined\n\n    constructor(private readonly _instance: PostHog) {}\n\n    get remoteConfig(): RemoteConfig | undefined {\n        return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.config\n    }\n\n    private _loadRemoteConfigJs(cb: (config?: RemoteConfig) => void): void {\n        if (assignableWindow.__PosthogExtensions__?.loadExternalDependency) {\n            assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'remote-config', () => {\n                return cb(this.remoteConfig)\n            })\n        } else {\n            cb()\n        }\n    }\n\n    private _loadRemoteConfigJSON(cb: (config?: RemoteConfig) => void): void {\n        this._instance._send_request({\n            method: 'GET',\n            url: this._instance.requestRouter.endpointFor('assets', `/array/${this._instance.config.token}/config`),\n            callback: (response) => {\n                cb(response.json as RemoteConfig | undefined)\n            },\n        })\n    }\n\n    load(): void {\n        try {\n            // Attempt 1 - use the pre-loaded config if it came as part of the token-specific array.js\n            if (this.remoteConfig) {\n                logger.info('Using preloaded remote config', this.remoteConfig)\n                this._onRemoteConfig(this.remoteConfig)\n                this._startRefreshInterval()\n                return\n            }\n\n            if (this._instance._shouldDisableFlags()) {\n                // This setting is essentially saying \"dont call external APIs\" hence we respect it here\n                logger.warn('Remote config is disabled. Falling back to local config.')\n                return\n            }\n\n            // Attempt 2 - if we have the external deps loader then lets load the script version of the config that includes site apps\n            this._loadRemoteConfigJs((config) => {\n                if (!config) {\n                    logger.info('No config found after loading remote JS config. Falling back to JSON.')\n                    // Attempt 3 Load the config json instead of the script - we won't get site apps etc. but we will get the config\n                    this._loadRemoteConfigJSON((config) => {\n                        this._onRemoteConfig(config)\n                        this._startRefreshInterval()\n                    })\n                    return\n                }\n\n                this._onRemoteConfig(config)\n                this._startRefreshInterval()\n            })\n        } catch (error) {\n            logger.error('Error loading remote config', error)\n        }\n    }\n\n    stop(): void {\n        if (this._refreshInterval) {\n            clearInterval(this._refreshInterval)\n            this._refreshInterval = undefined\n        }\n    }\n\n    /**\n     * Refresh feature flags for long-running sessions.\n     * Calls reloadFeatureFlags() directly rather than re-fetching config — the initial\n     * config load already determined whether flags are enabled, and reloadFeatureFlags()\n     * is a no-op when flags are disabled. This avoids an unnecessary network round-trip.\n     */\n    refresh(): void {\n        if (this._instance._shouldDisableFlags() || document?.visibilityState === 'hidden') {\n            return\n        }\n\n        this._instance.reloadFeatureFlags()\n    }\n\n    private _startRefreshInterval(): void {\n        if (this._refreshInterval) {\n            return\n        }\n\n        const intervalMs = this._instance.config.remote_config_refresh_interval_ms ?? DEFAULT_REFRESH_INTERVAL\n\n        // Allow users to disable periodic refresh by setting interval to 0\n        if (intervalMs === 0) {\n            return\n        }\n\n        this._refreshInterval = setInterval(() => {\n            this.refresh()\n        }, intervalMs)\n    }\n\n    private _onRemoteConfig(config?: RemoteConfig): void {\n        if (!config) {\n            logger.error('Failed to fetch remote config from PostHog.')\n        }\n\n        // Config and flags are loaded separately: config from /array/{token}/config,\n        // flags from /flags/?v=2. Features like surveys, session recording, and product\n        // tours reference flags in their config (e.g. survey.linked_flag_key), but this\n        // is safe because those flag checks happen lazily at runtime (e.g. when deciding\n        // whether to show a survey), not during config processing. By the time a linked\n        // flag is evaluated, flags have already loaded.\n        //\n        // Even when config fails, we pass an empty object so extensions (autocapture,\n        // session recording, etc.) still initialize with their defaults.\n        this._instance._onRemoteConfig(config ?? ({} as RemoteConfig))\n\n        if (config?.hasFeatureFlags !== false) {\n            if (!this._instance.config.advanced_disable_feature_flags_on_first_load) {\n                this._instance.featureFlags?.ensureFlagsLoaded()\n            }\n        }\n    }\n}\n", "import { PostHog } from './posthog-core'\nimport { Survey } from './posthog-surveys-types'\nimport { ConversationsRemoteConfig } from './posthog-conversations-types'\n\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SAMPLED } from './extensions/replay/external/triggerMatching'\n\n// Extension class types for __extensionClasses (type-only, no bundle impact)\nimport type { ExtensionConstructor } from './extensions/types'\nimport type { Autocapture } from './autocapture'\nimport type { DeadClicksAutocapture } from './extensions/dead-clicks-autocapture'\nimport type { ExceptionObserver } from './extensions/exception-autocapture'\nimport type { HistoryAutocapture } from './extensions/history-autocapture'\nimport type { TracingHeaders } from './extensions/tracing-headers'\nimport type { WebVitalsAutocapture } from './extensions/web-vitals'\nimport type { SessionRecording } from './extensions/replay/session-recording'\nimport type { Heatmaps } from './heatmaps'\nimport type { PostHogProductTours } from './posthog-product-tours'\nimport type { SiteApps } from './site-apps'\nimport type { PostHogSurveys } from './posthog-surveys'\nimport type { Toolbar } from './extensions/toolbar'\nimport type { PostHogExceptions } from './posthog-exceptions'\nimport type { WebExperiments } from './web-experiments'\nimport type { PostHogConversations } from './extensions/conversations/posthog-conversations'\nimport type { PostHogFeatureFlags } from './posthog-featureflags'\nimport type { PostHogLogs } from './posthog-logs'\n\n// ============================================================================\n// Re-export public types from @posthog/types\n// ============================================================================\n\n// Common types\nexport type { Property, Properties, JsonType, JsonRecord } from '@posthog/types'\n\n// Capture types\nexport type { KnownEventName, EventName, CaptureResult, CaptureOptions, BeforeSendFn } from '@posthog/types'\n\n// Feature flag types\nexport type {\n    FeatureFlagsCallback,\n    FeatureFlagDetail,\n    FeatureFlagMetadata,\n    EvaluationReason,\n    FeatureFlagResult,\n    FeatureFlagOptions,\n    RemoteConfigFeatureFlagCallback,\n    EarlyAccessFeature,\n    EarlyAccessFeatureStage,\n    EarlyAccessFeatureCallback,\n    EarlyAccessFeatureResponse,\n    FeatureFlagOverrides,\n    FeatureFlagPayloadOverrides,\n    FeatureFlagOverrideOptions,\n    OverrideFeatureFlagsOptions,\n} from '@posthog/types'\n\n// Request types\nexport type { Headers, RequestResponse, RequestCallback } from '@posthog/types'\n\n// Session recording types\nexport type {\n    SessionRecordingCanvasOptions,\n    InitiatorType,\n    NetworkRequest,\n    CapturedNetworkRequest,\n    SessionIdChangedCallback,\n    SeverityLevel,\n} from '@posthog/types'\n\n// Config types\nexport type {\n    AutocaptureCompatibleElement,\n    DomAutocaptureEvents,\n    AutocaptureConfig,\n    RageclickConfig,\n    BootstrapConfig,\n    SupportedWebVitalsMetrics,\n    PerformanceCaptureConfig,\n    DeadClickCandidate,\n    ExceptionAutoCaptureConfig,\n    ExceptionStepsConfig,\n    DeadClicksAutoCaptureConfig,\n    HeatmapConfig,\n    ConfigDefaults,\n    ExternalIntegrationKind,\n    ErrorTrackingOptions,\n    MaskInputOptions,\n    SlimDOMOptions,\n    SessionRecordingOptions,\n    RequestQueueConfig,\n} from '@posthog/types'\n\n// Toolbar types\nexport type { ToolbarUserIntent, ToolbarSource, ToolbarVersion, ToolbarParams } from '@posthog/types'\n\n// Log capture types\nexport type {\n    LogSeverityLevel,\n    OtlpSeverityText,\n    OtlpSeverityEntry,\n    LogAttributeValue,\n    LogAttributes,\n    CaptureLogOptions,\n    Logger,\n    OtlpAnyValue,\n    OtlpKeyValue,\n    OtlpLogRecord,\n    OtlpLogsPayload,\n} from '@posthog/types'\nexport type { LogSdkContext } from '@posthog/core'\n\n// Re-export KnownUnsafeEditableEvent from @posthog/core for backwards compatibility\nexport type { KnownUnsafeEditableEvent } from '@posthog/core'\n\n// ============================================================================\n// Browser-specific types that depend on local imports\n// These cannot be moved to @posthog/types as they reference browser-specific code\n// ============================================================================\n\n// Import types for internal use in this file\nimport type {\n    SessionRecordingCanvasOptions,\n    PerformanceCaptureConfig,\n    InitiatorType,\n    JsonType,\n    Properties,\n    EventName,\n    CapturedNetworkRequest,\n    SessionRecordingOptions,\n    FeatureFlagDetail,\n    ToolbarParams,\n    PostHogConfig as BasePostHogConfig,\n    PostHog as BasePostHogInterface,\n    RequestResponse,\n} from '@posthog/types'\n\n/* Small override from the base class to make it more specific to the browser/src/posthog-core.ts file\n * This guarantees we'll be able to use `PostHogConfig` as implemented in the browser/src/posthog-core.ts file\n * using the proper `loaded` function signature.\n */\nexport type PostHogInterface = Omit<BasePostHogInterface, 'config' | 'init'>\n\n/*\n * Specify that `loaded` should be using the PostHog instance type\n * as implemented by the browser/src/posthog-core.ts file rather than the @posthog/types type\n */\nexport type PostHogConfig = Omit<BasePostHogConfig, 'loaded'> & {\n    loaded: (posthog: PostHogInterface) => void\n\n    /**\n     * Internal: Extension class overrides for tree-shaking support.\n     * When provided, these classes are used instead of the default imports.\n     * This enables entrypoints to control which extensions are bundled.\n     * @internal\n     */\n    __extensionClasses?: {\n        exceptions?: ExtensionConstructor<PostHogExceptions>\n        historyAutocapture?: ExtensionConstructor<HistoryAutocapture>\n        tracingHeaders?: ExtensionConstructor<TracingHeaders>\n        siteApps?: ExtensionConstructor<SiteApps>\n        sessionRecording?: ExtensionConstructor<SessionRecording>\n        autocapture?: ExtensionConstructor<Autocapture>\n        productTours?: ExtensionConstructor<PostHogProductTours>\n        heatmaps?: ExtensionConstructor<Heatmaps>\n        webVitalsAutocapture?: ExtensionConstructor<WebVitalsAutocapture>\n        exceptionObserver?: ExtensionConstructor<ExceptionObserver>\n        deadClicksAutocapture?: ExtensionConstructor<DeadClicksAutocapture>\n        surveys?: ExtensionConstructor<PostHogSurveys>\n        toolbar?: ExtensionConstructor<Toolbar>\n        experiments?: ExtensionConstructor<WebExperiments>\n        conversations?: ExtensionConstructor<PostHogConversations>\n        featureFlags?: ExtensionConstructor<PostHogFeatureFlags>\n        logs?: ExtensionConstructor<PostHogLogs>\n    }\n}\n\n// See https://nextjs.org/docs/app/api-reference/functions/fetch#fetchurl-options\ntype NextOptions = { revalidate: false | 0 | number; tags: string[] }\n\nexport interface RequestWithOptions {\n    url: string\n    // Data can be a single object or an array of objects when batched\n    data?: Record<string, any> | Record<string, any>[]\n    headers?: Record<string, any>\n    transport?: 'XHR' | 'fetch' | 'sendBeacon'\n    method?: 'POST' | 'GET'\n    urlQueryArgs?: { compression: Compression }\n    callback?: (response: RequestResponse) => void\n    timeout?: number\n    noRetries?: boolean\n    disableTransport?: ('XHR' | 'fetch' | 'sendBeacon')[]\n    disableXHRCredentials?: boolean\n    compression?: Compression | 'best-available'\n    fetchOptions?: {\n        cache?: RequestInit['cache']\n        next?: NextOptions\n    }\n}\n\n// Queued request types - the same as a request but with additional queueing information\nexport interface QueuedRequestWithOptions extends RequestWithOptions {\n    /** key of queue, e.g. 'sessionRecording' vs 'event' */\n    batchKey?: string\n}\n\n// Used explicitly for retriable requests\nexport interface RetriableRequestWithOptions extends QueuedRequestWithOptions {\n    retriesPerformedSoFar?: number\n}\n\nexport type FlagVariant = { flag: string; variant: string }\n\n/** the config stored in persistence when session recording remote config is received */\nexport type SessionRecordingPersistedConfig = Omit<\n    SessionRecordingRemoteConfig,\n    | 'recordCanvas'\n    | 'canvasFps'\n    | 'canvasQuality'\n    | 'networkPayloadCapture'\n    | 'sampleRate'\n    | 'minimumDurationMilliseconds'\n> & {\n    /**\n     * Used to determine if the persisted config is still valid or we need to wait for a new one\n     * only accepts undefined since older versions of the library didn't set this.\n     */\n    cache_timestamp?: number\n    enabled: boolean\n    networkPayloadCapture: SessionRecordingRemoteConfig['networkPayloadCapture'] & {\n        capturePerformance: RemoteConfig['capturePerformance']\n    }\n    canvasRecording: {\n        enabled: SessionRecordingRemoteConfig['recordCanvas']\n        fps: SessionRecordingRemoteConfig['canvasFps']\n        quality: SessionRecordingRemoteConfig['canvasQuality']\n    }\n    // we don't allow string config here\n    sampleRate: number | null\n    minimumDurationMilliseconds: number | null | undefined\n}\n\nexport type SessionRecordingRemoteConfig = SessionRecordingCanvasOptions & {\n    endpoint?: string\n    consoleLogRecordingEnabled?: boolean\n    // the API returns a decimal between 0 and 1 as a string\n    sampleRate?: string | null\n    minimumDurationMilliseconds?: number\n    linkedFlag?: string | FlagVariant | null\n    networkPayloadCapture?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>\n    masking?: Pick<SessionRecordingOptions, 'maskAllInputs' | 'maskTextSelector' | 'blockSelector'>\n    urlTriggers?: SessionRecordingUrlTrigger[]\n    scriptConfig?: { script?: string | undefined }\n    urlBlocklist?: SessionRecordingUrlTrigger[]\n    eventTriggers?: string[]\n    /**\n     * Controls how event, url, sampling, and linked flag triggers are combined\n     *\n     * `any` means that if any of the triggers match, the session will be recorded\n     * `all` means that all the triggers must match for the session to be recorded\n     *\n     * originally it was (event || url) && (sampling || linked flag)\n     * which nobody wanted, now the default is all\n     */\n    triggerMatchType?: 'any' | 'all'\n    /**\n     * Config version - defaults to 1 (legacy)\n     * When version is 2, triggerGroups is used instead of individual trigger fields\n     */\n    version?: 1 | 2\n    /**\n     * V2 Trigger Groups - multiple named trigger groups with their own conditions and sample rates\n     * Only used when version === 2\n     */\n    triggerGroups?: SessionRecordingTriggerGroup[]\n}\n\n/**\n * Remote configuration for the PostHog instance\n *\n * All of these settings can be configured directly in your PostHog instance\n * Any configuration set in the client overrides the information from the server\n */\nexport interface RemoteConfig {\n    /**\n     * Supported compression algorithms\n     */\n    supportedCompression: Compression[]\n\n    /**\n     * If set, disables autocapture\n     */\n    autocapture_opt_out?: boolean\n\n    /**\n     *     originally capturePerformance was replay only and so boolean true\n     *     is equivalent to { network_timing: true }\n     *     now capture performance can be separately enabled within replay\n     *     and as a standalone web vitals tracker\n     *     people can have them enabled separately\n     *     they work standalone but enhance each other\n     *     TODO: deprecate this so we make a new config that doesn't need this explanation\n     */\n    capturePerformance?: boolean | PerformanceCaptureConfig\n\n    /**\n     * Whether we should use a custom endpoint for analytics\n     *\n     * @default { endpoint: \"/e\" }\n     */\n    analytics?: {\n        endpoint?: string\n    }\n\n    /**\n     * Whether the `$elements_chain` property should be sent as a string or as an array\n     *\n     * @default false\n     */\n    elementsChainAsString?: boolean\n\n    /**\n     * Error tracking configuration options\n     */\n    errorTracking?: {\n        autocaptureExceptions?: boolean\n        captureExtensionExceptions?: boolean\n        suppressionRules?: ErrorTrackingSuppressionRule[]\n    }\n\n    /**\n     * Whether capturing logs to the logs product is enabled\n     */\n    logs?: {\n        captureConsoleLogs?: boolean\n    }\n\n    /**\n     * This is currently in development and may have breaking changes without a major version bump\n     */\n    autocaptureExceptions?: boolean | { endpoint?: string }\n\n    /**\n     * Session recording configuration options\n     */\n    sessionRecording?: SessionRecordingRemoteConfig | false\n\n    /**\n     * Whether surveys are enabled\n     */\n    surveys?: boolean | Survey[]\n\n    /**\n     * Whether product tours are enabled\n     */\n    productTours?: boolean\n\n    /**\n     * Parameters for the toolbar\n     */\n    toolbarParams: ToolbarParams\n\n    /**\n     * @deprecated renamed to toolbarParams, still present on older API responses\n     */\n    editorParams?: ToolbarParams\n\n    /**\n     * @deprecated, moved to toolbarParams\n     */\n    toolbarVersion: 'toolbar'\n\n    /**\n     * Whether the user is authenticated\n     */\n    isAuthenticated: boolean\n\n    /**\n     * List of site apps with their IDs and URLs\n     */\n    siteApps: { id: string; url: string }[]\n\n    /**\n     * Whether heatmaps are enabled\n     */\n    heatmaps?: boolean\n\n    /**\n     * Whether to only capture identified users by default\n     */\n    defaultIdentifiedOnly?: boolean\n\n    /**\n     * Whether to capture dead clicks\n     */\n    captureDeadClicks?: boolean\n\n    /**\n     * Indicates if the team has any flags enabled (if not we don't need to load them)\n     */\n    hasFeatureFlags?: boolean\n\n    /**\n     * Conversations widget configuration\n     */\n    conversations?: boolean | ConversationsRemoteConfig\n}\n\n/**\n * Flags returns feature flags and their payloads\n */\nexport interface FlagsResponse extends RemoteConfig {\n    featureFlags: Record<string, string | boolean>\n    featureFlagPayloads: Record<string, JsonType>\n    errorsWhileComputingFlags: boolean\n    requestId?: string\n    flags: Record<string, FeatureFlagDetail>\n    evaluatedAt?: number\n}\n\nexport type SiteAppGlobals = {\n    event: {\n        uuid: string\n        event: EventName\n        properties: Properties\n        timestamp?: Date\n        elements_chain?: string\n        distinct_id?: string\n    }\n    person: {\n        properties: Properties\n    }\n    groups: Record<string, { id: string; type: string; properties: Properties }>\n}\n\nexport type SiteAppLoader = {\n    id: string\n    init: (config: { posthog: PostHog; callback: (success: boolean) => void }) => {\n        processEvent?: (globals: SiteAppGlobals) => void\n    }\n}\n\nexport type SiteApp = {\n    id: string\n    loaded: boolean\n    errored: boolean\n    processedBuffer: boolean\n    processEvent?: (globals: SiteAppGlobals) => void\n}\n\nexport interface PersistentStore {\n    _is_supported: () => boolean\n    _error: (error: any) => void\n    _parse: (name: string) => any\n    _get: (name: string) => any\n    _set: (\n        name: string,\n        value: any,\n        expire_days?: number | null,\n        cross_subdomain?: boolean,\n        secure?: boolean,\n        debug?: boolean\n    ) => void\n    _remove: (name: string, cross_subdomain?: boolean) => void\n}\n\nexport type EventHandler = (event: Event) => boolean | void\n\nexport type SnippetArrayItem = [method: string, ...args: any[]]\n\nexport type NetworkRecordOptions = {\n    initiatorTypes?: InitiatorType[]\n    maskRequestFn?: (data: CapturedNetworkRequest) => CapturedNetworkRequest | undefined\n    recordHeaders?: boolean | { request: boolean; response: boolean }\n    recordBody?: boolean | string[] | { request: boolean | string[]; response: boolean | string[] }\n    recordInitialRequests?: boolean\n    /**\n     * whether to record PerformanceEntry events for network requests\n     */\n    recordPerformance?: boolean\n    /**\n     * the PerformanceObserver will only observe these entry types\n     */\n    performanceEntryTypeToObserve: string[]\n    /**\n     * the maximum size of the request/response body to record\n     * NB this will be at most 1MB even if set larger\n     */\n    payloadSizeLimitBytes: number\n    /**\n     * some domains we should never record the payload\n     * for example other companies session replay ingestion payloads aren't super useful but are gigantic\n     * if this isn't provided we use a default list\n     * if this is provided - we add the provided list to the default list\n     * i.e. we never record the payloads on the default deny list\n     */\n    payloadHostDenyList?: string[]\n}\n\nexport type ErrorEventArgs = [\n    event: string | Event,\n    source?: string | undefined,\n    lineno?: number | undefined,\n    colno?: number | undefined,\n    error?: Error | undefined,\n]\n\n// levels originally copied from Sentry to work with the sentry integration\n// and to avoid relying on a frequently changing @sentry/types dependency\n// but provided as an array of literal types, so we can constrain the level below\nexport const severityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'] as const\n\nexport interface SessionRecordingUrlTrigger {\n    url: string\n    matching: 'regex'\n}\n\n/**\n * V2 event trigger - always an object with name, optionally with property filters.\n * The server normalizes bare event name strings to this shape before sending.\n */\nexport interface SessionRecordingEventTrigger {\n    name: string\n    properties?: SessionRecordingTriggerPropertyFilter[]\n}\n\nexport interface SessionRecordingTriggerPropertyFilter {\n    key: string\n    type: 'event' | 'person'\n    operator?: 'exact' | 'is_not' | 'icontains' | 'not_icontains' | 'regex' | 'not_regex' | 'gt' | 'lt'\n    value?: string | number | boolean | string[]\n}\n\n/**\n * V2 Trigger Group - represents a single trigger group with its own conditions and sample rate\n */\nexport interface SessionRecordingTriggerGroup {\n    id: string\n    name: string\n    sampleRate: number\n    minDurationMs?: number\n    conditions: {\n        matchType: 'any' | 'all'\n        events?: SessionRecordingEventTrigger[]\n        urls?: SessionRecordingUrlTrigger[]\n        flag?: string | FlagVariant\n        properties?: SessionRecordingTriggerPropertyFilter[]\n    }\n}\n\nexport type PropertyMatchType = 'regex' | 'not_regex' | 'exact' | 'is_not' | 'icontains' | 'not_icontains'\n\nexport interface ErrorTrackingSuppressionRule {\n    type: 'AND' | 'OR'\n    values: ErrorTrackingSuppressionRuleValue[]\n}\n\nexport interface ErrorTrackingSuppressionRuleValue {\n    key: '$exception_types' | '$exception_values'\n    operator: PropertyMatchType\n    value: string | string[]\n    type: string\n}\n\nexport type SessionStartReason =\n    | 'sampling_overridden'\n    | 'recording_initialized'\n    | 'linked_flag_matched'\n    | 'linked_flag_overridden'\n    | typeof SAMPLED\n    | 'session_id_changed'\n    | 'url_trigger_matched'\n    | 'event_trigger_matched'\n\nexport type OverrideConfig = {\n    sampling: boolean\n    linked_flag: boolean\n    url_trigger: boolean\n    event_trigger: boolean\n}\n\nexport const Compression = {\n    GZipJS: 'gzip-js',\n    Base64: 'base64',\n} as const\nexport type Compression = (typeof Compression)[keyof typeof Compression]\n", "// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Much of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// Many optimizations have been made, so the bundle size is ultimately smaller but performance is similar.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var u = ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([c], { type: 'text/javascript' })));\n    var w = new Worker(u);\n    w.onerror = function (e) { return cb(e.error, null); };\n    w.onmessage = function (e) { return cb(null, e.data); };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\n// see fleb note\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new u32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >>> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >>> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >>> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >>> 8) | ((x & 0x00FF) << 8)) >>> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i)\n        ++l[cd[i] - 1];\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 0; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >>> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i)\n            co[i] = rev[le[cd[i] - 1]++] >>> (15 - cd[i]);\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) >> 0;\n    return ((d[o] | (d[o + 1] << 8)) >>> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) >> 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >>> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p / 8) >> 0) + (p & 7 && 1); };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n    n.set(v.subarray(s, e));\n    return n;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, buf, st) {\n    // source length\n    var sl = dat.length;\n    // have to estimate size\n    var noBuf = !buf || st;\n    // no state\n    var noSt = !st || st.i;\n    if (!st)\n        st = {};\n    // Assumes roughly 33% compression ratio average\n    if (!buf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            st.f = final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        throw 'unexpected EOF';\n                    break;\n                }\n                // ensure size\n                if (noBuf)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                if (!noSt && pos + tl * (clb + 7) > tbts)\n                    break;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >>> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                throw 'invalid block type';\n            if (pos > tbts)\n                throw 'unexpected EOF';\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17;\n        if (noBuf)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var mxa = lbt + dbt + 18;\n        while (noSt || pos + mxa < tbts) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n            pos += c & 15;\n            if (pos > tbts)\n                throw 'unexpected EOF';\n            if (!c)\n                throw 'invalid length/literal';\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n                if (!d)\n                    throw 'invalid distance';\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & ((1 << b) - 1), pos += b;\n                }\n                if (pos > tbts)\n                    throw 'unexpected EOF';\n                if (noBuf)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                for (; bt < end; bt += 4) {\n                    buf[bt] = buf[bt - dt];\n                    buf[bt + 1] = buf[bt + 1 - dt];\n                    buf[bt + 2] = buf[bt + 2 - dt];\n                    buf[bt + 3] = buf[bt + 3 - dt];\n                }\n                bt = end;\n            }\n        }\n        st.l = lm, st.p = pos, st.b = bt;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    return bt == buf.length ? buf : slc(buf, 0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) >> 0;\n    d[o] |= v;\n    d[o + 1] |= v >>> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) >> 0;\n    d[o] |= v;\n    d[o + 1] |= v >>> 8;\n    d[o + 2] |= v >>> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return [new u8(0), 0];\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return [v, 1];\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return [new u8(tr), mbt];\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return [cl.subarray(0, cli), s];\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >>> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a[0], mlb = _a[1];\n    var _b = hTree(df, 15), ddt = _b[0], mdb = _b[1];\n    var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n    var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        lcfreq[lclt[i] & 31]++;\n    for (var i = 0; i < lcdt.length; ++i)\n        lcfreq[lcdt[i] & 31]++;\n    var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n    if (flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >>> 5) & 127), p += clct[i] >>> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        if (syms[i] > 255) {\n            var len = (syms[i] >>> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (syms[i] >>> 23) & 31), p += fleb[len];\n            var dst = syms[i] & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (syms[i] >>> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, lst) {\n    var s = dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.floor(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var pos = 0;\n    if (!lvl || s < 8) {\n        for (var i = 0; i <= s; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e < s) {\n                // write full block\n                pos = wfblk(w, pos, dat.subarray(i, e));\n            }\n            else {\n                // write final block\n                w[i] = lst;\n                pos = wfblk(w, pos, dat.subarray(i, s));\n            }\n        }\n    }\n    else {\n        var opt = deo[lvl - 1];\n        var n = opt >>> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = new u16(32768), head = new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new u32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index  l/lind  waitdx  bitpos\n        var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n        for (; i < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768\n            var imod = i & 32767;\n            // previous index with this value\n            var pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && rem > 423) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = (imod - pimod) & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = (i - dif + j + 32768) & 32767;\n                                    var pti = prev[ti];\n                                    var cd = (ti - pti + 32768) & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += (imod - pimod + 32768) & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one Uint32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        // this is the easiest way to avoid needing to maintain state\n        if (!lst)\n            pos = wfblk(w, pos, et);\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new u32(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && 0xEDB88320) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = 0xFFFFFFFF;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return c ^ 0xFFFFFFFF; }\n    };\n};\n// Alder32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 5552, l);\n                for (; i < e; ++i)\n                    n += d[i], m += n;\n                n %= 65521, m %= 65521;\n            }\n            a = n, b = m;\n        },\n        d: function () { return ((a >>> 8) << 16 | (b & 255) << 8 | (b >>> 8)) + ((a & 255) << 23) * 2; }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : (12 + opt.mem), pre, post, !st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/ /g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return [fnStr, td];\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k] instanceof u8 || v[k] instanceof u16 || v[k] instanceof u32)\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    var _a;\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            _a = wcln(fns[i], fnStr, td_1), fnStr = _a[0], td_1 = _a[1];\n        ch[id] = wcln(fns[m], fnStr, td_1);\n    }\n    var td = mrg({}, ch[id][1]);\n    return wk(ch[id][0] + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, u32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, hMap, max, bits, bits16, shft, slc, inflt, inflateSync, pbf, gu8]; };\nvar bDflt = function () { return [u8, u16, u32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zlv]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get u8\nvar gu8 = function (o) { return o && o.size && new u8(o.size); };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    if (!opts.consume)\n        dat = new u8(dat);\n    w.postMessage([dat, opts], [dat.buffer]);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) { return strm.push(ev.data[0], ev.data[1]); };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.push = function (d, f) {\n        if (t)\n            throw 'stream finished';\n        if (!strm.ondata)\n            throw 'no stream handler';\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16)) + (d[b + 3] << 23) * 2; };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        throw 'invalid gzip data';\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += d[10] | (d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16) + (2 * (d[l - 1] << 23));\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + ((o.filename && (o.filename.length + 1)) || 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (fl ? (32 - 2 * fl) : 1);\n};\n// zlib valid\nvar zlv = function (d) {\n    if ((d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        throw 'invalid zlib data';\n    if (d[1] & 32)\n        throw 'invalid zlib data: preset dictionaries not supported';\n};\nfunction AsyncCmpStrm(opts, cb) {\n    if (!cb && typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n// zlib footer: -4 to -0 is Adler32\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (!cb && typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, !f), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (this.d)\n            throw 'stream finished';\n        if (!this.ondata)\n            throw 'no stream handler';\n        this.d = final;\n        this.p(chunk, final || false);\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    if (opts === void 0) { opts = {}; }\n    return dopt(data, opts, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an inflation stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Inflate(cb) {\n        this.s = {};\n        this.p = new u8(0);\n        this.ondata = cb;\n    }\n    Inflate.prototype.e = function (c) {\n        if (this.d)\n            throw 'stream finished';\n        if (!this.ondata)\n            throw 'no stream handler';\n        var l = this.p.length;\n        var n = new u8(l + c.length);\n        n.set(this.p), n.set(c, l), this.p = n;\n    };\n    Inflate.prototype.c = function (final) {\n        this.d = this.s.i = final || false;\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.o, this.s);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) >> 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous inflation stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncInflate(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, 0, function () {\n            var strm = new Inflate();\n            onmessage = astrm(strm);\n        }, 7);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gu8(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, out) {\n    return inflt(data, out);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        this.c.p(c);\n        this.l += c.length;\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, !f);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (opts === void 0) { opts = {}; }\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a GUNZIP stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Gunzip(cb) {\n        this.v = 1;\n        Inflate.call(this, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            var s = gzs(this.p);\n            if (s >= this.p.length && !final)\n                return;\n            this.p = this.p.subarray(s), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 8)\n                throw 'invalid gzip stream';\n            this.p = this.p.subarray(0, -8);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous GUNZIP stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncGunzip(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, 0, function () {\n            var strm = new Gunzip();\n            onmessage = astrm(strm);\n        }, 9);\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param out Where to write the data. GZIP already encodes the output size, so providing this doesn't save memory.\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, out) {\n    return inflt(data.subarray(gzs(data), -8), out || new u8(gzl(data)));\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        this.c.p(c);\n        var raw = dopt(c, this.o, this.v && 2, f && 4, !f);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, AsyncCmpStrm.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (opts === void 0) { opts = {}; }\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    /**\n     * Creates a Zlib decompression stream\n     * @param cb The callback to call whenever data is inflated\n     */\n    function Unzlib(cb) {\n        this.v = 1;\n        Inflate.call(this, cb);\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 2 && !final)\n                return;\n            this.p = this.p.subarray(2), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                throw 'invalid zlib stream';\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous Zlib decompression stream\n     * @param cb The callback to call whenever data is deflated\n     */\n    function AsyncUnzlib(cb) {\n        this.ondata = cb;\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, 0, function () {\n            var strm = new Unzlib();\n            onmessage = astrm(strm);\n        }, 11);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gu8(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, out) {\n    return inflt((zlv(data), data.subarray(2, -4)), out);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    /**\n     * Creates a decompression stream\n     * @param cb The callback to call whenever data is decompressed\n     */\n    function Decompress(cb) {\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            throw 'no stream handler';\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                var _this_1 = this;\n                var cb = function () { _this_1.ondata.apply(_this_1, arguments); };\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(cb)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(cb)\n                        : new this.Z(cb);\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    /**\n   * Creates an asynchronous decompression stream\n   * @param cb The callback to call whenever data is decompressed\n   */\n    function AsyncDecompress(cb) {\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param out Where to write the data. Saves memory if you know the decompressed size and provide an output buffer of that length.\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, out) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, out)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, out)\n            : unzlibSync(data, out);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k;\n        if (val instanceof u8)\n            t[n] = [val, o];\n        else if (Array.isArray(val))\n            t[n] = [val[0], mrg(o, val[1])];\n        else\n            fltn(val, n + '/', t, o);\n    }\n};\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    var l = str.length;\n    if (!latin1 && typeof TextEncoder != 'undefined')\n        return new TextEncoder().encode(str);\n    var ar = new u8(str.length + (str.length >>> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >>> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >>> 18)), w(128 | ((c >>> 12) & 63)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >>> 12)), w(128 | ((c >>> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    var r = '';\n    if (!latin1 && typeof TextDecoder != 'undefined')\n        return new TextDecoder().decode(dat);\n    for (var i = 0; i < dat.length;) {\n        var c = dat[i++];\n        if (c < 128 || latin1)\n            r += String.fromCharCode(c);\n        else if (c < 224)\n            r += String.fromCharCode((c & 31) << 6 | (dat[i++] & 63));\n        else if (c < 240)\n            r += String.fromCharCode((c & 15) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63));\n        else\n            c = ((c & 15) << 18 | (dat[i++] & 63) << 12 | (dat[i++] & 63) << 6 | (dat[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n    }\n    return r;\n}\n;\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n    var _a = z ? z64e(d, es) : [b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b4(d, b + 12), b4(d, b + 4), b4(d, b + 20)];\n};\n// write zip header\nvar wzh = function (d, b, c, cmp, su, fn, u, o, ce, t) {\n    var fl = fn.length, l = cmp.length;\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b] = 20, b += 2;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (t == 8 && (o.level == 1 ? 6 : o.level < 6 ? 4 : o.level == 9 ? 2 : 0)), d[b++] = u && 8;\n    d[b] = t, b += 2;\n    var dt = new Date(o.mtime || Date.now()), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        throw 'date not in range 1980-2099';\n    wbytes(d, b, ((y << 24) * 2) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >>> 1));\n    b += 4;\n    wbytes(d, b, c);\n    wbytes(d, b + 4, l);\n    wbytes(d, b + 8, su);\n    wbytes(d, b + 12, fl), b += 16; // skip extra field, comment\n    if (ce != null)\n        wbytes(d, b += 10, ce), b += 4;\n    d.set(fn, b);\n    b += fl;\n    if (ce == null)\n        d.set(cmp, b);\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        throw 'no callback';\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                wzh(out, tot, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n                wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, tot, f.t), o += 46 + f.n.length, tot += 30 + f.n.length + f.d.length;\n            }\n            catch (e) {\n                return cb(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cb(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), m = file.length;\n        c.p(file);\n        var n = strToU8(fn), s = n.length;\n        var t = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cb(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = {\n                    t: t,\n                    d: d,\n                    m: m,\n                    c: c.d(),\n                    u: fn.length != l,\n                    n: n,\n                    p: p\n                };\n                o += 30 + s + l;\n                tot += 76 + 2 * s + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (n.length > 65535)\n            cbl('filename too long', null);\n        if (!t)\n            cbl(null, file);\n        else if (m < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (opts === void 0) { opts = {}; }\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var t = p.level == 0 ? 0 : 8;\n        var n = strToU8(fn), s = n.length;\n        if (n.length > 65535)\n            throw 'filename too long';\n        var d = t ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push({\n            t: t,\n            d: d,\n            m: file.length,\n            c: c.d(),\n            u: fn.length != s,\n            n: n,\n            o: o,\n            p: p\n        });\n        o += 30 + s + l;\n        tot += 76 + 2 * s + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f.c, f.d, f.m, f.n, f.u, f.p, null, f.t);\n        wzh(out, o, f.c, f.d, f.m, f.n, f.u, f.p, f.o, f.t), o += 46 + f.n.length;\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Asynchronously decompresses a ZIP archive\n * @param data The raw compressed ZIP file\n * @param cb The callback to call with the decompressed files\n * @returns A function that can be used to immediately terminate the unzipping\n */\nexport function unzip(data, cb) {\n    if (typeof cb != 'function')\n        throw 'no callback';\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cb('invalid zip file', null);\n            return;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (!lft)\n        cb(null, {});\n    var c = lft;\n    var o = b4(data, e + 16);\n    var z = o == 4294967295;\n    if (z) {\n        e = b4(data, e - 12);\n        if (b4(data, e) != 0x6064B50)\n            throw 'invalid zip file';\n        c = lft = b4(data, e + 32);\n        o = b4(data, e + 48);\n    }\n    var _loop_2 = function (i) {\n        var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cb(e, null);\n            }\n            else {\n                files[fn] = d;\n                if (!--lft)\n                    cb(null, files);\n            }\n        };\n        if (!c_1)\n            cbl(null, slc(data, b, b + sc));\n        else if (c_1 == 8) {\n            var infl = data.subarray(b, b + sc);\n            if (sc < 320000) {\n                try {\n                    cbl(null, inflateSync(infl, new u8(su)));\n                }\n                catch (e) {\n                    cbl(e, null);\n                }\n            }\n            else\n                term.push(inflate(infl, { size: su }, cbl));\n        }\n        else\n            cbl('unknown compression type ' + c_1, null);\n    };\n    for (var i = 0; i < c; ++i) {\n        _loop_2(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @returns The decompressed files\n */\nexport function unzipSync(data) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            throw 'invalid zip file';\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295;\n    if (z) {\n        e = b4(data, e - 12);\n        if (b4(data, e) != 0x6064B50)\n            throw 'invalid zip file';\n        c = b4(data, e + 32);\n        o = b4(data, e + 48);\n    }\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!c_2)\n            files[fn] = slc(data, b, b + sc);\n        else if (c_2 == 8)\n            files[fn] = inflateSync(data.subarray(b, b + sc), new u8(su));\n        else\n            throw 'unknown compression type ' + c_2;\n    }\n    return files;\n}\n", "import { each, find } from './utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport { formDataToQuery } from './utils/request-utils'\n\nimport { logger } from './utils/logger'\nimport { AbortController, CompressionStream, fetch, navigator, XMLHttpRequest } from './utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from './utils/encode-utils'\nimport { gzipCompress, isNativeAsyncGzipReadError } from '@posthog/core'\n\ninterface RequestWithEncodedBody extends RequestWithOptions {\n    _encodedBody?: EncodedBody\n}\n\n// eslint-disable-next-line compat/compat\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\nlet nativeAsyncGzipDisabled = false\n\ntype EncodedBody = {\n    contentType: string\n    body: string | BlobPart | ArrayBuffer\n    estimatedSize: number\n}\n\n/**\n * Extends a URL with additional query parameters\n * @param url - The URL to extend\n * @param params - The parameters to add\n * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.\n * @returns The URL with extended parameters\n */\nexport const extendURLParams = (url: string, params: Record<string, any>, replace: boolean = true): string => {\n    const [baseUrl, search] = url.split('?')\n    const newParams = { ...params }\n\n    const updatedSearch =\n        search?.split('&').map((pair) => {\n            const [key, origValue] = pair.split('=')\n            const value = replace ? (newParams[key] ?? origValue) : origValue\n            delete newParams[key]\n            return `${key}=${value}`\n        }) ?? []\n\n    const remaining = formDataToQuery(newParams)\n    if (remaining) {\n        updatedSearch.push(remaining)\n    }\n\n    return `${baseUrl}?${updatedSearch.join('&')}`\n}\n\nexport const jsonStringify = (data: any, space?: string | number): string => {\n    // With plain JSON.stringify, we get an exception when a property is a BigInt. This has caused problems for some users,\n    // see https://github.com/PostHog/posthog-js/issues/1440\n    // To work around this, we convert BigInts to strings before stringifying the data. This is not ideal, as we lose\n    // information that this was originally a number, but given ClickHouse doesn't support BigInts, the customer\n    // would not be able to operate on these numerically anyway.\n    return JSON.stringify(data, (_, value) => (typeof value === 'bigint' ? value.toString() : value), space)\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n    return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = (options: RequestWithEncodedBody): EncodedBody | undefined => {\n    // Use pre-encoded body if available (set by async compression in the request entrypoint)\n    if (options._encodedBody) {\n        return options._encodedBody\n    }\n\n    const { data, compression } = options\n    if (!data) {\n        return\n    }\n\n    if (compression === Compression.GZipJS) {\n        const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n        return {\n            contentType: CONTENT_TYPE_PLAIN,\n            body: gzipData.buffer.slice(gzipData.byteOffset, gzipData.byteOffset + gzipData.byteLength) as ArrayBuffer,\n            estimatedSize: gzipData.byteLength,\n        }\n    }\n\n    if (compression === Compression.Base64) {\n        const b64data = _base64Encode(jsonStringify(data))\n        const encodedBody = encodeToDataString(b64data)\n\n        return {\n            contentType: CONTENT_TYPE_FORM,\n            body: encodedBody,\n            estimatedSize: new Blob([encodedBody]).size,\n        }\n    }\n\n    const jsonBody = jsonStringify(data)\n    return {\n        contentType: CONTENT_TYPE_JSON,\n        body: jsonBody,\n        estimatedSize: new Blob([jsonBody]).size,\n    }\n}\n\n/**\n * Pre-encode the request body using async native CompressionStream.\n * This avoids blocking the main thread with fflate's synchronous gzip,\n * which can take 300ms+ on constrained devices.\n *\n * Callers must check preconditions (data exists, gzip compression, CompressionStream available)\n * before calling this function.\n */\nconst preEncodeAsync = async (options: RequestWithEncodedBody): Promise<RequestWithEncodedBody> => {\n    const jsonData = jsonStringify(options.data)\n    const compressed = await gzipCompress(jsonData, Config.DEBUG, { rethrow: true })\n    if (!compressed) {\n        return options\n    }\n    const body = await compressed.arrayBuffer()\n\n    return {\n        ...options,\n        _encodedBody: {\n            contentType: CONTENT_TYPE_PLAIN,\n            body,\n            estimatedSize: body.byteLength,\n        },\n    }\n}\n\nconst xhr = (options: RequestWithOptions) => {\n    const req = new XMLHttpRequest!()\n    req.open(options.method || 'GET', options.url, true)\n    const { contentType, body } = encodePostData(options) ?? {}\n\n    each(options.headers, function (headerValue, headerName) {\n        req.setRequestHeader(headerName, headerValue)\n    })\n\n    if (contentType) {\n        req.setRequestHeader('Content-Type', contentType)\n    }\n\n    if (options.timeout) {\n        req.timeout = options.timeout\n    }\n    if (!options.disableXHRCredentials) {\n        // send the ph_optout cookie\n        // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n        req.withCredentials = true\n    }\n    req.onreadystatechange = () => {\n        // XMLHttpRequest.DONE == 4, except in safari 4\n        if (req.readyState === 4) {\n            const response: RequestResponse = {\n                statusCode: req.status,\n                text: req.responseText,\n            }\n            if (req.status === 200) {\n                try {\n                    response.json = JSON.parse(req.responseText)\n                } catch {\n                    // logger.error(e)\n                }\n            }\n\n            options.callback?.(response)\n        }\n    }\n    req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions) => {\n    const { contentType, body, estimatedSize } = encodePostData(options) ?? {}\n\n    // eslint-disable-next-line compat/compat\n    const headers = new Headers()\n    each(options.headers, function (headerValue, headerName) {\n        headers.append(headerName, headerValue)\n    })\n\n    if (contentType) {\n        headers.append('Content-Type', contentType)\n    }\n\n    const url = options.url\n    let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n\n    if (AbortController) {\n        const controller = new AbortController()\n        aborter = {\n            signal: controller.signal,\n            timeout: setTimeout(() => controller.abort(), options.timeout),\n        }\n    }\n\n    fetch!(url, {\n        method: options?.method || 'GET',\n        headers,\n        // if body is greater than 64kb, then fetch with keepalive will error\n        // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n        // but we do want to set keepalive sometimes as it can  help with success\n        // when e.g. a page is being closed\n        // so let's get the best of both worlds and only set keepalive for POST requests\n        // where the body is less than 64kb\n        // NB this is fetch keepalive and not http keepalive\n        keepalive: options.method === 'POST' && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n        body,\n        signal: aborter?.signal,\n        ...options.fetchOptions,\n    })\n        .then((response) => {\n            return response.text().then((responseText) => {\n                const res: RequestResponse = {\n                    statusCode: response.status,\n                    text: responseText,\n                }\n\n                if (response.status === 200) {\n                    try {\n                        res.json = JSON.parse(responseText)\n                    } catch (e) {\n                        logger.error(e)\n                    }\n                }\n\n                options.callback?.(res)\n            })\n        })\n        .catch((error) => {\n            logger.error(error)\n            options.callback?.({ statusCode: 0, error })\n        })\n        .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n\n    return\n}\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n    // beacon documentation https://w3c.github.io/beacon/\n    // beacons format the message and use the type property\n\n    const url = extendURLParams(options.url, {\n        beacon: '1',\n    })\n\n    try {\n        const { contentType, body } = encodePostData(options) ?? {}\n        if (!body) {\n            return\n        }\n        // sendBeacon requires a Blob to set the Content-Type header correctly.\n        // Without wrapping, ArrayBuffer bodies are sent with no Content-Type,\n        // which can cause issues with proxies/WAFs that require it.\n        const sendBeaconBody = body instanceof Blob ? body : new Blob([body], { type: contentType })\n        navigator!.sendBeacon!(url, sendBeaconBody)\n    } catch {\n        // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n        // we don't want to throw errors here\n    }\n}\n\nconst buildRequestURL = (url: string, compression?: RequestWithOptions['compression']): string => {\n    return extendURLParams(url, {\n        _: new Date().getTime().toString(),\n        ver: Config.JS_SDK_VERSION,\n        compression,\n    })\n}\n\nconst AVAILABLE_TRANSPORTS: {\n    transport: RequestWithOptions['transport']\n    method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n    AVAILABLE_TRANSPORTS.push({\n        transport: 'fetch',\n        method: _fetch,\n    })\n}\n\nif (XMLHttpRequest) {\n    AVAILABLE_TRANSPORTS.push({\n        transport: 'XHR',\n        method: xhr,\n    })\n}\n\nif (navigator?.sendBeacon) {\n    AVAILABLE_TRANSPORTS.push({\n        transport: 'sendBeacon',\n        method: _sendBeacon,\n    })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n    // Clone the options so we don't modify the original object\n    const options: RequestWithEncodedBody = { ..._options }\n    options.timeout = options.timeout || 60000\n\n    options.url = buildRequestURL(options.url, options.compression)\n\n    const transport = options.transport ?? 'fetch'\n\n    const availableTransports = AVAILABLE_TRANSPORTS.filter(\n        (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n    )\n\n    const transportMethod =\n        find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n    if (!transportMethod) {\n        throw new Error('No available transport method')\n    }\n\n    // For non-sendBeacon transports, use async native CompressionStream when available\n    // to avoid blocking the main thread with fflate's synchronous gzip (which can take 300ms+).\n    // sendBeacon must remain synchronous as it's used during page unload.\n    if (\n        transport !== 'sendBeacon' &&\n        options.data &&\n        options.compression === Compression.GZipJS &&\n        !!CompressionStream &&\n        !nativeAsyncGzipDisabled\n    ) {\n        preEncodeAsync(options)\n            .then((encodedOptions) => {\n                transportMethod(encodedOptions)\n            })\n            .catch((error) => {\n                if (isNativeAsyncGzipReadError(error)) {\n                    nativeAsyncGzipDisabled = true\n                    transportMethod({\n                        ...options,\n                        compression: undefined,\n                        url: buildRequestURL(_options.url, undefined),\n                    })\n                    return\n                }\n\n                // If async compression fails for another reason, fall back to the synchronous fflate path\n                transportMethod(options)\n            })\n    } else {\n        transportMethod(options)\n    }\n}\n", "/**\n * UTF-8 safe base64 encoding.\n * Uses encodeURIComponent to handle Unicode, then converts percent-encoded bytes\n * back to characters that btoa can handle.\n */\nexport function _base64Encode(data: null): null\nexport function _base64Encode(data: undefined): undefined\nexport function _base64Encode(data: string): string\nexport function _base64Encode(data: string | null | undefined): string | null | undefined {\n    if (!data) {\n        return data\n    }\n    return btoa(encodeURIComponent(data).replace(/%([0-9A-F]{2})/g, (_, p1) => String.fromCharCode(parseInt(p1, 16))))\n}\n", "import { QueuedRequestWithOptions, RequestQueueConfig } from './types'\nimport { each } from './utils'\n\nimport { isArray, isUndefined, clampToRange } from '@posthog/core'\nimport { logger } from './utils/logger'\n\nexport const DEFAULT_FLUSH_INTERVAL_MS = 3000\n\nexport class RequestQueue {\n    // We start in a paused state and only start flushing when enabled by the parent\n    private _isPaused: boolean = true\n    private _queue: QueuedRequestWithOptions[] = []\n    private _flushTimeout?: ReturnType<typeof setTimeout>\n    private _flushTimeoutMs: number\n    private _sendRequest: (req: QueuedRequestWithOptions) => void\n\n    constructor(sendRequest: (req: QueuedRequestWithOptions) => void, config?: RequestQueueConfig) {\n        this._flushTimeoutMs = clampToRange(\n            config?.flush_interval_ms || DEFAULT_FLUSH_INTERVAL_MS,\n            250,\n            5000,\n            logger.createLogger('flush interval'),\n            DEFAULT_FLUSH_INTERVAL_MS\n        )\n        this._sendRequest = sendRequest\n    }\n\n    enqueue(req: QueuedRequestWithOptions): void {\n        this._queue.push(req)\n\n        if (!this._flushTimeout) {\n            this._setFlushTimeout()\n        }\n    }\n\n    unload(): void {\n        this._clearFlushTimeout()\n        const requests = this._queue.length > 0 ? this._formatQueue() : {}\n        const requestValues = Object.values(requests)\n\n        // Always force events to be sent before recordings, as events are more important, and recordings are bigger and thus less likely to arrive\n        const sortedRequests = [\n            ...requestValues.filter((r) => r.url.indexOf('/e') === 0),\n            ...requestValues.filter((r) => r.url.indexOf('/e') !== 0),\n        ]\n        sortedRequests.map((req) => {\n            this._sendRequest({ ...req, transport: 'sendBeacon' })\n        })\n    }\n\n    enable(): void {\n        this._isPaused = false\n        this._setFlushTimeout()\n    }\n\n    private _setFlushTimeout(): void {\n        if (this._isPaused) {\n            return\n        }\n        this._flushTimeout = setTimeout(() => {\n            this._clearFlushTimeout()\n            if (this._queue.length > 0) {\n                const requests = this._formatQueue()\n                for (const key in requests) {\n                    const req = requests[key]\n                    const now = new Date().getTime()\n\n                    if (req.data && isArray(req.data)) {\n                        each(req.data, (data) => {\n                            data['offset'] = Math.abs(data['timestamp'] - now)\n                            delete data['timestamp']\n                        })\n                    }\n                    this._sendRequest(req)\n                }\n            }\n        }, this._flushTimeoutMs)\n    }\n\n    private _clearFlushTimeout(): void {\n        clearTimeout(this._flushTimeout)\n        this._flushTimeout = undefined\n    }\n\n    private _formatQueue(): Record<string, QueuedRequestWithOptions> {\n        const requests: Record<string, QueuedRequestWithOptions> = {}\n        each(this._queue, (request: QueuedRequestWithOptions) => {\n            const req = request\n            const key = (req ? req.batchKey : null) || req.url\n            if (isUndefined(requests[key])) {\n                // TODO: What about this -it seems to batch data into an array - do we always want that?\n                requests[key] = { ...req, data: [] }\n            }\n\n            requests[key].data?.push(req.data)\n        })\n\n        this._queue = []\n        return requests\n    }\n}\n", "import { RetriableRequestWithOptions } from './types'\n\nimport { isPositiveNumber, isUndefined } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { extendURLParams } from './request'\nimport { addEventListener } from './utils'\n\nconst thirtyMinutes = 30 * 60 * 1000\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n    const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n    const minBackoff = rawBackoffTime / 2\n    const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n    const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n    const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n    return Math.ceil(cappedBackoffTime + jitter)\n}\n\ninterface RetryQueueElement {\n    retryAt: number\n    requestOptions: RetriableRequestWithOptions\n}\n\nexport class RetryQueue {\n    private _isPolling: boolean = false\n    private _poller: number | undefined\n    private _pollIntervalMs: number = 3000\n    private _queue: RetryQueueElement[] = []\n    private _areWeOnline: boolean\n    private _onlineListener: (() => void) | undefined\n    private _offlineListener: (() => void) | undefined\n\n    constructor(private _instance: PostHog) {\n        this._queue = []\n        this._areWeOnline = true\n\n        if (!isUndefined(window) && 'onLine' in window.navigator) {\n            this._areWeOnline = window.navigator.onLine\n\n            this._onlineListener = () => {\n                this._areWeOnline = true\n                this._flush()\n            }\n\n            this._offlineListener = () => {\n                this._areWeOnline = false\n            }\n\n            addEventListener(window, 'online', this._onlineListener)\n            addEventListener(window, 'offline', this._offlineListener)\n        }\n    }\n\n    get length() {\n        return this._queue.length\n    }\n\n    retriableRequest({ retriesPerformedSoFar, ...options }: RetriableRequestWithOptions): void {\n        if (isPositiveNumber(retriesPerformedSoFar)) {\n            options.url = extendURLParams(options.url, { retry_count: retriesPerformedSoFar })\n        }\n\n        this._instance._send_request({\n            ...options,\n            callback: (response) => {\n                if (response.statusCode !== 200 && (response.statusCode < 400 || response.statusCode >= 500)) {\n                    if ((retriesPerformedSoFar ?? 0) < 10) {\n                        this._enqueue({\n                            retriesPerformedSoFar,\n                            ...options,\n                        })\n                        return\n                    }\n                }\n\n                options.callback?.(response)\n            },\n        })\n    }\n\n    private _enqueue(requestOptions: RetriableRequestWithOptions): void {\n        const retriesPerformedSoFar = requestOptions.retriesPerformedSoFar || 0\n        requestOptions.retriesPerformedSoFar = retriesPerformedSoFar + 1\n\n        const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n        const retryAt = Date.now() + msToNextRetry\n\n        this._queue.push({ retryAt, requestOptions })\n\n        let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n        if (!navigator.onLine) {\n            logMessage += ' (Browser is offline)'\n        }\n        logger.warn(logMessage)\n\n        if (!this._isPolling) {\n            this._isPolling = true\n            this._poll()\n        }\n    }\n\n    private _poll(): void {\n        this._poller && clearTimeout(this._poller)\n\n        if (this._queue.length === 0) {\n            this._isPolling = false\n            this._poller = undefined\n            return\n        }\n\n        this._poller = setTimeout(() => {\n            if (this._areWeOnline && this._queue.length > 0) {\n                this._flush()\n            }\n            this._poll()\n        }, this._pollIntervalMs) as any as number\n    }\n\n    private _flush(): void {\n        const now = Date.now()\n        const notToFlush: RetryQueueElement[] = []\n        const toFlush = this._queue.filter((item) => {\n            if (item.retryAt < now) {\n                return true\n            }\n            notToFlush.push(item)\n            return false\n        })\n\n        this._queue = notToFlush\n\n        if (toFlush.length > 0) {\n            for (const { requestOptions } of toFlush) {\n                this.retriableRequest(requestOptions)\n            }\n        }\n    }\n\n    unload(): void {\n        if (this._poller) {\n            clearTimeout(this._poller)\n            this._poller = undefined\n        }\n\n        this._isPolling = false\n\n        if (!isUndefined(window)) {\n            if (this._onlineListener) {\n                window.removeEventListener('online', this._onlineListener)\n                this._onlineListener = undefined\n            }\n            if (this._offlineListener) {\n                window.removeEventListener('offline', this._offlineListener)\n                this._offlineListener = undefined\n            }\n        }\n\n        for (const { requestOptions } of this._queue) {\n            try {\n                // we've had send beacon in place for at least 2 years\n                // eslint-disable-next-line compat/compat\n                this._instance._send_request({\n                    ...requestOptions,\n                    transport: 'sendBeacon',\n                })\n            } catch (e) {\n                // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n                // This means in some cases `this.getConfig` will be undefined.\n                logger.error(e)\n            }\n        }\n        this._queue = []\n    }\n}\n", "import { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { addEventListener } from './utils'\nimport { isArray } from '@posthog/core'\n\nexport interface ScrollContext {\n    // scroll is how far down the page the user has scrolled,\n    // content is how far down the page the user can view content\n    // (e.g. if the page is 1000 tall, but the user's screen is only 500 tall,\n    // and they don't scroll at all, then scroll is 0 and content is 500)\n    maxScrollHeight?: number\n    maxScrollY?: number\n    lastScrollY?: number\n    maxContentHeight?: number\n    maxContentY?: number\n    lastContentY?: number\n}\n\n// This class is responsible for tracking scroll events and maintaining the scroll context\nexport class ScrollManager {\n    private _context: ScrollContext | undefined\n\n    constructor(private _instance: PostHog) {}\n\n    private get _scrollRoot() {\n        return this._instance.config.scroll_root_selector\n    }\n\n    getContext(): ScrollContext | undefined {\n        return this._context\n    }\n\n    resetContext(): ScrollContext | undefined {\n        const ctx = this._context\n\n        // update the scroll properties for the new page, but wait until the next tick\n        // of the event loop\n        setTimeout(this._updateScrollData, 0)\n\n        return ctx\n    }\n\n    private _updateScrollData = () => {\n        if (!this._context) {\n            this._context = {}\n        }\n\n        const el = this.scrollElement()\n\n        const scrollY = this.scrollY()\n        const scrollHeight = el ? Math.max(0, el.scrollHeight - el.clientHeight) : 0\n        const contentY = scrollY + (el?.clientHeight || 0)\n        const contentHeight = el?.scrollHeight || 0\n\n        this._context.lastScrollY = Math.ceil(scrollY)\n        this._context.maxScrollY = Math.max(scrollY, this._context.maxScrollY ?? 0)\n        this._context.maxScrollHeight = Math.max(scrollHeight, this._context.maxScrollHeight ?? 0)\n\n        this._context.lastContentY = contentY\n        this._context.maxContentY = Math.max(contentY, this._context.maxContentY ?? 0)\n        this._context.maxContentHeight = Math.max(contentHeight, this._context.maxContentHeight ?? 0)\n    }\n\n    // `capture: true` is required to get scroll events for other scrollable elements\n    // on the page, not just the window\n    // see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n    startMeasuringScrollPosition() {\n        addEventListener(window, 'scroll', this._updateScrollData, { capture: true })\n        addEventListener(window, 'scrollend', this._updateScrollData, { capture: true })\n        addEventListener(window, 'resize', this._updateScrollData)\n    }\n\n    public scrollElement(): Element | undefined {\n        if (this._scrollRoot) {\n            const selectors = isArray(this._scrollRoot) ? this._scrollRoot : [this._scrollRoot]\n            for (const selector of selectors) {\n                const element = window?.document.querySelector(selector)\n                if (element) {\n                    return element\n                }\n            }\n            return undefined\n        } else {\n            return window?.document.documentElement\n        }\n    }\n\n    public scrollY(): number {\n        if (this._scrollRoot) {\n            const element = this.scrollElement()\n            return (element && element.scrollTop) || 0\n        } else {\n            return window ? window.scrollY || window.pageYOffset || window.document.documentElement.scrollTop || 0 : 0\n        }\n    }\n\n    public scrollX(): number {\n        if (this._scrollRoot) {\n            const element = this.scrollElement()\n            return (element && element.scrollLeft) || 0\n        } else {\n            return window ? window.scrollX || window.pageXOffset || window.document.documentElement.scrollLeft || 0 : 0\n        }\n    }\n}\n", "/* Store some session-level attribution-related properties in the persistence layer\n *\n * These have the same lifespan as a session_id, meaning that if the session_id changes, these properties will be reset.\n *\n * We only store the entry URL and referrer, and derive many props (such as utm tags) from those.\n *\n * Given that the cookie is limited to 4K bytes, we don't want to store too much data, so we chose not to store device\n * properties (such as browser, OS, etc) here, as usually getting the current value of those from event properties is\n * sufficient.\n */\nimport { getPersonInfo, getPersonPropsFromInfo } from './utils/event-utils'\nimport type { SessionIdManager } from './sessionid'\nimport type { PostHogPersistence } from './posthog-persistence'\nimport { CLIENT_SESSION_PROPS } from './constants'\nimport type { PostHog } from './posthog-core'\nimport { each, stripEmptyProperties } from './utils'\nimport { stripLeadingDollar } from '@posthog/core'\n\ninterface LegacySessionSourceProps {\n    initialPathName: string\n    referringDomain: string // Is actually referring host, but named referring domain for internal consistency. Should contain a port if there is one.\n    utm_medium?: string\n    utm_source?: string\n    utm_campaign?: string\n    utm_content?: string\n    utm_term?: string\n}\n\ninterface CurrentSessionSourceProps {\n    r: string // Referring host\n    u: string | undefined // full URL\n}\n\ninterface StoredSessionSourceProps {\n    sessionId: string\n    props: LegacySessionSourceProps | CurrentSessionSourceProps\n}\n\nconst generateSessionSourceParams = (posthog?: PostHog): LegacySessionSourceProps | CurrentSessionSourceProps => {\n    return getPersonInfo(posthog?.config.mask_personal_data_properties, posthog?.config.custom_personal_data_properties)\n}\n\nexport class SessionPropsManager {\n    private readonly _instance: PostHog\n    private readonly _sessionIdManager: SessionIdManager\n    private readonly _persistence: PostHogPersistence\n    private readonly _sessionSourceParamGenerator: (\n        instance?: PostHog\n    ) => LegacySessionSourceProps | CurrentSessionSourceProps\n\n    constructor(\n        instance: PostHog,\n        sessionIdManager: SessionIdManager,\n        persistence: PostHogPersistence,\n        sessionSourceParamGenerator?: (instance?: PostHog) => LegacySessionSourceProps | CurrentSessionSourceProps\n    ) {\n        this._instance = instance\n        this._sessionIdManager = sessionIdManager\n        this._persistence = persistence\n        this._sessionSourceParamGenerator = sessionSourceParamGenerator || generateSessionSourceParams\n\n        this._sessionIdManager.onSessionId(this._onSessionIdCallback)\n    }\n\n    _getStored(): StoredSessionSourceProps | undefined {\n        return this._persistence.props[CLIENT_SESSION_PROPS]\n    }\n\n    _onSessionIdCallback = (sessionId: string) => {\n        const stored = this._getStored()\n        if (stored && stored.sessionId === sessionId) {\n            return\n        }\n\n        const newProps: StoredSessionSourceProps = {\n            sessionId,\n            props: this._sessionSourceParamGenerator(this._instance),\n        }\n        this._persistence.register({ [CLIENT_SESSION_PROPS]: newProps })\n    }\n\n    getSetOnceProps() {\n        const p = this._getStored()?.props\n        if (!p) {\n            return {}\n        }\n        if ('r' in p) {\n            return getPersonPropsFromInfo(p)\n        } else {\n            return {\n                $referring_domain: p.referringDomain,\n                $pathname: p.initialPathName,\n                utm_source: p.utm_source,\n                utm_campaign: p.utm_campaign,\n                utm_medium: p.utm_medium,\n                utm_content: p.utm_content,\n                utm_term: p.utm_term,\n            }\n        }\n    }\n\n    getSessionProps() {\n        // it's the same props, but don't include null for unset properties, and add a prefix\n        const p: Record<string, any> = {}\n        each(stripEmptyProperties(this.getSetOnceProps()), (v, k) => {\n            if (k === '$current_url') {\n                // $session_entry_current_url would be a weird name, call it $session_entry_url instead\n                k = 'url'\n            }\n            p[`$session_entry_${stripLeadingDollar(k)}`] = v\n        })\n        return p\n    }\n}\n", "export class SimpleEventEmitter {\n    private _events: { [key: string]: ((...args: any[]) => void)[] } = {}\n\n    on(event: string, listener: (...args: any[]) => void): () => void {\n        if (!this._events[event]) {\n            this._events[event] = []\n        }\n        this._events[event].push(listener)\n\n        return () => {\n            this._events[event] = this._events[event].filter((x) => x !== listener)\n        }\n    }\n\n    emit(event: string, payload: any): void {\n        for (const listener of this._events[event] || []) {\n            listener(payload)\n        }\n        for (const listener of this._events['*'] || []) {\n            listener(event, payload)\n        }\n    }\n}\n", "import { PostHogPersistence } from './posthog-persistence'\nimport { COOKIELESS_ALWAYS, DOM_EVENT_BEFOREUNLOAD, SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuid7ToTimestampMs, uuidv7 } from './uuidv7'\nimport { window } from './utils/globals'\n\nimport { createLogger } from './utils/logger'\n\nimport { isArray, isUndefined, clampToRange, isPositiveNumber } from '@posthog/core'\nimport { PostHog } from './posthog-core'\nimport { addEventListener } from './utils'\nimport { SimpleEventEmitter } from './utils/simple-event-emitter'\n\nconst logger = createLogger('[SessionId]')\n\nexport const DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS = 30 * 60 // 30 minutes\nexport const MAX_SESSION_IDLE_TIMEOUT_SECONDS = 10 * 60 * 60 // 10 hours\nconst MIN_SESSION_IDLE_TIMEOUT_SECONDS = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT_MILLISECONDS = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n    private readonly _sessionIdGenerator: () => string\n    private readonly _windowIdGenerator: () => string\n    private _config: Partial<PostHogConfig>\n    private _persistence: PostHogPersistence\n    private _windowId: string | null | undefined\n    private _sessionId: string | null | undefined\n    private readonly _window_id_storage_key: string\n    private readonly _primary_window_exists_storage_key: string\n    private _sessionStartTimestamp: number | null\n\n    private _sessionActivityTimestamp: number | null\n    private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n    private readonly _sessionTimeoutMs: number\n\n    // we track activity so we can end the session proactively when it has passed the idle timeout\n    private _enforceIdleTimeout: ReturnType<typeof setTimeout> | undefined\n\n    private _beforeUnloadListener: (() => void) | undefined = undefined\n\n    private _eventEmitter: SimpleEventEmitter = new SimpleEventEmitter()\n    public on(event: 'forcedIdleReset', handler: () => void): () => void {\n        return this._eventEmitter.on(event, handler)\n    }\n\n    constructor(instance: PostHog, sessionIdGenerator?: () => string, windowIdGenerator?: () => string) {\n        if (!instance.persistence) {\n            throw new Error('SessionIdManager requires a PostHogPersistence instance')\n        }\n        if (instance.config.cookieless_mode === COOKIELESS_ALWAYS) {\n            throw new Error('SessionIdManager cannot be used with cookieless_mode=\"always\"')\n        }\n\n        this._config = instance.config\n        this._persistence = instance.persistence\n        this._windowId = undefined\n        this._sessionId = undefined\n        this._sessionStartTimestamp = null\n        this._sessionActivityTimestamp = null\n        this._sessionIdGenerator = sessionIdGenerator || uuidv7\n        this._windowIdGenerator = windowIdGenerator || uuidv7\n\n        const persistenceName = this._config['persistence_name'] || this._config['token']\n\n        const desiredTimeout = this._config['session_idle_timeout_seconds'] || DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS\n        this._sessionTimeoutMs =\n            clampToRange(\n                desiredTimeout,\n                MIN_SESSION_IDLE_TIMEOUT_SECONDS,\n                MAX_SESSION_IDLE_TIMEOUT_SECONDS,\n                logger.createLogger('session_idle_timeout_seconds'),\n                DEFAULT_SESSION_IDLE_TIMEOUT_SECONDS\n            ) * 1000\n\n        instance.register({ $configured_session_timeout_ms: this._sessionTimeoutMs })\n        this._resetIdleTimer()\n\n        this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n        this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n        // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n        // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n        if (this._canUseSessionStorage()) {\n            const lastWindowId = sessionStore._parse(this._window_id_storage_key)\n\n            const primaryWindowExists = sessionStore._parse(this._primary_window_exists_storage_key)\n            if (lastWindowId && !primaryWindowExists) {\n                // Persist window from previous storage state\n                this._windowId = lastWindowId\n            } else {\n                // Wipe any reference to previous window id\n                sessionStore._remove(this._window_id_storage_key)\n            }\n            // Flag this session as having a primary window\n            sessionStore._set(this._primary_window_exists_storage_key, true)\n        }\n\n        if (this._config.bootstrap?.sessionID) {\n            try {\n                const sessionStartTimestamp = uuid7ToTimestampMs(this._config.bootstrap.sessionID)\n                this._setSessionId(this._config.bootstrap.sessionID, new Date().getTime(), sessionStartTimestamp)\n            } catch (e) {\n                logger.error('Invalid sessionID in bootstrap', e)\n            }\n        }\n\n        this._listenToReloadWindow()\n    }\n\n    get sessionTimeoutMs(): number {\n        return this._sessionTimeoutMs\n    }\n\n    onSessionId(callback: SessionIdChangedCallback): () => void {\n        // KLUDGE: when running in tests the handlers array was always undefined\n        // it's yucky but safe to set it here so that it's always definitely available\n        if (isUndefined(this._sessionIdChangedHandlers)) {\n            this._sessionIdChangedHandlers = []\n        }\n\n        this._sessionIdChangedHandlers.push(callback)\n        if (this._sessionId) {\n            callback(this._sessionId, this._windowId)\n        }\n        return () => {\n            this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n        }\n    }\n\n    private _canUseSessionStorage(): boolean {\n        // We only want to use sessionStorage if persistence is enabled and not memory storage\n        return this._config.persistence !== 'memory' && !this._persistence._disabled && sessionStore._is_supported()\n    }\n\n    // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n    // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n    // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n    // and in that case, it falls back to memory (which sadly, won't persist page loads)\n    private _setWindowId(windowId: string): void {\n        if (windowId !== this._windowId) {\n            this._windowId = windowId\n            if (this._canUseSessionStorage()) {\n                sessionStore._set(this._window_id_storage_key, windowId)\n            }\n        }\n    }\n\n    private _getWindowId(): string | null {\n        if (this._windowId) {\n            return this._windowId\n        }\n        if (this._canUseSessionStorage()) {\n            return sessionStore._parse(this._window_id_storage_key)\n        }\n        // New window id will be generated\n        return null\n    }\n\n    // Note: 'this.persistence.register' can be disabled in the config.\n    // In that case, this works by storing sessionId and the timestamp in memory.\n    private _setSessionId(\n        sessionId: string | null,\n        sessionActivityTimestamp: number | null,\n        sessionStartTimestamp: number | null\n    ): void {\n        if (\n            sessionId !== this._sessionId ||\n            sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n            sessionStartTimestamp !== this._sessionStartTimestamp\n        ) {\n            this._sessionStartTimestamp = sessionStartTimestamp\n            this._sessionActivityTimestamp = sessionActivityTimestamp\n            this._sessionId = sessionId\n\n            this._persistence.register({\n                [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n            })\n        }\n    }\n\n    private _getSessionId(): [number, string, number] {\n        // Always read from persistence - it's the source of truth\n        // The in-memory cache could become stale (e.g., in a frozen tab scenario where\n        // time passes but the cache isn't updated)\n        const sessionIdInfo = this._persistence.props[SESSION_ID]\n\n        if (isArray(sessionIdInfo) && sessionIdInfo.length === 2) {\n            // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n            sessionIdInfo.push(sessionIdInfo[0])\n        }\n\n        return sessionIdInfo || [0, null, 0]\n    }\n\n    // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n    // new ids will be generated.\n    resetSessionId(): void {\n        this._setSessionId(null, null, null)\n    }\n\n    /**\n     * Cleans up resources used by SessionIdManager.\n     * Should be called when the SessionIdManager is no longer needed to prevent memory leaks.\n     */\n    destroy(): void {\n        // Clear the idle timeout timer\n        clearTimeout(this._enforceIdleTimeout)\n        this._enforceIdleTimeout = undefined\n\n        // Remove the beforeunload event listener\n        if (this._beforeUnloadListener && window) {\n            window.removeEventListener(DOM_EVENT_BEFOREUNLOAD, this._beforeUnloadListener, { capture: false } as any)\n            this._beforeUnloadListener = undefined\n        }\n\n        // Clear session id changed handlers\n        this._sessionIdChangedHandlers = []\n    }\n\n    /*\n     * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n     * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n     * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n     * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n     */\n    private _listenToReloadWindow(): void {\n        this._beforeUnloadListener = () => {\n            if (this._canUseSessionStorage()) {\n                sessionStore._remove(this._primary_window_exists_storage_key)\n            }\n        }\n        addEventListener(window, DOM_EVENT_BEFOREUNLOAD, this._beforeUnloadListener, { capture: false })\n    }\n\n    private _sessionHasBeenIdleTooLong = (timestamp: unknown, lastActivityTimestamp: unknown): boolean => {\n        if (!isPositiveNumber(timestamp) || !isPositiveNumber(lastActivityTimestamp)) {\n            return false\n        }\n        return Math.abs(timestamp - lastActivityTimestamp) > this.sessionTimeoutMs\n    }\n\n    /*\n     * This function returns the current sessionId and windowId. It should be used to\n     * access these values over directly calling `._sessionId` or `._windowId`.\n     * In addition to returning the sessionId and windowId, this function also manages cycling the\n     * sessionId and windowId when appropriate by doing the following:\n     *\n     * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n     * 2. If the readOnly param is set to false, it will:\n     *    a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n     *       If so, it will generate a new sessionId and store it.\n     *    b. Update the timestamp stored with the sessionId to ensure the current session is extended\n     *       for the appropriate amount of time.\n     *\n     * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n     * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n     */\n    checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n        if (this._config.cookieless_mode === COOKIELESS_ALWAYS) {\n            throw new Error('checkAndGetSessionAndWindowId should not be called with cookieless_mode=\"always\"')\n        }\n        const timestamp = _timestamp || new Date().getTime()\n\n        // eslint-disable-next-line prefer-const\n        let [lastActivityTimestamp, sessionId, startTimestamp] = this._getSessionId()\n        let windowId = this._getWindowId()\n\n        const sessionPastMaximumLength =\n            isPositiveNumber(startTimestamp) && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT_MILLISECONDS\n\n        let valuesChanged = false\n        const noSessionId = !sessionId\n        const activityTimeout =\n            !noSessionId && !readOnly && this._sessionHasBeenIdleTooLong(timestamp, lastActivityTimestamp)\n        if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n            sessionId = this._sessionIdGenerator()\n            windowId = this._windowIdGenerator()\n            logger.info('new session ID generated', {\n                sessionId,\n                windowId,\n                changeReason: { noSessionId, activityTimeout, sessionPastMaximumLength },\n            })\n            startTimestamp = timestamp\n            valuesChanged = true\n        } else if (!windowId) {\n            windowId = this._windowIdGenerator()\n            valuesChanged = true\n        }\n\n        const noActivityTimestamp = !isPositiveNumber(lastActivityTimestamp)\n        const shouldPreserveActivityTimestamp = !noActivityTimestamp && readOnly && !sessionPastMaximumLength\n        const newActivityTimestamp = shouldPreserveActivityTimestamp ? lastActivityTimestamp : timestamp\n\n        const noStartTimestamp = !isPositiveNumber(startTimestamp)\n        const sessionStartTimestamp = noStartTimestamp ? new Date().getTime() : startTimestamp\n\n        this._setWindowId(windowId)\n        this._setSessionId(sessionId, newActivityTimestamp, sessionStartTimestamp)\n\n        if (!readOnly) {\n            this._resetIdleTimer()\n        }\n\n        if (valuesChanged) {\n            this._sessionIdChangedHandlers.forEach((handler) =>\n                handler(\n                    sessionId,\n                    windowId,\n                    valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined\n                )\n            )\n        }\n\n        return {\n            sessionId,\n            windowId,\n            sessionStartTimestamp,\n            changeReason: valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined,\n            lastActivityTimestamp: lastActivityTimestamp,\n        }\n    }\n\n    private _resetIdleTimer() {\n        clearTimeout(this._enforceIdleTimeout)\n        this._enforceIdleTimeout = setTimeout(() => {\n            // enforce idle timeout a little after the session timeout to ensure the session is reset even without activity\n            // we need to check session activity first in case a different window has kept the session active\n            // while this window has been idle - and the timer has not progressed - e.g. window memory frozen while hidden\n            const [lastActivityTimestamp] = this._getSessionId()\n            if (this._sessionHasBeenIdleTooLong(new Date().getTime(), lastActivityTimestamp)) {\n                const idleSessionId = this._sessionId\n                this.resetSessionId()\n                this._eventEmitter.emit('forcedIdleReset', { idleSessionId })\n            }\n        }, this.sessionTimeoutMs * 1.1)\n    }\n}\n", "// Re-export shared bot detection logic from @posthog/core\nimport { isBlockedUA as isBlockedUACore } from '@posthog/core'\nexport { DEFAULT_BLOCKED_UA_STRS, isBlockedUA } from '@posthog/core'\n\n// There's more in the type, but this is all we use. It's currently experimental, see\n// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData\n// if you're reading this in the future, when it's no longer experimental, please remove this type and use an official one.\n// Be extremely defensive here to ensure backwards and *forwards* compatibility, and remove this defensiveness in the\n// future when it is safe to do so.\nexport interface NavigatorUAData {\n    brands?: {\n        brand: string\n        version: string\n    }[]\n    platform?: string\n}\ndeclare global {\n    interface Navigator {\n        userAgentData?: NavigatorUAData\n    }\n}\n\nexport const isLikelyBot = function (navigator: Navigator | undefined, customBlockedUserAgents: string[]): boolean {\n    if (!navigator) {\n        return false\n    }\n    const ua = navigator.userAgent\n    if (ua) {\n        if (isBlockedUACore(ua, customBlockedUserAgents)) {\n            return true\n        }\n    }\n    try {\n        // eslint-disable-next-line compat/compat\n        const uaData = navigator?.userAgentData as NavigatorUAData\n        if (\n            uaData?.brands &&\n            uaData.brands.some((brandObj) => isBlockedUACore(brandObj?.brand, customBlockedUserAgents))\n        ) {\n            return true\n        }\n    } catch {\n        // ignore the error, we were using experimental browser features\n    }\n\n    return !!navigator.webdriver\n\n    // There's some more enhancements we could make in this area, e.g. it's possible to check if Chrome dev tools are\n    // open, which will detect some bots that are trying to mask themselves and might get past the checks above.\n    // However, this would give false positives for actual humans who have dev tools open.\n\n    // We could also use the data in navigator.userAgentData.getHighEntropyValues() to detect bots, but we should wait\n    // until this stops being experimental. The MDN docs imply that this might eventually require user permission.\n    // See https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues\n    // It would be very bad if posthog-js caused a permission prompt to appear on every page load.\n}\n", "export const isValidRegex = function (str: string): boolean {\n    try {\n        new RegExp(str)\n    } catch {\n        return false\n    }\n    return true\n}\n\nexport const isMatchingRegex = function (value: string, pattern: string): boolean {\n    if (!isValidRegex(pattern)) return false\n\n    try {\n        return new RegExp(pattern).test(value)\n    } catch {\n        return false\n    }\n}\n", "import { isArray, isNull, isUndefined } from '@posthog/core'\nimport { jsonStringify } from '../request'\nimport { PropertyFilters, PropertyOperator } from '../posthog-surveys-types'\nimport type { Properties, SessionRecordingTriggerPropertyFilter } from '../types'\nimport { isMatchingRegex } from './regex-utils'\n\nexport function getPersonPropertiesHash(\n    distinct_id: string,\n    userPropertiesToSet?: Properties,\n    userPropertiesToSetOnce?: Properties\n): string {\n    return jsonStringify({ distinct_id, userPropertiesToSet, userPropertiesToSetOnce })\n}\n\nexport const propertyComparisons: Record<PropertyOperator, (targets: string[], values: string[]) => boolean> = {\n    exact: (targets, values) => values.some((value) => targets.some((target) => value === target)),\n    is_not: (targets, values) => values.every((value) => targets.every((target) => value !== target)),\n    regex: (targets, values) => values.some((value) => targets.some((target) => isMatchingRegex(value, target))),\n    not_regex: (targets, values) => values.every((value) => targets.every((target) => !isMatchingRegex(value, target))),\n    icontains: (targets, values) =>\n        values.map(toLowerCase).some((value) => targets.map(toLowerCase).some((target) => value.includes(target))),\n    not_icontains: (targets, values) =>\n        values.map(toLowerCase).every((value) => targets.map(toLowerCase).every((target) => !value.includes(target))),\n    gt: (targets, values) =>\n        values.some((value) => {\n            const numValue = parseFloat(value)\n            return !isNaN(numValue) && targets.some((t) => numValue > parseFloat(t))\n        }),\n    lt: (targets, values) =>\n        values.some((value) => {\n            const numValue = parseFloat(value)\n            return !isNaN(numValue) && targets.some((t) => numValue < parseFloat(t))\n        }),\n}\n\nconst toLowerCase = (v: string): string => v.toLowerCase()\n\n// Operators whose semantics mean \"property is not X\". When the property being\n// filtered on is missing or null, these match — absence of the property\n// satisfies a \"not equal to X\" check. This aligns with how PostHog's feature\n// flag matchers (posthog/queries/base.py, rust/feature-flags) treat missing\n// properties for negative operators.\nconst NEGATIVE_OPERATORS: ReadonlySet<string> = new Set(['is_not', 'not_icontains', 'not_regex'])\n\n/**\n * Evaluate trigger property filters (WHERE clauses) against event and person properties.\n * All filters must match (implicit AND). Returns true if no filters are present.\n */\nexport function matchTriggerPropertyFilters(\n    filters: SessionRecordingTriggerPropertyFilter[] | undefined,\n    eventProperties: Properties | undefined,\n    personProperties: Properties | undefined\n): boolean {\n    if (!filters || filters.length === 0) {\n        return true\n    }\n\n    return filters.every((filter) => {\n        const source = filter.type === 'person' ? personProperties : eventProperties\n        const propertyValue = source?.[filter.key]\n        const operator = filter.operator || 'exact'\n\n        // Missing or null property: for negative operators, absence counts as a\n        // match (nothing can't equal EU, so \"is_not EU\" is satisfied). For\n        // positive operators, we can't confirm a match without a value.\n        if (isUndefined(propertyValue) || isNull(propertyValue)) {\n            return NEGATIVE_OPERATORS.has(operator)\n        }\n\n        const comparisonFunction = propertyComparisons[operator as PropertyOperator]\n        if (!comparisonFunction) {\n            return false\n        }\n\n        if (isUndefined(filter.value) || isNull(filter.value)) {\n            return false\n        }\n\n        // Normalize filter value and property value to string arrays for comparison\n        const targetValues = isArray(filter.value) ? filter.value.map(String) : [String(filter.value)]\n        const actualValues = isArray(propertyValue) ? propertyValue.map(String) : [String(propertyValue)]\n\n        return comparisonFunction(targetValues, actualValues)\n    })\n}\n\nexport function matchPropertyFilters(\n    propertyFilters: PropertyFilters | undefined,\n    eventProperties: Properties | undefined\n): boolean {\n    // if there are no property filters, it means we're only matching on event name\n    if (!propertyFilters) {\n        return true\n    }\n\n    return Object.entries(propertyFilters).every(([propertyName, filter]) => {\n        const eventPropertyValue = eventProperties?.[propertyName]\n\n        if (isUndefined(eventPropertyValue) || isNull(eventPropertyValue)) {\n            return false\n        }\n\n        // convert event property to string array for comparison\n        const eventValues = [String(eventPropertyValue)]\n\n        const comparisonFunction = propertyComparisons[filter.operator]\n        if (!comparisonFunction) {\n            return false\n        }\n\n        return comparisonFunction(filter.values, eventValues)\n    })\n}\n", "import { PostHog } from '../posthog-core'\n\n/**\n * The request router helps simplify the logic to determine which endpoints should be called for which things\n * The basic idea is that for a given region (US or EU), we have a set of endpoints that we should call depending\n * on the type of request (events, replays, flags, etc.) and handle overrides that may come from configs or the flags endpoint\n */\n\nexport const RequestRouterRegion = {\n    US: 'us',\n    EU: 'eu',\n    CUSTOM: 'custom',\n} as const\nexport type RequestRouterRegion = (typeof RequestRouterRegion)[keyof typeof RequestRouterRegion]\n\nexport type RequestRouterTarget = 'api' | 'ui' | 'assets' | 'flags'\n\nconst ingestionDomain = 'i.posthog.com'\nconst staticAssetPath = /^\\/static\\//\n\nexport class RequestRouter {\n    instance: PostHog\n    private _regionCache: Record<string, RequestRouterRegion> = {}\n\n    constructor(instance: PostHog) {\n        this.instance = instance\n    }\n\n    get apiHost(): string {\n        const host = this.instance.config.api_host.trim().replace(/\\/$/, '')\n        if (host === 'https://app.posthog.com') {\n            return 'https://us.i.posthog.com'\n        }\n        return host\n    }\n\n    get flagsApiHost(): string {\n        const customHost = this.instance.config.flags_api_host\n        if (customHost) {\n            return customHost.trim().replace(/\\/$/, '')\n        }\n        // Backwards compatibility: if no custom flags_api_host is set, fall back to the regular apiHost\n        return this.apiHost\n    }\n\n    get uiHost(): string | undefined {\n        let host = this.instance.config.ui_host?.replace(/\\/$/, '')\n\n        if (!host) {\n            // No ui_host set, get it from the api_host. But api_host differs\n            // from the actual UI host, so replace the ingestion subdomain with just posthog.com\n            host = this.apiHost.replace(`.${ingestionDomain}`, '.posthog.com')\n        }\n\n        if (host === 'https://app.posthog.com') {\n            return 'https://us.posthog.com'\n        }\n\n        return host\n    }\n\n    get region(): RequestRouterRegion {\n        // We don't need to compute this every time so we cache the result\n        if (!this._regionCache[this.apiHost]) {\n            if (/https:\\/\\/(app|us|us-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n                this._regionCache[this.apiHost] = RequestRouterRegion.US\n            } else if (/https:\\/\\/(eu|eu-assets)(\\.i)?\\.posthog\\.com/i.test(this.apiHost)) {\n                this._regionCache[this.apiHost] = RequestRouterRegion.EU\n            } else {\n                this._regionCache[this.apiHost] = RequestRouterRegion.CUSTOM\n            }\n        }\n        return this._regionCache[this.apiHost]\n    }\n\n    private _staticAssetHostOverride(path: string): string | undefined {\n        const override = this.instance.config.__preview_external_dependency_versioned_paths\n        if (typeof override !== 'string' || !staticAssetPath.test(path)) {\n            return undefined\n        }\n\n        const normalizedOverride = override.trim().replace(/\\/$/, '')\n        return normalizedOverride || undefined\n    }\n\n    endpointFor(target: RequestRouterTarget, path: string = ''): string {\n        if (path) {\n            path = path[0] === '/' ? path : `/${path}`\n        }\n\n        if (target === 'ui') {\n            return this.uiHost + path\n        }\n\n        if (target === 'flags') {\n            return this.flagsApiHost + path\n        }\n\n        if (target === 'assets') {\n            const assetHostOverride = this._staticAssetHostOverride(path)\n            if (assetHostOverride) {\n                return `${assetHostOverride}${path}`\n            }\n        }\n\n        if (this.region === RequestRouterRegion.CUSTOM) {\n            return this.apiHost + path\n        }\n\n        const suffix = ingestionDomain + path\n\n        switch (target) {\n            case 'assets':\n                return `https://${this.region}-assets.${suffix}`\n            case 'api':\n                return `https://${this.region}.${suffix}`\n        }\n    }\n}\n", "import { DisplaySurveyOptions, Survey, SurveyType, DisplaySurveyType } from '../posthog-surveys-types'\nimport { createLogger } from '../utils/logger'\n\nexport { getSurveyInteractionProperty } from '@posthog/core/surveys'\n\nexport const SURVEY_LOGGER = createLogger('[Surveys]')\n\nexport function isSurveyRunning(survey: Survey): boolean {\n    return !!(survey.start_date && !survey.end_date)\n}\n\nexport function doesSurveyActivateByEvent(survey: Pick<Survey, 'conditions'>): boolean {\n    return !!survey.conditions?.events?.values?.length\n}\n\nexport function doesSurveyActivateByAction(survey: Pick<Survey, 'conditions'>): boolean {\n    return !!survey.conditions?.actions?.values?.length\n}\n\nexport const SURVEY_SEEN_PREFIX = 'seenSurvey_'\nexport const SURVEY_IN_PROGRESS_PREFIX = 'inProgressSurvey_'\nexport const SURVEY_ABANDONED_PREFIX = 'abandonedSurvey_'\n\nconst getSurveyStorageKey = (prefix: string, survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n    let key = `${prefix}${survey.id}`\n    if (survey.current_iteration && survey.current_iteration > 0) {\n        key = `${prefix}${survey.id}_${survey.current_iteration}`\n    }\n    return key\n}\n\nexport const getSurveySeenKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n    return getSurveyStorageKey(SURVEY_SEEN_PREFIX, survey)\n}\n\nexport const getSurveyAbandonedKey = (survey: Pick<Survey, 'id' | 'current_iteration'>): string => {\n    return getSurveyStorageKey(SURVEY_ABANDONED_PREFIX, survey)\n}\n\nexport const setSurveySeenOnLocalStorage = (survey: Pick<Survey, 'id' | 'current_iteration'>) => {\n    try {\n        const surveySeenKey = getSurveySeenKey(survey)\n        const isSurveySeen = localStorage.getItem(surveySeenKey)\n        // if survey is already seen, no need to set it again\n        if (isSurveySeen) {\n            return\n        }\n\n        localStorage.setItem(surveySeenKey, 'true')\n    } catch (error) {\n        SURVEY_LOGGER.error('Failed to persist survey seen state', error)\n    }\n}\n\n// These surveys are relevant for the getActiveMatchingSurveys method. They are used to\n// display surveys in our customer's application. Any new in-app survey type should be added here.\nexport const IN_APP_SURVEY_TYPES: SurveyType[] = [SurveyType.Popover, SurveyType.Widget, SurveyType.API]\n\nexport const DEFAULT_DISPLAY_SURVEY_OPTIONS: DisplaySurveyOptions = {\n    ignoreConditions: false,\n    ignoreDelay: false,\n    displayType: DisplaySurveyType.Popover,\n}\n", "import { PostHog } from '../posthog-core'\nimport { ExternalIntegrationKind } from '../types'\nimport { assignableWindow, ExternalExtensionKind } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\n\nconst logger = createLogger('[PostHog ExternalIntegrations]')\n\nconst MAPPED_INTEGRATIONS: Record<ExternalIntegrationKind, ExternalExtensionKind> = {\n    intercom: 'intercom-integration',\n    crispChat: 'crisp-chat-integration',\n}\n\nexport class ExternalIntegrations {\n    constructor(private readonly _instance: PostHog) {}\n\n    private _loadScript(name: ExternalExtensionKind, cb: () => void): void {\n        assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, name, (err) => {\n            if (err) {\n                return logger.error('failed to load script', err)\n            }\n            cb()\n        })\n    }\n\n    public startIfEnabledOrStop() {\n        for (const [key, value] of Object.entries(this._instance.config.integrations ?? {})) {\n            // if the integration is enabled, and not present, then load it\n            if (value && !assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]) {\n                this._loadScript(MAPPED_INTEGRATIONS[key as ExternalIntegrationKind], () => {\n                    assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]?.start(\n                        this._instance\n                    )\n                })\n            }\n            // if the integration is disabled, and present, then stop it\n            if (!value && assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]) {\n                assignableWindow.__PosthogExtensions__?.integrations?.[key as ExternalIntegrationKind]?.stop()\n            }\n        }\n    }\n}\n", "import Config from './config'\nimport { ConsentManager, ConsentStatus } from './consent'\nimport {\n    ALIAS_ID_KEY,\n    COOKIELESS_MODE_FLAG_PROPERTY,\n    COOKIELESS_SENTINEL_VALUE,\n    COOKIELESS_ON_REJECT,\n    DEVICE_ID,\n    PERSON_PROFILES_IDENTIFIED_ONLY,\n    USER_STATE_ANONYMOUS,\n    USER_STATE_IDENTIFIED,\n    DOM_EVENT_VISIBILITYCHANGE,\n    ENABLE_PERSON_PROCESSING,\n    EVENT_GROUPIDENTIFY,\n    EVENT_IDENTIFY,\n    EVENT_PAGELEAVE,\n    EVENT_PAGEVIEW,\n    FLAG_CALL_REPORTED,\n    PEOPLE_DISTINCT_ID_KEY,\n    SDK_DEBUG_EXTENSIONS_INIT_METHOD,\n    SDK_DEBUG_EXTENSIONS_INIT_TIME_MS,\n    SURVEYS_REQUEST_TIMEOUT_MS,\n    USER_STATE,\n    COOKIELESS_ALWAYS,\n} from './constants'\nimport { isDeadClicksEnabledForAutocapture } from './extensions/dead-clicks-autocapture'\nimport { setupSegmentIntegration } from './extensions/segment-integration'\nimport { SentryIntegration, sentryIntegration, SentryIntegrationOptions } from './extensions/sentry-integration'\nimport { PageViewManager } from './page-view'\nimport { PostHogPersistence } from './posthog-persistence'\nimport {\n    type DisplaySurveyOptions,\n    type SurveyCallback,\n    SurveyEventName,\n    SurveyEventProperties,\n    type SurveyRenderReason,\n} from './posthog-surveys-types'\nimport { ProductTourEventName, ProductTourEventProperties } from './posthog-product-tours-types'\nimport { RateLimiter } from './rate-limiter'\nimport { RemoteConfigLoader } from './remote-config'\nimport { extendURLParams, request, SUPPORTS_REQUEST } from './request'\nimport { DEFAULT_FLUSH_INTERVAL_MS, RequestQueue } from './request-queue'\nimport { RetryQueue } from './retry-queue'\nimport { ScrollManager } from './scroll-manager'\nimport { SessionPropsManager } from './session-props'\nimport { SessionIdManager } from './sessionid'\nimport { localStore } from './storage'\nimport {\n    CaptureLogOptions,\n    CaptureOptions,\n    CaptureResult,\n    Compression,\n    ConfigDefaults,\n    EarlyAccessFeatureCallback,\n    EarlyAccessFeatureStage,\n    EventName,\n    ExceptionAutoCaptureConfig,\n    FeatureFlagsCallback,\n    FeatureFlagOptions,\n    FeatureFlagResult,\n    JsonType,\n    OverrideConfig,\n    PostHogConfig,\n    Properties,\n    Property,\n    QueuedRequestWithOptions,\n    RemoteConfig,\n    RequestCallback,\n    SessionIdChangedCallback,\n    SnippetArrayItem,\n    ToolbarParams,\n    PostHogInterface,\n} from './types'\nimport type { TreeShakeable } from '@posthog/types'\nimport {\n    _copyAndTruncateStrings,\n    addEventListener,\n    each,\n    eachArray,\n    extend,\n    isCrossDomainCookie,\n    migrateConfigField,\n    safewrapClass,\n} from './utils'\nimport { isLikelyBot } from './utils/blocked-uas'\nimport { getEventProperties } from './utils/event-utils'\nimport { assignableWindow, document, location, navigator, userAgent, window } from './utils/globals'\nimport { logger } from './utils/logger'\nimport { getPersonPropertiesHash } from './utils/property-utils'\nimport { RequestRouter, RequestRouterRegion } from './utils/request-router'\nimport { SimpleEventEmitter } from './utils/simple-event-emitter'\nimport {\n    DEFAULT_DISPLAY_SURVEY_OPTIONS,\n    getSurveyInteractionProperty,\n    setSurveySeenOnLocalStorage,\n} from './utils/survey-utils'\nimport {\n    isEmptyString,\n    isFunction,\n    isKnownUnsafeEditableEvent,\n    isNullish,\n    isNumber,\n    isString,\n    isUndefined,\n    includes,\n    isDistinctIdStringLike,\n    isArray,\n    isEmptyObject,\n    isObject,\n    isBoolean,\n} from '@posthog/core'\nimport { uuidv7 } from './uuidv7'\nimport { ExternalIntegrations } from './extensions/external-integration'\nimport type { PostHogSurveys } from './posthog-surveys'\nimport type { Autocapture } from './autocapture'\nimport type { DeadClicksAutocapture } from './extensions/dead-clicks-autocapture'\nimport type { ExceptionObserver } from './extensions/exception-autocapture'\nimport type { HistoryAutocapture } from './extensions/history-autocapture'\nimport type { WebVitalsAutocapture } from './extensions/web-vitals'\nimport type { Heatmaps } from './heatmaps'\nimport type { PostHogConversations } from './extensions/conversations/posthog-conversations'\nimport type { PostHogExceptions } from './posthog-exceptions'\nimport type { PostHogLogs } from './posthog-logs'\nimport type { PostHogProductTours } from './posthog-product-tours'\nimport type { SiteApps } from './site-apps'\nimport type { SessionRecording } from './extensions/replay/session-recording'\nimport type { Extension } from './extensions/types'\nimport type { Toolbar } from './extensions/toolbar'\nimport type { PostHogFeatureFlags } from './posthog-featureflags'\nimport type { WebExperiments } from './web-experiments'\n\n/*\nSIMPLE STYLE GUIDE:\n\nUse TypeScript accessibility modifiers, e.g. private/protected\n\nIf something is not part of the public interface:\n* prefix it with _ to allow mangling\n* prefix it with __ to disable mangling, but signal that it is internal\n\nGlobals should be all caps\n*/\n\n/* posthog.init is called with `Partial<PostHogConfig>`\n * and we want to ensure that only valid keys are passed to the config object.\n * TypeScript does not enforce that the object passed does not have extra keys.\n * So someone can call with { bootstrap: { distinctId: '123'} }\n * which is not a valid key. They should have passed distinctID (upper case D).\n * That's a really tricky mistake to spot.\n * The OnlyValidKeys type ensures that only keys that are valid in the PostHogConfig type are allowed.\n */\ntype OnlyValidKeys<T, Shape> = T extends Shape ? (Exclude<keyof T, keyof Shape> extends never ? T : never) : never\n\nconst instances: Record<string, PostHog> = {}\n\n// Tracks re-entrant calls to _execute_array. Used to detect when a third-party\n// Proxy (e.g., TikTok's in-app browser) wraps window.posthog and converts method\n// calls into push() calls, which would otherwise cause infinite recursion.\nlet _executeArrayDepth = 0\n\nconst __NOOP = () => {}\nconst CONSENT_COOKIELESS_WARN = 'Consent opt in/out is not valid with cookieless_mode=\"always\" and will be ignored'\nconst SURVEYS_NOT_AVAILABLE = 'Surveys module not available'\nconst SANITIZE_DEPRECATED = 'sanitize_properties is deprecated. Use before_send instead'\nconst DENYLIST_INVALID = 'Invalid value for property_denylist config: '\n\nconst PRIMARY_INSTANCE_NAME = 'posthog'\n\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\n\n// IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\nlet ENQUEUE_REQUESTS = !SUPPORTS_REQUEST && userAgent?.indexOf('MSIE') === -1 && userAgent?.indexOf('Mozilla') === -1\n\nconst defaultsThatVaryByConfig = (\n    defaults?: ConfigDefaults\n): Pick<\n    PostHogConfig,\n    | 'rageclick'\n    | 'capture_pageview'\n    | 'session_recording'\n    | 'external_scripts_inject_target'\n    | 'internal_or_test_user_hostname'\n> => ({\n    rageclick: defaults && defaults >= '2025-11-30' ? { content_ignorelist: true } : true,\n    capture_pageview: defaults && defaults >= '2025-05-24' ? 'history_change' : true,\n    session_recording: defaults && defaults >= '2025-11-30' ? { strictMinimumDuration: true } : {},\n    external_scripts_inject_target: defaults && defaults >= '2026-01-30' ? 'head' : 'body',\n    internal_or_test_user_hostname: defaults && defaults >= '2026-01-30' ? /^(localhost|127\\.0\\.0\\.1)$/ : undefined,\n})\n\n// NOTE: Remember to update `types.ts` when changing a default value\n// to guarantee documentation is up to date, make sure to also update our website docs\n// NOTE²: This shouldn't ever change because we try very hard to be backwards-compatible\nexport const defaultConfig = (defaults?: ConfigDefaults): PostHogConfig => ({\n    api_host: 'https://us.i.posthog.com',\n    flags_api_host: null,\n    ui_host: null,\n    token: '',\n    autocapture: true,\n    cross_subdomain_cookie: isCrossDomainCookie(document?.location),\n    persistence: 'localStorage+cookie', // up to 1.92.0 this was 'cookie'. It's easy to migrate as 'localStorage+cookie' will migrate data from cookie storage\n    persistence_name: '',\n    cookie_persisted_properties: [],\n    loaded: __NOOP,\n    save_campaign_params: true,\n    custom_campaign_params: [],\n    custom_blocked_useragents: [],\n    save_referrer: true,\n    capture_pageleave: 'if_capture_pageview', // We'll only capture pageleave events if capture_pageview is also true\n    defaults: defaults ?? 'unset',\n    __preview_deferred_init_extensions: false, // Opt-in only for now\n    __preview_external_dependency_versioned_paths: false,\n    debug: (location && isString(location?.search) && location.search.indexOf('__posthog_debug=true') !== -1) || false,\n    cookie_expiration: 365,\n    upgrade: false,\n    disable_session_recording: false,\n    disable_persistence: false,\n    disable_web_experiments: true, // disabled in beta.\n    disable_surveys: false,\n    disable_surveys_automatic_display: false,\n    disable_conversations: false,\n    disable_product_tours: false,\n    disable_external_dependency_loading: false,\n    enable_recording_console_log: undefined, // When undefined, it falls back to the server-side setting\n    secure_cookie: window?.location?.protocol === 'https:',\n    ip: false,\n    opt_out_capturing_by_default: false,\n    opt_out_persistence_by_default: false,\n    opt_out_useragent_filter: false,\n    opt_out_capturing_persistence_type: 'localStorage',\n    consent_persistence_name: null,\n    opt_out_capturing_cookie_prefix: null,\n    opt_in_site_apps: false,\n    property_denylist: [],\n    respect_dnt: false,\n    sanitize_properties: null,\n    request_headers: {}, // { header: value, header2: value }\n    request_batching: true,\n    properties_string_max_length: 65535,\n    mask_all_element_attributes: false,\n    mask_all_text: false,\n    mask_personal_data_properties: false,\n    custom_personal_data_properties: [],\n    advanced_disable_flags: false,\n    advanced_disable_decide: false,\n    advanced_disable_feature_flags: false,\n    advanced_disable_feature_flags_on_first_load: false,\n    advanced_only_evaluate_survey_feature_flags: false,\n    advanced_feature_flags_dedup_per_session: false,\n    advanced_enable_surveys: false,\n    advanced_disable_toolbar_metrics: false,\n    feature_flag_request_timeout_ms: 3000,\n    surveys_request_timeout_ms: SURVEYS_REQUEST_TIMEOUT_MS,\n    on_request_error: (res) => {\n        const error = 'Bad HTTP status: ' + res.statusCode + ' ' + res.text\n        logger.error(error)\n    },\n    get_device_id: (uuid) => uuid,\n    capture_performance: undefined,\n    name: 'posthog',\n    bootstrap: {},\n    disable_compression: false,\n    session_idle_timeout_seconds: 30 * 60, // 30 minutes\n    person_profiles: PERSON_PROFILES_IDENTIFIED_ONLY,\n    before_send: undefined,\n    request_queue_config: { flush_interval_ms: DEFAULT_FLUSH_INTERVAL_MS },\n    error_tracking: {},\n\n    // Used for internal testing\n    _onCapture: __NOOP,\n\n    // make the default be lazy loading replay\n    __preview_eager_load_replay: false,\n\n    ...defaultsThatVaryByConfig(defaults),\n})\n\nconst CONFIG_RENAMES: [keyof PostHogConfig, keyof PostHogConfig][] = [\n    ['process_person', 'person_profiles'],\n    ['xhr_headers', 'request_headers'],\n    ['cookie_name', 'persistence_name'],\n    ['disable_cookie', 'disable_persistence'],\n    ['store_google', 'save_campaign_params'],\n    ['verbose', 'debug'],\n]\n\nexport const configRenames = (origConfig: Partial<PostHogConfig>): Partial<PostHogConfig> => {\n    const renames: Partial<PostHogConfig> = {}\n    for (const [oldKey, newKey] of CONFIG_RENAMES) {\n        if (!isUndefined((origConfig as any)[oldKey])) {\n            ;(renames as any)[newKey] = (origConfig as any)[oldKey]\n        }\n    }\n    // on_xhr_error is not present, as the type is different to on_request_error\n\n    // the original config takes priority over the renames\n    const newConfig = extend({}, renames, origConfig)\n\n    // merge property_blacklist into property_denylist\n    if (isArray(origConfig.property_blacklist)) {\n        if (isUndefined(origConfig.property_denylist)) {\n            newConfig.property_denylist = origConfig.property_blacklist\n        } else if (isArray(origConfig.property_denylist)) {\n            newConfig.property_denylist = [...origConfig.property_blacklist, ...origConfig.property_denylist]\n        } else {\n            logger.error(DENYLIST_INVALID + origConfig.property_denylist)\n        }\n    }\n\n    return newConfig\n}\n\nclass DeprecatedWebPerformanceObserver {\n    get _forceAllowLocalhost(): boolean {\n        return this.__forceAllowLocalhost\n    }\n\n    set _forceAllowLocalhost(value: boolean) {\n        logger.error(\n            'WebPerformanceObserver is deprecated and has no impact on network capture. Use `_forceAllowLocalhostNetworkCapture` on `posthog.sessionRecording`'\n        )\n        this.__forceAllowLocalhost = value\n    }\n\n    private __forceAllowLocalhost: boolean = false\n}\n\n/**\n *\n * This is the SDK reference for the PostHog JavaScript Web SDK.\n * You can learn more about example usage in the\n * [JavaScript Web SDK documentation](/docs/libraries/js).\n * You can also follow [framework specific guides](/docs/frameworks)\n * to integrate PostHog into your project.\n *\n * This SDK is designed for browser environments.\n * Use the PostHog [Node.js SDK](/docs/libraries/node) for server-side usage.\n *\n * @constructor\n */\nexport class PostHog implements PostHogInterface {\n    static __defaultExtensionClasses: PostHogConfig['__extensionClasses'] = {}\n\n    __loaded: boolean\n    config: PostHogConfig\n    _originalUserConfig?: Partial<PostHogConfig>\n\n    rateLimiter: RateLimiter\n    scrollManager: ScrollManager\n    pageViewManager: PageViewManager\n    featureFlags: TreeShakeable<PostHogFeatureFlags>\n    surveys: TreeShakeable<PostHogSurveys>\n    conversations: TreeShakeable<PostHogConversations>\n    logs: TreeShakeable<PostHogLogs>\n    experiments: TreeShakeable<WebExperiments>\n    toolbar: TreeShakeable<Toolbar>\n    exceptions: TreeShakeable<PostHogExceptions>\n    consent: ConsentManager\n\n    // These are instance-specific state created after initialisation\n    persistence?: PostHogPersistence\n    sessionPersistence?: PostHogPersistence\n    sessionManager?: SessionIdManager\n    sessionPropsManager?: SessionPropsManager\n    requestRouter: RequestRouter\n    siteApps?: SiteApps\n    autocapture?: Autocapture\n    heatmaps?: Heatmaps\n    webVitalsAutocapture?: WebVitalsAutocapture\n    exceptionObserver?: ExceptionObserver\n    deadClicksAutocapture?: DeadClicksAutocapture\n    historyAutocapture?: HistoryAutocapture\n    productTours?: PostHogProductTours\n\n    _requestQueue?: RequestQueue\n    _retryQueue?: RetryQueue\n    sessionRecording?: SessionRecording\n    externalIntegrations?: ExternalIntegrations\n    webPerformance = new DeprecatedWebPerformanceObserver()\n\n    _initialPageviewCaptured: boolean\n    _visibilityStateListener: (() => void) | null\n    _personProcessingSetOncePropertiesSent: boolean = false\n    _triggered_notifs: any\n    compression?: Compression\n    __request_queue: QueuedRequestWithOptions[]\n    _pendingRemoteConfig?: RemoteConfig\n    _lastRemoteConfig?: RemoteConfig\n    _remoteConfigLoader?: RemoteConfigLoader\n    analyticsDefaultEndpoint: string\n    version: string = Config.LIB_VERSION\n    _initialPersonProfilesConfig: 'always' | 'never' | 'identified_only' | null\n    _cachedPersonProperties: string | null\n\n    SentryIntegration: typeof SentryIntegration\n    sentryIntegration: (options?: SentryIntegrationOptions) => ReturnType<typeof sentryIntegration>\n\n    _internalEventEmitter = new SimpleEventEmitter()\n\n    private readonly _extensions: Extension[] = []\n\n    private _replaceExtension<T extends Extension>(oldExt: T | undefined, newExt: T): T {\n        if (oldExt) {\n            const idx = this._extensions.indexOf(oldExt)\n            if (idx !== -1) {\n                this._extensions.splice(idx, 1)\n            }\n        }\n        this._extensions.push(newExt)\n        newExt.initialize?.()\n        return newExt\n    }\n\n    private _inCookielessMode(): boolean {\n        return (\n            this.config.cookieless_mode === COOKIELESS_ALWAYS ||\n            (this.config.cookieless_mode === COOKIELESS_ON_REJECT && this.consent.isRejected())\n        )\n    }\n\n    // Legacy property to support existing usage - this isn't technically correct but it's what it has always been - a proxy for flags being loaded\n    /** @deprecated Use `flagsEndpointWasHit` instead.  We migrated to using a new feature flag endpoint and the new method is more semantically accurate */\n    public get decideEndpointWasHit(): boolean {\n        return this.featureFlags?.hasLoadedFlags ?? false\n    }\n\n    public get flagsEndpointWasHit(): boolean {\n        return this.featureFlags?.hasLoadedFlags ?? false\n    }\n\n    /** DEPRECATED: We keep this to support existing usage but now one should just call .setPersonProperties */\n    people: {\n        set: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n        set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => void\n    }\n\n    constructor() {\n        this.config = defaultConfig()\n\n        this.SentryIntegration = SentryIntegration\n        this.sentryIntegration = (options?: SentryIntegrationOptions) => sentryIntegration(this, options)\n        this.__request_queue = []\n        this.__loaded = false\n        this.analyticsDefaultEndpoint = '/e/'\n        this._initialPageviewCaptured = false\n        this._visibilityStateListener = null\n        this._initialPersonProfilesConfig = null\n        this._cachedPersonProperties = null\n        this.scrollManager = new ScrollManager(this)\n        this.pageViewManager = new PageViewManager(this)\n        this.rateLimiter = new RateLimiter(this)\n        this.requestRouter = new RequestRouter(this)\n        this.consent = new ConsentManager(this)\n        this.externalIntegrations = new ExternalIntegrations(this)\n\n        // Eagerly construct extensions from default classes so they're available before init().\n        // For the slim bundle, these remain undefined until _initExtensions sets them from config.\n        const ext = PostHog.__defaultExtensionClasses ?? {}\n        this.featureFlags = ext.featureFlags && new ext.featureFlags(this)\n        this.toolbar = ext.toolbar && new ext.toolbar(this)\n        this.surveys = ext.surveys && new ext.surveys(this)\n        this.conversations = ext.conversations && new ext.conversations(this)\n        this.logs = ext.logs && new ext.logs(this)\n        this.experiments = ext.experiments && new ext.experiments(this)\n        this.exceptions = ext.exceptions && new ext.exceptions(this)\n\n        // NOTE: See the property definition for deprecation notice\n        this.people = {\n            set: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n                const setProps = isString(prop) ? { [prop]: to } : prop\n                this.setPersonProperties(setProps)\n                callback?.({} as any)\n            },\n            set_once: (prop: string | Properties, to?: string, callback?: RequestCallback) => {\n                const setProps = isString(prop) ? { [prop]: to } : prop\n                this.setPersonProperties(undefined, setProps)\n                callback?.({} as any)\n            },\n        }\n\n        this.on('eventCaptured', (data) => logger.info(`send \"${data?.event}\"`, data))\n    }\n\n    // Initialization methods\n\n    /**\n     * Initializes a new instance of the PostHog capturing object.\n     *\n     * @remarks\n     * All new instances are added to the main posthog object as sub properties (such as\n     * `posthog.library_name`) and also returned by this function. [Learn more about configuration options](https://github.com/posthog/posthog-js/blob/6e0e873/src/posthog-core.js#L57-L91)\n     *\n     * @example\n     * ```js\n     * // basic initialization\n     * posthog.init('<ph_project_api_key>', {\n     *     api_host: '<ph_client_api_host>'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // multiple instances\n     * posthog.init('<ph_project_api_key>', {}, 'project1')\n     * posthog.init('<ph_project_api_key>', {}, 'project2')\n     * ```\n     *\n     * @public\n     *\n     * @param token - Your PostHog API token\n     * @param config - A dictionary of config options to override\n     * @param name - The name for the new posthog instance that you want created\n     *\n     * {@label Initialization}\n     *\n     * @returns The newly initialized PostHog instance\n     */\n    init(\n        token: string,\n        config?: OnlyValidKeys<Partial<PostHogConfig>, Partial<PostHogConfig>>,\n        name?: string\n    ): PostHog {\n        if (!name || name === PRIMARY_INSTANCE_NAME) {\n            // This means we are initializing the primary instance (i.e. this)\n            return this._init(token, config, name)\n        } else {\n            const namedPosthog = instances[name] ?? new PostHog()\n            namedPosthog._init(token, config, name)\n            instances[name] = namedPosthog\n\n            // Add as a property to the primary instance (this isn't type-safe but it is how it was always done)\n            ;(instances[PRIMARY_INSTANCE_NAME] as any)[name] = namedPosthog\n\n            return namedPosthog\n        }\n    }\n\n    // posthog._init(token:string, config:object, name:string)\n    //\n    // This function sets up the current instance of the posthog\n    // library.  The difference between this method and the init(...)\n    // method is this one initializes the actual instance, whereas the\n    // init(...) method sets up a new library and calls _init on it.\n    //\n    // Note that there are operations that can be asynchronous, so we\n    // accept a callback that is called when all the asynchronous work\n    // is done. Note that we do not use promises because we want to be\n    // IE11 compatible. We could use polyfills, which would make the\n    // code a bit cleaner, but will add some overhead.\n    //\n    _init(token: string, config: Partial<PostHogConfig> = {}, name?: string): PostHog {\n        if (isUndefined(token) || isEmptyString(token)) {\n            logger.critical(\n                'PostHog was initialized without a token. This likely indicates a misconfiguration. Please check the first argument passed to posthog.init()'\n            )\n            return this\n        }\n\n        if (this.__loaded) {\n            // need to be able to log before having processed debug config\n            // eslint-disable-next-line no-console\n            console.warn('[PostHog.js]', 'You have already initialized PostHog! Re-initializing is a no-op')\n            return this\n        }\n\n        this.__loaded = true\n        this.config = {} as PostHogConfig // will be set right below\n        config.debug = this._checkLocalStorageForDebug(config.debug)\n        this._originalUserConfig = config // Store original user config for migration\n\n        this._triggered_notifs = []\n\n        if (config.person_profiles) {\n            this._initialPersonProfilesConfig = config.person_profiles\n        } else if (config.process_person) {\n            this._initialPersonProfilesConfig = config.process_person\n        }\n\n        this.set_config(\n            extend({}, defaultConfig(config.defaults), configRenames(config), {\n                name: name,\n                token: token,\n            })\n        )\n\n        if (this.config.on_xhr_error) {\n            logger.error('on_xhr_error is deprecated. Use on_request_error instead')\n        }\n\n        this.compression = config.disable_compression ? undefined : Compression.GZipJS\n\n        const persistenceDisabled = this._is_persistence_disabled()\n\n        this.persistence = new PostHogPersistence(this.config, persistenceDisabled)\n        this.sessionPersistence =\n            this.config.persistence === 'sessionStorage' || this.config.persistence === 'memory'\n                ? this.persistence\n                : new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' }, persistenceDisabled)\n\n        // should I store the initial person profiles config in persistence?\n        const initialPersistenceProps = { ...this.persistence.props }\n        const initialSessionProps = { ...this.sessionPersistence.props }\n\n        this.register({ $initialization_time: new Date().toISOString() })\n\n        this._requestQueue = new RequestQueue(\n            (req) => this._send_retriable_request(req),\n            this.config.request_queue_config\n        )\n        this._retryQueue = new RetryQueue(this)\n        this.__request_queue = []\n\n        const startInCookielessMode = this._inCookielessMode()\n\n        if (!startInCookielessMode) {\n            this.sessionManager = new SessionIdManager(this)\n            this.sessionPropsManager = new SessionPropsManager(this, this.sessionManager, this.persistence)\n        }\n\n        // Conditionally defer extension initialization based on config\n        if (this.config.__preview_deferred_init_extensions) {\n            // EXPERIMENTAL: Defer non-critical extension initialization to next tick\n            // This reduces main thread blocking during init\n            // while keeping critical path (persistence, sessions, capture) synchronous\n            logger.info('Deferring extension initialization to improve startup performance')\n            setTimeout(() => {\n                this._initExtensions(startInCookielessMode)\n            }, 0)\n        } else {\n            // Legacy synchronous initialization (default for now)\n            logger.info('Initializing extensions synchronously')\n            this._initExtensions(startInCookielessMode)\n        }\n\n        // if any instance on the page has debug = true, we set the\n        // global debug to be true\n        Config.DEBUG = Config.DEBUG || this.config.debug\n        if (Config.DEBUG) {\n            logger.info('Starting in debug mode', {\n                this: this,\n                config,\n                thisC: { ...this.config },\n                p: initialPersistenceProps,\n                s: initialSessionProps,\n            })\n        }\n\n        // When identity_distinct_id is provided at init time, use it as the\n        // bootstrap distinct ID so the Person record is created from the first event.\n        if (this.config.identity_distinct_id && !config.bootstrap?.distinctID) {\n            config.bootstrap = {\n                ...config.bootstrap,\n                distinctID: this.config.identity_distinct_id,\n                isIdentifiedID: true,\n            }\n        }\n\n        // isUndefined doesn't provide typehint here so wouldn't reduce bundle as we'd need to assign\n        // eslint-disable-next-line posthog-js/no-direct-undefined-check\n        if (config.bootstrap?.distinctID !== undefined) {\n            const bootstrapDistinctId = config.bootstrap.distinctID\n            const existingDistinctId = this.get_distinct_id()\n            const existingUserState = this.persistence.get_property(USER_STATE)\n\n            if (\n                config.bootstrap.isIdentifiedID &&\n                existingDistinctId != null &&\n                existingDistinctId !== bootstrapDistinctId &&\n                existingUserState === USER_STATE_ANONYMOUS\n            ) {\n                // The server bootstrapped identity for an identified user, but local persistence\n                // still has an anonymous ID from a previous session. Calling identify() merges\n                // the anonymous user into the identified user, ensuring consistent identity\n                // for feature flag evaluation and preventing duplicate $feature_flag_called events.\n                //\n                // Note: this runs during _init(), before _loaded() enables the request queue.\n                // The $identify event is enqueued and flushed once the queue starts. The\n                // reloadFeatureFlags() call inside identify() sets _reloadDebouncer, so the\n                // subsequent ensureFlagsLoaded() from _onRemoteConfig is a no-op (no double request).\n                this.identify(bootstrapDistinctId)\n            } else if (\n                config.bootstrap.isIdentifiedID &&\n                existingDistinctId != null &&\n                existingDistinctId !== bootstrapDistinctId &&\n                existingUserState === USER_STATE_IDENTIFIED\n            ) {\n                // The existing user is already identified with a different ID. Silently\n                // switching identities without an $identify event would corrupt analytics.\n                // Preserve the existing identity and log a warning.\n                logger.warn(\n                    'Bootstrap distinctID differs from an already-identified user. ' +\n                        'The existing identity is preserved. Call reset() before reinitializing ' +\n                        'if you intend to switch users.'\n                )\n            } else {\n                const uuid = this.config.get_device_id(uuidv7())\n                const deviceID = config.bootstrap.isIdentifiedID ? uuid : bootstrapDistinctId\n                this.persistence.set_property(\n                    USER_STATE,\n                    config.bootstrap.isIdentifiedID ? USER_STATE_IDENTIFIED : USER_STATE_ANONYMOUS\n                )\n                this.register({\n                    distinct_id: bootstrapDistinctId,\n                    $device_id: deviceID,\n                })\n            }\n        }\n\n        if (startInCookielessMode) {\n            this.register_once(\n                {\n                    distinct_id: COOKIELESS_SENTINEL_VALUE,\n                    $device_id: null,\n                },\n                ''\n            )\n        } else if (!this.get_distinct_id()) {\n            // There is no need to set the distinct id\n            // or the device id if something was already stored\n            // in the persistence\n            const uuid = this.config.get_device_id(uuidv7())\n\n            this.register_once(\n                {\n                    distinct_id: uuid,\n                    $device_id: uuid,\n                },\n                ''\n            )\n            // distinct id == $device_id is a proxy for anonymous user\n            this.persistence.set_property(USER_STATE, USER_STATE_ANONYMOUS)\n        }\n        // Set up event handler for pageleave\n        // Use `onpagehide` if available, see https://calendar.perfplanet.com/2020/beaconing-in-practice/#beaconing-reliability-avoiding-abandons\n        //\n        // Not making it passive to try and force the browser to handle this before the page is unloaded\n        addEventListener(window, 'onpagehide' in self ? 'pagehide' : 'unload', this._handle_unload.bind(this), {\n            passive: false,\n        })\n\n        // We want to avoid promises for IE11 compatibility, so we use callbacks here\n        if (config.segment) {\n            setupSegmentIntegration(this, () => this._loaded())\n        } else {\n            this._loaded()\n        }\n\n        if (isFunction(this.config._onCapture) && this.config._onCapture !== __NOOP) {\n            logger.warn('onCapture is deprecated. Please use `before_send` instead')\n            this.on('eventCaptured', (data) => this.config._onCapture(data.event, data))\n        }\n\n        if (this.config.ip) {\n            logger.warn(\n                'The `ip` config option has NO EFFECT AT ALL and has been deprecated. Use a custom transformation or \"Discard IP data\" project setting instead. See https://posthog.com/tutorials/web-redact-properties#hiding-customer-ip-address for more information.'\n            )\n        }\n\n        return this\n    }\n\n    private _initExtensions(startInCookielessMode: boolean): void {\n        // we don't support IE11 anymore, so performance.now is safe\n        // eslint-disable-next-line compat/compat\n        const initStartTime = performance.now()\n        const ext = { ...PostHog.__defaultExtensionClasses, ...this.config.__extensionClasses }\n        const initTasks: Array<() => void> = []\n\n        // Due to name mangling, we can't easily iterate and assign these extensions\n        // The assignment needs to also be mangled. Thus, the loop is unrolled.\n        if (ext.featureFlags) {\n            this._extensions.push((this.featureFlags = this.featureFlags ?? new ext.featureFlags(this)))\n        }\n        if (ext.exceptions) {\n            this._extensions.push((this.exceptions = this.exceptions ?? new ext.exceptions(this)))\n        }\n        if (ext.historyAutocapture) {\n            this._extensions.push((this.historyAutocapture = new ext.historyAutocapture(this)))\n        }\n        if (ext.tracingHeaders) {\n            this._extensions.push(new ext.tracingHeaders(this))\n        }\n        if (ext.siteApps) {\n            this._extensions.push((this.siteApps = new ext.siteApps(this)))\n        }\n        if (ext.sessionRecording && !startInCookielessMode) {\n            this._extensions.push((this.sessionRecording = new ext.sessionRecording(this)))\n        }\n        if (!this.config.disable_scroll_properties) {\n            initTasks.push(() => {\n                this.scrollManager.startMeasuringScrollPosition()\n            })\n        }\n        if (ext.autocapture) {\n            this._extensions.push((this.autocapture = new ext.autocapture(this)))\n        }\n        if (ext.surveys) {\n            this._extensions.push((this.surveys = this.surveys ?? new ext.surveys(this)))\n        }\n        if (ext.logs) {\n            this._extensions.push((this.logs = this.logs ?? new ext.logs(this)))\n        }\n        if (ext.conversations) {\n            this._extensions.push((this.conversations = this.conversations ?? new ext.conversations(this)))\n        }\n        if (ext.productTours) {\n            this._extensions.push((this.productTours = new ext.productTours(this)))\n        }\n        if (ext.heatmaps) {\n            this._extensions.push((this.heatmaps = new ext.heatmaps(this)))\n        }\n        if (ext.webVitalsAutocapture) {\n            this._extensions.push((this.webVitalsAutocapture = new ext.webVitalsAutocapture(this)))\n        }\n        if (ext.exceptionObserver) {\n            this._extensions.push((this.exceptionObserver = new ext.exceptionObserver(this)))\n        }\n        if (ext.deadClicksAutocapture) {\n            this._extensions.push(\n                (this.deadClicksAutocapture = new ext.deadClicksAutocapture(this, isDeadClicksEnabledForAutocapture))\n            )\n        }\n        if (ext.toolbar) {\n            this._extensions.push((this.toolbar = this.toolbar ?? new ext.toolbar(this)))\n        }\n        if (ext.experiments) {\n            this._extensions.push((this.experiments = this.experiments ?? new ext.experiments(this)))\n        }\n\n        this._extensions.forEach((extension) => {\n            if (!extension.initialize) return\n            initTasks.push(() => {\n                extension.initialize?.()\n            })\n        })\n\n        // Replay any pending remote config that arrived before extensions were ready\n        initTasks.push(() => {\n            if (this._pendingRemoteConfig) {\n                const config = this._pendingRemoteConfig\n                this._pendingRemoteConfig = undefined // Clear before replaying to avoid re-storing\n                this._onRemoteConfig(config)\n            }\n        })\n\n        // Process tasks with time-slicing to avoid blocking\n        this._processInitTaskQueue(initTasks, initStartTime)\n    }\n\n    private _processInitTaskQueue(queue: Array<() => void>, initStartTime: number): void {\n        const TIME_BUDGET_MS = 30 // Respect frame budget (~60fps = 16ms, but we're already deferred)\n\n        while (queue.length > 0) {\n            // Only time-slice if deferred init is enabled, otherwise run synchronously\n            if (this.config.__preview_deferred_init_extensions) {\n                // we don't support IE11 anymore, so performance.now is safe\n                // eslint-disable-next-line compat/compat\n                const elapsed = performance.now() - initStartTime\n\n                // Check if we've exceeded our time budget\n                if (elapsed >= TIME_BUDGET_MS && queue.length > 0) {\n                    // Yield to browser, then continue processing\n                    setTimeout(() => {\n                        this._processInitTaskQueue(queue, initStartTime)\n                    }, 0)\n                    return\n                }\n            }\n\n            // Process next task\n            const task = queue.shift()\n            if (task) {\n                try {\n                    task()\n                } catch (error) {\n                    logger.error('Error initializing extension:', error)\n                }\n            }\n        }\n\n        // All tasks complete - record timing for both sync and deferred modes\n        // we don't support IE11 anymore, so performance.now is safe\n        // eslint-disable-next-line compat/compat\n        const taskInitTiming = Math.round(performance.now() - initStartTime)\n        this.register_for_session({\n            [SDK_DEBUG_EXTENSIONS_INIT_METHOD]: this.config.__preview_deferred_init_extensions\n                ? 'deferred'\n                : 'synchronous',\n            [SDK_DEBUG_EXTENSIONS_INIT_TIME_MS]: taskInitTiming,\n        })\n        if (this.config.__preview_deferred_init_extensions) {\n            logger.info(`PostHog extensions initialized (${taskInitTiming}ms)`)\n        }\n    }\n\n    _onRemoteConfig(config: RemoteConfig) {\n        if (!(document && document.body)) {\n            logger.info('document not ready yet, trying again in 500 milliseconds...')\n            setTimeout(() => {\n                this._onRemoteConfig(config)\n            }, 500)\n            return\n        }\n\n        // Store config in case extensions aren't initialized yet (only needed for deferred init)\n        if (this.config.__preview_deferred_init_extensions) {\n            this._pendingRemoteConfig = config\n        }\n\n        // Cache the latest remote config so extensions that are created later\n        // (e.g. sessionRecording after opt_in_capturing from cookieless mode) can\n        // replay it and pick up server-side settings like recording enable flags.\n        this._lastRemoteConfig = config\n\n        this.compression = undefined\n        if (config.supportedCompression && !this.config.disable_compression) {\n            this.compression = includes(config['supportedCompression'], Compression.GZipJS)\n                ? Compression.GZipJS\n                : includes(config['supportedCompression'], Compression.Base64)\n                  ? Compression.Base64\n                  : undefined\n        }\n\n        if (config.analytics?.endpoint) {\n            this.analyticsDefaultEndpoint = config.analytics.endpoint\n        }\n\n        this.set_config({\n            person_profiles: this._initialPersonProfilesConfig\n                ? this._initialPersonProfilesConfig\n                : PERSON_PROFILES_IDENTIFIED_ONLY,\n        })\n\n        this._extensions.forEach((ext) => ext.onRemoteConfig?.(config))\n    }\n\n    _loaded(): void {\n        try {\n            this.config.loaded(this)\n        } catch (err) {\n            logger.critical('`loaded` function failed', err)\n        }\n\n        this._start_queue_if_opted_in()\n\n        // Check if current hostname matches internal_or_test_user_hostname pattern and mark as test user before any events\n        if (this.config.internal_or_test_user_hostname && location?.hostname) {\n            const hostname = location.hostname\n            const pattern = this.config.internal_or_test_user_hostname\n            const matches = typeof pattern === 'string' ? hostname === pattern : pattern.test(hostname)\n            if (matches) {\n                this.setInternalOrTestUser()\n            }\n        }\n\n        // this happens after \"loaded\" so a user can call identify or any other things before the pageview fires\n        if (this.config.capture_pageview) {\n            // NOTE: We want to fire this on the next tick as the previous implementation had this side effect\n            // and some clients may rely on it\n            setTimeout(() => {\n                if (this.consent.isOptedIn() || this._inCookielessMode()) {\n                    this._captureInitialPageview()\n                }\n            }, 1)\n        }\n\n        this._remoteConfigLoader = new RemoteConfigLoader(this)\n        this._remoteConfigLoader.load()\n    }\n\n    _start_queue_if_opted_in(): void {\n        if (this.is_capturing()) {\n            if (this.config.request_batching) {\n                this._requestQueue?.enable()\n            }\n        }\n    }\n\n    _dom_loaded(): void {\n        if (this.is_capturing()) {\n            eachArray(this.__request_queue, (item) => this._send_retriable_request(item))\n        }\n\n        this.__request_queue = []\n        this._start_queue_if_opted_in()\n    }\n\n    _handle_unload(): void {\n        this.surveys?.handlePageUnload()\n\n        if (!this.config.request_batching) {\n            if (this._shouldCapturePageleave()) {\n                this.capture(EVENT_PAGELEAVE, null, { transport: 'sendBeacon' })\n            }\n            return\n        }\n\n        if (this._shouldCapturePageleave()) {\n            this.capture(EVENT_PAGELEAVE)\n        }\n\n        this.logs?.flushLogs('sendBeacon')\n        this._requestQueue?.unload()\n        this._retryQueue?.unload()\n    }\n\n    _send_request(options: QueuedRequestWithOptions): void {\n        if (!this.__loaded) {\n            return\n        }\n\n        if (ENQUEUE_REQUESTS) {\n            this.__request_queue.push(options)\n            return\n        }\n\n        if (this.rateLimiter.isServerRateLimited(options.batchKey)) {\n            return\n        }\n\n        options.transport = options.transport || this.config.api_transport\n        options.url = extendURLParams(options.url, {\n            // Whether to detect ip info or not\n            ip: this.config.ip ? 1 : 0,\n        })\n        options.headers = {\n            ...this.config.request_headers,\n            ...options.headers,\n        }\n        options.compression = options.compression === 'best-available' ? this.compression : options.compression\n        options.disableXHRCredentials = this.config.__preview_disable_xhr_credentials\n        if (this.config.__preview_disable_beacon) {\n            options.disableTransport = ['sendBeacon']\n        }\n\n        // Specially useful if you're doing SSR with NextJS\n        // Users must be careful when tweaking `cache` because they might get out-of-date feature flags\n        options.fetchOptions = options.fetchOptions || this.config.fetch_options\n\n        request({\n            ...options,\n            callback: (response) => {\n                this.rateLimiter.checkForLimiting(response)\n\n                if (response.statusCode >= 400) {\n                    this.config.on_request_error?.(response)\n                }\n\n                options.callback?.(response)\n            },\n        })\n    }\n\n    _send_retriable_request(options: QueuedRequestWithOptions): void {\n        if (this._retryQueue) {\n            this._retryQueue.retriableRequest(options)\n        } else {\n            this._send_request(options)\n        }\n    }\n\n    /**\n     * _execute_array() deals with processing any posthog function\n     * calls that were called before the PostHog library were loaded\n     * (and are thus stored in an array so they can be called later)\n     *\n     * Note: we fire off all the posthog function calls && user defined\n     * functions BEFORE we fire off posthog capturing calls. This is so\n     * identify/register/set_config calls can properly modify early\n     * capturing calls.\n     *\n     * @param {Array} array\n     */\n    _execute_array(array: SnippetArrayItem[]): void {\n        _executeArrayDepth++\n        try {\n            let fn_name\n            const alias_calls: SnippetArrayItem[] = []\n            const other_calls: SnippetArrayItem[] = []\n            const capturing_calls: SnippetArrayItem[] = []\n            eachArray(array, (item) => {\n                if (item) {\n                    fn_name = item[0]\n                    if (isArray(fn_name)) {\n                        capturing_calls.push(item) // chained call e.g. posthog.get_group().set()\n                    } else if (isFunction(item)) {\n                        ;(item as any).call(this)\n                    } else if (isArray(item) && fn_name === 'alias') {\n                        alias_calls.push(item)\n                    } else if (\n                        isArray(item) &&\n                        fn_name.indexOf('capture') !== -1 &&\n                        isFunction((this as any)[fn_name])\n                    ) {\n                        capturing_calls.push(item)\n                    } else {\n                        other_calls.push(item)\n                    }\n                }\n            })\n\n            const execute = function (calls: SnippetArrayItem[], thisArg: any) {\n                eachArray(calls, function (item) {\n                    if (isArray(item[0])) {\n                        // chained call\n                        let caller = thisArg\n                        each(item, function (call) {\n                            caller = caller[call[0]].apply(caller, call.slice(1))\n                        })\n                    } else {\n                        thisArg[item[0]].apply(thisArg, item.slice(1))\n                    }\n                })\n            }\n\n            execute(alias_calls, this)\n            execute(other_calls, this)\n            execute(capturing_calls, this)\n        } finally {\n            _executeArrayDepth--\n        }\n    }\n\n    /**\n     * push() keeps the standard async-array-push\n     * behavior around after the lib is loaded.\n     * This is only useful for external integrations that\n     * do not wish to rely on our convenience methods\n     * (created in the snippet).\n     *\n     * @example\n     * ```js\n     * posthog.push(['register', { a: 'b' }]);\n     * ```\n     *\n     * @param {Array} item A [function_name, args...] array to be executed\n     */\n    push(item: SnippetArrayItem): void {\n        if (_executeArrayDepth > 0 && isArray(item) && isString(item[0])) {\n            // push() is being called while _execute_array is already running.\n            // This happens when a third-party Proxy (e.g., TikTok's in-app browser)\n            // wraps window.posthog and converts method calls into push() calls,\n            // creating an infinite loop: _execute_array -> this[method] -> Proxy ->\n            // push -> _execute_array -> ...\n            // Dispatch directly from the prototype to break the cycle.\n            const fn = (PostHog.prototype as any)[item[0]]\n            if (isFunction(fn)) {\n                fn.apply(this, item.slice(1))\n            }\n            return\n        }\n        this._execute_array([item])\n    }\n\n    /**\n     * Captures an event with optional properties and configuration.\n     *\n     * @remarks\n     * You can capture arbitrary object-like values as events. [Learn about capture best practices](/docs/product-analytics/capture-events)\n     *\n     * @example\n     * ```js\n     * // basic event capture\n     * posthog.capture('cta-button-clicked', {\n     *     button_name: 'Get Started',\n     *     page: 'homepage'\n     * })\n     * ```\n     *\n     * {@label Capture}\n     *\n     * @public\n     *\n     * @param event_name - The name of the event (e.g., 'Sign Up', 'Button Click', 'Purchase')\n     * @param properties - Properties to include with the event describing the user or event details\n     * @param options - Optional configuration for the capture request\n     *\n     * @returns The capture result containing event data, or undefined if capture failed\n     */\n    capture(\n        event_name: EventName,\n        properties?: Properties | null,\n        options?: CaptureOptions\n    ): CaptureResult | undefined {\n        // While developing, a developer might purposefully _not_ call init(),\n        // in this case, we would like capture to be a noop.\n        if (!this.__loaded || !this.persistence || !this.sessionPersistence || !this._requestQueue) {\n            logger.uninitializedWarning('posthog.capture')\n            return\n        }\n\n        if (!this.is_capturing()) {\n            return\n        }\n\n        // typing doesn't prevent interesting data\n        if (isUndefined(event_name) || !isString(event_name)) {\n            logger.error('No event name provided to posthog.capture')\n            return\n        }\n\n        const isBot = !this.config.opt_out_useragent_filter && this._is_bot()\n        const shouldDropBotEvent = isBot && !this.config.__preview_capture_bot_pageviews\n\n        // We drop bot events unless the preview flag to send bot pageviews is enabled\n        // or the user has explicitly opted out of useragent filtering\n        if (shouldDropBotEvent) {\n            return\n        }\n\n        const clientRateLimitContext = !options?.skip_client_rate_limiting\n            ? this.rateLimiter.clientRateLimitContext()\n            : undefined\n\n        if (clientRateLimitContext?.isRateLimited) {\n            logger.critical('This capture call is ignored due to client rate limiting.')\n            return\n        }\n\n        if (properties?.$current_url && !isString(properties?.$current_url)) {\n            logger.error(\n                'Invalid `$current_url` property provided to `posthog.capture`. Input must be a string. Ignoring provided value.'\n            )\n            delete properties?.$current_url\n        }\n\n        if (event_name === '$exception' && !options?._originatedFromCaptureException) {\n            logger.warn(\n                \"Using `posthog.capture('$exception')` is unreliable because it does not attach required metadata. Use `posthog.captureException(error)` instead, which attaches required metadata automatically.\"\n            )\n        }\n\n        // update persistence\n        this.sessionPersistence.update_search_keyword()\n\n        // The initial campaign/referrer props need to be stored in the regular persistence, as they are there to mimic\n        // the person-initial props. The non-initial versions are stored in the sessionPersistence, as they are sent\n        // with every event and used by the session table to create session-initial props.\n        if (this.config.save_campaign_params) {\n            this.sessionPersistence.update_campaign_params()\n        }\n        if (this.config.save_referrer) {\n            this.sessionPersistence.update_referrer_info()\n        }\n\n        if (this.config.save_campaign_params || this.config.save_referrer) {\n            this.persistence.set_initial_person_info()\n        }\n\n        const systemTime = new Date()\n        const timestamp = options?.timestamp || systemTime\n\n        const uuid = uuidv7()\n        let data: CaptureResult = {\n            uuid,\n            event: event_name,\n            properties: this.calculateEventProperties(event_name, properties || {}, timestamp, uuid),\n        }\n\n        // Route pageviews to $bot_pageview when bot detected and preview flag enabled\n        if (event_name === EVENT_PAGEVIEW && this.config.__preview_capture_bot_pageviews && isBot) {\n            data.event = '$bot_pageview'\n            // While it's obvious that a $bot_pageview is (likely) from a bot, we explicitly set $browser_type\n            // to make it easy to filter and test bot pageviews in the product\n            data.properties.$browser_type = 'bot'\n        }\n\n        if (clientRateLimitContext) {\n            data.properties['$lib_rate_limit_remaining_tokens'] = clientRateLimitContext.remainingTokens\n        }\n\n        const setProperties = options?.$set\n        if (setProperties) {\n            data.$set = options?.$set\n        }\n        // $groupidentify doesn't process person $set_once on the server, so don't mark\n        // initial person props as sent. This ensures they're included with subsequent\n        // $identify calls.\n        const markSetOnceAsSent = event_name !== EVENT_GROUPIDENTIFY\n        // $identify should always include initial props because it creates/merges persons\n        // and may be processed before earlier anonymous events on the server\n        const forceIncludeInitialProps = event_name === EVENT_IDENTIFY\n        const setOnceProperties = this._calculate_set_once_properties(\n            options?.$set_once,\n            markSetOnceAsSent,\n            forceIncludeInitialProps\n        )\n        if (setOnceProperties) {\n            data.$set_once = setOnceProperties\n        }\n\n        if (!options?._noTruncate) {\n            data = _copyAndTruncateStrings(data, this.config.properties_string_max_length)\n        }\n        data.timestamp = timestamp\n        if (!isUndefined(options?.timestamp)) {\n            data.properties['$event_time_override_provided'] = true\n            data.properties['$event_time_override_system_time'] = systemTime\n        }\n\n        if (event_name === SurveyEventName.DISMISSED || event_name === SurveyEventName.SENT) {\n            const surveyId = properties?.[SurveyEventProperties.SURVEY_ID]\n            const surveyIteration = properties?.[SurveyEventProperties.SURVEY_ITERATION]\n            setSurveySeenOnLocalStorage({ id: surveyId, current_iteration: surveyIteration })\n            data.$set = {\n                ...data.$set,\n                [getSurveyInteractionProperty(\n                    { id: surveyId, current_iteration: surveyIteration },\n                    event_name === SurveyEventName.SENT ? 'responded' : 'dismissed'\n                )]: true,\n            }\n        } else if (event_name === SurveyEventName.SHOWN) {\n            data.$set = {\n                ...data.$set,\n                [SurveyEventProperties.SURVEY_LAST_SEEN_DATE]: new Date().toISOString(),\n            }\n        }\n\n        if (event_name === ProductTourEventName.SHOWN) {\n            const tourType = properties?.[ProductTourEventProperties.TOUR_TYPE]\n            if (tourType) {\n                data.$set = {\n                    ...data.$set,\n                    [`${ProductTourEventProperties.TOUR_LAST_SEEN_DATE}/${tourType}`]: new Date().toISOString(),\n                }\n            }\n        }\n\n        // Top-level $set overriding values from the one from properties is taken from the plugin-server normalizeEvent\n        // This doesn't handle $set_once, because posthog-people doesn't either\n        const finalSet = { ...data.properties['$set'], ...data['$set'] }\n        if (!isEmptyObject(finalSet)) {\n            this.setPersonPropertiesForFlags(finalSet)\n        }\n\n        if (!isNullish(this.config.before_send)) {\n            const beforeSendResult = this._runBeforeSend(data)\n            if (!beforeSendResult) {\n                return\n            } else {\n                data = beforeSendResult\n            }\n        }\n\n        this._internalEventEmitter.emit('eventCaptured', data)\n\n        const requestOptions: QueuedRequestWithOptions = {\n            method: 'POST',\n            url: options?._url ?? this.requestRouter.endpointFor('api', this.analyticsDefaultEndpoint),\n            data,\n            compression: 'best-available',\n            batchKey: options?._batchKey,\n        }\n\n        if (this.config.request_batching && (!options || options?._batchKey) && !options?.send_instantly) {\n            this._requestQueue.enqueue(requestOptions)\n        } else {\n            this._send_retriable_request(requestOptions)\n        }\n\n        return data\n    }\n\n    _addCaptureHook(callback: (eventName: string, eventPayload?: CaptureResult) => void): () => void {\n        return this.on('eventCaptured', (data) => callback(data.event, data))\n    }\n\n    /**\n     * This method is used internally to calculate the event properties before sending it to PostHog. It can also be\n     * used by integrations (e.g. Segment) to enrich events with PostHog properties before sending them to Segment,\n     * which is required for some PostHog products to work correctly. (e.g. to have a correct $session_id property).\n     *\n     * @param {String} eventName The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', '$pageview', etc.\n     * @param {Object} eventProperties The properties to include with the event.\n     * @param {Date} [timestamp] The timestamp of the event, e.g. for calculating time on page. If not set, it'll automatically be set to the current time.\n     * @param {String} [uuid] The uuid of the event, e.g. for storing the $pageview ID.\n     * @param {Boolean} [readOnly] Set this if you do not intend to actually send the event, and therefore do not want to update internal state e.g. session timeout\n     *\n     * @internal\n     */\n    public calculateEventProperties(\n        eventName: string,\n        eventProperties: Properties,\n        timestamp?: Date,\n        uuid?: string,\n        readOnly?: boolean\n    ): Properties {\n        timestamp = timestamp || new Date()\n        if (!this.persistence || !this.sessionPersistence) {\n            return eventProperties\n        }\n\n        // set defaults\n        const startTimestamp = readOnly ? undefined : this.persistence.remove_event_timer(eventName)\n        let properties = { ...eventProperties }\n        properties['token'] = this.config.token\n        properties['$config_defaults'] = this.config.defaults\n\n        if (this._inCookielessMode()) {\n            // Set a flag to tell the plugin server to use cookieless server hash mode\n            properties[COOKIELESS_MODE_FLAG_PROPERTY] = true\n        }\n\n        if (eventName === '$snapshot') {\n            const persistenceProps = { ...this.persistence.properties(), ...this.sessionPersistence.properties() }\n            properties['distinct_id'] = persistenceProps.distinct_id\n            if (\n                // we spotted one customer that was managing to send `false` for ~9k events a day\n                !(isString(properties['distinct_id']) || isNumber(properties['distinct_id'])) ||\n                isEmptyString(properties['distinct_id'])\n            ) {\n                logger.error('Invalid distinct_id for replay event. This indicates a bug in your implementation')\n            }\n            return properties\n        }\n\n        const infoProperties = getEventProperties(\n            this.config.mask_personal_data_properties,\n            this.config.custom_personal_data_properties\n        )\n\n        if (this.sessionManager) {\n            const { sessionId, windowId } = this.sessionManager.checkAndGetSessionAndWindowId(\n                readOnly,\n                timestamp.getTime()\n            )\n            properties['$session_id'] = sessionId\n            properties['$window_id'] = windowId\n        }\n        if (this.sessionPropsManager) {\n            extend(properties, this.sessionPropsManager.getSessionProps())\n        }\n\n        try {\n            if (this.sessionRecording) {\n                extend(properties, this.sessionRecording.sdkDebugProperties)\n            }\n            properties['$sdk_debug_retry_queue_size'] = this._retryQueue?.length\n        } catch (e: any) {\n            properties['$sdk_debug_error_capturing_properties'] = String(e)\n        }\n\n        if (this.requestRouter.region === RequestRouterRegion.CUSTOM) {\n            properties['$lib_custom_api_host'] = this.config.api_host\n        }\n\n        let pageviewProperties: Record<string, any>\n        if (eventName === EVENT_PAGEVIEW && !readOnly) {\n            pageviewProperties = this.pageViewManager.doPageView(timestamp, uuid)\n        } else if (eventName === EVENT_PAGELEAVE && !readOnly) {\n            pageviewProperties = this.pageViewManager.doPageLeave(timestamp)\n        } else {\n            pageviewProperties = this.pageViewManager.doEvent()\n        }\n        properties = extend(properties, pageviewProperties)\n\n        if (eventName === EVENT_PAGEVIEW && document) {\n            properties['title'] = document.title\n        }\n\n        // set $duration if time_event was previously called for this event\n        if (!isUndefined(startTimestamp)) {\n            const duration_in_ms = timestamp.getTime() - startTimestamp\n            properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3))\n        }\n\n        // this is only added when this.config.opt_out_useragent_filter is true,\n        // or it would always add \"browser\"\n        if (userAgent && this.config.opt_out_useragent_filter) {\n            properties['$browser_type'] = this._is_bot() ? 'bot' : 'browser'\n        }\n\n        // note: extend writes to the first object, so lets make sure we\n        // don't write to the persistence properties object and info\n        // properties object by passing in a new object\n\n        // update properties with pageview info and super-properties\n        properties = extend(\n            {},\n            infoProperties,\n            this.persistence.properties(),\n            this.sessionPersistence.properties(),\n            properties\n        )\n\n        properties['$is_identified'] = this._isIdentified()\n\n        if (isArray(this.config.property_denylist)) {\n            each(this.config.property_denylist, function (denylisted_prop) {\n                delete properties[denylisted_prop]\n            })\n        } else {\n            logger.error(\n                DENYLIST_INVALID +\n                    this.config.property_denylist +\n                    ' or property_blacklist config: ' +\n                    this.config.property_blacklist\n            )\n        }\n\n        const sanitize_properties = this.config.sanitize_properties\n        if (sanitize_properties) {\n            logger.error(SANITIZE_DEPRECATED)\n            properties = sanitize_properties(properties, eventName)\n        }\n\n        // add person processing flag as very last step, so it cannot be overridden\n        const hasPersonProcessing = this._hasPersonProcessing()\n        properties['$process_person_profile'] = hasPersonProcessing\n        // if the event has person processing, ensure that all future events will too, even if the setting changes\n        if (hasPersonProcessing && !readOnly) {\n            this._requirePersonProcessing('_calculate_event_properties')\n        }\n\n        return properties\n    }\n\n    /** @deprecated - deprecated in 1.241.0, use `calculateEventProperties` instead  */\n    _calculate_event_properties = this.calculateEventProperties.bind(this)\n\n    /**\n     * Add additional set_once properties to the event when creating a person profile. This allows us to create the\n     * profile with mostly-accurate properties, despite earlier events not setting them. We do this by storing them in\n     * persistence.\n     * @param dataSetOnce\n     * @param markAsSent - if true, marks the properties as sent so they won't be included in future events.\n     *                     Set to false for events like $groupidentify where the server doesn't process person props.\n     * @param forceIncludeInitialProps - if true, include initial person props even if they've already been sent.\n     *                                   Used for $identify which creates/merges persons and may be processed out of order.\n     */\n    _calculate_set_once_properties(\n        dataSetOnce?: Properties,\n        markAsSent: boolean = true,\n        forceIncludeInitialProps: boolean = false\n    ): Properties | undefined {\n        if (!this.persistence || !this._hasPersonProcessing()) {\n            return dataSetOnce\n        }\n\n        if (this._personProcessingSetOncePropertiesSent && !forceIncludeInitialProps) {\n            // We only need to send these properties once. Sending them with later events would be redundant and would\n            // just require extra work on the server to process them.\n            return dataSetOnce\n        }\n        // if we're an identified person, send initial params with every event\n        const initialProps = this.persistence.get_initial_props()\n        const sessionProps = this.sessionPropsManager?.getSetOnceProps()\n        let setOnceProperties = extend({}, initialProps, sessionProps || {}, dataSetOnce || {})\n        const sanitize_properties = this.config.sanitize_properties\n        if (sanitize_properties) {\n            logger.error(SANITIZE_DEPRECATED)\n            setOnceProperties = sanitize_properties(setOnceProperties, '$set_once')\n        }\n        if (markAsSent) {\n            this._personProcessingSetOncePropertiesSent = true\n        }\n        if (isEmptyObject(setOnceProperties)) {\n            return undefined\n        }\n        return setOnceProperties\n    }\n\n    /**\n     * Registers super properties that are included with all events.\n     *\n     * @remarks\n     * Super properties are stored in persistence and automatically added to every event you capture.\n     * These values will overwrite any existing super properties with the same keys.\n     *\n     * @example\n     * ```js\n     * // register a single property\n     * posthog.register({ plan: 'premium' })\n     * ```\n     *\n     * {@label Capture}\n     *\n     * @example\n     * ```js\n     * // register multiple properties\n     * posthog.register({\n     *     email: 'user@example.com',\n     *     account_type: 'business',\n     *     signup_date: '2023-01-15'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // register with custom expiration\n     * posthog.register({ campaign: 'summer_sale' }, 7) // expires in 7 days\n     * ```\n     *\n     * @public\n     *\n     * @param {Object} properties properties to store about the user\n     * @param {Number} [days] How many days since the user's last visit to store the super properties\n     */\n    register(properties: Properties, days?: number): void {\n        this.persistence?.register(properties, days)\n    }\n\n    /**\n     * Registers super properties only if they haven't been set before.\n     *\n     * @remarks\n     * Unlike `register()`, this method will not overwrite existing super properties.\n     * Use this for properties that should only be set once, like signup date or initial referrer.\n     *\n     * {@label Capture}\n     *\n     * @example\n     * ```js\n     * // register once-only properties\n     * posthog.register_once({\n     *     first_login_date: new Date().toISOString(),\n     *     initial_referrer: document.referrer\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // override existing value if it matches default\n     * posthog.register_once(\n     *     { user_type: 'premium' },\n     *     'unknown'  // overwrite if current value is 'unknown'\n     * )\n     * ```\n     *\n     * @public\n     *\n     * @param {Object} properties An associative array of properties to store about the user\n     * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n     * @param {Number} [days] How many days since the users last visit to store the super properties\n     */\n    register_once(properties: Properties, default_value?: Property, days?: number): void {\n        this.persistence?.register_once(properties, default_value, days)\n    }\n\n    /**\n     * Registers super properties for the current session only.\n     *\n     * @remarks\n     * Session super properties are automatically added to all events during the current browser session.\n     * Unlike regular super properties, these are cleared when the session ends and are stored in sessionStorage.\n     *\n     * {@label Capture}\n     *\n     * @example\n     * ```js\n     * // register session-specific properties\n     * posthog.register_for_session({\n     *     current_page_type: 'checkout',\n     *     ab_test_variant: 'control'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // register properties for user flow tracking\n     * posthog.register_for_session({\n     *     selected_plan: 'pro',\n     *     completed_steps: 3,\n     *     flow_id: 'signup_flow_v2'\n     * })\n     * ```\n     *\n     * @public\n     *\n     * @param {Object} properties An associative array of properties to store about the user\n     */\n    register_for_session(properties: Properties): void {\n        this.sessionPersistence?.register(properties)\n    }\n\n    /**\n     * Removes a super property from persistent storage.\n     *\n     * @remarks\n     * This will stop the property from being automatically included in future events.\n     * The property will be permanently removed from the user's profile.\n     *\n     * {@label Capture}\n     *\n     * @example\n     * ```js\n     * // remove a super property\n     * posthog.unregister('plan_type')\n     * ```\n     *\n     * @public\n     *\n     * @param {String} property The name of the super property to remove\n     */\n    unregister(property: string): void {\n        this.persistence?.unregister(property)\n    }\n\n    /**\n     * Removes a session super property from the current session.\n     *\n     * @remarks\n     * This will stop the property from being automatically included in future events for this session.\n     * The property is removed from sessionStorage.\n     *\n     * {@label Capture}\n     *\n     * @example\n     * ```js\n     * // remove a session property\n     * posthog.unregister_for_session('current_flow')\n     * ```\n     *\n     * @public\n     *\n     * @param {String} property The name of the session super property to remove\n     */\n    unregister_for_session(property: string): void {\n        this.sessionPersistence?.unregister(property)\n    }\n\n    _register_single(prop: string, value: Property) {\n        this.register({ [prop]: value })\n    }\n\n    /**\n     * Gets the value of a feature flag for the current user.\n     *\n     * @remarks\n     * Returns the feature flag value which can be a boolean, string, or undefined.\n     * Supports multivariate flags that can return custom string values.\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * // check boolean flag\n     * if (posthog.getFeatureFlag('new-feature')) {\n     *     // show new feature\n     * }\n     * ```\n     *\n     * @example\n     * ```js\n     * // check multivariate flag\n     * const variant = posthog.getFeatureFlag('button-color')\n     * if (variant === 'red') {\n     *     // show red button\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @param {Object|String} prop Key of the feature flag.\n     * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n     *                        If {fresh: true}, we won't return cached values from localStorage - only values loaded from the server.\n     */\n    getFeatureFlag(key: string, options?: FeatureFlagOptions): boolean | string | undefined {\n        return this.featureFlags?.getFeatureFlag(key, options)\n    }\n\n    /**\n     * Get feature flag payload value matching key for user (supports multivariate flags).\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * if(posthog.getFeatureFlag('beta-feature') === 'some-value') {\n     *      const someValue = posthog.getFeatureFlagPayload('beta-feature')\n     *      // do something\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @deprecated Use `getFeatureFlagResult()` instead\n     *\n     * @param {Object|String} prop Key of the feature flag.\n     */\n    getFeatureFlagPayload(key: string): JsonType {\n        return this.featureFlags?.getFeatureFlagPayload(key)\n    }\n\n    /**\n     * Get a feature flag evaluation result including both the flag value and payload.\n     *\n     * By default, this method emits the `$feature_flag_called` event.\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * const result = posthog.getFeatureFlagResult('my-flag')\n     * if (result?.enabled) {\n     *     console.log('Flag is enabled with payload:', result.payload)\n     * }\n     * ```\n     *\n     * @example\n     * ```js\n     * // multivariate flag\n     * const result = posthog.getFeatureFlagResult('button-color')\n     * if (result?.variant === 'red') {\n     *     showRedButton(result.payload)\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @param {string} key Key of the feature flag.\n     * @param {Object} [options] Options for the feature flag lookup.\n     * @param {boolean} [options.send_event=true] If false, won't send the $feature_flag_called event.\n     * @param {boolean} [options.fresh=false] If true, won't return cached values from localStorage - only values loaded from the server.\n     * @returns {FeatureFlagResult | undefined} The feature flag result including key, enabled, variant, and payload.\n     */\n    getFeatureFlagResult(key: string, options?: FeatureFlagOptions): FeatureFlagResult | undefined {\n        return this.featureFlags?.getFeatureFlagResult(key, options)\n    }\n\n    /**\n     * Checks if a feature flag is enabled for the current user.\n     *\n     * @remarks\n     * Returns true if the flag is enabled, false if disabled, or undefined if not found.\n     * This is a convenience method that treats any truthy value as enabled.\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * // simple feature flag check\n     * if (posthog.isFeatureEnabled('new-checkout')) {\n     *     showNewCheckout()\n     * }\n     * ```\n     *\n     * @example\n     * ```js\n     * // disable event tracking\n     * if (posthog.isFeatureEnabled('feature', { send_event: false })) {\n     *     // flag checked without sending $feature_flag_call event\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @param {Object|String} prop Key of the feature flag.\n     * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n     *                        If {fresh: true}, we won't return cached values from localStorage - only values loaded from the server.\n     */\n    isFeatureEnabled(key: string, options?: FeatureFlagOptions): boolean | undefined {\n        return this.featureFlags?.isFeatureEnabled(key, options)\n    }\n\n    /**\n     * Feature flag values are cached. If something has changed with your user and you'd like to refetch their flag values, call this method.\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * posthog.reloadFeatureFlags()\n     * ```\n     *\n     * @public\n     */\n    reloadFeatureFlags(): void {\n        this.featureFlags?.reloadFeatureFlags()\n    }\n\n    /**\n     * Manually update feature flag values without making a network request.\n     *\n     * This is useful when you have feature flag values from an external source\n     * (e.g., server-side evaluation, edge middleware) and want to inject them\n     * into the client SDK.\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * // Replace all flags with server-evaluated values\n     * posthog.updateFlags({\n     *   'my-flag': true,\n     *   'my-experiment': 'variant-a'\n     * })\n     *\n     * // Merge with existing flags (update only specified flags)\n     * posthog.updateFlags(\n     *   { 'my-flag': true },\n     *   undefined,\n     *   { merge: true }\n     * )\n     *\n     * // With payloads\n     * posthog.updateFlags(\n     *   { 'my-flag': true },\n     *   { 'my-flag': { some: 'data' } }\n     * )\n     * ```\n     *\n     * @param flags - An object mapping flag keys to their values (boolean or string variant)\n     * @param payloads - Optional object mapping flag keys to their JSON payloads\n     * @param options - Optional settings. Use `{ merge: true }` to merge with existing flags instead of replacing.\n     * @public\n     */\n    updateFlags(\n        flags: Record<string, boolean | string>,\n        payloads?: Record<string, JsonType>,\n        options?: { merge?: boolean }\n    ): void {\n        this.featureFlags?.updateFlags(flags, payloads, options)\n    }\n\n    /**\n     * Opt the user in or out of an early access feature. [Learn more in the docs](/docs/feature-flags/early-access-feature-management#option-2-custom-implementation)\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * const toggleBeta = (betaKey) => {\n     *   if (activeBetas.some(\n     *     beta => beta.flagKey === betaKey\n     *   )) {\n     *     posthog.updateEarlyAccessFeatureEnrollment(\n     *       betaKey,\n     *       false\n     *     )\n     *     setActiveBetas(\n     *       prevActiveBetas => prevActiveBetas.filter(\n     *         item => item.flagKey !== betaKey\n     *       )\n     *     );\n     *     return\n     *   }\n     *\n     *   posthog.updateEarlyAccessFeatureEnrollment(\n     *     betaKey,\n     *     true\n     *   )\n     *   setInactiveBetas(\n     *     prevInactiveBetas => prevInactiveBetas.filter(\n     *       item => item.flagKey !== betaKey\n     *     )\n     *   );\n     * }\n     *\n     * const registerInterest = (featureKey) => {\n     *   posthog.updateEarlyAccessFeatureEnrollment(\n     *     featureKey,\n     *     true\n     *   )\n     *   // Update UI to show user has registered\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @param {String} key The key of the feature flag to update.\n     * @param {Boolean} isEnrolled Whether the user is enrolled in the feature.\n     * @param {String} [stage] The stage of the feature flag to update.\n     */\n    updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n        this.featureFlags?.updateEarlyAccessFeatureEnrollment(key, isEnrolled, stage)\n    }\n\n    /**\n     * Get the list of early access features. To check enrollment status, use `isFeatureEnabled`. [Learn more in the docs](/docs/feature-flags/early-access-feature-management#option-2-custom-implementation)\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * const posthog = usePostHog()\n     * const activeFlags = useActiveFeatureFlags()\n     *\n     * const [activeBetas, setActiveBetas] = useState([])\n     * const [inactiveBetas, setInactiveBetas] = useState([])\n     * const [comingSoonFeatures, setComingSoonFeatures] = useState([])\n     *\n     * useEffect(() => {\n     *   posthog.getEarlyAccessFeatures((features) => {\n     *     // Filter features by stage\n     *     const betaFeatures = features.filter(feature => feature.stage === 'beta')\n     *     const conceptFeatures = features.filter(feature => feature.stage === 'concept')\n     *\n     *     setComingSoonFeatures(conceptFeatures)\n     *\n     *     if (!activeFlags || activeFlags.length === 0) {\n     *       setInactiveBetas(betaFeatures)\n     *       return\n     *     }\n     *\n     *     const activeBetas = betaFeatures.filter(\n     *             beta => activeFlags.includes(beta.flagKey)\n     *         );\n     *     const inactiveBetas = betaFeatures.filter(\n     *             beta => !activeFlags.includes(beta.flagKey)\n     *         );\n     *     setActiveBetas(activeBetas)\n     *     setInactiveBetas(inactiveBetas)\n     *   }, true, ['concept', 'beta'])\n     * }, [activeFlags])\n     * ```\n     *\n     * @public\n     *\n     * @param {Function} callback The callback function will be called when the early access features are loaded.\n     * @param {Boolean} [force_reload] Whether to force a reload of the early access features.\n     * @param {String[]} [stages] The stages of the early access features to load.\n     */\n    getEarlyAccessFeatures(\n        callback: EarlyAccessFeatureCallback,\n        force_reload = false,\n        stages?: EarlyAccessFeatureStage[]\n    ): void {\n        return this.featureFlags?.getEarlyAccessFeatures(callback, force_reload, stages)\n    }\n\n    /**\n     * Exposes a set of events that PostHog will emit.\n     * e.g. `eventCaptured` is emitted immediately before trying to send an event\n     *\n     * Unlike  `onFeatureFlags` and `onSessionId` these are not called when the\n     * listener is registered, the first callback will be the next event\n     * _after_ registering a listener\n     *\n     * Available events:\n     * - `eventCaptured`: Emitted immediately before trying to send an event\n     * - `featureFlagsReloading`: Emitted when feature flags are being reloaded (e.g. after `identify()`, `group()`, or `reloadFeatureFlags()`)\n     *\n     * {@label Capture}\n     *\n     * @example\n     * ```js\n     * posthog.on('eventCaptured', (event) => {\n     *   console.log(event)\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // Track when feature flags are reloading to show a loading state\n     * posthog.on('featureFlagsReloading', () => {\n     *   console.log('Feature flags are being reloaded...')\n     * })\n     * ```\n     *\n     * @public\n     *\n     * @param {String} event The event to listen for.\n     * @param {Function} cb The callback function to call when the event is emitted.\n     * @returns {Function} A function that can be called to unsubscribe the listener.\n     */\n    on(event: 'eventCaptured' | 'featureFlagsReloading', cb: (...args: any[]) => void): () => void {\n        return this._internalEventEmitter.on(event, cb)\n    }\n\n    /**\n     * Register an event listener that runs when feature flags become available or when they change.\n     * If there are flags, the listener is called immediately in addition to being called on future changes.\n     * Note that this is not called only when we fetch feature flags from the server, but also when they change in the browser.\n     *\n     * {@label Feature flags}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.onFeatureFlags(function(featureFlags, featureFlagsVariants, { errorsLoading }) {\n     *     // do something\n     * })\n     * ```\n     *\n     * @param callback - The callback function will be called once the feature flags are ready or when they are updated.\n     *                   It'll return a list of feature flags enabled for the user, the variants,\n     *                   and also a context object indicating whether we succeeded to fetch the flags or not.\n     * @returns A function that can be called to unsubscribe the listener. Used by `useEffect` when the component unmounts.\n     */\n    onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n        if (!this.featureFlags) {\n            callback([], {}, { errorsLoading: true })\n            return () => {}\n        }\n        return this.featureFlags.onFeatureFlags(callback)\n    }\n\n    /**\n     * Register an event listener that runs when surveys are loaded.\n     *\n     * Callback parameters:\n     * - surveys: Survey[]: An array containing all survey objects fetched from PostHog using the getSurveys method\n     * - context: { isLoaded: boolean, error?: string }: An object indicating if the surveys were loaded successfully\n     *\n     * {@label Surveys}\n     *\n     * @example\n     * ```js\n     * posthog.onSurveysLoaded((surveys, context) => { // do something })\n     * ```\n     *\n     *\n     * @param {Function} callback The callback function will be called when surveys are loaded or updated.\n     * @returns {Function} A function that can be called to unsubscribe the listener.\n     */\n    onSurveysLoaded(callback: SurveyCallback): () => void {\n        if (!this.surveys) {\n            callback([], { isLoaded: false, error: SURVEYS_NOT_AVAILABLE })\n            return () => {}\n        }\n        return this.surveys.onSurveysLoaded(callback)\n    }\n\n    /**\n     * Register an event listener that runs whenever the session id or window id change.\n     * If there is already a session id, the listener is called immediately in addition to being called on future changes.\n     *\n     * Can be used, for example, to sync the PostHog session id with a backend session.\n     *\n     * {@label Identification}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.onSessionId(function(sessionId, windowId) { // do something })\n     * ```\n     *\n     * @param {Function} [callback] The callback function will be called once a session id is present or when it or the window id are updated.\n     * @returns {Function} A function that can be called to unsubscribe the listener. E.g. Used by `useEffect` when the component unmounts.\n     */\n    onSessionId(callback: SessionIdChangedCallback): () => void {\n        return this.sessionManager?.onSessionId(callback) ?? (() => {})\n    }\n\n    /**\n     * Get list of all surveys.\n     *\n     * {@label Surveys}\n     *\n     * @example\n     * ```js\n     * function callback(surveys, context) {\n     *   // do something\n     * }\n     *\n     * posthog.getSurveys(callback, false)\n     * ```\n     *\n     * @public\n     *\n     * @param {Function} [callback] Function that receives the array of surveys\n     * @param {Boolean} [forceReload] Optional boolean to force an API call for updated surveys\n     */\n    getSurveys(callback: SurveyCallback, forceReload = false): void {\n        this.surveys\n            ? this.surveys.getSurveys(callback, forceReload)\n            : callback([], { isLoaded: false, error: SURVEYS_NOT_AVAILABLE })\n    }\n\n    /**\n     * Get surveys that should be enabled for the current user. See [fetching surveys documentation](/docs/surveys/implementing-custom-surveys#fetching-surveys-manually) for more details.\n     *\n     * {@label Surveys}\n     *\n     * @example\n     * ```js\n     * posthog.getActiveMatchingSurveys((surveys) => {\n     *      // do something\n     * })\n     * ```\n     *\n     * @public\n     *\n     * @param {Function} [callback] The callback function will be called when the surveys are loaded or updated.\n     * @param {Boolean} [forceReload] Whether to force a reload of the surveys.\n     */\n    getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false): void {\n        this.surveys\n            ? this.surveys.getActiveMatchingSurveys(callback, forceReload)\n            : callback([], { isLoaded: false, error: SURVEYS_NOT_AVAILABLE })\n    }\n\n    /**\n     * Although we recommend using popover surveys and display conditions,\n     * if you want to show surveys programmatically without setting up all\n     * the extra logic needed for API surveys, you can render surveys\n     * programmatically with the renderSurvey method.\n     *\n     * This takes a survey ID and an HTML selector to render an unstyled survey.\n     *\n     * {@label Surveys}\n     *\n     * @example\n     * ```js\n     * posthog.renderSurvey(coolSurveyID, '#survey-container')\n     * ```\n     *\n     * @deprecated Use displaySurvey instead - it's more complete and also supports popover surveys.\n     *\n     * @public\n     *\n     * @param {String} surveyId The ID of the survey to render.\n     * @param {String} selector The selector of the HTML element to render the survey on.\n     */\n    renderSurvey(surveyId: string, selector: string): void {\n        this.surveys?.renderSurvey(surveyId, selector)\n    }\n\n    /**\n     * Display a survey programmatically as either a popover or inline element.\n     *\n     * @param {string} surveyId - The survey ID to display\n     * @param {DisplaySurveyOptions} options - Display configuration\n     *\n     * @example\n     * ```js\n     * // Display as popover (respects all conditions defined in the dashboard)\n     * posthog.displaySurvey('survey-id-123')\n     * ```\n     *\n     * @example\n     * ```js\n     * // Display inline in a specific element\n     * posthog.displaySurvey('survey-id-123', {\n     *   displayType: DisplaySurveyType.Inline,\n     *   selector: '#survey-container'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // Force display ignoring conditions and delays\n     * posthog.displaySurvey('survey-id-123', {\n     *   displayType: DisplaySurveyType.Popover,\n     *   ignoreConditions: true,\n     *   ignoreDelay: true\n     * })\n     * ```\n     *\n     * {@label Surveys}\n     */\n    displaySurvey(surveyId: string, options: DisplaySurveyOptions = DEFAULT_DISPLAY_SURVEY_OPTIONS): void {\n        this.surveys?.displaySurvey(surveyId, options)\n    }\n\n    /**\n     * Cancels a pending survey that is waiting to be displayed (e.g., due to a popup delay).\n     *\n     * {@label Surveys}\n     */\n    cancelPendingSurvey(surveyId: string): void {\n        this.surveys?.cancelPendingSurvey(surveyId)\n    }\n\n    /**\n     * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n     * This method is deprecated because it's synchronous and won't return the correct result if surveys are not loaded.\n     * Use `canRenderSurveyAsync` instead.\n     *\n     * {@label Surveys}\n     *\n     * @public\n     * @deprecated\n     *\n     * @param surveyId The ID of the survey to check.\n     * @returns A SurveyRenderReason object indicating if the survey can be rendered.\n     */\n    canRenderSurvey(surveyId: string): SurveyRenderReason | null {\n        return (\n            this.surveys?.canRenderSurvey(surveyId) ?? {\n                visible: false,\n                disabledReason: SURVEYS_NOT_AVAILABLE,\n            }\n        )\n    }\n\n    /**\n     * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n     *\n     * {@label Surveys}\n     *\n     * @example\n     * ```js\n     * posthog.canRenderSurveyAsync(surveyId).then((result) => {\n     *     if (result.visible) {\n     *         // Survey can be rendered\n     *         console.log('Survey can be rendered')\n     *     } else {\n     *         // Survey cannot be rendered\n     *         console.log('Survey cannot be rendered:', result.disabledReason)\n     *     }\n     * })\n     * ```\n     *\n     * @public\n     *\n     * @param surveyId The ID of the survey to check.\n     * @param forceReload If true, the survey will be reloaded from the server, Default: false\n     * @returns A SurveyRenderReason object indicating if the survey can be rendered.\n     */\n    canRenderSurveyAsync(surveyId: string, forceReload = false): Promise<SurveyRenderReason> {\n        return (\n            this.surveys?.canRenderSurveyAsync(surveyId, forceReload) ??\n            // eslint-disable-next-line compat/compat\n            Promise.resolve({ visible: false, disabledReason: SURVEYS_NOT_AVAILABLE })\n        )\n    }\n\n    private _validateIdentifyId(id: string | undefined): id is string {\n        if (!id || isEmptyString(id)) {\n            logger.critical('Unique user id has not been set in posthog.identify')\n            return false\n        }\n        if (id === COOKIELESS_SENTINEL_VALUE) {\n            logger.critical(\n                `The string \"${id}\" was set in posthog.identify which indicates an error. This ID is only used as a sentinel value.`\n            )\n            return false\n        }\n        if (isDistinctIdStringLike(id) || ['undefined', 'null'].includes(id.toLowerCase())) {\n            logger.critical(\n                `The string \"${id}\" was set in posthog.identify which indicates an error. This ID should be unique to the user and not a hardcoded string.`\n            )\n            return false\n        }\n        return true\n    }\n\n    /**\n     * Associates a user with a unique identifier instead of an auto-generated ID.\n     * Learn more about [identifying users](/docs/product-analytics/identify)\n     *\n     * {@label Identification}\n     *\n     * @remarks\n     * By default, PostHog assigns each user a randomly generated `distinct_id`. Use this method to\n     * replace that ID with your own unique identifier (like a user ID from your database).\n     *\n     * @example\n     * ```js\n     * // basic identification\n     * posthog.identify('user_12345')\n     * ```\n     *\n     * @example\n     * ```js\n     * // identify with user properties\n     * posthog.identify('user_12345', {\n     *     email: 'user@example.com',\n     *     plan: 'premium'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // identify with set and set_once properties\n     * posthog.identify('user_12345',\n     *     { last_login: new Date() },  // updates every time\n     *     { signup_date: new Date() }  // sets only once\n     * )\n     * ```\n     *\n     * @public\n     *\n     * @param {String} [new_distinct_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n     * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user. Note: For feature flag evaluations, if the same key is present in the userPropertiesToSetOnce,\n     *  it will be overwritten by the value in userPropertiesToSet.\n     * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n     */\n    identify(new_distinct_id?: string, userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n        if (!this.__loaded || !this.persistence) {\n            return logger.uninitializedWarning('posthog.identify')\n        }\n        if (isNumber(new_distinct_id)) {\n            new_distinct_id = (new_distinct_id as number).toString()\n            logger.warn(\n                'The first argument to posthog.identify was a number, but it should be a string. It has been converted to a string.'\n            )\n        }\n\n        if (!this._validateIdentifyId(new_distinct_id)) {\n            return\n        }\n\n        if (!this._requirePersonProcessing('posthog.identify')) {\n            return\n        }\n\n        const previous_distinct_id = this.get_distinct_id()\n        this.register({ $user_id: new_distinct_id })\n\n        if (!this.get_property(DEVICE_ID)) {\n            // The persisted distinct id might not actually be a device id at all\n            // it might be a distinct id of the user from before\n            const device_id = previous_distinct_id\n            this.register_once(\n                {\n                    $had_persisted_distinct_id: true,\n                    $device_id: device_id,\n                },\n                ''\n            )\n        }\n\n        // if the previous distinct id had an alias stored, then we clear it\n        if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n            this.unregister(ALIAS_ID_KEY)\n            this.register({ distinct_id: new_distinct_id })\n        }\n\n        const isKnownAnonymous =\n            (this.persistence.get_property(USER_STATE) || USER_STATE_ANONYMOUS) === USER_STATE_ANONYMOUS\n\n        // send an $identify event any time the distinct_id is changing and the old ID is an anonymous ID\n        // - logic on the server will determine whether or not to do anything with it.\n        if (new_distinct_id !== previous_distinct_id && isKnownAnonymous) {\n            this.persistence.set_property(USER_STATE, USER_STATE_IDENTIFIED)\n\n            // Update current user properties\n            this.setPersonPropertiesForFlags(\n                { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} },\n                false\n            )\n\n            this.capture(\n                EVENT_IDENTIFY,\n                {\n                    distinct_id: new_distinct_id,\n                    $anon_distinct_id: previous_distinct_id,\n                },\n                { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} }\n            )\n\n            this._cachedPersonProperties = getPersonPropertiesHash(\n                new_distinct_id,\n                userPropertiesToSet,\n                userPropertiesToSetOnce\n            )\n\n            // let the reload feature flag request know to send this previous distinct id\n            // for flag consistency\n            this.featureFlags?.setAnonymousDistinctId(previous_distinct_id)\n        } else if (userPropertiesToSet || userPropertiesToSetOnce) {\n            // If the distinct_id is not changing, but we have user properties to set, we can check if they have changed\n            // and if so, send a $set event\n\n            this.setPersonProperties(userPropertiesToSet, userPropertiesToSetOnce)\n        }\n\n        // Reload active feature flags if the user identity changes.\n        // Note we don't reload this on property changes as these get processed async\n        if (new_distinct_id !== previous_distinct_id) {\n            this.reloadFeatureFlags()\n            // also clear any stored flag calls\n            this.unregister(FLAG_CALL_REPORTED)\n        }\n    }\n\n    /**\n     * Sets properties on the person profile associated with the current `distinct_id`.\n     * Learn more about [identifying users](/docs/product-analytics/identify)\n     *\n     * {@label Identification}\n     *\n     * @remarks\n     * Updates user properties that are stored with the person profile in PostHog.\n     * If `person_profiles` is set to `identified_only` and no profile exists, this will create one.\n     *\n     * @example\n     * ```js\n     * // set user properties\n     * posthog.setPersonProperties({\n     *     email: 'user@example.com',\n     *     plan: 'premium'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // set properties\n     * posthog.setPersonProperties(\n     *     { name: 'Max Hedgehog' },  // $set properties\n     *     { initial_url: '/blog' }   // $set_once properties\n     * )\n     * ```\n     *\n     * @public\n     *\n     * @param {Object} [userPropertiesToSet] Optional: An associative array of properties to store about the user. Note: For feature flag evaluations, if the same key is present in the userPropertiesToSetOnce,\n     *  it will be overwritten by the value in userPropertiesToSet.\n     * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.\n     */\n    setPersonProperties(userPropertiesToSet?: Properties, userPropertiesToSetOnce?: Properties): void {\n        if (!userPropertiesToSet && !userPropertiesToSetOnce) {\n            return\n        }\n\n        if (!this._requirePersonProcessing('posthog.setPersonProperties')) {\n            return\n        }\n\n        const hash = getPersonPropertiesHash(this.get_distinct_id(), userPropertiesToSet, userPropertiesToSetOnce)\n\n        // if exactly this $set call has been sent before, don't send it again - determine based on hash of properties\n        if (this._cachedPersonProperties === hash) {\n            logger.info('A duplicate setPersonProperties call was made with the same properties. It has been ignored.')\n            return\n        }\n\n        // Update current user properties\n        this.setPersonPropertiesForFlags(\n            { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} },\n            true\n        )\n\n        this.capture('$set', { $set: userPropertiesToSet || {}, $set_once: userPropertiesToSetOnce || {} })\n\n        this._cachedPersonProperties = hash\n    }\n\n    /**\n     * Associates the user with a group for group-based analytics.\n     * Learn more about [groups](/docs/product-analytics/group-analytics)\n     *\n     * {@label Identification}\n     *\n     * @remarks\n     * Groups allow you to analyze users collectively (e.g., by organization, team, or account).\n     * This sets the group association for all subsequent events and reloads feature flags.\n     *\n     * @example\n     * ```js\n     * // associate user with an organization\n     * posthog.group('organization', 'org_12345', {\n     *     name: 'Acme Corp',\n     *     plan: 'enterprise'\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // associate with multiple group types\n     * posthog.group('organization', 'org_12345')\n     * posthog.group('team', 'team_67890')\n     * ```\n     *\n     * @public\n     *\n     * @param {String} groupType Group type (example: 'organization')\n     * @param {String} groupKey Group key (example: 'org::5')\n     * @param {Object} groupPropertiesToSet Optional properties to set for group\n     */\n    group(groupType: string, groupKey: string, groupPropertiesToSet?: Properties): void {\n        if (!groupType || !groupKey) {\n            logger.error('posthog.group requires a group type and group key')\n            return\n        }\n\n        const existingGroups = this.getGroups()\n        const isNewGroup = existingGroups[groupType] !== groupKey\n\n        // if group key changes, remove stored group properties\n        if (isNewGroup) {\n            this.resetGroupPropertiesForFlags(groupType)\n        }\n\n        this.register({ $groups: { ...existingGroups, [groupType]: groupKey } })\n\n        // Send $groupidentify when the group is new/changed OR when properties\n        // are provided. Skip only when the group already exists with the same\n        // key and no new properties are being set.\n        if (isNewGroup || groupPropertiesToSet) {\n            const groupIdentifyProperties: Properties = {\n                $group_type: groupType,\n                $group_key: groupKey,\n            }\n            if (groupPropertiesToSet) {\n                groupIdentifyProperties.$group_set = groupPropertiesToSet\n            }\n            this.capture(EVENT_GROUPIDENTIFY, groupIdentifyProperties)\n        }\n\n        if (groupPropertiesToSet) {\n            this.setGroupPropertiesForFlags({ [groupType]: groupPropertiesToSet })\n        }\n\n        // If groups change and no properties change, reload feature flags.\n        // The property change reload case is handled in setGroupPropertiesForFlags.\n        if (isNewGroup && !groupPropertiesToSet) {\n            this.reloadFeatureFlags()\n        }\n    }\n\n    /**\n     * Resets only the group properties of the user currently logged in.\n     * Learn more about [groups](/docs/product-analytics/group-analytics)\n     *\n     * {@label Identification}\n     *\n     * @example\n     * ```js\n     * posthog.resetGroups()\n     * ```\n     *\n     * @public\n     */\n    resetGroups(): void {\n        this.register({ $groups: {} })\n        this.resetGroupPropertiesForFlags()\n\n        // If groups changed, reload feature flags.\n        this.reloadFeatureFlags()\n    }\n\n    /**\n     * Sometimes, you might want to evaluate feature flags using properties that haven't been ingested yet,\n     * or were set incorrectly earlier. You can do so by setting properties the flag depends on with these calls:\n     *\n     * {@label Feature flags}\n     *\n     * @example\n     * ```js\n     * // Set properties\n     * posthog.setPersonPropertiesForFlags({'property1': 'value', property2: 'value2'})\n     * ```\n     *\n     * @example\n     * ```js\n     * // Set properties without reloading\n     * posthog.setPersonPropertiesForFlags({'property1': 'value', property2: 'value2'}, false)\n     * ```\n     *\n     * @public\n     *\n     * @param {Object} properties The properties to override.\n     * @param {Boolean} [reloadFeatureFlags] Whether to reload feature flags.\n     */\n    setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n        this.featureFlags?.setPersonPropertiesForFlags(properties, reloadFeatureFlags)\n    }\n\n    /**\n     * Resets the person properties for feature flags.\n     *\n     * {@label Feature flags}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.resetPersonPropertiesForFlags()\n     * ```\n     */\n    resetPersonPropertiesForFlags(): void {\n        this.featureFlags?.resetPersonPropertiesForFlags()\n    }\n\n    /**\n     * Set override group properties for feature flags.\n     * This is used when dealing with new groups / where you don't want to wait for ingestion\n     * to update properties.\n     * Takes in an object, the key of which is the group type.\n     *\n     * {@label Feature flags}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Set properties with reload\n     * posthog.setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n     * ```\n     *\n     * @example\n     * ```js\n     * // Set properties without reload\n     * posthog.setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } }, false)\n     * ```\n     *\n     * @param {Object} properties The properties to override, the key of which is the group type.\n     * @param {Boolean} [reloadFeatureFlags] Whether to reload feature flags.\n     */\n    setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n        if (!this._requirePersonProcessing('posthog.setGroupPropertiesForFlags')) {\n            return\n        }\n        this.featureFlags?.setGroupPropertiesForFlags(properties, reloadFeatureFlags)\n    }\n\n    /**\n     * Resets the group properties for feature flags.\n     *\n     * {@label Feature flags}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.resetGroupPropertiesForFlags()\n     * ```\n     */\n    resetGroupPropertiesForFlags(group_type?: string): void {\n        this.featureFlags?.resetGroupPropertiesForFlags(group_type)\n    }\n\n    /**\n     * Resets all user data and starts a fresh session.\n     *\n     * ⚠️ **Warning**: Only call this when a user logs out. Calling at the wrong time can cause split sessions.\n     *\n     * This clears:\n     * - Session ID and super properties\n     * - User identification (sets new random distinct_id)\n     * - Cached data and consent settings\n     *\n     * {@label Identification}\n     * @example\n     * ```js\n     * // reset on user logout\n     * function logout() {\n     *     posthog.reset()\n     *     // redirect to login page\n     * }\n     * ```\n     *\n     * @example\n     * ```js\n     * // reset and generate new device ID\n     * posthog.reset(true)  // also resets device_id\n     * ```\n     *\n     * @public\n     */\n    reset(reset_device_id?: boolean): void {\n        logger.info('reset')\n        if (!this.__loaded) {\n            return logger.uninitializedWarning('posthog.reset')\n        }\n        const device_id = this.get_property(DEVICE_ID)\n        this.consent.reset()\n        this.persistence?.clear()\n        this.sessionPersistence?.clear()\n        this.surveys?.reset()\n        // Stop the refresh interval before resetting flags — featureFlags.reset() clears\n        // the debouncer, so if the order were reversed a pending refresh could fire after reset.\n        this._remoteConfigLoader?.stop()\n        this.featureFlags?.reset()\n        this.conversations?.reset()\n        this.persistence?.set_property(USER_STATE, USER_STATE_ANONYMOUS)\n        this.sessionManager?.resetSessionId()\n        this._cachedPersonProperties = null\n        if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n            this.register_once(\n                {\n                    distinct_id: COOKIELESS_SENTINEL_VALUE,\n                    $device_id: null,\n                },\n                ''\n            )\n        } else {\n            const uuid = this.config.get_device_id(uuidv7())\n            this.register_once(\n                {\n                    distinct_id: uuid,\n                    $device_id: reset_device_id ? uuid : device_id,\n                },\n                ''\n            )\n        }\n\n        this.register(\n            {\n                $last_posthog_reset: new Date().toISOString(),\n            },\n            1\n        )\n\n        // Clear HMAC identity verification fields\n        delete this.config.identity_distinct_id\n        delete this.config.identity_hash\n\n        // Reload feature flags for the new anonymous user, just like identify()\n        // does when the distinct_id changes.\n        this.reloadFeatureFlags()\n    }\n\n    /**\n     * Set HMAC-based identity verification.\n     *\n     * @remarks\n     * When set, products like conversations use server-verified identity\n     * (distinct_id + HMAC hash) instead of anonymous session identifiers.\n     * The hash should be computed server-side as HMAC-SHA256 of the\n     * distinct_id using the project's API secret.\n     *\n     * @param distinctId - The verified user distinct_id\n     * @param hash - HMAC-SHA256 of distinctId using the project API secret\n     *\n     * @example\n     * ```js\n     * posthog.setIdentity('user_123', 'a1b2c3d4e5f6...')\n     * ```\n     *\n     * @public\n     */\n    setIdentity(distinctId: string, hash: string): void {\n        this.config.identity_distinct_id = distinctId\n        this.config.identity_hash = hash\n        this.alias(distinctId)\n        this.conversations?._onIdentityChanged()\n    }\n\n    /**\n     * Clear HMAC-based identity verification, reverting to anonymous mode.\n     *\n     * @example\n     * ```js\n     * posthog.clearIdentity()\n     * ```\n     *\n     * @public\n     */\n    clearIdentity(): void {\n        delete this.config.identity_distinct_id\n        delete this.config.identity_hash\n        this.conversations?._onIdentityCleared()\n    }\n\n    /**\n     * Returns the current distinct ID for the user.\n     *\n     * @remarks\n     * This is either the auto-generated ID or the ID set via `identify()`.\n     * The distinct ID is used to associate events with users in PostHog.\n     *\n     * {@label Identification}\n     *\n     * @example\n     * ```js\n     * // get the current user ID\n     * const userId = posthog.get_distinct_id()\n     * console.log('Current user:', userId)\n     * ```\n     *\n     * @example\n     * ```js\n     * // use in loaded callback\n     * posthog.init('token', {\n     *     loaded: (posthog) => {\n     *         const id = posthog.get_distinct_id()\n     *         // use the ID\n     *     }\n     * })\n     * ```\n     *\n     * @public\n     *\n     * @returns The current distinct ID\n     */\n    get_distinct_id(): string {\n        return this.get_property('distinct_id')\n    }\n\n    /**\n     * Returns the current groups.\n     *\n     * {@label Identification}\n     *\n     * @public\n     *\n     * @returns The current groups\n     */\n    getGroups(): Record<string, any> {\n        return this.get_property('$groups') || {}\n    }\n\n    /**\n     * Returns the current session_id.\n     *\n     * @remarks\n     * This should only be used for informative purposes.\n     * Any actual internal use case for the session_id should be handled by the sessionManager.\n     *\n     * @public\n     *\n     * @returns The stored session ID for the current session. This may be an empty string if the client is not yet fully initialized.\n     */\n    get_session_id(): string {\n        return this.sessionManager?.checkAndGetSessionAndWindowId(true).sessionId ?? ''\n    }\n\n    /**\n     * Returns the Replay url for the current session.\n     *\n     * {@label Session replay}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // basic usage\n     * posthog.get_session_replay_url()\n     *\n     * @example\n     * ```js\n     * // timestamp\n     * posthog.get_session_replay_url({ withTimestamp: true })\n     * ```\n     *\n     * @example\n     * ```js\n     * // timestamp and lookback\n     * posthog.get_session_replay_url({\n     *   withTimestamp: true,\n     *   timestampLookBack: 30 // look back 30 seconds\n     * })\n     * ```\n     *\n     * @param options Options for the url\n     * @param options.withTimestamp Whether to include the timestamp in the url (defaults to false)\n     * @param options.timestampLookBack How many seconds to look back for the timestamp (defaults to 10)\n     */\n    get_session_replay_url(options?: { withTimestamp?: boolean; timestampLookBack?: number }): string {\n        if (!this.sessionManager) {\n            return ''\n        }\n        const { sessionId, sessionStartTimestamp } = this.sessionManager.checkAndGetSessionAndWindowId(true)\n        let url = this.requestRouter.endpointFor('ui', `/project/${this.config.token}/replay/${sessionId}`)\n        if (options?.withTimestamp && sessionStartTimestamp) {\n            const LOOK_BACK = options.timestampLookBack ?? 10\n            if (!sessionStartTimestamp) {\n                return url\n            }\n            const recordingStartTime = Math.max(\n                Math.floor((new Date().getTime() - sessionStartTimestamp) / 1000) - LOOK_BACK,\n                0\n            )\n            url += `?t=${recordingStartTime}`\n        }\n\n        return url\n    }\n\n    /**\n     * Creates an alias linking two distinct user identifiers. Learn more about [identifying users](/docs/product-analytics/identify)\n     *\n     * {@label Identification}\n     *\n     * @remarks\n     * PostHog will use this to link two distinct_ids going forward (not retroactively).\n     * Call this when a user signs up to connect their anonymous session with their account.\n     *\n     *\n     * @example\n     * ```js\n     * // link anonymous user to account on signup\n     * posthog.alias('user_12345')\n     * ```\n     *\n     * @example\n     * ```js\n     * // explicit alias with original ID\n     * posthog.alias('user_12345', 'anonymous_abc123')\n     * ```\n     *\n     * @public\n     *\n     * @param {String} alias A unique identifier that you want to use for this user in the future.\n     * @param {String} [original] The current identifier being used for this user.\n     */\n    alias(alias: string, original?: string): CaptureResult | void | number {\n        // If the $people_distinct_id key exists in persistence, there has been a previous\n        // posthog.people.identify() call made for this user. It is VERY BAD to make an alias with\n        // this ID, as it will duplicate users.\n        if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n            logger.critical('Attempting to create alias for existing People user - aborting.')\n            return -2\n        }\n        if (!this._requirePersonProcessing('posthog.alias')) {\n            return\n        }\n\n        if (isUndefined(original)) {\n            original = this.get_distinct_id()\n        }\n        if (alias !== original) {\n            this._register_single(ALIAS_ID_KEY, alias)\n            return this.capture('$create_alias', { alias: alias, distinct_id: original })\n        } else {\n            logger.warn('alias matches current distinct_id - skipping api call.')\n            this.identify(alias)\n            return -1\n        }\n    }\n\n    /**\n     * Updates the configuration of the PostHog instance.\n     *\n     * {@label Initialization}\n     *\n     * @public\n     *\n     * @param {Partial<PostHogConfig>} config A dictionary of new configuration values to update\n     */\n    set_config(config: Partial<PostHogConfig>): void {\n        const oldConfig = { ...this.config }\n        if (isObject(config)) {\n            extend(this.config, configRenames(config))\n\n            const isPersistenceDisabled = this._is_persistence_disabled()\n            this.persistence?.update_config(this.config, oldConfig, isPersistenceDisabled)\n            this.sessionPersistence =\n                this.config.persistence === 'sessionStorage' || this.config.persistence === 'memory'\n                    ? this.persistence\n                    : new PostHogPersistence({ ...this.config, persistence: 'sessionStorage' }, isPersistenceDisabled)\n\n            const debugConfigFromLocalStorage = this._checkLocalStorageForDebug(this.config.debug)\n            if (isBoolean(debugConfigFromLocalStorage)) {\n                this.config.debug = debugConfigFromLocalStorage\n            }\n\n            if (isBoolean(this.config.debug)) {\n                if (this.config.debug) {\n                    Config.DEBUG = true\n                    localStore._is_supported() && localStore._set('ph_debug', true)\n                    logger.info('set_config', {\n                        config,\n                        oldConfig,\n                        newConfig: { ...this.config },\n                    })\n                } else {\n                    Config.DEBUG = false\n                    localStore._is_supported() && localStore._remove('ph_debug')\n                }\n            }\n\n            this.exceptionObserver?.onConfigChange()\n            this.exceptions?.onConfigChange()\n\n            this.sessionRecording?.startIfEnabledOrStop()\n            this.autocapture?.startIfEnabled()\n            this.heatmaps?.startIfEnabled()\n            this.exceptionObserver?.startIfEnabledOrStop()\n            this.deadClicksAutocapture?.startIfEnabledOrStop()\n            this.surveys?.loadIfEnabled()\n            this._sync_opt_out_with_persistence()\n            this.externalIntegrations?.startIfEnabledOrStop()\n        }\n    }\n\n    /**\n     * @internal\n     * Allows wrapper SDKs (e.g. posthog-flutter, posthog-react-native) to override the\n     * `$lib` and `$lib_version` properties sent with every event.\n     *\n     * This is not a public API and may change without notice.\n     */\n    _overrideSDKInfo(sdkName: string, sdkVersion: string): void {\n        Config.LIB_NAME = sdkName\n        Config.LIB_VERSION = sdkVersion\n    }\n\n    /**\n     * turns session recording on, and updates the config option `disable_session_recording` to false\n     *\n     * {@label Session replay}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Start and ignore controls\n     * posthog.startSessionRecording(true)\n     * ```\n     *\n     * @example\n     * ```js\n     * // Start and override controls\n     * posthog.startSessionRecording({\n     *   // you don't have to send all of these\n     *   sampling: true || false,\n     *   linked_flag: true || false,\n     *   url_trigger: true || false,\n     *   event_trigger: true || false\n     * })\n     * ```\n     *\n     * @param override.sampling - optional boolean to override the default sampling behavior - ensures the next session recording to start will not be skipped by sampling config.\n     * @param override.linked_flag - optional boolean to override the default linked_flag behavior - ensures the next session recording to start will not be skipped by linked_flag config.\n     * @param override.url_trigger - optional boolean to override the default url_trigger behavior - ensures the next session recording to start will not be skipped by url_trigger config.\n     * @param override.event_trigger - optional boolean to override the default event_trigger behavior - ensures the next session recording to start will not be skipped by event_trigger config.\n     * @param override - optional boolean to override the default sampling behavior - ensures the next session recording to start will not be skipped by sampling or linked_flag config. `true` is shorthand for { sampling: true, linked_flag: true }\n     */\n    startSessionRecording(\n        override?: { sampling?: boolean; linked_flag?: boolean; url_trigger?: true; event_trigger?: true } | true\n    ): void {\n        const overrideAll = override === true\n        const overrideConfig: OverrideConfig = {\n            sampling: overrideAll || !!override?.sampling,\n            linked_flag: overrideAll || !!override?.linked_flag,\n            url_trigger: overrideAll || !!override?.url_trigger,\n            event_trigger: overrideAll || !!override?.event_trigger,\n        }\n\n        if (Object.values(overrideConfig).some(Boolean)) {\n            // allow the session id check to rotate session id if necessary\n            this.sessionManager?.checkAndGetSessionAndWindowId()\n\n            if (overrideConfig.sampling) {\n                this.sessionRecording?.overrideSampling()\n            }\n\n            if (overrideConfig.linked_flag) {\n                this.sessionRecording?.overrideLinkedFlag()\n            }\n\n            if (overrideConfig.url_trigger) {\n                this.sessionRecording?.overrideTrigger('url')\n            }\n\n            if (overrideConfig.event_trigger) {\n                this.sessionRecording?.overrideTrigger('event')\n            }\n        }\n\n        this.set_config({ disable_session_recording: false })\n    }\n\n    /**\n     * turns session recording off, and updates the config option\n     * disable_session_recording to true\n     *\n     * {@label Session replay}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Stop session recording\n     * posthog.stopSessionRecording()\n     * ```\n     */\n    stopSessionRecording(): void {\n        this.set_config({ disable_session_recording: true })\n    }\n\n    /**\n     * returns a boolean indicating whether session recording\n     * is currently running\n     *\n     * {@label Session replay}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Stop session recording if it's running\n     * if (posthog.sessionRecordingStarted()) {\n     *   posthog.stopSessionRecording()\n     * }\n     * ```\n     */\n    sessionRecordingStarted(): boolean {\n        return !!this.sessionRecording?.started\n    }\n\n    /**\n     * Capture a caught exception manually\n     *\n     * {@label Error tracking}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Capture a caught exception\n     * try {\n     *   // something that might throw\n     * } catch (error) {\n     *   posthog.captureException(error)\n     * }\n     * ```\n     *\n     * @example\n     * ```js\n     * // With additional properties\n     * posthog.captureException(error, {\n     *   customProperty: 'value',\n     *   anotherProperty: ['I', 'can be a list'],\n     *   ...\n     * })\n     * ```\n     *\n     * @param {Error} error The error to capture\n     * @param {Object} [additionalProperties] Any additional properties to add to the error event\n     * @returns {CaptureResult} The result of the capture\n     */\n    captureException(error: unknown, additionalProperties?: Properties): CaptureResult | undefined {\n        if (!this.exceptions) return\n\n        const syntheticException = new Error('PostHog syntheticException')\n        const errorToProperties = this.exceptions.buildProperties(error, {\n            handled: true,\n            syntheticException,\n        })\n        return this.exceptions.sendExceptionEvent({\n            ...errorToProperties,\n            ...additionalProperties,\n        })\n    }\n\n    /**\n     * Add a breadcrumb-like step that will be attached to the next captured exception.\n     *\n     * {@label Error tracking}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.addExceptionStep('Checkout button clicked', {\n     *   checkout_id: 'ch_123',\n     * })\n     * ```\n     */\n    addExceptionStep(message: string, properties?: Properties): void {\n        this.exceptions?.addExceptionStep(message, properties)\n    }\n\n    /**\n     * Capture a log entry and send it to the PostHog logs endpoint.\n     *\n     * {@label Logs}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.captureLog({\n     *   body: 'checkout completed',\n     *   level: 'info',\n     *   attributes: { order_id: 'ord_789', amount_cents: 4999 },\n     * })\n     * ```\n     *\n     * @param {CaptureLogOptions} options The log entry options\n     */\n    captureLog(options: CaptureLogOptions): void {\n        this.logs?.captureLog(options)\n    }\n\n    private static _noopLogger = (() => {\n        const noop = () => {}\n        return { trace: noop, debug: noop, info: noop, warn: noop, error: noop, fatal: noop }\n    })()\n\n    /**\n     * Logger with convenience methods for each severity level.\n     *\n     * @example\n     * ```js\n     * posthog.logger.info('checkout completed', { order_id: 'ord_789' })\n     * posthog.logger.error('payment failed', { error_code: 'E001' })\n     * ```\n     */\n    get logger() {\n        return this.logs?.logger ?? PostHog._noopLogger\n    }\n\n    /**\n     * turns exception autocapture on, and updates the config option `capture_exceptions` to the provided config (or `true`)\n     *\n     * {@label Error tracking}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Start with default exception autocapture rules. No-op if already enabled\n     * posthog.startExceptionAutocapture()\n     * ```\n     *\n     * @example\n     * ```js\n     * // Start and override controls\n     * posthog.startExceptionAutocapture({\n     *   // you don't have to send all of these (unincluded values will use the default)\n     *   capture_unhandled_errors: true || false,\n     *   capture_unhandled_rejections: true || false,\n     *   capture_console_errors: true || false\n     * })\n     * ```\n     *\n     * @param config - optional configuration option to control the exception autocapture behavior\n     */\n    startExceptionAutocapture(config?: ExceptionAutoCaptureConfig): void {\n        this.set_config({ capture_exceptions: config ?? true })\n    }\n\n    /**\n     * turns exception autocapture off by updating the config option `capture_exceptions` to `false`\n     *\n     * {@label Error tracking}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * // Stop capturing exceptions automatically\n     * posthog.stopExceptionAutocapture()\n     * ```\n     */\n    stopExceptionAutocapture(): void {\n        this.set_config({ capture_exceptions: false })\n    }\n\n    /**\n     * returns a boolean indicating whether the [toolbar](/docs/toolbar) loaded\n     *\n     * {@label Toolbar}\n     *\n     * @public\n     *\n     * @param toolbarParams\n     * @returns {boolean} Whether the toolbar loaded\n     */\n\n    loadToolbar(params: ToolbarParams): boolean {\n        return this.toolbar?.loadToolbar(params) ?? false\n    }\n\n    /**\n     * Returns the value of a super property. Returns undefined if the property doesn't exist.\n     *\n     * {@label Identification}\n     *\n     * @remarks\n     * get_property() can only be called after the PostHog library has finished loading.\n     * init() has a loaded function available to handle this automatically.\n     *\n     * @example\n     * ```js\n     * // grab value for '$user_id' after the posthog library has loaded\n     * posthog.init('<YOUR PROJECT TOKEN>', {\n     *     loaded: function(posthog) {\n     *         user_id = posthog.get_property('$user_id');\n     *     }\n     * });\n     * ```\n     * @public\n     *\n     * @param {String} property_name The name of the super property you want to retrieve\n     */\n    get_property(property_name: string): Property | undefined {\n        return this.persistence?.props[property_name]\n    }\n\n    /**\n     * Returns the value of the session super property named property_name. If no such\n     * property is set, getSessionProperty() will return the undefined value.\n     *\n     * {@label Identification}\n     *\n     * @public\n     *\n     * @remarks\n     * This is based on browser-level `sessionStorage`, NOT the PostHog session.\n     * getSessionProperty() can only be called after the PostHog library has finished loading.\n     * init() has a loaded function available to handle this automatically.\n     *\n     * @example\n     * ```js\n     * // grab value for 'user_id' after the posthog library has loaded\n     * posthog.init('YOUR PROJECT TOKEN', {\n     *     loaded: function(posthog) {\n     *         user_id = posthog.getSessionProperty('user_id');\n     *     }\n     * });\n     * ```\n     *\n     * @param {String} property_name The name of the session super property you want to retrieve\n     */\n    getSessionProperty(property_name: string): Property | undefined {\n        return this.sessionPersistence?.props[property_name]\n    }\n\n    /**\n     * Returns a string representation of the PostHog instance.\n     *\n     * {@label Initialization}\n     *\n     * @internal\n     */\n    toString(): string {\n        let name = this.config.name ?? PRIMARY_INSTANCE_NAME\n        if (name !== PRIMARY_INSTANCE_NAME) {\n            name = PRIMARY_INSTANCE_NAME + '.' + name\n        }\n        return name\n    }\n\n    _isIdentified(): boolean {\n        return (\n            this.persistence?.get_property(USER_STATE) === USER_STATE_IDENTIFIED ||\n            this.sessionPersistence?.get_property(USER_STATE) === USER_STATE_IDENTIFIED\n        )\n    }\n\n    _hasPersonProcessing(): boolean {\n        return !(\n            this.config.person_profiles === 'never' ||\n            (this.config.person_profiles === PERSON_PROFILES_IDENTIFIED_ONLY &&\n                !this._isIdentified() &&\n                isEmptyObject(this.getGroups()) &&\n                !this.persistence?.props?.[ALIAS_ID_KEY] &&\n                !this.persistence?.props?.[ENABLE_PERSON_PROCESSING])\n        )\n    }\n\n    _shouldCapturePageleave(): boolean {\n        return (\n            this.config.capture_pageleave === true ||\n            (this.config.capture_pageleave === 'if_capture_pageview' &&\n                (this.config.capture_pageview === true || this.config.capture_pageview === 'history_change'))\n        )\n    }\n\n    /**\n     *  Creates a person profile for the current user, if they don't already have one and config.person_profiles is set\n     *  to 'identified_only'. Produces a warning and does not create a profile if config.person_profiles is set to\n     *  'never'. Learn more about [person profiles](/docs/product-analytics/identify)\n     *\n     * {@label Identification}\n     *\n     * @public\n     *\n     * @example\n     * ```js\n     * posthog.createPersonProfile()\n     * ```\n     */\n    createPersonProfile(): void {\n        if (this._hasPersonProcessing()) {\n            // if a person profile already exists, don't send an event when we don't need to\n            return\n        }\n        if (!this._requirePersonProcessing('posthog.createPersonProfile')) {\n            return\n        }\n        // sent a $set event. We don't set any properties here, but attribution props will be added later\n        this.setPersonProperties({}, {})\n    }\n\n    /**\n     * Marks the current user as a test user by setting the `$internal_or_test_user` person property to `true`.\n     * This also enables person processing for the current user.\n     *\n     * This is useful for using in a cohort your internal/test filters for your posthog org.\n     * @see https://posthog.com/tutorials/filter-internal-users\n     * Create a cohort with `$internal_or_test_user` IS SET, and set your internal test filters to be NOT IN that cohort.\n     *\n     * {@label Identification}\n     *\n     * @example\n     * ```js\n     * // Manually mark as test user\n     * posthog.setInternalOrTestUser()\n     *\n     * // Or use internal_or_test_user_hostname config for automatic detection\n     * posthog.init('token', { internal_or_test_user_hostname: 'localhost' })\n     * ```\n     *\n     * @public\n     */\n    setInternalOrTestUser(): void {\n        if (!this._requirePersonProcessing('posthog.setInternalOrTestUser')) {\n            return\n        }\n        this.setPersonProperties({ $internal_or_test_user: true })\n    }\n\n    /**\n     * Enables person processing if possible, returns true if it does so or already enabled, false otherwise\n     *\n     * @param function_name\n     */\n    _requirePersonProcessing(function_name: string): boolean {\n        if (this.config.person_profiles === 'never') {\n            logger.error(\n                function_name + ' was called, but process_person is set to \"never\". This call will be ignored.'\n            )\n            return false\n        }\n        this._register_single(ENABLE_PERSON_PROCESSING, true)\n        return true\n    }\n\n    private _is_persistence_disabled(): boolean {\n        if (this.config.cookieless_mode === 'always') {\n            return true\n        }\n        const isOptedOut = this.consent.isOptedOut()\n        const defaultPersistenceDisabled =\n            this.config.opt_out_persistence_by_default || this.config.cookieless_mode === COOKIELESS_ON_REJECT\n\n        // TRICKY: We want a deterministic state for persistence so that a new pageload has the same persistence\n        return this.config.disable_persistence || (isOptedOut && !!defaultPersistenceDisabled)\n    }\n\n    private _sync_opt_out_with_persistence(): boolean {\n        const persistenceDisabled = this._is_persistence_disabled()\n\n        if (this.persistence?._disabled !== persistenceDisabled) {\n            this.persistence?.set_disabled(persistenceDisabled)\n        }\n        if (this.sessionPersistence?._disabled !== persistenceDisabled) {\n            this.sessionPersistence?.set_disabled(persistenceDisabled)\n        }\n        return persistenceDisabled\n    }\n\n    /**\n     * Opts the user into data capturing and persistence.\n     *\n     * {@label Privacy}\n     *\n     * @remarks\n     * Enables event tracking and data persistence (cookies/localStorage) for this PostHog instance.\n     * By default, captures an `$opt_in` event unless disabled.\n     *\n     * @example\n     * ```js\n     * // simple opt-in\n     * posthog.opt_in_capturing()\n     * ```\n     *\n     * @example\n     * ```js\n     * // opt-in with custom event and properties\n     * posthog.opt_in_capturing({\n     *     captureEventName: 'Privacy Accepted',\n     *     captureProperties: { source: 'banner' }\n     * })\n     * ```\n     *\n     * @example\n     * ```js\n     * // opt-in without capturing event\n     * posthog.opt_in_capturing({\n     *     captureEventName: false\n     * })\n     * ```\n     *\n     * @public\n     *\n     * @param {Object} [config] A dictionary of config options to override\n     * @param {string} [config.capture_event_name=$opt_in] Event name to be used for capturing the opt-in action. Set to `null` or `false` to skip capturing the optin event\n     * @param {Object} [config.capture_properties] Set of properties to be captured along with the opt-in action\n     */\n    opt_in_capturing(options?: {\n        captureEventName?: EventName | null | false /** event name to be used for capturing the opt-in action */\n        captureProperties?: Properties /** set of properties to be captured along with the opt-in action */\n    }): void {\n        if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n            logger.warn(CONSENT_COOKIELESS_WARN)\n            return\n        }\n        if (this._inCookielessMode()) {\n            // If the user was being treated as rejected in on_reject mode (either explicitly opted out, or opted out by default via opt_out_capturing_by_default), then before we can start sending regular non-cookieless events\n            // we need to reset the instance to ensure that there is no leaking of state or data between the cookieless and regular events\n            this.reset(true)\n            this.sessionManager?.destroy()\n            this.pageViewManager?.destroy()\n            this.sessionManager = new SessionIdManager(this)\n            this.pageViewManager = new PageViewManager(this)\n            if (this.persistence) {\n                this.sessionPropsManager = new SessionPropsManager(this, this.sessionManager, this.persistence)\n            }\n            const SessionRecordingClass =\n                this.config.__extensionClasses?.sessionRecording ?? PostHog.__defaultExtensionClasses?.sessionRecording\n            if (SessionRecordingClass) {\n                this.sessionRecording = this._replaceExtension(\n                    this.sessionRecording,\n                    new SessionRecordingClass(this) as SessionRecording\n                )\n                // Replay the cached remote config so the new recorder picks up server-side\n                // settings (enable flag, endpoint, sampling) that arrived while we were\n                // still in cookieless mode and sessionRecording didn't yet exist.\n                if (this._lastRemoteConfig) {\n                    this.sessionRecording?.onRemoteConfig?.(this._lastRemoteConfig)\n                }\n            }\n        }\n\n        this.consent.optInOut(true)\n        this._sync_opt_out_with_persistence()\n\n        // Start queue after opting in\n        this._start_queue_if_opted_in()\n\n        // Restart session recording if it should now be enabled\n        // (this handles the case where opt_out_capturing_by_default or cookieless_mode prevented it from starting)\n        this.sessionRecording?.startIfEnabledOrStop()\n\n        // Reinitialize surveys if we're in cookieless mode and just opted in\n        if (this.config.cookieless_mode == COOKIELESS_ON_REJECT) {\n            this.surveys?.loadIfEnabled()\n        }\n\n        // Don't capture if captureEventName is null or false\n        if (isUndefined(options?.captureEventName) || options?.captureEventName) {\n            this.capture(options?.captureEventName ?? '$opt_in', options?.captureProperties, { send_instantly: true })\n        }\n\n        if (this.config.capture_pageview) {\n            this._captureInitialPageview()\n        }\n    }\n\n    /**\n     * Opts the user out of data capturing and persistence.\n     *\n     * {@label Privacy}\n     *\n     * @remarks\n     * Disables event tracking and data persistence (cookies/localStorage) for this PostHog instance.\n     * If `opt_out_persistence_by_default` is true, SDK persistence will also be disabled.\n     *\n     * @example\n     * ```js\n     * // opt user out (e.g., on privacy settings page)\n     * posthog.opt_out_capturing()\n     * ```\n     *\n     * @public\n     */\n    opt_out_capturing(): void {\n        if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n            logger.warn(CONSENT_COOKIELESS_WARN)\n            return\n        }\n\n        if (this.config.cookieless_mode === COOKIELESS_ON_REJECT && this.consent.isOptedIn()) {\n            // If the user has opted in, we need to reset the instance to ensure that there is no leaking of state or data between the cookieless and regular events\n            this.reset(true)\n        }\n\n        this.consent.optInOut(false)\n        this._sync_opt_out_with_persistence()\n\n        if (this.config.cookieless_mode === COOKIELESS_ON_REJECT) {\n            // If cookieless_mode is COOKIELESS_ON_REJECT, we start capturing events in cookieless mode\n            this.register({\n                distinct_id: COOKIELESS_SENTINEL_VALUE,\n                $device_id: null,\n            })\n            this.sessionManager?.destroy()\n            this.pageViewManager?.destroy()\n            this.sessionManager = undefined\n            this.sessionPropsManager = undefined\n            this.sessionRecording?.stopRecording()\n            this.sessionRecording = undefined\n            this._captureInitialPageview()\n        }\n    }\n\n    /**\n     * Checks if the user has opted into data capturing.\n     *\n     * {@label Privacy}\n     *\n     * @remarks\n     * Returns the current consent status for event tracking and data persistence.\n     *\n     * @example\n     * ```js\n     * if (posthog.has_opted_in_capturing()) {\n     *     // show analytics features\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @returns {boolean} current opt-in status\n     */\n    has_opted_in_capturing(): boolean {\n        return this.consent.isOptedIn()\n    }\n\n    /**\n     * Checks if the user has opted out of data capturing.\n     *\n     * {@label Privacy}\n     *\n     * @remarks\n     * Returns the current consent status for event tracking and data persistence.\n     *\n     * @example\n     * ```js\n     * if (posthog.has_opted_out_capturing()) {\n     *     // disable analytics features\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @returns {boolean} current opt-out status\n     */\n    has_opted_out_capturing(): boolean {\n        return this.consent.isOptedOut()\n    }\n\n    /**\n     * Returns the explicit consent status of the user.\n     *\n     * @remarks\n     * This can be used to check if the user has explicitly opted in or out of data capturing, or neither. This does not\n     * take the default config options into account, only whether the user has made an explicit choice, so this can be\n     * used to determine whether to show an initial cookie banner or not.\n     *\n     * @example\n     * ```js\n     * const consentStatus = posthog.get_explicit_consent_status()\n     * if (consentStatus === \"granted\") {\n     *     // user has explicitly opted in\n     * } else if (consentStatus === \"denied\") {\n     *     // user has explicitly opted out\n     * } else if (consentStatus === \"pending\"){\n     *     // user has not made a choice, show consent banner\n     * }\n     * ```\n     *\n     * @public\n     *\n     * @returns {boolean | null} current explicit consent status\n     */\n    get_explicit_consent_status(): 'granted' | 'denied' | 'pending' {\n        const consent = this.consent.consent\n        return consent === ConsentStatus.GRANTED ? 'granted' : consent === ConsentStatus.DENIED ? 'denied' : 'pending'\n    }\n\n    /**\n     * Checks whether the PostHog library is currently capturing events.\n     *\n     * Usually this means that the user has not opted out of capturing, but the exact behaviour can be controlled by\n     * some config options.\n     *\n     * Additionally, if the cookieless_mode is set to `'on_reject'`, we will capture events in cookieless mode if the\n     * user has opted out or been defaulted to opt-out.\n     *\n     * {@label Privacy}\n     *\n     * @see {PostHogConfig.cookieless_mode}\n     * @see {PostHogConfig.opt_out_persistence_by_default}\n     * @see {PostHogConfig.respect_dnt}\n     *\n     * @returns {boolean} whether the posthog library is capturing events\n     */\n    is_capturing(): boolean {\n        if (this.config.cookieless_mode === COOKIELESS_ALWAYS) {\n            return true\n        }\n        if (this.config.cookieless_mode === COOKIELESS_ON_REJECT) {\n            return this.consent.isRejected() || this.consent.isOptedIn()\n        } else {\n            return !this.has_opted_out_capturing()\n        }\n    }\n\n    /**\n     * Clear the user's opt in/out status of data capturing and cookies/localstorage for this PostHog instance\n     *\n     * {@label Privacy}\n     *\n     * @public\n     *\n     */\n    clear_opt_in_out_capturing(): void {\n        this.consent.reset()\n        this._sync_opt_out_with_persistence()\n    }\n\n    _is_bot(): boolean | undefined {\n        if (navigator) {\n            return isLikelyBot(navigator, this.config.custom_blocked_useragents)\n        } else {\n            return undefined\n        }\n    }\n\n    _captureInitialPageview(): void {\n        if (!document) {\n            return\n        }\n\n        // If page is not visible, add a listener to detect when the page becomes visible\n        // and trigger the pageview only then\n        // This is useful to avoid `prerender` calls from Chrome/Wordpress/SPAs\n        // that are not visible to the user\n\n        if (document.visibilityState !== 'visible') {\n            if (!this._visibilityStateListener) {\n                this._visibilityStateListener = this._captureInitialPageview.bind(this)\n                addEventListener(document, DOM_EVENT_VISIBILITYCHANGE, this._visibilityStateListener)\n            }\n\n            return\n        }\n\n        // Extra check here to guarantee we only ever trigger a single `$pageview` event\n        if (!this._initialPageviewCaptured) {\n            this._initialPageviewCaptured = true\n            this.capture(EVENT_PAGEVIEW, { title: document.title }, { send_instantly: true })\n\n            // After we've captured the initial pageview, we can remove the listener\n            if (this._visibilityStateListener) {\n                document.removeEventListener(DOM_EVENT_VISIBILITYCHANGE, this._visibilityStateListener)\n                this._visibilityStateListener = null\n            }\n        }\n    }\n\n    /**\n     * Enables or disables debug mode for detailed logging.\n     *\n     * @remarks\n     * Debug mode logs all PostHog calls to the browser console for troubleshooting.\n     * Can also be enabled by adding `?__posthog_debug=true` to the URL.\n     *\n     * {@label Initialization}\n     *\n     * @example\n     * ```js\n     * // enable debug mode\n     * posthog.debug(true)\n     * ```\n     *\n     * @example\n     * ```js\n     * // disable debug mode\n     * posthog.debug(false)\n     * ```\n     *\n     * @public\n     *\n     * @param {boolean} [debug] If true, will enable debug mode.\n     */\n    debug(debug?: boolean): void {\n        if (debug === false) {\n            window?.console.log(\"You've disabled debug mode.\")\n            this.set_config({ debug: false })\n        } else {\n            window?.console.log(\n                \"You're now in debug mode. All calls to PostHog will be logged in your console.\\nYou can disable this with `posthog.debug(false)`.\"\n            )\n            this.set_config({ debug: true })\n        }\n    }\n\n    /**\n     * Helper method to check if external API calls (flags/decide) should be disabled\n     * Handles migration from old `advanced_disable_decide` to new `advanced_disable_flags`\n     */\n    _shouldDisableFlags(): boolean {\n        // Check if advanced_disable_flags was explicitly set in original config\n        const originalConfig = this._originalUserConfig || {}\n        if ('advanced_disable_flags' in originalConfig) {\n            return !!originalConfig.advanced_disable_flags\n        }\n\n        // Check if advanced_disable_flags was set post-init (different from default false)\n        if (this.config.advanced_disable_flags !== false) {\n            return !!this.config.advanced_disable_flags\n        }\n\n        // Check for post-init changes to advanced_disable_decide\n        if (this.config.advanced_disable_decide === true) {\n            logger.warn(\n                \"Config field 'advanced_disable_decide' is deprecated. Please use 'advanced_disable_flags' instead. \" +\n                    'The old field will be removed in a future major version.'\n            )\n            return true\n        }\n\n        // Fall back to migration logic for original user config\n        return migrateConfigField(originalConfig, 'advanced_disable_flags', 'advanced_disable_decide', false, logger)\n    }\n\n    private _runBeforeSend(data: CaptureResult): CaptureResult | null {\n        if (isNullish(this.config.before_send)) {\n            return data\n        }\n\n        const fns = isArray(this.config.before_send) ? this.config.before_send : [this.config.before_send]\n        let beforeSendResult: CaptureResult | null = data\n        for (const fn of fns) {\n            beforeSendResult = fn(beforeSendResult)\n            if (isNullish(beforeSendResult)) {\n                const logMessage = `Event '${data.event}' was rejected in beforeSend function`\n                if (isKnownUnsafeEditableEvent(data.event)) {\n                    logger.warn(`${logMessage}. This can cause unexpected behavior.`)\n                } else {\n                    logger.info(logMessage)\n                }\n                return null\n            }\n            if (!beforeSendResult.properties || isEmptyObject(beforeSendResult.properties)) {\n                logger.warn(\n                    `Event '${data.event}' has no properties after beforeSend function, this is likely an error.`\n                )\n            }\n        }\n        return beforeSendResult\n    }\n\n    /**\n     * Returns the current page view ID.\n     *\n     * {@label Initialization}\n     *\n     * @public\n     *\n     * @returns {string} The current page view ID\n     */\n    public getPageViewId(): string | undefined {\n        return this.pageViewManager._currentPageview?.pageViewId\n    }\n\n    /**\n     * Capture written user feedback for a LLM trace. Numeric values are converted to strings.\n     *\n     * {@label LLM analytics}\n     *\n     * @public\n     *\n     * @param traceId The trace ID to capture feedback for.\n     * @param userFeedback The feedback to capture.\n     */\n    captureTraceFeedback(traceId: string | number, userFeedback: string) {\n        this.capture('$ai_feedback', {\n            $ai_trace_id: String(traceId),\n            $ai_feedback_text: userFeedback,\n        })\n    }\n\n    /**\n     * Capture a metric for a LLM trace. Numeric values are converted to strings.\n     *\n     * {@label LLM analytics}\n     *\n     * @public\n     *\n     * @param traceId The trace ID to capture the metric for.\n     * @param metricName The name of the metric to capture.\n     * @param metricValue The value of the metric to capture.\n     */\n    captureTraceMetric(traceId: string | number, metricName: string, metricValue: string | number | boolean) {\n        this.capture('$ai_metric', {\n            $ai_trace_id: String(traceId),\n            $ai_metric_name: metricName,\n            $ai_metric_value: String(metricValue),\n        })\n    }\n\n    private _checkLocalStorageForDebug(debugConfig: boolean | undefined) {\n        const explicitlyFalse = isBoolean(debugConfig) && !debugConfig\n        const isTrueInLocalStorage = localStore._is_supported() && localStore._get('ph_debug') === 'true'\n        return explicitlyFalse ? false : isTrueInLocalStorage ? true : debugConfig\n    }\n}\n\nsafewrapClass(PostHog, ['identify'])\n\nconst add_dom_loaded_handler = function () {\n    // Cross browser DOM Loaded support\n    function dom_loaded_handler() {\n        // function flag since we only want to execute this once\n        if ((dom_loaded_handler as any).done) {\n            return\n        }\n        ;(dom_loaded_handler as any).done = true\n\n        ENQUEUE_REQUESTS = false\n\n        each(instances, function (inst: PostHog) {\n            inst._dom_loaded()\n        })\n    }\n\n    if (document?.addEventListener) {\n        if (document.readyState === 'complete') {\n            // safari 4 can fire the DOMContentLoaded event before loading all\n            // external JS (including this file). you will see some copypasta\n            // on the internet that checks for 'complete' and 'loaded', but\n            // 'loaded' is an IE thing\n            dom_loaded_handler()\n        } else {\n            addEventListener(document, 'DOMContentLoaded', dom_loaded_handler, { capture: false })\n        }\n\n        return\n    }\n\n    // Only IE6-8 don't support `document.addEventListener` and we don't support them\n    // so let's simply log an error stating PostHog couldn't be initialized\n    // We're checking for `window` to avoid erroring out on a SSR context\n    if (window) {\n        logger.error(\"Browser doesn't support `document.addEventListener` so PostHog couldn't be initialized\")\n    }\n}\n\nexport function init_from_snippet(): void {\n    const posthogMain = (instances[PRIMARY_INSTANCE_NAME] = new PostHog())\n\n    const snippetPostHog = assignableWindow['posthog']\n\n    if (snippetPostHog) {\n        /**\n         * The snippet uses some clever tricks to allow deferred loading of array.js (this code)\n         *\n         * window.posthog is an array which the queue of calls made before the lib is loaded\n         * It has methods attached to it to simulate the posthog object so for instance\n         *\n         * window.posthog.init(\"TOKEN\", {api_host: \"foo\" })\n         * window.posthog.capture(\"my-event\", {foo: \"bar\" })\n         *\n         * ... will mean that window.posthog will look like this:\n         * window.posthog == [\n         *  [\"my-event\", {foo: \"bar\"}]\n         * ]\n         *\n         * window.posthog[_i] == [\n         *   [\"TOKEN\", {api_host: \"foo\" }, \"posthog\"]\n         * ]\n         *\n         * If a name is given to the init function then the same as above is true but as a sub-property on the object:\n         *\n         * window.posthog.init(\"TOKEN\", {}, \"ph2\")\n         * window.posthog.ph2.people.set({foo: \"bar\"})\n         *\n         * window.posthog.ph2 == []\n         * window.posthog.people == [\n         *  [\"set\", {foo: \"bar\"}]\n         * ]\n         *\n         */\n\n        // Call all pre-loaded init calls properly\n\n        each(snippetPostHog['_i'], function (item: [token: string, config: Partial<PostHogConfig>, name: string]) {\n            if (item && isArray(item)) {\n                const instance = posthogMain.init(item[0], item[1], item[2])\n\n                const instanceSnippet = snippetPostHog[item[2]] || snippetPostHog\n\n                if (instance) {\n                    // Crunch through the people queue first - we queue this data up &\n                    // flush on identify, so it's better to do all these operations first\n                    instance._execute_array.call(instance.people, instanceSnippet.people)\n                    instance._execute_array(instanceSnippet)\n                }\n            }\n        })\n    }\n\n    assignableWindow['posthog'] = posthogMain\n\n    add_dom_loaded_handler()\n}\n\nexport function init_as_module(): PostHog {\n    const posthogMain = (instances[PRIMARY_INSTANCE_NAME] = new PostHog())\n\n    add_dom_loaded_handler()\n\n    return posthogMain\n}\n", "import { isArray, isNullish, isUndefined } from \"../utils/index.mjs\";\nconst SURVEY_LANGUAGE_PROPERTY = '$survey_language';\nfunction getSurveyResponseKey(questionId) {\n    return `$survey_response_${questionId}`;\n}\nfunction getSurveyOldResponseKey(originalQuestionIndex) {\n    return 0 === originalQuestionIndex ? '$survey_response' : `$survey_response_${originalQuestionIndex}`;\n}\nfunction getSurveyResponseValue(responses, questionId) {\n    if (!questionId) return null;\n    const response = responses[getSurveyResponseKey(questionId)];\n    if (isArray(response)) return [\n        ...response\n    ];\n    return response;\n}\nfunction buildSurveyResponseProperties(responses = {}, survey) {\n    const oldFormatResponses = {};\n    survey.questions.forEach((question)=>{\n        if (isUndefined(question.originalQuestionIndex)) return;\n        const oldResponseKey = getSurveyOldResponseKey(question.originalQuestionIndex);\n        const response = getSurveyResponseValue(responses, question.id);\n        if (!isUndefined(response)) oldFormatResponses[oldResponseKey] = response;\n    });\n    return {\n        $survey_questions: survey.questions.map((question)=>({\n                id: question.id,\n                question: question.question,\n                response: getSurveyResponseValue(responses, question.id)\n            })),\n        ...responses,\n        ...oldFormatResponses\n    };\n}\nfunction surveyHasResponses(responses = {}) {\n    return Object.values(responses).some((response)=>!isNullish(response));\n}\nfunction getSurveyInteractionProperty(survey, action) {\n    let surveyProperty = `$survey_${action}/${survey.id}`;\n    if (survey.current_iteration && survey.current_iteration > 0) surveyProperty = `$survey_${action}/${survey.id}/${survey.current_iteration}`;\n    return surveyProperty;\n}\nexport { SURVEY_LANGUAGE_PROPERTY, buildSurveyResponseProperties, getSurveyInteractionProperty, getSurveyOldResponseKey, getSurveyResponseKey, getSurveyResponseValue, surveyHasResponses };\n", "import { TOOLBAR_CONTAINER_CLASS, TOOLBAR_ID } from '../constants'\n\n// Node.nodeType integer constants. We use the integers directly rather than\n// `Node.ELEMENT_NODE` etc. for browser portability (IE11) and to avoid a\n// runtime reference to the global `Node` in environments where it isn't defined.\nconst NODE_TYPE_ELEMENT = 1\nconst NODE_TYPE_TEXT = 3\nconst NODE_TYPE_DOCUMENT_FRAGMENT = 11\n\nexport function isElementInToolbar(el: EventTarget | null): boolean {\n    if (el instanceof Element) {\n        // closest isn't available in IE11, but we'll polyfill when bundling\n        return el.id === TOOLBAR_ID || !!el.closest?.('.' + TOOLBAR_CONTAINER_CLASS)\n    }\n    return false\n}\n\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isElementNode(el: Node | Element | undefined | null): el is Element {\n    return !!el && el.nodeType === NODE_TYPE_ELEMENT\n}\n\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\nexport function isTag(el: Element | undefined | null, tag: string): el is HTMLElement {\n    return !!el && !!el.tagName && el.tagName.toLowerCase() === tag.toLowerCase()\n}\n\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\nexport function isTextNode(el: Element | undefined | null): el is HTMLElement {\n    return !!el && el.nodeType === NODE_TYPE_TEXT\n}\n\n/*\n * Check whether a node is a ShadowRoot — a DocumentFragment whose `host` is\n * a real Element. Plain DocumentFragments (e.g. <template> content) share\n * the same nodeType but have no `host`, so they are not ShadowRoots.\n * @param {Node|undefined|null} el - node to check\n * @returns {boolean} whether el is a ShadowRoot we can hop through to its host\n */\nexport function isShadowRoot(el: Node | ParentNode | undefined | null): el is ShadowRoot {\n    return !!el && el.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && isElementNode((el as ShadowRoot).host)\n}\n", "import { AutocaptureConfig, PostHogConfig, Properties } from './types'\nimport { each, entries } from './utils'\n\nimport { isNullish, isString, isUndefined, isArray, isBoolean } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { isElementNode, isShadowRoot, isTag, isTextNode } from './utils/element-utils'\nimport { includes, trim } from '@posthog/core'\n\nexport function splitClassString(s: string): string[] {\n    return s ? trim(s).split(/\\s+/) : []\n}\n\nfunction checkForURLMatches(urlsList: (string | RegExp)[]): boolean {\n    const url = window?.location.href\n    return !!(url && urlsList && urlsList.some((regex) => url.match(regex)))\n}\n\n/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n *\n * Because this is a string it can contain unexpected characters\n * So, this method safely splits the className and returns that array.\n */\nexport function getClassNames(el: Element): string[] {\n    let className = ''\n    switch (typeof el.className) {\n        case 'string':\n            className = el.className\n            break\n        // TODO: when is this ever used?\n        case 'object': // handle cases where className might be SVGAnimatedString or some other type\n            className =\n                (el.className && 'baseVal' in el.className ? (el.className as any).baseVal : null) ||\n                el.getAttribute('class') ||\n                ''\n            break\n        default:\n            className = ''\n    }\n\n    return splitClassString(className)\n}\n\nexport function makeSafeText(s: string | null | undefined): string | null {\n    if (isNullish(s)) {\n        return null\n    }\n\n    return (\n        trim(s)\n            // scrub potentially sensitive values\n            .split(/(\\s+)/)\n            .filter((s) => shouldCaptureValue(s))\n            .join('')\n            // normalize whitespace\n            .replace(/[\\r\\n]/g, ' ')\n            .replace(/[ ]+/g, ' ')\n            // truncate\n            .substring(0, 255)\n    )\n}\n\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\nexport function getSafeText(el: Element): string {\n    let elText = ''\n\n    if (shouldCaptureElement(el) && !isSensitiveElement(el) && el.childNodes && el.childNodes.length) {\n        each(el.childNodes, function (child) {\n            if (isTextNode(child) && child.textContent) {\n                elText += makeSafeText(child.textContent) ?? ''\n            }\n        })\n    }\n\n    return trim(elText)\n}\n\nexport function getEventTarget(e: Event): Element | null {\n    // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n    if (isUndefined(e.target)) {\n        return (e.srcElement as Element) || null\n    } else {\n        if ((e.target as HTMLElement)?.shadowRoot) {\n            return (e.composedPath()[0] as Element) || null\n        }\n        return (e.target as Element) || null\n    }\n}\n\nexport const autocaptureCompatibleElements = ['a', 'button', 'form', 'input', 'select', 'textarea', 'label']\n\n/*\n if there is no config, then all elements are allowed\n if there is a config, and there is an allow list, then only elements in the allow list are allowed\n assumes that some other code is checking this element's parents\n */\nfunction checkIfElementTreePassesElementAllowList(\n    elements: Element[],\n    autocaptureConfig: AutocaptureConfig | undefined\n): boolean {\n    const allowlist = autocaptureConfig?.element_allowlist\n    if (isUndefined(allowlist)) {\n        // everything is allowed, when there is no allow list\n        return true\n    }\n\n    // check each element in the tree\n    // if any of the elements are in the allow list, then the tree is allowed\n    for (const el of elements) {\n        if (allowlist.some((elementType) => el.tagName.toLowerCase() === elementType)) {\n            return true\n        }\n    }\n\n    // otherwise there is an allow list and this element tree didn't match it\n    return false\n}\n\n/*\n if there is no selector list (i.e. it is undefined), then any elements matches\n if there is an empty list, then no elements match\n if there is a selector list, then check it against each element provided\n */\nfunction checkIfElementsMatchCSSSelector(elements: Element[], selectorList: string[] | undefined): boolean {\n    if (isUndefined(selectorList)) {\n        // everything is allowed, when there is no selector list\n        return true\n    }\n\n    for (const el of elements) {\n        if (selectorList.some((selector) => el.matches(selector))) {\n            return true\n        }\n    }\n\n    return false\n}\n\nexport function getParentElement(curEl: Element): Element | false {\n    const parentNode = curEl.parentNode\n    if (!parentNode || !isElementNode(parentNode)) return false\n    return parentNode\n}\n\nconst DEFAULT_CONTENT_IGNORELIST = ['next', 'previous', 'prev', '>', '<']\nconst MAX_CONTENT_IGNORELIST_ENTRIES = 10\n\ninterface ElementWithText {\n    safeText: string\n    ariaLabel: string\n}\n\nfunction shouldIgnoreByContent(\n    contentIgnorelist: boolean | string[] | undefined,\n    elementsWithText: ElementWithText[]\n): boolean {\n    if (contentIgnorelist === false || isUndefined(contentIgnorelist)) {\n        return false\n    }\n\n    let keywords: string[]\n    if (contentIgnorelist === true) {\n        keywords = DEFAULT_CONTENT_IGNORELIST\n    } else if (isArray(contentIgnorelist)) {\n        if (contentIgnorelist.length > MAX_CONTENT_IGNORELIST_ENTRIES) {\n            logger.error(\n                `[PostHog] content_ignorelist array cannot exceed ${MAX_CONTENT_IGNORELIST_ENTRIES} items. Use css_selector_ignorelist for more complex matching.`\n            )\n            return false\n        }\n        keywords = contentIgnorelist.map((k) => k.toLowerCase())\n    } else {\n        return false\n    }\n\n    return elementsWithText.some(({ safeText, ariaLabel }) => {\n        return keywords.some((keyword) => safeText.includes(keyword) || ariaLabel.includes(keyword))\n    })\n}\n\n// autocapture check will already filter for ph-no-capture,\n// but we include it here to protect against future changes accidentally removing that check\nconst DEFAULT_RAGE_CLICK_IGNORE_LIST = ['.ph-no-rageclick', '.ph-no-capture']\nexport function shouldCaptureRageclick(el: Element | null, _config: PostHogConfig['rageclick']) {\n    if (!window || cannotCheckForAutocapture(el)) {\n        return false\n    }\n\n    let selectorIgnoreList: string[] | boolean\n    let contentIgnorelist: boolean | string[] | undefined\n    if (isBoolean(_config)) {\n        selectorIgnoreList = _config ? DEFAULT_RAGE_CLICK_IGNORE_LIST : false\n        // For backward compatibility, don't enable content filtering for rageclick: true\n        contentIgnorelist = undefined\n    } else {\n        selectorIgnoreList = _config?.css_selector_ignorelist ?? DEFAULT_RAGE_CLICK_IGNORE_LIST\n        contentIgnorelist = _config?.content_ignorelist\n    }\n\n    if (selectorIgnoreList === false) {\n        return false\n    }\n\n    // Traverse DOM once and cache element data to avoid redundant calls to getSafeText\n    const { targetElementList } = getElementAndParentsForElement(el, false)\n    const elementsWithText: ElementWithText[] = targetElementList.map((element) => ({\n        safeText: getSafeText(element).toLowerCase(),\n        ariaLabel: element.getAttribute('aria-label')?.toLowerCase().trim() || '',\n    }))\n\n    if (shouldIgnoreByContent(contentIgnorelist, elementsWithText)) {\n        return false\n    }\n\n    // we don't capture if we match the ignore list\n    return !checkIfElementsMatchCSSSelector(targetElementList, selectorIgnoreList)\n}\n\nconst cannotCheckForAutocapture = (el: Element | null) => {\n    return !el || isTag(el, 'html') || !isElementNode(el)\n}\n\nconst getElementAndParentsForElement = (el: Element, captureOnAnyElement: false | true | undefined) => {\n    if (!window || cannotCheckForAutocapture(el)) {\n        return { parentIsUsefulElement: false, targetElementList: [] }\n    }\n\n    let parentIsUsefulElement = false\n    const targetElementList: Element[] = [el]\n    let curEl: Element = el\n    while (curEl.parentNode && !isTag(curEl, 'body')) {\n        if (isShadowRoot(curEl.parentNode)) {\n            targetElementList.push(curEl.parentNode.host)\n            curEl = curEl.parentNode.host\n            continue\n        }\n        const parentNode = getParentElement(curEl)\n        if (!parentNode) break\n        if (captureOnAnyElement || autocaptureCompatibleElements.indexOf(parentNode.tagName.toLowerCase()) > -1) {\n            parentIsUsefulElement = true\n        } else {\n            const compStyles = window.getComputedStyle(parentNode)\n            if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer') {\n                parentIsUsefulElement = true\n            }\n        }\n\n        targetElementList.push(parentNode)\n        curEl = parentNode\n    }\n    return { parentIsUsefulElement, targetElementList }\n}\n\n/*\n * Check whether a DOM event should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @param {Object} autocaptureConfig - autocapture config\n * @param {boolean} captureOnAnyElement - whether to capture on any element, clipboard autocapture doesn't restrict to \"clickable\" elements\n * @param {string[]} allowedEventTypes - event types to capture, normally just 'click', but some autocapture types react to different events, some elements have fixed events (e.g., form has \"submit\")\n * @returns {boolean} whether the event should be captured\n */\nexport function shouldCaptureDomEvent(\n    el: Element,\n    event: Event,\n    autocaptureConfig: AutocaptureConfig | undefined = undefined,\n    captureOnAnyElement?: boolean,\n    allowedEventTypes?: string[]\n): boolean {\n    if (!window || cannotCheckForAutocapture(el)) {\n        return false\n    }\n\n    if (autocaptureConfig?.url_allowlist) {\n        // if the current URL is not in the allow list, don't capture\n        if (!checkForURLMatches(autocaptureConfig.url_allowlist)) {\n            return false\n        }\n    }\n\n    if (autocaptureConfig?.url_ignorelist) {\n        // if the current URL is in the ignore list, don't capture\n        if (checkForURLMatches(autocaptureConfig.url_ignorelist)) {\n            return false\n        }\n    }\n\n    if (autocaptureConfig?.dom_event_allowlist) {\n        const allowlist = autocaptureConfig.dom_event_allowlist\n        if (allowlist && !allowlist.some((eventType) => event.type === eventType)) {\n            return false\n        }\n    }\n\n    const { parentIsUsefulElement, targetElementList } = getElementAndParentsForElement(el, captureOnAnyElement)\n\n    if (!checkIfElementTreePassesElementAllowList(targetElementList, autocaptureConfig)) {\n        return false\n    }\n\n    if (!checkIfElementsMatchCSSSelector(targetElementList, autocaptureConfig?.css_selector_allowlist)) {\n        return false\n    }\n\n    const compStyles = window.getComputedStyle(el)\n    if (compStyles && compStyles.getPropertyValue('cursor') === 'pointer' && event.type === 'click') {\n        return true\n    }\n\n    const tag = el.tagName.toLowerCase()\n    switch (tag) {\n        case 'html':\n            return false\n        case 'form':\n            return (allowedEventTypes || ['submit']).indexOf(event.type) >= 0\n        case 'input':\n        case 'select':\n        case 'textarea':\n            return (allowedEventTypes || ['change', 'click']).indexOf(event.type) >= 0\n        default:\n            if (parentIsUsefulElement) return (allowedEventTypes || ['click']).indexOf(event.type) >= 0\n            return (\n                (allowedEventTypes || ['click']).indexOf(event.type) >= 0 &&\n                (autocaptureCompatibleElements.indexOf(tag) > -1 || el.getAttribute('contenteditable') === 'true')\n            )\n    }\n}\n\n/*\n * Check whether a DOM element should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureElement(el: Element): boolean {\n    for (let curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode as Element) {\n        const classes = getClassNames(curEl)\n        if (includes(classes, 'ph-sensitive') || includes(classes, 'ph-no-capture')) {\n            return false\n        }\n    }\n\n    if (includes(getClassNames(el), 'ph-include')) {\n        return true\n    }\n\n    // don't include hidden or password fields\n    const type = (el as HTMLInputElement).type || ''\n    if (isString(type)) {\n        // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n        switch (type.toLowerCase()) {\n            case 'hidden':\n                return false\n            case 'password':\n                return false\n        }\n    }\n\n    // filter out data from fields that look like sensitive fields\n    const name = (el as HTMLInputElement).name || el.id || ''\n    // See https://github.com/posthog/posthog-js/issues/165\n    // Under specific circumstances a bug caused .replace to be called on a DOM element\n    // instead of a string, removing the element from the page. Ensure this issue is mitigated.\n    if (isString(name)) {\n        // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n        const sensitiveNameRegex =\n            /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i\n        if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n            return false\n        }\n    }\n\n    return true\n}\n\n/*\n * Check whether a DOM element is 'sensitive' and we should only capture limited data\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be captured\n */\nexport function isSensitiveElement(el: Element): boolean {\n    // don't send data from inputs or similar elements since there will always be\n    // a risk of clientside javascript placing sensitive data in attributes\n    const allowedInputTypes = ['button', 'checkbox', 'submit', 'reset']\n    if (\n        (isTag(el, 'input') && !allowedInputTypes.includes((el as HTMLInputElement).type)) ||\n        isTag(el, 'select') ||\n        isTag(el, 'textarea') ||\n        el.getAttribute('contenteditable') === 'true'\n    ) {\n        return true\n    }\n    return false\n}\n\n// Define the core pattern for matching credit card numbers\nconst coreCCPattern = `(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11})`\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredCCRegex = new RegExp(`^(?:${coreCCPattern})$`)\n// The Unanchored version is essentially the core pattern, usable as is for partial matches\nconst unanchoredCCRegex = new RegExp(coreCCPattern)\n\n// Define the core pattern for matching SSNs with optional dashes\nconst coreSSNPattern = `\\\\d{3}-?\\\\d{2}-?\\\\d{4}`\n// Create the Anchored version of the regex by adding '^' at the start and '$' at the end\nconst anchoredSSNRegex = new RegExp(`^(${coreSSNPattern})$`)\n// The Unanchored version is essentially the core pattern itself, usable for partial matches\nconst unanchoredSSNRegex = new RegExp(`(${coreSSNPattern})`)\n\n/*\n * Check whether a string value should be \"captured\" or if it may contain sensitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @param {boolean} anchorRegexes - whether to anchor the regexes to the start and end of the string\n * @returns {boolean} whether the element should be captured\n */\nexport function shouldCaptureValue(value: string, anchorRegexes = true): boolean {\n    if (isNullish(value)) {\n        return false\n    }\n\n    if (isString(value)) {\n        value = trim(value)\n\n        // check to see if input value looks like a credit card number\n        // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n        const ccRegex = anchorRegexes ? anchoredCCRegex : unanchoredCCRegex\n        if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n            return false\n        }\n\n        // check to see if input value looks like a social security number\n        const ssnRegex = anchorRegexes ? anchoredSSNRegex : unanchoredSSNRegex\n        if (ssnRegex.test(value)) {\n            return false\n        }\n    }\n\n    return true\n}\n\n/*\n * Check whether an attribute name is an Angular style attr (either _ngcontent or _nghost)\n * These update on each build and lead to noise in the element chain\n * More details on the attributes here: https://angular.io/guide/view-encapsulation\n * @param {string} attributeName - string value to check\n * @returns {boolean} whether the element is an angular tag\n */\nexport function isAngularStyleAttr(attributeName: string): boolean {\n    if (isString(attributeName)) {\n        return attributeName.substring(0, 10) === '_ngcontent' || attributeName.substring(0, 7) === '_nghost'\n    }\n    return false\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces,\n * along with the direct text content of the target element\n * @param {Element} target - element to check\n * @returns {string} text content of the target element and its child span tags\n */\nexport function getDirectAndNestedSpanText(target: Element): string {\n    let text = getSafeText(target)\n    text = `${text} ${getNestedSpanText(target)}`.trim()\n    return shouldCaptureValue(text) ? text : ''\n}\n\n/*\n * Iterate through children of a target element looking for span tags\n * and return the text content of the span tags, separated by spaces\n * @param {Element} target - element to check\n * @returns {string} text content of span tags\n */\nexport function getNestedSpanText(target: Element): string {\n    let text = ''\n    if (target && target.childNodes && target.childNodes.length) {\n        each(target.childNodes, function (child) {\n            if (child && child.tagName?.toLowerCase() === 'span') {\n                try {\n                    const spanText = getSafeText(child)\n                    text = `${text} ${spanText}`.trim()\n\n                    if (child.childNodes && child.childNodes.length) {\n                        text = `${text} ${getNestedSpanText(child)}`.trim()\n                    }\n                } catch (e) {\n                    logger.error('[AutoCapture]', e)\n                }\n            }\n        })\n    }\n    return text\n}\n\n/*\nBack in the day storing events in Postgres we use Elements for autocapture events.\nNow we're using elements_chain. We used to do this parsing/processing during ingestion.\nThis code is just copied over from ingestion, but we should optimize it\nto create elements_chain string directly.\n*/\nexport function getElementsChainString(elements: Properties[]): string {\n    return elementsToString(extractElements(elements))\n}\n\n// This interface is called 'Element' in plugin-scaffold https://github.com/PostHog/plugin-scaffold/blob/b07d3b879796ecc7e22deb71bf627694ba05386b/src/types.ts#L200\n// However 'Element' is a DOM Element when run in the browser, so we have to rename it\ninterface PHElement {\n    text?: string\n    tag_name?: string\n    href?: string\n    attr_id?: string\n    attr_class?: string[]\n    nth_child?: number\n    nth_of_type?: number\n    attributes?: Record<string, any>\n    event_id?: number\n    order?: number\n    group_id?: number\n}\n\nfunction escapeQuotes(input: string): string {\n    return input.replace(/\"|\\\\\"/g, '\\\\\"')\n}\n\nfunction elementsToString(elements: PHElement[]): string {\n    const ret = elements.map((element) => {\n        let el_string = ''\n        if (element.tag_name) {\n            el_string += element.tag_name\n        }\n        if (element.attr_class) {\n            element.attr_class.sort()\n            for (const single_class of element.attr_class) {\n                el_string += `.${single_class.replace(/\"/g, '')}`\n            }\n        }\n        const attributes: Record<string, any> = {\n            ...(element.text ? { text: element.text } : {}),\n            'nth-child': element.nth_child ?? 0,\n            'nth-of-type': element.nth_of_type ?? 0,\n            ...(element.href ? { href: element.href } : {}),\n            ...(element.attr_id ? { attr_id: element.attr_id } : {}),\n            ...element.attributes,\n        }\n        const sortedAttributes: Record<string, any> = {}\n        entries(attributes)\n            .sort(([a], [b]) => a.localeCompare(b))\n            .forEach(\n                ([key, value]) => (sortedAttributes[escapeQuotes(key.toString())] = escapeQuotes(value.toString()))\n            )\n        el_string += ':'\n        el_string += entries(sortedAttributes)\n            .map(([key, value]) => `${key}=\"${value}\"`)\n            .join('')\n        return el_string\n    })\n    return ret.join(';')\n}\n\nfunction extractElements(elements: Properties[]): PHElement[] {\n    return elements.map((el) => {\n        const response = {\n            text: el['$el_text']?.slice(0, 400),\n            tag_name: el['tag_name'],\n            href: el['attr__href']?.slice(0, 2048),\n            attr_class: extractAttrClass(el),\n            attr_id: el['attr__id'],\n            nth_child: el['nth_child'],\n            nth_of_type: el['nth_of_type'],\n            attributes: {} as { [id: string]: any },\n        }\n\n        entries(el)\n            .filter(([key]) => key.indexOf('attr__') === 0)\n            .forEach(([key, value]) => (response.attributes[key] = value))\n        return response\n    })\n}\n\nfunction extractAttrClass(el: Properties): PHElement['attr_class'] {\n    const attr_class = el['attr__class']\n    if (!attr_class) {\n        return undefined\n    } else if (isArray(attr_class)) {\n        return attr_class\n    } else {\n        return splitClassString(attr_class)\n    }\n}\n", "// Naive rage click implementation: If mouse has not moved further than thresholdPx\n// over clickCount clicks with max timeoutMs between clicks, it's\n// counted as a rage click\n\nimport { isObject } from '@posthog/core'\nimport { RageclickConfig } from '../types'\n\nconst DEFAULT_THRESHOLD_PX = 30\nconst DEFAULT_TIMEOUT_MS = 1000\nconst DEFAULT_CLICK_COUNT = 3\n\nexport default class RageClick {\n    clicks: { x: number; y: number; timestamp: number }[]\n\n    thresholdPx: number\n    timeoutMs: number\n    clickCount: number\n    disabled: boolean\n\n    constructor(rageclickConfig: RageclickConfig | boolean) {\n        this.disabled = rageclickConfig === false\n        const conf = isObject(rageclickConfig) ? rageclickConfig : {}\n\n        this.thresholdPx = conf.threshold_px || DEFAULT_THRESHOLD_PX\n        this.timeoutMs = conf.timeout_ms || DEFAULT_TIMEOUT_MS\n        this.clickCount = conf.click_count || DEFAULT_CLICK_COUNT\n\n        this.clicks = []\n    }\n\n    isRageClick(x: number, y: number, timestamp: number): boolean {\n        if (this.disabled) {\n            return false\n        }\n\n        const lastClick = this.clicks[this.clicks.length - 1]\n        if (\n            lastClick &&\n            Math.abs(x - lastClick.x) + Math.abs(y - lastClick.y) < this.thresholdPx &&\n            timestamp - lastClick.timestamp < this.timeoutMs\n        ) {\n            this.clicks.push({ x, y, timestamp })\n\n            if (this.clicks.length === this.clickCount) {\n                return true\n            }\n        } else {\n            this.clicks = [{ x, y, timestamp }]\n        }\n\n        return false\n    }\n}\n", "import { addEventListener, each, extend } from './utils'\nimport {\n    autocaptureCompatibleElements,\n    getClassNames,\n    getDirectAndNestedSpanText,\n    getElementsChainString,\n    getEventTarget,\n    getSafeText,\n    isAngularStyleAttr,\n    isSensitiveElement,\n    makeSafeText,\n    shouldCaptureDomEvent,\n    shouldCaptureElement,\n    shouldCaptureRageclick,\n    shouldCaptureValue,\n    splitClassString,\n} from './autocapture-utils'\n\nimport RageClick from './extensions/rageclick'\nimport { AutocaptureConfig, EventName, Properties, RemoteConfig } from './types'\nimport { PostHog } from './posthog-core'\nimport { AUTOCAPTURE_DISABLED_SERVER_SIDE } from './constants'\n\nimport { isBoolean, isFunction, isNull, isObject } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { document, window } from './utils/globals'\nimport { convertToURL } from './utils/request-utils'\nimport { isElementNode, isShadowRoot, isTag, isTextNode } from './utils/element-utils'\nimport { includes } from '@posthog/core'\nimport type { Extension } from './extensions/types'\n\nconst COPY_AUTOCAPTURE_EVENT = '$copy_autocapture'\n\nconst logger = createLogger('[AutoCapture]')\n\nfunction limitText(length: number, text: string): string {\n    if (text.length > length) {\n        return text.slice(0, length) + '...'\n    }\n    return text\n}\n\nexport function getAugmentPropertiesFromElement(elem: Element): Properties {\n    const shouldCaptureEl = shouldCaptureElement(elem)\n    if (!shouldCaptureEl) {\n        return {}\n    }\n\n    const props: Properties = {}\n\n    each(elem.attributes, function (attr: Attr) {\n        if (attr.name && attr.name.indexOf('data-ph-capture-attribute') === 0) {\n            const propertyKey = attr.name.replace('data-ph-capture-attribute-', '')\n            const propertyValue = attr.value\n            if (propertyKey && propertyValue && shouldCaptureValue(propertyValue)) {\n                props[propertyKey] = propertyValue\n            }\n        }\n    })\n\n    return props\n}\n\nexport function previousElementSibling(el: Element): Element | null {\n    if (el.previousElementSibling) {\n        return el.previousElementSibling\n    }\n    let _el: Element | null = el\n    do {\n        _el = _el.previousSibling as Element | null // resolves to ChildNode->Node, which is Element's parent class\n    } while (_el && !isElementNode(_el))\n    return _el\n}\n\nexport function getDefaultProperties(eventType: string): Properties {\n    return {\n        $event_type: eventType,\n        $ce_version: 1,\n    }\n}\n\nexport function getPropertiesFromElement(\n    elem: Element,\n    maskAllAttributes: boolean,\n    maskText: boolean,\n    elementAttributeIgnorelist: string[] | undefined\n): Properties {\n    const tag_name = elem.tagName.toLowerCase()\n    const props: Properties = {\n        tag_name: tag_name,\n    }\n    if (autocaptureCompatibleElements.indexOf(tag_name) > -1 && !maskText) {\n        if (tag_name.toLowerCase() === 'a' || tag_name.toLowerCase() === 'button') {\n            props['$el_text'] = limitText(1024, getDirectAndNestedSpanText(elem))\n        } else {\n            props['$el_text'] = limitText(1024, getSafeText(elem))\n        }\n    }\n\n    const classes = getClassNames(elem)\n    if (classes.length > 0)\n        props['classes'] = classes.filter(function (c) {\n            return c !== ''\n        })\n\n    // capture the deny list here because this not-a-class class makes it tricky to use this.config in the function below\n    each(elem.attributes, function (attr: Attr) {\n        // Only capture attributes we know are safe\n        if (isSensitiveElement(elem) && ['name', 'id', 'class', 'aria-label'].indexOf(attr.name) === -1) return\n\n        if (elementAttributeIgnorelist?.includes(attr.name)) return\n\n        if (!maskAllAttributes && shouldCaptureValue(attr.value) && !isAngularStyleAttr(attr.name)) {\n            let value = attr.value\n            if (attr.name === 'class') {\n                // html attributes can _technically_ contain linebreaks,\n                // but we're very intolerant of them in the class string,\n                // so we strip them.\n                value = splitClassString(value).join(' ')\n            }\n            props['attr__' + attr.name] = limitText(1024, value)\n        }\n    })\n\n    let nthChild = 1\n    let nthOfType = 1\n    let currentElem: Element | null = elem\n    while ((currentElem = previousElementSibling(currentElem))) {\n        // eslint-disable-line no-cond-assign\n        nthChild++\n        if (currentElem.tagName === elem.tagName) {\n            nthOfType++\n        }\n    }\n    props['nth_child'] = nthChild\n    props['nth_of_type'] = nthOfType\n\n    return props\n}\n\nexport function autocapturePropertiesForElement(\n    target: Element,\n    {\n        e,\n        maskAllElementAttributes,\n        maskAllText,\n        elementAttributeIgnoreList,\n        elementsChainAsString,\n    }: {\n        e: Event\n        maskAllElementAttributes: boolean\n        maskAllText: boolean\n        elementAttributeIgnoreList?: string[] | undefined\n        elementsChainAsString: boolean\n    }\n): { props: Properties; explicitNoCapture?: boolean } {\n    if (!isElementNode(target)) {\n        return { props: {} }\n    }\n\n    const targetElementList: Element[] = [target]\n    let curEl: Element = target\n    while (curEl.parentNode && !isTag(curEl, 'body')) {\n        if (isShadowRoot(curEl.parentNode)) {\n            targetElementList.push(curEl.parentNode.host)\n            curEl = curEl.parentNode.host\n            continue\n        }\n        if (!isElementNode(curEl.parentNode)) {\n            break\n        }\n        targetElementList.push(curEl.parentNode)\n        curEl = curEl.parentNode\n    }\n\n    const elementsJson: Properties[] = []\n    const autocaptureAugmentProperties: Properties = {}\n    let href: string | false = false\n    let explicitNoCapture = false\n\n    each(targetElementList, (el) => {\n        const shouldCaptureEl = shouldCaptureElement(el)\n\n        // if the element or a parent element is an anchor tag\n        // include the href as a property\n        if (isTag(el, 'a')) {\n            const hrefAttr = el.getAttribute('href')\n            href = shouldCaptureEl && !!hrefAttr && shouldCaptureValue(hrefAttr) && hrefAttr\n        }\n\n        // allow users to programmatically prevent capturing of elements by adding class 'ph-no-capture'\n        const classes = getClassNames(el)\n        if (includes(classes, 'ph-no-capture')) {\n            explicitNoCapture = true\n        }\n\n        elementsJson.push(\n            getPropertiesFromElement(el, maskAllElementAttributes, maskAllText, elementAttributeIgnoreList)\n        )\n\n        const augmentProperties = getAugmentPropertiesFromElement(el)\n        extend(autocaptureAugmentProperties, augmentProperties)\n    })\n\n    if (explicitNoCapture) {\n        return { props: {}, explicitNoCapture }\n    }\n\n    if (!maskAllText) {\n        // if the element is a button or anchor tag get the span text from any\n        // children and include it as/with the text property on the parent element\n        if (isTag(target, 'a') || isTag(target, 'button')) {\n            elementsJson[0]['$el_text'] = getDirectAndNestedSpanText(target)\n        } else {\n            elementsJson[0]['$el_text'] = getSafeText(target)\n        }\n    }\n\n    let externalHref: string | undefined\n    if (href) {\n        elementsJson[0]['attr__href'] = href\n        const hrefHost = convertToURL(href)?.host\n        const locationHost = window?.location?.host\n        if (hrefHost && locationHost && hrefHost !== locationHost) {\n            externalHref = href\n        }\n    }\n\n    const props = extend(\n        getDefaultProperties(e.type),\n        // Sending \"$elements\" is deprecated. Only one client on US cloud uses this.\n        !elementsChainAsString ? { $elements: elementsJson } : {},\n        // Always send $elements_chain, as it's needed downstream in site app filtering\n        { $elements_chain: getElementsChainString(elementsJson) },\n        elementsJson[0]?.['$el_text'] ? { $el_text: elementsJson[0]?.['$el_text'] } : {},\n        externalHref && e.type === 'click' ? { $external_click_url: externalHref } : {},\n        autocaptureAugmentProperties\n    )\n\n    return { props }\n}\n\nexport class Autocapture implements Extension {\n    instance: PostHog\n    _initialized: boolean = false\n    _isDisabledServerSide: boolean | null = null\n    _elementSelectors: Set<string> | null\n    rageclicks: RageClick\n    _elementsChainAsString = false\n\n    constructor(instance: PostHog) {\n        this.instance = instance\n        this.rageclicks = new RageClick(instance.config.rageclick)\n        this._elementSelectors = null\n    }\n\n    initialize() {\n        this.startIfEnabled()\n    }\n\n    private get _config(): AutocaptureConfig {\n        const config = isObject(this.instance.config.autocapture) ? this.instance.config.autocapture : {}\n        // precompile the regex\n        config.url_allowlist = config.url_allowlist?.map((url) => new RegExp(url))\n        config.url_ignorelist = config.url_ignorelist?.map((url) => new RegExp(url))\n        return config\n    }\n\n    _addDomEventHandlers(): void {\n        if (!this.isBrowserSupported()) {\n            logger.info('Disabling Automatic Event Collection because this browser is not supported')\n            return\n        }\n\n        if (!window || !document) {\n            return\n        }\n\n        const handler = (e: Event) => {\n            e = e || window?.event\n            try {\n                this._captureEvent(e)\n            } catch (error) {\n                logger.error('Failed to capture event', error)\n            }\n        }\n\n        addEventListener(document, 'submit', handler, { capture: true })\n        addEventListener(document, 'change', handler, { capture: true })\n        addEventListener(document, 'click', handler, { capture: true })\n\n        if (this._config.capture_copied_text) {\n            const copiedTextHandler = (e: Event) => {\n                e = e || window?.event\n                try {\n                    this._captureEvent(e, COPY_AUTOCAPTURE_EVENT)\n                } catch (error) {\n                    logger.error('Failed to capture copy/cut event', error)\n                }\n            }\n\n            addEventListener(document, 'copy', copiedTextHandler, { capture: true })\n            addEventListener(document, 'cut', copiedTextHandler, { capture: true })\n        }\n    }\n\n    public startIfEnabled() {\n        if (this.isEnabled && !this._initialized) {\n            this._addDomEventHandlers()\n            this._initialized = true\n        }\n    }\n\n    public onRemoteConfig(response: RemoteConfig) {\n        if (response.elementsChainAsString) {\n            this._elementsChainAsString = response.elementsChainAsString\n        }\n\n        // NOTE: Unlike other extensions (heatmaps, web-vitals, etc.), we intentionally\n        // DO NOT guard against missing autocapture_opt_out key here. Autocapture uses\n        // a \"wait for server, then enable unless explicitly opted out\" model:\n        // - Before remote config: autocapture disabled (isEnabled returns false)\n        // - After remote config: enabled unless autocapture_opt_out is explicitly true\n        // Missing/undefined key → !!undefined = false → autocapture enabled\n        // This is intentional and different from opt-in features like heatmaps.\n        if (this.instance.persistence) {\n            this.instance.persistence.register({\n                [AUTOCAPTURE_DISABLED_SERVER_SIDE]: !!response['autocapture_opt_out'],\n            })\n        }\n        // store this in-memory in case persistence is disabled\n        this._isDisabledServerSide = !!response['autocapture_opt_out']\n        this.startIfEnabled()\n    }\n\n    public setElementSelectors(selectors: Set<string>): void {\n        this._elementSelectors = selectors\n    }\n\n    public getElementSelectors(element: Element | null): string[] | null {\n        const elementSelectors: string[] = []\n\n        this._elementSelectors?.forEach((selector) => {\n            const matchedElements = document?.querySelectorAll(selector)\n            matchedElements?.forEach((matchedElement: Element) => {\n                if (element === matchedElement) {\n                    elementSelectors.push(selector)\n                }\n            })\n        })\n\n        return elementSelectors\n    }\n\n    public get isEnabled(): boolean {\n        const persistedServerDisabled = this.instance.persistence?.props[AUTOCAPTURE_DISABLED_SERVER_SIDE]\n        const memoryDisabled = this._isDisabledServerSide\n\n        if (isNull(memoryDisabled) && !isBoolean(persistedServerDisabled) && !this.instance._shouldDisableFlags()) {\n            // We only enable if we know that the server has not disabled it (unless /flags is disabled)\n            return false\n        }\n\n        const disabledServer = this._isDisabledServerSide ?? !!persistedServerDisabled\n        const disabledClient = !this.instance.config.autocapture\n        return !disabledClient && !disabledServer\n    }\n\n    private _captureEvent(e: Event, eventName: EventName = '$autocapture'): boolean | void {\n        if (!this.isEnabled) {\n            return\n        }\n\n        /*** Don't mess with this code without running IE8 tests on it ***/\n        let target = getEventTarget(e)\n        if (isTextNode(target)) {\n            // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n            target = (target.parentNode || null) as Element | null\n        }\n\n        if (eventName === '$autocapture' && e.type === 'click' && e instanceof MouseEvent) {\n            if (\n                !!this.instance.config.rageclick &&\n                this.rageclicks?.isRageClick(e.clientX, e.clientY, e.timeStamp || new Date().getTime())\n            ) {\n                if (shouldCaptureRageclick(target, this.instance.config.rageclick)) {\n                    this._captureEvent(e, '$rageclick')\n                }\n            }\n        }\n\n        const isCopyAutocapture = eventName === COPY_AUTOCAPTURE_EVENT\n        if (\n            target &&\n            shouldCaptureDomEvent(\n                target,\n                e,\n                this._config,\n                // mostly this method cares about the target element, but in the case of copy events,\n                // we want some of the work this check does without insisting on the target element's type\n                isCopyAutocapture,\n                // we also don't want to restrict copy checks to clicks,\n                // so we pass that knowledge in here, rather than add the logic inside the check\n                isCopyAutocapture ? ['copy', 'cut'] : undefined\n            )\n        ) {\n            const { props, explicitNoCapture } = autocapturePropertiesForElement(target, {\n                e,\n                maskAllElementAttributes: this.instance.config.mask_all_element_attributes,\n                maskAllText: this.instance.config.mask_all_text,\n                elementAttributeIgnoreList: this._config.element_attribute_ignorelist,\n                elementsChainAsString: this._elementsChainAsString,\n            })\n\n            if (explicitNoCapture) {\n                return false\n            }\n\n            const elementSelectors = this.getElementSelectors(target)\n            if (elementSelectors && elementSelectors.length > 0) {\n                props['$element_selectors'] = elementSelectors\n            }\n\n            if (eventName === COPY_AUTOCAPTURE_EVENT) {\n                // you can't read the data from the clipboard event,\n                // but you can guess that you can read it from the window's current selection\n                const selectedContent = makeSafeText(window?.getSelection()?.toString())\n                const clipType = (e as ClipboardEvent).type || 'clipboard'\n                if (!selectedContent) {\n                    return false\n                }\n                props['$selected_content'] = selectedContent\n                props['$copy_type'] = clipType\n            }\n\n            this.instance.capture(eventName, props)\n            return true\n        }\n    }\n\n    isBrowserSupported(): boolean {\n        return isFunction(document?.querySelectorAll)\n    }\n}\n", "import { assignableWindow, window } from '../../utils/globals'\nimport { PostHog } from '../../posthog-core'\nimport { RemoteConfig } from '../../types'\n\nimport { createLogger } from '../../utils/logger'\nimport { EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE } from '../../constants'\nimport { isUndefined, BucketedRateLimiter, isObject } from '@posthog/core'\nimport { ErrorTracking } from '@posthog/core'\nimport { ExceptionAutoCaptureConfig } from '../../types'\n\nconst logger = createLogger('[ExceptionAutocapture]')\n\nexport class ExceptionObserver {\n    private _instance: PostHog\n    private _rateLimiter: BucketedRateLimiter<string>\n    private _remoteEnabled: boolean | undefined\n    private _config: Required<ExceptionAutoCaptureConfig>\n    private _unwrapOnError: (() => void) | undefined\n    private _unwrapUnhandledRejection: (() => void) | undefined\n    private _unwrapConsoleError: (() => void) | undefined\n\n    constructor(instance: PostHog) {\n        this._instance = instance\n        this._remoteEnabled = !!this._instance.persistence?.props[EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]\n\n        // by default captures ten exceptions before rate limiting by exception type\n        // refills at a rate of one token / 10 second period\n        // e.g. will capture 1 exception rate limited exception every 10 seconds until burst ends\n        this._rateLimiter = new BucketedRateLimiter({\n            refillRate: this._instance.config.error_tracking.__exceptionRateLimiterRefillRate ?? 1,\n            bucketSize: this._instance.config.error_tracking.__exceptionRateLimiterBucketSize ?? 10,\n            refillInterval: 10000, // ten seconds in milliseconds,\n            _logger: logger,\n        })\n\n        this._config = this._requiredConfig()\n        this.startIfEnabledOrStop()\n    }\n\n    private _requiredConfig(): Required<ExceptionAutoCaptureConfig> {\n        const providedConfig = this._instance.config.capture_exceptions\n        let config: Required<ExceptionAutoCaptureConfig> = {\n            capture_unhandled_errors: false,\n            capture_unhandled_rejections: false,\n            capture_console_errors: false,\n        }\n\n        if (isObject(providedConfig)) {\n            config = { ...config, ...providedConfig }\n        } else if (isUndefined(providedConfig) ? this._remoteEnabled : providedConfig) {\n            config = { ...config, capture_unhandled_errors: true, capture_unhandled_rejections: true }\n        }\n\n        return config\n    }\n\n    public get isEnabled(): boolean {\n        return (\n            this._config.capture_console_errors ||\n            this._config.capture_unhandled_errors ||\n            this._config.capture_unhandled_rejections\n        )\n    }\n\n    startIfEnabledOrStop(): void {\n        if (this.isEnabled) {\n            logger.info('enabled')\n            this._stopCapturing()\n            this._loadScript(this._startCapturing)\n        } else {\n            this._stopCapturing()\n        }\n    }\n\n    private _loadScript(cb: () => void): void {\n        if (assignableWindow.__PosthogExtensions__?.errorWrappingFunctions) {\n            // already loaded\n            cb()\n        }\n\n        assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n            this._instance,\n            'exception-autocapture',\n            (err) => {\n                if (err) {\n                    return logger.error('failed to load script', err)\n                }\n                cb()\n            }\n        )\n    }\n\n    private _startCapturing = () => {\n        if (!window || !this.isEnabled || !assignableWindow.__PosthogExtensions__?.errorWrappingFunctions) {\n            return\n        }\n\n        const wrapOnError = assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapOnError\n        const wrapUnhandledRejection =\n            assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapUnhandledRejection\n        const wrapConsoleError = assignableWindow.__PosthogExtensions__.errorWrappingFunctions.wrapConsoleError\n\n        try {\n            if (!this._unwrapOnError && this._config.capture_unhandled_errors) {\n                this._unwrapOnError = wrapOnError(this.captureException.bind(this))\n            }\n            if (!this._unwrapUnhandledRejection && this._config.capture_unhandled_rejections) {\n                this._unwrapUnhandledRejection = wrapUnhandledRejection(this.captureException.bind(this))\n            }\n            if (!this._unwrapConsoleError && this._config.capture_console_errors) {\n                this._unwrapConsoleError = wrapConsoleError(this.captureException.bind(this))\n            }\n        } catch (e) {\n            logger.error('failed to start', e)\n            this._stopCapturing()\n        }\n    }\n\n    private _stopCapturing() {\n        this._unwrapOnError?.()\n        this._unwrapOnError = undefined\n\n        this._unwrapUnhandledRejection?.()\n        this._unwrapUnhandledRejection = undefined\n\n        this._unwrapConsoleError?.()\n        this._unwrapConsoleError = undefined\n    }\n\n    onRemoteConfig(response: RemoteConfig) {\n        if (!('autocaptureExceptions' in response)) {\n            return\n        }\n\n        const autocaptureExceptionsResponse = response.autocaptureExceptions\n\n        // store this in-memory in case persistence is disabled\n        this._remoteEnabled = !!autocaptureExceptionsResponse || false\n\n        if (this._instance.persistence) {\n            this._instance.persistence.register({\n                [EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE]: this._remoteEnabled,\n            })\n        }\n\n        this._config = this._requiredConfig()\n        this.startIfEnabledOrStop()\n    }\n\n    onConfigChange() {\n        this._config = this._requiredConfig()\n    }\n\n    captureException(errorProperties: ErrorTracking.ErrorProperties) {\n        const exceptionType = errorProperties?.$exception_list?.[0]?.type ?? 'Exception'\n        const isRateLimited = this._rateLimiter.consumeRateLimit(exceptionType)\n\n        if (isRateLimited) {\n            logger.info('Skipping exception capture because of client rate limiting.', {\n                exception: exceptionType,\n            })\n            return\n        }\n\n        this._instance.exceptions?.sendExceptionEvent(errorProperties)\n    }\n}\n", "// import { patch } from 'rrweb/typings/utils'\n// copied from https://github.com/rrweb-io/rrweb/blob/8aea5b00a4dfe5a6f59bd2ae72bb624f45e51e81/packages/rrweb/src/utils.ts#L129\n// which was copied from https://github.com/getsentry/sentry-javascript/blob/b2109071975af8bf0316d3b5b38f519bdaf5dc15/packages/utils/src/object.ts\nimport { isFunction } from '@posthog/core'\n\nexport function patch(\n    source: { [key: string]: any },\n    name: string,\n    replacement: (...args: unknown[]) => unknown\n): () => void {\n    try {\n        if (!(name in source)) {\n            return () => {\n                //\n            }\n        }\n\n        const original = source[name] as () => unknown\n        const wrapped = replacement(original)\n\n        // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n        // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n        if (isFunction(wrapped)) {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n            wrapped.prototype = wrapped.prototype || {}\n            Object.defineProperties(wrapped, {\n                __posthog_wrapped__: {\n                    enumerable: false,\n                    value: true,\n                },\n            })\n        }\n\n        source[name] = wrapped\n\n        return () => {\n            source[name] = original\n        }\n    } catch {\n        return () => {\n            //\n        }\n        // This can throw if multiple fill happens on a global object like XMLHttpRequest\n        // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n    }\n}\n", "import { PostHog } from '../posthog-core'\nimport { assignableWindow } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\nimport { isUndefined } from '@posthog/core'\nimport type { Extension } from './types'\n\nconst logger = createLogger('[TracingHeaders]')\n\nexport class TracingHeaders implements Extension {\n    private _restoreXHRPatch: (() => void) | undefined = undefined\n    private _restoreFetchPatch: (() => void) | undefined = undefined\n\n    constructor(private readonly _instance: PostHog) {}\n\n    initialize() {\n        this.startIfEnabledOrStop()\n    }\n\n    private _loadScript(cb: () => void): void {\n        if (assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns) {\n            // already loaded\n            cb()\n        }\n\n        assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'tracing-headers', (err) => {\n            if (err) {\n                return logger.error('failed to load script', err)\n            }\n            cb()\n        })\n    }\n    private _getConfiguredHostnames(): string[] | undefined {\n        // Prefer the new `addTracingHeaders` name; fall back to the deprecated `__add_tracing_headers`.\n        return this._instance.config.addTracingHeaders ?? this._instance.config.__add_tracing_headers\n    }\n\n    public startIfEnabledOrStop() {\n        if (this._getConfiguredHostnames()) {\n            this._loadScript(this._startCapturing)\n        } else {\n            this._restoreXHRPatch?.()\n            this._restoreFetchPatch?.()\n            // we don't want to call these twice so we reset them\n            this._restoreXHRPatch = undefined\n            this._restoreFetchPatch = undefined\n        }\n    }\n\n    private _startCapturing = () => {\n        const hostnames = this._getConfiguredHostnames() || []\n        if (isUndefined(this._restoreXHRPatch)) {\n            assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns?._patchXHR(\n                hostnames,\n                this._instance.get_distinct_id(),\n                this._instance.sessionManager\n            )\n        }\n        if (isUndefined(this._restoreFetchPatch)) {\n            assignableWindow.__PosthogExtensions__?.tracingHeadersPatchFns?._patchFetch(\n                hostnames,\n                this._instance.get_distinct_id(),\n                this._instance.sessionManager\n            )\n        }\n    }\n}\n", "import { PostHog } from '../../posthog-core'\nimport { PostHogConfig, RemoteConfig, SupportedWebVitalsMetrics } from '../../types'\nimport { createLogger } from '../../utils/logger'\nimport { isBoolean, isNullish, isNumber, isUndefined, isObject } from '@posthog/core'\nimport { WEB_VITALS_ALLOWED_METRICS, WEB_VITALS_ENABLED_SERVER_SIDE } from '../../constants'\nimport { assignableWindow, window, location } from '../../utils/globals'\nimport { maskQueryParams } from '../../utils/request-utils'\nimport { PERSONAL_DATA_CAMPAIGN_PARAMS, MASKED } from '../../utils/event-utils'\n\nconst logger = createLogger('[Web Vitals]')\n\ntype WebVitalsMetricCallback = (metric: any) => void\n\nexport const DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS = 5000\nconst ONE_MINUTE_IN_MILLIS = 60 * 1000\nexport const FIFTEEN_MINUTES_IN_MILLIS = 15 * ONE_MINUTE_IN_MILLIS\n\ntype WebVitalsEventBuffer = { url: string | undefined; metrics: any[]; firstMetricTimestamp: number | undefined }\n\nexport class WebVitalsAutocapture {\n    private _enabledServerSide: boolean = false\n    private _initialized = false\n\n    private _buffer: WebVitalsEventBuffer = { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n    private _delayedFlushTimer: ReturnType<typeof setTimeout> | undefined\n\n    constructor(private readonly _instance: PostHog) {\n        this._enabledServerSide = !!this._instance.persistence?.props[WEB_VITALS_ENABLED_SERVER_SIDE]\n\n        this.startIfEnabled()\n    }\n\n    /** Shorthand for performance config to reduce bundle size */\n    private get _perfConfig(): PostHogConfig['capture_performance'] {\n        return this._instance.config.capture_performance\n    }\n\n    public get allowedMetrics(): SupportedWebVitalsMetrics[] {\n        const clientConfigMetricAllowList: SupportedWebVitalsMetrics[] | undefined = isObject(this._perfConfig)\n            ? this._perfConfig?.web_vitals_allowed_metrics\n            : undefined\n        return !isNullish(clientConfigMetricAllowList)\n            ? clientConfigMetricAllowList\n            : this._instance.persistence?.props[WEB_VITALS_ALLOWED_METRICS] || ['CLS', 'FCP', 'INP', 'LCP']\n    }\n\n    public get flushToCaptureTimeoutMs(): number {\n        const clientConfig: number | undefined = isObject(this._perfConfig)\n            ? this._perfConfig.web_vitals_delayed_flush_ms\n            : undefined\n        return clientConfig || DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS\n    }\n\n    public get useAttribution(): boolean {\n        const clientConfig: boolean | undefined = isObject(this._perfConfig)\n            ? this._perfConfig.web_vitals_attribution\n            : undefined\n        return clientConfig ?? false\n    }\n\n    public get _maxAllowedValue(): number {\n        const configured =\n            isObject(this._perfConfig) && isNumber(this._perfConfig.__web_vitals_max_value)\n                ? this._perfConfig.__web_vitals_max_value\n                : FIFTEEN_MINUTES_IN_MILLIS\n        // you can set to 0 to disable the check or any value over ten seconds\n        // 1 milli to 1 minute will be set to 15 minutes, cos that would be a silly low maximum\n        return 0 < configured && configured <= ONE_MINUTE_IN_MILLIS ? FIFTEEN_MINUTES_IN_MILLIS : configured\n    }\n\n    public get isEnabled(): boolean {\n        // Always disable web vitals if we're not on http or https\n        const protocol = location?.protocol\n        if (protocol !== 'http:' && protocol !== 'https:') {\n            logger.info('Web Vitals are disabled on non-http/https protocols')\n            return false\n        }\n\n        // Otherwise, check config\n        const clientConfig = isObject(this._perfConfig)\n            ? this._perfConfig.web_vitals\n            : isBoolean(this._perfConfig)\n              ? this._perfConfig\n              : undefined\n        return isBoolean(clientConfig) ? clientConfig : this._enabledServerSide\n    }\n\n    public startIfEnabled(): void {\n        if (this.isEnabled && !this._initialized) {\n            logger.info('enabled, starting...')\n            this._loadScript(this._startCapturing)\n        }\n    }\n\n    public onRemoteConfig(response: RemoteConfig) {\n        if (!('capturePerformance' in response)) {\n            return\n        }\n\n        const webVitalsOptIn = isObject(response.capturePerformance) && !!response.capturePerformance.web_vitals\n\n        const allowedMetrics = isObject(response.capturePerformance)\n            ? response.capturePerformance.web_vitals_allowed_metrics\n            : undefined\n\n        if (this._instance.persistence) {\n            this._instance.persistence.register({\n                [WEB_VITALS_ENABLED_SERVER_SIDE]: webVitalsOptIn,\n            })\n\n            this._instance.persistence.register({\n                [WEB_VITALS_ALLOWED_METRICS]: allowedMetrics,\n            })\n        }\n        // store this in-memory in case persistence is disabled\n        this._enabledServerSide = webVitalsOptIn\n\n        this.startIfEnabled()\n    }\n\n    private _loadScript(cb: () => void): void {\n        if (assignableWindow.__PosthogExtensions__?.postHogWebVitalsCallbacks) {\n            // already loaded\n            cb()\n            return\n        }\n\n        const kind = this.useAttribution ? 'web-vitals-with-attribution' : 'web-vitals'\n\n        assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, kind, (err) => {\n            if (err) {\n                logger.error('failed to load script', err)\n                return\n            }\n\n            cb()\n        })\n    }\n\n    private _currentURL(): string | undefined {\n        const href = window ? window.location.href : undefined\n        if (!href) {\n            logger.error('Could not determine current URL')\n            return undefined\n        }\n\n        // mask url query params\n        const maskPersonalDataProperties = this._instance.config.mask_personal_data_properties\n        const customPersonalDataProperties = this._instance.config.custom_personal_data_properties\n\n        const paramsToMask = maskPersonalDataProperties\n            ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n            : []\n\n        return maskQueryParams(href, paramsToMask, MASKED)\n    }\n\n    private _flushToCapture = () => {\n        clearTimeout(this._delayedFlushTimer)\n        if (this._buffer.metrics.length === 0) {\n            return\n        }\n\n        this._instance.capture(\n            '$web_vitals',\n            this._buffer.metrics.reduce(\n                (acc, metric) => ({\n                    ...acc,\n                    // the entire event so we can use it in the future e.g. includes google's rating\n                    [`$web_vitals_${metric.name}_event`]: { ...metric },\n                    [`$web_vitals_${metric.name}_value`]: metric.value,\n                }),\n                {}\n            )\n        )\n        this._buffer = { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n    }\n\n    private _addToBuffer = (metric: any) => {\n        const sessionIds = this._instance.sessionManager?.checkAndGetSessionAndWindowId(true)\n        if (isUndefined(sessionIds)) {\n            logger.error('Could not read session ID. Dropping metrics!')\n            return\n        }\n\n        this._buffer = this._buffer || { url: undefined, metrics: [], firstMetricTimestamp: undefined }\n\n        const $currentUrl = this._currentURL()\n        if (isUndefined($currentUrl)) {\n            return\n        }\n\n        if (isNullish(metric?.name) || isNullish(metric?.value)) {\n            logger.error('Invalid metric received', metric)\n            return\n        }\n\n        // we observe some very large values sometimes, we'll ignore them\n        // since the likelihood of LCP > 1 hour being correct is very low\n        if (this._maxAllowedValue && metric.value >= this._maxAllowedValue) {\n            logger.error('Ignoring metric with value >= ' + this._maxAllowedValue, metric)\n            return\n        }\n\n        const urlHasChanged = this._buffer.url !== $currentUrl\n\n        if (urlHasChanged) {\n            // we need to send what we have\n            this._flushToCapture()\n\n            // poor performance is >4s, we wait twice that time to send\n            // this is in case we haven't received all metrics\n            // we'll at least gather some\n            this._delayedFlushTimer = setTimeout(this._flushToCapture, this.flushToCaptureTimeoutMs)\n        }\n\n        if (isUndefined(this._buffer.url)) {\n            this._buffer.url = $currentUrl\n        }\n\n        this._buffer.firstMetricTimestamp = isUndefined(this._buffer.firstMetricTimestamp)\n            ? Date.now()\n            : this._buffer.firstMetricTimestamp\n\n        if (metric.attribution && metric.attribution.interactionTargetElement) {\n            // we don't want to send the entire element\n            // they can be very large\n            // TODO we could run this through autocapture code so that we get elements chain info\n            //  and can display the element in the UI\n            metric.attribution.interactionTargetElement = undefined\n        }\n\n        this._buffer.metrics.push({\n            ...metric,\n            $current_url: $currentUrl,\n            $session_id: sessionIds.sessionId,\n            $window_id: sessionIds.windowId,\n            timestamp: Date.now(),\n        })\n\n        if (this._buffer.metrics.length === this.allowedMetrics.length) {\n            // we have all allowed metrics\n            this._flushToCapture()\n        }\n    }\n\n    private _startCapturing = () => {\n        // IMPORTANT: web-vitals does not provide cleanup functions and warns against\n        // calling functions more than once per page load. Each call creates new\n        // PerformanceObservers that persist for the page lifetime.\n        // See: https://github.com/GoogleChrome/web-vitals/issues/629\n        if (this._initialized) {\n            return\n        }\n\n        let onLCP: WebVitalsMetricCallback | undefined\n        let onCLS: WebVitalsMetricCallback | undefined\n        let onFCP: WebVitalsMetricCallback | undefined\n        let onINP: WebVitalsMetricCallback | undefined\n\n        const posthogExtensions = assignableWindow.__PosthogExtensions__\n        if (!isUndefined(posthogExtensions) && !isUndefined(posthogExtensions.postHogWebVitalsCallbacks)) {\n            ;({ onLCP, onCLS, onFCP, onINP } = posthogExtensions.postHogWebVitalsCallbacks)\n        }\n\n        if (!onLCP || !onCLS || !onFCP || !onINP) {\n            logger.error('web vitals callbacks not loaded - not starting')\n            return\n        }\n\n        // register performance observers\n        if (this.allowedMetrics.indexOf('LCP') > -1) {\n            onLCP(this._addToBuffer.bind(this))\n        }\n        if (this.allowedMetrics.indexOf('CLS') > -1) {\n            onCLS(this._addToBuffer.bind(this))\n        }\n        if (this.allowedMetrics.indexOf('FCP') > -1) {\n            onFCP(this._addToBuffer.bind(this))\n        }\n        if (this.allowedMetrics.indexOf('INP') > -1) {\n            onINP(this._addToBuffer.bind(this))\n        }\n\n        this._initialized = true\n    }\n}\n", "import {\n    SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS,\n    SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS,\n    SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS,\n    SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport { FlagVariant, RemoteConfig, SessionRecordingPersistedConfig, SessionRecordingUrlTrigger } from '../../../types'\nimport { isNullish, isBoolean, isString, isObject, isUndefined } from '@posthog/core'\nimport { window } from '../../../utils/globals'\nimport { logger } from '../../../utils/logger'\n\nexport const DISABLED = 'disabled'\nexport const SAMPLED = 'sampled'\nexport const ACTIVE = 'active'\nexport const BUFFERING = 'buffering'\nexport const PAUSED = 'paused'\nexport const LAZY_LOADING = 'lazy_loading'\nexport const AWAITING_CONFIG = 'awaiting_config'\nexport const MISSING_CONFIG = 'missing_config'\nexport const RRWEB_ERROR = 'rrweb_error'\n\nconst TRIGGER = 'trigger'\nexport const TRIGGER_ACTIVATED = TRIGGER + '_activated'\nexport const TRIGGER_PENDING = TRIGGER + '_pending'\nexport const TRIGGER_DISABLED = TRIGGER + '_' + DISABLED\n\nexport interface RecordingTriggersStatus {\n    get receivedFlags(): boolean\n    get isRecordingEnabled(): false | true | undefined\n    get isSampled(): false | true | null\n    get rrwebError(): boolean\n    get urlTriggerMatching(): URLTriggerMatching\n    get eventTriggerMatching(): EventTriggerMatching\n    get linkedFlagMatching(): LinkedFlagMatching\n    get sessionId(): string\n}\n\n/**\n * Extended interface for V2 trigger groups\n */\nexport interface RecordingTriggersStatusV2 extends RecordingTriggersStatus {\n    get triggerGroupMatchers(): TriggerGroupMatching[]\n    get triggerGroupSamplingResults(): Map<string, boolean> // group id -> sampled decision\n    get minimumDuration(): number | null\n}\n\nexport type TriggerType = 'url' | 'event'\n/* \ntriggers can have one of three statuses:\n * - trigger_activated: the trigger met conditions to start recording\n * - trigger_pending: the trigger is present, but the conditions are not yet met\n * - trigger_disabled: the trigger is not present\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst triggerStatuses = [TRIGGER_ACTIVATED, TRIGGER_PENDING, TRIGGER_DISABLED] as const\nexport type TriggerStatus = (typeof triggerStatuses)[number]\n\n/**\n * Session recording starts in buffering mode while waiting for \"flags response\".\n * Once the response is received, it might be disabled, active or sampled.\n * When \"sampled\" that means a sample rate is set, and the last time the session ID rotated\n * the sample rate determined this session should be sent to the server.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst sessionRecordingStatuses = [\n    DISABLED,\n    SAMPLED,\n    ACTIVE,\n    BUFFERING,\n    PAUSED,\n    LAZY_LOADING,\n    AWAITING_CONFIG,\n    MISSING_CONFIG,\n    RRWEB_ERROR,\n] as const\nexport type SessionRecordingStatus = (typeof sessionRecordingStatuses)[number]\n\n// while we have both lazy and eager loaded replay we might get either type of config\ntype ReplayConfigType = RemoteConfig | SessionRecordingPersistedConfig\n\n// Type for trigger group matching config - subset of SessionRecordingPersistedConfig properties\ntype TriggerMatchingConfig = Pick<\n    SessionRecordingPersistedConfig,\n    'urlTriggers' | 'urlBlocklist' | 'eventTriggers' | 'linkedFlag'\n>\n\nfunction sessionRecordingUrlTriggerMatches(\n    url: string,\n    triggers: SessionRecordingUrlTrigger[],\n    compiledRegexCache?: Map<string, RegExp>\n) {\n    return triggers.some((trigger) => {\n        switch (trigger.matching) {\n            case 'regex': {\n                const regex = compiledRegexCache?.get(trigger.url) ?? new RegExp(trigger.url)\n                return regex.test(url)\n            }\n            default:\n                return false\n        }\n    })\n}\n\nexport interface TriggerStatusMatching {\n    triggerStatus(sessionId: string): TriggerStatus\n    stop(): void\n}\nexport class OrTriggerMatching implements TriggerStatusMatching {\n    constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n    triggerStatus(sessionId: string): TriggerStatus {\n        const statuses = this._matchers.map((m) => m.triggerStatus(sessionId))\n        if (statuses.includes(TRIGGER_ACTIVATED)) {\n            return TRIGGER_ACTIVATED\n        }\n        if (statuses.includes(TRIGGER_PENDING)) {\n            return TRIGGER_PENDING\n        }\n        return TRIGGER_DISABLED\n    }\n\n    stop(): void {\n        this._matchers.forEach((m) => m.stop())\n    }\n}\n\nexport class AndTriggerMatching implements TriggerStatusMatching {\n    constructor(private readonly _matchers: TriggerStatusMatching[]) {}\n\n    triggerStatus(sessionId: string): TriggerStatus {\n        const statuses = new Set<TriggerStatus>()\n        for (const matcher of this._matchers) {\n            statuses.add(matcher.triggerStatus(sessionId))\n        }\n\n        // trigger_disabled means no config\n        statuses.delete(TRIGGER_DISABLED)\n        switch (statuses.size) {\n            case 0:\n                return TRIGGER_DISABLED\n            case 1:\n                return Array.from(statuses)[0]\n            default:\n                return TRIGGER_PENDING\n        }\n    }\n\n    stop(): void {\n        this._matchers.forEach((m) => m.stop())\n    }\n}\n\nexport class PendingTriggerMatching implements TriggerStatusMatching {\n    triggerStatus(): TriggerStatus {\n        return TRIGGER_PENDING\n    }\n\n    stop(): void {\n        // no-op\n    }\n}\n\nexport class AlwaysActivatedTriggerMatching implements TriggerStatusMatching {\n    triggerStatus(): TriggerStatus {\n        return TRIGGER_ACTIVATED\n    }\n\n    stop(): void {\n        // no-op\n    }\n}\n\nconst isEagerLoadedConfig = (x: ReplayConfigType | TriggerMatchingConfig): x is RemoteConfig => {\n    return 'sessionRecording' in x\n}\n\nexport class URLTriggerMatching implements TriggerStatusMatching {\n    _urlTriggers: SessionRecordingUrlTrigger[] = []\n    _urlBlocklist: SessionRecordingUrlTrigger[] = []\n\n    private _compiledTriggerRegexes: Map<string, RegExp> = new Map()\n    private _compiledBlocklistRegexes: Map<string, RegExp> = new Map()\n\n    private _lastCheckedUrl: string = ''\n    private _groupId?: string // Optional group ID for V2 per-group persistence\n\n    urlBlocked: boolean = false\n\n    constructor(\n        private readonly _instance: PostHog,\n        groupId?: string\n    ) {\n        this._groupId = groupId\n    }\n\n    onConfig(config: ReplayConfigType | TriggerMatchingConfig) {\n        this._urlTriggers =\n            (isEagerLoadedConfig(config)\n                ? isObject(config.sessionRecording)\n                    ? config.sessionRecording?.urlTriggers\n                    : []\n                : config?.urlTriggers) || []\n        this._urlBlocklist =\n            (isEagerLoadedConfig(config)\n                ? isObject(config.sessionRecording)\n                    ? config.sessionRecording?.urlBlocklist\n                    : []\n                : config?.urlBlocklist) || []\n\n        this._compileRegexCache()\n    }\n\n    /**\n     * Compiles and caches RegExp objects from URL triggers and blocklist.\n     * This prevents recreating RegExp objects on every rrweb event\n     */\n    private _compileRegexCache(): void {\n        this._compiledTriggerRegexes.clear()\n        this._compiledBlocklistRegexes.clear()\n\n        for (const trigger of this._urlTriggers) {\n            if (trigger.matching === 'regex' && !this._compiledTriggerRegexes.has(trigger.url)) {\n                try {\n                    this._compiledTriggerRegexes.set(trigger.url, new RegExp(trigger.url))\n                } catch (e) {\n                    logger.error('Invalid URL trigger regex pattern:', trigger.url, e)\n                }\n            }\n        }\n\n        for (const trigger of this._urlBlocklist) {\n            if (trigger.matching === 'regex' && !this._compiledBlocklistRegexes.has(trigger.url)) {\n                try {\n                    this._compiledBlocklistRegexes.set(trigger.url, new RegExp(trigger.url))\n                } catch (e) {\n                    logger.error('Invalid URL blocklist regex pattern:', trigger.url, e)\n                }\n            }\n        }\n    }\n\n    /**\n     * @deprecated Use onConfig instead\n     */\n    onRemoteConfig(response: RemoteConfig) {\n        this.onConfig(response)\n    }\n\n    private _urlTriggerStatus(sessionId: string): TriggerStatus {\n        if (this._urlTriggers.length === 0) {\n            return TRIGGER_DISABLED\n        }\n\n        // V2: Use per-group persistence key if groupId is provided\n        const persistenceKey = this._groupId\n            ? SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX + this._groupId\n            : SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION\n\n        const currentTriggerSession = this._instance?.get_property(persistenceKey)\n        return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n    }\n\n    triggerStatus(sessionId: string): TriggerStatus {\n        const urlTriggerStatus = this._urlTriggerStatus(sessionId)\n        const eitherIsActivated = urlTriggerStatus === TRIGGER_ACTIVATED\n        const eitherIsPending = urlTriggerStatus === TRIGGER_PENDING\n\n        const result = eitherIsActivated ? TRIGGER_ACTIVATED : eitherIsPending ? TRIGGER_PENDING : TRIGGER_DISABLED\n        this._instance.register_for_session({\n            [SDK_DEBUG_REPLAY_URL_TRIGGER_STATUS]: result,\n        })\n        return result\n    }\n\n    /**\n     * Check URL blocklist and pause/resume recording accordingly\n     * This is separate from trigger checking and is used by both V1 and V2\n     *\n     * Performance optimization: Only checks when URL changes to avoid redundant regex matching\n     */\n    checkUrlBlocklist(onPause: () => void, onResume: () => void): void {\n        if (typeof window === 'undefined' || !window.location.href) {\n            return\n        }\n\n        const url = window.location.href\n\n        // Performance optimization: Skip if URL hasn't changed since last check\n        if (url === this._lastCheckedUrl) {\n            return\n        }\n        this._lastCheckedUrl = url\n\n        // Check blocklist and call onPause/onResume\n        // Note: DON'T set this.urlBlocked here - let the callbacks (_pauseRecording/_resumeRecording) set it\n        const wasBlocked = this.urlBlocked\n        const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n        if (wasBlocked && isNowBlocked) {\n            return\n        }\n\n        if (isNowBlocked && !wasBlocked) {\n            onPause()\n        } else if (!isNowBlocked && wasBlocked) {\n            onResume()\n        }\n    }\n\n    checkUrlTriggerConditions(\n        onPause: () => void,\n        onResume: () => void,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n        sessionId: string\n    ) {\n        if (typeof window === 'undefined' || !window.location.href) {\n            return\n        }\n\n        const url = window.location.href\n\n        // Performance optimization: Skip if URL hasn't changed since last check\n        // This prevents redundant checks on every rrweb event\n        if (url === this._lastCheckedUrl) {\n            return\n        }\n        this._lastCheckedUrl = url\n\n        // Check blocklist and call onPause/onResume\n        // Note: DON'T set this.urlBlocked here - let the callbacks (_pauseRecording/_resumeRecording) set it\n        const wasBlocked = this.urlBlocked\n        const isNowBlocked = sessionRecordingUrlTriggerMatches(url, this._urlBlocklist, this._compiledBlocklistRegexes)\n\n        if (isNowBlocked && !wasBlocked) {\n            onPause()\n        } else if (!isNowBlocked && wasBlocked) {\n            onResume()\n        }\n\n        // Check URL triggers\n        const isActivated = this._urlTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n        const urlMatches = sessionRecordingUrlTriggerMatches(url, this._urlTriggers, this._compiledTriggerRegexes)\n\n        if (!isActivated && urlMatches) {\n            onActivate('url', url)\n        }\n    }\n\n    stop(): void {\n        this._lastCheckedUrl = ''\n    }\n}\n\nexport class LinkedFlagMatching implements TriggerStatusMatching {\n    linkedFlag: string | FlagVariant | null = null\n    linkedFlagSeen: boolean = false\n    private _flagListenerCleanup: () => void = () => {}\n    constructor(private readonly _instance: PostHog) {}\n\n    triggerStatus(): TriggerStatus {\n        let result = TRIGGER_PENDING\n        if (isNullish(this.linkedFlag)) {\n            result = TRIGGER_DISABLED\n        }\n        if (this.linkedFlagSeen) {\n            result = TRIGGER_ACTIVATED\n        }\n        this._instance.register_for_session({\n            [SDK_DEBUG_REPLAY_LINKED_FLAG_TRIGGER_STATUS]: result,\n        })\n        return result\n    }\n\n    onConfig(\n        config: ReplayConfigType | TriggerMatchingConfig,\n        onStarted: (flag: string, variant: string | null) => void\n    ) {\n        this.linkedFlag =\n            (isEagerLoadedConfig(config)\n                ? isObject(config.sessionRecording)\n                    ? config.sessionRecording?.linkedFlag\n                    : null\n                : config?.linkedFlag) || null\n\n        if (!isNullish(this.linkedFlag) && !this.linkedFlagSeen) {\n            const linkedFlag = isString(this.linkedFlag) ? this.linkedFlag : this.linkedFlag.flag\n            const linkedVariant = isString(this.linkedFlag) ? null : this.linkedFlag.variant\n            this._flagListenerCleanup = this._instance.onFeatureFlags((_flags, variants) => {\n                const flagIsPresent = isObject(variants) && linkedFlag in variants\n                let linkedFlagMatches = false\n                if (flagIsPresent) {\n                    const variantForFlagKey = variants[linkedFlag]\n                    if (isBoolean(variantForFlagKey)) {\n                        linkedFlagMatches = variantForFlagKey === true\n                    } else if (linkedVariant) {\n                        linkedFlagMatches = variantForFlagKey === linkedVariant\n                    } else {\n                        // then this is a variant flag and we want to match any string\n                        linkedFlagMatches = !!variantForFlagKey\n                    }\n                }\n                this.linkedFlagSeen = linkedFlagMatches\n                if (linkedFlagMatches) {\n                    onStarted(linkedFlag, linkedVariant)\n                }\n            })\n        }\n    }\n\n    /**\n     * @deprecated Use onConfig instead\n     */\n    onRemoteConfig(response: RemoteConfig, onStarted: (flag: string, variant: string | null) => void) {\n        this.onConfig(response, onStarted)\n    }\n\n    stop(): void {\n        this._flagListenerCleanup()\n    }\n}\n\nexport class EventTriggerMatching implements TriggerStatusMatching {\n    _eventTriggers: string[] = []\n    private _groupId?: string // Optional group ID for V2 per-group persistence\n\n    constructor(\n        private readonly _instance: PostHog,\n        groupId?: string\n    ) {\n        this._groupId = groupId\n    }\n\n    onConfig(config: ReplayConfigType | TriggerMatchingConfig) {\n        // Handle both RemoteConfig (nested) and SessionRecordingPersistedConfig (flattened) structures\n        this._eventTriggers =\n            (isEagerLoadedConfig(config)\n                ? isObject(config.sessionRecording)\n                    ? config.sessionRecording?.eventTriggers\n                    : []\n                : config?.eventTriggers) || []\n    }\n\n    /**\n     * @deprecated Use onConfig instead\n     */\n    onRemoteConfig(response: RemoteConfig) {\n        this.onConfig(response)\n    }\n\n    private _eventTriggerStatus(sessionId: string): TriggerStatus {\n        if (this._eventTriggers.length === 0) {\n            return TRIGGER_DISABLED\n        }\n\n        // V2: Use per-group persistence key if groupId is provided\n        const persistenceKey = this._groupId\n            ? SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX + this._groupId\n            : SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION\n\n        const currentTriggerSession = this._instance?.get_property(persistenceKey)\n        return currentTriggerSession === sessionId ? TRIGGER_ACTIVATED : TRIGGER_PENDING\n    }\n\n    triggerStatus(sessionId: string): TriggerStatus {\n        const eventTriggerStatus = this._eventTriggerStatus(sessionId)\n        const result =\n            eventTriggerStatus === TRIGGER_ACTIVATED\n                ? TRIGGER_ACTIVATED\n                : eventTriggerStatus === TRIGGER_PENDING\n                  ? TRIGGER_PENDING\n                  : TRIGGER_DISABLED\n        this._instance.register_for_session({\n            [SDK_DEBUG_REPLAY_EVENT_TRIGGER_STATUS]: result,\n        })\n        return result\n    }\n\n    checkEventTriggerConditions(\n        eventName: string,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n        sessionId: string\n    ) {\n        if (this._eventTriggers.length === 0) {\n            return\n        }\n\n        const isActivated = this._eventTriggerStatus(sessionId) === TRIGGER_ACTIVATED\n        const includes = this._eventTriggers.includes(eventName)\n        if (!isActivated && includes) {\n            onActivate('event', eventName)\n        }\n    }\n\n    stop(): void {\n        // no-op\n    }\n}\n\n/**\n * V2 Trigger Group Matching - manages a single trigger group with its own conditions\n */\nexport class TriggerGroupMatching implements TriggerStatusMatching {\n    private _urlTriggerMatching: URLTriggerMatching\n    private _eventTriggerMatching: EventTriggerMatching\n    private _linkedFlagMatching: LinkedFlagMatching\n    private _combinedMatching: TriggerStatusMatching\n    public readonly group: import('../../../types').SessionRecordingTriggerGroup\n\n    constructor(\n        private readonly _instance: PostHog,\n        group: import('../../../types').SessionRecordingTriggerGroup,\n        onFlagStarted: (flag: string, variant: string | null) => void\n    ) {\n        this.group = group\n        // V2: Pass groupId to child matchers for per-group persistence\n        this._urlTriggerMatching = new URLTriggerMatching(_instance, group.id)\n        this._eventTriggerMatching = new EventTriggerMatching(_instance, group.id)\n        this._linkedFlagMatching = new LinkedFlagMatching(_instance)\n\n        // Check if all conditions are empty (no events, urls, or flags)\n        const hasEvents = group.conditions.events && group.conditions.events.length > 0\n        const hasUrls = group.conditions.urls && group.conditions.urls.length > 0\n        const hasFlag = !!group.conditions.flag\n\n        if (!hasEvents && !hasUrls && !hasFlag) {\n            // Empty conditions = trigger immediately on session start\n            this._combinedMatching = new AlwaysActivatedTriggerMatching()\n        } else {\n            // V2: Events arrive as objects {name, properties?} from the server.\n            // Extract just the names — property filter evaluation is handled by the strategy.\n            const eventNames = (group.conditions.events || []).map((e) => e.name)\n\n            // Convert group config to the format expected by the individual matchers\n            const config: TriggerMatchingConfig = {\n                urlTriggers: group.conditions.urls || [],\n                eventTriggers: eventNames,\n                linkedFlag: group.conditions.flag || null,\n                urlBlocklist: [],\n            }\n\n            this._urlTriggerMatching.onConfig(config)\n            this._eventTriggerMatching.onConfig(config)\n            this._linkedFlagMatching.onConfig(config, onFlagStarted)\n\n            // Combine matchers based on the group's matchType\n            const matchers = [this._eventTriggerMatching, this._urlTriggerMatching, this._linkedFlagMatching]\n            this._combinedMatching =\n                group.conditions.matchType === 'any'\n                    ? new OrTriggerMatching(matchers)\n                    : new AndTriggerMatching(matchers)\n        }\n    }\n\n    triggerStatus(sessionId: string): TriggerStatus {\n        return this._combinedMatching.triggerStatus(sessionId)\n    }\n\n    checkEventTriggerConditions(\n        eventName: string,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n        sessionId: string\n    ) {\n        this._eventTriggerMatching.checkEventTriggerConditions(eventName, onActivate, sessionId)\n    }\n\n    checkUrlTriggerConditions(\n        onPause: () => void,\n        onResume: () => void,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void,\n        sessionId: string\n    ) {\n        this._urlTriggerMatching.checkUrlTriggerConditions(onPause, onResume, onActivate, sessionId)\n    }\n\n    /**\n     * V2: Activate this group's trigger and persist to group-specific key\n     * This prevents cross-group contamination and survives page reloads\n     */\n    activateTrigger(triggerType: TriggerType, sessionId: string): void {\n        const persistenceKey =\n            triggerType === 'url'\n                ? SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX + this.group.id\n                : SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX + this.group.id\n\n        this._instance.persistence?.register({\n            [persistenceKey]: sessionId,\n        })\n    }\n\n    stop(): void {\n        this._urlTriggerMatching.stop()\n        this._eventTriggerMatching.stop()\n        this._linkedFlagMatching.stop()\n    }\n}\n\n// we need a no-op matcher before we can lazy-load the other matches, since all matchers wait on remote config anyway\nexport function nullMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n    if (triggersStatus.rrwebError) {\n        return RRWEB_ERROR\n    }\n\n    if (!triggersStatus.isRecordingEnabled) {\n        return DISABLED\n    }\n\n    return BUFFERING\n}\n\nexport function anyMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n    if (triggersStatus.rrwebError) {\n        return RRWEB_ERROR\n    }\n\n    if (!triggersStatus.receivedFlags) {\n        return BUFFERING\n    }\n\n    if (!triggersStatus.isRecordingEnabled) {\n        return DISABLED\n    }\n\n    if (triggersStatus.urlTriggerMatching.urlBlocked) {\n        return PAUSED\n    }\n\n    const sampledActive = triggersStatus.isSampled === true\n    const triggerMatches = new OrTriggerMatching([\n        triggersStatus.eventTriggerMatching,\n        triggersStatus.urlTriggerMatching,\n        triggersStatus.linkedFlagMatching,\n    ]).triggerStatus(triggersStatus.sessionId)\n\n    if (sampledActive) {\n        return SAMPLED\n    }\n\n    if (triggerMatches === TRIGGER_ACTIVATED) {\n        return ACTIVE\n    }\n\n    if (triggerMatches === TRIGGER_PENDING) {\n        // even if sampled active is false, we should still be buffering\n        // since a pending trigger could override it\n        return BUFFERING\n    }\n\n    // if sampling is set and the session is already decided to not be sampled\n    // then we should never be active\n    if (triggersStatus.isSampled === false) {\n        return DISABLED\n    }\n\n    return ACTIVE\n}\n\nexport function allMatchSessionRecordingStatus(triggersStatus: RecordingTriggersStatus): SessionRecordingStatus {\n    if (triggersStatus.rrwebError) {\n        return RRWEB_ERROR\n    }\n\n    if (!triggersStatus.receivedFlags) {\n        return BUFFERING\n    }\n\n    if (!triggersStatus.isRecordingEnabled) {\n        return DISABLED\n    }\n\n    if (triggersStatus.urlTriggerMatching.urlBlocked) {\n        return PAUSED\n    }\n\n    const andTriggerMatch = new AndTriggerMatching([\n        triggersStatus.eventTriggerMatching,\n        triggersStatus.urlTriggerMatching,\n        triggersStatus.linkedFlagMatching,\n    ])\n    const currentTriggerStatus = andTriggerMatch.triggerStatus(triggersStatus.sessionId)\n    const hasTriggersConfigured = currentTriggerStatus !== TRIGGER_DISABLED\n\n    const hasSamplingConfigured = isBoolean(triggersStatus.isSampled)\n\n    if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_PENDING) {\n        return BUFFERING\n    }\n\n    if (hasTriggersConfigured && currentTriggerStatus === TRIGGER_DISABLED) {\n        return DISABLED\n    }\n\n    // sampling can't ever cause buffering, it's always determined right away or not configured\n    if (hasSamplingConfigured && !triggersStatus.isSampled) {\n        return DISABLED\n    }\n\n    // If sampling is configured and set to true, return sampled\n    if (triggersStatus.isSampled === true) {\n        return SAMPLED\n    }\n\n    return ACTIVE\n}\n\n/**\n * V2 Trigger Groups Status Matcher - implements union behavior:\n * 1. Evaluate ALL trigger groups\n * 2. For each matching group, check if its sample rate hits\n * 3. If ANY group's sample rate hits → record session\n */\nexport function triggerGroupsMatchSessionRecordingStatus(\n    triggersStatus: RecordingTriggersStatusV2\n): SessionRecordingStatus {\n    if (triggersStatus.rrwebError) {\n        return RRWEB_ERROR\n    }\n\n    if (!triggersStatus.receivedFlags) {\n        return BUFFERING\n    }\n\n    if (!triggersStatus.isRecordingEnabled) {\n        return DISABLED\n    }\n\n    // Check if any URL is blocked (url blocklist is global, not per-group)\n    if (triggersStatus.urlTriggerMatching.urlBlocked) {\n        return PAUSED\n    }\n\n    const groupMatchers = triggersStatus.triggerGroupMatchers\n    const samplingResults = triggersStatus.triggerGroupSamplingResults\n\n    if (groupMatchers.length === 0) {\n        // No V2 groups configured - should not happen, but treat as disabled\n        return DISABLED\n    }\n\n    // Evaluate all groups to determine overall status\n    let anyGroupPending = false\n    let anyGroupSampled = false\n\n    for (const matcher of groupMatchers) {\n        const groupStatus = matcher.triggerStatus(triggersStatus.sessionId)\n\n        if (groupStatus === TRIGGER_ACTIVATED) {\n            // Check if this group's sample rate hit\n            const groupId = matcher.group.id\n            const samplingResult = samplingResults.get(groupId)\n\n            if (isUndefined(samplingResult)) {\n                logger.warn('[V2 Triggers] Group activated but no sampling decision found', { groupId })\n            } else if (samplingResult === true) {\n                anyGroupSampled = true\n            }\n        } else if (groupStatus === TRIGGER_PENDING) {\n            anyGroupPending = true\n        }\n    }\n\n    // Union behavior: if ANY group hit its sample rate, record\n    if (anyGroupSampled) {\n        return SAMPLED\n    }\n\n    // If any group is pending, keep buffering\n    if (anyGroupPending) {\n        return BUFFERING\n    }\n\n    // All groups are either disabled, conditions not met, or sampled out\n    return DISABLED\n}\n", "import { PostHog } from '../../../posthog-core'\nimport {\n    CaptureResult,\n    SessionRecordingPersistedConfig,\n    SessionRecordingTriggerGroup,\n    SessionStartReason,\n} from '../../../types'\nimport {\n    SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_IS_SAMPLED,\n    SESSION_RECORDING_PAST_MINIMUM_DURATION,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX,\n    SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX,\n    SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS,\n    SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG,\n    SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT,\n    STORED_PERSON_PROPERTIES_KEY,\n} from '../../../constants'\nimport {\n    EventTriggerMatching,\n    LinkedFlagMatching,\n    URLTriggerMatching,\n    TriggerGroupMatching,\n    SessionRecordingStatus,\n    allMatchSessionRecordingStatus,\n    anyMatchSessionRecordingStatus,\n    triggerGroupsMatchSessionRecordingStatus,\n    RecordingTriggersStatusV2,\n    TriggerType,\n    AndTriggerMatching,\n    OrTriggerMatching,\n    TriggerStatusMatching,\n    TRIGGER_PENDING,\n} from './triggerMatching'\nimport { sampleOnProperty } from '../../sampling'\nimport { isBoolean, isNull, isNullish, isNumber } from '@posthog/core'\nimport { createLogger } from '../../../utils/logger'\nimport { matchTriggerPropertyFilters } from '../../../utils/property-utils'\n\nconst logger = createLogger('[SessionRecording]')\n\n/**\n * Shared context that strategies need to access from the recorder\n */\nexport interface RecordingStrategyContext {\n    instance: PostHog\n    sessionId: string\n    isSampled: boolean | null\n    rrwebError: boolean\n    urlTriggerMatching: URLTriggerMatching\n    eventTriggerMatching: EventTriggerMatching\n    linkedFlagMatching: LinkedFlagMatching\n    remoteConfig: SessionRecordingPersistedConfig | undefined\n}\n\n/**\n * Strategy interface for handling different recording trigger configurations\n */\nexport interface RecordingStrategy {\n    /**\n     * Initialize the strategy with remote config\n     */\n    onRemoteConfig(config: SessionRecordingPersistedConfig): void\n\n    /**\n     * Get the current recording status\n     */\n    getStatus(context: RecordingStrategyContext): SessionRecordingStatus\n\n    /**\n     * Get the minimum duration for this session (if any)\n     */\n    getMinimumDuration(sessionId: string): number | null\n\n    /**\n     * Check URL triggers on each navigation\n     * Note: URL is read from window.location.href internally\n     */\n    checkUrlTriggers(\n        sessionId: string,\n        onPause: () => void,\n        onResume: () => void,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n    ): void\n\n    /**\n     * Setup event trigger listeners\n     */\n    setupEventTriggerListeners(\n        onEvent: (callback: (event: CaptureResult) => void) => () => void,\n        sessionId: string,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n    ): (() => void) | undefined\n\n    /**\n     * Make sampling decisions for the session\n     */\n    makeSamplingDecisions(sessionId: string): void\n\n    /**\n     * Called after the initial buffer flush (performance optimization hook)\n     */\n    onFlushComplete(): void\n\n    /**\n     * Clean up persistence keys for conditional recording\n     */\n    clearConditionalRecordingPersistence(): void\n\n    /**\n     * Update session properties with active trigger information\n     */\n    updateActiveTriggers(sessionId: string): void\n\n    /**\n     * Check if triggers are in pending state (waiting for activation)\n     */\n    hasPendingTriggers(sessionId: string): boolean\n\n    /**\n     * Stop and cleanup the strategy\n     */\n    stop(): void\n}\n\n/**\n * V1 Strategy: Legacy trigger matching with global URL/Event/Flag triggers\n */\nexport class V1RecordingStrategy implements RecordingStrategy {\n    private _triggerStatusMatcher: TriggerStatusMatching | undefined\n    private _removeEventTriggerCaptureHook: (() => void) | undefined\n    private _sampleRate: number | null = null\n    private _recordingStatusFunction: typeof anyMatchSessionRecordingStatus = allMatchSessionRecordingStatus\n\n    constructor(\n        private readonly _instance: PostHog,\n        private readonly _urlTriggerMatching: URLTriggerMatching,\n        private readonly _eventTriggerMatching: EventTriggerMatching,\n        private readonly _linkedFlagMatching: LinkedFlagMatching,\n        private readonly _reportStarted: (reason: SessionStartReason, payload?: Record<string, any>) => void,\n        private readonly _tryTakeFullSnapshot: () => void\n    ) {}\n\n    onRemoteConfig(config: SessionRecordingPersistedConfig): void {\n        this._sampleRate = isNumber(config.sampleRate) ? config.sampleRate : null\n\n        // Setup trigger matching strategy (AND vs OR)\n        if (config.triggerMatchType === 'any') {\n            this._triggerStatusMatcher = new OrTriggerMatching([this._eventTriggerMatching, this._urlTriggerMatching])\n            this._recordingStatusFunction = anyMatchSessionRecordingStatus\n        } else {\n            // either the setting is \"ALL\" or we default to the most restrictive\n            this._triggerStatusMatcher = new AndTriggerMatching([this._eventTriggerMatching, this._urlTriggerMatching])\n            this._recordingStatusFunction = allMatchSessionRecordingStatus\n        }\n\n        this._instance.register_for_session({\n            [SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG]: config.triggerMatchType,\n        })\n\n        this._urlTriggerMatching.onConfig(config)\n        this._eventTriggerMatching.onConfig(config)\n\n        this._linkedFlagMatching.onConfig(config, (flag, variant) => {\n            this._reportStarted('linked_flag_matched', { flag, variant })\n        })\n    }\n\n    getStatus(context: RecordingStrategyContext): SessionRecordingStatus {\n        return this._recordingStatusFunction({\n            receivedFlags: true,\n            isRecordingEnabled: true,\n            isSampled: context.isSampled,\n            rrwebError: context.rrwebError,\n            urlTriggerMatching: context.urlTriggerMatching,\n            eventTriggerMatching: context.eventTriggerMatching,\n            linkedFlagMatching: context.linkedFlagMatching,\n            sessionId: context.sessionId,\n        })\n    }\n\n    getMinimumDuration(sessionId: string): number | null {\n        // V1: Minimum duration is global from config, doesn't need sessionId\n        void sessionId\n        const config = this._instance.get_property('$session_recording_remote_config') as\n            | SessionRecordingPersistedConfig\n            | undefined\n        const duration = config?.minimumDurationMilliseconds\n        return isNumber(duration) ? duration : null\n    }\n\n    checkUrlTriggers(\n        sessionId: string,\n        onPause: () => void,\n        onResume: () => void,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n    ): void {\n        this._urlTriggerMatching.checkUrlTriggerConditions(onPause, onResume, onActivate, sessionId)\n    }\n\n    setupEventTriggerListeners(\n        onEvent: (callback: (event: CaptureResult) => void) => () => void,\n        sessionId: string,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n    ): (() => void) | undefined {\n        if (this._eventTriggerMatching._eventTriggers.length === 0 || !isNullish(this._removeEventTriggerCaptureHook)) {\n            return undefined\n        }\n\n        this._removeEventTriggerCaptureHook = onEvent((event: CaptureResult) => {\n            try {\n                this._eventTriggerMatching.checkEventTriggerConditions(event.event, onActivate, sessionId)\n            } catch (e) {\n                logger.error('Could not activate event trigger', e)\n            }\n        })\n\n        return this._removeEventTriggerCaptureHook\n    }\n\n    makeSamplingDecisions(sessionId: string): void {\n        const currentSampleRate = this._sampleRate\n\n        if (!isNumber(currentSampleRate)) {\n            this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n            return\n        }\n\n        const storedValue = this._instance.get_property(SESSION_RECORDING_IS_SAMPLED)\n\n        // Parse stored decision:\n        // - sessionId string = sampled in for that session\n        // - false = sampled out (persistent across navigations in same session)\n        // - undefined/null = no decision yet\n        const storedIsSampled = storedValue === sessionId ? true : storedValue === false ? false : null\n\n        // Make new decision only if:\n        // 1. No stored decision exists (storedIsSampled is null/undefined), OR\n        // 2. Session changed (stored sessionId doesn't match current)\n        const sessionChanged = typeof storedValue === 'string' && storedValue !== sessionId\n        const makeDecision = sessionChanged || !isBoolean(storedIsSampled)\n        const shouldSample = makeDecision ? sampleOnProperty(sessionId, currentSampleRate) : storedIsSampled!\n\n        if (makeDecision) {\n            if (shouldSample) {\n                this._reportStarted('sampled')\n            } else {\n                logger.warn(\n                    `Sample rate (${currentSampleRate}) has determined that this sessionId (${sessionId}) will not be sent to the server.`\n                )\n            }\n        }\n\n        this._instance.persistence?.register({\n            [SESSION_RECORDING_IS_SAMPLED]: shouldSample ? sessionId : false,\n        })\n    }\n\n    onFlushComplete(): void {\n        // V1 doesn't use this optimization\n    }\n\n    clearConditionalRecordingPersistence(): void {\n        this._instance.persistence?.unregister(SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION)\n        this._instance.persistence?.unregister(SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION)\n        this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n        this._instance.persistence?.unregister(SESSION_RECORDING_PAST_MINIMUM_DURATION)\n    }\n\n    updateActiveTriggers(sessionId: string): void {\n        void sessionId\n        // V1 doesn't track active triggers in session properties\n    }\n\n    hasPendingTriggers(sessionId: string): boolean {\n        return this._triggerStatusMatcher?.triggerStatus(sessionId) === TRIGGER_PENDING\n    }\n\n    stop(): void {\n        this._removeEventTriggerCaptureHook?.()\n        this._removeEventTriggerCaptureHook = undefined\n        this._eventTriggerMatching.stop()\n        this._urlTriggerMatching.stop()\n        this._linkedFlagMatching.stop()\n    }\n}\n\n/**\n * V2 Strategy: Trigger groups with per-group sampling and union behavior\n */\nexport class V2TriggerGroupStrategy implements RecordingStrategy {\n    private _triggerGroupMatchers: TriggerGroupMatching[] = []\n    private _triggerGroupSamplingResults: Map<string, boolean> = new Map()\n    private _hasCompletedInitialFlush: boolean = false\n    private _removeEventTriggerCaptureHook: (() => void) | undefined\n\n    constructor(\n        private readonly _instance: PostHog,\n        private readonly _urlTriggerMatching: URLTriggerMatching,\n        private readonly _reportStarted: (reason: SessionStartReason, payload?: Record<string, any>) => void,\n        private readonly _tryAddCustomEvent: (tag: string, payload: any) => void\n    ) {}\n\n    onRemoteConfig(config: SessionRecordingPersistedConfig): void {\n        if (!config.triggerGroups || config.triggerGroups.length === 0) {\n            logger.warn('[V2Strategy] No trigger groups configured')\n            return\n        }\n\n        // Setup trigger group matchers\n        this._setupTriggerGroups(config.triggerGroups)\n\n        this._instance.register_for_session({\n            [SDK_DEBUG_REPLAY_REMOTE_TRIGGER_MATCHING_CONFIG]: 'v2_trigger_groups',\n            [SDK_DEBUG_REPLAY_TRIGGER_GROUPS_COUNT]: config.triggerGroups.length,\n        })\n\n        // V2 needs URL blocklist (but not URL triggers)\n        this._urlTriggerMatching.onConfig(config)\n    }\n\n    getStatus(context: RecordingStrategyContext): SessionRecordingStatus {\n        return triggerGroupsMatchSessionRecordingStatus({\n            receivedFlags: true,\n            isRecordingEnabled: true,\n            isSampled: context.isSampled,\n            rrwebError: context.rrwebError,\n            urlTriggerMatching: context.urlTriggerMatching,\n            eventTriggerMatching: context.eventTriggerMatching,\n            linkedFlagMatching: context.linkedFlagMatching,\n            sessionId: context.sessionId,\n            triggerGroupMatchers: this._triggerGroupMatchers,\n            triggerGroupSamplingResults: this._triggerGroupSamplingResults,\n            minimumDuration: this.getMinimumDuration(context.sessionId),\n        } as RecordingTriggersStatusV2)\n    }\n\n    getMinimumDuration(sessionId: string): number | null {\n        let lowestDuration: number | null = null\n\n        for (const matcher of this._triggerGroupMatchers) {\n            const groupStatus = matcher.triggerStatus(sessionId)\n\n            // Only consider activated groups - pending groups haven't triggered yet\n            if (groupStatus === 'trigger_activated') {\n                const groupDuration = matcher.group.minDurationMs\n                if (isNumber(groupDuration)) {\n                    if (isNull(lowestDuration) || groupDuration < lowestDuration) {\n                        lowestDuration = groupDuration\n                    }\n                }\n            }\n        }\n\n        return lowestDuration\n    }\n\n    checkUrlTriggers(\n        sessionId: string,\n        onPause: () => void,\n        onResume: () => void,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n    ): void {\n        // V2 doesn't use the global onActivate callback - each group activates itself\n        void onActivate\n\n        // Check URL blocklist (global, not per-group)\n        this._urlTriggerMatching.checkUrlBlocklist(onPause, onResume)\n\n        // Check URL triggers for each group\n        for (const matcher of this._triggerGroupMatchers) {\n            matcher.checkUrlTriggerConditions(\n                onPause,\n                onResume,\n                (triggerType) => {\n                    // Check group-level property filters before activating\n                    if (!this._checkGroupLevelProperties(matcher, undefined)) {\n                        return\n                    }\n\n                    matcher.activateTrigger(triggerType, sessionId)\n                    this.updateActiveTriggers(sessionId)\n                },\n                sessionId\n            )\n        }\n    }\n\n    setupEventTriggerListeners(\n        onEvent: (callback: (event: CaptureResult) => void) => () => void,\n        sessionId: string,\n        onActivate: (triggerType: TriggerType, matchDetail?: string) => void\n    ): (() => void) | undefined {\n        // V2 doesn't use the global onActivate callback - each group activates itself\n        void onActivate\n\n        this._removeEventTriggerCaptureHook = onEvent((event: CaptureResult) => {\n            // Performance optimization: Stop checking triggers after initial buffer flush\n            if (this._hasCompletedInitialFlush) {\n                logger.info('[SessionRecorder] Stopping trigger checks - initial buffer flushed')\n                this._removeEventTriggerCaptureHook?.()\n                this._removeEventTriggerCaptureHook = undefined\n                return\n            }\n\n            try {\n                // V2: Each group activates its own trigger with per-group persistence\n                for (const matcher of this._triggerGroupMatchers) {\n                    matcher.checkEventTriggerConditions(\n                        event.event,\n                        (triggerType) => {\n                            // Check group-level property filters\n                            if (!this._checkGroupLevelProperties(matcher, event.properties)) {\n                                return\n                            }\n\n                            // Check per-event property filters.\n                            // A group may contain multiple entries for the same event name with\n                            // different property filters — e.g. \"purchase amount > 100\" OR\n                            // \"purchase by a VIP\". Treat same-name entries as a disjunction:\n                            // activate if *any* matching clause's filters pass. An entry with no\n                            // properties is treated as an unconditional match (matching V1).\n                            const matchedTriggers = (matcher.group.conditions.events || []).filter(\n                                (t) => t.name === event.event\n                            )\n                            const personProperties = this._instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n                            const anyMatched = matchedTriggers.some(\n                                (t) =>\n                                    !t.properties ||\n                                    t.properties.length === 0 ||\n                                    matchTriggerPropertyFilters(t.properties, event.properties, personProperties)\n                            )\n                            if (!anyMatched) {\n                                return\n                            }\n\n                            matcher.activateTrigger(triggerType, sessionId)\n                            this.updateActiveTriggers(sessionId)\n                        },\n                        sessionId\n                    )\n                }\n            } catch (e) {\n                logger.error('Could not activate event trigger for trigger groups', e)\n            }\n        })\n\n        return this._removeEventTriggerCaptureHook\n    }\n\n    makeSamplingDecisions(sessionId: string): void {\n        for (const matcher of this._triggerGroupMatchers) {\n            const group = matcher.group\n            const groupId = group.id\n            const sampleRate = group.sampleRate\n\n            // Check if we have a stored decision for this group\n            const storageKey = SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX + groupId\n            const storedValue = this._instance.get_property(storageKey)\n\n            // Parse stored decision:\n            // - sessionId string = sampled in for that session\n            // - false = sampled out (persistent across navigations in same session)\n            // - undefined/null = no decision yet\n            const storedDecision = storedValue === sessionId ? true : storedValue === false ? false : null\n\n            // Make new decision only if:\n            // 1. No stored decision exists (storedDecision is null/undefined), OR\n            // 2. Session changed (stored sessionId doesn't match current)\n            const sessionChanged = typeof storedValue === 'string' && storedValue !== sessionId\n            const makeDecision = sessionChanged || !isBoolean(storedDecision)\n            const shouldSample = makeDecision ? sampleOnProperty(sessionId + groupId, sampleRate) : storedDecision!\n\n            if (makeDecision) {\n                this._tryAddCustomEvent('triggerGroupSamplingDecisionMade', {\n                    group_id: groupId,\n                    group_name: group.name,\n                    sampleRate: sampleRate,\n                    isSampled: shouldSample,\n                })\n            }\n\n            // Store the decision\n            this._triggerGroupSamplingResults.set(groupId, shouldSample)\n            this._instance.persistence?.register({\n                [storageKey]: shouldSample ? sessionId : false,\n            })\n        }\n\n        // After all sampling decisions, register which groups are actively recording\n        this.updateActiveTriggers(sessionId)\n    }\n\n    onFlushComplete(): void {\n        this._hasCompletedInitialFlush = true\n    }\n\n    clearConditionalRecordingPersistence(): void {\n        this._instance.persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n        this._instance.persistence?.unregister(SESSION_RECORDING_PAST_MINIMUM_DURATION)\n\n        // V2: Clear per-group trigger keys\n        for (const matcher of this._triggerGroupMatchers) {\n            const groupId = matcher.group.id\n            this._instance.persistence?.unregister(SESSION_RECORDING_TRIGGER_V2_GROUP_EVENT_PREFIX + groupId)\n            this._instance.persistence?.unregister(SESSION_RECORDING_TRIGGER_V2_GROUP_URL_PREFIX + groupId)\n            this._instance.persistence?.unregister(SESSION_RECORDING_TRIGGER_V2_GROUP_SAMPLING_PREFIX + groupId)\n        }\n    }\n\n    updateActiveTriggers(sessionId: string): void {\n        const recordingGroups: Array<{ id: string; name: string; matched: boolean; sampled: boolean }> = []\n\n        for (const matcher of this._triggerGroupMatchers) {\n            const group = matcher.group\n            const groupId = group.id\n            const triggerStatus = matcher.triggerStatus(sessionId)\n            const isMatched = triggerStatus === 'trigger_activated'\n            const isSampled = this._triggerGroupSamplingResults.get(groupId) === true\n\n            if (isMatched) {\n                recordingGroups.push({\n                    id: groupId,\n                    name: group.name,\n                    matched: true,\n                    sampled: isSampled,\n                })\n            }\n        }\n\n        this._instance.register_for_session({\n            [SDK_DEBUG_REPLAY_MATCHED_RECORDING_TRIGGER_GROUPS]: recordingGroups,\n        })\n    }\n\n    hasPendingTriggers(sessionId: string): boolean {\n        // V2: Check if any group has pending triggers\n        for (const matcher of this._triggerGroupMatchers) {\n            if (matcher.triggerStatus(sessionId) === TRIGGER_PENDING) {\n                return true\n            }\n        }\n        return false\n    }\n\n    stop(): void {\n        this._removeEventTriggerCaptureHook?.()\n        this._removeEventTriggerCaptureHook = undefined\n        this._triggerGroupMatchers.forEach((matcher) => matcher.stop())\n        this._triggerGroupMatchers = []\n        this._triggerGroupSamplingResults.clear()\n        this._urlTriggerMatching.stop()\n    }\n\n    private _checkGroupLevelProperties(\n        matcher: TriggerGroupMatching,\n        eventProperties: Record<string, any> | undefined\n    ): boolean {\n        const groupProperties = matcher.group.conditions.properties\n        if (!groupProperties || groupProperties.length === 0) {\n            return true\n        }\n        const personProperties = this._instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n        return matchTriggerPropertyFilters(groupProperties, eventProperties, personProperties)\n    }\n\n    private _setupTriggerGroups(groups: SessionRecordingTriggerGroup[]) {\n        // Clean up existing matchers\n        this._triggerGroupMatchers.forEach((matcher) => matcher.stop())\n        this._triggerGroupMatchers = []\n        this._triggerGroupSamplingResults.clear()\n\n        // Create a matcher for each group\n        for (const group of groups) {\n            const matcher = new TriggerGroupMatching(this._instance, group, (flag, variant) => {\n                this._reportStarted('linked_flag_matched', {\n                    flag,\n                    variant,\n                    group_id: group.id,\n                    group_name: group.name,\n                })\n            })\n            this._triggerGroupMatchers.push(matcher)\n        }\n    }\n}\n", "import type { recordOptions, rrwebRecord as rrwebRecordType } from '../types/rrweb'\nimport {\n    type customEvent,\n    EventType,\n    eventWithTime,\n    IncrementalSource,\n    type listenerHandler,\n    RecordPlugin,\n} from '../types/rrweb-types'\nimport { buildNetworkRequestOptions } from './config'\nimport {\n    ACTIVE,\n    BUFFERING,\n    DISABLED,\n    EventTriggerMatching,\n    LinkedFlagMatching,\n    PAUSED,\n    SessionRecordingStatus,\n    TriggerType,\n    URLTriggerMatching,\n} from './triggerMatching'\nimport {\n    estimateCompressedEventSize,\n    estimateSize,\n    INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n    truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nimport { gzipSync, strFromU8, strToU8 } from 'fflate'\nimport { assignableWindow, LazyLoadedSessionRecordingInterface, window, document } from '../../../utils/globals'\nimport { addEventListener } from '../../../utils'\nimport { MutationThrottler } from './mutation-throttler'\nimport { createLogger } from '../../../utils/logger'\nimport {\n    clampToRange,\n    isArray,\n    isBoolean,\n    isFunction,\n    isNull,\n    isNullish,\n    isNumber,\n    isObject,\n    isString,\n    isUndefined,\n} from '@posthog/core'\nimport {\n    SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP,\n    SESSION_RECORDING_IS_SAMPLED,\n    SESSION_RECORDING_OVERRIDE_SAMPLING,\n    SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n    SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n    SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n    SESSION_RECORDING_PAST_MINIMUM_DURATION,\n    SESSION_RECORDING_REMOTE_CONFIG,\n    SESSION_RECORDING_START_REASON,\n    SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION,\n    SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION,\n} from '../../../constants'\nimport { PostHog } from '../../../posthog-core'\nimport {\n    NetworkRecordOptions,\n    PerformanceCaptureConfig,\n    Properties,\n    SessionIdChangedCallback,\n    SessionRecordingOptions,\n    SessionRecordingPersistedConfig,\n    SessionStartReason,\n} from '../../../types'\nimport { isLocalhost } from '../../../utils/request-utils'\nimport Config from '../../../config'\nimport { FlushedSizeTracker } from './flushed-size-tracker'\nimport {\n    RecordingStrategy,\n    V1RecordingStrategy,\n    V2TriggerGroupStrategy,\n    RecordingStrategyContext,\n} from './recording-strategies'\n\nconst BASE_ENDPOINT = '/s/'\nconst DEFAULT_CANVAS_QUALITY = 0.4\nconst DEFAULT_CANVAS_FPS = 4\nconst MAX_CANVAS_FPS = 12\nconst MAX_CANVAS_QUALITY = 1\nconst TWO_SECONDS = 2000\nconst ONE_KB = 1024\n\nconst ONE_MINUTE = 1000 * 60\nconst FIVE_MINUTES = ONE_MINUTE * 5\nconst ONE_HOUR = ONE_MINUTE * 60\n\n/**\n * Extracts the network_timing value from a capturePerformance config.\n * Returns `true`/`false` if explicitly set, or `undefined` if not specified.\n */\nfunction networkTimingFromConfig(config: boolean | PerformanceCaptureConfig | undefined): boolean | undefined {\n    return isObject(config) ? config.network_timing : config\n}\n\nexport const RECORDING_IDLE_THRESHOLD_MS = FIVE_MINUTES\nexport const RECORDING_REMOTE_CONFIG_TTL_MS = ONE_HOUR\nexport const RECORDING_MAX_EVENT_SIZE = ONE_KB * ONE_KB * 0.9 // ~1mb (with some wiggle room)\nexport const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds\nexport const SESSION_RECORDING_BATCH_KEY = 'recordings'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\ninterface QueuedRRWebEvent {\n    rrwebMethod: () => void\n    attempt: number\n    // the timestamp this was first put into this queue\n    enqueuedAt: number\n}\n\ninterface SessionIdlePayload {\n    eventTimestamp: number\n    lastActivityTimestamp: number\n    threshold: number\n    bufferLength: number\n    bufferSize: number\n}\n\nexport interface SnapshotBuffer {\n    size: number\n    data: any[]\n    sizes: number[]\n    sessionId: string\n    windowId: string\n}\n\nconst ACTIVE_SOURCES: IncrementalSource[] = [\n    IncrementalSource.MouseMove,\n    IncrementalSource.MouseInteraction,\n    IncrementalSource.Scroll,\n    IncrementalSource.ViewportResize,\n    IncrementalSource.Input,\n    IncrementalSource.TouchMove,\n    IncrementalSource.MediaInteraction,\n    IncrementalSource.Drag,\n]\n\nconst newQueuedEvent = (rrwebMethod: () => void): QueuedRRWebEvent => ({\n    rrwebMethod,\n    enqueuedAt: Date.now(),\n    attempt: 1,\n})\n\nfunction getRRWeb() {\n    return assignableWindow?.__PosthogExtensions__?.rrweb\n}\n\nfunction getRRWebRecord(): rrwebRecordType | undefined {\n    return getRRWeb()?.record\n}\n\nexport type compressedFullSnapshotEvent = {\n    type: typeof EventType.FullSnapshot\n    data: string\n}\n\nexport type compressedIncrementalSnapshotEvent = {\n    type: typeof EventType.IncrementalSnapshot\n    data: {\n        source: IncrementalSource\n        texts: string\n        attributes: string\n        removes: string\n        adds: string\n    }\n}\n\nexport type compressedIncrementalStyleSnapshotEvent = {\n    type: typeof EventType.IncrementalSnapshot\n    data: {\n        source: typeof IncrementalSource.StyleSheetRule\n        id?: number\n        styleId?: number\n        replace?: string\n        replaceSync?: string\n        adds?: string\n        removes?: string\n    }\n}\n\nexport type compressedEvent =\n    | compressedIncrementalStyleSnapshotEvent\n    | compressedFullSnapshotEvent\n    | compressedIncrementalSnapshotEvent\nexport type compressedEventWithTime = compressedEvent & {\n    timestamp: number\n    delay?: number\n    // marker for compression version\n    cv: '2024-10'\n}\n\nfunction gzipToString(data: unknown): string {\n    return strFromU8(gzipSync(strToU8(JSON.stringify(data))), true)\n}\n\nlet _gzippedEmptyArray: string | undefined\n\nfunction gzipField(data: unknown): string {\n    if (isArray(data) && data.length === 0) {\n        _gzippedEmptyArray = _gzippedEmptyArray ?? gzipToString([])\n        return _gzippedEmptyArray\n    }\n    return gzipToString(data)\n}\n\n/**\n * rrweb's packer takes an event and returns a string or the reverse on `unpack`.\n * but we want to be able to inspect metadata during ingestion.\n * and don't want to compress the entire event,\n * so we have a custom packer that only compresses part of some events\n *\n * returns the compressed event and its estimated JSON size,\n * avoiding a redundant JSON.stringify for size estimation\n */\nfunction compressEvent(event: eventWithTime): { event: eventWithTime | compressedEventWithTime; size: number } {\n    try {\n        if (event.type === EventType.FullSnapshot) {\n            const compressed = {\n                ...event,\n                data: gzipToString(event.data),\n                cv: '2024-10' as const,\n            }\n            return { event: compressed, size: estimateCompressedEventSize(compressed) }\n        }\n        if (event.type === EventType.IncrementalSnapshot && event.data.source === IncrementalSource.Mutation) {\n            const compressed = {\n                ...event,\n                cv: '2024-10' as const,\n                data: {\n                    ...event.data,\n                    texts: gzipField(event.data.texts),\n                    attributes: gzipField(event.data.attributes),\n                    removes: gzipField(event.data.removes),\n                    adds: gzipField(event.data.adds),\n                },\n            }\n            return { event: compressed, size: estimateCompressedEventSize(compressed) }\n        }\n        if (event.type === EventType.IncrementalSnapshot && event.data.source === IncrementalSource.StyleSheetRule) {\n            const compressed = {\n                ...event,\n                cv: '2024-10' as const,\n                data: {\n                    ...event.data,\n                    adds: event.data.adds ? gzipToString(event.data.adds) : undefined,\n                    removes: event.data.removes ? gzipToString(event.data.removes) : undefined,\n                },\n            }\n            return { event: compressed, size: estimateCompressedEventSize(compressed) }\n        }\n    } catch (e) {\n        logger.error('could not compress event - will use uncompressed event', e)\n    }\n    return { event, size: estimateSize(event) }\n}\n\nfunction isCustomEvent(e: eventWithTime, tag: string): e is eventWithTime & customEvent {\n    return e.type === EventType.Custom && e.data.tag === tag\n}\n\nfunction isSessionIdleEvent(e: eventWithTime): e is eventWithTime & customEvent {\n    return isCustomEvent(e, 'sessionIdle')\n}\n\ntype SessionEndingPayload = {\n    lastActivityTimestamp?: number\n    currentSessionId?: string\n    currentWindowId?: string\n}\n\nfunction isSessionEndingEvent(e: eventWithTime): e is eventWithTime & customEvent {\n    return isCustomEvent(e, '$session_ending')\n}\n\nfunction getSessionEndingPayload(e: eventWithTime): SessionEndingPayload | null {\n    return isSessionEndingEvent(e) ? (e.data.payload as SessionEndingPayload) : null\n}\n\ntype SessionStartingPayload = {\n    lastActivityTimestamp?: number\n    nextSessionId?: string\n    nextWindowId?: string\n}\n\nfunction isSessionStartingEvent(e: eventWithTime): e is eventWithTime & customEvent {\n    return isCustomEvent(e, '$session_starting')\n}\n\nfunction getSessionStartingPayload(e: eventWithTime): SessionStartingPayload | null {\n    return isSessionStartingEvent(e) ? (e.data.payload as SessionStartingPayload) : null\n}\n\nfunction isAllowedWhenIdle(e: eventWithTime): boolean {\n    return isSessionIdleEvent(e) || isSessionEndingEvent(e) || isSessionStartingEvent(e)\n}\n\n/** When we put the recording into a paused state, we add a custom event.\n *  However, in the paused state, events are dropped and never make it to the buffer,\n *  so we need to manually let this one through */\nfunction isRecordingPausedEvent(e: eventWithTime) {\n    return e.type === EventType.Custom && e.data.tag === 'recording paused'\n}\n\nexport const SEVEN_MEGABYTES = 1024 * 1024 * 7 * 0.9 // ~7mb (with some wiggle room)\n\n// recursively splits large buffers into smaller ones\n// uses a pretty high size limit to avoid splitting too much\nexport function splitBuffer(buffer: SnapshotBuffer, sizeLimit: number = SEVEN_MEGABYTES): SnapshotBuffer[] {\n    if (buffer.size >= sizeLimit && buffer.data.length > 1) {\n        const half = Math.floor(buffer.data.length / 2)\n        const firstHalfSizes = buffer.sizes.slice(0, half)\n        const secondHalfSizes = buffer.sizes.slice(half)\n        return [\n            splitBuffer({\n                size: firstHalfSizes.reduce((a, b) => a + b, 0),\n                data: buffer.data.slice(0, half),\n                sizes: firstHalfSizes,\n                sessionId: buffer.sessionId,\n                windowId: buffer.windowId,\n            }),\n            splitBuffer({\n                size: secondHalfSizes.reduce((a, b) => a + b, 0),\n                data: buffer.data.slice(half),\n                sizes: secondHalfSizes,\n                sessionId: buffer.sessionId,\n                windowId: buffer.windowId,\n            }),\n        ].flatMap((x) => x)\n    } else {\n        return [buffer]\n    }\n}\n\nexport class LazyLoadedSessionRecording implements LazyLoadedSessionRecordingInterface {\n    private _endpoint: string = BASE_ENDPOINT\n    private _mutationThrottler?: MutationThrottler\n    /**\n     * Util to help developers working on this feature manually override\n     */\n    private _forceAllowLocalhostNetworkCapture = false\n    private _stopRrweb: listenerHandler | undefined = undefined\n    private _lastActivityTimestamp: number = Date.now()\n    private _isActivatingTrigger: boolean = false\n    /**\n     * if pageview capture is disabled,\n     * then we can manually track href changes\n     */\n    private _lastHref?: string\n    /**\n     * and a queue - that contains rrweb events that we want to send to rrweb, but rrweb wasn't able to accept them yet\n     */\n    private _queuedRRWebEvents: QueuedRRWebEvent[] = []\n    private _isIdle: boolean | 'unknown' = 'unknown'\n    private _rrwebError = false\n    private _maxDepthExceeded = false\n\n    private _linkedFlagMatching: LinkedFlagMatching\n    private _urlTriggerMatching: URLTriggerMatching\n    private _eventTriggerMatching: EventTriggerMatching\n    // Strategy pattern: V1 vs V2 trigger logic\n    private _strategy: RecordingStrategy | undefined\n    private _fullSnapshotTimer?: ReturnType<typeof setInterval>\n    private _fullSnapshotTimestamps: Array<[string, number]> = []\n\n    private _windowId: string\n    private _sessionId: string\n    get sessionId(): string {\n        return this._sessionId\n    }\n\n    private _flushBufferTimer?: any\n    // we have a buffer - that contains PostHog snapshot events ready to be sent to the server\n    private _buffer: SnapshotBuffer\n\n    private _removePageViewCaptureHook: (() => void) | undefined = undefined\n\n    private _removeEventTriggerCaptureHook: (() => void) | undefined = undefined\n\n    private _flushedSizeTracker: FlushedSizeTracker\n\n    private get _sessionManager() {\n        if (!this._instance.sessionManager) {\n            throw new Error(LOGGER_PREFIX + ' must be started with a valid sessionManager.')\n        }\n\n        return this._instance.sessionManager\n    }\n\n    private get _sessionIdleThresholdMilliseconds(): number {\n        return this._instance.config.session_recording.session_idle_threshold_ms || RECORDING_IDLE_THRESHOLD_MS\n    }\n\n    private get _isSampled(): boolean | null {\n        const currentValue = this._instance.get_property(SESSION_RECORDING_IS_SAMPLED)\n        // we store the session id when sampled so that we can detect session id changes\n        // and `false` when not sampled\n        // legacy SDKs stored `true` when sampled, but that is not tied to a session id\n        // so we treat it as null (unknown) and will make a fresh decision\n        if (currentValue === true) {\n            return null\n        }\n        return currentValue === false ? false : isString(currentValue) ? currentValue === this.sessionId : null\n    }\n\n    private get _sampleRate(): number | null {\n        const rate = this._remoteConfig?.sampleRate\n        return isNumber(rate) ? rate : null\n    }\n\n    private get _minimumDuration(): number | null {\n        return this._strategy?.getMinimumDuration(this.sessionId) ?? null\n    }\n\n    private _onSessionIdListener: (() => void) | undefined = undefined\n    private _onSessionIdleResetForcedListener: (() => void) | undefined = undefined\n    private _samplingSessionListener: (() => void) | undefined = undefined\n    private _forceIdleSessionIdListener: (() => void) | undefined = undefined\n\n    constructor(private readonly _instance: PostHog) {\n        // we know there's a sessionManager, so don't need to start without a session id\n        const { sessionId, windowId } = this._sessionManager.checkAndGetSessionAndWindowId()\n        this._sessionId = sessionId\n        this._windowId = windowId\n\n        this._linkedFlagMatching = new LinkedFlagMatching(this._instance)\n        this._urlTriggerMatching = new URLTriggerMatching(this._instance)\n        this._eventTriggerMatching = new EventTriggerMatching(this._instance)\n\n        this._buffer = this._clearBuffer()\n\n        if (this._sessionIdleThresholdMilliseconds >= this._sessionManager.sessionTimeoutMs) {\n            logger.warn(\n                `session_idle_threshold_ms (${this._sessionIdleThresholdMilliseconds}) is greater than the session timeout (${this._sessionManager.sessionTimeoutMs}). Session will never be detected as idle`\n            )\n        }\n\n        this._flushedSizeTracker = new FlushedSizeTracker(this._instance)\n    }\n\n    private get _masking():\n        | Pick<SessionRecordingOptions, 'maskAllInputs' | 'maskTextSelector' | 'blockSelector'>\n        | undefined {\n        const masking_server_side = this._remoteConfig?.masking\n        const masking_client_side = {\n            maskAllInputs: this._instance.config.session_recording?.maskAllInputs,\n            maskTextSelector: this._instance.config.session_recording?.maskTextSelector,\n            blockSelector: this._instance.config.session_recording?.blockSelector,\n        }\n\n        const maskAllInputs = masking_client_side?.maskAllInputs ?? masking_server_side?.maskAllInputs\n        const maskTextSelector = masking_client_side?.maskTextSelector ?? masking_server_side?.maskTextSelector\n        const blockSelector = masking_client_side?.blockSelector ?? masking_server_side?.blockSelector\n\n        return !isUndefined(maskAllInputs) || !isUndefined(maskTextSelector) || !isUndefined(blockSelector)\n            ? {\n                  maskAllInputs: maskAllInputs ?? true,\n                  maskTextSelector,\n                  blockSelector,\n              }\n            : undefined\n    }\n\n    private get _canvasRecording(): { enabled: boolean; fps: number; quality: number } {\n        const canvasRecording_client_side = this._instance.config.session_recording.captureCanvas\n        const canvasRecording_server_side = this._remoteConfig?.canvasRecording\n\n        const enabled: boolean =\n            canvasRecording_client_side?.recordCanvas ?? canvasRecording_server_side?.enabled ?? false\n        const fps: number =\n            canvasRecording_client_side?.canvasFps ?? canvasRecording_server_side?.fps ?? DEFAULT_CANVAS_FPS\n        let quality: string | number =\n            canvasRecording_client_side?.canvasQuality ?? canvasRecording_server_side?.quality ?? DEFAULT_CANVAS_QUALITY\n        if (typeof quality === 'string') {\n            const parsed = parseFloat(quality)\n            quality = isNaN(parsed) ? 0.4 : parsed\n        }\n\n        return {\n            enabled,\n            fps: clampToRange(fps, 0, MAX_CANVAS_FPS, createLogger('canvas recording fps'), DEFAULT_CANVAS_FPS),\n            quality: clampToRange(\n                quality,\n                0,\n                MAX_CANVAS_QUALITY,\n                createLogger('canvas recording quality'),\n                DEFAULT_CANVAS_QUALITY\n            ),\n        }\n    }\n\n    private get _isConsoleLogCaptureEnabled() {\n        const enabled_server_side = !!this._remoteConfig?.consoleLogRecordingEnabled\n        const enabled_client_side = this._instance.config.enable_recording_console_log\n        return enabled_client_side ?? enabled_server_side\n    }\n\n    // network payload capture config has three parts\n    // each can be configured server side or client side\n    private get _networkPayloadCapture():\n        | Pick<NetworkRecordOptions, 'recordHeaders' | 'recordBody' | 'recordPerformance'>\n        | undefined {\n        const networkPayloadCapture_server_side = this._remoteConfig?.networkPayloadCapture\n        const networkPayloadCapture_client_side = {\n            recordHeaders: this._instance.config.session_recording?.recordHeaders,\n            recordBody: this._instance.config.session_recording?.recordBody,\n        }\n        const headersEnabled =\n            networkPayloadCapture_client_side?.recordHeaders || networkPayloadCapture_server_side?.recordHeaders\n        const bodyEnabled =\n            networkPayloadCapture_client_side?.recordBody || networkPayloadCapture_server_side?.recordBody\n        const clientNetworkTiming = networkTimingFromConfig(this._instance.config.capture_performance)\n        const serverNetworkTiming = networkTimingFromConfig(networkPayloadCapture_server_side?.capturePerformance)\n        const networkTimingEnabled = !!(isBoolean(clientNetworkTiming) ? clientNetworkTiming : serverNetworkTiming)\n\n        return headersEnabled || bodyEnabled || networkTimingEnabled\n            ? { recordHeaders: headersEnabled, recordBody: bodyEnabled, recordPerformance: networkTimingEnabled }\n            : undefined\n    }\n\n    private _gatherRRWebPlugins() {\n        const plugins: RecordPlugin[] = []\n\n        const recordConsolePlugin = assignableWindow.__PosthogExtensions__?.rrwebPlugins?.getRecordConsolePlugin\n        if (recordConsolePlugin && this._isConsoleLogCaptureEnabled) {\n            plugins.push(recordConsolePlugin())\n        }\n\n        const networkPlugin = assignableWindow.__PosthogExtensions__?.rrwebPlugins?.getRecordNetworkPlugin\n        if (!!this._networkPayloadCapture && isFunction(networkPlugin)) {\n            const canRecordNetwork = !isLocalhost() || this._forceAllowLocalhostNetworkCapture\n\n            if (canRecordNetwork) {\n                plugins.push(\n                    networkPlugin(buildNetworkRequestOptions(this._instance.config, this._networkPayloadCapture))\n                )\n            } else {\n                logger.info('NetworkCapture not started because we are on localhost.')\n            }\n        }\n\n        return plugins\n    }\n\n    private _maskUrl(url: string): string | undefined {\n        const userSessionRecordingOptions = this._instance.config.session_recording\n\n        // userSessionRecordingOptions.maskNetworkRequestFn is deprecated, fallback to it\n        if (userSessionRecordingOptions.maskCapturedNetworkRequestFn) {\n            const result = userSessionRecordingOptions.maskCapturedNetworkRequestFn({\n                name: url,\n            } as any)\n            // CapturedNetworkRequest uses 'name' for URL, but also check 'url' for compatibility\n            return result?.name ?? (result as any)?.url\n        }\n\n        if (userSessionRecordingOptions.maskNetworkRequestFn) {\n            const result = userSessionRecordingOptions.maskNetworkRequestFn({\n                url,\n            })\n            return result?.url\n        }\n\n        return url\n    }\n\n    private _tryRRWebMethod(queuedRRWebEvent: QueuedRRWebEvent): boolean {\n        try {\n            queuedRRWebEvent.rrwebMethod()\n            return true\n        } catch (e) {\n            // Sometimes a race can occur where the recorder is not fully started yet\n            if (this._queuedRRWebEvents.length < 10) {\n                this._queuedRRWebEvents.push({\n                    enqueuedAt: queuedRRWebEvent.enqueuedAt || Date.now(),\n                    attempt: queuedRRWebEvent.attempt + 1,\n                    rrwebMethod: queuedRRWebEvent.rrwebMethod,\n                })\n            } else {\n                logger.warn('could not emit queued rrweb event.', e, queuedRRWebEvent)\n            }\n\n            return false\n        }\n    }\n\n    private _tryAddCustomEvent(tag: string, payload: any): boolean {\n        return this._tryRRWebMethod(newQueuedEvent(() => getRRWebRecord()!.addCustomEvent(tag, payload)))\n    }\n\n    private _pageViewFallBack() {\n        try {\n            if (this._instance.config.capture_pageview || !window) {\n                return\n            }\n            // Strip hash parameters from URL since they often aren't helpful\n            // Use URL constructor for proper parsing to handle edge cases\n            // recording doesn't run in IE11, so we don't need compat here\n            // eslint-disable-next-line compat/compat\n            const url = new URL(window.location.href)\n            const hrefWithoutHash = url.origin + url.pathname + url.search\n            const currentUrl = this._maskUrl(hrefWithoutHash)\n            if (this._lastHref !== currentUrl) {\n                this._lastHref = currentUrl\n                this._tryAddCustomEvent('$url_changed', { href: currentUrl })\n            }\n        } catch {\n            // If URL processing fails, don't capture anything\n        }\n    }\n\n    private _processQueuedEvents() {\n        if (this._queuedRRWebEvents.length) {\n            // if rrweb isn't ready to accept events earlier, then we queued them up.\n            // now that `emit` has been called rrweb should be ready to accept them.\n            // so, before we process this event, we try our queued events _once_ each\n            // we don't want to risk queuing more things and never exiting this loop!\n            // if they fail here, they'll be pushed into a new queue\n            // and tried on the next loop.\n            // there is a risk of this queue growing in an uncontrolled manner.\n            // so its length is limited elsewhere\n            // for now this is to help us ensure we can capture events that happen\n            // and try to identify more about when it is failing\n            const itemsToProcess = [...this._queuedRRWebEvents]\n            this._queuedRRWebEvents = []\n            itemsToProcess.forEach((queuedRRWebEvent) => {\n                if (Date.now() - queuedRRWebEvent.enqueuedAt <= TWO_SECONDS) {\n                    this._tryRRWebMethod(queuedRRWebEvent)\n                }\n            })\n        }\n    }\n\n    private _tryTakeFullSnapshot(): boolean {\n        return this._tryRRWebMethod(newQueuedEvent(() => getRRWebRecord()!.takeFullSnapshot()))\n    }\n\n    private get _fullSnapshotIntervalMillis(): number {\n        if (this._strategy?.hasPendingTriggers(this.sessionId) && !['sampled', 'active'].includes(this.status)) {\n            return ONE_MINUTE\n        }\n\n        return this._instance.config.session_recording?.full_snapshot_interval_millis ?? FIVE_MINUTES\n    }\n\n    private _scheduleFullSnapshot(): void {\n        if (this._fullSnapshotTimer) {\n            clearInterval(this._fullSnapshotTimer)\n        }\n        // we don't schedule snapshots while idle\n        if (this._isIdle === true) {\n            return\n        }\n\n        const interval = this._fullSnapshotIntervalMillis\n        if (!interval) {\n            return\n        }\n\n        this._fullSnapshotTimer = setInterval(() => {\n            this._tryTakeFullSnapshot()\n        }, interval)\n    }\n\n    private _pauseRecording() {\n        // we check _urlBlocked not status, since more than one thing can affect status\n        if (this._urlTriggerMatching.urlBlocked) {\n            return\n        }\n\n        // we can't flush the buffer here since someone might be starting on a blocked page.\n        // and we need to be sure that we don't record that page,\n        // so we might not get the below custom event, but events will report the paused status.\n        // which will allow debugging of sessions that start on blocked pages\n        this._urlTriggerMatching.urlBlocked = true\n\n        // Clear the snapshot timer since we don't want new snapshots while paused\n        clearInterval(this._fullSnapshotTimer)\n\n        logger.info('recording paused due to URL blocker')\n        this._tryAddCustomEvent('recording paused', { reason: 'url blocker' })\n    }\n\n    private _resumeRecording() {\n        // we check _urlBlocked not status, since more than one thing can affect status\n        if (!this._urlTriggerMatching.urlBlocked) {\n            return\n        }\n\n        this._urlTriggerMatching.urlBlocked = false\n\n        this._tryTakeFullSnapshot()\n        this._scheduleFullSnapshot()\n\n        this._tryAddCustomEvent('recording resumed', { reason: 'left blocked url' })\n        logger.info('recording resumed')\n    }\n\n    private _activateTrigger(triggerType: TriggerType, matchDetail?: string) {\n        // V1 only: V2 uses per-group activation and never calls this method\n        // Prevent re-entry: if we're already activating a trigger, skip to avoid infinite recursion\n        // This can happen when _reportStarted emits custom events that match the trigger condition\n        if (this._isActivatingTrigger) {\n            return\n        }\n\n        if (!this._strategy?.hasPendingTriggers(this.sessionId)) {\n            return\n        }\n\n        this._isActivatingTrigger = true\n        try {\n            // V1: Write trigger activation to persistence\n            // (V2 handles this per-group via TriggerGroupMatching.activateTrigger)\n            const persistenceKey =\n                triggerType === 'url'\n                    ? SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION\n                    : SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION\n\n            this._instance.persistence?.register({\n                [persistenceKey]: this.sessionId,\n            })\n\n            this._strategy?.updateActiveTriggers(this.sessionId)\n\n            this._flushBuffer()\n            this._reportStarted((triggerType + '_trigger_matched') as SessionStartReason, {\n                [triggerType === 'url' ? 'matchedUrl' : 'matchedEvent']: matchDetail,\n            })\n        } finally {\n            this._isActivatingTrigger = false\n        }\n    }\n\n    get isStarted(): boolean {\n        return !!this._stopRrweb\n    }\n\n    get _remoteConfig(): SessionRecordingPersistedConfig | undefined {\n        const persistedConfig: any = this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n        if (!persistedConfig) {\n            return undefined\n        }\n        const parsedConfig = isObject(persistedConfig) ? persistedConfig : JSON.parse(persistedConfig)\n\n        // Only check TTL if recording hasn't started yet\n        // Once started, trust the config until a hard page load\n        if (!this.isStarted) {\n            // default to now so that configs persisted by older SDK versions\n            // (which never set cache_timestamp) are treated as fresh\n            const cacheTimestamp = parsedConfig.cache_timestamp ?? Date.now()\n            if (Date.now() - cacheTimestamp > RECORDING_REMOTE_CONFIG_TTL_MS) {\n                logger.info('persisted remote config for session recording is stale and will be ignored', {\n                    cacheTimestamp,\n                    persistedConfig,\n                })\n                this._instance.persistence?.unregister(SESSION_RECORDING_REMOTE_CONFIG)\n                return undefined\n            }\n        }\n\n        return parsedConfig as SessionRecordingPersistedConfig\n    }\n\n    private _checkOverride(key: string, overrideFunction: () => void, clearOverride: () => void): void {\n        const overrideFlag: boolean = this._instance.get_property(key) as boolean\n        if (overrideFlag) {\n            overrideFunction()\n\n            // Clean up the override flag after applying it\n            clearOverride()\n        }\n    }\n\n    start(startReason?: SessionStartReason) {\n        const config = this._remoteConfig\n        if (!config) {\n            logger.info('remote config must be stored in persistence before recording can start')\n            return\n        }\n\n        // We want to ensure the sessionManager is reset if necessary on loading the recorder\n        const { sessionId, windowId } = this._sessionManager.checkAndGetSessionAndWindowId()\n        this._sessionId = sessionId\n        this._windowId = windowId\n\n        // Reset first full snapshot tracking for the new session\n        this._instance.persistence?.unregister(SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP)\n\n        if (config?.endpoint) {\n            this._endpoint = config?.endpoint\n        }\n\n        // Initialize the appropriate strategy based on config version\n        const isV2 = config?.version === 2 && config?.triggerGroups && config.triggerGroups.length > 0\n\n        if (isV2) {\n            this._strategy = new V2TriggerGroupStrategy(\n                this._instance,\n                this._urlTriggerMatching,\n                this._reportStarted.bind(this),\n                this._tryAddCustomEvent.bind(this)\n            )\n        } else {\n            this._strategy = new V1RecordingStrategy(\n                this._instance,\n                this._urlTriggerMatching,\n                this._eventTriggerMatching,\n                this._linkedFlagMatching,\n                this._reportStarted.bind(this),\n                this._tryTakeFullSnapshot.bind(this)\n            )\n        }\n\n        // Let the strategy configure itself\n        this._strategy.onRemoteConfig(config)\n\n        // Setup event trigger listeners via strategy\n        this._removeEventTriggerCaptureHook?.()\n        this._removeEventTriggerCaptureHook = this._strategy.setupEventTriggerListeners(\n            this._instance.on.bind(this._instance, 'eventCaptured'),\n            this.sessionId,\n            (triggerType, matchDetail) => this._activateTrigger(triggerType, matchDetail)\n        )\n\n        this._checkOverride(\n            SESSION_RECORDING_OVERRIDE_SAMPLING,\n            () => {\n                this.overrideSampling()\n            },\n            () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_SAMPLING)\n        )\n        this._checkOverride(\n            SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n            () => {\n                this.overrideLinkedFlag()\n            },\n            () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_LINKED_FLAG)\n        )\n        this._checkOverride(\n            SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n            () => {\n                this.overrideTrigger('event')\n            },\n            () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER)\n        )\n        this._checkOverride(\n            SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n            () => {\n                this.overrideTrigger('url')\n            },\n            () => this._instance.persistence?.unregister(SESSION_RECORDING_OVERRIDE_URL_TRIGGER)\n        )\n\n        // Let strategy make sampling decisions\n        this._strategy.makeSamplingDecisions(this.sessionId)\n        this._startRecorder()\n\n        if (this._rrwebError) {\n            return\n        }\n\n        // calling addEventListener multiple times is safe and will not add duplicates\n        addEventListener(window, 'beforeunload', this._onBeforeUnload)\n        addEventListener(window, 'offline', this._onOffline)\n        addEventListener(window, 'online', this._onOnline)\n        addEventListener(window, 'visibilitychange', this._onVisibilityChange)\n\n        if (!this._onSessionIdListener) {\n            this._onSessionIdListener = this._sessionManager.onSessionId(this._onSessionIdCallback)\n        }\n\n        if (!this._onSessionIdleResetForcedListener) {\n            this._onSessionIdleResetForcedListener = this._sessionManager.on('forcedIdleReset', () => {\n                // a session was forced to reset due to idle timeout and lack of activity\n                this._clearConditionalRecordingPersistence()\n                this._isIdle = 'unknown'\n                this.stop()\n                // then we want a session id listener to restart the recording when a new session starts\n                this._forceIdleSessionIdListener = this._sessionManager.onSessionId(\n                    (sessionId, windowId, changeReason) => {\n                        // this should first unregister itself\n                        this._forceIdleSessionIdListener?.()\n                        this._forceIdleSessionIdListener = undefined\n                        this._onSessionIdCallback(sessionId, windowId, changeReason)\n                    }\n                )\n            })\n        }\n\n        if (isNullish(this._removePageViewCaptureHook)) {\n            // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n            //   Dropping the initial event is fine (it's always captured by rrweb).\n            this._removePageViewCaptureHook = this._instance.on('eventCaptured', (event) => {\n                // If anything could go wrong here,\n                // it has the potential to block the main loop,\n                // so we catch all errors.\n                try {\n                    if (event.event === '$pageview') {\n                        const href = event?.properties.$current_url ? this._maskUrl(event?.properties.$current_url) : ''\n                        if (!href) {\n                            return\n                        }\n                        this._tryAddCustomEvent('$pageview', { href })\n                    }\n                } catch (e) {\n                    logger.error('Could not add $pageview to rrweb session', e)\n                }\n            })\n        }\n\n        if (this.status === ACTIVE) {\n            this._reportStarted(startReason || 'recording_initialized')\n        }\n    }\n\n    private _onSessionIdCallback: SessionIdChangedCallback = (sessionId, windowId, changeReason) => {\n        if (!changeReason) return\n\n        // Skip if session hasn't actually changed (callback might fire multiple times)\n        if (sessionId === this._sessionId && windowId === this._windowId) {\n            return\n        }\n\n        const wasLikelyReset = changeReason.noSessionId\n        const shouldLinkSessions =\n            !wasLikelyReset && (changeReason.activityTimeout || changeReason.sessionPastMaximumLength)\n\n        // Capture old IDs before start() updates them\n        const oldSessionId = this._sessionId\n        const oldWindowId = this._windowId\n\n        if (shouldLinkSessions) {\n            this._tryAddCustomEvent('$session_ending', {\n                currentSessionId: oldSessionId,\n                currentWindowId: oldWindowId,\n                nextSessionId: sessionId,\n                nextWindowId: windowId,\n                changeReason,\n                // we'll need to correct the time of this if it's captured when idle\n                // so we don't extend reported session time with a debug event\n                lastActivityTimestamp: this._lastActivityTimestamp,\n                flushed_size: this._flushedSizeTracker?.currentTrackedSize,\n            })\n        }\n\n        // reset flushed size tracker after capturing the ending event\n        if (this._flushedSizeTracker) {\n            this._flushedSizeTracker.reset()\n        }\n\n        // Reset first full snapshot timestamp for the new session\n        this._instance.persistence?.unregister(SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP)\n\n        this._maxDepthExceeded = false\n        getRRWeb()?.resetMaxDepthState?.()\n\n        this._tryAddCustomEvent('$session_id_change', { sessionId, windowId, changeReason })\n\n        this._clearConditionalRecordingPersistence()\n\n        // When idle, _updateWindowAndSessionIds bails early and won't pick up the\n        // session change, so we restart here. Otherwise it handles the restart after\n        // this callback returns.\n        if (this._isIdle === true) {\n            this._isIdle = 'unknown'\n            this.stop()\n            this.start('session_id_changed')\n        }\n\n        if (shouldLinkSessions) {\n            this._tryAddCustomEvent('$session_starting', {\n                previousSessionId: oldSessionId,\n                previousWindowId: oldWindowId,\n                nextSessionId: sessionId,\n                nextWindowId: windowId,\n                changeReason,\n                // we'll need to correct the time of this if it's captured when idle\n                // so we don't extend reported session time with a debug event\n                lastActivityTimestamp: this._lastActivityTimestamp,\n            })\n        }\n\n        if (isNumber(this._sampleRate) && isNullish(this._samplingSessionListener)) {\n            this._strategy?.makeSamplingDecisions(sessionId)\n        }\n    }\n\n    private _teardown() {\n        window?.removeEventListener('beforeunload', this._onBeforeUnload)\n        window?.removeEventListener('offline', this._onOffline)\n        window?.removeEventListener('online', this._onOnline)\n        window?.removeEventListener('visibilitychange', this._onVisibilityChange)\n\n        clearInterval(this._fullSnapshotTimer)\n        this._clearFlushBufferTimer()\n\n        this._removePageViewCaptureHook?.()\n        this._removePageViewCaptureHook = undefined\n        this._removeEventTriggerCaptureHook?.()\n        this._removeEventTriggerCaptureHook = undefined\n        this._onSessionIdListener?.()\n        this._onSessionIdListener = undefined\n        this._onSessionIdleResetForcedListener?.()\n        this._onSessionIdleResetForcedListener = undefined\n        this._samplingSessionListener?.()\n        this._samplingSessionListener = undefined\n        this._forceIdleSessionIdListener?.()\n        this._forceIdleSessionIdListener = undefined\n\n        this._strategy?.stop()\n\n        this._mutationThrottler?.stop()\n\n        // Clear any queued rrweb events to prevent memory leaks from closures\n        this._queuedRRWebEvents = []\n\n        this._stopRrweb?.()\n        this._stopRrweb = undefined\n    }\n\n    stop() {\n        this._flushBuffer()\n        this._clearBuffer()\n        this._teardown()\n        logger.info('stopped')\n    }\n\n    discard() {\n        this._clearBuffer()\n        this._teardown()\n        logger.info('discarded')\n    }\n\n    onRRwebEmit(rawEvent: eventWithTime) {\n        this._processQueuedEvents()\n\n        if (!rawEvent || !isObject(rawEvent)) {\n            return\n        }\n\n        if (rawEvent.type === EventType.Meta) {\n            const href = this._maskUrl(rawEvent.data.href)\n            this._lastHref = href\n            if (!href) {\n                return\n            }\n            rawEvent.data.href = href\n        } else {\n            this._pageViewFallBack()\n        }\n\n        // Check if the URL matches any trigger patterns - delegate to strategy\n        this._strategy?.checkUrlTriggers(\n            this.sessionId,\n            () => this._pauseRecording(),\n            () => this._resumeRecording(),\n            (triggerType, matchDetail) => this._activateTrigger(triggerType, matchDetail)\n        )\n\n        // always have to check if the URL is blocked really early,\n        // or you risk getting stuck in a loop\n        if (this._urlTriggerMatching.urlBlocked && !isRecordingPausedEvent(rawEvent)) {\n            return\n        }\n\n        // we're processing a full snapshot, so we should reset the timer\n        if (rawEvent.type === EventType.FullSnapshot) {\n            this._scheduleFullSnapshot()\n            // Full snapshots reset rrweb's node IDs, so clear any logged node tracking\n            this._mutationThrottler?.reset()\n\n            // Track the timestamp of the first full snapshot for this session\n            // This helps us detect session rotation issues where incremental snapshots\n            // are sent before the full snapshot\n            this._instance.persistence?.register_once(\n                {\n                    [SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP]: rawEvent.timestamp,\n                },\n                undefined\n            )\n        }\n\n        // Clear the buffer if waiting for a trigger and only keep data from after the current full snapshot\n        if (rawEvent.type === EventType.FullSnapshot && this._strategy?.hasPendingTriggers(this.sessionId)) {\n            this._clearBufferBeforeMostRecentMeta()\n        }\n\n        const throttledEvent = this._mutationThrottler ? this._mutationThrottler.throttleMutations(rawEvent) : rawEvent\n\n        if (!throttledEvent) {\n            return\n        }\n\n        // TODO: Re-add ensureMaxMessageSize once we are confident in it\n        const event = truncateLargeConsoleLogs(throttledEvent)\n\n        // Session lifecycle events ($session_ending, $session_starting) carry their target session ID\n        // in the payload. We must extract this BEFORE _updateWindowAndSessionIds runs, because that\n        // method triggers checkAndGetSessionAndWindowId() which would update this._sessionId.\n        // This is critical for $session_ending which must go to the OLD session, not the new one,\n        // and for $session_starting which must go to the NEW session.\n        const sessionEndingPayload = getSessionEndingPayload(event)\n        const sessionStartingPayload = getSessionStartingPayload(event)\n\n        if (sessionEndingPayload || sessionStartingPayload) {\n            // Adjust timestamp from payload to avoid artificially extending session duration\n            const payload = (sessionEndingPayload ?? sessionStartingPayload) as {\n                lastActivityTimestamp?: number\n            }\n            if (payload?.lastActivityTimestamp) {\n                event.timestamp = payload.lastActivityTimestamp\n            }\n        } else {\n            this._updateWindowAndSessionIds(event)\n        }\n\n        if (rawEvent.type === EventType.FullSnapshot) {\n            this._fullSnapshotTimestamps.push([this._sessionId, rawEvent.timestamp])\n            if (this._fullSnapshotTimestamps.length > 6) {\n                this._fullSnapshotTimestamps = this._fullSnapshotTimestamps.slice(-6)\n            }\n        }\n\n        // Route lifecycle events using their payload IDs:\n        // - $session_ending uses currentSessionId (the old session it's ending)\n        // - $session_starting uses nextSessionId (the new session it's starting)\n        // - All other events use the current session ID\n        const targetSessionId =\n            sessionEndingPayload?.currentSessionId ?? sessionStartingPayload?.nextSessionId ?? this._sessionId\n        const targetWindowId =\n            sessionEndingPayload?.currentWindowId ?? sessionStartingPayload?.nextWindowId ?? this._windowId\n\n        // When in an idle state we keep recording but don't capture the events,\n        // we don't want to return early if idle is 'unknown'\n        if (this._isIdle === true && !isAllowedWhenIdle(event)) {\n            return\n        }\n\n        if (isSessionIdleEvent(event)) {\n            // session idle events have a timestamp when rrweb sees them\n            // which can artificially lengthen a session\n            // we know when we detected it based on the payload and can correct the timestamp\n            const payload = event.data.payload as SessionIdlePayload\n            if (payload) {\n                const lastActivity = payload.lastActivityTimestamp\n                const threshold = payload.threshold\n                event.timestamp = lastActivity + threshold\n            }\n        }\n\n        const { event: eventToSend, size } =\n            (this._instance.config.session_recording.compress_events ?? true)\n                ? compressEvent(event)\n                : { event, size: estimateSize(event) }\n\n        const properties = {\n            $snapshot_bytes: size,\n            $snapshot_data: eventToSend,\n            $session_id: targetSessionId,\n            $window_id: targetWindowId,\n        }\n\n        if (event.type === EventType.FullSnapshot && getRRWeb()?.wasMaxDepthReached?.()) {\n            this._maxDepthExceeded = true\n        }\n\n        if (this.status === DISABLED) {\n            this._clearBuffer()\n            return\n        }\n\n        this._captureSnapshotBuffered(properties)\n    }\n\n    get status(): SessionRecordingStatus {\n        if (!this._strategy) {\n            return DISABLED\n        }\n\n        const context: RecordingStrategyContext = {\n            instance: this._instance,\n            sessionId: this.sessionId,\n            isSampled: this._isSampled,\n            rrwebError: this._rrwebError,\n            urlTriggerMatching: this._urlTriggerMatching,\n            eventTriggerMatching: this._eventTriggerMatching,\n            linkedFlagMatching: this._linkedFlagMatching,\n            remoteConfig: this._remoteConfig,\n        }\n\n        return this._strategy.getStatus(context)\n    }\n\n    log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n        this._instance.sessionRecording?.onRRwebEmit({\n            type: 6,\n            data: {\n                plugin: 'rrweb/console@1',\n                payload: {\n                    level,\n                    trace: [],\n                    // Even though it is a string, we stringify it as that's what rrweb expects\n                    payload: [JSON.stringify(message)],\n                },\n            },\n            timestamp: Date.now(),\n        })\n    }\n\n    public overrideLinkedFlag() {\n        this._linkedFlagMatching.linkedFlagSeen = true\n        this._tryTakeFullSnapshot()\n        this._reportStarted('linked_flag_overridden')\n    }\n\n    /**\n     * this ignores the sampling config and (if other conditions are met) causes capture to start\n     *\n     * It is not usual to call this directly,\n     * instead call `posthog.startSessionRecording({sampling: true})`\n     * */\n    public overrideSampling() {\n        this._instance.persistence?.register({\n            // short-circuits the `makeSamplingDecision` function in the session recording module\n            [SESSION_RECORDING_IS_SAMPLED]: this.sessionId,\n        })\n        this._tryTakeFullSnapshot()\n        this._reportStarted('sampling_overridden')\n    }\n\n    /**\n     * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n     *\n     * It is not usual to call this directly,\n     * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n     * */\n    public overrideTrigger(triggerType: TriggerType) {\n        this._activateTrigger(triggerType)\n    }\n\n    private _clearFlushBufferTimer() {\n        if (this._flushBufferTimer) {\n            clearTimeout(this._flushBufferTimer)\n            this._flushBufferTimer = undefined\n        }\n    }\n\n    private _flushBuffer(): SnapshotBuffer {\n        this._clearFlushBufferTimer()\n\n        const isBelowMinimumDuration = this._isBelowMinimumDuration()\n\n        if (this.status === BUFFERING || this.status === PAUSED || this.status === DISABLED || isBelowMinimumDuration) {\n            this._flushBufferTimer = setTimeout(() => {\n                this._flushBuffer()\n            }, RECORDING_BUFFER_TIMEOUT)\n            return this._buffer\n        }\n\n        if (this._buffer.data.length > 0) {\n            const snapshotEvents = splitBuffer(this._buffer)\n            snapshotEvents.forEach((snapshotBuffer) => {\n                this._flushedSizeTracker?.trackSize(snapshotBuffer.size)\n                this._captureSnapshot({\n                    $snapshot_bytes: snapshotBuffer.size,\n                    $snapshot_data: snapshotBuffer.data,\n                    $session_id: snapshotBuffer.sessionId,\n                    $window_id: snapshotBuffer.windowId,\n                    $lib: Config.LIB_NAME,\n                    $lib_version: Config.LIB_VERSION,\n                })\n            })\n\n            // Notify strategy that initial flush is complete (performance optimization)\n            this._strategy?.onFlushComplete()\n        }\n\n        // buffer is empty, we clear it in case the session id has changed\n        return this._clearBuffer()\n    }\n\n    private _hasPassedMinimumDuration = (): boolean => {\n        const persistedSessionId = this._instance.persistence?.props[SESSION_RECORDING_PAST_MINIMUM_DURATION]\n        return persistedSessionId === this._sessionId\n    }\n\n    private _getBufferDuration = (): number | null => {\n        if (this._buffer.data.length === 0) {\n            return null\n        }\n\n        const firstTimestamp = this._buffer.data[0]?.timestamp\n        const lastTimestamp = this._buffer.data[this._buffer.data.length - 1]?.timestamp\n\n        if (!isNumber(firstTimestamp) || !isNumber(lastTimestamp)) {\n            return null\n        }\n\n        return lastTimestamp - firstTimestamp\n    }\n\n    private _isBelowMinimumDuration = (): boolean => {\n        const minimumDuration = this._minimumDuration\n        if (!isNumber(minimumDuration)) {\n            return false\n        }\n\n        const strictMode = this._instance.config.session_recording?.strictMinimumDuration ?? false\n\n        if (!strictMode) {\n            const sessionDuration = this._sessionDuration\n            const isPositiveSessionDuration = isNumber(sessionDuration) && sessionDuration >= 0\n            return isPositiveSessionDuration && sessionDuration < minimumDuration\n        }\n\n        if (this._hasPassedMinimumDuration()) {\n            return false\n        }\n\n        const bufferDuration = this._getBufferDuration()\n        if (isNull(bufferDuration)) {\n            return true\n        }\n\n        if (bufferDuration >= minimumDuration) {\n            this._instance.persistence?.register({\n                [SESSION_RECORDING_PAST_MINIMUM_DURATION]: this._sessionId,\n            })\n            return false\n        }\n\n        return true\n    }\n\n    private _captureSnapshotBuffered(properties: Properties) {\n        const additionalBytes = 2 + (this._buffer?.data.length || 0) // 2 bytes for the array brackets and 1 byte for each comma\n\n        // Extract target session ID from properties to ensure we flush when session changes\n        // This is critical for lifecycle events ($session_ending, $session_starting) which may\n        // have different target session IDs than this._sessionId\n        const targetSessionId = properties.$session_id as string\n\n        if (\n            !this._isIdle && // we never want to flush when idle\n            (this._buffer.size + properties.$snapshot_bytes + additionalBytes > RECORDING_MAX_EVENT_SIZE ||\n                this._buffer.sessionId !== targetSessionId)\n        ) {\n            this._buffer = this._flushBuffer()\n            // After flushing, update buffer to use the new target session/window IDs\n            this._buffer.sessionId = targetSessionId\n            this._buffer.windowId = properties.$window_id as string\n        }\n\n        this._buffer.size += properties.$snapshot_bytes\n        this._buffer.data.push(properties.$snapshot_data)\n        this._buffer.sizes.push(properties.$snapshot_bytes)\n\n        if (!this._flushBufferTimer && !this._isIdle) {\n            this._flushBufferTimer = setTimeout(() => {\n                this._flushBuffer()\n            }, RECORDING_BUFFER_TIMEOUT)\n        }\n    }\n\n    private _captureSnapshot(properties: Properties) {\n        // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n        this._instance.capture('$snapshot', properties, {\n            _url: this._instance.requestRouter.endpointFor('api', this._endpoint),\n            _noTruncate: true,\n            _batchKey: SESSION_RECORDING_BATCH_KEY,\n            skip_client_rate_limiting: true,\n        })\n    }\n\n    private get _sessionDuration(): number | null {\n        const mostRecentSnapshot = this._buffer?.data[this._buffer?.data.length - 1]\n        const { sessionStartTimestamp } = this._sessionManager.checkAndGetSessionAndWindowId(true)\n        return mostRecentSnapshot ? mostRecentSnapshot.timestamp - sessionStartTimestamp : null\n    }\n\n    private _clearBufferBeforeMostRecentMeta(): SnapshotBuffer {\n        if (!this._buffer || this._buffer.data.length === 0) {\n            return this._clearBuffer()\n        }\n\n        // Find the last meta event index by iterating backwards\n        let lastMetaIndex = -1\n        for (let i = this._buffer.data.length - 1; i >= 0; i--) {\n            if (this._buffer.data[i].type === EventType.Meta) {\n                lastMetaIndex = i\n                break\n            }\n        }\n        if (lastMetaIndex >= 0) {\n            this._buffer.data = this._buffer.data.slice(lastMetaIndex)\n            this._buffer.sizes = this._buffer.sizes.slice(lastMetaIndex)\n            this._buffer.size = this._buffer.sizes.reduce((a, b) => a + b, 0)\n            return this._buffer\n        } else {\n            return this._clearBuffer()\n        }\n    }\n\n    private _clearBuffer(): SnapshotBuffer {\n        this._buffer = {\n            size: 0,\n            data: [],\n            sizes: [],\n            sessionId: this._sessionId,\n            windowId: this._windowId,\n        }\n        return this._buffer\n    }\n\n    private _onBeforeUnload = (): void => {\n        // If still buffering (waiting for triggers), discard the buffer\n        if (this.status === BUFFERING) {\n            this._clearBuffer()\n            return\n        }\n\n        this._flushBuffer()\n    }\n\n    private _onOffline = (): void => {\n        this._tryAddCustomEvent('browser offline', {})\n    }\n\n    private _onOnline = (): void => {\n        this._tryAddCustomEvent('browser online', {})\n    }\n\n    private _onVisibilityChange = (): void => {\n        if (document?.visibilityState) {\n            const label = 'window ' + document.visibilityState\n            this._tryAddCustomEvent(label, {})\n        }\n    }\n\n    private _reportStarted(startReason: SessionStartReason, tagPayload?: Record<string, any>) {\n        this._instance.register_for_session({\n            [SESSION_RECORDING_START_REASON]: startReason,\n        })\n        logger.info(startReason.replace('_', ' '), tagPayload)\n        if (startReason !== 'session_id_changed') {\n            this._tryAddCustomEvent('$recording_started', {\n                reason: startReason,\n                ...tagPayload,\n            })\n        }\n    }\n\n    private _isInteractiveEvent(event: eventWithTime) {\n        return (\n            event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE &&\n            ACTIVE_SOURCES.indexOf(event.data?.source as IncrementalSource) !== -1\n        )\n    }\n\n    private _updateWindowAndSessionIds(event: eventWithTime) {\n        // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n        // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n        // type -> incremental update, and source -> mutation.\n\n        const isUserInteraction = this._isInteractiveEvent(event)\n\n        if (!isUserInteraction && !this._isIdle) {\n            // We check if the lastActivityTimestamp is old enough to go idle\n            const timeSinceLastActivity = event.timestamp - this._lastActivityTimestamp\n            if (timeSinceLastActivity > this._sessionIdleThresholdMilliseconds) {\n                // we mark as idle right away,\n                // or else we get multiple idle events\n                // if there are lots of non-user activity events being emitted\n                this._isIdle = true\n\n                // don't take full snapshots while idle\n                clearInterval(this._fullSnapshotTimer)\n\n                this._tryAddCustomEvent('sessionIdle', {\n                    eventTimestamp: event.timestamp,\n                    lastActivityTimestamp: this._lastActivityTimestamp,\n                    threshold: this._sessionIdleThresholdMilliseconds,\n                    bufferLength: this._buffer.data.length,\n                    bufferSize: this._buffer.size,\n                })\n\n                // proactively flush the buffer in case the session is idle for a long time\n                this._flushBuffer()\n            }\n        }\n\n        let returningFromIdle = false\n        if (isUserInteraction) {\n            this._lastActivityTimestamp = event.timestamp\n            if (this._isIdle) {\n                const idleWasUnknown = this._isIdle === 'unknown'\n                // Remove the idle state\n                this._isIdle = false\n                // if the idle state was unknown, we don't want to add an event, since we're just in bootup\n                // whereas if it was true, we know we've been idle for a while, and we can mark ourselves as returning from idle\n                if (!idleWasUnknown) {\n                    this._tryAddCustomEvent('sessionNoLongerIdle', {\n                        reason: 'user activity',\n                        type: event.type,\n                    })\n                    returningFromIdle = true\n                }\n            }\n        }\n\n        if (this._isIdle) {\n            return\n        }\n\n        // We only want to extend the session if it is an interactive event.\n        const { windowId, sessionId } = this._sessionManager.checkAndGetSessionAndWindowId(\n            !isUserInteraction,\n            event.timestamp\n        )\n\n        const sessionIdChanged = this._sessionId !== sessionId\n        const windowIdChanged = this._windowId !== windowId\n\n        this._windowId = windowId\n        this._sessionId = sessionId\n\n        if (sessionIdChanged || windowIdChanged) {\n            this.stop()\n            this.start('session_id_changed')\n        } else if (returningFromIdle) {\n            this._scheduleFullSnapshot()\n        }\n    }\n\n    private _clearConditionalRecordingPersistence(): void {\n        this._strategy?.clearConditionalRecordingPersistence()\n    }\n\n    get sdkDebugProperties(): Properties {\n        const { sessionStartTimestamp } = this._sessionManager.checkAndGetSessionAndWindowId(true)\n\n        return {\n            $recording_status: this.status,\n            $sdk_debug_replay_internal_buffer_length: this._buffer.data.length,\n            $sdk_debug_replay_internal_buffer_size: this._buffer.size,\n            $sdk_debug_current_session_duration: this._sessionDuration,\n            $sdk_debug_session_start: sessionStartTimestamp,\n            $sdk_debug_replay_flushed_size: this._flushedSizeTracker?.currentTrackedSize,\n            $sdk_debug_replay_full_snapshots: this._fullSnapshotTimestamps,\n            $snapshot_max_depth_exceeded: this._maxDepthExceeded,\n            $sdk_debug_replay_rrweb_error: this._rrwebError,\n        }\n    }\n\n    private _startRecorder() {\n        if (this._stopRrweb) {\n            return\n        }\n\n        // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n        const sessionRecordingOptions: recordOptions = {\n            // a limited set of the rrweb config options that we expose to our users.\n            // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n            blockClass: 'ph-no-capture',\n            blockSelector: undefined,\n            ignoreClass: 'ph-ignore-input',\n            maskTextClass: 'ph-mask',\n            maskTextSelector: undefined,\n            maskTextFn: undefined,\n            maskAllInputs: true,\n            maskInputOptions: { password: true },\n            maskInputFn: undefined,\n            slimDOMOptions: {},\n            collectFonts: false,\n            inlineStylesheet: true,\n            recordCrossOriginIframes: false,\n        }\n\n        // only allows user to set our allowlisted options\n        const userSessionRecordingOptions = this._instance.config.session_recording\n        for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n            if (key in sessionRecordingOptions) {\n                if (key === 'maskInputOptions') {\n                    // ensure password config is set if not included\n                    sessionRecordingOptions.maskInputOptions = { password: true, ...value }\n                } else {\n                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n                    // @ts-ignore\n                    sessionRecordingOptions[key] = value\n                }\n            }\n        }\n\n        if (this._canvasRecording && this._canvasRecording.enabled) {\n            sessionRecordingOptions.recordCanvas = true\n            sessionRecordingOptions.sampling = { canvas: this._canvasRecording.fps }\n            sessionRecordingOptions.dataURLOptions = { type: 'image/webp', quality: this._canvasRecording.quality }\n        }\n\n        if (this._masking) {\n            sessionRecordingOptions.maskAllInputs = this._masking.maskAllInputs ?? true\n            sessionRecordingOptions.maskTextSelector = this._masking.maskTextSelector ?? undefined\n            sessionRecordingOptions.blockSelector = this._masking.blockSelector ?? undefined\n        }\n\n        const rrwebRecord = getRRWebRecord()\n        if (!rrwebRecord) {\n            logger.error(\n                '_startRecorder was called but rrwebRecord is not available. This indicates something has gone wrong.'\n            )\n            return\n        }\n\n        this._mutationThrottler =\n            this._mutationThrottler ??\n            new MutationThrottler(rrwebRecord, {\n                refillRate: this._instance.config.session_recording.__mutationThrottlerRefillRate,\n                bucketSize: this._instance.config.session_recording.__mutationThrottlerBucketSize,\n                onBlockedNode: (id, node) => {\n                    const message = `Too many mutations on node '${id}'. Rate limiting. This could be due to SVG animations or something similar`\n                    logger.info(message, {\n                        node: node,\n                    })\n\n                    this.log(LOGGER_PREFIX + ' ' + message, 'warn')\n                },\n            })\n\n        const activePlugins = this._gatherRRWebPlugins()\n        this._stopRrweb = rrwebRecord({\n            emit: (event) => {\n                this.onRRwebEmit(event)\n            },\n            plugins: activePlugins,\n            ...sessionRecordingOptions,\n        })\n\n        if (!this._stopRrweb) {\n            this._rrwebError = true\n            logger.error(\n                'rrweb failed to start - Loss of recording data is possible. Check the browser console for rrweb errors.'\n            )\n            return\n        }\n\n        this._rrwebError = false\n\n        // We reset the last activity timestamp, resetting the idle timer\n        this._lastActivityTimestamp = Date.now()\n        // stay unknown if we're not sure if we're idle or not\n        this._isIdle = isBoolean(this._isIdle) ? this._isIdle : 'unknown'\n\n        this.tryAddCustomEvent('$remote_config_received', this._remoteConfig)\n        this._tryAddCustomEvent('$session_options', {\n            sessionRecordingOptions,\n            activePlugins: activePlugins.map((p) => p?.name),\n        })\n\n        this._tryAddCustomEvent('$posthog_config', {\n            config: this._instance.config,\n        })\n    }\n\n    tryAddCustomEvent(tag: string, payload: any): boolean {\n        return this._tryAddCustomEvent(tag, payload)\n    }\n}\n", "import {\n    COOKIELESS_ALWAYS,\n    SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED,\n    SESSION_RECORDING_IS_SAMPLED,\n    SESSION_RECORDING_OVERRIDE_SAMPLING,\n    SESSION_RECORDING_OVERRIDE_LINKED_FLAG,\n    SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER,\n    SESSION_RECORDING_OVERRIDE_URL_TRIGGER,\n    SESSION_RECORDING_REMOTE_CONFIG,\n} from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport { RemoteConfigLoader } from '../../remote-config'\nimport { Properties, RemoteConfig, SessionRecordingPersistedConfig, SessionStartReason } from '../../types'\nimport { type eventWithTime } from './types/rrweb-types'\n\nimport { isNullish, isNumber, isUndefined, isValidSampleRate } from '@posthog/core'\nimport { createLogger } from '../../utils/logger'\nimport {\n    assignableWindow,\n    LazyLoadedSessionRecordingInterface,\n    PostHogExtensionKind,\n    window,\n} from '../../utils/globals'\nimport { RECORDING_REMOTE_CONFIG_TTL_MS } from './external/lazy-loaded-session-recorder'\nimport {\n    AWAITING_CONFIG,\n    DISABLED,\n    LAZY_LOADING,\n    MISSING_CONFIG,\n    SessionRecordingStatus,\n    TriggerType,\n} from './external/triggerMatching'\nimport type { Extension } from '../types'\n\nconst LOGGER_PREFIX = '[SessionRecording]'\nconst logger = createLogger(LOGGER_PREFIX)\n\nexport class SessionRecording implements Extension {\n    _forceAllowLocalhostNetworkCapture: boolean = false\n\n    private _recordingStatus: SessionRecordingStatus = DISABLED\n\n    private get _config() {\n        return this._instance.config\n    }\n\n    private get _persistence() {\n        return this._instance.persistence\n    }\n\n    private _persistFlagsOnSessionListener: (() => void) | undefined = undefined\n    private _lazyLoadedSessionRecording: LazyLoadedSessionRecordingInterface | undefined\n\n    public get started(): boolean {\n        return !!this._lazyLoadedSessionRecording?.isStarted\n    }\n\n    get status(): SessionRecordingStatus {\n        if (this._recordingStatus === AWAITING_CONFIG || this._recordingStatus === MISSING_CONFIG) {\n            return this._recordingStatus\n        }\n        return this._lazyLoadedSessionRecording?.status ?? this._recordingStatus\n    }\n\n    constructor(private readonly _instance: PostHog) {\n        if (!this._instance.sessionManager) {\n            logger.error('started without valid sessionManager')\n            throw new Error(LOGGER_PREFIX + ' started without valid sessionManager. This is a bug.')\n        }\n\n        if (this._config.cookieless_mode === COOKIELESS_ALWAYS) {\n            throw new Error(LOGGER_PREFIX + ' cannot be used with cookieless_mode=\"always\"')\n        }\n    }\n\n    initialize() {\n        this.startIfEnabledOrStop()\n    }\n\n    private get _isRecordingEnabled() {\n        const enabled_server_side = !!this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)?.enabled\n        const enabled_client_side = !this._config.disable_session_recording\n        const isDisabled = this._config.disable_session_recording || this._instance.consent.isOptedOut()\n        return window && enabled_server_side && enabled_client_side && !isDisabled\n    }\n\n    startIfEnabledOrStop(startReason?: SessionStartReason) {\n        if (this._isRecordingEnabled && this._lazyLoadedSessionRecording?.isStarted) {\n            return\n        }\n\n        // According to the rrweb docs, rrweb is not supported on IE11 and below:\n        // \"rrweb does not support IE11 and below because it uses the MutationObserver API, which was supported by these browsers.\"\n        // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n        //\n        // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n        // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" and \"Array.from\" being undefined.\n        // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n        const canRunReplay = !isUndefined(Object.assign) && !isUndefined(Array.from)\n        if (this._isRecordingEnabled && canRunReplay) {\n            this._lazyLoadAndStart(startReason)\n            logger.info('starting')\n        } else {\n            this._recordingStatus = DISABLED\n            this.stopRecording()\n        }\n    }\n\n    /**\n     * session recording waits until it receives remote config before loading the script\n     * this is to ensure we can control the script name remotely\n     * and because we wait until we have local and remote config to determine if we should start at all\n     * if start is called and there is no remote config then we wait until there is\n     */\n    private _lazyLoadAndStart(startReason?: SessionStartReason) {\n        // by checking `_isRecordingEnabled` here we know that\n        // we have stored remote config and client config to read\n        // replay waits for both local and remote config before starting\n        if (!this._isRecordingEnabled) {\n            return\n        }\n\n        if (this._recordingStatus !== AWAITING_CONFIG && this._recordingStatus !== MISSING_CONFIG) {\n            this._recordingStatus = LAZY_LOADING\n        }\n\n        // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n        // imported), don't load the script. Otherwise, remotely import recorder.js from cdn since it hasn't been loaded.\n        if (\n            !assignableWindow?.__PosthogExtensions__?.rrweb?.record ||\n            !assignableWindow.__PosthogExtensions__?.initSessionRecording\n        ) {\n            assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(\n                this._instance,\n                this._scriptName,\n                (err) => {\n                    if (err) {\n                        return logger.error('could not load recorder', err)\n                    }\n                    this._onScriptLoaded(startReason)\n                }\n            )\n        } else {\n            this._onScriptLoaded(startReason)\n        }\n    }\n\n    stopRecording() {\n        this._persistFlagsOnSessionListener?.()\n        this._persistFlagsOnSessionListener = undefined\n        this._lazyLoadedSessionRecording?.stop()\n    }\n\n    private _discardRecording() {\n        this._persistFlagsOnSessionListener?.()\n        this._persistFlagsOnSessionListener = undefined\n        this._lazyLoadedSessionRecording?.discard()\n    }\n\n    private _resetSampling() {\n        this._persistence?.unregister(SESSION_RECORDING_IS_SAMPLED)\n    }\n\n    private _validateSampleRate(rate: unknown, source: string): number | null {\n        if (isNullish(rate)) {\n            return null\n        }\n        const parsed = isNumber(rate) ? rate : parseFloat(rate as string)\n        if (!isValidSampleRate(parsed)) {\n            logger.warn(`${source} must be between 0 and 1. Ignoring invalid value:`, rate)\n            return null\n        }\n        return parsed\n    }\n\n    private _persistRemoteConfig(response: RemoteConfig): void {\n        if (this._persistence) {\n            const persistence = this._persistence\n\n            const persistResponse = () => {\n                const sessionRecordingConfigResponse =\n                    response.sessionRecording === false ? undefined : response.sessionRecording\n\n                const localSampleRate = this._validateSampleRate(\n                    this._config.session_recording?.sampleRate,\n                    'session_recording.sampleRate'\n                )\n                const remoteSampleRate = this._validateSampleRate(\n                    sessionRecordingConfigResponse?.sampleRate,\n                    'remote config sampleRate'\n                )\n                const parsedSampleRate = localSampleRate ?? remoteSampleRate\n                if (isNullish(parsedSampleRate)) {\n                    this._resetSampling()\n                }\n\n                const receivedMinimumDuration = sessionRecordingConfigResponse?.minimumDurationMilliseconds\n\n                persistence.register({\n                    [SESSION_RECORDING_REMOTE_CONFIG]: {\n                        cache_timestamp: Date.now(),\n                        enabled: !!sessionRecordingConfigResponse,\n                        ...sessionRecordingConfigResponse,\n                        networkPayloadCapture: {\n                            capturePerformance: response.capturePerformance,\n                            ...sessionRecordingConfigResponse?.networkPayloadCapture,\n                        },\n                        canvasRecording: {\n                            enabled: sessionRecordingConfigResponse?.recordCanvas,\n                            fps: sessionRecordingConfigResponse?.canvasFps,\n                            quality: sessionRecordingConfigResponse?.canvasQuality,\n                        },\n                        sampleRate: parsedSampleRate,\n                        minimumDurationMilliseconds: isUndefined(receivedMinimumDuration)\n                            ? null\n                            : receivedMinimumDuration,\n                        endpoint: sessionRecordingConfigResponse?.endpoint,\n                        triggerMatchType: sessionRecordingConfigResponse?.triggerMatchType,\n                        masking: sessionRecordingConfigResponse?.masking,\n                        urlTriggers: sessionRecordingConfigResponse?.urlTriggers,\n                        // V2 fields - will be undefined for V1 configs\n                        version: sessionRecordingConfigResponse?.version,\n                        triggerGroups: sessionRecordingConfigResponse?.triggerGroups,\n                    } satisfies SessionRecordingPersistedConfig,\n                })\n            }\n\n            persistResponse()\n\n            // in case we see multiple flags responses, we should only use the response from the most recent one\n            this._persistFlagsOnSessionListener?.()\n            // we 100% know there is a session manager by this point\n            this._persistFlagsOnSessionListener = this._instance.sessionManager?.onSessionId(persistResponse)\n        }\n    }\n\n    onRemoteConfig(response: RemoteConfig) {\n        if (!('sessionRecording' in response)) {\n            if (this._recordingStatus === AWAITING_CONFIG) {\n                this._recordingStatus = MISSING_CONFIG\n                logger.warn('config refresh failed, recording will not start until page reload')\n            }\n            this.startIfEnabledOrStop()\n            return\n        }\n        if (response.sessionRecording === false) {\n            this._persistRemoteConfig(response)\n            this._discardRecording()\n            return\n        }\n\n        this._persistRemoteConfig(response)\n        this.startIfEnabledOrStop()\n    }\n\n    log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n        if (this._lazyLoadedSessionRecording?.log) {\n            this._lazyLoadedSessionRecording.log(message, level)\n        } else {\n            logger.warn('log called before recorder was ready')\n        }\n    }\n\n    private get _scriptName(): PostHogExtensionKind {\n        const remoteConfig: SessionRecordingPersistedConfig | undefined = this._instance?.persistence?.get_property(\n            SESSION_RECORDING_REMOTE_CONFIG\n        )\n        return (remoteConfig?.scriptConfig?.script as PostHogExtensionKind) || 'lazy-recorder'\n    }\n\n    private _isRemoteConfigFresh(): boolean {\n        const persistedConfig = this._instance.get_property(SESSION_RECORDING_REMOTE_CONFIG)\n        if (!persistedConfig) {\n            return false\n        }\n        const config = typeof persistedConfig === 'object' ? persistedConfig : JSON.parse(persistedConfig)\n        // default to now so that configs persisted by older SDK versions\n        // (which never set cache_timestamp) are treated as fresh\n        const cacheTimestamp = config.cache_timestamp ?? Date.now()\n        return Date.now() - cacheTimestamp <= RECORDING_REMOTE_CONFIG_TTL_MS\n    }\n\n    private _onScriptLoaded(startReason?: SessionStartReason) {\n        if (!assignableWindow.__PosthogExtensions__?.initSessionRecording) {\n            logger.warn(\n                'Called on script loaded before session recording is available. This can be caused by adblockers.'\n            )\n            this._instance.register_for_session({\n                [SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED]: true,\n            })\n            return\n        }\n\n        if (!this._lazyLoadedSessionRecording) {\n            this._lazyLoadedSessionRecording = assignableWindow.__PosthogExtensions__?.initSessionRecording(\n                this._instance\n            )\n            ;(this._lazyLoadedSessionRecording as any)._forceAllowLocalhostNetworkCapture =\n                this._forceAllowLocalhostNetworkCapture\n        }\n\n        if (!this._isRemoteConfigFresh()) {\n            if (this._recordingStatus === MISSING_CONFIG || this._recordingStatus === AWAITING_CONFIG) {\n                return\n            }\n            this._recordingStatus = AWAITING_CONFIG\n            logger.info('persisted remote config is stale, requesting fresh config before starting')\n            new RemoteConfigLoader(this._instance).load()\n            return\n        }\n\n        this._recordingStatus = LAZY_LOADING\n        this._lazyLoadedSessionRecording.start(startReason)\n    }\n\n    /**\n     * this is maintained on the public API only because it has always been on the public API\n     * if you are calling this directly you are certainly doing something wrong\n     * @deprecated\n     */\n    onRRwebEmit(rawEvent: eventWithTime) {\n        this._lazyLoadedSessionRecording?.onRRwebEmit?.(rawEvent)\n    }\n\n    /**\n     * this ignores the linked flag config and (if other conditions are met) causes capture to start\n     *\n     * It is not usual to call this directly,\n     * instead call `posthog.startSessionRecording({linked_flag: true})`\n     * */\n    public overrideLinkedFlag() {\n        if (!this._lazyLoadedSessionRecording) {\n            this._persistence?.register({\n                [SESSION_RECORDING_OVERRIDE_LINKED_FLAG]: true,\n            })\n        }\n\n        this._lazyLoadedSessionRecording?.overrideLinkedFlag()\n    }\n\n    /**\n     * this ignores the sampling config and (if other conditions are met) causes capture to start\n     *\n     * It is not usual to call this directly,\n     * instead call `posthog.startSessionRecording({sampling: true})`\n     * */\n    public overrideSampling() {\n        if (!this._lazyLoadedSessionRecording) {\n            this._persistence?.register({\n                [SESSION_RECORDING_OVERRIDE_SAMPLING]: true,\n            })\n        }\n\n        this._lazyLoadedSessionRecording?.overrideSampling()\n    }\n\n    /**\n     * this ignores the URL/Event trigger config and (if other conditions are met) causes capture to start\n     *\n     * It is not usual to call this directly,\n     * instead call `posthog.startSessionRecording({trigger: 'url' | 'event'})`\n     * */\n    public overrideTrigger(triggerType: TriggerType) {\n        if (!this._lazyLoadedSessionRecording) {\n            this._persistence?.register({\n                [triggerType === 'url'\n                    ? SESSION_RECORDING_OVERRIDE_URL_TRIGGER\n                    : SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER]: true,\n            })\n        }\n\n        this._lazyLoadedSessionRecording?.overrideTrigger(triggerType)\n    }\n\n    /*\n     * whenever we capture an event, we add these properties to the event\n     * these are used to debug issues with the session recording\n     * when looking at the event feed for a session\n     */\n    get sdkDebugProperties(): Properties {\n        return (\n            this._lazyLoadedSessionRecording?.sdkDebugProperties || {\n                $recording_status: this.status,\n            }\n        )\n    }\n\n    /**\n     * This adds a custom event to the session recording\n     *\n     * It is not intended for arbitrary public use - playback only displays known custom events\n     * And is exposed on the public interface only so that other parts of the SDK are able to use it\n     *\n     * if you are calling this from client code, you're probably looking for `posthog.capture('$custom_event', {...})`\n     */\n    tryAddCustomEvent(tag: string, payload: any): boolean {\n        return !!this._lazyLoadedSessionRecording?.tryAddCustomEvent(tag, payload)\n    }\n}\n", "import RageClick from './extensions/rageclick'\nimport { DeadClickCandidate, Properties, RemoteConfig } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { document, window } from './utils/globals'\nimport { getEventTarget, getParentElement } from './autocapture-utils'\nimport { DOM_EVENT_BEFOREUNLOAD, DOM_EVENT_VISIBILITYCHANGE, HEATMAPS_ENABLED_SERVER_SIDE } from './constants'\nimport { isNumber, isNullish, isEmptyObject, isObject } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { isElementInToolbar, isElementNode, isTag } from './utils/element-utils'\nimport { DeadClicksAutocapture, isDeadClicksEnabledForHeatmaps } from './extensions/dead-clicks-autocapture'\nimport { includes } from '@posthog/core'\nimport { addEventListener } from './utils'\nimport { maskQueryParams } from './utils/request-utils'\nimport { PERSONAL_DATA_CAMPAIGN_PARAMS, MASKED } from './utils/event-utils'\nimport type { Extension } from './extensions/types'\n\nconst DEFAULT_FLUSH_INTERVAL = 5000\n\nconst logger = createLogger('[Heatmaps]')\n\ntype HeatmapEventBuffer =\n    | {\n          [key: string]: Properties[]\n      }\n    | undefined\n\nfunction elementOrParentPositionMatches(el: Element | null, matches: string[], breakOnElement?: Element): boolean {\n    let curEl: Element | null | false = el\n\n    while (curEl && isElementNode(curEl) && !isTag(curEl, 'body')) {\n        if (curEl === breakOnElement) {\n            return false\n        }\n\n        if (includes(matches, window?.getComputedStyle(curEl).position)) {\n            return true\n        }\n\n        curEl = getParentElement(curEl)\n    }\n\n    return false\n}\n\nfunction isValidMouseEvent(e: unknown): e is MouseEvent {\n    return isObject(e) && 'clientX' in e && 'clientY' in e && isNumber(e.clientX) && isNumber(e.clientY)\n}\n\nfunction shouldPoll(document: Document | undefined): boolean {\n    return document?.visibilityState === 'visible'\n}\n\nexport class Heatmaps implements Extension {\n    instance: PostHog\n    rageclicks: RageClick\n    _enabledServerSide: boolean = false\n\n    private get _config() {\n        return this.instance.config\n    }\n\n    _initialized = false\n    _mouseMoveTimeout: ReturnType<typeof setTimeout> | undefined\n\n    private _buffer: HeatmapEventBuffer\n    private _flushInterval: ReturnType<typeof setInterval> | null = null\n    private _deadClicksCapture: DeadClicksAutocapture | undefined\n    private _onClickHandler: ((e: Event) => void) | undefined\n    private _onMouseMoveHandler: ((e: Event) => void) | undefined\n    private _flushHandler: (() => void) | undefined\n    private _onVisibilityChange_handler: (() => void) | undefined\n\n    constructor(instance: PostHog) {\n        this.instance = instance\n        this._enabledServerSide = !!this.instance.persistence?.props[HEATMAPS_ENABLED_SERVER_SIDE]\n        this.rageclicks = new RageClick(instance.config.rageclick)\n    }\n\n    initialize() {\n        this.startIfEnabled()\n    }\n\n    public get flushIntervalMilliseconds(): number {\n        let flushInterval = DEFAULT_FLUSH_INTERVAL\n        if (isObject(this._config.capture_heatmaps) && this._config.capture_heatmaps.flush_interval_milliseconds) {\n            flushInterval = this._config.capture_heatmaps.flush_interval_milliseconds\n        }\n        return flushInterval\n    }\n\n    public get isEnabled(): boolean {\n        if (!isNullish(this._config.capture_heatmaps)) {\n            return this._config.capture_heatmaps !== false\n        }\n        if (!isNullish(this._config.enable_heatmaps)) {\n            return this._config.enable_heatmaps\n        }\n        return this._enabledServerSide\n    }\n\n    public startIfEnabled(): void {\n        if (this.isEnabled) {\n            // nested if here since we only want to run the else\n            // if this.enabled === false\n            // not if this method is called more than once\n            if (this._initialized) {\n                return\n            }\n            logger.info('starting...')\n            this._setupListeners()\n            this._onVisibilityChange()\n        } else {\n            clearInterval(this._flushInterval ?? undefined)\n            this._removeListeners()\n            this.getAndClearBuffer()\n        }\n    }\n\n    public onRemoteConfig(response: RemoteConfig) {\n        if (!('heatmaps' in response)) {\n            return\n        }\n\n        const optIn = !!response['heatmaps']\n\n        if (this.instance.persistence) {\n            this.instance.persistence.register({\n                [HEATMAPS_ENABLED_SERVER_SIDE]: optIn,\n            })\n        }\n        // store this in-memory in case persistence is disabled\n        this._enabledServerSide = optIn\n        this.startIfEnabled()\n    }\n\n    public getAndClearBuffer(): HeatmapEventBuffer {\n        const buffer = this._buffer\n        this._buffer = undefined\n        return buffer\n    }\n\n    private _onDeadClick(click: DeadClickCandidate): void {\n        this._onClick(click.originalEvent, 'deadclick')\n    }\n\n    private _onVisibilityChange(): void {\n        // always clear the interval just in case\n        if (this._flushInterval) {\n            clearInterval(this._flushInterval)\n        }\n\n        this._flushInterval = shouldPoll(document)\n            ? setInterval(this._flush.bind(this), this.flushIntervalMilliseconds)\n            : null\n    }\n\n    private _setupListeners(): void {\n        if (!window || !document) {\n            return\n        }\n\n        this._flushHandler = this._flush.bind(this)\n        addEventListener(window, DOM_EVENT_BEFOREUNLOAD, this._flushHandler)\n\n        this._onClickHandler = (e) => this._onClick((e || window?.event) as MouseEvent)\n        addEventListener(document, 'click', this._onClickHandler, { capture: true })\n\n        this._onMouseMoveHandler = (e) => this._onMouseMove((e || window?.event) as MouseEvent)\n        addEventListener(document, 'mousemove', this._onMouseMoveHandler, { capture: true })\n\n        this._deadClicksCapture = new DeadClicksAutocapture(\n            this.instance,\n            isDeadClicksEnabledForHeatmaps,\n            this._onDeadClick.bind(this)\n        )\n        this._deadClicksCapture.startIfEnabledOrStop()\n\n        this._onVisibilityChange_handler = this._onVisibilityChange.bind(this)\n        addEventListener(document, DOM_EVENT_VISIBILITYCHANGE, this._onVisibilityChange_handler)\n\n        this._initialized = true\n    }\n\n    private _removeListeners(): void {\n        if (!window || !document) {\n            return\n        }\n\n        if (this._flushHandler) {\n            window.removeEventListener(DOM_EVENT_BEFOREUNLOAD, this._flushHandler)\n        }\n\n        if (this._onClickHandler) {\n            document.removeEventListener('click', this._onClickHandler, { capture: true })\n        }\n\n        if (this._onMouseMoveHandler) {\n            document.removeEventListener('mousemove', this._onMouseMoveHandler, { capture: true })\n        }\n\n        if (this._onVisibilityChange_handler) {\n            document.removeEventListener(DOM_EVENT_VISIBILITYCHANGE, this._onVisibilityChange_handler)\n        }\n\n        clearTimeout(this._mouseMoveTimeout)\n\n        this._deadClicksCapture?.stop()\n\n        this._initialized = false\n    }\n\n    private _getProperties(e: MouseEvent, type: string): Properties {\n        // We need to know if the target element is fixed or not\n        // If fixed then we won't account for scrolling\n        // If not then we will account for scrolling\n\n        const scrollY = this.instance.scrollManager.scrollY()\n        const scrollX = this.instance.scrollManager.scrollX()\n        const scrollElement = this.instance.scrollManager.scrollElement()\n\n        const isFixedOrSticky = elementOrParentPositionMatches(getEventTarget(e), ['fixed', 'sticky'], scrollElement)\n\n        return {\n            x: e.clientX + (isFixedOrSticky ? 0 : scrollX),\n            y: e.clientY + (isFixedOrSticky ? 0 : scrollY),\n            target_fixed: isFixedOrSticky,\n            type,\n        }\n    }\n\n    private _onClick(e: MouseEvent, type: string = 'click'): void {\n        if (isElementInToolbar(e.target) || !isValidMouseEvent(e)) {\n            return\n        }\n\n        const properties = this._getProperties(e, type)\n\n        if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n            this._capture({\n                ...properties,\n                type: 'rageclick',\n            })\n        }\n\n        this._capture(properties)\n    }\n\n    private _onMouseMove(e: Event): void {\n        if (isElementInToolbar(e.target) || !isValidMouseEvent(e)) {\n            return\n        }\n\n        clearTimeout(this._mouseMoveTimeout)\n\n        this._mouseMoveTimeout = setTimeout(() => {\n            this._capture(this._getProperties(e as MouseEvent, 'mousemove'))\n        }, 500)\n    }\n\n    private _capture(properties: Properties): void {\n        if (!window) {\n            return\n        }\n\n        const href = window.location.href\n\n        // mask url query params\n        const maskPersonalDataProperties = this._config.mask_personal_data_properties\n        const customPersonalDataProperties = this._config.custom_personal_data_properties\n\n        const paramsToMask = maskPersonalDataProperties\n            ? [...PERSONAL_DATA_CAMPAIGN_PARAMS, ...(customPersonalDataProperties || [])]\n            : []\n\n        const url = maskQueryParams(href, paramsToMask, MASKED)\n\n        this._buffer = this._buffer || {}\n\n        if (!this._buffer[url]) {\n            this._buffer[url] = []\n        }\n\n        this._buffer[url].push(properties)\n    }\n\n    private _flush(): void {\n        if (!this._buffer || isEmptyObject(this._buffer)) {\n            return\n        }\n\n        this.instance.capture('$$heatmap', {\n            $heatmap_data: this.getAndClearBuffer(),\n        })\n    }\n}\n", "import { PostHog } from './posthog-core'\nimport { ProductTour, ProductTourCallback } from './posthog-product-tours-types'\nimport { PRODUCT_TOURS, PRODUCT_TOURS_ENABLED_SERVER_SIDE } from './constants'\nimport { RemoteConfig } from './types'\nimport { createLogger } from './utils/logger'\nimport { isArray, isNullish } from '@posthog/core'\nimport { assignableWindow } from './utils/globals'\nimport { Extension } from './extensions/types'\n\nconst logger = createLogger('[Product Tours]')\n\ninterface ProductTourManagerInterface {\n    start: () => void\n    stop: () => void\n    showTourById: (tourId: string) => void\n    previewTour: (tour: ProductTour) => void\n    dismissTour: (reason: string) => void\n    nextStep: () => void\n    previousStep: () => void\n    getActiveProductTours: (callback: ProductTourCallback) => void\n    resetTour: (tourId: string) => void\n    resetAllTours: () => void\n    cancelPendingTour: (tourId: string) => void\n}\n\nconst isProductToursEnabled = (instance: PostHog): boolean => {\n    if (instance.config.disable_product_tours) {\n        return false\n    }\n    return !!instance.persistence?.get_property(PRODUCT_TOURS_ENABLED_SERVER_SIDE)\n}\n\nexport class PostHogProductTours implements Extension {\n    private _instance: PostHog\n    private _productTourManager: ProductTourManagerInterface | null = null\n    private _cachedTours: ProductTour[] | null = null\n\n    private get _persistence() {\n        return this._instance.persistence\n    }\n\n    constructor(instance: PostHog) {\n        this._instance = instance\n    }\n\n    initialize() {\n        this.loadIfEnabled()\n    }\n\n    onRemoteConfig(response: RemoteConfig): void {\n        if (!('productTours' in response)) {\n            return\n        }\n\n        if (this._persistence) {\n            this._persistence.register({\n                [PRODUCT_TOURS_ENABLED_SERVER_SIDE]: !!response.productTours,\n            })\n        }\n        this.loadIfEnabled()\n    }\n\n    loadIfEnabled(): void {\n        if (this._productTourManager || !isProductToursEnabled(this._instance)) {\n            return\n        }\n        this._loadScript(() => this._startProductTours())\n    }\n\n    private _loadScript(cb: () => void): void {\n        if (assignableWindow.__PosthogExtensions__?.generateProductTours) {\n            cb()\n            return\n        }\n        assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this._instance, 'product-tours', (err) => {\n            if (err) {\n                logger.error('Could not load product tours script', err)\n                return\n            }\n            cb()\n        })\n    }\n\n    private _startProductTours(): void {\n        if (this._productTourManager || !assignableWindow.__PosthogExtensions__?.generateProductTours) {\n            return\n        }\n        this._productTourManager = assignableWindow.__PosthogExtensions__.generateProductTours(this._instance, true)\n    }\n\n    getProductTours(callback: ProductTourCallback, forceReload: boolean = false): void {\n        if (isArray(this._cachedTours) && !forceReload) {\n            callback(this._cachedTours, { isLoaded: true })\n            return\n        }\n\n        const persistence = this._persistence\n        if (persistence) {\n            const storedTours = persistence.props[PRODUCT_TOURS]\n            if (isArray(storedTours) && !forceReload) {\n                this._cachedTours = storedTours\n                callback(storedTours, { isLoaded: true })\n                return\n            }\n        }\n\n        this._instance._send_request({\n            url: this._instance.requestRouter.endpointFor(\n                'api',\n                `/api/product_tours/?token=${this._instance.config.token}`\n            ),\n            method: 'GET',\n            callback: (response) => {\n                const statusCode = response.statusCode\n                if (statusCode !== 200 || !response.json) {\n                    const error = `Product Tours API could not be loaded, status: ${statusCode}`\n                    logger.error(error)\n                    callback([], { isLoaded: false, error })\n                    return\n                }\n\n                const tours: ProductTour[] = isArray(response.json.product_tours) ? response.json.product_tours : []\n                this._cachedTours = tours\n\n                if (persistence) {\n                    persistence.register({ [PRODUCT_TOURS]: tours })\n                }\n\n                callback(tours, { isLoaded: true })\n            },\n        })\n    }\n\n    getActiveProductTours(callback: ProductTourCallback): void {\n        if (isNullish(this._productTourManager)) {\n            callback([], { isLoaded: false, error: 'Product tours not loaded' })\n            return\n        }\n        this._productTourManager.getActiveProductTours(callback)\n    }\n\n    showProductTour(tourId: string): void {\n        this._productTourManager?.showTourById(tourId)\n    }\n\n    // force load product tours extension and render a tour,\n    // ignoring all display conditions.\n    previewTour(tour: ProductTour): void {\n        if (this._productTourManager) {\n            this._productTourManager.previewTour(tour)\n            return\n        }\n\n        this._loadScript(() => {\n            this._startProductTours()\n            this._productTourManager?.previewTour(tour)\n        })\n    }\n\n    dismissProductTour(): void {\n        this._productTourManager?.dismissTour('user_clicked_skip')\n    }\n\n    nextStep(): void {\n        this._productTourManager?.nextStep()\n    }\n\n    previousStep(): void {\n        this._productTourManager?.previousStep()\n    }\n\n    clearCache(): void {\n        this._cachedTours = null\n        this._persistence?.unregister(PRODUCT_TOURS)\n    }\n\n    resetTour(tourId: string): void {\n        this._productTourManager?.resetTour(tourId)\n    }\n\n    resetAllTours(): void {\n        this._productTourManager?.resetAllTours()\n    }\n\n    cancelPendingTour(tourId: string): void {\n        this._productTourManager?.cancelPendingTour(tourId)\n    }\n}\n", "import type { Extension } from './extensions/types'\nimport { PostHog } from './posthog-core'\nimport { CaptureResult, Properties, RemoteConfig, SiteApp, SiteAppGlobals, SiteAppLoader } from './types'\nimport { assignableWindow } from './utils/globals'\nimport { createLogger } from './utils/logger'\n\nconst logger = createLogger('[SiteApps]')\nconst APP_INIT_ERROR = 'Error while initializing PostHog app with config id '\n\nexport class SiteApps implements Extension {\n    apps: Record<string, SiteApp>\n\n    private _stopBuffering?: () => void\n    private _bufferedInvocations: SiteAppGlobals[]\n\n    constructor(private _instance: PostHog) {\n        // events captured between loading posthog-js and the site app; up to 1000 events\n        this._bufferedInvocations = []\n        this.apps = {}\n    }\n\n    public get isEnabled(): boolean {\n        return !!this._instance.config.opt_in_site_apps\n    }\n\n    private _eventCollector(_eventName: string, eventPayload?: CaptureResult | undefined) {\n        if (!eventPayload) {\n            return\n        }\n        const globals = this.globalsForEvent(eventPayload)\n        this._bufferedInvocations.push(globals)\n        if (this._bufferedInvocations.length > 1000) {\n            this._bufferedInvocations = this._bufferedInvocations.slice(10)\n        }\n    }\n\n    get siteAppLoaders(): SiteAppLoader[] | undefined {\n        return assignableWindow._POSTHOG_REMOTE_CONFIG?.[this._instance.config.token]?.siteApps\n    }\n\n    initialize() {\n        if (this.isEnabled) {\n            const stop = this._instance._addCaptureHook(this._eventCollector.bind(this))\n            this._stopBuffering = () => {\n                stop()\n                this._bufferedInvocations = []\n                this._stopBuffering = undefined\n            }\n        }\n    }\n\n    globalsForEvent(event: CaptureResult): SiteAppGlobals {\n        if (!event) {\n            throw new Error('Event payload is required')\n        }\n        const groups: SiteAppGlobals['groups'] = {}\n        const groupIds = this._instance.get_property('$groups') || []\n        const groupProperties: Record<string, Properties> =\n            this._instance.get_property('$stored_group_properties') || {}\n        for (const [type, properties] of Object.entries(groupProperties)) {\n            groups[type] = { id: groupIds[type], type, properties }\n        }\n        const { $set_once, $set, ..._event } = event\n        const globals = {\n            event: {\n                ..._event,\n                properties: {\n                    ...event.properties,\n                    ...($set ? { $set: { ...(event.properties?.$set ?? {}), ...$set } } : {}),\n                    ...($set_once ? { $set_once: { ...(event.properties?.$set_once ?? {}), ...$set_once } } : {}),\n                },\n                elements_chain: event.properties?.['$elements_chain'] ?? '',\n                // TODO:\n                // - elements_chain_href: '',\n                // - elements_chain_texts: [] as string[],\n                // - elements_chain_ids: [] as string[],\n                // - elements_chain_elements: [] as string[],\n                distinct_id: event.properties?.['distinct_id'],\n            },\n            person: {\n                properties: this._instance.get_property('$stored_person_properties'),\n            },\n            groups,\n        }\n        return globals\n    }\n\n    setupSiteApp(loader: SiteAppLoader) {\n        const app = this.apps[loader.id]\n        const processBufferedEvents = () => {\n            if (!app.errored && this._bufferedInvocations.length) {\n                logger.info(`Processing ${this._bufferedInvocations.length} events for site app with id ${loader.id}`)\n                this._bufferedInvocations.forEach((globals) => app.processEvent?.(globals))\n                app.processedBuffer = true\n            }\n\n            if (Object.values(this.apps).every((app) => app.processedBuffer || app.errored)) {\n                this._stopBuffering?.()\n            }\n        }\n\n        let hasInitReturned = false\n        const onLoaded = (success: boolean) => {\n            app.errored = !success\n            app.loaded = true\n            logger.info(`Site app with id ${loader.id} ${success ? 'loaded' : 'errored'}`)\n            // ensure that we don't call processBufferedEvents until after init() returns and we've set up processEvent\n            if (hasInitReturned) {\n                processBufferedEvents()\n            }\n        }\n\n        try {\n            const { processEvent } = loader.init({\n                posthog: this._instance,\n                callback: (success) => {\n                    onLoaded(success)\n                },\n            })\n            if (processEvent) {\n                app.processEvent = processEvent\n            }\n            hasInitReturned = true\n        } catch (e) {\n            logger.error(APP_INIT_ERROR + loader.id, e)\n            onLoaded(false)\n        }\n\n        // if the app loaded synchronously, process the events now\n        if (hasInitReturned && app.loaded) {\n            try {\n                processBufferedEvents()\n            } catch (e) {\n                logger.error(`Error while processing buffered events PostHog app with config id ${loader.id}`, e)\n                app.errored = true\n            }\n        }\n    }\n\n    private _setupSiteApps() {\n        const siteAppLoaders = this.siteAppLoaders || []\n\n        // do this in 2 passes, so that this.apps is populated before we call init\n        for (const loader of siteAppLoaders) {\n            this.apps[loader.id] = {\n                id: loader.id,\n                loaded: false,\n                errored: false,\n                processedBuffer: false,\n            }\n        }\n        for (const loader of siteAppLoaders) {\n            this.setupSiteApp(loader)\n        }\n    }\n\n    private _onCapturedEvent(event: CaptureResult) {\n        if (Object.keys(this.apps).length === 0) {\n            return\n        }\n\n        const globals = this.globalsForEvent(event)\n\n        for (const app of Object.values(this.apps)) {\n            try {\n                app.processEvent?.(globals)\n            } catch (e) {\n                logger.error(`Error while processing event ${event.event} for site app ${app.id}`, e)\n            }\n        }\n    }\n\n    onRemoteConfig(response: RemoteConfig): void {\n        if (this.siteAppLoaders?.length) {\n            if (!this.isEnabled) {\n                logger.error(`PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.`)\n                return\n            }\n\n            this._setupSiteApps()\n\n            // NOTE: We could improve this to only fire if we actually have listeners for the event\n            this._instance.on('eventCaptured', (event) => this._onCapturedEvent(event))\n\n            return\n        }\n\n        // NOTE: Below this is now only the fallback for legacy site app support. Once we have fully removed to the remote config loader we can get rid of this\n\n        this._stopBuffering?.()\n\n        if (!response['siteApps']?.length) {\n            return\n        }\n\n        if (!this.isEnabled) {\n            logger.error(`PostHog site apps are disabled. Enable the \"opt_in_site_apps\" config to proceed.`)\n            return\n        }\n\n        for (const { id, url } of response['siteApps']) {\n            assignableWindow[`__$$ph_site_app_${id}`] = this._instance\n            assignableWindow.__PosthogExtensions__?.loadSiteApp?.(this._instance, url, (err) => {\n                if (err) {\n                    return logger.error(APP_INIT_ERROR + id, err)\n                }\n            })\n        }\n    }\n}\n", "import { isNullish } from '@posthog/core'\n\nexport function extractHref(elementsChain: string): string {\n    const match = elementsChain.match(/(?::|\")href=\"(.*?)\"/)\n    return match ? match[1] : ''\n}\n\nexport function extractTexts(elementsChain: string): string[] {\n    const texts: string[] = []\n    const regex = /(?::|\")text=\"(.*?)\"/g\n    let match\n    while (!isNullish((match = regex.exec(elementsChain)))) {\n        if (!texts.includes(match[1])) {\n            texts.push(match[1])\n        }\n    }\n    return texts\n}\n\nexport function matchString(\n    value: string | undefined | null,\n    pattern: string,\n    matching: 'exact' | 'contains' | 'regex'\n): boolean {\n    if (isNullish(value)) return false\n    switch (matching) {\n        case 'exact':\n            return value === pattern\n        case 'contains': {\n            // Simulating SQL LIKE behavior (_ = any single character, % = any zero or more characters)\n            const likePattern = pattern\n                .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n                .replace(/_/g, '.')\n                .replace(/%/g, '.*')\n            return new RegExp(likePattern, 'i').test(value)\n        }\n        case 'regex':\n            try {\n                return new RegExp(pattern).test(value)\n            } catch {\n                return false\n            }\n        default:\n            return false\n    }\n}\n\nexport function matchTexts(texts: string[], pattern: string, matching: 'exact' | 'contains' | 'regex'): boolean {\n    return texts.some((text) => matchString(text, pattern, matching))\n}\n", "import { PostHog } from '../../posthog-core'\nimport { ActionStepType, PropertyFilters, SurveyActionType, SurveyElement } from '../../posthog-surveys-types'\nimport { SimpleEventEmitter } from '../../utils/simple-event-emitter'\nimport { CaptureResult, PropertyMatchType } from '../../types'\nimport { isArray, isUndefined } from '@posthog/core'\nimport { matchPropertyFilters } from '../../utils/property-utils'\nimport { extractTexts, extractHref, matchString, matchTexts } from '../../utils/elements-chain-utils'\n\nexport class ActionMatcher {\n    private readonly _actionRegistry?: Set<SurveyActionType>\n    private readonly _instance?: PostHog\n    private readonly _actionEvents: Set<string>\n    private _debugEventEmitter = new SimpleEventEmitter()\n\n    constructor(instance?: PostHog) {\n        this._instance = instance\n        this._actionEvents = new Set<string>()\n        this._actionRegistry = new Set<SurveyActionType>()\n    }\n\n    init() {\n        if (!isUndefined(this._instance?._addCaptureHook)) {\n            const matchEventToAction = (eventName: string, eventPayload: any) => {\n                this.on(eventName, eventPayload)\n            }\n            this._instance?._addCaptureHook(matchEventToAction)\n        }\n    }\n\n    register(actions: SurveyActionType[]): void {\n        if (isUndefined(this._instance?._addCaptureHook)) {\n            return\n        }\n\n        actions.forEach((action) => {\n            this._actionRegistry?.add(action)\n            action.steps?.forEach((step) => {\n                this._actionEvents?.add(step?.event || '')\n            })\n        })\n\n        if (this._instance?.autocapture) {\n            const selectorsToWatch: Set<string> = new Set<string>()\n            actions.forEach((action) => {\n                action.steps?.forEach((step) => {\n                    if (step?.selector) {\n                        selectorsToWatch.add(step?.selector)\n                    }\n                })\n            })\n            this._instance?.autocapture.setElementSelectors(selectorsToWatch)\n        }\n    }\n\n    on(eventName: string, eventPayload?: CaptureResult) {\n        if (eventPayload == null || eventName.length == 0) {\n            return\n        }\n\n        if (!this._actionEvents.has(eventName) && !this._actionEvents.has(<string>eventPayload?.event)) {\n            return\n        }\n\n        if (this._actionRegistry && this._actionRegistry?.size > 0) {\n            this._actionRegistry.forEach((action) => {\n                if (this._checkAction(eventPayload, action)) {\n                    this._debugEventEmitter.emit('actionCaptured', action.name)\n                }\n            })\n        }\n    }\n\n    _addActionHook(callback: (actionName: string, eventPayload?: any) => void): void {\n        this.onAction('actionCaptured', (data) => callback(data))\n    }\n\n    private _checkAction(event?: CaptureResult, action?: SurveyActionType): boolean {\n        if (action?.steps == null) {\n            return false\n        }\n\n        for (const step of action.steps) {\n            if (this._checkStep(event, step)) {\n                return true\n            }\n        }\n\n        return false\n    }\n\n    onAction(event: 'actionCaptured', cb: (...args: any[]) => void): () => void {\n        return this._debugEventEmitter.on(event, cb)\n    }\n\n    private _checkStep = (event?: CaptureResult, step?: ActionStepType): boolean => {\n        return (\n            this._checkStepEvent(event, step) &&\n            this._checkStepUrl(event, step) &&\n            this._checkStepElement(event, step) &&\n            this._checkStepProperties(event, step)\n        )\n    }\n\n    private _checkStepEvent = (event?: CaptureResult, step?: ActionStepType): boolean => {\n        // CHECK CONDITIONS, OTHERWISE SKIPPED\n        if (step?.event && event?.event !== step?.event) {\n            return false // EVENT NAME IS A MISMATCH\n        }\n        return true\n    }\n\n    private _checkStepUrl(event?: CaptureResult, step?: ActionStepType): boolean {\n        // CHECK CONDITIONS, OTHERWISE SKIPPED\n        if (step?.url) {\n            const eventUrl = event?.properties?.$current_url\n            if (!eventUrl || typeof eventUrl !== 'string') {\n                return false\n            }\n            if (!matchString(eventUrl, step.url, step.url_matching || 'contains')) {\n                return false\n            }\n        }\n        return true\n    }\n\n    private _checkStepElement(event?: CaptureResult, step?: ActionStepType): boolean {\n        if (!this._checkStepHref(event, step)) return false\n        if (!this._checkStepText(event, step)) return false\n        if (!this._checkStepSelector(event, step)) return false\n        return true\n    }\n\n    private _checkStepHref(event?: CaptureResult, step?: ActionStepType): boolean {\n        if (!step?.href) return true\n\n        const elements = this._getElementsList(event)\n        if (elements.length > 0) {\n            return elements.some((el) => matchString(el.href, step.href!, step.href_matching || 'exact'))\n        }\n\n        const chain = (event?.properties?.$elements_chain as string) || ''\n        if (chain) {\n            return matchString(extractHref(chain), step.href, step.href_matching || 'exact')\n        }\n\n        return false\n    }\n\n    private _checkStepText(event?: CaptureResult, step?: ActionStepType): boolean {\n        if (!step?.text) return true\n\n        const elements = this._getElementsList(event)\n        if (elements.length > 0) {\n            return elements.some(\n                (el) =>\n                    matchString(el.text, step.text!, step.text_matching || 'exact') ||\n                    matchString(el.$el_text, step.text!, step.text_matching || 'exact')\n            )\n        }\n\n        const chain = (event?.properties?.$elements_chain as string) || ''\n        if (chain) {\n            return matchTexts(extractTexts(chain), step.text, step.text_matching || 'exact')\n        }\n\n        return false\n    }\n\n    private _checkStepSelector(event?: CaptureResult, step?: ActionStepType): boolean {\n        if (!step?.selector) return true\n\n        // check exact match on $element_selectors from autocapture\n        const elementSelectors = event?.properties?.$element_selectors as string[] | undefined\n        if (elementSelectors?.includes(step.selector)) {\n            return true\n        }\n\n        // check against compiled regex\n        const chain = (event?.properties?.$elements_chain as string) || ''\n        if (step.selector_regex && chain) {\n            try {\n                return new RegExp(step.selector_regex).test(chain)\n            } catch {\n                return false\n            }\n        }\n\n        return false\n    }\n\n    private _getElementsList(event?: CaptureResult): SurveyElement[] {\n        if (event?.properties?.$elements == null) {\n            return []\n        }\n\n        return event?.properties.$elements as unknown as SurveyElement[]\n    }\n\n    private _checkStepProperties(event?: CaptureResult, step?: ActionStepType): boolean {\n        if (!step?.properties || step.properties.length === 0) {\n            return true\n        }\n\n        // transform to match same property format as normal events\n        const propertyFilters: PropertyFilters = step.properties.reduce<PropertyFilters>((acc, filter) => {\n            const values = isArray(filter.value)\n                ? filter.value.map(String)\n                : filter.value != null\n                  ? [String(filter.value)]\n                  : []\n\n            acc[filter.key] = {\n                values,\n                operator: (filter.operator || 'exact') as PropertyMatchType,\n            }\n            return acc\n        }, {})\n\n        return matchPropertyFilters(propertyFilters, event?.properties)\n    }\n}\n", "import { SurveyActionType, SurveyEventType, SurveyEventWithFilters } from '../posthog-surveys-types'\nimport { ActionMatcher } from '../extensions/surveys/action-matcher'\nimport { PostHog } from '../posthog-core'\nimport { CaptureResult } from '../types'\nimport { matchPropertyFilters } from './property-utils'\nimport { isUndefined } from '@posthog/core'\nimport { createLogger } from './logger'\n\n/**\n * Interface for items that can be triggered by events/actions.\n * Both Survey and ProductTour implement this interface.\n */\nexport interface EventTriggerable {\n    id: string\n    conditions?: {\n        events?: { repeatedActivation?: boolean; values: SurveyEventWithFilters[] } | null\n        cancelEvents?: { values: SurveyEventWithFilters[] } | null\n        actions?: { values: SurveyActionType[] } | null\n    } | null\n}\n\n/**\n * Abstract base class for receiving events and matching them to triggerable items.\n * Subclasses implement type-specific behavior for surveys and product tours.\n */\nexport abstract class EventReceiver<T extends EventTriggerable> {\n    // eventToItems is a mapping of event name to all the items that are activated by it\n    protected _eventToItems: Map<string, string[]>\n    // cancelEventToItems is a mapping of event name to all the items that should be cancelled by it\n    protected _cancelEventToItems: Map<string, string[]>\n    // actionToItems is a mapping of action name to all the items that are activated by it\n    protected readonly _actionToItems: Map<string, string[]>\n    // actionMatcher can look at CaptureResult payloads and match an event to its corresponding action.\n    protected _actionMatcher?: ActionMatcher | null\n    protected readonly _instance?: PostHog\n\n    constructor(instance: PostHog) {\n        this._instance = instance\n        this._eventToItems = new Map<string, string[]>()\n        this._cancelEventToItems = new Map<string, string[]>()\n        this._actionToItems = new Map<string, string[]>()\n    }\n\n    // Abstract methods for subclasses to implement\n    protected abstract _getActivatedKey(): string\n    protected abstract _getShownEventName(): string\n    protected abstract _getItems(callback: (items: T[]) => void): void\n    protected abstract _cancelPendingItem(itemId: string): void\n    protected abstract _getLogger(): ReturnType<typeof createLogger>\n    protected abstract _setActivatedItems(eligibleItems: string[]): void\n    /** Check if item is permanently ineligible (e.g. completed/dismissed). Skip adding to activated list. */\n    protected abstract _isItemPermanentlyIneligible(itemId?: string): boolean\n\n    private _doesEventMatchFilter(\n        eventConfig: SurveyEventWithFilters | undefined,\n        eventPayload?: CaptureResult\n    ): boolean {\n        if (!eventConfig) {\n            return false\n        }\n\n        return matchPropertyFilters(eventConfig.propertyFilters, eventPayload?.properties)\n    }\n\n    private _buildEventToItemMap(items: T[], conditionField: SurveyEventType): Map<string, string[]> {\n        const map = new Map<string, string[]>()\n        items.forEach((item) => {\n            item.conditions?.[conditionField]?.values?.forEach((event) => {\n                if (event?.name) {\n                    const existing = map.get(event.name) || []\n                    existing.push(item.id)\n                    map.set(event.name, existing)\n                }\n            })\n        })\n        return map\n    }\n\n    /**\n     * build a map of (Event1) => [Item1, Item2, Item3]\n     * used for items that should be [activated|cancelled] by Event1\n     */\n    private _getMatchingItems(\n        eventName: string,\n        eventPayload: CaptureResult | undefined,\n        conditionField: SurveyEventType\n    ): T[] {\n        const itemIdMap = conditionField === SurveyEventType.Activation ? this._eventToItems : this._cancelEventToItems\n        const itemIds = itemIdMap.get(eventName)\n\n        let items: T[] = []\n        this._getItems((allItems) => {\n            items = allItems.filter((item) => itemIds?.includes(item.id))\n        })\n\n        return items.filter((item) => {\n            const eventConfig = item.conditions?.[conditionField]?.values?.find((e) => e.name === eventName)\n            return this._doesEventMatchFilter(eventConfig, eventPayload)\n        })\n    }\n\n    register(items: T[]): void {\n        if (isUndefined(this._instance?._addCaptureHook)) {\n            return\n        }\n\n        this._setupEventBasedItems(items)\n        this._setupActionBasedItems(items)\n    }\n\n    private _setupActionBasedItems(items: T[]) {\n        const actionBasedItems = items.filter(\n            (item: T) => item.conditions?.actions && item.conditions?.actions?.values?.length > 0\n        )\n\n        if (actionBasedItems.length === 0) {\n            return\n        }\n\n        if (this._actionMatcher == null) {\n            this._actionMatcher = new ActionMatcher(this._instance)\n            this._actionMatcher.init()\n            // match any actions to its corresponding item.\n            const matchActionToItem = (actionName: string) => {\n                this.onAction(actionName)\n            }\n\n            this._actionMatcher._addActionHook(matchActionToItem)\n        }\n\n        actionBasedItems.forEach((item) => {\n            if (\n                item.conditions &&\n                item.conditions?.actions &&\n                item.conditions?.actions?.values &&\n                item.conditions?.actions?.values?.length > 0\n            ) {\n                // register the known set of actions with\n                // the action-matcher so it can match\n                // events to actions\n                this._actionMatcher?.register(item.conditions.actions.values)\n\n                // maintain a mapping of (Action1) => [Item1, Item2, Item3]\n                // where Items 1-3 are all activated by Action1\n                item.conditions?.actions?.values?.forEach((action) => {\n                    if (action && action.name) {\n                        const knownItems: string[] | undefined = this._actionToItems.get(action.name)\n                        if (knownItems) {\n                            knownItems.push(item.id)\n                        }\n                        this._actionToItems.set(action.name, knownItems || [item.id])\n                    }\n                })\n            }\n        })\n    }\n\n    private _setupEventBasedItems(items: T[]) {\n        const eventBasedItems = items.filter(\n            (item: T) => item.conditions?.events && item.conditions?.events?.values?.length > 0\n        )\n\n        const itemsWithCancelEvents = items.filter(\n            (item: T) => item.conditions?.cancelEvents && item.conditions?.cancelEvents?.values?.length > 0\n        )\n\n        if (eventBasedItems.length === 0 && itemsWithCancelEvents.length === 0) {\n            return\n        }\n\n        // match any events to its corresponding item.\n        const matchEventToItem = (eventName: string, eventPayload?: CaptureResult) => {\n            this.onEvent(eventName, eventPayload)\n        }\n        this._instance?._addCaptureHook(matchEventToItem)\n\n        this._eventToItems = this._buildEventToItemMap(items, SurveyEventType.Activation)\n        this._cancelEventToItems = this._buildEventToItemMap(items, SurveyEventType.Cancellation)\n    }\n\n    onEvent(event: string, eventPayload?: CaptureResult): void {\n        const logger = this._getLogger()\n        const activatedKey = this._getActivatedKey()\n        const shownEventName = this._getShownEventName()\n\n        const existingActivatedItems: string[] = this._instance?.persistence?.props[activatedKey] || []\n        if (shownEventName === event && eventPayload && existingActivatedItems.length > 0) {\n            // remove item from activatedItems here.\n            logger.info('event matched, removing item from activated items', {\n                event,\n                eventPayload,\n                existingActivatedItems,\n            })\n            const itemId = eventPayload?.properties?.$survey_id || eventPayload?.properties?.$product_tour_id\n            if (itemId) {\n                const index = existingActivatedItems.indexOf(itemId)\n                if (index >= 0) {\n                    existingActivatedItems.splice(index, 1)\n                    this._updateActivatedItems(existingActivatedItems)\n                }\n            }\n\n            return\n        }\n\n        // check if this event should cancel any pending items\n        if (this._cancelEventToItems.has(event)) {\n            const itemsToCancel = this._getMatchingItems(event, eventPayload, SurveyEventType.Cancellation)\n\n            if (itemsToCancel.length > 0) {\n                logger.info('cancel event matched, cancelling items', {\n                    event,\n                    itemsToCancel: itemsToCancel.map((s) => s.id),\n                })\n\n                itemsToCancel.forEach((item) => {\n                    // remove from activated items\n                    const index = existingActivatedItems.indexOf(item.id)\n                    if (index >= 0) {\n                        existingActivatedItems.splice(index, 1)\n                    }\n                    // cancel any pending timeout for this item\n                    this._cancelPendingItem(item.id)\n                })\n\n                this._updateActivatedItems(existingActivatedItems)\n            }\n        }\n\n        // if the event is not in the eventToItems map, nothing else to do\n        if (!this._eventToItems.has(event)) {\n            return\n        }\n\n        logger.info('event name matched', {\n            event,\n            eventPayload,\n            items: this._eventToItems.get(event),\n        })\n\n        const matchedItems = this._getMatchingItems(event, eventPayload, SurveyEventType.Activation)\n\n        this._updateActivatedItems(existingActivatedItems.concat(matchedItems.map((item) => item.id) || []))\n    }\n\n    onAction(actionName: string): void {\n        const activatedKey = this._getActivatedKey()\n        const existingActivatedItems: string[] = this._instance?.persistence?.props[activatedKey] || []\n        if (this._actionToItems.has(actionName)) {\n            this._updateActivatedItems(existingActivatedItems.concat(this._actionToItems.get(actionName) || []))\n        }\n    }\n\n    private _updateActivatedItems(activatedItems: string[]) {\n        const logger = this._getLogger()\n        // Filter out permanently ineligible items and remove duplicates\n        const eligibleItems = [...new Set(activatedItems)].filter(\n            (itemId) => !this._isItemPermanentlyIneligible(itemId)\n        )\n        logger.info('updating activated items', {\n            activatedItems: eligibleItems,\n        })\n\n        this._setActivatedItems(eligibleItems)\n    }\n\n    getActivatedIds(): string[] {\n        const activatedKey = this._getActivatedKey()\n        const existingActivatedItems = this._instance?.persistence?.props[activatedKey]\n        return existingActivatedItems ? existingActivatedItems : []\n    }\n\n    getEventToItemsMap(): Map<string, string[]> {\n        return this._eventToItems\n    }\n\n    _getActionMatcher(): ActionMatcher | null | undefined {\n        return this._actionMatcher\n    }\n}\n", "import { SURVEYS_ACTIVATED } from '../constants'\nimport { Survey, SurveyEventName } from '../posthog-surveys-types'\nimport { PostHog } from '../posthog-core'\nimport { SURVEY_LOGGER as logger } from './survey-utils'\nimport { EventReceiver } from './event-receiver'\nimport { createLogger } from './logger'\n\nexport class SurveyEventReceiver extends EventReceiver<Survey> {\n    constructor(instance: PostHog) {\n        super(instance)\n    }\n\n    protected _getActivatedKey(): string {\n        return SURVEYS_ACTIVATED\n    }\n\n    protected _getShownEventName(): string {\n        return SurveyEventName.SHOWN\n    }\n\n    protected _getItems(callback: (items: Survey[]) => void): void {\n        this._instance?.getSurveys(callback)\n    }\n\n    protected _cancelPendingItem(itemId: string): void {\n        this._instance?.cancelPendingSurvey(itemId)\n    }\n\n    protected _getLogger(): ReturnType<typeof createLogger> {\n        return logger\n    }\n\n    protected _setActivatedItems(eligibleItems: string[]): void {\n        this._instance?.persistence?.register({ [SURVEYS_ACTIVATED]: eligibleItems })\n    }\n\n    protected _isItemPermanentlyIneligible(): boolean {\n        // Surveys have complex eligibility rules checked at display time\n        // For now, we don't filter at activation time\n        return false\n    }\n\n    // Backward compatibility - keep getSurveys() as alias for getActivatedIds()\n    getSurveys(): string[] {\n        return this.getActivatedIds()\n    }\n\n    // Backward compatibility - keep getEventToSurveys() as alias\n    getEventToSurveys(): Map<string, string[]> {\n        return this.getEventToItemsMap()\n    }\n}\n", "import { LOAD_EXT_NOT_FOUND, SURVEYS } from './constants'\n\nconst SURVEY_NOT_LOADED = 'SDK is not enabled or survey functionality is not yet loaded'\nconst SURVEY_DISABLED = 'Disabled. Not loading surveys.'\nimport { SurveyManager } from './extensions/surveys'\nimport type { Extension } from './extensions/types'\nimport { PostHog } from './posthog-core'\nimport {\n    DisplaySurveyOptions,\n    DisplaySurveyType,\n    Survey,\n    SurveyCallback,\n    SurveyRenderReason,\n} from './posthog-surveys-types'\nimport { Properties, RemoteConfig } from './types'\nimport { assignableWindow, document } from './utils/globals'\nimport { SurveyEventReceiver } from './utils/survey-event-receiver'\nimport {\n    doesSurveyActivateByAction,\n    doesSurveyActivateByEvent,\n    IN_APP_SURVEY_TYPES,\n    isSurveyRunning,\n    SURVEY_LOGGER as logger,\n    SURVEY_IN_PROGRESS_PREFIX,\n    SURVEY_SEEN_PREFIX,\n} from './utils/survey-utils'\nimport { isNullish, isUndefined, isArray } from '@posthog/core'\n\nexport class PostHogSurveys implements Extension {\n    // this is set to undefined until the remote config is loaded\n    // then it's set to true if there are surveys to load\n    // or false if there are no surveys to load\n    // or false if the surveys feature is disabled in the project settings\n    private _isSurveysEnabled?: boolean = undefined\n    public _surveyEventReceiver: SurveyEventReceiver | null\n    private _surveyManager: SurveyManager | null = null\n    private _isInitializingSurveys: boolean = false\n    private _surveyCallbacks: SurveyCallback[] = []\n    // Promise for in-flight survey fetch - allows multiple callers to await the same request\n    private _getSurveysInFlightPromise: Promise<{\n        surveys: Survey[]\n        context: { isLoaded: boolean; error?: string }\n    }> | null = null\n\n    private get _config() {\n        return this._instance.config\n    }\n\n    constructor(private readonly _instance: PostHog) {\n        // we set this to undefined here because we need the persistence storage for this type\n        // but that's not initialized until loadIfEnabled is called.\n        this._surveyEventReceiver = null\n    }\n\n    initialize() {\n        this.loadIfEnabled()\n    }\n\n    onRemoteConfig(response: RemoteConfig) {\n        // only load surveys if they are enabled and there are surveys to load\n        if (this._config.disable_surveys) {\n            return\n        }\n\n        const surveys = response['surveys']\n        if (isNullish(surveys)) {\n            return logger.warn('Flags not loaded yet. Not loading surveys.')\n        }\n        const isArrayResponse = isArray(surveys)\n        this._isSurveysEnabled = isArrayResponse ? surveys.length > 0 : surveys\n        logger.info(`flags response received, isSurveysEnabled: ${this._isSurveysEnabled}`)\n        this.loadIfEnabled()\n    }\n\n    reset(): void {\n        localStorage.removeItem('lastSeenSurveyDate')\n        const surveyKeys = []\n        for (let i = 0; i < localStorage.length; i++) {\n            const key = localStorage.key(i)\n            if (key?.startsWith(SURVEY_SEEN_PREFIX) || key?.startsWith(SURVEY_IN_PROGRESS_PREFIX)) {\n                surveyKeys.push(key)\n            }\n        }\n\n        surveyKeys.forEach((key) => localStorage.removeItem(key))\n    }\n\n    loadIfEnabled() {\n        // Initial guard clauses\n        if (this._surveyManager) {\n            return\n        } // Already loaded\n        if (this._isInitializingSurveys) {\n            logger.info('Already initializing surveys, skipping...')\n            return\n        }\n        if (this._config.disable_surveys) {\n            logger.info(SURVEY_DISABLED)\n            return\n        }\n        if (this._config.cookieless_mode && this._instance.consent.isOptedOut()) {\n            logger.info('Not loading surveys in cookieless mode without consent.')\n            return\n        }\n\n        const phExtensions = assignableWindow?.__PosthogExtensions__\n        if (!phExtensions) {\n            logger.error('PostHog Extensions not found.')\n            return\n        }\n\n        // waiting for remote config to load\n        // if surveys is forced enable (like external surveys), ignore the remote config and load surveys\n        if (isUndefined(this._isSurveysEnabled) && !this._config.advanced_enable_surveys) {\n            return\n        }\n\n        const isSurveysEnabled = this._isSurveysEnabled || this._config.advanced_enable_surveys\n\n        this._isInitializingSurveys = true\n\n        try {\n            const generateSurveys = phExtensions.generateSurveys\n            if (generateSurveys) {\n                // Surveys code is already loaded\n                this._completeSurveyInitialization(generateSurveys, isSurveysEnabled)\n                return\n            }\n\n            // If we reach here, surveys code is not loaded yet\n            const loadExternalDependency = phExtensions.loadExternalDependency\n            if (!loadExternalDependency) {\n                // Cannot load surveys code\n                this._handleSurveyLoadError(LOAD_EXT_NOT_FOUND)\n                return\n            }\n\n            // If we reach here, we need to load the dependency\n            loadExternalDependency(this._instance, 'surveys', (err) => {\n                if (err || !phExtensions.generateSurveys) {\n                    this._handleSurveyLoadError('Could not load surveys script', err)\n                } else {\n                    // Need to get the function reference again inside the callback\n                    this._completeSurveyInitialization(phExtensions.generateSurveys, isSurveysEnabled)\n                }\n            })\n        } catch (e) {\n            this._handleSurveyLoadError('Error initializing surveys', e)\n            throw e\n        } finally {\n            // Ensure the flag is always reset\n            this._isInitializingSurveys = false\n        }\n    }\n\n    /** Helper to finalize survey initialization */\n    private _completeSurveyInitialization(\n        generateSurveysFn: (instance: PostHog, isSurveysEnabled: boolean) => any,\n        isSurveysEnabled: boolean\n    ): void {\n        this._surveyManager = generateSurveysFn(this._instance, isSurveysEnabled)\n        this._surveyEventReceiver = new SurveyEventReceiver(this._instance)\n        logger.info('Surveys loaded successfully')\n        this._notifySurveyCallbacks({ isLoaded: true })\n    }\n\n    /** Helper to handle errors during survey loading */\n    private _handleSurveyLoadError(message: string, error?: any): void {\n        logger.error(message, error)\n        this._notifySurveyCallbacks({ isLoaded: false, error: message })\n    }\n\n    /**\n     * Register a callback that runs when surveys are initialized.\n     * ### Usage:\n     *\n     *     posthog.onSurveysLoaded((surveys) => {\n     *         // You can work with all surveys\n     *         console.log('All available surveys:', surveys)\n     *\n     *         // Or get active matching surveys\n     *         posthog.getActiveMatchingSurveys((activeMatchingSurveys) => {\n     *             if (activeMatchingSurveys.length > 0) {\n     *                 posthog.renderSurvey(activeMatchingSurveys[0].id, '#survey-container')\n     *             }\n     *         })\n     *     })\n     *\n     * @param {Function} callback The callback function will be called when surveys are loaded or updated.\n     *                           It receives the array of all surveys and a context object with error status.\n     * @returns {Function} A function that can be called to unsubscribe the listener.\n     */\n    onSurveysLoaded(callback: SurveyCallback): () => void {\n        this._surveyCallbacks.push(callback)\n\n        if (this._surveyManager) {\n            this._notifySurveyCallbacks({\n                isLoaded: true,\n            })\n        }\n        // Return unsubscribe function\n        return () => {\n            this._surveyCallbacks = this._surveyCallbacks.filter((cb: SurveyCallback) => cb !== callback)\n        }\n    }\n\n    getSurveys(callback: SurveyCallback, forceReload = false) {\n        // In case we manage to load the surveys script, but config says not to load surveys\n        // then we shouldn't return survey data\n        if (this._config.disable_surveys) {\n            logger.info(SURVEY_DISABLED)\n            return callback([])\n        }\n\n        const existingSurveys = this._instance.get_property(SURVEYS)\n        if (existingSurveys && !forceReload) {\n            return callback(existingSurveys, {\n                isLoaded: true,\n            })\n        }\n\n        // If a fetch is already in progress and Promise is available, reuse that promise\n        // In browsers without Promise (IE11), we skip this optimization and just make concurrent requests\n        if (typeof Promise !== 'undefined' && this._getSurveysInFlightPromise) {\n            this._getSurveysInFlightPromise.then(({ surveys, context }) => callback(surveys, context))\n            return\n        }\n\n        // Create a new promise for this fetch that other callers can reuse\n        // We need to assign the promise before starting the request, because\n        // in tests (and potentially in some edge cases) the callback may fire synchronously\n        let resolvePromise: (value: { surveys: Survey[]; context: { isLoaded: boolean; error?: string } }) => void\n        if (typeof Promise !== 'undefined') {\n            this._getSurveysInFlightPromise = new Promise((resolve) => {\n                resolvePromise = resolve\n            })\n        }\n\n        this._instance._send_request({\n            url: this._instance.requestRouter.endpointFor('api', `/api/surveys/?token=${this._config.token}`),\n            method: 'GET',\n            timeout: this._config.surveys_request_timeout_ms,\n            callback: (response) => {\n                this._getSurveysInFlightPromise = null\n\n                const statusCode = response.statusCode\n                if (statusCode !== 200 || !response.json) {\n                    const error = `Surveys API could not be loaded, status: ${statusCode}`\n                    logger.error(error)\n                    const context = { isLoaded: false, error }\n                    callback([], context)\n                    resolvePromise?.({ surveys: [], context })\n                    return\n                }\n                const surveys = response.json.surveys || []\n\n                const eventOrActionBasedSurveys = surveys.filter(\n                    (survey: Survey) =>\n                        isSurveyRunning(survey) &&\n                        (doesSurveyActivateByEvent(survey) || doesSurveyActivateByAction(survey))\n                )\n\n                if (eventOrActionBasedSurveys.length > 0) {\n                    this._surveyEventReceiver?.register(eventOrActionBasedSurveys)\n                }\n\n                this._instance.persistence?.register({ [SURVEYS]: surveys })\n                const context = { isLoaded: true }\n                callback(surveys, context)\n                resolvePromise?.({ surveys, context })\n            },\n        })\n    }\n\n    /** Helper method to notify all registered callbacks */\n    private _notifySurveyCallbacks(context: { isLoaded: boolean; error?: string }): void {\n        for (const callback of this._surveyCallbacks) {\n            try {\n                if (!context.isLoaded) {\n                    return callback([], context)\n                }\n                this.getSurveys(callback)\n            } catch (error) {\n                logger.error('Error in survey callback', error)\n            }\n        }\n    }\n\n    getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n        if (isNullish(this._surveyManager)) {\n            logger.warn('init was not called')\n            return\n        }\n        return this._surveyManager.getActiveMatchingSurveys(callback, forceReload)\n    }\n\n    private _getSurveyById(surveyId: string): Survey | null {\n        let survey: Survey | null = null\n        this.getSurveys((surveys) => {\n            survey = surveys.find((x) => x.id === surveyId) ?? null\n        })\n        return survey\n    }\n\n    private _checkSurveyEligibility(surveyId: string | Survey): { eligible: boolean; reason?: string } {\n        if (isNullish(this._surveyManager)) {\n            return { eligible: false, reason: SURVEY_NOT_LOADED }\n        }\n        const survey = typeof surveyId === 'string' ? this._getSurveyById(surveyId) : surveyId\n        if (!survey) {\n            return { eligible: false, reason: 'Survey not found' }\n        }\n        return this._surveyManager.checkSurveyEligibility(survey)\n    }\n\n    canRenderSurvey(surveyId: string | Survey): SurveyRenderReason {\n        if (isNullish(this._surveyManager)) {\n            logger.warn('init was not called')\n            return { visible: false, disabledReason: SURVEY_NOT_LOADED }\n        }\n        const eligibility = this._checkSurveyEligibility(surveyId)\n\n        return { visible: eligibility.eligible, disabledReason: eligibility.reason }\n    }\n\n    canRenderSurveyAsync(surveyId: string, forceReload: boolean): Promise<SurveyRenderReason> {\n        // Ensure surveys are loaded before checking\n        // Using Promise to wrap the callback-based getSurveys method\n        if (isNullish(this._surveyManager)) {\n            logger.warn('init was not called')\n            return Promise.resolve({\n                visible: false,\n                disabledReason: SURVEY_NOT_LOADED,\n            })\n        }\n\n        // eslint-disable-next-line compat/compat\n        return new Promise<SurveyRenderReason>((resolve) => {\n            this.getSurveys((surveys) => {\n                const survey = surveys.find((x) => x.id === surveyId) ?? null\n                if (!survey) {\n                    resolve({ visible: false, disabledReason: 'Survey not found' })\n                } else {\n                    const eligibility = this._checkSurveyEligibility(survey)\n                    resolve({ visible: eligibility.eligible, disabledReason: eligibility.reason })\n                }\n            }, forceReload)\n        })\n    }\n\n    renderSurvey(surveyId: string | Survey, selector: string, properties?: Properties) {\n        if (isNullish(this._surveyManager)) {\n            logger.warn('init was not called')\n            return\n        }\n        const survey = typeof surveyId === 'string' ? this._getSurveyById(surveyId) : surveyId\n        if (!survey?.id) {\n            logger.warn('Survey not found')\n            return\n        }\n        if (!IN_APP_SURVEY_TYPES.includes(survey.type)) {\n            logger.warn(`Surveys of type ${survey.type} cannot be rendered in the app`)\n            return\n        }\n        const elem = document?.querySelector(selector)\n        if (!elem) {\n            logger.warn('Survey element not found')\n            return\n        }\n        if (survey.appearance?.surveyPopupDelaySeconds) {\n            logger.info(\n                `Rendering survey ${survey.id} with delay of ${survey.appearance.surveyPopupDelaySeconds} seconds`\n            )\n            setTimeout(() => {\n                logger.info(\n                    `Rendering survey ${survey.id} with delay of ${survey.appearance?.surveyPopupDelaySeconds} seconds`\n                )\n                this._surveyManager?.renderSurvey(survey, elem, properties)\n                logger.info(`Survey ${survey.id} rendered`)\n            }, survey.appearance.surveyPopupDelaySeconds * 1000)\n            return\n        }\n        this._surveyManager.renderSurvey(survey, elem, properties)\n    }\n\n    displaySurvey(surveyId: string, options: DisplaySurveyOptions) {\n        if (isNullish(this._surveyManager)) {\n            logger.warn('init was not called')\n            return\n        }\n        const survey = this._getSurveyById(surveyId)\n        if (!survey) {\n            logger.warn('Survey not found')\n            return\n        }\n        let surveyToDisplay = survey\n        if (survey.appearance?.surveyPopupDelaySeconds && options.ignoreDelay) {\n            surveyToDisplay = {\n                ...survey,\n                appearance: {\n                    ...survey.appearance,\n                    surveyPopupDelaySeconds: 0,\n                },\n            }\n        }\n        if (options.displayType !== DisplaySurveyType.Popover && options.initialResponses) {\n            logger.warn('initialResponses is only supported for popover surveys. prefill will not be applied.')\n        }\n        if (options.ignoreConditions === false) {\n            const canRender = this.canRenderSurvey(survey)\n            if (!canRender.visible) {\n                logger.warn('Survey is not eligible to be displayed: ', canRender.disabledReason)\n                return\n            }\n        }\n        if (options.displayType === DisplaySurveyType.Inline) {\n            this.renderSurvey(surveyToDisplay, options.selector, options.properties)\n            return\n        }\n        this._surveyManager.handlePopoverSurvey(surveyToDisplay, options)\n    }\n\n    cancelPendingSurvey(surveyId: string): void {\n        if (isNullish(this._surveyManager)) {\n            logger.warn('init was not called')\n            return\n        }\n        this._surveyManager.cancelSurvey(surveyId)\n    }\n\n    handlePageUnload(): void {\n        this._surveyManager?.handlePageUnload()\n    }\n}\n", "import { addEventListener, trySafe, isToolbarInstance } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { ToolbarParams } from '../types'\nimport { _getHashParam } from '../utils/request-utils'\nimport { createLogger } from '../utils/logger'\nimport { window, document, assignableWindow } from '../utils/globals'\nimport { TOOLBAR_ID } from '../constants'\nimport { isFunction, isNullish } from '@posthog/core'\nimport { Extension } from './types'\n\n// TRICKY: Many web frameworks will modify the route on load, potentially before posthog is initialized.\n// To get ahead of this we grab it as soon as the posthog-js is parsed\nconst STATE_FROM_WINDOW = window?.location\n    ? _getHashParam(window.location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n    : null\n\nconst LOCALSTORAGE_KEY = '_postHogToolbarParams'\n\nconst logger = createLogger('[Toolbar]')\n\nconst ToolbarState = { UNINITIALIZED: 0, LOADING: 1, LOADED: 2 } as const\ntype ToolbarState = (typeof ToolbarState)[keyof typeof ToolbarState]\n\nexport class Toolbar implements Extension {\n    instance: PostHog\n\n    constructor(instance: PostHog) {\n        this.instance = instance\n    }\n\n    // NOTE: We store the state of the toolbar in the global scope to avoid multiple instances of the SDK loading the toolbar\n    private _setToolbarState(state: ToolbarState) {\n        assignableWindow['ph_toolbar_state'] = state\n    }\n\n    private _getToolbarState(): ToolbarState {\n        return assignableWindow['ph_toolbar_state'] ?? ToolbarState.UNINITIALIZED\n    }\n\n    initialize(): boolean {\n        return this.maybeLoadToolbar()\n    }\n\n    /**\n     * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n     * 1. In the URL hash params\n     * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n     */\n    maybeLoadToolbar(\n        location: Location | undefined = undefined,\n        localStorage: Storage | undefined = undefined,\n        history: History | undefined = undefined\n    ): boolean {\n        // don't load the toolbar on the toolbar :)\n        if (isToolbarInstance(this.instance.config)) {\n            return false\n        }\n        if (!window || !document) {\n            return false\n        }\n        location = location ?? window.location\n        history = history ?? window.history\n\n        try {\n            // Before running the code we check if we can access localStorage, if not we opt-out\n            if (!localStorage) {\n                try {\n                    window.localStorage.setItem('test', 'test')\n                    window.localStorage.removeItem('test')\n                } catch {\n                    return false\n                }\n\n                // If localStorage was undefined, and localStorage is supported we set the default value\n                localStorage = window?.localStorage\n            }\n\n            /**\n             * Info about the state\n             * The state is a json object\n             * 1. (Legacy) The state can be `state={}` as a urlencoded object of info. In this case\n             * 2. The state should now be found in `__posthog={}` and can be base64 encoded or urlencoded.\n             * 3. Base64 encoding is preferred and will gradually be rolled out everywhere\n             */\n\n            const stateHash =\n                STATE_FROM_WINDOW || _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n\n            let toolbarParams: ToolbarParams\n            const state = stateHash\n                ? trySafe(() => JSON.parse(atob(decodeURIComponent(stateHash)))) ||\n                  trySafe(() => JSON.parse(decodeURIComponent(stateHash)))\n                : null\n\n            const parseFromUrl = state && state['action'] === 'ph_authorize'\n\n            if (parseFromUrl) {\n                // happens if they are initializing the toolbar using an old snippet\n                toolbarParams = state\n                toolbarParams.source = 'url'\n\n                if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n                    if (state['desiredHash']) {\n                        // hash that was in the url before the redirect\n                        location.hash = state['desiredHash']\n                    } else if (history) {\n                        // second param is unused see https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n                        history.replaceState(history.state, '', location.pathname + location.search) // completely remove hash\n                    } else {\n                        location.hash = '' // clear hash (but leaves # unfortunately)\n                    }\n                }\n            } else {\n                // get credentials from localStorage from a previous initialization\n\n                toolbarParams = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || '{}')\n                toolbarParams.source = 'localstorage'\n\n                // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n                // every time we open the page (e.g. you just visiting your own site an hour later)\n                delete toolbarParams.userIntent\n            }\n\n            if (toolbarParams['token'] && this.instance.config.token === toolbarParams['token']) {\n                this.loadToolbar(toolbarParams)\n                return true\n            } else {\n                return false\n            }\n        } catch {\n            return false\n        }\n    }\n\n    private _callLoadToolbar(params: ToolbarParams) {\n        const loadFn = assignableWindow['ph_load_toolbar'] || assignableWindow['ph_load_editor']\n        if (isNullish(loadFn) || !isFunction(loadFn)) {\n            logger.warn('No toolbar load function found')\n            return\n        }\n        loadFn(params, this.instance)\n    }\n\n    loadToolbar(params?: ToolbarParams): boolean {\n        const toolbarRunning = !!document?.getElementById(TOOLBAR_ID)\n\n        if (!window || toolbarRunning) {\n            // The toolbar will clear the localStorage key when it's done with it. If it is present that indicates the toolbar is already open and running\n            return false\n        }\n\n        const disableToolbarMetrics =\n            this.instance.requestRouter.region === 'custom' && this.instance.config.advanced_disable_toolbar_metrics\n\n        const toolbarParams = {\n            token: this.instance.config.token,\n            ...params,\n            apiURL: this.instance.requestRouter.endpointFor('ui'),\n            ...(disableToolbarMetrics ? { instrument: false } : {}),\n        }\n        window.localStorage.setItem(\n            LOCALSTORAGE_KEY,\n            JSON.stringify({\n                ...toolbarParams,\n                source: undefined,\n            })\n        )\n\n        if (this._getToolbarState() === ToolbarState.LOADED) {\n            this._callLoadToolbar(toolbarParams)\n        } else if (this._getToolbarState() === ToolbarState.UNINITIALIZED) {\n            // only load the toolbar once, even if there are multiple instances of PostHogLib\n            this._setToolbarState(ToolbarState.LOADING)\n\n            assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this.instance, 'toolbar', (err) => {\n                if (err) {\n                    logger.error('[Toolbar] Failed to load', err)\n                    this._setToolbarState(ToolbarState.UNINITIALIZED)\n                    return\n                }\n                this._setToolbarState(ToolbarState.LOADED)\n                this._callLoadToolbar(toolbarParams)\n            })\n\n            // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n            // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n            addEventListener(window, 'turbolinks:load', () => {\n                this._setToolbarState(ToolbarState.UNINITIALIZED)\n                this.loadToolbar(toolbarParams)\n            })\n        }\n\n        return true\n    }\n\n    /** @deprecated Use \"loadToolbar\" instead. */\n    _loadEditor(params: ToolbarParams): boolean {\n        return this.loadToolbar(params)\n    }\n\n    /** @deprecated Use \"maybeLoadToolbar\" instead. */\n    maybeLoadEditor(\n        location: Location | undefined = undefined,\n        localStorage: Storage | undefined = undefined,\n        history: History | undefined = undefined\n    ): boolean {\n        return this.maybeLoadToolbar(location, localStorage, history)\n    }\n}\n", "import { entries, extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n    FlagsResponse,\n    FeatureFlagsCallback,\n    EarlyAccessFeatureCallback,\n    EarlyAccessFeatureResponse,\n    Properties,\n    JsonType,\n    Compression,\n    EarlyAccessFeature,\n    RemoteConfigFeatureFlagCallback,\n    EarlyAccessFeatureStage,\n    FeatureFlagDetail,\n    FeatureFlagResult,\n    FeatureFlagOptions,\n    OverrideFeatureFlagsOptions,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\nimport type { Extension } from './extensions/types'\n\nimport {\n    PERSISTENCE_EARLY_ACCESS_FEATURES,\n    DEVICE_ID,\n    PERSISTENCE_ACTIVE_FEATURE_FLAGS,\n    PERSISTENCE_FEATURE_FLAG_DETAILS,\n    PERSISTENCE_FEATURE_FLAG_ERRORS,\n    PERSISTENCE_FEATURE_FLAG_EVALUATED_AT,\n    PERSISTENCE_FEATURE_FLAG_REQUEST_ID,\n    ENABLED_FEATURE_FLAGS,\n    STORED_GROUP_PROPERTIES_KEY,\n    STORED_PERSON_PROPERTIES_KEY,\n    FLAG_CALL_REPORTED,\n    FLAG_CALL_REPORTED_SESSION_ID,\n    PERSISTENCE_FEATURE_FLAG_PAYLOADS,\n    PERSISTENCE_OVERRIDE_FEATURE_FLAGS,\n    PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS,\n} from './constants'\n\nimport { isUndefined, isArray, isNull } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { getTimezone } from './utils/event-utils'\n\nconst logger = createLogger('[FeatureFlags]')\nconst forceDebugLogger = createLogger('[FeatureFlags]', { debugEnabled: true })\nconst FLAG_TIMEOUT_MSG = '\" failed. Feature flags didn\\'t load in time.'\n\n/**\n * Error type constants for the $feature_flag_error property.\n *\n * These values are sent in analytics events to track flag evaluation failures.\n * They should not be changed without considering impact on existing dashboards\n * and queries that filter on these values.\n */\nexport const FeatureFlagError = {\n    ERRORS_WHILE_COMPUTING: 'errors_while_computing_flags',\n    FLAG_MISSING: 'flag_missing',\n    QUOTA_LIMITED: 'quota_limited',\n    TIMEOUT: 'timeout',\n    CONNECTION_ERROR: 'connection_error',\n    UNKNOWN_ERROR: 'unknown_error',\n    apiError: (status: number | string) => `api_error_${status}`,\n} as const\n\n/** Converts an array of flag names to a Record where each flag is set to true. */\nconst arrayToFlagsRecord = (flags: string[]): Record<string, true> => {\n    const flagsObj: Record<string, true> = {}\n    for (let i = 0; i < flags.length; i++) {\n        flagsObj[flags[i]] = true\n    }\n    return flagsObj\n}\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n    const activeFeatureFlags: Record<string, string | boolean> = {}\n    for (const [key, value] of entries(featureFlags || {})) {\n        if (value) {\n            activeFeatureFlags[key] = value\n        }\n    }\n    return activeFeatureFlags\n}\n\nexport const parseFlagsResponse = (\n    response: Partial<FlagsResponse>,\n    persistence: PostHogPersistence,\n    currentFlags: Record<string, string | boolean> = {},\n    currentFlagPayloads: Record<string, JsonType> = {},\n    currentFlagDetails: Record<string, FeatureFlagDetail> = {},\n    options?: { partialResponse?: boolean }\n) => {\n    const normalizedResponse = normalizeFlagsResponse(response)\n    const flagDetails = normalizedResponse.flags\n    const featureFlags = normalizedResponse.featureFlags\n    const flagPayloads = normalizedResponse.featureFlagPayloads\n\n    if (!featureFlags) {\n        return // <-- This early return means we don't update anything, which is good.\n    }\n\n    const requestId = response['requestId']\n    const evaluatedAt = response['evaluatedAt']\n\n    // using the v1 api\n    if (isArray(featureFlags)) {\n        logger.warn('v1 of the feature flags endpoint is deprecated. Please use the latest version.')\n        const $enabled_feature_flags: Record<string, boolean> = {}\n        if (featureFlags) {\n            for (let i = 0; i < featureFlags.length; i++) {\n                $enabled_feature_flags[featureFlags[i]] = true\n            }\n        }\n        persistence &&\n            persistence.register({\n                [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: featureFlags,\n                [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n            })\n        return\n    }\n\n    // using the v2+ api\n    let newFeatureFlags = featureFlags\n    let newFeatureFlagPayloads = flagPayloads\n    let newFeatureFlagDetails = flagDetails\n    if (options?.partialResponse) {\n        // The response is intentionally partial (e.g., only survey flags were requested via\n        // advanced_only_evaluate_survey_feature_flags). Merge with existing flags so that\n        // bootstrapped or previously loaded non-survey flags are preserved.\n        newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n        newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n        newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n    } else if (response.errorsWhileComputingFlags) {\n        // if not all flags were computed, we upsert flags instead of replacing them\n        // but filter out flags that failed to evaluate so they don't overwrite cached values\n        if (flagDetails) {\n            const successfulKeys = new Set(Object.keys(flagDetails).filter((key) => !flagDetails[key]?.failed))\n\n            newFeatureFlags = {\n                ...currentFlags,\n                ...Object.fromEntries(Object.entries(newFeatureFlags).filter(([key]) => successfulKeys.has(key))),\n            }\n            newFeatureFlagPayloads = {\n                ...currentFlagPayloads,\n                ...Object.fromEntries(\n                    Object.entries(newFeatureFlagPayloads || {}).filter(([key]) => successfulKeys.has(key))\n                ),\n            }\n            newFeatureFlagDetails = {\n                ...currentFlagDetails,\n                ...Object.fromEntries(\n                    Object.entries(newFeatureFlagDetails || {}).filter(([key]) => successfulKeys.has(key))\n                ),\n            }\n        } else {\n            // v1 responses don't have flagDetails, so we can't filter by failed field\n            // Fall back to the original merge behavior\n            newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n            newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n            newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n        }\n    }\n\n    persistence &&\n        persistence.register({\n            [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n            [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n            [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n            [PERSISTENCE_FEATURE_FLAG_DETAILS]: newFeatureFlagDetails || {},\n            ...(requestId ? { [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: requestId } : {}),\n            ...(evaluatedAt ? { [PERSISTENCE_FEATURE_FLAG_EVALUATED_AT]: evaluatedAt } : {}),\n        })\n}\n\nconst normalizeFlagsResponse = (response: Partial<FlagsResponse>): Partial<FlagsResponse> => {\n    const flagDetails = response['flags']\n\n    if (flagDetails) {\n        // This is a /flags?v=2 request.\n\n        // Map of flag keys to flag values: Record<string, string | boolean>\n        response.featureFlags = Object.fromEntries(\n            Object.keys(flagDetails).map((flag) => [flag, flagDetails[flag].variant ?? flagDetails[flag].enabled])\n        )\n        // Map of flag keys to flag payloads: Record<string, JsonType>\n        response.featureFlagPayloads = Object.fromEntries(\n            Object.keys(flagDetails)\n                .filter((flag) => flagDetails[flag].enabled)\n                .filter((flag) => flagDetails[flag].metadata?.payload)\n                .map((flag) => [flag, flagDetails[flag].metadata?.payload])\n        )\n    } else {\n        logger.warn(\n            'Using an older version of the feature flags endpoint. Please upgrade your PostHog server to the latest version'\n        )\n    }\n    return response\n}\n\nexport const QuotaLimitedResource = {\n    FeatureFlags: 'feature_flags',\n    Recordings: 'recordings',\n} as const\nexport type QuotaLimitedResource = (typeof QuotaLimitedResource)[keyof typeof QuotaLimitedResource]\n\nexport class PostHogFeatureFlags implements Extension {\n    _override_warning: boolean = false\n    featureFlagEventHandlers: FeatureFlagsCallback[]\n    $anon_distinct_id: string | undefined\n    private _hasLoadedFlags: boolean = false\n    private _requestInFlight: boolean = false\n    private _reloadingDisabled: boolean = false\n    private _additionalReloadRequested: boolean = false\n    private _reloadDebouncer?: any\n    private _flagsLoadedFromRemote: boolean = false\n    private _hasLoggedDeprecationWarning: boolean = false\n    private _staleCacheRefreshTriggered: boolean = false\n\n    constructor(private _instance: PostHog) {\n        this.featureFlagEventHandlers = []\n    }\n\n    private get _config() {\n        return this._instance.config\n    }\n\n    private get _persistence() {\n        return this._instance.persistence\n    }\n\n    private _prop(key: string): any {\n        return this._instance.get_property(key)\n    }\n\n    /**\n     * Check if the feature flag cache is stale based on the configured TTL.\n     */\n    private _isCacheStale(): boolean {\n        return this._persistence?._isFeatureFlagCacheStale(this._config.feature_flag_cache_ttl_ms) ?? false\n    }\n\n    /**\n     * Triggers a debounced reload when cache staleness is first detected.\n     * Returns true if cache is stale, false otherwise.\n     */\n    private _checkAndTriggerStaleRefresh(): boolean {\n        if (!this._isCacheStale()) {\n            return false\n        }\n        // Only trigger refresh once per stale period\n        if (!this._staleCacheRefreshTriggered && !this._requestInFlight) {\n            this._staleCacheRefreshTriggered = true\n            logger.warn('Feature flag cache is stale, triggering refresh...')\n            this.reloadFeatureFlags()\n        }\n        return true\n    }\n\n    private _getValidEvaluationEnvironments(): string[] {\n        // Support both evaluation_contexts (new) and evaluation_environments (deprecated)\n        const envs = this._config.evaluation_contexts ?? this._config.evaluation_environments\n\n        // Log deprecation warning if using old field (only once)\n        if (\n            this._config.evaluation_environments &&\n            !this._config.evaluation_contexts &&\n            !this._hasLoggedDeprecationWarning\n        ) {\n            logger.warn(\n                'evaluation_environments is deprecated. Use evaluation_contexts instead. evaluation_environments will be removed in a future version.'\n            )\n            this._hasLoggedDeprecationWarning = true\n        }\n\n        if (!envs?.length) {\n            return []\n        }\n\n        return envs.filter((env: string) => {\n            const isValid = env && typeof env === 'string' && env.trim().length > 0\n            if (!isValid) {\n                logger.error('Invalid evaluation context found:', env, 'Expected non-empty string')\n            }\n            return isValid\n        })\n    }\n\n    private _shouldIncludeEvaluationEnvironments(): boolean {\n        return this._getValidEvaluationEnvironments().length > 0\n    }\n\n    initialize() {\n        const { config } = this._instance\n        const bootstrapFlags = config.bootstrap?.featureFlags ?? {}\n        const hasBootstrappedFlags = Object.keys(bootstrapFlags).length\n        if (hasBootstrappedFlags) {\n            const bootstrapPayloads = config.bootstrap?.featureFlagPayloads ?? {}\n            const activeFlags = Object.keys(bootstrapFlags)\n                .filter((flag) => !!bootstrapFlags[flag])\n                .reduce((res: Record<string, string | boolean>, key) => {\n                    res[key] = bootstrapFlags[key] || false\n                    return res\n                }, {})\n            const featureFlagPayloads = Object.keys(bootstrapPayloads)\n                .filter((key) => activeFlags[key])\n                .reduce((res: Record<string, JsonType>, key) => {\n                    if (bootstrapPayloads[key]) {\n                        res[key] = bootstrapPayloads[key]\n                    }\n                    return res\n                }, {})\n\n            this.receivedFeatureFlags({ featureFlags: activeFlags, featureFlagPayloads })\n        }\n    }\n\n    updateFlags(\n        flags: Record<string, boolean | string>,\n        payloads?: Record<string, JsonType>,\n        options?: { merge?: boolean }\n    ): void {\n        // If merging, combine with existing flags\n        const existingFlags = options?.merge ? this.getFlagVariants() : {}\n        const existingPayloads = options?.merge ? this.getFlagPayloads() : {}\n        const finalFlags = { ...existingFlags, ...flags }\n        const finalPayloads = { ...existingPayloads, ...payloads }\n\n        // Convert simple flags to v4 format to avoid deprecation warning\n        const flagDetails: Record<string, FeatureFlagDetail> = {}\n        for (const [key, value] of Object.entries(finalFlags)) {\n            const isVariant = typeof value === 'string'\n            flagDetails[key] = {\n                key,\n                enabled: isVariant ? true : Boolean(value),\n                variant: isVariant ? value : undefined,\n                reason: undefined,\n                // id: 0 indicates manually injected flags (not from server evaluation)\n                metadata: !isUndefined(finalPayloads?.[key])\n                    ? { id: 0, version: undefined, description: undefined, payload: finalPayloads[key] }\n                    : undefined,\n            }\n        }\n\n        this.receivedFeatureFlags({\n            flags: flagDetails,\n        })\n    }\n\n    get hasLoadedFlags(): boolean {\n        return this._hasLoadedFlags\n    }\n\n    getFlags(): string[] {\n        return Object.keys(this.getFlagVariants())\n    }\n\n    getFlagsWithDetails(): Record<string, FeatureFlagDetail> {\n        const flagDetails = this._prop(PERSISTENCE_FEATURE_FLAG_DETAILS)\n\n        const overridenFlags = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n        const overriddenPayloads = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n        if (!overriddenPayloads && !overridenFlags) {\n            return flagDetails || {}\n        }\n\n        const finalDetails = extend({}, flagDetails || {})\n        const overriddenKeys = [\n            ...new Set([...Object.keys(overriddenPayloads || {}), ...Object.keys(overridenFlags || {})]),\n        ]\n        for (const key of overriddenKeys) {\n            const originalDetail = finalDetails[key]\n            const overrideFlagValue = overridenFlags?.[key]\n\n            const finalEnabled = isUndefined(overrideFlagValue)\n                ? (originalDetail?.enabled ?? false)\n                : !!overrideFlagValue\n\n            const overrideVariant = isUndefined(overrideFlagValue)\n                ? originalDetail.variant\n                : typeof overrideFlagValue === 'string'\n                  ? overrideFlagValue\n                  : undefined\n\n            const overridePayload = overriddenPayloads?.[key]\n\n            const overridenDetail = {\n                ...originalDetail,\n                enabled: finalEnabled,\n                // If the flag is not enabled, the variant should be undefined, even if the original has a variant value.\n                variant: finalEnabled ? (overrideVariant ?? originalDetail?.variant) : undefined,\n            }\n\n            // Keep track of the original enabled and variant values so we can send them in the $feature_flag_called event.\n            // This will be helpful for debugging and for understanding the impact of overrides.\n            if (finalEnabled !== originalDetail?.enabled) {\n                overridenDetail.original_enabled = originalDetail?.enabled\n            }\n\n            if (overrideVariant !== originalDetail?.variant) {\n                overridenDetail.original_variant = originalDetail?.variant\n            }\n\n            if (overridePayload) {\n                overridenDetail.metadata = {\n                    ...originalDetail?.metadata,\n                    payload: overridePayload,\n                    original_payload: originalDetail?.metadata?.payload,\n                }\n            }\n\n            finalDetails[key] = overridenDetail\n        }\n\n        if (!this._override_warning) {\n            logger.warn(' Overriding feature flag details!', {\n                flagDetails,\n                overriddenPayloads,\n                finalDetails,\n            })\n            this._override_warning = true\n        }\n        return finalDetails\n    }\n\n    getFlagVariants(): Record<string, string | boolean> {\n        const enabledFlags = this._prop(ENABLED_FEATURE_FLAGS)\n        const overriddenFlags = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n        if (!overriddenFlags) {\n            return enabledFlags || {}\n        }\n\n        const finalFlags = extend({}, enabledFlags)\n        const overriddenKeys = Object.keys(overriddenFlags)\n        for (let i = 0; i < overriddenKeys.length; i++) {\n            finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n        }\n        if (!this._override_warning) {\n            logger.warn(' Overriding feature flags!', {\n                enabledFlags,\n                overriddenFlags,\n                finalFlags,\n            })\n            this._override_warning = true\n        }\n        return finalFlags\n    }\n\n    getFlagPayloads(): Record<string, JsonType> {\n        const flagPayloads = this._prop(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n        const overriddenPayloads = this._prop(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n        if (!overriddenPayloads) {\n            return flagPayloads || {}\n        }\n\n        const finalPayloads = extend({}, flagPayloads || {})\n        const overriddenKeys = Object.keys(overriddenPayloads)\n        for (let i = 0; i < overriddenKeys.length; i++) {\n            finalPayloads[overriddenKeys[i]] = overriddenPayloads[overriddenKeys[i]]\n        }\n\n        if (!this._override_warning) {\n            logger.warn(' Overriding feature flag payloads!', {\n                flagPayloads,\n                overriddenPayloads,\n                finalPayloads,\n            })\n            this._override_warning = true\n        }\n        return finalPayloads\n    }\n\n    /**\n     * Reloads feature flags asynchronously.\n     *\n     * Constraints:\n     *\n     * 1. Avoid parallel requests\n     * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n     */\n    reloadFeatureFlags(): void {\n        if (this._reloadingDisabled || this._config.advanced_disable_feature_flags) {\n            // If reloading has been explicitly disabled then we don't want to do anything\n            // Or if feature flags are disabled\n            return\n        }\n\n        if (this._reloadDebouncer) {\n            // If we're already in a debounce then we don't want to do anything\n            return\n        }\n\n        // Emit event so consumers know flags are being reloaded\n        this._instance._internalEventEmitter.emit('featureFlagsReloading', true)\n\n        // Debounce multiple calls on the same tick\n        this._reloadDebouncer = setTimeout(() => {\n            this._callFlagsEndpoint()\n        }, 5)\n    }\n\n    private _clearDebouncer(): void {\n        clearTimeout(this._reloadDebouncer)\n        this._reloadDebouncer = undefined\n    }\n\n    ensureFlagsLoaded(): void {\n        if (this._hasLoadedFlags || this._requestInFlight || this._reloadDebouncer) {\n            // If we are or have already loaded the flags then we don't want to do anything\n            return\n        }\n\n        this.reloadFeatureFlags()\n    }\n\n    setAnonymousDistinctId(anon_distinct_id: string): void {\n        this.$anon_distinct_id = anon_distinct_id\n    }\n\n    setReloadingPaused(isPaused: boolean): void {\n        this._reloadingDisabled = isPaused\n    }\n\n    _callFlagsEndpoint(options?: { disableFlags?: boolean }): void {\n        // Ensure we don't have double queued /flags requests\n        this._clearDebouncer()\n        if (this._instance._shouldDisableFlags()) {\n            // The way this is documented is essentially used to refuse to ever call the /flags endpoint.\n            return\n        }\n        if (this._requestInFlight) {\n            this._additionalReloadRequested = true\n            return\n        }\n        const token = this._config.token\n        const deviceId = this._prop(DEVICE_ID)\n\n        const data: Record<string, any> = {\n            token: token,\n            distinct_id: this._instance.get_distinct_id(),\n            groups: this._instance.getGroups(),\n            $anon_distinct_id: this.$anon_distinct_id,\n            person_properties: {\n                ...(this._persistence?.get_initial_props() || {}),\n                ...(this._prop(STORED_PERSON_PROPERTIES_KEY) || {}),\n            },\n            group_properties: this._prop(STORED_GROUP_PROPERTIES_KEY),\n            timezone: getTimezone(),\n        }\n\n        // Add device_id if available (handle cookieless mode where it's null)\n        if (!isNull(deviceId) && !isUndefined(deviceId)) {\n            data.$device_id = deviceId\n        }\n\n        if (options?.disableFlags || this._config.advanced_disable_feature_flags) {\n            data.disable_flags = true\n        }\n\n        // Add evaluation contexts if configured\n        if (this._shouldIncludeEvaluationEnvironments()) {\n            data.evaluation_contexts = this._getValidEvaluationEnvironments()\n        }\n\n        const queryParams = this._config.advanced_only_evaluate_survey_feature_flags\n            ? '&only_evaluate_survey_feature_flags=true'\n            : ''\n\n        const url = this._instance.requestRouter.endpointFor('flags', '/flags/?v=2' + queryParams)\n\n        this._requestInFlight = true\n        this._instance._send_request({\n            method: 'POST',\n            url,\n            data,\n            compression: this._config.disable_compression ? undefined : Compression.Base64,\n            timeout: this._config.feature_flag_request_timeout_ms,\n            callback: (response) => {\n                let errorsLoading = true\n\n                if (response.statusCode === 200) {\n                    // successful request\n                    // reset anon_distinct_id after at least a single request with it\n                    // makes it through\n                    if (!this._additionalReloadRequested) {\n                        this.$anon_distinct_id = undefined\n                    }\n                    errorsLoading = false\n                }\n\n                this._requestInFlight = false\n\n                if (data.disable_flags && !this._additionalReloadRequested) {\n                    // If flags are disabled then there is no need to call /flags again (flags are the only thing that may change)\n                    // UNLESS, an additional reload is requested.\n                    return\n                }\n\n                this._flagsLoadedFromRemote = !errorsLoading\n\n                const flagErrors: string[] = []\n                if (response.error) {\n                    if (response.error instanceof Error) {\n                        flagErrors.push(\n                            response.error.name === 'AbortError'\n                                ? FeatureFlagError.TIMEOUT\n                                : FeatureFlagError.CONNECTION_ERROR\n                        )\n                    } else {\n                        flagErrors.push(FeatureFlagError.UNKNOWN_ERROR)\n                    }\n                } else if (response.statusCode !== 200) {\n                    flagErrors.push(FeatureFlagError.apiError(response.statusCode))\n                }\n                if (response.json?.errorsWhileComputingFlags) {\n                    flagErrors.push(FeatureFlagError.ERRORS_WHILE_COMPUTING)\n                }\n                const isQuotaLimited = !!response.json?.quotaLimited?.includes(QuotaLimitedResource.FeatureFlags)\n                if (isQuotaLimited) {\n                    flagErrors.push(FeatureFlagError.QUOTA_LIMITED)\n                }\n\n                this._persistence?.register({\n                    [PERSISTENCE_FEATURE_FLAG_ERRORS]: flagErrors,\n                })\n\n                if (isQuotaLimited) {\n                    // log a warning and then early return\n                    logger.warn(\n                        'You have hit your feature flags quota limit, and will not be able to load feature flags until the quota is reset.  Please visit https://posthog.com/docs/billing/limits-alerts to learn more.'\n                    )\n                    return\n                }\n\n                if (!data.disable_flags) {\n                    this.receivedFeatureFlags(response.json ?? {}, errorsLoading, {\n                        partialResponse: !!this._config.advanced_only_evaluate_survey_feature_flags,\n                    })\n                }\n\n                if (this._additionalReloadRequested) {\n                    this._additionalReloadRequested = false\n                    this._callFlagsEndpoint()\n                }\n            },\n        })\n    }\n\n    /**\n     * Get feature flag's value for user.\n     *\n     * By default, this method may return cached values from localStorage if the `/flags` endpoint\n     * hasn't responded yet. This reduces flicker but means you might briefly see stale values\n     * (e.g., a flag that was disabled on the server).\n     *\n     * ### Usage:\n     *\n     *     if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n     *\n     *     // Only use fresh values from the server (returns undefined until /flags responds)\n     *     if(posthog.getFeatureFlag('my-flag', { fresh: true }) === 'some-variant') { // do something }\n     *\n     * @param {String} key Key of the feature flag.\n     * @param {Object} options Optional settings.\n     * @param {boolean} [options.send_event=true] If false, won't send a $feature_flag_called event to PostHog.\n     * @param {boolean} [options.fresh=false] If true, only returns values loaded from the server, not cached localStorage values.\n     *                  Use this when you need to ensure the flag value reflects the current server state,\n     *                  such as after disabling a flag. Returns undefined until the /flags endpoint responds.\n     * @returns {boolean | string | undefined} The flag value, or undefined if not found or not yet loaded.\n     */\n    getFeatureFlag(key: string, options: FeatureFlagOptions = {}): boolean | string | undefined {\n        if (options.fresh && !this._flagsLoadedFromRemote) {\n            return undefined\n        }\n        if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n            logger.warn('getFeatureFlag for key \"' + key + FLAG_TIMEOUT_MSG)\n            return undefined\n        }\n        // Check if cache is stale and trigger refresh if needed\n        if (this._checkAndTriggerStaleRefresh()) {\n            return undefined\n        }\n        const result = this.getFeatureFlagResult(key, options)\n        return result?.variant ?? result?.enabled\n    }\n\n    /*\n     * Retrieves the details for a feature flag.\n     *\n     * ### Usage:\n     *\n     *     const details = getFeatureFlagDetails(\"my-flag\")\n     *     console.log(details.metadata.version)\n     *     console.log(details.reason)\n     *\n     * @param {String} key Key of the feature flag.\n     */\n    getFeatureFlagDetails(key: string): FeatureFlagDetail | undefined {\n        const details = this.getFlagsWithDetails()\n        return details[key]\n    }\n\n    /**\n     * @deprecated Use `getFeatureFlagResult()` instead which properly tracks the feature flag call.\n     * `getFeatureFlagPayload()` does not emit the `$feature_flag_called` event which may result in\n     * missing analytics. This method will be removed in a future version.\n     */\n    getFeatureFlagPayload(key: string): JsonType {\n        // Don't send event to maintain backwards compatibility - this method never tracked calls\n        const result = this.getFeatureFlagResult(key, { send_event: false })\n        return result?.payload\n    }\n\n    /**\n     * Get a feature flag result including both the flag value and payload, while properly tracking the call.\n     * This method emits the `$feature_flag_called` event by default.\n     *\n     * By default, this method may return cached values from localStorage if the `/flags` endpoint\n     * hasn't responded yet. This reduces flicker but means you might briefly see stale values\n     * (e.g., a flag that was disabled on the server).\n     *\n     * ### Usage:\n     *\n     *     const result = posthog.getFeatureFlagResult('my-flag')\n     *     if (result?.enabled) {\n     *         console.log('Flag is enabled with payload:', result.payload)\n     *     }\n     *\n     *     // Only use fresh values from the server\n     *     const freshResult = posthog.getFeatureFlagResult('my-flag', { fresh: true })\n     *\n     * @param {String} key Key of the feature flag.\n     * @param {Object} [options] Options for the feature flag lookup.\n     * @param {boolean} [options.send_event=true] If false, won't send the $feature_flag_called event.\n     * @param {boolean} [options.fresh=false] If true, only returns values loaded from the server, not cached localStorage values.\n     *                  Use this when you need to ensure the flag value reflects the current server state.\n     *                  Returns undefined until the /flags endpoint responds.\n     * @returns {FeatureFlagResult | undefined} The feature flag result including key, enabled, variant, and payload.\n     */\n    getFeatureFlagResult(key: string, options: FeatureFlagOptions = {}): FeatureFlagResult | undefined {\n        if (options.fresh && !this._flagsLoadedFromRemote) {\n            return undefined\n        }\n        if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n            logger.warn('getFeatureFlagResult for key \"' + key + FLAG_TIMEOUT_MSG)\n            return undefined\n        }\n        // Check if cache is stale and trigger refresh if needed\n        if (this._checkAndTriggerStaleRefresh()) {\n            return undefined\n        }\n\n        const flagVariants = this.getFlagVariants()\n        const flagExists = key in flagVariants\n        const flagValue = flagVariants[key]\n        const payloads = this.getFlagPayloads()\n        const payload = payloads[key]\n        const flagReportValue = String(flagValue)\n        const requestId = this._prop(PERSISTENCE_FEATURE_FLAG_REQUEST_ID) || undefined\n        const evaluatedAt = this._prop(PERSISTENCE_FEATURE_FLAG_EVALUATED_AT) || undefined\n        let flagCallReported: Record<string, string[]> = this._prop(FLAG_CALL_REPORTED) || {}\n\n        // When session-scoped dedup is enabled, reset the reported flags whenever the session changes.\n        if (this._config.advanced_feature_flags_dedup_per_session) {\n            const currentSessionId = this._instance.get_session_id()\n            const storedSessionId = this._prop(FLAG_CALL_REPORTED_SESSION_ID)\n            if (currentSessionId && currentSessionId !== storedSessionId) {\n                flagCallReported = {}\n                this._persistence?.register({\n                    [FLAG_CALL_REPORTED]: flagCallReported,\n                    [FLAG_CALL_REPORTED_SESSION_ID]: currentSessionId,\n                })\n            }\n        }\n\n        if (options.send_event || !('send_event' in options)) {\n            if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n                if (isArray(flagCallReported[key])) {\n                    flagCallReported[key].push(flagReportValue)\n                } else {\n                    flagCallReported[key] = [flagReportValue]\n                }\n                this._persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n                const flagDetails = this.getFeatureFlagDetails(key)\n                const errors: string[] = [...(this._prop(PERSISTENCE_FEATURE_FLAG_ERRORS) ?? [])]\n                if (isUndefined(flagValue)) {\n                    errors.push(FeatureFlagError.FLAG_MISSING)\n                }\n\n                const properties: Record<string, any | undefined> = {\n                    $feature_flag: key,\n                    $feature_flag_response: flagValue,\n                    $feature_flag_payload: payload || null,\n                    $feature_flag_request_id: requestId,\n                    $feature_flag_evaluated_at: evaluatedAt,\n                    $feature_flag_bootstrapped_response: this._config.bootstrap?.featureFlags?.[key] || null,\n                    $feature_flag_bootstrapped_payload: this._config.bootstrap?.featureFlagPayloads?.[key] || null,\n                    // If we haven't yet received a response from the /flags endpoint, we must have used the bootstrapped value\n                    $used_bootstrap_value: !this._flagsLoadedFromRemote,\n                }\n\n                if (!isUndefined(flagDetails?.metadata?.version)) {\n                    properties.$feature_flag_version = flagDetails.metadata.version\n                }\n\n                const reason = flagDetails?.reason?.description ?? flagDetails?.reason?.code\n                if (reason) {\n                    properties.$feature_flag_reason = reason\n                }\n\n                if (flagDetails?.metadata?.id) {\n                    properties.$feature_flag_id = flagDetails.metadata.id\n                }\n\n                // It's possible that flag values were overridden by calling overrideFeatureFlags.\n                // We want to capture the original values in case someone forgets they were using overrides\n                // and is wondering why their app is acting weird.\n                if (!isUndefined(flagDetails?.original_variant) || !isUndefined(flagDetails?.original_enabled)) {\n                    properties.$feature_flag_original_response = !isUndefined(flagDetails.original_variant)\n                        ? flagDetails.original_variant\n                        : flagDetails.original_enabled\n                }\n\n                if (flagDetails?.metadata?.original_payload) {\n                    properties.$feature_flag_original_payload = flagDetails?.metadata?.original_payload\n                }\n\n                if (errors.length) {\n                    properties.$feature_flag_error = errors.join(',')\n                }\n\n                this._instance.capture('$feature_flag_called', properties)\n            }\n        }\n\n        if (!flagExists) {\n            return undefined\n        }\n\n        let parsedPayload = payload\n        if (!isUndefined(payload)) {\n            try {\n                parsedPayload = JSON.parse(payload as any)\n            } catch {\n                // payload is already parsed or not valid JSON, keep as-is\n            }\n        }\n\n        return {\n            key,\n            enabled: !!flagValue,\n            variant: typeof flagValue === 'string' ? flagValue : undefined,\n            payload: parsedPayload,\n        }\n    }\n\n    /*\n     * Fetches the payload for a remote config feature flag. This method will bypass any cached values and fetch the latest\n     * value from the PostHog API.\n     *\n     * Note: Because the posthog-js SDK is primarily used with public project API keys, encrypted remote config payloads will\n     * be redacted, never decrypted in the response.\n     *\n     * ### Usage:\n     *\n     *     getRemoteConfigPayload(\"home-page-welcome-message\", (payload) => console.log(`Fetched remote config: ${payload}`))\n     *\n     * @param {String} key Key of the feature flag.\n     * @param {Function} [callback] The callback function will be called once the remote config feature flag payload has been fetched.\n     */\n    getRemoteConfigPayload(key: string, callback: RemoteConfigFeatureFlagCallback): void {\n        const token = this._config.token\n        const data: Record<string, any> = {\n            distinct_id: this._instance.get_distinct_id(),\n            token,\n        }\n\n        // Add evaluation contexts if configured\n        if (this._shouldIncludeEvaluationEnvironments()) {\n            data.evaluation_contexts = this._getValidEvaluationEnvironments()\n        }\n\n        this._instance._send_request({\n            method: 'POST',\n            url: this._instance.requestRouter.endpointFor('flags', '/flags/?v=2'),\n            data,\n            compression: this._config.disable_compression ? undefined : Compression.Base64,\n            timeout: this._config.feature_flag_request_timeout_ms,\n            callback: (response) => {\n                const flagPayloads = response.json?.['featureFlagPayloads']\n                callback(flagPayloads?.[key] || undefined)\n            },\n        })\n    }\n\n    /**\n     * See if feature flag is enabled for user.\n     *\n     * By default, this method may return cached values from localStorage if the `/flags` endpoint\n     * hasn't responded yet. This reduces flicker but means you might briefly see stale values\n     * (e.g., a flag that was disabled on the server).\n     *\n     * ### Usage:\n     *\n     *     if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n     *\n     *     // Only use fresh values from the server\n     *     if(posthog.isFeatureEnabled('beta-feature', { fresh: true })) { // do something }\n     *\n     * @param {String} key Key of the feature flag.\n     * @param {Object} [options] Optional settings.\n     * @param {boolean} [options.send_event=true] If false, won't send a $feature_flag_called event to PostHog.\n     * @param {boolean} [options.fresh=false] If true, only returns values loaded from the server, not cached localStorage values.\n     *                  Use this when you need to ensure the flag value reflects the current server state.\n     *                  Returns undefined until the /flags endpoint responds.\n     * @returns {boolean | undefined} Whether the flag is enabled, or undefined if not found or not yet loaded.\n     */\n    isFeatureEnabled(key: string, options: FeatureFlagOptions = {}): boolean | undefined {\n        if (options.fresh && !this._flagsLoadedFromRemote) {\n            return undefined\n        }\n        if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n            logger.warn('isFeatureEnabled for key \"' + key + FLAG_TIMEOUT_MSG)\n            return undefined\n        }\n        const flagValue = this.getFeatureFlag(key, options)\n        return isUndefined(flagValue) ? undefined : !!flagValue\n    }\n\n    addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n        this.featureFlagEventHandlers.push(handler)\n    }\n\n    removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n        this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n    }\n\n    receivedFeatureFlags(\n        response: Partial<FlagsResponse>,\n        errorsLoading?: boolean,\n        options?: { partialResponse?: boolean }\n    ): void {\n        if (!this._persistence) {\n            return\n        }\n        this._hasLoadedFlags = true\n\n        const currentFlags = this.getFlagVariants()\n        const currentFlagPayloads = this.getFlagPayloads()\n        const currentFlagDetails = this.getFlagsWithDetails()\n        parseFlagsResponse(response, this._persistence, currentFlags, currentFlagPayloads, currentFlagDetails, options)\n\n        // Reset stale refresh flag when we successfully receive fresh flags\n        if (!errorsLoading) {\n            this._staleCacheRefreshTriggered = false\n        }\n\n        this._fireFeatureFlagsCallbacks(errorsLoading)\n    }\n\n    /**\n     * @deprecated Use overrideFeatureFlags instead. This will be removed in a future version.\n     */\n    override(flags: boolean | string[] | Record<string, string | boolean>, suppressWarning: boolean = false): void {\n        logger.warn('override is deprecated. Please use overrideFeatureFlags instead.')\n        this.overrideFeatureFlags({\n            flags: flags,\n            suppressWarning: suppressWarning,\n        })\n    }\n\n    /**\n     * Override feature flags on the client-side. Useful for setting non-persistent feature flags,\n     * or for testing/debugging feature flags in the PostHog app.\n     *\n     * ### Usage:\n     *\n     *     - posthog.featureFlags.overrideFeatureFlags(false) // clear all overrides\n     *     - posthog.featureFlags.overrideFeatureFlags(['beta-feature']) // enable flags\n     *     - posthog.featureFlags.overrideFeatureFlags({'beta-feature': 'variant'}) // set variants\n     *     - posthog.featureFlags.overrideFeatureFlags({ flags: ['beta-feature'] }) // enable flags\n     *     - posthog.featureFlags.overrideFeatureFlags({ flags: {'beta-feature': 'variant'} }) // set variants\n     *     - posthog.featureFlags.overrideFeatureFlags({ // set both flags and payloads\n     *         flags: {'beta-feature': 'variant'},\n     *         payloads: { 'beta-feature': { someData: true } }\n     *       })\n     *     - posthog.featureFlags.overrideFeatureFlags({ // only override payloads\n     *         payloads: { 'beta-feature': { someData: true } }\n     *       })\n     */\n    overrideFeatureFlags(overrideOptions: OverrideFeatureFlagsOptions): void {\n        if (!this._instance.__loaded || !this._persistence) {\n            return logger.uninitializedWarning('posthog.featureFlags.overrideFeatureFlags')\n        }\n\n        // Clear all overrides if false, lets you do something like posthog.featureFlags.overrideFeatureFlags(false)\n        if (overrideOptions === false) {\n            this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n            this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n            this._fireFeatureFlagsCallbacks()\n\n            return forceDebugLogger.info('All overrides cleared')\n        }\n\n        // Array syntax: ['flag-a', 'flag-b'] -> { 'flag-a': true, 'flag-b': true }\n        if (isArray(overrideOptions)) {\n            const flagsObj = arrayToFlagsRecord(overrideOptions)\n            this._persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n            this._fireFeatureFlagsCallbacks()\n\n            return forceDebugLogger.info('Flag overrides set', { flags: overrideOptions })\n        }\n\n        if (\n            overrideOptions &&\n            typeof overrideOptions === 'object' &&\n            ('flags' in overrideOptions || 'payloads' in overrideOptions)\n        ) {\n            const options = overrideOptions\n            this._override_warning = Boolean(options.suppressWarning ?? false)\n\n            // Handle flags if provided, lets you do something like posthog.featureFlags.overrideFeatureFlags({flags: ['beta-feature']})\n            if ('flags' in options) {\n                if (options.flags === false) {\n                    this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n                    forceDebugLogger.info('Flag overrides cleared')\n                } else if (options.flags) {\n                    if (isArray(options.flags)) {\n                        const flagsObj = arrayToFlagsRecord(options.flags)\n                        this._persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n                    } else {\n                        this._persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: options.flags })\n                    }\n\n                    forceDebugLogger.info('Flag overrides set', { flags: options.flags })\n                }\n            }\n\n            // Handle payloads independently, lets you do something like posthog.featureFlags.overrideFeatureFlags({payloads: { 'beta-feature': { someData: true } }})\n            if ('payloads' in options) {\n                if (options.payloads === false) {\n                    this._persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n                    forceDebugLogger.info('Payload overrides cleared')\n                } else if (options.payloads) {\n                    this._persistence.register({\n                        [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: options.payloads,\n                    })\n                    forceDebugLogger.info('Payload overrides set', { payloads: options.payloads })\n                }\n            }\n\n            this._fireFeatureFlagsCallbacks()\n            return\n        }\n\n        // Fallback: treat as Record<string, string | boolean>, e.g. {'beta-feature': 'variant'}\n        if (overrideOptions && typeof overrideOptions === 'object') {\n            this._persistence.register({\n                [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: overrideOptions as Record<string, string | boolean>,\n            })\n            this._fireFeatureFlagsCallbacks()\n\n            return forceDebugLogger.info('Flag overrides set', { flags: overrideOptions })\n        }\n\n        logger.warn('Invalid overrideOptions provided to overrideFeatureFlags', { overrideOptions })\n    }\n\n    /*\n     * Register an event listener that runs when feature flags become available or when they change.\n     * If there are flags, the listener is called immediately in addition to being called on future changes.\n     *\n     * ### Usage:\n     *\n     *     posthog.onFeatureFlags(function(featureFlags, featureFlagsVariants, { errorsLoading }) { // do something })\n     *\n     * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n     *                              It'll return a list of feature flags enabled for the user, the variants,\n     *                              and also a context object indicating whether we succeeded to fetch the flags or not.\n     * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n     */\n    onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n        this.addFeatureFlagsHandler(callback)\n        if (this._hasLoadedFlags) {\n            const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n            callback(flags, flagVariants)\n        }\n        return () => this.removeFeatureFlagsHandler(callback)\n    }\n\n    updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n        const existing_early_access_features: EarlyAccessFeature[] = this._prop(PERSISTENCE_EARLY_ACCESS_FEATURES) || []\n        const feature = existing_early_access_features.find((f) => f.flagKey === key)\n\n        const enrollmentPersonProp = {\n            [`$feature_enrollment/${key}`]: isEnrolled,\n        }\n\n        const properties: Properties = {\n            $feature_flag: key,\n            $feature_enrollment: isEnrolled,\n            $set: enrollmentPersonProp,\n        }\n\n        if (feature) {\n            properties['$early_access_feature_name'] = feature.name\n        }\n\n        if (stage) {\n            properties['$feature_enrollment_stage'] = stage\n        }\n\n        this._instance.capture('$feature_enrollment_update', properties)\n        this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n        const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n        this._persistence?.register({\n            [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n            [ENABLED_FEATURE_FLAGS]: newFlags,\n        })\n        this._fireFeatureFlagsCallbacks()\n    }\n\n    getEarlyAccessFeatures(\n        callback: EarlyAccessFeatureCallback,\n        force_reload = false,\n        stages?: EarlyAccessFeatureStage[]\n    ): void {\n        const existing_early_access_features = this._prop(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n        const stageParams = stages ? `&${stages.map((s) => `stage=${s}`).join('&')}` : ''\n\n        if (!existing_early_access_features || force_reload) {\n            this._instance._send_request({\n                url: this._instance.requestRouter.endpointFor(\n                    'api',\n                    `/api/early_access_features/?token=${this._config.token}${stageParams}`\n                ),\n                method: 'GET',\n                callback: (response) => {\n                    if (!response.json) {\n                        return\n                    }\n                    const earlyAccessFeatures = (response.json as EarlyAccessFeatureResponse).earlyAccessFeatures\n                    // Unregister first to ensure complete replacement, not merge\n                    // This prevents accumulation of stale features in persistence\n                    this._persistence?.unregister(PERSISTENCE_EARLY_ACCESS_FEATURES)\n                    this._persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n                    return callback(earlyAccessFeatures)\n                },\n            })\n        } else {\n            return callback(existing_early_access_features)\n        }\n    }\n\n    _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n        const flags = this.getFlags()\n        const flagVariants = this.getFlagVariants()\n\n        // Return truthy\n        const truthyFlags = flags.filter((flag) => flagVariants[flag])\n        const truthyFlagVariants = Object.keys(flagVariants)\n            .filter((variantKey) => flagVariants[variantKey])\n            .reduce((res: Record<string, string | boolean>, key) => {\n                res[key] = flagVariants[key]\n                return res\n            }, {})\n\n        return {\n            flags: truthyFlags,\n            flagVariants: truthyFlagVariants,\n        }\n    }\n\n    _fireFeatureFlagsCallbacks(errorsLoading?: boolean): void {\n        const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n        this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants, { errorsLoading }))\n    }\n\n    /**\n     * Set override person properties for feature flags.\n     * This is used when dealing with new persons / where you don't want to wait for ingestion\n     * to update user properties.\n     */\n    setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n        const existingProperties = this._prop(STORED_PERSON_PROPERTIES_KEY) || {}\n\n        // If the caller passes { $set, $set_once }, split them apart so we can apply $set_once\n        // semantics (skip keys that already exist). Otherwise treat all properties as $set for\n        // backward compatibility with the public API.\n        const propsToSet = properties?.['$set'] || (!properties?.['$set_once'] ? properties : {})\n        const propsToSetOnce = properties?.['$set_once']\n\n        const setOnceProps: Properties = {}\n        if (propsToSetOnce) {\n            for (const key in propsToSetOnce) {\n                if (Object.prototype.hasOwnProperty.call(propsToSetOnce, key)) {\n                    if (!(key in existingProperties)) {\n                        setOnceProps[key] = propsToSetOnce[key]\n                    }\n                }\n            }\n        }\n\n        this._instance.register({\n            [STORED_PERSON_PROPERTIES_KEY]: {\n                ...existingProperties,\n                ...setOnceProps,\n                ...propsToSet,\n            },\n        })\n\n        if (reloadFeatureFlags) {\n            this._instance.reloadFeatureFlags()\n        }\n    }\n\n    resetPersonPropertiesForFlags(): void {\n        this._instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n    }\n\n    /**\n     * Set override group properties for feature flags.\n     * This is used when dealing with new groups / where you don't want to wait for ingestion\n     * to update properties.\n     * Takes in an object, the key of which is the group type.\n     * For example:\n     *     setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n     */\n    setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n        // Get persisted group properties\n        const existingProperties = this._prop(STORED_GROUP_PROPERTIES_KEY) || {}\n\n        if (Object.keys(existingProperties).length !== 0) {\n            Object.keys(existingProperties).forEach((groupType) => {\n                existingProperties[groupType] = {\n                    ...existingProperties[groupType],\n                    ...properties[groupType],\n                }\n                delete properties[groupType]\n            })\n        }\n\n        this._instance.register({\n            [STORED_GROUP_PROPERTIES_KEY]: {\n                ...existingProperties,\n                ...properties,\n            },\n        })\n\n        if (reloadFeatureFlags) {\n            this._instance.reloadFeatureFlags()\n        }\n    }\n\n    resetGroupPropertiesForFlags(group_type?: string): void {\n        if (group_type) {\n            const existingProperties = this._prop(STORED_GROUP_PROPERTIES_KEY) || {}\n            this._instance.register({\n                [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n            })\n        } else {\n            this._instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n        }\n    }\n\n    reset(): void {\n        this._hasLoadedFlags = false\n        this._requestInFlight = false\n        this._reloadingDisabled = false\n        this._additionalReloadRequested = false\n        this._flagsLoadedFromRemote = false\n        this.$anon_distinct_id = undefined\n        this._clearDebouncer()\n        this._override_warning = false\n    }\n}\n", "import { ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS, ERROR_TRACKING_SUPPRESSION_RULES } from './constants'\nimport { Extension } from './extensions/types'\nimport { PostHog } from './posthog-core'\nimport { CaptureResult, ErrorTrackingSuppressionRule, Properties, RemoteConfig } from './types'\nimport { createLogger } from './utils/logger'\nimport { propertyComparisons } from './utils/property-utils'\nimport { isString, isArray, isObject, ErrorTracking, isNullish } from '@posthog/core'\n\nconst logger = createLogger('[Error tracking]')\n\nexport function buildErrorPropertiesBuilder() {\n    return new ErrorTracking.ErrorPropertiesBuilder(\n        [\n            new ErrorTracking.DOMExceptionCoercer(),\n            new ErrorTracking.PromiseRejectionEventCoercer(),\n            new ErrorTracking.ErrorEventCoercer(),\n            new ErrorTracking.ErrorCoercer(),\n            new ErrorTracking.EventCoercer(),\n            new ErrorTracking.ObjectCoercer(),\n            new ErrorTracking.StringCoercer(),\n            new ErrorTracking.PrimitiveCoercer(),\n        ],\n        ErrorTracking.createDefaultStackParser()\n    )\n}\nexport class PostHogExceptions implements Extension {\n    private readonly _instance: PostHog\n    private _suppressionRules: ErrorTrackingSuppressionRule[] = []\n    private _errorPropertiesBuilder: ErrorTracking.ErrorPropertiesBuilder = buildErrorPropertiesBuilder()\n    private _exceptionStepsBuffer: ErrorTracking.ExceptionStepsBuffer\n    private _exceptionStepsConfig: ErrorTracking.ResolvedExceptionStepsConfig\n\n    constructor(instance: PostHog) {\n        this._instance = instance\n        this._suppressionRules = this._instance.persistence?.get_property(ERROR_TRACKING_SUPPRESSION_RULES) ?? []\n        this._exceptionStepsConfig = ErrorTracking.resolveExceptionStepsConfig(this._getExceptionStepsConfig())\n        this._exceptionStepsBuffer = new ErrorTracking.ExceptionStepsBuffer(this._exceptionStepsConfig)\n    }\n\n    onConfigChange() {\n        this._exceptionStepsConfig = ErrorTracking.resolveExceptionStepsConfig(this._getExceptionStepsConfig())\n        this._exceptionStepsBuffer.setConfig(this._exceptionStepsConfig)\n    }\n\n    onRemoteConfig(response: RemoteConfig) {\n        if (!('errorTracking' in response)) {\n            return\n        }\n\n        const suppressionRules = response.errorTracking?.suppressionRules ?? []\n        const captureExtensionExceptions = response.errorTracking?.captureExtensionExceptions\n\n        // store this in-memory in case persistence is disabled\n        this._suppressionRules = suppressionRules\n\n        if (this._instance.persistence) {\n            this._instance.persistence.register({\n                [ERROR_TRACKING_SUPPRESSION_RULES]: this._suppressionRules,\n                [ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS]: captureExtensionExceptions,\n            })\n        }\n    }\n\n    private get _captureExtensionExceptions() {\n        const enabled_server_side = !!this._instance.get_property(ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS)\n        const enabled_client_side = this._instance.config.error_tracking.captureExtensionExceptions\n        return enabled_client_side ?? enabled_server_side ?? false\n    }\n\n    buildProperties(\n        input: unknown,\n        metadata?: { handled?: boolean; syntheticException?: Error }\n    ): ErrorTracking.ErrorProperties {\n        return this._errorPropertiesBuilder.buildFromUnknown(input, {\n            syntheticException: metadata?.syntheticException,\n            mechanism: {\n                handled: metadata?.handled,\n            },\n        })\n    }\n\n    addExceptionStep(message: string, properties?: Properties): void {\n        if (!this._exceptionStepsConfig.enabled) {\n            return\n        }\n\n        try {\n            if (!isString(message) || message.trim().length === 0) {\n                logger.warn('Ignoring exception step because message must be a non-empty string')\n                return\n            }\n\n            const userProperties = this._coerceExceptionStepProperties(properties)\n\n            const { sanitizedProperties, droppedKeys } = ErrorTracking.stripReservedExceptionStepFields(userProperties)\n\n            if (droppedKeys.length > 0) {\n                logger.warn('Ignoring reserved exception step fields', { droppedKeys })\n            }\n\n            this._exceptionStepsBuffer.add({\n                [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE]: message,\n                [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP]: new Date().toISOString(),\n                ...sanitizedProperties,\n            })\n        } catch (error) {\n            logger.error('Failed to add exception step. Ignoring breadcrumb.', error)\n        }\n    }\n\n    sendExceptionEvent(properties: Properties): CaptureResult | undefined {\n        try {\n            const exceptionList = properties.$exception_list\n\n            if (this._isExceptionList(exceptionList)) {\n                if (this._matchesSuppressionRule(exceptionList)) {\n                    this._addDroppedExceptionStep('Exception dropped: matched a suppression rule')\n                    logger.info('Skipping exception capture because a suppression rule matched')\n                    return\n                }\n\n                if (!this._captureExtensionExceptions && this._isExtensionException(exceptionList)) {\n                    this._addDroppedExceptionStep('Exception dropped: thrown by a browser extension')\n                    logger.info('Skipping exception capture because it was thrown by an extension')\n                    return\n                }\n\n                if (\n                    !this._instance.config.error_tracking.__capturePostHogExceptions &&\n                    this._isPostHogException(exceptionList)\n                ) {\n                    this._addDroppedExceptionStep('Exception dropped: thrown by the PostHog SDK')\n                    logger.info('Skipping exception capture because it was thrown by the PostHog SDK')\n                    return\n                }\n            }\n\n            const propertiesForExceptionCapture =\n                this._exceptionStepsConfig.enabled && isNullish(properties.$exception_steps)\n                    ? this._addBufferedExceptionSteps(properties)\n                    : properties\n\n            try {\n                const result = this._instance.capture('$exception', propertiesForExceptionCapture, {\n                    _noTruncate: true,\n                    _batchKey: 'exceptionEvent',\n                    _originatedFromCaptureException: true,\n                })\n\n                if (result) {\n                    this._exceptionStepsBuffer.clear()\n                }\n\n                return result\n            } catch (error) {\n                logger.error('Failed to capture exception event. Dropping this exception.', error)\n                this._exceptionStepsBuffer.clear()\n                return\n            }\n        } catch (error) {\n            logger.error('Failed to process exception event. Ignoring this exception.', error)\n            return\n        }\n    }\n\n    private _addBufferedExceptionSteps(properties: Properties): Properties {\n        try {\n            const exceptionSteps = this._exceptionStepsBuffer.getAttachable()\n\n            if (exceptionSteps.length === 0) {\n                return properties\n            }\n\n            return {\n                ...properties,\n                $exception_steps: exceptionSteps,\n            }\n        } catch (error) {\n            logger.error('Failed to read buffered exception steps. Capturing exception without steps.', error)\n            return properties\n        }\n    }\n\n    private _addDroppedExceptionStep(message: string): void {\n        if (this._exceptionStepsConfig.enabled) {\n            this._exceptionStepsBuffer.add({\n                [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.MESSAGE]: message,\n                [ErrorTracking.EXCEPTION_STEP_INTERNAL_FIELDS.TIMESTAMP]: new Date().toISOString(),\n            })\n        }\n    }\n\n    private _coerceExceptionStepProperties(properties?: Properties): Record<string, unknown> {\n        if (!isObject(properties)) {\n            return {}\n        }\n\n        return { ...(properties as Record<string, unknown>) }\n    }\n\n    private _getExceptionStepsConfig(): ErrorTracking.ExceptionStepsConfig {\n        return this._instance.config.error_tracking?.exception_steps ?? {}\n    }\n\n    private _matchesSuppressionRule(exceptionList: ErrorTracking.ExceptionList): boolean {\n        if (exceptionList.length === 0) {\n            return false\n        }\n\n        const exceptionValues = exceptionList.reduce(\n            (acc, { type, value }) => {\n                if (isString(type) && type.length > 0) {\n                    acc['$exception_types'].push(type)\n                }\n                if (isString(value) && value.length > 0) {\n                    acc['$exception_values'].push(value)\n                }\n                return acc\n            },\n            {\n                $exception_types: [] as string[],\n                $exception_values: [] as string[],\n            }\n        )\n\n        return this._suppressionRules.some((rule) => {\n            const results = rule.values.map((v) => {\n                const compare = propertyComparisons[v.operator]\n                const targets = isArray(v.value) ? v.value : [v.value]\n                const values = exceptionValues[v.key] ?? []\n                return targets.length > 0 ? compare(targets, values) : false\n            })\n            return rule.type === 'OR' ? results.some(Boolean) : results.every(Boolean)\n        })\n    }\n\n    private _isExtensionException(exceptionList: ErrorTracking.ExceptionList): boolean {\n        const frames = exceptionList.flatMap((e) => e.stacktrace?.frames ?? [])\n        return frames.some((f) => f.filename && f.filename.startsWith('chrome-extension://'))\n    }\n\n    private _isPostHogException(exceptionList: ErrorTracking.ExceptionList): boolean {\n        if (exceptionList.length > 0) {\n            const exception = exceptionList[0]\n            const frames = exception.stacktrace?.frames ?? []\n            const lastFrame = frames[frames.length - 1]\n            return lastFrame?.filename?.includes('posthog.com/static') ?? false\n        }\n\n        return false\n    }\n\n    private _isExceptionList(candidate: unknown): candidate is ErrorTracking.ExceptionList {\n        return !isNullish(candidate) && isArray(candidate)\n    }\n}\n", "import { PostHog } from './posthog-core'\nimport { navigator, window } from './utils/globals'\nimport {\n    WebExperiment,\n    WebExperimentsCallback,\n    WebExperimentTransform,\n    WebExperimentUrlMatchType,\n    WebExperimentVariant,\n} from './web-experiments-types'\nimport { WEB_EXPERIMENTS } from './constants'\nimport { isNullish, isString } from '@posthog/core'\nimport { getQueryParam } from './utils/request-utils'\nimport { isMatchingRegex } from './utils/regex-utils'\nimport { logger } from './utils/logger'\nimport { isLikelyBot } from './utils/blocked-uas'\nimport { getCampaignParams } from './utils/event-utils'\nimport { Extension } from './extensions/types'\n\nconst BOT_REFUSE_MSG = 'Refusing to render web experiment since the viewer is a likely bot'\n\nexport const webExperimentUrlValidationMap: Record<\n    WebExperimentUrlMatchType,\n    (conditionsUrl: string, location: Location) => boolean\n> = {\n    icontains: (conditionsUrl, location) =>\n        !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n    not_icontains: (conditionsUrl, location) =>\n        !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) === -1,\n    regex: (conditionsUrl, location) => !!window && isMatchingRegex(location.href, conditionsUrl),\n    not_regex: (conditionsUrl, location) => !!window && !isMatchingRegex(location.href, conditionsUrl),\n    exact: (conditionsUrl, location) => location.href === conditionsUrl,\n    is_not: (conditionsUrl, location) => location.href !== conditionsUrl,\n}\n\nexport class WebExperiments implements Extension {\n    private _flagToExperiments?: Map<string, WebExperiment>\n\n    private get _config() {\n        return this._instance.config\n    }\n\n    constructor(private _instance: PostHog) {\n        this._instance.onFeatureFlags((flags: string[]) => {\n            this.onFeatureFlags(flags)\n        })\n    }\n\n    // No-op: activation is driven by the onFeatureFlags callback registered in the constructor\n    initialize() {}\n\n    onFeatureFlags(flags: string[]) {\n        if (this._is_bot()) {\n            WebExperiments._logInfo(BOT_REFUSE_MSG)\n            return\n        }\n\n        if (this._config.disable_web_experiments) {\n            return\n        }\n\n        if (isNullish(this._flagToExperiments)) {\n            // Indicates first load so we trigger the loaders\n            this._flagToExperiments = new Map<string, WebExperiment>()\n            this.loadIfEnabled()\n            this.previewWebExperiment()\n            return\n        }\n\n        WebExperiments._logInfo('applying feature flags', flags)\n        flags.forEach((flag) => {\n            if (this._flagToExperiments && this._flagToExperiments?.has(flag)) {\n                const selectedVariant = this._instance.getFeatureFlag(flag) as unknown as string\n                const webExperiment = this._flagToExperiments?.get(flag)\n                if (selectedVariant && webExperiment?.variants[selectedVariant]) {\n                    this._applyTransforms(\n                        webExperiment.name,\n                        selectedVariant,\n                        webExperiment.variants[selectedVariant].transforms\n                    )\n                }\n            }\n        })\n    }\n\n    previewWebExperiment() {\n        const location = WebExperiments.getWindowLocation()\n        if (location?.search) {\n            const experimentID = getQueryParam(location?.search, '__experiment_id')\n            const variant = getQueryParam(location?.search, '__experiment_variant')\n            if (experimentID && variant) {\n                WebExperiments._logInfo(`previewing web experiments ${experimentID} && ${variant}`)\n                this.getWebExperiments(\n                    (webExperiments) => {\n                        this._showPreviewWebExperiment(parseInt(experimentID), variant, webExperiments)\n                    },\n                    false,\n                    true\n                )\n            }\n        }\n    }\n\n    loadIfEnabled() {\n        if (this._config.disable_web_experiments) {\n            return\n        }\n\n        this.getWebExperimentsAndEvaluateDisplayLogic()\n    }\n\n    public getWebExperimentsAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n        this.getWebExperiments((webExperiments) => {\n            WebExperiments._logInfo(`retrieved web experiments from the server`)\n            this._flagToExperiments = new Map<string, WebExperiment>()\n\n            webExperiments.forEach((webExperiment) => {\n                if (webExperiment.feature_flag_key) {\n                    if (this._flagToExperiments) {\n                        WebExperiments._logInfo(\n                            `setting flag key `,\n                            webExperiment.feature_flag_key,\n                            ` to web experiment `,\n                            webExperiment\n                        )\n                        this._flagToExperiments?.set(webExperiment.feature_flag_key, webExperiment)\n                    }\n\n                    const selectedVariant = this._instance.getFeatureFlag(webExperiment.feature_flag_key)\n                    if (isString(selectedVariant) && webExperiment.variants[selectedVariant]) {\n                        this._applyTransforms(\n                            webExperiment.name,\n                            selectedVariant,\n                            webExperiment.variants[selectedVariant].transforms\n                        )\n                    }\n                } else if (webExperiment.variants) {\n                    for (const variant in webExperiment.variants) {\n                        const testVariant = webExperiment.variants[variant]\n                        const matchTest = WebExperiments._matchesTestVariant(testVariant)\n                        if (matchTest) {\n                            this._applyTransforms(webExperiment.name, variant, testVariant.transforms)\n                        }\n                    }\n                }\n            })\n        }, forceReload)\n    }\n\n    public getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean, previewing?: boolean) {\n        if (this._config.disable_web_experiments && !previewing) {\n            return callback([])\n        }\n\n        const existingWebExperiments = this._instance.get_property(WEB_EXPERIMENTS)\n        if (existingWebExperiments && !forceReload) {\n            return callback(existingWebExperiments)\n        }\n\n        this._instance._send_request({\n            url: this._instance.requestRouter.endpointFor('api', `/api/web_experiments/?token=${this._config.token}`),\n            method: 'GET',\n            callback: (response) => {\n                if (response.statusCode !== 200 || !response.json) {\n                    return callback([])\n                }\n                const webExperiments = response.json.experiments || []\n                return callback(webExperiments)\n            },\n        })\n    }\n\n    private _showPreviewWebExperiment(experimentID: number, variant: string, webExperiments: WebExperiment[]) {\n        const previewExperiments = webExperiments.filter((exp) => exp.id === experimentID)\n        if (previewExperiments && previewExperiments.length > 0) {\n            WebExperiments._logInfo(\n                `Previewing web experiment [${previewExperiments[0].name}] with variant [${variant}]`\n            )\n            this._applyTransforms(\n                previewExperiments[0].name,\n                variant,\n                previewExperiments[0].variants[variant].transforms\n            )\n        }\n    }\n    private static _matchesTestVariant(testVariant: WebExperimentVariant) {\n        if (isNullish(testVariant.conditions)) {\n            return false\n        }\n        return WebExperiments._matchUrlConditions(testVariant) && WebExperiments._matchUTMConditions(testVariant)\n    }\n\n    private static _matchUrlConditions(testVariant: WebExperimentVariant): boolean {\n        if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.url)) {\n            return true\n        }\n\n        const location = WebExperiments.getWindowLocation()\n        if (location) {\n            const urlCheck = testVariant.conditions?.url\n                ? webExperimentUrlValidationMap[testVariant.conditions?.urlMatchType ?? 'icontains'](\n                      testVariant.conditions.url,\n                      location\n                  )\n                : true\n            return urlCheck\n        }\n\n        return false\n    }\n\n    public static getWindowLocation(): Location | undefined {\n        return window?.location\n    }\n\n    private static _matchUTMConditions(testVariant: WebExperimentVariant): boolean {\n        if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.utm)) {\n            return true\n        }\n        const campaignParams = getCampaignParams()\n        if (campaignParams['utm_source']) {\n            // eslint-disable-next-line compat/compat\n            const utmCampaignMatched = testVariant.conditions?.utm?.utm_campaign\n                ? testVariant.conditions?.utm?.utm_campaign == campaignParams['utm_campaign']\n                : true\n\n            const utmSourceMatched = testVariant.conditions?.utm?.utm_source\n                ? testVariant.conditions?.utm?.utm_source == campaignParams['utm_source']\n                : true\n\n            const utmMediumMatched = testVariant.conditions?.utm?.utm_medium\n                ? testVariant.conditions?.utm?.utm_medium == campaignParams['utm_medium']\n                : true\n\n            const utmTermMatched = testVariant.conditions?.utm?.utm_term\n                ? testVariant.conditions?.utm?.utm_term == campaignParams['utm_term']\n                : true\n\n            return utmCampaignMatched && utmMediumMatched && utmTermMatched && utmSourceMatched\n        }\n\n        return false\n    }\n\n    private static _logInfo(msg: string, ...args: any[]) {\n        logger.info(`[WebExperiments] ${msg}`, args)\n    }\n\n    private _applyTransforms(experiment: string, variant: string, transforms: WebExperimentTransform[]) {\n        if (this._is_bot()) {\n            WebExperiments._logInfo(BOT_REFUSE_MSG)\n            return\n        }\n\n        if (variant === 'control') {\n            WebExperiments._logInfo('Control variants leave the page unmodified.')\n            return\n        }\n\n        transforms.forEach((transform) => {\n            if (transform.selector) {\n                WebExperiments._logInfo(\n                    `applying transform of variant ${variant} for experiment ${experiment} `,\n                    transform\n                )\n\n                // eslint-disable-next-line no-restricted-globals\n                const elements = document?.querySelectorAll(transform.selector)\n                elements?.forEach((element) => {\n                    const htmlElement = element as HTMLElement\n                    if (transform.html) {\n                        htmlElement.innerHTML = transform.html\n                    }\n\n                    if (transform.css) {\n                        htmlElement.setAttribute('style', transform.css)\n                    }\n                })\n            }\n        })\n    }\n\n    _is_bot(): boolean | undefined {\n        if (navigator && this._instance) {\n            return isLikelyBot(navigator, this._config.custom_blocked_useragents)\n        } else {\n            return undefined\n        }\n    }\n}\n", "import { LOAD_EXT_NOT_FOUND } from '../../constants'\nimport { PostHog } from '../../posthog-core'\nimport {\n    ConversationsRemoteConfig,\n    GetMessagesResponse,\n    GetTicketsOptions,\n    GetTicketsResponse,\n    MarkAsReadResponse,\n    RestoreFromTokenResponse,\n    RequestRestoreLinkResponse,\n    SendMessageResponse,\n    UserProvidedTraits,\n} from '../../posthog-conversations-types'\nimport { RemoteConfig } from '../../types'\nimport { assignableWindow, LazyLoadedConversationsInterface } from '../../utils/globals'\nimport { createLogger } from '../../utils/logger'\nimport { isNullish, isUndefined, isBoolean, isNull } from '@posthog/core'\nimport { isToolbarInstance } from '../../utils'\nimport { Extension } from '../types'\n\nconst logger = createLogger('[Conversations]')\nconst NOT_AVAILABLE = 'Conversations not available yet.'\n\nexport type ConversationsManager = LazyLoadedConversationsInterface\n\nexport class PostHogConversations implements Extension {\n    // This is set to undefined until the remote config is loaded\n    // then it's set to true if conversations are enabled\n    // or false if conversations are disabled in the project settings\n    private _isConversationsEnabled?: boolean = undefined\n    private _conversationsManager: LazyLoadedConversationsInterface | null = null\n    private _isInitializing: boolean = false\n    private _remoteConfig: ConversationsRemoteConfig | null = null\n\n    constructor(private _instance: PostHog) {}\n\n    initialize() {\n        this.loadIfEnabled()\n    }\n\n    onRemoteConfig(response: RemoteConfig) {\n        // Don't load conversations if disabled via config\n        if (this._instance.config.disable_conversations) {\n            return\n        }\n\n        const conversations = response['conversations']\n        if (isNullish(conversations)) {\n            return\n        }\n\n        // Handle both boolean and object response\n        if (isBoolean(conversations)) {\n            this._isConversationsEnabled = conversations\n        } else {\n            // It's a ConversationsRemoteConfig object\n            this._isConversationsEnabled = conversations.enabled\n            this._remoteConfig = conversations\n        }\n\n        this.loadIfEnabled()\n    }\n\n    reset(): void {\n        // Delegate cleanup to the lazy-loaded manager (which knows about persistence keys)\n        // If not loaded, there's nothing to reset anyway\n        this._conversationsManager?.reset()\n        this._conversationsManager = null\n\n        // Reset local state\n        this._isConversationsEnabled = undefined\n        this._remoteConfig = null\n    }\n\n    loadIfEnabled() {\n        if (this._conversationsManager) {\n            return\n        }\n        if (this._isInitializing) {\n            return\n        }\n        if (this._instance.config.disable_conversations) {\n            return\n        }\n        // The toolbar's internal PostHog instance must not own the conversations\n        // manager — its distinct_id is always anonymous and would be sent instead\n        // of the identified user's ID.\n        if (isToolbarInstance(this._instance.config)) {\n            return\n        }\n        if (this._instance.config.cookieless_mode && this._instance.consent.isOptedOut()) {\n            return\n        }\n\n        const phExtensions = assignableWindow?.__PosthogExtensions__\n        if (!phExtensions) {\n            return\n        }\n\n        // Wait for remote config to load\n        if (isUndefined(this._isConversationsEnabled)) {\n            return\n        }\n\n        // Check if conversations are enabled\n        if (!this._isConversationsEnabled) {\n            return\n        }\n\n        // Check if we have the required config\n        if (!this._remoteConfig || !this._remoteConfig.token) {\n            logger.error('Conversations enabled but missing token in remote config.')\n            return\n        }\n\n        // Note: Domain check is done in ConversationsManager for widget rendering\n        // The conversations API is loaded regardless of domain restrictions\n\n        this._isInitializing = true\n\n        try {\n            const initConversations = phExtensions.initConversations\n            if (initConversations) {\n                // Conversations code is already loaded\n                this._completeInitialization(initConversations)\n                this._isInitializing = false\n                return\n            }\n\n            // If we reach here, conversations code is not loaded yet\n            const loadExternalDependency = phExtensions.loadExternalDependency\n            if (!loadExternalDependency) {\n                this._handleLoadError(LOAD_EXT_NOT_FOUND)\n                return\n            }\n\n            // Load the conversations bundle\n            loadExternalDependency(this._instance, 'conversations', (err) => {\n                if (err || !phExtensions.initConversations) {\n                    this._handleLoadError('Could not load conversations script', err)\n                } else {\n                    this._completeInitialization(phExtensions.initConversations)\n                }\n                this._isInitializing = false\n            })\n        } catch (e) {\n            this._handleLoadError('Error initializing conversations', e)\n            this._isInitializing = false\n        }\n    }\n\n    /** Helper to finalize conversations initialization */\n    private _completeInitialization(\n        initConversationsFn: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n    ): void {\n        if (!this._remoteConfig) {\n            logger.error('Cannot complete initialization: remote config is null')\n            return\n        }\n\n        try {\n            // Pass config and PostHog instance to the extension\n            this._conversationsManager = initConversationsFn(this._remoteConfig, this._instance)\n            logger.info('Conversations loaded successfully')\n        } catch (e) {\n            this._handleLoadError('Error completing conversations initialization', e)\n        }\n    }\n\n    /** Helper to handle initialization errors */\n    private _handleLoadError(message: string, error?: any): void {\n        logger.error(message, error)\n        this._conversationsManager = null\n        this._isInitializing = false\n    }\n\n    /**\n     * Show the conversations widget (button and chat panel)\n     */\n    show(): void {\n        if (!this._conversationsManager) {\n            logger.warn('Conversations not loaded yet.')\n            return\n        }\n        this._conversationsManager.show()\n    }\n\n    /**\n     * Hide the conversations widget completely (button and chat panel)\n     */\n    hide(): void {\n        if (!this._conversationsManager) {\n            return\n        }\n        this._conversationsManager.hide()\n    }\n\n    /**\n     * Check if conversations are available (enabled in remote config AND loaded)\n     * Use this to check if conversations API can be used.\n     */\n    isAvailable(): boolean {\n        return this._isConversationsEnabled === true && !isNull(this._conversationsManager)\n    }\n\n    /**\n     * Check if the widget is currently visible (rendered and shown)\n     */\n    isVisible(): boolean {\n        return this._conversationsManager?.isVisible() ?? false\n    }\n\n    /**\n     * Send a message programmatically\n     * Creates a new ticket if none exists or if newTicket is true\n     *\n     * @param message - The message text to send\n     * @param userTraits - Optional user identification data (name, email)\n     * @param newTicket - If true, forces creation of a new ticket (starts new conversation)\n     * @returns Promise with response or null if conversations not available yet\n     * @note Conversations must be available first (check with isAvailable())\n     *\n     * @example\n     * // Send to existing or create new conversation\n     * const response = await posthog.conversations.sendMessage('Hello!', {\n     *   name: 'John Doe',\n     *   email: 'john@example.com'\n     * })\n     *\n     * @example\n     * // Force creation of a new conversation/ticket\n     * const newConvo = await posthog.conversations.sendMessage('Start fresh', undefined, true)\n     */\n    async sendMessage(\n        message: string,\n        userTraits?: UserProvidedTraits,\n        newTicket?: boolean\n    ): Promise<SendMessageResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.sendMessage(message, userTraits, newTicket)\n    }\n\n    /**\n     * Get messages for the current or specified ticket\n     *\n     * @param ticketId - Optional ticket ID (defaults to current active ticket)\n     * @param after - Optional ISO timestamp to fetch messages after\n     * @returns Promise with messages response or null if conversations not available yet\n     * @note Conversations must be available first (check with isAvailable())\n     *\n     * @example\n     * // Get messages for current ticket\n     * const messages = await posthog.conversations.getMessages()\n     *\n     * // Get messages for specific ticket\n     * const messages = await posthog.conversations.getMessages('ticket-uuid')\n     */\n    async getMessages(ticketId?: string, after?: string): Promise<GetMessagesResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.getMessages(ticketId, after)\n    }\n\n    /**\n     * Mark messages as read for the current or specified ticket\n     *\n     * @param ticketId - Optional ticket ID (defaults to current active ticket)\n     * @returns Promise with response or null if conversations not available yet\n     * @note Conversations must be available first (check with isAvailable())\n     *\n     * @example\n     * await posthog.conversations.markAsRead()\n     */\n    async markAsRead(ticketId?: string): Promise<MarkAsReadResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.markAsRead(ticketId)\n    }\n\n    /**\n     * Get list of tickets for the current widget session\n     *\n     * @param options - Optional filtering and pagination options\n     * @returns Promise with tickets response or null if conversations not available yet\n     * @note Conversations must be available first (check with isAvailable())\n     *\n     * @example\n     * const tickets = await posthog.conversations.getTickets({\n     *   limit: 10,\n     *   offset: 0,\n     *   status: 'open'\n     * })\n     */\n    async getTickets(options?: GetTicketsOptions): Promise<GetTicketsResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.getTickets(options)\n    }\n\n    /**\n     * Request a restore link email for previous conversations.\n     *\n     * @param email - Email address associated with previous conversations\n     * @returns Promise with generic success response or null if conversations unavailable\n     */\n    async requestRestoreLink(email: string): Promise<RequestRestoreLinkResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.requestRestoreLink(email)\n    }\n\n    /**\n     * Redeem a restore token and relink eligible tickets to this browser session.\n     *\n     * @param restoreToken - Opaque restore token from restore email link\n     * @returns Promise with restore status or null if conversations unavailable\n     */\n    async restoreFromToken(restoreToken: string): Promise<RestoreFromTokenResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.restoreFromToken(restoreToken)\n    }\n\n    /**\n     * Parse and redeem `ph_conv_restore` token from the current URL.\n     *\n     * @returns Promise with restore status, or null when no token/conversations unavailable\n     */\n    async restoreFromUrlToken(): Promise<RestoreFromTokenResponse | null> {\n        if (!this._conversationsManager) {\n            logger.warn(NOT_AVAILABLE)\n            return null\n        }\n        return this._conversationsManager.restoreFromUrlToken()\n    }\n\n    /**\n     * Get the current active ticket ID\n     * Returns null if no conversation has been started yet or if not available\n     *\n     * @returns Ticket ID or null\n     * @note Safe to call before conversations are available, will return null\n     *\n     * @example\n     * const ticketId = posthog.conversations.getCurrentTicketId()\n     * if (ticketId) {\n     *   console.log('Current ticket ID:', ticketId)\n     * }\n     */\n    getCurrentTicketId(): string | null {\n        return this._conversationsManager?.getCurrentTicketId() ?? null\n    }\n\n    /**\n     * Get the widget session ID (persistent browser identifier)\n     * This ID is used for access control and stays the same across page loads\n     * Returns null if conversations not available yet\n     *\n     * @returns Session ID or null if not available\n     * @note Safe to call before conversations are available, will return null\n     *\n     * @example\n     * const sessionId = posthog.conversations.getWidgetSessionId()\n     * if (!sessionId) {\n     *   // Conversations not available yet\n     *   posthog.conversations.show()\n     * }\n     */\n    getWidgetSessionId(): string | null {\n        return this._conversationsManager?.getWidgetSessionId() ?? null\n    }\n\n    /** @internal Called by PostHog.setIdentity() -- forwards to the manager without recursing */\n    _onIdentityChanged(): void {\n        this._conversationsManager?.setIdentity()\n    }\n\n    /** @internal Called by PostHog.clearIdentity() -- forwards to the manager without recursing */\n    _onIdentityCleared(): void {\n        this._conversationsManager?.clearIdentity()\n    }\n}\n", "/**\n * Pre-grouped extension bundles for tree-shaking support.\n *\n * Each bundle is self-contained: a feature plus its runtime dependencies.\n * Use these with `__extensionClasses` to control which extensions are included in your bundle.\n * The default `posthog-js` entrypoint includes all extensions. When using `posthog-js/slim`,\n * you can import only the bundles you need:\n *\n * @example\n * ```ts\n * import posthog from 'posthog-js/slim'\n * import { SessionReplayExtensions, AnalyticsExtensions } from 'posthog-js/extensions'\n *\n * posthog.init('ph_key', {\n *   __extensionClasses: {\n *     ...SessionReplayExtensions,\n *     ...AnalyticsExtensions,\n *   }\n * })\n * ```\n *\n * @module\n */\n\nimport { Autocapture } from '../autocapture'\nimport { DeadClicksAutocapture } from './dead-clicks-autocapture'\nimport { ExceptionObserver } from './exception-autocapture'\nimport { HistoryAutocapture } from './history-autocapture'\nimport { TracingHeaders } from './tracing-headers'\nimport { WebVitalsAutocapture } from './web-vitals'\nimport { SessionRecording } from './replay/session-recording'\nimport { Heatmaps } from '../heatmaps'\nimport { PostHogProductTours } from '../posthog-product-tours'\nimport { SiteApps } from '../site-apps'\nimport { PostHogConfig } from '../types'\nimport { PostHogSurveys } from '../posthog-surveys'\nimport { Toolbar } from './toolbar'\nimport { PostHogFeatureFlags } from '../posthog-featureflags'\nimport { PostHogExceptions } from '../posthog-exceptions'\nimport { WebExperiments } from '../web-experiments'\nimport { PostHogConversations } from './conversations/posthog-conversations'\nimport { PostHogLogs } from '../posthog-logs'\n\ntype ExtensionClasses = NonNullable<PostHogConfig['__extensionClasses']>\n\n/** Feature flags. */\nexport const FeatureFlagsExtensions = {\n    featureFlags: PostHogFeatureFlags,\n} as const satisfies ExtensionClasses\n\n/** Session replay. */\nexport const SessionReplayExtensions = {\n    sessionRecording: SessionRecording,\n} as const satisfies ExtensionClasses\n\n/** Autocapture, click tracking, heatmaps, and web vitals. */\nexport const AnalyticsExtensions = {\n    autocapture: Autocapture,\n    historyAutocapture: HistoryAutocapture,\n    heatmaps: Heatmaps,\n    deadClicksAutocapture: DeadClicksAutocapture,\n    webVitalsAutocapture: WebVitalsAutocapture,\n} as const satisfies ExtensionClasses\n\n/** Exception and error capture. Requires both the observer (capture hook) and exceptions (forwarding). */\nexport const ErrorTrackingExtensions = {\n    exceptionObserver: ExceptionObserver,\n    exceptions: PostHogExceptions,\n} as const satisfies ExtensionClasses\n\n/** In-app product tours. Includes feature flags for targeting. */\nexport const ProductToursExtensions = {\n    productTours: PostHogProductTours,\n    ...FeatureFlagsExtensions,\n} as const satisfies ExtensionClasses\n\n/** Site apps support. */\nexport const SiteAppsExtensions = {\n    siteApps: SiteApps,\n} as const satisfies ExtensionClasses\n\n/** Distributed tracing header injection. */\nexport const TracingExtensions = {\n    tracingHeaders: TracingHeaders,\n} as const satisfies ExtensionClasses\n\n/** In-app surveys. Includes feature flags for targeting. */\nexport const SurveysExtensions = {\n    surveys: PostHogSurveys,\n    ...FeatureFlagsExtensions,\n} as const satisfies ExtensionClasses\n\n/** PostHog toolbar for visual element inspection and action setup. */\nexport const ToolbarExtensions = {\n    toolbar: Toolbar,\n} as const satisfies ExtensionClasses\n\n/** Web experiments. Includes feature flags for variant evaluation. */\nexport const ExperimentsExtensions = {\n    experiments: WebExperiments,\n    ...FeatureFlagsExtensions,\n} as const satisfies ExtensionClasses\n\n/** In-app conversations. */\nexport const ConversationsExtensions = {\n    conversations: PostHogConversations,\n} as const satisfies ExtensionClasses\n\n/** Console log capture. */\nexport const LogsExtensions = {\n    logs: PostHogLogs,\n} as const satisfies ExtensionClasses\n\n/** All extensions — equivalent to the default `posthog-js` bundle. */\nexport const AllExtensions = {\n    ...FeatureFlagsExtensions,\n    ...SessionReplayExtensions,\n    ...AnalyticsExtensions,\n    ...ErrorTrackingExtensions,\n    ...ProductToursExtensions,\n    ...SiteAppsExtensions,\n    ...SurveysExtensions,\n    ...TracingExtensions,\n    ...ToolbarExtensions,\n    ...ExperimentsExtensions,\n    ...ConversationsExtensions,\n    ...LogsExtensions,\n} as const satisfies ExtensionClasses\n", "import { PostHog } from '../posthog-core'\nimport { EVENT_PAGEVIEW } from '../constants'\nimport { window } from '../utils/globals'\nimport { addEventListener } from '../utils'\nimport { logger } from '../utils/logger'\nimport { patch } from './replay/rrweb-plugins/patch'\nimport type { Extension } from './types'\n\n/**\n * This class is used to capture pageview events when the user navigates using the history API (pushState, replaceState)\n * and when the user navigates using the browser's back/forward buttons.\n *\n * The behavior is controlled by the `capture_pageview` configuration option:\n * - When set to `'history_change'`, this class will capture pageviews on history API changes\n */\nexport class HistoryAutocapture implements Extension {\n    private _instance: PostHog\n    private _popstateListener: (() => void) | undefined\n    private _lastPathname: string\n\n    constructor(instance: PostHog) {\n        this._instance = instance\n        this._lastPathname = window?.location?.pathname || ''\n    }\n\n    initialize() {\n        this.startIfEnabled()\n    }\n\n    public get isEnabled(): boolean {\n        return this._instance.config.capture_pageview === 'history_change'\n    }\n\n    public startIfEnabled(): void {\n        if (this.isEnabled) {\n            logger.info('History API monitoring enabled, starting...')\n            this.monitorHistoryChanges()\n        }\n    }\n\n    public stop(): void {\n        if (this._popstateListener) {\n            this._popstateListener()\n        }\n        this._popstateListener = undefined\n        logger.info('History API monitoring stopped')\n    }\n\n    public monitorHistoryChanges(): void {\n        if (!window || !window.history) {\n            return\n        }\n\n        // Old fashioned, we could also use arrow functions but I think the closure for a patch is more reliable\n        // eslint-disable-next-line @typescript-eslint/no-this-alias\n        const self = this\n\n        if (!(window.history.pushState as any)?.__posthog_wrapped__) {\n            patch(window.history, 'pushState', (originalPushState) => {\n                return function patchedPushState(\n                    this: History,\n                    state: any,\n                    title: string,\n                    url?: string | URL | null\n                ): void {\n                    ;(originalPushState as History['pushState']).call(this, state, title, url)\n                    self._capturePageview('pushState')\n                }\n            })\n        }\n\n        if (!(window.history.replaceState as any)?.__posthog_wrapped__) {\n            patch(window.history, 'replaceState', (originalReplaceState) => {\n                return function patchedReplaceState(\n                    this: History,\n                    state: any,\n                    title: string,\n                    url?: string | URL | null\n                ): void {\n                    ;(originalReplaceState as History['replaceState']).call(this, state, title, url)\n                    self._capturePageview('replaceState')\n                }\n            })\n        }\n\n        this._setupPopstateListener()\n    }\n\n    private _capturePageview(navigationType: 'pushState' | 'replaceState' | 'popstate'): void {\n        try {\n            const currentPathname = window?.location?.pathname\n\n            if (!currentPathname) {\n                return\n            }\n\n            // Only capture pageview if the pathname has changed and the feature is enabled\n            if (currentPathname !== this._lastPathname && this.isEnabled) {\n                this._instance.capture(EVENT_PAGEVIEW, { navigation_type: navigationType })\n            }\n\n            this._lastPathname = currentPathname\n        } catch (error) {\n            logger.error(`Error capturing ${navigationType} pageview`, error)\n        }\n    }\n\n    private _setupPopstateListener(): void {\n        if (this._popstateListener) {\n            return\n        }\n\n        const handler = () => {\n            this._capturePageview('popstate')\n        }\n\n        addEventListener(window, 'popstate', handler)\n        this._popstateListener = () => {\n            if (window) {\n                window.removeEventListener('popstate', handler)\n            }\n        }\n    }\n}\n", "import { LOAD_EXT_NOT_FOUND } from './constants'\nimport Config from './config'\nimport { PostHog } from './posthog-core'\nimport type { CaptureLogOptions, RemoteConfig, Logger, LogSdkContext, LogAttributeValue, OtlpLogRecord } from './types'\nimport { buildOtlpLogRecord, buildOtlpLogsPayload, isNullish } from '@posthog/core'\nimport { assignableWindow } from './utils/globals'\nimport { createLogger } from './utils/logger'\nimport { Extension } from './extensions/types'\n\nconst DEFAULT_FLUSH_INTERVAL_MS = 3000\nconst DEFAULT_MAX_BUFFER_SIZE = 100\nconst DEFAULT_MAX_LOGS_PER_INTERVAL = 1000\n\ninterface BufferedLogEntry {\n    record: OtlpLogRecord\n}\n\nexport class PostHogLogs implements Extension {\n    private _isLogsEnabled: boolean = false\n    private _isLoaded: boolean = false\n    private readonly _logger = createLogger('[logs]')\n\n    private _logBuffer: BufferedLogEntry[] = []\n    private _flushTimeout: ReturnType<typeof setTimeout> | undefined\n    private _logger_instance: Logger | undefined\n\n    private _intervalLogCount: number = 0\n    private _intervalWindowStart: number = 0\n    private _droppedWarned: boolean = false\n\n    constructor(private readonly _instance: PostHog) {\n        if (this._instance && this._instance.config.logs?.captureConsoleLogs) {\n            this._isLogsEnabled = true\n        }\n    }\n\n    initialize() {\n        this.loadIfEnabled()\n    }\n\n    onRemoteConfig(response: RemoteConfig) {\n        // only load logs if they are enabled\n        const logCapture = response.logs?.captureConsoleLogs\n        if (isNullish(logCapture) || !logCapture) {\n            return\n        }\n        this._isLogsEnabled = true\n        this.loadIfEnabled()\n    }\n\n    reset(): void {\n        this._logBuffer = []\n        if (this._flushTimeout) {\n            clearTimeout(this._flushTimeout)\n            this._flushTimeout = undefined\n        }\n        this._intervalLogCount = 0\n        this._intervalWindowStart = 0\n        this._droppedWarned = false\n    }\n\n    loadIfEnabled() {\n        if (!this._isLogsEnabled || this._isLoaded) {\n            return\n        }\n\n        const phExtensions = assignableWindow?.__PosthogExtensions__\n        if (!phExtensions) {\n            this._logger.error('PostHog Extensions not found.')\n            return\n        }\n\n        const loadExternalDependency = phExtensions.loadExternalDependency\n        if (!loadExternalDependency) {\n            this._logger.error(LOAD_EXT_NOT_FOUND)\n            return\n        }\n\n        loadExternalDependency(this._instance, 'logs', (err) => {\n            if (err || !phExtensions.logs?.initializeLogs) {\n                this._logger.error('Could not load logs script', err)\n            } else {\n                phExtensions.logs.initializeLogs(this._instance)\n                this._isLoaded = true\n            }\n        })\n    }\n\n    // ========================================================================\n    // captureLog — sends logs directly to the OTEL logs endpoint\n    // ========================================================================\n\n    captureLog(options: CaptureLogOptions): void {\n        if (!this._instance.is_capturing()) {\n            return\n        }\n\n        if (!options || !options.body) {\n            this._logger.warn('captureLog requires a body')\n            return\n        }\n\n        const flushIntervalMs = this._instance.config.logs?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS\n        const maxLogsPerInterval = this._instance.config.logs?.maxLogsPerInterval ?? DEFAULT_MAX_LOGS_PER_INTERVAL\n        const now = Date.now()\n        if (now - this._intervalWindowStart >= flushIntervalMs) {\n            this._intervalWindowStart = now\n            this._intervalLogCount = 0\n            this._droppedWarned = false\n        }\n        if (this._intervalLogCount >= maxLogsPerInterval) {\n            if (!this._droppedWarned) {\n                this._logger.warn(\n                    `captureLog dropping logs: exceeded ${maxLogsPerInterval} logs per ${flushIntervalMs}ms`\n                )\n                this._droppedWarned = true\n            }\n            return\n        }\n        this._intervalLogCount++\n\n        const sdkContext = this._getSdkContext()\n        const record = buildOtlpLogRecord(options, sdkContext)\n\n        this._logBuffer.push({ record })\n\n        const maxBufferSize = this._instance.config.logs?.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE\n        if (this._logBuffer.length >= maxBufferSize) {\n            this.flushLogs()\n        } else {\n            this._scheduleFlush()\n        }\n    }\n\n    get logger(): Logger {\n        if (!this._logger_instance) {\n            this._logger_instance = {\n                trace: (body, attributes) => this.captureLog({ body, level: 'trace', attributes }),\n                debug: (body, attributes) => this.captureLog({ body, level: 'debug', attributes }),\n                info: (body, attributes) => this.captureLog({ body, level: 'info', attributes }),\n                warn: (body, attributes) => this.captureLog({ body, level: 'warn', attributes }),\n                error: (body, attributes) => this.captureLog({ body, level: 'error', attributes }),\n                fatal: (body, attributes) => this.captureLog({ body, level: 'fatal', attributes }),\n            }\n        }\n        return this._logger_instance\n    }\n\n    flushLogs(transport?: 'XHR' | 'fetch' | 'sendBeacon'): void {\n        if (this._flushTimeout) {\n            clearTimeout(this._flushTimeout)\n            this._flushTimeout = undefined\n        }\n\n        if (this._logBuffer.length === 0) {\n            return\n        }\n\n        const entries = this._logBuffer\n        this._logBuffer = []\n\n        const logsConfig = this._instance.config.logs\n        const resourceAttributes: Record<string, LogAttributeValue> = {\n            'service.name': logsConfig?.serviceName || 'unknown_service',\n            ...(logsConfig?.environment && { 'deployment.environment': logsConfig.environment }),\n            ...(logsConfig?.serviceVersion && { 'service.version': logsConfig.serviceVersion }),\n            ...logsConfig?.resourceAttributes,\n        }\n\n        const payload = buildOtlpLogsPayload(\n            entries.map((e) => e.record),\n            resourceAttributes,\n            Config.LIB_NAME,\n            Config.LIB_VERSION\n        )\n\n        const url =\n            this._instance.requestRouter.endpointFor('api', '/i/v1/logs') +\n            '?token=' +\n            encodeURIComponent(this._instance.config.token)\n\n        this._instance._send_retriable_request({\n            method: 'POST',\n            url,\n            data: payload,\n            compression: 'best-available',\n            batchKey: 'logs',\n            transport,\n        })\n    }\n\n    private _scheduleFlush(): void {\n        if (this._flushTimeout) {\n            return\n        }\n        this._flushTimeout = setTimeout(() => {\n            this._flushTimeout = undefined\n            this.flushLogs()\n        }, this._instance.config.logs?.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS)\n    }\n\n    private _getSdkContext(): LogSdkContext {\n        const context: LogSdkContext = {}\n\n        context.distinctId = this._instance.get_distinct_id()\n\n        if (this._instance.sessionManager) {\n            const { sessionId } = this._instance.sessionManager.checkAndGetSessionAndWindowId(true)\n            context.sessionId = sessionId\n        }\n\n        if (assignableWindow?.location?.href) {\n            context.currentUrl = assignableWindow.location.href\n        }\n\n        if (this._instance.featureFlags) {\n            const flags = this._instance.featureFlags.getFlags()\n            if (flags && flags.length > 0) {\n                context.activeFeatureFlags = flags\n            }\n        }\n\n        return context\n    }\n}\n", "import { PostHog } from '../posthog-core'\nimport { AllExtensions } from '../extensions/extension-bundles'\n\nPostHog.__defaultExtensionClasses = {\n    ...AllExtensions,\n}\n", "import './default-extensions'\nimport { init_as_module } from '../posthog-core'\nexport { PostHog } from '../posthog-core'\nexport * from '../types'\nexport * from '../posthog-surveys-types'\nexport * from '../posthog-product-tours-types'\nexport * from '../posthog-conversations-types'\nexport const posthog = init_as_module()\nexport default posthog\n", "import { AlpineComponent } from \"alpinejs\";\nimport posthog from \"posthog-js\";\n\nexport default (): AlpineComponent<Record<string | symbol, unknown>> => ({\n  init: () => {\n    posthog.capture(\"Not Found\");\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  isVisible: boolean;\n  duration: number;\n}\n\nexport default (\n  isVisible: unknown,\n  duration: unknown,\n): AlpineComponent<State> => ({\n  isVisible: typeof isVisible == \"boolean\" ? isVisible : true,\n  duration: typeof duration == \"number\" ? duration : 5000,\n\n  init() {\n    setTimeout(() => {\n      this.isVisible = false;\n    }, this.duration);\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\n\nconst ErrorRecord = z.union([\n  z.record(z.string(), z.unknown()),\n  z.array(z.unknown()),\n]);\n\ntype ErrorRecord = z.infer<typeof ErrorRecord>;\n\ninterface State extends Record<string | symbol, unknown> {\n  dirty: boolean;\n  submit: boolean;\n  errors: ErrorRecord;\n}\n\nexport default (): AlpineComponent<State> => ({\n  dirty: false,\n  submit: false,\n  errors: {},\n  async go(event: SubmitEvent) {\n    if (!(event.target instanceof HTMLElement)) {\n      return;\n    }\n\n    if (!(event.submitter instanceof HTMLButtonElement)) {\n      return;\n    }\n\n    event.preventDefault();\n\n    if (this.submit) {\n      return;\n    }\n\n    const form = event.target.closest(\"form\");\n    if (!form) {\n      return;\n    }\n\n    this.submit = true;\n\n    if (form instanceof HTMLFormElement) {\n      const body = new FormData(form);\n\n      const entries = [...body.entries()];\n\n      for (const [key, value] of entries) {\n        if (value instanceof File && value.size === 0) {\n          body.delete(key);\n        }\n      }\n\n      const response = await fetch(event.submitter.formAction, {\n        body,\n        headers: {\n          Accept: \"application/json\",\n        },\n        method: \"POST\",\n      });\n\n      this.submit = false;\n\n      if (response.status === 200) {\n        if (response.redirected) {\n          window.location.href = response.url;\n        } else {\n          this.dirty = false;\n          this.errors = {};\n          for (const [key, value] of entries) {\n            if (value instanceof File) {\n              const input = form.querySelector(`input[name=\"${key}\"]`);\n              if (input) {\n                input.setAttribute(\"disabled\", \"disabled\");\n              }\n            }\n          }\n          return;\n        }\n      }\n\n      if (response.status === 400) {\n        this.errors = ErrorRecord.parse(await response.json());\n      }\n    }\n  },\n  error(key: unknown) {\n    if (typeof key !== \"string\") {\n      return;\n    }\n\n    const path = key.split(/\\[|\\]/);\n\n    const find = (obj: ErrorRecord, keys: string[]) => {\n      const [x, ...xs] = keys;\n\n      if (x === undefined) {\n        return obj;\n      }\n\n      const next = Array.isArray(obj) ? obj[parseInt(x, 10)] : obj[x];\n\n      if (next === undefined) {\n        return;\n      }\n\n      return find(ErrorRecord.parse(next), xs);\n    };\n\n    return find(this.errors, path) ?? \"\";\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\nimport posthog from \"posthog-js\";\n\nexport default (\n  key: unknown,\n): AlpineComponent<Record<string | symbol, unknown>> => ({\n  init() {\n    if (!key || typeof key !== \"string\") return;\n    posthog.init(key, { api_host: \"https://eu.posthog.com\" });\n\n    const id = this.$el.dataset[\"userId\"];\n    if (id) {\n      posthog.identify(id, { email: this.$el.dataset[\"userEmail\"] });\n    }\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  value: number;\n  includePence: boolean;\n}\n\nexport default (\n  value: unknown,\n  includePence: unknown,\n): AlpineComponent<State> => ({\n  value: typeof value == \"number\" ? value : 0,\n  includePence: typeof includePence == \"boolean\" ? includePence : true,\n  text() {\n    return new Intl.NumberFormat(\"en-GB\", {\n      style: \"currency\",\n      currency: \"GBP\",\n      minimumFractionDigits: this.includePence ? 2 : 0,\n    }).format(this.value / 100);\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\nfunction getCookie(name: string): string {\n  for (const part of document.cookie.split(\";\")) {\n    const [key, ...rest] = part.trim().split(\"=\");\n    if (key === name) {\n      return decodeURIComponent(rest.join(\"=\"));\n    }\n  }\n  return \"\";\n}\n\ninterface Tag {\n  name: string;\n  url: string;\n  remove_url: string;\n}\n\ninterface Other {\n  name: string;\n  owner: string;\n}\n\ninterface Option {\n  name: string;\n  own: boolean;\n  create?: boolean;\n}\n\ninterface Tags {\n  mine: Tag[];\n  others: Other[];\n  suggestions: Option[];\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  url: string;\n  mine: Tag[];\n  others: Other[];\n  suggestions: Option[];\n  adding: boolean;\n  busy: boolean;\n  query: string;\n  active: number;\n  error: string;\n  init(): Promise<void>;\n  open(): void;\n  close(): void;\n  options(): Option[];\n  move(step: number): void;\n  choose(name?: string): Promise<void>;\n  remove(tag: Tag): Promise<void>;\n  send(url: string, init: RequestInit): Promise<void>;\n}\n\n// How many suggestions the field lists at once.\nconst SHOWN = 8;\n\n// The viewer's own tags on a project, in the project header, configured by\n// data-url (apps.operations.tags). Typing suggests the viewer's tags, then\n// colleagues', and offers to create what was typed.\nexport default (): AlpineComponent<State> => ({\n  url: \"\",\n  mine: [],\n  others: [],\n  suggestions: [],\n  adding: false,\n  busy: false,\n  query: \"\",\n  active: 0,\n  error: \"\",\n\n  async init() {\n    this.url = this.$root.dataset[\"url\"] ?? \"\";\n    if (this.url) {\n      await this.send(this.url, { method: \"GET\" });\n    }\n  },\n\n  open() {\n    this.adding = true;\n    this.query = \"\";\n    this.active = 0;\n    this.error = \"\";\n    this.$nextTick(() => {\n      this.$root.querySelector<HTMLInputElement>(\"input\")?.focus();\n    });\n  },\n\n  close() {\n    this.adding = false;\n    this.query = \"\";\n  },\n\n  options() {\n    const typed = this.query.trim().replace(/\\s+/g, \" \");\n    const needle = typed.toLowerCase();\n    const matches = this.suggestions.filter((option) =>\n      option.name.toLowerCase().includes(needle),\n    );\n    const known = [...this.suggestions, ...this.mine].some(\n      (option) => option.name.toLowerCase() === needle,\n    );\n    const create =\n      typed && !known ? [{ name: typed, own: true, create: true }] : [];\n    return [...matches.slice(0, SHOWN), ...create];\n  },\n\n  move(step: number) {\n    const count = this.options().length;\n    if (count) {\n      this.active = (this.active + step + count) % count;\n    }\n  },\n\n  async choose(name?: string) {\n    const options = this.options();\n    const chosen = name ?? options[this.active]?.name ?? this.query.trim();\n    if (!chosen || this.busy) {\n      return;\n    }\n    await this.send(this.url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n      body: new URLSearchParams({ name: chosen }).toString(),\n    });\n    if (!this.error) {\n      this.query = \"\";\n      this.active = 0;\n    }\n  },\n\n  async remove(tag: Tag) {\n    await this.send(tag.remove_url, { method: \"DELETE\" });\n  },\n\n  async send(url: string, init: RequestInit) {\n    this.busy = true;\n    this.error = \"\";\n    try {\n      const response = await fetch(url, {\n        ...init,\n        headers: {\n          ...init.headers,\n          \"X-CSRFToken\": getCookie(\"csrftoken\"),\n          \"X-Requested-With\": \"XMLHttpRequest\",\n        },\n      });\n      const body = (await response.json()) as Tags & { error?: string };\n      if (!response.ok) {\n        this.error = body.error ?? \"Could not save the tag \u2014 try again.\";\n        return;\n      }\n      this.mine = body.mine;\n      this.others = body.others;\n      this.suggestions = body.suggestions;\n    } catch {\n      this.error = \"Could not reach the server \u2014 try again.\";\n    } finally {\n      this.busy = false;\n    }\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  selected: string | undefined;\n}\n\n// The initial value comes from data-value, never the x-data expression: the\n// server value may be user input, and Alpine evaluates x-data as code.\nexport default (): AlpineComponent<State> => ({\n  selected: undefined,\n  init() {\n    this.selected = this.$el.dataset[\"value\"];\n  },\n  change(value: unknown) {\n    if (typeof value === \"string\") {\n      this.selected = value;\n    }\n  },\n  active(value: unknown) {\n    return this.selected === value;\n  },\n});\n", "import { z } from \"zod\";\n\n// A project's file as the Build Pack's one file picker shows it\n// (templates/operations/system/projects/buildpack/file_picker.py), from\n// apps.operations.buildpack_v2.picker_file: its caption first, as Google\n// Photos and Notion lead with theirs, then its folder and name.\n\nexport const PickerFileSchema = z.object({\n  id: z.number(),\n  name: z.string(),\n  caption: z.string().default(\"\"),\n  folder: z.string().default(\"\"),\n  image: z.boolean(),\n  pdf: z.boolean().default(false),\n  // A thumbnail, or \"\" where there's none to show.\n  src: z.string(),\n  url: z.string(),\n});\n\nexport type PickerFile = z.infer<typeof PickerFileSchema>;\n\n// What a picker offers: photos for a cover, photos and drawings for a floor\n// plan, or any file to attach.\nexport type Wanted = \"photos\" | \"plans\" | \"files\";\n\n// \"Photo_3.jpg\" \u2192 \"Photo 3\", for a file with no caption.\nfunction plain(name: string): string {\n  return name.replace(/\\.[^.]+$/, \"\").replace(/[_-]+/g, \" \");\n}\n\nexport function fileTitle(file: PickerFile): string {\n  return file.caption || plain(file.name);\n}\n\n// Where it is, and its name when the caption led.\nexport function fileDetail(file: PickerFile): string {\n  const parts = [file.folder, file.caption ? file.name : \"\"];\n  if (file.pdf && !file.caption) {\n    parts.push(\"PDF\");\n  }\n  return parts.filter(Boolean).join(\" \u00B7 \");\n}\n\nexport function offered(file: PickerFile, wanted: Wanted): boolean {\n  if (wanted === \"photos\") {\n    return file.image;\n  }\n  return wanted === \"files\" || file.image || file.pdf;\n}\n\n// Every word typed is in the caption, folder or name.\nexport function matching(\n  files: readonly PickerFile[],\n  query: string,\n  wanted: Wanted,\n): PickerFile[] {\n  const words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n  return files.filter((file) => {\n    if (!offered(file, wanted)) {\n      return false;\n    }\n    const text = `${file.caption} ${file.folder} ${file.name}`.toLowerCase();\n    return words.every((word) => text.includes(word));\n  });\n}\n\n// The picker's Upload button: the file goes to the project's files, through\n// the endpoint the Documents tab posts to, and comes back as a tile.\nexport const UploadSchema = z.object({ url: z.string(), project: z.number() });\n\nexport type Upload = z.infer<typeof UploadSchema>;\n\nconst CreatedSchema = z.object({ pk: z.number(), url: z.string() });\n\nfunction csrfToken(): string {\n  const field = document.querySelector<HTMLInputElement>(\n    \"input[name=csrfmiddlewaretoken]\",\n  );\n  return field?.value ?? \"\";\n}\n\nexport async function uploadFile(\n  file: File,\n  upload: Upload,\n): Promise<PickerFile> {\n  const body = new FormData();\n  body.set(\"file\", file);\n  body.set(\"project\", String(upload.project));\n  const response = await fetch(upload.url, {\n    method: \"POST\",\n    body,\n    headers: { \"X-CSRFToken\": csrfToken(), Accept: \"application/json\" },\n  });\n  const made = CreatedSchema.safeParse(\n    response.ok ? await response.json() : null,\n  );\n  if (!made.success) {\n    throw new Error(`the server said ${response.status}`);\n  }\n  const image = file.type.startsWith(\"image/\");\n  return {\n    id: made.data.pk,\n    name: file.name,\n    caption: \"\",\n    folder: \"\",\n    image,\n    pdf: file.type === \"application/pdf\",\n    src: image ? made.data.url : \"\",\n    url: made.data.url,\n  };\n}\n\n// The files chosen in an `<input type=file>`, uploaded in turn; the input is\n// cleared so the same file can be chosen again.\nexport async function uploadChosen(\n  event: Event,\n  upload: Upload,\n  added: (file: PickerFile) => void,\n): Promise<string> {\n  const input = event.target as HTMLInputElement;\n  const chosen = Array.from(input.files ?? []);\n  input.value = \"\";\n  return uploadAll(chosen, upload, added);\n}\n\n// One file failing doesn't stop the rest; what went wrong comes back as a\n// short message, or \"\" when every file went up.\nexport async function uploadAll(\n  chosen: readonly File[],\n  upload: Upload,\n  added: (file: PickerFile) => void,\n): Promise<string> {\n  const failures: string[] = [];\n  for (const file of chosen) {\n    try {\n      added(await uploadFile(file, upload));\n    } catch (error) {\n      const reason = error instanceof Error ? error.message : String(error);\n      failures.push(`Couldn't upload ${file.name}: ${reason}`);\n    }\n  }\n  return failures.join(\" \");\n}\n", "// A system's choices for one home, found in a measure's copy of its\n// specification, and the copy with them answered.\n//\n// The library writes a system once for every home, so its text carries what\n// changes between them. \"[KEEP IF 215mm brick, 60mm] U-value 0.52 W/m\u00B2K or\n// better.\" holds only where the condition does, from the marker to the next\n// one or the end of the line. \"[thickness]\" is a blank to fill.\n// \"[ONE OF: 400 mm | 600 mm]\" is a choice of exactly one of its options, which\n// replaces it. \"[CONSULTANT NOTE: \u2026]\" is guidance for whoever writes the pack.\n\nexport interface Condition {\n  text: string;\n  // What it keeps when it holds, a line or cell at a time.\n  keeps: string[];\n}\n\nexport interface Blank {\n  // Where it sits: its line, and which blank it is there. One name can mean\n  // different things (\"Indoor units: [number]\", \"Outdoor units: [number]\"),\n  // but the same line in two fields means the same, so it's asked once.\n  key: string;\n  name: string;\n  // The words before it, to tell it from another of its name.\n  label: string;\n  // Its whole line, markers and notes taken out.\n  line: string;\n  // The condition each place it's in sits under, or null for none.\n  under: (string | null)[];\n}\n\nexport interface Choice {\n  // The options as typed, \"400 mm | 600 mm\": the same choice twice is asked once.\n  key: string;\n  options: string[];\n  // The words before it, to say what is being chosen.\n  label: string;\n  line: string;\n  // The condition each place it's in sits under, or null for none.\n  under: (string | null)[];\n}\n\nexport interface Questions {\n  notes: string[];\n  conditions: Condition[];\n  blanks: Blank[];\n  choices: Choice[];\n}\n\nexport interface Answers {\n  keep: Record<string, boolean>;\n  // By blank key.\n  fill: Record<string, string>;\n  // The option chosen, by choice key.\n  pick: Record<string, string>;\n}\n\nexport const NO_ANSWERS: Answers = { keep: {}, fill: {}, pick: {} };\n\ninterface Span {\n  condition: string | null;\n  // Its marker as typed, kept while the condition isn't answered.\n  marker: string;\n  words: string;\n}\n\nconst KEEP = /\\[\\s*KEEP IF\\b\\s*([^\\]]*?)\\s*\\]\\s*/gi;\nconst NOTE = /\\[\\s*CONSULTANT NOTE\\b:?\\s*([^\\]]*?)\\s*\\]/gi;\nconst ONE = /\\[\\s*ONE OF\\b:?\\s*([^\\]]*?)\\s*\\]/gi;\n// Not a link's text, and not an empty pair. A note or a choice matches first,\n// so it's passed over and never counted as a blank.\nconst BLANK =\n  /\\[\\s*(?:CONSULTANT NOTE|ONE OF)\\b[^\\]]*\\]|\\[([^[\\]]*\\w[^[\\]]*)\\](?!\\()/gi;\nconst ONLY_BULLETS = /^[\\s\\-\u2022*]*$/;\n// Before a label: a bullet, or what ends the words before.\nconst LEADING = /^[\\s\\-\u2013\u2014\u2022*\u00B7;,.:]+/;\n// After a blank, its words end at a sentence's end, or with a unit stuck to\n// it, as \"mm\" is in \"[total]mm total, [between]\".\nconst SENTENCE = /[.;!?]\\s/;\nconst STUCK = /^[^\\s[]+/;\n// Words before a blank in its label. Past that it keeps the last few.\nconst LABEL_WORDS = 4;\n\nfunction spans(line: string): Span[] {\n  const found: Span[] = [];\n  let condition: string | null = null;\n  let start = 0;\n  let at = 0;\n  for (const match of line.matchAll(KEEP)) {\n    const index = match.index ?? 0;\n    found.push({\n      condition,\n      marker: line.slice(start, at),\n      words: line.slice(at, index),\n    });\n    condition = match[1] ?? \"\";\n    start = index;\n    at = index + match[0].length;\n  }\n  found.push({\n    condition,\n    marker: line.slice(start, at),\n    words: line.slice(at),\n  });\n  return found.filter((span) => span.words.trim() !== \"\");\n}\n\nfunction withoutNotes(line: string): string {\n  return line.replace(NOTE, \"\");\n}\n\n// The nth blank on a line, notes left out of both.\nfunction keyOf(line: string, index: number): string {\n  return `${index}:${withoutNotes(line).trim()}`;\n}\n\n// Of the words after the blank before, those that are this one's.\nfunction afterBlank(before: string): string {\n  const sentences = before.split(SENTENCE);\n  const last = sentences[sentences.length - 1] ?? \"\";\n  return sentences.length > 1 ? last : last.replace(STUCK, \"\");\n}\n\nfunction labelOf(before: string, blank: string): string {\n  const words = before\n    .replace(LEADING, \"\")\n    .replace(/\\s+/g, \" \")\n    .match(/\\S+ ?/g);\n  if (!words) {\n    return blank;\n  }\n  const kept =\n    words.length > LABEL_WORDS ? words.slice(1 - LABEL_WORDS) : words;\n  return `${kept.length < words.length ? \"\u2026\" : \"\"}${kept.join(\"\")}${blank}`;\n}\n\nfunction optionsOf(text: string): string[] {\n  return text\n    .split(\"|\")\n    .map((option) => option.trim())\n    .filter(Boolean);\n}\n\nexport function questions(texts: string[]): Questions {\n  const choices = new Map<string, Choice>();\n  const notes: string[] = [];\n  const conditions = new Map<string, string[]>();\n  const blanks = new Map<string, Blank>();\n  for (const line of texts.flatMap((text) => text.split(\"\\n\"))) {\n    for (const note of line.matchAll(NOTE)) {\n      const said = note[1] ?? \"\";\n      if (said && !notes.includes(said)) {\n        notes.push(said);\n      }\n    }\n    const plain = withoutNotes(line);\n    const whole = plain.replace(KEEP, \"\").replace(/\\s+/g, \" \").trim();\n    let index = 0;\n    for (const span of spans(plain)) {\n      if (span.condition !== null) {\n        const keeps = conditions.get(span.condition) ?? [];\n        if (!keeps.includes(span.words.trim())) {\n          keeps.push(span.words.trim());\n        }\n        conditions.set(span.condition, keeps);\n      }\n      let from = 0;\n      for (const blank of span.words.matchAll(BLANK)) {\n        const at = blank.index ?? 0;\n        if (blank[1] === undefined) {\n          from = at + blank[0].length;\n          continue;\n        }\n        const before = span.words.slice(from, at);\n        const key = keyOf(plain, index);\n        index += 1;\n        if (!blanks.has(key)) {\n          blanks.set(key, {\n            key,\n            name: (blank[1] ?? \"\").trim(),\n            label: labelOf(from ? afterBlank(before) : before, blank[0]),\n            line: whole,\n            under: [span.condition],\n          });\n        }\n        from = at + blank[0].length;\n      }\n      for (const one of span.words.matchAll(ONE)) {\n        const options = optionsOf(one[1] ?? \"\");\n        const key = options.join(\" | \");\n        const found = choices.get(key);\n        if (found) {\n          if (!found.under.includes(span.condition)) {\n            found.under.push(span.condition);\n          }\n        } else if (options.length > 0) {\n          const before = span.words.slice(0, one.index ?? 0);\n          choices.set(key, {\n            key,\n            options,\n            label: labelOf(before, \"\").trim() || \"Choose one\",\n            line: whole,\n            under: [span.condition],\n          });\n        }\n      }\n    }\n  }\n  return {\n    notes,\n    conditions: [...conditions].map(([text, keeps]) => ({ text, keeps })),\n    blanks: [...blanks.values()],\n    choices: [...choices.values()],\n  };\n}\n\n// A blank or choice is asked only where it will print: outside any condition,\n// or under one that holds.\nexport function needed(blank: Blank | Choice, answers: Answers): boolean {\n  return blank.under.some(\n    (condition) => condition === null || answers.keep[condition] === true,\n  );\n}\n\n// How many are still to answer: each condition, and each blank or choice that\n// will print, without an answer.\nexport function open(asked: Questions, answers: Answers): number {\n  const conditions = asked.conditions.filter(\n    (c) => answers.keep[c.text] === undefined,\n  ).length;\n  const blanks = asked.blanks.filter(\n    (b) => needed(b, answers) && !answers.fill[b.key]?.trim(),\n  ).length;\n  const picks = asked.choices.filter(\n    (c) => needed(c, answers) && !answers.pick[c.key],\n  ).length;\n  return conditions + blanks + picks;\n}\n\nfunction resolveLine(\n  line: string,\n  answers: Answers,\n  keepNotes: boolean,\n): string | null {\n  const parts: string[] = [];\n  let index = 0;\n  for (const span of spans(keepNotes ? line : withoutNotes(line))) {\n    // Filled before it's kept or dropped, so a dropped span's blanks still\n    // count towards which the next ones are.\n    const words = span.words\n      .replace(BLANK, (whole: string, name: string | undefined) => {\n        if (name === undefined) {\n          return whole;\n        }\n        const text = answers.fill[keyOf(line, index)]?.trim();\n        index += 1;\n        return text || whole;\n      })\n      .replace(ONE, (whole: string, options: string) => {\n        return answers.pick[optionsOf(options).join(\" | \")] || whole;\n      });\n    const holds = span.condition === null ? true : answers.keep[span.condition];\n    if (holds === true) {\n      parts.push(words);\n    } else if (holds === undefined) {\n      parts.push(span.marker + words);\n    }\n  }\n  const printed = parts\n    .join(\"\")\n    .replace(/[ \\t]{2,}/g, \" \")\n    .trimEnd();\n  return ONLY_BULLETS.test(printed) ? null : printed;\n}\n\n// `text` with `answers` applied: a kept line loses its marker, a dropped one\n// goes, and blanks are filled. What isn't answered stays as typed. The notes\n// go too, unless `keepNotes`, for while there's still something to answer.\nexport function resolve(\n  text: string,\n  answers: Answers,\n  keepNotes: boolean,\n): string {\n  const lines: string[] = [];\n  for (const line of text.split(\"\\n\")) {\n    if (line.trim() === \"\") {\n      lines.push(\"\");\n      continue;\n    }\n    const printed = resolveLine(line, answers, keepNotes);\n    if (printed !== null) {\n      lines.push(printed);\n    }\n  }\n  return lines.join(\"\\n\").trim();\n}\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\n\nimport {\n  fileDetail,\n  fileTitle,\n  matching,\n  type PickerFile,\n  PickerFileSchema,\n  uploadChosen,\n  UploadSchema,\n} from \"./filepicker\";\nimport {\n  type Answers,\n  type Blank,\n  type Choice,\n  open,\n  type Questions,\n  questions,\n  resolve,\n  needed as willPrint,\n} from \"./specchoices\";\n\n// The V2 Build Pack's plan, edited in place: phases of measures and enabling\n// work, typed or imported from the design tool. Rows drag between phases.\n// Each measure keeps its own copy of its system's specification, written over\n// for the home. Files come from the project's own. The plan and the pack's\n// files post as JSON fields through the page's save-all, so a change marks the\n// form unsaved like any other field.\n\nconst SPEC_SECTIONS = [\n  \"description\",\n  \"products\",\n  \"installation_method\",\n  \"installer_requirements\",\n  \"target_performance\",\n  \"standards\",\n] as const;\n\n// What a pack copies of a system, as apps.projects.buildpack_v2.SPEC_FIELDS.\nconst SPEC_FIELDS = [\"name\", \"manufacturer\", ...SPEC_SECTIONS] as const;\n\nconst SpecSchema = z.object({\n  system: z.number(),\n  name: z.string(),\n  manufacturer: z.string(),\n  description: z.string(),\n  products: z.string(),\n  installation_method: z.string(),\n  installer_requirements: z.string(),\n  target_performance: z.string(),\n  standards: z.string(),\n  revised: z.string(),\n  // apps.projects.buildpack_v2.fingerprint of what it was copied from.\n  library: z.string(),\n  // The fingerprint of the copy once blanks were filled from the design\n  // (apps.projects.spec_fill), and which. In Python's order, so the plan\n  // reads as unchanged until it is.\n  filled: z.string().default(\"\"),\n  from_design: z\n    .array(z.object({ blank: z.string(), value: z.string() }))\n    .default([]),\n});\n\nconst ItemSchema = z.object({\n  type: z.enum([\"measure\", \"enabling\"]),\n  kind: z.string(),\n  name: z.string(),\n  cost: z.number().nullable(),\n  quantity: z.string(),\n  system: z.number().nullable(),\n  system_spec: SpecSchema.nullable(),\n  overview: z.string(),\n  location: z.string(),\n  location_images: z.array(z.object({ file: z.number(), caption: z.string() })),\n  files: z.array(z.number()),\n  spec: z.string(),\n  // Enabling work: its id, and the measure it comes before.\n  id: z.string().default(\"\"),\n  before: z.string().nullable().default(null),\n  // The scenario's system for the kind, when it isn't the one written up.\n  scenario_system: z.number().nullable().default(null),\n  // The measure in the design tool.\n  url: z.string().default(\"\"),\n});\n\nconst SystemSchema = z.object({\n  id: z.number(),\n  name: z.string(),\n  manufacturer: z.string(),\n  type: z.string(),\n  typeName: z.string(),\n  kinds: z.array(z.string()),\n  acceptable: z.boolean(),\n  complete: z.boolean(),\n  // The fingerprint of what the library says now.\n  library: z.string(),\n  url: z.string(),\n});\n\nconst KindSchema = z.object({ kind: z.string(), name: z.string() });\n\nconst ConfigSchema = z.object({\n  phases: z.array(\n    z.object({\n      name: z.string(),\n      description: z.string(),\n      when: z\n        .object({ rel: z.enum([\"before\", \"after\"]), ref: z.string() })\n        .nullable(),\n      items: z.array(ItemSchema),\n    }),\n  ),\n  attachments: z.array(z.number()),\n  files: z.array(PickerFileSchema),\n  upload: UploadSchema,\n  kinds: z.array(KindSchema),\n  kindGroups: z.array(\n    z.object({ label: z.string(), kinds: z.array(KindSchema) }),\n  ),\n  systems: z.array(SystemSchema),\n  specUrl: z.string(),\n  design: z.record(\n    z.string(),\n    z.object({\n      cost: z.number().nullable(),\n      quantity: z.string(),\n      /** Pence of a grant towards it: a line of its own, never off the cost. */\n      grant: z.number().default(0),\n      // What the scenario knows of it, and an overview drafted from that.\n      facts: z\n        .array(z.object({ label: z.string(), value: z.string() }))\n        .default([]),\n      draft: z.string().default(\"\"),\n    }),\n  ),\n});\n\ntype Spec = z.infer<typeof SpecSchema>;\n\ntype System = z.infer<typeof SystemSchema>;\n\ntype Kind = z.infer<typeof KindSchema>;\n\ninterface Item {\n  key: number;\n  id: string;\n  before: string | null;\n  scenarioSystem: number | null;\n  url: string;\n  type: \"measure\" | \"enabling\";\n  kind: string;\n  name: string;\n  // Pounds as typed.\n  cost: string;\n  // Pence as stored, kept while `cost` still shows it: whole pounds on show\n  // mustn't round what was saved.\n  stored: number | null;\n  quantity: string;\n  system: number | null;\n  systemSpec: Spec | null;\n  overview: string;\n  location: string;\n  locationImages: { file: number; caption: string }[];\n  files: number[];\n  spec: string;\n  // Answers to the copy's choices, until they're applied to it.\n  answers: Answers;\n  open: boolean;\n}\n\ninterface Phase {\n  key: number;\n  name: string;\n  description: string;\n  // Timing against a measure or enabling work: \"before\" or \"after\", and\n  // the \"kind\" or \"enabling:id\" it's against.\n  rel: string;\n  ref: string;\n  items: Item[];\n  collapsed: boolean;\n}\n\n// What the file picker is choosing for: an item's files or location images,\n// or the whole pack's files.\ninterface Choosing {\n  item: Item | null;\n  images: boolean;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  phases: Phase[];\n  attachments: number[];\n  kindGroups: { label: string; kinds: Kind[] }[];\n  picking: number | null;\n  query: string;\n  choosing: Choosing | null;\n  pickerQuery: string;\n  files: PickerFile[];\n  uploading: boolean;\n  uploadError: string;\n  uploadFiles(event: Event): Promise<void>;\n  loading: number | null;\n  serialised(): string;\n  attachmentsValue(): string;\n  changed(): void;\n  kindName(kind: string): string;\n  label(item: Item): string;\n  number(item: Item): number;\n  phaseCost(phase: Phase): string;\n  total(): string;\n  hint(item: Item): string;\n  facts(item: Item): { label: string; value: string }[];\n  hasDraft(item: Item): boolean;\n  draft(item: Item): Promise<void>;\n  addEnabling(phase: number): void;\n  removeEnabling(phase: number, index: number): void;\n  refs(): { value: string; name: string }[];\n  beforeOptions(): { kind: string; name: string }[];\n  useScenarioSystem(item: Item): Promise<void>;\n  scenarioSystemName(item: Item): string;\n  system(id: number | null): System | null;\n  mismatch(item: Item): string;\n  suggested(item: Item): System[];\n  others(item: Item): System[];\n  pick(item: Item, id: number | null): Promise<void>;\n  copyLibrary(item: Item): Promise<void>;\n  libraryChanged(item: Item): boolean;\n  gaps(item: Item): string[];\n  fromDesign(item: Item): string;\n  asked(item: Item): Questions;\n  hasChoices(item: Item): boolean;\n  needed(item: Item, blank: Blank | Choice): boolean;\n  toAnswer(item: Item): number;\n  canWrite(item: Item): boolean;\n  answer(item: Item, condition: string, holds: boolean): void;\n  noneOfTheRest(item: Item): void;\n  applyAnswers(item: Item): void;\n  togglePicker(item: Item): void;\n  file(id: number): PickerFile | null;\n  fileTitle(file: PickerFile): string;\n  fileDetail(file: PickerFile): string;\n  chooseFiles(item: Item | null, images: boolean): void;\n  pickerFiles(): PickerFile[];\n  isPicked(id: number): boolean;\n  pickFile(id: number): void;\n  pickerOpen(): boolean;\n  pickerTitle(): string;\n  closePicker(): void;\n  detach(item: Item | null, id: number): void;\n}\n\n// The units of the blanks apps.projects.spec_fill fills, which the library\n// writes after the blank. An area is filled with its unit.\nconst UNITS: Record<string, string> = {\n  output: \"kW\",\n  \"heat loss\": \"kW\",\n  \"flow temperature\": \"\u00B0C\",\n  kwp: \"kWp\",\n  kwh: \"kWh\",\n};\n\n// A blank named by its unit, by what it is.\nconst NAMES: Record<string, string> = { \"m\u00B2\": \"area\" };\n\n// A gap the library leaves for each home: \"[thickness]\", or \"[KEEP IF \u2026]\".\nconst GAP = /\\[[^\\]\\n]+\\]/g;\n\nlet next = 0;\n\n/** \"2,477\" beside its \u00A3: whole pounds, as the pack shows costs. */\nfunction pounds(pence: number | null): string {\n  if (pence === null) {\n    return \"\";\n  }\n  return Math.round(pence / 100).toLocaleString(\"en-GB\");\n}\n\n/** An item's cost in pence: as stored, unless it's been typed over. */\nfunction costOf(i: Item): number | null {\n  return i.cost === pounds(i.stored) ? i.stored : pence(i.cost);\n}\n\nfunction pence(typed: string): number | null {\n  const value = Number.parseFloat(typed.replace(/[\u00A3,\\s]/g, \"\"));\n  return Number.isFinite(value) && value >= 0 ? Math.round(value * 100) : null;\n}\n\nfunction money(value: number): string {\n  return `\u00A3${Math.round(value / 100).toLocaleString(\"en-GB\")}`;\n}\n\nfunction item(raw: z.infer<typeof ItemSchema>): Item {\n  return {\n    key: next++,\n    id: raw.id,\n    before: raw.before,\n    scenarioSystem: raw.scenario_system,\n    url: raw.url,\n    type: raw.type,\n    kind: raw.kind,\n    name: raw.name,\n    cost: pounds(raw.cost),\n    stored: raw.cost,\n    quantity: raw.quantity,\n    system: raw.system,\n    systemSpec: raw.system_spec,\n    overview: raw.overview,\n    location: raw.location,\n    locationImages: raw.location_images,\n    files: raw.files,\n    spec: raw.spec,\n    answers: { keep: {}, fill: {}, pick: {} },\n    open: false,\n  };\n}\n\nfunction blank(): Item {\n  return item({\n    type: \"measure\",\n    kind: \"\",\n    name: \"\",\n    cost: null,\n    quantity: \"\",\n    system: null,\n    system_spec: null,\n    overview: \"\",\n    location: \"\",\n    location_images: [],\n    files: [],\n    spec: \"\",\n    id: \"\",\n    before: null,\n    scenario_system: null,\n    url: \"\",\n  });\n}\n\nfunction trimmed(spec: Spec | null): Spec | null {\n  if (spec === null) {\n    return null;\n  }\n  const copy = { ...spec };\n  for (const field of SPEC_SECTIONS) {\n    copy[field] = copy[field].trim();\n  }\n  return copy;\n}\n\n// Whether a copy has been written over since it was taken: what it says now\n// against apps.projects.buildpack_v2.fingerprint of what it was copied from.\n// One without a fingerprint, or where the browser can't hash, counts.\nasync function edited(spec: Spec): Promise<boolean> {\n  if (!spec.library || !globalThis.crypto?.subtle) {\n    return true;\n  }\n  const text = SPEC_FIELDS.map((field) => spec[field].trim()).join(\"\\u001f\");\n  const digest = await crypto.subtle.digest(\n    \"SHA-256\",\n    new TextEncoder().encode(text),\n  );\n  const hex = Array.from(new Uint8Array(digest), (byte) =>\n    byte.toString(16).padStart(2, \"0\"),\n  ).join(\"\");\n  return ![spec.library, spec.filled].includes(hex.slice(0, 16));\n}\n\nexport default (): AlpineComponent<State> => {\n  let config: z.infer<typeof ConfigSchema> = {\n    phases: [],\n    attachments: [],\n    files: [],\n    upload: { url: \"\", project: 0 },\n    kinds: [],\n    kindGroups: [],\n    systems: [],\n    specUrl: \"\",\n    design: {},\n  };\n\n  const measures = (phases: Phase[]) =>\n    phases.flatMap((phase) =>\n      phase.items.filter((i) => i.type === \"measure\" && i.kind),\n    );\n\n  return {\n    phases: [],\n    attachments: [],\n    kindGroups: [],\n    picking: null,\n    query: \"\",\n    choosing: null,\n    pickerQuery: \"\",\n    files: [],\n    uploading: false,\n    uploadError: \"\",\n    loading: null,\n\n    init() {\n      const read = ConfigSchema.safeParse(\n        JSON.parse(this.$el.dataset[\"config\"] ?? \"{}\"),\n      );\n      if (read.success) {\n        config = read.data;\n      }\n      this.files = config.files;\n      this.kindGroups = config.kindGroups;\n      this.attachments = config.attachments;\n      this.phases = config.phases.map((phase) => ({\n        key: next++,\n        name: phase.name,\n        description: phase.description,\n        rel: phase.when?.rel ?? \"before\",\n        ref: phase.when?.ref ?? \"\",\n        items: phase.items.map(item),\n        collapsed: false,\n      }));\n    },\n\n    serialised() {\n      return JSON.stringify(\n        this.phases.map((phase) => ({\n          name: phase.name,\n          description: phase.description.trim(),\n          when: phase.ref ? { rel: phase.rel, ref: phase.ref } : null,\n          items: phase.items.map((i) => {\n            const measure = i.type === \"measure\";\n            return {\n              type: i.type,\n              id: measure ? \"\" : i.id,\n              before: measure ? null : i.before,\n              kind: measure ? i.kind : \"\",\n              name: i.name.trim(),\n              cost: costOf(i),\n              quantity: i.quantity.trim(),\n              system: measure ? i.system : null,\n              system_spec: measure ? trimmed(i.systemSpec) : null,\n              overview: i.overview.trim(),\n              location: i.location.trim(),\n              location_images: i.locationImages.map((row) => ({\n                file: row.file,\n                caption: row.caption.trim(),\n              })),\n              files: i.files,\n              spec: i.spec.trim(),\n            };\n          }),\n        })),\n      );\n    },\n\n    attachmentsValue() {\n      return JSON.stringify(this.attachments);\n    },\n\n    changed() {\n      this.$nextTick(() => {\n        for (const hidden of this.$root.querySelectorAll<HTMLInputElement>(\n          \"input[data-plan-value]\",\n        )) {\n          hidden.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        }\n      });\n    },\n\n    kindName(kind: string) {\n      return config.kinds.find((k) => k.kind === kind)?.name ?? \"\";\n    },\n\n    label(target: Item) {\n      if (target.type === \"enabling\") {\n        return target.name || \"Enabling work\";\n      }\n      return target.name || this.kindName(target.kind) || \"New measure\";\n    },\n\n    number(target: Item) {\n      return measures(this.phases).indexOf(target) + 1;\n    },\n\n    phaseCost(phase: Phase) {\n      const shown = phase.items.filter(\n        (i) => i.type === \"enabling\" || i.kind !== \"\",\n      );\n      if (shown.length === 0) {\n        return \"\";\n      }\n      if (shown.some((i) => i.type === \"measure\" && costOf(i) === null)) {\n        return \"Price to confirm\";\n      }\n      return money(shown.reduce((sum, i) => sum + (costOf(i) ?? 0), 0));\n    },\n\n    total() {\n      const costs = this.phases.map((phase) => this.phaseCost(phase));\n      if (costs.includes(\"Price to confirm\")) {\n        return \"Price to confirm\";\n      }\n      const sum = this.phases\n        .flatMap((phase) => phase.items)\n        .reduce((all, i) => all + (costOf(i) ?? 0), 0);\n      return sum ? money(sum) : \"\";\n    },\n\n    hint(target: Item) {\n      const design = config.design[target.kind];\n      if (target.type !== \"measure\" || !design) {\n        return \"\";\n      }\n      const parts = [\n        design.quantity,\n        design.cost === null ? \"\" : money(design.cost),\n        design.grant ? `less ${money(design.grant)} grant` : \"\",\n      ].filter((part) => part !== \"\");\n      return parts.length ? `Design: ${parts.join(\" \u00B7 \")}` : \"\";\n    },\n\n    facts(target: Item) {\n      return config.design[target.kind]?.facts ?? [];\n    },\n\n    hasDraft(target: Item) {\n      return (config.design[target.kind]?.draft ?? \"\") !== \"\";\n    },\n\n    // Fill an empty overview from the scenario; replace typed words only\n    // when the writer says so.\n    async draft(target: Item) {\n      const text = config.design[target.kind]?.draft ?? \"\";\n      if (\n        !text ||\n        (target.overview.trim() !== \"\" &&\n          target.overview.trim() !== text &&\n          !window.confirm(\"Replace the overview with a new draft?\"))\n      ) {\n        return;\n      }\n      target.overview = text;\n      this.changed();\n    },\n\n    system(id: number | null) {\n      return config.systems.find((s) => s.id === id) ?? null;\n    },\n\n    // A system the library files under another measure: the connector\n    // refuses one, the editor says so.\n    mismatch(target: Item) {\n      const picked = this.system(target.system);\n      if (\n        target.type !== \"measure\" ||\n        !target.kind ||\n        !picked ||\n        picked.kinds.includes(target.kind)\n      ) {\n        return \"\";\n      }\n      const name = this.kindName(target.kind) || \"this measure\";\n      return `For ${picked.typeName}, not ${name}`;\n    },\n\n    suggested(target: Item) {\n      const query = this.query.trim().toLowerCase();\n      return config.systems.filter(\n        (s) =>\n          s.kinds.includes(target.kind) &&\n          `${s.name} ${s.manufacturer}`.toLowerCase().includes(query),\n      );\n    },\n\n    others(target: Item) {\n      const query = this.query.trim().toLowerCase();\n      return config.systems.filter(\n        (s) =>\n          !s.kinds.includes(target.kind) &&\n          `${s.name} ${s.manufacturer} ${s.typeName}`\n            .toLowerCase()\n            .includes(query),\n      );\n    },\n\n    async pick(target: Item, id: number | null) {\n      this.picking = null;\n      this.query = \"\";\n      if (id === target.system) {\n        return;\n      }\n      if (\n        target.systemSpec &&\n        (await edited(target.systemSpec)) &&\n        !window.confirm(\n          `${id === null ? \"Clear\" : \"Change\"} the system? What's been written` +\n            \" over in this measure's specification for this home goes.\",\n        )\n      ) {\n        return;\n      }\n      target.system = id;\n      target.systemSpec = null;\n      this.changed();\n      if (id !== null) {\n        await this.copyLibrary(target);\n      }\n    },\n\n    // The library's specification for the item's system, as the item's own\n    // copy to write over.\n    async copyLibrary(target: Item) {\n      if (target.system === null) {\n        return;\n      }\n      if (\n        target.systemSpec &&\n        (await edited(target.systemSpec)) &&\n        !window.confirm(\n          \"Replace this measure's specification with the library's? What's\" +\n            \" been written over for this home goes.\",\n        )\n      ) {\n        return;\n      }\n      const system = target.system;\n      this.loading = target.key;\n      try {\n        const query = new URLSearchParams({\n          system: String(system),\n          kind: target.kind,\n        });\n        const response = await fetch(`${config.specUrl}?${query}`);\n        const read = SpecSchema.safeParse(await response.json());\n        if (response.ok && read.success && target.system === system) {\n          target.systemSpec = read.data;\n          target.answers = { keep: {}, fill: {}, pick: {} };\n          this.changed();\n        }\n      } finally {\n        this.loading = null;\n      }\n    },\n\n    // By what the library says, not when it was saved: a save that changes\n    // nothing a pack copies doesn't count.\n    libraryChanged(target: Item) {\n      const system = this.system(target.system);\n      return Boolean(\n        system &&\n          target.systemSpec?.library &&\n          system.library !== target.systemSpec.library,\n      );\n    },\n\n    gaps(target: Item) {\n      const spec = target.systemSpec;\n      if (!spec) {\n        return [];\n      }\n      return [\n        ...new Set(\n          SPEC_SECTIONS.flatMap((field) => spec[field].match(GAP) ?? []),\n        ),\n      ];\n    },\n\n    // \"output 8 kW \u00B7 SCOP 3.2\": what the copy took from the design.\n    fromDesign(target: Item) {\n      return (target.systemSpec?.from_design ?? [])\n        .map((row) => {\n          const blank = row.blank.slice(1, -1);\n          const name = NAMES[blank.toLowerCase()] ?? blank;\n          const unit = UNITS[blank.toLowerCase()];\n          return `${name} ${row.value}${unit ? ` ${unit}` : \"\"}`;\n        })\n        .join(\" \u00B7 \");\n    },\n\n    // The choices left in the item's copy, asked before they're written in.\n    asked(target: Item) {\n      const spec = target.systemSpec;\n      if (!spec) {\n        return { notes: [], conditions: [], blanks: [], choices: [] };\n      }\n      return questions(SPEC_SECTIONS.map((field) => spec[field]));\n    },\n\n    hasChoices(target: Item) {\n      const asked = this.asked(target);\n      return (\n        asked.notes.length +\n          asked.conditions.length +\n          asked.blanks.length +\n          asked.choices.length >\n        0\n      );\n    },\n\n    needed(target: Item, blank: Blank | Choice) {\n      return willPrint(blank, target.answers);\n    },\n\n    toAnswer(target: Item) {\n      return open(this.asked(target), target.answers);\n    },\n\n    // An answer to write, or only notes left: nothing to answer, so writing\n    // takes them out.\n    canWrite(target: Item) {\n      const asked = this.asked(target);\n      const { keep, fill, pick } = target.answers;\n      return (\n        asked.conditions.some((c) => keep[c.text] !== undefined) ||\n        asked.blanks.some((b) => fill[b.key]?.trim()) ||\n        asked.choices.some((c) => pick[c.key]) ||\n        (asked.notes.length > 0 && open(asked, target.answers) === 0)\n      );\n    },\n\n    // Pressing the answer it already has takes it back.\n    answer(target: Item, condition: string, holds: boolean) {\n      const keep = { ...target.answers.keep };\n      if (keep[condition] === holds) {\n        delete keep[condition];\n      } else {\n        keep[condition] = holds;\n      }\n      target.answers = { ...target.answers, keep };\n    },\n\n    noneOfTheRest(target: Item) {\n      const keep = { ...target.answers.keep };\n      for (const condition of this.asked(target).conditions) {\n        keep[condition.text] ??= false;\n      }\n      target.answers = { ...target.answers, keep };\n    },\n\n    // Write the answers into the copy: kept lines lose their markers,\n    // dropped ones go and blanks are filled. The consultant's notes go once\n    // nothing is left to answer.\n    applyAnswers(target: Item) {\n      const spec = target.systemSpec;\n      if (!spec) {\n        return;\n      }\n      const keepNotes = this.toAnswer(target) > 0;\n      for (const field of SPEC_SECTIONS) {\n        spec[field] = resolve(spec[field], target.answers, keepNotes);\n      }\n      target.answers = { keep: {}, fill: {}, pick: {} };\n      this.changed();\n    },\n\n    togglePicker(target: Item) {\n      this.query = \"\";\n      this.picking = this.picking === target.key ? null : target.key;\n    },\n\n    file(id: number) {\n      return this.files.find((f) => f.id === id) ?? null;\n    },\n\n    chooseFiles(target: Item | null, images: boolean) {\n      this.pickerQuery = \"\";\n      this.choosing = { item: target, images };\n    },\n\n    fileTitle,\n    fileDetail,\n\n    // An upload joins the project's files and is the one chosen.\n    async uploadFiles(event: Event) {\n      this.uploading = true;\n      this.uploadError = \"\";\n      try {\n        this.uploadError = await uploadChosen(event, config.upload, (file) => {\n          this.files = [file, ...this.files];\n          if (\n            this.choosing &&\n            (!this.choosing.images || file.image || file.pdf)\n          ) {\n            this.pickFile(file.id);\n          }\n        });\n      } finally {\n        this.uploading = false;\n      }\n    },\n\n    pickerOpen() {\n      return this.choosing !== null;\n    },\n\n    pickerTitle() {\n      return this.choosing?.images\n        ? \"Floor plans and photos\"\n        : \"Attach files from the project\";\n    },\n\n    closePicker() {\n      this.choosing = null;\n    },\n\n    // A measure's floor plans and photos are pictures or drawings; anything\n    // can be attached.\n    pickerFiles() {\n      const images = this.choosing?.images ?? false;\n      return matching(this.files, this.pickerQuery, images ? \"plans\" : \"files\");\n    },\n\n    isPicked(id: number) {\n      const choosing = this.choosing;\n      if (!choosing) {\n        return false;\n      }\n      if (!choosing.item) {\n        return this.attachments.includes(id);\n      }\n      if (choosing.images) {\n        return choosing.item.locationImages.some((row) => row.file === id);\n      }\n      return choosing.item.files.includes(id);\n    },\n\n    pickFile(id: number) {\n      const choosing = this.choosing;\n      if (!choosing) {\n        return;\n      }\n      if (this.isPicked(id)) {\n        this.detach(choosing.images ? null : choosing.item, id);\n        if (choosing.images && choosing.item) {\n          choosing.item.locationImages = choosing.item.locationImages.filter(\n            (row) => row.file !== id,\n          );\n        }\n      } else if (!choosing.item) {\n        this.attachments.push(id);\n      } else if (choosing.images) {\n        choosing.item.locationImages.push({\n          file: id,\n          caption: this.file(id)?.caption ?? \"\",\n        });\n      } else {\n        choosing.item.files.push(id);\n      }\n      this.changed();\n    },\n\n    // Enabling work goes just before the measure it's for.\n    addEnabling(phase: number) {\n      const added = blank();\n      added.type = \"enabling\";\n      added.id = crypto.randomUUID().slice(0, 8);\n      added.open = true;\n      this.phases[phase]?.items.push(added);\n      this.changed();\n    },\n\n    removeEnabling(phase: number, index: number) {\n      this.phases[phase]?.items.splice(index, 1);\n      this.changed();\n    },\n\n    // What a phase's timing can be against: each measure and enabling work.\n    refs() {\n      return this.phases\n        .flatMap((phase) => phase.items)\n        .filter((i) => (i.type === \"measure\" ? i.kind : i.name && i.id))\n        .map((i) =>\n          i.type === \"measure\"\n            ? { value: i.kind, name: this.kindName(i.kind) }\n            : { value: `enabling:${i.id}`, name: i.name },\n        );\n    },\n\n    beforeOptions() {\n      return measures(this.phases).map((i) => ({\n        kind: i.kind,\n        name: this.kindName(i.kind),\n      }));\n    },\n\n    scenarioSystemName(target: Item) {\n      return this.system(target.scenarioSystem)?.name ?? \"\";\n    },\n\n    // Switch the write-up to the system the scenario names. The copy it\n    // leaves is replaced only after the usual ask.\n    async useScenarioSystem(target: Item) {\n      const id = target.scenarioSystem;\n      if (id === null) {\n        return;\n      }\n      await this.pick(target, id);\n      if (target.system === id) {\n        target.scenarioSystem = null;\n      }\n    },\n\n    detach(target: Item | null, id: number) {\n      if (target) {\n        target.files = target.files.filter((f) => f !== id);\n      } else {\n        this.attachments = this.attachments.filter((f) => f !== id);\n      }\n      this.changed();\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\n\nimport {\n  fileDetail,\n  fileTitle,\n  matching,\n  type PickerFile,\n  PickerFileSchema,\n  type Upload,\n  UploadSchema,\n  uploadChosen,\n} from \"./filepicker\";\n\n// The V2 Build Pack's Property card: the cover photo and condition issues'\n// photos, chosen from the project's photos in one picker, and the property\n// details, each worked-out line changed or hidden in place. Each posts as a\n// hidden field through the page's save-all.\n\nconst ConfigSchema = z.object({\n  photos: z.array(PickerFileSchema),\n  upload: UploadSchema,\n  cover: PickerFileSchema.nullable(),\n  issues: z.array(\n    z.object({\n      title: z.string(),\n      location: z.string(),\n      description: z.string(),\n      photo: z.union([z.number(), z.string()]),\n    }),\n  ),\n  derived: z.array(z.object({ label: z.string(), value: z.string() })),\n  overrides: z.array(z.object({ label: z.string(), value: z.string() })),\n});\n\ninterface Issue {\n  key: number;\n  title: string;\n  location: string;\n  description: string;\n  photo: number | null;\n}\n\ninterface Detail {\n  label: string;\n  derived: string;\n  value: string;\n  hidden: boolean;\n}\n\ninterface Extra {\n  key: number;\n  label: string;\n  value: string;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  photos: PickerFile[];\n  cover: number | null;\n  issues: Issue[];\n  details: Detail[];\n  extras: Extra[];\n  // \"cover\", or the key of the issue choosing its photo.\n  picking: string | number | null;\n  pickerQuery: string;\n  uploading: boolean;\n  uploadError: string;\n  uploadFiles(event: Event): Promise<void>;\n  photo(id: number | null): PickerFile | null;\n  fileTitle(file: PickerFile): string;\n  fileDetail(file: PickerFile): string;\n  pickerFiles(): PickerFile[];\n  isPicked(id: number): boolean;\n  pickFile(id: number): void;\n  clearPick(): void;\n  pickerOpen(): boolean;\n  pickerTitle(): string;\n  closePicker(): void;\n  choose(target: string | number): void;\n  pick(id: number | null): void;\n  addIssue(): void;\n  removeIssue(index: number): void;\n  addDetail(): void;\n  removeDetail(index: number): void;\n  changedDetail(detail: Detail): boolean;\n  issuesValue(): string;\n  detailsValue(): string;\n  changed(): void;\n}\n\nlet next = 0;\n\nlet upload: Upload = { url: \"\", project: 0 };\n\nexport default (): AlpineComponent<State> => ({\n  photos: [],\n  cover: null,\n  issues: [],\n  details: [],\n  extras: [],\n  picking: null,\n  pickerQuery: \"\",\n  uploading: false,\n  uploadError: \"\",\n\n  init() {\n    const read = ConfigSchema.safeParse(\n      JSON.parse(this.$el.dataset[\"config\"] ?? \"{}\"),\n    );\n    if (!read.success) {\n      return;\n    }\n    const config = read.data;\n    upload = config.upload;\n    this.photos = config.photos;\n    if (config.cover && !this.photo(config.cover.id)) {\n      this.photos = [config.cover, ...this.photos];\n    }\n    this.cover = config.cover?.id ?? null;\n    this.issues = config.issues.map((issue) => ({\n      key: next++,\n      title: issue.title,\n      location: issue.location,\n      description: issue.description,\n      photo: typeof issue.photo === \"number\" ? issue.photo : null,\n    }));\n    const overrides = new Map(config.overrides.map((o) => [o.label, o.value]));\n    this.details = config.derived.map((row) => {\n      const typed = overrides.get(row.label);\n      return {\n        label: row.label,\n        derived: row.value,\n        value: typed && typed !== row.value ? typed : \"\",\n        hidden: typed === \"\",\n      };\n    });\n    const derived = new Set(config.derived.map((row) => row.label));\n    this.extras = config.overrides\n      .filter((o) => !derived.has(o.label) && o.value)\n      .map((o) => ({ key: next++, label: o.label, value: o.value }));\n  },\n\n  photo(id: number | null) {\n    return this.photos.find((p) => p.id === id) ?? null;\n  },\n\n  fileTitle,\n  fileDetail,\n\n  pickerFiles() {\n    return matching(this.photos, this.pickerQuery, \"photos\");\n  },\n\n  // An upload joins the project's photos and is the one chosen.\n  async uploadFiles(event: Event) {\n    this.uploading = true;\n    this.uploadError = \"\";\n    try {\n      this.uploadError = await uploadChosen(event, upload, (file) => {\n        this.photos = [file, ...this.photos];\n        if (file.image) {\n          this.pick(file.id);\n        }\n      });\n    } finally {\n      this.uploading = false;\n    }\n  },\n\n  pickerOpen() {\n    return this.picking !== null;\n  },\n\n  pickerTitle() {\n    return this.picking === \"cover\" ? \"Choose a cover photo\" : \"Choose a photo\";\n  },\n\n  closePicker() {\n    this.picking = null;\n  },\n\n  pickFile(id: number) {\n    this.pick(id);\n  },\n\n  clearPick() {\n    this.pick(null);\n  },\n\n  isPicked(id: number) {\n    if (this.picking === \"cover\") {\n      return this.cover === id;\n    }\n    return this.issues.some((i) => i.key === this.picking && i.photo === id);\n  },\n\n  choose(target: string | number) {\n    this.pickerQuery = \"\";\n    this.picking = target;\n  },\n\n  pick(id: number | null) {\n    if (this.picking === \"cover\") {\n      this.cover = id;\n    } else {\n      const issue = this.issues.find((i) => i.key === this.picking);\n      if (issue) {\n        issue.photo = id;\n      }\n    }\n    this.picking = null;\n    this.changed();\n  },\n\n  addIssue() {\n    this.issues.push({\n      key: next++,\n      title: \"\",\n      location: \"\",\n      description: \"\",\n      photo: null,\n    });\n    this.changed();\n  },\n\n  removeIssue(index: number) {\n    this.issues.splice(index, 1);\n    this.changed();\n  },\n\n  addDetail() {\n    this.extras.push({ key: next++, label: \"\", value: \"\" });\n    this.changed();\n  },\n\n  removeDetail(index: number) {\n    this.extras.splice(index, 1);\n    this.changed();\n  },\n\n  changedDetail(detail: Detail) {\n    return detail.hidden || detail.value.trim() !== \"\";\n  },\n\n  issuesValue() {\n    return JSON.stringify(\n      this.issues\n        .map((i) => ({\n          title: i.title.trim(),\n          location: i.location.trim(),\n          description: i.description.trim(),\n          photo: i.photo === null ? \"\" : String(i.photo),\n        }))\n        .filter((i) => i.title || i.location || i.description || i.photo),\n    );\n  },\n\n  // Only what differs from the worked-out details: a new value, a hidden\n  // line (an empty value), or a line of your own.\n  detailsValue() {\n    const rows = this.details.flatMap((d) => {\n      if (d.hidden) {\n        return [{ label: d.label, value: \"\" }];\n      }\n      const value = d.value.trim();\n      return value && value !== d.derived ? [{ label: d.label, value }] : [];\n    });\n    for (const extra of this.extras) {\n      if (extra.label.trim() && extra.value.trim()) {\n        rows.push({ label: extra.label.trim(), value: extra.value.trim() });\n      }\n    }\n    return JSON.stringify(rows);\n  },\n\n  changed() {\n    this.$nextTick(() => {\n      for (const hidden of this.$root.querySelectorAll<HTMLInputElement>(\n        \"input[data-property-value]\",\n      )) {\n        hidden.dispatchEvent(new Event(\"input\", { bubbles: true }));\n      }\n    });\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\nimport z from \"zod\";\n\n// The V2 Build Pack page: the pack or its documents (kept in the URL's hash),\n// which phases of the plan table are folded, the image viewer, and the\n// contractor request.\n\nconst ConfigSchema = z.object({\n  requestUrl: z.string(),\n  csrf: z.string(),\n  measures: z.record(z.string(), z.string()),\n});\n\ninterface State extends Record<string | symbol, unknown> {\n  tab: string;\n  collapsed: number[];\n  lightbox: string | null;\n  lightboxZoom: boolean;\n  chatOpen: boolean;\n  requesting: boolean;\n  requested: boolean;\n  sending: boolean;\n  error: string;\n  chosen: string[];\n  requestedNames: string[];\n  show(tab: string): void;\n  follow(): void;\n  jump(event: Event): void;\n  reveal(id: string): void;\n  togglePhase(index: number): void;\n  send(): Promise<void>;\n}\n\nexport default (): AlpineComponent<State> => {\n  let config: z.infer<typeof ConfigSchema> = {\n    requestUrl: \"\",\n    csrf: \"\",\n    measures: {},\n  };\n\n  return {\n    tab: \"pack\",\n    collapsed: [],\n    lightbox: null,\n    lightboxZoom: false,\n    chatOpen: false,\n    requesting: false,\n    requested: false,\n    sending: false,\n    error: \"\",\n    chosen: [],\n    requestedNames: [],\n\n    init() {\n      const read = ConfigSchema.safeParse(\n        JSON.parse(this.$el.dataset[\"config\"] ?? \"{}\"),\n      );\n      if (read.success) {\n        config = read.data;\n      }\n      this.chosen = Object.keys(config.measures);\n      this.follow();\n      window.addEventListener(\"hashchange\", () => this.follow());\n    },\n\n    show(tab: string) {\n      this.tab = tab;\n      history.replaceState(null, \"\", tab === \"documents\" ? \"#documents\" : \"#\");\n      window.scrollTo({ top: document.getElementById(\"pack\")?.offsetTop ?? 0 });\n    },\n\n    // A link to a section of the pack shows the pack, then that section.\n    follow() {\n      const hash = window.location.hash.slice(1);\n      if (hash === \"documents\") {\n        this.tab = \"documents\";\n      } else {\n        this.reveal(hash);\n      }\n    },\n\n    // The side menu's links, which the scrollspy may have left in the hash\n    // already, so they don't always change it.\n    jump(event: Event) {\n      const link =\n        event.target instanceof Element\n          ? event.target.closest(\"a[data-toc-link]\")\n          : null;\n      if (link) {\n        this.reveal(link.getAttribute(\"href\")?.slice(1) ?? \"\");\n      }\n    },\n\n    reveal(id: string) {\n      if (this.tab === \"pack\") {\n        return;\n      }\n      this.tab = \"pack\";\n      this.$nextTick(() =>\n        document.getElementById(id)?.scrollIntoView({ block: \"start\" }),\n      );\n    },\n\n    togglePhase(index: number) {\n      this.collapsed = this.collapsed.includes(index)\n        ? this.collapsed.filter((i) => i !== index)\n        : [...this.collapsed, index];\n    },\n\n    async send() {\n      this.sending = true;\n      this.error = \"\";\n      const body = new URLSearchParams();\n      for (const kind of this.chosen) {\n        body.append(\"kinds\", kind);\n      }\n      try {\n        const response = await fetch(config.requestUrl, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/x-www-form-urlencoded\",\n            \"X-CSRFToken\": config.csrf,\n          },\n          body,\n        });\n        if (!response.ok) {\n          throw new Error(String(response.status));\n        }\n        this.requestedNames = this.chosen.map(\n          (kind) => config.measures[kind] ?? kind,\n        );\n        this.requested = true;\n      } catch {\n        this.error = \"That didn't send. Please try again.\";\n      } finally {\n        this.sending = false;\n      }\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\n// Rows typed into a form and posted as one JSON field. `data-fields` names each\n// row's fields; with none, the rows are plain strings. A field listed in\n// `data-multi` holds a list (a multiple select). Edits bubble an input event\n// from the hidden field so save-all sees the form change.\n\ntype Value = string | string[];\n\ninterface Row {\n  key: number;\n  values: Record<string, Value>;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  rows: Row[];\n  fields: string[];\n  multi: string[];\n  serialised(): string;\n  add(): void;\n  remove(index: number): void;\n  move(index: number, by: number): void;\n  changed(): void;\n}\n\nlet next = 0;\n\nfunction parse(raw: string | undefined): unknown[] {\n  try {\n    const value: unknown = JSON.parse(raw ?? \"[]\");\n    return Array.isArray(value) ? value : [];\n  } catch {\n    return [];\n  }\n}\n\nfunction text(value: unknown): string {\n  return value === null || value === undefined ? \"\" : String(value);\n}\n\nfunction list(value: unknown): string[] {\n  if (Array.isArray(value)) {\n    return value.map(text).filter((item) => item !== \"\");\n  }\n  return text(value) ? [text(value)] : [];\n}\n\nfunction filled(value: Value): boolean {\n  return Array.isArray(value) ? value.length > 0 : value.trim() !== \"\";\n}\n\nfunction names(raw: string | undefined): string[] {\n  return (raw ?? \"\").split(\",\").filter((name) => name !== \"\");\n}\n\nexport default (): AlpineComponent<State> => ({\n  rows: [],\n  fields: [],\n  multi: [],\n\n  init() {\n    this.fields = names(this.$el.dataset[\"fields\"]);\n    this.multi = names(this.$el.dataset[\"multi\"]);\n    this.rows = parse(this.$el.dataset[\"rows\"]).map((value) => {\n      if (this.fields.length === 0) {\n        return { key: next++, values: { value: text(value) } };\n      }\n      const source =\n        typeof value === \"object\" && value !== null\n          ? (value as Record<string, unknown>)\n          : {};\n      return {\n        key: next++,\n        values: Object.fromEntries(\n          this.fields.map((field) => [\n            field,\n            this.multi.includes(field)\n              ? list(source[field])\n              : text(source[field]),\n          ]),\n        ),\n      };\n    });\n  },\n\n  serialised() {\n    if (this.fields.length === 0) {\n      return JSON.stringify(\n        this.rows\n          .map((row) => text(row.values[\"value\"]))\n          .filter((v) => v.trim()),\n      );\n    }\n    return JSON.stringify(\n      this.rows\n        .map((row) =>\n          Object.fromEntries(\n            this.fields.map((field) => [field, row.values[field] ?? \"\"]),\n          ),\n        )\n        .filter((row) => Object.values(row).some(filled)),\n    );\n  },\n\n  add() {\n    const fields = this.fields.length ? this.fields : [\"value\"];\n    this.rows.push({\n      key: next++,\n      values: Object.fromEntries(\n        fields.map((field) => [field, this.multi.includes(field) ? [] : \"\"]),\n      ),\n    });\n    this.changed();\n  },\n\n  remove(index: number) {\n    this.rows.splice(index, 1);\n    this.changed();\n  },\n\n  move(index: number, by: number) {\n    const to = index + by;\n    if (to < 0 || to >= this.rows.length) {\n      return;\n    }\n    const [row] = this.rows.splice(index, 1);\n    if (row) {\n      this.rows.splice(to, 0, row);\n    }\n    this.changed();\n  },\n\n  changed() {\n    this.$nextTick(() => {\n      const hidden = this.$el.querySelector<HTMLInputElement>(\n        \"input[data-list-value]\",\n      );\n      hidden?.dispatchEvent(new Event(\"input\", { bubbles: true }));\n    });\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\nimport { csrfToken, replaceFiles } from \"../storage/upload\";\n\ninterface State extends Record<string | symbol, unknown> {\n  saving: boolean;\n  dirty: string[];\n  errors: Record<string, string>;\n  saveAll(submitted: HTMLFormElement | null): Promise<void>;\n  saveDirty(submitted: HTMLFormElement | null): Promise<boolean>;\n  saveThenSubmit(form: HTMLFormElement): Promise<void>;\n  save(form: HTMLFormElement): Promise<boolean>;\n}\n\nconst MARKED = \"form[data-save-all]\";\nconst SAVE_FIRST = \"form[data-save-first]\";\nconst FIELD_ERROR = \"[data-save-all-error]\";\n\ntype FieldErrors = Record<string, string[]>;\n\nfunction isFieldErrors(body: unknown): body is FieldErrors {\n  return (\n    typeof body === \"object\" &&\n    body !== null &&\n    !Array.isArray(body) &&\n    Object.values(body).every(\n      (v) => Array.isArray(v) && v.every((m) => typeof m === \"string\"),\n    )\n  );\n}\n\nfunction fieldLabel(form: HTMLFormElement, name: string): string {\n  const input = form.elements.namedItem(name);\n  const label =\n    input instanceof Element\n      ? input.parentElement?.querySelector(\"label\")\n      : null;\n  return label?.textContent?.trim() || name;\n}\n\n// Put each field's messages inside its form control as a design-system\n// `.error` element (templates/system/components/form.py), which the control's\n// `group-has-[.error]` styles turn red.\nfunction markInvalid(form: HTMLFormElement, errors: FieldErrors) {\n  clearInvalid(form);\n  for (const [name, messages] of Object.entries(errors)) {\n    const input = form.elements.namedItem(name);\n    if (!(input instanceof Element) || !input.parentElement) {\n      continue;\n    }\n    input.setAttribute(\"aria-invalid\", \"true\");\n    const error = document.createElement(\"div\");\n    error.className = \"error pl-2 text-red-500 text-xs\";\n    error.setAttribute(\"data-save-all-error\", \"\");\n    error.textContent = messages.join(\" \");\n    input.parentElement.append(error);\n  }\n}\n\nfunction clearInvalid(form: HTMLFormElement) {\n  for (const el of form.querySelectorAll(FIELD_ERROR)) {\n    el.remove();\n  }\n  for (const el of form.querySelectorAll(\"[aria-invalid]\")) {\n    el.removeAttribute(\"aria-invalid\");\n  }\n}\n\n// Turn a failed save response into a message the user can act on. A 400 with\n// DRF field errors names the fields (and marks them); an auth failure (session\n// expired, stale CSRF token) says so; anything else is a server-side failure.\nasync function describeFailure(\n  form: HTMLFormElement,\n  response: Response,\n): Promise<string> {\n  let body: unknown = null;\n  try {\n    body = await response.json();\n  } catch {\n    // Non-JSON error body (e.g. an HTML error page); use the status alone.\n  }\n  if (\n    typeof body === \"object\" &&\n    body !== null &&\n    \"detail\" in body &&\n    typeof body.detail === \"string\"\n  ) {\n    return `Could not save: ${body.detail}`;\n  }\n  if (response.status === 401 || response.status === 403) {\n    return \"Could not save: you have been signed out. Reload the page and sign in again.\";\n  }\n  if (response.status === 413) {\n    return \"Could not save: the attached file is too large.\";\n  }\n  if (response.status === 400 && isFieldErrors(body)) {\n    markInvalid(form, body);\n    const parts = Object.entries(body).map(([field, messages]) =>\n      field === \"non_field_errors\"\n        ? messages.join(\" \")\n        : `${fieldLabel(form, field)}: ${messages.join(\" \")}`,\n    );\n    return `Could not save. ${parts.join(\" \")}`;\n  }\n  return `Could not save: something went wrong on the server (HTTP ${response.status}). Try again, and report it if it keeps happening.`;\n}\n\nfunction key(form: HTMLFormElement): string {\n  return form.getAttribute(\"action\") ?? form.action;\n}\n\n// A form's serialized state, used to decide whether it has unsaved changes.\n// The CSRF token is excluded; files contribute name and size so a selected\n// file counts as a change but an empty file input does not.\nexport function serialize(form: HTMLFormElement): string {\n  const entries: string[] = [];\n  for (const [name, value] of new FormData(form).entries()) {\n    if (name === \"csrfmiddlewaretoken\") {\n      continue;\n    }\n    if (value instanceof File) {\n      entries.push(`${name}=${value.name}:${value.size}`);\n    } else {\n      entries.push(`${name}=${value}`);\n    }\n  }\n  return entries.sort().join(\"&\");\n}\n\nexport default (): AlpineComponent<State> => {\n  const snapshots = new Map<HTMLFormElement, string>();\n\n  return {\n    saving: false,\n    dirty: [],\n    errors: {},\n    init() {\n      for (const form of this.$root.querySelectorAll<HTMLFormElement>(MARKED)) {\n        snapshots.set(form, serialize(form));\n      }\n    },\n    isDirty(url: string): boolean {\n      return this.dirty.includes(url);\n    },\n    error(url: string): string {\n      return this.errors[url] ?? \"\";\n    },\n    refresh(event: Event) {\n      if (!(event.target instanceof Element)) {\n        return;\n      }\n      const form = event.target.closest<HTMLFormElement>(MARKED);\n      if (!form || !snapshots.has(form)) {\n        return;\n      }\n      const changed = serialize(form) !== snapshots.get(form);\n      const url = key(form);\n      if (changed && !this.dirty.includes(url)) {\n        this.dirty.push(url);\n      } else if (!changed) {\n        this.dirty = this.dirty.filter((u) => u !== url);\n      }\n    },\n    async submit(event: SubmitEvent) {\n      if (!(event.target instanceof HTMLFormElement)) {\n        return;\n      }\n      if (event.target.matches(SAVE_FIRST)) {\n        event.preventDefault();\n        await this.saveThenSubmit(event.target);\n        return;\n      }\n      if (!event.target.matches(MARKED)) {\n        return;\n      }\n      event.preventDefault();\n      await this.saveAll(event.target);\n    },\n    async saveBar() {\n      await this.saveAll(null);\n    },\n    // Saves every form with unsaved changes, plus the form whose own button\n    // was pressed (so an add-form submitted with default values still posts).\n    // One reload at the end if everything succeeded; on any failure the page\n    // is left alone so typed values survive and errors can be shown in place.\n    async saveAll(submitted: HTMLFormElement | null) {\n      if (this.saving) {\n        return;\n      }\n      this.saving = true;\n      const saved = await this.saveDirty(submitted);\n      this.saving = false;\n      if (saved) {\n        window.location.reload();\n      }\n    },\n    async saveDirty(submitted: HTMLFormElement | null): Promise<boolean> {\n      let failed = false;\n      for (const [form, snapshot] of snapshots.entries()) {\n        if (form !== submitted && serialize(form) === snapshot) {\n          continue;\n        }\n        failed = !(await this.save(form)) || failed;\n      }\n      return !failed;\n    },\n    // A form that navigates away (a delete) would otherwise discard every\n    // unsaved edit on the page, including files staged in a dropzone. Save\n    // those first, and abandon the navigation if any of them fails.\n    async saveThenSubmit(form: HTMLFormElement) {\n      if (this.saving) {\n        return;\n      }\n      this.saving = true;\n      const saved = await this.saveDirty(null);\n      this.saving = false;\n      if (saved) {\n        form.submit();\n      }\n    },\n    async save(form: HTMLFormElement): Promise<boolean> {\n      const url = key(form);\n      const body = new FormData(form);\n      for (const [name, value] of [...body.entries()]) {\n        if (value instanceof File && value.size === 0) {\n          body.delete(name);\n        }\n      }\n      let response;\n      try {\n        response = await fetch(form.action, {\n          body: await replaceFiles(body, csrfToken(form)),\n          headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n          method: \"POST\",\n        });\n      } catch {\n        this.errors[url] = \"Could not save: network error.\";\n        return false;\n      }\n      if (response.status === 204) {\n        // Disable file inputs that just uploaded so a retry after another\n        // form's failure can't upload the same file twice.\n        for (const [name, value] of body.entries()) {\n          if (value instanceof File) {\n            form\n              .querySelector(`input[name=\"${name}\"]`)\n              ?.setAttribute(\"disabled\", \"disabled\");\n          }\n        }\n        snapshots.set(form, serialize(form));\n        this.dirty = this.dirty.filter((u) => u !== url);\n        delete this.errors[url];\n        clearInvalid(form);\n        return true;\n      }\n      this.errors[url] = await describeFailure(form, response);\n      return false;\n    },\n    warn(event: BeforeUnloadEvent) {\n      if (this.dirty.length > 0 || this.saving) {\n        event.preventDefault();\n      }\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\nimport { serialize } from \"./saveall\";\n\ninterface State extends Record<string | symbol, unknown> {\n  dirty: boolean;\n  check(): void;\n  discard(): void;\n}\n\n// A system's page at /ops/systems/<id>/, one form saved as a whole. It says\n// when there are unsaved changes, saves on Ctrl+S or \u2318S, and asks before\n// leaving them behind.\nexport default (): AlpineComponent<State> => {\n  let saved = \"\";\n  let leaving = false;\n\n  return {\n    dirty: false,\n\n    init() {\n      const form = this.$root;\n      if (!(form instanceof HTMLFormElement)) {\n        return;\n      }\n      saved = serialize(form);\n      form.addEventListener(\"input\", () => this.check());\n      form.addEventListener(\"change\", () => this.check());\n      form.addEventListener(\"submit\", () => {\n        leaving = true;\n      });\n      window.addEventListener(\"beforeunload\", (event) => {\n        if (this.dirty && !leaving) {\n          event.preventDefault();\n        }\n      });\n      window.addEventListener(\"keydown\", (event) => {\n        if ((event.metaKey || event.ctrlKey) && event.key === \"s\") {\n          event.preventDefault();\n          form.requestSubmit();\n        }\n      });\n    },\n\n    check() {\n      if (this.$root instanceof HTMLFormElement) {\n        this.dirty = serialize(this.$root) !== saved;\n      }\n    },\n\n    discard() {\n      leaving = true;\n      window.location.reload();\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  query: string;\n  show: string;\n  type: string;\n  shown: number;\n  summary: string;\n  apply(): void;\n  clear(): void;\n}\n\n// The filters as they appear in the address, so a filtered library can be\n// linked to and survives a reload.\nconst PARAMS = { query: \"q\", show: \"show\", type: \"type\" } as const;\n\nfunction plural(count: number, word: string): string {\n  return `${count} ${word}${count === 1 ? \"\" : \"s\"}`;\n}\n\n// The system library at /ops/systems/: filters its rows as you type. Each\n// measure type is a tbody whose first cell spans its rows, so the cell moves\n// to the first row still shown and spans only the rows still shown.\nexport default (): AlpineComponent<State> => ({\n  query: \"\",\n  show: \"\",\n  type: \"\",\n  shown: 0,\n  summary: \"\",\n\n  init() {\n    const params = new URLSearchParams(window.location.search);\n    this.query = params.get(PARAMS.query) ?? \"\";\n    this.show = params.get(PARAMS.show) ?? \"\";\n    this.type = params.get(PARAMS.type) ?? \"\";\n    for (const key of Object.keys(PARAMS)) {\n      this.$watch(key, () => this.apply());\n    }\n    window.addEventListener(\"keydown\", (event) => {\n      const typing =\n        event.target instanceof HTMLElement &&\n        event.target.closest(\"input, textarea, select, [contenteditable]\");\n      if (event.key === \"/\" && !typing) {\n        event.preventDefault();\n        (this.$refs[\"search\"] as HTMLInputElement | undefined)?.focus();\n      }\n    });\n    this.apply();\n  },\n\n  apply() {\n    const words = this.query.toLowerCase().split(/\\s+/).filter(Boolean);\n    let shown = 0;\n    for (const group of this.$root.querySelectorAll<HTMLElement>(\n      \"tbody[data-type]\",\n    )) {\n      const visible = [\n        ...group.querySelectorAll<HTMLTableRowElement>(\"tr[data-search]\"),\n      ].filter((row) => {\n        const search = row.dataset[\"search\"] ?? \"\";\n        const matches =\n          (!this.type || group.dataset[\"type\"] === this.type) &&\n          (!this.show || row.dataset[\"status\"] === this.show) &&\n          words.every((word) => search.includes(word));\n        row.hidden = !matches;\n        return matches;\n      });\n      group.hidden = visible.length === 0;\n      const lead = group.querySelector<HTMLTableCellElement>(\"td[data-lead]\");\n      const first = visible[0];\n      if (lead && first) {\n        first.prepend(lead);\n        lead.rowSpan = visible.length;\n        const count = lead.querySelector(\"[data-count]\");\n        if (count) {\n          count.textContent = String(visible.length);\n        }\n      }\n      shown += visible.length;\n    }\n    this.shown = shown;\n    const total = Number(this.$root.dataset[\"total\"] ?? shown);\n    this.summary =\n      shown === total ? plural(total, \"system\") : `${shown} of ${total} shown`;\n\n    const url = new URL(window.location.href);\n    for (const [key, param] of Object.entries(PARAMS)) {\n      const value = this[key as keyof typeof PARAMS];\n      if (value) {\n        url.searchParams.set(param, value);\n      } else {\n        url.searchParams.delete(param);\n      }\n    }\n    window.history.replaceState(null, \"\", url);\n  },\n\n  clear() {\n    this.query = \"\";\n    this.show = \"\";\n    this.type = \"\";\n  },\n});\n", "export const DATABASE_NAME = \"furbnow-recorder\";\n\nconst CHUNKS = \"chunks\";\nconst SESSIONS = \"sessions\";\n\nexport type SessionStatus = \"recording\" | \"uploading\" | \"processing\" | \"ready\";\n\nexport interface SessionRecord {\n  sessionId: string;\n  streamUid: string;\n  tusUrl: string;\n  recordingId: number | null;\n  status: SessionStatus;\n  startedAt: number;\n  mimeType: string;\n  chunkCount: number;\n}\n\ninterface ChunkRecord {\n  sessionId: string;\n  seq: number;\n  data: ArrayBuffer;\n}\n\nfunction promisify<T>(request: IDBRequest<T>): Promise<T> {\n  return new Promise((resolve, reject) => {\n    request.onsuccess = () => resolve(request.result);\n    request.onerror = () =>\n      reject(request.error ?? new Error(\"IndexedDB error\"));\n  });\n}\n\n// Disk spool for recording chunks (FR-13): every MediaRecorder blob lands\n// here immediately so a crashed tab loses at most the final timeslice, and\n// the JS heap never holds the whole recording.\nexport class ChunkStore {\n  private constructor(private database: IDBDatabase) {}\n\n  static open(factory: IDBFactory): Promise<ChunkStore> {\n    const request = factory.open(DATABASE_NAME, 1);\n    request.onupgradeneeded = () => {\n      const database = request.result;\n      database.createObjectStore(CHUNKS, { keyPath: [\"sessionId\", \"seq\"] });\n      database.createObjectStore(SESSIONS, { keyPath: \"sessionId\" });\n    };\n    return promisify(request).then((database) => new ChunkStore(database));\n  }\n\n  close(): void {\n    this.database.close();\n  }\n\n  // The blob is copied to an ArrayBuffer so the store never retains a\n  // reference to MediaRecorder's blob (structured-clone-safe everywhere).\n  async putChunk(sessionId: string, seq: number, blob: Blob): Promise<void> {\n    const data = await blob.arrayBuffer();\n    const record: ChunkRecord = { sessionId, seq, data };\n    const transaction = this.database.transaction(CHUNKS, \"readwrite\");\n    await promisify(transaction.objectStore(CHUNKS).put(record));\n  }\n\n  // All chunks for a session concatenated in seq order (FR-15 recovery and\n  // the post-stop upload both read from here).\n  async assemble(sessionId: string, mimeType: string): Promise<Blob> {\n    const chunks = await this.chunks(sessionId);\n    return new Blob(\n      chunks.map((chunk) => chunk.data),\n      { type: mimeType },\n    );\n  }\n\n  async chunks(sessionId: string): Promise<ChunkRecord[]> {\n    const transaction = this.database.transaction(CHUNKS, \"readonly\");\n    const range = IDBKeyRange.bound(\n      [sessionId, Number.NEGATIVE_INFINITY],\n      [sessionId, Number.POSITIVE_INFINITY],\n    );\n    const records = await promisify<ChunkRecord[]>(\n      transaction.objectStore(CHUNKS).getAll(range),\n    );\n    return records.sort((a, b) => a.seq - b.seq);\n  }\n\n  async putSession(record: SessionRecord): Promise<void> {\n    const transaction = this.database.transaction(SESSIONS, \"readwrite\");\n    await promisify(transaction.objectStore(SESSIONS).put(record));\n  }\n\n  async getSession(sessionId: string): Promise<SessionRecord | null> {\n    const transaction = this.database.transaction(SESSIONS, \"readonly\");\n    const record = await promisify<SessionRecord | undefined>(\n      transaction.objectStore(SESSIONS).get(sessionId),\n    );\n    return record ?? null;\n  }\n\n  async listSessions(): Promise<SessionRecord[]> {\n    const transaction = this.database.transaction(SESSIONS, \"readonly\");\n    return promisify<SessionRecord[]>(\n      transaction.objectStore(SESSIONS).getAll(),\n    );\n  }\n\n  async deleteSession(sessionId: string): Promise<void> {\n    const chunks = this.database.transaction(CHUNKS, \"readwrite\");\n    const range = IDBKeyRange.bound(\n      [sessionId, Number.NEGATIVE_INFINITY],\n      [sessionId, Number.POSITIVE_INFINITY],\n    );\n    await promisify(chunks.objectStore(CHUNKS).delete(range));\n\n    const sessions = this.database.transaction(SESSIONS, \"readwrite\");\n    await promisify(sessions.objectStore(SESSIONS).delete(sessionId));\n  }\n}\n", "const CANDIDATES = [\n  'video/webm;codecs=\"vp9,opus\"',\n  'video/webm;codecs=\"vp8,opus\"',\n  \"video/webm\",\n];\n\n// First MediaRecorder mime type this browser can encode (FR-11).\nexport function probeMimeType(\n  isTypeSupported: (mimeType: string) => boolean,\n): string {\n  const supported = CANDIDATES.find(isTypeSupported);\n  if (supported === undefined) {\n    throw new Error(\n      \"This browser cannot record WebM video. Use a recent version of Chrome.\",\n    );\n  }\n  return supported;\n}\n", "import { AlpineComponent } from \"alpinejs\";\n\nimport { ChunkStore, SessionRecord } from \"./chunkstore\";\nimport { probeMimeType } from \"./codec\";\n\nconst HEAP_SAMPLE_MS = 10_000;\nconst TIMESLICE_MS = 1000;\nconst DRAW_INTERVAL_MS = 33;\nconst WORKER_SOURCE = `setInterval(() => postMessage(0), ${DRAW_INTERVAL_MS});`;\n\ninterface HeapSample {\n  atMs: number;\n  usedJsHeapSize: number | null;\n  spooledBytes: number;\n  chunkCount: number;\n}\n\ninterface ChromeMemory {\n  usedJSHeapSize: number;\n}\n\nfunction usedHeap(): number | null {\n  const memory = (performance as unknown as { memory?: ChromeMemory }).memory;\n  return memory ? memory.usedJSHeapSize : null;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  running: boolean;\n  minutes: string;\n  elapsedMs: number;\n  frameCount: number;\n  chunkCount: number;\n  spooledBytes: number;\n  heapLabel: string;\n  resultUrl: string;\n  reportUrl: string;\n  summary: string;\n\n  init(): void;\n  start(): Promise<void>;\n  stop(): void;\n  finish(): Promise<void>;\n  statusLabel(): string;\n}\n\n// Dev-only automation of the soak criteria (PRD 8.5): synthetic sources \u2014 a\n// canvas animation with an on-screen 1 fps counter (SC-3) and an oscillator\n// audio bed \u2014 run through the exact record-and-spool pipeline for a scripted\n// duration while the JS heap is sampled every 10 s (SC-2). No permissions or\n// fake-device flags needed.\nexport default (): AlpineComponent<State> => {\n  let store: ChunkStore | null = null;\n  let session: SessionRecord | null = null;\n  let recorder: MediaRecorder | null = null;\n  let worker: Worker | null = null;\n  let audioContext: AudioContext | null = null;\n  let canvasTrack: MediaStreamTrack | null = null;\n  let startedAt = 0;\n  let sequence = 0;\n  let spoolQueue: Promise<void> = Promise.resolve();\n  let samples: HeapSample[] = [];\n  let sampleTimer: ReturnType<typeof setInterval> | null = null;\n  let stopTimer: ReturnType<typeof setTimeout> | null = null;\n\n  return {\n    running: false,\n    minutes: \"5\",\n    elapsedMs: 0,\n    frameCount: 0,\n    chunkCount: 0,\n    spooledBytes: 0,\n    heapLabel: \"n/a\",\n    resultUrl: \"\",\n    reportUrl: \"\",\n    summary: \"\",\n\n    init() {\n      void ChunkStore.open(indexedDB).then((opened) => {\n        store = opened;\n      });\n    },\n\n    async start() {\n      if (this.running || !store) {\n        return;\n      }\n      const chunkStore = store;\n      this.running = true;\n      this.summary = \"\";\n      this.resultUrl = \"\";\n      this.reportUrl = \"\";\n      this.frameCount = 0;\n      this.chunkCount = 0;\n      this.spooledBytes = 0;\n      samples = [];\n      sequence = 0;\n      startedAt = Date.now();\n\n      const canvas = this.$refs[\"stage\"];\n      if (!(canvas instanceof HTMLCanvasElement)) {\n        return;\n      }\n      const context = canvas.getContext(\"2d\");\n      if (!context) {\n        return;\n      }\n\n      const mimeType = probeMimeType((type) =>\n        MediaRecorder.isTypeSupported(type),\n      );\n      session = {\n        sessionId: `harness-${crypto.randomUUID()}`,\n        streamUid: \"\",\n        tusUrl: \"\",\n        recordingId: null,\n        status: \"recording\",\n        startedAt,\n        mimeType,\n        chunkCount: 0,\n      };\n      await chunkStore.putSession(session);\n\n      audioContext = new AudioContext();\n      const oscillator = audioContext.createOscillator();\n      oscillator.frequency.value = 440;\n      const destination = audioContext.createMediaStreamDestination();\n      oscillator.connect(destination);\n      oscillator.start();\n\n      // Timed capture, same rationale as the recorder: captureStream(0) +\n      // requestFrame() alone freezes MediaRecorder output on frame one.\n      const captured = canvas.captureStream(30);\n      const track = captured.getVideoTracks()[0];\n      if (!track) {\n        return;\n      }\n      canvasTrack = track;\n\n      const draw = () => {\n        const elapsed = Date.now() - startedAt;\n        this.elapsedMs = elapsed;\n        // The 1 fps integrity counter (SC-3): one distinct value per second.\n        const seconds = Math.floor(elapsed / 1000);\n        context.fillStyle = \"#0f172a\";\n        context.fillRect(0, 0, canvas.width, canvas.height);\n        context.fillStyle = \"#f8fafc\";\n        context.font = \"bold 160px monospace\";\n        context.textAlign = \"center\";\n        context.fillText(`${seconds}`, canvas.width / 2, canvas.height / 2);\n        // Animated content so the encoder has real work to do.\n        const x = (elapsed / 4) % canvas.width;\n        context.fillStyle = \"#38bdf8\";\n        context.fillRect(x, canvas.height - 80, 120, 48);\n        this.frameCount += 1;\n        if (canvasTrack && \"requestFrame\" in canvasTrack) {\n          (canvasTrack as CanvasCaptureMediaStreamTrack).requestFrame();\n        }\n      };\n\n      worker = new Worker(\n        URL.createObjectURL(\n          new Blob([WORKER_SOURCE], { type: \"text/javascript\" }),\n        ),\n      );\n      worker.onmessage = draw;\n\n      const stream = new MediaStream([\n        track,\n        ...destination.stream.getAudioTracks(),\n      ]);\n      recorder = new MediaRecorder(stream, {\n        mimeType,\n        videoBitsPerSecond: 2_500_000,\n        audioBitsPerSecond: 128_000,\n      });\n      recorder.ondataavailable = (event: BlobEvent) => {\n        const current = session;\n        if (!current || event.data.size === 0) {\n          return;\n        }\n        const seq = sequence;\n        sequence += 1;\n        spoolQueue = spoolQueue.then(async () => {\n          await chunkStore.putChunk(current.sessionId, seq, event.data);\n          this.chunkCount = seq + 1;\n          this.spooledBytes += event.data.size;\n        });\n      };\n      recorder.onstop = () => {\n        void this.finish();\n      };\n      recorder.start(TIMESLICE_MS);\n\n      const sample = () => {\n        const heap = usedHeap();\n        this.heapLabel = heap\n          ? `${(heap / (1024 * 1024)).toFixed(1)} MB`\n          : \"n/a\";\n        samples.push({\n          atMs: Date.now() - startedAt,\n          usedJsHeapSize: heap,\n          spooledBytes: this.spooledBytes,\n          chunkCount: this.chunkCount,\n        });\n        console.log(\"[harness]\", samples[samples.length - 1]);\n      };\n      sample();\n      sampleTimer = setInterval(sample, HEAP_SAMPLE_MS);\n      stopTimer = setTimeout(\n        () => {\n          this.stop();\n        },\n        Number(this.minutes) * 60 * 1000,\n      );\n    },\n\n    stop() {\n      if (!recorder || recorder.state === \"inactive\") {\n        return;\n      }\n      recorder.stop();\n    },\n\n    async finish() {\n      if (sampleTimer !== null) {\n        clearInterval(sampleTimer);\n        sampleTimer = null;\n      }\n      if (stopTimer !== null) {\n        clearTimeout(stopTimer);\n        stopTimer = null;\n      }\n      worker?.terminate();\n      worker = null;\n      canvasTrack = null;\n      void audioContext?.close();\n      audioContext = null;\n\n      await spoolQueue;\n      if (!store || !session) {\n        this.running = false;\n        return;\n      }\n      const blob = await store.assemble(session.sessionId, session.mimeType);\n      await store.deleteSession(session.sessionId);\n      this.resultUrl = URL.createObjectURL(blob);\n      this.reportUrl = URL.createObjectURL(\n        new Blob(\n          [\n            JSON.stringify(\n              {\n                startedAt,\n                durationMs: this.elapsedMs,\n                frameCount: this.frameCount,\n                chunkCount: this.chunkCount,\n                spooledBytes: this.spooledBytes,\n                webmBytes: blob.size,\n                samples,\n              },\n              null,\n              2,\n            ),\n          ],\n          { type: \"application/json\" },\n        ),\n      );\n      this.summary =\n        `Recorded ${Math.round(this.elapsedMs / 1000)}s: ` +\n        `${this.chunkCount} chunks, ${(blob.size / (1024 * 1024)).toFixed(1)} MB webm, ` +\n        `${this.frameCount} frames drawn.`;\n      session = null;\n      this.running = false;\n    },\n\n    statusLabel(): string {\n      const seconds = Math.floor(this.elapsedMs / 1000);\n      const spooled = (this.spooledBytes / (1024 * 1024)).toFixed(1);\n      return (\n        `${seconds}s elapsed \u00B7 ${this.chunkCount} chunks \u00B7 ` +\n        `${spooled} MB spooled \u00B7 heap ${this.heapLabel}`\n      );\n    },\n  };\n};\n", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\nfunction _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _isNativeFunction(fn) { try { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; } catch (e) { return typeof fn === \"function\"; } }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nvar DetailedError = /*#__PURE__*/function (_Error) {\n  function DetailedError(message) {\n    var _this;\n    var causingErr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n    var req = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n    var res = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n    _classCallCheck(this, DetailedError);\n    _this = _callSuper(this, DetailedError, [message]);\n    _this.originalRequest = req;\n    _this.originalResponse = res;\n    _this.causingError = causingErr;\n    if (causingErr != null) {\n      message += \", caused by \".concat(causingErr.toString());\n    }\n    if (req != null) {\n      var requestId = req.getHeader('X-Request-ID') || 'n/a';\n      var method = req.getMethod();\n      var url = req.getURL();\n      var status = res ? res.getStatus() : 'n/a';\n      var body = res ? res.getBody() || '' : 'n/a';\n      message += \", originated from request (method: \".concat(method, \", url: \").concat(url, \", response code: \").concat(status, \", response text: \").concat(body, \", request id: \").concat(requestId, \")\");\n    }\n    _this.message = message;\n    return _this;\n  }\n  _inherits(DetailedError, _Error);\n  return _createClass(DetailedError);\n}( /*#__PURE__*/_wrapNativeSuper(Error));\nexport default DetailedError;", "var isEnabled = false;\nexport function enableDebugLog() {\n  isEnabled = true;\n}\nexport function log(msg) {\n  if (!isEnabled) return;\n  console.log(msg);\n}", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar NoopUrlStorage = /*#__PURE__*/function () {\n  function NoopUrlStorage() {\n    _classCallCheck(this, NoopUrlStorage);\n  }\n  return _createClass(NoopUrlStorage, [{\n    key: \"listAllUploads\",\n    value: function listAllUploads() {\n      return Promise.resolve([]);\n    }\n  }, {\n    key: \"findUploadsByFingerprint\",\n    value: function findUploadsByFingerprint(_fingerprint) {\n      return Promise.resolve([]);\n    }\n  }, {\n    key: \"removeUpload\",\n    value: function removeUpload(_urlStorageKey) {\n      return Promise.resolve();\n    }\n  }, {\n    key: \"addUpload\",\n    value: function addUpload(_fingerprint, _upload) {\n      return Promise.resolve(null);\n    }\n  }]);\n}();\nexport { NoopUrlStorage as default };", "/**\n *  base64.ts\n *\n *  Licensed under the BSD 3-Clause License.\n *    http://opensource.org/licenses/BSD-3-Clause\n *\n *  References:\n *    http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.8.0';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder('utf-8', { ignoreBOM: true }) : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n    let tab = {};\n    a.forEach((c, i) => tab[c] = i);\n    return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n    ? Uint8Array.from.bind(Uint8Array)\n    : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n    .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n    // console.log('polyfilled');\n    let u32, c0, c1, c2, asc = '';\n    const pad = bin.length % 3;\n    for (let i = 0; i < bin.length;) {\n        if ((c0 = bin.charCodeAt(i++)) > 255 ||\n            (c1 = bin.charCodeAt(i++)) > 255 ||\n            (c2 = bin.charCodeAt(i++)) > 255)\n            throw new TypeError('invalid character found');\n        u32 = (c0 << 16) | (c1 << 8) | c2;\n        asc += b64chs[u32 >> 18 & 63]\n            + b64chs[u32 >> 12 & 63]\n            + b64chs[u32 >> 6 & 63]\n            + b64chs[u32 & 63];\n    }\n    return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n    : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n        : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n    ? (u8a) => Buffer.from(u8a).toString('base64')\n    : (u8a) => {\n        // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n        const maxargs = 0x1000;\n        let strs = [];\n        for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n            strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n        }\n        return _btoa(strs.join(''));\n    };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 \u00A75\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n    if (c.length < 2) {\n        var cc = c.charCodeAt(0);\n        return cc < 0x80 ? c\n            : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n                + _fromCC(0x80 | (cc & 0x3f)))\n                : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n                    + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n                    + _fromCC(0x80 | (cc & 0x3f)));\n    }\n    else {\n        var cc = 0x10000\n            + (c.charCodeAt(0) - 0xD800) * 0x400\n            + (c.charCodeAt(1) - 0xDC00);\n        return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n            + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n            + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n            + _fromCC(0x80 | (cc & 0x3f)));\n    }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n    ? (s) => Buffer.from(s, 'utf8').toString('base64')\n    : _TE\n        ? (s) => _fromUint8Array(_TE.encode(s))\n        : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n    ? _mkUriSafe(_encode(src))\n    : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 \u00A75.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n    switch (cccc.length) {\n        case 4:\n            var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n                | ((0x3f & cccc.charCodeAt(1)) << 12)\n                | ((0x3f & cccc.charCodeAt(2)) << 6)\n                | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n            return (_fromCC((offset >>> 10) + 0xD800)\n                + _fromCC((offset & 0x3FF) + 0xDC00));\n        case 3:\n            return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n                | ((0x3f & cccc.charCodeAt(1)) << 6)\n                | (0x3f & cccc.charCodeAt(2)));\n        default:\n            return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n                | (0x3f & cccc.charCodeAt(1)));\n    }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n    // console.log('polyfilled');\n    asc = asc.replace(/\\s+/g, '');\n    if (!b64re.test(asc))\n        throw new TypeError('malformed base64.');\n    asc += '=='.slice(2 - (asc.length & 3));\n    let u24, r1, r2;\n    let binArray = []; // use array to avoid minor gc in loop\n    for (let i = 0; i < asc.length;) {\n        u24 = b64tab[asc.charAt(i++)] << 18\n            | b64tab[asc.charAt(i++)] << 12\n            | (r1 = b64tab[asc.charAt(i++)]) << 6\n            | (r2 = b64tab[asc.charAt(i++)]);\n        if (r1 === 64) {\n            binArray.push(_fromCC(u24 >> 16 & 255));\n        }\n        else if (r2 === 64) {\n            binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255));\n        }\n        else {\n            binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255));\n        }\n    }\n    return binArray.join('');\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n    : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n        : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n    ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n    : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n    ? (a) => Buffer.from(a, 'base64').toString('utf8')\n    : _TD\n        ? (a) => _TD.decode(_toUint8Array(a))\n        : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string.  Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n  */\nconst isValid = (src) => {\n    if (typeof src !== 'string')\n        return false;\n    const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n    return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n    return {\n        value: v, enumerable: false, writable: true, configurable: true\n    };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n    const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n    _add('fromBase64', function () { return decode(this); });\n    _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n    _add('toBase64URI', function () { return encode(this, true); });\n    _add('toBase64URL', function () { return encode(this, true); });\n    _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n    const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n    _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n    _add('toBase64URI', function () { return fromUint8Array(this, true); });\n    _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n    extendString();\n    extendUint8Array();\n};\nconst gBase64 = {\n    version: version,\n    VERSION: VERSION,\n    atob: _atob,\n    atobPolyfill: atobPolyfill,\n    btoa: _btoa,\n    btoaPolyfill: btoaPolyfill,\n    fromBase64: decode,\n    toBase64: encode,\n    encode: encode,\n    encodeURI: encodeURI,\n    encodeURL: encodeURI,\n    utob: utob,\n    btou: btou,\n    decode: decode,\n    isValid: isValid,\n    fromUint8Array: fromUint8Array,\n    toUint8Array: toUint8Array,\n    extendString: extendString,\n    extendUint8Array: extendUint8Array,\n    extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n", "function _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nimport { Base64 } from 'js-base64';\nimport URL from 'url-parse';\nimport DetailedError from './error.js';\nimport { log } from './logger.js';\nimport uuid from './uuid.js';\nvar PROTOCOL_TUS_V1 = 'tus-v1';\nvar PROTOCOL_IETF_DRAFT_03 = 'ietf-draft-03';\nvar PROTOCOL_IETF_DRAFT_05 = 'ietf-draft-05';\nvar defaultOptions = {\n  endpoint: null,\n  uploadUrl: null,\n  metadata: {},\n  metadataForPartialUploads: {},\n  fingerprint: null,\n  uploadSize: null,\n  onProgress: null,\n  onChunkComplete: null,\n  onSuccess: null,\n  onError: null,\n  onUploadUrlAvailable: null,\n  overridePatchMethod: false,\n  headers: {},\n  addRequestId: false,\n  onBeforeRequest: null,\n  onAfterResponse: null,\n  onShouldRetry: defaultOnShouldRetry,\n  chunkSize: Number.POSITIVE_INFINITY,\n  retryDelays: [0, 1000, 3000, 5000],\n  parallelUploads: 1,\n  parallelUploadBoundaries: null,\n  storeFingerprintForResuming: true,\n  removeFingerprintOnSuccess: false,\n  uploadLengthDeferred: false,\n  uploadDataDuringCreation: false,\n  urlStorage: null,\n  fileReader: null,\n  httpStack: null,\n  protocol: PROTOCOL_TUS_V1\n};\nvar BaseUpload = /*#__PURE__*/function () {\n  function BaseUpload(file, options) {\n    _classCallCheck(this, BaseUpload);\n    // Warn about removed options from previous versions\n    if ('resume' in options) {\n      console.log('tus: The `resume` option has been removed in tus-js-client v2. Please use the URL storage API instead.');\n    }\n\n    // The default options will already be added from the wrapper classes.\n    this.options = options;\n\n    // Cast chunkSize to integer\n    this.options.chunkSize = Number(this.options.chunkSize);\n\n    // The storage module used to store URLs\n    this._urlStorage = this.options.urlStorage;\n\n    // The underlying File/Blob object\n    this.file = file;\n\n    // The URL against which the file will be uploaded\n    this.url = null;\n\n    // The underlying request object for the current PATCH request\n    this._req = null;\n\n    // The fingerpinrt for the current file (set after start())\n    this._fingerprint = null;\n\n    // The key that the URL storage returned when saving an URL with a fingerprint,\n    this._urlStorageKey = null;\n\n    // The offset used in the current PATCH request\n    this._offset = null;\n\n    // True if the current PATCH request has been aborted\n    this._aborted = false;\n\n    // The file's size in bytes\n    this._size = null;\n\n    // The Source object which will wrap around the given file and provides us\n    // with a unified interface for getting its size and slice chunks from its\n    // content allowing us to easily handle Files, Blobs, Buffers and Streams.\n    this._source = null;\n\n    // The current count of attempts which have been made. Zero indicates none.\n    this._retryAttempt = 0;\n\n    // The timeout's ID which is used to delay the next retry\n    this._retryTimeout = null;\n\n    // The offset of the remote upload before the latest attempt was started.\n    this._offsetBeforeRetry = 0;\n\n    // An array of BaseUpload instances which are used for uploading the different\n    // parts, if the parallelUploads option is used.\n    this._parallelUploads = null;\n\n    // An array of upload URLs which are used for uploading the different\n    // parts, if the parallelUploads option is used.\n    this._parallelUploadUrls = null;\n  }\n\n  /**\n   * Use the Termination extension to delete an upload from the server by sending a DELETE\n   * request to the specified upload URL. This is only possible if the server supports the\n   * Termination extension. If the `options.retryDelays` property is set, the method will\n   * also retry if an error ocurrs.\n   *\n   * @param {String} url The upload's URL which will be terminated.\n   * @param {object} options Optional options for influencing HTTP requests.\n   * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n   */\n  return _createClass(BaseUpload, [{\n    key: \"findPreviousUploads\",\n    value: function findPreviousUploads() {\n      var _this = this;\n      return this.options.fingerprint(this.file, this.options).then(function (fingerprint) {\n        return _this._urlStorage.findUploadsByFingerprint(fingerprint);\n      });\n    }\n  }, {\n    key: \"resumeFromPreviousUpload\",\n    value: function resumeFromPreviousUpload(previousUpload) {\n      this.url = previousUpload.uploadUrl || null;\n      this._parallelUploadUrls = previousUpload.parallelUploadUrls || null;\n      this._urlStorageKey = previousUpload.urlStorageKey;\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      var _this2 = this;\n      var file = this.file;\n      if (!file) {\n        this._emitError(new Error('tus: no file or stream to upload provided'));\n        return;\n      }\n      if (![PROTOCOL_TUS_V1, PROTOCOL_IETF_DRAFT_03, PROTOCOL_IETF_DRAFT_05].includes(this.options.protocol)) {\n        this._emitError(new Error(\"tus: unsupported protocol \".concat(this.options.protocol)));\n        return;\n      }\n      if (!this.options.endpoint && !this.options.uploadUrl && !this.url) {\n        this._emitError(new Error('tus: neither an endpoint or an upload URL is provided'));\n        return;\n      }\n      var retryDelays = this.options.retryDelays;\n      if (retryDelays != null && Object.prototype.toString.call(retryDelays) !== '[object Array]') {\n        this._emitError(new Error('tus: the `retryDelays` option must either be an array or null'));\n        return;\n      }\n      if (this.options.parallelUploads > 1) {\n        // Test which options are incompatible with parallel uploads.\n        for (var _i = 0, _arr = ['uploadUrl', 'uploadSize', 'uploadLengthDeferred']; _i < _arr.length; _i++) {\n          var optionName = _arr[_i];\n          if (this.options[optionName]) {\n            this._emitError(new Error(\"tus: cannot use the \".concat(optionName, \" option when parallelUploads is enabled\")));\n            return;\n          }\n        }\n      }\n      if (this.options.parallelUploadBoundaries) {\n        if (this.options.parallelUploads <= 1) {\n          this._emitError(new Error('tus: cannot use the `parallelUploadBoundaries` option when `parallelUploads` is disabled'));\n          return;\n        }\n        if (this.options.parallelUploads !== this.options.parallelUploadBoundaries.length) {\n          this._emitError(new Error('tus: the `parallelUploadBoundaries` must have the same length as the value of `parallelUploads`'));\n          return;\n        }\n      }\n      this.options.fingerprint(file, this.options).then(function (fingerprint) {\n        if (fingerprint == null) {\n          log('No fingerprint was calculated meaning that the upload cannot be stored in the URL storage.');\n        } else {\n          log(\"Calculated fingerprint: \".concat(fingerprint));\n        }\n        _this2._fingerprint = fingerprint;\n        if (_this2._source) {\n          return _this2._source;\n        }\n        return _this2.options.fileReader.openFile(file, _this2.options.chunkSize);\n      }).then(function (source) {\n        _this2._source = source;\n\n        // First, we look at the uploadLengthDeferred option.\n        // Next, we check if the caller has supplied a manual upload size.\n        // Finally, we try to use the calculated size from the source object.\n        if (_this2.options.uploadLengthDeferred) {\n          _this2._size = null;\n        } else if (_this2.options.uploadSize != null) {\n          _this2._size = Number(_this2.options.uploadSize);\n          if (Number.isNaN(_this2._size)) {\n            _this2._emitError(new Error('tus: cannot convert `uploadSize` option into a number'));\n            return;\n          }\n        } else {\n          _this2._size = _this2._source.size;\n          if (_this2._size == null) {\n            _this2._emitError(new Error(\"tus: cannot automatically derive upload's size from input. Specify it manually using the `uploadSize` option or use the `uploadLengthDeferred` option\"));\n            return;\n          }\n        }\n\n        // If the upload was configured to use multiple requests or if we resume from\n        // an upload which used multiple requests, we start a parallel upload.\n        if (_this2.options.parallelUploads > 1 || _this2._parallelUploadUrls != null) {\n          _this2._startParallelUpload();\n        } else {\n          _this2._startSingleUpload();\n        }\n      })[\"catch\"](function (err) {\n        _this2._emitError(err);\n      });\n    }\n\n    /**\n     * Initiate the uploading procedure for a parallelized upload, where one file is split into\n     * multiple request which are run in parallel.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_startParallelUpload\",\n    value: function _startParallelUpload() {\n      var _this$options$paralle,\n        _this3 = this;\n      var totalSize = this._size;\n      var totalProgress = 0;\n      this._parallelUploads = [];\n      var partCount = this._parallelUploadUrls != null ? this._parallelUploadUrls.length : this.options.parallelUploads;\n\n      // The input file will be split into multiple slices which are uploaded in separate\n      // requests. Here we get the start and end position for the slices.\n      var parts = (_this$options$paralle = this.options.parallelUploadBoundaries) !== null && _this$options$paralle !== void 0 ? _this$options$paralle : splitSizeIntoParts(this._source.size, partCount);\n\n      // Attach URLs from previous uploads, if available.\n      if (this._parallelUploadUrls) {\n        parts.forEach(function (part, index) {\n          part.uploadUrl = _this3._parallelUploadUrls[index] || null;\n        });\n      }\n\n      // Create an empty list for storing the upload URLs\n      this._parallelUploadUrls = new Array(parts.length);\n\n      // Generate a promise for each slice that will be resolve if the respective\n      // upload is completed.\n      var uploads = parts.map(function (part, index) {\n        var lastPartProgress = 0;\n        return _this3._source.slice(part.start, part.end).then(function (_ref) {\n          var value = _ref.value;\n          return new Promise(function (resolve, reject) {\n            // Merge with the user supplied options but overwrite some values.\n            var options = _objectSpread(_objectSpread({}, _this3.options), {}, {\n              // If available, the partial upload should be resumed from a previous URL.\n              uploadUrl: part.uploadUrl || null,\n              // We take manually care of resuming for partial uploads, so they should\n              // not be stored in the URL storage.\n              storeFingerprintForResuming: false,\n              removeFingerprintOnSuccess: false,\n              // Reset the parallelUploads option to not cause recursion.\n              parallelUploads: 1,\n              // Reset this option as we are not doing a parallel upload.\n              parallelUploadBoundaries: null,\n              metadata: _this3.options.metadataForPartialUploads,\n              // Add the header to indicate the this is a partial upload.\n              headers: _objectSpread(_objectSpread({}, _this3.options.headers), {}, {\n                'Upload-Concat': 'partial'\n              }),\n              // Reject or resolve the promise if the upload errors or completes.\n              onSuccess: resolve,\n              onError: reject,\n              // Based in the progress for this partial upload, calculate the progress\n              // for the entire final upload.\n              onProgress: function onProgress(newPartProgress) {\n                totalProgress = totalProgress - lastPartProgress + newPartProgress;\n                lastPartProgress = newPartProgress;\n                _this3._emitProgress(totalProgress, totalSize);\n              },\n              // Wait until every partial upload has an upload URL, so we can add\n              // them to the URL storage.\n              onUploadUrlAvailable: function onUploadUrlAvailable() {\n                _this3._parallelUploadUrls[index] = upload.url;\n                // Test if all uploads have received an URL\n                if (_this3._parallelUploadUrls.filter(function (u) {\n                  return Boolean(u);\n                }).length === parts.length) {\n                  _this3._saveUploadInUrlStorage();\n                }\n              }\n            });\n            var upload = new BaseUpload(value, options);\n            upload.start();\n\n            // Store the upload in an array, so we can later abort them if necessary.\n            _this3._parallelUploads.push(upload);\n          });\n        });\n      });\n      var req;\n      // Wait until all partial uploads are finished and we can send the POST request for\n      // creating the final upload.\n      Promise.all(uploads).then(function () {\n        req = _this3._openRequest('POST', _this3.options.endpoint);\n        req.setHeader('Upload-Concat', \"final;\".concat(_this3._parallelUploadUrls.join(' ')));\n\n        // Add metadata if values have been added\n        var metadata = encodeMetadata(_this3.options.metadata);\n        if (metadata !== '') {\n          req.setHeader('Upload-Metadata', metadata);\n        }\n        return _this3._sendRequest(req, null);\n      }).then(function (res) {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          _this3._emitHttpError(req, res, 'tus: unexpected response while creating upload');\n          return;\n        }\n        var location = res.getHeader('Location');\n        if (location == null) {\n          _this3._emitHttpError(req, res, 'tus: invalid or missing Location header');\n          return;\n        }\n        _this3.url = resolveUrl(_this3.options.endpoint, location);\n        log(\"Created upload at \".concat(_this3.url));\n        _this3._emitSuccess(res);\n      })[\"catch\"](function (err) {\n        _this3._emitError(err);\n      });\n    }\n\n    /**\n     * Initiate the uploading procedure for a non-parallel upload. Here the entire file is\n     * uploaded in a sequential matter.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_startSingleUpload\",\n    value: function _startSingleUpload() {\n      // Reset the aborted flag when the upload is started or else the\n      // _performUpload will stop before sending a request if the upload has been\n      // aborted previously.\n      this._aborted = false;\n\n      // The upload had been started previously and we should reuse this URL.\n      if (this.url != null) {\n        log(\"Resuming upload from previous URL: \".concat(this.url));\n        this._resumeUpload();\n        return;\n      }\n\n      // A URL has manually been specified, so we try to resume\n      if (this.options.uploadUrl != null) {\n        log(\"Resuming upload from provided URL: \".concat(this.options.uploadUrl));\n        this.url = this.options.uploadUrl;\n        this._resumeUpload();\n        return;\n      }\n\n      // An upload has not started for the file yet, so we start a new one\n      log('Creating a new upload');\n      this._createUpload();\n    }\n\n    /**\n     * Abort any running request and stop the current upload. After abort is called, no event\n     * handler will be invoked anymore. You can use the `start` method to resume the upload\n     * again.\n     * If `shouldTerminate` is true, the `terminate` function will be called to remove the\n     * current upload from the server.\n     *\n     * @param {boolean} shouldTerminate True if the upload should be deleted from the server.\n     * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n     */\n  }, {\n    key: \"abort\",\n    value: function abort(shouldTerminate) {\n      var _this4 = this;\n      // Stop any parallel partial uploads, that have been started in _startParallelUploads.\n      if (this._parallelUploads != null) {\n        var _iterator = _createForOfIteratorHelper(this._parallelUploads),\n          _step;\n        try {\n          for (_iterator.s(); !(_step = _iterator.n()).done;) {\n            var upload = _step.value;\n            upload.abort(shouldTerminate);\n          }\n        } catch (err) {\n          _iterator.e(err);\n        } finally {\n          _iterator.f();\n        }\n      }\n\n      // Stop any current running request.\n      if (this._req !== null) {\n        this._req.abort();\n        // Note: We do not close the file source here, so the user can resume in the future.\n      }\n      this._aborted = true;\n\n      // Stop any timeout used for initiating a retry.\n      if (this._retryTimeout != null) {\n        clearTimeout(this._retryTimeout);\n        this._retryTimeout = null;\n      }\n      if (!shouldTerminate || this.url == null) {\n        return Promise.resolve();\n      }\n      return BaseUpload.terminate(this.url, this.options)\n      // Remove entry from the URL storage since the upload URL is no longer valid.\n      .then(function () {\n        return _this4._removeFromUrlStorage();\n      });\n    }\n  }, {\n    key: \"_emitHttpError\",\n    value: function _emitHttpError(req, res, message, causingErr) {\n      this._emitError(new DetailedError(message, causingErr, req, res));\n    }\n  }, {\n    key: \"_emitError\",\n    value: function _emitError(err) {\n      var _this5 = this;\n      // Do not emit errors, e.g. from aborted HTTP requests, if the upload has been stopped.\n      if (this._aborted) return;\n\n      // Check if we should retry, when enabled, before sending the error to the user.\n      if (this.options.retryDelays != null) {\n        // We will reset the attempt counter if\n        // - we were already able to connect to the server (offset != null) and\n        // - we were able to upload a small chunk of data to the server\n        var shouldResetDelays = this._offset != null && this._offset > this._offsetBeforeRetry;\n        if (shouldResetDelays) {\n          this._retryAttempt = 0;\n        }\n        if (shouldRetry(err, this._retryAttempt, this.options)) {\n          var delay = this.options.retryDelays[this._retryAttempt++];\n          this._offsetBeforeRetry = this._offset;\n          this._retryTimeout = setTimeout(function () {\n            _this5.start();\n          }, delay);\n          return;\n        }\n      }\n      if (typeof this.options.onError === 'function') {\n        this.options.onError(err);\n      } else {\n        throw err;\n      }\n    }\n\n    /**\n     * Publishes notification if the upload has been successfully completed.\n     *\n     * @param {object} lastResponse Last HTTP response.\n     * @api private\n     */\n  }, {\n    key: \"_emitSuccess\",\n    value: function _emitSuccess(lastResponse) {\n      if (this.options.removeFingerprintOnSuccess) {\n        // Remove stored fingerprint and corresponding endpoint. This causes\n        // new uploads of the same file to be treated as a different file.\n        this._removeFromUrlStorage();\n      }\n      if (typeof this.options.onSuccess === 'function') {\n        this.options.onSuccess({\n          lastResponse: lastResponse\n        });\n      }\n    }\n\n    /**\n     * Publishes notification when data has been sent to the server. This\n     * data may not have been accepted by the server yet.\n     *\n     * @param {number} bytesSent  Number of bytes sent to the server.\n     * @param {number} bytesTotal Total number of bytes to be sent to the server.\n     * @api private\n     */\n  }, {\n    key: \"_emitProgress\",\n    value: function _emitProgress(bytesSent, bytesTotal) {\n      if (typeof this.options.onProgress === 'function') {\n        this.options.onProgress(bytesSent, bytesTotal);\n      }\n    }\n\n    /**\n     * Publishes notification when a chunk of data has been sent to the server\n     * and accepted by the server.\n     * @param {number} chunkSize  Size of the chunk that was accepted by the server.\n     * @param {number} bytesAccepted Total number of bytes that have been\n     *                                accepted by the server.\n     * @param {number} bytesTotal Total number of bytes to be sent to the server.\n     * @api private\n     */\n  }, {\n    key: \"_emitChunkComplete\",\n    value: function _emitChunkComplete(chunkSize, bytesAccepted, bytesTotal) {\n      if (typeof this.options.onChunkComplete === 'function') {\n        this.options.onChunkComplete(chunkSize, bytesAccepted, bytesTotal);\n      }\n    }\n\n    /**\n     * Create a new upload using the creation extension by sending a POST\n     * request to the endpoint. After successful creation the file will be\n     * uploaded\n     *\n     * @api private\n     */\n  }, {\n    key: \"_createUpload\",\n    value: function _createUpload() {\n      var _this6 = this;\n      if (!this.options.endpoint) {\n        this._emitError(new Error('tus: unable to create upload because no endpoint is provided'));\n        return;\n      }\n      var req = this._openRequest('POST', this.options.endpoint);\n      if (this.options.uploadLengthDeferred) {\n        req.setHeader('Upload-Defer-Length', '1');\n      } else {\n        req.setHeader('Upload-Length', \"\".concat(this._size));\n      }\n\n      // Add metadata if values have been added\n      var metadata = encodeMetadata(this.options.metadata);\n      if (metadata !== '') {\n        req.setHeader('Upload-Metadata', metadata);\n      }\n      var promise;\n      if (this.options.uploadDataDuringCreation && !this.options.uploadLengthDeferred) {\n        this._offset = 0;\n        promise = this._addChunkToRequest(req);\n      } else {\n        if (this.options.protocol === PROTOCOL_IETF_DRAFT_03 || this.options.protocol === PROTOCOL_IETF_DRAFT_05) {\n          req.setHeader('Upload-Complete', '?0');\n        }\n        promise = this._sendRequest(req, null);\n      }\n      promise.then(function (res) {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          _this6._emitHttpError(req, res, 'tus: unexpected response while creating upload');\n          return;\n        }\n        var location = res.getHeader('Location');\n        if (location == null) {\n          _this6._emitHttpError(req, res, 'tus: invalid or missing Location header');\n          return;\n        }\n        _this6.url = resolveUrl(_this6.options.endpoint, location);\n        log(\"Created upload at \".concat(_this6.url));\n        if (typeof _this6.options.onUploadUrlAvailable === 'function') {\n          _this6.options.onUploadUrlAvailable();\n        }\n        if (_this6._size === 0) {\n          // Nothing to upload and file was successfully created\n          _this6._emitSuccess(res);\n          _this6._source.close();\n          return;\n        }\n        _this6._saveUploadInUrlStorage().then(function () {\n          if (_this6.options.uploadDataDuringCreation) {\n            _this6._handleUploadResponse(req, res);\n          } else {\n            _this6._offset = 0;\n            _this6._performUpload();\n          }\n        });\n      })[\"catch\"](function (err) {\n        _this6._emitHttpError(req, null, 'tus: failed to create upload', err);\n      });\n    }\n\n    /*\n     * Try to resume an existing upload. First a HEAD request will be sent\n     * to retrieve the offset. If the request fails a new upload will be\n     * created. In the case of a successful response the file will be uploaded.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_resumeUpload\",\n    value: function _resumeUpload() {\n      var _this7 = this;\n      var req = this._openRequest('HEAD', this.url);\n      var promise = this._sendRequest(req, null);\n      promise.then(function (res) {\n        var status = res.getStatus();\n        if (!inStatusCategory(status, 200)) {\n          // If the upload is locked (indicated by the 423 Locked status code), we\n          // emit an error instead of directly starting a new upload. This way the\n          // retry logic can catch the error and will retry the upload. An upload\n          // is usually locked for a short period of time and will be available\n          // afterwards.\n          if (status === 423) {\n            _this7._emitHttpError(req, res, 'tus: upload is currently locked; retry later');\n            return;\n          }\n          if (inStatusCategory(status, 400)) {\n            // Remove stored fingerprint and corresponding endpoint,\n            // on client errors since the file can not be found\n            _this7._removeFromUrlStorage();\n          }\n          if (!_this7.options.endpoint) {\n            // Don't attempt to create a new upload if no endpoint is provided.\n            _this7._emitHttpError(req, res, 'tus: unable to resume upload (new upload cannot be created without an endpoint)');\n            return;\n          }\n\n          // Try to create a new upload\n          _this7.url = null;\n          _this7._createUpload();\n          return;\n        }\n        var offset = Number.parseInt(res.getHeader('Upload-Offset'), 10);\n        if (Number.isNaN(offset)) {\n          _this7._emitHttpError(req, res, 'tus: invalid or missing offset value');\n          return;\n        }\n        var length = Number.parseInt(res.getHeader('Upload-Length'), 10);\n        if (Number.isNaN(length) && !_this7.options.uploadLengthDeferred && _this7.options.protocol === PROTOCOL_TUS_V1) {\n          _this7._emitHttpError(req, res, 'tus: invalid or missing length value');\n          return;\n        }\n        if (typeof _this7.options.onUploadUrlAvailable === 'function') {\n          _this7.options.onUploadUrlAvailable();\n        }\n        _this7._saveUploadInUrlStorage().then(function () {\n          // Upload has already been completed and we do not need to send additional\n          // data to the server\n          if (offset === length) {\n            _this7._emitProgress(length, length);\n            _this7._emitSuccess(res);\n            return;\n          }\n          _this7._offset = offset;\n          _this7._performUpload();\n        });\n      })[\"catch\"](function (err) {\n        _this7._emitHttpError(req, null, 'tus: failed to resume upload', err);\n      });\n    }\n\n    /**\n     * Start uploading the file using PATCH requests. The file will be divided\n     * into chunks as specified in the chunkSize option. During the upload\n     * the onProgress event handler may be invoked multiple times.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_performUpload\",\n    value: function _performUpload() {\n      var _this8 = this;\n      // If the upload has been aborted, we will not send the next PATCH request.\n      // This is important if the abort method was called during a callback, such\n      // as onChunkComplete or onProgress.\n      if (this._aborted) {\n        return;\n      }\n      var req;\n\n      // Some browser and servers may not support the PATCH method. For those\n      // cases, you can tell tus-js-client to use a POST request with the\n      // X-HTTP-Method-Override header for simulating a PATCH request.\n      if (this.options.overridePatchMethod) {\n        req = this._openRequest('POST', this.url);\n        req.setHeader('X-HTTP-Method-Override', 'PATCH');\n      } else {\n        req = this._openRequest('PATCH', this.url);\n      }\n      req.setHeader('Upload-Offset', \"\".concat(this._offset));\n      var promise = this._addChunkToRequest(req);\n      promise.then(function (res) {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          _this8._emitHttpError(req, res, 'tus: unexpected response while uploading chunk');\n          return;\n        }\n        _this8._handleUploadResponse(req, res);\n      })[\"catch\"](function (err) {\n        // Don't emit an error if the upload was aborted manually\n        if (_this8._aborted) {\n          return;\n        }\n        _this8._emitHttpError(req, null, \"tus: failed to upload chunk at offset \".concat(_this8._offset), err);\n      });\n    }\n\n    /**\n     * _addChunktoRequest reads a chunk from the source and sends it using the\n     * supplied request object. It will not handle the response.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_addChunkToRequest\",\n    value: function _addChunkToRequest(req) {\n      var _this9 = this;\n      var start = this._offset;\n      var end = this._offset + this.options.chunkSize;\n      req.setProgressHandler(function (bytesSent) {\n        _this9._emitProgress(start + bytesSent, _this9._size);\n      });\n      if (this.options.protocol === PROTOCOL_TUS_V1) {\n        req.setHeader('Content-Type', 'application/offset+octet-stream');\n      } else if (this.options.protocol === PROTOCOL_IETF_DRAFT_05) {\n        req.setHeader('Content-Type', 'application/partial-upload');\n      }\n\n      // The specified chunkSize may be Infinity or the calcluated end position\n      // may exceed the file's size. In both cases, we limit the end position to\n      // the input's total size for simpler calculations and correctness.\n      if ((end === Number.POSITIVE_INFINITY || end > this._size) && !this.options.uploadLengthDeferred) {\n        end = this._size;\n      }\n      return this._source.slice(start, end).then(function (_ref2) {\n        var value = _ref2.value,\n          done = _ref2.done;\n        var valueSize = value !== null && value !== void 0 && value.size ? value.size : 0;\n\n        // If the upload length is deferred, the upload size was not specified during\n        // upload creation. So, if the file reader is done reading, we know the total\n        // upload size and can tell the tus server.\n        if (_this9.options.uploadLengthDeferred && done) {\n          _this9._size = _this9._offset + valueSize;\n          req.setHeader('Upload-Length', \"\".concat(_this9._size));\n        }\n\n        // The specified uploadSize might not match the actual amount of data that a source\n        // provides. In these cases, we cannot successfully complete the upload, so we\n        // rather error out and let the user know. If not, tus-js-client will be stuck\n        // in a loop of repeating empty PATCH requests.\n        // See https://community.transloadit.com/t/how-to-abort-hanging-companion-uploads/16488/13\n        var newSize = _this9._offset + valueSize;\n        if (!_this9.options.uploadLengthDeferred && done && newSize !== _this9._size) {\n          return Promise.reject(new Error(\"upload was configured with a size of \".concat(_this9._size, \" bytes, but the source is done after \").concat(newSize, \" bytes\")));\n        }\n        if (value === null) {\n          return _this9._sendRequest(req);\n        }\n        if (_this9.options.protocol === PROTOCOL_IETF_DRAFT_03 || _this9.options.protocol === PROTOCOL_IETF_DRAFT_05) {\n          req.setHeader('Upload-Complete', done ? '?1' : '?0');\n        }\n        _this9._emitProgress(_this9._offset, _this9._size);\n        return _this9._sendRequest(req, value);\n      });\n    }\n\n    /**\n     * _handleUploadResponse is used by requests that haven been sent using _addChunkToRequest\n     * and already have received a response.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_handleUploadResponse\",\n    value: function _handleUploadResponse(req, res) {\n      var offset = Number.parseInt(res.getHeader('Upload-Offset'), 10);\n      if (Number.isNaN(offset)) {\n        this._emitHttpError(req, res, 'tus: invalid or missing offset value');\n        return;\n      }\n      this._emitProgress(offset, this._size);\n      this._emitChunkComplete(offset - this._offset, offset, this._size);\n      this._offset = offset;\n      if (offset === this._size) {\n        // Yay, finally done :)\n        this._emitSuccess(res);\n        this._source.close();\n        return;\n      }\n      this._performUpload();\n    }\n\n    /**\n     * Create a new HTTP request object with the given method and URL.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_openRequest\",\n    value: function _openRequest(method, url) {\n      var req = openRequest(method, url, this.options);\n      this._req = req;\n      return req;\n    }\n\n    /**\n     * Remove the entry in the URL storage, if it has been saved before.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_removeFromUrlStorage\",\n    value: function _removeFromUrlStorage() {\n      var _this10 = this;\n      if (!this._urlStorageKey) return;\n      this._urlStorage.removeUpload(this._urlStorageKey)[\"catch\"](function (err) {\n        _this10._emitError(err);\n      });\n      this._urlStorageKey = null;\n    }\n\n    /**\n     * Add the upload URL to the URL storage, if possible.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_saveUploadInUrlStorage\",\n    value: function _saveUploadInUrlStorage() {\n      var _this11 = this;\n      // We do not store the upload URL\n      // - if it was disabled in the option, or\n      // - if no fingerprint was calculated for the input (i.e. a stream), or\n      // - if the URL is already stored (i.e. key is set alread).\n      if (!this.options.storeFingerprintForResuming || !this._fingerprint || this._urlStorageKey !== null) {\n        return Promise.resolve();\n      }\n      var storedUpload = {\n        size: this._size,\n        metadata: this.options.metadata,\n        creationTime: new Date().toString()\n      };\n      if (this._parallelUploads) {\n        // Save multiple URLs if the parallelUploads option is used ...\n        storedUpload.parallelUploadUrls = this._parallelUploadUrls;\n      } else {\n        // ... otherwise we just save the one available URL.\n        storedUpload.uploadUrl = this.url;\n      }\n      return this._urlStorage.addUpload(this._fingerprint, storedUpload).then(function (urlStorageKey) {\n        _this11._urlStorageKey = urlStorageKey;\n      });\n    }\n\n    /**\n     * Send a request with the provided body.\n     *\n     * @api private\n     */\n  }, {\n    key: \"_sendRequest\",\n    value: function _sendRequest(req) {\n      var body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      return sendRequest(req, body, this.options);\n    }\n  }], [{\n    key: \"terminate\",\n    value: function terminate(url) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var req = openRequest('DELETE', url, options);\n      return sendRequest(req, null, options).then(function (res) {\n        // A 204 response indicates a successfull request\n        if (res.getStatus() === 204) {\n          return;\n        }\n        throw new DetailedError('tus: unexpected response while terminating upload', null, req, res);\n      })[\"catch\"](function (err) {\n        if (!(err instanceof DetailedError)) {\n          err = new DetailedError('tus: failed to terminate upload', err, req, null);\n        }\n        if (!shouldRetry(err, 0, options)) {\n          throw err;\n        }\n\n        // Instead of keeping track of the retry attempts, we remove the first element from the delays\n        // array. If the array is empty, all retry attempts are used up and we will bubble up the error.\n        // We recursively call the terminate function will removing elements from the retryDelays array.\n        var delay = options.retryDelays[0];\n        var remainingDelays = options.retryDelays.slice(1);\n        var newOptions = _objectSpread(_objectSpread({}, options), {}, {\n          retryDelays: remainingDelays\n        });\n        return new Promise(function (resolve) {\n          return setTimeout(resolve, delay);\n        }).then(function () {\n          return BaseUpload.terminate(url, newOptions);\n        });\n      });\n    }\n  }]);\n}();\nfunction encodeMetadata(metadata) {\n  return Object.entries(metadata).map(function (_ref3) {\n    var _ref4 = _slicedToArray(_ref3, 2),\n      key = _ref4[0],\n      value = _ref4[1];\n    return \"\".concat(key, \" \").concat(Base64.encode(String(value)));\n  }).join(',');\n}\n\n/**\n * Checks whether a given status is in the range of the expected category.\n * For example, only a status between 200 and 299 will satisfy the category 200.\n *\n * @api private\n */\nfunction inStatusCategory(status, category) {\n  return status >= category && status < category + 100;\n}\n\n/**\n * Create a new HTTP request with the specified method and URL.\n * The necessary headers that are included in every request\n * will be added, including the request ID.\n *\n * @api private\n */\nfunction openRequest(method, url, options) {\n  var req = options.httpStack.createRequest(method, url);\n  if (options.protocol === PROTOCOL_IETF_DRAFT_03) {\n    req.setHeader('Upload-Draft-Interop-Version', '5');\n  } else if (options.protocol === PROTOCOL_IETF_DRAFT_05) {\n    req.setHeader('Upload-Draft-Interop-Version', '6');\n  } else {\n    req.setHeader('Tus-Resumable', '1.0.0');\n  }\n  var headers = options.headers || {};\n  for (var _i2 = 0, _Object$entries = Object.entries(headers); _i2 < _Object$entries.length; _i2++) {\n    var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),\n      name = _Object$entries$_i[0],\n      value = _Object$entries$_i[1];\n    req.setHeader(name, value);\n  }\n  if (options.addRequestId) {\n    var requestId = uuid();\n    req.setHeader('X-Request-ID', requestId);\n  }\n  return req;\n}\n\n/**\n * Send a request with the provided body while invoking the onBeforeRequest\n * and onAfterResponse callbacks.\n *\n * @api private\n */\nfunction sendRequest(_x, _x2, _x3) {\n  return _sendRequest2.apply(this, arguments);\n}\n/**\n * Checks whether the browser running this code has internet access.\n * This function will always return true in the node.js environment\n *\n * @api private\n */\nfunction _sendRequest2() {\n  _sendRequest2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(req, body, options) {\n    var res;\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          if (!(typeof options.onBeforeRequest === 'function')) {\n            _context.next = 3;\n            break;\n          }\n          _context.next = 3;\n          return options.onBeforeRequest(req);\n        case 3:\n          _context.next = 5;\n          return req.send(body);\n        case 5:\n          res = _context.sent;\n          if (!(typeof options.onAfterResponse === 'function')) {\n            _context.next = 9;\n            break;\n          }\n          _context.next = 9;\n          return options.onAfterResponse(req, res);\n        case 9:\n          return _context.abrupt(\"return\", res);\n        case 10:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return _sendRequest2.apply(this, arguments);\n}\nfunction isOnline() {\n  var online = true;\n  // Note: We don't reference `window` here because the navigator object also exists\n  // in a Web Worker's context.\n  if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n    online = false;\n  }\n  return online;\n}\n\n/**\n * Checks whether or not it is ok to retry a request.\n * @param {Error|DetailedError} err the error returned from the last request\n * @param {number} retryAttempt the number of times the request has already been retried\n * @param {object} options tus Upload options\n *\n * @api private\n */\nfunction shouldRetry(err, retryAttempt, options) {\n  // We only attempt a retry if\n  // - retryDelays option is set\n  // - we didn't exceed the maxium number of retries, yet, and\n  // - this error was caused by a request or it's response and\n  // - the error is server error (i.e. not a status 4xx except a 409 or 423) or\n  // a onShouldRetry is specified and returns true\n  // - the browser does not indicate that we are offline\n  if (options.retryDelays == null || retryAttempt >= options.retryDelays.length || err.originalRequest == null) {\n    return false;\n  }\n  if (options && typeof options.onShouldRetry === 'function') {\n    return options.onShouldRetry(err, retryAttempt, options);\n  }\n  return defaultOnShouldRetry(err);\n}\n\n/**\n * determines if the request should be retried. Will only retry if not a status 4xx except a 409 or 423\n * @param {DetailedError} err\n * @returns {boolean}\n */\nfunction defaultOnShouldRetry(err) {\n  var status = err.originalResponse ? err.originalResponse.getStatus() : 0;\n  return (!inStatusCategory(status, 400) || status === 409 || status === 423) && isOnline();\n}\n\n/**\n * Resolve a relative link given the origin as source. For example,\n * if a HTTP request to http://example.com/files/ returns a Location\n * header with the value /upload/abc, the resolved URL will be:\n * http://example.com/upload/abc\n */\nfunction resolveUrl(origin, link) {\n  return new URL(link, origin).toString();\n}\n\n/**\n * Calculate the start and end positions for the parts if an upload\n * is split into multiple parallel requests.\n *\n * @param {number} totalSize The byte size of the upload, which will be split.\n * @param {number} partCount The number in how many parts the upload will be split.\n * @return {object[]}\n * @api private\n */\nfunction splitSizeIntoParts(totalSize, partCount) {\n  var partSize = Math.floor(totalSize / partCount);\n  var parts = [];\n  for (var i = 0; i < partCount; i++) {\n    parts.push({\n      start: partSize * i,\n      end: partSize * (i + 1)\n    });\n  }\n  parts[partCount - 1].end = totalSize;\n  return parts;\n}\nBaseUpload.defaultOptions = defaultOptions;\nexport default BaseUpload;", "/**\n * Generate a UUID v4 based on random numbers. We intentioanlly use the less\n * secure Math.random function here since the more secure crypto.getRandomNumbers\n * is not available on all platforms.\n * This is not a problem for us since we use the UUID only for generating a\n * request ID, so we can correlate server logs to client errors.\n *\n * This function is taken from following site:\n * https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n *\n * @return {string} The generate UUID\n */\nexport default function uuid() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    var r = Math.random() * 16 | 0;\n    var v = c === 'x' ? r : r & 0x3 | 0x8;\n    return v.toString(16);\n  });\n}", "var isReactNative = function isReactNative() {\n  return typeof navigator !== 'undefined' && typeof navigator.product === 'string' && navigator.product.toLowerCase() === 'reactnative';\n};\nexport default isReactNative;", "/**\n * uriToBlob resolves a URI to a Blob object. This is used for\n * React Native to retrieve a file (identified by a file://\n * URI) as a blob.\n */\nexport default function uriToBlob(uri) {\n  return new Promise(function (resolve, reject) {\n    var xhr = new XMLHttpRequest();\n    xhr.responseType = 'blob';\n    xhr.onload = function () {\n      var blob = xhr.response;\n      resolve(blob);\n    };\n    xhr.onerror = function (err) {\n      reject(err);\n    };\n    xhr.open('GET', uri);\n    xhr.send();\n  });\n}", "var isCordova = function isCordova() {\n  return typeof window !== 'undefined' && (typeof window.PhoneGap !== 'undefined' || typeof window.Cordova !== 'undefined' || typeof window.cordova !== 'undefined');\n};\nexport default isCordova;", "/**\n * readAsByteArray converts a File object to a Uint8Array.\n * This function is only used on the Apache Cordova platform.\n * See https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#read-a-file\n */\nexport default function readAsByteArray(chunk) {\n  return new Promise(function (resolve, reject) {\n    var reader = new FileReader();\n    reader.onload = function () {\n      var value = new Uint8Array(reader.result);\n      resolve({\n        value: value\n      });\n    };\n    reader.onerror = function (err) {\n      reject(err);\n    };\n    reader.readAsArrayBuffer(chunk);\n  });\n}", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nimport isCordova from './isCordova.js';\nimport readAsByteArray from './readAsByteArray.js';\nvar FileSource = /*#__PURE__*/function () {\n  // Make this.size a method\n  function FileSource(file) {\n    _classCallCheck(this, FileSource);\n    this._file = file;\n    this.size = file.size;\n  }\n  return _createClass(FileSource, [{\n    key: \"slice\",\n    value: function slice(start, end) {\n      // In Apache Cordova applications, a File must be resolved using\n      // FileReader instances, see\n      // https://cordova.apache.org/docs/en/8.x/reference/cordova-plugin-file/index.html#read-a-file\n      if (isCordova()) {\n        return readAsByteArray(this._file.slice(start, end));\n      }\n      var value = this._file.slice(start, end);\n      var done = end >= this.size;\n      return Promise.resolve({\n        value: value,\n        done: done\n      });\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      // Nothing to do here since we don't need to release any resources.\n    }\n  }]);\n}();\nexport { FileSource as default };", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction len(blobOrArray) {\n  if (blobOrArray === undefined) return 0;\n  if (blobOrArray.size !== undefined) return blobOrArray.size;\n  return blobOrArray.length;\n}\n\n/*\n  Typed arrays and blobs don't have a concat method.\n  This function helps StreamSource accumulate data to reach chunkSize.\n*/\nfunction concat(a, b) {\n  if (a.concat) {\n    // Is `a` an Array?\n    return a.concat(b);\n  }\n  if (a instanceof Blob) {\n    return new Blob([a, b], {\n      type: a.type\n    });\n  }\n  if (a.set) {\n    // Is `a` a typed array?\n    var c = new a.constructor(a.length + b.length);\n    c.set(a);\n    c.set(b, a.length);\n    return c;\n  }\n  throw new Error('Unknown data type');\n}\nvar StreamSource = /*#__PURE__*/function () {\n  function StreamSource(reader) {\n    _classCallCheck(this, StreamSource);\n    this._buffer = undefined;\n    this._bufferOffset = 0;\n    this._reader = reader;\n    this._done = false;\n  }\n  return _createClass(StreamSource, [{\n    key: \"slice\",\n    value: function slice(start, end) {\n      if (start < this._bufferOffset) {\n        return Promise.reject(new Error(\"Requested data is before the reader's current offset\"));\n      }\n      return this._readUntilEnoughDataOrDone(start, end);\n    }\n  }, {\n    key: \"_readUntilEnoughDataOrDone\",\n    value: function _readUntilEnoughDataOrDone(start, end) {\n      var _this = this;\n      var hasEnoughData = end <= this._bufferOffset + len(this._buffer);\n      if (this._done || hasEnoughData) {\n        var value = this._getDataFromBuffer(start, end);\n        var done = value == null ? this._done : false;\n        return Promise.resolve({\n          value: value,\n          done: done\n        });\n      }\n      return this._reader.read().then(function (_ref) {\n        var value = _ref.value,\n          done = _ref.done;\n        if (done) {\n          _this._done = true;\n        } else if (_this._buffer === undefined) {\n          _this._buffer = value;\n        } else {\n          _this._buffer = concat(_this._buffer, value);\n        }\n        return _this._readUntilEnoughDataOrDone(start, end);\n      });\n    }\n  }, {\n    key: \"_getDataFromBuffer\",\n    value: function _getDataFromBuffer(start, end) {\n      // Remove data from buffer before `start`.\n      // Data might be reread from the buffer if an upload fails, so we can only\n      // safely delete data when it comes *before* what is currently being read.\n      if (start > this._bufferOffset) {\n        this._buffer = this._buffer.slice(start - this._bufferOffset);\n        this._bufferOffset = start;\n      }\n      // If the buffer is empty after removing old data, all data has been read.\n      var hasAllDataBeenRead = len(this._buffer) === 0;\n      if (this._done && hasAllDataBeenRead) {\n        return null;\n      }\n      // We already removed data before `start`, so we just return the first\n      // chunk from the buffer.\n      return this._buffer.slice(0, end - start);\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      if (this._reader.cancel) {\n        this._reader.cancel();\n      }\n    }\n  }]);\n}();\nexport { StreamSource as default };", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err); } _next(undefined); }); }; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nimport isReactNative from './isReactNative.js';\nimport uriToBlob from './uriToBlob.js';\nimport FileSource from './sources/FileSource.js';\nimport StreamSource from './sources/StreamSource.js';\nvar FileReader = /*#__PURE__*/function () {\n  function FileReader() {\n    _classCallCheck(this, FileReader);\n  }\n  return _createClass(FileReader, [{\n    key: \"openFile\",\n    value: function () {\n      var _openFile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(input, chunkSize) {\n        var blob;\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              if (!(isReactNative() && input && typeof input.uri !== 'undefined')) {\n                _context.next = 11;\n                break;\n              }\n              _context.prev = 1;\n              _context.next = 4;\n              return uriToBlob(input.uri);\n            case 4:\n              blob = _context.sent;\n              return _context.abrupt(\"return\", new FileSource(blob));\n            case 8:\n              _context.prev = 8;\n              _context.t0 = _context[\"catch\"](1);\n              throw new Error(\"tus: cannot fetch `file.uri` as Blob, make sure the uri is correct and accessible. \".concat(_context.t0));\n            case 11:\n              if (!(typeof input.slice === 'function' && typeof input.size !== 'undefined')) {\n                _context.next = 13;\n                break;\n              }\n              return _context.abrupt(\"return\", Promise.resolve(new FileSource(input)));\n            case 13:\n              if (!(typeof input.read === 'function')) {\n                _context.next = 18;\n                break;\n              }\n              chunkSize = Number(chunkSize);\n              if (Number.isFinite(chunkSize)) {\n                _context.next = 17;\n                break;\n              }\n              return _context.abrupt(\"return\", Promise.reject(new Error('cannot create source for stream without a finite value for the `chunkSize` option')));\n            case 17:\n              return _context.abrupt(\"return\", Promise.resolve(new StreamSource(input, chunkSize)));\n            case 18:\n              return _context.abrupt(\"return\", Promise.reject(new Error('source object may only be an instance of File, Blob, or Reader in this environment')));\n            case 19:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee, null, [[1, 8]]);\n      }));\n      function openFile(_x, _x2) {\n        return _openFile.apply(this, arguments);\n      }\n      return openFile;\n    }()\n  }]);\n}();\nexport { FileReader as default };", "import isReactNative from './isReactNative.js';\n\n// TODO: Differenciate between input types\n\n/**\n * Generate a fingerprint for a file which will be used the store the endpoint\n *\n * @param {File} file\n * @param {Object} options\n * @param {Function} callback\n */\nexport default function fingerprint(file, options) {\n  if (isReactNative()) {\n    return Promise.resolve(reactNativeFingerprint(file, options));\n  }\n  return Promise.resolve(['tus-br', file.name, file.type, file.size, file.lastModified, options.endpoint].join('-'));\n}\nfunction reactNativeFingerprint(file, options) {\n  var exifHash = file.exif ? hashCode(JSON.stringify(file.exif)) : 'noexif';\n  return ['tus-rn', file.name || 'noname', file.size || 'nosize', exifHash, options.endpoint].join('/');\n}\nfunction hashCode(str) {\n  // from https://stackoverflow.com/a/8831937/151666\n  var hash = 0;\n  if (str.length === 0) {\n    return hash;\n  }\n  for (var i = 0; i < str.length; i++) {\n    var _char = str.charCodeAt(i);\n    hash = (hash << 5) - hash + _char;\n    hash &= hash; // Convert to 32bit integer\n  }\n  return hash;\n}", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar XHRHttpStack = /*#__PURE__*/function () {\n  function XHRHttpStack() {\n    _classCallCheck(this, XHRHttpStack);\n  }\n  return _createClass(XHRHttpStack, [{\n    key: \"createRequest\",\n    value: function createRequest(method, url) {\n      return new Request(method, url);\n    }\n  }, {\n    key: \"getName\",\n    value: function getName() {\n      return 'XHRHttpStack';\n    }\n  }]);\n}();\nexport { XHRHttpStack as default };\nvar Request = /*#__PURE__*/function () {\n  function Request(method, url) {\n    _classCallCheck(this, Request);\n    this._xhr = new XMLHttpRequest();\n    this._xhr.open(method, url, true);\n    this._method = method;\n    this._url = url;\n    this._headers = {};\n  }\n  return _createClass(Request, [{\n    key: \"getMethod\",\n    value: function getMethod() {\n      return this._method;\n    }\n  }, {\n    key: \"getURL\",\n    value: function getURL() {\n      return this._url;\n    }\n  }, {\n    key: \"setHeader\",\n    value: function setHeader(header, value) {\n      this._xhr.setRequestHeader(header, value);\n      this._headers[header] = value;\n    }\n  }, {\n    key: \"getHeader\",\n    value: function getHeader(header) {\n      return this._headers[header];\n    }\n  }, {\n    key: \"setProgressHandler\",\n    value: function setProgressHandler(progressHandler) {\n      // Test support for progress events before attaching an event listener\n      if (!('upload' in this._xhr)) {\n        return;\n      }\n      this._xhr.upload.onprogress = function (e) {\n        if (!e.lengthComputable) {\n          return;\n        }\n        progressHandler(e.loaded);\n      };\n    }\n  }, {\n    key: \"send\",\n    value: function send() {\n      var _this = this;\n      var body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n      return new Promise(function (resolve, reject) {\n        _this._xhr.onload = function () {\n          resolve(new Response(_this._xhr));\n        };\n        _this._xhr.onerror = function (err) {\n          reject(err);\n        };\n        _this._xhr.send(body);\n      });\n    }\n  }, {\n    key: \"abort\",\n    value: function abort() {\n      this._xhr.abort();\n      return Promise.resolve();\n    }\n  }, {\n    key: \"getUnderlyingObject\",\n    value: function getUnderlyingObject() {\n      return this._xhr;\n    }\n  }]);\n}();\nvar Response = /*#__PURE__*/function () {\n  function Response(xhr) {\n    _classCallCheck(this, Response);\n    this._xhr = xhr;\n  }\n  return _createClass(Response, [{\n    key: \"getStatus\",\n    value: function getStatus() {\n      return this._xhr.status;\n    }\n  }, {\n    key: \"getHeader\",\n    value: function getHeader(header) {\n      return this._xhr.getResponseHeader(header);\n    }\n  }, {\n    key: \"getBody\",\n    value: function getBody() {\n      return this._xhr.responseText;\n    }\n  }, {\n    key: \"getUnderlyingObject\",\n    value: function getUnderlyingObject() {\n      return this._xhr;\n    }\n  }]);\n}();", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar hasStorage = false;\ntry {\n  // Note: localStorage does not exist in the Web Worker's context, so we must use window here.\n  hasStorage = 'localStorage' in window;\n\n  // Attempt to store and read entries from the local storage to detect Private\n  // Mode on Safari on iOS (see #49)\n  // If the key was not used before, we remove it from local storage again to\n  // not cause confusion where the entry came from.\n  var key = 'tusSupport';\n  var originalValue = localStorage.getItem(key);\n  localStorage.setItem(key, originalValue);\n  if (originalValue === null) localStorage.removeItem(key);\n} catch (e) {\n  // If we try to access localStorage inside a sandboxed iframe, a SecurityError\n  // is thrown. When in private mode on iOS Safari, a QuotaExceededError is\n  // thrown (see #49)\n  if (e.code === e.SECURITY_ERR || e.code === e.QUOTA_EXCEEDED_ERR) {\n    hasStorage = false;\n  } else {\n    throw e;\n  }\n}\nexport var canStoreURLs = hasStorage;\nexport var WebStorageUrlStorage = /*#__PURE__*/function () {\n  function WebStorageUrlStorage() {\n    _classCallCheck(this, WebStorageUrlStorage);\n  }\n  return _createClass(WebStorageUrlStorage, [{\n    key: \"findAllUploads\",\n    value: function findAllUploads() {\n      var results = this._findEntries('tus::');\n      return Promise.resolve(results);\n    }\n  }, {\n    key: \"findUploadsByFingerprint\",\n    value: function findUploadsByFingerprint(fingerprint) {\n      var results = this._findEntries(\"tus::\".concat(fingerprint, \"::\"));\n      return Promise.resolve(results);\n    }\n  }, {\n    key: \"removeUpload\",\n    value: function removeUpload(urlStorageKey) {\n      localStorage.removeItem(urlStorageKey);\n      return Promise.resolve();\n    }\n  }, {\n    key: \"addUpload\",\n    value: function addUpload(fingerprint, upload) {\n      var id = Math.round(Math.random() * 1e12);\n      var key = \"tus::\".concat(fingerprint, \"::\").concat(id);\n      localStorage.setItem(key, JSON.stringify(upload));\n      return Promise.resolve(key);\n    }\n  }, {\n    key: \"_findEntries\",\n    value: function _findEntries(prefix) {\n      var results = [];\n      for (var i = 0; i < localStorage.length; i++) {\n        var _key = localStorage.key(i);\n        if (_key.indexOf(prefix) !== 0) continue;\n        try {\n          var upload = JSON.parse(localStorage.getItem(_key));\n          upload.urlStorageKey = _key;\n          results.push(upload);\n        } catch (_e) {\n          // The JSON parse error is intentionally ignored here, so a malformed\n          // entry in the storage cannot prevent an upload.\n        }\n      }\n      return results;\n    }\n  }]);\n}();", "function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nimport DetailedError from '../error.js';\nimport { enableDebugLog } from '../logger.js';\nimport NoopUrlStorage from '../noopUrlStorage.js';\nimport BaseUpload from '../upload.js';\nimport FileReader from './fileReader.js';\nimport fingerprint from './fileSignature.js';\nimport DefaultHttpStack from './httpStack.js';\nimport { WebStorageUrlStorage, canStoreURLs } from './urlStorage.js';\nvar defaultOptions = _objectSpread(_objectSpread({}, BaseUpload.defaultOptions), {}, {\n  httpStack: new DefaultHttpStack(),\n  fileReader: new FileReader(),\n  urlStorage: canStoreURLs ? new WebStorageUrlStorage() : new NoopUrlStorage(),\n  fingerprint: fingerprint\n});\nvar Upload = /*#__PURE__*/function (_BaseUpload) {\n  function Upload() {\n    var file = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    _classCallCheck(this, Upload);\n    options = _objectSpread(_objectSpread({}, defaultOptions), options);\n    return _callSuper(this, Upload, [file, options]);\n  }\n  _inherits(Upload, _BaseUpload);\n  return _createClass(Upload, null, [{\n    key: \"terminate\",\n    value: function terminate(url) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      options = _objectSpread(_objectSpread({}, defaultOptions), options);\n      return BaseUpload.terminate(url, options);\n    }\n  }]);\n}(BaseUpload); // Note: We don't reference `window` here because these classes also exist in a Web Worker's context.\nvar isSupported = typeof XMLHttpRequest === 'function' && typeof Blob === 'function' && typeof Blob.prototype.slice === 'function';\nexport { Upload, canStoreURLs, defaultOptions, isSupported, enableDebugLog, DefaultHttpStack, DetailedError };", "export interface Fit {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n// Scale a source to fit inside a destination without stretching, centred\n// with bars on the constrained axis (FR-8/FM-7: a resized shared window is\n// letterboxed, never distorted).\nexport function letterbox(\n  sourceWidth: number,\n  sourceHeight: number,\n  destinationWidth: number,\n  destinationHeight: number,\n): Fit {\n  const scale = Math.min(\n    destinationWidth / sourceWidth,\n    destinationHeight / sourceHeight,\n  );\n  const width = sourceWidth * scale;\n  const height = sourceHeight * scale;\n  return {\n    x: (destinationWidth - width) / 2,\n    y: (destinationHeight - height) / 2,\n    width,\n    height,\n  };\n}\n", "import { ChunkStore, SessionRecord } from \"./chunkstore\";\n\nexport const RECOVERABLE_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport const SWEEP_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n// Sessions worth offering to recover (FR-15): anything from the last 24\n// hours that never reached confirmed-ready. That includes `processing` \u2014\n// chunks are only deleted on webhook-confirmed ready (FR-16), so a session\n// interrupted while processing would otherwise be orphaned until the sweep.\nexport function findRecoverable(\n  sessions: SessionRecord[],\n  now: number,\n): SessionRecord[] {\n  return sessions.filter(\n    (session) =>\n      session.status !== \"ready\" &&\n      now - session.startedAt < RECOVERABLE_MAX_AGE_MS,\n  );\n}\n\n// Daily sweep (FR-16): drop anything older than 7 days regardless of state.\nexport async function sweep(store: ChunkStore, now: number): Promise<number> {\n  const sessions = await store.listSessions();\n  const stale = sessions.filter(\n    (session) => now - session.startedAt > SWEEP_AGE_MS,\n  );\n  for (const session of stale) {\n    await store.deleteSession(session.sessionId);\n  }\n  return stale.length;\n}\n", "export type RecorderState =\n  | \"idle\"\n  | \"setup\"\n  | \"countdown\"\n  | \"recording\"\n  | \"paused\"\n  | \"stopping\"\n  | \"uploading\"\n  | \"processing\"\n  | \"ready\"\n  | \"error\";\n\nexport const MAX_DURATION_MS = 1800 * 1000;\n\nexport const WARNING_AT_MS = 1680 * 1000; // 28:00\n\nconst TRANSITIONS: Record<RecorderState, readonly RecorderState[]> = {\n  // idle -> uploading is the recovery path (FR-15): an interrupted session\n  // resumes its upload without re-entering capture.\n  idle: [\"setup\", \"uploading\"],\n  setup: [\"countdown\", \"idle\", \"error\"],\n  countdown: [\"recording\", \"setup\", \"error\"],\n  recording: [\"paused\", \"stopping\", \"error\"],\n  paused: [\"recording\", \"stopping\", \"error\"],\n  stopping: [\"uploading\", \"error\"],\n  uploading: [\"processing\", \"error\"],\n  processing: [\"ready\", \"error\"],\n  ready: [\"idle\"],\n  error: [\"idle\"],\n};\n\n// The recorder's state machine (FR-2), including the 30-minute clock: a\n// warning fires at 28:00 and a graceful hard stop at 30:00 (FR-5/FM-10).\n// Time accumulates only while in `recording`, so pauses extend wall-clock\n// but never recorded duration.\nexport class RecorderStateMachine {\n  state: RecorderState = \"idle\";\n\n  onWarning: (() => void) | null = null;\n  onHardStop: (() => void) | null = null;\n\n  private accumulatedMs = 0;\n  private segmentStartedAt: number | null = null;\n  private warningTimer: ReturnType<typeof setTimeout> | null = null;\n  private hardStopTimer: ReturnType<typeof setTimeout> | null = null;\n\n  transition(to: RecorderState): void {\n    const legal = TRANSITIONS[this.state];\n    if (!legal.includes(to)) {\n      throw new Error(`Illegal transition: ${this.state} -> ${to}`);\n    }\n\n    if (this.state === \"recording\") {\n      this.accumulatedMs += Date.now() - (this.segmentStartedAt ?? Date.now());\n      this.segmentStartedAt = null;\n      this.clearTimers();\n    }\n    if (to === \"recording\") {\n      this.segmentStartedAt = Date.now();\n      this.scheduleTimers();\n    }\n    if (to === \"idle\") {\n      this.accumulatedMs = 0;\n    }\n\n    this.state = to;\n  }\n\n  can(to: RecorderState): boolean {\n    return TRANSITIONS[this.state].includes(to);\n  }\n\n  elapsedMs(): number {\n    if (this.state === \"recording\" && this.segmentStartedAt !== null) {\n      return this.accumulatedMs + Date.now() - this.segmentStartedAt;\n    }\n    return this.accumulatedMs;\n  }\n\n  private scheduleTimers(): void {\n    const warningIn = WARNING_AT_MS - this.accumulatedMs;\n    if (warningIn > 0) {\n      this.warningTimer = setTimeout(() => {\n        this.onWarning?.();\n      }, warningIn);\n    }\n    this.hardStopTimer = setTimeout(() => {\n      this.onHardStop?.();\n    }, MAX_DURATION_MS - this.accumulatedMs);\n  }\n\n  private clearTimers(): void {\n    if (this.warningTimer !== null) {\n      clearTimeout(this.warningTimer);\n      this.warningTimer = null;\n    }\n    if (this.hardStopTimer !== null) {\n      clearTimeout(this.hardStopTimer);\n      this.hardStopTimer = null;\n    }\n  }\n}\n", "import { AlpineComponent } from \"alpinejs\";\nimport * as tus from \"tus-js-client\";\n\nimport { ChunkStore, SessionRecord } from \"./chunkstore\";\nimport { probeMimeType } from \"./codec\";\nimport { letterbox } from \"./letterbox\";\nimport { findRecoverable, sweep } from \"./recovery\";\nimport { RecorderState, RecorderStateMachine } from \"./statemachine\";\n\nconst VIDEO_BITS_PER_SECOND = 2_500_000;\nconst AUDIO_BITS_PER_SECOND = 128_000;\nconst TIMESLICE_MS = 1000;\nconst TUS_CHUNK_SIZE = 10_485_760; // 10 MiB \u2014 a multiple of Stream's 256 KiB\nconst RETRY_DELAYS = [0, 3000, 10000, 30000, 60000];\nconst REQUIRED_FREE_BYTES = 900 * 1024 * 1024;\nconst STATUS_POLL_MS = 5000;\nconst COUNTDOWN_SECONDS = 3;\n\n// The compositor draw loop runs off a Web Worker timer so background-tab\n// throttling can't stall frame production (FR-9).\nconst WORKER_SOURCE = \"setInterval(() => postMessage(0), 33);\";\n\ntype Corner = \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\";\n\ninterface DeviceOption {\n  deviceId: string;\n  label: string;\n}\n\ninterface StatusPayload {\n  status: string;\n  duration_seconds: number | null;\n}\n\nfunction getCookie(name: string): string {\n  for (const part of document.cookie.split(\";\")) {\n    const [key, ...rest] = part.trim().split(\"=\");\n    if (key === name) {\n      return decodeURIComponent(rest.join(\"=\"));\n    }\n  }\n  return \"\";\n}\n\nfunction formatClock(totalMs: number): string {\n  const totalSeconds = Math.floor(totalMs / 1000);\n  const minutes = Math.floor(totalSeconds / 60);\n  const seconds = totalSeconds % 60;\n  return `${minutes}:${seconds.toString().padStart(2, \"0\")}`;\n}\n\nfunction formatBytes(bytes: number): string {\n  if (bytes >= 1024 * 1024) {\n    return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n  }\n  return `${Math.ceil(bytes / 1024)} KB`;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  state: RecorderState;\n  error: string;\n  warning: string;\n  countdown: number;\n  elapsedMs: number;\n  cameraEnabled: boolean;\n  cameras: DeviceOption[];\n  mics: DeviceOption[];\n  cameraId: string;\n  micId: string;\n  micLevel: number;\n  corners: Corner[];\n  bubbleCorner: Corner;\n  spooledBytes: number;\n  chunkCount: number;\n  uploadPercent: number;\n  uploadedBytes: number;\n  totalBytes: number;\n  retrying: string;\n  recoverable: SessionRecord | null;\n  title: string;\n  saved: boolean;\n  buildpackLabel: string;\n\n  init(): void;\n  setup(): Promise<void>;\n  cancelSetup(): void;\n  begin(): Promise<void>;\n  pause(): void;\n  resume(): void;\n  stop(): void;\n  recover(): Promise<void>;\n  discardRecovery(): Promise<void>;\n  attach(): Promise<void>;\n  reset(): void;\n  bubbleDragStart(event: PointerEvent): void;\n  bubbleStyle(): string;\n  elapsedLabel(): string;\n  spoolLabel(): string;\n  uploadLabel(): string;\n  recoveryLabel(): string;\n\n  isCapturing(): boolean;\n  go(to: RecorderState): void;\n  fail(message: string): void;\n  previewScreen(): void;\n  applyDevices(): Promise<void>;\n  startMeter(): void;\n  startRecording(): Promise<void>;\n  startCompositor(screenTrack: MediaStreamTrack): MediaStreamTrack;\n  drawBubble(\n    context: CanvasRenderingContext2D,\n    canvas: HTMLCanvasElement,\n    cameraVideo: unknown,\n  ): void;\n  watchTracks(): void;\n  spoolChunk(blob: Blob): void;\n  acquireWakeLock(): Promise<void>;\n  finalise(): Promise<void>;\n  startUpload(blob: Blob): void;\n  tusEndpoint(): string;\n  uploadFinished(): Promise<void>;\n  pollStatus(): void;\n  statusUrl(recordingId: number): string;\n  checkStatus(): Promise<void>;\n  stopPolling(): void;\n  releaseCapture(): void;\n  teardownCapture(): void;\n}\n\nexport default (): AlpineComponent<State> => {\n  const machine = new RecorderStateMachine();\n\n  let store: ChunkStore | null = null;\n  let screenStream: MediaStream | null = null;\n  let cameraStream: MediaStream | null = null;\n  let micStream: MediaStream | null = null;\n  let audioContext: AudioContext | null = null;\n  let analyser: AnalyserNode | null = null;\n  let mediaRecorder: MediaRecorder | null = null;\n  let worker: Worker | null = null;\n  let canvasTrack: MediaStreamTrack | null = null;\n  let wakeLock: WakeLockSentinel | null = null;\n  let tusUpload: tus.Upload | null = null;\n\n  let session: SessionRecord | null = null;\n  let sequence = 0;\n  let spoolQueue: Promise<void> = Promise.resolve();\n  let spoolFailed = false;\n\n  let meterTimer: ReturnType<typeof setInterval> | null = null;\n  let elapsedTimer: ReturnType<typeof setInterval> | null = null;\n  let countdownTimer: ReturnType<typeof setInterval> | null = null;\n  let pollTimer: ReturnType<typeof setInterval> | null = null;\n\n  return {\n    state: \"idle\",\n    error: \"\",\n    warning: \"\",\n    countdown: COUNTDOWN_SECONDS,\n    elapsedMs: 0,\n    cameraEnabled: true,\n    cameras: [],\n    mics: [],\n    cameraId: \"\",\n    micId: \"\",\n    micLevel: 0,\n    corners: [\"bottom-left\", \"bottom-right\", \"top-left\", \"top-right\"],\n    bubbleCorner: \"bottom-left\",\n    spooledBytes: 0,\n    chunkCount: 0,\n    uploadPercent: 0,\n    uploadedBytes: 0,\n    totalBytes: 0,\n    retrying: \"\",\n    recoverable: null,\n    title: \"\",\n    saved: false,\n    buildpackLabel: \"\",\n\n    init() {\n      this.buildpackLabel = this.$root.dataset[\"buildpackTitle\"] ?? \"\";\n\n      void ChunkStore.open(indexedDB).then(async (opened) => {\n        store = opened;\n        await sweep(opened, Date.now());\n        const sessions = await opened.listSessions();\n        this.recoverable = findRecoverable(sessions, Date.now())[0] ?? null;\n      });\n\n      this.$watch(\"cameraEnabled\", () => {\n        void this.applyDevices();\n      });\n      this.$watch(\"cameraId\", () => {\n        void this.applyDevices();\n      });\n      this.$watch(\"micId\", () => {\n        void this.applyDevices();\n      });\n\n      window.addEventListener(\"beforeunload\", (event) => {\n        if (\n          this.state === \"recording\" ||\n          this.state === \"paused\" ||\n          this.state === \"stopping\" ||\n          this.state === \"uploading\"\n        ) {\n          event.preventDefault();\n        }\n      });\n\n      document.addEventListener(\"visibilitychange\", () => {\n        // Wake locks are auto-released when the page hides on some\n        // platforms; re-acquisition is best-effort (FR-12).\n        if (document.visibilityState === \"visible\" && this.isCapturing()) {\n          void this.acquireWakeLock();\n        }\n      });\n    },\n\n    isCapturing(): boolean {\n      return this.state === \"recording\" || this.state === \"paused\";\n    },\n\n    go(to: RecorderState) {\n      machine.transition(to);\n      this.state = machine.state;\n    },\n\n    fail(message: string) {\n      if (machine.can(\"error\")) {\n        this.go(\"error\");\n      }\n      this.error = message;\n      this.teardownCapture();\n    },\n\n    async setup() {\n      try {\n        screenStream = await navigator.mediaDevices.getDisplayMedia({\n          video: {\n            width: { max: 1920 },\n            height: { max: 1080 },\n            frameRate: { ideal: 30 },\n          },\n          audio: true,\n          selfBrowserSurface: \"exclude\",\n          surfaceSwitching: \"include\",\n        } as DisplayMediaStreamOptions);\n      } catch {\n        return; // The picker was dismissed; stay idle.\n      }\n\n      this.go(\"setup\");\n\n      const screenTrack = screenStream.getVideoTracks()[0];\n      if (screenTrack) {\n        screenTrack.onended = () => {\n          // Chrome's \"Stop sharing\" bar: a stop, not an error (FM-1).\n          if (this.isCapturing()) {\n            this.stop();\n          } else if (this.state === \"setup\" || this.state === \"countdown\") {\n            this.cancelSetup();\n          }\n        };\n      }\n      this.previewScreen();\n\n      try {\n        await this.applyDevices();\n      } catch {\n        this.warning = \"Camera or microphone unavailable \u2014 check permissions.\";\n      }\n\n      const devices = await navigator.mediaDevices.enumerateDevices();\n      this.cameras = devices\n        .filter((device) => device.kind === \"videoinput\")\n        .map((device) => ({ deviceId: device.deviceId, label: device.label }));\n      this.mics = devices\n        .filter((device) => device.kind === \"audioinput\")\n        .map((device) => ({ deviceId: device.deviceId, label: device.label }));\n    },\n\n    previewScreen() {\n      const preview = this.$refs[\"screenPreview\"];\n      if (preview instanceof HTMLVideoElement && screenStream) {\n        preview.srcObject = screenStream;\n      }\n    },\n\n    async applyDevices() {\n      if (this.state !== \"setup\") {\n        return;\n      }\n\n      for (const track of micStream?.getTracks() ?? []) {\n        track.stop();\n      }\n      for (const track of cameraStream?.getTracks() ?? []) {\n        track.stop();\n      }\n      cameraStream = null;\n\n      const audio: MediaTrackConstraints = {\n        echoCancellation: true,\n        noiseSuppression: true,\n        autoGainControl: true,\n      };\n      if (this.micId) {\n        audio.deviceId = { exact: this.micId };\n      }\n      micStream = await navigator.mediaDevices.getUserMedia({ audio });\n\n      if (this.cameraEnabled) {\n        const video: MediaTrackConstraints = {\n          width: { max: 640 },\n          height: { max: 480 },\n        };\n        if (this.cameraId) {\n          video.deviceId = { exact: this.cameraId };\n        }\n        cameraStream = await navigator.mediaDevices.getUserMedia({ video });\n        const preview = this.$refs[\"cameraPreview\"];\n        if (preview instanceof HTMLVideoElement) {\n          preview.srcObject = cameraStream;\n        }\n      }\n\n      this.startMeter();\n    },\n\n    startMeter() {\n      if (!micStream) {\n        return;\n      }\n      audioContext ??= new AudioContext();\n      analyser = audioContext.createAnalyser();\n      analyser.fftSize = 256;\n      audioContext\n        .createMediaStreamSource(new MediaStream(micStream.getAudioTracks()))\n        .connect(analyser);\n\n      const samples = new Uint8Array(analyser.frequencyBinCount);\n      if (meterTimer !== null) {\n        clearInterval(meterTimer);\n      }\n      meterTimer = setInterval(() => {\n        if (!analyser) {\n          return;\n        }\n        analyser.getByteTimeDomainData(samples);\n        let sum = 0;\n        for (const sample of samples) {\n          const deviation = (sample - 128) / 128;\n          sum += deviation * deviation;\n        }\n        const rms = Math.sqrt(sum / samples.length);\n        this.micLevel = Math.min(100, Math.round(rms * 300));\n      }, 100);\n    },\n\n    cancelSetup() {\n      if (this.state === \"setup\" || this.state === \"countdown\") {\n        this.go(\"idle\");\n      }\n      this.teardownCapture();\n    },\n\n    async begin() {\n      // Pre-flight the disk spool: a 30-minute recording needs ~590 MB plus\n      // margin (FR-14).\n      if (navigator.storage?.estimate) {\n        const { quota = 0, usage = 0 } = await navigator.storage.estimate();\n        if (quota - usage < REQUIRED_FREE_BYTES) {\n          this.fail(\n            \"Not enough disk space to record safely \u2014 a 30-minute \" +\n              \"recording needs about 1 GB free. Clear browser storage \" +\n              \"and try again.\",\n          );\n          return;\n        }\n      }\n\n      this.go(\"countdown\");\n      this.countdown = COUNTDOWN_SECONDS;\n      countdownTimer = setInterval(() => {\n        this.countdown -= 1;\n        if (this.countdown <= 0 && countdownTimer !== null) {\n          clearInterval(countdownTimer);\n          countdownTimer = null;\n          void this.startRecording();\n        }\n      }, 1000);\n    },\n\n    async startRecording() {\n      if (!screenStream || !store) {\n        this.fail(\"Screen capture was interrupted. Start again.\");\n        return;\n      }\n\n      const screenTrack = screenStream.getVideoTracks()[0];\n      if (!screenTrack) {\n        this.fail(\"Screen capture was interrupted. Start again.\");\n        return;\n      }\n\n      let mimeType: string;\n      try {\n        mimeType = probeMimeType((type) => MediaRecorder.isTypeSupported(type));\n      } catch (probeError) {\n        this.fail(\n          probeError instanceof Error\n            ? probeError.message\n            : \"Recording unsupported\",\n        );\n        return;\n      }\n\n      audioContext ??= new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      if (micStream) {\n        audioContext\n          .createMediaStreamSource(new MediaStream(micStream.getAudioTracks()))\n          .connect(destination);\n      }\n      const displayAudio = screenStream.getAudioTracks();\n      if (displayAudio.length > 0) {\n        audioContext\n          .createMediaStreamSource(new MediaStream(displayAudio))\n          .connect(destination);\n      }\n\n      const videoTrack = this.cameraEnabled\n        ? this.startCompositor(screenTrack)\n        : screenTrack;\n      const stream = new MediaStream([\n        videoTrack,\n        ...destination.stream.getAudioTracks(),\n      ]);\n\n      session = {\n        sessionId: crypto.randomUUID(),\n        streamUid: \"\",\n        tusUrl: \"\",\n        recordingId: null,\n        status: \"recording\",\n        startedAt: Date.now(),\n        mimeType,\n        chunkCount: 0,\n      };\n      sequence = 0;\n      spoolFailed = false;\n      this.spooledBytes = 0;\n      this.chunkCount = 0;\n      await store.putSession(session);\n\n      this.watchTracks();\n\n      mediaRecorder = new MediaRecorder(stream, {\n        mimeType,\n        videoBitsPerSecond: VIDEO_BITS_PER_SECOND,\n        audioBitsPerSecond: AUDIO_BITS_PER_SECOND,\n      });\n      mediaRecorder.ondataavailable = (event: BlobEvent) => {\n        this.spoolChunk(event.data);\n      };\n      mediaRecorder.onstop = () => {\n        void this.finalise();\n      };\n\n      machine.onWarning = () => {\n        this.warning = \"Recording stops at 30:00 \u2014 about two minutes left.\";\n      };\n      machine.onHardStop = () => {\n        this.stop();\n      };\n\n      mediaRecorder.start(TIMESLICE_MS);\n      this.go(\"recording\");\n      void this.acquireWakeLock();\n\n      elapsedTimer = setInterval(() => {\n        this.elapsedMs = machine.elapsedMs();\n      }, 250);\n    },\n\n    startCompositor(screenTrack: MediaStreamTrack): MediaStreamTrack {\n      const canvas = this.$refs[\"compositor\"];\n      if (!(canvas instanceof HTMLCanvasElement)) {\n        throw new Error(\"Compositor canvas missing\");\n      }\n\n      // Fixed canvas size from the screen track's initial settings: a\n      // mid-recording window resize letterboxes instead of stretching\n      // (FR-8/FM-7).\n      const settings = screenTrack.getSettings();\n      canvas.width = settings.width ?? 1920;\n      canvas.height = settings.height ?? 1080;\n\n      const context = canvas.getContext(\"2d\");\n      if (!context) {\n        throw new Error(\"Canvas 2D context unavailable\");\n      }\n\n      // Dedicated off-DOM source videos: the setup previews go display:none\n      // once recording starts, and drawing from hidden elements freezes on\n      // their last painted frame.\n      const screenVideo = document.createElement(\"video\");\n      screenVideo.muted = true;\n      screenVideo.srcObject = screenStream;\n      void screenVideo.play();\n      const cameraVideo = document.createElement(\"video\");\n      cameraVideo.muted = true;\n      if (cameraStream) {\n        cameraVideo.srcObject = cameraStream;\n        void cameraVideo.play();\n      }\n\n      // Timed capture (30 fps), not captureStream(0): Chrome's MediaRecorder\n      // does not reliably encode requestFrame()-only streams \u2014 recordings\n      // came out frozen on the first frame. requestFrame() stays as a nudge\n      // for throttled background tabs, where the worker keeps drawing.\n      const captured = canvas.captureStream(30);\n      const track = captured.getVideoTracks()[0];\n      if (!track) {\n        throw new Error(\"Canvas capture unavailable\");\n      }\n      canvasTrack = track;\n\n      const draw = () => {\n        context.fillStyle = \"#111827\";\n        context.fillRect(0, 0, canvas.width, canvas.height);\n\n        if (screenVideo.videoWidth) {\n          const fit = letterbox(\n            screenVideo.videoWidth,\n            screenVideo.videoHeight,\n            canvas.width,\n            canvas.height,\n          );\n          context.drawImage(screenVideo, fit.x, fit.y, fit.width, fit.height);\n        }\n\n        this.drawBubble(context, canvas, cameraVideo);\n\n        if (canvasTrack && \"requestFrame\" in canvasTrack) {\n          (canvasTrack as CanvasCaptureMediaStreamTrack).requestFrame();\n        }\n      };\n\n      worker = new Worker(\n        URL.createObjectURL(\n          new Blob([WORKER_SOURCE], { type: \"text/javascript\" }),\n        ),\n      );\n      worker.onmessage = () => {\n        if (this.state === \"recording\") {\n          draw();\n        }\n      };\n\n      return track;\n    },\n\n    drawBubble(\n      context: CanvasRenderingContext2D,\n      canvas: HTMLCanvasElement,\n      cameraVideo: unknown,\n    ) {\n      if (!this.cameraEnabled) {\n        return;\n      }\n\n      const radius = canvas.height * 0.12;\n      const margin = radius * 0.5;\n      const x = this.bubbleCorner.endsWith(\"left\")\n        ? margin + radius\n        : canvas.width - margin - radius;\n      const y = this.bubbleCorner.startsWith(\"top\")\n        ? margin + radius\n        : canvas.height - margin - radius;\n\n      context.save();\n      context.beginPath();\n      context.arc(x, y, radius, 0, Math.PI * 2);\n      context.clip();\n\n      const cameraTrack = cameraStream?.getVideoTracks()[0];\n      const live =\n        cameraVideo instanceof HTMLVideoElement &&\n        cameraVideo.videoWidth > 0 &&\n        cameraTrack?.readyState === \"live\" &&\n        !cameraTrack.muted;\n\n      if (live) {\n        // Cover-fit the camera frame into the bubble.\n        const side = Math.min(cameraVideo.videoWidth, cameraVideo.videoHeight);\n        context.drawImage(\n          cameraVideo,\n          (cameraVideo.videoWidth - side) / 2,\n          (cameraVideo.videoHeight - side) / 2,\n          side,\n          side,\n          x - radius,\n          y - radius,\n          radius * 2,\n          radius * 2,\n        );\n      } else {\n        // A \"camera off\" placeholder, never a frozen or black frame (FM-6).\n        context.fillStyle = \"#374151\";\n        context.fillRect(x - radius, y - radius, radius * 2, radius * 2);\n        context.fillStyle = \"#9ca3af\";\n        context.beginPath();\n        context.arc(x, y - radius * 0.25, radius * 0.3, 0, Math.PI * 2);\n        context.fill();\n        context.beginPath();\n        context.arc(x, y + radius * 0.55, radius * 0.5, Math.PI, 0);\n        context.fill();\n      }\n      context.restore();\n\n      context.beginPath();\n      context.arc(x, y, radius - 2, 0, Math.PI * 2);\n      context.lineWidth = 4;\n      context.strokeStyle = \"#ffffff\";\n      context.stroke();\n    },\n\n    watchTracks() {\n      const cameraTrack = cameraStream?.getVideoTracks()[0];\n      const micTrack = micStream?.getAudioTracks()[0];\n      const warn = (message: string) => {\n        if (this.isCapturing()) {\n          this.warning = message;\n        }\n      };\n      if (cameraTrack) {\n        cameraTrack.onmute = () =>\n          warn(\"Camera signal lost \u2014 recording continues without it.\");\n        cameraTrack.onended = () =>\n          warn(\"Camera disconnected \u2014 recording continues without it.\");\n        cameraTrack.onunmute = () => {\n          this.warning = \"\";\n        };\n      }\n      if (micTrack) {\n        micTrack.onmute = () =>\n          warn(\"Microphone muted \u2014 check your input device.\");\n        micTrack.onended = () =>\n          warn(\"Microphone disconnected \u2014 recording continues without it.\");\n        micTrack.onunmute = () => {\n          this.warning = \"\";\n        };\n      }\n    },\n\n    spoolChunk(blob: Blob) {\n      if (!session || blob.size === 0 || spoolFailed) {\n        return;\n      }\n      const current = session;\n      const seq = sequence;\n      sequence += 1;\n      spoolQueue = spoolQueue\n        .then(async () => {\n          if (!store) {\n            return;\n          }\n          await store.putChunk(current.sessionId, seq, blob);\n          current.chunkCount = Math.max(current.chunkCount, seq + 1);\n          await store.putSession(current);\n          this.spooledBytes += blob.size;\n          this.chunkCount = current.chunkCount;\n        })\n        .catch(() => {\n          // Disk full mid-recording (FM-9): stop gracefully at the last\n          // flushed chunk; what's spooled stays uploadable.\n          if (!spoolFailed) {\n            spoolFailed = true;\n            this.warning =\n              \"Browser storage is full \u2014 stopping with what's saved so far.\";\n            if (this.isCapturing()) {\n              this.stop();\n            }\n          }\n        });\n    },\n\n    async acquireWakeLock() {\n      try {\n        wakeLock = await navigator.wakeLock.request(\"screen\");\n      } catch {\n        // Best-effort (FR-12): recording continues without the lock.\n      }\n    },\n\n    pause() {\n      if (this.state !== \"recording\" || !mediaRecorder) {\n        return;\n      }\n      mediaRecorder.pause();\n      this.go(\"paused\");\n    },\n\n    resume() {\n      if (this.state !== \"paused\" || !mediaRecorder) {\n        return;\n      }\n      mediaRecorder.resume();\n      this.go(\"recording\");\n    },\n\n    stop() {\n      if (!this.isCapturing() || !mediaRecorder) {\n        return;\n      }\n      this.go(\"stopping\");\n      this.warning = \"\";\n      mediaRecorder.stop(); // finalise() runs from onstop.\n    },\n\n    async finalise() {\n      this.releaseCapture();\n      if (!store || !session) {\n        this.fail(\"Recording was interrupted before anything was saved.\");\n        return;\n      }\n      await spoolQueue;\n      session.status = \"uploading\";\n      await store.putSession(session);\n      const blob = await store.assemble(session.sessionId, session.mimeType);\n      if (blob.size === 0) {\n        this.fail(\"Nothing was recorded.\");\n        return;\n      }\n      this.go(\"uploading\");\n      this.startUpload(blob);\n    },\n\n    startUpload(blob: Blob) {\n      if (!session || !store) {\n        return;\n      }\n      const current = session;\n      const chunkStore = store;\n\n      this.totalBytes = blob.size;\n      const endpoint = this.tusEndpoint();\n\n      const options: tus.UploadOptions = {\n        // The CSRF header must only go to our same-origin creation proxy:\n        // Cloudflare's upload CORS allow-list rejects preflights that ask\n        // for X-CSRFToken, which would block every PATCH.\n        onBeforeRequest: (request) => {\n          const url = request.getURL();\n          if (url.startsWith(\"/\") || url.startsWith(window.location.origin)) {\n            request.setHeader(\"X-CSRFToken\", getCookie(\"csrftoken\"));\n          }\n        },\n        chunkSize: TUS_CHUNK_SIZE,\n        retryDelays: RETRY_DELAYS,\n        storeFingerprintForResuming: true,\n        removeFingerprintOnSuccess: true,\n        metadata: { name: this.title },\n        onAfterResponse: (_request, response) => {\n          // The creation response carries the direct upload URL and our\n          // row id; persist both so a tab reload can resume (FR-18/FM-4).\n          const location = response.getHeader(\"Location\");\n          const recordingId = response.getHeader(\"Recording-Id\");\n          if (location) {\n            current.tusUrl = location;\n          }\n          if (recordingId) {\n            current.recordingId = Number(recordingId);\n          }\n          if (location || recordingId) {\n            void chunkStore.putSession(current);\n          }\n        },\n        onProgress: (uploaded, total) => {\n          this.retrying = \"\";\n          this.uploadedBytes = uploaded;\n          this.totalBytes = total;\n          this.uploadPercent = total ? Math.round((uploaded / total) * 100) : 0;\n        },\n        onShouldRetry: () => {\n          this.retrying = \"Connection interrupted \u2014 retrying automatically\u2026\";\n          return true;\n        },\n        onError: (uploadError) => {\n          // A dead or stale upload URL must not brick recovery: clear it so\n          // the next attempt goes back through creation for a fresh one.\n          current.tusUrl = \"\";\n          void chunkStore.putSession(current);\n          this.fail(\n            `Upload failed: ${uploadError.message}. Your recording is still ` +\n              \"saved locally \u2014 reload the page to resume.\",\n          );\n        },\n        onSuccess: () => {\n          void this.uploadFinished();\n        },\n      };\n\n      if (current.tusUrl) {\n        options.uploadUrl = current.tusUrl;\n      } else {\n        options.endpoint = endpoint;\n      }\n\n      tusUpload = new tus.Upload(blob, options);\n      tusUpload.start();\n    },\n\n    tusEndpoint(): string {\n      const endpoint = this.$root.dataset[\"tusEndpoint\"] ?? \"/recordings/tus/\";\n      const buildpack = this.$root.dataset[\"buildpack\"] ?? \"\";\n      return buildpack ? `${endpoint}?buildpack=${buildpack}` : endpoint;\n    },\n\n    async uploadFinished() {\n      if (!session || !store) {\n        return;\n      }\n      session.status = \"processing\";\n      await store.putSession(session);\n      this.go(\"processing\");\n      this.pollStatus();\n    },\n\n    pollStatus() {\n      pollTimer = setInterval(() => {\n        void this.checkStatus();\n      }, STATUS_POLL_MS);\n      void this.checkStatus();\n    },\n\n    statusUrl(recordingId: number): string {\n      const template =\n        this.$root.dataset[\"statusUrlTemplate\"] ?? \"/recordings/0/status/\";\n      return template.replace(\"/0/\", `/${recordingId}/`);\n    },\n\n    async checkStatus() {\n      if (!session?.recordingId || !store) {\n        return;\n      }\n      let payload: StatusPayload;\n      try {\n        const response = await fetch(this.statusUrl(session.recordingId), {\n          headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n        });\n        if (response.status === 404) {\n          // The recording row is gone (e.g. deleted server-side while the\n          // upload was in flight). Don't poll forever: keep the local\n          // chunks recoverable and surface it.\n          this.stopPolling();\n          session.status = \"uploading\";\n          session.tusUrl = \"\";\n          session.recordingId = null;\n          await store.putSession(session);\n          this.fail(\n            \"This recording no longer exists on the server. Your local \" +\n              \"copy is safe \u2014 reload the page to upload it again.\",\n          );\n          return;\n        }\n        if (!response.ok) {\n          return;\n        }\n        payload = (await response.json()) as StatusPayload;\n      } catch {\n        return; // Transient network problem; the next poll retries.\n      }\n\n      if (payload.status === \"ready\") {\n        this.stopPolling();\n        // Only now is the local spool safe to delete (FR-16).\n        if (store && session) {\n          await store.deleteSession(session.sessionId);\n        }\n        this.go(\"ready\");\n      } else if (payload.status === \"error\") {\n        this.stopPolling();\n        // Stream-side encoding failure (FM-8): chunks stay local so the\n        // upload can be retried from the recovery banner.\n        if (store && session) {\n          session.status = \"uploading\";\n          session.tusUrl = \"\";\n          await store.putSession(session);\n        }\n        this.fail(\n          \"Cloudflare could not process the video. Your recording is \" +\n            \"still saved locally \u2014 reload the page to retry the upload.\",\n        );\n      }\n    },\n\n    stopPolling() {\n      if (pollTimer !== null) {\n        clearInterval(pollTimer);\n        pollTimer = null;\n      }\n    },\n\n    async recover() {\n      if (!this.recoverable || !store) {\n        return;\n      }\n      // Copy out of Alpine's reactive proxy: IndexedDB structured-clone\n      // throws on Proxy objects, which would kill the recovery silently.\n      session = { ...this.recoverable };\n      this.recoverable = null;\n\n      // Only resume the stored upload URL if its recording still exists \u2014\n      // resuming into a deleted video's tus session swallows bytes and\n      // reports success. Otherwise fall back to a fresh creation.\n      if (session.recordingId !== null) {\n        try {\n          const response = await fetch(this.statusUrl(session.recordingId), {\n            headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n          });\n          if (!response.ok) {\n            session.tusUrl = \"\";\n            session.recordingId = null;\n          }\n        } catch {\n          session.tusUrl = \"\";\n          session.recordingId = null;\n        }\n      }\n      this.title = \"\";\n      session.status = \"uploading\";\n      await store.putSession(session);\n      const blob = await store.assemble(session.sessionId, session.mimeType);\n      if (blob.size === 0) {\n        await store.deleteSession(session.sessionId);\n        this.fail(\"The unfinished recording had no recoverable content.\");\n        return;\n      }\n      this.go(\"uploading\");\n      this.startUpload(blob);\n    },\n\n    async discardRecovery() {\n      if (!this.recoverable || !store) {\n        return;\n      }\n      await store.deleteSession(this.recoverable.sessionId);\n      this.recoverable = null;\n    },\n\n    async attach() {\n      if (!session?.recordingId) {\n        return;\n      }\n      const template =\n        this.$root.dataset[\"attachUrlTemplate\"] ?? \"/recordings/0/attach/\";\n      const url = template.replace(\"/0/\", `/${session.recordingId}/`);\n      const body = new URLSearchParams({ title: this.title });\n      const buildpack = this.$root.dataset[\"buildpack\"] ?? \"\";\n      if (buildpack) {\n        body.set(\"buildpack\", buildpack);\n      }\n      const response = await fetch(url, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/x-www-form-urlencoded\",\n          \"X-CSRFToken\": getCookie(\"csrftoken\"),\n          \"X-Requested-With\": \"XMLHttpRequest\",\n        },\n        body: body.toString(),\n      });\n      this.saved = response.ok;\n    },\n\n    reset() {\n      this.stopPolling();\n      this.teardownCapture();\n      if (machine.can(\"idle\")) {\n        this.go(\"idle\");\n      }\n      this.error = \"\";\n      this.warning = \"\";\n      this.saved = false;\n      this.uploadPercent = 0;\n      this.spooledBytes = 0;\n      this.chunkCount = 0;\n      this.elapsedMs = 0;\n      session = null;\n      if (store) {\n        void store.listSessions().then((sessions) => {\n          this.recoverable = findRecoverable(sessions, Date.now())[0] ?? null;\n        });\n      }\n    },\n\n    releaseCapture() {\n      if (worker) {\n        worker.terminate();\n        worker = null;\n      }\n      canvasTrack = null;\n      if (elapsedTimer !== null) {\n        clearInterval(elapsedTimer);\n        elapsedTimer = null;\n      }\n      if (meterTimer !== null) {\n        clearInterval(meterTimer);\n        meterTimer = null;\n      }\n      if (wakeLock) {\n        void wakeLock.release();\n        wakeLock = null;\n      }\n      for (const stream of [screenStream, cameraStream, micStream]) {\n        for (const track of stream?.getTracks() ?? []) {\n          track.stop();\n        }\n      }\n      screenStream = null;\n      cameraStream = null;\n      micStream = null;\n      mediaRecorder = null;\n    },\n\n    teardownCapture() {\n      if (countdownTimer !== null) {\n        clearInterval(countdownTimer);\n        countdownTimer = null;\n      }\n      if (mediaRecorder && mediaRecorder.state !== \"inactive\") {\n        mediaRecorder.ondataavailable = null;\n        mediaRecorder.onstop = null;\n        mediaRecorder.stop();\n      }\n      this.releaseCapture();\n    },\n\n    bubbleDragStart(event: PointerEvent) {\n      const container = this.$refs[\"screenPreview\"];\n      if (!(container instanceof HTMLVideoElement)) {\n        return;\n      }\n      event.preventDefault();\n      const bounds = container.getBoundingClientRect();\n      const move = (pointer: PointerEvent) => {\n        const left = pointer.clientX < bounds.left + bounds.width / 2;\n        const top = pointer.clientY < bounds.top + bounds.height / 2;\n        this.bubbleCorner = `${top ? \"top\" : \"bottom\"}-${\n          left ? \"left\" : \"right\"\n        }` as Corner;\n      };\n      const up = () => {\n        window.removeEventListener(\"pointermove\", move);\n        window.removeEventListener(\"pointerup\", up);\n      };\n      window.addEventListener(\"pointermove\", move);\n      window.addEventListener(\"pointerup\", up);\n    },\n\n    bubbleStyle(): string {\n      const vertical = this.bubbleCorner.startsWith(\"top\")\n        ? \"top: 1rem\"\n        : \"bottom: 1rem\";\n      const horizontal = this.bubbleCorner.endsWith(\"left\")\n        ? \"left: 1rem\"\n        : \"right: 1rem\";\n      return `${vertical}; ${horizontal}`;\n    },\n\n    elapsedLabel(): string {\n      return `${formatClock(this.elapsedMs)} / 30:00`;\n    },\n\n    spoolLabel(): string {\n      return `Spooled ${formatBytes(this.spooledBytes)} to disk (${this.chunkCount}s)`;\n    },\n\n    uploadLabel(): string {\n      if (!this.totalBytes) {\n        return \"Preparing upload\u2026\";\n      }\n      return `${formatBytes(this.uploadedBytes)} of ${formatBytes(\n        this.totalBytes,\n      )} (${this.uploadPercent}%)`;\n    },\n\n    recoveryLabel(): string {\n      if (!this.recoverable) {\n        return \"\";\n      }\n      const started = new Date(this.recoverable.startedAt);\n      const duration = formatClock(this.recoverable.chunkCount * 1000);\n      return `From ${started.toLocaleString()} \u2014 about ${duration} recorded.`;\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\n\n// Drag-and-drop reordering for a list of rows. Each row carries a\n// `data-sortable-item` marker, a draggable `data-sortable-handle` to grab, and\n// a hidden `<input name=\"order\">`. The handle is the only draggable element, so\n// the rest of the row's summary still toggles its disclosure on click. On drop\n// the rows are renumbered and a bubbling input event is dispatched per moved\n// row so the save-all component notices the new order and posts it on save.\n\ninterface State extends Record<string | symbol, unknown> {\n  onDragStart(event: unknown): void;\n  onDragOver(event: unknown): void;\n  onDragEnd(event: unknown): void;\n}\n\nconst ITEM = \"[data-sortable-item]\";\n\n// Applied to the row being dragged so it reads as lifted/gripped. These class\n// names must stay literal here so Tailwind's content scanner generates them.\nconst DRAG_CLASSES = [\n  \"bg-fn-home-light-blue\",\n  \"ring-2\",\n  \"ring-fn-blue\",\n  \"shadow-lg\",\n];\n\nexport default (): AlpineComponent<State> => {\n  let dragged: HTMLElement | null = null;\n\n  const items = (root: Element): HTMLElement[] =>\n    Array.from(root.querySelectorAll<HTMLElement>(ITEM));\n\n  // Set each row's order input to its current DOM position. Dispatch an input\n  // event only where the value changed so save-all marks just the moved rows.\n  const renumber = (root: Element) => {\n    items(root).forEach((item, index) => {\n      const input = item.querySelector<HTMLInputElement>('input[name=\"order\"]');\n      if (!input || input.value === String(index)) {\n        return;\n      }\n      input.value = String(index);\n      input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n    });\n  };\n\n  return {\n    onDragStart(event: unknown) {\n      if (!(event instanceof DragEvent) || !(event.target instanceof Element)) {\n        return;\n      }\n      dragged = event.target.closest<HTMLElement>(ITEM);\n      if (dragged && event.dataTransfer) {\n        event.dataTransfer.effectAllowed = \"move\";\n        // Firefox starts a drag only when some data is attached.\n        event.dataTransfer.setData(\"text/plain\", \"\");\n        // Highlight after the drag image is captured, so only the in-place row\n        // (not the cursor's ghost) shows the lifted styling.\n        const lifted = dragged;\n        requestAnimationFrame(() => lifted.classList.add(...DRAG_CLASSES));\n      }\n    },\n    onDragOver(event: unknown) {\n      if (!(event instanceof DragEvent) || !dragged) {\n        return;\n      }\n      if (!(event.target instanceof Element)) {\n        return;\n      }\n      const target = event.target.closest<HTMLElement>(ITEM);\n      if (!target || target === dragged) {\n        return;\n      }\n      const rect = target.getBoundingClientRect();\n      const after = event.clientY > rect.top + rect.height / 2;\n      target.parentNode?.insertBefore(\n        dragged,\n        after ? target.nextSibling : target,\n      );\n    },\n    onDragEnd(event: unknown) {\n      dragged?.classList.remove(...DRAG_CLASSES);\n      dragged = null;\n      if (event instanceof Event && event.currentTarget instanceof Element) {\n        renumber(event.currentTarget);\n      }\n    },\n  };\n};\n", "import { Stripe, StripeElements } from \"@stripe/stripe-js\";\nimport { loadStripe } from \"@stripe/stripe-js/pure\";\nimport { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  confirming: boolean;\n  elements: StripeElements | undefined;\n  stripe: Stripe | null;\n  submitted: boolean;\n  terms: boolean;\n}\n\nexport default (): AlpineComponent<State> => ({\n  confirming: false,\n  elements: undefined,\n  stripe: null,\n  submitted: false,\n  terms: false,\n  error() {\n    return this.submitted && !this.terms ? \"error\" : \"\";\n  },\n  init() {\n    const key = this.$root.dataset[\"key\"];\n\n    const secret = this.$root.dataset[\"secret\"];\n\n    if (typeof key !== \"string\") return;\n\n    if (typeof secret !== \"string\") return;\n\n    void (async () => {\n      this.stripe = await loadStripe(key);\n\n      this.elements = this.stripe?.elements({\n        clientSecret: secret,\n      });\n\n      const payment = this.elements?.create(\"payment\");\n\n      const target = this.$refs[\"stripe\"];\n\n      if (target !== undefined) {\n        payment?.mount(target);\n      }\n    })();\n  },\n  async submit(event: Event) {\n    event.preventDefault();\n\n    this.submitted = true;\n\n    if (!this.terms) {\n      return;\n    }\n\n    if (this.elements === undefined) return;\n\n    if (!(this.$root instanceof HTMLFormElement)) return;\n\n    this.confirming = true;\n\n    await this.stripe?.confirmPayment({\n      elements: this.elements,\n      confirmParams: {\n        return_url: this.$root.action,\n      },\n    });\n\n    this.confirming = false;\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\nexport default (): AlpineComponent<Record<string | symbol, unknown>> => ({\n  change() {\n    Array.from(\n      this.$el.closest(\"table\")?.querySelectorAll(\"input[type='checkbox']\") ??\n        [],\n    ).forEach((x) => {\n      if (!(x instanceof HTMLInputElement)) {\n        return;\n      }\n\n      if (!(this.$el instanceof HTMLInputElement)) {\n        return;\n      }\n\n      x.checked = this.$el.checked;\n    });\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ntype Match = \"any\" | \"all\";\ntype Sort = \"tagged\" | \"due\";\n\ninterface State extends Record<string | symbol, unknown> {\n  tags: string[];\n  rows: string[][];\n  selected: string[];\n  match: Match;\n  sort: Sort;\n  init(): void;\n  toggle(name: string): void;\n  clear(): void;\n  setMatch(match: Match): void;\n  setSort(sort: Sort): void;\n  arrange(): void;\n  shows(tags: string[]): boolean;\n  count(): number;\n  save(): void;\n}\n\n// Remembered per browser, so a list someone works through daily stays picked.\nconst KEY = \"ops-home-lists\";\n\nconst load = (): { selected?: unknown; match?: unknown; sort?: unknown } => {\n  try {\n    return JSON.parse(localStorage.getItem(KEY) ?? \"{}\");\n  } catch {\n    return {};\n  }\n};\n\n// The ops home's \"Your lists\": the viewer's tagged projects, narrowed to the\n// tags picked. data-tags is every tag and data-rows each project's tags; a\n// ?tag= in the URL (the header's links) picks that one tag. Each row's\n// data-tagged and data-due are its place in either order.\nexport default (): AlpineComponent<State> => ({\n  tags: [],\n  rows: [],\n  selected: [],\n  match: \"any\",\n  sort: \"tagged\",\n\n  init() {\n    this.tags = JSON.parse(this.$root.dataset[\"tags\"] ?? \"[]\");\n    this.rows = JSON.parse(this.$root.dataset[\"rows\"] ?? \"[]\");\n    const linked = new URLSearchParams(window.location.search).get(\"tag\");\n    const saved = load();\n    const picked = linked\n      ? [linked]\n      : Array.isArray(saved.selected)\n        ? saved.selected\n        : [];\n    this.selected = picked.filter(\n      (name): name is string =>\n        typeof name === \"string\" && this.tags.includes(name),\n    );\n    this.match = saved.match === \"all\" ? \"all\" : \"any\";\n    this.sort = saved.sort === \"due\" ? \"due\" : \"tagged\";\n    this.$nextTick(() => this.arrange());\n  },\n\n  toggle(name: string) {\n    this.selected = this.selected.includes(name)\n      ? this.selected.filter((other) => other !== name)\n      : [...this.selected, name];\n    this.save();\n  },\n\n  clear() {\n    this.selected = [];\n    this.save();\n  },\n\n  setMatch(match: Match) {\n    this.match = match;\n    this.save();\n  },\n\n  setSort(sort: Sort) {\n    this.sort = sort;\n    this.arrange();\n    this.save();\n  },\n\n  // Moves the rows rather than restyling them, so the dividers follow.\n  arrange() {\n    const list = this.$refs[\"list\"];\n    if (!list) {\n      return;\n    }\n    const place = (row: Element) =>\n      Number((row as HTMLElement).dataset[this.sort]);\n    list.append(...[...list.children].sort((a, b) => place(a) - place(b)));\n  },\n\n  shows(tags: string[]) {\n    if (!this.selected.length) {\n      return true;\n    }\n    return this.match === \"all\"\n      ? this.selected.every((name) => tags.includes(name))\n      : this.selected.some((name) => tags.includes(name));\n  },\n\n  count() {\n    return this.rows.filter((tags) => this.shows(tags)).length;\n  },\n\n  save() {\n    try {\n      localStorage.setItem(\n        KEY,\n        JSON.stringify({\n          selected: this.selected,\n          match: this.match,\n          sort: this.sort,\n        }),\n      );\n    } catch {\n      // Private windows can refuse storage; the pick just isn't remembered.\n    }\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  active: string | null;\n  onScroll: (() => void) | null;\n}\n\n// Scrollspy for the Build Pack \"on this page\" nav. It drives every\n// `[data-toc-link]` on the page (desktop sidebar and mobile disclosure alike),\n// keying off the link `href`s rather than markup, so styling can change freely.\n// Native anchors + CSS `scroll-behavior` handle the scrolling and focus; this\n// only manages the highlight and keeps the URL hash in step for deep-linking.\nexport default (): AlpineComponent<State> => ({\n  active: null,\n  onScroll: null,\n\n  init() {\n    const links = Array.from(\n      document.querySelectorAll<HTMLAnchorElement>(\"[data-toc-link]\"),\n    );\n    if (links.length === 0) return;\n\n    // Section ids in document order, de-duplicated (sidebar + mobile repeat them).\n    const ids = links.map((link) => link.getAttribute(\"href\")?.slice(1) ?? \"\");\n    const sections = ids\n      .filter((id, index) => id !== \"\" && ids.indexOf(id) === index)\n      .map((id) => document.getElementById(id))\n      .filter((element): element is HTMLElement => element !== null);\n    if (sections.length === 0) return;\n\n    // Anything marked `data-toc-current` (e.g. the collapsed mobile\n    // disclosure bar) shows the active section's label.\n    const currentLabels = Array.from(\n      document.querySelectorAll<HTMLElement>(\"[data-toc-current]\"),\n    );\n\n    const setActive = (id: string) => {\n      if (id === this.active) return;\n      this.active = id;\n      for (const link of links) {\n        const on = link.getAttribute(\"href\") === `#${id}`;\n        link.classList.toggle(\"toc-link--active\", on);\n        if (on) {\n          link.setAttribute(\"aria-current\", \"true\");\n        } else {\n          link.removeAttribute(\"aria-current\");\n        }\n      }\n      const label =\n        links\n          .find((link) => link.getAttribute(\"href\") === `#${id}`)\n          ?.textContent?.trim() ?? \"\";\n      for (const element of currentLabels) {\n        element.textContent = label;\n      }\n      if (id) history.replaceState(null, \"\", `#${id}`);\n    };\n\n    // The active section is the topmost whose top edge has crossed a trigger line\n    // ~30% down the viewport \u2014 so a tall section still activates.\n    const TRIGGER = 0.3;\n    const pick = () => {\n      // Sections on a tab that isn't showing (the V2 pack's documents) don't\n      // count, and with none showing nothing is current.\n      const shown = sections.filter(\n        (section) => section.getClientRects().length,\n      );\n      if (shown.length === 0) {\n        setActive(\"\");\n        return;\n      }\n      const line = window.innerHeight * TRIGGER;\n      let candidate = shown[0];\n      for (const section of shown) {\n        if (section.getBoundingClientRect().top <= line) {\n          candidate = section;\n        } else {\n          break;\n        }\n      }\n      // At the very bottom, force the last section \u2014 a short final section may\n      // never reach the trigger line otherwise.\n      const atBottom =\n        window.scrollY + window.innerHeight >= document.body.scrollHeight - 4;\n      if (atBottom) candidate = shown[shown.length - 1] ?? candidate;\n      if (candidate) setActive(candidate.id);\n    };\n\n    let ticking = false;\n    this.onScroll = () => {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(() => {\n        pick();\n        ticking = false;\n      });\n    };\n    window.addEventListener(\"scroll\", this.onScroll, { passive: true });\n    window.addEventListener(\"resize\", this.onScroll, { passive: true });\n\n    // Honour an incoming hash on load, else compute from the current scroll.\n    const hashId = location.hash.slice(1);\n    if (hashId !== \"\" && document.getElementById(hashId)) {\n      setActive(hashId);\n    } else {\n      pick();\n    }\n  },\n\n  destroy() {\n    if (this.onScroll) {\n      window.removeEventListener(\"scroll\", this.onScroll);\n      window.removeEventListener(\"resize\", this.onScroll);\n    }\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\nenum Status {\n  Ready,\n  Loading,\n  Failure,\n  Error,\n}\n\nexport interface State extends Record<string | symbol, unknown> {\n  status: Status;\n  content: string | null;\n}\n\nexport default (): AlpineComponent<State> => ({\n  status: Status.Ready,\n  content: null,\n\n  init() {\n    this.content = this.$refs[\"content\"]?.innerHTML ?? null;\n  },\n\n  submit(event: Event) {\n    event.preventDefault();\n\n    if (this.status === Status.Ready) {\n      this.status = Status.Loading;\n      if (!(event.target instanceof HTMLElement)) {\n        return;\n      }\n\n      const form = event.target.closest(\"form\");\n      if (!form) {\n        return;\n      }\n\n      if (form instanceof HTMLFormElement) {\n        const data = new FormData(form);\n        const url = form.getAttribute(\"action\");\n\n        if (!url) {\n          return;\n        }\n\n        const xhr = new XMLHttpRequest();\n\n        xhr.onloadstart = () => {\n          this.status = Status.Loading;\n        };\n\n        xhr.onload = () => {\n          setTimeout(() => {\n            this.content = xhr.responseText;\n\n            setTimeout(() => {\n              this.status = Status.Ready;\n            }, 2000);\n          }, 1000);\n        };\n\n        xhr.onerror = () => {\n          setTimeout(() => {\n            this.status = Status.Error;\n          }, 1000);\n        };\n\n        xhr.open(form.method, url);\n        xhr.send(data);\n      }\n    }\n  },\n\n  disabled() {\n    return this.status !== Status.Ready;\n  },\n  ready() {\n    return this.status === Status.Ready;\n  },\n  uploading() {\n    return this.status === Status.Loading;\n  },\n  failure() {\n    return this.status === Status.Failure;\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  copied: boolean;\n  copy: () => void;\n}\n\nexport default (): AlpineComponent<State> => ({\n  copied: false,\n\n  copy() {\n    const value = this.$root.dataset[\"value\"] ?? \"\";\n    navigator.clipboard.writeText(value).then(() => {\n      this.copied = true;\n      setTimeout(() => {\n        this.copied = false;\n      }, 2000);\n    });\n  },\n\n  button: {\n    [\"@click\"]() {\n      this.copy();\n    },\n  },\n});\n", "// Who could survey where, for the coverage map's Surveyors view. Reach is\n// measured from each surveyor's base postcode, not from the areas they claim:\n// a few surveyors claim every area in the country.\n\nexport interface Base {\n  pk: number;\n  name: string;\n  status: \"APPROVED\" | \"RESERVE\";\n  postcode: string;\n  location: string;\n  latitude: number | null;\n  longitude: number | null;\n  areas: string[];\n}\n\nexport interface Point {\n  lat: number;\n  lng: number;\n}\n\nexport interface Nearby {\n  pk: number;\n  name: string;\n  status: Base[\"status\"];\n  location: string;\n  km: number;\n  claims: boolean;\n}\n\nexport interface Gap {\n  district: string;\n  demand: number;\n  nearestApproved: Nearby | null;\n  nearestReserve: Nearby | null;\n}\n\n// A claim of this many postcode areas or more is a nationwide claim.\nexport const NATIONWIDE = 80;\n\nconst RADIUS_KM = 6371;\n\nconst radians = (x: number): number => (x * Math.PI) / 180;\n\nexport const distanceKm = (a: Point, b: Point): number => {\n  const dlat = radians(b.lat - a.lat);\n  const dlng = radians(b.lng - a.lng);\n  const h =\n    Math.sin(dlat / 2) ** 2 +\n    Math.cos(radians(a.lat)) *\n      Math.cos(radians(b.lat)) *\n      Math.sin(dlng / 2) ** 2;\n  return 2 * RADIUS_KM * Math.asin(Math.sqrt(h));\n};\n\nexport const located = (base: Base): Point | null =>\n  base.latitude === null || base.longitude === null\n    ? null\n    : { lat: base.latitude, lng: base.longitude };\n\n// The postcode area of a district: \"BS1\" \u2192 \"BS\", \"SW1A\" \u2192 \"SW\", \"E14\" \u2192 \"E\".\nexport const areaOf = (district: string): string =>\n  district.match(/^[A-Z]+/)?.[0] ?? \"\";\n\n// Surveyors based within reach of a point, nearest first.\nexport const nearby = (\n  point: Point,\n  area: string,\n  bases: Base[],\n  reachKm: number,\n): Nearby[] =>\n  bases\n    .flatMap((base) => {\n      const at = located(base);\n      if (!at) {\n        return [];\n      }\n      const km = distanceKm(point, at);\n      return km > reachKm\n        ? []\n        : [\n            {\n              pk: base.pk,\n              name: base.name,\n              status: base.status,\n              location: base.location,\n              km: Math.round(km),\n              claims: base.areas.includes(area),\n            },\n          ];\n    })\n    .sort((a, b) => a.km - b.km);\n\n// How many approved surveyors are based within reach of each place.\nexport const benchCounts = (\n  centroids: Map<string, Point>,\n  bases: Base[],\n  reachKm: number,\n): Map<string, number> => {\n  const points = bases\n    .filter((x) => x.status === \"APPROVED\")\n    .map(located)\n    .filter((x): x is Point => x !== null);\n  const counts = new Map<string, number>();\n  for (const [code, centroid] of centroids) {\n    counts.set(\n      code,\n      points.filter((x) => distanceKm(centroid, x) <= reachKm).length,\n    );\n  }\n  return counts;\n};\n\nconst nearest = (\n  point: Point,\n  area: string,\n  bases: Base[],\n  status: Base[\"status\"],\n): Nearby | null =>\n  nearby(\n    point,\n    area,\n    bases.filter((x) => x.status === status),\n    Number.POSITIVE_INFINITY,\n  )[0] ?? null;\n\n// Served districts with no approved surveyor in reach, the busiest first,\n// each with the nearest approved and reserve surveyors wherever they are.\nexport const gaps = (\n  served: Iterable<string>,\n  centroids: Map<string, Point>,\n  counts: Map<string, number>,\n  bases: Base[],\n  demand: Record<string, number>,\n): Gap[] =>\n  [...served]\n    .filter((x) => centroids.has(x) && (counts.get(x) ?? 0) === 0)\n    .map((district) => {\n      const point = centroids.get(district) as Point;\n      const area = areaOf(district);\n      return {\n        district,\n        demand: demand[district] ?? 0,\n        nearestApproved: nearest(point, area, bases, \"APPROVED\"),\n        nearestReserve: nearest(point, area, bases, \"RESERVE\"),\n      };\n    })\n    .sort(\n      (a, b) =>\n        b.demand - a.demand ||\n        (b.nearestApproved?.km ?? Number.POSITIVE_INFINITY) -\n          (a.nearestApproved?.km ?? Number.POSITIVE_INFINITY) ||\n        a.district.localeCompare(b.district),\n    );\n", "import { AlpineComponent } from \"alpinejs\";\nimport type { Feature, FeatureCollection, Geometry } from \"geojson\";\nimport type {\n  GeoJSONSource,\n  LngLatBoundsLike,\n  Map as MapLibreMap,\n  MapGeoJSONFeature,\n  PaddingOptions,\n} from \"maplibre-gl\";\nimport {\n  addShading,\n  type Basemap,\n  openMap,\n  pointer,\n  type Shade,\n  shade,\n} from \"./basemap\";\nimport {\n  areaOf,\n  type Base,\n  benchCounts,\n  distanceKm,\n  type Gap,\n  gaps,\n  located,\n  NATIONWIDE,\n  type Nearby,\n  nearby,\n  type Point,\n} from \"./coveragesupply\";\nimport { type Box, box, circle, escapeHtml, middle } from \"./geo\";\n\nfunction getCookie(name: string): string {\n  for (const part of document.cookie.split(\";\")) {\n    const [key, ...rest] = part.trim().split(\"=\");\n    if (key === name) {\n      return decodeURIComponent(rest.join(\"=\"));\n    }\n  }\n  return \"\";\n}\n\ninterface Surveyor {\n  name: string;\n  status: \"APPROVED\" | \"RESERVE\";\n  email: string;\n  phone: string;\n  location: string;\n  covers_area: boolean;\n  latitude: number | null;\n  longitude: number | null;\n  distance_km: number | null;\n  directions_url: string | null;\n}\n\ninterface SearchResult {\n  postcode: string;\n  outcode: string;\n  area: string;\n  city: string | null;\n  served: boolean;\n  latitude: number | null;\n  longitude: number | null;\n  surveyors: Surveyor[];\n}\n\ntype Mode = \"districts\" | \"areas\";\ntype Action = \"coverage\" | \"leadtime\" | \"price\";\ntype View = \"coverage\" | \"leadtime\" | \"price\" | \"supply\";\n\n// What the Surveyors view shows about one district or one surveyor.\ninterface Picked {\n  code: string;\n  served: boolean;\n  demand: number;\n  surveyors: Nearby[];\n}\n\ninterface Selected {\n  name: string;\n  status: Base[\"status\"];\n  postcode: string;\n  location: string;\n  areas: string;\n  claims: number;\n  nationwide: boolean;\n  reaches: number;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  mode: Mode;\n  action: Action;\n  view: View;\n  leadtime: number;\n  price: number;\n  spectrumMin: string;\n  spectrumMax: string;\n  loading: boolean;\n  saving: boolean;\n  error: string;\n  servedCount: number;\n  totalCount: number;\n  query: string;\n  services: string[];\n  measures: string[];\n  searching: boolean;\n  result: SearchResult | null;\n  includedAreas: string;\n  excludedDistricts: string;\n  includedDistricts: string;\n  includedLeadtimes: string;\n  includedPrices: string;\n  copied: string;\n  reach: number;\n  showReserve: boolean;\n  supplyError: string;\n  approvedCount: number;\n  reserveCount: number;\n  unlocatedCount: number;\n  nationwideCount: number;\n  gapCount: number;\n  gapList: Gap[];\n  picked: Picked | null;\n  selected: Selected | null;\n  setMode(mode: Mode): void;\n  setAction(action: Action): void;\n  setView(view: View): void;\n  toggle(codes: string[], nowServed: boolean): Promise<void>;\n  setLeadtime(codes: string[]): Promise<void>;\n  setPrice(codes: string[]): Promise<void>;\n  save(body: Record<string, unknown>): Promise<void>;\n  clickDistrict(code: string): void;\n  clickArea(code: string): void;\n  restyle(): void;\n  summarise(): void;\n  copy(which: string): Promise<void>;\n  search(): Promise<void>;\n  plot(result: SearchResult): void;\n  clear(): void;\n  refilter(): void;\n  layOver(opened: Basemap): void;\n  loadSupply(): Promise<void>;\n  measure(): void;\n  plotBases(): void;\n  pickDistrict(code: string): void;\n  selectSurveyor(base: Base): void;\n  focus(district: string): void;\n  unfocus(): void;\n}\n\n// Approved surveyors based within reach of a district: none, one, two, three+.\nconst BENCH = [\"#dc2626\", \"#f59e0b\", \"#84cc16\", \"#15803d\"];\nconst benchColour = (count: number): string =>\n  BENCH[Math.min(count, BENCH.length - 1)] ?? \"#15803d\";\n\nconst SERVED: Shade = {\n  color: \"#15803d\",\n  fillColor: \"#22c55e\",\n  fillOpacity: 0.55,\n};\n// No tiles under the map, so a district we don't serve is drawn as plain land.\nconst UNSERVED: Shade = {\n  color: \"#94a3b8\",\n  fillColor: \"#ffffff\",\n  fillOpacity: 0.9,\n};\n// Over our basemap, the land is already drawn: just the district's outline.\nconst OVER_TILES: Shade = {\n  color: \"#64748b\",\n  opacity: 0.5,\n  fillColor: \"#ffffff\",\n  fillOpacity: 0,\n};\nconst PARTIAL: Shade = {\n  color: \"#b45309\",\n  fillColor: \"#f59e0b\",\n  fillOpacity: 0.5,\n};\n// Colour spectrum for the lead time / price views: low \u2192 high.\nconst SPECTRUM_LOW: [number, number, number] = [219, 234, 254]; // blue-100\nconst SPECTRUM_HIGH: [number, number, number] = [30, 58, 138]; // blue-900\n\n// Great Britain and Northern Ireland, clear of the panels laid over the map's\n// left side on a wide screen (Tailwind's lg, where they float).\nconst UK: LngLatBoundsLike = [\n  [-8.2, 49.9],\n  [1.8, 58.7],\n];\nconst beside = (): PaddingOptions => ({\n  top: 0,\n  bottom: 0,\n  right: 0,\n  left: window.matchMedia(\"(min-width: 1024px)\").matches ? 440 : 0,\n});\nconst home = (map: MapLibreMap): void => {\n  map.fitBounds(UK, { padding: beside() });\n};\n\n// The layers a feature under the pointer can belong to, topmost first.\nconst POINTABLE = [\n  \"search-points\",\n  \"bases-points\",\n  \"districts-fill\",\n  \"areas-fill\",\n];\n\n// A marker on the map: a circle, with its tooltip.\ninterface Marker {\n  at: Point;\n  radius: number;\n  stroke: number;\n  color: string;\n  fillColor: string;\n  tip: string;\n  pk?: number;\n}\n\nconst markers = (list: Marker[]): FeatureCollection => ({\n  type: \"FeatureCollection\",\n  features: list.map(({ at, ...properties }) => ({\n    type: \"Feature\",\n    geometry: { type: \"Point\", coordinates: [at.lng, at.lat] },\n    properties,\n  })),\n});\n\n// An outline or a reach circle laid over the districts.\nconst outline = (\n  geometry: Geometry,\n  color: string,\n  weight: number,\n  fill: { fillColor: string; fillOpacity: number } | null = null,\n  dashed = false,\n): Feature => ({\n  type: \"Feature\",\n  geometry,\n  properties: {\n    color,\n    weight,\n    fillColor: fill?.fillColor ?? color,\n    fillOpacity: fill?.fillOpacity ?? 0,\n    dashed,\n  },\n});\n\nconst hex = (rgb: [number, number, number]): string =>\n  `#${rgb.map((x) => Math.round(x).toString(16).padStart(2, \"0\")).join(\"\")}`;\n\nconst spectrum = (t: number): string =>\n  hex(\n    [0, 1, 2].map((i) => {\n      const low = SPECTRUM_LOW[i] ?? 0;\n      const high = SPECTRUM_HIGH[i] ?? 0;\n      return low + (high - low) * t;\n    }) as [number, number, number],\n  );\n\nconst pounds = (pence: number): string =>\n  `\u00A3${(pence / 100).toLocaleString(\"en-GB\", {\n    minimumFractionDigits: 0,\n    maximumFractionDigits: 2,\n  })}`;\n\nconst average = (values: number[]): number =>\n  values.reduce((a, b) => a + b, 0) / values.length;\n\nexport default (): AlpineComponent<State> => {\n  // The map is deliberately kept out of the reactive state: Alpine's proxies\n  // would wrap MapLibre's internals.\n  let map: MapLibreMap | undefined;\n  let areaFeatures = new Map<string, Feature>();\n  const districtFeatures = new Map<string, Feature>();\n  const districtBoxes = new Map<string, Box>();\n  // Bounds centres: close enough to a district's middle to measure reach from.\n  const districtCentroids = new Map<string, Point>();\n  const areaCentroids = new Map<string, Point>();\n  let bases: Base[] = [];\n  let demand: Record<string, number> = {};\n  let districtBench = new Map<string, number>();\n  let areaBench = new Map<string, number>();\n  let reach = 50;\n  let supplied = false;\n  let land: Shade = UNSERVED;\n  // Captured in init(), where $el is the component root carrying the data-*\n  // attributes \u2014 in handlers $el is the element the directive is on.\n  let districtsUrl = \"\";\n  let searchUrl = \"\";\n  let supplyUrl = \"\";\n  const served = new Set<string>();\n  const leadtimes = new Map<string, number>();\n  const prices = new Map<string, number>();\n  const districtsByArea = new Map<string, string[]>();\n  let defaultLeadtime = 7;\n  let defaultPrice = 100000;\n  let view: View = \"coverage\";\n  // Range of the current view's values across served districts, for the spectrum.\n  let low = 0;\n  let high = 0;\n\n  const code = (feature: Feature | undefined): string =>\n    typeof feature?.properties?.[\"code\"] === \"string\"\n      ? feature.properties[\"code\"]\n      : \"\";\n\n  const districtLeadtime = (district: string): number =>\n    leadtimes.get(district) ?? defaultLeadtime;\n\n  const districtPrice = (district: string): number =>\n    prices.get(district) ?? defaultPrice;\n\n  const value = (district: string): number =>\n    view === \"price\" ? districtPrice(district) : districtLeadtime(district);\n\n  const label = (x: number): string =>\n    view === \"price\" ? pounds(x) : `${Math.round(x)} days`;\n\n  const tint = (x: number): Shade => {\n    const t = high > low ? (x - low) / (high - low) : 0.5;\n    const colour = spectrum(t);\n    return { color: colour, fillColor: colour, fillOpacity: 0.6 };\n  };\n\n  const range = (): void => {\n    const values = [...served].map(value);\n    low = values.length > 0 ? Math.min(...values) : 0;\n    high = values.length > 0 ? Math.max(...values) : 0;\n  };\n\n  // Only districts we sell are shaded: the rest of the country in faint red\n  // would read as a crisis rather than as somewhere we don't go.\n  const benchStyle = (count: number, sold: boolean): Shade =>\n    sold\n      ? {\n          color: benchColour(count),\n          fillColor: benchColour(count),\n          fillOpacity: 0.5,\n        }\n      : land;\n\n  const districtStyle = (district: string): Shade => {\n    if (view === \"supply\") {\n      return {\n        weight: served.has(district) ? 1 : 0.5,\n        ...benchStyle(districtBench.get(district) ?? 0, served.has(district)),\n      };\n    }\n    if (!served.has(district)) {\n      return { weight: 0.5, ...land };\n    }\n    return {\n      weight: 1,\n      ...(view === \"coverage\" ? SERVED : tint(value(district))),\n    };\n  };\n\n  const areaLeadtime = (codes: string[]): string => {\n    const values = [...new Set(codes.map(districtLeadtime))];\n    return values.length === 1\n      ? `${values[0]} days' notice`\n      : \"varied lead times\";\n  };\n\n  const areaPrice = (codes: string[]): string => {\n    const values = [...new Set(codes.map(districtPrice))];\n    return values.length === 1 && values[0] !== undefined\n      ? `${pounds(values[0])} final`\n      : \"varied prices\";\n  };\n\n  const areaStyle = (area: string): Shade => {\n    const codes = districtsByArea.get(area) ?? [];\n    const covered = codes.filter((x) => served.has(x));\n    if (view === \"supply\") {\n      return {\n        weight: covered.length > 0 ? 1.5 : 0.5,\n        ...benchStyle(areaBench.get(area) ?? 0, covered.length > 0),\n      };\n    }\n    if (covered.length === 0) {\n      return { weight: 1.5, ...land };\n    }\n    if (view !== \"coverage\") {\n      return { weight: 1.5, ...tint(average(covered.map(value))) };\n    }\n    return {\n      weight: 1.5,\n      ...(covered.length === codes.length ? SERVED : PARTIAL),\n    };\n  };\n\n  const supplyTooltip = (place: string, sold: boolean, count: number): string =>\n    `<strong>${escapeHtml(place)}</strong>${sold ? \"\" : \" \u2014 not sold\"}` +\n    ` \u2014 ${count} approved within ${reach} km`;\n\n  const demandOf = (codes: string[]): number =>\n    codes.reduce((total, x) => total + (demand[x] ?? 0), 0);\n\n  const recently = (count: number): string =>\n    count > 0 ? ` \u2014 ${count} projects in 12 months` : \"\";\n\n  const districtTip = (district: string): string => {\n    if (view === \"supply\") {\n      return (\n        supplyTooltip(\n          district,\n          served.has(district),\n          districtBench.get(district) ?? 0,\n        ) + recently(demand[district] ?? 0)\n      );\n    }\n    const status = served.has(district) ? \"covered\" : \"not covered\";\n    return (\n      `<strong>${escapeHtml(district)}</strong> \u2014 ${status}` +\n      ` \u2014 ${districtLeadtime(district)} days' notice` +\n      ` \u2014 ${pounds(districtPrice(district))} final`\n    );\n  };\n\n  const areaTip = (area: string): string => {\n    const codes = districtsByArea.get(area) ?? [];\n    if (view === \"supply\") {\n      return (\n        supplyTooltip(\n          area,\n          codes.some((x) => served.has(x)),\n          areaBench.get(area) ?? 0,\n        ) + recently(demandOf(codes))\n      );\n    }\n    const count = codes.filter((x) => served.has(x)).length;\n    return (\n      `<strong>${escapeHtml(area)}</strong> \u2014 ` +\n      `${count}/${codes.length} districts covered \u2014 ` +\n      `${areaLeadtime(codes)} \u2014 ${areaPrice(codes)}`\n    );\n  };\n\n  const draw = (source: string, data: FeatureCollection): void => {\n    (map?.getSource(source) as GeoJSONSource | undefined)?.setData(data);\n  };\n\n  const highlight = (features: Feature[]): void => {\n    draw(\"highlight\", { type: \"FeatureCollection\", features });\n  };\n\n  return {\n    mode: \"districts\",\n    action: \"coverage\",\n    view: \"coverage\",\n    leadtime: 7,\n    price: 1000,\n    spectrumMin: \"\",\n    spectrumMax: \"\",\n    loading: true,\n    saving: false,\n    error: \"\",\n    servedCount: 0,\n    totalCount: 0,\n    query: \"\",\n    services: [],\n    measures: [],\n    searching: false,\n    result: null,\n    includedAreas: \"\",\n    excludedDistricts: \"\",\n    includedDistricts: \"\",\n    includedLeadtimes: \"\",\n    includedPrices: \"\",\n    copied: \"\",\n    reach: 50,\n    showReserve: false,\n    supplyError: \"\",\n    approvedCount: 0,\n    reserveCount: 0,\n    unlocatedCount: 0,\n    nationwideCount: 0,\n    gapCount: 0,\n    gapList: [],\n    picked: null,\n    selected: null,\n\n    async init() {\n      const dataset = this.$el.dataset;\n      districtsUrl = dataset[\"districtsUrl\"] ?? \"\";\n      searchUrl = dataset[\"searchUrl\"] ?? \"\";\n      supplyUrl = dataset[\"supplyUrl\"] ?? \"\";\n      const target = this.$refs[\"map\"];\n      if (!(target instanceof HTMLElement)) {\n        return;\n      }\n\n      try {\n        const [opened, districts, areas, statuses] = await Promise.all([\n          // On the GPU: Leaflet's canvases took Firefox down (#3653).\n          openMap(target, dataset, {\n            bounds: UK,\n            fitBoundsOptions: { padding: beside() },\n          }),\n          fetch(dataset[\"districtsGeojsonUrl\"] ?? \"\").then(\n            (x) => x.json() as Promise<FeatureCollection>,\n          ),\n          fetch(dataset[\"areasGeojsonUrl\"] ?? \"\").then(\n            (x) => x.json() as Promise<FeatureCollection>,\n          ),\n          fetch(dataset[\"districtsUrl\"] ?? \"\").then(\n            (x) =>\n              x.json() as Promise<{\n                served: string[];\n                leadtimes: Record<string, number>;\n                prices: Record<string, number>;\n                default_leadtime: number;\n                default_price: number;\n              }>,\n          ),\n        ]);\n        map = opened.map;\n        if (opened.tiles) {\n          land = OVER_TILES;\n        }\n        map.addControl(\n          new opened.lib.NavigationControl({ showCompass: false }),\n          \"bottom-right\",\n        );\n\n        for (const x of statuses.served) {\n          served.add(x);\n        }\n        defaultLeadtime = statuses.default_leadtime;\n        this.leadtime = defaultLeadtime;\n        defaultPrice = statuses.default_price;\n        this.price = defaultPrice / 100;\n        for (const [district, x] of Object.entries(statuses.leadtimes)) {\n          leadtimes.set(district, x);\n        }\n        for (const [district, x] of Object.entries(statuses.prices)) {\n          prices.set(district, x);\n        }\n        for (const feature of districts.features) {\n          const district = code(feature);\n          const area =\n            typeof feature.properties?.[\"area\"] === \"string\"\n              ? feature.properties[\"area\"]\n              : \"\";\n          districtsByArea.set(area, [\n            ...(districtsByArea.get(area) ?? []),\n            district,\n          ]);\n          districtFeatures.set(district, feature);\n          const bounds = box(feature.geometry);\n          if (bounds) {\n            districtBoxes.set(district, bounds);\n            districtCentroids.set(district, middle(bounds));\n          }\n        }\n        for (const feature of areas.features) {\n          const bounds = box(feature.geometry);\n          if (bounds) {\n            areaCentroids.set(code(feature), middle(bounds));\n          }\n        }\n        this.totalCount = districts.features.length;\n        this.servedCount = served.size;\n        this.summarise();\n\n        areaFeatures = new Map(areas.features.map((x) => [code(x), x]));\n\n        addShading(map, \"districts\", districts);\n        addShading(map, \"areas\", areas);\n        for (const layer of [\"areas-fill\", \"areas-line\"]) {\n          map.setLayoutProperty(layer, \"visibility\", \"none\");\n        }\n        this.layOver(opened);\n        this.restyle();\n      } catch {\n        this.error = \"Couldn't load the coverage map \u2014 try reloading.\";\n      } finally {\n        this.loading = false;\n      }\n      await this.loadSupply();\n    },\n\n    layOver(opened: Basemap) {\n      const on = opened.map;\n      const empty: FeatureCollection = {\n        type: \"FeatureCollection\",\n        features: [],\n      };\n      for (const id of [\"highlight\", \"bases\", \"search\"]) {\n        on.addSource(id, { type: \"geojson\", data: empty });\n      }\n      on.addLayer({\n        id: \"highlight-fill\",\n        type: \"fill\",\n        source: \"highlight\",\n        paint: {\n          \"fill-color\": [\"get\", \"fillColor\"],\n          \"fill-opacity\": [\"get\", \"fillOpacity\"],\n        },\n      });\n      for (const dashed of [false, true]) {\n        on.addLayer({\n          id: dashed ? \"highlight-dashed\" : \"highlight-line\",\n          type: \"line\",\n          source: \"highlight\",\n          filter: [\"==\", [\"get\", \"dashed\"], dashed],\n          paint: {\n            \"line-color\": [\"get\", \"color\"],\n            \"line-width\": [\"get\", \"weight\"],\n            ...(dashed ? { \"line-dasharray\": [4, 4] } : {}),\n          },\n        });\n      }\n      for (const id of [\"bases\", \"search\"]) {\n        on.addLayer({\n          id: `${id}-points`,\n          type: \"circle\",\n          source: id,\n          paint: {\n            \"circle-radius\": [\"get\", \"radius\"],\n            \"circle-color\": [\"get\", \"fillColor\"],\n            \"circle-stroke-color\": [\"get\", \"color\"],\n            \"circle-stroke-width\": [\"get\", \"stroke\"],\n          },\n        });\n      }\n      pointer(\n        opened,\n        () => POINTABLE,\n        (feature: MapGeoJSONFeature) => {\n          const id = String(feature.id ?? \"\");\n          switch (feature.layer.id) {\n            case \"districts-fill\":\n              return districtTip(id);\n            case \"areas-fill\":\n              return areaTip(id);\n            default:\n              return String(feature.properties[\"tip\"] ?? \"\");\n          }\n        },\n        (feature: MapGeoJSONFeature) => {\n          const id = String(feature.id ?? \"\");\n          switch (feature.layer.id) {\n            case \"districts-fill\":\n              this.clickDistrict(id);\n              break;\n            case \"areas-fill\":\n              this.clickArea(id);\n              break;\n            case \"bases-points\": {\n              const base = bases.find((x) => x.pk === feature.properties[\"pk\"]);\n              if (base) {\n                this.selectSurveyor(base);\n              }\n              break;\n            }\n          }\n        },\n      );\n    },\n\n    async loadSupply() {\n      this.supplyError = \"\";\n      try {\n        const url = new URL(supplyUrl, window.location.origin);\n        for (const service of this.services) {\n          url.searchParams.append(\"services\", service);\n        }\n        for (const measure of this.measures) {\n          url.searchParams.append(\"measures\", measure);\n        }\n        const response = await fetch(url);\n        if (!response.ok) {\n          throw new Error(`${response.status}`);\n        }\n        const supply = (await response.json()) as {\n          surveyors: Base[];\n          demand: Record<string, number>;\n        };\n        bases = supply.surveyors;\n        demand = supply.demand;\n        supplied = true;\n      } catch {\n        this.supplyError = \"Couldn't load the surveyors \u2014 try reloading.\";\n        return;\n      }\n      const approved = bases.filter((x) => x.status === \"APPROVED\");\n      this.approvedCount = approved.length;\n      this.reserveCount = bases.length - approved.length;\n      this.unlocatedCount = bases.filter((x) => x.latitude === null).length;\n      this.nationwideCount = approved.filter(\n        (x) => x.areas.length >= NATIONWIDE,\n      ).length;\n      this.unfocus();\n      this.measure();\n    },\n\n    measure() {\n      if (!supplied) {\n        // Without surveyors every served district would look like a gap.\n        this.restyle();\n        return;\n      }\n      reach = Number(this.reach);\n      districtBench = benchCounts(districtCentroids, bases, reach);\n      areaBench = benchCounts(areaCentroids, bases, reach);\n      const list = gaps(\n        served,\n        districtCentroids,\n        districtBench,\n        bases,\n        demand,\n      );\n      this.gapCount = list.length;\n      this.gapList = list.slice(0, 30);\n      if (this.picked) {\n        this.pickDistrict(this.picked.code);\n      }\n      this.plotBases();\n      this.restyle();\n    },\n\n    plotBases() {\n      const shown: Marker[] = [];\n      for (const base of view === \"supply\" ? bases : []) {\n        const at = located(base);\n        const approved = base.status === \"APPROVED\";\n        if (!at || (!approved && !this.showReserve)) {\n          continue;\n        }\n        const claim =\n          base.areas.length >= NATIONWIDE\n            ? \"claims nationwide\"\n            : `claims ${base.areas.length} areas`;\n        shown.push({\n          at,\n          pk: base.pk,\n          radius: approved ? 6 : 5,\n          stroke: 2,\n          color: approved ? \"#1e3a8a\" : \"#475569\",\n          fillColor: approved ? \"#3b82f6\" : \"#ffffff\",\n          tip:\n            `<strong>${escapeHtml(base.name)}</strong> \u2014 ` +\n            `${approved ? \"approved\" : \"reserve\"}` +\n            ` \u2014 ${escapeHtml(base.postcode)} \u2014 ${claim}`,\n        });\n      }\n      draw(\"bases\", markers(shown));\n    },\n\n    pickDistrict(district: string) {\n      const point = districtCentroids.get(district);\n      if (!point) {\n        return;\n      }\n      this.selected = null;\n      this.picked = {\n        code: district,\n        served: served.has(district),\n        demand: demand[district] ?? 0,\n        surveyors: nearby(point, areaOf(district), bases, reach).filter(\n          (x) => x.status === \"APPROVED\" || this.showReserve,\n        ),\n      };\n      const feature = districtFeatures.get(district);\n      highlight([\n        ...(feature ? [outline(feature.geometry, \"#0f172a\", 3)] : []),\n        outline(circle(point, reach), \"#0f172a\", 1, null, true),\n      ]);\n    },\n\n    selectSurveyor(base: Base) {\n      this.picked = null;\n      const at = located(base);\n      const reaches = at\n        ? [...served].filter((x) => {\n            const centre = districtCentroids.get(x);\n            return centre !== undefined && distanceKm(at, centre) <= reach;\n          }).length\n        : 0;\n      this.selected = {\n        name: base.name,\n        status: base.status,\n        postcode: base.postcode,\n        location: base.location,\n        areas: base.areas.join(\", \"),\n        claims: base.areas.length,\n        nationwide: base.areas.length >= NATIONWIDE,\n        reaches,\n      };\n      const claimed = base.areas\n        .map((x) => areaFeatures.get(x))\n        .filter((x): x is Feature => x !== undefined)\n        .map((x) =>\n          outline(x.geometry, \"#7c3aed\", 1.5, {\n            fillColor: \"#a78bfa\",\n            fillOpacity: 0.15,\n          }),\n        );\n      highlight([\n        ...claimed,\n        ...(at\n          ? [\n              outline(circle(at, reach), \"#1e3a8a\", 2, {\n                fillColor: \"#1e3a8a\",\n                fillOpacity: 0.05,\n              }),\n            ]\n          : []),\n      ]);\n    },\n\n    focus(district: string) {\n      const bounds = districtBoxes.get(district);\n      if (!map || !bounds) {\n        return;\n      }\n      this.setMode(\"districts\");\n      map.fitBounds(bounds, { maxZoom: 10, padding: beside() });\n      this.pickDistrict(district);\n    },\n\n    unfocus() {\n      this.picked = null;\n      this.selected = null;\n      highlight([]);\n    },\n\n    refilter() {\n      void this.loadSupply();\n      if (this.query.trim() !== \"\") {\n        void this.search();\n      }\n    },\n\n    setAction(action: Action) {\n      this.action = action;\n      if (action !== \"coverage\") {\n        this.setView(action);\n      }\n    },\n\n    setView(next: View) {\n      view = next;\n      this.view = next;\n      if (next !== \"supply\") {\n        this.unfocus();\n      }\n      this.plotBases();\n      this.restyle();\n    },\n\n    clickDistrict(district: string) {\n      // The Surveyors view reads, it never edits: a stray click mustn't\n      // change what we sell.\n      if (view === \"supply\") {\n        this.pickDistrict(district);\n      } else if (this.action === \"leadtime\") {\n        void this.setLeadtime([district]);\n      } else if (this.action === \"price\") {\n        void this.setPrice([district]);\n      } else {\n        void this.toggle([district], !served.has(district));\n      }\n    },\n\n    clickArea(area: string) {\n      const codes = districtsByArea.get(area) ?? [];\n      if (view === \"supply\") {\n        return;\n      }\n      if (this.action === \"leadtime\") {\n        void this.setLeadtime(codes);\n      } else if (this.action === \"price\") {\n        void this.setPrice(codes);\n      } else {\n        void this.toggle(codes, !codes.every((x) => served.has(x)));\n      }\n    },\n\n    setMode(mode: Mode) {\n      if (!map || mode === this.mode) {\n        return;\n      }\n      this.mode = mode;\n      for (const source of [\"districts\", \"areas\"]) {\n        for (const layer of [`${source}-fill`, `${source}-line`]) {\n          map.setLayoutProperty(\n            layer,\n            \"visibility\",\n            source === mode ? \"visible\" : \"none\",\n          );\n        }\n      }\n    },\n\n    async setLeadtime(codes: string[]) {\n      if (this.saving || codes.length === 0) {\n        return;\n      }\n      const leadtime = Number(this.leadtime);\n      if (!Number.isInteger(leadtime) || leadtime < 0 || leadtime > 90) {\n        this.error = \"Lead time must be between 0 and 90 days.\";\n        return;\n      }\n      const previous = new Map(codes.map((x) => [x, leadtimes.get(x)]));\n      for (const x of codes) {\n        leadtimes.set(x, leadtime);\n      }\n      this.restyle();\n      try {\n        await this.save({ codes, leadtime });\n      } catch {\n        for (const [x, x0] of previous) {\n          if (x0 === undefined) {\n            leadtimes.delete(x);\n          } else {\n            leadtimes.set(x, x0);\n          }\n        }\n        this.restyle();\n      }\n    },\n\n    async setPrice(codes: string[]) {\n      if (this.saving || codes.length === 0) {\n        return;\n      }\n      const price = Math.round(Number(this.price) * 100);\n      if (!Number.isInteger(price) || price < 0) {\n        this.error = \"Price must be a positive amount.\";\n        return;\n      }\n      const previous = new Map(codes.map((x) => [x, prices.get(x)]));\n      for (const x of codes) {\n        prices.set(x, price);\n      }\n      this.restyle();\n      try {\n        await this.save({ codes, buildpack_final: price });\n      } catch {\n        for (const [x, x0] of previous) {\n          if (x0 === undefined) {\n            prices.delete(x);\n          } else {\n            prices.set(x, x0);\n          }\n        }\n        this.restyle();\n      }\n    },\n\n    async save(body: Record<string, unknown>) {\n      this.saving = true;\n      this.error = \"\";\n      try {\n        const response = await fetch(districtsUrl, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n            \"X-CSRFToken\": getCookie(\"csrftoken\"),\n          },\n          body: JSON.stringify(body),\n        });\n        if (!response.ok) {\n          throw new Error(`${response.status}`);\n        }\n      } catch (error) {\n        this.error = \"Couldn't save that change \u2014 try again.\";\n        throw error;\n      } finally {\n        this.saving = false;\n      }\n    },\n\n    async toggle(codes: string[], nowServed: boolean) {\n      if (this.saving || codes.length === 0) {\n        return;\n      }\n      this.saving = true;\n      this.error = \"\";\n      for (const x of codes) {\n        if (nowServed) {\n          served.add(x);\n        } else {\n          served.delete(x);\n        }\n      }\n      this.restyle();\n      try {\n        const response = await fetch(districtsUrl, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n            \"X-CSRFToken\": getCookie(\"csrftoken\"),\n          },\n          body: JSON.stringify({ codes, served: nowServed }),\n        });\n        if (!response.ok) {\n          throw new Error(`${response.status}`);\n        }\n      } catch {\n        for (const x of codes) {\n          if (nowServed) {\n            served.delete(x);\n          } else {\n            served.add(x);\n          }\n        }\n        this.restyle();\n        this.error = \"Couldn't save that change \u2014 try again.\";\n      } finally {\n        this.servedCount = served.size;\n        this.saving = false;\n        this.measure();\n      }\n    },\n\n    restyle() {\n      range();\n      const spectral = view === \"leadtime\" || view === \"price\";\n      this.spectrumMin = spectral ? label(low) : \"\";\n      this.spectrumMax = spectral ? label(high) : \"\";\n      if (map) {\n        for (const district of districtFeatures.keys()) {\n          shade(map, \"districts\", district, districtStyle(district));\n        }\n        for (const area of areaFeatures.keys()) {\n          shade(map, \"areas\", area, areaStyle(area));\n        }\n      }\n      this.summarise();\n    },\n\n    summarise() {\n      const included: string[] = [];\n      const excluded: string[] = [];\n      for (const area of [...districtsByArea.keys()].sort()) {\n        const codes = districtsByArea.get(area) ?? [];\n        const covered = codes.filter((x) => served.has(x));\n        if (covered.length === 0) {\n          continue;\n        }\n        if (covered.length === codes.length) {\n          included.push(area);\n        } else {\n          included.push(`${area} (partial)`);\n          excluded.push(\n            `${area} \u2014 excluded: ${codes\n              .filter((x) => !served.has(x))\n              .sort()\n              .join(\", \")}`,\n          );\n        }\n      }\n      this.includedAreas = included.join(\", \");\n      this.excludedDistricts = excluded.join(\"\\n\");\n      this.includedDistricts = [...served].sort().join(\", \");\n      this.includedLeadtimes = [...served]\n        .sort()\n        .map((x) => `${x}: ${districtLeadtime(x)} days`)\n        .join(\"\\n\");\n      this.includedPrices = [...served]\n        .sort()\n        .map((x) => `${x}: ${pounds(districtPrice(x))}`)\n        .join(\"\\n\");\n    },\n\n    async copy(which: string) {\n      const text =\n        {\n          areas: this.includedAreas,\n          excluded: this.excludedDistricts,\n          districts: this.includedDistricts,\n          leadtimes: this.includedLeadtimes,\n          prices: this.includedPrices,\n        }[which] ?? \"\";\n      await navigator.clipboard.writeText(text);\n      this.copied = which;\n      setTimeout(() => {\n        this.copied = \"\";\n      }, 2000);\n    },\n\n    async search() {\n      const query = this.query.trim();\n      if (!map || query === \"\") {\n        return;\n      }\n      this.searching = true;\n      this.error = \"\";\n      this.result = null;\n      draw(\"search\", markers([]));\n      try {\n        const url = new URL(searchUrl, window.location.origin);\n        url.searchParams.set(\"postcode\", query);\n        for (const service of this.services) {\n          url.searchParams.append(\"services\", service);\n        }\n        for (const measure of this.measures) {\n          url.searchParams.append(\"measures\", measure);\n        }\n        const response = await fetch(url);\n        if (response.status === 400) {\n          this.error = \"That doesn't look like a valid UK postcode.\";\n          return;\n        }\n        if (!response.ok) {\n          throw new Error(`${response.status}`);\n        }\n        const result = (await response.json()) as SearchResult;\n        this.result = result;\n        this.plot(result);\n      } catch {\n        this.error = \"Search failed \u2014 try again.\";\n      } finally {\n        this.searching = false;\n      }\n    },\n\n    plot(result: SearchResult) {\n      if (!map) {\n        return;\n      }\n      const shown: Marker[] = [];\n      for (const surveyor of result.surveyors) {\n        if (surveyor.latitude === null || surveyor.longitude === null) {\n          continue;\n        }\n        const reserve = surveyor.status === \"RESERVE\";\n        shown.push({\n          at: { lat: surveyor.latitude, lng: surveyor.longitude },\n          radius: 7,\n          stroke: 2,\n          color: surveyor.covers_area ? \"#1d4ed8\" : \"#64748b\",\n          fillColor: reserve\n            ? \"#ffffff\"\n            : surveyor.covers_area\n              ? \"#60a5fa\"\n              : \"#cbd5e1\",\n          tip:\n            `<strong>${escapeHtml(surveyor.name)}</strong>` +\n            (reserve ? \" \u2014 reserve\" : \"\") +\n            (surveyor.distance_km === null\n              ? \"\"\n              : ` \u2014 ${surveyor.distance_km} km`),\n        });\n      }\n      if (result.latitude !== null && result.longitude !== null) {\n        // Last, so it's drawn over the surveyors.\n        shown.push({\n          at: { lat: result.latitude, lng: result.longitude },\n          radius: 9,\n          stroke: 3,\n          color: result.served ? \"#15803d\" : \"#b91c1c\",\n          fillColor: \"#ffffff\",\n          tip: `<strong>${escapeHtml(result.postcode)}</strong>`,\n        });\n        map.flyTo({ center: [result.longitude, result.latitude], zoom: 10 });\n      }\n      draw(\"search\", markers(shown));\n    },\n\n    clear() {\n      this.query = \"\";\n      this.result = null;\n      this.error = \"\";\n      draw(\"search\", markers([]));\n      if (map) {\n        home(map);\n      }\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\nimport { call } from \"../fetch\";\n\nconst Status = z.union([\n  z.literal(\"REQUEST\"),\n  z.literal(\"GRANTED\"),\n  z.literal(\"DENIED\"),\n]);\n\ntype Status = z.infer<typeof Status>;\n\ninterface State extends Record<string | symbol, unknown> {\n  status: Status;\n}\n\n// Status comes from data-consent, never the x-data expression: it starts life\n// as a cookie any *.furbnow.com host can set.\nexport default (): AlpineComponent<State> => {\n  return {\n    status: \"REQUEST\",\n    init() {\n      this.status = Status.catch(\"REQUEST\").parse(this.$el.dataset[\"consent\"]);\n    },\n    request() {\n      return this.status === \"REQUEST\";\n    },\n    granted() {\n      return this.status === \"GRANTED\";\n    },\n    denied() {\n      return this.status === \"DENIED\";\n    },\n    async submit(event: Event) {\n      event.preventDefault();\n\n      if (!(event.target instanceof HTMLFormElement)) {\n        return;\n      }\n\n      const body = new FormData(event.target);\n\n      await call(event.target.action, {\n        body,\n        method: \"POST\",\n        redirect: \"manual\",\n      });\n\n      if (body.get(\"consent\") === \"true\") {\n        this.status = \"GRANTED\";\n      } else {\n        this.status = \"DENIED\";\n      }\n    },\n  };\n};\n", "import { AlpineComponent } from \"alpinejs\";\nimport { z } from \"zod\";\n\nimport { call } from \"../fetch\";\nimport { csrfToken, replaceFiles } from \"../storage/upload\";\n\ntype Added = {\n  id: string;\n  status: \"ADDED\";\n  filename: string;\n  file: File;\n  labels: string[];\n  created: Date;\n  shared: boolean;\n};\n\ntype Uploading = {\n  id: string;\n  status: \"UPLOADING\";\n  filename: string;\n  file: File;\n  labels: string[];\n  created: Date;\n  shared: boolean;\n};\n\ntype FailedUpload = {\n  id: string;\n  status: \"FAILED_UPLOAD\";\n  filename: string;\n  file: File;\n  labels: string[];\n  created: Date;\n  shared: boolean;\n};\n\ntype Saved = {\n  id: string;\n  status: \"SAVED\";\n  filename: string;\n  pk: number;\n  url: string;\n  labels: string[];\n  created: Date;\n  user: string;\n  shared: boolean;\n  share: string;\n  hide: string;\n  destroy: boolean;\n};\n\ntype Working = {\n  id: string;\n  status: \"WORKING\";\n  filename: string;\n  pk: number;\n  url: string;\n  labels: string[];\n  created: Date;\n  user: string;\n  shared: boolean;\n  share: string;\n  hide: string;\n  destroy: boolean;\n};\n\ntype Failed = {\n  id: string;\n  status: \"FAILED\";\n  filename: string;\n  pk: number;\n  url: string;\n  labels: string[];\n  created: Date;\n  user: string;\n  shared: boolean;\n  share: string;\n  hide: string;\n  destroy: boolean;\n};\n\ntype Upload = Added | Uploading | FailedUpload | Saved | Working | Failed;\n\ninterface State extends Record<string | symbol, unknown> {\n  files: Upload[];\n  selected: Upload | undefined;\n  upload(id: string): Promise<void>;\n}\n\nconst RemoteFile = z.object({\n  filename: z.string(),\n  pk: z.number().int(),\n  url: z.string(),\n  labels: z.array(z.string()),\n  created: z.coerce.date(),\n  user: z.string(),\n  shared: z.boolean(),\n  share: z.string(),\n  hide: z.string(),\n  destroy: z.boolean(),\n});\n\ntype RemoteFile = z.infer<typeof RemoteFile>;\n\nconst hydrate = ({\n  filename,\n  pk,\n  url,\n  labels,\n  created,\n  user,\n  shared,\n  share,\n  hide,\n  destroy,\n}: RemoteFile): Saved => ({\n  id: crypto.randomUUID(),\n  status: \"SAVED\",\n  filename,\n  pk,\n  url,\n  labels,\n  created,\n  user,\n  shared,\n  share,\n  hide,\n  destroy,\n});\n\nconst add = (file: File): Added => ({\n  id: crypto.randomUUID(),\n  status: \"ADDED\",\n  filename: file.name,\n  file,\n  labels: [],\n  created: new Date(),\n  shared: false,\n});\n\nexport default (data: unknown): AlpineComponent<State> => {\n  const files =\n    typeof data !== \"string\"\n      ? []\n      : RemoteFile.array()\n          .default([])\n          .parse(JSON.parse(atob(data)))\n          .map(hydrate);\n\n  return {\n    files,\n    selected: undefined,\n    async upload(id: string): Promise<void> {\n      const form = this.$refs[\"form\"];\n\n      if (!(form instanceof HTMLFormElement)) {\n        return;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return;\n      }\n\n      if (upload.status !== \"ADDED\" && upload.status !== \"FAILED_UPLOAD\") {\n        return;\n      }\n\n      const body = new FormData(form);\n      body.set(\"file\", upload.file);\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id) {\n          return {\n            ...upload,\n            status: \"UPLOADING\",\n          };\n        }\n\n        return x;\n      });\n\n      const response = await replaceFiles(body, csrfToken(form)).then(\n        (payload) =>\n          call(form.action, {\n            body: payload,\n            headers: {\n              Accept: \"application/json\",\n            },\n            method: \"POST\",\n          }),\n        (error: unknown) => ({ ok: false as const, error }),\n      );\n\n      if (response.ok) {\n        const parse = RemoteFile.safeParse(response.value);\n\n        if (parse.success) {\n          this.files = this.files.map((x) => {\n            if (x.id === upload.id) {\n              return {\n                id: x.id,\n                status: \"SAVED\",\n                pk: parse.data.pk,\n                filename: x.filename,\n                url: parse.data.url,\n                labels: parse.data.labels,\n                created: parse.data.created,\n                user: parse.data.user,\n                shared: parse.data.shared,\n                share: parse.data.share,\n                hide: parse.data.hide,\n                destroy: parse.data.destroy,\n              };\n            }\n\n            return x;\n          });\n\n          return;\n        }\n      }\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id && x.status === \"UPLOADING\") {\n          return { ...x, status: \"FAILED_UPLOAD\" };\n        }\n\n        return x;\n      });\n    },\n    async change(event: Event): Promise<void> {\n      if (!(event.target instanceof HTMLInputElement)) {\n        return;\n      }\n\n      const files = Array.from(event.target.files ?? []).map(add);\n\n      event.target.value = \"\";\n\n      this.files.unshift(...files);\n\n      await Promise.all(files.map((x) => x.id).map(this.upload.bind(this)));\n    },\n    dragover(event: unknown): void {\n      if (!(event instanceof DragEvent)) {\n        return;\n      }\n\n      event.preventDefault();\n    },\n    async drop(event: unknown): Promise<void> {\n      if (!(event instanceof DragEvent)) {\n        return;\n      }\n\n      event.preventDefault();\n\n      let files = Array.from(event.dataTransfer?.files ?? []).map(add);\n      const input = this.$refs[\"input\"];\n      if (input && input instanceof HTMLInputElement && input.accept) {\n        files = files.filter((file) => {\n          const filetype = file.filename.split(\".\").pop();\n          if (filetype) {\n            return input.accept.includes(filetype);\n          }\n          return false;\n        });\n      }\n\n      this.files.unshift(...files);\n\n      await Promise.all(files.map((x) => x.id).map(this.upload.bind(this)));\n    },\n    async remove(id: unknown): Promise<void> {\n      if (typeof id !== \"string\") {\n        return;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return;\n      }\n\n      if (upload.status !== \"SAVED\" && upload.status !== \"FAILED\") {\n        return;\n      }\n\n      const form = this.$refs[\"form\"];\n\n      if (!(form instanceof HTMLFormElement)) {\n        return;\n      }\n\n      const data = new FormData(form);\n      const token = data.get(\"csrfmiddlewaretoken\") ?? \"\";\n\n      if (typeof token !== \"string\") {\n        return;\n      }\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id) {\n          return { ...upload, status: \"WORKING\" };\n        }\n\n        return x;\n      });\n\n      const response = await call(upload.url, {\n        headers: {\n          Accept: \"application/json\",\n          \"Content-Type\": \"application/json\",\n          \"X-CSRFToken\": token,\n        },\n        method: \"DELETE\",\n      });\n\n      if (response.ok) {\n        this.files = this.files.filter((x) => x.id !== id);\n\n        if (this.selected?.id === id) {\n          this.selected = undefined;\n        }\n      } else {\n        this.files = this.files.map((x) => {\n          if (x.id === upload.id) {\n            return { ...upload, status: \"FAILED\" };\n          }\n\n          return x;\n        });\n      }\n    },\n    async retry(id: unknown): Promise<void> {\n      if (typeof id !== \"string\") {\n        return;\n      }\n\n      await this.upload(id);\n    },\n    canDelete(id: unknown): boolean {\n      if (typeof id !== \"string\") {\n        return false;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return false;\n      }\n\n      if (\n        upload.status === \"ADDED\" ||\n        upload.status === \"UPLOADING\" ||\n        upload.status === \"FAILED_UPLOAD\"\n      ) {\n        return false;\n      }\n\n      return upload.destroy;\n    },\n    canRetry(id: unknown): boolean {\n      if (typeof id !== \"string\") {\n        return false;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return false;\n      }\n\n      if (upload.status === \"FAILED_UPLOAD\") {\n        return true;\n      }\n\n      return false;\n    },\n    canHide(id: unknown): boolean {\n      if (typeof id !== \"string\") {\n        return false;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return false;\n      }\n\n      if (\n        upload.status === \"ADDED\" ||\n        upload.status === \"UPLOADING\" ||\n        upload.status === \"FAILED_UPLOAD\"\n      ) {\n        return false;\n      }\n\n      if (upload.hide === \"\") {\n        return false;\n      }\n\n      if (upload.shared) {\n        return true;\n      }\n\n      return false;\n    },\n    canShare(id: unknown): boolean {\n      if (typeof id !== \"string\") {\n        return false;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return false;\n      }\n\n      if (upload.shared) {\n        return false;\n      }\n\n      if (\n        upload.status === \"ADDED\" ||\n        upload.status === \"UPLOADING\" ||\n        upload.status === \"FAILED_UPLOAD\"\n      ) {\n        return false;\n      }\n\n      if (upload.share === \"\") {\n        return false;\n      }\n\n      return true;\n    },\n    async hide(id: unknown): Promise<void> {\n      if (typeof id !== \"string\") {\n        return;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return;\n      }\n\n      if (upload.status !== \"SAVED\" && upload.status !== \"FAILED\") {\n        return;\n      }\n\n      if (!upload.shared) {\n        return;\n      }\n\n      const form = this.$refs[\"form\"];\n\n      if (!(form instanceof HTMLFormElement)) {\n        return;\n      }\n\n      const data = new FormData(form);\n      const token = data.get(\"csrfmiddlewaretoken\") ?? \"\";\n\n      if (typeof token !== \"string\") {\n        return;\n      }\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id) {\n          return { ...upload, status: \"WORKING\" };\n        }\n\n        return x;\n      });\n\n      const response = await call(upload.hide, {\n        headers: {\n          Accept: \"application/json\",\n          \"Content-Type\": \"application/json\",\n          \"X-CSRFToken\": token,\n        },\n        method: \"PUT\",\n      });\n\n      if (response.ok) {\n        this.files = this.files.map((x) => {\n          if (x.id === upload.id) {\n            return { ...upload, status: \"SAVED\", shared: false };\n          }\n\n          return x;\n        });\n      } else {\n        this.files = this.files.map((x) => {\n          if (x.id === upload.id) {\n            return { ...upload, status: \"FAILED\" };\n          }\n\n          return x;\n        });\n      }\n    },\n    async share(id: unknown): Promise<void> {\n      if (typeof id !== \"string\") {\n        return;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return;\n      }\n\n      if (upload.status !== \"SAVED\" && upload.status !== \"FAILED\") {\n        return;\n      }\n\n      if (upload.shared) {\n        return;\n      }\n\n      const form = this.$refs[\"form\"];\n\n      if (!(form instanceof HTMLFormElement)) {\n        return;\n      }\n\n      const data = new FormData(form);\n      const token = data.get(\"csrfmiddlewaretoken\") ?? \"\";\n\n      if (typeof token !== \"string\") {\n        return;\n      }\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id) {\n          return { ...upload, status: \"WORKING\" };\n        }\n\n        return x;\n      });\n\n      const response = await call(upload.share, {\n        headers: {\n          Accept: \"application/json\",\n          \"Content-Type\": \"application/json\",\n          \"X-CSRFToken\": token,\n        },\n        method: \"PUT\",\n      });\n\n      if (response.ok) {\n        this.files = this.files.map((x) => {\n          if (x.id === upload.id) {\n            return { ...upload, status: \"SAVED\", shared: true };\n          }\n\n          return x;\n        });\n      } else {\n        this.files = this.files.map((x) => {\n          if (x.id === upload.id) {\n            return { ...upload, status: \"FAILED\" };\n          }\n\n          return x;\n        });\n      }\n    },\n    status(id: unknown, status: unknown): boolean {\n      if (typeof id !== \"string\" || typeof status !== \"string\") {\n        return false;\n      }\n\n      return this.files.some((x) => x.id === id && x.status === status);\n    },\n    label(id: unknown, label: unknown): boolean {\n      if (typeof id !== \"string\" || typeof label !== \"string\") {\n        return false;\n      }\n\n      return this.files.some(\n        (x) => x.id === id && x.labels.some((l) => l === label),\n      );\n    },\n    date(value: unknown): string {\n      if (!(value instanceof Date)) {\n        return \"\";\n      }\n\n      return value.toLocaleString();\n    },\n    select(value: unknown): void {\n      if (typeof value !== \"string\") {\n        return;\n      }\n\n      this.selected = this.files.find((x) => x.id === value);\n    },\n    async toggleLabel(id: unknown, label: unknown): Promise<void> {\n      if (typeof id !== \"string\" || typeof label !== \"string\") {\n        return;\n      }\n\n      const upload = this.files.find((x) => x.id === id);\n\n      if (upload === undefined) {\n        return;\n      }\n\n      if (upload.status !== \"SAVED\" && upload.status !== \"FAILED\") {\n        return;\n      }\n\n      const form = this.$refs[\"form\"];\n\n      if (!(form instanceof HTMLFormElement)) {\n        return;\n      }\n\n      const data = new FormData(form);\n      const token = data.get(\"csrfmiddlewaretoken\") ?? \"\";\n\n      if (typeof token !== \"string\") {\n        return;\n      }\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id) {\n          return { ...upload, status: \"WORKING\" };\n        }\n\n        return x;\n      });\n\n      const labels = upload.labels.includes(label)\n        ? upload.labels.filter((x) => x !== label)\n        : upload.labels.concat([label]);\n\n      const response = await call(upload.url, {\n        headers: {\n          Accept: \"application/json\",\n          \"Content-Type\": \"application/json\",\n          \"X-CSRFToken\": token,\n        },\n        method: \"PUT\",\n        body: JSON.stringify({ ...upload, labels }),\n      });\n\n      if (response.ok) {\n        const parse = RemoteFile.safeParse(response.value);\n\n        if (parse.success) {\n          this.files = this.files.map((x) => {\n            if (x.id === upload.id) {\n              return {\n                id: x.id,\n                status: \"SAVED\",\n                pk: parse.data.pk,\n                filename: x.filename,\n                url: parse.data.url,\n                labels: parse.data.labels,\n                created: parse.data.created,\n                user: parse.data.user,\n                shared: parse.data.shared,\n                share: parse.data.share,\n                hide: parse.data.hide,\n                destroy: parse.data.destroy,\n              };\n            }\n\n            return x;\n          });\n\n          return;\n        }\n      }\n\n      this.files = this.files.map((x) => {\n        if (x.id === upload.id) {\n          return { ...upload, status: \"FAILED\" };\n        }\n\n        return x;\n      });\n    },\n  };\n};\n", "import htmx from \"htmx.org\";\n\nimport { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  open: boolean;\n}\n\nexport default (): AlpineComponent<State> => ({\n  open: false,\n\n  action: {\n    [\"@click.stop\"]() {\n      this.open = false;\n    },\n  },\n\n  trigger: {\n    [\"@click\"]() {\n      this.open = true;\n    },\n  },\n\n  overlay: {\n    [\"x-show\"]() {\n      return this.open;\n    },\n  },\n\n  content: {\n    [\"x-init\"]() {\n      htmx.process(this.$el);\n    },\n    [\"x-show\"]() {\n      return this.open;\n    },\n  },\n\n  cancel: {\n    [\"@click.prevent\"]() {\n      this.open = false;\n    },\n  },\n});\n", "// Files picked by a drop, a paste or a file dialog, each with the folder it\n// came from, so a dropped folder keeps its tree.\n\nexport interface Picked {\n  file: File;\n  folder: string;\n}\n\n// The subset of the File and Directory Entries API a drop hands over.\nexport interface Entry {\n  name: string;\n  isFile: boolean;\n  isDirectory: boolean;\n}\n\ninterface FileEntry extends Entry {\n  file(success: (file: File) => void, failure: (error: unknown) => void): void;\n}\n\ninterface DirectoryEntry extends Entry {\n  createReader(): {\n    readEntries(\n      success: (entries: Entry[]) => void,\n      failure: (error: unknown) => void,\n    ): void;\n  };\n}\n\nconst JUNK = new Set([\".DS_Store\", \"Thumbs.db\", \"desktop.ini\"]);\n\nexport const join = (...parts: string[]): string =>\n  parts.filter(Boolean).join(\"/\");\n\nconst readAll = (directory: DirectoryEntry): Promise<Entry[]> =>\n  new Promise((resolve, reject) => {\n    const reader = directory.createReader();\n    const entries: Entry[] = [];\n    // readEntries returns a batch at a time (100 in Chrome) until it's empty.\n    const next = () =>\n      reader.readEntries((batch) => {\n        if (batch.length === 0) {\n          resolve(entries);\n          return;\n        }\n        entries.push(...batch);\n        next();\n      }, reject);\n    next();\n  });\n\nexport const walk = async (entry: Entry, folder = \"\"): Promise<Picked[]> => {\n  if (JUNK.has(entry.name)) {\n    return [];\n  }\n  if (entry.isFile) {\n    const file = await new Promise<File>((resolve, reject) =>\n      (entry as FileEntry).file(resolve, reject),\n    );\n    return [{ file, folder }];\n  }\n  if (entry.isDirectory) {\n    const children = await readAll(entry as DirectoryEntry);\n    const path = join(folder, entry.name);\n    const nested = await Promise.all(\n      children.map((child) => walk(child, path)),\n    );\n    return nested.flat();\n  }\n  return [];\n};\n\n// `<input webkitdirectory>` gives each file its path from the chosen folder.\nexport const fromInput = (files: File[]): Picked[] =>\n  files\n    .filter((file) => !JUNK.has(file.name))\n    .map((file) => ({\n      file,\n      folder: file.webkitRelativePath.split(\"/\").slice(0, -1).join(\"/\"),\n    }));\n\nconst pad = (value: number): string => String(value).padStart(2, \"0\");\n\n// Browsers name every pasted image \"image.png\"; give it the time instead.\nexport const pastedName = (file: File, now: Date): File => {\n  if (file.name !== \"image.png\" && file.name !== \"\") {\n    return file;\n  }\n  const extension = file.type.split(\"/\")[1] ?? \"png\";\n  const date = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n  const time = `${pad(now.getHours())}.${pad(now.getMinutes())}.${pad(now.getSeconds())}`;\n  return new File([file], `Pasted ${date} ${time}.${extension}`, {\n    type: file.type,\n  });\n};\n", "export type Kind =\n  | \"pdf\"\n  | \"image\"\n  | \"video\"\n  | \"audio\"\n  | \"spreadsheet\"\n  | \"document\"\n  | \"drawing\"\n  | \"archive\"\n  | \"other\";\n\nexport interface Version {\n  filename: string;\n  created: string;\n  user: string;\n  url: string;\n}\n\nexport interface Note {\n  pk: number;\n  text: string;\n  x: number | null;\n  y: number | null;\n  user: string;\n  created: string;\n}\n\nexport interface Activity {\n  pk: number;\n  upload: number;\n  action: string;\n  text: string;\n  user: string;\n  created: string;\n  undoable: boolean;\n}\n\nexport interface Required {\n  key: string;\n  measure: string;\n  name: string;\n  folder: string;\n  step: string;\n  state: \"done\" | \"waived\" | \"missing\" | \"later\";\n  reason: string;\n  waived_by: string;\n}\n\nexport interface Doc {\n  pk: number;\n  filename: string;\n  extension: string;\n  kind: Kind;\n  folder: string;\n  labels: string[];\n  url: string;\n  thumbnail: string | null;\n  preview: string | null;\n  pending: boolean;\n  size: number | null;\n  width: number | null;\n  height: number | null;\n  pages: number | null;\n  duration: number | null;\n  panorama: boolean;\n  taken: string | null;\n  created_at: string;\n  user: string;\n  shared: boolean;\n  summary: string;\n  versions: Version[];\n  notes: Note[];\n  // Made here rather than sent: what a search looks through, lowercased.\n  search: string;\n  // What the file's rows are keyed by; see `reconcile`.\n  key: string;\n}\n\nexport const doc = (raw: Partial<Doc>): Doc => {\n  const file: Doc = {\n    pk: 0,\n    filename: \"\",\n    extension: \"\",\n    kind: \"other\",\n    folder: \"\",\n    labels: [],\n    url: \"\",\n    thumbnail: null,\n    preview: null,\n    pending: false,\n    size: null,\n    width: null,\n    height: null,\n    pages: null,\n    duration: null,\n    panorama: false,\n    taken: null,\n    created_at: \"\",\n    user: \"\",\n    shared: false,\n    summary: \"\",\n    versions: [],\n    notes: [],\n    search: \"\",\n    key: \"\",\n    ...raw,\n  };\n  return { ...file, search: haystack(file), key: String(file.pk) };\n};\n\nlet revisions = 0;\n\nconst same = (a: Doc, b: Doc): boolean =>\n  JSON.stringify({ ...a, key: \"\" }) === JSON.stringify({ ...b, key: \"\" });\n\n// A reload's files, keeping the Doc of each one that hasn't changed, so its\n// rows are kept too, with their focus and loaded thumbnail. A changed file\n// gets a new key, so its rows are drawn again rather than reused with stale\n// bindings (templates/AGENTS.md).\nexport const reconcile = (before: Doc[], files: Partial<Doc>[]): Doc[] => {\n  const previous = new Map(before.map((file) => [file.pk, file]));\n  return files.map((raw) => {\n    const file = doc(raw);\n    const old = previous.get(file.pk);\n    if (old && same(old, file)) return old;\n    revisions++;\n    return { ...file, key: `${file.pk}-${revisions}` };\n  });\n};\n\n// The last answer again while the arguments are the same ones, for what a\n// render reads many times over.\nexport const memo = <A extends unknown[], R>(\n  compute: (...args: A) => R,\n): ((...args: A) => R) => {\n  let last: A | null = null;\n  let value: R | undefined;\n  return (...args: A): R => {\n    if (!last || args.some((arg, index) => arg !== last?.[index])) {\n      last = args;\n      value = compute(...args);\n    }\n    return value as R;\n  };\n};\n\n// The first message in a DRF error response, e.g. {\"transfer_to\": [\"\u2026\"]}.\nexport const firstError = (value: unknown): string => {\n  if (typeof value === \"string\") return value;\n  if (value && typeof value === \"object\") {\n    for (const each of Object.values(value)) {\n      const message = firstError(each);\n      if (message) return message;\n    }\n  }\n  return \"\";\n};\n\n// \"Loft\" for one file; \"Loft 1\", \"Loft 2\", \u2026 for several, in the order shown.\nexport const numbered = (base: string, pks: number[]): [number, string][] =>\n  pks.length === 1\n    ? pks.map((pk) => [pk, base])\n    : pks.map((pk, index) => [pk, `${base} ${index + 1}`]);\n\n// \"panorama\" is a filter, not a kind: a 360\u00B0 photo is also an image.\nexport type Filter = \"\" | Kind | \"panorama\";\n\nexport const FILTERS: [Filter, string][] = [\n  [\"\", \"All\"],\n  [\"image\", \"Photos\"],\n  [\"panorama\", \"360\u00B0\"],\n  [\"pdf\", \"PDFs\"],\n  [\"video\", \"Videos\"],\n  [\"audio\", \"Audio\"],\n  [\"spreadsheet\", \"Spreadsheets\"],\n  [\"document\", \"Documents\"],\n  [\"drawing\", \"Drawings\"],\n  [\"archive\", \"Archives\"],\n  [\"other\", \"Other\"],\n];\n\nexport const matchesFilter = (file: Doc, filter: Filter): boolean =>\n  filter === \"\" ||\n  (filter === \"panorama\" ? file.panorama : file.kind === filter);\n\nexport type Sort = \"newest\" | \"oldest\" | \"name\" | \"size\" | \"kind\" | \"taken\";\n\nexport const SORTS: [Sort, string][] = [\n  [\"newest\", \"Newest first\"],\n  [\"oldest\", \"Oldest first\"],\n  [\"name\", \"Name\"],\n  [\"size\", \"Largest first\"],\n  [\"kind\", \"Type\"],\n  [\"taken\", \"Date taken\"],\n];\n\n// One collator: localeCompare with options makes one per comparison.\nconst NAMES = new Intl.Collator(undefined, {\n  numeric: true,\n  sensitivity: \"base\",\n});\n\nconst byName = (a: Doc, b: Doc): number =>\n  NAMES.compare(a.filename, b.filename);\n\nconst SORTERS: Record<Sort, (a: Doc, b: Doc) => number> = {\n  newest: (a, b) => b.created_at.localeCompare(a.created_at) || b.pk - a.pk,\n  oldest: (a, b) => a.created_at.localeCompare(b.created_at) || a.pk - b.pk,\n  name: byName,\n  size: (a, b) => (b.size ?? -1) - (a.size ?? -1) || byName(a, b),\n  kind: (a, b) =>\n    a.kind.localeCompare(b.kind) ||\n    a.extension.localeCompare(b.extension) ||\n    byName(a, b),\n  // Photos without a date go last, newest upload first.\n  taken: (a, b) =>\n    (b.taken ?? \"\").localeCompare(a.taken ?? \"\") || SORTERS.newest(a, b),\n};\n\nexport const sorted = (files: Doc[], sort: Sort): Doc[] =>\n  [...files].sort(SORTERS[sort] ?? SORTERS.newest);\n\n// COVER_IMAGE \u2192 Cover image\nexport const humanLabel = (label: string): string => {\n  const words = label.replaceAll(\"_\", \" \").toLowerCase();\n  return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\n// Kinds the job queue makes thumbnails or reads facts for.\nexport const DERIVED = new Set<Kind>([\"image\", \"pdf\", \"video\", \"audio\"]);\n\n// 75.4 \u2192 1:15, 3725 \u2192 1:02:05\nexport const formatDuration = (seconds: number | null): string => {\n  if (seconds === null) return \"\";\n  const whole = Math.round(seconds);\n  const [h, m, s] = [\n    Math.floor(whole / 3600),\n    Math.floor((whole % 3600) / 60),\n    whole % 60,\n  ];\n  const pad = (n: number) => String(n).padStart(2, \"0\");\n  return h ? `${h}:${pad(m)}:${pad(s)}` : `${m}:${pad(s)}`;\n};\n\nexport const formatSize = (bytes: number | null): string => {\n  if (bytes === null) return \"\";\n  if (bytes < 1024) return `${bytes} B`;\n  const units = [\"KB\", \"MB\", \"GB\"];\n  let value = bytes / 1024;\n  let unit = 0;\n  while (value >= 1024 && unit < units.length - 1) {\n    value /= 1024;\n    unit++;\n  }\n  return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;\n};\n\nconst haystack = (file: Doc): string =>\n  [\n    file.filename,\n    file.folder,\n    file.extension,\n    file.kind,\n    file.panorama ? \"360 panorama\" : \"\",\n    file.user,\n    file.summary,\n    ...file.labels,\n    ...file.labels.map(humanLabel),\n    ...file.notes.map((note) => note.text),\n  ]\n    .join(\" \")\n    .toLowerCase();\n\n// Every word must appear somewhere: name, folder, labels, summary or notes.\nexport const matchesQuery = (file: Doc, query: string): boolean =>\n  query\n    .toLowerCase()\n    .split(/\\s+/)\n    .filter(Boolean)\n    .every((word) => file.search.includes(word));\n\nexport const inSubtree = (folder: string, root: string): boolean =>\n  root === \"\" || folder === root || folder.startsWith(`${root}/`);\n\nexport const parentOf = (path: string): string =>\n  path.includes(\"/\") ? path.slice(0, path.lastIndexOf(\"/\")) : \"\";\n\nexport const leaf = (path: string): string => path.split(\"/\").at(-1) ?? path;\n\n// The folders directly inside `parent` (\"\" is the top level).\nexport const children = (folders: string[], parent: string): string[] =>\n  folders.filter((path) => path !== parent && parentOf(path) === parent);\n\n// \"Contracts/Signed\" \u2192 [[\"Contracts\", \"Contracts\"], [\"Signed\", \"Contracts/Signed\"]]\nexport const crumbs = (path: string): [string, string][] =>\n  path\n    ? path\n        .split(\"/\")\n        .map((name, index, parts) => [\n          name,\n          parts.slice(0, index + 1).join(\"/\"),\n        ])\n    : [];\n\nexport const countIn = (files: Doc[], folder: string): number =>\n  files.filter((file) => inSubtree(file.folder, folder)).length;\n\nexport interface View {\n  // null browses everything at once; a path (or \"\" for the top level)\n  // browses that folder.\n  folder: string | null;\n  query: string;\n  filter: Filter;\n  label: string;\n  // Who uploaded it; \"\" is anyone.\n  uploader: string;\n  sort: Sort;\n}\n\nexport const searching = (view: View): boolean =>\n  Boolean(view.query.trim() || view.filter || view.label || view.uploader);\n\nconst matches = (file: Doc, view: View, deep: boolean): boolean => {\n  const folder = view.folder ?? \"\";\n  return (\n    (deep ? inSubtree(file.folder, folder) : file.folder === folder) &&\n    matchesFilter(file, view.filter) &&\n    (!view.label || file.labels.includes(view.label)) &&\n    (!view.uploader || file.user === view.uploader) &&\n    matchesQuery(file, view.query)\n  );\n};\n\nexport const visible = (files: Doc[], view: View): Doc[] => {\n  const deep = view.folder === null || searching(view);\n  return sorted(\n    files.filter((file) => matches(file, view, deep)),\n    view.sort,\n  );\n};\n\n// How many files each filter finds in the whole of the folder being browsed.\nexport const countFilters = (files: Doc[], view: View): Map<Filter, number> => {\n  const counts = new Map<Filter, number>();\n  const add = (filter: Filter) =>\n    counts.set(filter, (counts.get(filter) ?? 0) + 1);\n  for (const file of files) {\n    if (!matches(file, { ...view, filter: \"\" }, true)) continue;\n    add(\"\");\n    add(file.kind);\n    if (file.panorama) add(\"panorama\");\n  }\n  return counts;\n};\n\n// The pks from one clicked item to another, for shift-click selection.\nexport const between = (\n  order: number[],\n  from: number,\n  to: number,\n): number[] => {\n  const start = order.indexOf(from);\n  const end = order.indexOf(to);\n  if (start === -1 || end === -1) return [to];\n  return order.slice(Math.min(start, end), Math.max(start, end) + 1);\n};\n\nexport const pinned = (file: Doc): Note[] =>\n  file.notes.filter((note) => note.x !== null && note.y !== null);\n\n// Images a browser shows itself; others (HEIC, TIFF) only through the preview.\nconst NATIVE = new Set([\"gif\", \"jpeg\", \"jpg\", \"png\", \"webp\", \"avif\", \"bmp\"]);\n\nexport const viewable = (file: Doc): string | null => {\n  if (file.preview) return file.preview;\n  return NATIVE.has(file.extension) ? file.url : null;\n};\n\nexport const original = (file: Doc): string | null =>\n  NATIVE.has(file.extension) ? file.url : null;\n\nexport const megapixels = (file: Doc): string =>\n  file.width && file.height\n    ? `${file.width} \u00D7 ${file.height} (${((file.width * file.height) / 1e6).toFixed(1)} MP)`\n    : \"\";\n", "import { AlpineComponent } from \"alpinejs\";\nimport {\n  type Entry,\n  fromInput,\n  join,\n  type Picked,\n  pastedName,\n  walk,\n} from \"../storage/picked\";\nimport { csrfToken, pool, UploadError, uploadFile } from \"../storage/upload\";\nimport {\n  type Activity,\n  between,\n  children,\n  countFilters,\n  countIn,\n  crumbs,\n  type Doc,\n  DERIVED,\n  FILTERS,\n  type Filter,\n  firstError,\n  formatDuration,\n  formatSize,\n  humanLabel,\n  leaf,\n  megapixels,\n  memo,\n  numbered,\n  type Note,\n  original,\n  pinned,\n  type Required,\n  reconcile,\n  type Sort,\n  SORTS,\n  searching,\n  type View,\n  viewable,\n  visible,\n} from \"./model\";\n\nconst FILES_AT_ONCE = 3;\n\n// Thumbnails are made in the job queue; look again this often, this many times.\nconst POLL_MS = 4000;\n\nconst POLLS = 45;\n\nconst PREFERENCES = \"documents\";\n\nconst MOVING = \"application/x-furbnow-documents\";\n\n// How long the toast offering to undo a move or delete stays.\nconst UNDO_MS = 10000;\n\ntype Layout = \"grid\" | \"list\";\n\ntype Stage = \"panorama\" | \"image\" | \"pdf\" | \"video\" | \"audio\" | \"none\";\n\ninterface Payload {\n  files: Partial<Doc>[];\n  folders: string[];\n  activity?: Activity[];\n  labelled?: Record<string, string[]>;\n  required?: Required[];\n}\n\ninterface Change {\n  text: string;\n  pks: number[];\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  files: Doc[];\n  // Note rows are keyed by this too, so a reload that changed any file draws\n  // them again rather than reusing rows whose note was replaced\n  // (templates/AGENTS.md). File rows are keyed by their own `key`.\n  generation: number;\n  folders: string[];\n  activity: Activity[];\n  history: boolean;\n  required: Required[];\n  checklist: boolean;\n  waiving: string;\n  waiveReason: string;\n  change: Change | null;\n  changeTimer: number;\n  known: string[];\n  editable: boolean;\n  endpoint: string;\n  download: string;\n  folder: string | null;\n  query: string;\n  filter: Filter;\n  label: string;\n  uploader: string;\n  labelled: Record<string, string[]>;\n  sort: Sort;\n  layout: Layout;\n  tile: number;\n  selected: number[];\n  anchor: number | null;\n  open: number | null;\n  info: boolean;\n  full: boolean;\n  flat: boolean;\n  pinning: boolean;\n  draft: { x: number | null; y: number | null } | null;\n  noteText: string;\n  highlight: number | null;\n  renaming: string;\n  moveTo: string;\n  labelText: string;\n  renameText: string;\n  projectText: string;\n  confirming: boolean;\n  busy: boolean;\n  error: string;\n  broken: number[];\n  polls: number;\n  timer: number;\n  over: boolean;\n  target: string;\n  dropFolder: string | null;\n  active: number;\n  done: number;\n  total: number;\n  failed: string[];\n  lastFocus: HTMLElement | null;\n  // Remembered answers (model.memo): a render asks for these many times over.\n  shownFor: (\n    files: Doc[],\n    folder: string | null,\n    query: string,\n    filter: Filter,\n    label: string,\n    uploader: string,\n    sort: Sort,\n  ) => Doc[];\n  countsFor: (\n    files: Doc[],\n    folder: string | null,\n    query: string,\n    label: string,\n    uploader: string,\n  ) => Map<Filter, number>;\n  chosen: (selected: number[]) => Set<number>;\n\n  init(): void;\n  destroy(): void;\n  remember(): void;\n  load(payload: Payload): void;\n  poll(): void;\n  refresh(): Promise<void>;\n  view(): View;\n  readonly shown: Doc[];\n  readonly subfolders: string[];\n  filtering(): boolean;\n  readonly current: Doc | null;\n  readonly selection: Doc[];\n  readonly labelsInUse: string[];\n  readonly uploaders: string[];\n  folderLabels(): string;\n  filterCount(filter: Filter): number;\n  filters(): [Filter, string][];\n  sorts(): [Sort, string][];\n  crumbs(): [string, string][];\n  folderCount(path: string): number;\n  depth(path: string): number;\n  leaf(path: string): string;\n  isOpen(path: string | null): boolean;\n  go(folder: string | null): void;\n  clearFilters(): void;\n  isSelected(pk: number): boolean;\n  pick(file: Doc, event: MouseEvent): void;\n  allSelected(): boolean;\n  toggleAll(): void;\n  clear(): void;\n  downloadSelected(): void;\n  show(file: Doc): void;\n  close(): void;\n  step(by: number): void;\n  position(): string;\n  stage(): Stage;\n  image(): string | null;\n  hasOriginal(): boolean;\n  pins(): Note[];\n  pinNumber(note: Note): number;\n  keydown(event: KeyboardEvent): void;\n  post(fields: [string, string | File][]): Promise<boolean>;\n  rename(): Promise<void>;\n  move(pks: number[], folder: string): Promise<void>;\n  renameAll(pks: number[], base: string): Promise<void>;\n  moveToProject(pks: number[], project: string): Promise<void>;\n  addLabel(pks: number[], text: string): Promise<void>;\n  removeLabel(pks: number[], label: string): Promise<void>;\n  setShared(pks: number[], shared: boolean): Promise<void>;\n  remove(pks: number[]): Promise<void>;\n  changed(before: Set<number>, verb: string): void;\n  undo(pks: number[]): Promise<void>;\n  activityOf(file: Doc): Activity[];\n  missing(): number;\n  due(): number;\n  requirement(row: Required): string;\n  stateOf(row: Required): string;\n  openFolder(row: Required): void;\n  waive(row: Required): Promise<void>;\n  unwaive(row: Required): Promise<void>;\n  place(point: [number, number] | null): void;\n  addNote(): Promise<void>;\n  removeNote(note: Note): Promise<void>;\n  newVersion(event: Event): Promise<void>;\n  dragStart(file: Doc, event: DragEvent): void;\n  dragOver(folder: string, event: DragEvent): void;\n  dropOn(folder: string, event: DragEvent): void;\n  status(): string;\n  where(event: Event): string;\n  dragging(event: DragEvent): void;\n  left(event: DragEvent): void;\n  dropped(event: DragEvent): void;\n  pasted(event: ClipboardEvent): void;\n  picked(event: Event): void;\n  leaving(event: BeforeUnloadEvent): void;\n  send(picked: Picked[], target: string): Promise<void>;\n  count(count: number): string;\n  human(label: string): string;\n  size(file: Doc): string;\n  length(file: Doc): string;\n  dimensions(file: Doc): string;\n  date(iso: string | null): string;\n  dateTime(iso: string | null): string;\n  icon(file: Doc): string;\n  thumbnail(file: Doc): string | null;\n}\n\nconst hasFiles = (event: DragEvent): boolean =>\n  event.dataTransfer?.types.includes(\"Files\") ?? false;\n\n// A focused video or audio player takes the arrows, to seek.\nconst seeking = (event: KeyboardEvent): boolean =>\n  event.target instanceof HTMLMediaElement && event.key.startsWith(\"Arrow\");\n\nconst typing = (target: EventTarget | null): boolean =>\n  target instanceof HTMLElement &&\n  (target.isContentEditable ||\n    [\"INPUT\", \"SELECT\", \"TEXTAREA\"].includes(target.tagName));\n\nconst DATE = new Intl.DateTimeFormat(\"en-GB\", {\n  day: \"numeric\",\n  month: \"short\",\n  year: \"numeric\",\n});\n\nconst DATE_TIME = new Intl.DateTimeFormat(\"en-GB\", {\n  day: \"numeric\",\n  month: \"short\",\n  year: \"numeric\",\n  hour: \"2-digit\",\n  minute: \"2-digit\",\n});\n\nconst ICONS: Record<string, string> = {\n  pdf: \"bg-red-50 text-red-600\",\n  image: \"bg-sky-50 text-sky-600\",\n  video: \"bg-violet-50 text-violet-600\",\n  audio: \"bg-fuchsia-50 text-fuchsia-600\",\n  spreadsheet: \"bg-emerald-50 text-emerald-600\",\n  document: \"bg-blue-50 text-blue-600\",\n  drawing: \"bg-amber-50 text-amber-600\",\n  archive: \"bg-stone-100 text-stone-600\",\n  other: \"bg-gray-100 text-gray-500\",\n};\n\nconst memoShown = (\n  files: Doc[],\n  folder: string | null,\n  query: string,\n  filter: Filter,\n  label: string,\n  uploader: string,\n  sort: Sort,\n): Doc[] => visible(files, { folder, query, filter, label, uploader, sort });\n\nconst memoCounts = (\n  files: Doc[],\n  folder: string | null,\n  query: string,\n  label: string,\n  uploader: string,\n): Map<Filter, number> =>\n  countFilters(files, {\n    folder,\n    query,\n    filter: \"\",\n    label,\n    uploader,\n    sort: \"newest\",\n  });\n\nexport default (): AlpineComponent<State> => ({\n  files: [],\n  generation: 0,\n  folders: [],\n  activity: [],\n  history: false,\n  required: [],\n  checklist: false,\n  waiving: \"\",\n  waiveReason: \"\",\n  change: null,\n  changeTimer: 0,\n  known: [],\n  editable: false,\n  endpoint: \"\",\n  download: \"\",\n  folder: null,\n  query: \"\",\n  filter: \"\",\n  label: \"\",\n  uploader: \"\",\n  labelled: {},\n  sort: \"newest\",\n  layout: \"grid\",\n  tile: 180,\n  selected: [],\n  anchor: null,\n  open: null,\n  info: true,\n  full: false,\n  flat: false,\n  pinning: false,\n  draft: null,\n  noteText: \"\",\n  highlight: null,\n  renaming: \"\",\n  moveTo: \"\",\n  labelText: \"\",\n  renameText: \"\",\n  projectText: \"\",\n  confirming: false,\n  busy: false,\n  error: \"\",\n  broken: [],\n  polls: 0,\n  timer: 0,\n  over: false,\n  target: \"\",\n  dropFolder: null,\n  active: 0,\n  done: 0,\n  total: 0,\n  failed: [],\n  lastFocus: null,\n  shownFor: memo(memoShown),\n  countsFor: memo(memoCounts),\n  chosen: memo((selected: number[]) => new Set(selected)),\n\n  init() {\n    const data = this.$el.dataset;\n    this.editable = data[\"editable\"] === \"true\";\n    this.endpoint = data[\"endpoint\"] ?? \"\";\n    this.download = data[\"download\"] ?? \"\";\n    this.known = JSON.parse(data[\"labels\"] ?? \"[]\") as string[];\n    // On a phone the details would cover the photo.\n    this.info = window.matchMedia(\"(min-width: 768px)\").matches;\n    this.load(JSON.parse(data[\"documents\"] ?? \"{}\") as Payload);\n    this.checklist = this.missing() > 0;\n\n    try {\n      const saved = JSON.parse(\n        localStorage.getItem(PREFERENCES) ?? \"{}\",\n      ) as Partial<State>;\n      if (saved.layout === \"grid\" || saved.layout === \"list\") {\n        this.layout = saved.layout;\n      }\n      if (SORTS.some(([sort]) => sort === saved.sort)) {\n        this.sort = saved.sort as Sort;\n      }\n      if (typeof saved.tile === \"number\") this.tile = saved.tile;\n      if (typeof saved.info === \"boolean\") this.info = saved.info;\n    } catch {\n      // Private windows can refuse storage; the defaults do.\n    }\n    this.$watch(\"layout\", () => this.remember());\n    this.$watch(\"sort\", () => this.remember());\n    this.$watch(\"tile\", () => this.remember());\n    this.$watch(\"info\", () => this.remember());\n\n    const linked = Number(\n      new URLSearchParams(location.hash.slice(1)).get(\"file\"),\n    );\n    const file = this.files.find((candidate) => candidate.pk === linked);\n    if (file) this.show(file);\n  },\n\n  destroy() {\n    window.clearTimeout(this.timer);\n    window.clearTimeout(this.changeTimer);\n  },\n\n  remember() {\n    try {\n      localStorage.setItem(\n        PREFERENCES,\n        JSON.stringify({\n          layout: this.layout,\n          sort: this.sort,\n          tile: this.tile,\n          info: this.info,\n        }),\n      );\n    } catch {\n      // As above.\n    }\n  },\n\n  load(payload: Payload) {\n    // Only what changed is assigned, so a poll that finds nothing new\n    // redraws nothing.\n    const before = this.files;\n    const files = reconcile(before, payload.files ?? []);\n    if (\n      files.length !== before.length ||\n      files.some((file, index) => file !== before[index])\n    ) {\n      this.files = files;\n      this.generation++;\n    }\n    if (payload.activity) this.activity = payload.activity;\n    if (payload.labelled) this.labelled = payload.labelled;\n    if (payload.required) this.required = payload.required;\n    const folders = payload.folders ?? [];\n    if (JSON.stringify(folders) !== JSON.stringify(this.folders)) {\n      this.folders = folders;\n    }\n    const pks = new Set(this.files.map((file) => file.pk));\n    if (this.selected.some((pk) => !pks.has(pk))) {\n      this.selected = this.selected.filter((pk) => pks.has(pk));\n    }\n    if (this.open !== null && !pks.has(this.open)) this.close();\n    if (this.folder && !this.folders.includes(this.folder)) this.folder = null;\n    this.poll();\n  },\n\n  poll() {\n    window.clearTimeout(this.timer);\n    const waiting = this.files.some(\n      (file) => file.pending && DERIVED.has(file.kind),\n    );\n    if (waiting && this.endpoint && this.polls < POLLS) {\n      this.timer = window.setTimeout(() => {\n        this.polls++;\n        void this.refresh();\n      }, POLL_MS);\n    }\n  },\n\n  async refresh() {\n    if (!this.endpoint) return;\n    const response = await fetch(this.endpoint, {\n      headers: { Accept: \"application/json\" },\n    }).catch(() => null);\n    if (response?.ok) this.load((await response.json()) as Payload);\n  },\n\n  view(): View {\n    return {\n      folder: this.folder,\n      query: this.query,\n      filter: this.filter,\n      label: this.label,\n      uploader: this.uploader,\n      sort: this.sort,\n    };\n  },\n\n  get shown(): Doc[] {\n    // Each one read here, so Alpine tracks them even when the answer is\n    // remembered.\n    return this.shownFor(\n      this.files,\n      this.folder,\n      this.query,\n      this.filter,\n      this.label,\n      this.uploader,\n      this.sort,\n    );\n  },\n\n  filtering(): boolean {\n    return searching(this.view());\n  },\n\n  get subfolders(): string[] {\n    if (this.folder === null || searching(this.view())) return [];\n    return children(this.folders, this.folder);\n  },\n\n  get current(): Doc | null {\n    return this.files.find((file) => file.pk === this.open) ?? null;\n  },\n\n  get selection(): Doc[] {\n    const chosen = this.chosen(this.selected);\n    return this.files.filter((file) => chosen.has(file.pk));\n  },\n\n  get labelsInUse(): string[] {\n    return [...new Set(this.files.flatMap((file) => file.labels))].sort();\n  },\n\n  get uploaders(): string[] {\n    return [...new Set(this.files.map((file) => file.user))]\n      .filter(Boolean)\n      .sort();\n  },\n\n  // What a file put in the folder being browsed is labelled.\n  folderLabels(): string {\n    const labels = this.folder ? this.labelled[this.folder] : undefined;\n    return labels ? labels.map(humanLabel).join(\" \u00B7 \") : \"\";\n  },\n\n  // Chips count the whole of the folder being browsed.\n  filterCount(filter: Filter): number {\n    const counts = this.countsFor(\n      this.files,\n      this.folder,\n      this.query,\n      this.label,\n      this.uploader,\n    );\n    return counts.get(filter) ?? 0;\n  },\n\n  filters(): [Filter, string][] {\n    return FILTERS.filter(\n      ([filter]) =>\n        filter === \"\" || filter === this.filter || this.filterCount(filter) > 0,\n    );\n  },\n\n  sorts(): [Sort, string][] {\n    return SORTS;\n  },\n\n  crumbs(): [string, string][] {\n    return crumbs(this.folder ?? \"\");\n  },\n\n  folderCount(path: string): number {\n    return countIn(this.files, path);\n  },\n\n  depth(path: string): number {\n    return path.split(\"/\").length - 1;\n  },\n\n  leaf(path: string): string {\n    return leaf(path);\n  },\n\n  isOpen(path: string | null): boolean {\n    return this.folder === path;\n  },\n\n  go(folder: string | null) {\n    this.folder = folder;\n    this.query = \"\";\n  },\n\n  clearFilters() {\n    this.query = \"\";\n    this.filter = \"\";\n    this.label = \"\";\n    this.uploader = \"\";\n  },\n\n  isSelected(pk: number): boolean {\n    return this.chosen(this.selected).has(pk);\n  },\n\n  pick(file: Doc, event: MouseEvent) {\n    if (event.shiftKey && this.anchor !== null) {\n      const run = between(\n        this.shown.map((each) => each.pk),\n        this.anchor,\n        file.pk,\n      );\n      this.selected = [...new Set([...this.selected, ...run])];\n    } else if (this.isSelected(file.pk)) {\n      this.selected = this.selected.filter((pk) => pk !== file.pk);\n    } else {\n      this.selected = [...this.selected, file.pk];\n    }\n    this.anchor = file.pk;\n  },\n\n  allSelected(): boolean {\n    const shown = this.shown;\n    return shown.length > 0 && shown.every((file) => this.isSelected(file.pk));\n  },\n\n  toggleAll() {\n    const shown = this.shown.map((file) => file.pk);\n    this.selected = this.allSelected()\n      ? this.selected.filter((pk) => !shown.includes(pk))\n      : [...new Set([...this.selected, ...shown])];\n  },\n\n  clear() {\n    this.selected = [];\n    this.anchor = null;\n    this.confirming = false;\n  },\n\n  // Posted, as a page's form would be: hundreds of pks in a URL would be\n  // longer than the server reads.\n  downloadSelected() {\n    const form = document.createElement(\"form\");\n    form.method = \"POST\";\n    form.action = this.download;\n    form.hidden = true;\n    const fields = {\n      csrfmiddlewaretoken: csrfToken(\n        this.$root.querySelector(\"form\") ?? document.createElement(\"form\"),\n      ),\n      files: this.selected.join(\",\"),\n    };\n    for (const [name, value] of Object.entries(fields)) {\n      const input = document.createElement(\"input\");\n      input.type = \"hidden\";\n      input.name = name;\n      input.value = value;\n      form.append(input);\n    }\n    document.body.append(form);\n    form.submit();\n    form.remove();\n  },\n\n  show(file: Doc) {\n    if (this.open === null) {\n      this.lastFocus =\n        document.activeElement instanceof HTMLElement\n          ? document.activeElement\n          : null;\n    }\n    this.open = file.pk;\n    this.full = false;\n    this.flat = false;\n    this.pinning = false;\n    this.draft = null;\n    this.noteText = \"\";\n    this.highlight = null;\n    this.confirming = false;\n    this.renaming = file.filename;\n    this.moveTo = file.folder;\n    history.replaceState(null, \"\", `#file=${file.pk}`);\n    this.$nextTick(() => {\n      document\n        .querySelector(`[data-strip=\"${file.pk}\"]`)\n        ?.scrollIntoView({ block: \"nearest\", inline: \"center\" });\n      (this.$refs[\"viewer\"] as HTMLElement | undefined)?.focus();\n    });\n  },\n\n  close() {\n    this.open = null;\n    this.pinning = false;\n    this.draft = null;\n    this.confirming = false;\n    history.replaceState(null, \"\", location.pathname + location.search);\n    this.lastFocus?.focus();\n  },\n\n  step(by: number) {\n    const shown = this.shown;\n    if (shown.length === 0) return;\n    const index = shown.findIndex((file) => file.pk === this.open);\n    const next = shown[(index + by + shown.length) % shown.length];\n    if (next) this.show(next);\n  },\n\n  position(): string {\n    const shown = this.shown;\n    const index = shown.findIndex((file) => file.pk === this.open);\n    return index === -1 ? \"\" : `${index + 1} of ${shown.length}`;\n  },\n\n  stage(): Stage {\n    const file = this.current;\n    if (!file) return \"none\";\n    if (file.kind === \"image\" && viewable(file)) {\n      return file.panorama && !this.flat ? \"panorama\" : \"image\";\n    }\n    if (file.kind === \"pdf\") return \"pdf\";\n    if (file.kind === \"video\") return \"video\";\n    if (file.kind === \"audio\") return \"audio\";\n    return \"none\";\n  },\n\n  image(): string | null {\n    const file = this.current;\n    if (!file) return null;\n    if (this.stage() === \"panorama\" && file.preview) {\n      return file.preview.replace(\"variant=preview\", \"variant=panorama\");\n    }\n    return (this.full && original(file)) || viewable(file);\n  },\n\n  hasOriginal(): boolean {\n    const file = this.current;\n    return Boolean(file?.preview && original(file));\n  },\n\n  pins(): Note[] {\n    return this.current ? pinned(this.current) : [];\n  },\n\n  pinNumber(note: Note): number {\n    return this.pins().indexOf(note) + 1;\n  },\n\n  keydown(event: KeyboardEvent) {\n    if (this.open !== null) {\n      if (typing(event.target)) {\n        if (event.key === \"Escape\") (event.target as HTMLElement).blur();\n        return;\n      }\n      if (seeking(event)) return;\n      const keys: Record<string, () => void> = {\n        Escape: () => {\n          if (this.pinning || this.draft) {\n            this.pinning = false;\n            this.draft = null;\n          } else {\n            this.close();\n          }\n        },\n        ArrowLeft: () => this.step(-1),\n        ArrowRight: () => this.step(1),\n        i: () => {\n          this.info = !this.info;\n        },\n        p: () => {\n          if (this.editable && this.stage() !== \"none\") {\n            this.pinning = !this.pinning;\n          }\n        },\n      };\n      const handler = keys[event.key];\n      if (handler && !event.metaKey && !event.ctrlKey && !event.altKey) {\n        event.preventDefault();\n        handler();\n      }\n      return;\n    }\n    if (typing(event.target)) return;\n    if (event.key === \"/\") {\n      event.preventDefault();\n      (this.$refs[\"search\"] as HTMLInputElement | undefined)?.focus();\n    } else if (event.key === \"Escape\") {\n      this.clear();\n    } else if (\n      event.key === \"a\" &&\n      (event.metaKey || event.ctrlKey) &&\n      (this.editable || this.download)\n    ) {\n      event.preventDefault();\n      this.selected = this.shown.map((file) => file.pk);\n    }\n  },\n\n  async post(fields: [string, string | File][]): Promise<boolean> {\n    const csrf = csrfToken(\n      this.$root.querySelector(\"form\") ?? document.createElement(\"form\"),\n    );\n    const body = new FormData();\n    body.append(\"csrfmiddlewaretoken\", csrf);\n    for (const [key, value] of fields) body.append(key, value);\n    this.busy = true;\n    this.error = \"\";\n    const response = await fetch(this.endpoint, {\n      method: \"POST\",\n      body,\n      headers: { Accept: \"application/json\", \"X-CSRFToken\": csrf },\n    }).catch(() => null);\n    this.busy = false;\n    if (!response?.ok) {\n      const refused =\n        response?.status === 400\n          ? firstError(await response.json().catch(() => null))\n          : \"\";\n      this.error =\n        refused || \"That didn't save. Check your connection and try again.\";\n      return false;\n    }\n    this.load((await response.json()) as Payload);\n    return true;\n  },\n\n  async rename() {\n    const file = this.current;\n    const name = this.renaming.trim();\n    if (!file || !name || name === file.filename) return;\n    await this.post([\n      [\"rename[0][0]\", String(file.pk)],\n      [\"rename[0][1]\", name],\n    ]);\n    this.renaming = this.current?.filename ?? name;\n  },\n\n  async move(pks: number[], folder: string) {\n    const before = new Set(this.activity.map((row) => row.pk));\n    if (\n      await this.post(\n        pks.flatMap((pk, index): [string, string][] => [\n          [`folder[${index}][0]`, String(pk)],\n          [`folder[${index}][1]`, folder],\n        ]),\n      )\n    ) {\n      this.changed(before, \"Moved\");\n    }\n  },\n\n  async renameAll(pks: number[], base: string) {\n    const name = base.trim();\n    if (!name) return;\n    const chosen = new Set(pks);\n    const order = this.shown\n      .map((file) => file.pk)\n      .filter((pk) => chosen.has(pk));\n    const named = numbered(name, order);\n    if (\n      await this.post(\n        named.flatMap(([pk, each], index): [string, string][] => [\n          [`rename[${index}][0]`, String(pk)],\n          [`rename[${index}][1]`, each],\n        ]),\n      )\n    ) {\n      this.renameText = \"\";\n    }\n  },\n\n  async moveToProject(pks: number[], project: string) {\n    if (!project.trim()) return;\n    const before = new Set(this.activity.map((row) => row.pk));\n    if (\n      await this.post([\n        ...pks.map((pk, index): [string, string] => [\n          `transfer[${index}]`,\n          String(pk),\n        ]),\n        [\"transfer_to\", project.trim()],\n      ])\n    ) {\n      this.projectText = \"\";\n      this.selected = this.selected.filter((pk) => !pks.includes(pk));\n      this.changed(before, `Moved to ${project.trim().toUpperCase()}:`);\n    }\n  },\n\n  async addLabel(pks: number[], text: string) {\n    if (!text.trim()) return;\n    await this.post(\n      pks.flatMap((pk, index): [string, string][] => [\n        [`add_label[${index}][0]`, String(pk)],\n        [`add_label[${index}][1]`, text.trim()],\n      ]),\n    );\n    this.labelText = \"\";\n  },\n\n  async removeLabel(pks: number[], label: string) {\n    await this.post(\n      pks.flatMap((pk, index): [string, string][] => [\n        [`remove_label[${index}][0]`, String(pk)],\n        [`remove_label[${index}][1]`, label],\n      ]),\n    );\n  },\n\n  async setShared(pks: number[], shared: boolean) {\n    await this.post(\n      pks.map((pk, index): [string, string] => [\n        `${shared ? \"share\" : \"hide\"}[${index}]`,\n        String(pk),\n      ]),\n    );\n  },\n\n  async remove(pks: number[]) {\n    const before = new Set(this.activity.map((row) => row.pk));\n    const removed = await this.post(\n      pks.map((pk, index): [string, string] => [\n        `remove[${index}]`,\n        String(pk),\n      ]),\n    );\n    if (removed) {\n      this.confirming = false;\n      this.selected = this.selected.filter((pk) => !pks.includes(pk));\n      this.changed(before, \"Deleted\");\n    }\n  },\n\n  // Offer to undo what the last post did.\n  changed(before: Set<number>, verb: string) {\n    const pks = this.activity\n      .filter((row) => row.undoable && !before.has(row.pk))\n      .map((row) => row.pk);\n    window.clearTimeout(this.changeTimer);\n    this.change = pks.length\n      ? { text: `${verb} ${this.count(pks.length)}.`, pks }\n      : null;\n    if (this.change) {\n      this.changeTimer = window.setTimeout(() => {\n        this.change = null;\n      }, UNDO_MS);\n    }\n  },\n\n  async undo(pks: number[]) {\n    window.clearTimeout(this.changeTimer);\n    this.change = null;\n    await this.post(\n      pks.map((pk, index): [string, string] => [`undo[${index}]`, String(pk)]),\n    );\n  },\n\n  activityOf(file: Doc): Activity[] {\n    return this.activity.filter((row) => row.upload === file.pk);\n  },\n\n  missing(): number {\n    return this.required.filter((row) => row.state === \"missing\").length;\n  },\n\n  // What's needed by now: met, waived or missing.\n  due(): number {\n    return this.required.filter((row) => row.state !== \"later\").length;\n  },\n\n  requirement(row: Required): string {\n    return `${row.key}|${row.measure}`;\n  },\n\n  stateOf(row: Required): string {\n    if (row.state === \"waived\") {\n      return `Not needed: ${row.reason}${row.waived_by ? ` (${row.waived_by})` : \"\"}`;\n    }\n    if (row.state === \"later\") return `Later, for ${row.step.toLowerCase()}`;\n    return `For ${row.step.toLowerCase()}`;\n  },\n\n  openFolder(row: Required) {\n    this.clearFilters();\n    this.go(row.folder);\n  },\n\n  async waive(row: Required) {\n    const reason = this.waiveReason.trim();\n    if (!reason) return;\n    if (\n      await this.post([\n        [\"waive[0][0]\", row.key],\n        [\"waive[0][1]\", row.measure],\n        [\"waive[0][2]\", reason],\n      ])\n    ) {\n      this.waiving = \"\";\n      this.waiveReason = \"\";\n    }\n  },\n\n  async unwaive(row: Required) {\n    await this.post([\n      [\"unwaive[0][0]\", row.key],\n      [\"unwaive[0][1]\", row.measure],\n    ]);\n  },\n\n  place(point: [number, number] | null) {\n    if (!this.pinning || !point) return;\n    const [x, y] = point;\n    this.draft = { x, y };\n    this.pinning = false;\n    this.info = true;\n    this.$nextTick(() =>\n      (this.$refs[\"note\"] as HTMLTextAreaElement | undefined)?.focus(),\n    );\n  },\n\n  async addNote() {\n    const file = this.current;\n    const text = this.noteText.trim();\n    if (!file || !text) return;\n    const fields: [string, string][] = [\n      [\"note[0][0]\", String(file.pk)],\n      [\"note[0][1]\", text],\n    ];\n    if (this.draft?.x != null && this.draft.y != null) {\n      fields.push([\"note[0][2]\", String(this.draft.x)]);\n      fields.push([\"note[0][3]\", String(this.draft.y)]);\n    }\n    if (await this.post(fields)) {\n      this.noteText = \"\";\n      this.draft = null;\n    }\n  },\n\n  async removeNote(note: Note) {\n    await this.post([[\"unnote[0]\", String(note.pk)]]);\n  },\n\n  async newVersion(event: Event) {\n    const input = event.target as HTMLInputElement;\n    const file = input.files?.[0];\n    const current = this.current;\n    input.value = \"\";\n    if (!file || !current) return;\n    const csrf = csrfToken(\n      this.$root.querySelector(\"form\") ?? document.createElement(\"form\"),\n    );\n    this.busy = true;\n    let value: string | File = file;\n    try {\n      value = await uploadFile(file, csrf);\n    } catch (error) {\n      if (!(error instanceof UploadError && error.unavailable)) {\n        this.busy = false;\n        this.error = `Couldn't upload ${file.name}.`;\n        return;\n      }\n    }\n    const before = new Set(this.files.map((each) => each.pk));\n    if (\n      await this.post([\n        [\"replaces\", String(current.pk)],\n        [\"new_version\", value],\n      ])\n    ) {\n      // The new version takes the old one's place; follow it.\n      const added = this.files.find((each) => !before.has(each.pk));\n      if (added) this.show(added);\n    }\n  },\n\n  dragStart(file: Doc, event: DragEvent) {\n    if (!this.editable || !event.dataTransfer) return;\n    const pks = this.isSelected(file.pk) ? this.selected : [file.pk];\n    event.dataTransfer.setData(MOVING, JSON.stringify(pks));\n    event.dataTransfer.effectAllowed = \"move\";\n  },\n\n  dragOver(folder: string, event: DragEvent) {\n    if (event.dataTransfer?.types.includes(MOVING)) {\n      event.preventDefault();\n      event.dataTransfer.dropEffect = \"move\";\n      this.dropFolder = folder;\n    }\n  },\n\n  dropOn(folder: string, event: DragEvent) {\n    const raw = event.dataTransfer?.getData(MOVING);\n    this.dropFolder = null;\n    if (!raw) return;\n    event.preventDefault();\n    event.stopPropagation();\n    void this.move(JSON.parse(raw) as number[], folder);\n  },\n\n  status(): string {\n    if (this.active) {\n      return `Uploading ${this.done} of ${this.total} files\u2026`;\n    }\n    if (this.failed.length) {\n      return `Couldn't upload ${this.failed.join(\", \")}. Try those again.`;\n    }\n    return \"\";\n  },\n\n  // The folder under the pointer, else the one being browsed.\n  where(event: Event): string {\n    const target =\n      event.target instanceof Element\n        ? event.target.closest<HTMLElement>(\"[data-folder]\")\n        : null;\n    if (target) return target.dataset[\"folder\"] ?? \"\";\n    return this.folder ?? \"\";\n  },\n\n  dragging(event: DragEvent) {\n    if (!this.editable || !hasFiles(event)) return;\n    event.preventDefault();\n    this.over = true;\n    this.target = this.where(event);\n  },\n\n  left(event: DragEvent) {\n    if (event.relatedTarget === null) this.over = false;\n  },\n\n  dropped(event: DragEvent) {\n    if (!this.editable || !hasFiles(event) || event.defaultPrevented) return;\n    event.preventDefault();\n    this.over = false;\n    const target = this.where(event);\n    // Entries must be taken before the handler returns; the drop's\n    // DataTransfer is emptied afterwards.\n    const entries = [...(event.dataTransfer?.items ?? [])]\n      .filter((item) => item.kind === \"file\")\n      .map((item) => item.webkitGetAsEntry() as Entry | null);\n    const files = [...(event.dataTransfer?.files ?? [])];\n    if (entries.length && entries.every(Boolean)) {\n      void Promise.all(entries.map((entry) => walk(entry as Entry))).then(\n        (nested) => this.send(nested.flat(), target),\n      );\n    } else {\n      void this.send(\n        files.map((file) => ({ file, folder: \"\" })),\n        target,\n      );\n    }\n  },\n\n  pasted(event: ClipboardEvent) {\n    if (!this.editable || typing(event.target)) return;\n    const files = [...(event.clipboardData?.files ?? [])];\n    if (files.length === 0) return;\n    event.preventDefault();\n    const now = new Date();\n    void this.send(\n      files.map((file) => ({ file: pastedName(file, now), folder: \"\" })),\n      this.folder ?? \"\",\n    );\n  },\n\n  picked(event: Event) {\n    const input = event.target;\n    if (!(input instanceof HTMLInputElement)) return;\n    void this.send(fromInput([...(input.files ?? [])]), this.folder ?? \"\");\n    input.value = \"\";\n  },\n\n  leaving(event: BeforeUnloadEvent) {\n    if (this.active) {\n      event.preventDefault();\n      event.returnValue = \"\";\n    }\n  },\n\n  async send(picked: Picked[], target: string) {\n    if (picked.length === 0) return;\n    const csrf = csrfToken(\n      this.$root.querySelector(\"form\") ?? document.createElement(\"form\"),\n    );\n    this.active++;\n    this.total += picked.length;\n    this.failed = [];\n    let direct = true;\n    const sent = await pool(picked, FILES_AT_ONCE, async ({ file, folder }) => {\n      let value: string | File = file;\n      if (direct) {\n        try {\n          value = await uploadFile(file, csrf);\n        } catch (error) {\n          // No bucket (e.g. signed out of it): post the file itself instead.\n          if (error instanceof UploadError && error.unavailable) {\n            direct = false;\n          } else {\n            this.failed = [...this.failed, file.name];\n            this.done++;\n            return null;\n          }\n        }\n      }\n      this.done++;\n      return { name: file.name, value, path: join(target, folder) };\n    });\n\n    const items = sent.filter((item) => item !== null);\n    if (items.length) {\n      this.polls = 0;\n      const saved = await this.post(\n        items.flatMap((item): [string, string | File][] => [\n          [\"file\", item.value],\n          [\"path\", item.path],\n        ]),\n      );\n      if (!saved) {\n        this.failed = [...this.failed, ...items.map((item) => item.name)];\n      }\n    }\n    this.active--;\n    if (this.active === 0) {\n      this.done = 0;\n      this.total = 0;\n    }\n  },\n\n  count(count: number): string {\n    return `${count} ${count === 1 ? \"file\" : \"files\"}`;\n  },\n\n  human(label: string): string {\n    return humanLabel(label);\n  },\n\n  size(file: Doc): string {\n    return formatSize(file.size);\n  },\n\n  length(file: Doc): string {\n    return formatDuration(file.duration);\n  },\n\n  dimensions(file: Doc): string {\n    return megapixels(file);\n  },\n\n  date(iso: string | null): string {\n    return iso ? DATE.format(new Date(iso)) : \"\";\n  },\n\n  dateTime(iso: string | null): string {\n    return iso ? DATE_TIME.format(new Date(iso)) : \"\";\n  },\n\n  icon(file: Doc): string {\n    return ICONS[file.kind] ?? ICONS[\"other\"] ?? \"\";\n  },\n\n  thumbnail(file: Doc): string | null {\n    return this.broken.includes(file.pk) ? null : file.thumbnail;\n  },\n});\n", "// Looking out from the middle of an equirectangular photo. Yaw turns right,\n// pitch looks up, both in radians; the camera looks down -z with +y up.\n// A point on the photo is (u, v) in [0, 1], left to right and top to bottom.\n\nexport interface Camera {\n  yaw: number;\n  pitch: number;\n  // Vertical field of view, in radians.\n  fov: number;\n  aspect: number;\n}\n\ntype Vec = [number, number, number];\n\nconst pitched = ([x, y, z]: Vec, angle: number): Vec => [\n  x,\n  y * Math.cos(angle) - z * Math.sin(angle),\n  y * Math.sin(angle) + z * Math.cos(angle),\n];\n\nconst yawed = ([x, y, z]: Vec, angle: number): Vec => [\n  x * Math.cos(angle) - z * Math.sin(angle),\n  y,\n  x * Math.sin(angle) + z * Math.cos(angle),\n];\n\n// A screen point, in [-1, 1] with +y up, to where it lands on the photo.\nexport const toPhoto = (\n  camera: Camera,\n  sx: number,\n  sy: number,\n): [number, number] => {\n  const f = Math.tan(camera.fov / 2);\n  const [x, y, z] = yawed(\n    pitched([sx * camera.aspect * f, sy * f, -1], camera.pitch),\n    camera.yaw,\n  );\n  const length = Math.hypot(x, y, z);\n  const lon = Math.atan2(x, -z);\n  const lat = Math.asin(y / length);\n  return [0.5 + lon / (2 * Math.PI), 0.5 - lat / Math.PI];\n};\n\n// A point on the photo to the screen, or null when it's behind the camera.\nexport const toScreen = (\n  camera: Camera,\n  u: number,\n  v: number,\n): [number, number] | null => {\n  const lon = (u - 0.5) * 2 * Math.PI;\n  const lat = (0.5 - v) * Math.PI;\n  const world: Vec = [\n    Math.cos(lat) * Math.sin(lon),\n    Math.sin(lat),\n    -Math.cos(lat) * Math.cos(lon),\n  ];\n  const [x, y, z] = pitched(yawed(world, -camera.yaw), -camera.pitch);\n  if (z >= 0) return null;\n  const f = Math.tan(camera.fov / 2);\n  return [x / -z / (camera.aspect * f), y / -z / f];\n};\n\n// The same sum as `toPhoto`, per pixel.\nexport const FRAGMENT = `\nprecision highp float;\nvarying vec2 screen;\nuniform sampler2D photo;\nuniform float yaw;\nuniform float pitch;\nuniform float f;\nuniform float aspect;\nconst float PI = 3.14159265359;\nvoid main() {\n  vec3 d = vec3(screen.x * aspect * f, screen.y * f, -1.0);\n  d = vec3(d.x, d.y * cos(pitch) - d.z * sin(pitch), d.y * sin(pitch) + d.z * cos(pitch));\n  d = vec3(d.x * cos(yaw) - d.z * sin(yaw), d.y, d.x * sin(yaw) + d.z * cos(yaw));\n  d = normalize(d);\n  float u = 0.5 + atan(d.x, -d.z) / (2.0 * PI);\n  float v = 0.5 - asin(d.y) / PI;\n  gl_FragColor = texture2D(photo, vec2(u, v));\n}\n`;\n\nexport const VERTEX = `\nattribute vec2 corner;\nvarying vec2 screen;\nvoid main() {\n  screen = corner;\n  gl_Position = vec4(corner, 0.0, 1.0);\n}\n`;\n", "import { AlpineComponent } from \"alpinejs\";\nimport { type Camera, FRAGMENT, toPhoto, toScreen, VERTEX } from \"./sphere\";\n\nconst NARROWEST = (30 * Math.PI) / 180;\n\nconst WIDEST = (110 * Math.PI) / 180;\n\nconst TOP = Math.PI / 2 - 0.01;\n\n// Further than this and a press is a drag, not a click.\nconst SLOP = 5;\n\ninterface State extends Record<string | symbol, unknown> {\n  yaw: number;\n  pitch: number;\n  fov: number;\n  aspect: number;\n  loading: boolean;\n  failed: boolean;\n  dragged: boolean;\n  src: string;\n  gl: WebGLRenderingContext | null;\n  // One texture, refilled for each photo: a new one each time would hold on\n  // to every 8192px photo stepped past until the GPU ran out.\n  photo: WebGLTexture | null;\n  pointers: Map<number, { x: number; y: number }>;\n  start: { x: number; y: number } | null;\n  spread: number;\n  frame: number;\n  observer: ResizeObserver | null;\n  init(): void;\n  setup(): void;\n  destroy(): void;\n  camera(): Camera;\n  load(src: string | null): void;\n  texture(image: HTMLImageElement): void;\n  resize(): void;\n  draw(): void;\n  down(event: PointerEvent): void;\n  move(event: PointerEvent): void;\n  up(event: PointerEvent): void;\n  wheel(event: WheelEvent): void;\n  zoom(factor: number): void;\n  pick(event: MouseEvent): [number, number];\n  pinAt(x: number | null, y: number | null): string;\n}\n\nconst compile = (\n  gl: WebGLRenderingContext,\n  type: number,\n  source: string,\n): WebGLShader => {\n  const shader = gl.createShader(type);\n  if (!shader) throw new Error(\"No shader\");\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  return shader;\n};\n\nexport default (): AlpineComponent<State> => ({\n  yaw: 0,\n  pitch: 0,\n  fov: (75 * Math.PI) / 180,\n  aspect: 1,\n  loading: true,\n  failed: false,\n  dragged: false,\n  src: \"\",\n  gl: null,\n  photo: null,\n  pointers: new Map(),\n  start: null,\n  spread: 0,\n  frame: 0,\n  observer: null,\n\n  init() {\n    const canvas = this.$refs[\"canvas\"] as HTMLCanvasElement;\n    // The GPU can drop the context (another tab, a driver reset); waiting\n    // lets it come back, with the photo loaded again.\n    canvas.addEventListener(\"webglcontextlost\", (event) => {\n      event.preventDefault();\n      this.loading = true;\n    });\n    canvas.addEventListener(\"webglcontextrestored\", () => {\n      const src = this.src;\n      this.src = \"\";\n      this.setup();\n      this.load(src);\n    });\n    this.setup();\n    if (!this.gl) return;\n\n    this.observer = new ResizeObserver(() => this.resize());\n    this.observer.observe(canvas);\n    this.resize();\n  },\n\n  setup() {\n    const canvas = this.$refs[\"canvas\"] as HTMLCanvasElement;\n    const gl = canvas.getContext(\"webgl\", { preserveDrawingBuffer: false });\n    if (!gl) {\n      this.failed = true;\n      return;\n    }\n    const program = gl.createProgram();\n    gl.attachShader(program, compile(gl, gl.VERTEX_SHADER, VERTEX));\n    gl.attachShader(program, compile(gl, gl.FRAGMENT_SHADER, FRAGMENT));\n    gl.linkProgram(program);\n    gl.useProgram(program);\n    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());\n    gl.bufferData(\n      gl.ARRAY_BUFFER,\n      new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]),\n      gl.STATIC_DRAW,\n    );\n    const corner = gl.getAttribLocation(program, \"corner\");\n    gl.enableVertexAttribArray(corner);\n    gl.vertexAttribPointer(corner, 2, gl.FLOAT, false, 0, 0);\n\n    this.photo = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, this.photo);\n    // WebGL 1 takes any size of texture if it neither repeats nor mipmaps.\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    this.gl = gl;\n  },\n\n  destroy() {\n    this.observer?.disconnect();\n    cancelAnimationFrame(this.frame);\n    this.gl?.getExtension(\"WEBGL_lose_context\")?.loseContext();\n  },\n\n  camera(): Camera {\n    return {\n      yaw: this.yaw,\n      pitch: this.pitch,\n      fov: this.fov,\n      aspect: this.aspect,\n    };\n  },\n\n  load(src: string | null) {\n    if (!src || src === this.src || !this.gl) return;\n    this.src = src;\n    this.loading = true;\n    this.failed = false;\n    this.yaw = 0;\n    this.pitch = 0;\n    const image = new Image();\n    // The bucket answers with CORS headers, which WebGL needs to read it.\n    image.crossOrigin = \"anonymous\";\n    image.onload = () => {\n      if (this.src !== src) return;\n      this.texture(image);\n      this.loading = false;\n      this.draw();\n    };\n    image.onerror = () => {\n      if (this.src !== src) return;\n      this.loading = false;\n      this.failed = true;\n    };\n    image.src = src;\n  },\n\n  texture(image: HTMLImageElement) {\n    const gl = this.gl;\n    if (!gl) return;\n    const largest = gl.getParameter(gl.MAX_TEXTURE_SIZE) as number;\n    let source: TexImageSource = image;\n    if (image.naturalWidth > largest || image.naturalHeight > largest) {\n      const scale = largest / Math.max(image.naturalWidth, image.naturalHeight);\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = Math.floor(image.naturalWidth * scale);\n      canvas.height = Math.floor(image.naturalHeight * scale);\n      canvas\n        .getContext(\"2d\")\n        ?.drawImage(image, 0, 0, canvas.width, canvas.height);\n      source = canvas;\n    }\n    gl.bindTexture(gl.TEXTURE_2D, this.photo);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, source);\n  },\n\n  resize() {\n    const canvas = this.$refs[\"canvas\"] as HTMLCanvasElement;\n    const ratio = Math.min(window.devicePixelRatio || 1, 2);\n    canvas.width = Math.max(1, Math.floor(canvas.clientWidth * ratio));\n    canvas.height = Math.max(1, Math.floor(canvas.clientHeight * ratio));\n    this.aspect = canvas.width / canvas.height;\n    this.draw();\n  },\n\n  draw() {\n    cancelAnimationFrame(this.frame);\n    this.frame = requestAnimationFrame(() => {\n      const gl = this.gl;\n      if (!gl || this.loading) return;\n      const program = gl.getParameter(gl.CURRENT_PROGRAM) as WebGLProgram;\n      gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n      gl.uniform1f(gl.getUniformLocation(program, \"yaw\"), this.yaw);\n      gl.uniform1f(gl.getUniformLocation(program, \"pitch\"), this.pitch);\n      gl.uniform1f(gl.getUniformLocation(program, \"f\"), Math.tan(this.fov / 2));\n      gl.uniform1f(gl.getUniformLocation(program, \"aspect\"), this.aspect);\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n    });\n  },\n\n  down(event: PointerEvent) {\n    (event.currentTarget as Element).setPointerCapture(event.pointerId);\n    this.pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n    this.start = { x: event.clientX, y: event.clientY };\n    this.dragged = false;\n    if (this.pointers.size === 2) {\n      const [a, b] = [...this.pointers.values()];\n      this.spread = Math.hypot(a!.x - b!.x, a!.y - b!.y);\n    }\n  },\n\n  move(event: PointerEvent) {\n    const last = this.pointers.get(event.pointerId);\n    if (!last) return;\n    const point = { x: event.clientX, y: event.clientY };\n    this.pointers.set(event.pointerId, point);\n    if (\n      this.start &&\n      Math.hypot(point.x - this.start.x, point.y - this.start.y) > SLOP\n    ) {\n      this.dragged = true;\n    }\n    if (this.pointers.size === 2) {\n      const [a, b] = [...this.pointers.values()];\n      const spread = Math.hypot(a!.x - b!.x, a!.y - b!.y);\n      if (this.spread) this.zoom(this.spread / spread);\n      this.spread = spread;\n      return;\n    }\n    const canvas = this.$refs[\"canvas\"] as HTMLCanvasElement;\n    const perPixel = this.fov / canvas.clientHeight;\n    this.yaw -= (point.x - last.x) * perPixel;\n    this.pitch = Math.max(\n      -TOP,\n      Math.min(TOP, this.pitch + (point.y - last.y) * perPixel),\n    );\n    this.draw();\n  },\n\n  up(event: PointerEvent) {\n    this.pointers.delete(event.pointerId);\n    this.spread = 0;\n  },\n\n  wheel(event: WheelEvent) {\n    event.preventDefault();\n    this.zoom(Math.exp(event.deltaY * 0.001));\n  },\n\n  zoom(factor: number) {\n    this.fov = Math.max(NARROWEST, Math.min(WIDEST, this.fov * factor));\n    this.draw();\n  },\n\n  pick(event: MouseEvent): [number, number] {\n    const rect = (\n      this.$refs[\"canvas\"] as HTMLCanvasElement\n    ).getBoundingClientRect();\n    const sx = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n    const sy = 1 - ((event.clientY - rect.top) / rect.height) * 2;\n    const [u, v] = toPhoto(this.camera(), sx, sy);\n    return [(u + 1) % 1, v];\n  },\n\n  pinAt(x: number | null, y: number | null): string {\n    if (x === null || y === null || this.loading) return \"display: none\";\n    const screen = toScreen(this.camera(), x, y);\n    if (!screen) return \"display: none\";\n    const [sx, sy] = screen;\n    return `left: ${((sx + 1) / 2) * 100}%; top: ${((1 - sy) / 2) * 100}%`;\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\nconst MOST = 8;\n\nconst SLOP = 5;\n\ninterface Point {\n  x: number;\n  y: number;\n}\n\ninterface State extends Record<string | symbol, unknown> {\n  scale: number;\n  x: number;\n  y: number;\n  dragged: boolean;\n  pointers: Map<number, Point>;\n  start: Point | null;\n  spread: number;\n  reset(): void;\n  centre(event: { clientX: number; clientY: number }): Point;\n  zoomAt(point: Point, scale: number): void;\n  zoom(factor: number): void;\n  wheel(event: WheelEvent): void;\n  toggle(event: MouseEvent): void;\n  down(event: PointerEvent): void;\n  move(event: PointerEvent): void;\n  up(event: PointerEvent): void;\n  transform(): string;\n  counter(): string;\n  pick(event: MouseEvent): [number, number] | null;\n}\n\n// Pan and zoom an image with wheel, drag, pinch and double-click. The\n// pins sit inside the zoomed box, so they move with it; `counter` keeps them\n// the same size on screen.\nexport default (): AlpineComponent<State> => ({\n  scale: 1,\n  x: 0,\n  y: 0,\n  dragged: false,\n  pointers: new Map(),\n  start: null,\n  spread: 0,\n\n  reset() {\n    this.scale = 1;\n    this.x = 0;\n    this.y = 0;\n  },\n\n  // A pointer, relative to the middle of the stage.\n  centre(event: { clientX: number; clientY: number }): Point {\n    const rect = this.$root.getBoundingClientRect();\n    return {\n      x: event.clientX - rect.left - rect.width / 2,\n      y: event.clientY - rect.top - rect.height / 2,\n    };\n  },\n\n  zoomAt(point: Point, scale: number) {\n    const next = Math.max(1, Math.min(MOST, scale));\n    if (next === 1) {\n      this.reset();\n      return;\n    }\n    // Keep the point under the pointer where it is.\n    this.x = point.x - ((point.x - this.x) * next) / this.scale;\n    this.y = point.y - ((point.y - this.y) * next) / this.scale;\n    this.scale = next;\n  },\n\n  zoom(factor: number) {\n    this.zoomAt({ x: 0, y: 0 }, this.scale * factor);\n  },\n\n  wheel(event: WheelEvent) {\n    event.preventDefault();\n    this.zoomAt(\n      this.centre(event),\n      this.scale * Math.exp(-event.deltaY * 0.002),\n    );\n  },\n\n  toggle(event: MouseEvent) {\n    this.zoomAt(this.centre(event), this.scale > 1 ? 1 : 2.5);\n  },\n\n  down(event: PointerEvent) {\n    (event.currentTarget as Element).setPointerCapture(event.pointerId);\n    this.pointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n    this.start = { x: event.clientX, y: event.clientY };\n    this.dragged = false;\n    if (this.pointers.size === 2) {\n      const [a, b] = [...this.pointers.values()];\n      this.spread = Math.hypot(a!.x - b!.x, a!.y - b!.y);\n    }\n  },\n\n  move(event: PointerEvent) {\n    const last = this.pointers.get(event.pointerId);\n    if (!last) return;\n    const point = { x: event.clientX, y: event.clientY };\n    this.pointers.set(event.pointerId, point);\n    if (\n      this.start &&\n      Math.hypot(point.x - this.start.x, point.y - this.start.y) > SLOP\n    ) {\n      this.dragged = true;\n    }\n    if (this.pointers.size === 2) {\n      const [a, b] = [...this.pointers.values()];\n      const spread = Math.hypot(a!.x - b!.x, a!.y - b!.y);\n      const middle = this.centre({\n        clientX: (a!.x + b!.x) / 2,\n        clientY: (a!.y + b!.y) / 2,\n      });\n      if (this.spread) this.zoomAt(middle, (this.scale * spread) / this.spread);\n      this.spread = spread;\n      return;\n    }\n    if (this.scale > 1) {\n      this.x += point.x - last.x;\n      this.y += point.y - last.y;\n    }\n  },\n\n  up(event: PointerEvent) {\n    this.pointers.delete(event.pointerId);\n    this.spread = 0;\n  },\n\n  transform(): string {\n    return `transform: translate(${this.x}px, ${this.y}px) scale(${this.scale})`;\n  },\n\n  counter(): string {\n    return `scale(${1 / this.scale})`;\n  },\n\n  // Where on the image a click landed, as fractions of its size.\n  pick(event: MouseEvent): [number, number] | null {\n    const image = this.$refs[\"image\"] as HTMLImageElement | undefined;\n    if (!image) return null;\n    const rect = image.getBoundingClientRect();\n    const x = (event.clientX - rect.left) / rect.width;\n    const y = (event.clientY - rect.top) / rect.height;\n    return x >= 0 && x <= 1 && y >= 0 && y <= 1 ? [x, y] : null;\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  open: boolean;\n  top: number;\n  left: number;\n  bottom: number;\n  right: number;\n}\n\nexport default (): AlpineComponent<State> => ({\n  open: false,\n\n  top: 0,\n\n  left: 0,\n\n  bottom: 0,\n\n  right: 0,\n\n  trigger: {\n    [\"@click\"]() {\n      const { top, left, bottom, right } = this.$el.getBoundingClientRect();\n\n      this.top = top;\n      this.left = left;\n      this.bottom = bottom;\n      this.right = right;\n\n      this.open = !this.open;\n    },\n\n    [\"@click.outside\"]() {\n      this.open = false;\n    },\n\n    [\"@scroll.window\"]() {\n      this.open = false;\n    },\n  },\n\n  content: {\n    [\"x-show\"]() {\n      return this.open;\n    },\n\n    [\":style\"]() {\n      if (this.left < window.innerWidth / 2) {\n        if (this.top < window.innerHeight / 2) {\n          return {\n            top: this.bottom + 8 + \"px\",\n            left: this.left + \"px\",\n          };\n        }\n\n        return {\n          bottom: window.innerHeight - this.top + 8 + \"px\",\n          left: this.left + \"px\",\n        };\n      }\n\n      if (this.top < window.innerHeight / 2) {\n        return {\n          top: this.bottom + 8 + \"px\",\n          right: window.innerWidth - this.right + \"px\",\n        };\n      }\n\n      return {\n        bottom: window.innerHeight - this.top + 8 + \"px\",\n        right: window.innerWidth - this.right + \"px\",\n      };\n    },\n  },\n});\n", "import { AlpineComponent } from \"alpinejs\";\n\ninterface State extends Record<string | symbol, unknown> {\n  label: string | undefined;\n  value: string | undefined;\n}\n\nexport default (): AlpineComponent<State> => ({\n  label: undefined,\n  value: undefined,\n  click() {\n    this.value = this.$el.dataset[\"value\"];\n    this.label = this.$el.dataset[\"label\"];\n  },\n  selected() {\n    this.value = this.$el.dataset[\"value\"];\n    this.label = this.$el.dataset[\"label\"];\n  },\n  show() {\n    if (!this.label) return true;\n\n    const label = this.$el.dataset[\"label\"] ?? \"\";\n    return label.toLowerCase().includes(this.label.toLowerCase());\n  },\n});\n", "import \"htmx.org\";\nimport Alpine from \"alpinejs\";\nimport collapse from \"@alpinejs/collapse\";\nimport intersect from \"@alpinejs/intersect\";\nimport persist from \"@alpinejs/persist\";\n\nimport bucketUploads from \"./storage/forms\";\n\n// Alpine Components\nimport areaselect from \"./components/areaselect\";\nimport availability from \"./forms/availability\";\nimport buildpackChecklist from \"./buildpackChecklist\";\nimport buildpackshare from \"./components/buildpackshare\";\nimport clip from \"./components/clip\";\nimport calendar from \"./components/calendar\";\nimport chartbar from \"./system/chartbar\";\nimport chartpie from \"./system/chartpie\";\nimport date from \"./system/date\";\nimport combinedanalytics from \"./analytics/combined\";\nimport deliveryanalytics from \"./analytics/delivery\";\nimport pipelineanalytics from \"./analytics/pipeline\";\nimport salesanalytics from \"./analytics/sales\";\nimport datetimepicker from \"./components/datetimepicker\";\nimport designeditor from \"./design/editor\";\nimport designmenus from \"./design/menubar\";\nimport designstats from \"./design/stats\";\nimport designscenes from \"./design/scenestrip\";\nimport designcompare from \"./design/scenecompare\";\nimport designscenarios from \"./design/scenariocompare\";\nimport designworksheet from \"./design/worksheetview\";\nimport designdrawings from \"./design/sheets/dialog\";\nimport destroy from \"./components/destroy\";\nimport rename from \"./components/rename\";\nimport drop from \"./components/file/drop\";\nimport uploaddropzone from \"./components/uploaddropzone\";\nimport file from \"./forms/file\";\nimport hepscore from \"./components/hepscore\";\nimport linework from \"./components/linework\";\nimport hubspot from \"./tracking/hubspot\";\nimport nav from \"./system/nav\";\nimport palette from \"./system/palette\";\nimport notfound from \"./tracking/notfound\";\nimport notifications from \"./components/notifications\";\nimport plan from \"./suppliers/plan\";\nimport posthog from \"./tracking/posthog\";\nimport price from \"./price\";\nimport projecttags from \"./components/projecttags\";\nimport radio from \"./forms/radio\";\nimport buildpackplan from \"./components/buildpackplan\";\nimport buildpackproperty from \"./components/buildpackproperty\";\nimport buildpackv2 from \"./components/buildpackv2\";\nimport listeditor from \"./components/listeditor\";\nimport saveall from \"./components/saveall\";\nimport systemeditor from \"./components/systemeditor\";\nimport systemlibrary from \"./components/systemlibrary\";\nimport recorderHarness from \"./recorder/harness\";\nimport screenRecorder from \"./recorder/recorder\";\nimport sortable from \"./components/sortable\";\nimport stripe from \"./assessment/stripe\";\nimport tableselectall from \"./system/tableselectall\";\nimport taglists from \"./components/taglists\";\nimport tocScrollspy from \"./components/tocScrollspy\";\nimport contentsubmit from \"./components/contentsubmit\";\nimport copytoclipboard from \"./components/copytoclipboard\";\nimport coveragemap from \"./components/coveragemap\";\nimport tracking from \"./tracking/tracking\";\nimport upload from \"./components/upload\";\nimport dialog from \"./system/dialog\";\nimport documents from \"./documents/browser\";\nimport panorama from \"./documents/panorama\";\nimport zoomable from \"./documents/zoom\";\nimport dropdown from \"./system/dropdown\";\nimport command from \"./system/command\";\n\nAlpine.plugin(collapse);\nAlpine.plugin(intersect);\nAlpine.plugin(persist);\n\nAlpine.data(\"areaselect\", areaselect);\nAlpine.data(\"availability\", availability);\nAlpine.data(\"buildpackChecklist\", buildpackChecklist);\nAlpine.data(\"buildpackshare\", buildpackshare);\nAlpine.data(\"calendar\", calendar);\nAlpine.data(\"clip\", clip);\nAlpine.data(\"chartbar\", chartbar);\nAlpine.data(\"chartpie\", chartpie);\nAlpine.data(\"contentsubmit\", contentsubmit);\nAlpine.data(\"copytoclipboard\", copytoclipboard);\nAlpine.data(\"coveragemap\", coveragemap);\nAlpine.data(\"date\", date);\nAlpine.data(\"combinedanalytics\", combinedanalytics);\nAlpine.data(\"deliveryanalytics\", deliveryanalytics);\nAlpine.data(\"pipelineanalytics\", pipelineanalytics);\nAlpine.data(\"salesanalytics\", salesanalytics);\nAlpine.data(\"datetimepicker\", datetimepicker);\nAlpine.data(\"designeditor\", designeditor);\nAlpine.data(\"designdrawings\", designdrawings);\nAlpine.data(\"designmenus\", designmenus);\nAlpine.data(\"designstats\", designstats);\nAlpine.data(\"designscenes\", designscenes);\nAlpine.data(\"designcompare\", designcompare);\nAlpine.data(\"designscenarios\", designscenarios);\nAlpine.data(\"designworksheet\", designworksheet);\nAlpine.data(\"drop\", drop);\nAlpine.data(\"uploaddropzone\", uploaddropzone);\nAlpine.data(\"file\", file);\nAlpine.data(\"hepscore\", hepscore);\nAlpine.data(\"linework\", linework);\nAlpine.data(\"hubspot\", hubspot);\nAlpine.data(\"nav\", nav);\nAlpine.data(\"palette\", palette);\nAlpine.data(\"notfound\", notfound);\nAlpine.data(\"notifications\", notifications);\nAlpine.data(\"plan\", plan);\nAlpine.data(\"posthog\", posthog);\nAlpine.data(\"price\", price);\nAlpine.data(\"projecttags\", projecttags);\nAlpine.data(\"radio\", radio);\nAlpine.data(\"destroy\", destroy);\nAlpine.data(\"rename\", rename);\nAlpine.data(\"buildpackplan\", buildpackplan);\nAlpine.data(\"buildpackproperty\", buildpackproperty);\nAlpine.data(\"buildpackv2\", buildpackv2);\nAlpine.data(\"listeditor\", listeditor);\nAlpine.data(\"saveall\", saveall);\nAlpine.data(\"systemeditor\", systemeditor);\nAlpine.data(\"systemlibrary\", systemlibrary);\nAlpine.data(\"recorderHarness\", recorderHarness);\nAlpine.data(\"screenRecorder\", screenRecorder);\nAlpine.data(\"tableselectall\", tableselectall);\nAlpine.data(\"taglists\", taglists);\nAlpine.data(\"tocScrollspy\", tocScrollspy);\nAlpine.data(\"sortable\", sortable);\nAlpine.data(\"stripe\", stripe);\nAlpine.data(\"tracking\", tracking);\nAlpine.data(\"upload\", upload);\nAlpine.data(\"dialog\", dialog);\nAlpine.data(\"documents\", documents);\nAlpine.data(\"panorama\", panorama);\nAlpine.data(\"zoomable\", zoomable);\nAlpine.data(\"dropdown\", dropdown);\nAlpine.data(\"command\", command);\n\nbucketUploads();\n\nAlpine.start();\n"],
  "mappings": "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EACA,iBAAkB,CAChB,MAAOA,GAAM,MACf,CACF,EACIK,IAAQ,CACV,SAAU,GACV,MAAOL,GAAM,MACb,gBAAiBE,IACjB,YAAa,CACX,UAAW,CACT,MAAOF,GAAM,MACf,EACA,WAAY,CACV,MAAOA,GAAM,WACf,EACA,MAAO,CACL,MAAOA,GAAM,QACf,CACF,EACA,OAAQ,CACN,UAAW,CACT,MAAOA,GAAM,SACf,EACA,cAAe,CACb,MAAOA,GAAM,QACf,CACF,EACA,UAAW,CACT,MAAOA,GAAM,SACf,EACA,MAAO,CACL,UAAW,CACT,MAAOA,GAAM,OACf,EACA,aAAc,CACZ,MAAOA,GAAM,UACf,CACF,EACA,QAAS,CACP,UAAW,CACT,YAAaA,GAAM,QACrB,CACF,EACA,QAAS,CACP,gBAAiBA,GAAM,UACvB,mBAAoBA,GAAM,OAC1B,UAAW,CACT,MAAOA,GAAM,QACf,CACF,EACA,SAAU,CACR,YAAaA,GAAM,SACnB,UAAW,CACT,MAAOA,GAAM,QACf,EACA,WAAY,CACV,MAAOA,GAAM,cACf,EACA,YAAa,CACX,MAAOA,GAAM,UACb,YAAaA,GAAM,QACrB,EACA,gBAAiB,CACf,MAAOA,GAAM,QACf,EACA,SAAU,CACR,YAAa,CACX,YAAaA,GAAM,QACrB,CACF,EACA,eAAgB,CACd,UAAW,CACT,MAAOA,GAAM,QACf,EACA,UAAW,CACT,MAAOA,GAAM,QACf,CACF,EACA,uBAAwB,CACtB,UAAW,CACT,MAAOA,GAAM,QACf,EACA,UAAW,CACT,MAAOA,GAAM,QACf,CACF,CACF,EACA,UAAW,CACT,UAAW,CACT,MAAOA,GAAM,SACf,EACA,YAAa,CACX,YAAaA,GAAM,SACrB,CACF,EACA,SAAU,CACR,UAAW,CACT,MAAOA,GAAM,QACf,EACA,MAAO,CACL,MAAOA,GAAM,QACf,EACA,aAAc,CACZ,MAAOA,GAAM,SACb,YAAaA,GAAM,QACrB,CACF,EACA,SAAU,CACR,UAAW,CACT,MAAOA,GAAM,UACb,YAAaA,GAAM,SACrB,EACA,SAAU,CACR,MAAOA,GAAM,QACf,EACA,WAAY,CACV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C,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,GAAG,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,EAAG,IAAI,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,EAAG,IAAI,EAAG,CAAC,EAAG,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,IAAI,CAAC,EAAG,CAAC,CAAC,EAAG,GAAG,EAAG,CAAC,EAAG,IAAI,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,IAAI,EAAG,CAAC,EAAG,IAAI,EAAG,CAAC,EAAG,GAAG,EAAG,CAAC,EAAG,GAAG,CAAC,CAAC,EACj0B,IAASC,GAAI,EAAGA,GAAID,GAAO,OAAQC,KACjC,IAASC,GAAI,EAAGA,GAAIF,GAAOC,EAAC,EAAE,OAAQC,KACpCF,GAAOC,EAAC,EAAEC,EAAC,EAAE,CAAC,GAAK,KACnBF,GAAOC,EAAC,EAAEC,EAAC,EAAE,CAAC,GAAK,MAAQ,IAC3BF,GAAOC,EAAC,EAAEC,EAAC,EAAE,CAAC,GAAKJ,GAAS,CAAC,EAC7BE,GAAOC,EAAC,EAAEC,EAAC,EAAE,CAAC,GAAKJ,GAAS,CAAC,EAJtB,IAAAI,GADFD,GAQM,SAARE,GAA2BC,EAASC,EAAS,CAClD,GAAID,IAAY,QAAS,CACvB,QAASH,EAAI,EAAGA,EAAII,EAAQ,OAAQJ,IAElC,GAAII,EAAQJ,CAAC,EAAE,OAASF,IACtB,OAGJM,EAAQ,KAAK,IAAIC,GAAcP,IAAmBQ,EAAIP,GAAQ,SAAUQ,EAAU,CAChF,MAAO,CACL,KAAM,UACN,SAAUA,CACZ,CACF,CAAC,EAAGV,EAAQ,CAAC,CACf,CACF,CC7BA,IAAIW,IAAkB,CACpB,yBAAQ,CAAC,GAAI,EAAE,EAEf,aAAM,CAAC,EAAG,GAAG,EACb,aAAM,CAAC,GAAI,CAAC,EACZ,aAAM,CAAC,IAAK,EAAE,EAEd,aAAM,CAAC,EAAG,CAAC,CACb,EACe,SAARC,GAA+BC,EAASC,EAAQ,CACrD,GAAID,IAAY,QAAS,CACvB,IAAIE,EAAWJ,IAAgBG,EAAO,IAAI,EAC1C,GAAIC,EAAU,CACZ,IAAIC,EAAKF,EAAO,UAAU,EAC1BE,EAAG,CAAC,GAAKD,EAAS,CAAC,EAAI,KACvBC,EAAG,CAAC,GAAK,CAACD,EAAS,CAAC,GAAK,KAAO,KAChCD,EAAO,UAAUE,CAAE,CACrB,CACF,CACF,CCfA,IAAIC,IAAS,CAAC,CAAC,CAAC,mBAAoB,iBAAiB,EAAG,CAAC,mBAAoB,iBAAiB,EAAG,CAAC,mBAAoB,kBAAkB,EAAG,CAAC,mBAAoB,kBAAkB,EAAG,CAAC,mBAAoB,iBAAiB,CAAC,CAAC,EAC9M,SAARC,GAAiCC,EAASC,EAAQ,CACnDD,IAAY,SAAWC,EAAO,OAAS,gBACzCA,EAAO,WAAW,KAAK,CACrB,KAAM,UACN,SAAUH,IAAO,CAAC,CACpB,CAAC,CAEL,CCLA,IAAII,IAAwB,OACxBC,KAA+B,UAAY,CAC7C,SAASA,EAAgBC,EAASC,EAASC,EAAc,CACvD,KAAK,KAAO,UACZ,KAAK,WAAaC,GAAc,EAChC,KAAK,SAAWH,EAChB,KAAK,cAAgBE,EAErB,KAAK,SAAWE,IAAWH,CAAO,CACpC,CAKA,OAAAF,EAAgB,UAAU,KAAO,SAAUM,EAASC,EAAc,CAChEA,EAAeA,GAAgBR,IAC/B,IAAIS,EAAS,KAAK,WAAW,IAAID,CAAY,EAC7C,GAAI,CAACC,EAAQ,CACX,IAAIC,EAAa,KAAK,gBAAgBF,CAAY,EAClDC,EAAS,KAAK,WAAW,IAAID,EAAc,CACzC,QAASE,EACT,aAAcC,IAAsBD,CAAU,CAChD,CAAC,CACH,CACA,IAAIE,EAAaP,GAAc,EAC3BQ,EAAe,CAAC,EACpB,OAAAC,EAAKL,EAAO,QAAS,SAAUM,EAAQ,CACrC,IAAIC,EAAaD,EAAO,KAEpBR,GAAWU,GAAOV,EAASS,CAAU,IACvCD,EAASA,EAAO,aAAaC,EAAaT,EAAQS,CAAU,CAAC,GAE/DH,EAAa,KAAKE,CAAM,EACxBH,EAAW,IAAII,EAAYD,CAAM,CACnC,CAAC,EACM,CACL,QAASF,EACT,aAAcJ,EAAO,cAAgB,IAAIS,GAAa,EAAG,EAAG,EAAG,CAAC,EAChE,WAAYN,CACd,CACF,EACAX,EAAgB,UAAU,gBAAkB,SAAUO,EAAc,CAClE,IAAIN,EAAU,KAAK,SACfC,EAAU,KAAK,SACfO,EAEJ,GAAI,CACFA,EAAaP,EAAUgB,GAAahB,EAASK,CAAY,EAAI,CAAC,CAChE,OAASY,EAAG,CACV,MAAM,IAAI,MAAM;AAAA,EAA6BA,EAAE,OAAO,CACxD,CACA,OAAAC,GAAUnB,EAASQ,CAAU,EAC7BI,EAAKJ,EAAY,SAAUK,EAAQ,CACjC,IAAIC,EAAaD,EAAO,KACxBO,GAAapB,EAASa,CAAM,EAC5BQ,GAAgBrB,EAASa,CAAM,EAG/B,IAAIS,EAAc,KAAK,eAAiB,KAAK,cAAcR,CAAU,EACjEQ,GACFT,EAAO,YAAYS,EAAY,KAAMA,EAAY,IAAKA,EAAY,MAAOA,EAAY,MAAM,CAE/F,EAAG,IAAI,EACAd,CACT,EAKAT,EAAgB,UAAU,cAAgB,UAAY,CACpD,MAAO,CAIL,QAAS,KAAK,SACd,QAAS,KAAK,SACd,aAAc,KAAK,aACrB,CACF,EACOA,CACT,GAAE,EAEF,SAASwB,IAAsBC,EAAS,CAEtC,QADIC,EACKC,EAAI,EAAGA,EAAIF,EAAQ,OAAQE,IAAK,CACvC,IAAIC,EAAaH,EAAQE,CAAC,EAAE,gBAAgB,EAC5CD,EAAOA,GAAQE,EAAW,MAAM,EAChCF,EAAK,MAAME,CAAU,CACvB,CACA,OAAOF,CACT,CACA,SAASG,IAAWC,EAAQ,CAC1B,OAAQC,GAASD,CAAM,EAAa,OAAO,KAAS,KAAe,KAAK,MAAQ,KAAK,MAAMA,CAAM,EAAI,IAAI,SAAS,WAAaA,EAAS,IAAI,EAAE,EAAnHA,CAC7B,CCjGA,IAAIE,GAAUC,GAAc,EACrBC,GAAQ,CA+Bb,YAAa,SAAUC,EAASC,EAAQC,EAAiB,CACvD,GAAID,EAAO,IAAK,CACd,IAAIE,EAAW,IAAIC,IAAeJ,EAASC,EAAO,GAAG,EACrDJ,GAAQ,IAAIG,EAASG,CAAQ,CAC/B,KAAO,CAML,IAAIE,EAAUJ,EAAO,SAAWA,EAAO,QACnCI,GAAW,CAACJ,EAAO,SACrBC,EAAkBD,EAAO,aAEzBI,EAAUJ,EAEZ,IAAIE,EAAW,IAAIG,IAAgBN,EAASK,EAASH,CAAe,EACpEL,GAAQ,IAAIG,EAASG,CAAQ,CAC/B,CACF,EACA,eAAgB,SAAUH,EAAS,CACjC,OAAOH,GAAQ,IAAIG,CAAO,CAC5B,EAKA,cAAe,SAAUA,EAAS,CAChC,IAAIG,EAAWN,GAAQ,IAAIG,CAAO,EAElC,OAAOG,GAAYA,EAAS,OAAS,WAAaA,EAAS,cAAc,CAC3E,EACA,KAAM,SAAUH,EAASO,EAASC,EAAc,CAC9C,IAAIL,EAAWN,GAAQ,IAAIG,CAAO,EAClC,GAAKG,EAML,OAAOA,EAAS,KAAKI,EAASC,CAAY,CAC5C,CACF,EC5DA,IAAIC,GAA4B,CAAC,OAAQ,SAAU,OAAQ,UAAW,UAAW,WAAY,MAAM,EAC/FC,IAAsCC,GAAcF,EAAyB,EAC7EG,IAA+BD,GAAcF,GAA0B,OAAO,CAAC,GAAG,CAAC,CAAC,EACpFI,IAAwBF,GAAcF,GAA0B,OAAO,CAAC,GAAG,CAAC,CAAC,EAC7EK,IAAcC,GAAU,EAC5B,SAASC,GAAkBC,EAAO,CAChC,IAAIC,EAAYD,EAAM,aAAa,EAC/BE,EAAYF,EAAM,IAAI,WAAW,EAGrC,OAAIE,GAAa,OACfD,EAAU,KAAOC,GAEZD,CACT,CAIA,SAASE,IAAaC,EAAW,CAC/B,IAAIC,EAAQD,EAAU,MAClBC,IACFA,EAAM,OAASA,EAAM,QAAUA,EAAM,KACrCA,EAAM,KAAO,KAEjB,CACA,IAAIC,KAAuB,UAAY,CACrC,SAASA,EAAQC,EAAK,CACpB,IAAIC,EAAQ,KAAK,MAAQ,IAAYC,GACjCC,EAAiB,KAAK,gBAAkB,IAAYD,GACxDD,EAAM,IAAIE,CAAc,EACxB,KAAK,IAAMC,GAAO,aAAa,EAC/B,KAAK,YAAc,IAAIC,GAAeL,EAAI,MAAM,CAAC,EACjD,KAAK,gBAAkB,CACrB,OAAQG,CACV,EACAA,EAAe,IAAI,KAAK,cAAgB,IAAYD,EAAO,EAC3DC,EAAe,IAAI,KAAK,UAAY,IAAYD,EAAO,CACzD,CACA,OAAAH,EAAQ,UAAU,KAAO,SAAUO,EAAeC,EAASP,EAAKQ,EAAUC,EAAS,CACjF,IAAIC,EAAQJ,EAAc,WAAa,MAGnCK,EAAOL,EAAc,SAAWA,EAAc,QAAQ,EAC1DI,GAASH,EAAQ,cAAc,CAC7B,SAAU,SACV,QAAS,KACX,EAAG,SAAUK,EAAW,CAClB,CAACD,GAAQC,EAAU,gBAAgB,IAAMN,IAC3CK,EAAOC,EAAU,QAAQ,EAE7B,CAAC,EACD,IAAIC,EAAMP,EAAc,iBACpBQ,EAAe,KAAK,cACpBX,EAAiB,KAAK,gBACtBY,EAAgBF,EAAI,iBAAiB,EACrCG,EAAmBD,EAAc,IACjCE,EAAoBF,EAAc,KAElCG,EAAc,CAACJ,EAAa,QAAQ,CAAC,GAAKL,EAC1CU,EAAOb,EAAc,WAAW,OAAQ,EAAI,EAC5Cc,EACAD,GACFC,EAAWP,EAAI,YAAY,EAAE,MAAM,EACnC,KAAK,MAAM,YAAY,IAAYQ,GAAK,CACtC,MAAOD,EAAS,MAAM,CACxB,CAAC,CAAC,GAEF,KAAK,MAAM,eAAe,EAExBF,GACFf,EAAe,EAAIc,EAAkB,EACrCd,EAAe,EAAIc,EAAkB,EACrCd,EAAe,OAASc,EAAkB,OAC1Cd,EAAe,OAASc,EAAkB,OAC1Cd,EAAe,MAAM,GAEbmB,GAAYnB,EAAgBc,EAAmBX,CAAa,EAEtE,IAAIiB,EAA6BZ,GAAQA,EAAK,UAAU,YAAY,GAAKA,EAAK,UAAU,YAAY,EAAE,OAAS,EAC3Ga,EAAe,CACjB,IAAKxB,EACL,IAAKa,EACL,cAAeP,EACf,KAAMK,EACN,2BAA4BY,EAC5B,MAAOb,EACP,iBAAkBM,CACpB,EACIH,EAAI,eAAiB,UACvB,KAAK,cAAcW,CAAY,EACtBX,EAAI,eAAiB,UAC9B,KAAK,UAAUW,CAAY,EAE7B,KAAK,kBAAkBlB,EAAec,EAAUb,EAASP,CAAG,EAC5D,KAAK,wBAAwBM,EAAeQ,EAAcd,EAAKQ,CAAQ,CACzE,EACAT,EAAQ,UAAU,cAAgB,SAAUyB,EAAc,CACxD,IAAIC,EAAqB,KAAK,oBAA6BtC,GAAc,EACrEuC,EAA2BvC,GAAc,EACzC2B,EAAe,KAAK,cACpBE,EAAmBQ,EAAa,iBAChClB,EAAgBkB,EAAa,cAC7Bb,EAAOa,EAAa,KACpBG,EAAaH,EAAa,IAAI,WAC9BI,EAAmBD,GAAcA,EAAW,OAChD,SAASE,EAAeC,EAAOC,EAAS,CACtC,OAAIA,IAEFD,EAAQC,EAAQD,CAAK,GAEhBA,GAAS,CAACA,EAAM,CAAC,EAAId,EAAiB,OAASA,EAAiB,EAAGc,EAAM,CAAC,EAAId,EAAiB,OAASA,EAAiB,CAAC,CACnI,CAEA,SAASgB,EAAuBC,EAAU,CAIxC,QAHIC,EAAY,CAAC,EAEbH,EAAU,CAACH,GAAoBD,GAAcA,EAAW,QACnDQ,EAAI,EAAGA,EAAIF,EAAS,OAAQ,EAAEE,EAAG,CACxC,IAAIC,EAAQP,EAAeI,EAASE,CAAC,EAAGJ,CAAO,EAC/CK,GAASF,EAAU,KAAKE,CAAK,CAC/B,CACA,OAAOF,CACT,CACA,SAASG,EAAaC,EAAQ,CAC5B,MAAO,CACL,MAAO,CACL,OAAQN,EAAuBM,CAAM,CACvC,CACF,CACF,CACAxB,EAAa,UAAU,EAEhByB,EAAKf,EAAa,IAAI,QAAS,SAAUgB,EAAQ,CACtD,IAAIC,EAAaD,EAAO,KAMpBE,EAAcjB,EAAmB,IAAIgB,CAAU,EAC/CE,EAAKjB,EAAkB,IAAIe,CAAU,GAAK,CAAC,EAC7CG,EAAUD,EAAG,QACbE,EAAcF,EAAG,YACnB,GAAI,CAACD,EAAa,CAChBA,EAAcjB,EAAmB,IAAIgB,EAAY,IAAYvC,EAAO,EACpEY,EAAa,IAAI4B,CAAW,EAC5BE,EAAUjC,EAAOA,EAAK,YAAY8B,CAAU,EAAI,KAChDI,EAAcrB,EAAa,MAAQlB,EAAc,eAAemC,CAAU,EAAI9B,EAAOA,EAAK,aAAaiC,CAAO,EAAI,KAClH,IAAIE,EAASD,EAAY,IAAI,SAAU,EAAI,EAC3CC,GAAU,OAASJ,EAAY,OAASI,GACxCpB,EAAkB,IAAIe,EAAY,CAChC,QAASG,EACT,YAAaC,CACf,CAAC,CACH,CACA,IAAIE,EAAkB,CAAC,EACnBC,EAAmB,CAAC,EACjBT,EAAKC,EAAO,WAAY,SAAUS,EAAU,CAEjD,GAAIA,EAAS,OAAS,UAAW,CAC/B,IAAIC,EAAQ,CAACD,EAAS,QAAQ,EAAE,OAAOA,EAAS,WAAa,CAAC,CAAC,EAC3DrB,IACFsB,EAAQC,IAAaD,EAAOtB,CAAgB,GAEvCW,EAAKW,EAAO,SAAUE,EAAM,CACjCL,EAAgB,KAAK,IAAYM,GAAQhB,EAAae,CAAI,CAAC,CAAC,CAC9D,CAAC,CACH,KAEK,CACH,IAAId,EAASW,EAAS,OAClBrB,IACFU,EAASa,IAAab,EAAQV,EAAkB,EAAI,GAE/CW,EAAKD,EAAQ,SAAUA,EAAQ,CACpCU,EAAiB,KAAK,IAAYM,GAASjB,EAAaC,CAAM,CAAC,CAAC,CAClE,CAAC,CACH,CACF,CAAC,EACD,IAAIiB,EAAW1B,EAAeW,EAAO,UAAU,EAAGb,GAAcA,EAAW,OAAO,EAClF,SAAS6B,EAAmBC,EAAUC,EAAQ,CAC5C,GAAKD,EAAS,OAGd,KAAIE,EAAe,IAAYC,GAAa,CAC1C,QAAS,GACT,uBAAwB,EACxB,MAAO,CACL,MAAOH,CACT,CACF,CAAC,EACDf,EAAY,IAAIiB,CAAY,EAC5BE,IAA0BrC,EAAcmC,EAAcf,EAASC,CAAW,EAC1EiB,IAAoBtC,EAAcmC,EAAclB,EAAYI,EAAavC,EAAesC,EAASW,CAAQ,EACrGG,IACF9D,IAAa+D,CAAY,EAClBpB,EAAKoB,EAAa,OAAQ/D,GAAY,GAEjD,CACA4D,EAAmBT,CAAe,EAClCS,EAAmBR,EAAkB,EAAI,CAC3C,CAAC,EAEDvB,EAAmB,KAAK,SAAUiB,EAAaD,EAAY,CACzD,IAAIE,EAAKjB,EAAkB,IAAIe,CAAU,EACvCG,EAAUD,EAAG,QACbE,EAAcF,EAAG,YACnBoB,IAA2BvC,EAAckB,EAAaD,EAAYI,EAAavC,EAAesC,CAAO,EACrGoB,IAAsBxC,EAAckB,EAAaD,EAAYI,EAAavC,CAAa,EACvF2D,IAA2BzC,EAAckB,EAAaD,EAAYI,EAAavC,CAAa,CAC9F,EAAG,IAAI,CACT,EACAP,EAAQ,UAAU,UAAY,SAAUyB,EAAc,CACpD,IAAI0C,EAAU1C,EAAa,IAAI,IAC3BR,EAAmBQ,EAAa,iBACpC,KAAK,UAAU,EAAIR,EAAiB,EACpC,KAAK,UAAU,EAAIA,EAAiB,EACpC,KAAK,UAAU,OAASA,EAAiB,OACzC,KAAK,UAAU,OAASA,EAAiB,OACrC,KAAK,oBAAoBkD,CAAO,IAClC,KAAK,SAAS,EACd,KAAK,QAAQA,CAAO,GAEtB,IAAIC,EAAmB,KAAK,kBAA2BhF,GAAc,EACjEiF,EAAY,GACT7B,EAAK,KAAK,kBAAkB,MAAO,SAAU8B,EAAW,CAK7D,IAAI5B,EAAa4B,EAAU,KACvB/D,EAAgBkB,EAAa,cAC7Bb,EAAOa,EAAa,KACpB8C,EAAkBD,EAAU,gBAC5BE,EAAKF,EAAU,GACfzB,EAAUjC,EAAOA,EAAK,YAAY8B,CAAU,EAAI,KAChDI,EAAcvC,EAAc,eAAemC,CAAU,EACrDvD,IAA6B,IAAIoF,CAAe,GAAK,MAAQC,aAAcC,IAC7EX,IAA0BrC,EAAc+C,EAAI3B,EAASC,CAAW,EAE9D0B,aAAcC,KAChBD,EAAG,QAAU,IAEf,IAAIzB,EAASD,EAAY,IAAI,SAAU,EAAI,EAO3C,GANAC,GAAU,OAASyB,EAAG,OAASzB,GAI/ByB,EAAG,eAAiB,EAEhB,CAACF,EAAU,YAGThF,IAAe,IAAIiF,CAAe,GAAK,MACzCR,IAAoBtC,EAAc+C,EAAI9B,EAAYI,EAAavC,EAAesC,EAAS,IAAI,EAE7FmB,IAA2BvC,EAAc+C,EAAI9B,EAAYI,EAAavC,EAAesC,CAAO,EAC5FoB,IAAsBxC,EAAc+C,EAAI9B,EAAYI,EAAavC,CAAa,EAC1ElB,IAAsB,IAAIkF,CAAe,GAAK,MAAM,CACtD,IAAIG,EAAUR,IAA2BzC,EAAc+C,EAAI9B,EAAYI,EAAavC,CAAa,EAC7FmE,IAAY,SACdL,EAAY,IAEd,IAAIM,EAAMP,EAAiB,IAAI1B,CAAU,GAAK0B,EAAiB,IAAI1B,EAAY,CAAC,CAAC,EACjFiC,EAAI,KAAKH,CAAE,CACb,CAEJ,EAAG,IAAI,EACP,KAAK,qBAAqBH,EAAW5C,CAAY,CACnD,EACAzB,EAAQ,UAAU,qBAAuB,SAAUqE,EAAW5C,EAAc,CAI1E,GAAI4C,GAAa5C,EAAa,MAAO,CACnC,IAAImD,EAAYnD,EAAa,cAAc,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,aAAa,EAGpFoD,EAAYD,EAAU,QAC1B,KAAK,kBAAkB,KAAK,SAAS,SAAUJ,EAAI,CACjD,GAAI,CAACA,EAAG,QAAS,CAGfM,GAAqBN,CAAE,EACvB,IAAIzE,EAAQyE,EAAG,YAAY,MAAM,EAAE,OAAS,CAAC,EAEzCzE,EAAM,SAAW,MAAQ8E,GAAa,OACxC9E,EAAM,QAAU8E,GAIlBL,EAAG,YAAY,UAAU,CAC3B,CACF,CAAC,CACH,CACF,EACAxE,EAAQ,UAAU,OAAS,UAAY,CACrC,KAAK,cAAc,UAAU,EAC7B,KAAK,oBAAsB,KAC3B,KAAK,UAAU,UAAU,EACzB,KAAK,SAAS,EACd,KAAK,YAAY,QAAQ,EACzB,KAAK,gBAAkB,IACzB,EACAA,EAAQ,UAAU,wBAA0B,SAAU+E,EAAMC,EAAU,CACpE,GAAID,GAAQ,KACV,MAAO,CAAC,EAEV,IAAIjE,EAAMkE,EAAS,iBACnB,GAAIlE,EAAI,eAAiB,UAAW,CAClC,IAAIY,EAAqB,KAAK,oBAC9B,GAAIA,EAAoB,CACtB,IAAIiB,EAAcjB,EAAmB,IAAIqD,CAAI,EAC7C,OAAOpC,EAAc,CAACA,CAAW,EAAI,CAAC,CACxC,CACF,SAAW7B,EAAI,eAAiB,SAC9B,OAAO,KAAK,mBAAqB,KAAK,kBAAkB,IAAIiE,CAAI,GAAK,CAAC,CAE1E,EACA/E,EAAQ,UAAU,oBAAsB,SAAUmE,EAAS,CACzD,OAAO,KAAK,cAAgBA,CAC9B,EACAnE,EAAQ,UAAU,QAAU,SAAUmE,EAAS,CAC7C,IAAIc,EAAWC,GAAiB,eAAef,CAAO,EACtD,GAAIc,GAAYA,EAAS,OAAS,SAAU,CAC1C,IAAIE,EAAaF,EAAS,WAAW,KAAK,GAAG,EAC7C,KAAK,UAAU,IAAIE,EAAW,IAAI,EAClC,KAAK,kBAAoBA,EACzB,KAAK,YAAchB,CACrB,CACF,EACAnE,EAAQ,UAAU,SAAW,UAAY,CACvC,IAAImE,EAAU,KAAK,YACnB,GAAIA,GAAW,KAGf,KAAIc,EAAWC,GAAiB,eAAef,CAAO,EAClDc,GAAYA,EAAS,OAAS,UAChCA,EAAS,YAAY,KAAK,GAAG,EAE/B,KAAK,kBAAoB,KACzB,KAAK,kBAAoB,KACzB,KAAK,UAAU,UAAU,EACzB,KAAK,YAAc,KACrB,EACAjF,EAAQ,UAAU,kBAAoB,SAAUO,EAAec,EAAUb,EAASP,EAAK,CACrF,IAAIa,EAAMP,EAAc,iBACpB6E,EAAa,KAAK,YAClBC,EAAiB,KAAK,gBAC1BA,EAAe,UAAY9E,EAAc,IAAI,YAAY,EACzD8E,EAAe,KAAOvE,EAAI,QAAQ,EAElCsE,EAAW,OAAO7E,EAAc,IAAI,MAAM,GAAK,GAAO,CACpD,IAAKN,EACL,MAAO,CACL,UAAWM,CACb,EACA,YAAa,CACX,YAAaA,EAAc,IAAI,aAAa,EAC5C,SAAU,SAAU+E,EAAGC,EAAGC,EAAG,CAC3B,OAAO1E,EAAI,aAAa,CAACyE,EAAGC,CAAC,CAAC,CAChC,EACA,SAAU,SAAUF,EAAGC,EAAGC,EAAG,CAC3B,MAAO,CAACnE,GAAYA,EAAS,QAAQkE,EAAGC,CAAC,CAC3C,CACF,CACF,CAAC,EACD,IAAIC,EAAWlF,EAAc,SAC7B,SAASmF,GAAiB,CACxB,IAAIC,EAAS,CACX,KAAM,UACN,cAAeF,CACjB,EACA,OAAAE,EAAOF,EAAW,IAAI,EAAIlF,EAAc,GACjCoF,CACT,CACAP,EAAW,IAAI,KAAK,EAAE,GAAG,MAAO,SAAUE,EAAG,CAC3C,KAAK,eAAiB,GACXM,GAAgBP,EAAgBC,EAAE,GAAIA,EAAE,EAAE,EACrDrF,EAAI,eAAsB4F,EAAOH,EAAe,EAAG,CACjD,GAAIJ,EAAE,GACN,GAAIA,EAAE,GACN,UAAW,CACT,SAAU,CACZ,CACF,CAAC,CAAC,CACJ,EAAG,IAAI,EACPF,EAAW,IAAI,MAAM,EAAE,GAAG,OAAQ,SAAUE,EAAG,CAC7C,KAAK,eAAiB,GACXQ,GAAiBT,EAAgBC,EAAE,MAAOA,EAAE,QAASA,EAAE,OAAO,EACzErF,EAAI,eAAsB4F,EAAOH,EAAe,EAAG,CACjD,UAAWL,EAAe,KAC1B,KAAMC,EAAE,MACR,QAASA,EAAE,QACX,QAASA,EAAE,QACX,UAAW,CACT,SAAU,CACZ,CACF,CAAC,CAAC,CACJ,EAAG,IAAI,CACT,EAYAtF,EAAQ,UAAU,oBAAsB,UAAY,CAClD,KAAK,MAAM,SAAS,SAAUwE,EAAI,CAChC,IAAIuB,EAAQvB,EAAG,eAAe,EAC1BuB,IACFA,EAAM,OAASxG,IAAYwG,CAAK,EAAE,OAEtC,CAAC,CACH,EACA/F,EAAQ,UAAU,wBAA0B,SAAUO,EAAeQ,EAAcd,EAAKQ,EAAU,CAChG,IAAIuF,EAAU,KACdjF,EAAa,IAAI,WAAW,EAC5BA,EAAa,IAAI,OAAO,EAEpBR,EAAc,IAAI,cAAc,IAClCQ,EAAa,GAAG,YAAa,UAAY,CACvCiF,EAAQ,eAAiB,EAC3B,CAAC,EACDjF,EAAa,GAAG,QAAS,SAAUuE,EAAG,CAC/BU,EAAQ,iBAGbA,EAAQ,eAAiB,GAC3B,CAAC,EAEL,EACOhG,CACT,GAAE,EAEF,SAAS8D,IAA0BrC,EAAc+C,EAAIyB,EAAWnD,EAAa,CAQ3E,IAAIoD,EAAmBpD,EAAY,SAAS,WAAW,EACnDqD,EAAqBrD,EAAY,SAAS,CAAC,WAAY,WAAW,CAAC,EACnEsD,EAAiBtD,EAAY,SAAS,CAAC,OAAQ,WAAW,CAAC,EAC3DuD,EAAmBvD,EAAY,SAAS,CAAC,SAAU,WAAW,CAAC,EAG/DwD,EAAc7G,GAAkByG,CAAgB,EAChDK,EAAgB9G,GAAkB0G,CAAkB,EACpDK,EAAc/G,GAAkB4G,CAAgB,EAChDzB,EAAYnF,GAAkB2G,CAAc,EAE5CxF,EAAOa,EAAa,KACxB,GAAIb,EAAM,CAIR,IAAIb,EAAQa,EAAK,cAAcqF,EAAW,OAAO,EAC7CQ,EAAQ7F,EAAK,cAAcqF,EAAW,OAAO,EAC7CxE,EAAa,4BAA8B1B,EAAM,OACnDuG,EAAY,KAAOvG,EAAM,MAEvB0G,IACFH,EAAY,MAAQI,GAA+BD,EAAOhF,EAAa,GAAG,EAE9E,CAGA+C,EAAG,SAAS8B,CAAW,EACvB9B,EAAG,MAAM,cAAgB,GACzBA,EAAG,YAAY,UAAU,EAAE,MAAQ+B,EACnC/B,EAAG,YAAY,QAAQ,EAAE,MAAQgC,EACjChC,EAAG,YAAY,MAAM,EAAE,MAAQI,EAE/BE,GAAqBN,CAAE,CACzB,CACA,SAAST,IAAoBtC,EAAc+C,EAAI9B,EAAYI,EAAavC,EAExEsC,EAEA8D,EAAS,CACP,IAAI/F,EAAOa,EAAa,KACpBd,EAAQc,EAAa,MACrBmF,EAAYhG,GAAQ,MAAMA,EAAK,IAAIA,EAAK,aAAa,OAAO,EAAGiC,CAAO,CAAC,EACvEgE,EAAajG,GAAQA,EAAK,cAAciC,CAAO,EAKnD,GAAIlC,GAASiG,GAAaC,GAAcA,EAAW,UAAW,CAC5D,IAAIC,EAASnG,EAAkB+B,EAAVG,EACjBkE,EAAe,QAEf,CAACnG,GAAQiC,GAAW,KACtBkE,EAAexG,GAEjB,IAAIyG,EAAmBL,EAAU,CAC/B,OAAQ,CACN,MAAO,SACP,cAAe,QACjB,CACF,EAAI,KAGJM,GAAczC,EAAI0C,GAAqBpE,CAAW,EAAG,CACnD,aAAciE,EACd,eAAgBD,EAChB,YAAapE,CACf,EAAGsE,CAAgB,EACnB,IAAIG,EAAS3C,EAAG,eAAe,EAC/B,GAAI2C,IACF5H,IAAY4H,CAAM,EAAE,OAASA,EAAO,OAChC3C,EAAG,YAAcmC,GAAS,CAE5B,IAAIS,EAAO5C,EAAG,gBAAgB,EAAE,MAAM,EAKtCA,EAAG,WAAW,WAAa4C,EAC3B5C,EAAG,WAAW,SAAW,EAAEmC,EAAQ,CAAC,EAAIS,EAAK,GAAKA,EAAK,MAAQ,IAAM,KAAMT,EAAQ,CAAC,EAAIS,EAAK,GAAKA,EAAK,OAAS,IAAM,GAAG,CAC3H,CAQF5C,EAAG,sBAAwB,EAC7B,MACEA,EAAG,kBAAkB,EACrBA,EAAG,iBAAiB,EACpBA,EAAG,sBAAwB,IAE/B,CACA,SAASR,IAA2BvC,EAAc4F,EAAc3E,EAAYI,EAAavC,EAEzFsC,EAAS,CAGHpB,EAAa,KAQfA,EAAa,KAAK,iBAAiBoB,EAASwE,CAAY,EASxDC,GAAUD,CAAY,EAAE,UAAY,CAClC,cAAe,MACf,eAAgB9G,EAAc,eAC9B,SAAUA,EAAc,eACxB,KAAMmC,EACN,OAAQI,GAAeA,EAAY,QAAU,CAAC,CAChD,CAEJ,CACA,SAASmB,IAAsBxC,EAAc+C,EAAI9B,EAAYI,EAAavC,EAAe,CAClFkB,EAAa,MACR8F,GAAiB,CACvB,GAAI/C,EACJ,eAAgBjE,EAChB,SAAUmC,EAEV,kBAAmBI,EAAY,IAAI,SAAS,CAC9C,CAAC,CAEL,CACA,SAASoB,IAA2BzC,EAAc+C,EAAI9B,EAAYI,EAAavC,EAAe,CAE5FiE,EAAG,sBAAwB,CAAC,CAACjE,EAAc,IAAI,cAAc,EAE7D,IAAIiH,EAAgB1E,EAAY,SAAS,UAAU,EAC/C2E,EAAQD,EAAc,IAAI,OAAO,EACrC,OAAAE,GAAoBlD,EAAIiD,EAAOD,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,EACxF/F,EAAa,OACfkG,IAAgCnD,EAAIjE,EAAemC,CAAU,EAExD+E,CACT,CACA,SAASrE,IAAawE,EAEtBC,EAAclE,EAAQ,CACpB,IAAImE,EAAW,CAAC,EACZC,EACJ,SAASC,GAAe,CACtBD,EAAU,CAAC,CACb,CACA,SAASE,GAAa,CAChBF,EAAQ,SACVD,EAAS,KAAKC,CAAO,EACrBA,EAAU,CAAC,EAEf,CACA,IAAIG,EAASL,EAAa,CACxB,aAAcG,EACd,WAAYC,EACZ,UAAWD,EACX,QAASC,EACT,MAAO,SAAU1C,EAAGC,EAAG,CAEjB,SAASD,CAAC,GAAK,SAASC,CAAC,GAC3BuC,EAAQ,KAAK,CAACxC,EAAGC,CAAC,CAAC,CAEvB,EACA,OAAQ,UAAY,CAAC,CACvB,CAAC,EACD,OAAC7B,GAAUuE,EAAO,aAAa,EACxB1F,EAAKoF,EAAO,SAAUO,EAAM,CACjCD,EAAO,UAAU,EACjB,QAAS9F,EAAI,EAAGA,EAAI+F,EAAK,OAAQ/F,IAC/B8F,EAAO,MAAMC,EAAK/F,CAAC,EAAE,CAAC,EAAG+F,EAAK/F,CAAC,EAAE,CAAC,CAAC,EAErC8F,EAAO,QAAQ,CACjB,CAAC,EACD,CAACvE,GAAUuE,EAAO,WAAW,EACtBJ,CACT,CACA,IAAOM,GAAQpI,ICtoBf,IAAIqI,KAAuB,SAAUC,EAAQ,CAC3CC,EAAUF,EAASC,CAAM,EACzB,SAASD,GAAU,CACjB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAQ,KACdG,CACT,CACA,OAAAH,EAAQ,UAAU,OAAS,SAAUI,EAAUC,EAASC,EAAKC,EAAS,CAEpE,GAAI,EAAAA,GAAWA,EAAQ,OAAS,mBAAqBA,EAAQ,OAAS,KAAK,KAG3E,KAAIC,EAAQ,KAAK,MAEjB,GADAA,EAAM,UAAU,EACZ,CAAAJ,EAAS,gBAAgB,EAO7B,IAJI,KAAK,UAAYG,GAAWA,EAAQ,OAAS,WAC/C,KAAK,SAAS,oBAAoB,EAG9BA,GAAWA,EAAQ,OAAS,WAAaA,EAAQ,gBAAkB,UAAYA,EAAQ,WAAaH,EAAS,GAW5G,CACL,IAAIK,EAAU,KAAK,SACnBA,GAAWD,EAAM,IAAIC,EAAQ,KAAK,CACpC,SAbML,EAAS,aAAc,CACzB,IAAIK,EAAU,KAAK,UAAY,IAAIC,GAAQJ,CAAG,EAC9CE,EAAM,IAAIC,EAAQ,KAAK,EACvBA,EAAQ,KAAKL,EAAUC,EAASC,EAAK,KAAMC,CAAO,EAClD,KAAK,SAAWE,CAClB,MAEE,KAAK,UAAY,KAAK,SAAS,OAAO,EACtC,KAAK,SAAW,KAMpBL,EAAS,IAAI,kBAAkB,GAAKC,EAAQ,aAAa,QAAQ,GAAK,KAAK,eAAeD,EAAUC,EAASC,CAAG,GAClH,EACAN,EAAQ,UAAU,OAAS,UAAY,CACrC,KAAK,UAAY,KAAK,SAAS,OAAO,EACtC,KAAK,SAAW,KAChB,KAAK,MAAM,UAAU,CACvB,EACAA,EAAQ,UAAU,QAAU,UAAY,CACtC,KAAK,UAAY,KAAK,SAAS,OAAO,EACtC,KAAK,SAAW,IAClB,EACAA,EAAQ,UAAU,eAAiB,SAAUI,EAAUC,EAASC,EAAK,CACnE,IAAIK,EAAeP,EAAS,aACxBI,EAAQ,KAAK,MACjBG,EAAa,KAAKA,EAAa,aAAa,OAAO,EAAG,SAAUC,EAAOC,EAAmB,CACxF,GAAI,OAAMD,CAAK,EAGf,KAAIE,EAASH,EAAa,cAAcE,CAAiB,EACzD,GAAI,GAACC,GAAU,CAACA,EAAO,OAIvB,KAAIC,EAAQD,EAAO,MACfE,EAASF,EAAO,OAChBG,EAAS,IAAYC,GAAO,CAC9B,MAAO,CAOL,KAAMd,EAAS,QAAQ,EAAE,UAAU,OAAO,EAAE,IAC9C,EACA,MAAO,CACL,GAAIW,EAAM,CAAC,EAAIC,EAAS,EACxB,GAAID,EAAM,CAAC,EACX,EAAG,CACL,EACA,OAAQ,GAER,GAAI,GAAMC,EAAgC,EAAvBG,GAAmB,EACxC,CAAC,EAUD,GAAI,CAACH,EAAQ,CACX,IAAII,EAAWhB,EAAS,WAAW,QAAQ,EACvCiB,EAASV,EAAa,QAAQE,CAAiB,EAC/CS,EAAcF,EAAS,YAAYC,CAAM,EACzCE,EAAYZ,EAAa,aAAaE,CAAiB,EACvDW,EAAaD,EAAU,SAAS,OAAO,EACvCE,EAAcL,EAAS,iBAAiBE,CAAW,EAQvDI,GAAcT,EAAQU,GAAqBJ,CAAS,EAAG,CACrD,aAAc,CACZ,kBAAmB,SAAUK,EAAKC,EAAO,CACvC,OAAOzB,EAAS,kBAAkBkB,EAAaO,CAAK,CACtD,CACF,EACA,YAAaR,CACf,CAAC,EACDJ,EAAO,sBAAwB,GAC1BO,EAAW,IAAI,UAAU,GAC5BP,EAAO,cAAc,CACnB,SAAU,QACZ,CAAC,EAEHQ,EAAY,mBAAqB,SAAUK,EAAS,CAClDC,GAAcd,EAAQa,CAAO,CAC/B,CACF,CACAtB,EAAM,IAAIS,CAAM,GAClB,CAAC,CACH,EACAjB,EAAQ,KAAO,MACRA,CACT,GAAEgC,EAAS,EACJC,IAAQjC,IC3Hf,IAAIkC,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAEvBG,EAAM,aAAe,GAErBA,EAAM,YAAc,CAAC,EACrBA,EAAM,mBAAqB,SAAUC,EAAW,CAC9C,GAAIA,GAAa,KAAM,CACrB,IAAIC,EAAS,KAAK,QAAQ,EAAE,QAAQD,CAAS,EACzCE,EAAM,KAAK,iBACXC,EAASD,EAAI,UAAUD,CAAM,EACjC,OAAOE,GAAUD,EAAI,YAAYC,EAAO,UAAU,CAAC,CACrD,CACF,EACOJ,CACT,CACA,OAAAH,EAAU,UAAU,eAAiB,SAAUQ,EAAQ,CAOrD,QANIC,EAAOC,GAAuB,KAAM,CACtC,gBAAiB,CAAC,OAAO,EACzB,gBAAwBC,GAAMC,GAA8B,IAAI,CAClE,CAAC,EACGC,EAA0BC,GAAc,EACxCC,EAAgB,CAAC,EACZC,EAAI,EAAGC,EAAMR,EAAK,MAAM,EAAGO,EAAIC,EAAKD,IAAK,CAChD,IAAIE,EAAST,EAAK,QAAQO,CAAC,EAC3BH,EAAiB,IAAIK,EAAQF,CAAC,CAChC,CACA,IAAIG,EAAYC,GAAiB,KAAK,KAAK,WAAW,EAAG,KAAK,OAAO,QAAS,KAAK,OAAO,YAAY,EACtG,OAAOC,EAAKF,EAAU,QAAS,SAAUZ,EAAQ,CAC/C,IAAIe,EAAOf,EAAO,KACdgB,EAAcV,EAAiB,IAAIS,CAAI,EAEvCE,EAA8BjB,EAAO,YAAcA,EAAO,WAAW,aACrEkB,EACAF,GAAe,MACjBE,EAAW,CACT,KAAMH,CACR,EACAP,EAAc,KAAKU,CAAQ,GAE3BA,EAAWhB,EAAK,eAAec,CAAW,EAE5CC,GAAsCE,GAAMD,EAAUD,CAA2B,CACnF,CAAC,EAIDf,EAAK,WAAWM,CAAa,EACtBN,CACT,EAKAT,EAAU,UAAU,gBAAkB,UAAY,CAChD,GAAI2B,GAAwB,IAAI,EAAE,OAASC,GAA0B,YAMrE,OAAO,KAAK,uBAAuB,MAAO,CACxC,WAAY,GACZ,UAAW,GACX,WAAY,EACd,CAAC,EAAE,OAAO,CAAC,CACb,EACA5B,EAAU,UAAU,WAAa,UAAY,CAC3C,OAAQ,KAAK,gBAAgB,GAAK,MAAM,OAAO,GACjD,EAOAA,EAAU,UAAU,YAAc,SAAUI,EAAW,CAGrD,IAAIK,EAAO,KAAK,QAAQ,EACxB,OAAOA,EAAK,IAAIA,EAAK,aAAa,OAAO,EAAGL,CAAS,CACvD,EAIAJ,EAAU,UAAU,eAAiB,SAAU6B,EAAY,CACzD,IAAIpB,EAAO,KAAK,QAAQ,EACxB,OAAOA,EAAK,aAAaA,EAAK,YAAYoB,CAAU,CAAC,CACvD,EAIA7B,EAAU,UAAU,cAAgB,SAAUI,EAAW0B,EAAgBC,EAAU,CAOjF,QALItB,EAAO,KAAK,QAAQ,EACpBuB,EAAQ,KAAK,YAAY5B,CAAS,EAClCkB,EAAOb,EAAK,QAAQL,CAAS,EAC7B6B,EAAc,KAAK,YACnBC,EAAc,CAAC,EACVlB,EAAI,EAAGA,EAAIiB,EAAY,OAAQjB,IAAK,CAC3C,IAAImB,EAAaF,EAAYjB,CAAC,EAAE,aAAa,YAAYM,CAAI,EACzDc,EAAW3B,EAAK,aAAa,OAAO,EACnC,MAAMwB,EAAYjB,CAAC,EAAE,aAAa,IAAIoB,EAAUD,CAAU,CAAC,GAC9DD,EAAY,KAAKD,EAAYjB,CAAC,EAAE,IAAI,CAExC,CACA,OAAOqB,GAAoB,UAAW,CACpC,OAAQH,EAAY,KAAK,IAAI,EAC7B,SAAU,CAACA,EAAY,OACvB,OAAQ,CAACG,GAAoB,YAAa,CACxC,KAAMf,EACN,MAAOU,CACT,CAAC,CAAC,CACJ,CAAC,CACH,EACAhC,EAAU,UAAU,QAAU,SAAUsC,EAAM,CAC5C,KAAK,OAAO,KAAOA,CACrB,EACAtC,EAAU,UAAU,UAAY,SAAUuC,EAAQ,CAChD,KAAK,OAAO,OAASA,CACvB,EACAvC,EAAU,UAAU,cAAgB,SAAUwC,EAAK,CACjD,IAAIC,EAAWD,EAAI,MAAQ,YACvBE,EAAOC,GAAaF,EAAU,EAAG,EAAGD,EAAI,UAAWA,EAAI,WAAYA,EAAI,UAAU,IAAI,EACzF,OAAAE,EAAK,SAASF,EAAI,SAAS,EAE3BE,EAAK,MAAM,OAAS,OAEhBD,EAAS,QAAQ,OAAO,EAAI,KAC9BC,EAAK,MAAM,OAASA,EAAK,MAAM,KAC/BA,EAAK,MAAM,KAAOE,EAAO,MAAM,UAC/BF,EAAK,MAAM,UAAY,GAElBA,CACT,EACA1C,EAAU,KAAO,aACjBA,EAAU,aAAe,CAAC,KAAK,EAC/BA,EAAU,WAAa,MACvBA,EAAU,cAAgB,CAIxB,EAAG,EACH,iBAAkB,MAElB,IAAK,GAML,KAAM,SAEN,IAAK,SAUL,YAAa,KAMb,iBAAkB,GAIlB,eAAgB,KAEhB,OAAQ,KACR,KAAM,EACN,WAAY,KACZ,aAAc,GACd,MAAO,CACL,KAAM,GACN,MAAO4C,EAAO,MAAM,QACtB,EAEA,UAAW,CACT,YAAa,GACb,YAAaA,EAAO,MAAM,OAC1B,UAAWA,EAAO,MAAM,UAC1B,EACA,SAAU,CACR,MAAO,CACL,KAAM,GACN,MAAOA,EAAO,MAAM,OACtB,EACA,UAAW,CACT,UAAWA,EAAO,MAAM,SAC1B,CACF,EACA,OAAQ,CACN,MAAO,CACL,KAAM,GACN,MAAOA,EAAO,MAAM,OACtB,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACtB,CACF,EACA,aAAc,MAChB,EACO5C,CACT,GAAE6C,EAAW,EACNC,IAAQ9C,IC9Nf,SAAS+C,IAAeC,EAAOC,EAAe,CAC5C,IAAIC,EAAc,CAAC,EACnB,OAAOC,EAAKH,EAAO,SAAUI,EAAM,CACjCA,EAAK,KAAKA,EAAK,aAAa,OAAO,EAAG,SAAUC,EAAOC,EAAK,CAE1D,IAAIC,EAAS,MAAQH,EAAK,QAAQE,CAAG,EACrCJ,EAAYK,CAAM,EAAIL,EAAYK,CAAM,GAAK,CAAC,EACzC,MAAMF,CAAK,GACdH,EAAYK,CAAM,EAAE,KAAKF,CAAK,CAElC,CAAC,CACH,CAAC,EACML,EAAM,CAAC,EAAE,IAAIA,EAAM,CAAC,EAAE,aAAa,OAAO,EAAG,SAAUK,EAAOC,EAAK,CAMxE,QALIC,EAAS,MAAQP,EAAM,CAAC,EAAE,QAAQM,CAAG,EACrCE,EAAM,EACNC,EAAM,IACNC,EAAM,KACNC,EAAMT,EAAYK,CAAM,EAAE,OACrBK,EAAI,EAAGA,EAAID,EAAKC,IACvBH,EAAM,KAAK,IAAIA,EAAKP,EAAYK,CAAM,EAAEK,CAAC,CAAC,EAC1CF,EAAM,KAAK,IAAIA,EAAKR,EAAYK,CAAM,EAAEK,CAAC,CAAC,EAC1CJ,GAAON,EAAYK,CAAM,EAAEK,CAAC,EAE9B,IAAIC,EACJ,OAAIZ,IAAkB,MACpBY,EAASJ,EACAR,IAAkB,MAC3BY,EAASH,EACAT,IAAkB,UAC3BY,EAASL,EAAMG,EAEfE,EAASL,EAEJG,IAAQ,EAAI,IAAME,CAC3B,CAAC,CACH,CACe,SAARC,GAAkCC,EAAS,CAChD,IAAIC,EAAe,CAAC,EACpBD,EAAQ,iBAAiB,MAAO,SAAUE,EAAa,CACrD,IAAIC,EAAeD,EAAY,gBAAgB,EAC3CE,EAAMD,EAAe,IAAMA,EAAa,GAAK,IAAMD,EAAY,WAAW,GAC7ED,EAAaG,CAAG,EAAIH,EAAaG,CAAG,GAAK,CAAC,GAAG,KAAKF,CAAW,CAChE,CAAC,EACMd,EAAKa,EAAc,SAAUI,EAAYD,EAAK,CAInD,QAHIf,EAAOL,IAAsBsB,EAAID,EAAY,SAAUH,EAAa,CACtE,OAAOA,EAAY,QAAQ,CAC7B,CAAC,EAAGG,EAAW,CAAC,EAAE,IAAI,qBAAqB,CAAC,EACnCR,EAAI,EAAGA,EAAIQ,EAAW,OAAQR,IACrCQ,EAAWR,CAAC,EAAE,aAAeQ,EAAWR,CAAC,EAAE,QAAQ,EAGrD,QAASA,EAAI,EAAGA,EAAIQ,EAAW,OAAQR,IACrCQ,EAAWR,CAAC,EAAE,YAAcQ,EAC5BA,EAAWR,CAAC,EAAE,aAAeA,IAAM,GAAK,CAACQ,EAAWR,CAAC,EAAE,gBAAgB,EACvEQ,EAAWR,CAAC,EAAE,QAAQR,EAAK,aAAa,CAAC,EACzCgB,EAAWR,CAAC,EAAE,WAAaQ,EAAW,CAAC,CAE3C,CAAC,CACH,CC3De,SAARE,GAAiCC,EAAS,CAC/C,IAAIC,EAAmB,CAAC,EACxBD,EAAQ,iBAAiB,MAAO,SAAUE,EAAW,CACnD,IAAIC,EAAUD,EAAU,WAAW,EACnC,GAAI,EAAAA,EAAU,gBAAgB,GAAKD,EAAiBE,CAAO,GAG3D,KAAIC,EAAmB,CAAC,EACjBC,EAAKH,EAAU,YAAa,SAAUI,EAAc,CACzD,IAAIC,EAAMD,EAAa,iBACnBE,EAAOF,EAAa,aACpBA,EAAa,IAAI,kBAAkB,GAAKN,EAAQ,aAAa,QAAQ,GACvEQ,EAAK,KAAKA,EAAK,aAAa,OAAO,EAAG,SAAUC,EAAOC,EAAK,CAC1D,IAAIC,EAAOH,EAAK,QAAQE,CAAG,EACvBE,EAASL,EAAI,UAAUI,CAAI,EAI/B,GAAI,GAACC,GAAU,MAAMH,CAAK,GAG1B,KAAII,EAAST,EAAiBO,CAAI,GAAK,EACnCG,EAAQP,EAAI,YAAYK,EAAO,UAAU,CAAC,EAC9CR,EAAiBO,CAAI,EAAIE,EAAS,EAClCL,EAAK,cAAcE,EAAK,CACtB,MAAOI,EACP,OAAQD,CACV,CAAC,EACH,CAAC,CAEL,CAAC,EAED,IAAIL,EAAON,EAAU,QAAQ,EAC7BM,EAAK,KAAK,SAAUE,EAAK,CACvB,IAAIC,EAAOH,EAAK,QAAQE,CAAG,EACvBK,EAASP,EAAK,cAAcE,CAAG,GAAK,CAAC,EACzCK,EAAO,UAAY,CAACX,EAAiBO,CAAI,EACzCH,EAAK,cAAcE,EAAKK,CAAM,CAChC,CAAC,EACDd,EAAiBE,CAAO,EAAI,GAC9B,CAAC,CACH,CC9BA,IAAIa,IAA0BC,GAC1BC,KAAoB,SAAUC,EAAQ,CACxCC,EAAUF,EAAMC,CAAM,EACtB,SAASD,EAAKG,EAAMC,EAAK,CACvB,IAAIC,EAAQJ,EAAO,KAAK,IAAI,GAAK,KACjC,OAAAI,EAAM,KAAO,OACbA,EAAM,WAAa,CAAC,IAAK,GAAG,EAM5BA,EAAM,mBAAqB,IAAIC,GAI/BD,EAAM,kBAAoB,IAAIC,GAC9BD,EAAM,KAAOF,EACbE,EAAM,KAAOD,EACNC,CACT,CACA,OAAAL,EAAK,UAAU,gBAAkB,SAAUO,EAAGC,EAAGC,EAAOC,EAAQ,CAC9D,YAAK,MAAQ,IAAIC,GAAaJ,EAAGC,EAAGC,EAAOC,CAAM,EACjD,KAAK,qBAAqB,EACnB,KAAK,KACd,EACAV,EAAK,UAAU,gBAAkB,UAAY,CAC3C,OAAO,KAAK,KACd,EAKAA,EAAK,UAAU,YAAc,SAAUO,EAAGC,EAAGC,EAAOC,EAAQ,CAC1D,KAAK,aAAaH,EAAGC,EAAGC,EAAOC,CAAM,EACrC,KAAK,UAAY,IAAIC,GAAaJ,EAAGC,EAAGC,EAAOC,CAAM,CACvD,EAIAV,EAAK,UAAU,aAAe,SAAUO,EAAGC,EAAGC,EAAOC,EAAQ,CAC3D,IAAIE,EAAO,KAAK,gBAAgB,EAC5BC,EAAe,KAAK,kBACxBA,EAAa,UAAYD,EAAK,mBAAmB,IAAID,GAAaJ,EAAGC,EAAGC,EAAOC,CAAM,CAAC,EACtF,IAAII,EAAYD,EAAa,OAC7BA,EAAa,OAAS,KACtBA,EAAa,mBAAmB,EAChCA,EAAa,OAASC,EACtB,KAAK,iBAAiB,CACxB,EAQAd,EAAK,UAAU,UAAY,SAAUe,EAAa,CAMhD,IAAIX,EAAM,KAAK,KACXA,GAAOA,EAAI,KAAOA,EAAI,SAAWA,EAAI,QAAQ,WAAW,8BAA8B,GAAKW,IAC7FA,EAAc,CAACC,GAAaD,EAAY,CAAC,EAAGX,EAAI,IAAI,SAAS,CAAC,EAAGY,GAAaD,EAAY,CAAC,EAAGX,EAAI,IAAI,SAAS,CAAC,CAAC,GAEnH,KAAK,cAAgBa,GAAMF,CAAW,EACtC,KAAK,qBAAqB,CAC5B,EACAf,EAAK,UAAU,QAAU,SAAUkB,EAAM,CACvC,KAAK,MAAQC,GAAiBD,GAAQ,EAAG,KAAK,SAAS,EACvD,KAAK,qBAAqB,CAC5B,EAIAlB,EAAK,UAAU,iBAAmB,UAAY,CAE5C,IAAIoB,EAAU,KAAK,gBAAgB,EAC/BC,EAAKD,EAAQ,EAAIA,EAAQ,MAAQ,EACjCE,EAAKF,EAAQ,EAAIA,EAAQ,OAAS,EACtC,MAAO,CAACC,EAAIC,CAAE,CAChB,EACAtB,EAAK,UAAU,UAAY,UAAY,CACrC,OAAO,KAAK,SAAW,KAAK,iBAAiB,CAC/C,EACAA,EAAK,UAAU,QAAU,UAAY,CACnC,OAAO,KAAK,OAAS,CACvB,EACAA,EAAK,UAAU,iBAAmB,UAAY,CAC5C,OAAO,KAAK,mBAAmB,kBAAkB,CACnD,EAKAA,EAAK,UAAU,qBAAuB,UAAY,CAChD,IAAIuB,EAAe,KAAK,cACpBX,EAAO,KAAK,MACZW,GAAgBX,IAClB,KAAK,QAAU,CAACI,GAAaO,EAAa,CAAC,EAAGX,EAAK,MAAOA,EAAK,CAAC,EAAGI,GAAaO,EAAa,CAAC,EAAGX,EAAK,OAAQA,EAAK,CAAC,CAAC,GAGvH,IAAIY,EAAqB,KAAK,kBAAkB,kBAAkB,EAC9DC,EAAgB,KAAK,mBACrBC,EAAgB,KAAK,iBAAiB,EACtCC,EAAS,KAAK,UAAU,EACxBT,EAAO,KAAK,QAAQ,EACxBS,EAAgB5B,GAAe,CAAC,EAAG4B,EAAQH,CAAkB,EAC7DE,EAAuB3B,GAAe,CAAC,EAAG2B,EAAeF,CAAkB,EAC3EC,EAAc,QAAUE,EAAO,CAAC,EAChCF,EAAc,QAAUE,EAAO,CAAC,EAChCF,EAAc,EAAIC,EAAc,CAAC,EAAIC,EAAO,CAAC,EAC7CF,EAAc,EAAIC,EAAc,CAAC,EAAIC,EAAO,CAAC,EAC7CF,EAAc,OAASA,EAAc,OAASP,EAC9C,KAAK,iBAAiB,CACxB,EAKAlB,EAAK,UAAU,iBAAmB,UAAY,CAC5C,IAAI4B,EAAoB,KAAK,mBACzBC,EAAmB,KAAK,kBAC5BA,EAAiB,OAASD,EAC1BA,EAAkB,gBAAgB,EAClCC,EAAiB,gBAAgB,EAC1BC,GAAK,KAAK,YAAc,KAAK,UAAY,CAAC,GAAID,EAAiB,WAAoBE,GAAO,CAAC,EAClG,KAAK,cAAgBF,EAAiB,kBAAkB,EACxD,KAAK,aAAe,KAAK,cAAgB,CAAC,EACnCG,GAAO,KAAK,aAAc,KAAK,SAAS,EAC/C,KAAK,mBAAmB,CAC1B,EACAhC,EAAK,UAAU,iBAAmB,UAAY,CAC5C,IAAI6B,EAAmB,KAAK,kBACxBD,EAAoB,KAAK,mBAIzBK,EAAqB,IAAI3B,GAC7B,OAAA2B,EAAmB,UAAYL,EAAkB,UACjDK,EAAmB,mBAAmB,EAC/B,CACL,KAAM,CACJ,EAAGA,EAAmB,EACtB,EAAGA,EAAmB,EACtB,OAAQA,EAAmB,OAC3B,OAAQA,EAAmB,MAC7B,EACA,IAAK,CACH,EAAGJ,EAAiB,EACpB,EAAGA,EAAiB,EACpB,OAAQA,EAAiB,OACzB,OAAQA,EAAiB,MAC3B,CACF,CACF,EACA7B,EAAK,UAAU,YAAc,UAAY,CACvC,OAAO,KAAK,SACd,EAIAA,EAAK,UAAU,qBAAuB,UAAY,CAChD,IAAIY,EAAO,KAAK,gBAAgB,EAAE,MAAM,EACxC,OAAAA,EAAK,eAAe,KAAK,SAAS,EAC3BA,CACT,EAIAZ,EAAK,UAAU,YAAc,SAAUkC,EAAMC,EAAQC,EAAK,CACxD,IAAIC,EAAYF,EAAS,KAAK,cAAgB,KAAK,UACnD,OAAAC,EAAMA,GAAO,CAAC,EACPC,EAAYvC,IAAiBsC,EAAKF,EAAMG,CAAS,EAAWP,GAAKM,EAAKF,CAAI,CACnF,EAIAlC,EAAK,UAAU,YAAc,SAAUsC,EAAOC,EAAUH,EAAK,CAC3DA,EAAMA,GAAO,CAAC,EACd,IAAII,EAAe,KAAK,aACxB,OAAOA,EAAe1C,IAAiBsC,EAAKE,EAAOE,CAAY,GAAKJ,EAAI,CAAC,EAAIE,EAAM,CAAC,EAAGF,EAAI,CAAC,EAAIE,EAAM,CAAC,EAAGF,EAC5G,EACApC,EAAK,UAAU,eAAiB,SAAUyC,EAASC,EAAQC,EAAO,CAChE,IAAIC,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYD,CAAK,EAAI,IAC3D,EACA3C,EAAK,UAAU,iBAAmB,SAAUyC,EAASC,EAAQI,EAAO,CAClE,IAAIF,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYE,CAAK,EAAI,IAC3D,EAIA9C,EAAK,UAAU,aAAe,SAAUsC,EAAO,CAC7C,OAAO,KAAK,qBAAqB,EAAE,QAAQA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC/D,EACAtC,EAAK,WAAa,CAAC,IAAK,GAAG,EACpBA,CACT,GAAEM,EAAa,EACf,SAASuC,IAAYH,EAAQ,CAC3B,IAAIK,EAAcL,EAAO,YACzB,OAAOK,EAAcA,EAAY,iBAAmB,IACtD,CACA,IAAOC,GAAQhD,ICnNf,IAAIiD,IAAqB,CACvB,QAAW,CACT,YAAa,IACb,gBAAiB,EACnB,EACA,OAAU,CACR,YAAa,EACb,gBAAiB,EACnB,CACF,EACWC,GAAkB,CAAC,MAAO,KAAK,EACtCC,KAAmB,SAAUC,EAAQ,CACvCC,EAAUF,EAAKC,CAAM,EACrB,SAASD,EAAIG,EAAMC,EAAKC,EAAK,CAC3B,IAAIC,EAAQL,EAAO,KAAK,KAAME,EAAM,CAClC,IAAKE,EAAI,IACT,QAASA,EAAI,OACf,CAAC,GAAK,KACNC,EAAM,WAAaP,GACnBO,EAAM,KAAO,MAEbA,EAAM,cAAuBC,GAAc,EAC3CD,EAAM,IAAMF,EACZ,IAAII,EAAaH,EAAI,WACjBI,EAASC,GAAiB,KAAKN,EAAKC,EAAI,QAASA,EAAI,YAAY,EACjEM,EAAWD,GAAiB,eAAeN,CAAG,EAC9CQ,EAAeN,EAAM,aAAeK,EAAWA,EAAS,KAAO,KAC/DE,EAAUP,EAAM,QAAUG,EAAO,QACjCK,EAAgBhB,IAAmBa,EAAS,IAAI,EACpDL,EAAM,YAAcG,EAAO,WAC3BH,EAAM,QAAUG,EAAO,QAgBvBH,EAAM,WAAaE,EACnB,IAAIO,EACJ,GAAIP,EAEF,QAASQ,EAAI,EAAGA,EAAIH,EAAQ,OAAQG,IAAK,CACvC,IAAIC,EAAaJ,EAAQG,CAAC,EAAE,gBAAgBR,CAAU,EACtDO,EAAeA,GAAgBE,EAAW,MAAM,EAChDF,EAAa,MAAME,CAAU,CAC/B,MAEAF,EAAeN,EAAO,aAExB,OAAAH,EAAM,gBAAgBS,EAAa,EAAGA,EAAa,EAAGA,EAAa,MAAOA,EAAa,MAAM,EAI7FT,EAAM,YAAcE,EAAa,EAAWU,GAAUb,EAAI,YAAaS,EAAc,WAAW,EAEhGR,EAAM,iBAAmBE,EAAa,GAAQM,EAAc,gBACrDR,CACT,CACA,OAAAN,EAAI,UAAU,aAAe,SAAUmB,EAAGC,EAAGC,EAAOC,EAAQ,CAC1D,IAAIC,EAAO,KAAK,gBAAgB,EAC5BC,EAAkB,KAAK,iBAC3BD,EAAOA,EAAK,MAAM,EACdC,IAEFD,EAAK,EAAI,CAACA,EAAK,EAAIA,EAAK,QAE1B,IAAIE,EAAmB,KAAK,kBAC5BA,EAAiB,UAAYF,EAAK,mBAAmB,IAAIG,GAAaP,EAAGC,EAAGC,EAAOC,CAAM,CAAC,EAC1F,IAAIK,EAAYF,EAAiB,OACjCA,EAAiB,OAAS,KAC1BA,EAAiB,mBAAmB,EACpCA,EAAiB,OAASE,EACtBH,IACFC,EAAiB,OAAS,CAACA,EAAiB,QAE9C,KAAK,iBAAiB,CACxB,EACAzB,EAAI,UAAU,UAAY,SAAUG,EAAM,CACxC,OAAO,KAAK,YAAY,IAAIA,CAAI,CAClC,EACAH,EAAI,UAAU,iBAAmB,SAAU4B,EAAO,CAEhD,QADIf,EAAU,KAAK,QACV,EAAI,EAAG,EAAIA,EAAQ,OAAQ,IAAK,CACvC,IAAIgB,EAAShB,EAAQ,CAAC,EACtB,GAAIgB,EAAO,OAAS,WAAaA,EAAO,QAAQD,CAAK,EACnD,OAAOf,EAAQ,CAAC,CAEpB,CACF,EAIAb,EAAI,UAAU,YAAc,SAAUG,EAAM2B,EAAU,CACpD,KAAK,cAAc,IAAI3B,EAAM2B,CAAQ,CACvC,EAIA9B,EAAI,UAAU,YAAc,SAAUG,EAAM,CAC1C,IAAI0B,EAAS,KAAK,YAAY,IAAI1B,CAAI,EAEtC,OAAO,KAAK,cAAc,IAAIA,CAAI,GAAK0B,GAAUA,EAAO,UAAU,CACpE,EACA7B,EAAI,UAAU,YAAc,SAAU+B,EAAMC,EAAQC,EAAK,CAKvD,GAJWC,GAASH,CAAI,IAEtBA,EAAO,KAAK,YAAYA,CAAI,GAE1BA,EAAM,CACR,IAAIvB,EAAa,KAAK,WACtB,OAAIA,IAEFuB,EAAOvB,EAAW,QAAQuB,CAAI,GAEzBA,GAAQ,KAAK,iBAAiBA,EAAMC,EAAQC,CAAG,CACxD,CACF,EACAjC,EAAI,UAAU,YAAc,SAAUmC,EAAOC,EAAUH,EAAK,CAC1D,IAAIzB,EAAa,KAAK,WACtB,OAAIA,IAEF2B,EAAQ3B,EAAW,UAAU2B,CAAK,GAI7BA,GAAS,KAAK,iBAAiBA,EAAOF,CAAG,CAClD,EAIAjC,EAAI,UAAU,iBAAmB,SAAUmC,EAAOF,EAAK,CACrD,OAAOhC,EAAO,UAAU,YAAY,KAAK,KAAMkC,EAAO,EAAGF,CAAG,CAC9D,EACAjC,EAAI,UAAU,iBAAmB,SAAUqC,EAAWL,EAAQC,EAAK,CACjE,OAAOhC,EAAO,UAAU,YAAY,KAAK,KAAMoC,EAAWL,EAAQC,CAAG,CACvE,EACAjC,EAAI,UAAU,eAAiB,SAAUsC,EAASC,EAAQC,EAAO,CAC/D,IAAIC,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYD,CAAK,EAAI,IAC3D,EACAxC,EAAI,UAAU,iBAAmB,SAAUsC,EAASC,EAAQI,EAAO,CACjE,IAAIF,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYE,CAAK,EAAI,IAC3D,EACO3C,CACT,GAAE4C,EAAI,EAECC,GAAM7C,IAAK4C,EAAI,EACtB,SAASF,IAAYH,EAAQ,CAC3B,IAAIO,EAAWP,EAAO,SAClBQ,EAAcR,EAAO,YACzB,OAAOO,EAAWA,EAAS,iBAAmBC,EAAcA,EAAY,mBACpEA,EAAY,uBAAuB,MAAOC,EAAgB,EAAE,OAAO,CAAC,GAAK,CAAC,GAAG,iBAAmB,IACtG,CACA,IAAOC,GAAQjD,IC/Jf,SAASkD,IAAUC,EAAUC,EAAK,CAChC,IAAIC,EAAiBF,EAAS,IAAI,gBAAgB,EAClD,GAAIE,GAAkB,KAAM,CAC1B,IAAIC,EAAYD,EAAe,CAAC,EAC5BE,EAAgBF,EAAe,CAAC,EACpC,GAAM,SAASC,EAAU,CAAC,CAAC,GAAK,SAASA,EAAU,CAAC,CAAC,GAAK,SAASC,EAAc,CAAC,CAAC,GAAK,SAASA,EAAc,CAAC,CAAC,EAI1G,CAEL,IAAIC,EAAe,KAAK,WACxB,GAAIA,EAAc,CAChB,IAAIC,EAAOH,EAAU,CAAC,EAClBI,EAAOJ,EAAU,CAAC,EAClBK,EAAOJ,EAAc,CAAC,EACtBK,EAAOL,EAAc,CAAC,EAC1BD,EAAY,CAAC,IAAU,GAAQ,EAC/BC,EAAgB,CAAC,KAAW,IAAS,EAErC,IAAIM,EAAa,SAAUC,EAAIC,EAAIC,EAAIC,EAAI,CAGzC,QAFIC,EAAKF,EAAKF,EACVK,EAAKF,EAAKF,EACLK,EAAI,EAAGA,GAAK,IAAKA,IAAK,CAC7B,IAAIC,EAAID,EAAI,IACRE,EAAKd,EAAa,QAAQ,CAACM,EAAKI,EAAKG,EAAGN,EAAKI,EAAKE,CAAC,CAAC,EACjDE,GAAIjB,EAAWA,EAAWgB,CAAE,EAC5BE,GAAIjB,EAAeA,EAAee,CAAE,CAC7C,CACF,EAEAT,EAAWJ,EAAMC,EAAMC,EAAMD,CAAI,EAEjCG,EAAWF,EAAMD,EAAMC,EAAMC,CAAI,EAEjCC,EAAWF,EAAMC,EAAMH,EAAMG,CAAI,EAEjCC,EAAWJ,EAAMG,EAAMD,EAAMD,CAAI,CACnC,CACA,KAAK,gBAAgBJ,EAAU,CAAC,EAAGA,EAAU,CAAC,EAAGC,EAAc,CAAC,EAAID,EAAU,CAAC,EAAGC,EAAc,CAAC,EAAID,EAAU,CAAC,CAAC,CACnH,CACF,CACA,IAAImB,EAAO,KAAK,gBAAgB,EAC5BC,EAAevB,EAAS,IAAI,cAAc,EAC1CwB,EAAaxB,EAAS,IAAI,YAAY,EAGtCyB,EAAsBC,GAAyB1B,EAAUC,CAAG,EAAE,aAC9D0B,EAASL,EAAK,MAAQA,EAAK,OAAS,KAAK,YACzCM,EAAmB,GACnBC,EACAC,EACAP,GAAgBC,IAClBK,EAAS,CAAYE,GAAaR,EAAa,CAAC,EAAGE,EAAa,KAAK,EAAIA,EAAa,EAAcM,GAAaR,EAAa,CAAC,EAAGE,EAAa,MAAM,EAAIA,EAAa,CAAC,EACvKK,EAAkBC,GAAaP,EAAY,KAAK,IAAIC,EAAa,MAAOA,EAAa,MAAM,CAAC,EACxF,CAAC,MAAMI,EAAO,CAAC,CAAC,GAAK,CAAC,MAAMA,EAAO,CAAC,CAAC,GAAK,CAAC,MAAMC,CAAI,IACvDF,EAAmB,KAOvB,IAAII,EACJ,GAAIJ,EACFI,EAAW,CAAC,EACRL,EAAS,GAEXK,EAAS,MAAQF,EACjBE,EAAS,OAASF,EAAOH,IAEzBK,EAAS,OAASF,EAClBE,EAAS,MAAQF,EAAOH,GAE1BK,EAAS,EAAIH,EAAO,CAAC,EAAIG,EAAS,OAAS,EAC3CA,EAAS,EAAIH,EAAO,CAAC,EAAIG,EAAS,MAAQ,MACrC,CAEL,IAAIC,EAAkBjC,EAAS,mBAAmB,EAClDiC,EAAgB,OAASN,EACzBK,EAAkBE,GAAcD,EAAiBR,CAAY,EAC7DO,EAAkBG,GAAoBnC,EAAUgC,EAAUL,CAAM,CAClE,CACA,KAAK,YAAYK,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EACxE,KAAK,UAAUhC,EAAS,IAAI,QAAQ,CAAC,EACrC,KAAK,QAAQA,EAAS,IAAI,MAAM,CAAC,CACnC,CAGA,SAASoC,IAAaC,EAAKC,EAAO,CACzBC,EAAKD,EAAM,IAAI,UAAU,EAAG,SAAUE,EAAUC,EAAM,CAC3DJ,EAAI,YAAYI,EAAMD,CAAQ,CAChC,CAAC,CACH,CACA,IAAIE,KAA0B,UAAY,CACxC,SAASA,GAAa,CAEpB,KAAK,WAAaC,EACpB,CACA,OAAAD,EAAW,UAAU,OAAS,SAAUE,EAAS3C,EAAK,CACpD,IAAI4C,EAAU,CAAC,EACf,SAASC,EAAuBR,EAAO,CACrC,MAAO,CACL,aAAcA,EAAM,IAAI,cAAc,EACtC,YAAaA,EAAM,IAAI,aAAa,EACpC,WAAYA,EAAM,IAAI,YAAY,CACpC,CACF,CAEAM,EAAQ,cAAc,MAAO,SAAU5C,EAAU+C,EAAK,CACpD,IAAIC,EAAUhD,EAAS,IAAI,KAAK,EAC5BqC,EAAM,IAAIY,GAAID,EAAUD,EAAKC,EAAgBE,EAAO,CACtD,QAASlD,EAAS,IAAI,SAAS,EAC/B,IAAKC,EACL,QAAS2C,CACX,EAAGE,EAAuB9C,CAAQ,CAAC,CAAC,EACpCqC,EAAI,UAAYrC,EAAS,IAAI,YAAY,EACzC6C,EAAQ,KAAKR,CAAG,EAEhBrC,EAAS,iBAAmBqC,EAC5BA,EAAI,MAAQrC,EAEZqC,EAAI,OAAStC,IACbsC,EAAI,OAAOrC,EAAUC,CAAG,CAC1B,CAAC,EACD2C,EAAQ,WAAW,SAAUO,EAAa,CACxCC,GAAuB,CACrB,YAAaD,EACb,aAAc,MACd,iBAAkB,UAAY,CAC5B,IAAInD,EAAWmD,EAAY,UAAY,MAAQA,EAAY,gBAAgB,EAAIA,EAAY,uBAAuB,MAAOE,EAAgB,EAAE,OAAO,CAAC,EACnJ,OAAOrD,GAAYA,EAAS,gBAC9B,EACA,cAAe,EACjB,CAAC,CACH,CAAC,EAED,IAAIsD,EAAwB,CAAC,EAC7B,OAAAV,EAAQ,iBAAiB,MAAO,SAAUO,EAAa,CACrD,GAAI,CAACA,EAAY,gBAAgB,EAAG,CAClC,IAAII,EAAUJ,EAAY,WAAW,EACrCG,EAAsBC,CAAO,EAAID,EAAsBC,CAAO,GAAK,CAAC,EACpED,EAAsBC,CAAO,EAAE,KAAKJ,CAAW,CACjD,CACF,CAAC,EACMZ,EAAKe,EAAuB,SAAUE,EAAWD,EAAS,CAC/D,IAAIE,EAAqBC,EAAIF,EAAW,SAAUG,EAAiB,CACjE,OAAOA,EAAgB,IAAI,SAAS,CACtC,CAAC,EACGtB,EAAM,IAAIY,GAAIM,EAASA,EAAgBL,EAAO,CAChD,QAAgBU,GAASH,CAAW,EACpC,IAAKxD,EACL,QAAS2C,CACX,EAAGE,EAAuBU,EAAU,CAAC,CAAC,CAAC,CAAC,EACxCnB,EAAI,UAAmBwB,GAAS,MAAM,KAAaH,EAAIF,EAAW,SAAUG,EAAiB,CAC3F,OAAOA,EAAgB,IAAI,YAAY,CACzC,CAAC,CAAC,EACFd,EAAQ,KAAKR,CAAG,EAEhBA,EAAI,OAAStC,IACbsC,EAAI,OAAOmB,EAAU,CAAC,EAAGvD,CAAG,EACrBsC,EAAKiB,EAAW,SAAUG,EAAiB,CAChDA,EAAgB,iBAAmBtB,EACnCD,IAAaC,EAAKsB,CAAe,CACnC,CAAC,CACH,CAAC,EACMd,CACT,EAIAH,EAAW,UAAU,iBAAmB,SAAUoB,EAAiBd,EAASe,EAASC,EAAc,CAIjG,QAFIC,GAAcH,GAAmB,CAAC,GAAG,MAAM,EAC3CI,EAAqBC,GAAc,EAC9BlD,EAAI,EAAGA,EAAIgD,EAAW,OAAQhD,IACrCiD,EAAY,IAAID,EAAWhD,CAAC,EAAE,KAAMgD,EAAWhD,CAAC,CAAC,EAEnD,IAAImD,EAASC,GAAiB,KAAKrB,EAASe,EAASC,CAAY,EACjE,OAAOzB,EAAK6B,EAAO,QAAS,SAAUE,EAAQ,CAC5C,IAAI7B,EAAO6B,EAAO,KACdC,EAAeL,EAAY,IAAIzB,CAAI,EAEnC+B,EAA8BF,EAAO,YAAcA,EAAO,WAAW,aACpEC,IACHA,EAAe,CACb,KAAM9B,CACR,EACAwB,EAAW,KAAKM,CAAY,GAE9BC,GAAsCC,GAAMF,EAAcC,CAA2B,CACvF,CAAC,EACMP,CACT,EACOvB,CACT,GAAE,EACEgC,IAAa,IAAIhC,IACdiC,GAAQD,ICvMf,IAAIE,KAAwB,SAAUC,EAAQ,CAC5CC,EAAUF,EAAUC,CAAM,EAC1B,SAASD,GAAW,CAClB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAS,KACfG,CACT,CACA,OAAAH,EAAS,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CAChE,KAAK,qBAAqBF,EAAQE,CAAO,EACzC,IAAIC,EAASC,GAAiB,eAAeJ,EAAO,GAAG,EACvD,GAAIG,GAAUA,EAAO,OAAS,UAAW,CACvC,IAAIE,EAAYL,EAAO,UAAYA,EAAO,WAAa,CAAC,EAClD,UAAWK,IACfA,EAAU,MAAQL,EAAO,uBAAyBM,EAAO,MAAM,eAEnE,CAEUC,GAAgBP,EAAQ,QAAS,CAAC,MAAM,CAAC,CACrD,EACAJ,EAAS,UAAU,cAAgB,UAAY,CAC7C,IAAIG,EAAQ,KACRC,EAAS,KAAK,OAClBA,EAAO,QAAUQ,GAAW,iBAAiBR,EAAO,QAASA,EAAO,IAAKA,EAAO,QAASA,EAAO,YAAY,EAC5G,IAAIS,EAAc,CAAC,EACnB,KAAK,gBAAyBC,GAAOV,EAAO,SAAW,CAAC,EAAG,SAAUW,EAAgBC,EAAW,CAC9F,IAAIC,EAAaD,EAAU,KAC3B,OAAIC,IACFF,EAAe,IAAIE,EAAY,IAAIC,GAAMF,EAAWb,EAAOA,EAAM,OAAO,CAAC,EACrEa,EAAU,WACZH,EAAYI,CAAU,EAAI,KAGvBF,CACT,EAAUI,GAAc,CAAC,EACpBf,EAAO,cACVA,EAAO,YAAcS,EAEzB,EAIAb,EAAS,UAAU,eAAiB,SAAUoB,EAAM,CAClD,OAAO,KAAK,gBAAgB,IAAIA,CAAI,GAAK,IAAIF,GAAM,KAAM,KAAM,KAAK,OAAO,CAC7E,EAKAlB,EAAS,UAAU,kBAAoB,SAAUoB,EAAMC,EAAQ,CAC7D,IAAIC,EAAc,KAAK,eAAeF,CAAI,EACtCG,EAAYF,IAAW,SAAWC,EAAY,IAAI,CAAC,QAAS,WAAW,CAAC,EAAIA,EAAY,IAAI,CAAC,WAAY,QAAS,WAAW,CAAC,EAC9HE,EAAS,CACX,KAAMJ,CACR,EACA,GAAWK,GAAWF,CAAS,EAC7B,OAAAC,EAAO,OAASH,EACTE,EAAUC,CAAM,EAClB,GAAWE,GAASH,CAAS,EAClC,OAAOA,EAAU,QAAQ,MAAOH,GAAsB,EAAE,CAE5D,EACApB,EAAS,UAAU,QAAU,SAAU2B,EAAM,CAC3C,KAAK,OAAO,KAAOA,CACrB,EACA3B,EAAS,UAAU,UAAY,SAAU4B,EAAQ,CAC/C,KAAK,OAAO,OAASA,CACvB,EAEA5B,EAAS,UAAU,OAAS,SAAUoB,EAAM,CAC1C,IAAIhB,EAAS,KAAK,OACdyB,EAAezB,EAAO,aAC1B,GAAKyB,EAGL,CAAIA,IAAiB,aACnBzB,EAAO,YAAc,MAEvB,IAAIS,EAAcT,EAAO,cAAgBA,EAAO,YAAc,CAAC,GAC/DS,EAAYO,CAAI,EAAI,GACtB,EACApB,EAAS,UAAU,SAAW,SAAUoB,EAAM,CAC5C,IAAIP,EAAc,KAAK,OAAO,YAC1BA,IACFA,EAAYO,CAAI,EAAI,GAExB,EACApB,EAAS,UAAU,eAAiB,SAAUoB,EAAM,CAClD,KAAK,KAAK,WAAWA,CAAI,EAAI,WAAa,QAAQ,EAAEA,CAAI,CAC1D,EACApB,EAAS,UAAU,WAAa,SAAUoB,EAAM,CAC9C,IAAIP,EAAc,KAAK,OAAO,YAC9B,MAAO,CAAC,EAAEA,GAAeA,EAAYO,CAAI,EAC3C,EACApB,EAAS,KAAO,MAChBA,EAAS,WAAa,MACtBA,EAAS,cAAgB,CAEvB,EAAG,EACH,KAAM,GACN,KAAM,SACN,IAAK,SAIL,YAAa,KAMb,OAAQ,GAER,IAAK,GAGL,eAAgB,KAEhB,OAAQ,KACR,KAAM,EACN,WAAY,KAEZ,MAAO,CACL,KAAM,GACN,MAAOU,EAAO,MAAM,QACtB,EACA,UAAW,CACT,YAAa,GACb,YAAaA,EAAO,MAAM,MAC5B,EACA,SAAU,CACR,MAAO,CACL,KAAM,GACN,MAAOA,EAAO,MAAM,OACtB,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACtB,CACF,EACA,OAAQ,CACN,MAAO,CACL,KAAM,GACN,MAAOA,EAAO,MAAM,OACtB,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACtB,CACF,EACA,QAAS,CAAC,CAIZ,EACOV,CACT,GAAE8B,EAAc,EACTC,IAAQ/B,IC9Jf,IAAIgC,KAAuB,SAAUC,EAAQ,CAC3CC,EAAUF,EAASC,CAAM,EACzB,SAASD,GAAU,CACjB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAQ,KACrBG,EAAM,iBAAmB,GAClBA,CACT,CACA,OAAAH,EAAQ,UAAU,KAAO,SAAUI,EAASC,EAAK,CAC/C,KAAK,KAAOA,CACd,EACAL,EAAQ,UAAU,OAAS,SAAUM,EAAUF,EAASC,EAAKE,EAAS,CAEpE,GADA,KAAK,OAASD,EACV,CAACA,EAAS,IAAI,MAAM,EAAG,CACzB,KAAK,UAAY,KAAK,SAAS,OAAO,EACtC,KAAK,SAAW,KAChB,MACF,CACK,KAAK,WACR,KAAK,SAAW,IAAIE,GAAQH,CAAG,GAEjC,IAAII,EAAU,KAAK,SACnBA,EAAQ,KAAKH,EAAUF,EAASC,EAAK,KAAME,CAAO,EAClDE,EAAQ,MAAM,GAAG,QAAS,KAAK,mBAAoB,IAAI,EACvDA,EAAQ,MAAM,OAASH,EAAS,IAAI,QAAQ,EAC5C,KAAK,MAAM,IAAIG,EAAQ,KAAK,EAC5B,KAAK,mBAAmBH,EAAUF,EAASC,CAAG,CAChD,EACAL,EAAQ,UAAU,mBAAqB,SAAUU,EAAG,CAClD,IAAIC,EACJC,GAAoBF,EAAE,OAAQ,SAAUG,EAAS,CAC/C,OAAQF,EAAYG,GAAUD,CAAO,EAAE,YAAc,IACvD,EAAG,EAAI,EACHF,GACF,KAAK,KAAK,eAAe,CACvB,KAAM,kBACN,MAAO,KAAK,OAAO,GACnB,KAAMA,EAAU,IAClB,CAAC,CAEL,EACAX,EAAQ,UAAU,mBAAqB,SAAUe,EAAOX,EAASC,EAAK,CACpE,IAAIF,EAAQ,KACZ,KAAK,SAAS,MAAM,SAAS,SAAUa,EAAM,CAC3C,IAAIL,EAAYG,GAAUE,CAAI,EAAE,UAChC,GAAIL,EACF,OAAAR,EAAM,OAAO,WAAWQ,EAAU,IAAI,EAAIN,EAAI,YAAYW,CAAI,EAAIX,EAAI,YAAYW,CAAI,EAE/E,EAEX,CAAC,CACH,EACAhB,EAAQ,UAAU,wBAA0B,SAAUiB,EAAM,CAC1D,OAAO,KAAK,UAAY,KAAK,SAAS,wBAAwBA,EAAM,KAAK,MAAM,CACjF,EACAjB,EAAQ,UAAU,QAAU,UAAY,CACtC,KAAK,UAAY,KAAK,SAAS,OAAO,CACxC,EACAA,EAAQ,KAAO,MACRA,CACT,GAAEkB,EAAa,EACRC,IAAQnB,IC5Df,SAASoB,IAAYC,EAASC,EAASC,EAAc,CACnDC,GAAiB,YAAYH,EAASC,EAASC,CAAY,CAC7D,CACO,SAASE,GAAQC,EAAW,CACjCA,EAAU,yBAAyB,MAAOC,EAAU,EACpDD,EAAU,uBAAuBE,GAAQ,EACzCF,EAAU,sBAAsBG,GAAO,EACvCH,EAAU,aAAa,cAAeN,GAAW,EACjDM,EAAU,aAAa,SAAU,SAAUL,EAAS,CAClD,OAAOG,GAAiB,cAAcH,CAAO,CAC/C,CAAC,EACD,SAASS,EAAWC,EAAQC,EAAY,CACtCA,EAAW,OAAS,yBACpBN,EAAU,eAAeM,EAAY,SAAUC,EAASC,EAAS,CAC/D,IAAIC,EAAW,CAAC,EACZC,EAAc,CAAC,EACnB,OAAAF,EAAQ,cAAc,CACpB,SAAU,MACV,MAAOD,CACT,EAAG,SAAUI,EAAU,CACrBA,EAASN,CAAM,EAAEE,EAAQ,IAAI,EAC7B,IAAIK,EAAMD,EAAS,iBACnBE,EAAKD,EAAI,QAAS,SAAUE,EAAQ,CAClCL,EAASK,EAAO,IAAI,EAAIH,EAAS,WAAWG,EAAO,IAAI,GAAK,EAC9D,CAAC,EAED,IAAIC,EAAQ,CAAC,EACbF,EAAKJ,EAAU,SAAUO,EAAGC,EAAM,CAChCR,EAASQ,CAAI,GAAKF,EAAM,KAAKE,CAAI,CACnC,CAAC,EACDP,EAAY,KAAK,CACf,SAAUC,EAAS,eAEnB,KAAMI,CACR,CAAC,CACH,CAAC,EACM,CACL,SAAUN,EACV,YAAaC,EACb,KAAMH,EAAQ,IAChB,CACF,CAAC,CACH,CACAH,EAAW,iBAAkB,CAC3B,KAAM,kBACN,MAAO,kBACT,CAAC,EACDA,EAAW,SAAU,CACnB,KAAM,YACN,MAAO,aACT,CAAC,EACDA,EAAW,WAAY,CACrB,KAAM,cACN,MAAO,eACT,CAAC,EAUDJ,EAAU,eAAe,CACvB,KAAM,UACN,MAAO,UACP,OAAQ,iBACV,EAAG,SAAUO,EAASC,EAASU,EAAK,CAClC,IAAIC,EAAgBZ,EAAQ,cACvBY,IAECZ,EAAQ,OAAS,KACnBY,EAAgB,MACPZ,EAAQ,UAAY,OAC7BY,EAAgB,WAGfA,IACHA,EAAgB,UAKlBX,EAAQ,cAAc,CACpB,SAAUW,EACV,MAAOZ,CACT,EAAG,SAAUa,EAAgB,CAC3B,IAAIR,EAAMQ,EAAe,iBACzB,GAAIR,EAAI,OAAS,MAGjB,KAAIS,EAAMC,GAA4BV,EAAKL,EAASa,EAAe,IAAI,YAAY,CAAC,EACpFA,EAAe,WAAaA,EAAe,UAAUC,EAAI,MAAM,EAC/DD,EAAe,SAAWA,EAAe,QAAQC,EAAI,IAAI,EAGrDF,IAAkB,UACpBN,EAAKO,EAAe,YAAa,SAAUG,EAAa,CACtDA,EAAY,UAAUF,EAAI,MAAM,EAChCE,EAAY,QAAQF,EAAI,IAAI,CAC9B,CAAC,EAEL,CAAC,CACH,CAAC,CACH,CCxGO,SAASG,GAAQC,EAAW,CACjCC,GAAIF,EAAU,EACdC,EAAU,kBAAkBE,GAAO,EACnCF,EAAU,oBAAoBG,GAAS,EACvCH,EAAU,eAAeI,EAAe,EACxCJ,EAAU,kBAAkBA,EAAU,SAAS,UAAU,UAAWK,EAAgB,EACpFC,GAA6B,MAAON,EAAU,cAAc,CAC9D,CCXO,SAASO,IAAKC,EAAQ,CAC3B,IAAIC,EAAOD,EACXC,EAAK,SAAW,CACd,gBAAiB,KACjB,SAAUA,EACV,OAAQ,EACR,SAAU,EACV,OAAQ,EACR,MAAO,EACP,EAAG,EACH,OAAQ,IACV,EAIA,QAHIC,EAAQ,CAACD,CAAI,EACbE,EACAC,EACGD,EAAOD,EAAM,IAAI,GAGtB,GADAE,EAAWD,EAAK,SACZA,EAAK,UAAYC,EAAS,OAE5B,QADIC,EAAID,EAAS,OACRE,EAAID,EAAI,EAAGC,GAAK,EAAGA,IAAK,CAC/B,IAAIC,EAAQH,EAASE,CAAC,EACtBC,EAAM,SAAW,CACf,gBAAiB,KACjB,SAAUA,EACV,OAAQ,EACR,SAAU,EACV,OAAQ,EACR,MAAO,EACP,EAAGD,EACH,OAAQ,IACV,EACAJ,EAAM,KAAKK,CAAK,CAClB,CAGN,CAYO,SAASC,IAAUL,EAAMM,EAAY,CAC1C,IAAIL,EAAWD,EAAK,SAAWA,EAAK,SAAW,CAAC,EAC5CO,EAAWP,EAAK,WAAW,SAC3BQ,EAAWR,EAAK,SAAS,EAAIO,EAASP,EAAK,SAAS,EAAI,CAAC,EAAI,KACjE,GAAIC,EAAS,OAAQ,CACnBQ,IAAcT,CAAI,EAClB,IAAIU,GAAYT,EAAS,CAAC,EAAE,SAAS,OAASA,EAASA,EAAS,OAAS,CAAC,EAAE,SAAS,QAAU,EAC3FO,GACFR,EAAK,SAAS,OAASQ,EAAS,SAAS,OAASF,EAAWN,EAAMQ,CAAQ,EAC3ER,EAAK,SAAS,SAAWA,EAAK,SAAS,OAASU,GAEhDV,EAAK,SAAS,OAASU,CAE3B,MAAWF,IACTR,EAAK,SAAS,OAASQ,EAAS,SAAS,OAASF,EAAWN,EAAMQ,CAAQ,GAE7ER,EAAK,WAAW,SAAS,gBAAkBW,IAAUX,EAAMQ,EAAUR,EAAK,WAAW,SAAS,iBAAmBO,EAAS,CAAC,EAAGD,CAAU,CAC1I,CASO,SAASM,IAAWZ,EAAM,CAC/B,IAAIa,EAAQb,EAAK,SAAS,OAASA,EAAK,WAAW,SAAS,SAC5DA,EAAK,UAAU,CACb,EAAGa,CACL,EAAG,EAAI,EACPb,EAAK,SAAS,UAAYA,EAAK,WAAW,SAAS,QACrD,CACO,SAASM,GAAWQ,EAAI,CAC7B,OAAO,UAAU,OAASA,EAAKC,GACjC,CAIO,SAASC,GAAiBC,EAAKC,EAAG,CACvC,OAAAD,GAAO,KAAK,GAAK,EACV,CACL,EAAGC,EAAI,KAAK,IAAID,CAAG,EACnB,EAAGC,EAAI,KAAK,IAAID,CAAG,CACrB,CACF,CAUA,SAASR,IAAcT,EAAM,CAK3B,QAJIC,EAAWD,EAAK,SAChBE,EAAID,EAAS,OACbkB,EAAQ,EACRC,EAAS,EACN,EAAElB,GAAK,GAAG,CACf,IAAIE,EAAQH,EAASC,CAAC,EACtBE,EAAM,SAAS,QAAUe,EACzBf,EAAM,SAAS,UAAYe,EAC3BC,GAAUhB,EAAM,SAAS,OACzBe,GAASf,EAAM,SAAS,MAAQgB,CAClC,CACF,CAeA,SAAST,IAAUU,EAAUb,EAAUc,EAAUhB,EAAY,CAC3D,GAAIE,EAAU,CASZ,QARIe,EAAeF,EACfG,EAAcH,EACdI,EAAcD,EAAY,WAAW,SAAS,CAAC,EAC/CE,EAAalB,EACbmB,EAAcJ,EAAa,SAAS,SACpCK,EAAaJ,EAAY,SAAS,SAClCK,EAAaJ,EAAY,SAAS,SAClCK,EAAYJ,EAAW,SAAS,SAC7BA,EAAaK,GAAUL,CAAU,EAAGF,EAAcQ,GAASR,CAAW,EAAGE,GAAcF,GAAa,CACzGD,EAAeQ,GAAUR,CAAY,EACrCE,EAAcO,GAASP,CAAW,EAClCF,EAAa,SAAS,SAAWF,EACjC,IAAIF,EAAQO,EAAW,SAAS,OAASI,EAAYN,EAAY,SAAS,OAASI,EAAatB,EAAWoB,EAAYF,CAAW,EAC9HL,EAAQ,IACVc,IAAYC,IAAaR,EAAYL,EAAUC,CAAQ,EAAGD,EAAUF,CAAK,EACzES,GAAcT,EACdQ,GAAeR,GAEjBW,GAAaJ,EAAW,SAAS,SACjCE,GAAcJ,EAAY,SAAS,SACnCG,GAAeJ,EAAa,SAAS,SACrCM,GAAcJ,EAAY,SAAS,QACrC,CACIC,GAAc,CAACK,GAAUR,CAAY,IACvCA,EAAa,SAAS,OAASG,EAC/BH,EAAa,SAAS,UAAYO,EAAYH,GAE5CH,GAAe,CAACQ,GAASP,CAAW,IACtCA,EAAY,SAAS,OAASD,EAC9BC,EAAY,SAAS,UAAYG,EAAaC,EAC9CP,EAAWD,EAEf,CACA,OAAOC,CACT,CAMA,SAASS,GAAU/B,EAAM,CACvB,IAAIC,EAAWD,EAAK,SACpB,OAAOC,EAAS,QAAUD,EAAK,SAAWC,EAASA,EAAS,OAAS,CAAC,EAAID,EAAK,SAAS,MAC1F,CAMA,SAASgC,GAAShC,EAAM,CACtB,IAAIC,EAAWD,EAAK,SACpB,OAAOC,EAAS,QAAUD,EAAK,SAAWC,EAAS,CAAC,EAAID,EAAK,SAAS,MACxE,CAKA,SAASkC,IAAaR,EAAY1B,EAAMsB,EAAU,CAChD,OAAOI,EAAW,SAAS,SAAS,aAAe1B,EAAK,WAAa0B,EAAW,SAAS,SAAWJ,CACtG,CAUA,SAASW,IAAYE,EAAIC,EAAIjB,EAAO,CAClC,IAAIC,EAASD,GAASiB,EAAG,SAAS,EAAID,EAAG,SAAS,GAClDC,EAAG,SAAS,QAAUhB,EACtBgB,EAAG,SAAS,OAASjB,EACrBiB,EAAG,SAAS,UAAYjB,EACxBiB,EAAG,SAAS,QAAUjB,EACtBgB,EAAG,SAAS,QAAUf,CACxB,CAOA,SAASL,IAAkBsB,EAAOC,EAAO,CACvC,OAAOD,EAAM,aAAeC,EAAM,WAAa,EAAI,CACrD,CC7MA,IAAIC,KAA6B,UAAY,CAC3C,SAASA,GAAgB,CACvB,KAAK,YAAc,CAAC,EACpB,KAAK,YAAc,CAAC,CACtB,CACA,OAAOA,CACT,GAAE,EACEC,KAAwB,SAAUC,EAAQ,CAC5CC,EAAUF,EAAUC,CAAM,EAC1B,SAASD,EAASG,EAAM,CACtB,OAAOF,EAAO,KAAK,KAAME,CAAI,GAAK,IACpC,CACA,OAAAH,EAAS,UAAU,gBAAkB,UAAY,CAC/C,MAAO,CACL,OAAQI,EAAO,MAAM,UACrB,KAAM,IACR,CACF,EACAJ,EAAS,UAAU,gBAAkB,UAAY,CAC/C,OAAO,IAAID,GACb,EACAC,EAAS,UAAU,UAAY,SAAUK,EAAKC,EAAO,CACnD,IAAIC,EAAcD,EAAM,YACpBE,EAAWD,EAAY,OACvBE,EAAcH,EAAM,YACpBI,EAAgBH,EAAY,CAAC,EAC7BI,EAAeJ,EAAYC,EAAW,CAAC,EAC3C,GAAIA,IAAa,EAAG,CAClBH,EAAI,OAAOI,EAAY,CAAC,EAAGA,EAAY,CAAC,CAAC,EACzCJ,EAAI,OAAOK,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EAC7C,MACF,CACA,IAAIE,EAASN,EAAM,OACfO,EAAUD,IAAW,MAAQA,IAAW,KAAO,EAAI,EACnDE,EAAW,EAAID,EACfE,EAAeC,GAAaV,EAAM,aAAc,CAAC,EACjDW,EAAW,CAAC,EAChBA,EAASJ,CAAO,EAAIJ,EAAYI,CAAO,EACvCI,EAASH,CAAQ,EAAIL,EAAYK,CAAQ,GAAKH,EAAaG,CAAQ,EAAIL,EAAYK,CAAQ,GAAKC,EAChGV,EAAI,OAAOI,EAAY,CAAC,EAAGA,EAAY,CAAC,CAAC,EACzCJ,EAAI,OAAOY,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,EACnCZ,EAAI,OAAOK,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EAC7CO,EAASJ,CAAO,EAAIH,EAAcG,CAAO,EACzCR,EAAI,OAAOY,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,EACnCA,EAASJ,CAAO,EAAIF,EAAaE,CAAO,EACxCR,EAAI,OAAOY,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,EACnCZ,EAAI,OAAOM,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,EAC3C,QAASO,EAAI,EAAGA,EAAIV,EAAW,EAAGU,IAAK,CACrC,IAAIC,EAAQZ,EAAYW,CAAC,EACzBb,EAAI,OAAOc,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAC7BF,EAASJ,CAAO,EAAIM,EAAMN,CAAO,EACjCR,EAAI,OAAOY,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,CACrC,CACF,EACOjB,CACT,GAAEoB,EAAI,EACFC,KAAwB,SAAUpB,EAAQ,CAC5CC,EAAUmB,EAAUpB,CAAM,EAC1B,SAASoB,GAAW,CAClB,IAAIC,EAAQrB,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAqB,EAAM,KAAOD,EAAS,KACtBC,EAAM,WAAa,IAAYC,GACxBD,CACT,CACA,OAAAD,EAAS,UAAU,KAAO,SAAUG,EAASC,EAAK,CAChD,KAAK,YAAc,IAAIC,GAAeD,EAAI,MAAM,CAAC,EACjD,KAAK,gBAAkB,CACrB,OAAQ,KAAK,KACf,EACA,KAAK,MAAM,IAAI,KAAK,UAAU,CAChC,EACAJ,EAAS,UAAU,OAAS,SAAUM,EAAaH,EAASC,EAAK,CAC/D,IAAIG,EAAOD,EAAY,QAAQ,EAC3BE,EAAaF,EAAY,WACzBG,EAAQ,KAAK,WACbC,EAASJ,EAAY,IAAI,QAAQ,EACjCI,IAAW,UACbD,EAAM,EAAID,EAAW,EAAIA,EAAW,MAAQ,EAC5CC,EAAM,EAAID,EAAW,EAAIA,EAAW,OAAS,IAE7CC,EAAM,EAAID,EAAW,EACrBC,EAAM,EAAID,EAAW,GAEvB,KAAK,oBAAoBF,EAAaF,CAAG,EACzC,KAAK,kBAAkBE,EAAa,KAAMH,EAASC,CAAG,EACtD,IAAIO,EAAU,KAAK,MACnBJ,EAAK,KAAKI,CAAO,EAAE,IAAI,SAAUC,EAAQ,CACnCC,IAAgBN,EAAMK,CAAM,GAE9BE,IAAWP,EAAMK,EAAQ,KAAMH,EAAOH,CAAW,CAErD,CAAC,EAAE,OAAO,SAAUM,EAAQG,EAAQ,CAClC,IAAIC,EAAWL,EAAQ,iBAAiBI,CAAM,EAC9C,GAAI,CAACF,IAAgBN,EAAMK,CAAM,EAAG,CAClCI,GAAYC,IAAWN,EAASI,EAAQC,EAAUP,EAAOH,CAAW,EACpE,MACF,CAEAQ,IAAWP,EAAMK,EAAQI,EAAUP,EAAOH,CAAW,CACvD,CAAC,EAAE,OAAO,SAAUS,EAAQ,CAC1B,IAAIC,EAAWL,EAAQ,iBAAiBI,CAAM,EAM1CC,GACFC,IAAWN,EAASI,EAAQC,EAAUP,EAAOH,CAAW,CAE5D,CAAC,EAAE,QAAQ,EACX,KAAK,gBAAkBA,EAAY,IAAI,gBAAgB,EACvD,KAAK,wBAAwBA,CAAW,EACpCA,EAAY,IAAI,mBAAmB,IAAM,IAC3CC,EAAK,kBAAkB,SAAUW,EAAIC,EAAW,CAC9CD,EAAG,IAAI,OAAO,EAAE,GAAG,QAAS,UAAY,CACtCd,EAAI,eAAe,CACjB,KAAM,wBACN,SAAUE,EAAY,GACtB,UAAWa,CACb,CAAC,CACH,CAAC,CACH,CAAC,EAEH,KAAK,MAAQZ,CACf,EACAP,EAAS,UAAU,oBAAsB,SAAUM,EAAaF,EAAK,CACnE,IAAIG,EAAOD,EAAY,QAAQ,EAC3Bc,EAAS,CAAC,EACdb,EAAK,KAAK,SAAUc,EAAK,CACvB,IAAIX,EAASH,EAAK,cAAcc,CAAG,EAC/BX,GAAU,CAAC,MAAMA,EAAO,CAAC,GAAK,CAAC,MAAMA,EAAO,CAAC,GAC/CU,EAAO,KAAK,CAAC,CAACV,EAAO,EAAG,CAACA,EAAO,CAAC,CAAC,CAEtC,CAAC,EACD,IAAIY,EAAM,CAAC,EACPC,EAAM,CAAC,EACNC,GAAWJ,EAAQE,EAAKC,CAAG,EAGhC,IAAIE,EAAS,KAAK,KACdC,EAAS,KAAK,KAEdH,EAAI,CAAC,EAAID,EAAI,CAAC,IAAM,IACtBA,EAAI,CAAC,EAAIG,EAASA,EAAO,CAAC,EAAIH,EAAI,CAAC,EAAI,EACvCC,EAAI,CAAC,EAAIG,EAASA,EAAO,CAAC,EAAIH,EAAI,CAAC,EAAI,GAErCA,EAAI,CAAC,EAAID,EAAI,CAAC,IAAM,IACtBA,EAAI,CAAC,EAAIG,EAASA,EAAO,CAAC,EAAIH,EAAI,CAAC,EAAI,EACvCC,EAAI,CAAC,EAAIG,EAASA,EAAO,CAAC,EAAIH,EAAI,CAAC,EAAI,GAEzC,IAAII,EAAerB,EAAY,iBAAmB,IAAIsB,GAAK,KAAM,CAC/D,IAAKxB,EACL,QAASE,EAAY,OACvB,CAAC,EACDqB,EAAa,UAAYrB,EAAY,IAAI,YAAY,EACrDqB,EAAa,gBAAgBL,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGC,EAAI,CAAC,EAAID,EAAI,CAAC,EAAGC,EAAI,CAAC,EAAID,EAAI,CAAC,CAAC,EAC7EK,EAAa,UAAUrB,EAAY,IAAI,QAAQ,CAAC,EAChDqB,EAAa,QAAQrB,EAAY,IAAI,MAAM,CAAC,EAG5C,KAAK,MAAM,KAAK,CACd,EAAGqB,EAAa,EAChB,EAAGA,EAAa,EAChB,OAAQA,EAAa,OACrB,OAAQA,EAAa,MACvB,CAAC,EACD,KAAK,KAAOL,EACZ,KAAK,KAAOC,CACd,EACAvB,EAAS,UAAU,kBAAoB,SAAUM,EAAauB,EAAU1B,EAASC,EAAK,CACpF,IAAIH,EAAQ,KACD6B,GAAiBxB,EAAaF,EAAK,KAAK,MAAO,KAAK,YAAa,KAAK,gBAAiByB,CAAQ,EAC1G,KAAK,YAAY,GAAG,OAAQ,SAAUE,EAAG,CACvC9B,EAAM,wBAAwBK,CAAW,CAC3C,CAAC,CACH,EACAN,EAAS,UAAU,wBAA0B,SAAUM,EAAa,CAClE,IAAIC,EAAOD,EAAY,QAAQ,EAC3B0B,EAAY,KAAK,oBAAoB1B,CAAW,EACpDC,EAAK,kBAAkB,SAAUW,EAAIG,EAAK,CACxCH,EAAG,eAAec,CAAS,CAC7B,CAAC,CACH,EACAhC,EAAS,UAAU,oBAAsB,SAAUM,EAAa,CAC9D,IAAI2B,EAAW3B,EAAY,iBAC3B,GAAI2B,EAAS,OAAS,OACpB,MAAO,GAET,IAAIC,EAAiB,KAAK,gBACtBC,EAAYF,EAAS,QAAU,EAE/BG,EAAWH,EAAS,QAAQ,EAC5BD,GAAaI,EAAW,GAAKF,EAAiB,EAClD,OAAOF,EAAYG,CACrB,EACAnC,EAAS,UAAU,QAAU,UAAY,CACvC,KAAK,aAAe,KAAK,YAAY,QAAQ,EAC7C,KAAK,gBAAkB,IACzB,EACAA,EAAS,UAAU,OAAS,UAAY,CACtC,KAAK,WAAW,UAAU,EAC1B,KAAK,MAAQ,IACf,EACAA,EAAS,KAAO,OACTA,CACT,GAAEqC,EAAS,EACX,SAASxB,IAAgBN,EAAMY,EAAW,CACxC,IAAIT,EAASH,EAAK,cAAcY,CAAS,EACzC,OAAOT,GAAU,CAAC,MAAMA,EAAO,CAAC,GAAK,CAAC,MAAMA,EAAO,CAAC,CACtD,CACA,SAASI,IAAWP,EAAMY,EAAWH,EAAUP,EAAOH,EAAa,CACjE,IAAIgC,EAAS,CAACtB,EACVuB,EAAOhC,EAAK,KAAK,mBAAmBY,CAAS,EAC7CqB,EAAYD,EAAK,SAAS,EAC1BE,EAAcF,EAAK,UAAU,OAAO,EAAE,KACtCG,EAAmBH,EAAK,WAAa,IAASA,EAAK,SAAS,SAAW,EAAIE,EAAc1D,EAAO,MAAM,UACtG4D,EAAcpC,EAAK,KAAK,KACxBqC,EAASL,EAAK,aAAeI,EAAcJ,EAAOA,EAAK,YAAcA,EACrEM,EAAiBtC,EAAK,iBAAiBqC,EAAO,SAAS,EACvDE,EAAeF,EAAO,UAAU,EAChCG,EAAkBF,EAAiB,CACrC,EAAGA,EAAe,OAClB,EAAGA,EAAe,OAClB,KAAMA,EAAe,gBACrB,KAAMA,EAAe,eACvB,EAAIC,EACAE,EAAeT,EAAK,UAAU,EAC9BD,GACFtB,EAAW,IAAIiC,GAAU1C,EAAMY,EAAW,KAAM,CAC9C,iBAAkBuB,EAClB,aAAc,EAChB,CAAC,EACD1B,EAAS,EAAI+B,EAAgB,EAC7B/B,EAAS,EAAI+B,EAAgB,GAE7B/B,EAAS,WAAWT,EAAMY,EAAW,KAAM,CACzC,iBAAkBuB,EAClB,aAAc,EAChB,CAAC,EAEH1B,EAAS,gBAAkBA,EAAS,aACpCA,EAAS,gBAAkBA,EAAS,aACpCA,EAAS,aAAegC,EAAa,KACrChC,EAAS,aAAegC,EAAa,KACrCvC,EAAM,IAAIO,CAAQ,EAClBT,EAAK,iBAAiBY,EAAWH,CAAQ,EACzCA,EAAS,OAASA,EAAS,EAC3BA,EAAS,OAASA,EAAS,EACnBkC,GAAYlC,EAAU,CAC5B,EAAGgC,EAAa,EAChB,EAAGA,EAAa,CAClB,EAAG1C,CAAW,EACd,IAAI6C,EAAanC,EAAS,cAAc,EACxC,GAAIV,EAAY,IAAI,QAAQ,IAAM,SAAU,CAC1C,IAAI8C,EAAWT,EAAY,SAAS,CAAC,EACjCU,EAAaD,EAAS,UAAU,EAChCE,EAAWF,EAAS,SAAS,OAC7BG,EAAM,OACNC,EAAS,OACb,GAAIR,EAAa,IAAMK,EAAW,GAAKd,EAAK,WAAa,IAAQa,EAAS,SAAS,OAAQ,CACzF,IAAIK,EAAS,CACX,GAAIL,EAAS,SAAS,CAAC,EAAE,UAAU,EAAE,EAAIA,EAAS,SAASE,EAAW,CAAC,EAAE,UAAU,EAAE,GAAK,EAC1F,GAAIF,EAAS,SAAS,CAAC,EAAE,UAAU,EAAE,EAAIA,EAAS,SAASE,EAAW,CAAC,EAAE,UAAU,EAAE,GAAK,CAC5F,EACAC,EAAM,KAAK,MAAME,EAAO,EAAIJ,EAAW,EAAGI,EAAO,EAAIJ,EAAW,CAAC,EAC7DE,EAAM,IACRA,EAAM,KAAK,GAAK,EAAIA,GAEtBC,EAASC,EAAO,EAAIJ,EAAW,EAC3BG,IACFD,EAAMA,EAAM,KAAK,GAErB,MACEA,EAAM,KAAK,MAAMP,EAAa,EAAIK,EAAW,EAAGL,EAAa,EAAIK,EAAW,CAAC,EACzEE,EAAM,IACRA,EAAM,KAAK,GAAK,EAAIA,GAElBhB,EAAK,SAAS,SAAW,GAAKA,EAAK,SAAS,SAAW,GAAKA,EAAK,WAAa,IAChFiB,EAASR,EAAa,EAAIK,EAAW,EACjCG,IACFD,EAAMA,EAAM,KAAK,MAGnBC,EAASR,EAAa,EAAIK,EAAW,EAChCG,IACHD,EAAMA,EAAM,KAAK,KAIvB,IAAIG,EAAeF,EAAS,OAAS,QACjCG,EAAmBnB,EAAU,SAAS,OAAO,EAC7CoB,EAASD,EAAiB,IAAI,QAAQ,EACtCE,EAAoBD,GAAU,KAAK,GAAK,KACxCE,EAAcX,EAAW,eAAe,EACxCW,IACFX,EAAW,cAAc,CACvB,SAAUQ,EAAiB,IAAI,UAAU,GAAKD,EAC9C,SAAUE,GAAU,KAAO,CAACL,EAAMM,EAClC,OAAQ,QACV,CAAC,EACDC,EAAY,SAAS,gBAAiB,QAAQ,EAElD,CAEA,IAAIC,EAAQvB,EAAU,IAAI,CAAC,WAAY,OAAO,CAAC,EAC3CwB,EAAmBD,IAAU,WAAoBE,GAAY1B,EAAK,oBAAoB,EAAGA,EAAK,qBAAqB,CAAC,EAAIwB,IAAU,WAAaxB,EAAK,oBAAoB,EAAIwB,IAAU,aAAexB,EAAK,qBAAqB,EAAI,KACnOyB,IAEFE,GAAUlD,CAAQ,EAAE,MAAQgD,GAE9BG,IAAS7D,EAAaiC,EAAMI,EAAa3B,EAAU+B,EAAiBD,EAAcE,EAAcvC,CAAK,EACjGO,EAAS,SACXA,EAAS,mBAAqB,SAAUoD,EAAS,CAC/C,GAAIA,IAAY,OAAQ,CAItB,IAAIC,EAAW9B,EAAK,YAAchC,EAAK,iBAAiBgC,EAAK,WAAW,SAAS,EAC3E8B,GAAYA,EAAS,aAAeC,IACxCC,GAAcvD,EAAS,OAAQoD,CAAO,CAE1C,CACF,EAEJ,CACA,SAASD,IAAS7D,EAAaiC,EAAMI,EAAa3B,EAAU+B,EAAiBD,EAAcE,EAAcvC,EAAO,CAC9G,IAAI+B,EAAYD,EAAK,SAAS,EAC1BiC,EAAYlE,EAAY,IAAI,WAAW,EACvCI,EAASJ,EAAY,IAAI,QAAQ,EACjCf,EAASe,EAAY,UAAU,EAC/BmE,EAAYnE,EAAY,IAAI,CAAC,YAAa,WAAW,CAAC,EACtDoE,EAAmBpE,EAAY,IAAI,kBAAkB,EACrDqE,EAAYnC,EAAU,SAAS,WAAW,EAAE,aAAa,EACzDoC,EAAO5D,EAAS,OAGpB,GAAIwD,IAAc,QACZjC,EAAK,YAAcA,EAAK,aAAeI,IACpCiC,IACHA,EAAO5D,EAAS,OAAS,IAAY6D,GAAY,CAC/C,MAAOC,GAAapE,EAAQnB,EAAQkF,EAAW1B,EAAiBA,CAAe,CACjF,CAAC,GAEKG,GAAY0B,EAAM,CACxB,MAAOE,GAAapE,EAAQnB,EAAQkF,EAAW3B,EAAcE,CAAY,CAC3E,EAAG1C,CAAW,WAEPkE,IAAc,YACnB9D,IAAW,cACT6B,IAASI,GAAeJ,EAAK,UAAYA,EAAK,SAAS,SAAW,GAAKA,EAAK,WAAa,GAAM,CAGjG,QAFIwC,EAAWxC,EAAK,SAChBrD,EAAc,CAAC,EACVW,EAAI,EAAGA,EAAIkF,EAAS,OAAQlF,IAAK,CACxC,IAAImF,EAAcD,EAASlF,CAAC,EAAE,UAAU,EACxCX,EAAY,KAAK,CAAC8F,EAAY,EAAGA,EAAY,CAAC,CAAC,CACjD,CACKJ,IACHA,EAAO5D,EAAS,OAAS,IAAIrC,IAAS,CACpC,MAAO,CACL,YAAa,CAACqE,EAAa,EAAGA,EAAa,CAAC,EAC5C,YAAa,CAAC,CAACA,EAAa,EAAGA,EAAa,CAAC,CAAC,EAC9C,OAAQzD,EACR,aAAcmF,CAChB,CACF,CAAC,GAEKxB,GAAY0B,EAAM,CACxB,MAAO,CACL,YAAa,CAAC5B,EAAa,EAAGA,EAAa,CAAC,EAC5C,YAAa9D,CACf,CACF,EAAGoB,CAAW,CAChB,CAQAsE,GAAQ,EAAEJ,IAAc,YAAc,CAACjC,EAAK,YAC9CqC,EAAK,SAAgBK,GAAS,CAC5B,cAAe,GACf,KAAM,IACR,EAAGN,CAAS,CAAC,EACbO,GAAyBN,EAAMpC,EAAW,WAAW,EACrD2C,GAAqBP,CAAI,EACzBnE,EAAM,IAAImE,CAAI,EAElB,CACA,SAASQ,IAAe7C,EAAMhC,EAAME,EAAOH,EAAa+E,EAAoB,CAC1E,IAAI1C,EAAcpC,EAAK,KAAK,KACxB+E,EAAKC,IAAc5C,EAAaJ,CAAI,EACtCK,EAAS0C,EAAG,OACZxC,EAAewC,EAAG,aAChBtE,EAAWT,EAAK,iBAAiBgC,EAAK,SAAS,EACnD,GAAKvB,EAGL,KAAI6B,EAAiBtC,EAAK,iBAAiBqC,EAAO,SAAS,EACvD4C,EAAa3C,EAAe,OAK5B+B,EAAO5D,EAAS,SAAW4B,EAAO,WAAa,IAASA,EAAO,SAAS,SAAW,EAAI4C,EAAa,QACpGhB,EAAYlE,EAAY,IAAI,WAAW,EACvCmF,EAAYnF,EAAY,IAAI,QAAQ,EACpCf,EAASe,EAAY,IAAI,QAAQ,EACjCmE,EAAYnE,EAAY,IAAI,CAAC,YAAa,WAAW,CAAC,EACtDsE,IACEJ,IAAc,QACRkB,GAAcd,EAAM,CAC1B,MAAOE,GAAaW,EAAWlG,EAAQkF,EAAW3B,EAAcA,CAAY,EAC5E,MAAO,CACL,QAAS,CACX,CACF,EAAGxC,EAAa,CACd,GAAI,UAAY,CACdG,EAAM,OAAOmE,CAAI,CACnB,EACA,UAAWS,CACb,CAAC,EACQb,IAAc,YAAclE,EAAY,IAAI,QAAQ,IAAM,cAC3DoF,GAAcd,EAAM,CAC1B,MAAO,CACL,YAAa,CAAC9B,EAAa,EAAGA,EAAa,CAAC,EAC5C,YAAa,CAAC,CAACA,EAAa,EAAGA,EAAa,CAAC,CAAC,CAChD,EACA,MAAO,CACL,QAAS,CACX,CACF,EAAGxC,EAAa,CACd,GAAI,UAAY,CACdG,EAAM,OAAOmE,CAAI,CACnB,EACA,UAAWS,CACb,CAAC,GAGP,CACA,SAASE,IAAc5C,EAAaJ,EAAM,CAGxC,QAFIK,EAASL,EAAK,aAAeI,EAAcJ,EAAOA,EAAK,YAAcA,EACrEO,EACGA,EAAeF,EAAO,UAAU,EAAGE,GAAgB,MACxDF,EAASA,EAAO,aAAeD,EAAcC,EAASA,EAAO,YAAcA,EAE7E,MAAO,CACL,OAAQA,EACR,aAAcE,CAChB,CACF,CACA,SAAS7B,IAAWV,EAAMY,EAAWH,EAAUP,EAAOH,EAAa,CACjE,IAAIiC,EAAOhC,EAAK,KAAK,mBAAmBY,CAAS,EAC7CwB,EAAcpC,EAAK,KAAK,KACxBuC,EAAeyC,IAAc5C,EAAaJ,CAAI,EAAE,aAEhD8C,EAAqB,CACvB,SAAU/E,EAAY,IAAI,yBAAyB,EACnD,OAAQA,EAAY,IAAI,uBAAuB,CACjD,EACQoF,GAAc1E,EAAU,CAC9B,EAAG8B,EAAa,EAAI,EACpB,EAAGA,EAAa,EAAI,CACtB,EAAGxC,EAAa,CACd,GAAI,UAAY,CACdG,EAAM,OAAOO,CAAQ,EACrBT,EAAK,iBAAiBY,EAAW,IAAI,CACvC,EACA,UAAWkE,CACb,CAAC,EACDrE,EAAS,QAAQ,KAAMT,EAAK,UAAW,CACrC,UAAW,GACX,UAAW8E,CACb,CAAC,EAED9C,EAAK,SAAS,QAAQ,SAAUoD,EAAW,CACzCP,IAAeO,EAAWpF,EAAME,EAAOH,EAAa+E,CAAkB,CACxE,CAAC,EAEDD,IAAe7C,EAAMhC,EAAME,EAAOH,EAAa+E,CAAkB,CACnE,CACA,SAASP,GAAaW,EAAWlG,EAAQkF,EAAW3B,EAAcE,EAAc,CAC9E,IAAI4C,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACJ,GAAIV,IAAc,SAAU,CAC1BO,EAAKlD,EAAa,KAClBoD,EAAKpD,EAAa,KAClBmD,EAAKjD,EAAa,KAClBmD,EAAKnD,EAAa,KAClB,IAAIoD,EAAcC,GAAiBL,EAAIE,CAAE,EACrCI,EAAcD,GAAiBL,EAAIE,GAAMC,EAAKD,GAAMzB,CAAS,EAC7D8B,EAAcF,GAAiBJ,EAAIE,GAAMD,EAAKC,GAAM1B,CAAS,EAC7D+B,EAAcH,GAAiBJ,EAAIE,CAAE,EACzC,MAAO,CACL,GAAIC,EAAY,GAAK,EACrB,GAAIA,EAAY,GAAK,EACrB,GAAII,EAAY,GAAK,EACrB,GAAIA,EAAY,GAAK,EACrB,KAAMF,EAAY,GAAK,EACvB,KAAMA,EAAY,GAAK,EACvB,KAAMC,EAAY,GAAK,EACvB,KAAMA,EAAY,GAAK,CACzB,CACF,MACEP,EAAKlD,EAAa,EAClBoD,EAAKpD,EAAa,EAClBmD,EAAKjD,EAAa,EAClBmD,EAAKnD,EAAa,GACdzD,IAAW,MAAQA,IAAW,QAChCqG,EAAOI,GAAMC,EAAKD,GAAMvB,EACxBoB,EAAOK,EACPJ,EAAOG,GAAMD,EAAKC,GAAMxB,EACxBsB,EAAOI,IAEL5G,IAAW,MAAQA,IAAW,QAChCqG,EAAOI,EACPH,EAAOK,GAAMC,EAAKD,GAAMzB,EACxBqB,EAAOG,EACPF,EAAOI,GAAMD,EAAKC,GAAM1B,GAG5B,MAAO,CACL,GAAIuB,EACJ,GAAIE,EACJ,GAAID,EACJ,GAAIE,EACJ,KAAMP,EACN,KAAMC,EACN,KAAMC,EACN,KAAMC,CACR,CACF,CACA,IAAOU,IAAQzG,ICriBf,IAAI0G,GAAQC,GAAU,EACtB,SAASC,IAAeC,EAAK,CAC3B,IAAIC,EAAWD,EAAI,SACfE,EAAQF,EAAI,MACXE,IACHA,EAAQ,CACN,KAAMD,CACR,EACAD,EAAI,UAAY,CACd,KAAM,MACR,GAEFA,EAAI,MAAQA,EAAI,SAAW,KAC3BG,IAAQF,EAAUC,EAAOF,CAAG,EAE5BI,EAAKF,EAAO,SAAUG,EAAM,CAC1BD,EAAKH,EAAS,qBAAsB,SAAUK,EAAY,CACxDD,EAAK,WAAWC,EAAYC,GAAMC,IAAmBR,CAAG,CAAC,CAC3D,CAAC,CACH,CAAC,EAEDC,EAAS,WAAW,eAAgBM,GAAME,IAAuBT,CAAG,CAAC,EAGrEI,EAAKH,EAAS,kBAAmB,SAAUK,EAAY,CACrDL,EAAS,WAAWK,EAAYC,GAAMG,IAAiBV,CAAG,CAAC,CAC7D,CAAC,EAEDW,GAAOT,EAAMD,EAAS,QAAQ,IAAMA,CAAQ,CAC9C,CACA,SAASO,IAAkBR,EAAKY,EAAK,CACnC,GAAIC,IAAW,IAAI,EAAG,CAEpB,IAAIX,EAAQY,EAAO,CAAC,EAAGjB,GAAM,IAAI,EAAE,KAAK,EACxCK,EAAM,KAAK,QAAQ,EAAIU,EACvBT,IAAQS,EAAKV,EAAOF,CAAG,CACzB,MAEEe,GAAWH,EAAK,KAAK,SAAUf,GAAM,IAAI,EAAE,SAAUG,CAAG,EAE1D,OAAOY,CACT,CACA,SAASF,IAAgBV,EAAKY,EAAK,CACjC,OAAAZ,EAAI,QAAUA,EAAI,OAAO,OAAO,EACzBY,CACT,CACA,SAASH,IAAsBT,EAAKY,EAAK,CAKvC,OAAAR,EAAKP,GAAMe,CAAG,EAAE,MAAO,SAAUP,EAAMW,EAAU,CAC/CX,IAASO,GAAOG,GAAWV,EAAK,aAAa,EAAGW,EAAUJ,EAAKZ,CAAG,CACpE,CAAC,EACMY,CACT,CAOA,SAASK,IAAcD,EAAU,CAC/B,IAAIf,EAAWJ,GAAM,IAAI,EAAE,SAC3B,OAAOmB,GAAY,MAAQf,GAAY,KAAOA,EAAWJ,GAAMI,CAAQ,EAAE,MAAMe,CAAQ,CACzF,CAIA,SAASE,KAAmB,CAC1B,IAAIjB,EAAWJ,GAAM,IAAI,EAAE,SAC3B,OAAOI,GAAY,KAAO,CAAC,CACzB,KAAMA,CACR,CAAC,EAAIkB,EAAIC,GAAKvB,GAAMI,CAAQ,EAAE,KAAK,EAAG,SAAUoB,EAAM,CACpD,MAAO,CACL,KAAMA,EACN,KAAMxB,GAAMI,CAAQ,EAAE,MAAMoB,CAAI,CAClC,CACF,CAAC,CACH,CACA,SAASR,IAAWR,EAAM,CACxB,OAAOR,GAAMQ,CAAI,EAAE,WAAaA,CAClC,CACA,SAASF,IAAQF,EAAUC,EAAOF,EAAK,CACrCH,GAAMI,CAAQ,EAAE,MAAQ,CAAC,EACzBG,EAAKF,EAAO,SAAUG,EAAMW,EAAU,CACpCD,GAAWV,EAAMW,EAAUf,EAAUD,CAAG,CAC1C,CAAC,CACH,CACA,SAASe,GAAWV,EAAMW,EAAUf,EAAUD,EAAK,CACjDH,GAAMI,CAAQ,EAAE,MAAMe,CAAQ,EAAIX,EAClCR,GAAMQ,CAAI,EAAE,SAAWJ,EACvBI,EAAK,SAAWW,EACZhB,EAAI,SACNK,EAAKL,EAAI,UAAU,EAAIA,EAAI,OAC3BA,EAAI,OAAOA,EAAI,UAAUgB,CAAQ,CAAC,EAAIX,GAGxCA,EAAK,cAAgBY,IACrBZ,EAAK,iBAAmBa,GAC1B,CACA,IAAOI,GAAQvB,IClGf,IAAIwB,KAAwB,UAAY,CACtC,SAASA,EAASC,EAAMC,EAAU,CAChC,KAAK,MAAQ,EACb,KAAK,OAAS,EAQd,KAAK,UAAY,GACjB,KAAK,SAAW,CAAC,EACjB,KAAK,aAAe,CAAC,EACrB,KAAK,SAAW,GAChB,KAAK,KAAOD,GAAQ,GACpB,KAAK,SAAWC,CAClB,CAIA,OAAAF,EAAS,UAAU,UAAY,UAAY,CACzC,OAAO,KAAK,UAAY,CAC1B,EACAA,EAAS,UAAU,SAAW,SAAUG,EAASC,EAAIC,EAAS,CACjDC,GAAWH,CAAO,IAC3BE,EAAUD,EACVA,EAAKD,EACLA,EAAU,MAEZA,EAAUA,GAAW,CAAC,EACXI,GAASJ,CAAO,IACzBA,EAAU,CACR,MAAOA,CACT,GAEF,IAAIK,EAAQL,EAAQ,OAAS,WACzBM,EAAW,KAAKN,EAAQ,MAAQ,UAAU,EAC1CO,EACJF,IAAU,aAAeE,EAAmBN,EAAG,KAAKC,EAAS,IAAI,GACjE,QAASM,EAAI,EAAG,CAACD,GAAoBC,EAAIF,EAAS,OAAQE,IACxDF,EAASE,CAAC,EAAE,SAASR,EAASC,EAAIC,CAAO,EAE3CG,IAAU,aAAeJ,EAAG,KAAKC,EAAS,IAAI,CAChD,EAIAL,EAAS,UAAU,qBAAuB,SAAUY,EAAO,CACzD,IAAIC,EAAS,EACb,KAAK,MAAQD,EACb,QAASD,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IAAK,CAC7C,IAAIG,EAAQ,KAAK,SAASH,CAAC,EAC3BG,EAAM,qBAAqBF,EAAQ,CAAC,EAChCE,EAAM,OAASD,IACjBA,EAASC,EAAM,OAEnB,CACA,KAAK,OAASD,EAAS,CACzB,EACAb,EAAS,UAAU,YAAc,SAAUe,EAAI,CAC7C,GAAI,KAAK,MAAM,IAAMA,EACnB,OAAO,KAET,QAASJ,EAAI,EAAGF,EAAW,KAAK,SAAUO,EAAMP,EAAS,OAAQE,EAAIK,EAAKL,IAAK,CAC7E,IAAIM,EAAMR,EAASE,CAAC,EAAE,YAAYI,CAAE,EACpC,GAAIE,EACF,OAAOA,CAEX,CACF,EACAjB,EAAS,UAAU,SAAW,SAAUkB,EAAM,CAC5C,GAAIA,IAAS,KACX,MAAO,GAET,QAASP,EAAI,EAAGF,EAAW,KAAK,SAAUO,EAAMP,EAAS,OAAQE,EAAIK,EAAKL,IAAK,CAC7E,IAAIM,EAAMR,EAASE,CAAC,EAAE,SAASO,CAAI,EACnC,GAAID,EACF,OAAOA,CAEX,CACF,EAKAjB,EAAS,UAAU,aAAe,SAAUmB,EAAa,CAGvD,QAFIC,EAAY,CAAC,EACbF,EAAOC,EAAc,KAAO,KAAK,WAC9BD,GACLE,EAAU,KAAKF,CAAI,EACnBA,EAAOA,EAAK,WAEd,OAAAE,EAAU,QAAQ,EACXA,CACT,EACApB,EAAS,UAAU,oBAAsB,UAAY,CAGnD,QAFIqB,EAAU,CAAC,EACXC,EAAW,KACRA,GACLD,EAAQ,KAAKC,EAAS,SAAS,EAC/BA,EAAWA,EAAS,WAEtB,OAAAD,EAAQ,QAAQ,EACTA,CACT,EACArB,EAAS,UAAU,qBAAuB,UAAY,CACpD,IAAIqB,EAAU,CAAC,EACf,YAAK,SAAS,SAAUE,EAAW,CACjCF,EAAQ,KAAKE,EAAU,SAAS,CAClC,CAAC,EACMF,CACT,EACArB,EAAS,UAAU,SAAW,SAAUwB,EAAW,CACjD,IAAIC,EAAO,KAAK,SAAS,KACzB,OAAOA,EAAK,SAAS,EAAE,IAAIA,EAAK,kBAAkBD,GAAa,OAAO,EAAG,KAAK,SAAS,CACzF,EACAxB,EAAS,UAAU,UAAY,SAAU0B,EAAQC,EAAO,CACtD,KAAK,WAAa,GAAK,KAAK,SAAS,KAAK,cAAc,KAAK,UAAWD,EAAQC,CAAK,CACvF,EAIA3B,EAAS,UAAU,UAAY,UAAY,CACzC,OAAO,KAAK,SAAS,KAAK,cAAc,KAAK,SAAS,CACxD,EAIAA,EAAS,UAAU,SAAW,SAAU4B,EAAM,CAC5C,GAAI,OAAK,UAAY,GAGrB,KAAI1B,EAAW,KAAK,SAChB2B,EAAY3B,EAAS,KAAK,aAAa,KAAK,SAAS,EACzD,OAAO2B,EAAU,SAASD,CAAI,EAChC,EAEA5B,EAAS,UAAU,cAAgB,UAAY,CAC7C,OAAQ,KAAK,SAAS,aAAe,CAAC,GAAG,KAAK,KAAK,CACrD,EACAA,EAAS,UAAU,UAAY,SAAU8B,EAAKC,EAAO,CACnD,KAAK,WAAa,GAAK,KAAK,SAAS,KAAK,cAAc,KAAK,UAAWD,EAAKC,CAAK,CACpF,EAKA/B,EAAS,UAAU,UAAY,SAAU8B,EAAK,CAC5C,OAAO,KAAK,SAAS,KAAK,cAAc,KAAK,UAAWA,CAAG,CAC7D,EACA9B,EAAS,UAAU,YAAc,UAAY,CAC3C,OAAO,KAAK,SAAS,KAAK,YAAY,KAAK,SAAS,CACtD,EACAA,EAAS,UAAU,MAAQ,UAAY,CACrC,OAAO,KAAK,SAAS,KAAK,MAAM,KAAK,SAAS,CAChD,EAIAA,EAAS,UAAU,cAAgB,UAAY,CAC7C,GAAI,KAAK,WAAY,CAEnB,QADIS,EAAW,KAAK,WAAW,SACtBE,EAAI,EAAGA,EAAIF,EAAS,OAAQ,EAAEE,EACrC,GAAIF,EAASE,CAAC,IAAM,KAClB,OAAOA,EAGX,MAAO,EACT,CACA,MAAO,EACT,EAOAX,EAAS,UAAU,aAAe,SAAUkB,EAAM,CAEhD,QADIc,EAASd,EAAK,WACXc,GAAQ,CACb,GAAIA,IAAW,KACb,MAAO,GAETA,EAASA,EAAO,UAClB,CACA,MAAO,EACT,EAOAhC,EAAS,UAAU,eAAiB,SAAUkB,EAAM,CAClD,OAAOA,IAAS,MAAQA,EAAK,aAAa,IAAI,CAChD,EACOlB,CACT,GAAE,EAGF,IAAIiC,KAAoB,UAAY,CAClC,SAASA,EAAKC,EAAW,CACvB,KAAK,KAAO,OACZ,KAAK,OAAS,CAAC,EACf,KAAK,UAAYA,CACnB,CACA,OAAAD,EAAK,UAAU,SAAW,SAAUE,EAASC,EAAIC,EAAS,CACxD,KAAK,KAAK,SAASF,EAASC,EAAIC,CAAO,CACzC,EACAJ,EAAK,UAAU,mBAAqB,SAAUK,EAAW,CACvD,IAAIC,EAAW,KAAK,KAAK,YAAYD,CAAS,EAC9C,OAAO,KAAK,OAAOC,CAAQ,CAC7B,EACAN,EAAK,UAAU,YAAc,SAAUO,EAAM,CAC3C,OAAO,KAAK,KAAK,YAAYA,CAAI,CACnC,EAKAP,EAAK,UAAU,OAAS,UAAY,CAGlC,QAFIQ,EAAO,KAAK,KACZC,EAAQ,KAAK,OACRC,EAAI,EAAGC,EAAMF,EAAM,OAAQC,EAAIC,EAAKD,IAC3CD,EAAMC,CAAC,EAAE,UAAY,GAEvB,QAASA,EAAI,EAAGC,EAAMH,EAAK,MAAM,EAAGE,EAAIC,EAAKD,IAC3CD,EAAMD,EAAK,YAAYE,CAAC,CAAC,EAAE,UAAYA,CAE3C,EAIAV,EAAK,UAAU,aAAe,UAAY,CACxC,KAAK,KAAK,iBAAiB,CAC7B,EAgBAA,EAAK,WAAa,SAAUY,EAAUX,EAAWY,EAAY,CAC3D,IAAIC,EAAO,IAAId,EAAKC,CAAS,EACzBc,EAAW,CAAC,EACZC,EAAS,EACbC,EAAeL,CAAQ,EACvB,SAASK,EAAeC,EAAUC,EAAY,CAC5C,IAAIC,EAAQF,EAAS,MACrBF,EAAS,KAAK,IAAIA,EAAeK,EAAQD,CAAK,EAAIA,EAAM,OAAS,CAAC,EAClEL,EAAS,KAAKG,CAAQ,EACtB,IAAII,EAAO,IAAIC,IAASC,GAAoBN,EAAS,KAAM,EAAE,EAAGJ,CAAI,EACpEK,EAAaM,IAASH,EAAMH,CAAU,EAAIL,EAAK,KAAOQ,EACtDR,EAAK,OAAO,KAAKQ,CAAI,EACrB,IAAII,EAAWR,EAAS,SACxB,GAAIQ,EACF,QAAShB,EAAI,EAAGA,EAAIgB,EAAS,OAAQhB,IACnCO,EAAeS,EAAShB,CAAC,EAAGY,CAAI,CAGtC,CACAR,EAAK,KAAK,qBAAqB,CAAC,EAChC,IAAIa,EAAaC,GAAwBb,EAAU,CACjD,gBAAiB,CAAC,OAAO,EACzB,gBAAiBC,CACnB,CAAC,EAAE,WACCa,EAAO,IAAIC,GAAWH,EAAY1B,CAAS,EAC/C,OAAA4B,EAAK,SAASd,CAAQ,EACtBF,GAAcA,EAAWgB,CAAI,EAC7BE,GAAe,CACb,SAAUF,EACV,OAAQf,EACR,WAAY,MACd,CAAC,EACDA,EAAK,OAAO,EACLA,CACT,EACOd,CACT,GAAE,EAKF,SAASyB,IAASO,EAAOV,EAAM,CAC7B,IAAII,EAAWJ,EAAK,SAChBU,EAAM,aAAeV,IAGzBI,EAAS,KAAKM,CAAK,EACnBA,EAAM,WAAaV,EACrB,CACA,IAAOW,GAAQjC,ICpTR,SAASkC,GAAmBC,EAASC,EAAmBC,EAAa,CAC1E,GAAIF,GAAkBG,GAAQF,EAAmBD,EAAQ,IAAI,GAAK,EAAG,CACnE,IAAII,EAAOF,EAAY,QAAQ,EAAE,KAAK,KAClCG,EAAaL,EAAQ,WAIzB,GAHWM,GAASD,CAAU,IAC5BA,EAAaD,EAAK,YAAYC,CAAU,GAEtCA,GAAcD,EAAK,SAASC,CAAU,EACxC,MAAO,CACL,KAAMA,CACR,EAEF,IAAIE,EAAeP,EAAQ,aAC3B,GAAIO,GAAgB,OAASF,EAAaD,EAAK,YAAYG,CAAY,GACrE,MAAO,CACL,KAAMF,CACR,CAEJ,CACF,CAEO,SAASG,GAAcC,EAAM,CAElC,QADIC,EAAO,CAAC,EACLD,GACLA,EAAOA,EAAK,WACZA,GAAQC,EAAK,KAAKD,CAAI,EAExB,OAAOC,EAAK,QAAQ,CACtB,CACO,SAASC,GAAcC,EAAUH,EAAM,CAC5C,IAAII,EAAWL,GAAcI,CAAQ,EACrC,OAAcT,GAAQU,EAAUJ,CAAI,GAAK,CAC3C,CAEO,SAASK,GAAiBL,EAAMP,EAAa,CAElD,QADIa,EAAe,CAAC,EACbN,GAAM,CACX,IAAIO,EAAgBP,EAAK,UACzBM,EAAa,KAAK,CAChB,KAAMN,EAAK,KACX,UAAWO,EACX,MAAOd,EAAY,YAAYc,CAAa,CAC9C,CAAC,EACDP,EAAOA,EAAK,UACd,CACA,OAAAM,EAAa,QAAQ,EACdA,CACT,CCzCA,IAAIE,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,gBAAkB,GAExBA,EAAM,kBAAoB,GACnBA,CACT,CAIA,OAAAH,EAAgB,UAAU,eAAiB,SAAUI,EAAQ,CAE3D,IAAIC,EAAO,CACT,KAAMD,EAAO,KACb,SAAUA,EAAO,IACnB,EACIE,EAASF,EAAO,QAAU,CAAC,EAC3BG,EAAc,IAAIC,GAAMF,EAAQ,KAAM,KAAK,OAAO,EAClDG,EAAOC,GAAK,WAAWL,EAAM,KAAMM,CAAU,EACjD,SAASA,EAAWC,EAAU,CAC5BA,EAAS,WAAW,eAAgB,SAAUC,EAAOC,EAAK,CACxD,IAAIC,EAAON,EAAK,mBAAmBK,CAAG,EACtC,OAAMC,GAAQA,EAAK,SAAS,QAAUA,EAAK,WACzCF,EAAM,YAAcN,GAEfM,CACT,CAAC,CACH,CACA,IAAIG,EAAY,EAChBP,EAAK,SAAS,WAAY,SAAUM,EAAM,CACpCA,EAAK,MAAQC,IACfA,EAAYD,EAAK,MAErB,CAAC,EACD,IAAIE,EAAoBb,EAAO,kBAC3Bc,EAAkBD,GAAqBb,EAAO,kBAAoB,EAAIA,EAAO,iBAAmBY,EACpG,OAAAP,EAAK,KAAK,SAAS,WAAY,SAAUM,EAAM,CAC7C,IAAII,EAAOJ,EAAK,SAAS,KAAK,eAAeA,EAAK,SAAS,EAE3DA,EAAK,SAAWI,GAAQA,EAAK,WAAa,KAAO,CAACA,EAAK,UAAYJ,EAAK,OAASG,CACnF,CAAC,EACMT,EAAK,IACd,EAKAT,EAAgB,UAAU,UAAY,UAAY,CAChD,IAAIoB,EAAS,KAAK,IAAI,QAAQ,EAC9B,OAAIA,IAAW,aACbA,EAAS,KACAA,IAAW,aACpBA,EAAS,MAEJA,CACT,EACApB,EAAgB,UAAU,QAAU,SAAUqB,EAAM,CAClD,KAAK,OAAO,KAAOA,CACrB,EACArB,EAAgB,UAAU,UAAY,SAAUsB,EAAQ,CACtD,KAAK,OAAO,OAASA,CACvB,EACAtB,EAAgB,UAAU,cAAgB,SAAUuB,EAAWC,EAAgBC,EAAU,CAMvF,QALIhB,EAAO,KAAK,QAAQ,EAAE,KACtBiB,EAAWjB,EAAK,KAAK,SAAS,CAAC,EAC/BM,EAAON,EAAK,mBAAmBc,CAAS,EACxCI,EAAQZ,EAAK,SAAS,EACtBa,EAAOb,EAAK,KACTA,GAAQA,IAASW,GACtBE,EAAOb,EAAK,WAAW,KAAO,IAAMa,EACpCb,EAAOA,EAAK,WAEd,OAAOc,GAAoB,YAAa,CACtC,KAAMD,EACN,MAAOD,EACP,QAAS,MAAMA,CAAK,GAAKA,GAAS,IACpC,CAAC,CACH,EAEA3B,EAAgB,UAAU,cAAgB,SAAUuB,EAAW,CAC7D,IAAIO,EAAS7B,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EAC7Dc,EAAO,KAAK,QAAQ,EAAE,KAAK,mBAAmBQ,CAAS,EAC3D,OAAAO,EAAO,cAAgBC,GAAiBhB,EAAM,IAAI,EAClDe,EAAO,UAAY,CAACf,EAAK,SAClBe,CACT,EACA9B,EAAgB,KAAO,cAGvBA,EAAgB,WAAa,MAC7BA,EAAgB,cAAgB,CAE9B,EAAG,EAGH,sBAAuB,MAEvB,KAAM,MACN,IAAK,MACL,MAAO,MACP,OAAQ,MAER,OAAQ,aAER,UAAW,QACX,iBAAkB,MAElB,KAAM,GACN,YAAa,SAEb,eAAgB,GAEhB,OAAQ,KACR,KAAM,EACN,OAAQ,KACR,OAAQ,cACR,WAAY,EACZ,kBAAmB,GACnB,iBAAkB,EAClB,UAAW,CACT,MAAOgC,EAAO,MAAM,WACpB,MAAO,IACP,UAAW,EACb,EACA,UAAW,CACT,MAAO,iBAEP,YAAa,GACf,EACA,MAAO,CACL,KAAM,EACR,EACA,gBAAiB,SACjB,kBAAmB,IACnB,wBAAyB,GAC3B,EACOhC,CACT,GAAEiC,EAAW,EACNC,IAAQlC,IChJf,SAASmC,IAAUC,EAAMC,EAAUC,EAAY,CAI7C,QAHIC,EAAQ,CAACH,CAAI,EACbI,EAAO,CAAC,EACRC,EACGA,EAAOF,EAAM,IAAI,GAGtB,GADAC,EAAK,KAAKC,CAAI,EACVA,EAAK,SAAU,CACjB,IAAIC,EAAWD,EAAK,SACpB,GAAIC,EAAS,OACX,QAASC,EAAI,EAAGA,EAAID,EAAS,OAAQC,IACnCJ,EAAM,KAAKG,EAASC,CAAC,CAAC,CAG5B,CAEF,KAAOF,EAAOD,EAAK,IAAI,GAErBH,EAASI,EAAMH,CAAU,CAE7B,CAIA,SAASM,GAAWR,EAAMC,EAAU,CAGlC,QAFIE,EAAQ,CAACH,CAAI,EACbK,EACGA,EAAOF,EAAM,IAAI,GAGtB,GADAF,EAASI,CAAI,EACTA,EAAK,SAAU,CACjB,IAAIC,EAAWD,EAAK,SACpB,GAAIC,EAAS,OACX,QAASC,EAAID,EAAS,OAAS,EAAGC,GAAK,EAAGA,IACxCJ,EAAM,KAAKG,EAASC,CAAC,CAAC,CAG5B,CAEJ,CCvCe,SAARE,GAA4BC,EAASC,EAAK,CAC/CD,EAAQ,iBAAiB,OAAQ,SAAUE,EAAa,CACtDC,IAAaD,EAAaD,CAAG,CAC/B,CAAC,CACH,CACA,SAASE,IAAaD,EAAaD,EAAK,CACtC,IAAIG,EAAeC,GAAyBH,EAAaD,CAAG,EAAE,aAC1DK,EAAaC,GAAcL,EAAY,mBAAmB,EAAGE,CAAY,EAC7EF,EAAY,WAAaI,EACzB,IAAIE,EAASN,EAAY,IAAI,QAAQ,EACjCO,EAAQ,EACRC,EAAS,EACTC,EAAa,KACbH,IAAW,UACbC,EAAQ,EAAI,KAAK,GACjBC,EAAS,KAAK,IAAIJ,EAAW,OAAQA,EAAW,KAAK,EAAI,EACzDK,EAAaA,GAAI,SAAUC,EAAOC,EAAO,CACvC,OAAQD,EAAM,aAAeC,EAAM,WAAa,EAAI,GAAKD,EAAM,KACjE,CAAC,IAEDH,EAAQH,EAAW,MACnBI,EAASJ,EAAW,OACpBK,EAAaA,GAAI,GAEnB,IAAIG,EAAcZ,EAAY,QAAQ,EAAE,KAAK,KACzCa,EAAWD,EAAY,SAAS,CAAC,EACrC,GAAIC,EAAU,CACZC,IAAKF,CAAW,EAChBG,IAAUF,EAAUG,IAAWP,CAAU,EACzCG,EAAY,SAAS,SAAW,CAACC,EAAS,SAAS,OACnDI,GAAWJ,EAAUK,GAAU,EAC/B,IAAIC,EAASN,EACTO,EAAUP,EACVQ,EAAWR,EACfI,GAAWJ,EAAU,SAAUS,EAAM,CACnC,IAAI,EAAIA,EAAK,UAAU,EAAE,EACrB,EAAIH,EAAO,UAAU,EAAE,IACzBA,EAASG,GAEP,EAAIF,EAAQ,UAAU,EAAE,IAC1BA,EAAUE,GAERA,EAAK,MAAQD,EAAS,QACxBA,EAAWC,EAEf,CAAC,EACD,IAAIC,EAAQJ,IAAWC,EAAU,EAAIX,EAAWU,EAAQC,CAAO,EAAI,EAC/DI,EAAOD,EAAQJ,EAAO,UAAU,EAAE,EAClCM,EAAO,EACPC,EAAO,EACPC,EAAU,EACVC,EAAU,EACd,GAAItB,IAAW,SACbmB,EAAOlB,GAASa,EAAQ,UAAU,EAAE,EAAIG,EAAQC,GAEhDE,EAAOlB,GAAUa,EAAS,MAAQ,GAAK,GACvCJ,GAAWJ,EAAU,SAAUS,EAAM,CACnCK,GAAWL,EAAK,UAAU,EAAE,EAAIE,GAAQC,EACxCG,GAAWN,EAAK,MAAQ,GAAKI,EAC7B,IAAIG,EAAYC,GAAiBH,EAASC,CAAO,EACjDN,EAAK,UAAU,CACb,EAAGO,EAAU,EACb,EAAGA,EAAU,EACb,KAAMF,EACN,KAAMC,CACR,EAAG,EAAI,CACT,CAAC,MACI,CACL,IAAIG,EAAW/B,EAAY,UAAU,EACjC+B,IAAa,MAAQA,IAAa,MACpCL,EAAOlB,GAAUY,EAAQ,UAAU,EAAE,EAAIG,EAAQC,GACjDC,EAAOlB,GAASc,EAAS,MAAQ,GAAK,GACtCJ,GAAWJ,EAAU,SAAUS,EAAM,CACnCM,GAAWN,EAAK,UAAU,EAAE,EAAIE,GAAQE,EACxCC,EAAUI,IAAa,MAAQT,EAAK,MAAQ,GAAKG,EAAOlB,GAASe,EAAK,MAAQ,GAAKG,EACnFH,EAAK,UAAU,CACb,EAAGK,EACHC,CACF,EAAG,EAAI,CACT,CAAC,IACQG,IAAa,MAAQA,IAAa,QAC3CN,EAAOlB,GAASa,EAAQ,UAAU,EAAE,EAAIG,EAAQC,GAChDE,EAAOlB,GAAUa,EAAS,MAAQ,GAAK,GACvCJ,GAAWJ,EAAU,SAAUS,EAAM,CACnCK,GAAWL,EAAK,UAAU,EAAE,EAAIE,GAAQC,EACxCG,EAAUG,IAAa,MAAQT,EAAK,MAAQ,GAAKI,EAAOlB,GAAUc,EAAK,MAAQ,GAAKI,EACpFJ,EAAK,UAAU,CACb,EAAGK,EACHC,CACF,EAAG,EAAI,CACT,CAAC,EAEL,CACF,CACF,CChGe,SAARI,GAA4BC,EAAS,CAC1CA,EAAQ,iBAAiB,OAAQ,SAAUC,EAAa,CACtD,IAAIC,EAAOD,EAAY,QAAQ,EAC3BE,EAAOD,EAAK,KAChBC,EAAK,SAAS,SAAUC,EAAM,CAC5B,IAAIC,EAAQD,EAAK,SAAS,EAEtBE,EAAQD,EAAM,SAAS,WAAW,EAAE,aAAa,EACjDE,EAAcL,EAAK,uBAAuBE,EAAK,UAAW,OAAO,EACrEI,EAAOD,EAAaD,CAAK,CAC3B,CAAC,CACH,CAAC,CACH,CCZO,SAASG,IAAkBC,EAAW,CAC3CA,EAAU,eAAe,CACvB,KAAM,wBACN,MAAO,wBACP,OAAQ,QACV,EAAG,SAAUC,EAASC,EAAS,CAC7BA,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,OACT,MAAOD,CACT,EAAG,SAAUE,EAAa,CACxB,IAAIC,EAAYH,EAAQ,UACpBI,EAAOF,EAAY,QAAQ,EAAE,KAC7BG,EAAOD,EAAK,mBAAmBD,CAAS,EAC5CE,EAAK,SAAW,CAACA,EAAK,QACxB,CAAC,CACH,CAAC,EACDN,EAAU,eAAe,CACvB,KAAM,WACN,MAAO,WAKP,OAAQ,MACV,EAAG,SAAUC,EAASC,EAASK,EAAK,CAClCL,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,OACT,MAAOD,CACT,EAAG,SAAUE,EAAa,CACxB,IAAIK,EAAWL,EAAY,iBACvBM,EAAMC,GAA4BF,EAAUP,EAASE,EAAY,IAAI,YAAY,CAAC,EACtFA,EAAY,UAAUM,EAAI,MAAM,EAChCN,EAAY,QAAQM,EAAI,IAAI,CAC9B,CAAC,CACH,CAAC,CACH,CCjCO,SAASE,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAQ,EACpCD,EAAU,oBAAoBE,GAAe,EAC7CF,EAAU,eAAeG,EAAU,EACnCH,EAAU,eAAeI,EAAU,EACnCC,IAAkBL,CAAS,CAC7B,CCTA,IAAIM,IAAc,CAAC,oBAAqB,gBAAiB,aAAa,EAC/D,SAASC,IAAqBC,EAAW,CAC9C,QAASC,EAAI,EAAGA,EAAIH,IAAY,OAAQG,IACtCD,EAAU,eAAe,CACvB,KAAMF,IAAYG,CAAC,EACnB,OAAQ,YACV,EAAGC,EAAI,EAETF,EAAU,eAAe,CACvB,KAAM,oBACN,OAAQ,YACV,EAAG,SAAUG,EAASC,EAAS,CAC7BA,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,UACT,MAAOD,CACT,EAAGE,CAAgB,EACnB,SAASA,EAAiBC,EAAOC,EAAO,CACtC,IAAIC,EAAQ,CAAC,oBAAqB,mBAAmB,EACjDC,EAAoBC,GAAmBP,EAASK,EAAOF,CAAK,EAChE,GAAIG,EAAY,CACd,IAAIE,EAAiBL,EAAM,YAAY,EACnCK,IACFR,EAAQ,UAAmBS,GAAcD,EAAgBF,EAAW,IAAI,EAAI,SAAW,aAEzFH,EAAM,cAAcG,EAAW,IAAI,CACrC,CACF,CACF,CAAC,CACH,CC9Be,SAARI,GAAwCC,EAAa,CAC1D,IAAIC,EAAOD,EAAY,QAAQ,EAC3BE,EAAOD,EAAK,KACZE,EAAoB,CAAC,EACzBD,EAAK,SAAS,SAAUE,EAAM,CAG5B,QADIC,EAAUD,EACPC,GAAWA,EAAQ,MAAQ,GAChCA,EAAUA,EAAQ,WAEpB,IAAIC,EAAQC,GAAoBP,EAAY,QAASK,EAAQ,MAAQA,EAAQ,UAAY,GAAIF,CAAiB,EAC9GC,EAAK,UAAU,QAASE,CAAK,CAC/B,CAAC,CACH,CCJA,IAAIE,KAAkC,SAAUC,EAAQ,CACtDC,EAAUF,EAAoBC,CAAM,EACpC,SAASD,GAAqB,CAC5B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAmB,KAChCG,EAAM,uBAAyB,GACxBA,CACT,CAIA,OAAAH,EAAmB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CAEvE,IAAIC,EAAO,CACT,KAAMF,EAAO,KACb,SAAUA,EAAO,IACnB,EACAG,IAAkBD,CAAI,EACtB,IAAIE,EAASJ,EAAO,QAAU,CAAC,EAK3BK,EAA4B,KAAK,0BAA4B,CAAC,EAC9DC,EAAwB,IAAIC,GAAM,CACpC,UAAWF,CACb,EAAG,KAAMJ,CAAO,EAChBG,EAASJ,EAAO,OAASQ,IAAWJ,EAAQH,CAAO,EACnD,IAAIQ,EAAqBC,EAAIN,GAAU,CAAC,EAAG,SAAUO,EAAa,CAChE,OAAO,IAAIJ,GAAMI,EAAaL,EAAuBL,CAAO,CAC9D,EAAG,IAAI,EAIHW,EAAOC,GAAK,WAAWX,EAAM,KAAMY,CAAU,EACjD,SAASA,EAAWC,EAAU,CAC5BA,EAAS,WAAW,eAAgB,SAAUC,EAAOC,EAAK,CACxD,IAAIC,EAAON,EAAK,mBAAmBK,CAAG,EAClCE,EAAaD,EAAOT,EAAYS,EAAK,KAAK,EAAI,KAElD,OAAAF,EAAM,YAAcG,GAAcb,EAC3BU,CACT,CAAC,CACH,CACA,OAAOJ,EAAK,IACd,EACAhB,EAAmB,UAAU,cAAgB,UAAY,CACvD,KAAK,cAAc,CACrB,EAMAA,EAAmB,UAAU,cAAgB,SAAUwB,EAAWC,EAAgBC,EAAU,CAC1F,IAAIC,EAAO,KAAK,QAAQ,EACpBC,EAAQ,KAAK,YAAYJ,CAAS,EAClCK,EAAOF,EAAK,QAAQH,CAAS,EACjC,OAAOM,GAAoB,YAAa,CACtC,KAAMD,EACN,MAAOD,CACT,CAAC,CACH,EAQA5B,EAAmB,UAAU,cAAgB,SAAUwB,EAAW,CAChE,IAAIO,EAAS9B,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EAC7DqB,EAAO,KAAK,QAAQ,EAAE,KAAK,mBAAmBE,CAAS,EAC3D,OAAAO,EAAO,cAAgBC,GAAiBV,EAAM,IAAI,EAElDS,EAAO,aAAeA,EAAO,cACtBA,CACT,EAUA/B,EAAmB,UAAU,cAAgB,SAAUiC,EAAY,CAKjE,KAAK,WAAa,KAAK,YAAc,CAAC,EAC/BC,EAAO,KAAK,WAAYD,CAAU,CAC3C,EAKAjC,EAAmB,UAAU,aAAe,SAAUmC,EAAI,CAYxD,IAAIC,EAAa,KAAK,YACjBA,IACHA,EAAa,KAAK,YAAqBC,GAAc,EAKrD,KAAK,iBAAmB,GAE1B,IAAIC,EAAQF,EAAW,IAAID,CAAE,EAC7B,OAAIG,GAAS,MACXF,EAAW,IAAID,EAAIG,EAAQ,KAAK,kBAAkB,EAE7CA,CACT,EACAtC,EAAmB,UAAU,YAAc,UAAY,CACrD,OAAO,KAAK,SACd,EACAA,EAAmB,UAAU,cAAgB,SAAUuC,EAAU,CAC/DA,EAAW,KAAK,UAAYA,EAAWA,EAAW,KAAK,UACvD,IAAIjC,EAAO,KAAK,WAAW,EAAE,KAAK,MAC9B,CAACiC,GAAYA,IAAajC,GAAQ,CAACA,EAAK,SAASiC,CAAQ,KAC3D,KAAK,UAAYjC,EAErB,EACAN,EAAmB,UAAU,gBAAkB,UAAY,CACzDwC,GAAuB,IAAI,CAC7B,EACAxC,EAAmB,KAAO,iBAC1BA,EAAmB,WAAa,MAChCA,EAAmB,cAAgB,CAEjC,YAAa,EAIb,sBAAuB,MACvB,KAAMyC,EAAO,KAAK,EAClB,IAAKA,EAAO,KAAK,KACjB,MAAOA,EAAO,KAAK,EACnB,OAAQA,EAAO,KAAK,KACpB,KAAM,GACN,WAAY,SACZ,YAAa,IAAO,EAAI,KAAK,KAAK,CAAC,GACnC,UAAW,KACX,cAAe,SAEf,gBAAiB,IAAO,IACxB,WAAY,CACV,IAAK,EACL,IAAK,EACP,EACA,KAAM,GACN,YAAa,SACb,UAAW,aACX,UAAW,GACX,wBAAyB,IACzB,gBAAiB,eACjB,WAAY,CACV,KAAM,GACN,OAAQ,GACR,KAAM,SACN,OAAQA,EAAO,KAAK,EAGpB,eAAgB,GAChB,UAAW,CACT,MAAOA,EAAO,MAAM,gBACpB,UAAW,CACT,MAAOA,EAAO,MAAM,SACtB,CACF,EACA,SAAU,CACR,UAAW,CACT,MAAOA,EAAO,MAAM,UACtB,CACF,CACF,EACA,MAAO,CACL,KAAM,GAEN,SAAU,EACV,QAAS,EACT,SAAU,SAEV,MAAOA,EAAO,MAAM,UACpB,SAAU,UAGZ,EACA,WAAY,CACV,KAAM,GACN,SAAU,CAAC,EAAG,KAAK,EACnB,OAAQ,GAGR,SAAU,WAEV,cAAe,QACjB,EACA,UAAW,CACT,MAAO,KACP,WAAY,KACZ,gBAAiB,KACjB,YAAa,EACb,SAAU,EACV,YAAaA,EAAO,MAAM,UAC1B,sBAAuB,IAGzB,EACA,SAAU,CACR,WAAY,CACV,KAAM,GACN,SAAU,CAAC,EAAG,KAAK,EACnB,SAAU,WACV,cAAe,QACjB,CACF,EACA,gBAAiB,EACjB,UAAW,KACX,UAAW,KACX,MAAO,CAAC,EAUR,WAAY,KACZ,gBAAiB,KACjB,eAAgB,QAChB,WAAY,GAEZ,mBAAoB,KAKpB,OAAQ,CAAC,CAGX,EACOzC,CACT,GAAE0C,EAAW,EAIb,SAASnC,IAAkBoC,EAAU,CAInC,IAAIC,EAAM,EACHC,EAAKF,EAAS,SAAU,SAAUG,EAAO,CAC9CvC,IAAkBuC,CAAK,EACvB,IAAIC,EAAaD,EAAM,MAChBE,EAAQD,CAAU,IAAMA,EAAaA,EAAW,CAAC,GACxDH,GAAOG,CACT,CAAC,EACD,IAAIE,EAAYN,EAAS,MACdK,EAAQC,CAAS,IAC1BA,EAAYA,EAAU,CAAC,IAErBA,GAAa,MAAQ,MAAMA,CAAS,KACtCA,EAAYL,GAGVK,EAAY,IACdA,EAAY,GAEPD,EAAQL,EAAS,KAAK,EAAIA,EAAS,MAAM,CAAC,EAAIM,EAAYN,EAAS,MAAQM,CACpF,CAIA,SAASrC,IAAWJ,EAAQH,EAAS,CACnC,IAAI6C,EAAkBC,GAAiB9C,EAAQ,IAAI,OAAO,CAAC,EACvD+C,EAAkBD,GAAiB9C,EAAQ,IAAI,CAAC,OAAQ,QAAS,QAAQ,CAAC,CAAC,EAC/E,GAAK6C,EAGL,CAAA1C,EAASA,GAAU,CAAC,EACpB,IAAI6C,EACAC,EACGT,EAAKrC,EAAQ,SAAUO,EAAa,CACzC,IAAIK,EAAQ,IAAIT,GAAMI,CAAW,EAC7BwC,EAAanC,EAAM,IAAI,OAAO,EAC9BoC,EAAapC,EAAM,IAAI,OAAO,GAC9BA,EAAM,IAAI,CAAC,YAAa,OAAO,CAAC,GAAKmC,GAAcA,IAAe,UACpEF,EAAiB,KAEfjC,EAAM,IAAI,CAAC,YAAa,OAAO,CAAC,GAAKoC,GAAcA,IAAe,UACpEF,EAAiB,GAErB,CAAC,EACD,IAAIG,EAASjD,EAAO,CAAC,IAAMA,EAAO,CAAC,EAAI,CAAC,GACxC,OAAK6C,IACHI,EAAO,MAAQP,EAAgB,MAAM,GAEnC,CAACI,GAAkBF,IACrBK,EAAO,MAAQL,EAAgB,MAAM,GAEhC5C,EACT,CACA,IAAOkD,IAAQ1D,IChUf,IAAI2D,IAAe,EACfC,IAAW,EACXC,GAAe,EACfC,KAA0B,UAAY,CACxC,SAASA,EAAWC,EAAgB,CAClC,KAAK,MAAQ,IAAYC,GACzBD,EAAe,IAAI,KAAK,KAAK,CAC/B,CACA,OAAAD,EAAW,UAAU,OAAS,SAAUG,EAAaC,EAAKC,EAAYC,EAAU,CAC9E,IAAIC,EAAQJ,EAAY,SAAS,YAAY,EACzCK,EAAY,KAAK,MAErB,GADAA,EAAU,UAAU,EAChB,GAACD,EAAM,IAAI,MAAM,GAAK,CAACF,GAG3B,KAAII,EAAmBF,EAAM,SAAS,WAAW,EAC7CG,EAAgBH,EAAM,SAAS,UAAU,EACzCI,EAAiBF,EAAiB,SAAS,WAAW,EACtDG,EAAyBF,EAAc,SAAS,CAAC,YAAa,WAAW,CAAC,EAC1EG,EAAsBC,GAAyBX,EAAaC,CAAG,EAAE,aACjEW,EAAkB,CACpB,KAAMR,EAAM,IAAI,MAAM,EACtB,MAAOA,EAAM,IAAI,OAAO,EACxB,IAAKA,EAAM,IAAI,KAAK,EACpB,OAAQA,EAAM,IAAI,QAAQ,CAC5B,EACIS,EAAc,CAChB,eAAgBT,EAAM,IAAI,gBAAgB,EAC1C,WAAY,EACZ,WAAY,CAAC,CACf,EACIU,EAAuBC,GAAcH,EAAiBF,CAAY,EACtE,KAAK,SAASR,EAAYW,EAAaL,CAAc,EACrD,KAAK,eAAeR,EAAaa,EAAaC,EAAeR,EAAkBC,EAAeC,EAAgBC,EAAwBN,CAAQ,EACvIa,GAAgBX,EAAWO,EAAiBF,CAAY,EACjE,EAKAb,EAAW,UAAU,SAAW,SAAUK,EAAYW,EAAaL,EAAgB,CACjF,QAASS,EAAOf,EAAYe,EAAMA,EAAOA,EAAK,WAAY,CACxD,IAAIC,EAAOC,GAAoBF,EAAK,SAAS,EAAE,IAAI,MAAM,EAAG,EAAE,EAC1DG,EAAWZ,EAAe,YAAYU,CAAI,EAC1CG,EAAY,KAAK,IAAID,EAAS,MAAQ1B,IAAe,EAAGmB,EAAY,cAAc,EACtFA,EAAY,YAAcQ,EAAY1B,IACtCkB,EAAY,WAAW,KAAK,CAC1B,KAAMI,EACN,KAAMC,EACN,MAAOG,CACT,CAAC,CACH,CACF,EAIAxB,EAAW,UAAU,eAAiB,SAAUG,EAAaa,EAAaC,EAAeR,EAAkBC,EAAeC,EAAgBC,EAAwBN,EAAU,CAQ1K,QANImB,EAAQ,EACRC,EAAiBV,EAAY,eAC7BW,EAASxB,EAAY,IAAI,CAAC,aAAc,QAAQ,CAAC,EACjDyB,EAAaZ,EAAY,WACzBa,EAAab,EAAY,WACzBc,EAAoBpB,EAAc,SAAS,WAAW,EAAE,aAAa,EAChEqB,EAAIF,EAAW,OAAS,EAAGE,GAAK,EAAGA,IAAK,CAC/C,IAAIC,EAAOH,EAAWE,CAAC,EACnBE,EAAWD,EAAK,KAChBR,EAAYQ,EAAK,MACjBX,EAAOW,EAAK,KAEZJ,EAAaX,EAAc,QAC7BW,GAAcJ,EAAYE,EAC1BF,EAAYE,EACZL,EAAO,MAET,IAAIa,EAAK,IAAYC,GAAQ,CAC3B,MAAO,CACL,OAAQC,IAAeX,EAAO,EAAGD,EAAWG,EAAQI,IAAMF,EAAW,OAAS,EAAGE,IAAM,CAAC,CAC1F,EACA,MAAOM,GAAS5B,EAAiB,aAAa,EAAG,CAC/C,SAAU,OACZ,CAAC,EACD,YAAa,IAAY6B,GAAK,CAC5B,MAAOC,GAAgB5B,EAAgB,CACrC,KAAMU,CACR,CAAC,CACH,CAAC,EACD,WAAY,CACV,SAAU,QACZ,EACA,GAAImB,GAAmB,IACvB,QAASC,GAAMnC,EAAU2B,CAAQ,CACnC,CAAC,EACDC,EAAG,sBAAwB,GAC3BA,EAAG,eAAe,EAAE,YAAY,UAAU,EAAE,MAAQK,GAAgB3B,EAAwB,CAC1F,KAAMS,CACR,CAAC,EACDa,EAAG,YAAY,UAAU,EAAE,MAAQJ,EACnCY,GAAoBR,EAAIxB,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,EACjH,KAAK,MAAM,IAAIwB,CAAE,EACjBS,IAAcT,EAAI/B,EAAa8B,CAAQ,EACvCR,GAASD,EAAY1B,GACvB,CACF,EACAE,EAAW,UAAU,OAAS,UAAY,CACxC,KAAK,MAAM,UAAU,CACvB,EACOA,CACT,GAAE,EACF,SAASoC,IAAeQ,EAAGC,EAAGrB,EAAWsB,EAAYC,EAAMC,EAAM,CAC/D,IAAIC,EAAS,CAAC,CAACF,EAAOH,EAAIA,EAAI7C,GAAc8C,CAAC,EAAG,CAACD,EAAIpB,EAAWqB,CAAC,EAAG,CAACD,EAAIpB,EAAWqB,EAAIC,CAAU,EAAG,CAACC,EAAOH,EAAIA,EAAI7C,GAAc8C,EAAIC,CAAU,CAAC,EAClJ,OAACE,GAAQC,EAAO,OAAO,EAAG,EAAG,CAACL,EAAIpB,EAAYzB,GAAc8C,EAAIC,EAAa,CAAC,CAAC,EAC/E,CAACC,GAAQE,EAAO,KAAK,CAACL,EAAGC,EAAIC,EAAa,CAAC,CAAC,EACrCG,CACT,CAEA,SAASN,IAAcT,EAAI/B,EAAa8B,EAAU,CAChDiB,GAAUhB,CAAE,EAAE,UAAY,CACxB,cAAe,SACf,iBAAkB,UAClB,eAAgB/B,EAAY,eAC5B,YAAaA,EAAY,YACzB,WAAYA,EAAY,KACxB,WAAY,UACZ,SAAU,aACV,SAAU,CACR,UAAW8B,GAAYA,EAAS,UAChC,KAAMA,GAAYA,EAAS,IAC7B,EACA,aAAcA,GAAYkB,GAAiBlB,EAAU9B,CAAW,CAClE,CACF,CACA,IAAOiD,IAAQpD,ICjIf,IAAIqD,KAA6B,UAAY,CAC3C,SAASA,GAAgB,CACvB,KAAK,SAAW,CAAC,EACjB,KAAK,aAAe,CAAC,CACvB,CAQA,OAAAA,EAAc,UAAU,IAAM,SAAUC,EAAIC,EAAQC,EAAUC,EAAOC,EAAQ,CAC3E,OAAI,KAAK,aAAaJ,EAAG,EAAE,EAClB,IAET,KAAK,aAAaA,EAAG,EAAE,EAAI,GAC3B,KAAK,SAAS,KAAK,CACjB,GAAIA,EACJ,OAAQC,EACR,SAAUC,EACV,MAAOC,EACP,OAAQC,CACV,CAAC,EACM,GACT,EAIAL,EAAc,UAAU,SAAW,SAAUM,EAAU,CACrD,YAAK,kBAAoBA,EAClB,IACT,EAIAN,EAAc,UAAU,MAAQ,UAAY,CAY1C,QAXIO,EAAQ,KACRC,EAAQ,KAAK,SAAS,OACtBC,EAAiB,UAAY,CAC/BD,IACIA,GAAS,IAEXD,EAAM,SAAS,OAAS,EACxBA,EAAM,aAAe,CAAC,EACtBA,EAAM,mBAAqBA,EAAM,kBAAkB,EAEvD,EACS,EAAI,EAAGG,EAAM,KAAK,SAAS,OAAQ,EAAIA,EAAK,IAAK,CACxD,IAAIC,EAAO,KAAK,SAAS,CAAC,EAC1BA,EAAK,GAAG,UAAUA,EAAK,OAAQ,CAC7B,SAAUA,EAAK,SACf,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,WAAY,GACZ,KAAMF,EACN,QAASA,CACX,CAAC,CACH,CACA,OAAO,IACT,EACOT,CACT,GAAE,EACK,SAASY,KAAa,CAC3B,OAAO,IAAIZ,GACb,CC1DA,IAAIa,GAAgBC,GAChBC,IAAeC,GACfC,IAAiB,EACjBC,IAAoB,QACpBC,IAAyB,aAEzBC,IAAUC,GAAmB,GAC7BC,IAAQD,GAAmB,EAC3BE,IAAaF,GAAmB,EAChCG,GAAoBC,GAAgB,CAAC,CAAC,OAAQ,OAAO,EAGzD,CAAC,SAAU,aAAa,EAAG,CAAC,YAAa,aAAa,EAAG,CAAC,YAAY,EAAG,CAAC,eAAe,EAAG,CAAC,eAAe,EAAG,CAAC,aAAa,CAG7H,CAAC,EACGC,IAAqB,SAAUC,EAAO,CAExC,IAAIC,EAAYJ,GAAkBG,CAAK,EAEvC,OAAAC,EAAU,OAASA,EAAU,KAAOA,EAAU,UAAY,KACnDA,CACT,EACIC,GAAQC,GAAU,EAClBC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KACzBG,EAAM,OAAS,QACfA,EAAM,SAAWC,GAAc,EACxBD,CACT,CAIA,OAAAH,EAAY,UAAU,OAAS,SAAUK,EAAaC,EAASC,EAAKC,EAAS,CAC3E,IAAIC,EAASH,EAAQ,eAAe,CAClC,SAAU,SACV,QAAS,UACT,MAAOE,CACT,CAAC,EACD,GAAI,EAAAE,GAAQD,EAAQJ,CAAW,EAAI,GAGnC,MAAK,YAAcA,EACnB,KAAK,IAAME,EACX,KAAK,QAAUD,EACf,IAAIK,EAAQ,CAAC,oBAAqB,mBAAmB,EACjDC,EAAoBC,GAAmBL,EAASG,EAAON,CAAW,EAClES,EAAcN,GAAWA,EAAQ,KACjCO,EAAaV,EAAY,WACzBW,EAAS,CAAC,KAAK,SACfC,EAAc,KAAK,SAEnBC,EAASJ,IAAgB,qBAAuBF,GAAcK,EAAc,CAC9E,cAAeA,EAAY,UAAUL,EAAW,KAAK,YAAY,CAAC,EAClE,UAAWJ,EAAQ,SACrB,EAAI,KACAW,EAAiB,KAAK,oBAAoBJ,CAAU,EACpDK,EAAef,EAAY,IAAI,WAAW,EAC1CgB,EAAe,KAAK,UAAUF,EAAgBd,EAAaa,CAAM,EACrEE,GAAgB,CAACJ,IAAW,CAACF,GAAeA,IAAgB,qBAAuBA,IAAgB,qBAAuB,KAAK,aAAaK,EAAgBE,EAAchB,EAAaa,CAAM,EAAIG,EAAa,cAAc,EAC5N,KAAK,iBAAiBd,CAAG,EACzB,KAAK,kBAAkBF,EAAaE,EAAKK,CAAU,EACrD,EACAZ,EAAY,UAAU,oBAAsB,SAAUe,EAAY,CAChE,IAAII,EAAiB,KAAK,gBAC1B,OAAKA,IAGHA,EAAiB,KAAK,gBAAkB,IAAIrC,GAC5C,KAAK,YAAYqC,CAAc,EAC/B,KAAK,MAAM,IAAIA,CAAc,GAE/BA,EAAe,EAAIJ,EAAW,EAC9BI,EAAe,EAAIJ,EAAW,EACvBI,CACT,EACAnB,EAAY,UAAU,UAAY,SAAUmB,EAAgBd,EAAaa,EAAQ,CAC/E,IAAII,EAAWjB,EAAY,QAAQ,EAAE,KACjCkB,EAAU,KAAK,SAEfC,EAAoBpB,GAAc,EAClCa,EAAcb,GAAc,EAC5BqB,EAAa,KAAK,SAClBC,EAAmB,CAAC,EACxB,SAASC,EAAaC,EAAUC,EAASC,EAAaC,EAAO,CAC3D,OAAOC,IAAW3B,EAAaY,EAAaQ,EAAYP,EAAQM,EAAmBE,EAAkBE,EAAUC,EAASC,EAAaC,CAAK,CAC5I,CAKAE,EAAWX,EAAS,KAAO,CAACA,EAAS,IAAI,EAAI,CAAC,EAAGC,GAAWA,EAAQ,KAAO,CAACA,EAAQ,IAAI,EAAI,CAAC,EAAGJ,EAAgBG,IAAaC,GAAW,CAACA,EAAS,CAAC,EAEnJ,IAAIW,EAAgBC,EAAaV,CAAU,EAG3C,GAFA,KAAK,SAAWH,EAChB,KAAK,SAAWL,EACZ,KAAK,gBAAiB,CACxB,IAAImB,EAAiB,KAAK,YAAY,WAClCC,EAAaf,EAAS,KAAK,UAAU,EACrCe,EAAW,QAAUD,EAAe,OAASC,EAAW,SAAWD,EAAe,SACpF,KAAK,gBAAgB,KAAO,EAEhC,CACA,MAAO,CACL,kBAAmBZ,EACnB,cAAeU,EACf,cAAeI,CACjB,EACA,SAASL,EAAWM,EAAkBC,EAAiBV,EAAaW,EAAUV,EAAO,CAI/EU,GACFD,EAAkBD,EAClBG,EAAKH,EAAkB,SAAUI,EAAOC,EAAO,CAC7C,CAACD,EAAM,UAAU,GAAKE,EAAYD,EAAOA,CAAK,CAChD,CAAC,GAKD,IAAIE,GAAWN,EAAiBD,EAAkBQ,EAAQA,CAAM,EAAE,IAAIF,CAAW,EAAE,OAAOA,CAAW,EAAE,OAAOG,GAAMH,EAAa,IAAI,CAAC,EAAE,QAAQ,EAElJ,SAASE,EAAOE,EAAM,CAEpB,OAAOA,EAAK,MAAM,CACpB,CACA,SAASJ,EAAYK,EAAUC,EAAU,CACvC,IAAIvB,EAAWsB,GAAY,KAAOX,EAAiBW,CAAQ,EAAI,KAC3DrB,EAAUsB,GAAY,KAAOX,EAAgBW,CAAQ,EAAI,KACzDC,EAAQzB,EAAaC,EAAUC,EAASC,EAAaC,CAAK,EAC9DqB,GAASnB,EAAWL,GAAYA,EAAS,cAAgB,CAAC,EAAGC,GAAWA,EAAQ,cAAgB,CAAC,EAAGuB,EAAOX,EAAUV,EAAQ,CAAC,CAChI,CACF,CACA,SAASI,EAAakB,EAAS,CAC7B,IAAInB,EAAgB9B,GAAc,EAClC,OAAAiD,GAAWX,EAAKW,EAAS,SAAUC,EAAOC,EAAa,CACrD,IAAIC,EAAStB,EAAcqB,CAAW,EACtCb,EAAKY,EAAO,SAAUG,EAAI,CACxBA,IAAOD,EAAO,KAAKC,CAAE,EAAG3D,GAAM2D,CAAE,EAAE,WAAa,GACjD,CAAC,CACH,CAAC,EACMvB,CACT,CACA,SAASI,GAAgB,CACvBI,EAAKR,EAAe,SAAUwB,EAAK,CACjChB,EAAKgB,EAAK,SAAUD,EAAI,CACtBA,EAAG,QAAUA,EAAG,OAAO,OAAOA,CAAE,CAClC,CAAC,CACH,CAAC,EACDf,EAAKhB,EAAkB,SAAU+B,EAAI,CACnCA,EAAG,UAAY,GAGfA,EAAG,MAAM,CACX,CAAC,CACH,CACF,EACAzD,EAAY,UAAU,aAAe,SAAUmB,EAAgBE,EAAchB,EAAaa,EAAQ,CAChG,IAAIyC,EAAiBtD,EAAY,IAAI,yBAAyB,EAC1DuD,EAAevD,EAAY,IAAI,iBAAiB,EAEhDwD,GAAYC,GAAWH,CAAc,EAAI,EAAIA,IAAmB,EAChEI,GAAUD,GAAWF,CAAY,EAAI,KAAOA,IAAiB,WAC7DI,EAA8BC,IAAW,EAE7CvB,EAAKrB,EAAa,cAAe,SAAUiC,EAAOC,EAAa,CAC7Db,EAAKY,EAAO,SAAUG,EAAIS,EAAU,CAClC,GAAI,CAAAT,EAAG,UAGP,KAAIU,EAASV,EAAG,OACZW,EACAC,EAAavE,GAAMqE,CAAM,EAC7B,GAAIjD,GAAUA,EAAO,YAAc,YACjCkD,EAASD,IAAWjD,EAAO,cAIzB,CACA,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAOmD,EAAW,UAClB,OAAQA,EAAW,UACrB,EACA,MAAO,CACL,QAAS,CACX,CACF,EAEE,CACA,MAAO,CACL,QAAS,CACX,CACF,MACK,CACL,IAAIC,EAAU,EACVC,EAAU,EACTF,EAAW,aAIdC,EAAUD,EAAW,UAAY,EACjCE,EAAUF,EAAW,WAAa,GAEpCD,EAASb,IAAgB,YAAc,CACrC,EAAGe,EACH,EAAGC,EACH,MAAO,CACL,QAAS,CACX,CACF,EAAI,CACF,MAAO,CACL,EAAGD,EACH,EAAGC,EACH,MAAO,EACP,OAAQ,CACV,EACA,MAAO,CACL,QAAS,CACX,CACF,CACF,CAEAH,GAAUJ,EAAc,IAAIP,EAAIW,EAAQP,EAAU,EAAGE,CAAM,EAC7D,CAAC,CACH,CAAC,EAEDrB,EAAK,KAAK,SAAU,SAAUY,EAAOC,EAAa,CAChDb,EAAKY,EAAO,SAAUG,EAAIS,EAAU,CAClC,IAAIM,EAAOnD,EAAa,kBAAkBkC,CAAW,EAAEW,CAAQ,EAC3DE,EAAS,CAAC,EACTI,IAGDf,aAAsB1E,GACpByF,EAAK,MAAQ,OACfJ,EAAO,EAAIX,EAAG,EACdW,EAAO,EAAIX,EAAG,EACdA,EAAG,EAAIe,EAAK,KACZf,EAAG,EAAIe,EAAK,OAGVA,EAAK,WACPJ,EAAO,MAAQK,EAAO,CAAC,EAAGhB,EAAG,KAAK,EAClCA,EAAG,SAASe,EAAK,QAAQ,GAEvBA,EAAK,QACPf,EAAG,SAAS,UAAW,CAAC,EACxBW,EAAO,MAAQ,CACb,QAAS,CACX,GAIOX,EAAG,MAAM,UAAY,IAC5BW,EAAO,MAAQ,CACb,QAAS,CACX,IAGJJ,EAAc,IAAIP,EAAIW,EAAQP,EAAU,EAAGE,CAAM,EACnD,CAAC,CACH,EAAG,IAAI,EACP,KAAK,OAAS,YACdC,EAAc,SAASU,GAAK,UAAY,CACtC,KAAK,OAAS,QACdrD,EAAa,cAAc,CAC7B,EAAG,IAAI,CAAC,EAAE,MAAM,CAClB,EACArB,EAAY,UAAU,iBAAmB,SAAUO,EAAK,CACtD,IAAIJ,EAAQ,KACRwE,EAAa,KAAK,YAClBC,EAAiB,KAAK,gBACrBA,IACH,KAAK,gBAAkB,CACrB,OAAQ,KAAK,KACf,EACAA,EAAiB,KAAK,iBAExB,IAAIvE,EAAc,KAAK,YAElBsE,IACHA,EAAa,KAAK,YAAc,IAAIE,GAAetE,EAAI,MAAM,CAAC,EAC9DoE,EAAW,GAAG,MAAOD,GAAK,KAAK,OAAQ,IAAI,CAAC,EAC5CC,EAAW,GAAG,OAAQD,GAAK,KAAK,QAAS,IAAI,CAAC,GAEhDC,EAAW,OAAOtE,EAAY,IAAI,MAAM,EAAG,CACzC,IAAKE,EACL,MAAO,CACL,UAAWF,CACb,EACA,YAAa,CACX,YAAaA,EAAY,IAAI,aAAa,EAC1C,SAAU,SAAUyE,EAAGC,EAAGC,EAAG,CAC3B,IAAI7D,EAAiBhB,EAAM,gBAC3B,OAAOgB,EAELA,EAAe,gBAAgB,EAAE,QAAQ4D,EAAI5D,EAAe,EAAG6D,EAAI7D,EAAe,CAAC,EAAI,EAC3F,CACF,CACF,CAAC,EACDyD,EAAe,UAAYvE,EAAY,IAAI,YAAY,EACvDuE,EAAe,KAAOvE,EAAY,IAAI,MAAM,CAC9C,EACAL,EAAY,UAAU,iBAAmB,UAAY,CACnD,IAAI2E,EAAa,KAAK,YACtB,KAAK,gBAAkB,KACnBA,IACFA,EAAW,QAAQ,EACnBA,EAAa,KAEjB,EACA3E,EAAY,UAAU,OAAS,SAAU8E,EAAG,CAC1C,GAAI,KAAK,SAAW,cAAgB,KAAK,IAAIA,EAAE,EAAE,EAAI5F,KAAkB,KAAK,IAAI4F,EAAE,EAAE,EAAI5F,KAAiB,CAEvG,IAAI+F,EAAO,KAAK,YAAY,QAAQ,EAAE,KAAK,KAC3C,GAAI,CAACA,EACH,OAEF,IAAI5C,EAAa4C,EAAK,UAAU,EAChC,GAAI,CAAC5C,EACH,OAEF,KAAK,IAAI,eAAe,CACtB,KAAM,cACN,KAAM,KAAK,IACX,SAAU,KAAK,YAAY,GAC3B,SAAU,CACR,EAAGA,EAAW,EAAIyC,EAAE,GACpB,EAAGzC,EAAW,EAAIyC,EAAE,GACpB,MAAOzC,EAAW,MAClB,OAAQA,EAAW,MACrB,CACF,CAAC,CACH,CACF,EACArC,EAAY,UAAU,QAAU,SAAU8E,EAAG,CAC3C,IAAII,EAASJ,EAAE,QACXK,EAASL,EAAE,QACXM,EAAYN,EAAE,MAClB,GAAI,KAAK,SAAW,YAAa,CAE/B,IAAIG,EAAO,KAAK,YAAY,QAAQ,EAAE,KAAK,KAC3C,GAAI,CAACA,EACH,OAEF,IAAI5C,EAAa4C,EAAK,UAAU,EAChC,GAAI,CAAC5C,EACH,OAEF,IAAIgD,EAAO,IAAIC,GAAajD,EAAW,EAAGA,EAAW,EAAGA,EAAW,MAAOA,EAAW,MAAM,EAEvFkD,EAAY,KACZC,EAAkB,KAAK,gBAC3BD,EAAYC,EAAgB,UAC5B,IAAIC,EAAUD,EAAgB,KAAOA,EAAgB,MAAQ,EAE7D,GADAC,GAAWL,EACPG,EAAW,CACb,IAAIG,EAAUH,EAAU,KAAO,EAC3BI,EAAUJ,EAAU,KAAO,IAC/BE,EAAU,KAAK,IAAI,KAAK,IAAIE,EAASF,CAAO,EAAGC,CAAO,CACxD,CACA,IAAIE,EAAYH,EAAUD,EAAgB,KAC1CA,EAAgB,KAAOC,EACvB,IAAI1E,EAAa,KAAK,YAAY,WAElCmE,GAAUnE,EAAW,EACrBoE,GAAUpE,EAAW,EAErB,IAAI8E,EAAWC,GAAO,EACfC,GAAUF,EAAGA,EAAG,CAAC,CAACX,EAAQ,CAACC,CAAM,CAAC,EAClCa,GAAMH,EAAGA,EAAG,CAACD,EAAWA,CAAS,CAAC,EAClCG,GAAUF,EAAGA,EAAG,CAACX,EAAQC,CAAM,CAAC,EACvCE,EAAK,eAAeQ,CAAC,EACrB,KAAK,IAAI,eAAe,CACtB,KAAM,gBACN,KAAM,KAAK,IACX,SAAU,KAAK,YAAY,GAC3B,SAAU,CACR,EAAGR,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,MACf,CACF,CAAC,CACH,CACF,EACArF,EAAY,UAAU,YAAc,SAAUmB,EAAgB,CAC5D,IAAIhB,EAAQ,KACZgB,EAAe,GAAG,QAAS,SAAU2D,EAAG,CACtC,GAAI3E,EAAM,SAAW,QAGrB,KAAI8F,EAAY9F,EAAM,YAAY,IAAI,YAAa,EAAI,EACvD,GAAK8F,EAGL,KAAIrF,EAAaT,EAAM,WAAW2E,EAAE,QAASA,EAAE,OAAO,EACtD,GAAKlE,EAGL,KAAIqC,EAAOrC,EAAW,KACtB,GAAIqC,EAAK,UAAU,EAAE,WACnB9C,EAAM,YAAYS,CAAU,UAExBqF,IAAc,aAChB9F,EAAM,YAAYS,CAAU,UACnBqF,IAAc,OAAQ,CAC/B,IAAIC,EAAYjD,EAAK,SAAS,KAAK,aAAaA,EAAK,SAAS,EAC1DkD,EAAOD,EAAU,IAAI,OAAQ,EAAI,EACjCE,EAAaF,EAAU,IAAI,SAAU,EAAI,GAAK,QAClDC,GAAQE,GAAWF,EAAMC,CAAU,CACrC,IAEJ,EAAG,IAAI,CACT,EACApG,EAAY,UAAU,kBAAoB,SAAUK,EAAaE,EAAKK,EAAY,CAChF,IAAIT,EAAQ,KACPS,IACHA,EAAaP,EAAY,IAAI,YAAa,EAAI,GAAK,KAAO,CACxD,KAAMA,EAAY,YAAY,CAChC,EAIE,KAAK,WAAWE,EAAI,SAAS,EAAI,EAAGA,EAAI,UAAU,EAAI,CAAC,EACpDK,IACHA,EAAa,CACX,KAAMP,EAAY,QAAQ,EAAE,KAAK,IACnC,KAGH,KAAK,cAAgB,KAAK,YAAc,IAAIiG,IAAW,KAAK,KAAK,IAAI,OAAOjG,EAAaE,EAAKK,EAAW,KAAM,SAAUqC,EAAM,CAC1H9C,EAAM,SAAW,cACZoG,GAAclG,EAAY,YAAY,EAAG4C,CAAI,EAAI9C,EAAM,YAAY,CACxE,KAAM8C,CACR,CAAC,EAAI9C,EAAM,YAAY,CACrB,KAAM8C,CACR,CAAC,EAEL,CAAC,CACH,EAIAjD,EAAY,UAAU,OAAS,UAAY,CACzC,KAAK,iBAAiB,EACtB,KAAK,iBAAmB,KAAK,gBAAgB,UAAU,EACvD,KAAK,SAAWI,GAAc,EAC9B,KAAK,OAAS,QACd,KAAK,aAAe,KAAK,YAAY,OAAO,CAC9C,EACAJ,EAAY,UAAU,QAAU,UAAY,CAC1C,KAAK,iBAAiB,CACxB,EACAA,EAAY,UAAU,YAAc,SAAUY,EAAY,CACxD,KAAK,IAAI,eAAe,CACtB,KAAM,oBACN,KAAM,KAAK,IACX,SAAU,KAAK,YAAY,GAC3B,WAAYA,EAAW,IACzB,CAAC,CACH,EACAZ,EAAY,UAAU,YAAc,SAAUY,EAAY,CACxD,KAAK,IAAI,eAAe,CACtB,KAAM,oBACN,KAAM,KAAK,IACX,SAAU,KAAK,YAAY,GAC3B,WAAYA,EAAW,IACzB,CAAC,CACH,EASAZ,EAAY,UAAU,WAAa,SAAU+E,EAAGC,EAAG,CACjD,IAAIpE,EACA4F,EAAW,KAAK,YAAY,YAAY,EAC5C,OAAAA,EAAS,SAAS,CAChB,KAAM,eACN,MAAO,UACT,EAAG,SAAUvD,EAAM,CACjB,IAAIwD,EAAO,KAAK,SAAS,WAAWxD,EAAK,YAAY,CAAC,EAEtD,GAAIwD,EAAM,CACR,IAAIC,EAAQD,EAAK,sBAAsB1B,EAAGC,CAAC,EACvC2B,EAAQF,EAAK,MAEjB,GAAIE,EAAM,GAAKD,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKC,EAAM,EAAIA,EAAM,OAASA,EAAM,GAAKD,EAAM,CAAC,GAAKA,EAAM,CAAC,GAAKC,EAAM,EAAIA,EAAM,OACjH/F,EAAa,CACX,KAAMqC,EACN,QAASyD,EAAM,CAAC,EAChB,QAASA,EAAM,CAAC,CAClB,MAEA,OAAO,EAEX,CACF,EAAG,IAAI,EACA9F,CACT,EACAZ,EAAY,KAAO,UACZA,CACT,GAAE4G,EAAS,EACX,SAASxG,IAAgB,CACvB,MAAO,CACL,UAAW,CAAC,EACZ,WAAY,CAAC,EACb,QAAS,CAAC,CACZ,CACF,CAIA,SAAS4B,IAAW3B,EAAaY,EAAaQ,EAAYP,EAAQM,EAAmBE,EAAkBE,EAAUC,EAASC,EAAaC,EAAO,CAE5I,GAAI,CAACH,EAIH,OAIF,IAAIiF,EAAajF,EAAS,UAAU,EAChCkF,EAAOzG,EAAY,QAAQ,EAC3B0G,EAAYnF,EAAS,SAAS,EAIlC,GADAkF,EAAK,iBAAiBlF,EAAS,UAAW,IAAI,EAC1C,CAACiF,GAAc,CAACA,EAAW,SAC7B,OAEF,IAAIG,EAAYH,EAAW,MACvBI,EAAaJ,EAAW,OACxBK,EAAcL,EAAW,YACzBM,EAAgBN,EAAW,UAC3BO,EAAexF,EAAS,YAAY,EACpCyF,EAAcxF,GAAWA,EAAQ,YAAY,EAC7CU,EAAmBX,EAAS,aAC5B0F,EAAcT,EAAW,YACzBU,EAAWhF,GAAoBA,EAAiB,OAChDiF,EAAuBT,EAAU,SAAS,WAAW,EACrDU,EAAyBV,EAAU,SAAS,CAAC,WAAY,WAAW,CAAC,EACrEW,EAAqBX,EAAU,SAAS,CAAC,OAAQ,WAAW,CAAC,EAC7DY,EAAuBZ,EAAU,SAAS,CAAC,SAAU,WAAW,CAAC,EACjEa,EAAeJ,EAAqB,IAAI,cAAc,GAAK,EAI3DpE,EAAQyE,GAAY,YAAa/I,EAAK,EAC1C,GAAI,CAACsE,EACH,OASF,GAPAtB,EAAY,IAAIsB,CAAK,EAErBA,EAAM,EAAIyD,EAAW,GAAK,EAC1BzD,EAAM,EAAIyD,EAAW,GAAK,EAC1BzD,EAAM,WAAW,EACjBtD,GAAMsD,CAAK,EAAE,UAAY4D,EACzBlH,GAAMsD,CAAK,EAAE,WAAa6D,EACtBJ,EAAW,gBACb,OAAOzD,EAGT,IAAI0E,EAAKD,GAAY,aAAc7I,IAAM+C,EAAOxC,GAAK,EACrDuI,GAAMC,EAAiB3E,EAAO0E,EAAIP,GAAYV,EAAW,gBAAgB,EACzE,IAAImB,EAAgBjB,EAAU,SAAS,UAAU,EAC7CkB,EAAQD,EAAc,IAAI,OAAO,EACjCE,EAAYF,EAAc,IAAI,WAAW,EACzCG,EAAaH,EAAc,IAAI,UAAU,EACzCI,EAAiBH,IAAU,WAAarG,EAAS,oBAAoB,EAAIqG,IAAU,aAAerG,EAAS,qBAAqB,EAAIqG,EAExI,GAAIV,EAIEc,GAAqBjF,CAAK,GAC5BkF,GAAwBlF,EAAO,EAAK,EAElC0E,IACFQ,GAAwBR,EAAI,CAACK,CAAU,EAEvCrB,EAAK,iBAAiBlF,EAAS,UAAWkG,CAAE,EAC5CS,GAAiBT,EAAIM,EAAgBF,CAAS,OAE3C,CACL,IAAIM,EAAUX,GAAY,UAAW7I,IAAM+C,EAAOvC,GAAU,EAC5DgJ,GAAWC,EAAcrF,EAAOoF,CAAO,EACvCV,EAAG,gBAAkB,GACjBA,GAAMO,GAAqBP,CAAE,GAC/BQ,GAAwBR,EAAI,EAAK,EAEnCQ,GAAwBlF,EAAO,CAAC+E,CAAU,EAE1CrB,EAAK,iBAAiBlF,EAAS,UAAWwB,CAAK,EAC/C,IAAIsF,EAAc3B,EAAU,WAAW,QAAQ,EAC/C2B,GAAeF,EAAQ,KAAK,SAAUE,CAAW,EACjDH,GAAiBnF,EAAOgF,EAAgBF,CAAS,CACnD,CACA,OAAO9E,EAIP,SAAS2E,EAAiB3E,EAAO0E,EAAIa,GAAe,CAClD,IAAIC,GAASC,GAAUf,CAAE,EAWzB,GATAc,GAAO,UAAYhH,EAAS,UAC5BgH,GAAO,YAAcvI,EAAY,YACjCyH,EAAG,SAAS,CACV,EAAG,EACH,EAAG,EACH,MAAOd,EACP,OAAQC,EACR,EAAGW,CACL,CAAC,EACGT,EAIF2B,EAAiBhB,CAAE,MACd,CACLA,EAAG,UAAY,GACf,IAAIiB,GAAQnH,EAAS,UAAU,OAAO,EAClCoH,GAAoBD,GAAM,OAC1BE,GAActJ,IAAmB6H,CAAoB,EACzDyB,GAAY,KAAOD,GACnB,IAAIE,GAAgBzJ,GAAkBgI,CAAsB,EAC5DyB,GAAc,KAAOzB,EAAuB,IAAI,aAAa,EAC7D,IAAI0B,GAAY1J,GAAkBiI,CAAkB,EACpDyB,GAAU,KAAOzB,EAAmB,IAAI,aAAa,EACrD,IAAI0B,GAAc3J,GAAkBkI,CAAoB,EAExD,GADAyB,GAAY,KAAOzB,EAAqB,IAAI,aAAa,EACrDgB,GAAe,CACjB,IAAIU,GAAkBrC,EAAY,EAAIE,EACtCoC,GAEAxB,EAAIkB,GAAmBD,GAAM,QAAS,CACpC,EAAG7B,EACH,EAAG,EACH,MAAOmC,GACP,OAAQ/B,CACV,CAAC,CACH,MAGEQ,EAAG,kBAAkB,EAEvBA,EAAG,SAASmB,EAAW,EACvBnB,EAAG,YAAY,UAAU,EAAE,MAAQoB,GACnCpB,EAAG,YAAY,MAAM,EAAE,MAAQqB,GAC/BrB,EAAG,YAAY,QAAQ,EAAE,MAAQsB,GACjCG,GAAqBzB,CAAE,CACzB,CACA1E,EAAM,IAAI0E,CAAE,CACd,CACA,SAASW,EAAcrF,EAAOoF,EAAS,CACrC,IAAII,GAASC,GAAUL,CAAO,EAE9BI,GAAO,UAAYhH,EAAS,UAC5BgH,GAAO,YAAcvI,EAAY,YACjC,IAAImJ,GAAe,KAAK,IAAIxC,EAAY,EAAIE,EAAa,CAAC,EACtDuC,GAAgB,KAAK,IAAIxC,EAAa,EAAIC,EAAa,CAAC,EAS5D,GARAsB,EAAQ,QAAU,GAClBA,EAAQ,SAAS,CACf,EAAGtB,EACH,EAAGA,EACH,MAAOsC,GACP,OAAQC,GACR,EAAG7B,CACL,CAAC,EACGT,EAIF2B,EAAiBN,CAAO,MACnB,CACLA,EAAQ,UAAY,GACpB,IAAIkB,GAAY9H,EAAS,UAAU,OAAO,EACtC+H,GAAcD,GAAU,KACxBT,GAActJ,IAAmB6H,CAAoB,EACzDyB,GAAY,KAAOU,GACnBV,GAAY,MAAQS,GAAU,MAC9B,IAAIR,GAAgBzJ,GAAkBgI,CAAsB,EACxD0B,GAAY1J,GAAkBiI,CAAkB,EAChD0B,GAAc3J,GAAkBkI,CAAoB,EAExD2B,GAAYd,EAASmB,GAAaD,GAAU,QAAS,IAAI,EACzDlB,EAAQ,SAASS,EAAW,EAC5BT,EAAQ,YAAY,UAAU,EAAE,MAAQU,GACxCV,EAAQ,YAAY,MAAM,EAAE,MAAQW,GACpCX,EAAQ,YAAY,QAAQ,EAAE,MAAQY,GACtCG,GAAqBf,CAAO,CAC9B,CACApF,EAAM,IAAIoF,CAAO,CACnB,CACA,SAASM,EAAiBc,EAAS,CAGjC,CAACA,EAAQ,WAAalI,EAAiB,KAAKkI,CAAO,CACrD,CACA,SAASN,GAAYO,EAAQF,EAAaG,GAE1CC,GAAgB,CACd,IAAIC,GAAmBjD,EAAU,SAASgD,GAAiB3K,IAAyBD,GAAiB,EACjG8K,GAAcC,GAAoBnD,EAAU,IAAI,MAAM,EAAG,IAAI,EAC7DoD,GAASH,GAAiB,WAAW,MAAM,EAC/CI,GAAcP,EAAQQ,GAAqBtD,EAAWgD,GAAiB3K,IAAyBD,GAAiB,EAAG,CAClH,YAAagL,GAASF,GAAc,KACpC,aAAcN,EACd,eAAgBG,GAChB,aAAczJ,EACd,eAAgBuB,EAAS,SAC3B,CAAC,EACD,IAAI0I,GAAST,EAAO,eAAe,EACnC,GAAKS,GAGL,KAAIC,GAAYD,GAAO,MACnBE,GAAcC,GAAkBF,GAAU,SAAW,CAAC,EACtDR,KACFF,EAAO,cAAc,CACnB,WAAYE,EACd,CAAC,EACDO,GAAO,mBAAqB,IAE9BA,GAAO,aAAe,UAAY,CAChC,IAAII,GAAQ,KAAK,KAAKX,GAAiBA,GAAe,MAAQF,EAAO,MAAM,OAASW,GAAY,CAAC,EAAIA,GAAY,CAAC,EAAG,CAAC,EAClHG,GAAS,KAAK,KAAKZ,GAAiBA,GAAe,OAASF,EAAO,MAAM,QAAUW,GAAY,CAAC,EAAIA,GAAY,CAAC,EAAG,CAAC,GACrHD,GAAU,QAAUG,IAASH,GAAU,SAAWI,KACpDL,GAAO,SAAS,CACd,MAAOI,GACP,OAAQC,EACV,CAAC,CAEL,EACAJ,GAAU,gBAAkB,EAC5BA,GAAU,aAAe,WACzBK,GAAiBL,GAAWR,GAAgBlD,CAAU,EACtD,IAAIgE,GAAoBP,GAAO,SAAS,UAAU,EAClDM,GAAiBC,GAAoBA,GAAkB,MAAQ,KAAMd,GAAgBlD,CAAU,EACjG,CACA,SAAS+D,GAAiB7B,EAAOgB,EAAgBlD,GAAY,CAC3D,IAAIiE,GAAO/B,EAAQA,EAAM,KAAO,KAChC,GAAI,CAACgB,GAAkBlD,GAAW,YAAciE,IAAQ,KAAM,CAC5D,IAAIC,GAAW1K,EAAY,IAAI,gBAAiB,EAAI,EACpD0I,EAAM,KAAOgC,GAAWA,GAAW,IAAMD,GAAOA,EAClD,CACF,CACA,SAASjD,GAAYtE,EAAayH,EAAMjJ,GAAOkJ,GAAG,CAChD,IAAIrB,GAAUvC,GAAe,MAAQ5F,EAAW8B,CAAW,EAAE8D,CAAW,EACpE6D,GAAQ1J,EAAkB+B,CAAW,EACzC,OAAIqG,IAEFnI,EAAW8B,CAAW,EAAE8D,CAAW,EAAI,KACvC8D,GAA2BD,GAAOtB,EAAO,GAGjCzC,IACRyC,GAAU,IAAIoB,EACVpB,cAAmBwB,KACrBxB,GAAQ,GAAKyB,IAAYtJ,GAAOkJ,EAAC,GAEnCK,GAA0BJ,GAAOtB,EAAO,GAGnC3I,EAAYsC,CAAW,EAAE6D,CAAY,EAAIwC,EAClD,CACA,SAASuB,GAA2BD,EAAOtB,EAAS,CAClD,IAAI2B,GAAUL,EAAM9D,CAAY,EAAI,CAAC,EACjCwC,aAAmB9K,IACrByM,GAAQ,KAAO3B,EAAQ,EACvB2B,GAAQ,KAAO3B,EAAQ,GAEvB2B,GAAQ,SAAW9G,EAAO,CAAC,EAAGmF,EAAQ,KAAK,CAE/C,CAGA,SAAS0B,GAA0BJ,EAAOtB,EAAS,CACjD,IAAI2B,GAAUL,EAAM9D,CAAY,EAAI,CAAC,EACjCoE,GAAa5J,EAAS,WACtB6J,GAAU7B,aAA2B7K,GACzC,GAAIyM,KAAe,CAACtK,GAAUA,EAAO,YAAc,aAAc,CAC/D,IAAIwK,GAAa,EACbC,GAAa,EAGbC,GAAcpK,EAAkB,WAAWgK,GAAW,YAAY,CAAC,EACnE,CAACtK,GAAU0K,IAAeA,GAAY,WACxCF,GAAaE,GAAY,SAAS,MAClCD,GAAaC,GAAY,SAAS,QAIhCH,IACFF,GAAQ,KAAO,EACfA,GAAQ,KAAOI,IAEfJ,GAAQ,SAAW,CACjB,EAAGG,GACH,EAAGC,GACH,MAAO,EACP,OAAQ,CACV,CAEJ,CAEAJ,GAAQ,OAAS,CAACE,EACpB,CACF,CAOA,SAASJ,IAAYtJ,EAAO8J,EAAW,CACrC,OAAO9J,EAAQ1C,IAAUwM,CAC3B,CACA,IAAOC,IAAQ9L,IC30Bf,IAAI+L,GAAcA,EACdC,IAAkBA,GAClBC,GAAgC,GAChCC,IAA6B,UAAY,CAC3C,SAASA,EAAcC,EAAQ,CAC7B,IAAIC,EAAgBD,EAAO,cACvBE,EAAaF,EAAO,KACpBG,EAAa,KAAK,OAAgBC,GAAMJ,CAAM,EAClD,KAAK,KAAOE,EACZ,KAAK,cAAgBD,EACrB,KAAK,eAAiBI,IAAYJ,CAAa,EAC/C,IAAIK,EAAgBP,EAAc,eAAeG,CAAU,EAC3D,KAAK,YAAcI,EAAc,YACjC,KAAK,eAAiBA,EAAc,eACpC,KAAK,oBAAsBA,EAAc,oBAAoBL,CAAa,EACtEA,IAAkB,aACpBM,GAAqBJ,CAAU,EAC/BK,IAAuBL,CAAU,GACxBF,IAAkB,WAC3BE,EAAW,WAAaM,IAA+BN,CAAU,EAG/DI,GAAqBJ,EAAY,EAAI,GAGhCO,GAAOT,IAAkB,UAAYE,EAAW,UAAU,EACjEI,GAAqBJ,CAAU,EAEnC,CACA,OAAAJ,EAAc,UAAU,iBAAmB,SAAUY,EAAO,CAC1D,IAAIC,EAAa,KAAK,eAAeD,CAAK,EAC1C,OAAO,KAAK,oBAAoBC,EAAYD,CAAK,CACnD,EACAZ,EAAc,UAAU,cAAgB,UAAY,CAClD,OAAcc,GAAK,KAAK,eAAgB,IAAI,CAC9C,EAOAd,EAAc,gBAAkB,UAAY,CAC1C,OAAce,GAAKf,EAAc,cAAc,CACjD,EAUAA,EAAc,YAAc,SAAUG,EAAY,CAChD,OAAOH,EAAc,eAAe,eAAeG,CAAU,CAC/D,EAKAH,EAAc,WAAa,SAAUgB,EAAQC,EAAUC,EAAS,CACnDpB,GAASkB,CAAM,EACjBnB,EAAKmB,EAAQC,EAAUC,CAAO,EAErCD,EAAS,KAAKC,EAASF,CAAM,CAEjC,EACAhB,EAAc,UAAY,SAAUgB,EAAQC,EAAUC,EAAS,CAC7D,IAAIC,EACAC,EAAmBC,EAAQL,CAAM,EAAI,CAAC,EAAWlB,GAASkB,CAAM,EAAI,CAAC,GAAKG,EAAY,GAAM,MAChG,OAAAnB,EAAc,WAAWgB,EAAQ,SAAUM,EAAGC,EAAK,CACjD,IAAIC,EAASP,EAAS,KAAKC,EAASI,EAAGC,CAAG,EAC1CJ,EAAYC,EAAYI,EAASJ,EAAUG,CAAG,EAAIC,CACpD,CAAC,EACMJ,CACT,EAIApB,EAAc,gBAAkB,SAAUyB,EAAK,CAC7C,IAAIC,EAAM,CAAC,EACPC,EACJ,OAAAF,GAAO5B,GAAKG,EAAc,eAAgB,SAAU4B,EAAGzB,EAAY,CAC7DsB,EAAI,eAAetB,CAAU,IAC/BuB,EAAIvB,CAAU,EAAIsB,EAAItB,CAAU,EAChCwB,EAAY,GAEhB,CAAC,EACMA,EAAYD,EAAM,IAC3B,EASA1B,EAAc,mBAAqB,SAAU6B,EAAa,CACxD,GAAWR,EAAQQ,CAAW,EAC5BA,EAAcA,EAAY,MAAM,UACvB/B,IAAS+B,CAAW,EAAG,CAChC,IAAIC,EAAU,CAAC,EACfjC,GAAKgC,EAAa,SAAUE,EAAMC,EAAM,CACtCF,EAAQ,KAAKE,CAAI,CACnB,CAAC,EACDH,EAAcC,CAChB,KACE,OAAO,CAAC,EAEV,OAAAD,EAAY,KAAK,SAAUI,EAAOC,EAAO,CAGvC,OAAOA,IAAU,SAAWD,IAAU,SAAWA,EAAM,QAAQ,OAAO,IAAM,EAAI,EAAI,EACtF,CAAC,EACMJ,CACT,EAKA7B,EAAc,UAAY,SAAUmC,EAAaC,EAAa,CAC5D,OAAOA,IAAgB,QAAU,CAAC,EAAED,GAAeA,EAAY,QAAQC,CAAW,IAAM,GAAKD,IAAgBC,CAC/G,EAQApC,EAAc,eAAiB,SAAUY,EAAOyB,EAAWC,EAAwB,CAIjF,QAHIC,EACAC,EAAM,IAEDC,EAAI,EAAGC,EAAML,EAAU,OAAQI,EAAIC,EAAKD,IAAK,CACpD,IAAIE,EAAaN,EAAUI,CAAC,EAAE,MAC9B,GAAIE,GAAc,KAAM,CACtB,GAAIA,IAAe/B,GAMTgC,GAASD,CAAU,GAAKA,IAAe/B,EAAQ,GACvD,OAAO6B,EAETH,GAA0BO,EAAeF,EAAYF,CAAC,CACxD,CACF,CACA,QAASA,EAAI,EAAGC,EAAML,EAAU,OAAQI,EAAIC,EAAKD,IAAK,CACpD,IAAIK,EAAQT,EAAUI,CAAC,EACnBM,EAAWD,EAAM,SACjBE,EAAUF,EAAM,MACpB,GAAIC,EAAU,CACZ,GAAIA,EAAS,CAAC,IAAM,MAClB,GAAIE,GAAWD,EAAQ,CAAC,EAAGpC,EAAOmC,EAAS,CAAC,CAAC,EAC3C,OAAON,UAEAM,EAAS,CAAC,IAAM,KACzB,GAAIE,GAAWD,EAAQ,CAAC,EAAGD,EAAS,CAAC,EAAGnC,CAAK,EAC3C,OAAO6B,UAEAQ,GAAWD,EAAQ,CAAC,EAAGD,EAAS,CAAC,EAAGnC,CAAK,GAAKqC,GAAWD,EAAQ,CAAC,EAAGpC,EAAOmC,EAAS,CAAC,CAAC,EAChG,OAAON,EAETH,GAA0BO,EAAeE,EAAS,CAAC,EAAGN,CAAC,EACvDH,GAA0BO,EAAeE,EAAS,CAAC,EAAGN,CAAC,CACzD,CACF,CACA,GAAIH,EACF,OAAO1B,IAAU,IAAWyB,EAAU,OAAS,EAAIzB,IAAU,KAAY,EAAI2B,EAE/E,SAASM,EAAeK,EAAKC,EAAO,CAClC,IAAIC,EAAS,KAAK,IAAIF,EAAMtC,CAAK,EAC7BwC,EAASZ,IACXA,EAAMY,EACNb,EAAYY,EAEhB,CACF,EACAnD,EAAc,eAAiB,CAC7B,MAAO,CACL,YAAaqD,GAAgB,OAAO,EACpC,eAAgB,UAAY,CAC1B,IAAIjD,EAAa,KAAK,OACtB,OAAcU,GAAKV,EAAW,gBAAkB,WAAa,SAAUQ,EAAO0C,EAAc,CAC1F,OAACA,IAAiB1C,EAAQ,KAAK,eAAeA,CAAK,GAC5C2C,GAAc,KAAK,KAAM3C,CAAK,CACvC,EAAI,SAAUA,EAAO0C,EAAcE,EAAK,CAGtC,IAAIC,EAAiB,CAAC,CAACD,EACvB,OAACF,IAAiB1C,EAAQ,KAAK,eAAeA,CAAK,GACnD4C,EAAcE,GAAS9C,EAAOR,EAAW,aAAcoD,CAAG,EACnDC,EAAiBD,EAAcG,GAAUH,EAAK,MAAM,CAC7D,EAAG,IAAI,CACT,EACA,oBAAqB,CACnB,OAAQ,SAAU3C,EAAY,CAC5B,OAAe8C,GAAkBD,GAAS7C,EAAY,KAAK,OAAO,YAAY,EAAG,MAAM,CACzF,EACA,SAAU0C,GACV,UAAW,SAAU1C,EAAYD,EAAO,CACtC,IAAIgD,EAASC,GAAmB,KAAK,KAAMjD,CAAK,EAChD,OAAIgD,GAAU,OACZA,EAAiBD,GAAkBD,GAAS7C,EAAY,KAAK,OAAO,YAAY,EAAG,MAAM,GAEpF+C,CACT,EACA,MAAOE,EACT,CACF,EACA,SAAUC,GAA8B,SAAUC,EAAOpD,EAAO,CAC9D,OAAeqD,GAAUD,EAAOpD,CAAK,CACvC,CAAC,EACD,gBAAiBmD,GAA8B,SAAUC,EAAOpD,EAAO,CACrE,OAAeqD,GAAUD,EAAO,KAAMpD,CAAK,CAC7C,CAAC,EACD,eAAgBmD,GAA8B,SAAUC,EAAOpD,EAAO,CACpE,OAAeqD,GAAUD,EAAO,KAAM,KAAMpD,CAAK,CACnD,CAAC,EACD,WAAYmD,GAA8B,SAAUC,EAAOpD,EAAO,CAChE,OAAesD,GAAYF,EAAOpD,CAAK,CACzC,CAAC,EACD,MAAO,CACL,YAAayC,GAAgB,OAAO,EACpC,oBAAqB,CACnB,OAAQ,KACR,SAAUE,GACV,UAAW,KACX,MAAO,IACT,CACF,EACA,QAAS,CACP,YAAaF,GAAgB,SAAS,EACtC,oBAAqBc,GAAgC,CAAC,EAAG,CAAC,CAAC,CAC7D,EACA,MAAO,CACL,YAAad,GAAgB,OAAO,EACpC,oBAAqB,CACnB,OAAQS,GACR,SAAUA,GACV,UAAWA,GACX,MAAOA,EACT,CACF,EACA,OAAQ,CACN,YAAa,SAAUlD,EAAOwD,EAAQC,EAAQ,CAC5C,IAAIC,EAAY,KAAK,iBAAiB1D,CAAK,EAC3CyD,EAAO,SAAUC,CAAS,CAC5B,EACA,oBAAqB,CACnB,OAAQC,IACR,SAAUhB,GACV,UAAW,SAAU1C,EAAYD,EAAO,CACtC,IAAIgD,EAASC,GAAmB,KAAK,KAAMjD,CAAK,EAChD,OAAIgD,GAAU,OACZA,EAASW,IAAa,KAAK,KAAM1D,CAAU,GAEtC+C,CACT,EACA,MAAOE,EACT,CACF,EACA,WAAY,CACV,YAAaT,GAAgB,YAAY,EACzC,oBAAqBc,GAAgC,CAAC,EAAG,CAAC,CAAC,CAC7D,CACF,EACOnE,CACT,GAAE,EACF,SAASS,IAAuBL,EAAY,CAC1C,IAAIiC,EAAYjC,EAAW,UAC3BA,EAAW,iBAAmB,GACvBP,EAAKwC,EAAW,SAAUS,EAAOK,EAAO,CAC7CL,EAAM,YAAcK,EAGhBL,EAAM,QAAU,OAClB1C,EAAW,iBAAmB,GAElC,CAAC,CACH,CACA,SAASM,IAA+BN,EAAY,CAElD,IAAIoE,EAAapE,EAAW,WACxBqE,EAAcrE,EAAW,YAAc,CAAC,EACxCY,EAASZ,EAAW,OAKxB,GAJAP,GAAK2E,EAAY,SAAUE,EAAMvB,EAAO,CACtCsB,EAAYC,CAAI,EAAIvB,CACtB,CAAC,EAEG,CAAQ9B,EAAQL,CAAM,EAAG,CAC3B,IAAI2D,EAAc,CAAC,EACR7E,GAASkB,CAAM,EACxBnB,GAAKmB,EAAQ,SAAUM,EAAGoD,EAAM,CAC9B,IAAIvB,EAAQsB,EAAYC,CAAI,EAC5BC,EAAYxB,GAAwBpD,EAA6B,EAAIuB,CACvE,CAAC,EAGDqD,EAAY5E,EAA6B,EAAIiB,EAE/CA,EAAS4D,IAAkBxE,EAAYuE,CAAW,CACpD,CAGA,QAASlC,EAAI+B,EAAW,OAAS,EAAG/B,GAAK,EAAGA,IACtCzB,EAAOyB,CAAC,GAAK,OACf,OAAOgC,EAAYD,EAAW/B,CAAC,CAAC,EAChC+B,EAAW,IAAI,EAGrB,CACA,SAAShE,GAAqBJ,EAAYyE,EAAY,CACpD,IAAI7D,EAASZ,EAAW,OACpB0E,EAAY,CAAC,EACNhF,GAASkB,CAAM,EACxBnB,GAAKmB,EAAQ,SAAUM,EAAG,CACxBwD,EAAU,KAAKxD,CAAC,CAClB,CAAC,EACQN,GAAU,MACnB8D,EAAU,KAAK9D,CAAM,EAEvB,IAAI+D,EAAgB,CAClB,MAAO,EACP,OAAQ,CACV,EACI,CAACF,GAAcC,EAAU,SAAW,GAAK,CAACC,EAAc,eAAe3E,EAAW,IAAI,IAExF0E,EAAU,CAAC,EAAIA,EAAU,CAAC,GAE5BF,IAAkBxE,EAAY0E,CAAS,CACzC,CACA,SAASf,GAA8BiB,EAAY,CACjD,MAAO,CACL,YAAa,SAAUpE,EAAOwD,EAAQC,EAAQ,CAE5C,IAAIY,EAAe,KAAK,iBAAiBrE,CAAK,EAE9CyD,EAAO,QAASW,EAAWZ,EAAO,OAAO,EAAGa,CAAY,CAAC,CAC3D,EACA,oBAAqBd,GAAgC,CAAC,EAAG,CAAC,CAAC,CAC7D,CACF,CACA,SAASI,IAAa1D,EAAY,CAChC,IAAIG,EAAS,KAAK,OAAO,OACzB,OAAOA,EAAO,KAAK,MAAMkE,GAAUrE,EAAY,CAAC,EAAG,CAAC,EAAG,CAAC,EAAGG,EAAO,OAAS,CAAC,EAAG,EAAI,CAAC,CAAC,GAAK,CAAC,CAC7F,CACA,SAASqC,GAAgBlD,EAAY,CACnC,OAAO,SAAUS,EAAOwD,EAAQC,EAAQ,CACtCA,EAAOlE,EAAY,KAAK,iBAAiBS,CAAK,CAAC,CACjD,CACF,CACA,SAAS2C,GAAc1C,EAAY,CACjC,IAAIG,EAAS,KAAK,OAAO,OACzB,OAAOA,EAAO,KAAK,OAAO,MAAQH,IAAed,GAAgCc,EAAaG,EAAO,OAASH,CAAU,CAC1H,CACA,SAASiD,IAAa,CAEpB,OAAO,KAAK,OAAO,OAAO,CAAC,CAC7B,CAIA,SAASK,GAAgCgB,EAAc,CACrD,MAAO,CACL,OAAQ,SAAUtE,EAAY,CAC5B,OAAOqE,GAAUrE,EAAYsE,EAAc,KAAK,OAAO,OAAQ,EAAI,CACrE,EACA,SAAU5B,GACV,UAAW,SAAU1C,EAAYD,EAAO,CACtC,IAAIgD,EAASC,GAAmB,KAAK,KAAMjD,CAAK,EAChD,OAAIgD,GAAU,OACZA,EAASsB,GAAUrE,EAAYsE,EAAc,KAAK,OAAO,OAAQ,EAAI,GAEhEvB,CACT,EACA,MAAOE,EACT,CACF,CACA,SAASD,GAAmBjD,EAAO,CACjC,IAAIR,EAAa,KAAK,OAClBiC,EAAYjC,EAAW,UAC3B,GAAIA,EAAW,iBAAkB,CAC/B,IAAIgF,EAAapF,GAAc,eAAeY,EAAOyB,CAAS,EAC1DS,EAAQT,EAAU+C,CAAU,EAChC,GAAItC,GAASA,EAAM,OACjB,OAAOA,EAAM,OAAO,KAAK,IAAI,CAEjC,CACF,CACA,SAAS8B,IAAkBxE,EAAY0E,EAAW,CAChD,OAAA1E,EAAW,OAAS0E,EAChB1E,EAAW,OAAS,UACtBA,EAAW,aAAsBiF,EAAIP,EAAW,SAAU/C,EAAM,CAC9D,IAAIiC,EAAgBsB,GAAMvD,CAAI,EAI9B,OAAOiC,GAAS,CAAC,EAAG,EAAG,EAAG,CAAC,CAC7B,CAAC,GAEIc,CACT,CAIA,IAAIxE,IAAc,CAChB,OAAQ,SAAUM,EAAO,CACvB,OAAOsE,GAAUtE,EAAO,KAAK,OAAO,WAAY,CAAC,EAAG,CAAC,EAAG,EAAI,CAC9D,EACA,UAAW,SAAUA,EAAO,CAC1B,IAAIyB,EAAY,KAAK,OAAO,UACxB+C,EAAapF,GAAc,eAAeY,EAAOyB,EAAW,EAAI,EACpE,GAAI+C,GAAc,KAChB,OAAOF,GAAUE,EAAY,CAAC,EAAG/C,EAAU,OAAS,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAI,CAExE,EACA,SAAU,SAAUzB,EAAO,CACzB,IAAIuC,EAAQ,KAAK,OAAO,WAAa,KAAK,OAAO,YAAYvC,CAAK,EAAIA,EACtE,OAAOuC,GAAgBpD,EACzB,EACA,MAAcwF,EAChB,EACA,SAAStC,GAAWuC,EAAOC,EAAGC,EAAG,CAC/B,OAAOF,EAAQC,GAAKC,EAAID,EAAIC,CAC9B,CACA,IAAOC,GAAQ3F,GC9af,IAAI4F,IAAoB,YACpBC,IAAQC,GAAU,EACfC,IAAQ,CACb,WAAY,UACZ,MAAO,SAAUC,EAAa,CAC5B,IAAIC,EAAOD,EAAY,QAAQ,EAAE,KAC7BE,EAAOD,EAAK,KACZC,EAAK,UAAU,GAGnBC,IAAWD,EAEX,CAAC,EAAGF,EAAY,YAAY,EAAE,aAAa,EAAGA,CAAW,CAC3D,CACF,EACA,SAASG,IAAWC,EAAMC,EAAkBC,EAAmBN,EAAa,CAC1E,IAAIO,EAAYH,EAAK,SAAS,EAC1BI,EAAaJ,EAAK,UAAU,EAC5BK,EAAOL,EAAK,SAAS,KAEzB,GAAI,GAACI,GAAcA,EAAW,WAAa,CAACA,EAAW,UAGvD,KAAIE,EAAqBH,EAAU,SAASX,GAAiB,EACzDe,EAAUC,IAAaF,EAAoBL,EAAkBL,CAAW,EACxEa,EAAcJ,EAAK,uBAAuBL,EAAK,UAAW,OAAO,EAEjEU,EAAcJ,EAAmB,IAAI,aAAa,EAClDK,EAAwBL,EAAmB,IAAI,uBAAuB,EACtEM,EACAD,GAAyB,OAE3BC,EAAgBC,IAAeN,CAAO,EACtCG,EAAcI,IAAqBH,EAAuBC,CAAa,GAEzEH,EAAY,OAASC,EACrB,IAAIK,EAAef,EAAK,aACxB,GAAI,CAACe,GAAgB,CAACA,EAAa,OACjCH,EAAgBC,IAAeN,CAAO,EAEtCE,EAAY,KAAOG,MACd,CACL,IAAII,EAAYC,IAAmBjB,EAAMG,EAAWC,EAAYE,EAAoBC,EAASQ,CAAY,EAEzGG,EAAKH,EAAc,SAAUI,EAAOC,EAAO,CAEzC,GAAID,EAAM,OAASjB,EAAkB,QAAUiB,IAAUjB,EAAkBiB,EAAM,KAAK,EAAG,CACvF,IAAIE,EAAcC,IAAUnB,EAAWI,EAASY,EAAOC,EAAOJ,EAAWpB,CAAW,EACpFG,IAAWoB,EAAOE,EAAanB,EAAmBN,CAAW,CAC/D,CACF,CAAC,CACH,EACF,CACA,SAASY,IAAaF,EAAoBL,EAAkBL,EAAa,CACvE,IAAIW,EAAUgB,EAAO,CAAC,EAAGtB,CAAgB,EACrCuB,EAA4B5B,EAAY,0BAC5C,OAAAsB,EAAK,CAAC,QAAS,aAAc,iBAAiB,EAAG,SAAUO,EAAY,CAErED,EAA0BC,CAAU,EAAIxB,EAAiBwB,CAAU,EACnE,IAAIC,EAAMpB,EAAmB,IAAImB,CAAU,EAC3CD,EAA0BC,CAAU,EAAI,KACxCC,GAAO,OAASnB,EAAQkB,CAAU,EAAIC,EACxC,CAAC,EACMnB,CACT,CACA,SAASM,IAAeN,EAAS,CAC/B,IAAIoB,EAAQC,GAAqBrB,EAAS,OAAO,EACjD,GAAIoB,EAAO,CACT,IAAIE,EAAaD,GAAqBrB,EAAS,YAAY,EACvDuB,EAAkBF,GAAqBrB,EAAS,iBAAiB,EACrE,OAAIuB,IACFH,EAAQI,GAAUJ,EAAO,KAAM,KAAMG,CAAe,GAElDD,IACFF,EAAQK,GAAYL,EAAOE,CAAU,GAEhCF,CACT,CACF,CACA,SAASb,IAAqBH,EAAuBC,EAAe,CAClE,OAAOA,GAAiB,KAEtBmB,GAAUnB,EAAe,KAAM,KAAMD,CAAqB,EAAI,IAClE,CACA,SAASiB,GAAqBrB,EAAS0B,EAAM,CAC3C,IAAIC,EAAQ3B,EAAQ0B,CAAI,EACxB,GAAIC,GAAS,MAAQA,IAAU,OAC7B,OAAOA,CAEX,CACA,SAASjB,IAAmBjB,EAAMG,EAAWC,EAAYE,EAAoBC,EAASQ,EAAc,CAClG,GAAI,GAACA,GAAgB,CAACA,EAAa,QAGnC,KAAIoB,EAAcC,GAAejC,EAAW,OAAO,GAAKI,EAAQ,OAAS,MAAQA,EAAQ,QAAU,SAAW6B,GAAejC,EAAW,YAAY,GAAKiC,GAAejC,EAAW,iBAAiB,GACpM,GAAKgC,EAGL,KAAIE,EAAYlC,EAAU,IAAI,WAAW,EACrCmC,EAAYnC,EAAU,IAAI,WAAW,EACrCoC,EAAanC,EAAW,WAAW,MAAM,EAC7CiC,GAAa,MAAQA,EAAYE,EAAW,CAAC,IAAMA,EAAW,CAAC,EAAIF,GACnEC,GAAa,MAAQA,EAAYC,EAAW,CAAC,IAAMA,EAAW,CAAC,EAAID,GACnE,IAAIE,EAAiBrC,EAAU,IAAI,gBAAgB,EAC/CsC,EAAM,CACR,KAAMN,EAAY,KAClB,WAAYI,EACZ,OAAQJ,EAAY,KACtB,EACIM,EAAI,OAAS,UAAYD,IAAmB,SAAWA,IAAmB,OAC5EC,EAAI,cAAgB,WACpBA,EAAI,KAAO,IAGXA,EAAI,cAAgB,SAEtB,IAAIC,EAAU,IAAIC,GAAcF,CAAG,EACnC,OAAAhD,IAAMiD,CAAO,EAAE,iBAAmBF,EAC3BE,GACT,CAQA,SAASN,GAAejC,EAAW8B,EAAM,CAGvC,IAAIW,EAAQzC,EAAU,IAAI8B,CAAI,EAC9B,OAAOY,EAAQD,CAAK,GAAKA,EAAM,OAAS,CACtC,KAAMX,EACN,MAAOW,CACT,EAAI,IACN,CACA,SAAStB,IAAUnB,EAAWI,EAASY,EAAOC,EAAOsB,EAAS9C,EAAa,CACzE,IAAIkD,EAAevB,EAAO,CAAC,EAAGhB,CAAO,EACrC,GAAImC,EAAS,CAEX,IAAIK,EAAcL,EAAQ,KACtBF,EAAiBO,IAAgB,SAAWtD,IAAMiD,CAAO,EAAE,iBAC3DR,EAAQM,IAAmB,QAAUpB,EAAQoB,IAAmB,KAAO5C,EAAY,aAAauB,EAAM,MAAM,CAAC,EAAIA,EAAM,SAAShB,EAAU,IAAI,iBAAiB,CAAC,EACpK2C,EAAaC,CAAW,EAAIL,EAAQ,iBAAiBR,CAAK,CAC5D,CACA,OAAOY,CACT,CCxIA,IAAIE,GAAU,KAAK,IACfC,GAAU,KAAK,IACfC,IAAuBC,GACvBC,GAAcA,EACdC,IAAoB,CAAC,YAAa,aAAa,EAC/CC,IAAiB,CAAC,YAAa,UAAU,EACzCC,IAAwB,CAAC,aAAc,MAAM,EAC7CC,IAA0B,CAAC,aAAc,QAAQ,EAK9CC,IAAQ,CACb,WAAY,UACZ,MAAO,SAAUC,EAAaC,EAASC,EAAKC,EAAS,CAGnD,IAAIC,EAAeJ,EAAY,OAC3BK,EAAsBC,GAAyBN,EAAaE,CAAG,EAAE,aACjEK,EAAoBC,GAAcR,EAAY,mBAAmB,EAAGK,CAAY,EAChFI,EAAOL,EAAa,MAAQ,CAAC,EAC7BM,EAAiBC,GAAanB,IAAce,EAAW,MAAOE,EAAK,CAAC,CAAC,EAAGJ,EAAa,KAAK,EAC1FO,EAAkBD,GAAanB,IAAce,EAAW,OAAQE,EAAK,CAAC,CAAC,EAAGJ,EAAa,MAAM,EAE7FQ,EAAcV,GAAWA,EAAQ,KACjCW,EAAQ,CAAC,oBAAqB,mBAAmB,EACjDC,EAAoBC,GAAmBb,EAASW,EAAOd,CAAW,EAClEiB,EAAWJ,IAAgB,iBAAmBA,IAAgB,cAAgBV,EAAQ,SAAW,KACjGe,EAAWlB,EAAY,YAAY,EACnCmB,EAAuBC,GAAcF,CAAQ,EACjD,GAAIL,IAAgB,cAAe,CACjC,IAAIQ,EAAWR,IAAgB,oBAAsBS,IAAiBtB,EAAae,EAAYG,EAAUR,EAAgBE,CAAe,EAAIK,EAAW,CAACA,EAAS,MAAOA,EAAS,MAAM,EAAI,CAACP,EAAgBE,CAAe,EACvNW,EAASnB,EAAa,KACtBmB,GAAUA,IAAW,OAASA,IAAW,SAE3CA,EAAS,QAEX,IAAIC,EAAU,CACZ,YAAapB,EAAa,YAC1B,KAAMmB,EACN,UAAWnB,EAAa,SAC1B,EAEAc,EAAS,SAAS,aAAa,EAK/B,IAAIO,EAAmB,CACrB,EAAG,EACH,EAAG,EACH,MAAOJ,EAAS,CAAC,EACjB,OAAQA,EAAS,CAAC,EAClB,KAAMA,EAAS,CAAC,EAAIA,EAAS,CAAC,CAChC,EACAH,EAAS,UAAUO,CAAgB,EACnCC,IAASR,EAAUM,EAAS,GAAO,CAAC,EAEpCC,EAAmBP,EAAS,UAAU,EACtCxB,GAAKyB,EAAe,SAAUQ,EAAMC,EAAO,CACzC,IAAIC,GAAcV,EAAcS,EAAQ,CAAC,GAAKV,GAAU,SAAS,EACjES,EAAK,UAAiBG,EAAO,CAC3B,WAAY,CAACD,EAAYA,CAAU,EACnC,YAAa,EACb,YAAa,CACf,EAAGJ,CAAgB,CAAC,CACtB,CAAC,CACH,CACA,IAAIM,EAAW/B,EAAY,QAAQ,EAAE,KAAK,KAC1C+B,EAAS,UAAUC,IAAsBzB,EAAYU,EAAUF,CAAU,EAAG,EAAI,EAChFf,EAAY,cAAcO,CAAU,EAGpC0B,IAASF,EAET,IAAIG,GAAa,CAAC3B,EAAW,EAAG,CAACA,EAAW,EAAGL,EAAI,SAAS,EAAGA,EAAI,UAAU,CAAC,EAAGiB,EAAeD,EAAU,CAAC,CAC7G,CACF,EAmBA,SAASQ,IAASC,EAAMH,EAASW,EAAcC,EAAO,CACpD,IAAIC,EACAC,EACJ,GAAI,CAAAX,EAAK,UAAU,EAGnB,KAAIY,EAAaZ,EAAK,UAAU,EAChCU,EAAQE,EAAW,MACnBD,EAASC,EAAW,OAEpB,IAAIC,EAAYb,EAAK,SAAS,EAC1Bc,EAAcD,EAAU,IAAI7C,GAAiB,EAC7C+C,EAAeF,EAAU,IAAI5C,GAAc,EAAI,EAC/C+C,EAAmBC,IAAoBJ,CAAS,EAChDK,EAAc,KAAK,IAAIJ,EAAaE,CAAgB,EACpDG,EAAeL,EAAcC,EAC7BK,EAAoBF,EAAcH,EACtCf,EAAK,UAAU,CACb,YAAac,EACb,YAAaI,EACb,iBAAkBF,CACpB,EAAG,EAAI,EACPN,EAAQ/C,GAAQ+C,EAAQ,EAAIS,EAAc,CAAC,EAC3CR,EAAShD,GAAQgD,EAASQ,EAAeC,EAAmB,CAAC,EAC7D,IAAIC,EAAYX,EAAQC,EACpBW,EAAeC,IAAavB,EAAMa,EAAWQ,EAAWxB,EAASW,EAAcC,CAAK,EACxF,GAAKa,EAAa,OAGlB,KAAIE,EAAO,CACT,EAAGL,EACH,EAAGC,EACH,MAAOV,EACP,OAAQC,CACV,EACIc,EAAiB7D,GAAQ8C,EAAOC,CAAM,EACtCe,EAAO,IACPC,EAAM,CAAC,EACXA,EAAI,KAAO,EACX,QAASC,EAAI,EAAGC,EAAMP,EAAa,OAAQM,EAAIC,GAAM,CACnD,IAAIC,EAAQR,EAAaM,CAAC,EAC1BD,EAAI,KAAKG,CAAK,EACdH,EAAI,MAAQG,EAAM,UAAU,EAAE,KAC9B,IAAIC,EAAQC,IAAML,EAAKF,EAAgB5B,EAAQ,WAAW,EAEtDkC,GAASL,GACXE,IACAF,EAAOK,IAIPJ,EAAI,MAAQA,EAAI,IAAI,EAAE,UAAU,EAAE,KAClCM,IAASN,EAAKF,EAAgBD,EAAMT,EAAc,EAAK,EACvDU,EAAiB7D,GAAQ4D,EAAK,MAAOA,EAAK,MAAM,EAChDG,EAAI,OAASA,EAAI,KAAO,EACxBD,EAAO,IAEX,CAIA,GAHIC,EAAI,QACNM,IAASN,EAAKF,EAAgBD,EAAMT,EAAc,EAAI,EAEpD,CAACP,EAAc,CACjB,IAAI0B,EAAqBrB,EAAU,IAAI,oBAAoB,EACvDqB,GAAsB,MAAQb,EAAYa,IAC5C1B,EAAe,GAEnB,CACA,QAASoB,EAAI,EAAGC,EAAMP,EAAa,OAAQM,EAAIC,EAAKD,IAClD7B,IAASuB,EAAaM,CAAC,EAAG/B,EAASW,EAAcC,EAAQ,CAAC,GAE9D,CAIA,SAASc,IAAavB,EAAMa,EAAWQ,EAAWxB,EAASW,EAAcC,EAAO,CAC9E,IAAIa,EAAetB,EAAK,UAAY,CAAC,EACjCmC,EAAUtC,EAAQ,KACtBsC,IAAY,OAASA,IAAY,SAAWA,EAAU,MACtD,IAAIC,EAAgBvC,EAAQ,WAAa,MAAQA,EAAQ,WAAaY,EAEtE,GAAID,GAAgB,CAAC4B,EACnB,OAAOpC,EAAK,aAAe,CAAC,EAG9BsB,EAAsBe,GAAOf,EAAc,SAAUQ,EAAO,CAC1D,MAAO,CAACA,EAAM,UAAU,CAC1B,CAAC,EACDQ,IAAKhB,EAAca,CAAO,EAC1B,IAAII,EAAOC,IAAU3B,EAAWS,EAAca,CAAO,EACrD,GAAII,EAAK,MAAQ,EACf,OAAOvC,EAAK,aAAe,CAAC,EAG9B,GADAuC,EAAK,IAAME,IAAkB5B,EAAWQ,EAAWkB,EAAK,IAAKJ,EAASb,CAAY,EAC9EiB,EAAK,MAAQ,EACf,OAAOvC,EAAK,aAAe,CAAC,EAG9B,QAAS4B,EAAI,EAAGC,EAAMP,EAAa,OAAQM,EAAIC,EAAKD,IAAK,CACvD,IAAIc,EAAOpB,EAAaM,CAAC,EAAE,SAAS,EAAIW,EAAK,IAAMlB,EAEnDC,EAAaM,CAAC,EAAE,UAAU,CACxB,KAAMc,CACR,CAAC,CACH,CACA,OAAIN,IACFd,EAAa,QAAUtB,EAAK,UAAU,CACpC,WAAY,EACd,EAAG,EAAI,EACPsB,EAAa,OAAS,GAExBtB,EAAK,aAAesB,EACpBtB,EAAK,UAAU,CACb,WAAYuC,EAAK,UACnB,EAAG,EAAI,EACAjB,CACT,CAIA,SAASmB,IAAkB5B,EAAWQ,EAAWsB,EAAKR,EAASS,EAAiB,CAE9E,GAAI,CAACT,EACH,OAAOQ,EAMT,QAJIE,EAAahC,EAAU,IAAI,YAAY,EACvCgB,EAAMe,EAAgB,OACtBE,EAAcjB,EAETD,EAAIC,EAAM,EAAGD,GAAK,EAAGA,IAAK,CACjC,IAAImB,EAAQH,EAAgBT,IAAY,MAAQN,EAAMD,EAAI,EAAIA,CAAC,EAAE,SAAS,EACtEmB,EAAQJ,EAAMtB,EAAYwB,IAC5BC,EAAclB,EACde,GAAOI,EAEX,CACA,OAAAZ,IAAY,MAAQS,EAAgB,OAAO,EAAGf,EAAMiB,CAAW,EAAIF,EAAgB,OAAOE,EAAajB,EAAMiB,CAAW,EACjHH,CACT,CAIA,SAASL,IAAKhB,EAAca,EAAS,CACnC,OAAIA,GACFb,EAAa,KAAK,SAAU0B,EAAGC,EAAG,CAChC,IAAIC,EAAOf,IAAY,MAAQa,EAAE,SAAS,EAAIC,EAAE,SAAS,EAAIA,EAAE,SAAS,EAAID,EAAE,SAAS,EACvF,OAAOE,IAAS,EAAIf,IAAY,MAAQa,EAAE,UAAYC,EAAE,UAAYA,EAAE,UAAYD,EAAE,UAAYE,CAClG,CAAC,EAEI5B,CACT,CAIA,SAASkB,IAAU3B,EAAWsC,EAAUhB,EAAS,CAG/C,QADIQ,EAAM,EACD,EAAI,EAAGd,EAAMsB,EAAS,OAAQ,EAAItB,EAAK,IAC9Cc,GAAOQ,EAAS,CAAC,EAAE,SAAS,EAM9B,IAAIC,EAAYvC,EAAU,IAAI,iBAAiB,EAC3CwC,EAEJ,MAAI,CAACF,GAAY,CAACA,EAAS,OACzBE,EAAa,CAAC,IAAK,GAAG,EACbD,IAAc,SAAWjB,GAClCkB,EAAa,CAACF,EAASA,EAAS,OAAS,CAAC,EAAE,SAAS,EAAGA,EAAS,CAAC,EAAE,SAAS,CAAC,EAC9EhB,IAAY,OAASkB,EAAW,QAAQ,IAIxCA,EAAa,CAAC,IAAU,IAAS,EACjCtF,GAAKoF,EAAU,SAAUrB,EAAO,CAC9B,IAAIiB,EAAQjB,EAAM,SAASsB,CAAS,EACpCL,EAAQM,EAAW,CAAC,IAAMA,EAAW,CAAC,EAAIN,GAC1CA,EAAQM,EAAW,CAAC,IAAMA,EAAW,CAAC,EAAIN,EAC5C,CAAC,GAEI,CACL,IAAKJ,EACL,WAAYU,CACd,CACF,CAKA,SAASrB,IAAML,EAAKF,EAAgB6B,EAAO,CAGzC,QAFIC,EAAU,EACVC,EAAU,IACL5B,EAAI,EAAGc,EAAO,OAAQb,EAAMF,EAAI,OAAQC,EAAIC,EAAKD,IACxDc,EAAOf,EAAIC,CAAC,EAAE,UAAU,EAAE,KACtBc,IACFA,EAAOc,IAAYA,EAAUd,GAC7BA,EAAOa,IAAYA,EAAUb,IAGjC,IAAIe,EAAa9B,EAAI,KAAOA,EAAI,KAC5B+B,EAAIjC,EAAiBA,EAAiB6B,EAC1C,OAAOG,EAAa9F,GAAQ+F,EAAIH,EAAUE,EAAYA,GAAcC,EAAIF,EAAQ,EAAI,GACtF,CAIA,SAASvB,IAASN,EAAKF,EAAgBD,EAAMT,EAAc4C,EAAO,CAShE,IAAIC,EAAYnC,IAAmBD,EAAK,MAAQ,EAAI,EAChDqC,EAAY,EAAID,EAChBE,EAAK,CAAC,IAAK,GAAG,EACdC,EAAK,CAAC,QAAS,QAAQ,EACvBC,EAAOxC,EAAKsC,EAAGF,CAAS,CAAC,EACzBK,EAAiBxC,EAAiBE,EAAI,KAAOF,EAAiB,GAC9DkC,GAASM,EAAiBzC,EAAKuC,EAAGF,CAAS,CAAC,KAC9CI,EAAiBzC,EAAKuC,EAAGF,CAAS,CAAC,GAErC,QAASjC,EAAI,EAAGsC,EAASvC,EAAI,OAAQC,EAAIsC,EAAQtC,IAAK,CACpD,IAAI5B,EAAO2B,EAAIC,CAAC,EACZuC,EAAa,CAAC,EACdC,EAAOH,EAAiBjE,EAAK,UAAU,EAAE,KAAOiE,EAAiB,EACjEI,EAAMF,EAAWJ,EAAGF,CAAS,CAAC,EAAIlG,GAAQsG,EAAiB,EAAIlD,EAAc,CAAC,EAE9EuD,EAAS9C,EAAKsC,EAAGF,CAAS,CAAC,EAAIpC,EAAKuC,EAAGH,CAAS,CAAC,EAAII,EACrDO,EAAQ3C,IAAMsC,EAAS,GAAKI,EAASF,EAAOE,EAASF,EACrDI,EAAML,EAAWJ,EAAGH,CAAS,CAAC,EAAIjG,GAAQ4G,EAAQ,EAAIxD,EAAc,CAAC,EACzEoD,EAAWL,EAAGD,CAAS,CAAC,EAAIrC,EAAKsC,EAAGD,CAAS,CAAC,EAAIjG,GAAQmD,EAAcsD,EAAM,CAAC,EAC/EF,EAAWL,EAAGF,CAAS,CAAC,EAAII,EAAOpG,GAAQmD,EAAcyD,EAAM,CAAC,EAChER,GAAQO,EACRvE,EAAK,UAAUmE,EAAY,EAAI,CACjC,CACA3C,EAAKsC,EAAGD,CAAS,CAAC,GAAKI,EACvBzC,EAAKuC,EAAGF,CAAS,CAAC,GAAKI,CACzB,CAEA,SAAStE,IAAiBtB,EAAae,EAAYG,EAAUR,EAAgBE,EAAiB,CAG5F,IAAIwF,GAAYrF,GAAc,CAAC,GAAG,KAC9BsF,EAAc,CAAC3F,EAAgBE,CAAe,EAClD,GAAI,CAACwF,GAAYA,IAAalF,EAC5B,OAAOmF,EAKT,QAHIC,EACAC,EAAW7F,EAAiBE,EAC5ByD,EAAOkC,EAAWvG,EAAY,OAAO,gBAClCsG,EAASF,EAAS,YAAY,CAInC,QAFI9B,EAAM,EACNkC,EAAWF,EAAO,SACb/C,EAAI,EAAGC,EAAMgD,EAAS,OAAQjD,EAAIC,EAAKD,IAC9Ce,GAAOkC,EAASjD,CAAC,EAAE,SAAS,EAE9B,IAAIkD,EAAgBL,EAAS,SAAS,EACtC,GAAIK,IAAkB,EACpB,OAAOJ,EAEThC,GAAQC,EAAMmC,EAEd,IAAIC,EAAcJ,EAAO,SAAS,EAC9B7D,EAAciE,EAAY,IAAI/G,GAAiB,EAC/CkD,EAAc,KAAK,IAAIJ,EAAaG,IAAoB8D,CAAW,CAAC,EACxErC,GAAQ,EAAI5B,EAAcA,GAAe,EAAIA,EAAcI,GAAe,KAAK,IAAIwB,EAAM,EAAG,EAC5FA,EAAOsC,KAAqBtC,EAAOsC,IACnCP,EAAWE,CACb,CACAjC,EAAOkC,IAAalC,EAAOkC,GAC3B,IAAIK,EAAQ,KAAK,IAAIvC,EAAOkC,EAAU,EAAG,EACzC,MAAO,CAAC7F,EAAiBkG,EAAOhG,EAAkBgG,CAAK,CACzD,CAEA,SAAS5E,IAAsBzB,EAAYU,EAAUF,EAAY,CAC/D,GAAIE,EACF,MAAO,CACL,EAAGA,EAAS,EACZ,EAAGA,EAAS,CACd,EAEF,IAAI4F,EAAkB,CACpB,EAAG,EACH,EAAG,CACL,EACA,GAAI,CAAC9F,EACH,OAAO8F,EAKT,IAAIC,EAAa/F,EAAW,KACxBgG,EAASD,EAAW,UAAU,EAClC,GAAI,CAACC,EACH,OAAOF,EAKT,QAFIG,EAAe,CAACD,EAAO,MAAQ,EAAGA,EAAO,OAAS,CAAC,EACnDpF,EAAOmF,EACJnF,GAAM,CACX,IAAImE,EAAanE,EAAK,UAAU,EAChCqF,EAAa,CAAC,GAAKlB,EAAW,EAC9BkB,EAAa,CAAC,GAAKlB,EAAW,EAC9BnE,EAAOA,EAAK,UACd,CACA,MAAO,CACL,EAAGpB,EAAW,MAAQ,EAAIyG,EAAa,CAAC,EACxC,EAAGzG,EAAW,OAAS,EAAIyG,EAAa,CAAC,CAC3C,CACF,CAGA,SAAS/E,IAASN,EAAMsF,EAAU9F,EAAeD,EAAUkB,EAAO,CAChE,IAAI0D,EAAanE,EAAK,UAAU,EAC5BuF,EAAsB/F,EAAciB,CAAK,EACzC+E,EAAkBD,GAAuBA,IAAwBvF,EACrE,GAAI,EAAAuF,GAAuB,CAACC,GAAmB/E,IAAUjB,EAAc,QAAUQ,IAAST,GAG1F,CAAAS,EAAK,UAAU,CAEb,SAAU,GAGV,UAAW,CAACwF,GAAmB,CAACF,EAAS,UAAUnB,CAAU,EAC7D,gBAAiBqB,CACnB,EAAG,EAAI,EAEP,IAAIC,EAAgB,IAAIlF,GAAa+E,EAAS,EAAInB,EAAW,EAAGmB,EAAS,EAAInB,EAAW,EAAGmB,EAAS,MAAOA,EAAS,MAAM,EAC1HvH,GAAKiC,EAAK,cAAgB,CAAC,EAAG,SAAU8B,EAAO,CAC7CxB,IAASwB,EAAO2D,EAAejG,EAAeD,EAAUkB,EAAQ,CAAC,CACnE,CAAC,EACH,CACA,SAASQ,IAAoByE,EAAO,CAClC,OAAOA,EAAM,IAAIxH,GAAqB,EAAIwH,EAAM,IAAIvH,GAAuB,EAAI,CACjF,CC7bO,SAASwH,GAAQC,EAAW,CACjCA,EAAU,oBAAoBC,GAAkB,EAChDD,EAAU,kBAAkBE,GAAW,EACvCF,EAAU,eAAeG,GAAa,EACtCH,EAAU,eAAeI,GAAa,EACtCC,IAAqBL,CAAS,CAChC,CCVe,SAARM,GAAgCC,EAAS,CAC9C,IAAIC,EAAeD,EAAQ,eAAe,CACxC,SAAU,QACZ,CAAC,EACG,CAACC,GAAgB,CAACA,EAAa,QAGnCD,EAAQ,iBAAiB,QAAS,SAAUE,EAAa,CACvD,IAAIC,EAAiBD,EAAY,kBAAkB,EAC/CE,EAAQF,EAAY,SAAS,EAC7BG,EAAOD,EAAM,KACbE,EAAgBH,EAAe,SAASA,EAAe,OAAO,EAClEE,EAAK,WAAW,SAAUE,EAAK,CAC7B,IAAIC,EAAQH,EAAK,aAAaE,CAAG,EAC7BE,EAAWD,EAAM,WAAW,UAAU,EAC1C,GAAIC,GAAY,KAAM,CAChBC,GAASD,CAAQ,IACnBA,EAAWH,EAAcG,CAAQ,GAGnC,QAASE,EAAI,EAAGA,EAAIV,EAAa,OAAQU,IACvC,GAAI,CAACV,EAAaU,CAAC,EAAE,WAAWF,CAAQ,EACtC,MAAO,EAGb,CACA,MAAO,EACT,CAAC,CACH,CAAC,CACH,CC7Be,SAARG,GAAgCC,EAAS,CAC9C,IAAIC,EAAe,CAAC,EACpBD,EAAQ,iBAAiB,QAAS,SAAUE,EAAa,CACvD,IAAIC,EAAiBD,EAAY,kBAAkB,EAC/CE,EAAOF,EAAY,QAAQ,EAC3BG,EAAqB,CAAC,EAC1BF,EAAe,KAAK,SAAUG,EAAK,CACjC,IAAIC,EAAOJ,EAAe,QAAQG,CAAG,EAErCD,EAAmB,MAAQE,CAAI,EAAID,EACnC,IAAIE,EAAYL,EAAe,aAAaG,CAAG,EAC3CG,EAAQD,EAAU,SAAS,WAAW,EAAE,aAAa,EACpDC,EAAM,OAETA,EAAM,KAAOP,EAAY,oBAAoBK,EAAMN,CAAY,GAEjEE,EAAe,cAAcG,EAAK,QAASG,CAAK,EAEhD,QADIC,EAAmB,CAAC,SAAU,aAAc,kBAAkB,EACzDC,EAAI,EAAGA,EAAID,EAAiB,OAAQC,IAAK,CAChD,IAAIC,EAAeJ,EAAU,WAAWE,EAAiBC,CAAC,EAAG,EAAI,EAC7DC,GAAgB,MAClBT,EAAe,cAAcG,EAAKI,EAAiBC,CAAC,EAAGC,CAAY,CAEvE,CACF,CAAC,EAEGT,EAAe,MAAM,GACvBC,EAAK,KAAK,SAAUE,EAAK,CACvB,IAAIO,EAAQT,EAAK,aAAaE,CAAG,EAC7BQ,EAAcD,EAAM,WAAW,UAAU,EAC7C,GAAIC,GAAe,KAAM,CACnBC,GAASD,CAAW,IACtBA,EAAcT,EAAmB,MAAQS,CAAW,GAEtD,IAAIE,EAAgBb,EAAe,cAAcW,EAAa,OAAO,EACjEL,EAAQL,EAAK,uBAAuBE,EAAK,OAAO,EACpDW,EAAOR,EAAOO,CAAa,EAE3B,QADIE,EAAa,CAAC,SAAU,aAAc,kBAAkB,EACnDP,EAAI,EAAGA,EAAIO,EAAW,OAAQP,IACrCP,EAAK,cAAcE,EAAKY,EAAWP,CAAC,EAAGR,EAAe,cAAcW,EAAaI,EAAWP,CAAC,CAAC,CAAC,CAEnG,CACF,CAAC,CAEL,CAAC,CACH,CC7CA,SAASQ,GAAUC,EAAG,CACpB,OAAMA,aAAa,QACjBA,EAAI,CAACA,EAAGA,CAAC,GAEJA,CACT,CACe,SAARC,GAAiCC,EAAS,CAC/CA,EAAQ,iBAAiB,QAAS,SAAUC,EAAa,CACvD,IAAIC,EAAQD,EAAY,SAAS,EAC7BE,EAAWF,EAAY,YAAY,EACnCG,EAAaP,GAAUI,EAAY,IAAI,YAAY,CAAC,EACpDI,EAAaR,GAAUI,EAAY,IAAI,gBAAgB,CAAC,EAG5DE,EAAS,UAAU,aAAcC,GAAcA,EAAW,CAAC,CAAC,EAC5DD,EAAS,UAAU,WAAYC,GAAcA,EAAW,CAAC,CAAC,EAC1DD,EAAS,UAAU,iBAAkBE,GAAcA,EAAW,CAAC,CAAC,EAChEF,EAAS,UAAU,eAAgBE,GAAcA,EAAW,CAAC,CAAC,EAC9DF,EAAS,UAAU,QAASF,EAAY,SAAS,WAAW,EAAE,aAAa,CAAC,EAC5EE,EAAS,KAAK,SAAUG,EAAK,CAC3B,IAAIC,EAAYJ,EAAS,aAAaG,CAAG,EACrCE,EAAON,EAAM,eAAeI,CAAG,EAC/BF,EAAaP,GAAUU,EAAU,WAAW,SAAU,EAAI,CAAC,EAC3DF,EAAaR,GAAUU,EAAU,WAAW,aAAc,EAAI,CAAC,EAE/DE,EAAQF,EAAU,SAAS,WAAW,EAAE,aAAa,EACrDG,EAAcP,EAAS,uBAAuBG,EAAK,OAAO,EAE9D,OADAK,EAAOD,EAAaD,CAAK,EACjBC,EAAY,OAAQ,CAC1B,IAAK,SACH,CACE,IAAIE,EAAYJ,EAAK,MAAM,UAAU,OAAO,EAC5CE,EAAY,OAASE,GAAaA,EAAU,KAC5C,KACF,CACF,IAAK,SACH,CACE,IAAIA,EAAYJ,EAAK,MAAM,UAAU,OAAO,EAC5CE,EAAY,OAASE,GAAaA,EAAU,KAC5C,KACF,CACJ,CACAR,EAAW,CAAC,GAAKI,EAAK,UAAU,aAAcJ,EAAW,CAAC,CAAC,EAC3DA,EAAW,CAAC,GAAKI,EAAK,UAAU,WAAYJ,EAAW,CAAC,CAAC,EACzDC,EAAW,CAAC,GAAKG,EAAK,UAAU,iBAAkBH,EAAW,CAAC,CAAC,EAC/DA,EAAW,CAAC,GAAKG,EAAK,UAAU,eAAgBH,EAAW,CAAC,CAAC,CAC/D,CAAC,CACH,CAAC,CACH,CC/CA,IAAIQ,GAAgB,MAMhBC,GAAyB,SAAUC,EAAa,CAClD,OAAOA,EAAY,IAAI,eAAe,GAAK,IAC7C,EAOIC,IAAkB,SAAUD,EAAaE,EAAc,CACzD,IAAIC,EAAsBJ,GAAuBC,CAAW,EACxDI,EAAS,GACTC,EAAgB,CAAC,EAErB,GAAWC,GAASH,CAAmB,EACrCC,EAASD,UACOI,EAAQJ,CAAmB,EAAG,CAC9CH,EAAY,gBAAkBG,EAC9B,MACF,CAEID,EAAeE,IACjBA,EAASF,GAGX,IAAIM,EAAMJ,EAAS,EAAIA,EAAS,EAAIA,EAAS,EAC7CC,EAAgB,CAAC,EACjB,QAASI,EAAI,EAAGA,EAAID,EAAKC,IACvBJ,EAAc,MAAMI,EAAI,EAAIA,EAAI,EAAIA,GAAK,IAAMA,EAAI,EAAI,GAAK,EAAE,EAEhET,EAAY,gBAAkBK,CAChC,EAQIK,GAAgB,SAAUC,EAAIC,EAAIZ,EAAa,CACjD,IAAIa,EAAS,CAACF,EAAG,GAAIA,EAAG,SAAS,EAAE,KAAK,GAAG,EACvCG,EAAS,CAACF,EAAG,GAAIA,EAAG,SAAS,EAAE,KAAK,GAAG,EAC3C,MAAO,CAACZ,EAAY,IAAKa,EAAQC,CAAM,EAAE,KAAKhB,EAAa,CAC7D,EAMIiB,IAAiB,SAAUC,EAAK,CAClC,IAAIC,EAAOD,EAAI,MAAMlB,EAAa,EAClC,MAAO,CAACmB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAE,KAAKnB,EAAa,CACvD,EAMIoB,IAAiB,SAAUC,EAAMnB,EAAa,CAChD,IAAIgB,EAAMN,GAAcS,EAAK,MAAOA,EAAK,MAAOnB,CAAW,EAC3D,OAAOA,EAAY,UAAUgB,CAAG,CAClC,EAOII,IAA6B,SAAUD,EAAMnB,EAAa,CAC5D,IAAIQ,EAAMa,GAAwBX,GAAcS,EAAK,MAAOA,EAAK,MAAOnB,CAAW,EAAGA,CAAW,EAC7FsB,EAAOD,GAAwBX,GAAcS,EAAK,MAAOA,EAAK,MAAOnB,CAAW,EAAGA,CAAW,EAClG,OAAOQ,EAAMc,CACf,EAKID,GAA0B,SAAUL,EAAKhB,EAAa,CACxD,IAAIuB,EAAUvB,EAAY,UAC1B,OAAOuB,EAAQP,CAAG,EAAIO,EAAQP,CAAG,EAAE,OAAS,CAC9C,EAMO,SAASQ,IAAkBxB,EAAa,CACxCD,GAAuBC,CAAW,IAGvCA,EAAY,gBAAkB,CAAC,EAC/BA,EAAY,UAAY,CAAC,EAEzBC,IAAgBD,CAAW,EAC7B,CAQO,SAASyB,IAA0Bd,EAAIC,EAAIZ,EAAa0B,EAAO,CACpE,GAAK3B,GAAuBC,CAAW,EAGvC,KAAIgB,EAAMN,GAAcC,EAAIC,EAAIZ,CAAW,EACvCuB,EAAUvB,EAAY,UACtB2B,EAAgBJ,EAAQR,IAAeC,CAAG,CAAC,EAE3CO,EAAQP,CAAG,GAAK,CAACW,EACnBJ,EAAQP,CAAG,EAAE,UAAY,GAChBW,GAAiBJ,EAAQP,CAAG,IACrCW,EAAc,UAAY,GAC1BJ,EAAQP,CAAG,EAAE,UAAY,IAE3BO,EAAQP,CAAG,EAAIO,EAAQP,CAAG,GAAK,CAAC,EAChCO,EAAQP,CAAG,EAAE,KAAKU,CAAK,EACzB,CAOO,SAASE,GAAoBT,EAAMnB,EAAa0B,EAAOG,EAAa,CACzE,IAAIC,EAAsB/B,GAAuBC,CAAW,EACxD+B,EAAsBxB,EAAQuB,CAAmB,EACrD,GAAI,CAACA,EACH,OAAO,KAET,IAAIE,EAAYd,IAAeC,EAAMnB,CAAW,EAChD,GAAI,CAACgC,EACH,OAAO,KAGT,QADIC,EAAY,GACPxB,EAAI,EAAGA,EAAIuB,EAAU,OAAQvB,IACpC,GAAIuB,EAAUvB,CAAC,IAAMiB,EAAO,CAC1BO,EAAYxB,EACZ,KACF,CAGF,IAAIyB,EAAWd,IAA2BD,EAAMnB,CAAW,EAC3DC,IAAgBD,EAAakC,CAAQ,EACrCf,EAAK,UAAYA,EAAK,WAAa,CAAC,EAEpC,IAAIgB,EAASzB,GAAcS,EAAK,MAAOA,EAAK,MAAOnB,CAAW,EAC1DK,EAAgBL,EAAY,gBAE5BoC,EAAmBL,GAAmBG,EAAW,EAAf,EAAuB,EAC7D,GAAKF,EAAU,UAqBb,OAAO3B,EAAc+B,EAAmBH,CAAS,EAnBjD,IAAII,EAActB,IAAeoB,CAAM,EACnC3B,EAAMa,GAAwBgB,EAAarC,CAAW,EACtDsC,EAAWjC,EAAc4B,EAAYzB,EAAM4B,CAAgB,EAE/D,OAAIP,EAEEE,EACED,GAAuBA,EAAoB,CAAC,IAAM,GAC5CtB,EAAM4B,GAAoB,EAAIE,EAAW,CAACA,IAEzC9B,EAAM,EAAI,EAAI,GAAK4B,GAAoB,EAAIE,EAAW,CAACA,GAG1D9B,EAAM4B,GAAoB,EAAIE,EAAW,CAACA,EAG7CjC,EAAc4B,EAAYzB,EAAM4B,CAAgB,CAK7D,CCnLO,SAASG,GAAaC,EAAa,CACxC,IAAIC,EAAWD,EAAY,iBAC3B,GAAI,EAAAC,GAAYA,EAAS,OAAS,QAGlC,KAAIC,EAAQF,EAAY,SAAS,EACjCE,EAAM,SAAS,SAAUC,EAAM,CAC7B,IAAIC,EAAQD,EAAK,SAAS,EAC1BA,EAAK,UAAU,CAAC,CAACC,EAAM,IAAI,GAAG,EAAG,CAACA,EAAM,IAAI,GAAG,CAAC,CAAC,CACnD,CAAC,EACDC,GAAiBH,EAAOF,CAAW,EACrC,CACO,SAASK,GAAiBH,EAAOF,EAAa,CACnDE,EAAM,SAAS,SAAUI,EAAMC,EAAO,CACpC,IAAIC,EAAmBC,GAAUH,EAAK,SAAS,EAAE,IAAI,CAAC,YAAa,WAAW,CAAC,EAAG,CAACI,GAAoBJ,EAAMN,EAAaO,EAAO,EAAI,EAAG,CAAC,EACrII,EAAUC,GAAMN,EAAK,MAAM,UAAU,CAAC,EACtCO,EAAUD,GAAMN,EAAK,MAAM,UAAU,CAAC,EACtCQ,EAAS,CAACH,EAAIE,CAAE,EAChB,CAACL,GACHM,EAAO,KAAK,EAAEH,EAAG,CAAC,EAAIE,EAAG,CAAC,GAAK,GAAKF,EAAG,CAAC,EAAIE,EAAG,CAAC,GAAKL,GAAYG,EAAG,CAAC,EAAIE,EAAG,CAAC,GAAK,GAAKA,EAAG,CAAC,EAAIF,EAAG,CAAC,GAAKH,CAAS,CAAC,EAEpHF,EAAK,UAAUQ,CAAM,CACvB,CAAC,CACH,CCxBe,SAARC,GAAmCC,EAASC,EAAK,CACtDD,EAAQ,iBAAiB,QAAS,SAAUE,EAAa,CACvD,IAAIC,EAASD,EAAY,IAAI,QAAQ,EACjCE,EAAWF,EAAY,iBAC3B,GAAIE,GAAYA,EAAS,OAAS,OAAQ,CACxC,IAAIC,EAASH,EAAY,QAAQ,EAC7BI,EAAe,CAAC,EACpBC,EAAKH,EAAS,WAAY,SAAUI,EAAU,CAC5CF,EAAeA,EAAa,OAAOD,EAAO,iBAAiBG,CAAQ,CAAC,CACtE,CAAC,EACD,QAASC,EAAY,EAAGA,EAAYJ,EAAO,MAAM,EAAGI,IAAa,CAG/D,QAFIC,EAAQ,CAAC,EACTC,EAAW,GACNC,EAAI,EAAGA,EAAIN,EAAa,OAAQM,IAAK,CAC5C,IAAIC,EAAMR,EAAO,IAAIC,EAAaM,CAAC,EAAGH,CAAS,EAC1C,MAAMI,CAAG,IACZF,EAAW,IAEbD,EAAM,KAAKG,CAAG,CAChB,CACIF,EACFN,EAAO,cAAcI,EAAWL,EAAS,YAAYM,CAAK,CAAC,EAG3DL,EAAO,cAAcI,EAAW,CAAC,IAAK,GAAG,CAAC,CAE9C,CACAK,GAAiBT,EAAO,MAAOH,CAAW,CAC5C,MAAW,CAACC,GAAUA,IAAW,SAC/BY,GAAab,CAAW,CAE5B,CAAC,CACH,CClCO,SAASc,GAAmBC,EAAa,CAC9C,IAAIC,EAAWD,EAAY,iBAC3B,GAAIC,EAAS,OAAS,OACpB,MAAO,GAET,IAAIC,EAAiBF,EAAY,OAAO,eACpCG,EAAYF,EAAS,OAErBG,EAAWH,EAAS,QAAQ,EAC5BI,GAAaD,EAAW,GAAKF,EAAiB,EAClD,OAAOG,EAAYF,CACrB,CACO,SAASG,GAAcC,EAAM,CAClC,IAAIC,EAAaD,EAAK,UAAU,YAAY,EAC5C,OAAIC,aAAsB,QACxBA,GAAcA,EAAW,CAAC,EAAIA,EAAW,CAAC,GAAK,GAE1C,CAACA,CACV,CCdA,IAAIC,IAAK,KAAK,GACVC,GAAqB,CAAC,EAoBnB,SAASC,GAAeC,EAAaC,EAASC,EAAcC,EAAS,CAC1E,IAAIC,EAAWJ,EAAY,iBAC3B,GAAI,EAAAI,GAAYA,EAAS,OAAS,QAGlC,KAAIC,EAAOD,EAAS,gBAAgB,EAChCE,EAAWN,EAAY,QAAQ,EAC/BO,EAAQD,EAAS,MACjBE,EAAKH,EAAK,MAAQ,EAAIA,EAAK,EAC3BI,EAAKJ,EAAK,OAAS,EAAIA,EAAK,EAC5BK,EAAI,KAAK,IAAIL,EAAK,MAAOA,EAAK,MAAM,EAAI,EACxCM,EAAQL,EAAS,MAAM,EAK3B,GAJAA,EAAS,UAAU,CACjB,GAAIE,EACJ,GAAIC,CACN,CAAC,EACG,EAACE,EAGL,IAAIT,EAAc,CAChB,IAAIU,EAAKR,EAAS,YAAYD,CAAO,EACnCU,EAAQD,EAAG,CAAC,EACZE,EAAQF,EAAG,CAAC,EACVG,EAAI,CAACF,EAAQL,EAAIM,EAAQL,CAAE,EAC1BO,GAAUD,EAAGA,CAAC,EACdE,GAAMF,EAAGA,EAAGL,CAAC,EAClBR,EAAa,UAAU,CAACM,EAAKO,EAAE,CAAC,EAAGN,EAAKM,EAAE,CAAC,CAAC,EAAG,EAAI,EACnD,IAAIG,EAAsBlB,EAAY,IAAI,CAAC,WAAY,aAAa,CAAC,EACrEmB,GAAgBjB,EAAcgB,EAAqBV,EAAIC,CAAE,CAC3D,CACAW,IAAoBnB,CAAO,EAAED,EAAaO,EAAOD,EAAUI,EAAGF,EAAIC,EAAIE,CAAK,EAC3EJ,EAAM,SAAS,SAAUc,EAAMC,EAAO,CACpC,IAAIC,EAAmBC,GAAUH,EAAK,SAAS,EAAE,IAAI,CAAC,YAAa,WAAW,CAAC,EAAGI,GAAoBJ,EAAMrB,EAAasB,CAAK,EAAG,CAAC,EAC9HI,EAAUC,GAAMN,EAAK,MAAM,UAAU,CAAC,EACtCO,EAAUD,GAAMN,EAAK,MAAM,UAAU,CAAC,EACtCQ,EACAC,GAAOJ,EAAG,CAAC,EAAIE,EAAG,CAAC,GAAK,EACxBG,GAAOL,EAAG,CAAC,EAAIE,EAAG,CAAC,GAAK,EACxB,CAACL,IACHA,GAAa,EACbM,EAAM,CAACrB,EAAKe,EAAYO,GAAO,EAAIP,GAAYd,EAAKc,EAAYQ,GAAO,EAAIR,EAAU,GAEvFF,EAAK,UAAU,CAACK,EAAIE,EAAIC,CAAG,CAAC,CAC9B,CAAC,GACH,CACA,IAAIT,IAAsB,CACxB,MAAO,SAAUpB,EAAaO,EAAOD,EAAUI,EAAGF,EAAIC,EAAIE,EAAO,CAC/D,IAAIqB,EAAQ,EACRC,EAAM3B,EAAS,OAAO,OAAO,EAC7B4B,EAAY,KAAK,GAAK,GAAKD,GAAOtB,GACtCJ,EAAM,SAAS,SAAU4B,EAAM,CAC7B,IAAIC,EAAQD,EAAK,SAAS,OAAO,EAC7BE,EAAaH,GAAaD,EAAMG,EAAQ,GAAK,EACjDJ,GAASK,EACTF,EAAK,UAAU,CAACzB,EAAI,KAAK,IAAIsB,CAAK,EAAIxB,EAAIE,EAAI,KAAK,IAAIsB,CAAK,EAAIvB,CAAE,CAAC,EACnEuB,GAASK,CACX,CAAC,CACH,EACA,WAAY,SAAUrC,EAAaO,EAAOD,EAAUI,EAAGF,EAAIC,EAAIE,EAAO,CACpE,IAAI2B,EAAY,EAChBxC,GAAmB,OAASa,EAC5B,IAAI4B,EAAYC,GAAmBxC,CAAW,EAC9CO,EAAM,SAAS,SAAU4B,EAAM,CAC7B,IAAIM,EAAaC,GAAcP,CAAI,EAGnC,MAAMM,CAAU,IAAMA,EAAa,GACnCA,EAAa,IAAMA,EAAa,GAChCA,GAAcF,EACd,IAAII,EAAmB,KAAK,KAAKF,EAAa,EAAI/B,CAAC,EAEnD,MAAMiC,CAAgB,IAAMA,EAAmB9C,IAAK,GACpDC,GAAmBqC,EAAK,SAAS,EAAIQ,EACrCL,GAAaK,EAAmB,CAClC,CAAC,EACD,IAAIC,GAAoB,EAAI/C,IAAKyC,GAAa3B,EAAQ,EAClDqB,EAAQ,EACZzB,EAAM,SAAS,SAAU4B,EAAM,CAC7B,IAAIE,EAAaO,EAAmB9C,GAAmBqC,EAAK,SAAS,EACrEH,GAASK,GAIR,CAACF,EAAK,UAAU,GAAK,CAACA,EAAK,UAAU,EAAE,QAAUA,EAAK,UAAU,CAACzB,EAAI,KAAK,IAAIsB,CAAK,EAAIxB,EAAIE,EAAI,KAAK,IAAIsB,CAAK,EAAIvB,CAAE,CAAC,EACrHuB,GAASK,CACX,CAAC,CACH,CACF,EACO,SAASlB,GAAgBgB,EAAMjB,EAAqBV,EAAIC,EAAI,CACjE,IAAIoC,EAAKV,EAAK,aAAa,EAE3B,GAAKU,EAGL,KAAIC,EAAYX,EAAK,SAAS,EAC1BY,EAAcD,EAAU,IAAI,CAAC,QAAS,QAAQ,CAAC,GAAK,EACpDE,EAAaH,EAAG,cAAc,EAClC,GAAI3B,EAAqB,CACvB,IAAI+B,EAAMd,EAAK,UAAU,EACrBe,EAAM,KAAK,MAAMD,EAAI,CAAC,EAAIxC,EAAIwC,EAAI,CAAC,EAAIzC,CAAE,EACzC0C,EAAM,IACRA,EAAM,KAAK,GAAK,EAAIA,GAEtB,IAAIC,EAASF,EAAI,CAAC,EAAIzC,EAClB2C,IACFD,EAAMA,EAAM,KAAK,IAEnB,IAAIE,EAAeD,EAAS,OAAS,QACrCH,EAAW,cAAc,CACvB,SAAU,CAACE,EACX,SAAUE,EACV,OAAQ,QACV,CAAC,EACD,IAAIC,EAAgBL,EAAW,YAAY,UAAU,EAC9CM,EAAOD,EAAc,aAAeA,EAAc,WAAa,CAAC,GAAI,CACzE,SAAUD,CACZ,CAAC,CACH,MACEJ,EAAW,cAAc,CACvB,SAAUD,GAAe,KAAK,GAAK,GACrC,CAAC,EAEL,CClJe,SAARQ,GAAqCC,EAAS,CACnDA,EAAQ,iBAAiB,QAAS,SAAUC,EAAa,CACnDA,EAAY,IAAI,QAAQ,IAAM,YAChCC,GAAeD,EAAa,YAAY,CAE5C,CAAC,CACH,CCGA,IAAIE,GAAmBA,GAIhB,SAASC,IAAYC,EAASC,EAASC,EAAM,CAmBlD,QAlBIC,EAAQH,EACRI,EAAQH,EACRI,EAAOH,EAAK,KACZI,EAAQD,EAAK,MACbE,EAASF,EAAK,OACdG,EAAS,CAACH,EAAK,EAAIC,EAAQ,EAAGD,EAAK,EAAIE,EAAS,CAAC,EAEjDE,EAAUP,EAAK,SAAW,KAAO,GAAMA,EAAK,QAWvCQ,EAAI,EAAGA,EAAIP,EAAM,OAAQO,IAAK,CACrC,IAAIC,EAAIR,EAAMO,CAAC,EACVC,EAAE,IACLA,EAAE,EAASC,GAAON,GAAS,KAAK,OAAO,EAAI,IAAOE,EAAO,CAAC,EAAGD,GAAU,KAAK,OAAO,EAAI,IAAOC,EAAO,CAAC,CAAC,GAEzGG,EAAE,GAAUE,GAAMF,EAAE,CAAC,EACrBA,EAAE,MAAQ,IACZ,CAIA,IAAIG,EAAkBZ,EAAK,UAAY,KAAO,GAAMA,EAAK,SACrDa,EAAWD,EACXE,EACAC,EACJ,MAAO,CACL,OAAQ,UAAY,CAClBF,EAAWD,EAAkB,EAC/B,EACA,SAAU,SAAUI,EAAK,CACvBf,EAAMe,CAAG,EAAE,MAAQ,EACrB,EACA,WAAY,SAAUA,EAAK,CACzBf,EAAMe,CAAG,EAAE,MAAQ,EACrB,EAIA,WAAY,SAAUC,EAAI,CACxBH,EAAqBG,CACvB,EAIA,UAAW,SAAUA,EAAI,CACvBF,EAAoBE,CACtB,EAOA,KAAM,SAAUA,EAAI,CAClBH,GAAsBA,EAAmBb,EAAOC,CAAK,EAGrD,QAFIgB,EAAM,CAAC,EACPC,EAAOlB,EAAM,OACRO,EAAI,EAAGA,EAAIN,EAAM,OAAQM,IAAK,CACrC,IAAIY,EAAIlB,EAAMM,CAAC,EACf,GAAI,CAAAY,EAAE,kBAGN,KAAIC,EAAKD,EAAE,GACPE,EAAKF,EAAE,GACNG,GAAIL,EAAKI,EAAG,EAAGD,EAAG,CAAC,EACxB,IAAIG,EAASC,GAAIP,CAAG,EAAIE,EAAE,EACtBM,EAAIJ,EAAG,GAAKD,EAAG,EAAIC,EAAG,GACtB,MAAMI,CAAC,IACTA,EAAI,GAEDC,GAAUT,EAAKA,CAAG,EACvB,CAACG,EAAG,OAASzB,GAAYyB,EAAG,EAAGA,EAAG,EAAGH,EAAKQ,EAAIF,EAAIX,CAAQ,EAC1D,CAACS,EAAG,OAAS1B,GAAY0B,EAAG,EAAGA,EAAG,EAAGJ,EAAK,EAAE,EAAIQ,GAAKF,EAAIX,CAAQ,EACnE,CAEA,QAASL,EAAI,EAAGA,EAAIW,EAAMX,IAAK,CAC7B,IAAIC,EAAIR,EAAMO,CAAC,EACVC,EAAE,QACAc,GAAIL,EAAKZ,EAAQG,EAAE,CAAC,EAIzBb,GAAYa,EAAE,EAAGA,EAAE,EAAGS,EAAKX,EAAUM,CAAQ,EAEjD,CAGA,QAASL,EAAI,EAAGA,EAAIW,EAAMX,IAExB,QADIa,EAAKpB,EAAMO,CAAC,EACPoB,EAAIpB,EAAI,EAAGoB,EAAIT,EAAMS,IAAK,CACjC,IAAIN,EAAKrB,EAAM2B,CAAC,EACXL,GAAIL,EAAKI,EAAG,EAAGD,EAAG,CAAC,EACxB,IAAIG,EAASC,GAAIP,CAAG,EAChBM,IAAM,IAEHK,GAAIX,EAAK,KAAK,OAAO,EAAI,GAAK,KAAK,OAAO,EAAI,EAAG,EACtDM,EAAI,GAEN,IAAIM,GAAWT,EAAG,IAAMC,EAAG,KAAOE,EAAIA,EACtC,CAACH,EAAG,OAASzB,GAAYyB,EAAG,GAAIA,EAAG,GAAIH,EAAKY,CAAO,EACnD,CAACR,EAAG,OAAS1B,GAAY0B,EAAG,GAAIA,EAAG,GAAIJ,EAAK,CAACY,CAAO,CACtD,CAGF,QADIC,EAAI,CAAC,EACAvB,EAAI,EAAGA,EAAIW,EAAMX,IAAK,CAC7B,IAAIC,EAAIR,EAAMO,CAAC,EACVC,EAAE,QACAc,GAAIQ,EAAGtB,EAAE,EAAGA,EAAE,EAAE,EACrBb,GAAYa,EAAE,EAAGA,EAAE,EAAGsB,EAAGlB,CAAQ,EAC5BmB,GAAKvB,EAAE,GAAIA,EAAE,CAAC,EAEvB,CACAI,EAAWA,EAAW,KACtB,IAAIoB,EAAWpB,EAAW,IAC1BE,GAAqBA,EAAkBd,EAAOC,EAAO+B,CAAQ,EAC7DhB,GAAMA,EAAGgB,CAAQ,CACnB,CACF,CACF,CCtIe,SAARC,GAAkCC,EAAS,CAChDA,EAAQ,iBAAiB,QAAS,SAAUC,EAAa,CACvD,IAAIC,EAAWD,EAAY,iBAC3B,GAAI,EAAAC,GAAYA,EAAS,OAAS,QAGlC,GAAID,EAAY,IAAI,QAAQ,IAAM,QAAS,CACzC,IAAIE,EAAoBF,EAAY,iBAAmB,CAAC,EACpDG,EAAUH,EAAY,SAAS,EAC/BI,EAAaD,EAAQ,KACrBE,EAAWF,EAAQ,SACnBG,EAAaN,EAAY,SAAS,OAAO,EACzCO,EAAaD,EAAW,IAAI,YAAY,EACxCN,EAAY,gBACdI,EAAW,KAAK,SAAUI,EAAK,CAC7B,IAAIC,EAAKL,EAAW,MAAMI,CAAG,EAC7BJ,EAAW,cAAcI,EAAKN,EAAkBO,CAAE,GAAK,CAAC,IAAK,GAAG,CAAC,CACnE,CAAC,EACQ,CAACF,GAAcA,IAAe,OACvCG,GAAaV,CAAW,EACfO,IAAe,YACxBI,GAAeX,EAAa,OAAO,EAErC,IAAIY,EAAmBR,EAAW,cAAc,OAAO,EACnDS,EAAmBR,EAAS,cAAc,OAAO,EAEjDS,EAAYR,EAAW,IAAI,WAAW,EACtCS,EAAaT,EAAW,IAAI,YAAY,EACxCU,EAAwBC,EAAQH,CAAS,EAAIA,EAAY,CAACA,EAAWA,CAAS,EAC9EI,EAAyBD,EAAQF,CAAU,EAAIA,EAAa,CAACA,EAAYA,CAAU,EAEvFG,EAAkB,CAACA,EAAgB,CAAC,EAAGA,EAAgB,CAAC,CAAC,EACzD,IAAIC,EAAUf,EAAW,SAAS,QAAS,SAAUgB,EAAOZ,EAAK,CAC/D,IAAIa,EAAQjB,EAAW,cAAcI,CAAG,EACpCc,EAAMC,GAAUH,EAAOR,EAAkBI,CAAc,EAC3D,OAAI,MAAMM,CAAG,IACXA,GAAON,EAAe,CAAC,EAAIA,EAAe,CAAC,GAAK,GAE3C,CACLM,EACA,IAAKA,EACL,MAAOlB,EAAW,aAAaI,CAAG,EAAE,IAAI,OAAO,EAC/C,EAAG,CAACa,GAAS,MAAMA,EAAM,CAAC,CAAC,GAAK,MAAMA,EAAM,CAAC,CAAC,EAAI,KAAOA,CAC3D,CACF,CAAC,EACGG,EAAQnB,EAAS,SAAS,QAAS,SAAUe,EAAOZ,EAAK,CAC3D,IAAIiB,EAAOtB,EAAQ,eAAeK,CAAG,EACjCkB,EAAIH,GAAUH,EAAOP,EAAkBK,CAAe,EACtD,MAAMQ,CAAC,IACTA,GAAKR,EAAgB,CAAC,EAAIA,EAAgB,CAAC,GAAK,GAElD,IAAIS,EAAYF,EAAK,SAAS,EAC1BG,EAAmBC,GAAUJ,EAAK,SAAS,EAAE,IAAI,CAAC,YAAa,WAAW,CAAC,EAAG,CAACK,GAAoBL,EAAMzB,EAAaQ,EAAK,EAAI,EAAG,CAAC,EACvI,MAAO,CACL,GAAIW,EAAQM,EAAK,MAAM,SAAS,EAChC,GAAIN,EAAQM,EAAK,MAAM,SAAS,EAChC,EAAGC,EACH,UAAWE,EACX,kBAAmBD,EAAU,IAAI,mBAAmB,CACtD,CACF,CAAC,EAEGI,EAAO9B,EAAS,gBAAgB,EAChC+B,EAAgBC,IAAYd,EAASK,EAAO,CAC9C,KAAMO,EACN,QAASzB,EAAW,IAAI,SAAS,EACjC,SAAUA,EAAW,IAAI,UAAU,CACrC,CAAC,EACD0B,EAAc,WAAW,SAAUE,EAAOV,EAAO,CAC/C,QAASW,EAAI,EAAGC,EAAIF,EAAM,OAAQC,EAAIC,EAAGD,IACnCD,EAAMC,CAAC,EAAE,OAENE,GAAKH,EAAMC,CAAC,EAAE,EAAGhC,EAAQ,eAAegC,CAAC,EAAE,UAAU,CAAC,CAGjE,CAAC,EACDH,EAAc,UAAU,SAAUE,EAAOV,EAAOc,EAAS,CACvD,QAASH,EAAI,EAAGC,EAAIF,EAAM,OAAQC,EAAIC,EAAGD,IAClCD,EAAMC,CAAC,EAAE,OACZhC,EAAQ,eAAegC,CAAC,EAAE,UAAUD,EAAMC,CAAC,EAAE,CAAC,EAEhDjC,EAAkBE,EAAW,MAAM+B,CAAC,CAAC,EAAID,EAAMC,CAAC,EAAE,EAEpD,QAASA,EAAI,EAAGC,EAAIZ,EAAM,OAAQW,EAAIC,EAAGD,IAAK,CAC5C,IAAII,EAAIf,EAAMW,CAAC,EACXV,EAAOtB,EAAQ,eAAegC,CAAC,EAC/BK,EAAKD,EAAE,GAAG,EACVE,EAAKF,EAAE,GAAG,EACVG,EAASjB,EAAK,UAAU,EAC5BiB,EAASA,EAASA,EAAO,MAAM,EAAI,CAAC,EACpCA,EAAO,CAAC,EAAIA,EAAO,CAAC,GAAK,CAAC,EAC1BA,EAAO,CAAC,EAAIA,EAAO,CAAC,GAAK,CAAC,EACrBL,GAAKK,EAAO,CAAC,EAAGF,CAAE,EAClBH,GAAKK,EAAO,CAAC,EAAGD,CAAE,EACnB,CAACF,EAAE,YACLG,EAAO,CAAC,EAAI,EAAEF,EAAG,CAAC,EAAIC,EAAG,CAAC,GAAK,GAAKD,EAAG,CAAC,EAAIC,EAAG,CAAC,GAAKF,EAAE,WAAYC,EAAG,CAAC,EAAIC,EAAG,CAAC,GAAK,GAAKA,EAAG,CAAC,EAAID,EAAG,CAAC,GAAKD,EAAE,SAAS,GAEvHd,EAAK,UAAUiB,CAAM,CACvB,CACF,CAAC,EACD1C,EAAY,YAAcgC,EAC1BhC,EAAY,gBAAkBE,EAE9B8B,EAAc,KAAK,CACrB,MAEEhC,EAAY,YAAc,IAE9B,CAAC,CACH,CC9GA,SAAS2C,IAAYC,EAAaC,EAAKC,EAAQ,CAC7C,IAAIC,EAAYC,GAAyBJ,EAAaC,CAAG,EACrDI,EAASC,EAAON,EAAY,mBAAmB,EAAG,CACpD,OAAQE,CACV,CAAC,EACGK,EAAWC,GAAcH,EAAQF,EAAU,YAAY,EAC3D,OAAOM,GAAoBT,EAAaO,EAAUL,CAAM,CAC1D,CACe,SAARQ,GAAoCC,EAASV,EAAK,CACvD,IAAIW,EAAW,CAAC,EAChB,OAAAD,EAAQ,iBAAiB,QAAS,SAAUX,EAAa,CACvDa,GAAuB,CACrB,YAAab,EACb,aAAc,OACd,iBAAkBU,EAClB,sBAAuB,EACzB,CAAC,EACD,SAASA,GAAqB,CAC5B,IAAII,EAAOd,EAAY,QAAQ,EAC3Be,EAAYD,EAAK,SAAS,SAAUE,EAAK,CAC3C,IAAIC,EAAYH,EAAK,aAAaE,CAAG,EACrC,MAAO,CAAC,CAACC,EAAU,IAAI,GAAG,EAAG,CAACA,EAAU,IAAI,GAAG,CAAC,CAClD,CAAC,EACGC,EAAM,CAAC,EACPC,EAAM,CAAC,EACNC,GAAWL,EAAWG,EAAKC,CAAG,EAE/BA,EAAI,CAAC,EAAID,EAAI,CAAC,IAAM,IACtBC,EAAI,CAAC,GAAK,EACVD,EAAI,CAAC,GAAK,GAERC,EAAI,CAAC,EAAID,EAAI,CAAC,IAAM,IACtBC,EAAI,CAAC,GAAK,EACVD,EAAI,CAAC,GAAK,GAEZ,IAAIhB,GAAUiB,EAAI,CAAC,EAAID,EAAI,CAAC,IAAMC,EAAI,CAAC,EAAID,EAAI,CAAC,GAE5CX,EAAWR,IAAYC,EAAaC,EAAKC,CAAM,EAE/C,MAAMA,CAAM,IACdgB,EAAM,CAACX,EAAS,EAAGA,EAAS,CAAC,EAC7BY,EAAM,CAACZ,EAAS,EAAIA,EAAS,MAAOA,EAAS,EAAIA,EAAS,MAAM,GAElE,IAAIc,EAAUF,EAAI,CAAC,EAAID,EAAI,CAAC,EACxBI,EAAWH,EAAI,CAAC,EAAID,EAAI,CAAC,EACzBK,EAAe,IAAIC,GAAK,KAAM,CAChC,IAAKvB,EACL,QAASU,CACX,CAAC,EACD,OAAAY,EAAa,UAAYvB,EAAY,IAAI,YAAY,EACrDuB,EAAa,gBAAgBL,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGG,EAASC,CAAQ,EAC9DC,EAAa,YAAYhB,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EAEhFgB,EAAa,UAAUvB,EAAY,IAAI,QAAQ,CAAC,EAChDuB,EAAa,QAAQvB,EAAY,IAAI,MAAM,CAAC,EAC5CY,EAAS,KAAKW,CAAY,EACnBA,CACT,CACF,CAAC,EACMX,CACT,CC3DA,IAAIa,IAA4BC,GAAK,UACjCC,GAA2BC,GAAY,UACvCC,KAAiC,UAAY,CAC/C,SAASA,GAAoB,CAE3B,KAAK,GAAK,EACV,KAAK,GAAK,EAEV,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,QAAU,CACjB,CACA,OAAOA,CACT,GAAE,EACEC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAOD,CACT,GAAED,GAAiB,EACnB,SAASI,GAAeC,EAAO,CAC7B,OAAO,MAAM,CAACA,EAAM,IAAI,GAAK,MAAM,CAACA,EAAM,IAAI,CAChD,CACA,IAAIC,KAA0B,SAAUJ,EAAQ,CAC9CC,EAAUG,EAAYJ,CAAM,EAC5B,SAASI,EAAWC,EAAM,CACxB,IAAIC,EAAQN,EAAO,KAAK,KAAMK,CAAI,GAAK,KACvC,OAAAC,EAAM,KAAO,UACNA,CACT,CACA,OAAAF,EAAW,UAAU,gBAAkB,UAAY,CACjD,MAAO,CACL,OAAQG,EAAO,MAAM,UACrB,KAAM,IACR,CACF,EACAH,EAAW,UAAU,gBAAkB,UAAY,CACjD,OAAO,IAAIN,GACb,EACAM,EAAW,UAAU,UAAY,SAAUI,EAAKL,EAAO,CACjDD,GAAeC,CAAK,EACtBT,IAAkB,UAAU,KAAK,KAAMc,EAAKL,CAAK,EAEjDP,GAAiB,UAAU,KAAK,KAAMY,EAAKL,CAAK,CAEpD,EACAC,EAAW,UAAU,QAAU,SAAUK,EAAG,CAC1C,OAAIP,GAAe,KAAK,KAAK,EACpBR,IAAkB,QAAQ,KAAK,KAAMe,CAAC,EAEtCb,GAAiB,QAAQ,KAAK,KAAMa,CAAC,CAEhD,EACAL,EAAW,UAAU,UAAY,SAAUK,EAAG,CAC5C,IAAIN,EAAQ,KAAK,MACbO,EAAIR,GAAeC,CAAK,EAAI,CAACA,EAAM,GAAKA,EAAM,GAAIA,EAAM,GAAKA,EAAM,EAAE,EAAIP,GAAiB,UAAU,KAAK,KAAMa,CAAC,EACpH,OAAYE,GAAUD,EAAGA,CAAC,CAC5B,EACON,CACT,GAAUQ,EAAI,EACPC,GAAQT,IC1Df,IAAIU,GAAoB,CAAC,aAAc,UAAU,EACjD,SAASC,IAAkBC,EAAgB,CACzC,MAAO,IAAMA,EAAiB,MAChC,CACA,SAASC,IAAoBC,EAAMC,EAAUC,EAAK,CAChD,IAAIC,EAAaF,EAAS,cAAcC,EAAKF,CAAI,EACjD,GAAI,CAACG,GAAcA,IAAe,OAChC,OAAOA,EAET,IAAIC,EAAaH,EAAS,cAAcC,EAAKF,EAAO,MAAM,EACtDK,EAAeJ,EAAS,cAAcC,EAAKF,EAAO,QAAQ,EAC1DM,EAAeL,EAAS,cAAcC,EAAKF,EAAO,QAAQ,EAC1DO,EAAmBN,EAAS,cAAcC,EAAKF,EAAO,YAAY,EAClEQ,EAA2BC,GAAoBL,CAAU,EACzDM,EAA6BC,GAAsBL,GAAgB,EAAGE,CAAa,EACvF,OAAOL,EAAaK,EAAgBE,GAAmBL,GAAgB,KAAOE,GAAoB,GACpG,CAIA,SAASK,IAAaZ,EAAMC,EAAUC,EAAK,CACzC,IAAIC,EAAaF,EAAS,cAAcC,EAAKF,CAAI,EACjD,GAAI,GAACG,GAAcA,IAAe,QAGlC,KAAIC,EAAaH,EAAS,cAAcC,EAAKF,EAAO,MAAM,EACtDK,EAAeJ,EAAS,cAAcC,EAAKF,EAAO,QAAQ,EAC1DM,EAAeL,EAAS,cAAcC,EAAKF,EAAO,QAAQ,EAC1DO,EAAmBN,EAAS,cAAcC,EAAKF,EAAO,YAAY,EAClEQ,EAA2BC,GAAoBL,CAAU,EACzDM,EAA6BC,GAAsBL,GAAgB,EAAGE,CAAa,EACnFK,EAAwBD,GAAaT,EAAY,CAACK,EAAc,CAAC,EAAI,EAAIE,EAAgB,CAAC,EAAG,CAACF,EAAc,CAAC,EAAI,EAAIE,EAAgB,CAAC,EAAGF,EAAc,CAAC,EAAGA,EAAc,CAAC,EAAG,KAAMD,CAAgB,EACvM,OAAAM,EAAW,oBAAsBR,GAAgB,MAAQ,MAAMA,CAAY,EAAI,OAAS,CAACA,EAAe,KAAK,GAAK,KAAO,EACzHQ,EAAW,KAAOb,EACXa,EACT,CACA,SAASC,IAAWC,EAAQ,CAC1B,IAAIC,EAAO,IAAIC,GAAW,CACxB,KAAM,OACN,iBAAkB,EACpB,CAAC,EACD,OAAAC,GAAcF,EAAK,MAAOD,CAAM,EACzBC,CACT,CACA,SAASE,GAAcC,EAAaJ,EAAQ,CAC1CI,EAAY,GAAKJ,EAAO,CAAC,EAAE,CAAC,EAC5BI,EAAY,GAAKJ,EAAO,CAAC,EAAE,CAAC,EAC5BI,EAAY,GAAKJ,EAAO,CAAC,EAAE,CAAC,EAC5BI,EAAY,GAAKJ,EAAO,CAAC,EAAE,CAAC,EAC5BI,EAAY,QAAU,EACtB,IAAIC,EAAML,EAAO,CAAC,EACdK,GACFD,EAAY,KAAOC,EAAI,CAAC,EACxBD,EAAY,KAAOC,EAAI,CAAC,IAExBD,EAAY,KAAO,IACnBA,EAAY,KAAO,IAEvB,CACA,IAAIE,KAAoB,SAAUC,EAAQ,CACxCC,EAAUF,EAAMC,CAAM,EACtB,SAASD,EAAKpB,EAAUC,EAAKsB,EAAa,CACxC,IAAIC,EAAQH,EAAO,KAAK,IAAI,GAAK,KACjC,OAAAG,EAAM,YAAYxB,EAAUC,EAAKsB,CAAW,EACrCC,CACT,CACA,OAAAJ,EAAK,UAAU,YAAc,SAAUpB,EAAUC,EAAKsB,EAAa,CACjE,IAAIE,EAAczB,EAAS,UACvB0B,EAAa1B,EAAS,cAAcC,CAAG,EACvC0B,EAAK3B,EAAS,cAAcC,EAAK,IAAI,EACrCc,EAAOF,IAAWa,CAAU,EAChCX,EAAK,MAAM,QAAU,EACba,GAAUb,EAAM,CACtB,GAAIc,GAAUF,EAAI,CAAC,EACnB,MAAO,CACL,QAAS,CACX,CACF,EAAGF,EAAaxB,CAAG,EACnB,KAAK,IAAIc,CAAI,EACbe,EAAKnC,GAAmB,SAAUE,EAAgB,CAChD,IAAIkC,EAASpB,IAAad,EAAgBG,EAAUC,CAAG,EAIvD,KAAK,IAAI8B,CAAM,EACf,KAAKnC,IAAkBC,CAAc,CAAC,EAAIC,IAAoBD,EAAgBG,EAAUC,CAAG,CAC7F,EAAG,IAAI,EACP,KAAK,iBAAiBD,EAAUC,EAAKsB,CAAW,CAClD,EAEAH,EAAK,UAAU,WAAa,SAAUpB,EAAUC,EAAKsB,EAAa,CAChE,IAAIE,EAAczB,EAAS,UACvBe,EAAO,KAAK,YAAY,MAAM,EAC9BW,EAAa1B,EAAS,cAAcC,CAAG,EACvC+B,EAAS,CACX,MAAO,CAAC,CACV,EACAf,GAAce,EAAO,MAAON,CAAU,EAC9BO,GAAYlB,EAAMiB,EAAQP,EAAaxB,CAAG,EAClD6B,EAAKnC,GAAmB,SAAUE,EAAgB,CAChD,IAAIK,EAAaJ,IAAoBD,EAAgBG,EAAUC,CAAG,EAC9DiC,EAAMtC,IAAkBC,CAAc,EAE1C,GAAI,KAAKqC,CAAG,IAAMhC,EAAY,CAC5B,KAAK,OAAO,KAAK,YAAYL,CAAc,CAAC,EAC5C,IAAIkC,EAASpB,IAAad,EAAgBG,EAAUC,CAAG,EACvD,KAAK,IAAI8B,CAAM,CACjB,CACA,KAAKG,CAAG,EAAIhC,CACd,EAAG,IAAI,EACP,KAAK,iBAAiBF,EAAUC,EAAKsB,CAAW,CAClD,EAEAH,EAAK,UAAU,YAAc,UAAY,CACvC,OAAO,KAAK,QAAQ,CAAC,CACvB,EACAA,EAAK,UAAU,iBAAmB,SAAUpB,EAAUC,EAAKsB,EAAa,CACtE,IAAIE,EAAczB,EAAS,UACvBe,EAAO,KAAK,YAAY,MAAM,EAC9BoB,EAAoBZ,GAAeA,EAAY,kBAC/Ca,EAAgBb,GAAeA,EAAY,cAC3Cc,EAAkBd,GAAeA,EAAY,gBAC7Ce,EAAoBf,GAAeA,EAAY,kBAC/CgB,EAAmBhB,GAAeA,EAAY,iBAC9CiB,EAAQjB,GAAeA,EAAY,MACnCkB,EAAYlB,GAAeA,EAAY,UAE3C,GAAI,CAACA,GAAevB,EAAS,cAAe,CAC1C,IAAI0C,EAAY1C,EAAS,aAAaC,CAAG,EACrC0C,EAAgBD,EAAU,SAAS,UAAU,EACjDP,EAAoBQ,EAAc,SAAS,WAAW,EAAE,aAAa,EACrEP,EAAgBM,EAAU,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,aAAa,EACvEL,EAAkBK,EAAU,SAAS,CAAC,SAAU,WAAW,CAAC,EAAE,aAAa,EAC3EH,EAAmBI,EAAc,IAAI,UAAU,EAC/CH,EAAQG,EAAc,IAAI,OAAO,EACjCF,EAAYE,EAAc,IAAI,WAAW,EACzCL,EAAoBM,GAAqBF,CAAS,CACpD,CACA,IAAIG,EAAY7C,EAAS,cAAcC,EAAK,OAAO,EAC/C6C,EAAcD,EAAU,OAC5B9B,EAAK,SAAS8B,CAAS,EACvB9B,EAAK,MAAM,KAAO,KAClBA,EAAK,MAAM,cAAgB,GAC3BA,EAAK,YAAY,UAAU,EAAE,MAAQoB,EACrCpB,EAAK,YAAY,MAAM,EAAE,MAAQqB,EACjCrB,EAAK,YAAY,QAAQ,EAAE,MAAQsB,EAEnCP,EAAKnC,GAAmB,SAAUE,EAAgB,CAChD,IAAIkC,EAAS,KAAK,YAAYlC,CAAc,EAC5C,GAAIkC,EAAQ,CAEVA,EAAO,SAASe,CAAW,EAC3Bf,EAAO,MAAM,QAAUc,EAAU,QACjC,QAASE,EAAI,EAAGA,EAAIC,GAAe,OAAQD,IAAK,CAC9C,IAAIE,EAAYD,GAAeD,CAAC,EAC5BG,EAAYnC,EAAK,SAASkC,CAAS,EACvC,GAAIC,EAAW,CACb,IAAIC,EAAiBD,EAAU,OAAS,CAAC,EACrCE,EAAQrB,EAAO,YAAYkB,CAAS,EACpCI,EAAaD,EAAM,QAAUA,EAAM,MAAQ,CAAC,GAC5CD,EAAe,QAAU,OAC3BE,EAAWtB,EAAO,eAAiB,SAAW,MAAM,EAAIoB,EAAe,QAErEA,EAAe,SAAW,OAC5BE,EAAW,QAAUF,EAAe,QAExC,CACF,CACApB,EAAO,WAAW,CACpB,CACF,EAAG,IAAI,EACP,IAAIuB,EAAS7B,EAAY,YAAYxB,CAAG,EACxCsD,GAAc,KAAMjB,EAAmB,CACrC,eAAgBrC,EAChB,aAAc,CACZ,kBAAmB,SAAUuD,EAAWP,EAAW,CACjD,OAAOxB,EAAY,kBAAkB+B,EAAWP,EAAWjD,EAAS,QAAQ,CAC9E,CACF,EACA,aAAc8C,GAAeW,EAAO,MAAM,UAC1C,eAAgBZ,EAAU,QAC1B,aAAcS,GAAU,KAAOtD,EAAS,QAAQC,CAAG,EAAI,SAASqD,CAAM,EAAII,GAAMJ,CAAM,EAAIA,GAAU,EACtG,CAAC,EACD,IAAIK,EAAQ,KAAK,eAAe,EAGhC,GAAIA,EAAO,CACT,IAAIC,EAAmBtB,EAAkB,OACzCqB,EAAM,QAAUA,EAAM,MAAM,MAC5BA,EAAM,gBAAkBA,EAAM,MAAM,cAEpCA,EAAM,WAAaC,EAAiB,IAAI,UAAU,GAAK,SACvD,IAAIC,EAAWD,EAAiB,IAAI,UAAU,EACzCE,EAAQD,CAAQ,IACnBA,EAAW,CAACA,EAAUA,CAAQ,GAEhCF,EAAM,gBAAkBE,CAC1B,CACA,KAAK,cAAc,CACjB,SAAU,KACV,MAAO,GACP,OAAQ,EACV,CAAC,EACDE,GAAoB,KAAMvB,EAAOC,EAAWF,CAAgB,CAC9D,EACAnB,EAAK,UAAU,UAAY,UAAY,CACrC4C,GAAc,IAAI,CACpB,EACA5C,EAAK,UAAU,SAAW,UAAY,CACpC6C,GAAc,IAAI,CACpB,EACA7C,EAAK,UAAU,aAAe,SAAUpB,EAAUC,EAAK,CACrD,KAAK,cAAcD,EAAS,cAAcC,CAAG,CAAC,CAChD,EACAmB,EAAK,UAAU,cAAgB,SAAUN,EAAQ,CAC/C,IAAIoD,EAAW,KAAK,YAAY,MAAM,EACtCjD,GAAciD,EAAS,MAAOpD,CAAM,EACpCoD,EAAS,MAAM,CACjB,EACA9C,EAAK,UAAU,aAAe,UAAY,CACxC,IAAI+C,EAAY,KACZC,EAAaD,EAAU,YAAY,YAAY,EAC/CE,EAAWF,EAAU,YAAY,UAAU,EAC3CR,EAAQQ,EAAU,eAAe,EAErC,GAAI,CAACC,GAAc,CAACC,IAAa,CAACV,GAASA,EAAM,QAC/C,OAIF,QAFIW,EAAW,EACXC,EAAa,KAAK,OACfA,GACDA,EAAW,SACbD,GAAYC,EAAW,QAEzBA,EAAaA,EAAW,OAE1B,IAAIxD,EAAOoD,EAAU,YAAY,MAAM,EAGvC,GAAI,CAAC,KAAK,SAAW,CAACpD,EAAK,QACzB,OAEF,IAAIyD,EAAUzD,EAAK,MAAM,QACrB0D,EAAU1D,EAAK,QAAQ,CAAC,EACxB2D,EAAQ3D,EAAK,QAAQyD,CAAO,EAC5B,EAAWG,GAAI,CAAC,EAAGD,EAAOD,CAAO,EAC9BG,GAAU,EAAG,CAAC,EACrB,SAASC,EAAkB9C,EAAQyC,EAAS,CAK1C,IAAIM,EAAoB/C,EAAO,oBAC/B,GAAI+C,GAAqB,KAAM,CAC7B,IAAIC,EAAUhE,EAAK,UAAUyD,CAAO,EACpCzC,EAAO,KAAK,YAAayC,IAAY,EAAI,GAAK,GAAK,KAAK,GAAK,EAAI,KAAK,MAAMO,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,CAAC,CACrG,MACEhD,EAAO,KAAK,WAAY+C,CAAiB,CAE7C,CAaA,GAZIV,IACFA,EAAW,YAAYK,CAAO,EAC9BI,EAAkBT,EAAY,CAAC,EAC/BA,EAAW,OAASA,EAAW,OAASE,EAAWE,EACnDJ,EAAW,WAAW,GAEpBC,IACFA,EAAS,YAAYK,CAAK,EAC1BG,EAAkBR,EAAU,CAAC,EAC7BA,EAAS,OAASA,EAAS,OAASC,EAAWE,EAC/CH,EAAS,WAAW,GAElBV,GAAS,CAACA,EAAM,OAAQ,CAC1BA,EAAM,EAAIA,EAAM,EAAI,EACpBA,EAAM,QAAUA,EAAM,QAAU,EAChC,IAAIqB,EAAY,OACZC,EAAoB,OACpBpB,EAAWF,EAAM,gBACjBuB,EAAYrB,EAAS,CAAC,EAAIS,EAC1Ba,EAAYtB,EAAS,CAAC,EAAIS,EAC1Bc,EAAcZ,EAAU,EACxBO,EAAUhE,EAAK,UAAUqE,CAAW,EACpCC,EAAI,CAACN,EAAQ,CAAC,EAAG,CAACA,EAAQ,CAAC,CAAC,EAC5BO,EAAKvE,EAAK,QAAQqE,CAAW,EAC7BC,EAAE,CAAC,EAAI,IACTA,EAAE,CAAC,EAAI,CAACA,EAAE,CAAC,EACXA,EAAE,CAAC,EAAI,CAACA,EAAE,CAAC,GAEb,IAAIE,EAAMR,EAAQ,CAAC,EAAI,EAAI,GAAK,EAChC,GAAIpB,EAAM,aAAe,SAAWA,EAAM,aAAe,MAAO,CAC9D,IAAI6B,EAAW,CAAC,KAAK,MAAMT,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC7CL,EAAM,CAAC,EAAID,EAAQ,CAAC,IACtBe,EAAW,KAAK,GAAKA,GAEvB7B,EAAM,SAAW6B,CACnB,CACA,IAAIC,EAAK,OACT,OAAQ9B,EAAM,WAAY,CACxB,IAAK,iBACL,IAAK,kBACL,IAAK,eACL,IAAK,SACH8B,EAAK,CAACN,EACNF,EAAoB,SACpB,MACF,IAAK,oBACL,IAAK,qBACL,IAAK,kBACHQ,EAAKN,EACLF,EAAoB,MACpB,MACF,QACEQ,EAAK,EACLR,EAAoB,QACxB,CACA,OAAQtB,EAAM,WAAY,CACxB,IAAK,MACHA,EAAM,EAAI,EAAE,CAAC,EAAIuB,EAAYR,EAAM,CAAC,EACpCf,EAAM,EAAI,EAAE,CAAC,EAAIwB,EAAYT,EAAM,CAAC,EACpCM,EAAY,EAAE,CAAC,EAAI,GAAM,OAAS,EAAE,CAAC,EAAI,IAAO,QAAU,SAC1DC,EAAoB,EAAE,CAAC,EAAI,GAAM,MAAQ,EAAE,CAAC,EAAI,IAAO,SAAW,SAClE,MACF,IAAK,QACHtB,EAAM,EAAI,CAAC,EAAE,CAAC,EAAIuB,EAAYT,EAAQ,CAAC,EACvCd,EAAM,EAAI,CAAC,EAAE,CAAC,EAAIwB,EAAYV,EAAQ,CAAC,EACvCO,EAAY,EAAE,CAAC,EAAI,GAAM,QAAU,EAAE,CAAC,EAAI,IAAO,OAAS,SAC1DC,EAAoB,EAAE,CAAC,EAAI,GAAM,SAAW,EAAE,CAAC,EAAI,IAAO,MAAQ,SAClE,MACF,IAAK,iBACL,IAAK,cACL,IAAK,oBACHtB,EAAM,EAAIuB,EAAYK,EAAMd,EAAQ,CAAC,EACrCd,EAAM,EAAIc,EAAQ,CAAC,EAAIgB,EACvBT,EAAYD,EAAQ,CAAC,EAAI,EAAI,QAAU,OACvCpB,EAAM,QAAU,CAACuB,EAAYK,EAC7B5B,EAAM,QAAU,CAAC8B,EACjB,MACF,IAAK,kBACL,IAAK,eACL,IAAK,qBACL,IAAK,SACH9B,EAAM,EAAI2B,EAAG,CAAC,EACd3B,EAAM,EAAI2B,EAAG,CAAC,EAAIG,EAClBT,EAAY,SACZrB,EAAM,QAAU,CAAC8B,EACjB,MACF,IAAK,eACL,IAAK,YACL,IAAK,kBACH9B,EAAM,EAAI,CAACuB,EAAYK,EAAMb,EAAM,CAAC,EACpCf,EAAM,EAAIe,EAAM,CAAC,EAAIe,EACrBT,EAAYD,EAAQ,CAAC,GAAK,EAAI,QAAU,OACxCpB,EAAM,QAAUuB,EAAYK,EAC5B5B,EAAM,QAAU,CAAC8B,EACjB,KACJ,CACA9B,EAAM,OAASA,EAAM,OAASW,EAC9BX,EAAM,SAAS,CAEb,cAAeA,EAAM,iBAAmBsB,EACxC,MAAOtB,EAAM,SAAWqB,CAC1B,CAAC,CACH,CACF,EACO5D,CACT,GAAUsE,EAAK,EACRC,GAAQvE,ICrXf,IAAIwE,KAAwB,UAAY,CACtC,SAASA,EAASC,EAAU,CAC1B,KAAK,MAAQ,IAAYC,GACzB,KAAK,UAAYD,GAAYE,EAC/B,CACA,OAAAH,EAAS,UAAU,WAAa,SAAUI,EAAU,CAClD,IAAIC,EAAQ,KAEZ,KAAK,gBAAkB,KACvB,IAAIC,EAAW,KACXC,EAAQD,EAAS,MACjBE,EAAcF,EAAS,UAC3BA,EAAS,UAAYF,EAGhBI,GACHD,EAAM,UAAU,EAElB,IAAIE,EAAcC,IAAgBN,CAAQ,EAC1CA,EAAS,KAAKI,CAAW,EAAE,IAAI,SAAUG,EAAK,CAC5CN,EAAM,OAAOD,EAAUO,EAAKF,CAAW,CACzC,CAAC,EAAE,OAAO,SAAUG,EAAQC,EAAQ,CAClCR,EAAM,UAAUG,EAAaJ,EAAUS,EAAQD,EAAQH,CAAW,CACpE,CAAC,EAAE,OAAO,SAAUE,EAAK,CACvBJ,EAAM,OAAOC,EAAY,iBAAiBG,CAAG,CAAC,CAChD,CAAC,EAAE,QAAQ,CACb,EAEAX,EAAS,UAAU,aAAe,UAAY,CAC5C,IAAII,EAAW,KAAK,UAEfA,GAGLA,EAAS,kBAAkB,SAAUU,EAAIH,EAAK,CAC5CG,EAAG,aAAaV,EAAUO,CAAG,CAC/B,EAAG,IAAI,CACT,EAEAX,EAAS,UAAU,yBAA2B,SAAUI,EAAU,CAChE,KAAK,aAAeM,IAAgBN,CAAQ,EAC5C,KAAK,UAAY,KACjB,KAAK,MAAM,UAAU,CACvB,EAEAJ,EAAS,UAAU,kBAAoB,SAAUe,EAAYX,EAAU,CACrE,KAAK,gBAAkB,CAAC,EACxB,SAASY,EAA0BF,EAAI,CACjC,CAACA,EAAG,SAAW,CAACG,IAAeH,CAAE,IACnCA,EAAG,YAAc,GACjBA,EAAG,YAAY,UAAU,EAAE,WAAa,GAE5C,CACA,QAASH,EAAMI,EAAW,MAAOJ,EAAMI,EAAW,IAAKJ,IAAO,CAC5D,IAAIO,EAAad,EAAS,cAAcO,CAAG,EAC3C,GAAIQ,GAAcD,CAAU,EAAG,CAC7B,IAAIJ,EAAK,IAAI,KAAK,UAAUV,EAAUO,EAAK,KAAK,YAAY,EAC5DG,EAAG,SAASE,CAAyB,EACrC,KAAK,MAAM,IAAIF,CAAE,EACjBV,EAAS,iBAAiBO,EAAKG,CAAE,EACjC,KAAK,gBAAgB,KAAKA,CAAE,CAC9B,CACF,CACF,EAEAd,EAAS,UAAU,OAAS,UAAY,CACtC,KAAK,MAAM,UAAU,CACvB,EAEAA,EAAS,UAAU,aAAe,SAAUoB,EAAI,CACtCC,GAAiB,KAAK,iBAAmB,KAAK,MAAOD,CAAE,CACjE,EACApB,EAAS,UAAU,OAAS,SAAUI,EAAUO,EAAKF,EAAa,CAChE,IAAIS,EAAad,EAAS,cAAcO,CAAG,EAC3C,GAAKQ,GAAcD,CAAU,EAG7B,KAAIJ,EAAK,IAAI,KAAK,UAAUV,EAAUO,EAAKF,CAAW,EACtDL,EAAS,iBAAiBO,EAAKG,CAAE,EACjC,KAAK,MAAM,IAAIA,CAAE,EACnB,EACAd,EAAS,UAAU,UAAY,SAAUQ,EAAac,EAAaT,EAAQD,EAAQH,EAAa,CAC9F,IAAIc,EAASf,EAAY,iBAAiBK,CAAM,EAChD,GAAI,CAACM,GAAcG,EAAY,cAAcV,CAAM,CAAC,EAAG,CACrD,KAAK,MAAM,OAAOW,CAAM,EACxB,MACF,CACKA,EAGHA,EAAO,WAAWD,EAAaV,EAAQH,CAAW,EAFlDc,EAAS,IAAI,KAAK,UAAUD,EAAaV,EAAQH,CAAW,EAI9Da,EAAY,iBAAiBV,EAAQW,CAAM,EAC3C,KAAK,MAAM,IAAIA,CAAM,CACvB,EACOvB,CACT,GAAE,EACF,SAASiB,IAAeH,EAAI,CAC1B,OAAOA,EAAG,WAAaA,EAAG,UAAU,OAAS,CAC/C,CACA,SAASJ,IAAgBN,EAAU,CACjC,IAAIoB,EAAYpB,EAAS,UACrBqB,EAAgBD,EAAU,SAAS,UAAU,EACjD,MAAO,CACL,UAAWA,EAAU,SAAS,WAAW,EAAE,aAAa,EACxD,kBAAmBC,EAAc,SAAS,CAAC,WAAW,CAAC,EAAE,aAAa,EACtE,cAAeD,EAAU,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,aAAa,EACtE,gBAAiBA,EAAU,SAAS,CAAC,SAAU,WAAW,CAAC,EAAE,aAAa,EAC1E,iBAAkBC,EAAc,IAAI,UAAU,EAC9C,UAAWA,EAAc,IAAI,WAAW,EACxC,MAAOA,EAAc,IAAI,OAAO,EAChC,kBAAmBC,GAAqBF,CAAS,CACnD,CACF,CACA,SAASG,IAAWC,EAAI,CACtB,OAAO,MAAMA,EAAG,CAAC,CAAC,GAAK,MAAMA,EAAG,CAAC,CAAC,CACpC,CACA,SAAST,GAAcU,EAAK,CAC1B,OAAOA,GAAO,CAACF,IAAWE,EAAI,CAAC,CAAC,GAAK,CAACF,IAAWE,EAAI,CAAC,CAAC,CACzD,CACA,IAAOC,GAAQ9B,ICxHf,IAAI+B,GAAK,CAAC,EACNC,GAAK,CAAC,EACNC,GAAK,CAAC,EACNC,GAAwBA,GACxBC,GAAoBC,GACpBC,IAAU,KAAK,IACnB,SAASC,IAAqBC,EAAaC,EAAQC,EAAQ,CAQzD,QAPIC,EAAKH,EAAY,CAAC,EAClBI,EAAKJ,EAAY,CAAC,EAClBK,EAAKL,EAAY,CAAC,EAClBM,EAAI,IACJC,EACAC,EAAeN,EAASA,EACxBO,EAAW,GACNC,EAAK,GAAKA,GAAM,GAAKA,GAAM,GAAK,CACvClB,GAAG,CAAC,EAAIG,GAAYQ,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGK,CAAE,EAC3ClB,GAAG,CAAC,EAAIG,GAAYQ,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGK,CAAE,EAC3C,IAAIC,EAAOb,IAAQF,GAAaJ,GAAIS,CAAM,EAAIO,CAAY,EACtDG,EAAOL,IACTA,EAAIK,EACJJ,EAAIG,EAER,CAGA,QAASE,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAE3B,IAAIC,EAAON,EAAIE,EAGfhB,GAAG,CAAC,EAAIE,GAAYQ,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGE,CAAC,EAC1Cd,GAAG,CAAC,EAAIE,GAAYQ,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGE,CAAC,EAC1Cb,GAAG,CAAC,EAAIC,GAAYQ,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGQ,CAAI,EAC7CnB,GAAG,CAAC,EAAIC,GAAYQ,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGQ,CAAI,EAC7C,IAAIF,EAAOf,GAAaH,GAAIQ,CAAM,EAAIO,EACtC,GAAIV,IAAQa,CAAI,EAAI,IAClB,MAGF,IAAIG,EAAWlB,GAAaF,GAAIO,CAAM,EAAIO,EAC1CC,GAAY,EACRE,EAAO,EACLG,GAAY,EACdP,EAAIA,EAAIE,EAERF,EAAIA,EAAIE,EAGNK,GAAY,EACdP,EAAIA,EAAIE,EAERF,EAAIA,EAAIE,CAGd,CACA,OAAOF,CACT,CAEe,SAARQ,GAA4BC,EAAOC,EAAO,CAC/C,IAAIC,EAAO,CAAC,EACRC,EAA+BA,GAC/BC,EAAM,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EACjBC,EAAO,CAAC,CAAC,EAAG,CAAC,CAAC,EACdC,EAAI,CAAC,EACTL,GAAS,EACTD,EAAM,SAAS,SAAUO,EAAMC,EAAK,CAClC,IAAIC,EAAaF,EAAK,UAAU,EAC5BG,EAAaH,EAAK,UAAU,YAAY,EACxCI,EAAWJ,EAAK,UAAU,UAAU,EACnCE,EAAW,aACdA,EAAW,WAAa,CAAMG,GAAMH,EAAW,CAAC,CAAC,EAAQG,GAAMH,EAAW,CAAC,CAAC,CAAC,EACzEA,EAAW,CAAC,GACdA,EAAW,WAAW,KAAUG,GAAMH,EAAW,CAAC,CAAC,CAAC,GAGxD,IAAII,EAAiBJ,EAAW,WAEhC,GAAIA,EAAW,CAAC,GAAK,KAAM,CAIzB,GAHKK,GAAKV,EAAI,CAAC,EAAGS,EAAe,CAAC,CAAC,EAC9BC,GAAKV,EAAI,CAAC,EAAGS,EAAe,CAAC,CAAC,EAC9BC,GAAKV,EAAI,CAAC,EAAGS,EAAe,CAAC,CAAC,EAC/BH,GAAcA,IAAe,OAAQ,CACvC,IAAIK,EAAaC,GAAcT,EAAK,KAAK,EACrChB,EAAIR,IAAqBqB,EAAKS,EAAe,CAAC,EAAGE,EAAad,CAAK,EAEvEE,EAAmBC,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGb,EAAGW,CAAI,EAC3DE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,EAClBE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,EAClBC,EAAmBC,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGb,EAAGW,CAAI,EAC3DE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,EAClBE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,CACpB,CACA,GAAIS,GAAYA,IAAa,OAAQ,CACnC,IAAII,EAAaC,GAAcT,EAAK,KAAK,EACrChB,EAAIR,IAAqBqB,EAAKS,EAAe,CAAC,EAAGE,EAAad,CAAK,EAEvEE,EAAmBC,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGb,EAAGW,CAAI,EAC3DE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,EAClBE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,EAClBC,EAAmBC,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGA,EAAI,CAAC,EAAE,CAAC,EAAGb,EAAGW,CAAI,EAC3DE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,EAClBE,EAAI,CAAC,EAAE,CAAC,EAAIF,EAAK,CAAC,CACpB,CAEKY,GAAKL,EAAW,CAAC,EAAGL,EAAI,CAAC,CAAC,EAC1BU,GAAKL,EAAW,CAAC,EAAGL,EAAI,CAAC,CAAC,EAC1BU,GAAKL,EAAW,CAAC,EAAGL,EAAI,CAAC,CAAC,CACjC,KAEK,CAKH,GAJKU,GAAKT,EAAK,CAAC,EAAGQ,EAAe,CAAC,CAAC,EAC/BC,GAAKT,EAAK,CAAC,EAAGQ,EAAe,CAAC,CAAC,EAC/BI,GAAIX,EAAGD,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACvBa,GAAUZ,EAAGA,CAAC,EACfI,GAAcA,IAAe,OAAQ,CACvC,IAAIK,EAAaC,GAAcT,EAAK,KAAK,EACpCY,GAAYd,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGC,EAAGS,EAAad,CAAK,CAC1D,CACA,GAAIU,GAAYA,IAAa,OAAQ,CACnC,IAAII,EAAaC,GAAcT,EAAK,KAAK,EACpCY,GAAYd,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGC,EAAG,CAACS,EAAad,CAAK,CAC3D,CACKa,GAAKL,EAAW,CAAC,EAAGJ,EAAK,CAAC,CAAC,EAC3BS,GAAKL,EAAW,CAAC,EAAGJ,EAAK,CAAC,CAAC,CAClC,CACF,CAAC,CACH,CCxHA,IAAIe,IAAQC,GAAU,EACf,SAASC,IAAmBC,EAAO,CACxC,GAAIA,EACF,OAAOH,IAAMG,CAAK,EAAE,MAExB,CACO,SAASC,GAAsBD,EAAOE,EAAiB,CACxDF,IACFH,IAAMG,CAAK,EAAE,OAASE,EAE1B,CCJA,SAASC,IAAeC,EAAU,CAChC,OAAOA,EAAS,OAAS,MAC3B,CACA,IAAIC,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAChBG,CACT,CACA,OAAAH,EAAU,UAAU,KAAO,SAAUI,EAASC,EAAK,CACjD,IAAIC,EAAa,IAAIC,GACjBC,EAAW,IAAIC,GACfC,EAAQ,KAAK,MACbC,EAAY,IAAYC,GAC5B,KAAK,YAAc,IAAIC,GAAeR,EAAI,MAAM,CAAC,EACjD,KAAK,gBAAkB,CACrB,OAAQM,CACV,EACAA,EAAU,IAAIL,EAAW,KAAK,EAC9BK,EAAU,IAAIH,EAAS,KAAK,EAC5BE,EAAM,IAAIC,CAAS,EACnB,KAAK,YAAcL,EACnB,KAAK,UAAYE,EACjB,KAAK,WAAaG,EAClB,KAAK,aAAe,EACtB,EACAX,EAAU,UAAU,OAAS,SAAUc,EAAaV,EAASC,EAAK,CAChE,IAAIF,EAAQ,KACRJ,EAAWe,EAAY,iBACvBC,EAAgB,GACpB,KAAK,OAASD,EACd,KAAK,KAAOT,EACZ,KAAK,QAAU,GACf,IAAIW,EAAgB,KAAK,kBAAkB,EACvCA,GACFA,EAAc,OAAO,MAAMX,CAAG,EAEhC,IAAIC,EAAa,KAAK,YAClBE,EAAW,KAAK,UACpB,GAAIV,IAAeC,CAAQ,EAAG,CAC5B,IAAIkB,EAAe,CACjB,EAAGlB,EAAS,EACZ,EAAGA,EAAS,EACZ,OAAQA,EAAS,OACjB,OAAQA,EAAS,MACnB,EACI,KAAK,aACP,KAAK,WAAW,KAAKkB,CAAY,EAEzBC,GAAY,KAAK,WAAYD,EAAcH,CAAW,CAElE,CAEAK,GAAWL,EAAY,SAAS,EAAGM,GAAmBN,CAAW,CAAC,EAClE,IAAIO,EAAOP,EAAY,QAAQ,EAC/BR,EAAW,WAAWe,CAAI,EAC1B,IAAIC,EAAWR,EAAY,YAAY,EAEvCN,EAAS,WAAWc,CAAQ,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,KAAMR,EAAaT,CAAG,EAC7C,aAAa,KAAK,cAAc,EAChC,IAAIkB,EAAcT,EAAY,YAC1BU,EAAkBV,EAAY,IAAI,CAAC,QAAS,iBAAiB,CAAC,EAC9DS,IACFR,EAAgB,GAChB,KAAK,2BAA2BQ,EAAalB,EAAKmB,CAAe,GAEnE,IAAIC,EAASX,EAAY,IAAI,QAAQ,EACrCO,EAAK,MAAM,SAAS,SAAUK,EAAM,CAClC,IAAIC,EAAMD,EAAK,UACXE,EAAKF,EAAK,aAAa,EACvBG,EAAYH,EAAK,SAAS,EAC9B,GAAKE,EAIL,CAAAA,EAAG,IAAI,MAAM,EAAE,IAAI,SAAS,EAC5B,IAAIE,EAAYD,EAAU,IAAI,WAAW,EACrCC,GACFF,EAAG,GAAG,OAAQ,SAAUG,EAAG,CACzB,OAAQN,EAAQ,CACd,IAAK,QACHF,EAAY,OAAO,EACnB,CAACpB,EAAM,YAAcA,EAAM,2BAA2BoB,EAAalB,EAAKmB,CAAe,EACvFD,EAAY,SAASI,CAAG,EAExBN,EAAK,cAAcM,EAAK,CAACC,EAAG,EAAGA,EAAG,CAAC,CAAC,EACpC,MACF,IAAK,WACHP,EAAK,cAAcM,EAAK,CAACC,EAAG,EAAGA,EAAG,CAAC,CAAC,EAEpCF,EAAK,UAAU,CACb,MAAO,EACT,EAAG,EAAI,EAEPM,GAAelB,EAAa,aAAcY,EAAM,CAACK,EAAE,QAASA,EAAE,OAAO,CAAC,EACtE5B,EAAM,aAAaW,CAAW,EAC9B,MAEF,QACEO,EAAK,cAAcM,EAAK,CAACC,EAAG,EAAGA,EAAG,CAAC,CAAC,EAEpCK,GAAiBnB,EAAY,SAAS,EAAGA,CAAW,EACpDX,EAAM,aAAaW,CAAW,EAC9B,KACJ,CACF,CAAC,EAAE,GAAG,UAAW,UAAY,CACvBS,GACFA,EAAY,WAAWI,CAAG,CAE9B,CAAC,EAEHC,EAAG,aAAaE,EAAW,CAAC,CAACD,EAAU,IAAI,QAAQ,CAAC,EACpD,IAAIK,EAAQL,EAAU,IAAI,CAAC,WAAY,OAAO,CAAC,EAC3CK,IAAU,cACZC,GAAUP,CAAE,EAAE,MAAQF,EAAK,uBAAuB,GAEtD,CAAC,EACDL,EAAK,MAAM,SAAS,SAAUe,EAAM,CAClC,IAAIR,EAAKQ,EAAK,aAAa,EACvBF,EAAQE,EAAK,SAAS,EAAE,IAAI,CAAC,WAAY,OAAO,CAAC,EAChDR,GAGDM,IAAU,cACZC,GAAUP,CAAE,EAAE,MAAQ,CACpB,KAAM,CAACQ,EAAK,SAAS,EACrB,KAAM,CAACA,EAAK,MAAM,UAAWA,EAAK,MAAM,SAAS,CACnD,EAEJ,CAAC,EACD,IAAIC,EAAsBvB,EAAY,IAAI,QAAQ,IAAM,YAAcA,EAAY,IAAI,CAAC,WAAY,aAAa,CAAC,EAC7GwB,EAAKjB,EAAK,UAAU,IAAI,EACxBkB,EAAKlB,EAAK,UAAU,IAAI,EAC5BA,EAAK,MAAM,SAAS,SAAUK,EAAM,CAClCc,GAAgBd,EAAMW,EAAqBC,EAAIC,CAAE,CACnD,CAAC,EACD,KAAK,aAAe,GAEfxB,GACH,KAAK,iBAAiBD,EAAaT,EAAK,KAAK,YAAa,KAAK,SAAS,CAE5E,EACAL,EAAU,UAAU,QAAU,UAAY,CACxC,KAAK,OAAO,EACZ,KAAK,aAAe,KAAK,YAAY,QAAQ,EAC7C,KAAK,gBAAkB,IACzB,EACAA,EAAU,UAAU,2BAA6B,SAAUuB,EAAalB,EAAKmB,EAAiB,CAC5F,IAAIiB,EAAO,KACPC,EAAgB,IACnB,SAASC,GAAO,CACfpB,EAAY,KAAK,SAAUqB,EAAS,CAClCH,EAAK,aAAaA,EAAK,MAAM,GACzBG,GAAW,CAACF,KACdA,EAAgB,GAChBD,EAAK,iBAAiBA,EAAK,OAAQpC,EAAKoC,EAAK,YAAaA,EAAK,SAAS,IAEzEA,EAAK,WAAa,CAACG,KAAapB,EAAkBiB,EAAK,eAAiB,WAAWE,EAAM,EAAE,EAAIA,EAAK,EACvG,CAAC,CACH,GAAG,CACL,EACA3C,EAAU,UAAU,kBAAoB,SAAU6C,EAAU/B,EAAaT,EAAK,CAC5E,IAAIyC,EAAa,KAAK,YAClBC,EAAiB,KAAK,gBACtBhD,EAAWe,EAAY,iBAC3B,GAAI,CAAChB,IAAeC,CAAQ,EAAG,CAC7B+C,EAAW,QAAQ,EACnB,MACF,CACAA,EAAW,OAAOhC,EAAY,IAAI,MAAM,EAAG,CACzC,IAAKT,EACL,MAAO,CACL,UAAWS,CACb,EACA,YAAa,CACX,YAAaA,EAAY,IAAI,aAAa,EAC1C,SAAU,SAAUiB,EAAGiB,EAAGC,EAAG,CAC3B,OAAOlD,EAAS,aAAa,CAACiD,EAAGC,CAAC,CAAC,CACrC,EACA,SAAU,SAAUlB,EAAGiB,EAAGC,EAAG,CAC3B,MAAO,CAACJ,GAAYA,EAAS,QAAQG,EAAGC,CAAC,CAC3C,CACF,CACF,CAAC,EACDF,EAAe,UAAYjC,EAAY,IAAI,YAAY,EACvDiC,EAAe,KAAOhD,EAAS,QAAQ,EACvC+C,EAAW,IAAI,KAAK,EAAE,IAAI,MAAM,EAAE,GAAG,MAAO,SAAUf,EAAG,CACvD1B,EAAI,eAAe,CACjB,SAAUS,EAAY,GACtB,KAAM,YACN,GAAIiB,EAAE,GACN,GAAIA,EAAE,EACR,CAAC,CACH,CAAC,EAAE,GAAG,OAAQ,SAAUA,EAAG,CACzB1B,EAAI,eAAe,CACjB,SAAUS,EAAY,GACtB,KAAM,YACN,KAAMiB,EAAE,MACR,QAASA,EAAE,QACX,QAASA,EAAE,OACb,CAAC,CACH,CAAC,CACH,EAMA/B,EAAU,UAAU,gBAAkB,SAAUc,EAAaT,EAAK6C,EAAQ,CACnE,KAAK,UAGVC,GAAgB,KAAK,gBAAiBD,EAAO,GAAIA,EAAO,EAAE,EAC1D,KAAK,uBAAuB,EAC9B,EAMAlD,EAAU,UAAU,iBAAmB,SAAUc,EAAaT,EAAK6C,EAAQ,CACpE,KAAK,UAGVE,GAAiB,KAAK,gBAAiBF,EAAO,KAAMA,EAAO,QAASA,EAAO,OAAO,EAClF,KAAK,wBAAwB,EAC7B/B,GAAWL,EAAY,SAAS,EAAGM,GAAmBN,CAAW,CAAC,EAClE,KAAK,UAAU,aAAa,EAE5BT,EAAI,kBAAkB,EACtB,KAAK,uBAAuB,EAC9B,EACAL,EAAU,UAAU,wBAA0B,UAAY,CACxD,IAAIc,EAAc,KAAK,OACnBO,EAAOP,EAAY,QAAQ,EAC3BuC,EAAYjC,GAAmBN,CAAW,EAC9CO,EAAK,kBAAkB,SAAUO,EAAID,EAAK,CACxCC,GAAMA,EAAG,eAAeyB,CAAS,CACnC,CAAC,CACH,EACArD,EAAU,UAAU,aAAe,SAAUc,EAAa,CACnD,KAAK,UAGVK,GAAWL,EAAY,SAAS,EAAGM,GAAmBN,CAAW,CAAC,EAClE,KAAK,YAAY,aAAa,EAC9B,KAAK,UAAU,aAAa,EAC9B,EACAd,EAAU,UAAU,OAAS,UAAY,CACvC,KAAK,QAAU,GACf,aAAa,KAAK,cAAc,EAChC,KAAK,WAAa,GAClB,KAAK,eAAiB,KACtB,KAAK,aAAe,KAAK,YAAY,OAAO,EAC5C,KAAK,WAAa,KAAK,UAAU,OAAO,EACxC,KAAK,aAAe,KAAK,YAAY,QAAQ,CAC/C,EAIAA,EAAU,UAAU,kBAAoB,UAAY,CAClD,IAAIsD,EAAQ,KAAK,OACbvD,EAAWuD,EAAM,iBACrB,GAAIvD,EAAS,OAAS,OAGtB,KAAIwD,EAASC,IAAmBF,CAAK,EACrC,GAAKC,EAGL,MAAO,CACL,OAAQA,EACR,SAAUxD,CACZ,EACF,EACAC,EAAU,UAAU,uBAAyB,UAAY,CACvD,IAAIyD,EAAO,KAAK,kBAAkB,EAC9BA,GACFA,EAAK,OAAO,aAAaA,EAAK,SAAS,UAAW,KAAK,IAAI,CAE/D,EACAzD,EAAU,UAAU,iBAAmB,SAAUc,EAAaT,EAAKC,EAAYE,EAAU,CACvF,IAAIiD,EAAO,KAAK,kBAAkB,EAClC,GAAKA,EAGL,KAAIC,EAAc,IAAY9C,GAC1B+C,EAAcrD,EAAW,MAAM,SAAS,EACxCsD,EAAYpD,EAAS,MAAM,SAAS,EACpCqD,EAAY,IAAYjD,GACxBkD,EAAc,IAAYlD,GAC9B8C,EAAY,IAAII,CAAW,EAC3BJ,EAAY,IAAIG,CAAS,EAEzB,QAASE,EAAI,EAAGA,EAAIJ,EAAY,OAAQI,IAAK,CAC3C,IAAIrC,EAAOiC,EAAYI,CAAC,EACpBC,EAAMtC,EAAK,SAAS,EAAE,CAAC,EACvBsB,EAAItB,EAAK,EACTuB,EAAIvB,EAAK,EACTuC,EAAWC,GAAMF,EAAI,KAAK,EAC1BG,EAAQC,EAAOH,EAAU,CAC3B,MAAOD,EAAI,OACX,OAAQA,EAAI,OACZ,EAAGhB,EAAIgB,EAAI,OAAS,EACpB,EAAGf,EAAIe,EAAI,OAAS,CACtB,CAAC,EACGK,EAAQH,GAAMF,EAAI,KAAK,EACvBM,EAAe,IAAIN,EAAI,YAAY,CACrC,MAAOG,EACP,MAAOE,EACP,GAAI,GACN,CAAC,EACDP,EAAY,IAAIQ,CAAY,CAC9B,CACA,QAASP,EAAI,EAAGA,EAAIH,EAAU,OAAQG,IAAK,CACzC,IAAIrC,EAAOkC,EAAUG,CAAC,EAClBQ,EAAO7C,EAAK,SAAS,EAAE,CAAC,EACxB2C,EAAQH,GAAMK,EAAK,KAAK,EACxBJ,EAAQD,GAAMK,EAAK,KAAK,EACxBC,EAAgB,IAAIC,GAAW,CACjC,MAAOJ,EACP,MAAOF,EACP,GAAI,GACN,CAAC,EACDN,EAAU,IAAIW,CAAa,CAC7B,CACAf,EAAK,OAAO,cAAc,CACxB,IAAKpD,EACL,SAAUS,EAAY,IAAI,MAAM,EAChC,aAAc,KACd,MAAO4C,EACP,YAAaD,EAAK,SAAS,SAC7B,CAAC,EACH,EACAzD,EAAU,KAAO,QACVA,CACT,GAAE0E,EAAS,EACJC,IAAQ3E,ICjWf,SAAS4E,GAAgBC,EAAI,CAC3B,MAAO,OAASA,CAClB,CACA,IAAIC,KAAqB,UAAY,CACnC,SAASA,EAAMC,EAAU,CACvB,KAAK,KAAO,QACZ,KAAK,MAAQ,CAAC,EACd,KAAK,MAAQ,CAAC,EACd,KAAK,UAAY,CAAC,EAKlB,KAAK,UAAY,CAAC,EAClB,KAAK,UAAYA,GAAY,EAC/B,CAIA,OAAAD,EAAM,UAAU,WAAa,UAAY,CACvC,OAAO,KAAK,SACd,EAKAA,EAAM,UAAU,QAAU,SAAUD,EAAIG,EAAW,CACjDH,EAAKA,GAAM,KAAO,GAAKG,EAAY,GAAKH,EACxC,IAAII,EAAW,KAAK,UACpB,GAAI,CAAAA,EAASL,GAAgBC,CAAE,CAAC,EAMhC,KAAIK,EAAO,IAAIC,GAAUN,EAAIG,CAAS,EACtC,OAAAE,EAAK,UAAY,KACjB,KAAK,MAAM,KAAKA,CAAI,EACpBD,EAASL,GAAgBC,CAAE,CAAC,EAAIK,EACzBA,EACT,EAKAJ,EAAM,UAAU,eAAiB,SAAUE,EAAW,CACpD,IAAII,EAAS,KAAK,KAAK,YAAYJ,CAAS,EAC5C,OAAO,KAAK,MAAMI,CAAM,CAC1B,EAKAN,EAAM,UAAU,YAAc,SAAUD,EAAI,CAC1C,OAAO,KAAK,UAAUD,GAAgBC,CAAE,CAAC,CAC3C,EAKAC,EAAM,UAAU,QAAU,SAAUO,EAAIC,EAAIN,EAAW,CACrD,IAAIC,EAAW,KAAK,UAChBM,EAAW,KAAK,UAcpB,GAZWC,GAASH,CAAE,IACpBA,EAAK,KAAK,MAAMA,CAAE,GAETG,GAASF,CAAE,IACpBA,EAAK,KAAK,MAAMA,CAAE,GAEdD,aAAcF,KAClBE,EAAKJ,EAASL,GAAgBS,CAAE,CAAC,GAE7BC,aAAcH,KAClBG,EAAKL,EAASL,GAAgBU,CAAE,CAAC,GAE/B,GAACD,GAAM,CAACC,GAGZ,KAAIG,EAAMJ,EAAG,GAAK,IAAMC,EAAG,GACvBI,EAAO,IAAIC,IAAUN,EAAIC,EAAIN,CAAS,EAC1C,OAAAU,EAAK,UAAY,KACb,KAAK,YACPL,EAAG,SAAS,KAAKK,CAAI,EACrBJ,EAAG,QAAQ,KAAKI,CAAI,GAEtBL,EAAG,MAAM,KAAKK,CAAI,EACdL,IAAOC,GACTA,EAAG,MAAM,KAAKI,CAAI,EAEpB,KAAK,MAAM,KAAKA,CAAI,EACpBH,EAASE,CAAG,EAAIC,EACTA,EACT,EAKAZ,EAAM,UAAU,eAAiB,SAAUE,EAAW,CACpD,IAAII,EAAS,KAAK,SAAS,YAAYJ,CAAS,EAChD,OAAO,KAAK,MAAMI,CAAM,CAC1B,EAKAN,EAAM,UAAU,QAAU,SAAUO,EAAIC,EAAI,CACtCD,aAAcF,KAChBE,EAAKA,EAAG,IAENC,aAAcH,KAChBG,EAAKA,EAAG,IAEV,IAAIC,EAAW,KAAK,UACpB,OAAI,KAAK,UACAA,EAASF,EAAK,IAAMC,CAAE,EAEtBC,EAASF,EAAK,IAAMC,CAAE,GAAKC,EAASD,EAAK,IAAMD,CAAE,CAE5D,EAKAP,EAAM,UAAU,SAAW,SAAUc,EAAIC,EAAS,CAGhD,QAFIC,EAAQ,KAAK,MACbC,EAAMD,EAAM,OACPE,EAAI,EAAGA,EAAID,EAAKC,IACnBF,EAAME,CAAC,EAAE,WAAa,GACxBJ,EAAG,KAAKC,EAASC,EAAME,CAAC,EAAGA,CAAC,CAGlC,EAKAlB,EAAM,UAAU,SAAW,SAAUc,EAAIC,EAAS,CAGhD,QAFII,EAAQ,KAAK,MACbF,EAAME,EAAM,OACPD,EAAI,EAAGA,EAAID,EAAKC,IACnBC,EAAMD,CAAC,EAAE,WAAa,GAAKC,EAAMD,CAAC,EAAE,MAAM,WAAa,GAAKC,EAAMD,CAAC,EAAE,MAAM,WAAa,GAC1FJ,EAAG,KAAKC,EAASI,EAAMD,CAAC,EAAGA,CAAC,CAGlC,EAMAlB,EAAM,UAAU,qBAAuB,SAAUc,EAAIM,EAAWC,EAAWN,EAAS,CAIlF,GAHMK,aAAqBf,KACzBe,EAAY,KAAK,UAAUtB,GAAgBsB,CAAS,CAAC,GAEnD,EAACA,EAIL,SADIE,EAAWD,IAAc,MAAQ,WAAaA,IAAc,KAAO,UAAY,QAC1EH,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IACrC,KAAK,MAAMA,CAAC,EAAE,UAAY,GAE5B,GAAI,CAAAJ,EAAG,KAAKC,EAASK,EAAW,IAAI,EAIpC,QADIG,EAAQ,CAACH,CAAS,EACfG,EAAM,QAGX,QAFIC,EAAcD,EAAM,MAAM,EAC1BJ,EAAQK,EAAYF,CAAQ,EACvBJ,EAAI,EAAGA,EAAIC,EAAM,OAAQD,IAAK,CACrC,IAAIO,EAAIN,EAAMD,CAAC,EACXQ,EAAYD,EAAE,QAAUD,EAAcC,EAAE,MAAQA,EAAE,MACtD,GAAI,CAACC,EAAU,UAAW,CACxB,GAAIZ,EAAG,KAAKC,EAASW,EAAWF,CAAW,EAEzC,OAEFD,EAAM,KAAKG,CAAS,EACpBA,EAAU,UAAY,EACxB,CACF,EAEJ,EAQA1B,EAAM,UAAU,OAAS,UAAY,CAKnC,QAJI2B,EAAO,KAAK,KACZC,EAAW,KAAK,SAChBZ,EAAQ,KAAK,MACbG,EAAQ,KAAK,MACRD,EAAI,EAAGD,EAAMD,EAAM,OAAQE,EAAID,EAAKC,IAC3CF,EAAME,CAAC,EAAE,UAAY,GAEvB,QAASA,EAAI,EAAGD,EAAMU,EAAK,MAAM,EAAGT,EAAID,EAAKC,IAC3CF,EAAMW,EAAK,YAAYT,CAAC,CAAC,EAAE,UAAYA,EAEzCU,EAAS,WAAW,SAAUC,EAAK,CACjC,IAAIjB,EAAOO,EAAMS,EAAS,YAAYC,CAAG,CAAC,EAC1C,OAAOjB,EAAK,MAAM,WAAa,GAAKA,EAAK,MAAM,WAAa,CAC9D,CAAC,EAED,QAASM,EAAI,EAAGD,EAAME,EAAM,OAAQD,EAAID,EAAKC,IAC3CC,EAAMD,CAAC,EAAE,UAAY,GAEvB,QAASA,EAAI,EAAGD,EAAMW,EAAS,MAAM,EAAGV,EAAID,EAAKC,IAC/CC,EAAMS,EAAS,YAAYV,CAAC,CAAC,EAAE,UAAYA,CAE/C,EAKAlB,EAAM,UAAU,MAAQ,UAAY,CAIlC,QAHI8B,EAAQ,IAAI9B,EAAM,KAAK,SAAS,EAChCgB,EAAQ,KAAK,MACbG,EAAQ,KAAK,MACR,EAAI,EAAG,EAAIH,EAAM,OAAQ,IAChCc,EAAM,QAAQd,EAAM,CAAC,EAAE,GAAIA,EAAM,CAAC,EAAE,SAAS,EAE/C,QAAS,EAAI,EAAG,EAAIG,EAAM,OAAQ,IAAK,CACrC,IAAIM,EAAIN,EAAM,CAAC,EACfW,EAAM,QAAQL,EAAE,MAAM,GAAIA,EAAE,MAAM,GAAIA,EAAE,SAAS,CACnD,CACA,OAAOK,CACT,EAEO9B,CACT,GAAE,EACEK,IAAyB,UAAY,CACvC,SAASA,EAAUN,EAAIG,EAAW,CAChC,KAAK,QAAU,CAAC,EAChB,KAAK,SAAW,CAAC,EACjB,KAAK,MAAQ,CAAC,EACd,KAAK,UAAY,GACjB,KAAK,GAAKH,GAAa,GACvB,KAAK,UAAYG,GAAoB,EACvC,CAIA,OAAAG,EAAU,UAAU,OAAS,UAAY,CACvC,OAAO,KAAK,MAAM,MACpB,EAIAA,EAAU,UAAU,SAAW,UAAY,CACzC,OAAO,KAAK,QAAQ,MACtB,EAIAA,EAAU,UAAU,UAAY,UAAY,CAC1C,OAAO,KAAK,SAAS,MACvB,EACAA,EAAU,UAAU,SAAW,SAAU0B,EAAM,CAC7C,GAAI,OAAK,UAAY,GAGrB,KAAID,EAAQ,KAAK,UACbE,EAAYF,EAAM,KAAK,aAAa,KAAK,SAAS,EACtD,OAAOE,EAAU,SAASD,CAAI,EAChC,EACA1B,EAAU,UAAU,uBAAyB,UAAY,CAKvD,QAJI4B,EAAc,CAChB,KAAM,CAAC,EACP,KAAM,CAAC,CACT,EACSf,EAAI,EAAGA,EAAI,KAAK,MAAM,OAAQA,IAAK,CAC1C,IAAIgB,EAAe,KAAK,MAAMhB,CAAC,EAC3BgB,EAAa,UAAY,IAG7BD,EAAY,KAAK,KAAKC,EAAa,SAAS,EAC5CD,EAAY,KAAK,KAAKC,EAAa,MAAM,UAAWA,EAAa,MAAM,SAAS,EAClF,CACA,OAAOD,CACT,EACA5B,EAAU,UAAU,yBAA2B,UAAY,CAGzD,QAFI8B,EAA2BC,GAAc,EACzCC,EAA2BD,GAAc,EACpClB,EAAI,EAAGD,EAAM,KAAK,MAAM,OAAQC,EAAID,EAAKC,IAAK,CACrD,IAAIgB,EAAe,KAAK,MAAMhB,CAAC,EAC/B,GAAI,EAAAgB,EAAa,UAAY,GAG7B,CAAAC,EAAkB,IAAID,EAAa,UAAW,EAAI,EAIlD,QAHII,EAAmB,CAACJ,EAAa,KAAK,EACtCK,EAAmB,CAACL,EAAa,KAAK,EACtCM,EAAoB,EACjBA,EAAoBF,EAAiB,QAAQ,CAClD,IAAIG,EAAaH,EAAiBE,CAAiB,EACnDA,IACAH,EAAkB,IAAII,EAAW,UAAW,EAAI,EAEhD,QADIC,EAAoBD,EAAW,QAC1BE,EAAI,EAAGC,EAAQF,EAAkB,OAAQG,EAAS,OAAQC,EAAkB,OAAQH,EAAIC,EAAOD,IACtGE,EAASH,EAAkBC,CAAC,EAC5BG,EAAkBD,EAAO,UACrBC,GAAmB,GAAK,CAACX,EAAkB,OAAOW,CAAe,IACnEX,EAAkB,IAAIW,EAAiB,EAAI,EAC3CR,EAAiB,KAAKO,EAAO,KAAK,EAGxC,CAEA,IADAL,EAAoB,EACbA,EAAoBD,EAAiB,QAAQ,CAClD,IAAIQ,EAAaR,EAAiBC,CAAiB,EACnDA,IACAH,EAAkB,IAAIU,EAAW,UAAW,EAAI,EAEhD,QADIC,EAAqBD,EAAW,SAC3BJ,EAAI,EAAGM,EAAQD,EAAmB,OAAQE,EAAU,OAAQC,EAAmB,OAAQR,EAAIM,EAAON,IACzGO,EAAUF,EAAmBL,CAAC,EAC9BQ,EAAmBD,EAAQ,UACvBC,GAAoB,GAAK,CAAChB,EAAkB,OAAOgB,CAAgB,IACrEhB,EAAkB,IAAIgB,EAAkB,EAAI,EAC5CZ,EAAiB,KAAKW,EAAQ,KAAK,EAGzC,EACF,CACA,MAAO,CACL,KAAMf,EAAkB,KAAK,EAC7B,KAAME,EAAkB,KAAK,CAC/B,CACF,EACOhC,CACT,GAAE,EACEQ,KAAyB,UAAY,CACvC,SAASA,EAAUN,EAAIC,EAAIN,EAAW,CACpC,KAAK,UAAY,GACjB,KAAK,MAAQK,EACb,KAAK,MAAQC,EACb,KAAK,UAAYN,GAAoB,EACvC,CAEA,OAAAW,EAAU,UAAU,SAAW,SAAUkB,EAAM,CAC7C,GAAI,OAAK,UAAY,GAGrB,KAAID,EAAQ,KAAK,UACbE,EAAYF,EAAM,SAAS,aAAa,KAAK,SAAS,EAC1D,OAAOE,EAAU,SAASD,CAAI,EAChC,EACAlB,EAAU,UAAU,uBAAyB,UAAY,CACvD,MAAO,CACL,KAAM,CAAC,KAAK,SAAS,EACrB,KAAM,CAAC,KAAK,MAAM,UAAW,KAAK,MAAM,SAAS,CACnD,CACF,EACAA,EAAU,UAAU,yBAA2B,UAAY,CACzD,IAAIsB,EAA2BC,GAAc,EACzCC,EAA2BD,GAAc,EAC7CD,EAAkB,IAAI,KAAK,UAAW,EAAI,EAI1C,QAHIiB,EAAc,CAAC,KAAK,KAAK,EACzBC,EAAc,CAAC,KAAK,KAAK,EACzBb,EAAoB,EACjBA,EAAoBY,EAAY,QAAQ,CAC7C,IAAIX,EAAaW,EAAYZ,CAAiB,EAC9CA,IACAH,EAAkB,IAAII,EAAW,UAAW,EAAI,EAEhD,QADIC,EAAoBD,EAAW,QAC1BE,EAAI,EAAG1B,EAAMyB,EAAkB,OAAQG,EAAS,OAAQC,EAAkB,OAAQH,EAAI1B,EAAK0B,IAClGE,EAASJ,EAAW,QAAQE,CAAC,EAC7BG,EAAkBD,EAAO,UACrBC,GAAmB,GAAK,CAACX,EAAkB,OAAOW,CAAe,IACnEX,EAAkB,IAAIW,EAAiB,EAAI,EAC3CM,EAAY,KAAKP,EAAO,KAAK,EAGnC,CAEA,IADAL,EAAoB,EACbA,EAAoBa,EAAY,QAAQ,CAC7C,IAAIN,EAAaM,EAAYb,CAAiB,EAC9CA,IACAH,EAAkB,IAAIU,EAAW,UAAW,EAAI,EAEhD,QADIC,EAAqBD,EAAW,SAC3BJ,EAAI,EAAG1B,EAAM+B,EAAmB,OAAQE,EAAU,OAAQC,EAAmB,OAAQR,EAAI1B,EAAK0B,IACrGO,EAAUH,EAAW,SAASJ,CAAC,EAC/BQ,EAAmBD,EAAQ,UACvBC,GAAoB,GAAK,CAAChB,EAAkB,OAAOgB,CAAgB,IACrEhB,EAAkB,IAAIgB,EAAkB,EAAI,EAC5CE,EAAY,KAAKH,EAAQ,KAAK,EAGpC,CACA,MAAO,CACL,KAAMf,EAAkB,KAAK,EAC7B,KAAME,EAAkB,KAAK,CAC/B,CACF,EACOxB,CACT,GAAE,EACF,SAASyC,IAA0BC,EAAUC,EAAU,CACrD,MAAO,CAIL,SAAU,SAAUC,EAAW,CAC7B,IAAI9B,EAAO,KAAK4B,CAAQ,EAAEC,CAAQ,EAClC,OAAO7B,EAAK,SAAS,EAAE,IAAIA,EAAK,kBAAkB8B,GAAa,OAAO,EAAG,KAAK,SAAS,CACzF,EAEA,UAAW,SAAU9C,EAAK+C,EAAO,CAC/B,KAAK,WAAa,GAAK,KAAKH,CAAQ,EAAEC,CAAQ,EAAE,cAAc,KAAK,UAAW7C,EAAK+C,CAAK,CAC1F,EACA,UAAW,SAAU/C,EAAK,CACxB,OAAO,KAAK4C,CAAQ,EAAEC,CAAQ,EAAE,cAAc,KAAK,UAAW7C,CAAG,CACnE,EACA,UAAW,SAAUgD,EAAQC,EAAO,CAClC,KAAK,WAAa,GAAK,KAAKL,CAAQ,EAAEC,CAAQ,EAAE,cAAc,KAAK,UAAWG,EAAQC,CAAK,CAC7F,EACA,UAAW,UAAY,CACrB,OAAO,KAAKL,CAAQ,EAAEC,CAAQ,EAAE,cAAc,KAAK,SAAS,CAC9D,EACA,aAAc,UAAY,CACxB,OAAO,KAAKD,CAAQ,EAAEC,CAAQ,EAAE,iBAAiB,KAAK,SAAS,CACjE,EACA,YAAa,UAAY,CACvB,OAAO,KAAKD,CAAQ,EAAEC,CAAQ,EAAE,YAAY,KAAK,SAAS,CAC5D,CACF,CACF,CAIOK,GAAMxD,GAAWiD,IAA0B,YAAa,MAAM,CAAC,EAC/DO,GAAMhD,IAAWyC,IAA0B,YAAa,UAAU,CAAC,EAC1E,IAAOQ,IAAQ9D,IC1aA,SAAR+D,GAAyCC,EAAOC,EAAOC,EAAaC,EAAUC,EAAY,CAI/F,QADIC,EAAQ,IAAIC,IAAMH,CAAQ,EACrBI,EAAI,EAAGA,EAAIP,EAAM,OAAQO,IAChCF,EAAM,QAAeG,GAErBR,EAAMO,CAAC,EAAE,GAAIP,EAAMO,CAAC,EAAE,KAAMA,CAAC,EAAGA,CAAC,EAKnC,QAHIE,EAAe,CAAC,EAChBC,EAAa,CAAC,EACdC,EAAY,EACPJ,EAAI,EAAGA,EAAIN,EAAM,OAAQM,IAAK,CACrC,IAAIK,EAAOX,EAAMM,CAAC,EACdM,EAASD,EAAK,OACdE,EAASF,EAAK,OAEdP,EAAM,QAAQQ,EAAQC,EAAQH,CAAS,IACzCD,EAAW,KAAKE,CAAI,EACpBH,EAAa,KAAYD,GAASO,GAAoBH,EAAK,GAAI,IAAI,EAAGC,EAAS,MAAQC,CAAM,CAAC,EAC9FH,IAEJ,CACA,IAAIK,EAAWd,EAAY,IAAI,kBAAkB,EAC7Ce,EACJ,GAAID,IAAa,eAAiBA,IAAa,SAAWA,IAAa,SACrEC,EAAWC,GAAiBlB,EAAOE,CAAW,MACzC,CACL,IAAIiB,EAAeC,GAAiB,IAAIJ,CAAQ,EAC5CK,EAAkBF,EAAeA,EAAa,YAAc,CAAC,EAAI,CAAC,EAI3DG,GAAQD,EAAiB,OAAO,EAAI,GAC7CA,EAAgB,OAAO,CAAC,OAAO,CAAC,EAElC,IAAIE,EAAaC,GAAwBxB,EAAO,CAC9C,gBAAiBqB,EACjB,aAAcnB,EAAY,UAAU,CACtC,CAAC,EAAE,WACHe,EAAW,IAAIQ,GAAWF,EAAYrB,CAAW,EACjDe,EAAS,SAASjB,CAAK,CACzB,CACA,IAAI0B,EAAW,IAAID,GAAW,CAAC,OAAO,EAAGvB,CAAW,EACpD,OAAAwB,EAAS,SAAShB,EAAYD,CAAY,EAC1CL,GAAcA,EAAWa,EAAUS,CAAQ,EAC3CC,GAAe,CACb,SAAUV,EACV,OAAQZ,EACR,WAAY,QACZ,MAAO,CACL,KAAMY,EACN,KAAMS,CACR,EACA,UAAW,CACT,KAAM,OACN,KAAM,UACR,CACF,CAAC,EAEDrB,EAAM,OAAO,EACNA,CACT,CC1DA,IAAIuB,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KAC9BG,EAAM,gBAAkB,GACjBA,CACT,CACA,OAAAH,EAAiB,UAAU,KAAO,SAAUI,EAAQ,CAClDH,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,EAC3C,IAAII,EAAO,KACX,SAASC,GAAoB,CAC3B,OAAOD,EAAK,eACd,CAEA,KAAK,qBAAuB,IAAIE,GAAqBD,EAAmBA,CAAiB,EACzF,KAAK,kBAAkBF,EAAO,OAASA,EAAO,KAAK,EACnD,KAAK,sBAAsB,CAC7B,EACAJ,EAAiB,UAAU,YAAc,SAAUI,EAAQ,CACzDH,EAAO,UAAU,YAAY,MAAM,KAAM,SAAS,EAClD,KAAK,kBAAkBG,EAAO,OAASA,EAAO,KAAK,EACnD,KAAK,sBAAsB,CAC7B,EACAJ,EAAiB,UAAU,qBAAuB,SAAUI,EAAQ,CAClEH,EAAO,UAAU,qBAAqB,MAAM,KAAM,SAAS,EAC3DO,GAAgBJ,EAAQ,YAAa,CAAC,MAAM,CAAC,CAC/C,EACAJ,EAAiB,UAAU,eAAiB,SAAUI,EAAQK,EAAS,CACrE,IAAIC,EAAQN,EAAO,OAASA,EAAO,OAAS,CAAC,EACzCO,EAAQP,EAAO,MAAQA,EAAO,OAAS,CAAC,EACxCC,EAAO,KACX,GAAIM,GAASD,EAAO,CAElBE,IAAkB,IAAI,EACtB,IAAIC,EAAQC,GAAwBH,EAAOD,EAAO,KAAM,GAAMK,CAAU,EACxE,OAAOC,EAAKH,EAAM,MAAO,SAAUI,EAAM,CACvCC,IAA0BD,EAAK,MAAOA,EAAK,MAAO,KAAMA,EAAK,SAAS,CACxE,EAAG,IAAI,EACAJ,EAAM,IACf,CACA,SAASE,EAAWI,EAAUC,EAAU,CAEtCD,EAAS,WAAW,eAAgB,SAAUE,EAAO,CACnD,IAAIC,EAAmBjB,EAAK,kBACxBkB,EAAcF,EAAM,WAAW,UAAU,EACzCG,EAAgBF,EAAiBC,CAAW,EAChD,OAAIC,IACFA,EAAc,YAAcH,EAAM,YAClCA,EAAM,YAAcG,GAEfH,CACT,CAAC,EAED,IAAII,EAAcC,GAAM,UAAU,SAClC,SAASC,EAAYC,EAAMC,EAAa,CACtC,IAAIR,EAAQI,EAAY,KAAK,KAAMG,EAAMC,CAAW,EACpD,OAAAR,EAAM,kBAAoBS,EACnBT,CACT,CACAD,EAAS,WAAW,eAAgB,SAAUC,EAAO,CACnD,OAAAA,EAAM,kBAAoBS,EAC1BT,EAAM,SAAWM,EACVN,CACT,CAAC,EACD,SAASS,EAAkBC,EAAS,CAClC,GAAIA,IAAYA,EAAQ,CAAC,IAAM,SAAWA,EAAQ,CAAC,IAAM,SAAU,CACjE,IAAIC,EAAaD,EAAQ,MAAM,EAC/B,OAAIA,EAAQ,CAAC,IAAM,QACjBC,EAAW,CAAC,EAAI,YACPD,EAAQ,CAAC,IAAM,UACxBC,EAAW,CAAC,EAAI,aAEXA,CACT,CACA,OAAOD,CACT,CACF,CACF,EACA/B,EAAiB,UAAU,SAAW,UAAY,CAChD,OAAO,KAAK,QAAQ,EAAE,KACxB,EACAA,EAAiB,UAAU,YAAc,UAAY,CACnD,OAAO,KAAK,SAAS,EAAE,QACzB,EACAA,EAAiB,UAAU,kBAAoB,UAAY,CACzD,OAAO,KAAK,eACd,EACAA,EAAiB,UAAU,cAAgB,SAAUiC,EAAWC,EAAgBC,EAAU,CACxF,GAAIA,IAAa,OAAQ,CACvB,IAAIhB,EAAW,KAAK,QAAQ,EACxBiB,EAAS,KAAK,cAAcH,EAAWE,CAAQ,EAC/ClB,EAAOE,EAAS,MAAM,eAAec,CAAS,EAC9CI,EAAalB,EAAS,QAAQF,EAAK,MAAM,SAAS,EAClDqB,EAAanB,EAAS,QAAQF,EAAK,MAAM,SAAS,EAClDsB,EAAU,CAAC,EACf,OAAAF,GAAc,MAAQE,EAAQ,KAAKF,CAAU,EAC7CC,GAAc,MAAQC,EAAQ,KAAKD,CAAU,EACtCE,GAAoB,YAAa,CACtC,KAAMD,EAAQ,KAAK,KAAK,EACxB,MAAOH,EAAO,MACd,QAASA,EAAO,OAAS,IAC3B,CAAC,CACH,CAEA,IAAIK,EAAaC,GAA2B,CAC1C,OAAQ,KACR,UAAWT,EACX,eAAgBC,CAClB,CAAC,EACD,OAAOO,CACT,EACAzC,EAAiB,UAAU,sBAAwB,UAAY,CAC7D,IAAI2C,EAAoBC,EAAI,KAAK,OAAO,YAAc,CAAC,EAAG,SAAUC,EAAU,CAE5E,OAAOA,EAAS,OAAS,KAAOA,EAAkBC,EAAO,CACvD,MAAO,CACT,EAAGD,CAAQ,CACb,CAAC,EACGE,EAAiB,IAAIC,GAAW,CAAC,OAAO,EAAG,IAAI,EACnDD,EAAe,SAASJ,CAAU,EAClC,KAAK,gBAAkBI,EACvB,KAAK,kBAAoBA,EAAe,SAAS,SAAUE,EAAK,CAC9D,OAAOF,EAAe,aAAaE,CAAG,CACxC,CAAC,CACH,EACAjD,EAAiB,UAAU,QAAU,SAAUkD,EAAM,CACnD,KAAK,OAAO,KAAOA,CACrB,EACAlD,EAAiB,UAAU,UAAY,SAAUmD,EAAQ,CACvD,KAAK,OAAO,OAASA,CACvB,EACAnD,EAAiB,UAAU,mBAAqB,UAAY,CAC1D,OAAOC,EAAO,UAAU,mBAAmB,KAAK,IAAI,GAEjD,EAAE,KAAK,IAAI,QAAQ,IAAM,SAAW,KAAK,IAAI,CAAC,QAAS,iBAAiB,CAAC,EAC9E,EACAD,EAAiB,KAAO,eACxBA,EAAiB,aAAe,CAAC,OAAQ,QAAS,MAAO,aAAc,UAAU,EACjFA,EAAiB,cAAgB,CAE/B,EAAG,EACH,iBAAkB,OAMlB,gBAAiB,GACjB,OAAQ,KAER,SAAU,CACR,YAAa,EACf,EAEA,MAAO,CACL,WAAY,KAEZ,UAAW,CAAC,EAAG,EAAE,EACjB,QAAS,GAET,SAAU,GAEV,WAAY,GACZ,gBAAiB,EACnB,EACA,KAAM,SACN,IAAK,SAKL,OAAQ,SACR,WAAY,GACZ,WAAY,CAAC,OAAQ,MAAM,EAC3B,eAAgB,GAChB,UAAW,CACT,SAAU,SACV,SAAU,CACZ,EACA,UAAW,GACX,KAAM,GAEN,OAAQ,KACR,KAAM,EAEN,eAAgB,GAUhB,MAAO,CACL,KAAM,GACN,UAAW,KACb,EACA,UAAW,CAAC,EACZ,UAAW,CAET,MAAOoD,EAAO,MAAM,UACpB,MAAO,EACP,QAAS,EACX,EACA,SAAU,CACR,MAAO,GACP,MAAO,CACL,KAAM,EACR,CACF,EACA,OAAQ,CACN,UAAW,CACT,YAAaA,EAAO,MAAM,OAC5B,CACF,CACF,EACOpD,CACT,GAAEqD,EAAW,EACNC,IAAQtD,IC7NR,SAASuD,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAS,EACrCD,EAAU,oBAAoBE,GAAgB,EAC9CF,EAAU,kBAAkBG,EAAc,EAC1CH,EAAU,eAAeI,EAAc,EACvCJ,EAAU,eAAeK,EAAU,EACnCL,EAAU,eAAeM,EAAY,EACrCN,EAAU,eAAeA,EAAU,SAAS,OAAO,kBAAmBO,EAAc,EACpFP,EAAU,eAAeQ,EAAW,EACpCR,EAAU,yBAAyB,YAAa,CAC9C,WAAYS,GAAK,WACjB,OAAQC,EACV,CAAC,EAEDV,EAAU,eAAe,CACvB,KAAM,qBACN,MAAO,qBACP,OAAQ,2BACV,EAAGW,EAAI,EACPX,EAAU,eAAe,CACvB,KAAM,uBACN,MAAO,uBACP,OAAQ,6BACV,EAAGW,EAAI,EAEPX,EAAU,eAAe,CACvB,KAAM,YACN,MAAO,YACP,OAAQ,MACV,EAAG,SAAUY,EAASC,EAASC,EAAK,CAClCD,EAAQ,cAAc,CACpB,SAAU,SACV,MAAOD,CACT,EAAG,SAAUG,EAAa,CACxB,IAAIC,EAAYF,EAAI,qBAAqBC,CAAW,EAChDC,IACEJ,EAAQ,IAAM,MAAQA,EAAQ,IAAM,MACtCI,EAAU,gBAAgBD,EAAaD,EAAKF,CAAO,EAEjDA,EAAQ,MAAQ,MAAQA,EAAQ,SAAW,MAAQA,EAAQ,SAAW,MACxEI,EAAU,iBAAiBD,EAAaD,EAAKF,CAAO,GAGxD,IAAIK,EAAWF,EAAY,iBACvBG,EAAMC,GAA4BF,EAAUL,EAASG,EAAY,IAAI,YAAY,CAAC,EACtFA,EAAY,WAAaA,EAAY,UAAUG,EAAI,MAAM,EACzDH,EAAY,SAAWA,EAAY,QAAQG,EAAI,IAAI,CACrD,CAAC,CACH,CAAC,CACH,CCtDA,IAAIE,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,EAAWG,EAAMC,EAAKC,EAAY,CACzC,IAAIC,EAAQL,EAAO,KAAK,IAAI,GAAK,KACjCM,GAAUD,CAAK,EAAE,SAAW,OAC5BA,EAAM,GAAK,EACX,IAAIE,EAAO,IAAYC,GACvB,OAAAH,EAAM,eAAeE,CAAI,EACzBF,EAAM,WAAWH,EAAMC,EAAKC,EAAY,EAAI,EACrCC,CACT,CACA,OAAAN,EAAW,UAAU,WAAa,SAAUG,EAAMC,EAAKC,EAAYK,EAAa,CAC9E,IAAIC,EAAS,KACTC,EAAOT,EAAK,MAAM,eAAeC,CAAG,EACpCS,EAAcV,EAAK,UACnBW,EAAYF,EAAK,SAAS,EAC1BG,EAAgBD,EAAU,SAAS,UAAU,EAE7CE,EAASb,EAAK,cAAcC,CAAG,EAC/Ba,EAAQC,EAAOC,GAAsBL,EAAU,SAAS,WAAW,EAAGE,EAAQ,EAAI,EAAGA,CAAM,EAC3FI,EAAK,KAET,GAAI,MAAMH,EAAM,UAAU,EAAG,CAE3BG,EAAG,SAASH,CAAK,EACjB,MACF,CACIP,EACFU,EAAG,SAASH,CAAK,EAETI,GAAYD,EAAI,CACtB,MAAOH,CACT,EAAGJ,EAAaT,CAAG,EAErB,IAAIkB,EAAcJ,EAAOC,GAAsBL,EAAU,SAAS,WAAW,EAAGE,EAAQ,EAAI,EAAGA,CAAM,EACrGL,EAAO,SAASW,CAAW,EAC3BX,EAAO,SAASR,EAAK,cAAcC,EAAK,OAAO,CAAC,EAChDmB,GAAyBZ,EAAQG,CAAS,EAC1C,KAAK,aAAaD,EAAaC,EAAWF,CAAI,EAC9CT,EAAK,iBAAiBC,EAAKgB,CAAE,EAC7BG,GAAyBH,EAAIN,EAAW,WAAW,EAEnD,IAAIU,EAAQT,EAAc,IAAI,OAAO,EACrCU,GAAoB,KAAMD,IAAU,YAAcZ,EAAK,uBAAuB,EAAIY,EAAOT,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACxJ,EACAf,EAAW,UAAU,aAAe,SAAUa,EAAaC,EAAWF,EAAM,CAC1E,IAAIc,EAAQ,KAAK,eAAe,EAC5BV,EAASJ,EAAK,UAAU,EACxBe,GAAYX,EAAO,WAAaA,EAAO,UAAY,EACnDY,EAAK,KAAK,IAAID,CAAQ,EACtBE,EAAK,KAAK,IAAIF,CAAQ,EACtBG,EAAmBhB,EAAU,SAAS,OAAO,EACjDY,EAAM,OAAS,CAACI,EAAiB,IAAI,MAAM,EAE3C,IAAIC,EAAmBC,GAAqBlB,CAAS,EACjDmB,EAAQrB,EAAK,UAAU,OAAO,EAClCsB,GAAcR,EAAOK,EAAkB,CACrC,aAAc,CACZ,kBAAmB,SAAUI,EAAWC,EAAWC,EAAUC,EAAeC,EAAWC,EAAc,CACnG,OAAO3B,EAAY,kBAAkBsB,EAAWC,EAAW,OAAQE,EAGnEG,GAAUF,EAAWR,EAAiB,QAAUA,EAAiB,OAAO,IAAI,WAAW,EAAGjB,EAAU,IAAI,MAAM,CAAC,EAAG0B,CAAY,CAChI,CACF,EACA,eAAgB5B,EAAK,UACrB,YAAaA,EAAK,UAAY,GAC9B,aAAcqB,EAAM,KACpB,eAAgBA,EAAM,QACtB,uBAAwB,UAC1B,CAAC,EAED,IAAIS,EAAgBZ,EAAiB,IAAI,UAAU,GAAK,UACpDa,EAAeb,EAAiB,IAAI,UAAU,GAAK,EACnDc,EACAF,IAAkB,UACpBE,EAAI5B,EAAO,EAAI2B,EAEfC,GAAK5B,EAAO,EAAIA,EAAO,IAAM,EAE/B,KAAK,WAAa,CAChB,OAAQ0B,IAAkB,SAC5B,EACA,IAAIG,EAAQH,IAAkB,UAAYZ,EAAiB,IAAI,OAAO,GAAK,SAAWF,EAAK,EAAI,OAAS,QACpGkB,EAAgBJ,IAAkB,UAAYZ,EAAiB,IAAI,eAAe,GAAK,SAAWD,EAAK,EAAI,MAAQ,SACvHH,EAAM,KAAK,CACT,EAAGE,EAAKgB,EAAI5B,EAAO,GACnB,EAAGa,EAAKe,EAAI5B,EAAO,GACnB,SAAU,EACV,MAAO,CACL,MAAO6B,EACP,cAAeC,CACjB,CACF,CAAC,CACH,EACO9C,CACT,GAAU+C,EAAM,EACTC,GAAQhD,IC5Ef,IAAIiD,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,EAAUG,EAAUC,EAAUC,EAASC,EAAY,CAC1D,IAAIC,EAAQN,EAAO,KAAK,IAAI,GAAK,KACjC,OAAAO,GAAUD,CAAK,EAAE,SAAW,OAC5BA,EAAM,WAAWJ,EAAUC,EAAUC,EAASC,EAAY,EAAI,EACvDC,CACT,CACA,OAAAP,EAAU,UAAU,UAAY,SAAUS,EAAKC,EAAO,CAEpDD,EAAI,OAAOC,EAAM,GAAG,CAAC,EAAGA,EAAM,GAAG,CAAC,CAAC,EACnC,IAAIC,EAAQ,GACRC,EAAYF,EAAM,UAEtBD,EAAI,IAAIC,EAAM,GAAIA,EAAM,GAAIA,EAAM,EAAGA,EAAM,YAAaA,EAAM,UAAW,CAACE,CAAS,EAEnFH,EAAI,eAAeC,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,GAAIA,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,GAAIA,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,GAAIA,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,EAAGA,EAAM,GAAG,CAAC,EAAGA,EAAM,GAAG,CAAC,CAAC,EAE1OD,EAAI,IAAIC,EAAM,GAAIA,EAAM,GAAIA,EAAM,EAAGA,EAAM,YAAaA,EAAM,UAAW,CAACE,CAAS,EAEnFH,EAAI,eAAeC,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,GAAIA,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,GAAIA,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,GAAIA,EAAM,GAAKA,EAAM,GAAG,CAAC,GAAKC,EAAQD,EAAM,GAAG,CAAC,EAAGA,EAAM,GAAG,CAAC,EAAGA,EAAM,GAAG,CAAC,CAAC,EAC1OD,EAAI,UAAU,CAChB,EACAT,EAAU,UAAU,WAAa,SAAUG,EAAUC,EAAUC,EAASC,EAAYO,EAAa,CAC/F,IAAIC,EAAcX,EAAS,UACvBY,EAAOX,EAAS,MAAM,eAAeC,CAAO,EAC5CW,EAASD,EAAK,UAAU,EACxBE,EAAYF,EAAK,MAAM,SAAS,EAChCG,EAAYd,EAAS,aAAaW,EAAK,SAAS,EAChDI,EAAYD,EAAU,SAAS,WAAW,EAC1CE,EAAgBF,EAAU,SAAS,UAAU,EAC7CG,EAAQD,EAAc,IAAI,OAAO,EACjCV,EAAQY,EAAOC,GAAsBN,EAAU,SAAS,WAAW,EAAGD,EAAQ,EAAI,EAAGA,CAAM,EAC3FQ,EAAK,KAET,GAAI,MAAMd,EAAM,WAAW,GAAK,MAAMA,EAAM,WAAW,EAAG,CAExDc,EAAG,SAASd,CAAK,EACjB,MACF,CACIG,GACFW,EAAG,SAASd,CAAK,EACjBe,IAAcD,EAAIT,EAAMZ,EAAUgB,CAAS,IAE3CO,GAAaF,CAAE,EACfC,IAAcD,EAAIT,EAAMZ,EAAUgB,CAAS,EACnCQ,GAAYH,EAAI,CACtB,MAAOd,CACT,EAAGI,EAAaT,CAAO,GAEzBuB,GAAoB,KAAMP,IAAU,YAAcN,EAAK,uBAAuB,EAAIM,EAAOD,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,EACtJS,GAAyBL,EAAIN,EAAW,WAAW,EACnDd,EAAS,iBAAiBW,EAAK,UAAWS,CAAE,CAC9C,EACOxB,CACT,GAAU8B,EAAI,EAEd,SAASC,IAAcC,EAAWC,EAAMC,EAAUC,EAAgB,CAChE,IAAIC,EAAQH,EAAK,MACbI,EAAQJ,EAAK,MACbK,EAAYN,EAAU,MAC1BA,EAAU,SAASG,EAAe,aAAa,CAAC,EAChD,IAAII,EAAQJ,EAAe,IAAI,OAAO,EACtC,OAAQI,EAAO,CACb,IAAK,SAEHD,EAAU,KAAOJ,EAAS,cAAcE,EAAM,UAAW,OAAO,EAAE,KAClEE,EAAU,MAAQF,EAAM,UAAU,OAAO,EAAE,MAC3C,MACF,IAAK,SACHE,EAAU,KAAOJ,EAAS,cAAcG,EAAM,UAAW,OAAO,EAAE,KAClEC,EAAU,MAAQD,EAAM,UAAU,OAAO,EAAE,MAC3C,MACF,IAAK,WACH,IAAIG,EAAcN,EAAS,cAAcE,EAAM,UAAW,OAAO,EAAE,KAC/DK,EAAcP,EAAS,cAAcG,EAAM,UAAW,OAAO,EAAE,KACnE,GAAIK,GAASF,CAAW,GAAKE,GAASD,CAAW,EAAG,CAGlD,IAAIE,EAAQX,EAAU,MAClBY,GAASD,EAAM,GAAG,CAAC,EAAIA,EAAM,GAAG,CAAC,GAAK,EACtCE,GAASF,EAAM,GAAG,CAAC,EAAIA,EAAM,GAAG,CAAC,GAAK,EACtCG,GAASH,EAAM,GAAG,CAAC,EAAIA,EAAM,GAAG,CAAC,GAAK,EACtCI,GAASJ,EAAM,GAAG,CAAC,EAAIA,EAAM,GAAG,CAAC,GAAK,EAC1CL,EAAU,KAAO,IAAYU,GAAeJ,EAAOC,EAAOC,EAAOC,EAAO,CAAC,CACvE,OAAQ,EACR,MAAOP,CACT,EAAG,CACD,OAAQ,EACR,MAAOC,CACT,CAAC,EAAG,EAAI,CACV,CACA,KACJ,CACF,CCnHA,IAAIQ,IAAS,KAAK,GAAK,IACnBC,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAChBG,CACT,CACA,OAAAH,EAAU,UAAU,KAAO,SAAUI,EAASC,EAAK,CAAC,EACpDL,EAAU,UAAU,OAAS,SAAUM,EAAaF,EAASC,EAAK,CAChE,IAAIE,EAAOD,EAAY,QAAQ,EAC3BE,EAAU,KAAK,MACfC,EAAQ,KAAK,MACbC,EAAa,CAACJ,EAAY,IAAI,YAAY,EAAIP,IAuClD,GAtCAQ,EAAK,KAAKC,CAAO,EAAE,IAAI,SAAUG,EAAQ,CAQvC,IAAIC,EAASL,EAAK,cAAcI,CAAM,EACtC,GAAIC,EAAQ,CACV,IAAIC,EAAK,IAAIC,GAAWP,EAAMI,EAAQD,CAAU,EAChDK,GAAUF,CAAE,EAAE,UAAYF,EAC1BF,EAAM,IAAII,CAAE,CACd,CACF,CAAC,EAAE,OAAO,SAAUF,EAAQK,EAAQ,CAClC,IAAIH,EAAKL,EAAQ,iBAAiBQ,CAAM,EACpCJ,EAASL,EAAK,cAAcI,CAAM,EAQtC,GAAI,CAACC,EAAQ,CACXC,GAAcI,GAAyBJ,EAAIP,EAAaU,CAAM,EAC9D,MACF,CACKH,EAGHA,EAAG,WAAWN,EAAMI,EAAQD,CAAU,EAFtCG,EAAK,IAAIC,GAAWP,EAAMI,EAAQD,CAAU,EAI9CD,EAAM,IAAII,CAAE,CACd,CAAC,EAAE,OAAO,SAAUG,EAAQ,CAC1B,IAAIH,EAAKL,EAAQ,iBAAiBQ,CAAM,EACxCH,GAAcI,GAAyBJ,EAAIP,EAAaU,CAAM,CAChE,CAAC,EAAE,QAAQ,EACP,CAACR,EAAS,CACZ,IAAIU,EAASZ,EAAY,IAAI,QAAQ,EACrC,KAAK,MAAM,OAAS,IACpB,KAAK,MAAM,OAAS,IACpB,KAAK,MAAM,QAAUa,GAAaD,EAAO,CAAC,EAAGb,EAAI,SAAS,CAAC,EAC3D,KAAK,MAAM,QAAUc,GAAaD,EAAO,CAAC,EAAGb,EAAI,UAAU,CAAC,EACpDe,GAAU,KAAK,MAAO,CAC5B,OAAQ,EACR,OAAQ,CACV,EAAGd,CAAW,CAChB,CACA,KAAK,MAAQC,EACb,KAAK,YAAYD,EAAaI,CAAU,CAC1C,EACAV,EAAU,UAAU,YAAc,SAAUM,EAAaI,EAAY,CACnE,IAAIW,EAAWf,EAAY,QAAQ,EAC/BgB,EAAWhB,EAAY,YAAY,EACnCE,EAAU,KAAK,UACfC,EAAQ,KAAK,MACjBa,EAAS,KAAKd,CAAO,EAAE,IAAI,SAAUG,EAAQ,CAC3C,IAAIE,EAAK,IAAIU,IAAUF,EAAUC,EAAUX,EAAQD,CAAU,EAC7DK,GAAUF,CAAE,EAAE,UAAYF,EAC1BF,EAAM,IAAII,CAAE,CACd,CAAC,EAAE,OAAO,SAAUF,EAAQK,EAAQ,CAClC,IAAIH,EAAKL,EAAQ,iBAAiBQ,CAAM,EACxCH,EAAG,WAAWQ,EAAUC,EAAUX,EAAQD,CAAU,EACpDD,EAAM,IAAII,CAAE,CACd,CAAC,EAAE,OAAO,SAAUG,EAAQ,CAC1B,IAAIH,EAAKL,EAAQ,iBAAiBQ,CAAM,EACxCH,GAAcI,GAAyBJ,EAAIP,EAAaU,CAAM,CAChE,CAAC,EAAE,QAAQ,EACX,KAAK,UAAYM,CACnB,EACAtB,EAAU,UAAU,QAAU,UAAY,CAAC,EAC3CA,EAAU,KAAO,QACVA,CACT,GAAEwB,EAAS,EACJC,IAAQzB,ICzFf,IAAI0B,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KACvBG,CACT,CACA,OAAAH,EAAiB,UAAU,KAAO,SAAUI,EAAQ,CAClDH,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,EAC3C,KAAK,kBAAkBG,EAAO,OAASA,EAAO,KAAK,EAEnD,KAAK,qBAAuB,IAAIC,GAA4BC,GAAK,KAAK,QAAS,IAAI,EAAUA,GAAK,KAAK,WAAY,IAAI,CAAC,CAC1H,EACAN,EAAiB,UAAU,YAAc,SAAUI,EAAQ,CACzDH,EAAO,UAAU,YAAY,MAAM,KAAM,SAAS,EAClD,KAAK,kBAAkBG,EAAO,OAASA,EAAO,KAAK,CACrD,EACAJ,EAAiB,UAAU,eAAiB,SAAUI,EAAQG,EAAS,CACrE,IAAIC,EAAQJ,EAAO,OAASA,EAAO,OAAS,CAAC,EACzCK,EAAQL,EAAO,MAAQA,EAAO,OAAS,CAAC,EAC5C,GAAIK,GAASD,EAAO,CAClB,IAAIE,EAAQC,GAAwBF,EAAOD,EAAO,KAAM,GAAMI,CAAU,EACxE,OAAOF,EAAM,IACf,CACA,SAASE,EAAWC,EAAUC,EAAU,CAEtC,IAAIC,EAAcC,GAAM,UAAU,SAClC,SAASC,EAAYC,EAAMC,EAAa,CACtC,IAAIC,EAAQL,EAAY,KAAK,KAAMG,EAAMC,CAAW,EACpD,OAAAC,EAAM,kBAAoBC,EACnBD,CACT,CACAN,EAAS,WAAW,eAAgB,SAAUM,EAAO,CACnD,OAAAA,EAAM,kBAAoBC,EAC1BD,EAAM,SAAWH,EACVG,CACT,CAAC,EACD,SAASC,EAAkBC,EAAS,CAClC,GAAIA,IAAYA,EAAQ,CAAC,IAAM,SAAWA,EAAQ,CAAC,IAAM,SAAU,CACjE,IAAIC,EAAaD,EAAQ,MAAM,EAC/B,OAAIA,EAAQ,CAAC,IAAM,QACjBC,EAAW,CAAC,EAAI,YACPD,EAAQ,CAAC,IAAM,UACxBC,EAAW,CAAC,EAAI,aAEXA,CACT,CACA,OAAOD,CACT,CACF,CACF,EACAtB,EAAiB,UAAU,SAAW,UAAY,CAChD,OAAO,KAAK,QAAQ,EAAE,KACxB,EACAA,EAAiB,UAAU,YAAc,UAAY,CACnD,OAAO,KAAK,SAAS,EAAE,QACzB,EACAA,EAAiB,UAAU,cAAgB,SAAUwB,EAAWC,EAAgBC,EAAU,CACxF,IAAIC,EAAS,KAAK,cAAcH,EAAWE,CAAQ,EACnD,GAAIA,IAAa,OAAQ,CACvB,IAAIb,EAAW,KAAK,QAAQ,EACxBe,EAAOf,EAAS,MAAM,eAAeW,CAAS,EAC9CK,EAAahB,EAAS,QAAQe,EAAK,MAAM,SAAS,EAClDE,EAAajB,EAAS,QAAQe,EAAK,MAAM,SAAS,EAClDG,EAAU,CAAC,EACf,OAAAF,GAAc,MAAQE,EAAQ,KAAKF,CAAU,EAC7CC,GAAc,MAAQC,EAAQ,KAAKD,CAAU,EACtCE,GAAoB,YAAa,CACtC,KAAMD,EAAQ,KAAK,KAAK,EACxB,MAAOJ,EAAO,MACd,QAASA,EAAO,OAAS,IAC3B,CAAC,CACH,CAEA,OAAOK,GAAoB,YAAa,CACtC,KAAML,EAAO,KACb,MAAOA,EAAO,MACd,QAASA,EAAO,OAAS,IAC3B,CAAC,CACH,EACA3B,EAAiB,UAAU,cAAgB,SAAUwB,EAAWE,EAAU,CACxE,IAAIC,EAAS1B,EAAO,UAAU,cAAc,KAAK,KAAMuB,EAAWE,CAAQ,EAC1E,GAAIA,IAAa,OAAQ,CACvB,IAAIb,EAAW,KAAK,QAAQ,EACxBoB,EAAO,KAAK,SAAS,EAAE,eAAeT,CAAS,EAMnD,GAJIG,EAAO,MAAQ,OACjBA,EAAO,KAAOd,EAAS,QAAQW,CAAS,GAGtCG,EAAO,OAAS,KAAM,CACxB,IAAIO,EAAYD,EAAK,UAAU,EAAE,MACjCN,EAAO,MAAQO,CACjB,CACF,CACA,OAAOP,CACT,EACA3B,EAAiB,KAAO,eACxBA,EAAiB,cAAgB,CAE/B,EAAG,EACH,iBAAkB,OAClB,gBAAiB,GACjB,QAAS,OACT,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,EACR,MAAO,KACP,OAAQ,KACR,OAAQ,CAAC,MAAO,KAAK,EACrB,OAAQ,CAAC,MAAO,KAAK,EACrB,UAAW,GACX,WAAY,GACZ,SAAU,OACV,SAAU,EACV,SAAU,EACV,UAAW,CACT,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAC3B,EACA,UAAW,CACT,MAAO,EACP,MAAO,SACP,QAAS,EACX,EACA,MAAO,CACL,KAAM,GACN,SAAU,UACV,SAAU,CACZ,EACA,SAAU,CACR,MAAO,YACP,UAAW,CACT,QAAS,EACX,CACF,CACF,EACOA,CACT,GAAEmC,EAAW,EACNC,IAAQpC,IChJf,IAAIqC,GAAS,KAAK,GAAK,IACR,SAARC,GAAqCC,EAASC,EAAK,CACxDD,EAAQ,iBAAiB,QAAS,SAAUE,EAAa,CACvDC,IAAYD,EAAaD,CAAG,CAC9B,CAAC,CACH,CACA,SAASE,IAAYD,EAAaD,EAAK,CACrC,IAAIG,EAAWF,EAAY,QAAQ,EAC/BG,EAAYD,EAAS,MACrBE,EAAWJ,EAAY,YAAY,EACnCK,EAAYD,EAAS,MAAM,EAC/B,GAAKC,EAGL,KAAIC,EAAKC,GAAgBP,EAAaD,CAAG,EACvCS,EAAKF,EAAG,GACRG,EAAKH,EAAG,GACRI,EAAIJ,EAAG,EACPK,EAAKL,EAAG,GACNM,EAAW,KAAK,KAAKZ,EAAY,IAAI,UAAU,GAAK,GAAKJ,GAAQ,CAAC,EAClEiB,EAAW,KAAK,KAAKb,EAAY,IAAI,UAAU,GAAK,GAAKJ,GAAQ,CAAC,EAClEkB,EAAa,CAACd,EAAY,IAAI,YAAY,EAAIJ,GAC9CmB,EAAWD,EAAa,KAAK,GAAK,EAClCE,EAAYhB,EAAY,IAAI,WAAW,EACvCiB,EAAMD,EAAY,EAAI,GAEtBE,EAAS,CAACJ,EAAYC,CAAQ,EAClCI,GAAmBD,EAAQ,CAACF,CAAS,EACrC,IAAII,EAAuBF,EAAO,CAAC,EACjCG,EAAqBH,EAAO,CAAC,EAC3BI,EAAaD,EAAqBD,EAClCG,EAAUrB,EAAS,OAAO,OAAO,IAAM,GAAKE,EAAS,OAAO,OAAO,IAAM,EAEzEoB,EAAa,CAAC,EACdC,EAAoB,EACxBtB,EAAU,SAAS,SAAUuB,EAAM,CAEjC,IAAIC,EAAQJ,EAAU,EAAIG,EAAK,SAAS,OAAO,EAC3CH,IAAYI,EAAQ,GAAKd,KAG3BY,GAAqB,GAEvB,IAAIG,EAAaF,EAAK,MAAM,UACxBG,EAAaH,EAAK,MAAM,UAC5BF,EAAWI,CAAU,GAAKJ,EAAWI,CAAU,GAAK,GAAKD,EACzDH,EAAWK,CAAU,GAAKL,EAAWK,CAAU,GAAK,GAAKF,CAC3D,CAAC,EAED,IAAIG,EAAe,EAanB,GAZA3B,EAAU,SAAS,SAAU4B,EAAM,CACjC,IAAIC,EAAYD,EAAK,SAAS,OAAO,EAChC,MAAMC,CAAS,IAClBR,EAAWO,EAAK,SAAS,EAAI,KAAK,IAAIC,EAAWR,EAAWO,EAAK,SAAS,GAAK,CAAC,GAE9E,CAACR,IAAYC,EAAWO,EAAK,SAAS,EAAI,GAAKlB,IAGjDY,IAEFK,GAAgBN,EAAWO,EAAK,SAAS,GAAK,CAChD,CAAC,EACG,EAAAN,IAAsB,GAAKK,IAAiB,GAGhD,CAAIlB,EAAWa,GAAqB,KAAK,IAAIH,CAAU,IAErDV,EAAW,KAAK,IAAI,GAAI,KAAK,IAAIU,CAAU,EAAIT,EAAWY,GAAqBA,CAAiB,IAE7Fb,EAAWC,GAAYY,GAAqB,KAAK,IAAIH,CAAU,IAElET,GAAY,KAAK,IAAIS,CAAU,EAAIV,EAAWa,GAAqBA,GAErE,IAAIQ,GAAaX,EAAaV,EAAWa,EAAoBR,GAAOa,EAChEI,EAAe,EACfC,EAAe,EACfC,EAAmB,EACnBC,EAAa,IACjBlC,EAAU,SAAS,SAAU4B,EAAM,CACjC,IAAIJ,EAAQH,EAAWO,EAAK,SAAS,GAAK,EACtCO,EAAYL,GAAaH,EAAeH,EAAQ,GAAKV,EACrD,KAAK,IAAIqB,CAAS,EAAIzB,EACxBqB,GAAgBrB,EAAW,KAAK,IAAIyB,CAAS,GAE7CD,EAAa,KAAK,IAAIA,EAAY,KAAK,IAAIC,CAAS,EAAIzB,CAAQ,EAChEsB,GAAgB,KAAK,IAAIG,CAAS,EAAIzB,EACtCuB,GAAoB,KAAK,IAAIE,CAAS,GAExCP,EAAK,UAAU,CACb,MAAOO,EACP,MAAOX,CACT,CAAC,CACH,CAAC,EACD,IAAIY,EAA0B,GAC9B,GAAIL,EAAeC,EAAc,CAE/B,IAAIK,EAAUN,EAAeC,EAC7BhC,EAAU,SAAS,SAAU4B,EAAM,CACjC,IAAIO,EAAYP,EAAK,UAAU,EAAE,MAC7B,KAAK,IAAIO,CAAS,GAAKzB,EACzBkB,EAAK,UAAU,CACb,MAAOO,EAAYE,EACnB,MAAOA,CACT,EAAG,EAAI,EAEPT,EAAK,UAAU,CACb,MAAOlB,EACP,MAAOA,IAAa,EAAI,EAAIyB,EAAYzB,CAC1C,EAAG,EAAI,CAEX,CAAC,CACH,MAMEV,EAAU,SAAS,SAAU4B,EAAM,CACjC,GAAI,CAAAQ,EAGJ,KAAID,EAAYP,EAAK,UAAU,EAAE,MAC7BU,EAAc,KAAK,IAAIH,EAAYF,EAAkB,CAAC,EACtDM,EAAcD,EAAcP,EAC5BI,EAAYI,EAAc7B,IAE5B0B,EAA0B,IAE9B,CAAC,EAEH,IAAII,EAAcT,EAClB/B,EAAU,SAAS,SAAU4B,EAAM,CACjC,GAAI,EAAAY,GAAe,GAGnB,KAAIL,EAAYP,EAAK,UAAU,EAAE,MACjC,GAAIO,EAAYzB,GAAYA,EAAW,EAAG,CACxC,IAAI4B,EAAcF,EAA0B,EAAI,KAAK,IAAID,EAAYF,EAAkB,CAAC,EACpFQ,EAAiBN,EAAYzB,EAC7B6B,GAAc,KAAK,IAAIE,EAAgB,KAAK,IAAID,EAAaT,EAAeO,CAAW,CAAC,EAC5FE,GAAeD,GACfX,EAAK,UAAU,CACb,MAAOO,EAAYI,GACnB,OAAQJ,EAAYI,IAAeJ,CACrC,EAAG,EAAI,CACT,MAAWzB,EAAW,GACpBkB,EAAK,UAAU,CACb,MAAOlB,EACP,MAAOyB,IAAc,EAAI,EAAIzB,EAAWyB,CAC1C,EAAG,EAAI,EAEX,CAAC,EACD,IAAIO,EAAQzB,EACR0B,EAAe,CAAC,EACpB3C,EAAU,SAAS,SAAU4B,EAAM,CACjC,IAAIO,EAAY,KAAK,IAAIP,EAAK,UAAU,EAAE,MAAOlB,CAAQ,EACzDkB,EAAK,UAAU,CACb,GAAIvB,EACJ,GAAIC,EACJ,GAAIE,EACJ,EAAGD,EACH,WAAYmC,EACZ,SAAUA,EAAQP,EAAYrB,EAC9B,UAAWD,CACb,EAAG,EAAI,EACP8B,EAAaf,EAAK,SAAS,EAAIc,EAC/BA,IAAUP,EAAY1B,GAAYK,CACpC,CAAC,EACDd,EAAU,SAAS,SAAUuB,EAAM,CACjC,IAAIC,EAAQJ,EAAU,EAAIG,EAAK,SAAS,OAAO,EAC3CY,EAAYL,GAAaH,EAAeH,EAAQ,GAAKV,EACrDW,EAAaF,EAAK,MAAM,UACxBqB,GAAcD,EAAalB,CAAU,GAAK,EAC1CoB,GAAQ,KAAK,KAAKtB,EAAK,MAAM,UAAU,EAAE,OAAS,GAAKY,CAAS,EAChEW,GAAYF,GAAcC,GAAQ/B,EAClCiC,GAAK,CAAC1C,EAAKG,EAAK,KAAK,IAAIoC,EAAW,EAAGtC,EAAKE,EAAK,KAAK,IAAIoC,EAAW,CAAC,EACtEI,GAAK,CAAC3C,EAAKG,EAAK,KAAK,IAAIsC,EAAS,EAAGxC,EAAKE,EAAK,KAAK,IAAIsC,EAAS,CAAC,EAClEpB,EAAaH,EAAK,MAAM,UACxB0B,EAAcN,EAAajB,CAAU,GAAK,EAC1CwB,GAAQ,KAAK,KAAK3B,EAAK,MAAM,UAAU,EAAE,OAAS,GAAKY,CAAS,EAChEgB,GAAYF,EAAcC,GAAQpC,EAClCsC,GAAK,CAAC/C,EAAKG,EAAK,KAAK,IAAIyC,CAAW,EAAG3C,EAAKE,EAAK,KAAK,IAAIyC,CAAW,CAAC,EACtEI,GAAK,CAAChD,EAAKG,EAAK,KAAK,IAAI2C,EAAS,EAAG7C,EAAKE,EAAK,KAAK,IAAI2C,EAAS,CAAC,EACtE5B,EAAK,UAAU,CACb,GAAIwB,GACJ,GAAIC,GACJ,YAAaJ,GACb,UAAWE,GACX,GAAIM,GACJ,GAAIC,GACJ,YAAaJ,EACb,UAAWE,GACX,GAAI9C,EACJ,GAAIC,EACJ,EAAGE,EACH,MAAOgB,EACP,UAAWX,CACb,CAAC,EACD8B,EAAalB,CAAU,EAAIqB,GAC3BH,EAAajB,CAAU,EAAIyB,EAC7B,CAAC,GACH,CCvMO,SAASG,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAS,EACrCD,EAAU,oBAAoBE,GAAgB,EAC9CF,EAAU,eAAeA,EAAU,SAAS,OAAO,kBAAmBG,EAAW,EAEjFH,EAAU,kBAAkBI,GAAW,OAAO,CAAC,CACjD,CCRA,IAAIC,KAA4B,UAAY,CAC1C,SAASA,GAAe,CACtB,KAAK,MAAQ,EACb,KAAK,MAAQ,GACb,KAAK,EAAI,GACT,KAAK,EAAI,EACT,KAAK,EAAI,CACX,CACA,OAAOA,CACT,GAAE,EACEC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,EAAYG,EAAM,CACzB,IAAIC,EAAQH,EAAO,KAAK,KAAME,CAAI,GAAK,KACvC,OAAAC,EAAM,KAAO,UACNA,CACT,CACA,OAAAJ,EAAY,UAAU,gBAAkB,UAAY,CAClD,OAAO,IAAID,GACb,EACAC,EAAY,UAAU,UAAY,SAAUK,EAAKC,EAAO,CACtD,IAAIC,EAAU,KAAK,IACfC,EAAU,KAAK,IACfC,EAAIH,EAAM,EACVI,EAAQJ,EAAM,MACdK,EAAQL,EAAM,MACdM,EAAIN,EAAM,EAAIC,EAAQI,CAAK,EAAID,GAASA,GAASD,EAAI,EAAI,EAAI,GAC7DI,EAAIP,EAAM,EAAIE,EAAQG,CAAK,EAAID,GAASA,GAASD,EAAI,EAAI,EAAI,GACjEE,EAAQL,EAAM,MAAQ,KAAK,GAAK,EAChCD,EAAI,OAAOO,EAAGC,CAAC,EACfR,EAAI,OAAOC,EAAM,EAAIC,EAAQI,CAAK,EAAID,EAAOJ,EAAM,EAAIE,EAAQG,CAAK,EAAID,CAAK,EAC7EL,EAAI,OAAOC,EAAM,EAAIC,EAAQD,EAAM,KAAK,EAAIG,EAAGH,EAAM,EAAIE,EAAQF,EAAM,KAAK,EAAIG,CAAC,EACjFJ,EAAI,OAAOC,EAAM,EAAIC,EAAQI,CAAK,EAAID,EAAOJ,EAAM,EAAIE,EAAQG,CAAK,EAAID,CAAK,EAC7EL,EAAI,OAAOO,EAAGC,CAAC,CACjB,EACOb,CACT,GAAEc,EAAI,EACCC,IAAQf,IC1Bf,SAASgB,IAAcC,EAAaC,EAAK,CACvC,IAAIC,EAASF,EAAY,IAAI,QAAQ,EACjCG,EAAQF,EAAI,SAAS,EACrBG,EAASH,EAAI,UAAU,EACvBI,EAAO,KAAK,IAAIF,EAAOC,CAAM,EAC7BE,EAAKC,GAAaL,EAAO,CAAC,EAAGD,EAAI,SAAS,CAAC,EAC3CO,EAAKD,GAAaL,EAAO,CAAC,EAAGD,EAAI,UAAU,CAAC,EAC5CQ,EAAIF,GAAaP,EAAY,IAAI,QAAQ,EAAGK,EAAO,CAAC,EACxD,MAAO,CACL,GAAIC,EACJ,GAAIE,EACJ,EAAGC,CACL,CACF,CACA,SAASC,GAAYC,EAAOC,EAAgB,CAC1C,IAAIC,EAAQF,GAAS,KAAO,GAAKA,EAAQ,GACzC,OAAIC,IACEE,GAASF,CAAc,EACzBC,EAAQD,EAAe,QAAQ,UAAWC,CAAK,EACtCE,GAAWH,CAAc,IAClCC,EAAQD,EAAeD,CAAK,IAGzBE,CACT,CACA,IAAIG,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAChBG,CACT,CACA,OAAAH,EAAU,UAAU,OAAS,SAAUhB,EAAaoB,EAASnB,EAAK,CAChE,KAAK,MAAM,UAAU,EACrB,IAAIoB,EAAYrB,EAAY,IAAI,CAAC,WAAY,YAAa,OAAO,CAAC,EAC9DsB,EAAUvB,IAAcC,EAAaC,CAAG,EAC5C,KAAK,YAAYD,EAAaoB,EAASnB,EAAKoB,EAAWC,CAAO,EAC9D,KAAK,MAAQtB,EAAY,QAAQ,CACnC,EACAgB,EAAU,UAAU,QAAU,UAAY,CAAC,EAC3CA,EAAU,UAAU,YAAc,SAAUhB,EAAaoB,EAASnB,EAAKoB,EAAWC,EAAS,CACzF,IAAIC,EAAQ,KAAK,MACbC,EAAYxB,EAAY,IAAI,WAAW,EACvCyB,EAAa,CAACzB,EAAY,IAAI,YAAY,EAAI,IAAM,KAAK,GACzD0B,EAAW,CAAC1B,EAAY,IAAI,UAAU,EAAI,IAAM,KAAK,GACrD2B,EAAgB3B,EAAY,SAAS,UAAU,EAC/C4B,EAAWD,EAAc,IAAI,UAAU,EACvCE,EAAWD,EAAWE,GAAkBC,GACxCC,EAAWL,EAAc,IAAI,MAAM,EACnCM,EAAiBN,EAAc,SAAS,WAAW,EACnDO,EAAgBD,EAAe,IAAI,OAAO,EAC1CE,EAAS,CAACV,EAAYC,CAAQ,EAClCU,GAAmBD,EAAQ,CAACX,CAAS,EACrCC,EAAaU,EAAO,CAAC,EACrBT,EAAWS,EAAO,CAAC,EAInB,QAHIE,EAAiBX,EAAWD,EAC5Ba,EAAeb,EACfc,EAAU,CAAC,EACNC,EAAI,EAAGR,GAAYQ,EAAInB,EAAU,OAAQmB,IAAK,CAErD,IAAIC,EAAU,KAAK,IAAI,KAAK,IAAIpB,EAAUmB,CAAC,EAAE,CAAC,EAAG,CAAC,EAAG,CAAC,EACtDd,EAAWD,EAAaY,EAAiBI,EACzC,IAAIC,EAAS,IAAIb,EAAS,CACxB,MAAO,CACL,WAAYS,EACZ,SAAUZ,EACV,GAAIJ,EAAQ,GACZ,GAAIA,EAAQ,GACZ,UAAWE,EACX,GAAIF,EAAQ,EAAIY,EAChB,EAAGZ,EAAQ,CACb,EACA,OAAQ,EACV,CAAC,EACDoB,EAAO,SAAS,CACd,KAAMrB,EAAUmB,CAAC,EAAE,CAAC,CACtB,CAAC,EACDE,EAAO,SAAST,EAAe,aAG/B,CAAC,QAAS,OAAO,CAAC,CAAC,EACnBM,EAAQ,KAAKG,CAAM,EACnBJ,EAAeZ,CACjB,CACAa,EAAQ,QAAQ,EAChBI,EAAKJ,EAAS,SAAUG,EAAQ,CAC9B,OAAOnB,EAAM,IAAImB,CAAM,CACzB,CAAC,EACD,IAAIE,EAAW,SAAUH,EAAS,CAEhC,GAAIA,GAAW,EACb,OAAOpB,EAAU,CAAC,EAAE,CAAC,EAEvB,IAAImB,EACJ,IAAKA,EAAI,EAAGA,EAAInB,EAAU,OAAQmB,IAChC,GAAInB,EAAUmB,CAAC,EAAE,CAAC,GAAKC,IAAYD,IAAM,EAAI,EAAInB,EAAUmB,EAAI,CAAC,EAAE,CAAC,GAAKC,EACtE,OAAOpB,EAAUmB,CAAC,EAAE,CAAC,EAIzB,OAAOnB,EAAUmB,EAAI,CAAC,EAAE,CAAC,CAC3B,EACA,KAAK,aAAaxC,EAAaoB,EAASnB,EAAK2C,EAAUtB,EAASG,EAAYC,EAAUF,EAAWU,CAAa,EAC9G,KAAK,sBAAsBlC,EAAaoB,EAASnB,EAAK2C,EAAUtB,CAAO,EACvE,KAAK,cAActB,EAAasB,CAAO,EACvC,KAAK,eAAetB,EAAaoB,EAASnB,EAAK2C,EAAUtB,EAASG,EAAYC,EAAUF,EAAWU,CAAa,CAClH,EACAlB,EAAU,UAAU,aAAe,SAAUhB,EAAaoB,EAASnB,EAAK2C,EAAUtB,EAASG,EAAYC,EAAUF,EAAWU,EAAe,CAsBzI,QArBIX,EAAQ,KAAK,MACbjB,EAAKgB,EAAQ,GACbd,EAAKc,EAAQ,GACbb,EAAIa,EAAQ,EACZuB,EAAS,CAAC7C,EAAY,IAAI,KAAK,EAC/B8C,EAAS,CAAC9C,EAAY,IAAI,KAAK,EAC/B+C,EAAiB/C,EAAY,SAAS,WAAW,EACjDgD,EAAYhD,EAAY,SAAS,UAAU,EAC3CiD,EAAajD,EAAY,SAAS,WAAW,EAC7CkD,EAAclD,EAAY,IAAI,aAAa,EAC3CmD,EAAiBH,EAAU,IAAI,aAAa,EAC5CI,EAAe7C,GAAawC,EAAe,IAAI,QAAQ,EAAGtC,CAAC,EAC3D4C,EAAU9C,GAAayC,EAAU,IAAI,QAAQ,EAAGvC,CAAC,EACjD6C,EAAQ7B,EACR8B,GAAQ7B,EAAWD,GAAcyB,EACjCM,EAAUD,EAAOJ,EACjBM,EAAiBV,EAAe,SAAS,WAAW,EAAE,aAAa,EACnEW,EAAgBV,EAAU,SAAS,WAAW,EAAE,aAAa,EAC7DW,EAAoBZ,EAAe,IAAI,UAAU,EACjDa,EACAC,EACKrB,EAAI,EAAGA,GAAKU,EAAaV,IAAK,CAIrC,GAHAoB,EAAQ,KAAK,IAAIN,CAAK,EACtBO,EAAQ,KAAK,IAAIP,CAAK,EAElBP,EAAe,IAAI,MAAM,EAAG,CAC9B,IAAIe,EAAWH,EAAoBA,EAAoBzB,EAAgBA,EACnE6B,EAAY,IAAYC,GAAK,CAC/B,MAAO,CACL,GAAIJ,GAASnD,EAAIqD,GAAYxD,EAC7B,GAAIuD,GAASpD,EAAIqD,GAAYtD,EAC7B,GAAIoD,GAASnD,EAAI2C,EAAeU,GAAYxD,EAC5C,GAAIuD,GAASpD,EAAI2C,EAAeU,GAAYtD,CAC9C,EACA,MAAOiD,EACP,OAAQ,EACV,CAAC,EACGA,EAAe,SAAW,QAC5BM,EAAU,SAAS,CACjB,OAAQnB,EAASJ,EAAIU,CAAW,CAClC,CAAC,EAEH3B,EAAM,IAAIwC,CAAS,CACrB,CAEA,GAAId,EAAW,IAAI,MAAM,EAAG,CAC1B,IAAIa,EAAWb,EAAW,IAAI,UAAU,EAAIU,EACxC9C,EAAQH,GAAYuD,GAAMzB,EAAIU,GAAeJ,EAASD,GAAUA,CAAM,EAAGI,EAAW,IAAI,WAAW,CAAC,EACpGiB,EAAYtB,EAASJ,EAAIU,CAAW,EACpCiB,EAAaP,GAASnD,EAAI2C,EAAeU,GAAYxD,EACrD8D,EAAaP,GAASpD,EAAI2C,EAAeU,GAAYtD,EACrD6D,GAAapB,EAAW,IAAI,QAAQ,EACpCqB,GAAS,EACTD,KAAe,UACjBC,GAAS,CAAChB,EAAQ,EAAI,KAAK,GACvBgB,GAAS,KAAK,GAAK,IACrBA,IAAU,KAAK,KAERD,KAAe,aACxBC,GAAS,CAAChB,EAAQ,KAAK,GAAK,EACnBiB,GAASF,EAAU,IAC5BC,GAASD,GAAa,KAAK,GAAK,KAE9BC,KAAW,EACb/C,EAAM,IAAI,IAAYiD,GAAK,CACzB,MAAOC,GAAgBxB,EAAY,CACjC,KAAMpC,EACN,EAAGsD,EACH,EAAGC,EACH,cAAeP,EAAQ,IAAO,MAAQA,EAAQ,GAAM,SAAW,SAC/D,MAAOD,EAAQ,IAAO,OAASA,EAAQ,GAAM,QAAU,QACzD,EAAG,CACD,aAAcM,CAChB,CAAC,EACD,OAAQ,EACV,CAAC,CAAC,EAEF3C,EAAM,IAAI,IAAYiD,GAAK,CACzB,MAAOC,GAAgBxB,EAAY,CACjC,KAAMpC,EACN,EAAGsD,EACH,EAAGC,EACH,cAAe,SACf,MAAO,QACT,EAAG,CACD,aAAcF,CAChB,CAAC,EACD,OAAQ,GACR,QAASC,EACT,QAASC,EACT,SAAUE,EACZ,CAAC,CAAC,CAEN,CAEA,GAAItB,EAAU,IAAI,MAAM,GAAKR,IAAMU,EAAa,CAC9C,IAAIY,EAAWd,EAAU,IAAI,UAAU,EACvCc,EAAWA,EAAWA,EAAW5B,EAAgBA,EACjD,QAASwC,GAAI,EAAGA,IAAKvB,EAAgBuB,KAAK,CACxCd,EAAQ,KAAK,IAAIN,CAAK,EACtBO,EAAQ,KAAK,IAAIP,CAAK,EACtB,IAAIqB,GAAW,IAAYX,GAAK,CAC9B,MAAO,CACL,GAAIJ,GAASnD,EAAIqD,GAAYxD,EAC7B,GAAIuD,GAASpD,EAAIqD,GAAYtD,EAC7B,GAAIoD,GAASnD,EAAI4C,EAAUS,GAAYxD,EACvC,GAAIuD,GAASpD,EAAI4C,EAAUS,GAAYtD,CACzC,EACA,OAAQ,GACR,MAAOkD,CACT,CAAC,EACGA,EAAc,SAAW,QAC3BiB,GAAS,SAAS,CAChB,OAAQ/B,GAAUJ,EAAIkC,GAAIvB,GAAkBD,CAAW,CACzD,CAAC,EAEH3B,EAAM,IAAIoD,EAAQ,EAClBrB,GAASE,CACX,CACAF,GAASE,CACX,MACEF,GAASC,CAEb,CACF,EACAvC,EAAU,UAAU,eAAiB,SAAUhB,EAAaoB,EAASnB,EAAK2C,EAAUtB,EAASG,EAAYC,EAAUF,EAAWU,EAAe,CAC3I,IAAIX,EAAQ,KAAK,MACbqD,EAAU,KAAK,MACfC,EAAkB,KAAK,aACvBC,EAAe,CAAC,EAChBC,EAAc/E,EAAY,IAAI,CAAC,UAAW,MAAM,CAAC,EACjDgF,EAAgBhF,EAAY,SAAS,UAAU,EAC/CiF,EAAeD,EAAc,IAAI,MAAM,EACvCE,EAAOlF,EAAY,QAAQ,EAC3BmF,EAAWD,EAAK,aAAa,OAAO,EACpCrC,EAAS,CAAC7C,EAAY,IAAI,KAAK,EAC/B8C,EAAS,CAAC9C,EAAY,IAAI,KAAK,EAC/BoF,EAAc,CAACvC,EAAQC,CAAM,EAC7BuC,EAAc,CAAC5D,EAAYC,CAAQ,EACvC,SAAS4D,EAAcC,EAAKjC,EAAO,CACjC,IAAIkC,EAAYN,EAAK,aAAaK,CAAG,EACjCE,EAAeD,EAAU,SAAS,SAAS,EAC3CE,EAAenF,GAAakF,EAAa,IAAI,OAAO,EAAGnE,EAAQ,CAAC,EAChEqE,EAAgBpF,GAAakF,EAAa,IAAI,QAAQ,EAAGnE,EAAQ,CAAC,EAClEsE,EAAa5F,EAAY,IAAI,CAAC,UAAW,MAAM,CAAC,EAChD6F,EAAgBJ,EAAa,IAAI,cAAc,EAC/CK,EAAiBvF,GAAasF,EAAc,CAAC,EAAGvE,EAAQ,CAAC,EACzDyE,EAAiBxF,GAAasF,EAAc,CAAC,EAAGvE,EAAQ,CAAC,EACzD0E,EAAoBP,EAAa,IAAI,YAAY,EACjDQ,EAEJ,OAAIL,EACFK,EAAUC,GAAaN,EAAYE,EAAiBJ,EAAe,EAAGK,EAAiBJ,EAAeD,EAAcC,EAAe,KAAMK,CAAiB,EAE1JC,EAAU,IAAIE,IAAY,CACxB,MAAO,CACL,MAAO,CAAC,KAAK,GAAK,EAClB,MAAOT,EACP,EAAGC,EACH,EAAGG,EACH,EAAGC,CACL,CACF,CAAC,EAEHE,EAAQ,SAAW,EAAE3C,EAAQ,KAAK,GAAK,GACvC2C,EAAQ,EAAI3E,EAAQ,GACpB2E,EAAQ,EAAI3E,EAAQ,GACb2E,CACT,CACA,SAASG,EAAeb,EAAK7D,EAAU,CACrC,IAAIE,EAAWoD,EAAc,IAAI,UAAU,EACvCqB,EAAezE,EAAWE,GAAkBC,GAC5CuE,EAAYtB,EAAc,IAAI,SAAS,EACvCuB,EAAgBD,EAAYtB,EAAc,IAAI,OAAO,EAAI9C,EAAgBgD,EAAK,MAAM,EACpFsB,EAAKF,EAAYhF,EAAQ,EAAIiF,EAAgBjF,EAAQ,GAAKiE,EAAM,GAAKgB,EACrE9F,EAAI6F,EAAYhF,EAAQ,EAAIA,EAAQ,EAAIiE,EAAMgB,EAC9CE,EAAW,IAAIJ,EAAa,CAC9B,MAAO,CACL,WAAY5E,EACZ,SAAUC,EACV,GAAIJ,EAAQ,GACZ,GAAIA,EAAQ,GACZ,UAAWE,EACX,GAAIgF,EACJ,EAAG/F,CACL,CACF,CAAC,EACD,OAAA6F,IAAcG,EAAS,GAAKC,GAAUxB,EAAK,IAAIC,EAAUI,CAAG,EAAG,CAAC1C,EAAQC,CAAM,EAAG,CAAC,IAAK,CAAC,EAAG,EAAI,GACxF2D,CACT,EACIxB,GAAgBF,KAClBG,EAAK,KAAKN,CAAO,EAAE,IAAI,SAAUW,EAAK,CACpC,IAAIoB,EAAMzB,EAAK,IAAIC,EAAUI,CAAG,EAChC,GAAIR,EAAa,CACf,IAAIkB,EAAUX,EAAcC,EAAK9D,CAAU,EAEnCmF,GAAUX,EAAS,CACzB,SAAU,GAAG,MAAM,CAACU,CAAG,EAAItB,EAAY,CAAC,EAAIqB,GAAUC,EAAKvB,EAAaC,EAAa,EAAI,GAAK,KAAK,GAAK,EAC1G,EAAGrF,CAAW,EACduB,EAAM,IAAI0E,CAAO,EACjBf,EAAK,iBAAiBK,EAAKU,CAAO,CACpC,CACA,GAAIhB,EAAc,CAChB,IAAIwB,EAAWL,EAAeb,EAAK9D,CAAU,EACzCoF,EAAS7B,EAAc,IAAI,MAAM,EAC7B4B,GAAUH,EAAU,CAC1B,MAAO,CACL,SAAUC,GAAUC,EAAKvB,EAAaC,EAAawB,CAAM,CAC3D,CACF,EAAG7G,CAAW,EACduB,EAAM,IAAIkF,CAAQ,EAGlBK,GAAgB9G,EAAY,YAAakF,EAAK,SAAUK,EAAKkB,CAAQ,EACrE3B,EAAaS,CAAG,EAAIkB,CACtB,CACF,CAAC,EAAE,OAAO,SAAUM,EAAQC,EAAQ,CAClC,IAAIL,EAAMzB,EAAK,IAAIC,EAAU4B,CAAM,EACnC,GAAIhC,EAAa,CACf,IAAIkC,EAAkBrC,EAAQ,iBAAiBoC,CAAM,EACjDE,EAAiBD,EAAkBA,EAAgB,SAAWxF,EAC9DwE,EAAUX,EAAcyB,EAAQG,CAAc,EAClDjB,EAAQ,SAAWiB,EACXC,GAAYlB,EAAS,CAC3B,SAAU,GAAG,MAAM,CAACU,CAAG,EAAItB,EAAY,CAAC,EAAIqB,GAAUC,EAAKvB,EAAaC,EAAa,EAAI,GAAK,KAAK,GAAK,EAC1G,EAAGrF,CAAW,EACduB,EAAM,IAAI0E,CAAO,EACjBf,EAAK,iBAAiB6B,EAAQd,CAAO,CACvC,CACA,GAAIhB,EAAc,CAChB,IAAImC,EAAmBvC,EAAgBmC,CAAM,EACzCK,EAAmBD,EAAmBA,EAAiB,MAAM,SAAW3F,EACxEgF,EAAWL,EAAeW,EAAQM,CAAgB,EAClDR,EAAS7B,EAAc,IAAI,MAAM,EAC7BmC,GAAYV,EAAU,CAC5B,MAAO,CACL,SAAUC,GAAUC,EAAKvB,EAAaC,EAAawB,CAAM,CAC3D,CACF,EAAG7G,CAAW,EACduB,EAAM,IAAIkF,CAAQ,EAGlBK,GAAgB9G,EAAY,YAAakF,EAAK,SAAU6B,EAAQN,CAAQ,EACxE3B,EAAaiC,CAAM,EAAIN,CACzB,CACF,CAAC,EAAE,QAAQ,EACXvB,EAAK,KAAK,SAAUK,EAAK,CACvB,IAAIC,EAAYN,EAAK,aAAaK,CAAG,EACjC+B,EAAgB9B,EAAU,SAAS,UAAU,EAC7C+B,EAAQD,EAAc,IAAI,OAAO,EACjCE,EAAYF,EAAc,IAAI,WAAW,EACzCG,EAAmBH,EAAc,IAAI,UAAU,EACnD,GAAIvC,EAAa,CACf,IAAIkB,EAAUf,EAAK,iBAAiBK,CAAG,EACnCmC,EAAcxC,EAAK,cAAcK,EAAK,OAAO,EAC7CoC,EAAcD,EAAY,KAC9B,GAAIzB,aAAmB2B,GAAS,CAC9B,IAAIC,EAAY5B,EAAQ,MACxBA,EAAQ,SAAS6B,EAAO,CACtB,MAAOD,EAAU,MACjB,EAAGA,EAAU,EACb,EAAGA,EAAU,EACb,MAAOA,EAAU,MACjB,OAAQA,EAAU,MACpB,EAAGH,CAAW,CAAC,CACjB,MACEzB,EAAQ,SAASyB,CAAW,EAC5BzB,EAAQ,OAAS,WAAaA,EAAQ,SAAS0B,CAAW,EAE5D1B,EAAQ,SAAST,EAAU,SAAS,CAAC,UAAW,WAAW,CAAC,EAAE,aAAa,CAAC,EACxES,EAAQ,MAAM,OAAS,QACzBA,EAAQ,SAAS,OAAQrD,EAAS8D,GAAUxB,EAAK,IAAIC,EAAUI,CAAG,EAAGH,EAAa,CAAC,EAAG,CAAC,EAAG,EAAI,CAAC,CAAC,EAElGa,EAAQ,eAAiB,EACzB8B,GAAyB9B,EAAST,CAAS,EAC3CwC,GAAoB/B,EAASsB,EAAOC,EAAWC,CAAgB,CACjE,CACA,GAAIxC,EAAc,CAChB,IAAIwB,EAAW3B,EAAaS,CAAG,EAC/BkB,EAAS,SAASvB,EAAK,cAAcK,EAAK,OAAO,CAAC,EAClDkB,EAAS,SAASjB,EAAU,SAAS,CAAC,WAAY,WAAW,CAAC,EAAE,aAAa,CAAC,EAC9EiB,EAAS,eAAiB,EAC1BsB,GAAyBtB,EAAUjB,CAAS,EAC5CwC,GAAoBvB,EAAUc,EAAOC,EAAWC,CAAgB,CAClE,CACF,CAAC,EACD,KAAK,aAAe3C,EAExB,EACA9D,EAAU,UAAU,cAAgB,SAAUhB,EAAasB,EAAS,CAClE,IAAI2G,EAAcjI,EAAY,SAAS,QAAQ,EAC3CkI,EAAaD,EAAY,IAAI,MAAM,EACvC,GAAIC,EAAY,CACd,IAAIC,EAAaF,EAAY,IAAI,MAAM,EACnCG,EAAaH,EAAY,IAAI,MAAM,EACnCI,EAAeJ,EAAY,IAAI,cAAc,EAC7CK,EAAmBL,EAAY,IAAI,YAAY,EAC/CM,EAASrC,GAAakC,EAAY9G,EAAQ,GAAK6G,EAAa,EAAI5H,GAAa8H,EAAa,CAAC,EAAG/G,EAAQ,CAAC,EAAGA,EAAQ,GAAK6G,EAAa,EAAI5H,GAAa8H,EAAa,CAAC,EAAG/G,EAAQ,CAAC,EAAG6G,EAAYA,EAAY,KAAMG,CAAgB,EACpOC,EAAO,GAAKN,EAAY,IAAI,WAAW,EAAI,EAAI,EAC/CM,EAAO,SAASN,EAAY,SAAS,WAAW,EAAE,aAAa,CAAC,EAChE,KAAK,MAAM,IAAIM,CAAM,CACvB,CACF,EACAvH,EAAU,UAAU,sBAAwB,SAAUhB,EAAaoB,EAASnB,EAAK2C,EAAUtB,EAAS,CAClG,IAAIH,EAAQ,KACR+D,EAAOlF,EAAY,QAAQ,EAC3BmF,EAAWD,EAAK,aAAa,OAAO,EACpCrC,EAAS,CAAC7C,EAAY,IAAI,KAAK,EAC/B8C,EAAS,CAAC9C,EAAY,IAAI,KAAK,EAC/BwI,EAAe,IAAYC,GAC3BC,EAAc,CAAC,EACfC,EAAe,CAAC,EAChBC,EAAe5I,EAAY,mBAAmB,EAC9C6I,EAAmB7I,EAAY,IAAI,CAAC,UAAW,WAAW,CAAC,EAC/DkF,EAAK,KAAK,KAAK,KAAK,EAAE,IAAI,SAAUK,EAAK,CACvCmD,EAAYnD,CAAG,EAAI,IAAYf,GAAK,CAClC,OAAQ,EACV,CAAC,EACDmE,EAAapD,CAAG,EAAI,IAAYf,GAAK,CACnC,OAAQ,EACV,CAAC,CACH,CAAC,EAAE,OAAO,SAAUe,EAAKyB,EAAQ,CAC/B0B,EAAYnD,CAAG,EAAIpE,EAAM,UAAU6F,CAAM,EACzC2B,EAAapD,CAAG,EAAIpE,EAAM,WAAW6F,CAAM,CAC7C,CAAC,EAAE,QAAQ,EACX9B,EAAK,KAAK,SAAUK,EAAK,CACvB,IAAIC,EAAYN,EAAK,aAAaK,CAAG,EACjC5E,EAAQuE,EAAK,IAAIC,EAAUI,CAAG,EAC9BuD,EAAY,IAAYL,GACxBvE,EAAYtB,EAAS8D,GAAU/F,EAAO,CAACkC,EAAQC,CAAM,EAAG,CAAC,EAAG,CAAC,EAAG,EAAI,CAAC,EACrEiG,EAAiBvD,EAAU,SAAS,OAAO,EAC/C,GAAIuD,EAAe,IAAI,MAAM,EAAG,CAC9B,IAAIC,EAAoBD,EAAe,IAAI,cAAc,EACrDE,EAAS3H,EAAQ,GAAKf,GAAayI,EAAkB,CAAC,EAAG1H,EAAQ,CAAC,EAClE4H,EAAS5H,EAAQ,GAAKf,GAAayI,EAAkB,CAAC,EAAG1H,EAAQ,CAAC,EAClE6H,EAAUT,EAAYnD,CAAG,EAC7B4D,EAAQ,KAAK,CACX,GAAIN,EAAmB,EAAI,EAC3B,MAAOpE,GAAgBsE,EAAgB,CACrC,EAAGE,EACH,EAAGC,EACH,KAAMhE,EAAK,QAAQK,CAAG,EACtB,MAAO,SACP,cAAe,QACjB,EAAG,CACD,aAAcrB,CAChB,CAAC,CACH,CAAC,EACD4E,EAAU,IAAIK,CAAO,CACvB,CACA,IAAIC,EAAkB5D,EAAU,SAAS,QAAQ,EACjD,GAAI4D,EAAgB,IAAI,MAAM,EAAG,CAC/B,IAAIC,EAAqBD,EAAgB,IAAI,cAAc,EACvDE,EAAUhI,EAAQ,GAAKf,GAAa8I,EAAmB,CAAC,EAAG/H,EAAQ,CAAC,EACpEiI,EAAUjI,EAAQ,GAAKf,GAAa8I,EAAmB,CAAC,EAAG/H,EAAQ,CAAC,EACpEnB,EAAQI,GAAa6I,EAAgB,IAAI,OAAO,EAAG9H,EAAQ,CAAC,EAC5DlB,EAASG,GAAa6I,EAAgB,IAAI,QAAQ,EAAG9H,EAAQ,CAAC,EAC9DkI,EAAcxJ,EAAY,IAAI,CAAC,WAAY,MAAM,CAAC,EAAIkF,EAAK,cAAcK,EAAK,OAAO,EAAE,KAAOrB,EAC9FiF,EAAUR,EAAapD,CAAG,EAC1BkE,EAAcL,EAAgB,IAAI,WAAW,EACjDD,EAAQ,KAAK,CACX,GAAIN,EAAmB,EAAI,EAC3B,MAAOpE,GAAgB2E,EAAiB,CACtC,EAAGE,EACH,EAAGC,EACH,KAAM7I,GAAYC,EAAO8I,CAAW,EACpC,MAAO,MAAMtJ,CAAK,EAAI,KAAOA,EAC7B,OAAQ,MAAMC,CAAM,EAAI,KAAOA,EAC/B,MAAO,SACP,cAAe,QACjB,EAAG,CACD,aAAcoJ,CAChB,CAAC,CACH,CAAC,EACDE,GAAuBP,EAAS,CAC9B,OAAQC,CACV,EAAGzI,EAAO,SAAUA,EAAO,CACzB,OAAOD,GAAYC,EAAO8I,CAAW,CACvC,CAAC,EACDb,GAAgBe,GAAkBR,EAAS5D,EAAKL,EAAMlF,EAAa,CACjE,kBAAmB,SAAU4J,EAAgBC,EAAQC,EAAUC,GAAeC,GAAKC,GAAc,CAC/F,OAAOvJ,GAAYuJ,GAAeA,GAAa,kBAAoBtJ,EAAO8I,CAAW,CACvF,CACF,CAAC,EACDX,EAAU,IAAIK,CAAO,CACvB,CACAX,EAAa,IAAIM,CAAS,CAC5B,CAAC,EACD,KAAK,MAAM,IAAIN,CAAY,EAC3B,KAAK,UAAYE,EACjB,KAAK,WAAaC,CACpB,EACA3H,EAAU,KAAO,QACVA,CACT,GAAEkJ,EAAS,EACJC,IAAQnJ,IChgBf,IAAIoJ,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KAC9BG,EAAM,sBAAwB,YACvBA,CACT,CACA,OAAAH,EAAiB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CACrE,OAAOC,GAAuB,KAAM,CAAC,OAAO,CAAC,CAC/C,EACAN,EAAiB,KAAO,eACxBA,EAAiB,cAAgB,CAE/B,EAAG,EACH,QAAS,OAET,OAAQ,CAAC,MAAO,KAAK,EACrB,gBAAiB,GACjB,OAAQ,MACR,WAAY,IACZ,SAAU,IACV,UAAW,GAEX,IAAK,EAEL,IAAK,IAEL,YAAa,GAEb,SAAU,CAER,KAAM,GACN,SAAU,GACV,UAAW,CACT,MAAO,CAAC,CAAC,EAAGO,EAAO,MAAM,SAAS,CAAC,EACnC,MAAO,EACT,CACF,EAEA,SAAU,CAER,KAAM,GACN,QAAS,GACT,MAAO,GACP,SAAU,GACV,KAAM,EACR,EAEA,UAAW,CAET,KAAM,GAEN,OAAQ,GACR,SAAU,GAEV,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,MAAO,EACP,KAAM,OACR,CACF,EAEA,SAAU,CAER,KAAM,GAEN,YAAa,EAEb,OAAQ,EACR,SAAU,GAEV,UAAW,CACT,MAAOA,EAAO,MAAM,cACpB,MAAO,EACP,KAAM,OACR,CACF,EACA,UAAW,CACT,KAAM,GACN,SAAU,GAEV,MAAOA,EAAO,MAAM,UACpB,SAAU,GACV,OAAQ,CACV,EACA,QAAS,CACP,KAAM,KACN,aAAc,CAAC,EAAG,CAAC,EACnB,KAAM,GACN,UAAW,GACX,OAAQ,MACR,MAAO,EACP,WAAY,EACd,EACA,OAAQ,CACN,KAAM,GACN,UAAW,GACX,KAAM,EACN,KAAM,SACN,aAAc,CAAC,EAAG,CAAC,EACnB,WAAY,GACZ,UAAW,CACT,MAAOA,EAAO,MAAM,UACpB,YAAa,EACb,YAAaA,EAAO,MAAM,MAAM,CAAC,CACnC,CACF,EACA,MAAO,CACL,KAAM,GAEN,aAAc,CAAC,EAAG,KAAK,EAEvB,MAAOA,EAAO,MAAM,UACpB,SAAU,GACV,eAAgB,EAClB,EACA,OAAQ,CACN,KAAM,GACN,gBAAiBA,EAAO,MAAM,YAC9B,YAAa,EACb,YAAaA,EAAO,MAAM,UAC1B,MAAO,IACP,OAAQ,KACR,QAAS,CAAC,EAAG,EAAE,EAEf,aAAc,CAAC,EAAG,KAAK,EAGvB,MAAOA,EAAO,MAAM,QACpB,SAAU,GACV,WAAY,OACZ,WAAY,GACZ,eAAgB,EAClB,CACF,EACOP,CACT,GAAEQ,EAAW,EACNC,IAAQT,IC5IR,SAASU,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAS,EACrCD,EAAU,oBAAoBE,GAAgB,CAChD,CCEA,IAAIC,IAAoB,CAAC,YAAa,SAAS,EAI3CC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,EAAYG,EAAMC,EAAK,CAC9B,IAAIC,EAAQJ,EAAO,KAAK,IAAI,GAAK,KAC7BK,EAAUD,EACVE,EAAY,IAAYC,GACxBC,EAAO,IAAYC,GACvB,OAAAJ,EAAQ,eAAeG,CAAI,EAC3BJ,EAAM,iBAAiBE,CAAS,EAChCF,EAAM,WAAWF,EAAMC,EAAK,EAAI,EACzBC,CACT,CACA,OAAAL,EAAY,UAAU,WAAa,SAAUG,EAAMC,EAAKO,EAAa,CACnE,IAAIL,EAAU,KACVM,EAAcT,EAAK,UACnBU,EAAYV,EAAK,aAAaC,CAAG,EACjCU,EAASX,EAAK,cAAcC,CAAG,EAC/BW,EAAgBF,EAAU,SAAS,UAAU,EAC7CG,EAAUH,EAAU,IAAId,GAAiB,EAC7CiB,EAAUA,GAAkB,EACvBL,GACHM,GAAaX,CAAO,EAGtBA,EAAQ,SAASH,EAAK,cAAcC,EAAK,OAAO,CAAC,EACjDE,EAAQ,MAAM,SAAW,QACrBK,GACFL,EAAQ,SAAS,CACf,OAAQQ,EAAO,MACjB,CAAC,EACDR,EAAQ,MAAM,QAAU,EAChBY,GAAUZ,EAAS,CACzB,MAAO,CACL,QAASU,CACX,CACF,EAAGJ,EAAaR,CAAG,GAEXe,GAAYb,EAAS,CAC3B,MAAO,CACL,QAASU,CACX,EACA,MAAO,CACL,OAAQF,EAAO,MACjB,CACF,EAAGF,EAAaR,CAAG,EAErBgB,GAAyBd,EAASO,CAAS,EAC3C,KAAK,aAAaV,EAAMC,CAAG,EAC3BiB,GAAoB,KAAMN,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACrH,EACAf,EAAY,UAAU,aAAe,SAAUG,EAAMC,EAAK,CACxD,IAAIE,EAAU,KACVC,EAAY,KAAK,iBAAiB,EAClCe,EAAYhB,EAAQ,eAAe,EACnCM,EAAcT,EAAK,UACnBU,EAAYV,EAAK,aAAaC,CAAG,EACjCU,EAASX,EAAK,cAAcC,CAAG,EAC/BmB,EAAcT,EAAO,MACrBU,EAAQrB,EAAK,cAAcC,EAAK,OAAO,EACvCqB,EAAcD,EAAM,KACxBE,GAEAJ,EAAWK,GAAqBd,CAAS,EAAG,CAC1C,aAAcV,EAAK,UACnB,eAAgBC,EAChB,eAAgBoB,EAAM,QACtB,YAAarB,EAAK,QAAQC,CAAG,CAC/B,EAAG,CACD,OAAQ,CACN,MAAOmB,EAAY,UACnB,cAAeA,EAAY,aAC7B,CACF,CAAC,EACD,IAAIK,EAAaf,EAAU,SAAS,OAAO,EACvCgB,EAAaD,EAAW,IAAI,OAAO,EACnCE,EAAgBD,IAAe,UAAYJ,EAAc,KAC7DnB,EAAQ,cAAc,CACpB,MAAO,GACP,OAAQ,CAAC,CAACiB,EAAY,OACtB,aAAcO,EACd,YAAaA,CACf,CAAC,EACD,IAAIC,EAAaR,EAAY,WAC7BhB,EAAU,SAAS,CACjB,OAAQwB,CACV,CAAC,EACDzB,EAAQ,oBAAsB,CAC5B,OAAQyB,EAAa,IAAYC,GAAMD,EAAW,CAAC,EAAE,CAAC,EAAGA,EAAW,CAAC,EAAE,CAAC,CAAC,EAAI,IAC/E,EAGQZ,GAAYG,EAAW,CAC7B,MAAO,CACL,EAAGC,EAAY,EACf,EAAGA,EAAY,CACjB,CACF,EAAGX,EAAaR,CAAG,EACnBkB,EAAU,KAAK,CACb,SAAUC,EAAY,SACtB,QAASA,EAAY,EACrB,QAASA,EAAY,EACrB,GAAI,EACN,CAAC,EACDU,GAAkB3B,EAAS4B,GAAyBrB,CAAS,EAAG,CAE9D,OAAQY,CACV,CAAC,CACH,EACOzB,CACT,GAAUmC,EAAO,EACbC,KAA0B,SAAUnC,EAAQ,CAC9CC,EAAUkC,EAAYnC,CAAM,EAC5B,SAASmC,GAAa,CACpB,IAAI/B,EAAQJ,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAI,EAAM,KAAO+B,EAAW,KACxB/B,EAAM,sBAAwB,GACvBA,CACT,CACA,OAAA+B,EAAW,UAAU,OAAS,SAAUxB,EAAayB,EAASC,EAAK,CACjE,IAAInC,EAAOS,EAAY,QAAQ,EAC3B2B,EAAU,KAAK,MACfC,EAAQ,KAAK,MACjBrC,EAAK,KAAKoC,CAAO,EAAE,IAAI,SAAUnC,EAAK,CACpC,IAAIqC,EAAc,IAAIzC,IAAYG,EAAMC,CAAG,EAC3CD,EAAK,iBAAiBC,EAAKqC,CAAW,EACtCD,EAAM,IAAIC,CAAW,CACvB,CAAC,EAAE,OAAO,SAAUC,EAAQC,EAAQ,CAClC,IAAIC,EAAQL,EAAQ,iBAAiBI,CAAM,EAC3CC,EAAM,WAAWzC,EAAMuC,CAAM,EAC7BF,EAAM,IAAII,CAAK,EACfzC,EAAK,iBAAiBuC,EAAQE,CAAK,CACrC,CAAC,EAAE,OAAO,SAAUxC,EAAK,CACvB,IAAIwC,EAAQL,EAAQ,iBAAiBnC,CAAG,EAChCyC,GAAyBD,EAAOhC,EAAaR,CAAG,CAC1D,CAAC,EAAE,QAAQ,EACX,KAAK,MAAQD,CACf,EACAiC,EAAW,UAAU,OAAS,UAAY,CACxC,KAAK,MAAM,UAAU,EACrB,KAAK,MAAQ,IACf,EACAA,EAAW,UAAU,QAAU,UAAY,CAAC,EAC5CA,EAAW,KAAO,SACXA,CACT,GAAEU,EAAS,EACJC,IAAQX,ICpJf,IAAIY,KAAiC,SAAUC,EAAQ,CACrDC,EAAUF,EAAmBC,CAAM,EACnC,SAASD,GAAoB,CAC3B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAkB,KACxBG,CACT,CACA,OAAAH,EAAkB,UAAU,KAAO,SAAUI,EAAQ,CACnDH,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,EAG3C,KAAK,qBAAuB,IAAII,GAA4BC,GAAK,KAAK,QAAS,IAAI,EAAUA,GAAK,KAAK,WAAY,IAAI,CAAC,EAExH,KAAK,kBAAkBF,CAAM,CAC/B,EACAJ,EAAkB,UAAU,eAAiB,SAAUI,EAAQG,EAAS,CACtE,OAAOC,GAAuB,KAAM,CAClC,gBAAiB,CAAC,OAAO,EACzB,gBAAwBC,GAAMC,GAA8B,IAAI,CAClE,CAAC,CACH,EACAV,EAAkB,UAAU,kBAAoB,SAAUI,EAAQ,CAEhEO,GAAgBP,EAAQ,YAAa,CAAC,MAAM,CAAC,EAC7C,IAAIQ,EAAqBR,EAAO,UAC5BS,EAAuBT,EAAO,SAAS,UAE3CQ,EAAmB,KAAOA,EAAmB,MAAQR,EAAO,MAAM,KAClES,EAAqB,KAAOA,EAAqB,MAAQT,EAAO,SAAS,MAAM,IACjF,EAEAJ,EAAkB,UAAU,cAAgB,SAAUc,EAAW,CAC/D,IAAIC,EAAO,KAAK,QAAQ,EACpBC,EAASf,EAAO,UAAU,cAAc,KAAK,KAAMa,CAAS,EAC5DG,EAAWF,EAAK,aAAa,OAAO,EACpCG,EAAMH,EAAK,OAAOE,CAAQ,EAE9B,OAAAD,EAAO,QAAWE,EAAU,EAAEH,EAAK,IAAIE,EAAUH,CAAS,EAAII,EAAM,KAAK,QAAQ,CAAC,EAA1D,EACxBF,EAAO,MAAM,KAAK,SAAS,EACpBA,CACT,EACAhB,EAAkB,KAAO,gBACzBA,EAAkB,cAAgB,CAChC,sBAAuB,MAEvB,EAAG,EACH,gBAAiB,GACjB,QAAS,OACT,KAAM,GACN,IAAK,GACL,MAAO,GACP,OAAQ,GAMR,QAAS,KACT,QAAS,OACT,KAAM,aACN,OAAQ,WACR,IAAK,EACL,YAAa,SACb,MAAO,CACL,KAAM,GACN,SAAU,OAEZ,EACA,UAAW,CACT,KAAM,GACN,OAAQ,GACR,UAAW,CAET,MAAO,CACT,CACF,EACA,UAAW,CAET,YAAamB,EAAO,MAAM,UAC1B,YAAa,CACf,EACA,SAAU,CACR,MAAO,CACL,KAAM,EACR,CACF,EACA,OAAQ,CACN,UAAW,CACT,YAAaA,EAAO,MAAM,OAC5B,CACF,CACF,EACOnB,CACT,GAAEoB,EAAW,EACNC,IAAQrB,ICnGf,SAASsB,IAAiBC,EAAMC,EAAM,CAOpC,QANIC,EAAWF,EAAK,aAAa,OAAO,EACpCG,EAAWH,EAAK,SAASE,EAAU,SAAUE,EAAK,CACpD,OAAOA,CACT,CAAC,EACGC,EAAU,CAAC,EACXC,EAAcL,IAAS,YAClBM,EAAI,EAAGC,EAAMR,EAAK,MAAM,EAAGO,EAAIC,EAAKD,IAC3CF,EAAQE,CAAC,EAAIA,EAGf,OAAIE,GAAWR,CAAI,EACjBI,EAAQ,KAAKJ,CAAI,EACRA,IAAS,QAClBI,EAAQ,KAAK,SAAUK,EAAGC,EAAG,CAC3B,OAAOL,EAAcH,EAASO,CAAC,EAAIP,EAASQ,CAAC,EAAIR,EAASQ,CAAC,EAAIR,EAASO,CAAC,CAC3E,CAAC,EAEIL,CACT,CACA,SAASO,IAAYZ,EAAM,CACzB,IAAIa,EAAcb,EAAK,UACnBc,EAASD,EAAY,IAAI,QAAQ,EACrCb,EAAK,KAAK,SAAUe,EAAK,CACvB,IAAIC,EAAYhB,EAAK,aAAae,CAAG,EACjCE,EAAaD,EAAU,SAAS,OAAO,EACvCE,EAAgBD,EAAW,IAAI,UAAU,EACzCE,EAAiBH,EAAU,SAAS,WAAW,EAC/CI,EAASpB,EAAK,cAAce,CAAG,EAC/BM,EAASD,EAAO,OAChBE,EAAgBJ,IAAkB,SAAWA,IAAkB,UAAYA,IAAkB,UAAYA,IAAkB,cAAgBA,IAAkB,cAC7JK,EACAC,EACAC,EACAC,EACJ,GAAIJ,EACEJ,IAAkB,cACpBM,GAASH,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EAAI,EAC5CI,GAASJ,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACxCE,EAAY,QACHL,IAAkB,eAC3BM,GAASH,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EAAI,EAC5CI,GAASJ,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACxCE,EAAY,UAEZC,GAASH,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACtEI,GAASJ,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACtEE,EAAY,UAEdG,EAAa,CAAC,CAACF,EAAOC,CAAK,EAAG,CAACD,EAAOC,CAAK,CAAC,MACvC,CACL,IAAIE,EAAK,OACLC,EAAK,OACLC,EAAK,OACLC,EAAK,OACLC,EAAeZ,EAAe,IAAI,QAAQ,EAW1CD,IAAkB,QAEpBS,GAAMN,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCO,GAAMP,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCQ,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,SACHL,IAAkB,SAE3BS,GAAMN,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCO,GAAMP,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCQ,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,QACHL,IAAkB,OAE3BS,GAAMN,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCO,GAAMP,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCS,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,UACHL,IAAkB,UAE3BS,GAAMN,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCO,GAAMP,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCS,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,UACHL,IAAkB,YAE3BS,EAAKb,IAAW,aAAeO,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EACzDO,EAAKd,IAAW,aAAeO,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EACrDP,IAAW,cACbgB,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,WAEZM,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,QAELL,IAAkB,eAE3BS,EAAKN,EAAO,CAAC,EAAE,CAAC,EAChBO,EAAKP,EAAO,CAAC,EAAE,CAAC,EACZP,IAAW,cACbgB,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,WAEZM,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,WAELL,IAAkB,WAE3BS,EAAKN,EAAO,CAAC,EAAE,CAAC,EAChBO,EAAKd,IAAW,aAAeO,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EACrDP,IAAW,cACbgB,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,WAEZM,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,UAELL,IAAkB,cAE3BS,EAAKb,IAAW,aAAeO,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EACzDO,EAAKd,IAAW,aAAeO,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EACrDP,IAAW,cACbgB,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,WAEZM,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,WAIdI,GAAMN,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCO,GAAMP,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACjCP,IAAW,cACbgB,EAAKF,EAAKG,EACVN,EAAQK,EAAK,EACbP,EAAY,WAEZM,EAAKF,EAAKI,EACVP,EAAQK,EAAK,EACbN,EAAY,SAGZT,IAAW,cACbe,EAAKF,EACLH,EAAQK,IAERC,EAAKF,EACLH,EAAQK,GAEVJ,EAAa,CAAC,CAACC,EAAIC,CAAE,EAAG,CAACC,EAAIC,CAAE,CAAC,CAClC,CACAV,EAAO,MAAQ,CACb,WAAYM,EACZ,EAAGF,EACH,EAAGC,EACH,cAAe,SACf,UAAWF,EACX,OAAQD,CACV,CACF,CAAC,CACH,CACe,SAARU,GAA8BC,EAASC,EAAK,CACjDD,EAAQ,iBAAiB,SAAU,SAAUpB,EAAa,CACxD,IAAIb,EAAOa,EAAY,QAAQ,EAC3BX,EAAWF,EAAK,aAAa,OAAO,EACpCC,EAAOY,EAAY,IAAI,MAAM,EAC7BsB,EAAmBC,GAAyBvB,EAAaqB,CAAG,EAC5DG,EAAkBC,GAAczB,EAAY,mBAAmB,EAAGsB,EAAU,YAAY,EACxFrB,EAASD,EAAY,IAAI,QAAQ,EACjC0B,EAAYF,EAAS,MACrBG,EAAaH,EAAS,OACtBhC,EAAUN,IAAiBC,EAAMC,CAAI,EACrCwC,EAAIJ,EAAS,EACbK,EAAIL,EAAS,EACbM,EAAa7B,IAAW,aAAe,CAAC8B,GAAa/B,EAAY,IAAI,SAAS,EAAG2B,CAAU,EAAGI,GAAa/B,EAAY,IAAI,SAAS,EAAG2B,CAAU,CAAC,EAAI,CAACI,GAAa/B,EAAY,IAAI,SAAS,EAAG0B,CAAS,EAAGK,GAAa/B,EAAY,IAAI,SAAS,EAAG0B,CAAS,CAAC,EAC/PM,EAAa7C,EAAK,cAAcE,CAAQ,EACxC4C,EAAMjC,EAAY,IAAI,KAAK,EAC3BkC,EAAMlC,EAAY,IAAI,KAAK,EAC3BiC,GAAO,OACTA,EAAM,KAAK,IAAID,EAAW,CAAC,EAAG,CAAC,GAE7BE,GAAO,OACTA,EAAMF,EAAW,CAAC,GAEpB,IAAIG,EAAcnC,EAAY,IAAI,aAAa,EAC3CoC,EAAMpC,EAAY,IAAI,KAAK,EAC3BqC,EAAWpC,IAAW,aAAeyB,EAAYC,EACjDW,GAAYD,EAAWD,GAAOjD,EAAK,MAAM,EAAI,IAAMA,EAAK,MAAM,EAC9DoD,EAAgB,SAAUrC,EAAKsC,EAAQ,CAEzC,GAAIvC,IAAW,aAAc,CAC3B,IAAIwC,EAAQtD,EAAK,IAAIE,EAAUa,CAAG,GAAK,EACnCwC,EAAaC,GAAUF,EAAO,CAACR,EAAKC,CAAG,EAAGJ,EAAY,EAAI,EAC1Dc,EAAK,OACT,OAAQT,EAAa,CACnB,IAAK,MACHS,EAAKf,EACL,MACF,IAAK,SACHe,EAAKf,GAAKF,EAAae,GAAc,EACrC,MACF,IAAK,SACHE,EAAKf,GAAKF,EAAae,GACvB,KACJ,CACA,MAAO,CAAC,CAACF,EAAQI,CAAE,EAAG,CAACJ,EAAQI,EAAKF,CAAU,CAAC,CACjD,CACA,IAAInD,EAAMJ,EAAK,IAAIE,EAAUa,CAAG,GAAK,EACjC2C,EAAYF,GAAUpD,EAAK,CAAC0C,EAAKC,CAAG,EAAGJ,EAAY,EAAI,EACvDgB,EACJ,OAAQX,EAAa,CACnB,IAAK,OACHW,EAAKlB,EACL,MACF,IAAK,SACHkB,EAAKlB,GAAKF,EAAYmB,GAAa,EACnC,MACF,IAAK,QACHC,EAAKlB,EAAIF,EAAYmB,EACrB,KACJ,CACA,MAAO,CAAC,CAACC,EAAIN,CAAM,EAAG,CAACM,EAAKD,EAAWL,CAAM,CAAC,CAChD,EACIpD,IAAS,cAEXkD,EAAW,CAACA,EACZF,EAAM,CAACA,EACHnC,IAAW,aACb2B,GAAKF,EAELG,GAAKF,EAEPnC,EAAUA,EAAQ,QAAQ,GAE5B,QAASE,EAAI,EAAGA,EAAIF,EAAQ,OAAQE,IAAK,CACvC,IAAIQ,EAAMV,EAAQE,CAAC,EACfqD,EAAUvD,EAAQE,EAAI,CAAC,EACvBS,EAAYhB,EAAK,aAAae,CAAG,EACrC,GAAID,IAAW,aAAc,CAC3B,IAAI+C,EAAQ7C,EAAU,IAAI,CAAC,YAAa,OAAO,CAAC,EAC5C6C,GAAS,KACXA,EAAQV,GAERU,EAAQjB,GAAaiB,EAAOtB,CAAS,EACjCtC,IAAS,cACX4D,EAAQ,CAACA,IAGb,IAAIC,EAAQV,EAAcrC,EAAK0B,CAAC,EAC5BsB,EAAMX,EAAcQ,EAASnB,EAAIoB,CAAK,EAC1CpB,GAAKoB,EAAQZ,EACbjD,EAAK,cAAce,EAAK,CACtB,OAAQ+C,EAAM,OAAOC,EAAI,MAAM,EAAE,QAAQ,CAAC,CAC5C,CAAC,CACH,KAAO,CACL,IAAIC,EAAShD,EAAU,IAAI,CAAC,YAAa,QAAQ,CAAC,EAC9CgD,GAAU,KACZA,EAASb,GAETa,EAASpB,GAAaoB,EAAQxB,CAAU,EACpCvC,IAAS,cACX+D,EAAS,CAACA,IAGd,IAAIF,EAAQV,EAAcrC,EAAK2B,CAAC,EAC5BqB,EAAMX,EAAcQ,EAASlB,EAAIsB,CAAM,EAC3CtB,GAAKsB,EAASf,EACdjD,EAAK,cAAce,EAAK,CACtB,OAAQ+C,EAAM,OAAOC,EAAI,MAAM,EAAE,QAAQ,CAAC,CAC5C,CAAC,CACH,CACF,CACAnD,IAAYZ,CAAI,CAClB,CAAC,CACH,CCnSO,SAASiE,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAU,EACtCD,EAAU,oBAAoBE,GAAiB,EAC/CF,EAAU,eAAeG,EAAY,EACrCH,EAAU,kBAAkBI,GAAW,QAAQ,CAAC,CAClD,CCFA,IAAIC,IAAiB,GACjBC,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KAC1BG,EAAM,WAAa,IAAYC,GAC/BD,EAAM,aAAe,GACdA,CACT,CACA,OAAAH,EAAa,UAAU,KAAO,UAAY,CACxC,KAAK,MAAM,IAAI,KAAK,UAAU,CAChC,EAIAA,EAAa,UAAU,OAAS,SAAUK,EAAaC,EAASC,EAAKC,EAAS,CAE5E,KAAK,gBAAkB,KACvB,IAAIC,EAAY,KAAK,WACjBC,EAAOL,EAAY,QAAQ,EAC3BM,EAAU,KAAK,MACfC,EAAWP,EAAY,iBACvBQ,EAAaD,EAAS,WACtBE,EAAcC,IAAgBV,CAAW,EAC7CK,EAAK,KAAKC,CAAO,EAAE,IAAIK,CAAG,EAAE,OAAOC,CAAM,EAAE,OAAOC,CAAM,EAAE,QAAQ,EAClE,SAASF,EAAIG,EAAc,CACzB,IAAIC,EAAOC,IAAMX,EAAMD,EAAWU,EAAcN,EAAYD,CAAQ,EACpEU,GAAeF,EAAMV,EAAMS,EAAcL,CAAW,CACtD,CACA,SAASG,EAAOE,EAAcI,EAAc,CAC1C,IAAIH,EAAOT,EAAQ,iBAAiBY,CAAY,EAC5CC,EAASC,IAAiBf,EAAMS,EAAcN,EAAYD,CAAQ,EACtEF,EAAK,iBAAiBS,EAAcC,CAAI,EAChCM,GAAYN,EAAM,CACxB,MAAO,CACL,OAAQI,CACV,CACF,EAAGnB,EAAac,CAAY,EAC5BQ,GAAaP,CAAI,EACjBE,GAAeF,EAAMV,EAAMS,EAAcL,CAAW,CACtD,CACA,SAASI,EAAOK,EAAc,CAC5B,IAAIH,EAAOT,EAAQ,iBAAiBY,CAAY,EAChDd,EAAU,OAAOW,CAAI,CACvB,CAEA,GAAI,CAAC,KAAK,aAAc,CACtB,KAAK,aAAe,GACpB,IAAIQ,EAAWC,IAAoBjB,EAAUP,EAAa,UAAY,CAEpE,WAAW,UAAY,CACrBI,EAAU,eAAe,CAC3B,CAAC,CACH,CAAC,EACDA,EAAU,YAAYmB,CAAQ,CAChC,CACA,KAAK,MAAQlB,CACf,EACAV,EAAa,UAAU,yBAA2B,SAAUK,EAAaC,EAASC,EAAK,CACrF,KAAK,aAAe,GACpB,KAAK,MAAQ,KACb,KAAK,WAAW,UAAU,CAC5B,EACAP,EAAa,UAAU,kBAAoB,SAAU8B,EAAYzB,EAAaC,EAAS,CAMrF,QALII,EAAOL,EAAY,QAAQ,EAC3BO,EAAWP,EAAY,iBACvBQ,EAAaD,EAAS,WACtBE,EAAcC,IAAgBV,CAAW,EACzC0B,EAAiB,KAAK,gBAAkB,CAAC,EACpCC,EAAYF,EAAW,MAAOE,EAAYF,EAAW,IAAKE,IAAa,CAC9E,IAAIZ,EAAOC,IAAMX,EAAM,KAAK,WAAYsB,EAAWnB,EAAYD,CAAQ,EACvEQ,EAAK,YAAc,GACnBE,GAAeF,EAAMV,EAAMsB,EAAWlB,CAAW,EACjDiB,EAAe,KAAKX,CAAI,CAC1B,CACF,EACApB,EAAa,UAAU,OAAS,UAAY,CAC1C,KAAK,YAAc,KAAK,WAAW,UAAU,EAC7C,KAAK,MAAQ,IACf,EACAA,EAAa,KAAO,WACbA,CACT,GAAEiC,EAAS,EACX,SAASJ,IAAoBjB,EAAUP,EAAa6B,EAAI,CACtD,IAAIC,EAAgBvB,EAAS,MACzBwB,EAAOxB,EAAS,QAAQ,EACxByB,EAAS,IAAYC,GAAK,CAC5B,MAAO,CACL,EAAGF,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,MACf,CACF,CAAC,EACGG,EAAMJ,EAAc,IAAI,QAAQ,IAAM,aAAe,QAAU,SACnE,OAAAE,EAAO,SAASE,EAAK,CAAC,EACdC,GAAUH,EAAQ,CACxB,MAAO,CACL,MAAOD,EAAK,MACZ,OAAQA,EAAK,MACf,CACF,EAAG/B,EAAa6B,CAAE,EACXG,CACT,CACA,SAASZ,IAAiBf,EAAMsB,EAAWnB,EAAYD,EAAU,CAE/D,QADIY,EAAS,CAAC,EACLiB,EAAI,EAAGA,EAAI5B,EAAW,OAAQ4B,IAAK,CAC1C,IAAIC,EAAU7B,EAAW4B,CAAC,EACtBE,EAAQjC,EAAK,IAAIA,EAAK,aAAagC,CAAO,EAAGV,CAAS,EACrDY,IAAaD,EAAO/B,EAAS,QAAQ8B,CAAO,EAAE,IAAI,GACrDlB,EAAO,KAAKZ,EAAS,YAAY+B,EAAOD,CAAO,CAAC,CAEpD,CACA,OAAOlB,CACT,CACA,SAASH,IAAMX,EAAMD,EAAWuB,EAAWnB,EAAYD,EAAU,CAC/D,IAAIY,EAASC,IAAiBf,EAAMsB,EAAWnB,EAAYD,CAAQ,EAC/DQ,EAAO,IAAYyB,GAAS,CAC9B,MAAO,CACL,OAAQrB,CACV,EAEA,GAAI,EACN,CAAC,EACD,OAAAf,EAAU,IAAIW,CAAI,EAClBV,EAAK,iBAAiBsB,EAAWZ,CAAI,EAC9BA,CACT,CACA,SAASL,IAAgBV,EAAa,CACpC,IAAIyC,EAASzC,EAAY,IAAI,SAAU,EAAI,EAC3C,OAAAyC,IAAW,KAASA,EAAS/C,KAC7B+C,EAASC,GAAgBD,CAAM,EAC/BE,GAAMF,CAAM,IAAMA,EAAS,GACpB,CACL,OAAQA,CACV,CACF,CACA,SAASxB,GAAe2B,EAAIvC,EAAMsB,EAAWlB,EAAa,CACxDmC,EAAG,SAASvC,EAAK,cAAcsB,EAAW,OAAO,CAAC,EAClDiB,EAAG,MAAM,KAAO,KAChBA,EAAG,SAAS,SAAUnC,EAAY,MAAM,EACxC,IAAIoC,EAAYxC,EAAK,aAAasB,CAAS,EACvCmB,EAAgBD,EAAU,SAAS,UAAU,EACjDE,GAAyBH,EAAIC,EAAW,WAAW,EACnDG,GAAoBJ,EAAIE,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACnH,CAoBA,SAASP,IAAaU,EAAKC,EAAU,CACnC,OAAOA,IAAa,WAAaD,GAAO,KAAOA,GAAO,MAAQ,MAAMA,CAAG,CACzE,CACA,IAAOE,IAAQxD,IC5Kf,IAAIyD,KAAmC,SAAUC,EAAQ,CACvDC,EAAUF,EAAqBC,CAAM,EACrC,SAASD,GAAsB,CAC7B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAoB,KACjCG,EAAM,sBAAwB,YAC9BA,EAAM,eAAiB,SAChBA,CACT,CACA,OAAAH,EAAoB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CACxE,OAAOC,GAAiB,KAAM,KAAM,CAClC,mBAAoBC,GAAKC,IAAmB,KAAM,IAAI,CACxD,CAAC,CACH,EAMAR,EAAoB,UAAU,2BAA6B,SAAUS,EAAa,CAChF,IAAIC,EAAW,KAAK,iBAChBC,EAAO,KAAK,QAAQ,EACpBC,EAAU,CAAC,EACf,OAAAF,EAAS,gBAAgBC,EAAM,SAAUE,EAAgBC,EAAW,CAC9DL,IAAgBI,GAClBD,EAAQ,KAAKD,EAAK,YAAYG,CAAS,CAAC,CAE5C,CAAC,EACMF,CACT,EACAZ,EAAoB,KAAO,kBAC3BA,EAAoB,aAAe,CAAC,UAAU,EAC9CA,EAAoB,cAAgB,CAElC,EAAG,EACH,iBAAkB,WAClB,cAAe,EACf,MAAO,CACL,KAAM,EACR,EACA,gBAAiB,IACjB,cAAe,EACf,UAAW,CACT,MAAO,EACP,QAAS,IACT,KAAM,OACR,EACA,SAAU,CACR,MAAO,CACL,KAAM,EACR,CACF,EACA,YAAa,IACb,OAAQ,GACR,gBAAiB,QACnB,EACOA,CACT,GAAEe,EAAW,EACb,SAASP,IAAkBQ,EAAa,CAOtC,IAAIC,EAAgBD,EAAY,QAAQ,aAAa,WAAYA,EAAY,IAAI,eAAe,CAAC,EACjG,GAAKC,EAGL,KAAIC,EAAe,CAAC,EACpB,OAAAC,EAAKF,EAAc,WAAY,SAAUG,EAAS,CAChD,IAAIC,EAAeC,IAAuBF,CAAO,EACjDF,EAAaE,CAAO,EAAIC,CAC1B,CAAC,EACMH,EACT,CACA,SAASI,IAAuBC,EAAS,CACvC,MAAO,CAACA,EAAQ,QAAQ,MAAO,EAAE,CACnC,CACA,IAAOC,IAAQxB,ICnFf,IAAIyB,IAAoB,CAAC,YAAa,SAAS,EAC3CC,IAAiB,CACnB,WAAY,WACZ,MAAO,SAAUC,EAAaC,EAAS,CACrC,IAAIC,EAAWF,EAAY,iBACvBG,EAAa,CACf,OAAQH,EAAY,IAAI,CAAC,YAAa,SAAS,CAAC,EAChD,OAAQA,EAAY,IAAI,eAAe,EACvC,SAAUA,EAAY,IAAI,iBAAiB,CAC7C,EACA,MAAO,CACL,SAAU,SAAUI,EAAQC,EAAM,CAChCH,EAAS,gBAAgBG,EAAM,SAAUC,EAAaC,EAAW,CAC/D,IAAIC,EAAUL,EAAWG,CAAW,EACpC,GAAIA,IAAgB,UAAYD,EAAK,cAAe,CAClD,IAAII,EAAcJ,EAAK,aAAaE,CAAS,EAAE,IAAIT,IAAmB,EAAI,EAC1EW,GAAe,OAASD,EAAUC,EACpC,CACA,IAAIC,EAAcL,EAAK,uBAAuBE,EAAW,OAAO,EAChEG,EAAY,QAAUF,CACxB,EAAGJ,EAAO,MAAOA,EAAO,GAAG,CAC7B,CACF,CACF,CACF,EACOO,IAAQZ,ICvBA,SAARa,GAAsCC,EAAQ,CACnDC,IAAuBD,CAAM,EAC7BE,IAA4BF,CAAM,CACpC,CAKA,SAASC,IAAuBD,EAAQ,CACtC,GAAI,CAAAA,EAAO,SAGX,KAAIG,EAAoB,GACjBC,EAAKJ,EAAO,OAAQ,SAAUK,EAAW,CAC1CA,GAAaA,EAAU,OAAS,aAClCF,EAAoB,GAExB,CAAC,EACGA,IACFH,EAAO,SAAW,CAAC,CAAC,CAAC,GAEzB,CAKA,SAASE,IAA4BF,EAAQ,CAC3C,IAAIM,EAAiBC,GAAiBP,EAAO,YAAY,EAClDI,EAAKE,EAAM,SAAUE,EAAY,CACtC,GAAYC,GAASD,CAAU,EAG/B,KAAIE,EAAgBF,EAAW,eAAiB,EAC5CG,EAA2BJ,GAAiBP,EAAO,QAAQ,EAAEU,CAAa,EAC1EC,GAAkBA,EAAe,qBAC5BC,GAAMJ,EAAYG,EAAe,oBAAqB,EAAK,EAEtE,CAAC,CACH,CCpCA,IAAIE,IAAkB,EAClBC,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,OAAS,SAAUI,EAAeC,EAASC,EAAK,CACrE,KAAK,OAASF,EACd,KAAK,KAAOE,EACP,KAAK,YACR,KAAK,UAAY,CAAC,EAClBC,EAAKC,IAAU,SAAUC,EAASC,EAAW,CAC3CJ,EAAI,MAAM,EAAE,GAAGI,EAAW,KAAK,UAAUA,CAAS,EAAIC,GAAKF,EAAS,IAAI,CAAC,CAC3E,EAAG,IAAI,GAETG,GAAe,KAAM,2BAA4BR,EAAc,IAAI,gBAAgB,EAAG,SAAS,CACjG,EACAJ,EAAa,UAAU,QAAU,SAAUK,EAASC,EAAK,CACvDO,GAAM,KAAM,0BAA0B,EACtCN,EAAK,KAAK,UAAW,SAAUE,EAASC,EAAW,CACjDJ,EAAI,MAAM,EAAE,IAAII,EAAWD,CAAO,CACpC,CAAC,EACD,KAAK,UAAY,IACnB,EAKAT,EAAa,UAAU,yBAA2B,SAAUc,EAAK,CAC/D,KAAK,gBAAgBA,CAAG,CAC1B,EAIAd,EAAa,UAAU,gBAAkB,SAAUc,EAAK,CACtDA,GAAO,KAAK,KAAK,eAAeC,EAAO,CACrC,KAAM,oBACR,EAAGD,CAAG,CAAC,CACT,EACAd,EAAa,KAAO,WACbA,CACT,GAAEgB,EAAa,EACXR,IAAW,CACb,UAAW,SAAU,EAAG,CAClBS,GAAa,KAAM,OAAO,IAC5B,KAAK,gBAAkB,CAAC,EAAE,QAAS,EAAE,OAAO,EAEhD,EACA,QAAS,SAAU,EAAG,CACpB,IAAIC,EAAiB,KAAK,gBAC1B,GAAID,GAAa,KAAM,OAAO,GAAKC,EAAgB,CACjD,IAAIC,EAAQ,CAAC,EAAE,QAAS,EAAE,OAAO,EAC7BC,EAAO,KAAK,IAAIF,EAAe,CAAC,EAAIC,EAAM,CAAC,EAAG,CAAC,EAAI,KAAK,IAAID,EAAe,CAAC,EAAIC,EAAM,CAAC,EAAG,CAAC,EAC/F,GAAIC,EAAOrB,IACT,OAEF,IAAIsB,EAAS,KAAK,OAAO,iBAAiB,0BAA0B,CAAC,EAAE,QAAS,EAAE,OAAO,CAAC,EAC1FA,EAAO,WAAa,QAAU,KAAK,gBAAgB,CACjD,iBAAkBA,EAAO,gBAC3B,CAAC,CACH,CACA,KAAK,gBAAkB,IACzB,EACA,UAAW,SAAU,EAAG,CAEtB,GAAI,OAAK,iBAAmB,CAACJ,GAAa,KAAM,WAAW,GAG3D,KAAIK,EAAQ,KAAK,OACbD,EAASC,EAAM,iBAAiB,0BAA0B,CAAC,EAAE,QAAS,EAAE,OAAO,CAAC,EAChFC,EAAWF,EAAO,SACtBE,IAAa,QAAU,KAAK,yBAAyB,iBAAiBD,EAAM,IAAI,oBAAoB,CAAC,EACrG,KAAK,yBAAyBC,IAAa,OAAS,KAClD,CACA,iBAAkBF,EAAO,iBAEzB,UAAWE,IAAa,OAAS,KAAO,CACtC,SAAU,CACZ,CACF,CAAC,EACH,CACF,EACA,SAASN,GAAaO,EAAMC,EAAW,CACrC,IAAIH,EAAQE,EAAK,OACjB,OAAOF,EAAM,IAAI,gBAAgB,GAAKA,EAAM,IAAI,qBAAqB,IAAMG,CAC7E,CACA,IAAOC,IAAQ1B,ICzFf,IAAI2B,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KACpBG,CACT,CACA,OAAAH,EAAc,UAAU,KAAO,UAAY,CACzCC,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,EAC3C,KAAK,YAAY,CAAC,CAAC,CACrB,EACAD,EAAc,UAAU,YAAc,SAAUI,EAAW,CACzD,IAAIC,EAAa,KAAK,OACtBD,GAAoBE,GAAMD,EAAYD,EAAW,EAAI,EACrD,KAAK,gBAAgB,CACvB,EAIAJ,EAAc,UAAU,SAAW,SAAUO,EAAOC,EAAS,CAC3D,IAAIC,EAAgBF,EAAM,IAAI,eAAe,EAC7C,OAAOE,GAAiB,MAAQD,EAAQ,aAAa,WAAYC,CAAa,IAAM,IACtF,EACAT,EAAc,UAAU,cAAgB,SAAUU,EAAK,CAC9CC,EAAK,CAAC,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAkB,EAAG,SAAUC,EAAM,CACxHF,EAAI,eAAeE,CAAI,IAEzB,KAAK,OAAOA,CAAI,EAAIF,EAAIE,CAAI,EAEhC,EAAG,IAAI,CACT,EACAZ,EAAc,UAAU,gBAAkB,UAAY,CACpD,IAAIa,EAAa,KAAK,WAAa,CAAC,EAChCC,EAAoB,KAAK,kBAAoB,CAAC,EAC9CC,EAAoBC,GAAO,KAAK,QAAQ,gBAAgB,CAC1D,SAAU,cACZ,CAAC,EAAG,SAAUC,EAAW,CAGvB,OAAQA,EAAU,IAAI,eAAe,GAAK,KAAO,KAAK,cACxD,EAAG,IAAI,EACAN,EAAKI,EAAY,SAAUE,EAAW,CAC3CJ,EAAW,KAAK,MAAQI,EAAU,IAAI,KAAK,CAAC,EAC5CH,EAAkB,KAAKG,EAAU,cAAc,CACjD,CAAC,CACH,EACAjB,EAAc,KAAO,WACrBA,EAAc,aAAe,CAAC,cAAc,EAC5CA,EAAc,WAAa,MAC3BA,EAAc,cAAgB,CAE5B,EAAG,EACH,KAAM,GACN,IAAK,GACL,MAAO,GACP,OAAQ,GAGR,OAAQ,aAGR,eAAgB,GAChB,iBAAkB,KAClB,gBAAiB,EACjB,gBAAiB,GACjB,eAAgB,GAChB,mBAAoB,GAGpB,2BAA4B,CAAC,KAAO,IAAM,EAAG,EAC7C,oBAAqB,QACrB,oBAAqB,IACvB,EACOA,CACT,GAAEkB,EAAc,EACTC,IAAQnB,IC5Ef,IAAIoB,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,EAAaG,EAAKC,EAAOC,EAAaC,EAAUC,EAAW,CAClE,IAAIC,EAAQP,EAAO,KAAK,KAAME,EAAKC,EAAOC,CAAW,GAAK,KAC1D,OAAAG,EAAM,KAAOF,GAAY,QACzBE,EAAM,UAAYD,EACXC,CACT,CACA,OAAAR,EAAa,UAAU,aAAe,UAAY,CAChD,OAAO,KAAK,iBAAiB,SAAS,EAAE,IAAI,QAAQ,IAAM,YAC5D,EACOA,CACT,GAAES,EAAI,EACCC,IAAQV,ICKA,SAARW,GAA4BC,EAAOC,EAAYC,EAAQC,EAAaC,EAASC,EAAS,CAC3FL,EAAQA,GAAS,EACjB,IAAIM,EAAaJ,EAAO,CAAC,EAAIA,EAAO,CAAC,EAQrC,GANIE,GAAW,OACbA,EAAUG,GAASH,EAAS,CAAC,EAAGE,CAAU,CAAC,GAEzCD,GAAW,OACbA,EAAU,KAAK,IAAIA,EAASD,GAA4B,CAAC,GAEvDD,IAAgB,MAAO,CACzB,IAAIK,EAAa,KAAK,IAAIP,EAAW,CAAC,EAAIA,EAAW,CAAC,CAAC,EACvDO,EAAaD,GAASC,EAAY,CAAC,EAAGF,CAAU,CAAC,EACjDF,EAAUC,EAAUE,GAASC,EAAY,CAACJ,EAASC,CAAO,CAAC,EAC3DF,EAAc,CAChB,CACAF,EAAW,CAAC,EAAIM,GAASN,EAAW,CAAC,EAAGC,CAAM,EAC9CD,EAAW,CAAC,EAAIM,GAASN,EAAW,CAAC,EAAGC,CAAM,EAC9C,IAAIO,EAAmBC,GAAYT,EAAYE,CAAW,EAC1DF,EAAWE,CAAW,GAAKH,EAE3B,IAAIW,EAAgBP,GAAW,EAC3BQ,EAAaV,EAAO,MAAM,EAC9BO,EAAiB,KAAO,EAAIG,EAAW,CAAC,GAAKD,EAAgBC,EAAW,CAAC,GAAKD,EAC9EV,EAAWE,CAAW,EAAII,GAASN,EAAWE,CAAW,EAAGS,CAAU,EAEtE,IAAIC,EACJ,OAAAA,EAAeH,GAAYT,EAAYE,CAAW,EAC9CC,GAAW,OAASS,EAAa,OAASJ,EAAiB,MAAQI,EAAa,KAAOT,KAEzFH,EAAW,EAAIE,CAAW,EAAIF,EAAWE,CAAW,EAAIM,EAAiB,KAAOL,GAGlFS,EAAeH,GAAYT,EAAYE,CAAW,EAC9CE,GAAW,MAAQQ,EAAa,KAAOR,IACzCJ,EAAW,EAAIE,CAAW,EAAIF,EAAWE,CAAW,EAAIU,EAAa,KAAOR,GAEvEJ,CACT,CACA,SAASS,GAAYT,EAAYE,EAAa,CAC5C,IAAIW,EAAOb,EAAWE,CAAW,EAAIF,EAAW,EAAIE,CAAW,EAG/D,MAAO,CACL,KAAM,KAAK,IAAIW,CAAI,EACnB,KAAMA,EAAO,EAAI,GAAKA,EAAO,EAAI,EAAIX,EAAc,GAAK,CAC1D,CACF,CACA,SAASI,GAASQ,EAAOC,EAAQ,CAC/B,OAAO,KAAK,IAAIA,EAAO,CAAC,GAAK,KAAOA,EAAO,CAAC,EAAI,IAAU,KAAK,IAAIA,EAAO,CAAC,GAAK,KAAOA,EAAO,CAAC,EAAI,KAAWD,CAAK,CAAC,CACtH,CC1DA,IAAIE,GAAcA,EACdC,IAAU,KAAK,IACfC,IAAU,KAAK,IACfC,IAAY,KAAK,MACjBC,IAAW,KAAK,KAChBC,IAAmBA,GACnBC,IAAK,KAAK,GACVC,KAAwB,UAAY,CACtC,SAASA,EAASC,EAAeC,EAASC,EAAK,CAC7C,KAAK,KAAO,WAIZ,KAAK,SAAkBC,GAAc,EAKrC,KAAK,YAAc,CAAC,EACpB,KAAK,WAAaH,EAAc,WAChC,KAAK,OAASA,EACd,KAAK,MAAMA,EAAeC,EAASC,CAAG,CACxC,CACA,OAAAH,EAAS,UAAU,MAAQ,SAAUC,EAAeC,EAASC,EAAK,CAChE,IAAIE,EAAaJ,EAAc,WAC3BK,EAAoBL,EAAc,kBACtCR,GAAKY,EAAY,SAAUE,EAAKC,EAAK,CACnC,IAAIC,EAAYH,EAAkBE,CAAG,EACjCE,EAAYR,EAAQ,aAAa,eAAgBO,CAAS,EAC1DE,EAAO,KAAK,SAAS,IAAIJ,EAAK,IAAIK,IAAaL,EAAgBM,GAAmBH,CAAS,EAAG,CAAC,EAAG,CAAC,EAAGA,EAAU,IAAI,MAAM,EAAGD,CAAS,CAAC,EACvIK,EAAaH,EAAK,OAAS,WAC/BA,EAAK,OAASG,GAAcJ,EAAU,IAAI,aAAa,EACvDC,EAAK,QAAUD,EAAU,IAAI,SAAS,EAEtCA,EAAU,KAAOC,EACjBA,EAAK,MAAQD,EACbC,EAAK,iBAAmBD,EAAU,iBAAmB,IACvD,EAAG,IAAI,CACT,EAIAV,EAAS,UAAU,OAAS,SAAUE,EAASC,EAAK,CAClD,KAAK,sBAAsB,KAAK,OAAQD,CAAO,CACjD,EACAF,EAAS,UAAU,aAAe,SAAUe,EAAO,CACjD,IAAIC,EAAa,KAAK,gBAAgB,EAClCC,EAAWD,EAAW,SACtBE,EAAaF,EAAW,WACxBG,EAAgBH,EAAW,cAC3BI,EAAQL,EAAM,EAAII,CAAa,EAC/BE,EAAUN,EAAMI,CAAa,EACjC,OAAOC,GAASH,GAAYG,GAASH,EAAWD,EAAW,YAAcK,GAAWH,GAAcG,GAAWH,EAAaF,EAAW,YACvI,EACAhB,EAAS,UAAU,SAAW,UAAY,CACxC,OAAO,KAAK,MACd,EAIAA,EAAS,UAAU,sBAAwB,SAAUC,EAAeC,EAAS,CAC3EA,EAAQ,WAAW,SAAUoB,EAAa,CACxC,GAAKrB,EAAc,SAASqB,EAAapB,CAAO,EAGhD,KAAIqB,EAAOD,EAAY,QAAQ,EAC/B7B,GAAK,KAAK,WAAY,SAAUc,EAAK,CACnC,IAAII,EAAO,KAAK,SAAS,IAAIJ,CAAG,EAChCI,EAAK,MAAM,oBAAoBY,EAAMA,EAAK,aAAahB,CAAG,CAAC,EAChDiB,GAAgBb,EAAK,MAAOA,EAAK,KAAK,CACnD,EAAG,IAAI,EACT,EAAG,IAAI,CACT,EAIAX,EAAS,UAAU,OAAS,SAAUC,EAAeE,EAAK,CACxD,IAAIsB,EAA0BC,GAAyBzB,EAAeE,CAAG,EAAE,aAC3E,KAAK,MAAmBwB,GAAc1B,EAAc,mBAAmB,EAAGwB,CAAY,EACtF,KAAK,YAAY,CACnB,EACAzB,EAAS,UAAU,QAAU,UAAY,CACvC,OAAO,KAAK,KACd,EACAA,EAAS,UAAU,gBAAkB,UAAY,CAC/C,IAAIC,EAAgB,KAAK,OACrB2B,EAAO,KAAK,MACZC,EAAK,CAAC,IAAK,GAAG,EACdC,EAAK,CAAC,QAAS,QAAQ,EACvBC,EAAS9B,EAAc,IAAI,QAAQ,EACnCkB,EAAgBY,IAAW,aAAe,EAAI,EAC9CC,EAAeJ,EAAKE,EAAGX,CAAa,CAAC,EACrCc,EAAe,CAAC,EAAGD,CAAY,EAC/BE,EAAY,KAAK,WAAW,OAC5BC,EAAkBC,GAASnC,EAAc,IAAI,iBAAiB,EAAGgC,CAAY,EAC7EI,EAAkBD,GAASnC,EAAc,IAAI,iBAAiB,GAAK,EAAG,CAAC,EAAGiC,CAAS,CAAC,EACpFI,EAAiBrC,EAAc,IAAI,gBAAgB,GAAKiC,EAAY,GAAKA,EAAYG,GAAmBA,EAAkB,GAAKF,EAAkB,GAAKH,EAAe,EAIrKO,EAAmBtC,EAAc,IAAI,kBAAkB,EACvDuC,EACJ,GAAKD,EAMHC,EAAUJ,GAASG,EAAiB,CAAC,EAAIA,EAAiB,CAAC,EAAGN,CAAY,EAC1EM,EAAiB,CAAC,EAAIA,EAAiB,CAAC,EAAIC,MAPvB,CACrBA,EAAUJ,GAASD,GAAmBE,EAAkB,GAAIJ,CAAY,EACxE,IAAIQ,EAAmBxC,EAAc,IAAI,kBAAkB,GAAKL,IAAUsC,EAAY,CAAC,EACvFK,EAAmB,CAACJ,EAAkBM,EAAmBD,EAAU,CAAC,EACpED,EAAiB,CAAC,EAAIA,EAAiB,CAAC,EAAIC,CAC9C,CAIA,IAAIE,GAAqBV,EAAeQ,IAAYN,EAAYG,GAEhEK,EAAoB,IAAMA,EAAoB,GAE9C,IAAIC,EAAkB,CAAC/C,IAAUE,IAAMyC,EAAiB,CAAC,EAAIJ,EAAiB,CAAC,CAAC,EAAI,EAAGtC,IAASC,IAAMyC,EAAiB,CAAC,EAAIJ,EAAiB,CAAC,CAAC,EAAI,CAAC,EAEhJS,EAAuBF,EAAoBP,EAAkBI,EAAiB,CAAC,EACnF,MAAO,CACL,OAAQR,EACR,cAAeZ,EACf,WAAYS,EAAKC,EAAGV,CAAa,CAAC,EAClC,aAAca,EACd,SAAUJ,EAAKC,EAAG,EAAIV,CAAa,CAAC,EACpC,WAAYS,EAAKE,EAAG,EAAIX,CAAa,CAAC,EACtC,eAAgBmB,EAChB,gBAAiBH,EACjB,kBAAmBO,EACnB,iBAAkBH,EAClB,UAAWL,EACX,gBAAiBS,EACjB,qBAAsBC,CACxB,CACF,EACA5C,EAAS,UAAU,YAAc,UAAY,CAC3C,IAAI4B,EAAO,KAAK,MACZiB,EAAO,KAAK,SACZxC,EAAa,KAAK,WAClBW,EAAa,KAAK,gBAAgB,EAClCe,EAASf,EAAW,OACxB6B,EAAK,KAAK,SAAUlC,EAAM,CACxB,IAAImC,EAAa,CAAC,EAAG9B,EAAW,UAAU,EACtCR,EAAMG,EAAK,QAAU,EAAI,EAC7BA,EAAK,UAAUmC,EAAWtC,CAAG,EAAGsC,EAAW,EAAItC,CAAG,CAAC,CACrD,CAAC,EACDf,GAAKY,EAAY,SAAUE,EAAKC,EAAK,CACnC,IAAIuC,GAAW/B,EAAW,eAAiBgC,IAAuBC,KAAyBzC,EAAKQ,CAAU,EACtGkC,EAAgB,CAClB,WAAY,CACV,EAAGH,EAAQ,SACX,EAAG/B,EAAW,UAChB,EACA,SAAU,CACR,EAAG,EACH,EAAG+B,EAAQ,QACb,CACF,EACII,EAAgB,CAClB,WAAYpD,IAAK,EACjB,SAAU,CACZ,EACIqD,EAAW,CAACF,EAAcnB,CAAM,EAAE,EAAIH,EAAK,EAAGsB,EAAcnB,CAAM,EAAE,EAAIH,EAAK,CAAC,EAC9EyB,EAAWF,EAAcpB,CAAM,EAC/BuB,EAAmBC,GAAO,EACvBC,GAAOF,EAAWA,EAAWD,CAAQ,EACrCI,GAAUH,EAAWA,EAAWF,CAAQ,EAK/C,KAAK,YAAY7C,CAAG,EAAI,CACtB,SAAU6C,EACV,SAAUC,EACV,UAAWC,EACX,uBAAwBP,EAAQ,uBAChC,cAAeA,EAAQ,cACvB,qBAAsBA,EAAQ,qBAC9B,cAAe,EACf,eAAgB,CAClB,CACF,EAAG,IAAI,CACT,EAIA/C,EAAS,UAAU,QAAU,SAAUO,EAAK,CAC1C,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,EAIAP,EAAS,UAAU,YAAc,SAAU0D,EAAOnD,EAAK,CACrD,OAAO,KAAK,iBAAiB,KAAK,SAAS,IAAIA,CAAG,EAAE,YAAYmD,CAAK,EAAGnD,CAAG,CAC7E,EAMAP,EAAS,UAAU,gBAAkB,SAAUuB,EAAMoC,EAAUC,EAAOC,EAAK,CACzED,GAAS,OAASA,EAAQ,GAC1BC,GAAO,OAASA,EAAMtC,EAAK,MAAM,GACjC,IAAIuC,EAAU,KAAK,SACfzD,EAAa,KAAK,WAClB0D,EAAiB,CAAC,EAClBC,EAAa,CAAC,EACXvE,EAAKY,EAAY,SAAU4D,EAAS,CACzCF,EAAe,KAAKxC,EAAK,aAAa0C,CAAO,CAAC,EAC9CD,EAAW,KAAKF,EAAQ,IAAIG,CAAO,EAAE,KAAK,CAC5C,CAAC,EAED,QADIC,EAAe,KAAK,eAAe,EAC9BC,EAAYP,EAAOO,EAAYN,EAAKM,IAAa,CACxD,IAAIC,EAAc,OAClB,GAAI,CAACF,EACHE,EAAc,aACT,CACLA,EAAc,SAEd,QADIC,EAAS9C,EAAK,UAAUwC,EAAgBI,CAAS,EAC5CG,EAAI,EAAGC,EAAOlE,EAAW,OAAQiE,EAAIC,EAAMD,IAAK,CACvD,IAAIE,EAAQR,EAAWM,CAAC,EAAE,eAAeD,EAAOC,CAAC,CAAC,EAClD,GAAIE,IAAU,WAAY,CACxBJ,EAAc,WACd,KACF,CACF,CACF,CACAT,EAASS,EAAaD,CAAS,CACjC,CACF,EAIAnE,EAAS,UAAU,eAAiB,UAAY,CAI9C,QAHIK,EAAa,KAAK,WAClByD,EAAU,KAAK,SACfI,EAAe,GACVI,EAAI,EAAGC,EAAOlE,EAAW,OAAQiE,EAAIC,EAAMD,IAC9CR,EAAQ,IAAIzD,EAAWiE,CAAC,CAAC,EAAE,MAAM,eAAe,IAAM,WACxDJ,EAAe,IAGnB,OAAOA,CACT,EAKAlE,EAAS,UAAU,iBAAmB,SAAUyE,EAAOlE,EAAK,CAC1D,IAAImE,EAAa,KAAK,YAAYnE,CAAG,EACrC,OAAeoE,GAAe,CAACF,EAAO,CAAC,EAAGC,EAAW,SAAS,CAChE,EAIA1E,EAAS,UAAU,cAAgB,SAAUO,EAAK,CAChD,OAAcqE,GAAM,KAAK,YAAYrE,CAAG,CAAC,CAC3C,EAIAP,EAAS,UAAU,0BAA4B,SAAUe,EAAO,CAC9D,IAAIC,EAAa,KAAK,gBAAgB,EAClCG,EAAgBH,EAAW,cAC3BuB,EAAmBvB,EAAW,iBAAiB,MAAM,EACrDwB,EAAUD,EAAiB,CAAC,EAAIA,EAAiB,CAAC,EAClDsC,EAAS,CAAC,EAAG7D,EAAW,iBAAmBA,EAAW,UAAY,EAAE,EAExE,GAAI,CAAC,KAAK,aAAaD,CAAK,EAC1B,MAAO,CACL,SAAU,OACV,iBAAkBwB,CACpB,EAGF,IAAIuC,EAAa/D,EAAMI,CAAa,EAAIH,EAAW,WAAaA,EAAW,qBAGvE+D,EACAC,EAAW,QACXtC,EAAoB1B,EAAW,kBAC/BiE,EAAc,KAAK,OAAO,IAAI,4BAA4B,EAE1DC,EAAUD,EAAY,CAAC,GAAK,KAChC,GAAIvC,EACEwC,GAAWxC,GAAqBoC,EAAatC,EAAUyC,EAAY,CAAC,GACtED,EAAW,OACXD,EAAQD,EAAatC,EAAUyC,EAAY,CAAC,GACnCC,GAAWxC,GAAqBoC,EAAatC,GAAW,EAAIyC,EAAY,CAAC,IAClFD,EAAW,OACXD,EAAQD,EAAatC,GAAW,EAAIyC,EAAY,CAAC,KAEhDF,EAAQD,EAAatC,EAAUyC,EAAY,CAAC,IAAM,IAAMF,EAAQD,EAAatC,GAAW,EAAIyC,EAAY,CAAC,KAAO,IAAMF,EAAQ,GAEjIA,GAAS/D,EAAW,gBAAkB0B,EACtCqC,EAAQI,GAAWJ,EAAOxC,EAAkBsC,EAAQ,KAAK,EAEvDG,EAAW,WAGV,CACH,IAAII,EAAW7C,EAAiB,CAAC,EAAIA,EAAiB,CAAC,EACnD8C,EAAMR,EAAO,CAAC,EAAIC,EAAaM,EACnC7C,EAAmB,CAAC5C,IAAQ,EAAG0F,EAAMD,EAAW,CAAC,CAAC,EAClD7C,EAAiB,CAAC,EAAI7C,IAAQmF,EAAO,CAAC,EAAGtC,EAAiB,CAAC,EAAI6C,CAAQ,EACvE7C,EAAiB,CAAC,EAAIA,EAAiB,CAAC,EAAI6C,CAC9C,CACA,MAAO,CACL,iBAAkB7C,EAClB,SAAUyC,CACZ,CACF,EACOhF,CACT,GAAE,EACF,SAASoC,GAASkD,EAAKT,EAAQ,CAC7B,OAAOnF,IAAQC,IAAQ2F,EAAKT,EAAO,CAAC,CAAC,EAAGA,EAAO,CAAC,CAAC,CACnD,CACA,SAAS5B,IAAwBxC,EAAWO,EAAY,CACtD,IAAIuE,EAAOvE,EAAW,cAAgBA,EAAW,UAAY,GAC7D,MAAO,CACL,SAAUuE,EAAO9E,EACjB,uBAAwB8E,EACxB,cAAe,EACjB,CACF,CACA,SAASvC,IAAqBvC,EAAWO,EAAY,CACnD,IAAIgB,EAAehB,EAAW,aAC1BmB,EAAkBnB,EAAW,gBAC7BkB,EAAYlB,EAAW,UACvB0B,EAAoB1B,EAAW,kBAC/B2B,EAAkB3B,EAAW,gBAC7BoC,EACAoC,EAAyB9C,EACzB+C,EAAgB,GAChBC,EACJ,OAAIjF,EAAYkC,EAAgB,CAAC,GAC/BS,EAAW3C,EAAYiC,EACvBgD,EAAuBhD,GACdjC,GAAakC,EAAgB,CAAC,GACvCS,EAAWpC,EAAW,qBAAuBP,EAAY0B,EAAkBnB,EAAW,iBAAiB,CAAC,EACxGwE,EAAyBrD,EACzBsD,EAAgB,KAEhBrC,EAAWpB,GAAgBE,EAAY,EAAIzB,GAAaiC,EACxDgD,EAAuBhD,GAElB,CACL,SAAUU,EACV,uBAAwBoC,EACxB,cAAeC,EACf,qBAAsBC,CACxB,CACF,CACA,IAAOC,IAAQ3F,ICvWf,SAAS4F,IAAuBC,EAASC,EAAK,CAC5C,IAAIC,EAAe,CAAC,EACpB,OAAAF,EAAQ,cAAc,WAAY,SAAUG,EAAeC,EAAK,CAC9D,IAAIC,EAAW,IAAIC,IAASH,EAAeH,EAASC,CAAG,EACvDI,EAAS,KAAO,YAAcD,EAC9BC,EAAS,OAAOF,EAAeF,CAAG,EAClCE,EAAc,iBAAmBE,EACjCA,EAAS,MAAQF,EACjBD,EAAa,KAAKG,CAAQ,CAC5B,CAAC,EAEDL,EAAQ,WAAW,SAAUO,EAAa,CACxC,GAAIA,EAAY,IAAI,kBAAkB,IAAM,WAAY,CACtD,IAAIJ,EAAgBI,EAAY,uBAAuB,WAAYC,EAAgB,EAAE,OAAO,CAAC,EAC7FD,EAAY,iBAAmBJ,EAAc,gBAC/C,CACF,CAAC,EACMD,CACT,CACA,IAAIO,IAA0B,CAC5B,OAAQV,GACV,EACOW,IAAQD,ICrBf,IAAIE,KAAiC,SAAUC,EAAQ,CACrDC,EAAUF,EAAmBC,CAAM,EACnC,SAASD,GAAoB,CAC3B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAkB,KAI/BG,EAAM,gBAAkB,CAAC,EAClBA,CACT,CACA,OAAAH,EAAkB,UAAU,mBAAqB,UAAY,CAC3D,OAAOI,GAAgB,CAAC,CAAC,OAAQ,OAAO,EAAG,CAAC,YAAa,aAAa,EAAG,CAAC,SAAU,aAAa,EAAG,CAAC,QAAS,OAAO,EAAG,CAAC,UAAW,SAAS,CAG7I,CAAC,EAAE,KAAK,SAAS,iBAAiB,CAAC,CACrC,EASAJ,EAAkB,UAAU,mBAAqB,SAAUK,EAAW,CACpE,IAAIC,EAAkB,KAAK,gBAAyBC,GAAMF,CAAS,EAEnE,GAAIC,EACF,QAAS,EAAIA,EAAgB,OAAS,EAAG,GAAK,EAAG,IACpCE,GAAIF,EAAgB,CAAC,CAAC,CAGvC,EAKAN,EAAkB,UAAU,eAAiB,SAAUS,EAAO,CAC5D,IAAIH,EAAkB,KAAK,gBAC3B,GAAI,CAACA,EAAgB,OACnB,MAAO,SAET,GAAIG,GAAS,MAAQ,MAAM,CAACA,CAAK,EAC/B,MAAO,WAGT,GAAIH,EAAgB,SAAW,EAAG,CAChC,IAAII,EAAWJ,EAAgB,CAAC,EAChC,GAAII,EAAS,CAAC,GAAKD,GAASA,GAASC,EAAS,CAAC,EAC7C,MAAO,QAEX,KACE,SAASC,EAAI,EAAGC,EAAMN,EAAgB,OAAQK,EAAIC,EAAKD,IACrD,GAAIL,EAAgBK,CAAC,EAAE,CAAC,GAAKF,GAASA,GAASH,EAAgBK,CAAC,EAAE,CAAC,EACjE,MAAO,SAIb,MAAO,UACT,EACOX,CACT,GAAEa,EAAc,EACTC,GAAMd,IAAmBe,EAAoB,EACpD,IAAOC,GAAQhB,IC/Df,IAAIiB,GAAqB,GACrBC,GAAU,KAAK,IACfC,GAAU,KAAK,IACfC,IAAU,KAAK,IACfC,IAAU,IACVC,IAAqB,EACrBC,IAAwB,EACxBC,IAAqB,YACrBC,IAAgB,CAClB,EAAG,CAAC,EAAG,CAAC,EACR,EAAG,CAAC,EAAG,CAAC,EACR,EAAG,CAAC,EAAG,CAAC,EACR,EAAG,CAAC,EAAG,CAAC,CACV,EACIC,IAAa,CACf,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,GAAI,OACJ,GAAI,OACJ,GAAI,OACJ,GAAI,MACN,EACIC,IAAoB,CACtB,WAAY,CACV,UAAW,EACX,OAAQC,EAAO,MAAM,eACrB,KAAMA,EAAO,MAAM,UACrB,EACA,cAAe,GACf,UAAW,SACX,cAAe,EACjB,EACIC,IAAU,EAUVC,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,EAAgBG,EAAI,CAC3B,IAAIC,EAAQH,EAAO,KAAK,IAAI,GAAK,KAIjC,OAAAG,EAAM,OAAS,CAAC,EAIhBA,EAAM,QAAU,CAAC,EACjBA,EAAM,UAAY,CAAC,EAInBA,EAAM,IAAMD,EACZC,EAAM,MAAQ,IAAYC,GAC1BD,EAAM,KAAO,mBAAqBL,MAClCO,EAAKC,IAAiB,SAAUC,EAASC,EAAW,CAClD,KAAK,UAAUA,CAAS,EAAIC,GAAKF,EAAS,IAAI,CAChD,EAAGJ,CAAK,EACDA,CACT,CAIA,OAAAJ,EAAgB,UAAU,YAAc,SAAUW,EAAa,CAI7D,YAAK,YAAc,KAAK,gBAAgB,EACxCA,EAAY,WAAa,KAAK,eAAeA,CAAW,EACjD,IACT,EACAX,EAAgB,UAAU,eAAiB,SAAUW,EAAa,CAChE,IAAIR,EAAK,KAAK,IAET,KAAK,kBACSS,IAAKT,EAAIT,IAAoB,KAAK,IAAI,EAEzDY,EAAK,KAAK,UAAW,SAAUE,EAASC,EAAW,CACjDN,EAAG,GAAGM,EAAWD,CAAO,CAC1B,CAAC,EACD,KAAK,WAAaG,EAAY,UAC9B,KAAK,aAAeE,GAAMC,GAAMjB,GAAiB,EAAGc,EAAa,EAAI,CACvE,EACAX,EAAgB,UAAU,gBAAkB,UAAY,CACtD,IAAIG,EAAK,KAAK,IACGY,IAAQZ,EAAIT,IAAoB,KAAK,IAAI,EAC1DY,EAAK,KAAK,UAAW,SAAUE,EAASC,EAAW,CACjDN,EAAG,IAAIM,EAAWD,CAAO,CAC3B,CAAC,EACD,KAAK,WAAa,KAAK,aAAe,IACxC,EAIAR,EAAgB,UAAU,UAAY,SAAUgB,EAAW,CACzD,GAAIA,GAAaA,EAAU,OAAQ,CACjC,IAAIC,EAAW,KAAK,QAAU,CAAC,EAC/BX,EAAKU,EAAW,SAAUA,EAAW,CACnCC,EAASD,EAAU,OAAO,EAAIF,GAAME,CAAS,CAC/C,CAAC,CACH,MACE,KAAK,QAAU,KAEjB,OAAO,IACT,EACAhB,EAAgB,UAAU,MAAQ,SAAUkB,EAAK,CAC/CA,EAAMA,GAAO,CAAC,EAId,KAAK,iBAAmBA,EAAI,gBAC5B,IAAIC,EAAY,KAAK,MACrB,YAAK,IAAI,IAAIA,CAAS,EACtBA,EAAU,KAAK,CACb,EAAGD,EAAI,GAAK,EACZ,EAAGA,EAAI,GAAK,EACZ,SAAUA,EAAI,UAAY,EAC1B,OAAQA,EAAI,QAAU,EACtB,OAAQA,EAAI,QAAU,CACxB,CAAC,EACD,KAAK,WAAaC,EAAU,kBAAkB,EACvC,IACT,EASAnB,EAAgB,UAAU,aAAe,SAAUoB,EAAiB,CAIlEA,EAAkBC,EAAID,EAAiB,SAAUE,EAAa,CAC5D,OAAOT,GAAMC,GAAMjB,GAAiB,EAAGyB,EAAa,EAAI,CAC1D,CAAC,EACD,IAAIC,EAAc,kBACdC,EAAY,KAAK,QACjBC,EAAY,KAAK,QAAU,CAAC,EAC5BC,EAAa,KACbC,EAAgB,KAAK,eACzB,WAAIC,GAAWJ,EAAWJ,EAAiBS,EAAWC,CAAM,EAAE,IAAIC,CAAW,EAAE,OAAOA,CAAW,EAAE,OAAOC,CAAM,EAAE,QAAQ,EACnH,KACP,SAASF,EAAOnB,EAAasB,EAAO,CAClC,OAAQtB,EAAY,IAAM,KAAOA,EAAY,GAAKY,EAAcU,GAAS,IAAMtB,EAAY,SAC7F,CACA,SAASkB,EAAUK,EAAOD,EAAO,CAC/B,OAAOH,EAAOI,EAAM,cAAeD,CAAK,CAC1C,CACA,SAASF,EAAYI,EAAUC,EAAU,CACvC,IAAIC,EAAmBjB,EAAgBe,CAAQ,EAG/C,GAAIC,GAAY,MAAQZ,EAAUY,CAAQ,IAAMT,EAC9CF,EAAUU,CAAQ,EAAIX,EAAUY,CAAQ,MACnC,CACL,IAAIF,EAAQT,EAAUU,CAAQ,EAAIC,GAAY,MAAQZ,EAAUY,CAAQ,EAAE,cAAgBC,EAAkBb,EAAUY,CAAQ,GAAKE,IAAYZ,EAAYa,IAAYb,EAAYW,CAAgB,CAAC,EACpMG,GAAyBd,EAAYQ,CAAK,CAC5C,CACF,CACA,SAASF,EAAOI,EAAU,CACpBZ,EAAUY,CAAQ,IAAMT,GAC1BD,EAAW,MAAM,OAAOF,EAAUY,CAAQ,CAAC,CAE/C,CACF,EACApC,EAAgB,UAAU,QAAU,UAAY,CAM9C,YAAK,YAAY,EAAK,EAEtByC,GAAY,IAAI,EAChB,KAAK,IAAI,OAAO,KAAK,KAAK,EAInB,IACT,EACAzC,EAAgB,UAAU,QAAU,UAAY,CAC9C,KAAK,QAAQ,EACb,KAAK,IAAI,CACX,EACOA,CACT,GAAE0C,EAAQ,EACV,SAASH,IAAYb,EAAYf,EAAa,CAC5C,IAAIuB,EAAQS,GAAehC,EAAY,SAAS,EAAE,YAAYe,EAAYf,CAAW,EACrF,OAAAuB,EAAM,cAAgBvB,EACtBiC,IAAQV,EAAOvB,CAAW,EAC1Be,EAAW,MAAM,IAAIQ,CAAK,EACnBA,CACT,CACA,SAASI,IAAYZ,EAAYC,EAAe,CAC9C,IAAIkB,EAAgBC,GAAiBnB,CAAa,EAClD,OAAIkB,EAAc,cAChBA,EAAc,YAAYnB,EAAYC,CAAa,EACnDiB,IAAQjB,EAAeA,EAAc,aAAa,GAE7CA,CACT,CACA,SAASoB,IAAiBrB,EAAYQ,EAAO,CAC3C,IAAIvB,EAAcuB,EAAM,cACxBY,GAAiBZ,CAAK,EAAE,iBAAiBR,EAAYQ,EAAOvB,EAAY,MAAOA,CAAW,CAC5F,CACA,SAASiC,IAAQV,EAAOvB,EAAa,CACnC,IAAIqC,EAAIrC,EAAY,EACpBqC,GAAK,OAASA,EAAIzD,KAClB2C,EAAM,SAAS,SAAUe,EAAI,CAC3BA,EAAG,EAAID,EACPC,EAAG,GAAKD,CACV,CAAC,CACH,CACA,SAASR,GAAyBd,EAAYQ,EAAO,CACnDY,GAAiBZ,CAAK,EAAE,aAAaR,EAAYQ,CAAK,EACtDa,IAAiBrB,EAAYQ,CAAK,CACpC,CACA,SAASY,GAAiBZ,EAAO,CAC/B,OAAOS,GAAeT,EAAM,cAAc,SAAS,CACrD,CAEA,SAASgB,GAAgBxB,EAAYyB,EAAGC,EAAkB,CACxD,IAAIC,EAAS3B,EAAW,QACxB,GAAI,CAAC2B,EACH,OAAOlE,GAET,IAAImE,EACAC,EAAY7B,EAAW,WAC3B,OAAApB,EAAK+C,EAAQ,SAAUG,EAAI,CACzBA,EAAG,iBAAiBL,EAAGC,EAAkBG,CAAS,IAAMD,EAAQE,EAClE,CAAC,EACMF,CACT,CAEA,SAASG,IAAgB/B,EAAYQ,EAAO,CAC1C,IAAImB,EAAS3B,EAAW,QACxB,GAAI,CAAC2B,EACH,OAAOlE,GAET,IAAIuE,EAAUxB,EAAM,cAAc,QAGlC,OAAOwB,GAAW,KAAOL,EAAOK,CAAO,EAAIvE,EAC7C,CACA,SAASsD,GAAYf,EAAY,CAC/B,IAAIiC,EAASjC,EAAW,QACpBkC,EAAiBD,EAAO,OAC5B,OAAArD,EAAKqD,EAAQ,SAAUzB,EAAO,CAC5BR,EAAW,MAAM,OAAOQ,CAAK,CAC/B,EAAGR,CAAU,EACbiC,EAAO,OAAS,EACT,CAAC,CAACC,CACX,CACA,SAASC,GAAQnC,EAAYR,EAAK,CAChC,IAAI4C,EAAQzC,EAAIK,EAAW,QAAS,SAAUQ,EAAO,CACnD,IAAIvB,EAAcuB,EAAM,cACpB6B,EAAQjD,GAAMH,EAAY,KAAK,EACnC,MAAO,CACL,UAAWA,EAAY,UACvB,QAASA,EAAY,QACrB,MAAOoD,CACT,CACF,CAAC,EACDrC,EAAW,QAAQ,QAAS,CAC1B,MAAOoC,EACP,MAAO,CAAC,CAAC5C,EAAI,MACb,cAAe,CAAC,CAACA,EAAI,aACvB,CAAC,CACH,CACA,SAAS8C,IAAgBtC,EAAY,CACnC,IAAIuC,EAAQvC,EAAW,OACvB,GAAI,CAACuC,EAAM,OACT,MAAO,GAET,IAAIC,EAAKD,EAAMA,EAAM,OAAS,CAAC,EAC3BE,EAAKF,EAAM,CAAC,EACZG,EAAKF,EAAG,CAAC,EAAIC,EAAG,CAAC,EACjBE,EAAKH,EAAG,CAAC,EAAIC,EAAG,CAAC,EACjBG,EAAOhF,IAAQ8E,EAAKA,EAAKC,EAAKA,EAAI,EAAG,EACzC,OAAOC,EAAO9E,GAChB,CACA,SAAS+E,IAAaN,EAAO,CAC3B,IAAIO,EAAOP,EAAM,OAAS,EAC1B,OAAAO,EAAO,IAAMA,EAAO,GACb,CAACP,EAAM,CAAC,EAAGA,EAAMO,CAAI,CAAC,CAC/B,CAEA,SAASC,IAAoBC,EAAoBhD,EAAYf,EAAagE,EAAmB,CAC3F,IAAIzC,EAAQ,IAAY7B,GACxB,OAAA6B,EAAM,IAAI,IAAY0C,GAAK,CACzB,KAAM,OACN,MAAOC,GAAUlE,CAAW,EAC5B,OAAQ,GACR,UAAW,GACX,OAAQ,OACR,MAAOmE,GAAMC,IAAWL,EAAoBhD,EAAYQ,EAAO,CAAC,IAAK,IAAK,IAAK,GAAG,CAAC,EACnF,UAAW4C,GAAMjB,GAASnC,EAAY,CACpC,MAAO,EACT,CAAC,CACH,CAAC,CAAC,EACFpB,EAAKqE,EAAmB,SAAUK,EAAc,CAC9C9C,EAAM,IAAI,IAAY0C,GAAK,CACzB,KAAMI,EAAa,KAAK,EAAE,EAC1B,MAAO,CACL,QAAS,CACX,EACA,UAAW,GACX,OAAQ,GACR,UAAW,GACX,MAAOF,GAAMC,IAAWL,EAAoBhD,EAAYQ,EAAO8C,CAAY,EAC3E,UAAWF,GAAMjB,GAASnC,EAAY,CACpC,MAAO,EACT,CAAC,CACH,CAAC,CAAC,CACJ,CAAC,EACMQ,CACT,CACA,SAAS+C,IAAevD,EAAYQ,EAAOgD,EAAYvE,EAAa,CAClE,IAAIwE,EAAYxE,EAAY,WAAW,WAAa,EAChDyE,EAAa/F,GAAQ8F,EAAW1F,GAAqB,EACrD4F,EAAIH,EAAW,CAAC,EAAE,CAAC,EACnBI,EAAIJ,EAAW,CAAC,EAAE,CAAC,EACnBK,EAAKF,EAAIF,EAAY,EACrBK,EAAKF,EAAIH,EAAY,EACrBM,EAAKP,EAAW,CAAC,EAAE,CAAC,EACpBQ,EAAKR,EAAW,CAAC,EAAE,CAAC,EACpBS,EAAMF,EAAKL,EAAaD,EAAY,EACpCS,EAAMF,EAAKN,EAAaD,EAAY,EACpCU,EAAQJ,EAAKJ,EACbS,EAASJ,EAAKJ,EACdS,EAASF,EAAQV,EACjBa,EAAUF,EAASX,EACvBc,GAAgBvE,EAAYQ,EAAO,OAAQmD,EAAGC,EAAGO,EAAOC,CAAM,EAC1DnF,EAAY,gBACdsF,GAAgBvE,EAAYQ,EAAO,IAAKqD,EAAIC,EAAIJ,EAAYY,CAAO,EACnEC,GAAgBvE,EAAYQ,EAAO,IAAKyD,EAAKH,EAAIJ,EAAYY,CAAO,EACpEC,GAAgBvE,EAAYQ,EAAO,IAAKqD,EAAIC,EAAIO,EAAQX,CAAU,EAClEa,GAAgBvE,EAAYQ,EAAO,IAAKqD,EAAIK,EAAKG,EAAQX,CAAU,EACnEa,GAAgBvE,EAAYQ,EAAO,KAAMqD,EAAIC,EAAIJ,EAAYA,CAAU,EACvEa,GAAgBvE,EAAYQ,EAAO,KAAMyD,EAAKH,EAAIJ,EAAYA,CAAU,EACxEa,GAAgBvE,EAAYQ,EAAO,KAAMqD,EAAIK,EAAKR,EAAYA,CAAU,EACxEa,GAAgBvE,EAAYQ,EAAO,KAAMyD,EAAKC,EAAKR,EAAYA,CAAU,EAE7E,CACA,SAASc,GAAaxE,EAAYQ,EAAO,CACvC,IAAIvB,EAAcuB,EAAM,cACpBiE,EAAgBxF,EAAY,cAC5ByF,EAASlE,EAAM,QAAQ,CAAC,EAC5BkE,EAAO,SAASvB,GAAUlE,CAAW,CAAC,EACtCyF,EAAO,KAAK,CACV,OAAQ,CAACD,EACT,OAAQA,EAAgB,OAAS,SACnC,CAAC,EACD7F,EAAK,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,EAAG,CAAC,GAAG,EAAG,CAAC,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,CAAC,EAAG,SAAU0E,EAAc,CACzG,IAAI/B,EAAKf,EAAM,YAAY8C,EAAa,KAAK,EAAE,CAAC,EAC5CqB,EAAYrB,EAAa,SAAW,EAAIsB,GAAoB5E,EAAYsD,EAAa,CAAC,CAAC,EAAIuB,IAAoB7E,EAAYsD,CAAY,EAC3I/B,GAAMA,EAAG,KAAK,CACZ,OAAQ,CAACkD,EACT,UAAW,CAACA,EACZ,OAAQA,EAAgBvG,IAAWyG,CAAS,EAAI,UAAY,IAC9D,CAAC,CACH,CAAC,CACH,CACA,SAASJ,GAAgBvE,EAAYQ,EAAOsE,EAAMnB,EAAGC,EAAGmB,EAAGC,EAAG,CAC5D,IAAIzD,EAAKf,EAAM,YAAYsE,CAAI,EAC/BvD,GAAMA,EAAG,SAAS0D,IAAaC,GAAYlF,EAAYQ,EAAO,CAAC,CAACmD,EAAGC,CAAC,EAAG,CAACD,EAAIoB,EAAGnB,EAAIoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAC1F,CACA,SAAS7B,GAAUlE,EAAa,CAC9B,OAAOkG,GAAS,CACd,cAAe,EACjB,EAAGlG,EAAY,UAAU,CAC3B,CACA,SAASmG,IAAgBzB,EAAGC,EAAGG,EAAIC,EAAI,CACrC,IAAIqB,EAAM,CAAC3H,GAAQiG,EAAGI,CAAE,EAAGrG,GAAQkG,EAAGI,CAAE,CAAC,EACrCsB,EAAM,CAAC3H,GAAQgG,EAAGI,CAAE,EAAGpG,GAAQiG,EAAGI,CAAE,CAAC,EACzC,MAAO,CAAC,CAACqB,EAAI,CAAC,EAAGC,EAAI,CAAC,CAAC,EAAG,CAACD,EAAI,CAAC,EAAGC,EAAI,CAAC,CAAC,CACzC,CACF,CACA,SAASC,IAAavF,EAAY,CAChC,OAAeuF,GAAavF,EAAW,KAAK,CAC9C,CACA,SAAS4E,GAAoB5E,EAAYwF,EAAc,CACrD,IAAI7F,EAAM,CACR,EAAG,OACH,EAAG,QACH,EAAG,MACH,EAAG,QACL,EACI8F,EAAa,CACf,KAAM,IACN,MAAO,IACP,IAAK,IACL,OAAQ,GACV,EACIC,EAAcC,GAAmBhG,EAAI6F,CAAY,EAAGD,IAAavF,CAAU,CAAC,EAChF,OAAOyF,EAAWC,CAAG,CACvB,CACA,SAASb,IAAoB7E,EAAY4F,EAAiB,CACxD,IAAIjB,EAAY,CAACC,GAAoB5E,EAAY4F,EAAgB,CAAC,CAAC,EAAGhB,GAAoB5E,EAAY4F,EAAgB,CAAC,CAAC,CAAC,EACzH,OAACjB,EAAU,CAAC,IAAM,KAAOA,EAAU,CAAC,IAAM,MAAQA,EAAU,QAAQ,EAC7DA,EAAU,KAAK,EAAE,CAC1B,CACA,SAAStB,IAAUL,EAAoBhD,EAAYQ,EAAOqF,EAAiBnD,EAAIC,EAAI,CACjF,IAAI1D,EAAcuB,EAAM,cACpBsF,EAAY9C,EAAmB,YAAY/D,EAAY,KAAK,EAC5D8G,EAAaC,IAAahG,EAAY0C,EAAIC,CAAE,EAChD/D,EAAKiH,EAAiB,SAAUI,EAAS,CACvC,IAAIC,EAAMjI,IAAcgI,CAAO,EAC/BH,EAAUI,EAAI,CAAC,CAAC,EAAEA,EAAI,CAAC,CAAC,GAAKH,EAAWG,EAAI,CAAC,CAAC,CAChD,CAAC,EACDjH,EAAY,MAAQ+D,EAAmB,cAAcoC,IAAgBU,EAAU,CAAC,EAAE,CAAC,EAAGA,EAAU,CAAC,EAAE,CAAC,EAAGA,EAAU,CAAC,EAAE,CAAC,EAAGA,EAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EACxIhF,GAAyBd,EAAYQ,CAAK,EAC1C2B,GAAQnC,EAAY,CAClB,MAAO,EACT,CAAC,CACH,CACA,SAASmG,IAAanG,EAAYQ,EAAOkC,EAAIC,EAAI,CAC/C,IAAIN,EAAQ7B,EAAM,cAAc,MAC5BuF,EAAaC,IAAahG,EAAY0C,EAAIC,CAAE,EAChD/D,EAAKyD,EAAO,SAAU+D,EAAO,CAC3BA,EAAM,CAAC,GAAKL,EAAW,CAAC,EACxBK,EAAM,CAAC,GAAKL,EAAW,CAAC,CAC1B,CAAC,EACDjF,GAAyBd,EAAYQ,CAAK,EAC1C2B,GAAQnC,EAAY,CAClB,MAAO,EACT,CAAC,CACH,CACA,SAASgG,IAAahG,EAAY0C,EAAIC,EAAI,CACxC,IAAIlD,EAAYO,EAAW,MACvBqG,EAAS5G,EAAU,sBAAsBiD,EAAIC,CAAE,EAC/C2D,EAAY7G,EAAU,sBAAsB,EAAG,CAAC,EACpD,MAAO,CAAC4G,EAAO,CAAC,EAAIC,EAAU,CAAC,EAAGD,EAAO,CAAC,EAAIC,EAAU,CAAC,CAAC,CAC5D,CACA,SAASpB,GAAYlF,EAAYQ,EAAO+F,EAAM,CAC5C,IAAI3E,EAAQG,IAAgB/B,EAAYQ,CAAK,EAC7C,OAAOoB,GAASA,IAAUnE,GAAqBmE,EAAM,SAAS2E,EAAMvG,EAAW,UAAU,EAAIZ,GAAMmH,CAAI,CACzG,CACA,SAAStB,IAAauB,EAAQ,CAC5B,IAAIC,EAAO/I,GAAQ8I,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,CAAC,EACzCE,EAAOhJ,GAAQ8I,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,CAAC,EACzCG,EAAOhJ,GAAQ6I,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,CAAC,EACzCI,EAAOjJ,GAAQ6I,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,CAAC,EAC7C,MAAO,CACL,EAAGC,EACH,EAAGC,EACH,MAAOC,EAAOF,EACd,OAAQG,EAAOF,CACjB,CACF,CACA,SAASG,IAAY7G,EAAYyB,EAAGC,EAAkB,CACpD,GAEA,GAAC1B,EAAW,YAIT8G,IAAgB9G,EAAYyB,EAAE,QAASA,EAAE,OAAO,GAGnD,KAAIhD,EAAKuB,EAAW,IAChBiC,EAASjC,EAAW,QACpB+G,EAAYvF,GAAgBxB,EAAYyB,EAAGC,CAAgB,EAE/D,GAAI,CAAC1B,EAAW,UACd,QAASgH,EAAI,EAAGA,EAAI/E,EAAO,OAAQ+E,IAAK,CACtC,IAAI/H,EAAcgD,EAAO+E,CAAC,EAAE,cAC5B,GAAID,IAAcA,IAActJ,IAAsBwB,EAAY,UAAY8H,EAAU,UAAY9F,GAAehC,EAAY,SAAS,EAAE,QAAQgD,EAAO+E,CAAC,EAAGtF,EAAiB,CAAC,EAAGA,EAAiB,CAAC,CAAC,EAEnM,MAEJ,CAEFqF,GAAatI,EAAG,eAAe,WAAW,EAC5C,CACA,SAASwI,GAAe,EAAG,CACzB,IAAIC,EAAO,EAAE,MACbA,EAAK,gBAAkBA,EAAK,eAAe,CAC7C,CACA,SAASC,GAAiB3G,EAAOmD,EAAGC,EAAG,CACrC,OAAOpD,EAAM,YAAY,MAAM,EAAE,QAAQmD,EAAGC,CAAC,CAC/C,CACA,SAASwD,IAAmBpH,EAAYyB,EAAGC,EAAkB2F,EAAO,CAClE,IAAIpH,EAAgBD,EAAW,eAC3B4B,EAAQ5B,EAAW,eACnBsH,EAAkBtH,EAAW,aAC7BuH,EAEJ,GADAvH,EAAW,OAAO,KAAK0B,EAAiB,MAAM,CAAC,EAC3CY,IAAgBtC,CAAU,GAAKC,EAAe,CAChD,GAAI2B,GAAS,CAAC3B,EAAe,CAC3BqH,EAAgB,YAAc,UAAYvG,GAAYf,CAAU,EAChE,IAAIf,EAAcG,GAAMkI,CAAe,EACvCrI,EAAY,UAAYuI,IAAmBvI,EAAY,UAAW2C,CAAK,EACvE3C,EAAY,QAAU2C,IAAUnE,GAAqB,KAAOmE,EAAM,QAClE3B,EAAgBD,EAAW,eAAiBa,IAAYb,EAAYf,CAAW,EAC/Ee,EAAW,QAAQ,KAAKC,CAAa,CACvC,CACA,GAAIA,EAAe,CACjB,IAAIkB,EAAgBF,GAAeuG,IAAmBxH,EAAW,WAAY4B,CAAK,CAAC,EAC/E6F,EAAmBxH,EAAc,cACrCwH,EAAiB,MAAQtG,EAAc,iBAAiB+D,GAAYlF,EAAYC,EAAeD,EAAW,MAAM,CAAC,EAC7GqH,IACFzG,IAAYZ,EAAYC,CAAa,EACrCkB,EAAc,aAAanB,EAAYC,CAAa,GAEtDoB,IAAiBrB,EAAYC,CAAa,EAC1CsH,EAAc,CACZ,MAAOF,CACT,CACF,CACF,MAAWA,GAASC,EAAgB,YAAc,UAAYA,EAAgB,eAMxE9F,GAAgBxB,EAAYyB,EAAGC,CAAgB,GAAKX,GAAYf,CAAU,IAC5EuH,EAAc,CACZ,MAAOF,EACP,cAAe,EACjB,GAGJ,OAAOE,CACT,CACA,SAASC,IAAmBE,EAAW9F,EAAO,CAC5C,OAAI8F,IAAc,OAIT9F,EAAM,iBAER8F,CACT,CACA,IAAI7I,IAAkB,CACpB,UAAW,SAAU,EAAG,CACtB,GAAI,KAAK,UAGP8I,IAAc,KAAM,CAAC,UACZ,CAAC,EAAE,QAAU,CAAC,EAAE,OAAO,UAAW,CAC3CV,GAAe,CAAC,EAChB,IAAIvF,EAAmB,KAAK,MAAM,sBAAsB,EAAE,QAAS,EAAE,OAAO,EAC5E,KAAK,eAAiB,KACtB,IAAIE,EAAQ,KAAK,eAAiBJ,GAAgB,KAAM,EAAGE,CAAgB,EACvEE,IACF,KAAK,UAAY,GACjB,KAAK,OAAS,CAACF,EAAiB,MAAM,CAAC,EAE3C,CACF,EACA,UAAW,SAAU,EAAG,CACtB,IAAIiC,EAAI,EAAE,QACNC,EAAI,EAAE,QACNlC,EAAmB,KAAK,MAAM,sBAAsBiC,EAAGC,CAAC,EAE5D,GADAiD,IAAY,KAAM,EAAGnF,CAAgB,EACjC,KAAK,UAAW,CAClBuF,GAAe,CAAC,EAChB,IAAIM,EAAcH,IAAmB,KAAM,EAAG1F,EAAkB,EAAK,EACrE6F,GAAepF,GAAQ,KAAMoF,CAAW,CAC1C,CACF,EACA,QAAS,SAAU,EAAG,CACpBI,IAAc,KAAM,CAAC,CACvB,CACF,EACA,SAASA,IAAc3H,EAAYyB,EAAG,CACpC,GAAIzB,EAAW,UAAW,CACxBiH,GAAexF,CAAC,EAChB,IAAIkC,EAAIlC,EAAE,QACNmC,EAAInC,EAAE,QACNC,EAAmB1B,EAAW,MAAM,sBAAsB2D,EAAGC,CAAC,EAC9D2D,EAAcH,IAAmBpH,EAAYyB,EAAGC,EAAkB,EAAI,EAC1E1B,EAAW,UAAY,GACvBA,EAAW,OAAS,CAAC,EACrBA,EAAW,eAAiB,KAE5BuH,GAAepF,GAAQnC,EAAYuH,CAAW,CAChD,CACF,CACA,SAAST,IAAgB9G,EAAY2D,EAAGC,EAAG,CACzC,IAAInF,EAAKuB,EAAW,IACpB,OAAO2D,EAAI,GAAKA,EAAIlF,EAAG,SAAS,GAAKmF,EAAI,GAAKA,EAAInF,EAAG,UAAU,CACjE,CAIA,IAAIwC,GAAiB,CACnB,MAAO2G,IAAgB,CAAC,EACxB,MAAOA,IAAgB,CAAC,EACxB,KAAM,CACJ,YAAa,SAAU5H,EAAYf,EAAa,CAC9C,SAAS4I,EAAYxF,EAAO,CAC1B,OAAOA,CACT,CACA,OAAOU,IAAoB,CACzB,YAAa8E,EACb,cAAeA,CACjB,EAAG7H,EAAYf,EAAa,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,EAAG,CAAC,GAAG,EAAG,CAAC,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,CAAC,CAAC,CAC1G,EACA,iBAAkB,SAAU6I,EAAY,CACtC,IAAIC,EAAOlF,IAAaiF,CAAU,EAClC,OAAO1C,IAAgB2C,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,CACvE,EACA,iBAAkB,SAAU/H,EAAYQ,EAAOgD,EAAYvE,EAAa,CACtEsE,IAAevD,EAAYQ,EAAOgD,EAAYvE,CAAW,CAC3D,EACA,aAAcuF,GACd,QAAS2C,EACX,EACA,QAAS,CACP,YAAa,SAAUnH,EAAYf,EAAa,CAC9C,IAAIuB,EAAQ,IAAY7B,GAGxB,OAAA6B,EAAM,IAAI,IAAYwH,GAAS,CAC7B,KAAM,OACN,MAAO7E,GAAUlE,CAAW,EAC5B,OAAQ,EACV,CAAC,CAAC,EACKuB,CACT,EACA,iBAAkB,SAAUsH,EAAY,CACtC,OAAOA,CACT,EACA,YAAa,SAAU9H,EAAYQ,EAAO,CACxCA,EAAM,OAAOA,EAAM,QAAQ,CAAC,CAAC,EAE7BA,EAAM,IAAI,IAAYyH,GAAQ,CAC5B,KAAM,OACN,UAAW,GACX,MAAO7E,GAAM+C,IAAcnG,EAAYQ,CAAK,EAC5C,UAAW4C,GAAMjB,GAASnC,EAAY,CACpC,MAAO,EACT,CAAC,CACH,CAAC,CAAC,CACJ,EACA,iBAAkB,SAAUA,EAAYQ,EAAOgD,EAAYvE,EAAa,CACtEuB,EAAM,QAAQ,CAAC,EAAE,SAAS,CACxB,OAAQ0E,GAAYlF,EAAYQ,EAAOgD,CAAU,CACnD,CAAC,CACH,EACA,aAAcgB,GACd,QAAS2C,EACX,CACF,EACA,SAASS,IAAgBM,EAAS,CAChC,MAAO,CACL,YAAa,SAAUlI,EAAYf,EAAa,CAC9C,OAAO8D,IAAoB,CACzB,YAAa,SAAUV,EAAO,CAC5B,IAAIyD,EAAY,CAACzD,EAAO,CAAC,EAAG,GAAG,CAAC,EAChC,OAAA6F,GAAWpC,EAAU,QAAQ,EACtBA,CACT,EACA,cAAe,SAAUA,EAAW,CAClC,OAAOA,EAAUoC,CAAO,CAC1B,CACF,EAAGlI,EAAYf,EAAa,CAAC,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,CAAC,EAAG,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,CAAC,CAAC,EAAEiJ,CAAO,CAAC,CACvE,EACA,iBAAkB,SAAUJ,EAAY,CACtC,IAAIC,EAAOlF,IAAaiF,CAAU,EAC9BzC,EAAM3H,GAAQqK,EAAK,CAAC,EAAEG,CAAO,EAAGH,EAAK,CAAC,EAAEG,CAAO,CAAC,EAChD5C,EAAM3H,GAAQoK,EAAK,CAAC,EAAEG,CAAO,EAAGH,EAAK,CAAC,EAAEG,CAAO,CAAC,EACpD,MAAO,CAAC7C,EAAKC,CAAG,CAClB,EACA,iBAAkB,SAAUtF,EAAYQ,EAAOgD,EAAYvE,EAAa,CACtE,IAAIkJ,EAEAvG,EAAQG,IAAgB/B,EAAYQ,CAAK,EAC7C,GAAIoB,IAAUnE,IAAsBmE,EAAM,0BACxCuG,EAAcvG,EAAM,0BAA0BsG,CAAO,MAChD,CACL,IAAIzJ,EAAKuB,EAAW,IACpBmI,EAAc,CAAC,EAAG,CAAC1J,EAAG,SAAS,EAAGA,EAAG,UAAU,CAAC,EAAE,EAAIyJ,CAAO,CAAC,CAChE,CACA,IAAIpC,EAAY,CAACtC,EAAY2E,CAAW,EACxCD,GAAWpC,EAAU,QAAQ,EAC7BvC,IAAevD,EAAYQ,EAAOsF,EAAW7G,CAAW,CAC1D,EACA,aAAcuF,GACd,QAAS2C,EACX,CACF,CACA,IAAOiB,GAAQ9J,IC3rBR,SAAS+J,GAAsBC,EAAM,CAC1C,OAAAA,EAAOC,GAAcD,CAAI,EAClB,SAAUE,EAAa,CAC5B,OAAmBC,GAAiBD,EAAaF,CAAI,CACvD,CACF,CACO,SAASI,GAA2BJ,EAAMK,EAAkB,CACjE,OAAAL,EAAOC,GAAcD,CAAI,EAClB,SAAUM,EAAS,CACxB,IAAIC,EAAMF,GAA8CC,EACpDE,EAAaD,EAAMP,EAAK,MAAQA,EAAK,OACrCS,EAAOF,EAAMP,EAAK,EAAIA,EAAK,EAC/B,MAAO,CAACS,EAAMA,GAAQD,GAAc,EAAE,CACxC,CACF,CACO,SAASE,GAAyBV,EAAMW,EAAKC,EAAa,CAC/D,IAAIC,EAAeZ,GAAcD,CAAI,EACrC,OAAO,SAAUc,EAAGC,EAAkB,CACpC,OAAOF,EAAa,QAAQE,EAAiB,CAAC,EAAGA,EAAiB,CAAC,CAAC,GAAK,CAACC,GAAoBF,EAAGH,EAAKC,CAAW,CACnH,CACF,CAEA,SAASX,GAAcD,EAAM,CAC3B,OAAOiB,GAAa,OAAOjB,CAAI,CACjC,CCpBA,IAAIkB,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KACvBG,CACT,CACA,OAAAH,EAAiB,UAAU,KAAO,SAAUI,EAASC,EAAK,CACxDJ,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,GAC1C,KAAK,iBAAmB,IAAIK,GAAgBD,EAAI,MAAM,CAAC,GAAG,GAAG,QAAgBE,GAAK,KAAK,SAAU,IAAI,CAAC,CACzG,EACAP,EAAiB,UAAU,OAAS,SAAUQ,EAAWJ,EAASC,EAAKI,EAAS,CAC9E,GAAI,CAAAC,IAAmBF,EAAWJ,EAASK,CAAO,EAGlD,MAAK,UAAYD,EACjB,KAAK,IAAMH,EACX,KAAK,MAAM,UAAU,EACrB,IAAIM,EAAe,KAAK,WAGxB,GAFA,KAAK,WAAa,IAAYC,GAC9B,KAAK,MAAM,IAAI,KAAK,UAAU,EAC1B,EAACJ,EAAU,IAAI,MAAM,EAGzB,KAAIK,EAAgBC,IAAiBN,EAAWJ,CAAO,EACnDW,EAAWF,EAAc,iBACzBG,EAAkBR,EAAU,mBAAmB,EAC/CS,EAAYD,EAAgB,MAC5BE,EAAMV,EAAU,KAAK,IACrBW,EAAaJ,EAAS,cAAcG,CAAG,EACvCE,EAAoBC,EAAO,CAC7B,uBAAwBJ,CAC1B,EAAGE,CAAU,EACTG,EAAc,IAAIC,GAAYf,EAAWH,EAAKe,CAAU,EAC5DE,EAAY,MAAM,EAClB,KAAK,WAAW,IAAIA,EAAY,KAAK,EACrC,KAAK,wBAAwBF,EAAYJ,EAAiBR,EAAWK,EAAeI,EAAWZ,CAAG,EAC1FmB,GAAgBb,EAAc,KAAK,WAAYH,CAAS,GAClE,EAQAR,EAAiB,UAAU,wBAA0B,SAAUoB,EAAYJ,EAAiBR,EAAWK,EAAeI,EAAWZ,EAAK,CAEpI,IAAIoB,EAASjB,EAAU,KAAK,UAAU,EAClCkB,EAAYD,EAAO,CAAC,EAAIA,EAAO,CAAC,EAChCE,EAAQ,KAAK,IAAI,GAAI,KAAK,IAAID,CAAS,EAAI,EAAG,EAG9CE,EAAeC,GAAa,OAAO,CACrC,EAAGJ,EAAO,CAAC,EACX,EAAG,CAACR,EAAY,EAChB,MAAOS,EACP,OAAQT,CACV,CAAC,EACDW,EAAK,GAAKD,EACVC,EAAK,OAAS,EAAID,EAClB,KAAK,iBAAiB,MAAM,CAC1B,gBAAiB,GACjB,SAAUP,EAAW,SACrB,EAAGA,EAAW,SAAS,CAAC,EACxB,EAAGA,EAAW,SAAS,CAAC,CAC1B,CAAC,EAAE,UAAU,CAAC,CACZ,QAAS,KACT,SAAsBU,GAAsBF,CAAI,EAChD,iBAA8BG,GAAyBH,EAAMvB,EAAKQ,CAAa,EAC/E,0BAAuCmB,GAA2BJ,EAAM,CAAC,CAC3E,CAAC,CAAC,EAAE,YAAY,CACd,UAAW,QACX,WAAYZ,EACZ,cAAe,EACjB,CAAC,EAAE,aAAaiB,IAAiBzB,CAAS,CAAC,CAC7C,EACAR,EAAiB,UAAU,SAAW,SAAUkC,EAAY,CAC1D,IAAIC,EAAgBD,EAAW,MAE3B1B,EAAY,KAAK,UACjB4B,EAAO5B,EAAU,KACjB6B,EAAmBC,EAAIH,EAAe,SAAUI,EAAW,CAC7D,MAAO,CAACH,EAAK,YAAYG,EAAU,MAAM,CAAC,EAAG,EAAI,EAAGH,EAAK,YAAYG,EAAU,MAAM,CAAC,EAAG,EAAI,CAAC,CAChG,CAAC,GAIG,CAAC/B,EAAU,OAAO,WAAa0B,EAAW,OAASA,EAAW,gBAEhE,KAAK,IAAI,eAAe,CACtB,KAAM,iBACN,eAAgB1B,EAAU,GAC1B,UAAW6B,CACb,CAAC,CAEL,EACArC,EAAiB,UAAU,QAAU,UAAY,CAC/C,KAAK,iBAAiB,QAAQ,CAChC,EACAA,EAAiB,KAAO,eACjBA,CACT,GAAEwC,EAAa,EACf,SAAS9B,IAAmBF,EAAWJ,EAASK,EAAS,CACvD,OAAOA,GAAWA,EAAQ,OAAS,kBAAoBL,EAAQ,eAAe,CAC5E,SAAU,eACV,MAAOK,CACT,CAAC,EAAE,CAAC,IAAMD,CACZ,CACA,SAASyB,IAAiBzB,EAAW,CACnC,IAAI4B,EAAO5B,EAAU,KACrB,OAAc8B,EAAI9B,EAAU,gBAAiB,SAAUiC,EAAU,CAC/D,MAAO,CACL,UAAW,QACX,QAAS,KACT,MAAO,CAACL,EAAK,YAAYK,EAAS,CAAC,EAAG,EAAI,EAAGL,EAAK,YAAYK,EAAS,CAAC,EAAG,EAAI,CAAC,CAClF,CACF,CAAC,CACH,CACA,SAAS3B,IAAiBN,EAAWJ,EAAS,CAC5C,OAAOA,EAAQ,aAAa,WAAYI,EAAU,IAAI,eAAe,CAAC,CACxE,CACA,IAAOkC,IAAQ1C,ICjIf,IAAI2C,IAAa,CACf,KAAM,iBACN,MAAO,kBAET,EACO,SAASC,IAAuBC,EAAW,CAChDA,EAAU,eAAeF,IAAY,SAAUG,EAASC,EAAS,CAC/DA,EAAQ,cAAc,CACpB,SAAU,eACV,MAAOD,CACT,EAAG,SAAUE,EAAmB,CAC9BA,EAAkB,KAAK,MAAM,mBAAmBF,EAAQ,SAAS,CACnE,CAAC,CACH,CAAC,EAIDD,EAAU,eAAe,qBAAsB,SAAUC,EAASC,EAAS,CACzEA,EAAQ,cAAc,CACpB,SAAU,WACV,MAAOD,CACT,EAAG,SAAUG,EAAe,CAC1BA,EAAc,cAAcH,CAAO,CACrC,CAAC,CACH,CAAC,CACH,CCjBA,IAAII,IAAoB,CACtB,KAAM,QACN,gBAAiB,CACf,MAAO,GACP,YAAa,EACb,YAAa,oBACb,MAAO,oBACP,QAAS,EACX,EACA,SAAU,GACV,EAAG,EACL,EACO,SAASC,GAAQC,EAAW,CACjCA,EAAU,sBAAsBC,GAAY,EAC5CD,EAAU,uBAAuBE,GAAa,EAC9CF,EAAU,yBAAyB,WAAYG,GAAuB,EACtEH,EAAU,qBAAqBI,EAAoB,EACnDJ,EAAU,uBAAuBK,EAAiB,EAClDL,EAAU,sBAAsBM,GAAgB,EAChDC,GAAiBP,EAAW,WAAYK,GAAmBP,GAAiB,EAC5EU,IAAuBR,CAAS,CAClC,CCxBO,SAASS,GAAQC,EAAW,CACjCC,GAAIF,EAAwB,EAC5BC,EAAU,kBAAkBE,GAAY,EACxCF,EAAU,oBAAoBG,GAAmB,EACjDH,EAAU,eAAeA,EAAU,SAAS,OAAO,MAAOI,GAAc,CAC1E,CCAA,IAAIC,KAA+B,UAAY,CAC7C,SAASA,GAAkB,CACzB,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,OAAS,CAChB,CACA,OAAOA,CACT,GAAE,EACEC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,EAAWG,EAAM,CACxB,OAAOF,EAAO,KAAK,KAAME,CAAI,GAAK,IACpC,CACA,OAAAH,EAAW,UAAU,gBAAkB,UAAY,CACjD,OAAO,IAAID,GACb,EACAC,EAAW,UAAU,UAAY,SAAUI,EAAKC,EAAO,CACrD,IAAIC,EAASD,EAAM,OACnBD,EAAI,OAAOC,EAAM,GAAIA,EAAM,EAAE,EAC7BD,EAAI,cAAcC,EAAM,KAAMA,EAAM,KAAMA,EAAM,KAAMA,EAAM,KAAMA,EAAM,GAAIA,EAAM,EAAE,EAChFA,EAAM,SAAW,YACnBD,EAAI,OAAOC,EAAM,GAAKC,EAAQD,EAAM,EAAE,EACtCD,EAAI,cAAcC,EAAM,KAAOC,EAAQD,EAAM,KAAMA,EAAM,KAAOC,EAAQD,EAAM,KAAMA,EAAM,GAAKC,EAAQD,EAAM,EAAE,IAE/GD,EAAI,OAAOC,EAAM,GAAIA,EAAM,GAAKC,CAAM,EACtCF,EAAI,cAAcC,EAAM,KAAMA,EAAM,KAAOC,EAAQD,EAAM,KAAMA,EAAM,KAAOC,EAAQD,EAAM,GAAIA,EAAM,GAAKC,CAAM,GAEjHF,EAAI,UAAU,CAChB,EACAJ,EAAW,UAAU,UAAY,UAAY,CAC3CO,GAAc,IAAI,CACpB,EACAP,EAAW,UAAU,SAAW,UAAY,CAC1CQ,GAAc,IAAI,CACpB,EACOR,CACT,GAAUS,EAAI,EACVC,KAA0B,SAAUT,EAAQ,CAC9CC,EAAUQ,EAAYT,CAAM,EAC5B,SAASS,GAAa,CACpB,IAAIC,EAAQV,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAU,EAAM,KAAOD,EAAW,KACxBC,EAAM,WAAa,IAAYC,GAC/BD,EAAM,wBAA0B,GACzBA,CACT,CACA,OAAAD,EAAW,UAAU,KAAO,SAAUG,EAASC,EAAK,CAClD,KAAK,YAAc,IAAIC,GAAeD,EAAI,MAAM,CAAC,EACjD,KAAK,gBAAkB,CACrB,OAAQ,KAAK,KACf,EACA,KAAK,MAAM,IAAI,KAAK,UAAU,CAChC,EACAJ,EAAW,UAAU,OAAS,SAAUM,EAAaH,EAASC,EAAK,CACjE,IAAIG,EAAa,KACbC,EAAQF,EAAY,SAAS,EAC7BG,EAAY,KAAK,WACjBC,EAAaJ,EAAY,WAEzBK,EAAQD,EAAW,MAEnBE,EAASF,EAAW,OACpBG,EAAWP,EAAY,QAAQ,EAC/BQ,EAAWR,EAAY,QAAQ,MAAM,EACrCS,EAAST,EAAY,IAAI,QAAQ,EACrC,KAAK,OAASA,EACdG,EAAU,UAAU,EACpBA,EAAU,EAAIC,EAAW,EACzBD,EAAU,EAAIC,EAAW,EACzB,KAAK,oBAAoBJ,EAAaF,CAAG,EAC9BY,GAAiBV,EAAaF,EAAKK,EAAW,KAAK,YAAa,KAAK,gBAAiB,IAAI,EAErGD,EAAM,SAAS,SAAUS,EAAM,CAC7B,IAAIC,EAAQ,IAAI5B,IACZ6B,EAASC,GAAUF,CAAK,EAC5BC,EAAO,UAAYF,EAAK,UACxBE,EAAO,YAAcb,EAAY,YACjCa,EAAO,SAAW,OAClB,IAAIE,EAAYJ,EAAK,SAAS,EAC1BK,EAAiBD,EAAU,SAAS,WAAW,EAC/CE,EAAYD,EAAe,IAAI,WAAW,EAC1CE,EAAWP,EAAK,MAAM,UAAU,EAChCQ,EAAaR,EAAK,MAAM,SAAS,EACjCS,EAASD,EAAW,IAAI,QAAQ,EAChCE,EAASF,EAAW,IAAI,QAAQ,EAChCG,EAAWX,EAAK,MAAM,UAAU,EAChCY,EAAaZ,EAAK,MAAM,SAAS,EACjCa,EAASD,EAAW,IAAI,QAAQ,EAChCE,EAASF,EAAW,IAAI,QAAQ,EAChCG,EAAaf,EAAK,UAAU,EAC5BgB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACJtB,EAAM,MAAM,OAAS,KAAK,IAAI,EAAGc,EAAW,EAAE,EAC9Cd,EAAM,MAAM,OAASH,EACjBA,IAAW,YACbkB,GAAMP,GAAU,KAAOA,EAASf,EAAQa,EAAS,GAAKQ,EAAW,GACjEE,GAAMP,GAAU,KAAOA,EAASf,EAASY,EAAS,GAAKA,EAAS,GAChEW,GAAML,GAAU,KAAOA,EAASnB,EAAQiB,EAAS,GAAKI,EAAW,GACjEI,EAAKL,GAAU,KAAOA,EAASnB,EAASgB,EAAS,EACjDS,EAAOJ,EACPK,EAAOJ,GAAM,EAAIX,GAAaa,EAAKb,EACnCgB,EAAOJ,EACPK,EAAON,EAAKX,EAAYa,GAAM,EAAIb,KAElCU,GAAMP,GAAU,KAAOA,EAASf,EAAQa,EAAS,GAAKA,EAAS,GAC/DU,GAAMP,GAAU,KAAOA,EAASf,EAASY,EAAS,GAAKQ,EAAW,GAClEG,EAAKL,GAAU,KAAOA,EAASnB,EAAQiB,EAAS,EAChDQ,GAAML,GAAU,KAAOA,EAASnB,EAASgB,EAAS,GAAKI,EAAW,GAClEK,EAAOJ,GAAM,EAAIV,GAAaY,EAAKZ,EACnCe,EAAOJ,EACPK,EAAON,EAAKV,EAAYY,GAAM,EAAIZ,GAClCiB,EAAOJ,GAETlB,EAAM,SAAS,CACb,GAAIe,EACJ,GAAIC,EACJ,GAAIC,EACJ,GAAIC,EACJ,KAAMC,EACN,KAAMC,EACN,KAAMC,EACN,KAAMC,CACR,CAAC,EACDtB,EAAM,SAASI,EAAe,aAAa,CAAC,EAE5CmB,IAAgBvB,EAAM,MAAOH,EAAQE,CAAI,EACzC,IAAIyB,EAAuB,GAAKrB,EAAU,IAAI,OAAO,EACjDsB,EAAuBC,GAAqBvB,EAAW,WAAW,EACtEwB,GAAc3B,EAAOyB,EAAsB,CACzC,aAAc,CACZ,kBAAmB,SAAUG,GAAWC,GAAWC,GAAUC,EAAeC,EAAWC,GAAc,CACnG,OAAO7C,EAAY,kBAAkBwC,GAAWC,GAAW,OAAQE,EAGnEG,GAAUF,EAAWP,EAAqB,QAAUA,EAAqB,OAAO,IAAI,WAAW,EAAGD,CAAoB,EAAGS,EAAY,CACvI,CACF,EACA,eAAgBlC,EAAK,UACrB,YAAayB,CACf,CAAC,EACDxB,EAAM,cAAc,CAClB,SAAU,QACZ,CAAC,EACD,IAAImC,GAAgBhC,EAAU,SAAS,UAAU,EACjDiC,GAAyBpC,EAAOG,EAAW,YAAa,SAAUkC,GAAO,CACvE,IAAIC,GAAQD,GAAM,aAAa,EAC/B,OAAAd,IAAgBe,GAAOzC,EAAQE,CAAI,EAC5BuC,EACT,CAAC,EACD/C,EAAU,IAAIS,CAAK,EACnBJ,EAAS,iBAAiBG,EAAK,UAAWC,CAAK,EAC/C,IAAIuC,GAAQJ,GAAc,IAAI,OAAO,EACrCK,GAAoBxC,EAAOuC,KAAU,YAAcxC,EAAK,uBAAuB,EAAIwC,KAAU,aAAexC,EAAK,yBAAyB,EAAIwC,GAAOJ,GAAc,IAAI,WAAW,EAAGA,GAAc,IAAI,UAAU,CAAC,CACpN,CAAC,EAED7C,EAAM,SAAS,SAAUmD,EAAM,CAC7B,IAAIC,EAASD,EAAK,UAAU,EACxBE,EAAYF,EAAK,SAAS,EAC1BG,EAAQD,EAAU,IAAI,QAAQ,EAC9BE,EAAQF,EAAU,IAAI,QAAQ,EAC9BR,EAAgBQ,EAAU,SAAS,UAAU,EAC7CG,EAAeH,EAAU,IAAI,CAAC,YAAa,cAAc,CAAC,GAAK,EAC/DI,EAAO,IAAYC,GAAK,CAC1B,MAAO,CACL,EAAGJ,GAAS,KAAOA,EAAQnD,EAAQiD,EAAO,EAC1C,EAAGG,GAAS,KAAOA,EAAQnD,EAASgD,EAAO,EAC3C,MAAOA,EAAO,GACd,OAAQA,EAAO,GACf,EAAGI,CACL,EACA,MAAOH,EAAU,SAAS,WAAW,EAAE,aAAa,EACpD,GAAI,EACN,CAAC,EACDhB,GAAcoB,EAAMrB,GAAqBiB,CAAS,EAAG,CACnD,aAAc,CACZ,kBAAmB,SAAUf,EAAWC,EAAW,CACjD,OAAOzC,EAAY,kBAAkBwC,EAAWC,EAAW,MAAM,CACnE,CACF,EACA,eAAgBY,EAAK,UACrB,YAAaA,EAAK,EACpB,CAAC,EACDM,EAAK,sBAAwB,GAC7BA,EAAK,SAAS,OAAQN,EAAK,UAAU,OAAO,CAAC,EAC7CM,EAAK,SAAS,QAASN,EAAK,UAAU,OAAO,EAAE,KAAK,EACpDL,GAAyBW,EAAMJ,CAAS,EACxCpD,EAAU,IAAIwD,CAAI,EAClBpD,EAAS,iBAAiB8C,EAAK,UAAWM,CAAI,EAC9C7C,GAAU6C,CAAI,EAAE,SAAW,OAC3B,IAAIR,EAAQJ,EAAc,IAAI,OAAO,EACrCK,GAAoBO,EAAMR,IAAU,YAAcE,EAAK,uBAAuB,EAAIF,IAAU,aAAeE,EAAK,yBAAyB,EAAIF,EAAOJ,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACnN,CAAC,EACDxC,EAAS,kBAAkB,SAAUsD,EAAIrB,EAAW,CAClD,IAAIe,EAAYhD,EAAS,aAAaiC,CAAS,EAC3Ce,EAAU,IAAI,WAAW,IAC3BM,EAAG,MAAQ,SAAUC,EAAIC,EAAI,CAC3B9D,EAAW,wBAA0B,GACrC,KAAK,MAAM,GAAK6D,EAChB,KAAK,MAAM,GAAKC,EAChB,KAAK,MAAM,EACXjE,EAAI,eAAe,CACjB,KAAM,WACN,SAAUE,EAAY,GACtB,UAAWO,EAAS,YAAYiC,CAAS,EACzC,OAAQ,KAAK,MAAM,EAAInC,EACvB,OAAQ,KAAK,MAAM,EAAIC,CACzB,CAAC,CACH,EACAuD,EAAG,UAAY,UAAY,CACzB5D,EAAW,wBAA0B,EACvC,EACA4D,EAAG,UAAY,GACfA,EAAG,OAAS,OAEhB,CAAC,EACG,CAAC,KAAK,OAAS7D,EAAY,mBAAmB,GAChDG,EAAU,YAAY6D,IAAoB7D,EAAU,gBAAgB,EAAGH,EAAa,UAAY,CAC9FG,EAAU,eAAe,CAC3B,CAAC,CAAC,EAEJ,KAAK,MAAQH,EAAY,QAAQ,CACnC,EACAN,EAAW,UAAU,QAAU,UAAY,CACzC,KAAK,aAAe,KAAK,YAAY,QAAQ,EAC7C,KAAK,gBAAkB,IACzB,EACAA,EAAW,UAAU,oBAAsB,SAAUM,EAAaF,EAAK,CACrE,IAAIM,EAAaJ,EAAY,WACzBK,EAAQD,EAAW,MACnBE,EAASF,EAAW,OACpB6D,EAAejE,EAAY,iBAAmB,IAAIkE,GAAK,KAAM,CAC/D,IAAKpE,EACL,QAASE,EAAY,OACvB,CAAC,EACDiE,EAAa,UAAYjE,EAAY,IAAI,YAAY,EACrDiE,EAAa,gBAAgB,EAAG,EAAG5D,EAAOC,CAAM,EAChD2D,EAAa,UAAUjE,EAAY,IAAI,QAAQ,CAAC,EAChDiE,EAAa,QAAQjE,EAAY,IAAI,MAAM,CAAC,EAC5C,KAAK,gBAAgB,OAAO,KAAK,CAC/B,EAAGiE,EAAa,EAChB,EAAGA,EAAa,EAChB,OAAQA,EAAa,OACrB,OAAQA,EAAa,MACvB,CAAC,CACH,EACAvE,EAAW,KAAO,SACXA,CACT,GAAEyE,EAAS,EAOX,SAAShC,IAAgBiC,EAAY3D,EAAQE,EAAM,CACjD,OAAQyD,EAAW,KAAM,CACvB,IAAK,SACHA,EAAW,KAAOzD,EAAK,MAAM,UAAU,OAAO,EAC9CyD,EAAW,MAAQzD,EAAK,MAAM,UAAU,OAAO,EAAE,MACjD,MACF,IAAK,SACHyD,EAAW,KAAOzD,EAAK,MAAM,UAAU,OAAO,EAC9CyD,EAAW,MAAQzD,EAAK,MAAM,UAAU,OAAO,EAAE,MACjD,MACF,IAAK,WACH,IAAI0D,EAAc1D,EAAK,MAAM,UAAU,OAAO,EAC1C2D,EAAc3D,EAAK,MAAM,UAAU,OAAO,EAC1C4D,GAASF,CAAW,GAAKE,GAASD,CAAW,IAC/CF,EAAW,KAAO,IAAYI,GAAe,EAAG,EAAG,EAAE/D,IAAW,cAAe,EAAEA,IAAW,YAAa,CAAC,CACxG,MAAO4D,EACP,OAAQ,CACV,EAAG,CACD,MAAOC,EACP,OAAQ,CACV,CAAC,CAAC,EAER,CACF,CAEA,SAASN,IAAoBL,EAAM3D,EAAayE,EAAI,CAClD,IAAIC,EAAS,IAAYd,GAAK,CAC5B,MAAO,CACL,EAAGD,EAAK,EAAI,GACZ,EAAGA,EAAK,EAAI,GACZ,MAAO,EACP,OAAQA,EAAK,OAAS,EACxB,CACF,CAAC,EACD,OAAQgB,GAAUD,EAAQ,CACxB,MAAO,CACL,MAAOf,EAAK,MAAQ,EACtB,CACF,EAAG3D,EAAayE,CAAE,EACXC,CACT,CACA,IAAOE,IAAQlF,ICvTf,IAAImF,KAAiC,SAAUC,EAAQ,CACrDC,EAAUF,EAAmBC,CAAM,EACnC,SAASD,GAAoB,CAC3B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAkB,KACxBG,CACT,CAIA,OAAAH,EAAkB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CACtE,IAAIC,EAAQF,EAAO,OAASA,EAAO,OAAS,CAAC,EACzCG,EAAQH,EAAO,MAAQA,EAAO,OAAS,CAAC,EACxCI,EAASJ,EAAO,QAAU,CAAC,EAC/B,KAAK,YAAc,CAAC,EAEpB,QADIK,EAAc,KAAK,YACdC,EAAI,EAAGA,EAAIF,EAAO,OAAQE,IAC7BF,EAAOE,CAAC,EAAE,OAAS,MAAQF,EAAOE,CAAC,EAAE,OAAS,IAChDD,EAAYD,EAAOE,CAAC,EAAE,KAAK,EAAI,IAAIC,GAAMH,EAAOE,CAAC,EAAG,KAAML,CAAO,GAOrE,IAAIO,EAAQC,GAAwBN,EAAOD,EAAO,KAAM,GAAMQ,CAAU,EACxE,OAAOF,EAAM,KACb,SAASE,EAAWC,EAAUC,EAAU,CACtCD,EAAS,WAAW,eAAgB,SAAUE,EAAOC,EAAK,CACxD,IAAIC,EAAcF,EAAM,YACpBG,EAASD,EAAY,QAAQ,EAAE,cAAcD,CAAG,EACpD,GAAIE,EAAQ,CACV,IAAIC,EAAYD,EAAO,MACnBE,EAAaH,EAAY,YAAYE,CAAS,EAC9CC,IACFL,EAAM,YAAcK,EAExB,CACA,OAAOL,CACT,CAAC,EACDD,EAAS,WAAW,eAAgB,SAAUC,EAAOC,EAAK,CACxD,IAAIC,EAAcF,EAAM,YACpBM,EAAOJ,EAAY,SAAS,EAAE,eAAeD,CAAG,EAChDE,EAASG,EAAK,MAAM,UAAU,EAClC,GAAIH,EAAQ,CACV,IAAII,EAAQJ,EAAO,MACfE,EAAaH,EAAY,YAAYK,CAAK,EAC1CF,IACFL,EAAM,YAAcK,EAExB,CACA,OAAOL,CACT,CAAC,CACH,CACF,EACAjB,EAAkB,UAAU,gBAAkB,SAAUyB,EAAWC,EAAe,CAChF,IAAInB,EAAQ,KAAK,OAAO,MAAQ,KAAK,OAAO,MACxCoB,EAAWpB,EAAMkB,CAAS,EAC9BE,EAAS,OAASD,EAAc,CAAC,EACjCC,EAAS,OAASD,EAAc,CAAC,CACnC,EACA1B,EAAkB,UAAU,UAAY,SAAU4B,EAAQ,CACxD,KAAK,OAAO,OAASA,CACvB,EACA5B,EAAkB,UAAU,QAAU,SAAU6B,EAAM,CACpD,KAAK,OAAO,KAAOA,CACrB,EAMA7B,EAAkB,UAAU,SAAW,UAAY,CACjD,OAAO,KAAK,QAAQ,EAAE,KACxB,EAMAA,EAAkB,UAAU,YAAc,UAAY,CACpD,OAAO,KAAK,SAAS,EAAE,QACzB,EACAA,EAAkB,UAAU,cAAgB,SAAUyB,EAAWK,EAAgBC,EAAU,CACzF,SAASC,EAAQC,EAAK,CACpB,OAAO,MAAMA,CAAG,GAAKA,GAAO,IAC9B,CAEA,GAAIF,IAAa,OAAQ,CACvB,IAAIG,EAAS,KAAK,cAAcT,EAAWM,CAAQ,EAC/CI,EAAaD,EAAO,KACpBE,EAAYF,EAAO,MACnBG,EAAWF,EAAW,OAAS,OAASA,EAAW,OACvD,OAAOG,GAAoB,YAAa,CACtC,KAAMD,EACN,MAAOD,EACP,QAASJ,EAAQI,CAAS,CAC5B,CAAC,CACH,KAEK,CACH,IAAIG,EAAO,KAAK,SAAS,EAAE,eAAed,CAAS,EAC/Ce,EAAQD,EAAK,UAAU,EAAE,MACzBE,EAAS,KAAK,cAAchB,EAAWM,CAAQ,EAAE,KAAK,KAC1D,OAAOO,GAAoB,YAAa,CACtC,KAAMG,GAAU,KAAOA,EAAS,GAAK,KACrC,MAAOD,EACP,QAASR,EAAQQ,CAAK,CACxB,CAAC,CACH,CACF,EACAxC,EAAkB,UAAU,cAAgB,UAAY,CAAC,EAEzDA,EAAkB,UAAU,cAAgB,SAAUyB,EAAWM,EAAU,CACzE,IAAIG,EAASjC,EAAO,UAAU,cAAc,KAAK,KAAMwB,EAAWM,CAAQ,EAC1E,GAAIG,EAAO,OAAS,MAAQH,IAAa,OAAQ,CAC/C,IAAIQ,EAAO,KAAK,SAAS,EAAE,eAAed,CAAS,EAC/CiB,EAAYH,EAAK,UAAU,EAAE,MACjCL,EAAO,MAAQQ,CACjB,CACA,OAAOR,CACT,EACAlC,EAAkB,KAAO,gBACzBA,EAAkB,WAAa,MAC/BA,EAAkB,cAAgB,CAEhC,EAAG,EAGH,sBAAuB,MACvB,KAAM,KACN,IAAK,KACL,MAAO,MACP,OAAQ,KACR,OAAQ,aACR,UAAW,GACX,QAAS,EACT,UAAW,GACX,iBAAkB,GAElB,KAAM,GACN,YAAa,SACb,OAAQ,KACR,KAAM,EACN,MAAO,CACL,KAAM,GACN,SAAU,QACV,SAAU,EACZ,EACA,UAAW,CACT,KAAM,GACN,SAAU,EACZ,EACA,OAAQ,CAAC,EACT,UAAW,UACX,UAAW,CACT,MAAO2C,EAAO,MAAM,UACpB,QAAS,GACT,UAAW,EACb,EACA,SAAU,CACR,MAAO,CACL,KAAM,EACR,EACA,UAAW,CACT,QAAS,EACX,CACF,EACA,OAAQ,CACN,UAAW,CACT,YAAaA,EAAO,MAAM,OAC5B,CACF,EACA,gBAAiB,SACjB,kBAAmB,GACrB,EACO3C,CACT,GAAE4C,EAAW,EACNC,IAAQ7C,ICrLA,SAAR8C,GAA8BC,EAASC,EAAK,CACjDD,EAAQ,iBAAiB,SAAU,SAAUE,EAAa,CACxD,IAAIC,EAAYD,EAAY,IAAI,WAAW,EACvCE,EAAUF,EAAY,IAAI,SAAS,EACnCG,EAAeC,GAAyBJ,EAAaD,CAAG,EAAE,aAC1DM,EAAaC,GAAcN,EAAY,mBAAmB,EAAGG,CAAY,EAC7EH,EAAY,WAAaK,EACzB,IAAIE,EAAQF,EAAW,MACnBG,EAASH,EAAW,OACpBI,EAAQT,EAAY,SAAS,EAC7BU,EAAQD,EAAM,MACdE,EAAQF,EAAM,MAClBG,IAAkBF,CAAK,EACvB,IAAIG,EAAuBC,GAAOJ,EAAO,SAAUK,EAAM,CACvD,OAAOA,EAAK,UAAU,EAAE,QAAU,CACpC,CAAC,EACGC,EAAaH,EAAc,SAAW,EAAI,EAAIb,EAAY,IAAI,kBAAkB,EAChFiB,EAASjB,EAAY,IAAI,QAAQ,EACjCkB,EAAYlB,EAAY,IAAI,WAAW,EAC3CmB,IAAaT,EAAOC,EAAOV,EAAWC,EAASK,EAAOC,EAAQQ,EAAYC,EAAQC,CAAS,CAC7F,CAAC,CACH,CACA,SAASC,IAAaT,EAAOC,EAAOV,EAAWC,EAASK,EAAOC,EAAQQ,EAAYC,EAAQC,EAAW,CACpGE,IAAoBV,EAAOC,EAAOV,EAAWM,EAAOC,EAAQS,EAAQC,CAAS,EAC7EG,IAAkBX,EAAOC,EAAOH,EAAQD,EAAOL,EAASc,EAAYC,CAAM,EAC1EK,IAAkBZ,EAAOO,CAAM,CACjC,CAIA,SAASL,IAAkBF,EAAO,CACzBa,EAAKb,EAAO,SAAUK,EAAM,CACjC,IAAIS,EAASC,GAAIV,EAAK,SAAUW,EAAY,EACxCC,EAASF,GAAIV,EAAK,QAASW,EAAY,EACvCE,EAAeb,EAAK,SAAS,GAAK,EAClCc,EAAQ,KAAK,IAAIL,EAAQG,EAAQC,CAAY,EACjDb,EAAK,UAAU,CACb,MAAOc,CACT,EAAG,EAAI,CACT,CAAC,CACH,CAOA,SAAST,IAAoBV,EAAOC,EAAOV,EAAWM,EAAOC,EAAQS,EAAQC,EAAW,CAWtF,QARIY,EAAc,CAAC,EAEfC,EAAc,CAAC,EAEfC,EAAgB,CAAC,EACjBC,EAAiB,CAAC,EAClBC,EAAI,EAECC,EAAI,EAAGA,EAAIxB,EAAM,OAAQwB,IAChCL,EAAYK,CAAC,EAAI,EAEnB,QAASA,EAAI,EAAGA,EAAIzB,EAAM,OAAQyB,IAChCJ,EAAYI,CAAC,EAAIzB,EAAMyB,CAAC,EAAE,QAAQ,OAC9BJ,EAAYI,CAAC,IAAM,GACrBH,EAAc,KAAKtB,EAAMyB,CAAC,CAAC,EAO/B,QAJIC,EAAe,GAIZJ,EAAc,QAAQ,CAC3B,QAASK,EAAM,EAAGA,EAAML,EAAc,OAAQK,IAAO,CACnD,IAAItB,EAAOiB,EAAcK,CAAG,EACxBC,EAAOvB,EAAK,UAAU,KAAK,eAAeA,EAAK,SAAS,EACxDwB,EAAcD,EAAK,OAAS,MAAQA,EAAK,OAAS,EAClDC,GAAeD,EAAK,MAAQF,IAC9BA,EAAeE,EAAK,OAEtBvB,EAAK,UAAU,CACb,MAAOwB,EAAcD,EAAK,MAAQJ,CACpC,EAAG,EAAI,EACPjB,IAAW,WAAaF,EAAK,UAAU,CACrC,GAAId,CACN,EAAG,EAAI,EAAIc,EAAK,UAAU,CACxB,GAAId,CACN,EAAG,EAAI,EACP,QAASuC,EAAU,EAAGA,EAAUzB,EAAK,SAAS,OAAQyB,IAAW,CAC/D,IAAIC,EAAO1B,EAAK,SAASyB,CAAO,EAC5BE,EAAY/B,EAAM,QAAQ8B,CAAI,EAClCX,EAAYY,CAAS,EAAI,EACzB,IAAIC,EAAaF,EAAK,MAClBG,EAAYlC,EAAM,QAAQiC,CAAU,EACpC,EAAEZ,EAAYa,CAAS,IAAM,GAAKX,EAAe,QAAQU,CAAU,EAAI,GACzEV,EAAe,KAAKU,CAAU,CAElC,CACF,CACA,EAAET,EACFF,EAAgBC,EAChBA,EAAiB,CAAC,CACpB,CACA,QAASE,EAAI,EAAGA,EAAIL,EAAY,OAAQK,IACtC,GAAIL,EAAYK,CAAC,IAAM,EACrB,MAAM,IAAI,MAAM,+CAA+C,EAGnE,IAAIU,EAAWT,EAAeF,EAAI,EAAIE,EAAeF,EAAI,EACrDhB,GAAaA,IAAc,QAC7B4B,IAAwBpC,EAAOQ,EAAWD,EAAQ4B,CAAQ,EAE5D,IAAIE,EAAK9B,IAAW,YAAcT,EAASP,GAAa4C,GAAYtC,EAAQN,GAAa4C,EACzFG,IAAkBtC,EAAOqC,EAAI9B,CAAM,CACrC,CACA,SAASgC,IAAYlC,EAAM,CACzB,IAAIuB,EAAOvB,EAAK,UAAU,KAAK,eAAeA,EAAK,SAAS,EAC5D,OAAOuB,EAAK,OAAS,MAAQA,EAAK,OAAS,CAC7C,CACA,SAASQ,IAAwBpC,EAAOQ,EAAWD,EAAQ4B,EAAU,CACnE,GAAI3B,IAAc,QAAS,CAIzB,QAHIgC,EAAiB,CAAC,EAClBC,EAAczC,EACd0C,EAAa,EACVD,EAAY,QAAQ,CACzB,QAAShB,EAAI,EAAGA,EAAIgB,EAAY,OAAQhB,IAAK,CAC3C,IAAIpB,EAAOoC,EAAYhB,CAAC,EACxBpB,EAAK,UAAU,CACb,aAAcqC,CAChB,EAAG,EAAI,EACP,QAASC,EAAI,EAAGA,EAAItC,EAAK,QAAQ,OAAQsC,IAAK,CAC5C,IAAIZ,EAAO1B,EAAK,QAAQsC,CAAC,EACrBH,EAAe,QAAQT,EAAK,KAAK,EAAI,GACvCS,EAAe,KAAKT,EAAK,KAAK,CAElC,CACF,CACAU,EAAcD,EACdA,EAAiB,CAAC,EAClB,EAAEE,CACJ,CACO7B,EAAKb,EAAO,SAAUK,EAAM,CAC5BkC,IAAYlC,CAAI,GACnBA,EAAK,UAAU,CACb,MAAO,KAAK,IAAI,EAAG8B,EAAW9B,EAAK,UAAU,EAAE,YAAY,CAC7D,EAAG,EAAI,CAEX,CAAC,CACH,MAAWG,IAAc,WACvBoC,IAAe5C,EAAOmC,CAAQ,CAElC,CAQA,SAASS,IAAe5C,EAAOmC,EAAU,CAChCtB,EAAKb,EAAO,SAAUK,EAAM,CAC7B,CAACkC,IAAYlC,CAAI,GAAK,CAACA,EAAK,SAAS,QACvCA,EAAK,UAAU,CACb,MAAO8B,CACT,EAAG,EAAI,CAEX,CAAC,CACH,CAOA,SAASG,IAAkBtC,EAAOqC,EAAI9B,EAAQ,CACrCM,EAAKb,EAAO,SAAUK,EAAM,CACjC,IAAIwC,EAAYxC,EAAK,UAAU,EAAE,MAAQgC,EACzC9B,IAAW,WAAaF,EAAK,UAAU,CACrC,EAAGwC,CACL,EAAG,EAAI,EAAIxC,EAAK,UAAU,CACxB,EAAGwC,CACL,EAAG,EAAI,CACT,CAAC,CACH,CAWA,SAASlC,IAAkBX,EAAOC,EAAOH,EAAQD,EAAOL,EAASc,EAAYC,EAAQ,CACnF,IAAIuC,EAAiBC,IAAsB/C,EAAOO,CAAM,EACxDyC,IAAoBF,EAAgB7C,EAAOH,EAAQD,EAAOL,EAASe,CAAM,EACzE0C,GAAkBH,EAAgBtD,EAASM,EAAQD,EAAOU,CAAM,EAChE,QAAS2C,EAAQ,EAAG5C,EAAa,EAAGA,IAGlC4C,GAAS,IACTC,IAAiBL,EAAgBI,EAAO3C,CAAM,EAC9C0C,GAAkBH,EAAgBtD,EAASM,EAAQD,EAAOU,CAAM,EAChE6C,IAAiBN,EAAgBI,EAAO3C,CAAM,EAC9C0C,GAAkBH,EAAgBtD,EAASM,EAAQD,EAAOU,CAAM,CAEpE,CACA,SAASwC,IAAsB/C,EAAOO,EAAQ,CAC5C,IAAIuC,EAAiB,CAAC,EAClBO,EAAU9C,IAAW,WAAa,IAAM,IACxC+C,EAAcC,GAAUvD,EAAO,SAAUK,EAAM,CACjD,OAAOA,EAAK,UAAU,EAAEgD,CAAO,CACjC,CAAC,EACD,OAAAC,EAAY,KAAK,KAAK,SAAUE,EAAGC,EAAG,CACpC,OAAOD,EAAIC,CACb,CAAC,EACM5C,EAAKyC,EAAY,KAAM,SAAUI,EAAK,CAC3CZ,EAAe,KAAKQ,EAAY,QAAQ,IAAII,CAAG,CAAC,CAClD,CAAC,EACMZ,CACT,CAIA,SAASE,IAAoBF,EAAgB7C,EAAOH,EAAQD,EAAOL,EAASe,EAAQ,CAClF,IAAIoD,EAAQ,IACL9C,EAAKiC,EAAgB,SAAU9C,EAAO,CAC3C,IAAI4D,EAAI5D,EAAM,OACVe,EAAM,EACHF,EAAKb,EAAO,SAAUK,EAAM,CACjCU,GAAOV,EAAK,UAAU,EAAE,KAC1B,CAAC,EACD,IAAIwD,EAAKtD,IAAW,YAAcV,GAAS+D,EAAI,GAAKpE,GAAWuB,GAAOjB,GAAU8D,EAAI,GAAKpE,GAAWuB,EAChG8C,EAAKF,IACPA,EAAQE,EAEZ,CAAC,EACMhD,EAAKiC,EAAgB,SAAU9C,EAAO,CACpCa,EAAKb,EAAO,SAAUK,EAAMoB,EAAG,CACpC,IAAIqC,EAASzD,EAAK,UAAU,EAAE,MAAQsD,EAClCpD,IAAW,YACbF,EAAK,UAAU,CACb,EAAGoB,CACL,EAAG,EAAI,EACPpB,EAAK,UAAU,CACb,GAAIyD,CACN,EAAG,EAAI,IAEPzD,EAAK,UAAU,CACb,EAAGoB,CACL,EAAG,EAAI,EACPpB,EAAK,UAAU,CACb,GAAIyD,CACN,EAAG,EAAI,EAEX,CAAC,CACH,CAAC,EACMjD,EAAKZ,EAAO,SAAU8B,EAAM,CACjC,IAAIgC,EAAS,CAAChC,EAAK,SAAS,EAAI4B,EAChC5B,EAAK,UAAU,CACb,GAAIgC,CACN,EAAG,EAAI,CACT,CAAC,CACH,CAIA,SAASd,GAAkBH,EAAgBtD,EAASM,EAAQD,EAAOU,EAAQ,CACzE,IAAI8C,EAAU9C,IAAW,WAAa,IAAM,IACrCM,EAAKiC,EAAgB,SAAU9C,EAAO,CAC3CA,EAAM,KAAK,SAAUwD,EAAGC,EAAG,CACzB,OAAOD,EAAE,UAAU,EAAEH,CAAO,EAAII,EAAE,UAAU,EAAEJ,CAAO,CACvD,CAAC,EAOD,QANIW,EACA3D,EACA4D,EACAC,EAAK,EACLN,EAAI5D,EAAM,OACVmE,EAAa5D,IAAW,WAAa,KAAO,KACvCkB,EAAI,EAAGA,EAAImC,EAAGnC,IACrBpB,EAAOL,EAAMyB,CAAC,EACdwC,EAAKC,EAAK7D,EAAK,UAAU,EAAEgD,CAAO,EAC9BY,EAAK,IACPD,EAAQ3D,EAAK,UAAU,EAAEgD,CAAO,EAAIY,EACpC1D,IAAW,WAAaF,EAAK,UAAU,CACrC,EAAG2D,CACL,EAAG,EAAI,EAAI3D,EAAK,UAAU,CACxB,EAAG2D,CACL,EAAG,EAAI,GAETE,EAAK7D,EAAK,UAAU,EAAEgD,CAAO,EAAIhD,EAAK,UAAU,EAAE8D,CAAU,EAAI3E,EAElE,IAAI4E,EAAY7D,IAAW,WAAaV,EAAQC,EAGhD,GADAmE,EAAKC,EAAK1E,EAAU4E,EAChBH,EAAK,EAAG,CACVD,EAAQ3D,EAAK,UAAU,EAAEgD,CAAO,EAAIY,EACpC1D,IAAW,WAAaF,EAAK,UAAU,CACrC,EAAG2D,CACL,EAAG,EAAI,EAAI3D,EAAK,UAAU,CACxB,EAAG2D,CACL,EAAG,EAAI,EACPE,EAAKF,EACL,QAASvC,EAAImC,EAAI,EAAGnC,GAAK,EAAG,EAAEA,EAC5BpB,EAAOL,EAAMyB,CAAC,EACdwC,EAAK5D,EAAK,UAAU,EAAEgD,CAAO,EAAIhD,EAAK,UAAU,EAAE8D,CAAU,EAAI3E,EAAU0E,EACtED,EAAK,IACPD,EAAQ3D,EAAK,UAAU,EAAEgD,CAAO,EAAIY,EACpC1D,IAAW,WAAaF,EAAK,UAAU,CACrC,EAAG2D,CACL,EAAG,EAAI,EAAI3D,EAAK,UAAU,CACxB,EAAG2D,CACL,EAAG,EAAI,GAETE,EAAK7D,EAAK,UAAU,EAAEgD,CAAO,CAEjC,CACF,CAAC,CACH,CAMA,SAASF,IAAiBL,EAAgBI,EAAO3C,EAAQ,CAChDM,EAAKiC,EAAe,MAAM,EAAE,QAAQ,EAAG,SAAU9C,EAAO,CACtDa,EAAKb,EAAO,SAAUK,EAAM,CACjC,GAAIA,EAAK,SAAS,OAAQ,CACxB,IAAIgE,EAAItD,GAAIV,EAAK,SAAUiE,IAAgB/D,CAAM,EAAIQ,GAAIV,EAAK,SAAUW,EAAY,EACpF,GAAI,MAAMqD,CAAC,EAAG,CACZ,IAAIE,EAAMlE,EAAK,SAAS,OACxBgE,EAAIE,EAAMxD,GAAIV,EAAK,SAAUmE,IAAcjE,CAAM,EAAIgE,EAAM,CAC7D,CACA,GAAIhE,IAAW,WAAY,CACzB,IAAIyD,EAAQ3D,EAAK,UAAU,EAAE,GAAKgE,EAAII,GAAOpE,EAAME,CAAM,GAAK2C,EAC9D7C,EAAK,UAAU,CACb,EAAG2D,CACL,EAAG,EAAI,CACT,KAAO,CACL,IAAIU,EAAQrE,EAAK,UAAU,EAAE,GAAKgE,EAAII,GAAOpE,EAAME,CAAM,GAAK2C,EAC9D7C,EAAK,UAAU,CACb,EAAGqE,CACL,EAAG,EAAI,CACT,CACF,CACF,CAAC,CACH,CAAC,CACH,CACA,SAASJ,IAAevC,EAAMxB,EAAQ,CACpC,OAAOkE,GAAO1C,EAAK,MAAOxB,CAAM,EAAIwB,EAAK,SAAS,CACpD,CACA,SAASyC,IAAazC,EAAMxB,EAAQ,CAClC,OAAOkE,GAAO1C,EAAK,MAAOxB,CAAM,CAClC,CACA,SAASoE,IAAe5C,EAAMxB,EAAQ,CACpC,OAAOkE,GAAO1C,EAAK,MAAOxB,CAAM,EAAIwB,EAAK,SAAS,CACpD,CACA,SAAS6C,IAAa7C,EAAMxB,EAAQ,CAClC,OAAOkE,GAAO1C,EAAK,MAAOxB,CAAM,CAClC,CACA,SAASkE,GAAOpE,EAAME,EAAQ,CAC5B,OAAOA,IAAW,WAAaF,EAAK,UAAU,EAAE,EAAIA,EAAK,UAAU,EAAE,GAAK,EAAIA,EAAK,UAAU,EAAE,EAAIA,EAAK,UAAU,EAAE,GAAK,CAC3H,CACA,SAASW,GAAae,EAAM,CAC1B,OAAOA,EAAK,SAAS,CACvB,CACA,SAAShB,GAAI8D,EAAOC,EAAIvE,EAAQ,CAI9B,QAHIQ,EAAM,EACNwD,EAAMM,EAAM,OACZpD,EAAI,GACD,EAAEA,EAAI8C,GAAK,CAChB,IAAIpD,EAAQ,CAAC2D,EAAGD,EAAMpD,CAAC,EAAGlB,CAAM,EAC3B,MAAMY,CAAK,IACdJ,GAAOI,EAEX,CACA,OAAOJ,CACT,CAIA,SAASqC,IAAiBN,EAAgBI,EAAO3C,EAAQ,CAChDM,EAAKiC,EAAgB,SAAU9C,EAAO,CACpCa,EAAKb,EAAO,SAAUK,EAAM,CACjC,GAAIA,EAAK,QAAQ,OAAQ,CACvB,IAAIgE,EAAItD,GAAIV,EAAK,QAASsE,IAAgBpE,CAAM,EAAIQ,GAAIV,EAAK,QAASW,EAAY,EAClF,GAAI,MAAMqD,CAAC,EAAG,CACZ,IAAIE,EAAMlE,EAAK,QAAQ,OACvBgE,EAAIE,EAAMxD,GAAIV,EAAK,QAASuE,IAAcrE,CAAM,EAAIgE,EAAM,CAC5D,CACA,GAAIhE,IAAW,WAAY,CACzB,IAAIyD,EAAQ3D,EAAK,UAAU,EAAE,GAAKgE,EAAII,GAAOpE,EAAME,CAAM,GAAK2C,EAC9D7C,EAAK,UAAU,CACb,EAAG2D,CACL,EAAG,EAAI,CACT,KAAO,CACL,IAAIU,EAAQrE,EAAK,UAAU,EAAE,GAAKgE,EAAII,GAAOpE,EAAME,CAAM,GAAK2C,EAC9D7C,EAAK,UAAU,CACb,EAAGqE,CACL,EAAG,EAAI,CACT,CACF,CACF,CAAC,CACH,CAAC,CACH,CAIA,SAAS9D,IAAkBZ,EAAOO,EAAQ,CACxC,IAAI8C,EAAU9C,IAAW,WAAa,IAAM,IACrCM,EAAKb,EAAO,SAAUK,EAAM,CACjCA,EAAK,SAAS,KAAK,SAAUmD,EAAGC,EAAG,CACjC,OAAOD,EAAE,MAAM,UAAU,EAAEH,CAAO,EAAII,EAAE,MAAM,UAAU,EAAEJ,CAAO,CACnE,CAAC,EACDhD,EAAK,QAAQ,KAAK,SAAUmD,EAAGC,EAAG,CAChC,OAAOD,EAAE,MAAM,UAAU,EAAEH,CAAO,EAAII,EAAE,MAAM,UAAU,EAAEJ,CAAO,CACnE,CAAC,CACH,CAAC,EACMxC,EAAKb,EAAO,SAAUK,EAAM,CACjC,IAAI0E,EAAK,EACLC,EAAK,EACFnE,EAAKR,EAAK,SAAU,SAAU0B,EAAM,CACzCA,EAAK,UAAU,CACb,GAAIgD,CACN,EAAG,EAAI,EACPA,GAAMhD,EAAK,UAAU,EAAE,EACzB,CAAC,EACMlB,EAAKR,EAAK,QAAS,SAAU0B,EAAM,CACxCA,EAAK,UAAU,CACb,GAAIiD,CACN,EAAG,EAAI,EACPA,GAAMjD,EAAK,UAAU,EAAE,EACzB,CAAC,CACH,CAAC,CACH,CCnbe,SAARkD,GAA8BC,EAAS,CAC5CA,EAAQ,iBAAiB,SAAU,SAAUC,EAAa,CACxD,IAAIC,EAAQD,EAAY,SAAS,EAC7BE,EAAQD,EAAM,MACdE,EAAQF,EAAM,MAClB,GAAIC,EAAM,OAAQ,CAChB,IAAIE,EAAa,IACbC,EAAa,KACVC,EAAKJ,EAAO,SAAUK,EAAM,CACjC,IAAIC,EAAYD,EAAK,UAAU,EAAE,MAC7BC,EAAYJ,IACdA,EAAaI,GAEXA,EAAYH,IACdA,EAAaG,EAEjB,CAAC,EACMF,EAAKJ,EAAO,SAAUK,EAAM,CACjC,IAAIE,EAAU,IAAIC,GAAc,CAC9B,KAAM,QACN,cAAe,SACf,WAAY,CAACN,EAAYC,CAAU,EACnC,OAAQL,EAAY,IAAI,OAAO,CACjC,CAAC,EACGW,EAAkBF,EAAQ,iBAAiBF,EAAK,UAAU,EAAE,KAAK,EACjEK,EAAcL,EAAK,SAAS,EAAE,IAAI,CAAC,YAAa,OAAO,CAAC,EACxDK,GAAe,MACjBL,EAAK,UAAU,QAASK,CAAW,EACnCL,EAAK,UAAU,QAAS,CACtB,KAAMK,CACR,CAAC,IAEDL,EAAK,UAAU,QAASI,CAAe,EACvCJ,EAAK,UAAU,QAAS,CACtB,KAAMI,CACR,CAAC,EAEL,CAAC,CACH,CACIR,EAAM,QACDG,EAAKH,EAAO,SAAUU,EAAM,CACjC,IAAIC,EAAYD,EAAK,SAAS,EAAE,IAAI,WAAW,EAC/CA,EAAK,UAAU,QAASC,CAAS,CACnC,CAAC,CAEL,CAAC,CACH,CC3CO,SAASC,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAU,EACtCD,EAAU,oBAAoBE,GAAiB,EAC/CF,EAAU,eAAeG,EAAY,EACrCH,EAAU,eAAeI,EAAY,EACrCJ,EAAU,eAAe,CACvB,KAAM,WACN,MAAO,WAEP,OAAQ,QACV,EAAG,SAAUK,EAASC,EAAS,CAC7BA,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,SACT,MAAOD,CACT,EAAG,SAAUE,EAAa,CACxBA,EAAY,gBAAgBF,EAAQ,UAAW,CAACA,EAAQ,OAAQA,EAAQ,MAAM,CAAC,CACjF,CAAC,CACH,CAAC,EACDL,EAAU,eAAe,CACvB,KAAM,aACN,MAAO,aACP,OAAQ,MACV,EAAG,SAAUK,EAASC,EAASE,EAAK,CAClCF,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,SACT,MAAOD,CACT,EAAG,SAAUE,EAAa,CACxB,IAAIE,EAAWF,EAAY,iBACvBG,EAAMC,GAA4BF,EAAUJ,EAASE,EAAY,IAAI,YAAY,CAAC,EACtFA,EAAY,UAAUG,EAAI,MAAM,EAChCH,EAAY,QAAQG,EAAI,IAAI,CAC9B,CAAC,CACH,CAAC,CACH,CCpCA,IAAIE,IAAqC,UAAY,CACnD,SAASA,GAAwB,CAAC,CAIlC,OAAAA,EAAsB,UAAU,eAAiB,SAAUC,EAAK,CAC9D,IAAIC,EAAc,KAAK,UAAU,EACjC,OAAOA,GAAeA,EAAY,IAAID,CAAG,GAAK,IAChD,EAIAD,EAAsB,UAAU,eAAiB,SAAUG,EAAQC,EAAS,CAI1E,IAAIC,EACAC,EAAaF,EAAQ,aAAa,QAAS,KAAK,IAAI,YAAY,CAAC,EACjEG,EAAaH,EAAQ,aAAa,QAAS,KAAK,IAAI,YAAY,CAAC,EACjEI,EAAYF,EAAW,IAAI,MAAM,EACjCG,EAAYF,EAAW,IAAI,MAAM,EACjCG,EAGAF,IAAc,YAChBL,EAAO,OAAS,aAChBE,EAAcC,EAAW,eAAe,EACxCI,EAAa,CAAC,KAAK,eAAe,GAAG,GAC5BD,IAAc,YACvBN,EAAO,OAAS,WAChBE,EAAcE,EAAW,eAAe,EACxCG,EAAa,CAAC,KAAK,eAAe,GAAG,GAErCP,EAAO,OAASA,EAAO,QAAU,aAEnC,IAAIQ,EAAY,CAAC,IAAK,GAAG,EACrBC,EAAmBT,EAAO,SAAW,aAAe,EAAI,EACxDU,EAAc,KAAK,aAAeF,EAAUC,CAAgB,EAC5DE,EAAeH,EAAU,EAAIC,CAAgB,EAC7CG,EAAa,CAACT,EAAYC,CAAU,EACpCS,EAAeD,EAAWH,CAAgB,EAAE,IAAI,MAAM,EACtDK,EAAgBF,EAAW,EAAIH,CAAgB,EAAE,IAAI,MAAM,EAC3DM,EAAOf,EAAO,KAGlB,GAAIe,GAAQR,EAAY,CACtB,IAAIS,EAAkB,CAAC,EAChBC,EAAKF,EAAM,SAAUG,EAAMC,EAAO,CACvC,IAAIC,EACOC,EAAQH,CAAI,GACrBE,EAAUF,EAAK,MAAM,EAErBA,EAAK,QAAQC,CAAK,GACFE,EAAQH,EAAK,KAAK,GAClCE,EAAiBE,EAAO,CAAC,EAAGJ,CAAI,EAChCE,EAAQ,MAAQA,EAAQ,MAAM,MAAM,EAEpCF,EAAK,MAAM,QAAQC,CAAK,GAExBC,EAAUF,EAEZF,EAAgB,KAAKI,CAAO,CAC9B,CAAC,EACDpB,EAAO,KAAOgB,CAChB,CACA,IAAIO,EAAyB,KAAK,uBAC9BC,EAAkB,CAAC,CACrB,KAAMd,EACN,KAAMe,GAAuBZ,CAAY,EACzC,YAAaX,EACb,UAAW,CACT,QAAS,GACT,SAAU,CACZ,EACA,QAAS,CAAC,MAAM,CAClB,EAAG,CACD,KAAMS,EACN,KAAMc,GAAuBX,CAAa,EAC1C,QAASS,EAAuB,MAAM,CACxC,CAAC,EACD,OAAOG,GAAuB,KAAM,CAClC,gBAAiBF,EACjB,gBAAiBD,EAAuB,OAAS,EACjD,gBAAwBI,GAAMC,GAAiCJ,EAAiB,IAAI,CACtF,CAAC,CACH,EAKA3B,EAAsB,UAAU,YAAc,UAAY,CACxD,IAAIgC,EAAM,KAAK,aACf,OAAO,KAAK,QAAQ,aAAaA,EAAM,OAAQ,KAAK,IAAIA,EAAM,WAAW,CAAC,EAAE,IAC9E,EACOhC,CACT,GAAE,EC9FF,IAAIiC,KAAkC,SAAUC,EAAQ,CACtDC,EAAUF,EAAoBC,CAAM,EACpC,SAASD,GAAqB,CAC5B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAmB,KAShCG,EAAM,uBAAyB,CAAC,CAC9B,KAAM,MACN,eAAgB,EAClB,EAAG,CACD,KAAM,KACN,eAAgB,EAClB,EAAG,CACD,KAAM,SACN,eAAgB,EAClB,EAAG,CACD,KAAM,KACN,eAAgB,EAClB,EAAG,CACD,KAAM,MACN,eAAgB,EAClB,CAAC,EACDA,EAAM,eAAiB,SAChBA,CACT,CACA,OAAAH,EAAmB,KAAO,iBAC1BA,EAAmB,aAAe,CAAC,QAAS,QAAS,MAAM,EAC3DA,EAAmB,cAAgB,CAEjC,EAAG,EACH,iBAAkB,cAClB,gBAAiB,GACjB,OAAQ,KACR,SAAU,CAAC,EAAG,EAAE,EAChB,UAAW,CACT,MAAOI,EAAO,MAAM,UACpB,YAAa,CACf,EACA,SAAU,CACR,MAAO,GACP,UAAW,CACT,YAAa,EACb,WAAY,EACZ,cAAe,EACf,cAAe,EACf,YAAaA,EAAO,MAAM,MAC5B,CACF,EACA,kBAAmB,GACrB,EACOJ,CACT,GAAEK,EAAW,EACbC,GAAMN,IAAoBO,GAAuB,EAAI,EACrD,IAAOC,IAAQR,IC1Df,IAAIS,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KAClBG,CACT,CACA,OAAAH,EAAY,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CAClE,IAAIC,EAAOH,EAAY,QAAQ,EAC3BI,EAAQ,KAAK,MACbC,EAAU,KAAK,MAGd,KAAK,OACRD,EAAM,UAAU,EAElB,IAAIE,EAAWN,EAAY,IAAI,QAAQ,IAAM,aAAe,EAAI,EAChEG,EAAK,KAAKE,CAAO,EAAE,IAAI,SAAUE,EAAQ,CACvC,GAAIJ,EAAK,SAASI,CAAM,EAAG,CACzB,IAAIC,EAAaL,EAAK,cAAcI,CAAM,EACtCE,EAAWC,IAAgBF,EAAYL,EAAMI,EAAQD,EAAU,EAAI,EACvEH,EAAK,iBAAiBI,EAAQE,CAAQ,EACtCL,EAAM,IAAIK,CAAQ,CACpB,CACF,CAAC,EAAE,OAAO,SAAUF,EAAQI,EAAQ,CAClC,IAAIF,EAAWJ,EAAQ,iBAAiBM,CAAM,EAE9C,GAAI,CAACR,EAAK,SAASI,CAAM,EAAG,CAC1BH,EAAM,OAAOK,CAAQ,EACrB,MACF,CACA,IAAID,EAAaL,EAAK,cAAcI,CAAM,EACrCE,GAGHG,GAAaH,CAAQ,EACrBI,IAAoBL,EAAYC,EAAUN,EAAMI,CAAM,GAHtDE,EAAWC,IAAgBF,EAAYL,EAAMI,EAAQD,CAAQ,EAK/DF,EAAM,IAAIK,CAAQ,EAClBN,EAAK,iBAAiBI,EAAQE,CAAQ,CACxC,CAAC,EAAE,OAAO,SAAUE,EAAQ,CAC1B,IAAIG,EAAKT,EAAQ,iBAAiBM,CAAM,EACxCG,GAAMV,EAAM,OAAOU,CAAE,CACvB,CAAC,EAAE,QAAQ,EACX,KAAK,MAAQX,CACf,EACAP,EAAY,UAAU,OAAS,SAAUK,EAAS,CAChD,IAAIG,EAAQ,KAAK,MACbD,EAAO,KAAK,MAChB,KAAK,MAAQ,KACbA,GAAQA,EAAK,kBAAkB,SAAUW,EAAI,CAC3CA,GAAMV,EAAM,OAAOU,CAAE,CACvB,CAAC,CACH,EACAlB,EAAY,KAAO,UACZA,CACT,GAAEmB,EAAS,EACPC,KAA4B,UAAY,CAC1C,SAASA,GAAe,CAAC,CACzB,OAAOA,CACT,GAAE,EACEC,KAAuB,SAAUpB,EAAQ,CAC3CC,EAAUmB,EAASpB,CAAM,EACzB,SAASoB,EAAQC,EAAM,CACrB,IAAInB,EAAQF,EAAO,KAAK,KAAMqB,CAAI,GAAK,KACvC,OAAAnB,EAAM,KAAO,iBACNA,CACT,CACA,OAAAkB,EAAQ,UAAU,gBAAkB,UAAY,CAC9C,OAAO,IAAID,GACb,EACAC,EAAQ,UAAU,UAAY,SAAUE,EAAKC,EAAO,CAClD,IAAIC,EAAOD,EAAM,OACbE,EAAI,EAGR,IAFAH,EAAI,OAAOE,EAAKC,CAAC,EAAE,CAAC,EAAGD,EAAKC,CAAC,EAAE,CAAC,CAAC,EACjCA,IACOA,EAAI,EAAGA,IACZH,EAAI,OAAOE,EAAKC,CAAC,EAAE,CAAC,EAAGD,EAAKC,CAAC,EAAE,CAAC,CAAC,EAGnC,IADAH,EAAI,UAAU,EACPG,EAAID,EAAK,OAAQC,IACtBH,EAAI,OAAOE,EAAKC,CAAC,EAAE,CAAC,EAAGD,EAAKC,CAAC,EAAE,CAAC,CAAC,EACjCA,IACAH,EAAI,OAAOE,EAAKC,CAAC,EAAE,CAAC,EAAGD,EAAKC,CAAC,EAAE,CAAC,CAAC,CAErC,EACOL,CACT,GAAEM,EAAI,EACN,SAASb,IAAgBF,EAAYL,EAAMqB,EAAWlB,EAAUmB,EAAQ,CACtE,IAAIJ,EAAOb,EAAW,KAClBM,EAAK,IAAIG,IAAQ,CACnB,MAAO,CACL,OAAQQ,EAASC,IAAUL,EAAMf,EAAUE,CAAU,EAAIa,CAC3D,CACF,CAAC,EACD,OAAAR,IAAoBL,EAAYM,EAAIX,EAAMqB,EAAWC,CAAM,EACpDX,CACT,CACA,SAASD,IAAoBL,EAAYM,EAAIX,EAAMqB,EAAWC,EAAQ,CACpE,IAAIzB,EAAcG,EAAK,UACnBwB,EAAeC,GAAQH,EAAS,YAAc,aAAa,EAC/DE,EAAab,EAAI,CACf,MAAO,CACL,OAAQN,EAAW,IACrB,CACF,EAAGR,EAAawB,CAAS,EACzBV,EAAG,SAASX,EAAK,cAAcqB,EAAW,OAAO,CAAC,EAClDV,EAAG,MAAM,cAAgB,GACzBA,EAAG,GAAK,IACR,IAAIe,EAAY1B,EAAK,aAAaqB,CAAS,EACvCM,EAAgBD,EAAU,SAAS,UAAU,EACjDE,GAAyBjB,EAAIe,CAAS,EACtCG,GAAoBlB,EAAIgB,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACnH,CACA,SAASJ,IAAUO,EAAQC,EAAK1B,EAAY,CAC1C,OAAc2B,EAAIF,EAAQ,SAAUG,EAAO,CACzC,OAAAA,EAAQA,EAAM,MAAM,EACpBA,EAAMF,CAAG,EAAI1B,EAAW,aACjB4B,CACT,CAAC,CACH,CACA,IAAOC,IAAQzC,IC9Hf,IAAI0C,GAAcA,EACH,SAARC,GAA+BC,EAAS,CAC7C,IAAIC,EAAcC,IAAkBF,CAAO,EAC3CF,GAAKG,EAAa,SAAUE,EAAW,CACrC,IAAIC,EAAeD,EAAU,aACxBC,EAAa,SAGlBC,IAAcF,CAAS,EACvBL,GAAKM,EAAc,SAAUE,EAAaC,EAAK,CAC7CC,IAAmBF,EAAaH,EAAU,cAAcI,CAAG,EAAGJ,EAAU,aAAaI,CAAG,CAAC,CAC3F,CAAC,EACH,CAAC,CACH,CAIA,SAASL,IAAkBF,EAAS,CAClC,IAAIS,EAAS,CAAC,EACVC,EAAW,CAAC,EAChB,OAAAV,EAAQ,iBAAiB,UAAW,SAAUM,EAAa,CACzD,IAAIK,EAAWL,EAAY,YAAY,EACnCC,EAAaK,GAAQF,EAAUC,CAAQ,EACvCJ,EAAM,IACRA,EAAMG,EAAS,OACfA,EAASH,CAAG,EAAII,EAChBF,EAAOF,CAAG,EAAI,CACZ,KAAMI,EACN,aAAc,CAAC,CACjB,GAEFF,EAAOF,CAAG,EAAE,aAAa,KAAKD,CAAW,CAC3C,CAAC,EACMG,CACT,CAIA,SAASJ,IAAcF,EAAW,CAChC,IAAIQ,EAAWR,EAAU,KACrBC,EAAeD,EAAU,aACzBU,EAAcT,EAAa,OAC3BU,EAAeX,EAAU,aAAe,CAAC,EACzCY,EAAgBZ,EAAU,cAAgB,CAAC,EAC3Ca,EAAY,CAAC,EACbC,EACJ,GAAIN,EAAS,OAAS,WACpBM,EAAYN,EAAS,aAAa,MAC7B,CACL,IAAIO,EAAiB,EACrBpB,GAAKM,EAAc,SAAUE,EAAa,CACxCY,EAAiB,KAAK,IAAIA,EAAgBZ,EAAY,QAAQ,EAAE,MAAM,CAAC,CACzE,CAAC,EACD,IAAIa,EAASR,EAAS,UAAU,EAChCM,EAAY,KAAK,IAAIE,EAAO,CAAC,EAAIA,EAAO,CAAC,CAAC,EAAID,CAChD,CACApB,GAAKM,EAAc,SAAUE,EAAa,CACxC,IAAIc,EAAgBd,EAAY,IAAI,UAAU,EAClCe,EAAQD,CAAa,IAC/BA,EAAgB,CAACA,EAAeA,CAAa,GAE/CJ,EAAU,KAAK,CAACM,GAAaF,EAAc,CAAC,EAAGH,CAAS,GAAK,EAAGK,GAAaF,EAAc,CAAC,EAAGH,CAAS,GAAK,CAAC,CAAC,CACjH,CAAC,EACD,IAAIM,EAAiBN,EAAY,GAAM,EACnCO,EAASD,EAAiBV,EAAc,GACxCY,GAAYF,EAAiBC,GAAUX,EAAc,IAAMA,EAC3Da,EAAOD,EAAW,EAAIF,EAAiB,EAC3CzB,GAAKM,EAAc,SAAUE,EAAaC,EAAK,CAC7CQ,EAAc,KAAKW,CAAI,EACvBA,GAAQF,EAASC,EACjBX,EAAa,KAAK,KAAK,IAAI,KAAK,IAAIW,EAAUT,EAAUT,CAAG,EAAE,CAAC,CAAC,EAAGS,EAAUT,CAAG,EAAE,CAAC,CAAC,CAAC,CACtF,CAAC,CACH,CAIA,SAASC,IAAmBF,EAAaqB,EAAQF,EAAU,CACzD,IAAIG,EAAWtB,EAAY,iBACvBuB,EAAOvB,EAAY,QAAQ,EAC3BwB,EAAYL,EAAW,EACvBM,EAAUzB,EAAY,IAAI,QAAQ,IAAM,aAAe,EAAI,EAC3D0B,EAAU,EAAID,EACdE,EAAY,CAAC,IAAK,GAAG,EACrBC,EAAOL,EAAK,aAAaI,EAAUF,CAAO,CAAC,EAC3CI,EAAQN,EAAK,iBAAiBI,EAAUD,CAAO,CAAC,EACpD,GAAIE,GAAQ,MAAQC,EAAM,OAAS,EACjC,OAEF,QAASC,EAAY,EAAGA,EAAYP,EAAK,MAAM,EAAGO,IAAa,CAC7D,IAAIC,EAAaR,EAAK,IAAIK,EAAME,CAAS,EACrCE,EAASC,EAASF,EAAYF,EAAM,CAAC,EAAGC,CAAS,EACjDI,EAAOD,EAASF,EAAYF,EAAM,CAAC,EAAGC,CAAS,EAC/CK,EAAOF,EAASF,EAAYF,EAAM,CAAC,EAAGC,CAAS,EAC/CM,EAAOH,EAASF,EAAYF,EAAM,CAAC,EAAGC,CAAS,EAC/CO,EAAOJ,EAASF,EAAYF,EAAM,CAAC,EAAGC,CAAS,EAC/CQ,EAAO,CAAC,EACZC,EAAWD,EAAMH,EAAM,EAAK,EAC5BI,EAAWD,EAAMF,EAAM,EAAI,EAC3BE,EAAK,KAAKJ,EAAMC,EAAME,EAAMD,CAAI,EAChCI,EAAWF,EAAMJ,CAAI,EACrBM,EAAWF,EAAMD,CAAI,EACrBG,EAAWF,EAAMN,CAAM,EACvBT,EAAK,cAAcO,EAAW,CAC5B,aAAcE,EAAON,CAAO,EAC5B,KAAMY,CACR,CAAC,CACH,CACA,SAASL,EAASF,EAAYU,EAAKX,EAAW,CAC5C,IAAIY,EAAMnB,EAAK,IAAIkB,EAAKX,CAAS,EAC7Ba,EAAI,CAAC,EACTA,EAAElB,CAAO,EAAIM,EACbY,EAAEjB,CAAO,EAAIgB,EACb,IAAIE,EACJ,OAAI,MAAMb,CAAU,GAAK,MAAMW,CAAG,EAChCE,EAAQ,CAAC,IAAK,GAAG,GAEjBA,EAAQtB,EAAS,YAAYqB,CAAC,EAC9BC,EAAMnB,CAAO,GAAKJ,GAEbuB,CACT,CACA,SAASL,EAAWD,EAAMM,EAAOC,EAAO,CACtC,IAAIC,EAASF,EAAM,MAAM,EACrBG,EAASH,EAAM,MAAM,EACzBE,EAAOrB,CAAO,GAAKD,EACnBuB,EAAOtB,CAAO,GAAKD,EACnBqB,EAAQP,EAAK,KAAKQ,EAAQC,CAAM,EAAIT,EAAK,KAAKS,EAAQD,CAAM,CAC9D,CACA,SAASN,EAAWF,EAAMU,EAAW,CACnC,IAAIC,EAAOD,EAAU,MAAM,EACvBE,EAAKF,EAAU,MAAM,EACzBC,EAAKxB,CAAO,GAAKD,EACjB0B,EAAGzB,CAAO,GAAKD,EACfc,EAAK,KAAKW,EAAMC,CAAE,CACpB,CACF,CCtHe,SAARC,GAAoCC,EAASC,EAAK,CACvDA,EAAMA,GAAO,CAAC,EAKd,QAJIC,EAAU,CAAC,EACXC,EAAW,CAAC,EACZC,EAAWH,EAAI,SACfI,EAAaD,IAAa,QAAUA,IAAa,EAC5CE,EAAI,EAAGA,EAAIN,EAAQ,OAAQM,IAAK,CACvC,IAAIC,EAAUC,GAAIR,EAAQM,CAAC,EAAE,MAAM,CAAC,EAChCG,EAAKC,GAASH,EAAS,GAAI,EAC3BI,EAAKD,GAASH,EAAS,EAAG,EAC1BK,EAAKF,GAASH,EAAS,GAAI,EAC3BM,EAAMN,EAAQ,CAAC,EACfO,EAAMP,EAAQA,EAAQ,OAAS,CAAC,EAChCQ,GAASX,GAAmB,MAAmBQ,EAAKH,GACpDO,EAAMX,EAAaQ,EAAM,KAAK,IAAIA,EAAKJ,EAAKM,CAAK,EACjDE,EAAOZ,EAAaS,EAAM,KAAK,IAAIA,EAAKF,EAAKG,CAAK,EAClDG,EAAoBjB,EAAI,kBACxBkB,EAAWC,GAAWF,CAAiB,EAAIA,EAAkB,CAC/D,MAAOZ,CACT,CAAC,EAAIe,GAASH,CAAiB,EAAIA,EAAkB,QAAQ,UAAWZ,EAAI,EAAE,EAAIA,EAAI,GACtFJ,EAAQ,KAAK,CAACiB,EAAUH,EAAKP,EAAIE,EAAIC,EAAIK,CAAI,CAAC,EAC9C,QAASK,EAAI,EAAGA,EAAIf,EAAQ,OAAQe,IAAK,CACvC,IAAIC,EAAWhB,EAAQe,CAAC,EACxB,GAAIC,EAAWP,GAAOO,EAAWN,EAAM,CACrC,IAAIO,EAAU,CAACL,EAAUI,CAAQ,EACjCpB,EAAS,KAAKqB,CAAO,CACvB,CACF,CACF,CACA,MAAO,CACL,QAAStB,EACT,SAAUC,CACZ,CACF,CCjDO,IAAIsB,IAAmB,CAC5B,KAAM,kBACN,UAAW,SAAmBC,EAAQ,CACpC,IAAIC,EAAWD,EAAO,SACtB,GAAIC,EAAS,eAAiBC,GAA0B,CACtD,IAAIC,EAAS,GAIbC,GAAWD,CAAM,CACnB,CACA,IAAIE,EAASC,GAAmBL,EAAS,WAAW,EAAGD,EAAO,MAAM,EACpE,MAAO,CAAC,CACN,WAAY,CAAC,WAAY,MAAO,KAAM,KAAM,KAAM,MAAM,EACxD,KAAMK,EAAO,OACf,EAAG,CACD,KAAMA,EAAO,QACf,CAAC,CACH,CACF,EClBO,SAASE,GAAQC,EAAW,CACjCA,EAAU,oBAAoBC,GAAkB,EAChDD,EAAU,kBAAkBE,GAAW,EACvCF,EAAU,eAAeG,EAAa,EACtCH,EAAU,kBAAkBI,GAAgB,CAC9C,CCPA,IAAIC,IAA2B,CAAC,YAAa,aAAa,EACtDC,IAA2B,CAAC,YAAa,cAAc,EACvDC,IAAuB,CAAC,YAAa,iBAAiB,EACtDC,IAAqB,CAAC,YAAa,OAAO,EAC1CC,IAAqB,CAAC,YAAa,QAAQ,EACxC,SAASC,GAASC,EAAMC,EAAO,CACpC,OAAOA,EAAM,IAAID,EAAO,EAAIH,IAAqBC,GAAkB,CACrE,CACO,SAASI,GAAeF,EAAMC,EAAO,CAC1C,OAAOA,EAAM,IAAID,IAAS,EAAIJ,IAAuBI,EAAO,EAAIN,IAA2BC,GAAwB,CACrH,CACA,IAAIQ,IAAoB,CACtB,WAAY,cACZ,KAAMC,GAAoB,EAE1B,iBAAkB,GAClB,MAAO,SAAUC,EAAaC,EAAS,CAErC,GAAI,CAAAA,EAAQ,iBAAiBD,CAAW,EAGxC,KAAIE,EAAgBF,EAAY,gBAAgB,MAChD,MAAO,CAACE,GAAiB,CACvB,SAAU,SAAUC,EAAQC,EAAM,CAEhC,QADIC,GACIA,EAAYF,EAAO,KAAK,IAAM,MAAM,CAC1C,IAAIG,EAAYF,EAAK,aAAaC,CAAS,EACvCV,EAAOS,EAAK,cAAcC,CAAS,EAAE,KACrCE,EAAQD,EAAU,aAAa,EACnCC,EAAM,KAAOb,GAASC,EAAMW,CAAS,EACrCC,EAAM,OAASV,GAAeF,EAAMW,CAAS,GAAKC,EAAM,KACxD,IAAIC,EAAcJ,EAAK,uBAAuBC,EAAW,OAAO,EAChEI,EAAOD,EAAaD,CAAK,CAC3B,CACF,CACF,EACF,CACF,EACOG,IAAQZ,IC/Bf,IAAIa,IAAa,CAAC,QAAS,aAAa,EACpCC,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CAEtE,KAAK,MAAM,eAAe,EAE1B,KAAK,gBAAkB,KACvB,KAAK,gBAAgBF,CAAW,EAChC,KAAK,aAAe,KAAK,aAAaA,CAAW,EAAI,KAAK,cAAcA,CAAW,CACrF,EACAJ,EAAgB,UAAU,yBAA2B,SAAUI,EAAaC,EAASC,EAAK,CACxF,KAAK,OAAO,EACZ,KAAK,gBAAgBF,CAAW,CAClC,EACAJ,EAAgB,UAAU,kBAAoB,SAAUO,EAAQH,EAAaC,EAASC,EAAK,CACzF,KAAK,gBAAkB,CAAC,EACxB,KAAK,aAAe,KAAK,wBAAwBC,EAAQH,CAAW,EAAI,KAAK,yBAAyBG,EAAQH,CAAW,CAC3H,EACAJ,EAAgB,UAAU,aAAe,SAAUQ,EAAI,CAC7CC,GAAiB,KAAK,iBAAmB,KAAK,MAAOD,CAAE,CACjE,EACAR,EAAgB,UAAU,gBAAkB,SAAUI,EAAa,CACjE,IAAIM,EAAcN,EAAY,gBAAgB,OAC1C,KAAK,cAAgB,MAAQM,IAAgB,KAAK,gBACpD,KAAK,aAAeA,EACpB,KAAK,OAAO,EAEhB,EACAV,EAAgB,UAAU,cAAgB,SAAUI,EAAa,CAC/D,IAAIO,EAAOP,EAAY,QAAQ,EAC3BQ,EAAU,KAAK,MACfC,EAAQ,KAAK,MACbC,EAAcH,EAAK,UAAU,aAAa,EAC1CI,EAAYX,EAAY,IAAI,OAAQ,EAAI,EACxCY,EAAQZ,EAAY,iBACpBa,EAAWD,EAAM,SAAWA,EAAM,QAAQ,EAGzC,KAAK,OACRH,EAAM,UAAU,EAElBF,EAAK,KAAKC,CAAO,EAAE,IAAI,SAAUM,EAAQ,CACvC,GAAIP,EAAK,SAASO,CAAM,EAAG,CACzB,IAAIC,EAAaR,EAAK,cAAcO,CAAM,EAC1C,GAAIH,GAAaK,IAAmBH,EAAUE,CAAU,EACtD,OAEF,IAAIE,EAAKC,GAAgBH,EAAYD,EAAQ,EAAI,EACzCK,GAAUF,EAAI,CACpB,MAAO,CACL,OAAQF,EAAW,IACrB,CACF,EAAGf,EAAac,CAAM,EACtBM,GAAaH,EAAIV,EAAMO,EAAQJ,CAAW,EAC1CD,EAAM,IAAIQ,CAAE,EACZV,EAAK,iBAAiBO,EAAQG,CAAE,CAClC,CACF,CAAC,EAAE,OAAO,SAAUH,EAAQO,EAAQ,CAClC,IAAIJ,EAAKT,EAAQ,iBAAiBa,CAAM,EAExC,GAAI,CAACd,EAAK,SAASO,CAAM,EAAG,CAC1BL,EAAM,OAAOQ,CAAE,EACf,MACF,CACA,IAAIF,EAAaR,EAAK,cAAcO,CAAM,EAC1C,GAAIH,GAAaK,IAAmBH,EAAUE,CAAU,EAAG,CACzDN,EAAM,OAAOQ,CAAE,EACf,MACF,CACKA,GAGKK,GAAYL,EAAI,CACtB,MAAO,CACL,OAAQF,EAAW,IACrB,CACF,EAAGf,EAAac,CAAM,EACtBS,GAAaN,CAAE,GAPfA,EAAKC,GAAgBH,EAAYD,CAAM,EASzCM,GAAaH,EAAIV,EAAMO,EAAQJ,CAAW,EAC1CD,EAAM,IAAIQ,CAAE,EACZV,EAAK,iBAAiBO,EAAQG,CAAE,CAClC,CAAC,EAAE,OAAO,SAAUI,EAAQ,CAC1B,IAAIJ,EAAKT,EAAQ,iBAAiBa,CAAM,EACxCJ,GAAMR,EAAM,OAAOQ,CAAE,CACvB,CAAC,EAAE,QAAQ,EACX,KAAK,MAAQV,CACf,EACAX,EAAgB,UAAU,aAAe,SAAUI,EAAa,CAC9D,KAAK,OAAO,EACZwB,IAAYxB,EAAa,KAAK,KAAK,EACnC,IAAIyB,EAAWzB,EAAY,IAAI,OAAQ,EAAI,EAAI0B,GAAe1B,EAAY,iBAAkB,GAAOA,CAAW,EAAI,KAC9GyB,EACF,KAAK,MAAM,YAAYA,CAAQ,EAE/B,KAAK,MAAM,eAAe,CAE9B,EACA7B,EAAgB,UAAU,yBAA2B,SAAUO,EAAQH,EAAa,CAIlF,QAHIO,EAAOP,EAAY,QAAQ,EAC3BU,EAAcH,EAAK,UAAU,aAAa,EAC1CoB,GACIA,EAAYxB,EAAO,KAAK,IAAM,MAAM,CAC1C,IAAIY,EAAaR,EAAK,cAAcoB,CAAS,EACzCV,EAAKC,GAAgBH,EAAYY,CAAS,EAC9CP,GAAaH,EAAIV,EAAMoB,EAAWjB,CAAW,EAC7CO,EAAG,YAAc,GACjB,KAAK,MAAM,IAAIA,CAAE,EACjB,KAAK,gBAAgB,KAAKA,CAAE,CAC9B,CACF,EACArB,EAAgB,UAAU,wBAA0B,SAAUO,EAAQH,EAAa,CACjFwB,IAAYxB,EAAa,KAAK,MAAO,KAAK,gBAAiB,EAAI,CACjE,EACAJ,EAAgB,UAAU,OAAS,SAAUK,EAAS,CACpD,KAAK,OAAO,CACd,EACAL,EAAgB,UAAU,OAAS,UAAY,CAC7C,KAAK,MAAM,UAAU,EACrB,KAAK,MAAQ,IACf,EACAA,EAAgB,KAAO,cAChBA,CACT,GAAEgC,EAAS,EACPC,KAAkC,UAAY,CAChD,SAASA,GAAqB,CAAC,CAC/B,OAAOA,CACT,GAAE,EACEC,KAA6B,SAAUjC,EAAQ,CACjDC,EAAUgC,EAAejC,CAAM,EAC/B,SAASiC,EAAcC,EAAM,CAC3B,IAAIhC,EAAQF,EAAO,KAAK,KAAMkC,CAAI,GAAK,KACvC,OAAAhC,EAAM,KAAO,uBACNA,CACT,CACA,OAAA+B,EAAc,UAAU,gBAAkB,UAAY,CACpD,OAAO,IAAID,GACb,EACAC,EAAc,UAAU,UAAY,SAAUE,EAAKC,EAAO,CACxD,IAAIC,EAAOD,EAAM,OACb,KAAK,aACPD,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,IAEjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,UAAU,EACdA,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EACjCF,EAAI,OAAOE,EAAK,CAAC,EAAE,CAAC,EAAGA,EAAK,CAAC,EAAE,CAAC,CAAC,EAErC,EACOJ,CACT,GAAEK,EAAI,EACN,SAASjB,GAAgBH,EAAYY,EAAWS,EAAQ,CACtD,IAAIF,EAAOnB,EAAW,KACtB,OAAO,IAAIe,IAAc,CACvB,MAAO,CACL,OAAQM,EAASC,IAAUH,EAAMnB,CAAU,EAAImB,CACjD,EACA,GAAI,GACN,CAAC,CACH,CACA,SAASlB,IAAmBH,EAAUE,EAAY,CAEhD,QADIuB,EAAU,GACLC,EAAI,EAAGA,EAAIxB,EAAW,KAAK,OAAQwB,IAE1C,GAAI1B,EAAS,QAAQE,EAAW,KAAKwB,CAAC,EAAE,CAAC,EAAGxB,EAAW,KAAKwB,CAAC,EAAE,CAAC,CAAC,EAAG,CAClED,EAAU,GACV,KACF,CAEF,OAAOA,CACT,CACA,SAASlB,GAAaH,EAAIV,EAAMoB,EAAWjB,EAAa,CACtD,IAAI8B,EAAYjC,EAAK,aAAaoB,CAAS,EAC3CV,EAAG,SAASV,EAAK,cAAcoB,EAAW,OAAO,CAAC,EAClDV,EAAG,MAAM,cAAgB,GACzBA,EAAG,YAAcP,EACjB+B,GAAyBxB,EAAIuB,CAAS,EACtC,IAAIE,EAAOnC,EAAK,cAAcoB,CAAS,EAAE,KAClCgB,EAAK1B,EAAG,OAAQ,SAAU2B,EAAOC,EAAW,CACjD,IAAIC,EAAaN,EAAU,SAASK,CAAS,EACzCE,EAAQC,GAASN,EAAMI,CAAU,EACjCG,EAAcC,GAAeR,EAAMI,CAAU,GAAKC,EAClDI,EAAaP,EAAM,QAAUA,EAAM,MAAQ,CAAC,GAChDG,IAAUI,EAAW,KAAOJ,GAC5BE,IAAgBE,EAAW,OAASF,EACtC,CAAC,EACD,IAAIG,EAAgBZ,EAAU,SAAS,UAAU,EACjDa,GAAoBpC,EAAImC,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACnH,CACA,SAASf,IAAUiB,EAAQvC,EAAY,CACrC,OAAcwC,EAAID,EAAQ,SAAUE,EAAO,CACzC,OAAAA,EAAQA,EAAM,MAAM,EACpBA,EAAM,CAAC,EAAIzC,EAAW,aACfyC,CACT,CAAC,CACH,CACA,IAAIC,KAAiC,UAAY,CAC/C,SAASA,GAAoB,CAAC,CAC9B,OAAOA,CACT,GAAE,EACEC,IAA4B,SAAU7D,EAAQ,CAChDC,EAAU4D,EAAc7D,CAAM,EAC9B,SAAS6D,EAAa3B,EAAM,CAC1B,IAAIhC,EAAQF,EAAO,KAAK,KAAMkC,CAAI,GAAK,KACvC,OAAAhC,EAAM,KAAO,sBACNA,CACT,CACA,OAAA2D,EAAa,UAAU,gBAAkB,UAAY,CACnD,OAAO,IAAID,GACb,EACAC,EAAa,UAAU,UAAY,SAAU1B,EAAKC,EAAO,CAIvD,QADIqB,EAASrB,EAAM,OACVM,EAAI,EAAGA,EAAIe,EAAO,QACzB,GAAI,KAAK,SAAWA,EAAOf,GAAG,EAAG,CAC/B,IAAIoB,EAAIL,EAAOf,GAAG,EAClBP,EAAI,OAAO2B,EAAGL,EAAOf,GAAG,CAAC,EACzBP,EAAI,OAAO2B,EAAGL,EAAOf,GAAG,CAAC,CAC3B,MACEA,GAAK,CAGX,EACOmB,CACT,GAAEvB,EAAI,EACN,SAASX,IAAYxB,EAAaS,EAAOmD,EAAgBC,EAAa,CACpE,IAAItD,EAAOP,EAAY,QAAQ,EAC3B8D,EAAcvD,EAAK,UAAU,aAAa,EAC1CwD,EAAM,IAAIL,GAAa,CACzB,MAAO,CACL,OAAQI,CACV,EACA,OAAQ,EACR,oBAAqB,EACvB,CAAC,EACDrD,EAAM,IAAIsD,CAAG,EACb,IAAIC,EAAM,IAAIN,GAAa,CACzB,MAAO,CACL,OAAQI,CACV,EACA,OAAQ,GACR,oBAAqB,EACvB,CAAC,EACDrD,EAAM,IAAIuD,CAAG,EACb,IAAIC,EAAS,IAAIP,GAAa,CAC5B,MAAO,CACL,OAAQI,CACV,EACA,OAAQ,EACR,oBAAqB,EACvB,CAAC,EACDrD,EAAM,IAAIwD,CAAM,EAChBC,GAAc,EAAGH,EAAK/D,EAAaO,CAAI,EACvC2D,GAAc,GAAIF,EAAKhE,EAAaO,CAAI,EACxC2D,GAAc,EAAGD,EAAQjE,EAAaO,CAAI,EACtCsD,IACFE,EAAI,YAAc,GAClBC,EAAI,YAAc,IAEhBJ,GACFA,EAAe,KAAKG,EAAKC,CAAG,CAEhC,CACA,SAASE,GAAcxB,EAAMzB,EAAIjB,EAAaO,EAAM,CAElD,IAAI0C,EAAcC,GAAeR,EAAM1C,CAAW,GAE/CgD,GAASN,EAAM1C,CAAW,EAGzBmE,EAAYnE,EAAY,SAAS,WAAW,EAAE,aAAaL,GAAU,EACzEsB,EAAG,SAASkD,CAAS,EACrBlD,EAAG,MAAM,KAAO,KAChBA,EAAG,MAAM,OAASgC,CACpB,CACA,IAAOmB,IAAQxE,ICrSf,IAAIyE,KAAsC,SAAUC,EAAQ,CAC1DC,EAAUF,EAAwBC,CAAM,EACxC,SAASD,GAAyB,CAChC,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAuB,KACpCG,EAAM,uBAAyB,CAAC,CAC9B,KAAM,OACN,eAAgB,EAClB,EAAG,CACD,KAAM,QACN,eAAgB,EAClB,EAAG,CACD,KAAM,SACN,eAAgB,EAClB,EAAG,CACD,KAAM,UACN,eAAgB,EAClB,CAAC,EACMA,CACT,CAKA,OAAAH,EAAuB,UAAU,aAAe,UAAY,CAC1D,MAAO,MACT,EACAA,EAAuB,UAAU,cAAgB,SAAUI,EAAWC,EAAMC,EAAW,CACrF,IAAIC,EAAaF,EAAK,cAAcD,CAAS,EAC7C,OAAOG,GAAcD,EAAU,KAAKC,EAAW,SAAS,CAC1D,EACAP,EAAuB,KAAO,qBAC9BA,EAAuB,aAAe,CAAC,QAAS,QAAS,MAAM,EAC/DA,EAAuB,cAAgB,CAErC,EAAG,EACH,iBAAkB,cAClB,gBAAiB,GAGjB,OAAQ,KACR,KAAM,GACN,UAAW,CACT,MAAO,UACP,OAAQ,UACR,YAAa,UACb,aAAc,UACd,gBAAiB,KAGjB,YAAa,CACf,EACA,SAAU,CACR,UAAW,CACT,YAAa,CACf,CACF,EACA,YAAa,KACb,YAAa,KACb,SAAU,KACV,MAAO,GACP,eAAgB,IAChB,YAAa,IACb,qBAAsB,IACtB,qBAAsB,MACtB,gBAAiB,SACjB,kBAAmB,GACrB,EACOA,CACT,GAAEQ,EAAW,EACbC,GAAMT,IAAwBU,GAAuB,EAAI,EACzD,IAAOC,IAAQX,IC1EA,SAARY,GAAyCC,EAAQ,CAClD,CAACA,GAAU,CAAQC,EAAQD,EAAO,MAAM,GAIrCE,EAAKF,EAAO,OAAQ,SAAUG,EAAY,CACpCC,GAASD,CAAU,GAAKA,EAAW,OAAS,MACrDA,EAAW,KAAO,cAEtB,CAAC,CACH,CCNA,IAAIE,IAAoB,CACtB,WAAY,cACZ,KAAMC,GAAoB,EAC1B,MAAO,SAAUC,EAAa,CAC5B,IAAIC,EAAWD,EAAY,iBACvBE,EAAOF,EAAY,QAAQ,EAC3BG,EAAcC,IAAqBJ,EAAaE,CAAI,EACpDG,EAAU,EACVC,EAAU,EACVC,EAAY,CAAC,IAAK,GAAG,EACrBC,EAAQN,EAAK,kBAAkBA,EAAK,aAAaK,EAAUF,CAAO,CAAC,CAAC,EACpEI,EAASC,EAAIR,EAAK,iBAAiBK,EAAUD,CAAO,CAAC,EAAGJ,EAAK,kBAAmBA,CAAI,EACpFS,EAAWF,EAAO,CAAC,EACnBG,EAAYH,EAAO,CAAC,EACpBI,EAAaJ,EAAO,CAAC,EACrBK,EAAcL,EAAO,CAAC,EAM1B,GALAP,EAAK,UAAU,CACb,YAAaC,EAEb,YAAaA,GAAe,GAC9B,CAAC,EACGK,EAAQ,GAAKC,EAAO,OAAS,EAC/B,OAEF,MAAO,CACL,SAAUT,EAAY,gBAAgB,MAAQe,EAAgBC,CAChE,EACA,SAASA,EAAeC,EAAQf,EAAM,CAGpC,QAFIgB,EACAC,EAAQjB,EAAK,SAAS,GAClBgB,EAAYD,EAAO,KAAK,IAAM,MAAM,CAC1C,IAAIG,EAAaD,EAAM,IAAIX,EAAOU,CAAS,EACvCG,EAAUF,EAAM,IAAIR,EAAUO,CAAS,EACvCI,EAAWH,EAAM,IAAIP,EAAWM,CAAS,EACzCK,EAAYJ,EAAM,IAAIN,EAAYK,CAAS,EAC3CM,EAAaL,EAAM,IAAIL,EAAaI,CAAS,EAC7CO,EAAQ,KAAK,IAAIJ,EAASC,CAAQ,EAClCI,EAAS,KAAK,IAAIL,EAASC,CAAQ,EACnCK,EAAaC,EAASH,EAAOL,CAAU,EACvCS,EAAcD,EAASF,EAAQN,CAAU,EACzCU,EAAcF,EAASL,EAAWH,CAAU,EAC5CW,EAAeH,EAASJ,EAAYJ,CAAU,EAC9CY,EAAO,CAAC,EACZC,EAAWD,EAAMH,EAAa,CAAC,EAC/BI,EAAWD,EAAML,EAAY,CAAC,EAC9BK,EAAK,KAAKE,EAAsBH,CAAY,EAAGG,EAAsBL,CAAW,EAAGK,EAAsBJ,CAAW,EAAGI,EAAsBP,CAAU,CAAC,EACxJ,IAAIQ,EAAYjC,EAAK,aAAagB,CAAS,EACvCkB,EAAe,CAAC,CAACD,EAAU,IAAI,CAAC,YAAa,iBAAiB,CAAC,EACnEjC,EAAK,cAAcgB,EAAW,CAC5B,KAAMmB,IAAQlB,EAAOD,EAAWG,EAASC,EAAUV,EAAWwB,CAAY,EAC1E,aAAcf,EAAUC,EAAWO,EAAYvB,CAAO,EAAIqB,EAAWrB,CAAO,EAC5E,KAAM0B,EACN,UAAWM,EAAcf,EAAWC,EAAYJ,CAAU,CAC5D,CAAC,CACH,CACA,SAASQ,EAASW,EAAKnB,EAAY,CACjC,IAAIoB,GAAI,CAAC,EACT,OAAAA,GAAEnC,CAAO,EAAIe,EACboB,GAAElC,CAAO,EAAIiC,EACN,MAAMnB,CAAU,GAAK,MAAMmB,CAAG,EAAI,CAAC,IAAK,GAAG,EAAItC,EAAS,YAAYuC,EAAC,CAC9E,CACA,SAASP,EAAWD,EAAMS,EAAOC,GAAO,CACtC,IAAIC,GAASF,EAAM,MAAM,EACrBG,GAASH,EAAM,MAAM,EACzBE,GAAOtC,CAAO,EAAIwC,GAAiBF,GAAOtC,CAAO,EAAIF,EAAc,EAAG,EAAG,EAAK,EAC9EyC,GAAOvC,CAAO,EAAIwC,GAAiBD,GAAOvC,CAAO,EAAIF,EAAc,EAAG,EAAG,EAAI,EAC7EuC,GAAQV,EAAK,KAAKW,GAAQC,EAAM,EAAIZ,EAAK,KAAKY,GAAQD,EAAM,CAC9D,CACA,SAASL,EAAcf,EAAWC,EAAYJ,GAAY,CACxD,IAAI0B,GAAOlB,EAASL,EAAWH,EAAU,EACrC2B,GAAOnB,EAASJ,EAAYJ,EAAU,EAC1C,OAAA0B,GAAKzC,CAAO,GAAKF,EAAc,EAC/B4C,GAAK1C,CAAO,GAAKF,EAAc,EACxB,CACL,EAAG2C,GAAK,CAAC,EACT,EAAGA,GAAK,CAAC,EACT,MAAOxC,EAAUH,EAAc4C,GAAK,CAAC,EAAID,GAAK,CAAC,EAC/C,OAAQxC,EAAUyC,GAAK,CAAC,EAAID,GAAK,CAAC,EAAI3C,CACxC,CACF,CACA,SAAS+B,EAAsBO,EAAO,CACpC,OAAAA,EAAMpC,CAAO,EAAIwC,GAAiBJ,EAAMpC,CAAO,EAAG,CAAC,EAC5CoC,CACT,CACF,CACA,SAAS1B,EAAcE,EAAQf,EAAM,CAUnC,QARI8C,EAASC,GAAmBhC,EAAO,MAAQ,CAAC,EAC5CiC,EAAS,EACTT,EACAU,EAAQ,CAAC,EACTC,EAAS,CAAC,EACVlC,EACAC,EAAQjB,EAAK,SAAS,EACtBkC,EAAe,CAAC,CAACpC,EAAY,IAAI,CAAC,YAAa,iBAAiB,CAAC,GAC7DkB,EAAYD,EAAO,KAAK,IAAM,MAAM,CAC1C,IAAIG,EAAaD,EAAM,IAAIX,EAAOU,CAAS,EACvCG,EAAUF,EAAM,IAAIR,EAAUO,CAAS,EACvCI,EAAWH,EAAM,IAAIP,EAAWM,CAAS,EACzCK,EAAYJ,EAAM,IAAIN,EAAYK,CAAS,EAC3CM,EAAaL,EAAM,IAAIL,EAAaI,CAAS,EACjD,GAAI,MAAME,CAAU,GAAK,MAAMG,CAAS,GAAK,MAAMC,CAAU,EAAG,CAC9DwB,EAAOE,GAAQ,EAAI,IACnBA,GAAU,EACV,QACF,CACAF,EAAOE,GAAQ,EAAIb,IAAQlB,EAAOD,EAAWG,EAASC,EAAUV,EAAWwB,CAAY,EACvFe,EAAM9C,CAAO,EAAIe,EACjB+B,EAAM7C,CAAO,EAAIiB,EACjBkB,EAAQxC,EAAS,YAAYkD,EAAO,KAAMC,CAAM,EAChDJ,EAAOE,GAAQ,EAAIT,EAAQA,EAAM,CAAC,EAAI,IACtCO,EAAOE,GAAQ,EAAIT,EAAQA,EAAM,CAAC,EAAI,IACtCU,EAAM7C,CAAO,EAAIkB,EACjBiB,EAAQxC,EAAS,YAAYkD,EAAO,KAAMC,CAAM,EAChDJ,EAAOE,GAAQ,EAAIT,EAAQA,EAAM,CAAC,EAAI,GACxC,CACAvC,EAAK,UAAU,cAAe8C,CAAM,CACtC,CACF,CACF,EAQA,SAASX,IAAQlB,EAAOD,EAAWG,EAASC,EAAUV,EAAWwB,EAAc,CAC7E,IAAIiB,EACJ,OAAIhC,EAAUC,EACZ+B,EAAO,GACEhC,EAAUC,EACnB+B,EAAO,EAEPA,EAAOjB,EAEL,EAAIlB,EAAY,EAEhBC,EAAM,IAAIP,EAAWM,EAAY,CAAC,GAAKI,EAAW,EAAI,GAEtD,EAEG+B,CACT,CACA,SAASjD,IAAqBJ,EAAaE,EAAM,CAC/C,IAAIoD,EAAWtD,EAAY,YAAY,EACnCuD,EACAC,EAAYF,EAAS,OAAS,WAAaA,EAAS,aAAa,GAAKC,EAASD,EAAS,UAAU,EAAG,KAAK,IAAIC,EAAO,CAAC,EAAIA,EAAO,CAAC,CAAC,EAAIrD,EAAK,MAAM,GAClJuD,EAAcC,GAAaC,GAAU3D,EAAY,IAAI,aAAa,EAAGwD,CAAS,EAAGA,CAAS,EAC1FI,EAAcF,GAAaC,GAAU3D,EAAY,IAAI,aAAa,EAAG,CAAC,EAAGwD,CAAS,EAClFK,EAAW7D,EAAY,IAAI,UAAU,EACzC,OAAO6D,GAAY,KAAOH,GAAaG,EAAUL,CAAS,EAExD,KAAK,IAAI,KAAK,IAAIA,EAAY,EAAGC,CAAW,EAAGG,CAAW,CAC9D,CACA,IAAOE,IAAQhE,IC3JR,SAASiE,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAe,EAC3CD,EAAU,oBAAoBE,GAAsB,EACpDF,EAAU,qBAAqBG,EAAY,EAC3CH,EAAU,eAAeI,GAAiB,EAC1CJ,EAAU,eAAeK,GAAiB,CAC5C,CCNA,SAASC,IAAiBC,EAAaC,EAAW,CAChD,IAAIC,EAAQD,EAAU,mBAAqBA,EAAU,MACrDD,EAAY,UAAU,SAAUG,EAAY,CAC1CA,EAAW,KAAK,CACd,EAAGF,EAAU,EACb,OAAQA,EAAU,OAClB,MAAO,CACL,OAAQA,EAAU,YAAc,SAAWC,EAAQ,KACnD,KAAMD,EAAU,YAAc,OAASC,EAAQ,IACjD,CACF,CAAC,CACH,CAAC,CACH,CACA,IAAIE,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,EAAaG,EAAMC,EAAK,CAC/B,IAAIC,EAAQJ,EAAO,KAAK,IAAI,GAAK,KAC7BK,EAAS,IAAIC,GAAUJ,EAAMC,CAAG,EAChCR,EAAc,IAAIY,GACtB,OAAAH,EAAM,IAAIC,CAAM,EAChBD,EAAM,IAAIT,CAAW,EACrBS,EAAM,WAAWF,EAAMC,CAAG,EACnBC,CACT,CACA,OAAAL,EAAa,UAAU,oBAAsB,UAAY,CACvD,KAAK,QAAQ,CAAC,EAAE,UAAU,CAC5B,EACAA,EAAa,UAAU,qBAAuB,SAAUH,EAAW,CAKjE,QAJIY,EAAaZ,EAAU,WACvBC,EAAQD,EAAU,MAClBa,EAAeb,EAAU,aACzBD,EAAc,KAAK,QAAQ,CAAC,EACvBe,EAAI,EAAGA,EAAID,EAAcC,IAAK,CAIrC,IAAIZ,EAAaa,GAAaH,EAAY,GAAI,GAAI,EAAG,EAAGX,CAAK,EAC7DC,EAAW,KAAK,CACd,MAAO,CACL,cAAe,EACjB,EACA,GAAI,GACJ,OAAQ,GACR,OAAQ,GACR,OAAQ,EACV,CAAC,EACD,IAAIc,EAAQ,CAACF,EAAID,EAAeb,EAAU,OAASA,EAAU,aAC7DE,EAAW,QAAQ,GAAI,EAAI,EAAE,KAAKF,EAAU,OAAQ,CAClD,OAAQA,EAAU,YAAc,EAChC,OAAQA,EAAU,YAAc,CAClC,CAAC,EAAE,MAAMgB,CAAK,EAAE,MAAM,EACtBd,EAAW,aAAa,EAAI,EAAE,KAAKF,EAAU,OAAQ,CACnD,QAAS,CACX,CAAC,EAAE,MAAMgB,CAAK,EAAE,MAAM,EACtBjB,EAAY,IAAIG,CAAU,CAC5B,CACAJ,IAAiBC,EAAaC,CAAS,CACzC,EAIAG,EAAa,UAAU,sBAAwB,SAAUH,EAAW,CAKlE,QAJIiB,EAAe,KAAK,WACpBlB,EAAc,KAAK,QAAQ,CAAC,EAE5BmB,EAAkB,CAAC,aAAc,SAAU,cAAe,cAAc,EACnEJ,EAAI,EAAGA,EAAII,EAAgB,OAAQJ,IAAK,CAC/C,IAAIK,EAAWD,EAAgBJ,CAAC,EAChC,GAAIG,EAAaE,CAAQ,IAAMnB,EAAUmB,CAAQ,EAAG,CAClD,KAAK,oBAAoB,EACzB,KAAK,qBAAqBnB,CAAS,EACnC,MACF,CACF,CACAF,IAAiBC,EAAaC,CAAS,CACzC,EAIAG,EAAa,UAAU,UAAY,UAAY,CAC7CiB,GAAc,IAAI,CACpB,EAIAjB,EAAa,UAAU,SAAW,UAAY,CAC5CkB,GAAc,IAAI,CACpB,EACAlB,EAAa,UAAU,cAAgB,UAAY,CACjD,IAAIM,EAAS,KAAK,QAAQ,CAAC,EAC3B,OAAOA,GAAUA,EAAO,cAAc,CACxC,EAIAN,EAAa,UAAU,WAAa,SAAUG,EAAMC,EAAK,CACvD,IAAIC,EAAQ,KACRc,EAAchB,EAAK,UACvB,KAAK,QAAQ,CAAC,EAAE,WAAWA,EAAMC,CAAG,EACpC,IAAIR,EAAc,KAAK,QAAQ,CAAC,EAC5BwB,EAAYjB,EAAK,aAAaC,CAAG,EACjCK,EAAaN,EAAK,cAAcC,EAAK,QAAQ,EAC7CiB,EAAaC,GAAoBnB,EAAK,cAAcC,EAAK,YAAY,CAAC,EACtEmB,EAAcpB,EAAK,cAAcC,EAAK,OAAO,EAC7CN,EAAQyB,GAAeA,EAAY,KACnCC,EAAgBJ,EAAU,SAAS,UAAU,EACjDxB,EAAY,SAASyB,CAAU,EAC/BzB,EAAY,SAAS,SAAUG,EAAY,CACzCA,EAAW,SAAS,OAAQD,CAAK,CACnC,CAAC,EACD,IAAI2B,EAAeC,GAAsBvB,EAAK,cAAcC,EAAK,cAAc,EAAGiB,CAAU,EACxFI,IACF7B,EAAY,EAAI6B,EAAa,CAAC,EAC9B7B,EAAY,EAAI6B,EAAa,CAAC,GAEhC,IAAIE,EAAexB,EAAK,cAAcC,EAAK,cAAc,EACzDR,EAAY,UAAY+B,GAAgB,GAAK,KAAK,GAAK,KAAO,EAC9D,IAAI9B,EAAY,CAAC,EACjBA,EAAU,aAAesB,EAAY,IAAI,cAAc,EACvDtB,EAAU,YAAcuB,EAAU,IAAI,CAAC,eAAgB,OAAO,CAAC,EAC/DvB,EAAU,UAAYuB,EAAU,IAAI,CAAC,eAAgB,WAAW,CAAC,EACjEvB,EAAU,OAASuB,EAAU,IAAI,CAAC,eAAgB,QAAQ,CAAC,EAAI,IAC/DvB,EAAU,aAAeO,EAAMD,EAAK,MAAM,EAC1CN,EAAU,EAAIsB,EAAY,WAAW,GAAG,GAAK,EAC7CtB,EAAU,OAASsB,EAAY,WAAW,QAAQ,GAAK,EACvDtB,EAAU,WAAaY,EACvBZ,EAAU,MAAQC,EAClBD,EAAU,kBAAoBuB,EAAU,IAAI,CAAC,eAAgB,OAAO,CAAC,EACrEvB,EAAU,aAAeuB,EAAU,IAAI,CAAC,eAAgB,QAAQ,CAAC,EAC7DvB,EAAU,eAAiB,UAC7B,KAAK,WAAa,KAAK,sBAAsBA,CAAS,EAAI,KAAK,qBAAqBA,CAAS,EAC7F,KAAK,WAAaA,IAGlB,KAAK,WAAa,KAClB,KAAK,oBAAoB,EACzB,KAAK,mBAAqB,SAAU+B,EAAS,CACvCA,IAAY,WACV/B,EAAU,eAAiB,UAC7BQ,EAAM,qBAAqBR,CAAS,EAE7B+B,IAAY,UACjB/B,EAAU,eAAiB,UAC7BQ,EAAM,oBAAoB,CAGhC,GAEF,KAAK,WAAaR,EAClBgC,GAAoB,KAAML,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACrH,EAEAxB,EAAa,UAAU,QAAU,SAAU8B,EAAI,CAC7CA,GAAMA,EAAG,CACX,EAEO9B,CACT,GAAEQ,EAAK,EACAuB,IAAQ/B,IC7Jf,IAAIgC,KAAiC,SAAUC,EAAQ,CACrDC,EAAUF,EAAmBC,CAAM,EACnC,SAASD,GAAoB,CAC3B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAkB,KACxBG,CACT,CACA,OAAAH,EAAkB,UAAU,KAAO,UAAY,CAC7C,KAAK,YAAc,IAAII,GAAWC,GAAY,CAChD,EACAL,EAAkB,UAAU,OAAS,SAAUM,EAAaC,EAASC,EAAK,CACxE,IAAIC,EAAOH,EAAY,QAAQ,EAC3BI,EAAmB,KAAK,YAC5BA,EAAiB,WAAWD,EAAM,CAChC,UAAW,KAAK,cAAcH,CAAW,CAC3C,CAAC,EACD,KAAK,MAAM,IAAII,EAAiB,KAAK,CACvC,EACAV,EAAkB,UAAU,cAAgB,SAAUM,EAAa,CACjE,IAAIK,EAAWL,EAAY,iBACvBM,EAAWD,GAAYA,EAAS,SAAWA,EAAS,QAAQ,EAChE,OAAOL,EAAY,IAAI,OAAQ,EAAI,EAAIM,EAAW,IACpD,EACAZ,EAAkB,UAAU,gBAAkB,SAAUM,EAAaC,EAASC,EAAK,CACjF,IAAIC,EAAOH,EAAY,QAAQ,EAC/B,KAAK,MAAM,MAAM,EACjB,IAAIO,EAAMC,GAAa,EAAE,EAAE,MAAMR,EAAaC,EAASC,CAAG,EACtDK,EAAI,UACNA,EAAI,SAAS,CACX,MAAO,EACP,IAAKJ,EAAK,MAAM,EAChB,MAAOA,EAAK,MAAM,CACpB,EAAGA,CAAI,EAET,KAAK,YAAY,aAAa,CAChC,EACAT,EAAkB,UAAU,sBAAwB,SAAUM,EAAa,CACzE,IAAIK,EAAWL,EAAY,iBACvBK,GAAYA,EAAS,mBACvB,KAAK,MAAM,UAAmBI,IAAMJ,EAAS,iBAAiB,CAAC,EAC/D,KAAK,MAAM,mBAAmB,EAElC,EACAX,EAAkB,UAAU,OAAS,SAAUO,EAASC,EAAK,CAC3D,KAAK,aAAe,KAAK,YAAY,OAAO,EAAI,CAClD,EACAR,EAAkB,KAAO,gBAClBA,CACT,GAAEgB,EAAS,EACJC,IAAQjB,ICpDf,IAAIkB,KAAwC,SAAUC,EAAQ,CAC5DC,EAAUF,EAA0BC,CAAM,EAC1C,SAASD,GAA2B,CAClC,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAyB,KACtCG,EAAM,gBAAkB,GACjBA,CACT,CACA,OAAAH,EAAyB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CAC7E,OAAOC,GAAiB,KAAM,KAAM,CAClC,mBAAoB,EACtB,CAAC,CACH,EACAN,EAAyB,UAAU,cAAgB,SAAUO,EAAWC,EAAMC,EAAW,CACvF,OAAOA,EAAU,MAAMD,EAAK,cAAcD,CAAS,CAAC,CACtD,EACAP,EAAyB,KAAO,uBAChCA,EAAyB,aAAe,CAAC,OAAQ,OAAO,EACxDA,EAAyB,cAAgB,CACvC,iBAAkB,cAElB,EAAG,EACH,gBAAiB,GACjB,WAAY,SACZ,YAAa,EAEb,aAAc,SACd,KAAM,GAEN,aAAc,CACZ,OAAQ,EAER,MAAO,IAEP,UAAW,OAEX,OAAQ,CACV,EACA,oBAAqB,CACnB,YAAa,OACf,EASA,WAAY,EAKd,EACOA,CACT,GAAEU,EAAW,EACNC,IAAQX,ICzDR,SAASY,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAiB,EAC7CD,EAAU,oBAAoBE,GAAwB,EACtDF,EAAU,eAAeG,GAAa,eAAe,CAAC,CACxD,CCGA,IAAIC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,EAAWG,EAAUC,EAAKC,EAAa,CAC9C,IAAIC,EAAQL,EAAO,KAAK,IAAI,GAAK,KACjC,OAAAK,EAAM,IAAIA,EAAM,WAAWH,EAAUC,EAAKC,CAAW,CAAC,EACtDC,EAAM,oBAAoBH,EAAUC,CAAG,EAChCE,CACT,CACA,OAAAN,EAAW,UAAU,WAAa,SAAUG,EAAUC,EAAKC,EAAa,CACtE,OAAO,IAAIE,GAAKJ,EAAUC,EAAKC,CAAW,CAC5C,EACAL,EAAW,UAAU,oBAAsB,SAAUG,EAAUC,EAAK,CAClE,IAAII,EAAYL,EAAS,aAAaC,CAAG,EACrCK,EAAcD,EAAU,SAAS,QAAQ,EACzCE,EAAOD,EAAY,IAAI,YAAY,EACnCE,EAAaF,EAAY,IAAI,QAAQ,EAC7BG,EAAQF,CAAI,IACtBA,EAAO,CAACA,EAAMA,CAAI,GAEpB,IAAIG,EAAYV,EAAS,cAAcC,EAAK,OAAO,EAC/CU,EAAQL,EAAY,IAAI,OAAO,GAAKI,GAAaA,EAAU,OAC3DE,EAAS,KAAK,QAAQ,CAAC,EACvB,KAAK,cAAgBJ,IAEvB,KAAK,OAAOI,CAAM,EAClBA,EAASC,GAAaL,EAAY,IAAM,IAAM,EAAG,EAAGG,CAAK,EACzDC,EAAO,GAAK,IACZA,EAAO,QAAU,GACjB,KAAK,IAAIA,CAAM,GAGZA,IAILA,EAAO,SAAS,cAAeD,CAAK,EACpCC,EAAO,SAASN,EAAY,aAAa,CAAC,OAAO,CAAC,CAAC,EACnDM,EAAO,OAASL,EAAK,CAAC,EACtBK,EAAO,OAASL,EAAK,CAAC,EACtBK,EAAO,SAASD,CAAK,EACrB,KAAK,YAAcH,EACnB,KAAK,aAAeD,EACpB,KAAK,uBAAuBP,EAAUM,EAAaL,CAAG,EACxD,EACAJ,EAAW,UAAU,uBAAyB,SAAUG,EAAUM,EAAaL,EAAK,CAClF,IAAIW,EAAS,KAAK,QAAQ,CAAC,EAC3B,GAAKA,EAGL,KAAIE,EAASd,EAAS,cAAcC,CAAG,EACnCc,EAAST,EAAY,IAAI,QAAQ,EAAI,IACrCU,EAAOV,EAAY,IAAI,MAAM,EAC7BW,EAAYX,EAAY,IAAI,WAAW,EACvCY,EAAgBZ,EAAY,IAAI,eAAe,EAC/Ca,EAAmBC,GAASd,EAAY,IAAI,OAAO,EAAG,SAAUL,EAAK,CACvE,OAAOA,EAAMD,EAAS,MAAM,EAAIe,EAAS,CAC3C,CAAC,EAOD,GALAH,EAAO,OAAS,GAChB,KAAK,uBAAuBA,EAAQE,CAAM,EACtCI,EAAgB,IAClBH,EAAS,KAAK,eAAeH,CAAM,EAAIM,EAAgB,KAErDH,IAAW,KAAK,SAAWC,IAAS,KAAK,OAASC,IAAc,KAAK,WAAY,CACnFL,EAAO,cAAc,EACrB,IAAIS,EAAW,OACJC,GAAWH,CAAS,EAC7BE,EAAWF,EAAUlB,CAAG,EAExBoB,EAAWF,EAETP,EAAO,IAAM,IACfS,EAAW,CAACN,EAASH,EAAO,KAE9B,KAAK,eAAeA,EAAQG,EAAQM,EAAUL,EAAMC,CAAS,CAC/D,CACA,KAAK,QAAUF,EACf,KAAK,MAAQC,EACb,KAAK,WAAaC,EACpB,EACApB,EAAW,UAAU,eAAiB,SAAUe,EAAQG,EAAQM,EAAUL,EAAMC,EAAW,CACzF,GAAIF,EAAS,EAAG,CACdH,EAAO,IAAM,EACb,IAAIW,EAAS,KACTC,EAAWZ,EAAO,QAAQ,GAAII,CAAI,EAAE,KAAKC,EAAYF,EAAS,EAAIA,EAAQ,CAC5E,IAAKE,EAAY,EAAI,CACvB,CAAC,EAAE,MAAMI,CAAQ,EAAE,OAAO,UAAY,CACpCE,EAAO,sBAAsBX,CAAM,CACrC,CAAC,EACII,GACHQ,EAAS,KAAK,UAAY,CACxBD,EAAO,OAAOX,CAAM,CACtB,CAAC,EAEHY,EAAS,MAAM,CACjB,CACF,EACA3B,EAAW,UAAU,eAAiB,SAAUe,EAAQ,CAEtD,OAAYa,GAAKb,EAAO,KAAMA,EAAO,KAAK,EAASa,GAAKb,EAAO,MAAOA,EAAO,IAAI,CACnF,EACAf,EAAW,UAAU,uBAAyB,SAAUe,EAAQE,EAAQ,CACtEF,EAAO,KAAOE,EAAO,CAAC,EACtBF,EAAO,KAAOE,EAAO,CAAC,EACtBF,EAAO,MAAQE,EAAO,CAAC,GAAK,EAAEA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,GAAIA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,CAAC,CACnG,EACAjB,EAAW,UAAU,WAAa,SAAUG,EAAUC,EAAKC,EAAa,CACtE,KAAK,QAAQ,CAAC,EAAE,WAAWF,EAAUC,EAAKC,CAAW,EACrD,KAAK,oBAAoBF,EAAUC,CAAG,CACxC,EACAJ,EAAW,UAAU,sBAAwB,SAAUe,EAAQ,CAC7D,IAAIc,EAAKd,EAAO,KACZe,EAAKf,EAAO,KACZgB,EAAMhB,EAAO,MACbiB,EAAIjB,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAC7CkB,EAAM,CAAClB,EAAO,EAAGA,EAAO,CAAC,EACzBmB,EAAUD,EAAI,MAAM,EACpBE,EAAwBA,GACxBC,EAAkCA,GACtCH,EAAI,CAAC,EAAIE,EAAYN,EAAG,CAAC,EAAGE,EAAI,CAAC,EAAGD,EAAG,CAAC,EAAGE,CAAC,EAC5CC,EAAI,CAAC,EAAIE,EAAYN,EAAG,CAAC,EAAGE,EAAI,CAAC,EAAGD,EAAG,CAAC,EAAGE,CAAC,EAE5C,IAAIK,EAAKtB,EAAO,IAAM,EAAIqB,EAAsBP,EAAG,CAAC,EAAGE,EAAI,CAAC,EAAGD,EAAG,CAAC,EAAGE,CAAC,EAAII,EAAsBN,EAAG,CAAC,EAAGC,EAAI,CAAC,EAAGF,EAAG,CAAC,EAAG,EAAIG,CAAC,EACxHM,EAAKvB,EAAO,IAAM,EAAIqB,EAAsBP,EAAG,CAAC,EAAGE,EAAI,CAAC,EAAGD,EAAG,CAAC,EAAGE,CAAC,EAAII,EAAsBN,EAAG,CAAC,EAAGC,EAAI,CAAC,EAAGF,EAAG,CAAC,EAAG,EAAIG,CAAC,EAC5HjB,EAAO,SAAW,CAAC,KAAK,MAAMuB,EAAID,CAAE,EAAI,KAAK,GAAK,GAE9C,KAAK,cAAgB,QAAU,KAAK,cAAgB,QAAU,KAAK,cAAgB,eACjFtB,EAAO,UAAY,QAAaA,EAAO,QAAUA,EAAO,KAC1DA,EAAO,OAAca,GAAKM,EAASD,CAAG,EAAI,KAEtCD,IAAM,IACRC,EAAI,CAAC,EAAIC,EAAQ,CAAC,GAAKD,EAAI,CAAC,EAAIC,EAAQ,CAAC,GAAK,EAC9CD,EAAI,CAAC,EAAIC,EAAQ,CAAC,GAAKD,EAAI,CAAC,EAAIC,EAAQ,CAAC,GAAK,IAEvCnB,EAAO,UAAY,EAE5BA,EAAO,OAAS,EAASa,GAAKC,EAAII,CAAG,EAErClB,EAAO,OAAS,KAAK,aAAa,CAAC,GAGvCA,EAAO,QAAUA,EAAO,IACxBA,EAAO,OAAS,GAChBA,EAAO,EAAIkB,EAAI,CAAC,EAChBlB,EAAO,EAAIkB,EAAI,CAAC,CAClB,EACAjC,EAAW,UAAU,aAAe,SAAUG,EAAUC,EAAK,CAC3D,KAAK,QAAQ,CAAC,EAAE,aAAaD,EAAUC,CAAG,EAC1C,IAAIK,EAAcN,EAAS,aAAaC,CAAG,EAAE,SAAS,QAAQ,EAC9D,KAAK,uBAAuBD,EAAUM,EAAaL,CAAG,CACxD,EACOJ,CACT,GAAUuC,EAAK,EACRC,GAAQxC,IChKf,IAAIyC,KAAwB,SAAUC,EAAQ,CAC5CC,EAAUF,EAAUC,CAAM,EAC1B,SAASD,EAASG,EAAUC,EAAKC,EAAa,CAC5C,IAAIC,EAAQL,EAAO,KAAK,IAAI,GAAK,KACjC,OAAAK,EAAM,gBAAgBH,EAAUC,EAAKC,CAAW,EACzCC,CACT,CACA,OAAAN,EAAS,UAAU,gBAAkB,SAAUG,EAAUC,EAAKC,EAAa,CAEzE,IAAIE,EAASJ,EAAS,cAAcC,CAAG,EACnCI,EAAO,IAAYC,GAAS,CAC9B,MAAO,CACL,OAAQF,CACV,CACF,CAAC,EACD,KAAK,IAAIC,CAAI,EACb,KAAK,iBAAiBL,EAAUC,EAAKC,CAAW,CAClD,EAEAL,EAAS,UAAU,WAAa,SAAUG,EAAUC,EAAKC,EAAa,CACpE,IAAIK,EAAcP,EAAS,UACvBK,EAAO,KAAK,QAAQ,CAAC,EACrBG,EAAS,CACX,MAAO,CACL,OAAQR,EAAS,cAAcC,CAAG,CACpC,CACF,EACQQ,GAAYJ,EAAMG,EAAQD,EAAaN,CAAG,EAClD,KAAK,iBAAiBD,EAAUC,EAAKC,CAAW,CAClD,EAEAL,EAAS,UAAU,iBAAmB,SAAUG,EAAUC,EAAKC,EAAa,CAC1E,IAAIG,EAAO,KAAK,QAAQ,CAAC,EACrBK,EAAYV,EAAS,aAAaC,CAAG,EACrCU,EAAoBT,GAAeA,EAAY,kBAC/CU,EAAQV,GAAeA,EAAY,MACnCW,EAAYX,GAAeA,EAAY,UACvCY,EAAmBZ,GAAeA,EAAY,iBAClD,GAAI,CAACA,GAAeF,EAAS,cAAe,CAC1C,IAAIe,EAAgBL,EAAU,SAAS,UAAU,EACjDC,EAAoBI,EAAc,SAAS,WAAW,EAAE,aAAa,EACrED,EAAmBC,EAAc,IAAI,UAAU,EAC/CH,EAAQG,EAAc,IAAI,OAAO,EACjCF,EAAYE,EAAc,IAAI,WAAW,CAC3C,CACAV,EAAK,SAASL,EAAS,cAAcC,EAAK,OAAO,CAAC,EAClDI,EAAK,MAAM,KAAO,KAClBA,EAAK,MAAM,cAAgB,GAC3B,IAAIW,EAAoBX,EAAK,YAAY,UAAU,EACnDW,EAAkB,MAAQL,EAC1BM,GAAoB,KAAML,EAAOC,EAAWC,CAAgB,CAC9D,EAEAjB,EAAS,UAAU,aAAe,SAAUG,EAAUC,EAAK,CACzD,IAAIiB,EAAW,KAAK,QAAQ,CAAC,EAC7BA,EAAS,SAAS,SAAUlB,EAAS,cAAcC,CAAG,CAAC,CACzD,EAEOJ,CACT,GAAUsB,EAAK,EACRb,GAAQT,IC3Df,IAAIuB,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,WAAa,EACnBA,EAAM,kBAAoB,EACnBA,CACT,CAEA,OAAAH,EAAe,UAAU,WAAa,SAAUI,EAAUC,EAAKC,EAAa,CAC1E,OAAO,IAAIC,GAASH,EAAUC,EAAKC,CAAW,CAChD,EAGAN,EAAe,UAAU,uBAAyB,SAAUQ,EAAQC,EAAQ,CAC1E,KAAK,QAAUA,EAGf,QAFIC,EAAY,CAAC,CAAC,EACdC,EAAM,EACDC,EAAI,EAAGA,EAAIH,EAAO,OAAQG,IAAK,CACtC,IAAIC,EAAKJ,EAAOG,EAAI,CAAC,EACjBE,EAAKL,EAAOG,CAAC,EACjBD,GAAYI,GAAKF,EAAIC,CAAE,EACvBJ,EAAU,KAAKC,CAAG,CACpB,CACA,GAAIA,IAAQ,EAAG,CACb,KAAK,QAAU,EACf,MACF,CACA,QAASC,EAAI,EAAGA,EAAIF,EAAU,OAAQE,IACpCF,EAAUE,CAAC,GAAKD,EAElB,KAAK,SAAWD,EAChB,KAAK,QAAUC,CACjB,EAGAX,EAAe,UAAU,eAAiB,UAAY,CACpD,OAAO,KAAK,OACd,EAGAA,EAAe,UAAU,sBAAwB,SAAUQ,EAAQ,CACjE,IAAIQ,EAAIR,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,IAC7CC,EAAS,KAAK,QACdQ,EAAU,KAAK,SACfN,EAAMF,EAAO,OACjB,GAAKQ,EAIL,KAAIC,EAAY,KAAK,WACjBC,EACJ,GAAIH,EAAI,KAAK,kBAAmB,CAG9B,IAAII,EAAQ,KAAK,IAAIF,EAAY,EAAGP,EAAM,CAAC,EAC3C,IAAKQ,EAAQC,EAAOD,GAAS,GACvB,EAAAF,EAAQE,CAAK,GAAKH,GADQG,IAC9B,CAKFA,EAAQ,KAAK,IAAIA,EAAOR,EAAM,CAAC,CACjC,KAAO,CACL,IAAKQ,EAAQD,EAAWC,EAAQR,GAC1B,EAAAM,EAAQE,CAAK,EAAIH,GADcG,IACnC,CAIFA,EAAQ,KAAK,IAAIA,EAAQ,EAAGR,EAAM,CAAC,CACrC,CACA,IAAIU,GAAKL,EAAIC,EAAQE,CAAK,IAAMF,EAAQE,EAAQ,CAAC,EAAIF,EAAQE,CAAK,GAC9DG,EAAKb,EAAOU,CAAK,EACjBN,EAAKJ,EAAOU,EAAQ,CAAC,EACzBX,EAAO,EAAIc,EAAG,CAAC,GAAK,EAAID,GAAKA,EAAIR,EAAG,CAAC,EACrCL,EAAO,EAAIc,EAAG,CAAC,GAAK,EAAID,GAAKA,EAAIR,EAAG,CAAC,EACrC,IAAIU,EAAKf,EAAO,IAAM,EAAIK,EAAG,CAAC,EAAIS,EAAG,CAAC,EAAIA,EAAG,CAAC,EAAIT,EAAG,CAAC,EAClDW,EAAKhB,EAAO,IAAM,EAAIK,EAAG,CAAC,EAAIS,EAAG,CAAC,EAAIA,EAAG,CAAC,EAAIT,EAAG,CAAC,EACtDL,EAAO,SAAW,CAAC,KAAK,MAAMgB,EAAID,CAAE,EAAI,KAAK,GAAK,EAClD,KAAK,WAAaJ,EAClB,KAAK,kBAAoBH,EACzBR,EAAO,OAAS,GAClB,EAEOR,CACT,GAAEyB,EAAU,EACLC,IAAQ1B,ICnFf,IAAI2B,KAAmC,UAAY,CACjD,SAASA,GAAsB,CAC7B,KAAK,SAAW,GAChB,KAAK,UAAY,EACjB,KAAK,KAAO,CAAC,CACf,CACA,OAAOA,CACT,GAAE,EACEC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,EAAeG,EAAM,CAC5B,IAAIC,EAAQH,EAAO,KAAK,KAAME,CAAI,GAAK,KACvC,OAAAC,EAAM,KAAO,EACbA,EAAM,aAAe,GACdA,CACT,CACA,OAAAJ,EAAe,UAAU,MAAQ,UAAY,CAC3C,KAAK,SAAW,GAChB,KAAK,KAAO,CACd,EACAA,EAAe,UAAU,gBAAkB,UAAY,CACrD,MAAO,CACL,OAAQK,EAAO,MAAM,UACrB,KAAM,IACR,CACF,EACAL,EAAe,UAAU,gBAAkB,UAAY,CACrD,OAAO,IAAID,GACb,EACAC,EAAe,UAAU,UAAY,SAAUM,EAAKC,EAAO,CACzD,IAAIC,EAAOD,EAAM,KACbE,EAAYF,EAAM,UAClBG,EACJ,GAAIH,EAAM,SACR,IAAKG,EAAI,KAAK,KAAMA,EAAIF,EAAK,QAAS,CACpC,IAAIG,EAAQH,EAAKE,GAAG,EACpB,GAAIC,EAAQ,EAAG,CACbL,EAAI,OAAOE,EAAKE,GAAG,EAAGF,EAAKE,GAAG,CAAC,EAC/B,QAASE,EAAI,EAAGA,EAAID,EAAOC,IACzBN,EAAI,OAAOE,EAAKE,GAAG,EAAGF,EAAKE,GAAG,CAAC,CAEnC,CACF,KAEA,KAAKA,EAAI,KAAK,KAAMA,EAAIF,EAAK,QAAS,CACpC,IAAIK,EAAKL,EAAKE,GAAG,EACbI,EAAKN,EAAKE,GAAG,EACbK,EAAKP,EAAKE,GAAG,EACbM,EAAKR,EAAKE,GAAG,EAEjB,GADAJ,EAAI,OAAOO,EAAIC,CAAE,EACbL,EAAY,EAAG,CACjB,IAAIQ,GAAMJ,EAAKE,GAAM,GAAKD,EAAKE,GAAMP,EACjCS,GAAMJ,EAAKE,GAAM,GAAKD,EAAKF,GAAMJ,EACrCH,EAAI,iBAAiBW,EAAIC,EAAIH,EAAIC,CAAE,CACrC,MACEV,EAAI,OAAOS,EAAIC,CAAE,CAErB,CAEE,KAAK,cACP,KAAK,KAAON,EACZ,KAAK,SAAW,GAEpB,EACAV,EAAe,UAAU,cAAgB,SAAUmB,EAAGC,EAAG,CACvD,IAAIb,EAAQ,KAAK,MACbC,EAAOD,EAAM,KACbE,EAAYF,EAAM,UAClBc,EAAY,KAAK,MAAM,UAC3B,GAAId,EAAM,SAER,QADIe,EAAY,EACPZ,EAAI,EAAGA,EAAIF,EAAK,QAAS,CAChC,IAAIG,EAAQH,EAAKE,GAAG,EACpB,GAAIC,EAAQ,EAGV,QAFIE,EAAKL,EAAKE,GAAG,EACbI,EAAKN,EAAKE,GAAG,EACRE,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC9B,IAAIG,EAAKP,EAAKE,GAAG,EACbM,EAAKR,EAAKE,GAAG,EACjB,GAAgBa,GAAcV,EAAIC,EAAIC,EAAIC,EAAIK,EAAWF,EAAGC,CAAC,EAC3D,OAAOE,CAEX,CAEFA,GACF,KAGA,SADIA,EAAY,EACPZ,EAAI,EAAGA,EAAIF,EAAK,QAAS,CAChC,IAAIK,EAAKL,EAAKE,GAAG,EACbI,EAAKN,EAAKE,GAAG,EACbK,EAAKP,EAAKE,GAAG,EACbM,EAAKR,EAAKE,GAAG,EACjB,GAAID,EAAY,EAAG,CACjB,IAAIQ,GAAMJ,EAAKE,GAAM,GAAKD,EAAKE,GAAMP,EACjCS,GAAMJ,EAAKE,GAAM,GAAKD,EAAKF,GAAMJ,EACrC,GAAqBc,GAAcV,EAAIC,EAAIG,EAAIC,EAAIH,EAAIC,EAAIK,EAAWF,EAAGC,CAAC,EACxE,OAAOE,CAEX,SACkBC,GAAcV,EAAIC,EAAIC,EAAIC,EAAIK,EAAWF,EAAGC,CAAC,EAC3D,OAAOE,EAGXA,GACF,CAEF,MAAO,EACT,EACAtB,EAAe,UAAU,QAAU,SAAUmB,EAAGC,EAAG,CACjD,IAAII,EAAW,KAAK,sBAAsBL,EAAGC,CAAC,EAC1CK,EAAO,KAAK,gBAAgB,EAGhC,GAFAN,EAAIK,EAAS,CAAC,EACdJ,EAAII,EAAS,CAAC,EACVC,EAAK,QAAQN,EAAGC,CAAC,EAAG,CAEtB,IAAIM,EAAU,KAAK,aAAe,KAAK,cAAcP,EAAGC,CAAC,EACzD,OAAOM,GAAW,CACpB,CACA,YAAK,aAAe,GACb,EACT,EACA1B,EAAe,UAAU,gBAAkB,UAAY,CAErD,IAAIyB,EAAO,KAAK,MAChB,GAAI,CAACA,EAAM,CAOT,QANIlB,EAAQ,KAAK,MACboB,EAASpB,EAAM,KACfqB,EAAO,IACPC,EAAO,IACPC,EAAO,KACPC,EAAO,KACFrB,EAAI,EAAGA,EAAIiB,EAAO,QAAS,CAClC,IAAIR,EAAIQ,EAAOjB,GAAG,EACdU,EAAIO,EAAOjB,GAAG,EAClBkB,EAAO,KAAK,IAAIT,EAAGS,CAAI,EACvBE,EAAO,KAAK,IAAIX,EAAGW,CAAI,EACvBD,EAAO,KAAK,IAAIT,EAAGS,CAAI,EACvBE,EAAO,KAAK,IAAIX,EAAGW,CAAI,CACzB,CACAN,EAAO,KAAK,MAAQ,IAAYO,GAAaJ,EAAMC,EAAMC,EAAMC,CAAI,CACrE,CACA,OAAON,CACT,EACOzB,CACT,GAAUiC,EAAI,EACVC,KAA6B,UAAY,CAC3C,SAASA,GAAgB,CACvB,KAAK,MAAQ,IAAYC,EAC3B,CAIA,OAAAD,EAAc,UAAU,WAAa,SAAUE,EAAM,CACnD,KAAK,OAAO,EACZ,IAAIC,EAAS,KAAK,QAAQ,EAC1BA,EAAO,SAAS,CACd,KAAMD,EAAK,UAAU,aAAa,CACpC,CAAC,EACD,KAAK,WAAWC,EAAQD,CAAI,CAC9B,EAKAF,EAAc,UAAU,yBAA2B,SAAUE,EAAM,CACjE,KAAK,MAAM,UAAU,EACrB,KAAK,OAAO,CACd,EAKAF,EAAc,UAAU,kBAAoB,SAAUI,EAAYF,EAAM,CACtE,IAAIG,EAAY,KAAK,UAAU,CAAC,EAC5BC,EAAaJ,EAAK,UAAU,aAAa,EACzCK,EAAUF,GAAaA,EAAU,MAAM,KAG3C,GAAIE,GAAWA,EAAQ,OAAS,IAAK,CACnC,IAAIC,EAASD,EAAQ,OACjBE,EAAU,IAAI,aAAaD,EAASF,EAAW,MAAM,EAEzDG,EAAQ,IAAIF,CAAO,EACnBE,EAAQ,IAAIH,EAAYE,CAAM,EAC9BH,EAAU,SAAS,CACjB,KAAMI,CACR,CAAC,CACH,KAAO,CAEL,KAAK,UAAY,CAAC,EAClB,IAAIN,EAAS,KAAK,QAAQ,EAC1BA,EAAO,YAAc,GACrBA,EAAO,SAAS,CACd,KAAMG,CACR,CAAC,EACD,KAAK,WAAWH,EAAQD,CAAI,EAC5BC,EAAO,aAAeC,EAAW,KACnC,CACF,EAIAJ,EAAc,UAAU,OAAS,UAAY,CAC3C,KAAK,OAAO,CACd,EACAA,EAAc,UAAU,aAAe,SAAUU,EAAI,CACnD,KAAK,UAAU,CAAC,GAAKA,EAAG,KAAK,UAAU,CAAC,CAAC,CAC3C,EACAV,EAAc,UAAU,QAAU,UAAY,CAC5C,IAAIG,EAAS,IAAIrC,IAAe,CAC9B,OAAQ,UACR,oBAAqB,EACvB,CAAC,EACD,YAAK,UAAU,KAAKqC,CAAM,EAC1B,KAAK,MAAM,IAAIA,CAAM,EACdA,CACT,EACAH,EAAc,UAAU,WAAa,SAAUG,EAAQD,EAAMS,EAAe,CAC1E,IAAIC,EAAYV,EAAK,UACrBC,EAAO,SAAS,CACd,SAAUS,EAAU,IAAI,UAAU,EAClC,UAAWA,EAAU,IAAI,CAAC,YAAa,WAAW,CAAC,CACrD,CAAC,EACDT,EAAO,SAASS,EAAU,SAAS,WAAW,EAAE,aAAa,CAAC,EAC9DT,EAAO,MAAM,cAAgB,GAC7B,IAAIU,EAAQX,EAAK,UAAU,OAAO,EAC9BW,GAASA,EAAM,QACjBV,EAAO,SAAS,SAAUU,EAAM,MAAM,EAExCV,EAAO,SAAS,OAAQ,IAAI,EAC5B,IAAIW,EAASC,GAAUZ,CAAM,EAG7BW,EAAO,YAAcF,EAAU,YAC/BT,EAAO,GAAG,YAAa,SAAUa,EAAG,CAClCF,EAAO,UAAY,KACnB,IAAI1B,EAAYe,EAAO,aACnBf,EAAY,IAEd0B,EAAO,UAAY1B,EAAYe,EAAO,aAE1C,CAAC,CACH,EAEAH,EAAc,UAAU,OAAS,UAAY,CAC3C,KAAK,UAAY,CAAC,EAClB,KAAK,MAAM,UAAU,CACvB,EAEOA,CACT,GAAE,EACKiB,IAAQjB,IChQf,IAAIkB,IAAc,CAChB,WAAY,QACZ,KAAMC,GAAoB,EAC1B,MAAO,SAAUC,EAAa,CAC5B,IAAIC,EAAWD,EAAY,iBAC3B,GAAKC,EAML,KAAIC,EAAaF,EAAY,IAAI,UAAU,EACvCG,EAAUH,EAAY,gBAAgB,MAC1C,MAAO,CACL,SAAU,SAAUI,EAAQC,EAAU,CACpC,IAAIC,EAAa,CAAC,EAClB,GAAIH,EAAS,CACX,IAAII,EAAS,OACTC,EAAWJ,EAAO,IAAMA,EAAO,MACnC,GAAIF,EAAY,CAEd,QADIO,EAAmB,EACdC,EAAIN,EAAO,MAAOM,EAAIN,EAAO,IAAKM,IACzCD,GAAoBT,EAAY,mBAAmBU,CAAC,EAEtDH,EAAS,IAAI,aAAaC,EAAWC,EAAmB,CAAC,CAC3D,MACEF,EAAS,IAAI,aAAaC,EAAW,CAAC,EAIxC,QAFIG,EAAS,EACTC,EAAK,CAAC,EACDF,EAAIN,EAAO,MAAOM,EAAIN,EAAO,IAAKM,IAAK,CAC9C,IAAIG,EAAMb,EAAY,cAAcU,EAAGJ,CAAU,EAC7CJ,IACFK,EAAOI,GAAQ,EAAIE,GAErB,QAASC,EAAI,EAAGA,EAAID,EAAKC,IACvBF,EAAKX,EAAS,YAAYK,EAAWQ,CAAC,EAAG,GAAOF,CAAE,EAClDL,EAAOI,GAAQ,EAAIC,EAAG,CAAC,EACvBL,EAAOI,GAAQ,EAAIC,EAAG,CAAC,CAE3B,CACAP,EAAS,UAAU,cAAeE,CAAM,CAC1C,KACE,SAASG,EAAIN,EAAO,MAAOM,EAAIN,EAAO,IAAKM,IAAK,CAC9C,IAAIK,EAAYV,EAAS,aAAaK,CAAC,EACnCG,EAAMb,EAAY,cAAcU,EAAGJ,CAAU,EAC7CU,EAAM,CAAC,EACX,GAAId,EACF,QAASe,EAAI,EAAGA,EAAIJ,EAAKI,IACvBD,EAAI,KAAKf,EAAS,YAAYK,EAAWW,CAAC,CAAC,CAAC,MAEzC,CACLD,EAAI,CAAC,EAAIf,EAAS,YAAYK,EAAW,CAAC,CAAC,EAC3CU,EAAI,CAAC,EAAIf,EAAS,YAAYK,EAAW,CAAC,CAAC,EAC3C,IAAIY,EAAYH,EAAU,IAAI,CAAC,YAAa,WAAW,CAAC,EACpD,CAACG,IACHF,EAAI,CAAC,EAAI,EAAEA,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,GAAK,GAAKA,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,GAAKE,GAAYF,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,GAAK,GAAKA,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,GAAKE,CAAS,EAElJ,CACAb,EAAS,cAAcK,EAAGM,CAAG,CAC/B,CAEJ,CACF,EACF,CACF,EACOG,GAAQrB,IC3Df,IAAIsB,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAChBG,CACT,CACA,OAAAH,EAAU,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CAChE,IAAIC,EAAOH,EAAY,QAAQ,EAC3BI,EAAW,KAAK,gBAAgBD,EAAMH,CAAW,EACjDK,EAASL,EAAY,IAAI,QAAQ,EACjCM,EAAcN,EAAY,IAAI,CAAC,SAAU,aAAa,CAAC,EACvDO,EAAKL,EAAI,MAAM,EAIfM,EAAQD,EAAG,QAAQ,QAAQ,IAAM,MAChCC,GACHD,EAAG,QAAQ,SAASF,CAAM,EAAE,MAAM,EAAI,EAGpC,KAAK,aAAe,MAAQ,CAACG,GAC/BD,EAAG,YAAY,KAAK,YAAa,CAC/B,WAAY,EACd,CAAC,EAEC,KAAK,YAAYP,CAAW,GAAKM,EAAc,IAC5CE,GACHD,EAAG,YAAYF,EAAQ,CACrB,WAAY,GACZ,eAAgB,KAAK,IAAI,KAAK,IAAIC,EAAc,GAAK,GAAK,CAAC,EAAG,CAAC,CACjE,CAAC,GAKLF,EAAS,WAAWD,CAAI,EACxB,IAAIM,EAAWT,EAAY,IAAI,OAAQ,EAAI,GAAKU,GAAeV,EAAY,iBAAkB,GAAOA,CAAW,EAC3GS,EACF,KAAK,MAAM,YAAYA,CAAQ,EAE/B,KAAK,MAAM,eAAe,EAE5B,KAAK,YAAcJ,EACnB,KAAK,UAAY,EACnB,EACAT,EAAU,UAAU,yBAA2B,SAAUI,EAAaC,EAASC,EAAK,CAClF,IAAIC,EAAOH,EAAY,QAAQ,EAC3BI,EAAW,KAAK,gBAAgBD,EAAMH,CAAW,EACrDI,EAAS,yBAAyBD,CAAI,EACtC,KAAK,YAAYD,CAAG,EACpB,KAAK,UAAY,EACnB,EACAN,EAAU,UAAU,kBAAoB,SAAUe,EAAYX,EAAaC,EAAS,CAClF,KAAK,UAAU,kBAAkBU,EAAYX,EAAY,QAAQ,CAAC,EAClE,KAAK,UAAYW,EAAW,MAAQX,EAAY,QAAQ,EAAE,MAAM,CAClE,EACAJ,EAAU,UAAU,aAAe,SAAUgB,EAAI,CAC/C,KAAK,WAAa,KAAK,UAAU,aAAaA,CAAE,CAClD,EACAhB,EAAU,UAAU,gBAAkB,SAAUI,EAAaC,EAASC,EAAK,CACzE,IAAIC,EAAOH,EAAY,QAAQ,EAC3Ba,EAAkBb,EAAY,gBAClC,GAAI,CAAC,KAAK,WAAaa,EAAgB,OAASA,EAAgB,kBAE9D,MAAO,CACL,OAAQ,EACV,EAIA,IAAIC,EAAMC,GAAY,MAAMf,EAAaC,EAASC,CAAG,EACjDY,EAAI,UACNA,EAAI,SAAS,CACX,MAAO,EACP,IAAKX,EAAK,MAAM,EAChB,MAAOA,EAAK,MAAM,CACpB,EAAGA,CAAI,EAGT,KAAK,UAAU,aAAa,EAC5B,KAAK,YAAYD,CAAG,CAExB,EACAN,EAAU,UAAU,gBAAkB,SAAUO,EAAMH,EAAa,CACjE,IAAII,EAAW,KAAK,UAChBY,EAAY,KAAK,YAAYhB,CAAW,EACxCiB,EAAa,CAAC,CAACjB,EAAY,IAAI,UAAU,EACzCa,EAAkBb,EAAY,gBAC9BkB,EAAcL,EAAgB,MAMlC,OAAI,CAACT,GAAYY,IAAc,KAAK,WAAaC,IAAe,KAAK,aAAeC,IAAgB,KAAK,gBACnGd,GACFA,EAAS,OAAO,EAElBA,EAAW,KAAK,UAAYc,EAAc,IAAIC,IAAkB,IAAIC,GAASH,EAAaD,EAAYK,IAAiBC,GAAWN,EAAYO,GAAaC,EAAI,EAC/J,KAAK,UAAYR,EACjB,KAAK,YAAcC,EACnB,KAAK,aAAeC,GAEtB,KAAK,MAAM,IAAId,EAAS,KAAK,EACtBA,CACT,EACAR,EAAU,UAAU,YAAc,SAAUI,EAAa,CACvD,MAAO,CAAC,CAACA,EAAY,IAAI,CAAC,SAAU,MAAM,CAAC,CAC7C,EACAJ,EAAU,UAAU,YAAc,SAAUM,EAAK,CAE/C,IAAIK,EAAKL,EAAI,MAAM,EACfM,EAAQD,EAAG,QAAQ,QAAQ,IAAM,MACjC,CAACC,GAAS,KAAK,aAAe,MAChCD,EAAG,QAAQ,SAAS,KAAK,WAAW,EAAE,MAAM,EAAI,CAEpD,EACAX,EAAU,UAAU,OAAS,SAAUK,EAASC,EAAK,CACnD,KAAK,WAAa,KAAK,UAAU,OAAO,EACxC,KAAK,UAAY,KAEjB,KAAK,YAAYA,CAAG,CACtB,EACAN,EAAU,UAAU,QAAU,SAAUK,EAASC,EAAK,CACpD,KAAK,OAAOD,EAASC,CAAG,CAC1B,EACAN,EAAU,KAAO,QACVA,CACT,GAAE6B,EAAS,EACJC,IAAQ9B,ICrIf,IAAI+B,IAAY,OAAO,YAAgB,IAAc,MAAQ,YACzDC,IAAa,OAAO,aAAiB,IAAc,MAAQ,aAC/D,SAASC,IAAUC,EAAW,CAC5B,IAAIC,EAAOD,EAAU,KACjBC,GAAQA,EAAK,CAAC,GAAKA,EAAK,CAAC,EAAE,CAAC,GAAKA,EAAK,CAAC,EAAE,CAAC,EAAE,QAI9CD,EAAU,KAAOE,EAAID,EAAM,SAAUE,EAAS,CAC5C,IAAIC,EAAS,CAACD,EAAQ,CAAC,EAAE,MAAOA,EAAQ,CAAC,EAAE,KAAK,EAC5CE,EAAS,CACX,OAAQD,CACV,EACA,OAAID,EAAQ,CAAC,EAAE,OACbE,EAAO,SAAWF,EAAQ,CAAC,EAAE,MAE3BA,EAAQ,CAAC,EAAE,OACbE,EAAO,OAASF,EAAQ,CAAC,EAAE,MAEtBG,GAAS,CAACD,EAAQF,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,CAAC,CAClD,CAAC,EAEL,CACA,IAAII,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KAC9BG,EAAM,sBAAwB,YAC9BA,EAAM,eAAiB,SAChBA,CACT,CACA,OAAAH,EAAiB,UAAU,KAAO,SAAUI,EAAQ,CAElDA,EAAO,KAAOA,EAAO,MAAQ,CAAC,EAE9BZ,IAAUY,CAAM,EAChB,IAAIC,EAAS,KAAK,wBAAwBD,EAAO,IAAI,EACrD,KAAK,YAAcC,EAAO,WAC1B,KAAK,kBAAoBA,EAAO,iBAC5BA,EAAO,aACTD,EAAO,KAAO,IAAI,aAAaC,EAAO,KAAK,GAE7CJ,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,CAC7C,EACAD,EAAiB,UAAU,YAAc,SAAUI,EAAQ,CAEzD,GADAZ,IAAUY,CAAM,EACZA,EAAO,KAAM,CAEf,IAAIC,EAAS,KAAK,wBAAwBD,EAAO,IAAI,EACrD,KAAK,YAAcC,EAAO,WAC1B,KAAK,kBAAoBA,EAAO,iBAC5BA,EAAO,aACTD,EAAO,KAAO,IAAI,aAAaC,EAAO,KAAK,EAE/C,CACAJ,EAAO,UAAU,YAAY,MAAM,KAAM,SAAS,CACpD,EACAD,EAAiB,UAAU,WAAa,SAAUM,EAAQ,CACxD,IAAID,EAAS,KAAK,wBAAwBC,EAAO,IAAI,EACjDD,EAAO,aACJ,KAAK,aAIR,KAAK,YAAcE,GAAY,KAAK,YAAaF,EAAO,UAAU,EAClE,KAAK,kBAAoBE,GAAY,KAAK,kBAAmBF,EAAO,gBAAgB,IAJpF,KAAK,YAAcA,EAAO,WAC1B,KAAK,kBAAoBA,EAAO,kBAKlCC,EAAO,KAAO,IAAI,aAAaD,EAAO,KAAK,GAE7C,KAAK,WAAW,EAAE,WAAWC,EAAO,IAAI,CAC1C,EACAN,EAAiB,UAAU,wBAA0B,SAAUQ,EAAK,CAClE,IAAIC,EAAY,KAAK,QAAQ,EAAE,aAAaD,CAAG,EAC3CX,EAASY,EAAU,kBAAkB,MAAQA,EAAU,OAASA,EAAU,WAAW,QAAQ,EAMjG,OAAOZ,CACT,EACAG,EAAiB,UAAU,mBAAqB,SAAUQ,EAAK,CAC7D,OAAI,KAAK,kBACA,KAAK,kBAAkBA,EAAM,EAAI,CAAC,EAElC,KAAK,wBAAwBA,CAAG,EAAE,MAE7C,EACAR,EAAiB,UAAU,cAAgB,SAAUQ,EAAKE,EAAK,CAC7D,GAAI,KAAK,kBAAmB,CAG1B,QAFIC,EAAS,KAAK,kBAAkBH,EAAM,CAAC,EACvCI,EAAM,KAAK,kBAAkBJ,EAAM,EAAI,CAAC,EACnCK,EAAI,EAAGA,EAAID,EAAKC,IACvBH,EAAIG,CAAC,EAAIH,EAAIG,CAAC,GAAK,CAAC,EACpBH,EAAIG,CAAC,EAAE,CAAC,EAAI,KAAK,YAAYF,EAASE,EAAI,CAAC,EAC3CH,EAAIG,CAAC,EAAE,CAAC,EAAI,KAAK,YAAYF,EAASE,EAAI,EAAI,CAAC,EAEjD,OAAOD,CACT,KAAO,CAEL,QADIf,EAAS,KAAK,wBAAwBW,CAAG,EACpCK,EAAI,EAAGA,EAAIhB,EAAO,OAAQgB,IACjCH,EAAIG,CAAC,EAAIH,EAAIG,CAAC,GAAK,CAAC,EACpBH,EAAIG,CAAC,EAAE,CAAC,EAAIhB,EAAOgB,CAAC,EAAE,CAAC,EACvBH,EAAIG,CAAC,EAAE,CAAC,EAAIhB,EAAOgB,CAAC,EAAE,CAAC,EAEzB,OAAOhB,EAAO,MAChB,CACF,EACAG,EAAiB,UAAU,wBAA0B,SAAUN,EAAM,CACnE,IAAIoB,EAAc,EAMlB,GALI,KAAK,cACPA,EAAc,KAAK,YAAY,QAI7BC,GAASrB,EAAK,CAAC,CAAC,EAAG,CAQrB,QAPIkB,EAAMlB,EAAK,OAEXsB,EAA4B,IAAI1B,IAAUsB,CAAG,EAC7CK,EAAgB,IAAI1B,IAAWqB,CAAG,EAClCM,EAAe,EACfC,EAAe,EACfC,EAAY,EACPP,EAAI,EAAGA,EAAID,GAAM,CACxBQ,IACA,IAAIC,EAAQ3B,EAAKmB,GAAG,EAEpBG,EAA0BG,GAAc,EAAID,EAAeJ,EAE3DE,EAA0BG,GAAc,EAAIE,EAC5C,QAASC,EAAI,EAAGA,EAAID,EAAOC,IAAK,CAC9B,IAAIC,EAAI7B,EAAKmB,GAAG,EACZW,EAAI9B,EAAKmB,GAAG,EAChBI,EAAcC,GAAc,EAAIK,EAChCN,EAAcC,GAAc,EAAIM,EAC5BX,EAAID,CAKV,CACF,CACA,MAAO,CACL,iBAAkB,IAAI,YAAYI,EAA0B,OAAQ,EAAGG,CAAY,EACnF,WAAYF,EACZ,MAAOG,CACT,CACF,CACA,MAAO,CACL,iBAAkB,KAClB,WAAY,KACZ,MAAO1B,EAAK,MACd,CACF,EACAM,EAAiB,UAAU,eAAiB,SAAUI,EAAQqB,EAAS,CACrE,GAAI,EACF,IAAIC,EAKN,IAAIC,EAAW,IAAIC,GAAW,CAAC,OAAO,EAAG,IAAI,EAC7C,OAAAD,EAAS,cAAgB,GACzBA,EAAS,SAASvB,EAAO,KAAM,CAAC,EAAG,SAAUyB,EAAUC,EAASC,EAAWC,EAAU,CAEnF,GAAIH,aAAoB,MACtB,MAAO,KAEPF,EAAS,cAAgB,GACzB,IAAIM,EAAQJ,EAAS,MACrB,GAAII,GAAS,KACX,OAAOA,aAAiB,MAAQA,EAAMD,CAAQ,EAAIC,CAGxD,CAAC,EACMN,CACT,EACA3B,EAAiB,UAAU,cAAgB,SAAU+B,EAAWG,EAAgBC,EAAU,CACxF,IAAIzC,EAAO,KAAK,QAAQ,EACpBe,EAAYf,EAAK,aAAaqC,CAAS,EACvCK,EAAO3B,EAAU,IAAI,MAAM,EAC/B,GAAI2B,EACF,OAAOA,EAET,IAAIC,EAAW5B,EAAU,IAAI,UAAU,EACnC6B,EAAS7B,EAAU,IAAI,QAAQ,EAC/B8B,EAAU,CAAC,EACf,OAAAF,GAAY,MAAQE,EAAQ,KAAKF,CAAQ,EACzCC,GAAU,MAAQC,EAAQ,KAAKD,CAAM,EAC9BE,GAAoB,YAAa,CACtC,KAAMD,EAAQ,KAAK,KAAK,CAC1B,CAAC,CACH,EACAvC,EAAiB,UAAU,mBAAqB,UAAY,CAC1D,MAAO,CAAC,CAAC,KAAK,IAAI,CAAC,SAAU,MAAM,CAAC,CACtC,EACAA,EAAiB,UAAU,eAAiB,UAAY,CACtD,IAAIyC,EAAc,KAAK,OAAO,YAC9B,OAAIA,IACK,KAAK,OAAO,MAAQ,IAAM,KAAK,IAAI,aAAa,EAG3D,EACAzC,EAAiB,UAAU,wBAA0B,UAAY,CAC/D,IAAI0C,EAAuB,KAAK,OAAO,qBACvC,OAAIA,IACK,KAAK,OAAO,MAAQ,IAAM,KAAK,IAAI,sBAAsB,EAGpE,EACA1C,EAAiB,UAAU,aAAe,UAAY,CACpD,IAAI2C,EAAc,KAAK,SAAS,QAAQ,EACpCC,EAAcD,EAAY,IAAI,aAAa,EAC/C,OAAO,KAAK,QAAQ,EAAE,MAAM,EAAI,KAAK,wBAAwB,EAE3D,KAAK,GAAKA,EAAY,IAAI,MAAM,GAAKC,EAAc,EAAIA,EAAc,GAAK,EAC9E,EACA5C,EAAiB,KAAO,eACxBA,EAAiB,aAAe,CAAC,OAAQ,QAAS,MAAO,UAAU,EACnEA,EAAiB,cAAgB,CAC/B,iBAAkB,MAElB,EAAG,EACH,gBAAiB,GAEjB,WAAY,EACZ,WAAY,EACZ,OAAQ,CAAC,OAAQ,MAAM,EACvB,WAAY,CAAC,GAAI,EAAE,EAEnB,SAAU,EACV,OAAQ,CACN,KAAM,GACN,OAAQ,EACR,cAAe,EACf,OAAQ,SACR,WAAY,EACZ,KAAM,GACN,YAAa,EACf,EACA,MAAO,GAEP,eAAgB,IAChB,SAAU,GACV,KAAM,GACN,MAAO,CACL,KAAM,GACN,SAAU,KAGZ,EACA,UAAW,CACT,QAAS,EACX,CACF,EACOA,CACT,GAAE6C,EAAW,EACNC,IAAQ9C,ICzQf,SAAS+C,GAAUC,EAAG,CACpB,OAAMA,aAAa,QACjBA,EAAI,CAACA,EAAGA,CAAC,GAEJA,CACT,CACA,IAAIC,IAAc,CAChB,WAAY,QACZ,MAAO,SAAUC,EAAa,CAC5B,IAAIC,EAAaJ,GAAUG,EAAY,IAAI,QAAQ,CAAC,EAChDE,EAAaL,GAAUG,EAAY,IAAI,YAAY,CAAC,EACpDG,EAAOH,EAAY,QAAQ,EAC/BG,EAAK,UAAU,aAAcF,GAAcA,EAAW,CAAC,CAAC,EACxDE,EAAK,UAAU,WAAYF,GAAcA,EAAW,CAAC,CAAC,EACtDE,EAAK,UAAU,iBAAkBD,GAAcA,EAAW,CAAC,CAAC,EAC5DC,EAAK,UAAU,eAAgBD,GAAcA,EAAW,CAAC,CAAC,EAC1D,SAASE,EAASD,EAAME,EAAK,CAC3B,IAAIC,EAAYH,EAAK,aAAaE,CAAG,EACjCJ,EAAaJ,GAAUS,EAAU,WAAW,SAAU,EAAI,CAAC,EAC3DJ,EAAaL,GAAUS,EAAU,WAAW,aAAc,EAAI,CAAC,EACnEL,EAAW,CAAC,GAAKE,EAAK,cAAcE,EAAK,aAAcJ,EAAW,CAAC,CAAC,EACpEA,EAAW,CAAC,GAAKE,EAAK,cAAcE,EAAK,WAAYJ,EAAW,CAAC,CAAC,EAClEC,EAAW,CAAC,GAAKC,EAAK,cAAcE,EAAK,iBAAkBH,EAAW,CAAC,CAAC,EACxEA,EAAW,CAAC,GAAKC,EAAK,cAAcE,EAAK,eAAgBH,EAAW,CAAC,CAAC,CACxE,CACA,MAAO,CACL,SAAUC,EAAK,cAAgBC,EAAW,IAC5C,CACF,CACF,EACOG,IAAQR,IC1BR,SAASS,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAS,EACrCD,EAAU,oBAAoBE,GAAgB,EAC9CF,EAAU,eAAeG,EAAW,EACpCH,EAAU,eAAeI,GAAW,CACtC,CCNA,IAAIC,IAAkB,IAClBC,KAA4B,UAAY,CAC1C,SAASA,GAAe,CACtB,KAAK,SAAW,GAChB,KAAK,UAAY,GACjB,KAAK,WAAa,EAClB,KAAK,WAAa,EAClB,KAAK,gBAAkB,CACrB,QAAS,KACT,WAAY,IACd,EACA,IAAIC,EAASC,GAAY,aAAa,EACtC,KAAK,OAASD,CAChB,CAOA,OAAAD,EAAa,UAAU,OAAS,SAAUG,EAAMC,EAAOC,EAAQC,EAAWC,EAAWC,EAAW,CAC9F,IAAIC,EAAQ,KAAK,UAAU,EACvBC,EAAkB,KAAK,aAAaH,EAAW,SAAS,EACxDI,EAAqB,KAAK,aAAaJ,EAAW,YAAY,EAC9DK,EAAI,KAAK,UAAY,KAAK,SAC1BX,EAAS,KAAK,OACdY,EAAMZ,EAAO,WAAW,IAAI,EAC5Ba,EAAMX,EAAK,OACfF,EAAO,MAAQG,EACfH,EAAO,OAASI,EAChB,QAASU,EAAI,EAAGA,EAAID,EAAK,EAAEC,EAAG,CAC5B,IAAIC,EAAIb,EAAKY,CAAC,EACVE,EAAID,EAAE,CAAC,EACPE,EAAIF,EAAE,CAAC,EACPG,EAAQH,EAAE,CAAC,EAEXI,EAAQd,EAAUa,CAAK,EAE3BN,EAAI,YAAcO,EAClBP,EAAI,UAAUJ,EAAOQ,EAAIL,EAAGM,EAAIN,CAAC,CACnC,CACA,GAAI,CAACX,EAAO,OAAS,CAACA,EAAO,OAG3B,OAAOA,EAUT,QAPIoB,EAAYR,EAAI,aAAa,EAAG,EAAGZ,EAAO,MAAOA,EAAO,MAAM,EAC9DqB,EAASD,EAAU,KACnBE,EAAS,EACTC,EAAWF,EAAO,OAClBG,EAAa,KAAK,WAClBC,EAAa,KAAK,WAClBC,EAAcD,EAAaD,EACxBF,EAASC,GAAU,CACxB,IAAIJ,EAAQE,EAAOC,EAAS,CAAC,EAAI,IAC7BK,EAAiB,KAAK,MAAMR,GAASrB,IAAkB,EAAE,EAAI,EAEjE,GAAIqB,EAAQ,EAAG,CACb,IAAIS,EAAWrB,EAAUY,CAAK,EAAIV,EAAkBC,EAEpDS,EAAQ,IAAMA,EAAQA,EAAQO,EAAcF,GAC5CH,EAAOC,GAAQ,EAAIM,EAASD,CAAc,EAC1CN,EAAOC,GAAQ,EAAIM,EAASD,EAAiB,CAAC,EAC9CN,EAAOC,GAAQ,EAAIM,EAASD,EAAiB,CAAC,EAC9CN,EAAOC,GAAQ,EAAIM,EAASD,EAAiB,CAAC,EAAIR,EAAQ,GAC5D,MACEG,GAAU,CAEd,CACA,OAAAV,EAAI,aAAaQ,EAAW,EAAG,CAAC,EACzBpB,CACT,EAIAD,EAAa,UAAU,UAAY,UAAY,CAC7C,IAAI8B,EAAc,KAAK,eAAiB,KAAK,aAAe5B,GAAY,aAAa,GAEjF,EAAI,KAAK,UAAY,KAAK,SAC1B6B,EAAI,EAAI,EACZD,EAAY,MAAQC,EACpBD,EAAY,OAASC,EACrB,IAAIlB,EAAMiB,EAAY,WAAW,IAAI,EACrC,OAAAjB,EAAI,UAAU,EAAG,EAAGkB,EAAGA,CAAC,EAIxBlB,EAAI,cAAgBkB,EACpBlB,EAAI,WAAa,KAAK,SAGtBA,EAAI,YAAcmB,EAAO,MAAM,UAE/BnB,EAAI,UAAU,EACdA,EAAI,IAAI,CAAC,EAAG,EAAG,KAAK,UAAW,EAAG,KAAK,GAAK,EAAG,EAAI,EACnDA,EAAI,UAAU,EACdA,EAAI,KAAK,EACFiB,CACT,EAKA9B,EAAa,UAAU,aAAe,SAAUO,EAAW0B,EAAO,CAKhE,QAJIC,EAAiB,KAAK,gBACtBC,EAAoBD,EAAeD,CAAK,IAAMC,EAAeD,CAAK,EAAI,IAAI,kBAAkB,IAAM,CAAC,GACnGG,EAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EACnBC,EAAM,EACDtB,EAAI,EAAGA,EAAI,IAAKA,IACvBR,EAAU0B,CAAK,EAAElB,EAAI,IAAK,GAAMqB,CAAK,EACrCD,EAAkBE,GAAK,EAAID,EAAM,CAAC,EAClCD,EAAkBE,GAAK,EAAID,EAAM,CAAC,EAClCD,EAAkBE,GAAK,EAAID,EAAM,CAAC,EAClCD,EAAkBE,GAAK,EAAID,EAAM,CAAC,EAEpC,OAAOD,CACT,EACOnC,CACT,GAAE,EACKsC,IAAQtC,ICnHf,SAASuC,IAAsBC,EAAYC,EAAWC,EAAU,CAC9D,IAAIC,EAAWH,EAAW,CAAC,EAAIA,EAAW,CAAC,EAC3CC,EAAmBG,EAAIH,EAAW,SAAUI,EAAO,CACjD,MAAO,CACL,SAAU,EAAEA,EAAM,SAAS,CAAC,EAAIL,EAAW,CAAC,GAAKG,GAAWE,EAAM,SAAS,CAAC,EAAIL,EAAW,CAAC,GAAKG,CAAQ,CAC3G,CACF,CAAC,EACD,IAAIG,EAAML,EAAU,OAChBM,EAAY,EAChB,OAAO,SAAUC,EAAK,CACpB,IAAIC,EAEJ,IAAKA,EAAIF,EAAWE,EAAIH,EAAKG,IAAK,CAChC,IAAIC,EAAWT,EAAUQ,CAAC,EAAE,SAC5B,GAAIC,EAAS,CAAC,GAAKF,GAAOA,GAAOE,EAAS,CAAC,EAAG,CAC5CH,EAAYE,EACZ,KACF,CACF,CACA,GAAIA,IAAMH,EAER,IAAKG,EAAIF,EAAY,EAAGE,GAAK,EAAGA,IAAK,CACnC,IAAIC,EAAWT,EAAUQ,CAAC,EAAE,SAC5B,GAAIC,EAAS,CAAC,GAAKF,GAAOA,GAAOE,EAAS,CAAC,EAAG,CAC5CH,EAAYE,EACZ,KACF,CACF,CAEF,OAAOA,GAAK,GAAKA,EAAIH,GAAOJ,EAASO,CAAC,CACxC,CACF,CACA,SAASE,IAAuBX,EAAYY,EAAO,CACjD,IAAIT,EAAWH,EAAW,CAAC,EAAIA,EAAW,CAAC,EAC3C,OAAAY,EAAQ,EAAEA,EAAM,CAAC,EAAIZ,EAAW,CAAC,GAAKG,GAAWS,EAAM,CAAC,EAAIZ,EAAW,CAAC,GAAKG,CAAQ,EAC9E,SAAUK,EAAK,CACpB,OAAOA,GAAOI,EAAM,CAAC,GAAKJ,GAAOI,EAAM,CAAC,CAC1C,CACF,CACA,SAASC,IAAcC,EAAU,CAC/B,IAAIC,EAAaD,EAAS,WAE1B,OAAOC,EAAW,CAAC,IAAM,OAASA,EAAW,CAAC,IAAM,KACtD,CACA,IAAIC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KAClBG,CACT,CACA,OAAAH,EAAY,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CAClE,IAAIC,EACJF,EAAQ,cAAc,YAAa,SAAUG,EAAW,CACtDA,EAAU,iBAAiB,SAAUC,EAAc,CAC7CA,IAAiBL,IACnBG,EAAwBC,EAE5B,CAAC,CACH,CAAC,EAOD,KAAK,gBAAkB,KACvB,KAAK,MAAM,UAAU,EACrB,IAAIV,EAAWM,EAAY,iBACvBN,EAAS,OAAS,eAAiBA,EAAS,OAAS,YAAcA,EAAS,OAAS,SACvF,KAAK,kBAAkBM,EAAaE,EAAK,EAAGF,EAAY,QAAQ,EAAE,MAAM,CAAC,EAChEP,IAAcC,CAAQ,GAC/B,KAAK,aAAaA,EAAUM,EAAaG,EAAuBD,CAAG,CAEvE,EACAN,EAAY,UAAU,yBAA2B,SAAUI,EAAaC,EAASC,EAAK,CACpF,KAAK,MAAM,UAAU,CACvB,EACAN,EAAY,UAAU,kBAAoB,SAAUU,EAAQN,EAAaC,EAASC,EAAK,CACrF,IAAIR,EAAWM,EAAY,iBACvBN,IAEED,IAAcC,CAAQ,EACxB,KAAK,OAAOM,EAAaC,EAASC,CAAG,GAErC,KAAK,gBAAkB,CAAC,EACxB,KAAK,kBAAkBF,EAAaE,EAAKI,EAAO,MAAOA,EAAO,IAAK,EAAI,GAG7E,EACAV,EAAY,UAAU,aAAe,SAAUW,EAAI,CACzCC,GAAiB,KAAK,iBAAmB,KAAK,MAAOD,CAAE,CACjE,EACAX,EAAY,UAAU,kBAAoB,SAAUI,EAAaE,EAAKO,EAAOC,EAAKC,EAAa,CAC7F,IAAIjB,EAAWM,EAAY,iBACvBY,EAAgBC,GAAuBnB,EAAU,aAAa,EAC9DoB,EAAWD,GAAuBnB,EAAU,QAAQ,EACpDqB,EACAC,EACAC,EACAC,EACJ,GAAIN,EAAe,CACjB,IAAIO,EAAQzB,EAAS,QAAQ,GAAG,EAC5B0B,EAAQ1B,EAAS,QAAQ,GAAG,EAUhCqB,EAAQI,EAAM,aAAa,EAAI,GAC/BH,EAASI,EAAM,aAAa,EAAI,GAChCH,EAAcE,EAAM,MAAM,UAAU,EACpCD,EAAcE,EAAM,MAAM,UAAU,CACtC,CAaA,QAZIC,EAAQ,KAAK,MACbC,EAAOtB,EAAY,QAAQ,EAC3BuB,EAAgBvB,EAAY,SAAS,CAAC,WAAY,WAAW,CAAC,EAAE,aAAa,EAC7EwB,EAAYxB,EAAY,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,aAAa,EACrEyB,EAAczB,EAAY,SAAS,CAAC,SAAU,WAAW,CAAC,EAAE,aAAa,EACzE0B,EAAe1B,EAAY,IAAI,CAAC,YAAa,cAAc,CAAC,EAC5D2B,EAAoBC,GAAqB5B,CAAW,EACpD6B,EAAgB7B,EAAY,SAAS,UAAU,EAC/C8B,EAAQD,EAAc,IAAI,OAAO,EACjCE,EAAYF,EAAc,IAAI,WAAW,EACzCG,EAAmBH,EAAc,IAAI,UAAU,EAC/CI,EAAWrB,GAAiBE,EAAW,CAACQ,EAAK,aAAa,GAAG,EAAGA,EAAK,aAAa,GAAG,EAAGA,EAAK,aAAa,OAAO,CAAC,EAAI,CAACA,EAAK,aAAa,MAAM,EAAGA,EAAK,aAAa,OAAO,CAAC,EACvKY,EAAMzB,EAAOyB,EAAMxB,EAAKwB,IAAO,CACtC,IAAIC,EAAO,OACPC,EAAQd,EAAK,cAAcY,EAAK,OAAO,EAC3C,GAAItB,EAAe,CACjB,IAAIyB,EAAWf,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,EACpCI,EAAWhB,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,EAExC,GAAI,MAAMZ,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,CAAC,GAAK,MAAMG,CAAQ,GAAK,MAAMC,CAAQ,GAAKD,EAAWpB,EAAY,CAAC,GAAKoB,EAAWpB,EAAY,CAAC,GAAKqB,EAAWpB,EAAY,CAAC,GAAKoB,EAAWpB,EAAY,CAAC,EAC5L,SAEF,IAAIqB,EAAQ7C,EAAS,YAAY,CAAC2C,EAAUC,CAAQ,CAAC,EACrDH,EAAO,IAAYK,GAAK,CACtB,MAAO,CACL,EAAGD,EAAM,CAAC,EAAIxB,EAAQ,EACtB,EAAGwB,EAAM,CAAC,EAAIvB,EAAS,EACvB,MAAOD,EACP,OAAQC,CACV,EACA,MAAOoB,CACT,CAAC,CACH,SAAWtB,EAAU,CACnB,IAAI2B,EAAQ/C,EAAS,aAAa,CAAC4B,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,EAAGZ,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,CAAC,CAAC,EAAE,KAC5F,GAAWQ,GAAMD,EAAM,CAAC,EACtB,SAEFN,EAAO,IAAYK,GAAK,CACtB,GAAI,EACJ,MAAOC,EACP,MAAOL,CACT,CAAC,CACH,KAAO,CAGL,GAAI,MAAMd,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,CAAC,EAClC,SAEF,IAAIS,EAASjD,EAAS,aAAa,CAAC4B,EAAK,IAAIW,EAAS,CAAC,EAAGC,CAAG,CAAC,CAAC,EAC3DO,EAAQE,EAAO,aAAeA,EAAO,KACzC,GAAWD,GAAMD,EAAM,CAAC,GAAYC,GAAMD,EAAM,CAAC,EAC/C,SAEFN,EAAO,IAAYK,GAAK,CACtB,GAAI,EACJ,MAAOC,EACP,MAAOL,CACT,CAAC,CACH,CAEA,GAAId,EAAK,cAAe,CACtB,IAAIsB,EAAYtB,EAAK,aAAaY,CAAG,EACjCW,EAAkBD,EAAU,SAAS,UAAU,EACnDrB,EAAgBsB,EAAgB,SAAS,WAAW,EAAE,aAAa,EACnErB,EAAYoB,EAAU,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,aAAa,EACnEnB,EAAcmB,EAAU,SAAS,CAAC,SAAU,WAAW,CAAC,EAAE,aAAa,EAMvElB,EAAekB,EAAU,IAAI,CAAC,YAAa,cAAc,CAAC,EAC1Dd,EAAQe,EAAgB,IAAI,OAAO,EACnCd,EAAYc,EAAgB,IAAI,WAAW,EAC3Cb,EAAmBa,EAAgB,IAAI,UAAU,EACjDlB,EAAoBC,GAAqBgB,CAAS,CACpD,CACAT,EAAK,MAAM,EAAIT,EACf,IAAIoB,EAAW9C,EAAY,YAAYkC,CAAG,EACtCa,GAAc,IACdD,GAAYA,EAAS,CAAC,GAAK,OAC7BC,GAAcD,EAAS,CAAC,EAAI,IAE9BE,GAAcb,EAAMR,EAAmB,CACrC,aAAc3B,EACd,eAAgBkC,EAChB,eAAgBE,EAAM,QACtB,YAAaW,EACf,CAAC,EACDZ,EAAK,YAAY,UAAU,EAAE,MAAQZ,EACrCY,EAAK,YAAY,MAAM,EAAE,MAAQX,EACjCW,EAAK,YAAY,QAAQ,EAAE,MAAQV,EACnCwB,GAAoBd,EAAML,EAAOC,EAAWC,CAAgB,EAC5DG,EAAK,YAAcxB,EAEfA,IAEFwB,EAAK,OAAO,SAAS,WAAa,IAEpCd,EAAM,IAAIc,CAAI,EACdb,EAAK,iBAAiBY,EAAKC,CAAI,EAC3B,KAAK,iBACP,KAAK,gBAAgB,KAAKA,CAAI,CAElC,CACF,EACAvC,EAAY,UAAU,aAAe,SAAUsD,EAAKlD,EAAamD,EAAgBjD,EAAK,CACpF,IAAIkD,EAAiBD,EAAe,cAAc,QAC9CE,EAAoBF,EAAe,cAAc,WAIjD7B,EAAOtB,EAAY,QAAQ,EAC3BsD,EAAU,KAAK,UAAY,KAAK,UAAY,IAAIC,IACpDD,EAAQ,SAAWtD,EAAY,IAAI,UAAU,EAC7CsD,EAAQ,UAAYtD,EAAY,IAAI,WAAW,EAC/CsD,EAAQ,WAAatD,EAAY,IAAI,YAAY,EACjDsD,EAAQ,WAAatD,EAAY,IAAI,YAAY,EACjD,IAAImC,EAAOe,EAAI,YAAY,EAAE,MAAM,EAC/BM,EAAgBN,EAAI,iBAAiB,EACzCf,EAAK,eAAeqB,CAAa,EAEjC,IAAIC,EAAI,KAAK,IAAItB,EAAK,EAAG,CAAC,EACtBuB,EAAI,KAAK,IAAIvB,EAAK,EAAG,CAAC,EACtBwB,EAAK,KAAK,IAAIxB,EAAK,MAAQA,EAAK,EAAGjC,EAAI,SAAS,CAAC,EACjD0D,EAAK,KAAK,IAAIzB,EAAK,OAASA,EAAK,EAAGjC,EAAI,UAAU,CAAC,EACnDa,EAAQ4C,EAAKF,EACbzC,EAAS4C,EAAKF,EACdG,EAAO,CAACvC,EAAK,aAAa,KAAK,EAAGA,EAAK,aAAa,KAAK,EAAGA,EAAK,aAAa,OAAO,CAAC,EACtFwC,EAASxC,EAAK,SAASuC,EAAM,SAAUE,EAAKC,EAAKC,EAAO,CAC1D,IAAIC,EAAKhB,EAAI,YAAY,CAACa,EAAKC,CAAG,CAAC,EACnC,OAAAE,EAAG,CAAC,GAAKT,EACTS,EAAG,CAAC,GAAKR,EACTQ,EAAG,KAAKD,CAAK,EACNC,CACT,CAAC,EACGtF,EAAauE,EAAe,UAAU,EACtCgB,EAAYhB,EAAe,OAAS,uBAAyB5D,IAAuBX,EAAYuE,EAAe,OAAO,KAAK,EAAIxE,IAAsBC,EAAYuE,EAAe,aAAa,EAAGA,EAAe,OAAO,QAAQ,EAClOG,EAAQ,OAAOQ,EAAQ/C,EAAOC,EAAQoC,EAAe,MAAM,cAAc,EAAG,CAC1E,QAASA,EAAe,MAAM,eAAe,EAC7C,WAAYC,EAAkB,MAAM,eAAe,CACrD,EAAGc,CAAS,EACZ,IAAIC,EAAM,IAAYC,GAAM,CAC1B,MAAO,CACL,MAAOtD,EACP,OAAQC,EACR,EAAGyC,EACH,EAAGC,EACH,MAAOJ,EAAQ,MACjB,EACA,OAAQ,EACV,CAAC,EACD,KAAK,MAAM,IAAIc,CAAG,CACpB,EACAxE,EAAY,KAAO,UACZA,CACT,GAAE0E,EAAS,EACJC,IAAQ3E,ICtRf,IAAI4E,KAAkC,SAAUC,EAAQ,CACtDC,EAAUF,EAAoBC,CAAM,EACpC,SAASD,GAAqB,CAC5B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAmB,KACzBG,CACT,CACA,OAAAH,EAAmB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CACvE,OAAOC,GAAiB,KAAM,KAAM,CAClC,cAAe,OACjB,CAAC,CACH,EACAN,EAAmB,UAAU,mBAAqB,UAAY,CAC5D,IAAIO,EAAkBC,GAAiB,IAAI,KAAK,IAAI,kBAAkB,CAAC,EACvE,GAAID,GAAmBA,EAAgB,WACrC,OAAOA,EAAgB,WAAW,CAAC,IAAM,OAASA,EAAgB,WAAW,CAAC,IAAM,KAExF,EACAP,EAAmB,KAAO,iBAC1BA,EAAmB,aAAe,CAAC,OAAQ,MAAO,WAAY,QAAQ,EACtEA,EAAmB,cAAgB,CACjC,iBAAkB,cAElB,EAAG,EAKH,SAAU,EACV,SAAU,GACV,UAAW,GACX,WAAY,EACZ,WAAY,EACZ,OAAQ,CACN,UAAW,CACT,YAAaS,EAAO,MAAM,OAC5B,CACF,CACF,EACOT,CACT,GAAEU,EAAW,EACNC,IAAQX,IC5CR,SAASY,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAW,EACvCD,EAAU,oBAAoBE,GAAkB,CAClD,CCOA,IAAIC,IAAyB,CAAC,YAAa,aAAa,EAEpDC,IAAe,CAAC,CAClB,GAAI,IACJ,GAAI,QACJ,MAAO,EACP,QAAS,CAAC,OAAQ,OAAO,CAC3B,EAAG,CACD,GAAI,IACJ,GAAI,SACJ,MAAO,EACP,QAAS,CAAC,MAAO,QAAQ,CAC3B,CAAC,EACGC,GAAmB,IAAYC,GAC/BC,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KACvBG,CACT,CACA,OAAAH,EAAiB,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CACvE,IAAIC,EAAQ,KAAK,MACbC,EAAOJ,EAAY,QAAQ,EAC3BK,EAAU,KAAK,MACfC,EAAYN,EAAY,iBACxBO,EAAWD,EAAU,YAAY,EACjCE,EAAeD,EAAS,aAAa,EACrCE,EAAeH,EAAU,OAAO,QAAQ,EACxCI,EAAM,CACR,OAAQ,CACN,MAAOR,EAAI,SAAS,EACpB,OAAQA,EAAI,UAAU,CACxB,EACA,YAAaF,EACb,SAAUM,EACV,eAAgB,CAAC,CAACG,EAAa,EAAGA,EAAa,EAAIA,EAAa,KAAK,EAAG,CAACA,EAAa,EAAGA,EAAa,EAAIA,EAAa,MAAM,CAAC,EAC9H,aAAcD,EACd,SAAUf,IAAa,CAACe,CAAY,EACpC,YAAaf,IAAa,EAAI,CAACe,CAAY,CAC7C,EACAJ,EAAK,KAAKC,CAAO,EAAE,IAAI,SAAUM,EAAW,CAC1C,GAAKP,EAAK,SAASO,CAAS,EAG5B,KAAIC,EAAYC,IAAaT,EAAMO,CAAS,EACxCG,EAAaC,IAAcX,EAAMO,EAAWC,EAAWF,CAAG,EAC1DM,EAAMC,IAAUb,EAAMM,EAAKI,CAAU,EACzCV,EAAK,iBAAiBO,EAAWK,CAAG,EACpCb,EAAM,IAAIa,CAAG,EACbE,IAAaF,EAAKN,EAAKI,CAAU,EACnC,CAAC,EAAE,OAAO,SAAUK,EAAUC,EAAU,CACtC,IAAIJ,EAAMX,EAAQ,iBAAiBe,CAAQ,EAC3C,GAAI,CAAChB,EAAK,SAASe,CAAQ,EAAG,CAC5BhB,EAAM,OAAOa,CAAG,EAChB,MACF,CACA,IAAIJ,EAAYC,IAAaT,EAAMe,CAAQ,EACvCL,EAAaC,IAAcX,EAAMe,EAAUP,EAAWF,CAAG,EACzDW,EAAoBC,IAAYlB,EAAMU,CAAU,EAChDE,GAAOK,IAAsBL,EAAI,sBACnCb,EAAM,OAAOa,CAAG,EAChBZ,EAAK,iBAAiBe,EAAU,IAAI,EACpCH,EAAM,MAEJA,EACFO,IAAUP,EAAKN,EAAKI,CAAU,EAE9BE,EAAMC,IAAUb,EAAMM,EAAKI,EAAY,EAAI,EAE7CV,EAAK,iBAAiBe,EAAUH,CAAG,EACnCA,EAAI,sBAAwBF,EAE5BX,EAAM,IAAIa,CAAG,EACbE,IAAaF,EAAKN,EAAKI,CAAU,CACnC,CAAC,EAAE,OAAO,SAAUH,EAAW,CAC7B,IAAIK,EAAMX,EAAQ,iBAAiBM,CAAS,EAC5CK,GAAOQ,IAAUnB,EAASM,EAAWK,EAAI,sBAAsB,eAAgBA,CAAG,CACpF,CAAC,EAAE,QAAQ,EAEX,IAAIS,EAAWzB,EAAY,IAAI,OAAQ,EAAI,EAAI0B,GAAe1B,EAAY,iBAAkB,GAAOA,CAAW,EAAI,KAClH,OAAIyB,EACFtB,EAAM,YAAYsB,CAAQ,EAE1BtB,EAAM,eAAe,EAEvB,KAAK,MAAQC,EACN,KAAK,KACd,EACAR,EAAiB,UAAU,OAAS,SAAUK,EAASC,EAAK,CAC1D,IAAIC,EAAQ,KAAK,MACbC,EAAO,KAAK,MACZH,EAAQ,IAAI,WAAW,EACrBG,GACFA,EAAK,kBAAkB,SAAUY,EAAK,CACpCQ,IAAUpB,EAAMuB,GAAUX,CAAG,EAAE,UAAWf,EAASe,CAAG,CACxD,CAAC,EAGHb,EAAM,UAAU,CAEpB,EACAP,EAAiB,KAAO,eACjBA,CACT,GAAEgC,EAAS,EAEX,SAASb,IAAcX,EAAMO,EAAWC,EAAWF,EAAK,CACtD,IAAImB,EAASzB,EAAK,cAAcO,CAAS,EACrCmB,EAAelB,EAAU,IAAI,cAAc,EAC3CmB,EAAanB,EAAU,IAAI,YAAY,EACvCoB,EAAiBpB,EAAU,IAAI,gBAAgB,GAAK,QACpDqB,EAAerB,EAAU,IAAI,cAAc,EAC3CsB,GAAYD,GAAgB,GAAK,KAAK,GAAK,KAAO,EAClDE,EAAoBvB,EAAU,IAAI,mBAAmB,GAAK,EAC1DwB,EAAqBxB,EAAU,mBAAmB,EAClDE,EAAa,CACf,UAAWH,EACX,OAAQkB,EACR,UAAWjB,EACX,WAAYR,EAAK,cAAcO,EAAW,QAAQ,GAAK,SACvD,MAAOP,EAAK,cAAcO,EAAW,OAAO,EAC5C,WAAYoB,EACZ,aAAcD,EACd,sBAAuBlB,EAAU,IAAI,uBAAuB,EAC5D,kBAAmBuB,EACnB,SAAUD,EACV,eAAgBE,EAAqBxB,EAAY,KACjD,WAAYwB,GAAsBxB,EAAU,IAAI,CAAC,WAAY,OAAO,CAAC,EACrE,GAAIA,EAAU,WAAW,IAAK,EAAI,GAAK,CACzC,EACAyB,IAAiBzB,EAAWkB,EAAcD,EAAQnB,EAAKI,CAAU,EACjEwB,IAAkBlC,EAAMO,EAAWkB,EAAQC,EAAcC,EAAYjB,EAAW,eAAgBA,EAAW,OAAQqB,EAAmBzB,EAAKI,CAAU,EACrJyB,IAAiB3B,EAAWE,EAAW,YAAaoB,EAAUxB,EAAKI,CAAU,EAC7E,IAAI0B,EAAa1B,EAAW,WACxB2B,EAAeC,GAAsB9B,EAAU,IAAI,cAAc,EAAG4B,CAAU,EAClF,OAAAG,IAAkB/B,EAAW4B,EAAYX,EAAQC,EAAcC,EAAYU,EAAcT,EAAgBlB,EAAW,eAAgBA,EAAW,eAAgBA,EAAW,gBAAiBJ,EAAKI,CAAU,EACnMA,CACT,CAEA,SAASuB,IAAiBzB,EAAWkB,EAAcD,EAAQnB,EAAKkC,EAAkB,CAChF,IAAIC,EAAWnC,EAAI,SACfoC,EAAqBlC,EAAU,IAAI,oBAAoB,EACvDmC,EAAYrC,EAAI,SAAS,aAAaA,EAAI,SAAS,YAAY,CAAC,EAChEsC,EAASD,EAAU,cAAcA,EAAU,YAAY,CAAC,CAAC,EACzDE,EAAY,EAAI,EAAEpB,EAAOgB,EAAS,EAAE,GAAK,GACzCK,EACJ,GAAWC,EAAQL,CAAkB,EAAG,CACtC,IAAIM,EAAuB,CAACC,GAAqBN,EAAWD,EAAmB,CAAC,CAAC,EAAIE,EAAQK,GAAqBN,EAAWD,EAAmB,CAAC,CAAC,EAAIE,CAAM,EAC5JI,EAAqB,CAAC,EAAIA,EAAqB,CAAC,GAAKA,EAAqB,QAAQ,EAClFF,EAAiBE,EAAqBH,CAAS,CACjD,MAAWH,GAAsB,KAC/BI,EAAiBG,GAAqBN,EAAWD,CAAkB,EAAIE,EAC9DlB,EACToB,EAAiBxC,EAAI,eAAemC,EAAS,KAAK,EAAEI,CAAS,EAAID,EAEjEE,EAAiBrB,EAAOgB,EAAS,EAAE,EAErCD,EAAiB,eAAiBM,EAC9BpB,IACFc,EAAiB,gBAAkBf,EAAOgB,EAAS,EAAE,GAIvD,IAAIS,EAAUT,EAAS,KAAO,IAC1BU,EAAYR,EAAU,QAC1BH,EAAiB,OAASU,GAAW,CAACC,GAAa,CAACD,GAAWC,EAAYL,GAAkB,EAAI,EAAI,GAAKA,EAAiB,EAAI,EAAI,EACrI,CACA,SAASG,GAAqBG,EAAMC,EAAO,CACzC,OAAOD,EAAK,cAAcA,EAAK,YAAYA,EAAK,MAAM,MAAMC,CAAK,CAAC,CAAC,CACrE,CAEA,SAASnB,IAAkBlC,EAAMO,EAAWkB,EAAQC,EAAcC,EAAYmB,EAAgBQ,EAAQvB,EAAmBzB,EAAKkC,EAAkB,CAC9I,IAAIC,EAAWnC,EAAI,SACfiD,EAAcjD,EAAI,YAClBkD,EAAe,KAAK,IAAI/B,EAAO8B,EAAY,EAAE,CAAC,EAC9CnB,EAAapC,EAAK,cAAcO,EAAW,YAAY,EACvDkD,EACOV,EAAQX,CAAU,EAC3BqB,EAAmBrB,EAAW,MAAM,EAEhCA,GAAc,KAEhBqB,EAAmB,CAAC,OAAQ,MAAM,EAElCA,EAAmB,CAACrB,EAAYA,CAAU,EAO9CqB,EAAiBF,EAAY,KAAK,EAAIG,GAAaD,EAAiBF,EAAY,KAAK,EAAGC,CAAY,EACpGC,EAAiBhB,EAAS,KAAK,EAAIiB,GAAaD,EAAiBhB,EAAS,KAAK,EAAGf,EAAe8B,EAAe,KAAK,IAAIV,CAAc,CAAC,EACxIN,EAAiB,WAAaiB,EAE9B,IAAIE,EAAcnB,EAAiB,YAAc,CAACiB,EAAiB,CAAC,EAAI1B,EAAmB0B,EAAiB,CAAC,EAAI1B,CAAiB,EAElI4B,EAAYlB,EAAS,KAAK,IAAMnC,EAAI,aAAe,GAAK,GAAKgD,CAC/D,CACA,SAASnB,IAAiB3B,EAAWmD,EAAa7B,EAAUxB,EAAKkC,EAAkB,CAIjF,IAAIoB,EAAiBpD,EAAU,IAAIpB,GAAsB,GAAK,EAC1DwE,IACFtE,GAAiB,KAAK,CACpB,OAAQqE,EAAY,CAAC,EACrB,OAAQA,EAAY,CAAC,EACrB,SAAU7B,CACZ,CAAC,EACDxC,GAAiB,gBAAgB,EACjCsE,GAAkBtE,GAAiB,aAAa,EAChDsE,GAAkBD,EAAYrD,EAAI,SAAS,KAAK,GAElDkC,EAAiB,eAAiBoB,GAAkB,CACtD,CACA,SAASrB,IAAkB/B,EAAW4B,EAAYX,EAAQC,EAAcC,EAAYU,EAAcT,EAAgBgC,EAAgBd,EAAgBe,EAAiBvD,EAAKkC,EAAkB,CACxL,IAAIe,EAAcjD,EAAI,YAClBmC,EAAWnC,EAAI,SACfgD,EAASd,EAAiB,OAC1BsB,EAAa,KAAK,IAAI1B,EAAWK,EAAS,KAAK,EAAImB,EAAgB,CAAC,EACpEG,EAAUD,EAId,GAAIpC,EAAc,CAChB,IAAIsC,EAAoB,KAAK,IAAIlB,CAAc,EAC3CmB,EAAsBC,GAAS1D,EAAU,IAAI,cAAc,EAAG,KAAK,EAAI,GACvE2D,EAAY,GACZF,EAAa,YAAY,GAAG,IAAMA,EAAa,OAAS,IAC1DE,EAAY,GACZF,EAAeA,EAAa,MAAM,EAAGA,EAAa,OAAS,CAAC,GAE9D,IAAIG,EAAsBV,GAAaO,EAAc7B,EAAWK,EAAS,KAAK,CAAC,EAC3E4B,EAAiB,KAAK,IAAIP,EAAaM,EAAsB,EAAG,CAAC,EAGjEE,EAASH,EAAY,EAAIC,EAAsB,EAG/CG,EAAkBC,GAAU9C,CAAY,EACxC+C,EAAcF,EAAkB7C,EAAegD,KAAYV,EAAoBM,GAAUD,CAAc,EAGvGM,EAAQX,EAAoBS,EAAcX,EAC9CM,EAAsBO,EAAQ,GAAKR,EAAYM,EAAc,KAAK,IAAIA,EAAc,EAAG,CAAC,GACxFJ,EAAiBP,EAAaM,EAAsB,EACpDE,EAASH,EAAY,EAAIC,EAAsB,EAE3C,CAACG,GAAmB7C,IAAiB,UACvC+C,EAAcZ,EAAkBa,KAAY,KAAK,IAAIb,CAAe,EAAIS,GAAUD,CAAc,EAAI,GAEtGN,EAAUU,EAAcJ,EAAiBC,EACzC9B,EAAiB,YAAciC,EAC/BjC,EAAiB,aAAe4B,CAClC,CACA,IAAIQ,EAAUtB,GAAUS,EAAU,GAC9Bc,EAAerC,EAAiB,aAAe,CAAC,EACpDqC,EAAatB,EAAY,KAAK,EAAI9B,EAAO8B,EAAY,EAAE,EAAI,EAC3DsB,EAAapC,EAAS,KAAK,EAAIb,IAAmB,QAAUgD,EAAUhD,IAAmB,MAAQkB,EAAiB8B,EAAU9B,EAAiB,EACzIT,IACFwC,EAAa,CAAC,GAAKxC,EAAa,CAAC,EACjCwC,EAAa,CAAC,GAAKxC,EAAa,CAAC,GAEnC,IAAIyC,EAAiBtC,EAAiB,eAAiB,CAAC,EACxDsC,EAAevB,EAAY,KAAK,EAAI9B,EAAO8B,EAAY,EAAE,EACzDuB,EAAerC,EAAS,KAAK,EAAIhB,EAAOgB,EAAS,EAAE,EACnD,IAAIsC,EAAevC,EAAiB,aAAsBwC,EAAO,CAAC,EAAGvD,CAAM,EAC3EsD,EAAatC,EAAS,EAAE,EAAIa,EAAS,KAAK,IAAI,KAAK,IAAI7B,EAAOgB,EAAS,EAAE,CAAC,EAAG,KAAK,IAAIoC,EAAapC,EAAS,KAAK,EAAImC,CAAO,CAAC,EAC7HG,EAAaxB,EAAY,EAAE,EAAI9B,EAAO8B,EAAY,EAAE,EACpD,IAAI0B,EAAYzC,EAAiB,UAAY,CAAC,EAE9CyC,EAAU1B,EAAY,EAAE,EAAI,CAAC9B,EAAO8B,EAAY,EAAE,EAClD0B,EAAU1B,EAAY,EAAE,EAAIjD,EAAI,OAAOiD,EAAY,EAAE,EACrD0B,EAAUxC,EAAS,EAAE,EAAI,EACzBwC,EAAUxC,EAAS,EAAE,EAAIhB,EAAOgB,EAAS,EAAE,CAC7C,CACA,SAASyC,IAAWxE,EAAY,CAC9B,IAAIqB,EAAoBrB,EAAW,kBAC/ByE,EAAOC,GAEX1E,EAAW,WAAY,CAACqB,EAAoB,EAAG,CAACA,EAAoB,EAAGA,EAAmBA,CAAiB,EAC3G,OAAAoD,EAAK,KAAK,CACR,QAAS,EACX,CAAC,EACDA,EAAK,OAAS,SAAWA,EAAK,SAAS,CACrC,cAAe,EACjB,CAAC,EACMA,CACT,CACA,SAASE,IAA4BzE,EAAKN,EAAKI,EAAY4E,EAAU,CACnE,IAAIC,EAAS3E,EAAI,kBACbwB,EAAa1B,EAAW,WACxBkD,EAAiBlD,EAAW,eAC5BmE,EAAenE,EAAW,aAC1B+B,EAAWnC,EAAI,SACfmE,EAAc/D,EAAW,aAAe,EACxC8E,EAAQ,EACRC,EAAOrD,EAAW9B,EAAI,SAAS,KAAK,EAAIsD,EAAiBlD,EAAW,aAAe,EAiBvF,IAhBAgF,GAAS9E,EAAK,SAAUuE,EAAM,CAC5BA,EAAK,0BAA4BK,EACjCL,EAAK,uBAAyBV,EAC1Be,EAAQf,EACVkB,GAAWR,EAAM,KAAMS,EAAWJ,CAAK,EAAG9E,EAAY4E,CAAQ,EAE9DK,GAAWR,EAAM,KAAM,CACrB,OAAQ,EACR,OAAQ,CACV,EAAGzE,EAAY4E,EAAU,UAAY,CACnCC,EAAO,OAAOJ,CAAI,CACpB,CAAC,EAGHK,GACF,CAAC,EACMA,EAAQf,EAAae,IAAS,CACnC,IAAIL,EAAOD,IAAWxE,CAAU,EAChCyE,EAAK,0BAA4BK,EACjCL,EAAK,uBAAyBV,EAC9Bc,EAAO,IAAIJ,CAAI,EACf,IAAIU,EAASD,EAAWJ,CAAK,EAC7BG,GAAWR,EAAM,CACf,EAAGU,EAAO,EACV,EAAGA,EAAO,EACV,OAAQ,EACR,OAAQ,CACV,EAAG,CACD,OAAQA,EAAO,OACf,OAAQA,EAAO,OACf,SAAUA,EAAO,QACnB,EAAGnF,EAAY4E,CAAQ,CACzB,CACA,SAASM,EAAWJ,EAAO,CACzB,IAAIM,EAAWjB,EAAa,MAAM,EAG9BvB,EAAS5C,EAAW,OACpBqF,EAAIP,EACR,OAAI9E,EAAW,wBAA0B,QAAU4C,EAAS,EAAIA,EAAS,KACvEyC,EAAItB,EAAc,EAAIe,GAExBM,EAASrD,EAAS,KAAK,EAAIgD,GAAQM,EAAItB,EAAc,EAAI,IAAOI,EAAapC,EAAS,KAAK,EACpF,CACL,EAAGqD,EAAS,CAAC,EACb,EAAGA,EAAS,CAAC,EACb,OAAQpF,EAAW,YAAY,CAAC,EAChC,OAAQA,EAAW,YAAY,CAAC,EAChC,SAAUA,EAAW,QACvB,CACF,CACF,CACA,SAASsF,IAA2BpF,EAAKN,EAAKI,EAAY4E,EAAU,CAClE,IAAIC,EAAS3E,EAAI,kBACbqF,EAAWrF,EAAI,oBACdqF,EAcHN,GAAWM,EAAU,KAAM,CACzB,EAAGvF,EAAW,aAAa,CAAC,EAC5B,EAAGA,EAAW,aAAa,CAAC,EAC5B,OAAQA,EAAW,YAAY,CAAC,EAChC,OAAQA,EAAW,YAAY,CAAC,EAChC,SAAUA,EAAW,QACvB,EAAGA,EAAY4E,CAAQ,GAnBvBW,EAAWrF,EAAI,oBAAsBsE,IAAWxE,CAAU,EAC1D6E,EAAO,IAAIU,CAAQ,EACnBN,GAAWM,EAAU,CACnB,EAAGvF,EAAW,aAAa,CAAC,EAC5B,EAAGA,EAAW,aAAa,CAAC,EAC5B,OAAQ,EACR,OAAQ,EACR,SAAUA,EAAW,QACvB,EAAG,CACD,OAAQA,EAAW,YAAY,CAAC,EAChC,OAAQA,EAAW,YAAY,CAAC,CAClC,EAAGA,EAAY4E,CAAQ,EAU3B,CAEA,SAASY,IAAsBtF,EAAKF,EAAY4E,EAAU,CACxD,IAAIa,EAAmBnB,EAAO,CAAC,EAAGtE,EAAW,YAAY,EACrD0F,EAAUxF,EAAI,mBACbwF,EAcHT,GAAWS,EAAS,KAAM,CACxB,MAAOD,CACT,EAAGzF,EAAY4E,CAAQ,GAfvBc,EAAUxF,EAAI,mBAAqB,IAAYyF,GAAK,CAClD,GAAI,EACJ,MAAOF,EACP,OAAQ,GACR,MAAO,CACL,OAAQ,cACR,KAAM,cACN,UAAW,CACb,CACF,CAAC,EACDC,EAAQ,gBAAkB,GAC1BxF,EAAI,IAAIwF,CAAO,EAMnB,CACA,SAASE,IAAmB1F,EAAKN,EAAKI,EAAY4E,EAAU,CAE1D,GAAI5E,EAAW,WAAY,CACzB,IAAIW,EAAWT,EAAI,oBACfqE,EAAmBD,EAAO,CAAC,EAAGtE,EAAW,SAAS,EAClD+B,EAAWnC,EAAI,SACfiG,EAAiB7F,EAAW,eAC5BH,EAAYG,EAAW,UAC3B,GAAIW,EACMmF,GAAYnF,EAAU,CAC5B,MAAO4D,CACT,EAAGsB,EAAgBhG,CAAS,MACvB,CACL0E,EAAUxC,EAAS,EAAE,EAAI,EACzBpB,EAAW,IAAYgF,GAAK,CAC1B,MAAOpB,CACT,CAAC,EACDrE,EAAI,kBAAkB,YAAYS,CAAQ,EAC1CT,EAAI,oBAAsBS,EAC1B,IAAIwE,EAAS,CAAC,EACdA,EAAOpD,EAAS,EAAE,EAAI/B,EAAW,UAAU+B,EAAS,EAAE,EACtDgE,GAAQnB,EAAW,cAAgB,WAAW,EAAEjE,EAAU,CACxD,MAAOwE,CACT,EAAGU,EAAgBhG,CAAS,CAC9B,CACF,CACF,CACA,SAASE,IAAaT,EAAMO,EAAW,CACrC,IAAIC,EAAYR,EAAK,aAAaO,CAAS,EAC3C,OAAAC,EAAU,wBAA0BkG,IACpClG,EAAU,mBAAqBwB,IACxBxB,CACT,CACA,SAASkG,IAAwBvB,EAAM,CAErC,MAAO,CACL,MAAOA,EAAK,0BACZ,MAAOA,EAAK,sBACd,CACF,CACA,SAASnD,KAAqB,CAE5B,OAAO,KAAK,YAAY,mBAAmB,GAAK,CAAC,CAAC,KAAK,WAAW,WAAW,CAC/E,CACA,SAASnB,IAAUb,EAAMM,EAAKI,EAAY4E,EAAU,CAElD,IAAI1E,EAAM,IAAY+F,GAElBpB,EAAS,IAAYoB,GACzB,OAAA/F,EAAI,IAAI2E,CAAM,EACd3E,EAAI,kBAAoB2E,EACxBA,EAAO,EAAI7E,EAAW,eAAe,CAAC,EACtC6E,EAAO,EAAI7E,EAAW,eAAe,CAAC,EAClCA,EAAW,aACb2E,IAA4BzE,EAAKN,EAAKI,CAAU,EAEhDsF,IAA2BpF,EAAKN,EAAKI,CAAU,EAEjDwF,IAAsBtF,EAAKF,EAAY4E,CAAQ,EAC/CgB,IAAmB1F,EAAKN,EAAKI,EAAY4E,CAAQ,EACjD1E,EAAI,oBAAsBM,IAAYlB,EAAMU,CAAU,EACtDE,EAAI,sBAAwBF,EACrBE,CACT,CACA,SAASO,IAAUP,EAAKN,EAAKI,EAAY,CACvC,IAAI6F,EAAiB7F,EAAW,eAC5BH,EAAYG,EAAW,UACvB6E,EAAS3E,EAAI,kBACT4F,GAAYjB,EAAQ,CAC1B,EAAG7E,EAAW,eAAe,CAAC,EAC9B,EAAGA,EAAW,eAAe,CAAC,CAChC,EAAG6F,EAAgBhG,CAAS,EACxBG,EAAW,aACb2E,IAA4BzE,EAAKN,EAAKI,EAAY,EAAI,EAEtDsF,IAA2BpF,EAAKN,EAAKI,EAAY,EAAI,EAEvDwF,IAAsBtF,EAAKF,EAAY,EAAI,EAC3C4F,IAAmB1F,EAAKN,EAAKI,EAAY,EAAI,CAC/C,CACA,SAASU,IAAUpB,EAAMO,EAAWgG,EAAgB3F,EAAK,CAEvD,IAAIgG,EAAYhG,EAAI,mBACpBgG,GAAaA,EAAU,kBAAkB,EACzC,IAAIC,EAAQ,CAAC,EACbnB,GAAS9E,EAAK,SAAUuE,EAAM,CAC5B0B,EAAM,KAAK1B,CAAI,CACjB,CAAC,EACDvE,EAAI,qBAAuBiG,EAAM,KAAKjG,EAAI,mBAAmB,EAE7DA,EAAI,sBAAwB2F,EAAiB,MACtCO,EAAKD,EAAO,SAAU1B,EAAM,CACzB4B,GAAc5B,EAAM,CAC1B,OAAQ,EACR,OAAQ,CACV,EAAGoB,EAAgBhG,EAAW,UAAY,CACxCK,EAAI,QAAUA,EAAI,OAAO,OAAOA,CAAG,CACrC,CAAC,CACH,CAAC,EACDZ,EAAK,iBAAiBO,EAAW,IAAI,CACvC,CACA,SAASW,IAAYlB,EAAMU,EAAY,CACrC,MAAO,CAACV,EAAK,cAAcU,EAAW,UAAW,QAAQ,GAAK,OAAQ,CAAC,CAACA,EAAW,aAAc,CAAC,CAACA,EAAW,UAAU,EAAE,KAAK,GAAG,CACpI,CACA,SAASgF,GAAS9E,EAAKoG,EAAIC,EAAS,CAE3BH,EAAKlG,EAAI,kBAAkB,SAAS,EAAG,SAAUsG,EAAI,CAC1DA,IAAOtG,EAAI,oBAAsBoG,EAAG,KAAKC,EAASC,CAAE,CACtD,CAAC,CACH,CACA,SAASvB,GAAWuB,EAAIC,EAAgBC,EAAgB1G,EAAY4E,EAAU0B,EAAI,CAChFG,GAAkBD,EAAG,KAAKC,CAAc,EAEpCzG,EAAW,YAAc,CAAC4E,EAC5B8B,GAAkBF,EAAG,KAAKE,CAAc,EAExCA,GAAkBX,GAAQnB,EAAW,cAAgB,WAAW,EAAE4B,EAAIE,EAAgB1G,EAAW,eAAgBA,EAAW,UAAWsG,CAAE,CAE7I,CACA,SAASlG,IAAaF,EAAKN,EAAKI,EAAY,CAC1C,IAAIH,EAAYG,EAAW,UACvBF,EAAYE,EAAW,UAGvB2G,EAAgB7G,EAAU,SAAS,UAAU,EAC7C8G,EAAgBD,EAAc,SAAS,WAAW,EAAE,aAAa,EACjEE,EAAY/G,EAAU,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,aAAa,EACnEgH,EAAchH,EAAU,SAAS,CAAC,SAAU,WAAW,CAAC,EAAE,aAAa,EACvEiH,EAAcjH,EAAU,WAAW,QAAQ,EAC3CkH,EAAQL,EAAc,IAAI,OAAO,EACjCM,EAAYN,EAAc,IAAI,WAAW,EACzCO,EAAaP,EAAc,IAAI,OAAO,EAC1C3B,GAAS9E,EAAK,SAAUuE,EAAM,CAC5B,GAAIA,aAAgB0C,GAAS,CAC3B,IAAIC,EAAY3C,EAAK,MACrBA,EAAK,SAAgBH,EAAO,CAE1B,MAAO8C,EAAU,MACjB,EAAGA,EAAU,EACb,EAAGA,EAAU,EACb,MAAOA,EAAU,MACjB,OAAQA,EAAU,MACpB,EAAGpH,EAAW,KAAK,CAAC,CACtB,MACEyE,EAAK,SAASzE,EAAW,KAAK,EAEhC,IAAIqH,EAAgB5C,EAAK,YAAY,UAAU,EAC/C4C,EAAc,MAAQT,EAClBM,IAEFG,EAAc,OAAS5C,EAAK,OAAS,IACrC4C,EAAc,OAAS5C,EAAK,OAAS,KAEvCA,EAAK,YAAY,MAAM,EAAE,MAAQoC,EACjCpC,EAAK,YAAY,QAAQ,EAAE,MAAQqC,EACnCC,IAAgBtC,EAAK,OAASsC,GAC9BtC,EAAK,GAAKzE,EAAW,EACvB,CAAC,EACD,IAAIsH,EAAqB1H,EAAI,SAAS,QAAQ,EAAEI,EAAW,eAAiB,EAAE,EAC1E0F,EAAUxF,EAAI,mBAClBwF,EAAQ,WAAa,GACrB6B,GAAc7B,EAAS8B,GAAqB1H,CAAS,EAAG,CACtD,aAAcF,EAAI,YAClB,eAAgBC,EAChB,YAAa4H,GAAgB7H,EAAI,YAAY,QAAQ,EAAGC,CAAS,EACjE,aAAcG,EAAW,MAAM,KAC/B,eAAgBA,EAAW,MAAM,QACjC,uBAAwBsH,CAC1B,CAAC,EACDI,GAAoBxH,EAAK8G,EAAOC,EAAWN,EAAc,IAAI,UAAU,CAAC,CAC1E,CACA,SAAS3C,IAAW2D,EAAO,CACzB,IAAIC,EAAe,KAAK,MAAMD,CAAK,EAEnC,OAAO,KAAK,IAAIA,EAAQC,CAAY,EAAI,KAAOA,EAAe,KAAK,KAAKD,CAAK,CAC/E,CACA,IAAOE,IAAQ/I,ICxkBf,IAAIgJ,KAAuC,SAAUC,EAAQ,CAC3DC,EAAUF,EAAyBC,CAAM,EACzC,SAASD,GAA0B,CACjC,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAwB,KACrCG,EAAM,gBAAkB,GACxBA,EAAM,cAAgB,YACfA,CACT,CACA,OAAAH,EAAwB,UAAU,eAAiB,SAAUI,EAAQ,CAEnE,OAAAA,EAAO,MAAQ,KACRH,EAAO,UAAU,eAAe,MAAM,KAAM,SAAS,CAC9D,EACAD,EAAwB,KAAO,sBAC/BA,EAAwB,aAAe,CAAC,MAAM,EAC9CA,EAAwB,cAAgBK,GAAqBC,GAAmB,cAAe,CAC7F,OAAQ,SACR,WAAY,KACZ,aAAc,KACd,eAAgB,KAChB,aAAc,KACd,aAAc,KACd,aAAc,GACd,sBAAuB,MACvB,WAAY,GACZ,mBAAoB,KACpB,kBAAmB,IACnB,OAAQ,QAGR,KAAM,GAGN,YAAa,EACb,SAAU,CAGR,MAAO,EACT,EACA,OAAQ,CACN,UAAW,CACT,YAAaC,EAAO,MAAM,OAC5B,CACF,CACF,CAAC,EACMP,CACT,GAAEM,EAAkB,EACbE,IAAQR,IChDR,SAASS,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAgB,EAC5CD,EAAU,oBAAoBE,GAAuB,EACrDF,EAAU,eAAeA,EAAU,SAAS,OAAO,OAAQG,GAAMC,GAAQ,cAAc,CAAC,EAExFJ,EAAU,eAAeA,EAAU,SAAS,OAAO,mBAAoBK,GAAwB,cAAc,CAAC,CAChH,CCDA,IAAIC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,QAAU,CAAC,EACVA,CACT,CACA,OAAAH,EAAe,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CACrE,IAAIC,EAAOH,EAAY,QAAQ,EAC3BI,EAAO,KACPC,EAAQ,KAAK,MACbC,EAAeN,EAAY,eAAe,EAC1CO,EAAaJ,EAAK,UAAU,YAAY,EACxCK,EAAOD,EAAW,KAClBE,EAAcF,EAAW,YAC7BF,EAAM,EAAI,EACVA,EAAM,EAAIG,EAAK,EAAIC,EAAY,CAAC,EAChC,SAASC,EAAUC,EAAM,CACvB,OAAOA,EAAK,IACd,CACA,IAAIC,EAAa,IAAIC,GAAW,KAAK,eAAiB,CAAC,EAAGP,EAAcI,EAAWA,CAAS,EACxFI,EAAkB,CAAC,EACvBF,EAAW,IAAIG,GAAKC,EAAS,KAAM,KAAK,CAAC,EAAE,OAAOD,GAAKC,EAAS,KAAM,QAAQ,CAAC,EAAE,OAAOD,GAAKC,EAAS,KAAM,QAAQ,CAAC,EAAE,QAAQ,EAC/H,SAASA,EAAQC,EAAQC,EAAKC,EAAQ,CACpC,IAAIC,EAAkBhB,EAAK,QAC3B,GAAIa,IAAW,SAAU,CACvBZ,EAAM,OAAOe,EAAgBF,CAAG,CAAC,EACjC,MACF,CAMA,QALIG,EAAU,CAAC,EACXC,EAAU,CAAC,EACXC,EACAC,EAAUlB,EAAaY,CAAG,EAAE,QAC5BO,EAAI,EACDA,EAAID,EAAQ,OAAQC,IAAK,CAC9B,IAAIC,EAASvB,EAAK,cAAcqB,EAAQC,CAAC,CAAC,EACtCE,EAAID,EAAO,EACXE,EAAKF,EAAO,GACZG,EAAIH,EAAO,EACfL,EAAQ,KAAKM,EAAGC,CAAE,EAClBN,EAAQ,KAAKK,EAAGC,EAAKC,CAAC,EACtBN,EAAQpB,EAAK,cAAcqB,EAAQC,CAAC,EAAG,OAAO,CAChD,CACA,IAAIK,EACAC,EAAa5B,EAAK,cAAcqB,EAAQ,CAAC,CAAC,EAC1CQ,EAAahC,EAAY,SAAS,OAAO,EACzCiC,EAASD,EAAW,IAAI,QAAQ,EAChCE,EAAgBlC,EAAY,SAAS,UAAU,EACnD,GAAIiB,IAAW,MAAO,CACpB,IAAIkB,EAAarB,EAAgBI,CAAG,EAAI,IAAYkB,GACpDN,EAAU,IAAIO,GAAU,CACtB,MAAO,CACL,OAAQhB,EACR,gBAAiBC,EACjB,OAAQ,GACR,gBAAiB,GACjB,iBAAkB,EACpB,EACA,GAAI,CACN,CAAC,EACDa,EAAW,IAAIL,CAAO,EACtBzB,EAAM,IAAI8B,CAAU,EAChBnC,EAAY,mBAAmB,GACjC8B,EAAQ,YAAYQ,IAAoBR,EAAQ,gBAAgB,EAAG9B,EAAa,UAAY,CAC1F8B,EAAQ,eAAe,CACzB,CAAC,CAAC,CAEN,KAAO,CACL,IAAIK,EAAaf,EAAgBD,CAAM,EACvCW,EAAUK,EAAW,QAAQ,CAAC,EAC9B9B,EAAM,IAAI8B,CAAU,EACpBrB,EAAgBI,CAAG,EAAIiB,EACfI,GAAYT,EAAS,CAC3B,MAAO,CACL,OAAQT,EACR,gBAAiBC,CACnB,CACF,EAAGtB,CAAW,EACdwC,GAAaV,CAAO,CACtB,CACAW,GAAcX,EAASY,GAAqB1C,CAAW,EAAG,CACxD,eAAgBwB,EAAQC,EAAI,CAAC,EAC7B,YAAatB,EAAK,QAAQqB,EAAQC,EAAI,CAAC,CAAC,EACxC,aAAcF,EAAM,IACtB,EAAG,CACD,OAAQ,CACN,cAAe,QAEjB,CACF,CAAC,EACDO,EAAQ,cAAc,CACpB,SAAU,KACV,MAAO,EACT,CAAC,EACD,IAAIa,EAAUb,EAAQ,eAAe,EAEjCa,IACFA,EAAQ,EAAIZ,EAAW,EAAIE,EAC3BU,EAAQ,EAAIZ,EAAW,GAAKA,EAAW,EAAI,GAE7CD,EAAQ,SAASP,CAAK,EACtBpB,EAAK,iBAAiBe,EAAKY,CAAO,EAClCc,GAAyBd,EAAS9B,CAAW,EAC7C6C,GAAoBf,EAASI,EAAc,IAAI,OAAO,EAAGA,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACxH,CACA,KAAK,cAAgB5B,EACrB,KAAK,QAAUQ,CACjB,EACAlB,EAAe,KAAO,aACfA,CACT,GAAEkD,EAAS,EAGX,SAASR,IAAoB9B,EAAMR,EAAa+C,EAAI,CAClD,IAAIC,EAAS,IAAYC,GAAK,CAC5B,MAAO,CACL,EAAGzC,EAAK,EAAI,GACZ,EAAGA,EAAK,EAAI,GACZ,MAAO,EACP,OAAQA,EAAK,OAAS,EACxB,CACF,CAAC,EACD,OAAQ0C,GAAUF,EAAQ,CACxB,MAAO,CACL,EAAGxC,EAAK,EAAI,GACZ,MAAOA,EAAK,MAAQ,IACpB,OAAQA,EAAK,OAAS,EACxB,CACF,EAAGR,EAAa+C,CAAE,EACXC,CACT,CACA,IAAOG,IAAQvD,ICpIf,IAAIwD,GAAkB,EAClBC,KAAqC,SAAUC,EAAQ,CACzDC,EAAUF,EAAuBC,CAAM,EACvC,SAASD,GAAwB,CAC/B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAsB,KAC5BG,CACT,CAIA,OAAAH,EAAsB,UAAU,KAAO,SAAUI,EAAQ,CAEvDH,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,EAI3C,KAAK,qBAAuB,IAAII,GAA4BC,GAAK,KAAK,QAAS,IAAI,EAAUA,GAAK,KAAK,WAAY,IAAI,CAAC,CAC1H,EAOAN,EAAsB,UAAU,QAAU,SAAUO,EAAM,CACxD,IAAIC,EAAgBD,EAAK,OAQrBE,EAAgB,CAAC,EAEjBC,EAAcC,GAAUJ,EAAM,SAAUK,EAAM,CAChD,OAAKH,EAAc,eAAeG,EAAK,CAAC,EAAI,EAAE,IAC5CH,EAAcG,EAAK,CAAC,EAAI,EAAE,EAAI,IAEzBA,EAAK,CAAC,CACf,CAAC,EACGC,EAAY,CAAC,EACjBH,EAAY,QAAQ,KAAK,SAAUI,EAAOC,EAAK,CAC7CF,EAAU,KAAK,CACb,KAAME,EACN,SAAUD,CACZ,CAAC,CACH,CAAC,EAED,QADIE,EAAWH,EAAU,OAChBI,EAAI,EAAGA,EAAID,EAAU,EAAEC,EAAG,CAEjC,QADIC,EAASL,EAAUI,CAAC,EAAE,KACjBE,EAAI,EAAGA,EAAIN,EAAUI,CAAC,EAAE,SAAS,OAAQ,EAAEE,EAAG,CACrD,IAAIC,EAAYP,EAAUI,CAAC,EAAE,SAASE,CAAC,EAAE,CAAC,EAAI,GAC9CV,EAAcW,CAAS,EAAIH,CAC7B,CACA,QAASG,KAAaX,EAChBA,EAAc,eAAeW,CAAS,GAAKX,EAAcW,CAAS,IAAMH,IAC1ER,EAAcW,CAAS,EAAIH,EAC3BV,EAAKC,CAAa,EAAI,CAACY,EAAW,EAAGF,CAAM,EAC3CV,IAGN,CACA,OAAOD,CACT,EAMAP,EAAsB,UAAU,eAAiB,SAAUI,EAAQiB,EAAS,CAY1E,QAXIC,EAAkB,KAAK,uBAAuB,aAAcC,EAAgB,EAAE,OAAO,CAAC,EACtFC,EAAWF,EAAgB,IAAI,MAAM,EAErCG,EAAoBC,GAAOtB,EAAO,KAAM,SAAUuB,EAAU,CAC9D,OAAOA,EAAS,CAAC,IAAM,MACzB,CAAC,EAEGpB,EAAO,KAAK,QAAQkB,GAAc,CAAC,CAAC,EACpCG,EAAW,CAAC,EACZC,EAAU,KAAK,QAAiBC,GAAc,EAC9CC,EAAQ,EACHC,EAAI,EAAGA,EAAIzB,EAAK,OAAQ,EAAEyB,EACjCJ,EAAS,KAAKrB,EAAKyB,CAAC,EAAEjC,EAAe,CAAC,EACjC8B,EAAQ,IAAItB,EAAKyB,CAAC,EAAEjC,EAAe,CAAC,IACvC8B,EAAQ,IAAItB,EAAKyB,CAAC,EAAEjC,EAAe,EAAGgC,CAAK,EAC3CA,KAGJ,IAAIE,EAAaC,GAAwB3B,EAAM,CAC7C,gBAAiB,CAAC,QAAQ,EAC1B,iBAAkB,CAAC,CACjB,KAAM,OACN,KAAM4B,GAAuBX,CAAQ,CACvC,EAAG,CACD,KAAM,QACN,KAAM,OACR,EAAG,CACD,KAAM,OACN,KAAM,SACR,CAAC,EACD,aAAc,CACZ,OAAQ,EACR,MAAO,EACP,SAAU,CACZ,CACF,CAAC,EAAE,WACCY,EAAO,IAAIC,GAAWJ,EAAY,IAAI,EAC1C,OAAAG,EAAK,SAAS7B,CAAI,EACX6B,CACT,EAKApC,EAAsB,UAAU,eAAiB,UAAY,CAI3D,QAHIO,EAAO,KAAK,QAAQ,EACpB+B,EAAW/B,EAAK,MAAM,EACtBgC,EAAW,CAAC,EACPP,EAAI,EAAGA,EAAIM,EAAU,EAAEN,EAC9BO,EAASP,CAAC,EAAIA,EAEhB,IAAIQ,EAAUjC,EAAK,aAAa,QAAQ,EAEpCG,EAAcC,GAAU4B,EAAU,SAAUE,EAAO,CACrD,OAAOlC,EAAK,IAAI,OAAQkC,CAAK,CAC/B,CAAC,EACGC,EAAc,CAAC,EACnB,OAAAhC,EAAY,QAAQ,KAAK,SAAUI,EAAOC,EAAK,CAC7CD,EAAM,KAAK,SAAU6B,EAAQC,EAAQ,CACnC,OAAOrC,EAAK,IAAIiC,EAASG,CAAM,EAAIpC,EAAK,IAAIiC,EAASI,CAAM,CAC7D,CAAC,EACDF,EAAY,KAAK,CACf,KAAM3B,EACN,QAASD,CACX,CAAC,CACH,CAAC,EACM4B,CACT,EAIA1C,EAAsB,UAAU,mBAAqB,SAAU6C,EAAKC,EAAOC,EAAU,CACvEC,EAAQH,CAAG,IACrBA,EAAMA,EAAM,CAACA,CAAG,EAAI,CAAC,GAOvB,QALItC,EAAO,KAAK,QAAQ,EACpBmC,EAAc,KAAK,eAAe,EAClCO,EAAU,CAAC,EACXjC,EAAW0B,EAAY,OACvBQ,EACKlB,EAAI,EAAGA,EAAIhB,EAAU,EAAEgB,EAAG,CAIjC,QAHImB,EAAU,OAAO,UACjBC,EAAa,GACbC,EAAWX,EAAYV,CAAC,EAAE,QAAQ,OAC7Bb,EAAI,EAAGA,EAAIkC,EAAU,EAAElC,EAAG,CACjC,IAAImC,EAAW/C,EAAK,IAAIsC,EAAI,CAAC,EAAGH,EAAYV,CAAC,EAAE,QAAQb,CAAC,CAAC,EACrDoC,EAAO,KAAK,IAAID,EAAWR,CAAK,EAChCS,GAAQJ,IACVD,EAAeI,EACfH,EAAUI,EACVH,EAAaV,EAAYV,CAAC,EAAE,QAAQb,CAAC,EAEzC,CACA8B,EAAQ,KAAKG,CAAU,CACzB,CACA,MAAO,CACL,YAAaH,EACb,aAAcC,CAChB,CACF,EACAlD,EAAsB,UAAU,cAAgB,SAAUwD,EAAWC,EAAgBC,EAAU,CAC7F,IAAInD,EAAO,KAAK,QAAQ,EACpBoD,EAAOpD,EAAK,QAAQiD,CAAS,EAC7BV,EAAQvC,EAAK,IAAIA,EAAK,aAAa,OAAO,EAAGiD,CAAS,EAC1D,OAAOI,GAAoB,YAAa,CACtC,KAAMD,EACN,MAAOb,CACT,CAAC,CACH,EACA9C,EAAsB,KAAO,oBAC7BA,EAAsB,aAAe,CAAC,YAAY,EAClDA,EAAsB,cAAgB,CAEpC,EAAG,EACH,QAAS,OACT,iBAAkB,aAElB,YAAa,CAAC,MAAO,KAAK,EAE1B,gBAAiB,EACjB,gBAAiB,SACjB,MAAO,CACL,OAAQ,EACR,KAAM,GACN,SAAU,OACV,SAAU,EACZ,EACA,SAAU,CACR,MAAO,CACL,KAAM,EACR,CACF,CACF,EACOA,CACT,GAAE6D,EAAW,EACNC,IAAQ9D,ICtNA,SAAR+D,GAAkCC,EAASC,EAAK,CACrDD,EAAQ,iBAAiB,aAAc,SAAUE,EAAa,CAC5D,IAAIC,EAAOD,EAAY,QAAQ,EAC3BE,EAASF,EAAY,iBACrBG,EAAa,CAAC,EAEdC,EAAOF,EAAO,QAAQ,EAC1BC,EAAW,KAAOC,EAClB,IAAIC,EAAcL,EAAY,IAAI,aAAa,EAC3CM,EAAOJ,EAAO,QAAQ,EAE1B,GADAC,EAAW,YAAcE,EACrBC,EAAK,SAAW,aAAc,CAChCD,EAAY,CAAC,EAAeE,GAAaF,EAAY,CAAC,EAAGD,EAAK,MAAM,EACpEC,EAAY,CAAC,EAAeE,GAAaF,EAAY,CAAC,EAAGD,EAAK,MAAM,EACpE,IAAII,EAASJ,EAAK,OAASC,EAAY,CAAC,EAAIA,EAAY,CAAC,EACzDI,IAAmBR,EAAMD,EAAaQ,CAAM,CAC9C,KAAO,CACLH,EAAY,CAAC,EAAeE,GAAaF,EAAY,CAAC,EAAGD,EAAK,KAAK,EACnEC,EAAY,CAAC,EAAeE,GAAaF,EAAY,CAAC,EAAGD,EAAK,KAAK,EACnE,IAAIM,EAAQN,EAAK,MAAQC,EAAY,CAAC,EAAIA,EAAY,CAAC,EACvDI,IAAmBR,EAAMD,EAAaU,CAAK,CAC7C,CACAT,EAAK,UAAU,aAAcE,CAAU,CACzC,CAAC,CACH,CAQA,SAASM,IAAmBR,EAAMD,EAAaQ,EAAQ,CACrD,GAAKP,EAAK,MAAM,EAuBhB,QApBIU,EAAWX,EAAY,iBAEvBY,EAAcZ,EAAY,eAAe,EAEzCa,EAAUZ,EAAK,aAAa,QAAQ,EACpCa,EAAWb,EAAK,aAAa,OAAO,EACpCc,EAAqBC,EAAIJ,EAAa,SAAUK,EAAa,CAC/D,OAAcD,EAAIC,EAAY,QAAS,SAAUC,EAAK,CACpD,IAAIC,EAAKR,EAAS,YAAYV,EAAK,IAAIY,EAASK,CAAG,CAAC,EACpD,OAAAC,EAAG,CAAC,EAAIlB,EAAK,IAAIa,EAAUI,CAAG,EACvBC,CACT,CAAC,CACH,CAAC,EACGC,EAAOC,IAAgBN,CAAW,EAClCO,EAAWF,EAAK,GAChBG,EAAKf,EAASY,EAAK,IAEnBI,EAAIZ,EAAY,OAChBa,EAAIb,EAAY,CAAC,EAAE,QAAQ,OAC3Bc,EACKC,EAAI,EAAGA,EAAIF,EAAG,EAAEE,EAAG,CAC1BD,EAASJ,EAASK,CAAC,EAAIJ,EACvBtB,EAAK,cAAcW,EAAY,CAAC,EAAE,QAAQe,CAAC,EAAG,CAC5C,WAAY,EACZ,EAAGZ,EAAY,CAAC,EAAEY,CAAC,EAAE,CAAC,EACtB,GAAID,EACJ,EAAGX,EAAY,CAAC,EAAEY,CAAC,EAAE,CAAC,EAAIJ,CAC5B,CAAC,EACD,QAASK,EAAI,EAAGA,EAAIJ,EAAG,EAAEI,EACvBF,GAAUX,EAAYa,EAAI,CAAC,EAAED,CAAC,EAAE,CAAC,EAAIJ,EACrCtB,EAAK,cAAcW,EAAYgB,CAAC,EAAE,QAAQD,CAAC,EAAG,CAC5C,WAAYC,EACZ,EAAGb,EAAYa,CAAC,EAAED,CAAC,EAAE,CAAC,EACtB,GAAID,EACJ,EAAGX,EAAYa,CAAC,EAAED,CAAC,EAAE,CAAC,EAAIJ,CAC5B,CAAC,CAEL,CACF,CAOA,SAASF,IAAgBpB,EAAM,CAM7B,QALI4B,EAAW5B,EAAK,OAChB6B,EAAW7B,EAAK,CAAC,EAAE,OACnB8B,EAAO,CAAC,EACRC,EAAK,CAAC,EACNC,EAAM,EACDL,EAAI,EAAGA,EAAIE,EAAU,EAAEF,EAAG,CAEjC,QADIM,EAAO,EACFP,EAAI,EAAGA,EAAIE,EAAU,EAAEF,EAC9BO,GAAQjC,EAAK0B,CAAC,EAAEC,CAAC,EAAE,CAAC,EAElBM,EAAOD,IACTA,EAAMC,GAERH,EAAK,KAAKG,CAAI,CAChB,CACA,QAASC,EAAI,EAAGA,EAAIL,EAAU,EAAEK,EAC9BH,EAAGG,CAAC,GAAKF,EAAMF,EAAKI,CAAC,GAAK,EAE5BF,EAAM,EACN,QAASG,EAAI,EAAGA,EAAIN,EAAU,EAAEM,EAAG,CACjC,IAAIC,EAAMN,EAAKK,CAAC,EAAIJ,EAAGI,CAAC,EACpBC,EAAMJ,IACRA,EAAMI,EAEV,CACA,MAAO,CACL,GAAIL,EACJ,IAAKC,CACP,CACF,CC/HO,SAASK,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAc,EAC1CD,EAAU,oBAAoBE,GAAqB,EACnDF,EAAU,eAAeG,EAAgB,EACzCH,EAAU,kBAAkBI,GAAW,YAAY,CAAC,CACtD,CCoBA,IAAIC,IAAmB,EACnBC,IAAiB,EAIjBC,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,EAAcG,EAAMC,EAAaC,EAASC,EAAK,CACtD,IAAIC,EAAQN,EAAO,KAAK,IAAI,GAAK,KACjCM,EAAM,GAAKT,IACXS,EAAM,WAAa,CACjB,OAAQ,EACV,EACAC,GAAUD,CAAK,EAAE,YAAcH,EAAY,YAC3C,IAAIK,EAAO,IAAYC,GAAK,CAC1B,GAAIX,IACJ,OAAQI,EAAK,SAAS,EAAE,IAAI,CAAC,QAAS,QAAQ,CAAC,CACjD,CAAC,EACD,OAAAI,EAAM,eAAeE,CAAI,EACzBF,EAAM,WAAW,GAAMJ,EAAMC,EAAaC,EAASC,CAAG,EAC/CC,CACT,CACA,OAAAP,EAAc,UAAU,WAAa,SAAUW,EAAaR,EAE5DC,EAAaC,EAASC,EAAK,CACzB,KAAK,KAAOH,EACZA,EAAK,MAAQ,KACbC,EAAcA,GAAe,KAAK,aAClCC,EAAUA,GAAW,KAAK,SAC1B,IAAIO,EAAS,KACbJ,GAAUI,CAAM,EAAE,UAAYT,EAAK,UACnC,IAAIU,EAAYV,EAAK,SAAS,EAC1BW,EAAgBD,EAAU,SAAS,UAAU,EAC7CE,EAASZ,EAAK,UAAU,EACxBa,EAAqBC,EAAO,CAAC,EAAGF,CAAM,EAC1CC,EAAY,MAAQ,KACpB,IAAIE,EAAcf,EAAK,UAAU,OAAO,EACxCe,EAAY,SAAW,QACvB,IAAIC,EAAQhB,EAAK,UAAU,OAAO,EAC9BgB,IACFD,EAAY,MAAQE,GAA+BD,EAAOb,CAAG,GAE/D,IAAIe,EAAeC,GAAsBT,EAAU,SAAS,WAAW,EAAGG,EAAa,EAAI,EACpFC,EAAOD,EAAaK,CAAY,EAChCE,EAAKC,GAAgB,SAAUC,EAAW,CAC/C,IAAIC,EAAQd,EAAO,YAAYa,CAAS,EACpCE,EAAiBd,EAAU,SAAS,CAACY,EAAW,WAAW,CAAC,EAChEC,EAAM,MAAQC,EAAe,aAAa,EAE1C,IAAIN,EAAeC,GAAsBK,EAAgBX,CAAW,EAChEK,IACFK,EAAM,MAAQL,EAElB,CAAC,EACGV,GACFC,EAAO,SAASI,CAAW,EAC3BJ,EAAO,MAAM,EAAIG,EAAO,GAChBa,GAAUhB,EAAQ,CACxB,MAAO,CACL,EAAGG,EAAO,CACZ,CACF,EAAGX,EAAaD,EAAK,SAAS,IAItB0B,GAAYjB,EAAQ,CAC1B,MAAOI,CACT,EAAGZ,CAAW,EACd0B,GAAalB,CAAM,GAErBA,EAAO,SAASM,CAAW,EAC3B,KAAK,aAAad,CAAW,EAC7B,IAAI2B,EAAclB,EAAU,WAAW,QAAQ,EAC/CkB,GAAenB,EAAO,KAAK,SAAUmB,CAAW,EAChD,KAAK,aAAe3B,GAAe,KAAK,aACxC,KAAK,SAAWC,GAAW,KAAK,SAChC,IAAI2B,EAAQlB,EAAc,IAAI,OAAO,EACjCmB,EAAiBD,IAAU,WAAoBE,GAAY/B,EAAK,oBAAoB,EAAGA,EAAK,qBAAqB,CAAC,EAAI6B,IAAU,WAAa7B,EAAK,oBAAoB,EAAI6B,IAAU,aAAe7B,EAAK,qBAAqB,EAAI6B,EACrOG,GAAoB,KAAMF,EAAgBnB,EAAc,IAAI,WAAW,EAAGA,EAAc,IAAI,UAAU,CAAC,CACzG,EACAd,EAAc,UAAU,aAAe,SAAUI,EAAa,CAC5D,IAAIG,EAAQ,KACRM,EAAY,KAAK,KAAK,SAAS,EAC/BuB,EAAmBvB,EAAU,SAAS,OAAO,EAC7CE,EAAS,KAAK,KAAK,UAAU,EAC7BsB,EAAQtB,EAAO,SAAWA,EAAO,WACjCuB,GAAYvB,EAAO,WAAaA,EAAO,UAAY,EACnDwB,EAAK,KAAK,IAAID,CAAQ,EACtBE,EAAK,KAAK,IAAIF,CAAQ,EACtB1B,EAAS,KACT6B,EAAQ7B,EAAO,eAAe,EAC9B8B,EAAY,KAAK,KAAK,UACtBC,EAAgBP,EAAiB,IAAI,UAAU,EAAI,IAAM,KAAK,GAC9DQ,EAAgBR,EAAiB,IAAI,MAAM,GAAK,EAAEO,GAAiB,MAAQ,KAAK,IAAIN,CAAK,EAAIM,GACjGF,EAAM,OAAS,CAACG,EAETrB,EAAKsB,GAAgB,SAAUpB,EAAW,CAC/C,IAAIqB,EAAkBrB,IAAc,SAAWZ,EAAU,SAAS,OAAO,EAAIA,EAAU,SAAS,CAACY,EAAW,OAAO,CAAC,EAChHsB,EAAWtB,IAAc,SACzBC,EAAQqB,EAAWN,EAAQA,EAAM,YAAYhB,CAAS,EACtDhB,EAAOL,EAAY,kBAAkBsC,EAAWjB,CAAS,EACzDsB,IACFtC,EAAOA,GAAQF,EAAM,KAAK,MAE5BmB,EAAM,MAAQsB,GAAgBF,EAAiB,CAAC,EAAG,KAAMrB,IAAc,SAAU,EAAI,EACjFhB,IACFiB,EAAM,MAAM,KAAOjB,GAGrB,IAAIwC,EAAUH,EAAgB,IAAI,MAAM,EACpCG,GAAW,MAAQ,CAACF,IACtBrB,EAAM,OAAS,CAACuB,GAElB,IAAIC,EAAgBC,EAAaL,EAAiB,UAAU,EACxDM,EAAcL,EAAWnC,EAASA,EAAO,OAAOa,CAAS,EACzD4B,EAAaD,EAAY,MAAM,KACnCA,EAAY,WAAa,CACvB,YAAaN,EAAgB,IAAI,OAAO,IAAM,UAAYO,EAAa,KACvE,OAAQH,IAAkB,SAC5B,EACA,IAAII,EACAC,EAAeJ,EAAaL,EAAiB,UAAU,GAAK,EAC5DU,EAAYL,EAAaL,EAAiB,OAAO,EACjDW,EAAaN,EAAaL,EAAiB,QAAQ,EACnDY,EAAiB,KAAK,GAAK,GAC3BC,EAAe,KAAK,GAAK,IACzBC,EAAiBC,GAAgBJ,IAAe,aAAe,KAAK,GAAK,EAAInB,EAAWA,CAAQ,EAGhGwB,EAAYF,EAAiBF,GAAkB,CAACK,GAAmBH,EAAiBF,CAAc,GAAKE,EAAiBD,EACxHT,IAAkB,WACpBI,EAAIvC,EAAO,EAAIwC,EACfC,EAAYM,EAAY,QAAU,QAE9B,CAACN,GAAaA,IAAc,UAE1BnB,IAAU,EAAI,KAAK,IAAMtB,EAAO,KAAO,EACzCuC,EAAI,EAEJA,GAAKvC,EAAO,EAAIA,EAAO,IAAM,EAE/ByC,EAAY,UACHA,IAAc,QACvBF,EAAIvC,EAAO,GAAKwC,EAChBC,EAAYM,EAAY,QAAU,QACzBN,IAAc,UACvBF,EAAIvC,EAAO,EAAIwC,EACfC,EAAYM,EAAY,OAAS,SAGrCpC,EAAM,MAAM,MAAQ8B,EACpB9B,EAAM,MAAM,cAAgByB,EAAaL,EAAiB,eAAe,GAAK,SAC9EpB,EAAM,EAAI4B,EAAIf,EAAKxB,EAAO,GAC1BW,EAAM,EAAI4B,EAAId,EAAKzB,EAAO,GAC1B,IAAIiD,EAAS,EACTP,IAAe,SACjBO,EAASH,GAAgB,CAACvB,CAAQ,GAAKwB,EAAY,KAAK,GAAK,GACpDL,IAAe,aACxBO,EAASH,GAAgB,KAAK,GAAK,EAAIvB,CAAQ,GAAKwB,EAAY,KAAK,GAAK,GAC1DG,GAASR,CAAU,IACnCO,EAASP,EAAa,KAAK,GAAK,KAElC/B,EAAM,SAAWmC,GAAgBG,CAAM,CACzC,CAAC,EACD,SAASb,EAAae,EAAOC,EAAM,CACjC,IAAIC,EAAYF,EAAM,IAAIC,CAAI,EAC9B,OAAIC,GACKhC,EAAiB,IAAI+B,CAAI,CAGpC,CACA1B,EAAM,WAAW,CACnB,EACOzC,CACT,GAAUqE,EAAM,EACTC,GAAQtE,ICvLR,IAAIuE,GAAsB,qBAC7BC,IAAmB,oBACnBC,IAAqB,sBAClB,SAASC,IAAsBC,EAAW,CAC/CA,EAAU,eAAe,CACvB,KAAMJ,GACN,OAAQ,YACV,EAAG,SAAUK,EAASC,EAAS,CAC7BA,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,WACT,MAAOD,CACT,EAAGE,CAAgB,EACnB,SAASA,EAAiBC,EAAOC,EAAO,CACtC,IAAIC,EAAaC,GAAmBN,EAAS,CAACL,EAAmB,EAAGQ,CAAK,EACzE,GAAIE,EAAY,CACd,IAAIE,EAAiBJ,EAAM,YAAY,EACnCI,IACFP,EAAQ,UAAYQ,GAAcD,EAAgBF,EAAW,IAAI,EAAI,SAAW,aAElFF,EAAM,cAAcE,EAAW,IAAI,CACrC,CACF,CACF,CAAC,EACDN,EAAU,eAAe,CACvB,KAAMH,IACN,OAAQ,MACV,EAAG,SAAUI,EAASC,EAASQ,EAAK,CAElCT,EAAUU,EAAO,CAAC,EAAGV,CAAO,EAC5BC,EAAQ,cAAc,CACpB,SAAU,SACV,QAAS,WACT,MAAOD,CACT,EAAGW,CAAe,EAClB,SAASA,EAAgBR,EAAO,CAC9B,IAAIE,EAAaC,GAAmBN,EAAS,CAACJ,GAAgB,EAAGO,CAAK,EAClEE,IACFL,EAAQ,UAAYK,EAAW,KAAK,UAExC,CAKAI,EAAI,eAAeC,EAAOV,EAAS,CACjC,KAAM,WACR,CAAC,CAAC,CACJ,CAAC,EACDD,EAAU,eAAe,CACvB,KAAMF,IACN,OAAQ,YACV,EAAG,SAAUG,EAASC,EAASQ,EAAK,CAClCT,EAAUU,EAAO,CAAC,EAAGV,CAAO,EAI5BS,EAAI,eAAeC,EAAOV,EAAS,CACjC,KAAM,UACR,CAAC,CAAC,CACJ,CAAC,CACH,CCzDA,IAAIY,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAEhEC,EAAS,CACP,IAAIC,EAAO,KACX,KAAK,YAAcJ,EACnB,KAAK,IAAME,EACX,KAAK,QAAUD,EACf,IAAII,EAAOL,EAAY,QAAQ,EAC3BM,EAAcD,EAAK,KAAK,KACxBE,EAAUP,EAAY,YAAY,EAClCQ,EAAQ,KAAK,MACbC,EAAyBT,EAAY,IAAI,wBAAwB,EACjEU,EAAc,CAAC,EACnBH,EAAQ,SAAS,SAAUI,EAAM,CAC/BD,EAAY,KAAKC,CAAI,CACvB,CAAC,EACD,IAAIC,EAAc,KAAK,cAAgB,CAAC,EACxCC,EAAWH,EAAaE,CAAW,EACnCE,EAAaR,EAAaC,CAAO,EACjC,KAAK,YAAY,EACjB,KAAK,aAAeG,EACpB,SAASG,EAAWH,EAAaE,EAAa,CAC5C,GAAIF,EAAY,SAAW,GAAKE,EAAY,SAAW,EACrD,OAEF,IAAIG,GAAWH,EAAaF,EAAaM,EAAQA,CAAM,EAAE,IAAIC,CAAW,EAAE,OAAOA,CAAW,EAAE,OAAcC,GAAMD,EAAa,IAAI,CAAC,EAAE,QAAQ,EAC9I,SAASD,EAAOL,EAAM,CACpB,OAAOA,EAAK,MAAM,CACpB,CACA,SAASM,EAAYE,EAAQC,EAAQ,CACnC,IAAIC,EAAUF,GAAU,KAAO,KAAOT,EAAYS,CAAM,EACpDG,EAAUF,GAAU,KAAO,KAAOR,EAAYQ,CAAM,EACxDG,EAAaF,EAASC,CAAO,CAC/B,CACF,CACA,SAASC,EAAaF,EAASC,EAAS,CAKtC,GAJI,CAACb,GAA0BY,GAAW,CAACA,EAAQ,SAAS,IAE1DA,EAAU,MAERA,IAAYf,GAAegB,IAAYhB,GACzC,GAAIgB,GAAWA,EAAQ,MACjBD,GAEFC,EAAQ,MAAM,WAAW,GAAOD,EAASrB,EAAaC,EAASC,CAAG,EAElEG,EAAK,iBAAiBgB,EAAQ,UAAWC,EAAQ,KAAK,GAGtDE,EAAWF,CAAO,UAEXD,EAAS,CAElB,IAAII,EAAQ,IAAIC,GAAcL,EAASrB,EAAaC,EAASC,CAAG,EAChEM,EAAM,IAAIiB,CAAK,EAEfpB,EAAK,iBAAiBgB,EAAQ,UAAWI,CAAK,CAChD,EAEJ,CACA,SAASD,EAAWb,EAAM,CACnBA,GAGDA,EAAK,QACPH,EAAM,OAAOG,EAAK,KAAK,EACvBA,EAAK,MAAQ,KAEjB,CACA,SAASG,EAAaR,EAAaqB,EAAU,CACvCA,EAAS,MAAQ,GAEfvB,EAAK,aAEPA,EAAK,aAAa,WAAW,GAAOE,EAAaN,EAAaC,EAASC,CAAG,GAG1EE,EAAK,aAAe,IAAIsB,GAAcpB,EAAaN,EAAaC,EAASC,CAAG,EAC5EM,EAAM,IAAIJ,EAAK,YAAY,GAG7BuB,EAAS,MAAM,IAAI,OAAO,EAC1BvB,EAAK,aAAa,GAAG,QAAS,SAAUwB,EAAG,CACzCxB,EAAK,YAAYuB,EAAS,UAAU,CACtC,CAAC,GACQvB,EAAK,eAEdI,EAAM,OAAOJ,EAAK,YAAY,EAC9BA,EAAK,aAAe,KAExB,CACF,EAIAR,EAAa,UAAU,YAAc,UAAY,CAC/C,IAAIG,EAAQ,KACZ,KAAK,MAAM,IAAI,OAAO,EACtB,KAAK,MAAM,GAAG,QAAS,SAAU6B,EAAG,CAClC,IAAIC,EAAc,GACdF,EAAW5B,EAAM,YAAY,YAAY,EAC7C4B,EAAS,SAAS,SAAUhB,EAAM,CAChC,GAAI,CAACkB,GAAelB,EAAK,OAASA,EAAK,QAAUiB,EAAE,OAAQ,CACzD,IAAIE,EAAYnB,EAAK,SAAS,EAAE,IAAI,WAAW,EAC/C,GAAImB,IAAc,aAChB/B,EAAM,YAAYY,CAAI,UACbmB,IAAc,OAAQ,CAC/B,IAAIC,EAAYpB,EAAK,SAAS,EAC1BqB,EAAOD,EAAU,IAAI,MAAM,EAC/B,GAAIC,EAAM,CACR,IAAIC,EAAaF,EAAU,IAAI,SAAU,EAAI,GAAK,SAClDG,GAAWF,EAAMC,CAAU,CAC7B,CACF,CACAJ,EAAc,EAChB,CACF,CAAC,CACH,CAAC,CACH,EAIAjC,EAAa,UAAU,YAAc,SAAUe,EAAM,CAC/CA,IAAS,KAAK,YAAY,YAAY,GACxC,KAAK,IAAI,eAAe,CACtB,KAAMwB,GACN,KAAM,KAAK,IACX,SAAU,KAAK,YAAY,GAC3B,WAAYxB,CACd,CAAC,CAEL,EAIAf,EAAa,UAAU,aAAe,SAAUwC,EAAOpC,EAAa,CAClE,IAAIqC,EAAWrC,EAAY,QAAQ,EAC/BsC,EAAaD,EAAS,cAAc,CAAC,EACzC,GAAIC,EAAY,CACd,IAAIC,EAAKH,EAAM,CAAC,EAAIE,EAAW,GAC3BE,EAAKJ,EAAM,CAAC,EAAIE,EAAW,GAC3BG,EAAS,KAAK,KAAKF,EAAKA,EAAKC,EAAKA,CAAE,EACxC,OAAOC,GAAUH,EAAW,GAAKG,GAAUH,EAAW,EACxD,CACF,EACA1C,EAAa,KAAO,WACbA,CACT,GAAE8C,EAAS,EACJC,IAAQ/C,IC3Jf,IAAIgD,KAAmC,SAAUC,EAAQ,CACvDC,EAAUF,EAAqBC,CAAM,EACrC,SAASD,GAAsB,CAC7B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAoB,KACjCG,EAAM,kBAAoB,GACnBA,CACT,CACA,OAAAH,EAAoB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CAExE,IAAIC,EAAO,CACT,KAAMF,EAAO,KACb,SAAUA,EAAO,IACnB,EACAG,IAAkBD,CAAI,EACtB,IAAIE,EAAc,KAAK,aAAsBC,EAAIL,EAAO,QAAU,CAAC,EAAG,SAAUM,EAAa,CAC3F,OAAO,IAAIC,GAAMD,EAAa,KAAML,CAAO,CAC7C,EAAG,IAAI,EAIHO,EAAOC,GAAK,WAAWP,EAAM,KAAMQ,CAAU,EACjD,SAASA,EAAWC,EAAU,CAC5BA,EAAS,WAAW,eAAgB,SAAUC,EAAOC,EAAK,CACxD,IAAIC,EAAON,EAAK,mBAAmBK,CAAG,EAClCE,EAAaX,EAAYU,EAAK,KAAK,EACvC,OAAAC,IAAeH,EAAM,YAAcG,GAC5BH,CACT,CAAC,CACH,CACA,OAAOJ,EAAK,IACd,EACAZ,EAAoB,UAAU,cAAgB,UAAY,CACxD,KAAK,cAAc,CACrB,EAIAA,EAAoB,UAAU,cAAgB,SAAUoB,EAAW,CACjE,IAAIC,EAASpB,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EAC7DiB,EAAO,KAAK,QAAQ,EAAE,KAAK,mBAAmBE,CAAS,EAC3D,OAAAC,EAAO,aAAeC,GAAiBJ,EAAM,IAAI,EAC1CG,CACT,EACArB,EAAoB,UAAU,cAAgB,SAAUkB,EAAM,CAC5D,OAAO,KAAK,cAAgB,KAAK,aAAaA,EAAK,KAAK,CAC1D,EACAlB,EAAoB,UAAU,YAAc,UAAY,CACtD,OAAO,KAAK,SACd,EACAA,EAAoB,UAAU,cAAgB,SAAUuB,EAAU,CAChEA,EAAW,KAAK,UAAYA,EAAWA,EAAW,KAAK,UACvD,IAAIjB,EAAO,KAAK,WAAW,EAAE,KAAK,MAC9B,CAACiB,GAAYA,IAAajB,GAAQ,CAACA,EAAK,SAASiB,CAAQ,KAC3D,KAAK,UAAYjB,EAErB,EACAN,EAAoB,UAAU,gBAAkB,UAAY,CAC1DwB,GAAuB,IAAI,CAC7B,EACAxB,EAAoB,KAAO,kBAC3BA,EAAoB,cAAgB,CAElC,EAAG,EAEH,OAAQ,CAAC,MAAO,KAAK,EACrB,OAAQ,CAAC,EAAG,KAAK,EAEjB,UAAW,GACX,WAAY,GAEZ,SAAU,EAEV,iBAAkB,GAElB,UAAW,aACX,uBAAwB,GACxB,MAAO,CAEL,OAAQ,SACR,KAAM,GACN,QAAS,EAGT,MAAO,SACP,SAAU,SACV,SAAU,EACV,OAAQ,EACV,EACA,UAAW,CACT,YAAa,EACb,YAAa,QACb,WAAY,QACZ,WAAY,EACZ,YAAa,qBACb,cAAe,EACf,cAAe,EACf,QAAS,CACX,EACA,SAAU,CACR,MAAO,YACT,EACA,KAAM,CACJ,UAAW,CACT,QAAS,EACX,EACA,MAAO,CACL,QAAS,EACX,CACF,EAEA,cAAe,YACf,kBAAmB,IACnB,wBAAyB,IACzB,KAAM,CAAC,EAYP,KAAM,MACR,EACOA,CACT,GAAEyB,EAAW,EACb,SAASlB,IAAkBmB,EAAU,CAInC,IAAIC,EAAM,EACHC,EAAKF,EAAS,SAAU,SAAUG,EAAO,CAC9CtB,IAAkBsB,CAAK,EACvB,IAAIC,EAAaD,EAAM,MAEhBE,EAAQD,CAAU,IAAMA,EAAaA,EAAW,CAAC,GACxDH,GAAOG,CACT,CAAC,EACD,IAAIE,EAAYN,EAAS,MACdK,EAAQC,CAAS,IAC1BA,EAAYA,EAAU,CAAC,IAErBA,GAAa,MAAQ,MAAMA,CAAS,KACtCA,EAAYL,GAGVK,EAAY,IACdA,EAAY,GAEPD,EAAQL,EAAS,KAAK,EAAIA,EAAS,MAAM,CAAC,EAAIM,EAAYN,EAAS,MAAQM,CACpF,CACA,IAAOC,IAAQjC,IC/Jf,IAAIkC,IAAS,KAAK,GAAK,IACR,SAARC,GAAgCC,EAAYC,EAASC,EAAK,CAC/DD,EAAQ,iBAAiBD,EAAY,SAAUG,EAAa,CAC1D,IAAIC,EAASD,EAAY,IAAI,QAAQ,EACjCE,EAASF,EAAY,IAAI,QAAQ,EACzBG,EAAQD,CAAM,IACxBA,EAAS,CAAC,EAAGA,CAAM,GAETC,EAAQF,CAAM,IACxBA,EAAS,CAACA,EAAQA,CAAM,GAE1B,IAAIG,EAAQL,EAAI,SAAS,EACrBM,EAASN,EAAI,UAAU,EACvBO,EAAO,KAAK,IAAIF,EAAOC,CAAM,EAC7BE,EAAKC,GAAaP,EAAO,CAAC,EAAGG,CAAK,EAClCK,EAAKD,GAAaP,EAAO,CAAC,EAAGI,CAAM,EACnCK,EAAKF,GAAaN,EAAO,CAAC,EAAGI,EAAO,CAAC,EACrCK,EAAIH,GAAaN,EAAO,CAAC,EAAGI,EAAO,CAAC,EACpCM,EAAa,CAACZ,EAAY,IAAI,YAAY,EAAIL,IAC9CkB,EAAWb,EAAY,IAAI,UAAU,EAAIL,IACzCmB,EAAcd,EAAY,QAAQ,EAAE,KAAK,KACzCe,EAAWf,EAAY,YAAY,EACnCgB,EAAYD,EAAS,MACrBE,EAAOjB,EAAY,IAAI,MAAM,EAC7BiB,GAAQ,MACVC,IAAaH,EAAUE,CAAI,EAE7B,IAAIE,EAAiB,EACdC,EAAKL,EAAS,SAAU,SAAUM,EAAO,CAC9C,CAAC,MAAMA,EAAM,SAAS,CAAC,GAAKF,GAC9B,CAAC,EACD,IAAIG,EAAMP,EAAS,SAAS,EAExBQ,EAAa,KAAK,IAAMD,GAAOH,GAAkB,EACjDK,EAAmBT,EAAS,MAAQ,EACpCU,EAASV,EAAS,QAAUS,EAAmB,GAAK,GACpDE,GAAaf,EAAID,IAAOe,GAAU,GAClCE,EAAY3B,EAAY,IAAI,WAAW,EACvC4B,EAAmB5B,EAAY,IAAI,kBAAkB,EAIrD6B,EAAMF,EAAY,EAAI,GAKtBG,EAAa,SAAUC,EAAMnB,EAAY,CAC3C,GAAKmB,EAGL,KAAIC,EAAWpB,EAEf,GAAImB,IAASjB,EAAa,CAExB,IAAImB,EAAQF,EAAK,SAAS,EACtBG,EAAQZ,IAAQ,GAAKM,EAAmBL,EAAaU,EAAQV,EAC7DW,EAAQrB,IACVqB,EAAQrB,GAMVmB,EAAWpB,EAAaiB,EAAMK,EAC9B,IAAIC,EAAQJ,EAAK,MAAQf,GAAaQ,EAAmB,GAAK,GAC1DY,EAAS1B,EAAKgB,EAAYS,EAC1BE,GAAO3B,EAAKgB,GAAaS,EAAQ,GACjCG,GAAatC,EAAY,cAAc+B,CAAI,EAC/C,GAAIO,GAAY,CACd,IAAIC,GAAOD,GAAW,IAAI,KAAM,EAAI,EAChCE,GAAMF,GAAW,IAAI,IAAK,EAAI,EAC9BG,GAAWH,GAAW,IAAI,SAAU,EAAI,EACxCG,IAAY,OACdF,GAAOE,GAAS,CAAC,EACjBD,GAAMC,GAAS,CAAC,GAElBF,IAAQ,OAASH,EAAS5B,GAAa+B,GAAMjC,EAAO,CAAC,GACrDkC,IAAO,OAASH,GAAO7B,GAAagC,GAAKlC,EAAO,CAAC,EACnD,CACAyB,EAAK,UAAU,CACb,MAAOG,EACP,WAAYtB,EACZ,SAAUoB,EACV,UAAWL,EACX,GAAIpB,EACJ,GAAIE,EACJ,GAAI2B,EACJ,EAAGC,EACL,CAAC,CACH,CAEA,GAAIN,EAAK,UAAYA,EAAK,SAAS,OAAQ,CAEzC,IAAIW,EAAiB,EACdtB,EAAKW,EAAK,SAAU,SAAUA,EAAM,CACzCW,GAAkBZ,EAAWC,EAAMnB,EAAa8B,CAAc,CAChE,CAAC,CACH,CACA,OAAOV,EAAWpB,EACpB,EAEA,GAAIY,EAAkB,CACpB,IAAIY,EAAS1B,EACT2B,EAAO3B,EAAKgB,EACZQ,EAAQ,KAAK,GAAK,EACtBpB,EAAY,UAAU,CACpB,MAAOoB,EACP,WAAYtB,EACZ,SAAUA,EAAasB,EACvB,UAAWP,EACX,GAAIpB,EACJ,GAAIE,EACJ,GAAI2B,EACJ,EAAGC,CACL,CAAC,CACH,CACAP,EAAWf,EAAUH,CAAU,CACjC,CAAC,CACH,CAIA,SAASM,IAAaa,EAAMY,EAAW,CACrC,IAAIC,EAAWb,EAAK,UAAY,CAAC,EACjCA,EAAK,SAAWd,IAAK2B,EAAUD,CAAS,EAEpCC,EAAS,QACJxB,EAAKW,EAAK,SAAU,SAAUV,EAAO,CAC1CH,IAAaG,EAAOsB,CAAS,CAC/B,CAAC,CAEL,CAQA,SAAS1B,IAAK2B,EAAUD,EAAW,CACjC,GAAWE,GAAWF,CAAS,EAAG,CAChC,IAAIG,EAAqBC,EAAIH,EAAU,SAAUvB,EAAO2B,EAAK,CAC3D,IAAIf,EAAQZ,EAAM,SAAS,EAC3B,MAAO,CACL,OAAQ,CACN,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,UAAWA,EAAM,UACjB,SAAU,UAAY,CACpB,OAAOY,CACT,CACF,EACA,MAAOe,CACT,CACF,CAAC,EACD,OAAAF,EAAY,KAAK,SAAUG,EAAGC,EAAG,CAC/B,OAAOP,EAAUM,EAAE,OAAQC,EAAE,MAAM,CACrC,CAAC,EACaH,EAAID,EAAa,SAAUK,EAAQ,CAC/C,OAAOP,EAASO,EAAO,KAAK,CAC9B,CAAC,CACH,KAAO,CACL,IAAIC,EAAUT,IAAc,MAC5B,OAAOC,EAAS,KAAK,SAAUK,EAAGC,EAAG,CACnC,IAAIG,GAAQJ,EAAE,SAAS,EAAIC,EAAE,SAAS,IAAME,EAAU,EAAI,IAC1D,OAAOC,IAAS,GAAKJ,EAAE,UAAYC,EAAE,YAAcE,EAAU,GAAK,GAAKC,CACzE,CAAC,CACH,CACF,CCzKe,SAARC,GAAgCC,EAAS,CAC9C,IAAIC,EAAe,CAAC,EAEpB,SAASC,EAAUC,EAAMC,EAAaC,EAAY,CAChD,GAAIF,EAAK,QAAU,EAEjB,OAAOG,EAAO,MAAM,UAItB,QADIC,EAAUJ,EACPI,GAAWA,EAAQ,MAAQ,GAChCA,EAAUA,EAAQ,WAEpB,IAAIC,EAAQJ,EAAY,oBAAoBG,EAAQ,MAAQA,EAAQ,UAAY,GAAIN,CAAY,EAChG,OAAIE,EAAK,MAAQ,GAAKM,GAASD,CAAK,IAElCA,EAAQE,GAAKF,GAAQL,EAAK,MAAQ,IAAME,EAAa,GAAK,EAAG,GAExDG,CACT,CACAR,EAAQ,iBAAiB,WAAY,SAAUI,EAAa,CAC1D,IAAIO,EAAOP,EAAY,QAAQ,EAC3BQ,EAAOD,EAAK,KAChBC,EAAK,SAAS,SAAUT,EAAM,CAC5B,IAAIU,EAAQV,EAAK,SAAS,EACtBW,EAAQD,EAAM,SAAS,WAAW,EAAE,aAAa,EAChDC,EAAM,OACTA,EAAM,KAAOZ,EAAUC,EAAMC,EAAaQ,EAAK,KAAK,MAAM,GAE5D,IAAIG,EAAcJ,EAAK,uBAAuBR,EAAK,UAAW,OAAO,EACrEa,EAAOD,EAAaD,CAAK,CAC3B,CAAC,CACH,CAAC,CACH,CC7BO,SAASG,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAY,EACxCD,EAAU,oBAAoBE,GAAmB,EACjDF,EAAU,eAAeG,GAAMC,GAAgB,UAAU,CAAC,EAC1DJ,EAAU,kBAAkBG,GAAME,GAAY,UAAU,CAAC,EACzDL,EAAU,eAAeM,EAAc,EACvCC,IAAsBP,CAAS,CACjC,CCRO,IAAIQ,GAAoB,CAC7B,MAAO,OACP,YAAa,QACf,EACWC,IAAyB,CAClC,OAAQ,EACR,WAAY,EACZ,iBAAkB,EAClB,WAAY,EACZ,WAAY,EACZ,MAAO,EACP,MAAO,CACT,EAEWC,GAAmBC,GAAU,EACpCC,KAAiC,SAAUC,EAAQ,CACrDC,EAAUF,EAAmBC,CAAM,EACnC,SAASD,GAAoB,CAC3B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAkB,KACxBG,CACT,CACA,OAAAH,EAAkB,UAAU,cAAgB,UAAY,CACtD,KAAK,cAAgB,KAAK,IAAI,SAAU,EAAI,EAC5C,KAAK,SAAW,KAAK,IAAI,IAAK,EAAI,CACpC,EACAA,EAAkB,UAAU,eAAiB,SAAUI,EAAQC,EAAS,CACtE,OAAOC,GAAiB,KAAM,IAAI,CACpC,EACAN,EAAkB,UAAU,cAAgB,SAAUO,EAAWC,EAAUC,EAAI,CAC7E,IAAIC,EAAST,EAAO,UAAU,cAAc,KAAK,KAAMM,EAAWC,CAAQ,EAC1E,OAAAC,IAAOC,EAAO,KAAOZ,GAAiBW,CAAE,EAAE,MACnCC,CACT,EACAV,EAAkB,KAAO,gBACzBA,EAAkB,aAAe,CAAC,OAAQ,QAAS,MAAO,aAAc,WAAY,QAAQ,EAC5FA,EAAkB,cAAgB,CAChC,iBAAkB,cAElB,EAAG,EACH,gBAAiB,GAIjB,KAAM,EAQR,EACOA,CACT,GAAEW,EAAW,EACNC,IAAQZ,IC5Df,SAASa,IAAgBC,EAAUC,EAAU,CAE3C,OAAAA,EAAWA,GAAY,CAAC,EAAG,CAAC,EACdC,EAAI,CAAC,IAAK,GAAG,EAAG,SAAUC,EAAKC,EAAQ,CACnD,IAAIC,EAAO,KAAK,QAAQF,CAAG,EACvBG,EAAML,EAASG,CAAM,EACrBG,EAAWP,EAASI,CAAM,EAAI,EAClC,OAAOC,EAAK,OAAS,WAAaA,EAAK,aAAa,EAAI,KAAK,IAAIA,EAAK,YAAYC,EAAMC,CAAQ,EAAIF,EAAK,YAAYC,EAAMC,CAAQ,CAAC,CACtI,EAAG,IAAI,CACT,CACe,SAARC,GAAwCC,EAAU,CACvD,IAAIC,EAAOD,EAAS,OAAO,QAAQ,EACnC,MAAO,CACL,SAAU,CAER,KAAM,cACN,EAAGC,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,MACf,EACA,IAAK,CACH,MAAO,SAAUC,EAAM,CAErB,OAAOF,EAAS,YAAYE,CAAI,CAClC,EACA,KAAaC,GAAKb,IAAiBU,CAAQ,CAC7C,CACF,CACF,CC7BA,SAASI,IAAgBC,EAAUC,EAAU,CAC3C,OAAAA,EAAWA,GAAY,CAAC,EAAG,CAAC,EACdC,EAAI,CAAC,EAAG,CAAC,EAAG,SAAUC,EAAQ,CAC1C,IAAIC,EAAMH,EAASE,CAAM,EACrBE,EAAWL,EAASG,CAAM,EAAI,EAC9BG,EAAK,CAAC,EACNC,EAAK,CAAC,EACV,OAAAD,EAAGH,CAAM,EAAIC,EAAMC,EACnBE,EAAGJ,CAAM,EAAIC,EAAMC,EACnBC,EAAG,EAAIH,CAAM,EAAII,EAAG,EAAIJ,CAAM,EAAIF,EAAS,EAAIE,CAAM,EAC9C,KAAK,IAAI,KAAK,YAAYG,CAAE,EAAEH,CAAM,EAAI,KAAK,YAAYI,CAAE,EAAEJ,CAAM,CAAC,CAC7E,EAAG,IAAI,CACT,CACe,SAARK,GAAkCC,EAAU,CACjD,IAAIC,EAAOD,EAAS,gBAAgB,EACpC,MAAO,CACL,SAAU,CACR,KAAM,MACN,EAAGC,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,KAAMD,EAAS,QAAQ,CACzB,EACA,IAAK,CACH,MAAO,SAAUE,EAAM,CAIrB,OAAOF,EAAS,YAAYE,CAAI,CAClC,EACA,KAAaC,GAAKb,IAAiBU,CAAQ,CAC7C,CACF,CACF,CClCA,SAASI,IAAgBC,EAAUC,EAAU,CAE3C,IAAIC,EAAO,KAAK,QAAQ,EACpBC,EAAMF,aAAoB,MAAQA,EAAS,CAAC,EAAIA,EAChDG,GAAYJ,aAAoB,MAAQA,EAAS,CAAC,EAAIA,GAAY,EACtE,OAAOE,EAAK,OAAS,WAAaA,EAAK,aAAa,EAAI,KAAK,IAAIA,EAAK,YAAYC,EAAMC,CAAQ,EAAIF,EAAK,YAAYC,EAAMC,CAAQ,CAAC,CACtI,CACe,SAARC,GAAqCC,EAAU,CACpD,IAAIC,EAAOD,EAAS,QAAQ,EAC5B,MAAO,CACL,SAAU,CACR,KAAM,aACN,EAAGC,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,MACf,EACA,IAAK,CACH,MAAO,SAAUJ,EAAK,CAEpB,OAAOG,EAAS,YAAYH,CAAG,CACjC,EACA,KAAMK,GAAKT,IAAiBO,CAAQ,CACtC,CACF,CACF,CCxBA,SAASG,IAAgBC,EAAUC,EAAU,CAE3C,OAAAA,EAAWA,GAAY,CAAC,EAAG,CAAC,EACdC,EAAI,CAAC,SAAU,OAAO,EAAG,SAAUC,EAAKC,EAAQ,CAC5D,IAAIC,EAAa,MAAQF,EAAM,OAE3BG,EAAO,KAAKD,CAAU,EAAE,EACxBE,EAAMN,EAASG,CAAM,EACrBI,EAAWR,EAASI,CAAM,EAAI,EAC9BK,EAASH,EAAK,OAAS,WAAaA,EAAK,aAAa,EAAI,KAAK,IAAIA,EAAK,YAAYC,EAAMC,CAAQ,EAAIF,EAAK,YAAYC,EAAMC,CAAQ,CAAC,EAC1I,OAAIL,IAAQ,UACVM,EAASA,EAAS,KAAK,GAAK,KAEvBA,CACT,EAAG,IAAI,CACT,CACe,SAARC,GAAoCC,EAAU,CACnD,IAAIC,EAAaD,EAAS,cAAc,EACpCE,EAAYF,EAAS,aAAa,EAClCG,EAASF,EAAW,UAAU,EAClC,OAAAE,EAAO,CAAC,EAAIA,EAAO,CAAC,GAAKA,EAAO,QAAQ,EACjC,CACL,SAAU,CACR,KAAM,QACN,GAAIH,EAAS,GACb,GAAIA,EAAS,GACb,EAAGG,EAAO,CAAC,EACX,GAAIA,EAAO,CAAC,CACd,EACA,IAAK,CACH,MAAO,SAAUC,EAAM,CACrB,IAAID,EAASF,EAAW,aAAaG,EAAK,CAAC,CAAC,EACxCC,EAAQH,EAAU,YAAYE,EAAK,CAAC,CAAC,EACrCE,EAAQN,EAAS,aAAa,CAACG,EAAQE,CAAK,CAAC,EACjD,OAAAC,EAAM,KAAKH,EAAQE,EAAQ,KAAK,GAAK,GAAG,EACjCC,CACT,EACA,KAAaC,GAAKnB,IAAiBY,CAAQ,CAC7C,CACF,CACF,CC1Ce,SAARQ,GAAuCC,EAAU,CACtD,IAAIC,EAAOD,EAAS,QAAQ,EACxBE,EAAYF,EAAS,aAAa,EACtC,MAAO,CACL,SAAU,CACR,KAAM,WACN,EAAGC,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,UAAWD,EAAS,aAAa,EACjC,WAAYA,EAAS,cAAc,EACnC,UAAW,CACT,MAAOE,EAAU,MACjB,IAAKA,EAAU,IACf,MAAOA,EAAU,MACjB,SAAUA,EAAU,MACtB,CACF,EACA,IAAK,CACH,MAAO,SAAUC,EAAMC,EAAO,CAC5B,OAAOJ,EAAS,YAAYG,EAAMC,CAAK,CACzC,EACA,OAAQ,SAAUD,EAAMC,EAAO,CAC7B,OAAOJ,EAAS,aAAaG,EAAMC,CAAK,CAC1C,CACF,CACF,CACF,CC5Be,SAARC,GAAqCC,EAAU,CACpD,IAAIC,EAAOD,EAAS,QAAQ,EAC5B,MAAO,CACL,SAAU,CACR,KAAM,SACN,EAAGC,EAAK,EACR,EAAGA,EAAK,EACR,MAAOA,EAAK,MACZ,OAAQA,EAAK,MACf,EACA,IAAK,CACH,MAAO,SAAUC,EAAMC,EAAK,CAC1B,OAAOH,EAAS,YAAYE,EAAMC,CAAG,CACvC,EACA,OAAQ,SAAUD,EAAMC,EAAK,CAC3B,OAAOH,EAAS,aAAaE,EAAMC,CAAG,CACxC,CACF,CACF,CACF,CCbO,SAASC,GAAqBC,EAAOC,EAAQC,EAAyBC,EAAkB,CAU7F,OAAOH,IAAUA,EAAM,QAAUA,EAAM,SAAW,IAAS,CAACE,GAA2B,CAACC,GAAoBF,IAAW,UAEnHA,IAAW,QAAUG,GAAOJ,EAAO,MAAM,GAC/C,CAQO,SAASK,GAA8BC,EAAWL,EAAQM,EAAU,CACzE,IAAIC,EAAWF,EACXG,EACAC,EACAC,EACJ,GAAIV,IAAW,OACbU,EAAmBH,MACd,CACLG,EAAmB,CAAC,EACpBP,GAAOI,EAAU,MAAM,IAAMG,EAAiB,KAAOH,EAAS,MAC9DJ,GAAOI,EAAU,MAAM,IAAMG,EAAiB,KAAOH,EAAS,MAC9DJ,GAAOI,EAAU,UAAU,IAAMG,EAAiB,KAAOH,EAAS,UAClEJ,GAAOI,EAAU,YAAY,IAAMG,EAAiB,OAASH,EAAS,YACtEJ,GAAOI,EAAU,YAAY,IAAMG,EAAiB,WAAaH,EAAS,YAC1EJ,GAAOI,EAAU,UAAU,IAAMG,EAAiB,SAAWH,EAAS,UACtEJ,GAAOI,EAAU,WAAW,IAAMG,EAAiB,UAAYH,EAAS,WACxEJ,GAAOI,EAAU,YAAY,IAAMG,EAAiB,WAAaH,EAAS,YAC1EE,EAAc,CACZ,KAAM,OACN,MAAOC,EAMP,OAAQ,EACV,EACAF,EAAa,CAAC,EACd,IAAIG,EAAYR,GAAOI,EAAU,cAAc,EAC3CD,EACFE,EAAW,SAAWG,EAAYJ,EAAS,aAAe,SAE1DI,IAAcH,EAAW,SAAWD,EAAS,cAE/CJ,GAAOI,EAAU,cAAc,IAAMC,EAAW,SAAWD,EAAS,cACpEJ,GAAOI,EAAU,YAAY,IAAMC,EAAW,OAASD,EAAS,YAChEJ,GAAOI,EAAU,cAAc,IAAMC,EAAW,SAAWD,EAAS,cACpEJ,GAAOI,EAAU,cAAc,IAAMC,EAAW,SAAWD,EAAS,aACtE,CACA,OAAAK,IAA6BF,EAAkBL,CAAS,EACxDQ,EAAKH,EAAiB,KAAM,SAAUI,EAAU,CAC9CF,IAA6BE,EAAUA,CAAQ,CACjD,CAAC,EACM,CACL,WAAYN,EACZ,YAAaC,CACf,CACF,CAIA,SAASG,IAA6BG,EAAKD,EAAU,CAC9CA,IASLA,EAAS,KAAOA,EAAS,UAAYA,EAAS,KAC9CX,GAAOW,EAAU,iBAAiB,IAAMC,EAAI,UAAYD,EAAS,iBACjEX,GAAOW,EAAU,WAAW,IAAMC,EAAI,MAAQD,EAAS,WACvDX,GAAOW,EAAU,mBAAmB,IAAMC,EAAI,cAAgBD,EAAS,mBACvEX,GAAOW,EAAU,gBAAgB,IAAMC,EAAI,WAAaD,EAAS,gBACjEX,GAAOW,EAAU,WAAW,IAAMC,EAAI,MAAQD,EAAS,WACvDX,GAAOW,EAAU,YAAY,IAAMC,EAAI,OAASD,EAAS,YACzDX,GAAOW,EAAU,qBAAqB,IAAMC,EAAI,gBAAkBD,EAAS,qBAC3EX,GAAOW,EAAU,aAAa,IAAMC,EAAI,QAAUD,EAAS,aAC3DX,GAAOW,EAAU,iBAAiB,IAAMC,EAAI,YAAcD,EAAS,iBACnEX,GAAOW,EAAU,iBAAiB,IAAMC,EAAI,YAAcD,EAAS,iBACnEX,GAAOW,EAAU,kBAAkB,IAAMC,EAAI,aAAeD,EAAS,kBACrEX,GAAOW,EAAU,oBAAoB,IAAMC,EAAI,YAAcD,EAAS,oBACtEX,GAAOW,EAAU,mBAAmB,IAAMC,EAAI,WAAaD,EAAS,mBACpEX,GAAOW,EAAU,sBAAsB,IAAMC,EAAI,cAAgBD,EAAS,sBAC1EX,GAAOW,EAAU,sBAAsB,IAAMC,EAAI,cAAgBD,EAAS,sBAC5E,CASO,SAASE,GAAiCC,EAASC,EAAOC,EAAO,CACtE,IAAIJ,EAAME,EAEVF,EAAI,aAAeA,EAAI,cAAgBI,EAAM,UAAY,SACzDA,EAAM,QAAU,OAASJ,EAAI,WAAaI,EAAM,QAChDA,EAAM,UAAY,OAASJ,EAAI,aAAeI,EAAM,UACpDA,EAAM,UAAY,OAASJ,EAAI,aAAeI,EAAM,UACpD,IAAIC,EAAWL,EAAI,aAAa,QAAQ,QAAQ,GAAK,EACjDM,EAAWJ,EAAQ,MAAQK,EAAO,MAAM,UAC5CC,IAAqBR,EAAKG,CAAK,EAC/B,IAAIM,EAAiBT,EAAI,UAAY,KACrC,OAAIK,EACEI,IACFT,EAAI,SAAWI,EAAM,YAAcG,EAAO,MAAM,UAChD,CAACP,EAAI,YAAcI,EAAM,eAAiBJ,EAAI,WAAaI,EAAM,cACjE,CAACJ,EAAI,aAAeA,EAAI,WAAaM,GACrCN,EAAI,iBAAmB,OAASA,EAAI,gBAAkB,KAGpDS,IACFT,EAAI,SAAWE,EAAQ,MAAQE,EAAM,aAAeG,EAAO,MAAM,WAEnE,CAACP,EAAI,YAAcI,EAAM,gBAAkBJ,EAAI,WAAaI,EAAM,gBAEpEJ,EAAI,KAAOG,EAAM,KACjBH,EAAI,KAAOG,EAAM,KACjBL,EAAKK,EAAM,KAAM,SAAUJ,EAAU,CACnCS,IAAqBT,EAAUA,CAAQ,CACzC,CAAC,EACMC,CACT,CACA,SAASQ,IAAqBR,EAAKD,EAAU,CACtCA,IAGLX,GAAOW,EAAU,MAAM,IAAMC,EAAI,SAAWD,EAAS,MACrDX,GAAOW,EAAU,QAAQ,IAAMC,EAAI,WAAaD,EAAS,MACzDX,GAAOW,EAAU,WAAW,IAAMC,EAAI,gBAAkBD,EAAS,WACjEX,GAAOW,EAAU,MAAM,IAAMC,EAAI,KAAOD,EAAS,MACjDX,GAAOW,EAAU,WAAW,IAAMC,EAAI,UAAYD,EAAS,WAC3DX,GAAOW,EAAU,YAAY,IAAMC,EAAI,WAAaD,EAAS,YAC7DX,GAAOW,EAAU,UAAU,IAAMC,EAAI,SAAWD,EAAS,UACzDX,GAAOW,EAAU,YAAY,IAAMC,EAAI,WAAaD,EAAS,YAC7DX,GAAOW,EAAU,OAAO,IAAMC,EAAI,UAAYD,EAAS,OACvDX,GAAOW,EAAU,eAAe,IAAMC,EAAI,kBAAoBD,EAAS,eACvEX,GAAOW,EAAU,YAAY,IAAMC,EAAI,eAAiBD,EAAS,YACjEX,GAAOW,EAAU,OAAO,IAAMC,EAAI,UAAYD,EAAS,OACvDX,GAAOW,EAAU,QAAQ,IAAMC,EAAI,WAAaD,EAAS,QACzDX,GAAOW,EAAU,iBAAiB,IAAMC,EAAI,oBAAsBD,EAAS,iBAC3EX,GAAOW,EAAU,SAAS,IAAMC,EAAI,YAAcD,EAAS,SAC3DX,GAAOW,EAAU,aAAa,IAAMC,EAAI,gBAAkBD,EAAS,aACnEX,GAAOW,EAAU,aAAa,IAAMC,EAAI,gBAAkBD,EAAS,aACnEX,GAAOW,EAAU,cAAc,IAAMC,EAAI,iBAAmBD,EAAS,cACrEX,GAAOW,EAAU,aAAa,IAAMC,EAAI,mBAAqBD,EAAS,aACtEX,GAAOW,EAAU,YAAY,IAAMC,EAAI,kBAAoBD,EAAS,YACpEX,GAAOW,EAAU,eAAe,IAAMC,EAAI,qBAAuBD,EAAS,eAC1EX,GAAOW,EAAU,eAAe,IAAMC,EAAI,qBAAuBD,EAAS,eAC1EX,GAAOW,EAAU,iBAAiB,IAAMC,EAAI,gBAAkBD,EAAS,iBACvEX,GAAOW,EAAU,gBAAgB,IAAMC,EAAI,eAAiBD,EAAS,gBACrEX,GAAOW,EAAU,mBAAmB,IAAMC,EAAI,kBAAoBD,EAAS,mBAC3EX,GAAOW,EAAU,mBAAmB,IAAMC,EAAI,kBAAoBD,EAAS,mBAC7E,CCtKA,IAAIW,IAA6B,CAC/B,SAAU,CAAC,IAAK,GAAG,EACnB,MAAO,CAAC,SAAU,QAAQ,EAC1B,OAAQ,CAAC,UAAW,SAAS,CAC/B,EACIC,IAAyBC,GAAKF,GAA0B,EACxDG,IAAsBC,GAAOC,GAAqB,SAAUC,EAAKC,EAAK,CACxE,OAAAD,EAAIC,CAAG,EAAI,EACJD,CACT,EAAG,CAAC,CAAC,EACDE,IAAwBH,GAAoB,KAAK,IAAI,EAE9CI,GAA2B,CAAC,GAAI,QAAS,QAAS,OAAO,EAEhEC,GAAuBC,GAAU,EAErC,SAASC,GAA0BC,EAAeC,EAAIC,EAAUC,EAAaC,EAAW,CACtF,IAAIC,EAAgBL,EAAgB,YAChCM,EAASC,GAAmBP,EAAeG,EAAaC,CAAS,GAAK,CAAC,EACvEI,EAAaX,GAAqBI,CAAE,EAAE,WAE1C,OAAIK,EAAO,SAAW,IAEpBA,EAAO,OAASE,EAAaC,GAAKC,IAAY,CAC5C,GAAIT,EACJ,WAAYO,CACd,CAAC,EAAI,KACLF,EAAO,WAAa,GACpBA,EAAO,MAAQN,GAEjBW,EAAOL,EAAQJ,EAASG,CAAa,CAAC,EAC/BC,CACT,CACO,SAASM,GAAsBX,EAAIC,EAAUW,EAAiBC,EAAM,CACzEA,EAAOA,GAAQ,CAAC,EAChB,IAAIV,EAAYU,EAAK,UACnBC,EAASD,EAAK,OACdE,EAAaF,EAAK,WAChBG,EAAeJ,EAAgB,mBAAmB,EAElDK,EAAQrB,GAAqBI,CAAE,EAC/BkB,EAAWjB,EAAS,MACxBgB,EAAM,WAAahB,EAAS,OAC5B,IAAIkB,EAAiB,CAAC,EAClBC,EAAa,CAAC,EAElB,GADAC,IAA8BrB,EAAIC,EAAUmB,CAAU,EAClDpB,EAAG,OAAS,WAQd,QAFIsB,EAAQtB,EAAG,MAAM,MACjBuB,EAActB,EAAS,MAAM,MACxBuB,EAAI,EAAGA,EAAID,EAAY,OAAQC,IAAK,CAC3C,IAAIC,EAAOF,EAAYC,CAAC,EACxBE,GAAiC,QAASD,EAAMH,EAAME,CAAC,CAAC,CAC1D,MAEAE,GAAiC,QAASzB,EAAUmB,CAAU,EAC9DM,GAAiC,QAASzB,EAAUmB,CAAU,EAWhE,GATI,CAACN,GAAUE,IACbW,IAA+B3B,EAAIC,EAAUkB,CAAc,EAC3DS,IAAkC,QAAS5B,EAAIC,EAAUkB,CAAc,EACvES,IAAkC,QAAS5B,EAAIC,EAAUkB,CAAc,EACvEU,IAA2B7B,EAAIC,EAAUiB,EAAUC,CAAc,GAEnEC,EAAW,MAAQF,EACnBY,IAAmB9B,EAAIoB,EAAYL,CAAU,EAC7CgB,IAAe/B,EAAIC,CAAQ,EACvBe,EACF,GAAIF,EAAQ,CACV,IAAIkB,EAAmB,CAAC,EACxBC,EAAKtC,GAA0B,SAAUuC,EAAU,CACjD,IAAIC,EAAOD,EAAWjC,EAASiC,CAAQ,EAAIjC,EACvCkC,GAAQA,EAAK,YACXD,IACFF,EAAiBE,CAAQ,EAAIF,EAAiBE,CAAQ,GAAK,CAAC,GAE9DxB,EAAOwB,EAAWF,EAAiBE,CAAQ,EAAIF,EAAkBG,EAAK,SAAS,EAEnF,CAAC,EACD,IAAI9B,EAASP,GAA0B,QAASE,EAAIC,EAAUW,EAAiBT,CAAS,EACpFE,EAAO,SAAW,GACpBL,EAAG,YAAYgC,EAAkB3B,CAAM,CAE3C,MACE+B,IAAqBpC,EAAIC,EAAUE,GAAa,EAAGS,EAAiBO,CAAc,EAItFkB,GAAcrC,EAAIC,CAAQ,EAC1BiB,EAAWlB,EAAG,MAAM,EAAIA,EAAG,WAAW,CACxC,CACO,SAASqC,GAAcrC,EAAIC,EAAU,CAG1C,QADIqC,EAAe1C,GAAqBI,CAAE,EAAE,aACnCwB,EAAI,EAAGA,EAAI7B,GAAyB,OAAQ6B,IAAK,CACxD,IAAIU,EAAWvC,GAAyB6B,CAAC,EACrCW,EAAOD,EAAWjC,EAASiC,CAAQ,EAAIjC,EACvCkC,GAAQA,EAAK,UACVG,IACHA,EAAe1C,GAAqBI,CAAE,EAAE,aAAe,CAAC,GAEtDkC,IACFI,EAAaJ,CAAQ,EAAII,EAAaJ,CAAQ,GAAK,CAAC,GAEtDxB,EAAOwB,EAAWI,EAAaJ,CAAQ,EAAII,EAAcH,EAAK,OAAO,EAEzE,CACF,CACO,SAASI,GAAqBvC,EAAIC,EAAUW,EAAiB4B,EAAU,CAC5E,GAAIxC,EAAI,CACN,IAAIyC,EAAWzC,EAAG,OACdsC,EAAe1C,GAAqBI,CAAE,EAAE,aAC5C,GAAIsC,EAAc,CAGhB,IAAIjC,EAASP,GAA0B,SAAUE,EAAIC,EAAUW,EAAiB,CAAC,EACjFP,EAAO,KAAO,UAAY,CACxBoC,GAAYA,EAAS,OAAOzC,CAAE,EAC9BwC,GAAYA,EAAS,CACvB,EACAxC,EAAG,UAAUsC,EAAcjC,CAAM,CACnC,MACEoC,GAAYA,EAAS,OAAOzC,CAAE,EAC9BwC,GAAYA,EAAS,CAEzB,CACF,CACO,SAASE,GAAgBC,EAAY,CAC1C,OAAOA,IAAe,KACxB,CACA,SAASb,IAAmB9B,EAE5B4C,EAAe7B,EAAY,CACzB,IAAIG,EAAW0B,EAAc,MAC7B,GAAI,CAAC5C,EAAG,SAAWkB,EAAU,CAC3B,GAAIH,EAAY,CACdf,EAAG,SAAS,CAAC,CAAC,EAgBd,QADI6C,EAAY7C,EAAG,UACVwB,EAAI,EAAGA,EAAIqB,EAAU,OAAQrB,IAAK,CACzC,IAAIsB,EAAWD,EAAUrB,CAAC,EAEtBsB,EAAS,aAAe,SAC1BA,EAAS,aAAa9C,EAAG,KAAK,CAElC,CACF,CACAA,EAAG,SAASkB,CAAQ,CACtB,CACI0B,IAEFA,EAAc,MAAQ,KAEtBA,GAAiB5C,EAAG,KAAK4C,CAAa,EACtCA,EAAc,MAAQ1B,EAE1B,CACA,SAASkB,IAAqBpC,EAAIC,EAAUE,EAAW4C,EAEvD5B,EAAgB,CACd,GAAIA,EAAgB,CAClB,IAAId,EAASP,GAA0B,SAAUE,EAAIC,EAAU8C,EAAO5C,CAAS,EAC3EE,EAAO,SAAW,GACpBL,EAAG,YAAYmB,EAAgBd,CAAM,CAEzC,CACF,CACA,SAAS0B,IAAe/B,EAAIC,EAAU,CAEpC+C,GAAO/C,EAAU,QAAQ,IAAMD,EAAG,OAASC,EAAS,QACpD+C,GAAO/C,EAAU,QAAQ,IAAMD,EAAG,OAASC,EAAS,QAChDD,aAAciD,IAChBD,GAAO/C,EAAU,WAAW,IAAMD,EAAG,UAAYC,EAAS,WAExDD,aAAckD,IAChBF,GAAO/C,EAAU,WAAW,IAAMD,EAAG,UAAYC,EAAS,UAE9D,CAEA,IAAIkD,GAAiB,CAAC,EAClBC,IAAsB,CAExB,aAAc,SAAU3D,EAAK4D,EAAK,CAIhC,OAAAF,GAAe,GAAG1D,CAAG,EAAI4D,EAClB,IACT,EACA,aAAc,SAAU5D,EAAK,CAI3B,OAAO0D,GAAe,GAAG1D,CAAG,CAC9B,EACA,SAAU,SAAUA,EAAK4D,EAAK,CAI5B,IAAIrD,EAAKmD,GAAe,GACpBG,EAAQtD,EAAG,QAAUA,EAAG,MAAQ,CAAC,GACrC,OAAAsD,EAAM7D,CAAG,EAAI4D,EACbrD,EAAG,YAAcA,EAAG,WAAW,EACxB,IACT,EACA,SAAU,SAAUP,EAAK,CAIvB,IAAI6D,EAAQH,GAAe,GAAG,MAC9B,GAAIG,EACF,OAAOA,EAAM7D,CAAG,CAEpB,EACA,SAAU,SAAUA,EAAK4D,EAAK,CAI5B,IAAIrD,EAAKmD,GAAe,GACpBI,EAAQvD,EAAG,MACf,OAAIuD,IAMFA,EAAM9D,CAAG,EAAI4D,EACbrD,EAAG,YAAcA,EAAG,WAAW,GAE1B,IACT,EACA,SAAU,SAAUP,EAAK,CAIvB,IAAI8D,EAAQJ,GAAe,GAAG,MAC9B,GAAII,EACF,OAAOA,EAAM9D,CAAG,CAEpB,EACA,SAAU,SAAUA,EAAK4D,EAAK,CAI5B,IAAIG,EAAQL,GAAe,GAAG,QAAUA,GAAe,GAAG,MAAQ,CAAC,GACnE,OAAAK,EAAM/D,CAAG,EAAI4D,EACN,IACT,EACA,SAAU,SAAU5D,EAAK,CAIvB,IAAI+D,EAAQL,GAAe,GAAG,MAC9B,GAAIK,EACF,OAAOA,EAAM/D,CAAG,CAEpB,CACF,EAQA,SAASgE,KAAa,CAMpB,IAAIC,EAAQ,KACRC,EAAKD,EAAM,GACf,GAAKC,EAKL,KAAIC,EAAmBC,GAAqBF,CAAE,EAAE,WAC5CG,EAAkBJ,EAAM,WAO5B,GAAIE,IAAqBE,EAAiB,CAExCJ,EAAM,GAAKA,EAAM,WAAa,KAC9B,MACF,CACAK,GAAe,GAAKJ,EAEpBG,EAAgBE,GAAmB,EAGrC,CACA,SAASC,IAAkCC,EAAUC,EAAQC,EAAUC,EAAgB,CACrF,IAAIC,EAAUF,EAASF,CAAQ,EAC/B,GAAKI,EAGL,KAAIC,EAAgBJ,EAAOD,CAAQ,EAC/BM,EACJ,GAAID,EAAe,CACjB,IAAIE,EAAaL,EAAS,WACtBM,EAAiBJ,EAAQ,WAC7B,GAAII,EAEF,GADA,CAACF,IAAyBA,EAAuBH,EAAeH,CAAQ,EAAI,CAAC,GACzES,GAAgBD,CAAc,EAChCE,EAAOJ,EAAsBD,CAAa,MAG1C,SADIM,EAAiBC,GAAiBJ,CAAc,EAC3CK,EAAI,EAAGA,EAAIF,EAAe,OAAQE,IAAK,CAC9C,IAAIC,EAAMH,EAAeE,CAAC,EACtBE,EAAQV,EAAcS,CAAG,EAC7BR,EAAqBQ,CAAG,EAAIC,CAC9B,SAEON,GAAgBF,CAAU,GAAKS,GAAQT,EAAYP,CAAQ,GAAK,EAAG,CAC5E,CAACM,IAAyBA,EAAuBH,EAAeH,CAAQ,EAAI,CAAC,GAE7E,QADIiB,EAAoBC,GAAKb,CAAa,EACjCQ,EAAI,EAAGA,EAAII,EAAkB,OAAQJ,IAAK,CACjD,IAAIC,EAAMG,EAAkBJ,CAAC,EACzBE,EAAQV,EAAcS,CAAG,EACzBK,IAA4Bf,EAAQU,CAAG,EAAGC,CAAK,IACjDT,EAAqBQ,CAAG,EAAIC,EAEhC,CACF,CACF,EACF,CACA,SAASK,GAAiCpB,EAAUE,EAAUmB,EAAU,CACtE,IAAIjB,EAAUF,EAASF,CAAQ,EAC/B,GAAKI,EAKL,QAFIkB,EAAiBD,EAASrB,CAAQ,EAAI,CAAC,EACvCuB,EAAaL,GAAKd,CAAO,EACpBS,EAAI,EAAGA,EAAIU,EAAW,OAAQV,IAAK,CAC1C,IAAIC,EAAMS,EAAWV,CAAC,EAGtBS,EAAeR,CAAG,EAAIU,GAAWpB,EAAQU,CAAG,CAAC,CAC/C,CACF,CACA,SAASW,IAA+BhC,EAAIS,EAAUC,EAAgB,CAGpE,QAFII,EAAaL,EAAS,WACtBS,EAAiBF,GAAgBF,CAAU,EAAImB,GAAsBd,GAAiBL,GAAc,CAAC,CAAC,EACjGM,EAAI,EAAGA,EAAIF,EAAe,OAAQE,IAAK,CAC9C,IAAIC,EAAMH,EAAeE,CAAC,EAC1B,GAAI,EAAAC,IAAQ,SAAWA,IAAQ,SAAWA,IAAQ,SAGlD,KAAIC,EAAQtB,EAAGqB,CAAG,EAKlBX,EAAeW,CAAG,EAAIC,EACxB,CACF,CACA,SAASY,IAA8BlC,EAAIS,EAAUmB,EAAU,CAC7D,QAASR,EAAI,EAAGA,EAAIe,IAAuB,OAAQf,IAAK,CACtD,IAAIgB,EAAaD,IAAuBf,CAAC,EACrCiB,EAASC,IAA2BF,CAAU,EAC9CG,EAAY9B,EAAS2B,CAAU,EAC/BG,IACFX,EAASS,EAAO,CAAC,CAAC,EAAIE,EAAU,CAAC,EACjCX,EAASS,EAAO,CAAC,CAAC,EAAIE,EAAU,CAAC,EAErC,CACA,QAASnB,EAAI,EAAGA,EAAIa,GAAoB,OAAQb,IAAK,CACnD,IAAIC,EAAMY,GAAoBb,CAAC,EAC3BX,EAASY,CAAG,GAAK,OACnBO,EAASP,CAAG,EAAIZ,EAASY,CAAG,EAEhC,CACF,CACA,SAASmB,IAA2BhC,EAAQC,EAAUgC,EAAU/B,EAAgB,CAC9E,GAAK+B,EAGL,KAAIC,EAAclC,EAAO,MACrBmC,EACJ,GAAID,EAAa,CACf,IAAIE,EAAkBH,EAAS,WAC3BI,EAAepC,EAAS,WAC5B,GAAImC,GAAmB,CAAC5B,GAAgB4B,CAAe,EAAG,CACxD,IAAI1B,EAAiBC,GAAiByB,CAAe,EACrD,CAACD,IAAwBA,EAAsBjC,EAAe,MAAQ,CAAC,GACvE,QAASU,EAAI,EAAGA,EAAIF,EAAe,OAAQE,IAAK,CAC9C,IAAIC,EAAMH,EAAeE,CAAC,EACtBE,EAAQoB,EAAYrB,CAAG,EAE3BsB,EAAoBtB,CAAG,EAAIC,CAC7B,CACF,SAAWd,EAAO,yBAA2BQ,GAAgB6B,CAAY,GAAK7B,GAAgB4B,CAAe,GAAKrB,GAAQsB,EAAc,OAAO,GAAK,GAAI,CACtJ,IAAIC,EAAiBtC,EAAO,uBAAuB,EAC/CuC,EAAsBD,EAAiBA,EAAe,MAAQ,KAClE,GAAIC,EAAqB,CACvB,CAACJ,IAAwBA,EAAsBjC,EAAe,MAAQ,CAAC,GAEvE,QADIsC,EAAYvB,GAAKgB,CAAQ,EACpBrB,EAAI,EAAGA,EAAI4B,EAAU,OAAQ5B,IAAK,CACzC,IAAIC,EAAM2B,EAAU5B,CAAC,EACrB,GAAI2B,EAAoB1B,CAAG,EAAG,CAC5B,IAAIC,EAAQoB,EAAYrB,CAAG,EAC3BsB,EAAoBtB,CAAG,EAAIC,CAC7B,CACF,CACF,CACF,CACF,EACF,CACA,SAASI,IAA4BuB,EAAQ3B,EAAO,CAElD,OAAQ4B,GAAYD,CAAM,EAAyCA,IAAW3B,EAAhD2B,GAAU,MAAQ,SAASA,CAAM,CACjE,CCrbA,IAAIE,IAAoBC,GAAU,EAC9BC,IAAwB,CAAC,UAAW,SAAU,QAAS,QAAS,OAAO,EAKpE,SAASC,GAAwCC,EAAI,CAE1DA,EAAG,cAAc,UAAU,EAE3BA,EAAG,KAAKJ,IAAkBI,CAAE,CAAC,CAC/B,CACO,SAASC,GAAuBD,EAAIE,EAAeC,EAAiB,CACzE,GAAI,GAACA,EAAgB,mBAAmB,GAAK,CAACD,GAG9C,IAAIE,EAAQF,CAAa,EAAG,CAC1BG,EAAKH,EAAe,SAAUI,EAAqB,CACjDL,GAAuBD,EAAIM,EAAqBH,CAAe,CACjE,CAAC,EACD,MACF,CACA,IAAII,EAAYL,EAAc,UAC1BM,EAAWN,EAAc,SAC7B,GAAIC,GAAmBK,GAAY,KAAM,CAGvC,IAAIC,EAASC,GAAmB,QAASP,EAAiB,CAAC,EAC3DK,EAAWC,GAAUA,EAAO,QAC9B,CACA,GAAI,GAACF,GAAa,CAACC,GAGnB,KAAIG,EAAiBf,IAAkBI,CAAE,EACzCK,EAAKO,GAA0B,SAAUC,EAAgB,CACvD,GAAI,EAAAA,GAAkB,CAACb,EAAGa,CAAc,GAGxC,KAAIC,EACAC,EAAgB,GAEpBR,EAAU,KAAK,SAAUS,EAAGC,EAAG,CAC7B,OAAOD,EAAE,QAAUC,EAAE,OACvB,CAAC,EACDZ,EAAKE,EAAW,SAAUW,EAAI,CAE5B,IAAIC,EAAYnB,EAAG,UACfoB,EAAWP,EAAiBK,EAAGL,CAAc,EAAIK,EAMrD,GAAKE,EAGL,KAAIC,EAAWC,GAAKF,CAAQ,EAO5B,GANKP,IAEHQ,EAAWE,GAAOF,EAAU,SAAUG,EAAK,CACzC,OAAOC,GAAQ3B,IAAuB0B,CAAG,EAAI,CAC/C,CAAC,GAEC,EAACH,EAAS,OAGd,CAAKP,IACHA,EAAWd,EAAG,QAAQa,EAAgBX,EAAc,KAAM,EAAI,EAC9DY,EAAS,MAAQ,YAEnB,QAASY,EAAI,EAAGA,EAAIP,EAAU,OAAQO,IAEhCP,EAAUO,CAAC,IAAMZ,GAAYK,EAAUO,CAAC,EAAE,aAAeZ,EAAS,YACpEK,EAAUO,CAAC,EAAE,WAAWL,CAAQ,EAGpCR,IAAmBF,EAAeE,CAAc,EAAIF,EAAeE,CAAc,GAAK,CAAC,GACvF,IAAIc,EAAcd,EAAiBF,EAAeE,CAAc,EAAIF,EACpEN,EAAKgB,EAAU,SAAUG,EAAK,CAE5BG,EAAYH,CAAG,IAAMX,EAAiBb,EAAGa,CAAc,EAAIb,IAAO,CAAC,GAAGwB,CAAG,CAC3E,CAAC,EACDV,EAAS,aAAaN,EAAWU,EAAG,QAASE,EAAUC,EAAUH,EAAG,MAAM,GAC5E,CAAC,EACIJ,GAQLA,EAAS,MAAMZ,EAAc,OAAS,CAAC,EAAE,SAASM,CAAQ,EAAE,MAAMN,EAAc,MAAM,EACxF,CAAC,GACH,CC1EA,IAAI0B,GAAW,WACXC,GAAS,SACTC,GAAO,OACPC,GAAS,SACTC,GAAS,CAACH,GAAQD,GAAUE,GAAMC,EAAM,EACxCE,GAAkB,CACpB,OAAQ,CAAC,WAAW,EACpB,SAAU,CAACL,GAAU,WAAW,EAChC,KAAM,CAACE,GAAM,WAAW,EACxB,OAAQ,CAACC,GAAQ,WAAW,CAC9B,EACIG,GAAa,CACf,OAAQ,CAAC,OAAO,EAChB,SAAU,CAACN,GAAU,OAAO,EAC5B,KAAM,CAACE,GAAM,OAAO,EACpB,OAAQ,CAACC,GAAQ,OAAO,CAC1B,EACII,IAAqB,CAAC,IAAK,GAAG,EAG9BC,IAAoB,QACpBC,GAAoB,CACtB,OAAQ,CAAC,EACT,SAAU,CAAC,EACX,KAAM,CAAC,EACP,OAAQ,CAAC,CACX,EAcIC,IAAiB,CACnB,YAAaC,GACb,IAAKC,GACL,OAAQC,GACR,MAAOC,GACP,SAAUC,GACV,OAAQC,EACV,EACA,SAASC,GAAOC,EAAI,CAClB,OAAOA,aAA0BC,EACnC,CACA,SAASC,GAAcF,EAAI,CACzB,OAAOA,aAAcG,EACvB,CACA,SAASC,IAAYC,EAAUC,EAAU,CACvCA,EAAS,cAAcD,CAAQ,EAC3BH,GAAcI,CAAQ,GAAKJ,GAAcG,CAAQ,IACnDC,EAAS,SAASD,EAAS,KAAK,EAChCC,EAAS,EAAID,EAAS,EACtBC,EAAS,GAAKD,EAAS,GACvBC,EAAS,OAASD,EAAS,OAC3BC,EAAS,UAAYD,EAAS,UAC9BC,EAAS,OAASD,EAAS,OACvBN,GAAOO,CAAQ,GAAKP,GAAOM,CAAQ,GACrCC,EAAS,SAASD,EAAS,KAAK,EAGtC,CACA,IAAIE,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,UAAU,OAAS,SAAUI,EAAcC,EAASC,EAAKC,EAAS,CAEhF,KAAK,gBAAkB,KACvB,IAAIC,EAAU,KAAK,MACfC,EAAOL,EAAa,QAAQ,EAC5BM,EAAQ,KAAK,MACbC,EAAaC,IAAeR,EAAcK,EAAMJ,EAASC,CAAG,EAC3DE,GAGHE,EAAM,UAAU,EAElBD,EAAK,KAAKD,CAAO,EAAE,IAAI,SAAUK,EAAQ,CACvCC,GAAmBR,EAAK,KAAMO,EAAQF,EAAWE,EAAQN,CAAO,EAAGH,EAAcM,EAAOD,CAAI,CAC9F,CAAC,EAAE,OAAO,SAAUM,EAAQ,CAC1B,IAAItB,EAAKe,EAAQ,iBAAiBO,CAAM,EACxCtB,GAAMuB,GAAqBvB,EAAIwB,GAAiBxB,CAAE,EAAE,OAAQW,CAAY,CAC1E,CAAC,EAAE,OAAO,SAAUS,EAAQE,EAAQ,CAClC,IAAIG,EAAQV,EAAQ,iBAAiBO,CAAM,EAC3CD,GAAmBR,EAAKY,EAAOL,EAAQF,EAAWE,EAAQN,CAAO,EAAGH,EAAcM,EAAOD,CAAI,CAC/F,CAAC,EAAE,QAAQ,EAEX,IAAIU,EAAWf,EAAa,IAAI,OAAQ,EAAI,EAAIgB,GAAehB,EAAa,iBAAkB,GAAOA,CAAY,EAAI,KACjHe,EACFT,EAAM,YAAYS,CAAQ,EAE1BT,EAAM,eAAe,EAEvB,KAAK,MAAQD,CACf,EACAT,EAAgB,UAAU,yBAA2B,SAAUI,EAAcC,EAASC,EAAK,CACzF,KAAK,MAAM,UAAU,EACrB,KAAK,MAAQ,IACf,EACAN,EAAgB,UAAU,kBAAoB,SAAUqB,EAAQjB,EAAcC,EAASC,EAAKC,EAAS,CACnG,IAAIE,EAAOL,EAAa,QAAQ,EAC5BO,EAAaC,IAAeR,EAAcK,EAAMJ,EAASC,CAAG,EAC5DgB,EAAiB,KAAK,gBAAkB,CAAC,EAC7C,SAASC,EAA4B9B,EAAI,CAClCA,EAAG,UACNA,EAAG,YAAc,GACjBA,EAAG,YAAY,UAAU,EAAE,WAAa,GAE5C,CACA,QAAS+B,EAAMH,EAAO,MAAOG,EAAMH,EAAO,IAAKG,IAAO,CACpD,IAAI/B,EAAKqB,GAAmB,KAAM,KAAMU,EAAKb,EAAWa,EAAKjB,CAAO,EAAGH,EAAc,KAAK,MAAOK,CAAI,EACjGhB,IACFA,EAAG,SAAS8B,CAA2B,EACvCD,EAAe,KAAK7B,CAAE,EAE1B,CACF,EACAO,EAAgB,UAAU,aAAe,SAAUyB,EAAI,CACzCC,GAAiB,KAAK,iBAAmB,KAAK,MAAOD,CAAE,CACrE,EACAzB,EAAgB,UAAU,sBAAwB,SAAU2B,EAAWC,EAAO7B,EAAU8B,EAAa,CACnG,IAAIC,EAAcF,EAAM,QACxB,GAAIE,GAAe,MAAQ/B,EAAS,OAAS+B,EAC3C,MAAO,GAIT,MAAQ/B,EAAWA,EAAS,cAAgBA,EAAS,SAAWA,IAAa,KAAK,OAChF,GAAIA,EAAS,OAAS+B,EACpB,MAAO,GAGX,MAAO,EACT,EACA9B,EAAgB,KAAO,SAChBA,CACT,GAAE+B,EAAS,EACJC,IAAQhC,IACf,SAASiC,GAASC,EAAU,CAC1B,IAAIC,EAAcD,EAAS,KACvBzC,EAGJ,GAAI0C,IAAgB,OAAQ,CAC1B,IAAIC,EAAQF,EAAS,MAEjBG,EAAWD,EAAM,OAAS,MAAQA,EAAM,QAAU,KAAO,CAC3D,EAAGA,EAAM,GAAK,EACd,EAAGA,EAAM,GAAK,EACd,MAAOA,EAAM,MACb,OAAQA,EAAM,MAChB,EAAI,KACAE,EAAWC,IAAYH,CAAK,EAEhC3C,EAAiB+C,GAASF,EAAU,KAAMD,EAAUD,EAAM,QAAU,QAAQ,EAC5EnB,GAAiBxB,CAAE,EAAE,eAAiB6C,CACxC,SAAWH,IAAgB,QACzB1C,EAAK,IAAgBgD,GAAM,CAAC,CAAC,EAC7BxB,GAAiBxB,CAAE,EAAE,gBAAkByC,EAAS,MAAM,cAC7CC,IAAgB,OACzB1C,EAAK,IAAgBiD,GAAK,CAAC,CAAC,UAEnBP,IAAgB,QACzB1C,EAAK,IAAgBkD,WACZR,IAAgB,eAAgB,CACzC,IAAIC,EAAQF,EAAS,MACrB,GAAI,CAACE,GAAS,CAACA,EAAM,MAAO,CAC1B,IAAIQ,EAAS,GAIbC,GAAWD,CAAM,CACnB,CACA,IAAIE,EAAQC,EAAIX,EAAM,MAAO,SAAUY,EAAM,CAC3C,GAAIA,EAAK,OAAS,OAChB,OAAmBR,GAASQ,EAAK,MAAM,SAAUA,EAAM,IAAI,EAE7D,IAAIC,EAAkBC,GAAcF,EAAK,IAAI,EAC7C,GAAI,CAACC,EAAK,CACR,IAAIL,EAAS,GAIbC,GAAWD,CAAM,CACnB,CACA,OAAO,IAAIK,CACb,CAAC,EACDxD,EAAK,IAAgB0D,GAAa,CAChC,MAAO,CACL,MAAOL,CACT,CACF,CAAC,CACH,KAAO,CACL,IAAIG,EAAkBC,GAAcf,CAAW,EAC/C,GAAI,CAACc,EAAK,CACR,IAAIL,EAAS,GAIbC,GAAWD,CAAM,CACnB,CACAnD,EAAK,IAAIwD,CACX,CACA,OAAAhC,GAAiBxB,CAAE,EAAE,kBAAoB0C,EACzC1C,EAAG,KAAOyC,EAAS,KAInBzC,EAAG,eAAiB,EACpBA,EAAG,aAAe,EACXA,CACT,CACA,SAAS2D,GAET9C,EAAKb,EAAI4D,EAAWnB,EAAUoB,EAAgBC,EAAaC,EAAQ,CAEjEC,GAAwChE,CAAE,EAC1C,IAAIiE,EAAWJ,GAAkBA,EAAe,OAAO,IACnDI,GAGFjE,EAAG,cAAciE,CAAQ,EAGvBxB,GAAYA,EAAS,YAAc,OACrCA,EAAS,WAAapD,KAGxB,IAAI6E,EAAWzB,GAAYA,EAAS,MACpC,GAAIyB,EAAU,CACZ,GAAIlE,EAAG,OAAS,OAAQ,CACtB,IAAImE,EAAkBD,EAEtBE,GAAOD,EAAiB,UAAU,IAAMA,EAAgB,KAAOA,EAAgB,UAC/EC,GAAOD,EAAiB,YAAY,IAAMA,EAAgB,OAASA,EAAgB,WACrF,CACA,IAAIE,EAAe,OACfC,EAAWvE,GAAOC,CAAE,EAAIkE,EAAS,MAAQ,KACzCrD,GAAOyD,IACTA,EAAS,MAAQ,GACjBD,EAAeE,GAA+BD,EAAUzD,CAAG,GAG7DqD,EAAS,eAAiBG,CAC5B,CACA,GAAInE,GAAcF,CAAE,GACdkE,EAAU,CACZ,IAAIG,EAAeH,EAAS,eACxBG,IACFH,EAAS,MAAQG,EAErB,CAEFG,GAAsBxE,EAAIyC,EAAUqB,EAAa,CAC/C,UAAWF,EACX,OAAQG,EACR,WAAY,EACd,CAAC,EACDU,GAAuBzE,EAAIyC,EAAS,kBAAmBqB,CAAW,CACpE,CACA,SAASY,IAAgBC,EAAO3E,EAAI4E,EAAYV,EAAUL,EAAgB,CACxE,IAAIgB,EAAgB7E,EAAG,QAAU,KAAOA,EACpCiE,EAAWJ,GAAkBA,EAAec,CAAK,EAAE,IAEvD,GAAIE,EAAe,CAEjB,IAAIC,EAAWD,EAAc,YAAYF,CAAK,EAC9C,GAAIT,IAAa,GAAO,CACtB,IAAIa,EAAwBF,EAAc,SAASF,CAAK,EACpDI,IACFA,EAAsB,MAAQ,KAElC,MAEED,EAAS,MAAQZ,GAAY,KAM3BD,IACFa,EAAS,WAAab,GAExBe,GAAqBH,CAAa,CACpC,CACF,CACA,SAASI,IAAQjF,EAAIyC,EAAUqB,EAAa,CAE1C,GAAI,CAAA9D,EAAG,QAGP,KAAI6E,EAAgB7E,EAChBkF,EAAWpB,EAAY,SACvBqB,EAAgBrB,EAAY,cAEhCe,EAAc,EAAIK,EAClBL,EAAc,OAASM,EAEvB,IAAIC,EAAQ3C,EAAS,GACrB2C,GAAS,OAASP,EAAc,GAAKO,GAAS,GAC9C,QAASC,EAAI,EAAGA,EAAInG,GAAO,OAAQmG,IACjCC,IAAoBT,EAAepC,EAAUvD,GAAOmG,CAAC,CAAC,EAE1D,CACA,SAASC,IAAoBT,EAAepC,EAAUkC,EAAO,CAC3D,IAAIY,EAAWZ,IAAU5F,GACrB6F,EAAaW,EAAW9C,EAAW+C,GAAoB/C,EAAUkC,CAAK,EACtES,EAAQR,EAAaA,EAAW,GAAK,KACrCE,EACAM,GAAS,OAEXN,EAAWS,EAAWV,EAAgBA,EAAc,YAAYF,CAAK,EACrEG,EAAS,GAAKM,GAAS,EAE3B,CACA,SAASjE,IAAeR,EAAcK,EAAMJ,EAASC,EAAK,CACxD,IAAIK,EAAaP,EAAa,IAAI,YAAY,EAC9C,GAAI,OAAOO,GAAe,SAAU,CAElC,IAAIuE,EAAuBC,IAAgBxE,CAAU,EACjDuE,IACFvE,EAAauE,EAIjB,CACA,IAAIE,EAAWhF,EAAa,iBACxBiF,EAAgB,CAAC,EACjBD,IAMFC,EAAgBD,EAAS,eAAiBA,EAAS,eAAeA,CAAQ,EAAInG,IAAemG,EAAS,IAAI,EAAEA,CAAQ,GAuCtH,QArCIE,EAAUC,GAAS,CACrB,SAAUjF,EAAI,SACd,UAAWA,EAAI,UACf,MAAOA,EAAI,MACX,oBAAqBA,EAAI,oBACzB,MAAOkF,EACP,MAAOC,EACP,gBAAiBC,EACjB,cAAeC,EACf,OAAQC,EACR,UAAWC,EACX,qBAAsBC,EACtB,KAAMC,CACR,EAAGV,EAAc,KAAO,CAAC,CAAC,EACtBW,EAAa,CAIf,QAAS,CAAC,EACV,SAAU5F,EAAa,GACvB,WAAYA,EAAa,KACzB,YAAaA,EAAa,YAC1B,SAAUiF,EAAc,SACxB,iBAAkB5E,EAAK,MAAM,EAC7B,OAAQwF,IAAc7F,EAAa,QAAQ,CAAC,EAC5C,YAAaA,EAAa,IAAI,aAAa,GAAK,CAAC,CACnD,EAKI8F,EACAC,EACAC,EAAsB,CAAC,EACvBC,EAAkB,CAAC,EACnBC,EAAwB,CAAC,EACzBC,EAAoB,CAAC,EAChBzB,EAAI,EAAGA,EAAInG,GAAO,OAAQmG,IAAK,CACtC,IAAI0B,EAAY7H,GAAOmG,CAAC,EACxBwB,EAAsBE,CAAS,EAAIpG,EAAa,SAASxB,GAAgB4H,CAAS,CAAC,EACnFD,EAAkBC,CAAS,EAAIpG,EAAa,SAASvB,GAAW2H,CAAS,CAAC,CAC5E,CACA,SAASC,EAAaC,EAAiB,CACrC,OAAOA,IAAoBR,EAAsBC,IAAkBA,EAAgB1F,EAAK,aAAaiG,CAAe,GAAKjG,EAAK,aAAaiG,CAAe,CAC5J,CACA,SAASC,EAAkBD,EAAiBtC,EAAO,CACjD,OAAQ3D,EAAK,cAA+CiG,IAAoBR,EAAsBE,EAAoBhC,CAAK,IAAMgC,EAAoBhC,CAAK,EAAIqC,EAAaC,CAAe,EAAE,SAAS9H,GAAgBwF,CAAK,CAAC,GAAKqC,EAAaC,CAAe,EAAE,SAAS9H,GAAgBwF,CAAK,CAAC,EAApQkC,EAAsBlC,CAAK,CAC1D,CACA,SAASwC,EAAcF,EAAiBtC,EAAO,CAC7C,OAAQ3D,EAAK,cAA2CiG,IAAoBR,EAAsBG,EAAgBjC,CAAK,IAAMiC,EAAgBjC,CAAK,EAAIqC,EAAaC,CAAe,EAAE,SAAS7H,GAAWuF,CAAK,CAAC,GAAKqC,EAAaC,CAAe,EAAE,SAAS7H,GAAWuF,CAAK,CAAC,EAA9OmC,EAAkBnC,CAAK,CACtD,CACA,OAAO,SAAUsC,EAAiBnG,EAAS,CACzC,OAAA2F,EAAsBQ,EACtBP,EAAgB,KAChBC,EAAsB,CAAC,EACvBC,EAAkB,CAAC,EACZ1F,GAAcA,EAAW4E,GAAS,CACvC,gBAAiBmB,EACjB,UAAWjG,EAAK,YAAYiG,CAAe,EAE3C,WAAYnG,EAAUA,EAAQ,KAAO,IACvC,EAAGyF,CAAU,EAAGV,CAAO,CACzB,EAMA,SAASE,EAAMqB,EAAKH,EAAiB,CACnC,OAAAA,GAAmB,OAASA,EAAkBR,GACvCzF,EAAK,SAAS,EAAE,IAAIA,EAAK,kBAAkBoG,GAAO,CAAC,EAAGH,CAAe,CAC9E,CAMA,SAAShB,EAAgBmB,EAAKH,EAAiB,CAC7CA,GAAmB,OAASA,EAAkBR,GAC9CW,EAAMA,GAAO,EACb,IAAIC,EAAUrG,EAAK,iBAAiBoG,CAAG,EACvC,GAAI,CAACC,EAAS,CACZ,IAAIC,EAAWtG,EAAK,kBAAkBoG,CAAG,EACzC,OAAOE,GAAY,EAAItG,EAAK,SAAS,EAAE,IAAIsG,EAAUL,CAAe,EAAI,MAC1E,CACA,IAAIM,EAAMvG,EAAK,IAAIqG,EAAQ,KAAMJ,CAAe,EAC5CO,EAAcH,GAAWA,EAAQ,YACrC,OAAOG,EAAcA,EAAY,WAAWD,CAAG,EAAIA,CACrD,CAoBA,SAASvB,EAAMyB,EAAWR,EAAiB,CAIzCA,GAAmB,OAASA,EAAkBR,GAC9C,IAAIT,EAAQhF,EAAK,cAAciG,EAAiB,OAAO,EACnDS,EAAc1B,GAASA,EAAM,KAC7B2B,EAAU3B,GAASA,EAAM,QACzB4B,EAAYV,EAAkBD,EAAiBlI,EAAM,EAAE,aAAa,EACxE2I,GAAe,OAASE,EAAU,KAAOF,GACzCC,GAAW,OAASC,EAAU,QAAUD,GACxC,IAAIE,EAAM,CACR,aAAcC,GAASJ,CAAW,EAAIA,EAAcK,EAAO,MAAM,SACnE,EACIC,EAAab,EAAcF,EAAiBlI,EAAM,EAIlDkJ,GAA6BC,GAAgBF,EAAY,KAAMH,EAAK,GAAO,EAAI,EACnFI,GAAU,KAAOD,EAAW,WAAW,MAAM,EAAIG,GAAUxH,EAAa,kBAAkBsG,EAAiBlI,EAAM,EAAGqJ,GAAgBpH,EAAMiG,CAAe,CAAC,EAAI,KAC9J,IAAIoB,GAA8BC,GAAiBN,EAAYH,EAAK,EAAK,EACzE,OAAAU,EAAkBd,EAAWG,CAAS,EACtCA,EAAYY,GAAiCZ,EAAWK,GAAWI,EAAU,EAC7EZ,GAAagB,EAAoBb,EAAWH,CAAS,EACrDG,EAAU,OAAS,GACZA,CACT,CAMA,SAAS1B,EAAcuB,EAAWR,EAAiB,CAIjDA,GAAmB,OAASA,EAAkBR,GAC9C,IAAImB,EAAYV,EAAkBD,EAAiBnI,EAAQ,EAAE,aAAa,EACtEkJ,EAAab,EAAcF,EAAiBnI,EAAQ,EACpDmJ,EAA6BC,GAAgBF,EAAY,KAAM,KAAM,GAAM,EAAI,EACnFC,EAAU,KAAOD,EAAW,WAAW,MAAM,EAAIU,GAAU/H,EAAa,kBAAkBsG,EAAiBnI,EAAQ,EAAG6B,EAAa,kBAAkBsG,EAAiBlI,EAAM,EAAGqJ,GAAgBpH,EAAMiG,CAAe,CAAC,EAAI,KACzN,IAAIoB,EAA8BC,GAAiBN,EAAY,KAAM,EAAI,EACzE,OAAAO,EAAkBd,EAAWG,CAAS,EACtCA,EAAYY,GAAiCZ,EAAWK,EAAWI,CAAU,EAC7EZ,GAAagB,EAAoBb,EAAWH,CAAS,EACrDG,EAAU,OAAS,GACZA,CACT,CACA,SAASa,EAAoBb,EAAWe,EAAO,CAC7C,QAASC,KAAOD,EACVvE,GAAOuE,EAAOC,CAAG,IACnBhB,EAAUgB,CAAG,EAAID,EAAMC,CAAG,EAGhC,CACA,SAASL,EAAkBI,EAAOf,EAAW,CAIvCe,IACFA,EAAM,WAAaf,EAAU,SAAWe,EAAM,UAC9CA,EAAM,eAAiBf,EAAU,aAAee,EAAM,cAE1D,CAKA,SAASxC,EAAO0C,EAAY5B,EAAiB,CAE3C,GADAA,GAAmB,OAASA,EAAkBR,GAC1CrC,GAAO0E,GAAmBD,CAAU,EAAG,CACzC,IAAIE,EAAU/H,EAAK,cAAciG,EAAiB,OAAO,EACzD,OAAO8B,EAAUA,EAAQD,GAAkBD,CAAU,CAAC,EAAI,IAC5D,CAGA,GAAIzE,GAAO4E,IAAwBH,CAAU,EAC3C,OAAO7H,EAAK,cAAciG,EAAiB4B,CAAU,CAEzD,CAKA,SAASzC,EAAUyB,EAAK,CACtB,GAAIlC,EAAS,OAAS,cAAe,CACnC,IAAIsD,EAAWtD,EAAS,YAAY,EACpC,OAAOuD,IAAgBpD,GAAS,CAC9B,KAAMmD,CACR,EAAGpB,CAAG,CAAC,CACT,CACF,CAIA,SAASxB,GAAuB,CAC9B,OAAOzF,EAAQ,wBAAwB,CACzC,CAKA,SAAS0F,EAAKuB,EAAK,CACjB,OAAwBsB,GAAQtB,EAAKjH,CAAO,CAC9C,CACF,CACA,SAAS4F,IAAcxF,EAAM,CAC3B,IAAIoI,EAAY,CAAC,EACjB,OAAAC,EAAKrI,EAAK,WAAY,SAAUsI,EAAS,CACvC,IAAIjC,EAAUrG,EAAK,iBAAiBsI,CAAO,EAC3C,GAAI,CAACjC,EAAQ,aAAc,CACzB,IAAIkC,EAAWlC,EAAQ,SACnBmC,EAAWJ,EAAUG,CAAQ,EAAIH,EAAUG,CAAQ,GAAK,CAAC,EAC7DC,EAASnC,EAAQ,aAAa,EAAIrG,EAAK,kBAAkBsI,CAAO,CAClE,CACF,CAAC,EACMF,CACT,CACA,SAAS/H,GAAmBR,EAAK4I,EAAU7F,EAAWnB,EAAUqB,EAAa7C,EAAOD,EAAM,CAQxF,GAAI,CAACyB,EAAU,CACbxB,EAAM,OAAOwI,CAAQ,EACrB,MACF,CACA,IAAIzJ,EAAK0J,GAAmB7I,EAAK4I,EAAU7F,EAAWnB,EAAUqB,EAAa7C,CAAK,EAClF,OAAAjB,GAAMgB,EAAK,iBAAiB4C,EAAW5D,CAAE,EACzCA,GAAM2J,GAAoB3J,EAAIyC,EAAS,MAAOA,EAAS,UAAWA,EAAS,gBAAgB,EACpFzC,CACT,CACA,SAAS0J,GAAmB7I,EAAK4I,EAAU7F,EAAWnB,EAAUqB,EAAa7C,EAAO,CAIlF,IAAI2I,EAAkB,GAClBnI,EAAQgI,EACRA,GAAYI,IAAmBJ,EAAUhH,EAAUqB,CAAW,IAShE8F,EAAkBE,GAAQ7I,EAAM,YAAY,EAAGwI,CAAQ,EACvDA,EAAW,MAEb,IAAI1F,EAAS,CAAC0F,EACVzJ,EAAKyJ,EACJzJ,EASHA,EAAG,YAAY,GARfA,EAAKwC,GAASC,CAAQ,EAClBhB,GACFrB,IAAYqB,EAAOzB,CAAE,GASrByC,EAAS,QAAU,GACrBzC,EAAG,gBAAkB,GACZA,EAAG,kBACZA,EAAG,gBAAkB,IAEnByC,EAAS,kBACXzC,EAAG,gBAAkB,IAEvBT,GAAkB,OAAO,IAAMA,GAAkB,OAAO,OAASA,GAAkB,SAAS,IAAMA,GAAkB,SAAS,OAASA,GAAkB,KAAK,IAAMA,GAAkB,KAAK,OAASA,GAAkB,OAAO,IAAMA,GAAkB,OAAO,OAAS,KACpQA,GAAkB,SAAW,GAC7BwK,IAA2B/J,EAAI4D,EAAWnB,EAAUqB,EAAaC,EAAQxE,EAAiB,EAC1FyK,IAAyBhK,EAAI4D,EAAWnB,EAAUqB,EAAaC,CAAM,EACrEJ,GAAe9C,EAAKb,EAAI4D,EAAWnB,EAAUlD,GAAmBuE,EAAaC,CAAM,EAInFK,GAAO3B,EAAU,MAAM,IAAMjB,GAAiBxB,CAAE,EAAE,KAAOyC,EAAS,MAClE,QAAS4C,EAAI,EAAGA,EAAInG,GAAO,OAAQmG,IAAK,CACtC,IAAI0B,EAAY7H,GAAOmG,CAAC,EACxB,GAAI0B,IAAchI,GAAQ,CACxB,IAAIkL,EAAgBzE,GAAoB/C,EAAUsE,CAAS,EACvDmD,EAAgBC,GAA2B1H,EAAUwH,EAAelD,CAAS,EACjFrC,IAAgBqC,EAAW/G,EAAIiK,EAAeC,EAAe3K,EAAiB,CAChF,CACF,CACA,OAAA0F,IAAQjF,EAAIyC,EAAUqB,CAAW,EAC7BrB,EAAS,OAAS,SACpB2H,IAAcvJ,EAAKb,EAAI4D,EAAWnB,EAAUqB,CAAW,EAErD8F,GAAmB,EACrB3I,EAAM,UAAUjB,EAAI4J,CAAe,EAEnC3I,EAAM,IAAIjB,CAAE,EAEPA,CACT,CAEA,SAAS6J,IAAmB7J,EAAIyC,EAAUqB,EAAa,CACrD,IAAIuG,EAAU7I,GAAiBxB,CAAE,EAC7BsK,EAAe7H,EAAS,KACxB8H,EAAgB9H,EAAS,MACzB+H,EAAgB/H,EAAS,MAC7B,OAGEqB,EAAY,6BAA6B,GAEtCwG,GAAgB,MAAQA,IAAiBD,EAAQ,mBAAqBC,IAAiB,QAAUG,IAAeF,CAAa,GAAKzH,IAAYyH,CAAa,IAAMF,EAAQ,gBAAkBC,IAAiB,SAAWlG,GAAOoG,EAAe,OAAO,GAAKA,EAAc,QAAUH,EAAQ,eAOhS,CACA,SAASL,IAAyBhK,EAAI4D,EAAWnB,EAAUqB,EAAaC,EAAQ,CAI9E,IAAI2G,EAAcjI,EAAS,SAC3B,GAAIiI,IAAgB,GACd1K,GAAMA,EAAG,YAAY,GACvBA,EAAG,eAAe,UAEX0K,EAAa,CACtB,IAAIhJ,EAAW1B,EAAG,YAAY,EAC1B0B,GAAYmI,IAAmBnI,EAAUgJ,EAAa5G,CAAW,IACnEpC,EAAW,MAERA,IACHA,EAAWc,GAASkI,CAAW,EAI/B1K,EAAG,YAAY0B,CAAQ,GAEzBiC,GAAe,KAAMjC,EAAUkC,EAAW8G,EAAa,KAAM5G,EAAaC,CAAM,CAClF,CAEF,CACA,SAASgG,IAA2B/J,EAAI4D,EAAWnB,EAAUqB,EAAaC,EAAQF,EAAgB,CAEhG,GAAI,EAAA7D,EAAG,SAAWA,EAAG,OAAS,gBAI9B,CAAA2K,IAAclI,EAAU,KAAMoB,CAAc,EAC5C8G,IAAclI,EAAU3D,GAAU+E,CAAc,EAOhD,IAAI+G,EAAiB/G,EAAe,OAAO,OACvCgH,EAAmBhH,EAAe,SAAS,OAC3CiH,EAAejH,EAAe,KAAK,OACnCkH,EAAiBlH,EAAe,OAAO,OAC3C,GAAI+G,GAAkB,MAAQC,GAAoB,MAAQE,GAAkB,MAAQD,GAAgB,KAAM,CACxG,IAAIE,EAAchL,EAAG,eAAe,EACpC,GAAI4K,IAAmB,GACrBI,GAAehL,EAAG,kBAAkB,MAC/B,CACL4K,EAAiB/G,EAAe,OAAO,OAAS+G,GAAkB,CAChE,KAAM,MACR,EACKI,EAMHA,EAAY,YAAY,GALxBA,EAAcxI,GAASoI,CAAc,EACrC5K,EAAG,eAAegL,CAAW,GAM/BrH,GAAe,KAAMqH,EAAapH,EAAWgH,EAAgB,KAAM9G,EAAaC,CAAM,EAEtF,QADIkH,EAAoBL,GAAkBA,EAAe,MAChDvF,EAAI,EAAGA,EAAInG,GAAO,OAAQmG,IAAK,CACtC,IAAI0B,EAAY7H,GAAOmG,CAAC,EACxB,GAAI0B,IAAchI,GAAQ,CACxB,IAAImM,EAAqBrH,EAAekD,CAAS,EAAE,OACnDrC,IAAgBqC,EAAWiE,EAAaE,EAAoBf,GAA2BS,EAAgBM,EAAoBnE,CAAS,EAAG,IAAI,CAC7I,CACF,CACAkE,EAAoBD,EAAY,MAAM,EAAIA,EAAY,WAAW,CACnE,CACF,EACF,CACA,SAASL,IAAclI,EAAUkC,EAAOd,EAAgB,CACtD,IAAIsH,EAAYxG,EAAmBa,GAAoB/C,EAAUkC,CAAK,EAA9ClC,EACpByB,EAAYS,EAAyBwF,GAA2B1H,EAAU0I,EAAUrM,EAAQ,EAAxE2D,EAAS,MAC7B2I,EAAS3I,EAAS,KAClB4I,EAAQF,EAAWA,EAAS,WAAa,KACzCP,EAAiBnI,EAAS,YAC1B6I,EAAYV,EAAyBjG,EAAyBa,GAAoBoF,EAAgBjG,CAAK,EAA1DiG,EAAhB,KACjC,GAAI1G,IAGJL,EAAe,UAAY0H,GAAqBrH,EAAUkH,EAAQ,CAAC,CAACC,EAAO,CAAC,CAACC,CAAQ,GAAI,CACvFzH,EAAe,SAAW,GAC1B,IAAI2H,EAAgBC,GAA8BvH,EAAUkH,EAAQ,CAACzG,CAAK,EAItE,CAAC0G,GAASG,EAAc,aAC1BH,EAAQG,EAAc,YAEpB,CAACF,GAAYE,EAAc,cAC7BF,EAAWE,EAAc,YAE7B,CACA,GAAI,CAAC7G,GAAS2G,EAAU,CACtB,IAAII,EAAmBJ,EAEvB,CAACI,EAAiB,OAASA,EAAiB,KAAO,OAKrD,CACA,IAAIC,EAAQhH,EAAgCd,EAAec,CAAK,EAA5Cd,EAAe,OACnC8H,EAAK,IAAMN,EACXM,EAAK,OAASL,CAChB,CACA,SAAS9F,GAAoB/C,EAAUkC,EAAO,CAC5C,OAAQA,EAAmBlC,EAAWA,EAASkC,CAAK,EAAI,KAAxClC,CAClB,CACA,SAAS0H,GAA2ByB,EAAmBC,EAAalH,EAAO,CACzE,IAAIqB,EAAQ6F,GAAeA,EAAY,MACvC,OAAI7F,GAAS,MAAQrB,IAAU7F,IAAY8M,IACzC5F,EAAQ4F,EAAkB,eAErB5F,CACT,CAqBA,SAASoE,IAAcvJ,EAAKb,EAAI4D,EAAWnB,EAAUqB,EAAa,CAChE,IAAIgI,EAAcrJ,EAAS,SACvBsJ,EAASD,EAAcA,EAAY,OAAS,EAC5C1B,EAAgB3H,EAAS,eAEzBuJ,EAAS5B,IAAkB,UAAY3H,EAAS,mBAChDwJ,EAAW7B,IAAkB,GAEjC,GAAI,GAAC2B,GAAU,CAACC,GAAU,CAACC,GAG3B,IAAID,EAAQ,CACVE,IAAkB,CAChB,IAAKrL,EACL,YAAab,EAAG,SAAS,GAAK,CAAC,EAC/B,YAAa8L,GAAe,CAAC,EAC7B,UAAWlI,EACX,YAAaE,EACb,MAAO9D,CACT,CAAC,EACD,MACF,CACAiM,GAAYjM,EAAG,UAAU,EAIzB,QADImM,EAAQ,EACLA,EAAQJ,EAAQI,IAAS,CAC9B,IAAIC,EAAWN,EAAYK,CAAK,EAC5BE,EAAWrM,EAAG,QAAQmM,CAAK,EAC3BC,GACEA,EAAS,QAAU,OAGrBA,EAAS,OAAS,IAEpB1C,GAAmB7I,EAAKwL,EAAUzI,EAAWwI,EAAUtI,EAAa9D,CAAE,GAStEqM,EAAS,OAAS,EAEtB,CACA,QAAShH,EAAIrF,EAAG,WAAW,EAAI,EAAGqF,GAAK8G,EAAO9G,IAAK,CACjD,IAAIiH,EAAQtM,EAAG,QAAQqF,CAAC,EACxBkH,IAAqBvM,EAAIsM,EAAOxI,CAAW,CAC7C,EACF,CACA,SAASyI,IAAqBtL,EAAOqL,EAAOxI,EAAa,CAIvDwI,GAAS/K,GAAqB+K,EAAO9K,GAAiBP,CAAK,EAAE,OAAQ6C,CAAW,CAClF,CACA,SAASoI,IAAkBM,EAAS,CAClC,IAAIC,GAAWD,EAAQ,YAAaA,EAAQ,YAAaE,IAAQA,IAAQF,CAAO,EAAE,IAAIG,GAAgB,EAAE,OAAOA,GAAgB,EAAE,OAAOC,GAAa,EAAE,QAAQ,CACjK,CACA,SAASF,IAAOG,EAAM9K,EAAK,CACzB,IAAI+K,EAAOD,GAAQA,EAAK,KACxB,OAAOC,GAAsBxN,IAAoByC,CACnD,CACA,SAAS4K,IAAiBI,EAAUC,EAAU,CAC5C,IAAIR,EAAU,KAAK,QACfS,EAAcF,GAAY,KAAOP,EAAQ,YAAYO,CAAQ,EAAI,KACjET,EAAQU,GAAY,KAAOR,EAAQ,YAAYQ,CAAQ,EAAI,KAC/DtD,GAAmB8C,EAAQ,IAAKF,EAAOE,EAAQ,UAAWS,EAAaT,EAAQ,YAAaA,EAAQ,KAAK,CAC3G,CACA,SAASI,IAAcI,EAAU,CAC/B,IAAIR,EAAU,KAAK,QACfF,EAAQE,EAAQ,YAAYQ,CAAQ,EACxCV,GAAS/K,GAAqB+K,EAAO9K,GAAiB8K,CAAK,EAAE,OAAQE,EAAQ,WAAW,CAC1F,CAIA,SAAS1J,IAAYH,EAAO,CAE1B,OAAOA,IAAUA,EAAM,UAAYA,EAAM,EAC3C,CACA,SAAS8H,IAAe9H,EAAO,CAC7B,OAAOA,IAAUyB,GAAOzB,EAAO,UAAU,GAAKyB,GAAOzB,EAAO,GAAG,EACjE,CC15BO,SAASuK,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAe,EAC3CD,EAAU,oBAAoBE,GAAiB,CACjD,CCCA,IAAIC,GAAQC,GAAU,EAClBC,IAAeA,GACfC,GAAcA,GAIdC,KAA+B,UAAY,CAC7C,SAASA,GAAkB,CACzB,KAAK,UAAY,GAKjB,KAAK,mBAAqB,EAC5B,CAIA,OAAAA,EAAgB,UAAU,OAAS,SAAUC,EAAWC,EAAkBC,EAAKC,EAAa,CAC1F,IAAIC,EAAQH,EAAiB,IAAI,OAAO,EACpCI,EAASJ,EAAiB,IAAI,QAAQ,EAS1C,GANA,KAAK,WAAaD,EAClB,KAAK,kBAAoBC,EACzB,KAAK,KAAOC,EAIR,GAACC,GAAe,KAAK,aAAeC,GAAS,KAAK,cAAgBC,GAGtE,MAAK,WAAaD,EAClB,KAAK,YAAcC,EACnB,IAAIC,EAAQ,KAAK,OACbC,EAAS,KAAK,QAClB,GAAI,CAACF,GAAUA,IAAW,OAAQ,CAEhCC,GAASA,EAAM,KAAK,EACpBC,GAAUA,EAAO,KAAK,EACtB,MACF,CACAD,GAASA,EAAM,KAAK,EACpBC,GAAUA,EAAO,KAAK,EAEtB,IAAIC,EAAW,CAAC,EAChB,KAAK,aAAaA,EAAUJ,EAAOJ,EAAWC,EAAkBC,CAAG,EAEnE,IAAIO,EAAaD,EAAS,WACtBC,IAAe,KAAK,iBACtB,KAAK,MAAMP,CAAG,EAEhB,KAAK,gBAAkBO,EACvB,IAAIC,EAAgB,KAAK,eAAiB,KAAK,mBAAmBV,EAAWC,CAAgB,EAC7F,GAAI,CAACK,EACHA,EAAQ,KAAK,OAAS,IAAYK,GAClC,KAAK,gBAAgBL,EAAOE,EAAUR,EAAWC,CAAgB,EACjE,KAAK,cAAcK,EAAOE,EAAUR,EAAWC,CAAgB,EAC/DC,EAAI,MAAM,EAAE,IAAII,CAAK,MAChB,CACL,IAAIM,EAAuBC,GAAMC,IAAab,EAAkBS,CAAa,EAC7E,KAAK,gBAAgBJ,EAAOE,EAAUI,CAAa,EACnD,KAAK,cAAcN,EAAOE,EAAUI,EAAeX,CAAgB,CACrE,CACAc,IAAqBT,EAAOL,EAAkB,EAAI,EAClD,KAAK,cAAcG,CAAK,EAC1B,EAIAL,EAAgB,UAAU,OAAS,SAAUG,EAAK,CAChD,KAAK,MAAMA,CAAG,CAChB,EAIAH,EAAgB,UAAU,QAAU,SAAUG,EAAK,CACjD,KAAK,MAAMA,CAAG,CAChB,EAIAH,EAAgB,UAAU,mBAAqB,SAAUC,EAAWC,EAAkB,CACpF,IAAIe,EAAYf,EAAiB,IAAI,WAAW,EAC5CgB,EAAOjB,EAAU,KACjBkB,EAAiBD,EAAK,OAAS,WAC/BE,EAAUlB,EAAiB,IAAI,MAAM,EAEzC,GAAI,CAACkB,GAAW,CAACD,EACf,MAAO,GAET,GAAIF,IAAc,QAAUA,GAAa,KAAM,CAC7C,IAAII,EAAqB,KAAK,mBAC9B,GAAIF,GAAkBD,EAAK,aAAa,EAAIG,EAC1C,MAAO,GAKT,GAAID,EAAS,CACX,IAAIE,EAAyCC,GAAYtB,CAAS,EAAE,gBAChEuB,EAAaN,EAAK,UAAU,EAEhC,OAAO,KAAK,IAAIM,EAAW,CAAC,EAAIA,EAAW,CAAC,CAAC,EAAIF,EAAkBD,CACrE,CACA,MAAO,EACT,CACA,OAAOJ,IAAc,EACvB,EAKAjB,EAAgB,UAAU,aAAe,SAAUS,EAAUJ,EAAOJ,EAAWC,EAAkBC,EAAK,CAEtG,EAIAH,EAAgB,UAAU,gBAAkB,SAAUO,EAAOE,EAAUR,EAAWC,EAAkB,CAClG,IAAIuB,EAAgBhB,EAAS,QAC7B,GAAIgB,EAAe,CACjB,IAAIC,EAAY9B,GAAMW,CAAK,EAAE,UAAY,IAAIoB,GAAQF,EAAc,IAAI,EAAE3B,IAAMW,EAAS,OAAO,CAAC,EAChGF,EAAM,IAAImB,CAAS,CACrB,CACF,EAIA1B,EAAgB,UAAU,cAAgB,SAAUO,EAAOE,EAAUR,EAAWC,EAAkB,CAChG,GAAIO,EAAS,MAAO,CAClB,IAAImB,EAAUhC,GAAMW,CAAK,EAAE,QAAU,IAAYsB,GAAK/B,IAAMW,EAAS,KAAK,CAAC,EAC3EF,EAAM,IAAIqB,CAAO,EACjBE,IAAoBF,EAAS1B,CAAgB,CAC/C,CACF,EAIAF,EAAgB,UAAU,gBAAkB,SAAUO,EAAOE,EAAUM,EAAa,CAClF,IAAIW,EAAY9B,GAAMW,CAAK,EAAE,UACzBmB,GAAajB,EAAS,UACxBiB,EAAU,SAASjB,EAAS,QAAQ,KAAK,EACzCM,EAAYW,EAAW,CACrB,MAAOjB,EAAS,QAAQ,KAC1B,CAAC,EAEL,EAIAT,EAAgB,UAAU,cAAgB,SAAUO,EAAOE,EAAUM,EAAab,EAAkB,CAClG,IAAI0B,EAAUhC,GAAMW,CAAK,EAAE,QACvBqB,IACFA,EAAQ,SAASnB,EAAS,MAAM,KAAK,EACrCM,EAAYa,EAAS,CAKnB,EAAGnB,EAAS,MAAM,EAClB,EAAGA,EAAS,MAAM,CACpB,CAAC,EACDqB,IAAoBF,EAAS1B,CAAgB,EAEjD,EAIAF,EAAgB,UAAU,cAAgB,SAAUK,EAAO,CACzD,GAAI,OAAK,WAAa,CAAC,KAAK,uBAG5B,KAAIH,EAAmB,KAAK,kBACxB6B,EAAK,KAAK,KAAK,MAAM,EACrBvB,EAAS,KAAK,QACdwB,EAAc9B,EAAiB,SAAS,QAAQ,EAChDI,EAASJ,EAAiB,IAAI,QAAQ,EAC1C,GAAI,CAAC8B,EAAY,IAAI,MAAM,GAAK,CAAC1B,GAAUA,IAAW,OAAQ,CAC5DE,GAAUuB,EAAG,OAAOvB,CAAM,EAC1B,KAAK,QAAU,KACf,MACF,CACA,IAAIyB,EACC,KAAK,UACRA,EAAS,GACTzB,EAAS,KAAK,QAAkB0B,GAAWF,EAAY,IAAI,MAAM,EAAG,CAClE,OAAQ,OACR,UAAW,GACX,YAAa,SAAUG,EAAG,CAEdC,GAAKD,EAAE,KAAK,CACxB,EACA,YAAapC,GAAK,KAAK,kBAAmB,KAAM,EAAG,CAAC,EACpD,MAAOA,GAAK,KAAK,kBAAmB,IAAI,EACxC,UAAWA,GAAK,KAAK,iBAAkB,IAAI,CAC7C,CAAC,EACDgC,EAAG,IAAIvB,CAAM,GAEfQ,IAAqBR,EAAQN,EAAkB,EAAK,EAEpDM,EAAO,SAASwB,EAAY,aAAa,KAAM,CAAC,QAAS,cAAe,cAAe,UAAW,cAAe,aAAc,gBAAiB,eAAe,CAAC,CAAC,EAEjK,IAAIK,EAAaL,EAAY,IAAI,MAAM,EAC3BM,EAAQD,CAAU,IAC5BA,EAAa,CAACA,EAAYA,CAAU,GAEtC7B,EAAO,OAAS6B,EAAW,CAAC,EAAI,EAChC7B,EAAO,OAAS6B,EAAW,CAAC,EAAI,EACnBE,GAAe,KAAM,yBAA0BP,EAAY,IAAI,UAAU,GAAK,EAAG,SAAS,EACvG,KAAK,mBAAmB3B,EAAO4B,CAAM,EACvC,EACAjC,EAAgB,UAAU,mBAAqB,SAAUK,EAAO4B,EAAQ,CACtElB,IAAY,KAAK,kBAAmB,CAACkB,GAAU,KAAK,eAAgB,KAAK,QAASO,GAAoB,KAAK,mBAAmBnC,EAAO,KAAK,WAAY,KAAK,iBAAiB,CAAC,CAAC,CAChL,EACAL,EAAgB,UAAU,kBAAoB,SAAUyC,EAAIC,EAAI,CAC9D,IAAIlC,EAAS,KAAK,QAClB,GAAKA,EAGL,MAAK,UAAY,GAEjB,IAAImC,EAAQ,KAAK,sBAAsBH,GAAoBhC,CAAM,EAAG,CAACiC,EAAIC,CAAE,EAAG,KAAK,WAAY,KAAK,iBAAiB,EACrH,KAAK,aAAeC,EACpBnC,EAAO,cAAc,EACrBA,EAAO,KAAKgC,GAAoBG,CAAK,CAAC,EACtC/C,GAAMY,CAAM,EAAE,SAAW,KACzB,KAAK,uBAAuB,EAC9B,EAIAR,EAAgB,UAAU,uBAAyB,UAAY,CAC7D,IAAIQ,EAAS,KAAK,QAClB,GAAKA,EAGL,KAAIoC,EAAc,KAAK,aACnB3C,EAAY,KAAK,WACrB,KAAK,KAAK,eAAe,CACvB,KAAM,oBACN,EAAG2C,EAAY,YAAY,CAAC,EAC5B,EAAGA,EAAY,YAAY,CAAC,EAC5B,cAAeA,EAAY,cAC3B,SAAU,CAAC,CACT,QAAS3C,EAAU,KAAK,IACxB,UAAWA,EAAU,cACvB,CAAC,CACH,CAAC,EACH,EACAD,EAAgB,UAAU,iBAAmB,UAAY,CACvD,KAAK,UAAY,GACjB,IAAIQ,EAAS,KAAK,QAClB,GAAKA,EAGL,KAAIH,EAAQ,KAAK,kBAAkB,IAAI,OAAO,EAI9C,KAAK,mBAAmBA,CAAK,EAG7B,KAAK,KAAK,eAAe,CACvB,KAAM,SACR,CAAC,EACH,EAIAL,EAAgB,UAAU,MAAQ,SAAUG,EAAK,CAC/C,KAAK,WAAa,KAClB,KAAK,YAAc,KACnB,IAAI4B,EAAK5B,EAAI,MAAM,EACfI,EAAQ,KAAK,OACbC,EAAS,KAAK,QACduB,GAAMxB,IACR,KAAK,gBAAkB,KACvBA,GAASwB,EAAG,OAAOxB,CAAK,EACxBC,GAAUuB,EAAG,OAAOvB,CAAM,EAC1B,KAAK,OAAS,KACd,KAAK,QAAU,KACf,KAAK,aAAe,MAETqC,GAAM,KAAM,wBAAwB,CACnD,EAIA7C,EAAgB,UAAU,QAAU,UAAY,CAEhD,EACAA,EAAgB,UAAU,WAAa,SAAU8C,EAAIC,EAAIC,EAAW,CAClE,OAAAA,EAAYA,GAAa,EAClB,CACL,EAAGF,EAAGE,CAAS,EACf,EAAGF,EAAG,EAAIE,CAAS,EACnB,MAAOD,EAAGC,CAAS,EACnB,OAAQD,EAAG,EAAIC,CAAS,CAC1B,CACF,EACOhD,CACT,GAAE,EACF,SAASe,IAAYkC,EAAgBtC,EAAeuC,EAAIC,EAAO,CAExDC,IAAWxD,GAAMsD,CAAE,EAAE,SAAUC,CAAK,IACvCvD,GAAMsD,CAAE,EAAE,SAAWC,EACrBxC,EAAwBI,GAAYmC,EAAIC,EAAOF,CAAc,GAAKC,EAAG,cAAc,EAAGA,EAAG,KAAKC,CAAK,GAEvG,CACA,SAASC,IAAWC,EAAWC,EAAU,CACvC,GAAWC,GAASF,CAAS,GAAYE,GAASD,CAAQ,EAAG,CAC3D,IAAIE,EAAW,GACf,OAAOC,EAAKH,EAAU,SAAUI,EAAMC,EAAK,CACzCH,EAAWA,GAAYJ,IAAWC,EAAUM,CAAG,EAAGD,CAAI,CACxD,CAAC,EACM,CAAC,CAACF,CACX,KACE,QAAOH,IAAcC,CAEzB,CACA,SAASxB,IAAoBF,EAAS1B,EAAkB,CACtD0B,EAAQ1B,EAAiB,IAAI,CAAC,QAAS,MAAM,CAAC,EAAI,OAAS,MAAM,EAAE,CACrE,CACA,SAASsC,GAAoBG,EAAO,CAClC,MAAO,CACL,EAAGA,EAAM,GAAK,EACd,EAAGA,EAAM,GAAK,EACd,SAAUA,EAAM,UAAY,CAC9B,CACF,CACA,SAAS3B,IAAqBT,EAAOL,EAAkB0D,EAAQ,CAC7D,IAAIC,EAAI3D,EAAiB,IAAI,GAAG,EAC5B4D,EAAS5D,EAAiB,IAAI,QAAQ,EAC1CK,GAASA,EAAM,SAAS,SAAU2C,EAAI,CAChCA,EAAG,OAAS,UACdW,GAAK,OAASX,EAAG,EAAIW,GACrBC,GAAU,OAASZ,EAAG,OAASY,GAC/BZ,EAAG,OAASU,EAEhB,CAAC,CACH,CACA,IAAOG,GAAQ/D,ICpVR,SAASgE,GAAaC,EAAkB,CAC7C,IAAIC,EAAkBD,EAAiB,IAAI,MAAM,EAC7CE,EAAaF,EAAiB,SAASC,EAAkB,OAAO,EAChEE,EACJ,OAAIF,IAAoB,QACtBE,EAAQD,EAAW,aAAa,EAChCC,EAAM,KAAO,MACJF,IAAoB,WAC7BE,EAAQD,EAAW,aAAa,EAChCC,EAAM,OAAS,MAEVA,CACT,CAIO,SAASC,GAAmBC,EAAUC,EAAWN,EAAkBO,EAAKC,EAAU,CACvF,IAAIC,EAAQT,EAAiB,IAAI,OAAO,EACpCU,EAAOC,GAAcF,EAAOH,EAAU,KAAMA,EAAU,QAASN,EAAiB,IAAI,mBAAmB,EAAG,CAC5G,UAAWA,EAAiB,IAAI,CAAC,QAAS,WAAW,CAAC,EACtD,UAAWA,EAAiB,IAAI,CAAC,QAAS,WAAW,CAAC,CACxD,CAAC,EACGY,EAAaZ,EAAiB,SAAS,OAAO,EAC9Ca,EAAsBC,GAAkBF,EAAW,IAAI,SAAS,GAAK,CAAC,EACtEG,EAAOH,EAAW,QAAQ,EAC1BI,EAAuBC,GAAgBP,EAAMK,CAAI,EACjDG,EAAWV,EAAS,SACpBW,EAAQH,EAAS,MAAQH,EAAS,CAAC,EAAIA,EAAS,CAAC,EACjDO,EAASJ,EAAS,OAASH,EAAS,CAAC,EAAIA,EAAS,CAAC,EAEnDQ,EAAQb,EAAS,MACrBa,IAAU,UAAYH,EAAS,CAAC,GAAKC,GACrCE,IAAU,WAAaH,EAAS,CAAC,GAAKC,EAAQ,GAC9C,IAAIG,EAAgBd,EAAS,cAC7Bc,IAAkB,WAAaJ,EAAS,CAAC,GAAKE,GAC9CE,IAAkB,WAAaJ,EAAS,CAAC,GAAKE,EAAS,GAEvDG,IAAmBL,EAAUC,EAAOC,EAAQb,CAAG,EAC/C,IAAIiB,EAAUZ,EAAW,IAAI,iBAAiB,GAC1C,CAACY,GAAWA,IAAY,UAC1BA,EAAUlB,EAAU,IAAI,CAAC,WAAY,YAAa,OAAO,CAAC,GAE5DD,EAAS,MAAQ,CAEf,EAAGa,EAAS,CAAC,EACb,EAAGA,EAAS,CAAC,EACb,MAAOO,GAAgBb,EAAY,CACjC,KAAMF,EACN,KAAMK,EACN,KAAMH,EAAW,aAAa,EAC9B,QAASC,EACT,gBAAiBW,CACnB,CAAC,EAED,GAAI,EACN,CACF,CAEA,SAASD,IAAmBL,EAAUC,EAAOC,EAAQb,EAAK,CACxD,IAAImB,EAAYnB,EAAI,SAAS,EACzBoB,EAAapB,EAAI,UAAU,EAC/BW,EAAS,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAIC,EAAOO,CAAS,EAAIP,EACzDD,EAAS,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAIE,EAAQO,CAAU,EAAIP,EAC3DF,EAAS,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAG,CAAC,EACrCA,EAAS,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAG,CAAC,CACvC,CACO,SAASP,GAAcF,EAAOmB,EAAMC,EAASC,EAAmBC,EAAK,CAC1EtB,EAAQmB,EAAK,MAAM,MAAMnB,CAAK,EAC9B,IAAIC,EAAOkB,EAAK,MAAM,SAAS,CAC7B,MAAOnB,CACT,EAAG,CAGD,UAAWsB,EAAI,SACjB,CAAC,EACGC,EAAYD,EAAI,UACpB,GAAIC,EAAW,CACb,IAAIC,EAAW,CACb,MAAkBC,GAAgBN,EAAM,CACtC,MAAOnB,CACT,CAAC,EACD,cAAemB,EAAK,IACpB,UAAWA,EAAK,MAChB,WAAY,CAAC,CACf,EACOO,EAAKL,EAAmB,SAAUM,EAAS,CAChD,IAAIC,EAASR,EAAQ,iBAAiBO,EAAQ,WAAW,EACrDE,EAAYF,EAAQ,gBACpBG,EAAaF,GAAUA,EAAO,cAAcC,CAAS,EACzDC,GAAcN,EAAS,WAAW,KAAKM,CAAU,CACnD,CAAC,EACUC,GAASR,CAAS,EAC3BtB,EAAOsB,EAAU,QAAQ,UAAWtB,CAAI,EACxB+B,GAAWT,CAAS,IACpCtB,EAAOsB,EAAUC,CAAQ,EAE7B,CACA,OAAOvB,CACT,CACO,SAASgC,GAAuBd,EAAMnB,EAAOkC,EAAY,CAC9D,IAAIC,EAAmBC,GAAO,EAC9B,OAAOC,GAAOF,EAAWA,EAAWD,EAAW,QAAQ,EAChDI,GAAUH,EAAWA,EAAWD,EAAW,QAAQ,EAC3CK,GAAe,CAACpB,EAAK,YAAYnB,CAAK,GAAIkC,EAAW,aAAe,IAAMA,EAAW,gBAAkB,IAAMA,EAAW,aAAe,EAAE,EAAGC,CAAS,CACtK,CACO,SAASK,GAAkCxC,EAAOJ,EAAUsC,EAAYrC,EAAWN,EAAkBO,EAAK,CAC/G,IAAI2C,EAAaC,GAAY,gBAAgBR,EAAW,SAAU,EAAGA,EAAW,cAAc,EAC9FA,EAAW,YAAc3C,EAAiB,IAAI,CAAC,QAAS,QAAQ,CAAC,EACjEI,GAAmBC,EAAUC,EAAWN,EAAkBO,EAAK,CAC7D,SAAUmC,GAAuBpC,EAAU,KAAMG,EAAOkC,CAAU,EAClE,MAAOO,EAAW,UAClB,cAAeA,EAAW,iBAC5B,CAAC,CACH,CACO,SAASE,GAAcC,EAAIC,EAAIC,EAAW,CAC/C,OAAAA,EAAYA,GAAa,EAClB,CACL,GAAIF,EAAGE,CAAS,EAChB,GAAIF,EAAG,EAAIE,CAAS,EACpB,GAAID,EAAGC,CAAS,EAChB,GAAID,EAAG,EAAIC,CAAS,CACtB,CACF,CACO,SAASC,GAAcC,EAAIC,EAAIH,EAAW,CAC/C,OAAAA,EAAYA,GAAa,EAClB,CACL,EAAGE,EAAGF,CAAS,EACf,EAAGE,EAAG,EAAIF,CAAS,EACnB,MAAOG,EAAGH,CAAS,EACnB,OAAQG,EAAG,EAAIH,CAAS,CAC1B,CACF,CACO,SAASI,GAAgBC,EAAIC,EAAIC,EAAIC,EAAGC,EAAYC,EAAU,CACnE,MAAO,CACL,GAAIL,EACJ,GAAIC,EACJ,GAAIC,EACJ,EAAGC,EACH,WAAYC,EACZ,SAAUC,EACV,UAAW,EACb,CACF,CClJA,IAAIC,KAAoC,SAAUC,EAAQ,CACxDC,EAAUF,EAAsBC,CAAM,EACtC,SAASD,GAAuB,CAC9B,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CAIA,OAAAD,EAAqB,UAAU,aAAe,SAAUG,EAAUC,EAAOC,EAAWC,EAAkBC,EAAK,CACzG,IAAIC,EAAOH,EAAU,KACjBI,EAAOD,EAAK,KACZE,EAAkBJ,EAAiB,IAAI,MAAM,EAC7CK,EAAcC,IAAaH,EAAMD,CAAI,EAAE,aAAaA,CAAI,EAAE,gBAAgB,EAC1EK,EAAaL,EAAK,cAAcA,EAAK,YAAYJ,EAAO,EAAI,CAAC,EACjE,GAAIM,GAAmBA,IAAoB,OAAQ,CACjD,IAAII,EAAqBC,GAAaT,CAAgB,EAClDU,EAAgBC,IAAoBP,CAAe,EAAEF,EAAMK,EAAYF,CAAW,EACtFK,EAAc,MAAQF,EACtBX,EAAS,WAAaa,EAAc,KACpCb,EAAS,QAAUa,CACrB,CACA,IAAIE,EAAiCC,GAAOV,EAAK,QAAQ,EAAGJ,CAAS,EAC1De,GAAkChB,EAAOD,EAAUe,EAAYb,EAAWC,EAAkBC,CAAG,CAC5G,EAIAP,EAAqB,UAAU,mBAAqB,SAAUI,EAAOC,EAAWC,EAAkB,CAChG,IAAIY,EAAiCC,GAAOd,EAAU,KAAK,KAAK,QAAQ,EAAGA,EAAW,CACpF,YAAa,EACf,CAAC,EACDa,EAAW,YAAcZ,EAAiB,IAAI,CAAC,SAAU,QAAQ,CAAC,EAClE,IAAIe,EAAiBC,GAAuBjB,EAAU,KAAMD,EAAOc,CAAU,EAC7E,MAAO,CACL,EAAGG,EAAI,CAAC,EACR,EAAGA,EAAI,CAAC,EACR,SAAUH,EAAW,UAAYA,EAAW,eAAiB,EAAI,KAAK,GAAK,EAC7E,CACF,EAIAlB,EAAqB,UAAU,sBAAwB,SAAUuB,EAAWC,EAAOnB,EAAWC,EAAkB,CAC9G,IAAIE,EAAOH,EAAU,KACjBI,EAAOD,EAAK,KACZiB,EAAajB,EAAK,gBAAgB,EAAI,EACtCG,EAAcC,IAAaH,EAAMD,CAAI,EAAE,aAAaA,CAAI,EAAE,gBAAgB,EAC1EkB,EAAWlB,EAAK,MAAQ,IAAM,EAAI,EAClCmB,EAAe,CAACJ,EAAU,EAAGA,EAAU,CAAC,EAC5CI,EAAaD,CAAQ,GAAKF,EAAME,CAAQ,EACxCC,EAAaD,CAAQ,EAAI,KAAK,IAAID,EAAW,CAAC,EAAGE,EAAaD,CAAQ,CAAC,EACvEC,EAAaD,CAAQ,EAAI,KAAK,IAAID,EAAW,CAAC,EAAGE,EAAaD,CAAQ,CAAC,EACvE,IAAIE,GAAoBjB,EAAY,CAAC,EAAIA,EAAY,CAAC,GAAK,EACvDkB,EAAc,CAACD,EAAkBA,CAAgB,EACrDC,EAAYH,CAAQ,EAAIC,EAAaD,CAAQ,EAE7C,IAAII,EAAiB,CAAC,CACpB,cAAe,QACjB,EAAG,CACD,MAAO,QACT,CAAC,EACD,MAAO,CACL,EAAGH,EAAa,CAAC,EACjB,EAAGA,EAAa,CAAC,EACjB,SAAUJ,EAAU,SACpB,YAAaM,EACb,cAAeC,EAAeJ,CAAQ,CACxC,CACF,EACO1B,CACT,GAAE+B,EAAe,EACjB,SAASnB,IAAaH,EAAMD,EAAM,CAChC,IAAIwB,EAAM,CAAC,EACX,OAAAA,EAAIxB,EAAK,IAAM,WAAW,EAAIA,EAAK,MAC5BC,EAAK,aAAauB,CAAG,CAC9B,CACA,IAAIf,IAAsB,CACxB,KAAM,SAAUT,EAAMK,EAAYF,EAAa,CAC7C,IAAIsB,EAAyBC,GAAc,CAACrB,EAAYF,EAAY,CAAC,CAAC,EAAG,CAACE,EAAYF,EAAY,CAAC,CAAC,EAAGwB,IAAgB3B,CAAI,CAAC,EAC5H,MAAO,CACL,KAAM,OACN,iBAAkB,GAClB,MAAOyB,CACT,CACF,EACA,OAAQ,SAAUzB,EAAMK,EAAYF,EAAa,CAC/C,IAAIyB,EAAY,KAAK,IAAI,EAAG5B,EAAK,aAAa,CAAC,EAC3C6B,EAAO1B,EAAY,CAAC,EAAIA,EAAY,CAAC,EACzC,MAAO,CACL,KAAM,OACN,MAAkB2B,GAAc,CAACzB,EAAauB,EAAY,EAAGzB,EAAY,CAAC,CAAC,EAAG,CAACyB,EAAWC,CAAI,EAAGF,IAAgB3B,CAAI,CAAC,CACxH,CACF,CACF,EACA,SAAS2B,IAAgB3B,EAAM,CAC7B,OAAOA,EAAK,MAAQ,IAAM,EAAI,CAChC,CACA,IAAO+B,IAAQvC,IClGf,IAAIwC,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAiB,KACvBG,CACT,CACA,OAAAH,EAAiB,KAAO,cACxBA,EAAiB,cAAgB,CAE/B,KAAM,OAEN,EAAG,GACH,KAAM,OAGN,KAAM,GACN,eAAgB,GAChB,gBAAiB,GACjB,MAAO,KACP,OAAQ,KACR,KAAM,CAAC,EAGP,UAAW,KACX,wBAAyB,IACzB,UAAW,CACT,MAAOI,EAAO,MAAM,OACpB,MAAO,EACP,KAAM,QACR,EACA,YAAa,CACX,MAAOA,EAAO,MAAM,UACtB,EACA,MAAO,CACL,KAAM,GACN,UAAW,KACX,UAAW,OACX,OAAQ,EACR,MAAOA,EAAO,MAAM,UACpB,QAAS,CAAC,EAAG,EAAG,EAAG,CAAC,EACpB,gBAAiBA,EAAO,MAAM,SAC9B,YAAa,KACb,YAAa,EACb,aAAc,CAChB,EACA,OAAQ,CACN,KAAM,GAEN,KAAM,2MACN,KAAM,GAEN,OAAQ,GAGR,MAAOA,EAAO,MAAM,SAEpB,SAAU,EACZ,CACF,EACOJ,CACT,GAAEK,EAAc,EACTC,IAAQN,IC9Df,IAAIO,GAAQC,GAAU,EAClBC,IAAcA,EAQX,SAASC,GAASC,EAAKC,EAAKC,EAAS,CAC1C,GAAI,CAAAC,GAAI,KAGR,KAAIC,EAAKH,EAAI,MAAM,EACnBL,GAAMQ,CAAE,EAAE,UAAYR,GAAMQ,CAAE,EAAE,QAAU,CAAC,GAC3CC,IAAoBD,EAAIH,CAAG,EAC3B,IAAIK,EAASV,GAAMQ,CAAE,EAAE,QAAQJ,CAAG,IAAMJ,GAAMQ,CAAE,EAAE,QAAQJ,CAAG,EAAI,CAAC,GAClEM,EAAO,QAAUJ,EACnB,CACA,SAASG,IAAoBD,EAAIH,EAAK,CACpC,GAAIL,GAAMQ,CAAE,EAAE,YACZ,OAEFR,GAAMQ,CAAE,EAAE,YAAc,GACxBG,EAAW,QAAgBC,GAAMC,IAAS,OAAO,CAAC,EAClDF,EAAW,YAAoBC,GAAMC,IAAS,WAAW,CAAC,EAE1DF,EAAW,YAAaG,GAAO,EAC/B,SAASH,EAAWI,EAAWC,EAAI,CACjCR,EAAG,GAAGO,EAAW,SAAUE,EAAG,CAC5B,IAAIC,EAAMC,IAAmBd,CAAG,EAChCH,IAAKF,GAAMQ,CAAE,EAAE,QAAS,SAAUE,EAAQ,CACxCA,GAAUM,EAAGN,EAAQO,EAAGC,EAAI,cAAc,CAC5C,CAAC,EACDE,IAAuBF,EAAI,SAAUb,CAAG,CAC1C,CAAC,CACH,CACF,CACA,SAASe,IAAuBC,EAAUhB,EAAK,CAC7C,IAAIiB,EAAUD,EAAS,QAAQ,OAC3BE,EAAUF,EAAS,QAAQ,OAC3BG,EACAF,EACFE,EAAkBH,EAAS,QAAQC,EAAU,CAAC,EACrCC,IACTC,EAAkBH,EAAS,QAAQE,EAAU,CAAC,GAE5CC,IACFA,EAAgB,eAAiB,KACjCnB,EAAI,eAAemB,CAAe,EAEtC,CACA,SAASV,IAAQJ,EAAQO,EAAGQ,EAAgB,CAC1Cf,EAAO,QAAQ,QAAS,KAAMe,CAAc,CAC9C,CACA,SAASZ,IAAQa,EAAahB,EAAQO,EAAGQ,EAAgB,CACvDf,EAAO,QAAQgB,EAAaT,EAAGQ,CAAc,CAC/C,CACA,SAASN,IAAmBd,EAAK,CAC/B,IAAIgB,EAAW,CACb,QAAS,CAAC,EACV,QAAS,CAAC,CACZ,EAMII,EAAiB,SAAUE,EAAS,CACtC,IAAIC,EAAcP,EAASM,EAAQ,IAAI,EACnCC,EACFA,EAAY,KAAKD,CAAO,GAExBA,EAAQ,eAAiBF,EACzBpB,EAAI,eAAesB,CAAO,EAE9B,EACA,MAAO,CACL,eAAgBF,EAChB,SAAUJ,CACZ,CACF,CACO,SAASQ,GAAWzB,EAAKC,EAAK,CACnC,GAAI,CAAAE,GAAI,KAGR,KAAIC,EAAKH,EAAI,MAAM,EACfK,GAAUV,GAAMQ,CAAE,EAAE,SAAW,CAAC,GAAGJ,CAAG,EACtCM,IACFV,GAAMQ,CAAE,EAAE,QAAQJ,CAAG,EAAI,MAE7B,CC3FA,IAAI0B,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,UAAU,OAAS,SAAUI,EAAwBC,EAASC,EAAK,CACjF,IAAIC,EAAqBF,EAAQ,aAAa,SAAS,EACnDG,EAAYJ,EAAuB,IAAI,WAAW,GAAKG,GAAsBA,EAAmB,IAAI,WAAW,GAAK,kBAGzGE,GAAS,cAAeH,EAAK,SAAUI,EAAaC,EAAGC,EAAgB,CAEhFJ,IAAc,SAAWE,IAAgB,SAAWF,EAAU,QAAQE,CAAW,GAAK,IACxFE,EAAe,CACb,KAAM,oBACN,YAAaF,EACb,EAAGC,GAAKA,EAAE,QACV,EAAGA,GAAKA,EAAE,OACZ,CAAC,CAEL,CAAC,CACH,EACAX,EAAgB,UAAU,OAAS,SAAUK,EAASC,EAAK,CAC1CO,GAAW,cAAeP,CAAG,CAC9C,EACAN,EAAgB,UAAU,QAAU,SAAUK,EAASC,EAAK,CAC3CO,GAAW,cAAeP,CAAG,CAC9C,EACAN,EAAgB,KAAO,cAChBA,CACT,GAAEc,EAAa,EACRC,IAAQf,IC7BA,SAARgB,GAAqCC,EAAQC,EAAS,CAC3D,IAAIC,EAAQ,CAAC,EACTC,EAAcH,EAAO,YACrBI,EACJ,GAAID,GAAe,MAAQ,EAAEC,EAAcH,EAAQ,iBAAiBE,CAAW,GAC7E,MAAO,CACL,MAAO,CAAC,CACV,EAEF,IAAIE,EAAOD,EAAY,QAAQ,EAC3BE,EAAsBC,GAAeF,EAAML,CAAM,EACrD,GAAIM,GAAa,MAAQA,EAAY,GAAYE,EAAQF,CAAS,EAChE,MAAO,CACL,MAAO,CAAC,CACV,EAEF,IAAIG,EAAKJ,EAAK,iBAAiBC,CAAS,EACpCI,EAAWN,EAAY,iBAC3B,GAAIA,EAAY,mBACdF,EAAQE,EAAY,mBAAmBE,CAAS,GAAK,CAAC,UAC7CI,GAAYA,EAAS,YAC9B,GAAIV,EAAO,UAAW,CACpB,IAAIW,EAAWD,EAAS,YAAY,EAChCE,EAAYF,EAAS,aAAaC,CAAQ,EAC1CE,EAAeD,EAAU,IACzBE,EAAcH,EAAS,IACvBI,EAAiBF,IAAiB,KAAOA,IAAiB,SAAW,EAAI,EACzEG,EAAUX,EAAK,aAAaS,CAAW,EACvCG,EAAc,CAAC,EACnBA,EAAYF,CAAc,EAAIV,EAAK,IAAIW,EAASV,CAAS,EACzDW,EAAY,EAAIF,CAAc,EAAIV,EAAK,IAAIA,EAAK,mBAAmB,sBAAsB,EAAGC,CAAS,EACrGJ,EAAQQ,EAAS,YAAYO,CAAW,GAAK,CAAC,CAChD,MACEf,EAAQQ,EAAS,YAAYL,EAAK,UAAiBa,EAAIR,EAAS,WAAY,SAAUS,EAAK,CACzF,OAAOd,EAAK,aAAac,CAAG,CAC9B,CAAC,EAAGb,CAAS,CAAC,GAAK,CAAC,UAEbG,EAAI,CAEb,IAAIW,EAAOX,EAAG,gBAAgB,EAAE,MAAM,EACtCW,EAAK,eAAeX,EAAG,SAAS,EAChCP,EAAQ,CAACkB,EAAK,EAAIA,EAAK,MAAQ,EAAGA,EAAK,EAAIA,EAAK,OAAS,CAAC,CAC5D,CACA,MAAO,CACL,MAAOlB,EACP,GAAIO,CACN,CACF,CClDA,IAAIY,IAAQC,GAAU,EAOP,SAARC,GAA6BC,EAASC,EAASC,EAAK,CACzD,IAAIC,EAAcH,EAAQ,YACtBI,EAAQ,CAACJ,EAAQ,EAAGA,EAAQ,CAAC,EAC7BK,EAASL,EACTM,EAAiBN,EAAQ,gBAAkBO,GAAKL,EAAI,eAAgBA,CAAG,EACvEM,EAAmBP,EAAQ,aAAa,aAAa,EAAE,iBAG3D,GAAKO,EAGL,CAAIC,GAAaL,CAAK,IAGpBA,EAAQM,GAAoB,CAC1B,YAAaL,EAAO,YAGpB,UAAWA,EAAO,SACpB,EAAGJ,CAAO,EAAE,OAEd,IAAIU,EAAiBF,GAAaL,CAAK,EAKnCQ,EAAgBP,EAAO,SACvBQ,EAAWL,EAAiB,SAC5BM,EAAaX,IAAgB,SAAWM,GAAaL,CAAK,EAC1DW,EAAgB,CAAC,EACjBC,EAAe,CAAC,EAChBC,EAAiB,CACnB,KAAM,CAAC,EACP,IAAK,CAAC,CACR,EACIC,EAAW,CACb,YAAaC,GAAMC,IAAaJ,CAAY,EAC5C,YAAaG,GAAME,IAAaJ,CAAc,CAChD,EAEAK,EAAKd,EAAiB,YAAa,SAAUe,EAAUC,EAAa,CAElE,IAAIC,EAAwBd,GAAkBY,EAAS,aAAanB,CAAK,EACzEkB,EAAKd,EAAiB,iBAAiBgB,CAAW,EAAG,SAAUE,EAAUC,EAAK,CAC5E,IAAIC,EAAOF,EAAS,KAChBG,EAAgBC,IAAkBlB,EAAec,CAAQ,EAE7D,GAAI,CAACZ,GAAcW,IAA0B,CAACb,GAAiBiB,GAAgB,CAC7E,IAAIE,EAAMF,GAAiBA,EAAc,MACrCE,GAAO,MAAQ,CAACpB,IAClBoB,EAAMH,EAAK,YAAYxB,CAAK,GAE9B2B,GAAO,MAAQC,IAAcN,EAAUK,EAAKb,EAAU,GAAOH,CAAa,CAC5E,CACF,CAAC,CACH,CAAC,EAED,IAAIkB,EAAe,CAAC,EACpB,OAAAX,EAAKT,EAAU,SAAUqB,EAAaC,EAAQ,CAC5C,IAAIC,EAAYF,EAAY,UAExBE,GAAa,CAACpB,EAAamB,CAAM,GACnCb,EAAKc,EAAU,SAAU,SAAUC,EAAaC,EAAQ,CACtD,IAAIC,EAAavB,EAAasB,CAAM,EAEpC,GAAID,IAAgBH,GAAeK,EAAY,CAC7C,IAAIR,EAAMQ,EAAW,MACrBH,EAAU,SAAWL,EAAMG,EAAY,KAAK,MAAM,MAAME,EAAU,OAAOL,EAAKS,IAAgBH,CAAW,EAAGG,IAAgBN,CAAW,CAAC,CAAC,GACzID,EAAaC,EAAY,GAAG,EAAIH,CAClC,CACF,CAAC,CAEL,CAAC,EACDT,EAAKW,EAAc,SAAUF,EAAKI,EAAQ,CACxCH,IAAcnB,EAASsB,CAAM,EAAGJ,EAAKb,EAAU,GAAMH,CAAa,CACpE,CAAC,EACD0B,IAAoBzB,EAAcH,EAAUE,CAAa,EACzD2B,IAAwBzB,EAAgBb,EAAOJ,EAASM,CAAc,EACtEqC,IAAyB9B,EAAUP,EAAgBJ,CAAG,EAC/Ca,EACT,CACA,SAASiB,IAAcN,EAAUkB,EAAU1B,EAAU2B,EAAQC,EAAc,CACzE,IAAIlB,EAAOF,EAAS,KACpB,GAAI,EAAAE,EAAK,MAAM,QAAQ,GAAK,CAACA,EAAK,YAAYgB,CAAQ,GAGtD,IAAI,CAAClB,EAAS,cAAe,CAC3BR,EAAS,YAAYQ,EAAUkB,CAAQ,EACvC,MACF,CAEA,IAAIG,EAAcC,IAAsBJ,EAAUlB,CAAQ,EACtDuB,EAAeF,EAAY,aAC3BG,EAAcH,EAAY,YAG1BE,EAAa,CAAC,GAAKH,EAAa,aAAe,MACjDK,EAAOL,EAAcG,EAAa,CAAC,CAAC,EAIlC,CAACJ,GAAUnB,EAAS,MAClBE,EAAK,YAAYsB,CAAW,GAAKA,GAAe,OAClDN,EAAWM,GAGfhC,EAAS,YAAYQ,EAAUkB,EAAUK,CAAY,EAGrD/B,EAAS,YAAYQ,EAAUqB,EAAaG,CAAW,EACzD,CACA,SAASF,IAAsBI,EAAO1B,EAAU,CAC9C,IAAIE,EAAOF,EAAS,KAChB2B,EAAMzB,EAAK,IACXsB,EAAcE,EACdH,EAAe,CAAC,EAChBK,EAAU,OAAO,UACjBC,EAAU,GACd,OAAAjC,EAAKI,EAAS,aAAc,SAAU8B,EAAQC,EAAK,CACjD,IAAIC,EAAUF,EAAO,QAAQ,EAAE,iBAAiBH,CAAG,EAC/CM,EACAC,EACJ,GAAIJ,EAAO,mBAAoB,CAC7B,IAAIK,EAASL,EAAO,mBAAmBE,EAASN,EAAOxB,CAAI,EAC3DgC,EAAcC,EAAO,YACrBF,EAAqBE,EAAO,YAC9B,KAAO,CAML,GALAD,EAAcJ,EAAO,iBAAiBH,EAAKK,EAAQ,CAAC,EAAGN,EAIvDxB,EAAK,OAAS,WAAa,GAAM,IAAI,EACjC,CAACgC,EAAY,OACf,OAEFD,EAAqBH,EAAO,QAAQ,EAAE,IAAIE,EAAQ,CAAC,EAAGE,EAAY,CAAC,CAAC,CACtE,CACA,GAAI,EAAAD,GAAsB,MAAQ,CAAC,SAASA,CAAkB,GAG9D,KAAIG,EAAOV,EAAQO,EACfI,EAAO,KAAK,IAAID,CAAI,EAEpBC,GAAQT,KACNS,EAAOT,GAAWQ,GAAQ,GAAKP,EAAU,KAC3CD,EAAUS,EACVR,EAAUO,EACVZ,EAAcS,EACdV,EAAa,OAAS,GAExB3B,EAAKsC,EAAa,SAAUI,EAAW,CACrCf,EAAa,KAAK,CAChB,YAAaO,EAAO,YACpB,gBAAiBQ,EACjB,UAAWR,EAAO,QAAQ,EAAE,YAAYQ,CAAS,CACnD,CAAC,CACH,CAAC,GAEL,CAAC,EACM,CACL,aAAcf,EACd,YAAaC,CACf,CACF,CACA,SAAS9B,IAAYJ,EAAcU,EAAU0B,EAAOH,EAAc,CAChEjC,EAAaU,EAAS,GAAG,EAAI,CAC3B,MAAO0B,EACP,aAAcH,CAChB,CACF,CACA,SAAS5B,IAAYJ,EAAgBS,EAAUqB,EAAaK,EAAO,CACjE,IAAIH,EAAeF,EAAY,aAC3BnB,EAAOF,EAAS,KAChBuC,EAAYrC,EAAK,MACjBsC,EAAmBxC,EAAS,iBAGhC,GAAI,GAACA,EAAS,gBAAkB,CAACuB,EAAa,QAG9C,KAAIkB,EAAgBzC,EAAS,SAAS,MAClCF,EAA0B4C,GAAQD,CAAa,EAC/CE,EAAepD,EAAe,IAAIO,CAAW,EAC5C6C,IACHA,EAAepD,EAAe,IAAIO,CAAW,EAAI,CAC/C,WAAY2C,EAAc,GAC1B,cAAeA,EAAc,eAC7B,aAAcA,EAAc,KAC5B,iBAAkBA,EAAc,SAChC,WAAY,CAAC,CACf,EACAlD,EAAe,KAAK,KAAKoD,CAAY,GAEvCA,EAAa,WAAW,KAAK,CAC3B,QAASzC,EAAK,IACd,UAAWqC,EAAU,eACrB,SAAUA,EAAU,KACpB,OAAQA,EAAU,GAClB,MAAOb,EAKP,cAAe,CACb,UAAWc,EAAiB,IAAI,CAAC,QAAS,WAAW,CAAC,EACtD,UAAWA,EAAiB,IAAI,CAAC,QAAS,WAAW,CAAC,CACxD,EACA,kBAAmBjB,EAAa,MAAM,CACxC,CAAC,EACH,CACA,SAASR,IAAoBzB,EAAcH,EAAUE,EAAe,CAClE,IAAIuD,EAAiBvD,EAAc,SAAW,CAAC,EAE/CO,EAAKT,EAAU,SAAUa,EAAUC,EAAK,CACtC,IAAI4C,EAAS7C,EAAS,iBAAiB,OACnC8C,EAAUxD,EAAaW,CAAG,EAC1B6C,GACF,CAAC9C,EAAS,YAAc6C,EAAO,OAAS,QACxCA,EAAO,MAAQC,EAAQ,MAEvBD,EAAO,mBAAqBC,EAAQ,cAAgB,CAAC,GAAG,MAAM,GAO9D,CAAC9C,EAAS,YAAc6C,EAAO,OAAS,QAG1CA,EAAO,SAAW,QAAUD,EAAe,KAAK,CAC9C,QAAS5C,EAAS,KAAK,IACvB,UAAWA,EAAS,KAAK,MAAM,eAC/B,MAAO6C,EAAO,KAChB,CAAC,CACH,CAAC,CACH,CACA,SAAS7B,IAAwBzB,EAAgBb,EAAOJ,EAASM,EAAgB,CAE/E,GAAIG,GAAaL,CAAK,GAAK,CAACa,EAAe,KAAK,OAAQ,CACtDX,EAAe,CACb,KAAM,SACR,CAAC,EACD,MACF,CAKA,IAAImE,IAAexD,EAAe,KAAK,CAAC,EAAE,WAAW,CAAC,GAAK,CAAC,GAAG,mBAAqB,CAAC,GAAG,CAAC,GAAK,CAAC,EAC/FX,EAAe,CACb,KAAM,UACN,cAAe,GACf,EAAGF,EAAM,CAAC,EACV,EAAGA,EAAM,CAAC,EACV,cAAeJ,EAAQ,cACvB,SAAUA,EAAQ,SAClB,gBAAiByE,EAAW,gBAC5B,UAAWA,EAAW,UACtB,YAAaA,EAAW,YACxB,eAAgBxD,EAAe,IACjC,CAAC,CACH,CACA,SAAS0B,IAAyB9B,EAAUP,EAAgBJ,EAAK,CAI/D,IAAIwE,EAAKxE,EAAI,MAAM,EACfyE,EAAc,4BACdC,EAAiB/E,IAAM6E,CAAE,EAAEC,CAAW,GAAK,CAAC,EAC5CE,EAAgBhF,IAAM6E,CAAE,EAAEC,CAAW,EAAI,CAAC,EAG9CrD,EAAKT,EAAU,SAAUa,EAAUC,EAAK,CACtC,IAAI4C,EAAS7C,EAAS,iBAAiB,OACvC6C,EAAO,SAAW,QAAU7C,EAAS,iBAAmBJ,EAAKiD,EAAO,kBAAmB,SAAUO,EAAW,CAC1G,IAAInD,EAAMmD,EAAU,YAAc,MAAQA,EAAU,UACpDD,EAAclD,CAAG,EAAImD,CACvB,CAAC,CACH,CAAC,EAED,IAAIC,EAAc,CAAC,EACfC,EAAa,CAAC,EAClB1D,EAAKsD,EAAgB,SAAUE,EAAWnD,EAAK,CAC7C,CAACkD,EAAclD,CAAG,GAAKqD,EAAW,KAAKF,CAAS,CAClD,CAAC,EACDxD,EAAKuD,EAAe,SAAUC,EAAWnD,EAAK,CAC5C,CAACiD,EAAejD,CAAG,GAAKoD,EAAY,KAAKD,CAAS,CACpD,CAAC,EACDE,EAAW,QAAU9E,EAAI,eAAe,CACtC,KAAM,WACN,cAAe,GAEf,QAAS,GACT,MAAO8E,CACT,CAAC,EACDD,EAAY,QAAU7E,EAAI,eAAe,CACvC,KAAM,YACN,cAAe,GAEf,QAAS,GACT,MAAO6E,CACT,CAAC,CACH,CACA,SAASjD,IAAkBlB,EAAec,EAAU,CAClD,QAASuD,EAAI,EAAGA,GAAKrE,GAAiB,CAAC,GAAG,OAAQqE,IAAK,CACrD,IAAIpD,EAAgBjB,EAAcqE,CAAC,EACnC,GAAIvD,EAAS,KAAK,MAAQG,EAAc,SAAWH,EAAS,KAAK,MAAM,iBAAmBG,EAAc,UACtG,OAAOA,CAEX,CACF,CACA,SAASW,IAAgBd,EAAU,CACjC,IAAIuC,EAAYvC,EAAS,KAAK,MAC1BwD,EAAO,CAAC,EACR7B,EAAM6B,EAAK,QAAUxD,EAAS,KAAK,IACvC,OAAAwD,EAAK,UAAYA,EAAK7B,EAAM,WAAW,EAAIY,EAAU,eACrDiB,EAAK,SAAWA,EAAK7B,EAAM,UAAU,EAAIY,EAAU,KACnDiB,EAAK,OAASA,EAAK7B,EAAM,QAAQ,EAAIY,EAAU,GACxCiB,CACT,CACA,SAASzE,GAAaL,EAAO,CAC3B,MAAO,CAACA,GAASA,EAAM,CAAC,GAAK,MAAQ,MAAMA,EAAM,CAAC,CAAC,GAAKA,EAAM,CAAC,GAAK,MAAQ,MAAMA,EAAM,CAAC,CAAC,CAC5F,CCvUO,SAAS+E,GAAQC,EAAW,CAIjCC,GAAS,yBAAyB,uBAAwBC,GAAoB,EAC9EF,EAAU,uBAAuBG,GAAgB,EACjDH,EAAU,sBAAsBI,GAAe,EAC/CJ,EAAU,qBAAqB,SAAUK,EAAQ,CAE/C,GAAIA,EAAQ,EACT,CAACA,EAAO,aAAeA,EAAO,YAAY,SAAW,KAAOA,EAAO,YAAc,CAAC,GACnF,IAAIC,EAAOD,EAAO,YAAY,KAI1BC,GAAQ,CAACC,EAAQD,CAAI,IACvBD,EAAO,YAAY,KAAO,CAACC,CAAI,EAEnC,CACF,CAAC,EAGDN,EAAU,kBAAkBA,EAAU,SAAS,UAAU,UAAW,SAAUQ,EAASC,EAAK,CAG1FD,EAAQ,aAAa,aAAa,EAAE,iBAAmBE,IAAQF,EAASC,CAAG,CAC7E,CAAC,EAEDT,EAAU,eAAe,CACvB,KAAM,oBACN,MAAO,oBACP,OAAQ,oBACV,EAAGW,EAAW,CAChB,CCrCO,SAASC,GAAQC,EAAW,CACjCC,GAAIF,EAAa,EACjBE,GAAIF,EAAkB,CACxB,CCAA,IAAIG,KAAgC,SAAUC,EAAQ,CACpDC,EAAUF,EAAkBC,CAAM,EAClC,SAASD,GAAmB,CAC1B,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CAIA,OAAAD,EAAiB,UAAU,aAAe,SAAUG,EAAUC,EAAOC,EAAWC,EAAkBC,EAAK,CACrG,IAAIC,EAAOH,EAAU,KACjBG,EAAK,MAAQ,UACf,KAAK,mBAAqB,KAAK,GAAK,IAEtC,IAAIC,EAAQD,EAAK,MACbE,EAAYD,EAAM,aAAaD,CAAI,EACnCG,EAAcD,EAAU,UAAU,EAClCE,EAAaJ,EAAK,YAAYJ,CAAK,EACnCS,EAAkBP,EAAiB,IAAI,MAAM,EACjD,GAAIO,GAAmBA,IAAoB,OAAQ,CACjD,IAAIC,EAAqBC,GAAaT,CAAgB,EAClDU,EAAgBC,IAAoBJ,CAAe,EAAEL,EAAMC,EAAOG,EAAYD,CAAW,EAC7FK,EAAc,MAAQF,EACtBX,EAAS,WAAaa,EAAc,KACpCb,EAAS,QAAUa,CACrB,CACA,IAAIE,EAAcZ,EAAiB,IAAI,CAAC,QAAS,QAAQ,CAAC,EACtDa,EAAWC,IAAiBhB,EAAOC,EAAWC,EAAkBG,EAAOS,CAAW,EAC3EG,GAAmBlB,EAAUE,EAAWC,EAAkBC,EAAKY,CAAQ,CACpF,EACOnB,CACT,GAAEsB,EAAe,EAEjB,SAASF,IAAiBhB,EAAOC,EAAWC,EAAkBG,EAAOS,EAAa,CAChF,IAAIV,EAAOH,EAAU,KACjBkB,EAAQf,EAAK,YAAYJ,CAAK,EAC9BoB,EAAYf,EAAM,aAAa,EAAE,UAAU,EAAE,CAAC,EAClDe,EAAYA,EAAY,IAAM,KAAK,GACnC,IAAIC,EAAehB,EAAM,cAAc,EAAE,UAAU,EAC/CiB,EACAC,EACAC,EACJ,GAAIpB,EAAK,MAAQ,SAAU,CACzB,IAAIqB,EAAmBC,GAAO,EACvBC,GAAOF,EAAWA,EAAWL,CAAS,EACtCQ,GAAUH,EAAWA,EAAW,CAACpB,EAAM,GAAIA,EAAM,EAAE,CAAC,EAC3DiB,EAAmBO,GAAe,CAACV,EAAO,CAACL,CAAW,EAAGW,CAAS,EAClE,IAAIK,EAAgB7B,EAAU,SAAS,WAAW,EAAE,IAAI,QAAQ,GAAK,EAEjE8B,EAAcC,GAAY,gBAAgBZ,EAAWU,EAAgB,KAAK,GAAK,IAAK,EAAE,EAC1FP,EAAQQ,EAAY,UACpBP,EAAgBO,EAAY,iBAC9B,KAAO,CAEL,IAAIE,EAAIZ,EAAa,CAAC,EACtBC,EAAWjB,EAAM,aAAa,CAAC4B,EAAInB,EAAaK,CAAK,CAAC,EACtD,IAAIe,EAAK7B,EAAM,GACX8B,EAAK9B,EAAM,GACfkB,EAAQ,KAAK,IAAID,EAAS,CAAC,EAAIY,CAAE,EAAID,EAAI,GAAM,SAAWX,EAAS,CAAC,EAAIY,EAAK,OAAS,QACtFV,EAAgB,KAAK,IAAIF,EAAS,CAAC,EAAIa,CAAE,EAAIF,EAAI,GAAM,SAAWX,EAAS,CAAC,EAAIa,EAAK,MAAQ,QAC/F,CACA,MAAO,CACL,SAAUb,EACV,MAAOC,EACP,cAAeC,CACjB,CACF,CACA,IAAIX,IAAsB,CACxB,KAAM,SAAUT,EAAMC,EAAOG,EAAYD,EAAa,CACpD,OAAOH,EAAK,MAAQ,QAAU,CAC5B,KAAM,OACN,MAAkBgC,GAAc/B,EAAM,aAAa,CAACE,EAAY,CAAC,EAAGC,CAAU,CAAC,EAAGH,EAAM,aAAa,CAACE,EAAY,CAAC,EAAGC,CAAU,CAAC,CAAC,CACpI,EAAI,CACF,KAAM,SACN,MAAO,CACL,GAAIH,EAAM,GACV,GAAIA,EAAM,GACVG,CACF,CACF,CACF,EACA,OAAQ,SAAUJ,EAAMC,EAAOG,EAAYD,EAAa,CACtD,IAAI8B,EAAY,KAAK,IAAI,EAAGjC,EAAK,aAAa,CAAC,EAC3CkC,EAAS,KAAK,GAAK,IACvB,OAAOlC,EAAK,MAAQ,QAAU,CAC5B,KAAM,SACN,MAAkBmC,GAAgBlC,EAAM,GAAIA,EAAM,GAAIE,EAAY,CAAC,EAAGA,EAAY,CAAC,GAElF,CAACC,EAAa6B,EAAY,GAAKC,GAAS,CAAC9B,EAAa6B,EAAY,GAAKC,CAAM,CAChF,EAAI,CACF,KAAM,SACN,MAAkBC,GAAgBlC,EAAM,GAAIA,EAAM,GAAIG,EAAa6B,EAAY,EAAG7B,EAAa6B,EAAY,EAAG,EAAG,KAAK,GAAK,CAAC,CAC9H,CACF,CACF,EACOG,IAAQ5C,IClGf,IAAI6C,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KACjBG,CACT,CACA,OAAAH,EAAW,UAAU,cAAgB,SAAUI,EAAU,CACvD,IAAIC,EACAC,EAAU,KAAK,QACnB,OAAAA,EAAQ,cAAcF,EAAU,SAAUG,EAAW,CAC/CA,EAAU,iBAAiB,IAAM,OACnCF,EAAiBE,EAErB,EAAG,IAAI,EACAF,CACT,EACAL,EAAW,KAAO,QAClBA,EAAW,aAAe,CAAC,aAAc,WAAW,EACpDA,EAAW,cAAgB,CAEzB,EAAG,EACH,OAAQ,CAAC,MAAO,KAAK,EACrB,OAAQ,KACV,EACOA,CACT,GAAEQ,EAAc,EACTC,IAAQT,ICxBf,IAAIU,IAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAe,UAAU,iBAAmB,UAAY,CACtD,OAAO,KAAK,uBAAuB,QAASG,EAAgB,EAAE,OAAO,CAAC,CACxE,EACAH,EAAe,KAAO,YACfA,CACT,GAAEI,EAAc,EACTC,GAAML,GAAgBM,EAAoB,EAEjD,IAAIC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KACrBG,CACT,CACA,OAAAH,EAAe,KAAO,YACfA,CACT,GAAEI,EAAc,EAEhB,IAAIC,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,KAAO,aAChBA,CACT,GAAEI,EAAc,ECpChB,IAAIC,IAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,EAAWG,EAAOC,EAAc,CACvC,OAAOH,EAAO,KAAK,KAAM,SAAUE,EAAOC,CAAY,GAAK,IAC7D,CACA,OAAAJ,EAAW,UAAU,YAAc,SAAUK,EAAOC,EAAO,CACzD,OAAO,KAAK,MAAM,YAAYD,EAAOC,CAAK,EAAE,KAAK,MAAQ,SAAW,EAAI,CAAC,CAC3E,EACON,CACT,GAAEO,EAAI,EACNP,GAAW,UAAU,aAAeO,GAAK,UAAU,YACnDP,GAAW,UAAU,aAAeO,GAAK,UAAU,YACnD,IAAOC,IAAQR,GCVf,IAAIS,IAAQC,GAAU,EAClBC,IAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,EAAUG,EAAOC,EAAa,CACrC,OAAOH,EAAO,KAAK,KAAM,QAASE,EAAOC,GAAe,CAAC,EAAG,GAAG,CAAC,GAAK,IACvE,CACA,OAAAJ,EAAU,UAAU,YAAc,SAAUK,EAAOC,EAAO,CACxD,OAAO,KAAK,MAAM,YAAYD,EAAOC,CAAK,EAAE,KAAK,MAAQ,SAAW,EAAI,CAAC,CAC3E,EAQAN,EAAU,UAAU,0BAA4B,UAAY,CAC1D,IAAIO,EAAO,KACPC,EAAaD,EAAK,cAAc,EAChCE,EAAeF,EAAK,MACpBG,EAAgBD,EAAa,UAAU,EAIvCE,EAAYF,EAAa,MAAM,EACnC,GAAIC,EAAc,CAAC,EAAIA,EAAc,CAAC,EAAI,EACxC,MAAO,GAET,IAAIE,EAAYF,EAAc,CAAC,EAC3BG,EAAWN,EAAK,YAAYK,EAAY,CAAC,EAAIL,EAAK,YAAYK,CAAS,EACvEE,EAAQ,KAAK,IAAID,CAAQ,EAGzBE,EAAmBC,GAAgBJ,GAAa,KAAO,GAAKA,EAAY,GAAIJ,EAAW,QAAQ,EAAG,SAAU,KAAK,EACjHS,EAAO,KAAK,IAAIF,EAAK,OAAQ,CAAC,EAC9BG,EAAKD,EAAOH,EAEhB,MAAMI,CAAE,IAAMA,EAAK,KACnB,IAAIC,EAAW,KAAK,IAAI,EAAG,KAAK,MAAMD,CAAE,CAAC,EACrCE,EAAQtB,IAAMS,EAAK,KAAK,EACxBc,EAAmBD,EAAM,iBACzBE,EAAgBF,EAAM,cAI1B,OAAIC,GAAoB,MAAQC,GAAiB,MAAQ,KAAK,IAAID,EAAmBF,CAAQ,GAAK,GAAK,KAAK,IAAIG,EAAgBX,CAAS,GAAK,GAG3IU,EAAmBF,EACpBA,EAAWE,GAKXD,EAAM,cAAgBT,EACtBS,EAAM,iBAAmBD,GAEpBA,CACT,EACOnB,CACT,GAAEuB,EAAI,EACNvB,GAAU,UAAU,YAAcuB,GAAK,UAAU,YACjDvB,GAAU,UAAU,YAAcuB,GAAK,UAAU,YACjD,IAAOC,IAAQxB,GCjER,IAAIyB,GAAkB,CAAC,SAAU,OAAO,EAC3CC,KAAqB,UAAY,CACnC,SAASA,EAAMC,EAAM,CACnB,KAAK,WAAaF,GAClB,KAAK,KAAO,QAIZ,KAAK,GAAK,EAIV,KAAK,GAAK,EACV,KAAK,YAAc,IAAIG,IACvB,KAAK,WAAa,IAAIC,IACtB,KAAK,mBAAqB,GAC1B,KAAK,KAAOF,GAAQ,GACpB,KAAK,YAAY,MAAQ,KAAK,WAAW,MAAQ,IACnD,CAIA,OAAAD,EAAM,UAAU,aAAe,SAAUI,EAAO,CAC9C,IAAIC,EAAQ,KAAK,aAAaD,CAAK,EACnC,OAAO,KAAK,YAAY,QAAQC,EAAM,CAAC,CAAC,GAAK,KAAK,WAAW,QAAQA,EAAM,CAAC,CAAC,CAC/E,EAIAL,EAAM,UAAU,YAAc,SAAUM,EAAM,CAC5C,OAAO,KAAK,YAAY,YAAYA,EAAK,CAAC,CAAC,GAAK,KAAK,WAAW,YAAYA,EAAK,CAAC,CAAC,CACrF,EACAN,EAAM,UAAU,QAAU,SAAUO,EAAK,CACvC,IAAIC,EAAM,IAAMD,EAAM,OACtB,OAAO,KAAKC,CAAG,CACjB,EACAR,EAAM,UAAU,QAAU,UAAY,CACpC,MAAO,CAAC,KAAK,YAAa,KAAK,UAAU,CAC3C,EAIAA,EAAM,UAAU,eAAiB,SAAUS,EAAW,CACpD,IAAIC,EAAO,CAAC,EACRC,EAAY,KAAK,WACjBC,EAAa,KAAK,YACtB,OAAAD,EAAU,MAAM,OAASF,GAAaC,EAAK,KAAKC,CAAS,EACzDC,EAAW,MAAM,OAASH,GAAaC,EAAK,KAAKE,CAAU,EACpDF,CACT,EACAV,EAAM,UAAU,aAAe,UAAY,CACzC,OAAO,KAAK,UACd,EACAA,EAAM,UAAU,cAAgB,UAAY,CAC1C,OAAO,KAAK,WACd,EACAA,EAAM,UAAU,aAAe,SAAUa,EAAM,CAC7C,IAAIF,EAAY,KAAK,WACrB,OAAOE,IAASF,EAAY,KAAK,YAAcA,CACjD,EAKAX,EAAM,UAAU,YAAc,UAAY,CACxC,OAAO,KAAK,eAAe,SAAS,EAAE,CAAC,GAAK,KAAK,eAAe,MAAM,EAAE,CAAC,GAAK,KAAK,aAAa,CAClG,EACAA,EAAM,UAAU,eAAiB,SAAUO,EAAK,CAC9C,IAAIO,EAAWP,GAAO,MAAQA,IAAQ,OAAS,KAAK,QAAQA,CAAG,EAAI,KAAK,YAAY,EACpF,MAAO,CACL,SAAU,CAACO,CAAQ,EACnB,UAAW,CAAC,KAAK,aAAaA,CAAQ,CAAC,CACzC,CACF,EAKAd,EAAM,UAAU,YAAc,SAAUM,EAAMS,EAAOC,EAAK,CACxD,OAAO,KAAK,aAAa,CAAC,KAAK,YAAY,aAAaV,EAAK,CAAC,EAAGS,CAAK,EAAG,KAAK,WAAW,YAAYT,EAAK,CAAC,EAAGS,CAAK,CAAC,EAAGC,CAAG,CAC5H,EAIAhB,EAAM,UAAU,YAAc,SAAUI,EAAOW,EAAOC,EAAK,CACzDA,EAAMA,GAAO,CAAC,EACd,IAAIX,EAAQ,KAAK,aAAaD,CAAK,EACnC,OAAAY,EAAI,CAAC,EAAI,KAAK,YAAY,aAAaX,EAAM,CAAC,EAAGU,CAAK,EACtDC,EAAI,CAAC,EAAI,KAAK,WAAW,YAAYX,EAAM,CAAC,EAAGU,CAAK,EAC7CC,CACT,EAIAhB,EAAM,UAAU,aAAe,SAAUI,EAAO,CAC9C,IAAIa,EAAKb,EAAM,CAAC,EAAI,KAAK,GACrBc,EAAKd,EAAM,CAAC,EAAI,KAAK,GACrBO,EAAY,KAAK,aAAa,EAC9BQ,EAASR,EAAU,UAAU,EAC7BS,EAAW,KAAK,IAAID,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EACxCE,EAAW,KAAK,IAAIF,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,EAG5CR,EAAU,QAAUS,EAAWC,EAAW,IAAMA,EAAWD,EAAW,IACtE,IAAIE,EAAS,KAAK,KAAKL,EAAKA,EAAKC,EAAKA,CAAE,EACxCD,GAAMK,EACNJ,GAAMI,EAIN,QAHIC,EAAS,KAAK,MAAM,CAACL,EAAID,CAAE,EAAI,KAAK,GAAK,IAEzCO,EAAMD,EAASH,EAAW,EAAI,GAC3BG,EAASH,GAAYG,EAASF,GACnCE,GAAUC,EAAM,IAElB,MAAO,CAACF,EAAQC,CAAM,CACxB,EAIAvB,EAAM,UAAU,aAAe,SAAUK,EAAOW,EAAK,CACnDA,EAAMA,GAAO,CAAC,EACd,IAAIM,EAASjB,EAAM,CAAC,EAChBkB,EAASlB,EAAM,CAAC,EAAI,IAAM,KAAK,GACnC,OAAAW,EAAI,CAAC,EAAI,KAAK,IAAIO,CAAM,EAAID,EAAS,KAAK,GAE1CN,EAAI,CAAC,EAAI,CAAC,KAAK,IAAIO,CAAM,EAAID,EAAS,KAAK,GACpCN,CACT,EAKAhB,EAAM,UAAU,QAAU,UAAY,CACpC,IAAIW,EAAY,KAAK,aAAa,EAC9BC,EAAa,KAAK,cAAc,EAChCa,EAAeb,EAAW,UAAU,EAAE,MAAM,EAChDa,EAAa,CAAC,EAAIA,EAAa,CAAC,GAAKA,EAAa,QAAQ,EAC1D,IAAIC,EAAcf,EAAU,UAAU,EAClCgB,EAAS,KAAK,GAAK,IACnBC,EAAU,KACd,MAAO,CACL,GAAI,KAAK,GACT,GAAI,KAAK,GACT,GAAIH,EAAa,CAAC,EAClB,EAAGA,EAAa,CAAC,EACjB,WAAY,CAACC,EAAY,CAAC,EAAIC,EAC9B,SAAU,CAACD,EAAY,CAAC,EAAIC,EAC5B,UAAWhB,EAAU,QACrB,QAAS,SAAUkB,EAAGC,EAAG,CAGvB,IAAIb,EAAKY,EAAI,KAAK,GACdX,EAAKY,EAAI,KAAK,GACdC,EAAKd,EAAKA,EAAKC,EAAKA,EACpBc,EAAI,KAAK,EACTC,EAAK,KAAK,GAGd,OAAOD,IAAMC,GAAMF,EAAKH,GAAWI,EAAIA,GAAKD,EAAKH,GAAWK,EAAKA,CACnE,EAEA,EAAG,KAAK,GAAKR,EAAa,CAAC,EAC3B,EAAG,KAAK,GAAKA,EAAa,CAAC,EAC3B,MAAOA,EAAa,CAAC,EAAI,EACzB,OAAQA,EAAa,CAAC,EAAI,CAC5B,CACF,EACAzB,EAAM,UAAU,eAAiB,SAAUkC,EAASC,EAAQC,EAAO,CACjE,IAAIC,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAO,KAAK,YAAYD,CAAK,EAAI,IACvD,EACApC,EAAM,UAAU,iBAAmB,SAAUkC,EAASC,EAAQI,EAAO,CACnE,IAAIF,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAO,KAAK,YAAYE,CAAK,EAAI,IACvD,EACOvC,CACT,GAAE,EACF,SAASsC,IAAYH,EAAQ,CAC3B,IAAIK,EAAcL,EAAO,YACrBM,EAAaN,EAAO,WACxB,OAAOM,GAAcA,EAAW,kBAAoBD,GAAeA,EAAY,gBACjF,CACA,IAAOE,IAAQ1C,IC7Kf,SAAS2C,IAAYC,EAAOC,EAAYC,EAAK,CAC3C,IAAIC,EAASF,EAAW,IAAI,QAAQ,EAChCG,EAAeC,GAAyBJ,EAAYC,CAAG,EAAE,aAC7DF,EAAM,GAAKM,GAAaH,EAAO,CAAC,EAAGC,EAAa,KAAK,EAAIA,EAAa,EACtEJ,EAAM,GAAKM,GAAaH,EAAO,CAAC,EAAGC,EAAa,MAAM,EAAIA,EAAa,EACvE,IAAIG,EAAaP,EAAM,cAAc,EACjCQ,EAAO,KAAK,IAAIJ,EAAa,MAAOA,EAAa,MAAM,EAAI,EAC3DK,EAASR,EAAW,IAAI,QAAQ,EAChCQ,GAAU,KACZA,EAAS,CAAC,EAAG,MAAM,EACFC,EAAQD,CAAM,IAE/BA,EAAS,CAAC,EAAGA,CAAM,GAErB,IAAIE,EAAe,CAACL,GAAaG,EAAO,CAAC,EAAGD,CAAI,EAAGF,GAAaG,EAAO,CAAC,EAAGD,CAAI,CAAC,EAChFD,EAAW,QAAUA,EAAW,UAAUI,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,EAAIJ,EAAW,UAAUI,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,CACrI,CAIA,SAASC,IAAiBC,EAASX,EAAK,CACtC,IAAIF,EAAQ,KACRc,EAAYd,EAAM,aAAa,EAC/BO,EAAaP,EAAM,cAAc,EAkBrC,GAhBAc,EAAU,MAAM,UAAU,IAAU,IAAS,EAC7CP,EAAW,MAAM,UAAU,IAAU,IAAS,EAC9CM,EAAQ,WAAW,SAAUE,EAAa,CACxC,GAAIA,EAAY,mBAAqBf,EAAO,CAC1C,IAAIgB,EAASD,EAAY,QAAQ,EAC1BE,EAAKC,GAAwBF,EAAQ,QAAQ,EAAG,SAAUG,EAAK,CACpEZ,EAAW,MAAM,oBAAoBS,EAAQG,CAAG,CAClD,CAAC,EACMF,EAAKC,GAAwBF,EAAQ,OAAO,EAAG,SAAUG,EAAK,CACnEL,EAAU,MAAM,oBAAoBE,EAAQG,CAAG,CACjD,CAAC,CACH,CACF,CAAC,EACDC,GAAgBN,EAAU,MAAOA,EAAU,KAAK,EAChDM,GAAgBb,EAAW,MAAOA,EAAW,KAAK,EAE9CO,EAAU,OAAS,YAAc,CAACA,EAAU,OAAQ,CACtD,IAAIO,EAASP,EAAU,UAAU,EAC7BQ,EAAO,IAAMR,EAAU,MAAM,MAAM,EACvCA,EAAU,QAAUO,EAAO,CAAC,GAAKC,EAAOD,EAAO,CAAC,GAAKC,EACrDR,EAAU,UAAUO,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAC1C,CACF,CACA,SAASE,IAAiBC,EAAW,CACnC,OAAOA,EAAU,WAAa,WAChC,CAIA,SAASC,IAAQC,EAAMF,EAAW,CAChC,IAAIG,EAKJ,GAJAD,EAAK,KAAOF,EAAU,IAAI,MAAM,EAChCE,EAAK,MAAQE,GAAmBJ,CAAS,EACzCE,EAAK,OAASF,EAAU,IAAI,aAAa,GAAKE,EAAK,OAAS,WAC5DA,EAAK,QAAUF,EAAU,IAAI,SAAS,EAClCD,IAAiBC,CAAS,EAAG,CAC/BE,EAAK,QAAUA,EAAK,UAAYF,EAAU,IAAI,WAAW,EACzD,IAAIK,EAAaL,EAAU,IAAI,YAAY,EACvCM,GAAYH,EAAKH,EAAU,IAAI,UAAU,KAAO,MAAQG,IAAO,OAASA,EAAKE,GAAcH,EAAK,QAAU,KAAO,KACrHA,EAAK,UAAUG,EAAYC,CAAQ,CACrC,CAEAN,EAAU,KAAOE,EACjBA,EAAK,MAAQF,CACf,CACA,IAAIO,IAAe,CACjB,WAAYC,GACZ,OAAQ,SAAUnB,EAASX,EAAK,CAC9B,IAAI+B,EAAY,CAAC,EACjB,OAAApB,EAAQ,cAAc,QAAS,SAAUZ,EAAYiC,EAAK,CACxD,IAAIlC,EAAQ,IAAImC,IAAMD,EAAM,EAAE,EAE9BlC,EAAM,OAASY,IACf,IAAIL,EAAaP,EAAM,cAAc,EACjCc,EAAYd,EAAM,aAAa,EAC/BoC,EAAkBnC,EAAW,cAAc,YAAY,EACvDoC,EAAiBpC,EAAW,cAAc,WAAW,EACzDwB,IAAQlB,EAAY6B,CAAe,EACnCX,IAAQX,EAAWuB,CAAc,EACjCtC,IAAYC,EAAOC,EAAYC,CAAG,EAClC+B,EAAU,KAAKjC,CAAK,EACpBC,EAAW,iBAAmBD,EAC9BA,EAAM,MAAQC,CAChB,CAAC,EAEDY,EAAQ,WAAW,SAAUE,EAAa,CACxC,GAAIA,EAAY,IAAI,kBAAkB,IAAM,QAAS,CACnD,IAAId,EAAac,EAAY,uBAAuB,QAASuB,EAAgB,EAAE,OAAO,CAAC,EAMvFvB,EAAY,iBAAmBd,EAAW,gBAC5C,CACF,CAAC,EACMgC,CACT,CACF,EACOM,IAAQR,IC1Gf,IAAIS,IAAc,CAAC,WAAY,YAAa,WAAY,YAAa,YAAa,iBAAkB,WAAW,EAC/G,SAASC,GAAiBC,EAAOC,EAASC,EAAO,CAC/CD,EAAQ,CAAC,EAAIA,EAAQ,CAAC,IAAMA,EAAUA,EAAQ,MAAM,EAAE,QAAQ,GAC9D,IAAIE,EAAQH,EAAM,aAAa,CAACC,EAAQ,CAAC,EAAGC,CAAK,CAAC,EAC9CE,EAAMJ,EAAM,aAAa,CAACC,EAAQ,CAAC,EAAGC,CAAK,CAAC,EAChD,MAAO,CACL,GAAIC,EAAM,CAAC,EACX,GAAIA,EAAM,CAAC,EACX,GAAIC,EAAI,CAAC,EACT,GAAIA,EAAI,CAAC,CACX,CACF,CACA,SAASC,GAAaL,EAAO,CAC3B,IAAIM,EAAaN,EAAM,cAAc,EACrC,OAAOM,EAAW,QAAU,EAAI,CAClC,CAEA,SAASC,IAAgBC,EAAM,CAC7B,IAAIC,EAAYD,EAAK,CAAC,EAClBE,EAAWF,EAAKA,EAAK,OAAS,CAAC,EAC/BC,GAAaC,GAAY,KAAK,IAAI,KAAK,IAAID,EAAU,MAAQC,EAAS,KAAK,EAAI,GAAG,EAAI,MACxFF,EAAK,IAAI,CAEb,CACA,IAAIG,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KAC3BG,EAAM,iBAAmB,mBAClBA,CACT,CACA,OAAAH,EAAc,UAAU,OAAS,SAAUI,EAAgBC,EAAS,CAElE,GADA,KAAK,MAAM,UAAU,EACjB,EAACD,EAAe,IAAI,MAAM,EAG9B,KAAIE,EAAYF,EAAe,KAC3Bf,EAAQiB,EAAU,MAClBC,EAAelB,EAAM,cAAc,EAAE,UAAU,EAC/CmB,EAAcF,EAAU,eAAe,CACzC,WAAY,MACd,CAAC,EACGG,EAAkBH,EAAU,oBAAoB,EAChDI,EAAgBC,EAAIL,EAAU,cAAc,EAAG,SAAUM,EAAW,CACtEA,EAAmBC,GAAMD,CAAS,EAClC,IAAIE,EAAQR,EAAU,MAClBS,EAAYD,EAAM,OAAS,UAAYA,EAAM,oBAAoBF,EAAU,SAAS,EAAIA,EAAU,UACtG,OAAAA,EAAU,MAAQN,EAAU,YAAYS,CAAS,EAC1CH,CACT,CAAC,EACDhB,IAAgBc,CAAM,EACtBd,IAAgBY,CAAW,EACpBQ,EAAK7B,IAAa,SAAU8B,EAAM,CACnCb,EAAe,IAAI,CAACa,EAAM,MAAM,CAAC,IAAM,CAACX,EAAU,MAAM,QAAQ,GAAKW,IAAS,aAChFC,IAA0BD,CAAI,EAAE,KAAK,MAAOb,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAcG,CAAM,CAEzH,EAAG,IAAI,EACT,EACAV,EAAc,KAAO,YACdA,CACT,GAAEmB,EAAQ,EACND,IAA4B,CAC9B,SAAU,SAAUE,EAAOhB,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAc,CAC5F,IAAIc,EAAiBjB,EAAe,SAAS,CAAC,WAAY,WAAW,CAAC,EAClEE,EAAYjB,EAAM,aAAa,EAC/BiC,EAAS,KAAK,GAAK,IACnBC,EAAcjB,EAAU,UAAU,EAElCkB,EAAM9B,GAAaL,CAAK,EACxBoC,EAAOD,EAAM,EAAI,EACjBE,EACAC,EAAY,KAAK,IAAIJ,EAAY,CAAC,EAAIA,EAAY,CAAC,CAAC,IAAM,IAAM,SAAW,MAC3EhB,EAAakB,CAAI,IAAM,EACzBC,EAAQ,IAAIE,GAAQD,CAAS,EAAE,CAC7B,MAAO,CACL,GAAItC,EAAM,GACV,GAAIA,EAAM,GACV,EAAGkB,EAAaiB,CAAG,EACnB,WAAY,CAACD,EAAY,CAAC,EAAID,EAC9B,SAAU,CAACC,EAAY,CAAC,EAAID,EAC5B,UAAWhB,EAAU,OACvB,EACA,MAAOe,EAAe,aAAa,EACnC,GAAI,EACJ,OAAQ,EACV,CAAC,EAEDK,EAAQ,IAAYG,GAAK,CACvB,MAAO,CACL,GAAIxC,EAAM,GACV,GAAIA,EAAM,GACV,EAAGkB,EAAaiB,CAAG,EACnB,GAAIjB,EAAakB,CAAI,CACvB,EACA,MAAOJ,EAAe,aAAa,EACnC,GAAI,EACJ,OAAQ,EACV,CAAC,EAEHK,EAAM,MAAM,KAAO,KACnBN,EAAM,IAAIM,CAAK,CACjB,EACA,SAAU,SAAUN,EAAOhB,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAc,CAC5F,IAAIuB,EAAY1B,EAAe,SAAS,UAAU,EAC9C2B,GAAWD,EAAU,IAAI,QAAQ,EAAI,GAAK,GAAKA,EAAU,IAAI,QAAQ,EACrEE,EAASzB,EAAab,GAAaL,CAAK,CAAC,EACzC4C,EAAetB,EAAIH,EAAa,SAAU0B,EAAe,CAC3D,OAAO,IAAYC,GAAK,CACtB,MAAO/C,GAAiBC,EAAO,CAAC2C,EAAQA,EAASD,CAAO,EAAGG,EAAc,KAAK,CAChF,CAAC,CACH,CAAC,EACDd,EAAM,IAAYgB,GAAUH,EAAO,CACjC,MAAcI,GAASP,EAAU,SAAS,WAAW,EAAE,aAAa,EAAG,CACrE,OAAQ1B,EAAe,IAAI,CAAC,WAAY,YAAa,OAAO,CAAC,CAC/D,CAAC,CACH,CAAC,CAAC,CACJ,EACA,UAAW,SAAUgB,EAAOhB,EAAgBf,EAAOiD,EAAY7B,EAAiBF,EAAc,CAC5F,GAAKE,EAAgB,OAQrB,SALIqB,EAAY1B,EAAe,SAAS,UAAU,EAC9CmC,EAAiBnC,EAAe,SAAS,WAAW,EACpD2B,GAAWD,EAAU,IAAI,QAAQ,EAAI,GAAK,GAAKS,EAAe,IAAI,QAAQ,EAC1EP,EAASzB,EAAab,GAAaL,CAAK,CAAC,EACzC4C,EAAQ,CAAC,EACJO,EAAI,EAAGA,EAAI/B,EAAgB,OAAQ+B,IAC1C,QAASC,EAAI,EAAGA,EAAIhC,EAAgB+B,CAAC,EAAE,OAAQC,IAC7CR,EAAM,KAAK,IAAYE,GAAK,CAC1B,MAAO/C,GAAiBC,EAAO,CAAC2C,EAAQA,EAASD,CAAO,EAAGtB,EAAgB+B,CAAC,EAAEC,CAAC,EAAE,KAAK,CACxF,CAAC,CAAC,EAGNrB,EAAM,IAAYgB,GAAUH,EAAO,CACjC,MAAcI,GAASE,EAAe,SAAS,WAAW,EAAE,aAAa,EAAUF,GAASP,EAAU,aAAa,EAAG,CACpH,OAAQ1B,EAAe,IAAI,CAAC,WAAY,YAAa,OAAO,CAAC,CAC/D,CAAC,CAAC,CACJ,CAAC,CAAC,EACJ,EACA,UAAW,SAAUgB,EAAOhB,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAcG,EAAQ,CACrG,IAAIgC,EAAkBtC,EAAe,cAAc,EAAI,EACnDuC,EAAmBvC,EAAe,SAAS,WAAW,EACtDwC,EAAcD,EAAiB,IAAI,QAAQ,EAC3CE,EAAezC,EAAe,IAAI,cAAc,EAE7CY,EAAKN,EAAQ,SAAUE,EAAWkC,EAAK,CAC5C,IAAIC,EAAaJ,EACb5B,EAAYH,EAAU,UACtBoC,EAAIzC,EAAab,GAAaL,CAAK,CAAC,EACpC4D,EAAI5D,EAAM,aAAa,CAAC2D,EAAIJ,EAAahC,EAAU,KAAK,CAAC,EACzDsC,EAAK7D,EAAM,GACX8D,EAAK9D,EAAM,GACX+D,EAAiB,KAAK,IAAIH,EAAE,CAAC,EAAIC,CAAE,EAAIF,EAAI,GAAM,SAAWC,EAAE,CAAC,EAAIC,EAAK,OAAS,QACjFG,EAAyB,KAAK,IAAIJ,EAAE,CAAC,EAAIE,CAAE,EAAIH,EAAI,GAAM,SAAWC,EAAE,CAAC,EAAIE,EAAK,MAAQ,SAC5F,GAAIT,GAAmBA,EAAgB3B,CAAS,EAAG,CACjD,IAAIuC,EAAkBZ,EAAgB3B,CAAS,EACpCwC,GAASD,CAAe,GAAKA,EAAgB,YACtDP,EAAa,IAAIS,GAAMF,EAAgB,UAAWX,EAAkBA,EAAiB,OAAO,EAEhG,CACA,IAAIc,EAAS,IAAYC,GAAK,CAC5B,OAAQC,GAAY,cAAcvD,CAAc,EAChD,MAAOwD,GAAgBb,EAAY,CACjC,EAAGE,EAAE,CAAC,EACN,EAAGA,EAAE,CAAC,EACN,KAAMF,EAAW,aAAa,GAAK3C,EAAe,IAAI,CAAC,WAAY,YAAa,OAAO,CAAC,EACxF,KAAMQ,EAAU,eAChB,MAAOwC,EACP,cAAeC,CACjB,CAAC,CACH,CAAC,EAeD,GAdAjC,EAAM,IAAIqC,CAAM,EACRI,GAAiB,CACvB,GAAIJ,EACJ,eAAgBrD,EAChB,SAAUQ,EAAU,eACpB,qBAAsB,CACpB,YAAa,UAAY,CACvB,OAAO6C,EAAO,WAChB,EACA,MAAO7C,EAAU,SACjB,UAAWkC,CACb,CACF,CAAC,EAEGD,EAAc,CAChB,IAAIiB,EAAYH,GAAY,sBAAsBvD,CAAc,EAChE0D,EAAU,WAAa,YACvBA,EAAU,MAAQlD,EAAU,SAC5BmD,GAAUN,CAAM,EAAE,UAAYK,CAChC,CACF,EAAG,IAAI,CACT,EACA,UAAW,SAAU1C,EAAOhB,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAc,CAC7F,IAAIyD,EAAiB5D,EAAe,SAAS,WAAW,EACpDiB,EAAiB2C,EAAe,SAAS,WAAW,EACpDC,EAAa5C,EAAe,IAAI,OAAO,EACvC6C,EAAY,EAChBD,EAAaA,aAAsB,MAAQA,EAAa,CAACA,CAAU,EAEnE,QADIE,EAAa,CAAC,EACT3B,EAAI,EAAGA,EAAIhC,EAAY,OAAQgC,IAAK,CAC3C,IAAI4B,EAAaF,IAAcD,EAAW,OAC1CE,EAAWC,CAAU,EAAID,EAAWC,CAAU,GAAK,CAAC,EACpDD,EAAWC,CAAU,EAAE,KAAK,IAAYjC,GAAK,CAC3C,MAAO/C,GAAiBC,EAAOkB,EAAcC,EAAYgC,CAAC,EAAE,KAAK,CACnE,CAAC,CAAC,CACJ,CAGA,QAASA,EAAI,EAAGA,EAAI2B,EAAW,OAAQ3B,IACrCpB,EAAM,IAAYgB,GAAU+B,EAAW3B,CAAC,EAAG,CACzC,MAAcH,GAAS,CACrB,OAAQ4B,EAAWzB,EAAIyB,EAAW,MAAM,CAC1C,EAAG5C,EAAe,aAAa,CAAC,EAChC,OAAQ,GACR,EAAGjB,EAAe,IAAI,GAAG,CAC3B,CAAC,CAAC,CAEN,EACA,eAAgB,SAAUgB,EAAOhB,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAc,CAClG,GAAKE,EAAgB,OAMrB,SAHI4D,EAAsBjE,EAAe,SAAS,gBAAgB,EAC9DiB,EAAiBgD,EAAoB,SAAS,WAAW,EACzDpC,EAAQ,CAAC,EACJO,EAAI,EAAGA,EAAI/B,EAAgB,OAAQ+B,IAC1C,QAASC,EAAI,EAAGA,EAAIhC,EAAgB+B,CAAC,EAAE,OAAQC,IAC7CR,EAAM,KAAK,IAAYE,GAAK,CAC1B,MAAO/C,GAAiBC,EAAOkB,EAAcE,EAAgB+B,CAAC,EAAEC,CAAC,EAAE,KAAK,CAC1E,CAAC,CAAC,EAGNrB,EAAM,IAAYgB,GAAUH,EAAO,CACjC,MAAOZ,EAAe,aAAa,EACnC,OAAQ,GACR,EAAGjB,EAAe,IAAI,GAAG,CAC3B,CAAC,CAAC,EACJ,EACA,UAAW,SAAUgB,EAAOhB,EAAgBf,EAAOmB,EAAaC,EAAiBF,EAAc,CAC7F,GAAKC,EAAY,OAGjB,KAAI8D,EAAiBlE,EAAe,SAAS,WAAW,EACpDmE,EAAiBD,EAAe,SAAS,WAAW,EACpDE,EAAaD,EAAe,IAAI,OAAO,EACvCL,EAAY,EAChBM,EAAaA,aAAsB,MAAQA,EAAa,CAACA,CAAU,EAOnE,QANIC,EAAa,CAAC,EACdnD,EAAS,KAAK,GAAK,IACnBoD,EAAY,CAAClE,EAAY,CAAC,EAAE,MAAQc,EACpCqD,EAAK,KAAK,IAAIpE,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,EAC9CqE,EAAK,KAAK,IAAIrE,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,EAC9CsE,EAAYzE,EAAe,IAAI,WAAW,EACrCoC,EAAI,EAAGsC,EAAMtE,EAAY,OAAQgC,GAAKsC,EAAKtC,IAAK,CACvD,IAAIuC,EAAQvC,IAAMsC,EAAMtE,EAAY,CAAC,EAAE,MAAQA,EAAYgC,CAAC,EAAE,MAC1D4B,EAAaF,IAAcM,EAAW,OAC1CC,EAAWL,CAAU,EAAIK,EAAWL,CAAU,GAAK,CAAC,EACpDK,EAAWL,CAAU,EAAE,KAAK,IAAYY,GAAO,CAC7C,MAAO,CACL,GAAI3F,EAAM,GACV,GAAIA,EAAM,GACV,GAAIsF,EACJ,EAAGC,EACH,WAAYF,EACZ,SAAU,CAACK,EAAQzD,EACnB,UAAWuD,CACb,EACA,OAAQ,EACV,CAAC,CAAC,EACFH,EAAY,CAACK,EAAQzD,CACvB,CAGA,QAASkB,EAAI,EAAGA,EAAIiC,EAAW,OAAQjC,IACrCpB,EAAM,IAAYgB,GAAUqC,EAAWjC,CAAC,EAAG,CACzC,MAAcH,GAAS,CACrB,KAAMmC,EAAWhC,EAAIgC,EAAW,MAAM,CACxC,EAAGD,EAAe,aAAa,CAAC,EAChC,OAAQ,EACV,CAAC,CAAC,EAEN,CACF,EACOU,IAAQjF,IChSf,IAAIkF,IAAmB,CAAC,YAAa,YAAa,gBAAgB,EAC9DC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,iBAAmB,mBAClBA,CACT,CACA,OAAAH,EAAe,UAAU,OAAS,SAAUI,EAAiBC,EAASC,EAAK,CAEzE,GADA,KAAK,MAAM,UAAU,EACjB,EAACF,EAAgB,IAAI,MAAM,EAG/B,KAAIG,EAAe,KAAK,WACpBC,EAAe,KAAK,WAAa,IAAYC,GACjD,KAAK,MAAM,IAAID,CAAY,EAC3B,IAAIE,EAAaN,EAAgB,KAC7BO,EAAQD,EAAW,MACnBE,EAAYD,EAAM,aAAa,EAC/BE,EAAcH,EAAW,eAAe,EACxCI,EAAmBJ,EAAW,oBAAoB,EAClDK,EAAYH,EAAU,UAAU,EAAE,CAAC,EACnCI,EAAeN,EAAW,UAAU,EACpCO,EAASC,IAAWP,EAAOP,EAAiBW,CAAS,EACrDI,EAAc,IAAIC,GAAYhB,EAAiBE,EAAKW,CAAM,EAC9DE,EAAY,MAAM,EAClBX,EAAa,IAAIW,EAAY,KAAK,EAC1BE,GAAgBd,EAAcC,EAAcJ,CAAe,EAC5DkB,EAAKvB,IAAkB,SAAUwB,EAAM,CACxCnB,EAAgB,IAAI,CAACmB,EAAM,MAAM,CAAC,GAAK,CAACb,EAAW,MAAM,QAAQ,GACnEc,IAAoBD,CAAI,EAAE,KAAK,MAAOnB,EAAiBO,EAAOI,EAAWC,EAAcH,EAAaC,CAAgB,CAExH,EAAG,IAAI,EACT,EACAd,EAAe,KAAO,aACfA,CACT,GAAEyB,EAAQ,EACND,IAAsB,CACxB,UAAW,SAAUE,EAAOtB,EAAiBO,EAAOI,EAAWC,EAAcH,EAAa,CACxF,IAAIc,EAAiBvB,EAAgB,SAAS,WAAW,EACrDwB,EAAiBD,EAAe,SAAS,WAAW,EACpDE,EAAaD,EAAe,IAAI,OAAO,EACvCE,EAAY,EACZlB,EAAYD,EAAM,aAAa,EAC/BoB,EAAS,KAAK,GAAK,IACnBC,EAAcpB,EAAU,UAAU,EAClCqB,EAAY,KAAK,IAAID,EAAY,CAAC,EAAIA,EAAY,CAAC,CAAC,IAAM,IAAM,SAAW,MAC/EH,EAAaA,aAAsB,MAAQA,EAAa,CAACA,CAAU,EAEnE,QADIK,EAAa,CAAC,EACTC,EAAI,EAAGA,EAAItB,EAAY,OAAQsB,IAAK,CAC3C,IAAIC,EAAaN,IAAcD,EAAW,OAC1CK,EAAWE,CAAU,EAAIF,EAAWE,CAAU,GAAK,CAAC,EACpDF,EAAWE,CAAU,EAAE,KAAK,IAAIC,GAAQJ,CAAS,EAAE,CACjD,MAAO,CACL,GAAItB,EAAM,GACV,GAAIA,EAAM,GAEV,EAAG,KAAK,IAAIE,EAAYsB,CAAC,EAAE,MAAO,CAAC,EACnC,WAAY,CAACH,EAAY,CAAC,EAAID,EAC9B,SAAU,CAACC,EAAY,CAAC,EAAID,EAC5B,UAAWnB,EAAU,OACvB,CACF,CAAC,CAAC,CACJ,CAGA,QAASuB,EAAI,EAAGA,EAAID,EAAW,OAAQC,IACrCT,EAAM,IAAYY,GAAUJ,EAAWC,CAAC,EAAG,CACzC,MAAcI,GAAS,CACrB,OAAQV,EAAWM,EAAIN,EAAW,MAAM,EACxC,KAAM,IACR,EAAGD,EAAe,aAAa,CAAC,EAChC,OAAQ,EACV,CAAC,CAAC,CAEN,EACA,eAAgB,SAAUF,EAAOtB,EAAiBO,EAAOI,EAAWC,EAAcH,EAAaC,EAAkB,CAC/G,GAAKA,EAAiB,OAMtB,SAHI0B,EAAsBpC,EAAgB,SAAS,gBAAgB,EAC/DwB,EAAiBY,EAAoB,SAAS,WAAW,EACzDC,EAAQ,CAAC,EACJN,EAAI,EAAGA,EAAIrB,EAAiB,OAAQqB,IAC3C,QAASO,EAAI,EAAGA,EAAI5B,EAAiBqB,CAAC,EAAE,OAAQO,IAC9CD,EAAM,KAAK,IAAYE,GAAO,CAC5B,MAAO,CACL,GAAIhC,EAAM,GACV,GAAIA,EAAM,GACV,EAAGG,EAAiBqB,CAAC,EAAEO,CAAC,EAAE,KAC5B,CACF,CAAC,CAAC,EAGNhB,EAAM,IAAYY,GAAUG,EAAO,CACjC,MAAcF,GAAS,CACrB,KAAM,IACR,EAAGX,EAAe,aAAa,CAAC,EAChC,OAAQ,EACV,CAAC,CAAC,EACJ,EACA,UAAW,SAAUF,EAAOtB,EAAiBO,EAAOI,EAAWC,EAAcH,EAAa,CACxF,GAAKA,EAAY,OAGjB,KAAI+B,EAAiBxC,EAAgB,SAAS,WAAW,EACrDyC,EAAiBD,EAAe,SAAS,WAAW,EACpDE,EAAaD,EAAe,IAAI,OAAO,EACvCf,EAAY,EAChBgB,EAAaA,aAAsB,MAAQA,EAAa,CAACA,CAAU,EAGnE,QAFIC,EAAa,CAAC,EACdC,EAAanC,EAAY,CAAC,EAAE,MACvBsB,EAAI,EAAGA,EAAItB,EAAY,OAAQsB,IAAK,CAC3C,IAAIC,EAAaN,IAAcgB,EAAW,OAC1CC,EAAWX,CAAU,EAAIW,EAAWX,CAAU,GAAK,CAAC,EACpDW,EAAWX,CAAU,EAAE,KAAK,IAAYa,GAAO,CAC7C,MAAO,CACL,GAAItC,EAAM,GACV,GAAIA,EAAM,GACV,GAAIqC,EACJ,EAAGnC,EAAYsB,CAAC,EAAE,MAClB,WAAY,EACZ,SAAU,KAAK,GAAK,CACtB,EACA,OAAQ,EACV,CAAC,CAAC,EACFa,EAAanC,EAAYsB,CAAC,EAAE,KAC9B,CAGA,QAASA,EAAI,EAAGA,EAAIY,EAAW,OAAQZ,IACrCT,EAAM,IAAYY,GAAUS,EAAWZ,CAAC,EAAG,CACzC,MAAcI,GAAS,CACrB,KAAMO,EAAWX,EAAIW,EAAW,MAAM,CACxC,EAAGD,EAAe,aAAa,CAAC,EAChC,OAAQ,EACV,CAAC,CAAC,EAEN,CACF,EAIA,SAAS3B,IAAWP,EAAOP,EAAiBW,EAAW,CACrD,MAAO,CACL,SAAU,CAACJ,EAAM,GAAIA,EAAM,EAAE,EAC7B,SAAUI,EAAY,IAAM,KAAK,GACjC,eAAgB,GAChB,cAAe,GACf,cAAe,EACf,YAAaX,EAAgB,SAAS,WAAW,EAAE,IAAI,QAAQ,EAE/D,GAAI,CACN,CACF,CACA,IAAO8C,IAAQlD,IC9Jf,SAASmD,IAAiBC,EAAa,CACrC,OAAOA,EAAY,IAAI,OAAO,GAAK,cAAgBA,EAAY,WACjE,CACA,SAASC,IAAWC,EAAOC,EAAM,CAC/B,OAAOA,EAAK,IAAMD,EAAM,MAAM,cAChC,CACA,SAASE,IAAeC,EAAYC,EAASC,EAAK,CAChD,IAAIC,EAAkB,CAAC,EACnBC,EAAoBC,IAAoBC,GAAOL,EAAQ,gBAAgBD,CAAU,EAAG,SAAUL,EAAa,CAC7G,MAAO,CAACM,EAAQ,iBAAiBN,CAAW,GAAKA,EAAY,kBAAoBA,EAAY,iBAAiB,OAAS,OACzH,CAAC,CAAC,EACFM,EAAQ,iBAAiBD,EAAY,SAAUL,EAAa,CAE1D,GAAIA,EAAY,iBAAiB,OAAS,QAG1C,KAAIY,EAAOZ,EAAY,QAAQ,EAC3BE,EAAQF,EAAY,iBACpBa,EAAWX,EAAM,YAAY,EAC7BY,EAAUb,IAAWC,EAAOW,CAAQ,EACpCE,EAAUhB,IAAiBC,CAAW,EACtCgB,EAAmBP,EAAkBK,CAAO,EAAEC,CAAO,EACrDE,EAAeD,EAAiB,OAChCE,EAAcF,EAAiB,MAC/BG,EAAYjB,EAAM,aAAaW,CAAQ,EACvCO,EAAKpB,EAAY,iBAAiB,GAClCqB,EAAKrB,EAAY,iBAAiB,GAClCsB,EAAetB,EAAY,IAAI,cAAc,GAAK,EAClDuB,EAAcvB,EAAY,IAAI,aAAa,GAAK,EACpDQ,EAAgBO,CAAO,EAAIP,EAAgBO,CAAO,GAAK,CAAC,EAQxD,QAPIS,EAAWZ,EAAK,aAAaO,EAAU,GAAG,EAC1CM,EAAUb,EAAK,aAAaC,EAAS,GAAG,EACxCa,EAAUC,GAAmBf,EAAMY,CAAwB,EAC3DI,EAAcf,EAAS,MAAQ,UAAY,CAACb,EAAY,IAAI,WAAY,EAAI,EAC5E6B,EAAiBV,EAAU,MAC3BW,EAAaD,EAAe,IAAI,YAAY,EAC5CE,EAAiBZ,EAAU,YAAYW,GAAc,CAAC,EACjDE,EAAM,EAAGC,EAAMrB,EAAK,MAAM,EAAGoB,EAAMC,EAAKD,IAAO,CACtD,IAAIE,EAAQtB,EAAK,IAAIY,EAAUQ,CAAG,EAC9BG,EAAYvB,EAAK,IAAIa,EAASO,CAAG,EACjCI,EAAOF,GAAS,EAAI,IAAM,IAC1BG,EAAYN,EAIZL,IACGlB,EAAgBO,CAAO,EAAEoB,CAAS,IACrC3B,EAAgBO,CAAO,EAAEoB,CAAS,EAAI,CACpC,EAAGJ,EACH,EAAGA,CACL,GAGFM,EAAY7B,EAAgBO,CAAO,EAAEoB,CAAS,EAAEC,CAAI,GAEtD,IAAIE,EAAK,OACLC,EAAI,OACJC,EAAa,OACbC,EAAW,OAEf,GAAItB,EAAU,MAAQ,SAAU,CAC9B,IAAIuB,EAAavB,EAAU,YAAYe,CAAK,EAAIH,EAC5CY,EAAQ9B,EAAS,YAAYsB,CAAS,EACtC,KAAK,IAAIO,CAAU,EAAIpB,IACzBoB,GAAcA,EAAa,EAAI,GAAK,GAAKpB,GAE3CgB,EAAKD,EACLE,EAAIF,EAAYK,EAChBF,EAAaG,EAAQ1B,EACrBwB,EAAWD,EAAatB,EACxBQ,IAAYlB,EAAgBO,CAAO,EAAEoB,CAAS,EAAEC,CAAI,EAAIG,EAC1D,KAEK,CACH,IAAIK,EAAYzB,EAAU,YAAYe,EAAON,CAAW,EAAIG,EACxDc,GAAShC,EAAS,YAAYsB,CAAS,EACvC,KAAK,IAAIS,CAAS,EAAIrB,IACxBqB,GAAaA,EAAY,EAAI,GAAK,GAAKrB,GAEzCe,EAAKO,GAAS5B,EACdsB,EAAID,EAAKpB,EACTsB,EAAaH,EACbI,EAAWJ,EAAYO,EAWvBlB,IAAYlB,EAAgBO,CAAO,EAAEoB,CAAS,EAAEC,CAAI,EAAIK,EAC1D,CACA7B,EAAK,cAAcoB,EAAK,CACtB,GAAIZ,EACJ,GAAIC,EACJ,GAAIiB,EACJ,EAAGC,EAGH,WAAY,CAACC,EAAa,KAAK,GAAK,IACpC,SAAU,CAACC,EAAW,KAAK,GAAK,IAOhC,UAAWD,GAAcC,CAC3B,CAAC,CACH,EACF,CAAC,CACH,CAIA,SAAS/B,IAAaoC,EAAW,CAE/B,IAAIC,EAAa,CAAC,EACXC,EAAKF,EAAW,SAAU9C,EAAagC,EAAK,CACjD,IAAIpB,EAAOZ,EAAY,QAAQ,EAC3BE,EAAQF,EAAY,iBACpBa,EAAWX,EAAM,YAAY,EAC7BY,EAAUb,IAAWC,EAAOW,CAAQ,EACpCoC,EAAapC,EAAS,UAAU,EAChCqC,EAAYrC,EAAS,OAAS,WAAaA,EAAS,aAAa,EAAI,KAAK,IAAIoC,EAAW,CAAC,EAAIA,EAAW,CAAC,CAAC,EAAIrC,EAAK,MAAM,EAC1HuC,EAAgBJ,EAAWjC,CAAO,GAAK,CACzC,UAAWoC,EACX,cAAeA,EACf,eAAgB,EAChB,YAAa,MACb,IAAK,MACL,OAAQ,CAAC,CACX,EACIE,EAASD,EAAc,OAC3BJ,EAAWjC,CAAO,EAAIqC,EACtB,IAAIpC,EAAUhB,IAAiBC,CAAW,EACrCoD,EAAOrC,CAAO,GACjBoC,EAAc,iBAEhBC,EAAOrC,CAAO,EAAIqC,EAAOrC,CAAO,GAAK,CACnC,MAAO,EACP,SAAU,CACZ,EACA,IAAIsC,EAAWC,GAAatD,EAAY,IAAI,UAAU,EAAGkD,CAAS,EAC9DK,EAAcD,GAAatD,EAAY,IAAI,aAAa,EAAGkD,CAAS,EACpEM,EAASxD,EAAY,IAAI,QAAQ,EACjCyD,EAAiBzD,EAAY,IAAI,gBAAgB,EACjDqD,GAAY,CAACD,EAAOrC,CAAO,EAAE,QAC/BsC,EAAW,KAAK,IAAIF,EAAc,cAAeE,CAAQ,EACzDD,EAAOrC,CAAO,EAAE,MAAQsC,EACxBF,EAAc,eAAiBE,GAEjCE,IAAgBH,EAAOrC,CAAO,EAAE,SAAWwC,GAC3CC,GAAU,OAASL,EAAc,IAAMK,GACvCC,GAAkB,OAASN,EAAc,YAAcM,EACzD,CAAC,EACD,IAAIC,EAAS,CAAC,EACd,OAAOV,EAAKD,EAAY,SAAUI,EAAeQ,EAAc,CAC7DD,EAAOC,CAAY,EAAI,CAAC,EACxB,IAAIP,EAASD,EAAc,OACvBD,EAAYC,EAAc,UAC1BS,EAAcN,GAAaH,EAAc,YAAaD,CAAS,EAC/DW,EAAgBP,GAAaH,EAAc,IAAK,CAAC,EACjDW,EAAgBX,EAAc,cAC9BY,EAAiBZ,EAAc,eAC/Ba,GAAaF,EAAgBF,IAAgBG,GAAkBA,EAAiB,GAAKF,GACzFG,EAAY,KAAK,IAAIA,EAAW,CAAC,EAE1BhB,EAAKI,EAAQ,SAAUa,EAAQC,EAAO,CAC3C,IAAIC,EAAWF,EAAO,SAClBE,GAAYA,EAAWH,IACzBG,EAAW,KAAK,IAAIA,EAAUL,CAAa,EACvCG,EAAO,QACTE,EAAW,KAAK,IAAIA,EAAUF,EAAO,KAAK,GAE5CH,GAAiBK,EACjBF,EAAO,MAAQE,EACfJ,IAEJ,CAAC,EAEDC,GAAaF,EAAgBF,IAAgBG,GAAkBA,EAAiB,GAAKF,GACrFG,EAAY,KAAK,IAAIA,EAAW,CAAC,EACjC,IAAII,EAAW,EACXC,EACGrB,EAAKI,EAAQ,SAAUa,EAAQjC,EAAK,CACpCiC,EAAO,QACVA,EAAO,MAAQD,GAEjBK,EAAaJ,EACbG,GAAYH,EAAO,OAAS,EAAIJ,EAClC,CAAC,EACGQ,IACFD,GAAYC,EAAW,MAAQR,GAEjC,IAAIS,EAAS,CAACF,EAAW,EAClBpB,EAAKI,EAAQ,SAAUa,EAAQlD,EAAS,CAC7C2C,EAAOC,CAAY,EAAE5C,CAAO,EAAI2C,EAAOC,CAAY,EAAE5C,CAAO,GAAK,CAC/D,OAAQuD,EACR,MAAOL,EAAO,KAChB,EACAK,GAAUL,EAAO,OAAS,EAAIJ,EAChC,CAAC,CACH,CAAC,EACMH,CACT,CACA,IAAOa,IAAQnE,ICtMf,IAAIoE,IAAuB,CACzB,WAAY,GACZ,UAAW,GACX,YAAa,GACb,UAAW,CACT,OAAQ,CACV,CACF,EACIC,IAAwB,CAC1B,YAAa,CACf,EACIC,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAChBG,CACT,CACA,OAAAH,EAAU,KAAO,QACVA,CACT,GAAEI,EAAa,EACR,SAASC,GAAQC,EAAW,CACjCC,GAAIF,EAAkB,EACtBG,GAAS,yBAAyB,mBAAoBC,GAAgB,EACtEH,EAAU,yBAAyB,QAASI,GAAY,EACxDJ,EAAU,uBAAuBK,GAAU,EAC3CL,EAAU,sBAAsBN,GAAS,EAEzCY,GAAiBN,EAAW,QAASO,IAAgBf,GAAoB,EACzEc,GAAiBN,EAAW,SAAUQ,IAAiBf,GAAqB,EAC5EO,EAAU,sBAAsBS,GAAa,EAC7CT,EAAU,sBAAsBU,GAAc,EAC9CV,EAAU,eAAeW,GAAMC,IAAgB,KAAK,CAAC,CACvD,CC9CO,SAASC,GAAOC,EAAWC,EAAK,CACrCA,EAAMA,GAAO,CAAC,EACd,IAAIC,EAASF,EAAU,iBACnBG,EAAOH,EAAU,KACjBD,EAAS,CAAC,EACVK,EAAeD,EAAK,SACpBE,EAASF,EAAK,OACdG,EAAOJ,EAAO,QAAQ,EACtBK,EAAY,CAACD,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAOA,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAM,EACtEE,EAAc,CAChB,WAAY,CACV,IAAKD,EAAU,CAAC,EAChB,OAAQA,EAAU,CAAC,CACrB,EACA,SAAU,CACR,KAAMA,EAAU,CAAC,EACjB,MAAOA,EAAU,CAAC,CACpB,CACF,EACAR,EAAO,SAAW,CAACM,IAAW,WAAaG,EAAY,SAASJ,CAAY,EAAIG,EAAU,CAAC,EAAGF,IAAW,aAAeG,EAAY,WAAWJ,CAAY,EAAIG,EAAU,CAAC,CAAC,EAC3K,IAAIE,EAAI,CACN,WAAY,EACZ,SAAU,CACZ,EACAV,EAAO,SAAW,KAAK,GAAK,EAAIU,EAAEJ,CAAM,EACxC,IAAIK,EAAe,CACjB,IAAK,GACL,OAAQ,EACR,MAAO,EACP,KAAM,EACR,EACAX,EAAO,eAAiBA,EAAO,cAAgBA,EAAO,cAAgBW,EAAaN,CAAY,EAC3FJ,EAAU,IAAI,CAAC,WAAY,QAAQ,CAAC,IACtCD,EAAO,cAAgB,CAACA,EAAO,eAEtBY,GAASV,EAAI,YAAaD,EAAU,IAAI,CAAC,YAAa,QAAQ,CAAC,CAAC,IACzED,EAAO,eAAiB,CAACA,EAAO,gBAElC,IAAIa,EAAcZ,EAAU,IAAI,CAAC,YAAa,QAAQ,CAAC,EACvD,OAAAD,EAAO,YAAcK,IAAiB,MAAQ,CAACQ,EAAcA,EAC7Db,EAAO,GAAK,EACLA,CACT,CCnCA,IAAIc,IAAmB,CAAC,YAAa,YAAa,WAAW,EACzDC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,iBAAmB,oBAClBA,CACT,CACA,OAAAH,EAAe,UAAU,OAAS,SAAUI,EAAWC,EAASC,EAAKC,EAAS,CAC5E,IAAIC,EAAQ,KAAK,MACjBA,EAAM,UAAU,EAChB,IAAIC,EAAe,KAAK,WACxB,KAAK,WAAa,IAAYC,GAC9B,IAAIC,EAA0BA,GAAOP,CAAS,EAC1CQ,EAAc,IAAIC,GAAYT,EAAWE,EAAKK,CAAM,EACxDC,EAAY,MAAM,EAClBJ,EAAM,IAAI,KAAK,UAAU,EACzBA,EAAM,IAAII,EAAY,KAAK,EACpBE,EAAKf,IAAkB,SAAUgB,EAAM,CACxCX,EAAU,IAAI,CAACW,EAAM,MAAM,CAAC,GAC9BC,IAAoBD,CAAI,EAAE,KAAM,KAAK,MAAO,KAAK,WAAYX,EAAWE,CAAG,CAE/E,EAAG,IAAI,EACCW,GAAgBR,EAAc,KAAK,WAAYL,CAAS,EAChEH,EAAO,UAAU,OAAO,KAAK,KAAMG,EAAWC,EAASC,EAAKC,CAAO,CACrE,EACAP,EAAe,UAAU,OAAS,UAAY,CAC5CkB,GAA0B,IAAI,CAChC,EACAlB,EAAe,KAAO,aACfA,CACT,GAAEmB,EAAQ,EACNH,IAAsB,CACxB,UAAW,SAAUI,EAAUZ,EAAOa,EAAWjB,EAAWE,EAAK,CAC/D,IAAIgB,EAAOlB,EAAU,KACrB,GAAI,CAAAkB,EAAK,MAAM,QAAQ,EAGvB,KAAIC,EAAiBnB,EAAU,SAAS,WAAW,EAC/CoB,EAAiBD,EAAe,SAAS,WAAW,EACpDE,EAAaD,EAAe,IAAI,OAAO,EAC3CC,EAAaA,aAAsB,MAAQA,EAAa,CAACA,CAAU,EAanE,QAZIC,EAAYF,EAAe,IAAI,OAAO,EACtCG,EAAWvB,EAAU,iBAAiB,QAAQ,EAC9CwB,EAAeN,EAAK,aAAa,EACjCO,EAAa,CAAC,EACdC,EAAY,EACZC,EAAcT,EAAK,eAAe,CACpC,UAAWC,EACX,WAAY,OACZ,aAAc,uBAChB,CAAC,EACGS,EAAK,CAAC,EACNC,EAAK,CAAC,EACDC,EAAI,EAAGA,EAAIH,EAAY,OAAQ,EAAEG,EAAG,CAC3C,IAAIC,EAAYb,EAAK,cAAcS,EAAYG,CAAC,EAAE,KAAK,EACnDN,GACFI,EAAG,CAAC,EAAIG,EACRH,EAAG,CAAC,EAAIL,EAAS,EACjBM,EAAG,CAAC,EAAIE,EACRF,EAAG,CAAC,EAAIN,EAAS,EAAIA,EAAS,SAE9BK,EAAG,CAAC,EAAIL,EAAS,EACjBK,EAAG,CAAC,EAAIG,EACRF,EAAG,CAAC,EAAIN,EAAS,EAAIA,EAAS,MAC9BM,EAAG,CAAC,EAAIE,GAEV,IAAIC,EAAO,IAAYC,GAAK,CAC1B,MAAO,CACL,GAAIL,EAAG,CAAC,EACR,GAAIA,EAAG,CAAC,EACR,GAAIC,EAAG,CAAC,EACR,GAAIA,EAAG,CAAC,CACV,EACA,OAAQ,EACV,CAAC,EACOK,GAAqBF,EAAK,MAAOV,CAAS,EAClD,IAAIa,EAAaT,IAAcL,EAAW,OAC1CI,EAAWU,CAAU,EAAIV,EAAWU,CAAU,GAAK,CAAC,EACpDV,EAAWU,CAAU,EAAE,KAAKH,CAAI,CAClC,CAEA,QADII,EAAYhB,EAAe,aAAa,CAAC,OAAO,CAAC,EAC5CU,EAAI,EAAGA,EAAIL,EAAW,OAAQ,EAAEK,EACvC1B,EAAM,IAAYiC,GAAUZ,EAAWK,CAAC,EAAG,CACzC,MAAcQ,GAAS,CACrB,OAAQjB,EAAWS,EAAIT,EAAW,MAAM,CAC1C,EAAGe,CAAS,EACZ,OAAQ,EACV,CAAC,CAAC,EAEN,EACA,UAAW,SAAUpB,EAAUZ,EAAOa,EAAWjB,EAAWE,EAAK,CAC/DqC,GAA4BvB,EAAUC,EAAWjB,EAAWA,CAAS,CACvE,EACA,UAAW,SAAUgB,EAAUZ,EAAOa,EAAWjB,EAAWE,EAAK,CAC/D,IAAIsC,EAAkBC,GAAmB,EACrCC,EAAQ1C,EAAU,KAAK,MACvBwC,GAAmBE,EAAM,OAAS,WACpCF,EAAgB,wBAAwBpC,EAAOY,EAAUhB,EAAWA,EAAU,iBAAiB,QAAQ,EAAGE,CAAG,CAEjH,CACF,EACOyC,IAAQ/C,IC3Gf,IAAIgD,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,UAAU,iBAAmB,UAAY,CACvD,OAAO,IACT,EACAA,EAAgB,KAAO,aACvBA,EAAgB,WAAa,MAC7BA,EAAgB,cAAgB,CAC9B,KAAM,KACN,IAAK,KACL,MAAO,KACP,OAAQ,KACR,KAAM,QACN,SAAU,SACV,OAAQ,aACR,SAAU,CACR,KAAM,GACN,UAAW,CACT,MAAO,EACP,KAAM,OACR,CACF,EAIA,QAAS,CACP,KAAM,EACR,EACA,SAAU,CACR,KAAM,GACN,OAAQ,EACR,UAAW,CACT,MAAO,CACT,CACF,EACA,UAAW,CACT,KAAM,GACN,SAAU,MACZ,EACA,UAAW,CACT,KAAM,GACN,UAAW,CACT,KAAM,SACN,QAAS,EACX,CACF,EACA,OAAQ,EACR,cAAe,GACf,aAAc,CAChB,EACOA,CACT,GAAEI,EAAc,EAChBC,GAAML,IAAiBM,GAAqB,SAAS,EACrD,IAAOC,GAAQP,IC5Df,IAAIQ,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,EAAWG,EAAKC,EAAOC,EAAaC,EAAUC,EAAU,CAC/D,IAAIC,EAAQP,EAAO,KAAK,KAAME,EAAKC,EAAOC,CAAW,GAAK,KAC1D,OAAAG,EAAM,KAAOF,GAAY,QACzBE,EAAM,SAAWD,GAAY,SACtBC,CACT,CAIA,OAAAR,EAAW,UAAU,aAAe,UAAY,CAC9C,IAAIO,EAAW,KAAK,SACpB,OAAOA,IAAa,OAASA,IAAa,QAC5C,EACAP,EAAW,UAAU,YAAc,SAAUS,EAAOC,EAAO,CACzD,OAAO,KAAK,iBAAiB,YAAYD,CAAK,EAAE,CAAC,CACnD,EACOT,CACT,GAAEW,EAAI,EACCC,IAAQZ,ICfR,IAAIa,GAAmB,CAAC,QAAQ,EAInCC,KAAsB,UAAY,CACpC,SAASA,EAAOC,EAAWC,EAASC,EAAK,CACvC,KAAK,KAAO,SACZ,KAAK,UAAY,SAIjB,KAAK,WAAaJ,GAClB,KAAK,mBAAqB,GAC1B,KAAK,MAAQE,EACb,KAAK,MAAMA,EAAWC,EAASC,CAAG,CACpC,CAIA,OAAAH,EAAO,UAAU,MAAQ,SAAUC,EAAWC,EAASC,EAAK,CAC1D,IAAIC,EAAM,KAAK,UACXC,EAAO,IAAIC,IAAWF,EAAgBG,GAAmBN,CAAS,EAAG,CAAC,EAAG,CAAC,EAAGA,EAAU,IAAI,MAAM,EAAGA,EAAU,IAAI,UAAU,CAAC,EAC7HO,EAAaH,EAAK,OAAS,WAC/BA,EAAK,OAASG,GAAcP,EAAU,IAAI,aAAa,EACvDI,EAAK,QAAUJ,EAAU,IAAI,SAAS,EACtCI,EAAK,OAASJ,EAAU,IAAI,QAAQ,EACpCA,EAAU,KAAOI,EACjBA,EAAK,MAAQJ,EACbI,EAAK,iBAAmB,KACxB,KAAK,MAAQA,CACf,EAIAL,EAAO,UAAU,OAAS,SAAUE,EAASC,EAAK,CAChDD,EAAQ,WAAW,SAAUO,EAAa,CACxC,GAAIA,EAAY,mBAAqB,KAAM,CACzC,IAAIC,EAASD,EAAY,QAAQ,EACjCE,EAAKD,EAAO,iBAAiB,KAAK,SAAS,EAAG,SAAUN,EAAK,CAC3D,KAAK,MAAM,MAAM,oBAAoBM,EAAQN,CAAG,CAClD,EAAG,IAAI,EACIQ,GAAgB,KAAK,MAAM,MAAO,KAAK,MAAM,KAAK,CAC/D,CACF,EAAG,IAAI,CACT,EAIAZ,EAAO,UAAU,OAAS,SAAUC,EAAWE,EAAK,CAClD,IAAIU,EAAeC,GAAyBb,EAAWE,CAAG,EAAE,aAC5D,KAAK,MAAQY,GAAcd,EAAU,mBAAmB,EAAGY,CAAY,EACvE,KAAK,YAAY,CACnB,EACAb,EAAO,UAAU,QAAU,UAAY,CACrC,OAAO,KAAK,KACd,EACAA,EAAO,UAAU,YAAc,UAAY,CACzC,IAAIgB,EAAO,KAAK,MACZX,EAAO,KAAK,MACZY,EAAeZ,EAAK,aAAa,EACjCa,EAASD,EAAe,CAAC,EAAGD,EAAK,KAAK,EAAI,CAAC,EAAGA,EAAK,MAAM,EACzDG,EAAMd,EAAK,QAAU,EAAI,EAC7BA,EAAK,UAAUa,EAAOC,CAAG,EAAGD,EAAO,EAAIC,CAAG,CAAC,EAC3C,KAAK,qBAAqBd,EAAMY,EAAeD,EAAK,EAAIA,EAAK,CAAC,CAChE,EACAhB,EAAO,UAAU,qBAAuB,SAAUK,EAAMe,EAAW,CACjE,IAAIC,EAAahB,EAAK,UAAU,EAC5BiB,EAAYD,EAAW,CAAC,EAAIA,EAAW,CAAC,EACxCJ,EAAeZ,EAAK,aAAa,EACrCA,EAAK,cAAgBY,EAAe,SAAUM,EAAO,CACnD,OAAOA,EAAQH,CACjB,EAAI,SAAUG,EAAO,CACnB,OAAOD,EAAYC,EAAQH,CAC7B,EACAf,EAAK,aAAeY,EAAe,SAAUM,EAAO,CAClD,OAAOA,EAAQH,CACjB,EAAI,SAAUG,EAAO,CACnB,OAAOD,EAAYC,EAAQH,CAC7B,CACF,EAIApB,EAAO,UAAU,QAAU,UAAY,CACrC,OAAO,KAAK,KACd,EAIAA,EAAO,UAAU,YAAc,UAAY,CACzC,OAAO,KAAK,KACd,EACAA,EAAO,UAAU,QAAU,UAAY,CACrC,MAAO,CAAC,KAAK,KAAK,CACpB,EACAA,EAAO,UAAU,eAAiB,UAAY,CAC5C,MAAO,CACL,SAAU,CAAC,KAAK,QAAQ,CAAC,EAEzB,UAAW,CAAC,CACd,CACF,EAIAA,EAAO,UAAU,aAAe,SAAUwB,EAAO,CAC/C,IAAIR,EAAO,KAAK,QAAQ,EACpBX,EAAO,KAAK,QAAQ,EACpBoB,EAASpB,EAAK,OAClB,OAAIoB,IAAW,aACNpB,EAAK,QAAQA,EAAK,aAAamB,EAAM,CAAC,CAAC,CAAC,GAAKA,EAAM,CAAC,GAAKR,EAAK,GAAKQ,EAAM,CAAC,GAAKR,EAAK,EAAIA,EAAK,OAE7FX,EAAK,QAAQA,EAAK,aAAamB,EAAM,CAAC,CAAC,CAAC,GAAKA,EAAM,CAAC,GAAKR,EAAK,GAAKQ,EAAM,CAAC,GAAKR,EAAK,EAAIA,EAAK,MAExG,EACAhB,EAAO,UAAU,YAAc,SAAUwB,EAAOE,EAAUC,EAAK,CAC7DA,EAAMA,GAAO,CAAC,EACd,IAAItB,EAAO,KAAK,QAAQ,EACxB,OAAAsB,EAAI,CAAC,EAAItB,EAAK,YAAYA,EAAK,aAAamB,EAAMnB,EAAK,SAAW,aAAe,EAAI,CAAC,CAAC,CAAC,EACjFsB,CACT,EAKA3B,EAAO,UAAU,YAAc,SAAU4B,EAAKF,EAAUC,EAAK,CAC3D,IAAItB,EAAO,KAAK,QAAQ,EACpBW,EAAO,KAAK,QAAQ,EACxBW,EAAMA,GAAO,CAAC,EACd,IAAIR,EAAMd,EAAK,SAAW,aAAe,EAAI,EAC7C,OAAIuB,aAAe,QACjBA,EAAMA,EAAI,CAAC,GAEbD,EAAIR,CAAG,EAAId,EAAK,cAAcA,EAAK,YAAY,CAACuB,CAAG,CAAC,EACpDD,EAAI,EAAIR,CAAG,EAAIA,IAAQ,EAAIH,EAAK,EAAIA,EAAK,OAAS,EAAIA,EAAK,EAAIA,EAAK,MAAQ,EACrEW,CACT,EACA3B,EAAO,UAAU,eAAiB,SAAUE,EAAS2B,EAAQC,EAAO,CAClE,IAAIC,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAO,KAAK,YAAYD,CAAK,EAAI,IACvD,EACA9B,EAAO,UAAU,iBAAmB,SAAUE,EAAS2B,EAAQI,EAAO,CACpE,IAAIF,EAAWC,IAAYH,CAAM,EACjC,OAAOE,IAAa,KAAO,KAAK,YAAYE,CAAK,EAAI,IACvD,EACOjC,CACT,GAAE,EACF,SAASgC,IAAYH,EAAQ,CAC3B,IAAIpB,EAAcoB,EAAO,YACrBK,EAAcL,EAAO,gBACzB,OAAOK,GAAeA,EAAY,kBAAoBzB,GAAeA,EAAY,gBACnF,CACA,IAAO0B,IAAQnC,ICvJf,SAASoC,IAAOC,EAASC,EAAK,CAC5B,IAAIC,EAAU,CAAC,EACf,OAAAF,EAAQ,cAAc,aAAc,SAAUG,EAAWC,EAAK,CAC5D,IAAIC,EAAS,IAAIC,IAAOH,EAAWH,EAASC,CAAG,EAC/CI,EAAO,KAAO,UAAYD,EAC1BC,EAAO,OAAOF,EAAWF,CAAG,EAC5BE,EAAU,iBAAmBE,EAC7BH,EAAQ,KAAKG,CAAM,CACrB,CAAC,EACDL,EAAQ,WAAW,SAAUO,EAAa,CACxC,GAAIA,EAAY,IAAI,kBAAkB,IAAM,aAAc,CACxD,IAAIC,EAAkBD,EAAY,uBAAuB,aAAcE,EAAgB,EAAE,OAAO,CAAC,EACjGF,EAAY,iBAAmBC,GAAmBA,EAAgB,gBACpE,CACF,CAAC,EACMN,CACT,CACA,IAAIQ,IAAgB,CAClB,OAAQX,IACR,WAAYY,EACd,EACOC,IAAQF,ICzBf,IAAIG,IAAK,CAAC,IAAK,GAAG,EACdC,IAAK,CAAC,QAAS,QAAQ,EACvBC,KAAiC,SAAUC,EAAQ,CACrDC,EAAUF,EAAmBC,CAAM,EACnC,SAASD,GAAoB,CAC3B,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CAIA,OAAAD,EAAkB,UAAU,aAAe,SAAUG,EAAUC,EAAOC,EAAWC,EAAkBC,EAAK,CACtG,IAAIC,EAAOH,EAAU,KACjBI,EAAWD,EAAK,iBAChBE,EAAcC,GAAgBF,EAAU,EAAIG,GAAiBJ,CAAI,CAAC,EAClEK,EAAaJ,EAAS,YAAYL,CAAK,EAAE,CAAC,EAC1CU,EAAkBR,EAAiB,IAAI,MAAM,EACjD,GAAIQ,GAAmBA,IAAoB,OAAQ,CACjD,IAAIC,EAAqBC,GAAaV,CAAgB,EAClDW,EAAgBC,IAAoBJ,CAAe,EAAEN,EAAMK,EAAYH,CAAW,EACtFO,EAAc,MAAQF,EACtBZ,EAAS,WAAac,EAAc,KACpCd,EAAS,QAAUc,CACrB,CACA,IAAIE,EAA8BC,GAAOf,CAAS,EACvCgB,GAAkCjB,EAAOD,EAAUgB,EAAYd,EAAWC,EAAkBC,CAAG,CAC5G,EAIAP,EAAkB,UAAU,mBAAqB,SAAUI,EAAOC,EAAWC,EAAkB,CAC7F,IAAIa,EAA8BC,GAAOf,EAAW,CAClD,YAAa,EACf,CAAC,EACDc,EAAW,YAAcb,EAAiB,IAAI,CAAC,SAAU,QAAQ,CAAC,EAClE,IAAIgB,EAAsBC,GAAuBlB,EAAU,KAAMD,EAAOe,CAAU,EAClF,MAAO,CACL,EAAGG,EAAS,CAAC,EACb,EAAGA,EAAS,CAAC,EACb,SAAUH,EAAW,UAAYA,EAAW,eAAiB,EAAI,KAAK,GAAK,EAC7E,CACF,EAIAnB,EAAkB,UAAU,sBAAwB,SAAUwB,EAAWC,EAAOpB,EAAWC,EAAkB,CAC3G,IAAIE,EAAOH,EAAU,KACjBI,EAAWD,EAAK,iBAChBkB,EAAWd,GAAiBJ,CAAI,EAChCmB,EAAahB,GAAgBF,EAAUiB,CAAQ,EAC/CE,EAAe,CAACJ,EAAU,EAAGA,EAAU,CAAC,EAC5CI,EAAaF,CAAQ,GAAKD,EAAMC,CAAQ,EACxCE,EAAaF,CAAQ,EAAI,KAAK,IAAIC,EAAW,CAAC,EAAGC,EAAaF,CAAQ,CAAC,EACvEE,EAAaF,CAAQ,EAAI,KAAK,IAAIC,EAAW,CAAC,EAAGC,EAAaF,CAAQ,CAAC,EACvE,IAAIhB,EAAcC,GAAgBF,EAAU,EAAIiB,CAAQ,EACpDG,GAAoBnB,EAAY,CAAC,EAAIA,EAAY,CAAC,GAAK,EACvDoB,EAAc,CAACD,EAAkBA,CAAgB,EACrD,OAAAC,EAAYJ,CAAQ,EAAIE,EAAaF,CAAQ,EACtC,CACL,EAAGE,EAAa,CAAC,EACjB,EAAGA,EAAa,CAAC,EACjB,SAAUJ,EAAU,SACpB,YAAaM,EACb,cAAe,CACb,cAAe,QACjB,CACF,CACF,EACO9B,CACT,GAAE+B,EAAe,EACbb,IAAsB,CACxB,KAAM,SAAUV,EAAMK,EAAYH,EAAa,CAC7C,IAAIsB,EAAyBC,GAAc,CAACpB,EAAYH,EAAY,CAAC,CAAC,EAAG,CAACG,EAAYH,EAAY,CAAC,CAAC,EAAGE,GAAiBJ,CAAI,CAAC,EAC7H,MAAO,CACL,KAAM,OACN,iBAAkB,GAClB,MAAOwB,CACT,CACF,EACA,OAAQ,SAAUxB,EAAMK,EAAYH,EAAa,CAC/C,IAAIwB,EAAY1B,EAAK,aAAa,EAC9B2B,EAAOzB,EAAY,CAAC,EAAIA,EAAY,CAAC,EACzC,MAAO,CACL,KAAM,OACN,MAAkB0B,GAAc,CAACvB,EAAaqB,EAAY,EAAGxB,EAAY,CAAC,CAAC,EAAG,CAACwB,EAAWC,CAAI,EAAGvB,GAAiBJ,CAAI,CAAC,CACzH,CACF,CACF,EACA,SAASI,GAAiBJ,EAAM,CAC9B,OAAOA,EAAK,aAAa,EAAI,EAAI,CACnC,CACA,SAASG,GAAgBF,EAAUiB,EAAU,CAC3C,IAAIW,EAAO5B,EAAS,QAAQ,EAC5B,MAAO,CAAC4B,EAAKvC,IAAG4B,CAAQ,CAAC,EAAGW,EAAKvC,IAAG4B,CAAQ,CAAC,EAAIW,EAAKtC,IAAG2B,CAAQ,CAAC,CAAC,CACrE,CACA,IAAOY,IAAQtC,ICxFf,IAAIuC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KACjBG,CACT,CACA,OAAAH,EAAW,KAAO,SACXA,CACT,GAAEI,EAAa,EACR,SAASC,GAAQC,EAAW,CACjCC,GAAIF,EAAkB,EACtBG,GAAS,yBAAyB,oBAAqBC,GAAiB,EACxEH,EAAU,sBAAsBN,GAAU,EAE1CM,EAAU,sBAAsBI,GAAc,EAC9CJ,EAAU,uBAAuBK,EAAe,EAChDC,GAAiBN,EAAW,SAAUK,GAAiBA,GAAgB,aAAa,EACpFL,EAAU,yBAAyB,SAAUO,GAAa,CAC5D,CCxBA,IAAIC,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KACpBG,CACT,CAIA,OAAAH,EAAc,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CACrE,IAAIC,EAAsBC,GAAgBJ,CAAM,EAChDH,EAAO,UAAU,KAAK,MAAM,KAAM,SAAS,EAC3CQ,IAA8BL,EAAQG,CAAmB,CAC3D,EAIAP,EAAc,UAAU,YAAc,SAAUI,EAAQ,CACtDH,EAAO,UAAU,YAAY,MAAM,KAAM,SAAS,EAClDQ,IAA8B,KAAK,OAAQL,CAAM,CACnD,EACAJ,EAAc,UAAU,YAAc,UAAY,CAEhD,OAAO,KAAK,OAAO,QACrB,EACAA,EAAc,KAAO,WACrBA,EAAc,WAAa,MAC3BA,EAAc,cAAgB,CAO5B,EAAG,EACH,KAAM,GACN,IAAK,GACL,SAAU,GAEV,OAAQ,aAER,UAAW,CACT,KAAM,GACN,UAAW,CACT,MAAOU,EAAO,MAAM,SACpB,MAAO,EACP,KAAM,OACR,CACF,EAEA,UAAW,CACT,MAAOA,EAAO,MAAM,UACpB,YAAa,EACb,YAAaA,EAAO,MAAM,SAC5B,EAEA,SAAU,CACR,KAAM,GACN,SAAU,EAEV,SAAU,QACV,OAAQA,EAAO,KAAK,EACpB,MAAOA,EAAO,MAAM,SACtB,EAEA,WAAY,CACV,KAAM,GAEN,SAAU,QACV,OAAQA,EAAO,KAAK,EAEpB,MAAO,SACP,UAAW,KACX,MAAOA,EAAO,MAAM,SACtB,EAEA,UAAW,CACT,KAAM,GAEN,SAAU,KACV,OAAQA,EAAO,KAAK,GACpB,UAAW,KACX,MAAOA,EAAO,MAAM,WACpB,WAAY,aACZ,WAAY,SACZ,SAAU,EACZ,CACF,EACOV,CACT,GAAEW,EAAc,EAChB,SAASF,IAA8BG,EAAQC,EAAK,CAElD,IAAIC,EAAWF,EAAO,SAClBG,EACQC,EAAQF,CAAQ,EAG1BC,EAAcD,EAFdC,EAAcH,EAAO,SAAW,CAACE,EAAUA,CAAQ,EAIjDC,EAAY,SAAW,IACzBA,EAAY,CAAC,EAAIA,EAAY,CAAC,GAEhC,IAAIE,EAAoBC,EAAI,CAAC,EAAG,CAAC,EAAG,SAAUC,EAAO,CAInD,OAAIC,IAAeP,EAAKM,CAAK,IAC3BJ,EAAYI,CAAK,EAAI,QAEhBJ,EAAYI,CAAK,GAAK,MAAQJ,EAAYI,CAAK,IAAM,MAC9D,CAAC,EACDE,GAAiBT,EAAQC,EAAK,CAC5B,KAAM,MACN,WAAYI,CACd,CAAC,CACH,CACA,IAAOK,IAAQtB,IClHf,IAAIuB,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,OAAS,SAAUI,EAAeC,EAASC,EAAK,CACrE,IAAIC,EAAQ,KAAK,MACjBA,EAAM,UAAU,EAChB,IAAIC,EAAWJ,EAAc,iBAEzBK,EAAYD,EAAS,aAAa,EAClCE,EAASF,EAAS,UAAU,EAE5BG,EAAcN,EAAQ,eAAe,EACzC,KAAK,eAAeD,EAAeK,EAAWF,CAAK,EAEnD,KAAK,aAAaH,EAAeK,EAAWC,EAAQH,CAAK,EACzD,KAAK,gBAAgBH,EAAeK,EAAWC,EAAQH,CAAK,EAC5D,KAAK,iBAAiBH,EAAeO,EAAaD,EAAQH,CAAK,EAC/D,KAAK,gBAAgBH,EAAeO,EAAaF,EAAWC,EAAQH,CAAK,CAC3E,EAEAP,EAAa,UAAU,eAAiB,SAAUI,EAAeK,EAAWF,EAAO,CAKjF,QAJIC,EAAWJ,EAAc,iBACzBQ,EAAqBR,EAAc,SAAS,WAAW,EAAE,aAAa,EACtES,EAAKL,EAAS,aAAa,EAC3BM,EAAKN,EAAS,cAAc,EACvBO,EAAIN,EAAU,MAAM,KAAMM,GAAKN,EAAU,IAAI,KAAMM,EAAIP,EAAS,YAAYO,EAAG,CAAC,EAAE,KAAM,CAC/F,IAAIC,EAAQR,EAAS,qBAAqB,CAACO,CAAC,EAAG,EAAK,EAAE,GAElDE,EAAO,IAAYC,GAAK,CAC1B,MAAO,CACL,EAAGF,EAAM,CAAC,EACV,EAAGA,EAAM,CAAC,EACV,MAAOH,EACP,OAAQC,CACV,EACA,OAAQ,UACR,MAAOF,CACT,CAAC,EACDL,EAAM,IAAIU,CAAI,CAChB,CACF,EAEAjB,EAAa,UAAU,aAAe,SAAUI,EAAeK,EAAWC,EAAQH,EAAO,CACvF,IAAIY,EAAO,KACPX,EAAWJ,EAAc,iBACzBgB,EAAiBhB,EAAc,SAAS,CAAC,YAAa,WAAW,CAAC,EAAE,aAAa,EACjFiB,EAAOjB,EAAc,IAAI,CAAC,YAAa,MAAM,CAAC,EAC9CkB,EAAYF,EAAe,UAC/B,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,CAAC,EAClB,KAAK,iBAAmB,CAAC,EACzB,KAAK,gBAAkB,CAAC,EAExB,QADIG,EAAWd,EAAU,MAChBM,EAAI,EAAGQ,EAAS,MAAQd,EAAU,IAAI,KAAMM,IAAK,CACxDS,EAAUD,EAAS,YAAY,EAC3BR,IAAM,IACRQ,EAAWf,EAAS,YAAYC,EAAU,MAAM,EAAI,IAAMA,EAAU,MAAM,CAAC,GAE7E,IAAIgB,EAAOF,EAAS,KACpBE,EAAK,SAASA,EAAK,SAAS,EAAI,CAAC,EACjCF,EAAWf,EAAS,YAAYiB,CAAI,CACtC,CACAD,EAAUhB,EAAS,YAAYC,EAAU,IAAI,KAAM,CAAC,EAAE,YAAY,EAClE,SAASe,EAAUC,EAAM,CACvBN,EAAK,iBAAiB,KAAKX,EAAS,YAAYiB,CAAI,CAAC,EACrDN,EAAK,gBAAgB,KAAKX,EAAS,qBAAqB,CAACiB,CAAI,EAAG,EAAK,EAAE,EAAE,EACzE,IAAIC,EAASP,EAAK,wBAAwBf,EAAeqB,EAAMf,CAAM,EACrES,EAAK,UAAU,KAAKO,EAAO,CAAC,CAAC,EAC7BP,EAAK,UAAU,KAAKO,EAAOA,EAAO,OAAS,CAAC,CAAC,EAC7CL,GAAQF,EAAK,eAAeO,EAAQN,EAAgBb,CAAK,CAC3D,CAEAc,GAAQ,KAAK,eAAeF,EAAK,gBAAgBA,EAAK,UAAWG,EAAWZ,CAAM,EAAGU,EAAgBb,CAAK,EAE1Gc,GAAQ,KAAK,eAAeF,EAAK,gBAAgBA,EAAK,UAAWG,EAAWZ,CAAM,EAAGU,EAAgBb,CAAK,CAC5G,EAEAP,EAAa,UAAU,gBAAkB,SAAU0B,EAAQJ,EAAWZ,EAAQ,CAC5E,IAAIiB,EAAK,CAACD,EAAO,CAAC,EAAE,MAAM,EAAGA,EAAOA,EAAO,OAAS,CAAC,EAAE,MAAM,CAAC,EAC1DE,EAAMlB,IAAW,aAAe,EAAI,EAExC,OAAAiB,EAAG,CAAC,EAAEC,CAAG,EAAID,EAAG,CAAC,EAAEC,CAAG,EAAIN,EAAY,EACtCK,EAAG,CAAC,EAAEC,CAAG,EAAID,EAAG,CAAC,EAAEC,CAAG,EAAIN,EAAY,EAC/BK,CACT,EAEA3B,EAAa,UAAU,eAAiB,SAAU0B,EAAQG,EAAWtB,EAAO,CAC1E,IAAIuB,EAAU,IAAYC,GAAS,CACjC,GAAI,GACJ,MAAO,CACL,OAAQL,CACV,EACA,MAAOG,CACT,CAAC,EACDtB,EAAM,IAAIuB,CAAO,CACnB,EAEA9B,EAAa,UAAU,wBAA0B,SAAUI,EAAeqB,EAAMf,EAAQ,CAItF,QAHIF,EAAWJ,EAAc,iBACzB4B,EAAaxB,EAAS,YAAYiB,CAAI,EACtCC,EAAS,CAAC,EACLX,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIkB,EAAOzB,EAAS,YAAYwB,EAAW,KAAMjB,CAAC,EAC9CC,EAAQR,EAAS,qBAAqB,CAACyB,EAAK,IAAI,EAAG,EAAK,EAC5DP,EAAO,EAAIO,EAAK,GAAG,EAAIjB,EAAM,GAC7BU,EAAO,EAAIO,EAAK,IAAM,CAAC,EAAIjB,EAAMN,IAAW,aAAe,KAAO,IAAI,CACxE,CACA,OAAOgB,CACT,EACA1B,EAAa,UAAU,gBAAkB,SAAUkC,EAAWC,EAAQ,CACpE,OAAIC,GAASF,CAAS,GAAKA,EAClBG,IAAgBH,EAAWC,CAAM,EAEtCG,GAAWJ,CAAS,EACfA,EAAUC,CAAM,EAElBA,EAAO,OAChB,EACAnC,EAAa,UAAU,yBAA2B,SAAUuC,EAAQvB,EAAON,EAAQ8B,EAAUC,EAAQ,CACnG,IAAIC,EAAI1B,EAAM,CAAC,EACX2B,EAAI3B,EAAM,CAAC,EACX4B,EAAS,CAAC,SAAU,QAAQ,EAC5BJ,IAAa,UACfG,GAAKF,EACLG,EAAS,CAAC,SAAU,KAAK,GAChBJ,IAAa,OACtBE,GAAKD,EACID,IAAa,SACtBE,GAAKD,EACLG,EAAS,CAAC,SAAU,KAAK,GAGzBD,GAAKF,EAEP,IAAII,EAAS,EACb,OAAIL,IAAa,QAAUA,IAAa,WACtCK,EAAS,KAAK,GAAK,GAEd,CACL,SAAUA,EACV,EAAGH,EACH,EAAGC,EACH,MAAO,CACL,MAAOC,EAAO,CAAC,EACf,cAAeA,EAAO,CAAC,CACzB,CACF,CACF,EAEA5C,EAAa,UAAU,gBAAkB,SAAUI,EAAeK,EAAWC,EAAQH,EAAO,CAC1F,IAAIuC,EAAY1C,EAAc,SAAS,WAAW,EAClD,GAAK0C,EAAU,IAAI,MAAM,EAGzB,KAAIL,EAASK,EAAU,IAAI,QAAQ,EAC/BC,EAAMD,EAAU,IAAI,UAAU,EAC7BC,IACHA,EAAMrC,IAAW,aAAe,MAAQ,QAE1C,IAAIgB,EAAS,CAAC,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAAG,KAAK,UAAU,CAAC,CAAC,EACtEsB,GAAMtB,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCuB,GAAMvB,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,GAAK,EACrCE,EAAMlB,IAAW,aAAe,EAAI,EACpCwC,EAAY,CACd,IAAK,CAACF,EAAItB,EAAOE,CAAG,EAAE,CAAC,CAAC,EACxB,OAAQ,CAACoB,EAAItB,EAAO,EAAIE,CAAG,EAAE,CAAC,CAAC,EAC/B,KAAM,CAACF,EAAO,EAAIE,CAAG,EAAE,CAAC,EAAGqB,CAAE,EAC7B,MAAO,CAACvB,EAAOE,CAAG,EAAE,CAAC,EAAGqB,CAAE,CAC5B,EACIE,EAAO1C,EAAU,MAAM,EACvB,CAACA,EAAU,IAAI,EAAI,CAACA,EAAU,MAAM,IACtC0C,EAAOA,EAAO,IAAM1C,EAAU,IAAI,GAEpC,IAAIyB,EAAYY,EAAU,IAAI,WAAW,EACrCX,EAAS,CACX,MAAO1B,EAAU,MAAM,EACvB,IAAKA,EAAU,IAAI,EACnB,QAAS0C,CACX,EACIC,EAAU,KAAK,gBAAgBlB,EAAWC,CAAM,EAChDkB,EAAW,IAAYC,GAAK,CAC9B,GAAI,GACJ,MAAOC,GAAgBT,EAAW,CAChC,KAAMM,CACR,CAAC,EACD,OAAQN,EAAU,IAAI,QAAQ,CAChC,CAAC,EACDO,EAAS,KAAK,KAAK,yBAAyBA,EAAUH,EAAUH,CAAG,EAAGrC,EAAQqC,EAAKN,CAAM,CAAC,EAC1FlC,EAAM,IAAI8C,CAAQ,EACpB,EACArD,EAAa,UAAU,0BAA4B,SAAUgB,EAAOwC,EAAU9C,EAAQ8B,EAAUC,EAAQ,CACtG,IAAIgB,EAAQ,OACRC,EAAS,MACThB,EAAI1B,EAAM,CAAC,EACX2B,EAAI3B,EAAM,CAAC,EACf,OAAIN,IAAW,cACbiC,EAAIA,EAAIF,EACJe,IACFC,EAAQ,UAENjB,IAAa,UACfkB,EAAS,YAGXhB,EAAIA,EAAID,EACJe,IACFE,EAAS,UAEPlB,IAAa,UACfiB,EAAQ,UAGL,CACL,EAAGf,EACH,EAAGC,EACH,MAAOc,EACP,cAAeC,CACjB,CACF,EAEA1D,EAAa,UAAU,iBAAmB,SAAUI,EAAeO,EAAaD,EAAQH,EAAO,CAC7F,IAAIoD,EAAavD,EAAc,SAAS,YAAY,EACpD,GAAKuD,EAAW,IAAI,MAAM,EAG1B,KAAIC,EAAUD,EAAW,IAAI,SAAS,EAClClB,EAASkB,EAAW,IAAI,QAAQ,EAChCZ,EAAMY,EAAW,IAAI,UAAU,EAC/BF,EAAQE,EAAW,IAAI,OAAO,EAC9BE,EAAa,CAAC,KAAK,UAAW,KAAK,SAAS,GAC5C,CAACD,GAAWxB,GAASwB,CAAO,KAC1BA,IAEFjD,EAAcmD,GAAeF,CAAO,GAAKjD,GAI3CiD,EAAUjD,EAAY,IAAI,CAAC,OAAQ,WAAW,CAAC,GAAK,CAAC,GAEvD,IAAIiB,EAAMmB,IAAQ,QAAU,EAAI,EAC5BgB,EAAOrD,IAAW,aAAe,EAAI,EACzC+B,EAASM,IAAQ,QAAU,CAACN,EAASA,EAGrC,QAFIe,EAAWC,IAAU,SACrBO,EAAcL,EAAW,IAAI,QAAQ,EAChC5C,EAAI,EAAGA,EAAI8C,EAAWjC,CAAG,EAAE,OAAS,EAAGb,IAAK,CACnD,IAAIkD,EAAMJ,EAAWjC,CAAG,EAAEb,CAAC,EAAE,MAAM,EAC/BQ,EAAW,KAAK,iBAAiBR,CAAC,EACtC,GAAIyC,EAAU,CACZ,IAAIU,EAAiB,KAAK,gBAAgBnD,CAAC,EAC3CkD,EAAIF,CAAI,GAAKG,EAAeH,CAAI,EAAIF,EAAW,CAAC,EAAE9C,EAAI,CAAC,EAAEgD,CAAI,GAAK,CACpE,CACA,IAAI7B,EAAYyB,EAAW,IAAI,WAAW,EACtCQ,EAASP,EAAQ,CAACrC,EAAS,EAAI,CAAC,EAChCY,EAAS,CACX,KAAMZ,EAAS,EACf,IAAKA,EAAS,EAAI,IAAI,MAAM,CAAC,EAC7B,GAAIA,EAAS,EACb,EAAG,CAACA,EAAS,EACb,QAAS4C,CACX,EACIf,EAAU,KAAK,gBAAgBlB,EAAWC,CAAM,EAChDiC,EAAY,IAAYd,GAAK,CAC/B,GAAI,GACJ,MAAOe,EAAOd,GAAgBI,EAAY,CACxC,KAAMP,CACR,CAAC,EAAG,KAAK,0BAA0Ba,EAAKT,EAAU9C,EAAQqC,EAAKN,CAAM,CAAC,EACtE,OAAQuB,CACV,CAAC,EACDzD,EAAM,IAAI6D,CAAS,CACrB,EACF,EACApE,EAAa,UAAU,yBAA2B,SAAUgB,EAAON,EAAQ8B,EAAUC,EAAQ6B,EAAU,CACrG,IAAIb,EAAQ,SACRC,EAAS,SACThB,EAAI1B,EAAM,CAAC,EACX2B,EAAI3B,EAAM,CAAC,EACXuD,EAAU/B,IAAa,QAC3B,OAAI9B,IAAW,cACbgC,EAAIA,EAAID,GAAU8B,EAAU,EAAI,IAAMD,EAAS,CAAC,EAAI,EACpDb,EAAQc,EAAU,QAAU,SAE5B5B,EAAIA,EAAIF,GAAU8B,EAAU,EAAI,IAAMD,EAAS,CAAC,EAAI,EACpDZ,EAASa,EAAU,SAAW,OAEzB,CACL,EAAG7B,EACH,EAAGC,EACH,MAAOc,EACP,cAAeC,CACjB,CACF,EAEA1D,EAAa,UAAU,gBAAkB,SAAUI,EAAeO,EAAaF,EAAWC,EAAQH,EAAO,CACvG,IAAIiE,EAAWpE,EAAc,SAAS,UAAU,EAChD,GAAKoE,EAAS,IAAI,MAAM,EAGxB,KAAIhE,EAAWJ,EAAc,iBACzB2C,EAAMyB,EAAS,IAAI,UAAU,EAC7BZ,EAAUY,EAAS,IAAI,SAAS,EAChC/B,EAAS+B,EAAS,IAAI,QAAQ,EAC9BC,EAAiBjE,EAAS,kBAAkB,EAChD,GAAI,CAACoD,GAAWxB,GAASwB,CAAO,EAAG,CAC7BA,IAEFjD,EAAcmD,GAAeF,CAAO,GAAKjD,GAG3C,IAAI+D,EAAiB/D,EAAY,IAAI,CAAC,OAAQ,gBAAgB,CAAC,EAC/DiD,EAAUc,GAAkBC,EAAIhE,EAAY,IAAI,CAAC,OAAQ,eAAe,CAAC,EAAG,SAAUiE,EAAK,CACzF,OAAOA,EAAI,CAAC,CACd,CAAC,CACH,CACA,IAAIC,EAAQrE,EAAS,YAAYC,EAAU,IAAI,KAAM,EAAIA,EAAU,KAAK,EAAE,KACtE6D,EAAW,CAAC9D,EAAS,aAAa,EAAGA,EAAS,cAAc,CAAC,EACjEiC,EAASqC,GAAarC,EAAQ,KAAK,IAAI6B,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,CAAC,EAC5DvB,IAAQ,UACV8B,EAAQrE,EAAS,YAAYC,EAAU,MAAM,KAAM,EAAE,EAAIA,EAAU,MAAM,EAAE,KAC3EgC,EAAS,CAACA,GAGZ,QADIuB,EAAcQ,EAAS,IAAI,QAAQ,EAC9BzD,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIkB,EAAOzB,EAAS,YAAYqE,EAAO9D,CAAC,EACpCC,EAAQR,EAAS,qBAAqB,CAACyB,EAAK,IAAI,EAAG,EAAK,EAAE,OAC1D8C,EAAMhE,EACVgE,EAAM,KAAK,KAAKhE,EAAI0D,GAAkB,CAAC,EACvC,IAAIO,EAAW,IAAY1B,GAAK,CAC9B,GAAI,GACJ,MAAOe,EAAOd,GAAgBiB,EAAU,CACtC,KAAMZ,EAAQmB,CAAG,CACnB,CAAC,EAAG,KAAK,yBAAyB/D,EAAON,EAAQqC,EAAKN,EAAQ6B,CAAQ,CAAC,EACvE,OAAQN,CACV,CAAC,EACDzD,EAAM,IAAIyE,CAAQ,CACpB,EACF,EACAhF,EAAa,KAAO,WACbA,CACT,GAAEiF,EAAa,EACRC,IAAQlF,ICxVf,IAAImF,GAAoB,MACpBC,KAAwB,UAAY,CACtC,SAASA,EAASC,EAAeC,EAASC,EAAK,CAC7C,KAAK,KAAO,WACZ,KAAK,WAAaH,EAAS,WAE3B,KAAK,kBAAoBA,EAAS,kBAClC,KAAK,OAASC,EACd,KAAK,QAAQC,EAASC,CAAG,CAC3B,CACA,OAAAH,EAAS,kBAAoB,UAAY,CACvC,MAAO,CAAC,CACN,KAAM,OACN,KAAM,MACR,EAAG,OAAO,CACZ,EACAA,EAAS,UAAU,aAAe,UAAY,CAC5C,OAAO,KAAK,UACd,EACAA,EAAS,UAAU,SAAW,UAAY,CACxC,OAAO,KAAK,MACd,EACAA,EAAS,UAAU,QAAU,UAAY,CACvC,OAAO,KAAK,KACd,EACAA,EAAS,UAAU,aAAe,UAAY,CAC5C,OAAO,KAAK,GACd,EACAA,EAAS,UAAU,cAAgB,UAAY,CAC7C,OAAO,KAAK,GACd,EACAA,EAAS,UAAU,UAAY,UAAY,CACzC,OAAO,KAAK,OACd,EAUAA,EAAS,UAAU,kBAAoB,UAAY,CACjD,OAAO,KAAK,eACd,EAKAA,EAAS,UAAU,YAAc,SAAUI,EAAM,CAC/CA,EAAkBC,GAAUD,CAAI,EAChC,IAAIE,EAAIF,EAAK,YAAY,EACrBG,EAAIH,EAAK,SAAS,EAAI,EACtBI,EAAOD,EAAI,GAAK,IAAMA,EAAI,GAAKA,EAC/BE,EAAIL,EAAK,QAAQ,EACjBM,EAAOD,EAAI,GAAK,IAAMA,EAAI,GAAKA,EAC/BE,EAAMP,EAAK,OAAO,EACtB,OAAAO,EAAM,KAAK,KAAKA,EAAM,EAAI,KAAK,kBAAkB,GAAK,CAAC,EAChD,CACL,EAAGL,EAAI,GACP,EAAGE,EACH,EAAGE,EACH,IAAKC,EACL,KAAMP,EAAK,QAAQ,EACnB,aAAcE,EAAI,IAAME,EAAO,IAAME,EACrC,KAAMN,CACR,CACF,EACAJ,EAAS,UAAU,YAAc,SAAUI,EAAMQ,EAAG,CAElD,OADAA,EAAIA,GAAK,EACLA,IAAM,EACD,KAAK,YAAYR,CAAI,GAE9BA,EAAO,IAAI,KAAK,KAAK,YAAYA,CAAI,EAAE,IAAI,EAC3CA,EAAK,QAAQA,EAAK,QAAQ,EAAIQ,CAAC,EACxB,KAAK,YAAYR,CAAI,EAC9B,EACAJ,EAAS,UAAU,QAAU,SAAUE,EAASC,EAAK,CACnD,KAAK,gBAAkB,CAAC,KAAK,OAAO,SAAS,UAAU,EAAE,IAAI,UAAU,EACvE,KAAK,QAAU,KAAK,OAAO,IAAI,QAAQ,EACvC,KAAK,WAAa,KAAK,OAAO,SAAS,WAAW,EAAE,aAAa,EAAE,WAAa,EAChF,KAAK,WAAa,KAAK,cAAc,KAAK,iBAAiB,CAAC,EAC5D,IAAIU,EAAQ,KAAK,WAAW,OAAS,EACjCC,EAAU,CAAC,QAAS,QAAQ,EAC5BC,EAAW,KAAK,OAAO,YAAY,EAAE,MAAM,EAC3CC,EAAe,KAAK,OAAO,mBAAmB,EAC9CC,EAAc,KAAK,UAAY,aAAe,CAACJ,EAAO,CAAC,EAAI,CAAC,EAAGA,CAAK,EACjEK,EAAK,CAAC,EAAG,CAAC,EAAG,SAAUC,EAAK,CAC7BC,EAAkBL,EAAUI,CAAG,IACjCH,EAAaF,EAAQK,CAAG,CAAC,EAAIJ,EAASI,CAAG,EAAIF,EAAYE,CAAG,EAEhE,CAAC,EACD,IAAIE,EAAW,CACb,MAAOlB,EAAI,SAAS,EACpB,OAAQA,EAAI,UAAU,CACxB,EACImB,EAAe,KAAK,MAAeC,GAAcP,EAAcK,CAAQ,EACpEH,EAAK,CAAC,EAAG,CAAC,EAAG,SAAUC,EAAK,CAC5BC,EAAkBL,EAAUI,CAAG,IAClCJ,EAASI,CAAG,EAAIG,EAAaR,EAAQK,CAAG,CAAC,EAAIF,EAAYE,CAAG,EAEhE,CAAC,EACD,SAASC,EAAkBL,EAAUI,EAAK,CACxC,OAAOJ,EAASI,CAAG,GAAK,MAAQJ,EAASI,CAAG,IAAM,MACpD,CAEA,KAAK,IAAMJ,EAAS,CAAC,EACrB,KAAK,IAAMA,EAAS,CAAC,CACvB,EAMAf,EAAS,UAAU,YAAc,SAAUwB,EAAMC,EAAOC,EAAK,CAC3DA,EAAMA,GAAO,CAAC,EACPC,EAAQH,CAAI,IAAMA,EAAOA,EAAK,CAAC,GACtCC,GAAS,OAASA,EAAQ,IAC1B,IAAIG,EAAU,KAAK,YAAYJ,CAAI,EAC/BK,EAAQ,KAAK,WACbzB,EAAOwB,EAAQ,aAEnB,GAAIH,GAAS,EAAEG,EAAQ,MAAQC,EAAM,MAAM,MAAQD,EAAQ,KAAOC,EAAM,IAAI,KAAO9B,IACjF,OAAA2B,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAI,IACXA,EAET,IAAII,EAAOF,EAAQ,IACfG,EAAU,KAAK,cAAc,CAACF,EAAM,MAAM,KAAMzB,CAAI,CAAC,EAAE,QAC3D,OAAI,KAAK,UAAY,YACnBsB,EAAI,CAAC,EAAI,KAAK,MAAM,EAAII,EAAO,KAAK,IAAM,KAAK,IAAM,EACrDJ,EAAI,CAAC,EAAI,KAAK,MAAM,EAAIK,EAAU,KAAK,IAAM,KAAK,IAAM,IAExDL,EAAI,CAAC,EAAI,KAAK,MAAM,EAAIK,EAAU,KAAK,IAAM,KAAK,IAAM,EACxDL,EAAI,CAAC,EAAI,KAAK,MAAM,EAAII,EAAO,KAAK,IAAM,KAAK,IAAM,GAEhDJ,CACT,EAIA1B,EAAS,UAAU,YAAc,SAAUgC,EAAO,CAChD,IAAI5B,EAAO,KAAK,YAAY4B,CAAK,EACjC,OAAO5B,GAAQA,EAAK,IACtB,EACAJ,EAAS,UAAU,aAAe,SAAUwB,EAAMC,EAAOC,EAAK,CAC5DA,EAAMA,GAAO,CAAC,EACd,IAAIO,EAAOP,EAAI,KAAOA,EAAI,MAAQ,CAAC,EAC/BQ,EAAcR,EAAI,YAAcA,EAAI,aAAe,CAAC,EACpDM,EAAQ,KAAK,YAAYR,EAAMC,CAAK,EACxC,OAAAQ,EAAK,EAAID,EAAM,CAAC,EAAI,KAAK,IAAM,EAC/BC,EAAK,EAAID,EAAM,CAAC,EAAI,KAAK,IAAM,EAC/BC,EAAK,MAAQ,KAAK,IAClBA,EAAK,OAAS,KAAK,IACnBE,GAAa,KAAKD,EAAaD,CAAI,EACnCG,GAAmBF,EAAa,KAAK,WAAa,EAAG,GAAM,EAAI,EACxDR,CACT,EAIA1B,EAAS,UAAU,qBAAuB,SAAUwB,EAAMC,EAAO,CAC/D,IAAIO,EAAQ,KAAK,YAAYR,EAAMC,CAAK,EACxC,MAAO,CACL,OAAQO,EACR,GAAI,CAACA,EAAM,CAAC,EAAI,KAAK,IAAM,EAAGA,EAAM,CAAC,EAAI,KAAK,IAAM,CAAC,EACrD,GAAI,CAACA,EAAM,CAAC,EAAI,KAAK,IAAM,EAAGA,EAAM,CAAC,EAAI,KAAK,IAAM,CAAC,EACrD,GAAI,CAACA,EAAM,CAAC,EAAI,KAAK,IAAM,EAAGA,EAAM,CAAC,EAAI,KAAK,IAAM,CAAC,EACrD,GAAI,CAACA,EAAM,CAAC,EAAI,KAAK,IAAM,EAAGA,EAAM,CAAC,EAAI,KAAK,IAAM,CAAC,CACvD,CACF,EAOAhC,EAAS,UAAU,YAAc,SAAUgC,EAAO,CAChD,IAAIK,EAAO,KAAK,OAAOL,EAAM,CAAC,EAAI,KAAK,MAAM,GAAK,KAAK,GAAG,EAAI,EAC1DM,EAAO,KAAK,OAAON,EAAM,CAAC,EAAI,KAAK,MAAM,GAAK,KAAK,GAAG,EAAI,EAC1DH,EAAQ,KAAK,WAAW,MAC5B,OAAI,KAAK,UAAY,WACZ,KAAK,sBAAsBS,EAAMD,EAAO,EAAGR,CAAK,EAElD,KAAK,sBAAsBQ,EAAMC,EAAO,EAAGT,CAAK,CACzD,EACA7B,EAAS,UAAU,eAAiB,SAAUE,EAASqC,EAAQC,EAAO,CACpE,IAAIC,EAAWC,GAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYD,CAAK,EAAI,IAC3D,EACAxC,EAAS,UAAU,gBAAkB,SAAUE,EAASqC,EAAQC,EAAO,CACrE,IAAIC,EAAWC,GAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,aAAaD,CAAK,EAAI,IAC5D,EACAxC,EAAS,UAAU,iBAAmB,SAAUE,EAASqC,EAAQI,EAAO,CACtE,IAAIF,EAAWC,GAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYE,CAAK,EAAI,IAC3D,EACA3C,EAAS,UAAU,aAAe,SAAUgC,EAAO,CACjD,eAAQ,KAAK,kBAAkB,EACxB,EACT,EAKAhC,EAAS,UAAU,iBAAmB,UAAY,CAChD,IAAI6B,EAAQ,KAAK,OAAO,IAAI,OAAO,EAC/Be,EAKJ,GAHWjB,EAAQE,CAAK,GAAKA,EAAM,SAAW,IAC5CA,EAAQA,EAAM,CAAC,GAELF,EAAQE,CAAK,EAmBvBe,EAAkBf,MAnBQ,CAC1B,IAAIgB,EAAWhB,EAAM,SAAS,EAM9B,GAJI,UAAU,KAAKgB,CAAQ,IACzBD,EAAkB,CAACC,EAAW,SAAUA,EAAW,QAAQ,GAGzD,uBAAuB,KAAKA,CAAQ,EAAG,CACzC,IAAIC,EAAQ,KAAK,YAAYD,CAAQ,EACjCE,EAAWD,EAAM,KACrBC,EAAS,SAASA,EAAS,SAAS,EAAI,CAAC,EACzC,IAAIC,EAAM,KAAK,YAAYD,EAAU,EAAE,EACvCH,EAAkB,CAACE,EAAM,aAAcE,EAAI,YAAY,CACzD,CAEI,oCAAoC,KAAKH,CAAQ,IACnDD,EAAkB,CAACC,EAAUA,CAAQ,EAEzC,CAGA,GAAI,CAACD,EAKH,OAAOf,EAET,IAAIoB,EAAM,KAAK,cAAcL,CAAe,EAC5C,OAAIK,EAAI,MAAM,KAAOA,EAAI,IAAI,MAC3BL,EAAgB,QAAQ,EAEnBA,CACT,EASA5C,EAAS,UAAU,cAAgB,SAAU6B,EAAO,CAClD,IAAIqB,EAAc,CAAC,KAAK,YAAYrB,EAAM,CAAC,CAAC,EAAG,KAAK,YAAYA,EAAM,CAAC,CAAC,CAAC,EACrEsB,EACAD,EAAY,CAAC,EAAE,KAAOA,EAAY,CAAC,EAAE,OACvCC,EAAW,GACXD,EAAY,QAAQ,GAEtB,IAAIE,EAAS,KAAK,MAAMF,EAAY,CAAC,EAAE,KAAOnD,EAAiB,EAAI,KAAK,MAAMmD,EAAY,CAAC,EAAE,KAAOnD,EAAiB,EAAI,EAWrHK,EAAO,IAAI,KAAK8C,EAAY,CAAC,EAAE,IAAI,EACnCG,EAAejD,EAAK,QAAQ,EAC5BkD,EAAaJ,EAAY,CAAC,EAAE,KAAK,QAAQ,EAC7C9C,EAAK,QAAQiD,EAAeD,EAAS,CAAC,EAEtC,IAAIG,EAAUnD,EAAK,QAAQ,EAC3B,GAAImD,IAAYD,EAEd,QADIE,EAAOpD,EAAK,QAAQ,EAAI8C,EAAY,CAAC,EAAE,KAAO,EAAI,EAAI,IAClDK,EAAUnD,EAAK,QAAQ,KAAOkD,IAAelD,EAAK,QAAQ,EAAI8C,EAAY,CAAC,EAAE,MAAQM,EAAO,GAClGJ,GAAUI,EACVpD,EAAK,QAAQmD,EAAUC,CAAI,EAG/B,IAAI3C,EAAQ,KAAK,OAAOuC,EAASF,EAAY,CAAC,EAAE,IAAM,GAAK,CAAC,EACxDnB,EAAUoB,EAAW,CAACtC,EAAQ,EAAIA,EAAQ,EAC9C,OAAAsC,GAAYD,EAAY,QAAQ,EACzB,CACL,MAAO,CAACA,EAAY,CAAC,EAAE,aAAcA,EAAY,CAAC,EAAE,YAAY,EAChE,MAAOA,EAAY,CAAC,EACpB,IAAKA,EAAY,CAAC,EAClB,OAAQE,EACR,MAAOvC,EAEP,QAASkB,EACT,MAAOmB,EAAY,CAAC,EAAE,IACtB,MAAOA,EAAY,CAAC,EAAE,GACxB,CACF,EAUAlD,EAAS,UAAU,sBAAwB,SAAU+B,EAASpB,EAAKkB,EAAO,CACxE,IAAI4B,EAAY,KAAK,cAAc5B,CAAK,EACxC,GAAIE,EAAU0B,EAAU,OAAS1B,IAAY,GAAKpB,EAAM8C,EAAU,OAAS1B,IAAY0B,EAAU,OAAS9C,EAAM8C,EAAU,MACxH,OAAO,KAET,IAAIC,GAAU3B,EAAU,GAAK,EAAI0B,EAAU,MAAQ9C,EAC/CP,EAAO,IAAI,KAAKqD,EAAU,MAAM,IAAI,EACxC,OAAArD,EAAK,QAAQ,CAACqD,EAAU,MAAM,EAAIC,CAAM,EACjC,KAAK,YAAYtD,CAAI,CAC9B,EACAJ,EAAS,OAAS,SAAUE,EAASC,EAAK,CACxC,IAAIwD,EAAe,CAAC,EACpB,OAAAzD,EAAQ,cAAc,WAAY,SAAUD,EAAe,CACzD,IAAI2D,EAAW,IAAI5D,EAASC,EAAeC,EAASC,CAAG,EACvDwD,EAAa,KAAKC,CAAQ,EAC1B3D,EAAc,iBAAmB2D,CACnC,CAAC,EAED1D,EAAQ,cAAc,SAAU2D,EAAUC,EAAgB,CACxDC,GAAuB,CACrB,YAAaD,EACb,aAAc,WACd,iBAAkBE,EACpB,CAAC,CACH,CAAC,EACML,CACT,EACA3D,EAAS,WAAa,CAAC,OAAQ,OAAO,EAC/BA,CACT,GAAE,EACF,SAAS0C,GAAYH,EAAQ,CAC3B,IAAItC,EAAgBsC,EAAO,cACvB0B,EAAc1B,EAAO,YACrBE,EAAWxC,EAAgBA,EAAc,iBAAmBgE,EAAcA,EAAY,iBAAmB,KAC7G,OAAOxB,CACT,CACA,IAAOyB,IAAQlE,IC9VR,SAASmE,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAa,EAC9CD,EAAU,sBAAsBE,GAAY,EAC5CF,EAAU,yBAAyB,WAAYG,GAAQ,CACzD,CCJO,IAAIC,GAA2B,CACpC,MAAO,EACP,KAAM,EACN,QAAS,CACX,EAIWC,GAAoB,CAI7B,KAAM,EAEN,IAAK,EACL,KAAM,EACN,OAAQ,CACV,EAUO,SAASC,GAA8BC,EAAYC,EAAMC,EAC9D,CAEA,IAAIC,EAASF,EAAKG,GAAGF,CAAU,CAAC,EAAE,QAAQF,CAAU,EAEpD,MAAI,CAACG,GAAUE,GAASL,CAAU,GAAKA,EAAa,IAClDG,EAASF,EAAKG,GAAG,EAAIF,CAAU,CAAC,EAAE,kBAAkBA,EAAY,KAAK,MAAMF,CAAU,CAAC,GAEjFG,CACT,CACO,SAASG,GAAoBC,EAAK,CACvC,IAAIC,EAAKD,GAAO,CAAC,EACjB,OAAAC,EAAG,CAAC,EAAIA,EAAG,CAAC,GAAK,CAAC,EAClBA,EAAG,CAAC,EAAIA,EAAG,CAAC,GAAK,CAAC,EAClBA,EAAG,CAAC,EAAE,CAAC,EAAIA,EAAG,CAAC,EAAE,CAAC,EAAIA,EAAG,CAAC,EAAE,CAAC,EAAIA,EAAG,CAAC,EAAE,CAAC,EAAI,IACrCA,CACT,CAKO,SAASC,GAAsBC,EAGtCC,EAAWC,EAAMX,EAAMY,EAAO,CAG5BC,IAA8BJ,EAAO,CAAC,EAAGC,EAAWE,EAAOD,EAAMX,EAAM,CAAC,EACxEa,IAA8BJ,EAAO,CAAC,EAAGC,EAAWE,EAAOD,EAAMX,EAAM,CAAC,CAC1E,CACA,SAASa,IAA8BC,EAAWJ,EAAWE,EAAOD,EAAMX,EAAMe,EAAQ,CACtFD,EAAU,CAAC,EAAI,IACfA,EAAU,CAAC,EAAI,KACf,IAAIE,EAAYL,EAAKI,CAAM,EACvBE,EAAcC,EAAQF,CAAS,EAAIA,EAAY,CAACA,CAAS,EACzDG,EAAMF,EAAY,OAClBG,EAAW,CAAC,CAACR,EAgBjB,GAfIO,GAAO,GACTE,IAAqCP,EAAWJ,EAAWO,EAAaG,EAAUpB,EAAMe,EAAQ,CAAC,EAC7FI,EAAM,GAGRE,IAAqCP,EAAWJ,EAAWO,EAAaG,EAAUpB,EAAMe,EAAQI,EAAM,CAAC,GAQzGL,EAAU,CAAC,EAAIA,EAAU,CAAC,EAAI,IAE5BM,EAAU,CAGZ,IAAIE,EAAgB,CAACtB,EAAKG,GAAG,EAAIY,CAAM,CAAC,EAAE,gBAAgBA,CAAM,EAC5DQ,EAAgBvB,EAAKG,GAAGY,CAAM,CAAC,EAAE,gBAAgBA,CAAM,EAAI,EAC3DH,IAAUf,GAAkB,KAC9ByB,EAAgBE,GAAQ,EAAGF,CAAa,EAC/BV,IAAUf,GAAkB,SACrC0B,EAAgBE,GAAQ,GAAIF,CAAa,GAEvCA,EAAgBD,IAElBA,EAAgBC,EAAgB,KAE9BG,GAAMZ,EAAU,CAAC,CAAC,IACpBA,EAAU,CAAC,EAAIQ,GAEbI,GAAMZ,EAAU,CAAC,CAAC,IACpBA,EAAU,CAAC,EAAIS,GAEjBT,EAAU,CAAC,EAAIU,GAAQC,GAAQX,EAAU,CAAC,EAAGS,CAAa,EAAGD,CAAa,EAC1ER,EAAU,CAAC,EAAIU,GAAQC,GAAQX,EAAU,CAAC,EAAGS,CAAa,EAAGD,CAAa,CAC5E,CACF,CAEA,SAASD,IAAqCP,EAAWJ,EAAWO,EAAaG,EAAUpB,EAAMe,EAAQY,EAAS,CAChH,IAAIC,EAAS9B,GAA8BmB,EAAYU,CAAO,EAAG3B,EAAMe,CAAM,EAC7E,GAAI,CAACa,EAAQ,CAMXd,EAAU,CAAC,EAAIA,EAAU,CAAC,EAAI,IAC9B,MACF,CACA,IAAIe,EAAWD,EAAO,GAAGzB,GAAGY,CAAM,CAAC,EAC/Be,EAAWD,EACXE,EAAUC,IAAwBJ,CAAM,EACxCG,IAEFD,GAAYC,EAAQ,KAAK5B,GAAGY,CAAM,CAAC,EAAI,GAEzCD,EAAU,CAAC,EAAIW,GAAQX,EAAU,CAAC,EAAGe,EAAUC,CAAQ,EACvDhB,EAAU,CAAC,EAAIU,GAAQV,EAAU,CAAC,EAAGe,EAAUC,CAAQ,CACzD,CAKO,SAASG,GAA6BC,EAAcnB,EAAQ,CACjE,OAAOW,GAAMQ,EAAanB,CAAM,EAAE,CAAC,CAAC,GAAKW,GAAMQ,EAAanB,CAAM,EAAE,CAAC,CAAC,CACxE,CAEO,SAASoB,GAAiCC,EAGjDC,EAAmBC,EAAcC,EAAuB,CACtDF,EAAoBA,GAAqBG,IACzC,QAASC,EAAM,EAAGA,EAAMF,EAAuBE,IAC7CJ,EAAkBI,CAAG,EAAI,GAK3B,OAAa,CAEX,QADIC,EAAW,GACND,EAAM,EAAGA,EAAMF,EAAuBE,IAAO,CACpD,IAAIE,EAAWL,EAAaG,CAAG,EAC3B,CAACJ,EAAkBI,CAAG,GAAKE,EAAS,gBAAkBC,IAAgCR,EAAmBO,EAAS,YAAY,IAChIN,EAAkBI,CAAG,EAAI,GACzBC,EAAW,GAEf,CACA,GAAI,CAACA,EACH,KAEJ,CACF,CACA,IAAIF,IAAwB,CAAC,EAG7B,SAASI,IAAgCC,EAAcC,EAAe,CACpE,MAAI,CAACC,IAA4BF,EAAa,CAAC,EAAGC,EAAc,CAAC,CAAC,GAAK,CAACC,IAA4BF,EAAa,CAAC,EAAGC,EAAc,CAAC,CAAC,EAC5H,IAETD,EAAa,CAAC,EAAE,CAAC,EAAIpB,GAAQoB,EAAa,CAAC,EAAE,CAAC,EAAGC,EAAc,CAAC,EAAE,CAAC,CAAC,EACpED,EAAa,CAAC,EAAE,CAAC,EAAIrB,GAAQqB,EAAa,CAAC,EAAE,CAAC,EAAGC,EAAc,CAAC,EAAE,CAAC,CAAC,EACpED,EAAa,CAAC,EAAE,CAAC,EAAIpB,GAAQoB,EAAa,CAAC,EAAE,CAAC,EAAGC,EAAc,CAAC,EAAE,CAAC,CAAC,EACpED,EAAa,CAAC,EAAE,CAAC,EAAIrB,GAAQqB,EAAa,CAAC,EAAE,CAAC,EAAGC,EAAc,CAAC,EAAE,CAAC,CAAC,EAC7D,GACT,CAEA,SAASC,IAA4BC,EAAiBC,EAAiB,CACrE,OAAOD,EAAgB,CAAC,GAAKC,EAAgB,CAAC,GAAKD,EAAgB,CAAC,GAAKC,EAAgB,CAAC,CAC5F,CACO,SAASC,GAA2BC,EAAOjB,EAAc,CAC9DiB,EAAM,GAAG,IAAIjB,EAAa,CAAC,EAAE,CAAC,EAAGA,EAAa,CAAC,EAAE,CAAC,CAAC,EACnDiB,EAAM,KAAK,IAAIjB,EAAa,CAAC,EAAE,CAAC,EAAIiB,EAAM,GAAG,EAAI,EAAGjB,EAAa,CAAC,EAAE,CAAC,EAAIiB,EAAM,GAAG,EAAI,CAAC,CACzF,CACO,SAASC,IAAoBC,EAAQC,EAAQ,CAClDD,EAAO,CAAC,EAAE,CAAC,EAAIC,EAAO,CAAC,EAAE,CAAC,EAC1BD,EAAO,CAAC,EAAE,CAAC,EAAIC,EAAO,CAAC,EAAE,CAAC,EAC1BD,EAAO,CAAC,EAAE,CAAC,EAAIC,EAAO,CAAC,EAAE,CAAC,EAC1BD,EAAO,CAAC,EAAE,CAAC,EAAIC,EAAO,CAAC,EAAE,CAAC,CAC5B,CAOO,SAASC,GAA2BC,EAAWC,EAAUzD,EAAMe,EAAQ,CAC5E,IAAI2C,EAAY5D,GAA8B2D,EAAS1C,CAAM,EAAE,CAAC,EAAGf,EAAMe,CAAM,EAC3E4C,EAAY7D,GAA8B2D,EAAS1C,CAAM,EAAE,CAAC,EAAGf,EAAMe,CAAM,EAC/EyC,EAAUrD,GAAGY,CAAM,CAAC,EAAIyC,EAAUI,GAAG7C,CAAM,CAAC,EAAI,IAC5C2C,GAAaC,IACfH,EAAUrD,GAAGY,CAAM,CAAC,EAAI2C,EAAU,GAClCF,EAAUI,GAAG7C,CAAM,CAAC,EAAI4C,EAAU,GAAKA,EAAU,GAAKD,EAAU,GAEpE,CA6BO,SAASG,GAAcvD,EAAKS,EAEnC+C,EAAgBC,EAAiB,CAC/B,OAAAzD,EAAIH,GAAGY,CAAM,CAAC,EAAI+C,EAClBxD,EAAIH,GAAG,EAAIY,CAAM,CAAC,EAAIgD,EACfzD,CACT,CAIA,SAAS0B,IAAwBgC,EAAgB,CAC/C,OAAOA,IAAmBA,EAAe,OAASpE,GAAyB,MAAQoE,EAAe,OAASpE,GAAyB,SAAWoE,EAAiB,IAClK,CACO,SAASC,IAAoB,CAClC,MAAO,CACL,EAAG,IACH,EAAG,IACH,MAAO,IACP,OAAQ,GACV,CACF,CC/OA,IAAIC,IAAyB,UAAY,CACvC,SAASA,EAAUC,EAAKC,EAAU,CAQhC,KAAK,OAAS,CAAC,EAGf,KAAK,QAAU,CAAC,EAChB,KAAK,IAAMD,EACX,KAAK,OAASA,IAAQ,IAAM,EAAI,EAChC,KAAK,OAASC,EACd,KAAK,gBAAkBC,IAA2BF,CAAG,EACrD,IAAIG,EAAeF,EAAS,IAAI,OAAQ,EAAI,EACxCE,GAAgB,MAAQ,CAACC,EAAQD,CAAY,IAI/CA,EAAe,CAAC,GAEdA,EACF,KAAK,oBAAoBA,CAAY,EAErC,KAAK,kBAAkB,CAE3B,CACA,OAAAJ,EAAU,UAAU,oBAAsB,SAAUI,EAAc,CAChE,IAAIE,EAAO,KACPC,EAASD,EAAK,OACdE,EAAUF,EAAK,QACfG,EAAwB,CAAC,EACzBC,EAAa,EACjBJ,EAAK,aAAeK,EAAkBP,EAAc,EAAG,CAAC,EACxDQ,EAAc,EACd,OACA,SAASD,EAAkBP,EAAcS,EAAkBC,EAAO,CAChE,IAAIC,EAAY,EAChB,OAAKX,GAGLY,EAAKZ,EAAc,SAAUa,EAAQC,EAAW,CAC9C,IAAIC,EAAgB,GAChBC,EACAC,GAASJ,CAAM,EACjBG,EAAa,CACX,MAAOH,CACT,EACSK,GAASL,CAAM,GACxBG,EAAaH,EACTA,EAAO,OAAS,MAAQ,CAACI,GAASJ,EAAO,KAAK,IAChDE,EAAgB,GAChBC,EAAa,CACX,MAAO,IACT,KAGFA,EAAa,CACX,MAAO,IACT,EACIH,GAAU,OACZE,EAAgB,KAQpB,IAAII,EAAO,CACT,KAAMC,GAAyB,QAC/B,QAAS,IACT,MAAOV,EACP,iBAAkBD,EAClB,GAAI,IAAIY,GACR,KAAMC,GAAc,IAAID,GAASnB,EAAK,OAAQ,EAAG,CAAC,EAClD,OAAQc,EACR,GAAI,IACJ,GAAI,IACJ,IAAKd,EACL,KAAMqB,GAAkB,CAC1B,EACAjB,KACCD,EAAsBI,CAAgB,IAAMJ,EAAsBI,CAAgB,EAAI,CAAC,IAAI,KAAKU,CAAI,EAChGf,EAAQM,CAAK,IAEhBN,EAAQM,CAAK,EAAI,CACf,KAAMU,GAAyB,MAC/B,GAAI,IACJ,GAAI,IACJ,OAAQ,KACR,GAAI,IAAIC,GACR,IAAKnB,CACP,GAEF,IAAIsB,EAAejB,EAAkBS,EAAW,SAAUP,EAAkBC,EAAQ,CAAC,EACjFe,EAAU,KAAK,IAAI,EAAGD,CAAY,EACtCL,EAAK,KAAKO,GAAGxB,EAAK,MAAM,CAAC,EAAIuB,EAC7Bd,GAAac,EACbhB,GAAoBgB,CACtB,CAAC,EACMd,CACT,CACA,SAASH,GAAgB,CAIvB,QADImB,EAAa,CAAC,EACXxB,EAAO,OAASG,GACrB,QAASsB,EAAU,EAAGA,EAAUvB,EAAsB,OAAQuB,IAAW,CACvE,IAAIT,EAAOd,EAAsBuB,CAAO,EAAE,IAAI,EAC9C,GAAIT,EAAM,CACRA,EAAK,QAAUQ,EAAW,OAC1B,IAAIE,EAAMV,EAAK,OAAO,MACtBQ,EAAW,KAAKE,CAAG,EACnB1B,EAAO,KAAKgB,CAAI,EAChBjB,EAAK,gBAAgB,YAAY2B,CAAG,CACtC,CACF,CAEF3B,EAAK,gBAAgB,kBAAkByB,EAAYxB,CAAM,EACzD,IAAI2B,EAAc5B,EAAK,aAAe,IAAI6B,GAAY,CACpD,WAAYJ,EACZ,YAAa,GACb,cAAe,EACjB,CAAC,EACDzB,EAAK,OAAS,IAAI8B,GAAQ,CACxB,YAAaF,CACf,CAAC,EACD,QAASG,EAAM,EAAGA,EAAM/B,EAAK,aAAc+B,IAAO,CAChD,IAAIC,EAAOhC,EAAK,OAAO+B,CAAG,EAC1BC,EAAK,KAAOd,GAAyB,KAErCc,EAAK,KAAKR,GAAG,EAAIxB,EAAK,MAAM,CAAC,EAAIA,EAAK,QAAQ,OAASgC,EAAK,KAC9D,CACAhC,EAAK,aAAa,EAClBA,EAAK,oBAAoB,CAC3B,CACF,EACAN,EAAU,UAAU,kBAAoB,UAAY,CAClD,IAAIM,EAAO,KACXA,EAAK,aAAe,EACpBA,EAAK,QAAU,CAAC,CACd,KAAMkB,GAAyB,MAC/B,GAAI,IACJ,GAAI,IACJ,OAAQ,KACR,GAAI,IAAIC,GACR,IAAKnB,CACP,CAAC,EACDA,EAAK,oBAAoB,EACzB,IAAI4B,EAAc5B,EAAK,aAAe,IAAI6B,GAAY,CACpD,YAAa,GACb,cAAe,GACf,UAAW,SAAUI,EAAOC,EAAe,CACzC,IAAIjB,EAAOjB,EAAK,OAAOkC,CAAa,EAAI,CACtC,KAAMhB,GAAyB,KAC/B,QAASgB,EACT,MAAO,EACP,iBAAkBA,EAClB,GAAI,IAAIf,GACR,KAAMC,GAAc,IAAID,GAASnB,EAAK,OAAQ,EAAG,CAAC,EAIlD,OAAQ,CACN,MAAOiC,EAAQ,EACjB,EACA,GAAI,IACJ,GAAI,IACJ,IAAKjC,EACL,KAAMqB,GAAkB,CAC1B,EACArB,EAAK,eACLA,EAAK,WAAWiB,CAAI,CACtB,CACF,CAAC,EACDjB,EAAK,OAAS,IAAI8B,GAAQ,CACxB,YAAaF,CACf,CAAC,CACH,EACAlC,EAAU,UAAU,WAAa,SAAUuB,EAAM,CAC/C,IAAIkB,EAAY,KAAK,QAAQ,OACzBC,EAAS,KAAK,OAClBhB,GAAcH,EAAK,GAAImB,EAAQnB,EAAK,iBAAkBA,EAAK,MAAQkB,CAAS,CAC9E,EACAzC,EAAU,UAAU,aAAe,UAAY,CAC7C,IAAIyC,EAAY,KAAK,QAAQ,OACzBC,EAAS,KAAK,OAClB1B,EAAK,KAAK,OAAQ,SAAUO,EAAM,CAChCG,GAAcH,EAAK,GAAImB,EAAQnB,EAAK,iBAAkBA,EAAK,MAAQkB,CAAS,CAC9E,CAAC,CACH,EACAzC,EAAU,UAAU,oBAAsB,UAAY,CACpD,IAAIyC,EAAY,KAAK,QAAQ,OACzBC,EAAS,KAAK,OACdC,EAAkB,KAAK,OAAO,IAAI,SAAU,EAAI,EACpDA,EAAkBtC,EAAQsC,CAAe,EAAIA,EAAkB,CAAC,EAChE3B,EAAK,KAAK,QAAS,SAAU4B,EAAU9B,EAAO,CAC5CY,GAAckB,EAAS,GAAIF,EAAQ,EAAG5B,EAAQ2B,CAAS,EACvDG,EAAS,OAASD,EAAgB7B,CAAK,CACzC,CAAC,CACH,EACAd,EAAU,UAAU,WAAa,UAAY,CAC3C,MAAO,CAAC,CAAC,KAAK,OAAO,WAAW,OAAQ,EAAI,CAC9C,EAKAA,EAAU,UAAU,oBAAsB,SAAU6C,EAAIH,EAAQI,EAAcC,EAAO,CAEnF,GADAF,EAAKA,GAAM,IAAIG,GACXN,IAAW,KAAK,OAAQ,CAC1B,IAAIO,EAAM,KAAK,aACXC,EAAWJ,GAAgB,KAAO,KAAK,IAAI,EAAGA,CAAY,EAAI,EAClEC,EAAQA,GAAS,KAAO,KAAK,IAAIA,EAAOE,CAAG,EAAIA,EAC/CJ,EAAG,MAAM,KAAK,OAAQK,EAAUA,EAAWH,CAAK,CAClD,KAAO,CACL,IAAIE,EAAM,KAAK,QAAQ,OAEnBC,EAAWJ,GAAgB,KAAO,KAAK,IAAI,EAAGA,EAAeG,CAAG,EAAI,EACxEF,EAAQA,GAAS,KAAO,KAAK,IAAIA,EAAOE,CAAG,EAAIA,EAC/CJ,EAAG,MAAM,KAAK,QAASK,EAAUA,EAAWH,CAAK,CACnD,CACA,OAAOF,CACT,EACA7C,EAAU,UAAU,kBAAoB,SAAU6C,EAAI,CACpD,OAAQA,GAAM,IAAIG,IAAgB,MAAM,KAAK,OAAQ,CAAC,CACxD,EACAhD,EAAU,UAAU,mBAAqB,SAAU6C,EAAI,CACrD,OAAQA,GAAM,IAAIG,IAAgB,MAAM,KAAK,QAAS,CAAC,CACzD,EACAhD,EAAU,UAAU,UAAY,SAAUmD,EAAST,EAAQV,EAAS,CAClE,IAAIoB,EAAS,KAAK,kBAAkBV,EAAQV,CAAO,EACnDmB,EAAQrB,GAAGY,CAAM,CAAC,EAAIU,EAASA,EAAO,GAAK,IAC3CD,EAAQE,GAAGX,CAAM,CAAC,EAAIU,EAASA,EAAO,GAAK,GAC7C,EAKApD,EAAU,UAAU,kBAAoB,SAAU0C,EAAQV,EAAS,CACjE,OAAOU,IAAW,KAAK,OAASV,EAAU,KAAK,aAAe,KAAK,OAAOA,CAAO,EAAI,OAAY,KAAK,QAAQA,EAAU,KAAK,QAAQ,MAAM,CAC7I,EAIAhC,EAAU,UAAU,QAAU,SAAUuC,EAAO,CAC7C,IAAIe,EAAU,KAAK,OAAO,MAAMf,CAAK,EACrC,OAAOgB,GAAMD,CAAO,EAAI,OAAY,KAAK,OAAOA,CAAO,CACzD,EAIAtD,EAAU,UAAU,gBAAkB,SAAU0C,EAAQ,CACtD,OAAOA,IAAW,KAAK,OAAS,KAAK,aAAe,KAAK,QAAQ,MACnE,EACA1C,EAAU,UAAU,eAAiB,UAAY,CAC/C,OAAO,KAAK,YACd,EACOA,CACT,GAAE,EAEF,SAASwD,IAA2BC,EAAK,CACvC,IAAIC,EAAWD,EAAI,YAAY,EAC3BE,EAAgB,IAAI,OAAO,IAAMD,EAAW,WAAW,EACvDE,EAAU,EACd,SAASC,EAAYC,EAAK,CACxB,IAAIC,EACAD,GAAO,OAASC,EAAcD,EAAI,MAAMH,CAAa,KACvDC,EAAUI,GAAQJ,EAAS,CAACG,EAAY,CAAC,EAAI,CAAC,EAElD,CACA,SAASE,GAAkB,CACzB,MAAO,GAAKP,EAAWE,GACzB,CAKA,SAASM,EAAkBC,EAAYC,EAAO,CAI5C,QADIC,EAAUC,GAAc,EACnBC,EAAM,EAAGA,EAAMJ,EAAW,OAAQI,IAAO,CAChD,IAAIC,EAAQL,EAAWI,CAAG,GAEtBC,GAAS,MAAQH,EAAQ,IAAIG,CAAK,GAAK,QAEzCL,EAAWI,CAAG,EAAIC,EAAQP,EAAgB,EAC1CG,EAAMG,CAAG,EAAE,OAASE,GAAS,CAC3B,MAAOD,CACT,EAAGJ,EAAMG,CAAG,EAAE,MAAM,GAEtBF,EAAQ,IAAIG,EAAO,EAAI,CACzB,CACF,CACA,MAAO,CACL,YAAaX,EACb,kBAAmBK,CACrB,CACF,CCpTA,IAAIQ,IAAgC,UAAY,CAC9C,SAASA,EAAiBC,EAAMC,EAAmBC,EAAM,CACvD,KAAK,OAASD,EACd,KAAK,MAAQC,EACb,KAAK,MAAQF,EACb,KAAK,oBAAsB,CAAC,CAC9B,CAKA,OAAAD,EAAiB,UAAU,eAAiB,UAAY,CACtD,IAAII,EAAO,KACPC,EAAWD,EAAK,SACpB,OAAKC,IACHA,EAAWD,EAAK,SAAWE,GAAc,EACzCC,EAAY,GAEPF,EACP,SAASE,GAAc,CACrB,IAAIC,EAAa,CAAC,EACdC,EAAiBL,EAAK,OAAO,WAAW,MAAM,EAC9CK,GAAkB,CAACC,EAAQD,CAAc,IAI3CA,EAAiB,MAEnBE,EAAKF,EAAgB,SAAUG,EAAQC,EAAK,CAC1C,GAAI,GAACC,GAASF,CAAM,GAAK,CAACF,EAAQE,EAAO,KAAK,GAM9C,KAAIG,EAAeC,GAAoB,CAAC,CAAC,EACrCC,EAAY,KAKhB,GADAC,GAAsBH,EAAcE,EAAWL,EAAO,MAAOR,EAAK,MAAOQ,EAAO,WAAaO,GAAkBf,EAAK,KAAK,EAAIe,GAAkB,IAAI,EAC/I,EAAAC,GAA6BL,EAAc,CAAC,GAAKK,GAA6BL,EAAc,CAAC,GAMjG,KAAIM,EAAiBT,GAAUA,EAAO,WAClCU,EAAS,CACX,GAAI,IAAIC,GACR,KAAM,IAAIA,GACV,aAAcR,EACd,OAAQH,EACR,eAAgBS,CAClB,EACAG,GAA2BF,EAAQP,CAAY,EAI/CP,EAAW,KAAKc,CAAM,GACxB,CAAC,EAGD,QADIG,EAAiB,CAAC,EACbC,EAAY,EAAGA,EAAYlB,EAAW,OAAQkB,IAAa,CAClE,IAAIJ,EAASd,EAAWkB,CAAS,EACjC,GAAKJ,EAAO,eAGZ,KAAIP,EAAeO,EAAO,aAC1BK,GAAiCZ,EAAcU,EAAgBjB,EAAYkB,CAAS,EACpF,QAASb,EAAM,EAAGA,EAAMa,EAAWb,IAC7BY,EAAeZ,CAAG,IACpBL,EAAWK,CAAG,EAAE,eAAiB,IAGrC,GAAIE,EAAa,CAAC,EAAE,CAAC,IAAMO,EAAO,GAAG,GAAKP,EAAa,CAAC,EAAE,CAAC,IAAMO,EAAO,GAAG,EAAG,CAE5EA,EAAO,eAAiB,GAGxB,IAAIM,EAAYC,EAAO,CAAC,EAAGP,EAAO,MAAM,EACxCM,EAAU,MAAQ,KAClB,IAAIE,EAAY,CACd,GAAI,IAAIP,GACR,KAAM,IAAIA,GACV,aAAcR,EACd,OAAQa,EACR,eAAgB,EAClB,EACAJ,GAA2BM,EAAWf,CAAY,EAClDP,EAAW,KAAKsB,CAAS,CAC3B,EACF,CAEAnB,EAAKH,EAAY,SAAUc,EAAQ,CACjC,IAAIS,EAAcC,EAAuBV,EAAO,GAAG,EAAGA,EAAO,GAAG,CAAC,EAQjE,GAPIA,EAAO,iBACTS,EAAY,eAAiB,GAC7BA,EAAY,KAAOT,EAAO,KAC1BS,EAAY,aAAeT,EAAO,aAClCS,EAAY,SAAWE,GAAkB,EACzC7B,EAAK,oBAAoB,KAAK2B,CAAW,GAEvC,GAACT,EAAO,gBAAkB,CAACA,EAAO,QAGtC,QAASY,EAAO,EAAGA,EAAOZ,EAAO,KAAK,EAAGY,IACvC,QAASC,EAAO,EAAGA,EAAOb,EAAO,KAAK,EAAGa,IAAQ,CAC/C,IAAIC,EAAOJ,EAAuBV,EAAO,GAAG,EAAIa,EAAMb,EAAO,GAAG,EAAIY,CAAI,EAExEE,EAAK,OAASd,EAAO,OACjBA,EAAO,iBACTc,EAAK,SAAWL,EAEpB,CAEJ,CAAC,CACH,CACA,SAASC,EAAuBK,EAAGC,EAAG,CACpC,IAAIC,EAAMC,IAAeH,EAAGC,CAAC,EACzBF,EAAO/B,EAAS,IAAIkC,CAAG,EAC3B,OAAKH,IACHA,EAAO/B,EAAS,IAAIkC,EAAK,CACvB,GAAI,IAAIhB,GAAMc,EAAGC,CAAC,EAClB,OAAQ,KACR,SAAU,KACV,KAAM,KACN,SAAU,KACV,aAAc,KACd,eAAgB,EAClB,CAAC,GAEIF,CACT,CACF,EAOApC,EAAiB,UAAU,QAAU,SAAUyC,EAAI,CAEjD,OAAO,KAAK,eAAe,EAAE,IAAID,IAAeC,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAAC,CAC/D,EAIAzC,EAAiB,UAAU,oBAAsB,SAAU0C,EAAI,CAC7D,KAAK,eAAe,EAAE,KAAKA,CAAE,CAC/B,EAIA1C,EAAiB,UAAU,uBAAyB,SAAUe,EAAc,CAC1E,GAAI,CAACK,GAA6BL,EAAc,CAAC,GAAK,CAACK,GAA6BL,EAAc,CAAC,GAAKA,EAAa,CAAC,EAAE,CAAC,IAAMA,EAAa,CAAC,EAAE,CAAC,GAAKA,EAAa,CAAC,EAAE,CAAC,IAAMA,EAAa,CAAC,EAAE,CAAC,EAAG,CAG9L4B,GAAiB,CAAC,EAAI5B,EAAa,CAAC,EAAE,CAAC,EACvC4B,GAAiB,CAAC,EAAI5B,EAAa,CAAC,EAAE,CAAC,EACvC,IAAIqB,EAAO,KAAK,QAAQO,EAAgB,EACpCC,EAAWR,GAAQA,EAAK,SAC5B,GAAIQ,EAAU,CACZC,IAAoB9B,EAAc6B,EAAS,YAAY,EACvD,MACF,CACF,CACA,IAAIE,EAAO,KAAK,oBAChBnB,GAAiCZ,EAAc,KAAM+B,EAAMA,EAAK,MAAM,CACxE,EACO9C,CACT,GAAE,EAEF,IAAI+C,GAAmB,CAAC,EACxB,SAASC,IAAeC,EAAGC,EAAG,CAC5B,OAAOD,EAAI,IAAMC,CACnB,CCjLA,IAAIC,GAAqB,CACvB,KAAM,GACN,MAAOC,EAAO,MAAM,UAEpB,SAAU,QACV,aAAc,WACd,QAAS,CAAC,EAAG,EAAG,EAAG,CAAC,EAEpB,SAAU,CACZ,EACA,SAASC,GAA+BC,EAAU,CAChD,MAAO,CACL,MAAO,OACP,YAAa,EACb,YAAaA,EAAW,OAASF,EAAO,MAAM,UAChD,CACF,CAEA,IAAIG,IAAmB,CACrB,KAAM,GACN,MAAOJ,GACP,UAAWE,GAA+B,EAAK,EAC/C,OAAQ,OACR,iBAAkB,CAChB,MAAO,EACP,MAAOD,EAAO,MAAM,MACtB,CACF,EACII,IAAoB,CACtB,MAAOL,GACP,UAAWE,GAA+B,EAAK,EAC/C,OAAQ,MACV,EACII,IAAsB,CACxB,MAAON,GACP,UAAWE,GAA+B,EAAI,EAC9C,OAAQ,MACV,EACIK,IAAsB,CAGxB,EAAG,IACH,KAAM,MACN,IAAK,MACL,MAAO,MACP,OAAQ,MACR,EAAGH,IACH,EAAGA,IACH,KAAMC,IACN,OAAQC,IACR,gBAAiB,CACf,MAAO,OACP,YAAaL,EAAO,MAAM,SAC1B,YAAa,CACf,CACF,EACIO,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KAClBG,CACT,CACA,OAAAH,EAAY,UAAU,cAAgB,UAAY,CAEhD,IAAII,EAAY,KAAK,WAAa,CAEhC,EAAG,IAAIC,IAAqB,KAAK,IAAI,IAAK,EAAI,GAAK,CAAC,CAAC,EACrD,EAAG,IAAIA,IAAqB,KAAK,IAAI,IAAK,EAAI,GAAK,CAAC,CAAC,CACvD,EACAD,EAAU,EAAE,OAAO,KAAOA,EAAU,EAAE,OAAO,KAAO,WACpD,IAAIE,EAAOF,EAAU,EAAE,IAAM,IAAIG,GAAU,IAAKH,EAAU,CAAC,EACvDI,EAAOJ,EAAU,EAAE,IAAM,IAAIG,GAAU,IAAKH,EAAU,CAAC,EACvDK,EAAO,CACT,EAAGH,EACH,EAAGE,CACL,EACA,KAAK,MAAQ,IAAIE,GAAiB,OAAQ,IAAIC,GAAM,KAAK,WAAW,MAAM,CAAC,EAAGF,CAAI,EAClF,KAAK,QAAU,IAAIC,GAAiB,SAAU,IAAIC,GAAM,KAAK,WAAW,QAAQ,CAAC,EAAGF,CAAI,CAC1F,EACAT,EAAY,UAAU,kBAAoB,SAAUY,EAAK,CACvD,OAAO,KAAK,WAAWA,CAAG,CAC5B,EACAZ,EAAY,UAAU,QAAU,UAAY,CAC1C,OAAO,KAAK,KACd,EACAA,EAAY,UAAU,UAAY,UAAY,CAC5C,OAAO,KAAK,OACd,EACAA,EAAY,KAAO,SACnBA,EAAY,WAAa,MACzBA,EAAY,cAAgBD,IACrBC,CACT,GAAEa,EAAc,EACZR,KAAoC,SAAUJ,EAAQ,CACxDC,EAAUG,EAAsBJ,CAAM,EACtC,SAASI,GAAuB,CAC9B,OAAOJ,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAI,EAAqB,UAAU,eAAiB,UAAY,CAC1D,OAAO,KAAK,IAAI,eAAe,CACjC,EACOA,CACT,GAAEM,EAAK,EAEP,IAAOG,IAAQC,ICpGf,IAAIC,GAAQ,KAAK,MACbC,IAAgB,EAChBC,IAAkB,GAClBC,IAA8B,CAChC,OAAQ,GACR,QAAS,GACX,EACIC,IAA4B,CAC9B,OAAQ,GACR,QAAS,GACX,EACIC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KACjBG,CACT,CACA,OAAAH,EAAW,UAAU,OAAS,SAAUI,EAAaC,EAAS,CAC5D,KAAK,MAAM,UAAU,EACrB,IAAIC,EAAQ,KAAK,MACbC,EAAWH,EAAY,iBACvBI,EAAOD,EAAS,QAAQ,EACxBE,EAAYL,EAAY,kBAAkB,GAAG,EAC7CM,EAAYN,EAAY,kBAAkB,GAAG,EAC7CO,EAAOF,EAAU,IACjBG,EAAOF,EAAU,IAGrBG,IAAqBP,EAAOF,EAAaC,CAAO,EAChDS,IAAoBR,EAAOF,EAAaO,EAAMC,EAAMP,CAAO,EAC3D,IAAIU,EAAiBX,EAAY,WAAW,WAAY,EAAI,EACxDY,EAAgBC,GAAUF,EAAgBlB,GAAe,EACzDqB,EAAgBF,EAAgB,EAMhCG,EAAUf,EAAY,SAAS,iBAAiB,EAAE,aAAa,CAAC,aAAa,CAAC,EAClFe,EAAQ,UAAY,EACpB,IAAIC,EAAchB,EAAY,SAAS,iBAAiB,EAAE,aAAa,CAAC,QAAS,QAAS,cAAe,aAAc,gBAAiB,eAAe,CAAC,EACxJgB,EAAY,KAAO,OACnB,IAAIC,EAASC,GAAiBd,EAAK,MAAM,EAAGW,EAASvB,GAAa,EAC9D2B,EAAaD,GAAiBd,EAAK,MAAM,EAAGY,EAAaJ,CAAa,EAC1EK,EAAO,OAAS,GAChBE,EAAW,OAAS,GACpBjB,EAAM,IAAIe,CAAM,EAChBf,EAAM,IAAIiB,CAAU,EAEpB,IAAIC,EAAYb,EAAK,kBAAkB,EAAG,CAAC,EACvCc,EAAYb,EAAK,kBAAkB,EAAG,CAAC,EACvCY,GAAaC,IACXd,EAAK,WAAW,GAClBL,EAAM,IAAIoB,IAAiB,CACzB,GAAIlB,EAAK,EACT,GAAIiB,EAAU,GACd,GAAIjB,EAAK,EAAIA,EAAK,MAClB,GAAIiB,EAAU,EAChB,EAAGhB,EAAU,SAAS,kBAAkB,EAAE,aAAa,EAAGS,CAAa,CAAC,EAEtEN,EAAK,WAAW,GAClBN,EAAM,IAAIoB,IAAiB,CACzB,GAAIF,EAAU,GACd,GAAIhB,EAAK,EACT,GAAIgB,EAAU,GACd,GAAIhB,EAAK,EAAIA,EAAK,MACpB,EAAGE,EAAU,SAAS,kBAAkB,EAAE,aAAa,EAAGQ,CAAa,CAAC,EAG9E,EACAlB,EAAW,KAAO,SACXA,CACT,GAAE2B,EAAa,EACf,SAASd,IAAqBP,EAAOF,EAAaC,EAAS,CACzDuB,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnB,SAASA,EAAkBC,EAAQ,CACjC,IAAIC,EAAe1B,EAAY,kBAAkB2B,GAAGF,CAAM,CAAC,EACvDG,EAAUF,EAAa,IAC3B,GAAKE,EAAQ,WAAW,EAOxB,QAJIC,EAAsBH,EAAa,SAAS,WAAW,EACvDI,EAAoBJ,EAAa,SAAS,OAAO,EACjDK,EAAgB/B,EAAY,WAAW,UAAW,EAAI,EACtDgC,EAAY,CAAC,EACRC,EAAOL,EAAQ,kBAAkB,EAAGK,EAAK,KAAK,GAAI,CACzD,IAAIC,EAAUD,EAAK,KACfE,EAAQ,CAAC,EACbC,GAAa,KAAKD,EAAOD,EAAQ,IAAI,EAC1BG,GAAIL,EAAWE,EAAQ,GAAG,EAAGA,EAAQ,GAAG,CAAC,EACpDI,IAAiBN,EAAWhC,EAAaE,EAAOD,EAASiC,EAAQ,OAAQL,EAAqBC,EAAmBJ,EAAcS,EAAOD,EAAQ,OAAO,MAAOvC,IAA2BoC,CAAa,CACtM,CACF,CACF,CACA,SAASrB,IAAoBR,EAAOF,EAAaO,EAAMC,EAAMP,EAAS,CACpEsC,EAAwB,OAAQvC,EAAY,QAAQ,EAAGO,EAAMC,CAAI,EAC7DD,EAAK,WAAW,GAAKC,EAAK,WAAW,GACvC+B,EAAwB,SAAUvC,EAAY,UAAU,EAAGQ,EAAMD,CAAI,EAEvE,SAASgC,EAAwBC,EAAsBC,EAAcC,EAErEC,EAAc,CAEZ,IAAIC,EAAkB,IAAIC,GAAM7C,EAAY,WAAWwC,EAAsB,EAAI,CAAC,EAC9EM,EAAuBF,EAAgB,SAAS,WAAW,EAC3DG,EAAmBH,EAAgB,SAAS,OAAO,EACnDI,EAAM,IAAIC,GACVC,EAAM,IAAID,GACVjB,EAAY,CAAC,EACbD,EAAgB/B,EAAY,WAAW,UAAW,EAAI,EAC1D,IAAK2C,EAAa,oBAAoBO,EAAK,CAAC,EAAGA,EAAI,KAAK,GACtD,IAAKR,EAAa,oBAAoBM,EAAK,CAAC,EAAGA,EAAI,KAAK,GAAI,CAC1D,IAAIG,EAAUH,EAAI,KACdI,EAAUF,EAAI,KACPb,GAAIL,EAAWmB,EAAQ,GAAG,EAAGC,EAAQ,GAAG,CAAC,EACpD,IAAIC,EAAiBZ,EAAa,QAAQT,CAAS,EAEnD,GAAI,EAAAqB,GAAkBA,EAAe,UAAYA,EAAe,WAAaA,GAG7E,KAAIlB,EAAQ,CAAC,EACTkB,GAAkBA,EAAe,KACnCjB,GAAa,KAAKD,EAAOkB,EAAe,QAAQ,GAEhDF,EAAQ,IAAI,UAAUhB,EAAO,EAAGH,EAAU,CAAC,CAAC,EAC5CoB,EAAQ,IAAI,UAAUjB,EAAO,EAAGH,EAAU,CAAC,CAAC,GAE9C,IAAIsB,EAAuBD,EAAiBA,EAAe,OAAS,KACpEf,IAAiBN,EAAWhC,EAAaE,EAAOD,EAASqD,EAAsBR,EAAsBC,EAAkBH,EAAiBT,EAAOmB,EAAuBA,EAAqB,MAAQ,KAAM5D,IAA6BqC,CAAa,EACrP,CAEJ,CACF,CACA,SAASO,IAAiBN,EAAWhC,EAAaE,EAAOD,EAASsD,EAAYT,EAAsBC,EAAkBH,EAAiBT,EAAOqB,EAAWC,EAAe1B,EAAe,CACrL,IAAI2B,EAEJC,GAAuB,OAASJ,EAAaA,EAAW,UAAY,KACpEI,GAAuB,YAAcb,EACrCc,GAAc,OAASL,EACvBK,GAAc,YAAchB,EAE5B,IAAIiB,EAAKhD,GAAU+C,GAAc,WAAW,IAAI,EAAGL,GAAcA,EAAW,UAAYE,EAAc,QAAUA,EAAc,MAAM,EAChIK,EAAoB/B,GAAiBA,EAAc,KACnDgC,EAAW7C,GAAiBiB,EAAOwB,GAAuB,aAAa,EAAGE,CAAE,EAChF3D,EAAM,IAAI6D,CAAQ,EAClB,IAAIC,EAAeJ,GAAc,IAAI,QAAQ,EACzCI,GAAgB,MAClBD,EAAS,KAAK,SAAUC,CAAY,EAEtC,IAAIC,EACJ,GAAIT,GAAa,KAAM,CACrB,IAAIU,EAAOV,EAAY,GAiBvB,GAhBAW,GAAmB,OAASZ,EAAaA,EAAW,MAAQ,KAC5DY,GAAmB,YAAcpB,EAEjCoB,GAAmB,QAAUlE,EAC7BmE,GAAcL,EAEd,CACE,OAAQI,EACV,EAAG,CACD,YAAaD,EACb,iBAAkB,GAGlB,WAAYG,GAAMN,EAAS,KAAK,CAClC,CAAC,EACDE,EAAWF,EAAS,eAAe,EAC/BE,EAAU,CACZA,EAAS,GAAKJ,EAAK,EACnB,IAAIS,EAAQL,EAAS,MACrB,GAAIK,GAASA,EAAM,UAAYA,EAAM,WAAa,QAAUA,EAAM,aAAc,CAG9E,IAAIC,EAAY,CAAC,EACjBnC,GAAa,KAAKmC,EAAWpC,CAAK,EAElCqC,GAAmBD,KAAcb,EAAKK,EAAS,SAAW,MAAQL,IAAO,OAAS,OAASA,EAAG,YAAc,GAAK,EAAG,GAAM,EAAI,EAC9HK,EAAS,gBAAgB,EACzBE,EAAS,kBAAkBQ,EAAkB,EAC7CC,GAAOD,GAAoBA,EAAkB,EAC7CrC,GAAa,eAAemC,EAAWA,EAAWE,EAAkB,EACpER,EAAS,YAAY,IAAIU,GAAK,CAC5B,MAAOJ,CACT,CAAC,CAAC,CACJ,CACF,CACAK,GAAiB,CACf,GAAIb,EACJ,eAAgB/D,EAChB,SAAUkE,EACV,kBAAmBnC,EACnB,qBAAsB,CACpB,UAAWC,EAAU,MAAM,CAC7B,CACF,CAAC,CACH,CAEA,GAAIiC,EAAU,CACZ,IAAIY,EAAcV,GAAmB,IAAI,QAAQ,EAG7CU,GAAe,OACjBA,EAAc,CAACf,GAEjBG,EAAS,OAASY,EAClBZ,EAAS,iBAAmB,EAC9B,CACA,IAAIa,EAAalB,GAAc,IAAI,QAAQ,EACvCkB,GAAc,OAChBA,EAGA,CAACf,EAAS,OAASA,EAAS,MAAM,OAAS,QAAU,CAACA,EAAS,MAAM,MAEvEA,EAAS,OAASe,EAClBC,GAAcnB,EAAa,EAC3BmB,GAAcpB,EAAsB,EACpCoB,GAAcZ,EAAkB,CAClC,CACA,IAAIP,GAAgB,IAAIf,GACpBc,GAAyB,IAAId,GAC7BsB,GAAqB,IAAItB,GACzB4B,GAAqB,CAAC,EAI1B,SAASvD,GAAiBiB,EAAOmC,EAAOT,EAAI,CAG1C,IAAImB,EAAYV,EAAM,UACtB,GAAIU,EAAW,CACb,IAAIC,EAAa9C,EAAM,EAAIA,EAAM,MAC7B+C,EAAa/C,EAAM,EAAIA,EAAM,OACjCA,EAAM,EAAIgD,GAAiBhD,EAAM,EAAG6C,EAAW,EAAI,EACnD7C,EAAM,EAAIgD,GAAiBhD,EAAM,EAAG6C,EAAW,EAAI,EACnD7C,EAAM,MAAQgD,GAAiBF,EAAYD,EAAW,EAAI,EAAI7C,EAAM,EACpEA,EAAM,OAASgD,GAAiBD,EAAYF,EAAW,EAAI,EAAI7C,EAAM,CACvE,CACA,OAAO,IAAIwC,GAAK,CACd,MAAOxC,EACP,MAAOmC,EACP,GAAIT,CACN,CAAC,CACH,CACA,SAASvC,IAAiBa,EAAOmC,EAAOT,EAAI,CAC1C,IAAImB,EAAYV,EAAM,UACtB,OAAIU,IACEzF,GAAM4C,EAAM,GAAK,CAAC,IAAM5C,GAAM4C,EAAM,GAAK,CAAC,IAC5CA,EAAM,GAAKA,EAAM,GAAKgD,GAAiBhD,EAAM,GAAI6C,EAAW,EAAI,GAE9DzF,GAAM4C,EAAM,GAAK,CAAC,IAAM5C,GAAM4C,EAAM,GAAK,CAAC,IAC5CA,EAAM,GAAKA,EAAM,GAAKgD,GAAiBhD,EAAM,GAAI6C,EAAW,EAAI,IAG7D,IAAII,GAAK,CACd,MAAOjD,EACP,MAAOmC,EACP,OAAQ,GACR,GAAIT,CACN,CAAC,CACH,CACA,IAAOwB,IAAQzF,IC1Qf,IAAI0F,KAAsB,UAAY,CACpC,SAASA,EAAOC,EAAaC,EAASC,EAAK,CACzC,KAAK,WAAaH,EAAO,WACzB,KAAK,KAAO,SACZ,KAAK,OAASC,EACd,IAAIG,EAAS,KAAK,WAAa,CAC7B,EAAGH,EAAY,kBAAkB,GAAG,EACpC,EAAGA,EAAY,kBAAkB,GAAG,CACtC,EACA,KAAK,MAAQ,CACX,EAAGG,EAAO,EAAE,IACZ,EAAGA,EAAO,EAAE,GACd,EACA,KAAK,QAAQH,EAAaE,CAAG,CAC/B,CAOA,OAAAH,EAAO,kBAAoB,UAAY,CACrC,MAAO,CAAC,CACN,KAAM,IACN,KAAM,SACR,EAAG,CACD,KAAM,IACN,KAAM,SACR,EAAG,CACD,KAAM,OACR,CAAC,CACH,EACAA,EAAO,OAAS,SAAUE,EAASC,EAAK,CACtC,IAAIE,EAAa,CAAC,EAClB,OAAAH,EAAQ,cAAc,SAAU,SAAUD,EAAa,CACrD,IAAIK,EAAS,IAAIN,EAAOC,EAAaC,EAASC,CAAG,EACjDE,EAAW,KAAKC,CAAM,EACtBL,EAAY,iBAAmBK,CACjC,CAAC,EAIDJ,EAAQ,cAAc,SAAUK,EAAUC,EAAgB,CACxDC,GAAuB,CACrB,YAAaD,EACb,aAAc,SACd,iBAAkBE,EACpB,CAAC,CACH,CAAC,EACML,CACT,EACAL,EAAO,UAAU,QAAU,UAAY,CACrC,OAAO,KAAK,KACd,EACAA,EAAO,UAAU,QAAU,SAAUC,EAAaE,EAAK,CACrD,IAAIQ,EAAO,KAAK,MACZC,EAAY,KAAK,WACjBC,EAAO,KAAK,MAAQC,GAAcb,EAAY,mBAAmB,EAAG,CACtE,MAAOE,EAAI,SAAS,EACpB,OAAQA,EAAI,UAAU,CACxB,CAAC,EACDY,IAAuBH,EAAWD,EAAME,EAAM,CAAC,EAC/CE,IAAuBH,EAAWD,EAAME,EAAM,CAAC,EAC/CG,IAA6B,EAAGL,CAAI,EACpCK,IAA6B,EAAGL,CAAI,EACpCM,IAA0B,KAAK,OAAO,QAAQ,EAAGN,CAAI,EACrDM,IAA0B,KAAK,OAAO,UAAU,EAAGN,CAAI,CACzD,EASAX,EAAO,UAAU,YAAc,SAAUkB,EAAMC,EAAKC,EAAK,CACvD,OAAAA,EAAMA,GAAO,CAAC,EACd,KAAK,aAAaF,EAAMC,EAAKE,EAAmB,EAChDD,EAAI,CAAC,EAAIC,GAAoB,KAAK,EAAIA,GAAoB,KAAK,MAAQ,EACvED,EAAI,CAAC,EAAIC,GAAoB,KAAK,EAAIA,GAAoB,KAAK,OAAS,EACjED,CACT,EAgBApB,EAAO,UAAU,aAAe,SAAUkB,EAAMC,EAAKC,EAAK,CACxD,IAAIT,EAAO,KAAK,MAChBS,EAAMA,GAAO,CAAC,EACd,IAAIE,EAAUF,EAAI,KAAOA,EAAI,MAAQ,CAAC,EACtCE,EAAQ,EAAIA,EAAQ,EAAIA,EAAQ,MAAQA,EAAQ,OAAS,IACzD,IAAIC,EAAcH,EAAI,qBAAuBI,GAAoBJ,EAAI,oBAAoB,EACzF,OAAKK,EAAQP,CAAI,IAMjBQ,GAAsBH,EAAa,KAAML,EAAMP,EAAMgB,GAAUR,GAAOA,EAAI,MAAOS,GAAkB,IAAI,CAAC,GACpG,CAACT,GAAO,CAACA,EAAI,qBACX,CAACA,GAAOA,EAAI,QAAUS,GAAkB,SAC1C,KAAK,OAAO,QAAQ,EAAE,uBAAuBL,CAAW,GAEtD,CAACJ,GAAOA,EAAI,QAAUS,GAAkB,OAC1C,KAAK,OAAO,UAAU,EAAE,uBAAuBL,CAAW,GAG9DM,GAA2BP,EAASC,EAAaZ,EAAM,CAAC,EACxDkB,GAA2BP,EAASC,EAAaZ,EAAM,CAAC,GACjDS,CACT,EAkBApB,EAAO,UAAU,YAAc,SAAU8B,EAAOX,EAAKC,EAAK,CACxD,IAAIT,EAAO,KAAK,MAChB,OAAAoB,IAA4BC,GAAoB,EAAGrB,EAAMmB,EAAOX,GAAOA,EAAI,KAAK,EAChFY,IAA4BC,GAAoB,EAAGrB,EAAMmB,EAAOX,GAAOA,EAAI,KAAK,EAChFC,EAAMA,GAAO,CAAC,EACdA,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAI,IACdY,GAAmB,IAAMC,GAAuB,UAAYD,GAAmB,IAAMC,GAAuB,OAC9GC,IAA6BF,GAAoBZ,EAAK,EAAGT,CAAI,EACpDqB,GAAmB,IAAMC,GAAuB,UAAYD,GAAmB,IAAMC,GAAuB,OACrHC,IAA6BF,GAAoBZ,EAAK,EAAGT,CAAI,GAE7DwB,IAA6BH,GAAoBZ,EAAK,EAAGT,CAAI,EAC7DwB,IAA6BH,GAAoBZ,EAAK,EAAGT,CAAI,GAExDS,CACT,EACApB,EAAO,UAAU,eAAiB,SAAUE,EAASkC,EAAQC,EAAOlB,EAAK,CACvE,IAAImB,EAAWC,GAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYD,EAAOlB,CAAG,EAAI,MAChE,EACAnB,EAAO,UAAU,gBAAkB,SAAUE,EAASkC,EAAQC,EAAOlB,EAAK,CACxE,IAAImB,EAAWC,GAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,aAAaD,EAAOlB,CAAG,EAAI,MACjE,EACAnB,EAAO,UAAU,iBAAmB,SAAUE,EAASkC,EAAQI,EAAOrB,EAAK,CACzE,IAAImB,EAAWC,GAAYH,CAAM,EACjC,OAAOE,IAAa,KAAOA,EAAS,YAAYE,EAAOrB,CAAG,EAAI,MAChE,EACAnB,EAAO,UAAU,aAAe,SAAU8B,EAAO,CAC/C,OAAO,KAAK,MAAM,QAAQA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC9C,EACA9B,EAAO,WAAa,CAAC,IAAK,IAAK,OAAO,EAC/BA,CACT,GAAE,EACEqB,GAAsB,CACxB,KAAMoB,GAAkB,CAC1B,EACIC,GAAc,IAAIC,GAClBC,GAAgB,IAAID,GACxB,SAAS5B,IAAuBH,EAAWD,EAAMkC,EAAYC,EAAQ,CAQnE,QAPIC,EAAc,EAAID,EAClBE,EAAUrC,EAAKsC,GAAGH,CAAM,CAAC,EACzBI,EAAWvC,EAAKsC,GAAGF,CAAW,CAAC,EAG/BI,EAAeD,EAAS,WAAW,EAE9BE,EAAOJ,EAAQ,kBAAkB,EAAGI,EAAK,KAAK,GACrDA,EAAK,KAAK,GAAKA,EAAK,KAAK,GAAK,IAEhC,QAASC,EAAOH,EAAS,oBAAoB,KAAMJ,CAAM,EAAGO,EAAK,KAAK,GACpEA,EAAK,KAAK,GAAKA,EAAK,KAAK,GAAK,IAMhC,QAHIC,EAAWT,EAAWU,GAAGT,CAAM,CAAC,EAChCU,EAAiBR,EAAQ,gBAAgBF,CAAM,EAAII,EAAS,gBAAgBJ,CAAM,EAClFW,EAAgB,IAAIC,GACfC,EAAOT,EAAS,mBAAmB,EAAGS,EAAK,KAAK,GAEvDF,EAAc,OAASE,EAAK,KAAK,OACjCF,EAAc,YAAc7C,EAAUqC,GAAGF,CAAW,CAAC,EACrDa,EAAgBD,EAAK,KAAMR,EAAeM,EAAc,IAAI,WAAW,EAAI,CAAC,EAG9E,QADII,EAAe,IAAIH,GACdI,EAAOd,EAAQ,kBAAkB,EAAGc,EAAK,KAAK,GAEjDA,EAAK,KAAK,OAASC,GAAyB,OAC9CF,EAAa,OAASC,EAAK,KAAK,OAChCD,EAAa,YAAc,OAC3BD,EAAgBE,EAAK,KAAMD,EAAa,IAAI,MAAM,CAAC,GAGvD,SAASD,EAAgBI,EAAMC,EAAY,CACzC,IAAIC,EAAOC,IAAgBF,EAAYnB,EAAQD,CAAU,EACpDuB,GAAMF,CAAI,IACbF,EAAK,GAAKK,GAAYH,EAAMZ,CAAQ,EACpCA,EAAWe,GAAYf,EAAWU,EAAK,EAAE,EACzCR,IAEJ,CAIA,IAAIc,EAAiBd,EAAiBF,EAAWE,EAAiB,EAG9De,EAAoB,CAACf,GAAkBF,GAAY,EACnDkB,EAAS3B,EAAWI,GAAGH,CAAM,CAAC,EAC9B2B,EAAazB,EAAQ,gBAAgBF,CAAM,EAAI,EAC/C4B,EAAK,IAAI/B,GAEb,IAAKO,EAAS,oBAAoBwB,EAAI5B,CAAM,EAAG4B,EAAG,KAAK,GACrDC,EAAkBD,EAAG,IAAI,EAE3B,IAAK1B,EAAQ,oBAAoB0B,EAAI5B,CAAM,EAAG4B,EAAG,KAAK,GACpDC,EAAkBD,EAAG,IAAI,EAE3B,SAASC,EAAkBX,EAAM,CAC3BI,GAAMJ,EAAK,EAAE,IACfA,EAAK,GAAKM,GAEZN,EAAK,GAAKQ,EACNR,EAAK,GAAGf,GAAGH,CAAM,CAAC,IAAM2B,GAAc,CAACF,IAEzCP,EAAK,GAAKnB,EAAWI,GAAGH,CAAM,CAAC,EAAID,EAAWU,GAAGT,CAAM,CAAC,EAAIkB,EAAK,IAEnEQ,GAAUR,EAAK,EACjB,CACF,CACA,SAAShD,IAA6B8B,EAAQnC,EAAM,CAElD,QAASiE,EAAOjE,EAAKsC,GAAGH,CAAM,CAAC,EAAE,kBAAkB,EAAG8B,EAAK,KAAK,GAAI,CAClE,IAAIC,EAAUD,EAAK,KACnBE,GAA4BD,EAAQ,KAAM/B,EAAQ+B,EAAQ,GAAIA,EAAQ,KAAMlE,CAAI,EAGhFmE,GAA4BD,EAAQ,KAAM,EAAI/B,EAAQ+B,EAAQ,GAAIA,EAAQ,KAAMlE,CAAI,EAChFkE,EAAQ,OAASd,GAAyB,UAG5Cc,EAAQ,GAAKA,EAAQ,KAAK5B,GAAGH,CAAM,CAAC,EACpC+B,EAAQ,GAAKA,EAAQ,KAAKtB,GAAGT,CAAM,CAAC,EAExC,CACF,CACA,SAAS7B,IAA0B8D,EAAcpE,EAAM,CACrDoE,EAAa,oBAAoB,SAAUC,EAAM,CAC/C,IAAIC,EAAeD,EAAK,KACxB,GAAIC,EAAc,CAChB,IAAIC,EAAaF,EAAK,SAClBG,EAAKH,EAAK,GACdF,GAA4BI,EAAY,EAAGC,EAAIF,EAActE,CAAI,EACjEmE,GAA4BI,EAAY,EAAGC,EAAIF,EAActE,CAAI,CACnE,CACF,CAAC,CACH,CAEA,SAASmE,GAA4BxD,EAASwB,EAAQqC,EAAIC,EAAMzE,EAAM,CACpEW,EAAQiC,GAAGT,CAAM,CAAC,EAAI,EACtB,IAAIuC,EAAUF,EAAGlC,GAAGH,CAAM,CAAC,EACvBwC,EAAMD,EAAU,EAAI1E,EAAKsC,GAAG,EAAIH,CAAM,CAAC,EAAInC,EAAKsC,GAAGH,CAAM,CAAC,EAC1DyC,EAAaD,EAAI,kBAAkBxC,EAAQqC,EAAGlC,GAAGH,CAAM,CAAC,CAAC,EAG7D,GAFAxB,EAAQ2B,GAAGH,CAAM,CAAC,EAAIyC,EAAW,GACjCjE,EAAQiC,GAAGT,CAAM,CAAC,EAAIyC,EAAW,GAC7BH,EAAKnC,GAAGH,CAAM,CAAC,EAAI,EAAG,CACxB,IAAI0C,EAAcF,EAAI,kBAAkBxC,EAAQqC,EAAGlC,GAAGH,CAAM,CAAC,EAAIsC,EAAKnC,GAAGH,CAAM,CAAC,EAAI,CAAC,EAErFxB,EAAQiC,GAAGT,CAAM,CAAC,EAAI0C,EAAY,GAAKA,EAAY,GAAKD,EAAW,EACrE,CACF,CAIA,SAASpB,IAAgBF,EAAYnB,EAAQD,EAAY,CACvD,IAAI4C,EAAUC,GAAwBzB,EAAYpB,EAAWU,GAAGT,CAAM,CAAC,CAAC,EACxE,OAAOuB,GAAYoB,EAAS5C,EAAWU,GAAGT,CAAM,CAAC,CAAC,CACpD,CACA,SAASuB,GAAYoB,EAASE,EAAW,CACvC,OAAO,KAAK,IAAI,KAAK,IAAIF,EAAS9D,GAAUgE,EAAW,GAAQ,CAAC,EAAG,CAAC,CACtE,CACA,SAASpD,GAAYH,EAAQ,CAC3B,IAAInC,EAAcmC,EAAO,YACrBwD,EAAcxD,EAAO,YACrBE,EAAWrC,EAAcA,EAAY,iBAAmB2F,EAAcA,EAAY,iBAAmB,KACzG,OAAOtD,CACT,CACA,IAAIL,GAAyB,CAC3B,OAAQ,EACR,SAAU,EACV,QAAS,CACX,EAEID,GAAqB,CACvB,EAAG,KACH,EAAG,KACH,MAAO,CAAC,CACV,EACA,SAASD,IAA4B8D,EAAK/C,EAAQnC,EAAMmB,EAAOgE,EAAO,CACpE,IAAI9C,EAAUrC,EAAKsC,GAAGH,CAAM,CAAC,EACzBI,EAAWvC,EAAKsC,GAAG,EAAIH,CAAM,CAAC,EAI9BiD,EAAc/C,EAAQ,kBAAkBF,EAAQE,EAAQ,gBAAgBF,CAAM,EAAI,CAAC,EACnFkD,EAAYhD,EAAQ,kBAAkBF,EAAQ,CAAC,EAC/CmD,EAAgB/C,EAAS,kBAAkBJ,EAAQ,CAACI,EAAS,gBAAgBJ,CAAM,CAAC,EACpFoD,EAAmBhD,EAAS,WAAW,EAAIA,EAAS,kBAAkBJ,EAAQ,EAAE,EAAI,KACpFqD,EAAQN,EAAI,MAAM/C,CAAM,EAAIhB,EAAMgB,CAAM,EAC5C,GAAI,CAACkD,GAAa,CAACE,EAAkB,CACnCL,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,QACzC,MACF,CACA,GAAI6D,IAAUlE,GAAkB,KAAM,CAChCoE,GACFH,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,OACzCkE,EAAQC,GAAQL,EAAY,GAAKA,EAAY,GAAIM,GAAQL,EAAU,GAAIG,CAAK,CAAC,EAC7EN,EAAI,MAAM/C,CAAM,EAAIqD,GAGpBN,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,QAE3C,MACF,SAAW6D,IAAUlE,GAAkB,OAAQ,CACzCsE,GACFL,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,SACzCkE,EAAQC,GAAQF,EAAiB,GAAKA,EAAiB,GAAIG,GAAQJ,EAAc,GAAIE,CAAK,CAAC,EAC3FN,EAAI,MAAM/C,CAAM,EAAIqD,GAGpBN,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,QAE3C,MACF,CACA,IAAIqE,EAASN,EAAYA,EAAU,GAAKE,EAAmBA,EAAiB,GAAKA,EAAiB,GAAK,IACnGK,EAAQN,EAAgBA,EAAc,GAAKK,EAC3CE,EAAQT,EAAcA,EAAY,GAAKA,EAAY,GAAKO,EAC5D,GAAIH,EAAQI,EAAO,CACjB,GAAI,CAACT,EAAO,CAEVD,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,QACzC,MACF,CACAkE,EAAQI,CACV,SAAWJ,EAAQK,EAAO,CACxB,GAAI,CAACV,EAAO,CACVD,EAAI5C,GAAGH,CAAM,CAAC,EAAIb,GAAuB,QACzC,MACF,CACAkE,EAAQK,CACV,CACAX,EAAI,MAAM/C,CAAM,EAAIqD,EACpBN,EAAI5C,GAAGH,CAAM,CAAC,EAAIwD,GAAUH,GAASA,GAASK,EAAQvE,GAAuB,OAASsE,GAASJ,GAASA,GAASG,EAASrE,GAAuB,SAAWA,GAAuB,OAErL,CAGA,SAASC,IAA6B2D,EAAKY,EAAY3D,EAAQnC,EAAM,CACnE,IAAIoC,EAAc,EAAID,EACtB,GAAI+C,EAAI5C,GAAGH,CAAM,CAAC,IAAMb,GAAuB,QAG/C,IAAKtB,EAAKsC,GAAGH,CAAM,CAAC,EAAE,kBAAkBF,EAAa,EAAGA,GAAc,KAAK,GAAI,CAC7E,IAAIoC,EAAOpC,GAAc,KACzB,GAAI8D,IAAcb,EAAI,MAAM/C,CAAM,EAAGkC,EAAK,KAAMlC,CAAM,GAAK4D,IAAcb,EAAI,MAAM9C,CAAW,EAAGiC,EAAK,KAAMjC,CAAW,EAAG,CAIxH0D,EAAW3D,CAAM,EAAIkC,EAAK,QAC1ByB,EAAW1D,CAAW,EAAIiC,EAAK,GAAG/B,GAAGF,CAAW,CAAC,EACjD,MACF,CACF,CACF,CAGA,SAASZ,IAA6B0D,EAAKY,EAAY3D,EAAQnC,EAAM,CACnE,GAAIkF,EAAI5C,GAAGH,CAAM,CAAC,IAAMb,GAAuB,QAG/C,KAAIqD,EAAMO,EAAI5C,GAAGH,CAAM,CAAC,IAAMb,GAAuB,SAAWtB,EAAKsC,GAAG,EAAIH,CAAM,CAAC,EAAInC,EAAKsC,GAAGH,CAAM,CAAC,EACtG,IAAKwC,EAAI,oBAAoB5C,GAAaI,CAAM,EAAGJ,GAAY,KAAK,GAClE,GAAIiE,IAAoBd,EAAI,MAAM/C,CAAM,EAAGJ,GAAY,IAAI,EAAG,CAC5D+D,EAAW3D,CAAM,EAAIJ,GAAY,KAAK,GAAGO,GAAGH,CAAM,CAAC,EACnD,MACF,EAEJ,CACA,SAAS6D,IAAoBR,EAAOnB,EAAM,CACxC,OAAOA,EAAK,IAAMmB,GAASA,GAASnB,EAAK,GAAKA,EAAK,EACrD,CACA,SAAS0B,IAAcP,EAAOtF,EAAMiC,EAAQ,CAC1C,OAAOjC,EAAKoC,GAAGH,CAAM,CAAC,GAAKqD,GAASA,GAAStF,EAAKoC,GAAGH,CAAM,CAAC,EAAIjC,EAAK0C,GAAGT,CAAM,CAAC,CACjF,CACA,IAAO8D,IAAQ5G,ICnaR,SAAS6G,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAW,EAC5CD,EAAU,sBAAsBE,GAAU,EAC1CF,EAAU,yBAAyB,SAAUG,GAAM,CACrD,CCCO,SAASC,IAAwBC,EAAYC,EAAa,CAC/D,IAAIC,EAAgBF,EAAW,SAK/B,GAHAC,EAAY,GAAKD,EAAW,QAAQ,GACpC,CAACC,EAAY,MAAQC,IAAkBD,EAAY,KAAOC,EAAc,MAEpED,EAAY,UAAY,KAAM,CAChC,IAAIE,EAAoBF,EAAY,aAChCE,EACFF,EAAY,SAAWE,EAAkB,GAChCD,IACTD,EAAY,SAAWC,EAAc,SAEzC,CAEAD,EAAY,aAAe,IAC7B,CACA,SAASG,IAASC,EAAKC,EAAO,CAC5B,IAAIC,EACJ,OAAOC,EAAKF,EAAO,SAAUG,EAAM,CACjCJ,EAAII,CAAI,GAAK,MAAQJ,EAAII,CAAI,IAAM,SAAWF,EAAQ,GACxD,CAAC,EACMA,CACT,CACA,SAASG,IAAwBC,EAAWC,EAAOX,EAAa,CAE9D,IAAIY,EAAsBC,EAAO,CAAC,EAAGb,CAAW,EAC5CC,EAAgBS,EAAUC,CAAK,EAC/BG,EAAUd,EAAY,SAAW,QACrC,GAAIc,IAAY,QACd,GAAIb,EAAe,CACjB,GAAI,EACF,IAAIc,EAKCC,GAAMf,EAAeW,EAAc,EAAI,EAE9CK,GAAiBhB,EAAeW,EAAc,CAC5C,WAAY,EACd,CAAC,EAEDM,GAAiBlB,EAAaC,CAAa,EAG3CkB,GAAmBnB,EAAaC,CAAa,EAC7CkB,GAAmBnB,EAAaC,EAAe,OAAO,EACtDkB,GAAmBnB,EAAaC,EAAe,OAAO,EACtDkB,GAAmBnB,EAAaC,EAAe,OAAO,EAEtDD,EAAY,SAAWC,EAAc,QACvC,MACES,EAAUC,CAAK,EAAIC,OAEZE,IAAY,UACrBJ,EAAUC,CAAK,EAAIC,EACVE,IAAY,UAErBb,IAAkBS,EAAUC,CAAK,EAAI,KAEzC,CACA,IAAIS,IAA2B,CAAC,aAAc,YAAa,SAAS,EAChEC,IAAgCD,IAAyB,OAAO,CAAC,iBAAkB,kBAAmB,gBAAgB,CAAC,EAC3H,SAASD,GAAmBG,EAAQC,EAAQC,EAAY,CAStD,GARIA,IACE,CAACF,EAAOE,CAAU,GAAKD,EAAOC,CAAU,IAE1CF,EAAOE,CAAU,EAAI,CAAC,GAExBF,EAASA,EAAOE,CAAU,EAC1BD,EAASA,EAAOC,CAAU,GAExB,GAACF,GAAU,CAACC,GAIhB,QADIlB,EAAQmB,EAAaJ,IAA2BC,IAC3C,EAAI,EAAG,EAAIhB,EAAM,OAAQ,IAAK,CACrC,IAAIG,EAAOH,EAAM,CAAC,EACdiB,EAAOd,CAAI,GAAK,MAAQe,EAAOf,CAAI,GAAK,OAC1Cc,EAAOd,CAAI,EAAIe,EAAOf,CAAI,EAE9B,CACF,CACA,SAASiB,IAAqBC,EAAW1B,EAAa,CACpD,GAAK0B,IAGLA,EAAU,GAAK1B,EAAY,GAAK,CAEhCG,IAASH,EAAa,CAAC,OAAQ,OAAO,CAAC,EAEvCG,IAASH,EAAa,CAAC,MAAO,QAAQ,CAAC,CAAC,EAEpC0B,EAAU,OAAS,SAAS,CAC9B,IAAIC,EAAmBD,EACnBE,EAAc5B,EAClB2B,EAAiB,OAAS,OAASA,EAAiB,MAAQC,EAAY,MAAQ,GAChFD,EAAiB,QAAU,OAASA,EAAiB,OAASC,EAAY,OAAS,EACrF,CACF,CACA,IAAIC,KAAqC,SAAUC,EAAQ,CACzDC,EAAUF,EAAuBC,CAAM,EACvC,SAASD,GAAwB,CAC/B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAsB,KACnCG,EAAM,aAAe,GACdA,CACT,CACA,OAAAH,EAAsB,UAAU,YAAc,SAAUI,EAAQC,EAAS,CAEvE,IAAIC,EAAW,KAAK,OAAO,SAC3B,KAAK,OAAO,SAAW,KACvBL,EAAO,UAAU,YAAY,KAAK,KAAMG,EAAQC,CAAO,EACvD,KAAK,OAAO,SAAWC,CACzB,EACAN,EAAsB,UAAU,cAAgB,SAAUO,EAAWC,EAAQ,CAC3E,IAAIC,EAAa,KAAK,OAClBC,GAAWF,EAASC,EAAaF,GAAW,SAC5C1B,EAAY4B,EAAW,SAAWD,EAAS,CAAC,EAAIC,EAAW,SAC3DE,EAAgB,CAAC,EACrB,KAAK,SAASD,EAASC,EAAe,IAAI,EAC1C,IAAIC,EAA0BC,GAAgBhC,EAAW8B,EAAe,aAAa,EAEjFG,EAAoB,KAAK,mBAAqB,CAAC,EAC5CpC,EAAKkC,EAAe,SAAU1C,EAAYY,EAAO,CACtD,IAAIX,EAAcD,EAAW,UAIxBC,IAGL2C,EAAkB,KAAK3C,CAAW,EAClCF,IAAwBC,EAAYC,CAAW,EAC/CS,IAAwBC,EAAWC,EAAOX,CAAW,EACrDyB,IAAqBf,EAAUC,CAAK,EAAGX,CAAW,EACpD,EAAG,IAAI,EAEPsC,EAAW,SAAkBM,GAAOlC,EAAW,SAAUmC,EAAM,CAG7D,OAAAA,GAAQ,OAAOA,EAAK,QACbA,GAAQ,IACjB,CAAC,CACH,EAeAhB,EAAsB,UAAU,SAAW,SAAUiB,EAAYC,EAAQC,EAAc,CAC9EzC,EAAKuC,EAAY,SAAUb,EAAQ,CACxC,GAAKA,EAGL,CAAIe,IACFf,EAAO,aAAee,GAExBD,EAAO,KAAKd,CAAM,EAClB,IAAIgB,EAAWhB,EAAO,SAGlBgB,GAAYA,EAAS,QACvB,KAAK,SAASA,EAAUF,EAAQd,CAAM,EAGxC,OAAOA,EAAO,SAChB,EAAG,IAAI,CACT,EAGAJ,EAAsB,UAAU,qBAAuB,UAAY,CACjE,IAAIqB,EAAM,KAAK,mBAEf,YAAK,mBAAqB,KACnBA,CACT,EACArB,EAAsB,KAAO,UAC7BA,EAAsB,cAAgB,CACpC,SAAU,CAAC,CAEb,EACOA,CACT,GAAEsB,EAAc,EC5LhB,IAAIC,IAA0B,CAE5B,KAAM,KACN,aAAc,KAEd,MAAmBC,GACnB,MAAmBC,GACnB,KAAkBC,EACpB,EACWC,GAAkBC,GAAU,EAInCC,KAAoC,SAAUC,EAAQ,CACxDC,EAAUF,EAAsBC,CAAM,EACtC,SAASD,GAAuB,CAC9B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAqB,KAC3BG,CACT,CACA,OAAAH,EAAqB,UAAU,KAAO,UAAY,CAChD,KAAK,OAAgBI,GAAc,CACrC,EACAJ,EAAqB,UAAU,OAAS,SAAUK,EAAcC,EAASC,EAAK,CAUxEF,IAAiB,KAAK,mBACxB,KAAK,OAAO,EAEd,KAAK,kBAAoBA,EACzB,KAAK,gBAAgBA,CAAY,EACjC,KAAK,UAAUA,EAAcE,CAAG,CAClC,EAIAP,EAAqB,UAAU,gBAAkB,SAAUK,EAAc,CACvE,IAAIG,EAAoBH,EAAa,qBAAqB,EAC1D,GAAKG,EAGL,KAAIC,EAAQ,KAAK,OACbC,EAAY,KAAK,MACjBC,EAAUN,EAAa,IAAI,GAAG,EAC9BO,EAAeP,EAAa,IAAI,QAAQ,EAErCQ,EAAKL,EAAmB,SAAUM,EAAU,CACjD,IAAIC,EAAeC,GAAoBF,EAAS,GAAI,IAAI,EACpDG,EAAaF,GAAM,KAAON,EAAM,IAAIM,CAAE,EAAI,KAC1CG,EAAqBF,GAAoBF,EAAS,SAAU,IAAI,EAChEK,EAAiBD,GAAY,KAAOT,EAAM,IAAIS,CAAQ,EAAIR,EAC1DU,EAASN,EAAS,KAClBO,EAAgBP,EAAS,MACzBM,IAAW,QAAUC,GAGnBP,EAAS,IAAMA,EAAS,GAAG,CAAC,IAC9BO,EAAc,kBAAoBA,EAAc,aAAeA,EAAc,cAAgBA,EAAc,MAAQ,MAGvH,IAAIC,EAAoBR,EAAS,YAC7BS,EAAaT,EAAS,WAC1B,GAAIO,GAAiBG,GAAqBH,EAAeD,EAAQ,CAAC,CAACG,EAAY,CAAC,CAACD,CAAiB,EAAG,CACnG,IAAIG,EAAgBC,GAA8BL,EAAeD,EAAQ,EAAI,EACzE,CAACG,GAAcE,EAAc,aAC/BF,EAAaT,EAAS,WAAaW,EAAc,YAE/C,CAACH,GAAqBG,EAAc,cACtCH,EAAoBG,EAAc,YAEtC,CAEA,IAAIE,EAAkBC,IAAmBd,CAAQ,EAK7Ce,EAAUf,EAAS,SAAW,QAC9BgB,EAAUD,IAAY,QACtBE,EAAYF,IAAY,UAC5B,GAAIC,EAAS,CACX,IAAIE,EAAS,CAACf,EACVgB,EAAOhB,EACPe,EACFC,EAAOC,IAASnB,EAAII,EAAgBL,EAAS,KAAML,CAAK,GAExDwB,IAASnC,GAAMmC,CAAI,EAAE,MAAQ,IAE7BE,GAAwCF,CAAI,GAE1CA,IACFG,GAAsBH,EAAMN,EAAiBtB,EAAc,CACzD,OAAQ2B,CACV,CAAC,EACDK,IAAkBJ,EAAMnB,EAAUH,EAASC,CAAY,EAE3D,SAAWmB,EAAW,CACpBO,GAASrB,EAAYH,EAAUL,EAAOJ,CAAY,EAClD,IAAIkC,EAAOL,IAASnB,EAAII,EAAgBL,EAAS,KAAML,CAAK,EACxD8B,IACFH,GAAsBG,EAAMZ,EAAiBtB,EAAc,CACzD,OAAQ,EACV,CAAC,EACDgC,IAAkBE,EAAMzB,EAAUH,EAASC,CAAY,EAE3D,MAAWiB,IAAY,WACrBW,GAAcvB,EAAYH,CAAQ,EAClCwB,GAASrB,EAAYH,EAAUL,EAAOJ,CAAY,GAEpD,IAAIoC,EAAKhC,EAAM,IAAIM,CAAE,EACrB,GAAI0B,GAAMnB,EACR,GAAIQ,EAAS,CACX,IAAIY,EAAsBD,EAAG,eAAe,EAC5CC,EAAsBA,EAAoB,KAAKpB,CAAiB,EAAImB,EAAG,eAAe,IAAgB5C,GAAKyB,CAAiB,CAAC,CAC/H,MAAWS,GACTU,EAAG,eAAe,IAAgB5C,GAAKyB,CAAiB,CAAC,EAG7D,GAAImB,EAAI,CACN,IAAIE,EAAiB7B,EAAS,SAC9B,GAAI6B,EAAgB,CAClB,IAAIC,EAAeD,EAAe,KAC9BE,EAAW,OACXb,EAAS,GACb,GAAIF,EAAS,CACX,IAAIgB,EAAcL,EAAG,YAAY,EACjCT,EAAS,CAACc,GAAehD,GAAMgD,CAAW,EAAE,OAASF,EACrDC,EAAWb,EAASe,GAAMH,CAAY,EAAIE,CAC5C,MAAWf,IACTC,EAAS,GACTa,EAAWE,GAAMH,CAAY,GAE/BH,EAAG,YAAYI,CAAQ,EACvBT,GAAsBS,EAAUF,EAAgBtC,EAAc,CAC5D,OAAQ2B,CACV,CAAC,EACDgB,GAAuBH,EAAUF,EAAe,kBAAmBtC,CAAY,CACjF,CACA,IAAI4C,EAAUnD,GAAM2C,CAAE,EACtBA,EAAG,cAAclB,CAAU,EAC3B0B,EAAQ,OAASnC,EACjBoC,IAAaT,EAAIpC,EAAcS,CAAQ,EAC3BqC,GAAiB,CAC3B,GAAIV,EACJ,eAAgBpC,EAChB,SAAUoC,EAAG,KACb,kBAAmB3B,EAAS,OAC9B,CAAC,EACDkC,GAAuBP,EAAI3B,EAAS,kBAAmBT,CAAY,CACrE,CACF,CAAC,EACH,EAIAL,EAAqB,UAAU,UAAY,SAAUK,EAAcE,EAAK,CAQtE,QAPI6C,EAAY/C,EAAa,OAAO,SAChCK,EAAY,KAAK,MACjBD,EAAQ,KAAK,OACb4C,EAAW9C,EAAI,SAAS,EACxB+C,EAAY/C,EAAI,UAAU,EAC1BgD,EAAK,CAAC,IAAK,GAAG,EAETC,EAAI,EAAGA,EAAIJ,EAAU,OAAQI,IAAK,CACzC,IAAI1C,EAAWsC,EAAUI,CAAC,EACtBzC,EAAeC,GAAoBF,EAAS,GAAI,IAAI,EACpD2B,EAAK1B,GAAM,KAAON,EAAM,IAAIM,CAAE,EAAI,KACtC,GAAI,GAAC0B,GAAM,CAACA,EAAG,SAGf,KAAIgB,EAAWhB,EAAG,OACdiB,EAAeD,IAAa/C,EAE5BuC,EAAUnD,GAAM2C,CAAE,EAClBkB,EAAgB7D,GAAM2D,CAAQ,EAClCR,EAAQ,MAAQW,GAAaX,EAAQ,OAAO,MAAOS,EAAeL,EAAWM,EAAc,KAAK,GAAK,EACrGV,EAAQ,OAASW,GAAaX,EAAQ,OAAO,OAAQS,EAAeJ,EAAYK,EAAc,MAAM,GAAK,EAC3G,CAEA,QAASH,EAAIJ,EAAU,OAAS,EAAGI,GAAK,EAAGA,IAAK,CAC9C,IAAI1C,EAAWsC,EAAUI,CAAC,EACtBzC,EAAeC,GAAoBF,EAAS,GAAI,IAAI,EACpD2B,EAAK1B,GAAM,KAAON,EAAM,IAAIM,CAAE,EAAI,KACtC,GAAK0B,EAGL,KAAIgB,EAAWhB,EAAG,OACdkB,EAAgB7D,GAAM2D,CAAQ,EAC9BI,EAAgBJ,IAAa/C,EAAY,CAC3C,MAAO2C,EACP,OAAQC,CACV,EAAI,CACF,MAAOK,EAAc,MACrB,OAAQA,EAAc,MACxB,EAKIG,EAAY,CAAC,EACbC,EAAsBC,GAAgBvB,EAAI3B,EAAU+C,EAAe,KAAM,CAC3E,GAAI/C,EAAS,GACb,aAAcA,EAAS,QACzB,EAAGgD,CAAS,EACZ,GAAI,CAAChE,GAAM2C,CAAE,EAAE,OAASsB,EAAU,CAGhC,QAFIE,EAAanD,EAAS,WACtBoD,EAAa,CAAC,EACTC,EAAI,EAAGA,EAAIZ,EAAG,OAAQY,IAAK,CAClC,IAAIC,EAAMb,EAAGY,CAAC,EACVE,EAAMP,EAAUM,CAAG,EACnBH,IAAeK,GAAgBL,CAAU,GAAYM,GAAQN,EAAYG,CAAG,GAAK,GACnFF,EAAWE,CAAG,EAAIC,EAElB5B,EAAG2B,CAAG,EAAIC,CAEd,CACAG,GAAY/B,EAAIyB,EAAY7D,EAAc,CAAC,CAC7C,MACEoC,EAAG,KAAKqB,CAAS,EAErB,CACF,EAIA9D,EAAqB,UAAU,OAAS,UAAY,CAClD,IAAIG,EAAQ,KACRM,EAAQ,KAAK,OACjBA,EAAM,KAAK,SAAUgC,EAAI,CACvBH,GAASG,EAAI3C,GAAM2C,CAAE,EAAE,OAAQhC,EAAON,EAAM,iBAAiB,CAC/D,CAAC,EACD,KAAK,OAAgBC,GAAc,CACrC,EACAJ,EAAqB,UAAU,QAAU,UAAY,CACnD,KAAK,OAAO,CACd,EACAA,EAAqB,KAAO,UACrBA,CACT,GAAEyE,EAAa,EAEf,SAASC,GAAMC,EAAa,CAI1B,IAAIC,EAAaC,GAAOC,IAAyBH,CAAW,EAG1DG,IAAwBH,CAAW,EAAgBI,GAAcJ,CAAW,EAI1EK,EAAK,IAAIJ,EAAI,CAAC,CAAC,EACnB,OAAAK,GAAMD,CAAE,EAAE,KAAOL,EACVK,CACT,CACA,SAASE,IAASC,EAAIC,EAAgBT,EAAaU,EAAO,CACxD,IAAIL,EAAKN,GAAMC,CAAW,EAC1B,OAAAS,EAAe,IAAIJ,CAAE,EACrBK,EAAM,IAAIF,EAAIH,CAAE,EAChBC,GAAMD,CAAE,EAAE,GAAKG,EACfF,GAAMD,CAAE,EAAE,MAAQ,GACXA,CACT,CACA,SAASM,GAASC,EAAYC,EAAUH,EAAOI,EAAc,CAC3D,IAAIC,EAAgBH,GAAcA,EAAW,OACzCG,IACFH,EAAW,OAAS,SAAWA,EAAW,SAAS,SAAUP,EAAI,CAC/DM,GAASN,EAAIQ,EAAUH,EAAOI,CAAY,CAC5C,CAAC,EACDE,GAAqBJ,EAAYC,EAAUC,CAAY,EACvDJ,EAAM,UAAUJ,GAAMM,CAAU,EAAE,EAAE,EAExC,CACA,SAASK,IAAkBZ,EAAIQ,EAAUK,EAAUC,EAAe,CAC3Dd,EAAG,SACCe,EAAK,CAAC,CAAC,SAAUC,GAAY,UAAU,MAAM,EAGpD,CAAC,SAAUF,GAAiB,CAAC,EAAG,CAAC,IAAKD,GAAY,CAAC,EAEnD,CAAC,KAAM,CAAC,CAAC,EAAG,SAAUI,EAAM,CAC1B,IAAIC,EAAOD,EAAK,CAAC,EACNpB,GAAOW,EAAUU,CAAI,EAC9BlB,EAAGkB,CAAI,EAAWC,GAAUX,EAASU,CAAI,EAAGD,EAAK,CAAC,CAAC,EAC1CjB,EAAGkB,CAAI,GAAK,OACrBlB,EAAGkB,CAAI,EAAID,EAAK,CAAC,EAErB,CAAC,EAEIF,EAAYK,GAAKZ,CAAQ,EAAG,SAAUa,EAAK,CAGhD,GAAIA,EAAI,QAAQ,IAAI,IAAM,EAAG,CAC3B,IAAIC,EAAMd,EAASa,CAAG,EACtBrB,EAAGqB,CAAG,EAAWE,GAAWD,CAAG,EAAIA,EAAM,IAC3C,CACF,CAAC,EACUzB,GAAOW,EAAU,WAAW,IACrCR,EAAG,UAAYQ,EAAS,WAG1BA,EAAS,MAAQ,OAASR,EAAG,KAAOQ,EAAS,MAC7CA,EAAS,IAAM,OAASR,EAAG,GAAKQ,EAAS,GAC3C,CAEA,SAASgB,IAAmBhB,EAAU,CACpC,OAAAA,EAAkBiB,EAAO,CAAC,EAAGjB,CAAQ,EAC9BO,EAAK,CAAC,KAAM,WAAY,UAAW,KAAM,WAAY,cAAe,UAAU,EAAE,OAAkBW,EAAe,EAAG,SAAUC,EAAM,CACzI,OAAOnB,EAASmB,CAAI,CACtB,CAAC,EACMnB,CACT,CACA,SAASoB,IAAa5B,EAAIS,EAAcD,EAAU,CAChD,IAAIqB,EAAYC,GAAU9B,CAAE,EAAE,UAE1B,CAACA,EAAG,QAAU,CAACA,EAAG,QAAU,CAAC6B,IAC/BA,EAAYC,GAAU9B,CAAE,EAAE,UAAY,CACpC,cAAe,UACf,eAAgBS,EAAa,eAC7B,KAAMT,EAAG,IACX,GAIE6B,IACFA,EAAU,KAAOrB,EAAS,KAE9B,CCxVO,SAASuB,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAqB,EACtDD,EAAU,sBAAsBE,GAAoB,EACpDF,EAAU,qBAAqB,SAAUG,EAAQ,CAC/C,IAAIC,EAAgBD,EAAO,QAOvBE,EAAQD,CAAa,EACnB,CAACA,EAAc,CAAC,GAAK,CAACA,EAAc,CAAC,EAAE,SACzCD,EAAO,QAAU,CAAC,CAChB,SAAUC,CACZ,CAAC,EAIDD,EAAO,QAAU,CAACA,EAAO,QAAQ,CAAC,CAAC,EAE5BC,GAAiB,CAACA,EAAc,WACzCD,EAAO,QAAU,CAAC,CAChB,SAAU,CAACC,CAAa,CAC1B,CAAC,EAEL,CAAC,CACH,CC7BO,IAAIE,GAA4B,CAAC,IAAK,IAAK,SAAU,QAAS,QAAQ,EAGzEC,IAAgB,CAAC,cAAe,QAAS,YAAY,EAClD,SAASC,IAAiBC,EAAa,CAC5C,IAAIC,EAAYD,EAAY,IAAI,kBAAkB,EAClD,OAAOE,GAAQJ,IAAeG,CAAS,GAAK,CAC9C,CACO,SAASE,GAAgBC,EAAS,CAIvC,OAAOA,EAAU,MACnB,CAiBO,SAASC,IAAsBC,EAASC,EAAS,CAEtD,IAAIC,EAAcC,GAAc,EAC5BC,EAAiB,CAAC,EAElBC,EAAmBF,GAAc,EAErCH,EAAQ,cAAc,CACpB,SAAU,WACV,MAAOC,CACT,EAAG,SAAUK,EAAe,CACrBD,EAAiB,IAAIC,EAAc,GAAG,GACzCC,EAAcD,CAAa,CAE/B,CAAC,EAGD,IAAIE,EACJ,GACEA,EAAe,GACfR,EAAQ,cAAc,WAAYS,CAAa,QACxCD,GACT,SAASC,EAAcH,EAAe,CAChC,CAACD,EAAiB,IAAIC,EAAc,GAAG,GAAKI,EAASJ,CAAa,IACpEC,EAAcD,CAAa,EAC3BE,EAAe,GAEnB,CACA,SAASD,EAAcI,EAAU,CAC/BN,EAAiB,IAAIM,EAAS,IAAK,EAAI,EACvCP,EAAe,KAAKO,CAAQ,EAC5BC,EAAmBD,CAAQ,CAC7B,CACA,SAASD,EAASJ,EAAe,CAC/B,IAAIO,EAAS,GACb,OAAAP,EAAc,eAAe,SAAUQ,EAASC,EAAW,CACzD,IAAIC,EAAad,EAAY,IAAIY,CAAO,EACpCE,GAAcA,EAAWD,CAAS,IACpCF,EAAS,GAEb,CAAC,EACMA,CACT,CACA,SAASD,EAAmBN,EAAe,CACzCA,EAAc,eAAe,SAAUQ,EAASC,EAAW,EACxDb,EAAY,IAAIY,CAAO,GAAKZ,EAAY,IAAIY,EAAS,CAAC,CAAC,GAAGC,CAAS,EAAI,EAC1E,CAAC,CACH,CACA,OAAOX,CACT,CAoBO,SAASa,GAA8BX,EAAe,CAC3D,IAAIN,EAAUM,EAAc,QACxBY,EAAmB,CACrB,SAAU,CAAC,EACX,QAASf,GAAc,CACzB,EACA,OAAAG,EAAc,eAAe,SAAUQ,EAASC,EAAW,CACzD,IAAII,EAAYnB,EAAQ,aAAaoB,GAAgBN,CAAO,EAAGC,CAAS,EACxE,GAAKI,EAGL,KAAIE,EAAgBF,EAAU,iBAAiB,EAC/C,GAAKE,EAGL,KAAIC,EAAcD,EAAc,IAC5BE,EAAeL,EAAiB,QAAQ,IAAII,CAAW,EACtDC,IACHA,EAAe,CACb,MAAOF,EACP,WAAY,CAAC,CACf,EACAH,EAAiB,SAAS,KAAKK,CAAY,EAC3CL,EAAiB,QAAQ,IAAII,EAAaC,CAAY,GAExDA,EAAa,WAAW,KAAKJ,CAAS,GACxC,CAAC,EACMD,CACT,CC3HA,IAAIM,IAAgC,UAAY,CAC9C,SAASA,GAAmB,CAC1B,KAAK,UAAY,CAAC,EAClB,KAAK,SAAW,CAAC,CACnB,CACA,OAAAA,EAAiB,UAAU,IAAM,SAAUC,EAAa,CAEjD,KAAK,SAASA,CAAW,IAC5B,KAAK,UAAU,KAAKA,CAAW,EAC/B,KAAK,SAASA,CAAW,EAAI,GAEjC,EACOD,CACT,GAAE,EACEE,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KAC3BG,EAAM,cAAgB,GACtBA,EAAM,UAAY,GAiBlBA,EAAM,eAAiB,CAAC,UAAW,SAAS,EACrCA,CACT,CACA,OAAAH,EAAc,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CACrE,IAAIC,EAAiBC,IAAkBJ,CAAM,EAsB7C,KAAK,cAAgBG,EACrB,KAAK,qBAAqBH,EAAQE,CAAO,EACzC,KAAK,QAAQC,CAAc,CAC7B,EACAP,EAAc,UAAU,YAAc,SAAUS,EAAW,CACzD,IAAIF,EAAiBC,IAAkBC,CAAS,EAEhDC,GAAM,KAAK,OAAQD,EAAW,EAAI,EAClCC,GAAM,KAAK,cAAeH,EAAgB,EAAI,EAC9C,KAAK,QAAQA,CAAc,CAC7B,EACAP,EAAc,UAAU,QAAU,SAAUO,EAAgB,CAC1D,IAAII,EAAa,KAAK,OACtB,KAAK,oBAAoBJ,CAAc,EACvC,KAAK,gBAAgBA,CAAc,EACnC,IAAIK,EAAgB,KAAK,cACzBC,EAAK,CAAC,CAAC,QAAS,YAAY,EAAG,CAAC,MAAO,UAAU,CAAC,EAAG,SAAUC,EAAOC,EAAO,CAIvE,KAAK,eAAeA,CAAK,IAAM,UACjCJ,EAAWG,EAAM,CAAC,CAAC,EAAIF,EAAcE,EAAM,CAAC,CAAC,EAAI,KAGrD,EAAG,IAAI,EACP,KAAK,aAAa,CACpB,EACAd,EAAc,UAAU,aAAe,UAAY,CACjD,IAAIgB,EAAe,KAAK,IAAI,SAAU,EAAI,EACtCC,EAAqB,KAAK,mBAAqBC,GAAc,EAC7DC,EAAmB,KAAK,yBAAyBF,CAAkB,EACnEE,EACF,KAAK,QAAUH,GAAgB,KAAK,4BAA4B,GAEhE,KAAK,QAAUA,GAAgB,aAC/B,KAAK,4BAA4BC,EAAoB,KAAK,OAAO,GAEnE,KAAK,UAAY,GACjBA,EAAmB,KAAK,SAAUG,EAAU,CACtCA,EAAS,UAAU,SACrB,KAAK,UAAY,GAErB,EAAG,IAAI,CACT,EACApB,EAAc,UAAU,yBAA2B,SAAUiB,EAAoB,CAC/E,IAAIE,EAAmB,GACvB,OAAAN,EAAKQ,GAA2B,SAAUC,EAAS,CACjD,IAAIC,EAAW,KAAK,uBAAuBC,GAAgBF,CAAO,EAAGG,GAAkB,EAIvF,GAAKF,EAAS,UAGd,CAAAJ,EAAmB,GACnB,IAAIC,EAAW,IAAItB,GACnBe,EAAKU,EAAS,OAAQ,SAAUG,EAAW,CACzCN,EAAS,IAAIM,EAAU,cAAc,CACvC,CAAC,EACDT,EAAmB,IAAIK,EAASF,CAAQ,EAC1C,EAAG,IAAI,EACAD,CACT,EACAnB,EAAc,UAAU,4BAA8B,SAAUiB,EAAoBU,EAAQ,CAC1F,IAAIrB,EAAU,KAAK,QACfsB,EAAW,GAEf,GAAIA,EAAU,CACZ,IAAIN,EAAUK,IAAW,WAAa,IAAM,IACxCE,EAAavB,EAAQ,eAAe,CACtC,SAAUgB,EAAU,MACtB,CAAC,EACDQ,EAAgBD,EAAYP,CAAO,CACrC,CAEA,GAAIM,EAAU,CACZ,IAAIC,EAAavB,EAAQ,eAAe,CACtC,SAAU,aACV,OAAQ,SAAUoB,EAAW,CAC3B,OAAOA,EAAU,IAAI,SAAU,EAAI,IAAMC,CAC3C,CACF,CAAC,EACDG,EAAgBD,EAAY,QAAQ,CACtC,CACA,SAASC,EAAgBD,EAAYP,EAAS,CAE5C,IAAII,EAAYG,EAAW,CAAC,EAC5B,GAAKH,EAGL,KAAIN,EAAW,IAAItB,GAKnB,GAJAsB,EAAS,IAAIM,EAAU,cAAc,EACrCT,EAAmB,IAAIK,EAASF,CAAQ,EACxCQ,EAAW,GAEPN,IAAY,KAAOA,IAAY,IAAK,CACtC,IAAIS,EAAcL,EAAU,uBAAuB,OAAQM,EAAgB,EAAE,OAAO,CAAC,EACrFD,GAAelB,EAAKgB,EAAY,SAAUI,EAAS,CAC7CP,EAAU,iBAAmBO,EAAQ,gBAAkBF,IAAgBE,EAAQ,uBAAuB,OAAQD,EAAgB,EAAE,OAAO,CAAC,GAC1IZ,EAAS,IAAIa,EAAQ,cAAc,CAEvC,CAAC,CACH,EACF,CACIL,GAEFf,EAAKQ,GAA2B,SAAUC,EAAS,CACjD,GAAKM,EAGL,KAAIC,EAAavB,EAAQ,eAAe,CACtC,SAAUkB,GAAgBF,CAAO,EACjC,OAAQ,SAAUI,EAAW,CAC3B,OAAOA,EAAU,IAAI,OAAQ,EAAI,IAAM,UACzC,CACF,CAAC,EACD,GAAIG,EAAW,CAAC,EAAG,CACjB,IAAIT,EAAW,IAAItB,GACnBsB,EAAS,IAAIS,EAAW,CAAC,EAAE,cAAc,EACzCZ,EAAmB,IAAIK,EAASF,CAAQ,EACxCQ,EAAW,EACb,EACF,EAAG,IAAI,CAEX,EACA5B,EAAc,UAAU,4BAA8B,UAAY,CAChE,IAAIkC,EAEJ,YAAK,eAAe,SAAUZ,EAAS,CACrC,CAACY,IAAQA,EAAMZ,EACjB,EAAG,IAAI,EACAY,IAAQ,IAAM,WAAa,YACpC,EACAlC,EAAc,UAAU,oBAAsB,SAAUO,EAAgB,CAKtE,GAHIA,EAAe,eAAe,UAAU,IAC1C,KAAK,cAAgB,IAEnB,KAAK,cAAe,CACtB,IAAI4B,EAAe,KAAK,QAAQ,OAChC,KAAK,OAAO,SAAWA,EAAa,WAAaA,EAAa,wBAA0B,EAAI,IAAM,EACpG,CACF,EACAnC,EAAc,UAAU,gBAAkB,SAAUO,EAAgB,CAClE,IAAI6B,EAAgB,KAAK,eACrBC,EAAoB,KAAK,IAAI,WAAW,EAC5CxB,EAAK,CAAC,CAAC,QAAS,YAAY,EAAG,CAAC,MAAO,UAAU,CAAC,EAAG,SAAUC,EAAOC,EAAO,CAC3E,IAAIuB,EAAmB/B,EAAeO,EAAM,CAAC,CAAC,GAAK,KAC/CyB,EAAiBhC,EAAeO,EAAM,CAAC,CAAC,GAAK,KAC7CwB,GAAoB,CAACC,EACvBH,EAAcrB,CAAK,EAAI,UACd,CAACuB,GAAoBC,EAC9BH,EAAcrB,CAAK,EAAI,QACdsB,EACTD,EAAcrB,CAAK,EAAIsB,EAAkBtB,CAAK,EACrCuB,IAETF,EAAcrB,CAAK,EAAI,UAG3B,CAAC,CACH,EACAf,EAAc,UAAU,SAAW,UAAY,CAC7C,OAAO,KAAK,SACd,EACAA,EAAc,UAAU,wBAA0B,UAAY,CAC5D,IAAIwC,EACJ,YAAK,eAAe,SAAUlB,EAASmB,EAAW,CAC5CD,GAAkB,OACpBA,EAAiB,KAAK,QAAQ,aAAahB,GAAgBF,CAAO,EAAGmB,CAAS,EAElF,EAAG,IAAI,EACAD,CACT,EAIAxC,EAAc,UAAU,eAAiB,SAAU0C,EAAUC,EAAS,CACpE,KAAK,mBAAmB,KAAK,SAAUvB,EAAUE,EAAS,CACxDT,EAAKO,EAAS,UAAW,SAAUqB,EAAW,CAC5CC,EAAS,KAAKC,EAASrB,EAASmB,CAAS,CAC3C,CAAC,CACH,CAAC,CACH,EAIAzC,EAAc,UAAU,aAAe,SAAUsB,EAASmB,EAAW,CACnE,IAAIf,EAAY,KAAK,aAAaJ,EAASmB,CAAS,EACpD,GAAIf,EACF,OAAOA,EAAU,aAErB,EAIA1B,EAAc,UAAU,aAAe,SAAUsB,EAASmB,EAAW,CAInE,IAAIrB,EAAW,KAAK,mBAAmB,IAAIE,CAAO,EAClD,GAAIF,GAAYA,EAAS,SAASqB,CAAS,EACzC,OAAO,KAAK,QAAQ,aAAajB,GAAgBF,CAAO,EAAGmB,CAAS,CAExE,EAIAzC,EAAc,UAAU,YAAc,SAAU4C,EAAK,CACnD,IAAIjC,EAAa,KAAK,OAClBC,EAAgB,KAAK,cACzBC,EAAK,CAAC,CAAC,QAAS,YAAY,EAAG,CAAC,MAAO,UAAU,CAAC,EAAG,SAAUC,EAAO,EAUhE8B,EAAI9B,EAAM,CAAC,CAAC,GAAK,MAAQ8B,EAAI9B,EAAM,CAAC,CAAC,GAAK,QAC5CH,EAAWG,EAAM,CAAC,CAAC,EAAIF,EAAcE,EAAM,CAAC,CAAC,EAAI8B,EAAI9B,EAAM,CAAC,CAAC,EAC7DH,EAAWG,EAAM,CAAC,CAAC,EAAIF,EAAcE,EAAM,CAAC,CAAC,EAAI8B,EAAI9B,EAAM,CAAC,CAAC,EAEjE,EAAG,IAAI,EACP,KAAK,gBAAgB8B,CAAG,CAC1B,EACA5C,EAAc,UAAU,mBAAqB,SAAU4C,EAAK,CAC1D,IAAIxC,EAAS,KAAK,OAClBS,EAAK,CAAC,QAAS,aAAc,MAAO,UAAU,EAAG,SAAUgC,EAAM,CAC/DzC,EAAOyC,CAAI,EAAID,EAAIC,CAAI,CACzB,CAAC,CACH,EACA7C,EAAc,UAAU,gBAAkB,UAAY,CACpD,IAAI8C,EAAY,KAAK,4BAA4B,EACjD,GAAIA,EACF,OAAOA,EAAU,qBAAqB,CAE1C,EAMA9C,EAAc,UAAU,cAAgB,SAAUsB,EAASmB,EAAW,CACpE,GAAInB,GAAW,MAAQmB,GAAa,KAAM,CACxC,IAAIK,EAAY,KAAK,4BAA4B,EACjD,GAAIA,EACF,OAAOA,EAAU,mBAAmB,CAExC,KACE,QAAO,KAAK,aAAaxB,EAASmB,CAAS,EAAE,mBAAmB,CAEpE,EAKAzC,EAAc,UAAU,4BAA8B,SAAU0B,EAAW,CACzE,GAAIA,EACF,OAAOA,EAAU,cAKnB,QAFIqB,EACAC,EAAc,KAAK,mBAAmB,KAAK,EACtCC,EAAI,EAAGA,EAAID,EAAY,OAAQC,IAGtC,QAFI3B,EAAU0B,EAAYC,CAAC,EACvB7B,EAAW,KAAK,mBAAmB,IAAIE,CAAO,EACzC4B,EAAI,EAAGA,EAAI9B,EAAS,UAAU,OAAQ8B,IAAK,CAClD,IAAIC,EAAQ,KAAK,aAAa7B,EAASF,EAAS,UAAU8B,CAAC,CAAC,EAC5D,GAAIC,EAAM,SAAS,IAAI,EACrB,OAAOA,EAEJJ,IACHA,EAAaI,EAEjB,CAKF,OAAOJ,CACT,EACA/C,EAAc,UAAU,iBAAmB,UAAY,CACrD,OAAO,KAAK,eAAe,MAAM,CACnC,EACAA,EAAc,UAAU,UAAY,UAAY,CAK9C,OAAO,KAAK,OACd,EACAA,EAAc,KAAO,WACrBA,EAAc,aAAe,CAAC,QAAS,QAAS,aAAc,YAAa,aAAc,SAAU,SAAS,EAC5GA,EAAc,cAAgB,CAE5B,EAAG,EACH,WAAY,SACZ,MAAO,EACP,IAAK,GACP,EACOA,CACT,GAAEoD,EAAc,EAMhB,SAAS5C,IAAkBJ,EAAQ,CACjC,IAAIiD,EAAM,CAAC,EACX,OAAAxC,EAAK,CAAC,QAAS,MAAO,aAAc,WAAY,UAAU,EAAG,SAAUgC,EAAM,CAC3EzC,EAAO,eAAeyC,CAAI,IAAMQ,EAAIR,CAAI,EAAIzC,EAAOyC,CAAI,EACzD,CAAC,EACMQ,CACT,CACA,IAAOC,GAAQtD,IC/Xf,IAAIuD,KAAmC,SAAUC,EAAQ,CACvDC,EAAUF,EAAqBC,CAAM,EACrC,SAASD,GAAsB,CAC7B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAoB,KAC1BG,CACT,CACA,OAAAH,EAAoB,KAAO,kBACpBA,CACT,GAAEI,EAAa,EACRC,IAAQL,ICVf,IAAIM,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,OAAS,SAAUI,EAAeC,EAASC,EAAKC,EAAS,CAC9E,KAAK,cAAgBH,EACrB,KAAK,QAAUC,EACf,KAAK,IAAMC,CACb,EACAN,EAAa,KAAO,WACbA,CACT,GAAEQ,EAAa,EACRC,GAAQT,ICff,IAAIU,KAAkC,SAAUC,EAAQ,CACtDC,EAAUF,EAAoBC,CAAM,EACpC,SAASD,GAAqB,CAC5B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAmB,KACzBG,CACT,CACA,OAAAH,EAAmB,KAAO,kBACnBA,CACT,GAAEI,EAAY,EACPC,IAAQL,ICLf,IAAIM,GAAcA,EACdC,IAAiBA,GAQjBC,KAAyB,UAAY,CACvC,SAASA,EAAUC,EAASC,EAAWC,EAAeC,EAAS,CAC7D,KAAK,SAAWH,EAChB,KAAK,WAAaC,EAClB,KAAK,QAAUE,EACf,KAAK,eAAiBD,CAMxB,CAIA,OAAAH,EAAU,UAAU,SAAW,SAAUG,EAAe,CACtD,OAAO,KAAK,iBAAmBA,CACjC,EAIAH,EAAU,UAAU,mBAAqB,UAAY,CACnD,OAAO,KAAK,aAAa,MAAM,CACjC,EAIAA,EAAU,UAAU,qBAAuB,UAAY,CACrD,OAAO,KAAK,eAAe,MAAM,CACnC,EACAA,EAAU,UAAU,sBAAwB,UAAY,CACtD,IAAIK,EAAe,CAAC,EACpB,YAAK,QAAQ,WAAW,SAAUC,EAAa,CAC7C,GAAIC,IAAiBD,CAAW,EAAG,CACjC,IAAIE,EAAeC,GAAgB,KAAK,QAAQ,EAC5CC,EAAYJ,EAAY,uBAAuBE,EAAcG,EAAgB,EAAE,OAAO,CAAC,EACvFD,GAAa,KAAK,aAAeA,EAAU,gBAC7CL,EAAa,KAAKC,CAAW,CAEjC,CACF,EAAG,IAAI,EACAD,CACT,EACAL,EAAU,UAAU,aAAe,UAAY,CAC7C,OAAO,KAAK,QAAQ,aAAa,KAAK,SAAW,OAAQ,KAAK,UAAU,CAC1E,EACAA,EAAU,UAAU,cAAgB,UAAY,CAC9C,OAAcY,GAAM,KAAK,WAAW,CACtC,EAIAZ,EAAU,UAAU,oBAAsB,SAAUa,EAAK,CACvD,IAAIC,EAAa,KAAK,YAClBJ,EAAY,KAAK,aAAa,EAC9BK,EAAQL,EAAU,KAAK,MACvBM,EAAgB,KAAK,eAAe,iBAAiB,EACrDC,EAAgB,CAAC,EAAG,GAAG,EACvBC,EAAgB,CAAC,EACjBC,EAAc,CAAC,EACfC,EACJtB,GAAK,CAAC,QAAS,KAAK,EAAG,SAAUuB,EAAMC,EAAK,CAC1C,IAAIC,EAAeV,EAAIQ,CAAI,EACvBG,EAAaX,EAAIQ,EAAO,OAAO,EAc/BL,EAAcM,CAAG,IAAM,WACzBC,GAAgB,OAASA,EAAeN,EAAcK,CAAG,GAEzDE,EAAaT,EAAM,MAAiBU,GAAUF,EAAcN,EAAeH,CAAU,CAAC,IAEtFM,EAAmB,GACnBI,EAAaA,GAAc,KAAOV,EAAWQ,CAAG,EAAIP,EAAM,MAAMS,CAAU,EAI1ED,EAA0BE,GAAUD,EAAYV,EAAYG,CAAa,GAK3EE,EAAYG,CAAG,EAAIE,GAAc,MAAQ,MAAMA,CAAU,EAAIV,EAAWQ,CAAG,EAAIE,EAC/EN,EAAcI,CAAG,EAAIC,GAAgB,MAAQ,MAAMA,CAAY,EAAIN,EAAcK,CAAG,EAAIC,CAC1F,CAAC,EACDxB,IAAIoB,CAAW,EACfpB,IAAImB,CAAa,EAMjB,IAAIQ,EAAQ,KAAK,YACjBN,EAAmBO,EAAYR,EAAaD,EAAeJ,EAAYG,EAAe,EAAK,EAAIU,EAAYT,EAAeC,EAAaF,EAAeH,EAAY,EAAI,EACtK,SAASa,EAAYC,EAAYC,EAAUC,EAAYC,EAAUC,EAAS,CACxE,IAAIC,EAASD,EAAU,OAAS,YAChCE,GAAW,EAAGN,EAAYE,EAAY,MAAOJ,EAAM,MAAQO,CAAM,EAAGP,EAAM,MAAQO,CAAM,CAAC,EACzF,QAASE,EAAI,EAAGA,EAAI,EAAGA,IACrBN,EAASM,CAAC,EAAeV,GAAUG,EAAWO,CAAC,EAAGL,EAAYC,EAAU,EAAI,EAC5EC,IAAYH,EAASM,CAAC,EAAIpB,EAAM,MAAMc,EAASM,CAAC,CAAC,EAErD,CACA,MAAO,CACL,YAAahB,EACb,cAAeD,CACjB,CACF,EAMAlB,EAAU,UAAU,MAAQ,SAAUG,EAAe,CACnD,GAAIA,IAAkB,KAAK,eAG3B,KAAIiC,EAAe,KAAK,sBAAsB,EAE9C,KAAK,YAAcC,IAAoB,KAAM,KAAK,SAAUD,CAAY,EAExE,KAAK,kBAAkB,EACvB,IAAIE,EAAa,KAAK,oBAAoBnC,EAAc,aAAa,EACrE,KAAK,aAAemC,EAAW,YAC/B,KAAK,eAAiBA,EAAW,cAEjC,KAAK,cAAc,EACrB,EACAtC,EAAU,UAAU,WAAa,SAAUG,EAAeoC,EAAK,CAC7D,GAAIpC,IAAkB,KAAK,eACzB,OAEF,IAAIqC,EAAU,KAAK,SACfnC,EAAe,KAAK,sBAAsB,EAC1CoC,EAAatC,EAAc,IAAI,YAAY,EAC3CgB,EAAc,KAAK,aACvB,GAAIsB,IAAe,OACjB,OAqBF3C,GAAKO,EAAc,SAAUC,EAAa,CACxC,IAAIoC,EAAapC,EAAY,QAAQ,EACjCqC,EAAWD,EAAW,iBAAiBF,CAAO,EAClD,GAAKG,EAAS,OAGd,IAAIF,IAAe,aAAc,CAC/B,IAAIG,EAAUF,EAAW,SAAS,EAC9BG,EAA0BC,EAAIH,EAAU,SAAUI,EAAK,CACzD,OAAOL,EAAW,kBAAkBK,CAAG,CACzC,EAAGL,CAAU,EACbA,EAAW,WAAW,SAAUM,EAAW,CAIzC,QAHIC,EACAC,EACAC,EACKhB,EAAI,EAAGA,EAAIQ,EAAS,OAAQR,IAAK,CACxC,IAAIiB,EAAQR,EAAQ,IAAIC,EAAiBV,CAAC,EAAGa,CAAS,EAClDK,EAAe,CAAC,MAAMD,CAAK,EAC3BE,EAAcF,EAAQjC,EAAY,CAAC,EACnCoC,EAAeH,EAAQjC,EAAY,CAAC,EACxC,GAAIkC,GAAgB,CAACC,GAAe,CAACC,EACnC,MAAO,GAETF,IAAiBF,EAAW,IAC5BG,IAAgBL,EAAU,IAC1BM,IAAiBL,EAAW,GAC9B,CAEA,OAAOC,GAAYF,GAAWC,CAChC,CAAC,CACH,MACEpD,GAAK6C,EAAU,SAAUI,EAAK,CAC5B,GAAIN,IAAe,QACjBnC,EAAY,QAAQoC,EAAaA,EAAW,IAAIK,EAAK,SAAUK,EAAO,CACpE,OAAQI,EAAWJ,CAAK,EAAUA,EAAN,GAC9B,CAAC,CAAC,MACG,CACL,IAAIK,EAAQ,CAAC,EACbA,EAAMV,CAAG,EAAI5B,EAEbuB,EAAW,YAAYe,CAAK,CAE9B,CACF,CAAC,EAEH3D,GAAK6C,EAAU,SAAUI,EAAK,CAC5BL,EAAW,qBAAqBvB,EAAa4B,CAAG,CAClD,CAAC,EACH,CAAC,EACD,SAASS,EAAWJ,EAAO,CACzB,OAAOA,GAASjC,EAAY,CAAC,GAAKiC,GAASjC,EAAY,CAAC,CAC1D,CACF,EACAnB,EAAU,UAAU,kBAAoB,UAAY,CAClD,IAAI0D,EAAa,KAAK,YAAc,CAAC,EACjCvD,EAAgB,KAAK,eACrBW,EAAa,KAAK,YACtBhB,GAAK,CAAC,MAAO,KAAK,EAAG,SAAU6D,EAAQ,CACrC,IAAIC,EAAczD,EAAc,IAAIwD,EAAS,MAAM,EAC/CE,EAAY1D,EAAc,IAAIwD,EAAS,WAAW,EACtDE,GAAa,OAASA,EAAY,KAAK,aAAa,EAAE,KAAK,MAAM,MAAMA,CAAS,GAE5EA,GAAa,KACfD,EAAyBnC,GAAUX,EAAW,CAAC,EAAI+C,EAAW/C,EAAY,CAAC,EAAG,GAAG,EAAG,EAAI,EAC/E8C,GAAe,OACxBC,EAAuBpC,GAAUmC,EAAa,CAAC,EAAG,GAAG,EAAG9C,EAAY,EAAI,EAAIA,EAAW,CAAC,GAE1F4C,EAAWC,EAAS,MAAM,EAAIC,EAC9BF,EAAWC,EAAS,WAAW,EAAIE,CACrC,EAAG,IAAI,CACT,EACA7D,EAAU,UAAU,cAAgB,UAAY,CAC9C,IAAIU,EAAY,KAAK,aAAa,EAC9BQ,EAAgB,KAAK,eACrBC,EAAc,KAAK,aACvB,GAAKD,EAIL,KAAI4C,EAAuBC,GAAkB5C,EAAa,CAAC,EAAG,GAAG,CAAC,EAClE2C,EAAY,KAAK,IAAIA,EAAW,EAAE,EAKlC,IAAIE,EAAgBtD,EAAU,KAAK,MAAM,cACrCQ,EAAc,CAAC,IAAM,GACvB8C,EAAc,oBAAoB,MAAO,CAAC7C,EAAY,CAAC,EAAE,QAAQ2C,CAAS,CAAC,EAEzE5C,EAAc,CAAC,IAAM,KACvB8C,EAAc,oBAAoB,MAAO,CAAC7C,EAAY,CAAC,EAAE,QAAQ2C,CAAS,CAAC,EAE7EE,EAAc,OAAO,EACvB,EACOhE,CACT,GAAE,EACF,SAASqC,IAAoB4B,EAAWzB,EAASnC,EAAc,CAC7D,IAAIS,EAAa,CAAC,IAAU,IAAS,EACrChB,GAAKO,EAAc,SAAUC,EAAa,CACxC4D,IAAwBpD,EAAYR,EAAY,QAAQ,EAAGkC,CAAO,CACpE,CAAC,EAUD,IAAI9B,EAAYuD,EAAU,aAAa,EACnCE,EAAkBC,GAAyB1D,EAAU,KAAK,MAAOA,EAAWI,CAAU,EAAE,UAAU,EACtG,MAAO,CAACqD,EAAgB,IAAKA,EAAgB,GAAG,CAClD,CACA,IAAOE,IAAQrE,ICtSf,IAAIsE,IAAoB,CAItB,gBAAiB,SAAUC,EAAS,CAClC,SAASC,EAAcC,EAAI,CACzBF,EAAQ,cAAc,WAAY,SAAUG,EAAe,CACzDA,EAAc,eAAe,SAAUC,EAASC,EAAW,CACzD,IAAIC,EAAYN,EAAQ,aAAaO,GAAgBH,CAAO,EAAGC,CAAS,EACxEH,EAAGE,EAASC,EAAWC,EAAWH,CAAa,CACjD,CAAC,CACH,CAAC,CACH,CAGAF,EAAc,SAAUG,EAASC,EAAWC,EAAWH,EAAe,CAEpEG,EAAU,cAAgB,IAC5B,CAAC,EACD,IAAIE,EAAY,CAAC,EACjBP,EAAc,SAAUG,EAASC,EAAWC,EAAWH,EAAe,CAG/DG,EAAU,gBAEbA,EAAU,cAAgB,IAAIG,IAAUL,EAASC,EAAWF,EAAeH,CAAO,EAClFQ,EAAU,KAAKF,EAAU,aAAa,EAE1C,CAAC,EACD,IAAII,EAAiBC,GAAc,EACnC,OAAAC,EAAKJ,EAAW,SAAUK,EAAW,CACnCD,EAAKC,EAAU,sBAAsB,EAAG,SAAUC,EAAa,CAC7DJ,EAAe,IAAII,EAAY,IAAKA,CAAW,CACjD,CAAC,CACH,CAAC,EACMJ,CACT,EAIA,aAAc,SAAUV,EAASe,EAAK,CACpCf,EAAQ,cAAc,WAAY,SAAUG,EAAe,CAIzDA,EAAc,eAAe,SAAUC,EAASC,EAAW,CACzDF,EAAc,aAAaC,EAASC,CAAS,EAAE,MAAMF,CAAa,CACpE,CAAC,EAeDA,EAAc,eAAe,SAAUC,EAASC,EAAW,CACzDF,EAAc,aAAaC,EAASC,CAAS,EAAE,WAAWF,EAAeY,CAAG,CAC9E,CAAC,CACH,CAAC,EACDf,EAAQ,cAAc,WAAY,SAAUG,EAAe,CAGzD,IAAIU,EAAYV,EAAc,4BAA4B,EAC1D,GAAIU,EAAW,CACb,IAAIG,EAAeH,EAAU,qBAAqB,EAC9CI,EAAaJ,EAAU,mBAAmB,EAC9CV,EAAc,mBAAmB,CAC/B,MAAOa,EAAa,CAAC,EACrB,IAAKA,EAAa,CAAC,EACnB,WAAYC,EAAW,CAAC,EACxB,SAAUA,EAAW,CAAC,CACxB,CAAC,CACH,CACF,CAAC,CACH,CACF,EACOC,IAAQnB,ICpFA,SAARoB,GAAuCC,EAAW,CACvDA,EAAU,eAAe,WAAY,SAAUC,EAASC,EAAS,CAC/D,IAAIC,EAAiBC,IAAsBF,EAASD,CAAO,EAC3DI,EAAKF,EAAgB,SAAUG,EAAe,CAC5CA,EAAc,YAAY,CACxB,MAAOL,EAAQ,MACf,IAAKA,EAAQ,IACb,WAAYA,EAAQ,WACpB,SAAUA,EAAQ,QACpB,CAAC,CACH,CAAC,CACH,CAAC,CACH,CCZA,IAAIM,IAAY,GACD,SAARC,GAA+BC,EAAW,CAC3CF,MAGJA,IAAY,GACZE,EAAU,kBAAkBA,EAAU,SAAS,UAAU,OAAQC,GAAiB,EAClFC,GAAsBF,CAAS,EAC/BA,EAAU,yBAAyB,WAAY,UAAY,CAEzD,MAAO,QACT,CAAC,EACH,CCXO,SAASG,IAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAe,EAChDD,EAAU,sBAAsBE,GAAc,EAC9CC,GAAcH,CAAS,CACzB,CCzBA,IAAII,IAA8B,UAAY,CAC5C,SAASA,GAAiB,CAAC,CAC3B,OAAOA,CACT,GAAE,EAEF,IAAIC,IAAW,CAAC,EACT,SAASC,GAAgBC,EAAMC,EAAM,CAC1CH,IAASE,CAAI,EAAIC,CACnB,CACO,SAASC,GAAWF,EAAM,CAC/B,OAAOF,IAASE,CAAI,CACtB,CCYA,IAAIG,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,cAAgB,UAAY,CACjDC,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EACpD,IAAIG,EAAU,KAAK,QACZC,EAAK,KAAK,OAAO,QAAS,SAAUC,EAAYC,EAAa,CAClE,IAAIC,EAAyBC,GAAWF,CAAW,EAC/CC,IACEA,EAAQ,mBACVA,EAAQ,cAAgBA,EAAQ,iBAAiBJ,CAAO,GAEnDM,GAAMJ,EAAYE,EAAQ,aAAa,EAElD,CAAC,CACH,EACAR,EAAa,KAAO,UACpBA,EAAa,WAAa,CACxB,KAAM,MACN,WAAY,EACd,EACAA,EAAa,cAAgB,CAC3B,KAAM,GACN,EAAG,EAEH,OAAQ,aACR,KAAM,QACN,IAAK,MAGL,gBAAiB,cACjB,YAAaW,EAAO,MAAM,OAC1B,aAAc,EACd,YAAa,EACb,QAASA,EAAO,KAAK,EACrB,SAAU,GACV,QAASA,EAAO,KAAK,EACrB,UAAW,GACX,UAAW,CACT,YAAaA,EAAO,MAAM,SAC1B,MAAO,MACT,EACA,SAAU,CACR,UAAW,CACT,YAAaA,EAAO,MAAM,QAC5B,CACF,EAGA,QAAS,CACP,KAAM,GACN,SAAU,QACZ,CACF,EACOX,CACT,GAAEY,EAAc,EACTC,IAAQb,IC9DR,SAASc,GAAeC,EAAMC,EAAgB,CACnD,IAAIC,EAAqBC,GAAkBF,EAAe,IAAI,SAAS,CAAC,EACpEG,EAAQH,EAAe,aAAa,CAAC,QAAS,SAAS,CAAC,EAC5DG,EAAM,KAAOH,EAAe,IAAI,iBAAiB,EACjD,IAAII,EAAS,IAAYC,GAAK,CAC5B,MAAO,CACL,EAAGN,EAAK,EAAIE,EAAQ,CAAC,EACrB,EAAGF,EAAK,EAAIE,EAAQ,CAAC,EACrB,MAAOF,EAAK,MAAQE,EAAQ,CAAC,EAAIA,EAAQ,CAAC,EAC1C,OAAQF,EAAK,OAASE,EAAQ,CAAC,EAAIA,EAAQ,CAAC,EAC5C,EAAGD,EAAe,IAAI,cAAc,CACtC,EACA,MAAOG,EACP,OAAQ,GACR,GAAI,EACN,CAAC,EAKD,OAAOC,CACT,CCTA,IAAIE,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAY,UAAU,OAAS,SAAUG,EAAcC,EAASC,EAAKC,EAAS,CAC5E,IAAIC,EAAQ,KAAK,MAEjB,GADAA,EAAM,UAAU,EACZ,CAACJ,EAAa,IAAI,MAAM,EAC1B,OAEF,IAAIK,EAAW,CAACL,EAAa,IAAI,UAAU,EACvCM,EAAaN,EAAa,IAAI,QAAQ,IAAM,WAC5CO,EAAcP,EAAa,IAAI,SAAS,GAAK,CAAC,EAC9CQ,EAAW,KAAK,YAAc,KAAK,UAAY,CAAC,GAChDC,EAAe,CAAC,EACbC,EAAKH,EAAa,SAAUI,EAAKC,EAAM,CAC5CH,EAAa,KAAKG,CAAI,CACxB,CAAC,EACD,IAAIC,GAAW,KAAK,eAAiB,CAAC,EAAGJ,CAAY,EAAE,IAAIK,CAAc,EAAE,OAAOA,CAAc,EAAE,OAAcC,GAAMD,EAAgB,IAAI,CAAC,EAAE,QAAQ,EAErJ,KAAK,cAAgBL,EACrB,SAASK,EAAeE,EAAUC,EAAU,CAC1C,IAAIC,EAAcT,EAAaO,CAAQ,EACnCG,EAAUV,EAAaQ,CAAQ,EAC/BG,EAAab,EAAYW,CAAW,EACpCG,EAAe,IAAIC,GAAMF,EAAYpB,EAAcA,EAAa,OAAO,EACvEuB,EAKJ,GAHIpB,GAAWA,EAAQ,UAAY,MAAQA,EAAQ,cAAgBe,IACjEE,EAAW,MAAQjB,EAAQ,UAEzBe,GAAe,CAACC,EAAS,CAE3B,GAAIK,IAAkBN,CAAW,EAC/BK,EAAU,CACR,QAASF,EAAa,OAAO,QAC7B,YAAaH,CACf,MACK,CACL,IAAIO,EAAUC,GAAWR,CAAW,EACpC,GAAI,CAACO,EACH,OAEFF,EAAU,IAAIE,CAChB,CACAjB,EAASU,CAAW,EAAIK,CAC1B,SACEA,EAAUf,EAASW,CAAO,EAEtB,CAACI,EACH,OAGJA,EAAQ,IAAMI,GAAO,iBAAiB,EACtCJ,EAAQ,MAAQF,EAChBE,EAAQ,QAAUtB,EAClBsB,EAAQ,IAAMrB,EACd,IAAI0B,EAAmBL,aAAmBM,GAC1C,GAAI,CAACX,GAAeC,EAAS,CAC3BS,GAAoBL,EAAQ,SAAWA,EAAQ,QAAQtB,EAASC,CAAG,EACnE,MACF,CACA,GAAI,CAACmB,EAAa,IAAI,MAAM,GAAKO,GAAoBL,EAAQ,SAAU,CACrEK,GAAoBL,EAAQ,QAAUA,EAAQ,OAAOtB,EAASC,CAAG,EACjE,MACF,CACA4B,EAAgBT,EAAcE,EAASL,CAAW,EAClDG,EAAa,cAAgB,SAAUU,EAAUC,EAAQ,CACvD,IAAIC,EAAS,KAAK,OACdC,EAAY,KAAK,UACrBD,EAAO,WAAaA,EAAO,YAAc,CAAC,EAC1CA,EAAO,WAAWF,CAAQ,EAAIC,EAC1BE,EAAUH,CAAQ,IACnBC,IAAW,WAAaG,GAAgBC,IAAeF,EAAUH,CAAQ,CAAC,CAE/E,EACIR,aAAmBM,IACjBN,EAAQ,QACVA,EAAQ,OAAOF,EAAcpB,EAASC,EAAKC,CAAO,CAGxD,CACA,SAAS2B,EAAgBT,EAAcE,EAASL,EAAa,CAC3D,IAAImB,EAAiBhB,EAAa,SAAS,WAAW,EAClDiB,EAAyBjB,EAAa,SAAS,CAAC,WAAY,WAAW,CAAC,EAYxEkB,EAAQhB,aAAmBM,IAAkBN,EAAQ,SAAWA,EAAQ,SAAS,EAAIF,EAAa,IAAI,MAAM,EAC5GmB,EAASnB,EAAa,IAAI,OAAO,GAAK,CAAC,EACvCoB,EACAC,EACOC,GAASJ,CAAK,GACvBE,EAAW,CAAC,EACZA,EAASvB,CAAW,EAAIqB,GAExBE,EAAWF,EAEFI,GAASH,CAAM,GACxBE,EAAY,CAAC,EACbA,EAAUxB,CAAW,EAAIsB,GAEzBE,EAAYF,EAEd,IAAIN,EAAYb,EAAa,UAAY,CAAC,EACnCX,EAAK+B,EAAU,SAAUG,EAASb,EAAU,CACjD,IAAIc,EAAeC,GAAWF,EAAS,CAAC,EAAG,CACzC,EAAG,CAACvC,EAAW,EACf,EAAG,CAACA,EAAW,EACf,MAAOA,EACP,OAAQA,CACV,CAAC,EACDwC,EAAK,SAASR,EAAe,aAAa,CAAC,EAC3C,IAAIU,EAAoBF,EAAK,YAAY,UAAU,EACnDE,EAAkB,MAAQT,EAAuB,aAAa,EAG9D,IAAIU,EAAc,IAAIC,GAAO,CAC3B,MAAO,CACL,KAAMP,EAAUX,CAAQ,EACxB,MAAOO,EAAuB,IAAI,WAAW,EAC7C,aAAcA,EAAuB,IAAI,kBAAkB,EAC3D,QAASA,EAAuB,IAAI,aAAa,EACjD,KAAM,KACN,KAAMY,GAAQ,CACZ,UAAWZ,EAAuB,IAAI,eAAe,EACrD,WAAYA,EAAuB,IAAI,gBAAgB,EACvD,SAAUA,EAAuB,IAAI,cAAc,EACnD,WAAYA,EAAuB,IAAI,gBAAgB,CACzD,EAAGrC,CAAO,CACZ,EACA,OAAQ,EACV,CAAC,EACD4C,EAAK,eAAeG,CAAW,EACvBG,GAAiB,CACvB,GAAIN,EACJ,eAAgB7C,EAChB,SAAU+B,EACV,qBAAsB,CACpB,MAAOW,EAAUX,CAAQ,CAC3B,CACF,CAAC,EACDc,EAAK,QAAUH,EAAUX,CAAQ,EACjCc,EAAK,GAAG,YAAa,UAAY,CAE/B,IAAIO,EAAad,EAAuB,aAAa,EACjDe,EAAsB/C,EAAaN,EAAa,IAAI,OAAO,GAAK,MAAQA,EAAa,IAAI,MAAM,IAAM,QAAU,QAAU,OAASA,EAAa,IAAI,QAAQ,GAAK,MAAQA,EAAa,IAAI,KAAK,IAAM,SAAW,SAAW,MAC9NgD,EAAY,SAAS,CACnB,KAAMV,EAAuB,IAAI,UAAU,GAAKc,EAAW,MAAQA,EAAW,QAAUE,EAAO,MAAM,UACrG,gBAAiBhB,EAAuB,IAAI,qBAAqB,CACnE,CAAC,EACDO,EAAK,cAAc,CACjB,SAAUP,EAAuB,IAAI,cAAc,GAAKe,CAC1D,CAAC,EACDL,EAAY,OAAS,CAAChD,EAAa,IAAI,WAAW,EAGlDE,EAAI,cAAc,IAAI,CACxB,CAAC,EAAE,GAAG,WAAY,UAAY,CACxBmB,EAAa,IAAI,CAAC,aAAcU,CAAQ,CAAC,IAAM,YACjD7B,EAAI,cAAc,IAAI,EAExB8C,EAAY,KAAK,CACnB,CAAC,GACA3B,EAAa,IAAI,CAAC,aAAcU,CAAQ,CAAC,IAAM,WAAaI,GAAgBC,IAAeS,CAAI,EAChGzC,EAAM,IAAIyC,CAAI,EACdA,EAAK,GAAG,QAAgBU,GAAKhC,EAAQ,QAASA,EAAStB,EAASC,EAAK6B,CAAQ,CAAC,EAC9EG,EAAUH,CAAQ,EAAIc,CACxB,CAAC,CACH,CACA,IAAIW,EAAeC,GAAyBzD,EAAcE,CAAG,EAAE,aAC3DwD,EAAkB1D,EAAa,mBAAmB,EAClD2D,EAAU3D,EAAa,IAAI,SAAS,EACpC4D,EAAWC,GAAcH,EAAiBF,EAAcG,CAAO,EACnEG,GAAI9D,EAAa,IAAI,QAAQ,EAAGI,EAAOJ,EAAa,IAAI,SAAS,EAAG4D,EAAS,MAAOA,EAAS,MAAM,EACnGG,GAAgB3D,EAAOsD,EAAiBF,EAAcG,CAAO,EAG7DvD,EAAM,IAAwB4D,GAAe5D,EAAM,gBAAgB,EAAGJ,CAAY,CAAC,EAEnFM,GAAcF,EAAM,UAAU,SAAU6D,EAAM,CAC5C,IAAIC,EAAYD,EAAK,QAGjBE,EAAgBF,EAAK,YAAY,UAAU,EAC3CG,EAAqBD,EAAc,aAAeA,EAAc,WAAa,CAAC,GAC9EnB,EAAciB,EAAK,eAAe,EAClCI,EAAoBrB,GAAeA,EAAY,YAAY,UAAU,EAEzE,GAAIqB,GAAqB,CAAQC,GAAWD,CAAiB,GAAKH,EAAW,CAC3E,IAAIK,EAAoBF,EAAkB,QAAUA,EAAkB,MAAQ,CAAC,GAC3EG,EAAmBC,GAAgBP,EAAWjB,GAAO,SAASsB,CAAiB,CAAC,EAChFG,EAAUT,EAAK,EAAI7D,EAAM,EACzBuE,EAAUV,EAAK,EAAI7D,EAAM,EAAIC,EAC7BuE,EAAe,GACfD,EAAUH,EAAK,OAAStE,EAAI,UAAU,IACxCkE,EAAmB,SAAW,MAC9BQ,EAAe,IAEjB,IAAIC,EAAYD,EAAe,GAAKJ,EAAK,OAASnE,EAAW,GACzDqE,EAAUF,EAAK,MAAQ,EAAItE,EAAI,SAAS,GAC1CkE,EAAmB,SAAW,CAAC,OAAQS,CAAS,EAChDN,EAAkB,MAAQ,SACjBG,EAAUF,EAAK,MAAQ,EAAI,IACpCJ,EAAmB,SAAW,CAAC,EAAGS,CAAS,EAC3CN,EAAkB,MAAQ,OAE9B,CACF,CAAC,CACH,EACA1E,EAAY,UAAU,WAAa,SAAUG,EAAcC,EAASC,EAAKC,EAAS,CACzEO,EAAK,KAAK,UAAW,SAAUa,EAAS,CAC7CA,aAAmBM,IAAkBN,EAAQ,YAAcA,EAAQ,WAAWA,EAAQ,MAAOtB,EAASC,EAAKC,CAAO,CACpH,CAAC,CACH,EAMAN,EAAY,UAAU,OAAS,SAAUI,EAASC,EAAK,CAC9CQ,EAAK,KAAK,UAAW,SAAUa,EAAS,CAC7CA,aAAmBM,IAAkBN,EAAQ,QAAUA,EAAQ,OAAOtB,EAASC,CAAG,CACpF,CAAC,EACD,KAAK,MAAM,UAAU,CACvB,EACAL,EAAY,UAAU,QAAU,SAAUI,EAASC,EAAK,CAC/CQ,EAAK,KAAK,UAAW,SAAUa,EAAS,CAC7CA,aAAmBM,IAAkBN,EAAQ,SAAWA,EAAQ,QAAQtB,EAASC,CAAG,CACtF,CAAC,CACH,EACAL,EAAY,KAAO,UACZA,CACT,GAAEiF,EAAa,EACf,SAAStD,IAAkBN,EAAa,CACtC,OAAOA,EAAY,QAAQ,IAAI,IAAM,CACvC,CACA,IAAO6D,IAAQlF,IChQf,IAAImF,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAY,UAAU,QAAU,SAAUG,EAASC,EAAK,CACtD,IAAIC,EAAQ,KAAK,MACbC,EAAQD,EAAM,IAAI,MAAM,GAAKF,EAAQ,IAAI,cAAc,GAAK,UAC5DI,EAAQH,EAAI,MAAM,EAAE,QAAQ,QAAQ,IAAM,MAC1CI,EAAOD,EAAQ,MAAQF,EAAM,IAAI,OAAQ,EAAI,GAAK,MAClDI,EAAML,EAAI,oBAAoB,CAChC,KAAMI,EACN,gBAAiBH,EAAM,IAAI,kBAAmB,EAAI,GAAKF,EAAQ,IAAI,iBAAiB,GAAKO,EAAO,MAAM,UACtG,yBAA0BL,EAAM,IAAI,0BAA0B,EAC9D,kBAAmBA,EAAM,IAAI,mBAAmB,EAChD,WAAYA,EAAM,IAAI,YAAY,CACpC,CAAC,EACGM,EAAUC,GAAI,QAElB,GAAI,OAAO,YAAe,aAAeD,EAAQ,SAAW,CAACA,EAAQ,IAAM,CAACA,EAAQ,MAAO,CACzF,IAAIE,EAAK,SAAS,cAAc,GAAG,EACnCA,EAAG,SAAWP,EAAQ,IAAME,EAC5BK,EAAG,OAAS,SACZA,EAAG,KAAOJ,EACV,IAAIK,EAAM,IAAI,WAAW,QAAS,CAEhC,KAAM,SAAS,YACf,QAAS,GACT,WAAY,EACd,CAAC,EACDD,EAAG,cAAcC,CAAG,CACtB,SAIM,OAAO,UAAU,kBAAoBP,EAAO,CAC9C,IAAIQ,EAAQN,EAAI,MAAM,GAAG,EAErBO,EAAgBD,EAAM,CAAC,EAAE,QAAQ,QAAQ,EAAI,GAC7CE,EAAOV,EAET,mBAAmBQ,EAAM,CAAC,CAAC,EAAIA,EAAM,CAAC,EAKxCC,IAAkBC,EAAO,OAAO,KAAKA,CAAI,GACzC,IAAIC,EAAWZ,EAAQ,IAAME,EAE7B,GAAI,OAAO,UAAU,iBAAkB,CAGrC,QAFIW,EAAIF,EAAK,OACTG,EAAQ,IAAI,WAAWD,CAAC,EACrBA,KACLC,EAAMD,CAAC,EAAIF,EAAK,WAAWE,CAAC,EAE9B,IAAIE,EAAO,IAAI,KAAK,CAACD,CAAK,CAAC,EAC3B,OAAO,UAAU,iBAAiBC,EAAMH,CAAQ,CAClD,KAAO,CACL,IAAII,EAAQ,SAAS,cAAc,QAAQ,EAC3C,SAAS,KAAK,YAAYA,CAAK,EAC/B,IAAIC,EAAKD,EAAM,cACXE,EAAMD,EAAG,SACbC,EAAI,KAAK,gBAAiB,SAAS,EACnCA,EAAI,MAAMP,CAAI,EACdO,EAAI,MAAM,EACVD,EAAG,MAAM,EACTC,EAAI,YAAY,SAAU,GAAMN,CAAQ,EACxC,SAAS,KAAK,YAAYI,CAAK,CACjC,CACF,KAAO,CACL,IAAIG,EAAOpB,EAAM,IAAI,MAAM,EACvBqB,EAAO,qCAAiDjB,EAAM,qCAAuCgB,GAAQA,EAAK,CAAC,GAAK,IAAM,cAC9HE,EAAM,OAAO,KAAK,EACtBA,EAAI,SAAS,MAAMD,CAAI,EACvBC,EAAI,SAAS,MAAQrB,CACvB,CAEJ,EACAN,EAAY,iBAAmB,SAAUG,EAAS,CAChD,IAAIyB,EAAgB,CAClB,KAAM,GACN,KAAM,mFACN,MAAOzB,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,cAAe,OAAO,CAAC,EACvE,KAAM,MAGN,yBAA0BO,EAAO,MAAM,UACvC,KAAM,GACN,kBAAmB,CAAC,SAAS,EAG7B,KAAMP,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,cAAe,MAAM,CAAC,CACvE,EACA,OAAOyB,CACT,EACO5B,CACT,GAAE6B,EAAc,EACTC,IAAQ9B,ICjGf,IAAI+B,IAAsB,yBAI1B,IAAIC,IAAa,CAAC,CAAC,OAAQ,KAAK,EAAG,CAAC,OAAO,CAAC,EACxCC,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAU,UAAU,SAAW,UAAY,CACzC,IAAIG,EAAQ,KAAK,MACbC,EAAiBD,EAAM,IAAI,MAAM,EACjCE,EAAQ,CAAC,EACb,OAAOC,EAAKH,EAAM,IAAI,MAAM,EAAG,SAAUI,EAAM,CACzCH,EAAeG,CAAI,IACrBF,EAAME,CAAI,EAAIH,EAAeG,CAAI,EAErC,CAAC,EACMF,CACT,EACAL,EAAU,iBAAmB,SAAUQ,EAAS,CAC9C,IAAIC,EAAgB,CAClB,KAAM,GACN,KAAM,CAAC,EAEP,KAAM,CACJ,KAAM,+DACN,IAAK,kFAEL,MAAO,kYACT,EAEA,MAAOD,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,YAAa,OAAO,CAAC,EACrE,OAAQ,CAAC,EACT,YAAa,CAAC,CAChB,EACA,OAAOC,CACT,EACAT,EAAU,UAAU,QAAU,SAAUQ,EAASE,EAAKH,EAAM,CAC1D,IAAIJ,EAAQ,KAAK,MACbQ,EAAcR,EAAM,IAAI,CAAC,cAAeI,CAAI,CAAC,EAEjD,GAAKK,IAAmBL,CAAI,EAG5B,KAAIM,EAAY,CACd,OAAQ,CAAC,CACX,EACIC,EAAyB,SAAUC,EAAa,CAClD,IAAIC,EAAaD,EAAY,QACzBE,EAAWF,EAAY,GACvBG,EAAeN,IAAmBL,CAAI,EAAES,EAAYC,EAAUF,EAAaZ,CAAK,EAChFe,IAEKC,GAASD,EAAcH,EAAY,MAAM,EAChDF,EAAU,OAAO,KAAKK,CAAY,GAGpC,IAAIE,EAAWL,EAAY,iBAC3B,GAAIK,GAAYA,EAAS,OAAS,gBAAkBb,IAAS,QAAUA,IAAS,OAAQ,CACtF,IAAIc,EAAeD,EAAS,eAAe,SAAS,EAAE,CAAC,EACvD,GAAIC,EAAc,CAChB,IAAIC,EAAUD,EAAa,IACvBE,EAAWD,EAAU,OACrBE,EAAYT,EAAY,uBAAuBQ,EAAUE,EAAgB,EAAE,OAAO,CAAC,EACnFC,EAAYF,EAAU,eAC1BX,EAAUU,CAAQ,EAAIV,EAAUU,CAAQ,GAAK,CAAC,EAC9C,QAASI,EAAI,EAAGA,GAAKD,EAAWC,IAC9Bd,EAAUU,CAAQ,EAAEG,CAAS,EAAIb,EAAUU,CAAQ,EAAEG,CAAS,GAAK,CAAC,EAEtEb,EAAUU,CAAQ,EAAEG,CAAS,EAAE,YAAcnB,IAAS,KACxD,CACF,CACF,EACOD,EAAKP,IAAY,SAAU6B,EAAO,CAC5BC,GAAQD,EAAOrB,CAAI,GAAK,GAC1BD,EAAKsB,EAAO,SAAUE,EAAM,CACjC3B,EAAM,cAAc2B,EAAM,QAAQ,CACpC,CAAC,CAEL,CAAC,EACD3B,EAAM,cAAcI,EAAM,UAAU,EACpCC,EAAQ,cAAc,CACpB,SAAU,SACV,MAAOG,GAAe,KAAO,KAAO,CAClC,YAAaA,CACf,CACF,EAAGG,CAAsB,EACzB,IAAIiB,EACAC,EAAczB,EAEdA,IAAS,UAIXwB,EAAkBE,GAAM,CACtB,MAAO9B,EAAM,OAAO,MAAM,MAC1B,MAAOA,EAAM,OAAO,MAAM,KAC5B,EAAGA,EAAM,OAAO,KAAK,EACjBA,EAAM,IAAI,CAAC,aAAcI,CAAI,CAAC,IAAM,aACtCyB,EAAc,UAGlBtB,EAAI,eAAe,CACjB,KAAM,kBACN,YAAasB,EACb,UAAWnB,EACX,SAAUkB,EACV,YAAa,WACf,CAAC,EACH,EACO/B,CACT,GAAEkC,EAAc,EACZtB,IAAqB,CACvB,KAAQ,SAAUI,EAAYC,EAAUF,EAAaZ,EAAO,CAC1D,GAAIa,IAAe,MACjB,OAAciB,GAAM,CAClB,GAAIhB,EACJ,KAAM,OAEN,KAAMF,EAAY,IAAI,MAAM,EAC5B,MAAOA,EAAY,IAAI,OAAO,EAC9B,UAAWA,EAAY,IAAI,WAAW,EACtC,SAAUA,EAAY,IAAI,UAAU,CACtC,EAAGZ,EAAM,IAAI,CAAC,SAAU,MAAM,CAAC,GAAK,CAAC,EAAG,EAAI,CAEhD,EACA,IAAO,SAAUa,EAAYC,EAAUF,EAAaZ,EAAO,CACzD,GAAIa,IAAe,OACjB,OAAciB,GAAM,CAClB,GAAIhB,EACJ,KAAM,MAEN,KAAMF,EAAY,IAAI,MAAM,EAC5B,MAAOA,EAAY,IAAI,OAAO,EAC9B,UAAWA,EAAY,IAAI,WAAW,EACtC,SAAUA,EAAY,IAAI,UAAU,CACtC,EAAGZ,EAAM,IAAI,CAAC,SAAU,KAAK,CAAC,GAAK,CAAC,EAAG,EAAI,CAE/C,EACA,MAAS,SAAUa,EAAYC,EAAUF,EAAaZ,EAAO,CAC3D,IAAIgC,EAAUpB,EAAY,IAAI,OAAO,IAAMqB,IAC3C,GAAIpB,IAAe,QAAUA,IAAe,MAC1C,OAAAb,EAAM,cAAc,QAASgC,EAAU,SAAW,UAAU,EAC9CF,GAAM,CAClB,GAAIhB,EACJ,MAAOkB,EAAU,GAAKC,GACxB,EAAGjC,EAAM,IAAI,CAAC,SAAU,OAAO,CAAC,GAAK,CAAC,EAAG,EAAI,CAEjD,CACF,EAEQkC,GAAe,CACrB,KAAM,kBACN,MAAO,mBACP,OAAQ,kBACV,EAAG,SAAUC,EAAS9B,EAAS,CAC7BA,EAAQ,YAAY8B,EAAQ,SAAS,CACvC,CAAC,EACD,IAAOC,IAAQvC,IC5Jf,IAAIwC,GAAgB,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG,EACtCC,GAAe,IAMnB,SAASC,IAAYC,EAAS,CAC5B,IAAIC,EAA4B,CAAC,EAC7BC,EAAc,CAAC,EACfC,EAAO,CAAC,EACZ,OAAAH,EAAQ,cAAc,SAAUI,EAAa,CAC3C,IAAIC,EAAWD,EAAY,iBAC3B,GAAIC,IAAaA,EAAS,OAAS,eAAiBA,EAAS,OAAS,SAAU,CAE9E,IAAIC,EAAWD,EAAS,YAAY,EACpC,GAAIC,EAAS,OAAS,WAAY,CAChC,IAAIC,EAAMD,EAAS,IAAM,IAAMA,EAAS,MACnCL,EAA0BM,CAAG,IAChCN,EAA0BM,CAAG,EAAI,CAC/B,aAAcD,EACd,UAAWD,EAAS,aAAaC,CAAQ,EACzC,OAAQ,CAAC,CACX,EACAH,EAAK,KAAK,CACR,QAASG,EAAS,IAClB,UAAWA,EAAS,KACtB,CAAC,GAEHL,EAA0BM,CAAG,EAAE,OAAO,KAAKH,CAAW,CACxD,MACEF,EAAY,KAAKE,CAAW,CAEhC,MACEF,EAAY,KAAKE,CAAW,CAEhC,CAAC,EACM,CACL,0BAA2BH,EAC3B,MAAOC,EACP,KAAMC,CACR,CACF,CAKA,SAASK,IAA+BC,EAAQ,CAC9C,IAAIC,EAAS,CAAC,EACd,OAAOC,EAAKF,EAAQ,SAAUG,EAAOL,EAAK,CACxC,IAAIM,EAAeD,EAAM,aACrBE,EAAYF,EAAM,UAClBG,EAAeD,EAAU,IACzBE,EAAU,CAAC,GAAG,EAAE,OAAcC,EAAIL,EAAM,OAAQ,SAAUM,EAAQ,CACpE,OAAOA,EAAO,IAChB,CAAC,CAAC,EAEEC,EAAU,CAACN,EAAa,MAAM,cAAc,CAAC,EAC1CF,EAAKC,EAAM,OAAQ,SAAUM,EAAQ,CAC1C,IAAIE,EAAUF,EAAO,WAAW,EAChCC,EAAQ,KAAKD,EAAO,WAAW,EAAE,SAASE,EAAQ,aAAaL,CAAY,EAAG,SAAUM,EAAK,CAC3F,OAAOA,CACT,CAAC,CAAC,CACJ,CAAC,EAGD,QADIC,EAAQ,CAACN,EAAQ,KAAKlB,EAAY,CAAC,EAC9ByB,EAAI,EAAGA,EAAIJ,EAAQ,CAAC,EAAE,OAAQI,IAAK,CAE1C,QADIC,EAAQ,CAAC,EACJC,EAAI,EAAGA,EAAIN,EAAQ,OAAQM,IAClCD,EAAM,KAAKL,EAAQM,CAAC,EAAEF,CAAC,CAAC,EAE1BD,EAAM,KAAKE,EAAM,KAAK1B,EAAY,CAAC,CACrC,CACAY,EAAO,KAAKY,EAAM,KAAK;AAAA,CAAI,CAAC,CAC9B,CAAC,EACMZ,EAAO,KAAK;AAAA;AAAA,EAASb,GAAgB;AAAA;AAAA,CAAM,CACpD,CAIA,SAAS6B,IAAoBR,EAAQ,CACnC,OAAcD,EAAIC,EAAQ,SAAUA,EAAQ,CAC1C,IAAIS,EAAOT,EAAO,WAAW,EACzBI,EAAQ,CAACJ,EAAO,IAAI,EACpBU,EAAO,CAAC,EACZ,OAAAD,EAAK,KAAKA,EAAK,WAAY,UAAY,CAIrC,QAHIE,EAAS,UAAU,OACnBC,EAAY,UAAUD,EAAS,CAAC,EAChCE,EAAOJ,EAAK,QAAQG,CAAS,EACxBP,EAAI,EAAGA,EAAIM,EAAS,EAAGN,IAC9BK,EAAKL,CAAC,EAAI,UAAUA,CAAC,EAEvBD,EAAM,MAAMS,EAAOA,EAAOjC,GAAe,IAAM8B,EAAK,KAAK9B,EAAY,CAAC,CACxE,CAAC,EACMwB,EAAM,KAAK;AAAA,CAAI,CACxB,CAAC,EAAE,KAAK;AAAA;AAAA,EAASzB,GAAgB;AAAA;AAAA,CAAM,CACzC,CACA,SAASmC,IAAoBhC,EAAS,CACpC,IAAIiC,EAASlC,IAAYC,CAAO,EAChC,MAAO,CACL,MAAckC,GAAO,CAAC1B,IAA+ByB,EAAO,yBAAyB,EAAGP,IAAoBO,EAAO,KAAK,CAAC,EAAG,SAAUE,EAAK,CACzI,MAAO,CAAC,CAACA,EAAI,QAAQ,YAAa,EAAE,CACtC,CAAC,EAAE,KAAK;AAAA;AAAA,EAAStC,GAAgB;AAAA;AAAA,CAAM,EACvC,KAAMoC,EAAO,IACf,CACF,CACA,SAASG,GAAKD,EAAK,CACjB,OAAOA,EAAI,QAAQ,SAAU,EAAE,EAAE,QAAQ,SAAU,EAAE,CACvD,CAIA,SAASE,IAAYC,EAAO,CAE1B,IAAIC,EAAYD,EAAM,MAAM,EAAGA,EAAM,QAAQ;AAAA,CAAI,CAAC,EAClD,GAAIC,EAAU,QAAQzC,EAAY,GAAK,EACrC,MAAO,EAEX,CACA,IAAI0C,GAAiB,IAAI,OAAO,IAAM1C,GAAe,KAAM,GAAG,EAK9D,SAAS2C,IAAiBC,EAAK,CAU7B,QATIC,EAAWD,EAAI,MAAM,MAAM,EAC3B1B,EAAUoB,GAAKO,EAAS,MAAM,CAAC,EAAE,MAAMH,EAAc,EACrDI,EAAa,CAAC,EACd1B,EAAgBD,EAAID,EAAS,SAAU6B,EAAQ,CACjD,MAAO,CACL,KAAMA,EACN,KAAM,CAAC,CACT,CACF,CAAC,EACQtB,EAAI,EAAGA,EAAIoB,EAAS,OAAQpB,IAAK,CACxC,IAAIC,EAAQY,GAAKO,EAASpB,CAAC,CAAC,EAAE,MAAMiB,EAAc,EAClDI,EAAW,KAAKpB,EAAM,MAAM,CAAC,EAC7B,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAChCP,EAAOO,CAAC,IAAMP,EAAOO,CAAC,EAAE,KAAKF,CAAC,EAAIC,EAAMC,CAAC,EAE7C,CACA,MAAO,CACL,OAAQP,EACR,WAAY0B,CACd,CACF,CACA,SAASE,IAAkBX,EAAK,CAI9B,QAHIb,EAAQa,EAAI,MAAM,MAAM,EACxBY,EAAaX,GAAKd,EAAM,MAAM,CAAC,EAC/BK,EAAO,CAAC,EACH,EAAI,EAAG,EAAIL,EAAM,OAAQ,IAAK,CAGrC,IAAI0B,EAAOZ,GAAKd,EAAM,CAAC,CAAC,EACxB,GAAK0B,EAGL,KAAIxB,EAAQwB,EAAK,MAAMR,EAAc,EACjCS,EAAS,GACTC,EAAQ,OACRC,EAAU,GACV,MAAM3B,EAAM,CAAC,CAAC,GAEhB2B,EAAU,GACVF,EAASzB,EAAM,CAAC,EAChBA,EAAQA,EAAM,MAAM,CAAC,EACrBG,EAAK,CAAC,EAAI,CACR,KAAMsB,EACN,MAAO,CAAC,CACV,EACAC,EAAQvB,EAAK,CAAC,EAAE,OAEhBuB,EAAQvB,EAAK,CAAC,EAAI,CAAC,EAErB,QAASF,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAChCyB,EAAM,KAAK,CAAC1B,EAAMC,CAAC,CAAC,EAElByB,EAAM,SAAW,IACnBC,EAAUxB,EAAK,CAAC,EAAE,MAAQuB,EAAM,CAAC,EAAIvB,EAAK,CAAC,EAAIuB,EAAM,CAAC,GAE1D,CACA,MAAO,CACL,KAAMH,EACN,KAAMpB,CACR,CACF,CACA,SAASyB,IAAcjB,EAAKkB,EAAe,CACzC,IAAIC,EAASnB,EAAI,MAAM,IAAI,OAAO;AAAA,GAAQtC,GAAgB;AAAA,GAAO,GAAG,CAAC,EACjE0D,EAAY,CACd,OAAQ,CAAC,CACX,EACA,OAAO5C,EAAK2C,EAAQ,SAAUhB,EAAOkB,EAAK,CACxC,GAAInB,IAAYC,CAAK,EAAG,CACtB,IAAIL,EAASQ,IAAiBH,CAAK,EAC/BmB,EAAYJ,EAAcG,CAAG,EAC7BE,EAAUD,EAAU,QAAU,OAC9BA,IACFF,EAAUG,CAAO,EAAIH,EAAUG,CAAO,GAAK,CAAC,EAC5CH,EAAUG,CAAO,EAAED,EAAU,SAAS,EAAI,CACxC,KAAMxB,EAAO,UACf,EACAsB,EAAU,OAASA,EAAU,OAAO,OAAOtB,EAAO,MAAM,EAE5D,KAAO,CACL,IAAIA,EAASa,IAAkBR,CAAK,EACpCiB,EAAU,OAAO,KAAKtB,CAAM,CAC9B,CACF,CAAC,EACMsB,CACT,CACA,IAAII,KAAwB,SAAUC,EAAQ,CAC5CC,EAAUF,EAAUC,CAAM,EAC1B,SAASD,GAAW,CAClB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAS,UAAU,QAAU,SAAU3D,EAAS8D,EAAK,CAEnD,WAAW,UAAY,CACrBA,EAAI,eAAe,CACjB,KAAM,SACR,CAAC,CACH,CAAC,EACD,IAAIC,EAAYD,EAAI,OAAO,EACvBE,EAAQ,KAAK,MACb,KAAK,MACPD,EAAU,YAAY,KAAK,IAAI,EAEjC,IAAIE,EAAO,SAAS,cAAc,KAAK,EAEvCA,EAAK,MAAM,QAAU,8DACrBA,EAAK,MAAM,gBAAkBD,EAAM,IAAI,iBAAiB,GAAKE,EAAO,MAAM,UAE1E,IAAIrB,EAAS,SAAS,cAAc,IAAI,EACpCsB,EAAOH,EAAM,IAAI,MAAM,GAAK,CAAC,EACjCnB,EAAO,UAAYsB,EAAK,CAAC,GAAKH,EAAM,IAAI,OAAO,EAC/CnB,EAAO,MAAM,QAAU,mBACvBA,EAAO,MAAM,MAAQmB,EAAM,IAAI,WAAW,EAC1C,IAAII,EAAW,SAAS,cAAc,KAAK,EACvCC,EAAW,SAAS,cAAc,UAAU,EAChDD,EAAS,MAAM,QAAU,gBACzB,IAAIE,EAAkBN,EAAM,IAAI,iBAAiB,EAC7CO,EAAkBP,EAAM,IAAI,iBAAiB,EAC7C/B,EAASD,IAAoBhC,CAAO,EACxC,GAAWwE,GAAWF,CAAe,EAAG,CACtC,IAAIG,EAAYH,EAAgBR,EAAI,UAAU,CAAC,EACpCY,GAASD,CAAS,EAC3BL,EAAS,UAAYK,EACLE,GAAMF,CAAS,GAC/BL,EAAS,YAAYK,CAAS,CAElC,KAAO,CAELJ,EAAS,SAAWL,EAAM,IAAI,UAAU,EACxC,IAAIY,EAAQP,EAAS,MAErBO,EAAM,QAAU,8IAChBA,EAAM,MAAQZ,EAAM,IAAI,WAAW,EACnCY,EAAM,YAAcZ,EAAM,IAAI,qBAAqB,EACnDY,EAAM,gBAAkBZ,EAAM,IAAI,eAAe,EACjDK,EAAS,MAAQpC,EAAO,MACxBmC,EAAS,YAAYC,CAAQ,CAC/B,CACA,IAAIhB,EAAgBpB,EAAO,KACvB4C,EAAkB,SAAS,cAAc,KAAK,EAClDA,EAAgB,MAAM,QAAU,8CAEhC,IAAIC,EAAc,4GACdC,EAAc,SAAS,cAAc,KAAK,EAC1CC,EAAgB,SAAS,cAAc,KAAK,EAChDF,GAAe,qBAAuBd,EAAM,IAAI,aAAa,EAC7Dc,GAAe,UAAYd,EAAM,IAAI,iBAAiB,EACtD,IAAIiB,EAAO,KACX,SAASC,GAAQ,CACfnB,EAAU,YAAYE,CAAI,EAC1BgB,EAAK,KAAO,IACd,CACAE,GAAiBJ,EAAa,QAASG,CAAK,EAC5CC,GAAiBH,EAAe,QAAS,UAAY,CACnD,GAAIT,GAAmB,MAAQD,GAAmB,MAAQC,GAAmB,MAAQD,GAAmB,KAAM,CAK5GY,EAAM,EACN,MACF,CACA,IAAI3B,EACJ,GAAI,CACSiB,GAAWD,CAAe,EACnChB,EAAYgB,EAAgBH,EAAUN,EAAI,UAAU,CAAC,EAErDP,EAAYH,IAAciB,EAAS,MAAOhB,CAAa,CAE3D,OAAS+B,EAAG,CACV,MAAAF,EAAM,EACA,IAAI,MAAM,0BAA4BE,CAAC,CAC/C,CACI7B,GACFO,EAAI,eAAe,CACjB,KAAM,iBACN,UAAWP,CACb,CAAC,EAEH2B,EAAM,CACR,CAAC,EACDH,EAAY,UAAYZ,EAAK,CAAC,EAC9Ba,EAAc,UAAYb,EAAK,CAAC,EAChCa,EAAc,MAAM,QAAUD,EAAY,MAAM,QAAUD,EAC1D,CAACd,EAAM,IAAI,UAAU,GAAKa,EAAgB,YAAYG,CAAa,EACnEH,EAAgB,YAAYE,CAAW,EACvCd,EAAK,YAAYpB,CAAM,EACvBoB,EAAK,YAAYG,CAAQ,EACzBH,EAAK,YAAYY,CAAe,EAChCT,EAAS,MAAM,OAASL,EAAU,aAAe,GAAK,KACtDA,EAAU,YAAYE,CAAI,EAC1B,KAAK,KAAOA,CACd,EACAN,EAAS,UAAU,OAAS,SAAU3D,EAAS8D,EAAK,CAClD,KAAK,MAAQA,EAAI,OAAO,EAAE,YAAY,KAAK,IAAI,CACjD,EACAH,EAAS,UAAU,QAAU,SAAU3D,EAAS8D,EAAK,CACnD,KAAK,OAAO9D,EAAS8D,CAAG,CAC1B,EACAH,EAAS,iBAAmB,SAAU3D,EAAS,CAC7C,IAAIqF,EAAgB,CAClB,KAAM,GACN,SAAU,GACV,gBAAiB,KACjB,gBAAiB,KAEjB,KAAM,8GACN,MAAOrF,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,WAAY,OAAO,CAAC,EACpE,KAAMA,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,WAAY,MAAM,CAAC,EAClE,gBAAiBkE,EAAO,MAAM,WAC9B,UAAWA,EAAO,MAAM,QACxB,cAAeA,EAAO,MAAM,WAC5B,oBAAqBA,EAAO,MAAM,OAClC,YAAaA,EAAO,MAAM,SAC1B,gBAAiBA,EAAO,MAAM,SAChC,EACA,OAAOmB,CACT,EACO1B,CACT,GAAE2B,EAAc,EAIhB,SAASC,IAAmBC,EAASC,EAAc,CACjD,OAAcxE,EAAIuE,EAAS,SAAUE,EAAQlC,EAAK,CAChD,IAAImC,EAAWF,GAAgBA,EAAajC,CAAG,EAC/C,GAAWoC,GAASD,CAAQ,GAAK,CAAQE,EAAQF,CAAQ,EAAG,CAC1D,IAAIG,EAAwBF,GAASF,CAAM,GAAK,CAAQG,EAAQH,CAAM,EACjEI,IACHJ,EAAS,CACP,MAAOA,CACT,GAGF,IAAIK,EAAmBJ,EAAS,MAAQ,MAAQD,EAAO,MAAQ,KAE/D,OAAAA,EAAgBM,GAASN,EAAQC,CAAQ,EACzCI,GAAoB,OAAOL,EAAO,KAC3BA,CACT,KACE,QAAOA,CAEX,CAAC,CACH,CAEQO,GAAe,CACrB,KAAM,iBACN,MAAO,kBACP,OAAQ,kBACV,EAAG,SAAUC,EAASlG,EAAS,CAC7B,IAAImG,EAAmB,CAAC,EACjBxF,EAAKuF,EAAQ,UAAU,OAAQ,SAAUE,EAAW,CACzD,IAAIhG,EAAcJ,EAAQ,gBAAgBoG,EAAU,IAAI,EAAE,CAAC,EAC3D,GAAI,CAAChG,EAGH+F,EAAiB,KAAYE,EAAO,CAElC,KAAM,SACR,EAAGD,CAAS,CAAC,MACR,CACL,IAAIX,EAAerF,EAAY,IAAI,MAAM,EACzC+F,EAAiB,KAAK,CACpB,KAAMC,EAAU,KAChB,KAAMb,IAAmBa,EAAU,KAAMX,CAAY,CACvD,CAAC,CACH,CACF,CAAC,EACDzF,EAAQ,YAAmBgG,GAAS,CAClC,OAAQG,CACV,EAAGD,EAAQ,SAAS,CAAC,CACvB,CAAC,EACD,IAAOI,IAAQ3C,ICnZf,IAAI4C,IAAcA,EACdC,IAAQC,GAAU,EAKf,SAASC,IAAKC,EAASC,EAAa,CACzC,IAAIC,EAAkBC,GAAkBH,CAAO,EAG/CJ,IAAKK,EAAa,SAAUG,EAAWC,EAAY,CAEjD,QADIC,EAAIJ,EAAgB,OAAS,EAC1BI,GAAK,EAAGA,IAAK,CAClB,IAAIC,EAAWL,EAAgBI,CAAC,EAChC,GAAIC,EAASF,CAAU,EACrB,KAEJ,CACA,GAAIC,EAAI,EAAG,CAET,IAAIE,EAAgBR,EAAQ,gBAAgB,CAC1C,SAAU,WACV,QAAS,SACT,GAAIK,CACN,CAAC,EAAE,CAAC,EACJ,GAAIG,EAAe,CACjB,IAAIC,EAAeD,EAAc,gBAAgB,EACjDN,EAAgB,CAAC,EAAEG,CAAU,EAAI,CAC/B,WAAYA,EACZ,MAAOI,EAAa,CAAC,EACrB,IAAKA,EAAa,CAAC,CACrB,CACF,CACF,CACF,CAAC,EACDP,EAAgB,KAAKD,CAAW,CAClC,CACO,SAASS,IAAIV,EAAS,CAC3B,IAAIE,EAAkBC,GAAkBH,CAAO,EAC3CW,EAAOT,EAAgBA,EAAgB,OAAS,CAAC,EACrDA,EAAgB,OAAS,GAAKA,EAAgB,IAAI,EAElD,IAAIK,EAAW,CAAC,EAChB,OAAAX,IAAKe,EAAM,SAAUP,EAAWC,EAAY,CAC1C,QAASC,EAAIJ,EAAgB,OAAS,EAAGI,GAAK,EAAGA,IAE/C,GADAF,EAAYF,EAAgBI,CAAC,EAAED,CAAU,EACrCD,EAAW,CACbG,EAASF,CAAU,EAAID,EACvB,KACF,CAEJ,CAAC,EACMG,CACT,CACO,SAASK,IAAMZ,EAAS,CAC7BH,IAAMG,CAAO,EAAE,UAAY,IAC7B,CACO,SAASa,IAAMb,EAAS,CAC7B,OAAOG,GAAkBH,CAAO,EAAE,MACpC,CAKA,SAASG,GAAkBH,EAAS,CAClC,IAAIc,EAAQjB,IAAMG,CAAO,EACzB,OAAKc,EAAM,YACTA,EAAM,UAAY,CAAC,CAAC,CAAC,GAEhBA,EAAM,SACf,CCpEA,IAAIC,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAc,UAAU,QAAU,SAAUG,EAASC,EAAK,CAChDC,IAAMF,CAAO,EACrBC,EAAI,eAAe,CACjB,KAAM,UACN,KAAM,KAAK,GACb,CAAC,CACH,EACAJ,EAAc,iBAAmB,SAAUG,EAAS,CAClD,IAAIG,EAAgB,CAClB,KAAM,GAEN,KAAM,kLACN,MAAOH,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,UAAW,OAAO,CAAC,CACrE,EACA,OAAOG,CACT,EACON,CACT,GAAEO,EAAc,EAERC,GAAe,CACrB,KAAM,UACN,MAAO,UACP,OAAQ,kBACV,EAAG,SAAUC,EAASN,EAAS,CAC7BA,EAAQ,YAAY,UAAU,CAChC,CAAC,EACD,IAAOO,IAAQV,IC7Bf,IAAIW,IAA4B,CAAC,OAAQ,QAAS,QAAS,MAAO,QAAS,QAAS,aAAc,YAAa,MAAM,EACjHC,KAAkC,UAAY,CAMhD,SAASA,EAAmBC,EAAQC,EAASC,EAAK,CAChD,IAAIC,EAAQ,KACZ,KAAK,gBAAkB,CAAC,EACxB,IAAIC,EAAYC,IAAYJ,EAASD,CAAM,EAC3CM,EAAKC,IAAoB,SAAUC,EAASC,EAAM,EAC5C,CAACP,GAAO,CAACA,EAAI,SAAWQ,GAAQR,EAAI,QAASO,CAAI,GAAK,IACxDD,EAAQJ,EAAWD,EAAM,eAAe,CAE5C,CAAC,CACH,CACA,OAAAJ,EAAmB,UAAU,gBAAkB,SAAUY,EAAOV,EAAS,CACvE,YAAK,kBAAkBU,EAAOV,EAAS,SAAUW,EAAMC,EAAYC,EAAU,CAG3E,IAFCF,EAAK,cAAgBA,EAAK,YAAc,CAAC,IAAI,KAAKC,CAAU,EAEzD,CAACD,EAAK,WAAY,CACpBA,EAAK,WAAaC,EAMlB,IAAIE,EAASC,GAAaJ,EAAK,SAAS,EAAE,EAAGE,EAAUD,CAAU,EACjED,EAAK,cAAgB,CACnB,OAAQK,IAAcL,EAAK,SAAS,EAAEG,EAAO,OAAQH,EAAK,MAAO,CAAC,EAAG,CAAC,CAAC,EACvE,SAAUG,EAAO,QACnB,CACF,CACF,CAAC,EACMJ,CACT,EACAZ,EAAmB,UAAU,kBAAoB,SAAUY,EAAOV,EAASiB,EAAI,CAC7EZ,EAAKK,EAAO,SAAUC,EAAM,CAC1B,IAAIO,EAAa,KAAK,eAAeP,EAAMX,CAAO,EAC9CkB,GAAcA,IAAe,IAC/Bb,EAAKa,EAAW,WAAY,SAAUL,EAAU,CAC9C,IAAIC,EAASC,GAAaJ,EAAK,SAAS,EAAE,EAAGE,EAAUF,EAAK,MAAO,EAAI,EACvEM,EAAGN,EAAMG,EAAO,OAAQD,EAAUb,CAAO,CAC3C,CAAC,CAEL,EAAG,IAAI,CACT,EAMAF,EAAmB,UAAU,eAAiB,SAAUY,EAAOV,EAAS,CACtEK,EAAKK,EAAO,SAAUC,EAAM,CAC1B,IAAIO,EAAa,KAAK,eAAeP,EAAMX,CAAO,EAOlD,GAFAW,EAAK,MAAQA,EAAK,OAAS,CAAC,EAExBO,GAAcA,IAAe,GAAM,CACrCP,EAAK,QAAUO,EAAW,QAO1B,IAAIJ,EAASC,GAAaJ,EAAK,SAAS,EAAE,EAAGO,EAAW,SAAUP,EAAK,UAAU,EAC7EQ,EAAcR,EAAK,cACvBA,EAAK,MAAQQ,EAAcH,IAAcL,EAAK,SAAS,EAAEG,EAAO,OAAQK,EAAY,OAAQC,IAAUN,EAAO,SAAUK,EAAY,QAAQ,CAAC,EAAIL,EAAO,MACzJ,CACF,EAAG,IAAI,CACT,EACAhB,EAAmB,UAAU,cAAgB,SAAUuB,EAAKC,EAAqB,CAC/E,OAAOC,EAAI,KAAK,gBAAiB,SAAUL,EAAY,CACrD,IAAIM,EAAON,EAAW,aAAa,EACnC,MAAO,CACL,QAASA,EAAW,QACpB,iBAAkBI,EAAsBA,EAAoBJ,CAAU,EAAI,KAC1E,SAAsBO,GAAsBD,CAAI,EAChD,iBAA8BE,GAAyBF,EAAMH,EAAKH,EAAW,aAAa,EAC1F,0BAAuCS,GAA2BH,CAAI,CACxE,CACF,CAAC,CACH,EACA1B,EAAmB,UAAU,cAAgB,SAAUa,EAAMiB,EAAa5B,EAAS,CAGjF,IAAIkB,EAAa,KAAK,eAAeP,EAAMX,CAAO,EAClD,OAAOkB,IAAe,IAAQA,GAAcT,GAAQS,EAAW,WAAYU,EAAY,gBAAgB,GAAK,CAC9G,EAMA9B,EAAmB,UAAU,eAAiB,SAAUa,EAAMX,EAAS,CAGrE,QAFI6B,EAAiB,KAAK,gBACtB1B,EAAYC,IAAYJ,EAASW,CAAI,EAChCmB,EAAI,EAAGA,EAAID,EAAe,OAAQC,IAAK,CAC9C,IAAIZ,EAAaW,EAAeC,CAAC,EAC7BC,EAAcpB,EAAK,QACvB,GAAIoB,GACF,GAAIb,EAAW,UAAYa,EACzB,OAAOb,MAGT,SAASc,EAAI,EAAGA,EAAIC,IAAmB,OAAQD,IAC7C,GAAIC,IAAmBD,CAAC,EAAE7B,EAAWe,CAAU,EAC7C,OAAOA,CAIf,CACA,MAAO,EACT,EACOpB,CACT,GAAE,EACF,SAASoC,GAAaC,EAAQ,CAC5B,OAAAA,EAAO,CAAC,EAAIA,EAAO,CAAC,GAAKA,EAAO,QAAQ,EACjCA,CACT,CACA,SAAS/B,IAAYJ,EAASD,EAAQ,CACpC,OAAOK,GAAqBJ,EAASD,EAAQ,CAC3C,iBAAkBF,GACpB,CAAC,CACH,CACA,IAAIS,IAAqB,CACvB,KAAM,SAAUH,EAAW0B,EAAgB,CACzC,IAAIO,EAAcjC,EAAU,YACxBkC,EAAclC,EAAU,YACxBmC,EAAanC,EAAU,WAEvBoC,EAAeC,GAAc,EAC7BC,EAAW,CAAC,EACZC,EAAW,CAAC,EACZ,CAACN,GAAe,CAACC,GAAe,CAACC,IAGrCjC,EAAK+B,EAAa,SAAUO,EAAW,CACrC,IAAIC,EAAYD,EAAU,KAAK,KAAK,MACpCJ,EAAa,IAAIK,EAAU,GAAIA,CAAS,EACxCH,EAASG,EAAU,EAAE,EAAI,EAC3B,CAAC,EACDvC,EAAKgC,EAAa,SAAUM,EAAW,CACrC,IAAIC,EAAYD,EAAU,KAAK,KAAK,MACpCJ,EAAa,IAAIK,EAAU,GAAIA,CAAS,EACxCF,EAASE,EAAU,EAAE,EAAI,EAC3B,CAAC,EACDvC,EAAKiC,EAAY,SAAUM,EAAW,CACpCL,EAAa,IAAIK,EAAU,GAAIA,CAAS,EACxCH,EAASG,EAAU,EAAE,EAAI,GACzBF,EAASE,EAAU,EAAE,EAAI,EAC3B,CAAC,EACDL,EAAa,KAAK,SAAUK,EAAW,CACrC,IAAIC,EAAOD,EAAU,iBACjBE,EAAa,CAAC,EAClBzC,EAAKwC,EAAK,cAAc,EAAG,SAAUE,EAAWC,EAAO,EACjDvC,GAAQ2B,EAAaW,EAAU,QAAQ,GAAG,EAAE,KAAK,GAAK,GAAKtC,GAAQ4B,EAAaU,EAAU,QAAQ,GAAG,EAAE,KAAK,GAAK,IACnHD,EAAW,KAAKC,CAAS,CAE7B,CAAC,EACDlB,EAAe,KAAK,CAClB,QAAS,SAAWe,EAAU,GAC9B,UAAWA,EACX,cAAeA,EAEf,SAAUE,EAAW,CAAC,EACtB,WAAYA,EACZ,aAAcG,IAAkB,KAChC,cAAeR,EAASG,EAAU,EAAE,EACpC,cAAeF,EAASE,EAAU,EAAE,CACtC,CAAC,CACH,CAAC,EACH,EACA,IAAK,SAAUzC,EAAW0B,EAAgB,CACxCxB,EAAKF,EAAU,UAAW,SAAU+C,EAAU,CAC5C,IAAIrC,EAAWqC,EAAS,iBACxBrB,EAAe,KAAK,CAClB,QAAS,QAAUqB,EAAS,GAC5B,SAAUA,EACV,cAAeA,EACf,SAAUrC,EACV,WAAY,CAACA,CAAQ,EACrB,aAAcoC,IAAkB,GAClC,CAAC,CACH,CAAC,CACH,CACF,EACIhB,IAAqB,CAEzB,SAAU9B,EAAWe,EAAY,CAC/B,IAAIiC,EAAahD,EAAU,WACvBiD,EAAajD,EAAU,WACvByC,EAAYzC,EAAU,UAC1B,OAACyC,GAAaO,IAAeP,EAAYO,EAAW,KAAK,KAAK,OAC9D,CAACP,GAAaQ,IAAeR,EAAYQ,EAAW,KAAK,KAAK,OACvDR,GAAaA,IAAc1B,EAAW,SAC/C,EAEA,SAAUf,EAAWe,EAAY,CAC/B,IAAIgC,EAAW/C,EAAU,SACzB,OAAO+C,GAAYA,IAAahC,EAAW,QAC7C,CAAC,EACG+B,IAAoB,CACtB,KAAM,UAAY,CAEhB,OAAO,KAAK,SAAS,OAAO,QAAQ,EAAE,MAAM,CAC9C,EACA,IAAK,UAAY,CACf,IAAIpC,EAAW,KAAK,SAChBW,EAAOX,EAAS,gBAAgB,EAAE,MAAM,EAE5C,OAAAW,EAAK,eAAuB6B,GAAaxC,CAAQ,CAAC,EAC3CW,CACT,CACF,EACIT,GAAe,CACjB,MAAOuC,GAAMC,IAAa,CAAC,EAC3B,MAAOD,GAAMC,IAAa,CAAC,EAC3B,KAAM,SAAUC,EAAI3C,EAAU4C,EAAmBC,EAAO,CACtD,IAAIC,EAAWH,EAAK3C,EAAS,YAAY,CAAC4C,EAAkB,CAAC,EAAE,CAAC,EAAGA,EAAkB,CAAC,EAAE,CAAC,CAAC,EAAGC,CAAK,EAAI7C,EAAS,YAAY,CAAC4C,EAAkB,CAAC,EAAE,CAAC,EAAGA,EAAkB,CAAC,EAAE,CAAC,CAAC,EAAGC,CAAK,EAChLE,EAAWJ,EAAK3C,EAAS,YAAY,CAAC4C,EAAkB,CAAC,EAAE,CAAC,EAAGA,EAAkB,CAAC,EAAE,CAAC,CAAC,EAAGC,CAAK,EAAI7C,EAAS,YAAY,CAAC4C,EAAkB,CAAC,EAAE,CAAC,EAAGA,EAAkB,CAAC,EAAE,CAAC,CAAC,EAAGC,CAAK,EAChLG,EAAS,CAAC3B,GAAa,CAACyB,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAAC,EAAG1B,GAAa,CAACyB,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAAC,CAAC,EAChG,MAAO,CACL,OAAQC,EACR,SAAUA,CACZ,CACF,EACA,QAAS,SAAUL,EAAI3C,EAAU4C,EAAmBC,EAAO,CACzD,IAAII,EAAW,CAAC,CAAC,IAAU,IAAS,EAAG,CAAC,IAAU,IAAS,CAAC,EACxDD,EAAStC,EAAIkC,EAAmB,SAAUM,EAAM,CAClD,IAAIC,EAAIR,EAAK3C,EAAS,YAAYkD,EAAML,CAAK,EAAI7C,EAAS,YAAYkD,EAAML,CAAK,EACjF,OAAAI,EAAS,CAAC,EAAE,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAE,CAAC,EAAGE,EAAE,CAAC,CAAC,EAC9CF,EAAS,CAAC,EAAE,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAE,CAAC,EAAGE,EAAE,CAAC,CAAC,EAC9CF,EAAS,CAAC,EAAE,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAE,CAAC,EAAGE,EAAE,CAAC,CAAC,EAC9CF,EAAS,CAAC,EAAE,CAAC,EAAI,KAAK,IAAIA,EAAS,CAAC,EAAE,CAAC,EAAGE,EAAE,CAAC,CAAC,EACvCA,CACT,CAAC,EACD,MAAO,CACL,OAAQH,EACR,SAAUC,CACZ,CACF,CACF,EACA,SAASP,IAAYU,EAAeT,EAAI3C,EAAU4C,EAAmB,CAInE,IAAIS,EAAOrD,EAAS,QAAQ,CAAC,IAAK,GAAG,EAAEoD,CAAa,CAAC,EACjDJ,EAAS3B,GAAaX,EAAI,CAAC,EAAG,CAAC,EAAG,SAAUO,EAAG,CACjD,OAAO0B,EAAKU,EAAK,YAAYA,EAAK,aAAaT,EAAkB3B,CAAC,CAAC,EAAG,EAAI,EAAIoC,EAAK,cAAcA,EAAK,YAAYT,EAAkB3B,CAAC,CAAC,CAAC,CACzI,CAAC,CAAC,EACEgC,EAAW,CAAC,EAChB,OAAAA,EAASG,CAAa,EAAIJ,EAC1BC,EAAS,EAAIG,CAAa,EAAI,CAAC,IAAK,GAAG,EAChC,CACL,OAAQJ,EACR,SAAUC,CACZ,CACF,CACA,IAAI9C,IAAgB,CAClB,MAAOsC,GAAMa,IAAmB,CAAC,EACjC,MAAOb,GAAMa,IAAmB,CAAC,EACjC,KAAM,SAAUN,EAAQO,EAAOC,EAAQ,CACrC,MAAO,CAAC,CAACR,EAAO,CAAC,EAAE,CAAC,EAAIQ,EAAO,CAAC,EAAID,EAAM,CAAC,EAAE,CAAC,EAAGP,EAAO,CAAC,EAAE,CAAC,EAAIQ,EAAO,CAAC,EAAID,EAAM,CAAC,EAAE,CAAC,CAAC,EAAG,CAACP,EAAO,CAAC,EAAE,CAAC,EAAIQ,EAAO,CAAC,EAAID,EAAM,CAAC,EAAE,CAAC,EAAGP,EAAO,CAAC,EAAE,CAAC,EAAIQ,EAAO,CAAC,EAAID,EAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAC5K,EACA,QAAS,SAAUP,EAAQO,EAAOC,EAAQ,CACxC,OAAO9C,EAAIsC,EAAQ,SAAUE,EAAMO,EAAK,CACtC,MAAO,CAACP,EAAK,CAAC,EAAIM,EAAO,CAAC,EAAID,EAAME,CAAG,EAAE,CAAC,EAAGP,EAAK,CAAC,EAAIM,EAAO,CAAC,EAAID,EAAME,CAAG,EAAE,CAAC,CAAC,CAClF,CAAC,CACH,CACF,EACA,SAASH,IAAkBF,EAAeJ,EAAQO,EAAOC,EAAQ,CAC/D,MAAO,CAACR,EAAO,CAAC,EAAIQ,EAAOJ,CAAa,EAAIG,EAAM,CAAC,EAAGP,EAAO,CAAC,EAAIQ,EAAOJ,CAAa,EAAIG,EAAM,CAAC,CAAC,CACpG,CAIA,SAAShD,IAAUmD,EAAcC,EAAgB,CAC/C,IAAIC,EAAWC,IAAQH,CAAY,EAC/BI,EAAaD,IAAQF,CAAc,EACnCH,EAAS,CAACI,EAAS,CAAC,EAAIE,EAAW,CAAC,EAAGF,EAAS,CAAC,EAAIE,EAAW,CAAC,CAAC,EACtE,aAAMN,EAAO,CAAC,CAAC,IAAMA,EAAO,CAAC,EAAI,GACjC,MAAMA,EAAO,CAAC,CAAC,IAAMA,EAAO,CAAC,EAAI,GAC1BA,CACT,CACA,SAASK,IAAQZ,EAAU,CACzB,OAAOA,EAAW,CAACA,EAAS,CAAC,EAAE,CAAC,EAAIA,EAAS,CAAC,EAAE,CAAC,EAAGA,EAAS,CAAC,EAAE,CAAC,EAAIA,EAAS,CAAC,EAAE,CAAC,CAAC,EAAI,CAAC,IAAK,GAAG,CAClG,CACA,IAAOc,GAAQ9E,IChSf,IAAI+E,GAAcA,EACdC,IAAoBC,IAAwB,mBAAmB,EAEnE,IAAIC,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAgB,UAAU,OAAS,SAAUG,EAAcC,EAASC,EAAKC,EAAS,CAC3E,KAAK,mBACR,KAAK,iBAAmB,IAAIC,GAAgBF,EAAI,MAAM,CAAC,EACvD,KAAK,iBAAiB,GAAG,QAAgBG,GAAK,KAAK,SAAU,IAAI,CAAC,EAAE,MAAM,GAE5EC,IAAoBN,EAAcC,EAAS,KAAME,EAASD,CAAG,EAC7DK,IAAoBP,EAAcC,CAAO,CAC3C,EACAJ,EAAgB,UAAU,QAAU,SAAUI,EAASC,EAAKM,EAAM,CAChEC,IAASD,CAAI,EAAE,KAAK,IAAI,CAC1B,EACAX,EAAgB,UAAU,OAAS,SAAUI,EAASC,EAAK,CACzD,KAAK,kBAAoB,KAAK,iBAAiB,QAAQ,CACzD,EACAL,EAAgB,UAAU,QAAU,SAAUI,EAASC,EAAK,CAC1D,KAAK,kBAAoB,KAAK,iBAAiB,QAAQ,CACzD,EACAL,EAAgB,UAAU,SAAW,SAAUa,EAAY,CACzD,IAAIC,EAAQD,EAAW,MACvB,GAAI,CAACA,EAAW,OAAS,CAACC,EAAM,OAC9B,OAEF,IAAIC,EAAW,CAAC,EACZX,EAAU,KAAK,QACnB,KAAK,iBAAiB,aAAa,CAAC,CAAC,EACrC,IAAIY,EAAqB,IAAIC,GAAmBC,GAAe,KAAK,KAAK,EAAGd,EAAS,CACnF,QAAS,CAAC,MAAM,CAClB,CAAC,EACDY,EAAmB,kBAAkBF,EAAOV,EAAS,SAAUe,EAAMC,EAAYC,EAAU,CACzF,GAAIA,EAAS,OAAS,cAGtB,KAAIC,EAAYH,EAAK,UACjBG,IAAc,QAChBC,EAAS,IAAKF,EAAUD,EAAW,CAAC,CAAC,EACrCG,EAAS,IAAKF,EAAUD,EAAW,CAAC,CAAC,GAErCG,EAAS,CACP,MAAO,IACP,MAAO,GACT,EAAED,CAAS,EAAGD,EAAUD,CAAU,EAEtC,CAAC,EACOI,IAAKpB,EAASW,CAAQ,EAC9B,KAAK,oBAAoBA,CAAQ,EACjC,SAASQ,EAASE,EAASJ,EAAUK,EAAQ,CAC3C,IAAIC,EAAON,EAAS,QAAQI,CAAO,EAC/BG,EAAYD,EAAK,MACjBE,EAAgBC,EAAaL,EAASG,EAAWxB,CAAO,EAExD2B,EAAaF,EAAc,4BAA4BD,CAAS,EAAE,cAAc,GAChFG,EAAW,cAAgB,MAAQA,EAAW,cAAgB,QAChEL,EAASM,GAAW,EAAGN,EAAO,MAAM,EAAGC,EAAK,MAAM,UAAU,EAAG,EAAGI,EAAW,aAAcA,EAAW,YAAY,GAEpHF,IAAkBd,EAASc,EAAc,EAAE,EAAI,CAC7C,WAAYA,EAAc,GAC1B,WAAYH,EAAO,CAAC,EACpB,SAAUA,EAAO,CAAC,CACpB,EACF,CACA,SAASI,EAAaL,EAASG,EAAWxB,EAAS,CACjD,IAAI6B,EACJ,OAAA7B,EAAQ,cAAc,CACpB,SAAU,WACV,QAAS,QACX,EAAG,SAAU8B,EAAS,CACpB,IAAIC,EAAMD,EAAQ,aAAaT,EAASG,EAAU,cAAc,EAChEO,IAAQF,EAAQC,EAClB,CAAC,EACMD,CACT,CACF,EAEAjC,EAAgB,UAAU,oBAAsB,SAAUe,EAAU,CAClE,IAAIqB,EAAQ,CAAC,EAEbC,GAAKtB,EAAU,SAAUuB,EAAWC,EAAY,CAC9CH,EAAM,KAAYI,GAAMF,CAAS,CAAC,CACpC,CAAC,EACDF,EAAM,QAAU,KAAK,IAAI,eAAe,CACtC,KAAM,WACN,KAAM,KAAK,IACX,MAAOA,CACT,CAAC,CACH,EACApC,EAAgB,iBAAmB,SAAUI,EAAS,CACpD,IAAIqC,EAAgB,CAClB,KAAM,GACN,WAAY,SAEZ,KAAM,CACJ,KAAM,wDACN,KAAM,2DACR,EAEA,MAAOrC,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,WAAY,OAAO,CAAC,EACpE,WAAY,CACV,YAAa,EACb,MAAOsC,EAAO,MAAM,cACtB,CACF,EACA,OAAOD,CACT,EACOzC,CACT,GAAE2C,EAAc,EACZ/B,IAAW,CACb,KAAM,UAAY,CAChB,IAAIgC,EAAa,CAAC,KAAK,cACvB,KAAK,IAAI,eAAe,CACtB,KAAM,mBACN,IAAK,iBACL,qBAAsBA,CACxB,CAAC,CACH,EACA,KAAM,UAAY,CAChB,KAAK,oBAA4BC,IAAI,KAAK,OAAO,CAAC,CACpD,CACF,EACA,SAAS3B,GAAe4B,EAAgB,CACtC,IAAIC,EAAU,CACZ,WAAYD,EAAe,IAAI,aAAc,EAAI,EACjD,WAAYA,EAAe,IAAI,aAAc,EAAI,EACjD,QAASA,EAAe,IAAI,UAAW,EAAI,EAC3C,QAASA,EAAe,IAAI,UAAW,EAAI,CAC7C,EAKA,OAAIC,EAAQ,YAAc,MAAQA,EAAQ,SAAW,OACnDA,EAAQ,WAAa,OAEnBA,EAAQ,YAAc,MAAQA,EAAQ,SAAW,OACnDA,EAAQ,WAAa,OAEhBA,CACT,CACA,SAASrC,IAAoBP,EAAcC,EAAS,CAClDD,EAAa,cAAc,OAAgB6C,IAAM5C,CAAO,EAAI,EAAI,WAAa,QAAQ,CACvF,CACA,SAASK,IAAoBN,EAAcC,EAAS6C,EAAM3C,EAASD,EAAK,CACtE,IAAI6C,EAAaD,EAAK,cAClB3C,GAAWA,EAAQ,OAAS,qBAC9B4C,EAAa5C,EAAQ,MAAQ,iBAAmBA,EAAQ,qBAAuB,IAEjF2C,EAAK,cAAgBC,EACrB/C,EAAa,cAAc,OAAQ+C,EAAa,WAAa,QAAQ,EACrE,IAAIlC,EAAqB,IAAIC,GAAmBC,GAAef,CAAY,EAAGC,EAAS,CACrF,QAAS,CAAC,MAAM,CAClB,CAAC,EACG+C,EAASnC,EAAmB,cAAcX,EAAK,SAAU+C,EAAY,CACvE,OAAOA,EAAW,eAAiB,CAACA,EAAW,cAAgB,QAAU,CAACA,EAAW,eAAiBA,EAAW,cAAgB,QAAU,MAC7I,CAAC,EACDH,EAAK,iBAAiB,UAAUE,CAAM,EAAE,YAAYD,GAAcC,EAAO,OAAS,CAChF,UAAW,OACX,WAAYhD,EAAa,SAAS,YAAY,EAAE,aAAa,CAC/D,EAAI,EAAK,CACX,CACAkD,IAA8B,WAAY,SAAUjD,EAAS,CAC3D,IAAIkD,EAAelD,EAAQ,aAAa,UAAW,CAAC,EAChDmD,EAAsB,CAAC,UAAW,UAAU,EAChD,GAAI,CAACD,GAAgBA,EAAa,IAAIC,CAAmB,GAAK,KAC5D,OAEF,IAAIT,EAAiBQ,EAAa,SAASC,CAAmB,EAC1DC,EAAY,CAAC,EACbC,EAASvC,GAAe4B,CAAc,EACtCY,EAAeC,GAAYvD,EAASqD,CAAM,EAC9CpB,GAAKqB,EAAa,YAAa,SAAU9B,EAAW,CAClD,OAAOgC,EAAqBhC,EAAW,QAAS,YAAY,CAC9D,CAAC,EACDS,GAAKqB,EAAa,YAAa,SAAU9B,EAAW,CAClD,OAAOgC,EAAqBhC,EAAW,QAAS,YAAY,CAC9D,CAAC,EACD,SAASgC,EAAqBhC,EAAWiC,EAAcC,EAAmB,CACxE,IAAIC,EAAYnC,EAAU,eACtBoC,EAAS,CACX,KAAM,SACN,aAAc,GAEd,WAAYlB,EAAe,IAAI,aAAc,EAAI,GAAK,SAEtD,GAAImB,IAAoBJ,EAAeE,CACzC,EACAC,EAAOF,CAAiB,EAAIC,EAC5BP,EAAU,KAAKQ,CAAM,CACvB,CACA,OAAOR,CACT,CAAC,EACD,IAAOU,IAAQlE,ICrMR,SAASmE,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAY,EAC7CD,EAAU,sBAAsBE,GAAW,EAC3CC,GAAgB,cAAeC,GAAW,EAC1CD,GAAgB,YAAaE,GAAS,EACtCF,GAAgB,WAAYG,GAAQ,EACpCH,GAAgB,WAAYI,GAAQ,EACpCJ,GAAgB,UAAWK,GAAO,EAClCC,GAAIV,GAAqB,CAC3B,CCjBA,IAAIW,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,KAAO,UACpBA,EAAa,aAAe,CAAC,aAAa,EAC1CA,EAAa,cAAgB,CAE3B,EAAG,GACH,KAAM,GAEN,YAAa,GAGb,QAAS,OAET,UAAW,kBACX,kBAAmB,GACnB,WAAY,OAIZ,QAAS,KACT,UAAW,EACX,UAAW,IAEX,mBAAoB,GACpB,kBAAmB,GACnB,UAAW,GACX,gBAAiBI,EAAO,MAAM,UAE9B,WAAY,GACZ,YAAa,oBACb,cAAe,EACf,cAAe,EAEf,aAAc,EAEd,YAAa,EACb,mBAAoBA,EAAO,MAAM,OAIjC,QAAS,KAET,aAAc,GAEd,YAAa,CAGX,KAAM,OAKN,KAAM,OACN,UAAW,OACX,wBAAyB,IACzB,sBAAuB,iBACvB,WAAY,CACV,MAAOA,EAAO,MAAM,YACpB,MAAO,EACP,KAAM,SAEN,UAAW,CAAC,CACd,CAGF,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,SAAU,EACZ,CACF,EACOJ,CACT,GAAEK,EAAc,EACTC,IAAQN,IC/ER,SAASO,GAAqBC,EAAc,CACjD,IAAIC,EAAgBD,EAAa,IAAI,SAAS,EAC9C,OAAOC,GAAiB,KAAO,CAAC,CAACA,EAE/BD,EAAa,IAAI,YAAY,IAAM,UACvC,CACA,SAASE,IAAUC,EAAY,CAC7B,GAAKC,GAAI,cAIT,QADIC,EAAQ,SAAS,gBAAgB,MAC5BC,EAAI,EAAGC,EAAMJ,EAAW,OAAQG,EAAIC,EAAKD,IAChD,GAAIH,EAAWG,CAAC,IAAKD,EACnB,OAAOF,EAAWG,CAAC,EAGzB,CACO,IAAIE,GAAmBN,IAAU,CAAC,YAAa,kBAAmB,aAAc,eAAgB,aAAa,CAAC,EAC1GO,IAAoBP,IAAU,CAAC,mBAAoB,aAAc,cAAe,gBAAiB,cAAc,CAAC,EACpH,SAASQ,GAAkBC,EAAaC,EAAW,CACxD,GAAI,CAACD,EACH,OAAOC,EAETA,EAAYC,GAAYD,EAAW,EAAI,EACvC,IAAIE,EAAMH,EAAY,QAAQC,CAAS,EACvC,OAAAD,EAAcG,IAAQ,GAAKF,EAAY,IAAMD,EAAY,MAAM,EAAGG,CAAG,EAAI,IAAMF,EACxED,EAAY,YAAY,CACjC,CACO,SAASI,IAAiBC,EAAIX,EAAO,CAC1C,IAAIY,EAAMD,EAAG,cAAgB,SAAS,aAAe,SAAS,YAAY,iBAAiBA,CAAE,EAC7F,OAAOC,EAAMZ,EAAQY,EAAIZ,CAAK,EAAIY,EAAM,IAC1C,CC1BA,IAAIC,IAAwBC,GAAkBC,IAAmB,YAAY,EACzEC,GAAuBF,GAAkBG,GAAkB,WAAW,EAEtEC,IAAW,0FAA4FC,GAAI,qBAAuB,yBAA2B,IACjK,SAASC,IAAUC,EAAK,CACtB,OAAAA,EAAMA,IAAQ,OAAS,QAAUA,IAAQ,QAAU,OAASA,IAAQ,MAAQ,SAAW,MAChFA,CACT,CACA,SAASC,IAAcC,EAAcC,EAAaC,EAAe,CAC/D,GAAI,CAACC,GAASD,CAAa,GAAKA,IAAkB,SAChD,MAAO,GAET,IAAIE,EAAkBJ,EAAa,IAAI,iBAAiB,EACpDK,EAAcL,EAAa,IAAI,aAAa,EAChDC,EAAcK,GAAqBL,CAAW,EAC9C,IAAIM,EAAWV,IAAUK,CAAa,EAClCM,EAAY,KAAK,IAAI,KAAK,MAAMH,CAAW,EAAI,IAAK,CAAC,EACrDI,EAAgB,GAChBC,EAAiBjB,GAAuB,IACxCkB,EACAC,GAAQ,CAAC,OAAQ,OAAO,EAAGL,CAAQ,EAAI,IACzCE,GAAiB,UACjBC,GAAkB,4BAA8BC,EAAYJ,IAAa,OAAS,KAAO,KAAO,SAEhGE,GAAiB,WACjBC,GAAkB,4BAA8BC,EAAYJ,IAAa,MAAQ,IAAM,IAAM,QAE/F,IAAIM,EAAeF,EAAY,KAAK,GAAK,IACrCG,EAAUN,EAAYH,EACtBU,EAAYD,EAAU,KAAK,IAAI,KAAK,IAAID,CAAY,CAAC,EAAIC,EAAU,KAAK,IAAI,KAAK,IAAID,CAAY,CAAC,EAClGG,EAAc,KAAK,QAAQD,EAAY,KAAK,MAAQV,GAAe,EAAI,KAAK,MAAQA,GAAeU,EAAYD,GAAW,GAAK,GAAG,EAAI,IAC1IL,GAAiB,IAAMF,EAAW,KAAOS,EAAc,KACvD,IAAIC,EAAchB,EAAc,UAAYI,EAAc,MACtDa,EAAW,CAAC,2BAA6BV,EAAY,aAAeA,EAAY,iBAAkBC,EAAgB,IAAMC,EAAiB,IAAK,iBAAmBO,EAAa,gBAAkBA,EAAa,oBAAsBb,EAAkB,GAAG,EAC5P,MAAO,eAAkBc,EAAS,KAAK,EAAE,EAAI,UAC/C,CACA,SAASC,IAAmBC,EAAUC,EAAoBC,EAAyB,CACjF,IAAIC,EAAkB,8BAClBC,EAAmB,GACnBC,EAAiB,GACrB,OAAIH,IACFE,EAAmB,IAAMJ,EAAW,EAAI,KAAOG,EAC/CE,EAAiB,UAAYD,EAAmB,cAAgBA,GAE7DH,IACHG,EAAmB,IAAMJ,EAAW,KAAOG,EAC3CE,IAAmBA,EAAe,OAAS,IAAM,KAAO7B,GAAI,mBAAqB,GAAKH,GAAuB+B,EAAmB,QAAUA,EAAmB,OAASA,IAEjKlC,IAAwB,IAAMmC,CACvC,CACA,SAASC,IAAkBC,EAAGC,EAAGC,EAAU,CAGzC,IAAIC,EAAKH,EAAE,QAAQ,CAAC,EAAI,KACpBI,EAAKH,EAAE,QAAQ,CAAC,EAAI,KAExB,GAAI,CAAChC,GAAI,mBACP,OAAOiC,EAAW,OAASE,EAAK,SAAWD,EAAK,IAAM,CAAC,CAAC,MAAOC,CAAE,EAAG,CAAC,OAAQD,CAAE,CAAC,EAGlF,IAAIE,EAAOpC,GAAI,qBACXqC,EAAY,aAAeD,EAAO,KAAO,IAAM,IAAMF,EAAK,IAAMC,GAAMC,EAAO,KAAO,IAAM,IAC9F,OAAOH,EAAW,gBAAkBpC,GAAuB,IAAMwC,EAAY,IAAM,CAAC,CAAC,MAAO,CAAC,EAAG,CAAC,OAAQ,CAAC,EAAG,CAACvC,GAAkBuC,CAAS,CAAC,CAC5I,CAMA,SAASC,IAAaC,EAAgB,CACpC,IAAIC,EAAU,CAAC,EACXC,EAAWF,EAAe,IAAI,UAAU,EACxCG,EAAQH,EAAe,aAAa,EACxCG,GAASF,EAAQ,KAAK,SAAWE,CAAK,EACtCF,EAAQ,KAAK,QAAUD,EAAe,QAAQ,CAAC,EAE/C,IAAII,EAAaC,GAAUL,EAAe,IAAI,YAAY,EAAG,KAAK,MAAME,EAAW,EAAI,CAAC,CAAC,EACzFA,GAAYD,EAAQ,KAAK,eAAiBG,EAAa,IAAI,EAC3D,IAAIE,EAAcN,EAAe,IAAI,iBAAiB,EAClDO,EAAaP,EAAe,IAAI,gBAAgB,GAAK,EACrDQ,EAAgBR,EAAe,IAAI,mBAAmB,GAAK,EAC3DS,EAAgBT,EAAe,IAAI,mBAAmB,GAAK,EAC/D,OAAAM,GAAeC,GAAcN,EAAQ,KAAK,eAAiBO,EAAgB,MAAQC,EAAgB,MAAQF,EAAa,MAAQD,CAAW,EAC3II,EAAK,CAAC,aAAc,OAAO,EAAG,SAAUC,EAAM,CAC5C,IAAIC,EAAMZ,EAAe,IAAIW,CAAI,EACjCC,GAAOX,EAAQ,KAAK,QAAUU,EAAO,IAAMC,CAAG,CAChD,CAAC,EACMX,EAAQ,KAAK,GAAG,CACzB,CACA,SAASY,IAAgBhD,EAAciD,EAAkB5B,EAAoBC,EAAyB,CACpG,IAAIc,EAAU,CAAC,EACXc,EAAqBlD,EAAa,IAAI,oBAAoB,EAC1DI,EAAkBJ,EAAa,IAAI,iBAAiB,EACpD0C,EAAa1C,EAAa,IAAI,YAAY,EAC1CyC,EAAczC,EAAa,IAAI,aAAa,EAC5C2C,EAAgB3C,EAAa,IAAI,eAAe,EAChD4C,EAAgB5C,EAAa,IAAI,eAAe,EAChDmC,EAAiBnC,EAAa,SAAS,WAAW,EAClDmD,EAAUC,GAA2BpD,EAAc,MAAM,EACzDqD,EAAYV,EAAgB,MAAQC,EAAgB,MAAQF,EAAa,MAAQD,EACrF,OAAAL,EAAQ,KAAK,cAAgBiB,CAAS,EAEtCJ,GAAoBC,EAAqB,GAAKd,EAAQ,KAAKjB,IAAmB+B,EAAoB7B,EAAoBC,CAAuB,CAAC,EAC1IlB,GACFgC,EAAQ,KAAK,oBAAsBhC,CAAe,EAGpDyC,EAAK,CAAC,QAAS,QAAS,QAAQ,EAAG,SAAUC,EAAM,CACjD,IAAIQ,EAAa,UAAYR,EACzBS,EAAYC,GAAYF,CAAU,EAClCP,EAAM/C,EAAa,IAAIuD,CAAS,EACpCR,GAAO,MAAQX,EAAQ,KAAKkB,EAAa,IAAMP,GAAOD,IAAS,QAAU,GAAK,KAAK,CACrF,CAAC,EAEDV,EAAQ,KAAKF,IAAaC,CAAc,CAAC,EAErCgB,GAAW,MACbf,EAAQ,KAAK,WAAaqB,GAAkBN,CAAO,EAAE,KAAK,KAAK,EAAI,IAAI,EAElEf,EAAQ,KAAK,GAAG,EAAI,GAC7B,CAEA,SAASsB,IAAeC,EAAKC,EAAIC,EAAWC,EAAKC,EAAK,CACpD,IAAIC,EAAYJ,GAAMA,EAAG,QACzB,GAAIC,EAAW,CACb,IAAII,EAAiBD,GAAaA,EAAU,gBAAgB,EACxDC,GAEFC,IAAoBP,EAAKM,EAAgBJ,EAAWC,EAAKC,CAAG,CAEhE,KAAO,CACLJ,EAAI,CAAC,EAAIG,EACTH,EAAI,CAAC,EAAII,EAIT,IAAII,EAAqBH,GAAaA,EAAU,sBAAsB,EAClEG,IACFR,EAAI,CAAC,GAAKQ,EAAmB,WAC7BR,EAAI,CAAC,GAAKQ,EAAmB,UAEjC,CACAR,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIC,EAAG,SAAS,EAC9BD,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIC,EAAG,UAAU,CACjC,CACA,IAAIQ,KAAkC,UAAY,CAChD,SAASA,EAAmBC,EAAKC,EAAK,CAOpC,GANA,KAAK,MAAQ,GACb,KAAK,YAAc,CAAC,EAAG,EAAG,EAAG,CAAC,EAC9B,KAAK,WAAa,GAClB,KAAK,mBAAqB,GAC1B,KAAK,WAAa,GAClB,KAAK,UAAY,GACb1E,GAAI,IACN,OAAO,KAET,IAAI2E,EAAK,SAAS,cAAc,KAAK,EAErCA,EAAG,cAAgB,GACnB,KAAK,GAAKA,EACV,IAAIX,EAAK,KAAK,IAAMS,EAAI,MAAM,EAC1BG,EAAWF,EAAI,SACfT,EAAYW,IAAarE,GAASqE,CAAQ,EAAI,SAAS,cAAcA,CAAQ,EAAIC,GAAMD,CAAQ,EAAIA,EAAWE,GAAWF,CAAQ,GAAKA,EAASH,EAAI,OAAO,CAAC,GAC/JX,IAAe,KAAK,YAAaE,EAAIC,EAAWQ,EAAI,SAAS,EAAI,EAAGA,EAAI,UAAU,EAAI,CAAC,GACtFR,GAAaQ,EAAI,OAAO,GAAG,YAAYE,CAAE,EAC1C,KAAK,KAAOF,EACZ,KAAK,WAAaR,EAIlB,IAAIc,EAAO,KACXJ,EAAG,aAAe,UAAY,CAExBI,EAAK,aACP,aAAaA,EAAK,YAAY,EAC9BA,EAAK,MAAQ,IAEfA,EAAK,WAAa,EACpB,EACAJ,EAAG,YAAc,SAAUK,EAAG,CAE5B,GADAA,EAAIA,GAAK,OAAO,MACZ,CAACD,EAAK,WAAY,CAOpB,IAAIE,EAAUjB,EAAG,QACbK,EAAiBL,EAAG,QAAQ,gBAAgB,EAChDkB,GAAeb,EAAgBW,EAAG,EAAI,EACtCC,EAAQ,SAAS,YAAaD,CAAC,CACjC,CACF,EACAL,EAAG,aAAe,UAAY,CAE5BI,EAAK,WAAa,GACdA,EAAK,YACHA,EAAK,OACPA,EAAK,UAAUA,EAAK,UAAU,CAGpC,CACF,CAIA,OAAAP,EAAmB,UAAU,OAAS,SAAUpE,EAAc,CAG5D,GAAI,CAAC,KAAK,WAAY,CACpB,IAAI6D,EAAY,KAAK,KAAK,OAAO,EAC7BkB,EAAWC,IAAiBnB,EAAW,UAAU,EACjDoB,EAAWpB,EAAU,MACrBoB,EAAS,WAAa,YAAcF,IAAa,aACnDE,EAAS,SAAW,WAExB,CAEA,IAAIC,EAAoBlF,EAAa,IAAI,mBAAmB,EAC5DkF,GAAqB,KAAK,eAAe,EAEzC,KAAK,mBAAqBA,EAC1B,KAAK,yBAA2BlF,EAAa,IAAI,mBAAmB,GAAKA,EAAa,IAAI,oBAAoB,EAAI,EAElH,KAAK,GAAG,UAAYA,EAAa,IAAI,WAAW,GAAK,EAIvD,EACAoE,EAAmB,UAAU,KAAO,SAAUpE,EAAcmF,EAAgB,CAC1E,aAAa,KAAK,YAAY,EAC9B,aAAa,KAAK,gBAAgB,EAClC,IAAIZ,EAAK,KAAK,GACVa,EAAQb,EAAG,MACXc,EAAa,KAAK,YACjBd,EAAG,UAGNa,EAAM,QAAUzF,IAAWqD,IAAgBhD,EAAc,CAAC,KAAK,WAAY,KAAK,UAAW,KAAK,wBAAwB,EAEtH0B,IAAkB2D,EAAW,CAAC,EAAGA,EAAW,CAAC,EAAG,EAAI,GAAK,gBAAkB/E,GAAqB6E,CAAc,EAAI,MAAQnF,EAAa,IAAI,cAAc,GAAK,KAM7J,oBAAsB,KAAK,WAAa,OAAS,SAVpDoF,EAAM,QAAU,OAYlB,KAAK,MAAQ,GACb,KAAK,WAAa,GAClB,KAAK,UAAY,EACnB,EACAhB,EAAmB,UAAU,WAAa,SAAUkB,EAASC,EAASvF,EAAcC,EAAaC,EAAe,CAC9G,IAAIqE,EAAK,KAAK,GACd,GAAIe,GAAW,KAAM,CACnBf,EAAG,UAAY,GACf,MACF,CACA,IAAIiB,EAAQ,GAIZ,GAHIrF,GAASD,CAAa,GAAKF,EAAa,IAAI,SAAS,IAAM,QAAU,CAACyF,GAAqBzF,CAAY,IACzGwF,EAAQzF,IAAcC,EAAcC,EAAaC,CAAa,GAE5DC,GAASmF,CAAO,EAClBf,EAAG,UAAYe,EAAUE,UAChBF,EAAS,CAElBf,EAAG,UAAY,GACVmB,EAAQJ,CAAO,IAClBA,EAAU,CAACA,CAAO,GAEpB,QAASK,EAAI,EAAGA,EAAIL,EAAQ,OAAQK,IAC9BlB,GAAMa,EAAQK,CAAC,CAAC,GAAKL,EAAQK,CAAC,EAAE,aAAepB,GACjDA,EAAG,YAAYe,EAAQK,CAAC,CAAC,EAI7B,GAAIH,GAASjB,EAAG,WAAW,OAAQ,CAGjC,IAAIqB,EAAU,SAAS,cAAc,KAAK,EAC1CA,EAAQ,UAAYJ,EACpBjB,EAAG,YAAYqB,CAAO,CACxB,CACF,CACF,EACAxB,EAAmB,UAAU,aAAe,SAAUyB,EAAW,CAC/D,KAAK,WAAaA,CACpB,EACAzB,EAAmB,UAAU,QAAU,UAAY,CACjD,IAAIG,EAAK,KAAK,GACd,OAAOA,EAAK,CAACA,EAAG,YAAaA,EAAG,YAAY,EAAI,CAAC,EAAG,CAAC,CACvD,EACAH,EAAmB,UAAU,OAAS,SAAUN,EAAKC,EAAK,CACxD,GAAK,KAAK,GAGV,KAAIsB,EAAa,KAAK,YAEtB,GADA3B,IAAe2B,EAAY,KAAK,IAAK,KAAK,WAAYvB,EAAKC,CAAG,EAC1DsB,EAAW,CAAC,GAAK,MAAQA,EAAW,CAAC,GAAK,KAAM,CAClD,IAAIS,EAAU,KAAK,GAAG,MAClBC,EAAarE,IAAkB2D,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,EAC/DxC,EAAKkD,EAAY,SAAUC,EAAW,CACpCF,EAAQE,EAAU,CAAC,CAAC,EAAIA,EAAU,CAAC,CACrC,CAAC,CACH,EACF,EAKA5B,EAAmB,UAAU,eAAiB,UAAY,CAExD,IAAI6B,EAAS,KAAK,YAAY,CAAC,EAE3BC,EAAS,KAAK,YAAY,CAAC,EAC/B,KAAK,OAAOD,EAAS,KAAK,IAAI,SAAS,EAAGC,EAAS,KAAK,IAAI,UAAU,CAAC,CACzE,EACA9B,EAAmB,UAAU,KAAO,UAAY,CAC9C,IAAI+B,EAAQ,KACRf,EAAQ,KAAK,GAAG,MAChB,KAAK,0BACPA,EAAM,WAAa,SACnBA,EAAM,QAAU,KAEhBA,EAAM,QAAU,OAElBxF,GAAI,uBAAyBwF,EAAM,WAAa,IAChD,KAAK,MAAQ,GACb,KAAK,iBAAmB,WAAW,UAAY,CAC7C,OAAOe,EAAM,UAAY,EAC3B,EAAG,GAAG,CACR,EACA/B,EAAmB,UAAU,UAAY,SAAUgC,EAAM,CACnD,KAAK,OAAS,EAAE,KAAK,YAAc,KAAK,aAAe,CAAC,KAAK,qBAC3DA,GACF,KAAK,WAAaA,EAElB,KAAK,MAAQ,GACb,KAAK,aAAe,WAAWC,GAAK,KAAK,KAAM,IAAI,EAAGD,CAAI,GAE1D,KAAK,KAAK,EAGhB,EACAhC,EAAmB,UAAU,OAAS,UAAY,CAChD,OAAO,KAAK,KACd,EACAA,EAAmB,UAAU,QAAU,UAAY,CACjD,aAAa,KAAK,YAAY,EAC9B,aAAa,KAAK,gBAAgB,EAClC,IAAIR,EAAK,KAAK,IACd0C,IAAyB1C,GAAMA,EAAG,SAAWA,EAAG,QAAQ,gBAAgB,EAAG,KAAK,UAAU,EAC1F,IAAIW,EAAK,KAAK,GACd,GAAIA,EAAI,CACNA,EAAG,aAAeA,EAAG,YAAcA,EAAG,aAAe,KACrD,IAAIgC,EAAahC,EAAG,WACpBgC,GAAcA,EAAW,YAAYhC,CAAE,CACzC,CACA,KAAK,GAAK,KAAK,WAAa,IAC9B,EACOH,CACT,GAAE,EACKoC,IAAQpC,IC/Wf,IAAIqC,KAAkC,UAAY,CAChD,SAASA,EAAmBC,EAAK,CAC/B,KAAK,MAAQ,GACb,KAAK,YAAc,CAAC,EAAG,EAAG,EAAG,CAAC,EAC9B,KAAK,mBAAqB,GAC1B,KAAK,WAAa,GAClB,KAAK,IAAMA,EAAI,MAAM,EACrBC,IAAe,KAAK,YAAa,KAAK,IAAKD,EAAI,SAAS,EAAI,EAAGA,EAAI,UAAU,EAAI,CAAC,CACpF,CAIA,OAAAD,EAAmB,UAAU,OAAS,SAAUG,EAAc,CAC5D,IAAIC,EAAoBD,EAAa,IAAI,mBAAmB,EAC5DC,GAAqB,KAAK,eAAe,EAEzC,KAAK,mBAAqBA,CAC5B,EACAJ,EAAmB,UAAU,KAAO,UAAY,CAC1C,KAAK,cACP,aAAa,KAAK,YAAY,EAEhC,KAAK,GAAG,KAAK,EACb,KAAK,MAAQ,EACf,EAIAA,EAAmB,UAAU,WAAa,SAAUK,EAASC,EAAoBH,EAAcI,EAAaC,EAAe,CACzH,IAAIC,EAAQ,KACDC,GAASL,CAAO,GACzBM,GAA0H,EAAE,EAE1H,KAAK,IACP,KAAK,IAAI,OAAO,KAAK,EAAE,EAEzB,IAAIC,EAAiBT,EAAa,SAAS,WAAW,EACtD,KAAK,GAAK,IAAIU,GAAO,CACnB,MAAO,CACL,KAAMP,EAAmB,eACzB,KAAMD,EACN,WAAY,GACZ,YAAa,EACb,YAAaE,EACb,gBAAiBK,EAAe,IAAI,iBAAiB,EACrD,KAAMT,EAAa,IAAI,CAAC,YAAa,OAAO,CAAC,EAC7C,QAASW,GAA2BX,EAAc,UAAU,EAC5D,cAAe,MACf,MAAO,MACT,EACA,EAAGA,EAAa,IAAI,GAAG,CACzB,CAAC,EACMY,EAAK,CAAC,kBAAmB,eAAgB,cAAe,aAAc,gBAAiB,eAAe,EAAG,SAAUC,EAAU,CAClIP,EAAM,GAAG,MAAMO,CAAQ,EAAIb,EAAa,IAAIa,CAAQ,CACtD,CAAC,EACMD,EAAK,CAAC,iBAAkB,oBAAqB,mBAAmB,EAAG,SAAUC,EAAU,CAC5FP,EAAM,GAAG,MAAMO,CAAQ,EAAIJ,EAAe,IAAII,CAAQ,GAAK,CAC7D,CAAC,EACD,KAAK,IAAI,IAAI,KAAK,EAAE,EACpB,IAAIC,EAAO,KACX,KAAK,GAAG,GAAG,YAAa,UAAY,CAE9BA,EAAK,aACP,aAAaA,EAAK,YAAY,EAC9BA,EAAK,MAAQ,IAEfA,EAAK,WAAa,EACpB,CAAC,EACD,KAAK,GAAG,GAAG,WAAY,UAAY,CAC7BA,EAAK,YACHA,EAAK,OACPA,EAAK,UAAUA,EAAK,UAAU,EAGlCA,EAAK,WAAa,EACpB,CAAC,CACH,EACAjB,EAAmB,UAAU,aAAe,SAAUkB,EAAW,CAC/D,KAAK,WAAaA,CACpB,EACAlB,EAAmB,UAAU,QAAU,UAAY,CACjD,IAAImB,EAAK,KAAK,GACVC,EAAW,KAAK,GAAG,gBAAgB,EAGnCC,EAAkBC,IAAoBH,EAAG,KAAK,EAClD,MAAO,CAACC,EAAS,MAAQC,EAAgB,KAAOA,EAAgB,MAAOD,EAAS,OAASC,EAAgB,IAAMA,EAAgB,MAAM,CACvI,EACArB,EAAmB,UAAU,OAAS,SAAUuB,EAAGC,EAAG,CACpD,IAAIL,EAAK,KAAK,GACd,GAAIA,EAAI,CACN,IAAIM,EAAa,KAAK,YACtBvB,IAAeuB,EAAY,KAAK,IAAKF,EAAGC,CAAC,EACzCD,EAAIE,EAAW,CAAC,EAChBD,EAAIC,EAAW,CAAC,EAChB,IAAIC,EAAQP,EAAG,MACXQ,EAAcC,GAAaF,EAAM,aAAe,CAAC,EACjDL,EAAkBC,IAAoBI,CAAK,EAE/CP,EAAG,EAAII,EAAII,EAAcN,EAAgB,KACzCF,EAAG,EAAIK,EAAIG,EAAcN,EAAgB,IACzCF,EAAG,WAAW,CAChB,CACF,EAKAnB,EAAmB,UAAU,eAAiB,UAAY,CAExD,IAAI6B,EAAS,KAAK,YAAY,CAAC,EAE3BC,EAAS,KAAK,YAAY,CAAC,EAC/B,KAAK,OAAOD,EAAS,KAAK,IAAI,SAAS,EAAGC,EAAS,KAAK,IAAI,UAAU,CAAC,CACzE,EACA9B,EAAmB,UAAU,KAAO,UAAY,CAC1C,KAAK,IACP,KAAK,GAAG,KAAK,EAEf,KAAK,MAAQ,EACf,EACAA,EAAmB,UAAU,UAAY,SAAU+B,EAAM,CACnD,KAAK,OAAS,EAAE,KAAK,YAAc,KAAK,aAAe,CAAC,KAAK,qBAC3DA,GACF,KAAK,WAAaA,EAElB,KAAK,MAAQ,GACb,KAAK,aAAe,WAAkBC,GAAK,KAAK,KAAM,IAAI,EAAGD,CAAI,GAEjE,KAAK,KAAK,EAGhB,EACA/B,EAAmB,UAAU,OAAS,UAAY,CAChD,OAAO,KAAK,KACd,EACAA,EAAmB,UAAU,QAAU,UAAY,CACjD,KAAK,IAAI,OAAO,KAAK,EAAE,CACzB,EACOA,CACT,GAAE,EACF,SAAS4B,GAAaK,EAAK,CACzB,OAAO,KAAK,IAAI,EAAGA,CAAG,CACxB,CACA,SAASX,IAAoBI,EAAO,CAClC,IAAIQ,EAAaN,GAAaF,EAAM,YAAc,CAAC,EAC/CS,EAAgBP,GAAaF,EAAM,eAAiB,CAAC,EACrDU,EAAgBR,GAAaF,EAAM,eAAiB,CAAC,EACzD,MAAO,CACL,KAAME,GAAaM,EAAaC,CAAa,EAC7C,MAAOP,GAAaM,EAAaC,CAAa,EAC9C,IAAKP,GAAaM,EAAaE,CAAa,EAC5C,OAAQR,GAAaM,EAAaE,CAAa,CACjD,CACF,CACA,SAASlC,IAAemC,EAAKC,EAAIC,EAAKC,EAAK,CACzCH,EAAI,CAAC,EAAIE,EACTF,EAAI,CAAC,EAAIG,EACTH,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIC,EAAG,SAAS,EAC9BD,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIC,EAAG,UAAU,CACjC,CACA,IAAOG,IAAQzC,IC9If,IAAI0C,IAAY,IAAIC,GAAK,CACvB,MAAO,CACL,EAAG,GACH,EAAG,GACH,MAAO,EACP,OAAQ,CACV,CACF,CAAC,EACGC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KAClBG,CACT,CACA,OAAAH,EAAY,UAAU,KAAO,SAAUI,EAASC,EAAK,CACnD,GAAI,EAAAC,GAAI,MAAQ,CAACD,EAAI,OAAO,GAG5B,KAAIE,EAAeH,EAAQ,aAAa,SAAS,EAC7CI,EAAa,KAAK,YAAcC,IAAqBF,EAAa,IAAI,YAAY,CAAC,EACvF,KAAK,gBAAkBC,IAAe,WAAa,IAAIE,IAAmBL,CAAG,EAAI,IAAIM,IAAmBN,EAAK,CAC3G,SAAUE,EAAa,IAAI,eAAgB,EAAI,EAAI,OAASA,EAAa,IAAI,WAAY,EAAI,CAC/F,CAAC,EACH,EACAP,EAAY,UAAU,OAAS,SAAUO,EAAcH,EAASC,EAAK,CACnE,GAAI,EAAAC,GAAI,MAAQ,CAACD,EAAI,OAAO,GAI5B,MAAK,MAAM,UAAU,EACrB,KAAK,cAAgBE,EACrB,KAAK,SAAWH,EAChB,KAAK,KAAOC,EACZ,IAAIO,EAAiB,KAAK,gBAC1BA,EAAe,OAAOL,CAAY,EAClCK,EAAe,aAAaL,EAAa,IAAI,WAAW,CAAC,EACzD,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAOX,KAAK,cAAgB,YAAcA,EAAa,IAAI,oBAAoB,EAC1EM,GAAe,KAAM,kBAAmB,GAAI,SAAS,EAErDC,GAAM,KAAM,iBAAiB,EAEjC,EACAd,EAAY,UAAU,oBAAsB,UAAY,CACtD,IAAIO,EAAe,KAAK,cACpBQ,EAAYR,EAAa,IAAI,WAAW,EAC7BS,GAAS,cAAe,KAAK,KAAMC,GAAK,SAAUC,EAAaC,EAAGC,EAAgB,CAE3FL,IAAc,SACZA,EAAU,QAAQG,CAAW,GAAK,EACpC,KAAK,SAASC,EAAGC,CAAc,EACtBF,IAAgB,SACzB,KAAK,MAAME,CAAc,EAG/B,EAAG,IAAI,CAAC,CACV,EACApB,EAAY,UAAU,UAAY,UAAY,CAC5C,IAAIO,EAAe,KAAK,cACpBH,EAAU,KAAK,SACfC,EAAM,KAAK,KACXU,EAAYR,EAAa,IAAI,WAAW,EAE5C,GAAI,KAAK,QAAU,MAAQ,KAAK,QAAU,MAIvCQ,IAAc,QAAUA,IAAc,QAAS,CAChD,IAAIM,EAAS,KACb,aAAa,KAAK,qBAAqB,EACvC,KAAK,sBAAwB,WAAW,UAAY,CAIlD,CAAChB,EAAI,WAAW,GAAKgB,EAAO,gBAAgBd,EAAcH,EAASC,EAAK,CACtE,EAAGgB,EAAO,OACV,EAAGA,EAAO,OACV,eAAgBA,EAAO,mBACzB,CAAC,CACH,CAAC,CACH,CACF,EAiBArB,EAAY,UAAU,gBAAkB,SAAUO,EAAcH,EAASC,EAAKiB,EAAS,CACrF,GAAI,EAAAA,EAAQ,OAAS,KAAK,KAAOhB,GAAI,MAAQ,CAACD,EAAI,OAAO,GAGzD,KAAIe,EAAiBG,IAAmBD,EAASjB,CAAG,EAEpD,KAAK,QAAU,GAEf,IAAImB,EAAiBF,EAAQ,eACzBG,EAAUC,IAAuBJ,EAASlB,EAASC,CAAG,EAC1D,GAAIoB,EAAS,CACX,IAAIE,EAAOF,EAAQ,GAAG,gBAAgB,EAAE,MAAM,EAC9CE,EAAK,eAAeF,EAAQ,GAAG,SAAS,EACxC,KAAK,SAAS,CACZ,QAASE,EAAK,EAAIA,EAAK,MAAQ,EAC/B,QAASA,EAAK,EAAIA,EAAK,OAAS,EAChC,OAAQF,EAAQ,GAChB,SAAUH,EAAQ,SAGlB,gBAAiB,QACnB,EAAGF,CAAc,CACnB,SAAWE,EAAQ,SAAWA,EAAQ,GAAK,MAAQA,EAAQ,GAAK,KAAM,CACpE,IAAIM,EAAK9B,IACT8B,EAAG,EAAIN,EAAQ,EACfM,EAAG,EAAIN,EAAQ,EACfM,EAAG,OAAO,EACVC,GAAUD,CAAE,EAAE,cAAgB,CAC5B,KAAM,KACN,OAAQN,EAAQ,OAClB,EAEA,KAAK,SAAS,CACZ,QAASA,EAAQ,EACjB,QAASA,EAAQ,EACjB,OAAQM,CACV,EAAGR,CAAc,CACnB,SAAWI,EACT,KAAK,SAAS,CACZ,QAASF,EAAQ,EACjB,QAASA,EAAQ,EACjB,SAAUA,EAAQ,SAClB,eAAgBE,EAChB,cAAeF,EAAQ,aACzB,EAAGF,CAAc,UACRE,EAAQ,aAAe,KAAM,CACtC,GAAI,KAAK,qBAAqBf,EAAcH,EAASC,EAAKiB,CAAO,EAC/D,OAEF,IAAIQ,EAAYC,GAAoBT,EAASlB,CAAO,EAChD4B,EAAKF,EAAU,MAAM,CAAC,EACtBG,EAAKH,EAAU,MAAM,CAAC,EACtBE,GAAM,MAAQC,GAAM,MACtB,KAAK,SAAS,CACZ,QAASD,EACT,QAASC,EACT,OAAQH,EAAU,GAClB,SAAUR,EAAQ,SAGlB,gBAAiB,QACnB,EAAGF,CAAc,CAErB,MAAWE,EAAQ,GAAK,MAAQA,EAAQ,GAAK,OAG3CjB,EAAI,eAAe,CACjB,KAAM,oBACN,EAAGiB,EAAQ,EACX,EAAGA,EAAQ,CACb,CAAC,EACD,KAAK,SAAS,CACZ,QAASA,EAAQ,EACjB,QAASA,EAAQ,EACjB,SAAUA,EAAQ,SAClB,OAAQjB,EAAI,MAAM,EAAE,UAAUiB,EAAQ,EAAGA,EAAQ,CAAC,EAAE,MACtD,EAAGF,CAAc,GAErB,EACApB,EAAY,UAAU,gBAAkB,SAAUO,EAAcH,EAASC,EAAKiB,EAAS,CACrF,IAAIV,EAAiB,KAAK,gBACtB,KAAK,eACPA,EAAe,UAAU,KAAK,cAAc,IAAI,WAAW,CAAC,EAE9D,KAAK,OAAS,KAAK,OAAS,KAAK,oBAAsB,KACnDU,EAAQ,OAAS,KAAK,KACxB,KAAK,MAAMC,IAAmBD,EAASjB,CAAG,CAAC,CAE/C,EAIAL,EAAY,UAAU,qBAAuB,SAAUO,EAAcH,EAASC,EAAKiB,EAAS,CAC1F,IAAIY,EAAcZ,EAAQ,YACtBa,EAAYb,EAAQ,UAEpBc,EAAmBhC,EAAQ,aAAa,aAAa,EAAE,iBAC3D,GAAI,EAAA8B,GAAe,MAAQC,GAAa,MAAQC,GAAoB,MAGpE,KAAIC,EAAcjC,EAAQ,iBAAiB8B,CAAW,EACtD,GAAKG,EAGL,KAAIC,EAAOD,EAAY,QAAQ,EAC3BE,EAAuBC,GAAkB,CAACF,EAAK,aAAaH,CAAS,EAAGE,GAAcA,EAAY,kBAAoB,CAAC,GAAG,KAAK,EAAG,KAAK,aAAa,EACxJ,GAAIE,EAAqB,IAAI,SAAS,IAAM,OAG5C,OAAAlC,EAAI,eAAe,CACjB,KAAM,oBACN,YAAa6B,EACb,UAAWC,EACX,SAAUb,EAAQ,QACpB,CAAC,EACM,IACT,EACAtB,EAAY,UAAU,SAAW,SAAUmB,EAAGC,EAAgB,CAC5D,IAAIQ,EAAKT,EAAE,OACPZ,EAAe,KAAK,cACxB,GAAKA,EAIL,MAAK,OAASY,EAAE,QAChB,KAAK,OAASA,EAAE,QAChB,IAAIK,EAAiBL,EAAE,eACvB,GAAIK,GAAkBA,EAAe,OACnC,KAAK,iBAAiBA,EAAgBL,CAAC,UAC9BS,EAAI,CACb,IAAIa,EAASZ,GAAUD,CAAE,EACzB,GAAIa,EAAO,UAAY,SAErB,OAEF,KAAK,oBAAsB,KAC3B,IAAIC,EACAC,EACJC,GAAoBhB,EAAI,SAAUiB,EAAQ,CACxC,GAAIA,EAAO,gBACT,OAAAH,EAAqBC,EAAmB,KACjC,GAELD,GAAsBC,IAItBd,GAAUgB,CAAM,EAAE,WAAa,KACjCH,EAAqBG,EAGdhB,GAAUgB,CAAM,EAAE,eAAiB,OAC1CF,EAAmBE,GAEvB,EAAG,EAAI,EACHH,EACF,KAAK,uBAAuBvB,EAAGuB,EAAoBtB,CAAc,EACxDuB,EACT,KAAK,0BAA0BxB,EAAGwB,EAAkBvB,CAAc,EAElE,KAAK,MAAMA,CAAc,CAE7B,MACE,KAAK,oBAAsB,KAC3B,KAAK,MAAMA,CAAc,EAE7B,EACApB,EAAY,UAAU,YAAc,SAAUO,EAAcuC,EAAI,CAK9D,IAAIC,EAAQxC,EAAa,IAAI,WAAW,EACxCuC,EAAK7B,GAAK6B,EAAI,IAAI,EAClB,aAAa,KAAK,WAAW,EAC7BC,EAAQ,EAAI,KAAK,YAAc,WAAWD,EAAIC,CAAK,EAAID,EAAG,CAC5D,EACA9C,EAAY,UAAU,iBAAmB,SAAUwB,EAAgBL,EAAG,CACpE,IAAIf,EAAU,KAAK,SACf4C,EAAqB,KAAK,cAC1BC,EAAQ,CAAC9B,EAAE,QAASA,EAAE,OAAO,EAC7B+B,EAAqBV,GAAkB,CAACrB,EAAE,aAAa,EAAG6B,CAAkB,EAC5ExC,EAAa,KAAK,YAClB2C,EAAe,CAAC,EAChBC,EAAgBC,GAAoB,UAAW,CACjD,OAAQ,CAAC,EACT,SAAU,EACZ,CAAC,EAEGC,EAAsB,CAAC,EACvBC,EAAqB,IAAIC,GAC7BC,EAAKjC,EAAgB,SAAUkC,EAAc,CAC3CD,EAAKC,EAAa,WAAY,SAAUC,EAAU,CAChD,IAAIC,EAAYxD,EAAQ,aAAauD,EAAS,QAAU,OAAQA,EAAS,SAAS,EAC9EE,EAAYF,EAAS,MACzB,GAAI,GAACC,GAAaC,GAAa,MAM/B,KAAIC,EAAuCC,GAAcF,EAAWD,EAAU,KAAMxD,EAASuD,EAAS,kBAAmBA,EAAS,aAAa,EAC3IK,EAAoBX,GAAoB,UAAW,CACrD,OAAQS,EACR,SAAU,CAACG,GAAKH,CAAc,EAC9B,WAAY,GACZ,OAAQ,CAAC,CACX,CAAC,EACDV,EAAc,OAAO,KAAKY,CAAiB,EAC3CP,EAAKE,EAAS,kBAAmB,SAAUO,EAAS,CAClD,IAAIC,EAAS/D,EAAQ,iBAAiB8D,EAAQ,WAAW,EACrD/B,EAAY+B,EAAQ,gBACpBE,EAAWD,EAAO,cAAchC,CAAS,EAE7C,GAAI,EAAAiC,EAAS,UAAY,GAGzB,CAAAA,EAAS,QAAUT,EAAS,QAC5BS,EAAS,UAAYT,EAAS,UAC9BS,EAAS,SAAWT,EAAS,SAC7BS,EAAS,OAAST,EAAS,OAC3BS,EAAS,UAAuBC,GAAgBT,EAAU,KAAM,CAC9D,MAAOC,CACT,CAAC,EACDO,EAAS,eAAiBN,EAG1BM,EAAS,OAASb,EAAmB,kBAAkB,OAAQe,GAAqBF,EAAS,KAAK,EAAG5D,CAAU,EAC/G,IAAI+D,EAAsBC,GAA6BL,EAAO,cAAchC,EAAW,GAAM,IAAI,CAAC,EAC9FsC,EAAOF,EAAoB,KAC/B,GAAIE,EAAM,CACR,IAAIC,EAAiBlC,GAAkB,CAAC2B,CAAM,EAAGnB,CAAkB,EAAE,IAAI,gBAAgB,EACzFgB,EAAkB,OAAO,KAAKU,EAAiBC,EAAO,CACpD,eAAgBD,CAClB,EAAGD,CAAI,EAAIA,CAAI,CACjB,CACIF,EAAoB,MACtBjB,EAAoB,KAAKiB,EAAoB,IAAI,EAEnDpB,EAAa,KAAKiB,CAAQ,EAC5B,CAAC,EACH,CAAC,CACH,CAAC,EAGDhB,EAAc,OAAO,QAAQ,EAC7BE,EAAoB,QAAQ,EAC5B,IAAIsB,EAAezD,EAAE,SACjB0D,EAAY3B,EAAmB,IAAI,OAAO,EAC1C4B,EAAkBC,GAAmB3B,EAAeG,EAAoB/C,EAAYqE,EAAWzE,EAAQ,IAAI,QAAQ,EAAG8C,EAAmB,IAAI,WAAW,CAAC,EAC7J4B,GAAmBxB,EAAoB,QAAQwB,CAAe,EAC9D,IAAIE,EAAaxE,IAAe,WAAa;AAAA;AAAA,EAAS,QAClDyE,EAAgB3B,EAAoB,KAAK0B,CAAU,EACvD,KAAK,YAAY9B,EAAoB,UAAY,CAC3C,KAAK,+BAA+B1B,EAAgB2B,CAAY,EAClE,KAAK,gBAAgBD,EAAoB0B,EAAc3B,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAG,KAAK,gBAAiBE,CAAY,EAE7G,KAAK,oBAAoBD,EAAoB+B,EAAe9B,EAAc,KAAK,OAAO,EAAI,GAAIF,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAG2B,EAAc,KAAMrB,CAAkB,CAE5J,CAAC,CAGH,EACAvD,EAAY,UAAU,uBAAyB,SAAUmB,EAAG+D,EAAY9D,EAAgB,CACtF,IAAIhB,EAAU,KAAK,SACfqC,EAASZ,GAAUqD,CAAU,EAI7BhD,EAAcO,EAAO,YACrBJ,EAAcjC,EAAQ,iBAAiB8B,CAAW,EAElDiD,EAAY1C,EAAO,WAAaJ,EAChCF,EAAYM,EAAO,UACnB2C,EAAW3C,EAAO,SAClBH,EAAO6C,EAAU,QAAQC,CAAQ,EACjC5E,EAAa,KAAK,YAClB6E,EAAkBlE,EAAE,gBACpBZ,EAAeiC,GAAkB,CAACF,EAAK,aAAaH,CAAS,EAAGgD,EAAW9C,IAAgBA,EAAY,kBAAoB,CAAC,GAAG,KAAK,EAAG,KAAK,cAAegD,EAAkB,CAC/K,SAAUA,CACZ,EAAI,IAAI,EACJC,EAAiB/E,EAAa,IAAI,SAAS,EAC/C,GAAI,EAAA+E,GAAkB,MAAQA,IAAmB,QAGjD,KAAIC,EAASJ,EAAU,cAAchD,EAAWiD,CAAQ,EACpD7B,EAAqB,IAAIC,GAG7B+B,EAAO,OAAShC,EAAmB,kBAAkB,OAAQe,GAAqBiB,EAAO,KAAK,EAAG/E,CAAU,EAC3G,IAAI+D,EAAsBC,GAA6BW,EAAU,cAAchD,EAAW,GAAOiD,CAAQ,CAAC,EACtGP,EAAYtE,EAAa,IAAI,OAAO,EACpCmE,EAAiBnE,EAAa,IAAI,gBAAgB,EAClDkE,EAAOF,EAAoB,KAC3BiB,EAAaf,EAAOM,GAAmBL,EAAiBC,EAAO,CACjE,eAAgBD,CAClB,EAAGD,CAAI,EAAIA,EAAMlB,EAAoB/C,EAAYqE,EAAWzE,EAAQ,IAAI,QAAQ,EAAGG,EAAa,IAAI,WAAW,CAAC,EAAIgE,EAAoB,KACpIkB,EAAc,QAAUN,EAAU,KAAO,IAAMhD,EACnD,KAAK,YAAY5B,EAAc,UAAY,CACzC,KAAK,oBAAoBA,EAAciF,EAAYD,EAAQE,EAAatE,EAAE,QAASA,EAAE,QAASA,EAAE,SAAUA,EAAE,OAAQoC,CAAkB,CACxI,CAAC,EAGDnC,EAAe,CACb,KAAM,UACN,gBAAiBe,EACjB,UAAWG,EAAK,YAAYH,CAAS,EACrC,YAAaD,EACb,KAAM,KAAK,GACb,CAAC,EACH,EACAlC,EAAY,UAAU,0BAA4B,SAAUmB,EAAGS,EAAIR,EAAgB,CACjF,IAAIsE,EAAmB,KAAK,cAAgB,OACxCjD,EAASZ,GAAUD,CAAE,EACrB+D,EAAgBlD,EAAO,cACvBmD,EAAaD,EAAc,QAAU,CAAC,EACtCE,EAAoBD,EAAW,kBACnC,GAAIE,GAASF,CAAU,EAAG,CACxB,IAAIG,EAAUH,EACdA,EAAa,CACX,QAASG,EAET,UAAWA,CACb,EAIAF,EAAoB,EACtB,CACIA,GAAqBH,GAAoBE,EAAW,UAEtDA,EAAaI,GAAMJ,CAAU,EAC7BA,EAAW,QAAUK,GAAWL,EAAW,OAAO,GAEpD,IAAIM,EAAsB,CAACN,CAAU,EACjCO,EAAO,KAAK,SAAS,aAAa1D,EAAO,kBAAmBA,EAAO,cAAc,EACjF0D,GACFD,EAAoB,KAAKC,CAAI,EAK/BD,EAAoB,KAAK,CACvB,UAAWN,EAAW,OACxB,CAAC,EACD,IAAIP,EAAkBlE,EAAE,gBACpBiF,EAAkB5D,GAAkB0D,EAAqB,KAAK,cAAeb,EAAkB,CACjG,SAAUA,CACZ,EAAI,IAAI,EACJgB,EAAcD,EAAgB,IAAI,SAAS,EAC3CX,EAAc,KAAK,OAAO,EAAI,GAE9BlC,EAAqB,IAAIC,GAI7B,KAAK,YAAY4C,EAAiB,UAAY,CAG5C,IAAIE,EAAkBN,GAAMI,EAAgB,IAAI,iBAAiB,GAAK,CAAC,CAAC,EACxE,KAAK,oBAAoBA,EAAiBC,EAAaC,EAAiBb,EAAatE,EAAE,QAASA,EAAE,QAASA,EAAE,SAAUS,EAAI2B,CAAkB,CAC/I,CAAC,EAEDnC,EAAe,CACb,KAAM,UACN,KAAM,KAAK,GACb,CAAC,CACH,EACApB,EAAY,UAAU,oBAAsB,SAG5CO,EAAc8F,EAAad,EAAQE,EAAac,EAAGC,EAAG5B,EAAchD,EAAI2B,EAAoB,CAG1F,GADA,KAAK,QAAU,GACX,GAAChD,EAAa,IAAI,aAAa,GAAK,CAACA,EAAa,IAAI,MAAM,GAGhE,KAAIK,EAAiB,KAAK,gBAC1BA,EAAe,aAAaL,EAAa,IAAI,WAAW,CAAC,EACzD,IAAIkG,EAAYlG,EAAa,IAAI,WAAW,EAC5CqE,EAAeA,GAAgBrE,EAAa,IAAI,UAAU,EAC1D,IAAImG,EAAOL,EACPM,EAAY,KAAK,iBAAiB,CAACJ,EAAGC,CAAC,EAAGjB,EAAQhF,EAAa,IAAI,SAAS,EAAGA,EAAa,IAAI,aAAa,EAAGA,EAAa,IAAI,qBAAsB,EAAI,CAAC,EAC5JqG,EAAiBD,EAAU,MAC/B,GAAIF,EACF,GAAIX,GAASW,CAAS,EAAG,CACvB,IAAII,EAAStG,EAAa,QAAQ,IAAI,QAAQ,EAC1CuG,EAAUC,EAAQxB,CAAM,EAAIA,EAAO,CAAC,EAAIA,EACxCyB,EAAaF,GAAWA,EAAQ,UAAYA,EAAQ,SAAS,QAAQ,MAAM,GAAK,EACpFJ,EAAOD,EACHO,IACFN,EAAOO,GAAWH,EAAQ,UAAWJ,EAAMG,CAAM,GAEnDH,EAAOQ,GAAUR,EAAMnB,EAAQ,EAAI,CACrC,SAAW4B,GAAWV,CAAS,EAAG,CAChC,IAAIW,EAAWnG,GAAK,SAAUoG,EAAUX,EAAM,CACxCW,IAAa,KAAK,UACpBzG,EAAe,WAAW8F,EAAMnD,EAAoBhD,EAAcqG,EAAgBhC,CAAY,EAC9F,KAAK,gBAAgBrE,EAAcqE,EAAc2B,EAAGC,EAAG5F,EAAgB2E,EAAQ3D,CAAE,EAErF,EAAG,IAAI,EACP,KAAK,QAAU6D,EACfiB,EAAOD,EAAUlB,EAAQE,EAAa2B,CAAQ,CAChD,MACEV,EAAOD,EAGX7F,EAAe,WAAW8F,EAAMnD,EAAoBhD,EAAcqG,EAAgBhC,CAAY,EAC9FhE,EAAe,KAAKL,EAAcqG,CAAc,EAChD,KAAK,gBAAgBrG,EAAcqE,EAAc2B,EAAGC,EAAG5F,EAAgB2E,EAAQ3D,CAAE,EACnF,EACA5B,EAAY,UAAU,iBAAmB,SAAUiD,EAAOqE,EAAmBC,EAASC,EAAaC,EAAoB,CACrH,GAAIF,IAAY,QAAUR,EAAQO,CAAiB,EACjD,MAAO,CACL,MAAOE,GAAeC,CACxB,EAEF,GAAI,CAACV,EAAQO,CAAiB,EAC5B,MAAO,CACL,MAAOE,GAAeF,EAAkB,OAASA,EAAkB,WACrE,CAEJ,EACAtH,EAAY,UAAU,gBAAkB,SAAUO,EAAcqE,EAAc2B,EAE9EC,EAEAT,EAASR,EAAQ3D,EAAI,CACnB,IAAI8F,EAAY,KAAK,KAAK,SAAS,EAC/BC,EAAa,KAAK,KAAK,UAAU,EACrC/C,EAAeA,GAAgBrE,EAAa,IAAI,UAAU,EAC1D,IAAIqH,EAAc7B,EAAQ,QAAQ,EAC9B8B,EAAQtH,EAAa,IAAI,OAAO,EAChCuH,EAASvH,EAAa,IAAI,eAAe,EACzCoB,EAAOC,GAAMA,EAAG,gBAAgB,EAAE,MAAM,EAS5C,GARAA,GAAMD,EAAK,eAAeC,EAAG,SAAS,EAClCuF,GAAWvC,CAAY,IAEzBA,EAAeA,EAAa,CAAC2B,EAAGC,CAAC,EAAGjB,EAAQQ,EAAQ,GAAIpE,EAAM,CAC5D,SAAU,CAAC+F,EAAWC,CAAU,EAChC,YAAaC,EAAY,MAAM,CACjC,CAAC,GAECb,EAAQnC,CAAY,EACtB2B,EAAIwB,GAAanD,EAAa,CAAC,EAAG8C,CAAS,EAC3ClB,EAAIuB,GAAanD,EAAa,CAAC,EAAG+C,CAAU,UACnCK,GAASpD,CAAY,EAAG,CACjC,IAAIqD,EAAoBrD,EACxBqD,EAAkB,MAAQL,EAAY,CAAC,EACvCK,EAAkB,OAASL,EAAY,CAAC,EACxC,IAAIM,EAAaC,GAAcF,EAAmB,CAChD,MAAOP,EACP,OAAQC,CACV,CAAC,EACDpB,EAAI2B,EAAW,EACf1B,EAAI0B,EAAW,EACfL,EAAQ,KAGRC,EAAS,IACX,SAEShC,GAASlB,CAAY,GAAKhD,EAAI,CACrC,IAAIwG,EAAMC,IAAoBzD,EAAcjD,EAAMiG,EAAarH,EAAa,IAAI,aAAa,CAAC,EAC9FgG,EAAI6B,EAAI,CAAC,EACT5B,EAAI4B,EAAI,CAAC,CACX,KAAO,CACL,IAAIA,EAAME,IAAqB/B,EAAGC,EAAGT,EAAS2B,EAAWC,EAAYE,EAAQ,KAAO,GAAIC,EAAS,KAAO,EAAE,EAC1GvB,EAAI6B,EAAI,CAAC,EACT5B,EAAI4B,EAAI,CAAC,CACX,CAGA,GAFAP,IAAUtB,GAAKgC,IAAcV,CAAK,EAAID,EAAY,CAAC,EAAI,EAAIC,IAAU,QAAUD,EAAY,CAAC,EAAI,GAChGE,IAAWtB,GAAK+B,IAAcT,CAAM,EAAIF,EAAY,CAAC,EAAI,EAAIE,IAAW,SAAWF,EAAY,CAAC,EAAI,GAChGY,GAAqBjI,CAAY,EAAG,CACtC,IAAI6H,EAAMK,IAAuBlC,EAAGC,EAAGT,EAAS2B,EAAWC,CAAU,EACrEpB,EAAI6B,EAAI,CAAC,EACT5B,EAAI4B,EAAI,CAAC,CACX,CACArC,EAAQ,OAAOQ,EAAGC,CAAC,CACrB,EAGAxG,EAAY,UAAU,+BAAiC,SAAUwB,EAAgB2B,EAAc,CAC7F,IAAIuF,EAAe,KAAK,oBACpBC,EAAmB,KAAK,cACxBC,EAAoB,CAAC,CAACF,GAAgBA,EAAa,SAAWlH,EAAe,OACjF,OAAAoH,GAAqBnF,EAAKiF,EAAc,SAAUG,EAAkBC,EAAe,CACjF,IAAIC,EAAiBF,EAAiB,YAAc,CAAC,EACjDG,EAAmBxH,EAAesH,CAAa,GAAK,CAAC,EACrDG,EAAiBD,EAAiB,YAAc,CAAC,EACrDJ,EAAoBA,GAAqBG,EAAe,SAAWE,EAAe,OAClFL,GAAqBnF,EAAKsF,EAAgB,SAAUG,EAAUC,EAAW,CACvE,IAAIC,EAAWH,EAAeE,CAAS,GAAK,CAAC,EACzCE,EAAcH,EAAS,mBAAqB,CAAC,EAC7CI,EAAaF,EAAS,mBAAqB,CAAC,EAChDR,EAAoBA,GAAqBM,EAAS,QAAUE,EAAS,OAASF,EAAS,WAAaE,EAAS,UAAYF,EAAS,SAAWE,EAAS,QAAUC,EAAY,SAAWC,EAAW,OAClMV,GAAqBnF,EAAK4F,EAAa,SAAUE,EAAaC,EAAG,CAC/D,IAAIC,EAAaH,EAAWE,CAAC,EAC7BZ,EAAoBA,GAAqBW,EAAY,cAAgBE,EAAW,aAAeF,EAAY,YAAcE,EAAW,SACtI,CAAC,EAEDd,GAAoBlF,EAAKyF,EAAS,kBAAmB,SAAUhF,EAAS,CACtE,IAAIwF,EAAYxF,EAAQ,YACpBE,EAAWjB,EAAauG,CAAS,EACjCC,EAAehB,EAAiBe,CAAS,EACzCtF,GAAYuF,GAAgBA,EAAa,OAASvF,EAAS,OAC7DwE,EAAoB,GAExB,CAAC,CACH,CAAC,CACH,CAAC,EACD,KAAK,oBAAsBpH,EAC3B,KAAK,cAAgB2B,EACd,CAAC,CAACyF,CACX,EACA5I,EAAY,UAAU,MAAQ,SAAUoB,EAAgB,CAKtD,KAAK,oBAAsB,KAC3BA,EAAe,CACb,KAAM,UACN,KAAM,KAAK,GACb,CAAC,CACH,EACApB,EAAY,UAAU,QAAU,SAAUI,EAASC,EAAK,CAClDC,GAAI,MAAQ,CAACD,EAAI,OAAO,IAG5BS,GAAM,KAAM,iBAAiB,EAC7B,KAAK,gBAAgB,QAAQ,EACd8I,GAAW,cAAevJ,CAAG,EAC9C,EACAL,EAAY,KAAO,UACZA,CACT,GAAE6J,EAAa,EAIf,SAASrH,GAAkBsH,EAAc9G,EAAoB+G,EAAsB,CAEjF,IAAI3J,EAAU4C,EAAmB,QAC7BgH,EACAD,GACFC,EAAc,IAAIC,GAAMF,EAAsB3J,EAASA,CAAO,EAC9D4J,EAAc,IAAIC,GAAMjH,EAAmB,OAAQgH,EAAa5J,CAAO,GAEvE4J,EAAchH,EAEhB,QAASkH,EAAIJ,EAAa,OAAS,EAAGI,GAAK,EAAGA,IAAK,CACjD,IAAItE,EAAakE,EAAaI,CAAC,EAC3BtE,IACEA,aAAsBqE,KACxBrE,EAAaA,EAAW,IAAI,UAAW,EAAI,GAOzCE,GAASF,CAAU,IACrBA,EAAa,CACX,UAAWA,CACb,GAEEA,IACFoE,EAAc,IAAIC,GAAMrE,EAAYoE,EAAa5J,CAAO,GAG9D,CACA,OAAO4J,CACT,CACA,SAASzI,IAAmBD,EAASjB,EAAK,CACxC,OAAOiB,EAAQ,gBAAkBL,GAAKZ,EAAI,eAAgBA,CAAG,CAC/D,CACA,SAASiI,IAAqB/B,EAAGC,EAAGT,EAAS2B,EAAWC,EAAYwC,EAAMC,EAAM,CAC9E,IAAIC,EAAOtE,EAAQ,QAAQ,EACvBuE,EAAQD,EAAK,CAAC,EACdE,EAASF,EAAK,CAAC,EACnB,OAAIF,GAAQ,OAKN5D,EAAI+D,EAAQH,EAAO,EAAIzC,EACzBnB,GAAK+D,EAAQH,EAEb5D,GAAK4D,GAGLC,GAAQ,OACN5D,EAAI+D,EAASH,EAAOzC,EACtBnB,GAAK+D,EAASH,EAEd5D,GAAK4D,GAGF,CAAC7D,EAAGC,CAAC,CACd,CACA,SAASiC,IAAuBlC,EAAGC,EAAGT,EAAS2B,EAAWC,EAAY,CACpE,IAAI0C,EAAOtE,EAAQ,QAAQ,EACvBuE,EAAQD,EAAK,CAAC,EACdE,EAASF,EAAK,CAAC,EACnB,OAAA9D,EAAI,KAAK,IAAIA,EAAI+D,EAAO5C,CAAS,EAAI4C,EACrC9D,EAAI,KAAK,IAAIA,EAAI+D,EAAQ5C,CAAU,EAAI4C,EACvChE,EAAI,KAAK,IAAIA,EAAG,CAAC,EACjBC,EAAI,KAAK,IAAIA,EAAG,CAAC,EACV,CAACD,EAAGC,CAAC,CACd,CACA,SAAS6B,IAAoBmC,EAAU7I,EAAMiG,EAAa6C,EAAa,CACrE,IAAIC,EAAW9C,EAAY,CAAC,EACxB+C,EAAY/C,EAAY,CAAC,EACzBgD,EAAS,KAAK,KAAK,KAAK,MAAQH,CAAW,EAAI,EAC/ClE,EAAI,EACJC,EAAI,EACJqE,EAAYlJ,EAAK,MACjBmJ,EAAanJ,EAAK,OACtB,OAAQ6I,EAAU,CAChB,IAAK,SACHjE,EAAI5E,EAAK,EAAIkJ,EAAY,EAAIH,EAAW,EACxClE,EAAI7E,EAAK,EAAImJ,EAAa,EAAIH,EAAY,EAC1C,MACF,IAAK,MACHpE,EAAI5E,EAAK,EAAIkJ,EAAY,EAAIH,EAAW,EACxClE,EAAI7E,EAAK,EAAIgJ,EAAYC,EACzB,MACF,IAAK,SACHrE,EAAI5E,EAAK,EAAIkJ,EAAY,EAAIH,EAAW,EACxClE,EAAI7E,EAAK,EAAImJ,EAAaF,EAC1B,MACF,IAAK,OACHrE,EAAI5E,EAAK,EAAI+I,EAAWE,EACxBpE,EAAI7E,EAAK,EAAImJ,EAAa,EAAIH,EAAY,EAC1C,MACF,IAAK,QACHpE,EAAI5E,EAAK,EAAIkJ,EAAYD,EACzBpE,EAAI7E,EAAK,EAAImJ,EAAa,EAAIH,EAAY,CAC9C,CACA,MAAO,CAACpE,EAAGC,CAAC,CACd,CACA,SAAS+B,IAAcV,EAAO,CAC5B,OAAOA,IAAU,UAAYA,IAAU,QACzC,CAYA,SAASnG,IAAuBJ,EAASlB,EAASC,EAAK,CACrD,IAAI0K,EAAiBC,GAAe1J,CAAO,EAAE,eACzC2J,EAAoBF,EAAe,KAAK,EAAE,CAAC,EAC/C,GAAI,GAACE,GAAqBA,IAAsB,UAGhD,KAAIC,EAAcC,GAAyB/K,EAAS6K,EAAmBF,EAAe,IAAIE,CAAiB,EAAG,CAC5G,WAAY,GACZ,UAAW,GACX,WAAY,EACd,CAAC,EACGG,EAAQF,EAAY,OAAO,CAAC,EAChC,GAAKE,EAGL,KAAIC,EAAOhL,EAAI,wBAAwB+K,CAAK,EACxCxJ,EAQJ,GAPAyJ,EAAK,MAAM,SAAS,SAAUC,EAAO,CACnC,IAAI3F,EAAgB9D,GAAUyJ,CAAK,EAAE,cACrC,GAAI3F,GAAiBA,EAAc,OAASrE,EAAQ,KAClD,OAAAM,EAAK0J,EACE,EAEX,CAAC,EACG1J,EACF,MAAO,CACL,kBAAmBqJ,EACnB,eAAgBG,EAAM,eACtB,GAAIxJ,CACN,GAEJ,CACA,IAAO2J,IAAQvL,IC3yBR,SAASwL,GAAQC,EAAW,CACjCC,GAAIF,EAAkB,EACtBC,EAAU,uBAAuBE,GAAY,EAC7CF,EAAU,sBAAsBG,GAAW,EAS3CH,EAAU,eAAe,CACvB,KAAM,UACN,MAAO,UACP,OAAQ,yBACV,EAAGI,EAAI,EACPJ,EAAU,eAAe,CACvB,KAAM,UACN,MAAO,UACP,OAAQ,yBACV,EAAGI,EAAI,CACT,CCzBA,IAAIC,IAAuB,CAAC,OAAQ,UAAW,OAAQ,OAAO,EAC/C,SAARC,GAAmCC,EAAQC,EAAO,CACvD,IAAIC,EAAkBC,GAAiBH,EAASA,EAAO,MAAQ,CAAC,CAAC,EACjE,GAAKE,EAAgB,OAGrB,KAAIE,EAA8B,CAAC,EAC5BC,EAAKH,EAAiB,SAAUI,EAAU,CAC/C,IAAIC,EAAMD,EAAS,eAAe,SAAS,EAAIA,EAAS,QAAU,CAAC,EAC/DC,aAAe,QACjBH,EAA8BA,EAA4B,OAAOG,CAAG,EAExE,CAAC,EACD,IAAIC,EAAUR,GAAUA,EAAO,QACpBS,EAAQD,CAAO,IACxBA,EAAUA,EAAQ,CAAC,GAEhBA,IACHA,EAAU,CACR,QAAS,CAAC,CACZ,EACAR,EAAO,QAAU,CAACQ,CAAO,GAE3B,IAAIE,EAAiBF,EAAQ,UAAYA,EAAQ,QAAU,CAAC,GACxDG,EAAeD,EAAe,QAAUA,EAAe,MAAQ,CAAC,GAChEE,EAAaD,EAAa,OAASA,EAAa,KAAO,CAAC,GAC5DC,EAAW,KAAK,MAAMA,EAAYR,CAA2B,EAC7DS,IAAgBD,CAAU,EACtBX,GAAS,CAACW,EAAW,QACvBA,EAAW,KAAK,MAAMA,EAAYd,GAAoB,EAE1D,CACA,SAASe,IAAgBC,EAAK,CAC5B,IAAIC,EAAM,CAAC,EACJV,EAAKS,EAAK,SAAUE,EAAK,CAC9BD,EAAIC,CAAG,EAAI,CACb,CAAC,EACDF,EAAI,OAAS,EACNT,EAAKU,EAAK,SAAUE,EAAMD,EAAK,CACpCF,EAAI,KAAKE,CAAG,CACd,CAAC,CACH,CCrCA,IAAIE,IAAcA,EAClB,SAASC,IAAQC,EAAK,CACpB,GAAIA,GACF,QAASC,KAAUD,EACjB,GAAIA,EAAI,eAAeC,CAAM,EAC3B,MAAO,GAIf,CACO,SAASC,GAAqBC,EAAQC,EAAWC,EAAwB,CAC9E,IAAIC,EAAiB,CAAC,EACtB,OAAAR,IAAKM,EAAW,SAAUG,EAAO,CAC/B,IAAIC,EAAWF,EAAeC,CAAK,EAAIE,EAAe,EACtDX,IAAKK,EAAOI,CAAK,EAAG,SAAUG,EAAYC,EAAY,CACpD,GAAKC,GAAc,YAAYD,CAAU,EAGzC,KAAIE,EAAgB,CAClB,KAAMF,EACN,OAAQD,CACV,EACAL,GAA0BA,EAAuBQ,EAAeN,CAAK,EACrEC,EAASG,CAAU,EAAI,IAAIC,GAAcC,CAAa,EAGlDF,IAAe,YACjBE,EAAuBC,GAAMD,CAAa,EAC1CA,EAAc,KAAO,aACrBL,EAAS,SAAS,kBAAoB,IAAII,GAAcC,CAAa,GAEzE,CAAC,CACH,CAAC,EACMP,EACP,SAASG,GAAiB,CACxB,IAAIM,EAAU,UAAY,CAAC,EAG3BA,EAAQ,UAAU,SAAWA,EAAQ,UACrC,IAAIf,EAAM,IAAIe,EACd,OAAOf,CACT,CACF,CACO,SAASgB,GAAoBC,EAAYC,EAAWC,EAAM,CAK/D,IAAIC,EACGtB,EAAKqB,EAAM,SAAUE,EAAK,CAC3BH,EAAU,eAAeG,CAAG,GAAKtB,IAAQmB,EAAUG,CAAG,CAAC,IACzDD,EAAM,GAEV,CAAC,EACDA,GAActB,EAAKqB,EAAM,SAAUE,EAAK,CAClCH,EAAU,eAAeG,CAAG,GAAKtB,IAAQmB,EAAUG,CAAG,CAAC,EACzDJ,EAAWI,CAAG,EAAWP,GAAMI,EAAUG,CAAG,CAAC,EAE7C,OAAOJ,EAAWI,CAAG,CAEzB,CAAC,CACH,CAUO,SAASC,IAAYlB,EAAWE,EAAgBiB,EAAMC,EAAeC,EAAOC,EAAW,CAC5F,IAAIC,EAAiB,CAAC,EACf7B,EAAKM,EAAW,SAAUG,EAAO,CACtC,IAAIqB,EAAchB,GAAc,mBAAmBN,EAAeC,CAAK,CAAC,EACxEoB,EAAepB,CAAK,EAAIqB,CAC1B,CAAC,EACD,IAAIC,EACJ,SAASC,EAAUT,EAAK,CACtB,OAAOU,GAAsBR,EAAMM,EAAWR,CAAG,CACnD,CACA,SAASW,EAAUX,EAAKY,EAAO,CAC7BC,GAAsBX,EAAMM,EAAWR,EAAKY,CAAK,CACnD,CACIP,GAAa,KACfH,EAAK,KAAKY,CAAQ,EAElBZ,EAAK,KAAK,CAACG,CAAS,EAAGS,CAAQ,EAEjC,SAASA,EAASC,EAAcC,EAAO,CACrCR,EAAYH,GAAa,KAAOU,EAC9BC,EACF,IAAIC,EAAcf,EAAK,eAAeM,CAAS,EAG/C,GAAI,EAAAS,GAAeA,EAAY,YAAc,IAM7C,QAHIC,EAAaf,EAAc,KAAKC,EAAOW,CAAY,EACnD5B,EAAWF,EAAeiC,CAAU,EACpCX,EAAcD,EAAeY,CAAU,EAClCC,EAAI,EAAGC,EAAMb,EAAY,OAAQY,EAAIC,EAAKD,IAAK,CACtD,IAAIE,EAAOd,EAAYY,CAAC,EACxBhC,EAASkC,CAAI,GAAKlC,EAASkC,CAAI,EAAE,YAAYN,EAAcN,EAAWE,CAAS,CACjF,CACF,CACF,CAQO,SAASW,IAAuBvC,EAAWE,EAAgBkB,EAAeoB,EAAK,CACpF,IAAIjB,EAAiB,CAAC,EACtB,OAAO7B,EAAKM,EAAW,SAAUG,EAAO,CACtC,IAAIqB,EAAchB,GAAc,mBAAmBN,EAAeC,CAAK,CAAC,EACxEoB,EAAepB,CAAK,EAAIqB,CAC1B,CAAC,EACM,CACL,SAAU,SAAkBiB,EAAQtB,EAAM,CACxC,IAAIuB,EACAF,GAAO,OACTE,EAAWvB,EAAK,kBAAkBqB,CAAG,GAEvC,SAASd,EAAUT,EAAK,CACtB,OAAOU,GAAsBR,EAAMM,EAAWR,CAAG,CACnD,CACA,SAASW,EAAUX,EAAKY,EAAO,CAC7BC,GAAsBX,EAAMM,EAAWR,EAAKY,CAAK,CACnD,CAGA,QAFIJ,EACAkB,EAAQxB,EAAK,SAAS,GAClBM,EAAYgB,EAAO,KAAK,IAAM,MAAM,CAC1C,IAAIP,EAAcf,EAAK,eAAeM,CAAS,EAG/C,GAAI,EAAAS,GAAeA,EAAY,YAAc,IAO7C,QAJIL,EAAQW,GAAO,KAAOG,EAAM,IAAID,EAAUjB,CAAS,EAAIA,EACvDU,EAAaf,EAAcS,CAAK,EAChCzB,EAAWF,EAAeiC,CAAU,EACpCX,EAAcD,EAAeY,CAAU,EAClCC,EAAI,EAAGC,EAAMb,EAAY,OAAQY,EAAIC,EAAKD,IAAK,CACtD,IAAIE,EAAOd,EAAYY,CAAC,EACxBhC,EAASkC,CAAI,GAAKlC,EAASkC,CAAI,EAAE,YAAYT,EAAOH,EAAWE,CAAS,CAC1E,CACF,CACF,CACF,CACF,CC3JO,SAASgB,IAAiCC,EAAM,CACrD,IAAIC,EAAYD,EAAK,UAEjBE,EAAY,CACd,MAAO,SAAUC,EAAY,CAC3B,OAAOC,IAASH,CAAS,EAAE,MAAME,EAAYD,EAAWF,CAAI,CAC9D,EACA,KAAM,SAAUG,EAAY,CAC1B,OAAOC,IAASH,CAAS,EAAE,KAAKE,EAAYD,EAAWF,CAAI,CAC7D,CACF,EACA,OAAOE,CACT,CACA,IAAIE,IAAW,CACb,MAAOC,IAAiB,CAAC,EACzB,MAAOA,IAAiB,CAAC,EACzB,KAAM,CACJ,MAAO,SAAUF,EAAYD,EAAWF,EAAM,CAC5C,OAAOG,GAAcH,EAAK,aAAa,QAAQG,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,CAC7E,EACA,KAAM,SAAUA,EAAYD,EAAWF,EAAM,CAC3C,OAAOG,GAAcH,EAAK,aAAa,UAAUG,CAAU,CAC7D,CACF,EACA,QAAS,CACP,MAAO,SAAUA,EAAYD,EAAWF,EAAM,CAC5C,OAAOG,GAAcH,EAAK,aAAa,QAAQG,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,GAAoBG,GAAQN,EAAK,MAAOG,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,CACjJ,EACA,KAAM,SAAUA,EAAYD,EAAWF,EAAM,CAC3C,IAAIO,EAASP,EAAK,MAClB,GAAI,CAACG,GAAcI,EAAO,QAAU,EAClC,MAAO,GAET,IAAIC,EAAIL,EAAW,EACfM,EAAIN,EAAW,EACfO,EAAQP,EAAW,MACnBQ,EAASR,EAAW,OACpBS,EAAIL,EAAO,CAAC,EAChB,GAAmBD,GAAQC,EAAQC,EAAGC,CAAC,GAAoBH,GAAQC,EAAQC,EAAIE,EAAOD,CAAC,GAAoBH,GAAQC,EAAQC,EAAGC,EAAIE,CAAM,GAAoBL,GAAQC,EAAQC,EAAIE,EAAOD,EAAIE,CAAM,GAAKE,GAAa,OAAOV,CAAU,EAAE,QAAQS,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,GAAKE,GAAqBN,EAAGC,EAAGD,EAAIE,EAAOD,EAAGF,CAAM,GAAKO,GAAqBN,EAAGC,EAAGD,EAAGC,EAAIE,EAAQJ,CAAM,GAAKO,GAAqBN,EAAIE,EAAOD,EAAGD,EAAIE,EAAOD,EAAIE,EAAQJ,CAAM,GAAKO,GAAqBN,EAAGC,EAAIE,EAAQH,EAAIE,EAAOD,EAAIE,EAAQJ,CAAM,EAC1e,MAAO,EAEX,CACF,CACF,EACA,SAASF,IAAiBU,EAAS,CACjC,IAAIC,EAAK,CAAC,IAAK,GAAG,EACdC,EAAK,CAAC,QAAS,QAAQ,EAC3B,MAAO,CACL,MAAO,SAAUd,EAAYD,EAAWF,EAAM,CAC5C,GAAIG,EAAY,CACd,IAAIe,EAAQlB,EAAK,MACbY,EAAIT,EAAWY,CAAO,EAC1B,OAAOI,GAAYP,EAAGM,CAAK,CAC7B,CACF,EACA,KAAM,SAAUf,EAAYD,EAAWF,EAAM,CAC3C,GAAIG,EAAY,CACd,IAAIe,EAAQlB,EAAK,MACboB,EAAc,CAACjB,EAAWa,EAAGD,CAAO,CAAC,EAAGZ,EAAWa,EAAGD,CAAO,CAAC,EAAIZ,EAAWc,EAAGF,CAAO,CAAC,CAAC,EAC7F,OAAAK,EAAY,CAAC,EAAIA,EAAY,CAAC,GAAKA,EAAY,QAAQ,EAChDD,GAAYC,EAAY,CAAC,EAAGF,CAAK,GAAKC,GAAYC,EAAY,CAAC,EAAGF,CAAK,GAAKC,GAAYD,EAAM,CAAC,EAAGE,CAAW,GAAKD,GAAYD,EAAM,CAAC,EAAGE,CAAW,CAC5J,CACF,CACF,CACF,CACA,SAASD,GAAYP,EAAGM,EAAO,CAC7B,OAAOA,EAAM,CAAC,GAAKN,GAAKA,GAAKM,EAAM,CAAC,CACtC,CChEA,IAAIG,IAAa,CAAC,UAAW,YAAY,EACrCC,GAAkB,kBAClBC,GAAgB,yBAEb,SAASC,GAAaC,EAAS,CACpCA,EAAQ,cAAc,CACpB,SAAU,OACZ,EAAG,SAAUC,EAAY,CACvB,IAAIC,EAAqBD,EAAW,mBAAqB,IAAIE,GAAmBF,EAAW,OAAQD,CAAO,EAC1GE,EAAmB,eAAeD,EAAW,MAAOD,CAAO,CAC7D,CAAC,CACH,CAIe,SAARI,GAA6BJ,EAASK,EAAKC,EAAS,CACzD,IAAIC,EAAgB,CAAC,EACjBC,EACAC,EACJT,EAAQ,cAAc,CACpB,SAAU,OACZ,EAAG,SAAUC,EAAY,CACvBK,GAAWA,EAAQ,OAAS,oBAAsBL,EAAW,eAAeK,EAAQ,MAAQ,QAAUA,EAAQ,YAAc,CAC1H,UAAW,EACb,CAAC,CACH,CAAC,EACDP,GAAaC,CAAO,EACpBA,EAAQ,cAAc,CACpB,SAAU,OACZ,EAAG,SAAUC,EAAYS,EAAY,CACnC,IAAIC,EAAoB,CACtB,QAASV,EAAW,GACpB,WAAYS,EACZ,UAAWT,EAAW,KACtB,MAAcW,GAAMX,EAAW,KAAK,EACpC,SAAU,CAAC,CACb,EAGAM,EAAc,KAAKI,CAAiB,EACpC,IAAIE,EAAcZ,EAAW,OACzBa,EAAYD,EAAY,UACxBE,EAAkB,CAAC,EACnBC,EAA2B,CAAC,EAC5BC,EAAoB,CAAC,EACrBC,EAAiB,GAChBR,IAEHF,EAAeK,EAAY,aAC3BJ,EAAgBI,EAAY,eAG9B,IAAIM,EAAeC,EAAInB,EAAW,MAAO,SAAUoB,EAAM,CACvD,IAAIC,EAAUC,IAAqBF,EAAK,SAAS,EAC7CG,EAAwBC,GAAS,CACnC,aAAcH,EAAUA,EAAQD,CAAI,EAAI,MAC1C,EAAGA,CAAI,EACP,OAAAG,EAAe,UAAYE,IAAiCF,CAAc,EACnEA,CACT,CAAC,EACGG,EAAgCC,GAAqB3B,EAAW,OAAQL,IAAY,SAAUiC,EAAe,CAC/GA,EAAc,cAAgB,OAChC,CAAC,EACMC,EAAQhB,CAAS,GAAYiB,EAAKjB,EAAW,SAAUkB,EAAa,CACzEjB,EAAgBiB,CAAW,EAAI,CACjC,CAAC,EACD,SAASC,EAAWD,EAAa,CAC/B,OAAOlB,IAAc,OAAS,CAAC,CAACC,EAAgBiB,CAAW,CAC7D,CAGA,SAASE,EAAQC,EAAe,CAC9B,MAAO,CAAC,CAACA,EAAc,MACzB,CAcAnC,EAAQ,WAAW,SAAUoC,EAAaJ,EAAa,CACrD,IAAIG,EAAgBlB,EAAkBe,CAAW,EAAI,CAAC,EACtDI,EAAY,UAAY,WAAaC,EAAcD,EAAaJ,CAAW,EAAIM,EAAYF,EAAaJ,EAAaG,CAAa,CACpI,CAAC,EACD,SAASE,EAAcD,EAAaJ,EAAa,CAC/C,IAAIO,EAAWH,EAAY,iBAC3BlB,EAAiBA,GAAkBqB,EAAS,eAAe,EAC3DN,EAAWD,CAAW,GAAKO,EAAS,gBAAgBH,EAAY,QAAQ,EAAG,SAAUI,EAAaC,EAAW,CAC3GD,IAAgB,WAAaxB,EAAyByB,CAAS,EAAI,EACrE,CAAC,CACH,CACA,SAASH,EAAYF,EAAaJ,EAAaG,EAAe,CAC5D,GAAI,GAACC,EAAY,eAAiBM,IAAsBzC,EAAY+B,CAAW,KAGxED,EAAKZ,EAAO,SAAUE,EAAM,CAC7BpB,EAAW,mBAAmB,cAAcoB,EAAMe,EAAapC,CAAO,GACxEmC,EAAc,KAAKd,CAAI,EAEzBH,EAAiBA,GAAkBgB,EAAQC,CAAa,CAC1D,CAAC,EACGF,EAAWD,CAAW,GAAKE,EAAQC,CAAa,GAAG,CACrD,IAAIQ,EAASP,EAAY,QAAQ,EACjCO,EAAO,KAAK,SAAUF,EAAW,CAC3BG,IAAaR,EAAaD,EAAeQ,EAAQF,CAAS,IAC5DzB,EAAyByB,CAAS,EAAI,EAE1C,CAAC,CACH,CACF,CAEAzC,EAAQ,WAAW,SAAUoC,EAAaJ,EAAa,CACrD,IAAIa,EAAsB,CACxB,SAAUT,EAAY,GACtB,YAAaJ,EACb,WAAYI,EAAY,KACxB,UAAW,CAAC,CACd,EAGAzB,EAAkB,SAAS,KAAKkC,CAAmB,EACnD,IAAIV,EAAgBlB,EAAkBe,CAAW,EAC7Cc,EAAOV,EAAY,QAAQ,EAC3BW,EAAgBd,EAAWD,CAAW,EAAI,SAAUS,EAAW,CACjE,OAAOzB,EAAyByB,CAAS,GAAKI,EAAoB,UAAU,KAAKC,EAAK,YAAYL,CAAS,CAAC,EAAG,WAAa,YAC9H,EAAI,SAAUA,EAAW,CACvB,OAAOG,IAAaR,EAAaD,EAAeW,EAAML,CAAS,GAAKI,EAAoB,UAAU,KAAKC,EAAK,YAAYL,CAAS,CAAC,EAAG,WAAa,YACpJ,GAECR,EAAWD,CAAW,EAAId,EAAiBgB,EAAQC,CAAa,IAAqBa,IAAYpD,IAAY+B,EAAgBmB,EAAMC,CAAa,CACnJ,CAAC,CACH,CAAC,EACDE,IAAe5C,EAAKG,EAAcC,EAAeF,EAAeD,CAAO,CACzE,CAEA,SAAS2C,IAAe5C,EAAKG,EAAcC,EAAeF,EAAeD,EAAS,CAShF,GAAKA,EAGL,KAAI4C,EAAK7C,EAAI,MAAM,EACnB,GAAI,CAAA6C,EAAGpD,EAAa,EAGpB,CAAKoD,EAAGrD,EAAe,IACrBqD,EAAGrD,EAAe,EAAIsD,KAExB,IAAIC,EAAkBC,GAAeH,EAAIrD,GAAiBY,EAAeD,CAAY,EACrF4C,EAAG/C,EAAKE,CAAa,GACvB,CACA,SAAS4C,IAAW9C,EAAKE,EAAe,CACtC,GAAI,CAACF,EAAI,WAAW,EAAG,CACrB,IAAI6C,EAAK7C,EAAI,MAAM,EACnB6C,EAAGpD,EAAa,EAAI,GACpBO,EAAI,eAAe,CACjB,KAAM,cACN,MAAOE,CACT,CAAC,EACD2C,EAAGpD,EAAa,EAAI,EACtB,CACF,CACA,SAAS8C,IAAaR,EAAaD,EAAeW,EAAML,EAAW,CACjE,QAAS,EAAI,EAAGa,EAAMnB,EAAc,OAAQ,EAAImB,EAAK,IAAK,CACxD,IAAIjC,EAAOc,EAAc,CAAC,EAC1B,GAAIC,EAAY,cAAcK,EAAWK,EAAMzB,EAAK,UAAWA,CAAI,EACjE,MAAO,EAEX,CACF,CACA,SAASqB,IAAsBzC,EAAY+B,EAAa,CACtD,IAAIuB,EAAgBtD,EAAW,OAAO,YACtC,OAAOsD,GAAiB,MAAQA,IAAkB,QAAiBzB,EAAQyB,CAAa,EAAWC,GAAQD,EAAevB,CAAW,EAAI,EAAIA,IAAgBuB,EAC/J,CACA,IAAIhC,IAAuB,CACzB,KAAM,SAAUF,EAAM,CACpB,OAAOoC,IAA0BpC,EAAK,KAAK,CAC7C,EACA,QAAS,SAAUA,EAAM,CAGvB,QAFIqC,EACAC,EAAQtC,EAAK,MACRuC,EAAI,EAAGN,EAAMK,EAAM,OAAQC,EAAIN,EAAKM,IAAK,CAChDF,EAASA,GAAU,CAAC,CAAC,IAAU,IAAS,EAAG,CAAC,IAAU,IAAS,CAAC,EAChE,IAAIG,EAAKF,EAAMC,CAAC,EAChBC,EAAG,CAAC,EAAIH,EAAO,CAAC,EAAE,CAAC,IAAMA,EAAO,CAAC,EAAE,CAAC,EAAIG,EAAG,CAAC,GAC5CA,EAAG,CAAC,EAAIH,EAAO,CAAC,EAAE,CAAC,IAAMA,EAAO,CAAC,EAAE,CAAC,EAAIG,EAAG,CAAC,GAC5CA,EAAG,CAAC,EAAIH,EAAO,CAAC,EAAE,CAAC,IAAMA,EAAO,CAAC,EAAE,CAAC,EAAIG,EAAG,CAAC,GAC5CA,EAAG,CAAC,EAAIH,EAAO,CAAC,EAAE,CAAC,IAAMA,EAAO,CAAC,EAAE,CAAC,EAAIG,EAAG,CAAC,EAC9C,CACA,OAAOH,GAAUD,IAA0BC,CAAM,CACnD,CACF,EACA,SAASD,IAA0BC,EAAQ,CACzC,OAAO,IAAII,GAAaJ,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,EAAGA,EAAO,CAAC,EAAE,CAAC,EAAIA,EAAO,CAAC,EAAE,CAAC,CAAC,CAC9G,CChNA,IAAIK,KAAyB,SAAUC,EAAQ,CAC7CC,EAAUF,EAAWC,CAAM,EAC3B,SAASD,GAAY,CACnB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAU,KAChBG,CACT,CACA,OAAAH,EAAU,UAAU,KAAO,SAAUI,EAASC,EAAK,CACjD,KAAK,QAAUD,EACf,KAAK,IAAMC,EACX,KAAK,OACJ,KAAK,iBAAmB,IAAIC,GAAgBD,EAAI,MAAM,CAAC,GAAG,GAAG,QAAgBE,GAAK,KAAK,SAAU,IAAI,CAAC,EAAE,MAAM,CACjH,EACAP,EAAU,UAAU,OAAS,SAAUQ,EAAYJ,EAASC,EAAKI,EAAS,CACxE,KAAK,MAAQD,EACb,KAAK,kBAAkBA,EAAYJ,EAASC,EAAKI,CAAO,CAC1D,EACAT,EAAU,UAAU,gBAAkB,SAAUQ,EAAYJ,EAASC,EAAKI,EAAS,CAIjFC,GAAaN,CAAO,EACpB,KAAK,kBAAkBI,EAAYJ,EAASC,EAAKI,CAAO,CAC1D,EACAT,EAAU,UAAU,aAAe,SAAUQ,EAAYJ,EAASC,EAAKI,EAAS,CAC9E,KAAK,gBAAgBD,EAAYJ,EAASC,EAAKI,CAAO,CACxD,EACAT,EAAU,UAAU,WAAa,SAAUQ,EAAYJ,EAASC,EAAKI,EAAS,CAC5E,KAAK,kBAAkBD,EAAYJ,EAASC,EAAKI,CAAO,CAC1D,EACAT,EAAU,UAAU,kBAAoB,SAAUQ,EAAYJ,EAASC,EAAKI,EAAS,EAElF,CAACA,GAAWA,EAAQ,QAAUD,EAAW,KAAO,KAAK,iBAAiB,UAAUA,EAAW,mBAAmB,cAAcH,CAAG,CAAC,EAAE,YAAYG,EAAW,WAAW,EAAE,aAAaA,EAAW,MAAM,MAAM,CAAC,CAC9M,EAGAR,EAAU,UAAU,QAAU,UAAY,CACxC,KAAK,iBAAiB,QAAQ,CAChC,EACAA,EAAU,UAAU,SAAW,SAAUW,EAAY,CACnD,IAAIC,EAAU,KAAK,MAAM,GACrBC,EAAQ,KAAK,MAAM,mBAAmB,gBAAgBF,EAAW,MAAO,KAAK,OAAO,GAKvF,CAACA,EAAW,OAASA,EAAW,gBAAkB,KAAK,IAAI,eAAe,CACzE,KAAM,QACN,QAASC,EACT,MAAcE,GAAMD,CAAK,EACzB,MAAOD,CACT,CAAC,EACDD,EAAW,OAAS,KAAK,IAAI,eAAe,CAC1C,KAAM,WACN,QAASC,EACT,MAAcE,GAAMD,CAAK,EACzB,MAAOD,CACT,CAAC,CACH,EACAZ,EAAU,KAAO,QACVA,CACT,GAAEe,EAAa,EACRC,IAAQhB,IC7Df,IAAIiB,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KAIxBG,EAAM,MAAQ,CAAC,EAKfA,EAAM,YAAc,CAAC,EACdA,CACT,CACA,OAAAH,EAAW,UAAU,cAAgB,SAAUI,EAAWC,EAAQ,CAChE,IAAIC,EAAa,KAAK,OACtB,CAACD,GAAyBE,GAAoBD,EAAYF,EAAW,CAAC,UAAW,YAAY,CAAC,EAC9F,IAAII,EAAUF,EAAW,QAAUA,EAAW,SAAW,CAAC,EAE1DA,EAAW,WAAaA,EAAW,YAAc,CAC/C,MAAO,KAAK,OAAO,sBACrB,EACKE,EAAQ,eAAe,OAAO,IAGjCA,EAAQ,MAAQ,EAEpB,EAIAR,EAAW,UAAU,SAAW,SAAUS,EAAO,CAU1CA,IAGL,KAAK,MAAeC,EAAID,EAAO,SAAUE,EAAM,CAC7C,OAAOC,IAAoB,KAAK,OAAQD,CAAI,CAC9C,EAAG,IAAI,EACT,EAIAX,EAAW,UAAU,eAAiB,SAAUa,EAAa,CAC3D,KAAK,YAAcD,IAAoB,KAAK,OAAQC,CAAW,EAC/D,KAAK,UAAY,KAAK,YAAY,SACpC,EACAb,EAAW,KAAO,QAClBA,EAAW,aAAe,CAAC,MAAO,OAAQ,QAAS,QAAS,WAAY,QAAQ,EAChFA,EAAW,cAAgB,CACzB,YAAa,MACb,UAAW,OACX,UAAW,SACX,cAAe,GACf,WAAY,CACV,YAAa,EACb,MAAOc,EAAO,MAAM,eACpB,YAAaA,EAAO,MAAM,UAC5B,EACA,aAAc,UACd,cAAe,EACf,cAAe,GACf,EAAG,IACH,uBAAwBA,EAAO,MAAM,QACvC,EACOd,CACT,GAAEe,EAAc,EAChB,SAASH,IAAoBI,EAAQH,EAAa,CAChD,OAAcI,GAAM,CAClB,UAAWD,EAAO,UAClB,UAAWA,EAAO,UAClB,cAAeA,EAAO,cACtB,WAAY,IAAIE,GAAMF,EAAO,UAAU,EAAE,aAAa,EACtD,cAAeA,EAAO,cACtB,EAAGA,EAAO,CACZ,EAAGH,EAAa,EAAI,CACtB,CACA,IAAOM,IAAQnB,IC1Ff,IAAIoB,IAAa,CAAC,OAAQ,UAAW,QAAS,QAAS,OAAQ,OAAO,EAClEC,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,OAAOC,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC7D,CACA,OAAAD,EAAa,UAAU,OAAS,SAAUG,EAAcC,EAASC,EAAK,CACpE,IAAIC,EACAC,EACAC,EACJJ,EAAQ,cAAc,CACpB,SAAU,OACZ,EAAG,SAAUK,EAAY,CACvBH,EAAYG,EAAW,UACvBF,EAAYE,EAAW,YAAY,WAAa,SAChDD,EAAYA,GAAa,CAAC,CAACC,EAAW,MAAM,MAC9C,CAAC,EACD,KAAK,WAAaH,EAClB,KAAK,WAAaC,EACXG,EAAKP,EAAa,IAAI,OAAQ,EAAI,EAAG,SAAUQ,EAAM,CAC1DR,EAAa,cAAcQ,GAAOA,IAAS,OAASJ,IAAc,WAAaI,IAAS,QAAUH,EAAYG,IAASL,GAAa,WAAa,QAAQ,CAC3J,CAAC,CACH,EACAN,EAAa,UAAU,WAAa,SAAUG,EAAcC,EAASC,EAAK,CACxE,KAAK,OAAOF,EAAcC,EAASC,CAAG,CACxC,EACAL,EAAa,UAAU,SAAW,UAAY,CAC5C,IAAIY,EAAQ,KAAK,MACbC,EAAiBD,EAAM,IAAI,OAAQ,EAAI,EACvCE,EAAQ,CAAC,EACb,OAAOJ,EAAKE,EAAM,IAAI,OAAQ,EAAI,EAAG,SAAUD,EAAM,CAC/CE,EAAeF,CAAI,IACrBG,EAAMH,CAAI,EAAIE,EAAeF,CAAI,EAErC,CAAC,EACMG,CACT,EAEAd,EAAa,UAAU,QAAU,SAAUI,EAASC,EAAKM,EAAM,CAC7D,IAAIL,EAAY,KAAK,WACjBC,EAAY,KAAK,WACjBI,IAAS,SAEXN,EAAI,eAAe,CACjB,KAAM,iBACN,UAAW,CAAC,CACd,CAAC,EACDA,EAAI,eAAe,CACjB,KAAM,QACN,QAAS,QAET,MAAO,CAAC,CACV,CAAC,GAEDA,EAAI,eAAe,CACjB,KAAM,mBACN,IAAK,QACL,YAAa,CACX,UAAWM,IAAS,OAASL,EAAYA,IAAcK,EAAO,GAAQA,EACtE,UAAWA,IAAS,OAASJ,IAAc,WAAa,SAAW,WAAaA,CAClF,CACF,CAAC,CAEL,EAEAP,EAAa,iBAAmB,SAAUI,EAAS,CACjD,IAAIW,EAAgB,CAClB,KAAM,GACN,KAAMhB,IAAW,MAAM,EACvB,KAAM,CAEJ,KAAM,iQACN,QAAS,ubACT,MAAO,iNACP,MAAO,gMACP,KAAM,4KACN,MAAO,wMAET,EAEA,MAAOK,EAAQ,eAAe,EAAE,IAAI,CAAC,UAAW,QAAS,OAAO,CAAC,CACnE,EACA,OAAOW,CACT,EACOf,CACT,GAAEgB,EAAc,EACTC,IAAQjB,ICjFR,SAASkB,GAAQC,EAAW,CACjCA,EAAU,sBAAsBC,GAAS,EACzCD,EAAU,uBAAuBE,GAAU,EAC3CF,EAAU,qBAAqBG,EAAiB,EAChDH,EAAU,eAAeA,EAAU,SAAS,OAAO,MAAOI,EAAW,EACrEJ,EAAU,eAAe,CACvB,KAAM,QACN,MAAO,QACP,OAAQ,cACV,EAAG,SAAUK,EAASC,EAAS,CAC7BA,EAAQ,cAAc,CACpB,SAAU,QACV,MAAOD,CACT,EAAG,SAAUE,EAAY,CACvBA,EAAW,SAASF,EAAQ,KAAK,CACnC,CAAC,CACH,CAAC,EAsBDL,EAAU,eAAe,CACvB,KAAM,cACN,MAAO,gBACP,OAAQ,MACV,EAAGQ,EAAI,EACPR,EAAU,eAAe,CACvB,KAAM,WACN,MAAO,WACP,OAAQ,MACV,EAAGQ,EAAI,EACPC,GAAgB,QAASC,GAAY,CACvC,CC/CA,IAAIC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KACxBG,EAAM,WAAa,CACjB,KAAM,MACN,WAAY,EACd,EACOA,CACT,CACA,OAAAH,EAAW,KAAO,QAClBA,EAAW,cAAgB,CAEzB,EAAG,EACH,KAAM,GACN,KAAM,GACN,OAAQ,QACR,QAAS,GACT,UAAW,QACX,KAAM,SACN,IAAKI,EAAO,KAAK,EACjB,gBAAiBA,EAAO,MAAM,YAC9B,YAAaA,EAAO,MAAM,QAC1B,YAAa,EACb,QAAS,EACT,QAAS,GACT,UAAW,CACT,SAAU,GACV,WAAY,OACZ,MAAOA,EAAO,MAAM,OACtB,EACA,aAAc,CACZ,SAAU,GACV,MAAOA,EAAO,MAAM,UACtB,CACF,EACOJ,CACT,GAAEK,EAAc,EAEZC,KAAyB,SAAUL,EAAQ,CAC7CC,EAAUI,EAAWL,CAAM,EAC3B,SAASK,GAAY,CACnB,IAAIH,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOG,EAAU,KAChBH,CACT,CACA,OAAAG,EAAU,UAAU,OAAS,SAAUC,EAAYC,EAASC,EAAK,CAE/D,GADA,KAAK,MAAM,UAAU,EACjB,EAACF,EAAW,IAAI,MAAM,EAG1B,KAAIG,EAAQ,KAAK,MACbC,EAAiBJ,EAAW,SAAS,WAAW,EAChDK,EAAoBL,EAAW,SAAS,cAAc,EACtDM,EAAYN,EAAW,IAAI,WAAW,EACtCO,EAA2BC,GAAUR,EAAW,IAAI,cAAc,EAAGA,EAAW,IAAI,mBAAmB,CAAC,EACxGS,EAAS,IAAYC,GAAK,CAC5B,MAAOC,GAAgBP,EAAgB,CACrC,KAAMJ,EAAW,IAAI,MAAM,EAC3B,KAAMI,EAAe,aAAa,CACpC,EAAG,CACD,WAAY,EACd,CAAC,EACD,GAAI,EACN,CAAC,EACGQ,EAAWH,EAAO,gBAAgB,EAClCI,EAAUb,EAAW,IAAI,SAAS,EAClCc,EAAY,IAAYJ,GAAK,CAC/B,MAAOC,GAAgBN,EAAmB,CACxC,KAAMQ,EACN,KAAMR,EAAkB,aAAa,EACrC,EAAGO,EAAS,OAASZ,EAAW,IAAI,SAAS,EAC7C,cAAe,KACjB,EAAG,CACD,WAAY,EACd,CAAC,EACD,GAAI,EACN,CAAC,EACGe,EAAOf,EAAW,IAAI,MAAM,EAC5BgB,EAAUhB,EAAW,IAAI,SAAS,EAClCiB,EAAejB,EAAW,IAAI,eAAgB,EAAI,EACtDS,EAAO,OAAS,CAACM,GAAQ,CAACE,EAC1BH,EAAU,OAAS,CAACE,GAAW,CAACC,EAC5BF,GACFN,EAAO,GAAG,QAAS,UAAY,CAC7BS,GAAWH,EAAM,IAAMf,EAAW,IAAI,QAAQ,CAAC,CACjD,CAAC,EAECgB,GACFF,EAAU,GAAG,QAAS,UAAY,CAChCI,GAAWF,EAAS,IAAMhB,EAAW,IAAI,WAAW,CAAC,CACvD,CAAC,EAEHmB,GAAUV,CAAM,EAAE,UAAYU,GAAUL,CAAS,EAAE,UAAYG,EAAe,CAC5E,cAAe,QACf,eAAgBjB,EAAW,cAC7B,EAAI,KACJG,EAAM,IAAIM,CAAM,EAChBI,GAAWV,EAAM,IAAIW,CAAS,EAE9B,IAAIM,EAAYjB,EAAM,gBAAgB,EAClCkB,EAAerB,EAAW,mBAAmB,EACjDqB,EAAa,MAAQD,EAAU,MAC/BC,EAAa,OAASD,EAAU,OAChC,IAAIE,EAAYC,GAAyBvB,EAAYE,CAAG,EACpDsB,EAAaC,GAAcJ,EAAcC,EAAU,aAActB,EAAW,IAAI,SAAS,CAAC,EAEzFM,IAEHA,EAAYN,EAAW,IAAI,MAAM,GAAKA,EAAW,IAAI,OAAO,EAExDM,IAAc,WAChBA,EAAY,UAGVA,IAAc,QAChBkB,EAAW,GAAKA,EAAW,MAClBlB,IAAc,WACvBkB,EAAW,GAAKA,EAAW,MAAQ,IAGlCjB,IACHA,EAAoBP,EAAW,IAAI,KAAK,GAAKA,EAAW,IAAI,QAAQ,EAEhEO,IAAsB,WACxBA,EAAoB,UAElBA,IAAsB,SACxBiB,EAAW,GAAKA,EAAW,OAClBjB,IAAsB,WAC/BiB,EAAW,GAAKA,EAAW,OAAS,GAEtCjB,EAAoBA,GAAqB,OAE3CJ,EAAM,EAAIqB,EAAW,EACrBrB,EAAM,EAAIqB,EAAW,EACrBrB,EAAM,WAAW,EACjB,IAAIuB,EAAa,CACf,MAAOpB,EACP,cAAeC,CACjB,EACAE,EAAO,SAASiB,CAAU,EAC1BZ,EAAU,SAASY,CAAU,EAG7BN,EAAYjB,EAAM,gBAAgB,EAClC,IAAIwB,EAAUH,EAAW,OACrBI,EAAQ5B,EAAW,aAAa,CAAC,QAAS,SAAS,CAAC,EACxD4B,EAAM,KAAO5B,EAAW,IAAI,iBAAiB,EAC7C,IAAI6B,EAAO,IAAYC,GAAK,CAC1B,MAAO,CACL,EAAGV,EAAU,EAAIO,EAAQ,CAAC,EAC1B,EAAGP,EAAU,EAAIO,EAAQ,CAAC,EAC1B,MAAOP,EAAU,MAAQO,EAAQ,CAAC,EAAIA,EAAQ,CAAC,EAC/C,OAAQP,EAAU,OAASO,EAAQ,CAAC,EAAIA,EAAQ,CAAC,EACjD,EAAG3B,EAAW,IAAI,cAAc,CAClC,EACA,MAAO4B,EACP,iBAAkB,GAClB,OAAQ,EACV,CAAC,EACDzB,EAAM,IAAI0B,CAAI,EAChB,EACA9B,EAAU,KAAO,QACVA,CACT,GAAED,EAAa,EACR,SAASiC,GAAQC,EAAW,CACjCA,EAAU,uBAAuBvC,GAAU,EAC3CuC,EAAU,sBAAsBjC,GAAS,CAC3C,CC9KA,IAAIkC,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KAC3BG,EAAM,WAAa,MACZA,CACT,CAIA,OAAAH,EAAc,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CACrE,KAAK,qBAAqBF,EAAQE,CAAO,EACzC,KAAK,UAAU,CACjB,EAIAN,EAAc,UAAU,YAAc,SAAUI,EAAQ,CACtDH,EAAO,UAAU,YAAY,MAAM,KAAM,SAAS,EAClD,KAAK,UAAU,CACjB,EACAD,EAAc,UAAU,gBAAkB,SAAUO,EAAc,CAC5DA,GAAgB,OAClBA,EAAe,KAAK,OAAO,cAE7B,IAAIC,EAAQ,KAAK,MAAM,MAAM,EACzB,KAAK,OAAO,KACdD,GAAgBA,EAAeC,EAAQA,GAASA,GAEhDD,GAAgBC,IAAUD,EAAeC,EAAQ,GACjDD,EAAe,IAAMA,EAAe,IAEtC,KAAK,OAAO,aAAeA,CAC7B,EAIAP,EAAc,UAAU,gBAAkB,UAAY,CACpD,OAAO,KAAK,OAAO,YACrB,EAIAA,EAAc,UAAU,WAAa,UAAY,CAC/C,OAAO,KAAK,gBAAgB,GAAK,KAAK,MAAM,MAAM,EAAI,CACxD,EAIAA,EAAc,UAAU,aAAe,SAAUS,EAAO,CACtD,KAAK,OAAO,SAAW,CAAC,CAACA,CAC3B,EAIAT,EAAc,UAAU,aAAe,UAAY,CACjD,MAAO,CAAC,CAAC,KAAK,OAAO,QACvB,EAIAA,EAAc,UAAU,UAAY,UAAY,CAC9C,IAAIU,EAAa,KAAK,OAClBC,EAAUD,EAAW,MAAQ,CAAC,EAC9BE,EAAWF,EAAW,SACtBG,EAAQ,KAAK,OAAS,CAAC,EACvBC,EACAF,IAAa,YACfE,EAAmB,CAAC,EACpBC,EAAKJ,EAAS,SAAUK,EAAMC,EAAO,CACnC,IAAIC,EAAQC,GAAoBC,GAAiBJ,CAAI,EAAG,EAAE,EACtDK,EACAC,GAASN,CAAI,GACfK,EAAUE,GAAMP,CAAI,EACpBK,EAAQ,MAAQJ,GAEhBI,EAAUJ,EAEZH,EAAiB,KAAKO,CAAO,EAC7BR,EAAM,KAAKK,CAAK,CAClB,CAAC,GAEDJ,EAAmBH,EAErB,IAAIa,EAAU,CACZ,SAAU,UACV,KAAM,OACN,MAAO,QACT,EAAEZ,CAAQ,GAAK,SACXa,EAAO,KAAK,MAAQ,IAAIC,GAAW,CAAC,CACtC,KAAM,QACN,KAAMF,CACR,CAAC,EAAG,IAAI,EACRC,EAAK,SAASX,EAAkBD,CAAK,CACvC,EACAb,EAAc,UAAU,QAAU,UAAY,CAC5C,OAAO,KAAK,KACd,EAKAA,EAAc,UAAU,cAAgB,UAAY,CAClD,GAAI,KAAK,IAAI,UAAU,IAAM,WAC3B,OAAO,KAAK,OAAO,MAAM,CAE7B,EACAA,EAAc,KAAO,WAIrBA,EAAc,cAAgB,CAE5B,EAAG,EACH,KAAM,GACN,SAAU,OACV,SAAU,GACV,KAAM,MACN,IAAK,KACL,MAAO,MACP,OAAQ,EACR,MAAO,KACP,OAAQ,GACR,QAAS2B,EAAO,KAAK,EACrB,gBAAiB,OACjB,SAAU,GACV,OAAQ,GACR,KAAM,GACN,aAAc,IACd,aAAc,EACd,UAAW,CAAC,EACZ,MAAO,CACL,MAAOA,EAAO,MAAM,SACtB,EACA,KAAM,CAAC,CACT,EACO3B,CACT,GAAE4B,EAAc,EACTC,GAAQ7B,IC3If,IAAI8B,KAAmC,SAAUC,EAAQ,CACvDC,EAAUF,EAAqBC,CAAM,EACrC,SAASD,GAAsB,CAC7B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAoB,KAC1BG,CACT,CACA,OAAAH,EAAoB,KAAO,kBAI3BA,EAAoB,cAAgBI,GAAqBC,GAAc,cAAe,CACpF,gBAAiB,gBACjB,YAAaC,EAAO,MAAM,OAC1B,YAAa,EACb,OAAQ,aACR,QAAS,GACT,QAAS,CACP,QAAS,MACX,EACA,OAAQ,SACR,WAAY,GACZ,UAAW,CACT,KAAM,GACN,MAAO,EACP,MAAOA,EAAO,MAAM,QACtB,EACA,MAAO,CACL,SAAU,OAIV,KAAM,GACN,SAAU,OACV,OAAQ,EAGR,MAAOA,EAAO,MAAM,QACtB,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,YAAa,CACf,EACA,gBAAiB,CACf,OAAQ,SACR,WAAY,GACZ,MAAOA,EAAO,MAAM,SACpB,YAAaA,EAAO,MAAM,SAC1B,YAAa,EACb,WAAY,EACZ,cAAe,EACf,cAAe,EACf,YAAa,mBAEb,UAAW,GACX,kBAAmB,IACnB,gBAAiB,cACnB,EACA,aAAc,CACZ,KAAM,GACN,YAAa,GACb,YAAa,GACb,YAAa,GACb,SAAU,GACV,QAAS,GACT,SAAU,OACV,SAAU,uZACV,SAAU,ggBAEV,SAAU,qXAEV,SAAU,gXACV,YAAa,GACb,YAAa,GACb,MAAOA,EAAO,MAAM,SACpB,YAAaA,EAAO,MAAM,SAC1B,YAAa,CACf,EACA,SAAU,CACR,MAAO,CACL,KAAM,GAEN,MAAOA,EAAO,MAAM,QACtB,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,YAAaA,EAAO,MAAM,QAC5B,EACA,aAAc,CACZ,MAAOA,EAAO,MAAM,SACpB,YAAaA,EAAO,MAAM,QAC5B,CACF,EACA,SAAU,CACR,UAAW,CACT,MAAOA,EAAO,MAAM,QACtB,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,QACtB,CACF,EACA,KAAM,CAAC,CACT,CAAC,EACMN,CACT,GAAEK,EAAa,EACfE,GAAMP,IAAqBQ,GAAgB,SAAS,EACpD,IAAOC,IAAQT,IC9Gf,IAAIU,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,KAAO,WACbA,CACT,GAAEI,EAAa,EACRC,IAAQL,ICPf,IAAIM,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,EAAaG,EAAKC,EAAOC,EAAaC,EAAU,CACvD,IAAIC,EAAQN,EAAO,KAAK,KAAME,EAAKC,EAAOC,CAAW,GAAK,KAC1D,OAAAE,EAAM,KAAOD,GAAY,QAClBC,CACT,CAIA,OAAAP,EAAa,UAAU,cAAgB,UAAY,CAEjD,OAAO,KAAK,MAAM,SAAS,OAAO,CACpC,EAIAA,EAAa,UAAU,aAAe,UAAY,CAChD,OAAO,KAAK,MAAM,IAAI,QAAQ,IAAM,YACtC,EACOA,CACT,GAAEQ,EAAI,EACCC,IAAQT,ICRf,IAAIU,GAAK,KAAK,GACVC,IAAsBC,GAAU,EAChCC,KAAkC,SAAUC,EAAQ,CACtDC,EAAUF,EAAoBC,CAAM,EACpC,SAASD,GAAqB,CAC5B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAmB,KACzBG,CACT,CACA,OAAAH,EAAmB,UAAU,KAAO,SAAUI,EAASC,EAAK,CAC1D,KAAK,IAAMA,CACb,EAIAL,EAAmB,UAAU,OAAS,SAAUM,EAAeF,EAASC,EAAK,CAK3E,GAJA,KAAK,MAAQC,EACb,KAAK,IAAMD,EACX,KAAK,QAAUD,EACf,KAAK,MAAM,UAAU,EACjBE,EAAc,IAAI,OAAQ,EAAI,EAAG,CACnC,IAAIC,EAAe,KAAK,QAAQD,EAAeD,CAAG,EAC9CG,EAAc,KAAK,aAAa,YAAY,EAC5CC,EAAa,KAAK,aAAa,aAAa,EAC5CC,EAAS,KAAK,MAAQ,KAAK,YAAYH,EAAcD,CAAa,EACtEA,EAAc,cAAgB,SAAUK,EAAW,CACjD,IAAIC,EAAOF,EAAO,MAAM,SAAS,CAC/B,MAAOC,CACT,CAAC,EACD,OAAOE,GAAoB,YAAa,CACtC,OAAQ,GACR,MAAOD,CACT,CAAC,CACH,EACAE,EAAK,CAAC,WAAY,WAAY,UAAW,gBAAgB,EAAG,SAAUF,EAAM,CAC1E,KAAK,UAAYA,CAAI,EAAEL,EAAcC,EAAaE,EAAQJ,CAAa,CACzE,EAAG,IAAI,EACP,KAAK,iBAAiBC,EAAcE,EAAYC,EAAQJ,CAAa,EACrE,KAAK,UAAUC,EAAcD,CAAa,CAC5C,CACA,KAAK,YAAY,EACjB,KAAK,mBAAmB,CAC1B,EAIAN,EAAmB,UAAU,OAAS,UAAY,CAChD,KAAK,YAAY,EACjB,KAAK,MAAM,UAAU,CACvB,EAIAA,EAAmB,UAAU,QAAU,UAAY,CACjD,KAAK,YAAY,CACnB,EACAA,EAAmB,UAAU,QAAU,SAAUM,EAAeD,EAAK,CACnE,IAAIU,EAAcT,EAAc,IAAI,CAAC,QAAS,UAAU,CAAC,EACrDU,EAASV,EAAc,IAAI,QAAQ,EACnCW,EAAWC,IAAYZ,EAAeD,CAAG,EACzCc,EAEAJ,GAAe,MAAQA,IAAgB,OACzCI,EAAiBH,IAAW,aAAeC,EAAS,EAAIA,EAAS,OAAS,EAAIZ,EAAI,UAAU,EAAI,EAAI,IAAM,IAAMY,EAAS,EAAIA,EAAS,MAAQ,EAAIZ,EAAI,SAAS,EAAI,EAAI,IAAM,IACpKe,GAASL,CAAW,EAC7BI,EAAiB,CACf,WAAY,CACV,IAAK,IACL,OAAQ,GACV,EACA,SAAU,CACR,KAAM,IACN,MAAO,GACT,CACF,EAAEH,CAAM,EAAED,CAAW,EAGrBI,EAAiBJ,EAEnB,IAAIM,EAAgB,CAClB,WAAY,SACZ,SAAUF,GAAkB,GAAKA,IAAmB,IAAM,OAAS,OACrE,EACIG,EAAmB,CACrB,WAAYH,GAAkB,GAAKA,IAAmB,IAAM,MAAQ,SACpE,SAAU,QACZ,EACII,EAAc,CAChB,WAAY,EACZ,SAAU1B,GAAK,CACjB,EAEI2B,EAAaR,IAAW,WAAaC,EAAS,OAASA,EAAS,MAChEQ,EAAenB,EAAc,SAAS,cAAc,EACpDoB,EAAcD,EAAa,IAAI,OAAQ,EAAI,EAC3CE,EAAcD,EAAcD,EAAa,IAAI,UAAU,EAAI,EAC3DG,EAAaF,EAAcD,EAAa,IAAI,SAAS,EAAI,EACzDI,EAAcF,EAAcC,EAE5BE,EAAgBxB,EAAc,IAAI,CAAC,QAAS,QAAQ,CAAC,GAAK,EAC9DwB,EAAgBA,EAAgBjC,GAAK,IACrC,IAAIkC,EACAC,EACAC,EACAC,EAAkBT,EAAa,IAAI,WAAY,EAAI,EACnDU,EAAcT,GAAeD,EAAa,IAAI,cAAe,EAAI,EACjEW,EAAcV,GAAeD,EAAa,IAAI,cAAe,EAAI,EACjEY,EAAcX,GAAeD,EAAa,IAAI,cAAe,EAAI,EACjEa,EAAQ,EACRC,EAASf,EAETU,IAAoB,QAAUA,IAAoB,UACpDC,IAAgBJ,EAAe,CAAC,EAAG,CAAC,EAAGO,GAAST,GAChDO,IAAgBJ,EAAkB,CAACM,EAAO,CAAC,EAAGA,GAAST,GACvDQ,IAAgBJ,EAAkB,CAACM,EAASZ,EAAa,CAAC,EAAGY,GAAUV,KAGvEM,IAAgBJ,EAAe,CAACQ,EAASZ,EAAa,CAAC,EAAGY,GAAUV,GACpEO,IAAgBJ,EAAkB,CAAC,EAAG,CAAC,EAAGM,GAAST,GACnDQ,IAAgBJ,EAAkB,CAACM,EAASZ,EAAa,CAAC,EAAGY,GAAUV,IAEzE,IAAIW,EAAa,CAACF,EAAOC,CAAM,EAC/B,OAAIjC,EAAc,IAAI,SAAS,GAC7BkC,EAAW,QAAQ,EAEd,CACL,SAAUvB,EACV,WAAYO,EACZ,OAAQR,EACR,SAAUO,EAAYP,CAAM,EAC5B,cAAec,EACf,YAAaX,EACb,WAAYb,EAAc,IAAI,CAAC,QAAS,OAAO,CAAC,GAAKe,EAAcL,CAAM,EACzE,cAAeV,EAAc,IAAI,CAAC,QAAS,eAAe,CAAC,GAAKA,EAAc,IAAI,CAAC,QAAS,UAAU,CAAC,GAAKgB,EAAiBN,CAAM,EAEnI,aAAce,EACd,gBAAiBC,EACjB,gBAAiBC,EACjB,WAAYO,EACZ,YAAab,EACb,WAAYC,CACd,CACF,EACA5B,EAAmB,UAAU,UAAY,SAAUyC,EAAYnC,EAAe,CAM5E,IAAIoC,EAAY,KAAK,WACjBjC,EAAa,KAAK,YAClBQ,EAAWwB,EAAW,SAC1B,GAAIA,EAAW,SAAW,WAAY,CAEpC,IAAIE,EAAWC,GAAO,EAClBC,EAAgB5B,EAAS,EACzB6B,EAAgB7B,EAAS,EAAIA,EAAS,OACnC8B,GAAUJ,EAAGA,EAAG,CAAC,CAACE,EAAe,CAACC,CAAa,CAAC,EAChDE,GAAOL,EAAGA,EAAG,CAAC9C,GAAK,CAAC,EACpBkD,GAAUJ,EAAGA,EAAG,CAACE,EAAeC,CAAa,CAAC,EACrD7B,EAAWA,EAAS,MAAM,EAC1BA,EAAS,eAAe0B,CAAC,CAC3B,CACA,IAAIM,EAAYC,EAASjC,CAAQ,EAC7BkC,EAAYD,EAASR,EAAU,gBAAgB,CAAC,EAChDU,EAAaF,EAASzC,EAAW,gBAAgB,CAAC,EAClD4C,EAAe,CAACX,EAAU,EAAGA,EAAU,CAAC,EACxCY,EAAiB,CAAC7C,EAAW,EAAGA,EAAW,CAAC,EAChD6C,EAAe,CAAC,EAAID,EAAa,CAAC,EAAIJ,EAAU,CAAC,EAAE,CAAC,EACpD,IAAIlC,EAAc0B,EAAW,YAC7B,GAAI1B,GAAe,MAAQK,GAASL,CAAW,EAAG,CAEhD,IAAIwC,EAAexC,IAAgB,IAAM,EAAI,EAC7CyC,EAAQH,EAAcF,EAAWF,EAAW,EAAGM,CAAY,EAC3DC,EAAQF,EAAgBF,EAAYH,EAAW,EAAG,EAAIM,CAAY,CACpE,KAAO,CACL,IAAIA,EAAexC,GAAe,EAAI,EAAI,EAC1CyC,EAAQH,EAAcF,EAAWF,EAAW,EAAGM,CAAY,EAC3DD,EAAe,CAAC,EAAID,EAAa,CAAC,EAAItC,CACxC,CACA2B,EAAU,YAAYW,CAAY,EAClC5C,EAAW,YAAY6C,CAAc,EACrCZ,EAAU,SAAWjC,EAAW,SAAWgC,EAAW,SACtDgB,EAAUf,CAAS,EACnBe,EAAUhD,CAAU,EACpB,SAASgD,EAAUC,EAAa,CAC9BA,EAAY,QAAUT,EAAU,CAAC,EAAE,CAAC,EAAIS,EAAY,EACpDA,EAAY,QAAUT,EAAU,CAAC,EAAE,CAAC,EAAIS,EAAY,CACtD,CACA,SAASR,EAASS,EAAM,CAEtB,MAAO,CAAC,CAACA,EAAK,EAAGA,EAAK,EAAIA,EAAK,KAAK,EAAG,CAACA,EAAK,EAAGA,EAAK,EAAIA,EAAK,MAAM,CAAC,CACvE,CACA,SAASH,EAAQI,EAASC,EAAMC,EAAIC,EAAQC,EAAU,CACpDJ,EAAQG,CAAM,GAAKD,EAAGC,CAAM,EAAEC,CAAQ,EAAIH,EAAKE,CAAM,EAAEC,CAAQ,CACjE,CACF,EACAhE,EAAmB,UAAU,YAAc,SAAUyC,EAAYnC,EAAe,CAC9E,IAAI2D,EAAO3D,EAAc,QAAQ,EAC7B4D,EAAW5D,EAAc,IAAI,UAAU,EACvC6D,EAAQC,IAAmB9D,EAAe4D,CAAQ,EAEtDC,EAAM,SAAW,UAAY,CAC3B,OAAOF,EAAK,SAAS,CAAC,OAAO,EAAG,SAAUI,EAAO,CAC/C,MAAO,CACL,MAAOA,CACT,CACF,CAAC,CACH,EACA,IAAIC,EAAaL,EAAK,cAAc,OAAO,EAC3CE,EAAM,UAAUG,EAAW,CAAC,EAAGA,EAAW,CAAC,CAAC,EAC5CH,EAAM,cAAc,EACpB,IAAII,EAAO,IAAIC,IAAa,QAASL,EAAO1B,EAAW,WAAYyB,CAAQ,EAC3E,OAAAK,EAAK,MAAQjE,EACNiE,CACT,EACAvE,EAAmB,UAAU,aAAe,SAAUyE,EAAK,CACzD,IAAIC,EAAW,KAAKD,CAAG,EAAI,IAAYE,GACvC,YAAK,MAAM,IAAID,CAAQ,EAChBA,CACT,EACA1E,EAAmB,UAAU,gBAAkB,SAAUyC,EAAYmC,EAAOL,EAAMjE,EAAe,CAC/F,IAAIkC,EAAa+B,EAAK,UAAU,EAChC,GAAKjE,EAAc,IAAI,CAAC,YAAa,MAAM,CAAC,EAG5C,KAAIuE,EAAO,IAAYC,GAAK,CAC1B,MAAO,CACL,GAAItC,EAAW,CAAC,EAChB,GAAI,EACJ,GAAIA,EAAW,CAAC,EAChB,GAAI,CACN,EACA,MAAOuC,EAAO,CACZ,QAAS,OACX,EAAGzE,EAAc,SAAS,WAAW,EAAE,aAAa,CAAC,EACrD,OAAQ,GACR,GAAI,CACN,CAAC,EACDsE,EAAM,IAAIC,CAAI,EACd,IAAIG,EAAe,KAAK,cAAgB,IAAYF,GAAK,CACvD,MAAO,CACL,GAAItC,EAAW,CAAC,EAChB,GAAI,KAAK,gBAAkB,KAAK,gBAAgB,EAAIA,EAAW,CAAC,EAChE,GAAI,EACJ,GAAI,CACN,EACA,MAAOyC,GAAS,CACd,QAAS,QACT,UAAWJ,EAAK,MAAM,SACxB,EAAGvE,EAAc,SAAS,CAAC,WAAY,WAAW,CAAC,EAAE,aAAa,CAAC,EACnE,OAAQ,GACR,GAAI,CACN,CAAC,EACDsE,EAAM,IAAII,CAAY,EACxB,EACAhF,EAAmB,UAAU,gBAAkB,SAAUyC,EAAYmC,EAAOL,EAAMjE,EAAe,CAC/F,IAAIH,EAAQ,KACR8D,EAAO3D,EAAc,QAAQ,EAE7B4E,EAAQX,EAAK,MAAM,SAAS,EAChC,KAAK,aAAe,CAAC,EAErBzD,EAAKoE,EAAO,SAAUC,EAAM,CAC1B,IAAIC,EAAYb,EAAK,YAAYY,EAAK,KAAK,EACvCE,EAAYpB,EAAK,aAAakB,EAAK,KAAK,EACxCG,EAAiBD,EAAU,SAAS,WAAW,EAC/CE,EAAkBF,EAAU,SAAS,CAAC,WAAY,WAAW,CAAC,EAC9DG,EAAqBH,EAAU,SAAS,CAAC,WAAY,WAAW,CAAC,EACjEI,EAAY,CACd,EAAGL,EACH,EAAG,EACH,QAASM,GAAKvF,EAAM,gBAAiBA,EAAOgF,EAAK,KAAK,CACxD,EACIQ,EAAKC,IAAWP,EAAWC,EAAgBV,EAAOa,CAAS,EAC/DE,EAAG,YAAY,UAAU,EAAE,MAAQJ,EAAgB,aAAa,EAChEI,EAAG,YAAY,UAAU,EAAE,MAAQH,EAAmB,aAAa,EACnEK,GAAoBF,CAAE,EACtB,IAAIG,EAASC,GAAUJ,CAAE,EACrBN,EAAU,IAAI,SAAS,GACzBS,EAAO,UAAYX,EAAK,MACxBW,EAAO,UAAYxF,GAEnBwF,EAAO,UAAYA,EAAO,UAAY,KAExC3F,EAAM,aAAa,KAAKwF,CAAE,CAC5B,CAAC,CACH,EACA3F,EAAmB,UAAU,iBAAmB,SAAUyC,EAAYmC,EAAOL,EAAMjE,EAAe,CAChG,IAAIH,EAAQ,KACR6F,EAAazB,EAAK,cAAc,EACpC,GAAKyB,EAAW,IAAI,MAAM,EAG1B,KAAI/B,EAAO3D,EAAc,QAAQ,EAC7B2F,EAAS1B,EAAK,cAAc,EAChC,KAAK,YAAc,CAAC,EACpBzD,EAAKmF,EAAQ,SAAUC,EAAW,CAEhC,IAAIvF,EAAYuF,EAAU,UACtBb,EAAYpB,EAAK,aAAatD,CAAS,EACvCwF,EAAmBd,EAAU,SAAS,OAAO,EAC7Ce,EAAkBf,EAAU,SAAS,CAAC,WAAY,OAAO,CAAC,EAC1DgB,EAAqBhB,EAAU,SAAS,CAAC,WAAY,OAAO,CAAC,EAC7DD,EAAYb,EAAK,YAAY2B,EAAU,SAAS,EAChDI,EAAS,IAAYC,GAAK,CAC5B,EAAGnB,EACH,EAAG,EACH,SAAU3C,EAAW,cAAgBA,EAAW,SAChD,QAASiD,GAAKvF,EAAM,gBAAiBA,EAAOQ,CAAS,EACrD,OAAQ,GACR,MAAO6F,GAAgBL,EAAkB,CACvC,KAAMD,EAAU,eAChB,MAAOzD,EAAW,WAClB,cAAeA,EAAW,aAC5B,CAAC,CACH,CAAC,EACD6D,EAAO,YAAY,UAAU,EAAE,MAAQE,GAAgBJ,CAAe,EACtEE,EAAO,YAAY,UAAU,EAAE,MAAQE,GAAgBH,CAAkB,EACzEzB,EAAM,IAAI0B,CAAM,EAChBT,GAAoBS,CAAM,EAC1BxG,IAAoBwG,CAAM,EAAE,UAAY3F,EACxCR,EAAM,YAAY,KAAKmG,CAAM,CAC/B,CAAC,EACH,EACAtG,EAAmB,UAAU,eAAiB,SAAUyC,EAAYmC,EAAOL,EAAMjE,EAAe,CAC9F,IAAIqB,EAAcc,EAAW,YACzBgE,EAAWhE,EAAW,SACtBiE,EAAYpG,EAAc,SAAS,cAAc,EAAE,aAAa,EAChEqG,EAAarG,EAAc,SAAS,CAAC,WAAY,cAAc,CAAC,EAAE,aAAa,EAC/EsG,EAAYtG,EAAc,aAAa,EACvCuG,EAAUvG,EAAc,IAAI,UAAW,EAAI,EAC/CwG,EAAQrE,EAAW,gBAAiB,OAAQiD,GAAK,KAAK,gBAAiB,KAAMmB,EAAU,IAAM,GAAG,CAAC,EACjGC,EAAQrE,EAAW,gBAAiB,OAAQiD,GAAK,KAAK,gBAAiB,KAAMmB,EAAU,IAAM,GAAG,CAAC,EACjGC,EAAQrE,EAAW,aAAcmE,EAAY,OAAS,OAAQlB,GAAK,KAAK,iBAAkB,KAAM,CAACkB,CAAS,EAAG,EAAI,EACjH,SAASE,EAAQC,EAAUC,EAAUC,EAASC,EAAY,CACxD,GAAKH,EAGL,KAAII,EAAWC,GAAaC,GAAU/G,EAAc,IAAI,CAAC,eAAgB0G,EAAW,SAAS,CAAC,EAAGrF,CAAW,EAAGA,CAAW,EACtHgC,EAAO,CAAC,EAAG,CAACwD,EAAW,EAAGA,EAAUA,CAAQ,EAC5CG,EAAMC,IAAgBjH,EAAe0G,EAAW,OAAQrD,EAAM,CAChE,EAAGoD,EAAS,CAAC,EACb,EAAGA,EAAS,CAAC,EACb,QAASpF,EAAc,EACvB,QAAS,EACT,SAAUuF,EAAa,CAACT,EAAW,EACnC,UAAW,GACX,MAAOC,EACP,QAASO,CACX,CAAC,EACDK,EAAI,YAAY,UAAU,EAAE,MAAQX,EACpC/B,EAAM,IAAI0C,CAAG,EACbzB,GAAoByB,CAAG,EACzB,CACF,EACAtH,EAAmB,UAAU,sBAAwB,SAAUyC,EAAYmC,EAAOL,EAAMjE,EAAe,CACrG,IAAI2D,EAAO3D,EAAc,QAAQ,EAC7BkH,EAAelH,EAAc,gBAAgB,EAC7CmH,EAAexD,EAAK,aAAauD,CAAY,EAAE,SAAS,iBAAiB,EACzEE,EAAK,KACLC,EAAW,CACb,SAAU,SAAUC,EAAS,CAC3BA,EAAQ,UAAY,GACpBA,EAAQ,MAAQlC,GAAKgC,EAAG,mBAAoBA,CAAE,EAC9CE,EAAQ,UAAYlC,GAAKgC,EAAG,sBAAuBA,CAAE,EACrDG,IAAcD,EAASF,EAAG,cAAeF,EAAcjD,EAAMjE,EAAe,EAAI,CAClF,EACA,SAAU,SAAUsH,EAAS,CAC3BC,IAAcD,EAASF,EAAG,cAAeF,EAAcjD,EAAMjE,CAAa,CAC5E,CACF,EAEA,KAAK,gBAAkBsF,IAAW6B,EAAcA,EAAc,KAAK,WAAY,CAAC,EAAG,KAAK,gBAAiBE,CAAQ,CACnH,EACA3H,EAAmB,UAAU,iBAAmB,SAAU8H,EAAW,CACnE,KAAK,YAAY,EACjB,KAAK,IAAI,eAAe,CACtB,KAAM,qBACN,UAAWA,EACX,KAAM,KAAK,GACb,CAAC,CACH,EACA9H,EAAmB,UAAU,mBAAqB,SAAU+H,EAAIC,EAAIC,EAAG,CACrE,KAAK,YAAY,EACjB,KAAK,uBAAuB,CAACA,EAAE,QAASA,EAAE,OAAO,CAAC,CACpD,EACAjI,EAAmB,UAAU,sBAAwB,SAAUiI,EAAG,CAChE,KAAK,uBAAuB,CAACA,EAAE,QAASA,EAAE,OAAO,EAAG,EAAI,CAC1D,EACAjI,EAAmB,UAAU,uBAAyB,SAAUkI,EAAUC,EAAS,CACjF,IAAIC,EAAU,KAAK,aAAaF,CAAQ,EAAE,CAAC,EACvC3D,EAAO,KAAK,MACZ/B,EAAwB6F,GAAI9D,EAAK,UAAU,EAAE,MAAM,CAAC,EACxD6D,EAAU5F,EAAW,CAAC,IAAM4F,EAAU5F,EAAW,CAAC,GAClD4F,EAAU5F,EAAW,CAAC,IAAM4F,EAAU5F,EAAW,CAAC,GAClD,KAAK,gBAAgB,EAAI4F,EACzB,KAAK,gBAAgB,WAAW,EAChC,IAAIpD,EAAe,KAAK,cACpBA,IACFA,EAAa,MAAM,GAAKoD,EACxBpD,EAAa,MAAM,GAErB,IAAIsD,EAAkB,KAAK,iBAAiBF,CAAO,EAC/C9H,EAAgB,KAAK,OACrB6H,GAAWG,IAAoBhI,EAAc,gBAAgB,GAAKA,EAAc,IAAI,UAAU,IAChG,KAAK,gBAAgBgI,CAAe,CAExC,EACAtI,EAAmB,UAAU,YAAc,UAAY,CACrD,IAAIG,EAAQ,KACZ,KAAK,YAAY,EACb,KAAK,MAAM,aAAa,IAC1B,KAAK,OAAS,WAAW,UAAY,CAEnC,IAAIG,EAAgBH,EAAM,MAC1BA,EAAM,gBAAgBG,EAAc,gBAAgB,GAAKA,EAAc,IAAI,SAAU,EAAI,EAAI,GAAK,EAAE,CACtG,EAAG,KAAK,MAAM,IAAI,cAAc,CAAC,EAErC,EACAN,EAAmB,UAAU,aAAe,SAAUuI,EAAQ,CAC5D,IAAIC,EAAQ,KAAK,WAAW,kBAAkB,EAC9C,OAAeC,GAAeF,EAAQC,EAAO,EAAI,CACnD,EACAxI,EAAmB,UAAU,iBAAmB,SAAU0I,EAAW,CACnE,IAAIzE,EAAO,KAAK,MAAM,QAAQ,EAC1B0E,EAAO,IACPL,EACA/D,EAAO,KAAK,MAChB,OAAAN,EAAK,KAAK,CAAC,OAAO,EAAG,SAAUI,EAAO1D,EAAW,CAC/C,IAAIiI,EAAQrE,EAAK,YAAYF,CAAK,EAC9BwE,EAAI,KAAK,IAAID,EAAQF,CAAS,EAC9BG,EAAIF,IACNA,EAAOE,EACPP,EAAkB3H,EAEtB,CAAC,EACM2H,CACT,EACAtI,EAAmB,UAAU,YAAc,UAAY,CACjD,KAAK,SACP,aAAa,KAAK,MAAM,EACxB,KAAK,OAAS,KAElB,EACAA,EAAmB,UAAU,gBAAkB,SAAU8I,EAAW,CAClE,IAAItB,EAAe,KAAK,MAAM,gBAAgB,EAC1CsB,IAAc,IAChBA,EAAYtB,EAAe,EAClBsB,IAAc,MACvBA,EAAYtB,EAAe,GAE7B,KAAK,IAAI,eAAe,CACtB,KAAM,iBACN,aAAcsB,EACd,KAAM,KAAK,GACb,CAAC,CACH,EACA9I,EAAmB,UAAU,mBAAqB,UAAY,CAC5D,IAAIwH,EAAe,KAAK,MAAM,gBAAgB,EAC1CuB,EAAc,KAAK,aACnBC,EAAa,KAAK,YACtB,GAAID,EACF,QAASE,EAAI,EAAGA,EAAIF,EAAY,OAAQE,IACtCF,GAAeA,EAAYE,CAAC,GAAKF,EAAYE,CAAC,EAAE,YAAY,WAAYA,EAAIzB,CAAY,EAG5F,GAAIwB,EACF,QAASC,EAAI,EAAGA,EAAID,EAAW,OAAQC,IACrCD,GAAcA,EAAWC,CAAC,GAAKD,EAAWC,CAAC,EAAE,YAAY,WAAYnJ,IAAoBkJ,EAAWC,CAAC,CAAC,EAAE,WAAazB,CAAY,CAGvI,EACAxH,EAAmB,KAAO,kBACnBA,CACT,GAAEkJ,GAAY,EACd,SAAS9E,IAAmB+E,EAAOjF,EAAU,CAE3C,GADAA,EAAWA,GAAYiF,EAAM,IAAI,MAAM,EACnCjF,EACF,OAAQA,EAAU,CAEhB,IAAK,WACH,OAAO,IAAIkF,GAAa,CACtB,YAAaD,EAAM,cAAc,EACjC,OAAQ,CAAC,IAAU,IAAS,CAC9B,CAAC,EACH,IAAK,OACH,OAAO,IAAIE,GAAU,CACnB,OAAQF,EAAM,QAAQ,eAAe,EACrC,OAAQA,EAAM,QAAQ,IAAI,QAAQ,CACpC,CAAC,EACH,QAEE,OAAO,IAAIG,EACf,CAEJ,CACA,SAASpI,IAAYiI,EAAO9I,EAAK,CAC/B,OAAckJ,GAAcJ,EAAM,mBAAmB,EAAUK,GAAyBL,EAAO9I,CAAG,EAAE,aAAc8I,EAAM,IAAI,SAAS,CAAC,CACxI,CACA,SAAS5B,IAAgBjH,EAAemJ,EAAS9F,EAAM+F,EAAM,CAC3D,IAAIC,EAAQD,EAAK,MACbE,EAAeC,GAAWvJ,EAAc,IAAI,CAAC,eAAgBmJ,CAAO,CAAC,EAAGC,GAAQ,CAAC,EAAG,IAAII,GAAanG,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAAC,EAE5I,OAAIgG,GACFC,EAAK,SAASD,CAAK,EAEdC,CACT,CAKA,SAAShE,IAAWmE,EAAWzE,EAAgBV,EAAOoF,EAAKC,EAAQtC,EAAU,CAC3E,IAAIuC,EAAQ5E,EAAe,IAAI,OAAO,EACtC,GAAK2E,EAOHA,EAAO,SAASC,CAAK,EACrBtF,EAAM,IAAIqF,CAAM,EAChBtC,GAAYA,EAAS,SAASsC,CAAM,MATzB,CACX,IAAIE,EAAaJ,EAAU,IAAI,QAAQ,EACvCE,EAASG,GAAaD,EAAY,GAAI,GAAI,EAAG,EAAGD,CAAK,EACrDD,EAAO,SAAS,gBAAiB,EAAI,EACrCrF,EAAM,IAAIqF,CAAM,EAChBtC,GAAYA,EAAS,SAASsC,CAAM,CACtC,CAMA,IAAIvD,EAAYpB,EAAe,aAAa,CAAC,OAAO,CAAC,EACrD2E,EAAO,SAASvD,CAAS,EAEzBsD,EAAMK,GAAM,CACV,UAAW,GACX,GAAI,GACN,EAAGL,EAAK,EAAI,EACZ,IAAIM,EAAaC,GAAoBR,EAAU,IAAI,YAAY,CAAC,EAChEC,EAAI,OAASM,EAAW,CAAC,EAAI,EAC7BN,EAAI,OAASM,EAAW,CAAC,EAAI,EAC7B,IAAIE,EAAeC,GAAsBV,EAAU,IAAI,cAAc,EAAGO,CAAU,EAC9EE,IACFR,EAAI,GAAKA,EAAI,GAAK,GAAKQ,EAAa,CAAC,EACrCR,EAAI,GAAKA,EAAI,GAAK,GAAKQ,EAAa,CAAC,GAEvC,IAAIE,EAAeX,EAAU,IAAI,cAAc,EAC/C,OAAAC,EAAI,UAAYU,GAAgB,GAAK,KAAK,GAAK,KAAO,EACtDT,EAAO,KAAKD,CAAG,EAOfC,EAAO,gBAAgB,EAChBA,CACT,CACA,SAASpC,IAAcD,EAAS5C,EAAcrE,EAAW4D,EAAMjE,EAAeqK,EAAa,CACzF,GAAI,CAAA/C,EAAQ,SAGZ,KAAIH,EAAenH,EAAc,SAAS,iBAAiB,EACvD8H,EAAU7D,EAAK,YAAYjE,EAAc,QAAQ,EAAE,IAAI,QAASK,CAAS,CAAC,EAC9E,GAAIgK,GAAe,CAAClD,EAAa,IAAI,YAAa,EAAI,EACpDG,EAAQ,KAAK,CACX,EAAGQ,EACH,EAAG,CACL,CAAC,EACDpD,GAAgBA,EAAa,KAAK,CAChC,MAAO,CACL,GAAIoD,CACN,CACF,CAAC,MACI,CACL,IAAIwC,EAAe,CACjB,SAAUnD,EAAa,IAAI,oBAAqB,EAAI,EACpD,OAAQA,EAAa,IAAI,kBAAmB,EAAI,CAClD,EACAG,EAAQ,cAAc,KAAM,EAAI,EAChCA,EAAQ,UAAU,CAChB,EAAGQ,EACH,EAAG,CACL,EAAGwC,CAAY,EACf5F,GAAgBA,EAAa,UAAU,CACrC,MAAO,CACL,GAAIoD,CACN,CACF,EAAGwC,CAAY,CACjB,EACF,CACA,IAAOC,IAAQ7K,IC7lBR,SAAS8K,IAAsBC,EAAW,CAC/CA,EAAU,eAAe,CACvB,KAAM,iBACN,MAAO,kBACP,OAAQ,kBACV,EAAG,SAAUC,EAASC,EAASC,EAAK,CAClC,IAAIC,EAAgBF,EAAQ,aAAa,UAAU,EACnD,OAAIE,GAAiBH,EAAQ,cAAgB,OAC3CG,EAAc,gBAAgBH,EAAQ,YAAY,EAC9C,CAACG,EAAc,IAAI,OAAQ,EAAI,GAAKA,EAAc,WAAW,GAAKA,EAAc,aAAa,IAC/FA,EAAc,aAAa,EAAK,EAEhCD,EAAI,eAAe,CACjB,KAAM,qBACN,UAAW,GACX,KAAMF,EAAQ,IAChB,CAAC,IAILC,EAAQ,YAAY,WAAY,CAC9B,aAAcE,EAAc,IAAI,eAAgB,EAAI,CACtD,CAAC,EACMC,GAAS,CACd,aAAcD,EAAc,OAAO,YACrC,EAAGH,CAAO,CACZ,CAAC,EACDD,EAAU,eAAe,CACvB,KAAM,qBACN,MAAO,sBACP,OAAQ,QACV,EAAG,SAAUC,EAASC,EAAS,CAC7B,IAAIE,EAAgBF,EAAQ,aAAa,UAAU,EAC/CE,GAAiBH,EAAQ,WAAa,MACxCG,EAAc,aAAaH,EAAQ,SAAS,CAEhD,CAAC,CACH,CCpCe,SAARK,GAAsCC,EAAQ,CACnD,IAAIC,EAAcD,GAAUA,EAAO,SACvBE,EAAQD,CAAW,IAC7BA,EAAcA,EAAc,CAACA,CAAW,EAAI,CAAC,GAExCE,EAAKF,EAAa,SAAUG,EAAK,CACjCA,GAGLC,IAAcD,CAAG,CACnB,CAAC,CACH,CACA,SAASC,IAAcD,EAAK,CAC1B,IAAIE,EAAOF,EAAI,KACXG,EAAW,CACb,OAAU,QACV,KAAQ,MACV,EAOA,GALIA,EAASD,CAAI,IACfF,EAAI,SAAWG,EAASD,CAAI,EAC5B,OAAOF,EAAI,MAEbI,IAAaJ,CAAG,EACZK,GAAIL,EAAK,iBAAiB,EAAG,CAC/B,IAAIM,EAAeN,EAAI,eAAiBA,EAAI,aAAe,CAAC,GACvDK,GAAIC,EAAc,UAAU,IAC/BA,EAAa,SAAWN,EAAI,iBAE1BM,EAAa,WAAa,QAAU,CAACD,GAAIC,EAAc,MAAM,IAC/DA,EAAa,KAAO,GACpB,OAAOA,EAAa,UAEtB,OAAON,EAAI,eACb,CACOD,EAAKC,EAAI,MAAQ,CAAC,EAAG,SAAUO,EAAU,CACnCC,GAASD,CAAQ,GAAK,CAAQT,EAAQS,CAAQ,IACnD,CAACF,GAAIE,EAAU,OAAO,GAAKF,GAAIE,EAAU,MAAM,IAEjDA,EAAS,MAAQA,EAAS,MAE5BH,IAAaG,CAAQ,EAEzB,CAAC,CACH,CACA,SAASH,IAAaJ,EAAK,CACzB,IAAIS,EAAYT,EAAI,YAAcA,EAAI,UAAY,CAAC,GAC/CU,EAAoBD,EAAU,WAAaA,EAAU,SAAW,CAAC,GAEjEE,EAAQX,EAAI,OAASA,EAAI,OAAS,CAAC,EACnCY,EAAcD,EAAM,SAAWA,EAAM,OAAS,CAAC,GAC/CE,EAAmB,CACrB,OAAQ,EACR,SAAU,CACZ,EACOd,EAAKY,EAAO,SAAUG,EAAOC,EAAM,CACpC,CAACF,EAAiBE,CAAI,GAAK,CAACV,GAAIO,EAAaG,CAAI,IACnDH,EAAYG,CAAI,EAAID,EAExB,CAAC,EACGJ,EAAkB,OAAS,CAACL,GAAIM,EAAO,UAAU,IACnDA,EAAM,SAAWD,EAAkB,MACnC,OAAOA,EAAkB,MAE7B,CACA,SAASL,GAAIW,EAAKC,EAAM,CACtB,OAAOD,EAAI,eAAeC,CAAI,CAChC,CCnFO,SAASC,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAmB,EACpDD,EAAU,sBAAsBE,GAAkB,EAClDF,EAAU,yBAAyB,WAAY,UAAY,CAEzD,MAAO,QACT,CAAC,EACDG,IAAsBH,CAAS,EAC/BA,EAAU,qBAAqBI,EAAY,CAC7C,CCMe,SAARC,GAAqCC,EAAYC,EAAY,CAClE,GAAI,CAACD,EACH,MAAO,GAGT,QADIE,EAAeC,EAAQH,CAAU,EAAIA,EAAa,CAACA,CAAU,EACxDI,EAAM,EAAGA,EAAMF,EAAa,OAAQE,IAC3C,GAAIF,EAAaE,CAAG,GAAKF,EAAaE,CAAG,EAAEH,CAAU,EACnD,MAAO,GAGX,MAAO,EACT,CCLA,SAASI,GAAUC,EAAK,CACtBC,GAAgBD,EAAK,QAAS,CAAC,MAAM,CAAC,CACxC,CAEA,IAAIE,GAAQC,GAAU,EAClBC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KAIzBG,EAAM,cAAgB,GACtBA,EAAM,aAAe,GACdA,CACT,CAIA,OAAAH,EAAY,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CAMnE,KAAK,qBAAqBF,EAAQE,CAAO,EACzC,KAAK,aAAaF,EAAQE,EAAS,GAAO,EAAI,CAChD,EACAN,EAAY,UAAU,mBAAqB,UAAY,CACrD,GAAIO,GAAI,KACN,MAAO,GAET,IAAIC,EAAa,KAAK,aACtB,OAAO,KAAK,WAAW,WAAW,GAAKA,GAAcA,EAAW,mBAAmB,CACrF,EAIAR,EAAY,UAAU,YAAc,SAAUS,EAAQH,EAAS,CAC7D,KAAK,aAAaG,EAAQH,EAAS,GAAO,EAAK,CACjD,EACAN,EAAY,UAAU,aAAe,SAAUS,EAAQH,EAASI,EAAeC,EAAQ,CACrF,IAAIC,EAAgB,KAAK,SACpBF,GACHJ,EAAQ,WAAW,SAAUO,EAAa,CAExC,IAAIC,EAAYD,EAAY,IAAI,KAAK,SAAU,EAAI,EAC/CE,EAAcjB,GAAMe,CAAW,EAAED,CAAa,EAClD,GAAI,CAACE,GAAa,CAACA,EAAU,KAAM,CACjChB,GAAMe,CAAW,EAAED,CAAa,EAAI,KACpC,MACF,CACKG,EA2BHA,EAAY,aAAaD,EAAWR,EAAS,EAAI,GA1B7CK,GAEFhB,GAAUmB,CAAS,EAEdE,EAAKF,EAAU,KAAM,SAAUG,EAAM,CAEtCA,aAAgB,OAClBtB,GAAUsB,EAAK,CAAC,CAAC,EACjBtB,GAAUsB,EAAK,CAAC,CAAC,GAEjBtB,GAAUsB,CAAI,CAElB,CAAC,EACDF,EAAc,KAAK,4BAA4BD,EAAW,KAAMR,CAAO,EAIhEY,EAAOH,EAAa,CACzB,SAAU,KAAK,SAEf,YAAaF,EAAY,YACzB,KAAMA,EAAY,KAClB,cAAe,EACjB,CAAC,EACDE,EAAY,aAAeF,GAI7Bf,GAAMe,CAAW,EAAED,CAAa,EAAIG,CACtC,EAAG,IAAI,CAEX,EACAf,EAAY,UAAU,cAAgB,SAAUmB,EAAWC,EAAgBC,EAAU,CACnF,IAAIC,EAAO,KAAK,QAAQ,EACpBC,EAAQ,KAAK,YAAYJ,CAAS,EAClCK,EAAWF,EAAK,QAAQH,CAAS,EACrC,OAAOM,GAAoB,UAAW,CACpC,OAAQ,KAAK,KACb,OAAQ,CAACA,GAAoB,YAAa,CACxC,KAAMD,EACN,MAAOD,EACP,OAAQ,CAACC,EACT,QAASD,GAAS,IACpB,CAAC,CAAC,CACJ,CAAC,CACH,EACAvB,EAAY,UAAU,QAAU,UAAY,CAC1C,OAAO,KAAK,KACd,EACAA,EAAY,UAAU,QAAU,SAAUsB,EAAM,CAC9C,KAAK,MAAQA,CACf,EACAtB,EAAY,UAAU,cAAgB,SAAUmB,EAAWE,EAAU,CACnE,IAAIK,EAASC,GAAgB,UAAU,cAAc,KAAK,KAAMR,EAAWE,CAAQ,EAC/Eb,EAAa,KAAK,aACtB,OAAIA,IACFkB,EAAO,SAAWlB,EAAW,GAC7BkB,EAAO,WAAalB,EAAW,KAC/BkB,EAAO,WAAalB,EAAW,SAE1BkB,CACT,EACA1B,EAAY,yBAA2B,SAAUa,EAEjDD,EAAe,CACb,OAAOd,GAAMe,CAAW,EAAED,CAAa,CACzC,EACAZ,EAAY,KAAO,SACnBA,EAAY,aAAe,CAAC,SAAU,OAAQ,QAAS,KAAK,EACrDA,CACT,GAAE4B,EAAc,EACTC,GAAM7B,IAAa2B,GAAgB,SAAS,EACnD,IAAOG,GAAQ9B,ICnIf,IAAI+B,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KACrBG,CACT,CACA,OAAAH,EAAe,UAAU,4BAA8B,SAAUI,EAAWC,EAAmBC,EAAS,CACtG,OAAO,IAAIN,EAAeI,EAAWC,EAAmBC,CAAO,CACjE,EACAN,EAAe,KAAO,YACtBA,EAAe,cAAgB,CAE7B,EAAG,EACH,OAAQ,MACR,WAAY,GAGZ,QAAS,CACP,QAAS,MACX,EACA,MAAO,CACL,KAAM,GACN,SAAU,QACZ,EACA,UAAW,CACT,YAAa,CACf,EACA,SAAU,CACR,MAAO,CACL,KAAM,EACR,CACF,CACF,EACOA,CACT,GAAEO,EAAW,EACNC,IAAQR,IClCf,SAASS,GAAQC,EAAM,CACrB,MAAO,EAAE,MAAM,WAAWA,EAAK,CAAC,CAAC,GAAK,MAAM,WAAWA,EAAK,CAAC,CAAC,EAChE,CACA,SAASC,IAASD,EAAM,CACtB,MAAO,CAAC,MAAM,WAAWA,EAAK,CAAC,CAAC,GAAK,CAAC,MAAM,WAAWA,EAAK,CAAC,CAAC,CAChE,CACA,SAASE,GAA+BC,EAAYC,EAAMC,EAASC,EAAcC,EAAeC,EAAiBC,EAAkB,CACjI,IAAIC,EAAW,CAAC,EACZC,EAAUC,GAAmBR,EAAMG,CAAkC,EACrEM,EAAcF,EAAUP,EAAK,mBAAmB,sBAAsB,EAAIG,EAC1EO,EAAQC,GAAaX,EAAMS,EAAaV,CAAU,EAClDa,EAAcZ,EAAK,UACnBa,EAAYD,EAAY,iBAAiBX,EAASQ,EAAaC,CAAK,EAAE,CAAC,EAC3EJ,EAASF,CAAe,EAAIJ,EAAK,IAAIE,EAAcW,CAAS,EAC5DP,EAASD,CAAgB,EAAIL,EAAK,IAAIS,EAAaI,CAAS,EAC5D,IAAIC,EAAgBd,EAAK,IAAIG,EAAeU,CAAS,EAEjDE,EAAuBC,GAAahB,EAAK,IAAIG,EAAeU,CAAS,CAAC,EAC1E,OAAAE,EAAY,KAAK,IAAIA,EAAW,EAAE,EAC9BA,GAAa,IACfT,EAASD,CAAgB,EAAI,CAACC,EAASD,CAAgB,EAAE,QAAQU,CAAS,GAErE,CAACT,EAAUQ,CAAa,CACjC,CAEA,IAAIG,GAAuB,CACzB,IAAKC,GAAMpB,GAAgC,KAAK,EAChD,IAAKoB,GAAMpB,GAAgC,KAAK,EAChD,QAASoB,GAAMpB,GAAgC,SAAS,EACxD,OAAQoB,GAAMpB,GAAgC,QAAQ,CACxD,EAMO,SAASqB,GAAcP,EAAahB,EAAM,CAC/C,GAAKA,EAGL,KAAII,EAAOY,EAAY,QAAQ,EAC3BQ,EAAWR,EAAY,iBACvBS,EAAOD,GAAYA,EAAS,WAKhC,GAAI,CAACvB,IAASD,CAAI,GAAK,CAAC0B,EAAQ1B,EAAK,KAAK,GAAK0B,EAAQD,CAAI,EAAG,CAC5D,IAAIE,EAAWC,GAAY5B,EAAMI,EAAMoB,EAAUR,CAAW,EAI5D,GADAhB,EAAO6B,GAAM7B,CAAI,EACbA,EAAK,MAAQqB,GAAqBrB,EAAK,IAAI,GAAK2B,EAAS,UAAYA,EAAS,UAAW,CAC3F,IAAInB,EAAkBsB,GAAQL,EAAME,EAAS,SAAS,GAAG,EACrDlB,EAAmBqB,GAAQL,EAAME,EAAS,UAAU,GAAG,EACvDI,EAAYV,GAAqBrB,EAAK,IAAI,EAAEI,EAAMuB,EAAS,UAAU,IAAKA,EAAS,YAAaA,EAAS,aAAcnB,EAAiBC,CAAgB,EAC5JT,EAAK,MAAQ+B,EAAU,CAAC,EAGxB/B,EAAK,MAAQ+B,EAAU,CAAC,CAC1B,MAEE/B,EAAK,MAAQ,CAACA,EAAK,OAAS,KAAOA,EAAK,MAAQA,EAAK,WAAYA,EAAK,OAAS,KAAOA,EAAK,MAAQA,EAAK,SAAS,CAErH,CAEA,GAAIA,EAAK,OAAS,MAAQ,CAAC0B,EAAQD,CAAI,EAAG,CACxCzB,EAAK,MAAQ,CAAC,EACd,IAAIgC,EAAWhB,EAAY,YAAY,EACvC,GAAIgB,GAAYhC,EAAK,MAAQqB,GAAqBrB,EAAK,IAAI,EAAG,CAC5D,IAAIiC,EAAYT,EAAS,aAAaQ,CAAQ,EAC1CC,IACFjC,EAAK,MAAQe,GAAaX,EAAMA,EAAK,aAAa6B,EAAU,GAAG,EAAGjC,EAAK,IAAI,EAE/E,CACF,KAGE,SADIkC,EAAQlC,EAAK,MACRmC,EAAI,EAAGA,EAAI,EAAGA,IACjBd,GAAqBa,EAAMC,CAAC,CAAC,IAC/BD,EAAMC,CAAC,EAAIpB,GAAaX,EAAMA,EAAK,aAAaqB,EAAKU,CAAC,CAAC,EAAGD,EAAMC,CAAC,CAAC,GAIxE,OAAOnC,EACT,CACO,SAAS4B,GAAY5B,EAAMI,EAAMoB,EAAUR,EAAa,CAC7D,IAAIoB,EAAM,CAAC,EACX,OAAIpC,EAAK,YAAc,MAAQA,EAAK,UAAY,MAC9CoC,EAAI,aAAepC,EAAK,YAAc,KAAOI,EAAK,aAAaJ,EAAK,UAAU,EAAIA,EAAK,SACvFoC,EAAI,UAAYZ,EAAS,QAAQa,IAAkBrB,EAAaoB,EAAI,YAAY,CAAC,EACjFA,EAAI,SAAWZ,EAAS,aAAaY,EAAI,SAAS,EAClDA,EAAI,YAAchC,EAAK,aAAagC,EAAI,SAAS,GAAG,IAEpDA,EAAI,SAAWpB,EAAY,YAAY,EACvCoB,EAAI,UAAYZ,EAAS,aAAaY,EAAI,QAAQ,EAClDA,EAAI,YAAchC,EAAK,aAAagC,EAAI,SAAS,GAAG,EACpDA,EAAI,aAAehC,EAAK,aAAagC,EAAI,UAAU,GAAG,GAEjDA,CACT,CACA,SAASC,IAAkBrB,EAAasB,EAAS,CAC/C,IAAIC,EAAUvB,EAAY,QAAQ,EAAE,iBAAiBsB,CAAO,EAC5D,OAAOC,GAAWA,EAAQ,QAC5B,CAKO,SAASC,GAEhBhB,EAAUxB,EAAM,CAEd,OAAOwB,GAAYA,EAAS,aAAexB,EAAK,OAAS,CAACD,GAAQC,CAAI,EAAIwB,EAAS,YAAYxB,EAAK,KAAK,EAAI,EAC/G,CACO,SAASyC,IAEhBjB,EAAUkB,EAAOC,EAAO,CAEtB,OAAOnB,GAAYA,EAAS,aAAekB,EAAM,OAASC,EAAM,OAAS,CAAC5C,GAAQ2C,CAAK,GAAK,CAAC3C,GAAQ4C,CAAK,EAAInB,EAAS,YAAYkB,EAAM,MAAOC,EAAM,KAAK,EAAI,EACjK,CACO,SAASC,GAA2BC,EAAYpB,EAAM,CAC3D,OAAOoB,EAAa,SAAU7C,EAAM8C,EAAS7B,EAAW8B,EAAU,CAChE,IAAIC,EAASD,EAAW,EAEtB/C,EAAK,OAASA,EAAK,MAAM+C,CAAQ,EAAI/C,EAAK,MAC5C,OAAOiD,GAAeD,EAAQvB,EAAKsB,CAAQ,CAAC,CAC9C,EAAI,SAAU/C,EAAM8C,EAAS7B,EAAW8B,EAAU,CAChD,OAAOE,GAAejD,EAAK,MAAOyB,EAAKsB,CAAQ,CAAC,CAClD,CACF,CACO,SAAShC,GAAaX,EAAM8C,EAAcC,EAAM,CACrD,GAAIA,IAAS,UAAW,CACtB,IAAIC,EAAQ,EACRC,EAAU,EACd,OAAAjD,EAAK,KAAK8C,EAAc,SAAUI,EAAKC,EAAK,CACrC,MAAMD,CAAG,IACZF,GAASE,EACTD,IAEJ,CAAC,EACMD,EAAQC,CACjB,KAAO,QAAIF,IAAS,SACX/C,EAAK,UAAU8C,CAAY,EAG3B9C,EAAK,cAAc8C,CAAY,EAAEC,IAAS,MAAQ,EAAI,CAAC,CAElE,CCjJA,IAAIK,GAAQC,GAAU,EAClBC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KACjBG,CACT,CACA,OAAAH,EAAW,UAAU,KAAO,UAAY,CACtC,KAAK,eAAiBI,GAAc,CACtC,EACAJ,EAAW,UAAU,OAAS,SAAUK,EAAaC,EAASC,EAAK,CACjE,IAAIJ,EAAQ,KACRK,EAAiB,KAAK,eAC1BA,EAAe,KAAK,SAAUC,EAAM,CAClCX,GAAMW,CAAI,EAAE,KAAO,EACrB,CAAC,EACDH,EAAQ,WAAW,SAAUI,EAAa,CACxC,IAAIL,EAAcM,GAAY,yBAAyBD,EAAaP,EAAM,IAAI,EAC9EE,GAAeF,EAAM,aAAaO,EAAaL,EAAaC,EAASC,CAAG,CAC1E,CAAC,EACDC,EAAe,KAAK,SAAUC,EAAM,CAClC,CAACX,GAAMW,CAAI,EAAE,MAAQN,EAAM,MAAM,OAAOM,EAAK,KAAK,CACpD,CAAC,EACDG,IAAQN,EAASE,EAAgB,KAAK,IAAI,CAC5C,EACAR,EAAW,UAAU,SAAW,SAAUa,EAAW,CACnDf,GAAMe,CAAS,EAAE,KAAO,EAC1B,EACAb,EAAW,UAAU,iBAAmB,SAAUc,EAAiBC,EAAQ,CACzE,IAAIZ,EAAQ,KACZa,EAAKF,EAAiB,SAAUJ,EAAa,CAC3C,IAAIL,EAAcM,GAAY,yBAAyBD,EAAaP,EAAM,IAAI,EAC9E,GAAIE,EAAa,CACf,IAAIY,EAAOZ,EAAY,QAAQ,EAC/BY,EAAK,kBAAkB,SAAUC,EAAI,CAC/BA,IACFH,EAASI,GAAUD,CAAE,EAAIE,GAAUF,CAAE,EAEzC,CAAC,CACH,CACF,CAAC,CACH,EACAlB,EAAW,KAAO,SACXA,CACT,GAAEqB,EAAa,EACf,SAAST,IAAQN,EAASE,EAAgBc,EAAM,CAC9ChB,EAAQ,WAAW,SAAUI,EAAa,CACxC,IAAIL,EAAcM,GAAY,yBAAyBD,EAAaY,CAAI,EACpEC,EAAaf,EAAe,IAAIE,EAAY,EAAE,EAClD,GAAIL,GAAekB,GAAcA,EAAW,MAAO,CACjD,IAAIC,EAAKC,GAAcpB,CAAW,EAChCqB,EAAIF,EAAG,EACPG,EAASH,EAAG,OACdI,GAAgBL,EAAW,MAAOG,EAAGC,CAAM,CAC7C,CACF,CAAC,CACH,CACA,IAAOE,GAAQ7B,ICvDf,SAAS8B,IAAmBC,EAAQC,EAAaC,EAAK,CACpD,IAAIC,EAAWF,EAAY,iBACvBG,EAAWF,EAAI,SAAS,EACxBG,EAAYH,EAAI,UAAU,EAC1BI,EAAYH,GAAYA,EAAS,SAAWA,EAAS,QAAQ,EACjEH,EAAO,KAAK,SAAUO,EAAK,CACzB,IAAIC,EAAYR,EAAO,aAAaO,CAAG,EACnCE,EAAyBD,EAAU,IAAI,YAAY,IAAM,aACzDE,EAAQD,EAAyBH,EAAYA,EAAU,MAAQ,EAAIF,EACnEO,EAASF,EAAyBH,EAAYA,EAAU,OAAS,EAAID,EACrEO,EAAOH,GAA0BH,EAAYA,EAAU,EAAI,EAC3DO,EAAMJ,GAA0BH,EAAYA,EAAU,EAAI,EAC1DQ,EACAC,EAAiBC,GAAaR,EAAU,IAAI,GAAG,EAAGE,CAAK,EAAIE,EAC3DK,EAAiBD,GAAaR,EAAU,IAAI,GAAG,EAAGG,CAAM,EAAIE,EAChE,GAAI,CAAC,MAAME,CAAG,GAAK,CAAC,MAAME,CAAG,EAC3BH,EAAQ,CAACC,EAAKE,CAAG,UAGVhB,EAAY,kBAEnBa,EAAQb,EAAY,kBAAkBD,EAAO,UAAUA,EAAO,WAAYO,CAAG,CAAC,UACrEJ,EAAU,CACnB,IAAIe,EAAIlB,EAAO,IAAIG,EAAS,WAAW,CAAC,EAAGI,CAAG,EAC1C,EAAIP,EAAO,IAAIG,EAAS,WAAW,CAAC,EAAGI,CAAG,EAC9CO,EAAQX,EAAS,YAAY,CAACe,EAAG,CAAC,CAAC,CACrC,CAEK,MAAMH,CAAG,IACZD,EAAM,CAAC,EAAIC,GAER,MAAME,CAAG,IACZH,EAAM,CAAC,EAAIG,GAEbjB,EAAO,cAAcO,EAAKO,CAAK,CACjC,CAAC,CACH,CACA,IAAIK,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KACpBG,CACT,CACA,OAAAH,EAAc,UAAU,gBAAkB,SAAUI,EAAgBC,EAAStB,EAAK,CAChFsB,EAAQ,WAAW,SAAUvB,EAAa,CACxC,IAAIwB,EAAUC,GAAY,yBAAyBzB,EAAa,WAAW,EACvEwB,IACF1B,IAAmB0B,EAAQ,QAAQ,EAAGxB,EAAaC,CAAG,EACtD,KAAK,eAAe,IAAID,EAAY,EAAE,EAAE,aAAa,EAEzD,EAAG,IAAI,CACT,EACAkB,EAAc,UAAU,aAAe,SAAUlB,EAAawB,EAASD,EAAStB,EAAK,CACnF,IAAIC,EAAWF,EAAY,iBACvB0B,EAAW1B,EAAY,GACvB2B,EAAa3B,EAAY,QAAQ,EACjC4B,EAAgB,KAAK,eACrBC,EAAaD,EAAc,IAAIF,CAAQ,GAAKE,EAAc,IAAIF,EAAU,IAAII,EAAY,EACxF/B,EAASgC,IAAW7B,EAAUF,EAAawB,CAAO,EAEtDA,EAAQ,QAAQzB,CAAM,EACtBD,IAAmB0B,EAAQ,QAAQ,EAAGxB,EAAaC,CAAG,EACtDF,EAAO,KAAK,SAAUO,EAAK,CACzB,IAAIC,EAAYR,EAAO,aAAaO,CAAG,EACnC0B,EAASzB,EAAU,WAAW,QAAQ,EACtC0B,EAAa1B,EAAU,WAAW,YAAY,EAC9C2B,EAAe3B,EAAU,WAAW,cAAc,EAClD4B,EAAe5B,EAAU,WAAW,cAAc,EAClD6B,EAAmB7B,EAAU,WAAW,kBAAkB,EAE9D,GAAI8B,GAAWL,CAAM,GAAKK,GAAWJ,CAAU,GAAKI,GAAWH,CAAY,GAAKG,GAAWF,CAAY,EAAG,CACxG,IAAIG,EAASd,EAAQ,YAAYlB,CAAG,EAChCiC,EAAaf,EAAQ,cAAclB,CAAG,EACtC+B,GAAWL,CAAM,IACnBA,EAASA,EAAOM,EAAQC,CAAU,GAEhCF,GAAWJ,CAAU,IAEvBA,EAAaA,EAAWK,EAAQC,CAAU,GAExCF,GAAWH,CAAY,IACzBA,EAAeA,EAAaI,EAAQC,CAAU,GAE5CF,GAAWF,CAAY,IACzBA,EAAeA,EAAaG,EAAQC,CAAU,EAElD,CACA,IAAIC,EAAQjC,EAAU,SAAS,WAAW,EAAE,aAAa,EACrDkC,EAAKlC,EAAU,IAAI,IAAI,EACvBmC,EAAQC,GAAkBhB,EAAY,OAAO,EAC5Ca,EAAM,OACTA,EAAM,KAAOE,GAEf3C,EAAO,cAAcO,EAAK,CACxB,GAAIsC,GAAUH,EAAI,CAAC,EACnB,OAAQT,EACR,WAAYC,EACZ,aAAcC,EACd,aAAcC,EACd,iBAAkBC,EAClB,MAAOI,CACT,CAAC,CACH,CAAC,EAEDX,EAAW,WAAW9B,CAAM,EAC5B,KAAK,MAAM,IAAI8B,EAAW,KAAK,EAG/B9B,EAAO,kBAAkB,SAAU8C,EAAI,CACrCA,EAAG,SAAS,SAAUC,EAAO,CAC3BC,GAAUD,CAAK,EAAE,UAAYtB,CAC/B,CAAC,CACH,CAAC,EACD,KAAK,SAASK,CAAU,EACxBA,EAAW,MAAM,OAASL,EAAQ,IAAI,QAAQ,GAAKxB,EAAY,IAAI,QAAQ,CAC7E,EACAkB,EAAc,KAAO,YACdA,CACT,GAAE8B,EAAU,EACZ,SAASjB,IAAW7B,EAAUF,EAAawB,EAAS,CAClD,IAAIyB,EACA/C,EACF+C,EAAiBC,EAAIhD,GAAYA,EAAS,WAAY,SAAUiD,EAAU,CACxE,IAAIC,EAAOpD,EAAY,QAAQ,EAAE,iBAAiBA,EAAY,QAAQ,EAAE,aAAamD,CAAQ,CAAC,GAAK,CAAC,EAEpG,OAAOE,EAAOA,EAAO,CAAC,EAAGD,CAAI,EAAG,CAC9B,KAAMD,EAEN,YAAa,IACf,CAAC,CACH,CAAC,EAEDF,EAAiB,CAAC,CAChB,KAAM,QACN,KAAM,OACR,CAAC,EAEH,IAAIlD,EAAS,IAAIuD,GAAWL,EAAgBzB,CAAO,EAC/C+B,EAAUL,EAAI1B,EAAQ,IAAI,MAAM,EAAGgC,GAAmBC,GAAezD,CAAW,CAAC,EACjFE,IACFqD,EAAUG,GAAOH,EAASC,GAAmBG,GAAYzD,CAAQ,CAAC,GAEpE,IAAI0D,EAA8BC,GAA2B,CAAC,CAAC3D,EAAU+C,CAAc,EACvF,OAAAlD,EAAO,SAASwD,EAAS,KAAMK,CAAc,EACtC7D,CACT,CACA,IAAO+D,IAAQ5C,IC5KR,SAAS6C,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAc,EAC/CD,EAAU,sBAAsBE,GAAa,EAC7CF,EAAU,qBAAqB,SAAUG,EAAK,CACxCC,GAAoBD,EAAI,OAAQ,WAAW,IAE7CA,EAAI,UAAYA,EAAI,WAAa,CAAC,EAEtC,CAAC,CACH,CCQA,IAAIE,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KACpBG,CACT,CACA,OAAAH,EAAc,UAAU,4BAA8B,SAAUI,EAAWC,EAAmBC,EAAS,CACrG,OAAO,IAAIN,EAAcI,EAAWC,EAAmBC,CAAO,CAChE,EACAN,EAAc,KAAO,WACrBA,EAAc,cAAgB,CAE5B,EAAG,EACH,OAAQ,CAAC,SAAU,OAAO,EAC1B,WAAY,CAAC,EAAG,EAAE,EAElB,aAAc,EACd,UAAW,EACX,QAAS,CACP,QAAS,MACX,EACA,MAAO,CACL,KAAM,GACN,SAAU,MACV,SAAU,CACZ,EACA,UAAW,CACT,KAAM,QACR,EACA,SAAU,CACR,MAAO,CACL,KAAM,EACR,EACA,UAAW,CACT,MAAO,CACT,CACF,EACA,gBAAiB,QACnB,EACOA,CACT,GAAEO,EAAW,EACNC,IAAQR,IC/Bf,IAAIS,GAAQC,GAAU,EAClBC,IAAoB,SAAUC,EAAaC,EAAUC,EAASC,EAAM,CACtE,IAAIC,EAAOJ,EAAY,QAAQ,EAC3BK,EACJ,GAAKC,EAAQH,CAAI,EAkDfE,EAAYF,MAlDM,CAElB,IAAII,EAASJ,EAAK,KAClB,GAAII,IAAW,OAASA,IAAW,OAASA,IAAW,WAAaA,IAAW,UAK5EJ,EAAK,OAAS,MAAQA,EAAK,OAAS,KAAM,CAC3C,IAAIK,EAAY,OACZC,EAAQ,OACZ,GAAIN,EAAK,OAAS,MAAQA,EAAK,OAAS,KACtCK,EAAYP,EAAS,QAAQE,EAAK,OAAS,KAAO,IAAM,GAAG,EAC3DM,EAAQC,GAASP,EAAK,MAAOA,EAAK,KAAK,MAClC,CACL,IAAIQ,EAAwBC,GAAYT,EAAMC,EAAMH,EAAUD,CAAW,EACzEQ,EAAYG,EAAS,UACrB,IAAIE,EAAeC,GAAoBV,EAAMO,EAAS,YAAY,EAClEF,EAAqBM,GAAaX,EAAMS,EAAcN,CAAM,CAC9D,CACA,IAAIS,EAAaR,EAAU,MAAQ,IAAM,EAAI,EACzCS,EAAY,EAAID,EAEhBE,EAASC,GAAMhB,CAAI,EACnBiB,EAAO,CACT,MAAO,CAAC,CACV,EACAF,EAAO,KAAO,KACdA,EAAO,MAAQ,CAAC,EAChBA,EAAO,MAAMD,CAAS,EAAI,KAC1BG,EAAK,MAAMH,CAAS,EAAI,IACxB,IAAII,EAAYnB,EAAQ,IAAI,WAAW,EACnCmB,GAAa,GAAKC,GAASb,CAAK,IAClCA,EAAQ,CAACA,EAAM,QAAQ,KAAK,IAAIY,EAAW,EAAE,CAAC,GAEhDH,EAAO,MAAMF,CAAU,EAAII,EAAK,MAAMJ,CAAU,EAAIP,EACpDJ,EAAY,CAACa,EAAQE,EAAM,CACzB,KAAMb,EACN,WAAYJ,EAAK,WAEjB,MAAOM,CACT,CAAC,CACH,MAKEJ,EAAY,CAAC,CAEjB,CAGA,IAAIkB,EAAiB,CAAcC,GAAcxB,EAAaK,EAAU,CAAC,CAAC,EAAgBmB,GAAcxB,EAAaK,EAAU,CAAC,CAAC,EAAGoB,EAAO,CAAC,EAAGpB,EAAU,CAAC,CAAC,CAAC,EAE5J,OAAAkB,EAAe,CAAC,EAAE,KAAOA,EAAe,CAAC,EAAE,MAAQ,KAEnDG,GAAMH,EAAe,CAAC,EAAGA,EAAe,CAAC,CAAC,EAC1CG,GAAMH,EAAe,CAAC,EAAGA,EAAe,CAAC,CAAC,EACnCA,CACT,EACA,SAASI,GAAWC,EAAK,CACvB,MAAO,CAAC,MAAMA,CAAG,GAAK,CAAC,SAASA,CAAG,CACrC,CAEA,SAASC,IAAqBC,EAAUC,EAAWC,EAAS/B,EAAU,CACpE,IAAIgC,EAAgB,EAAIH,EACpBI,EAAUjC,EAAS,WAAW6B,CAAQ,EAC1C,OAAOH,GAAWI,EAAUE,CAAa,CAAC,GAAKN,GAAWK,EAAQC,CAAa,CAAC,GAAKF,EAAUD,CAAQ,IAAME,EAAQF,CAAQ,GAAK7B,EAAS,QAAQiC,CAAO,EAAE,YAAYH,EAAUD,CAAQ,CAAC,CAC7L,CACA,SAASK,IAAelC,EAAUE,EAAM,CACtC,GAAIF,EAAS,OAAS,cAAe,CACnC,IAAI8B,EAAY5B,EAAK,CAAC,EAAE,MACpB6B,EAAU7B,EAAK,CAAC,EAAE,MAOtB,GAAI4B,GAAaC,IAAYH,IAAqB,EAAGE,EAAWC,EAAS/B,CAAQ,GAAK4B,IAAqB,EAAGE,EAAWC,EAAS/B,CAAQ,GACxI,MAAO,EAEX,CACA,OAAoBmC,GAAWnC,EAAUE,EAAK,CAAC,CAAC,GAAkBiC,GAAWnC,EAAUE,EAAK,CAAC,CAAC,CAChG,CACA,SAASkC,GAA4BjC,EAAMkC,EAAKC,EAAQvC,EAAawC,EAAK,CACxE,IAAIvC,EAAWD,EAAY,iBACvByC,EAAYrC,EAAK,aAAakC,CAAG,EACjCI,EACAC,EAAiBC,GAAaH,EAAU,IAAI,GAAG,EAAGD,EAAI,SAAS,CAAC,EAChEK,EAAiBD,GAAaH,EAAU,IAAI,GAAG,EAAGD,EAAI,UAAU,CAAC,EACrE,GAAI,CAAC,MAAMG,CAAG,GAAK,CAAC,MAAME,CAAG,EAC3BH,EAAQ,CAACC,EAAKE,CAAG,MACZ,CAEL,GAAI7C,EAAY,kBAEd0C,EAAQ1C,EAAY,kBAAkBI,EAAK,UAAUA,EAAK,WAAYkC,CAAG,CAAC,MACrE,CACL,IAAIQ,EAAO7C,EAAS,WAChB8C,EAAI3C,EAAK,IAAI0C,EAAK,CAAC,EAAGR,CAAG,EACzBU,EAAI5C,EAAK,IAAI0C,EAAK,CAAC,EAAGR,CAAG,EAC7BI,EAAQzC,EAAS,YAAY,CAAC8C,EAAGC,CAAC,CAAC,CACrC,CAUA,GAAIC,GAAuBhD,EAAU,aAAa,EAAG,CAEnD,IAAIiD,EAAQjD,EAAS,QAAQ,GAAG,EAC5BkD,EAAQlD,EAAS,QAAQ,GAAG,EAC5B6C,EAAO7C,EAAS,WAChB0B,GAAWvB,EAAK,IAAI0C,EAAK,CAAC,EAAGR,CAAG,CAAC,EACnCI,EAAM,CAAC,EAAIQ,EAAM,cAAcA,EAAM,UAAU,EAAEX,EAAS,EAAI,CAAC,CAAC,EACvDZ,GAAWvB,EAAK,IAAI0C,EAAK,CAAC,EAAGR,CAAG,CAAC,IAC1CI,EAAM,CAAC,EAAIS,EAAM,cAAcA,EAAM,UAAU,EAAEZ,EAAS,EAAI,CAAC,CAAC,EAEpE,CAEK,MAAMI,CAAG,IACZD,EAAM,CAAC,EAAIC,GAER,MAAME,CAAG,IACZH,EAAM,CAAC,EAAIG,EAEf,CACAzC,EAAK,cAAckC,EAAKI,CAAK,CAC/B,CACA,IAAIU,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,gBAAkB,SAAUI,EAAeC,EAASjB,EAAK,CAC9EiB,EAAQ,WAAW,SAAUzD,EAAa,CACxC,IAAIE,EAAUwD,GAAY,yBAAyB1D,EAAa,UAAU,EAC1E,GAAIE,EAAS,CACX,IAAIyD,EAAWzD,EAAQ,QAAQ,EAC3B0D,EAAa/D,GAAMK,CAAO,EAAE,KAC5B2D,EAAWhE,GAAMK,CAAO,EAAE,GAE9B0D,EAAW,KAAK,SAAUtB,EAAK,CAC7BD,GAA4BuB,EAAYtB,EAAK,GAAMtC,EAAawC,CAAG,EACnEH,GAA4BwB,EAAUvB,EAAK,GAAOtC,EAAawC,CAAG,CACpE,CAAC,EAEDmB,EAAS,KAAK,SAAUrB,EAAK,CAC3BqB,EAAS,cAAcrB,EAAK,CAACsB,EAAW,cAActB,CAAG,EAAGuB,EAAS,cAAcvB,CAAG,CAAC,CAAC,CAC1F,CAAC,EACD,KAAK,eAAe,IAAItC,EAAY,EAAE,EAAE,aAAa,CACvD,CACF,EAAG,IAAI,CACT,EACAoD,EAAa,UAAU,aAAe,SAAUpD,EAAaE,EAASuD,EAASjB,EAAK,CAClF,IAAIvC,EAAWD,EAAY,iBACvB8D,EAAW9D,EAAY,GACvB+D,EAAa/D,EAAY,QAAQ,EACjCgE,EAAc,KAAK,eACnBC,EAAWD,EAAY,IAAIF,CAAQ,GAAKE,EAAY,IAAIF,EAAU,IAAII,EAAU,EACpF,KAAK,MAAM,IAAID,EAAS,KAAK,EAC7B,IAAIE,EAASC,IAAWnE,EAAUD,EAAaE,CAAO,EAClDmE,EAAWF,EAAO,KAClBG,EAASH,EAAO,GAChBI,EAAWJ,EAAO,KACtBtE,GAAMK,CAAO,EAAE,KAAOmE,EACtBxE,GAAMK,CAAO,EAAE,GAAKoE,EAEpBpE,EAAQ,QAAQqE,CAAQ,EAKxB,IAAIC,EAAatE,EAAQ,IAAI,QAAQ,EACjCuE,EAAavE,EAAQ,IAAI,YAAY,EACrCwE,EAAexE,EAAQ,IAAI,cAAc,EACzCyE,EAAezE,EAAQ,IAAI,cAAc,EAExCI,EAAQkE,CAAU,IACrBA,EAAa,CAACA,EAAYA,CAAU,GAEjClE,EAAQmE,CAAU,IACrBA,EAAa,CAACA,EAAYA,CAAU,GAEjCnE,EAAQoE,CAAY,IACvBA,EAAe,CAACA,EAAcA,CAAY,GAEvCpE,EAAQqE,CAAY,IACvBA,EAAe,CAACA,EAAcA,CAAY,GAG5CR,EAAO,KAAK,KAAK,SAAU7B,EAAK,CAC9BsC,EAA0BP,EAAU/B,EAAK,EAAI,EAC7CsC,EAA0BN,EAAQhC,EAAK,EAAK,CAC9C,CAAC,EAEDiC,EAAS,KAAK,SAAUjC,EAAK,CAC3B,IAAIG,EAAY8B,EAAS,aAAajC,CAAG,EACrCuC,EAAYpC,EAAU,SAAS,WAAW,EAAE,aAAa,EAI7D8B,EAAS,cAAcjC,EAAK,CAAC+B,EAAS,cAAc/B,CAAG,EAAGgC,EAAO,cAAchC,CAAG,CAAC,CAAC,EACpF,IAAIwC,EAAKrC,EAAU,IAAI,IAAI,EACvBoC,EAAU,QAAU,OACtBA,EAAU,OAASR,EAAS,cAAc/B,EAAK,OAAO,EAAE,MAE1DiC,EAAS,cAAcjC,EAAK,CAC1B,GAAIyC,GAAUD,EAAI,CAAC,EACnB,qBAAsBT,EAAS,cAAc/B,EAAK,kBAAkB,EACpE,iBAAkB+B,EAAS,cAAc/B,EAAK,cAAc,EAC5D,iBAAkB+B,EAAS,cAAc/B,EAAK,cAAc,EAC5D,eAAgB+B,EAAS,cAAc/B,EAAK,YAAY,EACxD,WAAY+B,EAAS,cAAc/B,EAAK,QAAQ,EAChD,mBAAoBgC,EAAO,cAAchC,EAAK,kBAAkB,EAChE,eAAgBgC,EAAO,cAAchC,EAAK,cAAc,EACxD,eAAgBgC,EAAO,cAAchC,EAAK,cAAc,EACxD,aAAcgC,EAAO,cAAchC,EAAK,YAAY,EACpD,SAAUgC,EAAO,cAAchC,EAAK,QAAQ,EAC5C,MAAOuC,CACT,CAAC,CACH,CAAC,EACDZ,EAAS,WAAWM,CAAQ,EAG5BJ,EAAO,KAAK,kBAAkB,SAAUa,EAAI,CAC1CC,GAAUD,CAAE,EAAE,UAAY9E,EAC1B8E,EAAG,SAAS,SAAUE,EAAO,CAC3BD,GAAUC,CAAK,EAAE,UAAYhF,CAC/B,CAAC,CACH,CAAC,EACD,SAAS0E,EAA0BxE,EAAMkC,EAAKC,EAAQ,CACpD,IAAIE,EAAYrC,EAAK,aAAakC,CAAG,EACrCD,GAA4BjC,EAAMkC,EAAKC,EAAQvC,EAAawC,CAAG,EAC/D,IAAI2C,EAAQ1C,EAAU,SAAS,WAAW,EAAE,aAAa,EACrD0C,EAAM,MAAQ,OAChBA,EAAM,KAAOC,GAAkBrB,EAAY,OAAO,GAEpD3D,EAAK,cAAckC,EAAK,CACtB,iBAAkBG,EAAU,IAAI,kBAAkB,EAElD,aAAcsC,GAAUtC,EAAU,IAAI,eAAgB,EAAI,EAAGkC,EAAapC,EAAS,EAAI,CAAC,CAAC,EACzF,aAAcwC,GAAUtC,EAAU,IAAI,eAAgB,EAAI,EAAGiC,EAAanC,EAAS,EAAI,CAAC,CAAC,EAEzF,WAAYwC,GAAUtC,EAAU,IAAI,YAAY,EAAGgC,EAAWlC,EAAS,EAAI,CAAC,CAAC,EAC7E,OAAQwC,GAAUtC,EAAU,IAAI,SAAU,EAAI,EAAG+B,EAAWjC,EAAS,EAAI,CAAC,CAAC,EAC3E,MAAO4C,CACT,CAAC,CACH,CACA,KAAK,SAASlB,CAAQ,EACtBA,EAAS,MAAM,OAAS/D,EAAQ,IAAI,QAAQ,GAAKF,EAAY,IAAI,QAAQ,CAC3E,EACAoD,EAAa,KAAO,WACbA,CACT,GAAEiC,EAAU,EACZ,SAASjB,IAAWnE,EAAUD,EAAaE,EAAS,CAClD,IAAIoF,EACArF,EACFqF,EAAiBC,EAAItF,GAAYA,EAAS,WAAY,SAAUuF,EAAU,CACxE,IAAIC,EAAOzF,EAAY,QAAQ,EAAE,iBAAiBA,EAAY,QAAQ,EAAE,aAAawF,CAAQ,CAAC,GAAK,CAAC,EAEpG,OAAO/D,EAAOA,EAAO,CAAC,EAAGgE,CAAI,EAAG,CAC9B,KAAMD,EAEN,YAAa,IACf,CAAC,CACH,CAAC,EAEDF,EAAiB,CAAC,CAChB,KAAM,QACN,KAAM,OACR,CAAC,EAEH,IAAIjB,EAAW,IAAIqB,GAAWJ,EAAgBpF,CAAO,EACjDoE,EAAS,IAAIoB,GAAWJ,EAAgBpF,CAAO,EAE/CqE,EAAW,IAAImB,GAAW,CAAC,EAAGxF,CAAO,EACrCyF,EAAUJ,EAAIrF,EAAQ,IAAI,MAAM,EAAG0F,GAAM7F,IAAmBC,EAAaC,EAAUC,CAAO,CAAC,EAC3FD,IACF0F,EAAUE,GAAOF,EAASC,GAAMzD,IAAgBlC,CAAQ,CAAC,GAE3D,IAAI6F,EAA8BC,GAA2B,CAAC,CAAC9F,EAAUqF,CAAc,EACvF,OAAAjB,EAAS,SAASkB,EAAII,EAAS,SAAUxF,EAAM,CAC7C,OAAOA,EAAK,CAAC,CACf,CAAC,EAAG,KAAM2F,CAAc,EACxBxB,EAAO,SAASiB,EAAII,EAAS,SAAUxF,EAAM,CAC3C,OAAOA,EAAK,CAAC,CACf,CAAC,EAAG,KAAM2F,CAAc,EACxBvB,EAAS,SAASgB,EAAII,EAAS,SAAUxF,EAAM,CAC7C,OAAOA,EAAK,CAAC,CACf,CAAC,CAAC,EACFoE,EAAS,cAAgB,GAClB,CACL,KAAMF,EACN,GAAIC,EACJ,KAAMC,CACR,CACF,CACA,IAAOyB,IAAQ5C,ICjVR,SAAS6C,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAa,EAC9CD,EAAU,sBAAsBE,GAAY,EAC5CF,EAAU,qBAAqB,SAAUG,EAAK,CACxCC,GAAoBD,EAAI,OAAQ,UAAU,IAE5CA,EAAI,SAAWA,EAAI,UAAY,CAAC,EAEpC,CAAC,CACH,CCQA,IAAIE,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KACpBG,CACT,CACA,OAAAH,EAAc,UAAU,4BAA8B,SAAUI,EAAWC,EAAmBC,EAAS,CACrG,OAAO,IAAIN,EAAcI,EAAWC,EAAmBC,CAAO,CAChE,EACAN,EAAc,KAAO,WACrBA,EAAc,cAAgB,CAG5B,EAAG,EACH,QAAS,CACP,QAAS,MACX,EAEA,UAAW,GACX,MAAO,CACL,KAAM,GACN,SAAU,KACZ,EACA,UAAW,CAIT,YAAa,CACf,EACA,SAAU,CACR,MAAO,CACL,KAAM,GACN,SAAU,KACZ,CACF,CACF,EACOA,CACT,GAAEO,EAAW,EACNC,IAAQR,ICvBf,IAAIS,GAAQC,GAAU,EAClBC,IAAoB,SAAUC,EAAaC,EAAUC,EAASC,EAAM,CAEtE,IAAIC,EAAQD,EAAK,CAAC,EACdE,EAAQF,EAAK,CAAC,EAClB,GAAI,GAACC,GAAS,CAACC,GAGf,KAAIC,EAAkBC,GAAcP,EAAaI,CAAK,EAClDI,EAAkBD,GAAcP,EAAaK,CAAK,EAElDI,EAAUH,EAAG,MACbI,EAAUF,EAAG,MACjBC,EAAQ,CAAC,EAAIE,GAASF,EAAQ,CAAC,EAAG,IAAS,EAC3CA,EAAQ,CAAC,EAAIE,GAASF,EAAQ,CAAC,EAAG,IAAS,EAC3CC,EAAQ,CAAC,EAAIC,GAASD,EAAQ,CAAC,EAAG,GAAQ,EAC1CA,EAAQ,CAAC,EAAIC,GAASD,EAAQ,CAAC,EAAG,GAAQ,EAE1C,IAAIE,EAASC,GAAS,CAAC,CAAC,EAAGP,EAAIE,CAAE,CAAC,EAClC,OAAAI,EAAO,MAAQ,CAACN,EAAG,MAAOE,EAAG,KAAK,EAClCI,EAAO,GAAKN,EAAG,EACfM,EAAO,GAAKN,EAAG,EACfM,EAAO,GAAKJ,EAAG,EACfI,EAAO,GAAKJ,EAAG,EACRI,EACT,EACA,SAASE,GAAWC,EAAK,CACvB,MAAO,CAAC,MAAMA,CAAG,GAAK,CAAC,SAASA,CAAG,CACrC,CAEA,SAASC,IAAqBC,EAAUC,EAAWC,EAASlB,EAAU,CACpE,IAAImB,EAAgB,EAAIH,EACxB,OAAOH,GAAWI,EAAUE,CAAa,CAAC,GAAKN,GAAWK,EAAQC,CAAa,CAAC,CAClF,CACA,SAASC,IAAepB,EAAUE,EAAM,CACtC,IAAIe,EAAYf,EAAK,MAAM,CAAC,EACxBgB,EAAUhB,EAAK,MAAM,CAAC,EACtBC,EAAQ,CACV,MAAOc,EACP,EAAGf,EAAK,GACR,EAAGA,EAAK,EACV,EACIE,EAAQ,CACV,MAAOc,EACP,EAAGhB,EAAK,GACR,EAAGA,EAAK,EACV,EACA,OAAImB,GAAuBrB,EAAU,aAAa,EAO5CiB,GAAaC,IAAYH,IAAqB,EAAGE,EAAWC,EAASlB,CAAQ,GAAKe,IAAqB,EAAGE,EAAWC,EAASlB,CAAQ,GACjI,GAOWsB,IAAWtB,EAAUG,EAAOC,CAAK,EAEnCmB,GAAWvB,EAAUG,CAAK,GAAkBoB,GAAWvB,EAAUI,CAAK,CAC5F,CAEA,SAASoB,IAAwBC,EAAMC,EAAKC,EAAM5B,EAAa6B,EAAK,CAClE,IAAI5B,EAAWD,EAAY,iBACvB8B,EAAYJ,EAAK,aAAaC,CAAG,EACjCI,EACAC,EAAiBC,GAAaH,EAAU,IAAIF,EAAK,CAAC,CAAC,EAAGC,EAAI,SAAS,CAAC,EACpEK,EAAiBD,GAAaH,EAAU,IAAIF,EAAK,CAAC,CAAC,EAAGC,EAAI,UAAU,CAAC,EACzE,GAAI,CAAC,MAAMG,CAAG,GAAK,CAAC,MAAME,CAAG,EAC3BH,EAAQ,CAACC,EAAKE,CAAG,MACZ,CAEL,GAAIlC,EAAY,kBAAmB,CAGjC,IAAImC,EAAcT,EAAK,UAAU,CAAC,KAAM,IAAI,EAAGC,CAAG,EAC9CS,EAAcV,EAAK,UAAU,CAAC,KAAM,IAAI,EAAGC,CAAG,EAC9CU,EAAmBpC,EAAS,UAAUkC,CAAW,EACjDG,EAAmBrC,EAAS,UAAUmC,CAAW,EACjDG,EAAa,CAAC,EACdX,EAAK,CAAC,IAAM,KACdW,EAAW,CAAC,EAAIF,EAAiB,CAAC,EAAIC,EAAiB,CAAC,EAAIF,EAAY,CAAC,EAAID,EAAY,CAAC,EAE1FI,EAAW,CAAC,EAAIF,EAAiB,CAAC,EAAIC,EAAiB,CAAC,EAAIH,EAAY,CAAC,EAAIC,EAAY,CAAC,EAExFR,EAAK,CAAC,IAAM,KACdW,EAAW,CAAC,EAAIF,EAAiB,CAAC,EAAIC,EAAiB,CAAC,EAAIF,EAAY,CAAC,EAAID,EAAY,CAAC,EAE1FI,EAAW,CAAC,EAAIF,EAAiB,CAAC,EAAIC,EAAiB,CAAC,EAAIH,EAAY,CAAC,EAAIC,EAAY,CAAC,EAG5FL,EAAQ/B,EAAY,kBAAkBuC,EAAYX,EAAM,EAAI,CAC9D,KAAO,CACL,IAAIY,EAAId,EAAK,IAAIE,EAAK,CAAC,EAAGD,CAAG,EACzBc,EAAIf,EAAK,IAAIE,EAAK,CAAC,EAAGD,CAAG,EACzBe,EAAK,CAACF,EAAGC,CAAC,EACdxC,EAAS,WAAaA,EAAS,UAAUyC,EAAIA,CAAE,EAC/CX,EAAQ9B,EAAS,YAAYyC,EAAI,EAAI,CACvC,CACA,GAAIpB,GAAuBrB,EAAU,aAAa,EAAG,CAEnD,IAAI0C,EAAQ1C,EAAS,QAAQ,GAAG,EAC5B2C,EAAQ3C,EAAS,QAAQ,GAAG,EAC5BuC,EAAId,EAAK,IAAIE,EAAK,CAAC,EAAGD,CAAG,EACzBc,EAAIf,EAAK,IAAIE,EAAK,CAAC,EAAGD,CAAG,EACzBb,GAAW0B,CAAC,EACdT,EAAM,CAAC,EAAIY,EAAM,cAAcA,EAAM,UAAU,EAAEf,EAAK,CAAC,IAAM,KAAO,EAAI,CAAC,CAAC,EACjEd,GAAW2B,CAAC,IACrBV,EAAM,CAAC,EAAIa,EAAM,cAAcA,EAAM,UAAU,EAAEhB,EAAK,CAAC,IAAM,KAAO,EAAI,CAAC,CAAC,EAE9E,CAEK,MAAMI,CAAG,IACZD,EAAM,CAAC,EAAIC,GAER,MAAME,CAAG,IACZH,EAAM,CAAC,EAAIG,EAEf,CACA,OAAOH,CACT,CACO,IAAIc,IAAkB,CAAC,CAAC,KAAM,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,KAAM,IAAI,EAAG,CAAC,KAAM,IAAI,CAAC,EAChFC,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAa,KACnBG,CACT,CACA,OAAAH,EAAa,UAAU,gBAAkB,SAAUI,EAAeC,EAAStB,EAAK,CAC9EsB,EAAQ,WAAW,SAAUnD,EAAa,CACxC,IAAIE,EAAUkD,GAAY,yBAAyBpD,EAAa,UAAU,EAC1E,GAAIE,EAAS,CACX,IAAImD,EAAanD,EAAQ,QAAQ,EACjCmD,EAAW,KAAK,SAAU1B,EAAK,CAC7B,IAAI2B,EAASC,EAAIV,IAAiB,SAAUW,EAAK,CAC/C,OAAO/B,IAAwB4B,EAAY1B,EAAK6B,EAAKxD,EAAa6B,CAAG,CACvE,CAAC,EAEDwB,EAAW,cAAc1B,EAAK2B,CAAM,EACpC,IAAIG,EAAKJ,EAAW,iBAAiB1B,CAAG,EACxC8B,EAAG,SAAS,SAAUH,CAAM,CAC9B,CAAC,CACH,CACF,EAAG,IAAI,CACT,EACAR,EAAa,UAAU,aAAe,SAAU9C,EAAaE,EAASiD,EAAStB,EAAK,CAClF,IAAI5B,EAAWD,EAAY,iBACvB0D,EAAW1D,EAAY,GACvB2D,EAAa3D,EAAY,QAAQ,EACjC4D,EAAe,KAAK,eACpBC,EAAeD,EAAa,IAAIF,CAAQ,GAAKE,EAAa,IAAIF,EAAU,CAC1E,MAAO,IAAYI,EACrB,CAAC,EACD,KAAK,MAAM,IAAID,EAAa,KAAK,EACjC,KAAK,SAASA,CAAY,EAC1B,IAAIE,EAAWC,IAAW/D,EAAUD,EAAaE,CAAO,EAExDA,EAAQ,QAAQ6D,CAAQ,EAExBA,EAAS,KAAK,SAAUpC,EAAK,CAE3B,IAAI2B,EAASC,EAAIV,IAAiB,SAAUW,EAAK,CAC/C,OAAO/B,IAAwBsC,EAAUpC,EAAK6B,EAAKxD,EAAa6B,CAAG,CACrE,CAAC,EACGoC,EAAahE,EAAS,QAAQ,GAAG,EAAE,MACnCiE,EAAajE,EAAS,QAAQ,GAAG,EAAE,MACnCkE,EAAcF,EAAW,UAAU,EACnCG,EAAcF,EAAW,UAAU,EACnCG,EAAe,CAACJ,EAAW,MAAMF,EAAS,IAAI,KAAMpC,CAAG,CAAC,EAAGsC,EAAW,MAAMF,EAAS,IAAI,KAAMpC,CAAG,CAAC,CAAC,EACpG2C,EAAe,CAACJ,EAAW,MAAMH,EAAS,IAAI,KAAMpC,CAAG,CAAC,EAAGuC,EAAW,MAAMH,EAAS,IAAI,KAAMpC,CAAG,CAAC,CAAC,EAC7F4C,GAAIF,CAAY,EAChBE,GAAID,CAAY,EAC3B,IAAIE,EAAa,EAAEL,EAAY,CAAC,EAAIE,EAAa,CAAC,GAAKF,EAAY,CAAC,EAAIE,EAAa,CAAC,GAAKD,EAAY,CAAC,EAAIE,EAAa,CAAC,GAAKF,EAAY,CAAC,EAAIE,EAAa,CAAC,GAG1JG,EAAa,CAACD,EAClBT,EAAS,cAAcpC,EAAK,CAC1B,OAAQ2B,EACR,WAAYmB,CACd,CAAC,EACD,IAAI3C,EAAYiC,EAAS,aAAapC,CAAG,EACrC+C,EAAQ5C,EAAU,SAAS,WAAW,EAAE,aAAa,EACrD6C,EAAK7C,EAAU,IAAI,IAAI,EACvB8C,EAAQC,GAAkBlB,EAAY,OAAO,EAC5Ce,EAAM,OACTA,EAAM,KAAOE,EACTE,GAASJ,EAAM,IAAI,IACrBA,EAAM,KAAiBK,GAAYL,EAAM,KAAM,EAAG,IAGjDA,EAAM,SACTA,EAAM,OAASE,GAGjBb,EAAS,cAAcpC,EAAK,QAAS+C,CAAK,EAC1CX,EAAS,cAAcpC,EAAK,KAAMqD,GAAUL,EAAI,CAAC,CAAC,CACpD,CAAC,EACDZ,EAAS,KAAKlE,GAAMgE,CAAY,EAAE,IAAI,EAAE,IAAI,SAAUlC,EAAK,CACzD,IAAIsD,EAASlB,EAAS,cAAcpC,CAAG,EACnCgD,EAAKZ,EAAS,cAAcpC,EAAK,IAAI,EACzC,GAAI,CAACsD,EAAO,WAAY,CACtB,IAAIC,EAAU,IAAYC,GAAQ,CAChC,GAAIH,GAAUL,EAAI,CAAC,EACnB,MAAO,CACL,OAAQM,EAAO,MACjB,CACF,CAAC,EACDlB,EAAS,iBAAiBpC,EAAKuD,CAAO,EACtCrB,EAAa,MAAM,IAAIqB,CAAO,CAChC,CACF,CAAC,EAAE,OAAO,SAAUE,EAAQC,EAAQ,CAClC,IAAIH,EAAUrF,GAAMgE,CAAY,EAAE,KAAK,iBAAiBwB,CAAM,EAC1DJ,EAASlB,EAAS,cAAcqB,CAAM,EACtCT,EAAKZ,EAAS,cAAcqB,EAAQ,IAAI,EACvCH,EAAO,WAiBDC,GACTrB,EAAa,MAAM,OAAOqB,CAAO,GAjB7BA,EACMI,GAAYJ,EAAS,CAC3B,GAAIF,GAAUL,EAAI,CAAC,EACnB,MAAO,CACL,OAAQM,EAAO,MACjB,CACF,EAAG/E,EAASkF,CAAM,EAElBF,EAAU,IAAYC,GAAQ,CAC5B,MAAO,CACL,OAAQF,EAAO,MACjB,CACF,CAAC,EAEHlB,EAAS,iBAAiBqB,EAAQF,CAAO,EACzCrB,EAAa,MAAM,IAAIqB,CAAO,EAIlC,CAAC,EAAE,OAAO,SAAUvD,EAAK,CACvB,IAAIuD,EAAUrF,GAAMgE,CAAY,EAAE,KAAK,iBAAiBlC,CAAG,EAC3DkC,EAAa,MAAM,OAAOqB,CAAO,CACnC,CAAC,EAAE,QAAQ,EACXnB,EAAS,kBAAkB,SAAUmB,EAASvD,EAAK,CACjD,IAAIG,EAAYiC,EAAS,aAAapC,CAAG,EACrC+C,EAAQX,EAAS,cAAcpC,EAAK,OAAO,EAC/CuD,EAAQ,SAASnB,EAAS,cAAcpC,EAAK,OAAO,CAAC,EACrD4D,GAAcL,EAASM,GAAqB1D,CAAS,EAAG,CACtD,aAAc5B,EACd,eAAgByB,EAChB,YAAaoC,EAAS,QAAQpC,CAAG,GAAK,GACtC,aAAcmD,GAASJ,EAAM,IAAI,EAAcK,GAAYL,EAAM,KAAM,CAAC,EAAIe,EAAO,MAAM,SAC3F,CAAC,EACDC,GAAyBR,EAASpD,CAAS,EAC3C6D,GAAoBT,EAAS,KAAM,KAAMpD,EAAU,IAAI,CAAC,WAAY,UAAU,CAAC,CAAC,EAChF8D,GAAUV,CAAO,EAAE,UAAYhF,CACjC,CAAC,EACDL,GAAMgE,CAAY,EAAE,KAAOE,EAC3BF,EAAa,MAAM,OAAS3D,EAAQ,IAAI,QAAQ,GAAKF,EAAY,IAAI,QAAQ,CAC/E,EACA8C,EAAa,KAAO,WACbA,CACT,GAAE+C,EAAU,EACZ,SAAS7B,IAAW/D,EAAUD,EAAaE,EAAS,CAClD,IAAI6D,EACA+B,EACAlE,EAAO,CAAC,KAAM,KAAM,KAAM,IAAI,EAClC,GAAI3B,EAAU,CACZ,IAAI8F,EAAmBxC,EAAItD,GAAYA,EAAS,WAAY,SAAU+F,EAAU,CAC9E,IAAItE,EAAO1B,EAAY,QAAQ,EAC3BiG,EAAOvE,EAAK,iBAAiBA,EAAK,aAAasE,CAAQ,CAAC,GAAK,CAAC,EAElE,OAAOE,EAAOA,EAAO,CAAC,EAAGD,CAAI,EAAG,CAC9B,KAAMD,EAEN,YAAa,IACf,CAAC,CACH,CAAC,EACDF,EAAWvC,EAAI3B,EAAM,SAAU4B,EAAK7B,EAAK,CACvC,MAAO,CACL,KAAM6B,EACN,KAAMuC,EAAiBpE,EAAM,CAAC,EAAE,IAClC,CACF,CAAC,EACDoC,EAAW,IAAIoC,GAAWL,EAAU5F,CAAO,CAC7C,MACE4F,EAAW,CAAC,CACV,KAAM,QACN,KAAM,OACR,CAAC,EACD/B,EAAW,IAAIoC,GAAWL,EAAU5F,CAAO,EAE7C,IAAIkG,EAAU7C,EAAIrD,EAAQ,IAAI,MAAM,EAAGmG,GAAMtG,IAAmBC,EAAaC,EAAUC,CAAO,CAAC,EAC3FD,IACFmG,EAAUE,GAAOF,EAASC,GAAMhF,IAAgBpB,CAAQ,CAAC,GAE3D,IAAIsG,EAAiBtG,EAAW,SAAUE,EAAMqG,EAASC,EAAWxF,EAAU,CAE5E,IAAIyF,EAASvG,EAAK,MAAM,KAAK,MAAMc,EAAW,CAAC,CAAC,EAAEA,EAAW,CAAC,EAC9D,OAAO0F,GAAeD,EAAQZ,EAAS7E,CAAQ,CAAC,CAClD,EAAI,SAAUd,EAAMqG,EAASC,EAAWxF,EAAU,CAChD,OAAO0F,GAAexG,EAAK,MAAO2F,EAAS7E,CAAQ,CAAC,CACtD,EACA,OAAA8C,EAAS,SAASqC,EAAS,KAAMG,CAAc,EAC/CxC,EAAS,cAAgB,GAClBA,CACT,CACA,IAAO6C,IAAQ9D,ICnUR,SAAS+D,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAa,EAC9CD,EAAU,sBAAsBE,GAAY,EAC5CF,EAAU,qBAAqB,SAAUG,EAAK,CACxCC,GAAoBD,EAAI,OAAQ,UAAU,IAE5CA,EAAI,SAAWA,EAAI,UAAY,CAAC,EAEpC,CAAC,CACH,CCNA,IAAIE,IAA4B,SAAUC,EAASC,EAAM,CACvD,GAAIA,IAAS,MACX,MAAO,CACL,KAAM,MACN,MAAOD,EAAQ,eAAe,EAAE,IAAI,CAAC,SAAU,WAAY,KAAK,CAAC,CACnE,EACK,GAAIC,IAAS,UAClB,MAAO,CACL,KAAM,UACN,MAAOD,EAAQ,eAAe,EAAE,IAAI,CAAC,SAAU,WAAY,SAAS,CAAC,CACvE,CAEJ,EACIE,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAY,KACzBG,EAAM,WAAa,CACjB,KAAM,MAQN,WAAY,EACd,EACOA,CACT,CACA,OAAAH,EAAY,UAAU,KAAO,SAAUI,EAAQC,EAAaP,EAAS,CACnE,KAAK,qBAAqBM,EAAQN,CAAO,EACzCM,EAAO,SAAWA,EAAO,UAAY,CAAC,EACtC,KAAK,gBAAgBA,CAAM,CAC7B,EACAJ,EAAY,UAAU,YAAc,SAAUI,EAAQN,EAAS,CAC7DG,EAAO,UAAU,YAAY,KAAK,KAAMG,EAAQN,CAAO,EACvD,KAAK,gBAAgBM,CAAM,CAC7B,EACAJ,EAAY,UAAU,gBAAkB,SAAUI,EAAQ,CACxD,IAAIE,EAAWF,EAAO,SAClBN,EAAU,KAAK,QACfQ,IAAa,KACfA,EAAWF,EAAO,SAAW,CAAC,MAAO,SAAS,GAErCG,EAAQD,CAAQ,GAClBE,EAAKF,EAAU,SAAUG,EAAMC,EAAO,CACpCC,GAASF,CAAI,IAAMA,EAAO,CAC/B,KAAMA,CACR,GACAH,EAASI,CAAK,EAAWE,GAAMH,EAAMZ,IAA0BC,EAASW,EAAK,IAAI,CAAC,CACpF,CAAC,CAEL,EACAT,EAAY,UAAU,cAAgB,UAAY,CAChD,KAAK,YAAY,KAAK,OAAO,EAC7B,IAAIa,EAAa,KAAK,MAEtB,GAAIA,EAAW,CAAC,GAAK,KAAK,IAAI,cAAc,IAAM,SAAU,CAG1D,QAFIC,EAAc,GAET,EAAI,EAAG,EAAID,EAAW,OAAQ,IAAK,CAC1C,IAAIE,EAASF,EAAW,CAAC,EAAE,IAAI,MAAM,EACrC,GAAI,KAAK,WAAWE,CAAM,EAAG,CAE3B,KAAK,OAAOA,CAAM,EAClBD,EAAc,GACd,KACF,CACF,CAEA,CAACA,GAAe,KAAK,OAAOD,EAAW,CAAC,EAAE,IAAI,MAAM,CAAC,CACvD,CACF,EACAb,EAAY,UAAU,YAAc,SAAUF,EAAS,CACrD,IAAIkB,EAAgB,CAAC,EACjBC,EAAiB,CAAC,EACtBnB,EAAQ,cAAc,SAAUoB,EAAa,CAC3C,IAAIC,EAAaD,EAAY,KAC7BD,EAAe,KAAKE,CAAU,EAC9B,IAAIC,EACJ,GAAIF,EAAY,qBAAsB,CACpC,IAAIG,EAAWH,EAAY,qBACvBI,EAAQD,EAAS,YAAY,EAC5BvB,EAAQ,iBAAiBoB,CAAW,IACvCD,EAAiBA,EAAe,OAAOK,CAAK,GAE1CA,EAAM,OACRN,EAAgBA,EAAc,OAAOM,CAAK,EAE1CF,EAAc,EAElB,MACEA,EAAc,GAEZA,GAAeG,GAAgBL,CAAW,GAC5CF,EAAc,KAAKE,EAAY,IAAI,CAEvC,CAAC,EAKD,KAAK,gBAAkBD,EAGvB,IAAIO,EAAU,KAAK,IAAI,MAAM,GAAKR,EAC9BS,EAAuBC,GAAc,EACrCb,EAAoBc,EAAIH,EAAS,SAAUI,EAAU,CAOvD,OALWjB,GAASiB,CAAQ,GAAYC,GAASD,CAAQ,KACvDA,EAAW,CACT,KAAMA,CACR,GAEEH,EAAc,IAAIG,EAAS,IAAI,EAE1B,MAETH,EAAc,IAAIG,EAAS,KAAM,EAAI,EAC9B,IAAIE,GAAMF,EAAU,KAAM,KAAK,OAAO,EAC/C,EAAG,IAAI,EAKP,KAAK,MAAeG,GAAOlB,EAAY,SAAUJ,EAAM,CACrD,MAAO,CAAC,CAACA,CACX,CAAC,CACH,EACAT,EAAY,UAAU,QAAU,UAAY,CAC1C,OAAO,KAAK,KACd,EACAA,EAAY,UAAU,OAAS,SAAUgC,EAAM,CAC7C,IAAIC,EAAW,KAAK,OAAO,SACvBC,EAAe,KAAK,IAAI,cAAc,EAC1C,GAAIA,IAAiB,SAAU,CAC7B,IAAIC,EAAO,KAAK,MACT3B,EAAK2B,EAAM,SAAUP,EAAU,CACpCK,EAASL,EAAS,IAAI,MAAM,CAAC,EAAI,EACnC,CAAC,CACH,CACAK,EAASD,CAAI,EAAI,EACnB,EACAhC,EAAY,UAAU,SAAW,SAAUgC,EAAM,CAC3C,KAAK,IAAI,cAAc,IAAM,WAC/B,KAAK,OAAO,SAASA,CAAI,EAAI,GAEjC,EACAhC,EAAY,UAAU,eAAiB,SAAUgC,EAAM,CACrD,IAAIC,EAAW,KAAK,OAAO,SAEtBA,EAAS,eAAeD,CAAI,IAC/BC,EAASD,CAAI,EAAI,IAEnB,KAAKC,EAASD,CAAI,EAAI,WAAa,QAAQ,EAAEA,CAAI,CACnD,EACAhC,EAAY,UAAU,UAAY,UAAY,CAC5C,IAAImC,EAAO,KAAK,MACZF,EAAW,KAAK,OAAO,SACpBzB,EAAK2B,EAAM,SAAUP,EAAU,CACpCK,EAASL,EAAS,IAAI,OAAQ,EAAI,CAAC,EAAI,EACzC,CAAC,CACH,EACA5B,EAAY,UAAU,cAAgB,UAAY,CAChD,IAAImC,EAAO,KAAK,MACZF,EAAW,KAAK,OAAO,SACpBzB,EAAK2B,EAAM,SAAUP,EAAU,CACpC,IAAII,EAAOJ,EAAS,IAAI,OAAQ,EAAI,EAE/BK,EAAS,eAAeD,CAAI,IAC/BC,EAASD,CAAI,EAAI,IAEnBC,EAASD,CAAI,EAAI,CAACC,EAASD,CAAI,CACjC,CAAC,CACH,EACAhC,EAAY,UAAU,WAAa,SAAUgC,EAAM,CACjD,IAAIC,EAAW,KAAK,OAAO,SAC3B,MAAO,EAAEA,EAAS,eAAeD,CAAI,GAAK,CAACC,EAASD,CAAI,IAAaI,GAAQ,KAAK,gBAAiBJ,CAAI,GAAK,CAC9G,EACAhC,EAAY,UAAU,UAAY,UAAY,CAC5C,OAAO,KAAK,IAAI,QAAQ,IAAM,WAAa,CACzC,MAAO,EACP,KAAM,UACR,EAAI,CACF,MAAO,EACP,KAAM,YACR,CACF,EACAA,EAAY,KAAO,eACnBA,EAAY,aAAe,CAAC,QAAQ,EACpCA,EAAY,cAAgB,CAE1B,EAAG,EACH,KAAM,GACN,OAAQ,aACR,KAAM,SAGN,OAAQqC,EAAO,KAAK,EACpB,MAAO,OACP,gBAAiBA,EAAO,MAAM,YAC9B,YAAaA,EAAO,MAAM,OAC1B,aAAc,EACd,YAAa,EACb,QAAS,EACT,QAAS,EACT,UAAW,GACX,WAAY,GACZ,aAAc,UACd,iBAAkB,GAClB,cAAeA,EAAO,MAAM,SAC5B,oBAAqBA,EAAO,MAAM,SAClC,oBAAqB,OACrB,UAAW,CACT,MAAO,UACP,QAAS,UACT,YAAa,UACb,YAAa,OACb,UAAW,UACX,WAAY,UACZ,iBAAkB,UAClB,iBAAkB,SACpB,EACA,UAAW,CACT,MAAO,OACP,MAAO,UACP,cAAeA,EAAO,MAAM,SAC5B,cAAe,EACf,QAAS,UACT,KAAM,UACN,IAAK,UACL,KAAM,UACN,WAAY,UACZ,WAAY,SACd,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACtB,EACA,aAAc,GACd,SAAU,GACV,cAAe,CACb,KAAM,GACN,aAAc,GACd,QAAS,CAAC,EAAG,EAAG,EAAG,CAAC,EACpB,SAAU,GACV,WAAY,aACZ,MAAOA,EAAO,MAAM,SACpB,YAAa,EACb,YAAaA,EAAO,MAAM,MAC5B,EACA,SAAU,CACR,cAAe,CACb,KAAM,GACN,MAAOA,EAAO,MAAM,UACtB,CACF,EACA,iBAAkB,OAClB,gBAAiB,EACjB,kBAAmB,GACnB,QAAS,CACP,KAAM,EACR,EACA,aAAc,EAChB,EACOrC,CACT,GAAEsC,EAAc,EACTC,GAAQvC,ICrQf,IAAIwC,GAAeA,GACfC,GAAcA,EACdC,GAAgBC,GAChBC,KAA0B,SAAUC,EAAQ,CAC9CC,EAAUF,EAAYC,CAAM,EAC5B,SAASD,GAAa,CACpB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAW,KACxBG,EAAM,gBAAkB,GACjBA,CACT,CACA,OAAAH,EAAW,UAAU,KAAO,UAAY,CACtC,KAAK,MAAM,IAAI,KAAK,cAAgB,IAAIF,EAAO,EAC/C,KAAK,MAAM,IAAI,KAAK,eAAiB,IAAIA,EAAO,EAChD,KAAK,eAAiB,EACxB,EAIAE,EAAW,UAAU,gBAAkB,UAAY,CACjD,OAAO,KAAK,aACd,EAIAA,EAAW,UAAU,iBAAmB,UAAY,CAClD,OAAO,KAAK,cACd,EAIAA,EAAW,UAAU,OAAS,SAAUI,EAAaC,EAASC,EAAK,CACjE,IAAIC,EAAgB,KAAK,eAGzB,GAFA,KAAK,eAAiB,GACtB,KAAK,WAAW,EACZ,EAACH,EAAY,IAAI,OAAQ,EAAI,EAGjC,KAAII,EAAYJ,EAAY,IAAI,OAAO,EACnCK,EAASL,EAAY,IAAI,QAAQ,GACjC,CAACI,GAAaA,IAAc,UAC9BA,EAAYJ,EAAY,IAAI,MAAM,IAAM,SAAWK,IAAW,WAAa,QAAU,QAGvF,IAAIC,EAAWN,EAAY,IAAI,WAAY,EAAI,EAC3CO,EAAmBP,EAAY,IAAI,mBAAoB,EAAI,EAC3DM,IAAa,CAACC,GAAoBA,IAAqB,UACzDA,EAAmBF,IAAW,aAAe,MAAQ,SAEvD,KAAK,YAAYD,EAAWJ,EAAaC,EAASC,EAAKI,EAAUD,EAAQE,CAAgB,EAEzF,IAAIC,EAA0BC,GAAyBT,EAAaE,CAAG,EAAE,aACrEQ,EAAeV,EAAY,mBAAmB,EAC9CW,EAAUX,EAAY,IAAI,SAAS,EACnCY,EAAqBC,GAAcH,EAAcF,EAAcG,CAAO,EACtEG,EAAW,KAAK,YAAYd,EAAaI,EAAWQ,EAAST,EAAeG,EAAUC,CAAgB,EAEtGQ,EAAwBF,GAAqBG,GAAS,CACxD,MAAOF,EAAS,MAChB,OAAQA,EAAS,MACnB,EAAGJ,CAAY,EAAGF,EAAcG,CAAO,EACvC,KAAK,MAAM,EAAII,EAAW,EAAID,EAAS,EACvC,KAAK,MAAM,EAAIC,EAAW,EAAID,EAAS,EACvC,KAAK,MAAM,WAAW,EAEtB,KAAK,MAAM,IAAI,KAAK,cAAgBG,GAAeH,EAEnDd,CAAW,CAAC,EACd,EACAJ,EAAW,UAAU,WAAa,UAAY,CAC5C,KAAK,gBAAgB,EAAE,UAAU,EACjC,KAAK,eAAiB,KAAK,MAAM,OAAO,KAAK,aAAa,EAC1D,KAAK,iBAAiB,EAAE,UAAU,CACpC,EACAA,EAAW,UAAU,YAAc,SAAUQ,EAAWJ,EAAaC,EAASC,EAAKI,EAAUD,EAAQE,EAAkB,CACrH,IAAIW,EAAe,KAAK,gBAAgB,EACpCC,EAAwBC,GAAc,EACtCC,EAAarB,EAAY,IAAI,cAAc,EAC3CsB,EAAetB,EAAY,IAAI,cAAc,EAC7CuB,EAAkB,CAAC,EACvBtB,EAAQ,cAAc,SAAUuB,EAAa,CAC3C,CAACA,EAAY,IAAI,iBAAiB,GAAKD,EAAgB,KAAKC,EAAY,EAAE,CAC5E,CAAC,EACD/B,GAAKO,EAAY,QAAQ,EAAG,SAAUyB,EAAiBC,EAAW,CAChE,IAAI3B,EAAQ,KACR4B,EAAOF,EAAgB,IAAI,MAAM,EAErC,GAAI,CAAC,KAAK,kBAAoBE,IAAS,IAAMA,IAAS;AAAA,GAAO,CAC3D,IAAIC,EAAI,IAAIlC,GAEZkC,EAAE,QAAU,GACZV,EAAa,IAAIU,CAAC,EAClB,MACF,CAEA,IAAIJ,EAAcvB,EAAQ,gBAAgB0B,CAAI,EAAE,CAAC,EACjD,GAAI,CAAAR,EAAe,IAAIQ,CAAI,EAK3B,GAAIH,EAAa,CACf,IAAIK,EAAOL,EAAY,QAAQ,EAC3BM,EAAkBD,EAAK,UAAU,iBAAiB,GAAK,CAAC,EACxDE,EAAaF,EAAK,UAAU,YAAY,EAKxCG,EAAQH,EAAK,UAAU,OAAO,EAC9BI,EAAY,KAAK,YAAYT,EAAaG,EAAMD,EAAWD,EAAiBzB,EAAaI,EAAW0B,EAAiBE,EAAOD,EAAYV,EAAYnB,CAAG,EAC3J+B,EAAU,GAAG,QAASzC,GAAM0C,IAAsBP,EAAM,KAAMzB,EAAKqB,CAAe,CAAC,EAAE,GAAG,YAAa/B,GAAM2C,GAAyBX,EAAY,KAAM,KAAMtB,EAAKqB,CAAe,CAAC,EAAE,GAAG,WAAY/B,GAAM4C,GAAwBZ,EAAY,KAAM,KAAMtB,EAAKqB,CAAe,CAAC,EACzQtB,EAAQ,KACVgC,EAAU,UAAU,SAAUI,EAAO,CACnC,IAAIC,EAASC,GAAUF,CAAK,EAC5BC,EAAO,YAAcd,EAAY,YACjCc,EAAO,UAAYZ,EACnBY,EAAO,QAAU,QACnB,CAAC,EAEChB,GACFW,EAAU,UAAU,SAAUI,EAAO,CACnCtC,EAAM,cAAcsC,EAAOrC,EAAawB,EAAaE,EAAWC,CAAI,CACtE,CAAC,EAEHR,EAAe,IAAIQ,EAAM,EAAI,CAC/B,MAEE1B,EAAQ,cAAc,SAAUuB,EAAa,CAC3C,IAAIzB,EAAQ,KAEZ,GAAI,CAAAoB,EAAe,IAAIQ,CAAI,GAGvBH,EAAY,qBAAsB,CACpC,IAAIgB,EAAWhB,EAAY,qBAC3B,GAAI,CAACgB,EAAS,YAAYb,CAAI,EAC5B,OAEF,IAAIc,EAAMD,EAAS,YAAYb,CAAI,EAC/BK,EAAQQ,EAAS,cAAcC,EAAK,OAAO,EAC3CV,EAAaS,EAAS,cAAcC,EAAK,YAAY,EACrDC,EAAWC,GAAMX,EAAM,IAAI,EAG3BU,GAAYA,EAAS,CAAC,IAAM,IAC9BA,EAAS,CAAC,EAAI,GAEdV,EAAeY,EAAcA,EAAO,CAAC,EAAGZ,CAAK,EAAG,CAC9C,KAAMa,GAAUH,EAAU,MAAM,CAClC,CAAC,GAEH,IAAIT,EAAY,KAAK,YAAYT,EAAaG,EAAMD,EAAWD,EAAiBzB,EAAaI,EAAW,CAAC,EAAG4B,EAAOD,EAAYV,EAAYnB,CAAG,EAE9I+B,EAAU,GAAG,QAASzC,GAAM0C,IAAsB,KAAMP,EAAMzB,EAAKqB,CAAe,CAAC,EAGlF,GAAG,YAAa/B,GAAM2C,GAAyB,KAAMR,EAAMzB,EAAKqB,CAAe,CAAC,EAAE,GAAG,WAAY/B,GAAM4C,GAAwB,KAAMT,EAAMzB,EAAKqB,CAAe,CAAC,EAC7JtB,EAAQ,KACVgC,EAAU,UAAU,SAAUI,EAAO,CACnC,IAAIC,EAASC,GAAUF,CAAK,EAC5BC,EAAO,YAAcd,EAAY,YACjCc,EAAO,UAAYZ,EACnBY,EAAO,QAAU,QACnB,CAAC,EAEChB,GACFW,EAAU,UAAU,SAAUI,EAAO,CACnCtC,EAAM,cAAcsC,EAAOrC,EAAawB,EAAaE,EAAWC,CAAI,CACtE,CAAC,EAEHR,EAAe,IAAIQ,EAAM,EAAI,CAC/B,CACF,EAAG,IAAI,CAOX,EAAG,IAAI,EACHrB,GACF,KAAK,gBAAgBA,EAAUN,EAAaE,EAAKG,EAAQE,CAAgB,CAE7E,EACAX,EAAW,UAAU,cAAgB,SAAUkD,EAAI9C,EAAawB,EAAaE,EAAWC,EAAM,CAC5F,IAAIoB,EAAY,CACd,cAAe,SACf,eAAgB/C,EAAY,eAC5B,UAAW0B,EACX,MAAOC,EACP,YAAaH,EAAY,WAC3B,EACAe,GAAUO,CAAE,EAAE,UAAYC,CAC5B,EAEAnD,EAAW,UAAU,gBAAkB,SAAUU,EAAUN,EAAaE,EAAKG,EAAQE,EAAkB,CACrG,IAAIyC,EAAgB,KAAK,iBAAiB,EAC1CvD,GAAKa,EAAU,SAA8B2C,EAAc,CACzD,IAAIC,EAAOD,EAAa,KACpBE,EAAY,IAAYC,GAAK,CAC/B,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAO,SACP,cAAe,QACjB,EACA,QAAS,UAAY,CACnBlD,EAAI,eAAe,CACjB,KAAMgD,IAAS,MAAQ,kBAAoB,sBAC3C,SAAUlD,EAAY,EACxB,CAAC,CACH,CACF,CAAC,EACDgD,EAAc,IAAIG,CAAS,EAC3B,IAAIE,EAAarD,EAAY,SAAS,eAAe,EACjDsD,EAAqBtD,EAAY,SAAS,CAAC,WAAY,eAAe,CAAC,EAC3EuD,GAAcJ,EAAW,CACvB,OAAQE,EACR,SAAUC,CACZ,EAAG,CACD,YAAaL,EAAa,KAC5B,CAAC,EACDO,GAAoBL,CAAS,CAC/B,CAAC,CACH,EACAvD,EAAW,UAAU,YAAc,SAAU4B,EAAaG,EAAMD,EAAWD,EAAiBzB,EAAaI,EAAW0B,EAAiB2B,EAAiB1B,EAAYV,EAAYnB,EAAK,CACjL,IAAIwD,EAAWlC,EAAY,eACvBmC,EAAY3D,EAAY,IAAI,WAAW,EACvC4D,EAAa5D,EAAY,IAAI,YAAY,EACzC6D,EAAa7D,EAAY,WAAW2B,CAAI,EACxCmC,EAAarC,EAAgB,IAAI,cAAc,EAC/CsC,EAAmBtC,EAAgB,IAAI,kBAAkB,EACzDuC,EAAiBvC,EAAgB,IAAI,MAAM,EAC/CM,EAAaiC,GAAkBjC,GAAc,YAC7C,IAAIC,EAAQiC,IAAelC,EAAYN,EAAiBK,EAAiB2B,EAAiBC,EAAUG,EAAY3D,CAAG,EAC/G+B,EAAY,IAAIvC,GAChBwE,EAAiBzC,EAAgB,SAAS,WAAW,EACzD,GAAW0C,GAAW3C,EAAY,aAAa,IAAM,CAACwC,GAAkBA,IAAmB,WAEzF/B,EAAU,IAAIT,EAAY,cAAc,CACtC,UAAWmC,EACX,WAAYC,EACZ,KAAM7B,EACN,WAAY+B,EACZ,UAAW9B,EAAM,UACjB,UAAWA,EAAM,UACjB,iBAAkB+B,CACpB,CAAC,CAAC,MACG,CAEL,IAAIK,EAASJ,IAAmB,WAAaxC,EAAY,QAAQ,EAAE,UAAU,QAAQ,EAAIsC,IAAe,UAAYtC,EAAY,QAAQ,EAAE,UAAU,cAAc,EAAIsC,EAAa,EACnL7B,EAAU,IAAIoC,IAAqB,CACjC,UAAWV,EACX,WAAYC,EACZ,KAAM7B,EACN,WAAYqC,EACZ,UAAWpC,EAAM,UACjB,UAAWA,EAAM,UACjB,iBAAkB+B,CACpB,CAAC,CAAC,CACJ,CACA,IAAIO,EAAQlE,IAAc,OAASuD,EAAY,EAAI,GAC/CY,EAAYnE,EACZoE,EAAYxE,EAAY,IAAI,WAAW,EACvCyE,EAAU9C,EACH+C,GAASF,CAAS,GAAKA,EAChCC,EAAUD,EAAU,QAAQ,SAAU7C,GAAsB,EAAE,EAC9CwC,GAAWK,CAAS,IACpCC,EAAUD,EAAU7C,CAAI,GAE1B,IAAIgD,EAAYd,EAAaK,EAAe,aAAa,EAAIzC,EAAgB,IAAI,eAAe,EAChGQ,EAAU,IAAI,IAAYmB,GAAK,CAC7B,MAAOwB,GAAgBV,EAAgB,CACrC,KAAMO,EACN,EAAGH,EACH,EAAGV,EAAa,EAChB,KAAMe,EACN,MAAOJ,EACP,cAAe,QACjB,EAAG,CACD,aAAcI,CAChB,CAAC,CACH,CAAC,CAAC,EAEF,IAAIE,EAAU,IAAYC,GAAK,CAC7B,MAAO7C,EAAU,gBAAgB,EACjC,MAAO,CAEL,KAAM,aACR,CACF,CAAC,EACG8C,EAAetD,EAAgB,SAAS,SAAS,EACrD,OAAIsD,EAAa,IAAI,MAAM,GACjBC,GAAiB,CACvB,GAAIH,EACJ,eAAgB7E,EAChB,SAAU2B,EACV,kBAAmBoD,EAAa,MAClC,CAAC,EAEH9C,EAAU,IAAI4C,CAAO,EACrB5C,EAAU,UAAU,SAAUI,EAAO,CACnCA,EAAM,OAAS,EACjB,CAAC,EACDwC,EAAQ,OAAS,CAACxD,EAClB,KAAK,gBAAgB,EAAE,IAAIY,CAAS,EACpCuB,GAAoBvB,CAAS,EAE7BA,EAAU,kBAAoBP,EACvBO,CACT,EACArC,EAAW,UAAU,YAAc,SAAUI,EAAaI,EAAWQ,EAAST,EAAeG,EAAUC,EAAkB,CACvH,IAAIW,EAAe,KAAK,gBAAgB,EACpC8B,EAAgB,KAAK,iBAAiB,EAE/BiC,GAAIjF,EAAY,IAAI,QAAQ,EAAGkB,EAAclB,EAAY,IAAI,SAAS,EAAGY,EAAQ,MAAOA,EAAQ,MAAM,EACjH,IAAIsE,EAAchE,EAAa,gBAAgB,EAC3CiE,EAAa,CAAC,CAACD,EAAY,EAAG,CAACA,EAAY,CAAC,EAGhD,GAFAlC,EAAc,WAAW,EACzB9B,EAAa,WAAW,EACpBZ,EAAU,CAED2E,GAEX,aAAcjC,EAAehD,EAAY,IAAI,kBAAmB,EAAI,CAAC,EACrE,IAAIoF,EAAepC,EAAc,gBAAgB,EAC7CqC,EAAc,CAAC,CAACD,EAAa,EAAG,CAACA,EAAa,CAAC,EAC/CE,EAAoBtF,EAAY,IAAI,oBAAqB,EAAI,EAC7DuF,EAAYvF,EAAY,UAAU,EAAE,MACpCwF,EAAKD,IAAc,EAAI,QAAU,SACjCE,EAAKF,IAAc,EAAI,SAAW,QAClCG,EAAKH,IAAc,EAAI,IAAM,IAC7BhF,IAAqB,MACvB8E,EAAYE,CAAS,GAAKL,EAAYM,CAAE,EAAIF,EAE5CH,EAAWI,CAAS,GAAKH,EAAaI,CAAE,EAAIF,EAG9CD,EAAY,EAAIE,CAAS,GAAKL,EAAYO,CAAE,EAAI,EAAIL,EAAaK,CAAE,EAAI,EACvEzC,EAAc,EAAIqC,EAAY,CAAC,EAC/BrC,EAAc,EAAIqC,EAAY,CAAC,EAC/BnE,EAAa,EAAIiE,EAAW,CAAC,EAC7BjE,EAAa,EAAIiE,EAAW,CAAC,EAC7B,IAAIrE,EAAW,CACb,EAAG,EACH,EAAG,CACL,EACA,OAAAA,EAAS0E,CAAE,EAAIN,EAAYM,CAAE,EAAIF,EAAoBF,EAAaI,CAAE,EACpE1E,EAAS2E,CAAE,EAAI,KAAK,IAAIP,EAAYO,CAAE,EAAGL,EAAaK,CAAE,CAAC,EACzD3E,EAAS4E,CAAE,EAAI,KAAK,IAAI,EAAGN,EAAaM,CAAE,EAAIL,EAAY,EAAIE,CAAS,CAAC,EACjEzE,CACT,KACE,QAAAI,EAAa,EAAIiE,EAAW,CAAC,EAC7BjE,EAAa,EAAIiE,EAAW,CAAC,EACtB,KAAK,MAAM,gBAAgB,CAEtC,EAIAvF,EAAW,UAAU,OAAS,UAAY,CACxC,KAAK,gBAAgB,EAAE,UAAU,EACjC,KAAK,eAAiB,EACxB,EACAA,EAAW,KAAO,eACXA,CACT,GAAE+F,EAAa,EACf,SAAS1B,IAAe2B,EAAUnE,EAAiBK,EAAiB2B,EAAiBC,EAAUG,EAAY3D,EAAK,CAK9G,SAAS2F,EAAkB7D,EAAO8D,EAAa,CAEzC9D,EAAM,YAAc,SACtBA,EAAM,UAAY8D,EAAY,UAAY,EAAI,EAAI,GAEpDrG,GAAKuC,EAAO,SAAU+D,EAASC,EAAU,CACvChE,EAAMgE,CAAQ,IAAM,YAAchE,EAAMgE,CAAQ,EAAIF,EAAYE,CAAQ,EAC1E,CAAC,CACH,CAEA,IAAIC,EAAiBxE,EAAgB,SAAS,WAAW,EACrDyE,EAAYD,EAAe,aAAa,EACxCE,EAAgBP,EAAS,YAAY,QAAS,CAAC,IAAM,EAAI,OAAS,SAClEQ,EAAaH,EAAe,WAAW,OAAO,EAClDC,EAAU,MAAQ,CAACE,GAAcA,IAAe,UAAY3C,EAAgB,MAAQ4C,GAA+BD,EAAYlG,CAAG,EAC9HgG,EAAU,OAAS,YAKrBA,EAAU,KAAOzC,EAAgBC,CAAQ,GAEvCwC,EAAU,SAAW,YAKvBA,EAAU,OAASzC,EAAgB0C,CAAa,GAE9CD,EAAU,UAAY,YAIxBA,EAAU,SAAWxC,IAAa,OAASD,EAAkB3B,GAAiB,SAEhF+D,EAAkBK,EAAWzC,CAAe,EAE5C,IAAI6C,EAAkB7E,EAAgB,SAAS,WAAW,EACtD8E,EAAYD,EAAgB,aAAa,EAM7C,GALAT,EAAkBU,EAAWzE,CAAe,EAE5CoE,EAAU,OAAS,SAAWA,EAAU,KAAOzC,EAAgB,MAC/DyC,EAAU,SAAW,SAAWA,EAAU,OAASzC,EAAgB,MACnE8C,EAAU,SAAW,SAAWA,EAAU,OAAS9C,EAAgB,MAC/D,CAACI,EAAY,CACf,IAAI2C,EAAc/E,EAAgB,IAAI,qBAAqB,EAMvDgF,EAAkBP,EAAUC,CAAa,EAC7CD,EAAU,UAAYM,IAAgB,OAAS/C,EAAgB,UAAY,GAAKgD,EAAkB,EAAI,EAAIP,EAAU,UACpHA,EAAU,KAAOzE,EAAgB,IAAI,eAAe,EACpDyE,EAAU,OAASzE,EAAgB,IAAI,qBAAqB,EAC5D8E,EAAU,OAASD,EAAgB,IAAI,eAAe,EACtDC,EAAU,UAAYD,EAAgB,IAAI,eAAe,CAC3D,CACA,MAAO,CACL,UAAWJ,EACX,UAAWK,CACb,CACF,CACA,SAASlC,IAAqBqC,EAAK,CACjC,IAAIC,EAAYD,EAAI,MAAQ,YACxBE,EAAOC,GAAaF,EAAW,EAAG,EAAGD,EAAI,UAAWA,EAAI,WAAYA,EAAI,UAAU,KAAMA,EAAI,gBAAgB,EAChH,OAAAE,EAAK,SAASF,EAAI,SAAS,EAC3BE,EAAK,UAAYF,EAAI,YAAc,GAAK,KAAK,GAAK,IAClDE,EAAK,UAAU,CAACF,EAAI,UAAY,EAAGA,EAAI,WAAa,CAAC,CAAC,EAClDC,EAAU,QAAQ,OAAO,EAAI,KAC/BC,EAAK,MAAM,OAASA,EAAK,MAAM,KAC/BA,EAAK,MAAM,KAAOE,EAAO,MAAM,UAC/BF,EAAK,MAAM,UAAY,GAElBA,CACT,CACA,SAAS1E,IAAqB6E,EAAYC,EAAU9G,EAAKqB,EAAiB,CAExEa,GAAuB2E,EAAYC,EAAU9G,EAAKqB,CAAe,EACjErB,EAAI,eAAe,CACjB,KAAM,qBACN,KAAM6G,GAAkCC,CAC1C,CAAC,EAGD7E,GAAwB4E,EAAYC,EAAU9G,EAAKqB,CAAe,CACpE,CACA,SAAS0F,IAAgB/G,EAAK,CAK5B,QAJIgH,EAAOhH,EAAI,MAAM,EAAE,QAAQ,eAAe,EAC1CiH,EACAC,EAAI,EACJC,EAAMH,EAAK,OACRE,EAAIC,GAAO,EAAEF,EAAgBD,EAAKE,CAAC,EAAE,OAAO,WACjDA,IAEF,OAAOD,GAAiBA,EAAc,UACxC,CACA,SAAShF,GAAwB4E,EAAYC,EAAU9G,EAAKqB,EAAiB,CAEtE0F,IAAgB/G,CAAG,GACtBA,EAAI,eAAe,CACjB,KAAM,YACN,WAAY6G,EACZ,KAAMC,EACN,gBAAiBzF,CACnB,CAAC,CAEL,CACA,SAASa,GAAuB2E,EAAYC,EAAU9G,EAAKqB,EAAiB,CAErE0F,IAAgB/G,CAAG,GACtBA,EAAI,eAAe,CACjB,KAAM,WACN,WAAY6G,EACZ,KAAMC,EACN,gBAAiBzF,CACnB,CAAC,CAEL,CACA,IAAO+F,GAAQ1H,ICzfA,SAAR2H,GAA8BC,EAAS,CAC5C,IAAIC,EAAeD,EAAQ,eAAe,CACxC,SAAU,QACZ,CAAC,EACGC,GAAgBA,EAAa,QAC/BD,EAAQ,aAAa,SAAUE,EAAQ,CAGrC,QAASC,EAAI,EAAGA,EAAIF,EAAa,OAAQE,IACvC,GAAI,CAACF,EAAaE,CAAC,EAAE,WAAWD,EAAO,IAAI,EACzC,MAAO,GAGX,MAAO,EACT,CAAC,CAEL,CCfA,SAASE,GAA0BC,EAAYC,EAASC,EAAS,CAC/D,IAAIC,EAAcH,IAAe,aAAeA,IAAe,gBAC3DI,EAAc,CAAC,EACfC,EAAsB,CAAC,EAC3BH,EAAQ,cAAc,CACpB,SAAU,SACV,MAAOD,CACT,EAAG,SAAUK,EAAa,CACpBH,EACFG,EAAYN,CAAU,EAAE,EAExBM,EAAYN,CAAU,EAAEC,EAAQ,IAAI,EAEtCM,IAAgBD,EAAaF,CAAW,EACxCC,EAAoB,KAAKC,EAAY,cAAc,CACrD,CAAC,EACD,IAAIE,EAAiB,CAAC,EAEtB,OAAAN,EAAQ,cAAc,SAAU,SAAUI,EAAa,CACrDG,EAAKL,EAAa,SAAUM,EAAYC,EAAM,CAK5CL,EAAYI,EAAa,SAAW,UAAU,EAAEC,CAAI,CACtD,CAAC,EACDJ,IAAgBD,EAAaE,CAAc,CAC7C,CAAC,EAEML,EAAc,CACnB,SAAUK,EAEV,YAAaH,CACf,EAAI,CACF,KAAMJ,EAAQ,KACd,SAAUO,CACZ,CACF,CACA,SAASD,IAAgBD,EAAaM,EAAK,CACzC,IAAIR,EAAcQ,GAAO,CAAC,EAC1B,OAAAH,EAAKH,EAAY,QAAQ,EAAG,SAAUO,EAAO,CAC3C,IAAIF,EAAOE,EAAM,IAAI,MAAM,EAE3B,GAAI,EAAAF,IAAS;AAAA,GAAQA,IAAS,IAG9B,KAAIG,EAAiBR,EAAY,WAAWK,CAAI,EAC5CI,GAAOX,EAAaO,CAAI,EAE1BP,EAAYO,CAAI,EAAIP,EAAYO,CAAI,GAAKG,EAEzCV,EAAYO,CAAI,EAAIG,EAExB,CAAC,EACMV,CACT,CACO,SAASY,IAAoBC,EAAW,CAQ7CA,EAAU,eAAe,qBAAsB,sBAAuBC,GAAMnB,GAA2B,gBAAgB,CAAC,EACxHkB,EAAU,eAAe,kBAAmB,kBAAmBC,GAAMnB,GAA2B,WAAW,CAAC,EAC5GkB,EAAU,eAAe,sBAAuB,sBAAuBC,GAAMnB,GAA2B,eAAe,CAAC,EAOxHkB,EAAU,eAAe,eAAgB,iBAAkBC,GAAMnB,GAA2B,QAAQ,CAAC,EAOrGkB,EAAU,eAAe,iBAAkB,mBAAoBC,GAAMnB,GAA2B,UAAU,CAAC,CAC7G,CC9EO,SAASoB,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,EAAW,EAC5CD,EAAU,sBAAsBE,EAAU,EAC1CF,EAAU,kBAAkBA,EAAU,SAAS,UAAU,cAAeG,EAAY,EACpFH,EAAU,yBAAyB,SAAU,UAAY,CACvD,MAAO,OACT,CAAC,EACDI,IAAoBJ,CAAS,CAC/B,CCPA,IAAIK,KAAqC,SAAUC,EAAQ,CACzDC,EAAUF,EAAuBC,CAAM,EACvC,SAASD,GAAwB,CAC/B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAsB,KAC5BG,CACT,CAIA,OAAAH,EAAsB,UAAU,mBAAqB,SAAUI,EAAiB,CAC9E,KAAK,OAAO,gBAAkBA,CAChC,EACAJ,EAAsB,UAAU,KAAO,SAAUK,EAAQC,EAAaC,EAAS,CAC7E,IAAIC,EAAsBC,GAAgBJ,CAAM,EAChDJ,EAAO,UAAU,KAAK,KAAK,KAAMI,EAAQC,EAAaC,CAAO,EAC7DG,IAA8B,KAAML,EAAQG,CAAmB,CACjE,EAIAR,EAAsB,UAAU,YAAc,SAAUK,EAAQE,EAAS,CACvEN,EAAO,UAAU,YAAY,KAAK,KAAMI,EAAQE,CAAO,EACvDG,IAA8B,KAAM,KAAK,OAAQL,CAAM,CACzD,EACAL,EAAsB,KAAO,gBAC7BA,EAAsB,cAAgBW,GAAqBC,GAAY,cAAe,CACpF,gBAAiB,EACjB,kBAAmB,EACnB,cAAe,KACf,mBAAoB,MACpB,cAAe,oBACf,UAAW,CACT,WAAY,CAAC,qBAAsB,sBAAsB,EACzD,SAAU,CAAC,oBAAqB,kBAAkB,CACpD,EACA,cAAeC,EAAO,MAAM,SAC5B,sBAAuBA,EAAO,MAAM,SACpC,aAAc,GACd,cAAe,CACb,MAAOA,EAAO,MAAM,QACtB,EACA,wBAAyB,GAC3B,CAAC,EACMb,CACT,GAAEY,EAAW,EAGb,SAASF,IAA8BI,EAAaC,EAAQC,EAAK,CAC/D,IAAIC,EAASH,EAAY,UAAU,EAC/BI,EAAa,CAAC,EAAG,CAAC,EACtBA,EAAWD,EAAO,KAAK,EAAI,EAC3BE,GAAiBJ,EAAQC,EAAK,CAC5B,KAAM,MACN,WAAY,CAAC,CAACE,CAChB,CAAC,CACH,CACA,IAAOE,IAAQpB,ICtDf,IAAIqB,IAAgBC,GAChBC,GAAK,CAAC,QAAS,QAAQ,EACvBC,GAAK,CAAC,IAAK,GAAG,EACdC,KAAoC,SAAUC,EAAQ,CACxDC,EAAUF,EAAsBC,CAAM,EACtC,SAASD,GAAuB,CAC9B,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAqB,KAClCG,EAAM,gBAAkB,GACxBA,EAAM,cAAgB,EACfA,CACT,CACA,OAAAH,EAAqB,UAAU,KAAO,UAAY,CAChDC,EAAO,UAAU,KAAK,KAAK,IAAI,EAC/B,KAAK,MAAM,IAAI,KAAK,gBAAkB,IAAIL,GAAO,EACjD,KAAK,gBAAgB,IAAI,KAAK,gBAAgB,CAAC,EAC/C,KAAK,MAAM,IAAI,KAAK,iBAAmB,IAAIA,GAAO,CACpD,EAIAI,EAAqB,UAAU,WAAa,UAAY,CACtDC,EAAO,UAAU,WAAW,KAAK,IAAI,EACrC,KAAK,iBAAiB,UAAU,EAChC,KAAK,gBAAgB,eAAe,EACpC,KAAK,gBAAgB,WAAa,IACpC,EAIAD,EAAqB,UAAU,YAAc,SAAUI,EAAWC,EAAaC,EAASC,EAAKC,EAAUC,EAAQC,EAAkB,CAC/H,IAAIC,EAAO,KAEXV,EAAO,UAAU,YAAY,KAAK,KAAMG,EAAWC,EAAaC,EAASC,EAAKC,EAAUC,EAAQC,CAAgB,EAChH,IAAIE,EAAkB,KAAK,iBAGvBC,EAAeR,EAAY,IAAI,eAAgB,EAAI,EACnDS,EAAyBC,EAAQF,CAAY,EAAIA,EAAe,CAACA,EAAcA,CAAY,EAC/FG,EAAiB,WAAY,CAAC,EAC9B,IAAIC,EAAqBZ,EAAY,SAAS,eAAe,EAC7DO,EAAgB,IAAI,IAAYM,GAAK,CACnC,KAAM,WACN,MAAO,CAEL,KAAM,QACN,KAAMD,EAAmB,aAAa,EACtC,KAAMA,EAAmB,QAAQ,EACjC,cAAe,SACf,MAAO,QACT,EACA,OAAQ,EACV,CAAC,CAAC,EACFD,EAAiB,WAAY,CAAC,EAC9B,SAASA,EAAiBG,EAAMC,EAAS,CACvC,IAAIC,EAAoBF,EAAO,YAC3BG,EAAeC,GAAWlB,EAAY,IAAI,YAAa,EAAI,EAAEA,EAAY,UAAU,EAAE,IAAI,EAAEe,CAAO,EAAG,CAGvG,QAAgBI,GAAKb,EAAK,QAASA,EAAMU,EAAmBhB,EAAaE,CAAG,CAC9E,EAAG,CACD,EAAG,CAACO,EAAgB,CAAC,EAAI,EACzB,EAAG,CAACA,EAAgB,CAAC,EAAI,EACzB,MAAOA,EAAgB,CAAC,EACxB,OAAQA,EAAgB,CAAC,CAC3B,CAAC,EACDQ,EAAK,KAAOH,EACZP,EAAgB,IAAIU,CAAI,CAC1B,CACF,EAIAtB,EAAqB,UAAU,YAAc,SAAUK,EAAaD,EAAWqB,EAASC,EAAelB,EAAUE,EAAkB,CACjI,IAAIiB,EAAgB,KAAK,iBAAiB,EACtCC,EAAYvB,EAAY,UAAU,EAAE,MACpCwB,EAAK/B,GAAG8B,CAAS,EACjBE,EAAK/B,GAAG6B,CAAS,EACjBG,EAAKjC,GAAG,EAAI8B,CAAS,EACrBI,EAAKjC,GAAG,EAAI6B,CAAS,EACzBpB,GAAuByB,GAEvB,aAAcN,EAAetB,EAAY,IAAI,kBAAmB,EAAI,CAAC,EACrE,IAAI6B,EAAoB7B,EAAY,IAAI,oBAAqB,EAAI,EAC7D8B,EAAeR,EAAc,gBAAgB,EAC7CS,EAAc,CAAC,CAACD,EAAa,EAAG,CAACA,EAAa,CAAC,EAC/CE,EAAwBC,GAAMb,CAAO,EACzCjB,IAAa6B,EAAeR,CAAE,EAAIJ,EAAQI,CAAE,EAAIM,EAAaN,CAAE,EAAIK,GACnE,IAAIK,EAAW,KAAK,4BAA4BlC,EAAaqB,EAAeW,EAAgBT,EAAWC,EAAIE,EAAIC,EAAIF,CAAE,EACrH,GAAItB,EAAU,CACZ,GAAIE,IAAqB,MACvB0B,EAAYR,CAAS,GAAKW,EAASV,CAAE,EAAIK,MACpC,CACL,IAAIM,EAASL,EAAaN,CAAE,EAAIK,EAChCE,EAAYR,CAAS,GAAKY,EAC1BD,EAAST,CAAE,GAAKU,CAClB,CACAD,EAASV,CAAE,GAAKM,EAAaN,CAAE,EAAIK,EACnCE,EAAY,EAAIR,CAAS,GAAKW,EAASP,CAAE,EAAIO,EAASR,CAAE,EAAI,EAAII,EAAaJ,CAAE,EAAI,EACnFQ,EAASR,CAAE,EAAI,KAAK,IAAIQ,EAASR,CAAE,EAAGI,EAAaJ,CAAE,CAAC,EACtDQ,EAASP,CAAE,EAAI,KAAK,IAAIO,EAASP,CAAE,EAAGG,EAAaH,CAAE,EAAII,EAAY,EAAIR,CAAS,CAAC,EACnFD,EAAc,EAAIS,EAAY,CAAC,EAC/BT,EAAc,EAAIS,EAAY,CAAC,EAC/BT,EAAc,WAAW,CAC3B,CACA,OAAOY,CACT,EACAvC,EAAqB,UAAU,4BAA8B,SAAUK,EAAaqB,EAAeD,EAASG,EAAWC,EAAIE,EAAIC,EAAIF,EAAI,CACrI,IAAIW,EAAe,KAAK,gBAAgB,EACpCC,EAAiB,KAAK,gBACtB9B,EAAkB,KAAK,iBAEhBqB,GAAI5B,EAAY,IAAI,QAAQ,EAAGoC,EAAcpC,EAAY,IAAI,SAAS,EAAIuB,EAAmBH,EAAQ,MAAf,KAAsBG,EAAY,KAAOH,EAAQ,MAAM,EAC7IQ,GAEX,aAAcrB,EAAiBP,EAAY,IAAI,oBAAqB,EAAI,CAAC,EACzE,IAAIsC,EAAcF,EAAa,gBAAgB,EAC3CG,EAAiBhC,EAAgB,gBAAgB,EACjDiC,EAAiB,KAAK,gBAAkBF,EAAYd,CAAE,EAAIJ,EAAQI,CAAE,EAEpEiB,EAAa,CAAC,CAACH,EAAY,EAAG,CAACA,EAAY,CAAC,EAI3CjB,IACHoB,EAAWlB,CAAS,EAAIa,EAAaX,CAAE,GAGzC,IAAIiB,EAAe,CAAC,EAAG,CAAC,EACpBC,EAAgB,CAAC,CAACJ,EAAe,EAAG,CAACA,EAAe,CAAC,EACrDK,EAAuBC,GAAU7C,EAAY,IAAI,gBAAiB,EAAI,EAAGA,EAAY,IAAI,UAAW,EAAI,CAAC,EAE7G,GAAIwC,EAAgB,CAClB,IAAIM,EAAqB9C,EAAY,IAAI,qBAAsB,EAAI,EAE/D8C,IAAuB,MACzBH,EAAcpB,CAAS,GAAKH,EAAQI,CAAE,EAAIe,EAAef,CAAE,EAI3DkB,EAAanB,CAAS,GAAKgB,EAAef,CAAE,EAAIoB,CAEpD,CAEAD,EAAc,EAAIpB,CAAS,GAAKe,EAAYZ,CAAE,EAAI,EAAIa,EAAeb,CAAE,EAAI,EAC3EU,EAAa,YAAYK,CAAU,EACnCJ,EAAe,YAAYK,CAAY,EACvCnC,EAAgB,YAAYoC,CAAa,EAIzC,IAAIT,EAAW,CACb,EAAG,EACH,EAAG,CACL,EAOA,GALAA,EAASV,CAAE,EAAIgB,EAAiBpB,EAAQI,CAAE,EAAIc,EAAYd,CAAE,EAC5DU,EAASR,CAAE,EAAI,KAAK,IAAIY,EAAYZ,CAAE,EAAGa,EAAeb,CAAE,CAAC,EAE3DQ,EAASP,CAAE,EAAI,KAAK,IAAI,EAAGY,EAAeZ,CAAE,EAAIgB,EAAc,EAAIpB,CAAS,CAAC,EAC5Ec,EAAe,WAAajB,EAAQI,CAAE,EAClCgB,EAAgB,CAClB,IAAIO,EAAY,CACd,EAAG,EACH,EAAG,CACL,EACAA,EAAUvB,CAAE,EAAI,KAAK,IAAIJ,EAAQI,CAAE,EAAIe,EAAef,CAAE,EAAIoB,EAAe,CAAC,EAC5EG,EAAUrB,CAAE,EAAIQ,EAASR,CAAE,EAC3BW,EAAe,YAAY,IAAYW,GAAK,CAC1C,MAAOD,CACT,CAAC,CAAC,EAGFV,EAAe,WAAaU,EAAUvB,CAAE,CAC1C,MAEEjB,EAAgB,UAAU,SAAU0C,EAAO,CACzCA,EAAM,KAAK,CACT,UAAW,GACX,OAAQ,EACV,CAAC,CACH,CAAC,EAGH,IAAIC,EAAW,KAAK,aAAalD,CAAW,EAC5C,OAAAkD,EAAS,WAAa,MAAgBC,GAAYf,EAAc,CAC9D,EAAGc,EAAS,gBAAgB,CAAC,EAC7B,EAAGA,EAAS,gBAAgB,CAAC,CAC/B,EAGAV,EAAiBxC,EAAc,IAAI,EACnC,KAAK,oBAAoBA,EAAakD,CAAQ,EACvChB,CACT,EACAvC,EAAqB,UAAU,QAAU,SAAUyD,EAAIpD,EAAaE,EAAK,CACvE,IAAImD,EAAkB,KAAK,aAAarD,CAAW,EAAEoD,CAAE,EACvDC,GAAmB,MAAQnD,EAAI,eAAe,CAC5C,KAAM,eACN,gBAAiBmD,EACjB,SAAUrD,EAAY,EACxB,CAAC,CACH,EACAL,EAAqB,UAAU,oBAAsB,SAAUK,EAAakD,EAAU,CACpF,IAAI3C,EAAkB,KAAK,iBACpB+C,EAAK,CAAC,WAAY,UAAU,EAAG,SAAUxC,EAAM,CACpD,IAAIyC,EAAMzC,EAAO,YACb0C,EAAUN,EAASK,CAAG,GAAK,KAC3BtC,EAAOV,EAAgB,YAAYO,CAAI,EACvCG,IACFA,EAAK,SAAS,OAAQuC,EAAUxD,EAAY,IAAI,gBAAiB,EAAI,EAAIA,EAAY,IAAI,wBAAyB,EAAI,CAAC,EACvHiB,EAAK,OAASuC,EAAU,UAAY,UAExC,CAAC,EACD,IAAIC,EAAWlD,EAAgB,YAAY,UAAU,EACjDmD,EAAgB1D,EAAY,IAAI,eAAe,EAC/C2D,EAAYT,EAAS,UACrBU,EAAUD,GAAa,KAAOA,EAAY,EAAI,EAC9CE,EAAQX,EAAS,UACrBO,GAAYC,GAAiBD,EAAS,SAAS,OAAeK,GAASJ,CAAa,EAAIA,EAAc,QAAQ,YAAaE,GAAW,KAAO,GAAKA,EAAU,EAAE,EAAE,QAAQ,UAAWC,GAAS,KAAO,GAAKA,EAAQ,EAAE,EAAIH,EAAc,CAClO,QAASE,EACT,MAAOC,CACT,CAAC,CAAC,CACJ,EASAlE,EAAqB,UAAU,aAAe,SAAUK,EAAa,CACnE,IAAIqD,EAAkBrD,EAAY,IAAI,kBAAmB,EAAI,EACzDoC,EAAe,KAAK,gBAAgB,EACpC2B,EAAoB,KAAK,gBAAgB,WACzCxC,EAAYvB,EAAY,UAAU,EAAE,MACpCwB,EAAK/B,GAAG8B,CAAS,EACjBE,EAAK/B,GAAG6B,CAAS,EACjByC,EAAkB,KAAK,qBAAqBX,CAAe,EAC3DY,EAAW7B,EAAa,SAAS,EACjC8B,EAAaD,EAASD,CAAe,EACrCG,EAAYF,EAAS,OACrBG,EAAUD,EAAgB,EAAJ,EACtBE,EAAS,CACX,gBAAiB,CAACjC,EAAa,EAAGA,EAAa,CAAC,EAChD,UAAWgC,EACX,UAAWA,EAAS,EACpB,kBAAmB,KACnB,kBAAmB,IACrB,EACA,GAAI,CAACF,EACH,OAAOG,EAET,IAAIC,EAAiBC,EAAYL,CAAU,EAC3CG,EAAO,gBAAgB9C,CAAS,EAAI,CAAC+C,EAAe,EAYpD,QAASE,EAAIR,EAAkB,EAAGS,EAAmBH,EAAgBI,EAAiBJ,EAAgBK,EAAe,KAAMH,GAAKL,EAAW,EAAEK,EAC3IG,EAAeJ,EAAYN,EAASO,CAAC,CAAC,GAGtC,CAACG,GAAgBD,EAAe,EAAID,EAAiB,EAAIV,GAGtDY,GAAgB,CAACC,EAAUD,EAAcF,EAAiB,CAAC,KACxDC,EAAe,EAAID,EAAiB,EACtCA,EAAmBC,EAGnBD,EAAmBE,EAEjBF,IACEJ,EAAO,mBAAqB,OAC9BA,EAAO,kBAAoBI,EAAiB,GAE9C,EAAEJ,EAAO,YAGbK,EAAiBC,EAEnB,QAASH,EAAIR,EAAkB,EAAGS,EAAmBH,EAAgBI,EAAiBJ,EAAgBK,EAAe,KAAMH,GAAK,GAAI,EAAEA,EACpIG,EAAeJ,EAAYN,EAASO,CAAC,CAAC,GAIrC,CAACG,GAAgB,CAACC,EAAUF,EAAgBC,EAAa,CAAC,IAEtDF,EAAiB,EAAIC,EAAe,IACvCA,EAAiBD,EACbJ,EAAO,mBAAqB,OAC9BA,EAAO,kBAAoBI,EAAiB,GAE9C,EAAEJ,EAAO,UACT,EAAEA,EAAO,WAEXI,EAAmBE,EAErB,OAAON,EACP,SAASE,EAAYM,EAAI,CACvB,GAAIA,EAAI,CACN,IAAIC,EAAWD,EAAG,gBAAgB,EAC9BE,EAAQD,EAASrD,CAAE,EAAIoD,EAAGpD,CAAE,EAChC,MAAO,CACL,EAAGsD,EACH,EAAGA,EAAQD,EAAStD,CAAE,EACtB,EAAGqD,EAAG,iBACR,CACF,CACF,CACA,SAASD,EAAUI,EAAUC,EAAU,CACrC,OAAOD,EAAS,GAAKC,GAAYD,EAAS,GAAKC,EAAWlB,CAC5D,CACF,EACApE,EAAqB,UAAU,qBAAuB,SAAUuF,EAAiB,CAC/E,GAAI,CAAC,KAAK,gBACR,MAAO,GAET,IAAIC,EACA/C,EAAe,KAAK,gBAAgB,EACpCgD,EACJ,OAAAhD,EAAa,UAAU,SAAUa,EAAOoC,EAAK,CAC3C,IAAIC,EAAgBrC,EAAM,kBAMtBmC,GAAgB,MAAQE,GAAiB,OAC3CF,EAAeC,GAEbC,IAAkBJ,IACpBC,EAAQE,EAEZ,CAAC,EACMF,GAAwBC,CACjC,EACAzF,EAAqB,KAAO,gBACrBA,CACT,GAAE4F,EAAU,EACLC,IAAQ7F,ICrWA,SAAR8F,GAA+CC,EAAW,CAO/DA,EAAU,eAAe,eAAgB,eAAgB,SAAUC,EAASC,EAAS,CACnF,IAAIC,EAAkBF,EAAQ,gBAC9BE,GAAmB,MAAQD,EAAQ,cAAc,CAC/C,SAAU,SACV,QAAS,SACT,MAAOD,CACT,EAAG,SAAUG,EAAa,CACxBA,EAAY,mBAAmBD,CAAe,CAChD,CAAC,CACH,CAAC,CACH,CCZO,SAASE,IAAQC,EAAW,CACjCC,GAAIF,EAAkB,EACtBC,EAAU,uBAAuBE,GAAqB,EACtDF,EAAU,sBAAsBG,GAAoB,EACpDC,GAA8BJ,CAAS,CACzC,CCPO,SAASK,GAAQC,EAAW,CACjCC,GAAIF,EAAkB,EACtBE,GAAIF,GAAmB,CACzB,CCHA,IAAIG,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,KAAO,kBACvBA,EAAgB,cAAgBI,GAAqBC,GAAc,cAAe,CAChF,SAAU,GACV,SAAU,GACV,iBAAkB,GAClB,gBAAiB,GACjB,iBAAkB,GAClB,wBAAyB,EAC3B,CAAC,EACML,CACT,GAAEK,EAAa,EACRC,IAAQN,ICXf,IAAIO,GAAQC,GAAU,EACf,SAASC,IAA4BC,EAAKC,EAAeC,EAAU,CACxEL,GAAMG,CAAG,EAAE,kBAAkB,KAAK,SAAUG,EAAgB,CAC1D,IAAIC,EAASD,EAAe,gBAAgB,IAAIF,EAAc,GAAG,EAC7DG,IACFA,EAAO,SAAWF,EAEtB,CAAC,CACH,CACO,SAASG,IAA8BL,EAAKC,EAAe,CAGhE,QAFIK,EAAoBT,GAAMG,CAAG,EAAE,kBAC/BO,EAAiBD,EAAkB,KAAK,EACnC,EAAI,EAAG,EAAIC,EAAe,OAAQ,IAAK,CAC9C,IAAIC,EAAcD,EAAe,CAAC,EAC9BJ,EAAiBG,EAAkB,IAAIE,CAAW,EAClDC,EAAkBN,EAAe,gBACrC,GAAIM,EAAiB,CACnB,IAAIC,EAAQT,EAAc,IACtBG,EAASK,EAAgB,IAAIC,CAAK,EAClCN,IACFK,EAAgB,UAAUC,CAAK,EAC1BD,EAAgB,KAAK,EAAE,QAC1BE,IAAsBL,EAAmBH,CAAc,EAG7D,CACF,CACF,CACA,SAASQ,IAAsBL,EAAmBH,EAAgB,CAChE,GAAIA,EAAgB,CAClBG,EAAkB,UAAUH,EAAe,MAAM,GAAG,EACpD,IAAIS,EAAaT,EAAe,WAChCS,GAAcA,EAAW,QAAQ,CACnC,CACF,CACA,SAASC,IAAqBb,EAAKc,EAAe,CAEhD,IAAIX,EAAiB,CACnB,MAAOW,EACP,cAAeC,GAAMC,IAAeF,CAAa,EACjD,eAAgBC,GAAME,IAAgBjB,CAAG,EACzC,gBAAiB,KACjB,WAAY,IACd,EAGIY,EAAaT,EAAe,WAAa,IAAIe,GAAelB,EAAI,MAAM,CAAC,EAC3E,OAAAmB,EAAK,CAAC,MAAO,OAAQ,YAAY,EAAG,SAAUC,EAAW,CACvDR,EAAW,GAAGQ,EAAW,SAAUC,EAAO,CACxC,IAAIC,EAAQ,CAAC,EACbnB,EAAe,gBAAgB,KAAK,SAAUC,EAAQ,CAGpD,GAAKiB,EAAM,oBAAoBjB,EAAO,MAAM,MAAM,EAGlD,KAAImB,GAAUnB,EAAO,UAAY,CAAC,GAAGgB,CAAS,EAC1CI,EAAQD,GAAUA,EAAOnB,EAAO,oBAAqBD,EAAe,MAAM,SAAUA,EAAe,WAAYkB,CAAK,EACxH,CAACjB,EAAO,MAAM,IAAI,WAAY,EAAI,GAAKoB,GAASF,EAAM,KAAK,CACzD,WAAYlB,EAAO,MAAM,GACzB,MAAOoB,EAAM,CAAC,EACd,IAAKA,EAAM,CAAC,CACd,CAAC,EACH,CAAC,EACDF,EAAM,QAAUnB,EAAe,eAAemB,CAAK,CACrD,CAAC,CACH,CAAC,EACMnB,CACT,CAIA,SAASc,IAAejB,EAAKsB,EAAO,CAC7BtB,EAAI,WAAW,GAClBA,EAAI,eAAe,CACjB,KAAM,WACN,UAAW,CACT,OAAQ,WACR,SAAU,GACZ,EACA,MAAOsB,CACT,CAAC,CAEL,CACA,SAASN,IAAcF,EAAeW,EAAGC,EAAGC,EAAG,CAC7C,OAAOb,EAAc,iBAAiB,aAAa,CAACY,EAAGC,CAAC,CAAC,CAC3D,CAIA,SAASC,IAAsBnB,EAAiBN,EAAgBH,EAAK,CACnE,IAAI6B,EAGAC,EAAS,QACTC,EAAe,CACjB,UAAa,EACb,UAAa,EACb,WAAc,EACd,eAAkB,EACpB,EACIC,EAA0B,GAC9B,OAAAvB,EAAgB,KAAK,SAAUwB,EAAc,CAC3C,IAAIhC,EAAgBgC,EAAa,MAC7BC,EAAUjC,EAAc,IAAI,WAAY,EAAI,EAAI,GAAQA,EAAc,IAAI,WAAY,EAAI,EAAI,OAAS,GACvG8B,EAAaD,EAASI,CAAO,EAAIH,EAAaD,EAASD,CAAW,IACpEA,EAAcK,GAIhBF,EAA0BA,GAA2B/B,EAAc,IAAI,0BAA2B,EAAI,CACxG,CAAC,EACM,CACL,YAAa4B,EACb,IAAK,CAIH,iBAAkB,GAClB,gBAAiB,GACjB,iBAAkB,GAClB,wBAAyB,CAAC,CAACG,EAC3B,IAAKhC,EACL,MAAO,CACL,UAAWG,EAAe,KAC5B,EACA,YAAa,CACX,YAAa,KACb,SAAUA,EAAe,aAC3B,CACF,CACF,CACF,CACO,SAASgC,IAA6BC,EAAW,CACtDA,EAAU,kBAAkBA,EAAU,SAAS,UAAU,OAAQ,SAAUC,EAASrC,EAAK,CACvF,IAAIsC,EAAWzC,GAAMG,CAAG,EACpBM,EAAoBgC,EAAS,oBAAsBA,EAAS,kBAAoBC,GAAc,GAClGjC,EAAkB,KAAK,SAAUH,EAAgB,CAG/CA,EAAe,gBAAkB,IACnC,CAAC,EACDkC,EAAQ,cAAc,CACpB,SAAU,WACV,QAAS,QACX,EAAG,SAAUpC,EAAe,CAC1B,IAAIuC,EAAsBC,GAA8BxC,CAAa,EACrEkB,EAAKqB,EAAoB,SAAU,SAAUE,EAAgB,CAC3D,IAAIC,EAAcD,EAAe,MAAM,IACnCvC,EAAiBG,EAAkB,IAAIqC,CAAW,GAAKrC,EAAkB,IAAIqC,EAAa9B,IAAqBb,EAAK0C,EAAe,KAAK,CAAC,EACzIjC,EAAkBN,EAAe,kBAAoBA,EAAe,gBAAkBoC,GAAc,GAExG9B,EAAgB,IAAIR,EAAc,IAAK,CACrC,oBAAqByC,EACrB,MAAOzC,EACP,SAAU,IACZ,CAAC,CACH,CAAC,CACH,CAAC,EAGDK,EAAkB,KAAK,SAAUH,EAAgB,CAC/C,IAAIS,EAAaT,EAAe,WAC5ByC,EACAnC,EAAkBN,EAAe,gBACrC,GAAIM,EAAiB,CACnB,IAAIoC,EAAapC,EAAgB,KAAK,EAAE,CAAC,EACrCoC,GAAc,OAChBD,EAAcnC,EAAgB,IAAIoC,CAAU,EAEhD,CACA,GAAI,CAACD,EAAa,CAChBjC,IAAsBL,EAAmBH,CAAc,EACvD,MACF,CACA,IAAI2C,EAAmBlB,IAAsBnB,EAAiBN,EAAgBH,CAAG,EACjFY,EAAW,OAAOkC,EAAiB,YAAaA,EAAiB,GAAG,EACvDC,GAAe5C,EAAgB,iBAAkByC,EAAY,MAAM,IAAI,WAAY,EAAI,EAAG,SAAS,CAClH,CAAC,CACH,CAAC,CACH,CCzLA,IAAII,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAO,kBACNA,CACT,CACA,OAAAH,EAAe,UAAU,OAAS,SAAUI,EAAeC,EAASC,EAAK,CAEvE,GADAL,EAAO,UAAU,OAAO,MAAM,KAAM,SAAS,EACzCG,EAAc,SAAS,EAAG,CAC5B,KAAK,OAAO,EACZ,MACF,CAIA,KAAK,MAAQA,EAAc,gBAAgB,EAErCG,IAA4BD,EAAKF,EAAe,CACpD,IAAKI,GAAKC,GAAiB,IAAK,IAAI,EACpC,KAAMD,GAAKC,GAAiB,KAAM,IAAI,EACtC,WAAYD,GAAKC,GAAiB,WAAY,IAAI,CACpD,CAAC,CACH,EACAT,EAAe,UAAU,QAAU,UAAY,CAC7C,KAAK,OAAO,EACZC,EAAO,UAAU,QAAQ,MAAM,KAAM,SAAS,CAChD,EACAD,EAAe,UAAU,OAAS,UAAY,CACtCU,IAA8B,KAAK,IAAK,KAAK,aAAa,EAChE,KAAK,MAAQ,IACf,EACAV,EAAe,KAAO,kBACfA,CACT,GAAEW,EAAY,EACVF,GAAmB,CACrB,KAAM,SAAUG,EAAcC,EAAkBC,EAAYC,EAAG,CAC7D,IAAIC,EAAY,KAAK,MACjBC,EAAQD,EAAU,MAAM,EAExBE,EAAYN,EAAa,WAAW,CAAC,EACzC,GAAKM,EAGL,KAAIC,EAAgBC,GAAiBP,CAAgB,EAAE,KAAM,CAACE,EAAE,QAASA,EAAE,OAAO,EAAGG,EAAWJ,EAAYF,CAAY,EACpHS,GAAgBF,EAAc,OAAS,EAAIA,EAAc,WAAaA,EAAc,YAAcA,EAAc,MAAQA,EAAc,MAAQA,EAAc,YAAcA,EAAc,aAAeF,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAKA,EAAM,CAAC,EACrOK,EAAQ,KAAK,IAAI,EAAIP,EAAE,MAAO,CAAC,EACnCE,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAII,GAAgBC,EAAQD,EAC/CJ,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAII,GAAgBC,EAAQD,EAE/C,IAAIE,EAAa,KAAK,cAAc,4BAA4B,EAAE,cAAc,EAGhF,GAFAC,GAAW,EAAGP,EAAO,CAAC,EAAG,GAAG,EAAG,EAAGM,EAAW,QAASA,EAAW,OAAO,EACxE,KAAK,MAAQN,EACTD,EAAU,CAAC,IAAMC,EAAM,CAAC,GAAKD,EAAU,CAAC,IAAMC,EAAM,CAAC,EACvD,OAAOA,EAEX,EACA,IAAKQ,IAAU,SAAUR,EAAOC,EAAWN,EAAcC,EAAkBC,EAAYC,EAAG,CACxF,IAAII,EAAgBC,GAAiBP,CAAgB,EAAE,CAACE,EAAE,KAAMA,EAAE,IAAI,EAAG,CAACA,EAAE,KAAMA,EAAE,IAAI,EAAGG,EAAWJ,EAAYF,CAAY,EAC9H,OAAOO,EAAc,QAAUF,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAKE,EAAc,MAAQA,EAAc,WAC5F,CAAC,EACD,WAAYM,IAAU,SAAUR,EAAOC,EAAWN,EAAcC,EAAkBC,EAAYC,EAAG,CAC/F,IAAII,EAAgBC,GAAiBP,CAAgB,EAAE,CAAC,EAAG,CAAC,EAAG,CAACE,EAAE,YAAaA,EAAE,WAAW,EAAGG,EAAWJ,EAAYF,CAAY,EAClI,OAAOO,EAAc,QAAUF,EAAM,CAAC,EAAIA,EAAM,CAAC,GAAKF,EAAE,WAC1D,CAAC,CACH,EACA,SAASU,IAAUC,EAAiB,CAClC,OAAO,SAAUd,EAAcC,EAAkBC,EAAYC,EAAG,CAC9D,IAAIC,EAAY,KAAK,MACjBC,EAAQD,EAAU,MAAM,EAExBE,EAAYN,EAAa,WAAW,CAAC,EACzC,GAAKM,EAGL,KAAIS,EAAeD,EAAgBT,EAAOC,EAAWN,EAAcC,EAAkBC,EAAYC,CAAC,EAGlG,GAFAS,GAAWG,EAAcV,EAAO,CAAC,EAAG,GAAG,EAAG,KAAK,EAC/C,KAAK,MAAQA,EACTD,EAAU,CAAC,IAAMC,EAAM,CAAC,GAAKD,EAAU,CAAC,IAAMC,EAAM,CAAC,EACvD,OAAOA,EAEX,CACF,CACA,IAAIG,GAAmB,CACrB,KAAM,SAAUQ,EAAUC,EAAUX,EAAWJ,EAAYF,EAAc,CACvE,IAAIkB,EAAOZ,EAAU,KACjBa,EAAM,CAAC,EACPC,EAAOpB,EAAa,MAAM,iBAAiB,QAAQ,EACvD,OAAAgB,EAAWA,GAAY,CAAC,EAAG,CAAC,EACxBE,EAAK,MAAQ,KACfC,EAAI,MAAQF,EAAS,CAAC,EAAID,EAAS,CAAC,EACpCG,EAAI,YAAcC,EAAK,MACvBD,EAAI,WAAaC,EAAK,EACtBD,EAAI,OAASD,EAAK,QAAU,EAAI,KAGhCC,EAAI,MAAQF,EAAS,CAAC,EAAID,EAAS,CAAC,EACpCG,EAAI,YAAcC,EAAK,OACvBD,EAAI,WAAaC,EAAK,EACtBD,EAAI,OAASD,EAAK,QAAU,GAAK,GAE5BC,CACT,EACA,MAAO,SAAUH,EAAUC,EAAUX,EAAWJ,EAAYF,EAAc,CACxE,IAAIkB,EAAOZ,EAAU,KACjBa,EAAM,CAAC,EACPE,EAAQrB,EAAa,MAAM,iBAC3BsB,EAAeD,EAAM,cAAc,EAAE,UAAU,EAC/CE,EAAcF,EAAM,aAAa,EAAE,UAAU,EACjD,OAAAL,EAAWA,EAAWK,EAAM,aAAaL,CAAQ,EAAI,CAAC,EAAG,CAAC,EAC1DC,EAAWI,EAAM,aAAaJ,CAAQ,EAClCX,EAAU,WAAa,cACzBa,EAAI,MAAQF,EAAS,CAAC,EAAID,EAAS,CAAC,EAGpCG,EAAI,YAAcG,EAAa,CAAC,EAAIA,EAAa,CAAC,EAClDH,EAAI,WAAaG,EAAa,CAAC,EAC/BH,EAAI,OAASD,EAAK,QAAU,EAAI,KAGhCC,EAAI,MAAQF,EAAS,CAAC,EAAID,EAAS,CAAC,EAGpCG,EAAI,YAAcI,EAAY,CAAC,EAAIA,EAAY,CAAC,EAChDJ,EAAI,WAAaI,EAAY,CAAC,EAC9BJ,EAAI,OAASD,EAAK,QAAU,GAAK,GAE5BC,CACT,EACA,WAAY,SAAUH,EAAUC,EAAUX,EAAWJ,EAAYF,EAAc,CAC7E,IAAIkB,EAAOZ,EAAU,KACjBc,EAAOpB,EAAa,MAAM,iBAAiB,QAAQ,EACnDmB,EAAM,CAAC,EACX,OAAAH,EAAWA,GAAY,CAAC,EAAG,CAAC,EACxBE,EAAK,SAAW,cAClBC,EAAI,MAAQF,EAAS,CAAC,EAAID,EAAS,CAAC,EACpCG,EAAI,YAAcC,EAAK,MACvBD,EAAI,WAAaC,EAAK,EACtBD,EAAI,OAASD,EAAK,QAAU,EAAI,KAGhCC,EAAI,MAAQF,EAAS,CAAC,EAAID,EAAS,CAAC,EACpCG,EAAI,YAAcC,EAAK,OACvBD,EAAI,WAAaC,EAAK,EACtBD,EAAI,OAASD,EAAK,QAAU,GAAK,GAE5BC,CACT,CACF,EACOK,IAAQpC,ICtJR,SAASqC,GAAQC,EAAW,CACjCC,GAAcD,CAAS,EACvBA,EAAU,uBAAuBE,GAAe,EAChDF,EAAU,sBAAsBG,GAAc,EAC9CC,IAA6BJ,CAAS,CACxC,CCLA,IAAIK,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CACA,OAAAH,EAAgB,KAAO,kBACvBA,EAAgB,WAAa,MAC7BA,EAAgB,cAAgBI,GAAqBC,GAAc,cAAe,CAChF,KAAM,GAEN,MAAO,KACP,IAAK,KACL,MAAO,KACP,OAAQ,KACR,KAAM,KACN,OAAQ,KACR,YAAaC,EAAO,MAAM,SAC1B,aAAc,EACd,gBAAiBA,EAAO,MAAM,YAE9B,eAAgB,CACd,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,MAAO,EACT,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,QAAS,EACX,CACF,EACA,uBAAwB,CACtB,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,MAAO,EACT,EACA,UAAW,CACT,MAAOA,EAAO,MAAM,SACpB,QAAS,EACX,CACF,EAEA,YAAa,wBACb,WAAY,kHAEZ,WAAY,OACZ,YAAa,CACX,MAAOA,EAAO,MAAM,UACpB,YAAaA,EAAO,MAAM,QAC5B,EACA,eAAgB,EAChB,eAAgB,maAChB,gBAAiB,CACf,MAAOA,EAAO,MAAM,SACpB,QAAS,EACX,EACA,WAAY,GACZ,eAAgB,OAChB,SAAU,GACV,SAAU,GACV,UAAW,CACT,MAAOA,EAAO,MAAM,QACtB,EACA,YAAa,GACb,WAAY,CACV,MAAOA,EAAO,MAAM,SACpB,QAAS,EACX,EACA,SAAU,CACR,YAAa,CACX,KAAM,EACR,EACA,YAAa,CACX,YAAaA,EAAO,MAAM,QAC5B,EACA,gBAAiB,CACf,QAAS,EACX,CACF,EACA,uBAAwB,EAC1B,CAAC,EACMN,CACT,GAAEK,EAAa,EACRE,IAAQP,ICzEf,IAAIQ,GAAeC,GAEfC,IAA6B,EAC7BC,GAAsB,GACtBC,IAA2B,EAC3BC,GAAa,aACbC,IAAW,WACXC,IAAY,EACZC,IAA+B,CAAC,OAAQ,MAAO,cAAe,SAAS,EACvEC,IAA4B,CAC9B,OAAQ,WACR,SAAU,IACV,MAAO,CACT,EACIC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,cAAgB,CAAC,EAChBA,CACT,CACA,OAAAH,EAAe,UAAU,KAAO,SAAUI,EAASC,EAAK,CACtD,KAAK,IAAMA,EAEX,KAAK,SAAWC,GAAK,KAAK,SAAU,IAAI,EACxC,KAAK,YAAcA,GAAK,KAAK,YAAa,IAAI,CAChD,EACAN,EAAe,UAAU,OAAS,SAAUO,EAAeH,EAASC,EAAKG,EAAS,CAIhF,GAHAP,EAAO,UAAU,OAAO,MAAM,KAAM,SAAS,EACpCQ,GAAe,KAAM,sBAAuBF,EAAc,IAAI,UAAU,EAAG,SAAS,EAC7F,KAAK,QAAUA,EAAc,UAAU,EACnCA,EAAc,IAAI,MAAM,IAAM,GAAO,CACvC,KAAK,MAAM,UAAU,EACrB,MACF,CACA,GAAIA,EAAc,SAAS,EAAG,CAC5B,KAAK,OAAO,EACZ,KAAK,MAAM,UAAU,EACrB,MACF,EAII,CAACC,GAAWA,EAAQ,OAAS,YAAcA,EAAQ,OAAS,KAAK,MACnE,KAAK,WAAW,EAElB,KAAK,YAAY,CACnB,EACAR,EAAe,UAAU,QAAU,UAAY,CAC7C,KAAK,OAAO,EACZC,EAAO,UAAU,QAAQ,MAAM,KAAM,SAAS,CAChD,EACAD,EAAe,UAAU,OAAS,UAAY,CACnCU,GAAM,KAAM,qBAAqB,EAC1C,IAAIC,EAAK,KAAK,IAAI,MAAM,EACxBA,EAAG,IAAI,YAAa,KAAK,QAAQ,EACjCA,EAAG,IAAI,UAAW,KAAK,WAAW,CACpC,EACAX,EAAe,UAAU,WAAa,UAAY,CAChD,IAAIY,EAAY,KAAK,MACrBA,EAAU,UAAU,EACpB,KAAK,UAAY,GACjB,KAAK,cAAc,UAAY,KAC/B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,IAAIC,EAAW,KAAK,cAAc,YAAc,IAAYC,GAC5D,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvBF,EAAU,IAAIC,CAAQ,EACtB,KAAK,eAAe,CACtB,EACAb,EAAe,UAAU,eAAiB,UAAY,CACpD,IAAIO,EAAgB,KAAK,cACrBF,EAAM,KAAK,IACXU,EAAiBR,EAAc,IAAI,aAAa,EAChDS,EAAiBD,EAAiBrB,IAA2B,EAC7DuB,EAAsBC,GAAyBX,EAAeF,CAAG,EAAE,aAGnEc,EAAY,KAAK,eAAe,EAChCC,EAAUb,EAAc,IAAI,yBAA0B,EAAI,GAAK,EAE/Dc,EAAe,KAAK,UAAY1B,GAAa,CAG/C,MAAOsB,EAAa,MAAQE,EAAU,EAAIA,EAAU,MACpD,IAAKF,EAAa,OAASxB,GAAsB2B,EAAUJ,EAC3D,MAAOG,EAAU,MACjB,OAAQ1B,EACV,EAAI,CACF,MAAO2B,EACP,IAAKD,EAAU,EACf,MAAO1B,GACP,OAAQ0B,EAAU,MACpB,EAGIG,EAAsBC,GAAgBhB,EAAc,MAAM,EAE9DiB,EAAK,CAAC,QAAS,MAAO,QAAS,QAAQ,EAAG,SAAUC,EAAM,CACpDH,EAAaG,CAAI,IAAM,OACzBH,EAAaG,CAAI,EAAIJ,EAAaI,CAAI,EAE1C,CAAC,EACD,IAAIC,EAAoBC,GAAcL,EAAcL,CAAY,EAChE,KAAK,UAAY,CACf,EAAGS,EAAW,EACd,EAAGA,EAAW,CAChB,EACA,KAAK,MAAQ,CAACA,EAAW,MAAOA,EAAW,MAAM,EACjD,KAAK,UAAY9B,KAAY,KAAK,MAAM,QAAQ,CAClD,EACAI,EAAe,UAAU,eAAiB,UAAY,CACpD,IAAIY,EAAY,KAAK,MACjBgB,EAAW,KAAK,UAChBC,EAAS,KAAK,QAEdC,EAAkB,KAAK,cAAc,wBAAwB,EAC7DC,EAAUD,GAAmBA,EAAgB,IAAI,SAAS,EAC1DE,EAAc,KAAK,cAAc,YACjCC,GAAoB,KAAK,iBAAmB,CAAC,GAAG,iBAEpDD,EAAY,KAAKH,IAAWlC,IAAc,CAACoC,EAAU,CACnD,OAAQE,EAAmB,EAAI,GAC/B,OAAQ,CACV,EAAIJ,IAAWlC,IAAcoC,EAAU,CACrC,OAAQE,EAAmB,EAAI,GAC/B,OAAQ,EACV,EAAIJ,IAAWjC,KAAY,CAACmC,EAAU,CACpC,OAAQE,EAAmB,GAAK,EAChC,OAAQ,EACR,SAAU,KAAK,GAAK,CACtB,EAEE,CACA,OAAQA,EAAmB,GAAK,EAChC,OAAQ,GACR,SAAU,KAAK,GAAK,CACtB,CAAC,EAED,IAAIC,EAAOtB,EAAU,gBAAgB,CAACoB,CAAW,CAAC,EAClDpB,EAAU,EAAIgB,EAAS,EAAIM,EAAK,EAChCtB,EAAU,EAAIgB,EAAS,EAAIM,EAAK,EAChCtB,EAAU,WAAW,CACvB,EACAZ,EAAe,UAAU,eAAiB,UAAY,CACpD,MAAO,CAAC,EAAG,KAAK,MAAM,CAAC,CAAC,CAC1B,EACAA,EAAe,UAAU,kBAAoB,UAAY,CACvD,IAAIO,EAAgB,KAAK,cACrB4B,EAAO,KAAK,MACZtB,EAAW,KAAK,cAAc,YAC9BuB,EAAc7B,EAAc,IAAI,aAAa,EACjDM,EAAS,IAAI,IAAIvB,GAAK,CACpB,OAAQ,GACR,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAO6C,EAAK,CAAC,EACb,OAAQA,EAAK,CAAC,CAChB,EACA,MAAO,CACL,KAAM5B,EAAc,IAAI,iBAAiB,CAC3C,EACA,GAAI,GACN,CAAC,CAAC,EAEF,IAAI8B,EAAa,IAAI/C,GAAK,CACxB,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAO6C,EAAK,CAAC,EACb,OAAQA,EAAK,CAAC,CAChB,EACA,MAAO,CACL,KAAM,aACR,EACA,GAAI,EACJ,QAAS7B,GAAK,KAAK,cAAe,IAAI,CACxC,CAAC,EACGK,EAAK,KAAK,IAAI,MAAM,EACpByB,GACFC,EAAW,GAAG,YAAa,KAAK,cAAe,IAAI,EACnDA,EAAW,OAAS,YACpB1B,EAAG,GAAG,YAAa,KAAK,QAAQ,EAChCA,EAAG,GAAG,UAAW,KAAK,WAAW,IAEjCA,EAAG,IAAI,YAAa,KAAK,QAAQ,EACjCA,EAAG,IAAI,UAAW,KAAK,WAAW,GAEpCE,EAAS,IAAIwB,CAAU,CACzB,EACArC,EAAe,UAAU,kBAAoB,UAAY,CACvD,IAAIsC,EAAO,KAAK,gBAAkB,KAAK,uBAAuB,EAE9D,GADA,KAAK,cAAc,eAAiB,CAAC,EACjC,CAACA,EACH,OAEF,IAAIH,EAAO,KAAK,MACZI,EAAU,KAAK,aAAe,CAAC,EAC/BC,EAAcF,EAAK,OACnBG,EAAOD,EAAY,WAAW,EAC9BE,EAAiBF,EAAY,cAAgBA,EAAY,aAAa,EACtEG,EAAWD,GAAkBD,EAAK,iBAAiBC,CAAc,EAAIF,EAAY,aAAa,EAChGF,EAAK,SACP,GAAIK,GAAY,KACd,OAEF,IAAIC,EAAa,KAAK,kBAClBC,EAAc,KAAK,mBAEvB,GAAIJ,IAAS,KAAK,aAAeE,IAAa,KAAK,YAAcR,EAAK,CAAC,IAAMI,EAAQ,CAAC,GAAKJ,EAAK,CAAC,IAAMI,EAAQ,CAAC,EAAG,CACjH,IAAIO,EAAmBL,EAAK,cAAcH,EAAK,OAAO,EAClDS,EAAoBN,EAAK,cAAcE,CAAQ,EAE/CK,GAAeD,EAAkB,CAAC,EAAIA,EAAkB,CAAC,GAAK,GAClEA,EAAoB,CAACA,EAAkB,CAAC,EAAIC,EAAaD,EAAkB,CAAC,EAAIC,CAAW,EAC3F,IAAIC,EAAsB,CAAC,EAAGd,EAAK,CAAC,CAAC,EACjCe,EAAmB,CAAC,EAAGf,EAAK,CAAC,CAAC,EAC9BgB,EAAe,CAAC,CAAChB,EAAK,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EACpCiB,EAAe,CAAC,EAChBC,EAASH,EAAiB,CAAC,EAAI,KAAK,IAAI,EAAGT,EAAK,MAAM,EAAI,CAAC,EAC3Da,EAA0BnB,EAAK,CAAC,GAAKW,EAAiB,CAAC,EAAIA,EAAiB,CAAC,GAC7ES,EAAejB,EAAK,SAAS,OAAS,OACtCkB,EAAc,CAACH,EAEfI,EAAW,KAAK,MAAMhB,EAAK,MAAM,EAAIN,EAAK,CAAC,CAAC,EAC5CuB,EACJjB,EAAK,KAAK,CAACH,EAAK,QAASK,CAAQ,EAAG,SAAUgB,EAAWC,EAAYC,EAAO,CAC1E,GAAIJ,EAAW,GAAKI,EAAQJ,EAAU,CAC/BF,IACHC,GAAeH,GAEjB,MACF,CACAG,EAAcD,GAAgB,CAACI,EAAYb,EAAiB,CAAC,GAAKQ,EAA0BE,EAAcH,EAK1G,IAAIS,EAAUF,GAAc,MAAQ,MAAMA,CAAU,GAAKA,IAAe,GAEpEG,EAAaD,EAAU,EAAIE,GAAUJ,EAAYb,EAAmBE,EAAqB,EAAI,EAE7Fa,GAAW,CAACJ,GAAiBG,GAC/BV,EAAa,KAAK,CAACA,EAAaA,EAAa,OAAS,CAAC,EAAE,CAAC,EAAG,CAAC,CAAC,EAC/DC,EAAa,KAAK,CAACA,EAAaA,EAAa,OAAS,CAAC,EAAE,CAAC,EAAG,CAAC,CAAC,GACtD,CAACU,GAAWJ,IACrBP,EAAa,KAAK,CAACK,EAAa,CAAC,CAAC,EAClCJ,EAAa,KAAK,CAACI,EAAa,CAAC,CAAC,GAE/BM,IACHX,EAAa,KAAK,CAACK,EAAaO,CAAU,CAAC,EAC3CX,EAAa,KAAK,CAACI,EAAaO,CAAU,CAAC,GAE7CL,EAAgBI,CAClB,CAAC,EACDlB,EAAa,KAAK,kBAAoBO,EACtCN,EAAc,KAAK,mBAAqBO,CAC1C,CACA,KAAK,YAAcX,EACnB,KAAK,WAAaE,EAClB,KAAK,YAAc,CAACR,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACpC,IAAI5B,EAAgB,KAAK,cACzB,SAAS0D,EAAsBC,EAAgB,CAC7C,IAAIC,EAAQ5D,EAAc,SAAS2D,EAAiB,yBAA2B,gBAAgB,EAC3FE,EAAQ,IAAYtD,GACpBuD,EAAU,IAAYC,GAAQ,CAChC,MAAO,CACL,OAAQ1B,CACV,EACA,uBAAwB,EACxB,MAAOuB,EAAM,SAAS,WAAW,EAAE,aAAa,EAChD,OAAQ,GACR,GAAI,GACN,CAAC,EACGI,EAAW,IAAYC,GAAS,CAClC,MAAO,CACL,OAAQ3B,CACV,EACA,uBAAwB,EACxB,MAAOsB,EAAM,SAAS,WAAW,EAAE,aAAa,EAChD,OAAQ,GACR,GAAI,GACN,CAAC,EACD,OAAAC,EAAM,IAAIC,CAAO,EACjBD,EAAM,IAAIG,CAAQ,EACXH,CACT,CAEA,QAASK,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIL,EAAQH,EAAsBQ,IAAM,CAAC,EACzC,KAAK,cAAc,YAAY,IAAIL,CAAK,EACxC,KAAK,cAAc,eAAe,KAAKA,CAAK,CAC9C,CACF,EACApE,EAAe,UAAU,uBAAyB,UAAY,CAC5D,IAAIO,EAAgB,KAAK,cACrBmE,EAAiBnE,EAAc,IAAI,gBAAgB,EACvD,GAAImE,IAAmB,GAIvB,KAAIC,EACAvE,EAAU,KAAK,QACnB,OAAAG,EAAc,eAAe,SAAUqE,EAASC,EAAW,CACzD,IAAIC,EAAevE,EAAc,aAAaqE,EAASC,CAAS,EAAE,sBAAsB,EACxFrD,EAAKsD,EAAc,SAAUtC,EAAa,CACxC,GAAI,CAAAmC,GAGA,EAAAD,IAAmB,IAAQK,GAAQjF,IAA8B0C,EAAY,IAAI,MAAM,CAAC,EAAI,GAGhG,KAAIwC,EAAW5E,EAAQ,aAAa6E,GAAgBL,CAAO,EAAGC,CAAS,EAAE,KACrElC,EAAWuC,IAAYN,CAAO,EAC9B3C,EACAkD,EAAW3C,EAAY,iBACvBG,GAAY,MAAQwC,EAAS,eAC/BlD,EAAmBkD,EAAS,aAAaH,CAAQ,EAAE,SAErDrC,EAAWH,EAAY,QAAQ,EAAE,aAAaG,CAAQ,EACtD,IAAIyC,EAAU5C,EAAY,QAAQ,EAAE,aAAaoC,CAAO,EACxDD,EAAS,CACP,SAAUK,EACV,OAAQxC,EACR,QAAS4C,EACT,SAAUzC,EACV,iBAAkBV,CACpB,EACF,EAAG,IAAI,CACT,EAAG,IAAI,EACA0C,EACT,EACA3E,EAAe,UAAU,cAAgB,UAAY,CACnD,IAAIY,EAAY,KAAK,MACjByE,EAAe,KAAK,cACpBC,EAAUD,EAAa,QAAU,CAAC,KAAM,IAAI,EAC5CE,EAAeF,EAAa,aAAe,CAAC,KAAM,IAAI,EACtDrD,EAAc,KAAK,cAAc,YACjCG,EAAO,KAAK,MACZ5B,EAAgB,KAAK,cACrBF,EAAM,KAAK,IACXmF,EAAejF,EAAc,IAAI,cAAc,GAAK,EACpD6B,EAAc7B,EAAc,IAAI,aAAa,EAC7CkF,EAASJ,EAAa,OAAS,IAAI/F,GAAK,CAC1C,OAAQ8C,EACR,MAAO,CACL,KAAM7B,EAAc,IAAI,aAAa,CACvC,EACA,WAAY,CACV,SAAU,QACZ,CACF,CAAC,EACDyB,EAAY,IAAIyD,CAAM,EAEtBzD,EAAY,IAAI,IAAI1C,GAAK,CACvB,OAAQ,GACR,iBAAkB,GAClB,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAO6C,EAAK,CAAC,EACb,OAAQA,EAAK,CAAC,EACd,EAAGqD,CACL,EACA,MAAO,CAEL,OAAQjF,EAAc,IAAI,qBAAqB,GAAKA,EAAc,IAAI,aAAa,EACnF,UAAWf,IACX,KAAMkG,EAAO,MAAM,WACrB,CACF,CAAC,CAAC,EAEFlE,EAAK,CAAC,EAAG,CAAC,EAAG,SAAUmE,EAAa,CAClC,IAAIC,EAAUrF,EAAc,IAAI,YAAY,EACxC,CAACsF,GAAmBD,CAAO,GAAKA,EAAQ,QAAQ,SAAS,EAAI,GAAKA,EAAQ,QAAQ,UAAU,EAAI,IAElGA,EAAU,UAAYA,GAKxB,IAAIE,EAAOC,GAAaH,EAAS,GAAI,EAAG,EAAG,EAAG,KAAM,EAAI,EACxDE,EAAK,KAAK,CACR,OAAQE,IAAU,KAAK,OAAO,EAC9B,UAAW,GACX,MAAO1F,GAAK,KAAK,YAAa,KAAMqF,CAAW,EAC/C,UAAWrF,GAAK,KAAK,WAAY,IAAI,EACrC,YAAaA,GAAK,KAAK,cAAe,KAAM,EAAI,EAChD,WAAYA,GAAK,KAAK,cAAe,KAAM,EAAK,EAChD,GAAI,CACN,CAAC,EACD,IAAI2F,EAAQH,EAAK,gBAAgB,EAC7BI,EAAa3F,EAAc,IAAI,YAAY,EAC/C,KAAK,cAAgB4F,GAAaD,EAAY,KAAK,MAAM,CAAC,CAAC,EAC3D,KAAK,aAAeD,EAAM,MAAQA,EAAM,OAAS,KAAK,cACtDH,EAAK,SAASvF,EAAc,SAAS,aAAa,EAAE,aAAa,CAAC,EAClEuF,EAAK,MAAM,cAAgB,GAC3BA,EAAK,UAAY,GACjBA,EAAK,YAAY,UAAU,EAAE,MAAQvF,EAAc,SAAS,CAAC,WAAY,aAAa,CAAC,EAAE,aAAa,EACtG6F,GAAoBN,CAAI,EACxB,IAAIO,EAAc9F,EAAc,IAAI,aAAa,EAE7C8F,GAAe,OACjBP,EAAK,MAAM,KAAOO,GAEpBrE,EAAY,IAAIsD,EAAQK,CAAW,EAAIG,CAAI,EAC3C,IAAIQ,EAAiB/F,EAAc,SAAS,WAAW,EACnDgG,EAAchG,EAAc,IAAI,aAAa,GAAK,CAAC,EACnDiG,EAAkBD,EAAY,MAAQ,GAC1C3F,EAAU,IAAI2E,EAAaI,CAAW,EAAI,IAAYc,GAAK,CACzD,OAAQ,GACR,UAAW,CAACD,EACZ,MAAOE,GAAgBJ,EAAgB,CACrC,EAAG,EACH,EAAG,EACH,KAAM,GACN,cAAe,SACf,MAAO,SACP,KAAMA,EAAe,aAAa,EAClC,KAAMA,EAAe,QAAQ,CAC/B,CAAC,EACD,GAAI,EACN,CAAC,CAAC,CACJ,EAAG,IAAI,EAEP,IAAIK,EAAiBlB,EACrB,GAAIrD,EAAa,CACf,IAAIwE,EAAmBT,GAAa5F,EAAc,IAAI,gBAAgB,EAAG4B,EAAK,CAAC,CAAC,EAC5E0E,EAAexB,EAAa,WAAa,IAAY9F,GAAK,CAC5D,MAAOgB,EAAc,SAAS,iBAAiB,EAAE,aAAa,EAC9D,OAAQ,GACR,MAAO,CACL,EAAG,CAAC,EAAG,EAAG,EAAG,CAAC,EACd,EAAG4B,EAAK,CAAC,EAAI,GACb,OAAQyE,CACV,CACF,CAAC,EACGE,EAAWF,EAAmB,GAC9BG,EAAiB1B,EAAa,eAAiBU,GAAaxF,EAAc,IAAI,gBAAgB,EAAG,CAACuG,EAAW,EAAG,CAACA,EAAW,EAAGA,EAAUA,EAAUpB,EAAO,MAAM,UAAW,EAAI,EACnLqB,EAAe,OAAS,GACxBA,EAAe,EAAI5E,EAAK,CAAC,EAAIyE,EAAmB,EAAI,GACpDC,EAAa,YAAY,UAAU,EAAE,MAAQtG,EAAc,SAAS,CAAC,WAAY,iBAAiB,CAAC,EAAE,aAAa,EAClH,IAAIyG,EAAqB,KAAK,IAAI7E,EAAK,CAAC,EAAI,EAAG,KAAK,IAAIyE,EAAkB,EAAE,CAAC,EAC7ED,EAAiBtB,EAAa,SAAW,IAAY9F,GAAK,CACxD,UAAW,GACX,MAAO,CACL,EAAG4C,EAAK,CAAC,EAAI6E,EACb,OAAQJ,EAAmBI,CAC7B,CACF,CAAC,EACDL,EAAe,GAAG,YAAa,UAAY,CACzCtG,EAAI,cAAcwG,CAAY,CAChC,CAAC,EAAE,GAAG,WAAY,UAAY,CAC5BxG,EAAI,cAAcwG,CAAY,CAChC,CAAC,EACD7E,EAAY,IAAI6E,CAAY,EAC5B7E,EAAY,IAAI+E,CAAc,EAC9B/E,EAAY,IAAI2E,CAAc,CAChC,CACAA,EAAe,KAAK,CAClB,UAAW,GACX,OAAQ,UACR,MAAOrG,GAAK,KAAK,YAAa,KAAM,KAAK,EACzC,YAAaA,GAAK,KAAK,cAAe,KAAM,EAAI,EAChD,UAAWA,GAAK,KAAK,WAAY,IAAI,EACrC,YAAaA,GAAK,KAAK,cAAe,KAAM,EAAI,EAChD,WAAYA,GAAK,KAAK,cAAe,KAAM,EAAK,CAClD,CAAC,CACH,EACAN,EAAe,UAAU,eAAiB,UAAY,CACpD,IAAIiH,EAAQ,KAAK,OAAS,KAAK,cAAc,gBAAgB,EACzDC,EAAa,KAAK,eAAe,EACrC,KAAK,YAAc,CAAClD,GAAUiD,EAAM,CAAC,EAAG,CAAC,EAAG,GAAG,EAAGC,EAAY,EAAI,EAAGlD,GAAUiD,EAAM,CAAC,EAAG,CAAC,EAAG,GAAG,EAAGC,EAAY,EAAI,CAAC,CACtH,EACAlH,EAAe,UAAU,gBAAkB,SAAU2F,EAAawB,EAAO,CACvE,IAAI5G,EAAgB,KAAK,cACrB6G,EAAa,KAAK,YAClBC,EAAa,KAAK,eAAe,EACjCC,EAAa/G,EAAc,4BAA4B,EAAE,cAAc,EACvEgH,EAAgB,CAAC,EAAG,GAAG,EAC3BC,GAAWL,EAAOC,EAAYC,EAAY9G,EAAc,IAAI,UAAU,EAAI,MAAQoF,EAAa2B,EAAW,SAAW,KAAOtD,GAAUsD,EAAW,QAASC,EAAeF,EAAY,EAAI,EAAI,KAAMC,EAAW,SAAW,KAAOtD,GAAUsD,EAAW,QAASC,EAAeF,EAAY,EAAI,EAAI,IAAI,EACrS,IAAII,EAAY,KAAK,OACjBR,EAAQ,KAAK,OAASS,GAAI,CAAC1D,GAAUoD,EAAW,CAAC,EAAGC,EAAYE,EAAe,EAAI,EAAGvD,GAAUoD,EAAW,CAAC,EAAGC,EAAYE,EAAe,EAAI,CAAC,CAAC,EACpJ,MAAO,CAACE,GAAaA,EAAU,CAAC,IAAMR,EAAM,CAAC,GAAKQ,EAAU,CAAC,IAAMR,EAAM,CAAC,CAC5E,EACAjH,EAAe,UAAU,YAAc,SAAU2H,EAAa,CAC5D,IAAIC,EAAc,KAAK,cACnBR,EAAa,KAAK,YAClBS,EAAiBH,GAAIN,EAAW,MAAM,CAAC,EACvCjF,EAAO,KAAK,MAChBX,EAAK,CAAC,EAAG,CAAC,EAAG,SAAUmE,EAAa,CAElC,IAAImC,EAASF,EAAY,QAAQjC,CAAW,EACxCoC,EAAe,KAAK,cACxBD,EAAO,KAAK,CACV,OAAQC,EAAe,EACvB,OAAQA,EAAe,EAGvB,EAAGX,EAAWzB,CAAW,GAAKA,EAAc,GAAK,GACjD,EAAGxD,EAAK,CAAC,EAAI,EAAI4F,EAAe,CAClC,CAAC,CACH,EAAG,IAAI,EAEPH,EAAY,OAAO,SAAS,CAC1B,EAAGC,EAAe,CAAC,EACnB,EAAG,EACH,MAAOA,EAAe,CAAC,EAAIA,EAAe,CAAC,EAC3C,OAAQ1F,EAAK,CAAC,CAChB,CAAC,EACD,IAAI+E,EAAa,CACf,EAAGW,EAAe,CAAC,EACnB,MAAOA,EAAe,CAAC,EAAIA,EAAe,CAAC,CAC7C,EAEID,EAAY,aACdA,EAAY,WAAW,SAASV,CAAU,EAC1CU,EAAY,SAAS,SAASV,CAAU,EAExCU,EAAY,SAAS,gBAAgB,EACrCA,EAAY,gBAAkBA,EAAY,eAAe,KAAK,IAAKV,EAAW,EAAIA,EAAW,MAAQ,CAAC,GAKxG,QAFIc,EAAiBJ,EAAY,eAC7BK,EAAe,CAAC,EAAGJ,EAAe,CAAC,EAAGA,EAAe,CAAC,EAAG1F,EAAK,CAAC,CAAC,EAC3DsC,EAAI,EAAGA,EAAIuD,EAAe,OAAQvD,IAAK,CAC9C,IAAIyD,EAAWF,EAAevD,CAAC,EAC3B0D,EAAWD,EAAS,YAAY,EAC/BC,IACHA,EAAW,IAAY5I,GACvB2I,EAAS,YAAYC,CAAQ,GAE/BA,EAAS,SAAS,CAChB,EAAGF,EAAaxD,CAAC,EACjB,EAAG,EACH,MAAOwD,EAAaxD,EAAI,CAAC,EAAIwD,EAAaxD,CAAC,EAC3C,OAAQtC,EAAK,CAAC,CAChB,CAAC,CACH,CACA,KAAK,gBAAgBwF,CAAW,CAClC,EACA3H,EAAe,UAAU,gBAAkB,SAAU2H,EAAa,CAChE,IAAIpH,EAAgB,KAAK,cACrBqH,EAAc,KAAK,cACnBrC,EAAeqC,EAAY,aAC3B/F,EAAS,KAAK,QACduG,EAAa,CAAC,GAAI,EAAE,EAGxB,GAAI7H,EAAc,IAAI,YAAY,EAAG,CACnC,IAAI8H,EAAY9H,EAAc,4BAA4B,EAC1D,GAAI8H,EAAW,CACb,IAAIC,EAAOD,EAAU,aAAa,EAAE,KAChCpB,EAAQ,KAAK,OACbsB,EAAeZ,EAEjBU,EAAU,oBAAoB,CAC9B,MAAOpB,EAAM,CAAC,EACd,IAAKA,EAAM,CAAC,CACd,CAAC,EAAE,YAAcoB,EAAU,mBAAmB,EAC9CD,EAAa,CAAC,KAAK,aAAaG,EAAa,CAAC,EAAGD,CAAI,EAAG,KAAK,aAAaC,EAAa,CAAC,EAAGD,CAAI,CAAC,CAClG,CACF,CACA,IAAIE,EAAoBd,GAAI,KAAK,YAAY,MAAM,CAAC,EACpDe,EAAS,KAAK,KAAM,CAAC,EACrBA,EAAS,KAAK,KAAM,CAAC,EACrB,SAASA,EAAS9C,EAAa,CAI7B,IAAI+C,EAAuBC,GAAaf,EAAY,QAAQjC,CAAW,EAAE,OAAQ,KAAK,KAAK,EACvFiD,EAAoBC,GAAmBlD,IAAgB,EAAI,QAAU,OAAQ+C,CAAY,EACzFI,EAAS,KAAK,aAAe,EAAIjJ,IACjCkJ,EAAoBC,GAAe,CAACR,EAAkB7C,CAAW,GAAKA,IAAgB,EAAI,CAACmD,EAASA,GAAS,KAAK,MAAM,CAAC,EAAI,CAAC,EAAGJ,CAAY,EACjJnD,EAAaI,CAAW,EAAE,SAAS,CACjC,EAAGoD,EAAU,CAAC,EACd,EAAGA,EAAU,CAAC,EACd,cAAelH,IAAWlC,GAAa,SAAWiJ,EAClD,MAAO/G,IAAWlC,GAAaiJ,EAAY,SAC3C,KAAMR,EAAWzC,CAAW,CAC9B,CAAC,CACH,CACF,EACA3F,EAAe,UAAU,aAAe,SAAUiJ,EAAOX,EAAM,CAC7D,IAAI/H,EAAgB,KAAK,cACrB2I,EAAiB3I,EAAc,IAAI,gBAAgB,EACnD4I,EAAiB5I,EAAc,IAAI,gBAAgB,GACnD4I,GAAkB,MAAQA,IAAmB,UAC/CA,EAAiBb,EAAK,kBAAkB,GAE1C,IAAIc,EAAWH,GAAS,MAAQ,MAAMA,CAAK,EAAI,GAE7CX,EAAK,OAAS,YAAcA,EAAK,OAAS,OAASA,EAAK,MAAM,SAAS,CACvE,MAAO,KAAK,MAAMW,CAAK,CACzB,CAAC,EAECA,EAAM,QAAQ,KAAK,IAAIE,EAAgB,EAAE,CAAC,EAC5C,OAAOE,GAAWH,CAAc,EAAIA,EAAeD,EAAOG,CAAQ,EAAIE,GAASJ,CAAc,EAAIA,EAAe,QAAQ,UAAWE,CAAQ,EAAIA,CACjJ,EAIApJ,EAAe,UAAU,cAAgB,SAAUuJ,EAAY,CAC7D,IAAIhD,EAAc,KAAK,cAAc,IAAI,aAAa,GAAK,CAAC,EACxDiD,EAAajD,EAAY,MAAQ,GACjCkD,EAAsB,KAAK,cAAc,SAAS,CAAC,WAAY,aAAa,CAAC,EAC7EC,EAAeD,EAAoB,IAAI,MAAM,GAAK,GAElDE,EAASJ,GAAc,KAAK,UAAYG,EAAeF,EACvDnE,EAAe,KAAK,cACpBE,EAAeF,EAAa,aAChCE,EAAa,CAAC,EAAE,KAAK,YAAa,CAACoE,CAAM,EACzCpE,EAAa,CAAC,EAAE,KAAK,YAAa,CAACoE,CAAM,EAEzCtE,EAAa,YAAc,KAAK,IAAIsE,EAAS,gBAAkB,eAAe,EAAEtE,EAAa,WAAY,CAAC,CAC5G,EACArF,EAAe,UAAU,YAAc,SAAU2F,EAAaiE,EAAIC,EAAIC,EAAO,CAC3E,KAAK,UAAY,GAEPC,GAAKD,EAAM,KAAK,EAE1B,IAAIpB,EAAe,KAAK,cAAc,YAAY,kBAAkB,EAChEsB,EAAiBhB,GAAe,CAACY,EAAIC,CAAE,EAAGnB,EAAc,EAAI,EAC5DuB,EAAU,KAAK,gBAAgBtE,EAAaqE,EAAO,CAAC,CAAC,EACrDE,EAAW,KAAK,cAAc,IAAI,UAAU,EAChD,KAAK,YAAY,CAACA,CAAQ,EAG1BD,GAAWC,GAAY,KAAK,oBAAoB,EAAI,CACtD,EACAlK,EAAe,UAAU,WAAa,UAAY,CAChD,KAAK,UAAY,GACjB,KAAK,cAAc,EAAK,EAGxB,IAAIkK,EAAW,KAAK,cAAc,IAAI,UAAU,EAChD,CAACA,GAAY,KAAK,oBAAoB,EAAK,CAC7C,EACAlK,EAAe,UAAU,cAAgB,SAAUmK,EAAG,CACpD,IAAIhI,EAAO,KAAK,MACZiI,EAAa,KAAK,cAAc,YAAY,sBAAsBD,EAAE,QAASA,EAAE,OAAO,EAC1F,GAAI,EAAAC,EAAW,CAAC,EAAI,GAAKA,EAAW,CAAC,EAAIjI,EAAK,CAAC,GAAKiI,EAAW,CAAC,EAAI,GAAKA,EAAW,CAAC,EAAIjI,EAAK,CAAC,GAG/F,KAAIiF,EAAa,KAAK,YAClBiD,GAAUjD,EAAW,CAAC,EAAIA,EAAW,CAAC,GAAK,EAC3C6C,EAAU,KAAK,gBAAgB,MAAOG,EAAW,CAAC,EAAIC,CAAM,EAChE,KAAK,YAAY,EACjBJ,GAAW,KAAK,oBAAoB,EAAK,EAC3C,EACAjK,EAAe,UAAU,cAAgB,SAAUmK,EAAG,CACpD,IAAIG,EAAIH,EAAE,QACNI,EAAIJ,EAAE,QACV,KAAK,YAAc,IAAYK,GAAMF,EAAGC,CAAC,EACzC,KAAK,UAAY,GACjB,KAAK,gBAAkB,CAAC,IAAI,IAE9B,EACAvK,EAAe,UAAU,YAAc,SAAUmK,EAAG,CAClD,GAAK,KAAK,UAGV,KAAIM,EAAY,KAAK,cAAc,UAEnC,GADA,KAAK,UAAY,GACb,EAACA,EAGL,CAAAA,EAAU,KAAK,SAAU,EAAI,EAC7B,IAAIC,EAAaD,EAAU,MACvBE,EAAe,CAAC,IAAI,KAExB,GAAI,EAAAA,EAAe,KAAK,gBAAkB,KAAO,KAAK,IAAID,EAAW,KAAK,EAAI,GAI9E,KAAIrD,EAAa,KAAK,eAAe,EACjCE,EAAgB,CAAC,EAAG,GAAG,EACvBH,EAAa,KAAK,YAAc,CAACsD,EAAW,EAAGA,EAAW,EAAIA,EAAW,KAAK,EAC9EpD,EAAa,KAAK,cAAc,4BAA4B,EAAE,cAAc,EAEhFE,GAAW,EAAGJ,EAAYC,EAAY,EAAGC,EAAW,SAAW,KAAOtD,GAAUsD,EAAW,QAASC,EAAeF,EAAY,EAAI,EAAI,KAAMC,EAAW,SAAW,KAAOtD,GAAUsD,EAAW,QAASC,EAAeF,EAAY,EAAI,EAAI,IAAI,EAC/O,KAAK,OAASK,GAAI,CAAC1D,GAAUoD,EAAW,CAAC,EAAGC,EAAYE,EAAe,EAAI,EAAGvD,GAAUoD,EAAW,CAAC,EAAGC,EAAYE,EAAe,EAAI,CAAC,CAAC,EACxI,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAAK,IAChC,EACAvH,EAAe,UAAU,SAAW,SAAUmK,EAAG,CAC3C,KAAK,YAEGJ,GAAKI,EAAE,KAAK,EACtB,KAAK,iBAAiBA,EAAE,QAASA,EAAE,OAAO,EAE9C,EACAnK,EAAe,UAAU,iBAAmB,SAAU4K,EAAQC,EAAQ,CACpE,IAAIxF,EAAe,KAAK,cACpB9E,EAAgB,KAAK,cACrBkK,EAAYpF,EAAa,UACxBoF,IACHA,EAAYpF,EAAa,UAAY,IAAI/F,GAAK,CAC5C,OAAQ,GACR,MAAOiB,EAAc,SAAS,YAAY,EAAE,aAAa,CAC3D,CAAC,EACD8E,EAAa,YAAY,IAAIoF,CAAS,GAExCA,EAAU,KAAK,SAAU,EAAK,EAC9B,IAAIK,EAAa,KAAK,YAClB9I,EAAc,KAAK,cAAc,YACjC+I,EAAW/I,EAAY,sBAAsB4I,EAAQC,CAAM,EAC3DG,EAAahJ,EAAY,sBAAsB8I,EAAW,EAAGA,EAAW,CAAC,EACzE3I,EAAO,KAAK,MAChB4I,EAAS,CAAC,EAAI,KAAK,IAAI,KAAK,IAAI5I,EAAK,CAAC,EAAG4I,EAAS,CAAC,CAAC,EAAG,CAAC,EACxDN,EAAU,SAAS,CACjB,EAAGO,EAAW,CAAC,EACf,EAAG,EACH,MAAOD,EAAS,CAAC,EAAIC,EAAW,CAAC,EACjC,OAAQ7I,EAAK,CAAC,CAChB,CAAC,CACH,EAIAnC,EAAe,UAAU,oBAAsB,SAAUkK,EAAU,CACjE,IAAIjD,EAAQ,KAAK,OACjB,KAAK,IAAI,eAAe,CACtB,KAAM,WACN,KAAM,KAAK,IACX,WAAY,KAAK,cAAc,GAC/B,UAAWiD,EAAWnK,IAA4B,KAClD,MAAOkH,EAAM,CAAC,EACd,IAAKA,EAAM,CAAC,CACd,CAAC,CACH,EACAjH,EAAe,UAAU,eAAiB,UAAY,CAEpD,IAAIkC,EACA+I,EAAmBC,GAA8B,KAAK,aAAa,EAAE,SACzE,GAAI,CAAChJ,GAAQ+I,EAAiB,OAAQ,CACpC,IAAI9F,EAAW8F,EAAiB,CAAC,EAAE,MAAM,iBACzC/I,EAAOiD,EAAS,SAAWA,EAAS,QAAQ,CAC9C,CACA,GAAI,CAACjD,EAAM,CACT,IAAIiJ,EAAQ,KAAK,IAAI,SAAS,EAC1BC,EAAS,KAAK,IAAI,UAAU,EAChClJ,EAAO,CACL,EAAGiJ,EAAQ,GACX,EAAGC,EAAS,GACZ,MAAOD,EAAQ,GACf,OAAQC,EAAS,EACnB,CACF,CACA,OAAOlJ,CACT,EACAlC,EAAe,KAAO,kBACfA,CACT,GAAEqL,EAAY,EACd,SAASnG,IAAYE,EAAS,CAG5B,IAAIkG,EAAM,CACR,EAAG,IACH,EAAG,IACH,OAAQ,QACR,MAAO,QACT,EACA,OAAOA,EAAIlG,CAAO,CACpB,CACA,SAASY,IAAUnE,EAAQ,CACzB,OAAOA,IAAW,WAAa,YAAc,WAC/C,CACA,IAAO0J,IAAQvL,IChxBR,SAASwL,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAe,EAChDD,EAAU,sBAAsBE,GAAc,EAC9CC,GAAcH,CAAS,CACzB,CCJO,SAASI,GAAQC,EAAW,CACjCC,GAAIF,EAAqB,EACzBE,GAAIF,EAAqB,CAG3B,CCHA,IAAIG,IAAgB,CAIlB,IAAK,SAAUC,EAAYC,EAAKC,EAAY,CAC1C,IAAIC,EAAeC,IAAOC,IAAcL,CAAU,GAAK,CAAC,GAAGC,CAAG,CAAC,EAC/D,OAAOC,GAAoBI,EAAQH,CAAK,EAAIA,EAAMA,EAAM,OAAS,CAAC,EAAYA,CAChF,CACF,EACIE,IAAgB,CAClB,MAAO,CACL,OAAQ,CAAC,UAAW,SAAS,EAC7B,SAAU,CAACE,EAAO,MAAM,WAAW,CACrC,EACA,SAAU,CACR,OAAQ,CAAC,EAAG,GAAG,EACf,SAAU,CAAC,EAAG,CAAC,CACjB,EACA,gBAAiB,CACf,OAAQ,CAAC,GAAK,CAAC,EACf,SAAU,CAAC,EAAG,CAAC,CACjB,EACA,eAAgB,CACd,OAAQ,CAAC,GAAK,EAAG,EACjB,SAAU,CAAC,EAAG,CAAC,CACjB,EACA,WAAY,CACV,OAAQ,CAAC,GAAK,CAAC,EACf,SAAU,CAAC,EAAG,CAAC,CACjB,EACA,QAAS,CACP,OAAQ,CAAC,GAAK,CAAC,EACf,SAAU,CAAC,EAAG,CAAC,CACjB,EACA,OAAQ,CACN,OAAQ,CAAC,SAAU,YAAa,SAAS,EACzC,SAAU,CAAC,MAAM,CACnB,EACA,WAAY,CACV,OAAQ,CAAC,GAAI,EAAE,EACf,SAAU,CAAC,EAAG,CAAC,CACjB,CACF,EACOC,GAAQT,ICvCf,IAAIU,IAAYC,GAAc,UAC1BC,IAAaD,GAAc,WAC3BE,IAAiBA,EACjBC,IAAcA,EACdC,IAAiBA,GACjBC,IAAuBA,GACvBC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,UAAY,CAAC,UAAW,YAAY,EAC1CA,EAAM,qBAAuB,CAAC,UAAW,aAAc,SAAU,aAAc,OAAO,EACtFA,EAAM,WAAa,CACjB,KAAM,MACN,WAAY,EACd,EAIAA,EAAM,UAAY,CAAC,KAAW,GAAQ,EACtCA,EAAM,cAAgB,CAAC,EACvBA,EAAM,kBAAoB,CAAC,EACpBA,CACT,CACA,OAAAH,EAAe,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CACtE,KAAK,qBAAqBF,EAAQE,CAAO,CAC3C,EAIAN,EAAe,UAAU,cAAgB,SAAUO,EAAWC,EAAQ,CACpE,IAAIC,EAAa,KAAK,OACtB,CAACD,GAAyBE,GAAoBD,EAAYF,EAAW,KAAK,oBAAoB,EAC9F,KAAK,eAAiB,KAAK,SAAS,WAAW,EAC/C,KAAK,cAAc,EACnB,KAAK,qBAAqB,CAC5B,EAIAP,EAAe,UAAU,YAAc,SAAUW,EAAwB,CACvE,IAAIC,EAAY,KAAK,UACrBD,EAAgCE,GAAKF,EAAwB,IAAI,EACjE,KAAK,kBAAmCG,GAAqB,KAAK,OAAO,WAAYF,EAAWD,CAAsB,EACtH,KAAK,cAA+BG,GAAqB,KAAK,OAAO,OAAQF,EAAWD,CAAsB,CAChH,EAIAX,EAAe,UAAU,cAAgB,UAAY,CACnD,OAAO,IACT,EAIAA,EAAe,UAAU,uBAAyB,UAAY,CAC5D,IAAIe,EAAiB,KAAK,OAAO,SAC7BC,EAAoB,KAAK,OAAO,YAChCA,GAAqB,MAAQD,GAAkB,OACjDC,EAAoB,OAEtB,IAAIC,EAAyBC,GAAyB,KAAK,QAAS,SAAU,CAC5E,MAAOF,EACP,GAAID,CACN,EAAG,CACD,WAAY,GACZ,UAAW,GACX,WAAY,EACd,CAAC,EAAE,OACH,OAAcI,EAAIF,EAAc,SAAUG,EAAa,CACrD,OAAOA,EAAY,cACrB,CAAC,CACH,EAIApB,EAAe,UAAU,iBAAmB,SAAUqB,EAAUC,EAAS,CAChEzB,EAAK,KAAK,uBAAuB,EAAG,SAAU0B,EAAa,CAChE,IAAIH,EAAc,KAAK,QAAQ,iBAAiBG,CAAW,EACvDH,GACFC,EAAS,KAAKC,EAASF,CAAW,CAEtC,EAAG,IAAI,CACT,EAIApB,EAAe,UAAU,eAAiB,SAAUoB,EAAa,CAC/D,IAAII,EAAK,GACT,YAAK,iBAAiB,SAAUC,EAAO,CACrCA,IAAUL,IAAgBI,EAAK,GACjC,CAAC,EACMA,CACT,EAcAxB,EAAe,UAAU,gBAAkB,SAAU0B,EAAOC,EAAYC,EAAa,CACnF,IAAIxB,EAAS,KAAK,OACdyB,EAAYzB,EAAO,UACnB0B,EAAY,KAAK,UACjBC,EAAY3B,EAAO,UACnB4B,EACJJ,EAAcA,GAAe,CAAC,IAAK,GAAG,EAC3BhC,EAAQ8B,CAAK,IACtBA,EAAQA,EAAM,MAAM,EACpBM,EAAW,IAEb,IAAIC,EAAYN,EAAaD,EAC3BM,EAAW,CAACE,EAAQR,EAAM,CAAC,CAAC,EAAGQ,EAAQR,EAAM,CAAC,CAAC,CAAC,EAAIQ,EAAQR,CAAK,EACnE,GAAWS,GAASJ,CAAS,EAC3B,OAAOA,EAAU,QAAQ,UAAWC,EAAWC,EAAU,CAAC,EAAIA,CAAS,EAAE,QAAQ,WAAYD,EAAWC,EAAU,CAAC,EAAIA,CAAS,EAC3H,GAAWG,GAAWL,CAAS,EACpC,OAAOC,EAAWD,EAAUL,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAAIK,EAAUL,CAAK,EAEnE,GAAIM,EACF,OAAIN,EAAM,CAAC,IAAMI,EAAU,CAAC,EACnBF,EAAY,CAAC,EAAI,IAAMK,EAAU,CAAC,EAChCP,EAAM,CAAC,IAAMI,EAAU,CAAC,EAC1BF,EAAY,CAAC,EAAI,IAAMK,EAAU,CAAC,EAElCA,EAAU,CAAC,EAAI,MAAQA,EAAU,CAAC,EAI3C,OAAOA,EAET,SAASC,EAAQG,EAAK,CACpB,OAAOA,IAAQP,EAAU,CAAC,EAAI,MAAQO,IAAQP,EAAU,CAAC,EAAI,OAAS,CAACO,GAAK,QAAQ,KAAK,IAAIR,EAAW,EAAE,CAAC,CAC7G,CACF,EAIA7B,EAAe,UAAU,YAAc,UAAY,CACjD,IAAIS,EAAa,KAAK,OAIlB6B,EAASxC,IAAI,CAACW,EAAW,IAAKA,EAAW,GAAG,CAAC,EACjD,KAAK,YAAc6B,CACrB,EAqBAtC,EAAe,UAAU,sBAAwB,SAAUuC,EAAM,CAC/D,IAAIC,EAAS,KAAK,OAAO,UACzB,GAAIA,GAAU,KACZ,OAAOD,EAAK,kBAAkBC,CAAM,EAGtC,QADIC,EAAWF,EAAK,WACXG,EAAID,EAAS,OAAS,EAAGC,GAAK,EAAGA,IAAK,CAC7C,IAAIC,EAAUF,EAASC,CAAC,EACpBE,EAAUL,EAAK,iBAAiBI,CAAO,EAC3C,GAAI,CAACC,EAAQ,mBACX,OAAOA,EAAQ,aAEnB,CACF,EACA5C,EAAe,UAAU,UAAY,UAAY,CAC/C,OAAO,KAAK,YAAY,MAAM,CAChC,EACAA,EAAe,UAAU,qBAAuB,UAAY,CAC1D,IAAIM,EAAU,KAAK,QACfG,EAAa,KAAK,OAClBoC,EAAO,CACT,QAASpC,EAAW,QACpB,WAAYA,EAAW,UACzB,EACIqC,EAASrC,EAAW,SAAWA,EAAW,OAAS,CAAC,GACpDsC,EAAatC,EAAW,aAAeA,EAAW,WAAa,CAAC,GAC7DuC,GAAMF,EAAQD,CAAI,EAClBG,GAAMD,EAAYF,CAAI,EAC7B,IAAIlB,EAAa,KAAK,WAAW,EACjCsB,EAAe,KAAK,KAAMH,CAAM,EAChCG,EAAe,KAAK,KAAMF,CAAU,EACpCG,EAAiB,KAAK,KAAMJ,EAAQ,UAAW,YAAY,EAE3DK,EAAmB,KAAK,KAAMJ,CAAU,EACxC,SAASE,EAAeJ,EAAM,CAKxBjD,IAAQa,EAAW,KAAK,GAGzB,CAACoC,EAAK,UACPA,EAAK,QAAU,CACb,MAAOpC,EAAW,MAAM,MAAM,EAAE,QAAQ,CAC1C,GAQFoC,EAAK,QAAUA,EAAK,SAAW,CAC7B,MAAOvC,EAAQ,IAAI,eAAe,CACpC,CACF,CACA,SAAS4C,EAAiBL,EAAMO,EAAYC,EAAa,CACvD,IAAIC,EAAWT,EAAKO,CAAU,EAC1BG,EAAYV,EAAKQ,CAAW,EAC5BC,GAAY,CAACC,IACfA,EAAYV,EAAKQ,CAAW,EAAI,CAAC,EACjCxD,IAAKyD,EAAU,SAAUE,EAAYC,EAAY,CAC/C,GAAK/D,GAAc,YAAY+D,CAAU,EAGzC,KAAIC,EAAOC,GAAc,IAAIF,EAAY,WAAY9B,CAAU,EAC3D+B,GAAQ,OACVH,EAAUE,CAAU,EAAIC,EAIpBD,IAAe,SAAW,CAACF,EAAU,eAAe,SAAS,GAAK,CAACA,EAAU,eAAe,YAAY,IAC1GA,EAAU,QAAU,CAAC,EAAG,CAAC,IAG/B,CAAC,EAEL,CACA,SAASJ,EAAmBJ,EAAY,CACtC,IAAIa,GAAgBb,EAAW,SAAW,CAAC,GAAG,SAAWA,EAAW,YAAc,CAAC,GAAG,OAClFc,GAAoBd,EAAW,SAAW,CAAC,GAAG,aAAeA,EAAW,YAAc,CAAC,GAAG,WAC1Fe,EAAgB,KAAK,IAAI,eAAe,EACxCC,EAAa,KAAK,cAAc,EAChCC,EAAgBD,GAAc,YAClClE,IAAK,KAAK,UAAW,SAAUoE,EAAO,CACpC,IAAIC,EAAW,KAAK,SAChBC,EAAUpB,EAAWkB,CAAK,EAGzBE,IACHA,EAAUpB,EAAWkB,CAAK,EAAI,CAC5B,MAAOtC,EAAamC,EAAgB,CAACA,CAAa,CACpD,GAGEK,EAAQ,QAAU,OACpBA,EAAQ,OAASP,GAAuBQ,GAAMR,CAAY,IAAMjC,EAAaqC,EAAgB,CAACA,CAAa,IAEzGG,EAAQ,YAAc,OACxBA,EAAQ,WAAaN,GAA2BO,GAAMP,CAAgB,IAAMlC,EAAauC,EAAS,CAAC,EAAI,CAACA,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,IAGlIC,EAAQ,OAAS1E,IAAU0E,EAAQ,OAAQ,SAAUE,EAAQ,CAC3D,OAAOA,IAAW,OAASL,EAAgBK,CAC7C,CAAC,EAED,IAAIC,EAAaH,EAAQ,WACzB,GAAIG,GAAc,KAAM,CACtB,IAAIC,EAAQ,KAEZ5E,IAAW2E,EAAY,SAAU5C,EAAO,CACtCA,EAAQ6C,IAAUA,EAAQ7C,EAC5B,CAAC,EACDyC,EAAQ,WAAa1E,IAAU6E,EAAY,SAAU5C,EAAO,CAC1D,OAAO3B,IAAU2B,EAAO,CAAC,EAAG6C,CAAK,EAAG,CAAC,EAAGL,EAAS,CAAC,CAAC,EAAG,EAAI,CAC5D,CAAC,CACH,CACF,EAAG,IAAI,CACT,CACF,EACAlE,EAAe,UAAU,cAAgB,UAAY,CACnD,KAAK,SAAW,CAAC,WAAW,KAAK,IAAI,WAAW,CAAC,EAAG,WAAW,KAAK,IAAI,YAAY,CAAC,CAAC,CACxF,EACAA,EAAe,UAAU,WAAa,UAAY,CAChD,MAAO,CAAC,CAAC,KAAK,OAAO,UACvB,EAKAA,EAAe,UAAU,YAAc,SAAUwE,EAAU,CAAC,EAC5DxE,EAAe,UAAU,YAAc,UAAY,CACjD,OAAO,IACT,EAKAA,EAAe,UAAU,cAAgB,SAAU0B,EAAO,CACxD,OAAO,IACT,EAgBA1B,EAAe,UAAU,cAAgB,SAAUyE,EAAgB,CACjE,OAAO,IACT,EACAzE,EAAe,KAAO,YACtBA,EAAe,aAAe,CAAC,QAAQ,EACvCA,EAAe,cAAgB,CAC7B,KAAM,GAEN,EAAG,EAEH,IAAK,EACL,IAAK,IACL,KAAM,EACN,MAAO,KACP,IAAK,KACL,OAAQ,EACR,UAAW,KACX,WAAY,KACZ,QAAS,GACT,OAAQ,WACR,gBAAiB0E,EAAO,MAAM,YAC9B,YAAaA,EAAO,MAAM,WAC1B,aAAcA,EAAO,MAAM,MAAM,CAAC,EAClC,cAAeA,EAAO,MAAM,SAC5B,YAAa,EACb,QAASA,EAAO,KAAK,EAErB,QAAS,GACT,UAAW,EACX,UAAW,CACT,MAAOA,EAAO,MAAM,SACtB,CACF,EACO1E,CACT,GAAE2E,EAAc,EACTC,GAAQ5E,IC/Wf,IAAI6E,IAAoB,CAAC,GAAI,GAAG,EAC5BC,KAA+B,SAAUC,EAAQ,CACnDC,EAAUF,EAAiBC,CAAM,EACjC,SAASD,GAAkB,CACzB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAgB,KACtBG,CACT,CAIA,OAAAH,EAAgB,UAAU,cAAgB,SAAUI,EAAWC,EAAQ,CACrEJ,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EACpD,KAAK,YAAY,EACjB,KAAK,YAAY,SAAUK,EAAe,CACxCA,EAAc,cAAgB,SAC9BA,EAAc,WAAa,KAAK,UAAU,CAC5C,CAAC,EACD,KAAK,YAAY,CACnB,EAKAN,EAAgB,UAAU,cAAgB,UAAY,CACpDC,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EACpD,IAAIM,EAAW,KAAK,UACnBA,EAAS,CAAC,GAAK,MAAQ,MAAMA,EAAS,CAAC,CAAC,KAAOA,EAAS,CAAC,EAAIR,IAAkB,CAAC,IAChFQ,EAAS,CAAC,GAAK,MAAQ,MAAMA,EAAS,CAAC,CAAC,KAAOA,EAAS,CAAC,EAAIR,IAAkB,CAAC,EACnF,EAIAC,EAAgB,UAAU,YAAc,UAAY,CAClD,IAAIQ,EAAa,KAAK,UAAU,EAC5BC,EAAQ,KAAK,OAAO,MACpB,CAACA,GAASA,EAAM,MAGlBD,EAAW,KAAO,EAClB,KAAK,OAAO,MAAQA,GACJE,EAAQD,CAAK,IACzBA,EAAM,CAAC,EAAIA,EAAM,CAAC,GACpBA,EAAM,QAAQ,EAEhBA,EAAM,CAAC,EAAI,KAAK,IAAIA,EAAM,CAAC,EAAGD,EAAW,CAAC,CAAC,EAC3CC,EAAM,CAAC,EAAI,KAAK,IAAIA,EAAM,CAAC,EAAGD,EAAW,CAAC,CAAC,EAE/C,EAKAR,EAAgB,UAAU,qBAAuB,UAAY,CAC3DC,EAAO,UAAU,qBAAqB,MAAM,KAAM,SAAS,EACpDU,EAAK,KAAK,UAAW,SAAUC,EAAO,CAC3C,IAAIC,EAAa,KAAK,OAAO,WAAWD,CAAK,EAAE,WAC3CC,GAAcA,EAAW,CAAC,IAAMA,EAAW,CAAC,IAC9CA,EAAW,CAAC,EAAIA,EAAW,CAAC,EAAI,EAEpC,EAAG,IAAI,CACT,EAIAb,EAAgB,UAAU,YAAc,SAAUc,EAAU,CAC1D,KAAK,OAAO,MAAQA,EAAS,MAAM,EACnC,KAAK,YAAY,CACnB,EAIAd,EAAgB,UAAU,YAAc,UAAY,CAClD,IAAIQ,EAAa,KAAK,UAAU,EAC5BO,EAA0BC,IAAK,KAAK,IAAI,OAAO,GAAK,CAAC,GAAG,MAAM,CAAC,EAEnE,OAAAD,EAAa,CAAC,EAAIP,EAAW,CAAC,IAAMO,EAAa,CAAC,EAAIP,EAAW,CAAC,GAClEO,EAAa,CAAC,EAAIP,EAAW,CAAC,IAAMO,EAAa,CAAC,EAAIP,EAAW,CAAC,GAClEO,EAAa,CAAC,EAAIP,EAAW,CAAC,IAAMO,EAAa,CAAC,EAAIP,EAAW,CAAC,GAClEO,EAAa,CAAC,EAAIP,EAAW,CAAC,IAAMO,EAAa,CAAC,EAAIP,EAAW,CAAC,GAC3DO,CACT,EAIAf,EAAgB,UAAU,cAAgB,SAAUiB,EAAO,CACzD,IAAIR,EAAQ,KAAK,OAAO,MACpBD,EAAa,KAAK,UAAU,EAC5BU,EAAwBC,GAAU,KAAK,OAAO,eAAgB,EAAI,EACtE,OAAQD,GAAkBT,EAAM,CAAC,GAAKD,EAAW,CAAC,GAAKC,EAAM,CAAC,GAAKQ,KAAWC,GAAkBT,EAAM,CAAC,GAAKD,EAAW,CAAC,GAAKS,GAASR,EAAM,CAAC,GAAK,UAAY,YAChK,EACAT,EAAgB,UAAU,sBAAwB,SAAUS,EAAO,CACjE,IAAIW,EAAS,CAAC,EACd,YAAK,iBAAiB,SAAUC,EAAa,CAC3C,IAAIC,EAAc,CAAC,EACfC,EAAOF,EAAY,QAAQ,EAC/BE,EAAK,KAAK,KAAK,sBAAsBA,CAAI,EAAG,SAAUN,EAAOO,EAAW,CACtEf,EAAM,CAAC,GAAKQ,GAASA,GAASR,EAAM,CAAC,GAAKa,EAAY,KAAKE,CAAS,CACtE,EAAG,IAAI,EACPJ,EAAO,KAAK,CACV,SAAUC,EAAY,GACtB,UAAWC,CACb,CAAC,CACH,EAAG,IAAI,EACAF,CACT,EAIApB,EAAgB,UAAU,cAAgB,SAAUyB,EAAgB,CAClE,IAAIC,EAAQC,IAAmB,KAAM,aAAc,KAAK,UAAU,CAAC,EAC/DC,EAAQD,IAAmB,KAAM,UAAW,KAAK,OAAO,MAAM,MAAM,CAAC,EACrEE,EAAQ,CAAC,EACb,SAASC,EAAQb,EAAOc,EAAY,CAClCF,EAAM,KAAK,CACT,MAAOZ,EACP,MAAOQ,EAAeR,EAAOc,CAAU,CACzC,CAAC,CACH,CAMA,QAJIC,EAAO,EACPC,EAAO,EACPC,EAAON,EAAM,OACbO,EAAOT,EAAM,OACVO,EAAOE,IAAS,CAACP,EAAM,QAAUF,EAAMO,CAAI,GAAKL,EAAM,CAAC,GAAIK,IAE5DP,EAAMO,CAAI,EAAIL,EAAMI,CAAI,GAC1BF,EAAQJ,EAAMO,CAAI,EAAG,YAAY,EAGrC,QAASG,EAAQ,EAAGJ,EAAOE,EAAMF,IAAQI,EAAQ,EAG/CA,GAASP,EAAM,QAAUC,EAAQF,EAAMI,CAAI,EAAG,YAAY,EAC1DF,EAAQF,EAAMI,CAAI,EAAG,SAAS,EAEhC,QAASI,EAAQ,EAAGH,EAAOE,EAAMF,KAC3B,CAACL,EAAM,QAAUA,EAAMA,EAAM,OAAS,CAAC,EAAIF,EAAMO,CAAI,KAEnDG,IACFP,EAAM,QAAUC,EAAQD,EAAMA,EAAM,OAAS,CAAC,EAAE,MAAO,YAAY,EACnEO,EAAQ,GAEVN,EAAQJ,EAAMO,CAAI,EAAG,YAAY,GAGrC,IAAII,EAAWR,EAAM,OACrB,MAAO,CACL,MAAOA,EACP,YAAa,CAACQ,EAAWR,EAAM,CAAC,EAAE,MAAQ,cAAeQ,EAAWR,EAAMQ,EAAW,CAAC,EAAE,MAAQ,aAAa,CAC/G,CACF,EACArC,EAAgB,KAAO,uBACvBA,EAAgB,cAAgBsC,GAAqBC,GAAe,cAAe,CACjF,MAAO,OACP,WAAY,GACZ,UAAW,GACX,SAAU,GACV,WAAY,6HACZ,WAAY,OACZ,YAAa,CACX,YAAaC,EAAO,MAAM,UAC1B,YAAa,CACf,EACA,cAAe,SACf,cAAe,MACf,eAAgB,CACd,YAAaA,EAAO,MAAM,UAC1B,YAAa,EACb,WAAY,EACZ,cAAe,EACf,cAAe,EACf,YAAaA,EAAO,MAAM,MAC5B,CASF,CAAC,EACMxC,CACT,GAAEuC,EAAc,EAChB,SAASZ,IAAmBc,EAAgBV,EAAYvB,EAAY,CAClE,GAAIA,EAAW,CAAC,IAAMA,EAAW,CAAC,EAChC,OAAOA,EAAW,MAAM,EAU1B,QAJIkC,EAAQ,IACRC,GAAQnC,EAAW,CAAC,EAAIA,EAAW,CAAC,GAAKkC,EACzCzB,EAAQT,EAAW,CAAC,EACpBoC,EAAa,CAAC,EACTC,EAAI,EAAGA,GAAKH,GAASzB,EAAQT,EAAW,CAAC,EAAGqC,IACnDD,EAAW,KAAK3B,CAAK,EACrBA,GAAS0B,EAEX,OAAAC,EAAW,KAAKpC,EAAW,CAAC,CAAC,EACtBoC,CACT,CACA,IAAOE,IAAQ9C,IC5Mf,IAAI+C,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KAC3BG,EAAM,mBAAqB,CACzB,KAAM,EACN,MAAO,EACP,IAAK,EACL,OAAQ,CACV,EACOA,CACT,CACA,OAAAH,EAAc,UAAU,KAAO,SAAUI,EAASC,EAAK,CACrD,KAAK,QAAUD,EACf,KAAK,IAAMC,CACb,EAIAL,EAAc,UAAU,OAAS,SAAUM,EAAgBF,EAASC,EAAKE,EACvE,CAEA,GADA,KAAK,eAAiBD,EAClBA,EAAe,IAAI,MAAM,IAAM,GAAO,CACxC,KAAK,MAAM,UAAU,EACrB,MACF,CACA,KAAK,SAASA,EAAgBF,EAASC,EAAKE,CAAO,CACrD,EAIAP,EAAc,UAAU,iBAAmB,SAAUQ,EAAO,CAC1D,IAAIF,EAAiB,KAAK,eACtBG,EAAqBC,GAAkBJ,EAAe,IAAI,SAAS,GAAK,CAAC,EACzEK,EAAOH,EAAM,gBAAgB,EACjCA,EAAM,IAAI,IAAII,GAAK,CACjB,GAAI,GACJ,OAAQ,GACR,MAAO,CACL,EAAGD,EAAK,EAAIF,EAAQ,CAAC,EACrB,EAAGE,EAAK,EAAIF,EAAQ,CAAC,EACrB,MAAOE,EAAK,MAAQF,EAAQ,CAAC,EAAIA,EAAQ,CAAC,EAC1C,OAAQE,EAAK,OAASF,EAAQ,CAAC,EAAIA,EAAQ,CAAC,CAC9C,EACA,MAAO,CACL,KAAMH,EAAe,IAAI,iBAAiB,EAC1C,OAAQA,EAAe,IAAI,aAAa,EACxC,UAAWA,EAAe,IAAI,aAAa,CAC7C,CACF,CAAC,CAAC,CACJ,EAUAN,EAAc,UAAU,oBAAsB,SAAUa,EAAaC,EAAeC,EAAM,CACxFA,EAAOA,GAAQ,CAAC,EAChB,IAAIC,EAAaD,EAAK,WAClBT,EAAiB,KAAK,eACtBW,EAAY,CAAC,EAEjB,GAAIH,IAAkB,QAAS,CAC7B,IAAII,EAAeZ,EAAe,IAAI,cAAc,EACpDW,EAAU,MAAQC,CACpB,CACA,SAASC,EAAOC,EAAK,CACnB,OAAOH,EAAUG,CAAG,CACtB,CACA,SAASC,EAAOD,EAAKE,EAAO,CAC1BL,EAAUG,CAAG,EAAIE,CACnB,CACA,IAAIC,EAAWjB,EAAe,kBAAkBU,GAAcV,EAAe,cAAcO,CAAW,CAAC,EACnGW,EAAcC,GAAc,mBAAmBF,CAAQ,EAC3D,OAAOG,EAAKF,EAAa,SAAUG,EAAM,CACvC,IAAIC,EAAgBL,EAASI,CAAI,EAC7BZ,EAAK,uBAAyBY,IAAS,YACzCA,EAAO,aACPC,EAAgBL,EAAS,mBAEvBE,GAAc,UAAUE,EAAMb,CAAa,GAC7Cc,GAAiBA,EAAc,YAAYf,EAAaM,EAAQE,CAAM,CAE1E,CAAC,EACMJ,EAAUH,CAAa,CAChC,EACAd,EAAc,UAAU,cAAgB,SAAUQ,EAAO,CACvD,IAAIqB,EAAQ,KAAK,eACbxB,EAAM,KAAK,IACXyB,EAAsBC,GAAyBF,EAAOxB,CAAG,EAAE,aACxD2B,GAAgBxB,EAAOqB,EAAM,mBAAmB,EAAGC,CAAY,CACxE,EACA9B,EAAc,UAAU,SAAW,SAAUM,EAAgBF,EAASC,EAAKE,EAAS,CAAC,EACrFP,EAAc,KAAO,YACdA,CACT,GAAEiC,EAAa,EACRC,GAAQlC,IC1Gf,IAAImC,IAAY,CAAC,CAAC,OAAQ,QAAS,OAAO,EAAG,CAAC,MAAO,SAAU,QAAQ,CAAC,EAOjE,SAASC,GAAaC,EAAgBC,EAAKC,EAAU,CAC1D,IAAIC,EAAcH,EAAe,OAC7BI,EAAYD,EAAY,MAC5B,GAAIC,GAAa,MAAQA,IAAc,OACrC,OAAOA,EAWT,QARIC,EAAS,CACX,MAAOJ,EAAI,SAAS,EACpB,OAAQA,EAAI,UAAU,CACxB,EACIK,EAAYH,EAAY,SAAW,aAAe,EAAI,EACtDI,EAAQT,IAAUQ,CAAS,EAC3BE,EAAY,CAAC,EAAG,KAAM,EAAE,EACxBC,EAAc,CAAC,EACVC,EAAI,EAAGA,EAAI,EAAGA,IACrBD,EAAYX,IAAU,EAAIQ,CAAS,EAAEI,CAAC,CAAC,EAAIF,EAAUE,CAAC,EACtDD,EAAYF,EAAMG,CAAC,CAAC,EAAIA,IAAM,EAAIR,EAAS,CAAC,EAAIC,EAAYI,EAAMG,CAAC,CAAC,EAEtE,IAAIC,EAAS,CAAC,CAAC,IAAK,QAAS,CAAC,EAAG,CAAC,IAAK,SAAU,CAAC,CAAC,EAAEL,CAAS,EAC1DM,EAAOC,GAAcJ,EAAaJ,EAAQF,EAAY,OAAO,EACjE,OAAOI,GAAOK,EAAK,OAAOD,EAAO,CAAC,CAAC,GAAK,GAAKC,EAAKD,EAAO,CAAC,CAAC,EAAIC,EAAKD,EAAO,CAAC,CAAC,EAAI,GAAMN,EAAOM,EAAO,CAAC,CAAC,EAAI,GAAM,EAAI,CAAC,CACxH,CAMO,SAASG,GAAkBC,EAAOf,EAAgB,CACvD,OAAOgB,EAAKD,GAAS,CAAC,EAAG,SAAUE,EAAW,CACxCA,EAAU,WAAa,OACzBA,EAAU,gBAAkBA,EAAU,UACtCA,EAAU,UAAY,MAExBA,EAAU,aAAe,aAAejB,EAAiBA,EAAe,eAAiB,GAC3F,CAAC,EACMe,CACT,CC7BA,IAAIG,GAAuBA,GACvBC,IAAcA,EACdC,IAAU,KAAK,IACfC,GAAU,KAAK,IAEfC,IAAkB,GAClBC,IAAiB,EAQjBC,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,QAAU,CAAC,EACjBA,EAAM,cAAgB,CAAC,EACvBA,EAAM,YAAc,CAAC,EACrBA,EAAM,sBAAwB,CAAC,EACxBA,CACT,CACA,OAAAH,EAAe,UAAU,KAAO,SAAUI,EAASC,EAAK,CACtDJ,EAAO,UAAU,KAAK,KAAK,KAAMG,EAASC,CAAG,EAC7C,KAAK,8BAAuCC,GAAK,KAAK,8BAA+B,IAAI,EACzF,KAAK,eAAwBA,GAAK,KAAK,eAAgB,IAAI,CAC7D,EACAN,EAAe,UAAU,SAAW,SAAUO,EAAgBH,EAASC,EAAKG,EAAS,EAC/E,CAACA,GAAWA,EAAQ,OAAS,mBAAqBA,EAAQ,OAAS,KAAK,MAC1E,KAAK,WAAW,CAEpB,EACAR,EAAe,UAAU,WAAa,UAAY,CAChD,KAAK,MAAM,UAAU,EACrB,IAAIO,EAAiB,KAAK,eACtBE,EAAY,KAAK,MACrB,KAAK,QAAUF,EAAe,IAAI,QAAQ,EAC1C,KAAK,WAAaA,EAAe,IAAI,YAAY,EACjD,KAAK,eAAe,EACpB,KAAK,WAAWE,CAAS,EACzB,IAAIC,EAAgBH,EAAe,IAAI,MAAM,EAC7C,KAAK,gBAAgBE,EAAWC,EAAe,CAAC,EAChD,KAAK,gBAAgBD,EAAWC,EAAe,CAAC,EAEhD,KAAK,YAAY,EAAI,EAGrB,KAAK,iBAAiBD,CAAS,EAE/B,KAAK,YAAY,EACjB,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,cAAcA,CAAS,CAC9B,EACAT,EAAe,UAAU,gBAAkB,SAAUW,EAAOD,EAAeE,EAAW,CACpF,GAAKF,EAIL,KAAIG,EAAOH,EAAc,EAAIE,CAAS,EACtCC,EAAOA,GAAQ,KAAOA,EAAO,GAAK,GAClC,IAAIN,EAAiB,KAAK,eACtBO,EAAUP,EAAe,IAAI,SAAS,EACtCQ,EAAWR,EAAe,SAC1BS,EAAW,KAAK,QAAQ,UACxBC,EAAW,KAAK,gBAAgB,CAACF,EAAS,CAAC,EAAI,EAAGH,IAAc,EAAI,CAACE,EAAUC,EAAS,CAAC,EAAID,CAAO,EAAGE,CAAQ,EAC/GE,EAAQ,KAAK,gBAAgBN,IAAc,EAAI,SAAW,MAAOI,CAAQ,EACzEG,EAAS,KAAK,QACdC,EAAiB,KAAK,eAAe,eACzC,KAAK,MAAM,IAAI,IAAYC,GAAK,CAC9B,MAAOC,GAAgBF,EAAgB,CACrC,EAAGH,EAAS,CAAC,EACb,EAAGA,EAAS,CAAC,EACb,cAAeG,EAAe,IAAI,eAAe,IAAMD,IAAW,aAAe,SAAWD,GAC5F,MAAOE,EAAe,IAAI,OAAO,IAAMD,IAAW,aAAeD,EAAQ,UACzE,KAAML,CACR,CAAC,CACH,CAAC,CAAC,EACJ,EACAb,EAAe,UAAU,WAAa,SAAUuB,EAAa,CAC3D,IAAIhB,EAAiB,KAAK,eACtBiB,EAAS,KAAK,QACdT,EAAWR,EAAe,SAC1BY,EAAS,KAAK,QACdM,EAAY,KAAK,WACjBC,EAAmBC,GAAapB,EAAgB,KAAK,IAAKQ,CAAQ,EAClEa,EAAYJ,EAAO,UAAY,KAAK,gBAAgBE,CAAS,EAC7DG,EAAmB,IAAYC,GACnCF,EAAU,IAAIC,CAAgB,EAE9BA,EAAiB,IAAIL,EAAO,WAAaO,IAAc,CAAC,EACxDF,EAAiB,IAAIL,EAAO,QAAUO,IAAc,KAAMN,EAAYO,IAAU,KAAK,OAAO,EAAI,KAAa1B,GAAK,KAAK,YAAa,KAAM,MAAO,EAAK,EAAUA,GAAK,KAAK,YAAa,KAAM,MAAO,EAAI,CAAC,CAAC,EAE1MuB,EAAiB,YAAY,IAAYI,GAAK,CAC5C,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAOlB,EAAS,CAAC,EACjB,OAAQA,EAAS,CAAC,EAClB,EAAG,CACL,CACF,CAAC,CAAC,EACF,IAAImB,EAAW3B,EAAe,eAAe,YAAY,QAAG,EACxD4B,EAAWtC,GAAQqC,EAAS,MAAOA,EAAS,MAAM,EAElDT,IACFD,EAAO,aAAe,CAAC,EACvBA,EAAO,aAAe,CAAC,EACvBA,EAAO,kBAAoB,CAAC,EAC5B,KAAK,cAAcjB,EAAgBqB,EAAW,EAAGb,EAAUoB,EAAUhB,CAAM,EAC3E,KAAK,cAAcZ,EAAgBqB,EAAW,EAAGb,EAAUoB,EAAUhB,CAAM,GAE7E,KAAK,iBAAiBZ,EAAgBqB,EAAWb,EAAUoB,EAAUhB,CAAM,EAC3EI,EAAY,IAAIK,CAAS,CAC3B,EACA5B,EAAe,UAAU,cAAgB,SAAUO,EAAgBqB,EAAWQ,EAAarB,EAAUoB,EAAUhB,EAAQ,CACrH,IAAIkB,EAAiB/B,GAAK,KAAK,YAAa,KAAM8B,EAAa,EAAK,EAChEE,EAAmBhC,GAAK,KAAK,YAAa,KAAM8B,EAAa,EAAI,EACjEG,EAAaC,GAAajC,EAAe,IAAI,YAAY,EAAGQ,EAAS,CAAC,CAAC,EACvE0B,EAAcC,GAAanC,EAAe,IAAI,YAAY,EAAG,CAACgC,EAAa,EAAG,CAACA,EAAa,EAAGA,EAAYA,EAAY,KAAM,EAAI,EACjII,EAASX,IAAU,KAAK,OAAO,EACnCS,EAAY,KAAK,CACf,OAAQE,EACR,UAAW,GACX,MAAON,EACP,UAAWC,EACX,YAAa,SAAUM,EAAG,CACdC,GAAKD,EAAE,KAAK,CACxB,CACF,CAAC,EACDH,EAAY,EAAI1B,EAAS,CAAC,EAAI,EAC9B0B,EAAY,SAASlC,EAAe,SAAS,aAAa,EAAE,aAAa,CAAC,EAC1EkC,EAAY,SAAS,CACnB,cAAe,GACf,YAAa,EACf,CAAC,EACDA,EAAY,MAAM,WAAa,EAC/BA,EAAY,YAAY,UAAU,EAAE,MAAQlC,EAAe,SAAS,CAAC,WAAY,aAAa,CAAC,EAAE,aAAa,EAC9GuC,GAAwBL,EAAa,EAAI,EACzCb,EAAU,IAAIa,CAAW,EAKzB,IAAIrB,EAAiB,KAAK,eAAe,eACrC2B,EAAc,IAAY1B,GAAK,CACjC,OAAQsB,EACR,UAAW,GACX,MAAON,EACP,YAAa,SAAUO,EAAG,CAEdC,GAAKD,EAAE,KAAK,CACxB,EACA,UAAWN,EACX,MAAOhB,GAAgBF,EAAgB,CACrC,EAAG,EACH,EAAG,EACH,KAAM,EACR,CAAC,CACH,CAAC,EACD2B,EAAY,YAAY,MAAM,EAAE,MAAQ,CACtC,QAAS,EACX,EACAA,EAAY,gBAAkB,CAC5B,SAAU,GACZ,EACA,KAAK,MAAM,IAAIA,CAAW,EAC1B,IAAIC,EAAmB,CAACT,EAAY,CAAC,EACjCf,EAAS,KAAK,QAClBA,EAAO,aAAaY,CAAW,EAAIK,EACnCjB,EAAO,kBAAkBY,CAAW,EAAIY,EACxCxB,EAAO,aAAaY,CAAW,EAAIW,CACrC,EACA/C,EAAe,UAAU,iBAAmB,SAAUO,EAAgBqB,EAAWb,EAAUoB,EAAUhB,EAAQ,CAC3G,IAAI8B,EAAQT,GAAajC,EAAe,IAAI,eAAe,EAAGQ,EAAS,CAAC,CAAC,EACrEmC,EAAYR,GAAanC,EAAe,IAAI,eAAe,EAAG,CAAC0C,EAAQ,EAAG,CAACA,EAAQ,EAAGA,EAAOA,EAAO,KAAM,EAAI,EAClHC,EAAU,KAAK,CACb,OAAQ,OACR,UAAW,GACX,OAAQ,GACR,EAAGnC,EAAS,CAAC,EAAI,CACnB,CAAC,EACD,IAAIoC,EAAiB5C,EAAe,SAAS,gBAAgB,EAAE,aAAa,EAC5E,GAAI2C,aAAqBE,GAAS,CAChC,IAAIC,EAAYH,EAAU,MAC1BA,EAAU,SAAgBI,EAAO,CAE/B,MAAOD,EAAU,MACjB,EAAGA,EAAU,EACb,EAAGA,EAAU,EACb,MAAOA,EAAU,MACjB,OAAQA,EAAU,MACpB,EAAGF,CAAc,CAAC,CACpB,MACED,EAAU,SAASC,CAAc,EAEnCvB,EAAU,IAAIsB,CAAS,EACvB,IAAI9B,EAAiB,KAAK,eAAe,eACrCmC,EAAiB,IAAYlC,GAAK,CACpC,OAAQ,GACR,UAAW,GACX,MAAOC,GAAgBF,EAAgB,CACrC,EAAG,EACH,EAAG,EACH,KAAM,EACR,CAAC,CACH,CAAC,EACD,KAAK,MAAM,IAAImC,CAAc,EAC7B,IAAIC,EAAsB,EAAErC,IAAW,aAAegB,EAAW,EAAIpC,KAAkBgB,EAAS,CAAC,EAAI,EAAG,CAAC,EACrGS,EAAS,KAAK,QAClBA,EAAO,UAAY0B,EACnB1B,EAAO,eAAiB+B,EACxB/B,EAAO,oBAAsBgC,EAC7B,KAAK,oBAAsB,EAC7B,EACAxD,EAAe,UAAU,YAAc,SAAUoC,EAAaqB,EAE9DC,EAAIC,EAAI,CACN,GAAK,KAAK,WAIV,IADA,KAAK,UAAY,CAACF,EACd,CAACA,EAAO,CAEV,IAAIG,EAAS,KAAK,gBAAgB,CAACF,EAAIC,CAAE,EAAG,KAAK,QAAQ,UAAW,EAAI,EACxE,KAAK,gBAAgBvB,EAAawB,EAAO,CAAC,CAAC,EAC3C,KAAK,eAAe,EAGpB,KAAK,YAAY,CACnB,CAEIH,IAAU,CAAC,KAAK,eAAe,IAAI,UAAU,GAE/C,KAAK,IAAI,eAAe,CACtB,KAAM,kBACN,KAAM,KAAK,IACX,YAAa,KAAK,eAAe,GACjC,SAAU,KAAK,cAAc,MAAM,CACrC,CAAC,EAECA,EACF,CAAC,KAAK,WAAa,KAAK,wBAAwB,EACvCI,IAAqB,KAAK,cAAc,GACjD,KAAK,qBAAqB,KAAK,YAAYzB,CAAW,EAAG,EAAK,EAElE,EACApC,EAAe,UAAU,eAAiB,UAAY,CACpD,IAAIO,EAAiB,KAAK,eACtBuD,EAAe,KAAK,cAAgBvD,EAAe,YAAY,EAC/DwD,EAAaxD,EAAe,UAAU,EACtCyD,EAAa,CAAC,EAAGzD,EAAe,SAAS,CAAC,CAAC,EAC/C,KAAK,YAAc,CAACb,GAAUoE,EAAa,CAAC,EAAGC,EAAYC,EAAY,EAAI,EAAGtE,GAAUoE,EAAa,CAAC,EAAGC,EAAYC,EAAY,EAAI,CAAC,CACxI,EAOAhE,EAAe,UAAU,gBAAkB,SAAUoC,EAAa6B,EAAO,CACvEA,EAAQA,GAAS,EACjB,IAAI1D,EAAiB,KAAK,eACtB2D,EAAa,KAAK,YAClBF,EAAa,CAAC,EAAGzD,EAAe,SAAS,CAAC,CAAC,EAC/C4D,GAAWF,EAAOC,EAAYF,EAAY5B,EAE1C,CAAC,EACD,IAAI2B,EAAaxD,EAAe,UAAU,EAE1C,KAAK,cAAgB,CAACb,GAAUwE,EAAW,CAAC,EAAGF,EAAYD,EAAY,EAAI,EAAGrE,GAAUwE,EAAW,CAAC,EAAGF,EAAYD,EAAY,EAAI,CAAC,CACtI,EACA/D,EAAe,UAAU,YAAc,SAAUoE,EAAW,CAC1D,IAAI7D,EAAiB,KAAK,eACtBwD,EAAaxD,EAAe,UAAU,EACtCiB,EAAS,KAAK,QACd6C,EAAuB,CAAC,EAAG9D,EAAe,SAAS,CAAC,CAAC,EACrD+D,EAAoBF,EAAYC,EAAuB,KAAK,YAC5DE,EAAgB,KAAK,iBAAiB,KAAK,cAAeR,EAAYO,EAAmB,SAAS,EAClGE,EAAmB,KAAK,iBAAiBT,EAAYA,EAAYM,EAAsB,YAAY,EACvG7C,EAAO,QAAQ,SAAS,CACtB,KAAM+C,EAAc,QAEtB,CAAC,EAAE,SAAS,SAAUA,EAAc,SAAS,EAC7C/C,EAAO,WAAW,SAAS,CACzB,KAAMgD,EAAiB,QAEzB,CAAC,EAAE,SAAS,SAAUA,EAAiB,SAAS,EAChD,KAAK,cAAcF,EAAmBC,CAAa,CACrD,EACAvE,EAAe,UAAU,iBAAmB,SAAU8D,EAAcC,EAAYG,EAAYO,EAAY,CACtG,IAAIC,EAAO,CACT,WAAYD,EACZ,sBAAuB,EACzB,EACIE,EAAa,KAAK,mBAAmBb,EAAcY,CAAI,EACvDE,EAAc,CAAC,KAAK,oBAAoBd,EAAa,CAAC,EAAG,aAAcY,CAAI,EAAG,KAAK,oBAAoBZ,EAAa,CAAC,EAAG,aAAcY,CAAI,CAAC,EAC3IG,EAAY,KAAK,iBAAiBX,EAAYU,CAAW,EAC7D,MAAO,CACL,SAAU,IAAIE,GAAe,EAAG,EAAG,EAAG,EAAGH,CAAU,EACnD,UAAWE,EACX,aAAc,CAACF,EAAW,CAAC,EAAE,MAAOA,EAAWA,EAAW,OAAS,CAAC,EAAE,KAAK,CAC7E,CACF,EACA3E,EAAe,UAAU,mBAAqB,SAAU8D,EAAcY,EAAM,CAI1E,IAAIK,EAAe,IACfJ,EAAa,CAAC,EACdK,GAAQlB,EAAa,CAAC,EAAIA,EAAa,CAAC,GAAKiB,EACjDJ,EAAW,KAAK,CACd,MAAO,KAAK,oBAAoBb,EAAa,CAAC,EAAG,QAASY,CAAI,EAC9D,OAAQ,CACV,CAAC,EACD,QAASO,EAAI,EAAGA,EAAIF,EAAcE,IAAK,CACrC,IAAIC,EAAYpB,EAAa,CAAC,EAAIkB,EAAOC,EACzC,GAAIC,EAAYpB,EAAa,CAAC,EAC5B,MAEFa,EAAW,KAAK,CACd,MAAO,KAAK,oBAAoBO,EAAW,QAASR,CAAI,EACxD,OAAQO,EAAIF,CACd,CAAC,CACH,CACA,OAAAJ,EAAW,KAAK,CACd,MAAO,KAAK,oBAAoBb,EAAa,CAAC,EAAG,QAASY,CAAI,EAC9D,OAAQ,CACV,CAAC,EACMC,CACT,EACA3E,EAAe,UAAU,iBAAmB,SAAUkE,EAAYU,EAAa,CAC7E,IAAI7D,EAAW,KAAK,eAAe,SACnC,MAAO,CAAC,CAACA,EAAS,CAAC,EAAI6D,EAAY,CAAC,EAAGV,EAAW,CAAC,CAAC,EAAG,CAACnD,EAAS,CAAC,EAAGmD,EAAW,CAAC,CAAC,EAAG,CAACnD,EAAS,CAAC,EAAGmD,EAAW,CAAC,CAAC,EAAG,CAACnD,EAAS,CAAC,EAAI6D,EAAY,CAAC,EAAGV,EAAW,CAAC,CAAC,CAAC,CAClK,EACAlE,EAAe,UAAU,gBAAkB,SAAU0B,EAAW,CAC9D,IAAIP,EAAS,KAAK,QACdgE,EAAU,KAAK,eAAe,IAAI,SAAS,EAC/C,OAAO,IAAYrD,GAAMX,IAAW,cAAgB,CAACgE,EAAU,CAC7D,OAAQzD,IAAc,SAAW,EAAI,GACrC,SAAU,KAAK,GAAK,CACtB,EAAIP,IAAW,cAAgBgE,EAAU,CACvC,OAAQzD,IAAc,SAAW,GAAK,EACtC,SAAU,CAAC,KAAK,GAAK,CACvB,EAAIP,IAAW,YAAc,CAACgE,EAAU,CACtC,OAAQzD,IAAc,OAAS,EAAI,GACnC,OAAQ,EACV,EAAI,CACF,OAAQA,IAAc,OAAS,EAAI,EACrC,CAAC,CACH,EACA1B,EAAe,UAAU,cAAgB,SAAUkE,EAAYK,EAAe,CAC5E,GAAK,KAAK,WAGV,KAAI/C,EAAS,KAAK,QACdjB,EAAiB,KAAK,eACtB6E,EAAe5D,EAAO,aACtB6D,EAAe7D,EAAO,aACtBT,EAAWR,EAAe,SAC1BwD,EAAaxD,EAAe,UAAU,EACtCW,EAAQ,KAAK,gBAAgB,OAAQM,EAAO,SAAS,EACzD7B,IAAK,CAAC,EAAG,CAAC,EAAG,SAAUyC,EAAa,CAClC,IAAIK,EAAc2C,EAAahD,CAAW,EAC1CK,EAAY,SAAS,OAAQ8B,EAAc,aAAanC,CAAW,CAAC,EACpEK,EAAY,EAAIyB,EAAW9B,CAAW,EACtC,IAAIkD,EAAM5F,GAAUwE,EAAW9B,CAAW,EAAG,CAAC,EAAGrB,EAAS,CAAC,CAAC,EAAGgD,EAAY,EAAI,EAC3EwB,EAAa,KAAK,oBAAoBD,EAAK,YAAY,EAC3D7C,EAAY,OAASA,EAAY,OAAS8C,EAAaxE,EAAS,CAAC,EACjE0B,EAAY,EAAI1B,EAAS,CAAC,EAAIwE,EAAa,EAE3C,IAAIC,EAAoBC,GAAejE,EAAO,kBAAkBY,CAAW,EAAWsD,GAAajD,EAAa,KAAK,KAAK,CAAC,EAC3H,GAAI,KAAK,UAAY,aAAc,CAGjC,IAAIkD,EAAgBzE,IAAU,QAAUA,IAAU,OAASH,EAAS,CAAC,EAAIwE,GAAc,GAAKxE,EAAS,CAAC,EAAIwE,GAAc,GACxHC,EAAU,CAAC,GAAKG,CAClB,CACAN,EAAajD,CAAW,EAAE,SAAS,CACjC,EAAGoD,EAAU,CAAC,EACd,EAAGA,EAAU,CAAC,EACd,KAAMjF,EAAe,gBAAgB,KAAK,cAAc6B,CAAW,CAAC,EACpE,cAAe,SACf,MAAO,KAAK,UAAY,WAAa,KAAK,gBAAgB,OAAQZ,EAAO,SAAS,EAAI,QACxF,CAAC,CACH,EAAG,IAAI,EACT,EACAxB,EAAe,UAAU,eAAiB,SAAU4F,EAAaC,EAAWC,EAAaC,EAAmB,CAC1G,IAAIxF,EAAiB,KAAK,eACtBwD,EAAaxD,EAAe,UAAU,EACtCQ,EAAWR,EAAe,SAC1ByD,EAAa,CAAC,EAAGjD,EAAS,CAAC,CAAC,EAC5BS,EAAS,KAAK,QACd0B,EAAY1B,EAAO,UACvB,GAAK0B,EAGL,CAAAA,EAAU,KAAK,YAAa,EAAK,EACjC,IAAIwB,EAAO,CACT,sBAAuB,EACzB,EACIsB,EAAQ,KAAK,oBAAoBJ,EAAa,QAASlB,CAAI,EAC3Da,EAAa,KAAK,oBAAoBK,EAAa,YAAY,EAC/DK,EAAIvG,GAAUkG,EAAa7B,EAAYC,EAAY,EAAI,EACvDkC,EAAInF,EAAS,CAAC,EAAIwE,EAAa,EAC/BY,EAAkB,CACpB,EAAGjD,EAAU,EACb,EAAGA,EAAU,CACf,EAEAA,EAAU,EAAI+C,EACd/C,EAAU,EAAIgD,EACd,IAAIV,EAAoBC,GAAejE,EAAO,oBAA6BkE,GAAaxC,EAAW,KAAK,KAAK,CAAC,EAC1GK,EAAiB/B,EAAO,eAC5B+B,EAAe,KAAK,YAAa,EAAK,EACtC,IAAIrC,EAAQ,KAAK,gBAAgB,OAAQM,EAAO,SAAS,EACrDL,EAAS,KAAK,QACdiF,EAAejF,IAAW,aAC9BoC,EAAe,SAAS,CACtB,MAAOuC,GAA4B,IAAMvF,EAAe,gBAAgBsF,CAAS,EACjF,cAAeO,EAAelF,EAAQ,SACtC,MAAOkF,EAAe,SAAWlF,CACnC,CAAC,EACD,IAAImF,EAAoB,CACtB,EAAGH,EACH,EAAGD,EACH,MAAO,CACL,KAAMD,CACR,CACF,EACIM,EAAgB,CAClB,MAAO,CACL,EAAGd,EAAU,CAAC,EACd,EAAGA,EAAU,CAAC,CAChB,CACF,EACA,GAAIjF,EAAe,QAAQ,mBAAmB,GAAK,CAAC,KAAK,oBAAqB,CAC5E,IAAIgG,EAAe,CACjB,SAAU,IACV,OAAQ,aACR,SAAU,EACZ,EACArD,EAAU,EAAIiD,EAAgB,EAC9BjD,EAAU,EAAIiD,EAAgB,EAC9BjD,EAAU,UAAUmD,EAAmBE,CAAY,EACnDhD,EAAe,UAAU+C,EAAeC,CAAY,CACtD,MACErD,EAAU,KAAKmD,CAAiB,EAChC9C,EAAe,KAAK+C,CAAa,EAEnC,KAAK,oBAAsB,GAC3B,IAAIjB,EAAe,KAAK,QAAQ,aAChC,GAAIA,EACF,QAASJ,EAAI,EAAGA,EAAII,EAAa,OAAQJ,IAGvC,KAAK,IAAI,UAAUI,EAAaJ,CAAC,CAAC,EAGxC,EACAjF,EAAe,UAAU,yBAA2B,UAAY,CAC9D,IAAIwG,EAAO,KACX,KAAK,QAAQ,UAAU,GAAG,YAAa,SAAU5D,EAAG,CAElD,GADA4D,EAAK,UAAY,GACb,CAACA,EAAK,UAAW,CACnB,IAAIzF,EAAWyF,EAAK,eAAe,SAC/BC,EAAMD,EAAK,gBAAgB,CAAC5D,EAAE,QAASA,EAAE,OAAO,EAAG4D,EAAK,QAAQ,UAAW,GAAM,EAAI,EAGzFC,EAAI,CAAC,EAAI7G,IAAQC,GAAQ,EAAG4G,EAAI,CAAC,CAAC,EAAG1F,EAAS,CAAC,CAAC,EAChDyF,EAAK,qBAAqBC,EAAI,CAAC,EAAG,GAAKA,EAAI,CAAC,GAAKA,EAAI,CAAC,GAAK1F,EAAS,CAAC,CAAC,CACxE,CACF,CAAC,EAAE,GAAG,WAAY,UAAY,CAG5ByF,EAAK,UAAY,GACjB,CAACA,EAAK,WAAaA,EAAK,wBAAwB,CAClD,CAAC,CACH,EACAxG,EAAe,UAAU,2BAA6B,UAAY,CAChE,IAAI0G,EAAK,KAAK,IAAI,MAAM,EACpB,KAAK,eAAe,OAAO,WAC7BA,EAAG,GAAG,YAAa,KAAK,8BAA+B,IAAI,EAC3DA,EAAG,GAAG,WAAY,KAAK,eAAgB,IAAI,GAE3C,KAAK,0BAA0B,CAEnC,EACA1G,EAAe,UAAU,qBAAuB,SAAU2G,EAAWC,EAAY,CAC/E,IAAIrG,EAAiB,KAAK,eACtBQ,EAAWR,EAAe,SAC9B,GAAKA,EAAe,OAAO,UAG3B,KAAIyD,EAAa,CAAC,EAAGjD,EAAS,CAAC,CAAC,EAC5BgD,EAAaxD,EAAe,UAAU,EAE1CoG,EAAY/G,IAAQC,GAAQmE,EAAW,CAAC,EAAG2C,CAAS,EAAG3C,EAAW,CAAC,CAAC,EACpE,IAAI+B,EAAoBc,IAAqBtG,EAAgBwD,EAAYC,CAAU,EAC/E8C,EAAa,CAACH,EAAYZ,EAAmBY,EAAYZ,CAAiB,EAC1EH,EAAclG,GAAUiH,EAAW3C,EAAYD,EAAY,EAAI,EAC/DgD,EAAa,CAACrH,GAAUoH,EAAW,CAAC,EAAG9C,EAAYD,EAAY,EAAI,EAAGrE,GAAUoH,EAAW,CAAC,EAAG9C,EAAYD,EAAY,EAAI,CAAC,EAGhI+C,EAAW,CAAC,EAAI9C,EAAW,CAAC,IAAM+C,EAAW,CAAC,EAAI,MAClDD,EAAW,CAAC,EAAI9C,EAAW,CAAC,IAAM+C,EAAW,CAAC,EAAI,KAG9CH,IACEG,EAAW,CAAC,IAAM,KACpB,KAAK,eAAenB,EAAamB,EAAW,CAAC,EAAG,KAAMhB,CAAiB,EAC9DgB,EAAW,CAAC,IAAM,IAC3B,KAAK,eAAenB,EAAamB,EAAW,CAAC,EAAG,KAAMhB,CAAiB,EAEvE,KAAK,eAAeH,EAAaA,EAAa,UAAMG,CAAiB,GASzE,IAAIiB,EAAW,KAAK,sBAChBC,EAAW,CAAC,GACZL,GAAc/C,IAAqBtD,CAAc,KACnD0G,EAAW,KAAK,sBAAwB1G,EAAe,sBAAsBwG,CAAU,GAEzF,IAAIG,EAA0BC,IAAgBH,EAAUC,CAAQ,EAChE,KAAK,kBAAkB,WAAmBG,GAAkBF,EAAc,CAAC,EAAG3G,CAAc,CAAC,EAC7F,KAAK,kBAAkB,YAAoB6G,GAAkBF,EAAc,CAAC,EAAG3G,CAAc,CAAC,EAChG,EACAP,EAAe,UAAU,8BAAgC,SAAU4C,EAAG,CACpE,IAAIyE,EAQJ,GAPAC,GAAoB1E,EAAE,OAAQ,SAAU2E,EAAQ,CAC9C,IAAIC,EAAaC,GAAUF,CAAM,EACjC,GAAIC,EAAW,WAAa,KAC1B,OAAAH,EAASG,EACF,EAEX,EAAG,EAAI,EACH,EAACH,EAGL,KAAIK,EAAY,KAAK,QAAQ,iBAAiBL,EAAO,WAAW,EAC5D9G,EAAiB,KAAK,eAC1B,GAAKA,EAAe,eAAemH,CAAS,EAG5C,KAAIC,EAAOD,EAAU,QAAQL,EAAO,QAAQ,EACxCO,EAAQD,EAAK,SAAS,EAAE,IAAIpH,EAAe,sBAAsBoH,CAAI,EAAGN,EAAO,SAAS,EACvF,MAAMO,CAAK,GACd,KAAK,eAAeA,EAAOA,CAAK,GAEpC,EACA5H,EAAe,UAAU,eAAiB,UAAY,CACpD,IAAIwB,EAAS,KAAK,QAClBA,EAAO,WAAaA,EAAO,UAAU,KAAK,YAAa,EAAI,EAC3DA,EAAO,gBAAkBA,EAAO,eAAe,KAAK,YAAa,EAAI,EACrE,IAAI6D,EAAe,KAAK,QAAQ,aAChC,GAAIA,EACF,QAAS,EAAI,EAAG,EAAIA,EAAa,OAAQ,IAGvC,KAAK,IAAI,UAAUA,EAAa,CAAC,CAAC,CAGxC,EACArF,EAAe,UAAU,wBAA0B,UAAY,CAC7D,KAAK,eAAe,EACpB,IAAI6H,EAAU,KAAK,sBACnB,KAAK,kBAAkB,WAAmBT,GAAkBS,EAAS,KAAK,cAAc,CAAC,EACzFA,EAAQ,OAAS,CACnB,EACA7H,EAAe,UAAU,0BAA4B,UAAY,CAC/D,KAAK,eAAe,EACpB,IAAI0G,EAAK,KAAK,IAAI,MAAM,EACxBA,EAAG,IAAI,YAAa,KAAK,6BAA6B,EACtDA,EAAG,IAAI,WAAY,KAAK,cAAc,CACxC,EACA1G,EAAe,UAAU,gBAAkB,SAAU4D,EAAQkE,EAAS3C,EAAS4C,EAAQ,CACrF,IAAIC,EAAoBtC,GAAaoC,EAASC,EAAS,KAAO,KAAK,KAAK,EACxE,OAAcE,EAAQrE,CAAM,EAAY6B,GAAe7B,EAAQoE,EAAW7C,CAAO,EAAY+C,GAAmBtE,EAAQoE,EAAW7C,CAAO,CAC5I,EAEAnF,EAAe,UAAU,kBAAoB,SAAUmI,EAAMC,EAAO,CAClEA,GAASA,EAAM,QAAU,KAAK,IAAI,eAAe,CAC/C,KAAMD,EACN,MAAOC,CACT,CAAC,CACH,EAIApI,EAAe,UAAU,QAAU,UAAY,CAC7C,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,CAC/B,EACAA,EAAe,KAAO,uBACfA,CACT,GAAEqI,EAAa,EACf,SAAStG,IAAcuG,EAAQ3F,EAAQN,EAASC,EAAW,CACzD,OAAO,IAAYiG,GAAQ,CACzB,MAAO,CACL,OAAQD,CACV,EACA,UAAW,CAAC,CAACjG,EACb,OAAQM,EACR,MAAON,EACP,YAAa,SAAUO,EAAG,CAEdC,GAAKD,EAAE,KAAK,CACxB,EACA,UAAWN,CACb,CAAC,CACH,CACA,SAASuE,IAAqBtG,EAAgBwD,EAAYC,EAAY,CACpE,IAAI+B,EAAoBjG,IAAkB,EACtC0I,EAAoBjI,EAAe,IAAI,mBAAmB,EAC9D,OAAIiI,IACFzC,EAAoBrG,GAAU8I,EAAmBzE,EAAYC,EAAY,EAAI,EAAI,GAE5E+B,CACT,CACA,SAASlC,IAAqBtD,EAAgB,CAC5C,IAAIkI,EAAoBlI,EAAe,IAAI,mBAAmB,EAC9D,MAAO,CAAC,EAAEkI,GAA4BlI,EAAe,IAAI,UAAU,EACrE,CACA,SAASyB,IAAUb,EAAQ,CACzB,OAAOA,IAAW,WAAa,YAAc,WAC/C,CACA,IAAOuH,IAAQ1I,IC3oBR,IAAI2I,IAAsB,CAC/B,KAAM,kBACN,MAAO,oBAEP,OAAQ,QACV,EACWC,IAAwB,SAAUC,EAASC,EAAS,CAC7DA,EAAQ,cAAc,CACpB,SAAU,YACV,MAAOD,CACT,EAAG,SAAUE,EAAO,CAClBA,EAAM,YAAYF,EAAQ,QAAQ,CACpC,CAAC,CACH,ECTO,IAAIG,IAA4B,CAAC,CACtC,kBAAmB,GACnB,MAAO,SAAUC,EAAaC,EAAS,CACrC,IAAIC,EAAe,CAAC,EACpB,OAAAD,EAAQ,cAAc,YAAa,SAAUE,EAAgB,CAC3D,IAAIC,EAAkBJ,EAAY,gBAC9B,CAACG,EAAe,eAAeH,CAAW,GAAKI,GAAmBA,EAAgB,OAGtFF,EAAa,KAAoBG,IAAuBF,EAAe,UAAWA,EAAe,cAAsBG,GAAKH,EAAe,cAAeA,CAAc,EAAGA,EAAe,sBAAsBH,EAAY,QAAQ,CAAC,CAAC,CAAC,CACzO,CAAC,EACME,CACT,CACF,EAEA,CACE,kBAAmB,GACnB,MAAO,SAAUF,EAAaC,EAAS,CACrC,IAAIM,EAAOP,EAAY,QAAQ,EAC3BQ,EAAiB,CAAC,EACtBP,EAAQ,cAAc,YAAa,SAAUE,EAAgB,CAC3D,GAAIA,EAAe,eAAeH,CAAW,EAAG,CAC9C,IAAIS,EAAaN,EAAe,cAAqBG,GAAKI,IAAgB,KAAMV,EAAaG,CAAc,CAAC,GAAK,CAC/G,MAAO,CAAC,EACR,YAAa,CAAC,CAChB,EACIQ,EAASR,EAAe,sBAAsBI,CAAI,EAClDI,GAAU,IAEZF,EAAW,UAAYE,EACvBH,EAAe,KAAKC,CAAU,EAElC,CACF,CAAC,EAEDT,EAAY,QAAQ,EAAE,UAAU,aAAcQ,CAAc,CAC9D,CACF,CAAC,EAID,SAASE,IAAeV,EAAaG,EAAgBS,EAAOC,EAAY,CAMtE,QALIC,EAAWX,EAAe,cAAcU,CAAU,EAClDE,EAAcC,GAAc,mBAAmBF,CAAQ,EACvDG,EAAe,CACjB,MAAOC,GAAkBlB,EAAY,QAAQ,EAAG,OAAO,CACzD,EACSmB,EAAI,EAAGC,EAAML,EAAY,OAAQI,EAAIC,EAAKD,IAAK,CACtD,IAAIE,EAAON,EAAYI,CAAC,EACpBG,EAAUR,EAASO,IAAS,UAAY,oBAAsBA,CAAI,EACtEC,GAAWA,EAAQ,YAAYV,EAAOW,EAAWC,CAAS,CAC5D,CACA,OAAOP,EAAa,MACpB,SAASM,EAAUE,EAAK,CACtB,OAAOR,EAAaQ,CAAG,CACzB,CACA,SAASD,EAAUC,EAAKb,EAAO,CAC7BK,EAAaQ,CAAG,EAAIb,CACtB,CACF,CC7DA,IAAIc,IAAcA,EACH,SAARC,GAAuCC,EAAQ,CACpD,IAAIC,EAAYD,GAAUA,EAAO,UACrBE,EAAQD,CAAS,IAC3BA,EAAYA,EAAY,CAACA,CAAS,EAAI,CAAC,GAEzCH,IAAKG,EAAW,SAAUE,EAAK,CAC7B,GAAKA,EAIL,CAAIC,GAAID,EAAK,WAAW,GAAK,CAACC,GAAID,EAAK,QAAQ,IAC7CA,EAAI,OAASA,EAAI,UACjB,OAAOA,EAAI,WAEb,IAAIE,EAASF,EAAI,OACbE,GAAiBH,EAAQG,CAAM,GACjCP,IAAKO,EAAQ,SAAUC,EAAO,CACjBC,GAASD,CAAK,IACnBF,GAAIE,EAAO,OAAO,GAAK,CAACF,GAAIE,EAAO,KAAK,IAC1CA,EAAM,IAAMA,EAAM,OAEhBF,GAAIE,EAAO,KAAK,GAAK,CAACF,GAAIE,EAAO,KAAK,IACxCA,EAAM,IAAMA,EAAM,KAGxB,CAAC,EAEL,CAAC,CACH,CACA,SAASF,GAAII,EAAKC,EAAM,CACtB,OAAOD,GAAOA,EAAI,gBAAkBA,EAAI,eAAeC,CAAI,CAC7D,CC9BA,IAAIC,IAAY,GACD,SAARC,GAA+BC,EAAW,CAC3CF,MAGJA,IAAY,GACZE,EAAU,yBAAyB,YAAa,SAAUC,EAAQ,CAEhE,MAAO,CAACA,EAAO,aAAe,EAAEA,EAAO,OAASA,EAAO,OAAO,OAAS,EAAIA,EAAO,YAAc,IAAMA,EAAO,YAAc,aAAe,WAC5I,CAAC,EACDD,EAAU,eAAeE,IAAqBC,GAAqB,EACnEC,EAAKC,IAA2B,SAAUC,EAAS,CACjDN,EAAU,eAAeA,EAAU,SAAS,OAAO,UAAWM,CAAO,CACvE,CAAC,EACDN,EAAU,qBAAqBO,EAAY,EAC7C,CChBO,SAASC,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAe,EAChDD,EAAU,sBAAsBE,GAAc,EAC9CC,GAAcH,CAAS,CACzB,CCAA,IAAII,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAK5BG,EAAM,WAAa,CAAC,EACbA,CACT,CACA,OAAAH,EAAe,UAAU,cAAgB,SAAUI,EAAWC,EAAQ,CACpEJ,EAAO,UAAU,cAAc,MAAM,KAAM,SAAS,EACpD,KAAK,YAAY,EACjB,IAAIK,EAAO,KAAK,MAAQ,KAAK,eAAe,EAC5C,KAAK,WAAa,CAAC,EACnBC,IAAa,KAAK,KAAK,EAAE,KAAK,KAAM,KAAK,UAAU,EACnD,KAAK,eAAeH,EAAWC,CAAM,EACrC,IAAIG,EAAa,KAAK,OAAO,WAC7B,KAAK,YAAY,SAAUC,EAAeC,EAAO,CAC3CJ,IAAS,cACXG,EAAc,cAAgB,WAC9BA,EAAc,WAAoBE,GAAMH,CAAU,IAElDC,EAAc,WAAa,KAAK,UAAU,EAC1CA,EAAc,cAAgB,YAC9BA,EAAc,UAAmBG,EAAI,KAAK,WAAY,SAAUC,EAAO,CACrE,OAAAA,EAAeF,GAAME,CAAK,EACtBH,IAAU,YAGZG,EAAM,OAAS,MAEVA,CACT,CAAC,EAEL,CAAC,CACH,EAKAb,EAAe,UAAU,qBAAuB,UAAY,CAQ1D,IAAIc,EAAS,KAAK,OACdC,EAAsB,CAAC,EACvBC,EAAcC,GAAc,gBAAgB,EAC5CC,EAAa,KAAK,WAAW,EAC1BC,EAAKL,EAAO,OAAQ,SAAUD,EAAO,CACnCM,EAAKH,EAAa,SAAUI,EAAY,CACzCP,EAAM,eAAeO,CAAU,IACjCL,EAAoBK,CAAU,EAAI,EAEtC,CAAC,CACH,CAAC,EACMD,EAAKJ,EAAqB,SAAUM,EAAGD,EAAY,CACxD,IAAIE,EAAS,GACNH,EAAK,KAAK,UAAW,SAAUT,EAAO,CAC3CY,EAASA,GAAUC,EAAIT,EAAQJ,EAAOU,CAAU,GAAKG,EAAIT,EAAO,OAAQJ,EAAOU,CAAU,CAC3F,EAAG,IAAI,EACP,CAACE,GAAiBH,EAAK,KAAK,UAAW,SAAUT,EAAO,EACrDI,EAAOJ,CAAK,IAAMI,EAAOJ,CAAK,EAAI,CAAC,IAAIU,CAAU,EAAII,GAAc,IAAIJ,EAAYV,IAAU,UAAY,SAAW,WAAYQ,CAAU,CAC7I,CAAC,CACH,EAAG,IAAI,EACP,SAASK,EAAIE,EAAKf,EAAOU,EAAY,CACnC,OAAOK,GAAOA,EAAIf,CAAK,GAAKe,EAAIf,CAAK,EAAE,eAAeU,CAAU,CAClE,CACAnB,EAAO,UAAU,qBAAqB,MAAM,KAAM,SAAS,CAC7D,EACAD,EAAe,UAAU,eAAiB,SAAUI,EAAWC,EAAQ,CACrE,IAAIqB,EAAa,KAAK,OAClBC,EAAY,KAAK,WAEjBC,GAAYvB,EAASqB,EAAatB,GAAW,UAAY,CAAC,EAS9D,GARAsB,EAAW,SAAWE,EAEfT,EAAKQ,EAAW,SAAUd,EAAOgB,EAAO,CAC7C,IAAIC,EAAM,KAAK,kBAAkBjB,CAAK,EACjCe,EAAS,eAAeE,CAAG,IAC9BF,EAASE,CAAG,EAAI,GAEpB,EAAG,IAAI,EACHJ,EAAW,eAAiB,SAAU,CAExC,IAAIK,EAAW,GACRZ,EAAKQ,EAAW,SAAUd,EAAOgB,EAAO,CAC7C,IAAIC,EAAM,KAAK,kBAAkBjB,CAAK,EAClCe,EAASE,CAAG,IACdC,EAAWH,EAASE,CAAG,EAAI,GAAQC,EAAW,GAElD,EAAG,IAAI,CACT,CAEF,EAIA/B,EAAe,UAAU,cAAgB,UAAY,CACnD,OAAO,KAAK,IAAI,YAAY,CAC9B,EAIAA,EAAe,UAAU,kBAAoB,SAAUa,EAAO,CAC5D,OAAO,KAAK,QAAU,aAAeA,EAAM,MAAQ,GAAKA,EAAM,MAAQ,EACxE,EAIAb,EAAe,UAAU,aAAe,UAAY,CAClD,OAAO,KAAK,UACd,EAIAA,EAAe,UAAU,eAAiB,UAAY,CACpD,IAAIc,EAAS,KAAK,OAClB,OAAOA,EAAO,QAAUA,EAAO,OAAO,OAAS,EAAI,SAAW,KAAK,OAAO,WAAa,aAAe,aACxG,EAIAd,EAAe,UAAU,YAAc,SAAU4B,EAAU,CACzD,KAAK,OAAO,SAAkBjB,GAAMiB,CAAQ,CAC9C,EAIA5B,EAAe,UAAU,cAAgB,SAAUgC,EAAO,CACxD,IAAIH,EAAQZ,GAAc,eAAee,EAAO,KAAK,UAAU,EAC/D,OAAOH,GAAS,MAAO,KAAK,OAAO,SAAS,KAAK,kBAAkB,KAAK,WAAWA,CAAK,CAAC,CAAC,EAAI,UAA2B,YAC3H,EAKA7B,EAAe,UAAU,sBAAwB,SAAUiC,EAAY,CACrE,IAAIC,EAAS,CAAC,EACVP,EAAY,KAAK,WACrB,YAAK,iBAAiB,SAAUQ,EAAa,CAC3C,IAAIC,EAAc,CAAC,EACfC,EAAOF,EAAY,QAAQ,EAC/BE,EAAK,KAAK,KAAK,sBAAsBA,CAAI,EAAG,SAAUL,EAAOM,EAAW,CAEtE,IAAIC,EAAOtB,GAAc,eAAee,EAAOL,CAAS,EACxDY,IAASN,GAAcG,EAAY,KAAKE,CAAS,CACnD,EAAG,IAAI,EACPJ,EAAO,KAAK,CACV,SAAUC,EAAY,GACtB,UAAWC,CACb,CAAC,CACH,EAAG,IAAI,EACAF,CACT,EAMAlC,EAAe,UAAU,kBAAoB,SAAUa,EAAO,CAC5D,IAAI2B,EACJ,GAAI,KAAK,WAAW,EAClBA,EAAiB3B,EAAM,cAEnBA,EAAM,OAAS,KACjB2B,EAAiB3B,EAAM,UAClB,CACL,IAAI4B,EAAgB5B,EAAM,UAAY,CAAC,EACvC2B,EAAiBC,EAAc,CAAC,IAAM,MAAaA,EAAc,CAAC,IAAM,IAAW,GAAKA,EAAc,CAAC,EAAIA,EAAc,CAAC,GAAK,CACjI,CAEF,OAAOD,CACT,EACAxC,EAAe,UAAU,cAAgB,SAAU0C,EAAgB,CAEjE,GAAI,KAAK,WAAW,EAClB,OAEF,IAAIC,EAAQ,CAAC,EACTC,EAAc,CAAC,GAAI,EAAE,EACrBC,EAAiB,KACrB,SAASC,EAAQC,EAAUC,EAAY,CACrC,IAAIR,EAAiBK,EAAe,kBAAkB,CACpD,SAAUE,CACZ,CAAC,EACIC,IACHA,EAAaH,EAAe,cAAcL,CAAc,GAE1D,IAAIS,EAAQP,EAAeF,EAAgBQ,CAAU,EACjDD,EAAS,CAAC,IAAM,KAClBH,EAAY,CAAC,EAAIK,EACRF,EAAS,CAAC,IAAM,IACzBH,EAAY,CAAC,EAAIK,EAEjBN,EAAM,KAAK,CACT,MAAOI,EAAS,CAAC,EACjB,MAAOE,CACT,EAAG,CACD,MAAOF,EAAS,CAAC,EACjB,MAAOE,CACT,CAAC,CAEL,CAEA,IAAItB,EAAY,KAAK,WAAW,MAAM,EACtC,GAAI,CAACA,EAAU,OACbA,EAAU,KAAK,CACb,SAAU,CAAC,KAAW,GAAQ,CAChC,CAAC,MACI,CACL,IAAIuB,EAAOvB,EAAU,CAAC,EAAE,SAAS,CAAC,EAClCuB,IAAS,MAAavB,EAAU,QAAQ,CACtC,SAAU,CAAC,KAAWuB,CAAI,CAC5B,CAAC,EACDA,EAAOvB,EAAUA,EAAU,OAAS,CAAC,EAAE,SAAS,CAAC,EACjDuB,IAAS,KAAYvB,EAAU,KAAK,CAClC,SAAU,CAACuB,EAAM,GAAQ,CAC3B,CAAC,CACH,CACA,IAAIC,EAAO,KACX,OAAOhC,EAAKQ,EAAW,SAAUd,EAAO,CACtC,IAAIkC,EAAWlC,EAAM,SACjBkC,IAEFA,EAAS,CAAC,EAAII,GAAQL,EAAQ,CAACK,EAAMJ,EAAS,CAAC,CAAC,EAAG,YAAY,EAC/DD,EAAQC,EAAS,MAAM,CAAC,EACxBI,EAAOJ,EAAS,CAAC,EAErB,EAAG,IAAI,EACA,CACL,MAAOJ,EACP,YAAaC,CACf,CACF,EACA5C,EAAe,KAAO,sBACtBA,EAAe,cAAgBoD,GAAqBC,GAAe,cAAe,CAChF,SAAU,KACV,QAAS,GACT,QAAS,GACT,MAAO,OACP,UAAW,GACX,WAAY,GACZ,WAAY,YACZ,OAAQ,KACR,WAAY,KACZ,YAAa,EACb,aAAc,WACd,QAAS,GACT,UAAW,EACb,CAAC,EACMrD,CACT,GAAEqD,EAAc,EAOZ9C,IAAe,CACjB,YAAa,SAAU+C,EAAc,CACnC,IAAI5B,EAAa,KAAK,OAClB6B,EAAY,KAAK,IAAI7B,EAAW,UAAW,EAAE,EAC7C8B,EAAa,KAAK,UAAU,EAC5BC,EAAc/B,EAAW,YAC7B+B,EAAc,KAAK,IAAI,SAASA,EAAa,EAAE,EAAG,CAAC,EACnD/B,EAAW,YAAc+B,EAGzB,QAFIC,GAAaF,EAAW,CAAC,EAAIA,EAAW,CAAC,GAAKC,EAE3C,CAACC,EAAU,QAAQH,CAAS,IAAMG,GAAaH,EAAY,GAChEA,IAEF7B,EAAW,UAAY6B,EACvBG,EAAY,CAACA,EAAU,QAAQH,CAAS,EACpC7B,EAAW,SACb4B,EAAa,KAAK,CAChB,SAAU,CAAC,KAAWE,EAAW,CAAC,CAAC,EACnC,MAAO,CAAC,EAAG,CAAC,CACd,CAAC,EAEH,QAAS3B,EAAQ,EAAGsB,EAAOK,EAAW,CAAC,EAAG3B,EAAQ4B,EAAaN,GAAQO,EAAW7B,IAAS,CACzF,IAAI8B,EAAM9B,IAAU4B,EAAc,EAAID,EAAW,CAAC,EAAIL,EAAOO,EAC7DJ,EAAa,KAAK,CAChB,SAAU,CAACH,EAAMQ,CAAG,EACpB,MAAO,CAAC,EAAG,CAAC,CACd,CAAC,CACH,CACIjC,EAAW,SACb4B,EAAa,KAAK,CAChB,SAAU,CAACE,EAAW,CAAC,EAAG,GAAQ,EAClC,MAAO,CAAC,EAAG,CAAC,CACd,CAAC,EAEHI,GAAgBN,CAAY,EACrBnC,EAAKmC,EAAc,SAAUzC,EAAOgB,EAAO,CAChDhB,EAAM,MAAQgB,EACdhB,EAAM,KAAO,KAAK,gBAAgBA,EAAM,QAAQ,CAClD,EAAG,IAAI,CACT,EACA,WAAY,SAAUyC,EAAc,CAClC,IAAI5B,EAAa,KAAK,OACfP,EAAKO,EAAW,WAAY,SAAUmC,EAAM,CAGjDP,EAAa,KAAK,CAChB,KAAM,KAAK,gBAAgBO,EAAM,EAAI,EACrC,MAAOA,CACT,CAAC,CACH,EAAG,IAAI,EAEPC,IAAiBpC,EAAY4B,CAAY,CAC3C,EACA,OAAQ,SAAUA,EAAc,CAC9B,IAAI5B,EAAa,KAAK,OACfP,EAAKO,EAAW,OAAQ,SAAUqC,EAAelC,EAAO,CACjDmC,GAASD,CAAa,IAChCA,EAAgB,CACd,MAAOA,CACT,GAEF,IAAIE,EAAO,CACT,KAAM,GACN,MAAOpC,CACT,EAIA,GAHIkC,EAAc,OAAS,OACzBE,EAAK,KAAOF,EAAc,OAExBA,EAAc,eAAe,OAAO,EAAG,CACzC,IAAI/B,EAAQiC,EAAK,MAAQF,EAAc,MACvCE,EAAK,SAAW,CAACjC,EAAOA,CAAK,EAC7BiC,EAAK,MAAQ,CAAC,EAAG,CAAC,CACpB,KAAO,CAQL,QALIlB,EAAWkB,EAAK,SAAW,CAAC,EAC5BC,EAAUD,EAAK,MAAQ,CAAC,EAAG,CAAC,EAC5BE,EAAY,CAAC,EAAG,EAAG,CAAC,EACpBC,EAAe,CAAC,KAAW,GAAQ,EACnCC,EAAY,CAAC,EACRC,EAAK,EAAGA,EAAK,EAAGA,IAAM,CAE7B,QADIC,EAAQ,CAAC,CAAC,MAAO,KAAM,KAAK,EAAG,CAAC,MAAO,KAAM,KAAK,CAAC,EAAED,CAAE,EAClDE,EAAI,EAAGA,EAAI,GAAKzB,EAASuB,CAAE,GAAK,KAAME,IAC7CzB,EAASuB,CAAE,EAAIP,EAAcQ,EAAMC,CAAC,CAAC,EACrCN,EAAQI,CAAE,EAAIH,EAAUK,CAAC,EACzBH,EAAUC,CAAE,EAAIE,IAAM,EAExBzB,EAASuB,CAAE,GAAK,OAASvB,EAASuB,CAAE,EAAIF,EAAaE,CAAE,EACzD,CACAD,EAAU,CAAC,GAAKtB,EAAS,CAAC,IAAM,MAAamB,EAAQ,CAAC,EAAI,GAC1DG,EAAU,CAAC,GAAKtB,EAAS,CAAC,IAAM,OAAcmB,EAAQ,CAAC,EAAI,GAMvDnB,EAAS,CAAC,IAAMA,EAAS,CAAC,GAAKmB,EAAQ,CAAC,GAAKA,EAAQ,CAAC,IAGxDD,EAAK,MAAQlB,EAAS,CAAC,EAE3B,CACAkB,EAAK,OAAShD,GAAc,gBAAgB8C,CAAa,EACzDT,EAAa,KAAKW,CAAI,CACxB,EAAG,IAAI,EAEPH,IAAiBpC,EAAY4B,CAAY,EAEzCM,GAAgBN,CAAY,EACrBnC,EAAKmC,EAAc,SAAUzC,EAAO,CACzC,IAAI4D,EAAQ5D,EAAM,MACd6D,EAAc,CAAC,CAAC,IAAK,QAAG,EAAED,EAAM,CAAC,CAAC,EAAG,CAAC,IAAK,QAAG,EAAEA,EAAM,CAAC,CAAC,CAAC,EAC7D5D,EAAM,KAAOA,EAAM,MAAQ,KAAK,gBAAgBA,EAAM,OAAS,KAAOA,EAAM,MAAQA,EAAM,SAAU,GAAO6D,CAAW,CACxH,EAAG,IAAI,CACT,CACF,EACA,SAASZ,IAAiBpC,EAAYC,EAAW,CAC/C,IAAIgD,EAAUjD,EAAW,SACrBA,EAAW,SAAW,WAAa,CAACiD,EAAUA,IAChDhD,EAAU,QAAQ,CAEtB,CACA,IAAOiD,IAAQ5E,IClYf,IAAI6E,KAAsC,SAAUC,EAAQ,CAC1DC,EAAUF,EAAwBC,CAAM,EACxC,SAASD,GAAyB,CAChC,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAuB,KAC7BG,CACT,CACA,OAAAH,EAAuB,UAAU,SAAW,UAAY,CACtD,IAAII,EAAY,KAAK,MACrBA,EAAU,UAAU,EACpB,IAAIC,EAAiB,KAAK,eACtBC,EAAUD,EAAe,IAAI,SAAS,EACtCE,EAAiBF,EAAe,eAChCG,EAAY,KAAK,cAAc,EAC/BC,EAAWJ,EAAe,SAC1BK,EAAW,KAAK,aAAa,EAC7BC,EAAWD,EAAS,SACpBE,EAAmBC,GAASR,EAAe,IAAI,YAAa,EAAI,EAAG,CAACM,CAAQ,EAC5EG,EAAS,CAACT,EAAe,IAAI,cAAc,EAC/CM,GAAY,KAAK,gBAAgBP,EAAWO,EAAS,CAAC,EAAGF,EAAUG,EAAWJ,CAAS,EAChFO,EAAKL,EAAS,cAAe,SAAUM,EAAM,CAClD,IAAIC,EAAQD,EAAK,MACbE,EAAY,IAAYC,GAC5BD,EAAU,QAAiBE,GAAK,KAAK,aAAc,KAAMH,CAAK,EAC9D,KAAK,iBAAiBC,EAAWF,EAAK,qBAAqB,EAE3D,IAAIK,EAAiBhB,EAAe,kBAAkBY,CAAK,EAE3D,GADA,KAAK,kBAAkBC,EAAWG,EAAgB,CAAC,EAAG,EAAGZ,EAAS,CAAC,EAAGA,EAAS,CAAC,CAAC,EAAGK,CAAM,EACtFF,EAAW,CACb,IAAIU,EAAc,KAAK,eAAe,cAAcD,CAAc,EAC9DE,EAAQhB,EAAe,IAAI,OAAO,GAAKC,EAC3CU,EAAU,IAAI,IAAYM,GAAK,CAC7B,MAAOC,GAAgBlB,EAAgB,CACrC,EAAGgB,IAAU,QAAU,CAACjB,EAAUG,EAAS,CAAC,EAAIH,EAChD,EAAGG,EAAS,CAAC,EAAI,EACjB,KAAMQ,EAAM,KACZ,cAAeV,EAAe,IAAI,eAAe,GAAK,SACtD,MAAOgB,EACP,QAAgBG,GAAUnB,EAAe,IAAI,SAAS,EAAGe,IAAgB,aAAe,GAAM,CAAC,CACjG,CAAC,EACD,OAAQR,CACV,CAAC,CAAC,CACJ,CACAV,EAAU,IAAIc,CAAS,CACzB,EAAG,IAAI,EACPP,GAAY,KAAK,gBAAgBP,EAAWO,EAAS,CAAC,EAAGF,EAAUG,EAAWJ,CAAS,EAChFmB,GAAItB,EAAe,IAAI,QAAQ,EAAGD,EAAWC,EAAe,IAAI,SAAS,CAAC,EACjF,KAAK,iBAAiBD,CAAS,EAC/B,KAAK,cAAcA,CAAS,CAC9B,EACAJ,EAAuB,UAAU,iBAAmB,SAAUkB,EAAWU,EAAY,CACnF,IAAIzB,EAAQ,KACZe,EAAU,GAAG,YAAa,UAAY,CACpC,OAAOW,EAAY,WAAW,CAChC,CAAC,EAAE,GAAG,WAAY,UAAY,CAC5B,OAAOA,EAAY,UAAU,CAC/B,CAAC,EACD,IAAIA,EAAc,SAAUC,EAAQ,CAClC,IAAIzB,EAAiBF,EAAM,eAE3BE,EAAe,OAAO,WAAaF,EAAM,IAAI,eAAe,CAC1D,KAAM2B,EACN,MAAcC,GAAkB1B,EAAe,sBAAsBuB,CAAU,EAAGvB,CAAc,CAClG,CAAC,CACH,CACF,EACAL,EAAuB,UAAU,cAAgB,UAAY,CAC3D,IAAIK,EAAiB,KAAK,eACtB2B,EAAc3B,EAAe,OACjC,GAAI2B,EAAY,SAAW,WACzB,OAAcC,GAAa5B,EAAgB,KAAK,IAAKA,EAAe,QAAQ,EAG5E,IAAIkB,EAAQS,EAAY,MACxB,OAAI,CAACT,GAASA,IAAU,UACtBA,EAAQ,QAEHA,CAEX,EACAvB,EAAuB,UAAU,gBAAkB,SAAUkC,EAAOC,EAAM1B,EAAUG,EAAWJ,EAAW,CACxG,GAAK2B,EAGL,KAAIjB,EAAY,IAAYC,GACxBZ,EAAiB,KAAK,eAAe,eACzCW,EAAU,IAAI,IAAYM,GAAK,CAC7B,MAAOC,GAAgBlB,EAAgB,CACrC,EAAGK,EAAYJ,IAAc,QAAUC,EAAS,CAAC,EAAI,EAAIA,EAAS,CAAC,EAAI,EACvE,EAAGA,EAAS,CAAC,EAAI,EACjB,cAAe,SACf,MAAOG,EAAYJ,EAAY,SAC/B,KAAM2B,CACR,CAAC,CACH,CAAC,CAAC,EACFD,EAAM,IAAIhB,CAAS,EACrB,EAKAlB,EAAuB,UAAU,aAAe,UAAY,CAC1D,IAAIK,EAAiB,KAAK,eACtB+B,EAAuBC,EAAIhC,EAAe,aAAa,EAAG,SAAUY,EAAOqB,EAAO,CACpF,MAAO,CACL,MAAOrB,EACP,sBAAuBqB,CACzB,CACF,CAAC,EACG3B,EAAWN,EAAe,IAAI,MAAM,EAEpCkC,EAASlC,EAAe,IAAI,QAAQ,EACpCmC,EAAUnC,EAAe,IAAI,SAAS,EAE1C,OAAIkC,IAAW,aAAeC,EAAU,CAACA,GACvCJ,EAAc,QAAQ,EAGfzB,IACPA,EAAWA,EAAS,MAAM,EAAE,QAAQ,GAE/B,CACL,cAAeyB,EACf,SAAUzB,CACZ,CACF,EACAX,EAAuB,UAAU,kBAAoB,SAAUkC,EAAOb,EAAgBoB,EAAY3B,EAAQ,CACxG,IAAI4B,EAAaC,GAEjB,KAAK,oBAAoBtB,EAAgB,QAAQ,EAAGoB,EAAW,CAAC,EAAGA,EAAW,CAAC,EAAGA,EAAW,CAAC,EAAGA,EAAW,CAAC,EAE7G,KAAK,oBAAoBpB,EAAgB,OAAO,CAAC,EACjDqB,EAAW,OAAS5B,EACpBoB,EAAM,IAAIQ,CAAU,CACtB,EACA1C,EAAuB,UAAU,aAAe,SAAUiB,EAAO,CAC/D,IAAIZ,EAAiB,KAAK,eACtBuC,EAASvC,EAAe,OACxBwC,EAAeD,EAAO,aAC1B,GAAKC,EAGL,KAAIC,EAAkBC,GAAMH,EAAO,QAAQ,EACvCI,EAAS3C,EAAe,kBAAkBY,CAAK,EAC/C4B,IAAiB,UAAYA,IAAiB,IAChDC,EAASE,CAAM,EAAI,GACZjC,EAAK+B,EAAU,SAAUG,EAAGC,EAAK,CACtCJ,EAASI,CAAG,EAAIA,IAAQF,CAC1B,CAAC,GAEDF,EAASE,CAAM,EAAI,CAACF,EAASE,CAAM,EAErC,KAAK,IAAI,eAAe,CACtB,KAAM,kBACN,KAAM,KAAK,IACX,YAAa,KAAK,eAAe,GACjC,SAAUF,CACZ,CAAC,EACH,EACA9C,EAAuB,KAAO,sBACvBA,CACT,GAAEmD,EAAa,EACRC,IAAQpD,ICvKR,SAASqD,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAc,EAC/CD,EAAU,sBAAsBE,GAAa,EAC7CC,GAAcH,CAAS,CACzB,CCJO,SAASI,GAAQC,EAAW,CACjCC,GAAIF,EAA0B,EAC9BE,GAAIF,EAAyB,CAG/B,CCHA,IAAIG,KAAmC,UAAY,CACjD,SAASA,EAAoBC,EAAgB,CAC3C,KAAK,gBAAkBA,CACzB,CACA,OAAAD,EAAoB,UAAU,MAAQ,SAAUE,EAAK,CACnD,KAAK,eAAiBA,EAAI,sBAAsB,CAClD,EACAF,EAAoB,UAAU,cAAgB,SAAUG,EAAK,CAC3D,IAAIC,EAAgBD,EAAI,IAAI,wBAAwB,KAAK,eAAe,EACnEC,IAGLD,EAAI,MAAM,OAAS,GACnBC,EAAc,cAAc,CAC1B,MAAOD,EAAI,MACX,YAAaA,EAAI,YACjB,QAASE,GAAYF,EAAI,KAAK,EAC9B,SAAUA,EAAI,SACd,aAAcA,EAAI,aAClB,cAAe,KAAK,cACtB,CAAC,EACH,EACAH,EAAoB,UAAU,aAAe,SAAUM,EAAaJ,EAAK,CACvE,IAAIE,EAAgBF,EAAI,wBAAwB,KAAK,eAAe,EAC/DE,GAGLA,EAAc,aAAa,CACzB,YAAaE,EACb,cAAe,KAAK,cACtB,CAAC,CACH,EACON,CACT,GAAE,EChCF,IAAIO,KAA8B,SAAUC,EAAQ,CAClDC,EAAUF,EAAgBC,CAAM,EAChC,SAASD,GAAiB,CACxB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAe,KAC5BG,EAAM,aAAe,GACdA,CACT,CACA,OAAAH,EAAe,UAAU,cAAgB,SAAUI,EAAcC,EAAQ,CACvE,KAAK,cAAc,CACrB,EACAL,EAAe,UAAU,cAAgB,UAAY,CACnD,IAAIM,EAAS,KAAK,QAAU,KAAK,SAAW,IAAIC,IAAoB,IAAI,EAMxE,GAJA,KAAK,QAAU,KACf,KAAK,QAAQ,WAAW,SAAUC,EAAQ,CACxCC,GAAsBD,EAAQ,IAAI,CACpC,CAAC,EACG,KAAK,WAAW,EAAG,CACrB,IAAIE,EAAS,KAAK,UAAU,EAE5BD,GAAsBC,EAAO,gBAAiBJ,CAAM,CACtD,CACF,EACAN,EAAe,UAAU,WAAa,UAAY,CAChD,OAAO,KAAK,WAAW,OAAQ,EAAI,CACrC,EACAA,EAAe,UAAU,UAAY,UAAY,CAC/C,OAAO,KAAK,OACd,EACAA,EAAe,UAAU,UAAY,UAAY,CAC/C,GAAI,KAAK,QACP,OAAO,KAAK,QAGd,IAAIQ,EAAS,KAAK,uBAAuB,SAAU,CACjD,WAAY,GACZ,UAAW,GACX,WAAY,EACd,CAAC,EAAE,OAAO,CAAC,EACX,OAAIA,EACEA,EAAO,UAAY,UACrBA,EAAS,MAQXA,EAAS,KAAK,QAAQ,gBAAgB,CACpC,SAAU,SACV,QAAS,OACX,CAAC,EAAE,CAAC,EAEN,KAAK,QAAU,CACb,gBAAiBA,CACnB,EACO,KAAK,OACd,EACAR,EAAe,KAAO,YACtBA,EAAe,WAAa,MAE5BA,EAAe,aAAe,CAAC,SAAU,KAAK,EAC9CA,EAAe,cAAgB,CAC7B,KAAM,GACN,MAAO,EACP,OAAQ,EACR,OAAQ,MACR,MAAO,MACP,UAAW,CAET,YAAaW,EAAO,MAAM,OAC1B,YAAa,CACf,EACA,YAAa,CACX,YAAa,EACb,MAAOA,EAAO,MAAM,UACpB,YAAaA,EAAO,MAAM,UAC1B,QAAS,EACX,EACA,EAAG,EACL,EACOX,CACT,GAAEY,EAAc,EC/EhB,IAAIC,KAA6B,SAAUC,EAAQ,CACjDC,EAAUF,EAAeC,CAAM,EAC/B,SAASD,GAAgB,CACvB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAOH,EAAc,KACpBG,CACT,CACA,OAAAH,EAAc,UAAU,OAAS,SAAUI,EAAgBC,EAASC,EAAK,CAMvE,GALA,KAAK,KAAOA,EACZ,KAAK,OAASF,EACT,KAAK,YACR,KAAK,UAAY,IAAIG,IAEnB,CAAC,KAAK,WAAW,EAAG,CACtB,KAAK,OAAO,EACZ,MACF,CACA,KAAK,eAAiBD,EAAI,sBAAsB,EAChD,IAAIE,EAAQ,KAAK,MACjBA,EAAM,UAAU,EAChB,IAAIC,EAAiBL,EAAe,SAAS,WAAW,EACpDM,EAAYD,EAAe,aAAa,EACxCC,EAAU,MAAQ,OACpBA,EAAU,KAAOL,EAAQ,IAAI,iBAAiB,GAAKM,EAAO,MAAM,WAElE,IAAIC,EAAeC,GAAyBT,EAAgBE,CAAG,EAAE,aAC7DQ,EAAUC,GAAcC,GAAmBZ,EAAgB,EAAI,EAAGQ,CAAY,EAC9EK,EAAiBP,EAAU,WAAa,EACxCQ,EAAc,KAAK,aAAeC,GAAmBL,EAAQ,MAAM,EAAGG,EAAiB,EAAG,GAAM,EAAI,EACpGG,EAAe,IAAIC,GACvBb,EAAM,IAAIY,CAAY,EACtBA,EAAa,YAAY,IAAIE,GAAK,CAChC,MAAOJ,EAAY,MAAM,CAC3B,CAAC,CAAC,EACF,IAAIK,EAAc,KAAK,aAAe,IAAIF,GAC1CD,EAAa,IAAIG,CAAW,EAE5B,IAAIC,EAAcV,EAAQ,MAAM,EAChCU,EAAY,EAAIf,EAAe,WAAW,eAAgB,EAAI,EAC9DD,EAAM,IAAI,KAAK,QAAU,IAAIc,GAAK,CAChC,MAAOZ,EACP,MAAOc,EACP,OAAQ,GACR,OAAQ,MACV,CAAC,CAAC,EACF,IAAIC,EAAmBrB,EAAe,SAAS,aAAa,EACxDsB,EAAUD,EAAiB,WAAW,eAAgB,EAAI,EAC9DL,EAAa,IAAI,KAAK,YAAc,IAAIE,GAAK,CAC3C,MAAO,CACL,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACR,EAAGI,CACL,EACA,MAAOD,EAAiB,aAAa,EACrC,OAAQ,GACR,OAAQ,MACV,CAAC,CAAC,EACF,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvBE,IAAQvB,EAAgB,IAAI,CAC9B,EAKAJ,EAAc,UAAU,cAAgB,SAAU4B,EAAgB,CAChE,KAAK,gBAAkBA,EACnB,KAAK,WAAW,IAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvBD,IAAQ,KAAK,OAAQ,IAAI,EAE7B,EACA3B,EAAc,UAAU,mBAAqB,UAAY,CACvD,IAAI4B,EAAiB,KAAK,gBAC1B,GAAI,GAACA,GAAkBA,EAAe,gBAAkB,KAAK,gBAG7D,KAAIL,EAAc,KAAK,aACnBM,EAAW,KAAK,UAChBX,EAAc,KAAK,aAEvB,GADAK,EAAY,UAAU,EAClB,EAACK,EAGL,KAAIE,EAAcF,EAAe,MAC7BG,EAAaD,EAAY,gBAAgB,EAC7CP,EAAY,IAAIO,CAAW,EAC3B,KAAK,QAAQ,GAAKF,EAAe,QAAQ,IAAM,GAC/CC,EAAS,gBAAgBE,EAAW,EAAGA,EAAW,EAAGA,EAAW,MAAOA,EAAW,MAAM,EAExF,IAAIC,EAAWjB,GAAc,CAC3B,KAAM,SACN,IAAK,SACL,OAAQgB,EAAW,MAAQA,EAAW,MACxC,EAAGb,CAAW,EACdW,EAAS,YAAYG,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EAC5EF,EAAY,KAAKD,EAAS,iBAAiB,EAAE,GAAG,EAChD,KAAK,YAAY,GAAKD,EAAe,QAAQ,IAAM,GACnD,KAAK,qBAAqBA,EAAe,QAAQ,GACnD,EAKA5B,EAAc,UAAU,aAAe,SAAUiC,EAAO,CACtD,IAAIL,EAAiB,KAAK,gBACtBA,GAAkBA,EAAe,gBAAkBK,EAAM,gBAC3DL,EAAe,YAAcK,EAAM,aAEjC,KAAK,WAAW,GAClB,KAAK,kBAAkB,CAE3B,EACAjC,EAAc,UAAU,kBAAoB,UAAY,CACtD,IAAI4B,EAAiB,KAAK,gBAC1B,GAAI,GAACA,GAAkBA,EAAe,gBAAkB,KAAK,gBAG7D,KAAIM,EAAwBC,GAAO,CAAC,EAAGP,EAAe,WAAW,EAC7DQ,EAA2BC,GAAI,CAAC,EAAG,KAAK,UAAU,UAAWH,CAAc,EAC/E,KAAK,mBAA4BC,GAAO,CAAC,EAAGC,CAAiB,EAC7D,IAAIE,EAAeV,EAAe,aAC7BU,EAGHA,EAAeA,EAAa,MAAM,EAFlCA,EAAe,IAAIC,GAAa,EAAG,EAAG,KAAK,KAAK,SAAS,EAAG,KAAK,KAAK,UAAU,CAAC,EAInFD,EAAa,eAAeF,CAAiB,EAC7C,IAAII,EAAa,KAAK,YAClBC,EAAID,EAAW,MAAM,EACzBA,EAAW,SAASE,GAAS,CAC3B,EAAGD,CACL,EAAGH,CAAY,CAAC,EAClB,EACAtC,EAAc,UAAU,qBAAuB,SAAU2C,EAAU,CACjE,IAAIxC,EAAQ,KACRG,EAAM,KAAK,KACXsC,EAAiB,KAAK,gBAI1B,GAHKA,IACHA,EAAiB,KAAK,gBAAkB,IAAIC,GAAevC,EAAI,MAAM,CAAC,GAEpE,CAACqC,GAAY,CAAC,KAAK,WAAW,EAAG,CACnCC,EAAe,QAAQ,EACvB,MACF,CACAA,EAAe,OAAOD,EAAU,CAC9B,IAAKrC,EACL,MAAO,CACL,UAAW,KAAK,MAClB,EACA,YAAa,CACX,YAAa,KACb,SAAU,SAAUwC,EAAGC,EAAGC,EAAG,CAC3B,OAAO7C,EAAM,aAAa,QAAQ4C,EAAGC,CAAC,CACxC,CACF,CACF,CAAC,EACDJ,EAAe,IAAI,KAAK,EAAE,IAAI,MAAM,EAAE,GAAG,MAAOK,GAAK,KAAK,OAAQ,IAAI,CAAC,EAAE,GAAG,OAAQA,GAAK,KAAK,QAAS,IAAI,CAAC,CAC9G,EACAjD,EAAc,UAAU,OAAS,SAAUkD,EAAO,CAChD,IAAIC,EAAQ,KAAK,mBACjB,GAAI,GAAC,KAAK,WAAW,GAAK,CAACA,GAG3B,KAAIC,EAAYC,GAAe,CAAC,EAAG,CAACH,EAAM,KAAMA,EAAM,IAAI,EAAGC,CAAK,EAC9DG,EAAYD,GAAe,CAAC,EAAG,CAACH,EAAM,KAAOA,EAAM,GAAIA,EAAM,KAAOA,EAAM,EAAE,EAAGC,CAAK,EACxF,KAAK,KAAK,eAAeI,IAAgB,KAAK,OAAO,UAAU,EAAE,gBAAiB,CAChF,GAAID,EAAU,CAAC,EAAIF,EAAU,CAAC,EAC9B,GAAIE,EAAU,CAAC,EAAIF,EAAU,CAAC,CAChC,CAAC,CAAC,EACJ,EACApD,EAAc,UAAU,QAAU,SAAUkD,EAAO,CACjD,IAAIC,EAAQ,KAAK,mBACjB,GAAI,GAAC,KAAK,WAAW,GAAK,CAACA,GAG3B,KAAIK,EAASH,GAAe,CAAC,EAAG,CAACH,EAAM,QAASA,EAAM,OAAO,EAAGC,CAAK,EACrE,KAAK,KAAK,eAAeI,IAAgB,KAAK,OAAO,UAAU,EAAE,gBAAiB,CAChF,KAAM,EAAIL,EAAM,MAChB,QAASM,EAAO,CAAC,EACjB,QAASA,EAAO,CAAC,CACnB,CAAC,CAAC,EACJ,EAKAxD,EAAc,UAAU,WAAa,UAAY,CAC/C,IAAII,EAAiB,KAAK,OAC1B,GAAI,CAACA,GAAkB,CAACA,EAAe,WAAW,EAChD,MAAO,GAET,IAAIqD,EAAkBrD,EAAe,UAAU,EAAE,gBACjD,MAAK,EAAAqD,CAIP,EACAzD,EAAc,UAAU,OAAS,UAAY,CAC3C,KAAK,MAAM,UAAU,EACrB,KAAK,gBAAkB,KACnB,KAAK,iBACP,KAAK,gBAAgB,QAAQ,CAEjC,EACAA,EAAc,UAAU,OAAS,UAAY,CAC3C,KAAK,OAAO,CACd,EACAA,EAAc,UAAU,QAAU,UAAY,CAC5C,KAAK,OAAO,CACd,EACAA,EAAc,KAAO,YACdA,CACT,GAAE0D,EAAa,EAEf,SAASC,IAAgBC,EAAiBC,EAAQ,CAChD,IAAIC,EAAOF,EAAgB,WAAa,SAAWA,EAAgB,QAAU,OAC3EA,EAAgB,SAAW,OACzBG,EAAU,CACZ,KAAMD,CACR,EACA,OAAAC,EAAQH,EAAgB,SAAW,IAAI,EAAIA,EAAgB,GAC3DI,EAAOD,EAASF,CAAM,EACfE,CACT,CACA,SAASE,IAAQC,EAAgBC,EAAe,CAC9C,IAAIC,EAAQC,GAAcH,CAAc,EACxCI,GAAgBH,EAAc,MAAOC,EAAM,EAAGA,EAAM,MAAM,CAC5D,CChPO,SAASG,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAc,EAC/CD,EAAU,sBAAsBE,GAAa,CAC/C,CCFA,IAAIC,IAAiB,CACnB,MAAO,CACL,QAAS,EACX,EACA,MAAO,CACL,KAAM,EACR,CACF,EACIC,IAAQC,GAAU,EAClBC,IAAoB,CAAC,EACV,SAARC,GAA4BC,EAASC,EAAK,CAC/C,IAAIC,EAAYF,EAAQ,SAAS,MAAM,EAEvC,GAAI,CAACE,EAAU,IAAI,SAAS,EAC1B,OAEF,IAAIC,EAAuBC,GAAMT,GAAc,EACxCU,GAAMF,EAAc,MAAOH,EAAQ,eAAe,EAAE,IAAI,MAAM,EAAG,EAAK,EACtEK,GAAMH,EAAU,OAAQC,EAAe,EAAK,EACnDG,EAAS,EACTC,EAAS,EACT,SAASD,GAAW,CAClB,IAAIE,EAAaN,EAAU,SAAS,OAAO,EACvCO,EAAWD,EAAW,IAAI,MAAM,EACpC,GAAIC,EAAU,CAGZ,IAAIC,EAAmCC,GAAc,EACrDX,EAAQ,WAAW,SAAUY,EAAa,CACxC,GAAI,CAAAA,EAAY,gBAAgB,EAGhC,KAAIC,EAAaH,EAA0B,IAAIE,EAAY,IAAI,EAC1DC,IACHA,EAAa,CAAC,EACdH,EAA0B,IAAIE,EAAY,KAAMC,CAAU,GAE5DjB,IAAMgB,CAAW,EAAE,MAAQC,EAC7B,CAAC,EACDb,EAAQ,cAAc,SAAUY,EAAa,CAC3C,GAAIZ,EAAQ,iBAAiBY,CAAW,EACtC,OAEF,GAAWE,GAAWF,EAAY,eAAe,EAAG,CAElDA,EAAY,gBAAgB,EAC5B,MACF,CACA,IAAIG,EAAOH,EAAY,QAAQ,EAC/B,GAAKA,EAAY,gBAAgB,EAgB1B,CACL,IAAII,EAAeC,GAAoBL,EAAY,QAASA,EAAY,KAAMd,IAAmBE,EAAQ,eAAe,CAAC,EACrHkB,EAAiBH,EAAK,UAAU,OAAO,EAC3CA,EAAK,UAAU,QAASI,EAAWD,EAAgBF,CAAY,CAAC,CAClE,KApBoC,CAClC,IAAII,EAAYR,EAAY,WAAW,EACnCS,EAAW,CAAC,EACZC,EAAe1B,IAAMgB,CAAW,EAAE,MACtCG,EAAK,KAAK,SAAUQ,EAAK,CACvB,IAAIC,EAAST,EAAK,YAAYQ,CAAG,EACjCF,EAASG,CAAM,EAAID,CACrB,CAAC,EACD,IAAIE,EAAcL,EAAU,MAAM,EAClCA,EAAU,KAAK,SAAUI,EAAQ,CAC/B,IAAID,EAAMF,EAASG,CAAM,EACrBE,EAAON,EAAU,QAAQI,CAAM,GAAKA,EAAS,GAC7CR,EAAeC,GAAoBL,EAAY,QAASc,EAAMJ,EAAcG,CAAW,EACvFP,EAAiBH,EAAK,cAAcQ,EAAK,OAAO,EACpDR,EAAK,cAAcQ,EAAK,QAASJ,EAAWD,EAAgBF,CAAY,CAAC,CAC3E,CAAC,CACH,CAKA,SAASG,EAAWD,EAAgBF,EAAc,CAGhD,IAAIW,EAAcT,EAAwBU,EAAcA,EAAO,CAAC,EAAGZ,CAAY,EAAGE,CAAc,EAAIF,EACpG,OAAAW,EAAY,MAAQ,GACbA,CACT,CACF,CAAC,CACH,CACF,CACA,SAASpB,GAAW,CAClB,IAAIsB,EAAM5B,EAAI,MAAM,EAAE,IAEtB,GAAK4B,EAGL,KAAIC,EAAc9B,EAAQ,eAAe,EAAE,IAAI,MAAM,EACjD+B,EAAa7B,EAAU,SAAS,OAAO,EAE3C,GADA6B,EAAW,OAAgBC,GAASD,EAAW,OAAQD,CAAW,EAC9D,EAACC,EAAW,IAAI,SAAS,EAI7B,IADAF,EAAI,aAAa,OAAQ,KAAK,EAC1BE,EAAW,IAAI,aAAa,EAAG,CACjCF,EAAI,aAAa,aAAcE,EAAW,IAAI,aAAa,CAAC,EAC5D,MACF,CACA,IAAIE,EAAYjC,EAAQ,eAAe,EACnCkC,EAAaH,EAAW,IAAI,CAAC,OAAQ,UAAU,CAAC,GAAK,GACrDI,EAAeJ,EAAW,IAAI,CAAC,SAAU,UAAU,CAAC,GAAK,GACzDK,EAAmB,KAAK,IAAIH,EAAWE,CAAY,EACnDE,EACJ,GAAI,EAAAJ,EAAY,GAGT,CACL,IAAIK,EAAQC,EAAS,EACrB,GAAID,EAAO,CACT,IAAIE,EAAYT,EAAW,IAAI,CAAC,UAAW,WAAW,CAAC,EACvDM,EAAYI,EAAQD,EAAW,CAC7B,MAAOF,CACT,CAAC,CACH,MACED,EAAYN,EAAW,IAAI,CAAC,UAAW,cAAc,CAAC,EAExD,IAAIW,EAAiB,CAAC,EAClBC,EAASV,EAAY,EAAIF,EAAW,IAAI,CAAC,SAAU,WAAY,QAAQ,CAAC,EAAIA,EAAW,IAAI,CAAC,SAAU,SAAU,QAAQ,CAAC,EAC7HM,GAAaI,EAAQE,EAAQ,CAC3B,YAAaV,CACf,CAAC,EACDjC,EAAQ,WAAW,SAAUY,EAAaW,EAAK,CAC7C,GAAIA,EAAMa,EAAkB,CAC1B,IAAIQ,EAAc,OACdC,EAAajC,EAAY,IAAI,MAAM,EACnCkC,EAAWD,EAAa,WAAa,cACzCD,EAAcX,EAAY,EAAIF,EAAW,IAAI,CAAC,SAAU,WAAYe,CAAQ,CAAC,EAAIf,EAAW,IAAI,CAAC,SAAU,SAAUe,CAAQ,CAAC,EAC9HF,EAAcH,EAAQG,EAAa,CACjC,SAAUhC,EAAY,YACtB,WAAYA,EAAY,IAAI,MAAM,EAClC,WAAYmC,EAAkBnC,EAAY,OAAO,CACnD,CAAC,EACD,IAAIG,EAAOH,EAAY,QAAQ,EAC/B,GAAIG,EAAK,MAAM,EAAImB,EAAY,CAE7B,IAAIc,EAAejB,EAAW,IAAI,CAAC,OAAQ,aAAa,CAAC,EACzDa,GAAeH,EAAQO,EAAc,CACnC,WAAYd,CACd,CAAC,CACH,MACEU,GAAeb,EAAW,IAAI,CAAC,OAAQ,SAAS,CAAC,EAMnD,QAJIkB,EAAoBlB,EAAW,IAAI,CAAC,OAAQ,YAAa,QAAQ,CAAC,EAClEmB,EAAiBnB,EAAW,IAAI,CAAC,OAAQ,YAAa,KAAK,CAAC,EAC5DoB,EAAuBpB,EAAW,IAAI,CAAC,OAAQ,oBAAoB,CAAC,EACpEqB,EAAa,CAAC,EACTC,EAAI,EAAGA,EAAItC,EAAK,MAAM,EAAGsC,IAChC,GAAIA,EAAInB,EAAY,CAClB,IAAIoB,EAASvC,EAAK,QAAQsC,CAAC,EACvBE,EAASJ,EAAkDK,GAAOzC,EAAK,UAAUsC,CAAC,EAAG,SAAUI,GAAGC,GAAG,CACvG,OAAcC,GAAQR,EAAsBO,EAAC,IAAM,EACrD,CAAC,EAFmC3C,EAAK,UAAUsC,CAAC,EAGhDO,EAAY7B,EAAW,IAAI,CAAC,OAAQuB,EAAS,WAAa,aAAa,CAAC,EAC5EF,EAAW,KAAKX,EAAQmB,EAAW,CACjC,KAAMN,EACN,MAAOC,EAAM,KAAKN,CAAiB,CACrC,CAAC,CAAC,CACJ,CAEFL,GAAeQ,EAAW,KAAKH,CAAiB,EAAIC,EACpDR,EAAe,KAAKE,CAAW,CACjC,CACF,CAAC,EACD,IAAIiB,EAAiB9B,EAAW,SAAS,CAAC,SAAU,WAAY,WAAW,CAAC,EACxE+B,EAAkBD,EAAe,IAAI,QAAQ,EAC7CE,EAAeF,EAAe,IAAI,KAAK,EAC3CxB,GAAaK,EAAe,KAAKoB,CAAe,EAAIC,EACpDlC,EAAI,aAAa,aAAcQ,CAAS,CAC1C,GACF,CACA,SAASI,EAAQuB,EAAKC,EAAW,CAC/B,GAAI,CAAQC,GAASF,CAAG,EACtB,OAAOA,EAET,IAAIG,EAASH,EACb,OAAOI,EAAKH,EAAW,SAAUV,EAAOc,EAAK,CAC3CF,EAASA,EAAO,QAAQ,IAAI,OAAO,UAAYE,EAAM,UAAW,GAAG,EAAGd,CAAK,CAC7E,CAAC,EACMY,CACT,CACA,SAAS5B,GAAW,CAClB,IAAID,EAAQtC,EAAQ,IAAI,OAAO,EAC/B,OAAIsC,GAASA,EAAM,SACjBA,EAAQA,EAAM,CAAC,GAEVA,GAASA,EAAM,IACxB,CACA,SAASS,EAAkBuB,EAAM,CAC/B,IAAIC,EAAYvE,EAAQ,eAAe,EAAE,IAAI,CAAC,SAAU,WAAW,CAAC,EACpE,OAAOuE,EAAUD,CAAI,GAAKC,EAAU,KACtC,CACF,CChMe,SAARC,GAAkCC,EAAQ,CAC/C,GAAI,GAACA,GAAU,CAACA,EAAO,MAGvB,KAAIC,EAAOD,EAAO,KAEdC,EAAK,MAAQ,OACfA,EAAK,QAAUA,EAAK,MAEtBA,EAAK,MAAQA,EAAK,OAAS,CAAC,EAErBC,EAAK,CAAC,cAAe,UAAW,SAAU,MAAM,EAAG,SAAUC,EAAM,CACpEF,EAAKE,CAAI,GAAK,OAChBF,EAAK,MAAME,CAAI,EAAIF,EAAKE,CAAI,EAEhC,CAAC,EACH,CCfO,SAASC,GAAQC,EAAW,CACjCA,EAAU,qBAAqBC,EAAgB,EAC/CD,EAAU,eAAeA,EAAU,SAAS,OAAO,KAAME,EAAU,CACrE,CCDA,IAAIC,IAAqC,CACvC,MAAO,KAEP,IAAK,KACL,KAAM,MACN,IAAK,KACL,KAAM,MACN,IAAK,KACL,KAAM,KACN,KAAM,IAUR,EAEIC,KAA+B,UAAY,CAC7C,SAASA,EAAgBC,EAAM,CAE7B,IAAIC,EAAY,KAAK,SAAWC,GAASF,CAAI,EAAI,IAAI,OAAOA,CAAI,EAAIG,IAASH,CAAI,EAAIA,EAAO,KAC5F,GAAIC,GAAa,KAAM,CACrB,IAAIG,EAAS,GAIbC,GAAWD,CAAM,CACnB,CACF,CACA,OAAAL,EAAgB,UAAU,SAAW,SAAUO,EAAM,CACnD,IAAIC,EAAO,OAAOD,EAClB,OAAOJ,GAASK,CAAI,EAAI,KAAK,SAAS,KAAKD,CAAI,EAAIE,GAASD,CAAI,EAAI,KAAK,SAAS,KAAKD,EAAO,EAAE,EAAI,EACtG,EACOP,CACT,GAAE,EACEU,KAAsC,UAAY,CACpD,SAASA,GAAyB,CAAC,CACnC,OAAAA,EAAuB,UAAU,SAAW,UAAY,CACtD,OAAO,KAAK,KACd,EACOA,CACT,GAAE,EACEC,KAAoC,UAAY,CAClD,SAASA,GAAuB,CAAC,CACjC,OAAAA,EAAqB,UAAU,SAAW,UAAY,CAEpD,QADIC,EAAW,KAAK,SACXC,EAAI,EAAGA,EAAID,EAAS,OAAQC,IACnC,GAAI,CAACD,EAASC,CAAC,EAAE,SAAS,EACxB,MAAO,GAGX,MAAO,EACT,EACOF,CACT,GAAE,EACEG,KAAmC,UAAY,CACjD,SAASA,GAAsB,CAAC,CAChC,OAAAA,EAAoB,UAAU,SAAW,UAAY,CAEnD,QADIF,EAAW,KAAK,SACXC,EAAI,EAAGA,EAAID,EAAS,OAAQC,IACnC,GAAID,EAASC,CAAC,EAAE,SAAS,EACvB,MAAO,GAGX,MAAO,EACT,EACOC,CACT,GAAE,EACEC,KAAoC,UAAY,CAClD,SAASA,GAAuB,CAAC,CACjC,OAAAA,EAAqB,UAAU,SAAW,UAAY,CACpD,MAAO,CAAC,KAAK,MAAM,SAAS,CAC9B,EACOA,CACT,GAAE,EACEC,KAA2C,UAAY,CACzD,SAASA,GAA8B,CAAC,CACxC,OAAAA,EAA4B,UAAU,SAAW,UAAY,CAO3D,QANIC,EAAY,CAAC,CAAC,KAAK,YAEnBC,EAAW,KAAK,SAChBC,EAAYD,EAAS,KAAK,gBAAgB,EAC1CE,EAAeH,EAAY,KAAK,YAAYE,CAAS,EAAI,KAEpDN,EAAI,EAAGA,EAAI,KAAK,YAAY,OAAQA,IAC3C,GAAI,CAAC,KAAK,YAAYA,CAAC,EAAE,SAASI,EAAYG,EAAeD,CAAS,EACpE,MAAO,GAGX,MAAO,EACT,EACOH,CACT,GAAE,EACF,SAASK,GAAYC,EAAYC,EAAS,CACxC,GAAID,IAAe,IAAQA,IAAe,GAAO,CAC/C,IAAIE,EAAO,IAAId,IACf,OAAAc,EAAK,MAAQF,EACNE,CACT,CACA,IAAInB,EAAS,GAOb,OANKoB,IAAiBH,CAAU,GAI9BhB,GAAWD,CAAM,EAEfiB,EAAW,IACNI,IAAiB,MAAOJ,EAAYC,CAAO,EACzCD,EAAW,GACbI,IAAiB,KAAMJ,EAAYC,CAAO,EACxCD,EAAW,IACbK,IAAeL,EAAYC,CAAO,EAEpCK,IAAsBN,EAAYC,CAAO,CAClD,CACA,SAASG,IAAiBG,EAAIP,EAAYC,EAAS,CACjD,IAAIO,EAAeR,EAAWO,CAAE,EAC5BxB,EAAS,GAIR0B,EAAQD,CAAY,GACvBxB,GAAWD,CAAM,EAEdyB,EAAa,QAChBxB,GAAWD,CAAM,EAEnB,IAAImB,EAAOK,IAAO,MAAQ,IAAIlB,IAAyB,IAAIG,IAC3D,OAAAU,EAAK,SAAWQ,EAAIF,EAAc,SAAUG,EAAW,CACrD,OAAOZ,GAAYY,EAAWV,CAAO,CACvC,CAAC,EACIC,EAAK,SAAS,QACjBlB,GAAWD,CAAM,EAEZmB,CACT,CACA,SAASG,IAAeL,EAAYC,EAAS,CAC3C,IAAIU,EAAYX,EAAW,IACvBjB,EAAS,GAIRoB,IAAiBQ,CAAS,GAC7B3B,GAAWD,CAAM,EAEnB,IAAImB,EAAO,IAAIT,IACf,OAAAS,EAAK,MAAQH,GAAYY,EAAWV,CAAO,EACtCC,EAAK,OACRlB,GAAWD,CAAM,EAEZmB,CACT,CACA,SAASI,IAAsBN,EAAYC,EAAS,CAOlD,QANIlB,EAAS,GACT6B,EAAmBX,EAAQ,gBAAgBD,CAAU,EACrDa,EAAc,CAAC,EACfC,EAAWC,GAAKf,CAAU,EAC1BgB,EAAahB,EAAW,OACxBiB,EAAcD,EAAaE,GAAkBF,CAAU,EAAI,KACtDzB,EAAI,EAAGA,EAAIuB,EAAS,OAAQvB,IAAK,CACxC,IAAI4B,EAASL,EAASvB,CAAC,EACvB,GAAI,EAAA4B,IAAW,UAAYlB,EAAQ,mBAAmB,IAAIkB,CAAM,GAGhE,KAAIZ,EAAKa,GAAO3C,IAAoC0C,CAAM,EAAI1C,IAAmC0C,CAAM,EAAIA,EACvGE,EAAerB,EAAWmB,CAAM,EAChCG,EAAkBL,EAAcA,EAAYI,CAAY,EAAIA,EAC5DE,EAAYC,IAAuBjB,EAAIe,CAAe,GAAKf,IAAO,OAAS,IAAI7B,IAAgB4C,CAAe,EAC7GC,GAIHvC,GAAWD,CAAM,EAEnB8B,EAAY,KAAKU,CAAS,EAC5B,CACKV,EAAY,QAKf7B,GAAWD,CAAM,EAEnB,IAAImB,EAAO,IAAIR,IACf,OAAAQ,EAAK,iBAAmBU,EACxBV,EAAK,YAAce,EACnBf,EAAK,SAAWD,EAAQ,SACxBC,EAAK,YAAcW,EACZX,CACT,CACA,SAASC,IAAiBsB,EAAK,CAC7B,OAAOC,GAASD,CAAG,GAAK,CAACE,GAAYF,CAAG,CAC1C,CACA,IAAIG,KAA2C,UAAY,CACzD,SAASA,EAA4B5B,EAAYC,EAAS,CACxD,KAAK,MAAQF,GAAYC,EAAYC,CAAO,CAC9C,CACA,OAAA2B,EAA4B,UAAU,SAAW,UAAY,CAC3D,OAAO,KAAK,MAAM,SAAS,CAC7B,EACOA,CACT,GAAE,EAEK,SAASC,IAA2B7B,EAAYC,EAAS,CAC9D,OAAO,IAAI2B,IAA4B5B,EAAYC,CAAO,CAC5D,CClNO,IAAI6B,IAAkB,CAC3B,KAAM,iBAEN,UAAW,SAAUC,EAAQ,CAoC3B,QA/BIC,EAAWD,EAAO,SAClBE,EACAC,EAAYC,IAA2BJ,EAAO,OAAQ,CACxD,mBAAoBK,GAAc,CAChC,UAAW,EACb,CAAC,EACD,gBAAiB,SAAUC,EAAY,CACrC,IAAIC,EAAS,GACTC,EAAWF,EAAW,UACrBG,GAAOH,EAAY,WAAW,GAIjCI,GAAWH,CAAM,EAEnB,IAAII,EAAUV,EAAS,iBAAiBO,CAAQ,EAChD,OAAKG,GAIHD,GAAWH,CAAM,EAEZ,CACL,OAAQI,EAAQ,KAClB,CACF,EACA,SAAU,SAAUC,EAAO,CACzB,OAAOX,EAAS,sBAAsBC,EAASU,EAAM,MAAM,CAC7D,CACF,CAAC,EACGC,EAAa,CAAC,EACTC,EAAI,EAAGC,EAAMd,EAAS,MAAM,EAAGa,EAAIC,EAAKD,IAC/CZ,EAAUD,EAAS,eAAea,CAAC,EAC/BX,EAAU,SAAS,GACrBU,EAAW,KAAKX,CAAO,EAG3B,MAAO,CACL,KAAMW,CACR,CACF,CACF,EC3CO,IAAIG,IAAgB,CACzB,KAAM,eACN,UAAW,SAAUC,EAAQ,CAC3B,IAAIC,EAAWD,EAAO,SAClBE,EAASF,EAAO,OAChBG,EAAS,GAKTC,EAAgBC,GAAiBH,CAAM,EACtCE,EAAc,QAIjBE,GAAWH,CAAM,EAEnB,IAAII,EAAe,CAAC,EACpBC,EAAKJ,EAAe,SAAUK,EAAW,CACvC,IAAIC,EAAWD,EAAU,UACrBE,EAAQF,EAAU,MAClBG,EAAaH,EAAU,OACvBI,EAAeJ,EAAU,aAa7B,GAZIC,GAAY,MAIdJ,GAAWH,CAAM,EAEfQ,IAAU,OAASA,IAAU,QAI/BL,GAAWH,CAAM,EAEfU,GAAgBA,IAAiB,OAASA,IAAiB,MAAO,CACpE,IAAIC,EAAW,GAIfR,GAAWQ,CAAQ,CACrB,CACA,GAAIH,IAAU,OAASA,IAAU,OAAQ,CACvC,IAAII,EAAW,GAIfT,GAAWS,CAAQ,CACrB,CACA,IAAIC,EAAUf,EAAS,iBAAiBS,CAAQ,EAC3CM,GAIHV,GAAWH,CAAM,EAEnB,IAAIc,EAASL,EAAaM,GAAkBN,CAAU,EAAI,KACtDA,GAAc,CAACK,GAIjBX,GAAWH,CAAM,EAEnBI,EAAa,KAAK,CAChB,OAAQS,EAAQ,MAChB,OAAQC,EACR,WAAY,IAAIE,GAAoBR,EAAOE,CAAY,CACzD,CAAC,CACH,CAAC,EAED,IAAIO,EAAenB,EAAS,aACxBmB,IAAiBC,IAA4BD,IAAiBE,IAIhEhB,GAAWH,CAAM,EAInB,QADIoB,EAAa,CAAC,EACTC,EAAI,EAAGC,EAAMxB,EAAS,MAAM,EAAGuB,EAAIC,EAAKD,IAC/CD,EAAW,KAAKtB,EAAS,eAAeuB,CAAC,CAAC,EAE5C,OAAAD,EAAW,KAAK,SAAUG,EAAOC,EAAO,CACtC,QAASH,EAAI,EAAGA,EAAIjB,EAAa,OAAQiB,IAAK,CAC5C,IAAII,EAAWrB,EAAaiB,CAAC,EACzBK,EAAO5B,EAAS,sBAAsByB,EAAOE,EAAS,MAAM,EAC5DE,EAAO7B,EAAS,sBAAsB0B,EAAOC,EAAS,MAAM,EAC5DA,EAAS,SACXC,EAAOD,EAAS,OAAOC,CAAI,EAC3BC,EAAOF,EAAS,OAAOE,CAAI,GAE7B,IAAIC,EAASH,EAAS,WAAW,SAASC,EAAMC,CAAI,EACpD,GAAIC,IAAW,EACb,OAAOA,CAEX,CACA,MAAO,EACT,CAAC,EACM,CACL,KAAMR,CACR,CACF,CACF,EC7GO,SAASS,GAAQC,EAAW,CACjCA,EAAU,kBAAkBC,GAAe,EAC3CD,EAAU,kBAAkBE,GAAa,CAC3C,CCQA,IAAIC,KAA4B,SAAUC,EAAQ,CAChDC,EAAUF,EAAcC,CAAM,EAC9B,SAASD,GAAe,CACtB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAO,UACNA,CACT,CACA,OAAAH,EAAa,UAAU,KAAO,SAAUI,EAAQC,EAAaC,EAAS,CACpEL,EAAO,UAAU,KAAK,KAAK,KAAMG,EAAQC,EAAaC,CAAO,EAC7D,KAAK,eAAiB,IAAIC,GAAc,IAAI,EAC5CC,GAA4B,IAAI,CAClC,EACAR,EAAa,UAAU,YAAc,SAAUS,EAAWH,EAAS,CACjEL,EAAO,UAAU,YAAY,KAAK,KAAMQ,EAAWH,CAAO,EAC1DE,GAA4B,IAAI,CAClC,EACAR,EAAa,UAAU,cAAgB,UAAY,CACjD,KAAK,eAAe,MAAM,CAC5B,EACAA,EAAa,UAAU,iBAAmB,UAAY,CACpD,OAAO,KAAK,cACd,EACAA,EAAa,KAAO,UACpBA,EAAa,cAAgB,CAC3B,eAAgBU,EAClB,EACOV,CACT,GAAEW,EAAc,EAEhB,IAAIC,KAA2B,SAAUC,EAAQ,CAC/CC,EAAUF,EAAaC,CAAM,EAC7B,SAASD,GAAc,CACrB,IAAIG,EAAQF,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,KAChE,OAAAE,EAAM,KAAO,UACNA,CACT,CACA,OAAAH,EAAY,KAAO,UACZA,CACT,GAAEI,EAAa,EACR,SAASC,GAAQC,EAAW,CACjCA,EAAU,uBAAuBC,GAAY,EAC7CD,EAAU,sBAAsBN,GAAW,CAC7C,CChGA,IAAIQ,GAAMC,GAAU,IACpB,SAASC,GAAYC,EAAGC,EAAG,CACvB,OAAO,KAAK,IAAID,EAAIC,CAAC,EAAI,IAC7B,CACO,SAASC,GAAmBC,EAAM,CACrC,IAAIC,EAAOD,EAAK,KACZE,EAAMF,EAAK,IAAI,EACfG,EAAoB,CAAC,EACrBC,EACAC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAK,EACT,SAASC,EAAiBC,EAAGC,EAAG,CACxBP,GAAkBA,EAAe,OAAS,GAC1CD,EAAkB,KAAKC,CAAc,EAEzCA,EAAiB,CAACM,EAAGC,CAAC,CAC1B,CACA,SAASC,EAAQL,EAAIC,EAAIK,EAAIC,EAAI,CACvBlB,GAAYW,EAAIM,CAAE,GAAKjB,GAAYY,EAAIM,CAAE,GAC3CV,EAAe,KAAKG,EAAIC,EAAIK,EAAIC,EAAID,EAAIC,CAAE,CAElD,CACA,SAASC,EAAOC,EAAYC,EAAUC,EAAIC,EAAIC,EAAIC,EAAI,CAClD,IAAIC,EAAQ,KAAK,IAAIL,EAAWD,CAAU,EACtCd,EAAM,KAAK,IAAIoB,EAAQ,CAAC,EAAI,EAAI,EAChCC,EAAMN,EAAWD,EAAa,GAAK,EACnCQ,EAAK,KAAK,IAAIR,CAAU,EACxBS,GAAK,KAAK,IAAIT,CAAU,EACxBU,GAAK,KAAK,IAAIT,CAAQ,EACtBU,GAAK,KAAK,IAAIV,CAAQ,EACtBJ,GAAKW,EAAKJ,EAAKF,EACfJ,GAAKW,GAAKJ,EAAKF,EACfS,EAAKF,GAAKN,EAAKF,EACfW,EAAKF,GAAKN,EAAKF,EACfW,GAAKV,EAAKlB,EAAMqB,EAChBQ,GAAKV,EAAKnB,EAAMqB,EACpBnB,EAAe,KAAKS,GAAKiB,GAAKL,GAAIX,GAAKiB,GAAKP,EAAII,EAAKE,GAAKH,GAAIE,EAAKE,GAAKL,GAAIE,EAAIC,CAAE,CACtF,CAKA,QAJIhB,EACAC,EACAkB,EACAC,EACKC,EAAI,EAAGA,EAAIhC,GAAM,CACtB,IAAIiC,EAAMlC,EAAKiC,GAAG,EACdE,EAAUF,IAAM,EAUpB,OATIE,IACA/B,EAAKJ,EAAKiC,CAAC,EACX5B,EAAKL,EAAKiC,EAAI,CAAC,EACf3B,EAAKF,EACLG,EAAKF,GACD6B,IAAQzC,GAAI,GAAKyC,IAAQzC,GAAI,GAAKyC,IAAQzC,GAAI,KAC9CU,EAAiB,CAACG,EAAIC,CAAE,IAGxB2B,EAAK,CACT,KAAKzC,GAAI,EACLW,EAAKE,EAAKN,EAAKiC,GAAG,EAClB5B,EAAKE,EAAKP,EAAKiC,GAAG,EAClBzB,EAAiBF,EAAIC,CAAE,EACvB,MACJ,KAAKd,GAAI,EACLmB,EAAKZ,EAAKiC,GAAG,EACbpB,EAAKb,EAAKiC,GAAG,EACbtB,EAAQP,EAAIC,EAAIO,EAAIC,CAAE,EACtBT,EAAKQ,EACLP,EAAKQ,EACL,MACJ,KAAKpB,GAAI,EACLU,EAAe,KAAKH,EAAKiC,GAAG,EAAGjC,EAAKiC,GAAG,EAAGjC,EAAKiC,GAAG,EAAGjC,EAAKiC,GAAG,EAAG7B,EAAKJ,EAAKiC,GAAG,EAAG5B,EAAKL,EAAKiC,GAAG,CAAC,EAC9F,MACJ,KAAKxC,GAAI,EACLmB,EAAKZ,EAAKiC,GAAG,EACbpB,EAAKb,EAAKiC,GAAG,EACbF,EAAK/B,EAAKiC,GAAG,EACbD,EAAKhC,EAAKiC,GAAG,EACb9B,EAAe,KAAKC,EAAK,EAAI,GAAKQ,EAAKR,GAAKC,EAAK,EAAI,GAAKQ,EAAKR,GAAK0B,EAAK,EAAI,GAAKnB,EAAKmB,GAAKC,EAAK,EAAI,GAAKnB,EAAKmB,GAAKD,EAAIC,CAAE,EAC1H5B,EAAK2B,EACL1B,EAAK2B,EACL,MACJ,KAAKvC,GAAI,EACL,IAAIwB,EAAKjB,EAAKiC,GAAG,EACbf,EAAKlB,EAAKiC,GAAG,EACbd,EAAKnB,EAAKiC,GAAG,EACbb,EAAKpB,EAAKiC,GAAG,EACblB,EAAaf,EAAKiC,GAAG,EACrBjB,EAAWhB,EAAKiC,GAAG,EAAIlB,EAC3BkB,GAAK,EACL,IAAIG,EAAgB,CAACpC,EAAKiC,GAAG,EAC7BrB,EAAK,KAAK,IAAIG,CAAU,EAAII,EAAKF,EACjCJ,EAAK,KAAK,IAAIE,CAAU,EAAIK,EAAKF,EAC7BiB,GACA7B,EAAKM,EACLL,EAAKM,EACLL,EAAiBF,EAAIC,CAAE,GAGvBI,EAAQP,EAAIC,EAAIO,EAAIC,CAAE,EAE1BT,EAAK,KAAK,IAAIY,CAAQ,EAAIG,EAAKF,EAC/BZ,EAAK,KAAK,IAAIW,CAAQ,EAAII,EAAKF,EAE/B,QADImB,GAAQD,EAAgB,GAAK,GAAK,KAAK,GAAK,EACvCE,EAAQvB,EAAYqB,EAAgBE,EAAQtB,EAAWsB,EAAQtB,EAAUsB,GAASD,EAAM,CAC7F,IAAIE,EAAYH,EAAgB,KAAK,IAAIE,EAAQD,EAAMrB,CAAQ,EACzD,KAAK,IAAIsB,EAAQD,EAAMrB,CAAQ,EACrCF,EAAOwB,EAAOC,EAAWtB,EAAIC,EAAIC,EAAIC,CAAE,CAC3C,CACA,MACJ,KAAK3B,GAAI,EACLa,EAAKF,EAAKJ,EAAKiC,GAAG,EAClB1B,EAAKF,EAAKL,EAAKiC,GAAG,EAClBrB,EAAKN,EAAKN,EAAKiC,GAAG,EAClBpB,EAAKN,EAAKP,EAAKiC,GAAG,EAClBzB,EAAiBI,EAAIL,CAAE,EACvBI,EAAQC,EAAIL,EAAIK,EAAIC,CAAE,EACtBF,EAAQC,EAAIC,EAAIP,EAAIO,CAAE,EACtBF,EAAQL,EAAIO,EAAIP,EAAIC,CAAE,EACtBI,EAAQL,EAAIC,EAAIK,EAAIL,CAAE,EACtB,MACJ,KAAKd,GAAI,EACLU,GAAkBQ,EAAQP,EAAIC,EAAIC,EAAIC,CAAE,EACxCH,EAAKE,EACLD,EAAKE,EACL,KACR,CACJ,CACA,OAAIJ,GAAkBA,EAAe,OAAS,GAC1CD,EAAkB,KAAKC,CAAc,EAElCD,CACX,CACA,SAASsC,GAAelC,EAAIC,EAAIK,EAAIC,EAAIkB,EAAIC,EAAIS,EAAIC,EAAIC,EAAKC,EAAO,CAChE,GAAIjD,GAAYW,EAAIM,CAAE,GAAKjB,GAAYY,EAAIM,CAAE,GAAKlB,GAAYoC,EAAIU,CAAE,GAAK9C,GAAYqC,EAAIU,CAAE,EAAG,CAC1FC,EAAI,KAAKF,EAAIC,CAAE,EACf,MACJ,CACA,IAAIG,EAAiB,EAAID,EACrBE,EAAqBD,EAAiBA,EACtCE,EAAKN,EAAKnC,EACV0C,EAAKN,EAAKnC,EACV0C,EAAI,KAAK,KAAKF,EAAKA,EAAKC,EAAKA,CAAE,EACnCD,GAAME,EACND,GAAMC,EACN,IAAIC,EAAMtC,EAAKN,EACX6C,EAAMtC,EAAKN,EACX6C,EAAMrB,EAAKU,EACXY,EAAMrB,EAAKU,EACXY,EAAYJ,EAAMA,EAAMC,EAAMA,EAC9BI,EAAYH,EAAMA,EAAMC,EAAMA,EAClC,GAAIC,EAAYR,GAAsBS,EAAYT,EAAoB,CAClEH,EAAI,KAAKF,EAAIC,CAAE,EACf,MACJ,CACA,IAAIc,EAAWT,EAAKG,EAAMF,EAAKG,EAC3BM,EAAW,CAACV,EAAKK,EAAMJ,EAAKK,EAC5BK,EAAQJ,EAAYE,EAAWA,EAC/BG,EAAQJ,EAAYE,EAAWA,EACnC,GAAIC,EAAQZ,GAAsBU,GAAY,GACvCG,EAAQb,GAAsBW,GAAY,EAAG,CAChDd,EAAI,KAAKF,EAAIC,CAAE,EACf,MACJ,CACA,IAAIkB,EAAU,CAAC,EACXC,EAAU,CAAC,EACfC,GAAexD,EAAIM,EAAImB,EAAIU,EAAI,GAAKmB,CAAO,EAC3CE,GAAevD,EAAIM,EAAImB,EAAIU,EAAI,GAAKmB,CAAO,EAC3CrB,GAAeoB,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGlB,EAAKC,CAAK,EACzHJ,GAAeoB,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGlB,EAAKC,CAAK,CAC7H,CACO,SAASmB,IAAehE,EAAM6C,EAAO,CACxC,IAAI1C,EAAoBJ,GAAmBC,CAAI,EAC3CiE,EAAW,CAAC,EAChBpB,EAAQA,GAAS,EACjB,QAAS,EAAI,EAAG,EAAI1C,EAAkB,OAAQ,IAAK,CAC/C,IAAI+D,EAAU/D,EAAkB,CAAC,EAC7BgE,EAAU,CAAC,EACX5D,EAAK2D,EAAQ,CAAC,EACd1D,EAAK0D,EAAQ,CAAC,EAClBC,EAAQ,KAAK5D,EAAIC,CAAE,EACnB,QAAS4D,EAAI,EAAGA,EAAIF,EAAQ,QAAS,CACjC,IAAIrD,EAAKqD,EAAQE,GAAG,EAChBtD,EAAKoD,EAAQE,GAAG,EAChBpC,EAAKkC,EAAQE,GAAG,EAChBnC,EAAKiC,EAAQE,GAAG,EAChB1B,EAAKwB,EAAQE,GAAG,EAChBzB,EAAKuB,EAAQE,GAAG,EACpB3B,GAAelC,EAAIC,EAAIK,EAAIC,EAAIkB,EAAIC,EAAIS,EAAIC,EAAIwB,EAAStB,CAAK,EAC7DtC,EAAKmC,EACLlC,EAAKmC,CACT,CACAsB,EAAS,KAAKE,CAAO,CACzB,CACA,OAAOF,CACX,CC3LA,SAASI,IAAiBC,EAASC,EAAQC,EAAO,CAC9C,IAAIC,EAAUH,EAAQC,CAAM,EACxBG,EAAaJ,EAAQ,EAAIC,CAAM,EAC/BI,EAAQ,KAAK,IAAIF,EAAUC,CAAU,EACrCE,EAAW,KAAK,KAAK,KAAK,KAAKD,EAAQH,CAAK,CAAC,EAC7CK,EAAc,KAAK,MAAML,EAAQI,CAAQ,EACzCC,IAAgB,IAChBA,EAAc,EACdD,EAAWJ,GAGf,QADIM,EAAQ,CAAC,EACJC,EAAI,EAAGA,EAAIH,EAAUG,IAC1BD,EAAM,KAAKD,CAAW,EAE1B,IAAIG,EAAeJ,EAAWC,EAC1BI,EAAWT,EAAQQ,EACvB,GAAIC,EAAW,EACX,QAASF,EAAI,EAAGA,EAAIE,EAAUF,IAC1BD,EAAMC,EAAIH,CAAQ,GAAK,EAG/B,OAAOE,CACX,CACA,SAASI,IAAaC,EAAaX,EAAOY,EAAW,CAWjD,QAVIC,EAAKF,EAAY,GACjBG,EAAIH,EAAY,EAChBI,EAAaJ,EAAY,WACzBK,EAAWL,EAAY,SACvBM,EAAQ,KAAK,IAAID,EAAWD,CAAU,EACtCG,EAASD,EAAQH,EACjBK,EAASL,EAAID,EACbO,EAAaF,EAAS,KAAK,IAAIC,CAAM,EACrCb,EAAQT,IAAiB,CAACqB,EAAQC,CAAM,EAAGC,EAAa,EAAI,EAAGpB,CAAK,EACpEC,GAAWmB,EAAaH,EAAQE,GAAUb,EAAM,OAC3Ce,EAAM,EAAGA,EAAMf,EAAM,OAAQe,IAElC,QADInB,GAAckB,EAAaD,EAASF,GAASX,EAAMe,CAAG,EACjDC,EAAS,EAAGA,EAAShB,EAAMe,CAAG,EAAGC,IAAU,CAChD,IAAIC,EAAW,CAAC,EACZH,GACAG,EAAS,WAAaR,EAAad,EAAUoB,EAC7CE,EAAS,SAAWR,EAAad,GAAWoB,EAAM,GAClDE,EAAS,GAAKV,EAAKX,EAAaoB,EAChCC,EAAS,EAAIV,EAAKX,GAAcoB,EAAS,KAGzCC,EAAS,WAAaR,EAAab,EAAaoB,EAChDC,EAAS,SAAWR,EAAab,GAAcoB,EAAS,GACxDC,EAAS,GAAKV,EAAKZ,EAAUoB,EAC7BE,EAAS,EAAIV,EAAKZ,GAAWoB,EAAM,IAEvCE,EAAS,UAAYZ,EAAY,UACjCY,EAAS,GAAKZ,EAAY,GAC1BY,EAAS,GAAKZ,EAAY,GAC1BC,EAAU,KAAKW,CAAQ,CAC3B,CAER,CACA,SAASC,IAAWC,EAAWzB,EAAOY,EAAW,CAU7C,QATIc,EAAQD,EAAU,MAClBE,EAASF,EAAU,OACnBG,EAAkBF,EAAQC,EAC1BrB,EAAQT,IAAiB,CAAC6B,EAAOC,CAAM,EAAGC,EAAkB,EAAI,EAAG5B,CAAK,EACxE6B,EAAaD,EAAkB,QAAU,SACzCE,EAAgBF,EAAkB,SAAW,QAC7C7B,EAAS6B,EAAkB,IAAM,IACjCG,EAAYH,EAAkB,IAAM,IACpC3B,EAAUwB,EAAUI,CAAU,EAAIvB,EAAM,OACnCe,EAAM,EAAGA,EAAMf,EAAM,OAAQe,IAElC,QADInB,EAAauB,EAAUK,CAAa,EAAIxB,EAAMe,CAAG,EAC5CC,EAAS,EAAGA,EAAShB,EAAMe,CAAG,EAAGC,IAAU,CAChD,IAAIC,EAAW,CAAC,EAChBA,EAASxB,CAAM,EAAIsB,EAAMpB,EACzBsB,EAASQ,CAAS,EAAIT,EAASpB,EAC/BqB,EAASM,CAAU,EAAI5B,EACvBsB,EAASO,CAAa,EAAI5B,EAC1BqB,EAAS,GAAKE,EAAU,EACxBF,EAAS,GAAKE,EAAU,EACxBb,EAAU,KAAKW,CAAQ,CAC3B,CAER,CACA,SAASS,IAAeC,EAAIC,EAAIC,EAAIC,EAAI,CACpC,OAAOH,EAAKG,EAAKD,EAAKD,CAC1B,CACA,SAASG,IAAkBC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK,CAC/D,IAAIC,EAAKN,EAAMF,EACXS,EAAKN,EAAMF,EACXS,EAAKJ,EAAMF,EACXO,EAAKJ,EAAMF,EACXO,EAAiBlB,IAAegB,EAAIC,EAAIH,EAAIC,CAAE,EAClD,GAAI,KAAK,IAAIG,CAAc,EAAI,KAC3B,OAAO,KAEX,IAAIC,EAAQb,EAAMI,EACdU,EAAQb,EAAMI,EACdU,EAAIrB,IAAemB,EAAOC,EAAOJ,EAAIC,CAAE,EAAIC,EAC/C,OAAIG,EAAI,GAAKA,EAAI,EACN,KAEJ,IAAIC,GAAMD,EAAIP,EAAKR,EAAKe,EAAIN,EAAKR,CAAG,CAC/C,CACA,SAASgB,IAAaC,EAAIC,EAAOC,EAAO,CACpC,IAAIC,EAAM,IAAIL,GACdA,GAAM,IAAIK,EAAKD,EAAOD,CAAK,EAC3BE,EAAI,UAAU,EACd,IAAIC,EAAO,IAAIN,GACfA,GAAM,IAAIM,EAAMJ,EAAIC,CAAK,EACzB,IAAII,EAAMD,EAAK,IAAID,CAAG,EACtB,OAAOE,CACX,CACA,SAASC,GAAUC,EAAMP,EAAI,CACzB,IAAIQ,EAAOD,EAAKA,EAAK,OAAS,CAAC,EAC3BC,GAAQA,EAAK,CAAC,IAAMR,EAAG,CAAC,GAAKQ,EAAK,CAAC,IAAMR,EAAG,CAAC,GAGjDO,EAAK,KAAKP,CAAE,CAChB,CACA,SAASS,IAAmBC,EAAQT,EAAOC,EAAO,CAG9C,QAFIG,EAAMK,EAAO,OACbC,EAAgB,CAAC,EACZ5D,EAAI,EAAGA,EAAIsD,EAAKtD,IAAK,CAC1B,IAAI6D,EAAKF,EAAO3D,CAAC,EACb8D,EAAKH,GAAQ3D,EAAI,GAAKsD,CAAG,EACzBS,EAAiBjC,IAAkB+B,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGZ,EAAM,EAAGA,EAAM,EAAGC,EAAM,EAAGA,EAAM,CAAC,EACjGY,GACAH,EAAc,KAAK,CACf,OAAQZ,IAAae,EAAgBb,EAAOC,CAAK,EACjD,GAAIY,EACJ,IAAK/D,CACT,CAAC,CAET,CACA,GAAI4D,EAAc,OAAS,EACvB,MAAO,CAAC,CAAE,OAAQD,CAAO,EAAG,CAAE,OAAQA,CAAO,CAAC,EAElDC,EAAc,KAAK,SAAUI,EAAGC,EAAG,CAC/B,OAAOD,EAAE,OAASC,EAAE,MACxB,CAAC,EACD,IAAIC,EAAWN,EAAc,CAAC,EAC1BO,EAAWP,EAAcA,EAAc,OAAS,CAAC,EACrD,GAAIO,EAAS,IAAMD,EAAS,IAAK,CAC7B,IAAIE,EAAMF,EACVA,EAAWC,EACXA,EAAWC,CACf,CAKA,QAJIC,EAAc,CAACH,EAAS,GAAG,EAAGA,EAAS,GAAG,CAAC,EAC3CI,EAAc,CAACH,EAAS,GAAG,EAAGA,EAAS,GAAG,CAAC,EAC3CI,EAAW,CAACF,CAAW,EACvBG,EAAW,CAACF,CAAW,EAClBtE,EAAIkE,EAAS,IAAM,EAAGlE,GAAKmE,EAAS,IAAKnE,IAC9CuD,GAAUgB,EAAUZ,EAAO3D,CAAC,EAAE,MAAM,CAAC,EAEzCuD,GAAUgB,EAAUD,CAAW,EAC/Bf,GAAUgB,EAAUF,CAAW,EAC/B,QAASrE,EAAImE,EAAS,IAAM,EAAGnE,GAAKkE,EAAS,IAAMZ,EAAKtD,IACpDuD,GAAUiB,EAAUb,EAAO3D,EAAIsD,CAAG,EAAE,MAAM,CAAC,EAE/C,OAAAC,GAAUiB,EAAUH,CAAW,EAC/Bd,GAAUiB,EAAUF,CAAW,EACxB,CAAC,CACA,OAAQC,CACZ,EAAG,CACC,OAAQC,CACZ,CAAC,CACT,CACA,SAASC,IAAoBC,EAAc,CACvC,IAAIf,EAASe,EAAa,OACtBC,EAAM,CAAC,EACPC,EAAM,CAAC,EACXC,GAAWlB,EAAQgB,EAAKC,CAAG,EAC3B,IAAIE,EAAe,IAAIC,GAAaJ,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGC,EAAI,CAAC,EAAID,EAAI,CAAC,EAAGC,EAAI,CAAC,EAAID,EAAI,CAAC,CAAC,EAChFxD,EAAQ2D,EAAa,MACrB1D,EAAS0D,EAAa,OACtBE,EAAIF,EAAa,EACjBG,EAAIH,EAAa,EACjBI,EAAM,IAAInC,GACVoC,EAAM,IAAIpC,GACd,OAAI5B,EAAQC,GACR8D,EAAI,EAAIC,EAAI,EAAIH,EAAI7D,EAAQ,EAC5B+D,EAAI,EAAID,EACRE,EAAI,EAAIF,EAAI7D,IAGZ8D,EAAI,EAAIC,EAAI,EAAIF,EAAI7D,EAAS,EAC7B8D,EAAI,EAAIF,EACRG,EAAI,EAAIH,EAAI7D,GAETuC,IAAmBC,EAAQuB,EAAKC,CAAG,CAC9C,CACA,SAASC,GAAsBC,EAASC,EAAO7F,EAAO8F,EAAK,CACvD,GAAI9F,IAAU,EACV8F,EAAI,KAAKD,CAAK,MAEb,CACD,IAAIE,EAAM,KAAK,MAAM/F,EAAQ,CAAC,EAC1BgG,EAAMJ,EAAQC,CAAK,EACvBF,GAAsBC,EAASI,EAAI,CAAC,EAAGD,EAAKD,CAAG,EAC/CH,GAAsBC,EAASI,EAAI,CAAC,EAAGhG,EAAQ+F,EAAKD,CAAG,CAC3D,CACA,OAAOA,CACX,CACO,SAASG,IAAMC,EAAMlG,EAAO,CAE/B,QADImG,EAAQ,CAAC,EACJ5F,EAAI,EAAGA,EAAIP,EAAOO,IACvB4F,EAAM,KAAKC,GAAUF,CAAI,CAAC,EAE9B,OAAOC,CACX,CACA,SAASE,IAAcC,EAAQC,EAAQ,CACnCA,EAAO,SAASD,EAAO,KAAK,EAC5BC,EAAO,EAAID,EAAO,EAClBC,EAAO,GAAKD,EAAO,GACnBC,EAAO,OAASD,EAAO,MAC3B,CACA,SAASE,IAAetC,EAAQ,CAE5B,QADI4B,EAAM,CAAC,EACFvF,EAAI,EAAGA,EAAI2D,EAAO,QACvB4B,EAAI,KAAK,CAAC5B,EAAO3D,GAAG,EAAG2D,EAAO3D,GAAG,CAAC,CAAC,EAEvC,OAAOuF,CACX,CACO,SAASW,IAAMP,EAAMlG,EAAO,CAC/B,IAAIY,EAAY,CAAC,EACbiF,EAAQK,EAAK,MACbQ,EACJ,OAAQR,EAAK,KAAM,CACf,IAAK,OACD1E,IAAWqE,EAAO7F,EAAOY,CAAS,EAClC8F,EAAeC,GACf,MACJ,IAAK,SACDjG,IAAamF,EAAO7F,EAAOY,CAAS,EACpC8F,EAAeE,GACf,MACJ,IAAK,SACDlG,IAAa,CACT,GAAI,EAAG,EAAGmF,EAAM,EAAG,WAAY,EAAG,SAAU,KAAK,GAAK,EACtD,GAAIA,EAAM,GAAI,GAAIA,EAAM,EAC5B,EAAG7F,EAAOY,CAAS,EACnB8F,EAAeE,GACf,MACJ,QACI,IAAIC,EAAIX,EAAK,qBAAqB,EAC9BY,EAAQD,EAAI,KAAK,KAAK,KAAK,IAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,CAAC,CAAC,EAAI,EACxFE,EAAWC,EAAIC,IAAef,EAAK,oBAAoB,EAAGY,CAAK,EAAG,SAAU/C,EAAM,CAAE,OAAOyC,IAAezC,CAAI,CAAG,CAAC,EAClHmD,EAAeH,EAAS,OAC5B,GAAIG,IAAiB,EACjBvB,GAAsBX,IAAqB,CACvC,OAAQ+B,EAAS,CAAC,CACtB,EAAG/G,EAAOY,CAAS,UAEdsG,IAAiBlH,EACtB,QAASO,EAAI,EAAGA,EAAI2G,EAAc3G,IAC9BK,EAAU,KAAK,CACX,OAAQmG,EAASxG,CAAC,CACtB,CAAC,MAGJ,CACD,IAAI4G,EAAc,EACdC,EAAQJ,EAAID,EAAU,SAAUhD,EAAM,CACtC,IAAImB,EAAM,CAAC,EACPC,EAAM,CAAC,EACXC,GAAWrB,EAAMmB,EAAKC,CAAG,EACzB,IAAIkC,GAAQlC,EAAI,CAAC,EAAID,EAAI,CAAC,IAAMC,EAAI,CAAC,EAAID,EAAI,CAAC,GAC9C,OAAAiC,GAAeE,EACR,CAAE,KAAMtD,EAAM,KAAMsD,CAAK,CACpC,CAAC,EACDD,EAAM,KAAK,SAAU7C,EAAGC,EAAG,CAAE,OAAOA,EAAE,KAAOD,EAAE,IAAM,CAAC,EAEtD,QADI+C,EAAOtH,EACFO,EAAI,EAAGA,EAAI2G,EAAc3G,IAAK,CACnC,IAAIgH,EAAOH,EAAM7G,CAAC,EAClB,GAAI+G,GAAQ,EACR,MAEJ,IAAIE,EAAYjH,IAAM2G,EAAe,EAC/BI,EACA,KAAK,KAAKC,EAAK,KAAOJ,EAAcnH,CAAK,EAC3CwH,EAAY,IAGhB7B,GAAsBX,IAAqB,CACvC,OAAQuC,EAAK,IACjB,EAAGC,EAAW5G,CAAS,EACvB0G,GAAQE,EACZ,CAEJ,CACAd,EAAee,GACf,KACR,CACA,GAAI,CAACf,EACD,OAAOT,IAAMC,EAAMlG,CAAK,EAG5B,QADI8F,EAAM,CAAC,EACFvF,EAAI,EAAGA,EAAIK,EAAU,OAAQL,IAAK,CACvC,IAAImH,EAAU,IAAIhB,EAClBgB,EAAQ,SAAS9G,EAAUL,CAAC,CAAC,EAC7B8F,IAAcH,EAAMwB,CAAO,EAC3B5B,EAAI,KAAK4B,CAAO,CACpB,CACA,OAAO5B,CACX,CC/SA,SAAS6B,IAAaC,EAAUC,EAAU,CACtC,IAAIC,EAAOF,EAAS,OAChBG,EAAOF,EAAS,OACpB,GAAIC,IAASC,EACT,MAAO,CAACH,EAAUC,CAAQ,EAW9B,QATIG,EAAU,CAAC,EACXC,EAAU,CAAC,EACXC,EAAcJ,EAAOC,EAAOH,EAAWC,EACvCM,EAAa,KAAK,IAAIL,EAAMC,CAAI,EAChCK,EAAO,KAAK,IAAIL,EAAOD,CAAI,EAAI,EAC/BO,GAAsBF,EAAa,GAAK,EACxCG,EAAuB,KAAK,KAAKF,EAAOC,CAAkB,EAAI,EAC9DE,EAAa,CAACL,EAAY,CAAC,EAAGA,EAAY,CAAC,CAAC,EAC5CM,EAAWJ,EACNK,EAAI,EAAGA,EAAIN,GAAa,CAC7B,IAAIO,EAAKR,EAAYO,EAAI,CAAC,EACtBE,EAAKT,EAAYO,EAAI,CAAC,EACtBG,EAAKV,EAAYO,GAAG,EACpBI,EAAKX,EAAYO,GAAG,EACpBK,EAAKZ,EAAYO,GAAG,EACpBM,EAAKb,EAAYO,GAAG,EACpBO,EAAKd,EAAYO,GAAG,EACpBQ,EAAKf,EAAYO,GAAG,EACxB,GAAID,GAAY,EAAG,CACfD,EAAW,KAAKK,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,EACtC,QACJ,CAEA,QADIC,EAAoB,KAAK,IAAIV,EAAUF,EAAuB,CAAC,EAAI,EAC9Da,EAAI,EAAGA,GAAKD,EAAmBC,IAAK,CACzC,IAAIC,EAAID,EAAID,EACZG,GAAeX,EAAIE,EAAIE,EAAIE,EAAII,EAAGpB,CAAO,EACzCqB,GAAeV,EAAIE,EAAIE,EAAIE,EAAIG,EAAGnB,CAAO,EACzCS,EAAKV,EAAQ,CAAC,EACdW,EAAKV,EAAQ,CAAC,EACdM,EAAW,KAAKP,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGD,EAAQ,CAAC,EAAGC,EAAQ,CAAC,EAAGS,EAAIC,CAAE,EACtEC,EAAKZ,EAAQ,CAAC,EACda,EAAKZ,EAAQ,CAAC,EACda,EAAKd,EAAQ,CAAC,EACde,EAAKd,EAAQ,CAAC,CAClB,CACAO,GAAYU,EAAoB,CACpC,CACA,OAAOhB,IAAgBN,EAAW,CAACW,EAAYV,CAAQ,EAAI,CAACD,EAAUW,CAAU,CACpF,CACA,SAASe,IAAcC,EAAoBC,EAAc,CAKrD,QAJIC,EAAMF,EAAmB,OACzBG,EAAQH,EAAmBE,EAAM,CAAC,EAClCE,EAAQJ,EAAmBE,EAAM,CAAC,EAClClB,EAAa,CAAC,EACTE,EAAI,EAAGA,EAAIe,EAAa,QAC7BjB,EAAWE,GAAG,EAAIiB,EAClBnB,EAAWE,GAAG,EAAIkB,EAEtB,OAAOpB,CACX,CACO,SAASqB,IAAkBC,EAAQC,EAAQ,CAM9C,QALIC,EACAC,EACAC,EACAC,EAAY,CAAC,EACbC,EAAY,CAAC,EACR1B,EAAI,EAAGA,EAAI,KAAK,IAAIoB,EAAO,OAAQC,EAAO,MAAM,EAAGrB,IAAK,CAC7D,IAAIb,EAAWiC,EAAOpB,CAAC,EACnBZ,EAAWiC,EAAOrB,CAAC,EACnB2B,EAAc,OACdC,EAAc,OACbzC,EAIKC,GAKNkC,EAAKpC,IAAaC,EAAUC,CAAQ,EAAGuC,EAAcL,EAAG,CAAC,EAAGM,EAAcN,EAAG,CAAC,EAC9EC,EAAeI,EACfH,EAAeI,IANfA,EAAcf,IAAcW,GAAgBrC,EAAUA,CAAQ,EAC9DwC,EAAcxC,IALdwC,EAAcd,IAAcU,GAAgBnC,EAAUA,CAAQ,EAC9DwC,EAAcxC,GAWlBqC,EAAU,KAAKE,CAAW,EAC1BD,EAAU,KAAKE,CAAW,CAC9B,CACA,MAAO,CAACH,EAAWC,CAAS,CAChC,CACO,SAASG,IAASC,EAAO,CAK5B,QAJIC,EAAa,EACbC,EAAK,EACLC,EAAK,EACLjB,EAAMc,EAAM,OACP9B,EAAI,EAAGkC,EAAIlB,EAAM,EAAGhB,EAAIgB,EAAKkB,EAAIlC,EAAGA,GAAK,EAAG,CACjD,IAAIC,EAAK6B,EAAMI,CAAC,EACZhC,EAAK4B,EAAMI,EAAI,CAAC,EAChB/B,EAAK2B,EAAM9B,CAAC,EACZI,EAAK0B,EAAM9B,EAAI,CAAC,EAChBmC,EAAIlC,EAAKG,EAAKD,EAAKD,EACvB6B,GAAcI,EACdH,IAAO/B,EAAKE,GAAMgC,EAClBF,IAAO/B,EAAKE,GAAM+B,CACtB,CACA,OAAIJ,IAAe,EACR,CAACD,EAAM,CAAC,GAAK,EAAGA,EAAM,CAAC,GAAK,CAAC,EAEjC,CAACE,EAAKD,EAAa,EAAGE,EAAKF,EAAa,EAAGA,CAAU,CAChE,CACA,SAASK,IAAmBC,EAAgBC,EAAcC,EAAQC,EAAM,CAMpE,QALIC,GAAeJ,EAAe,OAAS,GAAK,EAC5CK,EAAY,IACZC,EAAa,EACb3B,EAAMqB,EAAe,OACrB/C,EAAO0B,EAAM,EACR4B,EAAS,EAAGA,EAASH,EAAaG,IAAU,CAGjD,QAFIC,EAAeD,EAAS,EACxBE,EAAQ,EACHpC,EAAI,EAAGA,EAAIM,EAAKN,GAAK,EAAG,CAC7B,IAAIqC,EAAMrC,IAAM,EAAImC,GAAiBA,EAAenC,EAAI,GAAKpB,EAAO,EAChEW,EAAKoC,EAAeU,CAAG,EAAIR,EAAO,CAAC,EACnCrC,EAAKmC,EAAeU,EAAM,CAAC,EAAIR,EAAO,CAAC,EACvCpC,EAAKmC,EAAa5B,CAAC,EAAI8B,EAAK,CAAC,EAC7BpC,EAAKkC,EAAa5B,EAAI,CAAC,EAAI8B,EAAK,CAAC,EACjCQ,EAAK7C,EAAKF,EACVgD,EAAK7C,EAAKF,EACd4C,GAASE,EAAKA,EAAKC,EAAKA,CAC5B,CACIH,EAAQJ,IACRA,EAAYI,EACZH,EAAaC,EAErB,CACA,OAAOD,CACX,CACA,SAASO,IAAQpB,EAAO,CAGpB,QAFIqB,EAAS,CAAC,EACVnC,EAAMc,EAAM,OACP9B,EAAI,EAAGA,EAAIgB,EAAKhB,GAAK,EAC1BmD,EAAOnD,CAAC,EAAI8B,EAAMd,EAAMhB,EAAI,CAAC,EAC7BmD,EAAOnD,EAAI,CAAC,EAAI8B,EAAMd,EAAMhB,EAAI,CAAC,EAErC,OAAOmD,CACX,CACA,SAASC,IAAyBC,EAASC,EAAOC,EAAsBC,EAAkB,CAGtF,QAFIC,EAAS,CAAC,EACVC,EACK1D,EAAI,EAAGA,EAAIqD,EAAQ,OAAQrD,IAAK,CACrC,IAAI2D,EAAoBN,EAAQrD,CAAC,EAC7B4D,EAAkBN,EAAMtD,CAAC,EACzBuC,EAASV,IAAS8B,CAAiB,EACnCnB,EAAOX,IAAS+B,CAAe,EAC/BF,GAAoB,OACpBA,EAAmBnB,EAAO,CAAC,EAAI,GAAMC,EAAK,CAAC,EAAI,GAEnD,IAAIqB,EAAuB,CAAC,EACxBC,EAAqB,CAAC,EACtBC,EAAY,EACZrB,EAAY,IACZsB,EAAS,CAAC,EACVhD,EAAM2C,EAAkB,OACxBD,IACAC,EAAoBT,IAAQS,CAAiB,GAIjD,QAFIf,EAASR,IAAmBuB,EAAmBC,EAAiBrB,EAAQC,CAAI,EAAI,EAChFlD,EAAO0B,EAAM,EACRN,EAAI,EAAGA,EAAIpB,EAAMoB,GAAK,EAAG,CAC9B,IAAIqC,GAAOH,EAASlC,GAAKpB,EAAO,EAChCuE,EAAqBnD,EAAI,CAAC,EAAIiD,EAAkBZ,CAAG,EAAIR,EAAO,CAAC,EAC/DsB,EAAqBnD,EAAI,CAAC,EAAIiD,EAAkBZ,EAAM,CAAC,EAAIR,EAAO,CAAC,CACvE,CAGA,GAFAsB,EAAqB,CAAC,EAAIF,EAAkBf,CAAM,EAAIL,EAAO,CAAC,EAC9DsB,EAAqB,CAAC,EAAIF,EAAkBf,EAAS,CAAC,EAAIL,EAAO,CAAC,EAC9DgB,EAAuB,EAEvB,QADIU,EAAOT,EAAmBD,EACrBW,EAAQ,CAACV,EAAmB,EAAGU,GAASV,EAAmB,EAAGU,GAASD,EAAM,CAIlF,QAHIE,EAAK,KAAK,IAAID,CAAK,EACnBE,EAAK,KAAK,IAAIF,CAAK,EACnBpB,EAAQ,EACHpC,EAAI,EAAGA,EAAIiD,EAAkB,OAAQjD,GAAK,EAAG,CAClD,IAAIT,EAAK4D,EAAqBnD,CAAC,EAC3BR,EAAK2D,EAAqBnD,EAAI,CAAC,EAC/BP,EAAKyD,EAAgBlD,CAAC,EAAI8B,EAAK,CAAC,EAChCpC,EAAKwD,EAAgBlD,EAAI,CAAC,EAAI8B,EAAK,CAAC,EACpC6B,EAAQlE,EAAKiE,EAAKhE,EAAK+D,EACvBG,EAAQnE,EAAKgE,EAAK/D,EAAKgE,EAC3BJ,EAAOtD,CAAC,EAAI2D,EACZL,EAAOtD,EAAI,CAAC,EAAI4D,EAChB,IAAItB,EAAKqB,EAAQpE,EACbgD,EAAKqB,EAAQpE,EACjB4C,GAASE,EAAKA,EAAKC,EAAKA,CAC5B,CACA,GAAIH,EAAQJ,EAAW,CACnBA,EAAYI,EACZiB,EAAYG,EACZ,QAASK,EAAI,EAAGA,EAAIP,EAAO,OAAQO,IAC/BT,EAAmBS,CAAC,EAAIP,EAAOO,CAAC,CAExC,CACJ,KAGA,SAASC,EAAM,EAAGA,EAAMxD,EAAKwD,GAAO,EAChCV,EAAmBU,CAAG,EAAIZ,EAAgBY,CAAG,EAAIhC,EAAK,CAAC,EACvDsB,EAAmBU,EAAM,CAAC,EAAIZ,EAAgBY,EAAM,CAAC,EAAIhC,EAAK,CAAC,EAGvEiB,EAAO,KAAK,CACR,KAAMI,EACN,GAAIC,EACJ,OAAQvB,EACR,KAAMC,EACN,SAAU,CAACuB,CACf,CAAC,CACL,CACA,OAAON,CACX,CACO,SAASgB,GAAkBC,EAAM,CACpC,OAAOA,EAAK,mBAChB,CAIA,IAAIC,IAAsB,eAC1B,SAASC,GAAoBC,EAAKC,EAAYC,EAAW,CACrD,IAAIC,EAAkBL,IAAsBG,EACxCG,EAAiBJ,EAAIG,CAAe,GAAKH,EAAIC,CAAU,EACtDD,EAAIG,CAAe,IACpBH,EAAIG,CAAe,EAAIH,EAAIC,CAAU,GAEzC,IAAII,EAAUH,EAAU,QACpBI,EAAQJ,EAAU,MAClBK,EAASL,EAAU,OACvBF,EAAIC,CAAU,EAAI,UAAY,CAC1B,IAAIO,EAAO,UACPC,EACJ,OAAAF,GAAUA,EAAO,MAAM,KAAMC,CAAI,EAC7BH,EACAI,EAAMJ,EAAQ,MAAM,KAAMG,CAAI,EAG9BC,EAAML,EAAe,MAAM,KAAMI,CAAI,EAEzCF,GAASA,EAAM,MAAM,KAAME,CAAI,EACxBC,CACX,CACJ,CACA,SAASC,GAAcV,EAAKC,EAAY,CACpC,IAAIE,EAAkBL,IAAsBG,EACxCD,EAAIG,CAAe,IACnBH,EAAIC,CAAU,EAAID,EAAIG,CAAe,EACrCH,EAAIG,CAAe,EAAI,KAE/B,CACA,SAASQ,IAAwBC,EAAcC,EAAI,CAC/C,QAASC,EAAI,EAAGA,EAAIF,EAAa,OAAQE,IAErC,QADIC,EAAaH,EAAaE,CAAC,EACtBE,EAAI,EAAGA,EAAID,EAAW,QAAS,CACpC,IAAIE,EAAIF,EAAWC,CAAC,EAChBE,EAAIH,EAAWC,EAAI,CAAC,EACxBD,EAAWC,GAAG,EAAIH,EAAG,CAAC,EAAII,EAAIJ,EAAG,CAAC,EAAIK,EAAIL,EAAG,CAAC,EAC9CE,EAAWC,GAAG,EAAIH,EAAG,CAAC,EAAII,EAAIJ,EAAG,CAAC,EAAIK,EAAIL,EAAG,CAAC,CAClD,CAER,CACA,SAASM,IAAiBC,EAAUC,EAAQ,CACxC,IAAIC,EAAgBF,EAAS,oBAAoB,EAC7CG,EAAcF,EAAO,oBAAoB,EACzCG,EAAKC,IAAkBC,GAAmBJ,CAAa,EAAGI,GAAmBH,CAAW,CAAC,EAAGI,EAAmBH,EAAG,CAAC,EAAGI,EAAiBJ,EAAG,CAAC,EAC3IK,EAAoBT,EAAS,qBAAqB,EAClDU,EAAkBT,EAAO,qBAAqB,EAClD,SAASU,GAA0B,CAC/B,KAAK,UAAY,IACrB,CACAF,GAAqBlB,IAAwBgB,EAAkBE,CAAiB,EAChFC,GAAmBnB,IAAwBiB,EAAgBE,CAAe,EAC1E/B,GAAoBsB,EAAQ,kBAAmB,CAAE,QAASU,CAAwB,CAAC,EACnFV,EAAO,UAAY,KACnB,IAAIW,EAAeC,IAAyBN,EAAkBC,EAAgB,GAAI,KAAK,EAAE,EACrFM,EAAS,CAAC,EACdnC,GAAoBsB,EAAQ,YAAa,CAAE,QAAS,SAAUc,EAAM,CAI5D,QAHIC,EAAIf,EAAO,SACXgB,EAAO,EAAID,EACXE,EAAQ,CAAC,EACJxB,EAAI,EAAGA,EAAIkB,EAAa,OAAQlB,IAAK,CAC1C,IAAIyB,EAAOP,EAAalB,CAAC,EACrB0B,EAAOD,EAAK,KACZE,EAAKF,EAAK,GACVG,EAAQH,EAAK,SAAWH,EACxBO,EAASJ,EAAK,OACdK,EAAOL,EAAK,KACZM,EAAK,KAAK,IAAIH,CAAK,EACnBI,EAAK,KAAK,IAAIJ,CAAK,EACvBK,GAAKT,EAAOK,EAAQC,EAAMR,CAAC,EAC3B,QAASY,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,GAAK,EAAG,CACrC,IAAIC,EAAOT,EAAKQ,CAAC,EACbE,EAAOV,EAAKQ,EAAI,CAAC,EACjBG,EAAKV,EAAGO,CAAC,EACTI,EAAKX,EAAGO,EAAI,CAAC,EACb/B,EAAIgC,EAAOZ,EAAOc,EAAKf,EACvBlB,EAAIgC,EAAOb,EAAOe,EAAKhB,EAC3BF,EAAOc,CAAC,EAAK/B,EAAI6B,EAAK5B,EAAI2B,EAAMP,EAAM,CAAC,EACvCJ,EAAOc,EAAI,CAAC,EAAK/B,EAAI4B,EAAK3B,EAAI4B,EAAMR,EAAM,CAAC,CAC/C,CACA,IAAIe,EAAKnB,EAAO,CAAC,EACboB,EAAKpB,EAAO,CAAC,EACjBC,EAAK,OAAOkB,EAAIC,CAAE,EAClB,QAASN,EAAI,EAAGA,EAAIR,EAAK,QAAS,CAC9B,IAAIW,EAAKjB,EAAOc,GAAG,EACfI,EAAKlB,EAAOc,GAAG,EACfO,EAAKrB,EAAOc,GAAG,EACfQ,EAAKtB,EAAOc,GAAG,EACfS,EAAKvB,EAAOc,GAAG,EACfU,EAAKxB,EAAOc,GAAG,EACfK,IAAOF,GAAMG,IAAOF,GAAMG,IAAOE,GAAMD,IAAOE,EAC9CvB,EAAK,OAAOsB,EAAIC,CAAE,EAGlBvB,EAAK,cAAcgB,EAAIC,EAAIG,EAAIC,EAAIC,EAAIC,CAAE,EAE7CL,EAAKI,EACLH,EAAKI,CACT,CACJ,CACJ,CAAE,CAAC,CACX,CACO,SAASC,GAAUvC,EAAUC,EAAQuC,EAAe,CACvD,GAAI,CAACxC,GAAY,CAACC,EACd,OAAOA,EAEX,IAAIwC,EAAUD,EAAc,KACxBE,EAAYF,EAAc,OAC9BzC,IAAiBC,EAAUC,CAAM,EACjCA,EAAO,SAAW,EAClB,SAAS0C,GAAgB,CACrBrD,GAAcW,EAAQ,WAAW,EACjCX,GAAcW,EAAQ,iBAAiB,EACvCA,EAAO,SAAW,GAClBA,EAAO,gBAAgB,EACvBA,EAAO,WAAW,CACtB,CACA,OAAAA,EAAO,UAAU,CACb,SAAU,CACd,EAAG2C,GAAS,CACR,OAAQ,SAAUC,EAAG,CACjB5C,EAAO,WAAW,EAClByC,GAAaA,EAAUG,CAAC,CAC5B,EACA,KAAM,UAAY,CACdF,EAAc,EACdF,GAAWA,EAAQ,CACvB,CACJ,EAAGD,CAAa,CAAC,EACVvC,CACX,CACA,SAAS6C,IAAQjD,EAAGC,EAAGiD,EAAMC,EAAMC,EAAMC,EAAM,CAC3C,IAAIC,EAAO,GACXtD,EAAKoD,IAASF,EAAQ,EAAI,KAAK,MAAM,OAASlD,EAAIkD,IAASE,EAAOF,EAAK,EACvEjD,EAAKoD,IAASF,EAAQ,EAAI,KAAK,MAAM,OAASlD,EAAIkD,IAASE,EAAOF,EAAK,EAGvE,QAFII,EAAI,EACJC,EACKC,GAAK,GAAKH,GAAQ,EAAGG,EAAI,EAAGA,GAAK,EAAG,CACzC,IAAIC,EAAK,EACLC,EAAK,GACJ3D,EAAIyD,GAAK,IACVC,EAAK,IAEJzD,EAAIwD,GAAK,IACVE,EAAK,GAETJ,GAAKE,EAAIA,GAAM,EAAIC,EAAMC,GACrBA,IAAO,IACHD,IAAO,IACP1D,EAAIyD,EAAI,EAAIzD,EACZC,EAAIwD,EAAI,EAAIxD,GAEhBuD,EAAMxD,EACNA,EAAIC,EACJA,EAAIuD,EAEZ,CACA,OAAOD,CACX,CACA,SAASK,GAAUC,EAAU,CACzB,IAAIC,EAAO,IACPC,EAAO,IACPC,EAAO,KACPC,EAAO,KACPC,EAAMC,EAAIN,EAAU,SAAU3C,EAAM,CACpC,IAAIkD,EAAOlD,EAAK,gBAAgB,EAC5Ba,EAAIb,EAAK,qBAAqB,EAC9BlB,EAAIoE,EAAK,EAAIA,EAAK,MAAQ,GAAKrC,EAAIA,EAAE,CAAC,EAAI,GAC1C9B,EAAImE,EAAK,EAAIA,EAAK,OAAS,GAAKrC,EAAIA,EAAE,CAAC,EAAI,GAC/C,OAAA+B,EAAO,KAAK,IAAI9D,EAAG8D,CAAI,EACvBC,EAAO,KAAK,IAAI9D,EAAG8D,CAAI,EACvBC,EAAO,KAAK,IAAIhE,EAAGgE,CAAI,EACvBC,EAAO,KAAK,IAAIhE,EAAGgE,CAAI,EAChB,CAACjE,EAAGC,CAAC,CAChB,CAAC,EACGoE,EAAQF,EAAID,EAAK,SAAUI,EAAIC,EAAK,CACpC,MAAO,CACH,GAAID,EACJ,EAAGrB,IAAQqB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGR,EAAMC,EAAMC,EAAMC,CAAI,EAC/C,KAAMJ,EAASU,CAAG,CACtB,CACJ,CAAC,EACD,OAAOF,EAAM,KAAK,SAAUG,EAAGC,EAAG,CAAE,OAAOD,EAAE,EAAIC,EAAE,CAAG,CAAC,EAAE,IAAI,SAAUnD,EAAM,CAAE,OAAOA,EAAK,IAAM,CAAC,CACtG,CAEA,SAASoD,IAAkBC,EAAO,CAC9B,OAAOC,IAAMD,EAAM,KAAMA,EAAM,KAAK,CACxC,CACA,SAASE,IAAoB,CACzB,MAAO,CACH,gBAAiB,CAAC,EAClB,cAAe,CAAC,EAChB,MAAO,CACX,CACJ,CACO,SAASC,IAAaC,EAAU3E,EAAQuC,EAAe,CAC1D,IAAIqC,EAAe,CAAC,EACpB,SAASC,EAAYF,EAAU,CAC3B,QAASlF,EAAI,EAAGA,EAAIkF,EAAS,OAAQlF,IAAK,CACtC,IAAI0B,EAAOwD,EAASlF,CAAC,EACjBqF,GAAkB3D,CAAI,EACtB0D,EAAY1D,EAAK,YAAY,CAAC,EAEzBA,aAAgB4D,IACrBH,EAAa,KAAKzD,CAAI,CAE9B,CACJ,CACA0D,EAAYF,CAAQ,EACpB,IAAIK,EAAgBJ,EAAa,OACjC,GAAI,CAACI,EACD,OAAOP,GAAkB,EAE7B,IAAIQ,EAAa1C,EAAc,YAAc+B,IACzCY,EAAgBD,EAAW,CAC3B,KAAMjF,EAAQ,MAAOgF,CACzB,CAAC,EACD,GAAIE,EAAc,SAAWF,EACzB,eAAQ,MAAM,2CAA2C,EAClDP,GAAkB,EAE7BG,EAAepB,GAAUoB,CAAY,EACrCM,EAAgB1B,GAAU0B,CAAa,EAKvC,QAJI1C,EAAUD,EAAc,KACxBE,EAAYF,EAAc,OAC1B4C,EAAkB5C,EAAc,gBAChC6C,EAAoB,IAAIC,GACnB5F,EAAI,EAAGA,EAAIuF,EAAevF,IAAK,CACpC,IAAI0B,EAAOyD,EAAanF,CAAC,EACrB2B,EAAK8D,EAAczF,CAAC,EACxB2B,EAAG,OAASpB,EACZoB,EAAG,cAAcgE,CAAiB,EAC7BD,GACDrF,IAAiBqB,EAAMC,CAAE,CAEjC,CACApB,EAAO,oBAAsB,GAC7BA,EAAO,YAAc,UAAY,CAC7B,OAAOkF,CACX,EACA,SAASI,EAAqBC,EAAI,CAC9B,QAAS9F,EAAI,EAAGA,EAAIyF,EAAc,OAAQzF,IACtCyF,EAAczF,CAAC,EAAE,YAAY8F,CAAE,CAEvC,CACA7G,GAAoBsB,EAAQ,cAAe,CACvC,MAAO,SAAUuF,EAAI,CACjBD,EAAqBC,CAAE,CAC3B,CACJ,CAAC,EACD7G,GAAoBsB,EAAQ,mBAAoB,CAC5C,MAAO,SAAUuF,EAAI,CACjB,QAAS9F,EAAI,EAAGA,EAAIyF,EAAc,OAAQzF,IACtCyF,EAAczF,CAAC,EAAE,iBAAiB8F,CAAE,CAE5C,CACJ,CAAC,EACD,SAAS7C,GAAgB,CACrB1C,EAAO,oBAAsB,GAC7BA,EAAO,SAAW,GAClBA,EAAO,YAAc,KACrBX,GAAcW,EAAQ,aAAa,EACnCX,GAAcW,EAAQ,kBAAkB,CAC5C,CACA,IAAIwF,EAAQN,EAAc,OAC1B,GAAIC,EASA,QARIM,EAAcD,EACdE,EAAW,UAAY,CACvBD,IACIA,IAAgB,IAChB/C,EAAc,EACdF,GAAWA,EAAQ,EAE3B,EACS/C,EAAI,EAAGA,EAAI+F,EAAO/F,IAAK,CAC5B,IAAIkG,EAAyBR,EAAkBxC,GAAS,CACpD,OAAQJ,EAAc,OAAS,GAAK4C,EAAgB1F,EAAG+F,EAAOZ,EAAanF,CAAC,EAAGyF,EAAczF,CAAC,CAAC,EAC/F,KAAMiG,CACV,EAAGnD,CAAa,EAAIA,EACpBD,GAAUsC,EAAanF,CAAC,EAAGyF,EAAczF,CAAC,EAAGkG,CAAsB,CACvE,MAGA3F,EAAO,SAAW,EAClBA,EAAO,UAAU,CACb,SAAU,CACd,EAAG2C,GAAS,CACR,OAAQ,SAAUC,EAAG,CACjB,QAASnD,EAAI,EAAGA,EAAI+F,EAAO/F,IAAK,CAC5B,IAAImG,EAAQV,EAAczF,CAAC,EAC3BmG,EAAM,SAAW5F,EAAO,SACxB4F,EAAM,WAAW,CACrB,CACAnD,GAAaA,EAAUG,CAAC,CAC5B,EACA,KAAM,UAAY,CACdF,EAAc,EACd,QAASjD,EAAI,EAAGA,EAAIkF,EAAS,OAAQlF,IACjCJ,GAAcsF,EAASlF,CAAC,EAAG,iBAAiB,EAEhD+C,GAAWA,EAAQ,CACvB,CACJ,EAAGD,CAAa,CAAC,EAErB,OAAIvC,EAAO,MACPsF,EAAqBtF,EAAO,IAAI,EAE7B,CACH,gBAAiB4E,EACjB,cAAeM,EACf,MAAOM,CACX,CACJ,CACO,SAASK,IAAc9F,EAAU+F,EAAYvD,EAAe,CAC/D,IAAIiD,EAAQM,EAAW,OACnBlB,EAAe,CAAC,EAChBK,EAAa1C,EAAc,YAAc+B,IAC7C,SAASO,EAAYF,EAAU,CAC3B,QAASlF,EAAI,EAAGA,EAAIkF,EAAS,OAAQlF,IAAK,CACtC,IAAI0B,EAAOwD,EAASlF,CAAC,EACjBqF,GAAkB3D,CAAI,EACtB0D,EAAY1D,EAAK,YAAY,CAAC,EAEzBA,aAAgB4D,IACrBH,EAAa,KAAKzD,CAAI,CAE9B,CACJ,CACA,GAAI2D,GAAkB/E,CAAQ,EAAG,CAC7B8E,EAAY9E,EAAS,YAAY,CAAC,EAClC,IAAIgG,EAAUnB,EAAa,OAC3B,GAAImB,EAAUP,EAEV,QADI7F,EAAI,EACCF,EAAIsG,EAAStG,EAAI+F,EAAO/F,IAC7BmF,EAAa,KAAKoB,GAAUpB,EAAajF,IAAMoG,CAAO,CAAC,CAAC,EAGhEnB,EAAa,OAASY,CAC1B,KACK,CACDZ,EAAeK,EAAW,CAAE,KAAMlF,EAAU,MAAOyF,CAAM,CAAC,EAE1D,QADIhF,EAAoBT,EAAS,qBAAqB,EAC7CN,EAAI,EAAGA,EAAImF,EAAa,OAAQnF,IACrCmF,EAAanF,CAAC,EAAE,kBAAkBe,CAAiB,EAEvD,GAAIoE,EAAa,SAAWY,EACxB,eAAQ,MAAM,2CAA2C,EAClDf,GAAkB,CAEjC,CACAG,EAAepB,GAAUoB,CAAY,EACrCkB,EAAatC,GAAUsC,CAAU,EAEjC,QADIX,EAAkB5C,EAAc,gBAC3B9C,EAAI,EAAGA,EAAI+F,EAAO/F,IAAK,CAC5B,IAAIkG,EAAyBR,EAAkBxC,GAAS,CACpD,OAAQJ,EAAc,OAAS,GAAK4C,EAAgB1F,EAAG+F,EAAOZ,EAAanF,CAAC,EAAGqG,EAAWrG,CAAC,CAAC,CAChG,EAAG8C,CAAa,EAAIA,EACpBD,GAAUsC,EAAanF,CAAC,EAAGqG,EAAWrG,CAAC,EAAGkG,CAAsB,CACpE,CACA,MAAO,CACH,gBAAiBf,EACjB,cAAekB,EACf,MAAOA,EAAW,MACtB,CACJ,CChiBA,SAASG,IAAWC,EAAU,CAC5B,OAAOC,EAAQD,EAAS,CAAC,CAAC,CAC5B,CACA,SAASE,IAAoBC,EAAKC,EAAM,CAGtC,QAFIC,EAAU,CAAC,EACXC,EAAaH,EAAI,OACZ,EAAI,EAAG,EAAIG,EAAY,IAC9BD,EAAQ,KAAK,CACX,IAAKF,EAAI,CAAC,EACV,KAAM,CAAC,CACT,CAAC,EAEH,QAAS,EAAI,EAAG,EAAIC,EAAK,OAAQ,IAAK,CACpC,IAAIG,EAAMH,EAAK,CAAC,EAAE,OACdI,EAAI,OACR,IAAKA,EAAI,EAAGA,EAAID,EAAKC,IACnBH,EAAQG,EAAIF,CAAU,EAAE,KAAK,KAAKF,EAAK,CAAC,EAAEI,CAAC,CAAC,CAEhD,CAGA,QAFIC,EAAM,EAED,EAAIH,EAAa,EAAG,GAAK,EAAG,IACnC,GAAI,CAACD,EAAQ,CAAC,EAAE,KAAK,OAAQ,CAC3B,IAAIK,EAAWL,EAAQI,CAAG,EAAE,KAC5B,GAAIC,EAAS,QAAU,EAGrB,GAAID,EACFA,EAAM,MAEN,QAAOJ,EAGX,IAAIE,EAAMG,EAAS,OACfC,EAAM,KAAK,KAAKJ,EAAM,CAAC,EAC3BF,EAAQ,CAAC,EAAE,KAAOK,EAAS,MAAMC,EAAKJ,CAAG,EACzCF,EAAQI,CAAG,EAAE,KAAOC,EAAS,MAAM,EAAGC,CAAG,EACzCF,GACF,CAEF,OAAOJ,CACT,CACA,IAAIO,IAAe,CACjB,MAAO,SAAUC,EAAQ,CAIvB,QAHIC,EAAM,CAAC,EAEPC,EAAgB,EAAI,KAAK,IAAI,EAAIF,EAAO,KAAK,MAAM,QAAS,EAAIA,EAAO,KAAK,EACvEG,EAAI,EAAGA,EAAIH,EAAO,MAAOG,IAAK,CACrC,IAAIC,EAASC,GAAUL,EAAO,IAAI,EAClCI,EAAO,SAAS,UAAWF,CAAa,EACxCD,EAAI,KAAKG,CAAM,CACjB,CACA,OAAOH,CACT,EAEA,MAAO,IACT,EACO,SAASK,GAAoBC,EAAMC,EAAIC,EAAaC,EAAaC,EAAWC,EAAmB,CACpG,GAAI,CAACL,EAAK,QAAU,CAACC,EAAG,OACtB,OAEF,IAAIK,EAAqBC,GAAmB,SAAUJ,EAAaC,CAAS,EAC5E,GAAI,EAAEE,GAAsBA,EAAmB,SAAW,GACxD,OAEF,IAAIE,EAAiBL,EAAY,SAAS,qBAAqB,EAAE,IAAI,OAAO,EACxEM,EAAe,OAAO,OAAO,CAG/B,WAAY,EACd,EAAGH,CAAkB,EACjBtB,EACAD,EACAJ,IAAWqB,CAAI,IAEjBhB,EAAOgB,EACPjB,EAAMkB,GAEJtB,IAAWsB,CAAE,IAEfjB,EAAOiB,EACPlB,EAAMiB,GAER,SAASU,EAAcC,EAAOC,EAAYC,EAAcC,EAAcC,EAAc,CAClF,IAAIC,EAAYL,EAAM,KAClBM,EAAWN,EAAM,IACrB,GAAIK,EAAU,SAAW,GAAK,CAACD,EAAc,CAE3C,IAAIG,EAAYN,EAAaI,EAAU,CAAC,EAAIC,EACxCE,EAAUP,EAAaK,EAAWD,EAAU,CAAC,EACjD,GAAII,GAAkBF,CAAS,EAE7BR,EAAc,CACZ,KAAM,CAACQ,CAAS,EAChB,IAAKC,CACP,EAAG,GAAMN,EAAcC,EAAc,EAAI,MACpC,CACL,IAAIO,EAAyBb,EAAiBc,GAAS,CACrD,MAAOd,EAAeK,EAAcC,CAAY,CAClD,EAAGL,CAAY,EAAIA,EACnBc,GAAUL,EAAWC,EAASE,CAAsB,EACpDhB,EAAkBa,EAAWC,EAASD,EAAWC,EAASE,CAAsB,CAClF,CACF,KAWE,SAVIG,EAAuBF,GAAS,CAClC,WAAY9B,IAAaU,CAAW,EACpC,gBAAiBM,GAAkB,SAAUiB,EAAKC,EAAOC,EAAUC,EAAQ,CACzE,OAAOpB,EAAeiB,EAAMZ,EAAcC,CAAY,CACxD,CACF,EAAGL,CAAY,EACXoB,EAAKjB,EAAakB,IAAad,EAAWC,EAAUO,CAAoB,EAAIO,IAAcd,EAAUD,EAAWQ,CAAoB,EACrIQ,EAAkBH,EAAG,gBACrBI,EAAgBJ,EAAG,cACjBH,EAAQM,EAAgB,OACnB5C,EAAI,EAAGA,EAAIsC,EAAOtC,IAAK,CAC9B,IAAIiC,EAAyBb,EAAiBc,GAAS,CACrD,MAAOd,EAAepB,EAAGsC,CAAK,CAChC,EAAGjB,CAAY,EAAIA,EACnBJ,EAAkB2B,EAAgB5C,CAAC,EAAG6C,EAAc7C,CAAC,EAAGwB,EAAaI,EAAU5B,CAAC,EAAIuB,EAAM,IAAKC,EAAaD,EAAM,IAAMK,EAAU5B,CAAC,EAAGiC,CAAsB,CAC9J,CAEJ,CAMA,QALIT,EAAa5B,EAAOA,IAASgB,EAE/BA,EAAK,OAASC,EAAG,OACfiC,EAAelD,EAAOF,IAAoBC,EAAKC,CAAI,EAAIF,IAAoB8B,EAAaX,EAAKD,EAAM,CAACY,EAAaZ,EAAOC,CAAE,CAAC,EAC3Ha,EAAe,EACVlB,EAAI,EAAGA,EAAIsC,EAAa,OAAQtC,IACvCkB,GAAgBoB,EAAatC,CAAC,EAAE,KAAK,OAGvC,QADIiB,EAAe,EACVjB,EAAI,EAAGA,EAAIsC,EAAa,OAAQtC,IACvCc,EAAcwB,EAAatC,CAAC,EAAGgB,EAAYC,EAAcC,CAAY,EACrED,GAAgBqB,EAAatC,CAAC,EAAE,KAAK,MAEzC,CACO,SAASuC,GAAYvD,EAAU,CACpC,GAAI,CAACA,EACH,MAAO,CAAC,EAEV,GAAIC,EAAQD,CAAQ,EAAG,CAErB,QADIwD,EAAa,CAAC,EACTxC,EAAI,EAAGA,EAAIhB,EAAS,OAAQgB,IACnCwC,EAAW,KAAKD,GAAYvD,EAASgB,CAAC,CAAC,CAAC,EAE1C,OAAOwC,CACT,CACA,IAAIC,EAAW,CAAC,EAChB,OAAAzD,EAAS,SAAS,SAAU0D,EAAI,CAC1BA,aAAcC,IAAQ,CAACD,EAAG,iBAAmB,CAACA,EAAG,WAAa,CAACA,EAAG,QACpED,EAAS,KAAKC,CAAE,CAEpB,CAAC,EACMD,CACT,CCpJA,IAAIG,IAAuB,IACvBC,IAAkB,EAClBC,IAAiB,EACjBC,IAAiB,EAEjBC,IAAoCC,GAAU,EAClD,SAASC,IAAaC,EAAMC,EAAiB,CAE3C,QADIC,EAAaF,EAAK,WACbG,EAAI,EAAGA,EAAID,EAAW,OAAQC,IAAK,CAC1C,IAAIC,EAAUJ,EAAK,iBAAiBE,EAAWC,CAAC,CAAC,EACjD,GAAIC,GAAWA,EAAQ,UAAUH,CAAe,IAAM,EACpD,OAAOC,EAAWC,CAAC,CAEvB,CACF,CAEA,SAASE,IAAoBL,EAAMM,EAAWC,EAAW,CACvD,IAAIH,EAAUJ,EAAK,iBAAiBO,CAAS,EACzCC,EAAiBJ,GAAWA,EAAQ,YACxC,GAAIA,EAAS,CACX,IAAIK,EAAQT,EAAK,IAAII,EAAQ,KAAME,CAAS,EAC5C,OAAIE,GACKA,EAAe,WAAWC,CAAK,GAAKA,EAAQ,EAGvD,CACF,CACA,SAASC,IAAWV,EAAMM,EAAWK,EAAaC,EAAS,CAEzD,IAAIX,EAAkBW,EAAU,mBAAqB,cACjDC,EAAad,IAAaC,EAAMC,CAAe,EACnD,GAAIY,EAAY,CACd,IAAIC,EAAUT,IAAoBL,EAAMM,EAAWO,CAAU,EAC7D,OAAOC,CACT,CAEA,IAAIC,EAAcf,EAAK,eAAeM,CAAS,EAC3CU,EAAWJ,EAAU,eAAiB,UAC1C,GAAIG,GAAeA,EAAYC,CAAQ,EACrC,OAAOD,EAAYC,CAAQ,EAAI,GAGjC,GAAI,CAAAJ,EAIJ,OAAOD,GAAeX,EAAK,MAAMM,CAAS,CAC5C,CAEA,SAASW,IAAqBC,EAAM,CAClC,IAAIC,EAAQ,CAAC,EACb,OAAAC,EAAKF,EAAM,SAAUG,EAAY,CAC/B,IAAIrB,EAAOqB,EAAW,KAClBV,EAAcU,EAAW,YAC7B,GAAI,EAAArB,EAAK,MAAM,EAAIP,KAOnB,QADI6B,EAAUtB,EAAK,WAAW,EACrBM,EAAY,EAAGA,EAAYgB,EAAQ,OAAQhB,IAClDa,EAAM,KAAK,CACT,KAAMnB,EACN,QAASU,IAAWV,EAAMM,EAAWK,EAAa,EAAK,EACvD,aAAcD,IAAWV,EAAMM,EAAWK,EAAa,EAAI,EAC3D,OAAQU,EAAW,OACnB,UAAWf,CACb,CAAC,CAEL,CAAC,EACMa,CACT,CACA,SAASI,GAAcC,EAAOC,EAAWC,EAAU,CACjDF,EAAM,SAAS,SAAUG,EAAI,CACvBA,aAAcC,IAEhBC,GAAUF,EAAI,CACZ,MAAO,CACL,QAAS,CACX,CACF,EAAGF,EAAW,CACZ,UAAWC,EACX,OAAQ,EACV,CAAC,CAEL,CAAC,CACH,CACA,SAASI,GAASH,EAAI,CACpB,GAAIA,EAAG,OAAQ,CAGb,IAAII,EAAoBJ,EAAG,qBAAqB,EAChDA,EAAG,kBAAkBI,CAAiB,EACtCJ,EAAG,OAAO,OAAOA,CAAE,CACrB,CACF,CACA,SAASK,GAAcL,EAAI,CACzBA,EAAG,cAAc,EACbA,EAAG,SACLA,EAAG,SAAS,SAAUM,EAAO,CAC3BA,EAAM,cAAc,CACtB,CAAC,CAEL,CACA,SAASC,IAAqBP,EAAIrB,EAAW6B,EAAa,CACxD,IAAIC,EAAkBC,GAAmB,SAAUF,EAAa7B,CAAS,EACzE8B,GAAmBT,EAAG,SAAS,SAAUM,EAAO,CAC9C,GAAIA,aAAiBK,GAAa,CAChC,IAAIC,EAAWC,IAAYP,CAAK,EAC5BM,GACFN,EAAM,YAAY,CAChB,MAAOM,CACT,EAAGH,CAAe,CAEtB,CACF,CAAC,CACH,CACA,SAASK,IAAYC,EAAcC,EAAc,CAC/C,IAAIC,EAAMF,EAAa,OACvB,GAAIE,IAAQD,EAAa,OACvB,MAAO,GAET,QAASxC,EAAI,EAAGA,EAAIyC,EAAKzC,IAAK,CAC5B,IAAI0C,EAAUH,EAAavC,CAAC,EACxB2C,EAAUH,EAAaxC,CAAC,EAC5B,GAAI0C,EAAQ,KAAK,MAAMA,EAAQ,SAAS,IAAMC,EAAQ,KAAK,MAAMA,EAAQ,SAAS,EAChF,MAAO,EAEX,CACA,MAAO,EACT,CACA,SAASC,IAAkBC,EAASC,EAASC,EAAK,CAChD,IAAIR,EAAezB,IAAqB+B,CAAO,EAC3CL,EAAe1B,IAAqBgC,CAAO,EAC/C,SAASE,EAAwBC,EAAMC,EAAIC,EAASC,EAAOC,EAAc,EACnEF,GAAWF,IACbC,EAAG,YAAY,CACb,MAAOC,GAAWA,IAAYF,EAG5BK,EAAOA,EAAO,CAAC,EAAGH,EAAQ,KAAK,EAAGF,EAAK,KAAK,EAAIA,EAAK,KACzD,EAAGI,CAAY,CAEnB,CACA,IAAIE,EAAoB,GAyCpBC,EAAYjE,IAEZkE,EAAcC,GAAc,EAC5BC,EAAmBD,GAAc,EACrCnB,EAAa,QAAQ,SAAUqB,EAAM,CACnCA,EAAK,SAAWH,EAAY,IAAIG,EAAK,QAAS,EAAI,EAClDA,EAAK,cAAgBD,EAAiB,IAAIC,EAAK,aAAc,EAAI,CACnE,CAAC,EAED,QAAS5D,EAAI,EAAGA,EAAIwC,EAAa,OAAQxC,IAAK,CAC5C,IAAI6D,EAAarB,EAAaxC,CAAC,EAAE,QACjC,GAAI2D,EAAiB,IAAIE,CAAU,EAAG,CACpCL,EAAYhE,IACZ,KACF,CACA,IAAIsE,EAAkBtB,EAAaxC,CAAC,EAAE,aACtC,GAAI8D,GAAmBL,EAAY,IAAIK,CAAe,EAAG,CACvDN,EAAY/D,IACZ,KACF,CACF,CACA,SAASsE,EAAgBC,EAAOC,EAAW,CACzC,OAAO,SAAUC,EAAU,CACzB,IAAIrE,EAAOqE,EAAS,KAChB/D,EAAY+D,EAAS,UAEzB,OAAID,EACKpE,EAAK,MAAMM,CAAS,EAEzB6D,EACKR,IAAchE,IAAiB0E,EAAS,aAAeA,EAAS,QAEhEV,IAAc/D,IAAiByE,EAAS,aAAeA,EAAS,OAE3E,CACF,CAIA,IAAIC,EAAQ7B,IAAYC,EAAcC,CAAY,EAC9C4B,EAAwB,CAAC,EAC7B,GAAI,CAACD,EAIH,QAASnE,EAAI,EAAGA,EAAIwC,EAAa,OAAQxC,IAAK,CAC5C,IAAI2C,EAAUH,EAAaxC,CAAC,EACxBwB,EAAKmB,EAAQ,KAAK,iBAAiBA,EAAQ,SAAS,EACpDnB,IACF4C,EAAsB5C,EAAG,EAAE,EAAI,GAEnC,CAEF,SAAS6C,EAAe9C,EAAU+C,EAAU,CAC1C,IAAI5B,EAAUH,EAAa+B,CAAQ,EAC/B3B,EAAUH,EAAajB,CAAQ,EAC/BD,EAAYqB,EAAQ,KAAK,UAEzB4B,EAAQ7B,EAAQ,KAAK,iBAAiBA,EAAQ,SAAS,EACvDrB,EAAQsB,EAAQ,KAAK,iBAAiBA,EAAQ,SAAS,EAE3D,GAAI4B,IAAUlD,EAAO,CACnBA,GAASU,IAAqBV,EAAOsB,EAAQ,UAAWrB,CAAS,EACjE,MACF,CAGAiD,GAASH,EAAsBG,EAAM,EAAE,GAGnClD,IAIFQ,GAAcR,CAAK,EACfkD,GACF1C,GAAc0C,CAAK,EAEnB5C,GAAS4C,CAAK,EACdhB,EAAoB,GACpBiB,GAAoBC,GAAYF,CAAK,EAAGE,GAAYpD,CAAK,EAAGsB,EAAQ,OAAQrB,EAAWC,EAAUyB,CAAuB,GAExH5B,GAAcC,EAAOC,EAAWC,CAAQ,EAI9C,CACA,IAAImD,GAAWnC,EAAcC,EAAcuB,EAAgB,GAAMI,CAAK,EAAGJ,EAAgB,GAAOI,CAAK,EAAG,KAAM,UAAU,EAAE,OAAOE,CAAc,EAAE,gBAAgB,SAAU9C,EAAUoD,EAAY,CAC/L,IAAIhC,EAAUH,EAAajB,CAAQ,EAC/BqD,EAAUjC,EAAQ,KAClBrB,EAAYsD,EAAQ,UACpBvD,EAAQuD,EAAQ,iBAAiBjC,EAAQ,SAAS,EAClDkC,EAAaC,GAAOC,EAAIJ,EAAY,SAAUK,EAAK,CACrD,OAAOzC,EAAayC,CAAG,EAAE,KAAK,iBAAiBzC,EAAayC,CAAG,EAAE,SAAS,CAC5E,CAAC,EAAG,SAAUT,EAAO,CACnB,OAAOA,GAASA,IAAUlD,GAAS,CAAC+C,EAAsBG,EAAM,EAAE,CACpE,CAAC,EACGlD,IACFQ,GAAcR,CAAK,EACfwD,EAAW,QAEb5D,EAAK4D,EAAY,SAAUN,EAAO,CAChC1C,GAAc0C,CAAK,EACnB5C,GAAS4C,CAAK,CAChB,CAAC,EACDhB,EAAoB,GACpBiB,GAAoBC,GAAYI,CAAU,EAAGJ,GAAYpD,CAAK,EAAGsB,EAAQ,OAAQrB,EAAWC,EAAUyB,CAAuB,GAE7H5B,GAAcC,EAAOC,EAAWqB,EAAQ,SAAS,EAIvD,CAAC,EAAE,gBAAgB,SAAUsC,EAAYX,EAAU,CACjD,IAAI5B,EAAUH,EAAa+B,CAAQ,EAC/BC,EAAQ7B,EAAQ,KAAK,iBAAiBA,EAAQ,SAAS,EAE3D,GAAI,EAAA6B,GAASH,EAAsBG,EAAM,EAAE,GAG3C,KAAIW,EAAaJ,GAAOC,EAAIE,EAAY,SAAUD,EAAK,CACrD,OAAOxC,EAAawC,CAAG,EAAE,KAAK,iBAAiBxC,EAAawC,CAAG,EAAE,SAAS,CAC5E,CAAC,EAAG,SAAUxD,EAAI,CAChB,OAAOA,GAAMA,IAAO+C,CACtB,CAAC,EACGY,EAAW3C,EAAayC,EAAW,CAAC,CAAC,EAAE,KAAK,UAC5CC,EAAW,SACbjE,EAAKiE,EAAY,SAAU7D,EAAO,CAChC,OAAOQ,GAAcR,CAAK,CAC5B,CAAC,EACGkD,GACF1C,GAAc0C,CAAK,EAEnB5C,GAAS4C,CAAK,EACdhB,EAAoB,GACpBiB,GAAoBC,GAAYF,CAAK,EAAGE,GAAYS,CAAU,EAAGxC,EAAQ,OAEzEyC,EAAUF,EAAW,CAAC,EAAGjC,CAAuB,GAEhD/B,EAAKiE,EAAY,SAAU7D,EAAO,CAChC,OAAOD,GAAcC,EAAO8D,EAAUF,EAAW,CAAC,CAAC,CACrD,CAAC,GAIP,CAAC,EAAE,iBAAiB,SAAUA,EAAYN,EAAY,CAGpD,IAAID,GAAWC,EAAYM,EAAY,SAAUG,EAAQ,CACvD,OAAO7C,EAAa6C,CAAM,EAAE,KAAK,MAAM7C,EAAa6C,CAAM,EAAE,SAAS,CACvE,EAAG,SAAUA,EAAQ,CACnB,OAAO5C,EAAa4C,CAAM,EAAE,KAAK,MAAM5C,EAAa4C,CAAM,EAAE,SAAS,CACvE,CAAC,EAAE,OAAO,SAAU7D,EAAU+C,EAAU,CAEtCD,EAAeY,EAAW1D,CAAQ,EAAGoD,EAAWL,CAAQ,CAAC,CAC3D,CAAC,EAAE,QAAQ,CACb,CAAC,EAAE,QAAQ,EACPf,GACFtC,EAAK6B,EAAS,SAAUuC,EAAI,CAC1B,IAAIxF,EAAOwF,EAAG,KACVrD,EAAcnC,EAAK,UACnByF,EAAOtD,GAAee,EAAI,qBAAqBf,CAAW,EAC1DqB,EAAenB,GAAmB,SAAUF,EAAa,CAAC,EAC1DsD,GAAQtD,EAAY,mBAAmB,GAAKqB,GAAgBA,EAAa,SAAW,GACtFiC,EAAK,MAAM,SAAS,SAAU9D,EAAI,CAC5BA,aAAcC,IAAQ,CAACD,EAAG,UAAU,QAGtCA,EAAG,YAAY,CACb,MAAO,CACL,QAAS,CACX,CACF,EAAG6B,CAAY,CAEnB,CAAC,CAEL,CAAC,CAEL,CACA,SAASkC,IAAuBC,EAAQ,CACtC,IAAIC,EAAYD,EAAO,SAAS,qBAAqB,EAAE,IAAI,WAAW,EACtE,OAAKC,GAEID,EAAO,EAGlB,CACA,SAASE,IAA8BD,EAAW,CAChD,OAAIE,EAAQF,CAAS,EAEZA,EAAU,KAAK,EAAE,KAAK,GAAG,EAE3BA,CACT,CACA,SAASG,GAAuB/F,EAAM,CACpC,GAAIA,EAAK,UACP,OAAOA,EAAK,UAAU,SAAS,qBAAqB,EAAE,IAAI,aAAa,CAE3E,CACA,SAASgG,IAA4BC,EAAaC,EAAQ,CACxD,IAAIC,EAAgBtC,GAAc,EAC9BuC,EAAavC,GAAc,EAG3BwC,EAAqBxC,GAAc,EACvCzC,EAAK6E,EAAY,UAAW,SAAUN,EAAQR,EAAK,CACjD,IAAImB,EAAiBL,EAAY,gBAAgBd,CAAG,EAChDoB,EAAUN,EAAY,QAAQd,CAAG,EACjCqB,EAAgBd,IAAuBC,CAAM,EAC7Cc,EAAmBZ,IAA8BW,CAAa,EAClEJ,EAAW,IAAIK,EAAkB,CAC/B,YAAaH,EACb,KAAMC,CACR,CAAC,EACGT,EAAQU,CAAa,GAEvBpF,EAAKoF,EAAe,SAAUE,EAAK,CACjCL,EAAmB,IAAIK,EAAK,CAC1B,IAAKD,EACL,YAAaH,EACb,KAAMC,CACR,CAAC,CACH,CAAC,CAEL,CAAC,EACD,SAASI,EAAmCF,EAAkB,CACxDN,EAAc,IAAIM,CAAgB,GACpCG,IAAK,+CAAiDH,CAAgB,CAE1E,CACA,OAAArF,EAAK8E,EAAO,cAAe,SAAUP,EAAQ,CAC3C,GAAIA,EAAO,6BAA6B,GAAKA,EAAO,mBAAmB,EAAG,CACxE,IAAIkB,EAAiBlB,EAAO,IAAI,aAAa,EACzCZ,EAAUY,EAAO,QAAQ,EACzBa,EAAgBd,IAAuBC,CAAM,EAC7Cc,EAAmBZ,IAA8BW,CAAa,EAE9DD,EAAUH,EAAW,IAAIK,CAAgB,EAE7C,GAAIF,EAKFJ,EAAc,IAAIM,EAAkB,CAClC,UAAW,CAAC,CACV,YAAaF,EAAQ,YACrB,OAAQR,GAAuBQ,EAAQ,IAAI,EAC3C,KAAMA,EAAQ,IAChB,CAAC,EACD,UAAW,CAAC,CACV,YAAaM,EACb,OAAQd,GAAuBhB,CAAO,EACtC,KAAMA,CACR,CAAC,CACH,CAAC,UAIGe,EAAQU,CAAa,EAAG,CAI1B,IAAIM,EAAc,CAAC,EACnB1F,EAAKoF,EAAe,SAAUE,EAAK,CACjC,IAAIH,EAAUH,EAAW,IAAIM,CAAG,EAC5BH,EAAQ,MACVO,EAAY,KAAK,CACf,YAAaP,EAAQ,YACrB,OAAQR,GAAuBQ,EAAQ,IAAI,EAC3C,KAAMA,EAAQ,IAChB,CAAC,CAEL,CAAC,EACGO,EAAY,QACdX,EAAc,IAAIM,EAAkB,CAClC,UAAWK,EACX,UAAW,CAAC,CACV,YAAaD,EACb,KAAM9B,EACN,OAAQgB,GAAuBhB,CAAO,CACxC,CAAC,CACH,CAAC,CAEL,KAAO,CAGL,IAAIgC,EAAYV,EAAmB,IAAIG,CAAa,EACpD,GAAIO,EAAW,CACb,IAAIC,EAAQb,EAAc,IAAIY,EAAU,GAAG,EACtCC,IACHA,EAAQ,CACN,UAAW,CAAC,CACV,YAAaD,EAAU,YACvB,KAAMA,EAAU,KAChB,OAAQhB,GAAuBgB,EAAU,IAAI,CAC/C,CAAC,EACD,UAAW,CAAC,CACd,EACAZ,EAAc,IAAIY,EAAU,IAAKC,CAAK,GAExCA,EAAM,UAAU,KAAK,CACnB,YAAaH,EACb,KAAM9B,EACN,OAAQgB,GAAuBhB,CAAO,CACxC,CAAC,CACH,CACF,CAEJ,CACF,CAAC,EACMoB,CACT,CACA,SAASc,IAAYtB,EAAQuB,EAAQ,CACnC,QAAS/G,EAAI,EAAGA,EAAIwF,EAAO,OAAQxF,IAAK,CACtC,IAAIgH,EAAQD,EAAO,aAAe,MAAQA,EAAO,cAAgBvB,EAAOxF,CAAC,EAAE,aAAe+G,EAAO,UAAY,MAAQA,EAAO,WAAavB,EAAOxF,CAAC,EAAE,GACnJ,GAAIgH,EACF,OAAOhH,CAEX,CACF,CACA,SAASiH,IAAwBC,EAAepB,EAAaC,EAAQhD,EAAK,CACxE,IAAIE,EAAO,CAAC,EACRC,EAAK,CAAC,EACVjC,EAAKkG,GAAiBD,EAAc,IAAI,EAAG,SAAUH,EAAQ,CAC3D,IAAI/B,EAAM8B,IAAYhB,EAAY,UAAWiB,CAAM,EAC/C/B,GAAO,GACT/B,EAAK,KAAK,CACR,YAAa6C,EAAY,gBAAgBd,CAAG,EAC5C,KAAMc,EAAY,QAAQd,CAAG,EAE7B,OAAQY,GAAuBE,EAAY,QAAQd,CAAG,CAAC,EACvD,WAAY+B,EAAO,SACrB,CAAC,CAEL,CAAC,EACD9F,EAAKkG,GAAiBD,EAAc,EAAE,EAAG,SAAUH,EAAQ,CACzD,IAAI/B,EAAM8B,IAAYf,EAAO,cAAegB,CAAM,EAClD,GAAI/B,GAAO,EAAG,CACZ,IAAInF,EAAOkG,EAAO,cAAcf,CAAG,EAAE,QAAQ,EAC7C9B,EAAG,KAAK,CACN,YAAa4C,EAAY,gBAAgBd,CAAG,EAC5C,KAAMnF,EACN,OAAQ+F,GAAuB/F,CAAI,EACnC,WAAYkH,EAAO,SACrB,CAAC,CACH,CACF,CAAC,EACG9D,EAAK,OAAS,GAAKC,EAAG,OAAS,GACjCN,IAAkBK,EAAMC,EAAIH,CAAG,CAEnC,CACO,SAASqE,GAA2BC,EAAW,CACpDA,EAAU,wBAAwB,sBAAuB,SAAUC,EAASvE,EAAKgD,EAAQ,CACvF9E,EAAKkG,GAAiBpB,EAAO,gBAAgB,EAAG,SAAUwB,EAAU,CAClEtG,EAAKkG,GAAiBI,EAAS,EAAE,EAAG,SAAUR,EAAQ,CAEpD,QADIvB,EAASO,EAAO,cACX/F,EAAI,EAAGA,EAAIwF,EAAO,OAAQxF,KAC7B+G,EAAO,aAAe,MAAQA,EAAO,cAAgBvB,EAAOxF,CAAC,EAAE,aAAe+G,EAAO,UAAY,MAAQA,EAAO,WAAavB,EAAOxF,CAAC,EAAE,MACzIwF,EAAOxF,CAAC,EAAEwH,EAAgC,EAAI,GAGpD,CAAC,CACH,CAAC,CACH,CAAC,EACDH,EAAU,wBAAwB,oBAAqB,SAAUI,EAAS1E,EAAKgD,EAAQ,CAErF,IAAID,EAAcpG,IAAkCqD,CAAG,EAEvD,GAAI+C,EAAY,WAAaC,EAAO,eAAiBA,EAAO,cAAe,CAGzE,IAAImB,EAAgBnB,EAAO,iBAC3B,GAAImB,EACFjG,EAAKkG,GAAiBD,CAAa,EAAG,SAAUQ,EAAK,CACnDT,IAAwBS,EAAK5B,EAAaC,EAAQhD,CAAG,CACvD,CAAC,MACI,CAEL,IAAI4E,EAAkB9B,IAA4BC,EAAaC,CAAM,EACrE9E,EAAK0G,EAAgB,KAAK,EAAG,SAAUpB,EAAK,CAC1C,IAAIM,EAAQc,EAAgB,IAAIpB,CAAG,EACnC3D,IAAkBiE,EAAM,UAAWA,EAAM,UAAW9D,CAAG,CACzD,CAAC,CACH,CAEA9B,EAAK8E,EAAO,cAAe,SAAUP,EAAQ,CAEvCA,EAAOgC,EAAgC,IACzChC,EAAOgC,EAAgC,EAAI,GAE/C,CAAC,CACH,CAMA,QAJII,EAAYH,EAAQ,UAAU,EAC9BI,EAAc/B,EAAY,UAAY,CAAC,EACvCgC,EAAoBhC,EAAY,gBAAkB,CAAC,EACnDiC,EAAYjC,EAAY,QAAU,CAAC,EAC9B9F,EAAI,EAAGA,EAAI4H,EAAU,OAAQ5H,IAAK,CACzC,IAAIH,EAAO+H,EAAU5H,CAAC,EAAE,QAAQ,EAG5BH,EAAK,MAAM,EAAIP,MACjBuI,EAAY,KAAKD,EAAU5H,CAAC,CAAC,EAC7B8H,EAAkB,KAAKF,EAAU5H,CAAC,EAAE,IAAI,aAAa,CAAC,EACtD+H,EAAU,KAAKlI,CAAI,EAEvB,CACF,CAAC,CACH,CCrlBA,IAAImI,KAAqC,UAAY,CACnD,SAASA,GAAwB,CAE/B,KAAK,OAAS,CAAC,EAIf,KAAK,eAAiB,CAAC,IAAU,IAAS,CAC5C,CACA,OAAAA,EAAsB,UAAU,UAAY,SAAUC,EAAQ,CAE5D,KAAK,OAASA,EAAO,MACvB,EAIAD,EAAsB,UAAU,OAAS,SAAUE,EAAa,CAC9DC,IAAuB,KAAMD,CAAW,EACxC,IAAIE,EAAgB,KAAK,eACzBA,EAAc,CAAC,EAAI,KAAK,OAAOF,EAAY,CAAC,CAAC,EAC7CE,EAAc,CAAC,EAAI,KAAK,OAAOF,EAAY,CAAC,CAAC,CAC/C,EACAF,EAAsB,UAAU,UAAY,UAAY,CACtD,MAAO,CAAC,CAAC,KAAK,OAAO,MACvB,EAYAA,EAAsB,UAAU,qBAAuB,SAAUK,EAASC,EAAsB,CAC9F,QAASC,EAAM,EAAGA,EAAM,KAAK,OAAO,OAAQA,IAAO,CACjD,IAAIC,EAAM,KAAK,OAAOD,CAAG,EACzB,GAAIC,EAAI,KAAOH,GAAWA,EAAUG,EAAI,KAAM,CAC5C,IAAIC,EAAWH,EAAqBD,EAASG,EAAI,IAAI,EAKrD,OAAOC,CACT,CACF,CACA,MAAO,EACT,EACAT,EAAsB,UAAU,cAAgB,UAAY,CAC1D,OAAO,KAAK,eAAe,CAAC,EAAI,KAAK,eAAe,CAAC,CACvD,EACAA,EAAsB,UAAU,UAAY,SAAUU,EAAK,CACzD,IAAIC,EAAc,KAAK,eAAe,CAAC,EAAI,KAAK,eAAe,CAAC,EAEhE,OAAIA,IAAgB,EACX,IAED,KAAK,OAAOD,CAAG,EAAI,KAAK,eAAe,CAAC,GAAKC,CACvD,EACAX,EAAsB,UAAU,MAAQ,SAAUU,EAAK,CACrD,OAAO,KAAK,SAASA,GAAO,KAAK,eAAe,CAAC,EAAI,KAAK,eAAe,CAAC,GAAK,KAAK,eAAe,CAAC,CAAC,CACvG,EA6BAV,EAAsB,UAAU,OAAS,SAAUU,EAAK,CAKtD,QAHIE,EAAaC,IACbC,EAAeC,IACfC,EAAY,GACPC,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAAK,CAC3C,IAAIT,EAAM,KAAK,OAAOS,CAAC,EACvB,GAAIP,GAAOF,EAAI,KAAM,CACfE,EAAMF,EAAI,KACZI,GAAcJ,EAAI,KAAOM,GAAgBJ,EAAMF,EAAI,OAASA,EAAI,KAAOA,EAAI,MAAQA,EAAI,QAEvFI,GAAcF,EAAMI,EAEtBA,EAAeN,EAAI,KACnBQ,EAAY,GACZ,KACF,CACAJ,GAAcJ,EAAI,KAAOM,EAAeN,EAAI,QAC5CM,EAAeN,EAAI,IACrB,CACA,OAAIQ,IACFJ,GAAcF,EAAMI,GAEfF,CACT,EACAZ,EAAsB,UAAU,SAAW,SAAUY,EAAY,CAK/D,QAJIM,EAAiBL,IACjBC,EAAeC,IACfC,EAAY,GACZG,EAAe,EACVF,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAAK,CAC3C,IAAIT,EAAM,KAAK,OAAOS,CAAC,EACnBG,EAAeF,EAAiBV,EAAI,KAAOM,EAC3CO,EAAaD,EAAeZ,EAAI,QACpC,GAAII,GAAcS,EAAY,CACxBT,EAAaQ,EACfD,EAAeX,EAAI,MAAQI,EAAaQ,IAAiBC,EAAaD,IAAiBZ,EAAI,KAAOA,EAAI,MAEtGW,EAAeL,EAAeF,EAAaM,EAE7CJ,EAAeN,EAAI,KACnBQ,EAAY,GACZ,KACF,CACAE,EAAiBG,EACjBP,EAAeN,EAAI,IACrB,CACA,OAAIQ,IACFG,EAAeL,EAAeF,EAAaM,GAEtCC,CACT,EACOnB,CACT,GAAE,EAEF,SAASsB,KAA0B,CACjC,OAAO,IAAItB,GACb,CAGA,IAAIa,IAA0B,EAC1BE,IAAiC,EAIrC,SAASZ,IAAuBoB,EAAQrB,EAAa,CAsCnD,IAAIsB,EAAa,EACbC,EAAoB,CACtB,MAAO,CACL,KAAM,EACN,IAAK,CACP,EACA,OAAQ,CACN,KAAM,EACN,IAAK,CACP,CACF,EACIC,EAAO,UAAY,CACrB,MAAO,CACL,IAAK,GACL,KAAM,IACN,UAAW,IACX,IAAK,GACP,CACF,EACIC,EAAe,CACjB,EAAG,CACD,MAAOD,EAAK,EACZ,OAAQA,EAAK,CACf,EACA,EAAG,CACD,MAAOA,EAAK,EACZ,OAAQA,EAAK,CACf,CACF,EACAE,EAAKL,EAAO,OAAQ,SAAUf,EAAK,CACjC,IAAIqB,EAAYrB,EAAI,UAChBqB,EAAU,OAAS,WACrBL,GAAcK,EAAU,KAE1B,IAAIC,EAAaC,GAAmBvB,EAAKN,CAAW,EACpD,GAAI4B,EAAY,CACd,IAAIE,EAAcF,EAAW,OAAStB,EAAI,KACtCyB,EAAcH,EAAW,OAAStB,EAAI,KACtC0B,EAAcJ,EAAW,KAAOA,EAAW,KAC/C,GAAI,EAAAE,GAAeC,GAGZ,GAAID,GAAeC,EAAa,CACrC,IAAIE,EAAOH,EAAc,IAAM,IAC/BL,EAAaQ,CAAI,EAAEN,EAAU,IAAI,EAAE,IAAM,GACzCF,EAAaQ,CAAI,EAAEN,EAAU,IAAI,EAAE,KAAOK,EAC1CP,EAAaQ,CAAI,EAAEN,EAAU,IAAI,EAAE,UAAYK,GAAe1B,EAAI,KAAOA,EAAI,MAC7EmB,EAAaQ,CAAI,EAAEN,EAAU,IAAI,EAAE,IAAMA,EAAU,GACrD,MACEJ,EAAkBI,EAAU,IAAI,EAAE,MAAQK,EAC1CT,EAAkBI,EAAU,IAAI,EAAE,KAAOA,EAAU,GAEvD,CACF,CAAC,EACD,IAAIO,EAAqBZ,GAAc,GAAKtB,EAAY,CAAC,EAAIA,EAAY,CAAC,IAAMuB,EAAkB,MAAM,IAAMA,EAAkB,MAAM,OAASE,EAAa,EAAE,MAAM,KAAOA,EAAa,EAAE,MAAM,IAAMA,EAAa,EAAE,MAAM,MAAQA,EAAa,EAAE,MAAM,UAAY,IAAMA,EAAa,EAAE,MAAM,KAAOA,EAAa,EAAE,MAAM,IAAMA,EAAa,EAAE,MAAM,MAAQA,EAAa,EAAE,MAAM,UAAY,GAAKF,EAAkB,OAAO,MAAQE,EAAa,EAAE,OAAO,IAAMA,EAAa,EAAE,OAAO,KAAOA,EAAa,EAAE,OAAO,UAAY,IAAMA,EAAa,EAAE,OAAO,IAAMA,EAAa,EAAE,OAAO,KAAOA,EAAa,EAAE,OAAO,UAAY,KAAO,EAAIF,EAAkB,OAAO,KAAOE,EAAa,EAAE,OAAO,IAAMA,EAAa,EAAE,OAAO,IAAMA,EAAa,EAAE,OAAO,UAAY,IAAMA,EAAa,EAAE,OAAO,IAAMA,EAAa,EAAE,OAAO,IAAMA,EAAa,EAAE,OAAO,UAAY,IACt0BC,EAAKL,EAAO,OAAQ,SAAUf,EAAK,CACjC,IAAIqB,EAAYrB,EAAI,UAChBqB,EAAU,OAAS,WACrBrB,EAAI,QAAUgB,IAAe,EAE3B,KAAK,IAAIY,EAAoB,CAAC,EAAIP,EAAU,IAAML,EAAa,GAE/DK,EAAU,OAAS,UACrBrB,EAAI,QAAUqB,EAAU,KAEtBrB,EAAI,SAAW,OACjBA,EAAI,QAAU,EAElB,CAAC,CACH,CACA,SAAS6B,IAAkBC,EAAcC,EAAOC,EAAQC,EAAUC,EAAUxC,EAAa,CACnFoC,IAAiB,MAGrBV,EAAKY,EAAQ,SAAUhC,EAAK,CAG1B,IAAIsB,EAAaC,GAAmBvB,EAAKN,CAAW,EACpD,GAAK4B,EAOL,QAASa,EAAIJ,EAAM,OAAS,EAAGI,GAAK,EAAGA,IAAK,CAC1C,IAAIC,EAAOL,EAAMI,CAAC,EACdjC,EAAM+B,EAASG,CAAI,EAMnBC,EAAMH,EAAW,EAAI,EACrBhC,EAAMoB,EAAW,KAAOe,GAAOnC,EAAMoB,EAAW,KAAOe,IAAQP,IAAiB,yBAA2B5B,IAAQR,EAAY,CAAC,GAAKQ,IAAQR,EAAY,CAAC,IAC5JqC,EAAM,OAAOI,EAAG,CAAC,CAErB,CACF,CAAC,CACH,CACA,SAASG,IAETP,EAAOC,EAAQtC,EAEf6C,EAAc,CACZnB,EAAKY,EAAQ,SAAUhC,EAAK,CAC1B,IAAIsB,EAAaC,GAAmBvB,EAAKN,CAAW,EAC/C4B,IAQLS,EAAM,KAAK,CACT,MAAOT,EAAW,KAClB,MAAS,CACP,KAAM,OACN,YAAaA,CACf,EACA,KAAMiB,EAAeA,EAAajB,CAAU,EAAI,MAClD,CAAC,EAKDS,EAAM,KAAK,CACT,MAAOT,EAAW,KAClB,MAAS,CACP,KAAM,OACN,YAAaA,CACf,EACA,KAAMiB,EAAeA,EAAajB,CAAU,EAAI,MAClD,CAAC,EACH,CAAC,EACGU,EAAO,QACTD,EAAM,KAAK,SAAUS,EAAGC,EAAG,CACzB,OAAOD,EAAE,MAAQC,EAAE,KACrB,CAAC,CAEL,CAKA,SAASlB,GAAmBvB,EAAKN,EAAa,CAC5C,IAAIgD,EAAO,KAAK,IAAI1C,EAAI,KAAMN,EAAY,CAAC,CAAC,EACxCiD,EAAO,KAAK,IAAI3C,EAAI,KAAMN,EAAY,CAAC,CAAC,EAC5C,OAAOgD,EAAOC,GAAQD,IAASC,GAAQD,EAAOhD,EAAY,CAAC,GAAKgD,EAAOhD,EAAY,CAAC,EAAI,CACtF,KAAMgD,EACN,KAAMC,EACN,YAAa3C,EAAI,YACjB,UAAWA,EAAI,UACf,QAASA,EAAI,OACf,EAAI,IACN,CACA,SAAS4C,GAETC,EAAiBC,EAAOC,EAAK,CAC3B,IAAIC,EAAe,CAAC,EACpB,GAAI,CAACH,EACH,MAAO,CACL,OAAQG,CACV,EAEF,SAASC,EAAgBC,EAAmBC,EAAK,CAC/C,OAAID,GAAqB,GAAKA,EAAoB,EAAI,IAQxD,CACA9B,EAAKyB,EAAiB,SAAUO,EAAW,CACzC,GAAI,GAACA,GAAaA,EAAU,OAAS,MAAQA,EAAU,KAAO,OAM1D,CAAAA,EAAU,WAGd,KAAIC,EAAY,CACd,YAAaC,GAAMF,CAAS,EAC5B,KAAMN,EAAMM,EAAU,KAAK,EAC3B,KAAMN,EAAMM,EAAU,GAAG,EACzB,UAAW,CACT,KAAM,QACN,IAAK,CACP,EACA,QAAS,IACX,EACA,GAAIA,EAAU,KAAO,KAAM,CACzB,IAAIG,EAAS,GACb,GAAIC,GAASJ,EAAU,GAAG,EAAG,CAC3B,IAAIK,EAAaC,GAAKN,EAAU,GAAG,EACnC,GAAIK,EAAW,MAAM,IAAI,EAAG,CAC1B,IAAIP,EAAoB,WAAWO,CAAU,EAAI,IAC5CR,EAAgBC,EAAmB,aAAa,IACnDA,EAAoB,GAEtBG,EAAU,UAAU,KAAO,SAC3BA,EAAU,UAAU,IAAMH,EAC1BK,EAAS,EACX,CACF,CACA,GAAI,CAACA,EAAQ,CACX,IAAII,EAAWb,EAAMM,EAAU,GAAG,GAC9B,CAAC,SAASO,CAAQ,GAAKA,EAAW,KAIpCA,EAAW,GAEbN,EAAU,UAAU,KAAO,QAC3BA,EAAU,UAAU,IAAMM,CAC5B,CACF,CAiBA,GAhBIN,EAAU,OAASA,EAAU,OAC/BA,EAAU,UAAU,KAAO,QAC3BA,EAAU,UAAU,IAAM,GAExBN,GAAOA,EAAI,YACb3B,EAAK,CAAC,OAAQ,MAAM,EAAG,SAAUwC,EAAI,CAC/BP,EAAUO,CAAE,EAAI,IAIlBP,EAAUO,CAAE,EAAI,EAEpB,CAAC,EAICP,EAAU,KAAOA,EAAU,KAAM,CACnC,IAAIQ,EAAMR,EAAU,KACpBA,EAAU,KAAOA,EAAU,KAC3BA,EAAU,KAAOQ,CACnB,CACAb,EAAa,KAAKK,CAAS,EAC7B,CAAC,EAEDL,EAAa,KAAK,SAAUc,EAAOC,EAAO,CACxC,OAAOD,EAAM,KAAOC,EAAM,IAC5B,CAAC,EAED,IAAIC,EAAU,KACd,OAAA5C,EAAK4B,EAAc,SAAUhD,EAAKD,EAAK,CACjCiE,EAAUhE,EAAI,OAIhBgD,EAAajD,CAAG,EAAI,MAEtBiE,EAAUhE,EAAI,IAChB,CAAC,EACM,CACL,OAAQgD,EAAa,OAAO,SAAUhD,EAAK,CACzC,MAAO,CAAC,CAACA,CACX,CAAC,CACH,CACF,CACA,SAASiE,GAAkBjE,EAAKkE,EAAY,CAC1C,OAAOC,GAA6BD,CAAU,IAAMC,GAA6BnE,CAAG,CACtF,CACA,SAASmE,GAA6BD,EAAY,CAIhD,OAAOA,EAAW,MAAQ,OAASA,EAAW,GAChD,CAKA,SAASE,IAAuBC,EAAUC,EAAoBC,EAAW,CACvE,IAAIC,EAAc,CAAC,EACnBpD,EAAKiD,EAAU,SAAUI,EAAI1E,EAAK,CAChC,IAAI2E,EAASJ,EAAmBG,CAAE,EAC9BC,GAAUA,EAAO,OAAS,QAC5BF,EAAY,KAAK,CAACzE,CAAG,CAAC,CAE1B,CAAC,EACDqB,EAAKiD,EAAU,SAAUI,EAAI1E,EAAK,CAChC,IAAI2E,EAASJ,EAAmBG,CAAE,EAClC,GAAIC,GAAUA,EAAO,OAAS,OAAQ,CACpC,IAAIC,EAAUC,GAAKJ,EAEnB,SAAUK,EAAI,CACZ,OAAOZ,GAAkBK,EAAmBD,EAASQ,EAAG,CAAC,CAAC,CAAC,EAAE,YAAY,YAAaH,EAAO,YAAY,WAAW,CACtH,CAAC,EACDC,GAAWA,EAAQ,KAAK5E,CAAG,CAC7B,CACF,CAAC,EACD,IAAI+E,EAAS,CAAC,EACd,OAAA1D,EAAKoD,EAAa,SAAUG,EAAS,CAC/BA,EAAQ,SAAW,GACrBG,EAAO,KAAKP,EAAYI,EAAU,CAACN,EAASM,EAAQ,CAAC,CAAC,EAAGN,EAASM,EAAQ,CAAC,CAAC,CAAC,CAAC,CAElF,CAAC,EACMG,CACT,CACA,SAASC,IAA0B3C,EAAM4C,EAASC,EAAmBC,EAAkB,CACrF,IAAIR,EACAS,EACJ,GAAI/C,EAAK,MAAU,CACjB,IAAIpC,EAAMoC,EAAK,MAAS,YACpBgD,EAAgBR,GAAKK,EAAmB,SAAUjF,EAAK,CACzD,OAAOiE,GAAkBjE,EAAI,YAAaoC,EAAK,MAAS,YAAY,WAAW,CACjF,CAAC,EACGM,EAAOwC,EAAiB,KAAK,IAAIF,EAAShF,EAAI,IAAI,EAAGoF,EAAc,IAAI,EACvEzC,EAAOuC,EAAiB,KAAK,IAAIF,EAAShF,EAAI,IAAI,EAAGoF,EAAc,IAAI,EACvE/D,EAAY,CACd,KAAMrB,EAAI,UAAU,KACpB,IAAKA,EAAI,UAAU,OAAS,QAAUqF,GAAS,KAAK,IAAIL,EAAShF,EAAI,KAAOA,EAAI,UAAU,GAAG,CAAC,EAAI0C,EAAO1C,EAAI,UAAU,GACzH,EACA0E,EAAS,CACP,KAAMtC,EAAK,MAAS,KACpB,YAAa,CACX,YAAapC,EAAI,YACjB,KAAM0C,EACN,KAAMC,EACN,UAAWtB,EACX,QAASrB,EAAI,OACf,CACF,EACAmF,EAAuBC,EAAchD,EAAK,MAAS,IAAI,CACzD,CACA,MAAO,CACL,qBAAsB+C,EACtB,OAAQT,CACV,CACF,CACA,SAASY,IAAiCzC,EAAiBmC,EAASlC,EAAO,CACzE,IAAIC,EAAM,CACR,WAAY,EACd,EACIwC,EAAiB3C,GAAqBC,EAAiBC,EAAOC,CAAG,EACjEyC,EAAe5C,GAAqBC,EAAiBC,EAAOC,CAAG,EAC/D0C,EAAa,KAAK,IAAIT,CAAO,EACjC,OAAAQ,EAAa,OAASE,EAAIF,EAAa,OAAQ,SAAUxF,EAAK,CAC5D,IAAI0C,EAAO,KAAK,IAAI1C,EAAI,IAAI,EAAIyF,EAC5B9C,EAAO,KAAK,IAAI3C,EAAI,IAAI,EAAIyF,EAC5BpE,EAAY,CACd,KAAMrB,EAAI,UAAU,KACpB,IAAKA,EAAI,UAAU,OAAS,QAAU,KAAK,IAAIA,EAAI,KAAOA,EAAI,UAAU,GAAG,EAAIyF,EAAa/C,EAAO1C,EAAI,UAAU,GACnH,EACA,MAAO,CACL,KAAM0C,EACN,KAAMC,EACN,UAAWtB,EACX,QAASrB,EAAI,QACb,YAAaA,EAAI,WACnB,CACF,CAAC,EACM,CACL,eAAgBuF,EAChB,aAAcC,CAChB,CACF,CACA,IAAIG,IAAyB,CAC3B,KAAM,QACN,KAAM,KACR,EACA,SAASC,IAAiCC,EAAYnB,EAAQ,CAC5D,OAAIA,IACFmB,EAAaA,GAAc,CAAC,EAC5BA,EAAW,MAAW,CACpB,KAAMF,IAAuBjB,EAAO,IAAI,EACxC,MAAOA,EAAO,YAAY,KAC1B,IAAKA,EAAO,YAAY,IAC1B,GAEKmB,CACT,CACO,SAASC,KAA0B,CACxCC,IAA6B,CAC3B,wBAAyBjF,IACzB,kBAAmBe,IACnB,iBAAkBS,IAClB,qBAAsBM,GACtB,kBAAmBqB,GACnB,6BAA8BE,GAC9B,uBAAwBC,IACxB,0BAA2BW,IAC3B,iCAAkCO,IAClC,iCAAkCM,GACpC,CAAC,CACH,CC/jBA,IAAII,IAAYC,GAAU,EAC1B,SAASC,IAAoBC,EAAYC,EAAa,CACpD,IAAIC,EAASC,GAAKH,EAAY,SAAUI,EAAM,CAC5C,OAAOC,GAAoB,EAAE,kBAAkBD,EAAK,YAAY,YAAaH,EAAY,WAAW,CACtG,CAAC,EACD,OAAKC,GACHF,EAAW,KAAKE,EAAS,CACvB,iBAAkB,CAAC,EACnB,YAAaD,EACb,aAAc,EAChB,CAAC,EAEIC,CACT,CACA,SAASI,IAA2BN,EAAY,CAC9CO,EAAKP,EAAY,SAAUI,EAAM,CAC/B,OAAOA,EAAK,aAAe,EAC7B,CAAC,CACH,CACA,SAASI,IAAwBR,EAAY,CAC3C,QAASS,EAAIT,EAAW,OAAS,EAAGS,GAAK,EAAGA,IACtCT,EAAWS,CAAC,EAAE,cAChBT,EAAW,OAAOS,EAAG,CAAC,CAG5B,CACA,SAASC,IAAwBC,EAAWC,EAAUC,EAAWC,EAAcC,EAAK,CAClF,IAAIC,EAAOH,EAAU,KACrB,GAAIG,EAAK,MAAM,QAAQ,GAAK,CAACX,GAAoB,EAC/C,OAEF,IAAIY,EAAaZ,GAAoB,EAAE,uBAAuBW,EAAK,MAAM,SAAS,CAChF,WAAY,YACd,CAAC,EAAG,SAAUE,EAAM,CAClB,OAAOA,EAAK,KACd,EAAG,EAAK,EACR,GAAI,CAACD,EAAW,OACd,OAEF,IAAIE,EAAiBN,EAAU,SAAS,WAAW,EAC/CO,EAAkBD,EAAe,IAAI,iBAAiB,EACtDE,EAAgBF,EAAe,IAAI,eAAe,EAClDG,EAAgBH,EAAe,IAAI,eAAe,EAEtDE,EAAgB,KAAK,IAAI,EAAGA,GAAiB,CAAC,EAC9CC,EAAgB,KAAK,IAAID,EAAeC,GAAiB,CAAC,EAC1D,IAAIC,EAAgBJ,EAAe,IAAI,eAAe,EAClDK,EAAUL,EAAe,IAAI,SAAS,EACtCM,EAAiBN,EAAe,SAAS,WAAW,EACpDO,EAAYD,EAAe,aAAa,EACxCE,EAAcD,EAAU,OACxBE,EAAcF,EAAU,UACxBG,EAAaH,EAAU,SACvBI,EAAQJ,EAAU,KAClBK,EAAQ,IAAIC,GAAM,CACpB,aAAc,EAChB,CAAC,EACGC,EAAmBjB,EAAK,aAAa,EACrCkB,EAAmBrC,IAAUe,CAAQ,EAAE,aAAef,IAAUe,CAAQ,EAAE,WAAa,CAAC,GAC5FN,IAA2B4B,CAAgB,EA+B3C,QA9BIC,EAAU,SAAU1B,EAAG,CACzB,IAAI2B,EAAcnB,EAAWR,CAAC,EAAE,CAAC,EAAE,MAAS,YAGxC4B,EAAS,CAAC,EACdA,EAAO,CAAC,EAAIrB,EAAK,cAAcA,EAAK,YAAYoB,EAAY,KAAM,EAAI,CAAC,EACvEC,EAAO,CAAC,EAAIrB,EAAK,cAAcA,EAAK,YAAYoB,EAAY,KAAM,EAAI,CAAC,EACnEC,EAAO,CAAC,EAAIA,EAAO,CAAC,GACtBA,EAAO,QAAQ,EAEjB,IAAIC,EAAevC,IAAoBmC,EAAkBE,CAAW,EACpEE,EAAa,aAAe,GAC5B,IAAIC,EAAa,IAAIP,GACrBQ,EAAgBF,EAAa,iBAAkBC,EAAYF,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGJ,EAAkBG,CAAW,EAC1Gb,GACFgB,EAAW,GAAG,QAAS,UAAY,CACjC,IAAIE,EAAU,CACZ,KAAMC,GACN,OAAQ,CAAC,CACP,MAAON,EAAY,YAAY,MAC/B,IAAKA,EAAY,YAAY,GAC/B,CAAC,CACH,EACAK,EAAQzB,EAAK,IAAM,WAAW,EAAIH,EAAU,eAC5CE,EAAI,eAAe0B,CAAO,CAC5B,CAAC,EAEHF,EAAW,OAAS,CAAChB,EACrBQ,EAAM,IAAIQ,CAAU,CACtB,EACS9B,EAAI,EAAGA,EAAIQ,EAAW,OAAQR,IACrC0B,EAAQ1B,CAAC,EAEXE,EAAU,IAAIoB,CAAK,EACnBvB,IAAwB0B,CAAgB,EACxC,SAASM,EAAgBG,EAAkBJ,EAAYK,EAAYC,EAAUZ,EAAkBa,EAAc,CAC3G,IAAIC,EAAgB,CAClB,OAAQpB,EACR,UAAWC,EACX,SAAUC,EACV,KAAM,MACR,EACImB,EAASf,EAAmB,EAAI,EAChCgB,EAAY,EAAID,EAChBE,EAAiBpC,EAAaqC,GAAGF,CAAS,CAAC,EAAInC,EAAasC,GAAGH,CAAS,CAAC,EAE7E,SAASI,EAAYC,GAAU,CAC7B,IAAIC,GAAO,CAAC,EACRC,GAAS,CAAC,EACdD,GAAKP,CAAM,EAAIQ,GAAOR,CAAM,EAAIM,GAChCC,GAAKN,CAAS,EAAInC,EAAaqC,GAAGF,CAAS,CAAC,EAC5CO,GAAOP,CAAS,EAAIC,EACpB,IAAIO,GAAa,CACf,GAAIF,GAAK,CAAC,EACV,GAAIA,GAAK,CAAC,EACV,GAAIC,GAAO,CAAC,EACZ,GAAIA,GAAO,CAAC,CACd,EACA,OAAAE,GAAqBD,GAAYA,GAAY,CAC3C,UAAW,CACb,CAAC,EACDF,GAAK,CAAC,EAAIE,GAAW,GACrBF,GAAK,CAAC,EAAIE,GAAW,GACdF,GAAKP,CAAM,CACpB,CACAJ,EAAaS,EAAYT,CAAU,EACnCC,EAAWQ,EAAYR,CAAQ,EAK/B,QAJIc,EAAU,CAAC,EACXC,EAAU,CAAC,EACXC,EAAS,GACTC,GAAUhD,EAAaqC,GAAGF,CAAS,CAAC,EAC/Bc,GAAM,GAAIA,KAAO,CAGxB,IAAIC,GAAeF,KAAYhD,EAAaqC,GAAGF,CAAS,CAAC,EACrDgB,GAAcH,IAAWZ,EACzBe,KACFH,GAAUZ,GAEZ,IAAIgB,GAAK,CAAC,EACNC,EAAK,CAAC,EACVD,GAAGlB,CAAM,EAAIJ,EACbuB,EAAGnB,CAAM,EAAIH,EACT,CAACmB,IAAgB,CAACC,KACpBC,GAAGlB,CAAM,GAAKa,EAAS,CAACzC,EAAkBA,EAC1C+C,EAAGnB,CAAM,GAAMa,EAA4BzC,EAAnB,CAACA,GAE3B8C,GAAGjB,CAAS,EAAIa,GAChBK,EAAGlB,CAAS,EAAIa,GAChBH,EAAQ,KAAKO,EAAE,EACfN,EAAQ,KAAKO,CAAE,EACf,IAAIC,EAAY,OAShB,GARIL,GAAMpB,EAAiB,OACzByB,EAAYzB,EAAiBoB,EAAG,GAEhCK,EAAY,KAAK,OAAO,EACxBzB,EAAiB,KAAKyB,CAAS,GAEjCN,IAAWM,GAAa9C,EAAgBD,GAAiBA,EACzDwC,EAAS,CAACA,EACNI,GACF,KAEJ,CACA,IAAII,GAAahE,GAAoB,EAAE,6BAA6ByC,EAAa,WAAW,EAa5F,GAXAP,EAAW,IAAI,IAAI+B,GAAS,CAC1B,KAAM,WAAaD,GACnB,MAAO,CACL,OAAQV,CACV,EACA,MAAOZ,EACP,EAAGvB,CACL,CAAC,CAAC,EAIEsB,EAAa,UAAY,EAAG,CAC9BP,EAAW,IAAI,IAAI+B,GAAS,CAC1B,KAAM,WAAaD,GACnB,MAAO,CAEL,OAAQT,CACV,EACA,MAAOb,EACP,EAAGvB,CACL,CAAC,CAAC,EAGF,IAAI+C,GAAWX,EAAQ,MAAM,EAC7BW,GAAS,QAAQ,EACjB,IAAIC,GAAgBb,EAAQ,OAAOY,EAAQ,EAC3ChC,EAAW,IAAI,IAAIkC,GAAQ,CACzB,KAAM,WAAaJ,GACnB,MAAO,CACL,OAAQG,EACV,EACA,MAAO,CACL,KAAM1C,EACN,QAASJ,EAAU,OACrB,EACA,EAAGF,CACL,CAAC,CAAC,CACJ,CACF,CACF,CACA,SAASkD,IAAmB7D,EAAWkB,EAAO4C,EAAgBC,EAAc,CAC1E,IAAI5D,EAAOH,EAAU,KACjBgE,EAAYF,EAAe,UAC/BG,GAAOF,EAAa,KAAK,EACzB,IAAIG,EAAS/D,EAAK,UAAU,EACxBA,EAAK,UACP+D,EAASA,EAAO,MAAM,EACtBA,EAAO,QAAQ,GAEjB,IAAI9D,EAAaZ,GAAoB,EAAE,uBAAuBW,EAAK,MAAM,SAAS,CAChF,WAAY,YACd,CAAC,EAAG,SAAUE,EAAM,CAClB,OAAOA,EAAK,KACd,EAAG,EAAK,EACJ8D,EAAgBC,EAAIhE,EAAY,SAAUiE,EAAW,CACvD,IAAI9C,EAAc8C,EAAU,CAAC,EAAE,MAAS,YACpCC,EAAY,CAACnE,EAAK,YAAYoB,EAAY,KAAM,EAAI,EAAGpB,EAAK,YAAYoB,EAAY,KAAM,EAAI,CAAC,EACnG,OAAA+C,EAAU,CAAC,EAAIA,EAAU,CAAC,GAAKA,EAAU,QAAQ,EAC1C,CACL,UAAWA,EACX,MAAO9E,GAAoB,EAAE,6BAA6B+B,EAAY,WAAW,CACnF,CACF,CAAC,EACD4C,EAAc,KAAK,SAAUI,EAASC,EAAS,CAC7C,OAAOD,EAAQ,UAAU,CAAC,EAAIC,EAAQ,UAAU,CAAC,CACnD,CAAC,EAGD,QAFIC,EAAUP,EAAO,CAAC,EAClBQ,EAAa,KACRxB,EAAM,EAAGA,EAAMiB,EAAc,OAAQjB,IAAO,CACnD,IAAIyB,EAASR,EAAcjB,CAAG,EAC1B0B,EAAgB,KAAK,IAAID,EAAO,UAAU,CAAC,EAAGT,EAAO,CAAC,CAAC,EACvDW,EAAgB,KAAK,IAAIF,EAAO,UAAU,CAAC,EAAGT,EAAO,CAAC,CAAC,EACvDO,GAAWG,GACbE,EAAOL,EAASG,EAAeF,EAAYC,CAAM,EAEnDF,EAAUI,EACVH,EAAaC,CACf,CACIF,GAAWP,EAAO,CAAC,GACrBY,EAAOL,EAASP,EAAO,CAAC,EAAGQ,EAAY,IAAI,EAE7C,SAASI,EAAOC,EAAKC,EAAKT,EAASC,EAAS,CAC1C,SAASS,EAAMC,EAAIC,EAAI,CACjBnB,IACFoB,GAAeF,EAAIA,EAAIlB,CAAS,EAChCoB,GAAeD,EAAIA,EAAInB,CAAS,EAEpC,CACA,SAASqB,EAAmBH,EAAIC,EAAI,CAClC,IAAIG,EAAQ,CACV,GAAIJ,EAAG,CAAC,EACR,GAAIA,EAAG,CAAC,EACR,GAAIC,EAAG,CAAC,EACR,GAAIA,EAAG,CAAC,CACV,EACAtC,GAAqByC,EAAOA,EAAOvB,EAAa,KAAK,EACrDmB,EAAG,CAAC,EAAII,EAAM,GACdJ,EAAG,CAAC,EAAII,EAAM,GACdH,EAAG,CAAC,EAAIG,EAAM,GACdH,EAAG,CAAC,EAAIG,EAAM,EAChB,CACA,IAAIC,EAAS,CAACR,EAAK,CAAC,EAChBS,EAAS,CAACR,EAAK,CAAC,EAGhBS,EAAgB,CAACV,EAAK,CAAC,EACvBW,EAAgB,CAACV,EAAK,CAAC,EAC3BC,EAAMM,EAAQE,CAAa,EAC3BJ,EAAmBE,EAAQE,CAAa,EACxCR,EAAMO,EAAQE,CAAa,EAC3BL,EAAmBG,EAAQE,CAAa,EAExCL,EAAmBE,EAAQC,CAAM,EACjC,IAAIG,EAAM,IAAIC,GAAKC,EAAO,CACxB,MAAO,CACL,GAAIN,EAAO,CAAC,EACZ,GAAIA,EAAO,CAAC,EACZ,GAAIC,EAAO,CAAC,EACZ,GAAIA,EAAO,CAAC,CACd,CACF,EAAGzB,CAAY,CAAC,EAChB7C,EAAM,IAAIyE,CAAG,EAEbA,EAAI,KAAO,cAAgBpB,EAAUA,EAAQ,MAAQ,MAAQ,QAAUC,EAAUA,EAAQ,MAAQ,KACnG,CACF,CAMA,SAASsB,IAAqBC,EAAaC,EAAcC,EAAY,CACnE,GAAI3G,GAAK2G,EAAY,SAAU1G,EAAM,CACnC,MAAO,CAACA,CACV,CAAC,EACC,OAEF,IAAI2G,EAAM,IAAIC,GACd,GAAI,CAACC,GAAeH,EAAW,CAAC,EAAGA,EAAW,CAAC,EAAGC,EAAK,CAIrD,UAAW,EAAEH,EAAcC,EAAe,KAAK,GAAKA,GACpD,eAAgB,EAGhB,cAAe,EACjB,CAAC,EACC,OAGF,IAAIK,EAAyBC,GAAO,EACzBC,GAAOF,EAAaA,EAAa,CAACL,CAAY,EACzD,IAAIQ,EAAmBpC,EAAI6B,EAAY,SAAUtB,EAAQ,CACvD,OAAOA,EAAO,UAAuB8B,GAAeH,GAAO,EAAGD,EAAa1B,EAAO,SAAS,EAAI0B,CACjG,CAAC,EACD,SAASK,EAAiBC,EAAO,CAE/B,IAAIC,EAAYX,EAAW,CAAC,EAAE,UAC1BY,EAAY,IAAIV,GAAMS,EAAUrE,GAAGoE,CAAK,CAAC,EAAIH,EAAiB,CAAC,EAAE,CAAC,EAAGI,EAAUrE,GAAGoE,CAAK,CAAC,EAAIH,EAAiB,CAAC,EAAE,CAAC,CAAC,EACtH,OAAO,KAAK,IAAIK,EAAU,CAAC,EAAI,IACjC,CAMA,IAAIC,EAAI,GAcR,GAAIJ,EAAiB,CAAC,GAAKA,EAAiB,CAAC,EAAG,CAC9C,IAAIK,EAAS3C,EAAI6B,EAAY,SAAUtB,EAAQzB,EAAK,CAClD,IAAI8D,EAAOrC,EAAO,UAAU,MAAM,EAClC,OAAAqC,EAAK,eAAeR,EAAiBtD,CAAG,CAAC,EAClC8D,CACT,CAAC,EACGC,EAAc,IAAId,GACtBc,EAAY,KAAKhB,EAAW,CAAC,EAAE,KAAK,EAAE,IAAIA,EAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAG,EACxEgB,EAAY,UAAUZ,CAAW,EACjC,IAAIa,EAAQhB,EAAI,MAAM,EAAE,UAAUG,CAAW,EACzCc,EAAcJ,EAAO,CAAC,EAAE,EAAIA,EAAO,CAAC,EAAE,GAAKG,EAAM,GAAK,EAAIH,EAAO,CAAC,EAAE,MAAQA,EAAO,CAAC,EAAE,OACtFK,GAAQD,EAAcD,EAAM,GAAK,EAAID,EAAY,EACjDI,EAAU,KAAK,IAAID,EAAMA,EAAOF,EAAM,CAAC,EACvCI,EAAU,KAAK,IAAIF,EAAMA,EAAOF,EAAM,CAAC,EACvCK,EAAOD,EAAU,EAAIA,EAAUD,EAAU,EAAIA,EAAU,EAC3DP,GAAKM,EAAOG,GAAQL,EAAM,CAC5B,CACA,IAAIM,EAAS,IAAIrB,GACbsB,EAAS,IAAItB,GACjBA,GAAM,MAAMqB,EAAQtB,EAAK,CAACY,CAAC,EAC3BX,GAAM,MAAMsB,EAAQvB,EAAK,EAAIY,CAAC,EAC9BY,GAA4BzB,EAAW,CAAC,EAAGuB,CAAM,EACjDE,GAA4BzB,EAAW,CAAC,EAAGwB,CAAM,CACnD,CACA,SAASE,IAAqBC,EAAOhG,EAAS,CAC5C,IAAIiG,EAAS,CACX,OAAQ,CAAC,CACX,EACA,OAAAnI,EAAKkC,EAAQ,OAAQ,SAAUkG,EAAU,CACvC,GAAKA,EAGL,KAAIC,EAAczI,GAAKsI,EAAM,IAAI,SAAU,EAAI,EAAG,SAAUI,EAAW,CACrE,OAAOxI,GAAoB,EAAE,kBAAkBwI,EAAWF,CAAQ,CACpE,CAAC,EACD,GAAKC,EAML,KAAIE,EAAarG,EAAQ,KACrBsG,EAAM,CACR,WAAY,CAAC,CAACH,EAAY,UAC5B,EACAA,EAAY,WAAaE,IAAepG,GAAgC,GAAOoG,IAAeE,GAAkC,GAAQF,IAAeG,GAAgC,CAACL,EAAY,WAAaA,EAAY,WAC7NF,EAAO,OAAO,KAAK,CACjB,MAAOE,EAAY,MACnB,IAAKA,EAAY,IACjB,WAAY,CAAC,CAACA,EAAY,WAC1B,IAAKG,CACP,CAAC,GACH,CAAC,EACML,CACT,CACO,SAASQ,KAAyB,CACvCC,IAA4B,CAC1B,qBAAsBxC,IACtB,mBAAoBjC,IACpB,wBAAyBhE,IACzB,qBAAsB8H,GACxB,CAAC,CACH,CC1aO,SAASY,GAAiBC,EAAW,CAC1CC,IAAeD,CAAS,EACxBE,IAAwB,EACxBC,IAAuB,CACzB,CCCO,SAASC,IAAgC,CAC9CC,IAAmCC,GAA2B,CAChE,CAIA,SAASA,IAA4BC,EAAUC,EAAU,CACvDC,EAAKF,EAAU,SAAUG,EAAM,CAC7B,GAAI,CAACA,EAAK,MAAM,IAAI,CAAC,YAAa,QAAQ,CAAC,EAAG,CAC5C,IAAIC,EAAiBC,IAAuBF,CAAI,EAChD,GAAIC,EAAgB,CAClB,IAAIE,EAAMH,EAAK,aAAa,EAAI,SAAW,QACvCI,EAASJ,EAAK,MAAM,IAAI,CAAC,YAAa,QAAQ,CAAC,EACnDF,EAASK,CAAG,GAAKF,EAAeE,CAAG,EAAIC,EACnCJ,EAAK,WAAa,MACpBF,EAAS,GAAKG,EAAe,OAASG,EAC7BJ,EAAK,WAAa,SAC3BF,EAAS,GAAKG,EAAe,MAAQG,EAEzC,CACF,CACF,CAAC,CACH,CAIA,SAASF,IAAuBF,EAAM,CACpC,IAAIK,EAAYL,EAAK,MACjBM,EAAQN,EAAK,MACjB,GAAI,CAACK,EAAU,IAAI,CAAC,YAAa,MAAM,CAAC,GAAKC,EAAM,QAAQ,EACzD,OAEF,IAAIC,EACAC,EACAC,EAAsBH,EAAM,UAAU,EAEtCA,aAAiBI,GACnBF,EAAYF,EAAM,MAAM,GAExBC,EAAuBD,EAAM,SAAS,EACtCE,EAAYD,EAAqB,QAEnC,IAAII,EAAiBX,EAAK,cAAc,EACpCY,EAAiBC,GAAmBb,CAAI,EACxCc,EACAC,EAAO,EAEPP,EAAY,KACdO,EAAO,KAAK,KAAKP,EAAY,EAAE,GAEjC,QAASQ,EAAI,EAAGA,EAAIR,EAAWQ,GAAKD,EAAM,CACxC,IAAIE,EAAOV,EAAuBA,EAAqBS,CAAC,EAAI,CAC1D,MAAOP,EAAoB,CAAC,EAAIO,CAClC,EACIE,EAAQN,EAAeK,EAAMD,CAAC,EAC9BG,EAAsBR,EAAe,YAAYO,CAAK,EACtDE,EAAaC,EAAeF,EAAqBR,EAAe,IAAI,QAAQ,GAAK,CAAC,EACtFG,EAAOA,EAAK,MAAMM,CAAU,EAAIN,EAAOM,CACzC,CACA,OAAON,EACP,SAASO,EAAeC,EAAUC,EAAQ,CACxC,IAAIC,EAAgBD,EAAS,KAAK,GAAK,IACnCE,EAAcH,EAAS,MACvBI,EAAeJ,EAAS,OACxBK,EAAaF,EAAc,KAAK,IAAI,KAAK,IAAID,CAAa,CAAC,EAAI,KAAK,IAAIE,EAAe,KAAK,IAAIF,CAAa,CAAC,EAC9GI,EAAcH,EAAc,KAAK,IAAI,KAAK,IAAID,CAAa,CAAC,EAAI,KAAK,IAAIE,EAAe,KAAK,IAAIF,CAAa,CAAC,EAC/GK,EAAc,IAAIC,GAAaR,EAAS,EAAGA,EAAS,EAAGK,EAAYC,CAAW,EAClF,OAAOC,CACT,CACF,CC3DAE,GAAI,CAACC,EAAc,CAAC,EAGpBD,GAAI,CAACC,EAAW,CAAC,EAUjBD,GAAI,CAACC,GAAWA,GAAUA,GAAUA,GAAcA,GAAYA,GAAUA,GAAWA,GAAcA,GAAYA,GAAYA,GAAYA,GAAaA,GAAeA,GAAaA,GAAcA,GAAkBA,GAAoBA,GAAYA,GAAcA,GAAmBA,GAAiBA,GAAeA,EAAW,CAAC,EAe3TD,GAAIC,EAAa,EAUjBD,GAAIC,EAAc,EAQlBD,GAAIC,EAAY,EAOhBD,GAAIC,EAAmB,EASvBD,GAAIC,EAAiB,EAQrBD,GAAIC,EAAiB,EAQrBD,GAAIC,EAAe,EAQnBD,GAAIC,EAAgB,EAKpBD,GAAIC,EAAgB,EAKpBD,GAAIC,EAAgB,EASpBD,GAAIC,EAAoB,EASxBD,GAAIC,EAAc,EAKlBD,GAAIC,EAAc,EAKlBD,GAAIC,EAAiB,EAKrBD,GAAIC,EAAkB,EAKtBD,GAAIC,EAAiB,EAKrBD,GAAIC,EAAiB,EAKrBD,GAAIC,EAAe,EAEnBD,GAAIC,EAAiB,EAMrBD,GAAIC,EAAuB,EAK3BD,GAAIC,EAAuB,EAE3BD,GAAIC,EAAkB,EAKtBD,GAAIC,EAA4B,EAKhCD,GAAIC,EAA2B,EAC/BD,GAAIC,EAAkB,EAKtBD,GAAIC,EAAa,EAOjBD,GAAIC,EAAkB,EACtBD,GAAIC,EAAgB,EAOpBD,GAAIE,EAAmB,EAOvBF,GAAIG,EAAW,EACfH,GAAII,EAAS,EACbJ,GAAIK,EAAsB,EAC1BL,GAAIM,EAAa,ECjQjB,IAAMC,IAAaC,GAAE,MAAMA,GAAE,OAAO,CAAE,KAAMA,GAAE,OAAO,EAAG,MAAOA,GAAE,OAAO,CAAE,CAAC,CAAC,EAMrEC,IAAQ,KACN,CACL,MAAO,CACL,GAAI,EAAE,KAAK,eAAe,aACxB,OAGF,IAAMC,EAAW,KAAK,IAAI,QAAQ,OAClC,GAAI,CAACA,EACH,OAGF,IAAMC,EAAOJ,IAAW,UAAU,KAAK,MAAMG,CAAQ,CAAC,EAEtD,GAAI,CAACC,EAAK,QACR,OAGF,IAAMC,EAAgBC,GAAK,KAAK,GAAG,EAE7BC,EAAS,CACb,QAAS,CACP,QAAS,OACT,YAAa,CACX,KAAM,QACR,CACF,EACA,MAAO,CACL,KAAM,WACN,KAAMH,EAAK,KAAK,IAAKI,GAASA,EAAK,IAAI,CACzC,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAMJ,EAAK,KAAK,IAAKI,GAASA,EAAK,KAAK,EACxC,KAAM,MACN,UAAW,CACT,MAAO,SACT,CACF,CACF,CACF,EAEAH,EAAM,UAAUE,CAAM,EAEtB,OAAO,iBAAiB,SAAU,IAAM,CACtCF,EAAM,OAAO,CACf,CAAC,CACH,CACF,GCzDF,IAAMI,IAAaC,GAAE,MAAMA,GAAE,OAAO,CAAE,KAAMA,GAAE,OAAO,EAAG,MAAOA,GAAE,OAAO,CAAE,CAAC,CAAC,EAMrEC,IAAQ,KACN,CACL,MAAO,CACL,GAAI,EAAE,KAAK,eAAe,aACxB,OAGF,IAAMC,EAAW,KAAK,IAAI,QAAQ,OAElC,GAAI,CAACA,EACH,OAGF,IAAMC,EAAOJ,IAAW,UAAU,KAAK,MAAMG,CAAQ,CAAC,EAEtD,GAAI,CAACC,EAAK,QACR,OAGF,IAAMC,EAAgBC,GAAK,KAAK,GAAG,EAE7BC,EAAS,CACb,QAAS,CACP,QAAS,MACX,EACA,OAAQ,CACN,CACE,KAAM,MACN,OAAQ,CAAC,MAAO,KAAK,EACrB,OAAQ,CAAC,MAAO,KAAK,EACrB,KAAMH,EAAK,IACb,CACF,CACF,EAQA,GANA,OAAO,iBAAiB,SAAU,IAAM,CACtCC,EAAM,OAAO,CACf,CAAC,EAIG,OAAO,qBAAyB,IAAa,CAC/CA,EAAM,UAAUE,CAAM,EACtB,MACF,CAEA,IAAMC,EAAW,IAAI,qBAAsBC,GAAY,CACrD,QAAWC,KAASD,EAClB,GAAIC,EAAM,eAAgB,CAExBL,EAAM,OAAO,EACbA,EAAM,UAAUE,CAAM,EACtBC,EAAS,WAAW,EACpB,KACF,CAEJ,CAAC,EAEDA,EAAS,QAAQ,KAAK,GAAG,CAC3B,CACF,GClEF,IAAMG,IAAgBC,GACpB,IAAI,KAAK,eAAe,QAAS,CAC/B,SAAUC,GACV,KAAM,SACR,CAAC,EAAE,OAAOD,CAAK,EAMVE,IAAQ,KAA+B,CAC5C,MAAO,CACL,KAAK,MAAQ,KAAK,IAAI,cAAc,OAAO,GAAG,KAChD,EAEA,QAAS,CACD,KAAK,eAAe,mBAI1B,KAAK,MAAQ,KAAK,IAAI,MACxB,EAEA,OAAQ,CACN,GAAI,CACF,KAAK,IAAI,cAAc,OAAO,GAAG,WAAW,CAC9C,MAAQ,CAGR,CACF,EAEA,MAAO,CACL,GAAI,KAAK,QAAU,OACjB,OAKF,IAAMC,EAAQ,KAAK,MAAM,SAAS,GAAG,EAC/BH,EAAQ,IAAI,KAAKG,EAAQ,KAAK,MAAM,MAAM,EAAG,EAAE,EAAI,KAAK,KAAK,EAEnE,GAAI,MAAMH,EAAM,QAAQ,CAAC,EACvB,MAAO,IAGT,IAAMI,EAAOL,IAAaC,CAAK,EAE3BK,EAAQ,IAAI,KAAK,eAAe,QAAS,CAC3C,SAAUJ,GACV,IAAK,UACL,MAAO,OACT,CAAC,EAAE,OAAOD,CAAK,EAEf,OAAID,IAAa,IAAI,IAAM,IAAMK,IAC/BC,GAAS,IAAID,EAAK,MAAM,EAAE,CAAC,IAGzBD,IACFE,GAAS,KAAK,KAAK,MAAM,MAAM,GAAI,EAAE,CAAC,IAGjCA,CACT,EAEA,MAAO,MACT,GCzDO,IAAMC,GAAS,CACpB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAEaC,GAAQ,UAGRC,GAAS,UAETC,GAAM,UACNC,GAAQ,UACRC,GAAO,UACPC,GAAU,UAEVC,GAAS,CACpB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EAEO,SAASC,GAAUC,EAAqB,CAC7C,IAAMC,EAAQD,EAAI,MAAM,GAAG,EAC3B,MAAO,GAAG,OAAOC,EAAM,CAAC,CAAC,CAAC,IAAIH,GAAO,OAAOG,EAAM,CAAC,CAAC,EAAI,CAAC,GAAK,EAAE,EAClE,CAEO,SAASC,GAASF,EAAqB,CAC5C,MAAO,GAAGD,GAAUC,CAAG,CAAC,IAAIA,EAAI,MAAM,EAAG,CAAC,CAAC,EAC7C,CAEO,SAASG,GAAMC,EAAuB,CAC3C,MAAO,OAAI,KAAK,MAAMA,EAAQ,GAAG,EAAE,eAAe,OAAO,CAAC,EAC5D,CAEO,SAASC,GAAKC,EAAcC,EAAY,GAA0B,CACvE,IAAMC,EAAK,SAAS,cAAc,IAAI,EACtC,OAAAA,EAAG,UAAY,+BAA+BD,CAAS,GAAG,KAAK,EAC/DC,EAAG,YAAcF,EACVE,CACT,CAEO,SAASC,GAASC,EAAcC,EAAuC,CAC5E,IAAMH,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,gBAEf,IAAMI,EAAO,SAAS,cAAc,MAAM,EAG1C,GAFAA,EAAK,UAAY,0BAEbD,EAAQ,CACV,IAAME,EAAM,SAAS,cAAc,MAAM,EACzCA,EAAI,UAAY,kCAChBA,EAAI,MAAM,gBAAkBF,EAC5BC,EAAK,OAAOC,CAAG,CACjB,CAEA,IAAMC,EAAQ,SAAS,cAAc,MAAM,EAC3C,OAAAA,EAAM,YAAcJ,EACpBE,EAAK,OAAOE,CAAK,EACjBN,EAAG,OAAOI,CAAI,EAEPJ,CACT,CAEO,SAASO,GACdC,EACAC,EACAC,EACa,CACb,IAAMC,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,WAEf,IAAMC,EAAK,SAAS,cAAc,IAAI,EACtC,OAAAA,EAAG,UAAY,0BACfA,EAAG,YAAcJ,EACjBG,EAAG,OAAOC,CAAE,EAEZH,EAAK,QAAQ,CAACH,EAAOO,IAAU,CAC7B,IAAMC,EAAO,SAAS,cAAc,IAAI,EACxCA,EAAK,UAAY,4BACfD,IAAUH,EAAW,2BAA6B,EACpD,GAAG,KAAK,EACRI,EAAK,YAAcR,EACnBK,EAAG,OAAOG,CAAI,CAChB,CAAC,EAEMH,CACT,CAGO,SAASI,GAAQC,EAAoD,CAC1E,IAAML,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,WAEf,OAAW,CAACL,EAAOW,CAAK,IAAKD,EAAS,CACpC,IAAMJ,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,wCAAwCK,CAAK,GAC5DL,EAAG,YAAcN,EACjBK,EAAG,OAAOC,CAAE,CACd,CAEA,OAAOD,CACT,CAEO,SAASO,GAASF,EAAiBG,EAA8B,CACtE,IAAMR,EAAK,SAAS,cAAc,IAAI,EAChCX,EAAK,SAAS,cAAc,IAAI,EACtC,OAAAA,EAAG,QAAUgB,EACbhB,EAAG,UAAY,gCACfA,EAAG,YAAcmB,EACjBR,EAAG,OAAOX,CAAE,EACLW,CACT,CAOO,SAASS,GACdC,EACAC,EACApB,EACU,CACV,GAAImB,EAAQ,SAAWC,EAAI,OACzB,MAAO,CAACpB,CAAI,EAGd,IAAMqB,EAAOF,EAAQ,SAASnB,CAAI,EAC9BmB,EAAQ,OAAQG,GAAUA,IAAUtB,CAAI,EACxC,CAAC,GAAGmB,EAASnB,CAAI,EAErB,OAAOqB,EAAK,OAASA,EAAO,CAAC,GAAGD,CAAG,CACrC,CAGO,SAASG,GACdC,EACAV,EACAW,EACAC,EACAC,EACA,CACA,GAAI,EAAEH,aAAgB,aACpB,OAGFA,EAAK,YAAc,GAEnB,IAAMZ,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OAAOC,GAAQC,CAAO,CAAC,EAE5B,IAAMc,EAAO,SAAS,cAAc,OAAO,EAM3C,GALAA,EAAK,UAAY,WACjBA,EAAK,OAAO,GAAIH,EAAK,OAASA,EAAO,CAACT,GAASF,EAAQ,OAAQY,CAAK,CAAC,CAAE,EAEvEF,EAAK,OAAOZ,EAAMgB,CAAI,EAElBD,GAAQF,EAAK,OAAQ,CACvB,IAAMI,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,OAAOF,CAAI,EACjBH,EAAK,OAAOK,CAAK,CACnB,CACF,CAEO,SAASC,MAAOC,EAA4C,CACjE,IAAMtB,EAAK,SAAS,cAAc,IAAI,EACtC,OAAAA,EAAG,UAAY,mBACfA,EAAG,OAAO,GAAGsB,CAAK,EACXtB,CACT,CAEO,SAASuB,MAAYD,EAA4C,CACtE,IAAMtB,EAAK,SAAS,cAAc,IAAI,EACtC,OAAAA,EAAG,UAAY,yBACfA,EAAG,OAAO,GAAGsB,CAAK,EACXtB,CACT,CClMA,IAAMwB,GAAgBC,GAAE,OAAO,CAC7B,UAAWA,GAAE,OAAO,EACpB,IAAKA,GAAE,OAAO,EACd,QAASA,GAAE,OAAO,CACpB,CAAC,EAEKC,IAAcD,GAAE,OAAO,CAC3B,MAAOA,GAAE,OAAO,EAChB,QAASD,GACT,MAAOA,EACT,CAAC,EAEKG,IAAeH,GAAc,OAAO,CAAE,OAAQC,GAAE,OAAO,CAAE,CAAC,EAE1DG,GAAaH,GAAE,OAAO,CAC1B,SAAUA,GAAE,MAAME,GAAY,EAC9B,WAAYF,GAAE,OAAOA,GAAE,OAAO,EAAGA,GAAE,OAAO,CAAC,CAC7C,CAAC,EAEKI,IAAcJ,GAAE,OAAO,CAC3B,MAAOA,GAAE,OAAO,EAChB,eAAgBA,GAAE,OAAO,EACzB,eAAgBA,GAAE,OAAO,EACzB,gBAAiBA,GAAE,OAAO,CAC5B,CAAC,EAEKK,IAAiBL,GAAE,OAAO,CAC9B,MAAOA,GAAE,OAAO,EAChB,SAAUA,GAAE,OAAOA,GAAE,OAAO,EAAGA,GAAE,OAAO,CAAC,EACzC,QAASA,GAAE,OAAO,EAClB,KAAMA,GAAE,OAAO,EACf,MAAOI,IAAY,SAAS,EAC5B,SAAUJ,GAAE,OAAOA,GAAE,OAAO,EAAGA,GAAE,OAAO,CAAC,EACzC,eAAgBA,GAAE,OAAO,CAC3B,CAAC,EAEKM,IAAcN,GAAE,OAAO,CAC3B,KAAMA,GAAE,OAAO,EACf,SAAUA,GAAE,OAAO,EACnB,UAAWA,GAAE,OAAO,EACpB,YAAaA,GAAE,OAAO,EACtB,QAASA,GAAE,OAAO,EAClB,iBAAkBA,GAAE,OAAO,EAC3B,iBAAkBA,GAAE,OAAO,EAC3B,mBAAoBA,GAAE,OAAO,EAC7B,kBAAmBA,GAAE,OAAO,EAC5B,iBAAkBA,GAAE,OAAO,EAC3B,mBAAoBA,GAAE,OAAO,CAC/B,CAAC,EAEKO,GAA+BC,GACnCR,GAAE,OAAO,CAAE,KAAMQ,EAAQ,MAAOA,EAAQ,QAASA,CAAO,CAAC,EAE9CC,IAAiBT,GAAE,OAAO,CACrC,MAAOA,GAAE,OAAO,EAChB,OAAQO,GAAOP,GAAE,MAAMC,GAAW,CAAC,EACnC,MAAOD,GAAE,OAAO,CAAE,KAAMG,GAAY,MAAOA,GAAY,IAAKA,EAAW,CAAC,EACxE,SAAUI,GAAOP,GAAE,MAAMK,GAAc,CAAC,EACxC,YAAaL,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC/B,MAAOO,GAAOD,GAAW,EACzB,SAAUN,GAAE,OAAO,CACjB,UAAWA,GAAE,MAAMA,GAAE,OAAO,CAAE,SAAUA,GAAE,OAAO,EAAG,KAAMA,GAAE,OAAO,CAAE,CAAC,CAAC,EACvE,YAAaA,GAAE,MACbA,GAAE,OAAO,CACP,WAAYA,GAAE,OAAO,EACrB,WAAYA,GAAE,OAAO,EACrB,KAAMA,GAAE,OAAO,EACf,SAAUA,GAAE,OAAO,EACnB,eAAgBA,GAAE,OAAO,CAC3B,CAAC,CACH,EACA,YAAaA,GAAE,MACbA,GAAE,OAAO,CACP,WAAYA,GAAE,OAAO,EACrB,SAAUA,GAAE,OAAO,EACnB,eAAgBA,GAAE,OAAO,CAC3B,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAUYU,GAAU,CACrB,CAAC,YAAa,aAAa,EAC3B,CAAC,MAAO,MAAM,EACd,CAAC,UAAW,UAAU,CACxB,EAEaC,IAAa,aAEpBC,IAA+B,CACnC,KAAM,OACN,MAAO,QACP,QAAS,SACX,EAGO,SAASC,GAAYC,EAAcC,EAAuB,CAC/D,IAAMC,EAAOD,EAAM,MAAM,EAAG,CAAC,EACvBE,EAAQ,OAAOF,EAAM,MAAM,EAAG,CAAC,CAAC,EAEtC,OAAID,IAAU,OACL,GAAG,OAAOC,EAAM,MAAM,EAAG,EAAE,CAAC,CAAC,IAAIG,GAAOD,EAAQ,CAAC,GAAK,EAAE,GAG7DH,IAAU,QACL,GAAGI,GAAOD,EAAQ,CAAC,GAAK,EAAE,IAAID,CAAI,GAGpC,IAAI,KAAK,OAAOC,EAAQ,GAAK,CAAC,EAAI,CAAC,IAAID,CAAI,EACpD,CAGO,SAASG,GACdL,EACAC,EACAK,EACQ,CACR,IAAMC,EACJP,IAAU,OACN,OAAOD,GAAYC,EAAOC,CAAK,CAAC,IAAIA,EAAM,MAAM,EAAG,CAAC,CAAC,GACrDF,GAAYC,EAAOC,CAAK,EAE9B,OAAOK,EAAS,GAAGC,CAAK,aAAeA,CACzC,CAGO,SAASC,IAAiBC,EAAuBC,EAAsB,CAC5E,GAAIA,IAASb,IACX,OAAOc,GAGT,IAAMC,EAAQH,EAAY,QAAQC,CAAI,EAEtC,OACEG,IAAQD,EAAQ,EAAIH,EAAY,OAASG,GAASC,GAAO,MAAM,GAAKF,EAExE,CAGO,SAASG,IACdL,EACAM,EACU,CACV,OAAON,EAAY,OAAQC,GAASK,EAAK,KAAMC,IAASA,EAAIN,CAAI,GAAK,GAAK,CAAC,CAAC,CAC9E,CAEO,SAASO,GAAQC,EAAcC,EAAuB,CAC3D,OAAOA,EAAQ,GAAG,KAAK,MAAOD,EAAOC,EAAS,GAAG,CAAC,IAAM,QAC1D,CAGO,SAASC,IAASpB,EAAcqB,EAAc,CACnD,IAAMC,EAAOxB,IAAME,CAAK,EAExB,MAAO,CACL,KAAMiB,GAAQI,EAAM,UAAWA,EAAM,QAAQ,EAC7C,SAAU,GAAGA,EAAM,SAAS,OAAOA,EAAM,QAAQ,kBAAkBC,CAAI,GACvE,OAAQL,GAAQI,EAAM,QAASA,EAAM,WAAW,EAChD,WAAY,GAAGA,EAAM,OAAO,OAAOA,EAAM,WAAW,kBAAkBC,CAAI,kCAC1E,SAAUL,GAAQI,EAAM,iBAAkBA,EAAM,gBAAgB,EAChE,aAAc,GAAGA,EAAM,gBAAgB,OAAOA,EAAM,gBAAgB,0BAAuBA,EAAM,kBAAkB,wBAAwBC,CAAI,GAC/I,SAAUL,GAAQI,EAAM,iBAAkBA,EAAM,iBAAiB,EACjE,aAAc,GAAGA,EAAM,gBAAgB,OAAOA,EAAM,iBAAiB,0BAAuBA,EAAM,kBAAkB,qBAAqBC,CAAI,EAC/I,CACF,CAGO,SAASC,GACdR,EACAS,EACU,CACV,OAAOA,EAAK,IAAKC,GACfV,EAAK,OAAO,CAACW,EAAKC,IAASD,EAAM,OAAOC,EAAKF,CAAG,GAAK,CAAC,EAAG,CAAC,CAC5D,CACF,CC3JA,IAAMG,IAAS,CACb,UACA,QACA,aACA,YACA,OACA,WACA,UACF,EAMMC,GAAQ,CACZ,CAAC,iBAAkB,gBAAgB,EACnC,CAAC,iBAAkB,gBAAgB,EACnC,CAAC,kBAAmB,iBAAiB,CACvC,EA6BA,SAASC,IAAOC,EAAuB,CACrC,GAAIA,EAAQ,IACV,OAAOC,GAAMD,CAAK,EAGpB,IAAME,EAAYF,EAAQ,IAE1B,MAAO,OAAIE,EAAY,GAAK,OAAOA,EAAU,QAAQ,CAAC,CAAC,EAAI,KAAK,MAAMA,CAAS,CAAC,GAClF,CAEA,SAASC,GAAOH,EAAuB,CACrC,OAAOA,EAAQ,EAAI,IAAIA,CAAK,GAAK,GAAGA,CAAK,EAC3C,CAEA,SAASI,IAAIC,EAAwB,CACnC,MAAO,2BAA2BA,CAAM,0FAC1C,CAGA,SAASC,GAAWC,EAAsB,CACxC,OAAOA,EAAK,QACV,WACCC,IACE,CAAE,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,IAAK,SAAU,IAAK,OAAQ,GACrEA,CACF,GAAKA,CACT,CACF,CAEA,SAASC,GAAaC,EAAeC,EAAmC,CACtE,MAAO,CACL,WAAWL,GAAWI,CAAK,CAAC,YAC5B,GAAGC,EAAM,IACP,CAAC,CAACN,EAAQE,CAAI,IAAM,GAAGF,EAASD,IAAIC,CAAM,EAAI,EAAE,GAAGC,GAAWC,CAAI,CAAC,EACrE,CACF,EAAE,KAAK,MAAM,CACf,CAEA,IAAMK,IAAY,CAAE,MAAOC,EAAM,EAC3BC,IAAY,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,EAE/C,SAASC,GAAaC,EAAkB,CACtC,MAAO,CACL,KAAM,WACN,KAAMA,EACN,UAAAL,IACA,SAAU,CAAE,UAAW,CAAE,MAAOG,EAAK,CAAE,EACvC,SAAU,CAAE,KAAM,EAAM,CAC1B,CACF,CAEA,SAASG,GAAUC,EAAoC,CACrD,MAAO,CACL,KAAM,QACN,YAAa,EACb,UAAW,CAAE,GAAGP,IAAW,UAAWO,CAAO,EAC7C,UAAAL,GACF,CACF,CAEA,SAASM,IAAS,CAChB,MAAO,CAAE,OAAQ,EAAG,KAAM,YAAa,UAAW,CAAE,MAAOP,EAAM,CAAE,CACrE,CAEA,IAAOQ,IAAQ,IAA8B,CAC3C,IAAMC,EAAqD,CAAC,EAEtDC,EAAO,CAACC,EAAeC,IAAsC,CACjEH,EAAOE,CAAG,GAAG,UAAUC,EAAQ,CAAE,SAAU,EAAK,CAAC,CACnD,EAEA,MAAO,CACL,KAAM,KACN,MAAO,QACP,KAAM,MACN,OAAQ,QACR,QAAS,CAAE,QAAS,SAAK,KAAM,EAAG,SAAU,CAAE,EAC9C,MAAO,CAAC,EAER,MAAO,CACL,GAAI,EAAE,KAAK,eAAe,aACxB,OAGF,IAAMC,EAAM,KAAK,IAAI,QAAQ,UACvBC,EAASD,EAAME,IAAe,UAAU,KAAK,MAAMF,CAAG,CAAC,EAAI,KAEjE,GAAKC,GAAQ,QAIb,MAAK,KAAOA,EAAO,KAEnB,QAAWH,KAAO3B,IAAQ,CACxB,IAAMgC,EAAO,KAAK,MAAML,CAAG,EAEvBK,aAAgB,cAClBP,EAAOE,CAAG,EAAYM,GAAKD,CAAI,EAEnC,CAEA,OAAO,iBAAiB,SAAU,IAAM,CACtC,QAAWE,KAAS,OAAO,OAAOT,CAAM,EACtCS,EAAM,OAAO,CAEjB,CAAC,EAED,KAAK,OAAO,EACd,EAEA,KAAKC,EAAchC,EAAe,CAC5BgC,IAAU,OACZ,KAAK,KAAOhC,EAEZ,KAAKgC,CAAK,EAAIhC,EAGhB,KAAK,OAAO,CACd,EAEA,QAAS,CACP,IAAMiC,EAAO,KAAK,KAElB,GAAI,CAACA,EACH,OAGF,IAAMC,EAAQD,EAAK,MAAM,MACnBE,EAAYF,EAAK,OAAO,MAAM,GAAG,EAAE,EAEzC,KAAK,QAAU,CACb,QAASE,EACLlC,GACEmC,GAAQ,OAAO,CAACC,EAAK,CAACb,CAAG,IAAMa,EAAMF,EAAU,QAAQX,CAAG,EAAG,CAAC,CAChE,EACA,SACJ,KAAMU,EAAM,KACZ,SAAUA,EAAM,QAClB,EACA,KAAK,MAAQI,IAAS,KAAK,OAAQL,EAAK,MAAM,KAAK,MAAM,CAAC,EAE1DM,EAAaN,EAAK,OAAO,KAAK,KAAK,EAAG,KAAK,KAAK,EAChDO,EAAW,KAAK,MAAM,SAAaP,EAAK,MAAM,KAAK,IAAI,CAAC,EAExD,IAAMQ,EAAWR,EAAK,SAAS,KAAK,MAAM,EAC1CS,EAAgBD,EAAU,KAAK,OAAQR,EAAK,WAAW,EACvDU,EAAWF,EAAU,KAAK,MAAM,EAChCG,EAAeH,EAAU,KAAK,MAAM,EACpCI,EAAeJ,EAAU,KAAK,OAAQR,EAAK,WAAW,EAEtDa,EAAe,KAAK,MAAOb,EAAK,QAAQ,CAC1C,CACF,EAEA,SAASM,EAAaQ,EAAmCC,EAAc,CACrE,IAAM/B,EAAS8B,EAAK,IAAKE,GAASC,GAAYF,EAAOC,EAAK,KAAK,CAAC,EAC1DE,EAAOJ,EAAK,OAAS,EACrBrC,EAAS0C,GACbC,GAAYL,EAAOD,EAAKK,CAAK,GAAG,OAAS,GAAIA,IAAUD,CAAI,EAEvDG,EAAO,CACXC,EACAlD,EACAmD,EACAC,EAAQ,KACJ,CACJ,KAAAF,EACA,KAAM,OACN,KAAMC,EACN,WAAY,EACZ,UAAW,CAAE,MAAOnD,CAAO,EAC3B,UAAW,CAAE,MAAOA,EAAQ,MAAAoD,CAAM,CACpC,GAEMC,EAAUtB,GAAQ,IAAI,CAAC,CAACZ,EAAK+B,CAAI,EAAGH,IACxCE,EACEC,EACAI,GAAOP,CAAK,GAAKQ,GACjBb,EAAK,IAAKE,GAASA,EAAK,QAAQzB,CAAG,CAAC,CACtC,CACF,EACMqC,EAAQd,EAAK,IAAKE,GACtBb,GAAQ,OAAO,CAACC,EAAK,CAACb,CAAG,IAAMa,EAAMY,EAAK,QAAQzB,CAAG,EAAG,CAAC,CAC3D,EAEAD,EAAK,UAAW,CACd,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,OAAQH,GAAO,EACf,QAAS,CACP,QAAS,OACT,UAAY0C,GAAyB,CACnC,IAAMV,EAAQU,EAAM,CAAC,GAAG,WAAa,EACrC,OAAOrD,GACLC,EAAM0C,CAAK,EACXU,EACG,MAAM,EACN,QAAQ,EACR,IAAKC,GAAS,CACbA,EAAK,OAAS,GACd,GAAGA,EAAK,UAAU,KAAK9D,GAAM,OAAO8D,EAAK,KAAK,CAAC,CAAC,EAClD,CAAC,CACL,CACF,CACF,EACA,MAAO/C,GAAaC,CAAM,EAC1B,MAAOC,GAAUnB,GAAM,EACvB,OAAQ,CAAC,GAAG2D,EAASJ,EAAK,QAASM,GAAKC,EAAO,GAAG,CAAC,CACrD,CAAC,EAEDtC,EAAK,QAAS,CACZ,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,OAAQH,GAAO,EACf,QAAS,CACP,QAAS,OACT,UAAY0C,GACVrD,GACEC,EAAMoD,EAAM,CAAC,GAAG,WAAa,CAAC,EAC9BA,EAAM,IAAKC,GAAS,CAClBA,EAAK,OAAS,GACd,GAAGA,EAAK,UAAU,KAAKA,EAAK,KAAK,EACnC,CAAC,CACH,CACJ,EACA,MAAO/C,GAAaC,CAAM,EAC1B,MAAOC,GAAU,EACjB,OAAQkB,GAAQ,IAAI,CAAC,CAACZ,EAAK+B,CAAI,EAAGH,IAChCE,EACEC,EACAI,GAAOP,CAAK,GAAKQ,GACjBb,EAAK,IAAKE,GAASA,EAAK,MAAMzB,CAAG,CAAC,CACpC,CACF,CACF,CAAC,CACH,CAEA,SAASgB,EAAWX,EAAemC,EAAgC,CACjE,IAAMC,EAAO,CAAC,YAAa,MAAO,SAAS,EACrCC,EAAOC,GAAOH,EAAK,SAAU,CAAC,GAAGC,CAAI,CAAC,EAE5CG,GACEvC,EACA,CACE,CAAC,SAAU,MAAM,EACjB,GAAGO,GAAQ,IAAI,CAAC,CAAC,CAAEmB,CAAI,IAAyB,CAACA,EAAM,OAAO,CAAC,EAC/D,CAAC,QAAS,OAAO,CACnB,EACAS,EAAK,SAAS,IAAKf,GACjBoB,GACEC,GAASrB,EAAK,MAAM,EACpB,GAAGgB,EAAK,IAAKzC,GAAQ+C,GAAK,OAAOtB,EAAKzB,CAAG,CAAC,CAAC,CAAC,EAC5C+C,GAAK,OAAON,EAAK,OAAO,CAAC5B,EAAKb,IAAQa,EAAMY,EAAKzB,CAAG,EAAG,CAAC,CAAC,CAAC,CAC5D,CACF,EACA,yBACAgD,GACEF,GAAS,OAAO,EAChB,GAAGJ,EAAK,IAAK7B,GAAQkC,GAAK,OAAOlC,CAAG,CAAC,CAAC,EACtCkC,GAAK,OAAOL,EAAK,OAAO,CAAC7B,EAAKY,IAASZ,EAAMY,EAAM,CAAC,CAAC,CAAC,CACxD,CACF,EAEA,IAAMwB,EAAS,OAAO,QAAQT,EAAK,UAAU,EACvCU,EAAQD,EAAO,OAAO,CAACpC,EAAK,CAAC,CAAEsC,CAAK,IAAMtC,EAAMsC,EAAO,CAAC,EAE9DpD,EAAK,aAAc,CACjB,OAAQH,GAAO,EACf,QAAS,CACP,QAAS,OACT,UAAY2C,GACV,GAAGzD,GAAWyD,EAAK,IAAI,CAAC,KAAKA,EAAK,KAAK,KAAK,KAAK,MAAOA,EAAK,OAASW,GAAS,GAAM,GAAG,CAAC,IAC7F,EACA,OAAQ,CACN,CACE,KAAM,MACN,OAAQ,MACR,OAAQ,CAAC,MAAO,KAAK,EACrB,UAAW,CAAE,YAAaE,GAAS,YAAa,GAAI,EACpD,MAAO,CACL,MAAOhB,GACP,UAAYG,GACV,GAAGA,EAAK,IAAI,IAAI,KAAK,MAAMA,EAAK,OAAO,CAAC,GAC5C,EACA,KAAMU,EAAO,IAAI,CAAC,CAAClB,EAAMoB,CAAK,EAAGvB,KAAW,CAC1C,KAAAG,EACA,MAAOoB,EACP,UAAW,CAAE,MAAOhB,GAAOP,CAAK,GAAKQ,EAAI,CAC3C,EAAE,CACJ,CACF,CACF,CAAC,CACH,CAEA,SAASiB,EACP9B,EACA+B,EACAC,EACA,CACA,OAAOC,IAAQF,EAAa/B,EAAK,IAAIgC,CAAI,CAAC,EAAE,IAAKxB,IAAU,CACzD,KAAAA,EACA,KAAM,MACN,MAAO,QACP,YAAa,GACb,UAAW,CACT,MAAO0B,IAAiBH,EAAavB,CAAI,EACzC,YAAaqB,GACb,YAAa,CACf,EACA,KAAM7B,EAAK,IAAKE,GAAS8B,EAAK9B,CAAI,EAAEM,CAAI,GAAK,CAAC,CAChD,EAAE,CACJ,CAEA,SAASb,EACPK,EACAC,EACA8B,EACA,CACA,IAAM3B,EAAOJ,EAAK,OAAS,EAE3BxB,EAAK,YAAa,CAChB,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,OAAQH,GAAO,EACf,QAAS,CACP,QAAS,OACT,YAAa,CAAE,KAAM,QAAS,EAC9B,UAAY0C,GAAyB,CACnC,IAAMV,EAAQU,EAAM,CAAC,GAAG,WAAa,EAC/Bb,EAAOF,EAAKK,CAAK,EACjB8B,EAAW,OAAO,OAAOjC,GAAM,UAAY,CAAC,CAAC,EAAE,OACnD,CAACZ,EAAKsC,IAAUtC,EAAMsC,EACtB,CACF,EAEA,OAAOlE,GACL,GAAG4C,GAAYL,EAAOC,GAAM,OAAS,GAAIG,IAAUD,CAAI,CAAC,KAAK+B,CAAQ,YACrEpB,EACG,OAAQC,GAAS,OAAOA,EAAK,KAAK,EAAI,CAAC,EACvC,IAAKA,GAAS,CACbA,EAAK,OAAS,GACd,GAAGA,EAAK,UAAU,KAAKA,EAAK,KAAK,EACnC,CAAC,CACL,CACF,CACF,EACA,MAAO/C,GAAa+B,EAAK,IAAKE,GAASC,GAAYF,EAAOC,EAAK,KAAK,CAAC,CAAC,EACtE,MAAO/B,GAAU,EACjB,OAAQ,CACN,GAAG2D,EAAoB9B,EAAM+B,EAAc7B,GAASA,EAAK,QAAQ,EACjE,CACE,KAAM,oBACN,KAAM,OACN,KAAMF,EAAK,IAAKE,GAASA,EAAK,OAAO,EACrC,WAAY,EACZ,UAAW,CAAE,MAAOW,EAAI,EACxB,UAAW,CAAE,MAAOA,GAAK,MAAO,CAAE,CACpC,CACF,CACF,CAAC,CACH,CAEA,SAASjB,EAAWI,EAAqBC,EAAc,CACrD,IAAMG,EAAOJ,EAAK,OAAS,EACrBoC,EAAMpC,EAAK,IACdE,GACCA,EAAK,KACL,OAAO,OAAOA,EAAK,QAAQ,EAAE,OAAO,CAACZ,EAAKsC,IAAUtC,EAAMsC,EAAO,CAAC,CACtE,EACM,CAACS,EAAQxB,GAAKyB,EAASzB,EAAG,EAAID,GAC9B2B,EAAQ,KAAK,KAAK,KAAK,IAAI,EAAG,GAAGH,EAAI,IAAI,KAAK,GAAG,CAAC,EAAI,GAAG,EAE/D5D,EAAK,OAAQ,CACX,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,OAAQ,CACN,GAAGH,GAAO,EACV,KAAM,CACJ,CAAE,KAAM,cAAe,UAAW,CAAE,MAAOgE,CAAM,CAAE,EACnD,CAAE,KAAM,iBAAkB,UAAW,CAAE,MAAOC,CAAO,CAAE,CACzD,EACA,aAAc,EAChB,EACA,QAAS,CACP,QAAS,OACT,UAAYvB,GAAyB,CACnC,IAAMV,EAAQU,EAAM,CAAC,GAAG,WAAa,EAC/Bb,EAAOF,EAAKK,CAAK,EACjBmC,EAAOtC,GAAM,MAAQ,EAE3B,OAAOxC,GACL4C,GAAYL,EAAOC,GAAM,OAAS,GAAIG,IAAUD,CAAI,EACpD,CACE,CAAC,GAAI,SAASoC,CAAI,EAAE,EACpB,CAAC,GAAI,aAAaA,GAAQJ,EAAI/B,CAAK,GAAK,EAAE,EAAE,EAC5C,CAAC,GAAI,eAAejD,GAAOgF,EAAI/B,CAAK,GAAK,CAAC,CAAC,EAAE,CAC/C,CACF,CACF,CACF,EACA,UAAW,CACT,KAAM,GACN,YAAa,EACb,UAAW,EAEX,OAAQ,CACN,CAAE,IAAK,EAAG,IAAKkC,EAAO,MAAOF,CAAM,EACnC,CAAE,IAAK,CAACE,EAAO,GAAI,EAAG,MAAOD,CAAO,CACtC,CACF,EACA,MAAOrE,GAAa+B,EAAK,IAAKE,GAASC,GAAYF,EAAOC,EAAK,KAAK,CAAC,CAAC,EAEtE,MAAO,CAAE,GAAG/B,GAAUf,EAAM,EAAG,IAAK,CAACmF,EAAO,IAAKA,CAAM,EACvD,OAAQ,CACN,CACE,KAAM,sBACN,KAAM,OACN,KAAMH,EACN,WAAY,EACZ,UAAW,CAAE,MAAO,CAAE,EACtB,MAAO,CACL,KAAM,GACN,MAAOvB,GACP,UAAW,CAAC,CAAE,MAAA5D,CAAM,IAAyBG,GAAOH,CAAK,CAC3D,CACF,EAEA,CAAE,KAAM,cAAe,KAAM,OAAQ,KAAM,CAAC,CAAE,EAC9C,CAAE,KAAM,iBAAkB,KAAM,OAAQ,KAAM,CAAC,CAAE,CACnD,CACF,CAAC,CACH,CAEA,SAAS4C,EAAeG,EAAqBC,EAAc,CACzD,IAAMG,EAAOJ,EAAK,OAAS,EACrByC,EAAQzC,EAAK,OAAQE,GAASA,EAAK,KAAK,EACxCwC,EAAaxC,GACjBnD,GAAM,OAAO,CAACuC,EAAK,CAACb,CAAG,IAAMa,GAAOY,EAAK,QAAQzB,CAAG,GAAK,GAAI,CAAC,EAEhED,EAAK,WAAY,CACf,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,EAAG,OAAQ,EAAG,EAChD,OAAQH,GAAO,EACf,QAAS,CACP,QAAS,OACT,YAAa,CAAE,KAAM,QAAS,EAC9B,UAAY0C,GAAyB,CACnC,IAAMb,EAAOuC,EAAM1B,EAAM,CAAC,GAAG,WAAa,CAAC,EACrC4B,EAAQzC,GAAM,OAAO,OAAS,EAEpC,OAAOxC,GACL,GAAG4C,GAAYL,EAAOC,GAAM,OAAS,GAAIA,IAASF,EAAKI,CAAI,CAAC,CAAC,KAAKuC,CAAK,IAAIA,IAAU,EAAI,OAAS,OAAO,GACzG5B,EAAM,IAAKC,GAAS,CAClBA,EAAK,OAAS,GACd,GAAGA,EAAK,UAAU,KAAK,OAAOA,EAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,OACtD,CAAC,CACH,CACF,CACF,EACA,MAAO,CACL,GAAG7C,GAAWlB,GAAkB,GAAGA,CAAK,GAAG,EAC3C,YAAa,MACf,EACA,MAAO,CACL,GAAGgB,GAAawE,EAAM,IAAKvC,GAASC,GAAYF,EAAOC,EAAK,KAAK,CAAC,CAAC,EACnE,QAAS,EACX,EACA,OAAQnD,GAAM,IAAI,CAAC,CAAC0B,EAAK+B,CAAI,EAAGH,KAAW,CACzC,KAAAG,EACA,KAAM,MACN,MAAO,QACP,YAAa,GACb,UAAW,CACT,MAAOI,GAAOP,CAAK,GAAKQ,GACxB,YAAagB,GACb,YAAa,CACf,EACA,MACExB,IAAUtD,GAAM,OAAS,EACrB,CACE,KAAM,GACN,SAAU,QACV,MAAO8D,GACP,UAAW,CAAC,CAAE,UAAA+B,CAAU,IAA6B,CACnD,IAAM1C,EAAOuC,EAAMG,CAAS,EAC5B,OAAO1C,EAAO,GAAGwC,EAAUxC,CAAI,EAAE,QAAQ,CAAC,CAAC,QAAU,EACvD,CACF,EACA,OACN,KAAMuC,EAAM,IAAKvC,GAASA,EAAK,QAAQzB,CAAG,GAAK,CAAC,CAClD,EAAE,CACJ,CAAC,CACH,CAEA,SAASqB,EACPE,EACAC,EACA8B,EACA,CACA,IAAM3B,EAAOJ,EAAK,OAAS,EACrB6C,EAAS7C,EAAK,IAAKE,GACvB,OAAO,OAAOA,EAAK,QAAQ,EAAE,OAAO,CAACZ,EAAKsC,IAAUtC,EAAMsC,EAAO,CAAC,CACpE,EAEMkB,EAAOhB,EACX9B,EACA+B,EACC7B,GAASA,EAAK,QACjB,EAEA1B,EAAK,WAAY,CACf,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,OAAQ,CAAE,GAAGH,GAAO,EAAG,KAAMyE,EAAK,IAAKC,GAAQA,EAAI,IAAI,CAAE,EACzD,QAAS,CACP,QAAS,OACT,YAAa,CAAE,KAAM,QAAS,EAC9B,UAAYhC,GAAyB,CACnC,IAAMV,EAAQU,EAAM,CAAC,GAAG,WAAa,EAC/Bb,EAAOF,EAAKK,CAAK,EAEvB,OAAO3C,GACL,GAAG4C,GAAYL,EAAOC,GAAM,OAAS,GAAIG,IAAUD,CAAI,CAAC,KAAKyC,EAAOxC,CAAK,CAAC,cAAcnD,GAAMgD,GAAM,gBAAkB,CAAC,CAAC,GACxHa,EACG,OACEC,GAASA,EAAK,aAAe,SAAW,OAAOA,EAAK,KAAK,EAAI,CAChE,EACC,IAAKA,GAAS,CACbA,EAAK,OAAS,GACd,GAAGA,EAAK,UAAU,KAAKA,EAAK,KAAK,EACnC,CAAC,CACL,CACF,CACF,EACA,MAAO/C,GAAa+B,EAAK,IAAKE,GAASC,GAAYF,EAAOC,EAAK,KAAK,CAAC,CAAC,EACtE,MAAO/B,GAAU,EACjB,OAAQ,CACN,GAAG2E,EAEH,CACE,KAAM,QACN,KAAM,UACN,WAAY,EACZ,KAAMD,EACN,MAAO,CACL,KAAM,GACN,SAAU,MACV,MAAOhC,GACP,UAAW,CAAC,CAAE,UAAA+B,CAAU,IACtBC,EAAOD,CAAS,EACZ5F,IAAOgD,EAAK4C,CAAS,GAAG,gBAAkB,CAAC,EAC3C,EACR,CACF,CACF,CACF,CAAC,CACH,CAEA,SAAS7C,EACPiD,EACAC,EACA,CACA,IAAMC,EAAYD,EAAS,UAC3B5B,GACE2B,EAAK,UACL,CACE,CAAC,WAAY,MAAM,EACnB,CAAC,eAAgB,OAAO,CAC1B,EACAE,EAAU,IAAKhD,GACboB,GAAIC,GAASrB,EAAK,QAAQ,EAAGsB,GAAK,OAAOtB,EAAK,IAAI,CAAC,CAAC,CACtD,EACA,qBACAuB,GACEF,GAAS,OAAO,EAChB,GAAGH,GAAO8B,EAAW,CAAC,MAAM,CAAC,EAAE,IAAK5D,GAAQkC,GAAK,OAAOlC,CAAG,CAAC,CAAC,CAC/D,CACF,EAEA,IAAM6D,EAAW,CACf,aACA,OACA,WACA,gBACF,EACMC,EAAOH,EAAS,YACtB5B,GACE2B,EAAK,YACL,CACE,CAAC,aAAc,MAAM,EACrB,CAAC,cAAe,OAAO,EACvB,CAAC,OAAQ,OAAO,EAChB,CAAC,WAAY,OAAO,EACpB,CAAC,yBAA0B,OAAO,CACpC,EACAI,EAAK,IAAKlD,GACRoB,GACEC,GAASrB,EAAK,UAAU,EACxB,GAAGiD,EAAS,IAAK1E,GAAQ+C,GAAK,OAAOtB,EAAKzB,CAAG,CAAC,CAAC,CAAC,CAClD,CACF,EACA,gBACAgD,GACEF,GAAS,OAAO,EAChB,GAAGH,GAAOgC,EAAM,CAAC,GAAGD,CAAQ,CAAC,EAAE,IAAK7D,GAAQkC,GAAK,OAAOlC,CAAG,CAAC,CAAC,CAC/D,CACF,EAEA,IAAM+D,EAAcJ,EAAS,YAC7B5B,GACE2B,EAAK,YACL,CACE,CAAC,aAAc,MAAM,EACrB,CAAC,WAAY,OAAO,EACpB,CAAC,iBAAkB,OAAO,EAC1B,CAAC,OAAQ,OAAO,CAClB,EACAK,EAAY,IAAKnD,GACfoB,GACEC,GAASrB,EAAK,UAAU,EACxBsB,GAAK,OAAOtB,EAAK,QAAQ,CAAC,EAC1BsB,GAAK,OAAOtB,EAAK,cAAc,CAAC,EAChCsB,GAAK,OAAOtB,EAAK,SAAWA,EAAK,cAAc,CAAC,CAClD,CACF,EACA,qBACAuB,GACEF,GAAS,OAAO,EAChB,GAAGH,GAAOiC,EAAa,CAAC,WAAY,gBAAgB,CAAC,EAAE,IAAK/D,GAC1DkC,GAAK,OAAOlC,CAAG,CAAC,CAClB,EACAkC,GACE,OACE6B,EAAY,OACV,CAAC/D,EAAKY,IAASZ,EAAMY,EAAK,SAAWA,EAAK,eAC1C,CACF,CACF,CACF,CACF,CACF,CACF,CACF,ECpsBA,IAAMoD,IAAkBC,GAAE,OAAO,CAC/B,GAAIA,GAAE,OAAO,EACb,UAAWA,GAAE,OAAO,EACpB,MAAOA,GAAE,OAAO,EAChB,WAAYA,GAAE,OAAO,EACrB,SAAUA,GAAE,OAAO,EACnB,YAAaA,GAAE,OAAO,EAAE,SAAS,EACjC,SAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC5B,cAAeA,GAAE,OAAO,CAC1B,CAAC,EAEKC,IAAeD,GAAE,OAAO,CAC5B,UAAWA,GAAE,OAAO,EACpB,SAAUA,GAAE,OAAO,CACrB,CAAC,EAEYE,GAAgBF,GAAE,OAAO,CACpC,MAAOA,GAAE,OAAO,EAChB,QAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC3B,WAAYA,GAAE,MAAMD,GAAe,EACnC,QAASC,GAAE,MAAMC,GAAY,EAC7B,YAAaD,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC/B,UAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC7B,eAAgBA,GAAE,OAAOA,GAAE,OAAO,EAAGA,GAAE,OAAO,CAAC,CACjD,CAAC,EAYKG,IAAS,MAGR,SAASC,GAAUC,EAAaC,EAAsB,CAC3D,IAAMC,EAAQF,EAAI,MAAM,GAAG,EACrBG,EAAQ,KAAK,IACjB,OAAOD,EAAM,CAAC,CAAC,EACf,OAAOA,EAAM,CAAC,CAAC,EAAI,EACnB,OAAOA,EAAM,CAAC,CAAC,CACjB,EACA,OAAO,IAAI,KAAKC,EAAQF,EAAOH,GAAM,EAAE,YAAY,EAAE,MAAM,EAAG,EAAE,CAClE,CAGO,SAASM,GAAYC,EAAeC,EAAuB,CAChE,OAAOP,GAAUM,EAAO,CAACC,EAAQ,CAAC,CACpC,CAGO,SAASC,GAAUP,EAAqB,CAC7C,IAAME,EAAQF,EAAI,MAAM,GAAG,EACrBQ,EAAO,IAAI,KACf,KAAK,IAAI,OAAON,EAAM,CAAC,CAAC,EAAG,OAAOA,EAAM,CAAC,CAAC,EAAI,EAAG,OAAOA,EAAM,CAAC,CAAC,CAAC,CACnE,EACA,OAAOH,GAAUC,EAAK,GAAGQ,EAAK,UAAU,EAAI,GAAK,EAAE,CACrD,CAGO,SAASC,GAAcJ,EAAeC,EAAyB,CACpE,IAAMI,EAAOH,GAAUF,CAAK,EACtBM,EAAgB,CAAC,EACnBC,EAASL,GAAUH,GAAYC,EAAOC,CAAK,CAAC,EAEhD,KAAOM,GAAUF,GACfC,EAAI,KAAKC,CAAM,EACfA,EAASb,GAAUa,EAAQ,CAAC,EAG9B,OAAOD,CACT,CAOO,SAASE,GACdC,EACAC,EACAC,EACS,CACT,OAAOF,EAAS,OAASC,EAAI,QAAUD,EAAS,IAAIE,CAAK,CAC3D,CAEO,SAASC,GACdC,EACAC,EACAb,EAAQa,EAAU,MACL,CACb,IAAMC,EAAOhB,GAAYc,EAAQ,MAAOZ,CAAK,EAE7C,OAAOY,EAAQ,WAAW,OACvBG,GACCA,EAAK,WAAaD,GAClBC,EAAK,WAAaH,EAAQ,OAC1BL,GAAOM,EAAU,YAAaD,EAAQ,YAAaG,EAAK,UAAU,GAClER,GAAOM,EAAU,UAAWD,EAAQ,UAAWG,EAAK,QAAQ,CAChE,CACF,CAEO,SAASC,GACdJ,EACAC,EACAb,EAAQa,EAAU,MACR,CACV,IAAMC,EAAOhB,GAAYc,EAAQ,MAAOZ,CAAK,EAE7C,OAAOY,EAAQ,QAAQ,OACpBK,GACCA,EAAO,WAAaH,GACpBG,EAAO,WAAaL,EAAQ,OAC5BL,GAAOM,EAAU,UAAWD,EAAQ,UAAWK,EAAO,QAAQ,CAClE,CACF,CA0BO,SAASC,GACdC,EACAC,EACAC,EACa,CACb,IAAMC,EAASH,EAAQ,OAAS,EAEhC,OAAOC,EACJ,IAAKG,GAAS,CACb,IAAMC,EAASL,EAAQ,IAAKM,GAAUJ,EAASE,EAAME,CAAK,CAAC,EAC3D,MAAO,CAAE,KAAAF,EAAM,OAAAC,EAAQ,MAAOA,EAAOF,CAAM,GAAK,CAAE,CACpD,CAAC,EACA,OAAQI,GAAQA,EAAI,OAAO,KAAMC,GAAUA,EAAQ,CAAC,CAAC,EACrD,KAAK,CAACC,EAAGC,IAAMA,EAAE,MAAQD,EAAE,OAASA,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,CACrE,CAeO,SAASC,IACdC,EACAC,EACc,CACd,IAAMC,EAAU,IAAI,IACdC,EAAY,IAAI,IAEtB,QAAWC,KAAQJ,EAAO,CACxB,QAAWK,KAAQ,IAAI,IAAID,EAAK,QAAQ,EACtCF,EAAQ,IAAIG,GAAOH,EAAQ,IAAIG,CAAI,GAAK,GAAK,CAAC,EAGhD,QAAWA,KAAQD,EAAK,SACtBD,EAAU,IAAIE,GAAOF,EAAU,IAAIE,CAAI,GAAK,GAAK,CAAC,CAEtD,CAEA,MAAO,CAAC,GAAGH,EAAQ,QAAQ,CAAC,EACzB,IAAI,CAAC,CAACG,EAAMT,CAAK,KAAO,CACvB,KAAAS,EACA,MAAOJ,EAAOI,CAAI,GAAKA,EACvB,MAAOT,EACP,UAAWO,EAAU,IAAIE,CAAI,GAAK,EAClC,MAAOL,EAAM,OAAUJ,EAAQI,EAAM,OAAU,IAAM,CACvD,EAAE,EACD,KAAK,CAACH,EAAGC,IAAMA,EAAE,MAAQD,EAAE,OAASA,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC,CACvE,CAGO,SAASQ,GAAYN,EAA8B,CACxD,OAAOA,EACJ,OAAQI,GAASA,EAAK,cAAgB,IAAI,EAC1C,IAAKA,GACJ,KAAK,OACF,KAAK,MAAM,GAAGA,EAAK,SAAS,YAAY,EACvC,KAAK,MAAM,GAAGA,EAAK,WAAW,YAAY,GAC1CG,GACJ,CACF,EACC,KAAK,CAACV,EAAGC,IAAMD,EAAIC,CAAC,CACzB,CAEO,SAASU,IAAOC,EAAiC,CACtD,OAAKA,EAAO,OAILA,EAAO,KAAK,MAAMA,EAAO,OAAS,CAAC,CAAC,GAAK,KAHvC,IAIX,CC5LA,IAAMC,IAAsB,GAGtBC,GAAgB,GA6CfC,IAAQ,IAA8B,CAC3C,IAAMC,EAAiD,CACrD,OAAQ,KACR,QAAS,KACT,SAAU,IACZ,EAEA,MAAO,CACL,KAAMC,GAAc,MAAM,CACxB,MAAO,aACP,QAAS,CAAC,EACV,WAAY,CAAC,EACb,QAAS,CAAC,EACV,YAAa,CAAC,EACd,UAAW,CAAC,EACZ,eAAgB,CAAC,CACnB,CAAC,EACD,MAAO,GACP,YAAa,CAAC,EACd,UAAW,CAAC,EACZ,UAAW,EACX,UAAW,GACX,YAAa,EACb,gBAAiB,EACjB,gBAAiB,SACjB,cAAe,GACf,UAAW,SACX,UAAW,GACX,WAAY,GACZ,eAAgB,GAChB,eAAgB,GAEhB,MAAO,CACL,GAAI,EAAE,KAAK,eAAe,aACxB,OAGF,IAAMC,EAAM,KAAK,IAAI,QAAQ,UAE7B,GAAI,CAACA,EACH,OAGF,IAAMC,EAASF,GAAc,UAAU,KAAK,MAAMC,CAAG,CAAC,EAEtD,GAAI,CAACC,EAAO,QACV,OAGF,KAAK,KAAOA,EAAO,KACnB,KAAK,YAAc,CAAC,GAAG,KAAK,KAAK,WAAW,EAC5C,KAAK,UAAY,CAAC,GAAG,KAAK,KAAK,SAAS,EAExC,KAAK,MAAQ,KAAK,KAAK,QAAQ,SAASL,EAAa,EACjDA,GACC,KAAK,KAAK,QAAQ,CAAC,GAAKA,GAE7B,IAAMM,EAAW,KAAK,KAAK,WACxB,IAAKC,GAASA,EAAK,SAAS,EAC5B,KAAK,EAAE,CAAC,EAEX,KAAK,eAAiBD,EAClB,wCAAwCE,GAASF,CAAQ,CAAC,+FAE1D,GAEJ,QAAWG,KAAO,OAAO,KAAKP,CAAM,EAAG,CACrC,IAAMQ,EAAO,KAAK,MAAMD,CAAG,EAEvBC,aAAgB,cAClBR,EAAOO,CAAG,EAAYE,GAAKD,CAAI,EAEnC,CAEA,OAAO,iBAAiB,SAAU,IAAM,CACtC,QAAWE,KAAS,OAAO,OAAOV,CAAM,EACtCU,GAAO,OAAO,CAElB,CAAC,EAED,KAAK,OAAO,CACd,EAEA,WAAuB,CACrB,MAAO,CACL,MAAO,KAAK,MACZ,YAAa,IAAI,IAAI,KAAK,WAAW,EACrC,UAAW,IAAI,IAAI,KAAK,SAAS,CACnC,CACF,EAEA,UAAUC,EAAe,CACvB,KAAK,MAAQA,EACb,KAAK,OAAO,CACd,EAEA,iBAAiBC,EAAc,CAC7B,KAAK,YAAcC,GAAO,KAAK,YAAa,KAAK,KAAK,YAAaD,CAAI,EACvE,KAAK,OAAO,CACd,EAEA,eAAeA,EAAc,CAC3B,KAAK,UAAYC,GAAO,KAAK,UAAW,KAAK,KAAK,UAAWD,CAAI,EACjE,KAAK,OAAO,CACd,EAEA,kBAAmB,CACjB,KAAK,YAAc,CAAC,GAAG,KAAK,KAAK,WAAW,EAC5C,KAAK,OAAO,CACd,EAEA,gBAAiB,CACf,KAAK,UAAY,CAAC,GAAG,KAAK,KAAK,SAAS,EACxC,KAAK,OAAO,CACd,EAEA,aAAaA,EAAuB,CAClC,OAAO,KAAK,YAAY,SAASA,CAAI,CACvC,EAEA,WAAWA,EAAuB,CAChC,OAAO,KAAK,UAAU,SAASA,CAAI,CACrC,EAEA,UAAUA,EAAsB,CAC9B,IAAME,EAAQ,KAAK,KAAK,YAAY,QAAQF,CAAI,EAChD,OAAOE,GAAS,EAAKC,GAAOD,EAAQC,GAAO,MAAM,GAAKC,GAASA,EACjE,EAEA,QAAS,CACP,IAAMC,EAAO,KAAK,KACZC,EAAY,KAAK,UAAU,EAC3BC,EAAQC,GAAmBH,EAAMC,CAAS,EAC1CG,EAAUC,GAAgBL,EAAMC,CAAS,EAE/C,KAAK,YAAYC,EAAOE,CAAO,EAC/B,KAAK,gBAAgBH,CAAS,EAC9B,KAAK,kBAAkBA,CAAS,EAChC,KAAK,eAAeC,CAAK,EACzB,KAAK,aAAaA,CAAK,EACvB,KAAK,kBAAkBA,CAAK,EAC5B,KAAK,kBAAkBE,CAAO,CAChC,EAEA,YAAYF,EAAoBE,EAAmB,CACjD,IAAMJ,EAAO,KAAK,KACZN,EAAQ,KAAK,MAEnB,KAAK,UAAYQ,EAAM,OACvB,KAAK,YAAcE,EAAQ,OAC3B,KAAK,gBAAkB,IAAI,IAAIA,EAAQ,IAAKE,GAAQA,EAAI,QAAQ,CAAC,EAAE,KAGnE,IAAMC,EACJJ,GAAmBH,EAAM,KAAK,UAAU,EAAGN,EAAQ,CAAC,EAAE,OACtDQ,EAAM,OACFM,EAASN,EAAM,OAASK,EAC9B,KAAK,UACH,GAAGC,GAAU,EAAI,IAAM,EAAE,GAAGA,CAAM,WAAWd,CAAK,kBAC9Ca,CAAQ,IAEd,IAAME,EAASP,EAAM,IAAKd,GAASA,EAAK,SAAS,MAAM,EACjDsB,EAAUD,EAAO,OACnBA,EAAO,OAAO,CAACE,EAAOC,IAAUD,EAAQC,EAAO,CAAC,EAAIH,EAAO,OAC3D,EAEJ,KAAK,gBAAkBA,EAAO,OAASC,EAAQ,QAAQ,CAAC,EAAI,SAC5D,KAAK,cAAgBD,EAAO,OACxB,SAAS,KAAK,IAAI,GAAGA,CAAM,CAAC,SAAI,KAAK,IAAI,GAAGA,CAAM,CAAC,GACnD,6BAEJ,IAAMI,EAAOC,GAAYZ,CAAK,EACxBa,EAASC,IAAOH,CAAI,EAE1B,KAAK,UAAYE,IAAW,KAAO,SAAM,GAAGA,CAAM,IAClD,KAAK,UAAYF,EAAK,OAClB,qBAAkBA,EAAK,CAAC,CAAC,SAAIA,EAAK,GAAG,EAAE,CAAC,IACxC,6BAEJ,KAAK,WAAa,GAAGxB,GACnB4B,GAAcjB,EAAK,MAAON,CAAK,EAAE,CAAC,GAAKM,EAAK,KAC9C,CAAC,WAAMX,GAASW,EAAK,KAAK,CAAC,EAC7B,EAEA,kBACEkB,EACAC,EACAC,EACAC,EACA,CACA,IAAM9B,EAAO,KAAK,MAAM2B,CAAG,EAE3B,GAAI,EAAE3B,aAAgB,aACpB,OAGF,IAAM+B,EAAU,KAAK,KAAK,QACpBC,EAAWD,EAAQ,QAAQ,KAAK,KAAK,EAE3C/B,EAAK,YAAc,GACnB,IAAMiC,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACHC,GACEN,EACAG,EAAQ,IAAK5B,GAAU,GAAGA,CAAK,GAAG,EAClC6B,CACF,CACF,EAEA,IAAMG,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEZN,EAAK,QACRM,EAAK,OACHC,GAASL,EAAQ,OAAS,EAAG,iCAAiC,CAChE,EAGF,QAAWhB,KAAOc,EAAM,CACtB,IAAMQ,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,mBACfA,EAAG,OAAOC,GAASvB,EAAI,KAAMe,EAASA,EAAOf,EAAI,IAAI,EAAI,MAAS,CAAC,EAEnEA,EAAI,OAAO,QAAQ,CAACM,EAAOf,IAAU,CACnC,IAAMiC,EAAU,CACdlB,EAAQ,GAAK,gBACbf,IAAU0B,EAAW,aAAe,EACtC,EACG,OAAO,OAAO,EACd,KAAK,GAAG,EACXK,EAAG,OAAOG,GAAK,OAAOnB,CAAK,EAAGkB,CAAO,CAAC,CACxC,CAAC,EAEDJ,EAAK,OAAOE,CAAE,CAChB,CAEA,IAAMI,EAAO,SAAS,cAAc,OAAO,EACrCrB,EAAQ,SAAS,cAAc,IAAI,EACzCA,EAAM,UAAY,yBAClBA,EAAM,OAAOkB,GAAS,OAAO,CAAC,EAE9BP,EAAQ,QAAQ,CAACW,EAAQpC,IAAU,CACjC,IAAMqC,EAAMd,EAAK,OACf,CAACe,EAAS7B,IAAQ6B,GAAW7B,EAAI,OAAOT,CAAK,GAAK,GAClD,CACF,EACAc,EAAM,OAAOoB,GAAK,OAAOG,CAAG,EAAGrC,IAAU0B,EAAW,aAAe,EAAE,CAAC,CACxE,CAAC,EAEDS,EAAK,OAAOrB,CAAK,EACjBpB,EAAK,OAAOiC,EAAME,EAAMM,CAAI,CAC9B,EAEA,gBAAgB/B,EAAsB,CACpC,IAAMD,EAAO,KAAK,KAElB,KAAK,kBACH,YACA,aACAoC,GACEpC,EAAK,QACLA,EAAK,YACL,CAACL,EAAMD,IACLS,GAAmBH,EAAMC,EAAWP,CAAK,EAAE,OACxCN,GAASA,EAAK,aAAeO,CAChC,EAAE,MACN,EACCA,GAAS,KAAK,UAAUA,CAAI,CAC/B,CACF,EAEA,kBAAkBM,EAAsB,CACtC,IAAMD,EAAO,KAAK,KAElB,KAAK,kBACH,cACA,WACAoC,GACEpC,EAAK,QACLA,EAAK,UACL,CAACL,EAAMD,IACLW,GAAgBL,EAAMC,EAAWP,CAAK,EAAE,OACrC2C,GAAWA,EAAO,WAAa1C,CAClC,EAAE,MACN,EACA,IACF,CACF,EAEA,eAAeO,EAAoB,CACjC,IAAMkB,EAAOkB,IAAYpC,EAAO,KAAK,KAAK,cAAc,EAExD,KAAK,eAAiBA,EAAM,OACxB,6CAA6CA,EAAM,MAAM,aACvDA,EAAM,SAAW,EAAI,GAAK,GAC5B,uBAAuBkB,EAAK,MAAM,2BAClC,mCAEJ,IAAM7B,EAAO,KAAK,MAAM,aAExB,GAAIA,aAAgB,YAAa,CAC/BA,EAAK,YAAc,GACnB,IAAMiC,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACHC,GAAU,UAAW,CAAC,aAAc,QAAS,WAAW,EAAG,EAAE,CAC/D,EAEA,IAAMC,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEZN,EAAK,QACRM,EAAK,OAAOC,GAAS,EAAG,iCAAiC,CAAC,EAG5D,QAAWrB,KAAOc,EAAM,CACtB,IAAMQ,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,mBACfA,EAAG,OAAOC,GAASvB,EAAI,KAAK,CAAC,EAC7BsB,EAAG,OAAOG,GAAK,OAAOzB,EAAI,KAAK,CAAC,CAAC,EACjCsB,EAAG,OAAOG,GAAK,GAAG,KAAK,MAAMzB,EAAI,KAAK,CAAC,GAAG,CAAC,EAC3CsB,EAAG,OAAOG,GAAK,OAAOzB,EAAI,SAAS,CAAC,CAAC,EACrCoB,EAAK,OAAOE,CAAE,CAChB,CAEArC,EAAK,OAAOiC,EAAME,CAAI,CACxB,CAEA,KAAK,mBAAmBN,EAAMlB,EAAM,MAAM,CAC5C,EAEA,aAAaA,EAAoB,CAC/B,IAAMX,EAAO,KAAK,MAAM,YAExB,GAAI,EAAEA,aAAgB,aACpB,OAGFA,EAAK,YAAc,GACnB,IAAMiC,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACHC,GACE,YACA,CACE,WACA,aACA,oBACA,WACA,OACA,WACA,eACF,EACA,EACF,CACF,EAEA,IAAMC,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEjB,IAAMa,EAAU,CAAC,GAAGrC,CAAK,EAAE,KAAK,CAAC,EAAGsC,IAClCA,EAAE,UAAU,cAAc,EAAE,SAAS,CACvC,EAEKD,EAAQ,QACXb,EAAK,OAAOC,GAAS,EAAG,iCAAiC,CAAC,EAG5D,QAAWvC,KAAQmD,EAAS,CAC1B,IAAMX,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,mBAEfA,EAAG,OAAOC,GAASY,GAAUrD,EAAK,SAAS,CAAC,CAAC,EAE7C,IAAMsD,EAAW,SAAS,cAAc,IAAI,EAC5CA,EAAS,UACP,uDACFA,EAAS,YAActD,EAAK,MAC5BsD,EAAS,MAAQtD,EAAK,MACtBwC,EAAG,OAAOc,CAAQ,EAElBd,EAAG,OAAOC,GAASzC,EAAK,WAAY,KAAK,UAAUA,EAAK,UAAU,CAAC,CAAC,EACpEwC,EAAG,OAAOC,GAASzC,EAAK,QAAQ,CAAC,EACjCwC,EAAG,OAAOG,GAAK3C,EAAK,YAAcqD,GAAUrD,EAAK,WAAW,EAAI,QAAG,CAAC,EACpEwC,EAAG,OAAOG,GAAK,OAAOjB,GAAY,CAAC1B,CAAI,CAAC,EAAE,CAAC,GAAK,QAAG,CAAC,CAAC,EACrDwC,EAAG,OAAOG,GAAK,OAAO3C,EAAK,SAAS,MAAM,CAAC,CAAC,EAC5CwC,EAAG,OAAOG,GAAKY,GAAMvD,EAAK,aAAa,CAAC,CAAC,EAEzCsC,EAAK,OAAOE,CAAE,CAChB,CAEArC,EAAK,OAAOiC,EAAME,CAAI,CACxB,EAEA,kBAAkBxB,EAAoB,CACpC,IAAMT,EAAQV,EAAO,OAErB,GAAI,CAACU,EACH,OAGF,IAAMC,EAAQuB,GAAc,KAAK,KAAK,MAAO,KAAK,KAAK,EACjD2B,EAAO,KAAK,KAAK,YAAY,OAAQjD,GACzC,KAAK,aAAaA,CAAI,CACxB,EAEMkD,EAASD,EAAK,IAAKjD,IAAU,CACjC,KAAAA,EACA,KAAM,MACN,MAAO,QACP,YAAa,GACb,UAAW,CACT,MAAO,KAAK,UAAUA,CAAI,EAG1B,YAAamD,GACb,YAAa,CACf,EACA,KAAMpD,EAAM,IACTqD,GACC7C,EAAM,OACHd,GACCA,EAAK,aAAeO,GACpBqD,GAAU5D,EAAK,SAAS,IAAM2D,CAClC,EAAE,MACN,CACF,EAAE,EAIIE,EAASL,EAAK,OAAS,EAE7BnD,EAAM,UACJ,CACE,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQwD,EAAS,GAAK,EAAG,EAC/D,QAAS,CACP,QAAS,OACT,YAAa,CAAE,KAAM,QAAS,CAChC,EACA,OAAQA,EAAS,CAAE,OAAQ,EAAG,KAAM,WAAY,EAAI,OACpD,MAAO,CACL,KAAM,WACN,KAAMvD,EAAM,IAAI+C,EAAS,EACzB,UAAW,CAAE,MAAOS,EAAM,EAC1B,SAAU,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,EACvC,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,MAAO,CACL,KAAM,QACN,YAAa,EACb,UAAW,CAAE,MAAOD,EAAM,EAC1B,UAAW,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,CAC1C,EACA,OAAAN,CACF,EACA,CAAE,aAAc,CAAC,SAAU,QAAQ,CAAE,CACvC,CACF,EAEA,kBAAkBzC,EAAmB,CACnC,IAAMX,EAAQV,EAAO,QAErB,GAAI,CAACU,EACH,OAGF,IAAM2B,EAAO,KAAK,KAAK,UACpB,IAAKzB,IAAU,CACd,KAAAA,EACA,MAAOS,EAAQ,OAAQiC,GAAWA,EAAO,WAAa1C,CAAI,EAAE,MAC9D,EAAE,EACD,OAAQW,GAAQA,EAAI,MAAQ,CAAC,EAC7B,KAAK,CAAC8C,EAAGZ,IAAMY,EAAE,MAAQZ,EAAE,KAAK,EAEnC/C,EAAM,UACJ,CACE,KAAM,CAAE,KAAM,EAAG,MAAO,GAAI,IAAK,EAAG,OAAQ,EAAG,aAAc,EAAK,EAClE,QAAS,CAAE,QAAS,MAAO,EAC3B,MAAO,CAAE,KAAM,QAAS,KAAM,EAAM,EACpC,MAAO,CACL,KAAM,WACN,KAAM2B,EAAK,IAAKd,GAAQA,EAAI,IAAI,EAChC,UAAW,CAAE,MAAO+C,EAAI,EACxB,SAAU,CAAE,KAAM,EAAM,EACxB,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,OAAQ,CACN,CACE,KAAM,MACN,YAAa,GACb,UAAW,CAAE,MAAOC,GAAQ,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAAE,EACvD,MAAO,CAAE,KAAM,GAAM,SAAU,QAAS,MAAOD,EAAI,EACnD,KAAMjC,EAAK,IAAKd,GAAQA,EAAI,KAAK,CACnC,CACF,CACF,EACA,CAAE,aAAc,CAAC,QAAQ,CAAE,CAC7B,CACF,EAEA,mBAAmBc,EAAoBmC,EAAmB,CACxD,IAAM9D,EAAQV,EAAO,SAErB,GAAI,CAACU,EACH,OAGF,IAAM+D,EAAMpC,EAAK,MAAM,EAAGxC,GAAmB,EAAE,QAAQ,EAEvDa,EAAM,UACJ,CACE,KAAM,CAAE,KAAM,EAAG,MAAO,GAAI,IAAK,EAAG,OAAQ,EAAG,aAAc,EAAK,EAClE,QAAS,CACP,QAAS,OACT,UAAYgE,GAAkC,CAC5C,IAAMnD,EAAMkD,EAAIC,EAAO,SAAS,EAChC,OAAOnD,EACH,GAAGA,EAAI,KAAK,QAAQA,EAAI,KAAK,OAAOiD,CAAS,8BAC9BjD,EAAI,SAAS,OAC5B,EACN,CACF,EACA,MAAO,CAAE,KAAM,QAAS,KAAM,EAAM,EACpC,MAAO,CACL,KAAM,WACN,KAAMkD,EAAI,IAAKlD,GAAQA,EAAI,KAAK,EAChC,UAAW,CAAE,MAAO+C,EAAI,EACxB,SAAU,CAAE,KAAM,EAAM,EACxB,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,OAAQ,CACN,CACE,KAAM,MACN,YAAa,GACb,UAAW,CAAE,MAAOC,GAAQ,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAAE,EACvD,MAAO,CACL,KAAM,GACN,SAAU,QACV,MAAOD,GACP,UAAYI,GACV,GAAG,KAAK,MAAMD,EAAIC,EAAO,SAAS,GAAG,OAAS,CAAC,CAAC,GACpD,EACA,KAAMD,EAAI,IAAKlD,GAAQA,EAAI,KAAK,CAClC,CACF,CACF,EACA,CAAE,aAAc,CAAC,QAAQ,CAAE,CAC7B,CACF,CACF,CACF,ECxnBA,IAAMoD,IAAeC,GAAE,OAAO,CAC5B,MAAOA,GAAE,OAAO,EAChB,QAASA,GAAE,OAAO,EAClB,WAAYA,GAAE,QAAQ,CACxB,CAAC,EAEKC,IAAgBD,GAAE,OAAO,CAC7B,GAAIA,GAAE,OAAO,EACb,IAAKA,GAAE,OAAO,EACd,QAASA,GAAE,OAAO,EAClB,SAAUA,GAAE,OAAO,EACnB,SAAUA,GAAE,OAAO,EACnB,WAAYA,GAAE,OAAO,EACrB,QAASA,GAAE,QAAQ,EACnB,YAAaA,GAAE,OAAO,EAAE,SAAS,EACjC,WAAYA,GAAE,OAAO,EAAE,SAAS,EAChC,MAAOA,GAAE,OAAO,EAChB,cAAeA,GAAE,OAAO,EAAE,SAAS,EACnC,UAAWA,GAAE,OAAO,EAAE,SAAS,EAC/B,YAAaA,GAAE,QAAQ,EACvB,QAASA,GAAE,MAAMD,GAAY,EAC7B,YAAaC,GAAE,OAAO,EAAE,SAAS,EACjC,OAAQA,GAAE,OAAO,EAAE,SAAS,EAC5B,YAAaA,GAAE,OAAO,EAAE,SAAS,EACjC,UAAWA,GAAE,QAAQ,EACrB,SAAUA,GAAE,QAAQ,EACpB,cAAeA,GAAE,OAAO,EAAE,SAAS,EACnC,WAAYA,GAAE,OAAO,EAAE,SAAS,EAChC,UAAWA,GAAE,OAAO,EAAE,SAAS,EAC/B,OAAQA,GAAE,OAAO,EAAE,SAAS,EAC5B,SAAUA,GAAE,OAAO,EACnB,eAAgBA,GAAE,OAAO,EACzB,mBAAoBA,GAAE,OAAO,EAC7B,MAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAC3B,CAAC,EAEKE,IAAaF,GAAE,OAAO,CAC1B,IAAKA,GAAE,OAAO,EACd,MAAOA,GAAE,OAAO,EAChB,SAAUA,GAAE,KAAK,CAAC,WAAY,UAAW,UAAW,MAAM,CAAC,CAC7D,CAAC,EAEYG,GAAiBH,GAAE,OAAO,CACrC,MAAOA,GAAE,OAAO,EAChB,QAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC3B,SAAUA,GAAE,MAAMC,GAAa,EAC/B,YAAaD,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC/B,OAAQA,GAAE,MAAMA,GAAE,OAAO,CAAE,MAAOA,GAAE,OAAO,EAAG,MAAOA,GAAE,OAAO,CAAE,CAAC,CAAC,EAClE,MAAOA,GAAE,MAAME,GAAU,EACzB,gBAAiBF,GAAE,OAAO,EAAE,SAAS,CACvC,CAAC,EAOKI,IAAS,MAEFC,GAAyB,CACpC,WACA,UACA,UACA,MACF,EAEO,SAASC,GAAYC,EAAcC,EAAoB,CAC5D,OAAO,KAAK,OACT,KAAK,MAAM,GAAGA,CAAE,YAAY,EAAI,KAAK,MAAM,GAAGD,CAAI,YAAY,GAAKH,GACtE,CACF,CAGO,SAASK,GAAWC,EAAkBC,EAA0B,CACrE,GAAI,CAACD,EAAO,OACV,OAAO,KAGT,IAAME,EAAO,KAAK,KAAMD,EAAI,IAAOD,EAAO,MAAM,EAChD,OAAOA,EAAO,KAAK,IAAIA,EAAO,OAAQ,KAAK,IAAIE,EAAM,CAAC,CAAC,EAAI,CAAC,GAAK,IACnE,CAEO,SAASC,GAAUC,EAA4B,CACpD,MAAO,CAAC,GAAGA,CAAM,EAAE,KAAK,CAACC,EAAGC,IAAMD,EAAIC,CAAC,CACzC,CAEO,SAASC,IACdC,EACAC,EACW,CACX,OAAIA,EAAY,OAASD,EAAK,YAAY,OACjCA,EAAK,SAGPA,EAAK,SAAS,OAAQE,GAAQD,EAAY,IAAIC,EAAI,UAAU,CAAC,CACtE,CAEO,SAASC,GAAOD,EAAuB,CAC5C,OAAOA,EAAI,YAAc,MAAQA,EAAI,SAAW,IAClD,CAGA,SAASE,IAASF,EAAcG,EAAwB,CACtD,OACEH,EAAI,cAAgB,MACpBA,EAAI,aAAeG,GACnBH,EAAI,QAAU,iBAElB,CAEO,SAASI,GAAaJ,EAAcG,EAAwB,CACjE,OAAOF,GAAOD,CAAG,GAAKE,IAASF,EAAKG,CAAK,CAC3C,CAEO,SAASE,GAAeL,EAAcG,EAAwB,CACnE,OAAOF,GAAOD,CAAG,GAAK,CAACE,IAASF,EAAKG,CAAK,CAC5C,CAEO,SAASG,GACdC,EACAJ,EACAK,EACW,CACX,IAAMrB,EAAOsB,GAAYN,EAAOK,CAAK,EAErC,OAAOD,EAAK,OACTP,GACCA,EAAI,YAAc,MAAQA,EAAI,WAAab,GAAQa,EAAI,WAAaG,CACxE,CACF,CAGO,SAASO,GAAWH,EAA2B,CACpD,OAAOd,GACLc,EACG,OAAQP,GAAQA,EAAI,YAAc,MAAQA,EAAI,cAAgB,IAAI,EAClE,IAAKA,GAAQd,GAAYc,EAAI,aAAe,GAAIA,EAAI,WAAa,EAAE,CAAC,CACzE,CACF,CAGO,SAASW,GAAQX,EAA6B,CACnD,OAAOA,EAAI,aAAeA,EAAI,MAChC,CAEO,IAAMY,GAAc,CACzB,CAAE,MAAO,eAAgB,IAAK,CAAE,EAChC,CAAE,MAAO,iBAAa,IAAK,EAAG,EAC9B,CAAE,MAAO,iBAAa,IAAK,EAAG,EAC9B,CAAE,MAAO,eAAgB,IAAK,OAAO,iBAAkB,CACzD,EAEO,SAASC,IAAUC,EAAsB,CAC9C,OAAOF,GAAY,UAAWG,GAAWD,GAAQC,EAAO,GAAG,CAC7D,CAUO,SAASC,GAAUlB,EAAgBS,EAA6B,CACrE,OAAOT,EAAK,OACT,IAAI,CAAC,CAAE,MAAAmB,EAAO,MAAAC,CAAM,IAAM,CACzB,IAAMC,EAASP,GAAY,IAAI,IAAM,CAAC,EAEtC,QAAWZ,KAAOO,EAChB,GAAIP,EAAI,QAAUiB,EAAO,CACvB,IAAMG,EAAQP,IAAUb,EAAI,WAAa,CAAC,EAC1CmB,EAAOC,CAAK,GAAKD,EAAOC,CAAK,GAAK,GAAK,CACzC,CAGF,MAAO,CACL,MAAOH,EACP,MAAAC,EACA,OAAAC,EACA,MAAOA,EAAO,OAAO,CAACE,EAAKC,IAAUD,EAAMC,EAAO,CAAC,CACrD,CACF,CAAC,EACA,OAAQtB,GAAQA,EAAI,MAAQ,CAAC,CAClC,CAeO,SAASuB,IACdhB,EACAJ,EACAK,EACS,CACT,IAAMgB,EAAQC,GAAUtB,CAAK,EACvBuB,EAAU,MAAM,KAAK,CAAE,OAAQlB,CAAM,EAAG,CAACmB,EAAGP,IAChDQ,GAAUJ,EAAOJ,EAAQ,CAAC,CAC5B,EACMS,EAAMD,GAAUJ,EAAOhB,EAAQ,CAAC,EAEhCsB,EAAe,CACnB,QAAS,CAAC,EACV,MAAOJ,EAAQ,IAAKK,IAAY,CAAE,OAAAA,EAAQ,KAAM,CAAC,CAAE,EAAE,EACrD,MAAO,CAAC,EACR,QAAS,CAAC,CACZ,EAEA,QAAW/B,KAAOO,EAAM,CACtB,IAAMyB,EAAMrB,GAAQX,CAAG,EAEnBgC,IAAQ,KACVF,EAAI,QAAQ,KAAK9B,CAAG,EACXgC,EAAM7B,EACf2B,EAAI,QAAQ,KAAK9B,CAAG,EACXgC,GAAOH,EAChBC,EAAI,MAAM,KAAK9B,CAAG,EAElB8B,EAAI,MAAM5C,GAAYsC,EAAOC,GAAUO,CAAG,CAAC,EAAI,CAAC,GAAG,KAAK,KAAKhC,CAAG,CAEpE,CAEA,OAAO8B,CACT,CAGO,SAASG,IACd1B,EACAJ,EACAK,EACqC,CACrC,IAAMgB,EAAQC,GAAUtB,CAAK,EAE7B,OAAO,MAAM,KAAK,CAAE,OAAQK,CAAM,EAAG,CAACmB,EAAGP,IAAU,CACjD,IAAMW,EAASH,GAAUJ,EAAOJ,EAAQ,CAAC,EACnCc,EAASN,GAAUG,EAAQ,CAAC,EAElC,MAAO,CACL,OAAAA,EACA,MAAOxB,EAAK,OACTP,GACCA,EAAI,SAAW,MACfA,EAAI,cAAgB,MACpBA,EAAI,YAAcG,GAClBH,EAAI,aAAe+B,GACnB/B,EAAI,aAAekC,CACvB,EAAE,MACJ,CACF,CAAC,CACH,CAcO,SAASC,IACd5B,EACAJ,EACAK,EACY,CACZ,OAAO4B,GAAcjC,EAAOK,CAAK,EAAE,IAAKuB,GAAW,CACjD,IAAMG,EAASN,GAAUG,EAAQ,CAAC,EAC5BF,EAAMK,EAAS/B,EAAQ+B,EAAS/B,EAChCkC,EAAUC,GACdA,IAAQ,MAAQA,GAAOP,GAAUO,GAAOT,EAE1C,MAAO,CACL,OAAAE,EACA,SAAUxB,EAAK,OAAQP,GAAQqC,EAAOrC,EAAI,WAAW,CAAC,EAAE,OACxD,SAAUO,EAAK,OAAQP,GAAQqC,EAAOrC,EAAI,SAAS,CAAC,EAAE,OACtD,IAAKO,EAAK,OACPP,GACCA,EAAI,cAAgB,MACpBA,EAAI,aAAe6B,IAClB7B,EAAI,YAAc,MAAQA,EAAI,UAAY6B,KAC1C7B,EAAI,SAAW,MAAQA,EAAI,OAAS6B,EACzC,EAAE,MACJ,CACF,CAAC,CACH,CASO,SAASU,IAAWC,EAAkC,CAC3D,IAAMC,EAAWC,GACfjD,GACE+C,EAAS,QAASxC,GAAQ,CACxB,IAAMsC,EAAMI,EAAK1C,CAAG,EACpB,OAAOA,EAAI,cAAgB,MAAQsC,IAAQ,KACvC,CAACpD,GAAYc,EAAI,YAAasC,CAAG,CAAC,EAClC,CAAC,CACP,CAAC,CACH,EAEF,MAAO,CACL,CACE,IAAK,OACL,MAAO,UACP,KAAMG,EAASzC,GAAQA,EAAI,WAAW,CACxC,EACA,CACE,IAAK,QACL,MAAO,gBACP,KAAMyC,EAASzC,GAAQA,EAAI,aAAa,CAC1C,EACA,CACE,IAAK,UACL,MAAO,WACP,KAAMyC,EAASzC,GAAQA,EAAI,SAAS,CACtC,CACF,CACF,CAgBO,SAAS2C,IAAM7C,EAAgBS,EAAiBpB,EAAuB,CAC5E,IAAMyD,EAAU,IAAI,IAClB9C,EAAK,OAAO,IAAI,CAAC,CAAE,MAAAmB,EAAO,MAAAC,CAAM,IAAM,CACpCD,EACA,CACE,MAAOA,EACP,MAAAC,EACA,SAAU,CAAC,EACX,QAAS,CAAC,CACZ,CACF,CAAC,CACH,EAEA,QAAWlB,KAAOO,EAChBP,EAAI,QAAQ,QAAQ,CAAC6C,EAAQzB,IAAU,CACrC,IAAM0B,EAAO9C,EAAI,QAAQoB,EAAQ,CAAC,EAC5B2B,EAAQH,EAAQ,IAAIC,EAAO,KAAK,EAEjCE,IAIDD,EACE,CAACD,EAAO,YAAcC,EAAK,QAAU3D,GACvC4D,EAAM,SAAS,KAAK7D,GAAY2D,EAAO,QAASC,EAAK,OAAO,CAAC,EAEtD7C,GAAOD,CAAG,GACnB+C,EAAM,QAAQ,KACZ,KAAK,IAAI,EAAG7D,GAAY2D,EAAO,QAAS/C,EAAK,KAAK,CAAC,CACrD,EAEJ,CAAC,EAGH,MAAO,CAAC,GAAG8C,EAAQ,OAAO,CAAC,EACxB,IAAKG,IAAW,CACf,GAAGA,EACH,SAAUtD,GAAUsD,EAAM,QAAQ,EAClC,QAAStD,GAAUsD,EAAM,OAAO,CAClC,EAAE,EACD,OAAQA,GAAUA,EAAM,SAAS,QAAUA,EAAM,QAAQ,MAAM,CACpE,CAEO,SAASC,IAAezC,EAAiBpB,EAAsB,CACpE,OAAOoB,EAAK,OACV,CAACe,EAAOtB,IACNsB,EACAtB,EAAI,QAAQ,OACT6C,GACCA,EAAO,QAAU,YACjB,CAACA,EAAO,YACRA,EAAO,QAAU1D,CACrB,EAAE,OACJ,CACF,CACF,CAGO,SAAS8D,GAAcjD,EAAckD,EAAuB,CACjE,IAAMC,EAAQnD,EAAI,MAAM,IAAKoD,GAAQ,CACnC,IAAMC,EAAOH,EAAM,KAAMI,GAAcA,EAAU,MAAQF,CAAG,EAC5D,OAAOC,EAAOpE,GAAW,QAAQoE,EAAK,QAAQ,EAAIpE,GAAW,MAC/D,CAAC,EAED,OAAO,KAAK,IAAIA,GAAW,OAAQ,GAAGkE,CAAK,CAC7C,CAGO,SAASI,IAAUhD,EAAiB2C,EAA0B,CACnE,MAAO,CAAC,GAAG3C,CAAI,EAAE,KACf,CAACZ,EAAGC,IACFqD,GAActD,EAAGuD,CAAK,EAAID,GAAcrD,EAAGsD,CAAK,IAC/CtD,EAAE,YAAc,KAAOD,EAAE,YAAc,KACxCA,EAAE,GAAKC,EAAE,EACb,CACF,CAGO,SAAS4D,GAAexD,EAAckD,EAAwB,CACnE,OAAOD,GAAcjD,EAAKkD,CAAK,EAAIjE,GAAW,QAAQ,MAAM,CAC9D,CAEO,SAASwE,GACdlD,EACA2C,EACqB,CACrB,IAAM/B,EAAS,IAAI,IAAI+B,EAAM,IAAKG,GAAS,CAACA,EAAK,IAAK,CAAC,CAAC,CAAC,EAEzD,QAAWrD,KAAOO,EAChB,QAAW6C,KAAOpD,EAAI,MACpBmB,EAAO,IAAIiC,GAAMjC,EAAO,IAAIiC,CAAG,GAAK,GAAK,CAAC,EAI9C,OAAOjC,CACT,CAgBO,SAASuC,IACd5D,EACAS,EACAC,EACiB,CACjB,IAAML,EAAQL,EAAK,MACb6D,EAAU/B,GAAUzB,EAAO,EAAE,EAEnC,OAAOL,EAAK,YACT,IAAK8D,GAAS,CACb,IAAMC,EAAOtD,EAAK,OAAQP,GAAQA,EAAI,aAAe4D,CAAI,EACnDE,EAAaD,EAAK,OAAQ7D,GAAQI,GAAaJ,EAAKG,CAAK,CAAC,EAC1DqC,EAAWlC,GAAeuD,EAAM1D,EAAOK,CAAK,EAC5CuD,EAAWvB,EAAS,OAAQxC,GAAQA,EAAI,SAAW,IAAI,EAE7D,MAAO,CACL,KAAA4D,EACA,SAAUC,EAAK,OAAQ7D,GAAQK,GAAeL,EAAKG,CAAK,CAAC,EAAE,OAC3D,WAAY2D,EAAW,OACvB,QAASA,EAAW,OAAQ9D,GAAQA,EAAI,OAAO,EAAE,OACjD,UAAW8D,EAAW,OAAQ9D,GAAQwD,GAAexD,EAAKF,EAAK,KAAK,CAAC,EAClE,OACH,UAAWT,GACTI,GAAUqE,EAAW,IAAK9D,GAAQA,EAAI,YAAc,CAAC,CAAC,EACtD,EACF,EACA,QAAS6D,EAAK,OAAQ7D,GAAQ,CAC5B,IAAMgC,EAAMrB,GAAQX,CAAG,EACvB,OAAOC,GAAOD,CAAG,GAAKgC,IAAQ,MAAQA,GAAO2B,CAC/C,CAAC,EAAE,OACH,SAAUnB,EAAS,OACnB,YAAanD,GAAWqB,GAAW8B,CAAQ,EAAG,EAAE,EAChD,OAAQuB,EAAS,OACd/D,IAASA,EAAI,WAAa,MAAQA,EAAI,QAAU,GACnD,EAAE,OACF,WAAY+D,EAAS,MACvB,CACF,CAAC,EACA,OAAQ/D,GAAQA,EAAI,UAAYA,EAAI,YAAcA,EAAI,QAAQ,EAC9D,KACC,CAACL,EAAGC,IACFA,EAAE,WAAaD,EAAE,YACjBC,EAAE,SAAWD,EAAE,UACfA,EAAE,KAAK,cAAcC,EAAE,IAAI,CAC/B,CACJ,CCzcA,IAAMoE,IAAW,CAAC,UAAW,UAAW,UAAW,SAAS,EAGtDC,GAAmC,CACvC,SAAU,UACV,QAAS,UACT,QAAS,UACT,KAAM,SACR,EAEMC,GAAgB,EAChBC,GAAgB,GAEtB,SAASC,GAAKC,EAA8B,CAC1C,OAAOA,IAAU,KAAO,SAAM,GAAGA,CAAK,GACxC,CAEA,SAASC,GAAOC,EAAeC,EAAaC,EAAO,GAAGD,CAAG,IAAa,CACpE,MAAO,GAAGD,CAAK,IAAIA,IAAU,EAAIC,EAAMC,CAAI,EAC7C,CAEA,SAASC,IAASC,EAAoC,CACpD,IAAMC,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,yBAEf,IAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOF,EAAI,IAChBE,EAAK,UAAY,4CACjBA,EAAK,YAAcF,EAAI,QAEvB,IAAMG,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,UAAY,wBAChBA,EAAI,YAAc,CAACH,EAAI,SAAUA,EAAI,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,EAEzEC,EAAG,OAAOC,EAAMC,CAAG,EACZF,CACT,CAEA,SAASG,IAAIX,EAA6B,CACxC,OAAIA,IAAS,KACJ,GAEFA,IAAS,EAAI,QAAU,GAAGA,CAAI,OACvC,CAEA,SAASY,GACPC,EACAC,EACAC,EAA0B,QACJ,CACtB,IAAMP,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,2CAA2CO,CAAK,GAE/D,IAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,YAAcH,EAEpB,IAAMI,EAAS,SAAS,cAAc,KAAK,EAC3C,OAAAA,EAAO,UAAY,wBACnBA,EAAO,YAAcH,EAErBN,EAAG,OAAOQ,EAAOC,CAAM,EAChBT,CACT,CAEA,SAASU,IAAMC,EAAeC,EAAiC,CAC7D,IAAMC,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UACH,oHAEF,IAAMC,EAAM,SAAS,cAAc,MAAM,EACzCA,EAAI,UAAY,gCAChBA,EAAI,MAAM,gBAAkBzB,GAAOuB,CAAQ,EAE3C,IAAMG,EAAO,SAAS,cAAc,MAAM,EAC1C,OAAAA,EAAK,YAAcJ,EAEnBE,EAAK,OAAOC,EAAKC,CAAI,EACdF,CACT,CAEA,SAASG,GAAKC,EAAkB,CAC9B,MAAO,CACL,KAAM,WACN,KAAMA,EACN,UAAW,CAAE,MAAOC,EAAM,EAC1B,SAAU,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,EACvC,SAAU,CAAE,KAAM,EAAM,CAC1B,CACF,CAEA,SAASC,GAAUC,EAAO,GAAI,CAC5B,MAAO,CACL,KAAM,QACN,YAAa,EACb,KAAAA,EACA,cAAe,CAAE,MAAOH,EAAM,EAC9B,UAAW,CAAE,MAAOA,EAAM,EAC1B,UAAW,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,CAC1C,CACF,CAEA,SAASG,GAAMC,EAAwBC,EAAiB,CACtDD,EAAM,UACJ,CACE,MAAO,CACL,KAAMC,EACN,KAAM,SACN,IAAK,SACL,UAAW,CAAE,MAAON,GAAO,SAAU,GAAI,WAAY,QAAS,CAChE,EACA,MAAO,CAAE,KAAM,EAAM,EACrB,MAAO,CAAE,KAAM,EAAM,EACrB,OAAQ,CAAC,CACX,EACA,CAAE,SAAU,EAAK,CACnB,CACF,CAiDA,IAAOO,IAAQ,IAA8B,CAC3C,IAAMC,EAAiD,CACrD,OAAQ,KACR,OAAQ,KACR,QAAS,KACT,SAAU,KACV,KAAM,KACN,IAAK,KACL,WAAY,IACd,EAEA,MAAO,CACL,KAAMC,GAAe,MAAM,CACzB,MAAO,aACP,QAAS,CAAC,EACV,SAAU,CAAC,EACX,YAAa,CAAC,EACd,OAAQ,CAAC,EACT,MAAO,CAAC,EACR,gBAAiB,IACnB,CAAC,EACD,MAAOpC,GACP,YAAa,CAAC,EACd,KAAM,GACN,WAAY,GACZ,aAAc,SACd,iBAAkB,GAClB,UAAW,SACX,QAAS,GACT,UAAW,SACX,cAAe,GACf,QAAS,SACT,YAAa,GACb,SAAU,SACV,aAAc,GACd,YAAa,SACb,UAAW,GACX,OAAQ,SACR,WAAY,GACZ,UAAW,SACX,cAAe,GACf,UAAW,GACX,YAAa,GACb,aAAc,GACd,UAAW,GAEX,MAAO,CACL,GAAI,EAAE,KAAK,eAAe,aACxB,OAGF,IAAMqC,EAAM,KAAK,IAAI,QAAQ,UAE7B,GAAI,CAACA,EACH,OAGF,IAAMC,EAASF,GAAe,UAAU,KAAK,MAAMC,CAAG,CAAC,EAEvD,GAAKC,EAAO,QAIZ,MAAK,KAAOA,EAAO,KACnB,KAAK,YAAc,CAAC,GAAG,KAAK,KAAK,WAAW,EAC5C,KAAK,MAAQ,KAAK,KAAK,QAAQ,SAAStC,EAAa,EACjDA,GACC,KAAK,KAAK,QAAQ,CAAC,GAAKA,GAE7B,QAAWuC,KAAO,OAAO,KAAKJ,CAAM,EAAG,CACrC,IAAMK,EAAO,KAAK,MAAMD,CAAG,EAEvBC,aAAgB,cAClBL,EAAOI,CAAG,EAAYE,GAAKD,CAAI,EAEnC,CAEA,OAAO,iBAAiB,SAAU,IAAM,CACtC,QAAWR,KAAS,OAAO,OAAOG,CAAM,EACtCH,GAAO,OAAO,CAElB,CAAC,EAED,KAAK,OAAO,EACd,EAEA,MAAkB,CAChB,OAAOU,IAAiB,KAAK,KAAM,IAAI,IAAI,KAAK,WAAW,CAAC,CAC9D,EAEA,UAAUC,EAAe,CACvB,KAAK,MAAQA,EACb,KAAK,OAAO,CACd,EAEA,iBAAiBb,EAAc,CAC7B,KAAK,YAAcc,GAAO,KAAK,YAAa,KAAK,KAAK,YAAad,CAAI,EACvE,KAAK,OAAO,CACd,EAEA,kBAAmB,CACjB,KAAK,YAAc,CAAC,GAAG,KAAK,KAAK,WAAW,EAC5C,KAAK,OAAO,CACd,EAEA,aAAaA,EAAuB,CAClC,OAAO,KAAK,YAAY,SAASA,CAAI,CACvC,EAEA,UAAUA,EAAsB,CAC9B,IAAMe,EAAQ,KAAK,KAAK,YAAY,QAAQf,CAAI,EAChD,OAAOe,GAAS,EAAKC,GAAOD,EAAQC,GAAO,MAAM,GAAKC,GAASA,EACjE,EAEA,SAASR,EAAa,CACpB,KAAK,KAAO,KAAK,OAASA,EAAM,GAAKA,EACrC,KAAK,gBAAgB,KAAK,KAAK,CAAC,CAClC,EAEA,QAAS,CACP,IAAMS,EAAO,KAAK,KAAK,EACjBC,EAAQ,KAAK,KAAK,MAClBC,EAAWC,GAAeH,EAAMC,EAAO,KAAK,KAAK,EACjDG,EAAOF,EAAS,OAAS,KAAK,MAEpC,KAAK,WACH,6BAA6BG,GAASC,GAAYL,EAAO,KAAK,KAAK,CAAC,CAAC,OAC/DI,GAASJ,CAAK,CAAC,oCAEvB,KAAK,YAAYD,CAAI,EACrB,KAAK,gBAAgBA,CAAI,EACzB,KAAK,aAAaA,CAAI,EACtB,KAAK,aAAaA,EAAMO,GAAWL,CAAQ,CAAC,EAC5C,KAAK,cAAcF,EAAMI,CAAI,EAC7B,KAAK,eAAeJ,CAAI,EACxB,KAAK,WAAWA,CAAI,EACpB,KAAK,iBAAiBE,CAAQ,EAC9B,KAAK,YAAYF,CAAI,EACrB,KAAK,kBAAkBA,CAAI,CAC7B,EAEA,YAAYA,EAAiB,CAC3B,IAAMQ,EAAO,KAAK,KACZP,EAAQO,EAAK,MACbb,EAAQ,KAAK,MACbc,EAAaT,EAAK,OAAQxC,GAAQkD,GAAalD,EAAKyC,CAAK,CAAC,EAC1DU,EAAWX,EAAK,OAAQxC,GAAQoD,GAAepD,EAAKyC,CAAK,CAAC,EAE1DY,EAASF,EAAS,OACrBnD,GACCA,EAAI,cAAgB,MACpBA,EAAI,YAAcyC,GAClBzC,EAAI,aAAesD,GAAUb,EAAO,EAAE,CAC1C,EAAE,OAEF,KAAK,aAAe,OAAOQ,EAAW,MAAM,EAC5C,KAAK,iBACH,GAAGE,EAAS,MAAM,yBACfxD,GAAO0D,EAAQ,QAAQ,CAAC,8BAE7B,IAAMX,EAAWC,GAAeH,EAAMC,EAAON,CAAK,EAC5CoB,EAAQR,GAAWL,CAAQ,EAC3Bc,EAAMC,GAAWF,EAAO,EAAE,EAC1BG,EAAOC,GAAUV,EAAW,IAAKjD,GAAQA,EAAI,YAAc,CAAC,CAAC,EAEnE,KAAK,UAAYP,GAAKgE,GAAWC,EAAM,EAAE,CAAC,EAC1C,KAAK,QAAUA,EAAK,OAChB,UAAUA,EAAK,GAAG,EAAE,CAAC,WACpBF,IAAQ,KACL,uCACA,GAAGE,EAAK,OAAQE,GAAQA,EAAMJ,CAAG,EAAE,MAAM,gCAC5BA,CAAG,MACpB,wBAEJ,IAAMK,EAAOrB,EAAK,OAAOsB,EAAM,EACzBC,EAAYd,EAAW,OAAQjD,GACnCgE,GAAehE,EAAKgD,EAAK,KAAK,CAChC,EACMiB,EAASC,GAAWjB,EAAYD,EAAK,KAAK,EAEhD,KAAK,UAAY,OAAOe,EAAU,MAAM,EACxC,KAAK,cACHf,EAAK,MACF,OAAQmB,GAASA,EAAK,WAAa,QAAUF,EAAO,IAAIE,EAAK,GAAG,CAAC,EACjE,KACC,CAACC,EAAGC,IACFC,GAAW,QAAQF,EAAE,QAAQ,EAAIE,GAAW,QAAQD,EAAE,QAAQ,IAC7DJ,EAAO,IAAII,EAAE,GAAG,GAAK,IAAMJ,EAAO,IAAIG,EAAE,GAAG,GAAK,EACrD,EACC,MAAM,EAAG,CAAC,EACV,IAAKD,GAAS,GAAGA,EAAK,KAAK,IAAIF,EAAO,IAAIE,EAAK,GAAG,CAAC,EAAE,EACrD,KAAK,QAAK,GAAK,kBAEpB,IAAMI,EAAUjB,GAAUb,EAAO,EAAE,EAC7B+B,EAAMX,EAAK,OAAQ7D,GAAQ,CAC/B,IAAMyE,EAAMC,GAAQ1E,CAAG,EACvB,OAAOyE,IAAQ,MAAQA,GAAOhC,GAASgC,GAAOF,CAChD,CAAC,EACKI,EAAUd,EAAK,OAAQ7D,GAAQ,CACnC,IAAMyE,EAAMC,GAAQ1E,CAAG,EACvB,OAAOyE,IAAQ,MAAQA,EAAMhC,CAC/B,CAAC,EACKG,EAAQF,EAAS,OAASP,EAAS,EAEzC,KAAK,QAAU,OAAOqC,EAAI,MAAM,EAChC,KAAK,YACH,GAAGG,EAAQ,MAAM,0BACb/B,EAAK,QAAQA,EAAO,GAAK,EAAI,CAAC,CAAC,+BAErC,IAAMgC,EACJjC,GAAeH,EAAMC,EAAON,EAAQ,CAAC,EAAE,OAASO,EAAS,OACrDmC,EAASnC,EAAS,OAASkC,EAEjC,KAAK,SAAW,OAAOlC,EAAS,MAAM,EACtC,KAAK,aACH,GAAGmC,GAAU,EAAI,IAAM,EAAE,GAAGA,CAAM,WAAW1C,CAAK,kBAC9CyC,CAAM,IAEZ,KAAK,YAAcnF,GAAKgE,GAAWF,EAAO,EAAE,CAAC,EAC7C,KAAK,UAAYA,EAAM,OACnB,0BAAuBC,CAAG,UAAO7D,GAAO4D,EAAM,OAAQ,MAAM,CAAC,GAC7D,2CAEJ,IAAMuB,EAAWpC,EAAS,OAAQ1C,GAAQA,EAAI,SAAW,IAAI,EACvD+E,EAASD,EAAS,OACrB9E,IAASA,EAAI,WAAa,MAAQA,EAAI,QAAU,GACnD,EAAE,OAEF,KAAK,OAAS8E,EAAS,OACnB,GAAG,KAAK,MAAOC,EAASD,EAAS,OAAU,GAAG,CAAC,IAC/C,SACJ,KAAK,WAAaA,EAAS,OACvB,GAAGC,CAAM,OAAOD,EAAS,MAAM,uBAC5BpC,EAAS,OAASoC,EAAS,MAAM,YACpC,qCAEJ,IAAME,EAAOlC,GAAYL,EAAON,CAAK,EAC/B8C,EAAWzC,EAAK,OACnBxC,GAAQA,EAAI,SAAW,MAAQA,EAAI,QAAU,UAChD,EAAE,OACIkF,EAAYlC,EAAK,gBAEvB,KAAK,UAAY,OAAOmC,IAAe3C,EAAMwC,CAAI,CAAC,EAClD,KAAK,cACH,GAAGC,CAAQ,uBACVC,GAAaA,EAAYF,EACtB,kBAAkBnC,GAASqC,CAAS,CAAC,GACrC,wBACR,EAEA,gBAAgB1C,EAAiB,CAC/B,IAAMQ,EAAO,KAAK,KACZP,EAAQO,EAAK,MACboC,EAAQ,IAAI,IAAIpC,EAAK,MAAM,IAAKmB,GAAS,CAACA,EAAK,IAAKA,CAAI,CAAC,CAAC,EAC1DkB,EAAS,IAAI,IACjBrC,EAAK,OAAO,IAAKsC,GAAU,CAACA,EAAM,MAAOA,EAAM,KAAK,CAAC,CACvD,EACMrC,EAAaT,EAAK,OAAQxC,GAAQkD,GAAalD,EAAKyC,CAAK,CAAC,EAC1DwB,EAASC,GAAWjB,EAAYD,EAAK,KAAK,EAE1CuC,EAAQ,KAAK,MAAM,UAEzB,GAAIA,aAAiB,YAAa,CAChCA,EAAM,YAAc,GAEpB,QAAWpB,KAAQnB,EAAK,MAAO,CAC7B,IAAMpD,EAAQqE,EAAO,IAAIE,EAAK,GAAG,GAAK,EAEtC,GAAI,CAACvE,EACH,SAGF,IAAM4F,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAO,SACdA,EAAO,aAAa,eAAgB,OAAO,KAAK,OAASrB,EAAK,GAAG,CAAC,EAClEqB,EAAO,UAAY,iEACjB,KAAK,OAASrB,EAAK,IACf,6BACA,2CACN,GAEA,IAAMpD,EAAM,SAAS,cAAc,MAAM,EACzCA,EAAI,UAAY,gCAChBA,EAAI,MAAM,gBAAkBzB,GAAO6E,EAAK,QAAQ,EAEhD,IAAMvD,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,YAAc,GAAGuD,EAAK,KAAK,SAAMvE,CAAK,GAE5C4F,EAAO,OAAOzE,EAAKH,CAAK,EACxB4E,EAAO,iBAAiB,QAAS,IAAM,KAAK,SAASrB,EAAK,GAAG,CAAC,EAC9DoB,EAAM,OAAOC,CAAM,CACrB,CACF,CAEA,IAAMxD,EAAO,KAAK,MAAM,eAExB,GAAI,EAAEA,aAAgB,aACpB,OAGF,IAAMyD,EAAQC,IACZzC,EAAW,OAAQjD,GAAQ,CAAC,KAAK,MAAQA,EAAI,MAAM,SAAS,KAAK,IAAI,CAAC,EACtEgD,EAAK,KACP,EAEAhB,EAAK,YAAc,GACnB,IAAM2D,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACHC,GAAQ,CACN,CAAC,WAAY,MAAM,EACnB,CAAC,aAAc,MAAM,EACrB,CAAC,QAAS,MAAM,EAChB,CAAC,WAAY,OAAO,EACpB,CAAC,UAAW,OAAO,EACnB,CAAC,QAAS,MAAM,EAChB,CAAC,MAAO,OAAO,EACf,CAAC,aAAc,MAAM,EACrB,CAAC,QAAS,OAAO,CACnB,CAAC,CACH,EAEA,IAAMC,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEZJ,EAAM,QACTI,EAAK,OAAOC,GAAS,EAAG,iCAAiC,CAAC,EAG5D,IAAMC,EAAO,IAAMC,GAAK,SAAK,eAAe,EAE5C,QAAWhG,KAAOyF,EAAO,CACvB,IAAMQ,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,6BAEfA,EAAG,OAAOlG,IAASC,CAAG,CAAC,EAEvB,IAAMkG,EAAMC,GAASnG,EAAI,WAAY,KAAK,UAAUA,EAAI,UAAU,CAAC,EACnEkG,EAAI,UAAU,IAAI,mBAAmB,EACrCD,EAAG,OAAOC,CAAG,EAEb,IAAME,EACJpG,EAAI,YAAc,KACd,GACA,GAAGA,EAAI,YAAc,GAAK,SAAI,GAAGA,EAAI,SAAS,aACpDiG,EAAG,OACD5F,GAAYgF,EAAO,IAAIrF,EAAI,KAAK,GAAKA,EAAI,MAAOoG,EAAS,MAAM,CACjE,EAEAH,EAAG,OACDjG,EAAI,YACAK,GAAYgG,GAAUrG,EAAI,WAAW,EAAGI,IAAIJ,EAAI,UAAU,CAAC,EAC3D+F,EAAK,CACX,EAEAE,EAAG,OACDjG,EAAI,YACAgG,GAAKK,GAAUrG,EAAI,WAAW,EAAG,mBAAmB,EACpD+F,EAAK,CACX,EAEAE,EAAG,OACDjG,EAAI,cACAK,GACE,WAAWgG,GAAUrG,EAAI,aAAa,CAAC,GACvC,GAAGL,GAAOK,EAAI,SAAU,SAAS,CAAC,iBAAcI,IAAIJ,EAAI,UAAU,CAAC,GACnE,MACF,EACA+F,EAAK,CACX,EAEA,IAAMvB,EAAME,GAAQ1E,CAAG,EACvBiG,EAAG,OACDzB,EACInE,GACEgG,GAAU7B,CAAG,EACbxE,EAAI,aAAeA,EAAI,QAAUA,EAAI,cAAgBA,EAAI,OACrD,UAAUqG,GAAUrG,EAAI,MAAM,CAAC,GAC/BA,EAAI,YACF,cACA,QACR,EACA+F,EAAK,CACX,EAEA,IAAMO,EAAQ,CACZtG,EAAI,eAAiBL,GAAOK,EAAI,eAAgB,eAAe,EAAI,GACnEA,EAAI,mBACA,GAAGL,GAAOK,EAAI,mBAAoB,KAAK,CAAC,UACxC,GACJA,EAAI,UAAY,GAAK,WACrBA,EAAI,SAAW,GAAK,SACtB,EAAE,OAAO,OAAO,EACVuG,EAAYP,GAChBM,EAAM,KAAK,QAAK,GAAK,SACrBA,EAAM,OAAS,sBAAwB,0BACzC,EACAL,EAAG,OAAOM,CAAS,EAEnB,IAAMC,EAAW,SAAS,cAAc,IAAI,EAC5CA,EAAS,UAAY,eACrB,IAAMC,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,mCAEjB,QAAW1E,KAAO/B,EAAI,MAAO,CAC3B,IAAMmE,EAAOiB,EAAM,IAAIrD,CAAG,EAEtBoC,GACFsC,EAAK,OAAO9F,IAAMwD,EAAK,MAAOA,EAAK,QAAQ,CAAC,CAEhD,CAEAqC,EAAS,OAAOC,CAAI,EACpBR,EAAG,OAAOO,CAAQ,EAClBX,EAAK,OAAOI,CAAE,CAChB,CAEAjE,EAAK,OAAO2D,EAAME,CAAI,CACxB,EAEA,aAAarD,EAAiB,CAC5B,IAAMhB,EAAQG,EAAO,OAErB,GAAI,CAACH,EACH,OAGF,IAAMqC,EAAOrB,EAAK,OAAOsB,EAAM,EACzBuB,EAASqB,GAAU,KAAK,KAAM7C,CAAI,EAAE,QAAQ,EAC5C8C,EAAU9C,EAAK,OAAQ7D,GAAQ,CAACA,EAAI,WAAW,EAAE,OAOvD,GALA,KAAK,UAAY2G,EACb,GAAGhH,GAAOgH,EAAS,MAAM,CAAC,yFAE1B,GAEA,CAACtB,EAAO,OAAQ,CAClB9D,GAAMC,EAAO,iCAAiC,EAC9C,MACF,CAEAA,EAAM,UACJ,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CAAE,KAAM,EAAG,MAAO,GAAI,IAAK,EAAG,OAAQ,GAAI,aAAc,EAAK,EACnE,QAAS,CAAE,QAAS,OAAQ,YAAa,CAAE,KAAM,QAAS,CAAE,EAC5D,OAAQ,CAAE,OAAQ,EAAG,KAAM,WAAY,EACvC,MAAO,CAAE,GAAGH,GAAU,EAAG,KAAM,EAAK,EACpC,MAAO,CACL,KAAM,WACN,KAAMgE,EAAO,IAAKrF,GAAQA,EAAI,KAAK,EACnC,UAAW,CAAE,MAAO4G,EAAI,EACxB,SAAU,CAAE,KAAM,EAAM,EACxB,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,OAAQC,GAAY,IAAI,CAACC,EAAQzE,KAAW,CAC1C,KAAMyE,EAAO,MACb,KAAM,MACN,MAAO,MACP,YAAa,GACb,UAAW,CACT,MAAOzH,IAASgD,CAAK,EACrB,YAAa0E,GACb,YAAa,CACf,EACA,KAAM1B,EAAO,IAAKrF,GAAQA,EAAI,OAAOqC,CAAK,GAAK,CAAC,CAClD,EAAE,CACJ,EACA,CAAE,SAAU,EAAK,CACnB,CACF,EAEA,aAAaG,EAAiBe,EAAiB,CAC7C,IAAM/B,EAAQG,EAAO,OAErB,GAAI,CAACH,EACH,OAGF,IAAMiB,EAAQ,KAAK,KAAK,MAClBQ,EAAaT,EAAK,OAAQxC,GAAQkD,GAAalD,EAAKyC,CAAK,CAAC,EAC1D4C,EAASqB,GAAU,KAAK,KAAMzD,CAAU,EAAE,IAAKjD,GAAQA,EAAI,KAAK,EAChEkB,EAAS,IAAI,IACjB,KAAK,KAAK,OAAO,IAAKoE,GAAU,CAACA,EAAM,MAAOA,EAAM,KAAK,CAAC,CAC5D,EACM0B,EAAMvD,GAAWF,EAAO,EAAE,EAC1BC,EAAMC,GAAWF,EAAO,EAAE,EAEhC,GAAI,CAACN,EAAW,OAAQ,CACtB1B,GAAMC,EAAO,0CAA0C,EACvD,MACF,CAIA,IAAMyF,EAAO,IAAI,IACXC,EAASlH,GAAiB,CAC9B,IAAM+B,EAAM,GAAG/B,EAAI,KAAK,IAAIA,EAAI,UAAU,GACpCqC,EAAQ4E,EAAK,IAAIlF,CAAG,GAAK,EAC/BkF,EAAK,IAAIlF,EAAKM,EAAQ,CAAC,EACvB,IAAM8E,GAAW9E,EAAQ,EAAK,GAAK,IACnC,MAAO,CACL,MAAO,CAACrC,EAAI,YAAc,EAAGqF,EAAO,QAAQrF,EAAI,KAAK,EAAImH,CAAM,EAC/D,IAAAnH,CACF,CACF,EAEMoH,EAAQpH,GACZwD,IAAQ,OAASxD,EAAI,YAAc,GAAKwD,EAEpC6D,EACJL,IAAQ,KACJ,OACA,CACE,OAAQ,GACR,OAAQ,OACR,UAAW,CAAE,MAAO7F,GAAO,KAAM,SAAmB,MAAO,CAAE,EAC7D,MAAO,CAAE,MAAOA,GAAO,UAAW,MAAO,SAAU,OAAQ,EAC3D,KAAM,CACJ,CAAE,KAAM,eAAe6F,CAAG,IAAK,MAAOA,CAAI,EAC1C,CAAE,KAAM,UAAUxD,CAAG,IAAK,MAAOA,GAAOwD,CAAI,CAC9C,CACF,EAEAM,EAAS,CACb,CACE,KAAM9D,IAAQ,KAAO,gBAAkB,4BACvC,KAAM,UACN,WAAY,GACZ,UAAW,CAAE,MAAO+D,GAAQ,YAAaR,GAAS,YAAa,CAAE,EACjE,KAAM9D,EAAW,OAAQjD,GAAQ,CAACoH,EAAKpH,CAAG,CAAC,EAAE,IAAIkH,CAAK,EACtD,SAAAG,CACF,EACA,CACE,KAAM,8BACN,KAAM,UACN,WAAY,GACZ,UAAW,CACT,MAAO/H,GAAO,QACd,YAAayH,GACb,YAAa,CACf,EACA,KAAM9D,EAAW,OAAOmE,CAAI,EAAE,IAAIF,CAAK,CACzC,CACF,EAEA1F,EAAM,UACJ,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CAAE,KAAM,EAAG,MAAO,GAAI,IAAK,GAAI,OAAQ,GAAI,aAAc,EAAK,EACpE,OAAQ,CAAE,OAAQ,EAAG,KAAM,QAAS,EACpC,QAAS,CACP,QAAS,OACT,UAAYgG,GAAuC,CACjD,IAAMxH,EAAMwH,EAAO,KAAK,IAElBC,EAAeC,GAAO,WAC5B,MACE,MAAMD,EAAKzH,EAAI,OAAO,CAAC,YAAYyH,EAAKzH,EAAI,UAAU,CAAC,SACpDyH,EAAKvG,EAAO,IAAIlB,EAAI,KAAK,GAAKA,EAAI,KAAK,CAAC,QACxCA,EAAI,UAAU,gBAErB,CACF,EACA,MAAO,CACL,GAAGqB,GAAU,mBAAmB,EAChC,aAAc,SACd,QAAS,GACT,IAAK,EACL,SAAU,CAAE,OAAQ,GAAO,UAAW,CAAE,MAAOD,EAAK,CAAE,CACxD,EACA,MAAO,CACL,KAAM,QACN,IAAK,GACL,IAAKiE,EAAO,OACZ,SAAU,EACV,QAAS,GACT,UAAW,CAAE,KAAM,EAAM,EACzB,SAAU,CAAE,KAAM,EAAM,EACxB,SAAU,CAAE,KAAM,EAAM,EACxB,UAAW,CACT,MAAOuB,GACP,UAAYlH,GACVwB,EAAO,IAAImE,EAAO3F,CAAK,GAAK,EAAE,GAAK,EACvC,CACF,EACA,OAAA4H,CACF,EACA,CAAE,SAAU,EAAK,CACnB,CACF,EAEA,cAAc9E,EAAiBI,EAAc,CAC3C,IAAMpB,EAAQG,EAAO,QAErB,GAAI,CAACH,EACH,OAGF,IAAMqC,EAAOrB,EAAK,OAAOsB,EAAM,EACzB6D,EAAQC,IAAQ/D,EAAM,KAAK,KAAK,MAAOtE,EAAa,EACpD2B,EAAS,CACb,UACA,GAAGyG,EAAM,MAAM,IAAKE,GAASxB,GAAUwB,EAAK,MAAM,CAAC,CACrD,EACMC,EAAU,CAACH,EAAM,QAAS,GAAGA,EAAM,MAAM,IAAKE,GAASA,EAAK,IAAI,CAAC,EACjEE,EAAO,KAAK,KAAK,YAAY,OAAQzG,GACzC,KAAK,aAAaA,CAAI,CACxB,EAEA,KAAK,YACH,GAAG3B,GAAOgI,EAAM,QAAQ,OAAQ,WAAW,CAAC,wCACvBA,EAAM,MAAM,MAAM,oBAAoBpI,EAAa,UAE1EiC,EAAM,UACJ,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CACJ,KAAM,GACN,MAAO,GACP,IAAK,GACL,OAAQuG,EAAK,OAAS,EAAI,GAAK,EACjC,EACA,QAAS,CAAE,QAAS,OAAQ,YAAa,CAAE,KAAM,QAAS,CAAE,EAC5D,OACEA,EAAK,OAAS,EAAI,CAAE,OAAQ,EAAG,KAAM,WAAY,EAAI,OACvD,MAAO,CACL,GAAG9G,GAAKC,CAAM,EACd,KAAM,iBACN,aAAc,SACd,QAAS,GACT,cAAe,CAAE,MAAOC,EAAM,CAChC,EACA,MAAOE,GAAU,EACjB,OAAQ0G,EAAK,IAAI,CAACzG,EAAMe,KAAW,CACjC,KAAAf,EACA,KAAM,MACN,MAAO,MACP,YAAa,GACb,UAAW,CACT,MAAO,KAAK,UAAUA,CAAI,EAC1B,YAAayF,GACb,YAAa,CACf,EACA,KAAMe,EAAQ,IACXhB,GACCA,EAAO,OAAQ9G,GAAQA,EAAI,aAAesB,CAAI,EAAE,MACpD,EACA,SACEe,IAAU,GAAKO,EAAO,EAClB,CACE,OAAQ,GACR,OAAQ,OACR,UAAW,CACT,MAAOgE,GACP,KAAM,SACN,MAAO,CACT,EACA,MAAO,CACL,MAAOA,GACP,SAAU,eACV,UAAW,GAAGhE,EAAK,QAAQ,CAAC,CAAC,yBAC/B,EACA,KAAM,CAAC,CAAE,MAAOA,CAAK,CAAC,CACxB,EACA,MACR,EAAE,CACJ,EACA,CAAE,SAAU,EAAK,CACnB,CACF,EAEA,eAAeJ,EAAiB,CAC9B,IAAMhB,EAAQG,EAAO,SAErB,GAAI,CAACH,EACH,OAGF,IAAMW,EAAQ6F,IAASxF,EAAM,KAAK,KAAK,MAAOjD,EAAa,EACrD0I,EAAQ9F,EAAM,OAAO,CAAC+F,EAAKL,IAASK,EAAML,EAAK,MAAO,CAAC,EACvDM,EAAW3F,EAAK,OACnBxC,GAAQ8D,GAAO9D,CAAG,GAAKA,EAAI,cAAgB,IAC9C,EAAE,OAEF,KAAK,aACH,GAAGL,GAAOsI,EAAO,QAAQ,CAAC,yBAAyB1I,EAAa,WAC7DI,GAAOwI,EAAU,cAAc,CAAC,0BAErC3G,EAAM,UACJ,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,QAAS,CAAE,QAAS,OAAQ,YAAa,CAAE,KAAM,QAAS,CAAE,EAC5D,MAAO,CACL,GAAGP,GAAKkB,EAAM,IAAK0F,GAASxB,GAAUwB,EAAK,MAAM,CAAC,CAAC,EACnD,KAAM,iBACN,aAAc,SACd,QAAS,GACT,cAAe,CAAE,MAAO1G,EAAM,CAChC,EACA,MAAOE,GAAU,EACjB,OAAQ,CACN,CACE,KAAM,iBACN,KAAM,MACN,YAAa,GACb,UAAW,CAAE,MAAOkG,GAAQ,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAAE,EACvD,KAAMpF,EAAM,IAAK0F,GAASA,EAAK,KAAK,CACtC,CACF,CACF,EACA,CAAE,SAAU,EAAK,CACnB,CACF,EAEA,WAAWrF,EAAiB,CAC1B,IAAML,EAAQiG,IAAK5F,EAAM,KAAK,KAAK,MAAO,KAAK,KAAK,EAC9CtB,EAASiB,EAAM,IAAK0F,GAASxB,GAAUwB,EAAK,MAAM,CAAC,EACnDQ,EAAQ1G,EAAO,KACf2G,EAAM3G,EAAO,IAEnB0G,GAAO,UACL,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,QAAS,CAAE,QAAS,OAAQ,YAAa,CAAE,KAAM,QAAS,CAAE,EAC5D,OAAQ,CAAE,OAAQ,EAAG,KAAM,WAAY,EACvC,MAAOpH,GAAKC,CAAM,EAClB,MAAOG,GAAU,EACjB,OAAQ,CACN,CACE,KAAM,WACN,KAAM,MACN,YAAa,GACb,UAAW,CAAE,MAAOiB,GAAO,CAAC,EAAG,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAAE,EAC1D,KAAMH,EAAM,IAAK0F,GAASA,EAAK,QAAQ,CACzC,EACA,CACE,KAAM,WACN,KAAM,MACN,YAAa,GACb,UAAW,CAAE,MAAOvF,GAAO,CAAC,EAAG,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAAE,EAC1D,KAAMH,EAAM,IAAK0F,GAASA,EAAK,QAAQ,CACzC,CACF,CACF,EACA,CAAE,SAAU,EAAK,CACnB,EAEAS,GAAK,UACH,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,QAAS,CAAE,QAAS,MAAO,EAC3B,MAAO,CAAE,GAAGrH,GAAKC,CAAM,EAAG,YAAa,EAAM,EAC7C,MAAO,CAAE,GAAGG,GAAU,EAAG,IAAK,CAAE,EAChC,OAAQ,CACN,CACE,KAAM,yBACN,KAAM,OACN,WAAY,EACZ,UAAW,CAAE,MAAO,EAAG,MAAOkG,EAAO,EACrC,UAAW,CACT,MAAOA,GACP,YAAaR,GACb,YAAa,CACf,EACA,UAAW,CAAE,MAAOQ,GAAQ,QAAS,GAAK,EAC1C,KAAMpF,EAAM,IAAK0F,GAASA,EAAK,GAAG,CACpC,CACF,CACF,EACA,CAAE,SAAU,EAAK,CACnB,CACF,EAEA,iBAAiBnF,EAAqB,CACpC,IAAMlB,EAAQG,EAAO,WACf4G,EAAUC,IAAW9F,CAAQ,EAC7BV,EAAO,KAAK,MAAM,eAExB,GAAIA,aAAgB,YAAa,CAC/BA,EAAK,YAAc,GACnB,IAAM2D,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACH8C,GACE,sBACA,CAAC,QAAS,SAAU,MAAO,OAAO,EAClC,EACF,CACF,EAEA,IAAM5C,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEjB,QAAW6C,KAAaH,EAAS,CAC/B,IAAMtC,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,OAAOE,GAASuC,EAAU,KAAK,CAAC,EACnCzC,EAAG,OAAOD,GAAK,OAAO0C,EAAU,KAAK,MAAM,CAAC,CAAC,EAC7CzC,EAAG,OAAOD,GAAKvG,GAAKgE,GAAWiF,EAAU,KAAM,EAAE,CAAC,CAAC,CAAC,EACpDzC,EAAG,OAAOD,GAAKvG,GAAKgE,GAAWiF,EAAU,KAAM,EAAE,CAAC,CAAC,CAAC,EACpDzC,EAAG,OACDD,GACE0C,EAAU,KAAK,OACX,GAAGA,EAAU,KAAK,CAAC,CAAC,SAAIA,EAAU,KAAK,GAAG,EAAE,CAAC,IAC7C,QACN,CACF,EACA7C,EAAK,OAAOI,CAAE,CAChB,CAEAjE,EAAK,OAAO2D,EAAME,CAAI,CACxB,CAEA,GAAI,CAACrE,EACH,OAGF,GAAI,CAACkB,EAAS,OAAQ,CACpBnB,GAAMC,EAAO,uCAAuC,EACpD,MACF,CAEA,IAAMmH,EAAU,CAAC,GAAGJ,CAAO,EAAE,QAAQ,EAErC/G,EAAM,UACJ,CACE,MAAO,CAAE,KAAM,EAAM,EACrB,KAAM,CAAE,KAAM,EAAG,MAAO,GAAI,IAAK,GAAI,OAAQ,GAAI,aAAc,EAAK,EACpE,OAAQ,CAAE,OAAQ,CAAE,EACpB,QAAS,CACP,QAAS,OACT,UAAYgG,GACV,GAAGA,EAAO,UAAU,KAAKA,EAAO,MAAM,CAAC,CAAC,GAC5C,EACA,MAAO,CACL,GAAGnG,GAAU,mBAAmB,EAChC,aAAc,SACd,QAAS,EACX,EACA,MAAO,CACL,KAAM,WACN,KAAMsH,EAAQ,IAAKD,GAAcA,EAAU,KAAK,EAChD,UAAW,CAAE,MAAO9B,EAAI,EACxB,SAAU,CAAE,KAAM,EAAM,EACxB,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,OAAQ,CACN,CACE,KAAM,iBACN,KAAM,UACN,WAAY,EACZ,UAAW,CACT,MAAOW,GACP,QAAS,GACT,YAAaR,GACb,YAAa,CACf,EACA,KAAM4B,EAAQ,QAAQ,CAACD,EAAWrG,IAChCqG,EAAU,KAAK,IAAI,CAAChJ,EAAOkJ,IAAa,CACtClJ,EACA2C,GAAUuG,EAAW,EAAK,GAAK,GACjC,CAAC,CACH,CACF,EACA,CACE,KAAM,SACN,KAAM,UACN,OAAQ,OACR,WAAY,CAAC,EAAG,EAAE,EAClB,UAAW,CAAE,MAAOhC,EAAI,EACxB,KAAM+B,EAAQ,QAAQ,CAACD,EAAWrG,IAAU,CAC1C,IAAMwG,EAASpF,GAAWiF,EAAU,KAAM,EAAE,EAC5C,OAAOG,IAAW,KAAO,CAAC,EAAI,CAAC,CAACA,EAAQxG,CAAK,CAAC,CAChD,CAAC,CACH,CACF,CACF,EACA,CAAE,SAAU,EAAK,CACnB,CACF,EAEA,YAAYG,EAAiB,CAC3B,IAAMR,EAAO,KAAK,MAAM,WAClBgD,EAAOlC,GAAY,KAAK,KAAK,MAAO,KAAK,KAAK,EAC9CuC,EAASyD,IAAM,KAAK,KAAMtG,EAAMwC,CAAI,EACpC+D,EAAU,KAAK,KAAK,gBAS1B,GAPA,KAAK,UAAYA,EACb,yCAAyClG,GAASkG,CAAO,CAAC,iIAG1D,kIAGA,EAAE/G,aAAgB,aACpB,OAGFA,EAAK,YAAc,GACnB,IAAM2D,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACH8C,GACE,QACA,CACE,WACA,SACA,MACA,YACA,gBACA,SACF,EACA,EACF,CACF,EAEA,IAAM5C,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEZR,EAAO,QACVQ,EAAK,OAAOC,GAAS,EAAG,iCAAiC,CAAC,EAG5D,QAAWR,KAASD,EAAQ,CAC1B,IAAMY,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,mBACfA,EAAG,OAAOE,GAASb,EAAM,KAAK,CAAC,EAC/BW,EAAG,OAAOD,GAAK,OAAOV,EAAM,SAAS,MAAM,CAAC,CAAC,EAC7CW,EAAG,OAAOD,GAAKvG,GAAKgE,GAAW6B,EAAM,SAAU,EAAE,CAAC,CAAC,CAAC,EACpDW,EAAG,OAAOD,GAAKvG,GAAKgE,GAAW6B,EAAM,SAAU,EAAE,CAAC,CAAC,CAAC,EACpDW,EAAG,OAAOD,GAAK,OAAOV,EAAM,QAAQ,MAAM,CAAC,CAAC,EAC5CW,EAAG,OAAOD,GAAKvG,GAAKgE,GAAW6B,EAAM,QAAS,EAAE,CAAC,CAAC,CAAC,EACnDW,EAAG,OAAOD,GAAKvG,GAAK6F,EAAM,QAAQ,GAAG,EAAE,GAAK,IAAI,CAAC,CAAC,EAClDO,EAAK,OAAOI,CAAE,CAChB,CAEAjE,EAAK,OAAO2D,EAAME,CAAI,CACxB,EAEA,kBAAkBrD,EAAiB,CACjC,IAAMR,EAAO,KAAK,MAAM,gBAExB,GAAI,EAAEA,aAAgB,aACpB,OAGF,IAAMgH,EAAQC,IAAe,KAAK,KAAMzG,EAAM,KAAK,KAAK,EAExDR,EAAK,YAAc,GACnB,IAAM2D,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,OACH8C,GACE,aACA,CACE,kBACA,gBACA,UACA,iBACA,2BACA,iBACA,aAAa,KAAK,KAAK,KACvB,+BACA,SACF,EACA,EACF,CACF,EAEA,IAAM5C,EAAO,SAAS,cAAc,OAAO,EAC3CA,EAAK,UAAY,WAEZmD,EAAM,QACTnD,EAAK,OAAOC,GAAS,GAAI,iCAAiC,CAAC,EAG7D,QAAW9F,KAAOgJ,EAAO,CACvB,IAAM/C,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,UAAY,mBACfA,EAAG,OAAOE,GAASnG,EAAI,KAAM,KAAK,UAAUA,EAAI,IAAI,CAAC,CAAC,EACtDiG,EAAG,OACDD,GAAK,OAAOhG,EAAI,QAAQ,EAAGA,EAAI,SAAW,GAAK,eAAe,CAChE,EACAiG,EAAG,OACDD,GAAK,OAAOhG,EAAI,UAAU,EAAGA,EAAI,WAAa,GAAK,eAAe,CACpE,EACAiG,EAAG,OACDD,GAAK,OAAOhG,EAAI,OAAO,EAAGA,EAAI,QAAU,GAAK,eAAe,CAC9D,EACAiG,EAAG,OACDD,GAAK,OAAOhG,EAAI,SAAS,EAAGA,EAAI,UAAY,GAAK,eAAe,CAClE,EACAiG,EAAG,OAAOD,GAAKvG,GAAKO,EAAI,SAAS,CAAC,CAAC,EACnCiG,EAAG,OACDD,GAAK,OAAOhG,EAAI,OAAO,EAAGA,EAAI,QAAU,GAAK,eAAe,CAC9D,EACAiG,EAAG,OACDD,GAAK,OAAOhG,EAAI,QAAQ,EAAGA,EAAI,SAAW,GAAK,eAAe,CAChE,EACAiG,EAAG,OAAOD,GAAKvG,GAAKO,EAAI,WAAW,CAAC,CAAC,EACrCiG,EAAG,OACDD,GACEhG,EAAI,WAAa,GAAGA,EAAI,MAAM,OAAOA,EAAI,UAAU,GAAK,SACxDA,EAAI,WAAa,GAAK,eACxB,CACF,EACA6F,EAAK,OAAOI,CAAE,CAChB,CAEAjE,EAAK,OAAO2D,EAAME,CAAI,CACxB,CACF,CACF,ECxsCA,IAAMqD,IAAgBC,GAAE,OAAO,CAC7B,GAAIA,GAAE,OAAO,EACb,KAAMA,GAAE,OAAO,EACf,OAAQA,GAAE,OAAO,EACjB,QAASA,GAAE,OAAO,EAClB,QAASA,GAAE,OAAO,CACpB,CAAC,EAEKC,IAAaD,GAAE,OAAO,CAC1B,GAAIA,GAAE,OAAO,EACb,OAAQA,GAAE,OAAO,EACjB,QAASA,GAAE,OAAO,EAClB,OAAQA,GAAE,OAAO,EACjB,IAAKA,GAAE,OAAO,EAAE,SAAS,EACzB,YAAaA,GAAE,OAAO,EACtB,QAASA,GAAE,OAAO,CACpB,CAAC,EAEKE,IAAgBF,GAAE,OAAO,CAC7B,IAAKA,GAAE,OAAO,EACd,QAASA,GAAE,OAAO,EAClB,SAAUA,GAAE,OAAO,EACnB,QAASA,GAAE,OAAO,EAClB,WAAYA,GAAE,OAAO,EACrB,KAAMA,GAAE,OAAO,EACf,MAAOA,GAAE,OAAO,EAChB,OAAQA,GAAE,OAAO,CACnB,CAAC,EAEKG,IAAcH,GAAE,OAAO,CAC3B,MAAOA,GAAE,OAAO,EAChB,MAAOA,GAAE,KAAK,CAAC,UAAW,YAAY,CAAC,EACvC,MAAOA,GAAE,OAAO,CAClB,CAAC,EAEYI,GAAcJ,GAAE,OAAO,CAClC,MAAOA,GAAE,OAAO,EAChB,SAAUA,GAAE,MAAMD,GAAa,EAC/B,YAAaC,GAAE,MAAMC,GAAU,EAC/B,SAAUD,GAAE,OAAOA,GAAE,OAAO,EAAGE,GAAa,EAC5C,SAAUF,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC5B,SAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC5B,aAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAChC,QAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAC3B,MAAOA,GAAE,MAAMG,GAAW,EAC1B,SAAUH,GAAE,MAAMA,GAAE,OAAO,CAAC,CAC9B,CAAC,EA6BYK,GAAwC,CACnD,MAAO,aACP,aAAc,aACd,QAAS,gBACT,KAAM,iBACN,IAAK,eACL,IAAK,UACP,EAEMC,IAAQ,aAEP,SAASC,GAAQC,EAAqB,CAC3C,OAAOA,EAAI,MAAM,EAAG,CAAC,CACvB,CAEO,SAASC,GAAUC,EAAeC,EAAuB,CAE9D,IAAMC,EADQ,OAAOF,EAAM,MAAM,EAAG,CAAC,CAAC,EAAI,GAAK,OAAOA,EAAM,MAAM,EAAG,CAAC,CAAC,EAAI,EACnDC,EAClBE,EAAO,KAAK,MAAMD,EAAU,EAAE,EACpC,MAAO,GAAG,OAAOC,CAAI,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAQD,EAAU,GAAM,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,EACxF,CAEO,SAASE,GAASJ,EAAuB,CAC9C,MAAO,GAAGA,CAAK,KACjB,CAEO,SAASK,IAAQL,EAAuB,CAC7C,OAAOM,GAAUF,GAASL,GAAUC,EAAO,CAAC,CAAC,EAAG,EAAE,CACpD,CAEO,SAASO,GAAOP,EAAuB,CAC5C,OAAO,OAAOK,IAAQL,CAAK,EAAE,MAAM,EAAG,EAAE,CAAC,CAC3C,CAGA,SAASQ,IAAQR,EAAeF,EAAqB,CACnD,IAAMW,EAAM,KAAK,IAAI,OAAOX,EAAI,MAAM,EAAG,EAAE,CAAC,EAAGS,GAAOP,CAAK,CAAC,EAC5D,MAAO,GAAGA,CAAK,IAAI,OAAOS,CAAG,EAAE,SAAS,EAAG,GAAG,CAAC,EACjD,CAGA,SAASC,GAAYV,EAAeC,EAAeU,EAAS,EAAU,CACpE,MAAO,CACL,KAAMP,GAASL,GAAUC,EAAO,EAAEW,EAASV,EAAQ,EAAE,CAAC,EACtD,GAAII,IAAQN,GAAUC,EAAO,CAACW,CAAM,CAAC,CACvC,CACF,CAOO,SAASC,GACdC,EACAC,EAC4C,CAC5C,IAAMd,EAAQH,GAAQiB,CAAK,EAE3B,OAAQD,EAAQ,CACd,IAAK,QAAS,CACZ,IAAME,EAAOhB,GAAUC,EAAO,EAAE,EAChC,MAAO,CACL,QAAS,CAAE,KAAMI,GAASJ,CAAK,EAAG,GAAIc,CAAM,EAC5C,SAAU,CAAE,KAAMV,GAASW,CAAI,EAAG,GAAIP,IAAQO,EAAMD,CAAK,CAAE,CAC7D,CACF,CACA,IAAK,aACH,MAAO,CACL,QAASJ,GAAYV,EAAO,CAAC,EAC7B,SAAUU,GAAYV,EAAO,EAAG,CAAC,CACnC,EACF,IAAK,UACH,MAAO,CACL,QAASU,GAAYV,EAAO,CAAC,EAC7B,SAAUU,GAAYV,EAAO,EAAG,CAAC,CACnC,EACF,IAAK,OACH,MAAO,CACL,QAASU,GAAYV,EAAO,EAAE,EAC9B,SAAUU,GAAYV,EAAO,GAAI,EAAE,CACrC,EACF,IAAK,MAAO,CACV,IAAMG,EAAO,OAAOW,EAAM,MAAM,EAAG,CAAC,CAAC,EAC/BE,EAAW,GAAGb,EAAO,CAAC,GAAGW,EAAM,MAAM,EAAG,CAAC,CAAC,GAChD,MAAO,CACL,QAAS,CAAE,KAAM,GAAGX,CAAI,SAAU,GAAIW,CAAM,EAC5C,SAAU,CAAE,KAAM,GAAGX,EAAO,CAAC,SAAU,GAAIK,IAAQQ,EAAUF,CAAK,CAAE,CACtE,CACF,CACA,IAAK,MACH,MAAO,CAAE,QAAS,CAAE,KAAMlB,IAAO,GAAIkB,CAAM,EAAG,SAAU,IAAK,CACjE,CACF,CAEO,SAASG,GAAOnB,EAAaoB,EAAuB,CACzD,OAAOpB,GAAOoB,EAAM,MAAQpB,GAAOoB,EAAM,EAC3C,CAEA,SAASC,GAAUC,EAAaC,EAAqC,CACnE,OAAOD,EAAK,SAAS,OAAOC,CAAE,CAAC,CACjC,CAEA,SAASC,IACPF,EACAG,EACAC,EACS,CACT,IAAMC,EAAUN,GAAUC,EAAMI,EAAI,OAAO,EAE3C,OACEE,GAAOH,EAAU,SAAUH,EAAK,SAAUI,EAAI,OAAO,GACrDE,GAAOH,EAAU,SAAUH,EAAK,SAAUK,GAAS,SAAW,EAAE,GAChEC,GACEH,EAAU,aACVH,EAAK,aACLK,GAAS,YAAc,EACzB,GACAC,GAAOH,EAAU,QAASH,EAAK,QAASK,GAAS,QAAU,EAAE,CAEjE,CAGO,SAASE,IAAiBP,EAAaG,EAAiC,CAC7E,OAAOH,EAAK,SAAS,OAAQI,GAAQF,IAAQF,EAAMG,EAAWC,CAAG,CAAC,CACpE,CAEO,SAASI,IAAaR,EAAaG,EAA8B,CACtE,OAAOH,EAAK,YAAY,OAAQI,GAAQF,IAAQF,EAAMG,EAAWC,CAAG,CAAC,CACvE,CAGO,SAASK,GACdT,EACAU,EACAC,EACK,CACL,OAAOA,EAAK,OACTP,GAAQL,GAAUC,EAAMI,EAAI,OAAO,IAAIM,EAAM,KAAK,IAAMA,EAAM,KACjE,CACF,CAEO,SAASE,GAAMD,EAAoC,CACxD,OAAOA,EAAK,OAAO,CAACE,EAAKT,IAAQS,EAAMT,EAAI,OAAQ,CAAC,CACtD,CAMA,SAASU,IACPC,EACAC,EACiB,CACjB,IAAMC,EAAQ,IAAI,IAElB,QAAWb,KAAOW,EAAU,CAC1B,IAAMG,EAAOD,EAAM,IAAID,EAAIZ,CAAG,CAAC,GAG7B,CAACc,GACDd,EAAI,KAAOc,EAAK,MACfd,EAAI,OAASc,EAAK,MAAQd,EAAI,GAAKc,EAAK,KAEzCD,EAAM,IAAID,EAAIZ,CAAG,EAAGA,CAAG,CAE3B,CAEA,OAAOa,CACT,CAMO,SAASE,IAAcJ,EAA2C,CACvE,OAAOD,IAASC,EAAWX,GAAQA,EAAI,OAAO,CAChD,CAOO,SAASgB,GAAML,EAAmC,CACvD,OAAO,IAAI,IAAII,IAAcJ,CAAQ,EAAE,OAAO,CAAC,CACjD,CAGO,IAAMM,GAAa,CAAC,aAAc,MAAO,SAAS,EAOlD,SAASC,GAAStB,EAAaiB,EAAwB,CAC5D,OAAIlB,GAAUC,EAAMiB,EAAM,OAAO,GAAG,aAAe,UAC1C,UAGFA,EAAM,UAAY,aAAe,aAAe,KACzD,CAGO,SAASM,GAAcC,EAAcC,EAAsB,CAChE,IAAMC,EAAgB,CAAC,EAEvB,QAAS9C,EAAQ4C,EAAM5C,GAAS6C,EAAI7C,EAAQD,GAAUC,EAAO,CAAC,EAC5D8C,EAAI,KAAK9C,CAAK,EAGhB,OAAO8C,CACT,CAaO,SAASC,IACdZ,EACAa,EACAC,EACAC,EACAC,EACY,CACZ,OAAOH,EAAO,IAAKhD,GAAU,CAC3B,IAAM+B,EAAOI,EAAS,OAAQX,GAAQ3B,GAAQ2B,EAAI,IAAI,IAAMxB,CAAK,EAC3DoD,EAAWrB,EAAK,OAAQP,GAAQ2B,EAAK,IAAI3B,CAAG,CAAC,EAEnD,MAAO,CACL,MAAAxB,EACA,SAAU+B,EAAK,OACf,WAAYU,GAAW,IACpBY,GAASD,EAAS,OAAQ5B,GAAQ0B,EAAO1B,CAAG,IAAM6B,CAAI,EAAE,MAC3D,EACA,KAAMD,EAAS,OACf,UAAWH,EAAS,IAAKK,GACvBtB,GAAMD,EAAK,OAAQP,GAAQA,EAAI,UAAY8B,CAAO,CAAC,CACrD,EACA,MAAOtB,GAAMD,CAAI,CACnB,CACF,CAAC,CACH,CAMO,SAASwB,IACdpB,EACAnC,EACAc,EACU,CACV,IAAM0C,EACJxD,IAAUH,GAAQiB,CAAK,EAAI,OAAOA,EAAM,MAAM,EAAG,EAAE,CAAC,EAAIP,GAAOP,CAAK,EAChEyD,EAAQ,IAAI,MAAcD,CAAI,EAAE,KAAK,CAAC,EAE5C,QAAWhC,KAAOW,EAAU,CAC1B,GAAItC,GAAQ2B,EAAI,IAAI,IAAMxB,EACxB,SAGF,IAAMS,EAAM,OAAOe,EAAI,KAAK,MAAM,EAAG,EAAE,CAAC,EAEpCf,GAAO+C,IACTC,EAAMhD,EAAM,CAAC,GAAKgD,EAAMhD,EAAM,CAAC,GAAK,GAAKe,EAAI,OAEjD,CAEA,IAAIkC,EAAU,EACd,OAAOD,EAAM,IAAKE,IAChBD,GAAWC,EACJD,EACR,CACH,CAWO,SAASE,GACdzB,EACAC,EACAe,EACY,CACZ,IAAMlB,EAAMD,GAAMG,CAAQ,EACpB0B,EAAS,IAAI,IAEnB,QAAWrC,KAAOW,EAAU,CAC1B,IAAM2B,EAAO1B,EAAIZ,CAAG,EACpBqC,EAAO,IAAIC,EAAM,CAAC,GAAID,EAAO,IAAIC,CAAI,GAAK,CAAC,EAAItC,CAAG,CAAC,CACrD,CAEA,MAAO,CAAC,GAAGqC,EAAO,QAAQ,CAAC,EACxB,IAAI,CAAC,CAACC,EAAM/B,CAAI,KAAO,CACtB,KAAA+B,EACA,OAAQ9B,GAAMD,CAAI,EAClB,SAAUA,EAAK,OACf,KAAMA,EAAK,OAAQP,GAAQ2B,EAAK,IAAI3B,CAAG,CAAC,EAAE,OAC1C,MAAOS,EAAOD,GAAMD,CAAI,EAAIE,EAAO,IAAM,CAC3C,EAAE,EACD,KAAK,CAAC8B,EAAGC,IAAMA,EAAE,OAASD,EAAE,QAAUA,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC,CACvE,CAgBO,SAASC,IACd9B,EACAa,EACAG,EACa,CACb,IAAMe,EAAS/B,EAAS,OAAQX,GAAQ2B,EAAK,IAAI3B,CAAG,CAAC,EAC/C2C,EAAS,IAAI,IAEnB,QAAW3C,KAAOW,EAChBgC,EAAO,IAAI3C,EAAI,SAAU2C,EAAO,IAAI3C,EAAI,OAAO,GAAK,GAAK,CAAC,EAG5D,OAAOwB,EAAO,IAAKhD,GAAU,CAC3B,IAAMoE,EAASF,EAAO,OAAQ1C,GAAQ3B,GAAQ2B,EAAI,IAAI,IAAMxB,CAAK,EAC3DqE,EAAU,IAAI,IAAID,EAAO,IAAK5C,GAAQA,EAAI,OAAO,CAAC,EAClD8C,EAAMtC,GAAMG,EAAS,OAAQX,GAAQ6C,EAAQ,IAAI7C,EAAI,OAAO,CAAC,CAAC,EAC9Da,EAAQL,GAAMoC,CAAM,EAE1B,MAAO,CACL,MAAApE,EACA,UAAWoE,EAAO,OAClB,MAAA/B,EACA,MAAOiC,EAAMjC,EACb,MAAO+B,EAAO,OAAQ5C,IAAS2C,EAAO,IAAI3C,EAAI,OAAO,GAAK,GAAK,CAAC,EAAE,MACpE,CACF,CAAC,CACH,CAGO,SAAS+C,IAAY3B,EAAcC,EAAoB,CAC5D,OAAO,KAAK,OACT,KAAK,MAAM,GAAGA,CAAE,YAAY,EAAI,KAAK,MAAM,GAAGD,CAAI,YAAY,GAC7D,KACJ,CACF,CAGO,SAAS4B,IAAUzC,EAAc0C,EAA4B,CAClE,MAAO,CAAC,GAAG1C,CAAI,EAAE,KACf,CAACgC,EAAGC,IACFS,EAAS,QAAQV,EAAE,MAAM,EAAIU,EAAS,QAAQT,EAAE,MAAM,IACrDD,EAAE,KAAO,QAAQ,cAAcC,EAAE,KAAO,MAAM,GAC/CD,EAAE,GAAKC,EAAE,EACb,CACF,CC/YA,IAAMU,IAAmB,GAEnBC,IAAe,GAGfC,IAAkB,UAClBC,IAAiB,UAmDvB,SAASC,GAAWC,EAAuB,CACzC,MAAO,GAAGC,GAAO,OAAOD,EAAM,MAAM,EAAG,CAAC,CAAC,EAAI,CAAC,GAAK,EAAE,IAAIA,EAAM,MAAM,EAAG,CAAC,CAAC,EAC5E,CAEA,SAASE,GAAUC,EAAsB,CACvC,OAAIA,EAAM,OAASA,EAAM,GAChBC,GAASD,EAAM,EAAE,EAGtBE,GAAQF,EAAM,IAAI,IAAME,GAAQF,EAAM,EAAE,EACnC,GAAG,OAAOA,EAAM,KAAK,MAAM,EAAG,EAAE,CAAC,CAAC,SAAIC,GAASD,EAAM,EAAE,CAAC,GAG1DA,EAAM,KAAK,MAAM,EAAG,CAAC,IAAMA,EAAM,GAAG,MAAM,EAAG,CAAC,EACjD,GAAGG,GAAUH,EAAM,IAAI,CAAC,WAAMC,GAASD,EAAM,EAAE,CAAC,GAChD,GAAGC,GAASD,EAAM,IAAI,CAAC,WAAMC,GAASD,EAAM,EAAE,CAAC,EACrD,CAGA,SAASI,IACPC,EACAC,EACuD,CAEvD,GAAM,CAACC,EAASC,EAAUC,CAAK,EAAIH,EAC7BI,EAASC,GACbC,GAAMP,EAAK,OAAQQ,GAAQA,EAAI,SAAWF,CAAM,CAAC,EAEnD,MAAO,CACL,UAAWD,EAAMH,CAAO,EAAIG,EAAMF,CAAQ,EAC1C,QAASE,EAAMH,CAAO,EACtB,MAAOG,EAAMD,CAAK,CACpB,CACF,CAEA,SAASK,IAAOC,EAAeC,EAAaC,EAAO,GAAGD,CAAG,IAAa,CACpE,MAAO,GAAGD,CAAK,IAAIA,IAAU,EAAIC,EAAMC,CAAI,EAC7C,CAGA,SAASC,IAAQC,EAAaC,EAAuB,CACnD,OAAOD,EAAI,MAAM,EAAG,CAAC,IAAMC,EAAM,MAAM,EAAG,CAAC,EAAIjB,GAAUgB,CAAG,EAAIlB,GAASkB,CAAG,CAC9E,CAEA,SAASE,IAAOC,EAAuB,CACrC,MAAO,GAAGA,EAAQ,EAAI,SAAM,GAAG,GAAGC,GAAM,KAAK,IAAID,CAAK,CAAC,CAAC,EAC1D,CAEA,SAASE,GAAQC,EAAcC,EAAuB,CACpD,OAAOA,EAAQ,GAAG,KAAK,MAAOD,EAAOC,EAAS,GAAG,CAAC,IAAM,QAC1D,CAEA,SAASC,IAAWC,EAAuB,CACzC,OAAOA,GAAS,IAAU,OAAI,KAAK,MAAMA,EAAQ,GAAO,CAAC,IAAML,GAAMK,CAAK,CAC5E,CAGA,SAASC,IACPC,EACAC,EACAC,EACAC,EACA,CACA,GAAI,CAACH,EACH,OAIF,IAAMI,EAASF,EAAO,OAAS,EAE/BF,EAAM,UACJ,CACE,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQI,EAAS,GAAK,EAAG,EAC/D,QAAS,CACP,QAAS,OACT,YAAa,CAAE,KAAM,QAAS,EAC9B,eAAiBN,GAAkBK,EAAOL,CAAK,CACjD,EACA,OAAQM,EAAS,CAAE,OAAQ,EAAG,KAAM,WAAY,EAAI,OACpD,MAAO,CACL,KAAM,WACN,KAAMH,EACN,UAAW,CAAE,MAAOI,EAAM,EAC1B,SAAU,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,EACvC,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,MAAO,CACL,KAAM,QACN,YAAa,EACb,UAAW,CACT,MAAOD,GACP,UAAWF,IAAWV,GAAQI,IAAaM,CAC7C,EACA,UAAW,CAAE,UAAW,CAAE,MAAOG,EAAK,CAAE,CAC1C,EACA,OAAQJ,EAAO,IAAKK,IAAU,CAC5B,KAAMA,EAAK,KACX,KAAM,MACN,MAAO,QACP,YAAa,GACb,UAAW,CACT,MAAOA,EAAK,OAEZ,YAAaC,GACb,YAAa,CACf,EACA,KAAMD,EAAK,IACb,EAAE,CACJ,EACA,CAAE,aAAc,CAAC,SAAU,QAAQ,CAAE,CACvC,CACF,CAEA,SAASE,GACPC,EACAC,EAAM,GACNC,EAAY,GACU,CACtB,IAAMC,EAAK,SAAS,cAAc,IAAI,EAItC,GAHAA,EAAG,UAAY,iBAAiBD,CAAS,GAAG,KAAK,EACjDC,EAAG,YAAcH,EAEbC,EAAK,CACP,IAAMG,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,wBACnBA,EAAO,YAAcH,EACrBE,EAAG,OAAOC,CAAM,CAClB,CAEA,OAAOD,CACT,CAEA,SAASE,IAAaC,EAAwD,CAC5E,IAAMH,EAAK,SAAS,cAAc,IAAI,EAGtC,GAFAA,EAAG,UAAY,yBAEX,CAACG,EACH,OAAAH,EAAG,YAAc,SACVA,EAGT,IAAMI,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOD,EAAQ,IACpBC,EAAK,UAAY,4CACjBA,EAAK,YAAcD,EAAQ,QAE3B,IAAML,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,UAAY,wBAChBA,EAAI,YAAc,CAACK,EAAQ,SAAUA,EAAQ,OAAO,EAAE,KAAK,QAAK,EAEhEH,EAAG,OAAOI,EAAMN,CAAG,EACZE,CACT,CAEA,IAAOK,IAAQ,IAA8B,CAC3C,IAAMC,EAAiD,CACrD,aAAc,KACd,QAAS,KACT,KAAM,KACN,MAAO,IACT,EAEA,MAAO,CACL,KAAMC,GAAY,MAAM,CACtB,MAAO,aACP,SAAU,CAAC,EACX,YAAa,CAAC,EACd,SAAU,CAAC,EACX,SAAU,CAAC,EACX,SAAU,CAAC,EACX,aAAc,CAAC,EACf,QAAS,CAAC,EACV,MAAO,CAAC,EACR,SAAU,CAAC,CACb,CAAC,EACD,OAAQ,QACR,SAAU,CAAC,EACX,SAAU,CAAC,EACX,aAAc,CAAC,EACf,QAAS,CAAC,EACV,MAAO,CAAC,EACR,YAAaC,GAAc,MAC3B,WAAY,GACZ,MAAO,SACP,WAAY,GACZ,KAAM,EACN,SAAU,GACV,aAAc,EACd,YAAa,GACb,KAAM,SACN,SAAU,GAEV,MAAO,CACL,GAAI,EAAE,KAAK,eAAe,aACxB,OAGF,IAAMC,EAAM,KAAK,IAAI,QAAQ,UAE7B,GAAI,CAACA,EACH,OAGF,IAAMC,EAASH,GAAY,UAAU,KAAK,MAAME,CAAG,CAAC,EAEpD,GAAKC,EAAO,QAIZ,MAAK,KAAOA,EAAO,KACnB,KAAK,SAAW,CAAC,GAAG,KAAK,KAAK,QAAQ,EACtC,KAAK,SAAW,CAAC,GAAG,KAAK,KAAK,QAAQ,EACtC,KAAK,aAAe,CAAC,GAAG,KAAK,KAAK,YAAY,EAC9C,KAAK,QAAU,CAAC,GAAG,KAAK,KAAK,OAAO,EAEpC,QAAWC,KAAO,OAAO,KAAKL,CAAM,EAAG,CACrC,IAAMM,EAAO,KAAK,MAAMD,CAAG,EAEvBC,aAAgB,cAClBN,EAAOK,CAAG,EAAYE,GAAKD,CAAI,EAEnC,CAEA,OAAO,iBAAiB,SAAU,IAAM,CACtC,QAAWzB,KAAS,OAAO,OAAOmB,CAAM,EACtCnB,GAAO,OAAO,CAElB,CAAC,EAED,KAAK,OAAO,EACd,EAEA,WAAuB,CACrB,MAAO,CACL,SAAU,IAAI,IAAI,KAAK,QAAQ,EAC/B,SAAU,IAAI,IAAI,KAAK,QAAQ,EAC/B,aAAc,IAAI,IAAI,KAAK,YAAY,EACvC,QAAS,IAAI,IAAI,KAAK,OAAO,CAC/B,CACF,EAEA,WAAW2B,EAAgB,CACzB,KAAK,OAASA,EACd,KAAK,OAAO,CACd,EAEA,WAAWC,EAAYC,EAAc,CACnC,KAAKD,CAAI,EAAIE,GAAO,KAAKF,CAAI,EAAG,KAAK,KAAKA,CAAI,EAAGC,CAAI,EACrD,KAAK,OAAO,CACd,EAEA,WAAWD,EAAY,CACrB,KAAKA,CAAI,EAAI,CAAC,GAAG,KAAK,KAAKA,CAAI,CAAC,EAChC,KAAK,OAAO,CACd,EAEA,OAAOA,EAAYC,EAAuB,CACxC,OAAO,KAAKD,CAAI,EAAE,SAASC,CAAI,CACjC,EAEA,WAAWD,EAAqB,CAC9B,OAAO,KAAKA,CAAI,EAAE,SAAW,KAAK,KAAKA,CAAI,EAAE,MAC/C,EAEA,UAAUC,EAAsB,CAC9B,IAAME,EAAQ,KAAK,KAAK,SAAS,QAAQF,CAAI,EAC7C,OAAOE,GAAS,EAAKC,GAAOD,EAAQC,GAAO,MAAM,GAAKC,GAASA,EACjE,EAMA,WAAWC,EAAsB,CAC/B,GAAIA,IAAS,UACX,OAAO,KAAK,UAAUA,IAAS,MAAQ,UAAYA,CAAI,EAGzD,IAAMC,EAAQ,CAAC,KAAK,UAAU,YAAY,EAAG,KAAK,UAAU,SAAS,CAAC,EACtE,OAAOH,GAAO,KAAMI,GAAW,CAACD,EAAM,SAASC,CAAM,CAAC,GAAKH,EAC7D,EAGA,OAAOI,EAA+B,CACpC,IAAMC,EAAUlE,GAAQ,KAAK,KAAK,KAAK,EACjCmE,EAAWF,EAAS,CAAC,GAAG,KAE9B,OAAO,KAAK,SAAW,OAASE,EAC5BC,GAAcpE,GAAQmE,CAAQ,EAAGD,CAAO,EACxCE,GAAcC,GAAUH,EAAS,EAAE3E,IAAe,EAAE,EAAG2E,CAAO,CACpE,EAEA,QAAS,CACP,IAAMI,EAAY,KAAK,UAAU,EAC3BL,EAAWM,IAAiB,KAAK,KAAMD,CAAS,EAChDnE,EAAOqE,IAAa,KAAK,KAAMF,CAAS,EAE9C,KAAK,YAAYL,EAAU9D,CAAI,EAC/B,KAAK,YAAY8D,EAAU9D,CAAI,EAC/B,KAAK,aAAa8D,CAAQ,EAC1B,KAAK,WAAWA,CAAQ,EACxB,KAAK,cAAcA,CAAQ,EAC3B,KAAK,kBAAkB9D,CAAI,EAC3B,KAAK,cAAc8D,CAAQ,EAC3B,KAAK,aAAaA,CAAQ,CAC5B,EAEA,YAAYA,EAAqB9D,EAAc,CAC7C,IAAMe,EAAQ,KAAK,KAAK,MAClB,CAAE,QAAAgD,EAAS,SAAAO,CAAS,EAAIC,GAAY,KAAK,OAAQxD,CAAK,EACtDiD,EAAW,KAAK,KAAK,SAAS,CAAC,GAAG,MAAQjD,EAC1C6C,EAAQE,EAAS,OAAQtD,GAAQgE,GAAOhE,EAAI,KAAMuD,CAAO,CAAC,EAC1DU,EAASlE,GAAMqD,CAAK,EAS1B,GAPA,KAAK,YAAcd,GAAc,KAAK,MAAM,EAC5C,KAAK,WAAapD,GAAU,CAC1B,KAAMqE,EAAQ,KAAOC,EAAWA,EAAWD,EAAQ,KACnD,GAAIA,EAAQ,EACd,CAAC,EACD,KAAK,MAAQ7C,GAAMuD,CAAM,EAErBH,EAAU,CACZ,IAAMI,EAASnE,GACbuD,EAAS,OAAQtD,GAAQgE,GAAOhE,EAAI,KAAM8D,CAAQ,CAAC,CACrD,EACMK,EAASD,EACX,KAAKD,GAAUC,EAAS,IAAM,QAAG,GAAGvD,GAAQ,KAAK,IAAIsD,EAASC,CAAM,EAAGA,CAAM,CAAC,IAC9E,GAEJ,KAAK,WAAa,GAAG1D,IAAOyD,EAASC,CAAM,CAAC,GAAGC,CAAM,OAAOjF,GAAU4E,CAAQ,CAAC,KAAKpD,GAAMwD,CAAM,CAAC,GACnG,MACE,KAAK,WAAa,SAAS9E,GAASoE,CAAQ,CAAC,GAG/C,GAAI,KAAK,SAAW,QAAS,CAC3B,IAAMY,EAAOV,GAAUrE,GAAQkB,CAAK,EAAG,EAAE,EACnCM,EAAQd,GACZuD,EAAS,OAAQtD,GAAQX,GAAQW,EAAI,IAAI,IAAMoE,CAAI,CACrD,EACA,KAAK,YAAc,SAAMrF,GAAWqF,CAAI,CAAC,YAAY1D,GAAMG,CAAK,CAAC,EACnE,CAEA,IAAMwD,EAAOC,GAAM,KAAK,KAAK,QAAQ,EAC/BC,EAAUnB,EAAM,OAAQpD,GAAQqE,EAAK,IAAIrE,CAAG,CAAC,EAC7CwE,EAASC,GAAW,IAAKtB,IAAU,CACvC,KAAAA,EACA,MAAOoB,EAAQ,OAAQvE,GAAQ0E,GAAS,KAAK,KAAM1E,CAAG,IAAMmD,CAAI,EAC7D,MACL,EAAE,EACC,OAAQ3B,GAASA,EAAK,KAAK,EAC3B,IAAKA,GAAS,GAAGA,EAAK,KAAK,IAAIA,EAAK,IAAI,EAAE,EAK7C,GAHA,KAAK,KAAO+C,EAAQ,OACpB,KAAK,SAAWC,EAAO,KAAK,QAAK,GAAK,yBAElCV,EAAU,CACZ,IAAMI,EAASZ,EAAS,OACrBtD,GAAQqE,EAAK,IAAIrE,CAAG,GAAKgE,GAAOhE,EAAI,KAAM8D,CAAQ,CACrD,EAAE,OACIK,EAASI,EAAQ,OAASL,EAChC,KAAK,UAAY,SAAMC,EAAS,EAAI,SAAM,GAAG,GAAG,KAAK,IAAIA,CAAM,CAAC,OAAOjF,GAAU4E,CAAQ,CAAC,KAAKI,CAAM,GACvG,CAEA,KAAK,aAAed,EAAM,OAC1B,KAAK,YAAcA,EAAM,OACrB,GAAGA,EAAM,OAASmB,EAAQ,MAAM,yCAAsC7D,GAAMuD,EAASb,EAAM,MAAM,CAAC,GAClG,qBAEJ,IAAMuB,EAAQpF,IAAYC,EAAM,KAAK,KAAK,QAAQ,EAClD,KAAK,KAAOkB,GAAMiE,EAAM,SAAS,EACjC,KAAK,SAAW,GAAGjE,GAAMiE,EAAM,OAAO,CAAC,iBAAcjE,GAAMiE,EAAM,KAAK,CAAC,yBACzE,EAEA,YAAYrB,EAAqB9D,EAAc,CAC7C,GAAM,CAAE,QAAA+D,CAAQ,EAAIQ,GAAY,KAAK,OAAQ,KAAK,KAAK,KAAK,EACtDM,EAAOC,GAAM,KAAK,KAAK,QAAQ,EAC/BM,EAAUtB,EAAS,OACtBtD,GAAQqE,EAAK,IAAIrE,CAAG,GAAKgE,GAAOhE,EAAI,KAAMuD,CAAO,CACpD,EAAE,OAEF,KAAK,MAAQ,KAAK,KAAK,MAAM,IAAKsB,GAAU,CAE1C,IAAMzB,EADO0B,GAAQ,KAAK,KAAMD,EAAOvB,CAAQ,EAC5B,OAAQtD,GAAQgE,GAAOhE,EAAI,KAAMuD,CAAO,CAAC,EACtDgB,EAAUnB,EAAM,OAAQpD,GAAQqE,EAAK,IAAIrE,CAAG,CAAC,EAAE,OAC/C2E,EAAQpF,IACZuF,GAAQ,KAAK,KAAMD,EAAOrF,CAAI,EAC9B,KAAK,KAAK,QACZ,EAEA,MAAO,CACL,MAAOqF,EAAM,MACb,KAAMN,EACN,SAAU,GAAG5D,GAAQ4D,EAASK,CAAO,CAAC,sBAAmBlE,GAAMX,GAAMqD,CAAK,CAAC,CAAC,SAC5E,KAAM1C,GAAMiE,EAAM,SAAS,EAC3B,SAAU,GAAGjE,GAAMiE,EAAM,OAAO,CAAC,iBAAcjE,GAAMiE,EAAM,KAAK,CAAC,oBACnE,CACF,CAAC,CACH,EAEA,aAAarB,EAAqB,CAChC,IAAMyB,EAAS,KAAK,OAAOzB,CAAQ,EAC7B0B,EAAOC,IACX3B,EACAyB,EACA,KAAK,KAAK,SACTG,GAAUR,GAAS,KAAK,KAAMQ,CAAK,EACpCZ,GAAM,KAAK,KAAK,QAAQ,CAC1B,EACMa,EAAQV,GAAW,OAAO,CAACW,EAAOpC,IACtCgC,EAAK,KAAMhG,IAAWA,EAAM,WAAWgE,CAAK,GAAK,GAAK,CAAC,CACzD,EACMqC,EAAclC,GAAiBsB,GAAW,QAAQtB,CAAI,EACtDmC,EAAW,KAAK,KAAK,SAAS,OAAO,CAACC,EAAOvC,IACjDgC,EAAK,KAAMhG,IAAWA,EAAM,UAAUgE,CAAK,GAAK,GAAK,CAAC,CACxD,EACMwC,EAAU1C,GAAiB,KAAK,KAAK,SAAS,QAAQA,CAAI,EAC1DS,EAAUlE,GAAQ,KAAK,KAAK,KAAK,EAEjC6B,EAAS6D,EAAO,IAAK/F,GACzBA,IAAUuE,EACN,GAAGxE,GAAWC,CAAK,CAAC,aACpBD,GAAWC,CAAK,CACtB,EACAgC,IACEoB,EAAO,aACPlB,EACAiE,EAAM,IAAKhC,IAAU,CACnB,KAAMA,EACN,OAAQ,KAAK,WAAWA,CAAI,EAC5B,KAAM6B,EAAK,IAAKhG,GAAUA,EAAM,WAAWqG,EAAWlC,CAAI,CAAC,GAAK,CAAC,CACnE,EAAE,EACF,MACF,EACAnC,IACEoB,EAAO,QACPlB,EACAoE,EAAS,IAAKxC,IAAU,CACtB,KAAAA,EACA,OAAQ,KAAK,UAAUA,CAAI,EAC3B,KAAMkC,EAAK,IAAKhG,GAAUA,EAAM,UAAUwG,EAAO1C,CAAI,CAAC,GAAK,CAAC,CAC9D,EAAE,EACFpC,EACF,EAEA,IAAM+E,EAASC,GACbV,EAAK,OAAO,CAACW,EAAK3G,IAAU2G,EAAMD,EAAK1G,CAAK,EAAG,CAAC,EAElD4G,GACE,KAAK,MAAM,WACX,CACE,CAAC,QAAS,MAAM,EAChB,GAAGT,EAAM,IAAKhC,GAA4B,CAACA,EAAM,OAAO,CAAC,EACzD,CAAC,QAAS,OAAO,EACjB,CAAC,WAAY,OAAO,EACpB,GAAGmC,EAAS,IAAKxC,GAA4B,CAAC,GAAGA,CAAI,QAAM,OAAO,CAAC,EACnE,CAAC,QAAS,OAAO,CACnB,EACAkC,EACG,IAAI,CAAChG,EAAOgE,IACXhD,GACE6F,GAAS3E,EAAO8B,CAAK,GAAKhE,EAAM,KAAK,EACrC,GAAGmG,EAAM,IAAKhC,GACZ2C,GAAK,OAAO9G,EAAM,WAAWqG,EAAWlC,CAAI,CAAC,GAAK,CAAC,CAAC,CACtD,EACA2C,GAAK,OAAO9G,EAAM,IAAI,EAAG,eAAe,EACxC8G,GAAK,OAAO9G,EAAM,QAAQ,CAAC,EAC3B,GAAGsG,EAAS,IAAKxC,GACfgD,GAAKpF,GAAM1B,EAAM,UAAUwG,EAAO1C,CAAI,CAAC,GAAK,CAAC,CAAC,CAChD,EACAgD,GAAKpF,GAAM1B,EAAM,KAAK,EAAG,eAAe,CAC1C,CACF,EACC,QAAQ,EACX,kCACA+G,GACEF,GAAS,OAAO,EAChB,GAAGV,EAAM,IAAKhC,GACZ2C,GACE,OAAOL,EAAOzG,GAAUA,EAAM,WAAWqG,EAAWlC,CAAI,CAAC,GAAK,CAAC,CAAC,CAClE,CACF,EACA2C,GAAK,OAAOL,EAAOzG,GAAUA,EAAM,IAAI,CAAC,CAAC,EACzC8G,GAAK,OAAOL,EAAOzG,GAAUA,EAAM,QAAQ,CAAC,CAAC,EAC7C,GAAGsG,EAAS,IAAKxC,GACfgD,GAAKpF,GAAM+E,EAAOzG,GAAUA,EAAM,UAAUwG,EAAO1C,CAAI,CAAC,GAAK,CAAC,CAAC,CAAC,CAClE,EACAgD,GAAKpF,GAAM+E,EAAOzG,GAAUA,EAAM,KAAK,CAAC,CAAC,CAC3C,CACF,CACF,EAEA,WAAWsE,EAAqB,CAC9B,IAAMrC,EAAQmB,EAAO,KAErB,GAAI,CAACnB,EACH,OAGF,IAAMV,EAAQ,KAAK,KAAK,MAClBvB,EAAQK,GAAQkB,CAAK,EACrByF,EAAQ,CACZ,CAAE,MAAAhH,EAAO,OAAQiH,GAAQ,MAAO,CAAE,EAClC,CAAE,MAAOvC,GAAU1E,EAAO,EAAE,EAAG,OAAQH,IAAiB,MAAO,CAAE,EACjE,CAAE,MAAO6E,GAAU1E,EAAO,GAAG,EAAG,OAAQF,IAAgB,MAAO,CAAE,CACnE,EACMoH,EAAO,KAAK,IAAI,GAAGF,EAAM,IAAKG,GAASC,GAAOD,EAAK,KAAK,CAAC,CAAC,EAEhElF,EAAM,UACJ,CACE,KAAM,CAAE,KAAM,GAAI,MAAO,GAAI,IAAK,GAAI,OAAQ,EAAG,EACjD,QAAS,CACP,QAAS,OACT,eAAiBF,GAAkBL,GAAMK,CAAK,CAChD,EACA,OAAQ,CAAE,OAAQ,EAAG,KAAM,WAAY,EACvC,MAAO,CACL,KAAM,WACN,KAAM,MAAM,KAAK,CAAE,OAAQmF,CAAK,EAAG,CAACG,EAAQrD,IAC1C,OAAOA,EAAQ,CAAC,CAClB,EACA,KAAM,mBACN,aAAc,SACd,QAAS,GACT,cAAe,CAAE,MAAO1B,EAAM,EAC9B,UAAW,CAAE,MAAOA,EAAM,EAC1B,SAAU,CAAE,UAAW,CAAE,MAAOC,EAAK,CAAE,EACvC,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,MAAO,CACL,KAAM,QACN,UAAW,CAAE,MAAOD,GAAO,UAAWR,GAAW,EACjD,UAAW,CAAE,UAAW,CAAE,MAAOS,EAAK,CAAE,CAC1C,EACA,OAAQyE,EAAM,IAAKG,IAAU,CAC3B,KAAMpH,GAAWoH,EAAK,KAAK,EAC3B,KAAM,OACN,KAAM,MACN,OAAQ,OACR,UAAW,CAAE,MAAOA,EAAK,MAAO,EAChC,UAAW,CAAE,MAAOA,EAAK,OAAQ,MAAOA,EAAK,KAAM,EACnD,KAAMG,IAAahD,EAAU6C,EAAK,MAAO5F,CAAK,CAChD,EAAE,CACJ,EACA,CAAE,aAAc,CAAC,QAAQ,CAAE,CAC7B,CACF,EAEA,cAAc+C,EAAqB,CACjC,GAAM,CAAE,QAAAC,CAAQ,EAAIQ,GAAY,KAAK,OAAQ,KAAK,KAAK,KAAK,EACtDX,EAAQE,EAAS,OAAQtD,GAAQgE,GAAOhE,EAAI,KAAMuD,CAAO,CAAC,EAC1Dc,EAAOC,GAAM,KAAK,KAAK,QAAQ,EAC/BiC,EAAW,KAAK,KAAK,SACrBC,EAASxG,GAAiBuG,EAAS,OAAOvG,EAAI,OAAO,CAAC,EAEtDyG,EAAQ,CACZC,EACAC,EACA3B,EACA3B,IAEAuC,GACE,KAAK,MAAMc,CAAG,EACd,CACE,CAACC,EAAS,MAAM,EAChB,CAAC,QAAS,OAAO,EACjB,CAAC,WAAY,OAAO,EACpB,CAAC,QAAS,OAAO,EACjB,CAAC,QAAS,OAAO,CACnB,EACA3B,EAAK,IAAK4B,GACR5G,GACE6F,GAASe,EAAM,KAAMvD,EAASA,EAAOuD,EAAM,IAAI,EAAI,MAAS,EAC5Dd,GAAK,OAAOc,EAAM,IAAI,CAAC,EACvBd,GAAK,OAAOc,EAAM,QAAQ,CAAC,EAC3Bd,GAAKpF,GAAMkG,EAAM,MAAM,CAAC,EACxBd,GAAK,GAAG,KAAK,MAAMc,EAAM,KAAK,CAAC,GAAG,CACpC,CACF,EACA,kCACF,EAEFH,EACE,eACA,UACAI,GAAUzD,EAAQpD,GAAQA,EAAI,QAASqE,CAAI,EAC1CvB,GAAS,KAAK,UAAUA,CAAI,CAC/B,EACA2D,EACE,eACA,UACAI,GAAUzD,EAAQpD,GAAQwG,EAAMxG,CAAG,GAAG,SAAW,SAAKqE,CAAI,EAC1D,IACF,EACAoC,EACE,kBACA,aACAI,GAAUzD,EAAQpD,GAAQwG,EAAMxG,CAAG,GAAG,YAAc,SAAKqE,CAAI,EAAE,KAC7D,CAACyC,EAAGC,IACF,KAAK,KAAK,aAAa,QAAQD,EAAE,IAAI,EACrC,KAAK,KAAK,aAAa,QAAQC,EAAE,IAAI,CACzC,EACA,IACF,EACAN,EACE,cACA,SACAI,GAAUzD,EAAQpD,GAAQwG,EAAMxG,CAAG,GAAG,QAAU,SAAKqE,CAAI,EACzD,IACF,EAEA,IAAMpD,EAAQmB,EAAO,MAErB,GAAI,CAACnB,EACH,OAGF,IAAM+F,EAAQH,GAAUzD,EAAQpD,GAAQwG,EAAMxG,CAAG,GAAG,OAAS,SAAKqE,CAAI,EACnE,MAAM,EAAG1F,GAAgB,EACzB,QAAQ,EAEXsC,EAAM,UACJ,CACE,KAAM,CAAE,KAAM,EAAG,MAAO,GAAI,IAAK,EAAG,OAAQ,EAAG,aAAc,EAAK,EAClE,QAAS,CACP,QAAS,OACT,UAAYgG,GAAkC,CAC5C,IAAMC,EAAOF,EAAMC,EAAO,SAAS,EACnC,OAAOC,EACH,GAAGA,EAAK,IAAI,QAAQxG,GAAMwG,EAAK,MAAM,CAAC,SAAMjH,IAAOiH,EAAK,KAAM,MAAM,CAAC,GACrE,EACN,CACF,EACA,MAAO,CAAE,KAAM,QAAS,KAAM,EAAM,EACpC,MAAO,CACL,KAAM,WACN,KAAMF,EAAM,IAAKE,GAASA,EAAK,IAAI,EACnC,UAAW,CAAE,MAAOC,EAAI,EACxB,SAAU,CAAE,KAAM,EAAM,EACxB,SAAU,CAAE,KAAM,EAAM,CAC1B,EACA,OAAQ,CACN,CACE,KAAM,MACN,YAAa,GACb,UAAW,CAAE,MAAOlB,GAAQ,aAAc,CAAC,EAAG,EAAG,EAAG,CAAC,CAAE,EACvD,MAAO,CACL,KAAM,GACN,SAAU,QACV,MAAOkB,GACP,UAAYF,GAA8BvG,GAAMuG,EAAO,KAAK,CAC9D,EACA,KAAMD,EAAM,IAAKE,GAASA,EAAK,MAAM,CACvC,CACF,CACF,EACA,CAAE,aAAc,CAAC,QAAQ,CAAE,CAC7B,CACF,EAEA,kBAAkB1H,EAAc,CAC9B,IAAMe,EAAQ,KAAK,KAAK,MAClB,CAACb,CAAO,EAAI,KAAK,KAAK,SACtBsF,EAAOoC,IAAU5H,EAAM,KAAK,KAAK,QAAQ,EAE/CoG,GACE,KAAK,MAAM,iBACX,CACE,CAAC,WAAY,MAAM,EACnB,CAAC,aAAc,MAAM,EACrB,CAAC,SAAU,MAAM,EACjB,CAAC,MAAO,OAAO,EACf,CAAC,SAAU,OAAO,CACpB,EACAZ,EAAK,IAAKqC,GAAe,CACvB,IAAMC,EACJD,EAAW,SAAW3H,GAAW2H,EAAW,IACxC,GAAGE,IAAYF,EAAW,IAAK9G,CAAK,CAAC,SACrC,GAEN,OAAOP,GACLgC,IAAa,KAAK,KAAK,SAAS,OAAOqF,EAAW,OAAO,CAAC,CAAC,EAC3D3F,GACE2F,EAAW,aAAeA,EAAW,QACrCA,EAAW,YAAcA,EAAW,QAAU,EAChD,EACA3F,GACE2F,EAAW,OACX,GACAA,EAAW,SAAW3H,EAAU,eAAiB,EACnD,EACAoG,GACEuB,EAAW,IACP,CAAChH,IAAQgH,EAAW,IAAK9G,CAAK,EAAG+G,CAAI,EAClC,OAAO,OAAO,EACd,KAAK,QAAK,EACb,SACJ,mBACF,EACAxB,GAAKpF,GAAM2G,EAAW,MAAM,CAAC,CAC/B,CACF,CAAC,EACD,kCACAtB,GACEF,GAAS,OAAO,EAChBnE,GAAS,EAAE,EACXA,GAAS,EAAE,EACXoE,GAAK,EAAE,EACPA,GAAKpF,GAAMX,GAAMiF,CAAI,CAAC,CAAC,CACzB,CACF,CACF,EAEA,cAAc1B,EAAqB,CACjC,IAAM0B,EAAOwC,IACXlE,EACA,KAAK,OAAOA,CAAQ,EACpBgB,GAAM,KAAK,KAAK,QAAQ,CAC1B,EAAE,QAAQ,EACJmB,EAASC,GACbV,EAAK,OAAO,CAACW,EAAK8B,IAAW9B,EAAMD,EAAK+B,CAAM,EAAG,CAAC,EAC9CC,EAAYjC,EAAOgC,GAAWA,EAAO,SAAS,EAC9CE,EAAQlC,EAAOgC,GAAWA,EAAO,KAAK,EAE5C7B,GACE,KAAK,MAAM,YACX,CACE,CAAC,aAAc,MAAM,EACrB,CAAC,YAAa,OAAO,EACrB,CAAC,iBAAkB,OAAO,EAC1B,CAAC,aAAc,OAAO,EACtB,CAAC,QAAS,OAAO,EACjB,CAAC,aAAc,OAAO,EACtB,CAAC,eAAgB,OAAO,CAC1B,EACAZ,EACG,OAAQyC,GAAWA,EAAO,UAAY,CAAC,EACvC,IAAKA,GACJzH,GACE6F,GAAS9G,GAAW0I,EAAO,KAAK,CAAC,EACjC3B,GAAK,OAAO2B,EAAO,SAAS,CAAC,EAC7B3B,GAAKpF,GAAM+G,EAAO,KAAK,CAAC,EACxB3B,GAAKpF,GAAM+G,EAAO,KAAK,CAAC,EACxB3B,GAAKpF,GAAM+G,EAAO,MAAQA,EAAO,KAAK,EAAG,eAAe,EACxD3B,GACE,GAAG2B,EAAO,KAAK,KAAK9G,GAAQ8G,EAAO,MAAOA,EAAO,SAAS,CAAC,GAC7D,EACA3B,GAAKpF,IAAO+G,EAAO,MAAQA,EAAO,OAASA,EAAO,SAAS,CAAC,CAC9D,CACF,EACF,uCACA1B,GACEF,GAAS,OAAO,EAChBC,GAAK,OAAO4B,CAAS,CAAC,EACtB5B,GAAKpF,GAAM+E,EAAOgC,GAAWA,EAAO,KAAK,CAAC,CAAC,EAC3C3B,GAAKpF,GAAM+E,EAAOgC,GAAWA,EAAO,KAAK,CAAC,CAAC,EAC3C3B,GAAKpF,GAAM+E,EAAOgC,GAAWA,EAAO,MAAQA,EAAO,KAAK,CAAC,CAAC,EAC1D3B,GAAK,GAAG6B,CAAK,KAAKhH,GAAQgH,EAAOD,CAAS,CAAC,GAAG,EAC9C5B,GACE4B,EACIhH,GACE+E,EAAOgC,GAAWA,EAAO,MAAQA,EAAO,KAAK,EAAIC,CACnD,EACA,QACN,CACF,CACF,CACF,EAEA,aAAapE,EAAqB,CAChC,GAAM,CAAE,QAAAC,CAAQ,EAAIQ,GAAY,KAAK,OAAQ,KAAK,KAAK,KAAK,EACtDiB,EAAO1B,EACV,OAAQtD,GAAQgE,GAAOhE,EAAI,KAAMuD,CAAO,CAAC,EACzC,KAAK,CAACuD,EAAGC,IAAMA,EAAE,KAAK,cAAcD,EAAE,IAAI,GAAKC,EAAE,GAAKD,EAAE,EAAE,EACvDzC,EAAOC,GAAM,KAAK,KAAK,QAAQ,EAErCsB,GACE,KAAK,MAAM,YACX,CACE,CAAC,OAAQ,MAAM,EACf,CAAC,WAAY,MAAM,EACnB,CAAC,UAAW,MAAM,EAClB,CAAC,OAAQ,MAAM,EACf,CAAC,GAAI,MAAM,EACX,CAAC,SAAU,OAAO,CACpB,EACAZ,EAAK,IAAK4C,GAAY,CACpB,IAAM3F,EAAU,KAAK,KAAK,SAAS,OAAO2F,EAAQ,OAAO,CAAC,EAE1D,OAAO5H,GACL6F,GAASvG,GAAUsI,EAAQ,IAAI,CAAC,EAChC5F,IAAaC,CAAO,EACpB4D,GAAS+B,EAAQ,QAAS,KAAK,UAAUA,EAAQ,OAAO,CAAC,EACzDlG,GAASO,GAAS,OAAS,SAAKA,GAAS,QAAU,EAAE,EACrDP,GACE2C,EAAK,IAAIuD,CAAO,EAAI,aAAUlD,GAAS,KAAK,KAAMkD,CAAO,CAAC,GAAK,GAC/D,GACA,yCACF,EACA9B,GAAKpF,GAAMkH,EAAQ,MAAM,CAAC,CAC5B,CACF,CAAC,EACD,kCACF,CACF,CACF,CACF,ECl5BA,IAAMC,IAAWC,EAAE,OAAO,CACxB,MAAOA,EAAE,OAAO,EAChB,OAAQA,EAAE,OAAO,CACnB,CAAC,EAIMC,IAAQ,KACN,CACL,KAAM,KACN,MAAe,CACb,OAAI,KAAK,OAAS,KACT,GAGF,IAAI,KAAK,eAAe,QAAS,CACtC,SAAUC,GACV,QAAS,OACT,KAAM,UACN,MAAO,OACP,IAAK,SACP,CAAC,EAAE,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,CACrC,EACA,QAAiB,CACf,OAAI,KAAK,OAAS,KACT,GAGFC,IAAM,KAAK,KAAK,MAAM,CAC/B,EACA,OAAgB,CACd,OAAI,KAAK,OAAS,KACT,GAGF,IAAI,KAAK,KAAK,KAAK,KAAK,EAAE,YAAY,CAC/C,EACA,MAAe,CACb,OAAI,KAAK,OAAS,KACT,GAGF,IAAI,KAAK,eAAe,QAAS,CACtC,SAAUD,GACV,KAAM,UACN,OAAQ,SACV,CAAC,EAAE,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,CACrC,CACF,GAGIC,IAASC,GAA4B,CACzC,IAAMC,EAAS,KAAK,MAAMD,EAAU,GAAK,EAAE,EAErCD,EAAQ,KAAK,MAAME,EAAS,CAAC,EAEnC,OAAIA,IAAW,EACN,yBAGLA,IAAW,EACN,eAGLA,IAAW,EACN,SAGLA,EAAS,IAAM,EACV,GAAGF,CAAK,SAGV,GAAGA,CAAK,mBACjB,EC/EA,IAAMG,IAAgD,CACpD,CAAC,IAAK,EAAE,EACR,CAAC,IAAK,EAAE,EACR,CAAC,IAAK,EAAE,EACR,CAAC,IAAK,EAAE,EACR,CAAC,IAAK,EAAE,EACR,CAAC,IAAK,EAAE,EACR,CAAC,IAAK,CAAC,CACT,EAGO,SAASC,GAASC,EAAqB,CAC5C,OAAO,KAAK,MAAMA,EAAM,EAAG,CAC7B,CAEO,SAASC,GAAQD,EAAqB,CAC3C,IAAME,EAAQH,GAASC,CAAG,EAC1B,OAAOF,IAAM,KAAK,CAAC,CAAC,CAAEK,CAAK,IAAMD,GAASC,CAAK,IAAI,CAAC,GAAK,GAC3D,CCnBO,SAASC,GAASC,EAAUC,EAAkB,CACnD,OAAO,KAAK,MAAMA,EAAE,CAAC,EAAID,EAAE,CAAC,EAAGC,EAAE,CAAC,EAAID,EAAE,CAAC,CAAC,CAC5C,CAeO,SAASE,GAAYC,EAA0B,CACpD,IAAIC,EAAU,EACd,QAASC,EAAI,EAAGA,EAAIF,EAAQ,OAAQE,IAAK,CACvC,IAAMC,EAAIH,EAAQE,CAAC,EACbE,EAAIJ,GAASE,EAAI,GAAKF,EAAQ,MAAM,EACtCG,GAAKC,IACPH,GAAWE,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAID,EAAE,CAAC,EAEvC,CACA,OAAO,KAAK,IAAIF,CAAO,EAAI,CAC7B,CAGO,SAASI,GAAgBL,EAAyB,CACvD,IAAIC,EAAU,EACVK,EAAK,EACLC,EAAK,EACT,QAAS,EAAI,EAAG,EAAIP,EAAQ,OAAQ,IAAK,CACvC,IAAMG,EAAIH,EAAQ,CAAC,EACbI,EAAIJ,GAAS,EAAI,GAAKA,EAAQ,MAAM,EAC1C,GAAIG,GAAKC,EAAG,CACV,IAAMI,EAAQL,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAID,EAAE,CAAC,EACtCF,GAAWO,EACXF,IAAOH,EAAE,CAAC,EAAIC,EAAE,CAAC,GAAKI,EACtBD,IAAOJ,EAAE,CAAC,EAAIC,EAAE,CAAC,GAAKI,CACxB,CACF,CACA,GAAIP,IAAY,EAAG,CACjB,IAAIQ,EAAK,EACLC,EAAK,EACT,OAAW,CAACC,EAAGC,CAAC,IAAKZ,EACnBS,GAAME,EACND,GAAME,EAER,MAAO,CAACH,EAAKT,EAAQ,OAAQU,EAAKV,EAAQ,MAAM,CAClD,CACA,MAAO,CAACM,GAAM,EAAIL,GAAUM,GAAM,EAAIN,EAAQ,CAChD,CAWO,SAASY,GACdC,EACAX,EACAC,EACmB,CACnB,IAAMW,EAAKX,EAAE,CAAC,EAAID,EAAE,CAAC,EACfa,EAAKZ,EAAE,CAAC,EAAID,EAAE,CAAC,EACfc,EAAgBF,EAAKA,EAAKC,EAAKA,EAC/BE,EACJD,IAAkB,EACd,EACA,KAAK,IACH,EACA,KAAK,IACH,IACEH,EAAE,CAAC,EAAIX,EAAE,CAAC,GAAKY,GAAMD,EAAE,CAAC,EAAIX,EAAE,CAAC,GAAKa,GAAMC,CAC9C,CACF,EACAE,EAAe,CAAChB,EAAE,CAAC,EAAIe,EAAIH,EAAIZ,EAAE,CAAC,EAAIe,EAAIF,CAAE,EAClD,MAAO,CAAE,MAAAG,EAAO,EAAAD,EAAG,SAAUE,GAASN,EAAGK,CAAK,CAAE,CAClD,CAGO,SAASE,GAAaC,EAAyB,CACpD,MAAO,IAAIA,EAAU,KAAW,QAAQ,CAAC,CAAC,QAC5C,CAGO,SAASC,GAAcC,EAA0B,CACtD,MAAO,IAAIA,EAAW,KAAM,QAAQ,CAAC,CAAC,IACxC,CChGO,SAASC,GAAMC,EAAwB,CAC5C,IAAMC,EAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAG,CAAC,EAC7CC,EAAO,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAC7C,MAAO,GAAGF,CAAM,IAAIE,CAAI,GAAGD,CAAK,EAClC,CCyCA,IAAME,GAAM,CAACC,EAAcC,IAAyB,GAAGD,CAAI,IAAIC,CAAI,GAEnE,SAASC,GAAWC,EAAmC,CACrD,IAAIC,EAAU,EACd,QAASC,EAAQ,EAAGA,EAAQF,EAAQ,OAAQE,IAAS,CACnD,IAAMC,EAAIH,EAAQE,CAAK,EACjBE,EAAIJ,GAASE,EAAQ,GAAKF,EAAQ,MAAM,EAC9CC,GAAWE,EAAE,CAAC,EAAIC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAID,EAAE,CAAC,CACrC,CACA,OAAOF,EAAU,CACnB,CAEO,SAASI,GACdC,EACAN,EACS,CACT,IAAIO,EAAS,GACb,QAASC,EAAI,EAAGC,EAAIT,EAAQ,OAAS,EAAGQ,EAAIR,EAAQ,OAAQS,EAAID,IAAK,CACnE,GAAM,CAACE,EAAIC,CAAE,EAAIX,EAAQQ,CAAC,EACpB,CAACI,EAAIC,CAAE,EAAIb,EAAQS,CAAC,EAExBE,EAAKL,EAAM,CAAC,GAAMO,EAAKP,EAAM,CAAC,GAC9BA,EAAM,CAAC,GAAMM,EAAKF,IAAOJ,EAAM,CAAC,EAAIK,IAAQE,EAAKF,GAAMD,IAEvDH,EAAS,CAACA,EAEd,CACA,OAAOA,CACT,CAGA,SAASO,IAAcC,EAA+B,CACpD,IAAMC,EAAmB,CAAC,EAC1B,QAAWC,KAAQF,EAAO,CACxB,IAAMG,EAAMF,EAAKA,EAAK,OAAS,CAAC,EAC5BE,GAAOA,EAAI,OAASD,EAAK,MAAQC,EAAI,OAASD,EAAK,GACrDD,EAAK,IAAI,EAETA,EAAK,KAAKC,CAAI,CAElB,CACA,KAAOD,EAAK,OAAS,GAAG,CACtB,IAAMG,EAAQH,EAAK,CAAC,EACdI,EAAOJ,EAAKA,EAAK,OAAS,CAAC,EACjC,GAAIG,EAAM,OAASC,EAAK,MAAQD,EAAM,OAASC,EAAK,GAClD,MAEFJ,EAAK,MAAM,EACXA,EAAK,IAAI,CACX,CACA,OAAOA,CACT,CAEA,SAASK,IAAOC,EAAcC,EAAoC,CAChE,IAAMC,EAAO,IAAI,IACjB,OAAOF,EAAM,MAAM,OAAQzB,GAAS,CAClC,IAAM4B,EAAO,CAAC5B,EAAK,EAAGA,EAAK,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAC7C,OACEA,EAAK,IAAMA,EAAK,GAChB,CAAC0B,EAAO,IAAI1B,EAAK,CAAC,GAClB,CAAC0B,EAAO,IAAI1B,EAAK,CAAC,GAClB2B,EAAK,IAAIC,CAAI,EAEN,IAETD,EAAK,IAAIC,CAAI,EACN,GACT,CAAC,CACH,CAEO,SAASC,GAAUJ,EAAqB,CAC7C,IAAMC,EAAS,IAAI,IACjBD,EAAM,SAAS,IAAKK,GAAW,CAACA,EAAO,GAAIA,EAAO,EAAE,CAAC,CACvD,EACMC,EAAQP,IAAOC,EAAOC,CAAM,EAE5BM,EAAU,IAAI,IACdC,EAAM,CAACjC,EAAcC,EAAciC,IAAqB,CAC5D,IAAM5B,EAAIoB,EAAO,IAAIzB,CAAI,EACnBM,EAAImB,EAAO,IAAIQ,CAAE,EACjBC,EAAOH,EAAQ,IAAI/B,CAAI,GAAK,CAAC,EACnCkC,EAAK,KAAK,CAAE,KAAAnC,EAAM,KAAAC,EAAM,GAAAiC,EAAI,MAAO,KAAK,MAAM3B,EAAE,CAAC,EAAID,EAAE,CAAC,EAAGC,EAAE,CAAC,EAAID,EAAE,CAAC,CAAC,CAAE,CAAC,EACzE0B,EAAQ,IAAI/B,EAAMkC,CAAI,CACxB,EACA,QAAWnC,KAAQ+B,EACjBE,EAAIjC,EAAK,GAAIA,EAAK,EAAGA,EAAK,CAAC,EAC3BiC,EAAIjC,EAAK,GAAIA,EAAK,EAAGA,EAAK,CAAC,EAE7B,IAAMoC,EAAW,IAAI,IACrB,QAAWD,KAAQH,EAAQ,OAAO,EAChCG,EAAK,KAAK,CAACE,EAAKC,IAAQD,EAAI,MAAQC,EAAI,KAAK,EAC7CH,EAAK,QAAQ,CAACf,EAAMf,IAAU,CAC5B+B,EAAS,IAAIrC,GAAIqB,EAAK,KAAMA,EAAK,IAAI,EAAGf,CAAK,CAC/C,CAAC,EAIH,IAAMkC,EAAQnB,GAA6B,CACzC,IAAMe,EAAOH,EAAQ,IAAIZ,EAAK,EAAE,EAC1BoB,EAAOJ,EAAS,IAAIrC,GAAIqB,EAAK,KAAMA,EAAK,EAAE,CAAC,EACjD,OAAOe,GAAMK,EAAO,EAAIL,EAAK,QAAUA,EAAK,MAAM,CACpD,EAEMM,EAAU,IAAI,IACdC,EAAuB,CAAC,EAC9B,QAAWP,KAAQH,EAAQ,OAAO,EAChC,QAAWW,KAASR,EAAM,CACxB,GAAIM,EAAQ,IAAI1C,GAAI4C,EAAM,KAAMA,EAAM,IAAI,CAAC,EACzC,SAEF,IAAMzB,EAAoB,CAAC,EACvBE,EAAOuB,EACX,KAAO,CAACF,EAAQ,IAAI1C,GAAIqB,EAAK,KAAMA,EAAK,IAAI,CAAC,GAC3CqB,EAAQ,IAAI1C,GAAIqB,EAAK,KAAMA,EAAK,IAAI,EAAGsB,EAAO,MAAM,EACpDxB,EAAM,KAAKE,CAAI,EACfA,EAAOmB,EAAKnB,CAAI,EAElBsB,EAAO,KAAKxB,CAAK,CACnB,CAIF,IAAM0B,EAAS,IAAI,IACbC,EAAQC,GAAuB,CACnC,IAAIC,EAAKD,EACT,KAAOF,EAAO,IAAIG,CAAE,GAAKH,EAAO,IAAIG,CAAE,IAAMA,GAC1CA,EAAKH,EAAO,IAAIG,CAAE,EAEpB,OAAOA,CACT,EACA,QAAW/C,KAAQ+B,EACjBa,EAAO,IAAIC,EAAK7C,EAAK,CAAC,EAAG6C,EAAK7C,EAAK,CAAC,CAAC,EAGvC,IAAMgD,EAAU,IAAI,IACdC,EAAkB,CAAC,EACnBC,EAA0B,CAAC,EAC3BC,EAAkB,CAAC,EACzBT,EAAO,QAAQ,CAACxB,EAAOb,IAAU,CAC/B,IAAMF,EAAUe,EAAM,IAAKE,GAASM,EAAO,IAAIN,EAAK,IAAI,CAAU,EAClE,GAAIlB,GAAWC,CAAO,EAAI,EAAS,CAEjC,IAAMiD,EADUnC,IAAcC,CAAK,EACd,IAAKE,GAASA,EAAK,IAAI,EACtCiC,EAAQD,EAAK,IAAKN,GAAOpB,EAAO,IAAIoB,CAAE,CAAU,EACtDE,EAAQ,IAAI3C,EAAO4C,EAAO,MAAM,EAChCA,EAAO,KAAK,CAAE,KAAAG,EAAM,QAASC,EAAO,KAAMnD,GAAWmD,CAAK,CAAE,CAAC,EAC7DH,EAAc,KAAKL,EAAK3B,EAAM,CAAC,GAAG,IAAc,CAAC,CACnD,MACEiC,EAAM,KAAK9C,CAAK,CAEpB,CAAC,EAGD,IAAMiD,EAAU,IAAI,IACdC,EAAW,IAAI,IACfC,EAAsB,CAAC,EAC7B,QAAWnD,KAAS8C,EAAO,CACzB,IAAMjC,EAAQwB,EAAOrC,CAAK,EACpBoD,EAAWZ,EAAK3B,EAAM,CAAC,GAAG,IAAc,EACxCwC,EAAQhC,EAAO,IAAIR,EAAM,CAAC,GAAG,IAAc,EAC7CyC,EAAY,GAUhB,GATAV,EAAO,QAAQ,CAACW,EAAOb,IAAO,CAE1BG,EAAcH,CAAE,IAAMU,GACtBjD,GAAekD,EAAOE,EAAM,OAAO,IAClCD,EAAY,GAAKC,EAAM,KAAQX,EAAOU,CAAS,EAAY,QAE5DA,EAAYZ,EAEhB,CAAC,EACGY,GAAa,EAAG,CAClBX,EAAQ,IAAI3C,EAAOsD,CAAS,EAC5BL,EAAQ,IAAIK,CAAS,EACrBJ,EAAS,IAAIE,EAAUE,CAAS,EAChC,QACF,CACA,IAAME,EAAU5C,IAAcC,CAAK,EAC7Bf,EAAU0D,EAAQ,IAAKzC,GAASM,EAAO,IAAIN,EAAK,IAAI,CAAU,EAC9D0C,EAAO,CAAC5D,GAAWC,CAAO,EAC5B2D,EAAO,GACTN,EAAS,KAAK,CACZ,KAAMK,EAAQ,IAAKzC,GAASA,EAAK,IAAI,EACrC,QAAAjB,EACA,KAAA2D,EACA,MAAOD,EAAQ,IAAKzC,GAASA,EAAK,IAAI,CACxC,CAAC,CAEL,CAEA,IAAM2C,EAAQ,IAAI,IAClB,QAAW/D,KAAQ+B,EAAO,CACxB,IAAMiC,EAAOvB,EAAQ,IAAI1C,GAAIC,EAAK,GAAIA,EAAK,CAAC,CAAC,EACvCiE,EAAQxB,EAAQ,IAAI1C,GAAIC,EAAK,GAAIA,EAAK,CAAC,CAAC,EAC9C+D,EAAM,IAAI/D,EAAK,GAAI,CAACgD,EAAQ,IAAIgB,CAAI,GAAK,GAAIhB,EAAQ,IAAIiB,CAAK,GAAK,EAAE,CAAC,CACxE,CAEA,IAAMC,EAAa,IAAI,IACvB,OAAAhB,EAAc,QAAQ,CAACO,EAAUpD,IAAU,CACzC,IAAMsD,EAAYJ,EAAS,IAAIE,CAAQ,EACnCE,IAAc,QAChBO,EAAW,IAAI7D,EAAOsD,CAAS,CAEnC,CAAC,EAEM,CAAE,OAAAV,EAAQ,SAAAO,EAAU,MAAAO,EAAO,QAAAT,EAAS,WAAAY,CAAW,CACxD,CAIA,IAAMC,GAAQ,CAACC,EAAU9D,EAAUC,KAChCD,EAAE,CAAC,EAAI8D,EAAE,CAAC,IAAM7D,EAAE,CAAC,EAAI6D,EAAE,CAAC,IAAM9D,EAAE,CAAC,EAAI8D,EAAE,CAAC,IAAM7D,EAAE,CAAC,EAAI6D,EAAE,CAAC,GAItD,SAASC,GAAYlE,EAA8C,CACxE,IAAMiD,EAAOlD,GAAWC,CAAO,GAAK,EAAI,CAAC,GAAGA,CAAO,EAAI,CAAC,GAAGA,CAAO,EAAE,QAAQ,EACtEmE,EAAwB,CAAC,EAC/B,KAAOlB,EAAK,OAAS,GAAG,CACtB,IAAImB,EAAU,GACd,QAASlE,EAAQ,EAAGA,EAAQ+C,EAAK,OAAQ/C,IAAS,CAChD,IAAMC,EAAI8C,GAAM/C,EAAQ,EAAI+C,EAAK,QAAUA,EAAK,MAAM,EAChD7C,EAAI6C,EAAK/C,CAAK,EACdmE,EAAIpB,GAAM/C,EAAQ,GAAK+C,EAAK,MAAM,EAClCqB,EAAON,GAAM7D,EAAGC,EAAGiE,CAAC,EAe1B,GAdI,EAAAC,EAAO,GAITA,EAAO,GACPrB,EAAK,KACFsB,GACCA,IAAMpE,GACNoE,IAAMnE,GACNmE,IAAMF,GACNL,GAAM7D,EAAGC,EAAGmE,CAAC,GAAK,GAClBP,GAAM5D,EAAGiE,EAAGE,CAAC,GAAK,GAClBP,GAAMK,EAAGlE,EAAGoE,CAAC,GAAK,CACtB,GAIF,CAAID,EAAO,GACTH,EAAU,KAAK,CAAChE,EAAGC,EAAGiE,CAAC,CAAC,EAE1BpB,EAAK,OAAO/C,EAAO,CAAC,EACpBkE,EAAU,GACV,MACF,CACA,GAAI,CAACA,EACH,OAAO,IAEX,CACA,OAAInB,EAAK,SAAW,GAAKlD,GAAWkD,CAAI,EAAI,GAC1CkB,EAAU,KAAKlB,CAAgB,EAE1BkB,CACT,CAIA,SAASK,IACPC,EACAC,EACS,CACT,IAAIC,EAAS,CAAC,GAAGF,CAAO,EACxB,QAASxD,EAAO,EAAGA,EAAO,GAAK0D,EAAO,OAAS,EAAG1D,IAAQ,CACxD,IAAMsD,EAAIG,EAASzD,CAAI,EACjB2D,EAAIF,GAAUzD,EAAO,GAAK,CAAC,EAC3BV,EAAUD,GAA0B0D,GAAMO,EAAGK,EAAGtE,CAAK,GAAK,EAC1DuE,EAAQF,EACdA,EAAS,CAAC,EACV,QAASzE,EAAQ,EAAGA,EAAQ2E,EAAM,OAAQ3E,IAAS,CACjD,IAAM4E,EAAUD,EAAM3E,CAAK,EACrB6E,EAAWF,GACd3E,EAAQ,EAAI2E,EAAM,QAAUA,EAAM,MACrC,EACItE,EAAOuE,CAAO,GACXvE,EAAOwE,CAAQ,GAClBJ,EAAO,KAAKK,IAAKD,EAAUD,EAASP,EAAGK,CAAC,CAAC,EAE3CD,EAAO,KAAKG,CAAO,GACVvE,EAAOwE,CAAQ,GACxBJ,EAAO,KAAKK,IAAKD,EAAUD,EAASP,EAAGK,CAAC,CAAC,CAE7C,CACF,CACA,OAAOD,CACT,CAEA,SAASK,IAAK7E,EAAUC,EAAUmE,EAAUK,EAAiB,CAC3D,IAAM1C,EAAM8B,GAAMO,EAAGK,EAAGzE,CAAC,EACnBgC,EAAM6B,GAAMO,EAAGK,EAAGxE,CAAC,EACnB6E,EAAI/C,GAAOA,EAAMC,GACvB,MAAO,CAAChC,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAK8E,EAAG9E,EAAE,CAAC,GAAKC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAK8E,CAAC,CAC5D,CASO,SAASC,GAAQlF,EAAqC,CAC3D,MAAO,CACL,QAAS,CAAC,GAAGA,CAAO,EACpB,KAAM,KAAK,IAAID,GAAWC,CAAO,CAAC,EAClC,UAAWkE,GAAYlE,CAAO,CAChC,CACF,CAIO,SAASmF,GAAYjC,EAAiBkC,EAAiC,CAC5E,GAAIA,EAAM,OAAS,GAAKlC,EAAM,OAAS,EACrC,MAAO,GAET,GAAIA,EAAM,UAAW,CACnB,IAAImC,EAAQ,EACZ,QAAWX,KAAYxB,EAAM,UAC3BmC,GAAS,KAAK,IAAItF,GAAWyE,IAAeY,EAAOV,CAAQ,CAAC,CAAC,EAE/D,OAAO,KAAK,IAAIW,EAAOnC,EAAM,IAAI,CACnC,CACA,IAAM3C,EAAS2C,EAAM,QAAQ,OAAQ5C,GACnCD,GAAeC,EAAO8E,CAAK,CAC7B,EAAE,OACF,OAAQlC,EAAM,KAAO3C,EAAU2C,EAAM,QAAQ,MAC/C,CC5VO,IAAMoC,GAAU,EAGVC,GAAY,GAEZC,IAAyB,IAGzBC,GAAsB,IAG7BC,IAAY,KAAK,IAAK,EAAI,KAAK,GAAM,GAAG,EAGxCC,IAAY,IAGZC,IAAgB,IAGhBC,IAAS,EAIf,SAASC,GAAKC,EAA4C,CACxD,MAAO,CACL,GAAGA,EAAM,SAAS,OACfC,GAAiCA,EAAQ,OAAS,UACrD,EACA,IAAID,EAAM,UAAY,CAAC,GAAG,OACvBE,GAAsCA,EAAQ,OAAS,gBAC1D,CACF,CACF,CAEO,SAASC,GAAQH,EAAcI,EAA+B,CACnE,OAAOJ,EAAM,SAAS,KAAMK,GAAWA,EAAO,KAAOD,CAAE,GAAG,EAC5D,CAEO,SAASE,GAASN,EAAcO,EAAmC,CACxE,IAAMC,EAAIL,GAAQH,EAAOO,EAAK,CAAC,EACzBE,EAAIN,GAAQH,EAAOO,EAAK,CAAC,EAC/B,OAAOC,GAAKC,EAAI,CAACD,EAAGC,CAAC,EAAI,IAC3B,CAEO,SAASC,GAAUV,EAAcW,EAAqB,CAC3D,IAAMC,EAAkB,CAAC,EACzB,QAAWR,KAAMO,EAAK,SAAU,CAC9B,IAAME,EAAKV,GAAQH,EAAOI,CAAE,EACxBS,GACFD,EAAO,KAAKC,CAAE,CAElB,CACA,OAAOD,CACT,CAEO,SAASE,GAASd,EAAce,EAAWC,EAA6B,CAC7E,OAAOhB,EAAM,MAAM,KAChBO,GAAUA,EAAK,IAAMQ,GAAKR,EAAK,IAAMS,GAAOT,EAAK,IAAMS,GAAKT,EAAK,IAAMQ,CAC1E,CACF,CAEO,SAASE,GAAQjB,EAAckB,EAAwB,CAC5D,OAAOlB,EAAM,MAAM,OAAQW,GACzBA,EAAK,SAAS,KACZ,CAACN,EAAQc,IACPL,GACEd,EACAK,EACAM,EAAK,UAAUQ,EAAQ,GAAKR,EAAK,SAAS,MAAM,GAAK,EACvD,GAAG,KAAOO,CACd,CACF,CACF,CAGA,IAAME,GAAQ,EAEd,SAASC,GAAYd,EAAoB,CACvC,OAAOA,EAAK,WAAab,EAC3B,CAEA,SAAS4B,GAAQtB,EAAmC,CAClD,IAAMuB,EAAS,IAAI,IACnB,QAAWhB,KAAQP,EAAM,MACvBuB,EAAO,IAAI,CAAChB,EAAK,EAAGA,EAAK,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAGA,EAAK,EAAE,EAEvD,IAAMiB,EAAO,IAAI,IACfxB,EAAM,MAAM,IAAKO,GAAS,CAACA,EAAK,GAAI,CAAC,CAAC,CAAC,CACzC,EACA,QAAWI,KAAQX,EAAM,MACvB,QAASmB,EAAQ,EAAGA,EAAQR,EAAK,SAAS,OAAQQ,IAAS,CACzD,IAAMM,EAAOd,EAAK,SAASQ,CAAK,EAC1BO,EAAKf,EAAK,UAAUQ,EAAQ,GAAKR,EAAK,SAAS,MAAM,EACrDO,EAASK,EAAO,IAAI,CAACE,EAAMC,CAAE,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAC/CC,EAAOT,EAASM,EAAK,IAAIN,CAAM,EAAI,OACrCS,GAAQ,CAACA,EAAK,SAAShB,CAAI,GAC7BgB,EAAK,KAAKhB,CAAI,CAElB,CAEF,OAAOa,CACT,CAMO,SAASI,GAAU5B,EAAmC,CAC3D,IAAMwB,EAAOF,GAAQtB,CAAK,EACtB6B,EAAsB,KACtBC,EAAS,IAAI,IACXC,EAAQ,IAAI,IAClB,QAAWxB,KAAQP,EAAM,MAAO,CAC9B,IAAMgC,EAAOR,EAAK,IAAIjB,EAAK,EAAE,GAAK,CAAC,EACnC,GAAIyB,EAAK,SAAW,EAAG,CACrB,IAAMC,EAASD,EAAK,OAAQrB,GAASA,EAAK,SAAW,EAAK,EAAE,OAC5DoB,EAAM,IAAIxB,EAAK,GAAI0B,IAAW,EAAI,WAAa,UAAU,CAC3D,SAAWD,EAAK,SAAW,GAAKzB,EAAK,MACnCwB,EAAM,IAAIxB,EAAK,GAAIA,EAAK,MAAQ,QAAU,UAAU,MAC/C,CACAsB,IACHA,EAAQK,GAAUlC,CAAK,EACvB8B,EAAS,IAAI,IAAIK,GAAcnC,EAAO6B,CAAK,EAAE,OAAO,CAAC,GAEvD,IAAMO,EAAQP,EAAM,MAAM,IAAItB,EAAK,EAAE,GAAK,CAAC,GAAI,EAAE,EACjDwB,EAAM,IACJxB,EAAK,GACL6B,EAAM,MAAOC,GAASP,EAAO,IAAIO,CAAI,CAAC,EAAI,WAAa,UACzD,CACF,CACF,CACA,OAAON,CACT,CAEO,SAASO,GAAStC,EAAckB,EAAwB,CAC7D,OAAOU,GAAU5B,CAAK,EAAE,IAAIkB,CAAM,GAAK,UACzC,CAIA,SAASqB,GACPC,EACAhC,EACAC,EACAgC,EAASlD,GACM,CACf,IAAMmD,EAASC,GAASnC,EAAGC,CAAC,EAC5B,GAAIiC,GAAU,EACZ,OAAO,KAET,IAAME,GAAMnC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKkC,EACrBG,GAAMpC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKkC,EACrBI,GAASN,EAAM,CAAC,EAAIhC,EAAE,CAAC,GAAKoC,GAAMJ,EAAM,CAAC,EAAIhC,EAAE,CAAC,GAAKqC,EACrDE,GAAOP,EAAM,CAAC,EAAIhC,EAAE,CAAC,GAAKqC,GAAML,EAAM,CAAC,EAAIhC,EAAE,CAAC,GAAKoC,EACzD,OAAI,KAAK,IAAIG,CAAG,EAAIN,EACX,KAEFK,EAAQvD,IAAWuD,EAAQJ,EAASnD,GAAUuD,EAAQ,IAC/D,CAGO,SAASE,GAAShD,EAAca,EAAmB,CACxD,IAAMoC,EAAWjD,EAAM,SAAS,KAC7BK,GAAWsC,GAAStC,EAAO,GAAIQ,CAAE,GAAKtB,EACzC,EACA,GAAI0D,EACF,OAAOA,EAAS,GAElB,IAAM7C,EAAK8C,GAAM,GAAG,EACpB,OAAAlD,EAAM,SAAS,KAAK,CAAE,GAAAI,EAAI,GAAI,CAAC,KAAK,MAAMS,EAAG,CAAC,CAAC,EAAG,KAAK,MAAMA,EAAG,CAAC,CAAC,CAAC,CAAE,CAAC,EAC/DT,CACT,CAIO,SAAS+C,GACdnD,EACAkB,EACAL,EACoD,CACpD,IAAMN,EAAOP,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOlC,CAAM,EAC9DmC,EAAO9C,EAAOD,GAASN,EAAOO,CAAI,EAAI,KAC5C,GAAI,CAACA,GAAQ,CAAC8C,EACZ,OAAO,KAET,IAAMP,EAAQP,GAAa1B,EAAIwC,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC/C,GAAIP,IAAU,KACZ,OAAO,KAGT,IAAMQ,EAASN,GAAShD,EAAOa,CAAE,EAC3B0C,EAAMhD,EAAK,EACjBA,EAAK,EAAI+C,EAET,IAAME,EAAe,CAAE,GAAGjD,EAAM,GAAI2C,GAAM,GAAG,EAAGI,EAAW,EAAGC,CAAI,EAClEvD,EAAM,MAAM,KAAKwD,CAAM,EAKvB,QAAWC,KAAWzD,EAAM,SAExByD,EAAQ,OAASvC,GACjBuC,EAAQ,OAASA,EAAQ,MAAQ,GAAKX,IAEtCW,EAAQ,KAAOD,EAAO,GACtBC,EAAQ,OAAS,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAQ,OAASX,CAAK,CAAC,GAGnE,QAAW7C,KAAWF,GAAKC,CAAK,EAE5BC,EAAQ,OAASiB,GACjBjB,EAAQ,OAASA,EAAQ,OAAS,GAAK6C,IAEvC7C,EAAQ,KAAOuD,EAAO,GACtBvD,EAAQ,OAAS,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAQ,OAAS6C,CAAK,CAAC,GAGnE,QAAWY,KAAW1D,EAAM,UAAY,CAAC,EAErC0D,EAAQ,OAASxC,GACjBwC,EAAQ,SAAW,QACnBA,EAAQ,QAAUZ,IAElBY,EAAQ,KAAOF,EAAO,GACtBE,EAAQ,OAAS,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAQ,OAASZ,CAAK,CAAC,GAInE,QAAWnC,KAAQX,EAAM,MAAO,CAC9B,IAAMmB,EAAQR,EAAK,SAAS,UAC1B,CAACN,EAAQsD,IACNtD,IAAWE,EAAK,GACfI,EAAK,UAAUgD,EAAW,GAAKhD,EAAK,SAAS,MAAM,IAAM4C,GAC1DlD,IAAWkD,GACV5C,EAAK,UAAUgD,EAAW,GAAKhD,EAAK,SAAS,MAAM,IAAMJ,EAAK,CACpE,EACIY,GAAS,GACXR,EAAK,SAAS,OAAOQ,EAAQ,EAAG,EAAGmC,CAAM,CAE7C,CAEA,MAAO,CAAE,OAAQA,EAAQ,MAAO,CAAC/C,EAAK,GAAIiD,EAAO,EAAE,CAAE,CACvD,CAIO,SAASI,IACd5D,EACA6D,EACAC,EAAS,GACH,CACN,IAAMC,EAAgB,CAAC,EACvB,QAAWvB,KAASqB,EAAM,CACxB,IAAMzD,EAAK4C,GAAShD,EAAOwC,CAAK,EAC5BuB,EAAIA,EAAI,OAAS,CAAC,IAAM3D,GAC1B2D,EAAI,KAAK3D,CAAE,CAEf,CACI0D,GAAUC,EAAI,OAAS,GAAKA,EAAI,CAAC,IAAMA,EAAIA,EAAI,OAAS,CAAC,GAC3DA,EAAI,IAAI,EAEV,IAAMC,EAAQF,GAAUC,EAAI,OAAS,EAAIA,EAAI,OAASA,EAAI,OAAS,EACnE,QAAS5C,EAAQ,EAAGA,EAAQ6C,EAAO7C,IAAS,CAC1C,IAAM,EAAI4C,EAAI5C,CAAK,EACbV,EAAIsD,GAAK5C,EAAQ,GAAK4C,EAAI,MAAM,EAClC,IAAMtD,GAAK,CAACK,GAASd,EAAO,EAAGS,CAAC,GAClCT,EAAM,MAAM,KAAK,CACf,GAAIkD,GAAM,GAAG,EACb,EACA,EAAAzC,EACA,UAAWW,GACX,OAAQ,KACR,MAAO,EACT,CAAC,CAEL,CACF,CAGO,SAAS6C,IACdjE,EACA6D,EACAC,EAAS,GACA,CACT,IAAMI,EAAUC,GAAYnE,CAAK,EACjC,OAAA4D,IAAS5D,EAAO6D,EAAMC,CAAM,EACrBM,GAAOpE,EAAO,CAAE,QAAAkE,CAAQ,CAAC,CAClC,CAGO,SAASG,GAAOrE,EAAcwC,EAAgC,CACnE,IAAI8B,EACAC,EAAW,OAAO,kBACtB,QAAW5D,KAAQX,EAAM,MAAO,CAC9B,IAAMwE,EAAU9D,GAAUV,EAAOW,CAAI,EAC/B8D,EAAOC,GAAYF,CAAO,EAC5BC,EAAOF,GAAYI,GAAenC,EAAOgC,CAAO,IAClDF,EAAO3D,EACP4D,EAAWE,EAEf,CACA,OAAOH,CACT,CAEA,SAASM,IAAgBf,EAAgC,CACvD,OAAO,IAAI,IAAIA,EAAK,IAAI,CAAC,CAACgB,EAAGC,CAAC,IAAM,GAAG,KAAK,MAAMD,CAAC,CAAC,IAAI,KAAK,MAAMC,CAAC,CAAC,EAAE,CAAC,EACrE,IACL,CAIO,SAASC,GACd/E,EACA6D,EACAmB,EAAwB,CAAC,EACV,CACf,GAAIJ,IAAgBf,CAAI,EAAI,GAAKa,GAAY,CAAC,GAAGb,CAAI,CAAC,GAAK,EACzD,OAAO,KAET,IAAMK,EAAUC,GAAYnE,CAAK,EACjC,OAAA4D,IAAS5D,EAAO6D,EAAM,EAAI,EACnBO,GAAOpE,EAAO,CAAE,QAAAkE,EAAS,MAAO,CAAE,QAAS,CAAC,GAAGL,CAAI,EAAG,OAAAmB,CAAO,CAAE,CAAC,EACpE,OACL,CAGO,SAASC,IACdjF,EACAwC,EACAwC,EAAwB,CAAC,EACV,CACf,IAAME,EAAQC,GAAanF,EAAOwC,CAAK,EACvC,GAAI,CAAC0C,EACH,OAAO,KAET,IAAM9E,EAAK8C,GAAM,GAAG,EACpB,OAAAlD,EAAM,MAAM,KAAK,CAAE,GAAGoF,IAAUhF,EAAI8E,EAAM,IAAI,EAAG,GAAGF,EAAQ,GAAA5E,CAAG,CAAC,EACzDA,CACT,CAEA,SAASgF,IAAUhF,EAAYiF,EAA0B,CACvD,MAAO,CACL,GAAAjF,EACA,KAAM,GACN,UAAW,GACX,SAAAiF,EACA,eAAgB,KAChB,OAAQ,EACV,CACF,CAEA,SAASC,IAAUC,EAAwBC,EAAiC,CAC1E,GAAID,EAAI,SAAWC,EAAI,QAAUD,EAAI,SAAW,EAC9C,MAAO,GAET,IAAME,EAAQD,EAAI,QAAQD,EAAI,CAAC,CAAW,EAC1C,GAAIE,EAAQ,EACV,MAAO,GAET,IAAM,EAAIF,EAAI,OACRG,EAAUH,EAAI,MAAM,CAACnF,EAAIe,IAAUqE,GAAKC,EAAQtE,GAAS,CAAC,IAAMf,CAAE,EAClEuF,EAAWJ,EAAI,MACnB,CAACnF,EAAIe,IAAUqE,GAAKC,EAAQtE,EAAQ,EAAI,GAAK,CAAC,IAAMf,CACtD,EACA,OAAOsF,GAAWC,CACpB,CAGA,SAASxD,GAAcnC,EAAc6B,EAAmC,CACtE,IAAM+D,EAAQ,IAAI,IAClB,QAAWjF,KAAQX,EAAM,MAAO,CAC9B,IAAMmB,EAAQU,EAAM,OAAO,UAAWqD,GACpCI,IAAU3E,EAAK,SAAUuE,EAAM,IAAI,CACrC,EACI/D,GAAS,GACXyE,EAAM,IAAIjF,EAAK,GAAIQ,CAAK,CAE5B,CACA,OAAOyE,CACT,CAGO,SAASC,GACd7F,EACA6B,EAAQK,GAAUlC,CAAK,EACd,CACT,IAAM8F,EAAS,IAAI,IAAI3D,GAAcnC,EAAO6B,CAAK,EAAE,OAAO,CAAC,EAC3D,OAAOA,EAAM,OAAO,OAAO,CAACkE,EAAG5E,IAAU,CAAC2E,EAAO,IAAI3E,CAAK,CAAC,CAC7D,CAEO,SAASgD,GAAYnE,EAAyB,CACnD,OAAO6F,GAAe7F,CAAK,EAAE,IAAKkF,GAAUA,EAAM,OAAO,CAC3D,CAIO,SAASc,IAAiBhG,EAAsB,CACrD,IAAM6B,EAAQK,GAAUlC,CAAK,EACvB4F,EAAQzD,GAAcnC,EAAO6B,CAAK,EACxC,OAAO7B,EAAM,MAAM,OAAQW,GACzBkB,EAAM,QAAQ,IAAI+D,EAAM,IAAIjF,EAAK,EAAE,GAAK,EAAE,CAC5C,CACF,CAYO,SAASsF,IAAejG,EAA8B,CAC3D,IAAM6B,EAAQK,GAAUlC,CAAK,EACvBkG,EAAQ,IAAI,IAAIlG,EAAM,MAAM,IAAKO,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,EAC5DkE,EAAO,EACP0B,EAAY,EACZC,EAAQ,EACZ,QAAWC,KAAWxE,EAAM,SAAU,CACpC4C,GAAQ4B,EAAQ,KAChB,QAAWjG,KAAMiG,EAAQ,MAAO,CAC9B,IAAM9F,EAAO2F,EAAM,IAAI9F,CAAE,EACnBiD,EAAO9C,EAAOD,GAASN,EAAOO,CAAI,EAAI,KACtCmC,EAASW,EAAOV,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAI,EACnD8C,GAAazD,EACTnC,GAAM,QACR6F,GAAS1D,EAEb,CACF,CACA,MAAO,CACL,KAAA+B,EACA,UAAA0B,EACA,MAAAC,EACA,QAASP,GAAe7F,EAAO6B,CAAK,EAAE,MACxC,CACF,CAEO,SAASsD,GACdnF,EACAwC,EAC6C,CAC7C,IAAMX,EAAQK,GAAUlC,CAAK,EACvB8F,EAAS,IAAI,IAAI3D,GAAcnC,EAAO6B,CAAK,EAAE,OAAO,CAAC,EACvDyC,EAAkE,KACtE,OAAAzC,EAAM,OAAO,QAAQ,CAACqD,EAAO/D,IAAU,CAEnC,CAAC2E,EAAO,IAAI3E,CAAK,GACjBwD,GAAenC,EAAO0C,EAAM,OAAO,IAClC,CAACZ,GAAQY,EAAM,KAAOZ,EAAK,QAE5BA,EAAOY,EAEX,CAAC,EACMZ,CACT,CAEA,SAASgC,GAAatG,EAAoC,CACxD,OAAO,IAAI,IAAIA,EAAM,MAAM,IAAKW,GAAS,CAACA,EAAK,GAAID,GAAUV,EAAOW,CAAI,CAAC,CAAC,CAAC,CAC7E,CAIO,SAAS4F,GAAWvG,EAAcwG,EAAsB,CAC7D,IAAM7F,EAAOX,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOoD,CAAM,EACpE,GAAI,CAAC7F,EACH,OAEF,IAAMuD,EAAU,CAAC,GAAGC,GAAYnE,CAAK,EAAGU,GAAUV,EAAOW,CAAI,CAAC,EAC9DX,EAAM,MAAQA,EAAM,MAAM,OAAQoD,GAAcA,EAAU,KAAOoD,CAAM,EACvEpC,GAAOpE,EAAO,CAAE,QAAAkE,CAAQ,CAAC,CAC3B,CAIO,SAASuC,IAAoBzG,EAAcwG,EAAsB,CACtE,IAAM7F,EAAOX,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOoD,CAAM,EACpE,GAAI,CAAC7F,EACH,OAEF,IAAMkB,EAAQK,GAAUlC,CAAK,EACvBkF,EAAQ/C,GAAcnC,EAAO6B,CAAK,EAAE,IAAI2E,CAAM,EAC9C1E,EAAS,IAAI,IAAIK,GAAcnC,EAAO6B,CAAK,EAAE,OAAO,CAAC,EACrDqC,EAAU,CAAC,GAAGC,GAAYnE,CAAK,EAAGU,GAAUV,EAAOW,CAAI,CAAC,EACxD+F,EAAQJ,GAAatG,CAAK,EAChC0G,EAAM,OAAOF,CAAM,EACnB,IAAMG,EAAQ,IAAI,IAClB,GAAIzB,IAAU,OACZ,OAAW,CAAChE,EAAQ,CAAC0F,EAAMC,CAAK,CAAC,IAAKhF,EAAM,MAAO,CACjD,GAAI+E,IAAS1B,GAAS2B,IAAU3B,EAC9B,SAEF,IAAM4B,EAAgBF,IAAS1B,EAAQ2B,EAAQD,GAC3CE,IAAU,IAAMA,IAAU5B,GAAS,CAACpD,EAAO,IAAIgF,CAAK,IACtDH,EAAM,IAAIzF,CAAM,CAEpB,CAEFlB,EAAM,MAAQA,EAAM,MAAM,OAAQoD,GAAcA,EAAU,KAAOoD,CAAM,EACvEO,GAAY/G,EAAO2G,CAAK,EACxBvC,GAAOpE,EAAO,CAAE,QAAAkE,EAAS,MAAAwC,CAAM,CAAC,CAClC,CAGO,SAASM,GACdhH,EACAwG,EACkC,CAClC,IAAMS,EAAS,IAAI,IACnB,OAAW,CAAC/F,EAAQwF,CAAK,IAAKpF,GAAQtB,CAAK,EAAG,CAC5C,GAAI,CAAC0G,EAAM,KAAM/F,GAASA,EAAK,KAAO6F,CAAM,EAC1C,SAEF,IAAMjG,EAAOP,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOlC,CAAM,EAC9DmC,EAAO9C,EAAOD,GAASN,EAAOO,CAAI,EAAI,KAC5C,QAAWI,KAAQ+F,EACb/F,EAAK,KAAO6F,GAAUnD,GACxB4D,EAAO,IACLtG,EAAK,IACJsG,EAAO,IAAItG,EAAK,EAAE,GAAK,GAAKgC,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CACxD,CAGN,CACA,OAAOrD,EAAM,MACV,OAAQW,GAASsG,EAAO,IAAItG,EAAK,EAAE,CAAC,EACpC,IAAKA,IAAU,CAAE,KAAAA,EAAM,OAAQsG,EAAO,IAAItG,EAAK,EAAE,CAAY,EAAE,EAC/D,KAAK,CAAC4E,EAAKC,IAAQA,EAAI,OAASD,EAAI,MAAM,CAC/C,CAIO,SAAS2B,IACdlH,EACAuF,EACAC,EACkB,CAClB,IAAM2B,EAAWb,GAAatG,CAAK,EAC7ByE,EAAQrE,GAAesE,GAAYyC,EAAS,IAAI/G,CAAE,GAAK,CAAC,CAAC,EAC/D,OAAOqE,EAAKe,CAAG,EAAIf,EAAKc,CAAG,EAAI,CAACC,EAAKD,CAAG,EAAI,CAACA,EAAKC,CAAG,CACvD,CAIO,SAAS4B,GAAWpH,EAAcqH,EAAcP,EAAwB,CAC7E,IAAMQ,EAAU,IAAI,IAClB,CAAC,GAAGhG,GAAQtB,CAAK,CAAC,EACf,OACC,CAAC,CAAC,CAAE0G,CAAK,IACPA,EAAM,KAAM/F,GAASA,EAAK,KAAO0G,CAAI,GACrCX,EAAM,KAAM/F,GAASA,EAAK,KAAOmG,CAAK,CAC1C,EACC,IAAI,CAAC,CAAC5F,CAAM,IAAMA,CAAM,CAC7B,EACA,GAAIoG,EAAQ,OAAS,EACnB,MAAO,GAET,IAAMpD,EAAUC,GAAYnE,CAAK,EAC3B0G,EAAQJ,GAAatG,CAAK,EAChC,OAAA+G,GAAY/G,EAAOsH,CAAO,EAC1BlD,GAAOpE,EAAO,CAAE,QAAAkE,EAAS,KAAAmD,EAAM,MAAAX,CAAM,CAAC,EAC/B,EACT,CAIO,SAASa,IACdvH,EACA6D,EACA2D,EACS,CACT,IAAMC,EAAWzH,EAAM,MAAM,KAAMO,GAASA,EAAK,KAAOiH,CAAI,EACtDE,EAAQ7D,EAAK,CAAC,EACd8D,EAAO9D,EAAKA,EAAK,OAAS,CAAC,EACjC,GAAI,CAAC4D,GAAY,CAACC,GAAS,CAACC,GAAQ9D,EAAK,OAAS,GAAK6D,IAAUC,EAC/D,MAAO,GAET,IAAMhB,EAAQ,IAAI,IAClB,QAASxF,EAAQ,EAAGA,EAAQ,EAAI0C,EAAK,OAAQ1C,IAAS,CACpD,IAAMZ,EAAOO,GAASd,EAAO6D,EAAK1C,CAAK,GAAK,GAAI0C,EAAK1C,EAAQ,CAAC,GAAK,EAAE,EACrE,GAAI,CAACZ,EACH,MAAO,GAEToG,EAAM,IAAIpG,EAAK,EAAE,CACnB,CACA,IAAM2D,EAAUC,GAAYnE,CAAK,EAC3B0G,EAAQJ,GAAatG,CAAK,EAChC,OAAAA,EAAM,MAAQA,EAAM,MAAM,OAAQO,GAAS,CAACoG,EAAM,IAAIpG,EAAK,EAAE,CAAC,EAC9DP,EAAM,SAAWA,EAAM,SAAS,OAAQyD,GAAY,CAACkD,EAAM,IAAIlD,EAAQ,IAAI,CAAC,EAC5EzD,EAAM,MAAM,KAAK,CAAE,GAAGyH,EAAU,GAAIvE,GAAM,GAAG,EAAG,EAAGwE,EAAO,EAAGC,CAAK,CAAC,EACnEvD,GAAOpE,EAAO,CAAE,QAAAkE,EAAS,MAAAwC,CAAM,CAAC,EACzB,EACT,CAIO,SAASkB,IAAW5H,EAAckB,EAAsB,CAC7D2G,GAAc7H,EAAO,IAAI,IAAI,CAACkB,CAAM,CAAC,CAAC,CACxC,CAIO,SAAS2G,GAAc7H,EAAc+D,EAAgC,CAC1E,IAAMG,EAAUC,GAAYnE,CAAK,EAC3B0G,EAAQJ,GAAatG,CAAK,EAChC+G,GAAY/G,EAAO+D,CAAG,EACtBK,GAAOpE,EAAO,CAAE,QAAAkE,EAAS,MAAAwC,CAAM,CAAC,CAClC,CAEA,SAASK,GAAY/G,EAAc+D,EAAgC,CACjE,IAAMV,EAAO,IAAI,IACjB,QAAW9C,KAAQP,EAAM,MACnB+D,EAAI,IAAIxD,EAAK,EAAE,IACjB8C,EAAK,IAAI9C,EAAK,CAAC,EACf8C,EAAK,IAAI9C,EAAK,CAAC,GAGnBP,EAAM,MAAQA,EAAM,MAAM,OAAQO,GAAS,CAACwD,EAAI,IAAIxD,EAAK,EAAE,CAAC,EAC5DP,EAAM,SAAWA,EAAM,SAAS,OAAQyD,GAAY,CAACM,EAAI,IAAIN,EAAQ,IAAI,CAAC,EAC1E,QAAWpD,KAAUgD,EACnByE,IAAW9H,EAAOK,CAAM,CAE5B,CAGO,SAAS0H,GACdvD,EACAhE,EACAC,EACuB,CACvB,IAAMmC,EAAKnC,EAAE,CAAC,EAAID,EAAE,CAAC,EACfqC,EAAKpC,EAAE,CAAC,EAAID,EAAE,CAAC,EACfkC,EAAS,KAAK,MAAME,EAAIC,CAAE,EAChC,GAAIH,EAASlD,IAAagF,EAAQ,OAAS,EACzC,OAAO,KAET,IAAMwD,EAAsB,CAAC,EAC7B,QAAS7G,EAAQ,EAAGA,EAAQqD,EAAQ,OAAQrD,IAAS,CACnD,IAAM8G,EAAIzD,EAAQrD,CAAK,EACjB+G,EAAI1D,GAASrD,EAAQ,GAAKqD,EAAQ,MAAM,EACxC2D,EAAKD,EAAE,CAAC,EAAID,EAAE,CAAC,EACfG,EAAKF,EAAE,CAAC,EAAID,EAAE,CAAC,EACfI,EAAczF,EAAKwF,EAAKvF,EAAKsF,EACnC,GAAI,KAAK,IAAIE,CAAW,EAAI,KAC1B,SAEF,IAAMC,IAAML,EAAE,CAAC,EAAIzH,EAAE,CAAC,GAAK4H,GAAMH,EAAE,CAAC,EAAIzH,EAAE,CAAC,GAAK2H,GAAME,EAChDtH,IAAMkH,EAAE,CAAC,EAAIzH,EAAE,CAAC,GAAKqC,GAAMoF,EAAE,CAAC,EAAIzH,EAAE,CAAC,GAAKoC,GAAMyF,EAClDtH,GAAK,OAASA,GAAK,EAAI,MACzBiH,EAAU,KAAKM,CAAC,CAEpB,CACAN,EAAU,KAAK,CAACzC,EAAKC,IAAQD,EAAMC,CAAG,EACtC,IAAM3E,EAAMyH,GAAqB,CAAC9H,EAAE,CAAC,EAAI8H,EAAI1F,EAAIpC,EAAE,CAAC,EAAI8H,EAAIzF,CAAE,EAC1DyB,EAAgC,KAChCiE,EAAU,OAAO,kBACrB,QAASpH,EAAQ,EAAGA,EAAQ,EAAI6G,EAAU,OAAQ7G,IAAS,CACzD,IAAMM,EAAOuG,EAAU7G,CAAK,EACtBO,EAAKsG,EAAU7G,EAAQ,CAAC,EAC9B,IACGO,EAAKD,GAAQiB,EAASlD,IACvB,CAACmF,GAAe9D,GAAIY,EAAOC,GAAM,CAAC,EAAG8C,CAAO,EAE5C,SAGF,IAAMgE,EACJ/G,GAAQ,IAAOC,GAAM,GACjB,EACA,KAAK,IAAI,KAAK,IAAID,EAAO,EAAG,EAAG,KAAK,IAAIC,EAAK,EAAG,CAAC,EACnD8G,EAAMD,IACRjE,EAAO,CAAC7C,EAAMC,CAAE,EAChB6G,EAAUC,EAEd,CACA,GAAI,CAAClE,EACH,OAAO,KAET,IAAMmE,EAASjG,GAAwB,CACrC,KAAK,MAAMA,EAAM,CAAC,CAAC,EACnB,KAAK,MAAMA,EAAM,CAAC,CAAC,CACrB,EACA,MAAO,CAACiG,EAAM5H,EAAGyD,EAAK,CAAC,CAAC,CAAC,EAAGmE,EAAM5H,EAAGyD,EAAK,CAAC,CAAC,CAAC,CAAC,CAChD,CAIO,SAASoE,IACd1I,EACAwG,EACAhG,EACAC,EACe,CACf,IAAME,EAAOX,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOoD,CAAM,EAC9DmC,EAAQhI,EAAOoH,GAAarH,GAAUV,EAAOW,CAAI,EAAGH,EAAGC,CAAC,EAAI,KAClE,GAAI,CAACE,GAAQ,CAACgI,EACZ,OAAO,KAET,IAAMzE,EAAUC,GAAYnE,CAAK,EAC3ByB,EAAOuB,GAAShD,EAAO2I,EAAM,CAAC,CAAC,EAC/BjH,EAAKsB,GAAShD,EAAO2I,EAAM,CAAC,CAAC,EACnC,OAAI7H,GAASd,EAAOyB,EAAMC,CAAE,EACnB,MAET1B,EAAM,MAAM,KAAK,CACf,GAAIkD,GAAM,GAAG,EACb,EAAGzB,EACH,EAAGC,EACH,UAAWhC,GACX,OAAQ,KACR,MAAO,EACT,CAAC,EACM0E,GAAOpE,EAAO,CAAE,QAAAkE,EAAS,KAAMsC,CAAO,CAAC,EAAE,QAAQ,CAAC,GAAK,KAChE,CAKO,SAASoC,IAAW5I,EAAcwG,EAA0B,CACjE,IAAM7F,EAAOX,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOoD,CAAM,EACpE,GAAI,CAAC7F,EACH,MAAO,CAAC,EAEV,IAAMkB,EAAQK,GAAUlC,CAAK,EACvBkF,EAAQ/C,GAAcnC,EAAO6B,CAAK,EAAE,IAAI2E,CAAM,EAC9ChF,EAAOF,GAAQtB,CAAK,EACpB6I,EAAS,CAAC,GAAGlI,EAAK,QAAQ,EAC1BmI,EAAQD,EAAO,IAAI,CAACpH,EAAMN,IAC9BL,GAASd,EAAOyB,EAAMoH,GAAQ1H,EAAQ,GAAK0H,EAAO,MAAM,CAAW,CACrE,EAGME,EAAM,IAAI,IAChB,QAAWxI,KAAQuI,EACb,CAACvI,IAASiB,EAAK,IAAIjB,EAAK,EAAE,GAAK,CAAC,GAAG,SAAW,IAG9C2E,IAAU,QAAarD,EAAM,MAAM,IAAItB,EAAK,EAAE,GAAG,SAAS,EAAE,IAC9DwI,EAAI,IAAIxI,EAAK,EAAE,EAGnB,IAAMyI,EAAS,IAAI,IAAIH,CAAM,EAC7B,GAAI3D,IAAU,OACZ,QAAW3E,KAAQP,EAAM,MAAO,CAC9B,GAAM,CAAC4G,EAAMC,CAAK,EAAIhF,EAAM,MAAM,IAAItB,EAAK,EAAE,GAAK,CAAC,GAAI,EAAE,EACrDqG,IAAS1B,GAAS2B,IAAU3B,IAC9B6D,EAAI,IAAIxI,EAAK,EAAE,EACfyI,EAAO,IAAIzI,EAAK,CAAC,EACjByI,EAAO,IAAIzI,EAAK,CAAC,EAErB,CAIF,IAAM0I,EAAS,IAAI,IACnB,QAAW7I,KAAM4I,EAAQ,CACvB,IAAME,EAAOlJ,EAAM,MAAM,KACtBO,IAAUA,EAAK,IAAMH,GAAMG,EAAK,IAAMH,IAAO,CAAC2I,EAAI,IAAIxI,EAAK,EAAE,CAChE,EACMM,EAAKV,GAAQH,EAAOI,CAAE,EAC5B,GAAI8I,GAAQrI,EAAI,CACd,IAAMsI,EAAQjG,GAAM,GAAG,EACvBlD,EAAM,SAAS,KAAK,CAAE,GAAImJ,EAAO,GAAI,CAACtI,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAAE,CAAC,EACrDoI,EAAO,IAAI7I,EAAI+I,CAAK,CACtB,CACF,CACA,IAAMC,EAAUhJ,GAAuB6I,EAAO,IAAI7I,CAAE,GAAKA,EACzD,QAAWG,KAAQP,EAAM,MACnB+I,EAAI,IAAIxI,EAAK,EAAE,IACjBA,EAAK,EAAI6I,EAAO7I,EAAK,CAAC,EACtBA,EAAK,EAAI6I,EAAO7I,EAAK,CAAC,GAG1B,OAAAI,EAAK,SAAWkI,EAAO,IAAIO,CAAM,EAEjCN,EAAM,QAAQ,CAACO,EAAQlI,IAAU,CAC/B,IAAMM,EAAOoH,EAAO1H,CAAK,EACnBO,EAAKmH,GAAQ1H,EAAQ,GAAK0H,EAAO,MAAM,EAC7C,GACE,CAACQ,GACDN,EAAI,IAAIM,EAAO,EAAE,GACjBvI,GAASd,EAAOoJ,EAAO3H,CAAI,EAAG2H,EAAO1H,CAAE,CAAC,EAExC,OAEF,IAAMtB,EAAK8C,GAAM,GAAG,EACpBlD,EAAM,MAAM,KAAK,CACf,GAAAI,EACA,EAAGgJ,EAAO3H,CAAI,EACd,EAAG2H,EAAO1H,CAAE,EACZ,UAAW2H,EAAO,UAClB,OAAQA,EAAO,QAAU,KACzB,MAAOA,EAAO,OAAS,EACzB,CAAC,EAED,IAAMhG,EAAO/C,GAASN,EAAOqJ,CAAM,EAC7B3G,EAASW,EAAOV,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAI,EACnD,QAAWpD,KAAWF,GAAKC,CAAK,EAC1BC,EAAQ,OAASuG,GAAUvG,EAAQ,OAASoJ,EAAO,KACrDpJ,EAAQ,KAAOG,EACXiJ,EAAO,IAAM5H,IACfxB,EAAQ,OAAS,KAAK,MACpByC,GAAUzC,EAAQ,OAASA,EAAQ,OACrC,IAIN,QAAWyD,KAAW1D,EAAM,UAAY,CAAC,EACnC0D,EAAQ,OAAS8C,GAAU9C,EAAQ,OAAS2F,EAAO,KACrD3F,EAAQ,KAAOtD,EACXiJ,EAAO,IAAM5H,GAAQiC,EAAQ,SAAW,SAC1CA,EAAQ,OAAS,KAAK,MAAMhB,EAASgB,EAAQ,MAAM,GAI3D,CAAC,EAEM,CAAC,GAAGsF,CAAM,EAAE,IAAII,CAAM,CAC/B,CAEO,SAASE,GACdtJ,EACA+D,EACAnB,EACAC,EACM,CACN,IAAMmG,EAAS,IAAI,IAAIjF,CAAG,EAC1B,QAAW1D,KAAUL,EAAM,SACrBgJ,EAAO,IAAI3I,EAAO,EAAE,IACtBA,EAAO,GAAK,CACV,KAAK,MAAMA,EAAO,GAAG,CAAC,EAAIuC,CAAE,EAC5B,KAAK,MAAMvC,EAAO,GAAG,CAAC,EAAIwC,CAAE,CAC9B,EAGN,CAEO,SAAS0G,GAAYvJ,EAAcI,EAAYS,EAAiB,CACrE,QAAWR,KAAUL,EAAM,SACrBK,EAAO,KAAOD,IAChBC,EAAO,GAAK,CAAC,KAAK,MAAMQ,EAAG,CAAC,CAAC,EAAG,KAAK,MAAMA,EAAG,CAAC,CAAC,CAAC,EAGvD,CAGO,SAAS2I,GAAcxJ,EAAcyB,EAAcgI,EAAoB,CAC5E,GAAIhI,IAASgI,EAIb,SAAWlJ,KAAQP,EAAM,MACnBO,EAAK,IAAMkB,IACblB,EAAK,EAAIkJ,GAEPlJ,EAAK,IAAMkB,IACblB,EAAK,EAAIkJ,GAGb,QAAW9I,KAAQX,EAAM,MACvBW,EAAK,SAAWA,EAAK,SAAS,IAAKP,GAAQA,IAAOqB,EAAOgI,EAAOrJ,CAAG,EAErEJ,EAAM,SAAWA,EAAM,SAAS,OAAQK,GAAWA,EAAO,KAAOoB,CAAI,EACrEiI,GAAe1J,CAAK,EACtB,CAIA,SAAS2J,IAAe3J,EAAuB,CAC7C,IAAM4J,EAAY,IAAI,IAChBC,EAAQ,IAAI,IAClB,QAAWtJ,KAAQP,EAAM,MAAO,CAC9B,IAAM8J,EAAM,CAACvJ,EAAK,EAAGA,EAAK,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EACtC0C,EAAW2G,EAAU,IAAIE,CAAG,EAClC,GAAI,CAAC7G,EAAU,CACb2G,EAAU,IAAIE,EAAKvJ,CAAI,EACvB,QACF,CACI0C,EAAS,YAAc7B,IAASb,EAAK,YAAca,IACrD2I,IAAS/J,EAAOO,EAAM0C,CAAQ,EAC9B4G,EAAM,IAAI5G,EAAS,EAAE,EACrB2G,EAAU,IAAIE,EAAKvJ,CAAI,IAEvBwJ,IAAS/J,EAAOiD,EAAU1C,CAAI,EAC9BsJ,EAAM,IAAItJ,EAAK,EAAE,EAErB,CACA,OAAAP,EAAM,MAAQA,EAAM,MAAM,OAAQO,GAAS,CAACsJ,EAAM,IAAItJ,EAAK,EAAE,CAAC,EACvDsJ,EAAM,KAAO,CACtB,CAGA,SAASE,IAAS/J,EAAcgK,EAAeC,EAAoB,CACjE,IAAM5G,EAAO/C,GAASN,EAAOgK,CAAO,EACpC,GAAI,CAAC3G,EACH,OAEF,IAAMX,EAASC,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAClC6G,EAAWF,EAAQ,IAAMC,EAAO,EAEtC,QAAWxG,KAAWzD,EAAM,SACtByD,EAAQ,OAASwG,EAAO,KAG5BxG,EAAQ,KAAOuG,EAAQ,GACnBE,IACFzG,EAAQ,OAAS,KAAK,MAAMf,GAAUe,EAAQ,OAASA,EAAQ,MAAM,IAGzE,QAAWxD,KAAWF,GAAKC,CAAK,EAC1BC,EAAQ,OAASgK,EAAO,KAG5BhK,EAAQ,KAAO+J,EAAQ,GACnBE,IACFjK,EAAQ,OAAS,KAAK,MAAMyC,GAAUzC,EAAQ,OAASA,EAAQ,OAAO,GAG5E,CAIA,SAAS6H,IAAW9H,EAAcmK,EAA2B,CAC3D,IAAMC,EAAUpK,EAAM,MAAM,OACzBO,GAASA,EAAK,IAAM4J,GAAY5J,EAAK,IAAM4J,CAC9C,EACA,GAAIC,EAAQ,SAAW,EACrB,MAAO,GAET,GAAM,CAAC7E,EAAKC,CAAG,EAAI4E,EACnB,GACE7E,EAAI,YAAcC,EAAI,YACrBD,EAAI,QAAU,SAAWC,EAAI,QAAU,OACxC,EAAQD,EAAI,OAAW,EAAQC,EAAI,MAEnC,MAAO,GAET,IAAMlC,EAASnD,GAAQH,EAAOmK,CAAQ,EAChClC,EAAI1C,EAAI,IAAM4E,EAAW5E,EAAI,EAAIA,EAAI,EACrC2C,EAAI1C,EAAI,IAAM2E,EAAW3E,EAAI,EAAIA,EAAI,EACrCC,EAAQtF,GAAQH,EAAOiI,CAAC,EACxBoC,EAAMlK,GAAQH,EAAOkI,CAAC,EAC5B,GAAI,CAAC5E,GAAU,CAACmC,GAAS,CAAC4E,GAAOpC,IAAMC,EACrC,MAAO,GAET,IAAMR,EAAQ/E,GAAS8C,EAAOnC,CAAM,EAC9BE,EAASb,GAASW,EAAQ+G,CAAG,EACnC,GACE9H,GAAae,EAAQmC,EAAO4E,CAAG,IAAM,MACrC3C,IAAU,GACVlE,IAAW,EAEX,MAAO,GAIT,IAAM8G,EAAQ,CAAC/J,EAAYgK,EAAgBC,IACrCjK,IAASgF,EACJhF,EAAK,IAAM0H,EAAIsC,EAAS7C,GAAS6C,EAASC,GAE5CjK,EAAK,IAAM4J,EACdzC,EAAQ6C,EACR7C,EAAQlE,GAAU+G,EAASC,GAEjC,QAAW/G,KAAWzD,EAAM,UACtByD,EAAQ,OAAS8B,EAAI,IAAM9B,EAAQ,OAAS+B,EAAI,MAClD/B,EAAQ,OAAS,KAAK,MACpB6G,EACE7G,EAAQ,OAAS8B,EAAI,GAAKA,EAAMC,EAChC/B,EAAQ,OACRA,EAAQ,KACV,CACF,EACAA,EAAQ,KAAO8B,EAAI,IAGvB,QAAWtF,KAAWF,GAAKC,CAAK,GAC1BC,EAAQ,OAASsF,EAAI,IAAMtF,EAAQ,OAASuF,EAAI,MAClDvF,EAAQ,OAAS,KAAK,MACpBqK,EACErK,EAAQ,OAASsF,EAAI,GAAKA,EAAMC,EAChCvF,EAAQ,OACRA,EAAQ,MACV,CACF,EACAA,EAAQ,KAAOsF,EAAI,IAIvBA,EAAI,EAAI0C,EACR1C,EAAI,EAAI2C,EACRlI,EAAM,MAAQA,EAAM,MAAM,OAAQO,GAASA,IAASiF,CAAG,EACvD,QAAW7E,KAAQX,EAAM,MACvBW,EAAK,SAAWA,EAAK,SAAS,OAAQP,GAAOA,IAAO+J,CAAQ,EAE9D,OAAAnK,EAAM,SAAWA,EAAM,SAAS,OAAQK,GAAWA,EAAO,KAAO8J,CAAQ,EAClE,EACT,CAEA,SAASM,GAAQzK,EAAmC,CAClD,IAAMa,EAAK,IAAI,IACf,QAAWN,KAAQP,EAAM,MACvB,QAAWqK,IAAO,CAAC9J,EAAK,EAAGA,EAAK,CAAC,EAAG,CAClC,IAAMoB,EAAOd,EAAG,IAAIwJ,CAAG,GAAK,CAAC,EAC7B1I,EAAK,KAAKpB,CAAI,EACdM,EAAG,IAAIwJ,EAAK1I,CAAI,CAClB,CAEF,OAAOd,CACT,CAGA,SAAS6J,IAAY1K,EAAc2K,EAAqC,CACtE,IAAMzE,EAAQuE,GAAQzK,CAAK,EACrB4K,EAAW,CAAC,GAAG5K,EAAM,QAAQ,EAAE,KACnC,CAACuF,EAAKC,IACJ,OAAOmF,EAAM,IAAIpF,EAAI,EAAE,CAAC,EAAI,OAAOoF,EAAM,IAAInF,EAAI,EAAE,CAAC,IACnDU,EAAM,IAAIV,EAAI,EAAE,GAAG,QAAU,IAAMU,EAAM,IAAIX,EAAI,EAAE,GAAG,QAAU,EACrE,EACA,QAAS,EAAI,EAAG,EAAIqF,EAAS,OAAQ,IAAK,CACxC,IAAMnB,EAAOmB,EAAS,CAAC,EACvB,QAASC,EAAI,EAAI,EAAGA,EAAID,EAAS,OAAQC,IAAK,CAC5C,IAAMpJ,EAAOmJ,EAASC,CAAC,EACvB,GAAIlI,GAAS8G,EAAK,GAAIhI,EAAK,EAAE,GAAKjC,GAChC,OAAAgK,GAAcxJ,EAAOyB,EAAK,GAAIgI,EAAK,EAAE,EAC9B,EAEX,CACF,CACA,MAAO,EACT,CAIA,SAASqB,IAAc9K,EAAuB,CAC5C,IAAMkG,EAAQuE,GAAQzK,CAAK,EAC3B,QAAWK,KAAUL,EAAM,SAAU,CACnC,IAAMgC,EAAOkE,EAAM,IAAI7F,EAAO,EAAE,GAAK,CAAC,EACtC,GAAI2B,EAAK,SAAW,EAClB,SAEF,IAAMzB,EAAOyB,EAAK,CAAC,EACb8E,EAAQvG,EAAK,IAAMF,EAAO,GAAKE,EAAK,EAAIA,EAAK,EAC7CkB,EAAOtB,GAAQH,EAAO8G,CAAK,EACjC,GAAI,CAACrF,EACH,SAEF,IAAMZ,EAAKR,EAAO,GACZqC,EAASC,GAASlB,EAAMZ,CAAE,EAChC,GAAI6B,IAAW,EACb,SAEF,IAAMqI,GAAMlK,EAAG,CAAC,EAAIY,EAAK,CAAC,GAAKiB,EACzBsI,GAAMnK,EAAG,CAAC,EAAIY,EAAK,CAAC,GAAKiB,EACzBuI,EAAO5J,GAAYd,CAAI,EAAI,EAE7B+D,EAKO,KACL4G,EAAY9H,GAA8C,EAC1D,CAACkB,GAAQlB,EAAU,SAAWkB,EAAK,YACrCA,EAAOlB,EAEX,EAEA,QAAW+H,KAAUnL,EAAM,SAAU,CACnC,GAAImL,EAAO,KAAO9K,EAAO,IAAM8K,EAAO,KAAOrE,EAC3C,SAEF,IAAMsE,EAAW,KAAK,IACpB/J,GAAYd,CAAI,EAChB,IAAI2F,EAAM,IAAIiF,EAAO,EAAE,GAAK,CAAC,GAAG,IAAI9J,EAAW,CACjD,EACMmH,EAAM7F,GAAS9B,EAAIsK,EAAO,EAAE,EAC9B3C,GAAO4C,EAAW,GACpBF,EAAS,CAAE,SAAU1C,EAAK,OAAQ2C,EAAO,EAAG,CAAC,CAEjD,CAEA,QAAWA,KAAUnL,EAAM,MAAO,CAChC,GACEmL,EAAO,KAAO5K,EAAK,IACnB4K,EAAO,IAAMrE,GACbqE,EAAO,IAAMrE,GACbqE,EAAO,IAAM9K,EAAO,IACpB8K,EAAO,IAAM9K,EAAO,GAEpB,SAEF,IAAMgD,EAAO/C,GAASN,EAAOmL,CAAM,EACnC,GAAI,CAAC9H,EACH,SAEF,GAAM,CAAC4E,EAAGC,CAAC,EAAI7E,EACTgI,EAAQhK,GAAY8J,CAAM,EAAI,EAE9BhD,EAAKD,EAAE,CAAC,EAAID,EAAE,CAAC,EACfG,EAAKF,EAAE,CAAC,EAAID,EAAE,CAAC,EACfI,EAAc0C,EAAK3C,EAAK4C,EAAK7C,EACnC,GAAI,KAAK,IAAIE,CAAW,EAAI,KAAM,CAChC,IAAMC,IAAML,EAAE,CAAC,EAAIpH,EAAG,CAAC,GAAKuH,GAAMH,EAAE,CAAC,EAAIpH,EAAG,CAAC,GAAKsH,GAAME,EAClDtH,IAAMkH,EAAE,CAAC,EAAIpH,EAAG,CAAC,GAAKmK,GAAM/C,EAAE,CAAC,EAAIpH,EAAG,CAAC,GAAKkK,GAAM1C,EACpDC,EAAI,GAAKA,GAAK+C,EAAQJ,GAAQlK,EAAI,GAAKA,EAAI,GAC7CmK,EAAS,CACP,SAAU5C,EACV,KAAM,CAACzH,EAAG,CAAC,EAAIkK,EAAKzC,EAAGzH,EAAG,CAAC,EAAImK,EAAK1C,CAAC,EACrC,KAAM6C,EAAO,EACf,CAAC,CAEL,CAEA,IAAMrI,EAAQP,GAAa1B,EAAIoH,EAAGC,EAAGmD,CAAK,EAC1C,GAAIvI,IAAU,KAAM,CAClB,IAAMwI,EAAU3I,GAASsF,EAAGC,CAAC,EACvBqD,EAAc,CAClBtD,EAAE,CAAC,GAAMC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKnF,EAASwI,EACjCrD,EAAE,CAAC,GAAMC,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKnF,EAASwI,CACnC,EACAJ,EAAS,CAAE,SAAUvI,GAAS9B,EAAI0K,CAAI,EAAG,KAAAA,EAAM,KAAMJ,EAAO,EAAG,CAAC,CAClE,CACF,CAEA,IAAMvF,EAAQtB,EAMd,GAAI,GAACsB,GAASA,EAAM,UAAYrG,GAAU,GAG1C,IAAIqG,EAAM,OACR,OAAA4D,GAAcxJ,EAAOK,EAAO,GAAIuF,EAAM,MAAM,EACrC,GAET,GAAIA,EAAM,MAAQA,EAAM,KAAM,CAE5B,GADA2D,GAAYvJ,EAAOK,EAAO,GAAIuF,EAAM,IAAI,EACpC,CAACzC,GAAUnD,EAAO4F,EAAM,KAAMA,EAAM,IAAI,EAAG,CAC7C,IAAMuF,EAASnL,EAAM,MAAM,KAAMwL,GAAMA,EAAE,KAAO5F,EAAM,IAAI,EACpDvC,EAAO8H,EAAS7K,GAASN,EAAOmL,CAAM,EAAI,KAChD,GAAIA,GAAU9H,EAAM,CAClB,IAAMoI,EACJ9I,GAASU,EAAK,CAAC,EAAGuC,EAAM,IAAI,GAAKjD,GAASU,EAAK,CAAC,EAAGuC,EAAM,IAAI,EACzDuF,EAAO,EACPA,EAAO,EACb3B,GAAcxJ,EAAOK,EAAO,GAAIoL,CAAM,CACxC,CACF,CACA,MAAO,EACT,EACF,CACA,MAAO,EACT,CAGA,SAASC,IAAgB1L,EAAuB,CAC9C,IAAI2L,EAAU,GACd,QAASC,EAAO,EAAGA,EAAO,IAAMA,IAAQ,CACtC,GAAI,CAACC,IAAU7L,CAAK,EAClB,OAAO2L,EAETA,EAAU,EACZ,CACA,OAAOA,CACT,CAEA,SAASE,IAAU7L,EAAuB,CACxC,QAAWO,KAAQP,EAAM,MAAO,CAC9B,IAAMqD,EAAO/C,GAASN,EAAOO,CAAI,EACjC,GAAK8C,EAGL,QAAWhD,KAAUL,EAAM,SAAU,CACnC,GAAIK,EAAO,KAAOE,EAAK,GAAKF,EAAO,KAAOE,EAAK,EAC7C,SAEF,IAAMuC,EAAQP,GAAalC,EAAO,GAAIgD,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAG7D,EAAS,EACjE,GAAIsD,IAAU,KACZ,SAEF,IAAMJ,EAASC,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAClCkI,EAAc,CAClBlI,EAAK,CAAC,EAAE,CAAC,GAAMA,EAAK,CAAC,EAAE,CAAC,EAAIA,EAAK,CAAC,EAAE,CAAC,GAAKP,EAASJ,EACnDW,EAAK,CAAC,EAAE,CAAC,GAAMA,EAAK,CAAC,EAAE,CAAC,EAAIA,EAAK,CAAC,EAAE,CAAC,GAAKP,EAASJ,CACrD,EACA,OAAA6G,GAAYvJ,EAAOK,EAAO,GAAIkL,CAAI,EAClCpI,GAAUnD,EAAOO,EAAK,GAAIF,EAAO,EAAE,EAC5B,EACT,CACF,CACA,QAASyL,EAAI,EAAGA,EAAI9L,EAAM,MAAM,OAAQ8L,IAAK,CAC3C,IAAMvG,EAAMvF,EAAM,MAAM8L,CAAC,EACnBpE,EAAQpH,GAASN,EAAOuF,CAAG,EACjC,GAAKmC,EAGL,QAASmD,EAAIiB,EAAI,EAAGjB,EAAI7K,EAAM,MAAM,OAAQ6K,IAAK,CAC/C,IAAMrF,EAAMxF,EAAM,MAAM6K,CAAC,EACzB,GACErF,EAAI,IAAMD,EAAI,GACdC,EAAI,IAAMD,EAAI,GACdC,EAAI,IAAMD,EAAI,GACdC,EAAI,IAAMD,EAAI,EAEd,SAEF,IAAM/B,EAASlD,GAASN,EAAOwF,CAAG,EAC5BuG,EAAWvI,EAASwI,IAActE,EAAOlE,CAAM,EAAI,KACzD,GAAI,CAACuI,EACH,SAEF,IAAMlL,EAAY,CAAC,KAAK,MAAMkL,EAAS,CAAC,CAAC,EAAG,KAAK,MAAMA,EAAS,CAAC,CAAC,CAAC,EAC7DE,EAAQ9I,GAAUnD,EAAOuF,EAAI,GAAI1E,CAAE,EACzC,GAAI,CAACoL,EACH,SAEF,IAAM3I,EAASnD,GAAQH,EAAOiM,EAAM,MAAM,EAC1C,GAAI,CAAC9I,GAAUnD,EAAOwF,EAAI,GAAIlC,CAAM,EAAG,CAErC,IAAMD,EAAO/C,GAASN,EAAOwF,CAAG,EAChCgE,GACExJ,EACAiM,EAAM,OACNtJ,GAASU,EAAK,CAAC,EAAGC,CAAM,GAAKX,GAASU,EAAK,CAAC,EAAGC,CAAM,EACjDkC,EAAI,EACJA,EAAI,CACV,CACF,CACA,MAAO,EACT,CACF,CACA,MAAO,EACT,CAGA,SAASwG,IACP,CAAC/D,EAAGC,CAAC,EACL,CAAC,EAAGgE,CAAC,EACS,CACd,IAAMtJ,EAAKsF,EAAE,CAAC,EAAID,EAAE,CAAC,EACfpF,EAAKqF,EAAE,CAAC,EAAID,EAAE,CAAC,EACfE,EAAK+D,EAAE,CAAC,EAAI,EAAE,CAAC,EACf9D,EAAK8D,EAAE,CAAC,EAAI,EAAE,CAAC,EACf7D,EAAczF,EAAKwF,EAAKvF,EAAKsF,EACnC,GAAI,KAAK,IAAIE,CAAW,EAAI,KAC1B,OAAO,KAET,IAAMC,IAAM,EAAE,CAAC,EAAIL,EAAE,CAAC,GAAKG,GAAM,EAAE,CAAC,EAAIH,EAAE,CAAC,GAAKE,GAAME,EAChDtH,IAAM,EAAE,CAAC,EAAIkH,EAAE,CAAC,GAAKpF,GAAM,EAAE,CAAC,EAAIoF,EAAE,CAAC,GAAKrF,GAAMyF,EAChD8D,EAAY,KAAK,MAAMvJ,EAAIC,CAAE,EAC7BuJ,EAAY,KAAK,MAAMjE,EAAIC,CAAE,EAC7BiE,EAAS,CAACC,EAAe5J,IAC7B4J,EAAQ5J,EAASnD,KAAY,EAAI+M,GAAS5J,EAASnD,GACrD,MAAI,CAAC8M,EAAO/D,EAAG6D,CAAS,GAAK,CAACE,EAAOtL,EAAGqL,CAAS,EACxC,KAEF,CAACnE,EAAE,CAAC,EAAIK,EAAI1F,EAAIqF,EAAE,CAAC,EAAIK,EAAIzF,CAAE,CACtC,CAIA,SAAS0J,IAAevM,EAAc2K,EAAqC,CACzE,QAASmB,EAAI,EAAGA,EAAI9L,EAAM,MAAM,OAAQ8L,IACtC,QAASjB,EAAIiB,EAAI,EAAGjB,EAAI7K,EAAM,MAAM,OAAQ6K,IAAK,CAC/C,IAAMtF,EAAMvF,EAAM,MAAM8L,CAAC,EACnBtG,EAAMxF,EAAM,MAAM6K,CAAC,EACnB,EAAIvK,GAASN,EAAOuF,CAAG,EACvB9E,EAAIH,GAASN,EAAOwF,CAAG,EAC7B,GAAI,CAAC,GAAK,CAAC/E,EACT,SAEF,IAAM+L,EAAU7J,GAAS,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EAC7B8J,EAAU9J,GAASlC,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACnC,GAAI+L,IAAY,GAAKC,IAAY,EAC/B,SAEF,IAAMC,EAAY,EACf,EAAE,CAAC,EAAE,CAAC,EAAI,EAAE,CAAC,EAAE,CAAC,GAAKF,GACrB,EAAE,CAAC,EAAE,CAAC,EAAI,EAAE,CAAC,EAAE,CAAC,GAAKA,CACxB,EACMG,EAAY,EACflM,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,GAAKgM,GACrBhM,EAAE,CAAC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAE,CAAC,GAAKgM,CACxB,EACA,GAAI,KAAK,IAAIC,EAAG,CAAC,EAAIC,EAAG,CAAC,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,CAAC,EAAIhN,IAC5C,SAEF,IAAMiN,EAAWjC,EAAM,IAAIpF,EAAI,CAAC,GAAKoF,EAAM,IAAIpF,EAAI,CAAC,EAC9CsH,EAAWlC,EAAM,IAAInF,EAAI,CAAC,GAAKmF,EAAM,IAAInF,EAAI,CAAC,EAC9CsH,EACJD,IAAaD,EACTC,EACAJ,EAAUD,GAAYC,IAAYD,GAAWhH,EAAI,GAAKD,EAAI,GAC1D,CAAC8B,EAAM0F,EAAMC,EAAM3J,CAAI,EAAIyJ,EAC7B,CAACvH,EAAKC,EAAK,EAAG/E,CAAC,EACf,CAAC+E,EAAKD,EAAK9E,EAAG,CAAC,EACb,CAACwM,EAAQ5C,CAAG,EAAI2C,EAChBtK,EAASC,GAASsK,EAAQ5C,CAAG,EAC7BU,GAAMV,EAAI,CAAC,EAAI4C,EAAO,CAAC,GAAKvK,EAC5BsI,GAAMX,EAAI,CAAC,EAAI4C,EAAO,CAAC,GAAKvK,EAC5B6H,EAAU/H,IACbA,EAAM,CAAC,EAAIyK,EAAO,CAAC,GAAKjC,GAAMxI,EAAM,CAAC,EAAIyK,EAAO,CAAC,GAAKlC,EACnDjI,EAASN,IACZA,EAAM,CAAC,EAAIyK,EAAO,CAAC,GAAKlC,GAAMvI,EAAM,CAAC,EAAIyK,EAAO,CAAC,GAAKjC,EACnDkC,EAAO7J,EAAK,IAAIkH,CAAM,EACtBc,GAAShK,GAAYgG,CAAI,EAAIhG,GAAY0L,CAAI,GAAK,EACxD,GACEG,EAAK,KAAM1E,GAAQ,KAAK,IAAIA,CAAG,GAAK6C,CAAK,GACzC6B,EAAK,MAAO1E,GAAQ,KAAK,IAAIA,CAAG,GAAKjJ,EAAO,EAE5C,SAEF,IAAM4N,EAAO9J,EAAK,IAAIP,CAAK,EAAE,KAAK,CAAC+B,EAAGC,IAAMD,EAAIC,CAAC,EAC3CsI,EAAU,KAAK,IAAID,EAAK,CAAC,EAAGzK,CAAM,EAAI,KAAK,IAAIyK,EAAK,CAAC,EAAG,CAAC,EACzDE,EAAU,KAAK,IAAIb,EAASC,CAAO,EACzC,GAAI,EAAAW,EAAU,KAAK,IAAI,IAAKC,EAAU,CAAC,GAGvC,QAAW,CAAClM,EAAOf,CAAE,GAAK,CAAC2M,EAAK,EAAGA,EAAK,CAAC,EAAE,QAAQ,EAAG,CACpD,IAAMvK,EAAQa,EAAKlC,CAAK,EAClBmH,EAAIxF,EAAMN,CAAK,EACrB+G,GAAYvJ,EAAOI,EAAI,CAAC6M,EAAO,CAAC,EAAIlC,EAAKzC,EAAG2E,EAAO,CAAC,EAAIjC,EAAK1C,CAAC,CAAC,CACjE,CACA,MAAO,GACT,CAEF,MAAO,EACT,CAIA,SAASgF,IAAUtN,EAAuB,CACxC,IAAMkG,EAAQuE,GAAQzK,CAAK,EAC3B,QAAWO,KAAQP,EAAM,MAAO,CAC9B,IAAMuN,GAAUrH,EAAM,IAAI3F,EAAK,CAAC,GAAG,QAAU,KAAO,EAC9CiN,GAAUtH,EAAM,IAAI3F,EAAK,CAAC,GAAG,QAAU,KAAO,EACpD,GAAIgN,IAAWC,EACb,SAEF,IAAMtE,EAAOqE,EAAShN,EAAK,EAAIA,EAAK,EAC9BkN,EAAO,KAAK,IAChB,EACA,IAAIvH,EAAM,IAAIgD,CAAI,GAAK,CAAC,GACrB,OAAQpC,GAAUA,IAAUvG,CAAI,EAChC,IAAIc,EAAW,CACpB,EACMgC,EAAO/C,GAASN,EAAOO,CAAI,EACjC,GAAI8C,GAAQV,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAIoK,EAAO,EAAIlO,GAClD,OAAAwH,GAAY/G,EAAO,IAAI,IAAI,CAACO,EAAK,EAAE,CAAC,CAAC,EAC9B,EAEX,CACA,MAAO,EACT,CAIA,SAASmN,IAAa1N,EAAuB,CAC3C,IAAM6B,EAAQK,GAAUlC,CAAK,EAC7B,OAAW,CAACmB,EAAO+D,CAAK,IAAKrD,EAAM,OAAO,QAAQ,EAAG,CACnD,IAAIsE,EAAY,EAOhB,GANAjB,EAAM,QAAQ,QAAQ,CAAC1C,EAAO3B,IAAO,CACnCsF,GAAaxD,GACXH,EACA0C,EAAM,SAASrE,EAAK,GAAKqE,EAAM,QAAQ,MAAM,CAC/C,CACF,CAAC,EACGiB,IAAc,GAAM,EAAIjB,EAAM,KAAQiB,GAAavG,IACrD,SAEF,IAAMqH,EAAS,IAAI,IACnB,OAAW,CAAC/F,EAAQ,CAAC0F,EAAMC,CAAK,CAAC,IAAKhF,EAAM,MAAO,CACjD,GAAI+E,IAASC,GAAUD,IAASzF,GAAS0F,IAAU1F,EACjD,SAEF,IAAM2F,EAAQF,IAASzF,EAAQ0F,EAAQD,EACjCrG,EAAOP,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOlC,CAAM,EAC9DmC,EAAO9C,EAAOD,GAASN,EAAOO,CAAI,EAAI,KACtCoN,EAAQ1G,EAAO,IAAIH,CAAK,GAAK,CAAE,OAAQ,EAAG,MAAO,CAAC,CAAE,EAC1D6G,EAAM,QAAUtK,EAAOV,GAASU,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAI,EACpDsK,EAAM,MAAM,KAAKzM,CAAM,EACvB+F,EAAO,IAAIH,EAAO6G,CAAK,CACzB,CACA,IAAMrJ,EAAO,CAAC,GAAG2C,EAAO,OAAO,CAAC,EAAE,KAAK,CAACpC,EAAGC,IAAMA,EAAE,OAASD,EAAE,MAAM,EAAE,CAAC,EACvE,GAAIP,EACF,OAAAyC,GAAY/G,EAAO,IAAI,IAAIsE,EAAK,KAAK,CAAC,EAC/B,EAEX,CACA,MAAO,EACT,CAwBO,SAASF,GAAOpE,EAAc4N,EAAyB,CAAC,EAAY,CACzE,IAAMjD,EAAQiD,EAAQ,OAAS,IAAI,IAC7B1J,EAAU0J,EAAQ,SAAWzJ,GAAYnE,CAAK,EAC9C6I,EAAS+E,EAAQ,OAAStH,GAAatG,CAAK,EAG5C6N,EAAU,IAAI,IAAI7N,EAAM,MAAM,IAAKW,GAAS,CAACA,EAAK,GAAI,CAAE,GAAGA,CAAK,CAAC,CAAC,CAAC,EAEzE+I,GAAe1J,CAAK,EACpB,QAAS4L,EAAO,EAAGA,EAAO9L,IAAQ8L,IAAQ,CACxC,IAAID,EAAU,GACd,QAASmC,EAAO,EAAGA,EAAO,MAEtBpD,IAAY1K,EAAO2K,CAAK,GACxBG,IAAc9K,CAAK,GACnB0L,IAAgB1L,CAAK,GACrB2J,IAAe3J,CAAK,GACpBuM,IAAevM,EAAO2K,CAAK,GANAmD,IAU7BnC,EAAU,GAEZ,KAAO2B,IAAUtN,CAAK,GACpB2L,EAAU,GAKZ,GAHI+B,IAAa1N,CAAK,IACpB2L,EAAU,IAER,CAACA,EACH,KAEJ,CACAjC,GAAe1J,CAAK,EAEpB,IAAM+N,EAAUC,IAAYhO,EAAO6I,EAAQgF,EAAS3J,EAAS0J,CAAO,EACpE,OAAAK,IAAgBjO,CAAK,EAErB0J,GAAe1J,CAAK,EACb+N,CACT,CAKO,SAASG,IAAYlO,EAAsB,CAChD,IAAMmO,EAAS,gBAAgBnO,CAAK,EACpCoE,GAAO+J,CAAM,EACb,IAAMC,EAAM,IAAI,IAAIpO,EAAM,SAAS,IAAKK,GAAW,CAACA,EAAO,GAAIA,EAAO,EAAE,CAAC,CAAC,EACpEgO,EAAM,IAAI,IAAIF,EAAO,SAAS,IAAK9N,GAAW,CAACA,EAAO,GAAIA,EAAO,EAAE,CAAC,CAAC,EACrEiO,EAAO,IAAI,IAAIH,EAAO,MAAM,IAAK5N,GAASA,EAAK,EAAE,CAAC,EACxD,OAAOP,EAAM,MAAM,OAChBO,GACC,CAAC+N,EAAK,IAAI/N,EAAK,EAAE,GACjB,CAACA,EAAK,EAAGA,EAAK,CAAC,EAAE,KAAMH,GAAO,CAC5B,IAAMyI,EAASuF,EAAI,IAAIhO,CAAE,EACnBmO,EAAQF,EAAI,IAAIjO,CAAE,EACxB,MAAO,CAACyI,GAAU,CAAC0F,GAAS5L,GAASkG,EAAQ0F,CAAK,EAAIhP,EACxD,CAAC,CACL,EAAE,MACJ,CAEA,SAASyO,IACPhO,EACA6I,EACAgF,EACA3J,EACA0J,EACS,CACT,IAAM/L,EAAQK,GAAUlC,CAAK,EACvBwO,EAAS3M,EAAM,OACf4M,EAAWD,EAAO,IAAKtJ,GAAUwJ,GAAQxJ,EAAM,OAAO,CAAC,EACvDyJ,EAAU,CAACxN,EAAeqD,IAC9BoK,GAAYH,EAAStN,CAAK,EAAeqD,CAAO,EAE5CqK,EAA4D,CAAC,EACnE,OAAW,CAAClO,EAAM6D,CAAO,IAAKqE,EACxBrE,EAAQ,OAAS,GAGrBgK,EAAO,QAAQ,CAAC,EAAGrN,IAAU,CAC3B,IAAMiM,EAAUuB,EAAQxN,EAAOqD,CAAO,EAClC4I,EAAU,GACZyB,EAAM,KAAK,CAAE,KAAAlO,EAAM,MAAOQ,EAAO,QAAAiM,CAAQ,CAAC,CAE9C,CAAC,EAEHyB,EAAM,KACJ,CAACtJ,EAAKC,IACJ,EAAOA,EAAI,OAASoI,EAAQ,MAAQ,EAAOrI,EAAI,OAASqI,EAAQ,OAChEpI,EAAI,QAAUD,EAAI,UACjBA,EAAI,KAAOC,EAAI,KAAO,GAAK,EAChC,EACA,IAAMsJ,EAAY,IAAI,IAChBC,EAAY,IAAI,IACtB,QAAWC,KAAQH,EACbC,EAAU,IAAIE,EAAK,IAAI,GAAKD,EAAU,IAAIC,EAAK,KAAK,IAGxDF,EAAU,IAAIE,EAAK,KAAMA,EAAK,KAAK,EACnCD,EAAU,IAAIC,EAAK,MAAOA,EAAK,IAAI,GAGrC,OAAW,CAACrO,CAAI,IAAKmO,EAAW,CAC9B,IAAMG,EAASpB,EAAQ,IAAIlN,CAAI,EAC3BsO,GAAU,CAACjP,EAAM,MAAM,KAAMoD,GAAcA,EAAU,KAAOzC,CAAI,GAClEX,EAAM,MAAM,KAAKiP,CAAM,CAE3B,CACA,IAAMC,EAAO,IAAI,IAAIlP,EAAM,MAAM,IAAKW,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,EACzDwO,EAAoB,CAAC,EACvBC,EAAyB,KAEvBC,EAAU,IAAI,IAGhBC,EAAa,GACjB,GAAI1B,EAAQ,MAAO,CACjB,IAAI2B,EAAO,EACXf,EAAO,QAAQ,CAACtJ,EAAO/D,IAAU,CAC/B,IAAMkL,EAASsC,EAAQxN,EAAOyM,EAAQ,OAAO,SAAW,CAAC,CAAC,EACtDvB,GAAUnH,EAAM,KAAO,GAAKmH,EAASkD,IACvCA,EAAOlD,EACPiD,EAAanO,EAEjB,CAAC,CACH,CAEAqN,EAAO,QAAQ,CAACtJ,EAAO/D,IAAU,CAC/B,IAAMqO,EAAQT,EAAU,IAAI5N,CAAK,EACjC,GAAIqO,IAAU,OAAW,CACnBrO,IAAUmO,IACZF,EAAUI,GAEZ,MACF,CAGA,IAAMC,EAAS5N,EAAM,WAAW,IAAIV,CAAK,EACzC,GAAIsO,IAAW,QAAaV,EAAU,IAAIU,CAAM,EAC9C,OAEF,IAAIpG,EAAwB,KACxBqG,EAAY,EAChB,QAAWV,KAAQH,EACbG,EAAK,QAAU7N,IACjBuO,GAAaV,EAAK,QACd3F,IAAW,OACbA,EAAS2F,EAAK,OAIpB,IAAMW,EAAYzL,EAAQ,OACxB,CAAC0L,EAAOpL,IAAYoL,EAAQjB,EAAQxN,EAAOqD,CAAO,EAClD,CACF,EACMqL,EACJjC,EAAQ,OAASe,EAAQxN,EAAOyM,EAAQ,MAAM,OAAO,GAAK1I,EAAM,KAAO,EACrEF,EAA+B,KACnC,GAAI7D,IAAUmO,GAAcO,EAC1B7K,EAAS,CAAE,GAAI4I,EAAQ,OAAO,QAAU,CAAC,CAAG,EACxCzM,IAAUmO,IACZtK,EAAO,KAAO,YAEP0K,EAAYxK,EAAM,KAAO,GAAKwK,GAAaC,GAAatG,EAAQ,CACzE,IAAM7B,EAAO0H,EAAK,IAAI7F,CAAM,EAC5BrE,EAASwC,EACL,CACE,UAAWA,EAAK,UAChB,OAAQA,EAAK,OACb,eAAgBA,EAAK,eACrB,GAAIA,EAAK,QACL,CACE,QAASA,EAAK,QACd,YAAaA,EAAK,YAClB,aAAcA,EAAK,aACnB,aAAcA,EAAK,aACnB,cAAeA,EAAK,aACtB,EACA,CAAC,EACL,GAAIA,EAAK,aAAe,KACpB,CAAE,YAAaA,EAAK,WAAY,EAChC,CAAC,CACP,EACA,CAAC,CACP,KAAO,IAAImI,EAAYzK,EAAM,KAAO,GAAKA,EAAM,KAAOrF,IACpD,OAEAmF,EAAS,CAAC,EAEZ,IAAM5E,EAAK8C,GAAM,GAAG,EACpBlD,EAAM,MAAM,KAAK,CACf,GAAGoF,IAAUhF,EAAI8E,EAAM,IAAI,EAC3B,GAAGF,EACH,GAAA5E,EACA,SAAU8E,EAAM,IAClB,CAAC,EACD6J,EAAU,IAAI5N,EAAOf,CAAE,EACnBiJ,GACFgG,EAAQ,IAAIjP,EAAIiJ,CAAM,EAEpBlI,IAAUmO,EACZF,EAAUhP,EAEV+O,EAAQ,KAAK/O,CAAE,CAEnB,CAAC,EAED,QAAWO,KAAQX,EAAM,MAAO,CAC9B,IAAMmB,EAAQ2N,EAAU,IAAInO,EAAK,EAAE,EAC7BmP,EACJ3O,IAAU,OAAY,KAAQqN,EAAOrN,CAAK,EAAyB,KACjE2O,GAAQ,CAACxK,IAAU3E,EAAK,SAAUmP,CAAI,IACxCnP,EAAK,SAAW,CAAC,GAAGmP,CAAI,EAE5B,CAGA,IAAMpJ,EAAQ,IAAI,IAAI1G,EAAM,MAAM,IAAKW,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,EAChE,OAAW,CAACP,EAAIiJ,CAAM,IAAKgG,EAAS,CAClC,IAAMrN,EAAO+N,IAAU/P,EAAO0G,EAAM,IAAItG,CAAE,GAAG,UAAY,CAAC,CAAC,EACrD4P,EAASD,IAAU/P,EAAO0G,EAAM,IAAI2C,CAAM,GAAG,UAAY,CAAC,CAAC,EACjE,QAAWpJ,KAAWF,GAAKC,CAAK,EAE5BC,EAAQ,OAASoJ,GACjBrH,EAAK,IAAI/B,EAAQ,IAAI,GACrB,CAAC+P,EAAO,IAAI/P,EAAQ,IAAI,IAExBA,EAAQ,KAAOG,EAGrB,CAGA,OAAW,CAACoG,EAAQhC,CAAO,IAAKqE,EAAQ,CACtC,GAAIiG,EAAU,IAAItI,CAAM,EACtB,SAEF,IAAIyJ,EACAV,EAAO,EACXf,EAAO,QAAQ,CAACzI,EAAGlF,IAAO,CACxB,IAAMuM,EAAU5I,EAAQ,QAAU,EAAImK,EAAQ9N,EAAI2D,CAAO,EAAI,EACvDgL,EAAQT,EAAU,IAAIlO,CAAE,EAC1B2O,GAASA,IAAUhJ,GAAU4G,EAAUmC,IACzCA,EAAOnC,EACP6C,EAAOT,EAEX,CAAC,EACD,QAAWvP,IAAW,CAAC,GAAGD,EAAM,SAAU,GAAGD,GAAKC,CAAK,CAAC,EAClDC,EAAQ,OAASuG,GAAUyJ,IAC7BhQ,EAAQ,KAAOgQ,GAGnBjQ,EAAM,MAAQA,EAAM,MAAM,OAAQoD,GAAcA,EAAU,KAAOoD,CAAM,CACzE,CAEA,MAAO,CAAE,QAAA4I,EAAS,QAAAD,CAAQ,CAC5B,CAGA,SAASY,IAAU/P,EAAc8P,EAAsC,CACrE,IAAM5J,EAAQ,IAAI,IAClB,OAAA4J,EAAK,QAAQ,CAACzP,EAAQc,IAAU,CAC9B,IAAMZ,EAAOO,GAASd,EAAOK,EAAQyP,GAAM3O,EAAQ,GAAK2O,EAAK,MAAM,GAAK,EAAE,EACtEvP,GACF2F,EAAM,IAAI3F,EAAK,EAAE,CAErB,CAAC,EACM2F,CACT,CAGA,SAAS+H,IAAgBjO,EAAoB,CAC3C,GAAI,CAACA,EAAM,MAAM,KAAMO,GAASA,EAAK,YAAca,EAAK,EACtD,OAEF,IAAMS,EAAQK,GAAUlC,CAAK,EAC7B,QAAWO,KAAQP,EAAM,MAAO,CAC9B,GAAIO,EAAK,YAAca,GACrB,SAEF,IAAMgB,EAAQP,EAAM,MAAM,IAAItB,EAAK,EAAE,GAAK,CAAC,GAAI,EAAE,EACjDA,EAAK,UAAY6B,EAAM,SAAS,EAAE,EAC9B3C,IACAC,EACN,CACF,CAIO,SAASgK,GAAe1J,EAAoB,CACjD,IAAM+D,EAAM,IAAI,IAAI/D,EAAM,SAAS,IAAKK,GAAWA,EAAO,EAAE,CAAC,EAC7D,QAAWM,KAAQX,EAAM,MACvBW,EAAK,SAAWA,EAAK,SAAS,OAC5B,CAACN,EAAQc,IACP4C,EAAI,IAAI1D,CAAM,GACdA,IAAWM,EAAK,UAAUQ,EAAQ,GAAKR,EAAK,SAAS,MAAM,CAC/D,EAEFX,EAAM,MAAQA,EAAM,MAAM,OAAQW,GAAS,IAAI,IAAIA,EAAK,QAAQ,EAAE,MAAQ,CAAC,EAE3EX,EAAM,MAAQA,EAAM,MAAM,OACvBO,GAASA,EAAK,IAAMA,EAAK,GAAKwD,EAAI,IAAIxD,EAAK,CAAC,GAAKwD,EAAI,IAAIxD,EAAK,CAAC,CAClE,EACAoJ,IAAe3J,CAAK,EAEpB,IAAMkQ,EAAU,IAAI,IAAIlQ,EAAM,MAAM,IAAKO,GAASA,EAAK,EAAE,CAAC,EAC1DP,EAAM,SAAWA,EAAM,SAAS,OAAQyD,GACtCyM,EAAQ,IAAIzM,EAAQ,IAAI,CAC1B,EAEA,IAAM0M,EAAO,IAAI,IACjB,QAAW5P,KAAQP,EAAM,MACvBmQ,EAAK,IAAI5P,EAAK,CAAC,EACf4P,EAAK,IAAI5P,EAAK,CAAC,EAEjB,QAAWI,KAAQX,EAAM,MACvB,QAAWI,KAAMO,EAAK,SACpBwP,EAAK,IAAI/P,CAAE,EAGfJ,EAAM,SAAWA,EAAM,SAAS,OAAQK,GAAW8P,EAAK,IAAI9P,EAAO,EAAE,CAAC,CACxE,CCluDO,IAAM+P,GAAmB,CAC9B,KAAM,CAAE,MAAO,IAAK,OAAQ,KAAM,KAAM,IAAK,EAC7C,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,KAAM,GAAI,EAC/C,QAAS,CAAE,MAAO,IAAK,OAAQ,KAAM,KAAM,IAAK,CAClD,EAWO,SAASC,GAAUC,EAAUC,EAAqB,CACvD,IAAMC,EAASC,GAASH,EAAGC,CAAC,EACtBG,EAAKF,IAAW,EAAI,GAAKD,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKE,EACxCG,EAAKH,IAAW,EAAI,GAAKD,EAAE,CAAC,EAAID,EAAE,CAAC,GAAKE,EAC9C,MAAO,CACL,OAAQF,EACR,GAAAI,EACA,GAAAC,EACA,OAAAH,EACA,SAAW,KAAK,MAAMG,EAAID,CAAE,EAAI,IAAO,KAAK,EAC9C,CACF,CAEO,SAASE,GAAWN,EAAUC,EAAUM,EAAyB,CACtE,IAAMC,EAAQT,GAAUC,EAAGC,CAAC,EAC5B,MAAO,CACLO,EAAM,OAAO,CAAC,EAAIA,EAAM,GAAKD,EAC7BC,EAAM,OAAO,CAAC,EAAIA,EAAM,GAAKD,CAC/B,CACF,CAIO,SAASE,IACdT,EACAC,EACAS,EACe,CACf,IAAMR,EAASH,GAAUC,EAAGC,CAAC,EAAE,OAC/B,OAAIS,EAAQ,MAAQR,EACX,KAEF,KAAK,MACV,KAAK,IAAI,EAAG,KAAK,IAAIA,EAASQ,EAAQ,MAAOA,EAAQ,MAAM,CAAC,CAC9D,CACF,CAGO,SAASC,GACdX,EACAC,EACAW,EACkB,CAClB,IAAMV,EAASH,GAAUC,EAAGC,CAAC,EAAE,OACzBY,EAAOD,EACV,IAAKF,GAAY,CAChB,IAAMI,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAIZ,EAAQQ,EAAQ,MAAM,CAAC,EAC1D,MAAO,CACLI,EACA,KAAK,IAAIA,EAAO,KAAK,IAAIZ,EAAQQ,EAAQ,OAASA,EAAQ,KAAK,CAAC,CAClE,CACF,CAAC,EACA,KAAK,CAACK,EAAMC,KAAWD,EAAK,CAAC,GAAK,IAAMC,EAAM,CAAC,GAAK,EAAE,EAEnDC,EAA6B,CAAC,EAChCC,EAAS,EACb,QAAWC,KAAON,EAAM,CACtB,GAAM,CAACC,EAAOM,CAAG,EAAID,EACjBL,EAAQI,GACVD,EAAS,KAAK,CAACX,GAAWN,EAAGC,EAAGiB,CAAM,EAAGZ,GAAWN,EAAGC,EAAGa,CAAK,CAAC,CAAC,EAEnEI,EAAS,KAAK,IAAIA,EAAQE,CAAG,CAC/B,CACA,OAAIF,EAAShB,GACXe,EAAS,KAAK,CAACX,GAAWN,EAAGC,EAAGiB,CAAM,EAAGZ,GAAWN,EAAGC,EAAGC,CAAM,CAAC,CAAC,EAE7De,CACT,CAIO,SAASI,GAAkBC,EAAoB,CACpD,IAAMC,EAAQ,IAAI,IAAID,EAAM,MAAM,IAAKE,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,EAChEF,EAAM,SAAWA,EAAM,SAAS,OAAQZ,GAAY,CAClD,IAAMc,EAAOD,EAAM,IAAIb,EAAQ,IAAI,EAC7Be,EAAOD,EAAOE,GAASJ,EAAOE,CAAI,EAAI,KAC5C,GAAI,CAACC,EACH,MAAO,GAET,IAAME,EAASlB,IAAcgB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGf,CAAO,EACtD,OAAIiB,IAAW,KACN,IAETjB,EAAQ,OAASiB,EACV,GACT,CAAC,CACH,CAWO,SAASC,GACdC,EACAP,EACAQ,EACAC,EACoB,CACpB,IAAIC,EAEO,KACX,QAAWR,KAAQF,EAAM,MAAO,CAC9B,IAAMG,EAAOC,GAASJ,EAAOE,CAAI,EACjC,GAAI,CAACC,EACH,SAEF,IAAMQ,EAAaC,GAAiBL,EAAOJ,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC3D,GAAI,EAAAQ,EAAW,SAAWF,KAGtBC,IAAS,MAAQC,EAAW,SAAWD,EAAK,UAAU,CACxD,IAAMxB,EAAQT,GAAU0B,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACxCO,EAAO,CACL,KAAAR,EACA,KAAAC,EACA,OAAQQ,EAAW,EAAIzB,EAAM,OAC7B,SAAUyB,EAAW,QACvB,CACF,CACF,CACA,GAAI,CAACD,EACH,OAAO,KAET,IAAM9B,EAASH,GAAUiC,EAAK,KAAK,CAAC,EAAGA,EAAK,KAAK,CAAC,CAAC,EAAE,OACrD,GAAIF,EAAQ5B,EACV,OAAO,KAET,IAAMyB,EAAS,KAAK,MAClB,KAAK,IAAI,EAAG,KAAK,IAAIzB,EAAS4B,EAAOE,EAAK,OAASF,EAAQ,CAAC,CAAC,CAC/D,EACA,MAAO,CAAE,KAAME,EAAK,KAAM,KAAMA,EAAK,KAAM,OAAAL,CAAO,CACpD,CAKO,SAASQ,GACdzB,EACAI,EACAM,EACoB,CACpB,GAAIV,EAAQ,OAAQ,CAClB,IAAM0B,GAAUtB,EAAQM,GAAO,EAC/B,MAAO,CACL,CAACN,EAAOsB,CAAM,EACd,CAAChB,EAAKgB,CAAM,CACd,CACF,CACA,OAAO1B,EAAQ,KAAO,CAAC,CAACU,EAAKN,CAAK,CAAC,EAAI,CAAC,CAACA,EAAOM,CAAG,CAAC,CACtD,CC1KO,IAAMiB,GAAcC,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CAAC,EAE9CC,IAAeD,EAAE,OAAO,CACnC,GAAIA,EAAE,OAAO,EACb,GAAID,EACN,CAAC,EAEYG,IAAaF,EAAE,OAAO,CACjC,GAAIA,EAAE,OAAO,EACb,EAAGA,EAAE,OAAO,EACZ,EAAGA,EAAE,OAAO,EACZ,UAAWA,EAAE,OAAO,EAEpB,OAAQA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EACvC,MAAOA,EAAE,QAAQ,EAAE,QAAQ,EAAK,CAClC,CAAC,EAEYG,IAAgBH,EAAE,OAAO,CACpC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,KAAK,CAAC,OAAQ,SAAU,SAAS,CAAC,EAC1C,OAAQA,EAAE,OAAO,EACjB,MAAOA,EAAE,OAAO,EAChB,OAAQA,EAAE,OAAO,EACjB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,MAAOA,EAAE,KAAK,CAAC,OAAQ,QAAS,MAAM,CAAC,EACvC,KAAMA,EAAE,QAAQ,EAChB,OAAQA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EACvC,KAAMA,EACH,KAAK,CAAC,OAAQ,MAAO,SAAU,QAAS,OAAQ,SAAU,OAAO,CAAC,EAClE,SAAS,EACZ,WAAYA,EAAE,OAAO,EAAE,SAAS,EAChC,WAAYA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC3C,YAAaA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC5C,QAASA,EAAE,KAAK,CAAC,OAAQ,WAAY,UAAU,CAAC,EAAE,SAAS,EAC3D,OAAQA,EAAE,QAAQ,EAAE,SAAS,EAC7B,QAASA,EAAE,QAAQ,EAAE,SAAS,EAC9B,OAAQA,EAAE,QAAQ,EAAE,SAAS,EAE7B,QAASA,EAAE,QAAQ,EAAE,SAAS,EAE9B,OAAQA,EAAE,QAAQ,EAAE,SAAS,CAC/B,CAAC,EAEYI,IAAaJ,EAAE,OAAO,CACjC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,EACf,UAAWA,EAAE,OAAO,EACpB,SAAUA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAC5B,eAAgBA,EAAE,OAAO,EAAE,SAAS,EACpC,OAAQA,EAAE,QAAQ,EAAE,QAAQ,EAAI,EAIhC,QAASA,EAAE,KAAK,CAAC,OAAQ,SAAU,WAAW,CAAC,EAAE,SAAS,EAC1D,YAAaA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC5C,aAAcA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC7C,aAAcA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC7C,cAAeA,EAAE,QAAQ,EAAE,SAAS,EAEpC,YAAaA,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAC5C,MAAOA,EAAE,OAAO,EAAE,SAAS,EAC3B,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,MAAOA,EAAE,OAAO,EAAE,SAAS,EAC3B,QAASA,EAAE,OAAO,EAAE,SAAS,CAC/B,CAAC,EAGYK,IAAiB,CAAC,KAAM,KAAM,KAAM,KAAM,IAAI,EAG9CC,IAAiBN,EAAE,OAAO,CACrC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,QAAQ,UAAU,EAC1B,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,OAAQA,EAAE,OAAO,EACjB,OAAQA,EAAE,OAAO,EACjB,OAAQA,EAAE,OAAO,EACjB,KAAMA,EAAE,KAAKK,GAAc,CAC7B,CAAC,EAEYE,IAAmBP,EAAE,OAAO,CACvC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,QAAQ,YAAY,EAC5B,KAAMA,EAAE,OAAO,EAEf,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,OAAQA,EAAE,KAAK,CAAC,OAAQ,MAAM,CAAC,CACjC,CAAC,EAEYQ,IAAgBR,EAAE,mBAAmB,OAAQ,CACxDM,IACAC,GACF,CAAC,EAOYE,IAAsBT,EAAE,OAAO,CAC1C,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,QAAQ,gBAAgB,EAChC,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,OAAQA,EAAE,OAAO,EACjB,OAAQA,EAAE,OAAO,EACjB,MAAOA,EAAE,OAAO,CAClB,CAAC,EAIYU,IAAiBV,EAAE,OAAO,CACrC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,QAAQ,WAAW,EAC3B,QAASA,EAAE,MAAMD,EAAW,EAC5B,MAAOC,EAAE,OAAO,EAAE,SAAS,EAC3B,KAAMA,EAAE,OAAO,EAAE,SAAS,CAC5B,CAAC,EAEYW,IAAgBX,EAAE,mBAAmB,OAAQ,CACxDS,IACAC,GACF,CAAC,EAGYE,GAAgB,CAC3B,WAAY,aACZ,WAAY,aACZ,SAAU,qBACV,UAAW,YACX,SAAU,WACV,YAAa,cACb,KAAM,OACN,KAAM,OACN,OAAQ,QACV,EAUaC,IAAgBb,EAAE,OAAO,CACpC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,KAAK,OAAO,KAAKY,EAAa,CAAoC,EAC1E,KAAMZ,EAAE,OAAO,EAAE,SAAS,EAC1B,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,GAAID,GAAY,SAAS,EACzB,MAAOC,EACJ,OAAOA,EAAE,OAAO,EAAGA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,EAAGA,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjE,SAAS,CACd,CAAC,EAEYc,GAAcd,EAAE,OAAO,CAClC,OAAQA,EAAE,QAAQ,CAAC,EACnB,MAAOA,EAAE,QAAQ,IAAI,EACrB,SAAUA,EAAE,MAAMC,GAAY,EAC9B,MAAOD,EAAE,MAAME,GAAU,EACzB,SAAUF,EAAE,MAAMG,GAAa,EAC/B,MAAOH,EAAE,MAAMI,GAAU,EACzB,SAAUJ,EAAE,MAAMQ,GAAa,EAAE,QAAQ,CAAC,CAAC,EAE3C,SAAUR,EAAE,MAAMW,GAAa,EAAE,SAAS,EAE1C,SAAUX,EAAE,MAAMa,GAAa,EAAE,SAAS,CAC5C,CAAC,EAEYE,IAA2Bf,EAAE,mBAAmB,OAAQ,CACnEA,EAAE,OAAO,CAAE,KAAMA,EAAE,QAAQ,OAAO,EAAG,GAAID,EAAY,CAAC,EACtDC,EAAE,OAAO,CAAE,KAAMA,EAAE,QAAQ,MAAM,EAAG,OAAQA,EAAE,MAAMD,EAAW,EAAE,IAAI,CAAC,CAAE,CAAC,EACzEC,EAAE,OAAO,CAAE,KAAMA,EAAE,QAAQ,MAAM,EAAG,QAASA,EAAE,MAAMD,EAAW,EAAE,IAAI,CAAC,CAAE,CAAC,CAC5E,CAAC,EAEYiB,GAAmBhB,EAAE,OAAO,CACvC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,EAEf,QAASA,EAAE,OAAO,EAElB,OAAQA,EAAE,OAAO,EAAE,SAAS,EAC5B,SAAUe,IACV,MAAOf,EAAE,OAAO,EAChB,MAAOA,EAAE,OAAO,EAChB,OAAQA,EAAE,KAAK,CAAC,WAAY,YAAa,UAAU,CAAC,EACpD,QAASA,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAK,EAC7C,MAAOA,EAAE,OAAO,EAChB,SAAUA,EAAE,OAAO,EAAE,SAAS,EAC9B,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,IAAKA,EAAE,OAAO,CAChB,CAAC,EAEYiB,GAAcjB,EAAE,OAAO,CAClC,GAAIA,EAAE,OAAO,EACb,IAAKA,EAAE,OAAO,EACd,SAAUA,EAAE,OAAO,EACnB,UAAWA,EAAE,OAAO,EACpB,KAAMA,EAAE,OAAO,EACf,SAAUA,EAAE,QAAQ,EACpB,gBAAiBA,EAAE,OAAO,EAAE,SAAS,EACrC,YAAaA,EAAE,OAAO,EACtB,YAAaA,EAAE,OAAO,EACtB,aAAcA,EAAE,OAAO,EACvB,QAASA,EAAE,OAAO,EAClB,OAAQA,EAAE,QAAQ,EAClB,OAAQA,EAAE,QAAQ,EAClB,MAAOA,EAAE,OAAO,CAClB,CAAC,EAEYkB,GAAclB,EAAE,OAAO,CAClC,GAAIA,EAAE,OAAO,EACb,MAAOA,EAAE,OAAO,EAChB,KAAMA,EAAE,OAAO,EACf,kBAAmBA,EAAE,OAAO,EAC5B,QAASA,EAAE,OAAO,EAClB,MAAOc,GACP,OAAQd,EAAE,MAAMiB,EAAW,EAC3B,YAAajB,EAAE,MAAMgB,EAAgB,EACrC,IAAKhB,EAAE,OAAO,EACd,UAAWA,EAAE,OAAO,CACtB,CAAC,EAEYmB,IAAgBnB,EAAE,OAAO,CACpC,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,IAAKA,EAAE,OAAO,EAAE,SAAS,EAEzB,OAAQA,EAAE,OAAO,EAAE,SAAS,CAC9B,CAAC,EAEYoB,GAAmBpB,EAAE,OAAO,CACvC,GAAIA,EAAE,OAAO,EACb,OAAQA,EAAE,OAAO,EACjB,QAASA,EAAE,KAAK,CAAC,OAAQ,SAAU,OAAQ,QAAS,MAAM,CAAC,EAC3D,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,QAAQ,CAAC,EACtC,WAAYA,EAAE,QAAQ,EACtB,IAAKA,EAAE,OAAO,CAChB,CAAC,EAGYqB,IAAwBR,IAAc,OAAO,CACxD,MAAOb,EAAE,OAAO,CAClB,CAAC,EAEYsB,IAAyBtB,EAAE,OAAO,CAC7C,IAAKA,EAAE,MAAMqB,GAAqB,EAAE,QAAQ,CAAC,CAAC,EAC9C,OAAQrB,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CACxC,CAAC,EAEYuB,GAAsBvB,EAAE,OAAO,CAC1C,GAAIA,EAAE,OAAO,EACb,OAAQA,EAAE,OAAO,EACjB,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAE3B,OAAQA,EACL,MAAMA,EAAE,OAAO,CAAE,KAAMA,EAAE,OAAO,EAAG,MAAOA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAE,CAAC,CAAC,EAChE,QAAQ,CAAC,CAAC,EAEb,QAASA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,MAAMA,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAE5D,SAAUsB,IAAuB,SAAS,EAE1C,QAAStB,EAAE,MAAMA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAC5D,QAASA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,QAAQ,CAAC,EACzC,YAAaA,EAAE,QAAQ,EACvB,IAAKA,EAAE,OAAO,CAChB,CAAC,EAGYwB,GAAwBxB,EAAE,OAAO,CAC5C,SAAUA,EAAE,OAAO,CACjB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,WAAYA,EAAE,KAAK,CAAC,OAAQ,KAAM,KAAM,IAAI,CAAC,EAC7C,YAAaA,EAAE,OAAO,EACtB,OAAQA,EAAE,KAAK,CAAC,OAAQ,WAAY,WAAW,CAAC,EAChD,iBAAkBA,EAAE,OAAO,EAAE,SAAS,EACtC,WAAYA,EACT,KAAK,CAAC,OAAQ,UAAW,gBAAiB,WAAY,UAAU,CAAC,EACjE,SAAS,EACZ,SAAUA,EACP,KAAK,CACJ,WACA,YACA,YACA,YACA,YACA,WACF,CAAC,EACA,SAAS,EACZ,SAAUA,EAAE,KAAK,CAAC,YAAa,UAAW,SAAS,CAAC,EACpD,KAAMA,EAAE,KAAK,CAAC,OAAQ,OAAQ,MAAM,CAAC,EACrC,YAAaA,EAAE,KAAK,CAAC,UAAW,UAAW,MAAM,CAAC,EAClD,gBAAiBA,EAAE,OAAO,EAC1B,QAASA,EAAE,KAAK,CAAC,WAAY,UAAW,cAAc,CAAC,EACvD,UAAWA,EAAE,OAAO,EACpB,SAAUA,EAAE,OAAO,EACnB,SAAUA,EAAE,OAAO,EACnB,aAAcA,EAAE,KAAK,CAAC,MAAO,MAAM,CAAC,EACpC,oBAAqBA,EAAE,QAAQ,EAC/B,iBAAkBA,EAAE,OAAO,EAC3B,SAAUA,EAAE,KAAK,CAAC,YAAa,YAAY,CAAC,EAE5C,OAAQA,EAAE,OAAO,EAEjB,eAAgBA,EAAE,OAAO,EAAE,QAAQ,GAAG,CACxC,CAAC,EACD,SAAUA,EAAE,OAAO,CACjB,SAAUA,EAAE,OAAO,EACnB,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,YAAaA,EAAE,QAAQ,CACzB,CAAC,EACD,cAAeA,EAAE,OAAO,EACxB,aAAcA,EAAE,OAAO,EACvB,IAAKA,EAAE,OAAO,CAChB,CAAC,EAGYyB,IAAmBzB,EAAE,OAAO,CACvC,IAAKA,EAAE,OAAO,EACd,MAAOA,EAAE,OAAO,EAChB,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,QAAQ,CAAC,EAEtC,QAASA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CAAC,CAAC,CACjE,CAAC,EAGY0B,IAAiB1B,EAAE,OAAO,CACrC,QAASA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CAAC,CAAC,EAC/D,SAAUA,EAAE,QAAQ,EAEpB,MAAOA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,MAAMyB,GAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC,EAEjE,MAAOzB,EAAE,QAAQ,EACjB,IAAKA,EAAE,OAAO,EAEd,SAAUA,EAAE,OAAO,EAAE,QAAQ,EAAE,EAE/B,SAAUA,EAAE,QAAQ,EAAE,QAAQ,EAAK,EACnC,QAASA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,MAAM,CAACA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAC3E,YAAaA,EAAE,OAAO,EAAE,QAAQ,EAAE,CACpC,CAAC,EAGY2B,GAA2B3B,EAAE,OAAO,CAC/C,SAAUA,EAAE,OAAO,CACjB,SAAUA,EAAE,KAAK,CAAC,OAAQ,WAAY,MAAM,CAAC,EAC7C,kBAAmBA,EAAE,KAAK,CAAC,OAAQ,MAAO,IAAI,CAAC,EAC/C,MAAOA,EAAE,QAAQ,EACjB,UAAWA,EAAE,QAAQ,EACrB,iBAAkBA,EAAE,QAAQ,CAC9B,CAAC,EACD,SAAUA,EAAE,OAAO,EACnB,IAAKA,EAAE,OAAO,EAEd,WAAYA,EAAE,OAAO,EAAE,SAAS,CAClC,CAAC,EAEY4B,GAAe5B,EAAE,OAAO,CACnC,GAAIA,EAAE,OAAO,EACb,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,OAAO,EAElB,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,OAAQA,EAAE,MAAMkB,EAAW,EAC3B,SAAUlB,EAAE,MAAMmB,GAAa,EAC/B,aAAcnB,EAAE,MAAMoB,EAAgB,EACtC,WAAYpB,EAAE,OAAO,EACrB,gBAAiBA,EAAE,OAAO,EAC1B,WAAYA,EAAE,OAAO,EAErB,cAAeA,EAAE,OAAO,EAAE,QAAQ,EAAE,EACpC,mBAAoBA,EAAE,OAAO,EAC7B,aAAcA,EAAE,OAAO,EACvB,aAAcA,EAAE,OAAO,EACvB,qBAAsBA,EAAE,OAAO,EAC/B,iBAAkBA,EAAE,OAAO,EAC3B,cAAeA,EAAE,OAAO,EACxB,YAAaA,EAAE,OAAO,EACtB,iBAAkBA,EAAE,OAAO,EAC3B,qBAAsBA,EAAE,OAAO,EAC/B,SAAUA,EAAE,MAAMuB,EAAmB,EAAE,QAAQ,CAAC,CAAC,EACjD,aAAcvB,EAAE,OAAO,EAAE,QAAQ,EAAE,EACnC,qBAAsBA,EAAE,OAAO,EAC/B,cAAeA,EAAE,OAAO,EACxB,qBAAsBA,EAAE,OAAO,EAC/B,iBAAkBA,EACf,OAAO,CAAE,OAAQA,EAAE,OAAO,EAAG,SAAUA,EAAE,QAAQ,EAAG,QAASA,EAAE,OAAO,CAAE,CAAC,EACzE,SAAS,EACT,QAAQ,IAAI,EACf,UAAWwB,GAAsB,SAAS,EAAE,QAAQ,IAAI,EACxD,YAAaG,GAAyB,SAAS,EAAE,QAAQ,IAAI,EAE7D,UAAW3B,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,EAE7C,cAAeA,EAAE,OAAO,EAAE,QAAQ,CAAC,EACnC,gBAAiBA,EAAE,OAAO,EAAE,QAAQ,EAAE,EACtC,SAAU0B,IAAe,SAAS,EAAE,QAAQ,IAAI,EAEhD,UAAW1B,EAAE,OAAO,EAAE,QAAQ,EAAE,CAClC,CAAC,EAEY6B,IAAiB7B,EAAE,OAAO,CACrC,GAAIA,EAAE,OAAO,EACb,OAAQA,EAAE,OAAO,EACjB,KAAMA,EAAE,OAAO,EACf,QAASA,EAAE,OAAO,EAClB,WAAYA,EAAE,OAAO,EAAE,SAAS,EAEhC,QAASA,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CAC7C,CAAC,EAEY8B,IAAoB9B,EAAE,OAAO,CACxC,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,OAAO,EACf,MAAOA,EAAE,OAAO,EAEhB,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,SAAUA,EAAE,OAAO,EAAE,SAAS,EAC9B,QAASA,EAAE,OAAO,EAAE,SAAS,EAC7B,gBAAiBA,EAAE,OAAO,EAAE,SAAS,EACrC,QAASA,EAAE,OAAO,EAClB,YAAaA,EAAE,OAAO,EACtB,SAAUA,EAAE,OAAO,EACnB,cAAeA,EAAE,OAAO,EAAE,SAAS,EACnC,KAAMA,EAAE,OAAO,EACf,oBAAqBA,EAAE,OAAO,EAAE,SAAS,EACzC,sBAAuBA,EAAE,OAAO,EAAE,SAAS,EAC3C,0BAA2BA,EAAE,OAAO,EAAE,SAAS,EAC/C,MAAOA,EAAE,OAAO,CAClB,CAAC,EAEY+B,GAAiB/B,EAAE,OAAO,CACrC,KAAMA,EAAE,MAAM8B,GAAiB,EAC/B,OAAQ9B,EAAE,OAAO,CACf,QAASA,EAAE,OAAO,EAClB,YAAaA,EAAE,OAAO,EACtB,SAAUA,EAAE,OAAO,EACnB,KAAMA,EAAE,OAAO,EACf,oBAAqBA,EAAE,OAAO,CAChC,CAAC,CACH,CAAC,EAyCM,SAASgC,GAAYC,EAA6B,CACvD,IAAMC,EAAkB,CAAC,EACzB,QAAWC,KAAUF,EAAM,MAAM,SAC/BC,EAAO,KAAKC,EAAO,EAAE,EAEvB,QAAWC,KAAcH,EAAM,YAAa,CAC1C,IAAMI,EAAWD,EAAW,SACxBC,EAAS,OAAS,QACpBH,EAAO,KAAKG,EAAS,EAAE,EACdA,EAAS,OAAS,OAC3BH,EAAO,KAAK,GAAGG,EAAS,MAAM,EAE9BH,EAAO,KAAK,GAAGG,EAAS,OAAO,CAEnC,CACA,GAAM,CAACC,CAAK,EAAIJ,EAChB,GAAII,IAAU,OACZ,OAAO,KAET,IAAMC,EAAiB,CACrB,KAAMD,EAAM,CAAC,EACb,KAAMA,EAAM,CAAC,EACb,KAAMA,EAAM,CAAC,EACb,KAAMA,EAAM,CAAC,CACf,EACA,OAAW,CAACE,EAAGC,CAAC,IAAKP,EACnBK,EAAO,KAAO,KAAK,IAAIA,EAAO,KAAMC,CAAC,EACrCD,EAAO,KAAO,KAAK,IAAIA,EAAO,KAAME,CAAC,EACrCF,EAAO,KAAO,KAAK,IAAIA,EAAO,KAAMC,CAAC,EACrCD,EAAO,KAAO,KAAK,IAAIA,EAAO,KAAME,CAAC,EAEvC,OAAOF,CACT,CC3gBO,IAAMG,GAAU,IAiCvB,SAASC,IACPC,EACAC,EACAC,EACAC,EAAgC,IAAI,IACtB,CACd,IAAIC,EAAqB,KACrBC,EAAMH,EACV,QAAWI,KAAUL,EAAM,SAAU,CACnC,GAAIE,EAAS,IAAIG,EAAO,EAAE,EACxB,SAEF,IAAMC,EAAIC,GAASR,EAAOM,EAAO,EAAE,EAC/BC,EAAIF,IACND,EAAOE,EAAO,GACdD,EAAME,EAEV,CACA,OAAOH,CACT,CAEA,SAASK,IACPT,EACAC,EACAC,EACAC,EAAgC,IAAI,IACtB,CACd,IAAIC,EAAqB,KACrBC,EAAMH,EACV,QAAWQ,KAAQT,EAAM,MAAO,CAC9B,GAAIE,EAAS,IAAIO,EAAK,CAAC,GAAKP,EAAS,IAAIO,EAAK,CAAC,EAC7C,SAEF,IAAMC,EAAOC,GAASX,EAAOS,CAAI,EACjC,GAAI,CAACC,EACH,SAEF,IAAME,EAAaC,GAAiBd,EAAOW,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACvDE,EAAW,SAAWR,IACxBD,EAAOS,EAAW,MAClBR,EAAMQ,EAAW,SAErB,CACA,OAAOT,CACT,CAGA,IAAMW,IAAoB,GAAM,KAAK,GAAM,IAErCC,GAAU,KAAK,GAAK,EAE1B,SAASC,GAAaC,EAAUC,EAAyB,CACvD,OAAID,EAAE,CAAC,IAAMC,EAAE,CAAC,GAAKD,EAAE,CAAC,IAAMC,EAAE,CAAC,EACxB,MAEK,KAAK,MAAMA,EAAE,CAAC,EAAID,EAAE,CAAC,EAAGC,EAAE,CAAC,EAAID,EAAE,CAAC,CAAC,EAChCF,GAAWA,IAAWA,EACzC,CAEA,SAASI,IAASC,EAAcC,EAAwB,CACtD,IAAMjB,EAAM,KAAK,IAAIgB,EAAOC,CAAK,EACjC,OAAO,KAAK,IAAIjB,EAAKW,GAAUX,CAAG,EAAIU,GACxC,CAIO,SAASQ,GAAYC,EAAyC,CACnE,IAAIC,EAAI,EACJC,EAAI,EACR,OAAW,CAACR,EAAGC,CAAC,IAAKK,EAAO,CAC1B,IAAMG,EAAQV,GAAaC,EAAGC,CAAC,EAC/B,GAAIQ,IAAU,KACZ,SAEF,IAAMC,EAASpB,GAASU,EAAGC,CAAC,EAC5BM,GAAKG,EAAS,KAAK,IAAID,EAAQ,CAAC,EAChCD,GAAKE,EAAS,KAAK,IAAID,EAAQ,CAAC,CAClC,CACA,GAAIF,IAAM,GAAKC,IAAM,EACnB,MAAO,GAET,IAAMC,GAAS,KAAK,MAAMD,EAAGD,CAAC,EAAI,EAAIT,IAAWA,GACjD,OAAOI,IAASO,EAAO,CAAC,EAAI,EAAIA,CAClC,CAIO,SAASE,GACd5B,EACA6B,EAA8B,IAAI,IAC1B,CACR,IAAMN,EAA0B,CAAC,EACjC,QAAWd,KAAQT,EAAM,MAAO,CAC9B,IAAMU,EAAOC,GAASX,EAAOS,CAAI,EAC7BC,GAAQ,CAACmB,EAAO,IAAIpB,EAAK,CAAC,GAAK,CAACoB,EAAO,IAAIpB,EAAK,CAAC,GACnDc,EAAM,KAAKb,CAAI,CAEnB,CACA,OAAOY,GAAYC,CAAK,CAC1B,CAGO,SAASO,IAAcb,EAAUC,EAAUlB,EAAuB,CACvE,IAAM0B,EAAQV,GAAaC,EAAGC,CAAC,EAC/B,OAAIQ,IAAU,KACL,GAEF1B,EAAM,MAAM,KAAMS,GAAS,CAChC,IAAMC,EAAOC,GAASX,EAAOS,CAAI,EAC3BsB,EAAQrB,EAAOM,GAAaN,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAI,KACtD,OAAOqB,IAAU,MAAQZ,IAASO,EAAOK,CAAK,CAChD,CAAC,CACH,CAIA,SAASC,IACPjC,EACAkC,EACAjC,EACAkC,EACO,CACP,IAAMhC,EAAW,IAAI,IAAIgC,EAAQ,iBAAmB,CAAC,CAAC,EAChDR,EAAQE,GAAW5B,EAAOE,CAAQ,EAClCiC,EAAe,CAAC,KAAK,IAAIT,CAAK,EAAG,KAAK,IAAIA,CAAK,CAAC,EAChDU,EAAgB,CAAC,CAAC,KAAK,IAAIV,CAAK,EAAG,KAAK,IAAIA,CAAK,CAAC,EAClDW,EAAQ,CAACC,EAAaC,KACzBA,EAAG,CAAC,EAAIN,EAAO,CAAC,GAAKK,EAAK,CAAC,GAAKC,EAAG,CAAC,EAAIN,EAAO,CAAC,GAAKK,EAAK,CAAC,EACxDA,EACJ,KAAK,IAAID,EAAMF,EAAOpC,CAAK,CAAC,GAAK,KAAK,IAAIsC,EAAMD,EAAQrC,CAAK,CAAC,EAC1DoC,EACAC,EACFT,EAAS,KAAK,MAAMU,EAAMC,EAAMvC,CAAK,EAAIF,EAAO,EAAIA,GACpD2C,EAAUN,EAAQ,UACtB,QAAW7B,KAAUL,EAAM,SAAU,CACnC,GAAIE,EAAS,IAAIG,EAAO,EAAE,EACxB,SAEF,IAAMD,EAAM,KAAK,IAAIiC,EAAMC,EAAMjC,EAAO,EAAE,EAAIgC,EAAMC,EAAMvC,CAAK,CAAC,EAC5DK,EAAMoC,IACRA,EAAUpC,EACVuB,EAASU,EAAMC,EAAMjC,EAAO,EAAE,EAElC,CACA,OAAOoC,GAAW,CAChBR,EAAO,CAAC,EAAIK,EAAK,CAAC,EAAIX,EACtBM,EAAO,CAAC,EAAIK,EAAK,CAAC,EAAIX,CACxB,CAAC,CACH,CAEA,SAASc,GAAW1C,EAAqB,CACvC,MAAO,CAAC,KAAK,MAAMA,EAAM,CAAC,CAAC,EAAG,KAAK,MAAMA,EAAM,CAAC,CAAC,CAAC,CACpD,CAEA,SAAS2C,IAAW3C,EAAqB,CACvC,MAAO,CACL,KAAK,MAAMA,EAAM,CAAC,EAAIF,EAAO,EAAIA,GACjC,KAAK,MAAME,EAAM,CAAC,EAAIF,EAAO,EAAIA,EACnC,CACF,CAKO,SAAS8C,GACd5C,EACAC,EACAkC,EACY,CACZ,GAAIA,EAAQ,SACV,MAAO,CAAE,MAAOO,GAAW1C,CAAK,EAAG,KAAM,MAAO,EAElD,GAAImC,EAAQ,OAASA,EAAQ,OAC3B,MAAO,CACL,MAAOF,IAAQjC,EAAOmC,EAAQ,OAAQlC,EAAOkC,CAAO,EACpD,KAAM,MACR,EAEF,IAAMhC,EAAW,IAAI,IAAIgC,EAAQ,iBAAmB,CAAC,CAAC,EAChDU,EAAWV,EAAQ,UAAY,KAC/BW,EAAS/C,IAAcC,EAAOC,EAAOkC,EAAQ,UAAWhC,CAAQ,EACtE,GAAI2C,EACF,MAAO,CAAE,MAAOJ,GAAWI,CAAM,EAAG,KAAM,UAAW,EAEvD,IAAMC,EAAQF,GAAY9C,IAAcC,EAAO6C,EAAUV,EAAQ,SAAS,EAC1E,GAAIY,EACF,MAAO,CAAE,MAAOL,GAAWK,CAAK,EAAG,KAAM,OAAQ,EAEnD,IAAMC,EAASvC,IAAcT,EAAOC,EAAOkC,EAAQ,UAAWhC,CAAQ,EACtE,GAAI6C,EACF,MAAO,CAAE,MAAON,GAAWM,CAAM,EAAG,KAAM,MAAO,EAEnD,IAAMC,EACJJ,GAAYpC,IAAcT,EAAO6C,EAAUV,EAAQ,SAAS,EAC9D,GAAIc,EACF,MAAO,CAAE,MAAOP,GAAWO,CAAQ,EAAG,KAAM,OAAQ,EAGtD,IAAMf,EAASC,EAAQ,OACvB,GAAID,EAAQ,CACV,IAAMgB,EAAKlD,EAAM,CAAC,EAAIkC,EAAO,CAAC,EACxBiB,EAAKnD,EAAM,CAAC,EAAIkC,EAAO,CAAC,EAC9B,GAAI,KAAK,IAAIiB,CAAE,EAAIhB,EAAQ,WAAa,KAAK,IAAIe,CAAE,GAAKf,EAAQ,UAC9D,MAAO,CAAE,MAAOO,GAAW,CAAC1C,EAAM,CAAC,EAAGkC,EAAO,CAAC,CAAC,CAAC,EAAG,KAAM,MAAO,EAElE,GAAI,KAAK,IAAIgB,CAAE,EAAIf,EAAQ,WAAa,KAAK,IAAIgB,CAAE,GAAKhB,EAAQ,UAC9D,MAAO,CAAE,MAAOO,GAAW,CAACR,EAAO,CAAC,EAAGlC,EAAM,CAAC,CAAC,CAAC,EAAG,KAAM,MAAO,EAElE,IAAM4B,EAAS,KAAK,MAAMsB,EAAIC,CAAE,EAChC,GAAIvB,EAAS,EAAG,CACd,IAAMD,EAAQ,KAAK,MAAMwB,EAAID,CAAE,EACzBE,EAAO,KAAK,GAAK,EACjBC,EAAU,KAAK,MAAM1B,EAAQyB,CAAI,EAAIA,EAC3C,GAAI,KAAK,IAAIzB,EAAQ0B,CAAO,EAAIzB,EAASO,EAAQ,UAC/C,MAAO,CACL,MAAOO,GAAW,CAChBR,EAAO,CAAC,EAAI,KAAK,IAAImB,CAAO,EAAIzB,EAChCM,EAAO,CAAC,EAAI,KAAK,IAAImB,CAAO,EAAIzB,CAClC,CAAC,EACD,KAAM,OACR,CAEJ,CACF,CAEA,MAAO,CAAE,MAAOe,IAAW3C,CAAK,EAAG,KAAM,MAAO,CAClD,CAGA,IAAMsD,IAAgB,IAIf,SAASC,IACdtD,EACA6B,EACA0B,EACAtD,EACO,CACP,IAAMyB,EAAQE,GAAW5B,EAAO6B,CAAM,EAChC2B,EAAgB,CACpB,CAAC,KAAK,IAAI9B,CAAK,EAAG,KAAK,IAAIA,CAAK,CAAC,EACjC,CAAC,CAAC,KAAK,IAAIA,CAAK,EAAG,KAAK,IAAIA,CAAK,CAAC,CACpC,EACM+B,EAAQzD,EAAM,SAAS,OAAQK,GAAW,CAACwB,EAAO,IAAIxB,EAAO,EAAE,CAAC,EAChEqD,EAAS1D,EAAM,SAClB,OAAQK,GAAWwB,EAAO,IAAIxB,EAAO,EAAE,CAAC,EACxC,IAAKA,GAAkB,CAACA,EAAO,GAAG,CAAC,EAAIkD,EAAM,CAAC,EAAGlD,EAAO,GAAG,CAAC,EAAIkD,EAAM,CAAC,CAAC,CAAC,EACtEI,EAAgB,CAACJ,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACzC,QAAWjB,KAAQkB,EAAM,CACvB,IAAII,EAAa,EACbpB,EAAUvC,EACd,QAAW4D,KAASH,EAClB,QAAWrD,KAAUoD,EAAO,CAC1B,GAAIlD,GAASsD,EAAOxD,EAAO,EAAE,EAAIgD,IAC/B,SAEF,IAAMjD,GACHC,EAAO,GAAG,CAAC,EAAIwD,EAAM,CAAC,GAAKvB,EAAK,CAAC,GACjCjC,EAAO,GAAG,CAAC,EAAIwD,EAAM,CAAC,GAAKvB,EAAK,CAAC,EAChC,KAAK,IAAIlC,CAAG,EAAIoC,IAClBA,EAAU,KAAK,IAAIpC,CAAG,EACtBwD,EAAaxD,EAEjB,CAEFuD,EAAO,CAAC,GAAKrB,EAAK,CAAC,EAAIsB,EACvBD,EAAO,CAAC,GAAKrB,EAAK,CAAC,EAAIsB,CACzB,CACA,OAAOnB,GAAWkB,CAAM,CAC1B,CCrSO,IAAMG,IAAcC,EAAE,OAAO,CAClC,MAAOA,EAAE,MACPA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EACf,UAAWA,EAAE,OAAO,EACpB,QAASA,EAAE,MAAMC,EAAW,CAC9B,CAAC,CACH,EACA,SAAUD,EAAE,MACVA,EAAE,OAAO,CACP,KAAMA,EAAE,KAAK,CAAC,OAAQ,SAAU,SAAS,CAAC,EAC1C,KAAMC,GACN,GAAIA,EACN,CAAC,CACH,CACF,CAAC,EAKYC,IAAW,IAGlBC,IAAa,EAGbC,IAAmB,IAGnBC,IAAuB,IAEtB,SAASC,IAAaC,EAA2BC,EAAqB,CAC3E,IAAMC,EAAQF,EAAU,SAAW,KAAK,GAAM,IACxCG,EAAIF,EAAM,CAAC,EAAID,EAAU,MACzBI,EAAIH,EAAM,CAAC,EAAID,EAAU,MAC/B,MAAO,CACLA,EAAU,QAAUG,EAAI,KAAK,IAAID,CAAI,EAAIE,EAAI,KAAK,IAAIF,CAAI,EAC1DF,EAAU,QAAUG,EAAI,KAAK,IAAID,CAAI,EAAIE,EAAI,KAAK,IAAIF,CAAI,CAC5D,CACF,CAEO,SAASG,IAAaC,EAAcN,EAAkC,CAC3E,IAAMO,EAASC,GAAiBT,IAAaC,EAAWQ,CAAK,EAC7D,MAAO,CACL,MAAOF,EAAM,MAAM,IAAKG,IAAU,CAChC,GAAGA,EACH,QAASA,EAAK,QAAQ,IAAIF,CAAK,CACjC,EAAE,EACF,SAAUD,EAAM,SAAS,IAAKI,IAAa,CACzC,GAAGA,EACH,KAAMH,EAAMG,EAAQ,IAAI,EACxB,GAAIH,EAAMG,EAAQ,EAAE,CACtB,EAAE,CACJ,CACF,CAEA,IAAMC,GAAN,KAAa,CACH,OAER,YAAYC,EAAc,CACxB,KAAK,OAAS,MAAM,KAAK,CAAE,OAAQA,CAAK,EAAG,CAACC,EAAGC,IAAUA,CAAK,CAChE,CAEA,KAAKA,EAAuB,CAC1B,IAAIC,EAAOD,EACX,KAAO,KAAK,OAAOC,CAAI,IAAMA,GAC3BA,EAAO,KAAK,OAAOA,CAAI,EAEzB,YAAK,OAAOD,CAAK,EAAIC,EACdA,CACT,CAEA,KAAKC,EAAWC,EAAiB,CAC/B,KAAK,OAAO,KAAK,KAAKD,CAAC,CAAC,EAAI,KAAK,KAAKC,CAAC,CACzC,CACF,EAGA,SAASC,IAAOC,EAAkBC,EAA0B,CAC1D,IAAMC,EAAO,IAAI,IACjB,OAAAF,EAAO,QAAQ,CAACG,EAAOR,IAAU,CAC/B,IAAMC,EAAOK,EAAO,KAAKN,CAAK,EACxB,CAACS,EAAKC,CAAK,EAAIH,EAAK,IAAIN,CAAI,GAAK,CAAC,EAAG,CAAC,EAC5CM,EAAK,IAAIN,EAAM,CAACQ,EAAMD,EAAOE,EAAQ,CAAC,CAAC,CACzC,CAAC,EACML,EAAO,IAAI,CAACN,EAAGC,IAAU,CAC9B,GAAM,CAACS,EAAKC,CAAK,EAAIH,EAAK,IAAID,EAAO,KAAKN,CAAK,CAAC,GAAK,CAAC,EAAG,CAAC,EAC1D,OAAOS,EAAMC,CACf,CAAC,CACH,CAIO,SAASC,IAAKnB,EAAqB,CACxC,IAAMoB,EAA0C,CAAC,EAC3CC,EAAYnB,GAAyB,CACzC,IAAIoB,EAAO,GACPC,EAAUlC,IACd+B,EAAQ,QAAQ,CAACI,EAAQhB,IAAU,CACjC,IAAMiB,EAAMC,GAASF,EAAO,GAAItB,CAAK,EACjCuB,GAAOF,IACTD,EAAOd,EACPe,EAAUE,EAEd,CAAC,EACD,IAAMD,EAASJ,EAAQE,CAAI,EAC3B,OAAKE,GAILA,EAAO,GAAK,EACTA,EAAO,GAAG,CAAC,EAAIA,EAAO,MAAQtB,EAAM,CAAC,IAAMsB,EAAO,MAAQ,IAC1DA,EAAO,GAAG,CAAC,EAAIA,EAAO,MAAQtB,EAAM,CAAC,IAAMsB,EAAO,MAAQ,EAC7D,EACAA,EAAO,OAAS,EACTF,IARLF,EAAQ,KAAK,CAAE,GAAIlB,EAAO,MAAO,CAAE,CAAC,EAC7BkB,EAAQ,OAAS,EAQ5B,EACMO,EAAQ3B,EAAM,MAAM,IAAKG,GAAS,CACtC,IAAMyB,EAAOzB,EAAK,QACf,IAAIkB,CAAQ,EACZ,OAAO,CAACQ,EAAIrB,EAAOsB,IAAQD,IAAOC,GAAKtB,EAAQ,GAAKsB,EAAI,MAAM,CAAC,EAClE,MAAO,CAAE,KAAA3B,EAAM,KAAAyB,CAAK,CACtB,CAAC,EAEKG,EAAMF,GAAuBT,EAAQS,CAAE,EAAoB,GAC3DG,EAA4B,CAAC,EACnC,OAAW,CAAE,KAAAJ,CAAK,IAAKD,EACrBC,EAAK,QAAQ,CAACC,EAAIrB,IAAU,CAC1BwB,EAAM,KAAK,CAACH,EAAID,GAAMpB,EAAQ,GAAKoB,EAAK,MAAM,CAAW,CAAC,CAC5D,CAAC,EAIH,IAAMK,EAAQC,GAAYF,EAAM,IAAI,CAAC,CAACtB,EAAGC,CAAC,IAAM,CAACoB,EAAGrB,CAAC,EAAGqB,EAAGpB,CAAC,CAAC,CAAC,CAAC,EACzDwB,EAAM,KAAK,IAAIF,CAAK,EACpBG,EAAM,KAAK,IAAIH,CAAK,EACpBI,EAAQjB,EAAQ,IACpB,CAAC,CAAE,GAAI,CAACvB,EAAGC,CAAC,CAAE,IAAa,CAACD,EAAIsC,EAAMrC,EAAIsC,EAAK,CAACvC,EAAIuC,EAAMtC,EAAIqC,CAAG,CACnE,EAGMG,EAAQ,CAAC,IAAIjC,GAAOe,EAAQ,MAAM,EAAG,IAAIf,GAAOe,EAAQ,MAAM,CAAC,EAC/DmB,EAAO,KAAK,IAAKjD,IAAa,KAAK,GAAM,GAAG,EAClD,OAAW,CAACoB,EAAGC,CAAC,IAAKqB,EAAO,CAC1B,IAAMQ,EAAOH,EAAM3B,CAAC,EACd+B,EAAKJ,EAAM1B,CAAC,EACZ+B,EAAK,KAAK,IAAID,EAAG,CAAC,EAAID,EAAK,CAAC,CAAC,EAC7BG,EAAK,KAAK,IAAIF,EAAG,CAAC,EAAID,EAAK,CAAC,CAAC,EAC7BI,EAAQD,GAAMD,EAAKH,EAAO,EAAIG,GAAMC,EAAKJ,EAAO,EAAI,KAC1D,GAAIK,IAAU,KACZ,SAEF,IAAMC,EAASD,IAAU,EAAI,EAAI,EAC3B9B,EAASwB,EAAMO,CAAM,EAC3B/B,EAAO,KAAKJ,EAAGC,CAAC,EAEhB,IAAMmC,EAAM,KAAK,IAAIN,EAAKI,CAAK,EAAGH,EAAGG,CAAK,CAAC,EACrCG,EAAO,KAAK,IAAIP,EAAKI,CAAK,EAAGH,EAAGG,CAAK,CAAC,EAC5CP,EAAM,QAAQ,CAACnC,EAAOM,IAAU,CAE5BA,IAAUE,GACVF,IAAUG,GACVT,EAAM0C,CAAK,EAAIE,GACf5C,EAAM0C,CAAK,EAAIG,GACf,KAAK,IAAI7C,EAAM2C,CAAM,EAAIL,EAAKK,CAAM,CAAC,EAAIxD,KAEzCyB,EAAO,KAAKN,EAAOE,CAAC,CAExB,CAAC,CACH,CACA,IAAMsC,EAAUpC,IACdyB,EAAM,IAAI,CAAC,CAACxC,CAAC,IAAMA,CAAC,EACpByC,EAAM,CAAC,CACT,EACMW,EAAUrC,IACdyB,EAAM,IAAI,CAAC,CAAC,CAAEvC,CAAC,IAAMA,CAAC,EACtBwC,EAAM,CAAC,CACT,EACMY,EAAU9B,EAAQ,IAAI,CAACb,EAAGsB,IAAc,CAC5C,IAAMhC,EAAImD,EAAQnB,CAAE,GAAK,EACnB,EAAIoB,EAAQpB,CAAE,GAAK,EACzB,MAAO,CAAChC,EAAIsC,EAAM,EAAIC,EAAKvC,EAAIuC,EAAM,EAAID,CAAG,CAC9C,CAAC,EAED,MAAO,CACL,MAAOR,EACJ,OAAO,CAAC,CAAE,KAAAC,CAAK,IAAMA,EAAK,QAAU,CAAC,EACrC,IAAI,CAAC,CAAE,KAAAzB,EAAM,KAAAyB,CAAK,KAAO,CACxB,GAAGzB,EACH,QAASyB,EAAK,IAAKC,GAAOqB,EAAQrB,CAAE,CAAU,CAChD,EAAE,EACJ,SAAU7B,EAAM,QAClB,CACF,CAIO,SAASmD,GACdC,EACApD,EACqC,CACrC,IAAIqD,EAAQ,EACNC,EAAS,CAAC,GAAGtD,EAAM,KAAK,EAAE,KAC9B,CAACuD,EAAMC,IAAUC,GAAYD,EAAM,OAAO,EAAIC,GAAYF,EAAK,OAAO,CACxE,EACA,QAAWpD,KAAQmD,EAEfI,GAAWN,EAAOjD,EAAK,QAAS,CAC9B,KAAMA,EAAK,KACX,UAAWA,EAAK,SAClB,CAAC,IAEDkD,GAAS,GAIb,IAAIM,EAAW,EACf,QAAWvD,KAAWJ,EAAM,SAAU,CACpC,IAAM4D,EAAQ,KAAK,MAAMlC,GAAStB,EAAQ,KAAMA,EAAQ,EAAE,CAAC,EAC3D,GAAIwD,EAAQpE,IACV,SAEF,IAAMqE,EAAgB,EACnBzD,EAAQ,KAAK,CAAC,EAAIA,EAAQ,GAAG,CAAC,GAAK,GACnCA,EAAQ,KAAK,CAAC,EAAIA,EAAQ,GAAG,CAAC,GAAK,CACtC,EACM0D,EAAOC,GAAYF,EAAQT,EAAOQ,EAAOrE,GAAgB,EACzDyE,EAAQZ,EAAM,SAAS,KAC1Ba,GACCH,IAAS,MACTG,EAAM,OAASH,EAAK,KAAK,IACzBG,EAAM,OAASH,EAAK,OAASF,GAC7BE,EAAK,OAASG,EAAM,OAASA,EAAM,KACvC,EACA,GAAI,CAACH,GAAQE,EACX,SAEF,IAAME,EAAWC,GAAiB/D,EAAQ,IAAI,EAC9CgD,EAAM,SAAS,KAAK,CAClB,GAAIgB,GAAM,GAAG,EACb,KAAMN,EAAK,KAAK,GAChB,KAAM1D,EAAQ,KACd,OAAQ0D,EAAK,OACb,MAAAF,EACA,OAAQM,EAAS,OACjB,KAAMA,EAAS,KACf,MAAO9D,EAAQ,OAAS,OAAS,OAAS,OAC1C,KAAM,EACR,CAAC,EACDuD,GAAY,CACd,CACA,MAAO,CAAE,MAAAN,EAAO,SAAAM,CAAS,CAC3B,CAIO,SAASU,IAAaC,EAAeC,EAA6B,CACvE,IAAMC,EAAQ,IAAI,IAChBF,EAAO,MAAM,IAAKG,GAAS,CACzBA,EAAK,GACL,KAAK,UAAUC,GAASJ,EAAQG,CAAI,CAAC,CACvC,CAAC,CACH,EACME,EAAc,IAAI,IAAIL,EAAO,SAAS,IAAKlE,GAAYA,EAAQ,EAAE,CAAC,EAClEwE,EAAuB,CAAC,EAC9B,QAAWH,KAAQF,EAAM,MAAO,CAC9B,IAAMM,EAAOH,GAASH,EAAOE,CAAI,EAC3BK,EAAOP,EAAM,SAAS,OAAQnE,GAAYA,EAAQ,OAASqE,EAAK,EAAE,EACxE,GACE,GAACI,GACAL,EAAM,IAAIC,EAAK,EAAE,IAAM,KAAK,UAAUI,CAAI,GACzCC,EAAK,MAAO1E,GAAYuE,EAAY,IAAIvE,EAAQ,EAAE,CAAC,GAIvD,OAAW,CAACM,EAAGC,CAAC,IAAKoE,GAAaF,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGC,CAAI,EACtDF,EAAM,KAAK,CAAE,KAAM,OAAQ,EAAAlE,EAAG,EAAAC,EAAG,UAAW8D,EAAK,SAAU,CAAC,CAEhE,CACA,IAAMO,EAAW,IAAI,IAAIV,EAAO,MAAM,IAAKnE,GAASA,EAAK,EAAE,CAAC,EAC5D,QAAWA,KAAQoE,EAAM,MAClBS,EAAS,IAAI7E,EAAK,EAAE,GACvByE,EAAM,KAAK,CACT,KAAM,OACN,GAAIK,GAAgBC,GAAUX,EAAOpE,CAAI,CAAC,EAC1C,KAAMA,EAAK,IACb,CAAC,EAGL,OAAOyE,CACT,CCzSO,IAAMO,IAAiB,mBAGjBC,GAAN,cAA+B,KAAM,CAAC,EAEhCC,GAAN,KAAgB,CACb,OAAwB,KACxB,OAAwB,KACf,MAAQ,IAAI,IACrB,QAAU,EACV,QAA0B,CAAC,EAGnC,KAAKC,EAAgBC,EAAmC,CACtD,KAAK,OAASD,EACd,KAAK,OAASC,GAAW,KACzB,KAAK,MAAM,MAAM,CACnB,CAGA,KAAKC,EAA6B,CAChC,QAAWC,KAAWD,GAAU,IAAI,MAAM,GAAG,EAAG,CAC9C,GAAM,CAACE,EAAIC,EAAQC,CAAK,EAAIH,EAAO,KAAK,EAAE,MAAM,GAAG,EAC/C,OAAOC,CAAE,IAAM,KAAK,QAAUC,GAAUC,GAC1C,KAAK,MAAM,IAAID,EAAQC,CAAK,CAEhC,CACF,CAGA,MAAsB,CACpB,IAAIC,EAAK,KAAK,OACRC,EAAU,IAAI,IACpB,KAAOD,IAAO,MAAQ,KAAK,MAAM,IAAIA,CAAE,GAAK,CAACC,EAAQ,IAAID,CAAE,GACzDC,EAAQ,IAAID,CAAE,EACdA,EAAK,KAAK,MAAM,IAAIA,CAAE,GAAK,KAE7B,OAAOA,CACT,CAGA,MAAM,MAASE,EAAiC,CAC9C,KAAK,SAAW,EAChB,GAAI,CACF,OAAO,MAAMA,CACf,QAAE,CAEA,GADA,KAAK,SAAW,EACZ,KAAK,UAAY,EACnB,QAAWC,KAAW,KAAK,QAAQ,OAAO,CAAC,EACzCA,EAAQ,CAGd,CACF,CAGA,SAAyB,CACvB,OAAO,KAAK,UAAY,EACpB,QAAQ,QAAQ,EAChB,IAAI,QAASA,GAAY,KAAK,QAAQ,KAAKA,CAAO,CAAC,CACzD,CAOA,MAAM,MAASC,EAAwD,CACrE,IAAMC,EAAO,KAAK,KAAK,EACvB,GAAI,CACF,OAAO,MAAMD,EAAMC,CAAI,CACzB,OAASC,EAAO,CAKd,GAJI,EAAEA,aAAiBf,MAGvB,MAAM,KAAK,QAAQ,EACf,KAAK,KAAK,IAAMc,GAClB,MAAMC,EAER,OAAOF,EAAM,KAAK,KAAK,CAAC,CAC1B,CACF,CACF,EAGaG,GAAY,IAAIf,GC5F7B,IAAAgB,IAAA,CACE,YAAe,2DACf,SAAY,OACZ,MAAS,QACT,OAAU,0BACV,SAAY,WACZ,MAAS,KACT,WAAc,UACd,OAAU,CACR,8BAAiC,CAAC,IAAK,IAAK,GAAG,EAC/C,kBAAqB,CAAC,GAAI,GAAI,GAAG,EACjC,mCAAsC,CAAC,GAAI,GAAI,GAAG,EAClD,gBAAmB,CAAC,IAAK,IAAK,GAAG,EACjC,mBAAsB,CAAC,IAAK,IAAK,GAAG,EACpC,0BAA6B,CAAC,IAAK,IAAK,GAAG,EAC3C,sBAAyB,CAAC,IAAK,IAAK,GAAG,EACvC,yBAA4B,CAAC,IAAK,IAAK,GAAG,EAC1C,oBAAuB,CAAC,IAAK,IAAK,GAAG,EACrC,mBAAsB,CAAC,GAAI,GAAI,GAAG,EAClC,iCAAoC,CAAC,IAAK,IAAK,GAAG,EAClD,qBAAwB,CAAC,GAAI,GAAI,GAAG,EACpC,qBAAwB,CAAC,GAAI,GAAI,GAAG,EACpC,0BAA6B,CAAC,GAAI,GAAI,GAAG,EACzC,kBAAqB,CAAC,IAAK,IAAK,GAAG,EACnC,aAAgB,CAAC,GAAI,GAAI,GAAG,CAC9B,CACF,EC1BA,IAAAC,IAAA,CACE,YAAe,iDACf,SAAY,OACZ,MAAS,SACT,OAAU,0BACV,SAAY,WACZ,MAAS,MACT,MAAS,GACT,WAAc,WACd,OAAU,CACR,EAAK,MACL,OAAU,MACV,YAAe,MACf,iBAAoB,MACpB,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,EAAK,MACL,QAAW,KACb,CACF,ECtBA,IAAAC,IAAA,CACE,YAAe,mCACf,SAAY,OACZ,MAAS,OACT,OAAU,0BACV,SAAY,WACZ,MAAS,MACT,MAAS,2BACT,WAAc,WACd,OAAU,CACR,+BAAkC,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC7I,8BAAiC,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC5I,uBAA0B,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EACrI,gDAAmD,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC9J,+BAAkC,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC7I,4BAA+B,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC1I,6BAAgC,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC3I,sCAAyC,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EACpJ,4BAA+B,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC1I,2BAA8B,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EACzI,gBAAmB,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EAC9H,0BAA6B,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EACxI,yBAA4B,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,EACvI,+BAAkC,CAAC,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,QAAS,OAAO,CAC/I,CACF,ECzBA,IAAAC,GAAA,CACE,YAAe,yDACf,SAAY,OACZ,MAAS,QACT,OAAU,4BACV,SAAY,WACZ,MAAS,KACT,MAAS,CAAC,aAAc,wBAAyB,2BAA4B,GAAI,EAAE,EACnF,WAAc,CAAC,WAAY,WAAY,WAAY,WAAY,SAAS,EACxE,OAAU,CACR,WAAc,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAChD,KAAQ,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAC1C,mCAAsC,CAAC,IAAK,KAAM,QAAS,QAAS,EAAE,EACtE,qCAAwC,CAAC,KAAM,OAAQ,QAAS,QAAS,CAAC,EAC1E,8CAAiD,CAAC,IAAK,OAAQ,QAAS,OAAQ,EAAE,EAClF,qCAAwC,CAAC,IAAK,OAAQ,QAAS,OAAQ,EAAE,EACzE,oCAAuC,CAAC,IAAK,QAAS,QAAS,QAAS,CAAC,EACzE,kCAAqC,CAAC,IAAK,QAAS,QAAS,QAAS,CAAC,EACvE,SAAY,CAAC,KAAM,OAAQ,QAAS,QAAS,CAAC,EAC9C,qCAAwC,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAC1E,+BAAkC,CAAC,KAAM,QAAS,QAAS,QAAS,EAAE,EACtE,8BAAiC,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EACnE,uBAA0B,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EACzD,gDAAmD,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EAClF,uDAA0D,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EACzF,yDAA4D,CAAC,IAAK,IAAK,OAAQ,QAAS,EAAE,EAC1F,yDAA4D,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EAC3F,sDAAyD,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EACxF,wDAA2D,CAAC,IAAK,IAAK,OAAQ,QAAS,EAAE,EACzF,wDAA2D,CAAC,IAAK,IAAK,QAAS,OAAQ,EAAE,EACzF,wCAA2C,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EAC1E,0CAA6C,CAAC,IAAK,IAAK,OAAQ,QAAS,EAAE,EAC3E,0CAA6C,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EAC5E,+BAAkC,CAAC,IAAK,IAAK,QAAS,QAAS,EAAE,EACjE,4BAA+B,CAAC,IAAK,QAAS,QAAS,QAAS,EAAE,EAClE,YAAe,CAAC,IAAK,OAAQ,QAAS,OAAQ,CAAC,EAC/C,uBAA0B,CAAC,MAAO,OAAQ,QAAS,OAAQ,EAAE,EAC7D,gDAAmD,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EACvF,0BAA6B,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EACjE,uBAA0B,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EAC9D,qDAAwD,CAAC,MAAO,OAAQ,QAAS,OAAQ,EAAE,EAC3F,sBAAyB,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EAC7D,4BAA+B,CAAC,MAAO,OAAQ,OAAQ,OAAQ,EAAE,EACjE,sBAAyB,CAAC,MAAO,OAAQ,QAAS,OAAQ,EAAE,EAC5D,wDAA2D,CAAC,MAAO,OAAQ,QAAS,OAAQ,EAAE,EAC9F,kDAAqD,CAAC,MAAO,OAAQ,QAAS,OAAQ,EAAE,EACxF,cAAiB,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EACrD,6BAAgC,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EACpE,0DAA6D,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EACjG,kCAAqC,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EACzE,qCAAwC,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EAC5E,uCAA0C,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EAC9E,WAAc,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAChD,sCAAyC,CAAC,MAAO,OAAQ,QAAS,QAAS,EAAE,EAC7E,qCAAwC,CAAC,MAAO,OAAQ,QAAS,QAAS,CAAC,EAC3E,UAAa,CAAC,MAAO,OAAQ,OAAQ,OAAQ,CAAC,EAC9C,4BAA+B,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EACjE,4BAA+B,CAAC,KAAM,QAAS,QAAS,QAAS,EAAE,EACnE,2BAA8B,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAChE,gBAAmB,CAAC,KAAM,QAAS,QAAS,QAAS,EAAE,EACvD,0BAA6B,CAAC,KAAM,QAAS,QAAS,QAAS,EAAE,EACjE,yBAA4B,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAC9D,+BAAkC,CAAC,KAAM,OAAQ,QAAS,QAAS,EAAE,EACrE,WAAc,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAChD,UAAa,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAC/C,0CAA6C,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,EAC/E,2CAA8C,CAAC,IAAK,OAAQ,QAAS,QAAS,EAAE,CAClF,CACF,ECpEA,IAAAC,IAAA,CACE,YAAe,uDACf,SAAY,OACZ,MAAS,OACT,OAAU,0BACV,SAAY,WACZ,MAAS,KACT,MAAS,SACT,WAAc,WACd,OAAU,CACR,QAAW,CAAC,QAAS,QAAS,OAAQ,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,OAAQ,QAAS,OAAO,CAC9G,CACF,ECZA,IAAAC,GAAA,CACE,YAAe,0DACf,SAAY,OACZ,MAAS,QACT,OAAU,0BACV,SAAY,WACZ,MAAS,KACT,WAAc,UACd,OAAU,CACR,cAAiB,CAAC,OAAQ,KAAK,EAC/B,8BAAiC,CAAC,OAAQ,KAAK,EAC/C,8BAAiC,CAAC,OAAQ,KAAK,EAC/C,iBAAoB,CAAC,OAAQ,KAAK,EAClC,cAAiB,CAAC,OAAQ,KAAK,EAC/B,cAAiB,CAAC,OAAQ,KAAK,EAC/B,8BAAiC,CAAC,OAAQ,KAAK,EAC/C,8BAAiC,CAAC,OAAQ,KAAK,CACjD,CACF,EClBA,IAAAC,GAAA,CACE,YAAe,6BACf,SAAY,OACZ,MAAS,SACT,OAAU,0BACV,SAAY,WACZ,MAAS,KACT,WAAc,UACd,OAAU,CACR,MAAS,MACT,IAAO,MACP,KAAQ,KACV,CACF,ECbA,IAAAC,GAAA,CACE,YAAe,kDACf,SAAY,OACZ,MAAS,QACT,OAAU,0BACV,SAAY,WACZ,MAAS,KACT,WAAc,UACd,OAAU,CACR,mBAAsB,CAAC,OAAQ,MAAO,MAAM,EAC5C,MAAS,CAAC,MAAO,MAAO,KAAK,EAC7B,kBAAqB,CAAC,OAAQ,MAAO,MAAM,EAC3C,YAAe,CAAC,MAAO,MAAO,KAAK,CACrC,CACF,ECdA,IAAAC,IAAA,CACE,YAAe,gDACf,SAAY,OACZ,MAAS,OACT,OAAU,0BACV,SAAY,WACZ,MAAS,KACT,MAAS,iBACT,WAAc,WACd,OAAU,CACR,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC9F,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC7F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC7F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC7F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC7F,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC7F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC9F,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,KAAK,EAC/F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,MAAO,KAAK,EAC9F,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,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AAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACxF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACxF,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACxF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EACzF,IAAK,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,M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CjB,CACF,ECzZA,IAAAW,GAAA,CACC,OAAU,yFACV,aAAgB,IAChB,mBAAsB,EACtB,iBAAoB,CACnB,IAAO,IACP,WAAc,CACb,KAAQ,IACR,QAAW,IACX,gBAAiB,IACjB,SAAY,IACZ,SAAY,GACb,EACA,SAAY,CACX,WAAY,IACZ,YAAa,IACb,YAAa,IACb,YAAa,IACb,YAAa,IACb,YAAa,GACd,EACA,KAAQ,CACP,qBAAsB,IACtB,yBAA0B,IAC1B,oBAAqB,IACrB,wBAAyB,IACzB,MAAS,GACV,CACD,EACA,cAAiB,CAChB,KAAQ,GACR,IAAO,GACP,WAAc,IACd,WAAc,IACd,UAAa,GACd,EACA,eAAkB,CACjB,eAAkB,CACjB,EACA,GACA,EACD,EACA,UAAa,CACZ,IACA,IACA,IACA,GACD,EACA,QAAW,CACV,IACA,IACA,IACA,GACD,EACA,QAAW,CACV,IACA,IACA,IACA,GACD,CACD,EACA,YAAe,CACd,OAAU,GACV,IAAO,GACP,MAAS,CACV,EACA,eAAkB,CACjB,SAAY,CACX,GACA,EACA,EACA,EACA,CACD,EACA,OAAU,CACT,EACA,EACA,EACA,EACA,CACD,EACA,IAAO,CACN,CACC,GACA,GACA,GACA,GACA,IACD,EACA,CACC,GACA,GACA,GACA,GACA,IACD,EACA,CACC,EACA,GACA,GACA,GACA,EACD,EACA,CACC,EACA,GACA,GACA,GACA,EACD,EACA,CACC,EACA,EACA,GACA,GACA,EACD,CACD,EACA,KAAQ,CACP,CACC,GACA,GACA,GACA,GACA,IACD,EACA,CACC,GACA,GACA,GACA,GACA,IACD,EACA,CACC,GACA,GACA,GACA,GACA,EACD,EACA,CACC,GACA,GACA,GACA,GACA,EACD,EACA,CACC,EACA,GACA,GACA,GACA,EACD,CACD,CACD,EACA,cAAiB,CAChB,SAAY,CACX,GACA,EACA,EACA,EACA,EACA,EACA,EACD,EACA,SAAY,CACX,EACA,EACD,EACA,IAAO,CACN,CACC,GACA,EACD,EACA,CACC,GACA,EACD,EACA,CACC,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2BACT,SAAY,EACb,EACA,MAAS,CACR,MAAS,aACT,SAAY,EACb,EACA,MAAS,CACR,MAAS,QACT,SAAY,EACb,EACA,QAAW,CACV,MAAS,UACT,SAAY,EACb,EACA,KAAQ,CACP,MAAS,OACT,SAAY,EACb,EACA,QAAW,CACV,MAAS,UACT,SAAY,EACb,EACA,SAAY,CACX,MAAS,4BACT,SAAY,EACb,EACA,GAAM,CACL,MAAS,kBACT,SAAY,EACb,EACA,QAAW,CACV,MAAS,eACT,SAAY,EACb,EACA,QAAW,CACV,MAAS,UACT,SAAY,EACb,EACA,kBAAmB,CAClB,MAAS,wBACT,SAAY,EACb,EACA,gBAAiB,CAChB,MAAS,gBACT,SAAY,EACb,EACA,SAAY,CACX,MAAS,gBACT,SAAY,EACb,EACA,MAAS,CACR,MAAS,aACT,SAAY,EACb,EACA,SAAY,CACX,MAAS,WACT,SAAY,EACb,EACA,OAAU,CACT,MAAS,cACT,SAAY,EACb,CACD,EACA,UAAa,CACZ,QAAW,GACX,SAAY,GACZ,OAAU,EACX,EACA,SAAY,SACZ,SAAY,CACX,OAAU,SACV,QAAW,SACX,eAAgB,SAChB,cAAe,SACf,aAAc,SACd,UAAa,SACb,cAAe,YACf,SAAY,SACZ,KAAQ,SACR,aAAgB,SAChB,cAAe,SACf,MAAS,SACT,iBAAkB,YAClB,gBAAiB,UACjB,OAAU,QACV,QAAW,OACX,SAAY,OACZ,MAAS,OACT,OAAU,UACV,UAAa,UACb,UAAa,UACb,QAAW,WACX,OAAU,KACV,UAAa,KACb,gBAAiB,KACjB,QAAW,UACX,eAAgB,UAChB,eAAgB,UAChB,YAAa,UACb,IAAO,UACP,OAAU,UACV,iBAAkB,UAClB,WAAY,UACZ,QAAW,UACX,WAAY,SACZ,QAAW,SACX,KAAQ,WACR,cAAe,SACf,QAAW,QACX,SAAY,QACZ,OAAU,QACV,kBAAmB,QACnB,OAAU,QACV,OAAU,QACV,OAAU,QACV,gBAAiB,WACjB,aAAc,QACd,eAAgB,SACjB,EACA,MAAS,CACR,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,KACN,KAAM,CACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,IACN,KAAM,GACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,IACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,GACR,KAAM,KACN,KAAM,IACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,EACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,IACN,KAAM,GACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,IACR,KAAM,GACN,KAAM,IACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,IACN,KAAM,GACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,EACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,KACN,KAAM,EACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,EACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,IACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,EACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,KACN,KAAM,CACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,IACN,KAAM,GACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,EACN,KAAM,EACP,EACA,UAAa,EACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,KACN,KAAM,EACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,IACN,KAAM,GACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,IACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,KACN,KAAM,EACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,GACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,IACN,KAAM,EACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,GACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,KAAM,KACN,KAAM,KACN,KAAM,EACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,GACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,GACR,KAAM,KACN,KAAM,KACN,KAAM,EACP,EACA,eAAkB,CACjB,OAAQ,EACR,KAAM,EACN,KAAM,GACN,KAAM,EACP,EACA,UAAa,CACd,EACA,CACC,KAAQ,GACR,OAAU,CACT,OAAQ,KACR,K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E,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,CAAC,IAAM,IAAI,QAAU,IAAI,KAAO,GAAI,EAAE,CAAC,IAAM,IAAI,QAAU,KAAK,KAAO,GAAI,EAAE,CAAC,IAAM,IAAI,QAAU,KAAK,KAAO,GAAI,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,mBAAmB,KAAO,CAAC,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,iBAAiB,MAAQ,QAAQ,OAAS,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,8FAA8F,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,2BAA2B,KAAO,CAAC,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,oBAAoB,MAAQ,WAAW,OAAS,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,oIAAoI,+GAA+G,8JAA8J,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,yBAAyB,KAAO,CAAC,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,2IAA2I,uJAAuJ,gIAAgI,4IAA4I,2GAA2G,2JAA2J,uHAAuH,sKAAsK,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,CAAC,IAAM,GAAG,QAAU,KAAK,KAAO,GAAI,EAAE,CAAC,IAAM,IAAI,QAAU,IAAK,KAAO,GAAI,EAAE,CAAC,IAAM,IAAI,QAAU,KAAK,KAAO,GAAI,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,eAAe,KAAO,CAAC,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,oOAAoO,+MAA+M,EAAE,YAAc,CAAC,cAAc,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,IAAI,EAAE,EAAE,GAAG,IAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,qBAAqB,KAAO,CAAC,CAAC,IAAM,kBAAkB,MAAQ,SAAS,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,YAAY,MAAQ,YAAY,OAAS,CAAC,YAAY,OAAO,CAAC,CAAC,EAAE,aAAe,CAAC,gEAAgE,gHAAgH,+EAA+E,+HAA+H,kFAAkF,kIAAkI,iHAAiH,iKAAiK,gIAAgI,gLAAgL,mIAAmI,mLAAmL,yKAAyK,sGAAsG,sJAAsJ,qHAAqH,qKAAqK,uHAAuH,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,cAAc,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,qBAAqB,KAAO,CAAC,CAAC,IAAM,kBAAkB,MAAQ,SAAS,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,YAAY,MAAQ,YAAY,OAAS,CAAC,YAAY,OAAO,CAAC,EAAE,CAAC,IAAM,sBAAsB,MAAQ,aAAa,OAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,aAAa,MAAQ,mBAAmB,OAAS,CAAC,WAAW,sBAAsB,CAAC,CAAC,EAAE,aAAe,CAAC,4DAA4D,4GAA4G,wEAAwE,wHAAwH,2EAA2E,2HAA2H,uFAAuF,uIAAuI,8EAA8E,8HAA8H,0FAA0F,0IAA0I,6GAA6G,6JAA6J,yHAAyH,yKAAyK,4HAA4H,4KAA4K,wIAAwI,wLAAwL,+HAA+H,+KAA+K,2IAA2I,2LAA2L,kGAAkG,kJAAkJ,8GAA8G,8JAA8J,iHAAiH,iKAAiK,6HAA6H,6KAA6K,oHAAoH,oKAAoK,gIAAgI,+KAA+K,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,cAAc,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,wCAAwC,KAAO,CAAC,CAAC,IAAM,kBAAkB,MAAQ,SAAS,OAAS,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,YAAY,MAAQ,YAAY,OAAS,CAAC,YAAY,OAAO,CAAC,EAAE,CAAC,IAAM,gBAAgB,MAAQ,aAAa,OAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAM,gBAAgB,MAAQ,aAAa,OAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,IAAM,sBAAsB,MAAQ,mBAAmB,OAAS,CAAC,WAAW,sBAAsB,CAAC,EAAE,CAAC,IAAM,sBAAsB,MAAQ,mBAAmB,OAAS,CAAC,WAAW,sBAAsB,CAAC,EAAE,CAAC,IAAM,kBAAkB,MAAQ,UAAU,OAAS,CAAC,kDAAkD,sCAAsC,CAAC,EAAE,CAAC,IAAM,kBAAkB,MAAQ,SAAS,OAAS,CAAC,gBAAgB,+DAA+D,CAAC,CAAC,EAAE,aAAe,CAAC,yGAAyG,yJAAyJ,wHAAwH,wKAAwK,2HAA2H,2KAA2K,qHAAqH,qKAAqK,iIAAiI,iLAAiL,oIAAoI,oLAAoL,gJAAgJ,gMAAgM,uIAAuI,uLAAuL,mJAAmJ,mMAAmM,8FAA8F,8IAA8I,6GAA6G,6JAA6J,gHAAgH,gKAAgK,0GAA0G,0JAA0J,sHAAsH,sKAAsK,yHAAyH,yKAAyK,qIAAqI,qLAAqL,4HAA4H,4KAA4K,wIAAwI,uLAAuL,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,cAAc,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,E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AAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAI,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,EAAE,EAAE,CAAC,GAAK,OAAO,QAAU,gBAAgB,MAAQ,iBAAiB,KAAO,CAAC,EAAE,aAAe,CAAC,gDAAgD,2HAA2H,4DAA4D,mJAAmJ,6CAA6C,gDAAgD,2HAA2H,4DAA4D,mJAAmJ,6CAA6C,2FAA2F,EAAE,YAAc,CAAC,EAAE,KAAO,CAAC,EAAE,GAAG,IAAK,IAAI,EAAE,GAAG,IAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,IAAK,IAAI,EAAE,GAAG,IAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,GAAG,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,qBAAqB,KAAO,CAAC,CAAC,IAAM,YAAY,MAAQ,OAAO,OAAS,CAAC,YAAY,0CAA0C,4CAA4C,+BAA+B,CAAC,CAAC,EAAE,aAAe,CAAC,yKAAyK,+JAA+J,mKAAmK,qIAAqI,EAAE,YAAc,CAAC,EAAE,KAAO,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,wCAAwC,KAAO,CAAC,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,0LAA0L,4JAA4J,EAAE,YAAc,CAAC,cAAc,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,EAAE,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,0DAA0D,KAAO,CAAC,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,mLAAmL,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,IAAK,EAAE,EAAE,YAAc,CAAC,EAAE,MAAQ,CAAC,EAAE,CAAC,GAAK,OAAO,QAAU,OAAO,MAAQ,wDAAwD,KAAO,CAAC,CAAC,IAAM,iBAAiB,MAAQ,QAAQ,OAAS,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,CAAC,EAAE,CAAC,IAAM,sBAAsB,MAAQ,uBAAuB,OAAS,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,aAAe,CAAC,+PAA+P,EAAE,YAAc,CAAC,uBAAuB,uBAAuB,mBAAmB,EAAE,KAAO,CAAC,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,GAAI,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,GAAI,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,GAAI,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAAG,EAAE,EAAE,EAAE,EAAE,IAAK,GAA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EAAW,yDACzB,EACA,mCAAoC,CAClC,KAAM,iBACN,QAAS,GAAGA,EAAW,yDACzB,EACA,yBAA0B,CACxB,KAAM,OACN,QAAS,GAAGA,EAAW,+BACzB,EACA,uBAAwB,CACtB,KAAM,kCACN,QAAS,6DACX,EACA,+BAAgC,CAC9B,KAAM,cACN,QAAS,GAAGA,EAAW,qCACzB,EACA,oBAAqB,CACnB,KAAM,mBACN,QACE,iZACJ,EACA,mBAAoB,CAClB,KAAM,kBACN,QACE,2EACJ,EACA,0BAA2B,CACzB,KAAM,yBACN,QAAS,8CACX,EACA,yBAA0B,CACxB,KAAM,wBACN,QAAS,mEACX,EACA,6BAA8B,CAC5B,KAAM,4BACN,QAAS,0DACX,EACA,uBAAwB,CACtB,KAAM,sBACN,QAAS,0DACX,EACA,iBAAkB,CAChB,KAAM,oBACN,QAAS,UACX,EAGA,qBAAsB,CACpB,KAAM,oBACN,QACE,uLACF,KAAM,sEACR,EACA,sBAAuB,CACrB,KAAM,wBACN,QACE,kJACJ,EACA,oBAAqB,CACnB,KAAM,sBACN,QACE,kJACJ,EACA,oBAAqB,CACnB,KAAM,sBACN,QAAS,sDACX,EACA,mBAAoB,CAClB,KAAM,8BACN,QAAS,qCACX,EACA,2BAA4B,CAC1B,KAAM,6BACN,QACE,yEACJ,EACA,gCAAiC,CAC/B,KAAM,uCACN,QACE,8GACJ,EACA,qBAAsB,CACpB,KAAM,oBACN,QAAS,6CACX,EACA,wBAAyB,CACvB,KAAM,8BACN,QACE,4JACJ,EACA,sBAAuB,CACrB,KAAM,wBACN,QAAS,mDACX,EACA,8BAA+B,CAC7B,KAAM,uBACN,QACE,kJACJ,EACA,oBAAqB,CACnB,KAAM,aACN,QACE,iLACJ,EACA,uBAAwB,CACtB,KAAM,kCACN,QACE,0JACJ,EACA,sBAAuB,CACrB,KAAM,4BACN,QAAS,iBACX,EACA,mBAAoB,CAClB,KAAM,cACN,QAAS,iBACX,EACA,sBAAuB,CACrB,KAAM,sBACN,QAAS,iBACX,EACA,sBAAuB,CACrB,KAAM,yBACN,QAAS,iBACX,EACA,uBAAwB,CACtB,KAAM,+BACN,QAAS,8EACX,EACA,0BAA2B,CACzB,KAAM,mBACN,QAAS,iBACX,EACA,oBAAqB,CACnB,KAAM,gCACN,QACE,iLACJ,EAGA,mBAAoB,CAClB,KAAM,kBACN,QAAS,gCACX,EACA,kBAAmB,CACjB,KAAM,iBACN,QACE,+HACJ,EACA,oBAAqB,CACnB,KAAM,kBACN,QACE,2FACJ,EACA,iBAAkB,CAChB,KAAM,gBACN,QAAS,oCACX,EACA,wBAAyB,CACvB,KAAM,qBACN,QAAS,uCACX,EACA,gBAAiB,CACf,KAAM,sBACN,QAAS,sCACX,EACA,uBAAwB,CACtB,KAAM,sBACN,QAAS,mEACX,EACA,wBAAyB,CACvB,KAAM,uBACN,QACE,oKACJ,EAGA,qBAAsB,CACpB,KAAM,qBACN,QACE,kIACJ,EACA,0BAA2B,CACzB,KAAM,0BACN,QACE,uHACJ,EACA,oBAAqB,CACnB,KAAM,oBACN,QACE,iHACJ,EACA,0BAA2B,CACzB,KAAM,0BACN,QACE,uHACJ,EACA,qBAAsB,CACpB,KAAM,qBACN,QACE,kHACJ,EACA,0BAA2B,CACzB,KAAM,0BACN,QACE,uHACJ,EACA,oBAAqB,CACnB,KAAM,oBACN,QACE,iHACJ,EACA,0BAA2B,CACzB,KAAM,0BACN,QACE,uHACJ,EACA,2BAA4B,CAC1B,KAAM,4BACN,QACE,iGACJ,EACA,eAAgB,CACd,KAAM,oBACN,QACE,wPACJ,EACA,eAAgB,CACd,KAAM,cACN,QAAS,8CACX,EAGA,eAAgB,CACd,KAAM,kCACN,QAAS,mBACX,EACA,gCAAiC,CAC/B,KAAM,uBACN,QAAS,uBACX,EACA,sBAAuB,CACrB,KAAM,kCACN,QACE,8NACJ,EACA,oCAAqC,CACnC,KAAM,gCACN,QACE,qMACJ,EACA,eAAgB,CACd,KAAM,wCACN,QACE,6EACJ,EACA,sBAAuB,CACrB,KAAM,uCACN,QACE,8NACJ,EACA,kCAAmC,CACjC,KAAM,qCACN,QACE,qOACJ,EACA,wBAAyB,CACvB,KAAM,uBACN,QAAS,yCACX,EACA,6BAA8B,CAC5B,KAAM,4BACN,QACE,sJ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AoC,CACnC,MAAS,CACR,WACD,EACA,QAAW,GACX,KAAQ,YACT,EACA,2BAA8B,CAC7B,MAAS,CACR,8BACA,2BACA,2BACA,6BACA,4BACA,iCACA,6BACA,8BACA,kCACD,EACA,QAAW,GACX,KAAQ,YACT,EACA,0BAA6B,CAC5B,MAAS,CACR,6BACA,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,UAAa,CACZ,MAAS,CACR,YACA,gBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,2BAA8B,CAC7B,MAAS,CACR,WACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,2BAA8B,CAC7B,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,uBAA0B,CACzB,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,sBAAyB,CACxB,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,mCAAsC,CACrC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,uBAA0B,CACzB,MAAS,CACR,oCACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,qBAAwB,CACvB,MAAS,CACR,4BACA,6BACA,6BACA,yBACA,wBACA,wBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,qBAAwB,CACvB,MAAS,CACR,4BACA,uBACA,iCACA,gCACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,kBAAqB,CACpB,MAAS,CACR,oBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,+BAAkC,CACjC,MAAS,CACR,oBACA,sBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,8BAAiC,CAChC,MAAS,CACR,QACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,wBAA2B,CAC1B,MAAS,CACR,+BACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,+BAAkC,CACjC,MAAS,CACR,iCACA,yBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,yBAA4B,CAC3B,MAAS,CACR,oBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,yBAA4B,CAC3B,MAAS,CACR,qBACA,0BACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,yBAA4B,CAC3B,MAAS,CACR,oBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,mCAAsC,CACrC,MAAS,CACR,qBACA,iCACA,2BACA,0BACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,wBAA2B,CAC1B,MAAS,CACR,qBACA,iCACA,0BACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,8BAAiC,CAChC,MAAS,CACR,gCACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,6BAAgC,CAC/B,MAAS,CACR,qCACA,0BACA,+BACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,+BAAkC,CACjC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,sCAAyC,CACxC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,2BAA8B,CAC7B,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,iCAAoC,CACnC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,mCAAsC,CACrC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,kCAAqC,CACpC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,mCAAsC,CACrC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,kCAAqC,CACpC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,mCAAsC,CACrC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,yBAA4B,CAC3B,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,uBAA0B,CACzB,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,+BAAkC,CACjC,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,oBAAuB,CACtB,MAAS,CACR,iCACA,wCACA,6BACA,mCACA,qCACA,oCACA,qCACA,oCACA,qCACA,2BACA,gCACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,mBAAsB,CACrB,MAAS,CACR,oBACA,wBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,0BAA6B,CAC5B,MAAS,CACR,sBACA,oBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,yBAA4B,CAC3B,MAAS,CACR,+BACA,mBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,6BAAgC,CAC/B,MAAS,CACR,4BACA,0BACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,uBAA0B,CACzB,MAAS,CACR,qBACA,8BACD,EACA,QAAW,GACX,KAAQ,gBACT,EACA,iBAAoB,CACnB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,qBAAwB,CACvB,MAAS,CACR,oBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,sBAAyB,CACxB,MAAS,CACR,mBACA,kBACA,oBACA,sBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,oBAAuB,CACtB,MAAS,CACR,mBACA,kBACA,oBACA,sBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,oBAAuB,CACtB,MAAS,CACR,sBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,mBAAsB,CACrB,MAAS,CACR,sBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,2BAA8B,CAC7B,MAAS,CACR,wBACA,sBACA,qBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,gCAAmC,CAClC,MAAS,CACR,mBACA,4BACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,qBAAwB,CACvB,MAAS,CACR,iCACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,wBAA2B,CAC1B,MAAS,CACR,0BACA,sBACA,gCACA,qBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,sBAAyB,CACxB,MAAS,CACR,0BACA,kBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,8BAAiC,CAChC,MAAS,CACR,0BACA,oBACA,sBACA,kBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,oBAAuB,CACtB,MAAS,CACR,0BACA,sBACA,6BACA,kBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,uBAA0B,CACzB,MAAS,CACR,kCACA,uBACA,wBACA,gCACA,qBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,sBAAyB,CACxB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,mBAAsB,CACrB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,sBAAyB,CACxB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,sBAAyB,CACxB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,uBAA0B,CACzB,MAAS,CACR,wBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,0BAA6B,CAC5B,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,aACT,EACA,oBAAuB,CACtB,MAAS,CACR,kCACA,uBACA,wBACA,gCACA,qBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,mBAAsB,CACrB,MAAS,CACR,sBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,kBAAqB,CACpB,MAAS,CACR,oBACA,qBACA,mBACA,sBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,oBAAuB,CACtB,MAAS,CACR,qBACA,sBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,iBAAoB,CACnB,MAAS,CACR,sBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,wBAA2B,CAC1B,MAAS,CACR,wBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,gBAAmB,CAClB,MAAS,CACR,sBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,uBAA0B,CACzB,MAAS,CACR,mBACA,qBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,wBAA2B,CAC1B,MAAS,CACR,qBACA,oBACA,sBACA,mBACA,0BACA,kBACA,wBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,qBAAwB,CACvB,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,0BAA6B,CAC5B,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,oBAAuB,CACtB,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,0BAA6B,CAC5B,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,qBAAwB,CACvB,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,0BAA6B,CAC5B,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,oBAAuB,CACtB,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,0BAA6B,CAC5B,MAAS,CACR,oBACA,QACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,2BAA8B,CAC7B,MAAS,CACR,mBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,eAAkB,CACjB,MAAS,CACR,uBACA,4BACA,sBACA,4BACA,uBACA,4BACA,sBACA,4BACA,4BACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,eAAkB,CACjB,MAAS,CACR,0BACA,gBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,eAAkB,CACjB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,OACT,EACA,gCAAmC,CAClC,MAAS,CACR,QACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,sBAAyB,CACxB,MAAS,CACR,4BACA,+BACA,yBACA,iBACA,iBACA,iCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,oCAAuC,CACtC,MAAS,CACR,4BACA,+BACA,yBACA,iBACA,wBACA,iCACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,eAAkB,CACjB,MAAS,CACR,uBACA,wBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,sBAAyB,CACxB,MAAS,CACR,4BACA,+BACA,yBACA,iBACA,iBACA,iCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,kCAAqC,CACpC,MAAS,CACR,4BACA,+BACA,yBACA,iBACA,wBACA,kCACA,sBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,wBAA2B,CAC1B,MAAS,CACR,cACA,oBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,6BAAgC,CAC/B,MAAS,CACR,sCACA,oCACA,yBACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,sCAAyC,CACxC,MAAS,CACR,8BACD,EACA,QAAW,GACX,KAAQ,OACT,EACA,sBAAyB,CACxB,MAAS,CACR,4BACA,+BACA,yBACA,iBACA,wCACA,iCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,gBAAmB,CAClB,MAAS,CACR,iBACA,uBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,kBAAqB,CACpB,MAAS,CACR,+BACA,wCACA,iCACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,kBAAqB,CACpB,MAAS,CACR,mBACA,kBACA,mBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,wBAA2B,CAC1B,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,aACT,EACA,kBAAqB,CACpB,MAAS,CACR,oBACA,yBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,iBAAoB,CACnB,MAAS,CACR,qBACA,mBACD,EACA,QAAW,GACX,KAAQ,sBACT,EACA,mBAAsB,CACrB,MAAS,CACR,+BACA,iCACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,gBAAmB,CAClB,MAAS,CACR,gBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,uBAA0B,CACzB,MAAS,CACR,4BACA,+BACA,yBACA,kBACA,iCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,gBAAmB,CAClB,MAAS,CACR,qBACA,wBACD,EACA,QAAW,GACX,KAAQ,GACT,EACA,8BAAiC,CAChC,MAAS,CACR,mBACA,kBACA,iBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,oBAAuB,CACtB,MAAS,CACR,oBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,yBAA4B,CAC3B,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,8BAAiC,CAChC,MAAS,CACR,gCACA,sBACA,0BACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,8BAAiC,CAChC,MAAS,CACR,qBACA,+BACD,EACA,QAAW,GACX,KAAQ,kBACT,EACA,mCAAsC,CACrC,MAAS,CACR,yBACA,uBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,8BAAiC,CAChC,MAAS,CACR,oCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,qCAAwC,CACvC,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,oCAAuC,CACtC,MAAS,CACR,gCACA,sCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,qCAAwC,CACvC,MAAS,CACR,gCACA,sCACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,sCAAyC,CACxC,MAAS,CACR,wBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,uCAA0C,CACzC,MAAS,CACR,yBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,qCAAwC,CACvC,MAAS,CACR,uBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,8BAAiC,CAChC,MAAS,CACR,4BACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,gCAAmC,CAClC,MAAS,CACR,oBACA,sCACA,uCACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,oCAAuC,CACtC,MAAS,CACR,iCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,iCAAoC,CACnC,MAAS,CACR,oBACA,uCACA,wCACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,+BAAkC,CACjC,MAAS,CACR,oBACA,qCACA,sCACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,4BAA+B,CAC9B,MAAS,CACR,sBACA,yBACA,mBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,sBAAyB,CACxB,MAAS,CACR,yBACA,6BACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,0BAA6B,CAC5B,MAAS,CACR,uBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,uBAA0B,CACzB,MAAS,CACR,gCACA,+BACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,iCAAoC,CACnC,MAAS,CACR,qBACA,oBACA,0BACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,sBAAyB,CACxB,MAAS,CACR,yBACA,8BACA,kCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,6BAAgC,CAC/B,MAAS,CACR,oBACA,qBACA,mBACA,sBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,2BAA8B,CAC7B,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,oBAAuB,CACtB,MAAS,CACR,SACA,oBACA,gBACA,iBACA,iBACA,WACA,qBACA,mBACA,uBACA,4BACA,8BACA,kCACA,+BACA,mCACA,6BACA,iCACA,oBACA,wBACA,wBACA,kBACD,EACA,QAAW,GACX,KAAQ,aACT,EACA,wBAA2B,CAC1B,MAAS,CACR,qBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,2BAA8B,CAC7B,MAAS,CACR,kCACA,mCACA,iCACA,wBACA,yBACA,wBACA,+BACA,qBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,iCAAoC,CACnC,MAAS,CACR,8BACA,iCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,kCAAqC,CACpC,MAAS,CACR,+BACA,kCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,gCAAmC,CAClC,MAAS,CACR,6BACA,gCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,sBAAyB,CACxB,MAAS,CACR,oBACA,uBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,uBAA0B,CACzB,MAAS,CACR,qBACA,wBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,wBAA2B,CAC1B,MAAS,CACR,gBACA,8BACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,wBAA2B,CAC1B,MAAS,CACR,uBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,qBAAwB,CACvB,MAAS,CACR,8BACA,+BACA,6BACA,oBACA,mCACA,oCACA,kCACA,uBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,+BAAkC,CACjC,MAAS,CACR,qBACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,sBAAyB,CACxB,MAAS,CACR,mCACA,oCACA,kCACA,wBACA,yBACA,0BACA,0BACA,uBACA,gCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,yBAA4B,CAC3B,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,uBAA0B,CACzB,MAAS,CACR,qBACA,wBACA,0BACD,EACA,QAAW,GACX,KAAQ,kBACT,EACA,eAAkB,CACjB,MAAS,CACR,wBACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,+BAAkC,CACjC,MAAS,CACR,8BACA,iCACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,gCAAmC,CAClC,MAAS,CACR,+BACA,kCACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,8BAAiC,CAChC,MAAS,CACR,6BACA,gCACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,qBAAwB,CACvB,MAAS,CACR,oBACA,uBACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,sBAAyB,CACxB,MAAS,CACR,qBACA,wBACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,uBAA0B,CACzB,MAAS,CACR,wBACA,kBACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,4BAA+B,CAC9B,MAAS,CACR,oBACA,gBACA,qBACA,mBACA,uBACA,8BACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,0BAA6B,CAC5B,MAAS,CACR,qBACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,qBAAwB,CACvB,MAAS,CACR,iCACA,kCACA,gCACA,uBACA,wBACA,yBACA,8BACA,2BACD,EACA,QAAW,GACX,KAAQ,QACT,EACA,uBAA0B,CACzB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,SACT,EACA,gBAAmB,CAClB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,SACT,EACA,uBAA0B,CACzB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,EACT,EACA,8BAAiC,CAChC,MAAS,CACR,wBACA,wBACA,mCACA,sBACA,8BACA,yBACA,uCACD,EACA,QAAW,GACX,KAAQ,SACT,EACA,6BAAgC,CAC/B,MAAS,CACR,qBACA,+BACD,EACA,QAAW,GACX,KAAQ,EACT,EACA,cAAiB,CAChB,MAAS,CAAC,EACV,QAAW,GACX,KAAQ,SACT,EACA,wBAA2B,CAC1B,MAAS,CACR,yBACA,wCACA,sBACA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AAa,CACX,YAAe,mIACf,MAAS,CACP,KAAQ,CACN,MAAS,EACT,QAAW,GACX,QAAW,EACb,EACA,SAAY,CACV,MAAS,EACT,QAAW,GACX,QAAW,CACb,CACF,EACA,OAAU,CACR,KAAQ,CACN,MAAS,GACT,QAAW,GACX,QAAW,EACb,EACA,SAAY,CACV,MAAS,GACT,QAAW,GACX,QAAW,CACb,CACF,CACF,EACA,QAAW,CACT,YAAe,mOACf,MAAS,GACT,wBAA2B,EAC7B,EACA,UAAa,CACX,YAAe,gEACf,UAAa,CACX,MACA,MACA,OACA,MACA,MACA,MACA,OACA,OACA,OACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,OACA,OACA,OACA,MACA,MACA,KACA,MACA,OACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,MACA,MACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,MACA,OACA,KACA,OACA,OACA,KACA,MACA,OACA,OACA,OACA,OACA,MACA,OACA,KACA,OACA,OACA,MACA,MACA,OACA,OACA,OACA,OACA,MACA,OACA,KACA,OACA,OACA,KACA,MACA,OACA,OACA,OACA,OACA,MACA,OACA,KACA,OACA,OACA,KACA,OACA,OACA,OACA,OACA,MACA,MACA,OACA,KACA,OACA,MACA,KACA,OACA,OACA,OACA,OACA,MACA,MACA,OACA,KACA,OACA,MACA,KACA,MACA,OACA,OACA,OACA,MACA,KACA,OACA,KACA,OACA,MACA,KACA,MACA,OACA,MACA,MACA,MACA,KACA,OACA,KACA,OACA,MACA,KACA,OACA,OACA,MACA,MACA,MACA,KACA,OACA,MACA,OACA,MACA,KACA,MACA,OACA,MACA,MACA,MACA,KACA,OACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,KACA,OACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,KACA,OACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,OACA,KACA,OACA,MACA,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MAAoBC,QAAQC,IAAI,CACnCN,EACAf,CAAAA,CAAAA,EAEJ,OAAOmB,CACX,OAASG,EAAAA,CACL,GAAI3B,GAAO,MAAPA,EAAS4B,QAAS,MAAMD,EAE5B,OADI5B,GAAS8B,QAAQF,MAAM,+BAAgCA,CAAAA,EACpD,IACX,CACJ,EAAA,EAAC/B,IAAAqB,MAAAC,KAAAC,SAAAA,CAAA,CC7BD,IAAMW,IAA0B,CAC5B,YACA,mBACA,sBACA,WACA,kBACA,YACA,uBACA,cACA,UACA,cACA,oBACA,gBACA,WACA,cACA,mBACA,kBACA,yBACA,UACA,cACA,WACA,cACA,qBACA,UACA,SACA,SACA,WACA,YACA,YACA,WACA,iBACA,WACA,WACA,WACA,QACA,iBACA,WACA,aACA,oBACA,YACA,eACA,YACA,UACA,UACA,UACA,QACA,OACA,UACA,YACA,kBACA,aACA,eACA,iBACA,SACA,gBACA,eACA,gBACA,oBACA,kBACA,cACA,iBACA,UACA,0BACA,gBACA,cACA,mBACA,qBACA,iBACA,qBACA,oBACA,YACA,cACA,wBACA,iBACA,uBACA,kBACA,wBACA,YAAA,EAEEC,IAAc,SAASC,EAAIC,EAAAA,CAC7B,GAD6BA,IAC7B,SAD6BA,EAA0B,CAAA,GAAA,CAClDD,EAAI,MAAA,GACT,IAAME,EAAUF,EAAGG,YAAAA,EACnB,OAAOL,IAAwBM,OAAOH,CAAAA,EAAyBI,MAAMC,GAAAA,CACjE,IAAMC,EAAiBD,EAAUH,YAAAA,EACjC,OAAcD,EAAQM,QAAQD,CAAAA,IAA9B,EAA6C,EAAA,CAErD,ECoCME,IAA2B,CAC7B,YACA,YACA,aACA,OACA,mBACA,cACA,eACA,YACA,iBACA,gBACA,6BACA,0BACA,6BACA,sBAAA,ECxIJ,SAASC,GAASC,EAAKC,EAAAA,CACnB,OAAcD,EAAIH,QAAQI,CAAAA,IAA1B,EACJ,CACA,IAAMC,GAAO,SAASF,EAAAA,CAClB,OAAOA,EAAIE,KAAAA,CACf,EACMC,IAAqB,SAASC,EAAAA,CAChC,OAAOA,EAAEC,QAAQ,MAAO,EAAA,CAC5B,ECLMC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",
  "names": ["require_requires_port", "__commonJSMin", "exports", "module", "port", "protocol", "require_querystringify", "__commonJSMin", "exports", "has", "undef", "decode", "input", "encode", "querystring", "query", "parser", "result", "part", "key", "value", "querystringify", "obj", "prefix", "pairs", "require_url_parse", "__commonJSMin", "exports", "module", "required", "qs", "controlOrWhitespace", "CRHTLF", "slashes", "port", "protocolre", "windowsDriveLetter", "trimLeft", "str", "rules", "address", "url", "isSpecial", "ignore", "lolcation", "loc", "globalVar", "location", "finaldestination", "type", "key", "Url", "scheme", "extractProtocol", "match", "protocol", "forwardSlashes", "otherSlashes", "slashesCount", "rest", "resolve", "relative", "base", "path", "i", "last", "unshift", "up", "parser", "extracted", "parse", "instruction", "index", "instructions", "set", "part", "value", "fn", "char", "ins", "toString", "stringify", "query", "host", "result", "require_pure", "__commonJSMin", "exports", "_typeof", "obj", "RELEASE_TRAIN", "runtimeVersionToUrlVersion", "version", "ORIGIN", "STRIPE_JS_URL", "V3_URL_REGEX", "STRIPE_JS_URL_REGEX", "EXISTING_SCRIPT_MESSAGE", "isStripeJSURL", "url", "findScript", "scripts", "i", "script", "injectScript", "params", "queryString", "headOrBody", "registerWrapper", "stripe", "startTime", "stripePromise", "onErrorListener", "onLoadListener", "onError", "reject", "cause", "onLoad", "resolve", "loadScript", "_script$parentNode", "error", "initStripe", "maybeStripe", "args", "pk", "isTestKey", "expectedVersion", "validateLoadParams", "errorMessage", "loadParams", "loadStripeCalled", "loadStripe", "_len", "_key", "validatedParams", "parameterKeys", "sameParameters", "previousValue", "currentValue", "_loadParams", "require_pure", "__commonJSMin", "exports", "module", "htmx", "elt", "type", "verb", "str", "interval", "name", "qualifiedName", "parent", "global", "condition", "initialElement", "ancestor", "attributeName", "attributeValue", "disinherit", "inherit", "closestAttr", "e", "selector", "match", "resp", "fragment", "script", "newScript", "attr", "response", "responseWithNoHead", "startTag", "doc", "titleElement", "func", "o", "dataProp", "data", "arr", "returnArr", "i", "el", "rect", "elemTop", "elemBottom", "trigger", "obj1", "obj2", "key", "jString", "error", "test", "path", "url", "callback", "evt", "event", "eltOrSelector", "delay", "value", "clazz", "node", "child", "prefix", "suffix", "trimmedSelector", "parts", "chevronsCount", "offset", "char", "result", "unprocessedParts", "item", "standardSelector", "rootNode", "start", "results", "context", "arg1", "arg2", "arg3", "arg4", "eventArgs", "attrName", "attrTarget", "eltToInheritFrom", "attribute", "targetStr", "mergeTo", "mergeFrom", "swapStyle", "target", "extensions", "extension", "oobValue", "oobElement", "settleInfo", "targets", "oobElementClone", "beforeSwapDetails", "pantry", "preservedElt", "existingElement", "id", "parentNode", "newNode", "parentElt", "oldNode", "newAttributes", "autofocus", "autoFocusedElt", "insertBefore", "string", "hash", "internalData", "handlerInfo", "element", "info", "newElt", "eltBeforeNewContent", "firstChild", "ext", "newElements", "j", "oobElts", "content", "swapSpec", "swapOptions", "settleResolve", "settleReject", "doSwap", "activeElt", "selectionInfo", "oobSelectValues", "oobSelectValue", "template", "newFragment", "newActiveElt", "focusOptions", "doSettle", "task", "anchorTarget", "shouldTransition", "settlePromise", "_resolve", "_reject", "innerDoSwap", "xhr", "header", "triggerBody", "triggers", "eventName", "detail", "eventNames", "tokens", "position", "startPosition", "startChar", "symbol", "token", "last", "paramName", "bracketCount", "conditionalSource", "conditionFunction", "explicitTrigger", "cache", "triggerSpecs", "initialLength", "every", "eventFilter", "triggerSpec", "from_arg", "handler", "spec", "nodeData", "rawAttribute", "btn", "link", "samePageAnchor", "source", "explicitCancel", "elementData", "eltsToListenOn", "eltToListenOn", "eventListener", "eventData", "lastValue", "load", "explicitAction", "observerOptions", "entries", "attributes", "elements", "iter", "boostedSelector", "extensionSelectors", "selectors", "s", "form", "code", "listener", "afterOnPosition", "nextChar", "elementsToInit", "toDo", "extensionsToIgnore", "msg", "eventResult", "kebabName", "kebabedEvent", "rootElt", "innerHTML", "title", "scroll", "historyCache", "newHistoryItem", "className", "clone", "tasks", "request", "details", "cached", "indicators", "ic", "disabledElts", "disabledElement", "disabled", "ele", "processed", "formData", "v", "values", "errors", "validate", "input", "receiver", "donor", "priorityFormData", "button", "includes", "descendant", "returnStr", "realValue", "prompt", "headers", "inputValues", "paramsValue", "newValues", "swapInfoOverride", "swapInfo", "split", "splitSpec", "scrollVal", "selectorVal", "showVal", "focusScrollVal", "filteredParameters", "encodedParameters", "first", "evalAsDefault", "evaluateValue", "varsValues", "toEval", "defaultVal", "expressionVars", "headerValue", "regexp", "resolvedTarget", "requestConfig", "sameHost", "obj", "array", "index", "prop", "etc", "confirmed", "resolve", "reject", "promise", "responseHandler", "select", "eltData", "submitter", "buttonPath", "buttonVerb", "confirmQuestion", "skipConfirmation", "syncElt", "syncStrategy", "queueStrategy", "abortable", "syncStrings", "endRequestLock", "promptQuestion", "promptResponse", "rawFormData", "allFormData", "filteredFormData", "requestAttrValues", "eltIsBoosted", "useUrlParams", "splitPath", "pathNoAnchor", "anchor", "finalPath", "responseInfo", "hierarchy", "disableElts", "secondaryTriggerElt", "parentEltInHierarchy", "params", "pathFromHeaders", "typeFromHeaders", "requestPath", "responsePath", "pushUrl", "replaceUrl", "elementIsBoosted", "saveType", "responseHandlingConfig", "status", "regExp", "responseHandlingElement", "titleElt", "responseInfoSelect", "redirectPath", "redirectSwapSpec", "shouldRefresh", "historyUpdate", "responseHandling", "shouldSwap", "isError", "ignoreTitle", "selectOverride", "swapOverride", "serverResponse", "selectOOB", "finalElt", "api", "text", "parameters", "extensionsToReturn", "extensionsForElement", "extensionName", "fn", "nonceAttribute", "indicator", "metaConfig", "body", "restoredElts", "originalPopstate", "htmx_esm_default", "flushPending", "flushing", "queue", "lastFlushedIndex", "transactionActive", "scheduler", "callback", "queueJob", "startTransaction", "commitTransaction", "queueFlush", "job", "dequeueJob", "index", "flushJobs", "i", "reactive", "effect", "release", "raw", "shouldSchedule", "disableEffectScheduling", "setReactivityEngine", "engine", "task", "overrideEffect", "override", "elementBoundEffect", "el", "cleanup2", "effectReference", "watch", "getter", "firstTime", "oldValue", "oldValueJSON", "value", "newJSON", "previousValue", "transaction", "onAttributeAddeds", "onElRemoveds", "onElAddeds", "onElAdded", "onElRemoved", "onAttributesAdded", "onAttributeRemoved", "name", "cleanupAttributes", "names", "cleanupElement", "observer", "onMutate", "currentlyObserving", "startObservingMutations", "stopObservingMutations", "flushObserver", "queuedMutations", "records", "queueLengthWhenTriggered", "mutateDom", "result", "isCollecting", "deferredMutations", "deferMutations", "flushAndStopDeferringMutations", "mutations", "addedNodes", "removedNodes", "addedAttributes", "removedAttributes", "node", "add2", "remove", "attrs", "scope", "mergeProxies", "closestDataStack", "addScopeToNode", "data2", "referenceNode", "objects", "mergeProxyTrap", "keyInPrototypeChain", "obj", "key", "thisProxy", "collapseProxies", "target", "descriptor", "acc", "initInterceptors", "isObject3", "val", "recurse", "basePath", "enumerable", "path", "interceptor", "mutateObj", "get", "set", "initialValue", "initialize", "innerValue", "carry", "segment", "magics", "magic", "injectMagics", "memoizedUtilities", "getUtilities", "utilities", "getElementBoundUtilities", "utils", "tryCatch", "expression", "args", "e", "handleError", "errorHandler", "normalErrorHandler", "setErrorHandler", "handler4", "error2", "shouldAutoEvaluateFunctions", "dontAutoEvaluateFunctions", "cache", "evaluate", "extras", "evaluateLater", "theEvaluatorFunction", "setEvaluator", "newEvaluator", "theRawEvaluatorFunction", "setRawEvaluator", "normalEvaluator", "overriddenMagics", "dataStack", "evaluator", "generateEvaluatorFromFunction", "generateEvaluatorFromString", "func", "receiver", "scope2", "params", "context", "runIfTypeOfFunction", "evaluatorMemo", "generateFunctionFromString", "AsyncFunction", "rightSideSafeExpression", "func2", "completeScope", "promise", "evaluateRaw", "normalRawEvaluator", "prefixAsString", "prefix", "subject", "setPrefix", "newPrefix", "directiveHandlers", "directive", "directive2", "pos", "directiveOrder", "directiveExists", "directives", "attributes", "originalAttributeOverride", "vAttributes", "staticAttributes", "attributesOnly", "attribute", "attr", "transformedAttributeMap", "toTransformedAttributes", "newName", "oldName", "outNonAlpineAttributes", "toParsedDirectives", "byPriority", "getDirectiveHandler", "isDeferringHandlers", "directiveHandlerStacks", "currentHandlerStackKey", "deferHandlingDirectives", "flushHandlers", "stopDeferring", "cleanups", "effect3", "cleanupEffect", "alpine_default", "noop", "fullHandler", "startingWith", "replacement", "into", "newValue", "attributeTransformers", "transform", "mapAttributes", "alpineAttributeRegex", "typeMatch", "valueMatch", "modifiers", "original", "DEFAULT", "a", "b", "typeA", "typeB", "dispatch", "detail", "options", "walk", "el2", "skip", "warn", "message", "started", "start", "initTree", "destroyTree", "handle", "outNestedComponents", "closestRoot", "allSelectors", "warnAboutMissingPlugins", "rootSelectorCallbacks", "initSelectorCallbacks", "rootSelectors", "fn", "addRootSelector", "selectorCallback", "addInitSelector", "includeInitSelectors", "findClosest", "element", "selector", "isRoot", "initInterceptors2", "interceptInit", "markerDispenser", "walker", "intercept", "root", "plugin2", "selectors", "tickStack", "isHolding", "nextTick", "releaseNextTicks", "res", "holdNextTicks", "setClasses", "setClassesFromString", "setClassesFromObject", "splitClasses", "classString", "missingClasses", "classString2", "addClassesAndReturnUndo", "classes", "classObject", "forAdd", "bool", "forRemove", "added", "removed", "setStyles", "setStylesFromObject", "setStylesFromString", "previousStyles", "value2", "kebabCase", "once", "fallback", "called", "evaluate2", "registerTransitionsFromHelper", "registerTransitionsFromClassString", "stage", "registerTransitionObject", "doesntSpecify", "transitioningIn", "transitioningOut", "wantsAll", "wantsOpacity", "wantsScale", "opacityValue", "scaleValue", "modifierValue", "delay", "origin", "property", "durationIn", "durationOut", "easing", "setFunction", "defaultValue", "before", "after", "transition", "show", "hide", "nextTick2", "clickAwayCompatibleShow", "resolve", "reject", "closest", "closestHide", "hideAfterChildren", "parent", "during", "start2", "end", "undoStart", "undoDuring", "undoEnd", "performTransition", "stages", "interrupted", "reachedBefore", "reachedEnd", "finish", "duration", "rawValue", "match", "isCloning", "skipDuringClone", "onlyDuringClone", "interceptors", "interceptClone", "cloneNode", "from", "to", "dontRegisterReactiveSideEffects", "isCloningLegacy", "clone", "oldEl", "newEl", "cloneTree", "hasRunThroughFirstEl", "el3", "callback2", "storedEffect", "bind", "camelCase", "bindInputValue", "bindStyles", "bindClasses", "bindAttributeAndProperty", "bindAttribute", "isRadio", "isCheckbox", "checkedAttrLooseCompare", "updateSelect", "setPropertyIfChanged", "attributeShouldntBePreservedIfFalsy", "isBooleanAttr", "setIfChanged", "attrName", "propName", "arrayWrappedValue", "option", "char", "valueA", "valueB", "safeParseBoolean", "booleanAttributes", "getBinding", "getAttributeBinding", "extractProp", "extract", "binding", "debounce", "wait", "timeout", "later", "throttle", "limit", "inThrottle", "entangle", "outerGet", "outerSet", "innerGet", "innerSet", "firstRun", "outerHash", "innerHash", "reference", "outer", "inner", "cloneIfObject", "outerHashLatest", "innerHashLatest", "plugin", "stores", "isReactive", "store", "getStores", "binds", "bind2", "bindings", "getBindings", "applyBindingsObject", "injectBindingProviders", "cleanupRunners", "datas", "data", "injectDataProviders", "Alpine", "makeMap", "str", "expectsLowerCase", "map", "list", "specialBooleanAttrs", "isBooleanAttr2", "EMPTY_OBJ", "EMPTY_ARR", "hasOwnProperty", "hasOwn", "isArray", "isMap", "toTypeString", "isString", "isSymbol", "isObject", "objectToString", "toRawType", "isIntegerKey", "cacheStringFunction", "camelizeRE", "camelize", "_", "c", "hyphenateRE", "hyphenate", "capitalize", "toHandlerKey", "hasChanged", "targetMap", "effectStack", "activeEffect", "ITERATE_KEY", "MAP_KEY_ITERATE_KEY", "isEffect", "effect2", "createReactiveEffect", "stop", "cleanup", "uid", "enableTracking", "resetTracking", "deps", "shouldTrack", "trackStack", "pauseTracking", "last", "track", "type", "depsMap", "dep", "trigger", "oldTarget", "effects", "effectsToAdd", "key2", "run", "isNonTrackableKeys", "builtInSymbols", "get2", "createGetter", "readonlyGet", "arrayInstrumentations", "createArrayInstrumentations", "instrumentations", "arr", "toRaw", "l", "isReadonly", "shallow", "shallowReadonlyMap", "readonlyMap", "shallowReactiveMap", "reactiveMap", "targetIsArray", "isRef", "readonly", "reactive2", "set2", "createSetter", "hadKey", "deleteProperty", "has", "ownKeys", "mutableHandlers", "readonlyHandlers", "toReactive", "toReadonly", "toShallow", "getProto", "v", "get$1", "isShallow", "rawTarget", "rawKey", "has2", "wrap", "has$1", "size", "add", "set$1", "get3", "checkIdentityKeys", "deleteEntry", "clear", "hadItems", "createForEach", "thisArg", "observed", "createIterableMethod", "method", "targetIsMap", "isPair", "isKeyOnly", "innerIterator", "done", "createReadonlyMethod", "createInstrumentations", "mutableInstrumentations2", "shallowInstrumentations2", "readonlyInstrumentations2", "shallowReadonlyInstrumentations2", "mutableInstrumentations", "readonlyInstrumentations", "shallowInstrumentations", "shallowReadonlyInstrumentations", "createInstrumentationGetter", "mutableCollectionHandlers", "readonlyCollectionHandlers", "targetTypeMap", "rawType", "getTargetType", "createReactiveObject", "baseHandlers", "collectionHandlers", "proxyMap", "existingProxy", "targetType", "proxy", "r", "evaluateLater2", "unwatch", "getArrayOfRefObject", "refObjects", "globalIdMemo", "findAndIncrementId", "closestIdRoot", "setIdRoot", "cacheKey", "cacheIdByNameOnElement", "id", "output", "warnMissingPluginMagic", "magicName", "slug", "evaluateInnerSet", "releaseEntanglement", "getTarget", "clone2", "eventName", "placeInDom", "clone3", "target2", "modifiers2", "teleportContainerDuringClone", "handler", "on", "event", "listenerTarget", "wrapHandler", "wrapper", "dotSyntax", "camelCase2", "addDebounceOrThrottle", "next", "isKeyEvent", "isClickEvent", "isListeningForASpecificKeyThatHasntBeenPressed", "nextModifier", "isNumeric", "kebabCase2", "keyModifiers", "debounceIndex", "keyToModifiers", "selectedSystemKeyModifiers", "modifier", "modifierToKeyMap", "scopeTarget", "evaluateGet", "evaluateSet", "getValue", "isGetterSetter", "setValue", "hasChangeModifier", "hasBlurModifier", "hasEnterModifier", "hasExplicitEventModifiers", "removeListener", "listeners", "syncValue", "getInputValue", "form", "syncCallback", "removeResetListener", "currentValue", "safeParseNumber", "checkedAttrLooseCompare2", "number", "isNumeric2", "handler2", "bindingProviders", "storeKeyForXFor", "shouldSkipRegisteringDataDuringClone", "magicContext", "dataProviderContext", "reactiveData", "undo", "toggle", "iteratorNames", "parseForExpression", "evaluateItems", "evaluateKey", "loop", "refreshScope", "newScope", "templateEl", "items", "isNumeric3", "oldLookup", "lookup", "hasStringKeys", "isObject2", "scopeEntries", "item", "getIterationScopeVariables", "innerKey", "prev", "reactiveScope", "forIteratorRE", "stripParensRE", "forAliasRE", "inMatch", "iteratorMatch", "scopeVariables", "handler3", "warnMissingPluginDirective", "directiveName", "src_default", "module_default", "src_default", "Alpine", "collapse", "el", "modifiers", "duration", "modifierValue", "floor", "fullyHide", "setFunction", "el2", "styles", "revertFunction", "transitionStyles", "before", "after", "current", "full", "key", "fallback", "rawValue", "match", "module_default", "src_default", "Alpine", "el", "value", "expression", "modifiers", "evaluateLater", "cleanup", "evaluate", "options", "getRootMargin", "getThreshold", "observer", "entries", "entry", "threshold", "getLengthValue", "rawValue", "match", "key", "fallback", "index", "values", "i", "v", "module_default", "src_default", "Alpine", "persist", "alias", "storage", "e", "dummy", "initialValue", "getter", "setter", "path", "key", "lookup", "initial", "storageHas", "storageGet", "value", "storageSet", "func", "target", "get", "set", "module_default", "external_exports", "__export", "$brand", "$input", "$output", "NEVER", "TimePrecision", "ZodAny", "ZodArray", "ZodBase64", "ZodBase64URL", "ZodBigInt", "ZodBigIntFormat", "ZodBoolean", "ZodCIDRv4", "ZodCIDRv6", "ZodCUID", "ZodCUID2", "ZodCatch", "ZodCodec", "ZodCustom", "ZodCustomStringFormat", "ZodDate", "ZodDefault", "ZodDiscriminatedUnion", "ZodE164", "ZodEmail", "ZodEmoji", "ZodEnum", "ZodError", "ZodExactOptional", "ZodFile", "ZodFirstPartyTypeKind", "ZodFunction", "ZodGUID", "ZodIPv4", "ZodIPv6", "ZodISODate", "ZodISODateTime", "ZodISODuration", "ZodISOTime", "ZodIntersection", "ZodIssueCode", "ZodJWT", "ZodKSUID", "ZodLazy", "ZodLiteral", "ZodMAC", "ZodMap", "ZodNaN", "ZodNanoID", "ZodNever", "ZodNonOptional", "ZodNull", "ZodNullable", "ZodNumber", "ZodNumberFormat", "ZodObject", "ZodOptional", "ZodPipe", "ZodPrefault", "ZodPreprocess", "ZodPromise", "ZodReadonly", "ZodRealError", "ZodRecord", "ZodSet", "ZodString", "ZodStringFormat", "ZodSuccess", "ZodSymbol", "ZodTemplateLiteral", "ZodTransform", "ZodTuple", "ZodType", "ZodULID", "ZodURL", "ZodUUID", "ZodUndefined", "ZodUnion", "ZodUnknown", "ZodVoid", "ZodXID", "ZodXor", "_ZodString", "_default", "_function", "any", "array", "base64", "base64url", "bigint", "boolean", "_catch", "check", "cidrv4", "cidrv6", "clone", "codec", "coerce_exports", "config", "core_exports", "cuid", "cuid2", "custom", "date", "decode", "decodeAsync", "describe", "discriminatedUnion", "e164", "email", "emoji", "encode", "encodeAsync", "_endsWith", "_enum", "exactOptional", "file", "flattenError", "float32", "float64", "formatError", "fromJSONSchema", "getErrorMap", "globalRegistry", "_gt", "_gte", "guid", "hash", "hex", "hostname", "httpUrl", "_includes", "_instanceof", "int", "int32", "int64", "intersection", "invertCodec", "ipv4", "ipv6", "iso_exports", "json", "jwt", "keyof", "ksuid", "lazy", "_length", "literal", "locales_exports", "looseObject", "looseRecord", "_lowercase", "_lt", "_lte", "mac", "map", "_maxLength", "_maxSize", "meta", "_mime", "_minLength", "_minSize", "_multipleOf", "nan", "nanoid", "nativeEnum", "_negative", "never", "_nonnegative", "nonoptional", "_nonpositive", "_normalize", "_null", "nullable", "nullish", "number", "object", "optional", "_overwrite", "parse", "parseAsync", "partialRecord", "pipe", "_positive", "prefault", "preprocess", "prettifyError", "promise", "_property", "readonly", "record", "refine", "_regex", "regexes_exports", "registry", "safeDecode", "safeDecodeAsync", "safeEncode", "safeEncodeAsync", "safeParse", "safeParseAsync", "set", "setErrorMap", "_size", "_slugify", "_startsWith", "strictObject", "string", "stringFormat", "stringbool", "success", "superRefine", "symbol", "templateLiteral", "toJSONSchema", "_toLowerCase", "_toUpperCase", "transform", "treeifyError", "_trim", "tuple", "uint32", "uint64", "ulid", "_undefined", "union", "unknown", "_uppercase", "url", "util_exports", "uuid", "uuidv4", "uuidv6", "uuidv7", "_void", "xid", "xor", "core_exports", "__export", "$ZodAny", "$ZodArray", "$ZodAsyncError", "$ZodBase64", "$ZodBase64URL", "$ZodBigInt", "$ZodBigIntFormat", "$ZodBoolean", "$ZodCIDRv4", "$ZodCIDRv6", "$ZodCUID", "$ZodCUID2", "$ZodCatch", "$ZodCheck", "$ZodCheckBigIntFormat", "$ZodCheckEndsWith", "$ZodCheckGreaterThan", "$ZodCheckIncludes", "$ZodCheckLengthEquals", "$ZodCheckLessThan", "$ZodCheckLowerCase", "$ZodCheckMaxLength", "$ZodCheckMaxSize", "$ZodCheckMimeType", "$ZodCheckMinLength", "$ZodCheckMinSize", "$ZodCheckMultipleOf", "$ZodCheckNumberFormat", "$ZodCheckOverwrite", "$ZodCheckProperty", "$ZodCheckRegex", "$ZodCheckSizeEquals", "$ZodCheckStartsWith", "$ZodCheckStringFormat", "$ZodCheckUpperCase", "$ZodCodec", "$ZodCustom", "$ZodCustomStringFormat", "$ZodDate", "$ZodDefault", "$ZodDiscriminatedUnion", "$ZodE164", "$ZodEmail", "$ZodEmoji", "$ZodEncodeError", "$ZodEnum", "$ZodError", "$ZodExactOptional", "$ZodFile", "$ZodFunction", "$ZodGUID", "$ZodIPv4", "$ZodIPv6", "$ZodISODate", "$ZodISODateTime", "$ZodISODuration", "$ZodISOTime", "$ZodIntersection", "$ZodJWT", "$ZodKSUID", "$ZodLazy", "$ZodLiteral", "$ZodMAC", "$ZodMap", "$ZodNaN", "$ZodNanoID", "$ZodNever", "$ZodNonOptional", "$ZodNull", "$ZodNullable", "$ZodNumber", "$ZodNumberFormat", "$ZodObject", "$ZodObjectJIT", "$ZodOptional", "$ZodPipe", "$ZodPrefault", "$ZodPreprocess", "$ZodPromise", "$ZodReadonly", "$ZodRealError", "$ZodRecord", "$ZodRegistry", "$ZodSet", "$ZodString", "$ZodStringFormat", "$ZodSuccess", "$ZodSymbol", "$ZodTemplateLiteral", "$ZodTransform", "$ZodTuple", "$ZodType", "$ZodULID", "$ZodURL", "$ZodUUID", "$ZodUndefined", "$ZodUnion", "$ZodUnknown", "$ZodVoid", "$ZodXID", "$ZodXor", "$brand", "$constructor", "$input", "$output", "Doc", "json_schema_exports", "JSONSchemaGenerator", "NEVER", "TimePrecision", "_any", "_array", "_base64", "_base64url", "_bigint", "_boolean", "_catch", "_check", "_cidrv4", "_cidrv6", "_coercedBigint", "_coercedBoolean", "_coercedDate", "_coercedNumber", "_coercedString", "_cuid", "_cuid2", "_custom", "_date", "_decode", "_decodeAsync", "_default", "_discriminatedUnion", "_e164", "_email", "_emoji", "_encode", "_encodeAsync", "_endsWith", "_enum", "_file", "_float32", "_float64", "_gt", "_gte", "_guid", "_includes", "_int", "_int32", "_int64", "_intersection", "_ipv4", "_ipv6", "_isoDate", "_isoDateTime", "_isoDuration", "_isoTime", "_jwt", "_ksuid", "_lazy", "_length", "_literal", "_lowercase", "_lt", "_lte", "_mac", "_map", "_maxLength", "_maxSize", "_mime", "_minLength", "_minSize", "_multipleOf", "_nan", "_nanoid", "_nativeEnum", "_negative", "_never", "_nonnegative", "_nonoptional", "_nonpositive", "_normalize", "_null", "_nullable", "_number", "_optional", "_overwrite", "_parse", "_parseAsync", "_pipe", "_positive", "_promise", "_property", "_readonly", "_record", "_refine", "_regex", "_safeDecode", "_safeDecodeAsync", "_safeEncode", "_safeEncodeAsync", "_safeParse", "_safeParseAsync", "_set", "_size", "_slugify", "_startsWith", "_string", "_stringFormat", "_stringbool", "_success", "_superRefine", "_symbol", "_templateLiteral", "_toLowerCase", "_toUpperCase", "_transform", "_trim", "_tuple", "_uint32", "_uint64", "_ulid", "_undefined", "_union", "_unknown", "_uppercase", "_url", "_uuid", "_uuidv4", "_uuidv6", "_uuidv7", "_void", "_xid", "_xor", "clone", "config", "createStandardJSONSchemaMethod", "createToJSONSchemaMethod", "decode", "decodeAsync", "describe", "encode", "encodeAsync", "extractDefs", "finalize", "flattenError", "formatError", "globalConfig", "globalRegistry", "initializeContext", "isValidBase64", "isValidBase64URL", "isValidJWT", "locales_exports", "meta", "parse", "parseAsync", "prettifyError", "process", "regexes_exports", "registry", "safeDecode", "safeDecodeAsync", "safeEncode", "safeEncodeAsync", "safeParse", "safeParseAsync", "toDotPath", "toJSONSchema", "treeifyError", "util_exports", "version", "_a", "NEVER", "$constructor", "name", "initializer", "params", "init", "inst", "def", "_", "proto", "keys", "i", "k", "Parent", "Definition", "fn", "$brand", "$ZodAsyncError", "$ZodEncodeError", "globalConfig", "config", "newConfig", "util_exports", "__export", "BIGINT_FORMAT_RANGES", "Class", "NUMBER_FORMAT_RANGES", "aborted", "allowsEval", "assert", "assertEqual", "assertIs", "assertNever", "assertNotEqual", "assignProp", "base64ToUint8Array", "base64urlToUint8Array", "cached", "captureStackTrace", "cleanEnum", "cleanRegex", "clone", "cloneDef", "createTransparentProxy", "defineLazy", "esc", "escapeRegex", "explicitlyAborted", "extend", "finalizeIssue", "floatSafeRemainder", "getElementAtPath", "getEnumValues", "getLengthableOrigin", "getParsedType", "getSizableOrigin", "hexToUint8Array", "isObject", "isPlainObject", "issue", "joinValues", "jsonStringifyReplacer", "merge", "mergeDefs", "normalizeParams", "nullish", "numKeys", "objectClone", "omit", "optionalKeys", "parsedType", "partial", "pick", "prefixIssues", "primitiveTypes", "promiseAllObject", "propertyKeyTypes", "randomString", "required", "safeExtend", "shallowClone", "slugify", "stringifyPrimitive", "uint8ArrayToBase64", "uint8ArrayToBase64url", "uint8ArrayToHex", "unwrapMessage", "assertEqual", "val", "assertNotEqual", "assertIs", "_arg", "assertNever", "_x", "assert", "_", "getEnumValues", "entries", "numericValues", "v", "k", "joinValues", "array", "separator", "stringifyPrimitive", "jsonStringifyReplacer", "value", "cached", "getter", "nullish", "input", "cleanRegex", "source", "start", "end", "floatSafeRemainder", "step", "ratio", "roundedRatio", "tolerance", "EVALUATING", "defineLazy", "object", "key", "objectClone", "obj", "assignProp", "target", "prop", "mergeDefs", "defs", "mergedDescriptors", "def", "descriptors", "cloneDef", "schema", "getElementAtPath", "path", "acc", "promiseAllObject", "promisesObj", "keys", "promises", "results", "resolvedObj", "i", "randomString", "length", "chars", "str", "esc", "slugify", "captureStackTrace", "_args", "isObject", "data", "allowsEval", "globalConfig", "F", "isPlainObject", "o", "ctor", "prot", "shallowClone", "numKeys", "keyCount", "getParsedType", "propertyKeyTypes", "primitiveTypes", "escapeRegex", "clone", "inst", "params", "cl", "normalizeParams", "_params", "createTransparentProxy", "receiver", "descriptor", "optionalKeys", "shape", "NUMBER_FORMAT_RANGES", "BIGINT_FORMAT_RANGES", "pick", "mask", "currDef", "checks", "newShape", "omit", "extend", "existingShape", "_shape", "safeExtend", "merge", "a", "b", "partial", "Class", "oldShape", "required", "aborted", "x", "startIndex", "explicitlyAborted", "prefixIssues", "issues", "iss", "_a", "unwrapMessage", "message", "finalizeIssue", "ctx", "config", "_inst", "_continue", "_input", "rest", "getSizableOrigin", "getLengthableOrigin", "parsedType", "issue", "args", "cleanEnum", "el", "base64ToUint8Array", "base64", "binaryString", "bytes", "uint8ArrayToBase64", "base64urlToUint8Array", "base64url", "padding", "uint8ArrayToBase64url", "hexToUint8Array", "hex", "cleanHex", "uint8ArrayToHex", "initializer", "inst", "def", "jsonStringifyReplacer", "$ZodError", "$constructor", "$ZodRealError", "flattenError", "error", "mapper", "issue", "fieldErrors", "formErrors", "sub", "formatError", "processError", "path", "issues", "fullpath", "curr", "i", "el", "treeifyError", "result", "_a", "_b", "terminal", "toDotPath", "_path", "segs", "seg", "prettifyError", "lines", "a", "b", "_parse", "_Err", "schema", "value", "_ctx", "_params", "ctx", "result", "$ZodAsyncError", "e", "iss", "finalizeIssue", "config", "captureStackTrace", "parse", "$ZodRealError", "_parseAsync", "params", "parseAsync", "_safeParse", "$ZodError", "safeParse", "_safeParseAsync", "safeParseAsync", "_encode", "encode", "_decode", "decode", "_encodeAsync", "encodeAsync", "_decodeAsync", "decodeAsync", "_safeEncode", "safeEncode", "_safeDecode", "safeDecode", "_safeEncodeAsync", "safeEncodeAsync", "_safeDecodeAsync", "safeDecodeAsync", "regexes_exports", "__export", "base64", "base64url", "bigint", "boolean", "browserEmail", "cidrv4", "cidrv6", "cuid", "cuid2", "date", "datetime", "domain", "duration", "e164", "email", "emoji", "extendedDuration", "guid", "hex", "hostname", "html5Email", "httpProtocol", "idnEmail", "integer", "ipv4", "ipv6", "ksuid", "lowercase", "mac", "md5_base64", "md5_base64url", "md5_hex", "nanoid", "_null", "number", "rfc5322Email", "sha1_base64", "sha1_base64url", "sha1_hex", "sha256_base64", "sha256_base64url", "sha256_hex", "sha384_base64", "sha384_base64url", "sha384_hex", "sha512_base64", "sha512_base64url", "sha512_hex", "string", "time", "ulid", "_undefined", "unicodeEmail", "uppercase", "uuid", "uuid4", "uuid6", "uuid7", "xid", "cuid", "cuid2", "ulid", "xid", "ksuid", "nanoid", "duration", "extendedDuration", "guid", "uuid", "version", "uuid4", "uuid6", "uuid7", "email", "html5Email", "rfc5322Email", "unicodeEmail", "idnEmail", "browserEmail", "_emoji", "emoji", "ipv4", "ipv6", "mac", "delimiter", "escapedDelim", "escapeRegex", "cidrv4", "cidrv6", "base64", "base64url", "hostname", "domain", "httpProtocol", "e164", "dateSource", "date", "timeSource", "args", "hhmm", "time", "datetime", "opts", "timeRegex", "string", "params", "regex", "bigint", "integer", "number", "boolean", "_null", "_undefined", "lowercase", "uppercase", "hex", "fixedBase64", "bodyLength", "padding", "fixedBase64url", "length", "md5_hex", "md5_base64", "md5_base64url", "sha1_hex", "sha1_base64", "sha1_base64url", "sha256_hex", "sha256_base64", "sha256_base64url", "sha384_hex", "sha384_base64", "sha384_base64url", "sha512_hex", "sha512_base64", "sha512_base64url", "$ZodCheck", "$constructor", "inst", "def", "_a", "numericOriginMap", "$ZodCheckLessThan", "origin", "bag", "curr", "payload", "$ZodCheckGreaterThan", "$ZodCheckMultipleOf", "floatSafeRemainder", "$ZodCheckNumberFormat", "isInt", "minimum", "maximum", "NUMBER_FORMAT_RANGES", "integer", "input", "$ZodCheckBigIntFormat", "BIGINT_FORMAT_RANGES", "$ZodCheckMaxSize", "val", "nullish", "getSizableOrigin", "$ZodCheckMinSize", "$ZodCheckSizeEquals", "size", "tooBig", "$ZodCheckMaxLength", "getLengthableOrigin", "$ZodCheckMinLength", "$ZodCheckLengthEquals", "length", "$ZodCheckStringFormat", "_b", "$ZodCheckRegex", "$ZodCheckLowerCase", "lowercase", "$ZodCheckUpperCase", "uppercase", "$ZodCheckIncludes", "escapedRegex", "escapeRegex", "pattern", "$ZodCheckStartsWith", "$ZodCheckEndsWith", "handleCheckPropertyResult", "result", "property", "prefixIssues", "$ZodCheckProperty", "$ZodCheckMimeType", "mimeSet", "$ZodCheckOverwrite", "Doc", "args", "fn", "arg", "lines", "x", "minIndent", "dedented", "line", "F", "version", "$ZodType", "$constructor", "inst", "def", "_a", "version", "checks", "ch", "fn", "runChecks", "payload", "ctx", "isAborted", "aborted", "asyncResult", "explicitlyAborted", "currLen", "_", "$ZodAsyncError", "handleCanaryResult", "canary", "checkResult", "result", "defineLazy", "value", "r", "safeParse", "safeParseAsync", "$ZodString", "string", "$ZodStringFormat", "$ZodCheckStringFormat", "$ZodGUID", "guid", "$ZodUUID", "v", "uuid", "$ZodEmail", "email", "$ZodURL", "trimmed", "httpProtocol", "url", "$ZodEmoji", "emoji", "$ZodNanoID", "nanoid", "$ZodCUID", "cuid", "$ZodCUID2", "cuid2", "$ZodULID", "ulid", "$ZodXID", "xid", "$ZodKSUID", "ksuid", "$ZodISODateTime", "datetime", "$ZodISODate", "date", "$ZodISOTime", "time", "$ZodISODuration", "duration", "$ZodIPv4", "ipv4", "$ZodIPv6", "ipv6", "$ZodMAC", "mac", "$ZodCIDRv4", "cidrv4", "$ZodCIDRv6", "cidrv6", "parts", "address", "prefix", "prefixNum", "isValidBase64", "data", "$ZodBase64", "base64", "isValidBase64URL", "base64url", "c", "padded", "$ZodBase64URL", "$ZodE164", "e164", "isValidJWT", "token", "algorithm", "tokensParts", "header", "parsedHeader", "$ZodJWT", "$ZodCustomStringFormat", "$ZodNumber", "number", "_ctx", "input", "received", "$ZodNumberFormat", "$ZodCheckNumberFormat", "$ZodBoolean", "boolean", "$ZodBigInt", "bigint", "$ZodBigIntFormat", "$ZodCheckBigIntFormat", "$ZodSymbol", "$ZodUndefined", "_undefined", "$ZodNull", "_null", "$ZodAny", "$ZodUnknown", "$ZodNever", "$ZodVoid", "$ZodDate", "isDate", "handleArrayResult", "final", "index", "prefixIssues", "$ZodArray", "proms", "i", "item", "handlePropertyResult", "key", "isOptionalIn", "isOptionalOut", "isPresent", "normalizeDef", "keys", "k", "okeys", "optionalKeys", "handleCatchall", "unrecognized", "keySet", "_catchall", "t", "$ZodObject", "sh", "newSh", "_normalized", "cached", "shape", "propValues", "field", "isObject", "catchall", "el", "$ZodObjectJIT", "superParse", "generateFastpass", "doc", "Doc", "normalized", "parseStr", "esc", "ids", "counter", "id", "schema", "fastpass", "jit", "globalConfig", "fastEnabled", "allowsEval", "handleUnionResults", "results", "nonaborted", "iss", "finalizeIssue", "config", "$ZodUnion", "o", "option", "patterns", "p", "cleanRegex", "first", "async", "handleExclusiveUnionResults", "successes", "$ZodXor", "$ZodDiscriminatedUnion", "_super", "pv", "val", "disc", "opts", "map", "values", "opt", "$ZodIntersection", "left", "right", "handleIntersectionResults", "mergeValues", "a", "b", "isPlainObject", "bKeys", "sharedKeys", "newObj", "sharedValue", "newArray", "itemA", "itemB", "unrecKeys", "unrecIssue", "bothKeys", "f", "merged", "$ZodTuple", "items", "optinStart", "getTupleOptStart", "optoutStart", "itemResults", "rr", "rest", "handleTupleResult", "handleTupleResults", "$ZodRecord", "recordKeys", "keyResult", "outKey", "retryResult", "$ZodMap", "valueResult", "handleMapResult", "propertyKeyTypes", "$ZodSet", "handleSetResult", "$ZodEnum", "getEnumValues", "valuesSet", "escapeRegex", "$ZodLiteral", "$ZodFile", "$ZodTransform", "$ZodEncodeError", "_out", "output", "handleOptionalResult", "$ZodOptional", "pattern", "$ZodExactOptional", "$ZodNullable", "$ZodDefault", "handleDefaultResult", "$ZodPrefault", "$ZodNonOptional", "x", "handleNonOptionalResult", "$ZodSuccess", "$ZodCatch", "$ZodNaN", "$ZodPipe", "handlePipeResult", "next", "$ZodCodec", "handleCodecAResult", "transformed", "handleCodecTxResult", "nextSchema", "$ZodPreprocess", "$ZodReadonly", "handleReadonlyResult", "$ZodTemplateLiteral", "regexParts", "part", "source", "start", "end", "primitiveTypes", "$ZodFunction", "func", "args", "parsedArgs", "parse", "parseAsync", "F", "$ZodPromise", "inner", "$ZodLazy", "d", "$ZodCustom", "$ZodCheck", "handleRefineResult", "_iss", "issue", "locales_exports", "__export", "ar_default", "az_default", "be_default", "bg_default", "ca_default", "cs_default", "da_default", "de_default", "el_default", "en_default", "eo_default", "es_default", "fa_default", "fi_default", "fr_default", "fr_CA_default", "he_default", "hr_default", "hu_default", "hy_default", "id_default", "is_default", "it_default", "ja_default", "ka_default", "kh_default", "km_default", "ko_default", "lt_default", "mk_default", "ms_default", "nl_default", "no_default", "ota_default", "pl_default", "ps_default", "pt_default", "ro_default", "ru_default", "sl_default", "sv_default", "ta_default", "th_default", "tr_default", "ua_default", "uk_default", "ur_default", "uz_default", "vi_default", "yo_default", "zh_CN_default", "zh_TW_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ar_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "az_default", "getBelarusianPlural", "count", "one", "few", "many", "absCount", "lastDigit", "lastTwoDigits", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "maxValue", "unit", "minValue", "_issue", "be_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "invalid_adj", "bg_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ca_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "cs_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "da_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "de_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "el_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "o", "en_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "eo_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "es_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fa_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fi_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fr_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fr_CA_default", "error", "TypeNames", "Sizable", "typeEntry", "t", "typeLabel", "e", "withDefinite", "verbFor", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expectedKey", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "stringified", "v", "lastValue", "sizing", "subject", "comparison", "verb", "adj", "be", "singularPhrase", "_issue", "nounEntry", "noun", "adjective", "joinValues", "he_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "hr_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "hu_default", "getArmenianPlural", "count", "one", "many", "withDefiniteArticle", "word", "vowels", "lastChar", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "maxValue", "unit", "minValue", "_issue", "hy_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "id_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "is_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "it_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ja_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ka_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "km_default", "kh_default", "km_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "suffix", "sizing", "unit", "_issue", "ko_default", "capitalizeFirstCharacter", "text", "getUnitTypeFromNumber", "number", "abs", "last", "last2", "error", "Sizable", "getSizing", "origin", "unitType", "inclusive", "targetShouldBe", "result", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "sizing", "adj", "_issue", "lt_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "mk_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ms_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "longName", "shortName", "_issue", "nl_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "no_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ota_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ps_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "pl_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "pt_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ro_default", "getRussianPlural", "count", "one", "few", "many", "absCount", "lastDigit", "lastTwoDigits", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "maxValue", "unit", "minValue", "_issue", "ru_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "sl_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "sv_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ta_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "th_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "tr_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "uk_default", "ua_default", "uk_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ur_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "uz_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "vi_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "zh_CN_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "zh_TW_default", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "yo_default", "_a", "$output", "$input", "$ZodRegistry", "schema", "_meta", "meta", "p", "pm", "f", "registry", "globalRegistry", "_string", "Class", "params", "normalizeParams", "_coercedString", "_email", "_guid", "_uuid", "_uuidv4", "_uuidv6", "_uuidv7", "_url", "_emoji", "_nanoid", "_cuid", "_cuid2", "_ulid", "_xid", "_ksuid", "_ipv4", "_ipv6", "_mac", "_cidrv4", "_cidrv6", "_base64", "_base64url", "_e164", "_jwt", "TimePrecision", "_isoDateTime", "_isoDate", "_isoTime", "_isoDuration", "_number", "_coercedNumber", "_int", "_float32", "_float64", "_int32", "_uint32", "_boolean", "_coercedBoolean", "_bigint", "_coercedBigint", "_int64", "_uint64", "_symbol", "_undefined", "_null", "_any", "_unknown", "_never", "_void", "_date", "_coercedDate", "_nan", "_lt", "value", "$ZodCheckLessThan", "_lte", "_gt", "value", "params", "$ZodCheckGreaterThan", "normalizeParams", "_gte", "_positive", "params", "_gt", "_negative", "_lt", "_nonpositive", "_lte", "_nonnegative", "_gte", "_multipleOf", "value", "$ZodCheckMultipleOf", "normalizeParams", "_maxSize", "maximum", "$ZodCheckMaxSize", "_minSize", "minimum", "$ZodCheckMinSize", "_size", "size", "$ZodCheckSizeEquals", "_maxLength", "$ZodCheckMaxLength", "_minLength", "$ZodCheckMinLength", "_length", "length", "$ZodCheckLengthEquals", "_regex", "pattern", "$ZodCheckRegex", "_lowercase", "$ZodCheckLowerCase", "_uppercase", "$ZodCheckUpperCase", "_includes", "includes", "$ZodCheckIncludes", "_startsWith", "prefix", "$ZodCheckStartsWith", "_endsWith", "suffix", "$ZodCheckEndsWith", "_property", "property", "schema", "$ZodCheckProperty", "_mime", "types", "$ZodCheckMimeType", "_overwrite", "tx", "$ZodCheckOverwrite", "_normalize", "form", "input", "_trim", "_toLowerCase", "_toUpperCase", "_slugify", "slugify", "_array", "Class", "element", "_union", "options", "_xor", "_discriminatedUnion", "discriminator", "_intersection", "left", "right", "_tuple", "items", "_paramsOrRest", "_params", "hasRest", "$ZodType", "rest", "_record", "keyType", "valueType", "_map", "_set", "_enum", "values", "entries", "v", "_nativeEnum", "_literal", "_file", "_transform", "fn", "_optional", "innerType", "_nullable", "_default", "defaultValue", "shallowClone", "_nonoptional", "_success", "_catch", "catchValue", "_pipe", "in_", "out", "_readonly", "_templateLiteral", "parts", "_lazy", "getter", "_promise", "_custom", "norm", "_refine", "_superRefine", "ch", "_check", "payload", "issue", "_issue", "$ZodCheck", "describe", "description", "inst", "existing", "globalRegistry", "meta", "metadata", "_stringbool", "Classes", "truthyArray", "falsyArray", "truthySet", "falsySet", "_Codec", "$ZodCodec", "_Boolean", "$ZodBoolean", "_String", "$ZodString", "stringSchema", "booleanSchema", "codec", "data", "_payload", "_stringFormat", "format", "fnOrRegex", "def", "val", "initializeContext", "params", "target", "globalRegistry", "process", "schema", "ctx", "_params", "_a", "def", "seen", "result", "overrideSchema", "_json", "processor", "parent", "meta", "isTransforming", "extractDefs", "root", "idToSchema", "entry", "id", "existing", "makeURI", "defsSegment", "externalId", "uriGenerator", "defUriPrefix", "defId", "extractToDef", "ref", "key", "ext", "finalize", "flattenRef", "zodSchema", "_cached", "refSeen", "refSchema", "parentSeen", "rootMetaId", "defs", "finalized", "createStandardJSONSchemaMethod", "_schema", "_ctx", "option", "item", "createToJSONSchemaMethod", "processors", "io", "libraryOptions", "formatMap", "stringProcessor", "schema", "ctx", "_json", "_params", "json", "minimum", "maximum", "format", "patterns", "contentEncoding", "regexes", "regex", "numberProcessor", "multipleOf", "exclusiveMaximum", "exclusiveMinimum", "exMin", "exMax", "legacy", "booleanProcessor", "_schema", "_ctx", "bigintProcessor", "symbolProcessor", "nullProcessor", "undefinedProcessor", "voidProcessor", "neverProcessor", "anyProcessor", "unknownProcessor", "dateProcessor", "enumProcessor", "def", "values", "getEnumValues", "v", "literalProcessor", "vals", "val", "nanProcessor", "templateLiteralProcessor", "pattern", "fileProcessor", "file", "mime", "m", "successProcessor", "customProcessor", "functionProcessor", "transformProcessor", "mapProcessor", "setProcessor", "arrayProcessor", "params", "process", "objectProcessor", "shape", "key", "allKeys", "requiredKeys", "unionProcessor", "isExclusive", "options", "x", "i", "intersectionProcessor", "a", "b", "isSimpleIntersection", "allOf", "tupleProcessor", "prefixPath", "restPath", "prefixItems", "rest", "recordProcessor", "keyType", "valueSchema", "keyValues", "validKeyValues", "nullableProcessor", "inner", "seen", "nonoptionalProcessor", "defaultProcessor", "prefaultProcessor", "catchProcessor", "catchValue", "pipeProcessor", "inIsTransform", "innerType", "readonlyProcessor", "promiseProcessor", "optionalProcessor", "lazyProcessor", "allProcessors", "toJSONSchema", "input", "registry", "initializeContext", "defs", "entry", "_", "schemas", "external", "extractDefs", "finalize", "defsSegment", "JSONSchemaGenerator", "value", "params", "normalizedTarget", "initializeContext", "allProcessors", "schema", "_params", "process", "extractDefs", "result", "finalize", "_", "plainResult", "json_schema_exports", "schemas_exports", "__export", "ZodAny", "ZodArray", "ZodBase64", "ZodBase64URL", "ZodBigInt", "ZodBigIntFormat", "ZodBoolean", "ZodCIDRv4", "ZodCIDRv6", "ZodCUID", "ZodCUID2", "ZodCatch", "ZodCodec", "ZodCustom", "ZodCustomStringFormat", "ZodDate", "ZodDefault", "ZodDiscriminatedUnion", "ZodE164", "ZodEmail", "ZodEmoji", "ZodEnum", "ZodExactOptional", "ZodFile", "ZodFunction", "ZodGUID", "ZodIPv4", "ZodIPv6", "ZodIntersection", "ZodJWT", "ZodKSUID", "ZodLazy", "ZodLiteral", "ZodMAC", "ZodMap", "ZodNaN", "ZodNanoID", "ZodNever", "ZodNonOptional", "ZodNull", "ZodNullable", "ZodNumber", "ZodNumberFormat", "ZodObject", "ZodOptional", "ZodPipe", "ZodPrefault", "ZodPreprocess", "ZodPromise", "ZodReadonly", "ZodRecord", "ZodSet", "ZodString", "ZodStringFormat", "ZodSuccess", "ZodSymbol", "ZodTemplateLiteral", "ZodTransform", "ZodTuple", "ZodType", "ZodULID", "ZodURL", "ZodUUID", "ZodUndefined", "ZodUnion", "ZodUnknown", "ZodVoid", "ZodXID", "ZodXor", "_ZodString", "_default", "_function", "any", "array", "base64", "base64url", "bigint", "boolean", "_catch", "check", "cidrv4", "cidrv6", "codec", "cuid", "cuid2", "custom", "date", "describe", "discriminatedUnion", "e164", "email", "emoji", "_enum", "exactOptional", "file", "float32", "float64", "guid", "hash", "hex", "hostname", "httpUrl", "_instanceof", "int", "int32", "int64", "intersection", "invertCodec", "ipv4", "ipv6", "json", "jwt", "keyof", "ksuid", "lazy", "literal", "looseObject", "looseRecord", "mac", "map", "meta", "nan", "nanoid", "nativeEnum", "never", "nonoptional", "_null", "nullable", "nullish", "number", "object", "optional", "partialRecord", "pipe", "prefault", "preprocess", "promise", "readonly", "record", "refine", "set", "strictObject", "string", "stringFormat", "stringbool", "success", "superRefine", "symbol", "templateLiteral", "transform", "tuple", "uint32", "uint64", "ulid", "_undefined", "union", "unknown", "url", "uuid", "uuidv4", "uuidv6", "uuidv7", "_void", "xid", "xor", "checks_exports", "__export", "_endsWith", "_gt", "_gte", "_includes", "_length", "_lowercase", "_lt", "_lte", "_maxLength", "_maxSize", "_mime", "_minLength", "_minSize", "_multipleOf", "_negative", "_nonnegative", "_nonpositive", "_normalize", "_overwrite", "_positive", "_property", "_regex", "_size", "_slugify", "_startsWith", "_toLowerCase", "_toUpperCase", "_trim", "_uppercase", "iso_exports", "__export", "ZodISODate", "ZodISODateTime", "ZodISODuration", "ZodISOTime", "date", "datetime", "duration", "time", "ZodISODateTime", "$constructor", "inst", "def", "$ZodISODateTime", "ZodStringFormat", "datetime", "params", "_isoDateTime", "ZodISODate", "$ZodISODate", "date", "_isoDate", "ZodISOTime", "$ZodISOTime", "time", "_isoTime", "ZodISODuration", "$ZodISODuration", "duration", "_isoDuration", "initializer", "inst", "issues", "$ZodError", "mapper", "formatError", "flattenError", "issue", "jsonStringifyReplacer", "ZodError", "$constructor", "ZodRealError", "parse", "_parse", "ZodRealError", "parseAsync", "_parseAsync", "safeParse", "_safeParse", "safeParseAsync", "_safeParseAsync", "encode", "_encode", "decode", "_decode", "encodeAsync", "_encodeAsync", "decodeAsync", "_decodeAsync", "safeEncode", "_safeEncode", "safeDecode", "_safeDecode", "safeEncodeAsync", "_safeEncodeAsync", "safeDecodeAsync", "_safeDecodeAsync", "_installedGroups", "_installLazyMethods", "inst", "group", "methods", "proto", "installed", "key", "fn", "bound", "v", "ZodType", "$constructor", "def", "$ZodType", "createStandardJSONSchemaMethod", "createToJSONSchemaMethod", "data", "params", "parse", "safeParse", "parseAsync", "safeParseAsync", "encode", "decode", "encodeAsync", "decodeAsync", "safeEncode", "safeDecode", "safeEncodeAsync", "safeDecodeAsync", "chks", "util_exports", "ch", "clone", "reg", "meta", "check", "refine", "refinement", "superRefine", "_overwrite", "optional", "exactOptional", "nullable", "nonoptional", "array", "arg", "union", "intersection", "tx", "pipe", "transform", "d", "_default", "prefault", "_catch", "target", "readonly", "description", "cl", "globalRegistry", "args", "_ZodString", "$ZodString", "ctx", "json", "stringProcessor", "bag", "_regex", "_includes", "_startsWith", "_endsWith", "_minLength", "_maxLength", "_length", "_lowercase", "_uppercase", "_trim", "_normalize", "_toLowerCase", "_toUpperCase", "_slugify", "ZodString", "_email", "ZodEmail", "_url", "ZodURL", "_jwt", "ZodJWT", "_emoji", "ZodEmoji", "_guid", "ZodGUID", "_uuid", "ZodUUID", "_uuidv4", "_uuidv6", "_uuidv7", "_nanoid", "ZodNanoID", "_cuid", "ZodCUID", "_cuid2", "ZodCUID2", "_ulid", "ZodULID", "_base64", "ZodBase64", "_base64url", "ZodBase64URL", "_xid", "ZodXID", "_ksuid", "ZodKSUID", "_ipv4", "ZodIPv4", "_ipv6", "ZodIPv6", "_cidrv4", "ZodCIDRv4", "_cidrv6", "ZodCIDRv6", "_e164", "ZodE164", "datetime", "date", "time", "duration", "string", "_string", "ZodStringFormat", "$ZodStringFormat", "$ZodEmail", "email", "$ZodGUID", "guid", "$ZodUUID", "uuid", "uuidv4", "uuidv6", "uuidv7", "$ZodURL", "url", "httpUrl", "regexes_exports", "$ZodEmoji", "emoji", "$ZodNanoID", "nanoid", "$ZodCUID", "cuid", "$ZodCUID2", "cuid2", "$ZodULID", "ulid", "$ZodXID", "xid", "$ZodKSUID", "ksuid", "$ZodIPv4", "ipv4", "ZodMAC", "$ZodMAC", "mac", "_mac", "$ZodIPv6", "ipv6", "$ZodCIDRv4", "cidrv4", "$ZodCIDRv6", "cidrv6", "$ZodBase64", "base64", "$ZodBase64URL", "base64url", "$ZodE164", "e164", "$ZodJWT", "jwt", "ZodCustomStringFormat", "$ZodCustomStringFormat", "stringFormat", "format", "fnOrRegex", "_params", "_stringFormat", "hostname", "hex", "hash", "alg", "enc", "regex", "ZodNumber", "$ZodNumber", "numberProcessor", "value", "_gt", "_gte", "_lt", "_lte", "int", "_multipleOf", "number", "_number", "ZodNumberFormat", "$ZodNumberFormat", "_int", "float32", "_float32", "float64", "_float64", "int32", "_int32", "uint32", "_uint32", "ZodBoolean", "$ZodBoolean", "booleanProcessor", "boolean", "_boolean", "ZodBigInt", "$ZodBigInt", "bigintProcessor", "bigint", "_bigint", "ZodBigIntFormat", "$ZodBigIntFormat", "int64", "_int64", "uint64", "_uint64", "ZodSymbol", "$ZodSymbol", "symbolProcessor", "symbol", "_symbol", "ZodUndefined", "$ZodUndefined", "undefinedProcessor", "_undefined", "ZodNull", "$constructor", "inst", "def", "$ZodNull", "ZodType", "ctx", "json", "params", "nullProcessor", "_null", "ZodAny", "$constructor", "inst", "def", "$ZodAny", "ZodType", "ctx", "json", "params", "anyProcessor", "any", "_any", "ZodUnknown", "$ZodUnknown", "unknownProcessor", "unknown", "_unknown", "ZodNever", "$ZodNever", "neverProcessor", "never", "_never", "ZodVoid", "$ZodVoid", "voidProcessor", "_void", "ZodDate", "$constructor", "inst", "def", "$ZodDate", "ZodType", "ctx", "json", "params", "dateProcessor", "value", "_gte", "_lte", "c", "date", "_date", "ZodArray", "$ZodArray", "arrayProcessor", "_installLazyMethods", "n", "_minLength", "_maxLength", "_length", "array", "element", "_array", "keyof", "schema", "shape", "_enum", "ZodObject", "$ZodObjectJIT", "objectProcessor", "util_exports", "catchall", "unknown", "never", "incoming", "other", "mask", "args", "ZodOptional", "ZodNonOptional", "object", "strictObject", "looseObject", "ZodUnion", "$ZodUnion", "unionProcessor", "union", "options", "ZodXor", "$ZodXor", "xor", "ZodDiscriminatedUnion", "$ZodDiscriminatedUnion", "discriminatedUnion", "discriminator", "ZodIntersection", "$ZodIntersection", "intersectionProcessor", "intersection", "left", "right", "ZodTuple", "$ZodTuple", "tupleProcessor", "rest", "tuple", "items", "_paramsOrRest", "_params", "hasRest", "$ZodType", "ZodRecord", "$ZodRecord", "recordProcessor", "record", "keyType", "valueType", "string", "partialRecord", "k", "clone", "looseRecord", "ZodMap", "$ZodMap", "mapProcessor", "_minSize", "_maxSize", "_size", "map", "ZodSet", "$ZodSet", "setProcessor", "set", "ZodEnum", "$ZodEnum", "enumProcessor", "keys", "values", "newEntries", "entries", "v", "nativeEnum", "entries", "params", "ZodEnum", "util_exports", "ZodLiteral", "$constructor", "inst", "def", "$ZodLiteral", "ZodType", "ctx", "json", "literalProcessor", "literal", "value", "ZodFile", "$ZodFile", "fileProcessor", "size", "_minSize", "_maxSize", "types", "_mime", "file", "_file", "ZodTransform", "$ZodTransform", "transformProcessor", "payload", "_ctx", "$ZodEncodeError", "issue", "_issue", "output", "transform", "fn", "ZodOptional", "$ZodOptional", "optionalProcessor", "optional", "innerType", "ZodExactOptional", "$ZodExactOptional", "exactOptional", "ZodNullable", "$ZodNullable", "nullableProcessor", "nullable", "nullish", "ZodDefault", "$ZodDefault", "defaultProcessor", "_default", "defaultValue", "ZodPrefault", "$ZodPrefault", "prefaultProcessor", "prefault", "ZodNonOptional", "$ZodNonOptional", "nonoptionalProcessor", "nonoptional", "ZodSuccess", "$ZodSuccess", "successProcessor", "success", "ZodCatch", "$ZodCatch", "catchProcessor", "_catch", "catchValue", "ZodNaN", "$constructor", "inst", "def", "$ZodNaN", "ZodType", "ctx", "json", "params", "nanProcessor", "nan", "_nan", "ZodPipe", "$ZodPipe", "pipeProcessor", "pipe", "in_", "out", "ZodCodec", "$ZodCodec", "codec", "invertCodec", "ZodPreprocess", "$ZodPreprocess", "ZodReadonly", "$ZodReadonly", "readonlyProcessor", "readonly", "innerType", "ZodTemplateLiteral", "$ZodTemplateLiteral", "templateLiteralProcessor", "templateLiteral", "parts", "util_exports", "ZodLazy", "$ZodLazy", "lazyProcessor", "lazy", "getter", "ZodPromise", "$ZodPromise", "promiseProcessor", "promise", "ZodFunction", "$ZodFunction", "functionProcessor", "_function", "tuple", "array", "unknown", "ZodCustom", "$constructor", "inst", "def", "$ZodCustom", "ZodType", "ctx", "json", "params", "customProcessor", "check", "fn", "ch", "$ZodCheck", "custom", "_params", "_custom", "refine", "_refine", "superRefine", "_superRefine", "describe", "meta", "_instanceof", "cls", "data", "util_exports", "payload", "stringbool", "args", "_stringbool", "ZodCodec", "ZodBoolean", "ZodString", "json", "params", "jsonSchema", "lazy", "union", "string", "number", "boolean", "_null", "array", "record", "preprocess", "fn", "schema", "ZodPreprocess", "transform", "ZodIssueCode", "setErrorMap", "map", "config", "getErrorMap", "ZodFirstPartyTypeKind", "z", "schemas_exports", "checks_exports", "iso_exports", "RECOGNIZED_KEYS", "detectVersion", "schema", "defaultTarget", "$schema", "resolveRef", "ref", "ctx", "path", "defsKey", "key", "convertBaseSchema", "refPath", "resolved", "zodSchema", "convertSchema", "enumValues", "v", "literalSchemas", "type", "typeSchemas", "t", "typeSchema", "stringSchema", "format", "numberSchema", "shape", "properties", "requiredSet", "propSchema", "propZodSchema", "keySchema", "valueSchema", "objectSchema", "recordSchema", "patternProps", "patternKeys", "looseRecords", "pattern", "patternValue", "schemasToIntersect", "result", "i", "prefixItems", "items", "tupleItems", "item", "rest", "element", "arraySchema", "baseSchema", "hasExplicitType", "options", "s", "anyOfUnion", "oneOfUnion", "startIdx", "extraMeta", "coreMetadataKeys", "contentMetadataKeys", "fromJSONSchema", "params", "normalized", "version", "defs", "globalRegistry", "coerce_exports", "__export", "bigint", "boolean", "date", "number", "string", "string", "params", "_coercedString", "ZodString", "number", "_coercedNumber", "ZodNumber", "boolean", "_coercedBoolean", "ZodBoolean", "bigint", "_coercedBigint", "ZodBigInt", "date", "_coercedDate", "ZodDate", "config", "en_default", "zod_default", "external_exports", "FILES_AT_ONCE", "PARTS_AT_ONCE", "ATTEMPTS", "Started", "external_exports", "Completed", "UploadError", "message", "status", "csrfToken", "form", "input", "x", "sleep", "ms", "resolve", "pool", "items", "limit", "work", "results", "next", "worker", "index", "post", "url", "body", "csrf", "response", "put", "attempt", "etag", "error", "uploadFile", "file", "started", "size", "etags", "uploadFiles", "files", "progress", "done", "reference", "uploadable", "value", "replaceFiles", "data", "entries", "references", "result", "name", "busy", "uploaded", "restores", "fileInputs", "form", "element", "uploadable", "statusFor", "existing", "status", "resubmit", "submitter", "upload", "event", "inputs", "pairs", "input", "file", "references", "uploadFiles", "csrfToken", "done", "total", "hiddens", "index", "hidden", "error", "UploadError", "forms_default", "restore", "SEA", "LAND", "WOOD", "ROAD", "BORDER", "TEXT", "EXTRACT", "LIMITS", "OSM", "FONT", "kind", "ROADS", "place", "kinds", "minzoom", "size", "BASEMAP", "LABELS", "whole", "url", "style", "tiles", "glyphs", "loading", "load", "src", "resolve", "reject", "script", "openMap", "target", "config", "options", "lib", "map", "tooltip", "addShading", "id", "data", "below", "shade", "source", "code", "pointer", "layers", "tip", "click", "popup", "under", "point", "shown", "x", "event", "feature", "positions", "geometry", "box", "west", "south", "east", "north", "lng", "lat", "middle", "circle", "centre", "km", "sides", "lat", "lng", "angle", "ring", "i", "bearing", "to", "across", "escapeHtml", "text", "SELECTED", "UNSELECTED", "OVER_TILES", "code", "feature", "areaselect_default", "selected", "map", "unselected", "x", "target", "config", "opened", "areas", "openMap", "addShading", "pointer", "state", "escapeHtml", "area", "shade", "WEEKDAYS", "MINIMUM", "EARLIEST_DATE", "parseSlots", "raw", "data", "item", "record", "slot", "computeMinDate", "leadtime", "now", "leadtimeDate", "isTooEarly", "minDate", "toUTCDate", "value", "year", "month", "day", "isWeekend", "isValid", "toISODate", "formatDate", "date", "formatDateWithWeekday", "withYear", "addMonths", "delta", "monthGrid", "first", "offset", "start", "daysInMonth", "cells", "index", "current", "inMonth", "availability_default", "a", "b", "event", "years", "s", "am", "pm", "remaining", "incomplete", "call", "url", "options", "response", "error", "buildpackChecklist_default", "event", "form", "body", "csrf", "call", "buildpackshare_default", "seeded", "event", "form", "response", "link", "url", "csrf", "body", "l", "expires", "clamp", "v", "a", "b", "lerp", "t", "rad", "d", "r2", "n", "pt", "p", "poly", "pts", "seg", "open", "Cam", "azDeg", "k", "S", "proj", "C", "c", "s", "zf", "x", "y", "z", "X", "Y", "unproj", "sx", "sy", "onWall", "P", "origin", "along", "o", "ex", "ez", "det", "qx", "qy", "fit", "cx", "cy", "q", "corners", "x0", "y0", "z0", "x1", "y1", "z1", "rrect", "u0", "v0", "u1", "v1", "r", "rr", "out", "quads", "cu", "cv", "a0", "ca", "sa", "circ", "R", "hull", "input", "lo", "up", "i", "ringAt", "ring", "facing", "run", "keep", "at", "prism", "front", "inner", "rings", "fillet", "rs", "m", "la", "lb", "p1", "p2", "w", "reduced", "setReducedMotion", "on", "reducedMotion", "spring", "x", "o", "stepS", "sp", "dt", "n", "h", "a", "bezier", "x1", "y1", "x2", "y2", "cx", "bx", "ax", "cy", "by", "ay", "X", "u", "Y", "dX", "t", "i", "e", "d", "lo", "hi", "EASE_LIFT", "tween", "v", "dur", "tval", "tw", "now", "p", "clamp", "tset", "to", "delay", "tdone", "NS", "mk", "tag", "attrs", "parent", "e", "k", "path", "cls", "d", "draw", "el", "solid", "g", "put", "s", "dot", "r", "r2", "place", "q", "boards", "byStage", "raf", "last", "io", "rm", "frame", "now", "dt", "any", "b", "wake", "onMotion", "setReducedMotion", "start", "es", "stop", "register", "stage", "tick", "observer", "gone", "x", "pointer", "on", "tm", "pt", "move", "down", "leave", "disposer", "fns", "fn", "all", "i", "LIGHT", "DARK", "KEYS", "vars", "p", "k", "EASE", "SVG", "css", "inject", "doc", "style", "deg", "d", "arc", "cx", "cy", "a0", "a1", "n", "pts", "i", "a", "lerp", "star", "R", "r", "k", "heart", "s", "t", "x", "y", "corner", "SHAPES", "W", "H", "MAIN", "SUB", "DOT", "EYE", "PUPIL", "LOOK", "DUR", "SWEEP", "at", "pts", "i", "resample", "n", "lens", "ax", "ay", "bx", "by", "total", "out", "j", "k", "l0", "span", "t", "clamp", "lerp", "pose", "shape", "main", "end", "sub", "mix", "a", "b", "collapsed", "x0", "y0", "x", "y", "mountClip", "el", "start", "inject", "bag", "disposer", "svg", "mk", "path", "dot", "eyes", "cur", "SHAPES", "from", "to", "t0", "morphing", "look", "spring", "paint", "draw", "open", "r", "r2", "white", "pupil", "loop", "register", "dt", "now", "moving", "stepS", "ease", "delay", "reducedMotion", "EASE_LIFT", "p", "q", "onMove", "e", "box", "dx", "dy", "len", "colour", "id", "hi", "WHIMS", "HOLD", "THINK", "idleDelay", "save", "root", "minimised", "url", "csrf", "body", "call", "clip_default", "figures", "back", "idle", "think", "busy", "morph", "id", "figure", "flash", "ms", "settle", "name", "el", "mountClip", "whim", "event", "n", "all", "status", "TIMEZONE", "zoneOffset", "value", "startOfDay", "timeOfDay", "day", "seconds", "wall", "equalMonth", "a", "b", "equalDate", "equalTime", "Duration", "external_exports", "calendar_default", "value", "result", "availability", "now", "startOfDay", "selected", "current", "event", "start", "startOfWeekOffset", "x", "timeOfDay", "slot", "slotAvailable", "equalTime", "classes", "equalMonth", "equalDate", "TIMEZONE", "available", "day", "date", "extendStatics", "d", "b", "p", "__extends", "__", "Browser", "Env", "env", "detect", "ua", "browser", "firefox", "ie", "edge", "weChat", "domSupported", "style", "env_default", "DEFAULT_FONT_SIZE", "DEFAULT_FONT_FAMILY", "DEFAULT_FONT", "OFFSET", "SCALE", "defaultWidthMapStr", "getTextWidthMap", "mapStr", "map", "i", "char", "size", "DEFAULT_TEXT_WIDTH_MAP", "platformApi", "_ctx", "_cachedFont", "text", "font", "canvas", "res", "fontSize", "width", "preCalcWidth", "src", "onload", "onerror", "image", "BUILTIN_OBJECT", "reduce", "obj", "val", "TYPED_ARRAY", "objToString", "arrayProto", "nativeForEach", "nativeFilter", "nativeSlice", "nativeMap", "ctorFunction", "protoFunction", "protoKey", "idStart", "guid", "logError", "args", "_i", "clone", "source", "result", "typeStr", "isPrimitive", "i", "len", "Ctor", "isDom", "key", "merge", "target", "overwrite", "isObject", "targetProp", "sourceProp", "isArray", "isBuiltInObject", "mergeAll", "targetAndSources", "extend", "defaults", "overlay", "keysArr", "keys", "createCanvas", "platformApi", "indexOf", "array", "value", "inherits", "clazz", "baseClazz", "clazzPrototype", "F", "prop", "mixin", "override", "keyList", "isArrayLike", "data", "each", "arr", "cb", "context", "map", "slice", "memo", "filter", "find", "bindPolyfill", "func", "bind", "isFunction", "curry", "isArray", "value", "objToString", "isFunction", "isString", "isStringSafe", "isNumber", "isObject", "type", "isBuiltInObject", "BUILTIN_OBJECT", "isTypedArray", "TYPED_ARRAY", "isDom", "isGradientObject", "isImagePatternObject", "isRegExp", "eqNaN", "retrieve", "args", "_i", "i", "len", "retrieve2", "value0", "value1", "retrieve3", "value2", "slice", "arr", "nativeSlice", "normalizeCssArray", "val", "assert", "condition", "message", "trim", "str", "primitiveKey", "setAsPrimitive", "obj", "isPrimitive", "MapPolyfill", "key", "existed", "keys", "callback", "data", "isNativeMapSupported", "maybeNativeMap", "HashMap", "isArr", "thisMap", "visit", "each", "cb", "context", "createHashMap", "obj", "HashMap", "concatArray", "a", "b", "newArray", "i", "offset", "createObject", "proto", "properties", "StyleCtor", "extend", "disableUserSelect", "dom", "domStyle", "hasOwn", "own", "prop", "noop", "RADIAN_TO_DEGREE", "EPSILON", "extendStatics", "d", "b", "p", "__extends", "__", "create", "x", "y", "copy", "out", "v", "clone", "set", "a", "b", "add", "v1", "v2", "scaleAndAdd", "sub", "len", "lenSquare", "lenSquare", "v", "scale", "out", "v", "s", "normalize", "d", "len", "distance", "v1", "v2", "dist", "distanceSquare", "distSquare", "lerp", "out", "v1", "v2", "t", "applyTransform", "v", "m", "x", "y", "min", "max", "Param", "target", "e", "Draggable", "handler", "draggingTarget", "x", "y", "dx", "dy", "dropTarget", "lastDropTarget", "Draggable_default", "Eventful", "eventProcessors", "event", "query", "handler", "context", "_h", "eventProcessor", "i", "wrap", "lastIndex", "lastWrap", "eventName", "eventType", "newList", "l", "args", "_i", "argLen", "len", "hItem", "type", "ctx", "Eventful_default", "LN2", "determinant", "rows", "rank", "rowStart", "rowMask", "colMask", "detCache", "cacheKey", "fullRank", "colStart", "subRowMask", "subRowStart", "sum", "j", "colLocalIdx", "colTag", "buildTransformer", "src", "dest", "mA", "det", "vh", "i", "out", "srcPointX", "srcPointY", "pk", "EVENT_SAVED_PROP", "_calcOut", "transformLocalCoord", "out", "elFrom", "elTarget", "inX", "inY", "transformCoordWithViewport", "transformLocalCoordClear", "dealClear", "el", "saved", "inverse", "env_default", "isCanvasEl", "markers", "prepareCoordMarkers", "transformer", "preparePointerTransformer", "propLR", "propTB", "i", "marker", "stl", "idxLR", "idxTB", "each", "transformerName", "oldSrcCoords", "srcCoords", "destCoords", "oldCoordTheSame", "rect", "ii", "x", "y", "buildTransformer", "replaceReg", "replaceMap", "encodeHTML", "source", "str", "c", "MOUSE_EVENT_REG", "_calcOut", "firefoxNotSupportOffsetXY", "env_default", "clientToLocal", "el", "e", "out", "calculate", "calculateZrXY", "ex", "ey", "isCanvasEl", "box", "transformCoordWithViewport", "getNativeEvent", "normalizeEvent", "eventType", "isTouch", "touch", "wheelDelta", "getWheelDeltaMayPolyfill", "button", "rawWheelDelta", "deltaX", "deltaY", "delta", "sign", "addEventListener", "name", "handler", "opt", "removeEventListener", "stop", "isMiddleOrRightButtonOnMouseUpDown", "GestureMgr", "event", "target", "root", "touches", "trackItem", "i", "len", "touch", "pos", "clientToLocal", "eventName", "recognizers", "gestureInfo", "dist", "pointPair", "dx", "dy", "center", "recognizers", "tracks", "event", "trackLen", "pinchEnd", "pinchPre", "pinchScale", "pinchCenter", "create", "identity", "out", "copy", "m", "mul", "m1", "m2", "out0", "out1", "out2", "out3", "out4", "out5", "translate", "a", "v", "rotate", "rad", "pivot", "aa", "ac", "atx", "ab", "ad", "aty", "st", "ct", "scale", "vx", "vy", "invert", "det", "clone", "b", "Point", "x", "y", "other", "scalar", "len", "dx", "dy", "m", "out", "input", "p", "p2", "p0", "p1", "t", "onet", "Point_default", "mathMin", "mathMax", "mathAbs", "XY", "WH", "lt", "Point_default", "rb", "lb", "rt", "_intersectCtx", "createIntersectContext", "_minTv", "_maxTv", "_lenMinMax", "BoundingRect", "x", "y", "width", "height", "target", "other", "m", "b", "a", "sx", "sy", "create", "translate", "scale", "mtv", "opt", "outIntersectRect", "clamp", "_tmpIntersectA", "_tmpIntersectB", "useMTV", "touchThreshold", "ax0", "ax1", "ay0", "ay1", "bx0", "bx1", "by0", "by1", "overlap", "intersectOneDim", "rect", "source", "tx", "ty", "maxX", "maxY", "a0", "a1", "b0", "b1", "updateDimIdx", "d0", "d1", "d01min", "updateDim", "zeroDim", "wh", "_direction", "_dirCheckVec", "_dirTmp", "_ctx", "minTv", "dirMinTv", "squareMag", "dirSin", "dirCos", "dotProd", "nearZero", "val", "BoundingRect_default", "SILENT", "makeEventPacket", "eveType", "targetInfo", "event", "stopEvent", "stop", "EmptyProxy", "_super", "__extends", "_this", "Eventful_default", "HoveredResult", "x", "y", "handlerNames", "tmpRect", "BoundingRect_default", "Handler", "storage", "painter", "proxy", "painterRoot", "pointerSize", "Draggable_default", "each", "name", "isOutside", "isOutsideBoundary", "lastHovered", "lastHoveredTarget", "hovered", "hoveredTarget", "eventControl", "eventName", "eventArgs", "handler", "cursorStyle", "el", "eventKey", "eventPacket", "layer", "exclude", "list", "out", "setHoverTarget", "candidates", "targetSizeHalf", "pointerRect", "i", "rStep", "thetaStep", "PI2", "r", "theta", "x1", "y1", "stage", "GestureMgr", "gestureMgr", "gestureInfo", "type", "res", "dist", "isHover", "displayable", "isSilent", "ignoreClip", "clipPath", "hostEl", "hoverCheckResult", "handlerInstance", "Handler_default", "DEFAULT_MIN_MERGE", "DEFAULT_MIN_GALLOPING", "minRunLength", "n", "r", "makeAscendingRun", "array", "lo", "hi", "compare", "runHi", "reverseRun", "t", "binaryInsertionSort", "start", "pivot", "left", "right", "mid", "gallopLeft", "value", "length", "hint", "lastOffset", "maxOffset", "offset", "tmp", "m", "gallopRight", "TimSort", "minGallop", "runStart", "runLength", "stackSize", "pushRun", "_runStart", "_runLength", "mergeRuns", "mergeAt", "forceMergeRuns", "i", "start1", "length1", "start2", "length2", "k", "mergeLow", "mergeHigh", "cursor1", "cursor2", "dest", "_minGallop", "count1", "count2", "exit", "customCursor", "customDest", "sort", "remaining", "ts", "minRun", "force", "REDRAW_BIT", "STYLE_CHANGED_BIT", "SHAPE_CHANGED_BIT", "invalidZErrorLogged", "logInvalidZError", "shapeCompareFunc", "a", "b", "Storage", "cb", "context", "i", "update", "includeIgnore", "displayList", "roots", "len", "sort", "el", "parentClipPaths", "userSetClipPath", "parentHasClipPaths", "clipPathIdx", "thisClipPaths", "idx", "currentClipPath", "parentClipPath", "children", "child", "REDRAW_BIT", "disp", "decalEl", "textGuide", "textEl", "l", "indexOf", "Storage_default", "requestAnimationFrame", "env_default", "func", "requestAnimationFrame_default", "easingFuncs", "k", "s", "a", "p", "easing_default", "mathPow", "mathSqrt", "EPSILON", "EPSILON_NUMERIC", "THREE_SQRT", "ONE_THIRD", "_v0", "create", "_v1", "_v2", "isAroundZero", "val", "isNotAroundZero", "cubicAt", "p0", "p1", "p2", "p3", "t", "onet", "cubicDerivativeAt", "cubicRootAt", "roots", "b", "c", "d", "A", "B", "C", "n", "t1", "disc", "K", "t2", "discSqrt", "Y1", "Y2", "T", "theta", "ASqrt", "tmp", "t3", "cubicExtrema", "extrema", "cubicSubdivide", "out", "p01", "p12", "p23", "p012", "p123", "p0123", "cubicProjectPoint", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "x", "y", "interval", "prev", "next", "d1", "d2", "_t", "distSquare", "i", "cubicLength", "iteration", "px", "py", "step", "dx", "dy", "quadraticAt", "quadraticDerivativeAt", "quadraticRootAt", "a", "quadraticExtremum", "divider", "quadraticSubdivide", "quadraticProjectPoint", "quadraticLength", "regexp", "createCubicEasingFunc", "cubicEasingStr", "cubic", "points", "a_1", "trim", "b_1", "c_1", "d_1", "roots_1", "p", "cubicRootAt", "cubicAt", "Clip", "opts", "noop", "globalTime", "deltaTime", "life", "elapsedTime", "percent", "easingFunc", "schedule", "remainder", "easing", "isFunction", "easing_default", "createCubicEasingFunc", "Clip_default", "Entry", "val", "LinkedList", "val", "entry", "Entry", "prev", "next", "LRU", "maxSize", "LinkedList", "key", "value", "list", "map", "removed", "len", "entry", "leastUsedEntry", "Entry", "LRU_default", "kCSSColorTable", "clampCssByte", "i", "clampCssAngle", "clampCssFloat", "f", "parseCssInt", "val", "str", "parseCssFloat", "cssHueToRgb", "m1", "m2", "h", "lerpNumber", "a", "b", "p", "setRgba", "out", "r", "g", "copyRgba", "colorCache", "LRU_default", "lastRemovedArr", "putToCache", "colorStr", "rgbaArr", "parse", "cached", "strLen", "iv", "op", "ep", "fname", "params", "alpha", "hsla2rgba", "hsla", "rgba", "s", "l", "rgba2hsla", "R", "G", "B", "vMin", "vMax", "delta", "L", "H", "S", "deltaR", "deltaG", "deltaB", "lift", "color", "level", "colorArr", "stringify", "fastLerp", "normalizedValue", "colors", "out", "value", "leftIndex", "rightIndex", "leftColor", "rightColor", "dv", "clampCssByte", "lerpNumber", "clampCssFloat", "lerp", "normalizedValue", "colors", "fullOutput", "value", "leftIndex", "rightIndex", "leftColor", "parse", "rightColor", "dv", "color", "stringify", "clampCssByte", "lerpNumber", "clampCssFloat", "modifyHSL", "color", "h", "s", "l", "colorArr", "parse", "rgba2hsla", "clampCssAngle", "isFunction", "parseCssFloat", "stringify", "hsla2rgba", "modifyAlpha", "alpha", "clampCssFloat", "arrColor", "type", "colorStr", "lum", "backgroundLum", "arr", "liftedColorCache", "LRU_default", "liftColor", "color", "isString", "liftedColor", "lift", "isGradientObject", "ret", "extend", "map", "stop", "mathRound", "normalizeColor", "color", "opacity", "arr", "parse", "EPSILON", "isAroundZero", "transform", "round3", "round4", "getMatrixStr", "m", "round3", "round4", "TEXT_ALIGN_TO_ANCHOR", "adjustTextY", "y", "lineHeight", "textBaseline", "hasShadow", "style", "getShadowKey", "displayable", "globalScale", "isImagePattern", "val", "isSVGPattern", "isPattern", "isLinearGradient", "isRadialGradient", "isGradient", "getIdURL", "id", "getPathPrecision", "el", "scale", "size", "getSRTTransformString", "transform", "x", "y", "rotation", "RADIAN_TO_DEGREE", "scaleX", "retrieve2", "scaleY", "skewX", "skewY", "res", "mathRound", "encodeBase64", "env_default", "isFunction", "str", "arraySlice", "interpolateNumber", "p0", "p1", "percent", "interpolate1DArray", "out", "len", "i", "interpolate2DArray", "len2", "j", "add1DArray", "sign", "add2DArray", "fillColorStops", "val0", "val1", "len0", "len1", "shorterArr", "shorterLen", "last", "fillArray", "arrDim", "arr0", "arr1", "arr0Len", "arr1Len", "isPreviousLarger", "cloneValue", "value", "isArrayLike", "ret", "rgba2String", "rgba", "guessArrayDim", "VALUE_TYPE_NUMBER", "VALUE_TYPE_1D_ARRAY", "VALUE_TYPE_2D_ARRAY", "VALUE_TYPE_COLOR", "VALUE_TYPE_LINEAR_GRADIENT", "VALUE_TYPE_RADIAL_GRADIENT", "VALUE_TYPE_UNKOWN", "isGradientValueType", "valType", "isArrayValueType", "tmpRgba", "Track", "propName", "time", "rawValue", "easing", "keyframes", "discrete", "arrayDim", "isNumber", "eqNaN", "isString", "colorArray", "parse", "isGradientObject", "parsedGradient", "extend", "map", "colorStop", "isLinearGradient", "isRadialGradient", "kf", "isFunction", "easing_default", "createCubicEasingFunc", "maxTime", "additiveTrack", "kfs", "a", "b", "kfsLen", "lastKf", "isDiscrete", "isArr", "isGradient", "lastValue", "startValue", "target", "isAdditive", "valueKey", "kfsNum", "isValueColor", "frameIdx", "lastFrame", "mathMin", "frame", "nextFrame", "start", "interval", "w", "targetArr", "val", "nextVal_1", "isLinearGradient_1", "idx", "nextColorStop", "additiveValue", "Animator", "loop", "allowDiscreteAnimation", "additiveTo", "logError", "props", "keys", "propNames", "tracks", "track", "initialValue", "addtiveTrackKfs", "lastFinalKf", "duration", "doneList", "animation", "abortedList", "tracksKeys", "trackName", "additiveAnimators", "self", "clip", "Clip_default", "stillHasAdditiveAnimator", "onframeList", "forwardToLast", "cb", "_this", "key", "allAborted", "trackKeys", "firstOrLast", "finalProps", "Animator_default", "getTime", "Animation", "_super", "__extends", "opts", "_this", "clip", "animator", "prev", "next", "notTriggerFrameAndStageUpdate", "time", "delta", "nextClip", "finished", "self", "step", "requestAnimationFrame_default", "target", "options", "Animator_default", "Eventful_default", "Animation_default", "TOUCH_CLICK_DELAY", "globalEventSupported", "env_default", "localNativeListenerNames", "mouseHandlerNames", "touchHandlerNames", "pointerEventNameMap", "pointerHandlerNames", "map", "name", "nm", "globalNativeListenerNames", "wheelEventSupported", "isPointerFromTouch", "event", "pointerType", "setTouchTimer", "scope", "markTouch", "normalizeGlobalEvent", "instance", "normalizeEvent", "FakeGlobalEvent", "isLocalEl", "el", "elTmp", "isLocal", "noop", "localDOMHandlers", "downPoint", "element", "each", "globalDOMHandlers", "pointerCaptureReleasing", "mountLocalDOMEventListeners", "domHandlers", "nativeEventName", "mountSingleDOMEventListener", "getNativeEvent", "mountGlobalDOMEventListeners", "mount", "nativeEventListener", "listener", "opt", "addEventListener", "unmountDOMEventListeners", "mounted", "removeEventListener", "DOMHandlerScope", "domTarget", "HandlerDomProxy", "_super", "__extends", "dom", "painterRoot", "_this", "cursorStyle", "isPointerCapturing", "globalHandlerScope", "Eventful_default", "HandlerProxy_default", "dpr", "env_default", "devicePixelRatio", "dpr", "DARK_MODE_THRESHOLD", "DARK_LABEL_COLOR", "LIGHT_LABEL_COLOR", "LIGHTER_LABEL_COLOR", "mIdentity", "identity", "EPSILON", "isNotAroundZero", "val", "scaleTmp", "tmpTransform", "originTransform", "create", "abs", "Transformable", "m", "arr", "parentTransform", "needLocalTransform", "mul", "copy", "globalScaleRatio", "relX", "relY", "sx", "sy", "invert", "transformNode", "ancestors", "rotation", "shearX", "parent", "ox", "oy", "out", "x", "y", "v2", "invTransform", "applyTransform", "transform", "source", "copyTransform", "target", "ax", "ay", "skewX", "skewY", "dx", "dy", "rotate", "proto", "TRANSFORMABLE_PROPS", "i", "propName", "Transformable_default", "ensureFontMeasureInfo", "font", "_fontMeasureInfoCache", "LRU_default", "DEFAULT_FONT", "measureInfo", "platformApi", "tryCreateASCIIWidthMap", "_getASCIIWidthMapLongCount", "GET_ASCII_WIDTH_LONG_COUNT_MAX", "asciiWidthMap", "start", "code", "cost", "measureCharWidth", "fontMeasureInfo", "charCode", "measureWidth", "text", "strWidthCache", "width", "innerGetBoundingRect", "textAlign", "textBaseline", "height", "getLineHeight", "x", "adjustTextX", "y", "adjustTextY", "rect", "BoundingRect_default", "getBoundingRect", "textLines", "len", "uniondRect", "i", "inverse", "verticalAlign", "parsePercent", "value", "maxValue", "calculateTextPosition", "out", "opts", "rect", "textPosition", "distance", "height", "width", "halfHeight", "x", "y", "textAlign", "textVerticalAlign", "PRESERVED_NORMAL_STATE", "PRIMARY_STATES_KEYS", "TRANSFORMABLE_PROPS", "DEFAULT_ANIMATABLE_MAP", "reduce", "obj", "key", "tmpTextPosCalcRes", "tmpBoundingRect", "BoundingRect_default", "tmpInnerTextTrans", "Element", "props", "guid", "dx", "dy", "e", "m", "forceUpdate", "textEl", "textConfig", "isLocal", "innerTransformable", "textAlign", "textVerticalAlign", "textStyleChanged", "innerOrigin", "hasPosition", "autoOverflowArea", "layoutRect", "calculateTextPosition", "textOrigin", "relOriginX", "relOriginY", "parsePercent", "textOffset", "innerTextDefaultStyle", "overflowRect", "invert", "isInside", "textFill", "textStroke", "autoStroke", "REDRAW_BIT", "LIGHT_LABEL_COLOR", "DARK_LABEL_COLOR", "backgroundColor", "colorArr", "parse", "alpha", "isDark", "i", "stringify", "cb", "context", "value", "extend", "keyOrObj", "isObject", "keysArr", "keys", "toState", "normalState", "animator", "fromStateTransition", "targetName", "target", "primaryKeys", "name", "states", "noAnimation", "stateName", "keepCurrentStates", "forceUseHoverLayer", "toNormalState", "hasStates", "currentStates", "animationCfg", "indexOf", "state", "logError", "useHoverLayer", "textContent", "textGuide", "stateObjects", "len", "notChange", "stateObj", "lastStateObj", "mergedState", "el", "hostEl", "idx", "oldState", "newState", "forceAdd", "newStateExists", "enable", "mergedTextConfig", "transition", "needsRestoreToNormal", "transitionTarget", "hasTransition", "propNeedsTransition", "componentEl", "zr", "clipPath", "previousTextContent", "Transformable_default", "cfg", "guideLine", "inHover", "animators", "loop", "allowDiscreteAnimation", "Animator_default", "scope", "forwardToLast", "leftAnimators", "animationProps", "animateTo", "elProto", "logs", "logDeprecatedError", "xKey", "yKey", "createLegacyProperty", "privateKey", "pos", "enhanceArray", "self", "val", "mixin", "Eventful_default", "animatable", "reverse", "animateToShallow", "finishCount", "doneHappened", "cfgDone", "cfgAborted", "doneCb", "abortedCb", "percent", "copyArrShallow", "source", "is2DArray", "isArrayLike", "copyValue", "isTypedArray", "sourceArr", "targetArr", "len0", "len1", "isValueSame", "val1", "val2", "is1DArraySame", "arr0", "arr1", "topKey", "animateObj", "targetKeys", "duration", "delay", "additive", "setToFinal", "animateAll", "existsAnimators", "animationKeys", "k", "innerKey", "targetVal", "isGradientObject", "keyLen", "allAborted", "filter", "revertedSource", "reversedTarget", "sourceClone", "cloneValue", "Element_default", "Group", "_super", "__extends", "opts", "_this", "idx", "name", "children", "child", "nextSibling", "oldChild", "newChild", "indexOf", "index", "old", "zr", "cb", "context", "i", "stopped", "includeChildren", "tmpRect", "BoundingRect_default", "tmpMat", "rect", "childRect", "transform", "Element_default", "Group_default", "painterCtors", "instances", "delInstance", "id", "isDarkMode", "backgroundColor", "lum", "DARK_MODE_THRESHOLD", "colorStops", "totalLum", "len", "ZRender", "dom", "opts", "_this", "storage", "Storage_default", "rendererType", "keys", "painter", "ssrMode", "handlerProxy", "env_default", "HandlerProxy_default", "useCoarsePointer", "usePointerSize", "defaultPointerSize", "pointerSize", "retrieve2", "Handler_default", "Animation_default", "el", "zLevel", "config", "darkMode", "fromInside", "triggerRendered", "start", "getTime", "end", "stillFramesCount", "cursorStyle", "x", "y", "eventName", "eventHandler", "context", "event", "roots", "i", "Group_default", "init", "zr", "guid", "registerPainter", "name", "Ctor", "painterCtors", "ssrDataGetter", "getElementSSRData", "el", "registerSSRDataGetter", "getter", "RADIAN_EPSILON", "ROUND_SUPPORTED_PRECISION_MAX", "_trim", "str", "mathMin", "mathMax", "mathAbs", "linearMap", "val", "domain", "range", "clamp", "d0", "d1", "r0", "r1", "subDomain", "subRange", "parsePercent", "parsePositionOption", "option", "percentBase", "percentOffset", "parsePositionSizeOption", "isString", "round", "x", "precision", "returnStr", "asc", "arr", "a", "b", "getPrecision", "e", "i", "getPrecisionSafe", "eIndex", "exp", "significandPartLen", "dotIndex", "decimalPartLen", "getPixelPrecision", "dataExtent", "pixelExtent", "log", "LN10", "dataQuantity", "sizeQuantity", "getPercentSeats", "valueList", "precision", "sum", "reduce", "acc", "val", "digits", "votesPerQuota", "map", "targetSeats", "seats", "votes", "currentSum", "remainder", "idx", "max", "maxId", "i", "len", "seat", "addSafe", "val0", "val1", "maxPrecision", "getPrecision", "ROUND_SUPPORTED_PRECISION_MAX", "round", "MAX_SAFE_INTEGER", "remRadian", "radian", "pi2", "isRadianAroundZero", "RADIAN_EPSILON", "TIME_REG", "parseDate", "value", "isString", "match", "hour", "quantity", "quantityExponent", "exp", "nice", "exponent", "exp10", "f", "nf", "quantile", "ascArr", "p", "H", "h", "v", "e", "reformIntervals", "list", "a", "b", "littleThan", "curr", "currClose", "interval", "close_1", "lg", "numericToNumber", "valFloat", "isNumeric", "getRandomIdBase", "getGreatestCommonDividor", "getLeastCommonMultiple", "ECHARTS_PREFIX", "storedLogs", "hasConsole", "outputLog", "type", "str", "onlyOnce", "warn", "str", "onlyOnce", "outputLog", "error", "throwError", "msg", "interpolateNumber", "p0", "p1", "percent", "DUMMY_COMPONENT_NAME_PREFIX", "INTERNAL_COMPONENT_ID_PREFIX", "normalizeToArray", "value", "defaultEmphasis", "opt", "key", "subOpts", "i", "len", "subOptName", "TEXT_STYLE_OPTIONS", "getDataItemValue", "dataItem", "isObject", "isArray", "isDataItemOption", "mappingToExists", "existings", "newCmptOptions", "mode", "isNormalMergeMode", "isReplaceMergeMode", "isReplaceAllMode", "existingIdIdxMap", "createHashMap", "each", "cmptOption", "index", "result", "prepareResult", "mappingById", "mappingByName", "mappingByIndex", "mappingInReplaceAllMode", "makeIdAndName", "existing", "isComponentIdInternal", "optionId", "makeComparableKey", "existingIdx", "resultItem", "assert", "keyExistAndEqual", "brandNew", "nextIdx", "mapResult", "idMap", "item", "keyInfo", "idNum", "attr", "obj1", "obj2", "key1", "convertOptionIdName", "key2", "val", "idOrName", "defaultValue", "isString", "isNumber", "isStringSafe", "isNameSpecified", "componentModel", "name", "DUMMY_COMPONENT_NAME_PREFIX", "isComponentIdInternal", "cmptOption", "makeComparableKey", "INTERNAL_COMPONENT_ID_PREFIX", "makeInternalComponentId", "idSuffix", "setComponentTypeToKeyInfo", "mappingResult", "mainType", "componentModelCtor", "each", "item", "newOption", "isObject", "determineSubType", "newCmptOption", "existComponent", "subType", "compressBatches", "batchA", "batchB", "mapA", "mapB", "makeMap", "mapToArray", "sourceBatch", "map", "otherMap", "i", "len", "seriesId", "convertOptionIdName", "dataIndices", "normalizeToArray", "otherDataIndices", "j", "lenj", "dataIndex", "isData", "result", "queryDataIndex", "data", "payload", "isArray", "value", "makeInner", "key", "innerUniqueIndex", "hostObj", "getRandomIdBase", "parseFinder", "ecModel", "finderInput", "opt", "_a", "preParseFinder", "mainTypeSpecified", "queryOptionMap", "others", "defaultMainType", "queryOption", "queryResult", "queryReferringComponents", "finder", "isString", "obj", "createHashMap", "parsedKey", "queryType", "indexOf", "SINGLE_REFERRING", "MULTIPLE_REFERRING", "userOption", "indexOption", "idOption", "nameOption", "firstCmpt", "setAttribute", "dom", "getAttribute", "getTooltipRenderMode", "renderModeOption", "env_default", "groupData", "array", "getKey", "buckets", "keys", "interpolateRawValues", "precision", "sourceValue", "targetValue", "percent", "isAutoPrecision", "isNumber", "interpolateNumber", "round", "getPrecision", "interpolated", "leftArr", "rightArr", "length_1", "info", "leftVal", "rightVal", "ListIterator", "list", "start", "end", "step", "clearTmpModel", "model", "TYPE_DELIMITER", "IS_CONTAINER", "IS_EXTENDED_CLASS", "parseClassType", "componentType", "ret", "typeArr", "checkClassType", "assert", "isExtendedClass", "clz", "enableClassExtend", "rootClz", "mandatoryMethods", "proto", "superClass", "ExtendedClass", "isESClass", "_super", "__extends", "class_1", "inherits", "extend", "superCall", "superApply", "fn", "isFunction", "mountExtend", "SubClz", "SupperClz", "classBase", "enableClassCheck", "target", "classAttr", "obj", "context", "methodName", "args", "_i", "enableClassManagement", "storage", "componentFullType", "componentTypeInfo", "container", "makeContainer", "mainType", "subType", "throwWhenNotFound", "result", "each", "o", "type", "types", "makeStyleMapper", "properties", "ignoreParent", "i", "model", "excludes", "includes", "style", "propName", "indexOf", "val", "AREA_STYLE_KEY_MAP", "getAreaStyle", "makeStyleMapper", "AreaStyleMixin", "excludes", "includes", "globalImageCache", "LRU_default", "findExistImage", "newImageOrSrc", "cachedImgObj", "createOrUpdateImage", "image", "hostEl", "onload", "cbPayload", "pendingWrap", "isImageReady", "platformApi", "imageOnLoad", "i", "cb", "STYLE_REG", "truncateText", "text", "containerWidth", "font", "ellipsis", "options", "out", "truncateText2", "textLines", "prepareTruncateOptions", "isTruncated", "truncateOut", "i", "len", "truncateSingleLine", "preparedOpts", "extend", "retrieve2", "minChar", "fontMeasureInfo", "ensureFontMeasureInfo", "ascCharWidth", "contentWidth", "ellipsisWidth", "measureWidth", "textLine", "lineWidth", "j", "subLength", "estimateLength", "width", "measureCharWidth", "parsePlainText", "rawText", "style", "defaultOuterWidth", "defaultOuterHeight", "formatText", "overflow", "padding", "paddingH", "paddingV", "truncate", "calculatedLineHeight", "getLineHeight", "lineHeight", "truncateLineOverflow", "height", "lines", "wrapText", "contentHeight", "lineCount", "singleOut", "outerHeight", "outerWidth", "RichTextToken", "RichTextLine", "tokens", "RichTextContentBlock", "parseRichText", "rawText", "style", "defaultOuterWidth", "defaultOuterHeight", "topTextAlign", "contentBlock", "RichTextContentBlock", "text", "formatText", "stlPadding", "stlPaddingH", "stlPaddingV", "topWidth", "topHeight", "overflow", "wrapInfo", "lastIndex", "STYLE_REG", "result", "matchedIndex", "pushTokens", "pendingList", "calculatedHeight", "calculatedWidth", "truncate", "truncateLine", "tmpTruncateOut", "finishLine", "line", "lineWidth", "lineHeight", "outer", "i", "j", "token", "tokenStyle", "textPadding", "paddingH", "font", "getLineHeight", "tokenHeight", "retrieve2", "retrieve3", "originalLength", "styleTokenWidth", "tokenWidthNotSpecified", "measureWidth", "ensureFontMeasureInfo", "textBackgroundColor", "bgImg", "findExistImage", "isImageReady", "remainTruncWidth", "truncateText2", "percentWidth", "block", "str", "styleName", "isEmptyStr", "lines", "newLine", "strLines", "linesWidths", "tokenPadding", "tokenPaddingH", "outerWidth_1", "parsePercent", "res", "wrapText", "fontMeasureInfo", "RichTextToken", "tokens", "RichTextLine", "tokensLen", "isAlphabeticLetter", "ch", "code", "breakCharMap", "reduce", "obj", "isWordBreakChar", "isBreakAll", "lastAccumWidth", "currentWord", "currentWordWidth", "accumWidth", "chWidth", "measureCharWidth", "inWord", "calcInnerTextOverflowArea", "out", "overflowRect", "baseX", "baseY", "textAlign", "textVerticalAlign", "textWidth", "textHeight", "BoundingRect_default", "tmpCITCTextRect", "adjustTextX", "adjustTextY", "tmpCITCIntersectRectOpt", "outIntersectRect", "tSpanCreateBoundingRect", "contentWidth", "contentHeight", "tSpanCreateBoundingRect2", "forceLineWidth", "rect", "tSpanHasStroke", "stroke", "STYLE_MAGIC_KEY", "DEFAULT_COMMON_STYLE", "DEFAULT_COMMON_ANIMATION_PROPS", "PRIMARY_STATES_KEYS", "PRIMARY_STATES_KEYS_IN_HOVER_LAYER", "Displayable", "_super", "__extends", "props", "keysArr", "keys", "key", "viewWidth", "viewHeight", "considerClipPath", "considerAncestors", "m", "isDisplayableCulled", "i", "parent_1", "x", "y", "cb", "context", "coord", "rect", "transform", "elRect", "style", "shadowSize", "shadowOffsetX", "shadowOffsetY", "BoundingRect_default", "tolerance", "paintRect", "loop", "targetKey", "value", "keyOrObj", "extend", "notRedraw", "STYLE_CHANGED_BIT", "obj", "createObject", "toState", "normalState", "stateName", "state", "keepCurrentStates", "transition", "animationCfg", "needsRestoreToNormal", "targetStyle", "sourceStyle", "changedKeys", "targetKeys", "statesKeys", "states", "mergedState", "mergedStyle", "dispProto", "REDRAW_BIT", "Element_default", "tmpRect", "viewRect", "el", "width", "height", "Displayable_default", "mathMin", "mathMax", "mathSin", "mathCos", "PI2", "start", "create", "end", "extremity", "fromPoints", "points", "min", "max", "p", "left", "right", "top", "bottom", "i", "fromLine", "x0", "y0", "x1", "y1", "xDim", "yDim", "fromCubic", "x2", "y2", "x3", "y3", "cubicExtrema", "cubicAt", "n", "x", "y", "fromQuadratic", "quadraticExtremum", "quadraticAt", "tx", "ty", "fromArc", "rx", "ry", "startAngle", "endAngle", "anticlockwise", "vec2Min", "vec2Max", "diff", "tmp", "angle", "CMD", "tmpOutX", "tmpOutY", "min", "max", "min2", "max2", "mathMin", "mathMax", "mathCos", "mathSin", "mathAbs", "PI", "PI2", "hasTypedArray", "tmpAngles", "modPI2", "radian", "n", "normalizeArcAngles", "angles", "anticlockwise", "newStartAngle", "delta", "newEndAngle", "PathProxy", "notSaveData", "sx", "sy", "segmentIgnoreThreshold", "devicePixelRatio", "dpr", "ctx", "x", "y", "dx", "dy", "exceedUnit", "d2", "x1", "y1", "x2", "y2", "x3", "y3", "cx", "cy", "r", "startAngle", "endAngle", "radius", "w", "h", "x0", "y0", "data", "len", "i", "path", "appendSize", "offset", "oldData", "k", "appendPathData", "cmd", "a", "b", "c", "d", "e", "f", "g", "newData", "xi", "yi", "isFirst", "fromLine", "fromCubic", "fromQuadratic", "rx", "ry", "fromArc", "width", "height", "BoundingRect_default", "ux", "uy", "pathSegLen", "pathTotalLen", "segCount", "l", "cubicLength", "quadraticLength", "percent", "drawPart", "accumLength", "displayedLength", "pendingPtDist", "pendingPtX", "pendingPtY", "lo", "t", "cubicSubdivide", "quadraticSubdivide", "psi", "isEllipse", "breakBuild", "d_1", "newProxy", "proto", "PathProxy_default", "containStroke", "x0", "y0", "x1", "y1", "lineWidth", "x", "y", "_l", "_a", "_b", "tmp", "_s", "containStroke", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "lineWidth", "x", "y", "_l", "cubicProjectPoint", "containStroke", "x0", "y0", "x1", "y1", "x2", "y2", "lineWidth", "x", "y", "_l", "d", "quadraticProjectPoint", "PI2", "normalizeRadian", "angle", "PI2", "containStroke", "cx", "cy", "startAngle", "endAngle", "anticlockwise", "lineWidth", "x", "y", "_l", "d", "tmp", "normalizeRadian", "angle", "windingLine", "x0", "y0", "x1", "y1", "x", "y", "t", "dir", "x_", "CMD", "PathProxy_default", "PI2", "EPSILON", "isAroundEqual", "a", "b", "roots", "extrema", "swapExtrema", "tmp", "windingCubic", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "x", "y", "nRoots", "cubicRootAt", "w", "nExtrema", "y0_", "y1_", "i", "t", "unit", "x_", "cubicAt", "cubicExtrema", "windingQuadratic", "quadraticRootAt", "quadraticExtremum", "y_", "quadraticAt", "windingArc", "cx", "cy", "startAngle", "endAngle", "anticlockwise", "dTheta", "dir", "tmp_1", "angle", "containPath", "path", "lineWidth", "isStroke", "data", "len", "xi", "yi", "cmd", "isFirst", "windingLine", "containStroke", "rx", "ry", "theta", "_x", "width", "height", "contain", "pathProxy", "DEFAULT_PATH_STYLE", "defaults", "DEFAULT_COMMON_STYLE", "DEFAULT_PATH_ANIMATION_PROPS", "DEFAULT_COMMON_ANIMATION_PROPS", "pathCopyParams", "TRANSFORMABLE_PROPS", "Path", "_super", "__extends", "opts", "_this", "style", "decalEl", "ctx", "decalElStyle", "key", "i", "REDRAW_BIT", "props", "keysArr", "keys", "defaultStyle", "value", "extend", "pathFill", "isString", "fillLum", "lum", "DARK_LABEL_COLOR", "LIGHTER_LABEL_COLOR", "LIGHT_LABEL_COLOR", "textFill", "zr", "isDarkMode", "isDarkLabel", "DARK_MODE_THRESHOLD", "shapeCfg", "inBatch", "SHAPE_CHANGED_BIT", "PathProxy_default", "stroke", "fill", "rect", "needsUpdateRect", "firstInvoke", "path", "rectStroke", "lineScale", "w", "strokeContainThreshold", "x", "y", "localPos", "pathProxy", "lineWidth", "containStroke", "contain", "loop", "targetKey", "keyOrObj", "shape", "obj", "createObject", "toState", "normalState", "stateName", "state", "keepCurrentStates", "transition", "animationCfg", "needsRestoreToNormal", "targetShape", "targetShapePrimaryProps", "shapeKeys", "states", "mergedState", "mergedShape", "defaultProps", "Sub", "clone", "pathProto", "STYLE_CHANGED_BIT", "Displayable_default", "Path_default", "DEFAULT_TSPAN_STYLE", "defaults", "DEFAULT_FONT", "DEFAULT_PATH_STYLE", "TSpan", "_super", "__extends", "tSpanHasStroke", "style", "fill", "obj", "createObject", "rect", "tSpanCreateBoundingRect", "tspanProto", "Displayable_default", "TSpan_default", "DEFAULT_IMAGE_STYLE", "defaults", "DEFAULT_COMMON_STYLE", "DEFAULT_IMAGE_ANIMATION_PROPS", "DEFAULT_COMMON_ANIMATION_PROPS", "isImageLike", "source", "ZRImage", "_super", "__extends", "obj", "createObject", "dim", "style", "size", "imageSource", "otherDim", "otherDimSize", "BoundingRect_default", "Displayable_default", "Image_default", "buildPath", "ctx", "shape", "x", "y", "width", "height", "r", "r1", "r2", "r3", "r4", "total", "round", "subPixelOptimizeLine", "outputShape", "inputShape", "style", "x1", "x2", "y1", "y2", "lineWidth", "subPixelOptimize", "subPixelOptimizeRect", "originX", "originY", "originWidth", "originHeight", "position", "positiveOrNegative", "doubledPosition", "RectShape", "subPixelOptimizeOutputShape", "Rect", "_super", "__extends", "opts", "RectShape", "ctx", "shape", "x", "y", "width", "height", "optimizedShape", "subPixelOptimizeRect", "buildPath", "Path_default", "Rect_default", "DEFAULT_RICH_TEXT_COLOR", "DEFAULT_STROKE_LINE_WIDTH", "tmpCITOverflowAreaOut", "DEFAULT_TEXT_ANIMATION_PROPS", "defaults", "DEFAULT_COMMON_ANIMATION_PROPS", "ZRText", "_super", "__extends", "opts", "_this", "i", "child", "innerTransformable", "m", "normalizeTextStyle", "zr", "tmpRect", "BoundingRect_default", "children", "tmpMat", "rect", "childRect", "transform", "defaultTextStyle", "textContent", "targetStyle", "sourceStyle", "sourceRich", "targetRich", "extend", "richNames", "keys", "richName", "Ctor", "style", "textFont", "DEFAULT_FONT", "textPadding", "defaultStyle", "baseX", "baseY", "textAlign", "verticalAlign", "calcInnerTextOverflowArea", "text", "getStyleText", "contentBlock", "parsePlainText", "needDrawBg", "needDrawBackground", "bgColorDrawn", "outerHeight", "outerWidth", "textLines", "lineHeight", "textX", "textY", "adjustTextY", "boxX", "adjustTextX", "boxY", "getTextXForPadding", "defaultLineWidth", "usingDefaultStroke", "useDefaultFill", "textFill", "getFill", "textStroke", "getStroke", "hasShadow", "el", "TSpan_default", "subElStyle", "setSeparateFont", "tSpanCreateBoundingRect2", "parseRichText", "contentWidth", "xLeft", "lineTop", "xRight", "line", "tokens", "tokenCount", "remainedWidth", "leftIndex", "lineXLeft", "lineXRight", "rightIndex", "token", "x", "parentBgColorDrawn", "tokenStyle", "y", "retrieve3", "retrieve2", "topStyle", "width", "height", "textBackgroundColor", "textBorderWidth", "textBorderColor", "isImageBg", "isPlainOrGradientBg", "textBorderRadius", "self", "rectEl", "imgEl", "Rect_default", "rectShape", "rectStyle", "Image_default", "imgStyle", "commonStyle", "font", "hasSeparateFont", "parseFontSize", "trim", "Displayable_default", "VALID_TEXT_ALIGN", "VALID_TEXT_VERTICAL_ALIGN", "FONT_PARTS", "fontSize", "DEFAULT_FONT_SIZE", "fontProp", "val", "normalizeStyle", "each", "normalizeCssArray", "stroke", "lineWidth", "fill", "Text_default", "getECData", "makeInner", "setCommonECData", "seriesIndex", "dataType", "dataIdx", "el", "ecData", "child", "childECData", "_highlightNextDigit", "_highlightKeyMap", "getSavedStates", "makeInner", "getComponentStates", "HOVER_STATE_NORMAL", "HOVER_STATE_BLUR", "HOVER_STATE_EMPHASIS", "SPECIAL_STATES", "DISPLAY_STATES", "Z2_EMPHASIS_LIFT", "Z2_SELECT_LIFT", "HIGHLIGHT_ACTION_TYPE", "DOWNPLAY_ACTION_TYPE", "SELECT_ACTION_TYPE", "UNSELECT_ACTION_TYPE", "TOGGLE_SELECT_ACTION_TYPE", "SELECT_CHANGED_EVENT_TYPE", "hasFillOrStroke", "fillOrStroke", "doChangeHoverState", "el", "stateName", "hoverStateEnum", "singleEnterEmphasis", "singleLeaveEmphasis", "singleEnterBlur", "singleLeaveBlur", "singleEnterSelect", "singleLeaveSelect", "updateElementState", "updater", "commonParam", "traverseUpdateState", "child", "setStatesFlag", "getFromStateStyle", "el", "props", "toStateName", "defaultValue", "style", "fromState", "i", "propName", "val", "animator", "createEmphasisDefaultState", "stateName", "targetStates", "state", "hasSelect", "indexOf", "cloned", "Path_default", "store", "getSavedStates", "fromFill", "fromStroke", "hasFillOrStroke", "emphasisStyle", "extend", "liftColor", "z2EmphasisLift", "Z2_EMPHASIS_LIFT", "createSelectDefaultState", "z2SelectLift", "Z2_SELECT_LIFT", "createBlurDefaultState", "hasBlur", "currentOpacity", "blurStyle", "elementStateProxy", "setDefaultStateProxy", "textContent", "textGuide", "enterEmphasisWhenMouseOver", "e", "shouldSilent", "traverseUpdateState", "singleEnterEmphasis", "leaveEmphasisWhenMouseOut", "singleLeaveEmphasis", "enterEmphasis", "highlightDigit", "leaveEmphasis", "enterBlur", "singleEnterBlur", "leaveBlur", "singleLeaveBlur", "enterSelect", "singleEnterSelect", "leaveSelect", "singleLeaveSelect", "allLeaveBlur", "api", "model", "leaveBlurredSeries", "allComponentViews", "componentType", "componentModel", "componentStates", "getComponentStates", "isSeries", "view", "child", "each", "blurSeries", "targetSeriesIndex", "focus", "blurScope", "ecModel", "leaveBlurOfIndices", "data", "dataIndices", "itemEl", "targetSeriesModel", "targetCoordSys", "blurredSeries", "seriesModel", "sameSeries", "coordSys", "sameCoordSys", "isArrayLike", "isObject", "dataTypes", "keys", "d", "blurComponent", "componentMainType", "componentIndex", "blurSeriesFromHighlightPayload", "payload", "seriesIndex", "dataIndex", "queryDataIndex", "isArray", "count", "current", "ecData", "getECData", "focus_1", "findComponentHighDownDispatchers", "name", "ret", "dispatchers", "focusSelf", "handleGlobalMouseOverForHighDown", "dispatcher", "_a", "handleGlobalMouseOutForHighDown", "toggleSelectionFromPayload", "isSelectChangePayload", "dataType", "TOGGLE_SELECT_ACTION_TYPE", "SELECT_ACTION_TYPE", "updateSeriesElementSelection", "allData", "type", "idx", "getAllSelectedIndices", "item", "enableHoverEmphasis", "setAsHighDownDispatcher", "enableHoverFocus", "disableHoverEmphasis", "toggleHoverEmphasis", "isDisabled", "OTHER_STATES", "defaultStyleGetterMap", "setStatesStylesFromModel", "itemModel", "styleType", "getter", "asDispatcher", "disable", "extendedEl", "isHighDownDispatcher", "enableComponentHighDownFeatures", "componentHighDownName", "getHighlightDigit", "highlightKey", "_highlightKeyMap", "_highlightNextDigit", "payloadType", "UNSELECT_ACTION_TYPE", "isHighDownPayload", "HIGHLIGHT_ACTION_TYPE", "DOWNPLAY_ACTION_TYPE", "savePathStates", "selectState", "graphic_exports", "__export", "Arc_default", "BezierCurve_default", "BoundingRect_default", "Circle_default", "CompoundPath_default", "Ellipse_default", "Group_default", "Image_default", "IncrementalDisplayable_default", "Line_default", "LinearGradient_default", "OrientedBoundingRect_default", "Path_default", "Point_default", "Polygon_default", "Polyline_default", "RadialGradient_default", "Rect_default", "Ring_default", "Sector_default", "Text_default", "WH", "XY", "applyTransform", "calcZ2Range", "clipPointsByRect", "clipRectByRect", "createIcon", "ensureCopyRect", "ensureCopyTransform", "expandOrShrinkRect", "extendPath", "extendShape", "getShapeClass", "getTransform", "groupTransition", "initProps", "isBoundingRectAxisAligned", "isElementRemoved", "lineLineIntersect", "linePolygonIntersect", "makeImage", "makePath", "mergePath", "registerShape", "removeElement", "removeElementWithFadeOut", "resizePath", "retrieveZInfo", "setTooltipConfig", "subPixelOptimize", "subPixelOptimizeLine", "subPixelOptimizeRect", "transformDirection", "traverseElements", "traverseUpdateZ", "updateProps", "CMD", "PathProxy_default", "points", "mathSqrt", "mathAtan2", "transformPath", "path", "m", "data", "len", "cmd", "nPoint", "i", "j", "k", "p", "M", "C", "L", "R", "A", "Q", "x", "y", "sx", "sy", "angle", "applyTransform", "p_1", "mathSqrt", "mathSin", "mathCos", "PI", "vMag", "v", "vRatio", "u", "vAngle", "processArc", "x1", "y1", "x2", "y2", "fa", "fs", "rx", "ry", "psiDeg", "cmd", "path", "psi", "xp", "yp", "lambda", "f", "cxp", "cyp", "cx", "cy", "theta", "dTheta", "n", "commandReg", "numberReg", "createPathProxyFromString", "data", "PathProxy_default", "cpx", "cpy", "subpathX", "subpathY", "prevCmd", "CMD", "cmdList", "l", "cmdText", "cmdStr", "pLen", "i", "off", "ctlPtx", "ctlPty", "len", "pathData", "SVGPath", "_super", "__extends", "m", "Path_default", "isPathProxy", "createPathOptions", "str", "opts", "pathProxy", "innerOpts", "extend", "beProxy", "ctx", "transformPath", "createFromString", "extendFromString", "defaultOpts", "Sub", "_this", "mergePath", "pathEls", "pathList", "pathEl", "pathBundle", "clonePath", "sourcePath", "CircleShape", "Circle", "_super", "__extends", "opts", "CircleShape", "ctx", "shape", "Path_default", "Circle_default", "EllipseShape", "Ellipse", "_super", "__extends", "opts", "EllipseShape", "ctx", "shape", "k", "x", "y", "a", "b", "ox", "oy", "Path_default", "Ellipse_default", "PI", "PI2", "mathSin", "mathCos", "mathACos", "mathATan2", "mathAbs", "mathSqrt", "mathMax", "mathMin", "e", "intersect", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "dx10", "dy10", "dx32", "dy32", "t", "computeCornerTangents", "radius", "cr", "clockwise", "x01", "y01", "lo", "ox", "oy", "x11", "y11", "x10", "y10", "x00", "y00", "dx", "dy", "d2", "r", "s", "d", "cx0", "cy0", "cx1", "cy1", "dx0", "dy0", "dx1", "dy1", "normalizeCornerRadius", "arr", "isArray", "len", "buildPath", "ctx", "shape", "_a", "innerRadius", "hasRadius", "hasInnerRadius", "tmp", "startAngle", "endAngle", "cx", "cy", "arc", "mod", "icrStart", "icrEnd", "ocrStart", "ocrEnd", "ocrs", "ocre", "icrs", "icre", "ocrMax", "icrMax", "limitedOcrMax", "limitedIcrMax", "xre", "yre", "xirs", "yirs", "xrs", "yrs", "xire", "yire", "hasArc", "cornerRadius", "halfRd", "it_1", "a", "b", "crStart", "crEnd", "ct0", "ct1", "SectorShape", "Sector", "_super", "__extends", "opts", "SectorShape", "ctx", "shape", "buildPath", "Path_default", "Sector_default", "RingShape", "Ring", "_super", "__extends", "opts", "RingShape", "ctx", "shape", "x", "y", "PI2", "Path_default", "Ring_default", "smoothBezier", "points", "smooth", "isLoop", "constraint", "cps", "v", "v1", "v2", "prevPoint", "nextPoint", "min", "max", "i", "len", "point", "clone", "sub", "scale", "d0", "distance", "d1", "sum", "cp0", "add", "cp1", "buildPath", "ctx", "shape", "closePath", "smooth", "points", "controlPoints", "smoothBezier", "len", "i", "cp1", "cp2", "p", "l", "PolygonShape", "Polygon", "_super", "__extends", "opts", "PolygonShape", "ctx", "shape", "buildPath", "Path_default", "Polygon_default", "PolylineShape", "Polyline", "_super", "__extends", "opts", "PolylineShape", "ctx", "shape", "buildPath", "Path_default", "Polyline_default", "subPixelOptimizeOutputShape", "LineShape", "Line", "_super", "__extends", "opts", "LineShape", "ctx", "shape", "x1", "y1", "x2", "y2", "optimizedShape", "subPixelOptimizeLine", "subPixelOptimizeOutputShape", "percent", "p", "Path_default", "Line_default", "out", "BezierCurveShape", "someVectorAt", "shape", "isTangent", "cpx2", "cpy2", "cubicDerivativeAt", "cubicAt", "quadraticDerivativeAt", "quadraticAt", "BezierCurve", "_super", "__extends", "opts", "BezierCurveShape", "ctx", "x1", "y1", "x2", "y2", "cpx1", "cpy1", "percent", "quadraticSubdivide", "out", "cubicSubdivide", "t", "p", "normalize", "Path_default", "BezierCurve_default", "ArcShape", "Arc", "_super", "__extends", "opts", "ArcShape", "ctx", "shape", "x", "y", "r", "startAngle", "endAngle", "clockwise", "unitX", "unitY", "Path_default", "Arc_default", "CompoundPath", "_super", "__extends", "_this", "paths", "dirtyPath", "scale", "ctx", "shape", "i", "Path_default", "CompoundPath_default", "Gradient", "colorStops", "offset", "color", "Gradient_default", "LinearGradient", "_super", "__extends", "x", "y", "x2", "y2", "colorStops", "globalCoord", "_this", "Gradient_default", "LinearGradient_default", "RadialGradient", "_super", "__extends", "x", "y", "r", "colorStops", "globalCoord", "_this", "Gradient_default", "RadialGradient_default", "mathMin", "mathMax", "mathAbs", "_extent", "_extent2", "_intersectCtx", "createIntersectContext", "_minTv", "_maxTv", "OrientedBoundingRect", "rect", "transform", "i", "Point_default", "corners", "axes", "x", "y", "x2", "y2", "other", "mtv", "opt", "overlapped", "noMtv", "self", "inverse", "axis", "dist0", "dist1", "dim", "out", "origin", "proj", "min", "max", "proj_1", "OrientedBoundingRect_default", "m", "IncrementalDisplayable", "_super", "__extends", "_this", "cb", "context", "displayable", "notPersistent", "displayables", "i", "rect", "BoundingRect_default", "childRect", "x", "y", "localPos", "Displayable_default", "IncrementalDisplayable_default", "transitionStore", "makeInner", "getAnimationConfig", "animationType", "animatableModel", "dataIndex", "extraOpts", "extraDelayParams", "animationPayload", "updatePayload", "animationEnabled", "isUpdate", "duration", "easing", "delay", "retrieve2", "isFunction", "config", "animateOrSetProps", "el", "props", "cb", "during", "isFrom", "removeOpt", "isObject", "isRemove", "animationConfig", "animationDelay", "animationEasing", "animateConfig", "updateProps", "initProps", "el", "props", "animatableModel", "dataIndex", "cb", "during", "animateOrSetProps", "isElementRemoved", "i", "animator", "removeElement", "fadeOutDisplayable", "done", "removeElementWithFadeOut", "doRemove", "disp", "saveOldStyle", "transitionStore", "getOldStyle", "_customShapeMap", "XY", "WH", "extendShape", "opts", "Path_default", "extendPathFromString", "extendFromString", "extendPath", "pathData", "registerShape", "name", "ShapeClass", "getShapeClass", "makePath", "rect", "layout", "path", "createFromString", "centerGraphic", "resizePath", "makeImage", "imageUrl", "zrImg", "Image_default", "img", "boundingRect", "aspect", "width", "height", "cx", "cy", "mergePath", "pathRect", "m", "subPixelOptimizeLine", "shape", "lineWidth", "subPixelOptimizeRect", "style", "subPixelOptimize", "getTransform", "target", "ancestor", "mat", "identity", "mul", "applyTransform", "transform", "invert", "isArrayLike", "Transformable_default", "transformDirection", "direction", "hBase", "mathAbs", "vBase", "vertex", "isNotGroup", "el", "isPath", "groupTransition", "g1", "g2", "animatableModel", "getElMap", "g", "elMap", "getAnimatableProps", "obj", "clone", "elMap1", "oldEl", "newProp", "updateProps", "getECData", "clipPointsByRect", "points", "map", "point", "x", "mathMax", "mathMin", "y", "clipRectByRect", "targetRect", "x2", "y2", "createIcon", "iconStr", "opt", "innerOpts", "extend", "defaults", "linePolygonIntersect", "a1x", "a1y", "a2x", "a2y", "i", "p2", "p", "lineLineIntersect", "b1x", "b1y", "b2x", "b2y", "mx", "my", "nx", "ny", "nmCrossProduct", "crossProduct2d", "nearZero", "b1a1x", "b1a1y", "q", "x1", "y1", "val", "expandOrShrinkRect", "delta", "shrinkOrExpand", "noNegative", "minSize", "isNumber", "_tmpExpandRectDelta", "expandRectOnOneDimension", "xy", "wh", "ltIdx", "rbIdx", "deltaSum", "oldSize", "setTooltipConfig", "itemTooltipOption", "componentModel", "itemName", "itemTooltipOptionObj", "isString", "mainType", "componentIndex", "formatterParams", "formatterParamsExtra", "each", "keys", "key", "hasOwn", "ecData", "traverseElement", "cb", "stopped", "traverseElements", "els", "isArray", "isBoundingRectAxisAligned", "AXIS_ALIGN_EPSILON", "ensureCopyRect", "source", "BoundingRect_default", "ensureCopyTransform", "copy", "create", "retrieveZInfo", "model", "calcZ2Range", "max", "min", "visitEl", "currentStates", "idx", "calcZ2", "entity", "z2", "traverseUpdateZ", "z", "zlevel", "doUpdateZ", "maxZ2", "label", "labelLine", "isGroup", "children", "textGuideLineConfig", "Circle_default", "Ellipse_default", "Sector_default", "Ring_default", "Polygon_default", "Polyline_default", "Rect_default", "Line_default", "BezierCurve_default", "Arc_default", "EMPTY_OBJ", "setLabelText", "label", "labelTexts", "i", "SPECIAL_STATES", "stateName", "text", "state", "oldStates", "getLabelText", "opt", "stateModels", "interpolatedValue", "labelFetcher", "labelDataIndex", "labelDimIndex", "normalModel", "baseText", "isFunction", "statesText", "stateModel", "retrieve2", "setLabelStyle", "targetEl", "labelStatesModels", "stateSpecified", "isSetOnText", "Text_default", "needsCreateText", "DISPLAY_STATES", "textContent", "labelStatesTexts", "showNormal", "normalStyle", "createTextStyle", "createTextConfig", "stateObj", "stateShow", "targetElEmphasisState", "labelInner", "getLabelStatesModels", "itemModel", "labelName", "statesModels", "i", "SPECIAL_STATES", "stateName", "createTextStyle", "textStyleModel", "specifiedTextStyle", "opt", "isNotNormal", "isAttached", "textStyle", "setTextStyleCommon", "extend", "createTextConfig", "textConfig", "labelPosition", "labelRotate", "labelDistance", "retrieve2", "labelOffset", "EMPTY_OBJ", "ecModel", "globalTextStyle", "richItemNames", "getRichItemNames", "richResult", "richInheritPlainLabelOptionName", "richInheritPlainLabel", "name_1", "richTextStyle", "setTokenTextStyle", "overflow", "lineOverflow", "labelTextStyle", "minMargin", "isNumber", "LabelMarginType", "textMargin", "normalizeCssArray", "richItemNameMap", "rich", "richKeys", "keys", "richKey", "TEXT_PROPS_WITH_GLOBAL", "TEXT_PROPS_SELF", "TEXT_PROPS_BOX", "plainTextModel", "isBlock", "inRich", "inheritColor", "fillColor", "strokeColor", "opacity", "textBorderWidth", "textBorderType", "textBorderDashOffset", "key", "val", "retrieve3", "baseline", "borderType", "getFont", "gTextStyleModel", "trim", "labelInner", "makeInner", "setLabelValueAnimation", "label", "labelStatesModels", "value", "getDefaultText", "obj", "normalLabelModel", "animateLabelValue", "textEl", "dataIndex", "data", "animatableModel", "labelFetcher", "labelInnerStore", "defaultInterpolatedText", "currValue", "targetValue", "during", "percent", "interpolated", "interpolateRawValues", "labelText", "getLabelText", "setLabelText", "initProps", "updateProps", "PATH_COLOR", "textStyleParams", "tmpText", "Text_default", "TextStyleMixin", "isEmphasis", "ecModel", "getFont", "text", "style", "i", "textStyle_default", "LINE_STYLE_KEY_MAP", "getLineStyle", "makeStyleMapper", "LineStyleMixin", "excludes", "ITEM_STYLE_KEY_MAP", "getItemStyle", "makeStyleMapper", "ItemStyleMixin", "excludes", "includes", "Model", "option", "parentModel", "ecModel", "rest", "_i", "merge", "path", "ignoreParent", "key", "val", "hasPath", "pathFinal", "obj", "Ctor", "clone", "env_default", "pathArr", "enableClassExtend", "enableClassCheck", "mixin", "LineStyleMixin", "ItemStyleMixin", "AreaStyleMixin", "textStyle_default", "Model_default", "base", "getUID", "type", "enableSubTypeDefaulter", "target", "subTypeDefaulters", "componentType", "defaulter", "componentTypeInfo", "parseClassType", "option", "componentTypeMain", "enableTopologicalTravel", "entity", "dependencyGetter", "targetNameList", "fullNameList", "callback", "context", "result", "makeDepndencyGraph", "graph", "noEntryList", "targetNameSet", "each", "name", "currComponentType", "currVertex", "isInTargetNameSet", "removeEdgeAndAdd", "removeEdge", "errMsg", "succComponentType", "thisItem", "createDependencyGraphItem", "originalDeps", "availableDeps", "getAvailableDependencies", "dependentName", "indexOf", "thatItem", "dep", "inheritDefaultOption", "superOption", "subOption", "merge", "langEN_default", "langZH_default", "LOCALE_ZH", "LOCALE_EN", "DEFAULT_LOCALE", "localeStorage", "localeModels", "SYSTEM_LANG", "env_default", "langStr", "registerLocale", "locale", "localeObj", "Model_default", "createLocaleObject", "isString", "clone", "merge", "getLocaleModel", "lang", "getDefaultLocaleModel", "langEN_default", "langZH_default", "_impl", "registerScaleBreakHelperImpl", "impl", "getScaleBreakHelper", "ONE_SECOND", "ONE_MINUTE", "ONE_HOUR", "ONE_DAY", "ONE_YEAR", "primaryTimeUnitFormatterMatchers", "defaultFormatterSeed", "defaultFullFormatter", "fullDayFormatter", "fullLeveledFormatter", "primaryTimeUnits", "timeUnits", "parseTimeAxisLabelFormatter", "formatter", "isString", "isFunction", "parseTimeAxisLabelFormatterDictionary", "dictOption", "dict", "canAddHighlight", "each", "lowestUnit", "lowestUnitIdx", "upperDictOption", "lowerTpl", "upperUnitIdx", "upperUnit", "upperDictItemOption", "isObject", "isArray", "tplArr", "pad", "str", "len", "getPrimaryTimeUnit", "timeUnit", "isPrimaryTimeUnit", "getDefaultFormatPrecisionOfInterval", "format", "time", "template", "isUTC", "lang", "date", "parseDate", "y", "fullYearGetterName", "M", "monthGetterName", "q", "d", "dateGetterName", "e", "H", "hoursGetterName", "h", "m", "minutesGetterName", "s", "secondsGetterName", "S", "millisecondsGetterName", "a", "A", "localeModel", "Model_default", "getLocaleModel", "SYSTEM_LANG", "getDefaultLocaleModel", "timeModel", "month", "monthAbbr", "dayOfWeek", "dayOfWeekAbbr", "leveledFormat", "tick", "idx", "extra", "scaleBreakHelper", "getScaleBreakHelper", "tickTime", "leveledTplArr", "unit", "getUnitFromValue", "value", "isSecond", "isMinute", "isHour", "isDay", "isMonth", "isYear", "roundTime", "monthSetterName", "dateSetterName", "hoursSetterName", "minutesSetterName", "secondsSetterName", "millisecondsSetterName", "fullYearSetterName", "getTextRect", "text", "font", "align", "verticalAlign", "padding", "rich", "truncate", "lineHeight", "textEl", "Text_default", "addCommas", "x", "isNumeric", "isString", "parts", "toCamelCase", "str", "upperCaseFirst", "match", "group1", "normalizeCssArray", "makeValueReadable", "value", "valueType", "useUTC", "USER_READABLE_DEFUALT_TIME_PATTERN", "stringToUserReadable", "str", "trim", "isNumberUserReadable", "num", "isTypeTime", "isValueDate", "date", "parseDate", "format", "isStringSafe", "isNumber", "numericResult", "numericToNumber", "addCommas", "TPL_VAR_ALIAS", "wrapVar", "varName", "seriesIdx", "formatTpl", "tpl", "paramsList", "encode", "isArray", "seriesLen", "$vars", "i", "alias", "k", "val", "encodeHTML", "formatTplSimple", "param", "each", "key", "getTooltipMarker", "inOpt", "extraCssText", "opt", "isString", "color", "type", "renderMode", "markerId", "formatTime", "isUTC", "getUTC", "y", "M", "d", "h", "m", "s", "S", "pad", "capitalFirst", "convertToColorString", "defaultColor", "isObject", "windowOpen", "link", "target", "blank", "nonSeriesBoxCoordSysCreators", "normalCoordSysCreators", "CoordinateSystemManager", "ecModel", "api", "dealCreate", "creatorMap", "canBeNonSeriesBox", "coordinateSystems", "each", "creator", "type", "list", "coordSys", "canBeNonSeriesBoxCoordSys", "coordSysType", "BoxCoordinateSystemCoordFrom", "registerLayOutOnCoordSysUsage", "opt", "coordSysUseMap", "createHashMap", "getCoordForBoxCoordSys", "model", "coord", "from", "store", "CoordinateSystemUsageKind", "decideCoordSysUsageKind", "printError", "coordSysUsageOption", "isDeclaredExplicitly", "kind", "isSeries", "injectCoordSysByOption", "targetModel", "coordSysProvider", "isDefaultDataCoordSys", "allowNotFound", "_a", "declaredType", "simpleCoordSysInjectionProvider", "injectTargetModel", "coordSysModel", "SINGLE_REFERRING", "CoordinateSystem_default", "each", "LOCATION_PARAMS", "HV_NAMES", "boxLayout", "orient", "group", "gap", "maxWidth", "maxHeight", "x", "y", "currentLineMaxSize", "child", "idx", "rect", "nextChild", "nextChildRect", "nextX", "nextY", "moveX", "moveY", "box", "vbox", "curry", "hbox", "getBoxLayoutParams", "boxLayoutModel", "ignoreParent", "getViewRectAndCenterForCircleLayout", "seriesModel", "api", "layoutRef", "createBoxLayoutReference", "boxLayoutParams", "viewRect", "center", "BoxLayoutReferenceType", "getLayoutRect", "centerOption", "centerOptionArr", "isArray", "BoxCoordinateSystemCoordFrom", "parsePercent", "getCircleLayout", "_a", "radius", "width", "height", "size", "r0", "r", "positionInfo", "containerRect", "margin", "normalizeCssArray", "containerWidth", "containerHeight", "left", "top", "right", "bottom", "verticalMargin", "horizontalMargin", "aspect", "BoundingRect_default", "applyPreserveAspect", "component", "layoutRect", "preserveAspect", "actualAspect", "preserveAspectAlign", "preserveAspectVerticalAlign", "layoutOptInner", "isCover", "model", "opt", "refContainer", "refPoint", "layoutRefType", "boxCoordSys", "boxCoordFrom", "getCoordForBoxCoordSys", "coord", "from", "result", "positionElement", "el", "out", "h", "v", "boundingMode", "transform", "defaults", "dx", "dy", "sizeCalculable", "option", "hvIdx", "fetchLayoutMode", "ins", "layoutMode", "isObject", "mergeLayoutParam", "targetOption", "newOption", "ignoreSize", "hResult", "merge", "vResult", "copy", "names", "newParams", "newValueCount", "merged", "mergedValueCount", "enoughParamNumber", "name", "hasOwn", "hasValue", "i", "name_1", "obj", "target", "source", "getLayoutParams", "copyLayoutParams", "inner", "makeInner", "ComponentModel", "_super", "__extends", "option", "parentModel", "ecModel", "_this", "getUID", "layoutMode", "fetchLayoutMode", "inputPositionParams", "getLayoutParams", "themeModel", "merge", "mergeLayoutParam", "newCptOption", "isInit", "ctor", "isExtendedClass", "fields", "optList", "clz", "opt", "defaultOption", "i", "mainType", "indexKey", "idKey", "queryReferringComponents", "getBoxLayoutParams", "zlevel", "proto", "Model_default", "mountExtend", "enableClassManagement", "enableSubTypeDefaulter", "enableTopologicalTravel", "getDependencies", "componentType", "deps", "each", "map", "type", "parseClassType", "indexOf", "Component_default", "tokens", "color", "extend", "key", "hex", "modifyHSL", "s", "l", "tokens_default", "platform", "decalColor", "themeColor", "tokens_default", "lightThemeColor", "modifyHSL", "globalDefault_default", "VISUAL_DIMENSIONS", "createHashMap", "SOURCE_FORMAT_ORIGINAL", "SOURCE_FORMAT_ARRAY_ROWS", "SOURCE_FORMAT_OBJECT_ROWS", "SOURCE_FORMAT_KEYED_COLUMNS", "SOURCE_FORMAT_TYPED_ARRAY", "SOURCE_FORMAT_UNKNOWN", "SERIES_LAYOUT_BY_COLUMN", "SERIES_LAYOUT_BY_ROW", "BE_ORDINAL", "innerGlobalModel", "makeInner", "resetSourceDefaulter", "ecModel", "createHashMap", "makeSeriesEncodeForAxisCoordSys", "coordDimensions", "seriesModel", "source", "encode", "datasetModel", "querySeriesUpstreamDatasetModel", "encodeItemName", "encodeSeriesName", "datasetMap", "key", "baseCategoryDimIndex", "categoryWayValueDimStart", "each", "coordDimInfoLoose", "coordDimIdx", "coordDimInfo", "isObject", "getDataDimCountOnCoordDim", "datasetRecord", "coordDimName", "count", "start", "pushDim", "dimIdxArr", "idxFrom", "idxCount", "i", "dimsDef", "makeSeriesEncodeForNameBased", "dimCount", "sourceFormat", "dimensionsDefine", "potentialNameDimIndex", "SOURCE_FORMAT_OBJECT_ROWS", "SOURCE_FORMAT_KEYED_COLUMNS", "dim", "idx", "idxResult", "idxRes0", "idxRes1", "guessRecords", "len", "guessResult", "doGuessOrdinal", "isPureNumber", "fulfilled", "nameDimIndex", "thisData", "queryReferringComponents", "SINGLE_REFERRING", "queryDatasetUpstreamDatasetModels", "guessOrdinal", "dimIndex", "data", "seriesLayoutBy", "startIndex", "result", "maxLoop", "isTypedArray", "dimName", "dimType", "dimDefItem", "isString", "SOURCE_FORMAT_ARRAY_ROWS", "dataArrayRows", "SERIES_LAYOUT_BY_ROW", "sample", "detectValue", "row", "dataObjectRows", "item", "dataKeyedColumns", "SOURCE_FORMAT_ORIGINAL", "dataOriginal", "val", "getDataItemValue", "isArray", "beStr", "internalOptionCreatorMap", "createHashMap", "registerInternalOptionCreator", "mainType", "creator", "assert", "concatInternalOptions", "ecModel", "newCmptOptionList", "internalOptionCreator", "internalOptions", "i", "innerColor", "makeInner", "innerDecal", "PaletteMixin", "name", "scope", "requestNum", "defaultPalette", "normalizeToArray", "layeredPalette", "getFromPalette", "clearPalette", "getDecalFromPalette", "ecModel", "defaultDecals", "getNearestPalette", "palettes", "requestColorNum", "paletteNum", "i", "that", "inner", "scopeFields", "paletteIdx", "paletteNameMap", "palette", "pickedPaletteItem", "reCreateSeriesIndices", "assertSeriesInitialized", "initBase", "OPTION_INNER_KEY", "OPTION_INNER_VALUE", "GlobalModel", "_super", "__extends", "option", "parentModel", "ecModel", "theme", "locale", "optionManager", "Model_default", "opts", "optionPreprocessorFuncs", "innerOpt", "normalizeSetOptionInput", "type", "opt", "optionChanged", "baseOption", "initBase", "timelineOption", "mediaOptions", "each", "mediaOption", "newOption", "componentsMap", "componentsCount", "newCmptTypes", "newCmptTypeMap", "createHashMap", "replaceMergeMainTypeMap", "resetSourceDefaulter", "componentOption", "mainType", "Component_default", "clone", "merge", "val", "mainTypeInReplaceMerge", "visitComponent", "newCmptOptionList", "concatInternalOptions", "normalizeToArray", "oldCmptList", "mergeMode", "mappingResult", "mappingToExists", "setComponentTypeToKeyInfo", "optionsByMainType", "cmptsByMainType", "cmptsCountByMainType", "tooltipExists", "tooltipWarningLogged", "resultItem", "index", "componentModel", "newCmptOption", "isSeriesType", "ComponentModelClass", "subType", "seriesImportName", "extraOpt", "extend", "reCreateSeriesIndices", "optInMainType", "realLen", "metNonInner", "i", "isComponentIdInternal", "OPTION_INNER_KEY", "payload", "idx", "list", "cmpt", "condition", "id", "name", "cmpts", "result", "queryByIdOrName", "filter", "filterBySubType", "query", "queryCond", "getQueryCond", "doFilter", "q", "indexAttr", "idAttr", "nameAttr", "res", "cb", "context", "isFunction", "ctxForAll_1", "cbForAll_1", "componentType", "isString", "isObject", "nameStr", "convertOptionIdName", "oneSeries", "seriesIndex", "assertSeriesInitialized", "rawSeriesIndex", "series", "seriesModel", "newSeriesIndices", "seriesRawIdx", "componentTypes", "components", "component", "isNotTargetSeries", "seriesIndices", "OPTION_INNER_VALUE", "airaOption", "mergeTheme", "globalDefault_default", "name_1", "notMergeColorLayer", "themeItem", "attr", "idOrName", "isArray", "keyMap_1", "idOrNameItem", "idName", "idName_1", "mixin", "PaletteMixin", "Global_default", "availableMethods", "ExtensionAPI", "ecInstance", "each", "methodName", "bind", "ExtensionAPI_default", "QUERY_REG", "OptionManager", "api", "rawOption", "optionPreprocessorFuncs", "opt", "each", "normalizeToArray", "series", "isTypedArray", "setAsPrimitive", "dataset", "clone", "optionBackup", "newParsedOption", "parseRawOption", "isRecreate", "ecModel", "option", "timelineOptions", "timelineModel", "ecWidth", "ecHeight", "mediaList", "mediaDefault", "indices", "result", "i", "len", "applyMediaQuery", "indicesEquals", "map", "index", "isNew", "baseOption", "declaredBaseOption", "timelineOnRoot", "timelineOptionsOnRoot", "mediaOnRoot", "hasMedia", "hasTimeline", "isArray", "singleMedia", "doPreprocess", "media", "preProcess", "query", "realMap", "applicable", "value", "attr", "matched", "operator", "realAttr", "compare", "real", "expect", "indices1", "indices2", "OptionManager_default", "each", "isObject", "POSSIBLE_STYLES", "compatEC2ItemStyle", "opt", "itemStyleOpt", "i", "len", "styleName", "normalItemStyleOpt", "emphasisItemStyleOpt", "merge", "convertNormalEmphasis", "optType", "useExtend", "normalOpt", "emphasisOpt", "defaults", "removeEC3NormalStatus", "compatTextStyle", "propName", "labelOptSingle", "textStyle", "TEXT_STYLE_OPTIONS", "textPropName", "compatEC3CommonStyles", "processSeries", "seriesOpt", "markPoint", "markLine", "markArea", "data", "edgeData", "isTypedArray", "mpData", "mlData", "isArray", "toArr", "o", "toObj", "globalCompatStyle", "option", "isTheme", "axes", "axisName", "axisOpt", "parallelOpt", "parallelAxisDefault", "calendarOpt", "radarOpt", "geoOpt", "regionObj", "timelineOpt", "item", "toolboxOpt", "featureOpt", "get", "opt", "path", "pathArr", "obj", "set", "val", "overwrite", "key", "i", "compatLayoutProperties", "option", "each", "LAYOUT_PROPERTIES", "prop", "COMPATITABLE_COMPONENTS", "BAR_ITEM_STYLE_MAP", "compatBarItemStyle", "itemStyle", "oldName", "newName", "compatPieLabel", "compatSunburstState", "compatGraphFocus", "traverseTree", "data", "cb", "globalBackwardCompat", "isTheme", "globalCompatStyle", "normalizeToArray", "seriesOpt", "isObject", "seriesType", "isTypedArray", "pointerColor", "highlightPolicy", "defaults", "componentName", "options", "isArray", "dataStack", "ecModel", "stackInfoMap", "createHashMap", "seriesModel", "stack", "stackInfoList", "data", "stackInfo", "firstSeries", "stackOrder", "each", "index", "calculateStack", "targetStackInfo", "idxInStack", "resultVal", "resultNaN", "dims", "targetData", "isStackedByIndex", "stackStrategy", "v0", "v1", "dataIndex", "sum", "byValue", "stackedDataRawIndex", "stackedOver", "j", "val", "addSafe", "SourceImpl", "fields", "SOURCE_FORMAT_KEYED_COLUMNS", "SOURCE_FORMAT_UNKNOWN", "SERIES_LAYOUT_BY_COLUMN", "dimensionsDefine", "i", "dim", "guessOrdinal", "BE_ORDINAL", "isSourceInstance", "val", "createSource", "sourceData", "thisMetaRawOption", "sourceFormat", "detectSourceFormat", "seriesLayoutBy", "determined", "determineSourceDimensions", "source", "clone", "createSourceFromSeriesDataOption", "data", "isTypedArray", "SOURCE_FORMAT_TYPED_ARRAY", "SOURCE_FORMAT_ORIGINAL", "cloneSourceShallow", "isArray", "SOURCE_FORMAT_ARRAY_ROWS", "len", "item", "isObject", "SOURCE_FORMAT_OBJECT_ROWS", "key", "hasOwn", "isArrayLike", "sourceHeader", "dimensionsDetectedCount", "startIndex", "normalizeDimensionsOption", "dataArrayRows", "arrayRowsTravelFirst", "isString", "isNumber", "index", "SERIES_LAYOUT_BY_ROW", "objectRowsCollectDimensions", "each", "colArr", "value0", "getDataItemValue", "firstIndex", "obj", "keys", "nameMap", "createHashMap", "map", "rawItem", "exist", "cb", "maxLoop", "shouldRetrieveDataByName", "_a", "_b", "_c", "_d", "providerMethods", "mountMethods", "DefaultDataProvider", "sourceParam", "dimSize", "source", "isSourceInstance", "createSourceFromSeriesDataOption", "data", "sourceFormat", "seriesLayoutBy", "SOURCE_FORMAT_TYPED_ARRAY", "validator", "idx", "out", "newData", "proto", "provider", "startIndex", "dimsDef", "methods", "getMethodMapKey", "extend", "getItemForTypedArray", "countForTypedArray", "fillStorageForTypedArray", "rawItemGetter", "getRawSourceItemGetter", "bind", "rawCounter", "getRawSourceDataCounter", "offset", "i", "start", "end", "storage", "extent", "dim", "dimExtent", "min", "max", "count", "arr", "val", "SOURCE_FORMAT_ARRAY_ROWS", "SERIES_LAYOUT_BY_COLUMN", "appendDataSimply", "SERIES_LAYOUT_BY_ROW", "SOURCE_FORMAT_OBJECT_ROWS", "SOURCE_FORMAT_KEYED_COLUMNS", "each", "newCol", "key", "oldCol", "SOURCE_FORMAT_ORIGINAL", "validateSimply", "rawData", "isArray", "error", "rawSourceDataValidatorMap", "_a", "SOURCE_FORMAT_ARRAY_ROWS", "SERIES_LAYOUT_BY_COLUMN", "SERIES_LAYOUT_BY_ROW", "SOURCE_FORMAT_OBJECT_ROWS", "SOURCE_FORMAT_KEYED_COLUMNS", "dimsDef", "i", "dimName", "SOURCE_FORMAT_ORIGINAL", "getItemSimply", "startIndex", "idx", "rawSourceItemGetterMap", "_b", "out", "item", "data", "row", "col", "getRawSourceItemGetter", "sourceFormat", "seriesLayoutBy", "method", "getMethodMapKey", "countSimply", "rawSourceDataCounterMap", "_c", "getRawSourceDataCounter", "getRawValueSimply", "dataItem", "dimIndex", "property", "rawSourceValueGetterMap", "_d", "value", "getDataItemValue", "SOURCE_FORMAT_TYPED_ARRAY", "getRawSourceValueGetter", "retrieveRawValue", "dataIndex", "dim", "store", "result", "DIMENSION_LABEL_REG", "DataFormatMixin", "dataIndex", "dataType", "data", "rawValue", "rawDataIndex", "name", "itemOpt", "style", "color", "borderColor", "mainType", "isSeries", "userOutput", "status", "labelDimIndex", "formatter", "extendParams", "params", "isArray", "itemModel", "isFunction", "isString", "str", "formatTpl", "origin", "dimStr", "len", "dimLoose", "val", "retrieveRawValue", "dimIndex", "idx", "multipleSeries", "normalizeTooltipFormatResult", "result", "markupText", "markupFragment", "isObject", "createTask", "define", "Task", "performArgs", "upTask", "skip", "context", "planResult", "lastModBy", "normalizeModBy", "lastModDataCount", "modBy", "modDataCount", "val", "forceFirstProgress", "step", "start", "end", "progress", "isArray", "i", "outputDueEnd", "iterator", "downstream", "downTask", "iterator", "end", "current", "modBy", "modDataCount", "winCount", "it", "s", "e", "sStep", "sCount", "modNext", "sequentialNext", "dataIndex", "result", "parseDataValue", "value", "opt", "dimType", "isNumber", "parseDate", "valueParserMap", "createHashMap", "val", "isString", "trim", "getRawValueParser", "type", "ORDER_COMPARISON_OP_MAP", "lval", "rval", "FilterOrderComparator", "op", "errMsg", "throwError", "numericToNumber", "SortOrderComparator", "order", "incomparable", "isDesc", "lvalFloat", "rvalFloat", "lvalNotNumeric", "rvalNotNumeric", "lvalIsStr", "rvalIsStr", "FilterEqualityComparator", "isEq", "rval", "numericToNumber", "lval", "eqResult", "lvalTypeof", "createFilterComparator", "op", "hasOwn", "ORDER_COMPARISON_OP_MAP", "FilterOrderComparator", "ExternalSource", "dataIndex", "dim", "dimIndex", "dataItem", "rawVal", "dimInfo", "parseDataValue", "createExternalSource", "internalSource", "externalTransform", "extSource", "ExternalSource", "data", "sourceFormat", "sourceHeaderCount", "errMsg", "SERIES_LAYOUT_BY_COLUMN", "throwError", "dimensions", "dimsByName", "dimsDef", "each", "dimDef", "idx", "name", "dimDefExt", "errMsg_1", "hasOwn", "i", "rawItemGetter", "getRawSourceItemGetter", "dataIndex", "bind", "getRawData", "cloneRawData", "rawCounter", "getRawSourceDataCounter", "rawValueGetter", "getRawSourceValueGetter", "dimIndex", "rawItem", "retrieveValueFromItem", "dataItem", "getDimensionInfo", "cloneAllDimensionInfo", "upstream", "isSupportedSourceFormat", "SOURCE_FORMAT_ARRAY_ROWS", "result", "len", "SOURCE_FORMAT_OBJECT_ROWS", "extend", "dim", "isNumber", "clone", "externalTransformMap", "createHashMap", "registerExternalTransform", "type", "typeParsed", "isBuiltIn", "applyDataTransform", "rawTransOption", "sourceList", "infoForPrint", "pipedTransOption", "normalizeToArray", "pipeLen", "transOption", "applySingleDataTransform", "upSourceList", "pipeIndex", "isObject", "transType", "extUpSourceList", "map", "upSource", "resultList", "printStrArr", "resultIndex", "detectSourceFormat", "resultMetaRawOption", "firstUpSource", "startIndex", "createSource", "UNDEFINED", "CtorUint32Array", "CtorUint16Array", "CtorInt32Array", "CtorFloat64Array", "dataCtors", "defaultDimValueGetters", "getIndicesCtor", "rawCount", "getInitialExtent", "cloneChunk", "originalChunk", "Ctor", "prepareStore", "store", "dimIdx", "dimType", "end", "append", "DataCtor", "oldStore", "oldLen", "newStore", "j", "DataStore", "createHashMap", "provider", "inputDimensions", "dimValueGetter", "source", "defaultGetter", "willRetrieveDataByName", "shouldRetrieveDataByName", "map", "dim", "dimName", "type", "calcDimNameToIdx", "dimensions", "calcDimIdx", "ordinalMeta", "chunk", "rawExtents", "offset", "len", "dimRawExtent", "i", "val", "dimInfo", "dimIndex", "item", "data", "start", "values", "minFillLen", "chunks", "dimLen", "rawExtent", "emptyDataItem", "idx", "sourceIdx", "dimNames", "dataItem", "dimStorage", "dimStore", "dimArr", "rawIdx", "dimData", "sum", "value", "dimDataArray", "sortedDimDataArray", "a", "b", "rawIndex", "indices", "rawDataIndex", "left", "right", "mid", "newIndices", "thisCount", "dims", "cb", "count", "dimSize", "dim0", "keep", "k", "range", "keys", "originalCount", "min", "max", "storeArr", "quickFinished", "dimStorage2", "min2", "max2", "val2", "dimk", "target", "targetChunks", "tmpRetValue", "dataCount", "dataIndex", "retValue", "rawExtentOnDim", "valueDimension", "rate", "targetStorage", "sampledIndex", "frameSize", "currentRawIndex", "maxArea", "area", "nextRawIndex", "nextFrameStart", "nextFrameEnd", "avgX", "avgY", "y", "frameStart", "frameEnd", "pointAX", "pointAY", "firstNaNIndex", "countNaN", "minIndex", "minValue", "maxIndex", "maxValue", "thisFrameSize", "rawMinIndex", "rawMaxIndex", "dimension", "sampleValue", "sampleIndex", "frameValues", "dataIdx", "sampleFrameIdx", "initialExtent", "currEnd", "useRaw", "dimExtent", "clonedDims", "ignoreIndices", "clonedDimsMap", "reduce", "obj", "clone", "getDimValueSimply", "property", "parseDataValue", "DataStore_default", "SourceManager", "sourceHost", "sourceList", "upstreamSignList", "upSourceMgrList", "hasUpstream", "resultSourceList", "isSeries", "seriesModel", "data", "sourceFormat", "upSource", "upSourceMgr", "isTypedArray", "SOURCE_FORMAT_TYPED_ARRAY", "SOURCE_FORMAT_ORIGINAL", "newMetaRawOption", "upMetaRawOption", "seriesLayoutBy", "retrieve2", "sourceHeader", "dimensions", "needsCreateSource", "createSource", "datasetModel", "result", "sourceData", "upMgrList", "transformOption", "fromTransformResult", "errMsg", "doThrow", "upSourceList", "each", "upMgr", "applyDataTransform", "cloneSourceShallow", "i", "upSrcMgr", "sourceIndex", "source", "seriesDimRequest", "schema", "storeDims", "seriesSource", "sourceReadKey", "storeList", "cachedStoreMap", "cachedStore", "DataStore_default", "DefaultDataProvider", "querySeriesUpstreamDatasetModel", "map", "queryDatasetUpstreamDatasetModels", "model", "disableTransformOptionMerge", "datasetModel", "transformOption", "setAsPrimitive", "isSeries", "sourceHost", "doThrow", "errMsg", "TOOLTIP_LINE_HEIGHT_CSS", "getTooltipLineHeight", "textStyle", "lineHeight", "encodeHTML", "getTooltipTextStyle", "renderMode", "nameFontColor", "tokens_default", "nameFontSize", "nameFontWeight", "valueFontColor", "valueFontSize", "valueFontWeight", "HTML_GAPS", "RICH_TEXT_GAPS", "createTooltipMarkup", "type", "option", "isSectionFragment", "frag", "getBuilder", "buildSection", "buildNameValue", "getBlockGapLevel", "gapLevel_1", "subBlockLen", "hasInnerGap_1", "each", "subBlock", "subGapLevel", "ctx", "fragment", "topMarginForOuterGap", "toolTipTextStyle", "noHeader", "gaps", "getGap", "subMarkupTextList", "subBlocks", "assert", "isArray", "orderMode", "orderMap", "hasOwn", "comparator_1", "SortOrderComparator", "a", "b", "idx", "valueFormatter", "subMarkupText", "extend", "wrapBlockHTML", "displayableHeader", "makeValueReadable", "nameStyle", "tooltipLineHeight", "wrapInlineNameRichText", "noName", "noValue", "noMarker", "name", "useUTC", "value", "map", "val", "valueTypeOption", "markerStr", "readableName", "readableValueList", "valueAlignRight", "valueCloseToMarker", "_a", "valueStyle", "wrapInlineValueRichText", "wrapInlineNameHTML", "wrapInlineValueHTML", "buildTooltipMarkup", "markupStyleCreator", "builder", "gapLevel", "encodedContent", "topGap", "clearfix", "marginCSS", "leftHasMarker", "style", "marginCss", "valueList", "alignRight", "paddingStr", "alignCSS", "values", "styles", "paddingLeft", "retrieveVisualColorForTooltipMarker", "series", "dataIndex", "color", "convertToColorString", "getPaddingFromTooltipModel", "model", "padding", "TooltipMarkupStyleCreator", "getRandomIdBase", "markerType", "colorStr", "markerId", "marker", "getTooltipMarker", "isString", "text", "finalStl", "stl", "styleName", "defaultSeriesFormatTooltip", "opt", "series", "dataIndex", "multipleSeries", "data", "tooltipDims", "tooltipDimLen", "value", "isValueArr", "isArray", "markerColor", "retrieveVisualColorForTooltipMarker", "inlineValue", "inlineValueType", "subBlocks", "sortParam", "formatArrResult", "formatTooltipArrayValue", "dimInfo", "retrieveRawValue", "seriesNameSpecified", "isNameSpecified", "seriesName", "itemName", "inlineName", "createTooltipMarkup", "trim", "colorStr", "isValueMultipleLine", "reduce", "val", "idx", "dimItem", "inlineValues", "inlineValueTypes", "blocks", "each", "dim", "setEachItem", "inner", "makeInner", "getSelectionKey", "data", "dataIndex", "SERIES_UNIVERSAL_TRANSITION_PROP", "SeriesModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "createTask", "dataTaskCount", "dataTaskReset", "sourceManager", "SourceManager", "wrapData", "autoSeriesName", "layoutMode", "fetchLayoutMode", "inputPositionParams", "getLayoutParams", "themeSubType", "Component_default", "merge", "defaultEmphasis", "mergeLayoutParam", "newSeriesOption", "isTypedArray", "props", "params", "dataType", "task", "getCurrentTask", "mainData", "context", "encode", "createHashMap", "colorBy", "coordSys", "axisDim", "dim", "value", "maxDistance", "axis", "targetCoord", "nearestIndices", "minDist", "minDiff", "nearestIndicesLen", "dimValue", "idx", "dataCoord", "diff", "dist", "multipleSeries", "defaultSeriesFormatTooltip", "env_default", "animationEnabled", "name", "scope", "requestColorNum", "color", "PaletteMixin", "coordDim", "innerDataIndices", "selectedMap", "selectedMode", "i", "nameOrId", "tmpArr", "selectedDataIndicesMap", "nameOrIds", "keys", "dataIndices", "universalTransitionOpt", "_a", "_b", "len", "isObject", "lastDataIndex", "rawItem", "clz", "proto", "mixin", "DataFormatMixin", "mountExtend", "seriesModel", "isNameSpecified", "getSeriesAutoName", "dataDims", "nameArr", "each", "dataDim", "dimInfo", "dataTaskProgress", "param", "concatArray", "methodName", "curry", "onDataChange", "newList", "scheduler", "pipeline", "agentStubMap", "Series_default", "ComponentView", "Group_default", "getUID", "ecModel", "api", "model", "payload", "seriesModels", "isBlur", "cb", "group", "enableClassExtend", "enableClassManagement", "Component_default", "createRenderPlanner", "inner", "makeInner", "seriesModel", "fields", "pipelineContext", "originalLarge", "originalProgressive", "large", "progressive", "inner", "makeInner", "renderPlanner", "createRenderPlanner", "ChartView", "Group_default", "getUID", "createTask", "renderTaskPlan", "renderTaskReset", "ecModel", "api", "seriesModel", "payload", "data", "toggleHighlight", "cb", "traverseElements", "methodName", "proto", "elSetState", "el", "state", "highlightDigit", "isHighDownDispatcher", "enterEmphasis", "leaveEmphasis", "dataIndex", "queryDataIndex", "getHighlightDigit", "each", "normalizeToArray", "dataIdx", "enableClassExtend", "enableClassManagement", "context", "progressiveRender", "view", "updateMethod", "progressMethodMap", "params", "Chart_default", "ORIGIN_METHOD", "RATE", "THROTTLE_TYPE", "throttle", "fn", "delay", "debounce", "currCall", "lastCall", "lastExec", "timer", "diff", "scope", "args", "debounceNextCall", "exec", "cb", "cbArgs", "_i", "thisDelay", "thisDebounce", "debounceDelay", "createOrUpdate", "obj", "fnAttr", "rate", "throttleType", "originFn", "lastThrottleType", "lastRate", "clear", "inner", "makeInner", "defaultStyleMappers", "makeStyleMapper", "ITEM_STYLE_KEY_MAP", "LINE_STYLE_KEY_MAP", "defaultColorKey", "getStyleMapper", "seriesModel", "stylePath", "styleMapper", "getDefaultColorKey", "colorKey", "seriesStyleTask", "ecModel", "data", "styleModel", "getStyle", "globalStyle", "decalOption", "color", "colorCallback", "isFunction", "hasAutoColor", "colorPalette", "idx", "dataParams", "itemStyle", "extend", "sharedModel", "Model_default", "dataStyleTask", "rawItem", "style", "existsStyle", "dataColorPaletteTask", "paletteScopeGroupByType", "createHashMap", "colorBy", "key", "colorScope", "dataAll", "idxMap", "rawIdx", "fromPalette", "name_1", "dataCount", "PI", "defaultLoading", "api", "opts", "defaults", "tokens_default", "group", "Group_default", "mask", "Rect_default", "textContent", "Text_default", "labelRect", "arc", "Arc_default", "textWidth", "r", "cx", "cy", "Scheduler", "ecInstance", "api", "dataProcessorHandlers", "visualHandlers", "createHashMap", "ecModel", "payload", "taskRecord", "overallTask", "task", "isBlock", "pipeline", "pCtx", "incremental", "step", "modDataCount", "modBy", "pipelineId", "seriesModel", "view", "data", "dataLen", "progressiveRender", "large", "scheduler", "pipelineMap", "progressive", "stageTaskMap", "each", "handler", "record", "errMsg", "assert", "model", "renderTask", "context", "opt", "stageHandlers", "unfinished", "stageHandler", "idx", "stageHandlerRecord", "seriesTaskMap", "overallNeedDirty_1", "agentStubMap", "stub", "needSetDirty", "performArgs_1", "performArgs", "oldSeriesTaskMap", "newSeriesTaskMap", "seriesType", "getTargetSeries", "create", "createTask", "seriesTaskPlan", "seriesTaskReset", "seriesTaskCount", "overallTaskReset", "oldAgentStubMap", "newAgentStubMap", "overallProgress", "shouldOverallTaskDirty", "createStub", "stubReset", "stubOnDirty", "visualType", "isFunction", "detectSeriseType", "getUID", "stubProgress", "resetDefines", "normalizeToArray", "map", "v", "makeSeriesTaskProgress", "singleSeriesTaskProgress", "resetDefineIdx", "params", "resetDefine", "i", "legacyFunc", "ecModelMock", "apiMock", "mockMethods", "Global_default", "ExtensionAPI_default", "type", "cond", "target", "Clz", "name_1", "noop", "Scheduler_default", "color", "tokens_default", "backgroundColor", "axisCommon", "matrixAxis", "theme", "radar", "dark_default", "ECEventProcessor", "query", "cptQuery", "dataQuery", "otherQuery", "isString", "condCptType", "parseClassType", "suffixes_1", "dataKeys_1", "each", "val", "key", "reserved", "i", "propSuffix", "suffixPos", "mainType", "eventType", "eventInfo", "targetEl", "packedEvent", "model", "view", "check", "host", "prop", "propOnHost", "SYMBOL_PROPS_WITH_CB", "SYMBOL_PROPS", "seriesSymbolTask", "seriesModel", "ecModel", "data", "symbolOptions", "symbolOptionsCb", "hasCallback", "i", "symbolPropName", "val", "isFunction", "extend", "symbolPropsCb", "keys", "dataEach", "idx", "rawValue", "params", "dataSymbolTask", "itemModel", "getItemVisualFromData", "data", "dataIndex", "key", "style", "getVisualFromData", "setItemVisualFromData", "value", "createLegacyDataSelectAction", "seriesType", "ecRegisterAction", "getSeriesIndices", "ecModel", "payload", "seriesIndices", "seriesModel", "each", "eventsMap", "api", "extend", "handleSeriesLegacySelectEvents", "type", "eventPostfix", "ecIns", "legacyEventName", "seriesIndex", "selectedMap", "selected", "i", "data", "dataIndex", "queryDataIndex", "isArray", "isString", "handleLegacySelectEvents", "messageCenter", "params", "findEventDispatcher", "target", "det", "returnFirstMatch", "found", "wmUniqueIndex", "supportDefineProperty", "WeakMap", "key", "value", "target", "WeakMap_default", "Triangle", "Path_default", "path", "shape", "cx", "cy", "width", "height", "Diamond", "Pin", "x", "y", "w", "h", "r", "dy", "angle", "dx", "tanX", "tanY", "cpLen", "cpLen2", "Arrow", "ctx", "symbolCtors", "Line_default", "Rect_default", "Circle_default", "symbolShapeMakers", "size", "symbolBuildProxies", "each", "Ctor", "name", "SymbolClz", "out", "config", "rect", "res", "calculateTextPosition", "inBundle", "symbolType", "proxySymbol", "symbolPathSetColor", "color", "innerColor", "symbolStyle", "tokens_default", "createSymbol", "keepAspect", "isEmpty", "symbolPath", "makeImage", "BoundingRect_default", "makePath", "normalizeSymbolSize", "symbolSize", "isArray", "normalizeSymbolOffset", "symbolOffset", "parsePercent", "retrieve2", "isSafeNum", "num", "createLinearGradient", "ctx", "obj", "rect", "x", "x2", "y", "y2", "canvasGradient", "createRadialGradient", "width", "height", "min", "r", "getCanvasGradient", "colorStops", "i", "isClipPathChanged", "clipPaths", "prevClipPaths", "parseInt10", "val", "getSize", "root", "whIdx", "opts", "wh", "cwh", "plt", "prb", "stl", "normalizeLineDash", "lineType", "lineWidth", "isNumber", "isArray", "getLineDash", "el", "style", "lineDash", "lineDashOffset", "lineScale_1", "map", "rawVal", "pathProxyForDraw", "PathProxy_default", "styleHasStroke", "style", "stroke", "isValidStrokeFillStyle", "strokeOrFill", "styleHasFill", "fill", "doFillPath", "ctx", "originalGlobalAlpha", "doStrokePath", "createCanvasPattern", "pattern", "el", "image", "createOrUpdateImage", "isImageReady", "canvasPattern", "matrix", "RADIAN_TO_DEGREE", "brushPath", "inBatch", "_a", "hasStroke", "hasFill", "strokePercent", "strokePart", "firstDraw", "path", "dirtyFlag", "hasFillGradient", "hasStrokeGradient", "hasFillPattern", "hasStrokePattern", "fillGradient", "strokeGradient", "fillPattern", "strokePattern", "rect", "getCanvasGradient", "scale", "lineDash", "lineDashOffset", "getLineDash", "needsRebuild", "SHAPE_CHANGED_BIT", "brushImage", "x", "y", "width", "height", "aspect", "sx", "sy", "sWidth", "sHeight", "brushText", "text", "DEFAULT_FONT", "SHADOW_NUMBER_PROPS", "STROKE_PROPS", "bindCommonProps", "prevStyle", "forceSetAll", "scope", "styleChanged", "flushPathDrawn", "opacity", "DEFAULT_COMMON_STYLE", "i", "propName", "bindPathAndTextCommonStyle", "prevEl", "getStyle", "lineWidth", "newLineWidth", "prop", "bindImageStyle", "setContextTransform", "m", "dpr", "updateClipStatus", "clipPaths", "allClipped", "clipPath", "isTransformChanged", "m0", "m1", "DRAW_TYPE_PATH", "DRAW_TYPE_IMAGE", "DRAW_TYPE_TEXT", "DRAW_TYPE_INCREMENTAL", "canPathBatch", "inHover", "brushSingle", "brush", "isLast", "REDRAW_BIT", "prevElClipPaths", "forceSetTransform", "forceSetStyle", "isClipPathChanged", "canBatchPath", "Path_default", "TSpan_default", "Image_default", "brushIncremental", "displayables", "temporalDisplayables", "innerScope", "len", "displayable", "i_1", "len_1", "decalMap", "WeakMap_default", "decalCache", "LRU_default", "decalKeys", "createOrUpdatePatternFromDecal", "decalObject", "api", "dpr", "zr", "isSVG", "oldPattern", "decalOpt", "defaults", "pattern", "setPatternnSource", "keys", "isValidKey", "i", "value", "isArray", "isString", "isNumber", "cacheKey", "cache", "dashArrayX", "normalizeDashArrayX", "dashArrayY", "normalizeDashArrayY", "symbolArray", "normalizeSymbolArray", "lineBlockLengthsX", "getLineBlockLengthX", "lineBlockLengthY", "getLineBlockLengthY", "canvas", "platformApi", "svgRoot", "pSize", "getPatternSize", "ctx", "brushDecal", "width", "xlen", "getLeastCommonMultiple", "symbolRepeats", "height", "warn", "ySum", "y", "yId", "yIdTotal", "xId0", "symbolYId", "x", "xId1", "xId1Total", "xSum", "size", "left", "top_1", "symbolXId", "brushSymbol", "symbolType", "scale", "symbol", "createSymbol", "symbolVNode", "brushSingle", "isAllString", "result", "dash", "dashValue", "isAllNumber", "map", "n", "dashValue_1", "line", "blockLength", "decalVisual", "ecModel", "api", "seriesModel", "data", "idx", "decal", "itemStyle", "createOrUpdatePatternFromDecal", "style", "lifecycle", "Eventful_default", "lifecycle_default", "implsStore", "registerImpl", "name", "impl", "getImpl", "customRenderers", "registerCustomSeries", "type", "renderItem", "getCustomSeries", "TEST_FRAME_REMAIN_TIME", "PRIORITY_PROCESSOR_SERIES_FILTER", "PRIORITY_PROCESSOR_DATASTACK", "PRIORITY_PROCESSOR_FILTER", "PRIORITY_PROCESSOR_DEFAULT", "PRIORITY_PROCESSOR_STATISTIC", "PRIORITY_VISUAL_LAYOUT", "PRIORITY_VISUAL_PROGRESSIVE_LAYOUT", "PRIORITY_VISUAL_GLOBAL", "PRIORITY_VISUAL_CHART", "PRIORITY_VISUAL_COMPONENT", "PRIORITY_VISUAL_CHART_DATA_CUSTOM", "PRIORITY_VISUAL_POST_CHART_LAYOUT", "PRIORITY_VISUAL_BRUSH", "PRIORITY_VISUAL_ARIA", "PRIORITY_VISUAL_DECAL", "PRIORITY", "IN_MAIN_PROCESS_KEY", "MAIN_PROCESS_VERSION_KEY", "PENDING_UPDATE", "STATUS_NEEDS_UPDATE_KEY", "ACTION_REG", "CONNECT_STATUS_KEY", "CONNECT_STATUS_PENDING", "CONNECT_STATUS_UPDATING", "CONNECT_STATUS_UPDATED", "createRegisterEventWithLowercaseECharts", "method", "args", "_i", "toLowercaseNameAndCallEventful", "createRegisterEventWithLowercaseMessageCenter", "host", "Eventful_default", "MessageCenter", "_super", "__extends", "messageCenterProto", "prepare", "prepareView", "updateDirectly", "updateMethods", "doConvertPixel", "updateStreamModes", "doDispatchAction", "flushPendingActions", "triggerUpdatedEvent", "bindRenderedEvent", "bindMouseEvent", "render", "renderComponents", "renderSeries", "createExtensionAPI", "enableConnect", "markStatusToUpdate", "applyChangedStates", "updateMainProcessVersion", "ECharts", "dom", "theme", "opts", "_this", "ECEventProcessor", "defaultRenderer", "defaultCoarsePointer", "defaultUseDirtyRect", "root", "registerSSRDataGetter", "el", "ecData", "getECData", "dataIndex", "hashMap", "createHashMap", "zr", "init", "retrieve2", "throttle", "bind", "createLocaleObject", "SYSTEM_LANG", "CoordinateSystem_default", "api", "prioritySortFunc", "a", "b", "sort", "visualFuncs", "dataProcessorFuncs", "Scheduler_default", "setAsPrimitive", "scheduler", "silent", "e", "remainTime", "ecModel", "startTime", "option", "notMerge", "lazyUpdate", "replaceMerge", "transitionOpt", "isObject", "optionManager", "OptionManager_default", "Global_default", "optionPreprocessorFuncs", "updateParams", "isString", "themeStorage", "clone", "globalBackwardCompat", "env_default", "painter", "list", "each", "excludeComponents", "excludesComponentViews", "self", "componentType", "component", "view", "url", "isSvg", "groupId", "mathMin", "mathMax", "MAX_NUMBER", "connectedGroups", "left_1", "top_1", "right_1", "bottom_1", "canvasList_1", "dpr_1", "instances", "chart", "id", "canvas", "boundingRect", "width", "height", "targetCanvas", "platformApi", "zr_1", "content_1", "item", "x", "y", "Rect_default", "img", "Image_default", "finder", "value", "opt", "result", "findResult", "parseFinder", "models", "key", "model", "coordSys", "visualType", "parsedFinder", "seriesModel", "data", "dataIndexInside", "getItemVisualFromData", "getVisualFromData", "componentModel", "MOUSE_EVENT_NAMES", "eveName", "handler", "params", "isGlobalOut", "findEventDispatcher", "parent", "dataModel", "extend", "componentIndex", "messageCenter", "publicEventTypeMap", "_", "eventType", "event", "handleLegacySelectEvents", "setAttribute", "DOM_ATTRIBUTE_KEY", "needPrepare", "name", "cfg", "loadingEffects", "eventObj", "payload", "connectionEventRevertMap", "actions", "flush", "lifecycle_default", "seriesIndex", "ecIns", "isComponent", "viewList", "viewMap", "i", "doPrepare", "requireNewView", "viewId", "classType", "parseClassType", "Clazz", "Component_default", "Chart_default", "mainType", "subType", "callView", "query", "condition", "excludeSeriesId", "excludeSeriesIdMap", "normalizeToArray", "modelId", "convertOptionIdName", "isExcluded", "isHighDownPayload", "Series_default", "HIGHLIGHT_ACTION_TYPE", "blurSeriesFromHighlightPayload", "_a", "findComponentHighDownDispatchers", "focusSelf", "dispatchers", "blurComponent", "dispatcher", "enterEmphasis", "leaveEmphasis", "isSelectChangePayload", "toggleSelectionFromPayload", "updateSeriesElementSelection", "coordSysMgr", "clearColorPalette", "backgroundColor", "darkMode", "componentDirtyList", "componentView", "seriesDirtyMap", "chartView", "doConvertPixelImpl", "methodName", "coordSysList", "chartsMap", "payloadType", "escapeConnect", "actionInfo", "cptTypeTmp", "updateMethod", "cptType", "payloads", "batched", "map", "defaults", "eventObjBatch", "actionResultBatch", "nonRefinedEventType", "isSelectChange", "isHighDown", "allLeaveBlur", "batchItem", "actionResult", "preParseFinder", "queryOptionMap", "mainTypeSpecified", "componentMainType", "refinedEvent", "eventContent", "assert", "pendingActions", "isHighDownDispatcher", "handleGlobalMouseOverForHighDown", "handleGlobalMouseOutForHighDown", "target", "actionType", "allocateZlevels", "componentZLevels", "seriesZLevels", "hasSeparateZLevel", "zlevel", "z", "zlevelKey", "zLevels", "lastSeriesZLevel_1", "lastSeriesKey_1", "dirtyList", "clearStates", "updateZ", "updateStates", "dirtyMap", "unfinished", "renderTask", "updateBlend", "updateHoverLayerStatus", "isElementRemoved", "applyElementStates", "newStates", "oldStates", "stateName", "HOVER_STATE_EMPHASIS", "HOVER_STATE_BLUR", "storage", "elCount", "blendMode", "zInfo", "retrieveZInfo", "traverseUpdateZ", "textContent", "textGuide", "stateAnimationModel", "enableAnimation", "duration", "stateTransition", "Path_default", "savePathStates", "prevStates", "class_1", "modelInfo", "highlightDigit", "enterBlur", "leaveBlur", "enterSelect", "leaveSelect", "ExtensionAPI_default", "updateConnectedChartsStatus", "charts", "status", "otherChart", "action_1", "otherCharts_1", "echartsProto", "eventName", "cb", "ctx", "wrapped", "args2", "actions", "connectionEventRevertMap", "publicEventTypeMap", "dataProcessorFuncs", "optionPreprocessorFuncs", "visualFuncs", "themeStorage", "loadingEffects", "instances", "connectedGroups", "idBase", "groupIdBase", "DOM_ATTRIBUTE_KEY", "init", "dom", "theme", "opts", "isClient", "existInstance", "getInstanceByDom", "chart", "ECharts", "setAttribute", "enableConnect", "lifecycle_default", "getInstanceByDom", "dom", "instances", "getAttribute", "DOM_ATTRIBUTE_KEY", "registerTheme", "name", "theme", "themeStorage", "registerPreprocessor", "preprocessorFunc", "indexOf", "optionPreprocessorFuncs", "registerProcessor", "priority", "processor", "normalizeRegister", "dataProcessorFuncs", "PRIORITY_PROCESSOR_DEFAULT", "registerPostInit", "postInitFunc", "registerUpdateLifecycle", "registerPostUpdate", "postUpdateFunc", "cb", "lifecycle_default", "registerAction", "arg0", "arg1", "action", "actionType", "publicEventType", "refineEvent", "update", "publishNonRefinedEvent", "isFunction", "isObject", "createEventType", "actionOrEventType", "nonRefinedEventType", "actions", "assert", "ACTION_REG", "publicEventTypeMap", "connectionEventRevertMap", "registerCoordinateSystem", "type", "coordSysCreator", "CoordinateSystem_default", "registerLayout", "priority", "layoutTask", "normalizeRegister", "visualFuncs", "PRIORITY_VISUAL_LAYOUT", "registerVisual", "visualTask", "PRIORITY_VISUAL_CHART", "registeredTasks", "normalizeRegister", "targetList", "priority", "fn", "defaultPriority", "visualType", "isFunction", "isObject", "indexOf", "stageHandler", "Scheduler_default", "registerLoading", "name", "loadingFx", "loadingEffects", "registerMap", "mapName", "geoJson", "specialAreas", "getImpl", "registerTransform", "registerExternalTransform", "registerVisual", "PRIORITY_VISUAL_GLOBAL", "seriesStyleTask", "PRIORITY_VISUAL_CHART_DATA_CUSTOM", "dataStyleTask", "dataColorPaletteTask", "seriesSymbolTask", "dataSymbolTask", "PRIORITY_VISUAL_DECAL", "decalVisual", "registerPreprocessor", "globalBackwardCompat", "registerProcessor", "PRIORITY_PROCESSOR_DATASTACK", "dataStack", "registerLoading", "defaultLoading", "registerAction", "HIGHLIGHT_ACTION_TYPE", "noop", "DOWNPLAY_ACTION_TYPE", "SELECT_ACTION_TYPE", "SELECT_CHANGED_EVENT_TYPE", "makeSelectChangedEvent", "UNSELECT_ACTION_TYPE", "TOGGLE_SELECT_ACTION_TYPE", "actionResultBatch", "payload", "ecModel", "api", "getAllSelectedIndices", "registerTheme", "dark_default", "extensions", "extensionRegisters", "registerPreprocessor", "registerProcessor", "registerPostInit", "registerPostUpdate", "registerUpdateLifecycle", "registerAction", "registerCoordinateSystem", "registerLayout", "registerVisual", "registerTransform", "registerLoading", "registerMap", "registerImpl", "PRIORITY", "Component_default", "Series_default", "Chart_default", "ComponentModelClass", "ComponentViewClass", "SeriesModelClass", "ChartViewClass", "seriesType", "renderItem", "registerCustomSeries", "componentType", "defaulter", "painterType", "PainterCtor", "registerPainter", "use", "ext", "isArray", "each", "singleExt", "indexOf", "isFunction", "dataIndexMapValueLength", "valNumOrArrLengthMoreThan2", "defaultKeyGetter", "item", "DataDiffer", "oldArr", "newArr", "oldKeyGetter", "newKeyGetter", "context", "diffMode", "func", "newDataIndexMap", "oldDataKeyArr", "newDataKeyArr", "i", "oldKey", "newIdxMapVal", "newIdxMapValLen", "newIdx", "oldDataIndexMap", "oldIdxMapVal", "oldIdxMapValLen", "i_1", "newKey", "idxMapValLen", "j", "arr", "map", "keyArr", "keyGetterName", "cbModeMultiple", "key", "idxMapVal", "DataDiffer_default", "DimensionUserOuput", "encode", "dimRequest", "summarizeDimensions", "data", "schema", "summary", "notExtraCoordDimMap", "createHashMap", "defaultedLabel", "defaultedTooltip", "userOutputEncode", "each", "dimName", "dimItem", "coordDim", "coordDimIndex", "getOrCreateEncodeArr", "mayLabelDimType", "VISUAL_DIMENSIONS", "v", "otherDim", "encodeArr", "dimIndex", "dataDimsOnCoord", "encodeFirstDimNotExtra", "dimArr", "map", "encodeLabel", "encodeTooltip", "dim", "getDimensionTypeByAxis", "axisType", "dimType", "SeriesDimensionDefine", "opt", "extend", "SeriesDimensionDefine_default", "inner", "makeInner", "dimTypeShort", "SeriesDataSchema", "opt", "dimensionOmitted", "ensureSourceDimNameMap", "dimName", "retrieve2", "dimIndex", "dimensionsDefine", "dimCount", "willRetrieveDataByName", "shouldRetrieveDataByName", "makeHashStrict", "shouldOmitUnusedDimensions", "dimHash", "dims", "fullDimIdx", "seriesDimIdx", "property", "type", "ordinalMeta", "seriesDimDef", "sourceDimDef", "source", "hash", "result", "name_1", "dimDef", "isSeriesDataSchema", "schema", "SeriesDataSchema", "createDimNameMap", "dimsDef", "dataDimNameMap", "createHashMap", "i", "dimDefItemRaw", "userDimName", "isObject", "ensureSourceDimNameMap", "source", "innerSource", "inner", "shouldOmitUnusedDimensions", "dimCount", "isObject", "map", "CtorInt32Array", "ID_PREFIX", "INDEX_NOT_FOUND", "TRANSFERABLE_PROPERTIES", "CLONE_PROPERTIES", "prepareInvertedIndex", "getId", "getIdNameFromStore", "normalizeDimensions", "transferProperties", "cloneListForMapAndSample", "makeIdFromName", "SeriesData", "dimensionsInput", "hostModel", "dimensions", "assignStoreDimIdx", "isSeriesDataSchema", "dimensionInfos", "dimensionNames", "invertedIndicesMap", "needsHasOwn", "emptyObj", "i", "dimInfoInput", "dimensionInfo", "isString", "SeriesDimensionDefine_default", "dimensionName", "otherDims", "dimIdx", "isNumber", "dimIdxToName_1", "createHashMap", "each", "dimName", "dim", "sourceDimDef", "dimInfo", "coordDim", "idx", "dimensionsSummary", "dims", "data", "nameList", "dimValueGetter", "_this", "store", "DataStore_default", "provider", "isSourceInstance", "isArrayLike", "DefaultDataProvider", "summarizeDimensions", "range", "values", "names", "_a", "start", "end", "shouldMakeIdFromName", "sourceIdx", "SOURCE_FORMAT_TYPED_ARRAY", "idList", "sourceFormat", "isFormatOriginal", "SOURCE_FORMAT_ORIGINAL", "sharedDataItem", "dataItem", "isDataItemOption", "itemName", "convertOptionIdName", "itemId", "extent", "key", "value", "extend", "rawIndex", "name", "ordinal", "ordinalMeta", "rawIdx", "isArray", "dataDimIndicesOnCoord", "len", "invertedIndices", "cb", "ctx", "isFunction", "fCtx", "dimIndices", "bind", "innerRange", "keys", "result", "ctxCompat", "list", "dimension", "rate", "sampleValue", "sampleIndex", "valueDimension", "Model_default", "otherList", "thisList", "DataDiffer_default", "visual", "kvObj", "val", "itemVisual", "itemVisuals", "layout", "merge", "el", "seriesIndex", "setCommonECData", "context", "methodName", "injectFunction", "originalMethod", "res", "slice", "id", "original", "target", "source", "propName", "clone", "nameDimIdx", "idDimIdx", "nameRepeatCount", "nmCnt", "SeriesData_default", "prepareSeriesDataSchema", "source", "opt", "isSourceInstance", "createSourceFromSeriesDataOption", "sysDims", "dimsDef", "coordDimNameMap", "createHashMap", "resultList", "dimCount", "getDimCount", "omitUnusedDimensions", "shouldOmitUnusedDimensions", "isUsingSourceDimensionsDef", "dataDimNameMap", "ensureSourceDimNameMap", "createDimNameMap", "encodeDef", "encodeDefMap", "indicesMap", "CtorInt32Array", "i", "getResultItem", "dimIdx", "idx", "dimDefItemRaw", "dimDefItem", "isObject", "resultItem", "SeriesDimensionDefine_default", "userDimName", "newIdx", "dataDimsRaw", "coordDim", "dataDims", "normalizeToArray", "isString", "validDataDims", "each", "resultDimIdxOrName", "resultDimIdx", "applyDim", "availDimIdx", "sysDimItemRaw", "sysDimItemDimsDef", "sysDimItemOtherDims", "sysDimItem", "ordinalMeta", "extend", "coordDimIndex", "defaults", "sysDimItemDimsDefItem", "VISUAL_DIMENSIONS", "generateCoord", "generateCoordCount", "fromZero", "extra", "ifNoNameFillWithCoordName", "item0", "item1", "genCoordDimName", "guessOrdinal", "BE_ORDINAL", "removeDuplication", "SeriesDataSchema", "result", "duplicationMap", "dim", "dimOriginalName", "count", "optDimCount", "name", "map", "CoordSysInfo", "coordSysName", "createHashMap", "getCoordSysInfoBySeries", "seriesModel", "result", "fetch", "fetchers", "axisMap", "categoryAxisMap", "xAxisModel", "SINGLE_REFERRING", "yAxisModel", "isCategory", "singleAxisModel", "polarModel", "radiusAxisModel", "angleAxisModel", "ecModel", "parallelModel", "coordSysDims", "each", "axisIndex", "index", "axisModel", "axisDim", "matrixModel", "xModel", "yModel", "enableDataStack", "seriesModel", "dimensionsInput", "opt", "byIndex", "stackedCoordDimension", "dimensionDefineList", "schema", "store", "isLegacyDimensionsInput", "mayStack", "stackedByDimInfo", "stackedDimInfo", "stackResultDimension", "stackedOverDimension", "each", "dimensionInfo", "index", "isString", "stackedDimCoordDim_1", "stackedDimType", "stackedDimCoordIndex_1", "stackedOverDimensionDefine", "stackResultDimensionDefine", "isSeriesDataSchema", "isDimensionStacked", "data", "stackedDim", "getStackedDimension", "targetDim", "getCoordSysDimDefs", "seriesModel", "coordSysInfo", "coordSysName", "registeredCoordSys", "CoordinateSystem_default", "coordSysDimDefs", "map", "dim", "dimInfo", "axisModel", "axisType", "getDimensionTypeByAxis", "injectOrdinalMeta", "dimInfoList", "createInvertedIndices", "firstCategoryDimIndex", "hasNameEncode", "each", "dimIndex", "coordDim", "categoryAxisModel", "createSeriesData", "sourceRaw", "opt", "sourceManager", "source", "isOriginalSource", "createSourceFromSeriesDataOption", "SOURCE_FORMAT_ORIGINAL", "getCoordSysInfoBySeries", "useEncodeDefaulter", "encodeDefaulter", "isFunction", "curry", "makeSeriesEncodeForAxisCoordSys", "createDimensionOptions", "schema", "prepareSeriesDataSchema", "store", "stackCalculationInfo", "enableDataStack", "data", "SeriesData_default", "dimValueGetter", "isNeedCompleteOrdinalData", "itemOpt", "dimName", "dataIndex", "sampleItem", "firstDataNotNull", "isArray", "getDataItemValue", "arr", "i", "createSeriesData_default", "isIntervalOrLogScale", "scale", "intervalScaleNiceTicks", "extent", "spanWithBreaks", "splitNumber", "minInterval", "maxInterval", "result", "interval", "nice", "precision", "getIntervalPrecision", "niceTickExtent", "round", "fixExtent", "increaseInterval", "exp10", "quantityExponent", "f", "getPrecision", "clamp", "idx", "contain", "val", "ScaleCalculator", "normalize", "brkCtx", "bind", "normalize", "val", "extent", "scale", "logTransform", "base", "noClampNegative", "loggedBase", "Scale", "setting", "ScaleCalculator", "scaleBreakHelper", "getScaleBreakHelper", "name", "other", "extent", "data", "dim", "start", "end", "thisExtent", "breakOptionList", "bind", "parsed", "value", "isBlank", "enableClassManagement", "Scale_default", "uidBase", "OrdinalMeta", "opt", "axisModel", "option", "data", "categories", "map", "getName", "category", "index", "needCollect", "isString", "createHashMap", "obj", "isObject", "OrdinalMeta_default", "OrdinalScale", "_super", "__extends", "setting", "_this", "ordinalMeta", "OrdinalMeta_default", "isArray", "map", "item", "isObject", "val", "isString", "contain", "ticks", "extent", "rank", "splitNumber", "info", "infoOrdinalNumbers", "ordinalsByTick", "ticksByOrdinal", "tickNum", "allCategoryLen", "len", "ordinalNumber", "unusedOrdinal", "ordinal", "ticksByOrdinalNumber", "tickNumber", "ordinalNumbersByTick", "tick", "cateogry", "value", "Scale_default", "Ordinal_default", "roundNumber", "round", "IntervalScale", "_super", "__extends", "_this", "val", "contain", "interval", "getIntervalPrecision", "opt", "extent", "niceTickExtent", "intervalPrecision", "scaleBreakHelper", "getScaleBreakHelper", "ticks", "safeLimit", "estimateNiceMultiple", "tickVal", "targetTick", "tick", "moreMultiple", "lastNiceTick", "item", "splitNumber", "minorTicks", "i", "nextTick", "prevTick", "count", "minorTicksGroup", "minorInterval", "minorIntervalPrecision", "minorTick", "value", "data", "precision", "getPrecision", "dataNum", "addCommas", "minInterval", "maxInterval", "span", "result", "intervalScaleNiceTicks", "expandSize", "intervalPrecition", "min", "max", "Scale_default", "Interval_default", "supportFloat32Array", "Float32ArrayCtor", "createFloat32Array", "arg", "isArray", "STACK_PREFIX", "getSeriesStackId", "seriesModel", "getAxisKey", "axis", "getLayoutOnAxis", "opt", "params", "baseAxis", "axisKey", "bandWidth", "i", "defaults", "widthAndOffsets", "doCalBarWidthAndOffset", "result", "item", "prepareLayoutBarSeries", "seriesType", "ecModel", "seriesModels", "isOnCartesian", "getValueAxesMinGaps", "barSeries", "axisValues", "each", "cartesian", "data", "key", "dimIdx", "store", "cnt", "value", "axisMinGaps", "valuesInAxis", "a", "b", "min", "j", "delta", "makeColumnLayout", "seriesInfoList", "axisExtent", "minGap", "extentSpan", "scale", "scaleSpan", "barWidth", "parsePercent", "barMaxWidth", "barMinWidth", "isInLargeMode", "barGap", "barCategoryGap", "defaultBarGap", "columnsMap", "seriesInfo", "idx", "columnsOnAxis", "stacks", "stackId", "coordSysName", "categoryGapPercent", "columnCount", "keys", "categoryGap", "barGapPercent", "remainedWidth", "autoWidthCount", "autoWidth", "column", "maxWidth", "minWidth", "finalWidth", "widthSum", "lastColumn", "offset", "retrieveColumnLayout", "barWidthAndOffset", "layout", "seriesType", "ecModel", "seriesModels", "prepareLayoutBarSeries", "barWidthAndOffset", "makeColumnLayout", "each", "seriesModel", "data", "cartesian", "baseAxis", "stackId", "getSeriesStackId", "columnLayoutInfo", "getAxisKey", "columnOffset", "columnWidth", "createProgressiveLayout", "createRenderPlanner", "isOnCartesian", "valueAxis", "valueDimIdx", "baseDimIdx", "drawBackground", "valueDim", "stackResultDim", "stacked", "isDimensionStacked", "isValueAxisH", "valueAxisStart", "getValueAxisStart", "isLarge", "isInLargeMode", "barMinHeight", "stackedDimIdx", "params", "count", "largePoints", "createFloat32Array", "largeBackgroundPoints", "largeDataIndices", "coordLayout", "bgSize", "dataIndex", "store", "idxOffset", "value", "baseValue", "baseCoord", "stackStartValue", "x", "y", "width", "height", "coord", "startCoord", "startValue", "bisect", "a", "x", "lo", "hi", "mid", "TimeScale", "_super", "__extends", "settings", "_this", "tick", "useUTC", "format", "fullLeveledFormatter", "getDefaultFormatPrecisionOfInterval", "getPrimaryTimeUnit", "idx", "labelFormatter", "isUTC", "lang", "leveledFormat", "opt", "interval", "extent", "scaleBreakHelper", "getScaleBreakHelper", "ticks", "extent0Unit", "getUnitFromValue", "innerTicks", "getIntervalTicks", "extent1Unit", "upperUnitIndex", "primaryTimeUnits", "maxLevel", "each", "indexOf", "item", "trimmedBrk", "lowerBrkUnitIndex", "upperBrkUnitIndex", "unitIdx", "isPrimaryUnitValueAndGreaterSame", "upperIdx", "lowerIdx", "ONE_DAY", "d", "approxTickNum", "minInterval", "maxInterval", "span", "scaleIntervalsLen", "scaleIntervals", "getIntervalPrecision", "val", "isNumber", "parseDate", "contain", "Interval_default", "ONE_SECOND", "ONE_MINUTE", "ONE_HOUR", "ONE_YEAR", "unit", "valueA", "valueB", "roundTime", "getDateInterval", "approxInterval", "daysInMonth", "getMonthInterval", "APPROX_ONE_MONTH", "getHourInterval", "getMinutesAndSecondsInterval", "isMinutes", "getMillisecondsInterval", "nice", "getFirstTimestampOfUnit", "timestamp", "unitName", "upperUnitIdx", "createEstimateNiceMultiple", "setMethodName", "dateMethodInterval", "tmpDate", "tmpTime", "approxTimeInterval", "tickVal", "targetValue", "bottomUnitName", "extentSpanWithBreaks", "brkCtx", "safeLimit", "unitNames", "timeUnits", "iter", "addTicksInSpan", "minTimestamp", "maxTimestamp", "getMethodName", "isDate", "out", "estimateNiceMultiple", "dateTime", "date", "moreMultiple", "addLevelTicks", "lastLevelTicks", "levelTicks", "newAddedTicks", "isFirstLevel", "i", "startTick", "endTick", "getterName", "setterName", "fullYearGetterName", "fullYearSetterName", "monthGetterName", "monthSetterName", "dateGetterName", "dateSetterName", "hoursGetterName", "hoursSetterName", "minutesGetterName", "minutesSetterName", "secondsGetterName", "secondsSetterName", "millisecondsGetterName", "millisecondsSetterName", "levelsTicks", "currentLevelTicks", "tickCount", "lastLevelTickCount", "primaryTimeUnit", "isPrimaryTimeUnit", "nextPrimaryTimeUnit", "b", "levelTicksRemoveDuplicated", "i_1", "tickValue", "targetTickNum", "levelsTicksInExtent", "filter", "map", "k", "result", "Scale_default", "Time_default", "fixRound", "round", "mathFloor", "mathCeil", "mathPow", "mathLog", "LogScale", "_super", "__extends", "_this", "Interval_default", "opt", "extent", "originalExtent", "ticks", "base", "originalBreaks", "scaleBreakHelper", "getScaleBreakHelper", "map", "tick", "val", "roundingCriterion", "powVal", "vBreak", "transformed", "fixRoundingError", "start", "end", "loggedExtent", "logTransform", "data", "dim", "loggedOther", "approxTickNum", "span", "interval", "quantity", "err", "niceExtent", "getIntervalPrecision", "breakOptionList", "_a", "bind", "parsedOriginal", "parsedLogged", "originalVal", "getPrecision", "Scale_default", "Log_default", "ScaleRawExtentInfo", "scale", "model", "originalExtent", "dataExtent", "isOrdinal", "axisMinValue", "modelMinRaw", "isFunction", "parseAxisModelMinMax", "modelMaxRaw", "boundaryGap", "boundaryGapArr", "isArray", "parsePercent", "dataMin", "dataMax", "axisDataLen", "boundaryGapInner", "span", "min", "max", "minFixed", "maxFixed", "isBlank", "eqNaN", "determinedMin", "determinedMax", "minMaxName", "val", "DATA_MIN_MAX_ATTR", "attr", "DETERMINED_MIN_MAX_ATTR", "DETERMINED_MIN_MAX_ATTR", "DATA_MIN_MAX_ATTR", "ensureScaleRawExtentInfo", "scale", "model", "originalExtent", "rawExtentInfo", "ScaleRawExtentInfo", "parseAxisModelMinMax", "minMax", "eqNaN", "getScaleExtent", "scale", "model", "scaleType", "rawExtentResult", "ensureScaleRawExtentInfo", "min", "max", "ecModel", "barSeriesModels", "prepareLayoutBarSeries", "isBaseAxisAndHasBarSeries_1", "each", "seriesModel", "barWidthAndOffset", "makeColumnLayout", "adjustedScale", "adjustScaleForOverflow", "axisExtent", "axisLength", "barsOnCurrentAxis", "retrieveColumnLayout", "minOverflow", "item", "maxOverflow", "totalOverFlow", "oldRange", "oldRangePercentOfNew", "overflowBuffer", "niceScaleExtent", "inModel", "extentInfo", "extent", "splitNumber", "Log_default", "interval", "isIntervalOrTime", "retrieveAxisBreaksOption", "createScaleByModel", "axisType", "Ordinal_default", "Time_default", "Scale_default", "Interval_default", "ifAxisCrossZero", "axis", "dataExtent", "makeLabelFormatter", "labelFormatter", "parsed_1", "parseTimeAxisLabelFormatter", "tick", "idx", "isString", "label", "text", "isFunction", "getAxisRawValue", "scaleBreakHelper_1", "getScaleBreakHelper", "extra", "getOptionCategoryInterval", "shouldShowAllLabels", "getDataDimensionsOnAxis", "data", "axisDim", "dataDimMap", "dataDim", "getStackedDimension", "keys", "unionAxisExtentFromData", "dim", "seriesExtent", "isNameLocationCenter", "nameLocation", "shouldAxisShow", "axisModel", "option", "isSupportAxisBreak", "AxisModelCommonMixin", "option", "EPSILON", "isAroundEqual", "a", "b", "contain", "points", "x", "y", "w", "p", "i", "p2", "windingLine", "p0", "TMP_TRANSFORM", "transformPoints", "points", "transform", "p", "applyTransform", "updateBBoxFromPoints", "min", "max", "projection", "centroid", "signedArea", "cx", "cy", "len", "x0", "y0", "i", "x1", "y1", "a", "Region", "name", "center", "GeoJSONPolygonGeometry", "exterior", "interiors", "GeoJSONLineStringGeometry", "points", "GeoJSONRegion", "_super", "__extends", "name", "geometries", "cp", "_this", "largestGeo", "largestGeoSize", "i", "geo", "exterior", "size", "centroid", "rect", "projection", "min", "max", "each", "updateBBoxFromPoints", "points", "BoundingRect_default", "coord", "loopGeo", "len", "interiors", "contain", "k", "x", "y", "width", "height", "aspect", "target", "transform", "transformPoints", "interior", "newRegion", "Region", "GeoSVGRegion", "_super", "__extends", "name", "elOnlyForCalculate", "_this", "el", "rect", "center", "mat", "identity", "TMP_TRANSFORM", "target", "mul", "invert", "applyTransform", "Region", "decode", "json", "jsonCompressed", "encodeScale", "features", "each", "feature", "geometry", "encodeOffsets", "coordinates", "decodeRing", "decodeRings", "rings", "idx", "c", "coordinate", "result", "prevX", "prevY", "i", "x", "y", "parseGeoJSON", "geoJson", "nameProperty", "map", "filter", "featureObj", "properties", "geo", "geometries", "GeoJSONPolygonGeometry", "item", "GeoJSONLineStringGeometry", "region", "GeoJSONRegion", "format_exports", "__export", "addCommas", "capitalFirst", "encodeHTML", "formatTime", "formatTpl", "getTextRect", "getTooltipMarker", "normalizeCssArray", "toCamelCase", "truncateText", "modelInner", "makeInner", "axisInner", "AxisTickLabelComputingKind", "createAxisLabelsComputingContext", "kind", "tickValuesToNumbers", "axis", "values", "nums", "map", "val", "createAxisLabels", "ctx", "custom", "labelFormatter_1", "makeLabelFormatter", "extent_1", "tickNumbers", "ticks", "filter", "numval", "tick", "makeCategoryLabels", "makeRealNumberLabels", "createAxisTicks", "tickModel", "opt", "extent_2", "makeCategoryTicks", "labelModel", "result", "makeCategoryLabelsActually", "labelsCache", "ensureCategoryLabelCache", "optionLabelInterval", "getOptionCategoryInterval", "isEstimate", "result_1", "axisCacheGet", "labels", "numericLabelInterval", "isFunction", "makeLabelsByCustomizedCategoryInterval", "makeAutoCategoryInterval", "makeLabelsByNumericCategoryInterval", "axisCacheSet", "ticksCache", "ensureCategoryTickCache", "optionTickInterval", "tickCategoryInterval", "labelsResult", "labelItem", "labelFormatter", "idx", "initAxisCacheMethod", "prop", "cache", "key", "i", "value", "result_2", "calculateCategoryInterval", "params", "fetchAutoCategoryIntervalCalculationParams", "rotation", "ordinalScale", "ordinalExtent", "tickCount", "step", "maxCount", "tickValue", "unitSpan", "unitW", "unitH", "maxW", "maxH", "width", "height", "rect", "getBoundingRect", "dw", "dh", "interval", "bind", "calculateCategoryIntervalTryDetermine", "lastInterval", "calculateCategoryIntervalDealCache", "axisExtent", "lastAutoInterval", "lastTickCount", "categoryInterval", "onlyTick", "startTick", "showAllLabel", "shouldShowAllLabels", "includeMinLabel", "includeMaxLabel", "addItem", "tickObj", "each", "rawLabel", "NORMALIZED_EXTENT", "Axis", "dim", "scale", "extent", "coord", "min", "max", "data", "dataExtent", "getPixelPrecision", "start", "end", "clamp", "fixExtentWithBands", "linearMap", "t", "point", "opt", "tickModel", "result", "createAxisTicks", "ticks", "ticksCoords", "map", "tickVal", "alignWithLabel", "fixOnBandTicksCoords", "minorTickModel", "splitNumber", "minorTicks", "minorTicksCoords", "minorTicksGroup", "minorTick", "ctx", "createAxisLabelsComputingContext", "AxisTickLabelComputingKind", "createAxisLabels", "axisExtent", "len", "size", "calculateCategoryInterval", "nTick", "margin", "axis", "ticksLen", "last", "diffSize", "crossLen", "shift_1", "each", "ticksItem", "inverse", "littleThan", "a", "b", "round", "Axis_default", "PI2", "CMD", "PathProxy_default", "DEFAULT_SEARCH_SPACE", "getCandidateAnchor", "pos", "distance", "rect", "outPt", "outDir", "width", "height", "projectPointToArc", "cx", "cy", "startAngle", "endAngle", "anticlockwise", "x", "y", "out", "d", "ox", "oy", "tmp", "normalizeRadian", "angle", "x1", "y1", "x2", "y2", "d1", "d2", "projectPointToLine", "limitToEnds", "dx", "dy", "dx1", "dy1", "lineLen", "projectedLen", "t", "projectPointToRect", "tmpPt", "nearestPointOnRect", "pt", "dist", "nearestPointOnPath", "path", "xi", "yi", "x0", "y0", "minDist", "data", "i", "cmd", "cubicProjectPoint", "quadraticProjectPoint", "rx", "ry", "theta", "dTheta", "_x", "pt0", "Point_default", "pt1", "pt2", "dir", "dir2", "updateLabelLinePoints", "target", "labelLineModel", "labelLine", "label", "labelGuideConfig", "points", "searchSpace", "labelRect", "anchorPoint", "targetTransform", "targetInversedTransform", "invert", "len", "candidate", "boundingRect", "Path_default", "limitTurnAngle", "tmpArr", "tmpProjPoint", "linePoints", "minTurnAngle", "len1", "len2", "angleCos", "minTurnAngleCos", "limitSurfaceAngle", "surfaceNormal", "maxSurfaceAngle", "maxSurfaceAngleCos", "HALF_PI", "angle2", "newAngle", "setLabelLineState", "ignore", "stateName", "stateModel", "isNormal", "stateObj", "smooth", "styleObj", "buildLabelLinePath", "shape", "moveLen", "midPoint0", "lerp", "midPoint2", "midPoint1", "setLabelLineStyle", "targetEl", "statesModels", "defaultStyle", "normalModel", "showNormal", "labelIgnoreNormal", "DISPLAY_STATES", "stateShow", "isLabelIgnored", "retrieve2", "Polyline_default", "defaults", "showAbove", "labelLineConfig", "getLabelLineStatesModels", "itemModel", "labelLineName", "SPECIAL_STATES", "LABEL_LAYOUT_BASE_PROPS", "LABEL_LAYOUT_DIRTY_BIT_OTHERS", "LABEL_LAYOUT_DIRTY_BIT_OBB", "LABEL_LAYOUT_DIRTY_ALL", "setLabelLayoutDirty", "labelGeometry", "dirtyOrClear", "dirtyBits", "isLabelLayoutDirty", "ensureLabelLayoutWithGeometry", "labelLayout", "computeLabelGeometry", "out", "label", "opt", "rawTransform", "ensureCopyTransform", "outLocalRect", "ensureCopyRect", "labelStyleExt", "margin", "marginForce", "minMarginForce", "marginDefault", "marginType", "LabelMarginType", "i", "_tmpLabelMargin", "expandOrShrinkRect", "outGlobalRect", "isBoundingRectAxisAligned", "computeLabelGeometry2", "rawLocalRect", "labelLayoutApplyTranslation", "offset", "transform", "globalRect", "obb", "newLabelLayoutWithGeometry", "newBaseWithDefaults", "source", "prop", "ensureOBB", "OrientedBoundingRect_default", "shiftLayoutOnXY", "list", "xyDimIdx", "minBound", "maxBound", "balanceShift", "len", "xyDim", "XY", "sizeDim", "WH", "a", "b", "lastPos", "delta", "adjusted", "totalShifts", "item", "rect", "shift", "shiftList", "first", "last", "minGap", "maxGap", "updateMinMaxGap", "squeezeGaps", "takeBoundsGap", "squeezeWhenBailout", "gapThisBound", "gapOtherBound", "moveDir", "moveFromMaxGap", "remained", "start", "end", "maxSqeezePercent", "gaps", "totalGaps", "prevItemRect", "gap", "squeezePercent", "movement", "dir", "moveForEachLabel", "restoreIgnore", "labelList", "labelItem", "defaultAttr", "labelLine", "hideOverlap", "displayedLabels", "hideEl", "el", "emphasisState", "overlapped", "j", "labelIntersect", "baseLayoutInfo", "targetLayoutInfo", "mtv", "intersectOpt", "cloneArr", "points", "newPoints", "i", "prepareLayoutCallbackParams", "labelItem", "hostEl", "label", "labelLine", "LABEL_OPTION_TO_STYLE_KEYS", "dummyTransformable", "Transformable_default", "labelLayoutInnerStore", "makeInner", "labelLineAnimationStore", "extendWithKeys", "target", "source", "keys", "key", "LABEL_LAYOUT_PROPS", "LabelManager", "dataIndex", "dataType", "seriesModel", "layoutOptionOrCb", "labelStyle", "textConfig", "labelTransform", "labelRect", "BoundingRect_default", "normalizeRadian", "host", "hostRect", "transform", "labelGuide", "chartView", "_this", "layoutOption", "isFunction", "child", "textEl", "ecData", "getECData", "api", "width", "height", "createDragHandler", "el", "labelLineModel", "updateLabelLinePoints", "defaultLabelAttr", "degreeToRadian", "needsUpdateLabelLine", "parsePercent", "guideLine", "labelLayoutStore", "k", "hostModel", "data", "labelList", "each", "inputItem", "newLabelLayoutWithGeometry", "labelsNeedsAdjustOnX", "filter", "item", "labelsNeedsAdjustOnY", "shiftLayoutOnXY", "labelsNeedsHideOverlap", "restoreIgnore", "hideOverlap", "ignoreLabelLineUpdate", "animationEnabled", "itemModel", "defaultStyle", "visualStyle", "visualType", "setLabelLineStyle", "getLabelLineStatesModels", "isElementRemoved", "layoutStore", "oldLayout", "newProps", "prevStates", "indexOf", "updateProps", "labelInner", "oldOpacity", "retrieve2", "initProps", "layoutSelect", "layoutEmphasis", "animateLabelValue", "newLayout", "LabelManager_default", "getLabelManager", "makeInner", "installLabelLayout", "registers", "ecModel", "api", "params", "labelManager", "LabelManager_default", "series", "mathSin", "mathCos", "PI", "PI2", "degree", "SVGPathRebuilder", "precision", "x", "y", "x2", "y2", "x3", "y3", "cx", "cy", "r", "startAngle", "endAngle", "anticlockwise", "rx", "ry", "psi", "dTheta", "clockwise", "dThetaPositive", "isCircle", "isAroundZero", "unifiedTheta", "large", "x0", "y0", "xRot", "p", "dTheta_1", "w", "h", "cmd", "a", "b", "c", "d", "e", "f", "g", "vals", "i", "val", "SVGPathRebuilder_default", "NONE", "mathRound", "pathHasFill", "style", "fill", "pathHasStroke", "stroke", "strokeProps", "svgStrokeProps", "map", "prop", "mapStyleToAttrs", "updateAttr", "el", "forceUpdate", "opacity", "Image_default", "normalizeColor", "fillOpacity", "strokeScale", "strokeWidth", "strokeOpacity", "strokeFirst", "_a", "getLineDash", "lineDash", "lineDashOffset", "i", "propName", "DEFAULT_PATH_STYLE", "val", "SVGNS", "XLINKNS", "XMLNS", "XML_NAMESPACE", "META_DATA_PREFIX", "createElement", "name", "createVNode", "tag", "key", "attrs", "children", "text", "createElementOpen", "attrsStr", "val", "part", "createElementClose", "vNodeToString", "el", "opts", "S", "convertElToString", "encodeHTML", "map", "child", "getCssString", "selectorNodes", "animationNodes", "bracketBegin", "bracketEnd", "selectors", "keys", "className", "attrName", "animations", "animationName", "percent", "createBrushScope", "zrId", "createSVGVNode", "width", "height", "useViewBox", "cssClassIdx", "getClassId", "EASING_MAP", "transformOriginKey", "buildPathString", "el", "kfShape", "path", "shape", "extend", "svgPathBuilder", "SVGPathRebuilder_default", "getPathPrecision", "setTransformOrigin", "target", "transform", "originX", "originY", "ANIMATE_STYLE_MAP", "addAnimation", "cssAnim", "scope", "animationName", "createCompoundPathCSSAnimation", "attrs", "paths", "composedAnim", "cssAnimationCfg", "cssAnimationName", "each", "subScope", "createBrushScope", "createCSSAnimation", "cssAnims", "cssNodes", "animNames", "keys", "len", "lastAnim", "percent", "kf", "className", "val", "getEasingFunc", "easing", "isString", "createCubicEasingFunc", "onlyShape", "animators", "cssAnimations", "CompoundPath_default", "animationCfg", "groupAnimators", "i", "animator", "cfgArr", "delay", "cfg", "createSingleCSSAnimation", "groupAnimator", "transformKfs", "shapeKfs", "finalKfs", "animationTimingFunctionAttrName", "saveAnimatorTrackToCssKfs", "cssKfs", "toCssAttrName", "tracks", "maxTime", "k", "track", "kfs", "attrName", "kfEasing", "rawValue", "isNumber", "targetProp", "copyTransform", "str", "getSRTTransformString", "timingFunction", "canAnimateShape", "isFirst", "PathProxy_default", "len_1", "newLen", "propName", "percents", "allTransformOriginSame", "transformOrigin", "p0", "p1", "filter", "key", "getClassId", "createCSSEmphasis", "el", "attrs", "scope", "style", "setClassAttribute", "emphasisStyle", "fill", "normalFill", "selectFill", "fromFill", "liftColor", "lineWidth", "scaleX", "withHover", "styleKey", "className", "getClassId", "round", "isImageLike", "val", "isString", "isCanvasLike", "isFunction", "setStyleAttrs", "attrs", "style", "el", "scope", "mapStyleToAttrs", "key", "isFillStroke", "isGradient", "setGradient", "isPattern", "setPattern", "setShadow", "setMetaData", "metaData", "getElementSSRData", "META_DATA_PREFIX", "noRotateScale", "m", "isAroundZero", "noTranslate", "setTransform", "compress", "mul", "getMatrixStr", "convertPolyShape", "shape", "points", "strArr", "i", "validatePolyShape", "createAttrsConvert", "desc", "normalizedDesc", "map", "item", "builtinShapesDef", "hasShapeAnimation", "animators", "brushSVGPath", "builtinShpDef", "needsAnimate", "svgElType", "strokePercent", "precision", "getPathPrecision", "needBuildPath", "path", "pathVersion", "elExt", "svgPathBuilder", "SVGPathRebuilder_default", "createCSSAnimation", "createCSSEmphasis", "createVNode", "brushSVGImage", "image", "x", "y", "dw", "dh", "brushSVGTSpan", "text", "font", "DEFAULT_FONT", "adjustTextY", "getLineHeight", "textAlign", "TEXT_ALIGN_TO_ANCHOR", "hasSeparateFont", "separatedFontStr", "fontStyle", "fontSize", "parseFontSize", "fontFamily", "DEFAULT_FONT_FAMILY", "fontWeight", "brush", "Path_default", "Image_default", "TSpan_default", "hasShadow", "shadowKey", "getShadowKey", "shadowCache", "shadowId", "globalScale", "scaleX", "scaleY", "offsetX", "offsetY", "blur_1", "_a", "normalizeColor", "opacity", "color", "stdDx", "stdDy", "stdDeviation", "getIdURL", "target", "gradientTag", "gradientAttrs", "isLinearGradient", "isRadialGradient", "retrieve2", "colors", "colorStops", "len", "offset", "round4", "stopColor", "stopsAttrs", "gradientVNode", "gradientKey", "vNodeToString", "gradientCache", "gradientId", "boundingRect", "patternAttrs", "repeat", "noRepeat", "repeatX", "repeatY", "child", "isImagePattern", "imageWidth_1", "imageHeight_1", "imageSrc", "patternImage", "errMsg", "assert", "setSizeToVNode_1", "vNode", "img", "svgEl", "width", "height", "createdImage", "createOrUpdateImage", "patternVNode", "clone", "patternWidth", "patternHeight", "patternTransform", "getSRTTransformString", "patternKey", "patternCache", "patternId", "setClipPath", "clipPath", "clipPathCache", "defs", "clipPathId", "clipPathAttrs", "createTextNode", "text", "insertBefore", "parentNode", "newNode", "referenceNode", "removeChild", "node", "child", "appendChild", "nextSibling", "setTextContent", "node", "text", "colonChar", "xChar", "emptyNode", "createVNode", "isUndef", "s", "isDef", "createKeyToOldIdx", "children", "beginIdx", "endIdx", "map", "key", "sameVnode", "vnode1", "vnode2", "isSameKey", "isSameTag", "createElm", "vnode", "i", "tag", "elm", "createElement", "updateAttrs", "isArray", "ch", "appendChild", "isObject", "createTextNode", "addVnodes", "parentElm", "before", "vnodes", "startIdx", "insertBefore", "removeVnodes", "parent_1", "parentNode", "removeChild", "oldVnode", "oldAttrs", "attrs", "cur", "old", "XMLNS", "XML_NAMESPACE", "XLINKNS", "updateChildren", "oldCh", "newCh", "oldStartIdx", "newStartIdx", "oldEndIdx", "oldStartVnode", "oldEndVnode", "newEndIdx", "newStartVnode", "newEndVnode", "oldKeyToIdx", "idxInOld", "elmToMove", "patchVnode", "nextSibling", "setTextContent", "patch", "parent_2", "svgId", "SVGPainter", "root", "storage", "opts", "createMethodNotSupport", "extend", "createSVGVNode", "viewport", "svgDom", "createElement", "updateAttrs", "viewportRoot", "vnode", "patch", "el", "brush", "createBrushScope", "list", "width", "height", "scope", "children", "bgVNode", "createBackgroundVNode", "mainVNode", "createVNode", "defs", "map", "keys", "id", "animationCssStr", "getCssString", "styleNode", "vNodeToString", "retrieve2", "backgroundColor", "out", "listLen", "clipPathsGroupsStack", "clipPathsGroupsStackDepth", "currentClipPathGroup", "prevClipPaths", "clipGroupNodeIdx", "i", "displayable", "clipPaths", "len", "prevLen", "lca", "i_1", "i_2", "groupAttrs", "setClipPath", "g", "ret", "getSize", "viewportStyle", "isPattern", "bgEl", "base64", "str", "prefix", "encodeBase64", "method", "isGradient", "setGradient", "setPattern", "noop", "_a", "normalizeColor", "color", "opacity", "Painter_default", "install", "registers", "Painter_default", "createDom", "id", "painter", "dpr", "newDom", "platformApi", "width", "height", "newDomStyle", "Layer", "_super", "__extends", "_this", "dom", "devicePixelRatio", "isObject", "domStyle", "disableUserSelect", "displayList", "prevList", "viewWidth", "viewHeight", "mergedRepaintRects", "maxRepaintRectCount", "full", "pendingRect", "BoundingRect_default", "addRectToMergePool", "rect", "boundingRect", "isMerged", "minDeltaArea", "bestRectToMergeIdx", "i", "mergedRect", "pendingRect_1", "aArea", "bArea", "pendingArea", "deltaArea", "el", "shouldPaint", "prevRect", "REDRAW_BIT", "curRect", "hasIntersections", "j", "domBack", "clearAll", "clearColor", "repaintRects", "ctx", "haveMotionBLur", "lastFrameAlpha", "self", "doClear", "x", "y", "clearColorGradientOrPattern", "isGradientObject", "shouldCache", "getCanvasGradient", "isImagePatternObject", "createCanvasPattern", "each", "Eventful_default", "Layer_default", "HOVER_LAYER_ZLEVEL", "CANVAS_ZLEVEL", "EL_AFTER_INCREMENTAL_INC", "INCREMENTAL_INC", "isLayerValid", "layer", "createRoot", "width", "height", "domRoot", "CanvasPainter", "root", "storage", "opts", "id", "singleCanvas", "extend", "devicePixelRatio", "rootStyle", "disableUserSelect", "zlevelList", "layers", "rootCanvas", "mainLayer", "Layer_default", "getSize", "viewportRoot", "paintAll", "list", "prevList", "i", "z", "clearColor", "len", "hoverLayer", "scope", "ctx", "el", "brush", "brushSingle", "redrawId", "_a", "finished", "needsRefreshHover", "self_1", "requestAnimationFrame_default", "_this", "layerList", "useDirtyRect", "zi", "zlevel", "_loop_1", "k", "repaintRects", "this_1", "start", "useTimer", "startTime", "firstEl", "repaint", "repaintRect", "dTime", "dpr", "r", "rect", "env_default", "each", "currentLayer", "isLast", "paintRect", "virtual", "merge", "layersMap", "prevLayer", "prevDom", "cb", "context", "updatePrevLayer", "idx", "i_1", "incrementalLayerCount", "prevZlevel", "logError", "REDRAW_BIT", "backgroundColor", "config", "layerConfig", "_zlevel", "indexOf", "imageLayer", "width_1", "height_1", "displayList", "Painter_default", "install", "registers", "Painter_default", "LineSeriesModel", "_super", "__extends", "_this", "option", "coordSys", "createSeriesData_default", "opt", "group", "Group_default", "line", "createSymbol", "visualType", "visualRotate", "symbolType", "size", "symbol", "symbolRotate", "tokens_default", "Series_default", "LineSeries_default", "getDefaultLabel", "data", "dataIndex", "labelDims", "len", "rawVal", "retrieveRawValue", "vals", "i", "getDefaultInterpolatedLabel", "interpolatedValue", "isArray", "dimIndex", "Symbol", "_super", "__extends", "data", "idx", "seriesScope", "opts", "_this", "symbolType", "symbolSize", "z2", "keepAspect", "symbolPath", "createSymbol", "retrieve2", "driftSymbol", "toLastFrame", "enterEmphasis", "leaveEmphasis", "zlevel", "z", "draggable", "hasCursorOption", "seriesModel", "isInit", "disableAnimation", "target", "updateProps", "saveOldStyle", "initProps", "emphasisItemStyle", "blurItemStyle", "selectItemStyle", "focus", "blurScope", "emphasisDisabled", "labelStatesModels", "hoverScale", "cursorStyle", "itemModel", "emphasisModel", "getLabelStatesModels", "symbolRotate", "symbolOffset", "normalizeSymbolOffset", "symbolStyle", "visualColor", "Image_default", "pathStyle", "extend", "liftZ", "z2Origin", "useNameLabel", "setLabelStyle", "getLabelDefaultText", "getDefaultLabel", "emphasisState", "scaleRatio", "toggleHoverEmphasis", "scale", "cb", "opt", "dataIndex", "getECData", "animationOpt", "textContent", "removeElement", "normalizeSymbolSize", "Group_default", "dx", "dy", "Symbol_default", "symbolNeedsDraw", "data", "point", "idx", "opt", "normalizeUpdateOpt", "isObject", "makeSeriesScope", "seriesModel", "emphasisModel", "getLabelStatesModels", "SymbolDraw", "SymbolCtor", "Group_default", "Symbol_default", "group", "oldData", "disableAnimation", "seriesScope", "symbolUpdateOpt", "getSymbolPoint", "newIdx", "symbolEl", "oldIdx", "newSymbolType", "oldSymbolType", "target", "updateProps", "el", "_this", "taskParams", "updateIncrementalAndHover", "cb", "traverseElements", "enableAnimation", "SymbolDraw_default", "prepareDataCoordInfo", "coordSys", "data", "valueOrigin", "baseAxis", "valueAxis", "valueStart", "getValueStart", "baseAxisDim", "valueAxisDim", "valueDim", "baseDim", "baseDataOffset", "dims", "map", "coordDim", "stacked", "stackResultDim", "isDimensionStacked", "extent", "isNumber", "getStackedOnPoint", "dataCoordInfo", "idx", "value", "stackedData", "diffData", "oldData", "newData", "diffResult", "idx", "newIdx", "oldIdx", "lineAnimationDiff", "oldStackedOnPoints", "newStackedOnPoints", "oldCoordSys", "newCoordSys", "oldValueOrigin", "newValueOrigin", "diff", "currPoints", "nextPoints", "currStackedPoints", "nextStackedPoints", "status", "sortedIndices", "rawIndices", "newDataOldCoordInfo", "prepareDataCoordInfo", "oldPoints", "newPoints", "i", "diffItem", "pointAdded", "oldIdx2", "newIdx2", "currentX", "currentY", "nextX", "nextY", "newDataDimsForPoint", "oldPt", "stackedOnPoint", "getStackedOnPoint", "a", "b", "len", "sortedCurrPoints", "createFloat32Array", "sortedNextPoints", "sortedCurrStackedPoints", "sortedNextStackedPoints", "sortedStatus", "i2", "idx2", "mathMin", "mathMax", "isPointNull", "x", "y", "drawSegment", "ctx", "points", "start", "segLen", "allLen", "dir", "smooth", "smoothMonotone", "connectNulls", "prevX", "prevY", "cpx0", "cpy0", "cpx1", "cpy1", "idx", "k", "dx", "dy", "nextIdx", "nextX", "nextY", "tmpK", "ratioNextSeg", "vx", "vy", "nextCpx0", "nextCpy0", "dx0", "dx1", "dy0", "dy1", "lenPrevSeg", "lenNextSeg", "dir_1", "dir_2", "ECPolylineShape", "ECPolyline", "_super", "__extends", "opts", "_this", "tokens_default", "shape", "i", "len", "xOrY", "dim", "path", "data", "CMD", "PathProxy_default", "x0", "y0", "isDimX", "roots", "cmd", "x2", "y2", "x3", "y3", "t", "val", "nRoot", "cubicRootAt", "i_1", "t_1", "cubicAt", "Path_default", "ECPolygonShape", "_super", "__extends", "ECPolylineShape", "ECPolygon", "opts", "_this", "ctx", "shape", "points", "stackedOnPoints", "i", "len", "smoothMonotone", "isPointNull", "k", "drawSegment", "Path_default", "createGridClipPath", "cartesian", "hasAnimation", "seriesModel", "done", "during", "rect", "x", "y", "width", "height", "lineWidth", "clipPath", "Rect_default", "baseAxis", "isHorizontal", "isAxisInversed", "duringCb", "isFunction", "percent", "initProps", "createPolarClipPath", "polar", "sectorArea", "r0", "round", "r", "Sector_default", "isRadial", "createClipPath", "coordSys", "isCoordinateSystemType", "coordSys", "type", "isPointsSame", "points1", "points2", "i", "bboxFromPoints", "points", "minX", "minY", "maxX", "maxY", "x", "y", "getBoundingDiff", "_a", "min1", "max1", "_b", "min2", "max2", "getSmooth", "smooth", "isNumber", "getStackedOnPoints", "coordSys", "data", "dataCoordInfo", "len", "createFloat32Array", "idx", "pt", "getStackedOnPoint", "turnPointsIntoStep", "basePoints", "stepTurnAt", "connectNulls", "baseAxis", "baseIndex", "stepPoints", "stepPt", "nextPt", "filteredPoints", "reference", "middle", "stepPt2", "clipColorStops", "colorStops", "maxSize", "newColorStops", "prevOutOfRangeColorStop", "prevInRangeColorStop", "lerpStop", "stop0", "stop1", "clippedCoord", "coord0", "p", "color", "lerp", "stop_1", "coord", "getVisualGradient", "api", "visualMetaList", "coordDim", "visualMeta", "dimInfo", "axis", "map", "stop", "stopLen", "outerColors", "colorStopsInRange", "inRangeStopLen", "tinyExtent", "minCoord", "maxCoord", "coordSpan", "each", "gradient", "LinearGradient_default", "getIsIgnoreFunc", "seriesModel", "showAllSymbol", "isAuto", "categoryAxis", "canShowAllSymbolForCategory", "categoryDataDim", "labelMap", "labelItem", "ordinalNumber", "dataIndex", "axisExtent", "availSize", "dataLen", "step", "Symbol_default", "isPointNull", "getLastIndexNotNull", "getPointAtIndex", "getIndexRange", "xOrY", "dim", "dimIdx", "a", "b", "prevIndex", "nextIndex", "anyStateShowEndLabel", "SPECIAL_STATES", "createLineClipPath", "lineView", "hasAnimation", "isCoordinateSystemType", "endLabelModel_1", "valueAnimation_1", "data_1", "labelAnimationRecord_1", "during", "percent", "clipRect", "isHorizontal", "clipPath", "createGridClipPath", "endLabel", "rectShape", "expandSize", "createPolarClipPath", "getEndLabelStateSpecified", "endLabelModel", "isBaseInversed", "align", "verticalAlign", "LineView", "_super", "__extends", "lineGroup", "Group_default", "symbolDraw", "SymbolDraw_default", "bind", "ecModel", "group", "lineStyleModel", "areaStyleModel", "isCoordSysPolar", "prevCoordSys", "polyline", "polygon", "isAreaChart", "valueOrigin", "prepareDataCoordInfo", "stackedOnPoints", "showSymbol", "isIgnoreFunc", "oldData", "el", "clipShapeForSymbol", "visualColor", "convertToColorString", "oldClipPath", "newClipPath", "initProps", "emphasisModel", "focus", "blurScope", "emphasisDisabled", "defaults", "setStatesStylesFromModel", "emphasisLineStyle", "getECData", "toggleHoverEmphasis", "smoothMonotone", "stackedOnSeries", "stackedOnSmooth", "changePolyState", "payload", "queryDataIndex", "symbol", "zlevel", "z", "symbolLabel", "Chart_default", "toState", "setStatesFlag", "ECPolyline", "ECPolygon", "clipShape", "isHorizontalOrRadial", "isAxisInverse", "seriesDuration", "isFunction", "seriesDelay", "seriesDelayValue", "point", "start", "end", "current", "polarClip", "gridClip", "ratio", "delay", "symbolPath", "text", "inheritColor", "data_2", "Text_default", "setLabelStyle", "getLabelStatesModels", "opt", "interpolatedValue", "getDefaultInterpolatedLabel", "getDefaultLabel", "animationRecord", "valueAnimation", "precision", "distance", "distanceX", "distanceY", "dataIndexRange", "indices", "diff", "value", "startValue", "endValue", "interpolateRawValues", "inner", "labelInner", "lineAnimationDiff", "stackedOnCurrent", "next", "stackedOnNext", "target", "updateProps", "updatedDataInfo", "diffStatus", "cmd", "offset", "LineView_default", "pointsLayout", "seriesType", "forceStoreInTypedArray", "createRenderPlanner", "seriesModel", "data", "coordSys", "pipelineContext", "useTypedArray", "dims", "map", "dim", "dimLen", "stackResultDim", "isDimensionStacked", "store", "dimIdx0", "dimIdx1", "params", "segCount", "points", "createFloat32Array", "tmpIn", "tmpOut", "i", "offset", "point", "x", "samplers", "frame", "sum", "count", "i", "max", "min", "indexSampler", "dataSample", "seriesType", "seriesModel", "ecModel", "api", "data", "sampling", "coordSys", "baseAxis", "valueAxis", "extent", "dpr", "size", "rate", "sampler", "isString", "isFunction", "install", "registers", "LineView_default", "LineSeries_default", "pointsLayout", "seriesModel", "data", "lineStyle", "dataSample", "BaseBarSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesData_default", "value", "dims", "startingAtTick", "coordSys", "clampData_1", "pt_1", "each", "axis", "idx", "tickCoords", "alignTicksWithLabel", "targetTickId", "isEnd", "leftCoord", "coord", "stepTickValue", "i", "tickCoord", "tickValue", "data", "offset", "size", "offsetIndex", "Series_default", "BaseBarSeries_default", "BarSeriesModel", "_super", "__extends", "_this", "createSeriesData_default", "progressiveThreshold", "largeThreshold", "dataIndex", "data", "selectors", "inheritDefaultOption", "BaseBarSeries_default", "tokens_default", "BarSeries_default", "SausageShape", "SausagePath", "_super", "__extends", "opts", "_this", "ctx", "shape", "cx", "cy", "r0", "r", "dr", "rCenter", "startAngle", "endAngle", "clockwise", "PI2", "lessThanCircle", "unitStartX", "unitStartY", "unitEndX", "unitEndY", "Path_default", "sausage_default", "createSectorCalculateTextPosition", "positionMapping", "opts", "isRoundCap", "out", "boundingRect", "textPosition", "calculateTextPosition", "mappedSectorPosition", "distance", "sector", "cx", "cy", "r", "r0", "middleR", "startAngle", "endAngle", "middleAngle", "extraDist", "mathCos", "mathSin", "y", "textAlign", "textVerticalAlign", "adjustAngleDistanceX", "adjustAngleDistanceY", "setSectorTextRotation", "rotateType", "isNumber", "isArray", "shape", "anchorAngle", "rotate", "angle", "isEnd", "getSectorCornerRadius", "model", "shape", "zeroIfNull", "cornerRadius", "isArray", "dr", "map", "cr", "parsePercent", "mathMax", "mathMin", "getClipArea", "coord", "data", "coordSysClipArea", "isCoordinateSystemType", "baseAxis", "expandWidth", "BarView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "payload", "coordinateSystemType", "params", "cb", "traverseElements", "isLargeDraw", "group", "oldData", "isHorizontalOrRadial", "animationModel", "realtimeSortCfg", "shouldRealtimeSort", "needsClip", "roundCap", "drawBackground", "backgroundModel", "barBorderRadius", "bgEls", "oldBgEls", "isInitSort", "isChangeOrder", "createBackground", "dataIndex", "bgLayout", "getLayout", "bgEl", "createBackgroundEl", "itemModel", "layout", "isValidLayout", "isClipped", "clip", "el", "elementCreator", "updateStyle", "updateRealtimeAnimation", "initProps", "newIndex", "oldIndex", "shape", "createBackgroundShape", "updateProps", "roundCapChanged", "removeElementWithFadeOut", "saveOldStyle", "textEl", "labelInnerStore", "labelInner", "bgGroup", "Group_default", "i", "createLarge", "clipPath", "createClipPath", "orderMapping_1", "idx", "orderMapping", "info", "ordinalNumber", "dataIdx", "mappedValue", "b", "map", "item", "scale", "ordinalDataDim", "lastValue", "tickNum", "len", "rawIdx", "value", "orderInfo", "extent", "tickMax", "sortInfo", "sortResult", "model", "getECData", "Chart_default", "coordSysBoundingRect", "signWidth", "signHeight", "coordSysX2", "coordSysY2", "x", "x2", "y", "y2", "xClipped", "yClipped", "signR", "tmp", "r", "r0", "clipped", "isHorizontal", "axisModel", "isUpdate", "rect", "Rect_default", "extend", "rectShape", "animateProperty", "isRadial", "ShapeClass", "sausage_default", "Sector_default", "sector", "positionMap", "createPolarPositionMapping", "createSectorCalculateTextPosition", "sectorShape", "animateTarget", "coordSys", "realtimeSortOption", "seriesAnimationModel", "seriesTarget", "axisTarget", "axisAnimationModel", "checkPropertiesNotValid", "obj", "props", "rectPropties", "polarPropties", "fixedLineWidth", "getLineWidth", "signX", "signY", "isZeroOnPolar", "arcOrAngle", "position", "isPolar", "style", "cornerRadius", "getSectorCornerRadius", "borderRadius", "cursorStyle", "labelPositionOutside", "labelStatesModels", "getLabelStatesModels", "setLabelStyle", "getDefaultLabel", "label", "setSectorTextRotation", "setLabelValueAnimation", "getDefaultInterpolatedLabel", "emphasisModel", "toggleHoverEmphasis", "setStatesStylesFromModel", "each", "state", "rawLayout", "borderColor", "lineWidth", "width", "height", "LagePathShape", "LargePath", "opts", "ctx", "points", "baseDimIdx", "valueDimIdx", "startPoint", "size", "barWidth", "Path_default", "progressiveEls", "incremental", "largeDataIndices", "bgPoints", "largePathUpdateDataIndex", "throttle", "event", "largePath", "largePathFindDataIndex", "ii", "coordLayout", "ElementClz", "BarView_default", "install", "registers", "BarView_default", "BarSeries_default", "curry", "layout", "createProgressiveLayout", "dataSample", "payload", "ecModel", "componentType", "componentModel", "PI2", "RADIAN", "pieLayout", "seriesType", "ecModel", "api", "seriesModel", "data", "valueDim", "_a", "getCircleLayout", "cx", "cy", "r", "r0", "viewRect", "startAngle", "endAngle", "padAngle", "minAngle", "minAndPadAngle", "validDataCount", "value", "sum", "unitRadian", "clockwise", "roseType", "stillShowZeroSum", "extent", "dir", "angles", "halfPadAngle", "normalizeArcAngles", "layoutData", "getSeriesLayoutData", "angleRange", "restAngle", "valueSumLargerThanMinAngle", "currentAngle", "idx", "angle", "actualStartAngle", "actualEndAngle", "linearMap", "angle_1", "layout", "makeInner", "dataFilter", "seriesType", "seriesModel", "ecModel", "legendModels", "data", "idx", "name", "i", "RADIAN", "adjustSingleSide", "list", "cx", "cy", "r", "dir", "viewWidth", "viewHeight", "viewLeft", "viewTop", "farthestX", "recalculateXOnSemiToAlignOnEllipseCurve", "semi", "rB", "rB2", "i", "item", "dy", "rA", "rA2", "dx", "newX", "deltaX", "newTargetWidth", "constrainTextWidth", "recalculateX", "items", "topSemi", "bottomSemi", "len", "shiftLayoutOnXY", "avoidOverlap", "labelLayoutList", "leftList", "rightList", "leftmostX", "rightmostX", "label", "isPositionCenter", "layout", "linePoints", "targetTextWidth", "isAlignToEdge", "padding", "paddingH", "extraPaddingH", "realTextWidth", "dist", "availableWidth", "forceRecalculate", "style", "textRect", "bgColor", "overflow", "oldOuterWidth", "innerRect", "availableInnerWidth", "newWidth", "computeLabelGlobalRect", "out", "_tmpLabelGeometry", "computeLabelGeometry", "_computeLabelGeometryOpt", "sectorShape", "pieLabelLayout", "seriesModel", "data", "hasLabelRotate", "minShowLabelRadian", "viewRect", "setNotShow", "el", "isLabelShown", "key", "idx", "sector", "labelLine", "itemModel", "labelModel", "labelPosition", "labelDistance", "labelAlignTo", "edgeDistance", "parsePercent", "bleedMargin", "labelLineModel", "labelLineLen", "labelLineLen2", "each", "midAngle", "nx", "ny", "textX", "textY", "textAlign", "isLabelInside", "x1", "y1", "x2", "y2", "x3", "y3", "PI", "labelRotate", "rotate", "isNumber", "radialAngle", "rad", "isDown", "selectState", "BoundingRect_default", "Point_default", "notShowLabel", "limitTurnAngle", "limitSurfaceAngle", "PiePiece", "_super", "__extends", "data", "idx", "startAngle", "_this", "text", "Text_default", "firstCreate", "sector", "seriesModel", "itemModel", "emphasisModel", "layout", "sectorShape", "extend", "getSectorCornerRadius", "animationType", "initProps", "updateProps", "saveOldStyle", "setStatesStylesFromModel", "midAngle", "offset", "dx", "dy", "cursorStyle", "labelLine", "labelText", "toggleHoverEmphasis", "labelLineModel", "style", "visualColor", "visualOpacity", "setLabelStyle", "getLabelStatesModels", "labelPosition", "polyline", "Polyline_default", "setLabelLineStyle", "getLabelLineStatesModels", "retrieve3", "Sector_default", "PieView", "ecModel", "api", "payload", "oldData", "group", "shape", "s", "layoutData", "getSeriesLayoutData", "clone", "piePiece", "newIdx", "oldIdx", "removeElementWithFadeOut", "pieLabelLayout", "point", "itemLayout", "radius", "Chart_default", "PieView_default", "createSeriesDataSimply", "seriesModel", "opt", "nameList", "isArray", "extend", "source", "dimensions", "prepareSeriesDataSchema", "list", "SeriesData_default", "LegendVisualProvider", "getDataWithEncodedVisual", "getRawData", "rawData", "name", "dataWithEncodedVisual", "dataIndex", "key", "LegendVisualProvider_default", "innerData", "makeInner", "PieSeriesModel", "_super", "__extends", "option", "LegendVisualProvider_default", "bind", "createSeriesDataSimply", "curry", "makeSeriesEncodeForNameBased", "dataIndex", "data", "dataInner", "seats", "valueList_1", "value", "getPercentSeats", "params", "defaultEmphasis", "labelLineNormalOpt", "labelLineEmphasisOpt", "Series_default", "registerLayOutOnCoordSysUsage", "model", "PieSeries_default", "negativeDataFilter", "seriesType", "seriesModel", "ecModel", "data", "idx", "valueDim", "curValue", "isNumber", "install", "registers", "PieView_default", "PieSeries_default", "createLegacyDataSelectAction", "curry", "pieLayout", "dataFilter", "negativeDataFilter", "ScatterSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesData_default", "progressive", "progressiveThreshold", "dataIndex", "data", "selectors", "tokens_default", "Series_default", "ScatterSeries_default", "BOOST_SIZE_THRESHOLD", "LargeSymbolPathShape", "LargeSymbolPath", "_super", "__extends", "opts", "_this", "path", "shape", "points", "size", "symbolProxy", "symbolProxyShape", "ctx", "canBoost", "softClipShape", "i", "x", "y", "w", "h", "idx", "x0", "y0", "localPos", "rect", "dataIdx", "minX", "minY", "maxX", "maxY", "BoundingRect_default", "Path_default", "LargeSymbolDraw", "Group_default", "data", "opt", "symbolEl", "child", "len", "byteOffset", "taskParams", "lastAdded", "oldPoints", "oldLen", "newPoints", "cb", "hostModel", "createSymbol", "extrudeShadow", "globalStyle", "visualColor", "ecData", "getECData", "e", "dataIndex", "LargeSymbolDraw_default", "ScatterView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "data", "symbolDraw", "taskParams", "res", "pointsLayout", "cb", "coordSys", "pipelineContext", "isLargeDraw", "LargeSymbolDraw_default", "SymbolDraw_default", "Chart_default", "ScatterView_default", "OUTER_BOUNDS_DEFAULT", "OUTER_BOUNDS_CLAMP_DEFAULT", "GridModel", "_super", "__extends", "option", "ecModel", "outerBoundsCp", "getLayoutParams", "mergeLayoutParam", "newOption", "tokens_default", "Component_default", "GridModel_default", "CartesianAxisModel", "_super", "__extends", "SINGLE_REFERRING", "Component_default", "mixin", "CartesianAxisModel", "AxisModelCommonMixin", "defaultOption", "tokens_default", "categoryAxis", "merge", "valueAxis", "timeAxis", "logAxis", "defaults", "axisDefault_default", "AXIS_TYPES", "_impl", "registerAxisBreakHelperImpl", "impl", "getAxisBreakHelper", "axisModelCreator", "registers", "axisName", "BaseAxisModelClass", "extraDefaultOption", "each", "AXIS_TYPES", "v", "axisType", "defaultOption", "merge", "axisDefault_default", "AxisModel", "_super", "__extends", "_this", "option", "ecModel", "layoutMode", "fetchLayoutMode", "inputPositionParams", "getLayoutParams", "themeModel", "getAxisType", "mergeLayoutParam", "thisOption", "OrdinalMeta_default", "rawData", "payload", "axisBreakHelper", "getAxisBreakHelper", "Cartesian", "name", "dim", "map", "scaleType", "filter", "axis", "Cartesian_default", "cartesian2DDimensions", "canCalculateAffineTransform", "scale", "Cartesian2D", "_super", "__extends", "_this", "xAxisScale", "yAxisScale", "xScaleExtent", "yScaleExtent", "start", "end", "xScaleSpan", "yScaleSpan", "scaleX", "scaleY", "translateX", "translateY", "m", "invert", "point", "axisX", "axisY", "data", "data1", "data2", "zoneDiag1", "zoneDiag2", "area", "zone", "BoundingRect_default", "clamp", "out", "xVal", "yVal", "applyTransform", "xAxis", "yAxis", "xScale", "yScale", "xAxisExtent", "yAxisExtent", "x", "y", "axis", "tolerance", "xExtent", "yExtent", "width", "height", "Cartesian_default", "Cartesian2D_default", "Axis2D", "_super", "__extends", "dim", "scale", "coordExtent", "axisType", "position", "_this", "asc", "ret", "point", "clamp", "info", "Axis_default", "Axis2D_default", "AXIS_BREAK_EXPAND_ACTION_TYPE", "AXIS_BREAK_COLLAPSE_ACTION_TYPE", "AXIS_BREAK_TOGGLE_ACTION_TYPE", "AXIS_BREAK_CHANGED_EVENT_TYPE", "expandAxisBreakActionInfo", "refineAxisBreakChangeEvent", "collapseAxisBreakActionInfo", "toggleAxisBreakActionInfo", "actionResultBatch", "payload", "ecModel", "api", "breaks", "each", "actionResult", "registerAction", "registers", "actionHandler", "eventBreaks", "finderResult", "parseFinder", "dealUpdate", "modelProp", "indexProp", "axisModel", "result", "item", "_a", "defaults", "PI", "DEFAULT_CENTER_NAME_MARGIN_LEVELS", "DEFAULT_ENDS_NAME_MARGIN_LEVELS", "getLabelInner", "makeInner", "getTickInner", "AxisBuilderSharedContext", "resolveAxisNameOverlap", "axisModel", "dim", "idx", "recordMap", "records", "resetOverlapRecordToShared", "cfg", "shared", "axisModel", "labelLayoutList", "axis", "record", "labelInfoList", "stOccupiedRect", "useStOccupiedRect", "hasAxisName", "isNameLocationCenter", "each", "layout", "layoutInfo", "ensureLabelLayoutWithGeometry", "transGroup", "invert", "_stTransTmp", "identity", "mul", "BoundingRect_default", "_stLabelRectTmp", "sortByDim", "sortByValue", "info1", "info2", "extent", "axisLineX", "axisLineWidth", "create", "resolveAxisNameOverlapDefault", "ctx", "nameLayoutInfo", "nameMoveDirVec", "thisRecord", "moveIfOverlap", "computeLabelGeometry2", "moveIfOverlapByLinearLabels", "basedLayoutInfo", "movableLayoutInfo", "moveDirVec", "mtv", "Point_default", "labelIntersect", "labelLayoutApplyTranslation", "baseLayoutInfoList", "baseDirVec", "sameDir", "idx", "len", "labelInfo", "AxisBuilder", "api", "opt", "Group_default", "AxisBuilderSharedContext", "ready", "raw", "axisModelDefaultOption", "axisName", "retrieve2", "nameMoveOverlapOption", "retrieve3", "transformGroup", "axisPartNameMap", "extraParams", "_this", "AXIS_BUILDER_AXIS_PART_NAMES", "partName", "builders", "axisRotation", "textRotation", "direction", "rotationDiff", "remRadian", "textAlign", "textVerticalAlign", "isRadianAroundZero", "PI", "eventData", "tooltipOpt", "local", "group", "shown", "matrix", "pt1", "pt2", "inverse", "applyTransform", "lineStyle", "extend", "pathBaseProp", "getAxisBreakHelper", "line", "Line_default", "subPixelOptimizeLine", "arrows", "arrowSize", "isString", "isNumber", "arrowOffset", "normalizeSymbolOffset", "symbolWidth_1", "symbolHeight_1", "point", "index", "symbol", "createSymbol", "r", "pt", "needCallLayout", "dealLastTickLabelResultReusable", "layOutAxisTickLabel", "AxisTickLabelComputingKind", "ticksEls", "buildAxisMajorTicks", "syncLabelIgnoreToMajorTicks", "buildAxisMinorTicks", "sharedRecord", "name", "nameLocation", "nameDirection", "textStyleModel", "gap", "gapStartEndSignal", "pos", "mt", "rotate", "nameRotation", "labelLayout", "axisNameAvailableWidth", "endTextLayout", "textFont", "truncateOpt", "ellipsis", "maxWidth", "retrieve", "nameMarginLevel", "textEl", "Text_default", "createTextStyle", "setTooltipConfig", "getECData", "nameLayout", "DEFAULT_CENTER_NAME_MARGIN_LEVELS", "DEFAULT_ENDS_NAME_MARGIN_LEVELS", "kind", "axisLabelBuildResultExists", "buildAxisLabel", "updateAxisLabelChangableProps", "adjustBreakLabels", "optionHideOverlap", "fixMinMaxLabelShow", "hideOverlap", "filter", "rotation", "textPosition", "textRotate", "onLeft", "shouldShowAllLabels", "deal", "showMinMaxLabel", "outmostLabelIdx", "innerLabelIdx", "outmostLabelLayout", "innerLabelLayout", "ignoreEl", "touchThreshold", "marginForce", "newLabelLayoutWithGeometry", "showMinLabel", "showMaxLabel", "labelsLen", "tickEls", "tickEl", "tickInner", "getTickInner", "labelInner", "getLabelInner", "el", "createTicks", "ticksCoords", "tickTransform", "tickEndCoord", "tickLineStyle", "anidPrefix", "i", "tickCoord", "inner", "tickModel", "lineStyleModel", "defaults", "tickDirection", "minorTickModel", "minorTicksCoords", "minorTickLineStyle", "minorTicksEls", "k", "axisLabelsCreationContext", "noPxChangeTryDetermine", "canDetermine", "axisLabelBuildResultSet", "show", "labelGroup", "axisLabelCreationCtx", "createAxisLabelsComputingContext", "labelModel", "labels", "labelRotation", "rawCategoryData", "labelEls", "triggerEvent", "z2Min", "z2Max", "labelItem", "_a", "tickValue", "formattedLabel", "rawLabel", "itemLabelModel", "rawCategoryItem", "isObject", "Model_default", "textColor", "align", "alignMin", "alignMax", "verticalAlign", "verticalAlignMin", "verticalAlignMax", "z2", "isFunction", "addBreakEventHandler", "map", "label", "labelMargin", "geometry", "labelEl", "copyTransform", "_tmpLayoutEl", "_tmpLayoutElReset", "setLabelLayoutDirty", "Rect_default", "visualBreak", "params", "payload", "AXIS_BREAK_EXPAND_ACTION_TYPE", "scaleBreakHelper", "getScaleBreakHelper", "breakLabelIndexPairs", "moveOverlap", "idxPair", "AxisBuilder_default", "layout", "rect", "axisModel", "opt", "axis", "otherAxisOnZeroOf", "rawAxisPosition", "axisPosition", "axisDim", "rectBound", "idx", "axisOffset", "posBound", "onZeroCoord", "dirMap", "retrieve", "labelRotate", "isCartesian2DInjectedAsDataCoordSys", "seriesModel", "findAxisModels", "axisModelMap", "each", "v", "key", "axisType", "axisModel", "SINGLE_REFERRING", "createCartesianAxisViewCommonPartBuilder", "gridRect", "cartesians", "api", "ctx", "defaultNameMoveOverlap", "layoutResult", "layout", "axisLineAutoShow", "axisTickAutoShow", "i", "isIntervalOrLogScale", "AxisBuilder_default", "updateCartesianAxisViewCommonPartBuilder", "axisBuilder", "newRaw", "oldRaw_1", "alignScaleTicks", "scale", "axisModel", "alignToScale", "_a", "intervalScaleProto", "Interval_default", "alignToTicks", "alignToNicedTicks", "alignToSplitNumber", "alignToInterval", "scaleExtent", "getScaleExtent", "rawExtent", "isMinFixed", "isMaxFixed", "logTransform", "retrieveAxisBreaksOption", "extent", "interval", "min", "max", "increaseInterval", "nicedSplitNumber", "range", "round", "t0", "t1", "ticks", "XY_TO_MARGIN_IDX", "Grid", "gridModel", "ecModel", "api", "cartesian2DDimensions", "axesMap", "updateAxisTicks", "axes", "alignTo", "axesIndices", "keys", "len", "axisNeedsAlign", "i", "idx", "axis", "model", "scale", "isIntervalOrLogScale", "niceScaleExtent", "each", "alignScaleTicks", "onZeroRecords", "xAxis", "fixAxisOnZero", "yAxis", "beforeDataProcessing", "layoutRef", "createBoxLayoutReference", "gridRect", "getLayoutRect", "coordsList", "optionContainLabel", "updateAllAxisExtentTransByGridRect", "axisBuilderSharedCtx", "createAxisBiulders", "noPxChange", "legacyLayOutGridByContainLabel", "layOutGridByOuterBounds", "_a", "prepareOuterBounds", "outerBoundsRect", "parsedOuterBoundsContain", "outerBoundsClamp", "createOrUpdateAxesView", "AxisTickLabelComputingKind", "coord", "dim", "axisIndex", "axesMapOnDim", "xAxisIndex", "yAxisIndex", "key", "isObject", "coordList", "finder", "value", "target", "seriesModel", "xAxisModel", "SINGLE_REFERRING", "yAxisModel", "cartesian", "indexOf", "grid", "point", "_this", "axisPositionUsed", "axesCount", "createAxisCreator", "Cartesian2D_default", "dimName", "axisModel", "isAxisUsedInTheGrid", "axisPosition", "Axis2D_default", "createScaleByModel", "isCategory", "categorySortInfo", "isCartesian2DInjectedAsDataCoordSys", "axesModelMap", "findAxisModels", "data", "unionExtent", "getDataDimensionsOnAxis", "baseAxes", "otherAxes", "baseAxis", "otherAxis", "grids", "injectCoordSysByOption", "coordSysProvider", "otherAxisDim", "otherAxisOnZeroOf", "onZero", "onZeroAxisIndex", "canOnZeroToAxis", "getOnZeroRecordKey", "ifAxisCrossZero", "updateAxisTransform", "coordBase", "axisExtent", "axisExtentSum", "updateAxisExtentTransByGridRect", "gridXY", "gridWH", "extent", "registerLegacyGridContainLabelImpl", "impl", "outerBoundsContain", "margin", "fillLabelNameOverflowOnOneDimension", "fillMarginOnOneDimension", "find", "item", "expandOrShrinkRect", "xyIdx", "XY", "shouldAxisShow", "sharedRecord", "labelInfoList", "labelInfo", "proportion", "getLabelInner", "nameLayout", "isNameLocationCenter", "itemRect", "overflow1", "overflow2", "WH", "applyProportion", "minIdx", "maxIdx", "mathMax", "overflow", "eqNaN", "cartesians", "AxisBuilderSharedContext", "resolveAxisNameOverlapForGrid", "axisList", "defaultNameMoveOverlap", "createCartesianAxisViewCommonPartBuilder", "kind", "isDetermine", "updateCartesianAxisViewCommonPartBuilder", "nameMarginLevelMap", "calcNameMarginLevel", "xy", "rawRridRect", "optionOuterBoundsMode", "OUTER_BOUNDS_DEFAULT", "optionOuterBoundsContain", "parsePositionSizeOption", "retrieve2", "OUTER_BOUNDS_CLAMP_DEFAULT", "cfg", "ctx", "nameLayoutInfo", "nameMoveDirVec", "thisRecord", "perpendicularDim", "resolveAxisNameOverlapDefault", "perpenRecord", "moveIfOverlapByLinearLabels", "Grid_default", "collect", "ecModel", "api", "result", "collectAxesInfo", "collectSeriesInfo", "globalTooltipModel", "globalAxisPointerModel", "linksOption", "linkGroups", "each", "coordSys", "coordSysKey", "makeKey", "axesInfoInCoordSys", "coordSysModel", "baseTooltipModel", "curry", "saveTooltipAxisInfo", "triggerAxis", "cross", "tooltipAxes", "fromTooltip", "triggerTooltip", "axis", "axisPointerModel", "axisPointerShow", "isHandleTrigger", "makeAxisPointerModel", "snap", "triggerEmphasis", "axisKey", "involveSeries", "axisInfo", "groupIndex", "getLinkGroupIndex", "linkGroup", "tooltipAxisPointerModel", "fields", "volatileOption", "field", "clone", "labelOption", "tooltipAxisPointerLabelShow", "crossStyle", "defaults", "Model_default", "seriesModel", "seriesTooltipTrigger", "seriesTooltipShow", "axisModel", "dim", "linkOption", "checkPropInLink", "linkPropValue", "axisPropValue", "isArray", "indexOf", "fixValue", "getAxisInfo", "scale", "option", "status", "value", "useHandle", "extent", "coordSysAxesInfo", "getAxisPointerModel", "model", "axisPointerClazz", "AxisView", "_super", "__extends", "_this", "axisModel", "ecModel", "api", "payload", "fixValue", "axisPointer", "forceRender", "Clazz", "axisPointerModel", "getAxisPointerModel", "type", "clazz", "Component_default", "AxisView_default", "inner", "makeInner", "rectCoordAxisBuildSplitArea", "axisView", "axisGroup", "axisModel", "gridModel", "axis", "splitAreaModel", "areaStyleModel", "areaColors", "gridRect", "ticksCoords", "areaColorsLen", "lastSplitAreaColors", "newSplitAreaColors", "createHashMap", "colorIndex", "i", "cIndex", "prev", "areaStyle", "isArray", "tickCoord", "x", "y", "width", "height", "tickValue", "Rect_default", "defaults", "rectCoordAxisHandleRemove", "selfBuilderAttrs", "CartesianAxisView", "_super", "__extends", "_this", "axisModel", "ecModel", "api", "payload", "oldAxisGroup", "Group_default", "shouldAxisShow", "each", "name", "axisElementBuilders", "isInitialSortFromBarRacing", "groupTransition", "rectCoordAxisHandleRemove", "AxisView_default", "axisView", "axisGroup", "gridModel", "axis", "splitLineModel", "lineStyleModel", "lineColors", "showMinLine", "showMaxLine", "isArray", "gridRect", "isHorizontal", "lineCount", "ticksCoords", "p1", "p2", "lineStyle", "i", "tickCoord", "tickValue", "colorIndex", "line", "Line_default", "defaults", "subPixelOptimizeLine", "minorSplitLineModel", "minorTicksCoords", "k", "rectCoordAxisBuildSplitArea", "axisBreakHelper", "getAxisBreakHelper", "scale", "CartesianXAxisView", "CartesianYAxisView", "_super", "__extends", "_this", "CartesianXAxisView", "CartesianAxisView", "GridView", "_super", "__extends", "_this", "gridModel", "ecModel", "Rect_default", "defaults", "Component_default", "extraOption", "install", "registers", "GridModel_default", "Grid_default", "axisModelCreator", "CartesianAxisModel", "CartesianXAxisView", "CartesianYAxisView", "option", "needFixJitter", "seriesModel", "axis", "coordinateSystem", "coordType", "baseAxis", "scaleType", "seriesValid", "axisValid", "inner", "makeInner", "fixJitter", "fixedAxis", "fixedCoord", "floatCoord", "radius", "Axis2D_default", "axisModel", "jitter", "jitterOverlap", "jitterMargin", "bandWidth", "fixJitterIgnoreOverlaps", "fixJitterAvoidOverlaps", "maxJitter", "actualJitter", "margin", "store", "items", "overlapA", "placeJitterOnDirection", "overlapB", "minFloat", "distance", "direction", "y", "i", "item", "dx", "dy", "d2", "r", "requiredY", "jitterLayout", "ecModel", "seriesModel", "coordSys", "baseAxis_1", "hasJitter", "needFixJitter", "data_1", "idx", "dim", "orient", "isSingleY", "layout", "rawSize", "size", "jittered", "fixJitter", "install", "registers", "use", "ScatterSeries_default", "ScatterView_default", "pointsLayout", "installScatterJitter", "jitterLayout", "radarLayout", "ecModel", "seriesModel", "data", "points", "coordSys", "axes", "each", "axis", "axisIndex", "val", "dataIndex", "point", "isValidPoint", "getValueMissingPoint", "idx", "firstPoint", "find", "radarBackwardCompat", "option", "polarOptArr", "isArray", "polarNotRadar_1", "each", "polarOpt", "idx", "seriesOpt", "RadarView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "polar", "group", "data", "oldData", "createSymbol", "idx", "symbolType", "symbolSize", "normalizeSymbolSize", "symbolPath", "symbolRotate", "updateSymbols", "oldPoints", "newPoints", "symbolGroup", "isInit", "i", "graphic_exports", "getInitialPoints", "points", "map", "pt", "polygon", "Polygon_default", "polyline", "Polyline_default", "target", "initProps", "itemGroup", "Group_default", "newIdx", "oldIdx", "saveOldStyle", "updateProps", "itemModel", "itemStyle", "color", "defaults", "setStatesStylesFromModel", "areaStyleModel", "polygonIgnore", "each", "stateName", "stateModel", "stateIgnore", "lineStyle", "areaStyle", "itemStateStyle", "clone", "emphasisModel", "Image_default", "pathStyle", "extend", "defaultText", "setLabelStyle", "getLabelStatesModels", "toggleHoverEmphasis", "Chart_default", "RadarView_default", "RadarSeriesModel", "_super", "__extends", "_this", "option", "LegendVisualProvider_default", "bind", "ecModel", "createSeriesDataSimply", "dataIndex", "multipleSeries", "dataType", "data", "coordSys", "indicatorAxes", "name", "nameToDisplay", "markerColor", "retrieveVisualColorForTooltipMarker", "createTooltipMarkup", "map", "axis", "val", "data_1", "values", "dim", "i", "len", "Series_default", "RadarSeries_default", "valueAxisDefault", "axisDefault_default", "defaultsShow", "opt", "show", "defaults", "RadarModel", "_super", "__extends", "_this", "boundaryGap", "splitNumber", "scale", "axisLine", "axisTick", "axisLabel", "nameTextStyle", "showName", "nameFormatter", "nameGap", "triggerEvent", "indicatorModels", "map", "indicatorOpt", "iNameTextStyle", "innerIndicatorOpt", "merge", "clone", "isString", "indName", "isFunction", "model", "Model_default", "mixin", "AxisModelCommonMixin", "tokens_default", "Component_default", "RadarModel_default", "RadarView", "_super", "__extends", "_this", "radarModel", "ecModel", "api", "group", "radar", "indicatorAxes", "axisBuilders", "map", "indicatorAxis", "axisName", "axisBuilder", "AxisBuilder_default", "each", "shape", "splitLineModel", "splitAreaModel", "lineStyleModel", "areaStyleModel", "showSplitLine", "showSplitArea", "splitLineColors", "splitAreaColors", "splitLineColorsArr", "isArray", "splitAreaColorsArr", "splitLines", "splitAreas", "getColorIndex", "areaOrLine", "areaOrLineColorList", "idx", "colorIndex", "ticksRadius", "cx", "cy", "i", "Circle_default", "Ring_default", "realSplitNumber_1", "axesTicksPoints", "ticksCoords", "tickCoord", "prevPoints", "points", "j", "Polyline_default", "Polygon_default", "lineStyle", "areaStyle", "mergePath", "defaults", "Component_default", "RadarView_default", "IndicatorAxis", "_super", "__extends", "dim", "scale", "radiusExtent", "_this", "Axis_default", "IndicatorAxis_default", "Radar", "radarModel", "ecModel", "api", "map", "indicatorModel", "idx", "dim", "indicatorAxis", "IndicatorAxis_default", "Interval_default", "value", "indicatorIndex", "coord", "angle", "x", "y", "pt", "dx", "dy", "radius", "radian", "minRadianDiff", "closestAxis", "closestAxisIdx", "i", "diff", "refContainer", "createBoxLayoutReference", "center", "viewSize", "parsePercent", "isString", "isNumber", "each", "indicatorAxes", "radarSeries", "data", "splitNumber", "dummyScale", "alignScaleTicks", "finder", "pixel", "point", "radarList", "radar", "Radar_default", "install", "registers", "Radar_default", "RadarModel_default", "RadarView_default", "seriesModel", "data", "idx", "install", "registers", "use", "RadarView_default", "RadarSeries_default", "radarLayout", "dataFilter", "radarBackwardCompat", "inner", "makeInner", "take", "zr", "resourceKey", "userKey", "release", "store", "uKey", "isTaken", "registerAction", "noop", "IRRELEVANT_EXCLUDES", "onIrrelevantElement", "api", "targetComponent", "eventElComponent", "eventElCoordSys", "eventElCmptZInfo", "retrieveZInfo", "targetCmptZInfo", "RoamController", "_super", "__extends", "zr", "_this", "mousedownHandler", "bind", "mousemoveHandler", "mouseupHandler", "mousewheelHandler", "pinchHandler", "controlType", "rawOpt", "zInfo", "_a", "retrieveZInfo", "z", "zlevel", "zInfoParsed", "retrieve2", "triggerInfo", "extend", "defaults", "addRoamZrListener", "removeRoamZrListener", "e", "x", "y", "opt", "onIrrelevantElement", "roamTrigger", "inArea", "forReverse", "target", "isMiddleOrRightButtonOnMouseUpDown", "eventConsumed", "el", "isTaken", "isAvailableBehavior", "cursorStyle", "oldX", "oldY", "dx", "dy", "stop", "trigger", "shouldZoom", "shouldMove", "wheelDelta", "absWheelDeltaDelta", "originX", "originY", "factor", "scale", "absDelta", "scrollDelta", "controller", "eventName", "behaviorToCheck", "contollerEvent", "Eventful_default", "innerZrStore", "makeInner", "ensureZrStore", "store", "eventType", "listener", "roam", "listenerList", "idx", "currZInfo", "ensureUniformListener", "removeUniformListener", "event", "i", "uniform", "settings", "setting", "isString", "RoamController_default", "updateViewOnPan", "controllerHost", "dx", "dy", "target", "updateViewOnZoom", "zoomDelta", "zoomX", "zoomY", "zoomLimit", "newZoom", "clampByZoomLimit", "zoomScale", "zoomTransformableByOrigin", "updateController", "seriesModel", "api", "pointerCheckerEl", "controller", "clipRect", "tmpRect", "BoundingRect_default", "e", "x", "y", "coordinate", "type", "getCenterCoord", "view", "point", "updateCenterAndZoomInAction", "payload", "previousZoom", "center", "deltaZoom", "originX", "originY", "zoom", "zoomMin", "zoomMax", "parseXML", "svg", "isString", "parser", "svgNode", "nodeParsers", "INHERITABLE_STYLE_ATTRIBUTES_MAP", "INHERITABLE_STYLE_ATTRIBUTES_MAP_KEYS", "keys", "SELF_STYLE_ATTRIBUTES_MAP", "SELF_STYLE_ATTRIBUTES_MAP_KEYS", "SVGParser", "xml", "opt", "svg", "parseXML", "root", "Group_default", "named", "viewBox", "width", "height", "parseAttributes", "child", "applyDefs", "viewBoxRect", "viewBoxTransform", "viewBoxArr", "splitNumberSequence", "makeViewBoxTransform", "elRoot", "Rect_default", "xmlNode", "parentGroup", "namedFrom", "isInDefs", "isInText", "nodeName", "el", "namedFromForSub", "parser_1", "hasOwn", "nameAttr", "newNamed", "parser", "paintServerParsers", "def", "id", "text", "TSpan_default", "inheritStyle", "applyTextAlignment", "textStyle", "fontSize", "font", "rect", "g", "circle", "Circle_default", "line", "Line_default", "ellipse", "Ellipse_default", "pointsStr", "pointsArr", "parsePoints", "polygon", "Polygon_default", "polyline", "Polyline_default", "img", "Image_default", "x", "y", "dx", "dy", "d", "path", "createFromString", "x1", "y1", "x2", "y2", "gradient", "LinearGradient_default", "parsePaintServerUnit", "parseGradientColorStops", "cx", "cy", "r", "RadialGradient_default", "gradientUnits", "stop", "offsetStr", "offset", "styleVals", "parseInlineStyle", "stopColor", "stopOpacity", "rgba", "parse", "stopColorOpacity", "parseCssFloat", "stringify", "parent", "defaults", "pointsString", "list", "points", "i", "defsUsePending", "onlyInlineStyle", "isTextGroup", "disp", "inheritedStyle", "selfStyle", "parseTransformAttribute", "parseAttributeStyle", "getFillStrokeStyle", "each", "propName", "map", "str", "parentSelfStyle", "textBaseline", "zrTextBaseline", "parentInheritedStyle", "textAlign", "zrTextAlign", "urlRegex", "method", "urlMatch", "url", "trim", "defs", "item", "numberReg", "rawStr", "transformRegex", "DEGREE_TO_ANGLE", "node", "transform", "transformOps_1", "mt", "type", "value", "valueArr", "create", "translate", "scale", "rotate", "sx", "mul", "sy", "styleRegex", "inheritableStyleResult", "selfStyleResult", "style", "styleRegResult", "svgStlAttr", "zrInheritableStlAttr", "zrSelfStlAttr", "svgAttrName", "attrValue", "boundingRect", "scaleX", "scaleY", "parseSVG", "REGION_AVAILABLE_SVG_TAG_MAP", "createHashMap", "GeoSVGResource", "mapName", "svg", "parseXML", "firstGraphic", "_a", "createRegions", "regions", "regionsMap", "svgXML", "result", "rootFromParse", "parseSVG", "assert", "e", "root", "Group_default", "svgWidth", "svgHeight", "viewBoxRect", "boundingRect", "bRectX", "bRectY", "bRectWidth", "bRectHeight", "calculatedBoundingRect", "BoundingRect_default", "viewBoxTransform", "makeViewBoxTransform", "Rect_default", "named", "each", "namedItem", "setSilent", "hostKey", "usedRootMap", "svgGraphic", "setSilent", "el", "child", "createRegions", "named", "regions", "regionsMap", "createHashMap", "each", "namedItem", "region", "GeoSVGRegion", "geoCoord", "nanhaiName", "points", "i", "k", "fixNanhai", "mapType", "regions", "GeoJSONRegion", "map", "exterior", "coordsOffsetMap", "fixTextCoords", "mapType", "region", "coordFix", "cp", "points", "fixDiaoyuIsland", "mapType", "region", "DEFAULT_NAME_PROPERTY", "GeoJSONResource", "mapName", "geoJSON", "specialAreas", "createHashMap", "parseInput", "nameMap", "nameProperty", "parsed", "rawRegions", "calculateBoundingRect", "regionsMap", "finalRegions", "each", "region", "regionName", "hasOwn", "BoundingRect_default", "parseGeoJSON", "e", "fixNanhai", "fixTextCoords", "fixDiaoyuIsland", "specialArea", "calculateBoundingRect", "regions", "rect", "i", "regionRect", "parseInput", "source", "isString", "storage", "createHashMap", "geoSourceManager_default", "mapName", "rawDef", "rawSpecialAreas", "resource", "GeoSVGResource", "geoJSON", "GeoJSONResource", "nameMap", "nameProperty", "OPTION_STYLE_ENABLED_TAGS", "OPTION_STYLE_ENABLED_TAG_MAP", "createHashMap", "STATE_TRIGGER_TAG_MAP", "LABEL_HOST_MAP", "mapLabelRaw", "makeInner", "getFixedItemStyle", "model", "itemStyle", "areaColor", "fixLineStyle", "styleHost", "style", "MapDraw", "api", "group", "Group_default", "transformGroup", "getUID", "RoamController_default", "mapOrGeoModel", "ecModel", "fromView", "payload", "isGeo", "data", "mapSeries", "geo", "regionsGroup", "transformInfo", "transformInfoRaw", "transformInfoRoam", "isFirstDraw", "clip", "clipRect", "Rect_default", "updateProps", "isVisualEncodedByVisualMap", "viewBuildCtx", "regionsGroupByName", "regionsInfoByName", "projection", "projectionStream", "transformPoint", "point", "project", "transformPolygonPoints", "inPoints", "outPoints", "i", "newPt", "getPolyShape", "points", "each", "region", "regionName", "regionGroup", "_a", "dataIdx", "regionModel", "silent", "polygonSubpaths", "polylineSubpaths", "geometry", "polys", "projectPolys", "poly", "Polygon_default", "Polyline_default", "centerPt", "createCompoundPath", "subpaths", "isLine", "compoundPath", "CompoundPath_default", "applyOptionStyleForRegion", "resetLabelForRegion", "resetEventTriggerForRegion", "resetTooltipForRegion", "resetStateTriggerForRegion", "mapName", "svgDispatcherMap", "focusSelf", "namedItem", "svgNodeTagLower", "el", "Displayable_default", "focus_1", "els", "blurStyle", "opacity_1", "setDefaultStateProxy", "name", "geoModel", "resource", "geoSourceManager_default", "svgGraphic", "controller", "controllerHost", "e", "x", "y", "mainType", "makeActionBase", "action", "updateViewOnPan", "extend", "updateViewOnZoom", "label", "mapDraw", "dataIndex", "normalStyleModel", "emphasisStyleModel", "blurStyleModel", "selectStyleModel", "normalStyle", "emphasisStyle", "selectStyle", "decal", "createOrUpdatePatternFromDecal", "labelXY", "isDataNaN", "itemLayout", "query", "labelFetcher", "specifiedTextOpt", "setLabelStyle", "getLabelStatesModels", "textEl", "rect", "eventTrigger", "getECData", "setTooltipConfig", "emphasisModel", "focus", "toggleHoverEmphasis", "enableComponentHighDownFeatures", "rings", "createStream", "polygons", "curPoly", "startPolygon", "endPolygon", "stream", "ring", "MapDraw_default", "MapView", "_super", "__extends", "_this", "mapModel", "ecModel", "api", "payload", "group", "mapDraw", "MapDraw_default", "originalData", "value", "originalDataIndex", "layout", "point", "offset", "circle", "Circle_default", "Z2_EMPHASIS_LIFT", "fullData", "name_1", "fullIndex_1", "itemModel", "labelModel", "regionGroup", "setLabelStyle", "getLabelStatesModels", "idx", "state", "toState", "setStatesFlag", "Chart_default", "MapView_default", "MapSeries", "_super", "__extends", "_this", "dataIndex", "name_1", "geo", "region", "option", "data", "createSeriesDataSimply", "curry", "makeSeriesEncodeForNameBased", "dataNameIndexMap", "createHashMap", "toAppendItems", "i", "len", "name_2", "geoSource", "geoSourceManager_default", "each", "name", "dataNameIdx", "specifiedGeoJSONRegionStyle", "dataItem", "merge", "decideCoordSysUsageKind", "CoordinateSystemUsageKind", "regionName", "multipleSeries", "dataType", "value", "seriesGroup", "seriesNames", "otherIndex", "valueDim", "createTooltipMarkup", "zoom", "center", "opt", "iconType", "icon", "createSymbol", "tokens_default", "Series_default", "MapSeries_default", "dataStatistics", "datas", "statisticType", "dataNameMap", "each", "data", "value", "idx", "mapKey", "sum", "min", "max", "len", "i", "result", "mapDataStatistic", "ecModel", "seriesGroups", "seriesModel", "hostGeoModel", "key", "seriesList", "map", "mapSymbolLayout", "ecModel", "processedMapType", "mapSeries", "mapType", "mapSymbolOffsets", "each", "subMapSeries", "geo", "data", "value", "idx", "name", "region", "offset", "point", "layout", "v2ApplyTransform", "applyTransform", "View", "_super", "__extends", "name", "opt", "_this", "Transformable_default", "x", "y", "width", "height", "BoundingRect_default", "rect", "rawTransform", "rawParent", "centerCoord", "parsePercent", "clone", "zoom", "clampByZoomLimit", "rawRect", "cx", "cy", "centerOption", "rawTransformMatrix", "roamTransform", "defaultCenter", "center", "roamTransformable", "rawTransformable", "copy", "create", "invert", "dummyTransformable", "data", "noRoam", "out", "transform", "point", "reserved", "invTransform", "ecModel", "finder", "value", "coordSys", "getCoordSys", "pixel", "seriesModel", "View_default", "GEO_DEFAULT_PARAMS", "geo2DDimensions", "Geo", "_super", "__extends", "name", "map", "opt", "_this", "createHashMap", "projection", "source", "geoSourceManager_default", "resource", "resourceType", "regions", "defaultParams", "boundingRect", "i", "regionRect", "retrieve2", "x", "y", "width", "height", "rect", "invertLongitute", "rawTransformable", "BoundingRect_default", "rawParent", "coord", "region", "geoCoord", "data", "noRoam", "out", "isString", "point", "reserved", "projected", "ecModel", "finder", "value", "coordSys", "getCoordSys", "pixel", "View_default", "mixin", "geoModel", "seriesModel", "SINGLE_REFERRING", "Geo_default", "resizeGeo", "geoModel", "api", "boundingCoords", "leftTop_1", "rightBottom_1", "projection_1", "xMin", "yMin", "xMax", "yMax", "sampleLine", "x0", "y0", "x1", "y1", "dx", "dy", "i", "p", "pt", "min", "max", "rect", "centerOption", "sizeOption", "refContainer", "createBoxLayoutReference", "aspect", "useCenterAndSize", "center", "size", "parsePercent", "viewRect", "boxLayoutOption", "getLayoutRect", "applyPreserveAspect", "setGeoCoords", "geo", "model", "each", "geoCoord", "name", "GeoCreator", "geo2DDimensions", "ecModel", "geoList", "getCommonGeoProperties", "idx", "mapName", "Geo_default", "extend", "seriesModel", "injectCoordSysByOption", "SINGLE_REFERRING", "mapModelGroupBySeries", "mapType", "mapSeries", "nameMapList", "map", "singleMapSeries", "mergeAll", "retrieve", "originRegionArr", "nameMap", "nameProperty", "regionsArr", "dataNameMap", "createHashMap", "source", "geoSourceManager_default", "region", "regionOption", "specifiedGeoJSONRegionStyle", "merge", "geoCreator", "geoCreator_default", "GeoModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "source", "geoSourceManager_default", "itemStyle", "tokens_default", "defaultEmphasis", "geoCreator_default", "selectedMap", "reduce", "optionModelMap", "regionOpt", "regionName", "Model_default", "createHashMap", "name", "status", "regionModel", "formatter", "params", "isFunction", "isString", "zoom", "center", "selectedMode", "Component_default", "GeoModel_default", "GeoView", "_super", "__extends", "_this", "ecModel", "api", "geoModel", "payload", "MapDraw_default", "mapDraw", "e", "eventData", "findEventDispatcher", "current", "getECData", "model", "node", "name", "Component_default", "GeoView_default", "registerMap", "mapName", "geoJson", "specialAreas", "geoSourceManager_default", "install", "registers", "geoCreator_default", "GeoModel_default", "GeoView_default", "makeAction", "method", "actionInfo", "payload", "ecModel", "selected", "allSelected", "geoModel", "geo", "each", "region", "names", "v", "name", "api", "componentType", "componentModel", "res", "updateCenterAndZoomInAction", "seriesModel", "install", "registers", "use", "MapView_default", "MapSeries_default", "mapSymbolLayout", "mapDataStatistic", "createLegacyDataSelectAction", "init", "inRoot", "root", "nodes", "node", "children", "n", "i", "child", "firstWalk", "separation", "siblings", "subtreeW", "executeShifts", "midPoint", "apportion", "secondWalk", "nodeX", "cb", "defaultSeparation", "radialCoordinate", "rad", "r", "shift", "change", "subtreeV", "ancestor", "nodeOutRight", "nodeInRight", "nodeOutLeft", "nodeInLeft", "sumOutRight", "sumInRight", "sumOutLeft", "sumInLeft", "nextRight", "nextLeft", "moveSubtree", "nextAncestor", "wl", "wr", "node1", "node2", "TreeEdgeShape", "TreePath", "_super", "__extends", "opts", "tokens_default", "ctx", "shape", "childPoints", "childLen", "parentPoint", "firstChildPos", "lastChildPos", "orient", "forkDim", "otherDim", "forkPosition", "parsePercent", "tmpPoint", "i", "point", "Path_default", "TreeView", "_this", "Group_default", "ecModel", "api", "RoamController_default", "seriesModel", "data", "layoutInfo", "group", "layout", "oldData", "newIdx", "symbolNeedsDraw", "updateNode", "oldIdx", "symbolEl", "removeNode", "el", "dataIndex", "points", "idx", "min", "max", "fromPoints", "oldMin", "oldMax", "viewCoordSys", "View_default", "clipRect", "updateController", "e", "nodeScale", "coordSys", "nodeScaleRatio", "groupZoom", "roamZoom", "Chart_default", "isInit", "node", "itemModel", "visualColor", "symbolInnerColor", "virtualRoot", "source", "sourceSymbolEl", "sourceLayout", "sourceOldLayout", "targetLayout", "Symbol_default", "updateProps", "symbolPath", "realRoot", "rootLayout", "length_1", "rad", "isLeft", "center", "textPosition", "normalLabelModel", "rotate", "labelRotateRadian", "textContent", "focus", "focusDataIndices", "concatArray", "getECData", "drawEdge", "toState", "parentEl", "HOVER_STATE_BLUR", "setStatesFlag", "edgeShape", "curvature", "edgeForkPosition", "lineStyle", "edge", "BezierCurve_default", "getEdgeShape", "children", "childLayout", "defaults", "setStatesStylesFromModel", "setDefaultStateProxy", "removeNodeEdge", "removeAnimationOpt", "_a", "getSourceNode", "sourceEdge", "layoutOpt", "removeElement", "childNode", "cpx1", "cpy1", "cpx2", "cpy2", "x1", "x2", "y1", "y2", "radialCoor1", "radialCoordinate", "radialCoor2", "radialCoor3", "radialCoor4", "TreeView_default", "inner", "makeInner", "linkSeriesData", "opt", "mainData", "datas", "linkAll", "each", "data", "methodName", "curry", "transferInjection", "cloneShallowInjection", "changeInjection", "assert", "res", "isMainData", "extend", "linkSingle", "dataType", "getLinkedData", "getLinkedDataAll", "map", "keys", "type", "linkSeriesData_default", "TreeNode", "name", "hostTree", "options", "cb", "context", "isFunction", "isString", "order", "children", "suppressVisitSub", "i", "depth", "height", "child", "id", "len", "res", "node", "includeSelf", "ancestors", "indices", "currNode", "childNode", "dimension", "data", "layout", "merge", "path", "itemModel", "key", "value", "parent", "Tree", "hostModel", "options", "cb", "context", "dataIndex", "rawIndex", "name", "data", "nodes", "i", "len", "dataRoot", "beforeLink", "tree", "listData", "dimMax", "buildHierarchy", "dataNode", "parentNode", "value", "isArray", "node", "TreeNode", "convertOptionIdName", "addChild", "children", "dimensions", "prepareSeriesDataSchema", "list", "SeriesData_default", "linkSeriesData_default", "child", "Tree_default", "retrieveTargetInfo", "payload", "validPayloadTypes", "seriesModel", "indexOf", "root", "targetNode", "isString", "targetNodeId", "getPathToRoot", "node", "path", "aboveViewRoot", "viewRoot", "viewPath", "wrapTreePathInfo", "treePathInfo", "nodeDataIndex", "TreeSeriesModel", "_super", "__extends", "_this", "option", "root", "leaves", "leavesModel", "Model_default", "tree", "Tree_default", "beforeLink", "nodeData", "model", "idx", "node", "treeDepth", "expandAndCollapse", "expandTreeDepth", "item", "orient", "zoom", "center", "dataIndex", "multipleSeries", "dataType", "realRoot", "value", "name", "createTooltipMarkup", "params", "wrapTreePathInfo", "tokens_default", "Series_default", "TreeSeries_default", "eachAfter", "root", "callback", "separation", "nodes", "next", "node", "children", "i", "eachBefore", "treeLayout", "ecModel", "api", "seriesModel", "commonLayout", "refContainer", "createBoxLayoutReference", "layoutInfo", "getLayoutRect", "layout", "width", "height", "separation", "node1", "node2", "virtualRoot", "realRoot", "init", "eachAfter", "firstWalk", "eachBefore", "secondWalk", "left_1", "right_1", "bottom_1", "node", "delta", "tx_1", "kx_1", "ky_1", "coorX_1", "coorY_1", "finalCoor", "radialCoordinate", "orient_1", "treeVisual", "ecModel", "seriesModel", "data", "tree", "node", "model", "style", "existsStyle", "extend", "installTreeAction", "registers", "payload", "ecModel", "seriesModel", "dataIndex", "tree", "node", "api", "coordSys", "res", "updateCenterAndZoomInAction", "install", "registers", "TreeView_default", "TreeSeries_default", "treeLayout", "treeVisual", "installTreeAction", "actionTypes", "installTreemapAction", "registers", "i", "noop", "payload", "ecModel", "handleRootToNode", "model", "index", "types", "targetInfo", "retrieveTargetInfo", "originViewRoot", "aboveViewRoot", "enableAriaDecalForTree", "seriesModel", "data", "tree", "decalPaletteScope", "node", "current", "decal", "getDecalFromPalette", "TreemapSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "root", "completeTreeValue", "levels", "designatedVisualItemStyle", "designatedVisualModel", "Model_default", "setDefault", "levelModels", "map", "levelDefine", "tree", "Tree_default", "beforeLink", "nodeData", "model", "idx", "node", "levelModel", "dataIndex", "multipleSeries", "dataType", "data", "value", "name", "createTooltipMarkup", "params", "wrapTreePathInfo", "layoutInfo", "extend", "id", "idIndexMap", "createHashMap", "index", "viewRoot", "enableAriaDecalForTree", "tokens_default", "Series_default", "dataNode", "sum", "each", "child", "childValue", "isArray", "thisValue", "globalColorList", "normalizeToArray", "globalDecalList", "hasColorDefine", "hasDecalDefine", "modelColor", "modelDecal", "level0", "TreemapSeries_default", "TEXT_PADDING", "ITEM_GAP", "ARRAY_LENGTH", "Breadcrumb", "containerGroup", "Group_default", "seriesModel", "api", "targetNode", "onSelect", "model", "thisGroup", "normalStyleModel", "emphasisModel", "textStyleModel", "emphasisTextStyleModel", "refContainer", "createBoxLayoutReference", "boxLayoutParams", "layoutParam", "availableSize", "getLayoutRect", "positionElement", "node", "text", "convertOptionIdName", "textRect", "itemWidth", "lastX", "emptyItemWidth", "height", "totalWidth", "renderList", "emphasisItemStyle", "i", "item", "itemNode", "el", "Polygon_default", "makeItemPoints", "defaults", "Text_default", "createTextStyle", "Z2_EMPHASIS_LIFT", "curry", "toggleHoverEmphasis", "packEventData", "x", "y", "itemHeight", "head", "tail", "points", "getECData", "wrapTreePathInfo", "Breadcrumb_default", "AnimationWrap", "el", "target", "duration", "delay", "easing", "callback", "_this", "count", "checkTerminate", "len", "item", "createWrap", "Group", "Group_default", "Rect", "Rect_default", "DRAG_THRESHOLD", "PATH_LABEL_NOAMAL", "PATH_UPPERLABEL_NORMAL", "Z2_BASE", "Z2_EMPHASIS_LIFT", "Z2_BG", "Z2_CONTENT", "getStateItemStyle", "makeStyleMapper", "getItemStyleNormal", "model", "itemStyle", "inner", "makeInner", "TreemapView", "_super", "__extends", "_this", "createStorage", "seriesModel", "ecModel", "api", "payload", "models", "indexOf", "types", "targetInfo", "retrieveTargetInfo", "payloadType", "layoutInfo", "isInit", "thisStorage", "reRoot", "containerGroup", "hasAnimation", "renderResult", "thisTree", "oldTree", "lastsForAnimation", "oldStorage", "willInvisibleEls", "doRenderNode", "thisNode", "oldNode", "parentGroup", "depth", "renderNode", "dualTravel", "willDeleteEls", "clearStorage", "_oldRootLayout", "rootLayout", "renderFinally", "thisViewChildren", "oldViewChildren", "sameTree", "each", "child", "index", "processNode", "DataDiffer_default", "getKey", "curry", "node", "newIndex", "oldIndex", "group", "storage", "store", "storageName", "delEls", "el", "els", "durationOption", "easingOption", "duration", "isFunction", "easing", "animationWrap", "createWrap", "rawIndex", "parent", "target", "innerStore", "targetX", "targetY", "last", "extend", "bind", "controller", "controllerHost", "RoamController_default", "e", "x", "y", "root", "mouseX", "mouseY", "zoomDelta", "rect", "BoundingRect_default", "zoomLimit", "_controllerHost", "newZoom", "zoomMin", "zoomMax", "zoomScale", "m", "create", "translate", "scale", "nodeClick", "itemModel", "link", "linkTarget", "windowOpen", "Breadcrumb_default", "aboveViewRoot", "viewRoot", "bgEl", "point", "shape", "Chart_default", "thisLayout", "data", "nodeModel", "thisWidth", "thisHeight", "borderWidth", "thisInvisible", "thisRawIndex", "oldRawIndex", "upperHeight", "isParent", "itemStyleNormalModel", "itemStyleEmphasisModel", "itemStyleBlurModel", "itemStyleSelectModel", "borderRadius", "giveGraphic", "bg", "renderBackground", "emphasisModel", "focus", "blurScope", "isDisabled", "focusOrIndices", "isHighDownDispatcher", "setAsHighDownDispatcher", "enableHoverFocus", "content", "renderContent", "cursorStyle", "useUpperLabel", "ecData", "getECData", "processInvisible", "style", "visualBorderColor", "normalStyle", "emphasisStyle", "blurStyle", "selectStyle", "upperLabelWidth", "prepareText", "setDefaultStateProxy", "contentWidth", "contentHeight", "nodeStyle", "visualColor", "element", "rectEl", "visualOpacity", "upperLabelRect", "normalLabelModel", "defaultText", "convertOptionIdName", "isShow", "setLabelStyle", "getLabelStatesModels", "textEl", "textStyle", "textPadding", "normalizeCssArray", "width", "height", "addDrillDownIcon", "textEmphasisState", "text", "iconChar", "Ctor", "z", "lasts", "prepareAnimationWhenHasOld", "Displayable_default", "calculateZ2", "prepareAnimationWhenNoOld", "lastCfg", "parentNode", "isGroup", "parentOldX", "parentOldY", "parentOldBg", "z2InLevel", "TreemapView_default", "each", "isObject", "CATEGORY_DEFAULT_VISUAL_INDEX", "VisualMapping", "option", "mappingMethod", "visualType", "thisOption", "clone", "normalizers", "visualHandler", "normalizeVisualRange", "preprocessForPiecewise", "preprocessForSpecifiedCategory", "assert", "value", "normalized", "bind", "keys", "visual", "callback", "context", "isPrimary", "newVisual", "isArray", "v", "key", "newVal", "obj", "ret", "hasVisual", "h", "visualTypes", "types_1", "item", "type", "type1", "type2", "visualType1", "visualType2", "pieceList", "findClosestWhenOutside", "possibleI", "abs", "i", "len", "pieceValue", "isString", "updatePossible", "piece", "interval", "close_1", "littleThan", "val", "index", "newAbs", "makeApplyVisual", "isNormalized", "doMapCategory", "out", "returnRGBArray", "fastLerp", "stringify", "result", "getSpecifiedVisual", "doMapFixed", "makePartialColorVisualHandler", "color", "modifyHSL", "modifyAlpha", "createNormalizedToNumericVisual", "getter", "setter", "symbolCfg", "doMapToArray", "categories", "categoryMap", "cate", "visualArr_1", "setVisualToOption", "isCategory", "visualArr", "doNotNeedPair", "applyValue", "colorChannel", "linearMap", "sourceExtent", "pieceIndex", "map", "parse", "noop", "close", "a", "b", "VisualMapping_default", "ITEM_STYLE_NORMAL", "inner", "makeInner", "treemapVisual_default", "seriesModel", "tree", "root", "travelTree", "node", "designatedVisual", "viewRootAncestors", "nodeModel", "nodeLayout", "data", "nodeItemStyleModel", "visuals", "buildVisuals", "existsStyle", "borderColor", "borderColorSaturation", "thisNodeColor", "calculateColor", "calculateBorderColor", "viewChildren", "mapping_1", "buildVisualMapping", "each", "child", "index", "childVisual", "mapVisual", "extend", "designatedVisualItemStyle", "visualName", "val", "color", "getValueVisualDefine", "colorAlpha", "colorSaturation", "modifyHSL", "modifyAlpha", "name", "value", "rangeVisual", "getRangeVisual", "visualMin", "visualMax", "dataExtent", "colorMappingBy", "opt", "mapping", "VisualMapping_default", "range", "isArray", "childVisuals", "mappingType", "mathMax", "mathMin", "retrieveValue", "retrieve", "each", "PATH_BORDER_WIDTH", "PATH_GAP_WIDTH", "PATH_UPPER_LABEL_SHOW", "PATH_UPPER_LABEL_HEIGHT", "treemapLayout_default", "seriesModel", "ecModel", "api", "payload", "seriesOption", "refContainer", "createBoxLayoutReference", "layoutInfo", "getLayoutRect", "size", "containerWidth", "parsePercent", "containerHeight", "payloadType", "types", "targetInfo", "retrieveTargetInfo", "rootRect", "viewRoot", "viewAbovePath", "getPathToRoot", "rootSize", "estimateRootSize", "sort_1", "options", "viewRootLayout_1", "squarify", "node", "index", "childValue", "extend", "treeRoot", "calculateRootPosition", "prunning", "BoundingRect_default", "hideChildren", "depth", "width", "height", "thisLayout", "nodeModel", "borderWidth", "halfGapWidth", "upperLabelHeight", "getUpperLabelHeight", "upperHeight", "layoutOffset", "layoutOffsetUpper", "totalArea", "viewChildren", "initChildren", "rect", "rowFixedLength", "best", "row", "i", "len", "child", "score", "worst", "position", "childrenVisibleMin", "orderBy", "overLeafDepth", "filter", "sort", "info", "statistic", "filterByThreshold", "area", "sum", "orderedChildren", "visibleMin", "deletePoint", "value", "a", "b", "diff", "children", "dimension", "dataExtent", "ratio", "areaMax", "areaMin", "squareArea", "f", "flush", "idx0WhenH", "idx1WhenH", "xy", "wh", "last", "rowOtherLength", "rowLen", "nodeLayout", "step", "wh1", "remain", "modWH", "wh0", "currNode", "defaultSize", "parent", "viewArea", "siblings", "currNodeValue", "parentModel", "MAX_SAFE_INTEGER", "scale", "defaultPosition", "targetNode", "layout", "targetCenter", "clipRect", "nodeInViewAbovePath", "isAboveViewRoot", "childClipRect", "model", "install", "registers", "TreemapSeries_default", "TreemapView_default", "treemapVisual_default", "treemapLayout_default", "installTreemapAction", "categoryFilter", "ecModel", "legendModels", "graphSeries", "categoriesData", "graph", "data", "categoryNames", "idx", "model", "category", "isNumber", "i", "categoryVisual", "ecModel", "paletteScope", "seriesModel", "categoriesData", "data", "categoryNameIdxMap", "idx", "name", "itemModel", "style", "symbolVisualList", "i", "symbolVisual", "model", "categoryIdx", "isString", "categoryStyle", "extend", "visualList", "normalize", "a", "graphEdgeVisual", "ecModel", "seriesModel", "graph", "edgeData", "symbolType", "symbolSize", "idx", "itemModel", "edge", "style", "existsStyle", "extend", "nodeStyle", "KEY_DELIMITER", "getAutoCurvenessParams", "seriesModel", "createCurveness", "appendLength", "autoCurvenessParmas", "length", "curvenessList", "isNumber", "isArray", "len", "i", "getKeyOfEdges", "n1", "n2", "source", "target", "getOppositeKey", "key", "keys", "getEdgeFromMap", "edge", "getTotalLengthBetweenNodes", "getEdgeMapLengthWithKey", "lenV", "edgeMap", "initCurvenessList", "createEdgeMapForCurveness", "index", "oppositeEdges", "getCurvenessForEdge", "needReverse", "autoCurvenessParams", "isArrayParam", "edgeArray", "edgeIndex", "totalLen", "curKey", "parityCorrection", "oppositeKey", "resValue", "simpleLayout", "seriesModel", "coordSys", "graph", "node", "model", "simpleLayoutEdge", "edge", "index", "curveness", "retrieve3", "getCurvenessForEdge", "p1", "clone", "p2", "points", "graphSimpleLayout", "ecModel", "api", "seriesModel", "layout", "coordSys", "data_1", "dimensions_1", "each", "coordDim", "dataIndex", "value", "hasValue", "i", "val", "simpleLayoutEdge", "simpleLayout", "getNodeGlobalScale", "seriesModel", "coordSys", "nodeScaleRatio", "groupZoom", "roamZoom", "nodeScale", "getSymbolSize", "node", "symbolSize", "PI", "_symbolRadiansHalf", "circularLayout", "seriesModel", "basedOn", "draggingNode", "pointer", "coordSys", "rect", "nodeData", "graph", "cx", "cy", "r", "count", "_a", "tempX", "tempY", "v", "normalize", "scale", "circularRotateLabel", "rotateNodeLabel", "_layoutNodesBasedOn", "edge", "index", "curveness", "retrieve3", "getCurvenessForEdge", "p1", "clone", "p2", "cp1", "x12", "y12", "angle", "sum", "unitAngle", "node", "value", "radianHalf", "sumRadian", "nodeScale", "getNodeGlobalScale", "symbolSize", "getSymbolSize", "symbolRadianHalf", "halfRemainRadian", "el", "nodeModel", "labelRotate", "symbolPath", "pos", "rad", "isLeft", "textPosition", "emphasisState", "extend", "graphCircularLayout", "ecModel", "seriesModel", "circularLayout", "scaleAndAdd", "forceLayout", "inNodes", "inEdges", "opts", "nodes", "edges", "rect", "width", "height", "center", "gravity", "i", "n", "create", "clone", "initialFriction", "friction", "beforeStepCallback", "afterStepCallback", "idx", "cb", "v12", "nLen", "e", "n1", "n2", "sub", "d", "len", "w", "normalize", "j", "set", "repFact", "v", "copy", "finished", "graphForceLayout", "ecModel", "graphSeries", "coordSys", "preservedPoints_1", "graph_1", "nodeData_1", "edgeData", "forceModel", "initLayout", "idx", "id", "simpleLayout", "circularLayout", "nodeDataExtent_1", "edgeDataExtent_1", "repulsion", "edgeLength", "repulsionArr_1", "isArray", "edgeLengthArr_1", "nodes_1", "value", "point", "rep", "linearMap", "edges", "edge", "d", "edgeModel", "curveness", "retrieve3", "getCurvenessForEdge", "rect", "forceInstance", "forceLayout", "nodes", "i", "l", "copy", "stopped", "e", "p1", "p2", "points", "getViewRect", "seriesModel", "api", "aspect", "layoutRef", "createBoxLayoutReference", "option", "extend", "viewRect", "getLayoutRect", "applyPreserveAspect", "createViewCoordSys", "ecModel", "viewList", "injectCoordSysByOption", "data", "positions", "idx", "itemModel", "min", "max", "fromPoints", "bbWidth", "bbHeight", "viewCoordSys", "View_default", "straightLineProto", "Line_default", "bezierCurveProto", "BezierCurve_default", "StraightLineShape", "CurveShape", "_super", "__extends", "isStraightLine", "shape", "ECLinePath", "opts", "_this", "tokens_default", "ctx", "t", "p", "normalize", "Path_default", "LinePath_default", "SYMBOL_CATEGORIES", "makeSymbolTypeKey", "symbolCategory", "makeSymbolTypeValue", "name", "lineData", "idx", "symbolType", "symbolSize", "symbolRotate", "symbolOffset", "symbolKeepAspect", "symbolSizeArr", "normalizeSymbolSize", "symbolOffsetArr", "normalizeSymbolOffset", "createSymbol", "symbolPath", "createLine", "points", "line", "LinePath_default", "setLinePoints", "targetShape", "cp1", "Line", "_super", "__extends", "seriesScope", "_this", "seriesModel", "linePoints", "z2", "initProps", "retrieve2", "each", "symbol", "target", "updateProps", "key", "emphasisLineStyle", "blurLineStyle", "selectLineStyle", "labelStatesModels", "emphasisDisabled", "focus", "blurScope", "itemModel", "emphasisModel", "getLabelStatesModels", "lineStyle", "visualColor", "i", "SPECIAL_STATES", "stateName", "lineState", "lineStateStyle", "state", "stateStyle", "rawVal", "setLabelStyle", "dataIndex", "tokens_default", "round", "label", "labelNormalModel", "distance", "isArray", "toggleHoverEmphasis", "enterEmphasis", "leaveEmphasis", "linePath", "lineGroup", "symbolFrom", "symbolTo", "invScale", "parentNode", "percent", "fromPos", "toPos", "sub", "normalize", "setSymbolRotation", "specifiedRotation", "tangent", "textAlign", "textVerticalAlign", "distanceX", "distanceY", "halfPercent", "n", "cp", "dir", "rotation", "dy", "Group_default", "Line_default", "LineDraw", "LineCtor", "Group_default", "Line_default", "lineData", "_this", "lineDraw", "group", "oldLineData", "seriesScope", "makeSeriesScope", "idx", "newIdx", "oldIdx", "el", "taskParams", "updateIncrementalAndHover", "isEffectObject", "itemLayout", "lineNeedsDraw", "cb", "traverseElements", "newLineData", "itemEl", "hostModel", "emphasisModel", "getLabelStatesModels", "isPointNaN", "pt", "pts", "LineDraw_default", "v1", "v2", "v3", "quadraticAt", "v2DistSquare", "distSquare", "mathAbs", "intersectCurveCircle", "curvePoints", "center", "radius", "p0", "p1", "p2", "d", "t", "radiusSquare", "interval", "_t", "diff", "i", "next", "nextDiff", "adjustEdge", "graph", "scale", "tmp0", "quadraticSubdivide", "pts", "pts2", "v", "edge", "idx", "linePoints", "fromSymbol", "toSymbol", "clone", "originalPoints", "copy", "symbolSize", "getSymbolSize", "sub", "normalize", "scaleAndAdd", "inner", "makeInner", "getThumbnailBridge", "model", "injectThumbnailBridge", "thumbnailBridge", "isViewCoordSys", "coordSys", "GraphView", "_super", "__extends", "_this", "ecModel", "api", "symbolDraw", "SymbolDraw_default", "lineDraw", "LineDraw_default", "group", "mainGroup", "Group_default", "RoamController_default", "seriesModel", "isForceLayout", "thumbnailInfo", "groupNewProp", "updateProps", "adjustEdge", "getNodeGlobalScale", "data", "edgeData", "forceLayout", "layoutAnimation", "layout", "node", "idx", "el", "itemModel", "draggable", "e", "circularLayout", "simpleLayoutEdge", "focus", "getECData", "edge", "circularRotateLabel", "cx", "cy", "rotateNodeLabel", "self", "firstRendered", "step", "stopped", "clipRect", "controller", "controllerHost", "x", "y", "params", "updateViewOnPan", "updateViewOnZoom", "nodeScale", "model", "bridge", "getThumbnailBridge", "info", "bridgeGroup", "symbolNodes", "lineNodes", "lineGroup", "symbolGroup", "i", "sub", "subShape", "clone", "shape", "extend", "style", "subThumbnail", "line", "lineThumbnail", "LinePath_default", "Chart_default", "GraphView_default", "generateNodeKey", "id", "Graph", "directed", "dataIndex", "nodesMap", "node", "GraphNode", "rawIdx", "n1", "n2", "edgesMap", "isNumber", "key", "edge", "GraphEdge", "cb", "context", "nodes", "len", "i", "edges", "startNode", "direction", "edgeType", "queue", "currentNode", "e", "otherNode", "data", "edgeData", "idx", "graph", "path", "itemModel", "dataIndices", "adjacentEdge", "connectedEdgesMap", "createHashMap", "connectedNodesMap", "sourceNodesQueue", "targetNodesQueue", "nodeIteratorIndex", "sourceNode", "sourceNodeInEdges", "j", "len_1", "inEdge", "inEdgeDataIndex", "targetNode", "targetNodeOutEdges", "len_2", "outEdge", "outEdgeDataIndex", "sourceNodes", "targetNodes", "createGraphDataProxyMixin", "hostName", "dataName", "dimension", "value", "layout", "merge", "mixin", "Graph_default", "createGraphFromNodeEdge", "nodes", "edges", "seriesModel", "directed", "beforeLink", "graph", "Graph_default", "i", "retrieve", "linkNameList", "validEdges", "linkCount", "link", "source", "target", "convertOptionIdName", "coordSys", "nodeData", "createSeriesData_default", "coordSysCtor", "CoordinateSystem_default", "coordDimensions", "indexOf", "dimensions", "prepareSeriesDataSchema", "SeriesData_default", "edgeData", "linkSeriesData_default", "GraphSeriesModel", "_super", "__extends", "_this", "option", "self", "getCategoriesData", "LegendVisualProvider_default", "defaultEmphasis", "ecModel", "edges", "nodes", "initCurvenessList", "graph", "createGraphFromNodeEdge", "beforeLink", "each", "edge", "createEdgeMapForCurveness", "nodeData", "edgeData", "model", "categoriesModels", "categoryIdx", "categoryModel", "oldGetModel", "Model_default", "newGetModel", "path", "parentModel", "resolveParentPath", "pathArr", "newPathArr", "dataIndex", "multipleSeries", "dataType", "params", "sourceName", "targetName", "nameArr", "createTooltipMarkup", "nodeMarkup", "defaultSeriesFormatTooltip", "categories", "map", "category", "extend", "categoriesData", "SeriesData_default", "idx", "zoom", "center", "tokens_default", "Series_default", "GraphSeries_default", "install", "registers", "GraphView_default", "GraphSeries_default", "categoryFilter", "categoryVisual", "graphEdgeVisual", "graphSimpleLayout", "graphCircularLayout", "graphForceLayout", "View_default", "createViewCoordSys", "noop", "payload", "ecModel", "api", "seriesModel", "graphView", "coordSys", "res", "updateCenterAndZoomInAction", "ChordPiece", "_super", "__extends", "data", "idx", "startAngle", "_this", "getECData", "text", "Text_default", "firstCreate", "sector", "node", "seriesModel", "itemModel", "emphasisModel", "layout", "shape", "extend", "getSectorCornerRadius", "el", "updateProps", "sectorShape", "setStatesStylesFromModel", "focus", "toggleHoverEmphasis", "label", "midAngle", "dx", "dy", "normalLabelModel", "labelStateModels", "getLabelStatesModels", "style", "setLabelStyle", "dataIndex", "stateName", "dataType", "labelDimIndex", "formatter", "extendParams", "retrieve3", "labelPosition", "labelPadding", "r", "align", "verticalAlign", "Sector_default", "ChordPiece_default", "ChordEdge", "_super", "__extends", "nodeData", "edgeData", "edgeIdx", "startAngle", "_this", "getECData", "ctx", "shape", "ratio", "clockwise", "firstCreate", "seriesModel", "edge", "layout", "itemModel", "edgeModel", "lineStyle", "emphasisModel", "focus", "extend", "getSectorCornerRadius", "el", "applyEdgeFill", "saveOldStyle", "updateProps", "toggleHoverEmphasis", "setStatesStylesFromModel", "Path_default", "applyEdgeFill", "edgeShape", "edge", "nodeData", "lineStyleModel", "node1", "node2", "edgeStyle", "color", "sourceColor", "targetColor", "isString", "shape", "sMidX", "sMidY", "tMidX", "tMidY", "LinearGradient_default", "RADIAN", "ChordView", "_super", "__extends", "_this", "ecModel", "api", "seriesModel", "data", "oldData", "group", "startAngle", "newIdx", "layout", "el", "ChordPiece_default", "getECData", "oldIdx", "removeElementWithFadeOut", "center", "parsePercent", "initProps", "nodeData", "edgeData", "ChordEdge", "Chart_default", "ChordView_default", "ChordSeriesModel", "_super", "__extends", "_this", "option", "LegendVisualProvider_default", "bind", "ecModel", "edges", "nodes", "graph", "createGraphFromNodeEdge", "beforeLink", "nodeData", "edgeData", "oldGetModel", "Model_default", "newGetModel", "path", "parentModel", "model", "resolveParentPath", "pathArr", "newPathArr", "dataIndex", "multipleSeries", "dataType", "params", "edge", "sourceName", "targetName", "nameArr", "createTooltipMarkup", "node", "nodeValue", "Series_default", "ChordSeries_default", "RADIAN", "chordCircularLayout", "ecModel", "api", "seriesModel", "chordLayout", "nodeData", "nodeGraph", "edgeData", "edgeCount", "_a", "getCircleLayout", "cx", "cy", "r", "r0", "padAngle", "minAngle", "startAngle", "endAngle", "clockwise", "dir", "angles", "normalizeArcAngles", "normalizedStartAngle", "normalizedEndAngle", "totalAngle", "allZero", "nodeValues", "renderedNodeCount", "edge", "value", "node1Index", "node2Index", "nodeValueSum", "node", "dataValue", "unitAngle", "totalDeficit", "totalSurplus", "totalSurplusSpan", "minSurplus", "spanAngle", "surplusAsMuchAsPossible", "scale_1", "borrowRatio", "borrowAngle", "restDeficit", "maxBorrowAngle", "angle", "edgeAccAngle", "sStartAngle", "sSpan", "sEndAngle", "s1", "s2", "tStartAngle", "tSpan", "tEndAngle", "t1", "t2", "install", "registers", "ChordView_default", "ChordSeries_default", "chordCircularLayout", "dataFilter", "PointerShape", "PointerPath", "_super", "__extends", "opts", "_this", "ctx", "shape", "mathCos", "mathSin", "r", "width", "angle", "x", "y", "Path_default", "PointerPath_default", "parsePosition", "seriesModel", "api", "center", "width", "height", "size", "cx", "parsePercent", "cy", "r", "formatLabel", "value", "labelFormatter", "label", "isString", "isFunction", "GaugeView", "_super", "__extends", "_this", "ecModel", "colorList", "posInfo", "group", "clockwise", "startAngle", "endAngle", "axisLineModel", "roundCap", "MainPath", "sausage_default", "Sector_default", "showAxis", "lineStyleModel", "axisLineWidth", "angles", "normalizeArcAngles", "angleRangeSpan", "prevEndAngle", "sectors", "i", "percent", "sector", "each", "getColor", "minVal", "maxVal", "splitLineModel", "tickModel", "labelModel", "splitNumber", "subSplitNumber", "splitLineLen", "tickLen", "angle", "step", "subStep", "splitLineStyle", "tickLineStyle", "splitLineDistance", "unitX", "unitY", "distance", "splitLine", "Line_default", "round", "autoColor", "textStyleX", "textStyleY", "rotateType", "rotate", "isNumber", "Text_default", "createTextStyle", "j", "tickLine", "oldData", "oldProgressData", "progressList", "showPointer", "progressModel", "showProgress", "data", "valueDim", "valueExtent", "angleExtent", "createPointer", "idx", "itemModel", "pointerModel", "pointerWidth", "pointerLength", "pointerStr", "pointerOffset", "pointerOffsetX", "pointerOffsetY", "pointerKeepAspect", "pointer", "createSymbol", "PointerPath_default", "createProgress", "ProgressPath", "isOverlap", "progressWidth", "r0", "progress", "linearMap", "val", "initProps", "isClip", "setCommonECData", "newIdx", "oldIdx", "previousPointer", "previousRotate", "updateProps", "previousProgress", "previousEndAngle", "emphasisModel", "focus", "blurScope", "emphasisDisabled", "symbolStyle", "visualColor", "Image_default", "pathStyle", "extend", "setStatesStylesFromModel", "toggleHoverEmphasis", "anchorModel", "showAnchor", "anchorSize", "anchorType", "offsetCenter", "anchorKeepAspect", "anchor", "contentGroup", "Group_default", "newTitleEls", "newDetailEls", "hasAnimation", "showPointerAbove", "itemGroup", "itemTitleModel", "titleOffsetCenter", "titleX", "titleY", "labelEl", "itemDetailModel", "detailOffsetCenter", "detailX", "detailY", "detailColor", "formatter_1", "setLabelValueAnimation", "animateLabelValue", "labelDataIndex", "status", "dataType", "labelDimIndex", "fmt", "extendParams", "Chart_default", "GaugeView_default", "GaugeSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesDataSimply", "tokens_default", "Series_default", "GaugeSeries_default", "install", "registers", "GaugeView_default", "GaugeSeries_default", "opacityAccessPath", "FunnelPiece", "_super", "__extends", "data", "idx", "_this", "polygon", "labelLine", "Polyline_default", "text", "Text_default", "firstCreate", "seriesModel", "itemModel", "layout", "emphasisModel", "opacity", "saveOldStyle", "initProps", "updateProps", "setStatesStylesFromModel", "toggleHoverEmphasis", "labelText", "labelLayout", "style", "visualColor", "setLabelStyle", "getLabelStatesModels", "labelModel", "labelColor", "overrideColor", "linePoints", "Point_default", "setLabelLineStyle", "getLabelLineStatesModels", "Polygon_default", "FunnelView", "ecModel", "api", "oldData", "group", "funnelPiece", "newIdx", "oldIdx", "piece", "removeElementWithFadeOut", "Chart_default", "FunnelView_default", "FunnelSeriesModel", "_super", "__extends", "_this", "option", "LegendVisualProvider_default", "bind", "ecModel", "createSeriesDataSimply", "curry", "makeSeriesEncodeForNameBased", "defaultEmphasis", "labelLineNormalOpt", "labelLineEmphasisOpt", "dataIndex", "data", "params", "valueDim", "sum", "tokens_default", "Series_default", "FunnelSeries_default", "getSortedIndices", "data", "sort", "valueDim", "valueArr", "val", "indices", "isAscending", "i", "len", "isFunction", "a", "b", "labelLayout", "seriesModel", "orient", "idx", "itemModel", "labelModel", "labelPosition", "labelLineModel", "layout", "points", "isLabelInside", "textAlign", "textX", "textY", "linePoints", "x1", "y1", "x2", "y2", "labelLineLen", "funnelLayout", "ecModel", "api", "layoutRef", "createBoxLayoutReference", "viewRect", "getLayoutRect", "viewWidth", "viewHeight", "x", "y", "sizeExtent", "parsePercent", "dataExtent", "min", "max", "funnelAlign", "gap", "viewSize", "itemSize", "getLinePoints", "offset", "val_1", "itemHeight", "linearMap", "y0", "itemWidth", "x0", "nextIdx", "width", "start", "end", "height", "install", "registers", "FunnelView_default", "FunnelSeries_default", "funnelLayout", "dataFilter", "DEFAULT_SMOOTH", "ParallelView", "_super", "__extends", "_this", "Group_default", "seriesModel", "ecModel", "api", "payload", "dataGroup", "data", "oldData", "coordSys", "dimensions", "seriesScope", "makeSeriesScope", "add", "update", "remove", "newDataIndex", "line", "addEl", "updateElCommon", "oldDataIndex", "points", "createLinePoints", "updateProps", "saveOldStyle", "clipPath", "createGridClipShape", "taskParams", "progressiveEls", "dataIndex", "Chart_default", "cb", "parallelModel", "rect", "rectEl", "Rect_default", "dim", "initProps", "i", "dimName", "value", "isEmptyValue", "Polyline_default", "smooth", "numericToNumber", "eqNaN", "el", "itemModel", "emphasisModel", "setStatesStylesFromModel", "toggleHoverEmphasis", "val", "axisType", "ParallelView_default", "ParallelSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesData_default", "bind", "makeDefaultEncode", "activeState", "coordSys", "data", "indices", "theActiveState", "dataIndex", "Series_default", "seriesModel", "parallelModel", "encodeDefine", "each", "axisDim", "dataDimIndex", "convertDimNameToNumber", "dimName", "ParallelSeries_default", "opacityAccessPath", "parallelVisual", "seriesModel", "ecModel", "coordSys", "opacityMap", "params", "data", "activeState", "dataIndex", "opacity", "itemOpacity", "existsStyle", "parallelVisual_default", "parallelPreprocessor", "option", "createParallelIfNeeded", "mergeAxisOptionFromParallel", "hasParallelSeries", "each", "seriesOpt", "axes", "normalizeToArray", "axisOption", "isObject", "parallelIndex", "parallelOption", "merge", "CLICK_THRESHOLD", "ParallelView", "_super", "__extends", "_this", "parallelModel", "ecModel", "api", "each", "handlers", "handler", "eventName", "bind", "createOrUpdate", "clear", "opt", "extend", "Component_default", "checkTrigger", "mouseDownPoint", "point", "dist", "result", "model", "behavior", "view", "triggerOn", "ParallelView_default", "ParallelModel", "_super", "__extends", "_this", "newOption", "thisOption", "merge", "model", "ecModel", "parallelIndex", "opt", "each", "name", "dimensions", "parallelAxisIndex", "axisModels", "filter", "axisModel", "Component_default", "ParallelModel_default", "ParallelAxis", "_super", "__extends", "dim", "scale", "coordExtent", "axisType", "axisIndex", "_this", "Axis_default", "ParallelAxis_default", "sliderMove", "delta", "handleEnds", "extent", "handleIndex", "minSpan", "maxSpan", "extentSpan", "restrict", "handleSpan", "originalDistSign", "getSpanSign", "extentMinSpan", "realExtent", "currDistSign", "dist", "value", "extend", "each", "mathMin", "mathMax", "mathFloor", "mathCeil", "round", "PI", "Parallel", "parallelModel", "ecModel", "api", "createHashMap", "dimensions", "parallelAxisIndex", "dim", "idx", "axisIndex", "axisModel", "axis", "ParallelAxis_default", "createScaleByModel", "isCategory", "point", "layoutInfo", "axisBase", "layoutBase", "pixelDimIndex", "pAxis", "pLayout", "seriesModel", "data", "niceScaleExtent", "refContainer", "createBoxLayoutReference", "getLayoutRect", "rect", "xy", "wh", "layout", "layoutLength", "layoutExtent", "axisCount", "axisExpandWidth", "restrict", "axisExpandCount", "axisExpandable", "axisExpandWindow", "winSize", "axisExpandCenter", "axisCollapseWidth", "winInnerIndices", "axisExpandWindow0Pos", "axes", "axisExtent", "posInfo", "layoutAxisWithExpand", "layoutAxisWithoutExpand", "positionTable", "rotationTable", "position", "rotation", "transform", "create", "rotate", "translate", "value", "callback", "start", "end", "axesMap", "dataDimensions", "axisModels", "axisDim", "hasActiveSet", "dataIndex", "activeState", "values", "j", "lenj", "state", "coord", "axisLayout", "applyTransform", "clone", "extent", "pointCoord", "delta", "behavior", "triggerArea", "useJump", "sliderMove", "winSize2", "pos", "len", "step", "axisNameAvailableWidth", "axisLabelShow", "nameTruncateMaxWidth", "Parallel_default", "createParallelCoordSys", "ecModel", "api", "coordSysList", "parallelModel", "idx", "coordSys", "Parallel_default", "seriesModel", "SINGLE_REFERRING", "parallelCoordSysCreator", "parallelCreator_default", "ParallelAxisModel", "_super", "__extends", "_this", "makeStyleMapper", "intervals", "activeIntervals", "clone", "asc", "value", "interval", "i", "len", "Component_default", "mixin", "AxisModelCommonMixin", "AxisModel_default", "BRUSH_PANEL_GLOBAL", "mathMin", "mathMax", "mathPow", "COVER_Z", "UNSELECT_THRESHOLD", "MIN_RESIZE_LINE_WIDTH", "MUTEX_RESOURCE_KEY", "DIRECTION_MAP", "CURSOR_MAP", "DEFAULT_BRUSH_OPT", "tokens_default", "baseUID", "BrushController", "_super", "__extends", "zr", "_this", "Group_default", "each", "pointerHandlers", "handler", "eventName", "bind", "brushOption", "take", "merge", "clone", "release", "panelOpts", "panels_1", "opt", "thisGroup", "coverConfigList", "map", "coverConfig", "tmpIdPrefix", "oldCovers", "newCovers", "controller", "creatingCover", "DataDiffer_default", "oldGetKey", "getKey", "addOrUpdate", "remove", "index", "cover", "newIndex", "oldIndex", "newBrushInternal", "endCreating", "createCover", "updateCoverAfterCreation", "clearCovers", "Eventful_default", "coverRenderers", "updateZ", "coverRenderer", "getCoverRenderer", "updateCoverShape", "z", "el", "getPanelByPoint", "e", "localCursorPoint", "panels", "panel", "transform", "pn", "getPanelByCover", "panelId", "covers", "originalLength", "trigger", "areas", "range", "shouldShowCover", "track", "p2", "p1", "dx", "dy", "dist", "getTrackEnds", "tail", "createBaseRectCover", "rectRangeConverter", "edgeNameSequences", "Rect_default", "makeStyle", "curry", "driftRect", "nameSequence", "updateBaseRect", "localRange", "lineWidth", "handleSize", "x", "y", "xa", "ya", "x2", "y2", "x2a", "y2a", "width", "height", "widtha", "heighta", "updateRectShape", "updateCommon", "transformable", "mainEl", "globalDir", "getGlobalDirection1", "getGlobalDirection2", "name", "w", "h", "pointsToRect", "clipByPanel", "defaults", "formatRectRange", "min", "max", "getTransform", "localDirName", "inverseMap", "dir", "transformDirection", "localDirNameSeq", "dirNameSequence", "rectRange", "localDelta", "toLocalDelta", "dirName", "ind", "driftPolygon", "point", "localD", "localZero", "data", "points", "xmin", "ymin", "xmax", "ymax", "resetCursor", "isOutsideZrArea", "currPanel", "i", "preventDefault", "rawE", "mainShapeContain", "updateCoverByMouse", "isEnd", "thisBrushOption", "eventParams", "determineBrushType", "coverBrushOption", "brushType", "handleDragEnd", "getLineRenderer", "returnInput", "localTrack", "ends", "Polyline_default", "Polygon_default", "xyIndex", "otherExtent", "BrushController_default", "makeRectPanelClipPath", "rect", "normalizeRect", "localPoints", "clipPointsByRect", "makeLinearBrushOtherExtent", "specifiedXYIndex", "xyIndex", "idx", "brushWidth", "base", "makeRectIsTargetByCursor", "api", "targetModel", "boundingRect", "e", "localCursorPoint", "onIrrelevantElement", "BoundingRect_default", "ParallelAxisView", "_super", "__extends", "_this", "ecModel", "api", "BrushController_default", "bind", "axisModel", "payload", "fromAxisAreaSelect", "oldAxisGroup", "Group_default", "coordSysModel", "getCoordSysModel", "coordSys", "areaSelectStyle", "areaWidth", "dim", "axisLayout", "builderOpt", "extend", "axisBuilder", "AxisBuilder_default", "groupTransition", "extent", "extentLen", "extra", "rect", "BoundingRect_default", "makeRectPanelClipPath", "makeRectIsTargetByCursor", "makeLinearBrushOtherExtent", "getCoverInfoList", "eventParam", "coverInfoList", "axis", "intervals", "map", "coverInfo", "Component_default", "interval", "ParallelAxisView_default", "actionInfo", "installParallelActions", "registers", "payload", "ecModel", "parallelAxisModel", "parallelModel", "defaultAxisOption", "install", "registers", "ParallelView_default", "ParallelModel_default", "parallelCreator_default", "parallelPreprocessor", "AxisModel_default", "ParallelAxisView_default", "axisModelCreator", "installParallelActions", "install", "registers", "use", "ParallelView_default", "ParallelSeries_default", "parallelVisual_default", "SankeyPathShape", "SankeyPath", "_super", "__extends", "opts", "ctx", "shape", "extent", "enterEmphasis", "leaveEmphasis", "Path_default", "SankeyView", "_this", "Group_default", "ecModel", "api", "RoamController_default", "seriesModel", "sankeyView", "graph", "mainGroup", "layoutInfo", "width", "height", "nodeData", "edgeData", "orient", "updateController", "edge", "curve", "ecData", "getECData", "edgeModel", "lineStyleModel", "curvature", "n1Layout", "node1Model", "dragX1", "dragY1", "n2Layout", "node2Model", "dragX2", "dragY2", "edgeLayout", "x1", "y1", "x2", "y2", "cpx1", "cpy1", "cpx2", "cpy2", "applyCurveStyle", "defaultEdgeLabelText", "edgeLabelStateModels", "getLabelStatesModels", "setLabelStyle", "dataIndex", "stateName", "dataType", "labelDimIndex", "formatter", "extendParams", "retrieve3", "emphasisModel", "setStatesStylesFromModel", "model", "style", "focus", "toggleHoverEmphasis", "node", "layout", "itemModel", "dragX", "dragY", "borderRadius", "rect", "Rect_default", "el", "dx", "dy", "createGridClipShape", "viewCoordSys", "View_default", "Chart_default", "curveProps", "sourceColor", "targetColor", "isString", "LinearGradient_default", "cb", "rectEl", "initProps", "SankeyView_default", "SankeySeriesModel", "_super", "__extends", "_this", "option", "ecModel", "links", "nodes", "levels", "levelModels", "i", "Model_default", "graph", "createGraphFromNodeEdge", "beforeLink", "nodeData", "edgeData", "model", "idx", "seriesModel", "layout", "nodeDepth", "levelModel", "edge", "depth", "dataIndex", "localPosition", "dataItem", "center", "zoom", "multipleSeries", "dataType", "noValue", "val", "params", "rawDataOpt", "edgeValue", "edgeName", "createTooltipMarkup", "node", "value", "name_1", "nodeValue", "tokens_default", "Series_default", "SankeySeries_default", "sankeyLayout", "ecModel", "api", "seriesModel", "nodeWidth", "nodeGap", "refContainer", "createBoxLayoutReference", "layoutInfo", "getLayoutRect", "width", "height", "graph", "nodes", "edges", "computeNodeValues", "filteredNodes", "filter", "node", "iterations", "orient", "nodeAlign", "layoutSankey", "computeNodeBreadths", "computeNodeDepths", "computeEdgeDepths", "each", "value1", "sum", "getEdgeValue", "value2", "nodeRawValue", "value", "remainEdges", "indegreeArr", "zeroIndegrees", "nextTargetNode", "x", "i", "maxNodeDepth", "idx", "item", "isItemDepth", "edgeIdx", "edge", "indexEdge", "targetNode", "nodeIndex", "maxDepth", "adjustNodeWithNodeAlign", "kx", "scaleNodeBreadths", "isNodeDepth", "nextSourceNode", "remainNodes", "nodeHeight", "j", "moveSinksRight", "nodeDepth", "nodesByBreadth", "prepareNodesByBreadth", "initializeNodeDepth", "resolveCollisions", "alpha", "relaxRightToLeft", "relaxLeftToRight", "keyAttr", "groupResult", "groupData", "a", "b", "key", "minKy", "n", "ky", "nodeDy", "edgeDy", "nodeX", "dy", "y0", "nodeDyAttr", "viewWidth", "y", "weightedTarget", "len", "centerTarget", "center", "nodeY", "weightedSource", "centerSource", "array", "cb", "sy", "ty", "sankeyVisual", "ecModel", "seriesModel", "graph", "nodes", "edges", "minValue_1", "maxValue_1", "each", "node", "nodeValue", "mapping", "VisualMapping_default", "mapValueToColor", "customColor", "edge", "edgeStyle", "install", "registers", "SankeyView_default", "SankeySeries_default", "sankeyLayout", "sankeyVisual", "payload", "ecModel", "seriesModel", "api", "coordSys", "res", "updateCenterAndZoomInAction", "WhiskerBoxCommonMixin", "key", "encodeRules", "option", "ecModel", "ordinalMeta", "xAxisModel", "yAxisModel", "xAxisType", "yAxisType", "addOrdinal", "coordDims", "baseAxisDimIndex", "baseAxisDim", "otherAxisDim", "axisModels", "baseAxisType", "otherAxisType", "data", "newOptionData_1", "each", "item", "index", "newItem", "isArray", "extend", "defaultValueDimensions", "coordDimensions", "getDimensionTypeByAxis", "createSeriesDataSimply", "curry", "makeSeriesEncodeForAxisCoordSys", "dim", "BoxplotSeriesModel", "_super", "__extends", "_this", "tokens_default", "Series_default", "mixin", "WhiskerBoxCommonMixin", "BoxplotSeries_default", "BoxplotView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "data", "group", "oldData", "constDim", "newIdx", "itemLayout", "symbolEl", "createNormalBox", "oldIdx", "saveOldStyle", "updateNormalBoxData", "el", "Chart_default", "BoxPathShape", "BoxPath", "opts", "ctx", "shape", "ends", "i", "Path_default", "dataIndex", "isInit", "transInit", "updateMethod", "graphic_exports", "itemModel", "emphasisModel", "setStatesStylesFromModel", "toggleHoverEmphasis", "points", "dim", "map", "point", "BoxplotView_default", "each", "boxplotLayout", "ecModel", "groupResult", "groupSeriesByAxis", "groupItem", "seriesModels", "calculateBase", "seriesModel", "idx", "layoutSingleSeries", "result", "axisList", "baseAxis", "indexOf", "seriesCount", "boxWidthList", "boxOffsetList", "boundList", "bandWidth", "maxDataCount_1", "extent", "boxWidthBound", "isArray", "parsePercent", "availableWidth", "boxGap", "boxWidth", "base", "offset", "coordSys", "data", "halfWidth", "cDimIdx", "vDimIdx", "coordDims", "cDim", "vDims", "dataIndex", "axisDimVal", "median", "getPoint", "end1", "end2", "end4", "end5", "ends", "addBodyEnd", "layEndLine", "dim", "val", "p", "point", "start", "point1", "point2", "endCenter", "from", "to", "prepareBoxplotData", "rawData", "opt", "boxData", "outliers", "boundIQR", "useExtreme", "i", "ascList", "asc", "Q1", "quantile", "Q2", "Q3", "min", "max", "bound", "low", "high", "itemNameFormatter", "itemName", "isFunction", "isString", "j", "dataItem", "outlier", "boxplotTransform", "params", "upstream", "SOURCE_FORMAT_ARRAY_ROWS", "errMsg", "throwError", "result", "prepareBoxplotData", "install", "registers", "BoxplotSeries_default", "BoxplotView_default", "boxplotLayout", "boxplotTransform", "positiveBorderColorQuery", "negativeBorderColorQuery", "dojiBorderColorQuery", "positiveColorQuery", "negativeColorQuery", "getColor", "sign", "model", "getBorderColor", "candlestickVisual", "createRenderPlanner", "seriesModel", "ecModel", "isLargeRender", "params", "data", "dataIndex", "itemModel", "style", "existsStyle", "extend", "candlestickVisual_default", "SKIP_PROPS", "CandlestickView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "params", "cb", "traverseElements", "isLargeDraw", "data", "oldData", "group", "isSimpleBox", "needsClip", "coord", "clipArea", "newIdx", "itemLayout", "isNormalBoxClipped", "el", "createNormalBox", "initProps", "setBoxCommon", "oldIdx", "updateProps", "saveOldStyle", "createLarge", "clipPath", "createClipPath", "dataIndex", "Chart_default", "NormalBoxPathShape", "NormalBoxPath", "opts", "ctx", "shape", "ends", "Path_default", "isInit", "transInit", "clipped", "i", "itemModel", "setStatesStylesFromModel", "sign", "each", "state", "stateName", "stateModel", "color", "getColor", "borderColor", "getBorderColor", "stateStyle", "emphasisModel", "toggleHoverEmphasis", "points", "map", "point", "LargeBoxPathShape", "LargeBoxPath", "x", "progressiveEls", "incremental", "largePoints", "elP", "elN", "elDoji", "setLargeStyle", "itemStyle", "CandlestickView_default", "CandlestickSeriesModel", "_super", "__extends", "_this", "dataIndex", "data", "selectors", "itemLayout", "Series_default", "mixin", "WhiskerBoxCommonMixin", "CandlestickSeries_default", "candlestickPreprocessor", "option", "isArray", "each", "seriesItem", "isObject", "candlestickLayout", "createRenderPlanner", "seriesModel", "coordSys", "data", "candleWidth", "calculateCandleWidth", "cDimIdx", "vDimIdx", "coordDims", "cDimI", "vDimsI", "map", "openDimI", "closeDimI", "lowestDimI", "highestDimI", "largeProgress", "normalProgress", "params", "dataIndex", "store", "axisDimVal", "openVal", "closeVal", "lowestVal", "highestVal", "ocLow", "ocHigh", "ocLowPoint", "getPoint", "ocHighPoint", "lowestPoint", "highestPoint", "ends", "addBodyEnd", "subPixelOptimizePoint", "itemModel", "hasDojiColor", "getSign", "makeBrushRect", "val", "p", "point", "start", "point1", "point2", "subPixelOptimize", "pmin", "pmax", "points", "createFloat32Array", "offset", "tmpIn", "tmpOut", "sign", "baseAxis", "extent", "bandWidth", "barMaxWidth", "parsePercent", "retrieve2", "barMinWidth", "barWidth", "candlestickLayout_default", "install", "registers", "CandlestickView_default", "CandlestickSeries_default", "candlestickPreprocessor", "candlestickVisual_default", "candlestickLayout_default", "updateRipplePath", "rippleGroup", "effectCfg", "color", "ripplePath", "EffectSymbol", "_super", "__extends", "data", "idx", "_this", "symbol", "Symbol_default", "Group_default", "symbolType", "rippleNumber", "i", "createSymbol", "delay", "oldEffectCfg", "DIFFICULT_PROPS", "propName", "enterEmphasis", "leaveEmphasis", "seriesModel", "itemModel", "symbolSize", "normalizeSymbolSize", "symbolStyle", "emphasisModel", "symbolOffset", "normalizeSymbolOffset", "symbolRotate", "toState", "toggleHoverEmphasis", "cb", "EffectSymbol_default", "EffectScatterView", "_super", "__extends", "_this", "SymbolDraw_default", "EffectSymbol_default", "seriesModel", "ecModel", "api", "data", "effectSymbolDraw", "coordSys", "clipArea", "res", "pointsLayout", "clone", "Chart_default", "EffectScatterView_default", "EffectScatterSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesData_default", "dataIndex", "data", "selectors", "Series_default", "EffectScatterSeries_default", "install", "registers", "EffectScatterView_default", "EffectScatterSeries_default", "pointsLayout", "EffectLine", "_super", "__extends", "lineData", "idx", "seriesScope", "_this", "Line_default", "itemModel", "effectModel", "size", "symbolType", "isArray", "lineStyle", "color", "symbol", "createSymbol", "points", "period", "loop", "roundTrip", "constantSpeed", "delayExpr", "retrieve", "delayNum", "isFunction", "self_1", "animator", "dist", "p1", "p2", "cp1", "t", "pos", "lastPos", "quadraticAt", "quadraticDerivativeAt", "tx", "ty", "Group_default", "EffectLine_default", "Polyline", "_super", "__extends", "lineData", "idx", "seriesScope", "_this", "points", "line", "Polyline_default", "seriesModel", "target", "updateProps", "itemModel", "emphasisLineStyle", "focus", "blurScope", "emphasisDisabled", "emphasisModel", "lineEmphasisState", "toggleHoverEmphasis", "polyline", "Group_default", "EffectPolyline", "_super", "__extends", "_this", "lineData", "idx", "seriesScope", "Polyline_default", "symbol", "points", "accLenArr", "len", "i", "p1", "p2", "dist", "t", "offsets", "lastFrame", "frame", "start", "p", "p0", "tx", "ty", "EffectLine_default", "EffectPolyline_default", "LargeLinesPathShape", "LargeLinesPath", "_super", "__extends", "opts", "_this", "tokens_default", "ctx", "shape", "segs", "curveness", "i", "count", "k", "x0", "y0", "x1", "y1", "x2", "y2", "x", "y", "lineWidth", "dataIndex", "containStroke", "localPos", "rect", "dataIdx", "points", "minX", "minY", "maxX", "maxY", "BoundingRect_default", "Path_default", "LargeLineDraw", "Group_default", "data", "lineEl", "taskParams", "lastAdded", "linePoints", "oldSegs", "oldLen", "newSegs", "cb", "isIncremental", "hostModel", "style", "ecData", "getECData", "e", "LargeLineDraw_default", "linesLayout", "createRenderPlanner", "seriesModel", "coordSys", "isPolyline", "isLarge", "params", "lineData", "lineCoords", "points", "segCount", "totalCoordsCount", "i", "offset", "pt", "len", "k", "itemModel", "pts", "j", "curveness", "linesLayout_default", "LinesView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "data", "lineDraw", "zlevel", "trailLength", "zr", "isSvg", "clipPath", "createClipPath", "taskParams", "cb", "pipelineContext", "res", "linesLayout_default", "hasEffect", "isPolyline", "isLargeDraw", "LargeLineDraw_default", "LineDraw_default", "EffectPolyline_default", "Polyline_default", "EffectLine_default", "Line_default", "Chart_default", "LinesView_default", "Uint32Arr", "Float64Arr", "compatEc2", "seriesOpt", "data", "map", "itemOpt", "coords", "target", "mergeAll", "LinesSeriesModel", "_super", "__extends", "_this", "option", "result", "params", "concatArray", "idx", "itemModel", "out", "offset", "len", "i", "startOffset", "isNumber", "coordsOffsetAndLenStorage", "coordsStorage", "coordsCursor", "offsetCursor", "dataCount", "count", "k", "x", "y", "ecModel", "CoordSys", "lineData", "SeriesData_default", "dataItem", "dimName", "dataIndex", "dimIndex", "value", "multipleSeries", "dataType", "name", "fromName", "toName", "nameArr", "createTooltipMarkup", "progressive", "progressiveThreshold", "effectModel", "trailLength", "Series_default", "LinesSeries_default", "normalize", "a", "linesVisual", "seriesModel", "symbolType", "symbolSize", "data", "dataEach", "idx", "itemModel", "linesVisual_default", "install", "registers", "LinesView_default", "LinesSeries_default", "linesLayout_default", "linesVisual_default", "GRADIENT_LEVELS", "HeatmapLayer", "canvas", "platformApi", "data", "width", "height", "normalize", "colorFunc", "isInRange", "brush", "gradientInRange", "gradientOutOfRange", "r", "ctx", "len", "i", "p", "x", "y", "value", "alpha", "imageData", "pixels", "offset", "pixelLen", "minOpacity", "maxOpacity", "diffOpacity", "gradientOffset", "gradient", "brushCanvas", "d", "tokens_default", "state", "gradientPixels", "pixelsSingleState", "color", "off", "HeatmapLayer_default", "getIsInPiecewiseRange", "dataExtent", "pieceList", "selected", "dataSpan", "map", "piece", "len", "lastIndex", "val", "i", "interval", "getIsInContinuousRange", "range", "isGeoCoordSys", "coordSys", "dimensions", "HeatmapView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "visualMapOfThisSeries", "visualMap", "targetSeries", "params", "cb", "traverseElements", "start", "end", "incremental", "isCartesian2d", "isCoordinateSystemType", "isMatrix", "width", "height", "xAxisExtent", "yAxisExtent", "xAxis", "yAxis", "group", "data", "emphasisStyle", "blurStyle", "selectStyle", "borderRadius", "labelStatesModels", "getLabelStatesModels", "emphasisModel", "focus", "blurScope", "emphasisDisabled", "dataDims", "idx", "rect", "style", "dataDimX", "dataDimY", "point", "Rect_default", "shape", "eqNaN", "layout", "itemModel", "emphasisModel_1", "rawValue", "defaultText", "setLabelStyle", "toggleHoverEmphasis", "geo", "visualMapModel", "inRangeVisuals", "outOfRangeVisuals", "hmLayer", "HeatmapLayer_default", "roamTransform", "x", "y", "x2", "y2", "dims", "points", "lng", "lat", "value", "pt", "isInRange", "img", "Image_default", "Chart_default", "HeatmapView_default", "HeatmapSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesData_default", "coordSysCreator", "CoordinateSystem_default", "tokens_default", "Series_default", "HeatmapSeries_default", "install", "registers", "HeatmapView_default", "HeatmapSeries_default", "BAR_BORDER_WIDTH_QUERY", "LAYOUT_ATTRS", "pathForLineWidth", "Circle_default", "PictorialBarView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "group", "data", "oldData", "cartesian", "baseAxis", "isHorizontal", "coordSysRect", "opt", "dataIndex", "itemModel", "getItemModel", "symbolMeta", "getSymbolMeta", "bar", "createBar", "updateCommon", "newIndex", "oldIndex", "pictorialShapeStr", "getShapeStr", "updateBar", "removeBar", "clipPath", "createClipPath", "getECData", "Chart_default", "layout", "symbolRepeat", "symbolClip", "symbolPosition", "symbolRotate", "rotation", "symbolPatternSize", "isAnimationEnabled", "prepareBarLength", "prepareSymbolSize", "prepareLineWidth", "symbolSize", "symbolOffset", "normalizeSymbolOffset", "prepareLayoutInfo", "outputSymbolMeta", "valueDim", "symbolBoundingData", "valueAxis", "zeroPx", "pxSignIdx", "boundingLength", "isArray", "symbolBoundingExtent", "convertToCoordOnAxis", "isXAxis", "isInverse", "axis", "value", "pxSign", "categoryDim", "categorySize", "parsedSymbolSize", "parsePercent", "symbolScale", "valueLineWidth", "repeatCutLength", "unitLength", "pathLen", "absBoundingLength", "symbolMargin", "retrieve", "hasEndGap", "symbolMarginNumeric", "uLenWithMargin", "endFix", "repeatSpecified", "isNumeric", "repeatTimes", "toIntTimes", "mDiff", "sizeFix", "pathPosition", "bundlePosition", "barRectShape", "extend", "clipShape", "createPath", "path", "createSymbol", "createOrUpdateRepeatSymbols", "isUpdate", "bundle", "index", "unit", "eachPath", "updateAttr", "makeTarget", "target", "position", "i", "createOrUpdateSingleSymbol", "mainPath", "createOrUpdateBarRect", "rectShape", "barRect", "Rect_default", "createOrUpdateClip", "animationModel", "updateProps", "graphic_exports", "getAnimationDelayParams", "Group_default", "labelRect", "paths", "each", "removeElement", "cb", "context", "el", "immediateAttrs", "animationAttrs", "emphasisModel", "emphasisStyle", "blurStyle", "selectStyle", "cursorStyle", "focus", "blurScope", "hoverScale", "Image_default", "pathStyle", "emphasisState", "barPositionOutside", "setLabelStyle", "getLabelStatesModels", "getDefaultLabel", "toggleHoverEmphasis", "times", "roundedTimes", "PictorialBarView_default", "PictorialBarSeriesModel", "_super", "__extends", "_this", "option", "inheritDefaultOption", "BaseBarSeries_default", "tokens_default", "PictorialBarSeries_default", "install", "registers", "PictorialBarView_default", "PictorialBarSeries_default", "curry", "layout", "createProgressiveLayout", "ThemeRiverView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "data", "self", "group", "layersSeries", "layoutInfo", "rect", "boundaryGap", "keyGetter", "item", "dataDiffer", "DataDiffer_default", "newLayersGroups", "bind", "process", "status", "idx", "oldIdx", "oldLayersGroups", "points0", "points1", "style", "indices", "j", "layout", "x", "y0", "y", "polygon", "textLayout", "labelModel", "margin", "emphasisModel", "layerGroup", "Group_default", "ECPolygon", "createGridClipShape", "updateProps", "saveOldStyle", "setLabelStyle", "getLabelStatesModels", "labelEl", "setStatesStylesFromModel", "toggleHoverEmphasis", "Chart_default", "cb", "rectEl", "Rect_default", "initProps", "ThemeRiverView_default", "DATA_NAME_INDEX", "ThemeRiverSeriesModel", "_super", "__extends", "_this", "option", "LegendVisualProvider_default", "bind", "data", "rawDataLength", "timeValueKeys", "groupResult", "groupData", "item", "layerData", "items", "key", "layerNum", "k", "name_1", "j", "timeValue", "ecModel", "singleAxisModel", "SINGLE_REFERRING", "axisType", "filterData", "filter", "dataItem", "nameList", "nameMap", "createHashMap", "count", "i", "dimensions", "prepareSeriesDataSchema", "getDimensionTypeByAxis", "list", "SeriesData_default", "lenCount", "indexArr", "timeDim", "index", "layerSeries", "index1", "index2", "dim", "value", "baseAxis", "isArray", "indices", "nestestValue", "minDist", "nearestIdx", "pointNum", "theValue", "dist", "dataIndex", "multipleSeries", "dataType", "name", "createTooltipMarkup", "Series_default", "ThemeRiverSeries_default", "themeRiverLayout", "ecModel", "api", "seriesModel", "data", "single", "layoutInfo", "rect", "boundaryGap", "axis", "parsePercent", "height", "doThemeRiverLayout", "width", "coordSys", "layerSeries", "timeDim", "valueDim", "layerPoints", "map", "singleLayer", "idx", "pt", "base", "computeBaseline", "baseLine", "ky", "n", "m", "baseY0", "j", "i", "layerNum", "pointNum", "sums", "y0", "max", "temp", "k", "l", "sum", "install", "registers", "ThemeRiverView_default", "ThemeRiverSeries_default", "themeRiverLayout", "dataFilter", "DEFAULT_SECTOR_Z", "DEFAULT_TEXT_Z", "SunburstPiece", "_super", "__extends", "node", "seriesModel", "ecModel", "api", "_this", "getECData", "text", "Text_default", "firstCreate", "sector", "itemModel", "emphasisModel", "layout", "sectorShape", "extend", "normalStyle", "decal", "createOrUpdatePatternFromDecal", "cornerRadius", "getSectorCornerRadius", "each", "SPECIAL_STATES", "stateName", "state", "itemStyleModel", "initProps", "updateProps", "saveOldStyle", "cursorStyle", "focus", "focusOrIndices", "concatArray", "toggleHoverEmphasis", "normalLabelModel", "angle", "midAngle", "dx", "dy", "label", "dataIndex", "labelMinAngle", "isNormalShown", "DISPLAY_STATES", "labelStateModel", "isNormal", "createTextStyle", "isShown", "labelPosition", "getLabelAttr", "sectorState", "labelColor", "r", "labelPadding", "textAlign", "rotateType", "flipStartAngle", "flipEndAngle", "midAngleNormal", "normalizeRadian", "needsFlip", "isRadianAroundZero", "rotate", "isNumber", "model", "name", "stateAttr", "Sector_default", "SunburstPiece_default", "ROOT_TO_NODE_ACTION", "HIGHLIGHT_ACTION", "UNHIGHLIGHT_ACTION", "installSunburstAction", "registers", "payload", "ecModel", "handleRootToNode", "model", "index", "targetInfo", "retrieveTargetInfo", "originViewRoot", "aboveViewRoot", "api", "extend", "handleHighlight", "SunburstView", "_super", "__extends", "_this", "seriesModel", "ecModel", "api", "payload", "self", "data", "virtualRoot", "newRoot", "group", "renderLabelForZeroData", "newChildren", "node", "oldChildren", "dualTravel", "renderRollUp", "DataDiffer_default", "getKey", "processNode", "curry", "newIdx", "oldIdx", "newNode", "oldNode", "doRenderNode", "removeNode", "piece", "SunburstPiece_default", "viewRoot", "e", "targetFound", "nodeClick", "itemModel", "link", "linkTarget", "windowOpen", "ROOT_TO_NODE_ACTION", "point", "treeRoot", "itemLayout", "dx", "dy", "radius", "Chart_default", "SunburstView_default", "SunburstSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "root", "completeTreeValue", "levelModels", "map", "levelDefine", "Model_default", "tree", "Tree_default", "beforeLink", "nodeData", "model", "idx", "node", "levelModel", "dataIndex", "params", "wrapTreePathInfo", "viewRoot", "enableAriaDecalForTree", "Series_default", "dataNode", "sum", "each", "child", "childValue", "isArray", "thisValue", "SunburstSeries_default", "RADIAN", "sunburstLayout", "seriesType", "ecModel", "api", "seriesModel", "center", "radius", "isArray", "width", "height", "size", "cx", "parsePercent", "cy", "r0", "r", "startAngle", "minAngle", "virtualRoot", "treeRoot", "rootDepth", "sort", "initChildren", "validDataCount", "each", "child", "sum", "unitRadian", "renderRollupNode", "levels", "rPerLevel", "clockwise", "stillShowZeroSum", "dir", "renderNode", "node", "endAngle", "value", "angle", "depth", "rStart", "rEnd", "levelModel", "r0_1", "r_1", "radius_1", "siblingAngle_1", "sortOrder", "children", "isFunction", "sortTargets", "map", "idx", "a", "b", "target", "isAsc_1", "diff", "sunburstVisual", "ecModel", "paletteScope", "pickColor", "node", "seriesModel", "treeHeight", "tokens_default", "current", "color", "isString", "lift", "data", "tree", "model", "style", "existsStyle", "extend", "install", "registers", "SunburstView_default", "SunburstSeries_default", "curry", "sunburstLayout", "dataFilter", "sunburstVisual", "installSunburstAction", "STYLE_VISUAL_TYPE", "NON_STYLE_VISUAL_PROPS", "customInnerStore", "makeInner", "CustomSeriesModel", "_super", "__extends", "_this", "option", "ecModel", "createSeriesData_default", "dataIndex", "dataType", "el", "params", "Series_default", "CustomSeries_default", "dataToCoordSize", "dataSize", "dataItem", "map", "dim", "dimIdx", "axis", "val", "halfSize", "cartesianPrepareCustom", "coordSys", "rect", "data", "bind", "dataToCoordSize", "dataSize", "dataItem", "map", "dimIdx", "val", "halfSize", "p1", "p2", "geoPrepareCustom", "coordSys", "rect", "data", "bind", "dataToCoordSize", "dataSize", "dataItem", "axis", "val", "halfSize", "singlePrepareCustom", "coordSys", "rect", "bind", "dataToCoordSize", "dataSize", "dataItem", "map", "dim", "dimIdx", "getterName", "axis", "val", "halfSize", "result", "polarPrepareCustom", "coordSys", "radiusAxis", "angleAxis", "radius", "data", "angle", "coord", "bind", "calendarPrepareCustom", "coordSys", "rect", "rangeInfo", "data", "clamp", "matrixPrepareCustom", "coordSys", "rect", "data", "opt", "isEC4CompatibleStyle", "style", "elType", "hasOwnTextContentOption", "hasOwnTextConfig", "hasOwn", "convertFromEC4CompatibleStyle", "hostStyle", "isNormal", "srcStyle", "textConfig", "textContent", "textContentStyle", "hasOwnPos", "convertEC4CompatibleRichItem", "each", "richItem", "out", "convertToEC4StyleForCustomSerise", "itemStl", "txStl", "txCfg", "isInside", "hostFill", "tokens_default", "convertToEC4RichItem", "textFillNotSet", "LEGACY_TRANSFORM_PROPS_MAP", "LEGACY_TRANSFORM_PROPS", "keys", "TRANSFORM_PROPS_MAP", "reduce", "TRANSFORMABLE_PROPS", "obj", "key", "transformPropNamesStr", "ELEMENT_ANIMATABLE_PROPS", "transitionInnerStore", "makeInner", "getElementAnimationConfig", "animationType", "el", "elOption", "parentModel", "dataIndex", "animationProp", "config", "getAnimationConfig", "userDuring", "bind", "duringCall", "extend", "applyUpdateTransition", "animatableModel", "opts", "isInit", "clearStyle", "hasAnimation", "store", "styleOpt", "transFromProps", "propsToSet", "prepareTransformAllPropsFinal", "paths", "optionPaths", "i", "path", "prepareShapeOrExtraAllPropsFinal", "prepareTransformTransitionFrom", "prepareShapeOrExtraTransitionFrom", "prepareStyleTransitionFrom", "applyPropsDirectly", "applyMiscProps", "enterFromProps_1", "each", "propName", "prop", "applyPropsTransition", "updateLeaveTo", "leaveToProps", "applyLeaveTransition", "onRemove", "parent_1", "isTransitionAll", "transition", "allPropsFinal", "animators", "animator", "model", "hasOwn", "Displayable_default", "Path_default", "tmpDuringScope", "transitionDuringAPI", "val", "shape", "style", "extra", "duringCall", "scope", "el", "latestUserDuring", "transitionInnerStore", "scopeUserDuring", "tmpDuringScope", "transitionDuringAPI", "prepareShapeOrExtraTransitionFrom", "mainAttr", "fromEl", "elOption", "transFromProps", "attrOpt", "elPropsInAttr", "transFromPropsInAttr", "transition", "attrTransition", "isTransitionAll", "extend", "transitionKeys", "normalizeToArray", "i", "key", "elVal", "indexOf", "elPropsInAttrKeys", "keys", "isNonStyleTransitionEnabled", "prepareShapeOrExtraAllPropsFinal", "allProps", "allPropsInAttr", "keysInAttr", "cloneValue", "prepareTransformTransitionFrom", "TRANSFORMABLE_PROPS", "prepareTransformAllPropsFinal", "LEGACY_TRANSFORM_PROPS", "legacyName", "xyName", "LEGACY_TRANSFORM_PROPS_MAP", "legacyArr", "prepareStyleTransitionFrom", "styleOpt", "fromElStyle", "transFromStyleProps", "styleTransition", "elTransition", "animationProps", "animationStyleProps", "styleKeys", "optVal", "isArrayLike", "getStateToRestore", "makeInner", "KEYFRAME_EXCLUDE_KEYS", "stopPreviousKeyframeAnimationAndRestore", "el", "applyKeyframeAnimation", "animationOpts", "animatableModel", "isArray", "each", "singleAnimationOpts", "keyframes", "duration", "config", "getAnimationConfig", "stateToRestore", "ELEMENT_ANIMATABLE_PROPS", "targetPropName", "animator", "endFrameIsSet", "a", "b", "kf", "animators", "kfValues", "propKeys", "keys", "filter", "key", "indexOf", "i", "savedTarget", "EMPHASIS", "NORMAL", "BLUR", "SELECT", "STATES", "PATH_ITEM_STYLE", "PATH_LABEL", "DEFAULT_TRANSITION", "GROUP_DIFF_PREFIX", "attachedTxInfoTmp", "prepareCustoms", "cartesianPrepareCustom", "geoPrepareCustom", "singlePrepareCustom", "polarPrepareCustom", "calendarPrepareCustom", "matrixPrepareCustom", "isPath", "el", "Path_default", "isDisplayable", "Displayable_default", "copyElement", "sourceEl", "targetEl", "CustomChartView", "_super", "__extends", "_this", "customSeries", "ecModel", "api", "payload", "oldData", "data", "group", "renderItem", "makeRenderItem", "newIdx", "createOrUpdateItem", "oldIdx", "applyLeaveTransition", "customInnerStore", "oldEl", "clipPath", "createClipPath", "params", "progressiveEls", "setIncrementalAndHoverLayer", "idx", "cb", "traverseElements", "eventType", "query", "packedEvent", "elementName", "Chart_default", "CustomView_default", "createEl", "elOption", "graphicType", "shape", "pathRect", "pathData", "getPathData", "makePath", "Image_default", "Text_default", "Group_default", "errMsg", "throwError", "paths", "map", "path", "Clz", "getShapeClass", "CompoundPath_default", "updateElNormal", "dataIndex", "attachedTxInfo", "seriesModel", "isInit", "stopPreviousKeyframeAnimationAndRestore", "txCfgOpt", "styleOpt", "textOptionStyle", "hasOwn", "decalPattern", "decalObj", "createOrUpdatePatternFromDecal", "applyUpdateTransition", "applyKeyframeAnimation", "updateElOnState", "state", "elStateOpt", "elDisplayable", "stateObj", "existingEmphasisState", "setDefaultStateProxy", "updateZ", "currentZ", "currentZLevel", "optZ2", "i", "updateZForEachState", "isNormal", "retrieveStateOption", "registeredRenderItem", "getCustomSeries", "coordSys", "prepareResult", "userAPI", "defaults", "value", "style", "ordinalRawValue", "styleEmphasis", "visual", "barLayout", "currentSeriesIndices", "font", "userParams", "wrapEncodeDef", "currDataIndexInside", "currItemModel", "currItemStyleModels", "currLabelModels", "seriesItemStyleModels", "seriesLabelModels", "stateName", "getItemModel", "dataIndexInside", "getItemStyleModel", "getLabelModel", "dim", "dimInfo", "dimIndex", "val", "ordinalMeta", "userProps", "visualColor", "opacity", "itemStyle", "opt", "isString", "tokens_default", "labelModel", "textStyle", "createTextStyle", "retrieve2", "getDefaultLabel", "textConfig", "createTextConfig", "preFetchFromExtra", "convertToEC4StyleForCustomSerise", "applyUserPropsAfter", "retrieve3", "extra", "key", "visualType", "STYLE_VISUAL_TYPE", "style_1", "NON_STYLE_VISUAL_PROPS", "baseAxis", "getLayoutOnAxis", "getFont", "encodeDef", "each", "dimName", "coordDim", "dataDims", "existsEl", "doCreateOrUpdateEl", "toggleHoverEmphasis", "toBeReplacedIdx", "doesElNeedRecreate", "indexOf", "doCreateOrUpdateAttachedTx", "doCreateOrUpdateClipPath", "otherStateOpt", "otherStyleOpt", "retrieveStyleOptionOnState", "mergeChildren", "elInner", "elOptionType", "elOptionShape", "elOptionStyle", "hasOwnPathData", "clipPathOpt", "processTxInfo", "txConOptNormal", "txConOptEmphasis", "txConOptBlur", "txConOptSelect", "textContent", "txConStlOptNormal", "txConOptOtherState", "stateOpt", "elType", "txCfg", "txConOpt", "isEC4CompatibleStyle", "convertResult", "convertFromEC4CompatibleStyle", "txConOptNormal_1", "info", "stateOptionNormal", "stateOption", "newChildren", "newLen", "byName", "notMerge", "diffGroupChildren", "index", "newChild", "oldChild", "child", "removeChildFromGroup", "context", "DataDiffer_default", "getKey", "processAddUpdate", "processRemove", "item", "name", "newIndex", "oldIndex", "childOption", "install", "registers", "CustomView_default", "CustomSeries_default", "inner", "makeInner", "clone", "bind", "BaseAxisPointer", "axisModel", "axisPointerModel", "api", "forceRender", "value", "status", "group", "handle", "elOption", "graphicKey", "moveAnimation", "Group_default", "doUpdateProps", "curry", "updateProps", "updateMandatoryProps", "animation", "axis", "isCategoryAxis", "useSnap", "animationThreshold", "seriesDataCount", "getAxisInfo", "axisExtent", "pointerOption", "pointerEl", "graphic_exports", "labelEl", "Text_default", "updateLabelShowHide", "zr", "handleModel", "isInit", "createIcon", "e", "stop", "handleSize", "isArray", "createOrUpdate", "getHandleTransProps", "dx", "dy", "trans", "payloadInfo", "clear", "xy", "wh", "xDimIndex", "animationModel", "el", "props", "propsEqual", "lastProps", "newProps", "isObject", "equals_1", "each", "item", "key", "silent", "z", "zlevel", "BaseAxisPointer_default", "buildElStyle", "axisPointerModel", "axisPointerType", "styleModel", "style", "buildLabelElOption", "elOption", "axisModel", "api", "labelPos", "value", "text", "getValueLabel", "labelModel", "paddings", "normalizeCssArray", "font", "textRect", "getBoundingRect", "position", "width", "height", "align", "verticalAlign", "confineInContainer", "bgColor", "createTextStyle", "viewWidth", "viewHeight", "axis", "ecModel", "seriesDataIndices", "opt", "formatter", "params_1", "getAxisRawValue", "each", "idxItem", "series", "dataIndex", "dataParams", "isString", "isFunction", "getTransformedPosition", "layoutInfo", "transform", "create", "rotate", "translate", "applyTransform", "buildCartesianSingleLabelElOption", "textLayout", "AxisBuilder_default", "makeLineShape", "p1", "p2", "xDimIndex", "makeRectShape", "xy", "wh", "makeSectorShape", "cx", "cy", "r0", "r", "startAngle", "endAngle", "CartesianAxisPointer", "_super", "__extends", "elOption", "value", "axisModel", "axisPointerModel", "api", "axis", "grid", "axisPointerType", "otherExtent", "getCartesian", "pixelValue", "elStyle", "buildElStyle", "pointerOption", "pointerShapeBuilder", "layoutInfo", "layout", "buildCartesianSingleLabelElOption", "pos", "getTransformedPosition", "transform", "delta", "axisExtent", "dimIndex", "currPosition", "cursorOtherValue", "cursorPoint", "tooltipOptions", "BaseAxisPointer_default", "opt", "targetShape", "makeLineShape", "getAxisDimIndex", "bandWidth", "span", "makeRectShape", "CartesianAxisPointer_default", "AxisPointerModel", "_super", "__extends", "_this", "tokens_default", "Component_default", "AxisPointerModel_default", "inner", "makeInner", "each", "register", "key", "api", "handler", "env_default", "zr", "initGlobalListeners", "record", "useHandler", "curry", "doEnter", "onLeave", "eventType", "cb", "e", "dis", "makeDispatchAction", "dispatchTooltipFinally", "pendings", "showLen", "hideLen", "actuallyPayload", "dispatchAction", "currTrigger", "payload", "pendingList", "unregister", "AxisPointerView", "_super", "__extends", "_this", "globalAxisPointerModel", "ecModel", "api", "globalTooltipModel", "triggerOn", "register", "currTrigger", "e", "dispatchAction", "unregister", "Component_default", "AxisPointerView_default", "findPointFromSeries", "finder", "ecModel", "point", "seriesIndex", "seriesModel", "data", "dataIndex", "queryDataIndex", "isArray", "el", "coordSys", "baseAxis", "valueAxis", "valueAxisDim", "baseAxisDim", "baseDataOffset", "baseDim", "stackedData", "map", "dim", "rect", "inner", "makeInner", "axisTrigger", "payload", "ecModel", "api", "currTrigger", "point", "finder", "dispatchAction", "bind", "coordSysAxesInfo", "illegalPoint", "findPointFromSeries", "isIllegalPoint", "inputAxesInfo", "axesInfo", "shouldHide", "outputPayload", "showValueMap", "dataByCoordSys", "updaters", "curry", "showPointer", "showTooltip", "each", "coordSys", "coordSysKey", "coordSysContainsPoint", "axisInfo", "key", "axis", "inputAxisInfo", "findInputAxisInfo", "val", "processOnAxis", "linkTriggers", "tarAxisInfo", "tarKey", "linkGroup", "srcAxisInfo", "srcKey", "srcValItem", "makeMapperParam", "updateModelActually", "dispatchTooltipActually", "dispatchHighDownActually", "newValue", "noSnap", "outputFinder", "payloadInfo", "buildPayloadsBySeries", "payloadBatch", "snapToValue", "extend", "value", "dim", "minDist", "minDiff", "series", "idx", "dataDim", "seriesNestestValue", "dataIndices", "result", "diff", "dist", "dataIndex", "axisModel", "axisPointerModel", "coordSysModel", "makeKey", "coordSysItem", "outputAxesInfo", "option", "valItem", "sampleItem", "zr", "highDownKey", "lastHighlights", "newHighlights", "batchItem", "toHighlight", "toDownplay", "i", "item", "install", "registers", "AxisView_default", "CartesianAxisPointer_default", "AxisPointerModel_default", "AxisPointerView_default", "option", "link", "isArray", "ecModel", "api", "collect", "axisTrigger", "install", "registers", "use", "PolarAxisPointer", "_super", "__extends", "elOption", "value", "axisModel", "axisPointerModel", "api", "axis", "polar", "otherAxis", "otherExtent", "coordValue", "axisPointerType", "elStyle", "buildElStyle", "pointerOption", "pointerShapeBuilder", "labelMargin", "labelPos", "getLabelPosition", "buildLabelElOption", "BaseAxisPointer_default", "coord", "axisAngle", "radiusExtent", "position", "align", "verticalAlign", "transform", "create", "rotate", "translate", "applyTransform", "labelRotation", "labelLayout", "AxisBuilder_default", "r", "cx", "cy", "makeLineShape", "bandWidth", "radian", "makeSectorShape", "PolarAxisPointer_default", "PolarModel", "_super", "__extends", "_this", "axisType", "foundAxisModel", "ecModel", "axisModel", "Component_default", "PolarModel_default", "PolarAxisModel", "_super", "__extends", "SINGLE_REFERRING", "Component_default", "mixin", "AxisModelCommonMixin", "AngleAxisModel", "_super", "__extends", "_this", "PolarAxisModel", "RadiusAxisModel", "_super", "__extends", "_this", "PolarAxisModel", "RadiusAxis", "_super", "__extends", "scale", "radiusExtent", "point", "clamp", "Axis_default", "RadiusAxis_default", "inner", "makeInner", "AngleAxis", "_super", "__extends", "scale", "angleExtent", "point", "clamp", "axis", "labelModel", "ordinalScale", "ordinalExtent", "tickCount", "tickValue", "unitSpan", "unitH", "rect", "getBoundingRect", "maxH", "dh", "interval", "cache", "lastAutoInterval", "lastTickCount", "Axis_default", "AngleAxis_default", "polarDimensions", "Polar", "name", "RadiusAxis_default", "AngleAxis_default", "point", "coord", "data", "dim", "key", "scaleType", "axes", "angleAxis", "radiusAxis", "axis", "baseAxis", "clamp", "out", "dx", "dy", "extent", "minAngle", "maxAngle", "radius", "radian", "dir", "radiusExtent", "angleExtent", "RADIAN", "EPSILON", "x", "y", "d2", "r", "r0", "ecModel", "finder", "value", "coordSys", "getCoordSys", "pixel", "seriesModel", "polarModel", "Polar_default", "resizePolar", "polar", "polarModel", "api", "center", "refContainer", "createBoxLayoutReference", "parsePercent", "radiusAxis", "size", "radius", "isArray", "parsedRadius", "updatePolarScale", "ecModel", "angleAxis", "seriesModel", "data_1", "each", "getDataDimensionsOnAxis", "dim", "niceScaleExtent", "extent", "diff", "isAngleAxisModel", "axisModel", "setAxis", "axis", "_a", "createScaleByModel", "startAngle", "endAngle", "polarCreator", "polarDimensions", "polarList", "idx", "Polar_default", "radiusAxisModel", "angleAxisModel", "SINGLE_REFERRING", "polarCreator_default", "elementList", "getAxisLineShape", "polar", "rExtent", "angle", "start", "end", "getRadiusIdx", "radiusAxis", "fixAngleOverlap", "list", "firstItem", "lastItem", "AngleAxisView", "_super", "__extends", "_this", "angleAxisModel", "ecModel", "angleAxis", "radiusExtent", "ticksAngles", "minorTickAngles", "labels", "map", "labelItem", "clone", "scale", "tickValue", "each", "name", "angelAxisElementsBuilders", "AxisView_default", "group", "lineStyleModel", "RADIAN", "angleExtent", "rId", "r0Id", "shape", "shapeType", "graphic_exports", "Ring_default", "tickModel", "tickLen", "radius", "lines", "tickAngleItem", "Line_default", "mergePath", "defaults", "tickAngles", "minorTickModel", "i", "k", "rawCategoryData", "commonLabelModel", "labelMargin", "triggerEvent", "idx", "labelModel", "r", "p", "cx", "cy", "labelTextAlign", "labelTextVerticalAlign", "rawCategoryItem", "isObject", "Model_default", "textEl", "Text_default", "AxisBuilder_default", "createTextStyle", "setTooltipConfig", "eventData", "getECData", "splitLineModel", "lineColors", "lineCount", "splitLines", "colorIndex", "minorSplitLineModel", "splitAreaModel", "areaStyleModel", "areaColors", "splitAreas", "prevAngle", "r0", "r1", "clockwise", "len", "coord", "Sector_default", "AngleAxisView_default", "selfBuilderAttrs", "RadiusAxisView", "_super", "__extends", "_this", "radiusAxisModel", "ecModel", "api", "oldAxisGroup", "newAxisGroup", "Group_default", "radiusAxis", "polar", "angleAxis", "ticksCoords", "minorTicksCoords", "axisAngle", "radiusExtent", "layout", "layoutAxis", "axisBuilder", "AxisBuilder_default", "groupTransition", "each", "name", "axisElementBuilders", "AxisView_default", "group", "splitLineModel", "lineStyleModel", "lineColors", "lineCount", "RADIAN", "angleExtent", "shapeType", "splitLines", "i", "colorIndex", "graphic_exports", "mergePath", "defaults", "minorSplitLineModel", "lines", "k", "Circle_default", "splitAreaModel", "areaStyleModel", "areaColors", "splitAreas", "prevRadius", "Sector_default", "RadiusAxisView_default", "getSeriesStackId", "seriesModel", "getAxisKey", "polar", "axis", "barLayoutPolar", "seriesType", "ecModel", "api", "lastStackCoords", "barWidthAndOffset", "calRadialBar", "filter", "data", "baseAxis", "axisKey", "stackId", "columnLayoutInfo", "columnOffset", "columnWidth", "valueAxis", "cx", "cy", "barMinHeight", "barMinAngle", "valueDim", "baseDim", "stacked", "isDimensionStacked", "clampLayout", "valueAxisModel", "startValue", "valueAxisStart", "idx", "len", "value", "baseValue", "sign", "baseCoord", "r0", "r", "startAngle", "endAngle", "radiusSpan", "angle", "angleSpan", "radius", "barSeries", "columnsMap", "each", "axisExtent", "bandWidth", "columnsOnAxis", "stacks", "barWidth", "parsePercent", "barMaxWidth", "barGap", "barCategoryGap", "result", "coordSysName", "categoryGap", "barGapPercent", "remainedWidth", "autoWidthCount", "autoWidth", "column", "stack", "maxWidth", "widthSum", "lastColumn", "offset", "barPolar_default", "angleAxisExtraOption", "radiusAxisExtraOption", "PolarView", "_super", "__extends", "_this", "Component_default", "install", "registers", "use", "AxisView_default", "PolarAxisPointer_default", "polarCreator_default", "PolarModel_default", "axisModelCreator", "AngleAxisModel", "RadiusAxisModel", "AngleAxisView_default", "RadiusAxisView_default", "curry", "barPolar_default", "layout", "axisModel", "opt", "single", "axis", "axisPosition", "orient", "rect", "rectBound", "positionMap", "r", "directionMap", "retrieve", "labelRotate", "selfBuilderAttrs", "SingleAxisView", "_super", "__extends", "_this", "axisModel", "ecModel", "api", "payload", "group", "oldAxisGroup", "Group_default", "layout", "axisBuilder", "AxisBuilder_default", "each", "name", "axisElementBuilders", "groupTransition", "rectCoordAxisHandleRemove", "AxisView_default", "axisView", "axisGroup", "axis", "splitLineModel", "lineStyleModel", "lineColors", "lineWidth", "gridRect", "isHorizontal", "splitLines", "lineCount", "ticksCoords", "p1", "p2", "i", "tickCoord", "line", "Line_default", "subPixelOptimizeLine", "colorIndex", "lineStyle", "mergePath", "defaults", "rectCoordAxisBuildSplitArea", "axisBreakHelper", "getAxisBreakHelper", "scale", "SingleAxisView_default", "SingleAxisModel", "_super", "__extends", "_this", "Component_default", "mixin", "AxisModelCommonMixin", "AxisModel_default", "SingleAxis", "_super", "__extends", "dim", "scale", "coordExtent", "axisType", "position", "_this", "point", "clamp", "Axis_default", "SingleAxis_default", "singleDimensions", "Single", "axisModel", "ecModel", "api", "dim", "axis", "SingleAxis_default", "createScaleByModel", "isCategory", "seriesModel", "data_1", "each", "niceScaleExtent", "refContainer", "createBoxLayoutReference", "getLayoutRect", "rect", "isHorizontal", "extent", "idx", "coordBase", "axisExtent", "extentSum", "coord", "point", "orient", "reserved", "out", "val", "finder", "value", "coordSys", "getCoordSys", "pixel", "singleModel", "Single_default", "create", "ecModel", "api", "singles", "axisModel", "idx", "single", "Single_default", "seriesModel", "singleAxisModel", "SINGLE_REFERRING", "singleCreator", "singleDimensions", "singleCreator_default", "XY", "WH", "SingleAxisPointer", "_super", "__extends", "elOption", "value", "axisModel", "axisPointerModel", "api", "axis", "coordSys", "otherExtent", "getGlobalExtent", "getPointDimIndex", "pixelValue", "axisPointerType", "elStyle", "buildElStyle", "pointerOption", "pointerShapeBuilder", "layoutInfo", "layout", "buildCartesianSingleLabelElOption", "position", "getTransformedPosition", "transform", "delta", "dimIndex", "axisExtent", "currPosition", "cursorOtherValue", "cursorPoint", "BaseAxisPointer_default", "targetShape", "makeLineShape", "bandWidth", "span", "makeRectShape", "rect", "SingleAxisPointer_default", "SingleView", "_super", "__extends", "_this", "Component_default", "install", "registers", "use", "AxisView_default", "SingleAxisPointer_default", "SingleAxisView_default", "AxisModel_default", "axisModelCreator", "singleCreator_default", "CalendarModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "inputPositionParams", "getLayoutParams", "mergeAndNormalizeLayoutParams", "tokens_default", "Component_default", "target", "raw", "cellSize", "cellSizeArr", "isArray", "ignoreSize", "map", "hvIdx", "sizeCalculable", "mergeLayoutParam", "CalendarModel_default", "CalendarView", "_super", "__extends", "_this", "calendarModel", "ecModel", "api", "group", "coordSys", "rangeData", "orient", "localeModel", "itemRectStyleModel", "sw", "sh", "i", "point", "rect", "Rect_default", "self", "lineStyleModel", "show", "lineWidth", "firstDay", "addPoints", "date", "points", "rs", "idx", "lineStyle", "poyline", "Polyline_default", "parsedDate", "tmpD", "formatter", "params", "isString", "formatTplSimple", "isFunction", "textEl", "position", "margin", "x", "y", "aligns", "rotate", "yearLabel", "pos", "xc", "yc", "posPoints", "name", "content", "yearText", "Text_default", "createTextStyle", "isCenter", "align", "vAlign", "monthLabel", "nameMap", "termPoints", "getLocaleModel", "axis", "labelSilent", "tmp", "firstDayPoints", "name_1", "monthText", "extend", "cellSize", "isStart", "dayLabel", "firstDayOfWeek", "dayOfWeekShort", "map", "val", "start", "parsePercent", "day", "weekText", "Component_default", "CalendarView_default", "PROXIMATE_ONE_DAY", "Calendar", "calendarModel", "ecModel", "api", "date", "parseDate", "y", "m", "mStr", "d", "dStr", "day", "n", "weeks", "whNames", "cellSize", "layoutParams", "cellNumbers", "each", "idx", "cellSizeSpecified", "whGlobal", "calendarRect", "getLayoutRect", "data", "clamp", "out", "isArray", "dayInfo", "range", "week", "nthWeek", "point", "rect", "contentRect", "BoundingRect_default", "expandOrShrinkRect", "nthX", "nthY", "finder", "value", "coordSys", "getCoordSys", "pixel", "normalizedRange", "rangeStr", "start", "firstDay", "end", "tmp", "parsedRange", "reversed", "allDay", "startDateNum", "endDateNum", "dateNum", "sign", "rangeInfo", "nthDay", "calendarList", "calendar", "mainType", "componentModel", "injectCoordSysByOption", "simpleCoordSysInjectionProvider", "seriesModel", "Calendar_default", "install", "registers", "CalendarModel_default", "CalendarView_default", "Calendar_default", "MatrixCellLayoutInfoType", "MatrixClampOption", "coordDataToAllCellLevelLayout", "coordValue", "dims", "thisDimIdx", "result", "XY", "isNumber", "resetXYLocatorRange", "out", "rg", "parseCoordRangeOption", "locOut", "reasonOut", "data", "clamp", "parseCoordRangeOptionOnOneDim", "locDimOut", "dimIdx", "dataOnDim", "coordValArr", "isArray", "len", "hasClamp", "parseCoordRangeOptionOnOneDimOnePart", "locLowerBound", "locUpperBound", "mathMax", "mathMin", "eqNaN", "partIdx", "layout", "locatorA", "locatorB", "dimCell", "cellLayoutInfoToDimCell", "isXYLocatorRangeInvalidOnDim", "locatorRange", "resolveXYLocatorRangeByCellMerge", "inOutLocatorRange", "outMergedMarkList", "mergeDefList", "mergeDefListTravelLen", "_tmpOutMergedMarkList", "idx", "expanded", "mergeDef", "expandXYLocatorRangeIfIntersect", "thisLocRange", "otherLocRange", "locatorRangeIntersectOneDim", "locRange1OneDim", "locRange2OneDim", "fillIdSpanFromLocatorRange", "owner", "cloneXYLocatorRange", "target", "source", "xyLocatorRangeToRectOneDim", "oneDimOut", "locRange", "layoutMin", "layoutMax", "WH", "setDimXYValue", "valueOnThisDim", "valueOnOtherDim", "cellLayoutInfo", "createNaNRectLike", "MatrixDim", "dim", "dimModel", "createUniqueValueGenerator", "dimModelData", "isArray", "self", "_cells", "_levels", "sameLocatorCellsLists", "_cellCount", "traverseInitCells", "postInitCells", "firstLeafLocator", "level", "totalSpan", "each", "option", "optionIdx", "invalidOption", "cellOption", "isString", "isObject", "cell", "MatrixCellLayoutInfoType", "Point_default", "setDimXYValue", "createNaNRectLike", "childrenSpan", "subSpan", "XY", "categories", "locator", "val", "ordinalMeta", "OrdinalMeta_default", "Ordinal_default", "idx", "leaf", "value", "ordinalNumber", "levelsLen", "dimIdx", "levelOptionList", "levelCfg", "it", "startLocator", "count", "ListIterator", "len", "startIdx", "outRect", "layout", "WH", "ordinal", "eqNaN", "createUniqueValueGenerator", "dim", "dimUpper", "defaultValReg", "dupBase", "calcDupBase", "val", "matchResult", "mathMax", "makeUniqueValue", "ensureValueUnique", "categories", "cells", "cateMap", "createHashMap", "idx", "value", "defaults", "MatrixBodyCorner", "kind", "bodyOrCornerModel", "dims", "self", "_cellMap", "createHashMap", "fillCellMap", "parsedList", "cellOptionList", "isArray", "each", "option", "idx", "isObject", "locatorRange", "resetXYLocatorRange", "reasonArr", "parseCoordRangeOption", "MatrixClampOption", "isXYLocatorRangeInvalidOnDim", "cellMergeOwner", "parsed", "Point_default", "fillIdSpanFromLocatorRange", "mergedMarkList", "parsedIdx", "resolveXYLocatorRangeByCellMerge", "newOption", "extend", "newParsed", "topLeftCell", "ensureBodyOrCornerCell", "createNaNRectLike", "yidx", "xidx", "cell", "x", "y", "key", "makeCellMapKey", "xy", "cb", "_tmpERBCMLocator", "inSpanOf", "cloneXYLocatorRange", "list", "_tmpERBCMLocator", "makeCellMapKey", "x", "y", "defaultLabelOption", "tokens_default", "makeDefaultCellItemStyleOption", "isCorner", "defaultDimOption", "defaultBodyOption", "defaultCornerOption", "defaultMatrixOption", "MatrixModel", "_super", "__extends", "_this", "dimModels", "MatrixDimensionModel", "xDim", "MatrixDim", "yDim", "dims", "MatrixBodyCorner", "Model_default", "dim", "Component_default", "MatrixModel_default", "MatrixModel", "round", "Z2_BACKGROUND", "Z2_OUTER_BORDER", "Z2_BODY_CORNER_CELL_DEFAULT", "Z2_DIMENSION_CELL_DEFAULT", "MatrixView", "_super", "__extends", "_this", "matrixModel", "ecModel", "group", "coordSys", "rect", "xDimModel", "yDimModel", "xDim", "yDim", "renderDimensionCells", "createBodyAndCorner", "borderZ2Option", "outerBorderZ2", "retrieve2", "dividerLineZ2", "bgStyle", "borderStyle", "bgRect", "createMatrixRect", "borderRect", "xDimCell0", "yDimCell0", "createMatrixLine", "Component_default", "renderOnDimension", "dimIdx", "thisDimModel", "XY", "thisDim", "thisDimBgStyleModel", "thisDimLabelModel", "tooltipOption", "xyLocator", "it_1", "dimCell", "shape", "BoundingRect_default", "set", "createMatrixCell", "createBodyOrCornerCells", "bodyCornerOptionRoot", "bodyOrCorner", "dimForCoordX", "dimForCoordY", "parentCellModel", "Model_default", "parentItemStyleModel", "parentLabelModel", "itx", "ListIterator", "ity", "xLayout", "yLayout", "bodyCornerCell", "bodyCornerCellOption", "cellOption", "textValue", "zrCellDefault", "_a", "_tmpCellItemStyleModel", "_tmpCellModel", "z2", "tooltipOptionShow", "cellRect", "cursorOption", "cellText", "text", "_tmpCellLabelModel", "setLabelStyle", "clone", "style", "clipShape", "expandOrShrinkRect", "_tmpInnerTextTrans", "invert", "Rect_default", "setTooltipConfig", "labelSilent", "rectSilent", "clearTmpModel", "lineWidth", "x2Original", "y2Original", "subPixelOptimize", "Line_default", "MatrixView_default", "Matrix", "matrixModel", "ecModel", "api", "models", "matrixList", "matrix", "mainType", "componentModel", "injectCoordSysByOption", "simpleCoordSysInjectionProvider", "dims", "dimModels", "rect", "getLayoutRect", "layOutUnitsOnDimension", "layOutDimCellsRestInfoByUnit", "layOutBodyCornerCellMerge", "data", "opt", "out", "_dtpOutDataToLayout", "outRect", "outLocRange", "resetXYLocatorRange", "isArray", "parseCoordRangeOption", "retrieve2", "MatrixClampOption", "xyLocatorRangeToRectOneDim", "point", "pointToDataOneDimPrepareCtx", "_tmpCtxPointToData", "CtxPointToDataAreaType", "pointToDataOnlyHeaderFillOut", "pointToDataBodyCornerFillOut", "finder", "value", "coordSys", "getCoordSys", "pixel", "createNaNRectLike", "_ptdLevelIt", "ListIterator", "_ptdDimCellIt", "matrixRect", "dimIdx", "otherDimIdx", "thisDim", "XY", "otherDim", "otherDimShow", "it_1", "it_2", "restSize", "WH", "restCellsCount", "tmpLevelModel", "Model_default", "it_3", "layOutSpecified", "tmpCellModel", "it_4", "MatrixCellLayoutInfoType", "item", "sizeOption", "size", "parseSizeOption", "eqNaN", "confineSize", "computedCellWH", "notAlignToBigmost", "currXY", "maxLocator", "it", "layOutUnspecified", "it_5", "dimCell", "layOutRectOneDimBasedOnUnit", "bodyOrCorner", "cell", "computedSpan", "layoutRect", "id", "span", "locator", "dim", "layoutUnit", "layoutUnit2", "sizeNum", "parsePositionSizeOption", "sizeLimit", "seriesModel", "ctx", "clamp", "bodyMaxUnit", "body0Unit", "cornerMinUnit", "cornerMinus1Unit", "coord", "mathMin", "mathMax", "pxLoc0", "pxMin", "pxMax", "partialOut", "isCoordInRect", "isCoordInLayoutInfo", "Matrix_default", "install", "registers", "MatrixModel_default", "MatrixView_default", "Matrix_default", "setKeyInfoToNewElOption", "resultItem", "newElOption", "existElOption", "newElParentOption", "isSetLoc", "obj", "props", "isSet", "each", "prop", "mergeNewElOptionToExist", "existList", "index", "newElOptCopy", "extend", "$action", "newType", "merge", "mergeLayoutParam", "copyLayoutParams", "copyTransitionInfo", "TRANSITION_PROPS_TO_COPY", "ROOT_TRANSITION_PROPS_TO_COPY", "target", "source", "targetProp", "setLayoutInfoToExist", "existItem", "existingGroupOpt", "newGroupOpt", "GraphicComponentModel", "_super", "__extends", "_this", "option", "ecModel", "elements", "newOption", "isInit", "thisOption", "newList", "flattenedList", "mappingResult", "mappingToExists", "elOptionsToUpdate", "filter", "item", "optionList", "result", "parentOption", "children", "els", "Component_default", "nonShapeGraphicElements", "Group_default", "Image_default", "Text_default", "inner", "makeInner", "GraphicComponentView", "_super", "__extends", "_this", "createHashMap", "graphicModel", "ecModel", "api", "elOptionsToUpdate", "elMap", "rootGroup", "globalZ", "globalZLevel", "each", "elOption", "id", "convertOptionIdName", "elExisting", "parentId", "targetElParent", "elType", "elOptionStyle", "textContentOption", "textConfig", "isEC4CompatibleStyle", "convertResult", "convertFromEC4CompatibleStyle", "elOptionCleaned", "getCleanedElOption", "$action", "isMerge", "isReplace", "isInit", "el_1", "createEl", "stopPreviousKeyframeAnimationAndRestore", "applyUpdateTransition", "updateCommonAttrs", "removeEl", "el_2", "updateLeaveTo", "el", "textContentExisting", "clipPathOption", "clipPathType", "clipPath", "oldClipPath", "newEl", "applyKeyframeAnimation", "elInner", "setEventData", "setTooltipConfig", "elOptions", "apiWidth", "apiHeight", "xy", "i", "parentEl", "isParentRoot", "parentElInner", "parsePercent", "containerInfo", "layoutPos", "layouted", "positionElement", "transition", "animatePos", "k", "key", "val", "isTransitionAll", "indexOf", "updateProps", "Component_default", "newEl", "graphicType", "Clz", "hasOwn", "nonShapeGraphicElements", "getShapeClass", "el", "inner", "createEl", "id", "targetElParent", "elMap", "removeEl", "elExisting", "elOption", "graphicModel", "existElParent", "applyLeaveTransition", "updateCommonAttrs", "defaultZ", "defaultZlevel", "each", "Displayable_default", "item", "prop", "retrieve2", "keys", "key", "val", "isFunction", "getCleanedElOption", "extend", "LOCATION_PARAMS", "name", "setEventData", "eventData", "getECData", "install", "registers", "GraphicComponentModel", "GraphicComponentView", "option", "graphicOption", "isArray", "DATA_ZOOM_AXIS_DIMENSIONS", "SERIES_COORDS", "isCoordSupported", "seriesModel", "coordType", "indexOf", "getAxisMainType", "axisDim", "findEffectedDataZooms", "ecModel", "payload", "axisRecords", "createHashMap", "effectedModels", "effectedModelMap", "dataZoomModel", "addToEffected", "foundNewLink", "processSingle", "isLinked", "dataZoom", "markAxisControlled", "isLink", "axisDim", "axisIndex", "axisIdxArr", "collectReferCoordSysModelInfo", "coordSysInfoWrap", "axisModel", "getAxisMainType", "coordSysModel", "coordSysUid", "coordSysInfo", "DataZoomAxisInfo", "axisCmptIdx", "DataZoomModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "inputRawOption", "retrieveRawOption", "newOption", "merge", "thisOption", "settledOption", "each", "names", "index", "optionOrient", "targetAxisIndexMap", "createHashMap", "hasAxisSpecified", "axisInfo", "DATA_ZOOM_AXIS_DIMENSIONS", "axisDim", "refering", "getAxisMainType", "MULTIPLE_REFERRING", "axisModel", "orient", "needAuto", "axisModels", "setParallelAxis", "gridModel_1", "SINGLE_REFERRING", "axModel", "dim", "globalOption", "rangePropMode", "rangeModeInOption", "percentSpecified", "valueSpecified", "firstAxisModel", "axisIndex", "callback", "context", "opt", "name", "axisProxy", "firstProxy", "axisDimList", "i", "j", "proxy", "Component_default", "ret", "DataZoomModel_default", "SelectDataZoomModel", "_super", "__extends", "_this", "DataZoomModel_default", "SelectZoomModel_default", "DataZoomView", "_super", "__extends", "_this", "dataZoomModel", "ecModel", "api", "payload", "Component_default", "DataZoomView_default", "SelectDataZoomView", "_super", "__extends", "_this", "DataZoomView_default", "SelectZoomView_default", "each", "asc", "AxisProxy", "dimName", "axisIndex", "dataZoomModel", "ecModel", "seriesModels", "seriesModel", "isCoordSupported", "axisMainType", "getAxisMainType", "axisModel", "SINGLE_REFERRING", "clone", "opt", "dataExtent", "scale", "rangePropMode", "percentExtent", "percentWindow", "valueWindow", "hasPropModeValue", "prop", "idx", "boundPercent", "boundValue", "linearMap", "spans", "restrictSet", "fromWindow", "toWindow", "fromExtent", "toExtent", "toValue", "suffix", "sliderMove", "i", "targetSeries", "calculateDataExtent", "dataWindow", "api", "axisDim", "filterMode", "seriesData", "dataDims", "store_1", "dataDimIndices_1", "map", "dim", "dataIndex", "leftOut", "rightOut", "hasValue", "value", "thisHasValue", "thisLeftOut", "thisRightOut", "isInWindow", "range", "minMaxSpan", "minMax", "percentSpan", "valueSpan", "precision", "getPixelPrecision", "rawExtentInfo", "axisProxy", "unionAxisExtentFromData", "rawExtentResult", "ensureScaleRawExtentInfo", "AxisProxy_default", "dataZoomProcessor", "ecModel", "eachAxisModel", "cb", "dataZoomModel", "axisDim", "axisIndex", "axisModel", "getAxisMainType", "proxyList", "AxisProxy_default", "seriesModelMap", "createHashMap", "each", "axisProxy", "seriesModel", "api", "percentRange", "valueRange", "dataZoomProcessor_default", "installDataZoomAction", "registers", "payload", "ecModel", "effectedModels", "findEffectedDataZooms", "each", "dataZoomModel", "installed", "installCommon", "registers", "dataZoomProcessor_default", "installDataZoomAction", "install", "registers", "SelectZoomModel_default", "SelectZoomView_default", "installCommon", "ToolboxFeature", "features", "registerFeature", "name", "ctor", "getFeature", "ToolboxModel", "_super", "__extends", "_this", "ecModel", "each", "featureOpt", "featureName", "Feature", "getFeature", "merge", "tokens_default", "Component_default", "ToolboxModel_default", "makeBackground", "rect", "componentModel", "padding", "normalizeCssArray", "style", "bgRect", "Rect_default", "ToolboxView", "_super", "__extends", "toolboxModel", "ecModel", "api", "payload", "group", "itemSize", "isVertical", "featureOpts", "features", "featureNames", "each", "opt", "name", "DataDiffer_default", "processFeature", "curry", "newIndex", "oldIndex", "featureName", "oldName", "featureOpt", "featureModel", "Model_default", "feature", "isUserFeatureName", "Feature", "getFeature", "getUID", "isToolboxFeature", "ToolboxFeature", "createIconPaths", "iconName", "status", "option", "iconPaths", "enterEmphasis", "leaveEmphasis", "iconStyleModel", "iconStyleEmphasisModel", "icons", "titles", "iconsMap", "titlesMap", "isString", "iconStr", "path", "createIcon", "pathEmphasisState", "textContent", "Text_default", "getFont", "setTooltipConfig", "hoverStyle", "defaultTextPosition", "tokens_default", "bind", "refContainer", "createBoxLayoutReference", "boxLayoutParams", "padding", "viewRect", "getLayoutRect", "box", "positionElement", "makeBackground", "icon", "titleText", "emphasisState", "emphasisTextConfig", "emphasisTextState", "isFunction", "emphasisTextStyle", "rect", "getBoundingRect", "offsetX", "offsetY", "needPutOnTop", "topOffset", "Component_default", "ToolboxView_default", "SaveAsImage", "_super", "__extends", "ecModel", "api", "model", "title", "isSvg", "type", "url", "tokens_default", "browser", "env_default", "$a", "evt", "parts", "base64Encoded", "bstr", "filename", "n", "u8arr", "blob", "frame", "cw", "doc", "lang", "html", "tab", "defaultOption", "ToolboxFeature", "SaveAsImage_default", "INNER_STACK_KEYWORD", "radioTypes", "MagicType", "_super", "__extends", "model", "availableIcons", "icons", "each", "type", "ecModel", "defaultOption", "api", "seriesIndex", "seriesOptGenreator", "newOption", "generateNewSeriesTypes", "seriesModel", "seriesType", "seriesId", "newSeriesOpt", "defaults", "coordSys", "categoryAxis", "axisDim", "axisType", "axisModel", "SINGLE_REFERRING", "axisIndex", "i", "radio", "indexOf", "item", "newTitle", "currentType", "merge", "ToolboxFeature", "isStack", "INNER_STACK_KEYWORD", "registerAction", "payload", "MagicType_default", "BLOCK_SPLITER", "ITEM_SPLITER", "groupSeries", "ecModel", "seriesGroupByCategoryAxis", "otherSeries", "meta", "seriesModel", "coordSys", "baseAxis", "key", "assembleSeriesWithCategoryAxis", "groups", "tables", "each", "group", "categoryAxis", "valueAxis", "valueAxisDim", "headers", "map", "series", "columns", "rawData", "val", "lines", "i", "items", "j", "assembleOtherSeries", "data", "vals", "argLen", "dataIndex", "name", "getContentFromModel", "result", "filter", "str", "trim", "isTSVFormat", "block", "firstLine", "itemSplitRegex", "parseTSVContents", "tsv", "tsvLines", "categories", "header", "parseListContents", "seriesName", "line", "name_1", "value", "hasName", "parseContents", "blockMetaList", "blocks", "newOption", "idx", "blockMeta", "axisKey", "DataView", "_super", "__extends", "api", "container", "model", "root", "tokens_default", "lang", "viewMain", "textarea", "optionToContent", "contentToOption", "isFunction", "htmlOrDom", "isString", "isDom", "style", "buttonContainer", "buttonStyle", "closeButton", "refreshButton", "self", "close", "addEventListener", "e", "defaultOption", "ToolboxFeature", "tryMergeDataOption", "newData", "originalData", "newVal", "original", "isObject", "isArray", "newValIsObject", "shouldDeleteName", "defaults", "registerAction", "payload", "newSeriesOptList", "seriesOpt", "extend", "DataView_default", "each", "inner", "makeInner", "push", "ecModel", "newSnapshot", "storedSnapshots", "getStoreSnapshots", "batchItem", "dataZoomId", "i", "snapshot", "dataZoomModel", "percentRange", "pop", "head", "clear", "count", "store", "RestoreOption", "_super", "__extends", "ecModel", "api", "clear", "defaultOption", "ToolboxFeature", "registerAction", "payload", "Restore_default", "INCLUDE_FINDER_MAIN_TYPES", "BrushTargetManager", "finder", "ecModel", "opt", "_this", "foundCpts", "parseFinder", "each", "targetInfoBuilders", "builder", "type", "indexOf", "areas", "area", "coordRange", "coordSys", "result", "coordConvert", "diffProcessor", "cb", "targetInfo", "rangeOffset", "getScales", "api", "getDefaultBrushType", "map", "rect", "makeRectPanelClipPath", "makeRectIsTargetByCursor", "makeLinearBrushOtherExtent", "seriesModel", "targetInfoList", "i", "areaPanelId", "j", "targetInfoMatchers", "formatMinMax", "minMax", "xAxisModels", "yAxisModels", "gridModels", "gridModelMap", "createHashMap", "xAxesHas", "yAxesHas", "axisModel", "gridModel", "grid", "cartesians", "cartesian", "index", "panelRectBuilders", "geoModel", "xAxisModel", "yAxisModel", "getTransform", "curry", "axisConvert", "to", "rangeOrCoordRange", "clamp", "xminymin", "xmaxymax", "values", "xyMinMax", "item", "p", "axisNameIndex", "axis", "axisDiffProcessor", "refer", "scales", "idx", "xyMinMaxCurr", "xyMinMaxOrigin", "sizeCurr", "getSize", "sizeOrigin", "BrushTargetManager_default", "each", "DATA_ZOOM_ID_BASE", "makeInternalComponentId", "DataZoomFeature", "_super", "__extends", "featureModel", "ecModel", "api", "payload", "BrushController_default", "bind", "updateZoomBtnStatus", "updateBackBtnStatus", "type", "handlers", "eventParam", "areas", "snapshot", "brushTargetManager", "BrushTargetManager_default", "makeAxisFinder", "area", "coordRange", "coordSys", "brushType", "setBatch", "push", "dimName", "minMax", "axis", "axisModel", "dataZoomModel", "findDataZoom", "minMaxSpan", "sliderMove", "found", "dzModel", "has", "batch", "each", "batchItem", "dataZoomId", "clone", "defaultOption", "tokens_default", "ToolboxFeature", "nextActive", "pop", "dzFeatureModel", "setting", "count", "view", "zoomActive", "panels", "targetInfo", "registerInternalOptionCreator", "toolboxModel", "featureDataZoomPath", "dzOptions", "finder", "finderResult", "parseFinder", "buildInternalOptions", "axisMainType", "axisIndexPropName", "axisIndex", "newOpt", "DATA_ZOOM_ID_BASE", "DataZoom_default", "install", "registers", "ToolboxModel_default", "ToolboxView_default", "registerFeature", "SaveAsImage_default", "MagicType_default", "DataView_default", "DataZoom_default", "Restore_default", "use", "TooltipModel", "_super", "__extends", "_this", "tokens_default", "Component_default", "TooltipModel_default", "shouldTooltipConfine", "tooltipModel", "confineOption", "testStyle", "styleProps", "env_default", "style", "i", "len", "TRANSFORM_VENDOR", "TRANSITION_VENDOR", "toCSSVendorPrefix", "styleVendor", "styleProp", "toCamelCase", "idx", "getComputedStyle", "el", "stl", "CSS_TRANSITION_VENDOR", "toCSSVendorPrefix", "TRANSITION_VENDOR", "CSS_TRANSFORM_VENDOR", "TRANSFORM_VENDOR", "gCssText", "env_default", "mirrorPos", "pos", "assembleArrow", "tooltipModel", "borderColor", "arrowPosition", "isString", "backgroundColor", "borderWidth", "convertToColorString", "arrowPos", "arrowSize", "positionStyle", "transformStyle", "rotateDeg", "indexOf", "rotateRadian", "arrowWH", "rotatedWH", "arrowOffset", "borderStyle", "styleCss", "assembleTransition", "duration", "onlyFadeTransition", "enableDisplayTransition", "transitionCurve", "transitionOption", "transitionText", "assembleTransform", "x", "y", "toString", "x0", "y0", "is3d", "translate", "assembleFont", "textStyleModel", "cssText", "fontSize", "color", "lineHeight", "retrieve2", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY", "each", "name", "val", "assembleCssText", "enableTransition", "transitionDuration", "padding", "getPaddingFromTooltipModel", "boxShadow", "borderName", "camelCase", "toCamelCase", "normalizeCssArray", "makeStyleCoord", "out", "zr", "container", "zrX", "zrY", "zrPainter", "zrViewportRoot", "transformLocalCoord", "viewportRootOffset", "TooltipHTMLContent", "api", "opt", "el", "appendTo", "isDom", "isFunction", "self", "e", "handler", "normalizeEvent", "position", "getComputedStyle", "domStyle", "alwaysShowContent", "nearPointColor", "style", "styleCoord", "content", "markers", "arrow", "shouldTooltipConfine", "isArray", "i", "arrowEl", "enterable", "style_1", "transforms", "transform", "ratioX", "ratioY", "_this", "time", "bind", "transformLocalCoordClear", "parentNode", "TooltipHTMLContent_default", "TooltipRichContent", "api", "makeStyleCoord", "tooltipModel", "alwaysShowContent", "content", "markupStyleCreator", "borderColor", "arrowPosition", "_this", "isObject", "throwError", "textStyleModel", "Text_default", "getPaddingFromTooltipModel", "each", "propName", "self", "enterable", "el", "bounding", "shadowOuterSize", "calcShadowOuterSize", "x", "y", "styleCoord", "style", "borderWidth", "mathMaxWith0", "ratioX", "ratioY", "time", "bind", "val", "shadowBlur", "shadowOffsetX", "shadowOffsetY", "out", "zr", "zrX", "zrY", "TooltipRichContent_default", "proxyRect", "Rect_default", "TooltipView", "_super", "__extends", "_this", "ecModel", "api", "env_default", "tooltipModel", "renderMode", "getTooltipRenderMode", "TooltipRichContent_default", "TooltipHTMLContent_default", "tooltipContent", "createOrUpdate", "clear", "triggerOn", "register", "bind", "currTrigger", "e", "dispatchAction", "self_1", "payload", "makeDispatchAction", "dataByCoordSys", "cmptRef", "findComponentReference", "rect", "el", "getECData", "pointInfo", "findPointFromSeries", "cx", "cy", "seriesIndex", "dataIndex", "coordSysAxesInfo", "seriesModel", "data", "tooltipCascadedModel", "buildTooltipModel", "ecData", "seriesDispatcher_1", "cmptDispatcher_1", "findEventDispatcher", "target", "cb", "delay", "globalTooltipModel", "point", "singleTooltipModel", "cbParamsList", "articleMarkup", "createTooltipMarkup", "markupTextArrLegacy", "markupStyleCreator", "TooltipMarkupStyleCreator", "each", "itemCoordSys", "axisItem", "axisModel", "axisValue", "axisValueLabel", "getValueLabel", "axisSectionMarkup", "trim", "idxItem", "series", "cbParams", "getAxisRawValue", "convertToColorString", "seriesTooltipResult", "normalizeTooltipFormatResult", "frag", "valueFormatter", "extend", "positionExpr", "orderMode", "builtMarkupText", "buildTooltipMarkup", "blockBreak", "allMarkupText", "dispatcher", "dataModel", "dataType", "positionDefault", "tooltipTrigger", "params", "markupText", "asyncTicket", "isHTMLRenderMode", "tooltipConfig", "tooltipOpt", "encodeHTMLContent", "isString", "content", "clone", "encodeHTML", "tooltipModelCascade", "cmpt", "subTooltipModel", "defaultHtml", "formatterParams", "x", "y", "formatter", "html", "nearPoint", "nearPointColor", "useUTC", "params0", "isArray", "isTimeAxis", "format", "formatTpl", "isFunction", "callback", "cbTicket", "tooltipDataParams", "trigger", "borderColor", "defaultBorderColor", "viewWidth", "viewHeight", "contentSize", "align", "vAlign", "parsePercent", "isObject", "boxLayoutPosition", "layoutRect", "getLayoutRect", "pos", "calcTooltipPosition", "refixTooltipPosition", "isCenterAlign", "shouldTooltipConfine", "confineTooltipPosition", "lastCoordSys", "lastCbParamsList", "contentNotChanged", "lastItemCoordSys", "indexCoordSys", "lastDataByAxis", "thisItemCoordSys", "thisDataByAxis", "lastItem", "indexAxis", "thisItem", "lastIndices", "newIndices", "lastIdxItem", "j", "newIdxItem", "seriesIdx", "lastCbParams", "unregister", "Component_default", "modelCascade", "defaultTooltipOption", "resultModel", "Model_default", "i", "gapH", "gapV", "size", "width", "height", "position", "borderWidth", "domWidth", "domHeight", "offset", "rectWidth", "rectHeight", "queryOptionMap", "preParseFinder", "componentMainType", "queryResult", "queryReferringComponents", "model", "view", "subEl", "TooltipView_default", "install", "registers", "use", "TooltipModel_default", "TooltipView_default", "noop", "DEFAULT_TOOLBOX_BTNS", "brushPreprocessor", "option", "isNew", "brushComponents", "normalizeToArray", "brushComponentSpecifiedBtns", "each", "brushOpt", "tbs", "toolbox", "isArray", "toolboxFeature", "toolboxBrush", "brushTypes", "removeDuplicate", "arr", "map", "val", "flag", "each", "hasKeys", "obj", "name_1", "createVisualMappings", "option", "stateList", "supplementVisualOption", "visualMappings", "state", "mappings", "createMappings", "visualData", "visualType", "VisualMapping_default", "mappingOption", "clone", "Creater", "replaceVisualOption", "thisOption", "newOption", "keys", "has", "key", "applyVisual", "data", "getValueState", "scope", "dimension", "visualTypesMap", "visualTypes", "dataIndex", "getVisual", "getItemVisualFromData", "setVisual", "value", "setItemVisualFromData", "eachItem", "valueOrIndex", "index", "rawDataItem", "valueState", "i", "len", "type", "incrementalApplyVisual", "dim", "params", "dimIndex", "store", "makeBrushCommonSelectorForSeries", "area", "brushType", "selectors", "itemLayout", "selector", "getLineSelectors", "contain", "points", "x", "y", "width", "height", "p", "BoundingRect_default", "linePolygonIntersect", "xyIndex", "xy", "wh", "range", "inLineRange", "layoutRange", "STATE_LIST", "DISPATCH_METHOD", "DISPATCH_FLAG", "layoutCovers", "ecModel", "brushModel", "brushTargetManager", "BrushTargetManager_default", "brushVisual", "api", "payload", "brushSelected", "throttleType", "throttleDelay", "brushIndex", "thisBrushSelected", "clone", "brushOption", "brushLink", "linkedSeriesMap", "selectedDataIndexForLink", "rangeInfoBySeries", "hasBrushExists", "areas", "map", "area", "builder", "boundingRectBuilders", "selectableArea", "defaults", "makeBrushCommonSelectorForSeries", "visualMappings", "createVisualMappings", "mappingOption", "isArray", "each", "seriesIndex", "linkOthers", "brushed", "rangeInfoList", "seriesModel", "stepAParallel", "stepAOthers", "coordSys", "activeState", "dataIndex", "brushModelNotControll", "data_1", "checkInRange", "seriesBrushSelected", "data", "getValueState", "applyVisual", "dispatchAction", "zr", "doDispatch", "fn", "createOrUpdate", "len", "seriesIndices", "indexOf", "getBoundingRectFromMinMax", "minMax", "range", "i", "rg", "BoundingRect_default", "BrushView", "_super", "__extends", "_this", "ecModel", "api", "BrushController_default", "bind", "brushModel", "payload", "layoutCovers", "eventParam", "modelId", "areas", "clone", "Component_default", "BrushView_default", "BrushModel", "_super", "__extends", "_this", "newOption", "isInit", "thisOption", "replaceVisualOption", "inBrush", "areas", "map", "area", "generateBrushOption", "brushOption", "tokens_default", "Component_default", "option", "merge", "Model_default", "BrushModel_default", "ICON_TYPES", "BrushFeature", "_super", "__extends", "featureModel", "ecModel", "api", "brushType", "brushMode", "isBrushed", "brushModel", "each", "type", "model", "availableIcons", "icons", "defaultOption", "ToolboxFeature", "Brush_default", "install", "registers", "BrushView_default", "BrushModel_default", "brushPreprocessor", "brushVisual", "payload", "ecModel", "brushModel", "noop", "registerFeature", "Brush_default", "TitleModel", "_super", "__extends", "_this", "tokens_default", "Component_default", "TitleView", "titleModel", "ecModel", "api", "group", "textStyleModel", "subtextStyleModel", "textAlign", "textVerticalAlign", "retrieve2", "textEl", "Text_default", "createTextStyle", "textRect", "subText", "subTextEl", "link", "sublink", "triggerEvent", "windowOpen", "getECData", "groupRect", "layoutOption", "layoutRef", "createBoxLayoutReference", "layoutRect", "getLayoutRect", "alignStyle", "padding", "style", "rect", "Rect_default", "install", "registers", "TimelineModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "currentIndex", "count", "state", "thisOption", "dataArr", "axisType", "names", "processedDataArr", "each", "item", "index", "value", "convertOptionIdName", "getDataItemValue", "newItem", "isObject", "clone", "dimType", "data", "SeriesData_default", "tokens_default", "Component_default", "TimelineModel_default", "SliderTimelineModel", "_super", "__extends", "_this", "inheritDefaultOption", "TimelineModel_default", "tokens_default", "mixin", "DataFormatMixin", "SliderTimelineModel_default", "TimelineView", "_super", "__extends", "_this", "Component_default", "TimelineView_default", "TimelineAxis", "_super", "__extends", "dim", "scale", "coordExtent", "axisType", "_this", "Axis_default", "TimelineAxis_default", "PI", "labelDataIndexStore", "makeInner", "SliderTimelineView", "_super", "__extends", "_this", "ecModel", "api", "timelineModel", "layoutInfo_1", "mainGroup_1", "labelGroup", "axis_1", "dataIndex", "name", "createTooltipMarkup", "each", "labelPosOpt", "orient", "viewRect", "getViewRect", "parsedLabelPos", "isString", "labelAlignMap", "labelBaselineMap", "rotationMap", "mainLength", "controlModel", "showControl", "controlSize", "controlGap", "sizePlusGap", "labelRotation", "playPosition", "prevBtnPosition", "nextBtnPosition", "controlPosition", "showPlayBtn", "showPrevBtn", "showNextBtn", "xLeft", "xRight", "axisExtent", "layoutInfo", "mainGroup", "m", "create", "rotateOriginX", "rotateOriginY", "translate", "rotate", "viewBound", "getBound", "mainBound", "labelBound", "mainPosition", "labelsPosition", "mainBoundIdx", "toBound", "setOrigin", "targetGroup", "rect", "fromPos", "from", "to", "dimIdx", "boundIdx", "data", "axisType", "scale", "createScaleByModel", "value", "dataExtent", "axis", "TimelineAxis_default", "key", "newGroup", "Group_default", "group", "line", "Line_default", "extend", "progressLine", "defaults", "ticks", "tick", "tickCoord", "itemModel", "itemStyleModel", "hoverStyleModel", "progressStyleModel", "symbolOpt", "bind", "el", "giveSymbol", "enableHoverEmphasis", "ecData", "getECData", "labelModel", "labels", "labelItem", "normalLabelModel", "hoverLabelModel", "progressLabelModel", "textEl", "Text_default", "createTextStyle", "rotation", "itemStyle", "hoverStyle", "playState", "inverse", "makeBtn", "position", "iconName", "onclick", "willRotate", "iconSize", "parsePercent", "retrieve2", "btn", "makeControlIcon", "currentIndex", "pointerModel", "me", "callback", "pointer", "pointerMoveTo", "nextState", "dx", "dy", "e", "mousePos", "trigger", "toCoord", "asc", "targetDataIndex", "vertex", "trans", "applyTransform", "axisCoord", "dist", "coord", "d", "nextIndex", "tickSymbols", "tickLabels", "i", "TimelineView_default", "model", "Ordinal_default", "Time_default", "Interval_default", "getLayoutRect", "createBoxLayoutReference", "objPath", "opts", "style", "icon", "createIcon", "BoundingRect_default", "hostModel", "opt", "symbol", "color", "symbolType", "createSymbol", "merge", "symbolSize", "normalizeSymbolSize", "symbolOffset", "normalizeSymbolOffset", "symbolRotate", "noAnimation", "animationCfg", "SliderTimelineView_default", "installTimelineAction", "registers", "payload", "ecModel", "api", "timelineModel", "defaults", "timelinePreprocessor", "option", "timelineOpt", "isArray", "each", "opt", "compatibleEC2", "type", "ec2Types", "transferItem", "has", "controlStyle", "dataItem", "isObject", "itemStyle", "itemStyleEmphasis", "label", "labelNormal", "excludeLabelAttr", "value", "name", "obj", "attr", "install", "registers", "SliderTimelineModel_default", "SliderTimelineView_default", "installTimelineAction", "timelinePreprocessor", "checkMarkerInSeries", "seriesOpts", "markerType", "seriesOptArr", "isArray", "idx", "fillLabel", "opt", "defaultEmphasis", "inner", "makeInner", "MarkerModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "env_default", "hostSeries", "newOpt", "createdBySelf", "isInit", "componentType", "seriesModel", "markerOpt", "markerModel", "each", "item", "extend", "dataIndex", "multipleSeries", "dataType", "data", "value", "itemName", "createTooltipMarkup", "params", "DataFormatMixin", "Component_default", "mixin", "MarkerModel_default", "MarkPointModel", "_super", "__extends", "_this", "markerOpt", "masterMarkerModel", "ecModel", "MarkerModel_default", "MarkPointModel_default", "hasXOrY", "item", "hasXAndY", "markerTypeCalculatorWithExtent", "markerType", "data", "axisDim", "otherDataDim", "targetDataDim", "otherCoordIndex", "targetCoordIndex", "coordArr", "stacked", "isDimensionStacked", "calcDataDim", "value", "numCalculate", "seriesModel", "dataIndex", "coordArrValue", "precision", "getPrecision", "markerTypeCalculator", "curry", "dataTransform", "coordSys", "dims", "isArray", "axisInfo", "getAxisInfo", "clone", "indexOf", "coordInfo", "baseAxis", "otherAxis", "coord", "i", "ret", "dataDimToCoordDim", "dataDim", "dimItem", "dataFilter", "zoneFilter", "item1", "item2", "createMarkerDimValueGetter", "inCoordSys", "dimName", "dimIndex", "rawVal", "parseDataValue", "valueDataDim", "type", "sum_1", "count_1", "val", "idx", "inner", "makeInner", "MarkerView", "_super", "__extends", "_this", "createHashMap", "markerModel", "ecModel", "api", "markerGroupMap", "item", "seriesModel", "MarkerModel_default", "updateZ", "drawGroup", "seriesModelList", "isBlur", "each", "data", "el", "enterBlur", "leaveBlur", "Component_default", "type", "markerDraw", "_a", "retrieveZInfo", "z", "zlevel", "traverseUpdateZ", "MarkerView_default", "updateMarkerLayout", "mpData", "seriesModel", "api", "coordSys", "apiWidth", "apiHeight", "coordRect", "idx", "itemModel", "isRelativeToCoordinate", "width", "height", "left", "top", "point", "xPx", "parsePercent", "yPx", "x", "MarkPointView", "_super", "__extends", "_this", "markPointModel", "ecModel", "mpModel", "MarkerModel_default", "seriesId", "seriesData", "symbolDrawMap", "symbolDraw", "SymbolDraw_default", "createData", "symbol", "symbolSize", "symbolRotate", "symbolOffset", "symbolKeepAspect", "isFunction", "rawIdx", "dataParams", "style", "z2", "color", "getVisualFromData", "retrieve2", "el", "child", "getECData", "MarkerView_default", "coordDimsInfos", "map", "coordDim", "info", "extend", "SeriesData_default", "dataOpt", "curry", "dataTransform", "filter", "dataFilter", "dimValueGetter", "createMarkerDimValueGetter", "MarkPointView_default", "install", "registers", "MarkPointModel_default", "MarkPointView_default", "opt", "checkMarkerInSeries", "MarkLineModel", "_super", "__extends", "_this", "markerOpt", "masterMarkerModel", "ecModel", "MarkerModel_default", "MarkLineModel_default", "inner", "makeInner", "markLineTransform", "seriesModel", "coordSys", "mlModel", "item", "data", "itemArray", "isArray", "mlType", "valueAxis", "value", "retrieve", "axisInfo", "getAxisInfo", "valueDataDim", "getStackedDimension", "numCalculate", "valueIndex", "baseIndex", "mlFrom", "clone", "mlTo", "precision", "isNumber", "normalizedItem", "dataTransform", "extend", "merge", "isInfinity", "val", "ifMarkLineHasOnlyDim", "dimIndex", "fromCoord", "toCoord", "otherDimIndex", "dimName", "markLineFilter", "dataFilter", "updateSingleMarkerEndLayout", "idx", "isFrom", "api", "itemModel", "point", "xPx", "parsePercent", "yPx", "dims", "x", "y", "isCoordinateSystemType", "xAxis", "yAxis", "MarkLineView", "_super", "__extends", "_this", "markLineModel", "ecModel", "MarkerModel_default", "mlData_1", "fromData_1", "toData_1", "seriesId", "seriesData", "lineDrawMap", "lineDraw", "LineDraw_default", "mlData", "createList", "fromData", "toData", "lineData", "symbolType", "symbolSize", "symbolRotate", "symbolOffset", "updateDataVisualAndLayout", "lineStyle", "z2", "retrieve2", "el", "getECData", "child", "style", "getVisualFromData", "MarkerView_default", "coordDimsInfos", "map", "coordDim", "info", "SeriesData_default", "optData", "curry", "filter", "dimValueGetter", "createMarkerDimValueGetter", "MarkLineView_default", "install", "registers", "MarkLineModel_default", "MarkLineView_default", "opt", "checkMarkerInSeries", "MarkAreaModel", "_super", "__extends", "_this", "markerOpt", "masterMarkerModel", "ecModel", "MarkerModel_default", "MarkAreaModel_default", "inner", "makeInner", "markAreaTransform", "seriesModel", "coordSys", "maModel", "item", "item0", "item1", "lt", "dataTransform", "rb", "ltCoord", "rbCoord", "retrieve", "result", "mergeAll", "isInfinity", "val", "ifMarkAreaHasOnlyDim", "dimIndex", "fromCoord", "toCoord", "otherDimIndex", "markAreaFilter", "isCoordinateSystemType", "zoneFilter", "dataFilter", "getSingleMarkerEndPoint", "data", "idx", "dims", "api", "itemModel", "point", "xPx", "parsePercent", "yPx", "pointValue0", "pointValue1", "clampPointValue0", "clampPointValue1", "pointValue", "x", "y", "pt", "xAxis", "yAxis", "dimPermutations", "MarkAreaView", "_super", "__extends", "_this", "markAreaModel", "ecModel", "MarkerModel_default", "areaData_1", "points", "map", "dim", "el", "seriesId", "seriesData", "areaGroupMap", "polygonGroup", "Group_default", "areaData", "createList", "xAxisScale", "yAxisScale", "xAxisExtent", "yAxisExtent", "xPointExtent", "yPointExtent", "asc", "overlapped", "allClipped", "style", "z2", "color", "getVisualFromData", "isString", "modifyAlpha", "retrieve2", "layout", "polygon", "Polygon_default", "newIdx", "oldIdx", "updateProps", "setLabelStyle", "getLabelStatesModels", "tokens_default", "setStatesStylesFromModel", "toggleHoverEmphasis", "getECData", "MarkerView_default", "dataDims", "coordDimsInfos_1", "coordDim", "info", "extend", "SeriesData_default", "optData", "curry", "filter", "dimValueGetter", "dimName", "dataIndex", "rawVal", "parseDataValue", "MarkAreaView_default", "install", "registers", "MarkAreaModel_default", "MarkAreaView_default", "opt", "checkMarkerInSeries", "getDefaultSelectorOptions", "ecModel", "type", "LegendModel", "_super", "__extends", "_this", "option", "parentModel", "selector", "isArray", "each", "item", "index", "isString", "merge", "legendData", "hasSelected", "name_1", "potentialData", "availableNames", "seriesModel", "seriesName", "isPotential", "provider", "names", "isNameSpecified", "rawData", "legendNameMap", "createHashMap", "map", "dataItem", "isNumber", "Model_default", "filter", "name", "selected", "selectedMode", "data", "indexOf", "tokens_default", "Component_default", "LegendModel_default", "curry", "each", "Group", "Group_default", "LegendView", "_super", "__extends", "_this", "legendModel", "ecModel", "api", "isFirstRender", "itemAlign", "orient", "selector", "selectorPosition", "refContainer", "createBoxLayoutReference", "positionInfo", "padding", "maxSize", "getLayoutRect", "mainRect", "layoutRect", "defaults", "makeBackground", "contentGroup", "legendDrawnMap", "createHashMap", "selectMode", "triggerEvent", "excludeSeriesId", "seriesModel", "legendItemModel", "dataIndex", "name", "g", "data", "lineVisualStyle", "legendIcon", "style", "itemGroup", "dispatchSelectAction", "dispatchHighlightAction", "dispatchDownplayAction", "child", "ecData", "getECData", "provider", "idx", "colorArr", "parse", "extend", "stringify", "el", "eventData", "selectorGroup", "selectorItem", "type", "labelText", "Text_default", "labelModel", "emphasisLabelModel", "setLabelStyle", "enableHoverEmphasis", "itemVisualStyle", "drawType", "itemWidth", "itemHeight", "isSelected", "iconRotate", "symbolKeepAspect", "legendIconType", "getLegendStyle", "textStyleModel", "isFunction", "rotate", "getDefaultLegendIcon", "textX", "textAlign", "formatter", "content", "isString", "textColor", "createTextStyle", "hitRect", "Rect_default", "tooltipModel", "setTooltipConfig", "box", "contentRect", "contentPos", "selectorRect", "selectorPos", "selectorButtonGap", "orientIdx", "wh", "hw", "yx", "Component_default", "iconType", "handleCommonProps", "visualStyle", "propVal", "propName", "itemStyleModel", "itemStyle", "iconBrushType", "decalStyle", "createOrUpdatePatternFromDecal", "legendLineModel", "lineStyle", "borderWidth", "visualHasBorder", "opt", "symboType", "icon", "createSymbol", "tokens_default", "seriesName", "dataName", "isUseHoverLayer", "list", "emphasisState", "i", "len", "LegendView_default", "legendFilter", "ecModel", "legendModels", "series", "i", "legendSelectActionHandler", "methodName", "payload", "ecModel", "isAllSelect", "selectedMap", "actionLegendIndices", "legendModel", "makeSelectedMap", "allSelectedMap", "each", "isSelected", "name", "out", "model", "isItemSelected", "hasOwn", "installLegendAction", "registers", "curry", "install", "registers", "LegendModel_default", "LegendView_default", "legendFilter", "installLegendAction", "ScrollableLegendModel", "_super", "__extends", "_this", "scrollDataIndex", "option", "parentModel", "ecModel", "inputPositionParams", "getLayoutParams", "mergeAndNormalizeLayoutParams", "inheritDefaultOption", "LegendModel_default", "tokens_default", "legendModel", "target", "raw", "orient", "ignoreSize", "mergeLayoutParam", "ScrollableLegendModel_default", "Group", "Group_default", "WH", "XY", "ScrollableLegendView", "_super", "__extends", "_this", "itemAlign", "legendModel", "ecModel", "api", "selector", "orient", "selectorPosition", "self", "controllerGroup", "pageIconSize", "pageIconSizeArr", "isArray", "createPageButton", "pageTextStyleModel", "Text_default", "name", "iconIdx", "pageDataIndexName", "icon", "createIcon", "bind", "maxSize", "isFirstRender", "selectorGroup", "orientIdx", "wh", "xy", "hw", "yx", "box", "selectorButtonGap", "selectorRect", "selectorPos", "processMaxSize", "clone", "mainRect", "offset", "contentGroup", "containerGroup", "contentRect", "controllerRect", "showController", "contentPos", "containerPos", "controllerPos", "pageButtonGap", "retrieve2", "pageButtonPosition", "clipShape", "Rect_default", "child", "pageInfo", "updateProps", "to", "scrollDataIndex", "each", "key", "canJump", "pageText", "pageFormatter", "pageIndex", "current", "total", "isString", "containerRectSize", "targetItemIndex", "children", "targetItem", "itemCount", "pCount", "result", "targetItemInfo", "getItemInfo", "i", "winStartItemInfo", "winEndItemInfo", "currItemInfo", "intersect", "el", "itemRect", "start", "itemInfo", "winStart", "targetDataIndex", "index", "defaultIndex", "idx", "legendDataIdx", "LegendView_default", "ScrollableLegendView_default", "installScrollableLegendAction", "registers", "payload", "ecModel", "scrollDataIndex", "legendModel", "install", "registers", "use", "ScrollableLegendModel_default", "ScrollableLegendView_default", "installScrollableLegendAction", "install", "registers", "use", "InsideZoomModel", "_super", "__extends", "_this", "inheritDefaultOption", "DataZoomModel_default", "InsideZoomModel_default", "inner", "makeInner", "setViewInfoToCoordSysRecord", "api", "dataZoomModel", "getRange", "coordSysRecord", "dzInfo", "disposeCoordSysRecordIfNeeded", "coordSysRecordMap", "coordSysKeyArr", "coordSysKey", "dataZoomInfoMap", "dzUid", "disposeCoordSysRecord", "controller", "createCoordSysRecord", "coordSysModel", "curry", "containsPoint", "dispatchAction", "RoamController_default", "each", "eventName", "event", "batch", "method", "range", "e", "x", "y", "mergeControllerParams", "controlType", "prefix", "typePriority", "preventDefaultMouseMove", "dataZoomInfo", "oneType", "installDataZoomRoamProcessor", "registers", "ecModel", "apiInner", "createHashMap", "dzReferCoordSysWrap", "collectReferCoordSysModelInfo", "dzCoordSysInfo", "coordSysUid", "firstDzInfo", "firstDzKey", "controllerParams", "createOrUpdate", "InsideZoomView", "_super", "__extends", "_this", "dataZoomModel", "ecModel", "api", "setViewInfoToCoordSysRecord", "bind", "getRangeHandlers", "disposeCoordSysRecordIfNeeded", "DataZoomView_default", "coordSysInfo", "coordSysMainType", "controller", "e", "lastRange", "range", "axisModel", "directionInfo", "getDirectionInfo", "percentPoint", "scale", "minMaxSpan", "sliderMove", "makeMover", "getPercentDelta", "percentDelta", "oldPoint", "newPoint", "axis", "ret", "rect", "polar", "radiusExtent", "angleExtent", "InsideZoomView_default", "install", "registers", "installCommon", "InsideZoomModel_default", "InsideZoomView_default", "installDataZoomRoamProcessor", "SliderZoomModel", "_super", "__extends", "_this", "inheritDefaultOption", "DataZoomModel_default", "tokens_default", "SliderZoomModel_default", "Rect", "Rect_default", "DEFAULT_FRAME_BORDER_WIDTH", "DEFAULT_FILLER_SIZE", "DEFAULT_MOVE_HANDLE_SIZE", "HORIZONTAL", "VERTICAL", "LABEL_GAP", "SHOW_DATA_SHADOW_SERIES_TYPE", "REALTIME_ANIMATION_CONFIG", "SliderZoomView", "_super", "__extends", "_this", "ecModel", "api", "bind", "dataZoomModel", "payload", "createOrUpdate", "clear", "zr", "thisGroup", "barGroup", "Group_default", "showMoveHandle", "moveHandleSize", "refContainer", "createBoxLayoutReference", "coordRect", "edgeGap", "positionInfo", "layoutParams", "getLayoutParams", "each", "name", "layoutRect", "getLayoutRect", "location", "orient", "targetAxisModel", "inverse", "sliderGroup", "otherAxisInverse", "rect", "size", "brushSelect", "clickPanel", "info", "oldSize", "seriesModel", "data", "candlestickDim", "otherDim", "polygonPts", "polylinePts", "thisDataExtent_1", "otherDataExtent_1", "otherOffset", "otherShadowExtent_1", "thisShadowExtent", "areaPoints_1", "linePoints_1", "step_1", "normalizationConstant_1", "isTimeAxis_1", "thisCoord_1", "stride_1", "lastIsEmpty_1", "thisValue", "otherValue", "index", "isEmpty", "otherCoord", "linearMap", "createDataShadowGroup", "isSelectedArea", "model", "group", "polygon", "Polygon_default", "polyline", "Polyline_default", "i", "showDataShadow", "result", "axisDim", "axisIndex", "seriesModels", "indexOf", "thisAxis", "getAxisMainType", "getOtherDim", "coordSys", "thisDim", "displayables", "handles", "handleLabels", "borderRadius", "filler", "tokens_default", "handleIndex", "iconStr", "symbolBuildProxies", "path", "createSymbol", "getCursor", "bRect", "handleSize", "parsePercent", "enableHoverEmphasis", "handleColor", "textStyleModel", "handleLabel", "handleLabelShow", "Text_default", "createTextStyle", "actualMoveZone", "moveHandleHeight", "moveHandle_1", "iconSize", "moveHandleIcon", "moveZoneExpandSize", "range", "viewExtent", "delta", "handleEnds", "viewExtend", "minMaxSpan", "percentExtent", "sliderMove", "lastRange", "asc", "nonRealtime", "displaybles", "handleInterval", "handle", "handleHeight", "dataShadowSegs", "segIntervals", "segGroup", "clipPath", "labelTexts", "axisProxy", "axis", "dataInterval", "orderedHandleEnds", "setLabel", "barTransform", "getTransform", "direction", "transformDirection", "offset", "textPoint", "applyTransform", "value", "labelFormatter", "labelPrecision", "valueStr", "isFunction", "isString", "isEmphasis", "normalShow", "emphasisHandleLabel", "emphasisShow", "toShow", "dx", "dy", "event", "stop", "vertex", "changed", "realtime", "e", "localPoint", "center", "x", "y", "Point_default", "brushRect", "brushShape", "brushEndTime", "mouseX", "mouseY", "brushStart", "endPoint", "startPoint", "coordSysInfoList", "collectReferCoordSysModelInfo", "width", "height", "DataZoomView_default", "map", "SliderZoomView_default", "install", "registers", "SliderZoomModel_default", "SliderZoomView_default", "installCommon", "install", "registers", "use", "visualDefault", "visualType", "key", "isCategory", "value", "clone", "defaultOption", "isArray", "tokens_default", "visualDefault_default", "mapVisual", "VisualMapping_default", "eachVisual", "isArray", "each", "asc", "linearMap", "VisualMapModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "newOption", "isInit", "thisOption", "replaceVisualOption", "supplementVisualOption", "stateList", "bind", "createVisualMappings", "optionSeriesId", "optionSeriesIndex", "seriesModels", "queryReferringComponents", "map", "seriesModel", "callback", "context", "seriesIndex", "is", "model", "value", "isCategory", "edgeSymbols", "precision", "dataBound", "formatter", "isMinMax", "textValue", "toFixed", "isString", "isFunction", "val", "extent", "data", "optDim", "dimNames", "i", "dimName", "dimInfo", "base", "target", "controller", "merge", "completeSingle", "completeInactive", "completeController", "stateExist", "stateAbsent", "optExist", "optAbsent", "visualData", "visualType", "defa", "visualDefault_default", "symbolExists", "symbolSizeExists", "inactiveColor", "itemSymbol", "defaultSymbol", "state", "itemSize", "visuals", "clone", "symbol", "symbolSize", "max_1", "selected", "getColorVisual", "tokens_default", "Component_default", "VisualMapModel_default", "DEFAULT_BAR_BOUND", "ContinuousModel", "_super", "__extends", "_this", "newOption", "isInit", "mappingOption", "itemSize", "dataExtent", "range", "isArray", "each", "state", "symbolSize", "selected", "dataInterval", "asc", "value", "unboundedRange", "retrieve2", "result", "seriesModel", "dataIndices", "data", "dataIndex", "getColorVisual", "oVals", "getColorStopValues", "iVals", "stops", "setStop", "valueState", "iIdx", "oIdx", "iLen", "oLen", "first", "stopsLen", "inheritDefaultOption", "VisualMapModel_default", "tokens_default", "visualMapModel", "count", "step", "stopValues", "i", "ContinuousModel_default", "VisualMapView", "_super", "__extends", "_this", "ecModel", "api", "visualMapModel", "payload", "group", "padding", "normalizeCssArray", "rect", "Rect_default", "targetValue", "visualCluster", "opts", "forceState", "visualObj", "defaultColor", "getter", "key", "setter", "value", "mappings", "visualTypes", "VisualMapping_default", "each", "type", "visualMapping", "model", "refContainer", "createBoxLayoutReference", "positionElement", "Component_default", "VisualMapView_default", "paramsSet", "getItemAlign", "visualMapModel", "api", "itemSize", "modelOption", "itemAlign", "ecSize", "realIndex", "reals", "fakeValue", "layoutInput", "i", "rParam", "rect", "getLayoutRect", "makeHighDownBatch", "batch", "each", "batchItem", "linearMap", "each", "mathMin", "mathMax", "HOVER_LINK_SIZE", "HOVER_LINK_OUT", "ContinuousView", "_super", "__extends", "_this", "ecModel", "api", "bind", "visualMapModel", "payload", "thisGroup", "dataRangeText", "group", "endsIndex", "text", "textGap", "itemSize", "barGroup", "position", "align", "orient", "textStyleModel", "Text_default", "createTextStyle", "targetGroup", "shapes", "useHandle", "itemAlign", "getItemAlign", "mainGroup", "gradientBarGroup", "Group_default", "createPolygon", "getCursor", "Rect_default", "textRect", "textSize", "handleIndex", "onDrift", "onDragEnd", "handleSize", "parsePercent", "handleThumb", "createSymbol", "cursor", "e", "stop", "setAsHighDownDispatcher", "handleLabel", "handleLabelPoint", "scale", "indicator", "indicatorStyle", "Image_default", "pathStyle", "extend", "indicatorLabel", "indicatorLabelPoint", "isEnd", "dx", "dy", "vertex", "useHoverLinkOnHandle", "dataInterval", "dataExtent", "sizeExtent", "delta", "handleEnds", "sliderMove", "forSketch", "outOfRangeHandleEnds", "inRangeHandleEnds", "visualInRange", "visualOutOfRange", "forceState", "opts", "colorStops", "symbolSizes", "barPoints", "LinearGradient_default", "sampleNumber", "step", "i", "currValue", "inverse", "handleThumbs", "handleLabels", "val", "symbolSize", "textPoint", "applyTransform", "getTransform", "minimumOffset", "cursorValue", "textValue", "rangeSymbol", "halfHoverLinkSize", "color", "y", "x", "oldIndicatorPos", "isHorizontal", "indicatorNewProps", "labelNewProps", "animationCfg", "self", "pos", "zr", "cursorPos", "hoverOnBar", "getHalfHoverLinkSize", "hoverRange", "valueRange", "oldBatch", "newBatch", "resultBatches", "compressBatches", "makeHighDownBatch", "ecData", "findEventDispatcher", "target", "currECData", "getECData", "dataModel", "data", "value", "indices", "element", "global", "transform", "isArray", "transformDirection", "type", "batch", "VisualMapView_default", "points", "Polygon_default", "hoverLinkDataSize", "hoverLinkOnHandle", "ContinuousView_default", "visualMapActionInfo", "visualMapActionHander", "payload", "ecModel", "model", "visualMapEncodingHandlers", "seriesModel", "ecModel", "resetDefines", "visualMapModel", "pipelineContext", "incrementalApplyVisual", "bind", "data", "visualMetaList", "visualMeta", "getColorVisual", "dimIdx", "value", "valueState", "mappings", "visualTypes", "VisualMapping_default", "resultVisual", "getVisualFromData", "i", "len", "type", "mapping", "getVisual", "setVisual", "key", "each", "visualMapPreprocessor", "option", "visualMap", "isArray", "opt", "has", "pieces", "piece", "isObject", "obj", "name", "installed", "installCommon", "registers", "option", "visualMapActionInfo", "visualMapActionHander", "each", "visualMapEncodingHandlers", "handler", "visualMapPreprocessor", "install", "registers", "ContinuousModel_default", "ContinuousView_default", "installCommon", "PiecewiseModel", "_super", "__extends", "_this", "newOption", "isInit", "mode", "resetMethods", "categories", "mappingOption", "state", "clone", "map", "piece", "option", "visualTypesInPieces", "visualTypes", "VisualMapping_default", "isCategory", "each", "visualType", "v", "exists", "has", "visualDefault_default", "obj", "thisOption", "pieceList", "selected", "index", "key", "hasSel_1", "value", "pieceIndex", "result", "seriesModel", "dataIndices", "data", "dataIndex", "pIdx", "representValue", "pieceInterval", "getColorVisual", "stops", "outerColors", "visualMapModel", "setStop", "interval", "valueState", "color", "edge", "curr", "inheritDefaultOption", "VisualMapModel_default", "outPieceList", "precision", "dataExtent", "splitNumber", "splitStep", "max", "reformIntervals", "cate", "normalizeReverse", "pieceListItem", "isObject", "item", "close_1", "closeList", "infinityList", "useMinMax", "lg", "names", "i", "close", "edgeSymbols", "inverse", "PiecewiseModel_default", "PiecewiseVisualMapView", "_super", "__extends", "_this", "thisGroup", "visualMapModel", "textGap", "textStyleModel", "itemAlign", "itemSize", "viewData", "endsText", "showLabel", "retrieve", "silent", "each", "item", "piece", "itemGroup", "Group_default", "bind", "representValue", "visualState", "align", "Text_default", "createTextStyle", "retrieve2", "box", "pieceIndex", "onHoverLink", "method", "makeHighDownBatch", "modelOption", "getItemAlign", "group", "text", "viewPieceList", "map", "index", "orient", "inverse", "shapeParam", "itemSymbol", "createSymbol", "option", "selectedMode", "selected", "clone", "newKey", "o", "key", "VisualMapView_default", "PiecewiseView_default", "install", "registers", "PiecewiseModel_default", "PiecewiseView_default", "installCommon", "install", "registers", "use", "ThumbnailBridgeImpl", "thumbnailModel", "api", "opt", "thumbnailView", "calcZ2Range", "targetTrans", "ThumbnailModel", "_super", "__extends", "_this", "newCptOption", "isInit", "bridge", "ThumbnailBridgeImpl", "series", "injectThumbnailBridge", "target", "tokens_default", "Component_default", "ThumbnailView", "_super", "__extends", "_this", "thumbnailModel", "ecModel", "api", "View_default", "group", "itemStyleModel", "itemStyle", "tokens_default", "refContainer", "createBoxLayoutReference", "boxRect", "getLayoutRect", "getBoxLayoutParams", "boxBorderWidth", "contentRect", "expandOrShrinkRect", "contentGroup", "Group_default", "Rect_default", "targetGroup", "borderShape", "windowStyleModel", "windowR", "updateZ", "bridgeRendered", "coordSys", "bridgeGroup", "bridgeRect", "viewRect", "param", "invTargetTrans", "invert", "transTargetToThis", "mul", "viewportRect", "BoundingRect_default", "windowRect", "r", "defaults", "roamType", "roamController", "RoamController_default", "e", "x", "y", "bind", "event", "trans", "oldOffset", "applyTransform", "newOffset", "makeRoamPayload", "offset", "baseMapProvider", "Component_default", "makeRoamPayload", "baseMapProvider", "params", "type", "payload", "extend", "updateZ", "thumbnailModel", "thumbnailView", "zInfo", "retrieveZInfo", "traverseUpdateZ", "install", "registers", "ThumbnailModel", "ThumbnailView", "DEFAULT_OPTION", "inner", "makeInner", "decalPaletteScope", "ariaVisual", "ecModel", "api", "ariaModel", "defaultOption", "clone", "merge", "setDecal", "setLabel", "decalModel", "useDecal", "paletteScopeGroupByType_1", "createHashMap", "seriesModel", "decalScope", "isFunction", "data", "paletteDecal", "getDecalFromPalette", "specifiedDecal", "mergeDecal", "dataAll_1", "idxMap_1", "decalScope_1", "idx", "rawIdx", "dataCount_1", "name", "resultDecal", "extend", "dom", "labelLocale", "labelModel", "defaults", "seriesCnt", "maxDataCnt", "maxSeriesCnt", "displaySeriesCnt", "ariaLabel", "title", "getTitle", "withTitle", "replace", "seriesLabels_1", "prefix", "seriesLabel", "seriesName", "withName", "getSeriesTypeName", "partialLabel", "middleSeparator_1", "endSeparator_1", "excludeDimensionId_1", "dataLabels", "i", "name_1", "value", "filter", "v", "j", "indexOf", "dataLabel", "separatorModel", "middleSeparator", "endSeparator", "str", "keyValues", "isString", "result", "each", "key", "type", "typeNames", "ariaPreprocessor", "option", "aria", "each", "name", "install", "registers", "ariaPreprocessor", "ariaVisual", "RELATIONAL_EXPRESSION_OP_ALIAS_MAP", "RegExpEvaluator", "rVal", "condValue", "isString", "isRegExp", "errMsg", "throwError", "lVal", "type", "isNumber", "ConstConditionInternal", "AndConditionInternal", "children", "i", "OrConditionInternal", "NotConditionInternal", "RelationalConditionInternal", "needParse", "getValue", "tarValRaw", "tarValParsed", "parseOption", "exprOption", "getters", "cond", "isObjectNotArray", "parseAndOrOption", "parseNotOption", "parseRelationalOption", "op", "subOptionArr", "isArray", "map", "subOption", "valueGetterParam", "subCondList", "exprKeys", "keys", "parserName", "valueParser", "getRawValueParser", "keyRaw", "hasOwn", "condValueRaw", "condValueParsed", "evaluator", "createFilterComparator", "val", "isObject", "isArrayLike", "ConditionalExpressionParsed", "parseConditionalExpression", "filterTransform", "params", "upstream", "rawItem", "condition", "parseConditionalExpression", "createHashMap", "exprOption", "errMsg", "dimLoose", "hasOwn", "throwError", "dimInfo", "param", "resultData", "i", "len", "sortTransform", "params", "upstream", "config", "errMsg", "orderExprList", "normalizeToArray", "throwError", "orderDefList", "each", "orderExpr", "dimLoose", "order", "parserName", "incomparable", "errMsg_1", "errMsg_2", "dimInfo", "parser", "getRawValueParser", "SortOrderComparator", "sourceFormat", "SOURCE_FORMAT_ARRAY_ROWS", "SOURCE_FORMAT_OBJECT_ROWS", "resultData", "i", "len", "item0", "item1", "orderDef", "val0", "val1", "result", "install", "registers", "filterTransform", "sortTransform", "DatasetModel", "_super", "__extends", "_this", "option", "parentModel", "ecModel", "SourceManager", "disableTransformOptionMerge", "newOption", "SERIES_LAYOUT_BY_COLUMN", "Component_default", "DatasetView", "_super", "__extends", "_this", "Component_default", "install", "registers", "DatasetModel", "CMD", "PathProxy_default", "aroundEqual", "a", "b", "pathToBezierCurves", "path", "data", "len", "bezierArrayGroups", "currentSubpath", "xi", "yi", "x0", "y0", "createNewSubpath", "x", "y", "addLine", "x1", "y1", "addArc", "startAngle", "endAngle", "cx", "cy", "rx", "ry", "delta", "dir", "c1", "s1", "c2", "s2", "x4", "y4", "hx", "hy", "x2", "y2", "i", "cmd", "isFirst", "anticlockwise", "step", "angle", "nextAngle", "adpativeBezier", "x3", "y3", "out", "scale", "PIXEL_DISTANCE", "PIXEL_DISTANCE_SQR", "dx", "dy", "d", "dx1", "dy1", "dx2", "dy2", "cp1LenSqr", "cp2LenSqr", "projLen1", "projLen2", "d1Sqr", "d2Sqr", "tmpSegX", "tmpSegY", "cubicSubdivide", "pathToPolygons", "polygons", "beziers", "polygon", "k", "getDividingGrids", "dimSize", "rowDim", "count", "rowSize", "columnSize", "ratio", "rowCount", "columnCount", "grids", "i", "currentCount", "remained", "divideSector", "sectorShape", "outShapes", "r0", "r", "startAngle", "endAngle", "angle", "arcLen", "deltaR", "isAngleRow", "row", "column", "newShape", "divideRect", "rectShape", "width", "height", "isHorizontalRow", "rowSizeDim", "columnSizeDim", "columnDim", "crossProduct2d", "x1", "y1", "x2", "y2", "lineLineIntersect", "a1x", "a1y", "a2x", "a2y", "b1x", "b1y", "b2x", "b2y", "mx", "my", "nx", "ny", "nmCrossProduct", "b1a1x", "b1a1y", "p", "Point_default", "projPtOnLine", "pt", "lineA", "lineB", "dir", "dir2", "len", "addToPoly", "poly", "last", "splitPolygonByLine", "points", "intersections", "p0", "p1", "intersectionPt", "a", "b", "splitPt0", "splitPt1", "tmp", "splitPt0Arr", "splitPt1Arr", "newPolyA", "newPolyB", "binaryDividePolygon", "polygonShape", "min", "max", "fromPoints", "boundingRect", "BoundingRect_default", "x", "y", "pt0", "pt1", "binaryDivideRecursive", "divider", "shape", "out", "mid", "sub", "clone", "path", "paths", "clonePath", "copyPathProps", "source", "target", "polygonConvert", "split", "OutShapeCtor", "Rect_default", "Sector_default", "m", "scale", "polygons", "map", "pathToPolygons", "polygonCount", "totalArea_1", "items", "area", "left", "item", "selfCount", "Polygon_default", "subPath", "alignSubpath", "subpath1", "subpath2", "len1", "len2", "tmpSegX", "tmpSegY", "shorterPath", "shorterLen", "diff", "shorterBezierCount", "eachCurveSubDivCount", "newSubpath", "remained", "i", "x0", "y0", "x1", "y1", "x2", "y2", "x3", "y3", "actualSubDivCount", "k", "p", "cubicSubdivide", "createSubpath", "lastSubpathSubpath", "otherSubpath", "len", "lastX", "lastY", "alignBezierCurves", "array1", "array2", "_a", "lastSubpath1", "lastSubpath2", "newArray1", "newArray2", "newSubpath1", "newSubpath2", "centroid", "array", "signedArea", "cx", "cy", "j", "a", "findBestRingOffset", "fromSubBeziers", "toSubBeziers", "fromCp", "toCp", "bezierCount", "bestScore", "bestOffset", "offset", "cursorOffset", "score", "idx", "dx", "dy", "reverse", "newArr", "findBestMorphingRotation", "fromArr", "toArr", "searchAngleIteration", "searchAngleRange", "result", "fromNeedsReverse", "fromSubpathBezier", "toSubpathBezier", "newFromSubpathBezier", "newToSubpathBezier", "bestAngle", "tmpArr", "step", "angle", "sa", "ca", "newX1", "newY1", "m", "i_1", "isCombineMorphing", "path", "SAVED_METHOD_PREFIX", "saveAndModifyMethod", "obj", "methodName", "modifiers", "savedMethodName", "originalMethod", "replace", "after", "before", "args", "res", "restoreMethod", "applyTransformOnBeziers", "bezierCurves", "mm", "i", "subBeziers", "k", "x", "y", "prepareMorphPath", "fromPath", "toPath", "fromPathProxy", "toPathProxy", "_a", "alignBezierCurves", "pathToBezierCurves", "fromBezierCurves", "toBezierCurves", "fromPathTransform", "toPathTransform", "updateIdentityTransform", "morphingData", "findBestMorphingRotation", "tmpArr", "path", "t", "onet", "newCp", "item", "from", "to", "angle", "fromCp", "toCp", "sa", "ca", "lerp", "m", "x0_1", "y0_1", "x1", "y1", "x0", "y0", "x2", "y2", "x3", "y3", "morphPath", "animationOpts", "oldDone", "oldDuring", "restoreToPath", "defaults", "p", "hilbert", "minX", "minY", "maxX", "maxY", "bits", "d", "tmp", "s", "rx", "ry", "sortPaths", "pathList", "xMin", "yMin", "xMax", "yMax", "cps", "map", "rect", "items", "cp", "idx", "a", "b", "defaultDividePath", "param", "split", "createEmptyReturn", "combineMorph", "fromList", "fromPathList", "addFromPath", "isCombineMorphing", "Path_default", "separateCount", "dividePath", "toSubPathList", "individualDelay", "identityTransform", "Transformable_default", "addToSubPathListToZr", "zr", "toLen", "animating_1", "eachDone", "indivdualAnimationOpts", "child", "separateMorph", "toPathList", "fromLen", "clonePath", "isMultiple", "elements", "isArray", "prepareMorphBatches", "one", "many", "batches", "batchCount", "len", "k", "off", "moveFrom", "mid", "pathDividers", "params", "ret", "approxOpacity", "i", "cloned", "clonePath", "applyMorphAnimation", "from", "to", "divideShape", "seriesModel", "dataIndex", "animateOtherProps", "updateAnimationCfg", "getAnimationConfig", "animationDelay", "animationCfg", "morphOneBatch", "batch", "fromIsMany", "animateIndex", "animateCount", "forceManyOne", "batchMany", "batchOne", "batchFrom", "batchTo", "isCombineMorphing", "individualAnimationCfg", "defaults", "morphPath", "separateAnimationCfg", "idx", "count", "fromPath", "toPath", "_a", "combineMorph", "separateMorph", "fromIndividuals", "toIndividuals", "morphBatches", "getPathList", "pathList_1", "pathList", "el", "Path_default", "DATA_COUNT_THRESHOLD", "TRANSITION_NONE", "TRANSITION_P2C", "TRANSITION_C2P", "getUniversalTransitionGlobalStore", "makeInner", "getDimension", "data", "visualDimension", "dimensions", "i", "dimInfo", "getValueByDimension", "dataIndex", "dimension", "dimOrdinalMeta", "value", "getGroupId", "dataGroupId", "isChild", "groupIdDim", "groupId", "rawDataItem", "property", "flattenDataDiffItems", "list", "items", "each", "seriesInfo", "indices", "fadeInElement", "newEl", "newSeries", "newIndex", "el", "Path_default", "initProps", "removeEl", "computedTransform", "stopAnimation", "child", "animateElementStyles", "seriesModel", "animationConfig", "getAnimationConfig", "Displayable_default", "oldStyle", "getOldStyle", "isAllIdSame", "oldDiffItems", "newDiffItems", "len", "oldItem", "newItem", "transitionBetween", "oldList", "newList", "api", "updateMorphingPathProps", "from", "to", "rawFrom", "rawTo", "animationCfg", "extend", "hasMorphAnimation", "direction", "oldGroupIds", "createHashMap", "oldChildGroupIds", "item", "newGroupId", "newChildGroupId", "createKeyGetter", "isOld", "onlyGetId", "diffItem", "useId", "isElementStillInChart", "updateOneToOne", "oldIndex", "oldEl", "applyMorphAnimation", "getPathList", "DataDiffer_default", "oldIndices", "newData", "oldElsList", "filter", "map", "idx", "newIndices", "newElsList", "newSeris", "rawIdx", "_a", "view", "getSeriesTransitionKey", "series", "seriesKey", "convertArraySeriesKeyToString", "isArray", "getDivideShapeFromData", "findTransitionSeriesBatches", "globalStore", "params", "updateBatches", "oldDataMap", "oldDataMapForSplit", "oldDataGroupId", "oldData", "transitionKey", "transitionKeyStr", "key", "checkTransitionSeriesKeyDuplicated", "warn", "newDataGroupId", "oldSeries_1", "oldData_1", "batch", "querySeries", "finder", "found", "transitionSeriesFromOpt", "transitionOpt", "normalizeToArray", "installUniversalTransition", "registers", "ecMOdel", "transOpt", "SERIES_UNIVERSAL_TRANSITION_PROP", "ecModel", "opt", "updateBatches_1", "allSeries", "savedSeries", "savedDataGroupIds", "savedData", "ScaleBreakContextImpl", "parsed", "scaleExtent", "updateAxisBreakGapReal", "elapsedExtent", "tickVal", "estimateNiceMultiple", "idx", "brk", "multiple", "val", "elapsedSpan", "elapsedVal", "AXIS_BREAK_ELAPSED_BASE", "lastBreakEnd", "AXIS_BREAK_LAST_BREAK_END_BASE", "stillOver", "i", "lastElapsedEnd", "unelapsedVal", "elapsedStart", "elapsedEnd", "createScaleBreakContext", "brkCtx", "gapPrctSum", "fullyInExtBrksSum", "init", "semiInExtBrk", "each", "gapParsed", "clampedBrk", "clampBreakByExtent", "vminClamped", "vmaxClamped", "clampedSpan", "sOrE", "prctBrksGapRealSum", "pruneTicksByBreak", "pruneByBreak", "ticks", "breaks", "getValue", "interval", "j", "tick", "gap", "addBreaksToTicks", "getTimeProps", "a", "b", "vmin", "vmax", "parseAxisBreakOption", "breakOptionList", "parse", "opt", "parsedBreaks", "validatePercent", "normalizedPercent", "msg", "brkOption", "parsedBrk", "clone", "isPrct", "isString", "trimmedGap", "trim", "absolute", "se", "tmp", "item1", "item2", "lastEnd", "identifyAxisBreak", "identifier", "serializeAxisBreakIdentifier", "retrieveAxisBreakPairs", "itemList", "getVisualAxisBreak", "returnIdx", "idxPairList", "el", "vBreak", "idxPair", "find", "pr", "result", "getTicksLogTransformBreak", "logBase", "logOriginalBreaks", "fixRoundingError", "brkRoundingCriterion", "originalBreak", "round", "logarithmicParseBreaksFromOption", "parsedOriginal", "parsedLogged", "loggedBase", "map", "BREAK_MIN_MAX_TO_PARAM", "makeAxisLabelFormatterParamBreak", "extraParam", "installScaleBreakHelper", "registerScaleBreakHelperImpl", "viewCache", "makeInner", "ensureVisualInCache", "visualList", "targetBreak", "visual", "find", "item", "getScaleBreakHelper", "resetCacheVisualRemoveFlag", "each", "removeUnusedCacheVisual", "i", "rectCoordBuildBreakAxis", "axisGroup", "axisView", "axisModel", "coordSysRect", "api", "axis", "breakPairs", "tick", "breakAreaModel", "zigzagAmplitude", "zigzagMinSpan", "zigzagMaxSpan", "expandOnClick", "zigzagZ", "itemStyleModel", "itemStyle", "borderColor", "borderWidth", "borderType", "color", "group", "Group_default", "isAxisHorizontal", "cachedVisualList", "_loop_1", "parsedBreak", "coords", "cachedVisual", "breakGroup", "addZigzagShapes", "payload", "AXIS_BREAK_EXPAND_ACTION_TYPE", "zigzagRandomList", "startCoord", "endCoord", "trimmedBreak", "polylineStyle", "dimBrk", "dimZigzag", "zigzagCoordMax", "XY", "WH", "subPixelOpt", "brkCoord", "pBrk", "dummyP", "dummyShape", "subPixelOptimizeLine", "pointsA", "pointsB", "isSwap", "current", "idx", "isFirstPoint", "isLastPoint", "pA", "pB", "randomVal", "anidSuffix", "Polyline_default", "pointsB2", "polygonPoints", "Polygon_default", "buildAxisBreakLine", "transformGroup", "pathBaseProp", "transform", "assert", "extent", "brkLayoutList", "map", "breakPair", "coordPair", "layout1", "layout2", "ySegMin", "lastLayout", "layout", "brkTirmmedMin", "brkTirmmedMax", "addSeg", "min", "max", "trans", "p1", "p2", "applyTransform", "subPixelOptimizePP", "shape", "lineP1", "lineP2", "dummyTickEnd1", "dummyTickEnd2", "seg", "Line_default", "extend", "adjustBreakLabelPair", "axisInverse", "axisRotation", "layoutPair", "mtv", "Point_default", "labelIntersect", "axisStTrans", "create", "rotate", "labelPairStTrans", "mul", "isParallelToAxis", "whIdx", "localRect", "labelVec0", "k", "rectSt", "rect", "brkCenterSt", "mtvSt", "insidePtSum", "qval", "uvalMin", "uvalMax", "uval", "delta0", "delta1", "labelLayoutApplyTranslation", "updateModelAxisBreak", "model", "result", "inputBrk", "breakOption", "brkOption", "actionType", "old", "AXIS_BREAK_COLLAPSE_ACTION_TYPE", "AXIS_BREAK_TOGGLE_ACTION_TYPE", "installAxisBreakHelper", "registerAxisBreakHelperImpl", "installAxisBreak", "registers", "registerAction", "installScaleBreakHelper", "installAxisBreakHelper", "installLegacyGridContainLabel", "registerLegacyGridContainLabelImpl", "legacyLayOutGridByContained", "axesList", "gridRect", "each", "axis", "labelUnionRect", "estimateLabelUnionRect", "dim", "margin", "axisModel", "scale", "realNumberScaleTicks", "tickCount", "categoryScaleExtent", "Ordinal_default", "axisLabelModel", "labelFormatter", "makeLabelFormatter", "rect", "step", "i", "tick", "label", "unrotatedSingleRect", "singleRect", "rotateTextRect", "textRect", "rotate", "rotateRadians", "beforeWidth", "beforeHeight", "afterWidth", "afterHeight", "rotatedRect", "BoundingRect_default", "use", "install", "installUniversalTransition", "installLabelLayout", "installAxisBreak", "installLegacyGridContainLabel", "installScatterJitter", "dataSchema", "zod_default", "chartbar_default", "dataAttr", "data", "chart", "init", "option", "item", "dataSchema", "zod_default", "chartpie_default", "dataAttr", "data", "chart", "init", "option", "observer", "entries", "entry", "calendarYear", "value", "TIMEZONE", "date_default", "timed", "year", "label", "SERIES", "OTHER", "SINGLE", "INK", "MUTED", "GRID", "SURFACE", "MONTHS", "shortDate", "iso", "parts", "longDate", "money", "pence", "cell", "text", "className", "td", "nameCell", "name", "colour", "wrap", "key", "label", "headerRow", "first", "rest", "selected", "tr", "th", "index", "head", "headRow", "columns", "align", "emptyRow", "message", "toggle", "current", "all", "next", "value", "fill", "host", "rows", "empty", "foot", "body", "tfoot", "row", "cells", "totalRow", "streamsSchema", "zod_default", "trendSchema", "countySchema", "spanSchema", "stepsSchema", "deliverySchema", "tilesSchema", "grains", "schema", "combinedSchema", "STREAMS", "UNASSIGNED", "NOUNS", "periodLabel", "grain", "start", "year", "month", "MONTHS", "periodTitle", "latest", "label", "consultantColour", "consultants", "name", "OTHER", "index", "SERIES", "present", "rows", "row", "percent", "part", "whole", "tileText", "tiles", "noun", "totals", "keys", "key", "sum", "each", "CHARTS", "STEPS", "pounds", "value", "money", "thousands", "signed", "dot", "colour", "escapeHtml", "text", "char", "tooltipLines", "title", "lines", "axisLabel", "MUTED", "splitLine", "GRID", "categoryAxis", "labels", "valueAxis", "format", "legend", "combined_default", "charts", "draw", "key", "option", "raw", "parsed", "combinedSchema", "host", "init", "chart", "field", "data", "month", "thisMonth", "STREAMS", "sum", "tileText", "renderTrends", "renderSpan", "delivery", "renderDelivered", "renderPace", "renderTimeline", "renderAccepted", "renderPipeline", "rows", "grain", "each", "periodLabel", "last", "index", "periodTitle", "line", "name", "values", "width", "revenue", "SERIES", "INK", "total", "items", "item", "span", "keys", "sums", "totals", "fill", "row", "nameCell", "cell", "totalRow", "slices", "whole", "count", "SURFACE", "stackedByConsultant", "consultants", "pick", "present", "consultantColour", "released", "net", "ahead", "behind", "limit", "sold", "timed", "totalDays", "packs", "dataIndex", "counts", "bars", "bar", "refs", "pipeline", "assessors", "workKeys", "work", "contractors", "buildPackSchema", "zod_default", "surveySchema", "payloadSchema", "DAY_MS", "shiftDays", "iso", "days", "parts", "stamp", "windowStart", "today", "weeks", "weekStart", "date", "weeksInWindow", "last", "out", "cursor", "passes", "selected", "all", "value", "selectedBuildPacks", "payload", "selection", "from", "pack", "selectedSurveys", "survey", "windowRows", "windows", "names", "countFor", "widest", "name", "counts", "weeks", "row", "count", "a", "b", "measureRows", "packs", "labels", "inPacks", "specified", "pack", "kind", "releaseLags", "DAY_MS", "median", "values", "MEASURE_CHART_LIMIT", "DEFAULT_WEEKS", "delivery_default", "charts", "payloadSchema", "raw", "parsed", "earliest", "pack", "longDate", "key", "host", "init", "chart", "weeks", "name", "toggle", "index", "SERIES", "OTHER", "data", "selection", "packs", "selectedBuildPacks", "surveys", "selectedSurveys", "row", "previous", "change", "counts", "average", "total", "count", "lags", "releaseLags", "middle", "median", "weeksInWindow", "ref", "heading", "rows", "colour", "windows", "selected", "head", "headerRow", "body", "emptyRow", "tr", "nameCell", "classes", "cell", "foot", "_weeks", "sum", "running", "windowRows", "survey", "measureRows", "ordered", "b", "shortDate", "property", "money", "live", "series", "SURFACE", "monday", "weekStart", "legend", "MUTED", "GRID", "a", "INK", "SINGLE", "packCount", "top", "params", "changeSchema", "zod_default", "projectSchema", "flagSchema", "pipelineSchema", "DAY_MS", "SEVERITIES", "daysBetween", "from", "to", "percentile", "sorted", "q", "rank", "ascending", "values", "a", "b", "selectedProjects", "data", "consultants", "row", "isOpen", "surveyed", "today", "inProduction", "awaitingSurvey", "releasedWithin", "rows", "weeks", "windowStart", "cycleTimes", "dueDate", "AGE_BUCKETS", "ageBucket", "days", "bucket", "stageRows", "value", "label", "counts", "index", "sum", "count", "forward", "first", "weekStart", "mondays", "_", "shiftDays", "end", "out", "monday", "due", "incoming", "sunday", "flow", "weeksInWindow", "inWeek", "day", "milestones", "released", "offsets", "pick", "dwell", "byStage", "change", "next", "entry", "revisionsSince", "worstSeverity", "flags", "ranks", "key", "flag", "candidate", "byUrgency", "needsAttention", "flagCounts", "consultantRows", "horizon", "name", "mine", "production", "targeted", "AGE_RAMP", "STATUS", "FORWARD_WEEKS", "DEFAULT_WEEKS", "days", "value", "plural", "count", "one", "many", "linkCell", "row", "td", "link", "sub", "ago", "stackedCell", "top", "bottom", "align", "first", "second", "badge", "label", "severity", "pill", "dot", "text", "axis", "labels", "MUTED", "GRID", "valueAxis", "name", "empty", "chart", "message", "pipeline_default", "charts", "pipelineSchema", "raw", "parsed", "key", "host", "init", "selectedProjects", "weeks", "toggle", "index", "SERIES", "OTHER", "rows", "today", "released", "releasedWithin", "rate", "longDate", "windowStart", "cycleTimes", "data", "production", "inProduction", "awaiting", "awaitingSurvey", "booked", "shiftDays", "cycle", "p85", "percentile", "ages", "ascending", "age", "open", "isOpen", "attention", "needsAttention", "counts", "flagCounts", "flag", "a", "b", "SEVERITIES", "horizon", "due", "day", "dueDate", "overdue", "before", "change", "targeted", "onTime", "from", "revising", "recording", "revisionsSince", "flags", "stages", "stage", "chips", "button", "shown", "byUrgency", "head", "headRow", "body", "emptyRow", "none", "cell", "tr", "who", "nameCell", "inStage", "shortDate", "items", "itemsCell", "flagCell", "wrap", "stageRows", "inexact", "INK", "AGE_BUCKETS", "bucket", "SURFACE", "p50", "seen", "point", "offset", "late", "markLine", "series", "SINGLE", "params", "html", "format_exports", "ahead", "forward", "week", "buckets", "live", "incoming", "total", "sum", "unbooked", "flow", "inOut", "wip", "rowsOut", "milestones", "headerRow", "milestone", "ordered", "position", "middle", "dwell", "started", "table", "consultantRows", "paymentSchema", "zod_default", "owedSchema", "projectSchema", "focusSchema", "salesSchema", "PERIOD_LABELS", "EPOCH", "monthOf", "iso", "addMonths", "month", "count", "shifted", "year", "firstDay", "lastDay", "shiftDays", "daysIn", "sameDay", "day", "wholeMonths", "before", "periodRange", "period", "today", "last", "lastYear", "within", "range", "projectOf", "data", "id", "matches", "selection", "row", "project", "passes", "selectedPayments", "selectedOwed", "inFocus", "focus", "rows", "total", "sum", "earliest", "payments", "key", "first", "seen", "firstPayments", "sales", "SALE_TYPES", "saleType", "monthsBetween", "from", "to", "out", "monthRows", "months", "products", "typeOf", "sold", "soldRows", "type", "product", "runningTotal", "days", "byDay", "running", "amount", "groupRows", "groups", "name", "a", "b", "cohortRows", "firsts", "counts", "cohort", "members", "all", "daysBetween", "byUrgency", "statuses", "AREA_CHART_LIMIT", "MONTHS_SHOWN", "PACE_LAST_MONTH", "PACE_LAST_YEAR", "monthLabel", "month", "MONTHS", "rangeText", "range", "longDate", "monthOf", "shortDate", "owedSummary", "owed", "statuses", "overdue", "awaiting", "draft", "sumOf", "status", "total", "row", "plural", "count", "one", "many", "dueDate", "iso", "today", "signed", "pence", "money", "percent", "part", "whole", "poundsAxis", "value", "stackedMonths", "chart", "labels", "series", "format", "legend", "MUTED", "GRID", "each", "SURFACE", "textCell", "text", "sub", "className", "td", "second", "propertyCell", "project", "link", "sales_default", "charts", "salesSchema", "PERIOD_LABELS", "raw", "parsed", "key", "host", "init", "period", "kind", "name", "toggle", "index", "SERIES", "OTHER", "type", "taken", "colour", "payments", "current", "earliest", "monthsBetween", "addMonths", "selection", "selectedPayments", "selectedOwed", "previous", "periodRange", "within", "amount", "before", "change", "last", "sold", "sales", "soldNow", "byType", "SALE_TYPES", "saleType", "owing", "allSold", "focus", "inFocus", "months", "rows", "monthRows", "first", "types", "_type", "typeColumn", "products", "_name", "column", "sumBy", "pick", "sum", "fill", "nameCell", "cell", "totalRow", "lines", "SINGLE", "days", "line", "daysIn", "_value", "runningTotal", "projects", "about", "table", "ref", "heading", "group", "groupRows", "a", "b", "areas", "params", "area", "INK", "byUrgency", "instalment", "late", "daysBetween", "cohortRows", "cohort", "customers", "again", "payment", "Duration", "external_exports", "datetimepicker_default", "TIMEZONE", "hours", "seconds", "halves", "BANDS", "sapScore", "sap", "sapBand", "score", "floor", "distance", "a", "b", "polygonArea", "polygon", "doubled", "i", "a", "b", "polygonCentroid", "cx", "cy", "cross", "sx", "sy", "x", "y", "projectOnSegment", "p", "dx", "dy", "lengthSquared", "t", "point", "distance", "formatAreaM2", "areaMm2", "formatLengthM", "lengthMm", "newId", "prefix", "noise", "time", "key", "wall", "from", "signedArea", "polygon", "doubled", "index", "a", "b", "pointInPolygon", "point", "inside", "i", "j", "xi", "yi", "xj", "yj", "withoutSpikes", "cycle", "kept", "edge", "top", "first", "last", "usable", "scene", "points", "seen", "pair", "findFaces", "vertex", "walls", "leaving", "add", "to", "list", "position", "one", "two", "next", "back", "cycleOf", "cycles", "start", "parent", "root", "id", "at", "spaceOf", "spaces", "spaceBuilding", "outer", "ring", "shape", "islands", "standsIn", "outlines", "building", "probe", "container", "space", "trimmed", "area", "sides", "left", "right", "enclosedBy", "cross", "o", "triangulate", "triangles", "clipped", "c", "turn", "p", "clipToTriangle", "subject", "triangle", "output", "q", "input", "current", "previous", "meet", "t", "measure", "overlapArea", "other", "total", "WELD_MM", "CORNER_MM", "DEFAULT_WALL_THICKNESS", "PARTITION_THICKNESS", "ALONGSIDE", "SLIVER_MM", "SMALLEST_ROOM", "PASSES", "hung", "scene", "emitter", "feature", "pointOf", "id", "vertex", "wallEnds", "wall", "a", "b", "polygonOf", "room", "points", "at", "findWall", "u", "v", "roomsOn", "wallId", "index", "UNSET", "thicknessOf", "holders", "byPair", "held", "from", "to", "list", "wallKinds", "faces", "roomed", "kinds", "mine", "heated", "findFaces", "spacesOfRooms", "sides", "side", "wallKind", "alongSegment", "point", "across", "length", "distance", "dx", "dy", "along", "off", "vertexAt", "existing", "newId", "splitWall", "candidate", "ends", "middle", "far", "second", "opening", "fixture", "position", "addWalls", "path", "closed", "ids", "count", "drawWalls", "empties", "emptySpaces", "settle", "roomAt", "best", "bestArea", "polygon", "area", "polygonArea", "pointInPolygon", "distinctCorners", "x", "y", "insertRoom", "fields", "placeRoom", "space", "emptySpaceAt", "blankRoom", "boundary", "sameCycle", "one", "two", "start", "forward", "backward", "found", "unroomedSpaces", "filled", "_", "roomsWithIslands", "outlineFigures", "walls", "perimeter", "party", "outline", "roomPolygons", "deleteRoom", "roomId", "removeRoomWithWalls", "rooms", "going", "left", "right", "other", "removeWalls", "neighbours", "shared", "largerFirst", "polygons", "mergeRooms", "keep", "between", "straightenPath", "like", "template", "first", "last", "removeWall", "removeWallSet", "healVertex", "chordThrough", "crossings", "p", "q", "ex", "ey", "denominator", "t", "bestGap", "gap", "round", "splitRoom", "chord", "detachRoom", "before", "edges", "own", "moving", "clones", "tied", "clone", "mapped", "source", "translateVertices", "setVertexAt", "mergeVertices", "into", "normalizeScene", "fuseDuplicates", "survivors", "fused", "key", "fuseInto", "keeping", "losing", "reversed", "vertexId", "meeting", "end", "place", "offset", "width", "degrees", "weldCorners", "moved", "vertices", "j", "joinLooseEnds", "ux", "uy", "half", "consider", "target", "thickest", "reach", "length2", "onto", "w", "nearer", "splitAtMeetings", "changed", "pass", "splitOnce", "i", "crossing", "crossingPoint", "split", "s", "lengthOne", "lengthTwo", "inside", "value", "alignAlongside", "lengthA", "lengthB", "ua", "ub", "movedOne", "movedTwo", "twoGives", "give", "line", "origin", "gaps", "span", "overlap", "shorter", "dropStubs", "looseA", "looseB", "host", "closeSlivers", "entry", "options", "records", "step", "settled", "assignRooms", "finishThickness", "untidyWalls", "tidied", "was", "now", "kept", "after", "spaces", "measured", "measure", "covered", "overlapArea", "pairs", "roomSpace", "spaceRoom", "pair", "record", "byId", "created", "claimed", "cutFrom", "claimSpace", "most", "owner", "around", "fromRooms", "fromEmpty", "total", "inClaim", "ring", "ringWalls", "theirs", "heir", "wallIds", "used", "OPENING_DEFAULTS", "wallFrame", "a", "b", "length", "distance", "ux", "uy", "pointAlong", "offsetMm", "frame", "clampedOffset", "opening", "wallSegments", "openings", "mine", "start", "left", "right", "segments", "cursor", "gap", "end", "normalizeOpenings", "scene", "walls", "wall", "ends", "wallEnds", "offset", "openingSpot", "point", "width", "tolerance", "best", "projection", "projectOnSegment", "doorLeaves", "middle", "PointSchema", "external_exports", "VertexSchema", "WallSchema", "OpeningSchema", "RoomSchema", "RADIATOR_TYPES", "RadiatorSchema", "UnderfloorSchema", "EmitterSchema", "ChimneyBreastSchema", "NewBuildSchema", "FeatureSchema", "FIXTURE_KINDS", "FixtureSchema", "SceneSchema", "AnnotationGeometrySchema", "AnnotationSchema", "TraceSchema", "FloorSchema", "MeasureSchema", "FabricTypeSchema", "ScenarioFixtureSchema", "ScenarioFixturesSchema", "DesignPackageSchema", "HeatLoadContextSchema", "FabricPickSchema", "BaselineSchema", "OverheatingContextSchema", "DesignSchema", "RevisionSchema", "ScheduleRowSchema", "ScheduleSchema", "floorBounds", "floor", "points", "vertex", "annotation", "geometry", "first", "bounds", "x", "y", "GRID_MM", "nearestCorner", "point", "scene", "tolerance", "excluded", "best", "gap", "vertex", "d", "distance", "nearestOnWall", "wall", "ends", "wallEnds", "projection", "projectOnSegment", "SQUARE_TOLERANCE", "QUARTER", "quarterAngle", "a", "b", "squareTo", "left", "right", "squareAngle", "lines", "x", "y", "angle", "length", "houseAngle", "moving", "squareToWalls", "other", "squared", "anchor", "options", "first", "second", "along", "axis", "at", "nearest", "roundPoint", "snapToGrid", "snapPoint", "underlay", "corner", "below", "onWall", "overWall", "dx", "dy", "step", "snapped", "LINE_UP_REACH", "lineUpShift", "shift", "axes", "fixed", "movers", "result", "correction", "mover", "DraftSchema", "external_exports", "PointSchema", "MERGE_MM", "SQUARE_DEG", "OPENING_REACH_MM", "NARROWEST_OPENING_MM", "pixelToWorld", "transform", "pixel", "turn", "x", "y", "draftToWorld", "draft", "world", "point", "room", "opening", "Groups", "size", "_", "index", "root", "a", "b", "settle", "values", "groups", "sums", "value", "sum", "count", "tidy", "corners", "cornerOf", "best", "nearest", "corner", "gap", "distance", "rings", "ring", "id", "all", "at", "edges", "angle", "squareAngle", "cos", "sin", "local", "level", "flat", "from", "to", "dx", "dy", "along", "across", "low", "high", "squareX", "squareY", "settled", "applyDraft", "scene", "rooms", "bySize", "left", "right", "polygonArea", "insertRoom", "openings", "width", "centre", "spot", "openingSpot", "clash", "other", "defaults", "OPENING_DEFAULTS", "newId", "draftPreview", "before", "after", "known", "wall", "wallEnds", "oldOpenings", "specs", "ends", "mine", "wallSegments", "oldRooms", "polygonCentroid", "polygonOf", "CHANGES_HEADER", "StaleDesignError", "Freshness", "design", "updated", "header", "change", "pk", "before", "after", "at", "visited", "request", "resolve", "write", "seen", "error", "freshness", "table4b_default", "table10c_default", "table12d_default", "table32_default", "declination_default", "table6b_default", "table6c_default", "table6d_default", "tableu1_default", "tableu3_default", "tableu4_default", "tableu5_default", "roundMagnitude", "exact", "places", "dot", "whole", "fraction", "digits", "divisor", "quotient", "remainder", "half", "text", "roundTo", "x", "magnitude", "rounded", "sum", "values", "total", "value", "brand", "value", "area", "length", "volume", "uValue", "heatLoss", "watts", "celsius", "airChanges", "airFlow", "speed", "kilowattHours", "kilowattHoursPerDay", "litresPerDay", "kilowattHoursPerMonth", "poundsPerYear", "kilogramsPerYear", "factor", "monthly", "value", "mapMonthly", "values", "transform", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", "VALUE_TYPES", "SHAPES", "checked", "value", "allowed", "what", "spec", "json", "valueType", "item", "leaf", "raw", "unit", "exhaustive", "at", "index", "tableValue", "units", "row", "loadTable", "table", "key", "typedKey", "lookup", "values", "specification", "table", "key", "value", "lookup", "item", "monthlyValues", "row", "monthly", "month", "TABLE_6B", "spec", "table6b_default", "TABLE_6C", "table6c_default", "TABLE_6D", "table6d_default", "GLAZING", "loadTable", "FRAMES", "SHADING", "REFERENCE_LUMENS", "FIXED_LUMENS", "FIXED_EFFICACY", "LOOSE_EFFICACY", "DAYS_IN_YEAR", "lightTransmittance", "glazing", "values", "frameFactor", "frame", "lightAccessFactor", "shading", "equation1", "totalFloorArea4", "occupancy", "equation2a", "elements", "total", "element", "equation2b", "daylightAccess", "equation10", "daysInMonth", "basic", "daylight", "required", "provided", "topUp", "fixed", "loose", "portable", "annual", "mapMonthly", "days", "month", "kilowattHours", "equation11", "sum", "equation12", "energy", "kwh", "watts", "equation13", "equation14", "equation20", "equation21", "U1", "spec", "tableu1_default", "U3", "tableu3_default", "U4", "tableu4_default", "U5", "tableu5_default", "TABLE_6B", "table6b_default", "TABLE_6C", "table6c_default", "TABLE_6D", "table6d_default", "DECLINATION", "declination_default", "EXTERNAL_TEMPERATURE", "loadTable", "SOLAR_IRRADIANCE", "LATITUDE", "SHELTER", "GLAZING", "FRAMES", "SHADING", "DECLINATIONS", "monthlyValues", "WET_SYSTEMS", "LIVING_TEMPERATURE", "LIVING_OFF_PERIODS", "DEGREE", "SECTORS", "SECTOR_DEGREES", "averageExternalTemperature96", "region", "mapMonthly", "celsius", "equation3", "orientation", "pitch", "azimuth", "index", "lower", "upper", "from", "values", "to", "k", "value", "at", "t", "equation2", "month", "coefficients", "a", "b", "c", "latitude", "solarFlux", "horizontal", "irradiance", "annualIrradiance", "flux", "daysInMonth", "total", "solarGain", "window", "transmittance", "frame", "solarGainsFacing", "elements", "windows", "element", "monthly", "watts", "timeConstant", "thermalMassParameter35", "heatLossParameter40", "table9a", "heatTransferCoefficient39", "totalGains84", "internal", "external", "loss", "ratio", "gamma", "factor", "table9b", "utilisation", "heated", "offHours", "constant", "settled", "table9c", "offPeriods", "drop", "hours", "temperature88", "heatingControlType", "hlp", "gains", "input", "prior", "occupancy", "area", "gains_metabolic_66", "gains_lighting_67", "equation12", "appliances", "gains_appliances_68", "gains_cooking_69", "pump", "gains_pumps_and_fans_70", "gains_losses_71", "gains_water_heating_72", "kwh", "gains_total_internal_73", "facing", "solar", "directions", "roofWindows", "solar_gains_roof_window_82", "solar_gains_83", "direction", "total_gains_84", "temperature_85", "average_external_temperature_96", "mass", "utilisation_factor_86", "mean_internal_living_temperature_87", "temperature_88", "utilisation_factor_89", "mean_internal_rest_temperature_90", "living_area_fraction_91", "mean_internal_temperature_92", "tariffs_default", "TABLE_32", "spec", "table32_default", "FUELS", "loadTable", "TARIFF_NAME", "tariffs_default", "TARIFF_FROM", "ELECTRICITY_PENCE", "GAS_PENCE", "DAYS_IN_YEAR", "PENCE_PER_POUND", "MAINS_GAS", "STANDARD_ELECTRICITY", "OFF_PEAK_ELECTRICITY", "ELECTRICITY", "table32Row", "fuel", "row", "values", "rate", "price", "code", "uses", "input", "rows", "main", "water", "pvUsed", "occupancy", "sum", "equation13", "equation20", "standingCharges", "heating", "charges", "seen", "standing", "billLines", "used", "priced", "kwh", "bill", "line", "TABLE_4B", "spec", "table4b_default", "TABLE_10C", "table10c_default", "TABLE_12D", "table12d_default", "TABLE_32", "table32_default", "SYSTEMS", "loadTable", "COOLING", "MONTHLY_CARBON", "FUELS", "OIL_FUELS", "HEAT_PUMP_SYSTEMS", "FURBNOW_HEAT_PUMP_SCOP", "isHeatPump", "system", "heatPumpShare", "modelled", "scop", "STANDARD_TARIFF_CODE", "HIGH_RATE_ELECTRICITY", "DAYS_IN_YEAR", "PENCE_PER_POUND", "fuelRow", "fuel", "values", "standingCharge", "price", "carbon", "fuelCode", "efficiency", "row", "cost", "fuelUsed", "poundsPerYear", "sum", "emissions", "factors", "kilogramsPerYear", "total", "value", "month", "secondaryFraction201", "firstMainHeatSystem", "hasSecondaryHeating", "factor", "DEFAULT_SFP", "FAN_IN_USE_FACTOR", "mechanicalVentilationFans230a", "volume", "throughput", "sfp", "kilowattHours", "fans", "totalElectricity231", "fans230a", "WET_SYSTEMS", "electricity", "tableM1", "overshading", "beta", "generated", "demand", "batteryCapacity", "ratio", "battery", "c1", "c2", "c3", "sapRating258", "energyCostFactor257", "totalFloorArea4", "totalEnergyCost255", "deflator", "rating", "input", "prior", "days", "heat", "secondary_heat_system_fraction_201", "main_heat_system_fraction_202", "second_main_heat_system_fraction_203", "first_main_heat_system_fraction_204", "second_main_heat_system_fraction_205", "first_main_heat_system_efficiency_206", "second_main_heat_system_efficiency_207", "secondary_heat_system_efficiency_208", "cooling_system_efficiency_209", "heatingFuel", "fraction", "percent", "monthly", "kilowattHoursPerMonth", "first_main_heat_system_fuel_211", "second_main_heat_system_fuel_213", "secondary_heat_system_fuel_215", "winter", "summer", "water_heater_efficiency_217", "space", "water", "water_heater_fuel_219", "space_cooling_fuel_221", "mechanical_ventilation_fans_230a", "total_electricity_231", "electricity_for_lighting_232", "equation11", "lightingMonths", "equation10", "pv_energy_used_233a", "pvEnergyUsed233a", "pvAlone", "furbnow_battery_stored", "furbnow_pv_used", "first_main_heat_system_cost_240e", "second_main_heat_system_cost_241e", "secondary_heat_system_cost_242e", "water_heater_cost_247", "space_cooling_cost_248", "pumps_and_fans_cost_249", "energy_for_lighting_250", "charged", "standing_charges_251", "energy_saving_technologies_252", "total_energy_cost_255", "energy_cost_deflator_256", "energy_cost_factor_257", "energy_for_lighting_co2_268", "energy_generating_co2_269", "first_main_heat_system_co2_261", "second_main_heat_system_co2_262", "secondary_heat_system_co2_263", "water_heater_co2_264", "space_cooling_co2_266", "yearDays", "pumps_and_fans_co2_267", "corrected", "spent", "furbnow_corrected_energy_cost", "billed", "bill", "pvGeneration", "flux", "solarFlux", "annualIrradiance", "demandFrom", "yearly", "appliances", "equation13", "cooking", "equation20", "share", "generatedThisMonth", "electricSpace", "used", "electricWater", "equation14", "equation21", "floorVolume3", "floorArea1", "floorHeight2", "storeys", "_", "storey", "volume", "area", "dimensions", "input", "floor_volume_3", "sum", "HAS_OPENINGS", "EXTERNAL", "AIR_HEAT_CAPACITY", "DAYS_IN_MONTH", "elementUValue", "element", "losingArea", "area", "fabricHeatLoss", "elements", "tag", "sum", "heatLoss", "totalExternalArea31", "table21", "wall", "age", "uValue", "ventilationHeatLoss38", "effectiveAirChangeRate25", "dwellingVolume5", "mapMonthly", "changes", "fabric", "input", "prior", "loss", "solid_door_fabric_heat_loss_26", "semi_glazed_door_fabric_heat_loss_26a", "window_fabric_heat_loss_27", "roof_window_fabric_heat_loss_27a", "basement_floor_fabric_heat_loss_28", "ground_floor_fabric_heat_loss_28a", "exposed_floor_fabric_heat_loss_28b", "basement_wall_fabric_heat_loss_29", "external_wall_fabric_heat_loss_29a", "roof_fabric_heat_loss_30", "total_external_area_31", "party_wall_fabric_heat_loss_32", "fabric_heat_loss_33", "thermal_bridges_36", "total_fabric_heat_loss_37", "ventilation_heat_loss_38", "heat_transfer_coefficient_39", "ventilation", "heat_loss_parameter_40", "coefficient", "UNHEATED_MONTHS", "COOLED_MONTHS", "COOLING_TEMPERATURE", "only", "values", "months", "zero", "monthly", "month", "table10b", "requirement", "cooledFraction", "intermittency", "cooling", "kilowattHoursPerMonth", "heating", "input", "prior", "mass", "days", "coefficient", "parameter", "external", "utilisation_factor_94", "table9a", "celsius", "useful_gains_95", "watts", "heat_loss_rate_97", "space_heating_98a", "solar_space_heating_98b", "space_heating_98c", "space_heating_99", "sum", "heat_loss_rate_100", "total_gains_103", "utilisation_factor_101", "factor", "useful_loss_102", "space_cooling_requirement_104", "cooled_fraction_105", "intermittency_factor_106", "space_cooling_requirement_107", "space_cooling_requirement_108", "tableu6_default", "TABLE", "loadTable", "spec", "tableu6_default", "normalise", "value", "compact", "outcode", "code", "outward", "inward", "area", "second", "region", "tableu2_default", "U2", "spec", "tableu2_default", "TABLE_U2", "loadTable", "NOT_MASONRY", "MECHANICAL", "EXTRACT_SYSTEMS", "storeys9", "storeys", "floorHeight2", "additionalInfiltration10", "airChanges", "netArea", "element", "structuralInfiltration11", "elements", "walls", "area", "masonry", "sum", "wall", "groundInfiltration12", "floor", "draughtProofWindowPercentage14", "windows", "factor", "proofed", "window", "windowInfiltration15", "percentage", "infiltrationRate18", "airChanges8", "infiltrationRate16", "ap50", "ap4", "monthlyAverageWindSpeed22", "region", "mapMonthly", "monthlyValues", "speed", "effectiveAirChangeRate24d", "adjusted", "wholeHouseExtract24c", "throughput", "ventilation", "input", "prior", "ventilation_open_chimney_6a", "airFlow", "ventilation_open_flue_6b", "ventilation_fire_flue_6c", "ventilation_boiler_flue_6d", "ventilation_other_flue_6e", "ventilation_blocked_chimney_6f", "ventilation_extract_fan_7a", "ventilation_passive_vent_7b", "ventilation_flueless_gas_fire_7c", "ventilation_infiltration_8", "ventilation_air_changes_8", "additional_infiltration_10", "structural_infiltration_11", "ground_infiltration_12", "lobby_infiltration_13", "draught_proof_window_percentage_14", "window_infiltration_15", "infiltration_rate_16", "infiltration_rate_18", "shelter_factor_20", "sheltered_infiltration_rate_21", "monthly_average_wind_speed_22", "monthly_wind_factor_22a", "wind", "adjusted_infiltration_rate_22b", "mechanical", "mvhr_air_change_rate_23a", "mvhr_air_change_rate_23b", "mvhr_air_change_rate_23c", "mechanical_ventilation_with_hr_24a", "whole_house_extract_24c", "effective_air_change_rate_24d", "tablej1_default", "tablej2_default", "tablej4_default", "tablej5_default", "J1", "spec", "tablej1_default", "J4", "tablej4_default", "TABLE_32", "table32_default", "TABLE_J1", "loadTable", "TABLE_J4", "TABLE_32_ROWS", "J2", "tablej2_default", "J5", "tablej5_default", "FACTOR_J2", "monthlyValues", "FACTOR_J5", "SUMMER_MONTHS", "ELECTRICITY_FUEL_CODES", "DRAWN", "STORED", "WATER_HEAT_CAPACITY", "KILOJOULES_PER_KILOWATT_HOUR", "assumedOccupancy42", "totalFloorArea4", "factor", "tableJ1", "hotWaterSupply", "mapMonthly", "celsius", "hotFraction", "mains", "showersPerDay", "numberOfBaths", "numberOfShowers", "occupancy", "bathsPerDay", "hotWaterShowers42a", "input", "showers", "monthly", "litresPerDay", "flowRate", "values", "seasonal", "month", "hotWaterBaths42b", "baths", "hotWaterOther42c", "energyContent45", "daysInMonth", "litres", "kilowattHoursPerMonth", "totalHotWaterLoss55", "volume", "kilowattHoursPerDay", "thickness", "lossFactor", "volumeFactor", "temperatureFactor", "waterPrimaryCircuitLoss59", "code", "winterHours", "days", "waterCombiLoss61", "usage", "water", "prior", "assumed_occupancy_42", "hot_water_showers_42a", "hot_water_baths_42b", "hot_water_other_42c", "hot_water_usage_43", "monthly_hot_water_usage_44", "energy_content_of_water_used_45", "distribution_loss_46", "energy", "total_hot_water_loss_55", "water_storage_loss_57", "day", "water_primary_circuit_loss_59", "water_combi_loss_61", "water_heat_required_62", "water_heat_gains_65", "none", "worksheet", "input", "rows", "region", "dimensions", "ventilated", "ventilation", "lost", "fabric", "heated", "water", "gained", "gains", "demanded", "heating", "rating", "RADIATOR_DEFAULTS", "RADIATOR_DEPTH", "RADIATOR_GAP_MM", "RATED", "RADIATOR_LABELS", "RADIATOR_EXPONENT", "FLOW_DROP_K", "UNDERFLOOR_W_PER_M2K", "UNDERFLOOR_LABELS", "FLOOR_SURFACE_MAX_C", "WET_FLOOR_SURFACE_MAX_C", "WET_ROOMS", "meanWaterC", "flowC", "ratedWattsPerMetre", "type", "heightMm", "rows", "index", "h0", "w0", "h1", "w1", "correction", "deltaK", "radiatorWatts", "radiator", "roomC", "floorLimitWPerM2", "roomType", "surface", "underfloorWatts", "underfloor", "room", "area", "water", "RADIATOR_LENGTHS_MM", "suggestEmitter", "shortW", "room", "flowC", "radiator", "best", "type", "RATED", "height", "length", "RADIATOR_LENGTHS_MM", "watts", "radiatorWatts", "underfloor", "underfloorWatts", "suggestionText", "suggestion", "parts", "RADIATOR_LABELS", "emitterLabel", "emitter", "area", "UNDERFLOOR_LABELS", "emitterWatts", "roomCover", "emitters", "mine", "delivered", "total", "each", "holdsWall", "wall", "vertex", "index", "next", "signedArea", "polygon", "doubled", "a", "b", "roomSide", "scene", "count", "forward", "polygonOf", "radiatorBar", "candidate", "ends", "wallEnds", "side", "frame", "wallFrame", "depth", "RADIATOR_DEPTH", "inward", "away", "RADIATOR_GAP_MM", "shift", "point", "pointAlong", "radiatorPlacement", "tolerance", "projection", "projectOnSegment", "t", "across", "holders", "holder", "chosen", "centre", "offset", "inside", "within", "roomAt", "polygonArea", "normalizeEmitters", "rooms", "walls", "UNKNOWN_SITE", "recordedCylinder", "worksheet", "given", "litres", "litresOf", "fixtures", "fixture", "siteOf", "baseline", "scenario", "recorded", "emitters", "rooms", "flowC", "drawn", "shortRooms", "room", "roomCover", "extraLines", "extras", "site", "lines", "ceilingOf", "room", "shape", "low", "high", "clip", "polygon", "below", "kept", "inside", "p", "current", "index", "previous", "span", "along", "Profile", "ceiling", "radians", "ts", "point", "ridge", "t", "across", "run", "flagged", "totalArea", "volume", "piece", "doubled", "cx", "cy", "a", "b", "cross", "area", "stops", "ta", "tb", "atRidge", "total", "from", "to", "length", "profileOf", "volumeHeightMm", "signedArea", "polygon", "doubled", "i", "a", "b", "area", "lineIntersection", "p", "d", "q", "e", "cross", "t", "MITRE_LIMIT", "inset", "offsets", "count", "sign", "lines", "length", "direction", "normal", "offset", "corner", "before", "after", "met", "turn", "reach", "isConvexCorner", "c", "inTriangle", "d1", "d2", "d3", "negative", "positive", "triangulate", "ring", "point", "next", "indexes", "_point", "triangles", "guard", "clipped", "index", "clipConvex", "subject", "clip", "output", "inside", "input", "j", "current", "previous", "crossing", "overlap", "one", "two", "total", "triangle", "SOME_FLOOR_MM2", "breasts", "scene", "feature", "newBuilds", "breastOutline", "breast", "wall", "candidate", "room", "ends", "wallEnds", "side", "roomSide", "frame", "wallFrame", "inward", "from", "pointAlong", "to", "into", "point", "breastBlock", "outline", "toIn", "fromIn", "half", "along", "unit", "shift", "a", "i", "x", "y", "length", "roomAreaMm2", "polygonArea", "polygonOf", "breastAreaMm2", "roomId", "total", "innerBreastAreaMm2", "each", "normalizeFeatures", "rooms", "walls", "outlines", "overlap", "holdsWall", "NEW_BUILD_FLOOR", "NEW_BUILD_ROOF", "newBuildType", "types", "made", "type", "markNewBuild", "scene", "polygon", "floor", "roof", "newId", "x", "y", "newBuildParts", "outline", "newBuilds", "area", "overlap", "mm2", "one", "two", "newBuildAt", "point", "slack", "square", "half", "POINTS", "UNKNOWN", "contains", "polygon", "x", "y", "inside", "ax", "ay", "index", "bx", "by", "outwardDeg", "a", "b", "length", "nx", "ny", "probe", "facing", "northDeg", "outward", "UNKNOWN", "turned", "POINTS", "BridgeError", "MM_PER_M", "MM2_PER_M2", "metres2", "areaMm2", "text", "spec", "key", "fallback", "value", "nested", "resolve", "types", "element", "reference", "referenced", "type", "polygonAreaMm2", "polygon", "total", "index", "here", "next", "storeyHeightMm", "rooms", "defaultMm", "totalArea", "weighted", "room", "area", "wallMm2", "wall", "storeyMm", "id", "candidate", "shaped", "profileOf", "wallElement", "openingsMm2", "thicknessMm", "insulation", "uninsulated", "age", "raw", "measured", "builtOf", "map", "built", "buildElements", "scenes", "ceilingHeightsMm", "names", "northDeg", "floorIds", "defaultWall", "defaultFloor", "defaultRoof", "wallGroups", "windowGroups", "doorKinds", "doorIds", "groundParts", "roofParts", "roofExtraMm2", "roofRoomMm2", "partyAreaMm2", "groundPerimeterMm", "builtFloors", "builtRoofs", "floorAreasMm2", "withoutRooms", "scene", "floor", "qualified", "view", "heated", "polygons", "roomsArea", "top", "ownFloorMm2", "ownRoofMm2", "factor", "mm2", "newBuildParts", "floorType", "roofType", "ceilingMm", "volumeHeightMm", "grossMm2", "openings", "opening", "wallType", "group", "middle", "newBuildAt", "orientation", "facing", "windowType", "part", "existing", "doorType", "groundMm2", "topMm2", "roofMm2", "perimeterM", "elements", "keys", "parts", "most", "thickness", "kind", "floors", "builtFloorMm2", "builtPerimeterMm", "floorElement", "perimeterMm", "roofElement", "inRoof", "roofs", "summary", "wallKind", "party", "holders", "heated", "room", "resolve", "scene", "types", "at", "vertex", "rooms", "polygon", "point", "polygonAreaMm2", "breastAreaMm2", "ceilingOf", "r", "byPair", "wall", "index", "from", "to", "wallId", "list", "walls", "a", "b", "fabric", "mine", "kind", "openingsByWall", "opening", "existing", "claims", "id", "ScenarioOptionSchema", "external_exports", "ScenarioGroupSchema", "ScenarioContextSchema", "MIN_SAVING", "DESIGN_DELTA_K", "SIZING_MARGIN", "neededKw", "peak", "installsHeatPump", "option", "isHeatPump", "sharesOf", "input", "rows", "corrected", "heatPumpShare", "scoreOf", "run", "main", "water", "outcomeOf", "cost", "peakWatts", "baseBills", "heatLoss", "sap", "bills", "carbon", "saving", "metres2", "value", "number", "quantities", "prepared", "scenes", "types", "amounts", "key", "index", "element", "scene", "view", "resolve", "wall", "opening", "scheduleCost", "row", "counts", "basis", "candidateIds", "keys", "parts", "part", "targetedAmount", "targets", "whole", "amount", "every", "COUNTED_OPTIONS", "costOf", "rate", "HIGHER_IS_BETTER", "frontier", "packages", "metric", "values", "sign", "order", "_", "left", "right", "front", "best", "score", "Explorer", "_Explorer", "context", "rates", "id", "UNKNOWN_SITE", "patches", "fixtures", "ids", "patch", "sums", "sum", "net", "weight", "entries", "covered", "total", "optionId", "gross", "choice", "unit", "line", "extraLines", "site", "lines", "grant", "group", "priced", "picked", "worksheet", "outcome", "g", "enabled", "options", "progress", "cancelled", "sliceMs", "groups", "digits", "capacities", "_group", "costs", "started", "n", "capacity", "digit", "next", "steps", "sofar", "before", "after", "getCookie", "name", "part", "key", "rest", "fetchDesign", "url", "response", "DesignSchema", "SavedResponse", "external_exports", "ConflictResponse", "SceneSchema", "jsonHeaders", "change", "init", "freshness", "CHANGES_HEADER", "send", "method", "body", "StaleDesignError", "detail", "createFloor", "design", "level", "FloorSchema", "renameFloor", "deleteFloor", "reorderFloors", "floors", "fallback", "fetchCalcContext", "fetchSchedule", "ScheduleSchema", "postScheduleMeasure", "RevisionsResponse", "RevisionSchema", "fetchRevisions", "RestoreResponse", "postRestore", "revision", "scenario", "createFabricType", "FabricTypeSchema", "getSite", "modelUrl", "keep", "wallDefaultU", "fabricTypesUrl", "spec", "patchFabricType", "patchHeatLoad", "settings", "HeatLoadContextSchema", "patchOverheating", "OverheatingContextSchema", "OrientationSchema", "patchOrientation", "postTwin", "patchBaseline", "answers", "patchChanges", "changes", "SceneNameSchema", "copyScene", "renameScene", "deleteScene", "deleteFabricType", "createAnnotation", "floor", "kind", "geometry", "pkg", "option", "AnnotationSchema", "patchAnnotation", "patch", "ProjectDocumentSchema", "external_exports", "projectDocuments", "url", "response", "uploadTrace", "floor", "source", "page", "body", "change", "getCookie", "message", "TraceSchema", "patchTrace", "patch", "send", "postDraft", "DraftSchema", "putScene", "version", "scene", "placed", "ConflictResponse", "SavedResponse", "getJson", "what", "detail", "fetchScenarioContext", "ScenarioContextSchema", "MagicplanPlanSchema", "fetchMagicplanPlans", "MagicplanPreviewSchema", "fetchMagicplanPreview", "ImportResponse", "DesignSchema", "postMagicplanImport", "createPackage", "DesignPackageSchema", "duplicatePackage", "patchPackage", "deletePackage", "SideSchema", "SceneSchema", "BringForwardSchema", "fetchBringForward", "postBringForward", "token", "resolveFabric", "types", "element", "ref", "match", "type", "DEFAULT_WALL_COLOR", "TYPE_HUES", "fabricColor", "index", "candidate", "glazingLineCount", "glazing", "doorInsulated", "TITLES", "word", "value", "key", "specSummary", "ageLabels", "spec", "insulation", "wallsUsing", "scenes", "count", "scene", "kinds", "wallKinds", "wall", "usedByText", "INSULATION_PLACES", "insulationChoice", "kind", "place", "insulationKindOf", "mode", "wallUSource", "measured", "thickness", "age", "base", "amount", "PAD", "INK", "BAND_LINES", "HIT_PX", "niceStep", "span", "ticks", "raw", "power", "scaled", "formatPounds", "pence", "pounds", "formatMetric", "metric", "value", "ScatterChart", "canvas", "onPick", "onHover", "event", "pointer", "rect", "x", "y", "index", "packages", "front", "markers", "point", "values", "maxCost", "low", "high", "margin", "cost", "best", "bestDistance", "dx", "dy", "distance", "tight", "ratio", "context", "n", "marker", "radius", "color", "right", "bottom", "yStep", "letter", "floor", "xStep", "ventilation_default", "AIR_CAPACITY", "ventilation_default", "defaultAirPermeability", "basis", "candidates", "table", "q50", "from", "best", "next", "typicalFactor", "exposure", "heightM", "bands", "index", "limit", "additionsM3h", "features", "add", "minimumAch", "type", "living", "wet", "supplyC", "outsideC", "insideC", "efficiency", "roomVentilation", "input", "leakage50", "additions", "leakage", "minimum", "designDelta", "typicalDelta", "continuousDesignDelta", "continuousTypicalDelta", "continuous", "leakageDesign", "leakageTypical", "continuousDesign", "continuousTypical", "nearestAtLeast", "values", "wanted", "value", "nearestAtMost", "found", "setbackCell", "dropC", "reheatH", "mass", "column", "row", "w", "setbackReadLonger", "heating", "hours", "asked", "cell", "reheatWPerM2", "setback", "disuse", "withSetback", "temperatures_default", "ROOMS", "temperatures_default", "SYNONYMS", "ZONES", "ADJOINING", "roomType", "candidates", "candidate", "text", "option", "synonym", "head", "indoorC", "type", "indoor", "zone", "number", "found", "elevationCorrectionC", "elevationM", "free_m", "step_m", "per_step_c", "outdoor", "zoneNumber", "percentile", "correction", "round1", "highCeilingFactor", "heightM", "points", "first", "i", "h1", "f1", "h0", "f0", "value", "facingLabel", "boundary", "names", "heatLoad", "model", "conditions", "uvalues", "outdoor", "typed", "room", "type", "assumed", "roomType", "internal", "indoorC", "factor", "typicalFactor", "rooms", "elements", "unlisted", "envelopeM2", "surface", "farDesign", "farTypical", "ADJOINING", "other", "deltaDesign", "deltaTypical", "resolved", "u", "element", "volumeM3", "ventilation", "roomVentilation", "fabricDesignW", "sum", "row", "fabricTypicalW", "reheatW", "reheatWPerM2", "ceiling", "highCeilingFactor", "designW", "typicalW", "pick", "total", "roomsW", "areaM2", "fabricW", "constructions_default", "TABLES", "constructions_default", "decode", "table", "row", "at", "cells", "insulation", "dims", "dim", "n", "depth", "correction", "entry", "cache", "rows", "tableId", "cached", "candidate", "decoded", "count", "construction", "id", "nearest", "tableId", "description", "insulation", "wanted", "best", "bestScore", "row", "rows", "score", "key", "value", "have", "describe", "parts", "table", "TABLES", "candidate", "dim", "GROUND_LAMBDA", "WIND_SHIELDING", "WALL_M", "RSI", "RSE", "INSULATION_LAMBDA", "BRIDGED_LAMBDA", "DECK_R", "VOID_R", "VOID_HEIGHT_M", "VOID_WALL_U", "VENTS_M2_PER_M", "WIND_M_S", "MIN_RATIO", "slab", "b", "lambda", "resistance", "dt", "perimeterRatio", "exposedPerimeterM", "areaM2", "groundFloorU", "input", "insulationM", "ground", "underfloor", "ADDED_LAMBDA", "ASSUMED_INSULATION_MM", "text", "spec", "key", "fallback", "value", "number", "nested", "TIMBER_MM", "LATE", "EARLY", "mappedWall", "internal", "kind", "insulation", "insulationKind", "specAge", "age", "thickness", "insulationMm", "row", "nearest", "external", "internalInsulation", "filled", "added", "brick", "stone", "cavity", "fill", "block", "description", "wanted", "depth", "mappedRoof", "roomInRoof", "mappedWindow", "glazing", "frame", "triple", "lowE", "argon", "panes", "gapText", "gap", "mappedDoor", "withAdded", "u", "addedMm", "wallHeatLoadU", "mapped", "fromMapping", "how", "describe", "groundConstruction", "INTERNAL_FLOOR", "internalFloor", "which", "elementOf", "elements", "candidate", "rdsapU", "element", "raw", "rdsapKey", "fabric", "types", "id", "type", "own", "addedResistance", "patched", "baseline", "after", "before", "withResistance", "resistance", "designUValues", "derived", "settings", "byKey", "rdsap", "what", "HeatFabricError", "chosen", "known", "construction", "resolve", "surface", "room", "deltaDesign", "picked", "leaks", "groundFloorU", "resolved", "fabricUValue", "NO_VENTILATION", "STEPS", "planExists", "scenes", "scene", "doneSteps", "raw", "known", "step", "key", "firstOpen", "done", "index", "commonThickness", "thicknesses", "counts", "value", "best", "count", "toCheck", "kinds", "wallKinds", "outside", "wall", "common", "wallCount", "walls", "check", "fixtureCount", "kind", "total", "fixture", "trickleCount", "opening", "roomVentilation", "roomId", "room", "candidate", "vents", "fans", "edges", "vertex", "next", "trickles", "extracts", "POINT_NAMES", "frontFaces", "northOnScreen", "bearing", "MM_PER_M", "MM2_PER_M2", "SLIVER", "ModelError", "pairKey", "a", "b", "openingsOn", "openings", "wallLengthMm", "opening", "centre", "count", "value", "fabricKey", "types", "element", "reference", "fallback", "type", "resolve", "buildModel", "floors", "ordered", "views", "floor", "placed", "_floor", "index", "room", "outline", "area", "roofKey", "groundKey", "model", "view", "floorName", "byPair", "wall", "at", "v", "sceneRooms", "r", "roomsById", "drawn", "ring", "vertex", "edgeWalls", "i", "next", "wallId", "inner", "inset", "areaM2", "innerBreastAreaMm2", "shaped", "profileOf", "heightM", "surfaces", "exposedPerimeterM", "lengthM", "length", "other", "id", "neighbour", "boundary", "explicit", "w", "wallFabric", "grossM2", "openingM2", "openingArea", "outlineArea", "candidate", "shares", "others", "found", "covered", "share", "overlap", "facing", "above", "built", "newBuildParts", "mm2", "split", "whole", "pick", "parts", "left", "part", "key", "each", "fabric", "below", "onGround", "temperature", "vented", "roomVentilation", "NO_VENTILATION", "FALLBACK_ZONE", "BUILT_FORMS", "AGE_BANDS", "ERA_BANDS", "POST_2006_AGES", "wallSpec", "types", "resolve", "wallType", "spec", "construction", "insulation", "insulated", "resolveConditions", "context", "floors", "settings", "age", "zone", "zoneFrom", "q50", "q50From", "chosen", "defaultAirPermeability", "indoor", "heightM", "total", "floor", "system", "heating", "outdoor", "designHeatLoad", "derived", "baseline", "resolution", "model", "buildModel", "uvalues", "designUValues", "heatLoad", "SAP_INDOOR_C", "reconcile", "result", "sapCoefficientWK", "sapFabricWK", "deltaK", "buckets", "bridgingW", "room", "element", "kind", "facing", "ventilationW", "watts", "EXTRACT_SYSTEMS", "EXTRACT_M3H", "extractWatts", "patches", "patch", "designC", "flow", "AIR_CAPACITY", "shareOf", "key", "candidate", "elementOf", "covered", "share", "area", "peakModel", "bridging", "surfaces", "rdsapKey", "list", "patched", "resistance", "addedResistance", "replaced", "rdsapU", "surface", "after", "withResistance", "BREAST_DEPTH_MM", "BREAST_WIDTH_MM", "SLACK_MM", "JOG_DEPTH_MM", "NOISE_MM", "IN_LINE_MM", "SQUARE", "STRAIGHT", "ALCOVE_MM", "sub", "a", "b", "cross", "dot", "unit", "length", "signedArea", "polygon", "doubled", "index", "within", "value", "low", "high", "corners", "points", "n", "inside", "found", "at", "here", "into", "out", "turn", "slice", "ring", "from", "to", "outsideWalls", "scene", "kinds", "wallKinds", "held", "room", "vertex", "next", "wall", "findWall", "roomJogs", "floor", "roomId", "outside", "candidate", "polygonOf", "turns", "count", "wallOf", "envelope", "id", "jogs", "used", "k", "c", "offset", "pattern", "corner", "prior", "p", "v1", "v2", "v3", "v4", "along", "after", "width", "depth", "path", "before", "beyond", "lineWalls", "notchWalls", "like", "opened", "opening", "hung", "emitter", "breast", "signs", "one", "two", "step", "walls", "centre", "sum", "total", "point", "keptOutlines", "breasts", "breastOutline", "outline", "findJogs", "floors", "ordered", "footprints", "jog", "stacked", "other", "overlap", "middle", "reach", "rank", "straighten", "straightenPath", "projectOnSegment", "start", "inward", "probe", "sign", "roomsOn", "pointInPolygon", "newId", "BAND_MM", "ON_LINE_MM", "SHORTEST_MM", "TIE_MM", "APART_MM", "PARALLEL", "offset", "line", "point", "proposeParty", "scene", "sides", "exposed", "outsideWalls", "opened", "opening", "outside", "wall", "ends", "wallEnds", "length", "runs", "seen", "seed", "a", "b", "members", "end", "key", "p", "q", "cross", "total", "member", "along", "x", "y", "bucket", "run", "one", "two", "best", "next", "picked", "opposite", "walls", "tied", "TALLER_MM", "LOWER_MM", "SLIVER_M2", "label", "floor", "metres", "mm", "jogCheck", "jog", "room", "each", "wall", "selection", "findWall", "why", "then", "heightCheck", "height", "off", "name", "what", "planChecks", "floors", "byId", "jogs", "findJogs", "heights", "absorbFix", "candidate", "into", "neighbours", "lossCause", "storeyMm", "by", "element", "key", "sum", "top", "one", "two", "partyChecks", "propertyType", "sides", "kind", "runs", "proposeParty", "walls", "run", "length", "total", "id", "ends", "wallEnds", "which", "tie", "IDENTITY", "RADIANS", "normalAngle", "degrees", "turned", "turn", "x", "y", "quarter", "q", "cos", "sin", "apply", "m", "point", "translation", "dx", "dy", "rotationAbout", "pivot", "followedBy", "first", "second", "isIdentity", "m", "normalAngle", "matching", "from", "to", "fromNext", "toNext", "angle", "before", "after", "RADIANS", "x", "y", "turn", "rounded", "point", "apply", "movedScene", "scene", "vertex", "feature", "movedGeometry", "geometry", "movedAnnotations", "annotations", "annotation", "movedTrace", "trace", "rotation", "describe", "centre", "parts", "shown", "shift", "KEEP", "ITERATIONS", "GRID", "SAME_PLACE_MM", "FIT_MM", "MOST", "outside", "scene", "corners", "walls", "byId", "wall", "outline", "findFaces", "id", "ends", "wallEnds", "everyWall", "nearest", "point", "best", "gap", "a", "b", "projection", "projectOnSegment", "kept", "pairs", "slide", "start", "dx", "dy", "score", "overall", "iteration", "x", "y", "moved", "foot", "left", "right", "close", "stepX", "stepY", "sum", "pair", "bounds", "points", "xs", "ys", "quarter", "m", "fits", "lower", "upper", "below", "found", "q", "turn", "turned", "apply", "above", "starts", "middle", "i", "j", "offset", "normalAngle", "places", "fit", "place", "good", "isIdentity", "misfit", "gaps", "corner", "footprints", "area", "over", "shape", "measure", "footprint", "overlapArea", "overhang", "BETTER_MM", "BETTER_M2", "searched", "betterFit", "now", "key", "there", "movedScene", "closer", "fuller", "ATTACHED", "STARTER_WALL", "HIGH_W_PER_M2", "IMPLAUSIBLE_W_PER_M2", "OFF_WALLS_MM", "OVER_NOTHING", "OVER_NOTHING_M2", "ADRIFT_M2", "label", "floor", "modelChecks", "input", "floors", "types", "roomLoss", "propertyType", "modelError", "checks", "drawn", "room", "roomsWithIslands", "empties", "emptySpaces", "planChecks", "opening", "party", "wall", "proposed", "proposals", "partyChecks", "kind", "outside", "resolve", "index", "below", "off", "misfit", "over", "better", "betterFit", "why", "view", "assumed", "first", "candidate", "byLoss", "left", "right", "implausible", "wildest", "each", "named", "fix", "absorbFix", "lossy", "worst", "lossCause", "FALLBACK_ZONE", "airless", "heating", "longer", "setbackReadLonger", "reheatWPerM2", "defaulted", "element", "stepCheck", "checks", "at", "step", "count", "index", "check", "next", "placeOf", "id", "boundsOfSelection", "scene", "selection", "wallPoints", "wall", "each", "wallEnds", "points", "room", "polygonOf", "opening", "emitter", "xs", "point", "ys", "PINCH_STEP", "STREAM_MS", "LINE_PX", "PAGE_PX", "WheelReader", "event", "scale", "dx", "dy", "step", "legacy", "middle", "a", "b", "apart", "TouchGesture", "id", "x", "y", "pair", "before", "spot", "first", "second", "after", "key", "one", "two", "was", "now", "TOUCH_SLOP_PX", "TOUCH_HOLD_MS", "HeldTouch", "press", "held", "zoomKey", "planShown", "OPENINGS", "KINDS", "mm", "value", "describeHover", "scene", "hover", "room", "each", "area", "formatAreaM2", "roomAreaMm2", "wall", "ends", "wallEnds", "length", "wallKinds", "opening", "emitter", "HoverMarker", "target", "group", "layer", "id", "key", "KIND_TITLES", "SESSION_GAP_MS", "OPENING_NAMES", "OPENING_LETTERS", "roomName", "scene", "id", "room", "wallNumber", "roomId", "wallId", "each", "index", "from", "at", "to", "wallLabel", "roomsOn", "number", "openingTag", "opening", "same", "openingRoom", "fabricName", "names", "byId", "list", "item", "a", "b", "wallChanges", "before", "after", "changes", "old", "now", "wall", "was", "target", "label", "openingChanges", "tag", "lower", "key", "moved", "ROOM_FIELDS", "roomChanges", "name", "value", "emitterChanges", "emitter", "fixtureChanges", "fixture", "cornersMoved", "vertex", "annotationChanges", "measureNames", "live", "title", "describeChange", "corners", "sessionsOf", "steps", "gapMs", "lines", "step", "change", "sessions", "current", "close", "kinds", "line", "group", "last", "savedLabel", "created", "when", "beyond", "boundary", "facing", "floorBeyond", "element", "ceilingBeyond", "typeOf", "scene", "types", "match", "named", "type", "kind", "ELEMENT_OF", "id", "drawn", "wall", "opening", "resolve", "row", "group", "label", "where", "ORDER", "inspect", "result", "rows", "number", "wallNumber", "each", "tag", "openingTag", "place", "a", "b", "highlight", "svg", "layer", "marked", "HANDLE_PX", "CATCH_PX", "SQUARE_DEG", "catchOn", "scene", "point", "tolerance", "free", "snapped", "snapPoint", "squareTurn", "degrees", "reference", "gap", "houseAngle", "square", "bearing", "from", "to", "turnTo", "pivot", "start", "steps", "normalAngle", "floorTool", "host", "drag", "stage", "matchBase", "first", "second", "setStage", "next", "ctx", "handleOf", "furniture", "matched", "matching", "IDENTITY", "endMatch", "keep", "base", "move", "isIdentity", "tool", "event", "tol", "caught", "target", "turn", "followedBy", "rotationAbout", "distance", "specs", "shift", "translation", "formatLengthM", "current", "UNDERLAY_KEY", "RUN_MS", "alignView", "underlay", "label", "floor", "centre", "bounds", "floorBounds", "readoutOf", "reference", "off", "misfit", "corners", "floorAligner", "deps", "pivot", "pivotFloor", "found", "foundFor", "floors", "core", "all", "view", "chosen", "signature", "other", "scene", "commit", "base", "move", "apply", "aligner", "tool", "host", "readout", "point", "stage", "floorTool", "lastStep", "moveBy", "now", "running", "boxes", "each", "box", "moving", "id", "degrees", "about", "rotationAbout", "dx", "dy", "translation", "result", "fits", "middle", "fit", "vertex", "words", "describe", "index", "CATEGORY_COLORS", "TREATED_COLOR", "CATEGORY_LABELS", "CATEGORY_ORDER", "matches", "kind", "terms", "term", "categoryOf", "defaultModeOf", "paletteEntries", "measures", "measure", "category", "paletteGroups", "entries", "query", "needle", "groups", "matching", "entry", "OUTSIDE_MM", "KIT_SPACING_MM", "chains", "scene", "wallIds", "at", "vertex", "edges", "wall", "incident", "byId", "used", "walk", "start", "first", "path", "edge", "next", "paths", "walls", "point", "outline", "types", "view", "resolve", "envelope", "loops", "closed", "loop", "polygonArea", "room", "polygonOf", "besideHouse", "slot", "outside", "left", "right", "candidate", "length", "along", "x", "y", "pointAlong", "nx", "ny", "cx", "cy", "polygonCentroid", "openingPoints", "type", "points", "opening", "areas", "polygons", "polygon", "ON_THE_HOUSE", "besideTheHouse", "group", "placements", "scenes", "top", "found", "add", "floor", "geometries", "geometry", "mine", "roof", "roundPoint", "targetPlacements", "targets", "floors", "id", "prefix", "target", "overRoom", "atOpening", "alongWall", "wallId", "ends", "wallEnds", "roomId", "openingId", "REACH_PX", "wallAt", "scene", "point", "worldPerPixel", "best", "bestDistance", "wall", "ends", "wallEnds", "projection", "projectOnSegment", "reach", "canBeParty", "roomsOn", "paint", "brush", "brushTool", "painting", "done", "stroke", "ctx", "chosen", "target", "candidate", "_event", "_point", "WINDOW_KINDS", "DOOR_KINDS", "OPENING_REACH_MM", "targetOf", "kind", "mode", "defaultModeOf", "inside", "point", "polygon", "within", "i", "j", "a", "b", "openings", "scene", "types", "type", "view", "resolve", "wall", "opening", "pointAlong", "dropped", "worldPerPixel", "all", "target", "wallAt", "geometry", "alongWall", "key", "same", "each", "chains", "points", "outline", "room", "candidate", "polygonOf", "overRoom", "found", "nearest", "left", "right", "distance", "atOpening", "dropPreview", "geometries", "index", "FIGURES_VERSION", "copyPhase", "phase", "work", "round", "value", "digits", "factor", "total", "values", "sum", "packagedKinds", "explorer", "options", "wanted", "kinds", "group", "option", "phasesOf", "phases", "choiceFor", "fabricOf", "rows", "ventilation", "name", "endUseOf", "run", "main", "water", "sharesOf", "kwh", "use", "fuelName", "code", "words", "fuelsOf", "input", "fuels", "line", "billLines", "entry", "fuel", "performanceOf", "choice", "outcome", "patches", "loads", "overheating", "sapBand", "quantityOf", "row", "quantity", "basis", "amount", "costOf", "scheduled", "scheduleCost", "cost", "solarOf", "pvGeneration", "deltaOf", "after", "without", "figuresOf", "packaged", "optionsOf", "kind", "none", "baseline", "measures", "done", "phased", "index", "grant", "mine", "measureCost", "delta", "others", "other", "grants", "measureGrant", "g", "wholeChoice", "whole", "solar", "TARIFF_NAME", "QUANTITY", "magnitude", "value", "number", "QUANTITY", "list", "as", "item", "text", "element", "raw", "openings", "u", "proofed", "area", "uValue", "count", "worksheetInputFrom", "given", "optional", "length", "FURBNOW_HEAT_PUMP_SCOP", "coverage", "parts", "targets", "chosen", "part", "MM_PER_M", "MM2_PER_M2", "share", "element", "sum", "field", "total", "JANUARY", "HeatLossError", "withGeometry", "derived", "fresh", "swapped", "Prepared", "context", "scenes", "ceilingHeightsMm", "types", "floors", "buildElements", "scene", "index", "storeyHeightMm", "resolve", "room", "volumeHeightMm", "worksheetInputFrom", "overrides", "key", "patch", "cached", "names", "typed", "parsed", "name", "base", "patched", "split", "elements", "before", "after", "covered", "rest", "patches", "input", "mine", "next", "fields", "worksheet", "summarise", "rows", "corrected", "JANUARY", "total", "month", "heatLoss", "context", "scenes", "ceilingHeightsMm", "types", "Prepared", "tolerances_default", "PER_ELEMENT", "FORMULAS", "worksheet_flow_default", "FLOW", "worksheet_flow_default", "SECTIONS", "SECTION_STARTS", "MONTHS", "NUMBERED", "numberOf", "key", "match", "line", "letter", "section", "start", "TOKEN", "isLine", "name", "FORMULAS", "parseFormula", "formula", "parts", "at", "readsOf", "names", "part", "worksheetLines", "results", "order", "FLOW", "isLine", "key", "formula", "FORMULAS", "parts", "parseFormula", "numbered", "numberOf", "readsOf", "a", "b", "line", "UNITS", "displayUnit", "unit", "sums", "annual", "months", "total", "sum", "month", "isMonthly", "value", "FIGURE_SPACE", "formatNumber", "places", "fixed", "formatValue", "item", "inputLabel", "name", "inputValue", "input", "roundTo", "plainFormula", "numbers", "part", "TOLERANCE", "tolerances_default", "pythonDiffers", "ts", "python", "index", "allowed", "magnitude", "pythonValue", "csvCell", "text", "rawNumber", "toCsv", "lines", "header", "MONTHS", "rows", "theirs", "SECTIONS", "section", "table", "row", "note", "worksheetSources", "prepared", "view", "current", "patches", "pick", "rowId", "key", "cellsOf", "value", "item", "formatValue", "headline", "line", "isMonthly", "annual", "sums", "sum", "buildRows", "lines", "input", "python", "byKey", "theirs", "differs", "pythonDiffers", "mine", "pythonShown", "pythonValue", "part", "target", "monthly", "inputLabel", "inputValue", "displayUnit", "MONTHS", "_item", "index", "sectionsOf", "rows", "SECTIONS", "section", "row", "matches", "query", "wanted", "number", "own", "word", "tsv", "months", "plainFormula", "numberOf", "rawNumber", "fetchPython", "url", "response", "getCookie", "body", "detail", "worksheetview_default", "sources", "computed", "onKey", "pythonFetch", "flashTimer", "copiedTimer", "which", "results", "worksheet", "worksheetLines", "given", "event", "search", "found", "error", "token", "shown", "matched", "visible", "id", "from", "last", "text", "what", "blob", "toCsv", "link", "copy", "phases", "copyPhase", "tidy", "packaged", "scheduled", "seen", "kept", "phase", "kind", "keep", "missing", "placed", "index", "next", "phasesOf", "other", "without", "added", "removed", "gone", "moved", "delta", "target", "renamed", "name", "HEAT_STOPS", "channels", "hex", "value", "heatColor", "wattsPerM2", "first", "index", "high", "highColor", "low", "lowColor", "t", "a", "b", "channel", "i", "heatIsDark", "parto_default", "CARDINALS", "RESTRICTOR_M", "TABLES", "parto_default", "ANGLES", "a", "b", "HIGH", "ELEVATED", "round", "value", "places", "scale", "outcode", "postcode", "compact", "riskOf", "code", "cardinal", "bearing", "turned", "sunward", "along", "axis", "first", "last", "upper", "point", "low", "high", "atAngle", "angle", "hM", "wM", "rows", "cell", "h", "w", "h0", "h1", "ht", "w0", "w1", "wt", "hScale", "wScale", "hf", "wf", "top", "bottom", "hingedArea", "angleDeg", "candidate", "t", "angleForGap", "gapM", "equivalentArea", "opening", "style", "widthM", "heightM", "capped", "half", "open", "crossVentilated", "rooms", "faces", "room", "limits", "table", "risk", "facing", "row", "points", "mostGlazedFacade", "openings", "totals", "best", "shaded", "pct", "m2", "assess", "dwelling", "cross", "glazingTable", "freeTable", "glazingM2", "sum", "o", "facade", "dwellingLimit", "glazingPct", "checks", "north", "roomGlazing", "notes", "freeM2", "nightM2", "area", "requiredM2", "most", "source", "roomFacade", "over", "exposed", "bare", "byFloor", "byGlazing", "bedrooms", "short", "unsuitable", "failed", "check", "MM_PER_M", "MM2_PER_M2", "BEDROOMS", "OPEN_PLAN_DEPTH_M", "GUARDING_MM", "HINGED_ANGLE", "glass", "type", "spec", "glazing", "frame", "row", "table6b_default", "own", "key", "fallback", "value", "table6c_default", "ventOf", "opening", "glazed", "pairKey", "a", "b", "openPlan", "name", "buildDwelling", "floors", "types", "northDeg", "rooms", "floorM2", "assumedVents", "ordered", "ground", "floor", "view", "resolve", "at", "v", "byPair", "wall", "upstairs", "room", "drawn", "r", "ring", "vertex", "outline", "walls", "i", "next", "id", "inner", "inset", "roomM2", "area", "roomType", "label", "openings", "glazingByWall", "edge", "planDeg", "outwardDeg", "bearing", "style", "frameFactor", "gValue", "lightTransmittance", "widthM", "heightM", "glazingM2", "kind", "assessedM2", "deep", "length", "ASSUMED_VENTS", "UNSEEN_ROOFLIGHTS", "designOverheating", "context", "settings", "located", "riskOf", "risk", "cross", "crossVentilated", "result", "assess", "PASS", "FAIL", "QUIET", "OVERHEATING_LEGEND", "overheatingFills", "fills", "setVent", "props", "positive", "raw", "angle", "FIXTURE_ICONS", "CATEGORIES", "EXISTING_COLOR", "proposedColor", "kind", "CATEGORY_COLORS", "iconSvg", "d", "DEFAULT_TRACE_MM_PER_PX", "traceTransform", "trace", "parsed", "tracePatch", "transform", "placed", "normalizedDegrees", "degrees", "turned", "turn", "point", "radians", "cos", "sin", "toWorld", "pixel", "x", "y", "traceCorners", "transform", "size", "pixel", "toWorld", "traceCentre", "moved", "dx", "dy", "turnedAbout", "pivot", "degrees", "x", "y", "turn", "scaledAbout", "factor", "calibrated", "current", "a", "b", "realLengthMm", "drawn", "distance", "aligned", "from", "to", "before", "after", "shifted", "rotationTargets", "houseDegrees", "targets", "base", "quarter", "normalizedDegrees", "snapRotation", "tolerance", "best", "gap", "target", "apart", "parseLengthMm", "text", "match", "value", "unit", "mm", "SAVED", "traceDiff", "patches", "was", "trace", "now", "previous", "body", "field", "HANDLE_PX", "ROTATE_PX", "REACH_PX", "frameOf", "transform", "size", "worldPerPixel", "corners", "traceCorners", "topLeft", "topRight", "bottomLeft", "stem", "up", "distance", "reach", "insidePolygon", "point", "polygon", "inside", "i", "j", "xi", "yi", "xj", "yj", "hitFrame", "frame", "nearest", "gap", "corner", "index", "apart", "NO_HIGHLIGHTS", "SVG_NS", "INTERNAL_OPACITY", "COLORS", "COMPARE_COLORS", "LAYERS", "PLAN_LAYERS", "element", "tag", "attrs", "node", "name", "value", "syncLayer", "layer", "items", "key", "draw", "seen", "existing", "child", "id", "item", "group", "GRID_EXTENT", "HATCH", "HATCH_LIGHT", "band", "a", "b", "half", "length", "nx", "ny", "polygonPoints", "inScope", "annotation", "scope", "NO_MULTI", "Renderer", "mount", "defs", "minor", "major", "stroke", "hatch", "empty", "pipes", "inkFilter", "degrees", "within", "text", "pivot", "wpp", "px", "floor", "order", "annotations", "left", "right", "drawAnnotation", "room", "polygonOf", "breastAreaMm2", "unroomedSpaces", "space", "label", "drawSpaceLabel", "fixtures", "size", "fixture", "color", "proposedColor", "EXISTING_COLOR", "x", "y", "title", "dashed", "ax", "ay", "tone", "icon", "path", "FIXTURE_ICONS", "scene", "emitter", "r", "drawEmitter", "drawRoom", "breasts", "breast", "block", "breastBlock", "kinds", "wallKinds", "wall", "drawWall", "fabricColor", "resolveFabric", "opening", "drawOpening", "faces", "findFaces", "outline", "strong", "ends", "wallEnds", "internal", "opacity", "rings", "ring", "under", "over", "heat", "highlights", "fill", "polygon", "cx", "cy", "polygonCentroid", "walls", "openings", "rooms", "dim", "w", "from", "pointAlong", "to", "wash", "line", "width", "styles", "types", "kind", "glazingLineCount", "doorInsulated", "selection", "worldPerPixel", "spacing", "candidate", "at", "pointOf", "handleRect", "points", "annotationPoints", "margin", "xs", "point", "ys", "o", "multi", "sets", "colour", "light", "fade", "type", "bar", "radiatorBar", "nodes", "traces", "live", "trace", "image", "transform", "traceTransform", "frame", "locked", "frameNodes", "frameOf", "layers", "names", "hidden", "on", "traceId", "byDarkness", "filter", "g", "alpha", "handle", "HANDLE_PX", "corner", "index", "mine", "wallSegments", "GLYPH_STROKE", "glyph", "wallFrame", "ox", "oy", "side", "hingeX", "farX", "doorLeaves", "leaf", "sweep", "lines", "spread", "font", "rotation", "anchor", "turn", "across", "sideways", "away", "pad", "geometry", "annotationLabel", "style", "faded", "takenMm2", "area", "formatAreaM2", "polygonArea", "annotationIn", "domId", "annotationsClickable", "targetOption", "mode", "at", "point", "heightMm", "sub", "a", "b", "cross", "dot", "Soup", "points", "outward", "first", "index", "c", "normal", "triangles", "up", "fromMm", "toMm", "TERRACES", "roofFor", "saved", "hints", "types", "roofType", "type", "auto", "kind", "roomInRoof", "steep", "pitch", "overhang", "ROOF_MERGE_MM", "SLIVER_MM", "FLAT_MM", "PARTY_REACH_MM", "GABLE_MM", "frame", "angle", "cos", "sin", "x", "y", "u", "v", "lines", "values", "merge", "sorted", "a", "b", "merged", "value", "last", "group", "sum", "grid", "polygons", "inside", "xs", "polygon", "p", "ys", "cells", "row", "column", "centre", "largestRectangles", "rows", "rects", "all", "c0", "c1", "cellsRow", "top", "open", "bottom", "start", "end", "rect", "unionArea", "r", "area", "j", "cx", "cy", "partySides", "party", "along", "fixed", "from", "to", "vertical", "fa", "ma", "fb", "mb", "rectangleRoof", "walls", "ends", "spec", "eaveMm", "place", "roof", "gables", "slope", "o", "u0", "u1", "v0", "v1", "half", "middle", "edge", "ridge", "r0", "r1", "height", "at", "up", "z", "cz", "isGable", "uEdge", "uWall", "inward", "rEnd", "uFace", "out", "ox", "oz", "fx", "fz", "va", "ha", "vb", "hb", "c", "d", "roofOver", "outlines", "Soup", "usable", "outline", "flatRoof", "squareAngle", "point", "index", "turn", "turned", "turnedParty", "pointInPolygon", "ROOF_MERGE_MM", "ridgeMm", "sides", "width", "depth", "partyX", "partyY", "alongX", "gable", "planMm2", "polygonArea", "doubled", "triangles", "triangulate", "mid", "normal", "outward", "toPlan", "east", "north", "area", "polygon", "doubled", "a", "index", "b", "centroid", "x", "y", "cross", "n", "sum", "p", "edgesOf", "polygons", "point", "turn", "angle", "cos", "sin", "overlap", "all", "xs", "ys", "x0", "x1", "y0", "y1", "step", "both", "either", "inA", "pointInPolygon", "inB", "squareUp", "footprint", "ring", "rotation", "house", "squareAngle", "map", "delta", "quarter", "place", "site", "northDeg", "plan", "none", "houseArea", "rings", "building", "chosen", "entry", "how", "best", "ratio", "cx", "cy", "metres", "score", "fitAt", "turned", "here", "largest", "there", "fit", "k", "northOf", "placement", "onPlan", "ring", "toPlan", "inParcel", "point", "parcel", "outer", "holes", "pointInPolygon", "hole", "housePlot", "site", "footprint", "parcels", "plan", "polygon", "middle", "centroid", "b", "area", "own", "buildingAtProperty", "site", "building", "pointInPolygon", "toPlan", "MAX_AREA_RATIO", "fitNorth", "footprint", "plan", "polygon", "here", "placed", "place", "planArea", "sum", "area", "northOf", "largest", "polygons", "best", "outlineOnPlan", "northDeg", "angle", "ring", "rx", "ry", "centroid", "px", "py", "x", "y", "tx", "ty", "turn", "plotOnPlan", "footprint", "site", "northDeg", "plan", "polygon", "placement", "place", "dx", "dy", "placed", "p", "x", "y", "turn", "parcel", "housePlot", "ring", "onPlan", "POLL_MS", "POLLS", "PlanPlot", "draw", "modelUrl", "north", "getSite", "key", "rings", "plot", "text", "isByHand", "mark", "ids", "undrawn", "picked", "marks", "entry", "drawn", "byHand", "pickChange", "before", "after", "was", "now", "dropping", "dropped", "still", "option", "scenario", "kept", "kinds", "kind", "FACINGS", "FRONT", "facingOf", "value", "facing", "unitShape", "model", "at", "front", "side", "corners", "halfAcross", "ahead", "behind", "at4", "across", "along", "half", "deep", "lineGap", "p", "a", "b", "length", "alongWall", "ends", "host", "inside", "point", "polygon", "within", "i", "j", "xi", "yi", "xj", "yj", "cross", "o", "segmentsCross", "c", "d", "segmentMeets", "corner", "zoneWarnings", "scene", "zone", "others", "hostWall", "out", "hostWallEnds", "wall", "wallEnds", "walls", "ends", "alongWall", "segmentMeets", "other", "inside", "row", "make", "name", "kw", "size", "clear", "lw", "source", "VAILLANT", "MITSUBISHI", "DAIKIN", "SAMSUNG", "HEAT_PUMP_MODELS", "modelById", "id", "model", "NOISE_LIMIT_DB", "REFLECT_WITHIN_MM", "BARRIERS", "BARRIER_DB", "barrierOf", "value", "BARRIERS", "barrier", "directivity", "walls", "ground", "GROUND_REFLECTS_BELOW_MM", "distanceRow", "distanceMm", "noiseAt", "lw", "r", "q", "level", "rounded", "NOISE_LIMIT_DB", "reflectingSurfaces", "scene", "unit", "at", "facing", "hostWall", "reach", "REFLECT_WITHIN_MM", "zone", "unitShape", "host", "wall", "hostEnds", "wallEnds", "distinct", "ends", "segmentMeets", "other", "alongWall", "facingToward", "dx", "dy", "outward", "scene", "wallId", "prefer", "wall", "found", "ends", "wallEnds", "length", "along", "left", "mid", "half", "open", "side", "roomAt", "a", "b", "mountOf", "fixture", "saved", "FRONT", "facingOf", "depth", "modelById", "base", "pointAlong", "reach", "mountHeight", "height", "scenarioFixtures", "floors", "scenario", "removed", "kept", "floor", "fixture", "added", "PLACEABLE", "PROP_FIELDS", "HEAT_PUMP_MODELS", "model", "FACINGS", "BARRIERS", "startingProps", "kind", "field", "fixturePoint", "scene", "mount", "mountOf", "wall", "found", "ends", "wallEnds", "pointAlong", "room", "polygonCentroid", "polygonOf", "placementAt", "point", "reach", "nearest", "projectOnSegment", "distance", "roomAt", "at", "wallFacing", "wallId", "near", "prefer", "side", "outward", "facingToward", "fixtureNear", "placed", "best", "item", "where", "gap", "normalizeFixtures", "rooms", "next", "shownFixtures", "there", "key", "SUMMARY_KEYS", "kitRows", "shown", "row", "FIXTURE_KINDS", "value", "text", "placedFromShown", "one", "changedFixtures", "current", "change", "add", "remove", "CYLINDER_RULE", "PER_PERSON_L", "PER_EXTRA_BATHROOM_L", "neededLitres", "people", "bathrooms", "litres", "bathroomCount", "fixtures", "wet", "fixture", "cylinderDiameter", "SPARE_MM", "fitsRoom", "scene", "room", "found", "corners", "polygonOf", "xs", "corner", "ys", "across", "need", "assessmentPoint", "fixture", "x", "y", "unitReport", "scene", "unit", "all", "pointOf", "neededKw", "names", "model", "modelById", "mount", "mountOf", "at", "facing", "facingOf", "shape", "unitShape", "notes", "covers", "SIZING_MARGIN", "others", "other", "where", "text", "zoneWarnings", "note", "assessAt", "noise", "distance", "noiseAt", "reflectingSurfaces", "barrierOf", "mountHeight", "GROUND_REFLECTS_BELOW_MM", "cylinderNotes", "cylinder", "household", "litres", "bathrooms", "bathroomCount", "needed", "neededLitres", "CYLINDER_RULE", "fit", "fitsRoom", "heatPumpFigures", "input", "proposed", "floor", "found", "report", "room", "roomAt", "FLOOR_ZONE_MM", "COS30", "SIN30", "ISO_COLORS", "shade", "hex", "amount", "value", "channel", "Iso", "angleDeg", "centre", "angle", "x", "y", "dx", "dy", "point", "z", "a", "b", "ax", "ay", "bx", "by", "length", "nx", "ny", "storeyBases", "floors", "base", "floor", "here", "isoFaces", "types", "iso", "paint", "faces", "bases", "top", "index", "scene", "height", "view", "resolve", "storey", "room", "polygon", "polygonOf", "treated", "windows", "key", "doors", "wall", "party", "depth", "opening", "from", "pointAlong", "to", "sill", "head", "glazing", "lit", "left", "right", "centreOf", "points", "vertex", "xs", "ys", "boundsOf", "face", "pad", "minX", "minY", "SCALE", "PAD_MM", "ISO_ANGLE", "INK", "SHEET", "SYMBOL_MM", "n", "value", "points", "list", "x", "y", "escapeXml", "text", "svg", "width", "height", "body", "w", "h", "liveAnnotations", "floor", "annotation", "anchorOf", "geometry", "polygonCentroid", "lengths", "point", "index", "from", "left", "total", "length", "to", "pointAlong", "boundsOfFloor", "all", "vertex", "xs", "ys", "minX", "minY", "planBody", "types", "scene", "view", "resolve", "parts", "room", "polygon", "polygonOf", "wall", "internal", "color", "openings", "a", "b", "wallSegments", "opening", "annotationMarks", "annotations", "planSvg", "highlight", "mine", "isoDrawing", "floors", "treated", "kinds", "asFloors", "iso", "Iso", "centreOf", "faces", "isoFaces", "boundsOf", "at", "px", "py", "face", "wanted", "bases", "storeyBases", "pins", "z", "glyphOf", "kind", "f", "glyph", "r", "tint", "shade", "line", "thin", "cx", "fan", "angle", "strip", "dx", "dy", "wallInk", "sheetBody", "marks", "colorOf", "inkOf", "mark", "walls", "symbolSvg", "KEY", "keyOf", "views", "shown", "key", "label", "measuresPlan", "every", "colors", "marked", "drawn", "CATEGORY_COLORS", "categoryOf", "boxes", "maxX", "maxY", "counts", "CATEGORY_ORDER", "category", "CATEGORY_LABELS", "group", "drawingsOf", "locations", "here", "PART_O_METHOD", "m2", "value", "whyOf", "room", "reasons", "said", "overheatingFigures", "assessment", "floorOf", "unsuitable", "failed", "check", "reglazed", "types", "patches", "glass", "patch", "key", "element", "id", "type", "_g", "_lt", "spec", "todayOf", "input", "context", "floors", "types", "heatLoad", "scenes", "floor", "loads", "designHeatLoad", "explorer", "Explorer", "Prepared", "peakModel", "rooms", "room", "performanceOf", "planSvg", "loadToday", "designUrl", "design", "fetchDesign", "fetchCalcContext", "todayOrNone", "scoring", "sources", "saved", "explorer", "schedule", "fetchSchedule", "packaged", "packagedKinds", "phases", "tidy", "row", "headlineFigures", "figuresOf", "packageFigures", "view", "floors", "types", "heatLoad", "kinds", "phasesOf", "phase", "treated", "patch", "patchesOf", "rooms", "patches", "designHeatLoad", "room", "floorOf", "floor", "partO", "overheating", "overheatingFigures", "designOverheating", "reglazed", "id", "resolution", "resolveConditions", "today", "todayOrNone", "figures", "drawingsOf", "annotation", "entry", "pump", "heatPumpOf", "p", "neededKw", "fixtures", "derived", "needed", "floorAreaM2", "placed", "scenarioFixtures", "fixture", "proposed", "load", "flowC", "emitters", "heatPumpFigures", "found", "fixturePoint", "assumedOccupancy42", "roomCover", "FIXTURE_KINDS", "START_PACKAGES", "MAX_PACKAGES", "grantLine", "grants", "total", "sum", "grant", "pounds", "pence", "signed", "value", "digits", "rounded", "text", "unitOf", "option", "basis", "colorOf", "category", "CATEGORY_COLORS", "ScenarioView", "targets", "fixtures", "rows", "site", "context", "scenario", "scenes", "ceilingHeightsMm", "types", "previous", "peak", "floors", "prepared", "Prepared", "Explorer", "picked", "group", "rate", "on", "settings", "id", "off", "optionId", "index", "budget", "metric", "sign", "HIGHER_IS_BETTER", "base", "worth", "g", "cost", "solo", "_group", "other", "gain", "order", "left", "right", "back", "progress", "cancelled", "found", "frontier", "kinds", "best", "bestSap", "sap", "trimmed", "line", "ids", "wanted", "choice", "outcome", "sapScore", "sapBand", "needed", "neededKw", "pump", "verdict", "FLOW_C", "open", "kept", "setOpenBaseline", "source", "reason", "error", "scoreScenarios", "baseline", "here", "open", "scoreEach", "key", "found", "kept", "scoring", "scoreFetched", "view", "scheduleUrl", "packages", "scored", "index", "saved", "figures", "headlineFigures", "failed", "designUrl", "design", "fetchDesign", "calc", "context", "schedule", "fetchCalcContext", "fetchScenarioContext", "fetchSchedule", "floors", "types", "roomLoss", "designHeatLoad", "ScenarioView", "floor", "peakModel", "flowC", "FLOW_C", "scenario", "siteOf", "scenarioFixtures", "recordedCylinder", "flushEditor", "waits", "sceneUrl", "href", "scene", "url", "scenarioUrl", "scenario", "base", "nextLetter", "names", "letters", "taken", "used", "index", "letter", "nextName", "scenestrip_default", "event", "form", "name", "data", "copyScene", "renameScene", "error", "deleteScene", "design", "row", "createPackage", "saved", "duplicatePackage", "gone", "detail", "byId", "now", "ELEVATIONS", "ELEVATION_NAMES", "elevationOf", "outward", "northDeg", "turned", "describe", "floors", "types", "entities", "floor", "q", "id", "view", "resolve", "polygons", "room", "r", "facing", "wall", "outwardDeg", "polygon", "elevation", "opening", "groupsFor", "candidates", "roomNames", "groups", "by", "pick", "found", "entity", "key", "add", "prefix", "label", "order", "ids", "elevations", "e", "rooms", "NOUNS", "coverageText", "basis", "covered", "one", "many", "total", "has", "count", "noun", "toggled", "targets", "option", "current", "next", "other", "setTargets", "rest", "list", "targetRows", "explorer", "group", "g", "color", "CATEGORY_COLORS", "FIELDS", "annotationDiff", "before", "after", "patches", "beforeById", "row", "afterById", "previous", "body", "field", "key", "point", "followed", "before", "after", "annotations", "now", "vertex", "moves", "to", "rooms", "room", "overRoom", "openings", "opening", "atOpening", "moved", "follow", "geometry", "was", "annotation", "CAP", "counterpart", "current", "restored", "_", "rest", "History", "now", "floorId", "stacks", "snapshot", "undo", "undoAt", "before", "index", "entry", "previous", "at", "next", "isMultiType", "type", "keyOf", "item", "same", "a", "b", "toggleItem", "items", "each", "sameItems", "x", "y", "itemsFromTargets", "targets", "floors", "target", "colon", "floor", "id", "scene", "w", "o", "r", "forFloor", "floorId", "elsewhere", "activeId", "counts", "floorLabel", "name", "count", "formatArea", "area", "summarise", "areas", "groups", "add", "key", "noun", "group", "kind", "f", "found", "label", "known", "sum", "deleteOrder", "rank", "deletableOn", "PLACEMENT", "unplaced", "patches", "patch", "field", "AUTOSAVE_DEBOUNCE_MS", "RETRY_DELAY_MS", "EditorCore", "History", "design", "delegate", "debounceMs", "on", "id", "floor", "candidate", "selection", "kept", "item", "scene", "f", "each", "isMultiType", "primary", "start", "next", "toggleItem", "only", "items", "colour", "sameItems", "deletableOn", "keyOf", "captured", "mutate", "untidy", "from", "normalizeScene", "normalizeOpenings", "normalizeEmitters", "normalizeFixtures", "normalizeFeatures", "annotations", "followed", "annotationDiff", "restored", "base", "move", "step", "last", "followedBy", "copy", "movedScene", "movedAnnotations", "trace", "movedTrace", "deleteOrder", "walls", "rooms", "type", "o", "removeWallSet", "room", "deleteRoom", "removeWall", "opening", "emitter", "state", "before", "traces", "moves", "traceDiff", "floorId", "moved", "result", "untidyWalls", "delayMs", "PREVIEW_COLOR", "SQUARE_COLOR", "renderOverlay", "specs", "worldPerPixel", "spec", "element", "x", "y", "label", "r", "pivot", "COLORS", "emphasised", "initialModel3d", "loading", "loadModel3d", "src", "resolve", "reject", "script", "same", "left", "right", "roomRows", "floors", "floor", "room", "formatAreaM2", "polygonArea", "polygonOf", "breastAreaMm2", "TABS", "oneTab", "kept", "tab", "loadFlag", "key", "fallback", "saveFlag", "on", "PAGE_MM_KEY", "pageMmFromPng", "bytes", "view", "at", "length", "type", "text", "key", "value", "PAGE_MM_KEY", "width", "height", "SAVE_DELAY_MS", "NUDGE_RUN_MS", "TraceDesk", "host", "listener", "a", "b", "traces", "trace", "id", "tool", "on", "known", "image", "response", "buffer", "bytes", "pageMmFromPng", "traceTransform", "floor", "renderer", "size", "transform", "page", "normalizedDegrees", "next", "tracePatch", "degrees", "turnedAbout", "traceCentre", "metres", "scaledAbout", "n", "lengthMm", "calibrated", "dxPx", "dyPx", "now", "wpp", "turn", "dx", "dy", "moved", "fields", "candidate", "opacity", "row", "core", "file", "captured", "uploadTrace", "cx", "cy", "vx", "vy", "placed", "resolve", "patches", "patch", "point", "insidePolygon", "traceCorners", "scene", "houseAngle", "live", "before", "from", "to", "aligned", "hint", "cursor", "mm", "formatLengthM", "url", "body", "waiting", "merged", "flush", "send", "patchTrace", "error", "tracePanel", "desk", "event", "input", "projectDocuments", "rows", "source", "walls", "value", "annotateTool", "vertices", "preview", "ctx", "cursor", "specs", "points", "i", "a", "b", "first", "last", "vertex", "complete", "mode", "geometry", "point", "event", "snapped", "tolerance", "STEPS", "alignTool", "picks", "target", "point", "event", "ctx", "show", "hover", "specs", "at", "index", "pairs", "from", "to", "reset", "active", "a", "b", "d", "next", "calibrateTool", "first", "point", "_event", "ctx", "a", "formatLengthM", "distance", "SNAP_DEGREES", "STEP_DEGREES", "CURSORS", "traceTool", "drag", "point", "event", "ctx", "traces", "wpp", "active", "hit", "hitFrame", "frameOf", "base", "pivot", "traceCentre", "corners", "distance", "moved", "swept", "target", "snapRotation", "rotationTargets", "turnedAbout", "factor", "next", "scaledAbout", "_point", "_event", "HOVER_TOLERANCE_PX", "ghost", "candidate", "width", "a", "b", "from", "pointAlong", "to", "openingTool", "point", "_event", "ctx", "kind", "defaults", "OPENING_DEFAULTS", "openingSpot", "id", "newId", "scene", "HOVER_TOLERANCE_PX", "ghost", "point", "ctx", "draft", "scene", "room", "roomAt", "polygonOf", "placed", "radiatorPlacement", "bar", "radiatorBar", "emitterTool", "_event", "id", "newId", "next", "existing", "emitter", "REACH_PX", "fixtureTool", "point", "_event", "ctx", "reach", "scene", "near", "fixtureNear", "kind", "placed", "placementAt", "newId", "startingProps", "wallFacing", "SAME_CORNER_PX", "pathClicks", "minimumToClose", "path", "point", "ctx", "tolerance", "first", "distance", "last", "pointer", "closing", "specs", "cursor", "snap", "points", "scene", "i", "a", "b", "squareToWalls", "formatLengthM", "end", "vertex", "drawingSnap", "event", "anchor", "commitDrawing", "draw", "lost", "before", "opening", "emitter", "normalizeOpenings", "normalizeEmitters", "normalizeFeatures", "kept", "id", "what", "tookOut", "counts", "parts", "count", "list", "one", "roomTool", "path", "pathClicks", "complete", "ctx", "polygon", "id", "commitDrawing", "scene", "insertRoom", "point", "event", "snapped", "drawingSnap", "free", "emptySpaceAt", "placeRoom", "splitTool", "first", "roomFor", "ctx", "a", "b", "roomAt", "point", "event", "snapped", "drawingSnap", "from", "room", "made", "commitDrawing", "scene", "splitRoom", "chord", "chordThrough", "polygonOf", "ALONG_MM", "PIECE_MM", "OPENING_MM", "NOISE_MM", "frame", "a", "b", "length", "distance", "ux", "uy", "p", "covered", "others", "f", "found", "q", "lo", "hi", "x", "y", "merged", "piece", "last", "split", "from", "to", "inside", "pieces", "cursor", "start", "end", "real", "size", "index", "before", "after", "beside", "joined", "coveredLength", "total", "segmentsOf", "scene", "wall", "ends", "wallEnds", "openingSpan", "opening", "candidate", "pointAlong", "sameOpening", "one", "two", "roomsArea", "room", "polygonArea", "polygonOf", "phasing", "asIs", "proposed", "kinds", "wallKinds", "walls", "built", "demolished", "old", "internal", "mine", "o", "wallSegments", "phase", "kept", "oldSpans", "newSpans", "openings", "span", "outlines", "findFaces", "outline", "newRooms", "shape", "measure", "overlapArea", "PARALLEL", "SQUARE", "MIN_DEPTH", "CLASH_MM2", "unit", "from", "to", "length", "distance", "dot", "p", "q", "plus", "d", "k", "outlinesOf", "scene", "findFaces", "outline", "outside", "point", "outlines", "pointInPolygon", "outwardOf", "a", "b", "thickness", "u", "middle", "away", "normal", "ahead", "behind", "facadeOf", "wallId", "kinds", "wallKinds", "faces", "open", "id", "start", "wall", "ends", "wallEnds", "outward", "along", "run", "grew", "touches", "other", "v", "mine", "dir", "across", "sideways", "lo", "hi", "t", "w", "facadeNear", "tolerance", "best", "off", "nearerEnd", "facade", "depthAt", "sideFacade", "end", "corner", "side", "planExtension", "placed", "spec", "refuse", "problem", "n", "room", "width", "near", "far", "down", "out", "shape", "measure", "total", "house", "overlapArea", "extensionOutline", "newWalls", "before", "fabric", "walls", "coveredLength", "buildOver", "fields", "segmentsOf", "rooms", "insertRoom", "footprint", "addExtension", "host", "neighbours", "mergeRooms", "STEP", "REACH_PX", "extendTool", "placed", "facadeLine", "facade", "show", "ctx", "spec", "outline", "problem", "planExtension", "label", "formatLengthM", "build", "extensionOutline", "done", "point", "_event", "facadeNear", "nearerEnd", "depth", "depthAt", "MIN_DEPTH", "wallId", "scene", "facadeOf", "wall", "candidate", "ends", "wallEnds", "middle", "emptyExtensionForm", "mm", "metres", "fallback", "specOf", "form", "NEW_BUILD_WALL", "newBuildWall", "types", "type", "PHASE_COLORS", "UNDERLAY", "asIsSceneFor", "floors", "floor", "candidate", "line", "a", "b", "attrs", "element", "band", "thickness", "length", "nx", "ny", "x", "y", "demolishedBand", "wpp", "phaseView", "asIs", "proposed", "result", "phasing", "under", "wall", "ends", "wallEnds", "over", "id", "room", "polygonOf", "opening", "phaseSummary", "parts", "formatAreaM2", "formatLengthM", "phaseLine", "phase", "sapScore", "pounds", "LateWrite", "write", "delayMs", "COLLECTIONS", "names", "types", "type", "key", "entity", "fabric", "named", "stable", "value", "field", "inner", "one", "two", "k", "byId", "list", "bringForward", "base", "theirs", "ours", "baseNames", "theirNames", "ourNames", "ourIds", "id", "name", "result", "floor", "was", "f", "now", "scene", "applied", "structural", "b", "t", "o", "kept", "ids", "take", "from", "unknownType", "there", "mine", "merged", "fields", "before", "here", "settle", "saved", "core", "tries", "pause", "ms", "done", "attempt", "wallTool", "path", "pathClicks", "complete", "ctx", "closed", "run", "commitDrawing", "scene", "drawWalls", "point", "event", "snapped", "drawingSnap", "clicked", "ACROSS", "farSide", "scene", "start", "ux", "uy", "skip", "side", "queue", "vertex", "wall", "ends", "wallEnds", "frame", "wallFrame", "next", "MIN_WALL_MM", "resizeWall", "wallId", "length", "candidate", "a", "b", "current", "distance", "movesB", "fixed", "starts", "opening", "host", "hostEnds", "pointAlong", "before", "was", "shift", "translateVertices", "old", "now", "along", "hosted", "total", "index", "projectOnSegment", "DRAG_THRESHOLD_PX", "LINE_UP_PX", "wallById", "ctx", "id", "wall", "selectTool", "drag", "slideOpening", "openingId", "point", "scene", "opening", "o", "w", "ends", "wallEnds", "along", "projectOnSegment", "wallFrame", "slideRadiator", "emitterId", "radiator", "e", "event", "handle", "type", "room", "emitter", "threshold", "distance", "roomId", "vertices", "empties", "r", "emptySpaces", "polygonOf", "detachRoom", "vertexId", "from", "v", "annotationDrag", "bodyDrag", "moving", "shift", "translateVertices", "lineUpShift", "vertexDrag", "snapped", "setVertexAt", "_point", "_event", "released", "settle", "MIN_VIEW_WIDTH_MM", "MAX_VIEW_WIDTH_MM", "worldPerPixel", "view", "rect", "screenToWorld", "clientX", "clientY", "panBy", "dxPx", "dyPx", "scale", "zoomAt", "factor", "clamped", "wx", "wy", "w", "h", "fitBounds", "bounds", "padding", "left", "spanX", "spanY", "pad", "paddedW", "paddedH", "clear", "aspect", "kept", "defaultView", "turnPoint", "x", "y", "degrees", "radians", "cos", "sin", "turnBounds", "corners", "bringIntoView", "editableSchedule", "schedule", "row", "parsePounds", "value", "trimmed", "parsed", "SNAP_TOLERANCE_PX", "STOREY_NAMES", "TOOL_CURSORS", "TOOL_LAYERS", "SELECTED_LAYER", "RAIL_WIDTH_PX", "scenarioKey", "design", "loadScenarioSettings", "stored", "placementEnded", "placed", "saveScenarioSettings", "view", "outlineView", "scene", "figures", "outlineFigures", "formatAreaM2", "formatLengthM", "emptyFabricForm", "liveWallUs", "form", "live", "wallHeatLoadU", "elementSpec", "parseU", "heatLoadSpec", "parseFraction", "parseMm", "fabricFormSpec", "insulationKindOf", "filledFabricForm", "type", "spec", "text", "key", "insulation", "choice", "insulationChoice", "applyCeiling", "room", "props", "mm", "raw", "fallback", "low", "SHOW_OVERHEATING", "MODES", "SELECTION_NAMES", "NO_BASELINE_MEASURES", "SCENARIO_TOOLS", "FOLDS_KEY", "loadFolds", "oneTab", "saveFolds", "folds", "OLD_MODES", "asMode", "mode", "closedImporter", "floorLabel", "floor", "isEditableTarget", "target", "editor_default", "core", "renderer", "calcContext", "sapFigures", "heatLossFrame", "overheatingFrame", "scenarioContext", "scenarioView", "model3d", "draw3dQueued", "scenarioSignature", "planSignature", "floors", "fabricTypes", "searchToken", "scenarioFetch", "roomCount", "fixtureSignature", "logSignature", "setupSeen", "ageLabels", "fabricUTimer", "fabricUAsked", "lineUpBuilding", "setPlotCredit", "planPlot", "PlanPlot", "rings", "credit", "plotAsked", "groundFootprint", "lowest", "best", "footprint", "startMode", "rebuildTimer", "inventoryTimer", "targetWrite", "LateWrite", "component", "targetCandidates", "optionId", "explorer", "option", "group", "found", "calcRefetch", "calcStale", "chart", "brush", "dragKind", "packages", "placeQueued", "placing", "placingCount", "retargeted", "sayRenamed", "id", "name", "recommended", "marksIn", "annotation", "pickedOf", "slot", "index", "g", "mine", "besideTheHouse", "phaseWrites", "phasePending", "phasingGeneration", "inventoryCursor", "panning", "spaceHeld", "toolPointerDown", "onKeyDown", "hover", "HoverMarker", "onKeyUp", "onBeforeUnload", "onFlushScenario", "flushScenario", "aligner", "floorAligner", "alignView", "strong", "traces", "siteKey", "extender", "extendTool", "asIsFloors", "existingDesignUrl", "scheduleRows", "applySchedule", "rows", "forwardSides", "tools", "selectTool", "openingTool", "emitterTool", "roomTool", "wallTool", "splitTool", "calibrateTool", "traceTool", "alignTool", "annotateTool", "brushTool", "fixtureTool", "activeTool", "self", "TraceDesk", "turnPoint", "hint", "cursor", "error", "pendingCalibration", "pendingDraft", "palette", "nextTempId", "annotationWrites", "enqueueAnnotationWrite", "write", "next", "annotationByDomId", "domId", "annotationIn", "translated", "geometry", "dx", "dy", "shift", "x", "y", "watts", "heatColor", "PLACEABLE", "kind", "FIXTURE_KINDS", "iconSvg", "initialModel3d", "OPENING_DEFAULTS", "RADIATOR_DEFAULTS", "emptyExtensionForm", "tracePanel", "OVERHEATING_LEGEND", "setOpenBaseline", "mount", "designUrl", "Renderer", "scenario", "rect", "screenRect", "scale", "cx", "cy", "existingUrl", "fetchDesign", "asIs", "payload", "freshness", "EditorCore", "selection", "modelUrl", "blank", "rooms", "total", "f", "fixtures", "fixturesChanged", "walls", "state", "moved", "putScene", "trace", "patches", "patch", "patchAnnotation", "updated", "candidate", "paletteEntries", "entry", "event", "unsaved", "loss", "inspect", "highlight", "signature", "names", "t", "measures", "m", "sessionsOf", "line", "KIND_TITLES", "session", "at", "revision", "savedLabel", "url", "fetchRevisions", "revisions", "reason", "when", "who", "postRestore", "result", "fetchCalcContext", "loaded", "stale", "sources", "worksheetSources", "Prepared", "computed", "heatLoss", "sapScore", "sapBand", "message", "modelChecks", "check", "placeOf", "bounds", "boundsOfSelection", "bringIntoView", "turnBounds", "action", "straighten", "marking", "wall", "each", "mergeRooms", "step", "stepCheck", "loading", "quarters", "turned", "degrees", "north", "body", "patchOrientation", "saved", "postTwin", "pushed", "planExists", "baseline", "announce", "done", "doneSteps", "firstOpen", "STEPS", "last", "patchBaseline", "wallCount", "element", "pick", "first", "createFabricType", "patchFabricType", "other", "ids", "toCheck", "fixtureCount", "on", "opening", "mutate", "shown", "frontFaces", "getSite", "site", "fit", "fitNorth", "outlineOnPlan", "deg", "counts", "patchChanges", "elements", "designHeatLoad", "context", "settings", "current", "nullable", "numeric", "reconcile", "load", "outdoor", "zone", "scop", "patchHeatLoad", "siteOf", "scenarioFixtures", "recordedCylinder", "celsius", "roomId", "cover", "suggestionText", "suggestEmitter", "emitters", "roomCover", "emitter", "e", "emitterWatts", "asIsSceneFor", "phaseView", "phaseSummary", "fetchBringForward", "base", "theirs", "token", "plan", "bringForward", "sides", "back", "merged", "ok", "postBringForward", "newBuildWall", "NEW_BUILD_WALL", "made", "wanted", "newBuildType", "NEW_BUILD_FLOOR", "NEW_BUILD_ROOF", "types", "scope", "r", "outlines", "polygonOf", "above", "level", "createFloor", "upstairs", "fabric", "floorType", "roofType", "buildOver", "outline", "markNewBuild", "specOf", "fields", "extensionOutline", "addExtension", "floorId", "multi", "hovered", "forFloor", "elsewhere", "areas", "parts", "part", "summarise", "selected", "label", "color", "targets", "colour", "pill", "items", "itemsFromTargets", "item", "c", "quantity", "o", "wallKind", "radiator", "polygonArea", "breastAreaMm2", "neighbours", "length", "w", "ends", "wallEnds", "distance", "canBeParty", "kept", "keptColour", "arrow", "left", "right", "renameFloor", "delta", "ordered", "reorderFloors", "deleteFloor", "postDraft", "read", "draft", "tidy", "draftToWorld", "traceTransform", "after", "applyDraft", "floorBounds", "fitBounds", "renderOverlay", "draftPreview", "openings", "count", "n", "one", "many", "pending", "parseLengthMm", "fetchSchedule", "carbon", "epc", "postScheduleMeasure", "pence", "paletteGroups", "u", "fabricUValue", "summary", "specSummary", "fabricColor", "known", "us", "only", "rdsap", "wallUSource", "asked", "wallDefaultU", "wallsUsing", "original", "justWall", "wallId", "resolveFabric", "usedByText", "deleteFabricType", "draws", "factor", "zoomAt", "ceiling", "temperature", "high", "area", "width", "height", "sill", "openingFabric", "setVent", "thickness", "wallFabric", "resized", "empties", "emptySpaces", "resizeWall", "settle", "keep", "largerFirst", "removeRoomWithWalls", "refusal", "rail", "defaultView", "worldPerPixel", "point", "options", "snapPoint", "specs", "depth", "a", "b", "temp", "annotationsUrl", "captured", "createAnnotation", "fixture", "open", "what", "roomRows", "same", "inScope", "style", "kinds", "layer", "hidden", "designOverheating", "patchOverheating", "annotationsClickable", "showPackage", "losses", "highlights", "NO_HIGHLIGHTS", "packageHighlights", "stepped", "COLORS", "overheatingFills", "fills", "IMPLAUSIBLE_W_PER_M2", "heatIsDark", "loadModel3d", "bundle", "heat", "placedFromShown", "fetchMagicplanPlans", "plans", "imported", "needle", "fetchMagicplanPreview", "preview", "uid", "drawing", "firstImport", "postMagicplanImport", "warnings", "drew", "fetchScenarioContext", "calc", "previous", "ScenarioView", "peakModel", "size", "MAX_PACKAGES", "finished", "outcome", "canvas", "ScatterChart", "picks", "net", "grant", "sum", "cost", "formatPounds", "letterFor", "before", "added", "dropped", "pickChange", "shownFixtures", "here", "kitRows", "note", "fixturePoint", "editable", "modelById", "assessmentPoint", "PROP_FIELDS", "field", "changedFixtures", "add", "typed", "set", "model", "cylinderNotes", "assumedOccupancy42", "needed", "neededKw", "unitReport", "warned", "values", "apply", "remove", "targetRows", "describe", "roomNames", "candidates", "groupsFor", "setTargets", "covered", "out", "qualified", "pk", "was", "toggled", "sentTargets", "sentFixtures", "seen", "packageFigures", "phases", "patchPackage", "rest", "metric", "showing", "keptSap", "letter", "nextLetter", "createPackage", "detail", "packaged", "packagedKinds", "phasesOf", "keptPhases", "taken", "phase", "phaseLine", "keptLine", "change", "tidied", "renamed", "removed", "without", "deletePackage", "chosen", "wallKinds", "paint", "entries", "pkg", "into", "shows", "aimed", "COUNTED_OPTIONS", "targetPlacements", "placements", "todo", "undrawn", "adding", "placement", "own", "hand", "dropping", "gone", "mark", "isByHand", "going", "drawn", "edited", "work", "run", "steps", "postSnapshot", "pounds", "all", "fits", "alongWall", "overRoom", "atOpening", "geometries", "dropPreview", "svg", "screenToWorld", "wheel", "WheelReader", "touch", "TouchGesture", "held", "HeldTouch", "holding", "press", "release", "intent", "panBy", "TOUCH_HOLD_MS", "landed", "over", "described", "finish", "pinching", "finishTool", "ctx", "idle", "zoom", "zoomKey", "response", "getCookie", "HIGHLIGHT", "TREATED_COLOR", "keys", "resolved", "resolve", "windows", "doors", "heated", "letterOf", "FIGURES_VERSION", "drifted", "items", "menu", "item", "step", "index", "count", "by", "menubar_default", "name", "focus", "was", "event", "names", "shift", "next", "move", "list", "at", "target", "OPEN_KEY", "TALL", "initials", "name", "word", "bandColor", "perM2", "legend", "color", "stop", "bars", "loss", "rooms", "a", "b", "most", "room", "tiles", "worst", "each", "watts", "SIZING_MARGIN", "stats_default", "loadFlag", "saveFlag", "figuresOf", "floors", "types", "context", "conditions", "scenes", "floor", "computed", "heatLoss", "area", "total", "scene", "room", "sum", "roomAreaMm2", "peak", "designHeatLoad", "loadFigures", "designUrl", "design", "fetchDesign", "fetchCalcContext", "PLACES", "shown", "value", "column", "delta", "base", "change", "text", "better", "scenecompare_default", "row", "index", "figures", "target", "error", "from", "good", "perM2", "watts", "area", "change", "after", "before", "cost", "afterW", "beforeW", "afterM2", "beforeM2", "changeOf", "figures", "after", "change", "rowsOf", "scenes", "scored", "here", "scene", "scenario", "live", "withoutScenario", "id", "row", "withNames", "named", "byId", "now", "signed", "value", "digits", "prefix", "text", "shown", "column", "moved", "tone", "scenariocompare_default", "token", "mine", "found", "scoreScenarios", "error", "why", "reason", "gone", "detail", "action", "CHARS", "REGULAR", "BOLD", "CAP", "index", "CHARS", "char", "at", "textWidth", "text", "size", "bold", "table", "BOLD", "REGULAR", "units", "wrap", "width", "lines", "paragraph", "line", "word", "next", "PEN", "INK", "GREY", "RED", "box", "points", "xs", "point", "ys", "grow", "b", "by", "overlaps", "a", "union", "boxes", "textBox", "item", "width", "textWidth", "cap", "CAP", "anchor", "x0", "valign", "base", "corners", "turn", "cos", "sin", "x", "y", "extent", "items", "inner", "place", "dx", "dy", "k", "at", "num", "value", "xmlChar", "code", "xmlSafe", "text", "out", "char", "escapeXml", "HATCH_DEFS", "fillAttr", "fill", "strokeAttr", "stroke", "pointsAttr", "clips", "svgItem", "tag", "background", "opacity", "fx", "fy", "tx", "ty", "cross", "weight", "color", "body", "id", "toSvg", "height", "dxfText", "pair", "dxfItems", "layers", "head", "x1", "y1", "x2", "y2", "cx", "cy", "start", "end", "sweep", "align", "vertical", "toDxf", "views", "entities", "view", "table", "layer", "FLOOR_ZONE_MM", "rotate", "x", "y", "deg", "turn", "cos", "sin", "signedArea", "polygon", "doubled", "index", "a", "b", "unit", "length", "inward", "ux", "uy", "intersect", "p", "d", "q", "e", "cross", "t", "offsetPolygon", "by", "count", "out", "prev", "a0", "a1", "a2", "n0", "n1", "d0", "d1", "p0", "p1", "corner", "limit", "constructionOf", "kind", "thickness", "fabric", "explicit", "spec", "construction", "insulation", "key", "modelFloor", "floor", "types", "base", "scene", "view", "resolve", "at", "vertex", "wallByPair", "wall", "rooms", "held", "directed", "room", "ring", "outline", "id", "point", "edges", "next", "pair", "walls", "sourceById", "source", "resolveFabric", "holder", "inside", "wallById", "outer", "edge", "byStart", "used", "loops", "first", "loop", "building", "floors", "northDeg", "sorted", "here", "outerFace", "segmentHitsBox", "a", "b", "box", "t0", "t1", "dx", "dy", "checks", "p", "q", "r", "Space", "half", "points", "closed", "index", "other", "overlaps", "segment", "OUTER_LEAF", "INNER_LEAF", "add", "p", "d", "k", "along", "a", "b", "length", "cross", "q", "e", "det", "t", "bands", "wall", "muted", "scale", "thickness", "brick", "bandEnds", "loop", "index", "depth", "count", "edge", "line", "which", "at", "shift", "inward", "ends", "neighbour", "vertex", "corner", "foot", "pointInPolygon", "x", "y", "polygon", "inside", "j", "xi", "yi", "xj", "yj", "distanceToEdges", "point", "best", "dx", "dy", "roomySpots", "steps", "xs", "ys", "x0", "x1", "y0", "y1", "spots", "i", "spot", "boxInside", "box", "areaM2", "signedArea", "TEXT", "planView", "floor", "options", "ink", "GREY", "INK", "pen", "w", "extra", "PEN", "items", "space", "Space", "pieces", "strip", "piece", "n", "half", "quad", "points", "fill", "layer", "internal", "u", "band", "s0", "e0", "s1", "e1", "room", "cut", "next", "wallAlong", "s", "opening", "openingItems", "tag", "centre", "tagItems", "RED", "roomLabel", "_edge", "all", "body", "mid", "walled", "out", "across", "bleed", "jamb", "sill", "side", "face", "hingeS", "farS", "doorLeaves", "hinge", "leafWidth", "leafEnd", "thick", "toward", "corners", "tries", "text", "textBox", "frame", "clear", "area", "name", "color", "title", "size", "both", "FIRST", "STEP", "TICK", "GAP", "NORMAL", "dedupe", "stations", "within", "sorted", "a", "b", "out", "station", "last", "formatMm", "mm", "dimensionString", "side", "line", "scale", "space", "witnessFrom", "items", "horizontal", "sign", "pt", "s", "across", "first", "PEN", "from", "d", "rot", "above", "previousEnd", "index", "length", "text", "mid", "rows", "TEXT", "candidates", "row", "width", "textBox", "shift", "step", "chosen", "chosenBox", "chosenSpot", "candidate", "fits", "item", "tb", "start", "ordered", "tip", "blocked", "segments", "e", "det", "rx", "ry", "t", "u", "sideStations", "floor", "k", "normal", "project", "point", "faces", "loop", "edge", "bandEnds", "face", "corners", "openings", "ends", "wall", "others", "segment", "half", "opening", "externalDimensions", "view", "all", "overall", "strings", "string", "spanThrough", "polygon", "at", "hits", "c", "ac", "bc", "x", "y", "v", "lo", "hi", "internalDimensions", "room", "clear", "spots", "roomySpots", "placed", "spot", "span", "label", "lineBox", "boxInside", "PITCH_DEG", "EAVES_OVERHANG", "VERGE_OVERHANG", "FASCIA", "wallTop", "floor", "FLOOR_ZONE_MM", "inside", "x", "y", "polygon", "hit", "j", "xi", "yi", "xj", "yj", "axisOf", "best", "angle", "wall", "length", "rectangles", "polygons", "minSide", "xs", "p", "b", "ys", "filled", "i", "centre", "out", "i0", "j0", "jMax", "i1", "j1", "area", "rect", "turn", "cos", "sin", "gabled", "eaves", "along", "tan", "back", "z", "px", "py", "x0", "x1", "y0", "y1", "ym", "ridge", "fascia", "face", "simpleRoof", "building", "hints", "faces", "outshots", "local", "loop", "outerFace", "point", "front", "index", "long", "floors", "above", "top", "outlines", "upper", "outline", "a", "mid", "by", "probe", "GROUND_MM", "COMPASS", "inside", "x", "y", "polygon", "hit", "j", "xi", "yi", "xj", "yj", "compassOf", "normal", "north", "compass", "facings", "building", "frontNormal", "axis", "best", "floor", "wall", "length", "front", "a", "b", "right", "name", "index", "title", "entranceNormal", "ground", "outside", "id", "room", "openingItems", "opening", "base", "project", "k", "tag", "u", "half", "at", "s", "sill", "z0", "z1", "x0", "x1", "y0", "y1", "rect", "l", "t", "r", "bt", "w", "fill", "INK", "frame", "items", "PEN", "panes", "elevationView", "facing", "options", "f", "across", "p", "depthOf", "z", "faces", "keyed", "nearest", "loop", "_edge", "bandEnds", "level", "wallTop", "edge", "facingBy", "depth", "outline", "tone", "p0", "p1", "p2", "pen", "shade", "face", "pts", "xs", "ys", "sum", "i", "q", "mark", "left", "rightEdge", "levels", "top", "ridge", "datums", "from", "liveAnnotations", "annotations", "a", "markedKinds", "design", "marked", "floor", "mark", "m", "kind", "colorOf", "CATEGORY_COLORS", "categoryOf", "markItems", "annotation", "turn", "scale", "k", "color", "at", "point", "x", "y", "rotate", "geometry", "pts", "shade", "PEN", "c", "quantity", "callouts", "calls", "body", "space", "items", "sides", "call", "d", "side", "b", "list", "horizontal", "sorted", "along", "i", "limit", "overflow", "index", "s", "centre", "dx", "dy", "length", "r", "INK", "anchorOnPaper", "anchorOf", "VENTS", "OPENING_MEASURES", "scheduleOf", "floors", "types", "marks", "measureName", "windows", "doors", "roomName", "wall", "id", "room", "name", "ordered", "loop", "edge", "nearby", "u", "opening", "proposed", "element", "fabric", "resolveFabric", "entry", "COLUMNS", "scheduleTable", "entries", "width", "height", "fixed", "sum", "column", "columns", "head", "line", "cx", "row", "rest", "cells", "wrap", "TEXT", "rowHeight", "lines", "fit", "text", "n", "vx", "chooseCut", "building", "top", "all", "floor", "wall", "ys", "mid", "along", "y", "shift", "candidate", "point", "sectionMark", "cut", "scale", "left", "right", "label", "k", "items", "x", "dir", "PEN", "INK", "rect", "x0", "y0", "x1", "y1", "fill", "w", "sectionView", "roof", "poche", "pz", "z", "face", "minX", "maxX", "level", "z0", "GROUND_MM", "z1", "wallTop", "hits", "ax", "ay", "bx", "by", "t", "length", "sin", "half", "s", "opening", "o", "sill", "head", "lo", "hi", "FLOOR_ZONE_MM", "room", "xs", "p", "index", "q", "TEXT", "crossings", "a", "b", "nx", "ny", "d", "ground", "levels", "datums", "PAPER", "MARGIN", "VIEW_GAP", "TITLE_SPACE", "drawingArea", "paper", "size", "viewSize", "view", "box", "extent", "titleWidth", "pack", "views", "area", "width", "height", "sheets", "current", "rowWidth", "rowHeight", "used", "fits", "text", "at", "value", "extra", "rule", "a", "b", "w", "PEN", "rect", "x", "y", "h", "pen", "fill", "scaleBar", "scale", "metres", "step", "unit", "items", "index", "INK", "m", "northPoint", "centre", "bearing", "turn", "head", "barLength", "title", "textBox", "viewTitle", "cell", "label", "bold", "lines", "wrap", "foot", "GREY", "line", "panel", "spec", "meta", "x0", "x1", "pad", "heading", "note", "entry", "place", "blockTop", "rows", "revTop", "cols", "revision", "row", "top", "half", "scaleText", "revWidth", "scales", "composeSheet", "placed", "heights", "total", "sum", "boxes", "unionX0", "unionX1", "column", "sharedDx", "unionY0", "unionY1", "widths", "own", "dx", "dy", "titleX", "titleY", "toSvg", "GENERAL_NOTES", "projectCode", "design", "number", "level", "n", "levelCode", "swatch", "fill", "stroke", "PEN", "rectItem", "w", "planLegend", "scale", "phasing", "entries", "RED", "measureLegend", "kinds", "name", "marks", "kind", "color", "colorOf", "types", "mark", "symbol", "shadeHex", "hex", "amount", "value", "channel", "phasingOf", "proposed", "asIs", "turn", "out", "floor", "before", "other", "walls", "emptyScene", "wall", "rotate", "plan", "tags", "cut", "view", "planView", "items", "y", "internalDimensions", "externalDimensions", "box", "extent", "k", "sectionMark", "chooseScale", "model", "input", "fitsAt", "fits", "wanted", "drawingSet", "roofOf", "simpleRoof", "building", "meta", "sheets", "dxf", "dxfX", "addDxf", "views", "proposal", "measureName", "m", "marksByFloor", "liveAnnotations", "schedule", "scheduleOf", "entry", "notice", "chooseCut", "roof", "entranceNormal", "emit", "first", "title", "extra", "groups", "pack", "group", "index", "composeSheet", "levelOf", "levelByTitle", "planViews", "source", "prefix", "i", "phased", "front", "elevationScale", "facings", "facing", "elevationView", "at50", "sectionView", "measureSheets", "area", "drawingArea", "rest", "next", "scheduleTable", "planScale", "floors", "all", "markedKinds", "specNotes", "row", "drawFloor", "chosen", "numberOf", "under", "markItems", "body", "callouts", "anchorOnPaper", "keyNotes", "mine", "quantities", "quantity", "where", "sumQuantities", "order", "at", "WALL_MEASURES", "treatedElevations", "f", "a", "spec", "runsAlong", "b", "line", "reach", "mid", "length", "p", "q", "dx", "dy", "span", "parallel", "t", "near", "highlight", "markOf", "point", "anchors", "seen", "calls", "key", "anchor", "call", "Space", "sum", "count", "parts", "dxfOf", "built", "toDxf", "sub", "a", "b", "cross", "dot", "unit", "v", "length", "hull", "points", "normal", "u", "flat", "point", "turn", "o", "half", "list", "out", "p", "facesOf", "positions", "kind", "faces", "group", "plane", "flush", "x", "y", "z", "flatTop", "index", "c", "at", "up", "offset", "modelRoof", "spec", "building", "outshots", "top", "outlines", "loop", "edge", "party", "wall", "roof", "roofOver", "wallTop", "packageToPlace", "design", "candidate", "KIND_NAMES", "roofOf", "response", "meta", "spec", "roofFor", "how", "modelRoof", "dataUrl", "svg", "today", "now", "two", "value", "save", "blob", "name", "url", "link", "dialog_default", "asIs", "schedule", "roof", "sheets", "built", "data", "fetchDesign", "current", "existing", "fetchSchedule", "result", "error", "kinds", "kind", "on", "drawingSet", "markedKinds", "was", "row", "sheet", "index", "chosen", "_sheet", "title", "getCookie", "placed", "waiting", "dxfOf", "getCookie", "name", "part", "key", "rest", "destroy_default", "url", "message", "getCookie", "name", "part", "key", "rest", "rename_default", "input", "url", "drop_default", "event", "input", "fileId", "file", "uploaddropzone_default", "staged", "event", "list", "have", "index", "data", "file_default", "event", "fileInput", "fileList", "dT", "file", "fileType", "pk", "name", "dt", "hepscore_default", "score", "parameter", "spec", "value", "lo", "mid", "hi", "n", "i", "v", "NS", "mounted", "create", "id", "el", "options", "opts", "inject", "owned", "attr", "name", "dress", "svg", "text", "read", "next", "engine", "dead", "destroy", "box", "C", "P", "x0", "y0", "z0", "x1", "y1", "z1", "r", "b", "ring", "inner", "rings", "prism", "facing", "coursesY", "y", "step", "d", "z", "seg", "coursesX", "x", "perpendsY", "course", "len", "row", "top", "perpendsX", "inside", "pt", "pg", "c", "i", "j", "xi", "yi", "xj", "yj", "shift", "P", "dx", "dy", "dz", "o", "q", "r2", "outline", "b", "hull", "corners", "x", "y", "z", "T", "H", "LX", "LY", "BX", "BY", "BZ", "TOP", "HEAD", "FALL", "JETS", "REST_FLOW", "NAMES", "AT", "engine", "stage", "svg", "read", "value", "bag", "disposer", "D", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "add", "to", "b", "s", "solid", "put", "box", "ring", "cls", "q", "r", "z", "path", "poly", "ringAt", "rrect", "coursesX", "perpendsX", "open", "coursesY", "perpendsY", "hx", "hy", "hz", "shower", "fitting", "foot", "rest", "x0", "y0", "x1", "y1", "fg", "solids", "tween", "bath", "seg", "spray", "wc", "basin", "lifts", "lit", "f", "flow", "time", "jets", "w", "d", "i", "k", "a", "c", "at", "t", "p", "j", "B", "register", "dt", "now", "moving", "tdone", "v", "tval", "shift", "still", "reducedMotion", "draw", "choose", "tset", "parts", "anchors", "pointer", "spec", "L", "WH", "FX", "X0", "X1", "Y0", "Y1", "Z0", "Z1", "N", "BAR", "PITCH", "GZ", "REST", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "level", "spring", "g", "mk", "put", "solid", "box", "ym", "path", "seg", "bars", "_", "i", "z", "q", "rrect", "rim", "poly", "s", "mid", "shown", "B", "register", "dt", "moving", "stepS", "lit", "clamp", "b", "cls", "pointer", "y", "onWall", "v", "spec", "V", "on", "P", "o", "a", "b", "u", "v", "bar", "e", "ring", "inner", "s0", "s1", "at", "q", "s", "seen", "poly", "hull", "open", "run", "circle", "r", "n", "cu", "cv", "_", "i", "t", "blades", "B", "phase", "d", "th", "pts", "edge", "side", "w", "k", "D", "B0", "B1", "YC", "Z0", "Z1", "FZ", "FR", "WY0", "WY1", "WZ", "PX", "BASE", "FH", "REST", "X", "Y", "Z", "at", "o", "d", "s", "v", "sub", "a", "b", "unit", "centre", "pts", "br", "out", "i", "di", "dn", "c", "t", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "spring", "time", "g", "mk", "add", "put", "solid", "box", "pipe", "r", "n", "e", "len", "bar", "circ", "ring", "y", "knee", "f", "on", "rr", "u0", "v0", "u1", "v1", "poly", "rrect", "q", "path", "seg", "circle", "flames", "elbow", "tongue", "cu", "h", "edge", "side", "hw", "k", "B", "register", "dt", "moving", "stepS", "still", "reducedMotion", "el", "fl", "w", "draw", "pointer", "p", "z", "onWall", "clamp", "spec", "Y", "W0", "W1", "END", "BASE", "FOOT", "TOE", "DPC0", "DPC1", "H", "COURSE", "WAVE", "LOW", "TOP", "REST", "tideZ", "f", "rnd", "i", "v", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "tide", "spring", "g", "mk", "put", "solid", "box", "path", "seg", "toe", "x", "dx", "a", "open", "bricks", "z0", "z1", "coursesY", "perpendsY", "coursesX", "perpendsX", "dg", "dots", "wet", "y", "z", "el", "dot", "place", "b", "line", "dpc", "soil", "u", "light", "course", "drawn", "B", "register", "dt", "moving", "stepS", "pts", "w", "draw", "d", "pointer", "p", "onWall", "held", "clamp", "spec", "L", "H", "T", "SK", "FLOOR", "RW", "R", "STEP", "TRAY", "REST", "MIN", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "edge", "spring", "g", "mk", "put", "solid", "box", "d", "y", "seg", "path", "field", "fresh", "crack", "open", "r", "poly", "roller", "wire", "pole", "grip", "rod", "a", "b", "w", "pts", "q", "i", "t", "hull", "ring", "x", "z", "_", "drawn", "B", "register", "dt", "moving", "stepS", "e", "clamp", "f", "h", "top", "s", "draw", "yr", "mid", "foot", "u", "lo", "pointer", "p", "onWall", "v", "spec", "E", "holed", "C", "P", "g", "b", "h", "r", "x0", "y0", "z0", "x1", "y1", "z1", "at", "y", "q", "hole", "put", "solid", "box", "path", "poly", "seg", "face", "parent", "L", "open", "rr", "u0", "v0", "u1", "v1", "rrect", "glass", "far", "gu", "gv", "k", "glint", "o", "n", "hinge", "hx", "hy", "hz", "side", "sa", "ca", "th", "c", "rad", "s", "nx", "ny", "u", "v", "w", "leaf", "mk", "drawLeaf", "el", "pose", "edge", "T", "front", "back", "f", "on", "trace", "ls", "l", "fr", "bk", "m", "draw", "hull", "F", "FD", "TH", "GAP", "DW", "DH", "T", "HOLE", "W", "H", "HX", "HY", "REST", "FAR", "STEP", "EDGE", "rr", "LO", "glass", "MID", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "pts", "corners", "th", "z", "rad", "fit", "P", "proj", "max", "swing", "spring", "g", "mk", "put", "solid", "box", "cover", "holed", "L", "leaf", "at", "hinge", "drawn", "B", "register", "dt", "moving", "stepS", "drawLeaf", "over", "aim", "pointer", "p", "a", "onWall", "clamp", "v", "spec", "N", "F", "FD", "TH", "GAP", "LW", "DH", "T", "HOLE", "W", "H", "X0", "Y0", "Z0", "REST", "FAR", "STEP", "ST", "EDGE", "rr", "PANE", "GLASS", "glass", "BAR", "edge", "k", "th", "rad", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "pts", "corners", "z", "fit", "P", "proj", "sa", "ca", "max", "fold", "spring", "g", "mk", "put", "solid", "box", "cover", "holed", "leaves", "leaf", "pose", "a", "b", "dx", "dy", "u", "v", "w", "drawn", "B", "register", "dt", "moving", "stepS", "L", "i", "mid", "at", "drawLeaf", "over", "aim", "rest", "c", "clamp", "pointer", "p", "onWall", "spec", "W", "WD", "H", "YF", "HOLE", "FRAME", "IN", "GAP", "DW", "DH", "HV", "REST", "G", "U", "BLOW", "SIDES", "blow", "i", "a", "b", "ALL", "n", "s", "along", "d", "clamp", "l", "lerp", "EDGE", "rr", "LO", "LEVER", "MID", "SLOTS", "_", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "reach", "seal", "spring", "clock", "g", "mk", "put", "solid", "box", "wall", "holed", "frame", "pose", "hinge", "drawLeaf", "leaf", "strip", "path", "air", "drawn", "paint", "key", "end", "pts", "draw", "open", "q", "k", "side", "bx", "by", "bz", "p", "t", "h", "f", "seg", "B", "register", "dt", "moving", "stepS", "blowing", "reducedMotion", "pointer", "x", "z", "onWall", "v", "spec", "dot3", "a", "b", "eyeOf", "P", "o", "ax", "q", "c", "e", "n", "at", "F", "u", "v", "w", "inFrame", "eye", "ring", "inner", "w0", "w1", "pr", "s", "lid", "side", "poly", "hull", "open", "run", "onPlane", "ea", "eb", "p", "q0", "qa", "qb", "ay", "bx", "by", "det", "px", "py", "E", "D", "W", "JOISTS", "JW", "JH", "TOP", "MID", "Y0", "Y1", "X0", "X1", "CX", "CY", "YT", "RF", "RB", "XS", "XT", "BEND", "FLEX", "MAIN", "SP", "NAMES", "dot3", "a", "b", "branch", "s", "th", "clamp", "x", "z", "sweep", "x0", "y0", "x1", "y1", "r", "i", "y", "rr", "_", "k", "rad", "nu", "nv", "cu", "cv", "engine", "stage", "svg", "read", "value", "bag", "disposer", "speed", "C", "Cam", "fit", "corners", "P", "proj", "eye", "eyeOf", "g", "mk", "put", "solid", "box", "run1", "elbow", "inset", "prism", "facing", "run2", "collar", "ring", "circ", "ribs", "flex", "c", "t", "pts", "f", "u", "v", "path", "poly", "air", "dots", "d", "dot", "parts", "tws", "tween", "act", "phase", "where", "br", "e", "n", "B", "register", "dt", "now", "reducedMotion", "moving", "lit", "tw", "tdone", "tval", "show", "q", "place", "cls", "choose", "ps", "tset", "el", "pick", "p", "gx", "gy", "unproj", "pointer", "spec", "world", "pitch", "c", "rad", "s", "u", "v", "h", "slope", "P", "W", "plate", "S", "u0", "v0", "u1", "v1", "h0", "h1", "r", "b", "ring", "rrect", "inner", "at", "q", "near", "poly", "hull", "open", "run", "tiles", "course", "len", "d", "row", "top", "seg", "onSlope", "p", "o", "a", "ex", "ey", "det", "qx", "qy", "HX", "HY", "E", "PITCH", "O", "T", "EY", "EH", "DMIN", "DTOP", "REST", "DOOR", "LIGHT", "CP", "rad", "SP", "RIDGE", "LEN", "GROUND", "TOP", "rect", "at", "a0", "a1", "b0", "b1", "i", "poly", "engine", "stage", "svg", "read", "value", "bag", "disposer", "DMAX", "C", "Cam", "fit", "corners", "P", "proj", "depth", "spring", "g", "mk", "back", "y", "z", "put", "solid", "box", "path", "hull", "q", "win", "r", "z0", "z1", "m", "sill", "seg", "x", "pitch", "side", "lift", "u", "v", "h", "plate", "tiles", "ext", "fascia", "doors", "y0", "y1", "n", "w", "mid", "lo", "a", "lantern", "lx0", "lx1", "ly0", "ly1", "lid", "drawn", "B", "register", "dt", "moving", "stepS", "d", "f", "draw", "open", "shift", "pointer", "p", "onWall", "clamp", "spec", "COLS", "ROWS", "X0", "BW", "Y0", "BD", "GAP", "T", "M", "PH", "LMAX", "REST", "covered", "i", "j", "fall", "d", "engine", "stage", "svg", "read", "value", "bag", "disposer", "LIFT", "X1", "Y1", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "put", "solid", "box", "path", "coursesX", "perpendsX", "coursesY", "perpendsY", "order", "a", "b", "boards", "x0", "x1", "y0", "y1", "bg", "sils", "u", "v", "h", "x", "y", "place", "dot", "tween", "act", "retarget", "depth", "now", "to", "tset", "e", "B", "register", "_dt", "moving", "tval", "tdone", "shift", "pointer", "p", "unproj", "next", "spec", "WX0", "WX1", "WT", "WZ", "CX", "ZC", "R", "BD", "FR", "FY", "T0", "T1", "SPAN", "REST", "PX", "PW", "PL", "PF", "PT", "PH", "X", "Y", "Z", "U", "N", "ang", "t", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "set", "spring", "g", "mk", "put", "solid", "box", "O", "bar", "circ", "f", "on", "tk", "r0", "r1", "a", "c", "s", "seg", "lo", "path", "mid", "hi", "rrect", "sc", "arc", "t0", "t1", "pts", "n", "i", "open", "poly", "q", "app", "drawn", "B", "register", "dt", "moving", "stepS", "m", "l", "lit", "d", "draw", "pointer", "p", "u", "v", "onWall", "r", "k", "spec", "D", "L", "FT", "HB", "FAN", "R", "W0", "BL", "X", "A", "Z", "engine", "stage", "svg", "read", "value", "bag", "disposer", "boost", "C", "Cam", "fit", "corners", "P", "proj", "rate", "spring", "phase", "g", "mk", "y", "put", "solid", "box", "fins", "z", "seg", "path", "shroud", "bar", "circ", "face", "on", "grille", "circle", "bl", "drawn", "tick", "dt", "stepS", "reducedMotion", "draw", "blades", "B", "register", "pointer", "p", "u", "v", "onWall", "t", "clamp", "spec", "N", "W", "D", "L", "PL", "H", "ZT", "YF", "WH", "C0", "HOB", "AJAR", "MAX", "TOP", "KIND", "engine", "stage", "svg", "read", "value", "bag", "disposer", "out", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "add", "b", "s", "solid", "put", "box", "front", "x0", "z0", "x1", "z1", "flat", "r", "poly", "ringAt", "i", "hx", "path", "seg", "drawers", "_", "xm", "across", "z", "up", "x", "marks", "zm", "body", "grp", "face", "spring", "sx", "rrect", "lip", "circ", "tx", "rings", "k", "c", "light", "a", "d", "j", "B", "register", "dt", "moving", "stepS", "shift", "over", "retarget", "pointer", "p", "onWall", "clamp", "v", "spec", "L", "D", "H", "WT", "T", "CX", "CY", "ZC", "YL", "XS", "RB", "RL", "REST", "RMAX", "engine", "stage", "svg", "read", "value", "bag", "disposer", "R", "C", "Cam", "fit", "corners", "P", "proj", "zf", "front", "facing", "g", "mk", "put", "solid", "box", "at", "x", "r", "z", "a", "ring", "poly", "_", "i", "lights", "prism", "circ", "path", "tween", "cone", "v", "d", "s", "b", "seg", "act", "B", "register", "_dt", "now", "moving", "l", "tval", "draw", "tdone", "choose", "n", "on", "tset", "el", "hit", "p", "y", "unproj", "best", "xi", "pointer", "spec", "LEN", "JOISTS", "JW", "JH", "D", "T", "RUN", "MID", "CORE", "PITCH", "R0", "MIN", "MAX", "REST", "radius", "l", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "pts", "corners", "fit", "P", "proj", "eye", "eyeOf", "laid", "spring", "g", "mk", "put", "solid", "box", "x", "i", "next", "sheet", "perf", "path", "roll", "spiral", "drawn", "B", "register", "dt", "moving", "stepS", "r", "seg", "F", "inFrame", "circ", "out", "turns", "k", "f", "rho", "th", "open", "pointer", "p", "y", "unproj", "clamp", "v", "spec", "c", "N", "GAP", "RW", "RD", "JH", "HALF", "RL", "TAIL", "Y1", "WALL", "SLAB", "RIDGE", "REST", "COURSE", "FRONT", "BACK", "engine", "stage", "svg", "read", "value", "bag", "disposer", "slide", "C", "Cam", "pts", "corners", "at", "fit", "P", "proj", "eye", "eyeOf", "g", "mk", "x", "x1", "put", "solid", "box", "path", "coursesX", "perpendsX", "coursesY", "perpendsY", "rafter", "F", "y", "r", "rings", "inFrame", "b", "sr", "si", "slabs", "tween", "drawSlab", "s", "d", "B", "register", "_dt", "now", "moving", "tval", "tdone", "act", "choose", "a", "force", "from", "lit", "i", "out", "tset", "plane", "pointer", "p", "u", "v", "onPlane", "clamp", "spec", "LA", "LB", "H", "WT", "SK", "OFF", "ZF", "ZR", "RX", "RZ", "VZ", "MAN", "N1", "N2", "RADS", "W", "k", "s", "d", "z", "route", "end", "fillet", "x", "y", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "line", "pts", "open", "q", "g", "mk", "add", "b", "put", "solid", "box", "rads", "a", "n", "x0", "y0", "z0", "x1", "y1", "z1", "_", "j", "lerp", "path", "tween", "flow", "lit", "L", "i", "p", "J1", "run", "up", "r", "water", "u", "out", "f", "v", "top", "tail", "B", "register", "_dt", "now", "draw", "tval", "moving", "tdone", "over", "dur", "aim", "tw", "tset", "choose", "pointer", "zb", "onWall", "za", "spec", "X", "Y", "ST", "PT", "ROOMS", "LIVING", "OUTER", "WINDOWS", "TITLE", "ROLL", "LMAX", "engine", "stage", "svg", "read", "value", "bag", "disposer", "LIFT", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "lines", "s", "z", "d", "i", "seg", "rect", "x0", "y0", "x1", "y1", "poly", "put", "solid", "box", "path", "rooms", "rg", "tween", "door", "room", "x", "y", "a", "b", "sw", "k", "c", "open", "tri", "hull", "roll", "F", "r0", "r1", "circ", "inFrame", "eyeOf", "coil", "_", "rho", "th", "act", "retarget", "now", "r", "on", "tset", "B", "register", "_dt", "moving", "v", "tval", "tdone", "shift", "pointer", "p", "unproj", "spec", "N", "PITCH", "GAP", "D", "FT", "HUB", "TOP", "L", "WALL", "RISE", "LEN", "REST", "rest", "j", "falloff", "t", "y0", "engine", "stage", "svg", "read", "value", "bag", "disposer", "R", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "add", "b", "s", "solid", "put", "box", "cols", "a", "parts", "spring", "vx", "vz", "wisps", "path", "time", "light", "c", "p", "wisp", "len", "zb", "o", "seed", "yc", "pts", "k", "z", "w", "open", "B", "register", "dt", "moving", "stepS", "still", "reducedMotion", "d", "warm", "draw", "over", "retarget", "pointer", "y", "onWall", "u", "clamp", "v", "spec", "L", "H", "WT", "STD", "X0", "X1", "YI", "YO", "YB", "YF", "LIFTS", "DT", "TOP", "BUTTS", "WX", "WZ", "BX", "REST", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "tube", "a", "b", "seg", "put", "solid", "box", "path", "coursesX", "perpendsX", "z0", "ring", "e", "poly", "x", "i", "inner", "rails", "outer", "z", "decks", "t", "s", "w", "d", "xs", "k", "y0", "toe", "rope", "bucket", "place", "dot", "tw", "tween", "act", "choose", "lit", "els", "el", "tset", "B", "drawn", "register", "_dt", "now", "tval", "draw", "tdone", "pointer", "p", "onWall", "v", "spec", "HOLE", "W", "H", "D", "HW", "HH", "YP", "YS", "TR", "T", "YF", "YN", "OV", "SW", "SH", "RUN", "REST", "pull", "u", "sash", "far", "glass", "rr", "NEAR", "PANE", "v0", "v1", "PRIMARY", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "max", "slide", "spring", "at", "x", "y", "z", "v", "w", "zb", "xl", "g", "mk", "holed", "drawLeaf", "leaf", "l", "rail", "x0", "x1", "z0", "z1", "put", "solid", "box", "edge", "near", "wall", "hole", "poly", "q", "path", "bx0", "bx1", "bz", "drawn", "B", "register", "dt", "moving", "stepS", "over", "aim", "pointer", "p", "a", "onWall", "clamp", "spec", "PITCH", "LAT", "U", "V", "MODS", "MV", "COLS", "ROWS", "R", "TOP", "REST", "LO", "HI", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "W", "world", "AC", "arc", "t", "rad", "pts", "fit", "P", "proj", "S", "slope", "sun", "spring", "g", "mk", "d", "seg", "path", "put", "solid", "plate", "tiles", "u0", "u1", "a0", "a1", "b0", "b1", "cells", "i", "u", "j", "v", "mid", "ray", "disc", "dot", "p", "n", "share", "h", "l", "s", "drawn", "B", "register", "dt", "moving", "stepS", "q", "place", "draw", "east", "west", "pointer", "x", "c", "clamp", "spec", "PITCH", "U", "V", "N", "U0", "GAP", "TR", "HC", "VB", "VT", "MAN", "REST", "engine", "stage", "svg", "read", "value", "bag", "disposer", "reach", "C", "Cam", "W", "world", "fit", "P", "proj", "S", "slope", "uc", "i", "tube", "u", "pts", "a", "cu", "ch", "b", "poly", "hull", "g", "mk", "put", "solid", "plate", "path", "tiles", "a0", "a1", "tubes", "tween", "heat", "r", "lit", "aim", "now", "t", "tset", "B", "register", "_dt", "moving", "f", "tval", "draw", "seg", "tdone", "over", "choose", "pointer", "p", "v", "onSlope", "inside", "spec", "W", "H", "LAYERS", "INSULATION", "REST", "GMAX", "engine", "stage", "svg", "read", "value", "bag", "disposer", "GAP", "e", "spring", "C", "Cam", "top", "fit", "corners", "P", "proj", "root", "mk", "Y", "put", "solid", "box", "path", "coursesX", "perpendsX", "coursesY", "perpendsY", "els", "ly", "g", "s", "slab", "boards", "floor", "sl", "i", "a", "z", "q", "place", "dot", "bd", "d", "x", "seg", "y", "fl", "row", "at", "light", "lit", "drawn", "B", "register", "dt", "m", "stepS", "shift", "pick", "p", "best", "gap", "c", "pointer", "clamp", "act", "v", "spec", "X", "Y", "BW", "LEN", "BT", "JOISTS", "JW", "JH", "PL", "VOID", "SLAB", "BASE", "SLEEPER", "WALL", "LMAX", "REST", "fall", "d", "engine", "stage", "svg", "read", "value", "bag", "disposer", "LIFT", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "put", "solid", "box", "path", "coursesY", "perpendsY", "s0", "s1", "coursesX", "perpendsX", "batt", "x0", "x1", "zb", "mid", "top", "y", "face", "x", "boards", "len", "k", "y0", "y1", "bg", "s", "next", "seg", "rim", "tween", "act", "retarget", "a", "now", "to", "tset", "B", "register", "_dt", "moving", "b", "v", "tval", "tdone", "shift", "pointer", "p", "unproj", "spec", "c", "V", "U", "RW", "RD", "BT", "T0", "T1", "EAV", "NOSE", "TOP", "CUT", "N", "BAND", "RUN", "WALL", "RR", "REST", "pitch", "x", "s", "NEAR", "FAR", "RIDGE", "lo", "i", "hi", "mid", "hash", "n", "section", "a0", "a1", "b0", "b1", "r", "e", "out", "k", "rr", "ca", "cb", "j", "t", "nu", "nv", "engine", "stage", "svg", "read", "value", "bag", "disposer", "LIFT", "C", "Cam", "pts", "corners", "F", "at", "fit", "P", "proj", "eye", "eyeOf", "Q", "a", "b", "u", "slab", "el", "u0", "u1", "sl", "solid", "put", "inFrame", "reeds", "nose", "d", "row", "from", "seg", "g", "mk", "wall", "x1", "box", "coursesY", "perpendsY", "coursesX", "perpendsX", "path", "courses", "cg", "sec", "l", "tie", "where", "amt", "spring", "B", "register", "dt", "moving", "stepS", "z", "shift", "aim", "text", "plane", "pointer", "p", "onPlane", "clamp", "v", "spec", "X", "Y", "PT", "PZ", "A", "D", "TURNS", "B", "BW", "BOARDS", "REST", "coil", "sq", "a", "b", "out", "t", "o", "p", "i", "inward", "back", "mid", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "raw", "u", "v", "pts", "fillet", "_", "len", "total", "scr", "q", "run", "spring", "g", "mk", "put", "solid", "box", "path", "open", "lit", "l", "k", "drawn", "B2", "register", "dt", "moving", "stepS", "s", "clamp", "f", "draw", "along", "x", "y", "best", "at", "ax", "ay", "bx", "by", "l2", "d", "rest", "pointer", "unproj", "spec", "W", "H", "T", "FC", "HS", "DEPTH", "R", "BL", "W0", "AIR", "d", "LONG", "TILE", "X", "Y", "Z", "engine", "stage", "svg", "read", "value", "bag", "disposer", "boost", "C", "Cam", "far", "fit", "corners", "P", "proj", "rate", "spring", "phase", "g", "mk", "put", "solid", "box", "tiles", "x", "seg", "path", "coursesY", "sq", "h", "r", "rrect", "bar", "face", "on", "circle", "bl", "turn", "circ", "air", "swirl", "len", "a0", "pts", "k", "t", "a", "open", "length", "clamp", "drawn", "paint", "key", "draw", "blades", "tick", "dt", "moving", "stepS", "reducedMotion", "B", "register", "pointer", "p", "u", "v", "onWall", "spec", "H", "COURSE", "BRICK", "OUT", "CAV", "INN", "REST", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "fit", "corners", "P", "proj", "level", "spring", "g", "mk", "put", "solid", "box", "path", "coursesX", "fill", "beads", "bg", "bead", "x", "y", "z", "el", "dot", "place", "row", "off", "coursesY", "perpendsY", "perpendsX", "drawn", "B", "register", "dt", "moving", "stepS", "top", "pointer", "p", "onWall", "clamp", "v", "spec", "H", "L", "LAYERS", "BOARDS", "REST", "GMAX", "engine", "stage", "svg", "read", "value", "bag", "disposer", "GAP", "act", "e", "spring", "C", "Cam", "off", "i", "g", "fit", "corners", "P", "proj", "root", "mk", "els", "ly", "s", "solid", "put", "box", "path", "wall", "boards", "mesh", "render", "coursesY", "perpendsY", "coursesX", "perpendsX", "row", "x", "place", "dot", "d", "seg", "z", "light", "a", "lit", "E", "drawn", "B", "register", "dt", "m", "stepS", "shift", "pick", "p", "pg", "outline", "inside", "pointer", "clamp", "v", "spec", "L", "COURSE", "BRICK", "STEP", "BLOCK", "INS", "BR", "NAMES", "REST", "PROUD", "GMAX", "BOXES", "_", "k", "engine", "stage", "svg", "read", "value", "bag", "disposer", "lift", "act", "C", "Cam", "fit", "corners", "P", "proj", "root", "mk", "layers", "bs", "i", "g", "ss", "b", "s", "solid", "put", "box", "tw", "tween", "path", "block", "ins", "brick", "coursesY", "perpendsY", "coursesX", "perpendsX", "seg", "d", "light", "a", "lit", "ly", "B", "register", "_dt", "now", "moving", "v", "tval", "shift", "tdone", "rest", "outline", "pick", "p", "pg", "inside", "choose", "from", "to", "tset", "pointer", "spec", "H", "L", "N", "W", "BRICK", "BAT", "PB", "FLOOR", "REST_A", "REST", "GMAX", "reach", "i", "a", "rest", "engine", "stage", "svg", "read", "value", "bag", "disposer", "D", "C", "Cam", "fit", "corners", "P", "proj", "g", "mk", "end", "put", "solid", "box", "path", "coursesX", "perpendsX", "coursesY", "perpendsY", "seg", "d", "y", "bays", "x", "bat", "s", "z", "sheets", "_", "sg", "tween", "B", "register", "_dt", "now", "moving", "v", "tval", "shift", "tdone", "choose", "tset", "act", "pointer", "p", "onWall", "clamp", "spec", "HH", "R", "TH", "rad", "E", "A", "X", "Y", "Z", "HUB", "ROT", "W0", "REST", "SX", "G", "TUFTS", "blade", "at", "th", "c", "s", "pt", "r", "w", "chord", "t", "lead", "trail", "k", "poly", "engine", "stage", "svg", "read", "value", "bag", "disposer", "boost", "C", "Cam", "rc", "ext", "corners", "i", "a", "u", "v", "fit", "P", "proj", "wind", "spring", "phase", "g", "mk", "put", "solid", "box", "grass", "x", "y", "d", "seg", "path", "bar", "circ", "side", "on", "z", "ring", "q", "hull", "face", "sweep", "circle", "bl", "hub", "paint", "draw", "rate", "tick", "dt", "stepS", "reducedMotion", "B", "register", "lit", "pointer", "clamp", "spec", "WD", "R", "YF", "HOLE", "W", "H", "FRAME", "IN", "GAP", "CW", "CH", "T", "SW", "MID", "REST", "FAR", "SILL", "E", "EDGE", "rr", "LEVER", "sash", "far", "glass", "SASH", "engine", "stage", "svg", "read", "value", "bag", "disposer", "C", "Cam", "pts", "corners", "s", "th", "z", "rad", "fit", "P", "proj", "on", "y", "q", "max", "act", "g", "mk", "holed", "put", "solid", "box", "cover", "leaves", "i", "leaf", "hinge", "tween", "vent", "c", "poly", "path", "band", "edge", "open", "B", "register", "_dt", "now", "moving", "L", "tval", "drawLeaf", "tdone", "choose", "n", "force", "to", "tset", "hit", "p", "onWall", "pointer", "v", "spec", "FIGURES", "spec", "isFigureId", "id", "mount", "el", "options", "create", "linework_default", "name", "figure", "root", "stage", "id", "isFigureId", "intensity", "mount", "text", "hubspot_default", "id", "j", "highest", "a", "b", "nav_default", "link", "hashes", "x", "observer", "entries", "SEPARATORS", "normalise", "text", "words", "initials", "word", "score", "query", "title", "keywords", "q", "t", "titleWords", "keywordWords", "total", "allInTitle", "term", "rank", "entries", "entry", "order", "scored", "a", "b", "highlight", "terms", "lower", "hits", "at", "from", "found", "parts", "i", "hit", "last", "RECORDS", "RECENT_LIMIT", "LOCAL_LIMIT", "STRONG", "drillable", "item", "config", "childrenOf", "section", "child", "pageItems", "page", "projectActions", "href", "actions", "project", "byTitle", "query", "items", "limit", "rank", "best", "score", "narrow", "groups", "terms", "normalise", "group", "text", "term", "recent", "remote", "scope", "q", "here", "hereLabel", "pages", "elsewhere", "seen", "i", "local", "lists", "search", "layout", "list", "rows", "remember", "id", "kind", "title", "subtitle", "badge", "url", "pk", "children", "kept", "other", "parseRecent", "raw", "value", "entry", "KINDS", "STORAGE_KEY", "DEBOUNCE", "SPINNER_DELAY", "CACHE_SIZE", "readStored", "writeStored", "recent", "raw", "searchable", "query", "optionId", "index", "palette_default", "config", "stored", "remote", "remoteQuery", "outerQuery", "lastFocus", "chosen", "generation", "pending", "enterWhenReady", "debounce", "spinner", "controller", "cache", "cleanup", "parseRecent", "remember", "onKey", "event", "onShow", "warm", "undo", "now", "input", "restoreFocus", "shown", "narrow", "list", "groups", "previous", "rows", "items", "layout", "row", "kept", "item", "cached", "mine", "response", "body", "answer", "oldest", "error", "newTab", "by", "count", "drillable", "left", "at", "text", "atEnd", "ctrl", "highlight", "win", "window", "global", "globalThis", "self", "File", "navigator", "document", "location", "fetch", "XMLHttpRequest", "AbortController", "CompressionStream", "userAgent", "assignableWindow", "d", "Config", "DEBUG", "LIB_VERSION", "packageInfo", "LIB_NAME", "JS_SDK_VERSION", "_gzipCompress", "_asyncToGenerator", "input", "isDebug", "options", "compressedStream", "writer", "writable", "getWriter", "writePromise", "write", "TextEncoder", "encode", "then", "close", "catch", "_ref", "err", "abort", "_unused", "_x4", "apply", "this", "arguments", "responsePromise", "Response", "readable", "blob", "compressed", "Promise", "all", "error", "rethrow", "console", "DEFAULT_BLOCKED_UA_STRS", "isBlockedUA", "ua", "customBlockedUserAgents", "uaLower", "toLowerCase", "concat", "some", "blockedUA", "blockedUaLower", "indexOf", "knownUnsafeEditableEvent", "includes", "str", "needle", "trim", "stripLeadingDollar", "s", "replace", "ObjProto", "Object", "prototype", "type_utils_hasOwnProperty", "hasOwnProperty", "type_utils_toString", "toString", "isArray", "Array", "obj", "call", "isFunction", "x", "isObject", "isEmptyObject", "key", "isUndefined", "isString", "isEmptyString", "length", "isNull", "isNullish", "isNumber", "isPositiveNumber", "value", "isBoolean", "isFormData", "FormData", "isKnownUnsafeEditableEvent", "isPrimitive", "isBuiltin", "candidate", "className", "isEvent", "Event", "base", "yesLikeValues", "isYesLike", "val", "noLikeValues", "clampToRange", "min", "max", "logger", "fallbackValue", "warn", "BucketedRateLimiter", "constructor", "_buckets", "_onBucketRateLimited", "_bucketSize", "bucketSize", "_logger", "_refillRate", "refillRate", "_refillInterval", "refillInterval", "_applyRefill", "bucket", "now", "refillIntervals", "Math", "floor", "lastAccess", "tokens", "consumeRateLimit", "_this$_onBucketRateLi", "Date", "keyStr", "String", "stop", "parsedStackResults", "lastKeysCount", "cachedFilenameChunkIds", "MOBILE", "IOS", "ANDROID", "TABLET", "ANDROID_TABLET", "IPAD", "APPLE", "APPLE_WATCH", "SAFARI", "BLACKBERRY", "SAMSUNG", "SAMSUNG_BROWSER", "SAMSUNG_INTERNET", "CHROME", "CHROME_OS", "CHROME_IOS", "INTERNET_EXPLORER", "INTERNET_EXPLORER_MOBILE", "OPERA", "OPERA_MINI", "EDGE", "MICROSOFT_EDGE", "FIREFOX", "FIREFOX_IOS", "NINTENDO", "PLAYSTATION", "XBOX", "ANDROID_MOBILE", "MOBILE_SAFARI", "WINDOWS", "WINDOWS_PHONE", "NOKIA", "OUYA", "GENERIC", "GENERIC_MOBILE", "GENERIC_TABLET", "KONQUEROR", "BROWSER_VERSION_REGEX_SUFFIX", "DEFAULT_BROWSER_VERSION_REGEX", "RegExp", "XBOX_REGEX", "PLAYSTATION_REGEX", "NINTENDO_REGEX", "BLACKBERRY_REGEX", "windowsVersionMap", "detectBrowser", "user_agent", "vendor", "test", "FACEBOOK", "safariCheck", "versionRegexes", "Mozilla", "detectBrowserVersion", "browser", "regexes", "i", "matches", "match", "parseFloat", "osMatchers", "_", "exec", "osVersion", "join", "version", "result", "detectDevice", "isError", "Error", "OTLP_SEVERITY_MAP", "trace", "text", "number", "debug", "info", "fatal", "DEFAULT_OTLP_SEVERITY", "toOtlpAnyValue", "boolValue", "Number", "isFinite", "isInteger", "intValue", "doubleValue", "stringValue", "arrayValue", "values", "map", "v", "JSON", "stringify", "toOtlpKeyValueList", "attrs", "push", "getFilenameToChunkIdMap", "stackParser", "chunkIdMap", "_posthogChunkIds", "chunkIdKeys", "keys", "reduce", "acc", "stackKey", "parsedStack", "stackFrame", "filename", "chunkId", "ErrorPropertiesBuilder", "coercers", "modifiers", "buildFromUnknown", "hint", "mechanism", "handled", "type", "exceptionWithCause", "buildCoercingContext", "parsingContext", "buildParsingContext", "exceptionWithStack", "parseStacktrace", "$exception_list", "convertToExceptionList", "$exception_level", "modifyFrames", "exceptionList", "_this", "exc", "stacktrace", "frames", "applyModifiers", "coerceFallback", "ctx", "_ctx$syntheticExcepti", "stack", "syntheticException", "synthetic", "cause", "applyChunkIds", "skipFirstLines", "_extends", "frame", "chunk_id", "applyCoercers", "adapter", "coerce", "_this2", "newFrames", "modifier", "_mechanism$type", "_mechanism$handled", "_exceptionWithStack$s", "currentException", "_hint$skipFirstLines", "depth", "next", "UNKNOWN_FUNCTION", "createFrame", "platform", "func", "lineno", "colno", "function", "in_app", "extractSafariExtensionDetails", "isSafariExtension", "isSafariWebExtension", "split", "chromeRegexNoFnName", "chromeRegex", "chromeEvalRegex", "chromeStackLineParser", "line", "noFnParts", "col", "parts", "subMatch", "geckoREgex", "geckoEvalRegex", "geckoStackLineParser", "WEBPACK_ERROR_REGEXP", "DOMExceptionCoercer", "isDOMException", "isDOMError", "hasStack", "getType", "getValue", "name", "message", "ErrorCoercer", "getMessage", "getStack", "_ctx", "ErrorEventCoercer", "ERROR_TYPES_PATTERN", "StringCoercer", "getInfos", "groups", "severityLevels", "extractExceptionKeysForMessage", "maxLength", "sort", "serialized", "slice", "ObjectCoercer", "errorProperty", "getErrorPropertyFromObject", "level", "isSeverityLevel", "getObjectClassName", "prop", "getPrototypeOf", "e", "EventCoercer", "evt", "constructorName", "PrimitiveCoercer", "PromiseRejectionEventCoercer", "isCustomEventWrappingRejection", "detail", "reason", "getUnhandledRejectionReason", "_unused2", "EXCEPTION_STEP_INTERNAL_FIELDS", "RESERVED_EXCEPTION_STEP_KEYS", "Set", "DEFAULT_EXCEPTION_STEPS_CONFIG", "enabled", "max_bytes", "resolveExceptionStepsConfig", "config", "_config$enabled", "normalizePositiveInteger", "ExceptionStepsBuffer", "_entries", "_totalBytes", "_config", "setConfig", "_trimToMaxBytes", "add", "step", "json", "seen", "WeakSet", "_key", "replacementValue", "toISOString", "has", "parsed", "parse", "parsedStep", "timestamp", "bytes", "encoded", "encodeURIComponent", "byteLength", "getAttachable", "clear", "size", "evicted", "shift", "fallback", "normalized", "_createLogger", "prefix", "_temp", "debugEnabled", "_log", "POSTHOG_DEBUG", "consoleLog", "_len", "args", "_len2", "_key2", "_len3", "_key3", "_len4", "_key4", "_len5", "_key5", "critical", "_len6", "_key6", "uninitializedWarning", "methodName", "createLogger", "additionalPrefix", "loadScript", "posthog", "url", "callback", "disable_external_dependency_loading", "existingScripts", "querySelectorAll", "_ret", "_loop", "src", "alreadyExistingScriptTag", "__posthog_loading_callback_fired", "addEventListener", "event", "onerror", "addScript", "scriptTag", "createElement", "crossOrigin", "onload", "prepare_external_dependency_script", "external_scripts_inject_target", "head", "appendChild", "_scripts$0$parentNode", "scripts", "parentNode", "insertBefore", "body", "__PosthogExtensions__", "loadExternalDependency", "kind", "__preview_external_dependency_versioned_paths", "requestRouter", "endpointFor", "scriptUrlToLoad", "fiveMinutesInMillis", "token", "loadSiteApp", "scriptUrl", "PEOPLE_DISTINCT_ID_KEY", "DEVICE_ID", "ALIAS_ID_KEY", "EVENT_TIMERS_KEY", "AUTOCAPTURE_DISABLED_SERVER_SIDE", "HEATMAPS_ENABLED_SERVER_SIDE", "EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE", "ERROR_TRACKING_SUPPRESSION_RULES", "ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS", "WEB_VITALS_ENABLED_SERVER_SIDE", "DEAD_CLICKS_ENABLED_SERVER_SIDE", "PRODUCT_TOURS_ENABLED_SERVER_SIDE", "WEB_VITALS_ALLOWED_METRICS", "SESSION_RECORDING_REMOTE_CONFIG", "SESSION_RECORDING_OVERRIDE_SAMPLING", "SESSION_RECORDING_OVERRIDE_LINKED_FLAG", "SESSION_RECORDING_OVERRIDE_URL_TRIGGER", "SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER", "SESSION_ID", "SESSION_RECORDING_IS_SAMPLED", "ENABLED_FEATURE_FLAGS", "PERSISTENCE_ACTIVE_FEATURE_FLAGS", "PERSISTENCE_EARLY_ACCESS_FEATURES", "PERSISTENCE_FEATURE_FLAG_DETAILS", "PERSISTENCE_FEATURE_FLAG_PAYLOADS", "PERSISTENCE_FEATURE_FLAG_REQUEST_ID", "PERSISTENCE_OVERRIDE_FEATURE_FLAGS", "PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS", "STORED_PERSON_PROPERTIES_KEY", "STORED_GROUP_PROPERTIES_KEY", "SURVEYS", "SURVEYS_ACTIVATED", "PRODUCT_TOURS", "FLAG_CALL_REPORTED", "FLAG_CALL_REPORTED_SESSION_ID", "PERSISTENCE_FEATURE_FLAG_ERRORS", "PERSISTENCE_FEATURE_FLAG_EVALUATED_AT", "USER_STATE", "CLIENT_SESSION_PROPS", "CAPTURE_RATE_LIMIT", "INITIAL_CAMPAIGN_PARAMS", "INITIAL_REFERRER_INFO", "INITIAL_PERSON_INFO", "ENABLE_PERSON_PROCESSING", "TOOLBAR_ID", "COOKIELESS_SENTINEL_VALUE", "SDK_DEBUG_EXTENSIONS_INIT_METHOD", "SDK_DEBUG_EXTENSIONS_INIT_TIME_MS", "SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED", "LOAD_EXT_NOT_FOUND", "COOKIELESS_ON_REJECT", "COOKIELESS_ALWAYS", "USER_STATE_ANONYMOUS", "USER_STATE_IDENTIFIED", "PERSON_PROFILES_IDENTIFIED_ONLY", "DOM_EVENT_VISIBILITYCHANGE", "DOM_EVENT_BEFOREUNLOAD", "EVENT_PAGEVIEW", "EVENT_PAGELEAVE", "EVENT_IDENTIFY", "EVENT_GROUPIDENTIFY", "eachArray", "iterator", "forEach", "each", "extend", "source", "entries", "ownProps", "resArray", "trySafe", "fn", "safewrap", "f", "stripEmptyProperties", "p", "ret", "k", "EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE", "isCrossDomainCookie", "documentLocation", "hostname", "lastTwoParts", "excluded", "element", "capture", "passive", "isToolbarInstance", "trunc", "ceil", "UUID", "TypeError", "unixTsMs", "randA", "randBHi", "randBLo", "RangeError", "Uint8Array", "pow", "clone", "equals", "other", "compareTo", "diff", "sign", "V7Generator", "_timestamp", "_counter", "_random", "DefaultRandom", "generate", "generateOrAbort", "valueAfterReset", "ts", "_resetCounter", "fromFieldsV7", "nextUint32", "defaultGenerator", "getRandomValues", "buffer", "UUIDV7_DENY_WEAK_RNG", "random", "crypto", "_buffer", "Uint32Array", "_cursor", "Infinity", "uuidv7", "uuidv7obj", "firstNonPublicSubDomain", "DOMAIN_MATCH_REGEX", "cookieStore", "_is_supported", "_error", "msg", "_get", "nameEQ", "ca", "cookie", "filter", "c", "charAt", "substring", "decodeURIComponent", "_parse", "_set", "days", "cross_subdomain", "is_secure", "expires", "secure", "cdomain", "matchedSubDomain", "cookieJar", "list", "len", "candidateCookieValue", "originalMatch", "date", "setTime", "getTime", "toUTCString", "new_cookie_val", "_unused3", "_remove", "_unused4", "_localStorage_supported", "localStore", "supported", "_unused5", "localStorage", "getItem", "_unused6", "setItem", "removeItem", "COOKIE_PERSISTED_PROPERTIES", "memoryStorage", "memoryStore", "sessionStorageSupported", "sessionStore", "_unused9", "sessionStorage", "_unused0", "ConsentManager", "_instance", "consent", "_getDnt", "_storedConsent", "isOptedOut", "cookieless_mode", "isRejected", "isOptedIn", "isExplicitlyOptedOut", "opt_out_capturing_by_default", "optInOut", "_storage", "_storageKey", "cookie_expiration", "cross_subdomain_cookie", "secure_cookie", "reset", "opt_out_capturing_cookie_prefix", "consent_persistence_name", "persistenceType", "opt_out_capturing_persistence_type", "expectedStore", "_persistentStore", "otherStorage", "respect_dnt", "doNotTrack", "dntValue", "isDeadClicksEnabledForHeatmaps", "isDeadClicksEnabledForAutocapture", "instance", "_instance$instance$pe", "isRemoteEnabled", "persistence", "get_property", "clientConfig", "capture_dead_clicks", "DeadClicksAutocapture", "lazyLoadedDeadClicksAutocapture", "_lazyLoadedDeadClicksAutocapture", "isEnabled", "onCapture", "startIfEnabledOrStop", "onRemoteConfig", "response", "register", "captureDeadClicks", "_loadScript", "_start", "cb", "_assignableWindow$__P", "_assignableWindow$__P2", "initDeadClicksAutocapture", "_assignableWindow$__P3", "__onCapture", "start", "NAME", "createEventProcessor", "_posthog", "organization", "projectId", "severityAllowList", "sendExceptionsToPostHog", "_event$exception", "_exceptions$", "_exceptions$2", "_exceptions$3", "_exceptions$4", "__loaded", "tags", "personUrl", "get_distinct_id", "sessionRecordingStarted", "get_session_replay_url", "withTimestamp", "_posthog$exceptions", "exceptions", "exception", "undefined", "data", "$exception_message", "$exception_type", "$sentry_event_id", "event_id", "$sentry_exception", "$sentry_exception_message", "$sentry_exception_type", "$sentry_tags", "sendExceptionEvent", "SentryIntegration", "setupOnce", "addGlobalEventProcessor", "PageViewManager", "_onSessionIdChange", "sessionId", "_windowId", "changeReason", "noSessionId", "activityTimeout", "sessionPastMaximumLength", "_currentPageview", "scrollManager", "resetContext", "_setupSessionRotationHandler", "_this$_instance$sessi", "_unsubscribeSessionId", "sessionManager", "onSessionId", "destroy", "_this$_unsubscribeSes", "doPageView", "pageViewId", "_window$location$path", "_previousPageViewProperties", "pathname", "doPageLeave", "_this$_currentPagevie", "doEvent", "_this$_currentPagevie2", "$pageview_id", "pageviewId", "previousPageView", "properties", "$prev_pageview_id", "scrollContext", "getContext", "disable_scroll_properties", "maxScrollHeight", "lastScrollY", "maxScrollY", "maxContentHeight", "lastContentY", "maxContentY", "lastScrollPercentage", "maxScrollPercentage", "lastContentPercentage", "maxContentPercentage", "$prev_pageview_last_scroll", "$prev_pageview_last_scroll_percentage", "$prev_pageview_max_scroll", "$prev_pageview_max_scroll_percentage", "$prev_pageview_last_content", "$prev_pageview_last_content_percentage", "$prev_pageview_max_content", "$prev_pageview_max_content_percentage", "$prev_pageview_pathname", "$prev_pageview_duration", "PERSISTENCE_KEY_POLICY", "exposure", "__cmpns", "$session_recording_enabled_server_side", "$session_past_minimum_duration", "$session_recording_url_trigger_activated_session", "$session_recording_event_trigger_activated_session", "$debug_first_full_snapshot_timestamp", "shouldSkipFromEventProperties", "shouldSkip", "transformToEventProperties", "eventProperties", "$product_tours_activated", "$conversations_widget_session_id", "$conversations_ticket_id", "$conversations_widget_state", "$conversations_user_traits", "$sdk_debug_replay_event_trigger_status", "$sdk_debug_replay_linked_flag_trigger_status", "$sdk_debug_replay_matched_recording_trigger_groups", "$sdk_debug_replay_remote_trigger_matching_config", "$sdk_debug_replay_trigger_groups_count", "$sdk_debug_replay_url_trigger_status", "$session_recording_start_reason", "PERSISTENCE_KEY_PREFIX_POLICY", "convertToURL", "href", "getQueryParam", "param", "keyValuePair", "queryParts", "maskQueryParams", "maskedParams", "mask", "splitHash", "hash", "splitQuery", "queryString", "urlWithoutQueryAndHash", "paramStrings", "_getHashParam", "URL_REGEX_PREFIX", "PERSONAL_DATA_CAMPAIGN_PARAMS", "CAMPAIGN_PARAMS", "MASKED", "COOKIE_CAMPAIGN_PARAMS", "getCampaignParams", "customTrackedParams", "maskPersonalDataProperties", "customPersonalDataProperties", "params", "paramsToMask", "urlCampaignParams", "_getCampaignParamsFromUrl", "URL", "cookieCampaignParams", "kwkey", "kw", "customParams", "campaign_keywords", "_getSearchInfoFromReferrer", "referrer", "search", "keyword", "getBrowserLanguage", "language", "userLanguage", "DIRECT", "getReferrer", "getPersonInfo", "r", "u", "getPersonPropsFromInfo", "_convertToURL2", "props", "$referrer", "$referring_domain", "host", "campaignParams", "searchInfo", "getTimezone", "Intl", "DateTimeFormat", "resolvedOptions", "timeZone", "getTimezoneOffset", "CASE_INSENSITIVE_PERSISTENCE_TYPES", "PostHogPersistence", "isDisabled", "_campaign_params_saved", "_name", "_buildStorage", "load", "update_config", "save", "_disabled", "localPlusCookieStore", "customCookieProperties", "cookiePropertiesToPersist", "cookieProperties", "_unused7", "_unused8", "cookiePersistedProperties", "storage_type", "_isFeatureFlagCacheStale", "ttl", "effectiveTtl", "feature_flag_cache_ttl_ms", "evaluatedAt", "policy", "exactMatch", "entry", "_expire_days", "_cross_subdomain", "_secure", "remove", "register_once", "default_value", "_default_expiry", "hasChanges", "_setProp", "unregister", "_deleteProp", "update_campaign_params", "custom_campaign_params", "mask_personal_data_properties", "custom_personal_data_properties", "update_search_keyword", "update_referrer_info", "_convertToURL", "set_initial_person_info", "get_initial_props", "initialReferrerInfo", "personProps", "initialPersonInfo", "initialPersonProps", "safe_merge", "oldConfig", "set_disabled", "set_cross_subdomain", "set_secure", "isArrayContentsEqual", "arr1", "arr2", "sortedArr1", "sortedArr2", "every", "item", "index", "cookie_persisted_properties", "newStore", "disabled", "set_event_timer", "event_name", "timers", "remove_event_timer", "set_property", "to", "SurveyEventType", "Activation", "Cancellation", "SurveyType", "Popover", "API", "Widget", "ExternalSurvey", "SurveyEventName", "SHOWN", "DISMISSED", "SENT", "ABANDONED", "SurveyEventProperties", "SURVEY_ID", "SURVEY_NAME", "SURVEY_RESPONSE", "SURVEY_ITERATION", "SURVEY_ITERATION_START_DATE", "SURVEY_PARTIALLY_COMPLETED", "SURVEY_SUBMISSION_ID", "SURVEY_QUESTIONS", "SURVEY_COMPLETED", "PRODUCT_TOUR_ID", "SURVEY_LAST_SEEN_DATE", "SURVEY_LANGUAGE", "DisplaySurveyType", "Popover", "Inline", "ProductTourEventName", "SHOWN", "DISMISSED", "COMPLETED", "STEP_SHOWN", "STEP_COMPLETED", "BUTTON_CLICKED", "STEP_SELECTOR_FAILED", "BANNER_CONTAINER_SELECTOR_FAILED", "BANNER_ACTION_CLICKED", "ProductTourEventProperties", "TOUR_ID", "TOUR_NAME", "TOUR_ITERATION", "TOUR_RENDER_REASON", "TOUR_STEP_ID", "TOUR_STEP_ORDER", "TOUR_STEP_TYPE", "TOUR_DISMISS_REASON", "TOUR_BUTTON_TEXT", "TOUR_BUTTON_ACTION", "TOUR_BUTTON_LINK", "TOUR_BUTTON_TOUR_ID", "TOUR_STEPS_COUNT", "TOUR_STEP_SELECTOR", "TOUR_STEP_SELECTOR_FOUND", "TOUR_STEP_ELEMENT_TAG", "TOUR_STEP_ELEMENT_ID", "TOUR_STEP_ELEMENT_CLASSES", "TOUR_STEP_ELEMENT_TEXT", "TOUR_ERROR", "TOUR_MATCHES_COUNT", "TOUR_FAILURE_PHASE", "TOUR_WAITED_FOR_ELEMENT", "TOUR_WAIT_DURATION_MS", "TOUR_BANNER_SELECTOR", "TOUR_LINKED_SURVEY_ID", "USE_MANUAL_SELECTOR", "INFERENCE_DATA_PRESENT", "TOUR_LAST_SEEN_DATE", "TOUR_TYPE", "logger", "createLogger", "RateLimiter", "constructor", "instance", "this", "serverLimits", "lastEventRateLimited", "checkForLimiting", "httpResponse", "text", "length", "JSON", "parse", "quota_limited", "forEach", "batchKey", "info", "Date", "getTime", "e", "warn", "message", "clientRateLimitContext", "isRateLimited", "captureEventsPerSecond", "_this$instance$config", "config", "rate_limiting", "events_per_second", "captureEventsBurstLimit", "_this$instance$config2", "Math", "max", "events_burst_limit", "checkOnly", "_this$instance$persis", "_this$instance$persis2", "_this$instance$persis3", "now", "bucket", "persistence", "get_property", "CAPTURE_RATE_LIMIT", "tokens", "last", "capture", "$$client_ingestion_warning_message", "skip_client_rate_limiting", "set_property", "remainingTokens", "isServerRateLimited", "retryAfter", "RemoteConfigLoader", "_instance", "remoteConfig", "_assignableWindow$_PO", "assignableWindow", "_POSTHOG_REMOTE_CONFIG", "token", "_loadRemoteConfigJs", "cb", "_assignableWindow$__P", "_assignableWindow$__P2", "__PosthogExtensions__", "loadExternalDependency", "_loadRemoteConfigJSON", "_send_request", "method", "url", "requestRouter", "endpointFor", "callback", "response", "json", "load", "_onRemoteConfig", "_startRefreshInterval", "_shouldDisableFlags", "error", "stop", "_refreshInterval", "clearInterval", "refresh", "document", "visibilityState", "reloadFeatureFlags", "_this$_instance$confi", "intervalMs", "remote_config_refresh_interval_ms", "setInterval", "_this$_instance$featu", "hasFeatureFlags", "advanced_disable_feature_flags_on_first_load", "featureFlags", "ensureFlagsLoaded", "Compression", "GZipJS", "Base64", "u8", "Uint8Array", "u16", "Uint16Array", "u32", "Uint32Array", "fleb", "fdeb", "clim", "freb", "eb", "start", "b", "i", "r", "j", "_a", "revfl", "revfd", "rev", "x", "hMap", "cd", "mb", "s", "length", "l", "co", "le", "rvb", "sv", "r_1", "v", "m", "flt", "fdt", "flm", "fdm", "shft", "p", "slc", "e", "n", "set", "subarray", "wbits", "d", "o", "wbits16", "hTree", "t", "push", "f", "t2", "slice", "sort", "a", "i0", "i1", "i2", "maxSym", "tr", "mbt", "ln", "dt", "lft", "cst", "i2_1", "i2_2", "i2_3", "Math", "max", "lc", "c", "cl", "cli", "cln", "cls", "w", "clen", "cf", "wfblk", "out", "pos", "dat", "wblk", "final", "syms", "lf", "df", "li", "bs", "bl", "dlt", "mlb", "_b", "ddt", "mdb", "_c", "lclt", "nlc", "_d", "lcdt", "ndc", "lcfreq", "_e", "lct", "mlcb", "nlcc", "lm", "ll", "dm", "dl", "flen", "ftlen", "dtlen", "llm", "lcts", "it", "clct", "len", "dst", "deo", "crct", "k", "wbytes", "gzipSync", "data", "opts", "cr", "crc", "opt", "pre", "post", "filename", "lvl", "plvl", "lst", "floor", "msk_1", "prev", "head", "bs1_1", "ceil", "bs2_1", "hsh", "lc_1", "wi", "hv", "imod", "pimod", "rem", "ch_1", "dif", "maxn", "min", "maxd", "ml", "nl", "mmd", "md", "ti", "lin", "din", "level", "mem", "log", "fn", "mtime", "Date", "now", "charCodeAt", "SUPPORTS_REQUEST", "XMLHttpRequest", "fetch", "CONTENT_TYPE_PLAIN", "nativeAsyncGzipDisabled", "extendURLParams", "url", "params", "replace", "_search$split$map", "baseUrl", "search", "split", "newParams", "_extends", "updatedSearch", "map", "pair", "_newParams$key", "key", "origValue", "value", "remaining", "formdata", "arg_separator", "use_val", "use_key", "tph_arr", "each", "val", "isUndefined", "encodeURIComponent", "File", "name", "toString", "join", "jsonStringify", "space", "JSON", "stringify", "_", "encodePostData", "options", "_encodedBody", "compression", "gzipData", "str", "latin1", "TextEncoder", "encode", "ar", "ai", "contentType", "body", "buffer", "byteOffset", "byteLength", "estimatedSize", "b64data", "btoa", "p1", "String", "fromCharCode", "parseInt", "encodedBody", "Blob", "size", "jsonBody", "preEncodeAsync", "_ref", "_asyncToGenerator", "jsonData", "compressed", "_x", "_x2", "_x3", "_gzipCompress", "apply", "this", "arguments", "Config", "DEBUG", "rethrow", "arrayBuffer", "buildRequestURL", "getTime", "ver", "JS_SDK_VERSION", "AVAILABLE_TRANSPORTS", "transport", "method", "_encodePostData2", "_aborter", "headers", "Headers", "headerValue", "headerName", "append", "aborter", "AbortController", "controller", "signal", "timeout", "setTimeout", "abort", "keepalive", "SIXTY_FOUR_KILOBYTES", "fetchOptions", "then", "response", "text", "responseText", "res", "statusCode", "status", "json", "parse", "logger", "error", "callback", "catch", "finally", "clearTimeout", "_encodePostData", "req", "open", "setRequestHeader", "disableXHRCredentials", "withCredentials", "onreadystatechange", "readyState", "_unused", "send", "navigator", "sendBeacon", "beacon", "_encodePostData3", "sendBeaconBody", "type", "_unused2", "DEFAULT_FLUSH_INTERVAL_MS", "RequestQueue", "constructor", "sendRequest", "config", "_isPaused", "_queue", "_flushTimeoutMs", "clampToRange", "flush_interval_ms", "createLogger", "_sendRequest", "enqueue", "_flushTimeout", "_setFlushTimeout", "unload", "_clearFlushTimeout", "requests", "_formatQueue", "requestValues", "Object", "values", "filter", "indexOf", "enable", "_this", "_loop", "isArray", "abs", "request", "_requests$key$data", "batchKey", "nn", "RetryQueue", "_instance", "_isPolling", "_pollIntervalMs", "_areWeOnline", "window", "onLine", "_onlineListener", "_flush", "_offlineListener", "addEventListener", "retriableRequest", "retriesPerformedSoFar", "_objectWithoutPropertiesLoose", "_excluded", "isPositiveNumber", "retry_count", "_send_request", "_enqueue", "requestOptions", "msToNextRetry", "rawBackoffTime", "pow", "minBackoff", "cappedBackoffTime", "jitterFraction", "random", "retryAt", "logMessage", "warn", "_poll", "_poller", "notToFlush", "toFlush", "item", "removeEventListener", "ScrollManager", "_updateScrollData", "_this$_context$maxScr", "_this$_context$maxScr2", "_this$_context$maxCon", "_this$_context$maxCon2", "_context", "el", "scrollElement", "scrollY", "scrollHeight", "clientHeight", "contentY", "contentHeight", "lastScrollY", "maxScrollY", "maxScrollHeight", "lastContentY", "maxContentY", "maxContentHeight", "_scrollRoot", "scroll_root_selector", "getContext", "resetContext", "ctx", "startMeasuringScrollPosition", "capture", "document", "documentElement", "selectors", "selector", "element", "querySelector", "scrollTop", "pageYOffset", "scrollX", "scrollLeft", "pageXOffset", "generateSessionSourceParams", "posthog", "getPersonInfo", "mask_personal_data_properties", "custom_personal_data_properties", "SessionPropsManager", "instance", "sessionIdManager", "persistence", "sessionSourceParamGenerator", "_onSessionIdCallback", "sessionId", "stored", "_getStored", "newProps", "props", "_sessionSourceParamGenerator", "_persistence", "register", "CLIENT_SESSION_PROPS", "_sessionIdManager", "onSessionId", "getSetOnceProps", "_this$_getStored", "getPersonPropsFromInfo", "$referring_domain", "referringDomain", "$pathname", "initialPathName", "utm_source", "utm_campaign", "utm_medium", "utm_content", "utm_term", "getSessionProps", "stripEmptyProperties", "stripLeadingDollar", "SimpleEventEmitter", "_events", "on", "event", "listener", "emit", "payload", "SessionIdManager", "handler", "_eventEmitter", "sessionIdGenerator", "windowIdGenerator", "_this$_config$bootstr", "_sessionIdChangedHandlers", "_beforeUnloadListener", "_sessionHasBeenIdleTooLong", "timestamp", "lastActivityTimestamp", "sessionTimeoutMs", "Error", "cookieless_mode", "COOKIELESS_ALWAYS", "_config", "_windowId", "_sessionId", "_sessionStartTimestamp", "_sessionActivityTimestamp", "_sessionIdGenerator", "uuidv7", "_windowIdGenerator", "persistenceName", "_sessionTimeoutMs", "$configured_session_timeout_ms", "_resetIdleTimer", "_window_id_storage_key", "_primary_window_exists_storage_key", "_canUseSessionStorage", "lastWindowId", "sessionStore", "_parse", "primaryWindowExists", "_remove", "_set", "bootstrap", "sessionID", "sessionStartTimestamp", "uuid", "hex", "substring", "uuid7ToTimestampMs", "_setSessionId", "_listenToReloadWindow", "h", "_disabled", "_is_supported", "_setWindowId", "windowId", "_getWindowId", "sessionActivityTimestamp", "SESSION_ID", "_getSessionId", "sessionIdInfo", "resetSessionId", "destroy", "_enforceIdleTimeout", "DOM_EVENT_BEFOREUNLOAD", "checkAndGetSessionAndWindowId", "readOnly", "_timestamp", "startTimestamp", "sessionPastMaximumLength", "valuesChanged", "noSessionId", "activityTimeout", "info", "changeReason", "newActivityTimestamp", "forEach", "undefined", "idleSessionId", "isLikelyBot", "customBlockedUserAgents", "ua", "userAgent", "isBlockedUACore", "uaData", "userAgentData", "brands", "some", "brandObj", "brand", "webdriver", "isMatchingRegex", "pattern", "RegExp", "test", "getPersonPropertiesHash", "distinct_id", "userPropertiesToSet", "userPropertiesToSetOnce", "propertyComparisons", "exact", "targets", "target", "is_not", "every", "regex", "not_regex", "icontains", "toLowerCase", "includes", "not_icontains", "gt", "numValue", "parseFloat", "isNaN", "lt", "matchPropertyFilters", "propertyFilters", "eventProperties", "entries", "propertyName", "eventPropertyValue", "isNull", "eventValues", "comparisonFunction", "operator", "RequestRouterRegion", "ingestionDomain", "staticAssetPath", "RequestRouter", "_regionCache", "apiHost", "host", "api_host", "trim", "flagsApiHost", "customHost", "flags_api_host", "uiHost", "_this$instance$config", "ui_host", "region", "_staticAssetHostOverride", "path", "override", "__preview_external_dependency_versioned_paths", "endpointFor", "assetHostOverride", "suffix", "SURVEY_LOGGER", "SURVEY_SEEN_PREFIX", "IN_APP_SURVEY_TYPES", "SurveyType", "Popover", "Widget", "API", "DEFAULT_DISPLAY_SURVEY_OPTIONS", "ignoreConditions", "ignoreDelay", "displayType", "DisplaySurveyType", "MAPPED_INTEGRATIONS", "intercom", "crispChat", "ExternalIntegrations", "_loadScript", "cb", "_assignableWindow$__P", "assignableWindow", "__PosthogExtensions__", "loadExternalDependency", "err", "startIfEnabledOrStop", "_assignableWindow$__P2", "_assignableWindow$__P4", "_assignableWindow$__P5", "integrations", "_assignableWindow$__P3", "stop", "_this$_instance$confi", "noop", "instances", "_executeArrayDepth", "__NOOP", "CONSENT_COOKIELESS_WARN", "SURVEYS_NOT_AVAILABLE", "SANITIZE_DEPRECATED", "DENYLIST_INVALID", "PRIMARY_INSTANCE_NAME", "ENQUEUE_REQUESTS", "defaultConfig", "defaults", "_window$location", "token", "autocapture", "cross_subdomain_cookie", "isCrossDomainCookie", "location", "persistence_name", "cookie_persisted_properties", "loaded", "save_campaign_params", "custom_campaign_params", "custom_blocked_useragents", "save_referrer", "capture_pageleave", "__preview_deferred_init_extensions", "debug", "isString", "cookie_expiration", "upgrade", "disable_session_recording", "disable_persistence", "disable_web_experiments", "disable_surveys", "disable_surveys_automatic_display", "disable_conversations", "disable_product_tours", "disable_external_dependency_loading", "enable_recording_console_log", "secure_cookie", "protocol", "ip", "opt_out_capturing_by_default", "opt_out_persistence_by_default", "opt_out_useragent_filter", "opt_out_capturing_persistence_type", "consent_persistence_name", "opt_out_capturing_cookie_prefix", "opt_in_site_apps", "property_denylist", "respect_dnt", "sanitize_properties", "request_headers", "request_batching", "properties_string_max_length", "mask_all_element_attributes", "mask_all_text", "advanced_disable_flags", "advanced_disable_decide", "advanced_disable_feature_flags", "advanced_disable_feature_flags_on_first_load", "advanced_only_evaluate_survey_feature_flags", "advanced_feature_flags_dedup_per_session", "advanced_enable_surveys", "advanced_disable_toolbar_metrics", "feature_flag_request_timeout_ms", "surveys_request_timeout_ms", "on_request_error", "get_device_id", "capture_performance", "disable_compression", "session_idle_timeout_seconds", "person_profiles", "PERSON_PROFILES_IDENTIFIED_ONLY", "before_send", "request_queue_config", "error_tracking", "_onCapture", "__preview_eager_load_replay", "rageclick", "content_ignorelist", "capture_pageview", "session_recording", "strictMinimumDuration", "external_scripts_inject_target", "internal_or_test_user_hostname", "CONFIG_RENAMES", "configRenames", "origConfig", "renames", "oldKey", "newKey", "newConfig", "extend", "property_blacklist", "DeprecatedWebPerformanceObserver", "__forceAllowLocalhost", "_forceAllowLocalhost", "PostHog", "_replaceExtension", "oldExt", "newExt", "idx", "_extensions", "splice", "initialize", "_inCookielessMode", "COOKIELESS_ON_REJECT", "consent", "isRejected", "decideEndpointWasHit", "_this$featureFlags$ha", "_this$featureFlags", "featureFlags", "hasLoadedFlags", "flagsEndpointWasHit", "_this$featureFlags$ha2", "_this$featureFlags2", "_PostHog$__defaultExt", "webPerformance", "_personProcessingSetOncePropertiesSent", "version", "LIB_VERSION", "_internalEventEmitter", "_calculate_event_properties", "calculateEventProperties", "bind", "SentryIntegration", "sentryIntegration", "_posthog", "processor", "createEventProcessor", "NAME", "processEvent", "__request_queue", "__loaded", "analyticsDefaultEndpoint", "_initialPageviewCaptured", "_visibilityStateListener", "_initialPersonProfilesConfig", "_cachedPersonProperties", "scrollManager", "pageViewManager", "PageViewManager", "rateLimiter", "RateLimiter", "requestRouter", "ConsentManager", "externalIntegrations", "ext", "__defaultExtensionClasses", "toolbar", "surveys", "conversations", "logs", "experiments", "exceptions", "people", "prop", "to", "setProps", "setPersonProperties", "set_once", "init", "_instances$name", "namedPosthog", "_init", "_config$bootstrap", "_config$bootstrap2", "isEmptyString", "critical", "console", "_checkLocalStorageForDebug", "_originalUserConfig", "_triggered_notifs", "process_person", "set_config", "on_xhr_error", "persistenceDisabled", "_is_persistence_disabled", "PostHogPersistence", "sessionPersistence", "initialPersistenceProps", "initialSessionProps", "$initialization_time", "toISOString", "_requestQueue", "_send_retriable_request", "_retryQueue", "startInCookielessMode", "sessionManager", "sessionPropsManager", "_initExtensions", "thisC", "identity_distinct_id", "distinctID", "isIdentifiedID", "bootstrapDistinctId", "existingDistinctId", "get_distinct_id", "existingUserState", "get_property", "USER_STATE", "USER_STATE_ANONYMOUS", "identify", "USER_STATE_IDENTIFIED", "deviceID", "set_property", "$device_id", "register_once", "COOKIELESS_SENTINEL_VALUE", "self", "_handle_unload", "passive", "segment", "done", "bootstrapUser", "user", "getSegmentAnonymousId", "anonymousId", "id", "segmentUser", "isFunction", "Promise", "resolve", "enrichEvent", "eventName", "userId", "reset", "additionalProperties", "properties", "assign", "isLoaded", "load", "track", "page", "EVENT_PAGEVIEW", "EVENT_IDENTIFY", "screen", "_loaded", "_this$featureFlags3", "_this$exceptions", "_this$surveys", "_this$logs", "_this$conversations", "_this$toolbar", "_this$experiments", "initStartTime", "performance", "__extensionClasses", "initTasks", "historyAutocapture", "tracingHeaders", "siteApps", "sessionRecording", "disable_scroll_properties", "productTours", "heatmaps", "webVitalsAutocapture", "exceptionObserver", "deadClicksAutocapture", "isDeadClicksEnabledForAutocapture", "extension", "_pendingRemoteConfig", "_onRemoteConfig", "_processInitTaskQueue", "queue", "task", "shift", "taskInitTiming", "round", "register_for_session", "SDK_DEBUG_EXTENSIONS_INIT_METHOD", "SDK_DEBUG_EXTENSIONS_INIT_TIME_MS", "_config$analytics", "_lastRemoteConfig", "supportedCompression", "analytics", "endpoint", "onRemoteConfig", "_start_queue_if_opted_in", "hostname", "setInternalOrTestUser", "isOptedIn", "_captureInitialPageview", "_remoteConfigLoader", "RemoteConfigLoader", "_this$_requestQueue", "is_capturing", "_dom_loaded", "eachArray", "_this$surveys2", "_this$logs2", "_this$_requestQueue2", "_this$_retryQueue", "handlePageUnload", "_shouldCapturePageleave", "EVENT_PAGELEAVE", "flushLogs", "isServerRateLimited", "api_transport", "__preview_disable_xhr_credentials", "__preview_disable_beacon", "disableTransport", "fetch_options", "_options", "_options$transport", "_find$method", "_find", "availableTransports", "transportMethod", "predicate", "CompressionStream", "encodedOptions", "_this$config$on_reque", "_this$config", "checkForLimiting", "call", "_execute_array", "array", "fn_name", "alias_calls", "other_calls", "capturing_calls", "execute", "calls", "thisArg", "caller", "prototype", "event_name", "_options$_url", "maxStringLength", "customizer", "COPY_IN_PROGRESS_SET", "isBot", "_is_bot", "__preview_capture_bot_pageviews", "clientRateLimitContext", "skip_client_rate_limiting", "isRateLimited", "$current_url", "_originatedFromCaptureException", "update_search_keyword", "update_campaign_params", "update_referrer_info", "set_initial_person_info", "systemTime", "$browser_type", "remainingTokens", "$set", "survey", "action", "surveyProperty", "setOnceProperties", "_calculate_set_once_properties", "$set_once", "EVENT_GROUPIDENTIFY", "_noTruncate", "Set", "internalDeepCircularCopy", "has", "add", "result", "SurveyEventName", "DISMISSED", "SENT", "surveyId", "SurveyEventProperties", "SURVEY_ID", "surveyIteration", "SURVEY_ITERATION", "surveySeenKey", "getSurveyStorageKey", "prefix", "current_iteration", "localStorage", "getItem", "setItem", "SHOWN", "SURVEY_LAST_SEEN_DATE", "ProductTourEventName", "tourType", "ProductTourEventProperties", "TOUR_TYPE", "TOUR_LAST_SEEN_DATE", "finalSet", "isEmptyObject", "setPersonPropertiesForFlags", "isNullish", "beforeSendResult", "_runBeforeSend", "_url", "_batchKey", "send_instantly", "uninitializedWarning", "_addCaptureHook", "remove_event_timer", "persistenceProps", "isNumber", "pageviewProperties", "infoProperties", "maskPersonalDataProperties", "customPersonalDataProperties", "_navigator", "_navigator2", "_window$screen", "_window$screen2", "lang", "user_agent", "_options$maxTouchPoin", "_options$screenWidth", "_options$screenHeight", "_options$devicePixelR", "device", "paramsToMask", "PERSONAL_DATA_CAMPAIGN_PARAMS", "os_name", "os_version", "osMatchers", "rgex", "resultOrFn", "match", "exec", "$os", "$os_version", "$browser", "detectBrowser", "vendor", "$device", "detectDevice", "$device_type", "userAgentDataPlatform", "platform", "maxTouchPoints", "screenWidth", "width", "screenHeight", "height", "devicePixelRatio", "IPAD", "ANDROID_TABLET", "GENERIC_TABLET", "TABLET", "NINTENDO", "XBOX", "PLAYSTATION", "OUYA", "APPLE_WATCH", "MOBILE", "$timezone", "getTimezone", "$timezone_offset", "getTimezoneOffset", "maskQueryParams", "href", "MASKED", "$host", "pathname", "$raw_user_agent", "$browser_version", "detectBrowserVersion", "$browser_language", "getBrowserLanguage", "$browser_language_prefix", "$screen_height", "$screen_width", "$viewport_height", "innerHeight", "$viewport_width", "innerWidth", "$lib", "LIB_NAME", "$lib_version", "$insert_id", "$time", "_this$_retryQueue2", "sdkDebugProperties", "doEvent", "doPageLeave", "doPageView", "title", "duration_in_ms", "toFixed", "_isIdentified", "denylisted_prop", "hasPersonProcessing", "_hasPersonProcessing", "_requirePersonProcessing", "dataSetOnce", "markAsSent", "forceIncludeInitialProps", "_this$sessionPropsMan", "initialProps", "get_initial_props", "sessionProps", "days", "_this$persistence", "default_value", "_this$persistence2", "_this$sessionPersiste", "unregister", "property", "_this$persistence3", "unregister_for_session", "_this$sessionPersiste2", "_register_single", "getFeatureFlag", "_this$featureFlags4", "getFeatureFlagPayload", "_this$featureFlags5", "getFeatureFlagResult", "_this$featureFlags6", "isFeatureEnabled", "_this$featureFlags7", "reloadFeatureFlags", "_this$featureFlags8", "updateFlags", "flags", "payloads", "_this$featureFlags9", "updateEarlyAccessFeatureEnrollment", "isEnrolled", "stage", "_this$featureFlags0", "getEarlyAccessFeatures", "force_reload", "stages", "_this$featureFlags1", "onFeatureFlags", "errorsLoading", "onSurveysLoaded", "_this$sessionManager$", "_this$sessionManager", "getSurveys", "forceReload", "getActiveMatchingSurveys", "renderSurvey", "_this$surveys3", "displaySurvey", "_this$surveys4", "cancelPendingSurvey", "_this$surveys5", "canRenderSurvey", "_this$surveys$canRend", "_this$surveys6", "visible", "disabledReason", "canRenderSurveyAsync", "_this$surveys$canRend2", "_this$surveys7", "_validateIdentifyId", "new_distinct_id", "previous_distinct_id", "$user_id", "DEVICE_ID", "$had_persisted_distinct_id", "ALIAS_ID_KEY", "_this$featureFlags10", "isKnownAnonymous", "$anon_distinct_id", "setAnonymousDistinctId", "FLAG_CALL_REPORTED", "hash", "group", "groupType", "groupKey", "groupPropertiesToSet", "existingGroups", "getGroups", "isNewGroup", "resetGroupPropertiesForFlags", "$groups", "groupIdentifyProperties", "$group_type", "$group_key", "$group_set", "setGroupPropertiesForFlags", "resetGroups", "_this$featureFlags11", "resetPersonPropertiesForFlags", "_this$featureFlags12", "_this$featureFlags13", "group_type", "_this$featureFlags14", "reset_device_id", "_this$persistence4", "_this$sessionPersiste3", "_this$surveys8", "_this$_remoteConfigLo", "_this$featureFlags15", "_this$conversations2", "_this$persistence5", "_this$sessionManager2", "device_id", "clear", "$last_posthog_reset", "identity_hash", "setIdentity", "distinctId", "_this$conversations3", "alias", "_onIdentityChanged", "clearIdentity", "_this$conversations4", "_onIdentityCleared", "get_session_id", "_this$sessionManager$2", "_this$sessionManager3", "get_session_replay_url", "withTimestamp", "_options$timestampLoo", "LOOK_BACK", "timestampLookBack", "original", "PEOPLE_DISTINCT_ID_KEY", "oldConfig", "isObject", "_this$persistence6", "_this$exceptionObserv", "_this$exceptions2", "_this$sessionRecordin", "_this$autocapture", "_this$heatmaps", "_this$exceptionObserv2", "_this$deadClicksAutoc", "_this$surveys9", "_this$externalIntegra", "isPersistenceDisabled", "update_config", "debugConfigFromLocalStorage", "isBoolean", "localStore", "onConfigChange", "startIfEnabled", "loadIfEnabled", "_sync_opt_out_with_persistence", "_overrideSDKInfo", "sdkName", "sdkVersion", "startSessionRecording", "_this$sessionManager4", "_this$sessionRecordin2", "_this$sessionRecordin3", "_this$sessionRecordin4", "_this$sessionRecordin5", "overrideAll", "overrideConfig", "sampling", "linked_flag", "url_trigger", "event_trigger", "Boolean", "overrideSampling", "overrideLinkedFlag", "overrideTrigger", "stopSessionRecording", "sessionRecordingStarted", "_this$sessionRecordin6", "started", "captureException", "syntheticException", "errorToProperties", "buildProperties", "handled", "sendExceptionEvent", "addExceptionStep", "message", "_this$exceptions3", "captureLog", "_this$logs3", "_this$logs$logger", "_this$logs4", "_noopLogger", "startExceptionAutocapture", "capture_exceptions", "stopExceptionAutocapture", "loadToolbar", "_this$toolbar$loadToo", "_this$toolbar2", "property_name", "_this$persistence7", "getSessionProperty", "_this$sessionPersiste4", "_this$config$name", "_this$persistence8", "_this$sessionPersiste5", "_this$persistence9", "_this$persistence0", "ENABLE_PERSON_PROCESSING", "createPersonProfile", "$internal_or_test_user", "function_name", "isOptedOut", "_this$persistence1", "_this$sessionPersiste6", "_this$persistence10", "_this$sessionPersiste7", "set_disabled", "opt_in_capturing", "_this$sessionRecordin8", "_this$sessionManager5", "_this$pageViewManager", "_this$config$__extens", "_this$config$__extens2", "_PostHog$__defaultExt2", "_this$sessionRecordin7", "SessionRecordingClass", "_this$surveys0", "_options$captureEvent", "optInOut", "captureEventName", "captureProperties", "opt_out_capturing", "_this$sessionManager6", "_this$pageViewManager2", "_this$sessionRecordin9", "stopRecording", "has_opted_in_capturing", "has_opted_out_capturing", "get_explicit_consent_status", "clear_opt_in_out_capturing", "visibilityState", "DOM_EVENT_VISIBILITYCHANGE", "_shouldDisableFlags", "newField", "oldField", "loggerInstance", "hasNewField", "hasOldField", "originalConfig", "fns", "isKnownUnsafeEditableEvent", "getPageViewId", "_this$pageViewManager3", "_currentPageview", "pageViewId", "captureTraceFeedback", "traceId", "userFeedback", "$ai_trace_id", "$ai_feedback_text", "captureTraceMetric", "metricName", "metricValue", "$ai_metric_name", "$ai_metric_value", "debugConfig", "explicitlyFalse", "isTrueInLocalStorage", "_get", "trace", "fatal", "klass", "functions", "safewrap", "NODE_TYPE_ELEMENT", "NODE_TYPE_TEXT", "NODE_TYPE_DOCUMENT_FRAGMENT", "isElementInToolbar", "Element", "TOOLBAR_ID", "closest", "isElementNode", "nodeType", "isTag", "tag", "tagName", "isTextNode", "isShadowRoot", "splitClassString", "checkForURLMatches", "urlsList", "getClassNames", "className", "baseVal", "getAttribute", "makeSafeText", "shouldCaptureValue", "getSafeText", "elText", "shouldCaptureElement", "isSensitiveElement", "childNodes", "child", "_makeSafeText", "textContent", "getEventTarget", "srcElement", "_e$target", "shadowRoot", "composedPath", "autocaptureCompatibleElements", "checkIfElementsMatchCSSSelector", "elements", "selectorList", "_ret2", "_loop2", "matches", "getParentElement", "curEl", "parentNode", "DEFAULT_CONTENT_IGNORELIST", "DEFAULT_RAGE_CLICK_IGNORE_LIST", "cannotCheckForAutocapture", "getElementAndParentsForElement", "captureOnAnyElement", "parentIsUsefulElement", "targetElementList", "compStyles", "getComputedStyle", "getPropertyValue", "classes", "coreCCPattern", "anchoredCCRegex", "unanchoredCCRegex", "coreSSNPattern", "anchoredSSNRegex", "unanchoredSSNRegex", "anchorRegexes", "getDirectAndNestedSpanText", "getNestedSpanText", "_child$tagName", "spanText", "escapeQuotes", "input", "extractAttrClass", "attr_class", "RageClick", "rageclickConfig", "disabled", "conf", "thresholdPx", "threshold_px", "timeoutMs", "timeout_ms", "clickCount", "click_count", "clicks", "isRageClick", "y", "lastClick", "COPY_AUTOCAPTURE_EVENT", "limitText", "previousElementSibling", "_el", "previousSibling", "autocapturePropertiesForElement", "_elementsJson$", "_elementsJson$2", "maskAllElementAttributes", "maskAllText", "elementAttributeIgnoreList", "elementsChainAsString", "externalHref", "elementsJson", "autocaptureAugmentProperties", "explicitNoCapture", "shouldCaptureEl", "hrefAttr", "elem", "maskAllAttributes", "maskText", "elementAttributeIgnorelist", "tag_name", "attributes", "attr", "attributeName", "nthChild", "nthOfType", "currentElem", "augmentProperties", "propertyKey", "propertyValue", "_convertToURL", "hrefHost", "convertToURL", "locationHost", "$event_type", "$ce_version", "$elements", "$elements_chain", "_element$nth_child", "_element$nth_of_type", "el_string", "single_class", "nth_child", "nth_of_type", "attr_id", "sortedAttributes", "_ref2", "_ref3", "localeCompare", "_ref4", "_ref5", "_el$$el_text", "_el$attr__href", "_ref6", "_ref7", "$el_text", "$external_click_url", "patch", "source", "replacement", "wrapped", "defineProperties", "__posthog_wrapped__", "enumerable", "FIFTEEN_MINUTES_IN_MILLIS", "DISABLED", "LAZY_LOADING", "AWAITING_CONFIG", "MISSING_CONFIG", "LOGGER_PREFIX", "isValidMouseEvent", "clientX", "clientY", "Wo", "APP_INIT_ERROR", "matchString", "matching", "likePattern", "ActionMatcher", "_debugEventEmitter", "_checkStep", "step", "_checkStepEvent", "_checkStepUrl", "_checkStepElement", "_checkStepProperties", "_actionEvents", "_actionRegistry", "_this$_instance", "_this$_instance2", "matchEventToAction", "eventPayload", "actions", "_this$_instance3", "_this$_instance4", "_this$_actionRegistry", "_action$steps", "steps", "_this$_actionEvents", "_this$_instance5", "selectorsToWatch", "_action$steps2", "setElementSelectors", "_this$_actionRegistry2", "_checkAction", "_addActionHook", "onAction", "_event$properties", "eventUrl", "url_matching", "_checkStepHref", "_checkStepText", "_checkStepSelector", "_event$properties2", "_getElementsList", "href_matching", "chain", "_event$properties3", "text_matching", "texts", "elementsChain", "_event$properties4", "_event$properties5", "elementSelectors", "$element_selectors", "selector_regex", "_event$properties6", "reduce", "acc", "EventReceiver", "_eventToItems", "Map", "_cancelEventToItems", "_actionToItems", "_doesEventMatchFilter", "eventConfig", "_buildEventToItemMap", "items", "conditionField", "_item$conditions", "conditions", "existing", "get", "_getMatchingItems", "itemIds", "SurveyEventType", "Activation", "_getItems", "allItems", "_item$conditions2", "find", "_setupEventBasedItems", "_setupActionBasedItems", "actionBasedItems", "_item$conditions3", "_item$conditions4", "_actionMatcher", "actionName", "_item$conditions5", "_item$conditions6", "_item$conditions7", "_this$_actionMatcher", "_item$conditions8", "knownItems", "eventBasedItems", "_item$conditions9", "_item$conditions0", "events", "itemsWithCancelEvents", "_item$conditions1", "_item$conditions10", "cancelEvents", "matchEventToItem", "onEvent", "Cancellation", "_getLogger", "activatedKey", "_getActivatedKey", "shownEventName", "_getShownEventName", "existingActivatedItems", "_eventPayload$propert", "_eventPayload$propert2", "itemId", "$survey_id", "$product_tour_id", "index", "_updateActivatedItems", "itemsToCancel", "_cancelPendingItem", "matchedItems", "concat", "activatedItems", "eligibleItems", "_isItemPermanentlyIneligible", "_setActivatedItems", "getActivatedIds", "getEventToItemsMap", "_getActionMatcher", "SurveyEventReceiver", "super", "SURVEYS_ACTIVATED", "getEventToSurveys", "SURVEY_NOT_LOADED", "SURVEY_DISABLED", "STATE_FROM_WINDOW", "_getHashParam", "LOCALSTORAGE_KEY", "forceDebugLogger", "debugEnabled", "FLAG_TIMEOUT_MSG", "arrayToFlagsRecord", "flagsObj", "filterActiveFeatureFlags", "activeFeatureFlags", "BOT_REFUSE_MSG", "webExperimentUrlValidationMap", "conditionsUrl", "WebExperiments", "getWebExperimentsAndEvaluateDisplayLogic", "getWebExperiments", "webExperiments", "_logInfo", "_flagToExperiments", "webExperiment", "feature_flag_key", "_this$_flagToExperime", "selectedVariant", "variants", "_applyTransforms", "transforms", "variant", "testVariant", "_matchesTestVariant", "previewWebExperiment", "flag", "_this$_flagToExperime2", "_this$_flagToExperime3", "getWindowLocation", "experimentID", "getQueryParam", "_showPreviewWebExperiment", "previewing", "existingWebExperiments", "previewExperiments", "exp", "_matchUrlConditions", "_matchUTMConditions", "_testVariant$conditio", "_testVariant$conditio2", "_testVariant$conditio3", "_testVariant$conditio4", "urlMatchType", "_testVariant$conditio5", "utm", "campaignParams", "getCampaignParams", "_testVariant$conditio6", "_testVariant$conditio7", "_testVariant$conditio8", "_testVariant$conditio9", "_testVariant$conditio0", "_testVariant$conditio1", "_testVariant$conditio10", "_testVariant$conditio11", "utmCampaignMatched", "utmSourceMatched", "utmMediumMatched", "utmTermMatched", "msg", "_len", "args", "Array", "_key", "experiment", "transform", "_document", "querySelectorAll", "htmlElement", "html", "innerHTML", "css", "setAttribute", "NOT_AVAILABLE", "FeatureFlagsExtensions", "_override_warning", "_hasLoadedFlags", "_requestInFlight", "_reloadingDisabled", "_additionalReloadRequested", "_flagsLoadedFromRemote", "_hasLoggedDeprecationWarning", "_staleCacheRefreshTriggered", "featureFlagEventHandlers", "_prop", "_isCacheStale", "_this$_persistence$_i", "_this$_persistence", "_isFeatureFlagCacheStale", "feature_flag_cache_ttl_ms", "_checkAndTriggerStaleRefresh", "_getValidEvaluationEnvironments", "_this$_config$evaluat", "envs", "evaluation_contexts", "evaluation_environments", "env", "isValid", "_shouldIncludeEvaluationEnvironments", "_config$bootstrap$fea", "bootstrapFlags", "keys", "_config$bootstrap$fea2", "bootstrapPayloads", "featureFlagPayloads", "activeFlags", "receivedFeatureFlags", "existingFlags", "merge", "getFlagVariants", "existingPayloads", "getFlagPayloads", "finalFlags", "finalPayloads", "flagDetails", "isVariant", "enabled", "reason", "metadata", "description", "getFlags", "getFlagsWithDetails", "PERSISTENCE_FEATURE_FLAG_DETAILS", "overridenFlags", "PERSISTENCE_OVERRIDE_FEATURE_FLAGS", "overriddenPayloads", "PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS", "finalDetails", "overriddenKeys", "_originalDetail$enabl", "_originalDetail$metad", "originalDetail", "overrideFlagValue", "finalEnabled", "overrideVariant", "overridePayload", "overridenDetail", "original_enabled", "original_variant", "original_payload", "enabledFlags", "ENABLED_FEATURE_FLAGS", "overriddenFlags", "flagPayloads", "PERSISTENCE_FEATURE_FLAG_PAYLOADS", "_reloadDebouncer", "_callFlagsEndpoint", "_clearDebouncer", "ensureFlagsLoaded", "anon_distinct_id", "setReloadingPaused", "isPaused", "_this$_persistence2", "deviceId", "groups", "person_properties", "STORED_PERSON_PROPERTIES_KEY", "group_properties", "STORED_GROUP_PROPERTIES_KEY", "timezone", "disableFlags", "disable_flags", "_response$json", "_response$json2", "_this$_persistence3", "flagErrors", "errorsWhileComputingFlags", "_response$json3", "isQuotaLimited", "quotaLimited", "PERSISTENCE_FEATURE_FLAG_ERRORS", "partialResponse", "_result$variant", "fresh", "getFeatureFlagDetails", "send_event", "flagVariants", "flagExists", "flagValue", "flagReportValue", "requestId", "PERSISTENCE_FEATURE_FLAG_REQUEST_ID", "evaluatedAt", "PERSISTENCE_FEATURE_FLAG_EVALUATED_AT", "flagCallReported", "_this$_persistence4", "currentSessionId", "storedSessionId", "FLAG_CALL_REPORTED_SESSION_ID", "_this$_persistence5", "_this$_prop", "_this$_config$bootstr2", "_flagDetails$metadata", "_flagDetails$reason$d", "_flagDetails$reason", "_flagDetails$reason2", "_flagDetails$metadata2", "_flagDetails$metadata3", "errors", "$feature_flag", "$feature_flag_response", "$feature_flag_payload", "$feature_flag_request_id", "$feature_flag_evaluated_at", "$feature_flag_bootstrapped_response", "$feature_flag_bootstrapped_payload", "$used_bootstrap_value", "$feature_flag_version", "_flagDetails$metadata4", "code", "$feature_flag_reason", "$feature_flag_id", "$feature_flag_original_response", "$feature_flag_original_payload", "$feature_flag_error", "parsedPayload", "getRemoteConfigPayload", "_response$json4", "addFeatureFlagsHandler", "removeFeatureFlagsHandler", "currentFlags", "currentFlagPayloads", "currentFlagDetails", "normalizedResponse", "fromEntries", "_flagDetails$flag$var", "_flagDetails$flag$met", "_flagDetails$flag$met2", "$enabled_feature_flags", "PERSISTENCE_ACTIVE_FEATURE_FLAGS", "newFeatureFlags", "newFeatureFlagPayloads", "newFeatureFlagDetails", "successfulKeys", "_flagDetails$key", "failed", "_fireFeatureFlagsCallbacks", "suppressWarning", "overrideFeatureFlags", "overrideOptions", "_options$suppressWarn", "_prepareFeatureFlagsForCallbacks", "_this$_persistence6", "feature", "PERSISTENCE_EARLY_ACCESS_FEATURES", "flagKey", "enrollmentPersonProp", "$feature_enrollment", "newFlags", "existing_early_access_features", "stageParams", "_this$_persistence7", "_this$_persistence8", "earlyAccessFeatures", "variantKey", "existingProperties", "propsToSet", "propsToSetOnce", "setOnceProps", "hasOwnProperty", "SessionReplayExtensions", "_this$_lazyLoadedSess", "_lazyLoadedSessionRecording", "isStarted", "_this$_lazyLoadedSess2", "_this$_lazyLoadedSess3", "_recordingStatus", "_forceAllowLocalhostNetworkCapture", "_persistFlagsOnSessionListener", "_isRecordingEnabled", "_this$_instance$get_p", "enabled_server_side", "SESSION_RECORDING_REMOTE_CONFIG", "enabled_client_side", "isDisabled", "startReason", "_this$_lazyLoadedSess4", "canRunReplay", "from", "_lazyLoadAndStart", "rrweb", "record", "initSessionRecording", "_onScriptLoaded", "_scriptName", "_this$_persistFlagsOn", "_this$_lazyLoadedSess5", "_discardRecording", "_this$_persistFlagsOn2", "_this$_lazyLoadedSess6", "discard", "_resetSampling", "SESSION_RECORDING_IS_SAMPLED", "_validateSampleRate", "rate", "parsed", "Number", "isFinite", "_persistRemoteConfig", "_this$_persistFlagsOn3", "_this$_instance$sessi", "persistResponse", "_this$_config$session", "sessionRecordingConfigResponse", "localSampleRate", "sampleRate", "remoteSampleRate", "parsedSampleRate", "receivedMinimumDuration", "minimumDurationMilliseconds", "cache_timestamp", "networkPayloadCapture", "capturePerformance", "canvasRecording", "recordCanvas", "fps", "canvasFps", "quality", "canvasQuality", "triggerMatchType", "masking", "urlTriggers", "triggerGroups", "_this$_lazyLoadedSess7", "_remoteConfig$scriptC", "remoteConfig", "scriptConfig", "script", "_isRemoteConfigFresh", "_config$cache_timesta", "persistedConfig", "cacheTimestamp", "ONE_MINUTE", "SDK_DEBUG_RECORDING_SCRIPT_NOT_LOADED", "onRRwebEmit", "rawEvent", "_this$_lazyLoadedSess8", "_this$_lazyLoadedSess9", "SESSION_RECORDING_OVERRIDE_LINKED_FLAG", "_this$_lazyLoadedSess0", "SESSION_RECORDING_OVERRIDE_SAMPLING", "triggerType", "_this$_lazyLoadedSess1", "SESSION_RECORDING_OVERRIDE_URL_TRIGGER", "SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER", "_this$_lazyLoadedSess10", "$recording_status", "tryAddCustomEvent", "_this$_lazyLoadedSess11", "AnalyticsExtensions", "_initialized", "_isDisabledServerSide", "_elementsChainAsString", "rageclicks", "_elementSelectors", "_config$url_allowlist", "_config$url_ignorelis", "url_allowlist", "url_ignorelist", "_addDomEventHandlers", "isBrowserSupported", "_captureEvent", "capture_copied_text", "copiedTextHandler", "isEnabled", "AUTOCAPTURE_DISABLED_SERVER_SIDE", "getElementSelectors", "_this$_elementSelecto", "matchedElements", "matchedElement", "_this$instance$persis", "_this$_isDisabledServ", "persistedServerDisabled", "disabledServer", "_this$rageclicks", "MouseEvent", "timeStamp", "selectorIgnoreList", "contentIgnorelist", "_config$css_selector_", "css_selector_ignorelist", "elementsWithText", "keywords", "safeText", "ariaLabel", "keyword", "_element$getAttribute", "isCopyAutocapture", "autocaptureConfig", "allowedEventTypes", "_autocaptureConfig", "_autocaptureConfig2", "_autocaptureConfig3", "_autocaptureConfig4", "dom_event_allowlist", "allowlist", "eventType", "element_allowlist", "_ret", "elementType", "css_selector_allowlist", "element_attribute_ignorelist", "_window$getSelection", "selectedContent", "getSelection", "clipType", "_lastPathname", "monitorHistoryChanges", "_popstateListener", "_window$history$pushS", "_window$history$repla", "history", "pushState", "originalPushState", "state", "_capturePageview", "replaceState", "originalReplaceState", "_setupPopstateListener", "navigationType", "_window$location2", "currentPathname", "navigation_type", "_enabledServerSide", "_flushInterval", "HEATMAPS_ENABLED_SERVER_SIDE", "flushIntervalMilliseconds", "flushInterval", "capture_heatmaps", "flush_interval_milliseconds", "enable_heatmaps", "_setupListeners", "_onVisibilityChange", "_this$_flushInterval", "clearInterval", "_removeListeners", "getAndClearBuffer", "optIn", "_buffer", "_onDeadClick", "click", "_onClick", "originalEvent", "setInterval", "_flushHandler", "_onClickHandler", "_onMouseMoveHandler", "_onMouseMove", "_deadClicksCapture", "DeadClicksAutocapture", "isDeadClicksEnabledForHeatmaps", "_onVisibilityChange_handler", "_this$_deadClicksCapt", "_mouseMoveTimeout", "_getProperties", "isFixedOrSticky", "breakOnElement", "position", "target_fixed", "_capture", "$heatmap_data", "_this$_instance$persi", "metrics", "firstMetricTimestamp", "_flushToCapture", "_delayedFlushTimer", "metric", "_addToBuffer", "sessionIds", "$currentUrl", "_currentURL", "_maxAllowedValue", "flushToCaptureTimeoutMs", "attribution", "interactionTargetElement", "$session_id", "$window_id", "allowedMetrics", "_startCapturing", "onLCP", "onCLS", "onFCP", "onINP", "posthogExtensions", "postHogWebVitalsCallbacks", "WEB_VITALS_ENABLED_SERVER_SIDE", "_perfConfig", "_this$_perfConfig", "_this$_instance$persi2", "clientConfigMetricAllowList", "web_vitals_allowed_metrics", "WEB_VITALS_ALLOWED_METRICS", "web_vitals_delayed_flush_ms", "useAttribution", "clientConfig", "web_vitals_attribution", "configured", "__web_vitals_max_value", "web_vitals", "webVitalsOptIn", "ErrorTrackingExtensions", "_this$_instance$confi2", "errorWrappingFunctions", "wrapOnError", "wrapUnhandledRejection", "wrapConsoleError", "_unwrapOnError", "capture_unhandled_errors", "_unwrapUnhandledRejection", "capture_unhandled_rejections", "_unwrapConsoleError", "capture_console_errors", "_stopCapturing", "_remoteEnabled", "EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE", "_rateLimiter", "BucketedRateLimiter", "refillRate", "__exceptionRateLimiterRefillRate", "bucketSize", "__exceptionRateLimiterBucketSize", "refillInterval", "_logger", "_requiredConfig", "providedConfig", "_this$_unwrapOnError", "_this$_unwrapUnhandle", "_this$_unwrapConsoleE", "autocaptureExceptions", "errorProperties", "_errorProperties$$exc", "_errorProperties$$exc2", "_this$_instance$excep", "exceptionType", "$exception_list", "consumeRateLimit", "exception", "_suppressionRules", "_errorPropertiesBuilder", "ErrorTracking", "parsers", "stack", "skipFirstLines", "frames", "lines", "line", "cleanedLine", "WEBPACK_ERROR_REGEXP", "parser", "frame", "localStack", "reverse", "arr", "function", "UNKNOWN_FUNCTION", "chromeStackLineParser", "geckoStackLineParser", "ERROR_TRACKING_SUPPRESSION_RULES", "_exceptionStepsConfig", "_getExceptionStepsConfig", "_exceptionStepsBuffer", "setConfig", "_response$errorTracki", "_response$errorTracki2", "_response$errorTracki3", "suppressionRules", "errorTracking", "captureExtensionExceptions", "ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS", "_captureExtensionExceptions", "buildFromUnknown", "mechanism", "userProperties", "_coerceExceptionStepProperties", "sanitizedProperties", "droppedKeys", "RESERVED_EXCEPTION_STEP_KEYS", "EXCEPTION_STEP_INTERNAL_FIELDS_MESSAGE", "EXCEPTION_STEP_INTERNAL_FIELDS_TIMESTAMP", "exceptionList", "_isExceptionList", "_matchesSuppressionRule", "_addDroppedExceptionStep", "_isExtensionException", "__capturePostHogExceptions", "_isPostHogException", "propertiesForExceptionCapture", "$exception_steps", "_addBufferedExceptionSteps", "exceptionSteps", "getAttachable", "exception_steps", "exceptionValues", "$exception_types", "$exception_values", "rule", "results", "_exceptionValues$v$ke", "compare", "flatMap", "_e$stacktrace$frames", "_e$stacktrace", "stacktrace", "startsWith", "_exception$stacktrace", "_exception$stacktrace2", "_lastFrame$filename$i", "_lastFrame$filename", "lastFrame", "candidate", "ProductToursExtensions", "_productTourManager", "_cachedTours", "PRODUCT_TOURS_ENABLED_SERVER_SIDE", "_instance$persistence", "_startProductTours", "generateProductTours", "getProductTours", "storedTours", "PRODUCT_TOURS", "tours", "product_tours", "getActiveProductTours", "showProductTour", "tourId", "_this$_productTourMan", "showTourById", "previewTour", "tour", "_this$_productTourMan2", "dismissProductTour", "_this$_productTourMan3", "dismissTour", "nextStep", "_this$_productTourMan4", "previousStep", "_this$_productTourMan5", "clearCache", "resetTour", "_this$_productTourMan6", "resetAllTours", "_this$_productTourMan7", "cancelPendingTour", "_this$_productTourMan8", "SiteAppsExtensions", "_bufferedInvocations", "apps", "_eventCollector", "_eventName", "globals", "globalsForEvent", "siteAppLoaders", "_assignableWindow$_PO", "_POSTHOG_REMOTE_CONFIG", "_stopBuffering", "_event$properties$$se", "_event$properties$$se2", "_event$properties$$el", "groupIds", "groupProperties", "elements_chain", "person", "setupSiteApp", "loader", "app", "processBufferedEvents", "_this$_stopBuffering", "errored", "processedBuffer", "hasInitReturned", "onLoaded", "success", "_setupSiteApps", "_onCapturedEvent", "_this$siteAppLoaders", "_this$_stopBuffering2", "_response$siteApps", "loadSiteApp", "TracingExtensions", "_restoreXHRPatch", "_restoreFetchPatch", "hostnames", "_getConfiguredHostnames", "tracingHeadersPatchFns", "_patchXHR", "_patchFetch", "addTracingHeaders", "__add_tracing_headers", "_this$_restoreXHRPatc", "_this$_restoreFetchPa", "SurveysExtensions", "_isSurveysEnabled", "_surveyManager", "_isInitializingSurveys", "_surveyCallbacks", "_getSurveysInFlightPromise", "_surveyEventReceiver", "isArrayResponse", "removeItem", "surveyKeys", "phExtensions", "isSurveysEnabled", "generateSurveys", "_completeSurveyInitialization", "_handleSurveyLoadError", "LOAD_EXT_NOT_FOUND", "generateSurveysFn", "_notifySurveyCallbacks", "resolvePromise", "existingSurveys", "SURVEYS", "context", "_this$_surveyEventRec", "eventOrActionBasedSurveys", "start_date", "end_date", "_survey$conditions", "_survey$conditions2", "_getSurveyById", "_surveys$find", "_checkSurveyEligibility", "eligible", "checkSurveyEligibility", "eligibility", "_surveys$find2", "_survey$appearance", "appearance", "surveyPopupDelaySeconds", "_survey$appearance2", "_this$_surveyManager", "_survey$appearance3", "surveyToDisplay", "initialResponses", "canRender", "Inline", "handlePopoverSurvey", "cancelSurvey", "_this$_surveyManager2", "ToolbarExtensions", "_setToolbarState", "_getToolbarState", "_assignableWindow$ph_", "maybeLoadToolbar", "isToolbarInstance", "toolbarParams", "stateHash", "trySafe", "atob", "decodeURIComponent", "userIntent", "_callLoadToolbar", "loadFn", "toolbarRunning", "getElementById", "disableToolbarMetrics", "apiURL", "instrument", "_loadEditor", "maybeLoadEditor", "ExperimentsExtensions", "ConversationsExtensions", "_isConversationsEnabled", "_conversationsManager", "_isInitializing", "_remoteConfig", "_this$_conversationsM", "initConversations", "_completeInitialization", "_handleLoadError", "initConversationsFn", "show", "hide", "isAvailable", "isVisible", "_this$_conversationsM2", "_this$_conversationsM3", "sendMessage", "userTraits", "newTicket", "getMessages", "ticketId", "after", "_this2", "markAsRead", "_this3", "getTickets", "_this4", "requestRestoreLink", "email", "_this5", "restoreFromToken", "restoreToken", "_this6", "restoreFromUrlToken", "_this7", "getCurrentTicketId", "_this$_conversationsM4", "_this$_conversationsM5", "getWidgetSessionId", "_this$_conversationsM6", "_this$_conversationsM7", "_this$_conversationsM8", "_this$_conversationsM9", "LogsExtensions", "_isLogsEnabled", "_isLoaded", "_logBuffer", "_intervalLogCount", "_intervalWindowStart", "_droppedWarned", "captureConsoleLogs", "_response$logs", "logCapture", "_phExtensions$logs", "initializeLogs", "_this$_instance$confi3", "_this$_instance$confi4", "_this$_instance$confi5", "_this$_instance$confi6", "_this$_instance$confi7", "flushIntervalMs", "maxLogsPerInterval", "sdkContext", "severityText", "number", "severityNumber", "OTLP_SEVERITY_MAP", "DEFAULT_OTLP_SEVERITY", "autoAttributes", "posthogDistinctId", "currentUrl", "screenName", "appState", "feature_flags", "mergedAttributes", "timeUnixNano", "observedTimeUnixNano", "stringValue", "toOtlpKeyValueList", "trace_id", "span_id", "spanId", "trace_flags", "_getSdkContext", "maxBufferSize", "_scheduleFlush", "_logger_instance", "logsConfig", "resourceAttributes", "serviceName", "environment", "serviceVersion", "logRecords", "scopeName", "scopeVersion", "resourceLogs", "resource", "scopeLogs", "scope", "_this$_instance$confi8", "_this$_instance$confi9", "_assignableWindow$loc", "AllExtensions", "posthogMain", "dom_loaded_handler", "inst", "add_dom_loaded_handler", "notfound_default", "Pa", "notifications_default", "isVisible", "duration", "ErrorRecord", "external_exports", "plan_default", "event", "form", "body", "entries", "key", "value", "response", "input", "path", "find", "obj", "keys", "x", "xs", "next", "posthog_default", "key", "Pa", "id", "price_default", "value", "includePence", "getCookie", "name", "part", "key", "rest", "SHOWN", "projecttags_default", "typed", "needle", "matches", "option", "known", "create", "step", "count", "options", "chosen", "tag", "url", "init", "response", "body", "radio_default", "value", "PickerFileSchema", "external_exports", "plain", "name", "fileTitle", "file", "fileDetail", "parts", "offered", "wanted", "matching", "files", "query", "words", "text", "word", "UploadSchema", "CreatedSchema", "csrfToken", "uploadFile", "upload", "body", "response", "made", "image", "uploadChosen", "event", "added", "input", "chosen", "uploadAll", "failures", "error", "reason", "KEEP", "NOTE", "ONE", "BLANK", "ONLY_BULLETS", "LEADING", "SENTENCE", "STUCK", "LABEL_WORDS", "spans", "line", "found", "condition", "start", "at", "match", "index", "span", "withoutNotes", "keyOf", "afterBlank", "before", "sentences", "last", "labelOf", "blank", "words", "kept", "optionsOf", "text", "option", "questions", "texts", "choices", "notes", "conditions", "blanks", "note", "said", "plain", "whole", "keeps", "from", "key", "one", "options", "needed", "answers", "open", "asked", "c", "b", "picks", "resolveLine", "keepNotes", "parts", "name", "holds", "printed", "resolve", "lines", "SPEC_SECTIONS", "SPEC_FIELDS", "SpecSchema", "external_exports", "ItemSchema", "SystemSchema", "KindSchema", "ConfigSchema", "PickerFileSchema", "UploadSchema", "UNITS", "NAMES", "GAP", "next", "pounds", "pence", "costOf", "i", "typed", "value", "money", "item", "raw", "blank", "trimmed", "spec", "copy", "field", "edited", "text", "digest", "hex", "byte", "buildpackplan_default", "config", "measures", "phases", "phase", "read", "measure", "row", "hidden", "kind", "k", "target", "shown", "sum", "all", "design", "parts", "part", "id", "s", "picked", "name", "query", "system", "response", "unit", "questions", "asked", "needed", "open", "keep", "fill", "pick", "c", "b", "condition", "holds", "keepNotes", "resolve", "f", "images", "fileTitle", "fileDetail", "event", "uploadChosen", "file", "matching", "choosing", "added", "index", "ConfigSchema", "external_exports", "PickerFileSchema", "UploadSchema", "next", "upload", "buildpackproperty_default", "read", "config", "issue", "overrides", "o", "row", "typed", "derived", "id", "p", "fileTitle", "fileDetail", "matching", "event", "uploadChosen", "file", "i", "target", "index", "detail", "rows", "d", "value", "extra", "hidden", "ConfigSchema", "zod_default", "buildpackv2_default", "config", "read", "tab", "hash", "event", "link", "id", "index", "i", "body", "kind", "response", "next", "parse", "raw", "value", "text", "list", "item", "filled", "names", "name", "listeditor_default", "source", "field", "row", "v", "fields", "index", "by", "to", "MARKED", "SAVE_FIRST", "FIELD_ERROR", "isFieldErrors", "body", "v", "m", "fieldLabel", "form", "name", "input", "markInvalid", "errors", "clearInvalid", "messages", "error", "el", "describeFailure", "response", "field", "key", "serialize", "entries", "value", "saveall_default", "snapshots", "url", "event", "changed", "u", "submitted", "saved", "failed", "snapshot", "replaceFiles", "csrfToken", "systemeditor_default", "saved", "leaving", "form", "serialize", "event", "PARAMS", "plural", "count", "word", "systemlibrary_default", "params", "key", "event", "typing", "words", "shown", "group", "visible", "row", "search", "matches", "lead", "first", "total", "url", "param", "value", "DATABASE_NAME", "CHUNKS", "SESSIONS", "promisify", "request", "resolve", "reject", "ChunkStore", "_ChunkStore", "database", "factory", "sessionId", "seq", "blob", "data", "record", "transaction", "mimeType", "chunks", "chunk", "range", "a", "b", "sessions", "CANDIDATES", "probeMimeType", "isTypeSupported", "supported", "HEAP_SAMPLE_MS", "TIMESLICE_MS", "DRAW_INTERVAL_MS", "WORKER_SOURCE", "usedHeap", "memory", "harness_default", "store", "session", "recorder", "worker", "audioContext", "canvasTrack", "startedAt", "sequence", "spoolQueue", "samples", "sampleTimer", "stopTimer", "ChunkStore", "opened", "chunkStore", "canvas", "context", "mimeType", "probeMimeType", "type", "oscillator", "destination", "track", "draw", "elapsed", "seconds", "x", "stream", "event", "current", "seq", "sample", "heap", "blob", "spooled", "_typeof", "o", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "Constructor", "protoProps", "staticProps", "t", "_toPrimitive", "r", "e", "_classCallCheck", "instance", "_callSuper", "_getPrototypeOf", "_possibleConstructorReturn", "_isNativeReflectConstruct", "self", "call", "_assertThisInitialized", "_inherits", "subClass", "superClass", "_setPrototypeOf", "_wrapNativeSuper", "Class", "_cache", "_isNativeFunction", "Wrapper", "_construct", "p", "fn", "DetailedError", "_Error", "message", "_this", "causingErr", "req", "res", "requestId", "method", "url", "status", "body", "error_default", "isEnabled", "log", "msg", "isEnabled", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "t", "_toPrimitive", "r", "e", "NoopUrlStorage", "_fingerprint", "_urlStorageKey", "_upload", "version", "VERSION", "_hasBuffer", "_TD", "_TE", "b64ch", "b64chs", "b64tab", "a", "tab", "c", "i", "b64re", "_fromCC", "_U8Afrom", "it", "_mkUriSafe", "src", "m0", "_tidyB64", "s", "btoaPolyfill", "bin", "u32", "c0", "c1", "c2", "asc", "pad", "_btoa", "_fromUint8Array", "u8a", "strs", "l", "fromUint8Array", "urlsafe", "cb_utob", "cc", "re_utob", "utob", "u", "_encode", "encode", "encodeURI", "re_btou", "cb_btou", "cccc", "cp", "offset", "btou", "b", "atobPolyfill", "u24", "r1", "r2", "binArray", "_atob", "_toUint8Array", "toUint8Array", "_unURI", "_decode", "decode", "isValid", "_noEnum", "v", "extendString", "_add", "name", "body", "extendUint8Array", "extendBuiltins", "gBase64", "import_url_parse", "uuid", "c", "r", "v", "_regeneratorRuntime", "e", "t", "o", "r", "i", "c", "u", "define", "wrap", "n", "Generator", "a", "Context", "makeInvokeMethod", "tryCatch", "h", "l", "f", "s", "y", "GeneratorFunction", "GeneratorFunctionPrototype", "p", "d", "v", "values", "g", "defineIteratorMethods", "AsyncIterator", "invoke", "_typeof", "callInvokeWithMethodAndArg", "maybeInvokeDelegate", "pushTryEntry", "resetTryEntry", "next", "handle", "asyncGeneratorStep", "gen", "resolve", "reject", "_next", "_throw", "key", "arg", "info", "value", "error", "_asyncToGenerator", "fn", "self", "args", "err", "_slicedToArray", "arr", "_arrayWithHoles", "_iterableToArrayLimit", "_unsupportedIterableToArray", "_nonIterableRest", "_createForOfIteratorHelper", "allowArrayLike", "it", "F", "_e", "normalCompletion", "didErr", "step", "_e2", "minLen", "_arrayLikeToArray", "len", "arr2", "ownKeys", "_objectSpread", "_defineProperty", "obj", "_toPropertyKey", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "descriptor", "_createClass", "protoProps", "staticProps", "_toPrimitive", "PROTOCOL_TUS_V1", "PROTOCOL_IETF_DRAFT_03", "PROTOCOL_IETF_DRAFT_05", "defaultOptions", "defaultOnShouldRetry", "BaseUpload", "file", "options", "_this", "fingerprint", "previousUpload", "_this2", "retryDelays", "_i", "_arr", "optionName", "log", "source", "_this$options$paralle", "_this3", "totalSize", "totalProgress", "partCount", "parts", "splitSizeIntoParts", "part", "index", "uploads", "lastPartProgress", "_ref", "newPartProgress", "upload", "req", "metadata", "encodeMetadata", "res", "inStatusCategory", "location", "resolveUrl", "shouldTerminate", "_this4", "_iterator", "_step", "message", "causingErr", "error_default", "_this5", "shouldResetDelays", "shouldRetry", "delay", "lastResponse", "bytesSent", "bytesTotal", "chunkSize", "bytesAccepted", "_this6", "promise", "_this7", "status", "offset", "length", "_this8", "_this9", "start", "end", "_ref2", "done", "valueSize", "newSize", "method", "url", "openRequest", "_this10", "_this11", "storedUpload", "urlStorageKey", "body", "sendRequest", "remainingDelays", "newOptions", "_ref3", "_ref4", "gBase64", "category", "headers", "_i2", "_Object$entries", "_Object$entries$_i", "name", "requestId", "uuid", "_x", "_x2", "_x3", "_sendRequest2", "_callee", "_context", "isOnline", "online", "retryAttempt", "origin", "link", "URL", "partSize", "upload_default", "isReactNative", "isReactNative_default", "uriToBlob", "uri", "resolve", "reject", "xhr", "blob", "err", "isCordova", "isCordova_default", "readAsByteArray", "chunk", "resolve", "reject", "reader", "value", "err", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "t", "_toPrimitive", "r", "e", "FileSource", "file", "start", "end", "isCordova_default", "readAsByteArray", "value", "done", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "t", "_toPrimitive", "r", "e", "len", "blobOrArray", "concat", "a", "b", "c", "StreamSource", "reader", "start", "end", "_this", "hasEnoughData", "value", "done", "_ref", "hasAllDataBeenRead", "_typeof", "o", "_regeneratorRuntime", "e", "t", "r", "i", "c", "u", "define", "wrap", "n", "Generator", "a", "Context", "makeInvokeMethod", "tryCatch", "h", "l", "f", "s", "y", "GeneratorFunction", "GeneratorFunctionPrototype", "p", "d", "v", "values", "g", "defineIteratorMethods", "AsyncIterator", "invoke", "callInvokeWithMethodAndArg", "maybeInvokeDelegate", "pushTryEntry", "resetTryEntry", "next", "handle", "asyncGeneratorStep", "gen", "resolve", "reject", "_next", "_throw", "key", "arg", "info", "value", "error", "_asyncToGenerator", "fn", "self", "args", "err", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "_toPrimitive", "FileReader", "_openFile", "_callee", "input", "chunkSize", "blob", "_context", "isReactNative_default", "uriToBlob", "FileSource", "StreamSource", "openFile", "_x", "_x2", "fingerprint", "file", "options", "isReactNative_default", "reactNativeFingerprint", "exifHash", "hashCode", "str", "hash", "i", "_char", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "t", "_toPrimitive", "r", "e", "XHRHttpStack", "method", "url", "Request", "Request", "method", "url", "_classCallCheck", "_createClass", "header", "value", "progressHandler", "e", "_this", "body", "resolve", "reject", "Response", "err", "xhr", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "t", "_toPrimitive", "r", "e", "hasStorage", "key", "originalValue", "canStoreURLs", "WebStorageUrlStorage", "results", "fingerprint", "urlStorageKey", "upload", "id", "prefix", "_key", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "i", "descriptor", "_toPropertyKey", "_createClass", "protoProps", "staticProps", "_callSuper", "t", "e", "_getPrototypeOf", "_possibleConstructorReturn", "_isNativeReflectConstruct", "self", "call", "_assertThisInitialized", "_inherits", "subClass", "superClass", "_setPrototypeOf", "p", "ownKeys", "r", "_objectSpread", "_defineProperty", "obj", "key", "value", "_toPrimitive", "defaultOptions", "upload_default", "XHRHttpStack", "FileReader", "canStoreURLs", "WebStorageUrlStorage", "NoopUrlStorage", "fingerprint", "Upload", "_BaseUpload", "file", "options", "url", "isSupported", "letterbox", "sourceWidth", "sourceHeight", "destinationWidth", "destinationHeight", "scale", "width", "height", "RECOVERABLE_MAX_AGE_MS", "SWEEP_AGE_MS", "findRecoverable", "sessions", "now", "session", "sweep", "store", "stale", "TRANSITIONS", "RecorderStateMachine", "to", "warningIn", "VIDEO_BITS_PER_SECOND", "AUDIO_BITS_PER_SECOND", "TIMESLICE_MS", "TUS_CHUNK_SIZE", "RETRY_DELAYS", "REQUIRED_FREE_BYTES", "STATUS_POLL_MS", "COUNTDOWN_SECONDS", "WORKER_SOURCE", "getCookie", "name", "part", "key", "rest", "formatClock", "totalMs", "totalSeconds", "minutes", "seconds", "formatBytes", "bytes", "recorder_default", "machine", "RecorderStateMachine", "store", "screenStream", "cameraStream", "micStream", "audioContext", "analyser", "mediaRecorder", "worker", "canvasTrack", "wakeLock", "tusUpload", "session", "sequence", "spoolQueue", "spoolFailed", "meterTimer", "elapsedTimer", "countdownTimer", "pollTimer", "ChunkStore", "opened", "sweep", "sessions", "findRecoverable", "event", "to", "message", "screenTrack", "devices", "device", "preview", "track", "audio", "video", "samples", "sum", "sample", "deviation", "rms", "quota", "usage", "mimeType", "probeMimeType", "type", "probeError", "destination", "displayAudio", "videoTrack", "stream", "canvas", "settings", "context", "screenVideo", "cameraVideo", "draw", "fit", "letterbox", "radius", "margin", "x", "y", "cameraTrack", "side", "micTrack", "warn", "blob", "current", "seq", "chunkStore", "endpoint", "options", "request", "url", "_request", "response", "location", "recordingId", "uploaded", "total", "uploadError", "Upload", "buildpack", "payload", "body", "container", "bounds", "move", "pointer", "left", "top", "up", "vertical", "horizontal", "started", "duration", "ITEM", "DRAG_CLASSES", "sortable_default", "dragged", "items", "root", "renumber", "item", "index", "input", "event", "lifted", "target", "rect", "after", "import_pure", "stripe_default", "key", "secret", "payment", "target", "event", "tableselectall_default", "x", "KEY", "load", "taglists_default", "linked", "saved", "picked", "name", "other", "match", "sort", "list", "place", "row", "a", "b", "tags", "tocScrollspy_default", "links", "ids", "link", "sections", "id", "index", "element", "currentLabels", "setActive", "on", "label", "TRIGGER", "pick", "shown", "section", "line", "candidate", "ticking", "hashId", "contentsubmit_default", "event", "form", "data", "url", "xhr", "copytoclipboard_default", "value", "radians", "x", "distanceKm", "a", "b", "dlat", "dlng", "h", "located", "base", "areaOf", "district", "nearby", "point", "area", "bases", "reachKm", "at", "km", "benchCounts", "centroids", "points", "counts", "code", "centroid", "nearest", "status", "gaps", "served", "demand", "getCookie", "name", "part", "key", "rest", "BENCH", "benchColour", "count", "SERVED", "UNSERVED", "OVER_TILES", "PARTIAL", "SPECTRUM_LOW", "SPECTRUM_HIGH", "UK", "beside", "home", "map", "POINTABLE", "markers", "list", "at", "properties", "outline", "geometry", "color", "weight", "fill", "dashed", "hex", "rgb", "x", "spectrum", "t", "i", "low", "high", "pounds", "pence", "average", "values", "a", "b", "coveragemap_default", "areaFeatures", "districtFeatures", "districtBoxes", "districtCentroids", "areaCentroids", "bases", "demand", "districtBench", "areaBench", "reach", "supplied", "land", "districtsUrl", "searchUrl", "supplyUrl", "served", "leadtimes", "prices", "districtsByArea", "defaultLeadtime", "defaultPrice", "view", "code", "feature", "districtLeadtime", "district", "districtPrice", "value", "label", "tint", "colour", "range", "benchStyle", "sold", "districtStyle", "areaLeadtime", "codes", "areaPrice", "areaStyle", "area", "covered", "supplyTooltip", "place", "escapeHtml", "demandOf", "total", "recently", "districtTip", "status", "areaTip", "draw", "source", "data", "highlight", "features", "dataset", "target", "opened", "districts", "areas", "statuses", "openMap", "bounds", "box", "middle", "addShading", "layer", "on", "empty", "id", "pointer", "base", "url", "service", "measure", "response", "supply", "approved", "benchCounts", "gaps", "shown", "located", "claim", "point", "nearby", "areaOf", "circle", "reaches", "centre", "distanceKm", "claimed", "action", "next", "mode", "leadtime", "previous", "x0", "price", "body", "error", "nowServed", "spectral", "shade", "included", "excluded", "which", "text", "query", "result", "surveyor", "reserve", "Status", "external_exports", "tracking_default", "event", "body", "call", "RemoteFile", "external_exports", "hydrate", "filename", "pk", "url", "labels", "created", "user", "shared", "share", "hide", "destroy", "add", "file", "upload_default", "data", "id", "form", "upload", "x", "body", "response", "replaceFiles", "csrfToken", "payload", "call", "error", "parse", "event", "files", "input", "filetype", "token", "status", "label", "l", "value", "dialog_default", "htmx_esm_default", "JUNK", "join", "parts", "readAll", "directory", "resolve", "reject", "reader", "entries", "next", "batch", "walk", "entry", "folder", "children", "path", "child", "fromInput", "files", "file", "pad", "value", "pastedName", "now", "extension", "date", "time", "doc", "raw", "file", "haystack", "revisions", "same", "a", "b", "reconcile", "before", "files", "previous", "old", "memo", "compute", "last", "value", "args", "arg", "index", "firstError", "each", "message", "numbered", "base", "pks", "pk", "FILTERS", "matchesFilter", "filter", "SORTS", "NAMES", "byName", "SORTERS", "sorted", "sort", "humanLabel", "label", "words", "DERIVED", "formatDuration", "seconds", "whole", "h", "m", "s", "pad", "n", "formatSize", "bytes", "units", "unit", "note", "matchesQuery", "query", "word", "inSubtree", "folder", "root", "parentOf", "path", "leaf", "children", "folders", "parent", "crumbs", "name", "parts", "countIn", "searching", "view", "matches", "deep", "visible", "countFilters", "counts", "add", "between", "order", "from", "to", "start", "end", "pinned", "NATIVE", "viewable", "original", "megapixels", "FILES_AT_ONCE", "POLL_MS", "POLLS", "PREFERENCES", "MOVING", "UNDO_MS", "hasFiles", "event", "seeking", "typing", "target", "DATE", "DATE_TIME", "ICONS", "memoShown", "files", "folder", "query", "filter", "label", "uploader", "sort", "visible", "memoCounts", "countFilters", "browser_default", "memo", "selected", "data", "saved", "SORTS", "linked", "file", "candidate", "payload", "before", "reconcile", "index", "folders", "pks", "pk", "DERIVED", "response", "searching", "children", "chosen", "labels", "humanLabel", "FILTERS", "crumbs", "path", "countIn", "leaf", "run", "between", "each", "shown", "form", "fields", "csrfToken", "name", "value", "input", "by", "next", "viewable", "original", "pinned", "note", "handler", "csrf", "body", "key", "refused", "firstError", "row", "base", "order", "named", "numbered", "project", "text", "shared", "verb", "reason", "point", "x", "y", "current", "uploadFile", "error", "UploadError", "added", "raw", "entries", "item", "entry", "walk", "nested", "now", "pastedName", "fromInput", "picked", "direct", "items", "pool", "join", "count", "formatSize", "formatDuration", "megapixels", "iso", "pitched", "x", "y", "z", "angle", "yawed", "toPhoto", "camera", "sx", "sy", "f", "length", "lon", "lat", "toScreen", "u", "v", "world", "FRAGMENT", "VERTEX", "NARROWEST", "WIDEST", "TOP", "SLOP", "compile", "gl", "type", "source", "shader", "panorama_default", "canvas", "event", "src", "program", "VERTEX", "FRAGMENT", "corner", "image", "largest", "scale", "ratio", "a", "b", "last", "point", "spread", "perPixel", "factor", "rect", "sx", "sy", "u", "v", "toPhoto", "x", "y", "screen", "toScreen", "MOST", "SLOP", "zoom_default", "event", "rect", "point", "scale", "next", "factor", "a", "b", "last", "spread", "middle", "image", "x", "y", "dropdown_default", "top", "left", "bottom", "right", "command_default", "module_default", "areaselect_default", "availability_default", "buildpackChecklist_default", "buildpackshare_default", "calendar_default", "clip_default", "chartbar_default", "chartpie_default", "contentsubmit_default", "copytoclipboard_default", "coveragemap_default", "date_default", "combined_default", "delivery_default", "pipeline_default", "sales_default", "datetimepicker_default", "editor_default", "dialog_default", "menubar_default", "stats_default", "scenestrip_default", "scenecompare_default", "scenariocompare_default", "worksheetview_default", "drop_default", "uploaddropzone_default", "file_default", "hepscore_default", "linework_default", "hubspot_default", "nav_default", "palette_default", "notfound_default", "notifications_default", "plan_default", "posthog_default", "price_default", "projecttags_default", "radio_default", "destroy_default", "rename_default", "buildpackplan_default", "buildpackproperty_default", "buildpackv2_default", "listeditor_default", "saveall_default", "systemeditor_default", "systemlibrary_default", "harness_default", "recorder_default", "tableselectall_default", "taglists_default", "tocScrollspy_default", "sortable_default", "stripe_default", "tracking_default", "upload_default", "browser_default", "panorama_default", "zoom_default", "dropdown_default", "command_default", "forms_default"]
}
